apk签名校验:
某些安卓程序为了防止被破解,而在程序中加入了签名校验,这样在apk被重新打包之后,会出现签名不一直的问题,apk运行之后就会检测到,这样apk就会运行出现问题。
apk去除签名校验:
去除签名校验的方法也很简单,只要在apk校验签名的地方给破解掉即可。
apk签名校验的常用方法:
getPackageManager()
getPackageInfo(getPackageName(), 64)
signatures
hashCode()
使用packageManager获取apk packageinfo然后使用signatures方法之后,在算出哈希值和原本的签名哈希值进行对比,一般的签名校验都是这个流程。
实例一:bug磁力搜索器:
android killer 反编译之后,搜索getPackageManager,就在入口界面找到了qian()方法,看到这就明白了,这拼音命名法可正是666。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4bc921ec-da6c-443b-af3f-290000882312%2F2022-10-15_104257.png?table=block&id=064cd7a8-456a-4c1e-afd7-20bce3e3fe15&cache=v2)
直接去掉219行的跳转,或者直接去掉,再干脆一点,直接清空这个函数都可以。
.method public qian(I)V .locals 3 .annotation system Ldalvik/annotation/Signature; value = { "(I)V" } .end annotation .prologue .line 215 :try_start_0 invoke-virtual {p0}, Lcom/bug/bt/MainActivity;->getPackageManager()Landroid/content/pm/PackageManager; move-result-object v0 invoke-virtual {p0}, Lcom/bug/bt/MainActivity;->getPackageName()Ljava/lang/String; move-result-object v1 const/16 v2, 0x40 invoke-virtual {v0, v1, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo; move-result-object v0 .line 216 iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature; .line 217 const/4 v1, 0x0 aget-object v0, v0, v1 .line 218 invoke-virtual {v0}, Landroid/content/pm/Signature;->hashCode()I move-result v0 .line 219 if-eq v0, p1, :cond_0 #去掉这里的跳转,或者直接删除即可 .line 221 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 :try_end_0 .catch Landroid/content/pm/PackageManager$NameNotFoundException; {:try_start_0 .. :try_end_0} :catch_0 .line 222 :cond_0 :goto_0 return-void :catch_0 move-exception v0 goto :goto_0 .end method
以为这样就可以了,但是我还是too yang,too simple,应用还是照样闪退,翻看日志,找到了一点端倪,看到了qian()方法,打印出的日志,然后还调用了libbug.so文件。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F239cc8f5-758f-47c5-a668-88ca8ec91084%2F2022-10-12_223422.png?table=block&id=667a37c9-9792-459c-9aa7-ad4188691d52&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F35545bdc-8260-41b3-876c-52cd2f3e5f08%2F2022-10-12_223451.png?table=block&id=fefae3ae-1d58-4570-84ae-f8874372a185&cache=v2)
IDA打开libbug.so文件:
这里调用了getsignhashcode函数,而这就是校验签名的函数:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1d682b1c-ebb8-42e3-9fff-552d822bfcbb%2F2022-10-12_213342.png?table=block&id=e938e970-9bb3-496f-86bd-96d64f816755&cache=v2)
getsignhashcode函数也是大致的校验流程,如果签名不一致,就会直接exit(0)退出,本想在这个函数里修改,但是有些麻烦,所以直接在调用这个函数的地方,直接nop掉,就可以了
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F34e6b2f1-129a-4029-af7e-a8b07ebfddb5%2F2022-10-12_222708.png?table=block&id=410599f4-43a2-409a-b4a9-9ddb0f3fb1a8&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ff010d73e-128b-4292-a536-563bd2bbde67%2F2022-10-12_194959.png?table=block&id=63325717-28e9-43c8-833d-2af88c27ac3a&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7b9b4d22-eeb1-40ba-8d9f-7829f23d0c9b%2F2022-10-12_195039.png?table=block&id=148f4194-2ace-4400-bae1-a10dfa28aa7e&cache=v2)
在这里直接用两个两字节的thumb指令填充即可,arm hex指令四字节的nop指令,ida不识别,只能用00 BF 00 BF 直接代替即可,用ida改有时候会改变其他的指令,可以用其他的十六进制编辑器编辑。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffe38fb05-5c74-40f4-8623-1ee9fea62e42%2F2022-10-15_120822.png?table=block&id=35d1aceb-12a4-4862-9b0b-3d9410a1c341&cache=v2)
编辑示意图:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F39f87354-9f3d-4d7f-80bc-d81d1db3f356%2F2022-10-15_120945.png?table=block&id=b9e2a38d-c819-4443-b881-f61f7305f4b3&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F26f8982a-e818-4854-a091-5228dde08a69%2F2022-10-15_121109.png?table=block&id=62f6169c-87ba-4063-a87f-fbe840001c94&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1af34736-8500-4f78-adb1-f91381d42e1e%2F2022-10-15_121109.png?table=block&id=75fb78c1-604a-48f6-94fd-b12769baca00&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F188b0356-089d-4e76-a87c-66cdcf33baf1%2F2022-10-15_121703.png?table=block&id=46d36cf2-bd73-4647-9369-fe5f12d523aa&cache=v2)
改成BNE之后:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc3403d32-a010-4ad4-bd5b-dd348e5956ea%2F2022-10-15_121836.png?table=block&id=6e8d05d9-b21e-4276-9760-9108196952f1&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F93095519-b2ca-495f-a342-5a226a60fff0%2F2022-10-15_122126.png?table=block&id=0ac02e80-f06c-47c1-84c5-453107ef07a0&cache=v2)
编辑完之后保存,替换libbug.so文件,然后重新打包运行:
不再闪退了:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4a0501df-e498-4835-a556-777e66ff70ac%2F2022-10-15_122042.png?table=block&id=443934ca-6bda-402e-8f64-6f2de3d374be&cache=v2)
案例二:书旗小说:
为了不走上次的弯路,我这次直接从日志入手:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fcb13fd07-60a5-4ecb-935c-e15befd2a893%2F2022-10-13_184515.png?table=block&id=c0475145-71db-4253-bb3b-71a788c1fa36&cache=v2)
关键方法就在ShuqiApplication$3.handleTokernf,这就是签名方法:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fdb0b234c-1dda-47f1-9b25-d2e381fbf3c4%2F2022-10-13_184502.png?table=block&id=ccf6719a-0adf-45b4-a8ac-cd84f4641747&cache=v2)
.method public handleToken(II)Z .locals 3 .prologue .line 351 iget-object v0, p0, Lcom/shuqi/app/ShuqiApplication$3;->val$context:Landroid/content/Context; invoke-virtual {v0}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager; move-result-object v0 .line 353 :try_start_0 iget-object v1, p0, Lcom/shuqi/app/ShuqiApplication$3;->val$context:Landroid/content/Context; .line 354 invoke-virtual {v1}, Landroid/content/Context;->getPackageName()Ljava/lang/String; move-result-object v1 const/16 v2, 0x40 invoke-virtual {v0, v1, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo; move-result-object v0 .line 355 iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature; .line 356 const/4 v1, 0x0 aget-object v0, v0, v1 invoke-virtual {v0}, Landroid/content/pm/Signature;->hashCode()I move-result v0 .line 357 .line 363 :cond_0 :goto_0 const/4 v0, 0x1 return v0 .end method
直接清空就好了,然后再次运行,又发现在libAppRuntime_V1_3.so里还有一个checkSignature函数,
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F6b2f79a0-4ffb-4603-b2c4-261e6ac266ee%2F2022-10-13_194056.png?table=block&id=b35ba7cf-e6f3-476a-8063-85b351792be7&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F81d614c5-2eb9-4c97-af23-5f899a919f78%2F2022-10-13_194107.png?table=block&id=30d9328b-ee2d-468a-9c23-1844b47894ae&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb3cec4c7-f29e-4e9c-a520-3acd3ef14272%2F2022-10-13_194118.png?table=block&id=8efbfbcb-7538-4d10-b36f-112796ee13ff&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fdd556c4e-78f4-4c98-8ec8-e35a43c317f6%2F2022-10-13_194502.png?table=block&id=950b0b0f-cf94-49c7-a3e2-1034173e925a&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa6f42afd-91a4-477f-a696-a32c3ebda044%2F2022-10-13_194706.png?table=block&id=f4e93bd4-134e-4810-a5f5-e94e58a93e61&cache=v2)
在jni_load函数时,就已经调用了校验签名方法:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd12e62e0-be01-436a-becc-5e9b983e0ff9%2F2022-10-13_203527.png?table=block&id=25e71554-ae3b-4397-a918-d10b5c7accf7&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F227999ea-a772-4994-a85b-b29222b2e299%2F2022-10-13_204714.png?table=block&id=06ae397b-1d74-4b58-8029-e084ce0c6884&cache=v2)
替换so文件,重新打包就可以运行了。
总结:
校验签名的方法可能有时候不止在java层,也可能在so层,或者两者都会有。