首页
论坛
课程
招聘
[求助]fart dump 函数指令请教
2021-8-4 17:15 11979

[求助]fart dump 函数指令请教

2021-8-4 17:15
11979

先看fart dump 指令的代码。代码如下:

1
2
3
4
5
6
7
8
extern "C" void myfartInvoke(ArtMethod* artmethod)  REQUIRES_SHARED(Locks::mutator_lock_) {
    JValue *result=nullptr;
    Thread *self=nullptr;
    uint32_t temp=6;
    uint32_t* args=&temp;
    uint32_t args_size=6;
    artmethod->Invoke(self, args, args_size, result, "fart");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ArtMethod::Invoke(Thread* self, uint32_t* args, uint32_t args_size, JValue* result,
                       const char* shorty) {
 
    if (self== nullptr) {
        dumpArtMethod(this);
        return;
    }
 
  if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) {
    ThrowStackOverflowError(self);
    return;
  }
    //此处省略部分代码
}

在myfartInvoke中调用ArtMethod::Invoke函数,然后在Invoke函数中根据self参数,条件执行dumpArtMethod。

 

问题:
这里调用Invoke函数有啥意义?
在myfartInvoke中直接调用dumpArtMethod可以吗?
比如这样:

1
2
3
4
5
6
7
8
extern "C" void myfartInvoke(ArtMethod* artmethod)  REQUIRES_SHARED(Locks::mutator_lock_) {
    JValue *result=nullptr;
    Thread *self=nullptr;
    uint32_t temp=6;
    uint32_t* args=&temp;
    uint32_t args_size=6;
    dumpArtMethod(this);
}

【公告】 [2022大礼包]《看雪论坛精华22期》发布!收录近1000余篇精华优秀文章!

最后于 2021-8-5 14:30 被wx_阿达西编辑 ,原因: 调整段落结构
收藏
点赞0
打赏
分享
最新回复 (14)
雪    币: 0
活跃值: 活跃值 (499)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 活跃值 2021-8-4 17:17
2
0
真心请教,这里我想了很久没搞明白
雪    币: 9645
活跃值: 活跃值 (6942)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
misskings 活跃值 4 2021-8-5 14:55
3
0
第一点,抽取壳,是在函数执行的时候,才会对函数进行恢复。
你下面的做法,函数压根没有执行。所以函数不会恢复。所以你保存出来的codeitem就是没恢复的。
第二点,其实我那篇文章的重点也是一个原因。有些函数恢复是在函数执行更深的地方才恢复。所以也需要函数真正执行。
雪    币: 0
活跃值: 活跃值 (499)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 活跃值 2021-8-5 18:14
4
0
misskings 第一点,抽取壳,是在函数执行的时候,才会对函数进行恢复。 你下面的做法,函数压根没有执行。所以函数不会恢复。所以你保存出来的codeitem就是没恢复的。 第二点,其实我那篇文章的重点也是一个原因 ...
大佬说的我理解了。抽取壳原理是函数将要执行时去还原指令。
那么是否可以下这样一个结论:我启动app,一顿乱点,把功能都跑一篇。再去整体dump dex。其实是可以拿到完整的dex文件。
另外再问下:
fart是在myfartInvoke函数中直接调用Invoke,然后在Invoke函数中判断self是否等于null,如果等于null就去dump。这里如果self == null成立,那么对Invoke函数的调用不就是来自myfartInvoke吗?这样的话,还有必要把dumpArtMethod函数放大Invoke中去调用吗,这和直接在myfartInvoke中调用没啥区别吧。比较笨,不知道大佬理解我表达的意思了没
雪    币: 0
活跃值: 活跃值 (499)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 活跃值 2021-8-5 18:17
5
0
wx_阿达西 大佬说的我理解了。抽取壳原理是函数将要执行时去还原指令。 那么是否可以下这样一个结论:我启动app,一顿乱点,把功能都跑一篇。再去整体dump dex。其实是可以拿到完整的dex文件。 另外再问下 ...
我想表达的是,这样执行的效果,等价于fart中函数调用效果
extern "C" void myfartInvoke(ArtMethod* artmethod)  REQUIRES_SHARED(Locks::mutator_lock_) {
    JValue *result=nullptr;
    Thread *self=nullptr;
    uint32_t temp=6;
    uint32_t* args=&temp;
    uint32_t args_size=6;
    dumpArtMethod(artmethod);
}
雪    币: 9645
活跃值: 活跃值 (6942)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
misskings 活跃值 4 2021-8-5 18:25
6
0
是对的。你启动app后。一顿乱点。触发到的那些函数一般是会恢复的。这种行为叫做被动调用。如果被动调用还原出来的那些函数能满足你的需求那当然是最好。主动调用是为了大量的还原所有函数。另外你单独的看myfartInvoke这里dump。和Invoke后脱壳还是有区别的。一个是在函数调用前。函数实际没有执行。一个是在函数执行中。不能简单的看成是我们自己开发的程序那样两个方法的调用。毕竟安卓内部还有其他的处理
雪    币: 9645
活跃值: 活跃值 (6942)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
misskings 活跃值 4 2021-8-5 18:28
7
0
我这样说个简单的情况。例如我在Invoke处理的时候。出现了错误。崩溃了。然后会打印出堆栈。但是我明明是myfartInvoke内直接调用artMethod的Invoke。但是你在堆栈中看到的却不是这样。而是有很多一层层的调用。
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2021-8-5 19:21
8
0
invoke是主动调用的精髓
雪    币: 0
活跃值: 活跃值 (499)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_阿达西 活跃值 2021-8-5 19:24
9
0
misskings 是对的。你启动app后。一顿乱点。触发到的那些函数一般是会恢复的。这种行为叫做被动调用。如果被动调用还原出来的那些函数能满足你的需求那当然是最好。主动调用是为了大量的还原所有函数。另外你单独的看myf ...
好的,非常感谢。我实践一把看看。
雪    币: 71
活跃值: 活跃值 (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_yvvzfcdo 活跃值 2021-8-12 18:25
10
0
misskings 我这样说个简单的情况。例如我在Invoke处理的时候。出现了错误。崩溃了。然后会打印出堆栈。但是我明明是myfartInvoke内直接调用artMethod的Invoke。但是你在堆栈中看到的却不是这 ...
大佬,有些加固厂商开始检测fart啦,比如某加密,有啥好的解决办法吗
雪    币: 9645
活跃值: 活跃值 (6942)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
misskings 活跃值 4 2021-8-12 19:57
11
0
mb_yvvzfcdo 大佬,有些加固厂商开始检测fart啦,比如某加密,有啥好的解决办法吗
这个加固厂商我测试过。我的fartext方案可以用。不过暂时不会放出来在持续优化中。整完会开源的。你可以先看我的那篇文章。做个低配版的出来先用着
雪    币: 943
活跃值: 活跃值 (1631)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小黄鸭爱学习 活跃值 2021-10-18 09:52
12
0
mb_yvvzfcdo 大佬,有些加固厂商开始检测fart啦,比如某加密,有啥好的解决办法吗
删掉特征就行 亲测可以
雪    币: 220
活跃值: 活跃值 (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
james_mvb 活跃值 2022-2-16 14:18
13
0
小黄鸭爱学习 删掉特征就行 亲测可以
如何删掉特征 大佬能回复下吗
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2022-2-16 23:52
14
0
misskings 我这样说个简单的情况。例如我在Invoke处理的时候。出现了错误。崩溃了。然后会打印出堆栈。但是我明明是myfartInvoke内直接调用artMethod的Invoke。但是你在堆栈中看到的却不是这 ...
我也无法理解 多出来的调用堆栈是怎么实现的 从程序的执行上来说 楼主说的没错 确实是没区别 区别invoke函数是被系统hook了 不然无法解释你所说的多出来的堆栈调用
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2022-2-16 23:58
15
0
万里星河 我也无法理解 多出来的调用堆栈是怎么实现的 从程序的执行上来说 楼主说的没错 确实是没区别 区别invoke函数是被系统hook了 不然无法解释你所说的多出来的堆栈调用
或者说 ArtMethod::invoke函数是被壳hook了 这也能解释壳是如何知道哪个函数被调用了 从而完成解密操作
游客
登录 | 注册 方可回帖
返回