E盾反调试分析

  1. GetStartupInfo 在程序启动后,会有一个StartupInfo的结构体变量,来保存程序启动的信息,我们通过其中参数的改变来检测程序是正常运行还是在调试器中运行的

参考地址:https://www.cnblogs.com/ziolo/p/3434815.html

参考地址:https://blog.csdn.net/tk86935367/article/details/8174368

E盾V51代码:

20200828180038

1
2
3
4
5
6
7
8
9
10
11
12
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值 就好了
  • Hook GetStartupInfo 返回一个 非0值 就好了
  1. 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

E盾V51代码:

20200828191723

1
2
3
4
5
6
7
8
9
BOOL UseIsDebuggerPresentCheckDebug()
{
if (IsDebuggerPresent())
{
std::cout << "! IsDebuggerPresent debugger" << std::endl;
return true;
}
return false;
}

反反调试方案:hook函数直接返回false

心得

  1. 部分根据标志来判断反调试的,可以通过 直接使用汇编来写反调试 比如:IsDebuggerPresent
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...