如何防止.dex文件被修补?

4xrmg8kj  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(581)

我对android应用程序及其特点还不熟悉。有一件事我不明白,到目前为止,我还没有找到对观察到的行为的解释:
我创建了一个基本的android应用程序,其中定义了一个字符串:

package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String s = new String("JustanExample");
    }
}

这个应用程序可以在androidstudio模拟器中构建和运行,没有任何问题。
现在,如果我用apktool反编译apk文件,编译它,签名并运行它,一切都正常。

$ apktool d -r -s app-test.apk
$ apktool b -f -d app-test
$ jarsigner -verbose -keystore my-test-key.keystore app-test/dist/app-test.apk alias_name

但是如果我反编译apk,用十六进制编辑器打开classes.dex文件,并将“justanexample”字符串改为其他字符串(例如“danexample”-相同长度),编译它,签名并安装它,应用程序立即停止/崩溃。

$ apktool d -r -s app-test.apk

  change the string in the classes.dex with hex editor

$ apktool b -f -d app-test
$ jarsigner -verbose -keystore my-test-key.keystore app-test/dist/app-test.apk alias_name

.dex文件是否有防止修补尝试的保护?如何绕过它?
更新01:根据davidkroukamp的建议,我查看了logcat输出(com.example.helloworld是应用程序的名称)。这似乎是一个校验和问题:

Suppressed: java.io.IOException: Failed to open dex files from /data/app/com.example.helloworld-KxRtzkSSxWpFrHOn_7pXEQ==/base.apk because: Failure to verify dex file '/data/app/com.example.helloworld-KxRtzkSSxWpFrHOn_7pXEQ==/base.apk': Bad checksum (fce4124d, expected e273124a)

根据读取的第一个搜索结果,校验和似乎存储在dex文件本身中。我将做一些进一步的阅读,看看我是否能找到一种方法,使我的补丁dex文件的工作。
更新02:如果我将dex文件头中的校验和替换为从logcat输出获得的校验和,我将获得不同的错误输出:

Suppressed: java.io.IOException: Failed to open dex files from /data/app/com.example.helloworld-QNglYY_UVQvVT-7uwN4dhA==/base.apk because: Failure to verify dex file '/data/app/com.example.helloworld-QNglYY_UVQvVT-7uwN4dhA==/base.apk': Out-of-order string_ids: 'abcdanExample' then 'KEEP_ALIVE'

此外,在前面两种情况下,我还得到了一条略有不同的信息:
校验和未修补:

2020-12-28 12:34:45.110 7106-7106/com.example.helloworld E/LoadedApk: Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[zip file "/data/app/com.example.helloworld-YMa5lJJ4Vva3eQZ0chGS4Q==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.helloworld-YMa5lJJ4Vva3eQZ0chGS4Q==/lib/x86_64, /system/lib64]]

校验和修补:

2020-12-28 12:39:33.644 7481-7481/com.example.helloworld E/LoadedApk: Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[zip file "/data/app/com.example.helloworld-QNglYY_UVQvVT-7uwN4dhA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.helloworld-QNglYY_UVQvVT-7uwN4dhA==/lib/x86_64, /system/lib64]]

目前的解决方案,我现在使用https://reverseengineering.stackexchange.com/a/9185. 这对我很有用。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题