OD 实验(二十) - 对反调试程序的逆向分析(一)

时间:2023-03-10 05:54:34
OD 实验(二十) - 对反调试程序的逆向分析(一)

程序:

OD 实验(二十) - 对反调试程序的逆向分析(一)

Keyfile.dat 里的内容

OD 实验(二十) - 对反调试程序的逆向分析(一)

该文件中要至少有 9 个

ReverseMe.A:

运行程序

OD 实验(二十) - 对反调试程序的逆向分析(一)

用 OD 打开该程序,运行

OD 实验(二十) - 对反调试程序的逆向分析(一)

弹出的是错误的对话框

该程序发现 OD 对它的调试,所以该程序对 OD 进行反调试

重新载入程序,按 F8 往下走

OD 实验(二十) - 对反调试程序的逆向分析(一)

这个循环是对 Keyfile.dat 的内容进行判断的

循环过来,来到一个 call 语句

OD 实验(二十) - 对反调试程序的逆向分析(一)

执行该 call 语句就会弹出那个弹窗

OD 实验(二十) - 对反调试程序的逆向分析(一)

这个 call 指令调用的函数就在下面

OD 实验(二十) - 对反调试程序的逆向分析(一)

这个地方调用了一个 IsDebuggerPresent 函数

该函数判断程序进程是否由用户模式的调试器调试,如果当前进程在调试器中,返回值为非零值,如果当前进程不在调试器中,返回值为零

按 F8 往下走

OD 实验(二十) - 对反调试程序的逆向分析(一)

返回值 eax 的值为 1,是非零

OD 实验(二十) - 对反调试程序的逆向分析(一)

然后执行跳转,跳到弹出是错误的对话框

Reverse.B:

运行程序

OD 实验(二十) - 对反调试程序的逆向分析(一)

用 OD 载入程序,运行

OD 实验(二十) - 对反调试程序的逆向分析(一)

程序运行到该处会暂停,再运行

OD 实验(二十) - 对反调试程序的逆向分析(一)

程序就终止了

重新载入程序,按 F8 一步一步往下走

OD 实验(二十) - 对反调试程序的逆向分析(一)

这里还是执行了 call 指令

OD 实验(二十) - 对反调试程序的逆向分析(一)

调用 IsDebuggerPresent 函数

接着往下走

OD 实验(二十) - 对反调试程序的逆向分析(一)

把 esp 给 401121

继续运行程序,程序就终止了

Reverse.C:

运行程序

OD 实验(二十) - 对反调试程序的逆向分析(一)

用 OD 载入程序,运行

OD 实验(二十) - 对反调试程序的逆向分析(一)

程序直接终止了

重新载入程序,按 F8 往下走

OD 实验(二十) - 对反调试程序的逆向分析(一)

执行 call 指令之后会先用 IsDebuggerPresent 函数进行判断是否被反调试

OD 实验(二十) - 对反调试程序的逆向分析(一)

eax 的值为 1,执行跳转,然后执行 ExitProcess 函数退出程序

Reverse.D:

运行程序

OD 实验(二十) - 对反调试程序的逆向分析(一)

用 OD 载入程序,运行

OD 实验(二十) - 对反调试程序的逆向分析(一)

重新载入程序,按 F8 往下走

OD 实验(二十) - 对反调试程序的逆向分析(一)

这里 eax 为 1 的话,跳转到 jmp eax 这

此时 eax 的值为 1,jmp eax 跳转到此处的话肯定会出错