游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5273|回复: 4

大话西游II的LUA脚本之字节码分析。

[复制链接]

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
发表于 2005-11-18 14:44:00 | 显示全部楼层 |阅读模式
  内容看回复!

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
 楼主| 发表于 2005-11-18 14:57:00 | 显示全部楼层

Re:大话西游II的LUA脚本之字节码分析。

  以下分析基于大话西游版本75-78的客户端,对于其他版本,不能保证其有效性。
  ⒈使用4.0.1版本的LUA解释器;
  ⒉编译后的字节码用一种数据算法进行了压缩;
  ⒊字节码OPCODE的顺序不是标准的LUA字节码,而是打乱了顺序的,所以即使你解压缩了字节码文件,也无法用LUA -L命令看到其内容;
  
  经过两天业余时间的折磨,终于把大话西游II中LUA字节码的排列顺序给摸得差不多了。
总结出如下几点:
  ⒈XY2的OPCODE值是标准LUA OPCODE + 2,如OP_END在标准LUA中的值为0,在XY2中就为2了;
  ⒉字节码枚举OP_PUSHNUM和OP_PUSHINT、OP_PUSHNEGNUM和OP_PUSHSTRING、OP_GETINDEXED和OP_GETTABLE、OP_PUSHSELF和OP_GETDOTTED、OP_SETGLOBAL和OP_SETLOCAL互换了位置。  
  ⒊OP_MULT换成了OP_DIV,OP_DIV换成了OP_POW,OP_POW换成了OP_MULT。

  现把整理后的LOPCODES.H放上来,把它替换掉LUA V4.0.1代码包中对应文件中的OPCODE枚举再编译后,就能看到解压后的大话西游II字节码的内容了。

/*
** K = U argument used as index to `kstr'
** J = S argument used as jump offset (relative to pc of next instruction)
** L = unsigned argument used as index of local variable
** N = U argument used as index to `knum'
*/

typedef enum {
    OP_NOP0,
    OP_NOP1,
/*----------------------------------------------------------------------
name                args        stack before        stack after        side effects
------------------------------------------------------------------------*/
OP_END,/*        -        -                (return)        no results        */
OP_RETURN,/*        U        v_n-v_x(at u)        (return)        returns v_x-v_n        */

OP_CALL,/*        A B        v_n-v_1 f(at a)        r_b-r_1                f(v1,...,v_n)        */
OP_TAILCALL,/*        A B        v_n-v_1 f(at a)        (return)        f(v1,...,v_n)        */

OP_PUSHNIL,/*        U        -                nil_1-nil_u                        */
OP_POP,/*        U        a_u-a_1                -                                */

    /* 6<>8 7<>9 */
    OP_PUSHNUM,/*        N        -                KNUM[n]                                */
    OP_PUSHNEGNUM,/* N        -                -KNUM[n]                        */
    OP_PUSHINT,/*        S        -                (Number)s                        */
    OP_PUSHSTRING,/* K        -                KSTR[k]                                */

OP_PUSHUPVALUE,/* U        -                Closure                        */

OP_GETLOCAL,/*        L        -                LOC[l]                                */
OP_GETGLOBAL,/*        K        -                VAR[KSTR[k]]                        */

    /* F<>D 10<>E */
    OP_GETINDEXED,/* L        t                t[LOC[l]]                        */
    OP_PUSHSELF,/*        K        t                t t[KSTR[k]]                        */
    OP_GETTABLE,/*        -        i t                t                                */
    OP_GETDOTTED,/*        K        t                t[KSTR[k]]                        */

OP_CREATETABLE,/* U        -                newarray(size = u)                */
  
    /* 13<>12 */
    OP_SETGLOBAL,/*        K        x                -                VAR[KSTR[k]]=x        */
    OP_SETLOCAL,/*        L        x                -                LOC[l]=x        */
OP_SETTABLE,/*        A B        v a_a-a_1 i t        (pops b values)        t=v                */

OP_SETLIST,/*        A B        v_b-v_1 t        t                t[i+a*FPF]=v_i        */
OP_SETMAP,/*        U        v_u k_u - v_1 k_1 t        t        t[k_i]=v_i        */

OP_ADD,/*        -        y x                x+y                                */
OP_ADDI,/*        S        x                x+s                                */
OP_SUB,/*        -        y x                x-y                                */

    /* 1A<>1B 1B<>1C 1C<>1A  */
    OP_DIV,/*        -        y x                x/y                                */
    OP_POW,/*        -        y x                x^y                                */
    OP_MULT,/*        -        y x                x*y                                */

OP_CONCAT,/*        U        v_u-v_1                v1..-..v_u                        */
OP_MINUS,/*        -        x                -x                                */
OP_NOT,/*        -        x                (x==nil)? 1 : nil                */

OP_JMPNE,/*        J        y x                -                (x~=y)? PC+=s        */
OP_JMPEQ,/*        J        y x                -                (x==y)? PC+=s        */
OP_JMPLT,/*        J        y x                -                (x<y)? PC+=s        */
OP_JMPLE,/*        J        y x                -                (x<y)? PC+=s        */
OP_JMPGT,/*        J        y x                -                (x>y)? PC+=s        */
OP_JMPGE,/*        J        y x                -                (x>=y)? PC+=s        */

OP_JMPT,/*        J        x                -                (x~=nil)? PC+=s        */
OP_JMPF,/*        J        x                -                (x==nil)? PC+=s        */
OP_JMPONT,/*        J        x                (x~=nil)? x : -        (x~=nil)? PC+=s        */
OP_JMPONF,/*        J        x                (x==nil)? x : -        (x==nil)? PC+=s        */
OP_JMP,/*        J        -                -                PC+=s                */

OP_PUSHNILJMP,/* -        -                nil                PC++;                */

OP_FORPREP,/*        J                                                        */
OP_FORLOOP,/*        J                                                        */

OP_LFORPREP,/*        J                                                        */
OP_LFORLOOP,/*        J                                                        */

OP_CLOSURE/*        A B        v_b-v_1                closure(KPROTO[a], v_1-v_b)        */

} OpCode;

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
 楼主| 发表于 2005-11-21 16:35:00 | 显示全部楼层

Re:大话西游II的LUA脚本之字节码分析。

lcode.c中的luaK_opproperties的修改:
const struct OpProperties luaK_opproperties[NUM_OPCODES] = {
  {0, 0, 0},        /* OP_NOP01 */
  {0, 0, 0},        /* OP_NOP02 */
  {iO, 0, 0},        /* OP_END */
  {iU, 0, 0},        /* OP_RETURN */
  {iAB, 0, 0},        /* OP_CALL */
  {iAB, 0, 0},        /* OP_TAILCALL */
  {iU, VD, 0},        /* OP_PUSHNIL */
  {iU, VD, 0},        /* OP_POP */
    {iU, 1, 0},        /* OP_PUSHNUM */
    {iU, 1, 0},        /* OP_PUSHNEGNUM */
    {iS, 1, 0},        /* OP_PUSHINT */
    {iU, 1, 0},        /* OP_PUSHSTRING */
  {iU, 1, 0},        /* OP_PUSHUPVALUE */
  {iU, 1, 0},        /* OP_GETLOCAL */
  {iU, 1, 0},        /* OP_GETGLOBAL */
    {iU, 1, 1},        /* OP_GETINDEXED */
    {iU, 2, 1},        /* OP_PUSHSELF */
    {iO, 1, 2},        /* OP_GETTABLE */
    {iU, 1, 1},        /* OP_GETDOTTED */
  {iU, 1, 0},        /* OP_CREATETABLE */
    {iU, 0, 1},        /* OP_SETGLOBAL */
    {iU, 0, 1},        /* OP_SETLOCAL */
  {iAB, VD, 0},        /* OP_SETTABLE */
  {iAB, VD, 0},        /* OP_SETLIST */
  {iU, VD, 0},        /* OP_SETMAP */
  {iO, 1, 2},        /* OP_ADD */
  {iS, 1, 1},        /* OP_ADDI */
  {iO, 1, 2},        /* OP_SUB */
    {iO, 1, 2},        /* OP_DIV */
    {iO, 1, 2},        /* OP_POW */
    {iO, 1, 2},        /* OP_MULT */
  {iU, VD, 0},        /* OP_CONCAT */
  {iO, 1, 1},        /* OP_MINUS */
  {iO, 1, 1},        /* OP_NOT */
  {iS, 0, 2},        /* OP_JMPNE */
  {iS, 0, 2},        /* OP_JMPEQ */
  {iS, 0, 2},        /* OP_JMPLT */
  {iS, 0, 2},        /* OP_JMPLE */
  {iS, 0, 2},        /* OP_JMPGT */
  {iS, 0, 2},        /* OP_JMPGE */
  {iS, 0, 1},        /* OP_JMPT */
  {iS, 0, 1},        /* OP_JMPF */
  {iS, 0, 1},        /* OP_JMPONT */
  {iS, 0, 1},        /* OP_JMPONF */
  {iS, 0, 0},        /* OP_JMP */
  {iO, 0, 0},        /* OP_PUSHNILJMP */
  {iS, 0, 0},        /* OP_FORPREP */
  {iS, 0, 3},        /* OP_FORLOOP */
  {iS, 2, 0},        /* OP_LFORPREP */
  {iS, 0, 3},        /* OP_LFORLOOP */
  {iAB, VD, 0}        /* OP_CLOSURE */
};

0

主题

61

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2005-11-24 17:59:00 | 显示全部楼层

Re:大话西游II的LUA脚本之字节码分析。

顶顶

0

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2011-6-19 12:31:00 | 显示全部楼层

Re: 大话西游II的LUA脚本之字节码分析。

aaaaaaaaaaaaaaaaaaaaaaaaaaa
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 12:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表