应对一些比较复杂的so文件分析的时候,简单的frida应用已经不能满足我们的需求了。有时候为了定位关键位置,需要做很多复杂的调试,好的工具往往会事半功倍。
内存页是分权限的,权限通常用rwx来表示,r代表可读,w代表可写,x代表可执行。计算出指定内存地址后,在操作之前可以先用Memory的protect的方法来修改对应的内存区域权限。
计算出地址后,可以用NativePointer的readCString来读取字符串

计算出指定内存地址后,可以使用hexdump函数,显示一段hex的内存数据。
计算出指定内存地址后,可以使用NativePointer的readByteArray方法读取一段内存数据。

计算出指定内存地址后,可以使用NativePointer的writeByteArray。他的参数接收的是一个字节数组,所有我们就写几个工具函数。
计算出地址后,写入字符串xibei
修改前和修改后的样子

在逆向分析的过程中,有时需要主动调用一些so函数,这时候需要自己构建新数据来传递参数。通常不能直接写,需要先分配内存,在写入。可以使用Memory中的alloc函数来分配内存。

某些APP应用程序会对so文件进行加固,或者对SO函数中的字符串进行加密。而加载到内存中的so函数一般都是解密的状态,这时候可以使用内存读写的方法,将so函数从内存中保存下来。
通过传入的模块名,扎到对应的Module,得到模块基址,模块大小等信息。然后生成保存的路径,接着使用Memory.protect修改内存权限,再使用NativePointer的readByteArray方法读取整个so文件对应的内存数据。
fopen 打开文件,fputs 写入文件,fgets 得到文件,fclose 关闭文件
function hook_so() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
console.log("addr :",addr);
Memory.protect(addr.add(0x3c30),16,'rwx');
});
}
function hook_so() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
console.log("addr :",addr);
Memory.protect(addr.add(0x3c30),16,'rwx');
});
}
function hook_so() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(v1.readCString());
});
}
[Google Pixel 2 XL::com.example.hellojni_sign2]-> N10__cxxabiv117__array_type_infoE
function hook_so() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(v1.readCString());
});
}
[Google Pixel 2 XL::com.example.hellojni_sign2]-> N10__cxxabiv117__array_type_infoE
function hook_so2() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(hexdump(v1));
});
}
[Google Pixel 2 XL::com.example.hellojni_sign2]->0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
72f01ee548 4e 31 30 5f 5f 63 78 78 61 62 69 76 31 31 37 5f N10__cxxabiv117_
72f01ee558 5f 61 72 72 61 79 5f 74 79 70 65 5f 69 6e 66 6f _array_type_info
72f01ee568 45 00 4e 31 30 5f 5f 63 78 78 61 62 69 76 31 31 E.N10__cxxabiv11
72f01ee578 36 5f 5f 65 6e 75 6d 5f 74 79 70 65 5f 69 6e 66 6__enum_type_inf
72f01ee588 6f 45 00 4e 31 30 5f 5f 63 78 78 61 62 69 76 31 oE.N10__cxxabiv1
72f01ee598 32 30 5f 5f 73 69 5f 63 6c 61 73 73 5f 74 79 70 20__si_class_typ
function hook_so2() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(hexdump(v1));
});
}
[Google Pixel 2 XL::com.example.hellojni_sign2]->0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
72f01ee548 4e 31 30 5f 5f 63 78 78 61 62 69 76 31 31 37 5f N10__cxxabiv117_
72f01ee558 5f 61 72 72 61 79 5f 74 79 70 65 5f 69 6e 66 6f _array_type_info
72f01ee568 45 00 4e 31 30 5f 5f 63 78 78 61 62 69 76 31 31 E.N10__cxxabiv11
72f01ee578 36 5f 5f 65 6e 75 6d 5f 74 79 70 65 5f 69 6e 66 6__enum_type_inf
72f01ee588 6f 45 00 4e 31 30 5f 5f 63 78 78 61 62 69 76 31 oE.N10__cxxabiv1
72f01ee598 32 30 5f 5f 73 69 5f 63 6c 61 73 73 5f 74 79 70 20__si_class_typ
function hook_so3() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(v1.readByteArray(32));
});
}
function hook_so3() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(v1.readByteArray(32));
});
}
function stringToBytes(str){
return hexToBytes(stringToHex(str));
}
function stringToHex(str){
return str.split("").map(function(c){
return ("0"+c.charCodeAt(0).toString(16)).slice(-2);
}).join("");
}
function hexToBytes(hex){
for (var bytes=[],c = 0; c < hex.length; c+=2)
bytes.push(parseInt(hex.substr(c,2),16));
return bytes;
}
function hexToString(hexStr){
var hex = hexStr.toString();
var str = '';
for (var i = 0; i < hex.length; i+=2)
str += String.fromCharCode(parseInt(hex.substr(i,2),16));
return str;
}
function stringToBytes(str){
return hexToBytes(stringToHex(str));
}
function stringToHex(str){
return str.split("").map(function(c){
return ("0"+c.charCodeAt(0).toString(16)).slice(-2);
}).join("");
}
function hexToBytes(hex){
for (var bytes=[],c = 0; c < hex.length; c+=2)
bytes.push(parseInt(hex.substr(c,2),16));
return bytes;
}
function hexToString(hexStr){
var hex = hexStr.toString();
var str = '';
for (var i = 0; i < hex.length; i+=2)
str += String.fromCharCode(parseInt(hex.substr(i,2),16));
return str;
}
function hook_so4() {
Java.perform(function(){
var addr = Module.findBaseAddress("libhello-jni.so");
var v1 = addr.add(0x2d548);
console.log(v1.readByteArray(32));
Memory.protect(v1,16,'rwx');
v1.writeByteArray(stringToBytes("xibei\0"));
console.log(v1.readByteArray(16));
});
}
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!