对抗静态分析——运行时修复dex
 
零、写在前面
 
这个系列本来题目想写对抗反编译,可是想想对抗反编译的这个范围有点大,总结如下
灵魂作图
 
<ignore_js_op>
自己比较熟悉的是静态分析,所以就从这里入手吧,省的吹大了,挖了坑填不上那就不好了。当然也会写些动态分析的东西。
废话少说,开始吧,最近又把脱壳拿出来看了,就从这里开始吧
 
一、理论(总要解释一下)
 
壳是一个比较大的概念,发展的比较迅速。未来(或者现在?)加壳的主流会逐渐变为第四代壳,也就是VMP,各个厂商自己搞一套解释器,但是这种方式对运行效率影响比较大(有多大我没有详细的数据,也可能现在已经拿出来的VMP加壳方案已经解决了很大程度上的效率问题?这个不清楚)。
这篇讲的是一种采用比较多的办法,在运行时对dex进行修改。针对源APK(也就是真正运行的APK),将dex文件中的某部分指令提取出来,保存为一个文件。然后将dex文件中的这部分指令修改为错误的字节码,比如0x00 0x00 0x00 0x00 0x00 。。。运行时,壳程序将这部分指令修复。修复的方法简单点可以直接替换回去,如果复杂点可以在dex文件的范围外new一块区域,然后将原本指向这部分指令的指针指向new出来的区域(也就是在dex外部),这样即便你通过动态分析对dvmDexFileOpenPartial这样的API下断能dump出dex文件,还是没有办法正确反编译,因为正确的指令还是没有加入进来。
 
整个过程分为两个阶段
第一阶段:提取、替换正确的dex中的指令
第二阶段:运行时修复替换之后错误的dex文件
 
 
1、定位——提取——替换
首先,在dex中定位code的位置,我们看看android源码是怎么写的
源码位置dalvik\libdex\dexFile.h
 
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
/*
 * Direct-mapped "code_item".
 *
 * The "catches" table is used when throwing an exception,
 * "debugInfo" is used when displaying an exception stack trace or
 * debugging. An offset of zero indicates that there are no entries.
 */
struct DexCode {
    u2  registersSize;
    u2  insSize;
    u2  outsSize;
    u2  triesSize;
    u4  debugInfoOff;       /* file offset to debug info stream */
    u4  insnsSize;          /* size of the insns array, in u2 units */
    u2  insns[1];
    /* followed by optional u2 padding */
    /* followed by try_item[triesSize] */
    /* followed by uleb128 handlersSize */
    /* followed by catch_handler_item[handlersSize] */
};
 
这个结构,从上到下分别表示
~~~~~~~~~~~~~~
该函数寄存器的数目
传入的参数个数
调用其他函数时需要的参数个数
try结构的数目
debug信息的偏移
指令列表大小
该函数的指令
~~~~~~~~~~~~~~
看注释,这个结构我们一般不叫它DexCode,而是code_item(关于各种item,在深入Androguard源码中有解释)
而指向它的指针,位于encoded_method结构中的codeoff(源码位置dalvik\libdex\DexClass.h)
 
[AppleScript] 纯文本查看 复制代码
1
2
3
4
5
6
/* expanded form of encoded_method */
struct DexMethod {
    u4 methodIdx;    /* index to a method_id_item */
    u4 accessFlags;
    u4 codeOff;      /* file offset to a code_item */
};
那么这个DexMethod来自于哪里呢?在这里(同一文件下)
 
..............................................略
 

最新文章

  1. C算法编程题系列
  2. TortoiseSVN常用批处理命令 分类: C# 2014-08-09 11:31 648人阅读 评论(1) 收藏
  3. nodejs gearman redis
  4. 携手K2 BPM,华住酒店完美实现“互联网+”转型
  5. [转]C# WinForm treeview checkbox----递归算法利用
  6. 网络IPC:套接字之非阻塞和异步I/O
  7. input子系统分析
  8. oracle10g前期准备
  9. oracle 配置服务端
  10. pyqt 动态显示时间方法例子学习
  11. 【SoDiaoEditor更新啦】--谨以献给那些还在医疗行业奋斗的小伙伴们
  12. C#保留2位小数的做法
  13. # Do—Now——团队冲刺博客_总结篇
  14. opencart3图片Google Merchant Center验证通过不了的解决方法
  15. Linux中硬链接和软链接的区别
  16. Java中Reflect的基本使用
  17. SpringMVC不能引入静态资源
  18. shiroWeb项目-记住我(自动登陆实现)(十五)
  19. C# lock 关键字的一些理解
  20. [蓝桥杯]ALGO-86.算法训练_矩阵乘法

热门文章

  1. 谈谈对从业IT行业看法
  2. 【Android学习】数据传递三种方式
  3. Shader Overview
  4. Unity 全面理解加载和内存管理
  5. 你不知道的javascript
  6. Python - 利用pip管理包
  7. Love
  8. 【转】sql server开启全文索引方法
  9. 虚拟机service network restart没有反应解决方法
  10. Mysql查找所有项目开始时间比之前项目结束时间小的项目ID