Android 逆向实战|手把手实现RPC+so自动化解决方案

今天来分享一下 RPC + so 的模拟调用方案。

RPC模拟调用

昨天的文章中演示了如何使用 unidbg 来模拟调用 so 中的加密方法,但是 unidbg 模拟调用只能手动运行,今天分享一个可以将 unidbg 转成 RPC 接口的框架。

Github 地址:https://github.com/anjia0532/unidbg-boot-server

首先将项目代码 clone 下来,使用 idea 打开,搭建 jdk8 开发环境,安装好依赖,环境准备工作就结束了。

自动生成代码

打开 test 文件夹的测试代码,可以看到作者已经为我们准备了一些示例。image-20250219211150460

image-20250219211205133

以上代码可以根据输入的内容自动生成 ControllerService 还有其他的代码,不用我们手动一个个的去添加了。

根据我们的需求,先对测试代码进行修改,将 serviceName 变量改成 APP9,执行 AutoGeneratorTest 类的 main 方法,生成代码。

image-20250219211643074

可以看到,左侧的文件树中已经生成对了对应的 ServiceServiceWorkerController 代码。

修改 Controller

首先来修改 Controller 的代码,因为我们调用 so 的时候需要传入两个参数,默认代码是没有参数的,需要添加两个参数。

image-20250219214452855

修改 Service

使用 map 来接收两个参数,别忘了添加 RequestBody 注解,接下来补充 Service 的代码。

image-20250219214858121

image-20250219214609605

Service 的代码基本上和上篇文章的代码一样,按照注释填写包名和模块名即可,其他的无需特别改动,最后填写 do-work 方法的代码:

image-20250219214727167

加载对应的类并且调用对应的静态加密方法即可。别忘了将 apk 放到对应的位置,完成之后 apk 的位置应该在这里:image-20250219214932448

不用解压 apk,unidbg 会自动根据模块名加载 so 文件的。

运行测试

到这里代码就已经修改完成了,运行试一下:

image-20250219215115920

服务就已经正常运行起来了,使用 Python 发送 http 请求试一下能不能拿到 token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time

import requests

page = 1
limit = 10

url = 'https://app9.scrape.center/api/movie'

for a in range(10):
data = {
'offset': (page - 1) * limit,
'limit': limit,
'token': requests.post('http://127.0.0.1:9999/api/app9/do-work',
json={'str1': '/api/movie', 'int1': (page - 1) * limit}).text
}
print(data)
r = requests.get(url, params=data).json()
print(r)
page += 1
time.sleep(1)

image-20250219215313868

可以正常获取到数据,并且框架还支持多线程,如果性能不够的话可以开启多线程支持,并发作者自测框架并发可以达到 4000+,性能还是可以的,当然了这只是 Demo 的数据,要看实际的业务逻辑复杂度。

总结

到这里整个调用流程就结束了,以上就是 RPC+unidbg 的完整使用方法了,感兴趣的小伙伴可以自己测试一下。

本文章首发于个人博客 LLLibra146’s blog

本文作者:LLLibra146

更多文章请关注公众号 (LLLibra146):LLLibra146

版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!

本文链接
https://blog.d77.xyz/archives/96d7b348.html