失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 基于frida的so函数hook实战

基于frida的so函数hook实战

时间:2023-07-30 23:13:32

相关推荐

基于frida的so函数hook实战

文章转载于: /hao5335156/article/details/113475875

方便以后自己学习,回顾知识点。

1.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

2.寻找要hook函数的偏移地址

将要hook的so(libjnitest.so)拖进ida

上图可以看到:在导出函数窗口可以直接看到函数"test_add"偏移地址函数名(这里可以通过函数名或者地址进行hook),非导出函数只能通过地址hook;这里我们用地址hook的方法(图中表明hook的函数偏移为0x00000680函数地址 = so基地址 + 函数偏移

要注意:如果Thumb 指令, hook 的偏移地址需要进行 +1 操作, so基地址在/proc/<pid>/maps中可查看)

关于so文件当中的函数,分为导出函数未导出函数两种,导出函数打开IDA后能够在导出表中找到的函数就是导出函数,未导出函数则在导出表中寻找不到,一般来说静态编写的native函数都能在导出表中寻找到,而动态加载的则无法在导出表中发现!!!

3.编写frida脚本

import fridaimport sysjscode = """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") //对函数名hookInterceptor.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()

4.效果验证

启动frida-server后进行,启动端口转发

adb forward tcp:27043 tcp:27043adb forward tcp:27042 tcp:27042

然后执行python脚本(frida脚本),接着启动应用:

符合retval.replace(100); //替换返回值为100预期,即小写x处显示为d,即100.

参考:

/aWxvdmVseXc0/p/12463319.html

https://refate.github.io//01/13/rida_install/

如果觉得《基于frida的so函数hook实战》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。