霸哥磁力搜索签名校验分析
本帖最后由 白云点缀的蓝 于 2021-11-4 16:13 编辑我们先拖入AndroidKiller反编译,然后重新编译一下,
安装进模拟器后可以看到,会直接闪退
我们动态调试走起
打开jeb,让他反编译,然后在cmd中输入如下命令
然后进行附加
贴个mainActivity的OnCreate方法代码
@Override
public void onCreate(Bundle arg4) {
ADRTLogCatReader.onContext(this, "com.aide.ui");
super.onCreate(arg4);
this.setContentView(0x7F030001);// layout:main
this.qian(0xD845713);
this.输入 = (EditText)this.findViewById(0x7F060003);// id:输入
this.搜索 = (Button)this.findViewById(0x7F060004);// id:搜索
this.列表 = (ListView)this.findViewById(0x7F060005);// id:列表
this.搜索.setOnClickListener(new 100000001(this));
this.eee = this.bug();
if(this.eee.equals("")) {
Toast.makeText(this, 1, 1).show();
}
}
然后我们在mainActivity的oncreate方法内下断
当我们走到qian方法的时候就退出了
我们跟踪一下qian方法
public void qian(int arg4) {
try {
if(this.getPackageManager().getPackageInfo(this.getPackageName(), 0x40).signatures.hashCode() != arg4) {
Toast.makeText(this, 1, 1).show();
return;
}
}
catch(PackageManager.NameNotFoundException v0) {
return;
}
}
可以看到如下代码有个签名校验,如果arg4不等于原先签名,就执行下面的toast错误代码,然后直接闪退
if(this.getPackageManager().getPackageInfo(this.getPackageName(), 0x40).signatures.hashCode() != arg4) {
Toast.makeText(this, 1, 1).show();
return;
}
下面我们去AndroidKiller修改,把toast的错误代码删除,或者在最前面直接retn
删除如下smali代码即可
const/4 v0, 0x1
const/4 v1, 0x1
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;II)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
然后我们再次编译,然后安装
可以看到页面已经出来了,不闪退了,但是页面显示不完整
正常是这样的
我们回到oncreate方法
可以看到有个bug,我们看看这个bug方法,
可以看到这个bug方法的实现在native层,下面我们用ida反编译一下so
public native String bug() {
}
反编译完成后,我们看一下bug这个函数,
可以看到,他调用了getSignHashCode()函数,我们跟进去看看
int v4; // r7
int v5; // r0
int v6; // r0
int v7; // r0
int v8; // r6
int v9; // r6
int v10; // r0
int v11; // r0
int v12; // r0
int v13; // r6
int v14; // r0
int v15; // r0
int result; // r0
int v17; //
int v18; //
v4 = (*(int (__fastcall **)(int))(*(_DWORD *)a1 + 124))(a1);
v5 = (*(int (__fastcall **)(int, int, const char *, const char *))(*(_DWORD *)a1 + 132))(
a1,
v4,
"getPackageManager",
"()Landroid/content/pm/PackageManager;");
v17 = (*(int (__fastcall **)(int, int, int))(*(_DWORD *)a1 + 136))(a1, a2, v5);
v6 = (*(int (__fastcall **)(int, int))(*(_DWORD *)a1 + 124))(a1, v17);
v18 = (*(int (__fastcall **)(int, int, const char *, const char *))(*(_DWORD *)a1 + 132))(
a1,
v6,
"getPackageInfo",
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
v7 = (*(int (__fastcall **)(int, int, const char *, const char *))(*(_DWORD *)a1 + 132))(
a1,
v4,
"getPackageName",
"()Ljava/lang/String;");
v8 = (*(int (__fastcall **)(int, int, int))(*(_DWORD *)a1 + 136))(a1, a2, v7);
(*(void (__fastcall **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, v8, 0);
v9 = (*(int (__fastcall **)(int, int, int, int, int))(*(_DWORD *)a1 + 136))(a1, v17, v18, v8, 64);
v10 = (*(int (__fastcall **)(int, int))(*(_DWORD *)a1 + 124))(a1, v9);
v11 = (*(int (__fastcall **)(int, int, const char *, const char *))(*(_DWORD *)a1 + 376))(
a1,
v10,
"signatures",
"[Landroid/content/pm/Signature;");
v12 = (*(int (__fastcall **)(int, int, int))(*(_DWORD *)a1 + 380))(a1, v9, v11);
v13 = (*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)a1 + 692))(a1, v12, 0);
v14 = (*(int (__fastcall **)(int, int))(*(_DWORD *)a1 + 124))(a1, v13);
v15 = (*(int (__fastcall **)(int, int, const char *, const char *))(*(_DWORD *)a1 + 132))(a1, v14, "hashCode", "()I");
result = (*(int (__fastcall **)(int, int, int))(*(_DWORD *)a1 + 196))(a1, v13, v15);
if ( result != 226776851 )
result = 0;
return result;
可以看到如果result不等于指定的整数就直接执行exit函数,
我们可以先转成汇编,然后把exit这个函数nop了,
在arm汇编中,nop指令的十六进制码是 00 BF
改完后,我们需要应用补丁,也就是保存补丁
保存后,我们用AndroidKiller重新编译,签名后,安装进模拟器,
可以看到,签名校验已经过了
13538659596 发表于 2021-11-4 10:08
apk 再哪里下载呢
https://starrysp.lanzoui.com/iodoxw4qtbc
@Shark恒 忘设置回复可见了,帮忙设置一下,谢谢,我重新编辑他不显示图片,好多东西都没显示出来,一直刷新都不显示出来 starry、星空 发表于 2021-6-26 15:14
@Shark恒 忘设置回复可见了,帮忙设置一下,谢谢,我重新编辑他不显示图片,好多东西都没显示出来,一直刷新都不 ...
OK了 谢谢教程,学习! 谢谢教程,学习 不回復就看不到。 作者能出个教学视频那就更好了 重新编辑他不显示图片,好多东西都没显示出来 不回复就看不到 12345678990