Android逆向学习笔记(2)-真机调试

在roysue那买的Nexus 5X调试机到了,看起来还不错。之前一直用的x86架构的模拟器,动调是不可能动调的,今天用真机来试试ARM的动态调试。

成色不错,环境都已经配好了:

image-20211022094520907

开启USB调试后可以直接在Android Studio上部署APP到手机:

image-20211022094715792

img

写一个简单的程序来测一下真机so层动态调试:

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
#include <jni.h>
#include <cstdio>
#include <cstring>

#ifdef __cplusplus
extern "C" {
#endif

unsigned char enc[100] = "\x66\x6d\x63\x64\x7f\x6d\x63\x6b\x64\x66\x55\x6a\x62\x69\x7c\x60\x79\x75\x4d\x60\x71\x76\x63\x65\x71\x6d\x63\x66";

// flag{hello_android_security}
jboolean Java_cn_bluesadi_ndkdemocpp_MainActivity_check(JNIEnv *env, jobject, jstring jinput){
if(env->GetStringUTFLength(jinput) != 28){
return JNI_FALSE;
}
const char *input = env->GetStringUTFChars(jinput, nullptr);
for(unsigned char i = 0;i < 28;i ++){
enc[i] ^= i;
}
return !memcmp(input, enc, 28);
}

#ifdef __cplusplus
}
#endif

—————2021/10/27更新—————

折腾了好几天,终于把动态调试弄明白了。

调试的过程看雪上的这篇文章讲得很详细,但是有一个坑没有提到——要调试必须在AndroidManifest.xml中加上这样的代码(来自超详细的android so库的逆向调试):

image-20211027150322603

android:extractNativeLibs: 很多人在进行调试的时候发现ida pro一切正常,但是却一直没有加载我们的libnative -lib.so, 是因为缺少这行代码。如果不加,可能会使so直接自身的base.apk进行加载,导致ida pro无法识别。

android:extractNativeLibs配置的具体作用可以看这篇文章:APK瘦身属性——android:extractNativeLibs

把这个坑排除掉之后就能按正常流程来调试了:

image-20211027151517402

那如果不加上android:extractNativeLibs="true"要怎么调试呢?查阅Google官方文档得到:

软件包安装程序是否将原生库从 APK 提取到文件系统。如果设为 false,则原生库必须保持页面对齐状态并以未压缩的形式存储在 APK 中。无需更改代码,因为链接器在运行时直接从 APK 加载库。

所以原生库应该会包含在base.apk里。base.apk这个模块点进去确实发现很多函数,但没有我们自己写的native函数:

image-20211027153824899

如果在memcmp和strlen函数下断点会一直触发中断,原因不明,所以这种方法也没法调试:

image-20211027154237929

最后还是没弄出来,作为以后研究的问题吧。。。