记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

今天分析一个网赚类的样本,业务方要我搞清楚为什么每次完成任务出现红包时,总会随之弹出一个插屏广告。

大概就是下图这样,说实话,弹几层广告确实挺恶心,关起来都麻烦

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

先在测试机装上应用,发现有root检测,试过几个通用的过root检测的frida脚本,发现不行

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

看了下代码,是网易的壳

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

正好,最近在看Ratel,刚好来练练手,试试在非root环境下Ratel的脱壳怎么样

Ratel用起来没frida那么随意,有兴趣大家去他的github看看:virjarRatel · GitHub

Ratel大概脱壳步骤:

1 装上Ratal

2 装上目标应用

3 感染应用

4 写脱壳插件

5 应用跑起来,就开始脱壳了

下面是脱壳代码,在主框架入口调一下entry就行

public class Unpack {
    public static final String tag = "RATEL-YOOHA";

    public static void entry(RC_LoadPackage.LoadPackageParam lpparam) {

        // TODO 抽取壳要把这个选项打开
        //UnPackerToolKit.autoEnable(true);

        UnPackerToolKit.unpack(new UnPackerToolKit.UnpackEvent() {
            @Override
            public void onFinish(File file) {
                try {
                    FileUtils.copyFile(file, new File("/sdcard/crack.apk")); 
                    Log.i(tag, "unpacked over");
                } catch (IOException e) {
                    Log.e(tag, "unpacked error", e);
                    e.printStackTrace();
                }
            }
        });
    }
}

跑起来后,壳果然脱了,效果还行

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

先看看代码,发现有个函数非常可以

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

严重怀疑就是他干的坏事,怎么办,hook他呗,试试Ratel的hook好不好使

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

Ratel写代码跟xposed差不多,记住一点就行,把类开头的X改成R。结果果然没让我失望,就是这个函数干的

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

从调用栈来看,这个函数是被Native调用的,看了下框架Unity + libil2cpp.so ,这个框架下,需要用到一个开源工具来解密Il2CppDumper,解密方法大家可以去github看,顺便给他个星星:GitHub - Perfare/Il2CppDumper: Unity il2cpp reverse engineer

解密出来的内容如下:

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

一般情况下,在 /DummyDll/ 下的dll文件用dnSpy 打开后,都能看到函数体,然后继续分析,但今天这个样本,解出来的dll 打开函数都是空的

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

好吧,那只能看 libil2cpp.so 的代码了,上图中Address 的偏移就是这个函数在so文件中的偏移,首先我们需要先跑一下脚本,将这个符号和结构体等信息先载入IDA,具体方法:

1 IDA先打开libil2cpp.so

2 加载 ida_with_struct.py 脚本(该脚本在你下载的)Il2CppDumper工具包里面

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 3 加载 script.json (解密出来的文件里面)

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 4 加载 il2cpp.h 文件 (解密出来的文件里面)

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 5  漫长的等待

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 看到这个就加载完了:

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

OK,开始干活,既然确认是调用Java函数showImageInterstitialAd,那么so中肯定会用到字符串“showImageInterstitialAd”,先到解密出来的 stringliteral.json 文件中找该字符串

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

然后在IDA中 跳转到这个地址,看到一个变量,先改个名字,防止跟丢了

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

对变量查找引用,找到调用他的地方,AndroidJavaObject_CallStatic, 这个函数会根据传进来的字符串函数名反射调用java函数

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

接着再查找引用

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

再查,找到了,这个红包物体被激活时,会调用OnEnable函数,在该函数中,会调用ShowinterAd来弹出插屏广告,也就是说,出现这个过关红包就会弹一次插屏,也真够烦的

记一次RATEL脱壳配合Il2CppDumper解密完成的样本分析

 

OK,先到这吧

上一篇:开发移动app与服务器端session的状态管理与交互


下一篇:linux-统计一个文件中出现的单词数