吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 4083|回复: 111

[原创逆向图文] 对反调试IsDebuggerPresent的研究

  [复制链接]
白云点缀的蓝 发表于 2021-9-24 19:29 | 显示全部楼层 |阅读模式

本帖最后由 白云点缀的蓝 于 2021-11-6 10:54 编辑

简介:IsDebuggerPresent是确定调用进程是否由用户模式的调试器调试。下面是简单写的一个反调试代码
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <Windows.h>
int main() {
  int IsDebug=        IsDebuggerPresent();
  if (IsDebug) {

          MessageBoxA(NULL, "调试中", "温馨提示", NULL);
          return EXIT_FAILURE;
  }
  MessageBoxA(NULL, "未被调试", "温馨提示", NULL);
  return EXIT_SUCCESS;

}




反调试主要逻辑:IsDebuggerPresent()

下面这个是c++的函数原型

[C++] 纯文本查看 复制代码
BOOL IsDebuggerPresent();


官方文档地址:https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent

返回值说明:


如果当前进程在调试器的上下文中运行,则返回值非零。

如果当前进程未在调试器的上下文中运行,则返回值为零。


也就是说只要返回值是非0就说明被od,或者其他调试工具调试中

我们只要判断返回值就行

这里我用的int类型的变量来接收返回值,因为bool类型就是int类型的重命名

[C++] 纯文本查看 复制代码
typedef int                 BOOL;


[C] 纯文本查看 复制代码
int IsDebug=        IsDebuggerPresent();


在c语言中非0就是真,也就是说用if来判断是否正在被调试中

如果被调试就弹出对话框,提示你调试中

[C] 纯文本查看 复制代码
if (IsDebug) {

MessageBoxA(NULL, "调试中", "温馨提示", NULL);
return EXIT_FAILURE;
}


如果未被调试,就执行如下代码

[C] 纯文本查看 复制代码
MessageBoxA(NULL, "未被调试", "温馨提示", NULL);
return EXIT_SUCCESS;

}


下面我们来运行调试一下

当我们直接运行不调试时,提示如下

debug.png

因为调试了就无法知道IsDebuggerPresent的返回值,所以我直接打印一下返回值

打印代码:
[C] 纯文本查看 复制代码
printf("%d\n", IsDebug);


运行后可以看到打印了0

debug1.png

下面我们进行调试然后跟踪一下反汇编代码

下图红色部分为调用IsDebuggerPresent函数

debug2.png

跟踪进入isDebuggerPresent函数内部

debug3.png

可以看到eax的值变为了00E74000

debug4.png

取出eax+2地址里面的值



debug5.png

然后把eax的值进行返回

然后把返回的值进行赋值给IsDebug

在计算机中,每一个变量都有一个地址,[IsDebug]就是忘IsDebug地址里写入eax存的值,也就是1

[Asm] 纯文本查看 复制代码
00A148A4  mov         dword ptr [IsDebug],eax  


debug6.png

可以看到有一个比较,如果IsDebug为0那么就跳过提示调试中

[Asm] 纯文本查看 复制代码
if (IsDebug) {
00A148B8  cmp         dword ptr [IsDebug],0  
00A148BC  je          __$EncStackInitStart+66h (0A148E2h)


可以看到IsDebug为1,所以je不会跳转


debug8.png

然后执行下面的弹窗

[Asm] 纯文本查看 复制代码
 MessageBoxA(NULL, "调试中", "温馨提示", NULL);
00A148BE  mov         esi,esp  
00A148C0  push        0  
00A148C2  push        offset string "\xce\xc2\xdc\xb0\xcc\xe1\xca\xbe" (0A17B34h)  
00A148C7  push        offset string "\xb5\xf7\xca\xd4\xd6\xd0" (0A17BE0h)  
00A148CC  push        0  
00A148CE  call        dword ptr [__imp__MessageBoxA@16 (0A1B098h)]  
00A148D4  cmp         esi,esp  
00A148D6  call        __RTC_CheckEsp (0A11230h)


当执行完如下代码时弹出了信息框

debug08.png


debug9.png




如果未被调试执行如下代码:
[Asm] 纯文本查看 复制代码
MessageBoxA(NULL, "未被调试", "温馨提示", NULL);
00A148E2  mov         esi,esp  
00A148E4  push        0  
00A148E6  push        offset string "\xce\xc2\xdc\xb0\xcc\xe1\xca\xbe" (0A17B34h)  
00A148EB  push        offset string "\xce\xb4\xb1\xbb\xb5\xf7\xca\xd4" (0A17BE8h)  
00A148F0  push        0  
00A148F2  call        dword ptr [__imp__MessageBoxA@16 (0A1B098h)]  
00A148F8  cmp         esi,esp  
00A148FA  call        __RTC_CheckEsp (0A11230h)  
  return EXIT_SUCCESS;
00A148FF  xor         eax,eax  


有哪些方式可以过反调试呢?

可以通过修改IsDebuggerPresent函数的返回值为0实现过反调试

这里我把eax的值改为0

debug10.png

debug11.png

修改完后点击运行,可以发现成功跳过了

debug12.png
另外一种方式是把je改为jmp,直接绕过反调试

debug13.png

在od中过反调试的方法如下

过反调试的第一种方式(适合代码被加壳,被vm,也适合无壳)
CTRL+G搜索IsDebuggerPresent

debug14.png

debug15.png


我们在头部下断

debug16.png

执行到retn处可以看到eax的值为1

debug17.png

双击eax,把1改为0

debug18.png

然后我们F9运行

可以看到成功绕过了反调试

debug19.png

未修改任何数据的情况下,可以看到检测到了

debug20.png

过反调试的第二钟方式(适合未加壳)

通过修改je为jmp来实现绕过反调试

我们先在IsDebuggerPresent头部下断

然后点击运行,可以看到调用这个IsDebuggerPresent函数的call

因为在调用call时,会把cal指令的下一条指令压入堆栈

debug21.png

选择堆栈第一条指令,然后回车快速跳转到call前的下一条指令


debug22.png

根据前面的分析,我们可以知道下面那一条je语句就是关键

debug23.png

我们把这条语句改为jmp即可实现过反调试


[Asm] 纯文本查看 复制代码
JMP SHORT 00A148E2


然后F9运行,可以看到成功绕过了反调试





评分

参与人数 41威望 +1 HB +67 THX +16 收起 理由
创客者V2.0 + 1
459121520 + 1
WolfKing + 2 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
消逝的过去 + 1
冷亦飞 + 1
飞刀梦想 + 1
l278785481 + 1
Wayne + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
zg2600 + 1
无边无际的人 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
山野屌丝 + 1
ldljlzw + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
playboy + 2
清风而已 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
BigCarp + 1
boot + 1
XiaoWeiSec + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
allenzjb + 1 + 1
Shin + 2
小小沫涵 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
小声点我布隆 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
Hackers + 1 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
kalove + 1
19861800008 + 1
renzaijianghu + 1
hetao8003200 + 2
風清. + 1
brswbx201610 + 1
1304301437 + 1
z657624421 + 1
bnjzzheng + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
hnymsh + 1
king51999 + 1 [快捷评语]--你将受到所有人的崇拜!
保安 + 1 [快捷评语]--你将受到所有人的崇拜!
yfltwin + 1 + 1 [快捷评语]--你将受到所有人的崇拜!
寒宇 + 4 + 1 [快捷评语]--积极评分,从我做起。感谢分享!
Shark恒 + 1 + 20 + 1 [快捷评语]--积极评分,从我做起。感谢分享!
Very_good + 4 + 1 [快捷评语]--吃水不忘打井人,给个评分懂感恩!
snak2008 + 1 + 1 [快捷评语]--吃水不忘打井人,给个评分懂感恩!
aゞ烛火 + 6 + 1 [快捷评语]--积极评分,从我做起。感谢分享!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Shark恒 发表于 2021-9-24 22:35 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Very_good 发表于 2021-9-24 22:55 | 显示全部楼层

赞一个,有空也可以普及一下CheckRemoteDebuggerPresent
这两个API是最常见的反调试API
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
寒宇 发表于 2021-9-25 11:41 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
列明 发表于 2021-9-26 13:33 | 显示全部楼层

直接修改API的返回值麽?
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| 白云点缀的蓝 发表于 2021-9-26 14:49 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
2098502556 发表于 2021-10-8 17:35 | 显示全部楼层

学习支持康康
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
pizazzboy 发表于 2021-10-17 13:55 | 显示全部楼层

学习一下反调试
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
保安 发表于 2021-10-21 13:06 | 显示全部楼层

感谢分享 这就去淦VMP内核反调试(huaji)
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
bnjzzheng 发表于 2022-1-3 12:07 | 显示全部楼层

多谢分享多谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表