返回列表 发新帖

【详细分析】新版笔趣阁签名校验分析

  [复制链接]

36

主题

3633

帖子

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2137
好评
101
信誉
192

MT论坛最佳新人考神MT论坛帅哥MT论坛新人MT论坛活跃会员MT论坛侠客

发表于 2022-5-28 19:10:43 | 显示全部楼层 | 阅读模式  来自 湖北武汉
本帖最后由 怜渠客 于 2022-5-28 21:19 编辑
思路比结果重要。

  • 【零】起因
不少人都搞过笔趣阁app,之前的版本(2021年以来)都是一层腾讯御安全,常规脱修后pmshook(mt去签普通版)即可过掉签名验证。
不过新版本(2022年5月),增强了签名校验,使得普通版不再有效。

一天,某耗发了个新版本让我试试。于是,就有了以下的分析。






  • 【一】所用工具


  • mt管理器
  • 任意崩溃日志记录器
  • IDA Pro
  • Android studio
  • 笔趣阁新版本

  • 【二】初探
壳常规脱修。签名,运行。
闪退,看崩溃日志。


日志如下:

  1. FATAL EXCEPTION: main
  2. Process: com.biquge.ebook.app, PID: 3741
  3. java.lang.NoSuchMethodError: no non-static method "Lcom/jni/crypt/project/CryptDesManager;.<init>(Ljava/lang/String;)V"
  4.         at com.jni.crypt.project.CryptDesManager.cVerify(Native Method)
  5.         at com.jni.crypt.project.CryptDesManager.init(CryptDesManager.java:1)
  6.         at com.biquge.ebook.app.app.AppContext.onCreate(AppContext.java:5)
  7.         at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1193)
  8.         at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6991)
  9.         at android.app.ActivityThread.access$1500(ActivityThread.java:257)
  10.         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1982)
  11.         at android.os.Handler.dispatchMessage(Handler.java:106)
  12.         at android.os.Looper.loop(Looper.java:236)
  13.         at android.app.ActivityThread.main(ActivityThread.java:8056)
  14.         at java.lang.reflect.Method.invoke(Native Method)
  15.         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
  16.         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
复制代码

看样子是说,com.jni.crypt.project.CryptDesManager.cVerify里调用了一个不存在的非静态方法Lcom/jni/crypt/project/CryptDesManager;.<init>(Ljava/lang/String;)V
该方法在libCryptDesManager.so中
打开IDA,看看这个so。



输出表里的四个Java_xxx并没有CryptDesManager.cVerify方法。
说明该方法为动态注册(我不确定,请大佬纠正)。

代开string窗口

一眼看到了好几个老朋友。

getApplicationInfo
getPackageInfo
signatures
这都是调用的安卓API获取的安装包信息,包括签名。







众所周知,signatures获取的签名,是能被pms过掉的。但是为何依旧闪退?
so里的代码没有混淆,十分清晰。

我们不得不怀疑,Java层有其他校验。





  • 【三】Java层定位

此时,安装包已用pms(mt去签普通版)处理过。
这里用的是mt自带的日志注入功能。

如图


我选择了全局注入,打印string类型的返回值





安装,授予存储权限,运行,看日志。



在发生闪退的前几行,获取了apk安装路径?
我们有充分的理由怀疑这里是校验apk是否未修改。

合理推测:
  • so层signatures校验
  • Java层安装包校验


后续验证,此推测正确。





进入获取apk路径的代码看一看。

进入a方法。

smali指令看的不清晰,转Java代码。


看到这里就明白了,通过applicationinfo的sourceDir获取apk路径。

  • 【4】解决方案

  • 各大过签工具,不用多强,支持Java重定向即可;
  • pms(mt)过so层校验,书写一点代码,实现局部重定向;
  • 获取apk后如何校验?能不能改一些东西,伪装原包?
  • 将libCryptDesManager.so中的有效代码还原成Java,校验代码删除。还原后libCryptDesManager.so就可以删了;
  • 爆破改so,过掉so层,Java层同2或3。

  • 【5】示例
以上五种方法我全试了,都能搞定。最难的是方法4,还原Java代码,不再演示,各位可以自己尝试。

我演示一下方法2和方法3

方法2:
首先,mt过签普通版。
接着,在获取apk路径的地方,换成原包路径。
我选择的是将原包放到lib/arm64-v8a目录下,重命名为libshell.so,然后,将路径指向此文件即可。

Java代码:
  1. public static String getApk(Context context) {
  2.         StringBuilder stringBuilder = new StringBuilder();
  3.         String lib = context.getApplicationInfo().nativeLibraryDir;
  4.         String result = "/libshell.so";
  5.         return stringBuilder.append(lib).append(result).toString();
  6.     }
复制代码


推荐用Java2smali插件

smali:
  1. .method public static getApk(Landroid/content/Context;)Ljava/lang/String;
  2.     .registers 5
  3.     .param p0, "context"    # Landroid/content/Context;

  4.     .prologue
  5.     .line 8
  6.     new-instance v2, Ljava/lang/StringBuilder;

  7.     invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

  8.     .line 9
  9.     .local v2, "stringBuilder":Ljava/lang/StringBuilder;
  10.     invoke-virtual {p0}, Landroid/content/Context;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;

  11.     move-result-object v3

  12.     iget-object v0, v3, Landroid/content/pm/ApplicationInfo;->nativeLibraryDir:Ljava/lang/String;

  13.     .line 10
  14.     .local v0, "lib":Ljava/lang/String;
  15.     const-string v1, "/libshell.so"

  16.     .line 11
  17.     .local v1, "result":Ljava/lang/String;
  18.     invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

  19.     move-result-object v3

  20.     invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

  21.     move-result-object v3

  22.     invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

  23.     move-result-object v3

  24.     return-object v3
  25. .end method
复制代码

将此方法替代原来的获取apk路径的代码即可。并且将“原包”重命名为libshell.so放进lib/arm64-v8a里

这就实现了手动局部重定向。
类:d.m.a.a.g
代码截图:





其实和Java原包重定向差不多了,那个只是反射弄了个总代理。

方法3:

写了快一小时了,主要是中间刷新了一次,数据都丢了,重写了一半。有点累了。
思路:查找 获取apk路径方法 的调用,看看获取后干了什么。


拿着获取到的apk文件,去初获取了一个类对象。



看到channel,结合以往经验,我们可以猜测是channel校验。
接着往下看,拿着两个参数(String和Map)去初始化了一个类对象作为返回值。

我们打印一下,这几个相关的类,看看参数值、返回值是什么。

这里我不再操作,用一个过签成功的包去打印。
总之,正确的应该是channel为“gw2022_5”,将channel对应的value赋值为“gw2022_5”即可。

类:d.m.a.a.c


类:d.b.a.a.k.a



提示一下方法4,可以用simplehook对那几个native函数的参数和返回值进行hook。
再结合ida分析,重写成java就容易一些了。


没有成品,思路更重要。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有18人评分好评 金币 理由
MengYond + 1 + 1 很给力!
©麟杰 + 1 + 1
奥雷里亚诺 + 1
云天灬魂 + 1 + 1 很给力!
kemomimi酱 + 1 + 1
墨白cimolestes. + 1 + 1
念程 + 1 + 1 感谢大佬的思路
shan0404 + 1 + 1 赞一个!
Sunup + 1 + 1 大佬厉害
下雨了 + 1 + 1
烟雨漫江南 + 1 + 2 赞一个!
暗魂 + 1 + 1
清隍 + 1 + 1
御景 + 1 给我怜哥一个精华doge
送你一朵小红花 + 1
会飞的鱼t5a + 1 + 1
WZTong + 1 + 1
无法显示 + 1 + 1

查看全部评分 总评分:好评 +16  金币 +18 

雾失楼台,月迷津渡
回复

使用道具 举报

7

主题

502

帖子

1375

积分

高中生

Rank: 4

金币
663
好评
0
信誉
100

MT论坛最佳新人考神

发表于 2022-5-28 19:15:34 来自手机  | 显示全部楼层  来自 浙江
大佬们都在看着呢
回复

使用道具 举报

23

主题

859

帖子

5612

积分

硕士生

Rank: 6Rank: 6

金币
1936
好评
25
信誉
100
发表于 2022-5-28 19:16:08 来自手机  | 显示全部楼层  来自 湖北
鱼来祝贺
回复

使用道具 举报

0

主题

401

帖子

1457

积分

高中生

Rank: 4

金币
686
好评
0
信誉
100
发表于 2022-5-28 19:16:20 来自手机  | 显示全部楼层  来自 江苏南通
看看学习
回复

使用道具 举报

55

主题

1090

帖子

2901

积分

大学生

Rank: 5Rank: 5

金币
741
好评
7
信誉
100
QQ
发表于 2022-5-28 19:16:39 来自手机  | 显示全部楼层  来自 河南洛阳
看看教程
回复

使用道具 举报

69

主题

5332

帖子

1万

积分

博士生

滑稽

Rank: 7Rank: 7Rank: 7

金币
1541
好评
62
信誉
101

MT论坛新人MT论坛最佳新人MT论坛活跃会员考神

QQ
发表于 2022-5-28 19:16:39 来自手机  | 显示全部楼层  来自 广东清远
感谢分享
回复

使用道具 举报

2

主题

222

帖子

736

积分

初中生

Rank: 3Rank: 3

金币
289
好评
0
信誉
100

MT论坛帅哥考神

发表于 2022-5-28 19:17:02 来自手机  | 显示全部楼层  来自 河南郑州
顶大佬NB
回复

使用道具 举报

34

主题

1113

帖子

2990

积分

大学生

.̙̗̗̙̙̗

Rank: 5Rank: 5

金币
190
好评
2
信誉
106

考神MT论坛帅哥MT论坛最佳新人MT论坛新人

QQ
发表于 2022-5-28 19:17:25 来自手机  | 显示全部楼层  来自 河南商丘
本帖最后由 烂柯缘 于 2022-5-28 19:19 编辑

大佬厉害了
回复

使用道具 举报

1

主题

3475

帖子

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3566
好评
1
信誉
100
发表于 2022-5-28 19:17:57 来自手机  | 显示全部楼层  来自 河南郑州
感谢分享
回复

使用道具 举报

12

主题

217

帖子

1987

积分

高中生

Rank: 4

金币
99
好评
1
信誉
100
发表于 2022-5-28 19:18:25 来自手机  | 显示全部楼层  来自 广东
来了
回复

使用道具 举报

0

主题

972

帖子

3482

积分

大学生

Rank: 5Rank: 5

金币
172
好评
9
信誉
105

MT论坛最佳新人考神MT论坛新人

发表于 2022-5-28 19:19:48 | 显示全部楼层  来自 福建泉州
光看到图片就知道不简单
如果我们这样在雪中一直走下去,是不是就走到了白头……
回复

使用道具 举报

3

主题

708

帖子

2076

积分

大学生

Rank: 5Rank: 5

金币
1819
好评
0
信誉
100
发表于 2022-5-28 19:20:47 来自手机  | 显示全部楼层  来自 四川宜宾
来了来了
回复

使用道具 举报

15

主题

986

帖子

3349

积分

大学生

student

Rank: 5Rank: 5

金币
1975
好评
24
信誉
130

MT论坛帅哥考神MT论坛新人MT论坛最佳新人

QQ
发表于 2022-5-28 19:20:48 来自手机  | 显示全部楼层  来自 吉林
膜拜大佬
回复

使用道具 举报

40

主题

1548

帖子

4639

积分

大学生

小白

Rank: 5Rank: 5

金币
911
好评
10
信誉
107

考神MT论坛帅哥MT论坛最佳新人

发表于 2022-5-28 19:22:03 来自手机  | 显示全部楼层  来自 河南郑州
看看大佬
回复

使用道具 举报

11

主题

799

帖子

2978

积分

大学生

诡声夜栈

Rank: 5Rank: 5

金币
1120
好评
2
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 2022-5-28 19:22:57 来自手机  | 显示全部楼层  来自 山东潍坊
看看大佬
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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