标签:函数 hook 地址 so func frida addr
so源码
#include <string.h>
#include <jni.h>
#include"test.h"
jstring JNICALL Java_com_example_mi_demoso_JNITest_getStringFromJNI(JNIEnv* env, jobject jo)
{
char str[] = "x HelloWorld from JNI12345!";
int c = test_add(97,1);
str[0] = (char)c;
return (*env)->NewStringUTF(env, str);
}
int test_add(int a,int b){
return a+b;
}
文件名对应的文件偏移地址
上图可以看到:在导出函数窗口可以直接看到函数"test_add"的偏移地址和函数名(这里可以通过函数名或者地址进行hook),非导出函数只能通过地址hook;这里我们用地址hook的方法(图中表明hook的函数偏移为0x00000680,函数地址 = so基地址 + 函数偏移, so基地址在/proc/
import frida
import sys
jscode = """
Java.perform(function(){
var str_name_so = "libjnitest.so"; //需要hook的so名
var n_addr_func_offset = 0x00000680; //需要hook的函数的偏移
var n_addr_so = Module.findBaseAddress(str_name_so); //加载到内存后 函数地址 = so地址 + 函数偏移
var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset;
var ptr_func = new NativePointer(n_addr_func);
//var ptr_func = Module.findExportByName("libjnitest.so","test_add") //对函数名hook
Interceptor.attach(ptr_func,{
//onEnter: 进入该函数前要执行的代码,其中args是传入的参数,一般so层函数第一个参数都是JniEnv,第二个参数是jclass,从第三个参数开始是我们java层传入的参数
onEnter: function(args) {
send("Hook start");
send("args[2]=" + args[2]); //第一个传入的参数
send("args[3]=" + args[3]); //第二个参数
},
onLeave: function(retval){ //onLeave: 该函数执行结束要执行的代码,其中retval参数即是返回值
send("return:"+retval); //返回值
retval.replace(100); //替换返回值为100
}
});
});
"""
def printMessage(message,data):
if message['type'] == 'send':
print('[*] {0}'.format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.example.testso') #进程名
script = process.create_script(jscode)
script.on('message',printMessage)
script.load()
sys.stdin.read()
```**------------恢复内容开始------------**
[参考](https://blog.csdn.net/hao5335156/article/details/113475875)
###so源码
```c
#include <string.h>
#include <jni.h>
#include"test.h"
jstring JNICALL Java_com_example_mi_demoso_JNITest_getStringFromJNI(JNIEnv* env, jobject jo)
{
char str[] = "x HelloWorld from JNI12345!";
int c = test_add(97,1);
str[0] = (char)c;
return (*env)->NewStringUTF(env, str);
}
int test_add(int a,int b){
return a+b;
}
文件名对应的文件偏移地址
上图可以看到:在导出函数窗口可以直接看到函数"test_add"的偏移地址和函数名(这里可以通过函数名或者地址进行hook),非导出函数只能通过地址hook;这里我们用地址hook的方法(图中表明hook的函数偏移为0x00000680,函数地址 = so基地址 + 函数偏移, so基地址在/proc/
import frida
import sys
jscode = """
Java.perform(function(){
var str_name_so = "libjnitest.so"; //需要hook的so名
var n_addr_func_offset = 0x00000680; //需要hook的函数的偏移
var n_addr_so = Module.findBaseAddress(str_name_so); //加载到内存后 函数地址 = so地址 + 函数偏移
var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset;
var ptr_func = new NativePointer(n_addr_func);
//var ptr_func = Module.findExportByName("libjnitest.so","test_add") //对函数名hook
Interceptor.attach(ptr_func,{
//onEnter: 进入该函数前要执行的代码,其中args是传入的参数,一般so层函数第一个参数都是JniEnv,第二个参数是jclass,从第三个参数开始是我们java层传入的参数
onEnter: function(args) {
send("Hook start");
send("args[2]=" + args[2]); //第一个传入的参数
send("args[3]=" + args[3]); //第二个参数
},
onLeave: function(retval){ //onLeave: 该函数执行结束要执行的代码,其中retval参数即是返回值
send("return:"+retval); //返回值
retval.replace(100); //替换返回值为100
}
});
});
"""
def printMessage(message,data):
if message['type'] == 'send':
print('[*] {0}'.format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.example.testso') #进程名
script = process.create_script(jscode)
script.on('message',printMessage)
script.load()
sys.stdin.read()
------------恢复内容结束------------
标签:函数,hook,地址,so,func,frida,addr 来源: https://www.cnblogs.com/wzbk/p/15204763.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。