首页
论坛
专栏
课程

[求助]lua解密代码文本为8字节,不知道哪里改动了?

2017-4-14 21:37 2174

[求助]lua解密代码文本为8字节,不知道哪里改动了?

2017-4-14 21:37
2174
上一主题 下一主题
最新回复 (6)
littleNA 3 2017-4-15 12:29
2
0

朋友,你的问题问得不是很清楚,我试着回答一下。

从文件头可以看出你的文件是lua字节码,可以用luadec51反编译。

字节码的格式可以百度搜索,其中+12偏移为4字节的路径大小,+16为路径

所以左图+12为,即大小位0x0000006A,路径为被打码的字符串

右图+12为0x0000000A,所以路径为@init.lua\x00

双峰山 2017-4-15 12:41
3
0
常量字符串前面都是加上了00  00  00  00,去掉可以正常解析,就是不知道源码里面哪里改动了。
littleNA 3 2017-4-19 11:30
4
0
双峰山 常量字符串前面都是加上了00 00 00 00,去掉可以正常解析,就是不知道源码里面哪里改动了。

如果问题只是你描述的 “常量字符串前面都是加上了00  00  00  00”,那相当于是string size由 int32 变成了 int64,只要在luadec源码中,修改加载时的string size就可以了。

从调试跟踪可以发现,字符串加载过程是在lundump.c文件中,其中LoadConstants函数判断是否是字符串,是的话再调用LoadString函数,修改这2个函数就可以了,原函数LoadConstants如下:

static void LoadConstants(LoadState* S, Proto* f)
{
...
	switch (t)
	{
	...//字符串类型,调用LoadString函数
		case LUA_TSTRING:
			setsvalue2n(S->L,o, LoadString(S));
			break;
	...
	}
...	
}


原函数LoadString如下:

static TString* LoadString(LoadState* S)
{
	uint32_t size;
	LoadVar(S,size);
	
	if (size==0)
		return NULL;
	...
}


然后修改代码,修改后的LoadString如下:

#define LoadString(S) myLoadString(S, 0)	//模拟默认构造参数
static TString* myLoadString(LoadState* S,int bInt64size)
{
	uint32_t size;
	if (bInt64size)
	{
		int64_t nSize;
		LoadVar(S, nSize);  //这个宏读取了string的大小nSize
		size = nSize;
	}else
		LoadVar(S, size);
		
	if (size==0)
		return NULL;
	...	
}


修改后的LoadConstants如下:

static void LoadConstants(LoadState* S, Proto* f)
{
...
	switch (t)
	{
	...//字符串类型,调用新的myLoadString函数
		case LUA_TSTRING:
			setsvalue2n(S->L,o, myLoadString(S,1));
			break;
	...
	}
...	
}


最后重新编译生成新的luadec.exe就可以了。

我修改了一个文件,手动在所有字符串前面增加了00 00 00 00,亲测可以反编译


白菜大叔 2017-4-20 13:35
5
0
征途的,不需要那么麻烦,呵
双峰山 2017-4-22 10:26
6
0
看了几天luac格式,这其实是size_t长度更改成int64的8字节导致
xxRea 2018-8-23 22:53
7
0
我之前也看过这个文件,也是卡在这个8字节上,没有深究。
游客
登录 | 注册 方可回帖
返回