工具
吾爱破解版本OD、IDA6.8
OD使用-动态分析
OD快捷方式
F2 下断点,也就是指定断点的地址F3加载一个可执行程序,进行调试分析F4程序执行到光标处
F5 缩小、还原当前窗口
F7 单步步入
F8 单步步过
F9 直接运行程序,遇到断点处,程序暂停
Ctrl+F2 重新运行程序到起始处,一般用于重新调试程序
Ctrl+F9 执行到函数返回处,用于跳出函数实现
Alt+F9 执行到用户代码处,用于快速跳出系统函数
Ctrl+G 输入十六进制地址,快速定位到该地址处
+/- 前一个后一个函数
一:找用户入口main函数-字符串查找
根据程序运行时的界面,找字符串关键字
在OD的字符串搜索插件中选择智能搜索
得到字符串进入到用户入口main函数
在printf字符串处F2下一个断点
二、分析反汇编
F9将程序运行起来,程序会在printf输入处停下来
012F8BD8 . 68 883C3601 push Reverse0.01363C88 ; please input Name:
012F8BDD . E8 B0E7FFFF call Reverse0.012F7392 ; printf函数
012F8BE2 . 83C4 04 add esp,0x4
012F8BE5 . 6A 78 push 0x78
012F8BE7 . 8D45 80 lea eax,dword ptr ss:[ebp-0x80] ; name[]数组
012F8BEA . 50 push eax
012F8BEB . 68 A03C3601 push Reverse0.01363CA0 ; %s
012F8BF0 . E8 98DDFFFF call Reverse0.012F698D ; scanf函数
012F8BF5 . 83C4 0C add esp,0xC
012F8BF8 . 68 1C3F3601 push Reverse0.01363F1C ; please input Id:
012F8BFD . E8 90E7FFFF call Reverse0.012F7392 ; printf函数
012F8C02 . 83C4 04 add esp,0x4
012F8C05 . 6A 78 push 0x78
012F8C07 . 8D85 00FFFFFF lea eax,dword ptr ss:[ebp-0x100] ; id[]数组
012F8C0D . 50 push eax
012F8C0E . 68 A03C3601 push Reverse0.01363CA0 ; %s
012F8C13 . E8 75DDFFFF call Reverse0.012F698D ; scanf函数
这里想要查看内存中数据时,可以在OD中选择要查看数据的反汇编指令处-【数据窗口中跟随】-【内存地址】,查看到我们输入的数值。
012F8C28地址处的cmp指令含义是将数组下标索引[0]的元素与0x68对比。
如果相等就执行je指令的跳转,跳到下一条指令处继续比对。
继续往下执行就到达012F8C2D地址处,会弹出一个提示错误信息的MessageBoxW对话框。这里可以将ZF标志位改成1执行跳转或者在跳转的下一个位置设为新的EIP。
第一次CMP对比,反汇编代码注释如下:
012F8C1B . B8 01000000 mov eax,0x1 ; eax=00000001
012F8C20 . 6BC8 00 imul ecx,eax,0x0 ; imul,第三个操作数是乘数,第二个操作数是被乘数,运算结果存放在第一个操作数
012F8C23 . 0FBE540D 80 movsx edx,byte ptr ss:[ebp+ecx-0x80] ; 取出数组name[0]
012F8C28 . 83FA 68 cmp edx,0x68 ; 比对H
012F8C2B . 74 32 je short Reverse0.012F8C5F ; ; 如果不相等,密码错误,跳转到012F8C5F处,为了防止它跳转,可以修改zf=1,让它跳转
012F8C2D . 8BF4 mov esi,esp
012F8C2F . 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
012F8C31 . 68 AC3C3601 push Reverse0.01363CAC ; |提示
012F8C36 . 68 B43C3601 push Reverse0.01363CB4 ; |错误
012F8C3B . 6A 00 push 0x0 ; |hOwner = NULL
012F8C3D . FF15 DCE13701 call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW
从第一次cmp edx,0x68对比后je跳转到012F8C5F这个地址。mov操作后,eax等于1,执行shl指令相当于左移1位的计算,反汇编中每左移一位相当于乘以2,左移4位相当于乘以16每右移一位相当于除以2,而数组存储在堆栈的方向是由高地址向低地址进行延伸,012F8C5F至012F8C67的三条指令结合起来的意思就是取值出数组[1]索引的值。
012F8C5F > \B8 01000000 mov eax,0x1 ; eax=00000001
012F8C64 . c1e0 00 shl eax,0x0 ; 相当于左移动1位
012F8C67 . 0FBE4C05 80 movsx ecx,byte ptr ss:[ebp+eax-0x80] ; 取数组name[1]的位置
012F8C6C . 83F9 38 cmp ecx,0x38
012F8C6F . 74 32 je short Reverse0.012F8CA3
012F8C71 . 8BF4 mov esi,esp
012F8C73 . 6A 00