首页
论坛
专栏
课程

[原创]Unity3D游戏引擎Android下mono模式源码保护升级版

2019-1-28 09:51 2342

[原创]Unity3D游戏引擎Android下mono模式源码保护升级版

2019-1-28 09:51
2342

对于Unity3D源码的保护前面也讨论过了一种自定义格式的方式(Unity3d保护level1)。现在继续分享一下一种自己公司保护用的方式--自定义opcode,希望对做游戏安全保护的童鞋能起到一定的启发作用。

 

首先需要对Unity3D的jit机制行进初步的了解,具体的可以移步gslab(Unity3D jit机制分析)。在对mono的jit编译过程有清晰的认识后,便可进行下面的自定义opcode的操作了。

 

这里先简单的理一遍Unity3D jit的编译过程:

// mono/mini/driver.c 文件中
int mono_main(int argc, char* argv[])
-> 
main_thread_handler(gpointer user_data) // 函数位于driver.c文件中
->
mono_jit_exec(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]) // 函数位于driver.c文件中
->
mono_runtime_run_main(MonoMethod *method, int argc, char* argv[]) // 函数位于mono\metadata\object.c中
->
mono_runtime_exec_main(MonoMethod *method, MonoArray *args, MonoObject **exc) // 函数位于 mono\metadata\object.c中
->
mono_runtime_invoke(MonoMethod *method, void *obj, void *params, MonoObject **exc) // 函数位于 mono\metadata\object.c中
-> 
result = default_mono_runtime_invoke (method, obj, params, exc); // 这里进行default_ mono_runtime_invoke()的调用
// 实际调用的是位于mini.c中的mono_jit_runtime_invoke()

mono_jit_runtime_invoke(MOnoMehtod *method, void *obj, void **params, MonoObject **exc)
->
mono_jit_compile_method_with_opt(method, default_opt, &jit_ex)
->
mono_jit_compile_method_inner (method, target_domain, opt, ex);
->
mini_method_compile(method, opt, target_domain, TRUE, FALSE, 0); // 进行实际的编译

在实际的编译中调用了一个关键的函数mono_method_to_ir(位于mono\mini\method-to-ir.c文件中),这里谈论的opcodde自定义,就是从这个函数入手的。

/*
 * mono_method_to_ir:
 *
 *   Translate the .net IL into linear IR.
 */
int
mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_bblock, MonoBasicBlock *end_bblock, 
           MonoInst *return_var, GList *dont_inline, MonoInst **inline_args, 
           guint inline_offset, gboolean is_virtual_call)
{
     ....
    // 从这里对相应opcode进行处理
    switch (*ip) {
        case CEE_NOP:
            if (seq_points && !sym_seq_points && sp != stack_start) {
                /*
                 * The C# compiler uses these nops to notify the JIT that it should
                 * insert seq points.
                 */
                NEW_SEQ_POINT (cfg, ins, ip - header->code, FALSE);
                MONO_ADD_INS (cfg->cbb, ins);
            }
            if (cfg->keep_cil_nops)
                MONO_INST_NEW (cfg, ins, OP_HARD_NOP);
            else
                MONO_INST_NEW (cfg, ins, OP_NOP);
            ip++;
            MONO_ADD_INS (bblock, ins);
            break;
        case CEE_BREAK:
            if (should_insert_brekpoint (cfg->method))
                MONO_INST_NEW (cfg, ins, OP_BREAK);
            else
                MONO_INST_NEW (cfg, ins, OP_NOP);
            ip++;
            MONO_ADD_INS (bblock, ins);
            break;
     ...
}

*ip 指向的是opcode,opcode的定义位于mono\cil\opcode.def中,形式如下所示:

OPDEF(CEE_NOP, "nop", Pop0, Push0, InlineNone, X, 1, 0xFF, 0x00, NEXT)
OPDEF(CEE_BREAK, "break", Pop0, Push0, InlineNone, X, 1, 0xFF, 0x01, ERROR)
OPDEF(CEE_LDARG_0, "ldarg.0", Pop0, Push1, InlineNone, X, 1, 0xFF, 0x02, NEXT)
OPDEF(CEE_LDARG_1, "ldarg.1", Pop0, Push1, InlineNone, X, 1, 0xFF, 0x03, NEXT)
OPDEF(CEE_LDARG_2, "ldarg.2", Pop0, Push1, InlineNone, X, 1, 0xFF, 0x04, NEXT)
OPDEF(CEE_LDARG_3, "ldarg.3", Pop0, Push1, InlineNone, X, 1, 0xFF, 0x05, NEXT)
...

其中关键的是第一位的opcode名称和倒数第二位的十六进制index,这里所做的保护是将第一位名称和index进行随机打乱,这里就需要自己实现一个映射表,并且去重新实现mono_method_to_ir函数中的 switch(*ip)里面的实际功能了。

 

这里只做简单的描述,需要自己动手去分析mono的源码和实现一下。在自己定义了libmono.so以后,需要加入Android so文件的保护,不然自定义的libmono.so被别人一分析很容易就能被分析出自定义的那个opcode表。同时也需要在游戏后台进行反外挂数据风控的部署,游戏的保护不仅仅在于前端客户端的保护,在后端的风控保护与前端客户端的保护相互配合才能更好的保护游戏。这些都是个人愚见,望轻喷。



[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

最后于 2019-1-28 09:52 被nsec编辑 ,原因: 代码整理
上一主题 下一主题
最新回复 (14)
LowRebSwrd 1 2019-1-28 10:13
2
0
思路不错
yy大雄 2019-1-28 10:23
3
0
感谢分享。
白菜大哥 2019-1-28 14:37
4
0
感觉没必要一直来dll的保护了,后台检测好就足够,至于他改改dll,也仅仅是ui显示。
Editor 2019-1-28 14:52
5
0
感谢分享!
nsec 2019-1-28 14:59
6
0
LowRebSwrd 思路不错
多谢版主
nsec 2019-1-28 15:01
7
0
白菜大哥 感觉没必要一直来dll的保护了,后台检测好就足够,至于他改改dll,也仅仅是ui显示。
有的游戏需要再客户端实现功能数值的计算,您所说的那种只是需要在客户端做展示,确实没必要做dll的保护,自己后台风控做好就行。
windxiang 2019-1-28 15:58
8
0
看不懂。学习下
老skr江 2019-1-28 17:13
9
0
老哥厉害!
xxRea 2019-1-28 17:41
10
0
虽然我看不懂,但是我也要给你点个赞
五天 2019-1-29 11:05
11
0
感谢分享
CCkicker 2019-1-29 17:25
12
0
老哥厉害!
酱油啊啊啊啊 2019-2-7 15:08
13
0
楼主能不能看看这个链接:https://share.weiyun.com/5J5oyq6 密码:wxyhg9
pe结构进行破坏了
拜膜kx大佬 2019-2-8 02:44
14
0
酱油啊啊啊啊 楼主能不能看看这个链接:https://share.weiyun.com/5J5oyq6 密码:wxyhg9 pe结构进行破坏了
真厉害啊,骗子。说是什么交流技术,就是特么找大佬破解。自己去卖钱
酱油啊啊啊啊 2019-2-8 04:22
15
0
拜膜kx大佬 真厉害啊,骗子。说是什么交流技术,就是特么找大佬破解。自己去卖钱[em_45]
哈哈哈,技术交流而已,不像你一样卖G,就提取了辅助的dll,跑到论坛来了,佩服哈
游客
登录 | 注册 方可回帖
返回