首页
社区
课程
招聘
[原创]记录向:单纯使用Frida书写类抽取脱壳工具的一些心路历程和实践
发表于: 2020-8-3 13:12 15280

[原创]记录向:单纯使用Frida书写类抽取脱壳工具的一些心路历程和实践

2020-8-3 13:12
15280

开篇要求:

FART通过对系统源码修改编译,生成脱壳rom,完成对dex的函数粒度的修复;其中FART的主动调用链构造的深度可以结合壳的修复时机进行定制。当前很多抽取壳在类的加载流程当中就已经完成了被抽取函数的修复。

试想一下,如果不考虑FART当中主动调用链的构造,能否单纯用Frida这个hook框架实现一个能够在函数粒度上解决抽取壳的脱壳脚本?


关于Fart的脱壳点:

一个是Execute函数,另一个就是送到主动调用链的时候

<clinit> - Execute => dumpDexFileByExecute

其他正常函数 - DexFile_dumpMethodCode => myfartInvoke => Invoke => dumpArtMethod


关于主动调用链:

启动fart-(getClassloader来获取ClassLoader)>fartwithClassLoader-(反射获取mCookie)>loadClassAndInvoke-(dumpMethodCode将各种函数转化成ArtMethod类型并送入我们的fake_Invoke参数包装)->送入系统的Invoke-(调用dumpArtMethod实现第二个脱壳点)


在这里我们看出Fart主动调用前提:

获取appClassLoader,通过ClassLoader加载到所有类 ,通过每个类获取到该类下的所有方法【包括构造函数和普通函数】

++++++++++++++++++++++++++++++++++++++++动手环节++++++++++++++++++++++++++++++++++++++++++

获取appClassLoader,通过ClassLoader加载到所有类 

1.首先实现和的功能【加载App最后依附的ClassLoader下的所有的类】:

通过每个类获取到该类下的所有方法【包括构造函数和普通函数】

2.接下来完成的功能


增加构造函数Constructors

现在Constructor和Method都可以打印出来了,接下来就是将它们送给ArtMethod::Invoke中,进行一种“虚拟的”调用。


此时来了第一个疑惑点:能把我们的这些方法“送”到ArtMethod::Invoke去吗?


================================分析FART中的主动调用链===================================
DexFile_dumpMethodCode中使用了jobject2ArtMethod函数【这个很重要】

static void DexFile_dumpMethodCode(JNIEnv* env, jclass, jobject method) {

  if(method!=nullptr)

  {

          ArtMethod* proxy_method = jobject2ArtMethod(env, method);

          myfartInvoke(proxy_method);

      }     

  return;

}

而这里其实只是传递给Invoke然后再在Invoke中dumpArtMethod,可以说直到dumpArtMethod之前是没有执行任何具有功能性的代码。

可以发现Fart使用的主动调用链的深度其实是:jobject2ArtMethod这个函数决定的。

extern "C" ArtMethod* jobject2ArtMethod(JNIEnv* env, jobject javaMethod) {

  ScopedFastNativeObjectAccess soa(env);

  ArtMethod* method = ArtMethod::FromReflectedMethod(soa, javaMethod);

  return method;

}

通过 mirror::ArtMethod::FromReflectedMethod 获取了Java对象的在native层的 ArtMethod指针

 ArtMethod* ArtMethod::FromReflectedMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject jlr_method) {

    ObjPtr<mirror::Executable> executable = soa.Decode<mirror::Executable>(jlr_method);

    DCHECK(executable != nullptr);

    return executable->GetArtMethod();

  }

这里,我想到了一个不错的点子,我通过遍历method方法并对每一个方法进行一个调用,由于缺少参数,或者其他原因,最后肯定不能成功执行。

但是我们可以使用hook_native方式提前在load_all_class之前执行等待Java层的.invoke方法(注意是小写的invoke,这是java方法)到来,由于Java层的.invoke方法最终会调用InvokeMethod,因此我们hook它。

代码如下:

并注意函数method的调用

可以发现每一个调用都来到了InvokeMethod这个函数来,我们的Hook是成功的!


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

上传的附件:
收藏
免费 6
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  orz1ruo   +2.00 2020/08/05 感谢分享~
最新回复 (22)
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2020-8-3 13:22
0
雪    币: 4522
活跃值: (2146)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2020-8-3 13:24
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

...

最后于 2020-8-3 14:25 被tDasm编辑 ,原因:
2020-8-3 13:59
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享!
咨询一下,你有art模式下动态加、解密方法的app?(动态加解密方法是指执行方法前解密,执行完又加密)。
我发现只有VM模式下才有动态加、解密方法,同一app到art模式下运行就变成占坑型抽取。
2020-8-3 14:10
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
6
楼主,最后实现了没有。。纯frida,还原类抽取。。。
2020-8-3 15:52
0
雪    币: 2965
活跃值: (2082)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
supperlitt 楼主,最后实现了没有。。纯frida,还原类抽取。。。
实现了,就结合我最后的这段代码加上导出一些源码函数(也就是java和C++配合)完成对占坑型和偏移型的对抗。
2020-8-3 16:07
0
雪    币: 2965
活跃值: (2082)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
tDasm 谢谢分享! 咨询一下,你有art模式下动态加、解密方法的app?(动态加解密方法是指执行方法前解密,执行完又加密)。 我发现只有VM模式下才有动态加、解密方法,同一app到art模式下运行就变成占 ...
这个我以前搜集过,但是电脑最近刚换,没备份到目前的电脑上来。你可以去找找那种助手类似的App,它们比较用的多好像。
2020-8-3 16:09
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
一颗金柚子 这个我以前搜集过,但是电脑最近刚换,没备份到目前的电脑上来。你可以去找找那种助手类似的App,它们比较用的多好像。
能否具体指出APP名?
另外,对于占坑型抽取不用你文中那么复杂,因为方法还原后就不会再加密,一直在DEX原位置。
2020-8-3 16:16
0
雪    币: 2965
活跃值: (2082)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
tDasm 能否具体指出APP名? 另外,对于占坑型抽取不用你文中那么复杂,因为方法还原后就不会再加密,一直在DEX原位置。
具体的我是有点想不起来了,是叫什么太郎助手还是什么的。
嗯是的,这是我4月末做的内容,时间已经过去的有点多了,只是发出来进一下我的论坛档案~你的回答也有利于大家学习,很棒
2020-8-3 16:24
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
11
大佬,ins_的bin文件,,没看到哪里生成。。。
2020-8-3 16:38
0
雪    币: 2965
活跃值: (2082)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
supperlitt 大佬,ins_的bin文件,,没看到哪里生成。。。
这篇文章主要叙述的是占坑型,我的脚本不需要生成bin文件就可以恢复函数。bin文件主要是用来针对偏移型的,不在本文的讨论范围~偏移型的需要使用so库调用或者是利用我在文中写到的“使用FART脱壳机的API”
2020-8-3 16:53
0
雪    币: 2914
活跃值: (4946)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
感谢分享
2020-8-3 22:20
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
 i = 0;
                while(i < methods.length){
                    Method method = methods[i];
                  Object[] objs = new Object[method.getParameterTypes().length];
                  Log.d("FRiDA_UNPACK", "try to load method: " + clazz.getName() + "-->" + method.getName());
                   method.invoke(null, objs);//其实只调用方法就好,构造函数用处不是很大
                  Log.d("FRiDA_UNPACK", "success");
                  ++i;
                }
你这个循环是不能完成的,因为method.invoke没有实际参数导致执行异常,建议在 在method.invoke前用try。
2020-8-4 08:32
0
雪    币: 42
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15

楼主你好 我对脱壳也很感兴趣  看了你的文章感觉思路很清晰  于是就想自己试一试 没想到一开始就挂在了第一步  不晓得楼主用的环境是啥环境  我用的安卓9.0  magisk   和7.0  xposed   这两个环境下都不行  frida是最新版本的12.11.7

最后于 2020-8-12 16:49 被雨昏灰编辑 ,原因: 自己失误 现在找到原因啦
2020-8-12 15:45
0
雪    币: 42
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
找到原因了 类都是在最后一个PathClassLoader里面  你那个.zip的判断要改一下   手机环境不同的原因吧 
2020-8-12 16:47
0
雪    币: 42
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
java层调应用所有的方法  程序崩溃了  咋整  try catch也不行
2020-8-14 15:47
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
雨昏灰 java层调应用所有的方法 程序崩溃了 咋整 try catch也不行
文中标红部分:当前很多抽取壳在类的加载流程当中就已经完成了被抽取函数的修复。
没必要调用所有方法。
2020-8-15 13:27
0
雪    币: 42
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
tDasm 文中标红部分:当前很多抽取壳在类的加载流程当中就已经完成了被抽取函数的修复。 没必要调用所有方法。
明白了  谢谢~~
2020-8-17 08:32
0
雪    币: 316
活跃值: (758)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
supperlitt 楼主,最后实现了没有。。纯frida,还原类抽取。。。
我也想知道结果 最终完成了没有
2020-8-19 17:13
0
雪    币: 316
活跃值: (758)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
雨昏灰 找到原因了 类都是在最后一个PathClassLoader里面 你那个.zip的判断要改一下 手机环境不同的原因吧
有没有修复好的完整脚本 来耍耍
2020-8-19 17:15
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
主动调用链的构造,这里构造是啥意思? 与深度啥关系
2020-9-15 12:36
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
膜一下
2020-11-6 00:46
0
游客
登录 | 注册 方可回帖
返回
//