如何在没有源代码的情况下调试已签名的apk?

Ime*_*ene 7 debugging android apk

我想询问是否有可能在没有源代码的情况下调试版本apk以及我们如何阻止用户执行此操作?

我以为我无法在没有源代码的情况下调试apk(默认情况下,manifest默认为android:debuggable ="false"),直到我将它发送到客户端并且他要求我禁用可调试模式,因为他遇到了这个问题.我尝试重现问题,我在想他是否进行了逆向工程.

nul*_*ble 14

您可以使用许多不同的工具调试已签名的APK.大多数方法都被认为是逆向工程的一种形式.在高层次上,一种常见的方法(用于动态"实时"调试)将是:

  1. 使用APKTool通过AndroidManifest.xml中的属性启用调试.对齐并签署新修改的APK.
  2. 使用ADB将新的"可调试"APK推送到设备/模拟器.
  3. 使用调试器,如GDB(NDK包含带有arm工具链的gdbserver).

值得一提的是,静态分析也可以是一个选项,因此APK可以解压缩并反编译为SMALI/Java.

有许多工具可用于帮助反向和调试APK.我经常使用的是; dex2jar,JDGUI,APK Studio,JEB,IDA Pro,VisualGDB.


Zee*_*ro0 8

您可以使用Android Studio 3.0 及更高版本在没有源代码的情况下调试 APK

  • 首先确保启用调试
  • 要开始调试 APK,请在 Android Studio 欢迎屏幕中单击配置文件或调试 APK。或者,如果您已经打开了一个项目,请从菜单栏中单击 文件 > 配置文件或调试 APK。在下一个对话窗口中,选择要导入 Android Studio的 APK,然后单击OK

在此处输入图片说明

一些防止调试的技巧:

1. 检查ApplicationInfo中的Debuggable Flag

android:debuggableAndroid Manifest 中的标志决定了是否为应用启动了 JDWP 线程。它的值可以通过应用程序的 ApplicationInfo 对象以编程方式确定。如果设置了该标志,则说明清单已被篡改并允许调试。

public static boolean isDebuggable(Context context){
    return ((context.getApplicationContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
}
Run Code Online (Sandbox Code Playgroud)

2. isDebuggerConnected

Android Debug 系统类提供了一个静态方法来确定调试器是否已连接。该方法返回一个布尔值。

public static boolean detectDebugger() {
    return Debug.isDebuggerConnected();
}
Run Code Online (Sandbox Code Playgroud)

通过访问 DvmGlobals 全局结构,可以通过本机代码调用相同的 API。

JNIEXPORT jboolean JNICALL Java_com_test_debugging_DebuggerConnectedJNI(JNIenv * env, jobject obj) {
    if (gDvm.debuggerConnected || gDvm.debuggerActive)
        return JNI_TRUE;
    return JNI_FALSE;
}
Run Code Online (Sandbox Code Playgroud)

3. APK 签名检查

如果 APK 被放弃,它的签名就会改变。请对照您的原始 APK 签名进行检查。