首页
社区
课程
招聘
[讨论][Android CrackMe]适用于Androlua的虚拟化代码混淆CM
发表于: 2023-1-6 15:25 7698

[讨论][Android CrackMe]适用于Androlua的虚拟化代码混淆CM

2023-1-6 15:25
7698

注意,这是CM测试!!!

第一次看雪里头发帖子,如果投错区了麻烦版主移动一下啦,抱歉了

CM文件下载地址:下载地址:https://nwdxlgzs.lanzouf.com/iyPIa0k1t64b
另外,附件也是这个文件。

 

需要被分析的是APK中的crackme.lua(路径:apk://assets/crackme.lua)

 

因为是混淆对抗,所以就不编译字节码给各位增加额外的麻烦了,直接看混淆文本就行啦!

我的实现方案(虚拟化):先写了一个Lua版虚拟机,然后根据这个虚拟机用C写了一个翻译器,再次将指令翻译为Lua代码,翻译过程提供选项设置比如是否加密数字什么的配置,然后输出的Lua就是虚拟化混淆后的了。

基础框架结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
局部变量定义区(local xx=xx那部分)
local I = setmetatable;
local y = getmetatable;
......
 
虚拟机抽调指令函数(但是他不是那种走elseif分支的解释器)
local function V(x, s, O, u)
local U = {};
......
 
调用(第一参数是table,就是翻译器核心的数据输出)
return C[37]( {
[56] = (((2903)-(v[481]))-(1835)),
......

虚拟执行函数

这里直接贴虚拟执行函数了(格式化的crackme.lua中的函数):

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
42
43
44
local function V(x, s, O, u)
  local U = {};
  local X = {};
  I(X, {
    [d] = function(L, z) return U[z]; end,
    [Y] = function(L, z, r) U[z] = r; end
  });
  local h = { [96] = s or {}, [87] = O or { [0] = u or _G or _ENV }; [95] = u or _G or _ENV; [10] = X; [9] = 0; [80] = 0; [61] = {}; [88] = x[88]; };
  for g = 1, x[56] do
    h[10][g - 1] = h[96][g];
    h[9] = g - 1;
  end
  local W = D((function()
    while (not(((-3015)*(v[-1681]))<((-2944)+(-3030)))) do
      local o = x[71][h[80]];
      h[80] = h[80] + 1;
      if o == nil then
        S();
        break
      end
      if x[66][h[80] - 1] then
        return o(h);
      else
        o(h);
      end
    end
  end)());
  for g = 0, x[90] do
    if h[61][g] then
      local J = h[61][g];
      if J[2] == 25 then
        if H(h[10][J[78]]) == n then
          h[10][J[78]]();
        elseif H(h[10][J[78]]) == i and H(y(h[10][J[78]])[e]) == n then
          y(h[10][J[78]])[e](h[10][J[78]]);
        end
      end
      J[2] = 2;
      J[48] = h[10][J[78]];
      h[61][g] = nil;
    end
  end
  return B(W);
end

这个应该算VM保护和某种意义上的加密算法吧?这个虚拟机基本还是Lua53虚拟机,但是又稍微不同。

我知道的思路如下:

重构字节码

我不确定有人能走还原操作数重构字节码,因为操作数概念被函数实现过程给模糊了

代码优化

我也不确定靠代码优化能不能实现还原,能还原那么相当于完成反编译了,因为工具的输入是字节码,输出的是Lua源码

 

奈何本人技术有限,思路暂时无法实现。特此放个CM让大家一块玩玩。


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

最后于 2023-1-6 15:46 被nwdxlgzs编辑 ,原因: 才发现右边有标题栏,使用#标记标题
上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 16
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
啊这,2300+查看0回复附件0下载……真的没人试试啊……
2023-1-10 16:52
0
雪    币: 2253
活跃值: (6628)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
3
你可以理解为逆向就是修水管,不会修的去不了,会修的懒得修,谁没事跑别人家里修水管呢,码这么多字好累啊
2023-1-10 16:56
0
游客
登录 | 注册 方可回帖
返回
//