首页
社区
课程
招聘
[求助]frida为何hook不到so中的未导出函数(地址没错的情况下)?
发表于: 2019-9-17 15:42 12315

[求助]frida为何hook不到so中的未导出函数(地址没错的情况下)?

2019-9-17 15:42
12315
jstring __fastcall Java_com_yxcorp_gifshow_util_CPU_getClock(JNIEnv *env, jobject thiz, jobject arg1, jbyteArray arg2, jint arg3)
{
  char **v5; // r6
  jbyteArray v6; // r5
  jobject v7; // r4
  char *v8; // r8
  char *v10; // r4
  int v11; // r9
  int v12; // r10
  const char *v13; // r4
  signed int v14; // r4
  signed int v15; // r9
  int v16; // [sp+0h] [bp-C0h]
  char *v17; // [sp+4h] [bp-BCh]
  char v18; // [sp+10h] [bp-B0h]
  unsigned __int8 v19; // [sp+68h] [bp-58h]
  unsigned __int8 v20; // [sp+69h] [bp-57h]
  unsigned __int8 v21; // [sp+6Ah] [bp-56h]
  unsigned __int8 v22; // [sp+6Bh] [bp-55h]
  unsigned __int8 v23; // [sp+6Ch] [bp-54h]
  unsigned __int8 v24; // [sp+6Dh] [bp-53h]
  unsigned __int8 v25; // [sp+6Eh] [bp-52h]
  unsigned __int8 v26; // [sp+6Fh] [bp-51h]
  unsigned __int8 v27; // [sp+70h] [bp-50h]
  unsigned __int8 v28; // [sp+71h] [bp-4Fh]
  unsigned __int8 v29; // [sp+72h] [bp-4Eh]
  unsigned __int8 v30; // [sp+73h] [bp-4Dh]
  unsigned __int8 v31; // [sp+74h] [bp-4Ch]
  unsigned __int8 v32; // [sp+75h] [bp-4Bh]
  unsigned __int8 v33; // [sp+76h] [bp-4Ah]
  unsigned __int8 v34; // [sp+77h] [bp-49h]
  char s; // [sp+78h] [bp-48h]
  __int16 v36; // [sp+7Ah] [bp-46h]
  int v37; // [sp+7Ch] [bp-44h]
  int v38; // [sp+80h] [bp-40h]
  int v39; // [sp+84h] [bp-3Ch]
  int v40; // [sp+88h] [bp-38h]
  int v41; // [sp+8Ch] [bp-34h]
  int v42; // [sp+90h] [bp-30h]
  int v43; // [sp+94h] [bp-2Ch]

  v5 = (char **)env;
  v6 = arg2;
  v7 = arg1;
  if ( !arg2 )
    return 0;
  if ( !dword_5078 )
  {
    v8 = (char *)sub_9D0(&unk_3844, 32);
    dword_5074 = sub_CA8(v5, (int)v7, v8);
    free(v8);
    dword_5078 = 1;
  }
  if ( dword_5074 )
    return 0;
  v10 = *v5;
  v11 = (*((int (__fastcall **)(char **, jbyteArray, _DWORD))*v5 + 184))(v5, v6, 0);
  v17 = v10;
  v12 = (*((int (__fastcall **)(char **, jbyteArray))v10 + 171))(v5, v6);
  v13 = (const char *)dword_5070;
  if ( !dword_5070 )
  {
    v13 = (const char *)sub_9D0(&unk_3834, 16);
    dword_5070 = (int)v13;
  }
  _aeabi_memclr8(&s, 33);
  v14 = strlen(v13);
  sub_158C(&v18);
  v16 = v11;
  sub_15BC(&v18, v11, v12);
  if ( v14 >= 1 )
  {
    v15 = 0;
    do
    {
      sprintf(&s, "%c%c", *(unsigned __int8 *)(dword_5070 + v15), *(unsigned __int8 *)(dword_5070 + v15 + 1), v16);
      sub_15BC(&v18, &s, 2);
      v15 += 2;
    }
    while ( v15 < v14 );
  }
  sub_164C(&v18);
  sprintf(&s, "%02x", v19);
  sprintf((char *)&v36, "%02x", v20);
  sprintf((char *)&v37, "%02x", v21);
  sprintf((char *)((unsigned int)&s | 6), "%02x", v22);
  sprintf((char *)&v38, "%02x", v23);
  sprintf((char *)&v38 + 2, "%02x", v24);
  sprintf((char *)&v39, "%02x", v25);
  sprintf((char *)&v39 + 2, "%02x", v26);
  sprintf((char *)&v40, "%02x", v27);
  sprintf((char *)&v40 + 2, "%02x", v28);
  sprintf((char *)&v41, "%02x", v29);
  sprintf((char *)&v41 + 2, "%02x", v30);
  sprintf((char *)&v42, "%02x", v31);
  sprintf((char *)&v42 + 2, "%02x", v32);
  sprintf((char *)&v43, "%02x", v33);
  sprintf((char *)&v43 + 2, "%02x", v34);
  (*((void (__fastcall **)(char **, jbyteArray, int, signed int))v17 + 192))(v5, v6, v16, 2);
  return (jstring)(*((int (__fastcall **)(char **, char *))v17 + 167))(v5, &s);
}

我想hook sub_9d0这个函数查看输入和输出,hook代码如下,地址也是使用getClock绝对地址-相对地址+9d0 然后运行代码之后没有函数的任何输入和输出,请问是地址原因还是其实原因导致没有输入和输出呢。。。

hook_native_get_clock = '''
Java.perform(function () {
    send('native_hook')
    var nativePointer = Module.getExportByName('libcore.so','Java_com_yxcorp_gifshow_util_CPU_getClock');
    var basePointer = nativePointer.sub(0x1240);
    send('nativePointer:'+nativePointer);
    send('basePointer:'+basePointer);
    var sub_9D0 = basePointer.add(0x9D0);
    Interceptor.attach(sub_9D0,{
        onEnter:function(args){
            send('so hook success!');
            send('args[0]: '+ args[0]);
            send('args[1]: '+ args[1]);
        },
        onLeave:function(res){
            send('res: ' + res);
        }
    });
});
'''

对了 补充一点:是Interceptor.attach下之后就没有任何输入输出了,然后地址应该也是没问题的,因为我试了+1或者不+1不管从导入函数还是so基地取获得地址其实都一样,我想知道是否还有其他原因。。。函数也是调用了的,因为hook导出函getClock数没问题


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-9-19 11:11 被Hiyokunotori编辑 ,原因: 明确表达
收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 4831
活跃值: (479)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
var baseAddr = Module.findBaseAddress('libcore.so');
var funcAddr = baseAddr.add(0x9d0);
Interceptor.attach(funcAddr,{
    onEnter: function(args){
    ....
},
    onLeave: function(retval){
    .....
}

});
方式简单点?
最后于 2019-9-18 09:01 被xiaokangpwn编辑 ,原因:
2019-9-17 17:25
0
雪    币: 182
活跃值: (435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
xiaokangpwn var&nbsp;baseAddr&nbsp;=&nbsp;Module.findBaseAddress('libcore.so'); var&nbsp;funcAd ...
还是不行。。。。而且如果根据so的地址话最后是不是还要+1的
2019-9-17 17:48
0
雪    币: 25
活跃值: (1096)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
var baseAddr = Module.findBaseAddress('libcore.so');
var funcAddr = baseAddr.add(0x9d0);
2019-9-17 18:56
0
雪    币: 182
活跃值: (435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
繁华皆成空 var baseAddr = Module.findBaseAddress('libcore.so'); var funcAddr = baseAddr.add(0x9d0);
不行 仍然没有任何输出和输入。。。
2019-9-17 23:58
0
雪    币: 4831
活跃值: (479)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Hiyokunotori 还是不行。。。。而且如果根据so的地址话最后是不是还要+1的
thumb指令是需要+1的
最后于 2019-9-18 10:52 被xiaokangpwn编辑 ,原因:
2019-9-18 09:00
0
雪    币: 182
活跃值: (435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
xiaokangpwn thmub指令是需要+1的
是的 加1和不加1我都试了 都没有输入输出来的 除了地址之外还会有哪里有问题吗=-= hook导出函数都没问题 为导出的函数根据地址都没东西。。。
2019-9-18 10:10
0
雪    币: 1841
活跃值: (1285)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
8
用NativePoint()呢
2019-9-18 10:21
0
雪    币: 10940
活跃值: (7314)
能力值: ( LV12,RANK:219 )
在线值:
发帖
回帖
粉丝
9
var sub_9D0 = new NativePointer(Module.findBaseAddress("libcore.so")).add( 0x0009D0 + 1);
armeabi-v7a下地址需要+1 
2019-9-18 12:35
0
雪    币: 2270
活跃值: (5537)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
10
那个函数不一定执行了,,,不是有个if外层判断嘛
2019-9-18 13:06
0
雪    币: 182
活跃值: (435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
小白abc 那个函数不一定执行了,,,不是有个if外层判断嘛
他是解密函数 每个请求都需要执行到
2019-9-18 13:55
0
雪    币: 10940
活跃值: (7314)
能力值: ( LV12,RANK:219 )
在线值:
发帖
回帖
粉丝
12
Hiyokunotori 他是解密函数 每个请求都需要执行到
并不是 salt算了一次而已
2019-9-18 14:19
0
雪    币: 2270
活跃值: (5537)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
13
Hiyokunotori 他是解密函数 每个请求都需要执行到
建议用frida hook下外层if判断中的dword_5078的值去验证你的说法
2019-9-18 14:28
0
雪    币: 6879
活跃值: (3836)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
这个应该不是代码的问题,我之前在模拟器里跑frida也有这种情况 
问题在于Java.perform中的代码根本没有执行,你的代码里,应该连send('native_hook')这一行都没有相应的输出
如果是的话,建议使用Intercept.attach来hook,下面这个代码是hook  libc.so里的system_property_get函数的,未导出函数也是通过计算so的基址+函数偏移来hook的,注意thumb指令需要+1

var SysPropGetPtr = Module.findExportByName("libc.so", "__system_property_get");

Interceptor.attach(SysPropGetPtr, {
	onEnter:function(args) {
		var param = Memory.readUtf8String(args[0]);
		do something...
	}
});

2019-9-19 10:09
0
雪    币: 182
活跃值: (435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Lightal 这个应该不是代码的问题,我之前在模拟器里跑frida也有这种情况&nbsp;问题在于Java.perform中的代码根本没有执行,你的代码里,应该连send('native_hook')这一行 ...
谢谢你,怪我没说清楚,是Interceptor.attach 下的代码没有执行 然后我用的是真机,至于hook的函数肯定是执行了的,不然手机里的流程也不会继续走下去。。。
2019-9-19 11:13
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
大佬,你现在解决了吗?我和你遇到了同样的问题
2019-11-12 16:24
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这不是某手的吗,确实每次加密都会用到,直接用module的baseAddress吧
2019-11-28 17:41
0
雪    币: 13
活跃值: (420)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
18
thumb指令是需要-1的
2020-2-26 19:43
0
雪    币: 145
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19


最后于 2020-11-27 10:35 被Ive_406746编辑 ,原因:
2020-2-28 00:32
0
雪    币: 34
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
attach的进程不对
2020-2-28 01:25
0
游客
登录 | 注册 方可回帖
返回
//