企业壳的反调试及Hook检测分析

本文解析了梆梆壳中的多种反调试技术,包括时间线程检测、ptrace检测及Hook检测等,并提供了具体的调试绕过思路。

1.写在开始

最近在学习梆梆壳,在调试的过程中遇到了反调试,很是苦恼,而且每次调试都会被中断,朋友发了篇帖子【1】介绍了其中的一个反调,学习后收获颇多,给我指明了方向,接下来再对其他反调试进行补充,若有疏漏之处请各位大佬批评指正。

2.反调试之时间线程检测

启动调试后是对帖子【1】的验证,过程大致如下:

运行brpt.py后一路F9,

...
#下断点
# 内存中获取模块基地址
base = FindModule('linker');

#.text:00002464     BLX        R4
addr = base + 0x2464; #该偏移值需要使用IDA静态查看linker模块的偏移值
#给linker下断点
AddBpt(addr);

#在libc.so中对库函数下断点
AddBpt(LocByName('fopen'));
AddBpt(LocByName('ptrace'));
...

当lr为pB54EB0CAE49198754C66F4A57BDB01DF函数时即为第一个反调试的线程创建处,然后会调用libDexHelper.so:pDD8ABF73B0AE99BD998BC5C954A74856,

无标题.png

再按一次F9即可断到帖子中提到的fopen函数处

无标题2.png

执行完fopen后,回到调用函数libDexHelper.so:p8878CAA1006835C9D43174C88143BA8B处,然后在如下所示处下断点,F9执行到此处,观察寄存器的值并做相应的修改,具体思路就是要跳过libDexHelper.so:AEDC62A8 BLX sub_AEDA6ECC 这个函数调用即可。

无标题3.png

执行完成后,会跳出调用函数,来到下图处将r0寄存器的值修改为0,或将指令#1改为#0即可。

无标题4.png

并在p39D6B1EED99DC7E506A9D4E07BD58D3A处下断,

无标题5.png

执行完之后F9,则会跳到p39D6B1EED99DC7E506A9D4E07BD58D3A处,

无标题6.png

该函数功能类似kill,具体过程参考帖子【1】。

接下来通过静态分析知道了时间线程的创建点,如下所示:

无标题7.png

具体的时间检测函数如下:

无标题8.png

其中主要就是调用了gettimeofday函数,获取时间,然后再做如下比较:

无标题9.png

不满足条件则kill掉,

无标题10.png

以上便是时间检测的功能了。

3.反调试之ptrace检测

接下来是ptrace检测函数,通过静态分析ptrace被调用了3次,首先进行PTRACE_ATTACH,第二次调用后和0进行比较,最后进行PTRACE_DETACH,如下所示:

无标题11.png

另一处case 13会调用pF77EA32766D841ED6BD10130E181CB0D()也是ptrace检测,

无标题12.png

在p9392640B2E38B72373213C945704CA08处也调用了ptrace检测,

无标题13.png

具体函数如下所示:

无标题14.png

其中p1EBFB58D66C99CAD7405904C9B93559D()->p39D6B1EED99DC7E506A9D4E07BD58D3A。

4.函数大致流程

经过上述分析,整理大致调用流程如下(随手画的):

无标题15.png

5.Hook检测之Xposed检测

对于Xposed检测主要是对相关字符串做了比对,如下图所示:

无标题16.png

在做完比对后返回0和1进行比较,最后又会调用那个自己写的p39D681EED99DC7E506A9D4E07BD58D3A函数,前面提到,该函数功能类似kill,此处做了重命名为p3_linux_syscal_kill。

无标题17.png

6. Hook检测之substrace检测

通过静态分析可知,pAFD3E6E79D2F88D9F3563AE570866D51函数在case2中调用了pB4DACEC3279252082ECED1471A664BF7函数,此函数则为substrace的检测点,

无标题18.png

具体函数如下所示:

无标题19.png

当然也是比较的字符串,根据以上信息可以在手机中安装对应的框架进行动态验证,由于我的环境没有安装该hook框架,故暂未进行动态验证。

7.小结

根据以上分析,过掉以上反调试就很容易了,具体操作不难,不再赘述,方法可以参考帖子【2】。我采用idapython脚本绕过,终于可以开心的调试了,以上当然不是所有的反调,具体还有其他细节的处理遇到了再根据具体情况加以分析,其中还有inotify没有分析,具体可以参考另一篇帖子【3】。当然,对于梆梆壳这只是迈出的第一步,还有很多内容等待我们去挖掘!

8.参考引用

【1】https://bbs.pediy.com/thread-223808.htm

【2】https://bbs.pediy.com/thread-218938.htm

【3】https://bbs.pediy.com/thread-223320.htm

*本文原创作者:y0nLandroid,本文属FreeBuf原创奖励计划,未经许可禁止转载

原文地址: http://www.freebuf.com/articles/es/160656.html

<think>我们正在讨论VMP(虚拟机保护)的手动编写是否现实。VMP是一种高级的代码保护技术,它通过将原始代码转换为在自定义虚拟机中执行的字节码来增加逆向分析的难度。 用户问题:手动编写VMP子是否现实? 回答思路: 1. 解释VMP的基本原理和复杂度。 2. 分析手动编写VMP的可行性。 3. 讨论所需的技能和时间成本。 4. 权衡利弊,给出建议。 注意:由于这是一个技术性较强的问题,需要确保回答准确且具有参考价值。 </think>手动编写VMP(虚拟机保护)在技术上是可行的,但实际上面临重大挑战,需要深入的专业知识和大量时间投入。以下是关键分析: ### 一、技术可行性分析 1. **基础原理可实现** VMP核心是将原生指令转换为自定义字节码(如`mov eax, ebx` → `0x8B 0xC3` → 自定义操作码`0xVV 0xMM 0xPP`),通过虚拟机解释执行。这种指令转换和调度机制完全可通过手动编码实现。 2. **必要组件可构建** - 指令转换器(将x86/ARM指令映射到自定义ISA) - 虚拟机解释器(含寄存器模拟、指令分派逻辑) - 反调试/反Hook机制(如`INT 2D`异常检测) - 代码多态引擎(动态改变指令序列) ### 二、主要挑战 1. **开发复杂度极高** - 需要精通汇编、编译器设计、操作系统内核 - 单是完整实现x86指令集映射就需处理500+指令变种[^1] - 虚拟机调度逻辑需规避模式识别(如避免固定`switch-case`结构) 2. **安全与性能矛盾** | 安全强化手段 | 性能损耗 | 实现难度 | |--------------------|------------------|----------| | 多级虚拟机嵌套 | 执行速度下降90%+ | ⭐⭐⭐⭐ | | 实时代码自修改 | 增加20-40%开销 | ⭐⭐⭐⭐ | | 指令流混淆 | 增加15-30%开销 | ⭐⭐⭐ | 3. **对抗逆向工程** 需持续更新对抗技术,例如: - 检测调试器(`IsDebuggerPresent`绕过后需实现硬件断点检测) - 反内存Dump(如通过`VEH`异常处理程序加密代码段) - 动态解密阈值控制(防止一次性获取完整代码) ### 三、现实建议 1. **推荐方案** ```mermaid graph LR A[需求分析] --> B{保护强度要求} B -->|一般防护| C[使用现成方案<br>如Themida/VMP] B -->|极端防护| D[基于LLVM定制<br>+开源VMP框架] ``` 2. **开发路线参考** - **阶段1**:修改开源项目(如[Obfuscator-LLVM](https://github.com/obfuscator-llvm/)) - **阶段2**:集成Anti-Debug插件(如`ScyllaHide`对抗方案) - **阶段3**:添加多层调度器(类似`VMProtect`的微指令分派) ### 四、结论 **非商业级需求不建议手动开发**。完整实现企业级VMP需5-10人年,且需持续对抗逆向工具(如`IDA`的`VMPSig`插件)。对于大多数场景,修改现有框架(如[HyperPlatform](https://github.com/tandasat/HyperPlatform))或购买商业方案更实际。若坚持自研,建议聚焦特定指令集子集(如仅保护算法函数)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值