首页
社区
课程
招聘
6
[原创]介召几个frida在安卓逆向中使用的脚本以及延时Hook手法
发表于: 2019-1-7 17:34 25290

[原创]介召几个frida在安卓逆向中使用的脚本以及延时Hook手法

2019-1-7 17:34
25290

   frida是近几年才推出的一款全平台的逆向神器。功能上主要采用动态hook的方式,加入log,修改逻辑等。可以对java,native等hook。

   具体使用情况,谁用谁知道。废话不多说,直接上干货。

   这里仅仅讨论安卓上面的情况,其他平台的咱不做研究

    1、延时Hook
        安卓有一些多包的问题,另外有一些类是通过动态加载的方式来加载的。可能在hook触发的那个时间点,不会找到未加载的代码。
        这个时候,可以通过在class loader上面加hook的方式,在hook的代码下进行二次绑定加载。
       这里没有代码,需要各位同学自己尝试一下。
    2、打印调用栈
       调用栈,这个很有用。在分析的过程中,不一定会一定找到需要分析或者hook的函数。可能根据字符串等蛛丝马迹,仅仅找到一部分信息。
    使用java调用栈,就可以找到方法的调用关系。
      代码如下
      
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
Java.perform(function () {                                      
   var thread = Java.use('java.lang.Thread');
   var instance = thread.$new();
 
   function where(stack){
     var at = ""
     for (var i = 0; i < stack.length; i++){
         at += stack[i].toString() + "\n";
     }
 
     return at;
   }
 
   var ConnectionErrorMessages = Java.use("com.google.android.gms.common.internal.ConnectionErrorMessages");
   ConnectionErrorMessages.getErrorMessage.overload('android.content.Context','int').implementation = function(mContext,mI){
 
         console.log("gms i:"+ mI);
 
         var ret = this.getErrorMessage(mContext,mI);
 
         console.log("return:" + ret);
 
         var stack = instance.currentThread().getStackTrace();
         var full_call_stack = where(stack);
 
         console.log(full_call_stack);
 
         return ret;
   };
});   
如上所示,可以把所用调用了ConnectionErrorMessages.getErrorMessage这个方法的栈给打印出来。
3、关于java的重载 
  这个载frida中设计比较友好,如果不知道重载方法如何写。只需要写上方法名,运行一次,frida就会把所有的方法,通过错误日志的形式给打印出来。照抄即可。
  
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
Java.perform(function () {                                      
   var thread = Java.use('java.lang.Thread');
   var instance = thread.$new();
 
   function where(stack){
     var at = ""
     for (var i = 0; i < stack.length; i++){
         at += stack[i].toString() + "\n";
     }
 
     return at;
   }
 
   var ConnectionErrorMessages = Java.use("com.google.android.gms.common.internal.ConnectionErrorMessages");
   ConnectionErrorMessages.getErrorMessage.overload('android.content.Context','int').implementation = function(mContext,mI){
 
         console.log("gms i:"+ mI);
 
         var ret = this.getErrorMessage(mContext,mI);
 
         console.log("return:" + ret);
 
         var stack = instance.currentThread().getStackTrace();
         var full_call_stack = where(stack);
 
         console.log(full_call_stack);
 
         return ret;
   };
});   
如上所示,可以把所用调用了ConnectionErrorMessages.getErrorMessage这个方法的栈给打印出来。
3、关于java的重载 
  这个载frida中设计比较友好,如果不知道重载方法如何写。只需要写上方法名,运行一次,frida就会把所有的方法,通过错误日志的形式给打印出来。照抄即可。
  
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
39
40
41
    // overload 是用于定位hook哪一个方法的
 
    .overload()
    .overload('java.lang.String')
    .overload('android.app.Activity')
    .overload('int')
    .overload('[B'// byte array
    .overload('float')
    .overload('android.content.Context')
    .overload('[C')
    .overload('android.content.Context''android.view.View')
    .overload('android.app.Activity''com.cherrypicks.hsbcpayme.model.object.PayMeNotification')
    .overload('android.content.Context''boolean')
    .overload('android.content.Context''int')
    .overload('android.content.Context''java.lang.String')
    .overload('android.app.Activity''int')
    .overload('java.lang.String''java.lang.String')
    .overload('android.content.Context''android.graphics.Bitmap')
    .overload('java.lang.String''java.io.File')
    .overload('android.content.Context''java.lang.String''java.util.List')
    .overload('java.lang.String''java.lang.String''java.lang.String')
    .overload('java.lang.String''[B''[B')
    .overload('java.lang.String''java.lang.String''android.content.Context')
    .overload('android.app.Activity''com.cherrypicks.hsbcpayme.model.object.PayMeNotification''int')
    .overload('[B''[B''[B')
    .overload('android.content.Context''java.lang.String''java.lang.String')
    .overload('android.app.Activity''int''int''int''boolean')
 
 
// 一个列子
Java.perform(function () { 
    var AssetManager = Java.use("android.content.res.AssetManager");
    var FileInputStream = Java.use("java.io.FileInputStream");
    AssetManager.open.overload("java.lang.String").implementation = function(str) {
        send("hook asset")
        if(str.endsWith(".xxx")){
            return FileInputStream.$new("/data/local/tmp/xxxxx");
        }
        return this.open(str)
    }
});

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
Ram98
为你点赞~
2024-4-9 09:35
PLEBFE
为你点赞~
2023-1-31 02:30
jfztaq
为你点赞~
2020-3-28 08:27
xhyeax
为你点赞~
2019-11-26 00:19
CCkicker
为你点赞~
2019-1-9 16:23
deadxing
为你点赞~
2019-1-9 15:57
最新回复 (12)
雪    币: 1525
活跃值: (9999)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
2
最近也是在用frida来hook。但是只是简单的运用。感觉这样的js好陌生。没用过Module、Memory这些的。我想问下。这样的js运用的基础要去查什么用法啊?我查到的都是控制html相关的。
2019-1-7 21:54
1
雪    币: 735
活跃值: (361)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
牛逼
2019-1-8 09:18
1
雪    币: 735
活跃值: (361)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
破解门槛又降低了,哈哈哈
2019-1-8 09:19
1
雪    币: 138
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1
2
3
var Log = Java.use("android.util.Log");
var Throwable = Java.use("java.lang.Throwable");
console.log(Log.getStackTraceString(Throwable.$new()));
打堆栈不用那么麻烦,这样就行了
2019-1-8 17:51
3
雪    币: 105
活跃值: (624)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
var trace = Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress);
var offaddr = trace[0]; 
var offaddr1 = offaddr - 基址;
console.log("地址|" + offaddr1.toString(16));
直接打印就好

2019-1-9 11:53
1
雪    币: 20
活跃值: (215)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
月莫
2019-1-9 15:57
1
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
dou逗你玩 var&nbsp;Log&nbsp;=&nbsp;Java.use("android.util.Log"); var&nbsp;Throwable ...
你这打的是虚拟机的堆栈,不是一个东西
2019-1-9 16:15
1
雪    币: 107
活跃值: (424)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
对art支持如何了?
2019-1-9 16:15
1
雪    币: 129
活跃值: (432)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
misskings 最近也是在用frida来hook。但是只是简单的运用。感觉这样的js好陌生。没用过Module、Memory这些的。我想问下。这样的js运用的基础要去查什么用法啊?我查到的都是控制html相关的。
当然是去frida官网看帮助文档啊,然后结合JavaScript的的相关API来做处理。有必要时Frida还支持Python和JavaScript之间的通讯。用过最好的框架也应该是目前最流行的的吧。
2019-1-15 09:16
0
雪    币: 445
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
根据大牛的思路,通过dlopen解决了延迟so加载的hook,感谢
2020-3-19 17:05
0
雪    币: 5012
活跃值: (19180)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
12
膜膜膜
2020-3-23 14:56
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
2020-3-26 02:24
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册