[反汇编练习] 160个CrackMe之026.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第26个Colormaster.exe,保存下来。运行程序,程序界面如下:

点击上面的那个按钮没有任何反应,看来失败没有提示的。

PEID:Microsoft Visual Basic 5.0 / 6.0

3、思路分析和破解流程

没有信息框,我们可以试试查找文本的办法。

1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

2、在OD中反汇编窗口,右键->中文搜索插件->智能搜索,信息如下:

大概地猜猜意思,图中选中的哪一行应该就是正确的。(为什么是它?因为它的第一个单词我认识啊!哈哈哈!)

双击或者右键->Show call进去,我们就返回到了反汇编窗口,附进代码如下:

004036EB     /0F84 AB000000 je 0040379C
004036F1 . |8B35 D4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>; msvbvm60.__vbaVarDup
004036F7 . |B9 04000280 mov ecx,0x80020004
004036FC . |898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
00403702 . |B8 0A000000 mov eax,0xA
00403707 . |898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
0040370D . |BF 08000000 mov edi,0x8
00403712 . |8D95 0CFFFFFF lea edx,dword ptr ss:[ebp-0xF4]
00403718 . |8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
0040371E . |8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
00403724 . |8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
0040372A . |C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],00401F2C ; Colormaster′s Crackme 7.0
00403734 . |89BD 0CFFFFFF mov dword ptr ss:[ebp-0xF4],edi
0040373A . |FFD6 call esi ; <&MSVBVM60.__vbaVarDup>
0040373C . |8D95 1CFFFFFF lea edx,dword ptr ss:[ebp-0xE4]
00403742 . |8D4D 8C lea ecx,dword ptr ss:[ebp-0x74]
00403745 . |C785 24FFFFFF>mov dword ptr ss:[ebp-0xDC],00401F80 ; Gratulation ,du hast es geschafft!
0040374F . |89BD 1CFFFFFF mov dword ptr ss:[ebp-0xE4],edi
00403755 . |FFD6 call esi

哈哈,代码是不是很简单?这段代码的开头je 0040379C 就是我们需要的关键跳转!尝试爆破一下!选中je 0040379C, 右键->Binary->Fill with NOPs。再试试:

4、注册机的探索

注册码比较肯定在关键跳转附近,我们直接分析这段代码就可以了:

代码比较长,捡重要的说明:

00402CAC   .  FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
00402CB2 > 8B55 D8 mov edx,dword ptr ss:[ebp-0x28]
00402CB5 . 52 push edx ; // edx="bbdxf",目的是校验字符串长度大于5
00402CB6 . FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; msvbvm60.__vbaLenBstr
00402CBC . 33C9 xor ecx,ecx
00402CBE . 83F8 04 cmp eax,0x4
00402CC1 . 0F9EC1 setle cl
00402CC4 . F7D9 neg ecx
00402CC6 . 66:898D DCFEF>mov word ptr ss:[ebp-0x124],cx
00402CCD . 8D4D D8 lea ecx,dword ptr ss:[ebp-0x28]
00402CD0 . FF15 F0104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; msvbvm60.__vbaFreeStr
00402CD6 . 8D4D B8 lea ecx,dword ptr ss:[ebp-0x48]
00402CD9 . FF15 F4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; msvbvm60.__vbaFreeObj
00402CDF . 66:399D DCFEF>cmp word ptr ss:[ebp-0x124],bx
00402CE6 . 0F84 B0000000 je 00402D9C
00402CEC . 8B35 D4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>; msvbvm60.__vbaVarDup
00402CF2 . B9 04000280 mov ecx,0x80020004
00402CF7 . 898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
00402CFD . B8 0A000000 mov eax,0xA
00402D02 . 898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
00402D08 . BF 08000000 mov edi,0x8
00402D0D . 8D95 0CFFFFFF lea edx,dword ptr ss:[ebp-0xF4]
00402D13 . 8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
00402D19 . 8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
00402D1F . 8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
00402D25 . C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],00401F2C ; Colormaster′s Crackme 7.0
00402D2F . 89BD 0CFFFFFF mov dword ptr ss:[ebp-0xF4],edi
00402D35 . FFD6 call esi ; <&MSVBVM60.__vbaVarDup>
00402D37 . 8D95 1CFFFFFF lea edx,dword ptr ss:[ebp-0xE4]
00402D3D . 8D4D 8C lea ecx,dword ptr ss:[ebp-0x74]
00402D40 . C785 24FFFFFF>mov dword ptr ss:[ebp-0xDC],00401ED4 ; Der Name muss mindestens 5 Chars haben
00402D4A . 89BD 1CFFFFFF mov dword ptr ss:[ebp-0xE4],edi
00402D50 . FFD6 call esi
00402D52 . 8D95 5CFFFFFF lea edx,dword ptr ss:[ebp-0xA4]
00402D58 . 8D85 6CFFFFFF lea eax,dword ptr ss:[ebp-0x94]
00402D5E . 52 push edx
00402D5F . 8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
00402D65 . 50 push eax
00402D66 . 51 push ecx
00402D67 . 8D55 8C lea edx,dword ptr ss:[ebp-0x74]
00402D6A . 6A 40 push 0x40
00402D6C . 52 push edx
00402D6D . FF15 48104000 call dword ptr ds:[<&MSVBVM60.#595>] ; msvbvm60.rtcMsgBox

首先,校验了Name的长度,必须大于4. 然后,有很长很长一段代码用于进行浮点数计算,但是生成的数值实在无法理解是怎样互相联系的,所以我放弃了。

最后,就进行了注册码的相关处理:

00403648   . /7D 12         jge short 0040365C
0040364A . |68 A0000000 push 0xA0
0040364F . |68 941E4000 push 00401E94
00403654 . |56 push esi
00403655 . |50 push eax
00403656 . |FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>; msvbvm60.__vbaHresultCheckObj
0040365C > \8B45 D8 mov eax,dword ptr ss:[ebp-0x28]
0040365F . 8B4D D4 mov ecx,dword ptr ss:[ebp-0x2C]
00403662 . 8B55 D0 mov edx,dword ptr ss:[ebp-0x30]
00403665 . 50 push eax ; // eax = "123123"
00403666 . 51 push ecx ; // ecx = "52406C2C2CC54463"
00403667 . 52 push edx ; // edx = "bbdxf"
00403668 . FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; msvbvm60.__vbaLenBstr
0040366E . 50 push eax ; // eax = 5
0040366F . FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaStrI4>; msvbvm60.__vbaStrI4
00403675 . 8B35 DC104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>; msvbvm60.__vbaStrMove
0040367B . 8BD0 mov edx,eax
0040367D . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
00403680 . FFD6 call esi ; <&MSVBVM60.__vbaStrMove>
00403682 . 8B3D 30104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaSt>; msvbvm60.__vbaStrCat
00403688 . 50 push eax ; // eax = "5", ecx="52406C2C2CC54463"
00403689 . FFD7 call edi ; <&MSVBVM60.__vbaStrCat>
0040368B . 8BD0 mov edx,eax
0040368D . 8D4D C8 lea ecx,dword ptr ss:[ebp-0x38]
00403690 . FFD6 call esi
00403692 . 50 push eax
00403693 . 68 741F4000 push 00401F74 ; -CM
00403698 . FFD7 call edi
0040369A . 8BD0 mov edx,eax
0040369C . 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
0040369F . FFD6 call esi
004036A1 . 50 push eax
004036A2 . FF15 74104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCm>; msvbvm60.__vbaStrCmp

这里,我们发现:注册码比较的文本,在我们点击按钮之前就已经生成好了,String    "52406C2C2CC54463",为了避免这个文本是固定的,我们再次换一个Name跟踪下它的比较文本,发现确实不一样了,说明,比较字符串是在输入Name的时候也已经根据Name的内容动态生成了。

想要在输入Name就完成了比较文本的生成,一般都是用的是Edit控件文本变化事件或者一个Timer定时去读取Name的内容然后生成。

遗憾的是,我尝试寻找这两种事件的地址,终究也没有找到,以下是使用其他VB工具尝试的结果:

 

首先,他确实有一个Timer,但是根据Timer事件的跟踪内容,发现里面就产生了一个错误,和注册码相关的啥也没有。在按钮按下时,通过遍历Name的每一个字符ANSII值,然后与浮点数432.4以及0x15进行了一些乘法运算,(这在OD里已经跟踪出来了,但是怎么计算也无法匹配跟踪的结果,有点无语),最后将结果转换为整数,最后的两个结果转换为十六进制整数文本,然后开头和结尾加上了一些其他的整数文本,组成了最后的注册码。

 

PS:VB的代码跟踪起来代价太大,太坑了,但是160个CrackMe中有很多这种程序,无语啊!

 

BY  笨笨D幸福

[反汇编练习] 160个CrackMe之026的更多相关文章

  1. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  3. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. [反汇编练习] 160个CrackMe之022

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之020

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之019

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之018

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之017

    [反汇编练习] 160个CrackMe之017. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. 使用Rails 4.2+ 测试异步邮件系统

    [导读]异步测试总是一个很大的问题,邮件发送测试更是让很多开发同学不知道从哪里入手.在新版的Rails里,这类测试在很大程度上被简化了. 以下为译文 在编写需要发送邮件的应用时,控制器是绝不能被阻塞的 ...

  2. 导出含有图片的项目成jar文件后运行,图片不显示

    在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径.这与用户运行Jar包时的当前 ...

  3. POJ 2182

    #include <iostream> #define MAXN 8005 using namespace std; int _m[MAXN]; int main() { //freope ...

  4. POJ 1185 炮兵阵地 (状压DP)

    题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...

  5. Codeforces Round #336 (Div. 2) D. Zuma 区间dp

    D. Zuma   Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gems ...

  6. (一)初探HTML!

    想自己动手做一个个人网站,因此,最近在自学PHP,主要看韩顺平老师的教学视频..将自己学习的点点滴滴记录在博客园,希望数月之后,自己可以熟练的运用PHP,也希望各位PHP高手们给予指点,不胜感激!! ...

  7. Struts2 Convention插件的使用(2)return视图以及jsp的关系

    package com.hyy.action; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extend ...

  8. android 检测工具: drozer

    1. 下载 https://www.mwrinfosecurity.com/products/drozer/community-edition/ 可以下载windows的也可以下载linux的 2. ...

  9. Spring笔记——Spring+JDBC组合开发

      使用Spring+JDBC集成步骤如下:   1. 配置数据源 2. 配置事务.配置事务时,需要在xml配置文件中引入用于声明事务的tx命名空间,事务的配置方式有两种:注解方式和基于XML配置方式 ...

  10. http://www.cnblogs.com/AloneSword/p/3370462.html

    http://www.cnblogs.com/AloneSword/p/3370462.html