首页
社区
课程
招聘
[求助]lua虚拟机字节码怎么改变
发表于: 2016-10-18 12:07 5000

[求助]lua虚拟机字节码怎么改变

2016-10-18 12:07
5000
OP_MOVE,/*        A B        R(A) := R(B)                                        */
OP_LOADK,/*        A Bx        R(A) := Kst(Bx)                                        */
OP_LOADBOOL,/*        A B C        R(A) := (Bool)B; if (C) pc++                        */
OP_LOADNIL,/*        A B        R(A) := ... := R(B) := nil                        */
OP_GETUPVAL,/*        A B        R(A) := UpValue                                */

OP_GETGLOBAL,/*        A Bx        R(A) := Gbl[Kst(Bx)]                                */
OP_GETTABLE,/*        A B C        R(A) := R(B)[RK(C)]                                */

OP_SETGLOBAL,/*        A Bx        Gbl[Kst(Bx)] := R(A)                                */
OP_SETUPVAL,/*        A B        UpValue := R(A)                                */
OP_SETTABLE,/*        A B C        R(A)[RK(B)] := RK(C)                                */

OP_NEWTABLE,/*        A B C        R(A) := {} (size = B,C)                                */

OP_SELF,/*        A B C        R(A+1) := R(B); R(A) := R(B)[RK(C)]                */

OP_ADD,/*        A B C        R(A) := RK(B) + RK(C)                                */
OP_SUB,/*        A B C        R(A) := RK(B) - RK(C)                                */
OP_MUL,/*        A B C        R(A) := RK(B) * RK(C)                                */
OP_DIV,/*        A B C        R(A) := RK(B) / RK(C)                                */
OP_MOD,/*        A B C        R(A) := RK(B) % RK(C)                                */
OP_POW,/*        A B C        R(A) := RK(B) ^ RK(C)                                */
OP_UNM,/*        A B        R(A) := -R(B)                                        */
OP_NOT,/*        A B        R(A) := not R(B)                                */
OP_LEN,/*        A B        R(A) := length of R(B)                                */

OP_CONCAT,/*        A B C        R(A) := R(B).. ... ..R(C)                        */

OP_JMP,/*        sBx        pc+=sBx                                        */

OP_EQ,/*        A B C        if ((RK(B) == RK(C)) ~= A) then pc++                */
OP_LT,/*        A B C        if ((RK(B) <  RK(C)) ~= A) then pc++                  */
OP_LE,/*        A B C        if ((RK(B) <= RK(C)) ~= A) then pc++                  */

OP_TEST,/*        A C        if not (R(A) <=> C) then pc++                        */
OP_TESTSET,/*        A B C        if (R(B) <=> C) then R(A) := R(B) else pc++        */

OP_CALL,/*        A B C        R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
OP_TAILCALL,/*        A B C        return R(A)(R(A+1), ... ,R(A+B-1))                */
OP_RETURN,/*        A B        return R(A), ... ,R(A+B-2)        (see note)        */

OP_FORLOOP,/*        A sBx        R(A)+=R(A+2);
                        if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
OP_FORPREP,/*        A sBx        R(A)-=R(A+2); pc+=sBx                                */

OP_TFORLOOP,/*        A C        R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2));
                        if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++        */
OP_SETLIST,/*        A B C        R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B        */

OP_CLOSE,/*        A         close all variables in the stack up to (>=) R(A)*/
OP_CLOSURE,/*        A Bx        R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n))        */

OP_VARARG/*        A B        R(A), R(A+1), ..., R(A+B-1) = vararg                */
} OpCode;

这是lua源码虚拟机指令的代码。
我需要改成下面这对应的顺序需要怎么改呢
OP_MOVE          0        25
OP_LOADK        1        19
OP_LOADBOOL        2        9
OP_LOADNIL        3        0
OP_GETUPVAL        4        22
OP_GETGLOBAL        5        28
OP_GETTABLE        6        20
OP_SETGLOBAL        7        26
OP_SETUPVAL        8        30
OP_SETTABLE        9        15
OP_NEWTABLE        10        5
OP_SELF        11        27
OP_ADD        12        33
OP_SUB        13        1
OP_MUL        14        29
OP_DIV        15        11
OP_MOD        16        13
OP_POW        17        23
OP_UNM        18        2
OP_NOT        19        31
OP_LEN        20        6
OP_CONCAT        21        34
OP_JMP        22        35
OP_EQ        23        36
OP_LT        24        17
OP_LE        25        7
OP_TEST        26        16
OP_TESTSET        27        4
OP_CALL        28        21
OP_TAILCALL        29        18
OP_RETURN        30        12
OP_FORLOOP        31        14
OP_FORPREP        32        10
OP_TFORLOOP        33        24
OP_SETLIST        34        8
OP_CLOSE        35        32
OP_CLOSURE        36        3
OP_VARARG        37        37

左边为原来的编码 右边为需要更改之后的

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1787
活跃值: (345)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
直接改就可以了,同时修改下luaP_opmodes
2016-10-18 17:25
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是修改他的顺序就可以了吗
2016-10-18 17:29
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
typedef enum {
/*----------------------------------------------------------------------
name                args        description
------------------------------------------------------------------------*/
OP_LOADNIL,
OP_SUB,
OP_UNM,
OP_CLOSURE,
OP_TESTSET,
OP_NEWTABLE,
OP_LEN,
OP_LE,
OP_SETLIST,
OP_LOADBOOL,
OP_FORPREP,
OP_DIV,
OP_RETURN,
OP_MOD,
OP_FORLOOP,
OP_SETTABLE,
OP_TEST,
OP_LT,
OP_TAILCALL,
OP_LOADK,
OP_GETTABLE,
OP_CALL,
OP_GETUPVAL,
OP_POW,
OP_TFORLOOP,
OP_MOVE,
OP_SETGLOBAL,
OP_SELF,
OP_GETGLOBAL,
OP_MUL,
OP_SETUPVAL,
OP_NOT,
OP_CLOSE,
OP_ADD,
OP_CONCAT,
OP_JMP,
OP_EQ,
OP_VARARG
} OpCode;

这是我修改过的。

你说的同时修改luaP_opmodes是指lopcodes.c这个文件下的哪个方法

const char *const luaP_opnames[NUM_OPCODES+1] = {

const lu_byte luaP_opmodes[NUM_OPCODES] = {

这两个方法里面的顺序都需要修改顺序都是只需要更改一个
2016-10-18 17:33
0
雪    币: 1787
活跃值: (345)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
luaP_opmodes ,保证和OP的顺序一致。
2016-10-18 19:51
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
const char *const luaP_opnames[NUM_OPCODES+1] = {

const lu_byte luaP_opmodes[NUM_OPCODES] = {

lopcodes.c这个文件里面有两个方法啊。两个都要还是只要上面一个

我修改完编译出来LUAC.exe 直接用这个LUAC.EXE编译lua源码就可以了吧。
2016-10-19 08:49
0
雪    币: 1787
活跃值: (345)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
luaP_opnames 最好不要改,改了就暴露了,这个都是OP对应的名字,如果你改了顺序一样,逆一下,就能看出你改完的顺序。luaP_opmodes 需要修改,不改运行不正常。

今天我试了试,有些问题,具体怎么改,等我看明白再回复下。
2016-10-19 09:42
0
游客
登录 | 注册 方可回帖
返回