下载:通过网盘分享的文件:IDA_Pro_7.7.7z
链接: https://pan.baidu.com/s/18QuV4wu19pF6oXssNVAbRQ?pwd=vehq 提取码: vehq
安装后请看目录内的使用说明文件操作
JNI的两种注册方式
JNI有静态注册和动态注册两种,静态注册在分析的比较简单,动态注册的话就需要先了解下注册步骤。
#include <jni.h>
#include <string>
extern "C" {
JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_MainActivity_nativeGetStringFromJNI(JNIEnv* env, jobject obj) {
std::string hello = "Hello wuaipojie";
return env->NewStringUTF(hello.c_str());
}
// 定义本地方法注册函数
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
// 定义要注册的本地方法
JNINativeMethod methods[] = {
{"nativeGetStringFromJNI", "()Ljava/lang/String;", reinterpret_cast<void*>(Java_com_example_ndkdemo_MainActivity_nativeGetStringFromJNI)}
};
// 获取类引用
jclass clazz = env->FindClass("com/example/ndkdemo/MainActivity");
if (clazz == nullptr) {
return -1;
}
// 注册本地方法
if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
return -1;
}
return JNI_VERSION_1_6;
}
} // extern "C"
IDA快捷键
| 快捷键 | 功能 |
|---|---|
| Esc | 回到上一个位置 |
| Enter | 跳转到当前光标处的地址 |
| – | 折叠代码 |
| + | 展开代码 |
| * | 创建一个结构 |
| Alt + A | 手动定义一个数组 |
| Alt + F | 寻找直接引用的函数 |
| Alt + G | 跳转到特定的地址 |
| Alt + T | 显示调用树 |
| Alt + X | 重命名 |
| Ctrl + G | 快速跳转到指定地址 |
| Ctrl + J | 显示引用列表 |
| Ctrl + K | 显示 XREF 到选中的函数/数据 |
| Ctrl + N | 创建一个函数 |
| Ctrl + Q | 快速重命名 |
| Ctrl + X | 显示从选中的函数/数据的 XREF |
| Ctrl + E | 显示结构类型 |
| Ctrl + R | 手动定义一个数据结构 |
| Ctrl + W | 打开函数列表 |
| Ctrl + D | 以十进制显示当前值 |
| Ctrl + B | 以二进制显示当前值 |
| Ctrl + H | 以十六进制显示当前值 |
| Space | 在图形/文本视图中切换 |
| shift + f12 | 打开字符串窗口 |
| F5 | 转伪C代码 |
Patch(修改so)方式
第一种:keypatch插件快速修补
IDA View-A中选中要修改的行
快捷键:Ctrl+Alt+k
第二种:ARM TO Hex
- IDA View-A中选中要修改的行,然后点击Hex View-1,高亮处就是对应的汇编指令。
- 将IDA View-A中选中要修改的行复制到下面的链接中,可以看到显示的汇编指令和IDA中一致。
- 在左侧做出修改后右侧会显示对应的指令,在IDA高亮汇编指令处右键-Edit-填入上一步的指令-右键-Apply changes
第三种:NOP
IDA view-A种跳转的地方右键NOP,来取消跳转。
第一,二,三种修改完后Edit-Path progarm-Apply patches to input files进行保存,然后用新的so文件去覆盖原有的so文件,使用MT管理器进行重新签名后安装