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

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

2021-12-2 11:27
25235

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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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


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

我测了一会才发现没有弹窗提示
2021-12-6 16:34
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
11

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


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

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

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

2021-12-6 20:34
0
雪    币: 902
活跃值: (1120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
小黄鸭爱学习 你的 Toast.makeText(this, "签名不对哟~", 0) 没有show() 我测了一会才发现没有弹窗提示
呃呃,被你发现bug了~~
2021-12-7 08:58
0
雪    币: 902
活跃值: (1120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
珍惜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 我没有这么高版本的手机。。能发个安装不了的提示看看吗?可以出个包玩玩
2021-12-7 09:04
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
14
血舞长空 APK是4字节对齐的哦,zipalign -c -v 4 sotest_all.apk检查过的: 49 AndroidManifest.xml (OK - compressed) ...
主要并没有什么打印log,不知道什么地方死掉了,你那边有时间可以给我个带个可以打印日志的包。我现在点击按钮就直接没反应 。应该是执行完ptrace之后读取了status文件以后就没反应了
2021-12-7 10:38
0
雪    币: 902
活跃值: (1120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
珍惜Any 主要并没有什么打印log,不知道什么地方死掉了,你那边有时间可以给我个带个可以打印日志的包。我现在点击按钮就直接没反应 。应该是执行完ptrace之后读取了status文件以后就没反应了
我刚刚试了vivo y31 android 11,可以正常运行哦。你是有改过什么东西吗?
2021-12-7 11:10
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
16
血舞长空 我刚刚试了vivo y31 android 11,可以正常运行哦。你是有改过什么东西吗?
没改啥,就是app安装不上 adb install 
2021-12-7 13:57
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
17
血舞长空 我刚刚试了vivo y31 android 11,可以正常运行哦。你是有改过什么东西吗?
加个联系方式吧,我私信你了。
2021-12-7 14:01
0
雪    币: 110
活跃值: (1565)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
释放SVC指令指的是shellcode方式么?
2021-12-13 15:55
0
游客
登录 | 注册 方可回帖
返回
//