返回列表 发新帖

小x分身

  [复制链接]

18

主题

918

回帖

5911

积分

硕士生

Rank: 6Rank: 6

金币
3642
好评
15
信誉
100
发表于 2024-10-25 09:59:26 来自手机  | 显示全部楼层 | 阅读模式  来自 重庆
本帖最后由 挽 于 2024-10-25 09:59 编辑

某些加固比较难脱修,手机机没root也用不了模块,最近发现小x分身搭配lspatch可以免root使用模块,但是小x好像要会员,而且有时候还有广告,然后就试着改了一下会员的判断逻辑在so层,直接内置模块改掉返回值就行


但是又发现使用独立分身时闪退,应该是分身有签名校验,使用去签工具一键去签后还是闪退,找了个破解版的小x研究了下去签思路,原来分身启动时校验的是小x的签名
,所以把需要过掉的签名改为小x的签名进行了,不过这样太麻烦了,每次制作分身都需要过一次签,如果能在创建分身的时候完成过签就好了,通过字符串定位到一个方法
  1. File file2 = new File(this.c.getCacheDir(), "temp");
  2.             if (!file2.exists()) {
  3.                 file2.mkdirs();
  4.             }
  5.             if (b.e(this.c.getApplicationContext(), this.c.d)) {
  6.                 CreatingNewActivity creatingNewActivity2 = this.c;
  7.                 int i4 = creatingNewActivity2.k;
  8.                 if (i4 == n0.b.n) {
  9.                     e = creatingNewActivity2.getAssets().open("res");
  10.                 } else {
  11.                     e = m.e(i4, false);
  12.                 }
  13.                 Log.e("制作", "使用32位的分身 " + this.c.d + "," + this.a + "," + this.c.k);
  14.             } else {
  15.                 CreatingNewActivity creatingNewActivity3 = this.c;
  16.                 int i5 = creatingNewActivity3.k;
  17.                 if (i5 == n0.b.n) {
  18.                     e = creatingNewActivity3.getAssets().open("res64");
  19.                 } else {
  20.                     e = m.e(i5, true);
  21.                 }
  22.                 Log.e("制作", "使用64位的分身 " + this.c.d + "," + this.a + "," + this.c.k);
  23.             }
  24.             if (e == null) {
  25.                 this.c.n.post(new d(this));
  26.                 this.c.n.postDelayed(new e(this), 2000L);
  27.                 return;
  28.             }
  29.             try {
  30.                 a.f(e, e.available(), this.c.n, UserCache.get().getYzDec(), file2.getAbsolutePath());
  31.             } catch (IOException e4) {
  32.                 e4.printStackTrace();
  33.             }
复制代码

应该就是制作分身的相关代码了,其中判断了所制作分身的位数,而且用到了assets中的相关资源文件res和res64,然后调用一些方法将返回值作为参数传给f方法,跳转到f方法看一下
  1. public static String f(InputStream inputStream, int i, Handler handler, String str, String str2) {
  2.         FileOutputStream fileOutputStream;
  3.         c cVar = new c(inputStream, str);
  4.         FileOutputStream fileOutputStream2 = null;
  5.         String str3 = null;
  6.         while (true) {
  7.             b e = cVar.e();
  8.             if (e != null) {
  9.                 if (e.getName().equals("resource")) {
  10.                     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  11.                     byte[] bArr = new byte[1024];
  12.                     int i2 = 0;
  13.                     while (true) {
  14.                         int read = cVar.read(bArr);
  15.                         if (read <= 0) {
  16.                             break;
  17.                         }
  18.                         byteArrayOutputStream.write(bArr, 0, read);
  19.                         i2 += read;
  20.                         int i3 = (int) ((i2 / i) * 40.0f);
  21.                         if (i3 > 40) {
  22.                             i3 = 40;
  23.                         }
  24.                         Message message = new Message();
  25.                         message.what = 888;
  26.                         message.arg1 = i3;
  27.                         handler.sendMessage(message);
  28.                     }
  29.                     byte[] byteArray = byteArrayOutputStream.toByteArray();
  30.                     byteArrayOutputStream.close();
  31.                     StringBuilder a = d.a.a(str2);
  32.                     a.append(File.separator);
  33.                     a.append(e.getName());   
复制代码

大致流程就是将之前的资源数据做了一些处理,然后输出数据,这两个文件应该就是分身模板了,对这两个文件提前处理一下就应该可以了,去assets目录看一下,发现这两个文件居然有密码


记得传给f方法的数据又与第四个形参传到了,c类的构造函数,然后调用e方法,去e方法看一下


看不太懂,但看到了password显然与密码有关,hook一下f方法


第四个参数是一个字符串,试试对不对


成功打开,显然是个apk文件,解压,现在只需要去签处理一下就行了,但是原包没有签名不能直接去签,先用mt对小x去签,在导出去签所需的代码(在classes4.dex中)



然后打开之前解压的resource文件,导入去签的dex文件,然后搜索代码.super Landroid/app/Application;点开第三个将
  1. .super Landroid/app/Application;
复制代码
改为
  1. .super Lbin/mt/signature/KillerApplication;
复制代码
之后保存退出,压缩文件名为res64(32位的文件名为res)


用这个res64(res)替换原来的


但是由于替换掉了原来的文件导致原来的代码运行不了,所以要改一下它的f方法,先搜索
  1. invoke-static {v0, v8, v9, v10, v11}, Lo0/a;->f(Ljava/io/InputStream;ILandroid/os/Handler;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
复制代码

改成
  1. invoke-static {v0,v11}, Lo0/a;->f(Ljava/io/InputStream;Ljava/lang/String;)Ljava/lang/String;
复制代码

然后把f方法的代码重写一下
  1. .method public static f(Ljava/io/InputStream;Ljava/lang/String;)Ljava/lang/String;
  2.     .registers 10
  3.     .param p0, "i"  # Ljava/io/InputStream;
  4.     .param p1, "s"  # Ljava/lang/String;
  5.     .annotation system Ldalvik/annotation/Throws;
  6.         value = {
  7.             Ljava/io/IOException;
  8.         }
  9.     .end annotation

  10.     .line 14
  11.     new-instance v0, Ljava/util/zip/ZipInputStream;

  12.     invoke-direct {v0, p0}, Ljava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;)V

  13.     .line 15
  14.     .local v0, "zipIn":Ljava/util/zip/ZipInputStream;
  15.     invoke-virtual {v0}, Ljava/util/zip/ZipInputStream;->getNextEntry()Ljava/util/zip/ZipEntry;

  16.     move-result-object v1

  17.     .line 16
  18.     .local v1, "entry":Ljava/util/zip/ZipEntry;
  19.     const-string v2, ""

  20.     .line 17
  21.     .local v2, "filePath":Ljava/lang/String;
  22.     :goto_b
  23.     if-eqz v1, :cond_61

  24.     .line 18
  25.     invoke-virtual {v1}, Ljava/util/zip/ZipEntry;->getName()Ljava/lang/String;

  26.     move-result-object v3

  27.     const-string v4, "resource"

  28.     invoke-virtual {v3, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

  29.     move-result v3

  30.     if-eqz v3, :cond_59

  31.     .line 19
  32.     new-instance v3, Ljava/lang/StringBuilder;

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

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

  35.     move-result-object v3

  36.     sget-object v5, Ljava/io/File;->separator:Ljava/lang/String;

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

  38.     move-result-object v3

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

  40.     move-result-object v3

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

  42.     move-result-object v2

  43.     .line 20
  44.     new-instance v3, Ljava/io/BufferedOutputStream;

  45.     new-instance v4, Ljava/io/FileOutputStream;

  46.     invoke-direct {v4, v2}, Ljava/io/FileOutputStream;-><init>(Ljava/lang/String;)V

  47.     invoke-direct {v3, v4}, Ljava/io/BufferedOutputStream;-><init>(Ljava/io/OutputStream;)V

  48.     .line 21
  49.     .local v3, "bos":Ljava/io/BufferedOutputStream;
  50.     const/16 v4, 0x1000

  51.     :try_start_3c
  52.     new-array v4, v4, [B

  53.     .line 23
  54.     .local v4, "bytesIn":[B
  55.     :goto_3e
  56.     invoke-virtual {v0, v4}, Ljava/util/zip/ZipInputStream;->read([B)I

  57.     move-result v5

  58.     move v6, v5

  59.     .local v6, "read":I
  60.     const/4 v7, -0x1

  61.     if-eq v5, v7, :cond_4b

  62.     .line 24
  63.     const/4 v5, 0x0

  64.     invoke-virtual {v3, v4, v5, v6}, Ljava/io/BufferedOutputStream;->write([BII)V
  65.     :try_end_4a
  66.     .catchall {:try_start_3c .. :try_end_4a} :catchall_4f

  67.     goto :goto_3e

  68.     .line 26
  69.     .end local v4  # "bytesIn":[B
  70.     .end local v6  # "read":I
  71.     :cond_4b
  72.     invoke-virtual {v3}, Ljava/io/BufferedOutputStream;->close()V

  73.     goto :goto_59

  74.     .line 20
  75.     :catchall_4f
  76.     move-exception v4

  77.     :try_start_50
  78.     invoke-virtual {v3}, Ljava/io/BufferedOutputStream;->close()V
  79.     :try_end_53
  80.     .catchall {:try_start_50 .. :try_end_53} :catchall_54

  81.     goto :goto_58

  82.     :catchall_54
  83.     move-exception v5

  84.     invoke-virtual {v4, v5}, Ljava/lang/Throwable;->addSuppressed(Ljava/lang/Throwable;)V

  85.     :goto_58
  86.     throw v4

  87.     .line 28
  88.     .end local v3  # "bos":Ljava/io/BufferedOutputStream;
  89.     :cond_59
  90.     :goto_59
  91.     invoke-virtual {v0}, Ljava/util/zip/ZipInputStream;->closeEntry()V

  92.     .line 29
  93.     invoke-virtual {v0}, Ljava/util/zip/ZipInputStream;->getNextEntry()Ljava/util/zip/ZipEntry;

  94.     move-result-object v1

  95.     goto :goto_b

  96.     .line 31
  97.     :cond_61
  98.     invoke-virtual {v0}, Ljava/util/zip/ZipInputStream;->closeEntry()V

  99.     .line 32
  100.     invoke-virtual {v0}, Ljava/util/zip/ZipInputStream;->close()V

  101.     .line 33
  102.     return-object v2
  103. .end method
复制代码


最后用lspatch对小x去签和内置模块

成功



模块  提取码:kkOX

本帖子中包含更多资源

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

x
已有4人评分好评 金币 理由
billme2017 + 1
昕老大 + 1 + 1 膜拜,向大佬学习!
smmyou + 1 + 1 高技术文章!
aqzz111 + 1

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

回复

使用道具 举报

0

主题

652

回帖

2061

积分

大学生

隐退

Rank: 5Rank: 5

金币
1225
好评
0
信誉
101

考神

发表于 2024-10-25 10:01:43 来自手机  | 显示全部楼层  来自 安徽
沙发。。。。。
回复

使用道具 举报

4

主题

809

回帖

3912

积分

大学生

Rank: 5Rank: 5

金币
1106
好评
0
信誉
100

MT论坛新人

发表于 2024-10-25 10:04:31 来自手机  | 显示全部楼层  来自 河南
看看隐藏
回复

使用道具 举报

94

主题

1113

回帖

5961

积分

硕士生

Rank: 6Rank: 6

金币
1048
好评
1
信誉
97
发表于 2024-10-25 10:07:16 来自手机  | 显示全部楼层  来自 重庆
看看隐藏
回复

使用道具 举报

33

主题

1487

回帖

7403

积分

硕士生

Снов‌

Rank: 6Rank: 6

金币
3610
好评
7
信誉
103

考神MT论坛帅哥

发表于 2024-10-25 10:08:58 来自手机  | 显示全部楼层  来自 中国
Буерак
回复

使用道具 举报

688

主题

1万

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
3412
好评
164
信誉
119

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

发表于 2024-10-25 10:09:21 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

1

主题

3040

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4527
好评
1
信誉
103
发表于 2024-10-25 10:17:59 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

0

主题

74

回帖

260

积分

初中生

Rank: 3Rank: 3

金币
222
好评
0
信誉
100
发表于 2024-10-25 10:18:27 来自手机  | 显示全部楼层  来自 广西
学习一下
回复

使用道具 举报

6

主题

948

回帖

3772

积分

大学生

Rank: 5Rank: 5

金币
1264
好评
2
信誉
100

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

发表于 2024-10-25 10:18:37 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

2

主题

1497

回帖

7344

积分

硕士生

Rank: 6Rank: 6

金币
2647
好评
0
信誉
101
发表于 2024-10-25 10:18:50 来自手机  | 显示全部楼层  来自 安徽
支持一下
回复

使用道具 举报

21

主题

3378

回帖

1万

积分

博士生

憨憨

Rank: 7Rank: 7Rank: 7

金币
192
好评
12
信誉
105

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

发表于 2024-10-25 10:21:08 来自手机  | 显示全部楼层  来自 山西
看看这个隐藏
回复

使用道具 举报

69

主题

2252

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2745
好评
21
信誉
100

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

发表于 2024-10-25 10:24:25 来自手机  | 显示全部楼层  来自 湖北
学习
回复

使用道具 举报

5

主题

2100

回帖

7247

积分

硕士生

Rank: 6Rank: 6

金币
2691
好评
16
信誉
100

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

发表于 2024-10-25 10:24:51 来自手机  | 显示全部楼层  来自 河南
国际版的没加固
回复

使用道具 举报

54

主题

4527

回帖

1万

积分

博士生

辰夕Mod

Rank: 7Rank: 7Rank: 7

金币
7121
好评
35
信誉
169

MT论坛帅哥考神MT论坛活跃会员

QQ
发表于 2024-10-25 10:31:18 | 显示全部楼层  来自 辽宁
看看隐藏
回复

使用道具 举报

5

主题

1057

回帖

4150

积分

大学生

Rank: 5Rank: 5

金币
2634
好评
0
信誉
100
发表于 2024-10-25 10:32:11 来自手机  | 显示全部楼层  来自 河北
看看隐藏
回复

使用道具 举报

发表回复

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

本版积分规则

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