应对一些比较复杂的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
));
});
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)