能力值:
( LV11,RANK:180 )
|
-
-
2 楼
朋友,你的问题问得不是很清楚,我试着回答一下。 从文件头可以看出你的文件是lua字节码,可以用luadec51反编译。 字节码的格式可以百度搜索,其中+12偏移为4字节的路径大小,+16为路径 所以左图+12为 ,即大小位0x0000006A,路径为被打码的字符串 右图+12为0x0000000A,所以路径为@init.lua\x00
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
常量字符串前面都是加上了00 00 00 00,去掉可以正常解析,就是不知道源码里面哪里改动了。
|
能力值:
( LV11,RANK:180 )
|
-
-
4 楼
双峰山
常量字符串前面都是加上了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,亲测可以反编译
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
征途的,不需要那么麻烦,呵
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
看了几天luac格式,这其实是size_t长度更改成int64的8字节导致
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我之前也看过这个文件,也是卡在这个8字节上,没有深究。
|
|
|