android 字符串 混淆,某右 so层ollvm字符串混淆

本文详细讲述了如何使用IDA、010Editor等工具对一款apk中的libnet_crypto.so进行逆向分析,针对OLLVM混淆的字符串进行加密解密操作,涉及JNI_onload解析、内存数据恢复和动态调试策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某某apk so层ollvm字符串混淆本次逆向分析用到的工具:adb、ida、010Editor、ddms。

这次主要对某右的libnet_crypto.so分析,主要工作是分析ollvm混淆的字符串被处理加密。

先检测一下设备是否正常

adb devices

96d62028bd97f2be4b41b9f26968fab4.png

然后解压apk文件,提取出lib目录下的libnet_crypto.so文件

79ee2b43a863c10267c73d8b64e63b2a.png

armeabi-v7a对应的是32位的ARM设备,调试使用IDA,不要用IDA64

so文件挺大的,编译需要等待一会,看一下字符串,基本都是混淆加密的

8e755184ddd3808a21e7c14391486e7a.png

接下来,分析一下JNI_onload

先看一下JNI_onload流程,不是很复杂

0e12a59b2d2265c7e7d77438fe17d17e.png

在F5或者空格查看伪代码,代码没什么混淆

560aad4c7c2a1eb602dd5306d50c22cf.png

修改参数,静态分析方法

右键选择set lvar type或y修改参数类型

bece414215ad4eb729cd3c68848251ad.png)

在下面GetEnv处 选择Force call type识别一下类型

5599825a742ea9ea95420e2835b166b8.png

v4是JNIenv * 也修改一下

71de05bdab1c871f7a61e069dc1cc0bf.png)

下面 FindClass和Registernatives也一下,识别一下类型

点进去查看,没有native方法的对应关系,第一个参数是java层native的方法名称,第二个参数是java层native的签名信息,第三个参数才是对应的c\c++的参数

4ba396c464689a580bc5fbae0bdf47fe.png)

根据上面静态分析遇到的问题,接下来的想法是恢复被ollvm加密混淆的字符串信息

打开010Editor,将so文件和elf头文件拖进去

3c555320e5f2addde43a67c17599a2b2.png

主要分析数据区域

第一个是程序头,不是关注的,第二个和第三个是关注重点,第二个是只读的,那么根据so文件对字符串进行加解密可以判断ida编译出的混淆字符串属于第三个区域

dc275339cde02beb0c190089c1f73b01.png

这部分区域是被加密处理的

61407013dde1e13c584454d9ef3496e2.png)

那对于这个so的还原,就需要dump出解密后的数据,将数据复制到原加密数据位置,完成对字符串解密。

dump的位置可能在JNI_onload 、 init 、 init_aray

ida 附加一下进程,看一下so文件是否被加载

先进行一下android端的配置

找到ida的android_server

8c27d773a7bc4cbe9970cbc550c48dd3.png)

将ida的android_server发送到android

5e2e70d9c723ad7caef9af7340576252.png)

执行android_server

转发端口

e2131079abcb892746f2aaa8efed3a53.png)

附加端口,这里先要启动apk

Debugger-> Attach -> Remote ARmlinux\Android debugger

fd69ae5ecd298b89891bbcf206197be5.png)

在Modules发现so文件已经被加载进去了

9a9444383a7ada9501a2bb12d625775f.png)

那么直接搜索dump内存中解密的字符串数据

ctrl+s搜 crypto

a3d0fc222ac9098f0847fc4a3a04ffde.png)

File->script commond

然后输入命令,替换初始地址和结束地址

968256bb52f0af8c042e8f7c77763dba.png)

使用010Editor打开,里面的字符串都是解密的

85f548f32823c57ed8a99808e7cea963.png)

这是加密的数据,可以对比一下,前六行基本是一致的都是地址。最后一行都是00,这里是相对地址

505be52af86a051ab59222c5f7d0a2cb.png)

这个是解密的数据,前六行都是04 这里是绝对地址。

536ba02cc6685762c7eee378a1089b43.png)

复制解密后的数据,到这里为止

bddf01f9d354d68ca723ca28ade63ace.png)

在鼠标放到如图位置,ctrl+v搞定

12020b0fe4cbb12b6ad04f25fd741c9c.png)

看一下修复后的so文件

看一下Findclass,之前混淆的现在已经解密了

ccaef4d52266903ff279f35e981337c5.png)

同样RegisterNatives也是,之前不知道方法的类型和参数,现在都已经解密出来了

1606ae145501fba24dcd53c5e4aa5cf1.png)

总结

这种方法仅适用在内存中解密状态的情况,如果是在使用时解密,解密后在清除,需要使用动态调试。

最后于 2021-3-22 11:16

被ST0n5编辑

,原因: 补图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值