安卓逆向9-ida静态调试

###

mac的我已经安装好了

###

ida介绍

ida工具不只是能调试so文件的,还能打开smali文件,dex文件的,这个要知道

ida是一个逆向工具

最大的好处就是能把c++写的可执行文件,反编译成为汇编,再转成c语言,

###

ida是国外的软件,是收费的,

我们要使用ida pro

国内一般使用比较多的就是ida 7

分为32位,64位的,

###

C语言简单普及

数据类型:
//整型
int a = 100;
//字符串
char *s = "yuanrenxue.com";
//浮点型
float = "3.14";
//双精度浮点型
double = "3.141592633764862";
//指针
int *a_add = &a;

这个指针,重点理解一下,

上面这是定义一个指针,int *a_add = &a;,

print(add)  这是打印内存的地址,比如是0x10000

print(*add) 这是打印内存地址里面的具体的值,比如是100  

//字符串常量 不能修改
const char *ss = "hello";
//数组
int num[5];
char name[5];
//清空
name = 0;
//c++
MD5::MD5()
std::__ndk1::init()


*a_add + 1
//1个字节(Byte) = 8位(Bit) 1K=1024B 1M = 1024K 1G = 1024M 1T = 1024G
int8_t //占8位 1个字节
int16_t //占16位 2个字节

###

什么是NDK开发

--就是可以使用c或者c++进行so库的开发
Android NDK:Android NDK 是一套允许您使用 C 和 C++ 等语言,以原生代码实现部分应用的工具集
用来做Native开发
.so文件
官方网站:https://developer.android.com/ndk

###

Java如何调用so库里的方法/函数

什么是JNI
JNI是Java Native Interface的缩写,用Java调用so库就叫着JNI。如下
 
//在Java中申明一个Native方法
public static native String securityCheck(Context context, String str);
 
//用System.loadLibrary()加载so库 全称是 libnative-lib.so
static {
System.loadLibrary("native-lib");
}
所以是把前面的lib和后面的so省略了
 
 
(11) .so文件里对应的securityCheck函数名称是:
Java_com_yaotong_crackme_MainActivity_securityCheck()
Java_类名_方法名()
示例演示 crackme
 
但是这个名字可能是不一样的,
(22). .so文件里对应的函数名称不一致:(IDA静态调试后再讲)
这种情况叫着:手动注册native方法
函数对应的名称是在 JNI_ONLoad()函数里注册
 
 
System.loadLibrary()加载so文件流程:
1,先读取so文件的.init_array段
2,再执行JNI_OnLoad函数
3,JNI_ONLoad是.so文件的初始函数
4,然后调用具体的native方法 

#####

ida静态调试

案例,之前有一个飞船自毁的apk,

 我们静态调试点击new,

如果是动态调试点击go

点击new之后,选择so文件打开,

###

做成的面板函数列表很重要!!!

左边可以搜索方法的名字,

面板左侧函数列表可以查看每个函数的偏移量(相较于.so文件头的偏移量)

###

F5键(windows fn+F5) 把汇编代码转成C代码

我们看不懂,可以点击F5,然后就可以看到一个c语言的代码,如下图,

你想要看汇编,那就点击这个c语言的某一个值,就跳转到了汇编语言那里了

export是导出函数,这个是很重要的,可以暴露的接口

###

ctrl + s 查看so文件段信息

在汇编语言界面,点击ctrl+s,可以弹出这个段

 这个init段就是在初始化,

System.loadLibrary()加载so文件流程:
1,先读取so文件的.init_array段
2,再执行JNI_OnLoad函数
3,JNI_ONLoad是.so文件的初始函数
4,然后调用具体的native方法 
###
shift+F12 查看so文件中所有常量字符串的值 有的密码之类的可能就在这里面
在汇编语言的界面,

 有时候一些密码就会在这个里面,

###

我们F5转成了c语言,但是还是有很多看不懂的,

 这个时候我们可以做一些还原,

还原方法:

- JNI函数方法名还原 选中v3 按y建 作用(类型还原)
v3 + 676 前面是一个指针 比如 *(_DWORD *)v3 + 676 表示 v3 是JNIEnv *类型
形如 *(_DWORD *)vX + YYY 皆是
可选中v3 按y键进行类型替换,替换为JNIEnv *

 

 这个就是反向在调用java的代码

然后就可以进行分析了
你看最后的return 0, 这个就是java代码调用之后返回的值,
0就是FALSE
v8就是1,就是TRUE,
###
这些代码都是v1,v2,v3,看起来很烦躁,
我可以可以重命名代码
如何重命名,
选中变量,右键,rename

 ###

 我们看到v5,就是我们输入的密码,这个是从java调用的,获取到了我们输入的密码

我们可以把v5改名,input_password

v7是哪里来的,是v6给的,v6是一个常量,我们可以把v6改为real_password

这样就更加的清晰了

###

我们还可以加注释,

因为我们可能是一天分析不完,我们可以加注释,

如何注释?点击键盘的斜杠,/

 

 这就是我们保存的我们改名字和加注释的文件,我们下次就可以打开之后继续进行分析了

###

java调用so库里面的方法,这个调用的方法名可能是不一样的,
(22). .so文件里对应的函数名称不一致:
这种情况叫着:手动注册native方法
函数对应的名称是在 JNI_ONLoad()函数里注册

如何手动注册?

这次是换了一个app了,

 你用jadx打开了文件,是调用的so文件的getAS,

但是你打开so文件,你会发现没有这个so文件的方法名,

你搜索JNI_ONLoad,就是在这里进行了手动注册

###

 我们使用上面的JNIENV进行还原,注意还原的格式,不要胡乱还原,!!!

RegisterNative就是这个把名字注册成为了另外一个名字,

###

上面就是ida静态调试了

这个时候我们还可以打开一个ida,进行动态调试

这样就是静态调试看c代码,

动态调试看汇编,然后一步一步往下看,

这就是ida双开,

密码就是内置到so文件的,

我们之前是直接绕过了密码,现在去so文件,直接获取他的密码,如果操作?

###

###

原文地址:https://www.cnblogs.com/andy0816/p/15100492.html