sunflover 发表于 2013-5-26 22:15

一个特别的CM破解

      【文章标题】: 一个特别的CM破解      【文章作者】: sunflover      【作者邮箱】: sunflover454@gmail.com      【下载地址】: http://rookietp.com/forum.php?mod=viewthread&tid=226      【编写语言】: MFC      【使用工具】: ollydbg      【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!      --------------------------------------------------------------------------------      【详细过程】      拿到CM,看图标是MFC的默认图标,除了exe还有一个HardwareID.dll,运行如下,输入假码,点击验证,无错误提示。

      关掉,载入ollydbg,查找ascii,结果如下:

      也没有看到成功相关的字符串,但是我们发现有 c:\ ,dll,LoginDLL 字符串,一个CM有这些字符串就比较可疑了,双击倒数第三行,转到00401874 处,看看附近代码,

看到MFC字样了,“c:\”上面依次是FindResourceA,LoadResource,SizeofResource函数,      下面是 CreateFileA,WriteFile函数,已经很明显了,dll内容是以资源形式包含在exe中的,      运行的时候,释放到C:\,具体这个dll什么作用,我们还无法知道。             我们F9运行程序,弹出注册框,既然没有其他可用字符串作为参考,那么我们只能另想办法定位关键验证位置。      我首选想到的是GetDlgItemTextA和GetWindowTextA,对这2个API下断点,然后输入假码1234,点击验证按钮,程序在GetWindowTextA函数上断下,我们删除所有断点。      ALT+F9执行到用户代码,返回到00401327 处,我们发现此时ECX指向机器码。F8单步根,步过下面第一个call时,发现ECX指向机器码,继续F8单步,到系统领空的话就ALT+F9,跟不了几步就发现在取刚才获取的机器码,然后循环运算,堆栈出现可疑字符串。

      在循环尾部下F2断点,即004016A3 处。然后F9运行,断下后,发现堆栈窗口的可疑字符串,我们记录一下      0012F89804A90058ASCII "429133863429133856429133904429133861429133887429133861429133860429133908429133856429133887429133858429133857429133859429133862429133887429133857429133860429133907429133908"      经测试,以上字符串为本机真码,下面我们继续,看看能否爆破。             我们继续F8单步跟踪,跟到004016B1 处,发现EAX指向可以字符串,ESI指向假码“1234”。      紧跟着就是假码与真码的比较了,

      通过上面注释的分析,爆破的关键点就是运行到004016E1 时,修改eax为0,我们在此F2下断,F9运行,仍然没有正确提示。             看到下面的LoadLibraryA,GetProcAddress,FreeLibrary,DeleteFileA,我想到可能是临时生成的dll又进行了验证,好了,我们重新载入。F9运行到004016E1 时,修改eax为0,乘dll还没有被删除,我们再开一个ollydbg将它载入。查找ASCII,      Ultra String Reference      Address    Disassembly                               Text String      10001010   MOV EAX,z9dH8.10002138                  ¤      10001022   PUSH z9dH8.100017D8                     肛"      10001079   PUSH z9dH8.1000302C                     %d      100010FF   PUSH z9dH8.10003020                     Success!!!      100011D0   PUSH z9dH8.100011E0                     垢0      10001649   PUSH EBP                                  (Initial CPU selection)      看见Success!!!,我们双击那行转到,向上滚动,发现代码很像exe主程序:

             貌似是一样的,不再作分析,      看到这里,我想爆破的方法就很多了,      我这样改的      004016DE       83D8 FF          SBB EAX,-1                  ;eax=1      主程序这里,修改为sbb eax,eax;这样一来eax始终为0;      因为dll文件是资源,在主程序的.rsrc段搜索特征码1B C0 83 D8 FF 5E 5B 85 C0      ,找到之后反汇编显示,ctrl+E,输入1B C0 90作同样处理,即sbb eax,eax      然后保存所有修改到crack.exe,发现运行后依然不成功,因为od保存,不同段它一次不能全部保存,显然我们修改的2个地方,一个是代码段,一个是资源段,我们需要分2次保存。即先修改一个地方,然后保存,再载入修改过的,再次修改,然后保存为cracked.exe,运行后,直接点验证,弹出成功对话框。      Cracked      ---------------------------      Success!!!      ---------------------------      确定         ---------------------------             【经验总结】: exe与dll两次验证是很不错的验证方法,如果验证方法不一样,那么就比较麻烦了。一个软件如果dll很多,可以考虑这张验证方法,但是对于CM,这个就暴露了。最重要的是CM作者@Rookietp的思想传达到了。      --------------------------------------------------------------------------------      【版权声明】: 本文原创于逆缘论坛, 转载请注明作者并保持文章的完整, 谢谢!                                                                    2013年05月26日 PM    

混小子 发表于 2013-5-26 22:39

我还以为只要改主程序就可以的~

19nuclear91 发表于 2013-5-26 22:39

火钳留名 感谢大牛分享

sunflover 发表于 2013-5-26 22:45

19nuclear91 发表于 2013-5-26 22:39 static/image/common/back.gif
火钳留名 感谢大牛分享

19少,收了我吧

小雨细无声 发表于 2013-5-26 22:47

高手呐,谢谢分享!
页: [1]
查看完整版本: 一个特别的CM破解