OD 实验(二十一) - 对反调试程序的逆向分析(二)
程序:
运行程序
点击“Verify”
关闭该程序,启动 OD
再运行程序
逆向:
用 OD 载入程序
按 F8 往下走
执行完这个 call 指令就弹出了对话框
这个 call 指令调用了 DialogBoxParam 函数创建模态对话框
如果步入该函数的话,会跳到动态链接库中
如果按 Alt+F9 让程序回到执行区域的时候停下也不行
DialogBoxParam 函数具体实现什么样的操作由参数 IpDialogFunc 决定,IpDialogFunc 为指向模态对话框过程的指针
IpDialogFunc 参数指向的地址为 40108C
在该处下一个断点,运行程序
停在断点处
按 F8 往下走
执行跳转,一路默认往下走
到了动态链接库中,按 Alt+F9
程序又回到了起始处,继续往下走
这次的跳转没有实现
接着往下走
走到这个地方会响一声弹出对话框的声音,然后又回到原处
这个 call 处下一个断点,重新跑一下程序
停在这个地方后,按 F8
弹出了对话框
看来是这个 call 语句
步入这个 call 语句
这里先是调用了一个 API 函数 CreateToolhelp32Snapshot 来创建进程快照
这两个是它的参数
这个函数的第一个参数 dwFlags 用来指定“快照”中需要返回的对象,第二个参数 th32ProcessID 用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为 0
该函数如果调用成功,返回快照的句柄;调用失败,返回 INVALID_HANDLE_VALUE
eax 的值为 BC,函数调用成功
执行完这句,EDI 的值为 OLLYDBG.EXE
然后调用 Process32First 函数,前面两个是它的函数
当利用函数 CreateToolhelp32Snapshot 函数获得当前运行进程的快照后,可以用 Process32First 函数来获得第一个进程的句柄
接着往下走
[System Process] 为 Process32First 函数的结果
然后调用 lstrcmpi 函数对它的两个参数进行对比,前面两个是它的参数
如果两个的值相同返回 0,不同返回 1
值为 1,两个参数的值不同
这个跳转就没有实现,如果是 0 的话,跳转实现
接着往下走
接下来调用了 Process32Next 函数,前面两个为它的参数
Process32Next 函数用来获得下一个进程的句柄
接着往下走
Process32Next 获取的是 System
然后调用 lstrcmpi 函数进行字符串对比,两个值不一样,返回 1
跳转没有实现
往下走
这个跳转往上跳,是一个循环
通过 Process32Next 函数逐个地获取进程的句柄,并判断进程中是否有“OLLYDBG.EXE”
如果进程中存在 OLLYDBG.EXE 就会弹出错误的对话框
如果进程中没有 OLLYDBG.EXE,则调用 CloseHandle,然后返回,ollybug.exe 不区分大小写