首页
论坛
课程
招聘
[原创]E盾-反调试分析(1) - 每日一记
2020-8-28 20:59 1176

[原创]E盾-反调试分析(1) - 每日一记

2020-8-28 20:59
1176

E盾 模块反编译后 分析E盾使用的反调试方案,和反反调试思路
每天分析几个,奥里给,干就完了。
哪里分析有问题,希望师傅们多多指教。

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

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

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

    E盾V51代码:

    20200828180038

    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值 就好了

  2. 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

     BOOL UseIsDebuggerPresentCheckDebug()
     {
         if (IsDebuggerPresent())
         {
             std::cout << "! IsDebuggerPresent debugger" << std::endl;
             return true;
         }
         return false;
     }
    

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

心得

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

[公告]《安卓APP加固攻与防》训练营!Android逆向分析技能,干货满满,报名免费赠送一部手机!

收藏
点赞3
打赏
分享
最新回复 (2)
雪    币: 22
活跃值: 活跃值 (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
EX呵呵 活跃值 2天前
2
0
e盾里还有一大堆反调试的东西你说的这俩是最简单的了
雪    币: 58
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
思源欲涩 活跃值 1天前
3
0
EX呵呵 e盾里还有一大堆反调试的东西你说的这俩是最简单的了
直接自建调试体系懒得搞这些七七八八的。反调试方法一大堆,调试流程就那样。谁权限高谁是bb
游客
登录 | 注册 方可回帖
返回