Frida-Hook使用

Frida-Hook使用

这篇文章主要介绍使用Frida进行Hook的使用方法

执行Hook

启动时hook

1
frida -U -l xxx.js -f com.xxxxx --no-pause

启动apk后hook

1
2
frida -U -f com.test.apk --no-pause
%load test.js

Java层hook

使用java平台->java.perform(function () {})

获取java类 ->java.use(className)

调用Class类中的Method方法-> Class.Method.implementation = function(){}

普通方法

源代码如下:

1
2
3
4
5
6
7
8
9
10
11
package com.example.xxx;


public class Student {
static public int Add(int a,int b)
{
return a+b;
}

}

hook代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function main()
{
java.perform(
function(){
var student = java.use("com.example.xxx.Student");
student.Add.implementation=function(a,b)//重写Add方法
{
a=123;
b=456;
var res = this.Add(a,b);#调用原来的Add方法
console.log(a,b,res);
return res;
}
});
}
setImmediate(main)

So层Hook

有导出函数

通过导出函数名称找到函数地址即可进行hook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// # com.xfast.hgr:bg


function main()
{
Java.perform(function () {

var JavaString = Java.use("java.lang.String");
var adk_addr = Module.findExportByName("libnativelib.so","Java_com_faster_nativelib_NativeLib_adk");
console.log("[*] 目标hook函数的内存地址是: " + adk_addr);
// var aes_128 = new NativeFunction(aes_addr , 'pointer', ['pointer', 'pointer']); // 返回值,参数

Interceptor.attach(adk_addr,{
//在hook函数之前执行的语句
onEnter: function(args)
{
console.log("[*] Success Hook So!");
},
//在hook函数之后执行的语句
onLeave:function(retval)
{
console.log("[*] 原始的So层函数返回值是:"+ Java.vm.getEnv().getStringUtfChars(retval,null).readCString());
// var change=1;
// retval.replace(change);
// console.log("[*] 篡改的So层函数返回值是:"+retval);
}
});

});
}
// frida print String 类型返回值
// //方式一
// var element = Java.cast(obj,Java.use("java.lang.String"));
// //方式二
// var element = Java.vm.getEnv().getStringUtfChars(obj,null).readCString();

setImmediate(main)

无导出函数

.so 文件被去符号,无法找到对应函数名称,通过偏移地址调用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function hookTest9()
{
//so名称
var so_name="libnative-lib.so";
//要Hook的函数偏移
var fun_off=0x7078;

//加载到内存后,函数地址=so地址+函数偏移
var so_add=Module.findBaseAddress(so_name);
var add_func=parseInt(so_add,16)+fun_off;
var ptr_fun=new NativePointer(add_func);

Interceptor.attach(ptr_fun,{
//在hook函数之前执行
onEnter:function(args)
{
console.log("hook enter");
},
//在hook函数之后执行
onLeave:function(retval)
{
console.log("hook leaver");
}

});
}

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信