我几个月前在吾爱破解发的帖子,前几天,有人回复,问能不能发个去除包名校验的帖子。
于是就把他求助的App拿来,做一篇教程。
屏幕截图 2022-11-22 140706.jpg (78.45 KB, 下载次数: 0)
下载附件
2022-11-22 14:07 上传
所用工具:
1.MT管理器
2.LogCat
3.IDA Pro
一、分析位置
屏幕截图 2022-11-22 140810.jpg (87.21 KB, 下载次数: 0)
下载附件
2022-11-22 14:08 上传
先重签名安装,并没有闪退,排除签名校验。
用MT管理器的共存功能给软件共存,打开闪退。
打开LogReader,看看闪退日志堆栈信息。
屏幕截图 2022-11-22 134933.jpg (107.44 KB, 下载次数: 0)
下载附件
2022-11-22 14:08 上传
[C] 纯文本查看 复制代码FATAL EXCEPTION: nf.c0 Dispatcher
Process: com.everyday.collectioo, PID: 14749
java.lang.IllegalArgumentException: Unexpected char 0x8bf7 at 0 in appId value: 请不要盗用App
at nf.v$b.g(Headers.kt:4)
at nf.v$b.d(Headers.kt:1)
at nf.v$a.b(Headers.kt:2)
at nf.e0$a.a(Request.kt:1)
at q5.c$g.intercept(OkHttpClient.kt:8)
at vf.g.d(RealInterceptorChain.kt:12)
at tf.e.r(RealCall.kt:16)
at tf.e$a.run(RealCall.kt:6)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
二、分析代码
首先定位到最后发生错误的地方
即方法“nf.v$b.g”
QQ图片20221122135113.jpg (186.66 KB, 下载次数: 0)
下载附件
2022-11-22 14:10 上传
可以发现,是抛出异常引起的闪退。
先试着把这个抛异常的方法注释掉,即smali开头添加“return-void”。
屏幕截图 2022-11-22 135149.jpg (30.73 KB, 下载次数: 0)
下载附件
2022-11-22 14:10 上传
再次打开共存包,这次并未闪退,而是无法获取数据
三、MT日志注入打印
既然是数据请求错误,怀疑如下:
1.数据请求包有个参数,其value为包名,不符合服务器设定不返回数据。
2.本地验证包名,不符合则不请求
3.本地验证包名,不符合则发送数据包的某参数错误或缺失(如常见的sign)
使用MT的日志注入,打印一下字符串,看看有没有提示。
我这里打印的是“q5.c$g.intercept”方法内的字符串。
为什么是这个方法?看闪退堆栈信息,
屏幕截图 2022-11-22 135211.jpg (105.54 KB, 下载次数: 0)
下载附件
2022-11-22 14:11 上传
该方法之后调用的函数,分析后发现全是调用函数,没有实际意义。分析该函数,发现有很多可以的字符串调用,而且是native代码调用。
屏幕截图 2022-11-22 135246.jpg (93.06 KB, 下载次数: 0)
下载附件
2022-11-22 14:11 上传
屏幕截图 2022-11-22 135327.jpg (140.91 KB, 下载次数: 0)
下载附件
2022-11-22 14:11 上传
怎么看都像是关键处。。
打印结果如下:
屏幕截图 2022-11-22 135413.jpg (94.62 KB, 下载次数: 0)
下载附件
2022-11-22 14:12 上传
四、实战修改
已经很明显了,包名验证的关键就在fooLib库中。
打开IDA,加载libfooLib.so库
我们要找的函数是“Lcom/wb/jnilibrary/FooTools;->method04()Ljava/lang/String;”,但是并没有Java_com_wb_Xxxx这个函数名。可知为动态注册。
一看已有方法名,很明显,method4。。
屏幕截图 2022-11-22 135812.jpg (244.65 KB, 下载次数: 0)
下载附件
2022-11-22 14:12 上传
屏幕截图 2022-11-22 135627.jpg (96.07 KB, 下载次数: 0)
下载附件
2022-11-22 14:13 上传
F5转个C,很明显,type=0,则返回字符串,byte_124D2就是“请不要盗用APP”,所以让type为1。
跟进函数ooo0OO0o(JNIenv*);
继续跟进。
屏幕截图 2022-11-22 135919.jpg (140.16 KB, 下载次数: 0)
下载附件
2022-11-22 14:13 上传
由上面的分析可知,比较了packagename和一个字符串,所以我们通过修改汇编逻辑,让返回值不是0即可。
屏幕截图 2022-11-22 140039.jpg (229.33 KB, 下载次数: 0)
下载附件
2022-11-22 14:13 上传
由流程图分析,黄色区域是可以走的,不能走到红色区域,将跳转NOP
屏幕截图 2022-11-22 135551.jpg (160.65 KB, 下载次数: 0)
下载附件
2022-11-22 14:14 上传
保存,打开。
屏幕截图 2022-11-22 135506.jpg (159.86 KB, 下载次数: 0)
下载附件
2022-11-22 14:14 上传
没有闪退,没有请求数据失败。
成功。