首页
社区
课程
招聘
[原创]安卓日记_patch汇编指令绕签名验证
发表于: 2022-10-21 09:18 10556

[原创]安卓日记_patch汇编指令绕签名验证

2022-10-21 09:18
10556

前言

业余时间写的,纯兴趣更新!

测试apk

简单运行下

 

该程序做了一项检查,就是运行后会检查签名是否发生变化了,如果发生变化了,我们点击登录程序就会直接退出。

 

而我们对apk解包的时候,就会破坏掉它原有的签名,后面再重打包及签名后签名是和之前不一样了,所以安装它的程序逻辑,它检查不一致了就会让程序你不再运行。

 

apktool解包

1
2
3
4
5
6
7
8
9
10
11
12
java -jar apktool.jar d 黑宝宝.apk
I: Using Apktool 2.6.1 on 黑宝宝.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\yang\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

分析

将x86的so库拖入ida,因为这里是用的x86的模拟器去运行的。

 

 

可到看到apk调用Java_demo2_jni_com_myapplication_myJNI_check函数

 

so库函数命名

 

java 包名类名 方法名的格式

 

简单提一下导入表和导出表

 

Imports窗口是导入表(so调用到外面的函数)

 

 

Exports窗口是导出表(so中能让外部调用的函数)

分析Java_demo2_jni_com_myapplication_myJNI_check函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
int __cdecl Java_demo2_jni_com_myapplication_myJNI_check(_JNIEnv *env, int a2, int a3, int a4, int a5)
{
  const char *v5; // edi
  _JNIEnv *v6; // ebp
  void *v7; // eax
  _BYTE *v8; // esi
  bool v9; // zf
  signed int v10; // ecx
  const char *v11; // edi
  bool v12; // zf
  _BYTE *v13; // esi
  signed int v14; // ecx
  _BYTE *v15; // esi
  signed int v16; // ecx
  const char *v17; // edi
  int result; // eax
  int v19; // [esp+Ch] [ebp-30h]
  int v20; // [esp+18h] [ebp-24h]
  int v21; // [esp+1Ch] [ebp-20h]
 
  v5 = "308201dd30820146020101300d06092a864886f70d010105050030373116301406035504030c0d416e64726f69642044656275673110300e0"
       "60355040a0c07416e64726f6964310b3009060355040613025553301e170d3138303332313033303431385a170d3438303331333033303431"
       "385a30373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b30090603550406130"
       "2555330819f300d06092a864886f70d010101050003818d00308189028181008270f53e2cf8c7d7ed200863deb85a054defde773be0b848ee"
       "792839d9a81da098dd9b74bbb9679c19ea30b63fe3bb74aabb270a5c9b3359ebe3fdf278b82fe576a6677f0d77f0eb5b088d0711b15d03cad"
       "ae08b3b980f28055d0cde4bbc4a0b4b208b0f30f170b6ea77a8620269fa1d375442653663e1dd41293aa1c4910e350203010001300d06092a"
       "864886f70d010105050003818100044b9ab7e85346a147926c2d1c6c30e8ffcce174f88acb9763cb776fb1f4dd62183c9524346738ff1aea1"
       "6c5fa218c68da76d05a2422aee12fc23563b5e28925c3d96dff855a584fc1ec462aa768277bd25739085d52fe3fedfd396e38180c13fbb289"
       "786e524535933dd8a99ed3154880544f3e41f044acc43ceefbbce3af59";
  v6 = env;
  v7 = (void *)getSignature(env, a2, a3);
  v8 = (_BYTE *)v6->functions->GetStringUTFChars(&v6->functions, v7, 0);
  v20 = (int)v6->functions->GetStringUTFChars(&v6->functions, (jstring)a4, 0);
  v21 = (int)v6->functions->GetStringUTFChars(&v6->functions, (jstring)a5, 0);
  __android_log_print(4, "JNI_LOG", "JNI获取到的签名是%s", v8);// .rodata:000008C4 aJniS           db 'JNI获取到的签名是%s',0
  v10 = 963;
  do
  {
    if ( !v10 )
      break;
    v9 = *v8++ == *v5++;
    --v10;
  }
  while ( v9 );
  if ( !v9 )
  {
    __android_log_print(4, "JNI_LOG", "签名不一致 退出程序", v19);// .rodata:000008F3 asc_8F3         db '签名不一致 退出程序',0
    exit(0);
  }
  v11 = "koudai";
  __android_log_print(4, "JNI_LOG", "签名一致", v19);// .rodata:000008DF asc_8DF         db '签名一致',0
  v13 = (_BYTE *)v20;
  v14 = 7;
  do
  {
    if ( !v14 )
      break;
    v12 = *v13++ == *v11++;
    --v14;
  }
  while ( v12 );
  if ( !v12 )
    goto LABEL_19;
  v15 = (_BYTE *)v21;
  v16 = 6;
  v17 = "black";
  do
  {
    if ( !v16 )
      break;
    v12 = *v15++ == *v17++;
    --v16;
  }
  while ( v12 );
  if ( v12 )
    result = (int)env->functions->NewStringUTF((JNIEnv *)env, "登陆成功");// .rodata:00000916 asc_916         db '登陆成功',0
  else
LABEL_19:
    result = (int)env->functions->NewStringUTF((JNIEnv *)env, "登陆失败");// .rodata:00000923 asc_923         db '登陆失败',0
  return result;
}

这里的话,我们就跟着教程的进度暂时就单纯破解这个软件

 

将空格将汇编代码以图形式显示出来,这样会更清晰地看到代码逻辑

1
2
3
4
5
jnz addr
如果标志寄存器z标志位不等于0,就跳转到 addr处去执行
 
jz addr
如果标志寄存器z标志位等于0,就跳转到addr处去执行

如果签名一致的话(jnz)就会跳转到左侧框中继续执行,即签名一致

 

如果签名不一致的话(jnz)就会跳转到右侧框中继续执行,即签名一致

 

那么如果我们把jnz改成jz是不是就达到了

 

如果签名一致的话(jz)就会跳转到右侧框中继续执行,即签名不一致

 

如果签名不一致的话(jz)就会跳转到左侧框中继续执行即签名一致

patch

修改它

 

选中这行代码,然后用Hexdump窗口查看下

 

jnz loc_827对应的16进制的数据为

1
0F 85 7F 00 00 00

 

或者可以用插件keypatch查看

 

选中jnz loc_827代码后,Edit->Keypatch->Patcher

 

 

在这里可以也看到它对应的16进制数据是怎样的,而且可以直接修改 汇编代码。很好用。

1
2
jnz loc_827
0F 85 7F 00 00 00

 

把jnz换成jz

1
2
jz loc_827
0F 84 7F 00 00 00


修改后

 

 

然后将保存修改后的so即可

 

Edit->Patch program->Apply patches to input file

 

 

记得个点备份

 

 

成功修改

 

 

然后再将其进行打包

1
2
3
4
5
6
7
8
9
10
java -jar apktool.jar b 黑宝宝 -o 黑宝宝_new.apk
I: Using Apktool 2.6.1
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...

对其进行安装是装不上的,因为没签名。

1
2
3
4
5
6
7
8
#adb install 黑宝宝_new.apk
31648 KB/s (1351560 bytes in 0.041s)
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl1696995922.tmp/base.apk: Attempt to get length of null array]
java.lang.Exception: call exit callstack! status=1
        at java.lang.System.exit(System.java:1418)
        at com.android.commands.pm.Pm.main(Pm.java:107)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:290)

这里还是使用AD对它进行签名就可。

 

再次安装

1
2
3
adb install 黑宝宝_new_sign.apk
32427 KB/s (1374526 bytes in 0.041s)
Success

这时,点击登录就不会程序结束退出了。

 

另外如果要修改成输入任何的账号密码都弹登录成功。也是同样的道理,就不弄了。

参考

【新提醒】《教我兄弟学Android逆向08 IDA爆破签名验证》 - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 310
活跃值: (975)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
本人菜鸡一枚,欢迎大佬们陆续加入到QQ群 801022487 一起交流学习
2022-10-21 14:13
0
雪    币: 2428
活跃值: (10698)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大佬大佬,顶贴
2022-10-24 18:00
0
游客
登录 | 注册 方可回帖
返回
//