首页
社区
课程
招聘
[原创]运行时自篡改dalvik字节码delta.apk原理解析(逆向)
发表于: 2013-8-6 16:32 40142

[原创]运行时自篡改dalvik字节码delta.apk原理解析(逆向)

2013-8-6 16:32
40142
出于好奇并且当做原生程序分析练习,对之前运行时自篡改dalvik字节码的程序delta.apk进行了逆向分析,了解了该程序的自篡改原理,现小结如下,如有错误希望大家指正!

参考链接:http://bbs.pediy.com/showthread.php?t=170381
(1)sysconf 用于确定当前的系统变量之值,sys/sysconf.h 头文件可以看到#define _SC_PAGESIZE 0x0027。查看看该系统内存页大小,用于内存操作。
(2)findmagic 可知是查找 dex 加载在内存中的位置。
(3)get* 函数功能主要是定位相应代码的位置。
(4)mprotect 设置内存访问权限,以便对相应内存进行修改。
(5)memcpy 修改函数 dalvik 字节码。
.text:000011E4 loc_11E4 ; CODE XREF: search+2Aj
.text:000011E4 ADDS R4, R4, R6 ;R6 存放对齐页大小
.text:000011E6 MOVS R5, R4
.text:000011E8 ADDS R5, #0x28 ;该页 map 偏移 0x28 的地址
.text:000011EA MOVS R0, R5
.text:000011EC BL findmagic ;查找是否存在 dex\n035
.text:000011F0 CMP R0, #0 ;判断是否找到
.text:000011F2 BEQ loc_11E4
.text:00000FBC EXPORT findmagic
.text:00000FBC findmagic ; CODE XREF: search+24p
.text:00000FBC
.text:00000FBC dest = -0x1C
.text:00000FBC var_14 = -0x14
.text:00000FBC
.text:00000FBC PUSH {R4,R5,LR}
.text:00000FBE LDR R4, =(__stack_chk_guard_ptr - 0xFC8)
.text:00000FC0 LDR R1, =(aDex035 - 0xFCE)
.text:00000FC2 SUB SP, SP, #0x14
.text:00000FC4 ADD R4, PC
.text:00000FC6 LDR R4, [R4]
.text:00000FC8 MOVS R5, R0 ;上层传参(比较的起始偏移)
.text:00000FCA ADD R1, PC ; "dex\n035" DEX 起始标识
.text:00000FCC LDR R3, [R4]
.text:00000FCE MOVS R2, #8 ; n
.text:00000FD0 ADD R0, SP, #0x20+dest ; dest
.text:00000FD2 STR R3, [SP,#0x20+var_14]
.text:00000FD4 BLX memcpy ;参数:dest,起始标识,8;复制标识到缓冲区
.text:00000FD8 MOVS R2, #8 ; n
.text:00000FDA MOVS R0, R5 ; s1
.text:00000FDC ADD R1, SP, #0x20+dest ; s2
.text:00000FDE BLX memcmp ;比较 s1 偏移是否存在标识
.text:00000FE2 LDR R2, [SP,#0x20+var_14]
.text:00000FE4 NEGS R3, R0
.text:00000FE6 ADCS R0, R3
.text:00000FE8 LDR R3, [R4]
.text:00000FEA CMP R2, R3
.text:00000FEC BNE loc_FF2
.text:00000FEE ADD SP, SP, #0x14
.text:00000FF0 POP {R4,R5,PC}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (29)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
e ,好复杂的样子。 先读。
2013-8-6 16:46
0
雪    币: 182
活跃值: (178)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
有人分析过这个例子吗?感觉直接读取/proc/self/maps中的内容,直接找到对应dex所在的位置更快捷。不知道是否可行?
2013-8-6 21:15
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
高端绑定。。
2013-8-6 21:19
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享收藏了
2013-8-7 13:31
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
这是要增加APK破解的难度吧,类似于加壳,加载后动态修改?
这样不会增加什么权限,毕竟核心的权限判断逻辑都在binder服务端,即system server那边,
一个APK又不可能修改system server中的dex内存,只能修改自身的内存,
这样作也就是为了增加APK破解的难度?
2013-8-7 13:40
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
敢问楼主,VTS是什么工具,度娘上没搜到
2013-8-7 14:45
0
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
前来支持~~~
2013-8-7 16:31
0
雪    币: 182
活跃值: (178)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
http://www.virtuous-ten-studio.com/
2013-8-7 21:37
0
雪    币: 182
活跃值: (178)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
主要还是为了防dalvik静态分析。说到加壳4.0以后可以使用openDexFile方便内存加载了
2013-8-7 21:47
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
好帖!
Arm上的SMC啊。
收藏!
2013-8-10 14:29
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
再请教一下楼主,android下有没有通用的注入so文件的方法?
2013-8-10 14:31
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
memcpy函数那一块有没有细致分的啊?没有造成溢出吗?
2014-10-3 10:17
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
新人学习一下
2014-10-6 00:08
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习
2014-10-8 20:12
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主 关于那个findMagic函数  那个开始地址是怎么获取的啊 而且好像是每一页只比较第0x28个字节是不是“dex\n035” 这样搜索真的可以么 看了一下 dex还真是这么在内存中映射的   还请楼主赐教啊
2015-5-7 15:37
0
雪    币: 6303
活跃值: (2051)
能力值: ( LV7,RANK:150 )
在线值:
发帖
回帖
粉丝
17
你好,有个问题想请教一下。

目前我在进行dalvik的插桩,但是apk的每个method对于使用的寄存器数有限制,有的限制在v0 ~v15之间,有的是v0 ~v 255.  这个设置感觉跟编译出来的结果有关,
但是我经常会需要加入比较多的 寄存器, 遇到限制在 v0 ~ v15 之间的限制,就没有办法了, 会重编译出现错误。   
不知道xbalien兄有没有比较好的建议或者方案,谢谢!
2015-5-8 10:18
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
请教楼主,找到了动态加载的那段数据之后,是怎么分析那段数据的
2015-10-13 16:40
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
search 的开始地址是怎么来的。
SUB     SP, SP, #0xC
.text:00001278                 LDR     R0, [SP,#0x10+arg_1C]
.text:0000127A                 STR     R1, [SP,#0x10+var_C]
.text:0000127C                 BL      search
2016-3-6 11:33
0
雪    币: 409
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
先mark一下,等待更好的方法!!!
2016-3-16 09:40
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
22
哇塞谢谢分享,之前看jack jia 大神的文章就提到这个了可惜找到的demo无法运行,去掉了伪加密还是不能运行,谢谢分享,再这里居然找到
2016-5-20 22:37
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
哇哈哈谢谢分享,这个用来对加密有帮助,用来隐藏掉system.load函数再好不过了。嘿嘿
2016-5-20 22:41
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
大哥啊求你的自动篡改dalvik的源码啊!!
2016-5-23 11:32
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
大哥,你回复错了吧?我不是楼主
2016-6-30 14:26
0
游客
登录 | 注册 方可回帖
返回
//