对抗某反调试CM2

【文章标题】: 全新反调试CM

【文章作者】: 半斤八两

【软件名称】: 全新的反调试第1季(无网无壳版).exe

【下载地址】: https://bbs.pediy.com/thread-187142.htm

【使用工具】: IDA、OD、资源工具

【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

--------------------------------------------------------------------------------

【版权声明】: 本文原创于小生我怕怕, 转载请注明作者并保持文章的完整, 谢谢!

 

                                                       2018年11月07日 14:15:52

 

作者需求:

一种全新的反调试思路.

程序主要参考了 tmd和超时代 的思路.

 

 

程序运行起来后.点那个按钮,会触发 MessageBoxA  断点.

如果你能在ollydbg中断下来, 那么,你就搞掂了,如果你搞掂了,记得分离一下  :)

 

 

 

 

 

 

 

 

 

                               By 半斤八兩

                                2014.04.28

 

0、参考资料、预备知识

1、常见进程注入的实现及内存dump分析——反射式DLL注入(下)

网址:来自 <https://bbs.pediy.com/thread-224241.htm>

2、傀儡进程技术实现

网址:来自 <https://www.52pojie.cn/thread-501486-1-1.html>

3、在VC中使用自定义资源,FindResource,LoadResource,LockResource

网址:来自 <https://www.cnblogs.com/gakusei/articles/1352922.html>

4、调试器设计(2)

网站:来自 <https://bbs.pediy.com/thread-107838.htm>

 

 

1、准备工作收集信息

1、软件运行界面

2、资源工具

获取到的信息:

1、里面藏着一个PE文件

2、Dialog里面并没有按钮的选项

3、我们将PE文件导出来为123.exe

3、查看导出来的PE文件信息

1、双击运行是显示错误的

2、我们发现导出来的PE文件里面就有我们需要的按钮

 

2、IDA、OD结合分析

首先想到的是应该先下MessageBoxA、MessageBoxW(当然是没用的)

1、软件操作都是双击完按钮之后触发的,那么我们该如何定位

2、OD、IDA分析上下文

通过F5跟OD大概获取到的信息:

1、程序释放出自身的PE文件

2、sub_401BB0看参数,应该是把PE文件缓冲区跟大小传进去,然后返回个PID

3、附加进程、恢复线程

3、分析sub_401BB0函数

3、1:首先分析sub_401570函数

获取到的信息:

1、拷贝PE基本信息、区段信息

2、程序是自己实现了LoadLibrary函数

 

3、2:分析sub_401990函数

总结:

进行傀儡进程操作

1、分析sub_4018A0函数

PCHunter工具可以看到这个傀儡进程

2、分析sub_401830函数

3、后续都是傀儡进程操作了

 

4、sub_401F10函数调试框架分析

4、1:sub_401D70函数分析

我们在这两处都下断

结合上下文逻辑:

1、B程序无法直接打开

2、A程序又以附加方式打开B,那么就说明A修复了B的BUG

3、我们发现修改上下文的就只有两处,那么我们就在这两处都下断点

代码中断在下面的Context.Eax = sub_401D60(Context.Eax, DebugEvent.dwThreadId);这一句上

那么我们只要知道代码中断的IP地址即可

我们可以通过CONTEXT结构(VS按F12)往上翻

OD查看

出错代码地址:

40145B

 

5、使用CE、IDA等工具查看B进程的内存状态

发现这里面有一个CC断点,导致代码错误的

第一步先把INT改成NOP

第二步有两种选择

1、这两句NOP掉

00401468  |.  33C1          xor eax,ecx

0040146A  |.  35 76983412   xor eax,0x12349876

2、要么就学A程序多加几句汇编代码,再异或回去

00401444      33C1          xor eax,ecx

00401446      35 76983412   xor eax,0x12349876

0040144B      5F            pop edi

0040144C      C2 0400       retn 0x4

0040144F      90            nop

00401450      57            push edi

00401451  |.  BF D80E1400   mov edi,0x140ED8

00401456  |.  8B4424 08     mov eax,dword ptr ss:[esp+0x8]

0040145A    ^ EB E8         jmp short 123.00401444

0040145C      90            nop

0040145D      90            nop

0040145E      90            nop

 

6、完结撒花

### 反调试对抗技术的实现方法与原理 反调试技术的核心目标是检测和阻止调试器对程序的分析,从而保护软件免受逆向工程攻击。以下是几种常见的反调试技术及其实现原理: #### 1. 调试器检测 通过检查特定的系统状态或行为,可以判断是否正在运行调试器。例如: - **IsDebuggerPresent**:Windows API 提供了一个简单的函数 `IsDebuggerPresent` 来检测当前进程是否被调试[^1]。 - **异常处理机制**:通过触发特定异常并观察其处理方式,可以间接判断是否存在调试器。调试器通常会改变异常处理流程[^3]。 #### 2. 时间测量 利用计时器检测调试器的存在。调试器在单步执行或断点命中时会显著增加指令执行时间。可以通过以下方法实现: - **RDTSC 指令**:读取处理器的时间戳计数器(TSC),比较两次调用之间的时间差。如果时间过长,则可能有调试器介入[^3]。 - **循环计时**:使用高精度计时器测量简单代码块的执行时间,超出预期范围则触发警报[^4]。 #### 3. 内存完整性保护 通过定期检查关键内存区域的一致性,防止调试器修改内存内容。例如: - **AntiDump 配置**:通过配置文件启用内存完整性检查,如 `[AntiDump] Enable = True`,并设置检查间隔和加密密钥[^3]。 - **动态内存校验**:在运行时对重要数据结构进行哈希计算,并与预定义值对比,确保未被篡改。 #### 4. 硬件断点检测 硬件断点通常依赖于 CPU 的调试寄存器(DR0-DR7)。可以通过以下方法检测这些寄存器的状态: - **直接读取调试寄存器**:通过汇编指令访问调试寄存器,检查是否存在非法值[^3]。 - **模拟调试行为**:尝试设置硬件断点并观察其效果,与预期结果不符则表明存在调试器。 #### 5. 虚拟化逃逸 现代反调试技术还涉及虚拟化环境检测,以防止恶意用户通过虚拟机分析程序。例如: - **嵌套虚拟化检测**:通过检查 CPU 特定标志位或异常行为,判断是否运行在虚拟化环境中[^2]。 - **指令集随机化**:动态生成和执行加密的机器码,增加静态分析难度[^3]。 #### 6. HOOK 技术 HOOK 是一种拦截和修改系统调用或消息传递的技术,广泛应用于反调试领域。其实现原理包括: - **API HOOK**:通过替换目标函数的入口地址,插入自定义逻辑。例如,HOOK `NtQueryInformationProcess` 函数以隐藏调试标志[^4]。 - **Inline HOOK**:修改目标函数的前几条指令,跳转到自定义代码段,完成后恢复原始执行流[^4]。 ### 示例代码 以下是一个简单的 RDTSC 计时检测示例: ```c #include <stdio.h> #include <intrin.h> int main() { __int64 start = __rdtsc(); for (int i = 0; i < 1000000; i++); // 循环耗时操作 __int64 end = __rdtsc(); printf("Time taken: %I64d ticks\n", end - start); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值