【文章作者】: sunflover 【编写语言】: MFC 【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! -------------------------------------------------------------------------------- 【详细过程】 拿到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运行,断下后,发现堆栈窗口的可疑字符串,我们记录一下 0012F898 04A90058 ASCII "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
|