OD 实验(二十) - 对反调试程序的逆向分析(一)
程序:
Keyfile.dat 里的内容
该文件中要至少有 9 个
ReverseMe.A:
运行程序
用 OD 打开该程序,运行
弹出的是错误的对话框
该程序发现 OD 对它的调试,所以该程序对 OD 进行反调试
重新载入程序,按 F8 往下走
这个循环是对 Keyfile.dat 的内容进行判断的
循环过来,来到一个 call 语句
执行该 call 语句就会弹出那个弹窗
这个 call 指令调用的函数就在下面
这个地方调用了一个 IsDebuggerPresent 函数
该函数判断程序进程是否由用户模式的调试器调试,如果当前进程在调试器中,返回值为非零值,如果当前进程不在调试器中,返回值为零
按 F8 往下走
返回值 eax 的值为 1,是非零
然后执行跳转,跳到弹出是错误的对话框
Reverse.B:
运行程序
用 OD 载入程序,运行
程序运行到该处会暂停,再运行
程序就终止了
重新载入程序,按 F8 一步一步往下走
这里还是执行了 call 指令
调用 IsDebuggerPresent 函数
接着往下走
把 esp 给 401121
继续运行程序,程序就终止了
Reverse.C:
运行程序
用 OD 载入程序,运行
程序直接终止了
重新载入程序,按 F8 往下走
执行 call 指令之后会先用 IsDebuggerPresent 函数进行判断是否被反调试
eax 的值为 1,执行跳转,然后执行 ExitProcess 函数退出程序
Reverse.D:
运行程序
用 OD 载入程序,运行
重新载入程序,按 F8 往下走
这里 eax 为 1 的话,跳转到 jmp eax 这
此时 eax 的值为 1,jmp eax 跳转到此处的话肯定会出错