首页
论坛
课程
招聘
[原创]怎样制作一个防止重打包的APK【反脱壳反HOOK】
2021-12-2 11:27 19758

[原创]怎样制作一个防止重打包的APK【反脱壳反HOOK】

2021-12-2 11:27
19758

本文讨论的重打包,是指“破解版”,运行环境受(普通用户的手机)限制,毕竟你不能要求用户魔改刷机root才能使用“破解版”。另:没有永远的安全,全看cracker的水平有多高。

APK需要被重打包,势必是为了修改其中的代码,可能是dex,可能是so,可能是dll(unity3d),也可能是某个脚本等等,重打包后签名(未泄露)就会被改变。
不管怎样,可以确定的是签名和其中的某些文件会被修改。

 

那么防止重打包的主要目标就是检测这些修改。

 

【想看作者的方法可以直接跳到文章末尾】

 

在保护之前,先来说说cracker可能会干的几件事:
1.爆破。直接修改代码,常见于纯java编写的或者简单的so校验。
2.脱壳。如果方法1不行,那可能是APK被加固了,所以可以考虑脱壳后再修改。局限性很大,困为很多壳脱出来没法直接打包运行。但是脱壳可以了解程序逻辑,为方法3做准备。
3.内存补丁。如果方法2不行,那就不脱壳了,根据程序逻辑,可以直接加载自己编写的so打内存补丁跳过检测。
4.hook,这可能是最近几年用得最多的方案了。上面所有方法试了不行(或者懒得试了),就要走上hook这条路了。

 

针对以上,可以做的事:
1.针对爆破。这没啥好说的,把校验写进so,复杂一点,花里胡哨一点,再弄个ollvm,或者加个壳。
2.针对脱壳。上文就说了,很多壳脱出来直接打包是不行的,也有些壳是脱不了的,比如java转c(保护java代码),vmp(保护so),加壳之后原指令彻底消失不见,也就不存在脱壳的说法了。
3.针对内存补丁。这个方法其实很冷门,因为内存补丁对逆向要求较高,有能力读懂ollvm和加壳后的so的逻辑的,基本很难阻止他做事了。
4.针对hook:
做为最热门的方法,有必要单独拎出来多说几句。
a)检测hook。方法太多了,各种hook都有或多或少的特征,要注意的是,会有诸如《通过hook绕过hook检测》之类的文章……今天你hook我,明天我检测你,后天你跳过我的检测,大后天我检测你跳过我的检测……对抗永无止境。
b)不被hook。怎样不被hook?自己写函数。用java代码来举个例子,有一个bytes数据要计算它的md5,最简单的MessageDigest.getInstance("MD5").digest就完事了,如果调用了公共库,那么就容易被hook住,然后就bytes数据暴露了,计算结果也被修改了。所以多用原生类型自己写函数吧。

 

看了这么多文字,仿佛啥也没明白,没关系,下面说一下我做的事:
1.使用svc指令读取文件。能读取到真实的APK,就能检测APK的完整性。能读取到真实的maps就能检测到各种hook框架的特征。能读取到真实的/proc/下的各种文件,就能检测各种调试器,各种cracker留下的痕迹。
2.保护svc指令。svc指令只能通过inlinehook修改内存实现(内核hook不在本文讨论范围内,本文开头就说明了)。如果cracker在搜索内存时,没有搜索到svc指令,那么我们执行代码时,就不会被hook住。
=== 下面才是真正做的事 ===
1.对某些关键的逻辑(如果逻辑是用java写的,可以先套java转C壳)加一个壳。
2.这个壳的静态代码中不存在任何svc特征,一旦加载so,先进行完整性校验,当校验需要读取APK时,释放svc代码执行读取操作,这样在内存搜索不到svc,也就无法被hook。如果要校验maps中是否有hook框架也在这里进行。
3.当校验通过,再执行真正的程序逻辑,并且此时原程序逻辑的so是碎片化的(就像java的指令抽取),此时从内存dump出来的so也是不完整的,所以无法脱壳出原so。
以上,实现了防爆破(加壳无法修改),防脱壳(so分解了,无法脱壳),防hook(svc即插即用,无法hook,除非改内核)。
然后,就只有内存补丁一条路了,再想想魔改的ollvm规则,算了。

 

按照我的规则新制造了这个CrackMe(附件或网盘):
链接: https://pan.baidu.com/s/1nugHGQpuQsl-9sDTt4gIvA 提取码: 6qwh


【公告】 讲师招募 | 全新“预付费”模式,不想来试试吗?

最后于 2021-12-2 18:37 被血舞长空编辑 ,原因:
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (17)
雪    币: 11152
活跃值: 活跃值 (10225)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
随风而行aa 活跃值 8 2021-12-2 11:32
2
0
不错不错
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2021-12-2 17:13
3
0
我很疑惑 为什么要全部修改一下 一般而言 能修改其中一个就能做很多事了 甚至一个都不用修改 仅仅替换so重打包就足够了
雪    币: 880
活跃值: 活跃值 (994)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
血舞长空 活跃值 2021-12-2 18:40
4
0
万里星河 我很疑惑 为什么要全部修改一下 一般而言 能修改其中一个就能做很多事了 甚至一个都不用修改 仅仅替换so重打包就足够了
那只是放宽了解题方案……可以看看刚刚上传的附件,严格模式,保护那3个文件修改任何一个都不行。
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-6 15:12
5
0
app 好像安装不了,可以给我安装的app嘛
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-6 15:12
6
0
app 好像安装不了,可以给我安装的app嘛
雪    币: 967
活跃值: 活跃值 (1719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小黄鸭爱学习 活跃值 2021-12-6 16:11
7
0
珍惜Any app 好像安装不了,可以给我安装的app嘛
可以安装 我是魅族8.1 flyme7.0 
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-6 16:15
8
0
小黄鸭爱学习 可以安装 我是魅族8.1 flyme7.0
android 11不行 他这个资源文件没有四字节对齐,我在低版本试一下吧 
雪    币: 967
活跃值: 活跃值 (1719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小黄鸭爱学习 活跃值 2021-12-6 16:33
9
0
珍惜Any app 好像安装不了,可以给我安装的app嘛


最后于 2021-12-6 16:33 被小黄鸭爱学习编辑 ,原因: 回错人
雪    币: 967
活跃值: 活跃值 (1719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小黄鸭爱学习 活跃值 2021-12-6 16:34
10
0
你的 
Toast.makeText(this, "签名不对哟~", 0) 没有show() 

我测了一会才发现没有弹窗提示
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-6 20:34
11
0

我本来想ptrace把你的svc改掉,但是发现了你自己在so里面会ptrace自己


我这边hook了一下 ptrace函数阻止了一下

然后你那个app就卡死了,不知道啥地方出的问题,app不支持android 11运行,楼主有时间可以,生成个app在android11上跑的。

点击按钮弹出来签名是否正确 可以做个对抗。

雪    币: 880
活跃值: 活跃值 (994)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
血舞长空 活跃值 2021-12-7 08:58
12
0
小黄鸭爱学习 你的 Toast.makeText(this, "签名不对哟~", 0) 没有show() 我测了一会才发现没有弹窗提示
呃呃,被你发现bug了~~
雪    币: 880
活跃值: 活跃值 (994)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
血舞长空 活跃值 2021-12-7 09:04
13
0
珍惜Any 我本来想ptrace把你的svc改掉,但是发现了你自己在so里面会ptrace自己我这边hook了一下 ptrace函数阻止了一下然后你那个app就卡死了,不知道啥地方出的问题,app不支持andro ...
APK是4字节对齐的哦,zipalign -c -v 4 sotest_all.apk检查过的:
      49 AndroidManifest.xml (OK - compressed)
     665 classes.dex (OK - compressed)
    3042 lib/arm64-v8a/libsotest.so (OK - compressed)
  201942 lib/armeabi-v7a/libsotest.so (OK - compressed)
  399572 META-INF/com/android/build/gradle/app-metadata.properties (OK)
  399671 resources.arsc (OK - compressed)
  400073 res/R5.xml (OK - compressed)
  400567 res/Rw.png (OK - compressed)
  417112 res/wI.png (OK - compressed)
  426665 META-INF/YWT_TEST.SF (OK - compressed)
  427320 META-INF/YWT_TEST.RSA (OK - compressed)
  427985 META-INF/MANIFEST.MF (OK - compressed)
Verification succesful

然后,确实是有ptrace检测。
再然后,卡死是因为触发了保护……检测到了异常就会卡死,会检测调试,也会检测APK是否被修改
android 11 我没有这么高版本的手机。。能发个安装不了的提示看看吗?可以出个包玩玩
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-7 10:38
14
0
血舞长空 APK是4字节对齐的哦,zipalign -c -v 4 sotest_all.apk检查过的: 49 AndroidManifest.xml (OK - compressed) ...
主要并没有什么打印log,不知道什么地方死掉了,你那边有时间可以给我个带个可以打印日志的包。我现在点击按钮就直接没反应 。应该是执行完ptrace之后读取了status文件以后就没反应了
雪    币: 880
活跃值: 活跃值 (994)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
血舞长空 活跃值 2021-12-7 11:10
15
0
珍惜Any 主要并没有什么打印log,不知道什么地方死掉了,你那边有时间可以给我个带个可以打印日志的包。我现在点击按钮就直接没反应 。应该是执行完ptrace之后读取了status文件以后就没反应了
我刚刚试了vivo y31 android 11,可以正常运行哦。你是有改过什么东西吗?
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-7 13:57
16
0
血舞长空 我刚刚试了vivo y31 android 11,可以正常运行哦。你是有改过什么东西吗?
没改啥,就是app安装不上 adb install 
雪    币: 983
活跃值: 活跃值 (4261)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2021-12-7 14:01
17
0
血舞长空 我刚刚试了vivo y31 android 11,可以正常运行哦。你是有改过什么东西吗?
加个联系方式吧,我私信你了。
雪    币: 29
活跃值: 活跃值 (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是红领巾 活跃值 2021-12-13 15:55
18
0
释放SVC指令指的是shellcode方式么?
游客
登录 | 注册 方可回帖
返回