返回列表 发新帖

【实战破解】Frida对iTime签名校验分析

  [复制链接]

63

主题

2569

帖子

1万

积分

博士生

萌新

Rank: 7Rank: 7Rank: 7

金币
2075
好评
132
贡献
18

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

QQ
发表于 2021-9-28 13:14:29 | 显示全部楼层 | 阅读模式
本帖最后由 正己 于 2021-10-2 19:49 编辑
1.iTime7.5.10
2.jadx-gui
3.MT管理器
4.算法助手
5.Frida

好久没发帖了,最近刚好分析了一款软件,顺便做个笔记记录一下。

一、算法助手定位

1.老规矩,直接签名看看是否有签名校验,果不其然,闪退!
2.算法助手打开拦截应用退出和防止应用闪退

3.运行软件,触发闪退,打开算法助手查看日志,看第一个触发的,接着根据堆栈调用去搜索


二、jadx-gui静态分析
1.定位到onCreate方法
代码如下:
  1. public void onCreate() {
  2.         int i2;
  3.         super.onCreate();
  4.         j0 j0Var = j0.f22466a;
  5.         String V = com.blankj.utilcode.util.w.V(com.blankj.utilcode.util.c.r());  // r方法的值赋给字符串V
  6.         k0.o(V, "encryptMD5ToString(signatureMd5)"); //md5加密一次
  7.         byte[] bytes = V.getBytes(f.f26826a);
  8.         k0.o(bytes, "(this as java.lang.String).getBytes(charset)");//再base64加密
  9.         if (!k0.g(new C().s(), Base64.encodeToString(bytes, 0))) {  //比较不通过就闪退
  10.             System.exit(0);  
  11.         }
  12.         SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
  13.         String string = defaultSharedPreferences.getString(getString(R.string.key_pref_ui_mode), com.wisdom.ticker.util.s.x);
  14.         com.blankj.utilcode.util.b.d(getResources(), 375);
  15.         if (string == null) {
  16.             i2 = -1;
  17.         } else {
  18.             i2 = Integer.parseInt(string);
  19.         }
  20.         com.wisdom.ticker.util.n0.e.h(i2);
  21.         a aVar = f20953a;
  22.         aVar.n(new com.wisdom.ticker.service.f());
  23.         aVar.j(new com.wisdom.ticker.service.c());
  24.         aVar.k(new com.wisdom.ticker.service.d());
  25.         f20955c = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), a.f20974a);
  26.         g = j0Var.h(this);
  27.         y.f22622a.f(this);
  28.         SharedPreferences sharedPreferences = getSharedPreferences(com.wisdom.ticker.service.core.g.a.f21353b, 0);
  29.         k0.o(sharedPreferences, "getSharedPreferences(AppConfig.SHARED_NAME, Context.MODE_PRIVATE)");
  30.         aVar.l(sharedPreferences);
  31.         z.f22624a.j(this);
  32.         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
  33.         m.f22482a.c(defaultSharedPreferences.getBoolean(com.wisdom.ticker.service.core.g.a.I, true));
  34.         DBBox.INSTANCE.init(this);
  35.         com.wisdom.ticker.service.core.h.a.f21364a.d().o(this);
  36.         if (defaultSharedPreferences.getBoolean(com.wisdom.ticker.service.core.g.a.q, true)) {
  37.             for (Moment moment : i.f21294a.u()) {
  38.                 LogUtils.l("升级计时:" + moment.getName() + '-' + moment.getTime() + '-' + moment.getSolarDate());
  39.                 moment.setNeedUpdate(true);
  40.                 i.H(i.f21294a, moment, false, 2, null);
  41.             }
  42.             defaultSharedPreferences.edit().putBoolean(com.wisdom.ticker.service.core.g.a.q, false).apply();
  43.         }
  44.         com.wisdom.ticker.util.o0.b.j(this);
  45.         com.wisdom.ticker.util.o0.b e2 = com.wisdom.ticker.util.o0.b.e();
  46.         k0.o(e2, "createInstance()");
  47.         e2.a(new com.wisdom.ticker.util.m0.c()).a(new com.wisdom.ticker.util.m0.e()).a(new j()).a(new com.wisdom.ticker.util.m0.d()).a(new com.wisdom.ticker.util.m0.i()).a(new g()).a(new com.wisdom.ticker.util.m0.f());
  48.         if (!defaultSharedPreferences.getBoolean(com.wisdom.ticker.service.core.g.a.A, true)) {
  49.             e2.a(new h());
  50.             h0.f22453a.d(this);
  51.         }
  52.         e2.n();
  53.         e2.b();
  54.         org.koin.core.d.a.c(new c(this));
  55.         f.b.a.c h1 = f.b.a.c.h1();
  56.         LogUtils.D("启动耗时:" + p0.P0(h, h1).k0() + 's');
  57.         if (!defaultSharedPreferences.contains(f.j)) {
  58.             defaultSharedPreferences.edit().putLong(f.j, h1.e()).apply();
  59.         }
  60.     }
复制代码

2.总的来说,就是先获取r方法的值,然后MD5加密一次,接着base64加密,最后和C类里的s方法的值进行对比,如果不相等就触发System.exit(0);
3.跟进一下r方法,代码如下:
  1. private static String q(String str, String str2) {
  2.         Signature[] p;
  3.         if (!k1.A0(str) && (p = p(str)) != null && p.length > 0) {
  4.             return k1.l(k1.j0(p[0].toByteArray(), str2)).replaceAll("(?<=[0-9A-F]{2})[0-9A-F]{2}", ":$0");
  5.         }
  6.         return "";
  7.     }

  8.     public static String r() {
  9.         return s(i1.a().getPackageName());  //获取包名信息传入s方法
  10.     }

  11.     public static String s(String str) {
  12.         return q(str, "MD5"); //MD5加密
  13.     }
复制代码


4.很明显r方法的返回值就是包名信息的MD5,这个可以直接用MT查看,当然我们也可以用Frida验证一下
三、Frida动态Hook
1.编写hook代码
  1. function hookTest(){
  2.     var money = Java.use("com.blankj.utilcode.util.c");
  3.     money.r.implementation = function(){      
  4.         var retval = this.r();
  5.                 console.log("r方法的返回值",retval);  
  6.                 return retval;
  7.     }
  8. }

  9. function main(){
  10.     Java.perform(function(){
  11.         hookTest(); //执行的方法
  12.     });
  13. }

  14. setImmediate(main);
复制代码


2.启动Frida并挂起apk(注意这里要用原版的apk!!!)

查看hook结果:`84:19:59:BE:9D:B3:72:E5:A1:42:90:9D:92:E1:AC:61`

和MT查看的一致

4.接下来,我们再跟进一下C类里的s方法,是不是如我们所想的一样。一看是native方法,拖出对应的libitime.so,ida加载

5.方法很少,直接定位到s方法

6.这里读取了一串很可疑的字符串:`RDFBRUE3NTUyMUIxMjk0MjhFMjE2Q0EzNTU4RjJGNjk=`
7.双击字符串发现跳转到.rodata段(只读数据段)

8.根据我们前面的猜测,获取r方法的值,然后MD5加密一次,接着base64加密。


9.结果一致,看样子我们的猜测没有错。由于是只读数据段,所以我们只能修改dex中的内容,把r方法的返回值写死即可,代码如下:
  1. .method public static r()Ljava/lang/String;
  2.     .registers 1

  3.     .line 1
  4.     const-string v0, "84:19:59:BE:9D:B3:72:E5:A1:42:90:9D:92:E1:AC:61"

  5.     return-object v0
  6. .end method
复制代码


10.运行测试,正常不闪退!
ps:至于高级版很简单,论坛已经有教程了,我就不赘述了





已有6人评分好评 金币 理由
郭友人 + 1 + 1 棒哎
yuanyxh + 1 + 1
凉客 + 1 + 1 神马都是浮云
南山楠 + 1 + 1 很给力!
LittleWhiteDuck + 1 + 1
武大郎 + 1 + 1 很给力!

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

最近建了个群,有兴趣的可以来吹吹牛【点击加群】
回复

使用道具 举报

63

主题

2569

帖子

1万

积分

博士生

萌新

Rank: 7Rank: 7Rank: 7

金币
2075
好评
132
贡献
18

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

QQ
发表于 2021-9-28 13:14:52 | 显示全部楼层
咕咕咕
最近建了个群,有兴趣的可以来吹吹牛【点击加群】
回复

使用道具 举报

7

主题

202

帖子

1625

积分

高中生

Rank: 4

金币
14
好评
1
贡献
0
发表于 2021-9-28 13:17:43 来自手机  | 显示全部楼层
回复

使用道具 举报

2

主题

1215

帖子

4096

积分

大学生

Rank: 5Rank: 5

金币
1068
好评
1
贡献
0

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

发表于 2021-9-28 13:18:35 来自手机  | 显示全部楼层
前排前排
回复

使用道具 举报

1

主题

1028

帖子

3725

积分

大学生

Rank: 5Rank: 5

金币
506
好评
0
贡献
1

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

发表于 2021-9-28 13:20:30 来自手机  | 显示全部楼层
感谢分享!
同情弱者是对大自然最大的不敬!
回复

使用道具 举报

70

主题

2604

帖子

7159

积分

硕士生

Rank: 6Rank: 6

金币
1784
好评
42
贡献
0

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

发表于 2021-9-28 13:21:36 来自手机  | 显示全部楼层
正已300集
回复

使用道具 举报

4

主题

683

帖子

1648

积分

高中生

Rank: 4

金币
739
好评
0
贡献
0

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

发表于 2021-9-28 13:29:35 来自手机  | 显示全部楼层
学理科看见了
回复

使用道具 举报

1

主题

931

帖子

2441

积分

大学生

Rank: 5Rank: 5

金币
1454
好评
0
贡献
0

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

发表于 2021-9-28 13:29:46 来自手机  | 显示全部楼层
谢谢分享
回复

使用道具 举报

101

主题

3534

帖子

8542

积分

硕士生

Rank: 6Rank: 6

金币
1999
好评
7
贡献
0
发表于 2021-9-28 13:34:42 来自手机  | 显示全部楼层
谢谢分享
回复

使用道具 举报

20

主题

1113

帖子

3407

积分

大学生

Rank: 5Rank: 5

金币
378
好评
0
贡献
0

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

发表于 2021-9-28 13:36:41 来自手机  | 显示全部楼层
看看教程啊
回复

使用道具 举报

2

主题

1624

帖子

6754

积分

硕士生

Rank: 6Rank: 6

金币
1576
好评
0
贡献
0
发表于 2021-9-28 13:37:42 来自手机  | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

21

主题

737

帖子

4808

积分

大学生

Rank: 5Rank: 5

金币
1517
好评
22
贡献
0
发表于 2021-9-28 13:39:31 来自手机  | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

255

主题

3416

帖子

9636

积分

硕士生

Rank: 6Rank: 6

金币
223
好评
61
贡献
0
QQ
发表于 2021-9-28 13:43:10 来自手机  | 显示全部楼层
感谢大牛
JK破解QQ3438943758
回复

使用道具 举报

61

主题

2740

帖子

1万

积分

博士生

white hawk

Rank: 7Rank: 7Rank: 7

金币
3443
好评
34
贡献
0

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

发表于 2021-9-28 13:49:37 来自手机  | 显示全部楼层
   
回复

使用道具 举报

12

主题

1151

帖子

4858

积分

大学生

Rank: 5Rank: 5

金币
2407
好评
20
贡献
0

MT论坛帅哥

发表于 2021-9-28 13:57:24 | 显示全部楼层
厉害!!!学习学习!
已有1人评分好评 金币 理由
正己 + 1 + 1 神马都是浮云

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

回复

使用道具 举报

发表回复

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

本版积分规则

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