基于文件名的反调试:发现改了名字之后再载入OD就不会进行反调试的操作了
GetProcAddress 获取隐藏的函数地址间接调用
反调试的过程:
1、载入OD,进行GetProcAddress这个windows api函数下CC断点,然后进行多次F9运行,直到获取到EnumProcesses该windows api函数然后执行到返回
2、然后对接下来的获取到的三个主要的api函数进行断点,EnumProcesses,EnumProcessModules,GetModuleBaseNameA,依次如上操作
EnumProcesses:枚举进程的PID
EnumProcessModules:获取进程的基址
GetModuleBaseNameA:得到进程的名字
3、接下来的F9运行就是反复的进行判断,流程:枚举进程的所有的PID->获取当前进程的句柄->获取当前进程的名字->比较是否为OD的名称->是的话则关闭,不是的话就下一个继续比较直到比较完所有的,再次执行到EnumProcesses,然后堆栈窗口进行跟随,找到当前OD的PID转换的十六进制数
4、然后对当前的十六进制数进行设置内存访问,继续跟踪,来到如下,0D4C是自己的OD的PID转换为十六进制的数值
5、来到如下,OpenProcess windows api函数是用来获取当前进程的句柄,相当于得到控制权
6、OpenProcess获取到的句柄值返回到eax中,句柄窗口中同样也可以发现
7、继续F9,执行到返回,来到EnumProcessModules结束的retn,跟随数据,这个00400000就是当前进程的基址
8、继续F9,来到GetModuleBaseNameA,执行到返回,来到GetModuleBaseNameA结束的retn,跟随数据窗口,获取到进程的名字
9、走出当前call,F8,就来到了关闭句柄的函数CloseHandle
SharkHeng老师的总结:
因为可疑函数被隐藏,或者说在函数列表中未找到可疑函数。
所以,我们利用GetProcAddress,捕捉他是否间接加载调用其他隐藏函数。
GetProcAddress获取
EnumProcesses
EnumProcessesModules
GetModuleBaseNameA
这3个函数所在的地址(调用处,或者说是段首)
然后利用EnumProcesses获取当前所有进程PID
然后通过PID,利用OpenProcess获取当前参数PID的句柄。
然后通过句柄,利用EnumProcessesModules获取当前参数句柄模块基址。
然后通过句柄和模块基址,利用GetModuleBaseNameA获取当前符合两参数的模块名称。(或者叫做进程名)
然后通过进程名与指定字符串进行比较。
如果相等,通过PID,利用OpenProcess获取当前参数PID的句柄。
然后,利用句柄,通过TerminateProcess结束进程。