-
-
[讨论][Android CrackMe]适用于Androlua的虚拟化代码混淆CM
-
发表于:
2023-1-6 15:25
7698
-
[讨论][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让大家一块玩玩。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2023-1-6 15:46
被nwdxlgzs编辑
,原因: 才发现右边有标题栏,使用#标记标题