吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2983|回复: 37
收起左侧

[Android 原创] 【实战分析】某软件去除包名校验

[复制链接]
怜渠客 发表于 2022-11-22 14:15
最近很忙,所以很久没发帖子了,找到合适的教程App也很难。
我几个月前在吾爱破解发的帖子,前几天,有人回复,问能不能发个去除包名校验的帖子。
于是就把他求助的App拿来,做一篇教程。
屏幕截图 2022-11-22 140706.jpg
所用工具:
    1.MT管理器
    2.LogCat
    3.IDA Pro

一、分析位置
屏幕截图 2022-11-22 140810.jpg
先重签名安装,并没有闪退,排除签名校验。
用MT管理器的共存功能给软件共存,打开闪退。

打开LogReader,看看闪退日志堆栈信息。

屏幕截图 2022-11-22 134933.jpg
[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
可以发现,是抛出异常引起的闪退。
先试着把这个抛异常的方法注释掉,即smali开头添加“return-void”。
屏幕截图 2022-11-22 135149.jpg
再次打开共存包,这次并未闪退,而是无法获取数据


三、MT日志注入打印

既然是数据请求错误,怀疑如下:
1.数据请求包有个参数,其value为包名,不符合服务器设定不返回数据。
2.本地验证包名,不符合则不请求
3.本地验证包名,不符合则发送数据包的某参数错误或缺失(如常见的sign)

使用MT的日志注入,打印一下字符串,看看有没有提示。
我这里打印的是“q5.c$g.intercept”方法内的字符串。
为什么是这个方法?看闪退堆栈信息,
屏幕截图 2022-11-22 135211.jpg
该方法之后调用的函数,分析后发现全是调用函数,没有实际意义。分析该函数,发现有很多可以的字符串调用,而且是native代码调用。
屏幕截图 2022-11-22 135246.jpg 屏幕截图 2022-11-22 135327.jpg

怎么看都像是关键处。。

打印结果如下:
屏幕截图 2022-11-22 135413.jpg

四、实战修改

已经很明显了,包名验证的关键就在fooLib库中。
打开IDA,加载libfooLib.so库
我们要找的函数是“Lcom/wb/jnilibrary/FooTools;->method04()Ljava/lang/String;”,但是并没有Java_com_wb_Xxxx这个函数名。可知为动态注册。

一看已有方法名,很明显,method4。。
屏幕截图 2022-11-22 135812.jpg

屏幕截图 2022-11-22 135627.jpg
F5转个C,很明显,type=0,则返回字符串,byte_124D2就是“请不要盗用APP”,所以让type为1。

跟进函数ooo0OO0o(JNIenv*);
继续跟进。
屏幕截图 2022-11-22 135919.jpg

由上面的分析可知,比较了packagename和一个字符串,所以我们通过修改汇编逻辑,让返回值不是0即可。
屏幕截图 2022-11-22 140039.jpg
由流程图分析,黄色区域是可以走的,不能走到红色区域,将跳转NOP
屏幕截图 2022-11-22 135551.jpg
保存,打开。

屏幕截图 2022-11-22 135506.jpg

没有闪退,没有请求数据失败。
成功。

免费评分

参与人数 17威望 +1 吾爱币 +34 热心值 +16 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
junjia215 + 1 + 1 谢谢@Thanks!
baobaobasi + 1 + 1 感谢带佬
PonyFor + 1 我很赞同!
allophus + 1 + 1 谢谢@Thanks!
a2604273891 + 1 热心回复!
芽衣 + 1 + 1 用心讨论,共获提升!
q3239006 + 1 + 1 热心回复!
Sucho + 1 谢谢@Thanks!
孺子韫 + 1 + 1 热心回复!
huskysir13 + 1 + 1 谢谢@Thanks!
lingyun011 + 1 + 1 热心回复!
hk9186 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
woyucheng + 1 + 1 谢谢@Thanks!
QQ12349qq + 1 + 1 谢谢@Thanks!
s757129 + 1 + 1 ggnb!
正己 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 怜渠客 发表于 2022-11-22 17:02
青草幽幽在高原 发表于 2022-11-22 14:46
这个APP加载的so文件,没有任何的校验作用,全部都是不传参,直接返回一个字符串,
说明返回都是固定的 ...

首先,这是动态注册的,换成Java函数闪退;
其次,我没具体分析过返回值,里面获取了context,可不一定是固定的
青草幽幽在高原 发表于 2022-11-22 17:48
lianquke 发表于 2022-11-22 17:02
首先,这是动态注册的,换成Java函数闪退;
其次,我没具体分析过返回值,里面获取了context,可不一定 ...

这个东西应该跟怎么注册的没关系吧。不传参返回的基本是固定的
phxi 发表于 2022-11-22 14:41
青草幽幽在高原 发表于 2022-11-22 14:46
Snipaste_2022-11-22_14-44-43.png
这个APP加载的so文件,没有任何的校验作用,全部都是不传参,直接返回一个字符串,
说明返回都是固定的,直接转换成Java函数,固定返回就可以了去除so的加载了。
s757129 发表于 2022-11-22 15:19
已学废,感谢giegie,ggnb!
QQ12349qq 发表于 2022-11-22 15:24

学到了 赞赞赞
lhp462 发表于 2022-11-22 15:26
学习到了,现在混淆的程序越来越多了,若没有一点字符串提示,定位关键点太难了
dofu05jj7uu 发表于 2022-11-22 15:30
大佬牛批,学习了。
ewz2298621 发表于 2022-11-22 15:58
第一次接触感觉挺新鲜的
xtszdjack 发表于 2022-11-22 16:09
向大佬学习啊,虽然不是很懂
ZhuanZhuYuIT 发表于 2022-11-22 16:10
膜拜大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-6 17:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表