朋友所托,要帮忙破解一个MFC的小程序,他急等着用 (背景:几个人合伙创业,其中一个负责写这个有点小核心的项目,为了巩固自己的”地位“搞的小把戏,给加了密,要用必须通过他 - 我艹~~~)。
虽说自己搞C++比较多,相对来讲native一点,但是对于汇编与破解,了解相当有限,去年这朋友也找过我,因为当时刚换公司比较忙,是求助另外一好友才搞定的。这次还是自己花点时间研究研究吧。工具吗,用windbg貌似只能看,softice与ollydbg之间,选择了ollydbg。
一、基础知识
ollydbg是一个动态反汇编分析调试工具,其功能强大的令人发指,而且居然还是免费的,其官方地址为:http://www.ollydbg.de/,下载与介绍都在上面。
要用ollydbg做破解,最好先过一遍下面的知识点:
二、实例操作
先是一个非常简单的helloworld程序,源码如下:
1 #include <cstdio> 2 #include <windows.h> 3 4 #pragma comment(lib, "user32.lib") 5 6 void printHelloWorld(int a) 7 { 8 MessageBox(NULL, "Hello, World", "Greetings", MB_ICONWARNING); 9 } 10 11 int main() 12 { 13 bool bMsgBox = false; 14 if(bMsgBox) 15 { 16 printHelloWorld(10); 17 } 18 else 19 { 20 printf("Hello, World"); 21 } 22 }
该程序总是在console输出"Hello, World",现在要修改其binary,使其总是弹出一个MessageBox。
编译并使用ollydbg打开,因为我知道要传一个参数10到printHelloWorld函数中去,可以肯定会有一个指令:PUSH 0A,关键代码在其附近,在反汇编窗口搜索定位:
可以看到,在PUSH 0A前面是一个条件判断,对应源代码中的那个判断,于是不难推出,Mov BYTE PTR SS:[LOCAL.1+3],0就是给bool型变量bMsgBox赋值的指令,0就是false。
于是,在这里双击该指令,把0改成1,运行便看到程序弹出了messagebox。
注意,为了保存修改过的可执行文件,你需要:
三、破解
需要破解的程序,其行为是:在任何一台机器上使用该程序,你需要输入一个授权码,该授权码由特定程序通过系统信息产生,其工作流程为:
单从行为上分析,突破口在于授权验证这一步,该程序要验证输入的授权码是否正确,也就是说它肯定知道正确的验证码,也就是说由系统信息产生授权码的算法也是内置在客户程序这边的,我们只不过需要一个办法把它读出来。
该验证步骤是:获取系统信息,并个根据该信息产生正确的授权码,然后从某文本文件读入用户输入的验证码,对两者进行对比,如果成功,则弹出一个messagebox:output(true), 否则就是output(false)。根据以上信息,设置以下断点:
有了这几个断点,你就可以在运行中观察寄存器/栈/内存等内容,以及汇编指令来了解整个程序的运作机理。多走几遍,多观察思考,适当添加断点与注释。特别注意哪些条件测试指令与call指令,确定其行为后继续跟进去。
这样,就找到了其内部获取系统信息的函数调用,与根据系统信息算出授权码的函数调用,从而得到了正确的授权码,结束。
当然,要做的好一点的话,还可以:
但对于第一项,这需要阅读很多汇编代码,我没时间;对于第二项,需要插入对windows API函数的调用,这比简单的修改一个指令要复杂,暂时还不会,也不打算仔细研究。毕竟,是朋友所托,完成任务即可,不打算仔细研究 - 我还有很多其他重要的事情要做。
四、技巧总结