160个crackme之003

来源:互联网 发布:淘宝一元拍卖骗局 编辑:程序博客网 时间:2024/05/16 13:03

还是下定决心好好做一波crackme

逆向的新手,写个博客记录一下自己的学习经历

---------------------------------------------------华丽丽的分割线-------------------------------------------------

0X00 首先拿到了这个程序,打开,经过大概5秒钟的等待之后就进入了主界面

传统的name/serial类型的程序,随便输入一点东西发现弹窗。

这时候放到OD当中,我使用的是吾爱破解版的OD

首先想法就是找到关键跳转,这里有两种方法

一是在弹窗后f12暂停,然后alt+k查看栈情况,这时会有

查看调用来自应用程序的rtcMsgBox跟进就找到了。

二是直接右键查找字符串。也能很容易的发现关键语句。

0X01 接下来就要做一些坏坏的事情了,首先尝试爆破

在关键跳转位置下断、然后执行到此处时将标志寄存器反转


接着爆破就完成了,很轻松


0X02 接下来分析算法,写出注册机

首先查看关键跳转附近的关键寄存器

这是附近的代码

00408605   .  E8 888AFFFF   call <jmp.&MSVBVM50._adj_fdivr_m64>0040860A   >  DFE0          fstsw ax0040860C   .  A8 0D         test al,0xD0040860E   .  0F85 AB010000 jnz AfKayAs_.004087BF00408614   .  FF15 34B14000 call dword ptr ds:[<&MSVBVM50.__vbaFpR8>>;  msvbvm50.__vbaFpR80040861A   .  DC1D 28104000 fcomp qword ptr ds:[0x401028]00408620   .  DFE0          fstsw ax00408622   .  F6C4 40       test ah,0x4000408625   .  74 07         je short AfKayAs_.0040862E00408627   .  BE 01000000   mov esi,0x10040862C   .  EB 02         jmp short AfKayAs_.004086300040862E   >  33F6          xor esi,esi00408630   >  8D55 E4       lea edx,dword ptr ss:[ebp-0x1C]00408633   .  8D45 E8       lea eax,dword ptr ss:[ebp-0x18]00408636   .  52            push edx00408637   .  50            push eax00408638   .  6A 02         push 0x20040863A   .  FF15 80B14000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>;  msvbvm50.__vbaFreeStrList00408640   .  83C4 0C       add esp,0xC00408643   .  8D4D D8       lea ecx,dword ptr ss:[ebp-0x28]00408646   .  8D55 DC       lea edx,dword ptr ss:[ebp-0x24]00408649   .  51            push ecx0040864A   .  52            push edx0040864B   .  6A 02         push 0x20040864D   .  FF15 08B14000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>;  msvbvm50.__vbaFreeObjList00408653   .  F7DE          neg esi00408655   .  83C4 0C       add esp,0xC00408658   .  B9 04000280   mov ecx,0x800200040040865D   .  B8 0A000000   mov eax,0xA00408662   .  894D 9C       mov dword ptr ss:[ebp-0x64],ecx00408665   .  66:85F6       test si,si00408668   .  8945 94       mov dword ptr ss:[ebp-0x6C],eax0040866B   .  894D AC       mov dword ptr ss:[ebp-0x54],ecx0040866E   .  8945 A4       mov dword ptr ss:[ebp-0x5C],eax00408671   .  894D BC       mov dword ptr ss:[ebp-0x44],ecx00408674   .  8945 B4       mov dword ptr ss:[ebp-0x4C],eax00408677      74 62         je short AfKayAs_.004086DB00408679   .  8B35 14B14000 mov esi,dword ptr ds:[<&MSVBVM50.__vbaSt>;  msvbvm50.__vbaStrCat0040867F   .  68 C06F4000   push AfKayAs_.00406FC0                   ;  You Get It00408684   .  68 DC6F4000   push AfKayAs_.00406FDC                   ; /\r\n00408689   .  FFD6          call esi                                 ; \__vbaStrCat0040868B   .  8BD0          mov edx,eax

说明和si有关
往上找有关si的处理
发现与eax有关,再往上就找到了关键的函数逻辑


首先在这里,取出输入的name值,然后计算字符串长度,将得到的长度乘0X15B38

接着取第一个字符的Ascii码,与之前结果相加

之后,转为整数,进行浮点数加减法,这里经过浮点数计算之后将之前的结果+2


下一步对结果*3后-2


最后+15

得到最终的serial。

其实这种验证方式通用的弊端都在于,计算后正确的结果会在内存中出现,所以仔细观察内存会发现小惊喜。

验证结果正确


最后回顾整个算法过程写出注册机

关键算法流程:serial=(strlen*0X15B38+ord(name[0])+2)*3-2+15

附python脚本