首页
社区
课程
招聘
[原创]某当网apk加固脱个so
2022-10-25 14:13 20206

[原创]某当网apk加固脱个so

2022-10-25 14:13
20206

背景

手生很久,纯粹为了练习,脱一下so而已
另外:顺便看看上海的工作机会,有老板认为合适的,可以私我

1
2
3
4
5
6
7
8
9
10
1040882146@qq.com
语言: java/c
7年framework经验: 不管任何项目,都是直接或者间接要对framework层进行调试,源码阅读分析
1.擅长android系统framework以及三方app等兼容性问题的分析
2.擅长安卓虚拟化技术,比如双开工具,有VMOS虚拟机的研发经验
3.熟悉AMS, Input模块
4.擅长hook点分析,解决业务痛点
5.移植linker实现GOT表hook(私人仓库)
6.有逆向/调试经验, 会用jeb/IDA工具
7.做过几款游戏的安全分析

下图是IDA打开的情况,可以看到JNI_OnLoad被加密了

还有其他的函数,基本都是加密的状态

 

整个segment给加密了,解密的地方肯定是init_array中的某个地方解密的,简单起见,这里不跟踪解密的流程了。

经验上对getPackageInfo下断点

不用怀疑getPackageInfo这个点,也不要去想我为啥在这里下断点,也可能是经验之谈吧

1
2
3
4
if (TextUtils.equals(calledMethod.getName(),"getPackageInfo")) {
    Debug.waitForDebugger();
    Log.d("whulzz", "getPackageInfo called");
}

下断点后的调用栈是这样的

 

这个调用栈很明显,getPackageInfo是被nativeLoad函数调过来的,也就是libDexHelper.so通过jni调用的

断点断下来,然后用IDA挂住进程,开始把so从内存dump出来

内存大小 74d1220000 - 74d10cf000 = 0x151000

 

 

执行脚本,就可以脱出来解密的内存了

用IDA打开,发现有点问题

 

 

Elf Header以及program header是正常的

dynamic节区不正常

 

dynamic节肯定是在so被Load完成后,被梆梆置为0了,memset(dynamic, 0, size)

因为静态so库的节肯定是正常的,不正常就无法加载so了,所以我手动将apk中的so库打开,将其dynamic节的数据拷贝了过去

这个是apk中so的dynamic节

拷贝到dump.so后,dump.so重新加载到IDA中,JNI_OnLoad等均已解密

JNI_OnLoad解密后

fileExists函数解密后


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2022-11-29 11:34 被whulzz编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (16)
雪    币: 42
活跃值: (3509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
New对象处 2022-10-25 19:14
2
0
大佬,怎么将dynamic节 覆盖dump 出来的so哇,是用010 复制 覆盖整个dynamic节吗,需要改头部一些偏移不
雪    币: 548
活跃值: (2367)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
whulzz 1 2022-10-26 08:47
3
0
New对象处 大佬,怎么将dynamic节 覆盖dump 出来的so哇,是用010 复制 覆盖整个dynamic节吗,需要改头部一些偏移不
直接拷贝就行了,有其他问题再修呗
雪    币: 4089
活跃值: (8230)
能力值: ( LV9,RANK:181 )
在线值:
发帖
回帖
粉丝
nevinhappy 2 2022-10-26 09:05
4
0
就这一下子,10年功力有没有!!!
雪    币: 548
活跃值: (2367)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
whulzz 1 2022-10-26 11:49
5
0
nevinhappy 就这一下子,10年功力有没有!!!
希望谅解,文档写的太深可能对于很多人消化不了。只希望能真正帮助到有需求的人
雪    币: 230
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_undcejfq 2022-10-28 10:53
6
0
大佬.有个百度加固的app.想脱壳,frida附加不上去.其它普通app就没有问题.可能是有反调试之类的.可以加好友请教一下吗?
雪    币: 1
活跃值: (945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 2023-1-18 16:15
7
0
if (TextUtils.equals(calledMethod.getName(),"getPackageInfo")) {
    Debug.waitForDebugger();
    Log.d("whulzz", "getPackageInfo called");
}

这段是代码能详细说下吗,看起来是主动等待调试器来附加,这是hook了某个函数么
雪    币: 548
活跃值: (2367)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
whulzz 1 2023-1-18 20:50
8
0
wx_阿达西 if (TextUtils.equals(calledMethod.getName(),"getPackageInfo")) { Debug.waitForDebugge ...
是的,hook了getPackageInfo...
雪    币: 3309
活跃值: (2875)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guijingwen 2023-1-18 21:02
9
0
大佬,VMOS有没有开源的实现方案?
雪    币: 199
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_rwmcnzwp 2023-2-3 16:09
10
0

菜鸡请教个问题,这种壳,通过.init_array段的函数解密后的内容是又会替换回加载壳so对应的内存中去,同时修复壳soinfo,所以dump出来的so的格式(程序头/节头等的偏移)就是对的。是这样不? 顺便问下,能提供下样本app版本号吗

最后于 2023-2-3 16:52 被mb_rwmcnzwp编辑 ,原因:
雪    币: 548
活跃值: (2367)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
whulzz 1 2023-2-6 13:03
11
0
mb_rwmcnzwp 菜鸡请教个问题,这种壳,通过.init_array段的函数解密后的内容是又会替换回加载壳so对应的内存中去,同时修复壳soinfo,所以dump出来的so的格式(程序头/节头等的偏移)就是对的。是这样 ...
QQ邮箱私我,单独发你
雪    币: 199
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_rwmcnzwp 2023-2-6 13:54
12
0
whulzz QQ邮箱私我,单独发你

我账号好像无权限发私信,邮箱:xxxx@foxmail.com

最后于 2023-2-13 11:52 被mb_rwmcnzwp编辑 ,原因:
雪    币: 645
活跃值: (3656)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
99JW99 2023-2-7 22:48
13
0
wx_阿达西 if (TextUtils.equals(calledMethod.getName(),"getPackageInfo")) { Debug.waitForDebugge ...
大佬hook了getPackageInfo来查看如何被应用调过来,这就是等待调试器的原因。大佬就知道getPackageInfo是被nativeLoad函数调过来的。
雪    币: 548
活跃值: (2367)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
whulzz 1 2023-2-13 11:51
14
0
mb_rwmcnzwp 我账号好像无权限发私信,邮箱:acmicpc@foxmail.com
请注意查收邮件,大文件在邮箱中有过期时间
雪    币: 199
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_rwmcnzwp 2023-2-13 11:53
15
0
whulzz 请注意查收邮件,大文件在邮箱中有过期时间
收到, 感谢大佬
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_等风来_263 2023-2-17 10:27
16
0
牛叉,现在都开始在so层面搞事情了。不熟悉so没法搞深入了
雪    币: 205
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xtor 2023-2-17 12:46
17
0
梆梆壳可没这么简单!!
游客
登录 | 注册 方可回帖
返回