E盾 模块反编译后 分析E盾使用的反调试方案,和反反调试思路每天分析几个,奥里给,干就完了。哪里分析有问题,希望师傅们多多指教。
GetStartupInfo 在程序启动后,会有一个StartupInfo的结构体变量,来保存程序启动的信息,我们通过其中参数的改变来检测程序是正常运行还是在调试器中运行的
GetStartupInfo
参考地址:https://www.cnblogs.com/ziolo/p/3434815.html
参考地址:https://blog.csdn.net/tk86935367/article/details/8174368
E盾V51代码:
BOOL UseGetStartupInfoCheckDebug() { STARTUPINFO startUpInfo; startUpInfo.cb = sizeof(startUpInfo); GetStartupInfo(&startUpInfo); if (startUpInfo.dwX != 0 || startUpInfo.dwY != 0 || startUpInfo.dwXCountChars != 0 || startUpInfo.dwYCountChars != 0 || startUpInfo.dwFillAttribute != 0 || startUpInfo.dwXSize != 0 || startUpInfo.dwYSize != 0 || (startUpInfo.dwFlags & STARTF_FORCEOFFFEEDBACK)) { std::cout << "! GetStartupInfo debugger" << std::endl; return true; } return false; }
反反调试方案: Hook GetStartupInfo 返回一个 非0值 就好了
IsDebuggerPresent 这个函数可以用在程序中,检测当前程序是否正在被调试,从而执行退出等行为,达到反调试的作用。
IsDebuggerPresent
该函数通过 fs:[0x18] 获取 TEB -> TEB:[0x30] 获取 PEB -> PEB:[0x2] BeingDebugged:UChar 调试标志, 通过调试标志 来判断是否调试
参考资料:https://blog.csdn.net/chriz_w/article/details/52096552
参考资料:https://blog.csdn.net/ls1160/article/details/38105873
BOOL UseIsDebuggerPresentCheckDebug() { if (IsDebuggerPresent()) { std::cout << "! IsDebuggerPresent debugger" << std::endl; return true; } return false; }
反反调试方案:hook函数直接返回false
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
EX呵呵 e盾里还有一大堆反调试的东西你说的这俩是最简单的了