首页
社区
课程
招聘
[已解决]frida 如何hook so文件的函数 写脚本
发表于: 2022-4-13 15:47 10349

[已解决]frida 如何hook so文件的函数 写脚本

2022-4-13 15:47
10349

在IDA查看 so
hello-jni里有decrypt函数

 

希望能hook这个函数 得到想要的结果。但查阅网络上的资料发现还是得不到

 

脚本尝试

无论8FF0还是83A0 都没成功 IDA32和64的区别

 

是希望hook 函数 _key_decrypt ,但不知道如何写法
有没有懂frida的大佬指点一下,感谢
(备注:个人对ida只在于“看”其实不懂如何操作)


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-4-14 16:13 被万事笔通编辑 ,原因: 已解决
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 3485
活跃值: (4769)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
首先看ida的反汇编,像是thumb指令集,地址得额外加一,另外你得确定so已经加载了,再执行hook操作。
2022-4-13 16:08
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
wx_hc 首先看ida的反汇编,像是thumb指令集,地址得额外加一,另外你得确定so已经加载了,再执行hook操作。
是的 用真机有显示地址 应该是加载了吧  [*] soAddr:0xda9cd000
[*] HelloAddr:0xda9d5ff1  加1和没加1都尝试过 ,就是出了上面这两行只有光标闪烁  用64位的就报错了
{'type': 'error', 'description': 'Error: unable to intercept function at 0xda9d53a1; please file a bug', 'stack': 'Error: unable to intercept function at 0xda9d53a1; please file a bug\n    at value (frida/runtime/core.js:367)\n    at <anonymous> (/script1.js:16)\n    at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12)\n    at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:238)\n    at <anonymous> (frida/node_modules/frida-java-bridge/index.js:213)\n    at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:12)\n    at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:232)\n    at perform (frida/node_modules/frida-java-bridge/index.js:192)\n    at <eval> (/script1.js:17)', 'fileName': 'frida/runtime/core.js', 'lineNumber': 367, 'columnNumber': 1}
2022-4-13 16:26
0
雪    币: 122
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
用ida先去看这个函数的签名,脚本根据函数签名去hook
2022-4-13 17:05
0
雪    币: 3485
活跃值: (4769)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
万事笔通 是的 用真机有显示地址 应该是加载了吧 [*] soAddr:0xda9cd000 [*] HelloAddr:0xda9d5ff1 加1和没加1都尝试过 ,就是出了上面这两行只有光标闪烁 用 ...
那32位的hook就是成功了,没打印其他log,是不是函数并没有被调用。
2022-4-13 17:39
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
波什 用ida先去看这个函数的签名,脚本根据函数签名去hook
对ida只在懂于 按F5
2022-4-13 18:12
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
wx_hc 那32位的hook就是成功了,没打印其他log,是不是函数并没有被调用。
嗯 就是不清楚具体情况 对脚本写法也是 依葫芦画瓢
2022-4-13 18:16
0
雪    币: 2058
活跃值: (1631)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
万事笔通 嗯 就是不清楚具体情况 对脚本写法也是 依葫芦画瓢

附加没用、启动瞬间就调用了。等附加上。晚800年了。

只能孵化启动


启动命令

frida -U -l 新建文本文档.txt -f com.sumavision.sanping.gudou --no-pause


附上一部分输出结果

------------------------------------------------------------------------------

Spawned `com.sumavision.sanping.gudou`. Resuming main thread!

[Redmi 4X::com.sumavision.sanping.gudou]-> start-------------->

a is called

a ret value is Y29tLnN1bWF2aXNpb24uc2FucGluZy5ndWRvdQ

b is called

_decrypt_key- after --->

           0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF

ffde9c5c  08 90 65 f5 a0 92 f9 f3 ab 4c 63 f5 00 00 59 00  ..e......Lc...Y.

ffde9c6c  00 44 f8 f3 a0 92 f9 f3 30 92 f9 f3 00 44 f8 f3  .D......0....D..

ffde9c7c  87 15 4d 47 c0 9c de ff b4 9c de ff 00 00 00 00  ..MG............

ffde9c8c  a8 9c de ff 08 90 65 f5 00 00 59 00 00 00 43 00  ......e...Y...C.

_decrypt_key- after --->Sr9!8MI!N!2G5MVoP�˛Pr���:�vx�s�ָ��t;q��""�?�ʡh�

�0u�ᧇMG@���

_decrypt_key- resutl --->0

b ret value is Sr9!8MI!N!2G5MVo

aes decrypt arg1 = [59,18,-85,-85,-55,-119,-70,3,69,-126,-91,9,127,-34,63,100],

arg2 =Sr9!8MI!N!2G5MVo,res=>pVW4U*FlS


var aesResult = 'pVW4U*FlS';

sha1('sumasalt-app-portal' + aesResult +'16498488196762281430freeuser').substr(0

,10)

/*hmac =  'f4cc8ce40a'*/


GetHmac arg =freeuser,ret = f4cc8ce40a,1649848819,6762281430


------------------------------------------------------------------------------


hmac 计算方法 







function bytesToString(arr) {
    var str = '';
    arr = new Uint8Array(arr);
    for (var i in arr) {
        str += String.fromCharCode(arr[i]);
    }
    return str;
}
setImmediate(function () {
    Java.perform(function () {
        let a = Java.use("h.x.a.h.e.a");
        a.a.overload('[B', '[B').implementation = function (bArr, bArr2) {
            let ret = this.a(bArr, bArr2);
            console.log('aes decrypt arg1 = [' + bArr + '], arg2 =' + bytesToString(bArr2) + ',res=>' + bytesToString(ret));
console.log('\r\nvar aesResult = \''+bytesToString(ret)+'\';');
            return ret;
        };
        let d = Java.use("h.x.a.h.e.d");
        d.a.overload('java.lang.String').implementation = function (str) {
            let ret = this.a(str);
            
console.log('sha1(\'sumasalt-app-portal\' + aesResult +\'' +ret[1]+ret[2]+str+'\').substr(0,10)' );
console.log('/*hmac =  \''+ ret[0] +'\'*/\r\n' );
console.log('GetHmac arg =' + str + ',ret = ' + ret);
            return ret;
        };
        let a1 = Java.use("h.y.e.n.a");
        a1.b.implementation = function () {
            console.log('b is called');
            var soAddr = Module.findBaseAddress("libhello-jni.so");
            var old_method = new NativeFunction(soAddr.add(0x8a0c), 'int', ['int']);
            Interceptor.replace(soAddr.add(0x8a0c), new NativeCallback(function (a) {
                console.log('_decrypt_key- after --->\n' + hexdump(new NativePointer(a) /*.readPointer()*/ , {
                    offset: 0,
                    length: 64,
                    header: true,
                    ansi: true
                }));
                var result = old_method(a);
                console.log("_decrypt_key- after --->" + new NativePointer(a).readCString());
                console.log("_decrypt_key- resutl --->" + result);
                return result;
            }, 'int', ['int']));
            let ret = this.b();
            console.log('b ret value is ' + ret);
            return ret;
        };
        a1.a.implementation = function () {
            console.log('a is called');
            let ret = this.a();
            console.log('a ret value is ' + ret);
            return ret;
        };
        console.log('start-------------->');
    });
});


2022-4-13 19:38
1
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
youxiaxy 附加没用、启动瞬间就调用了。等附加上。晚800年了。只能孵化启动启动命令frida -U -l 新建文本文档.txt -f com.sumavision.sanping.gudou --no-paus ...
大神 顶礼膜拜
2022-4-13 19:50
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
能请教一下8a0c 这个值得是怎么找到的吗
2022-4-13 19:55
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
youxiaxy 附加没用、启动瞬间就调用了。等附加上。晚800年了。只能孵化启动启动命令frida -U -l 新建文本文档.txt -f com.sumavision.sanping.gudou --no-paus ...
能请教一下8a0c 这个值得是怎么找到的吗
2022-4-13 19:57
0
雪    币: 838
活跃值: (3995)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
万事笔通 能请教一下8a0c 这个值得是怎么找到的吗
可以看一下我发的ida脚本 很好用
2022-4-13 20:04
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
王麻子本人 可以看一下我发的ida脚本 很好用
好的 感谢 暂时ida除了安装和设置好环境 其它真的不清楚 希望多些小白教程
2022-4-13 20:10
0
雪    币: 2058
活跃值: (1631)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
万事笔通 能请教一下8a0c 这个值得是怎么找到的吗
换成        0x8ff1    也是可以的。 0x8a0c  不用+1     而 0x8ff0需要 +1
2022-4-13 21:56
0
雪    币: 2058
活跃值: (1631)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
万事笔通 能请教一下8a0c 这个值得是怎么找到的吗


调用点

首先跳到这里  这个相当于一个跳板函数  这里 很清楚的标明了    真实函数+1    所以hook真实函数的时候也要  +1 ,但是hook这个跳板就不需要了。

最终才进入    真正的函数  




2022-4-13 22:10
0
雪    币: 95
活跃值: (188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
youxiaxy 调用点首先跳到这里&nbsp; 这个相当于一个跳板函数&nbsp; 这里 很清楚的标明了&nbsp; &nbsp; 真实函数+1&nbsp; &nbsp ...
好的 感谢细心指导
2022-4-14 08:08
0
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
最后怎么解决的啊
2024-3-10 15:55
0
游客
登录 | 注册 方可回帖
返回
//