-
-
[讨论][Android CrackMe]适用于Androlua的虚拟化代码混淆CM
-
-
[讨论][Android CrackMe]适用于Androlua的虚拟化代码混淆CM
注意,这是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让大家一块玩玩。
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!
最后于 2023-1-6 15:46
被nwdxlgzs编辑
,原因: 才发现右边有标题栏,使用#标记标题