第一题还是很简单的,是一个会弹出窗口的验证码,内容也没有经过加密,程序界面是这样的。
拖进ollDbg里面开始跑,找到关键点的方法很多,
(1)可以直接使用Ultra String Reference
(2)在命令栏中输入bp MessageBoxA 这样程序会断在MessageBox函数的第一行,在使用Alt+F9返回程序领空,往回查找关键转跳
(3)或者断在MessageBoxA,程序内可以使用Alt+K查看堆栈调用,在调用函数偏移处下断也可
这里说下,因为PE头的ImageBase一般是4000000,所以偏移量为40xxxx的一般是程序领空,即程序的代码段。
偏移量为77xxxx的特别大的,为系统领空。
ImageBase是当加载进内存时镜像的第1个字节的首选地址。
它必须是64K的倍数。DLL默认是10000000H。Windows CE 的EXE默认是00010000H。Windows 系列的EXE默认是00400000H。
关键语句如下
修改方法有很多,
(1)可以吧两个关键转跳jnz改成je,但要注意为AfxMessageBoxA压入参数的时候,前两个参数传入都为eax,这里很阴险
在比较相等时eax为0,压入参数正确执行,但是只修改转跳语句,并不影响eax的值,MessageBoxA的第一个参数应该是父窗口句柄,
传入毫无意义的eax值,会出错不弹窗。
(2)暴力把所有判断比较都删掉。
(3)把转跳改成,无条件转跳 jmp 00401614
总之改的很随意,最后效果是这样。