首页
社区
课程
招聘
[原创]基于Smali即时编译的DEX静态补丁技术实现
发表于: 2023-7-20 16:16 20764

[原创]基于Smali即时编译的DEX静态补丁技术实现

gjden 活跃值
14
2023-7-20 16:16
20764


 

 时常有人建议实现一个能对APK进行修改和重打包的功能,其实可以实现重打包的工具不少,想来也是多此一举,因此长时间没有搭理。直到前一段时间,有小伙伴反馈重打包某APP,始终失败,几乎放弃,原因是DEX中出现了很多非法花指令,他解包时所有的DEX都需要反编译,由于非法指令太多,回编译后的APK始终无法正常使用。随着字节码指令级的对抗升级,这种问题或许会越来越普遍。针对这种问题,最终极的解决方法就是不反编译,直接给DEX文件中的指令打补丁,但其中牵扯到指令格式、局部寄存器、各种索引问题需要解决,并非易事。因此为了实现这种解决方法,便有了本文,这种技术我称为“smali即时编译静态补丁技术”:无需采用传统反编译手段对整个APK进行反编译后做代码修改工作,仅仅针对某一条或多条smali指令进行修改并将修改指令直接patch到DEX文件中,也不需要对所有代码做二次编译。


Contribution:

实现全新轻量级smali编译器LiteSmali

指令语法提示器

花指令清除器

广谱匹配的花指令全局识别器


下载地址:


github.com


GDA主页-亚洲首款现代交互式Android反编译器


演示:


1、修改DEX文件中的字符串

 

2、 修改跳转指令吐出Flag:



为了实现APK的插桩和修改,通常做法是使用backsmali工具将目标DEX/APK反汇编成为smali代码文件,然后搜索要修改的文件并对感兴趣的smali代码进行修改,完成代码修改后再通过smali工具将其编译回去(其他集成这些核心工具的软件底层原理也类似)。我们知道一款商业化的APP,其内部可能包含着上万个类以及上千万级的字节码指令,这里面存在着各种对抗的可能性,这些对抗手段极容易导致类似于apktool/backsmali/smali工具在工作过程中出现错误。尤其在处理一些被加固保护过的APP,或者被混淆或者采用了各种对抗手段的APP时,错误率会显著提高,哪怕只要有一个小段代码处理不当,或者某一个需要反编译的文件(DEX文件/XML文件/资源文件)无法正常反编译,就会导致整个插桩或patch过程失败。

因此,实现一种直接对DEX文件打补丁的技术能够很好简化整个过程,避免这类情况的出现。直接补丁技术可以完全脱离一系列工具链的依赖,同时也不需要反编译和编译整个APK文件及其内部文件(包括XML文件、资源文件、DEX文件等等),节省了系统开销、简化了patch过程、避免了不可期的错误。

本文旨在介绍新版GDA反编译器中引入的一种可以直接对DEX文件进行smali代码级patch的技术,并通过一些简单的例子来分享其使用方法。即使你不熟悉smali也能够方便的自定义自己的代码,并通过简单的操作就能够将所有修改内容方便地回写到APK文件中,并自动实现APK的签名和安装。你可以一边修改代码,一边查看执行结果。



注意: 由于修改后APK需要签名,因此我不得不引入apksinger.jar,所以需要你系统中有java环境,如果GDA自带的签名工具签名失败,你可以用自己的签名工具对未签名成功的APK进行签名。

 

         我们这里谈及的DEX Patch实际上指的是对类的方法代码进行修改,直接对字节码做修改并不是我们期望的目标,因此这里实现的要求是对任意位置的二进制数据实现smali输入、smali编译和字节码生成,最后将生成的字节码回写到dex文件中。

 

                                                                                                    

 

原理其实很简单,这整个过程最核心最难的部分就是smali编译器,常规smali编译器其实并不满足我的需求:一则类似于smali这样开源编译器(准确说叫汇编器)大而复杂;我这里是需要严重依赖DEX文件来生成字节码,其中class descriptor, method index, field index, string index这些都需要从DEX文件中去提取;三则是smali编译器很难去完成独立于上下文的单个smali编译的工作。因此再造轮子长远来看更划算,而且通过c++实现能够能够更好的和GDA的GUI交互,效率更高也更容易维护。于是,一个可逐条编译且上下文无关的smali编译器诞生了,这是一个非常轻量级的smali编译器,没有庞大的词法/语法器。我将其命名为LiteSmali。

当然,有了LiteSmali还远远不够,要做好与GDA反编译器之间的交互以及与Android设备交互,还需要做大量的工作比如smali指令实时提示、批量编译、DEX回写、校验签名以及APK安装。为了延续GDA原有的代码编辑,单个指令编辑依然放到smali文本框中实现,当然也提供批量smali代码的输入,并且实现从指令修改到APK安装的一站式操作,简化了代码patch到代码执行的过程。整个patch和运行的过程不需要任何第三方工具介入。GDA的liteSmali支持的交互操作如下:


1)       Smali指令自动提示:支持所有smali指令的实时格式提示(包括指令、操作码、寄存器)

2)       对象自动提示:根据你的输入,程序从当前dex空间中搜索可用的对象给你使用,其中包括string, class/type, method,field.

3)       一键patch: 通过回车键实时将smali代码patch回代码中

4)       字符串patch:可以对dex中的字符串进行修改

5)       DEX自动校验:修改完后,自动更新DEX文件的signature和checksum。

6)       回写DEX到APK并自动签名:一键实现将已修改的DEX文件回写到APK文件中,通过GDA自带的证书文件或自定义的证书对APK文件进行签名。

 



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

最后于 2023-7-20 18:34 被gjden编辑 ,原因:
上传的附件:
收藏
免费 19
支持
分享
最新回复 (41)
雪    币: 2002
活跃值: (607)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
G神太牛逼了!!!!!!
2023-7-20 16:27
3
雪    币: 1526
活跃值: (1583)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
牛的
2023-7-20 16:36
1
雪    币: 2536
活跃值: (4368)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
2023-7-20 16:37
1
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
5

今年是我写GDA反编译器的第10个年头,纪念以下,同时感谢看雪的小伙伴们,我与你们同在,哈哈。





一直都有人问我写这个赚不赚钱,说实话没钱挣,但是传播广了说不定会遇到有这样的运气,同时感谢西班牙土豪的捐赠。此前截图放错成了一张订单截图。




最后于 2023-7-21 16:38 被gjden编辑 ,原因: 不宜展示
2023-7-20 17:14
4
雪    币: 447
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
gjden 今年是我写GDA反编译器的第10个年头,纪念以下,同时感谢看雪的小伙伴们,我与你们同在,哈哈。一直都有人问我写这个赚不赚钱,说实话没钱挣,但是传播广了说不定会遇到有这样的运气,同时感谢西班牙土豪的捐赠 ...
牛牛牛,这是15万刀,值了。
2023-7-20 17:16
1
雪    币: 859
活跃值: (910)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
kanxue666 牛牛牛,这是15万刀,值了。
明明是150w刀
2023-7-20 19:11
1
雪    币: 447
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
TrumpWY 明明是150w刀
哥们儿,仔细看看,是不是多看了几个0
2023-7-20 19:50
2
雪    币: 2216
活跃值: (6558)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
9
6666,我顶我顶
2023-7-20 21:19
1
雪    币: 47147
活跃值: (20310)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
10
这个工具太强大了!
2023-7-20 22:00
5
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
11
kanxue 这个工具太强大了!
2023-7-20 22:10
1
雪    币: 249
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
G神太强了!
2023-7-20 22:19
1
雪    币: 249
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
kanxue666 牛牛牛,这是15万刀,值了。
G神的10年,值个毛线,至少加两个0,才符合G神的身份
2023-7-20 22:25
0
雪    币: 2787
活跃值: (30801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
tql
2023-7-21 10:14
1
雪    币: 447
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
hackevil G神的10年,值个毛线,至少加两个0,才符合G神的身份[em_19]
这也要杠一下
2023-7-21 11:13
0
雪    币: 6573
活跃值: (3858)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
16
tql
2023-7-21 19:21
0
雪    币: 4400
活跃值: (6621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
gda作者,6666
2023-7-21 21:35
0
雪    币: 1076
活跃值: (4162)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
18
tql
2023-7-22 07:46
0
雪    币: 3110
活跃值: (5101)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
19
确实牛
2023-7-22 09:58
0
雪    币: 3165
活跃值: (1741)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
tql
2023-7-22 10:52
0
雪    币: 369
活跃值: (2598)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
tql
2023-7-22 11:29
0
雪    币: 3287
活跃值: (750)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
tql
2023-7-22 20:29
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
支持大佬
2023-7-22 23:47
0
雪    币: 530
活跃值: (965)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢分享
2023-7-23 13:53
0
雪    币: 193
活跃值: (2431)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
作者牛逼,支持下
2023-7-23 15:14
0
游客
登录 | 注册 方可回帖
返回
//