
1.了解Frida-Native-Hook
2.借助ida脚本实现一键式hook
1.教程Demo(更新)
2.jadx-gui
3.VS Code
Process
对象代表当前被Hook的进程,能获取进程的信息,枚举模块,枚举范围等
Module
对象代表一个加载到进程的模块(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件),能查询模块的信息,如模块的基址、名称、导入/导出的函数等
Memory
是一个工具对象,提供直接读取和修改进程内存的功能,能够读取特定地址的值、写入数据、分配内存等
简而言之,导出表告诉其他程序:“这些是我提供的功能。”,而导入表则表示:“这些是我需要的功能。”。
函数地址计算
dlopen源码
android_dlopen_ext源码

IDA&Frida 学习
作业反馈贴
待更新
百度云
阿里云
哔哩哔哩
教程开源地址
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压
FRIDA-API使用篇:rpc、Process、Module、Memory使用方法及示例
IDA&Frida 学习
Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控
API |
含义 |
Process.id |
返回附加目标进程的 PID |
Process.isDebuggerAttached() |
检测当前是否对目标程序已经附加 |
Process.enumerateModules() |
枚举当前加载的模块,返回模块对象的数组 |
Process.enumerateThreads() |
枚举当前所有的线程,返回包含 id , state , context 等属性的对象数组 |
API |
含义 |
Module.load() |
加载指定so文件,返回一个Module对象 |
enumerateImports() |
枚举所有Import库函数,返回Module数组对象 |
enumerateExports() |
枚举所有Export库函数,返回Module数组对象 |
enumerateSymbols() |
枚举所有Symbol库函数,返回Module数组对象 |
Module.findExportByName(exportName)、Module.getExportByName(exportName) |
寻找指定so中export库中的函数地址 |
Module.findBaseAddress(name)、Module.getBaseAddress(name) |
返回so的基地址 |
方法 |
功能 |
Memory.copy() |
复制内存 |
Memory.scan() |
搜索内存中特定模式的数据 |
Memory.scanSync() |
同上,但返回多个匹配的数据 |
Memory.alloc() |
在目标进程的堆上申请指定大小的内存,返回一个NativePointer |
Memory.writeByteArray() |
将字节数组写入一个指定内存 |
Memory.readByteArray |
读取内存 |
function
hookTest1(){
Java.perform(
function
(){
var
imports = Module.enumerateImports(
"lib52pojie.so"
);
for
(
var
i =0; i < imports.length;i++){
if
(imports[i].name ==
"vip"
){
console.log(JSON.stringify(imports[i]));
console.log(imports[i].address);
}
}
var
exports = Module.enumerateExports(
"lib52pojie.so"
);
for
(
var
i =0; i < exports.length;i++){
console.log(JSON.stringify(exports[i]));
}
})
}
function
hookTest1(){
Java.perform(
function
(){
var
imports = Module.enumerateImports(
"lib52pojie.so"
);
for
(
var
i =0; i < imports.length;i++){
if
(imports[i].name ==
"vip"
){
console.log(JSON.stringify(imports[i]));
console.log(imports[i].address);
}
}
var
exports = Module.enumerateExports(
"lib52pojie.so"
);
for
(
var
i =0; i < exports.length;i++){
console.log(JSON.stringify(exports[i]));
}
})
}
function
hookTest2(){
Java.perform(
function
(){
var
helloAddr = Module.findExportByName(
"lib52pojie.so"
,
"Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"
);
if
(helloAddr !=
null
){
Interceptor.attach(helloAddr,{
onEnter:
function
(args){
var
jString = Java.cast(args[2], Java.use(
'java.lang.String'
));
console.log(
"参数:"
, jString.toString());
var
JNIEnv = Java.vm.getEnv();
var
originalStrPtr = JNIEnv.getStringUtfChars(args[2],
null
).readCString();
console.log(
"参数:"
, originalStrPtr);
},
onLeave:
function
(retval){
var
returnedJString = Java.cast(retval, Java.use(
'java.lang.String'
));
console.log(
"返回值:"
, returnedJString.toString());
}
})
}
})
}
function
hookTest2(){
Java.perform(
function
(){
var
helloAddr = Module.findExportByName(
"lib52pojie.so"
,
"Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"
);
if
(helloAddr !=
null
){
Interceptor.attach(helloAddr,{
onEnter:
function
(args){
var
jString = Java.cast(args[2], Java.use(
'java.lang.String'
));
console.log(
"参数:"
, jString.toString());
var
JNIEnv = Java.vm.getEnv();
var
originalStrPtr = JNIEnv.getStringUtfChars(args[2],
null
).readCString();
console.log(
"参数:"
, originalStrPtr);
},
onLeave:
function
(retval){
var
returnedJString = Java.cast(retval, Java.use(
'java.lang.String'
));
console.log(
"返回值:"
, returnedJString.toString());
}
})
}
})
}
function
hookTest3(){
Java.perform(
function
(){
var
helloAddr = Module.findExportByName(
"lib52pojie.so"
,
"Java_com_zj_wuaipojie_util_SecurityUtil_checkVip"
);
console.log(helloAddr);
if
(helloAddr !=
null
){
Interceptor.attach(helloAddr,{
onEnter:
function
(args){
args[0] = ptr(1000);
console.log(args[0]);
},
onLeave:
function
(retval){
retval.replace(20000);
console.log(
"retval"
,retval.toInt32());
}
})
}
})
}
function
hookTest3(){
Java.perform(
function
(){
var
helloAddr = Module.findExportByName(
"lib52pojie.so"
,
"Java_com_zj_wuaipojie_util_SecurityUtil_checkVip"
);
console.log(helloAddr);
if
(helloAddr !=
null
){
Interceptor.attach(helloAddr,{
onEnter:
function
(args){
args[0] = ptr(1000);
console.log(args[0]);
},
onLeave:
function
(retval){
retval.replace(20000);
console.log(
"retval"
,retval.toInt32());
}
})
}
})
}
function
hookTest2(){
Java.perform(
function
(){
var
helloAddr = Module.findExportByName(
"lib52pojie.so"
,
"Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"
);
if
(helloAddr !=
null
){
Interceptor.attach(helloAddr,{
onEnter:
function
(args){
var
JNIEnv = Java.vm.getEnv();
var
originalStrPtr = JNIEnv.getStringUtfChars(args[2],
null
).readCString();
console.log(
"参数:"
, originalStrPtr);
var
modifiedContent =
"至尊"
;
var
newJString = JNIEnv.newStringUtf(modifiedContent);
args[2] = newJString;
},
onLeave:
function
(retval){
var
returnedJString = Java.cast(retval, Java.use(
'java.lang.String'
));
console.log(
"返回值:"
, returnedJString.toString());
var
JNIEnv = Java.vm.getEnv();
var
modifiedContent =
"无敌"
;
var
newJString = JNIEnv.newStringUtf(modifiedContent);
retval.replace(newJString);
}
})
}
})
}
function
hookTest2(){
Java.perform(
function
(){
var
helloAddr = Module.findExportByName(
"lib52pojie.so"
,
"Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"
);
if
(helloAddr !=
null
){
Interceptor.attach(helloAddr,{
onEnter:
function
(args){
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课