轩辕春秋文化论坛 » 曹操传MOD制作交流 » 扩充剧本上限到999 以及更高级关于栈结构的运用


2012-2-22 15:20 砖家叫兽
扩充剧本上限到999 以及更高级关于栈结构的运用

00417EF8  |.  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
00417EFF  |.  B9 70074B00   MOV ECX,Ekd5.004B0770
00417F04  |.  E8 070F0000   CALL Ekd5.00418E10
00417F09  |.  25 FF000000   AND EAX,0FF
00417F0E  |.  8B0D FC7F5000 MOV ECX,DWORD PTR DS:[507FFC]
这里就是关键  从指针20XX 取出来  剧本号就完全利用77 指令
77   P  20XX  =  C  10    即跳转XXX_010.XXX剧本

00417F14  |.  81F9 E8030000 CMP ECX,3E8
00417F1A  |.  75 07         JNZ SHORT Ekd5.00417F23
00417F1C  |.  E8 3F5A0C00   CALL Ekd5.004DD960
这个是 =1000 出栈 的情况
00417F21  |.  EB 65         JMP SHORT Ekd5.00417F88
00417F23  |>  E8 78590C00   CALL Ekd5.004DD8A0
否则 入栈   当然不是EBP 啦  是个类似栈结构的存储空间  (用于递归调用剧本?)
00417F28  |.  81F9 E8030000 CMP ECX,3E8
00417F2E  |.  77 58         JA SHORT Ekd5.00417F88
00417F30  |.  90            NOP
00417F31  |.  90            NOP
00417F32  |.  90            NOP
上面属于最新添加的   应用层次高

下面是 扩充999部分
00417F33  |.  8BC1          MOV EAX,ECX
00417F35  |.  99            CDQ
00417F36  |.  33C9          XOR ECX,ECX
00417F38  |.  B1 64         MOV CL,64
00417F3A  |.  F7F9          IDIV ECX
00417F3C  |.  50            PUSH EAX
00417F3D  |.  8BC2          MOV EAX,EDX
00417F3F  |.  99            CDQ
00417F40  |.  B1 0A         MOV CL,0A
00417F42  |.  F7F1          DIV ECX
00417F44  |.  50            PUSH EAX
00417F45  |.  52            PUSH EDX
分离了 个 十 百 位
00417F46  |.  B9 06904D00   MOV ECX,Ekd5.004D9006                    ;  ASCII "JINYONG_000.EEX"
00417F4B  |>  8039 30       /CMP BYTE PTR DS:[ECX],30
00417F4E  |.  72 05         |JB SHORT Ekd5.00417F55
00417F50  |.  8039 39       |CMP BYTE PTR DS:[ECX],39
00417F53  |.  76 0B         |JBE SHORT Ekd5.00417F60
00417F55  |>  81F9 18904D00 |CMP ECX,Ekd5.004D9018
00417F5B  |.  73 60         |JNB SHORT Ekd5.00417FBD
00417F5D  |.  41            |INC ECX
00417F5E  |.^ EB EB         \JMP SHORT Ekd5.00417F4B
从剧本开始的地址 搜索到第一个数字  如果是 R_00.EEX  这样的名称 那么非常不幸的  搜索到第一个0  以后 自动覆盖三个数字
搞不好变成  R_000EEX 没有后缀的杯具
00417F60  |>  83C1 02       ADD ECX,2
00417F63  |.  33D2          XOR EDX,EDX
00417F65  |>  58            /POP EAX
00417F66  |.  04 30         |ADD AL,30
00417F68  |.  8801          |MOV BYTE PTR DS:[ECX],AL
00417F6A  |.  42            |INC EDX
00417F6B  |.  49            |DEC ECX
00417F6C  |.  83FA 03       |CMP EDX,3
00417F6F  |.^ 72 F4         \JB SHORT Ekd5.00417F65
这就是覆盖数字了
00417F71  |.  90            NOP
00417F72  |.  90            NOP
00417F73  |.  90            NOP

00417FA8  |.  90            NOP
00417FA9  |.  90            NOP
这里接回去    顺便说一下  由于原先字串预设长度不够  我换了地址,这个大家酌情吧
00417FAA  |.  C745 E8 00904>MOV DWORD PTR SS:[EBP-18],Ekd5.004D9000  ;  ASCII "SCENE\JINYONG_000.EEX"

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-22 15:27 编辑 [/i]][/color]

2012-2-22 15:45 砖家叫兽
出栈算法

004DD960    55              PUSH EBP
004DD961    8BEC            MOV EBP,ESP
004DD963    60              PUSHAD
004DD964    A1 009F4D00     MOV EAX,DWORD PTR DS:[4D9F00]
保留一个首地址
004DD969    B9 06904D00     MOV ECX,Ekd5.004D9006                    ; ASCII "JINYONG_000.EEX"
004DD96E    8BD1            MOV EDX,ECX
004DD970    81FA 20904D00   CMP EDX,Ekd5.004D9020                    ; ASCII "SAVE\SV0%db.E5S"
004DD976    73 06           JNB SHORT Ekd5.004DD97E
004DD978    C602 00         MOV BYTE PTR DS:[EDX],0
004DD97B    42              INC EDX
004DD97C  ^ EB F2           JMP SHORT Ekd5.004DD970
004DD97E    50              PUSH EAX
004DD97F    51              PUSH ECX
004DD980    6A 00           PUSH 0
004DD982    E8 D95DFFFF     CALL Ekd5.004D3760
004DD987    A1 009F4D00     MOV EAX,DWORD PTR DS:[4D9F00]
004DD98C    8038 00         CMP BYTE PTR DS:[EAX],0
004DD98F    74 06           JE SHORT Ekd5.004DD997
004DD991    C600 00         MOV BYTE PTR DS:[EAX],0
004DD994    40              INC EAX
004DD995  ^ EB F5           JMP SHORT Ekd5.004DD98C
004DD997    A1 009F4D00     MOV EAX,DWORD PTR DS:[4D9F00]
004DD99C    3D 049F4D00     CMP EAX,Ekd5.004D9F04
004DD9A1    76 11           JBE SHORT Ekd5.004DD9B4
004DD9A3    8038 00         CMP BYTE PTR DS:[EAX],0
004DD9A6    75 03           JNZ SHORT Ekd5.004DD9AB
004DD9A8    48              DEC EAX
004DD9A9  ^ EB F1           JMP SHORT Ekd5.004DD99C
004DD9AB    8038 00         CMP BYTE PTR DS:[EAX],0
004DD9AE    74 03           JE SHORT Ekd5.004DD9B3
004DD9B0    48              DEC EAX
004DD9B1  ^ EB F8           JMP SHORT Ekd5.004DD9AB
004DD9B3    40              INC EAX
004DD9B4    A3 009F4D00     MOV DWORD PTR DS:[4D9F00],EAX
004DD9B9    B8 06904D00     MOV EAX,Ekd5.004D9006                    ; ASCII "JINYONG_000.EEX"
004DD9BE    8038 00         CMP BYTE PTR DS:[EAX],0
004DD9C1    74 03           JE SHORT Ekd5.004DD9C6
004DD9C3    40              INC EAX
004DD9C4  ^ EB F8           JMP SHORT Ekd5.004DD9BE
004DD9C6    48              DEC EAX
004DD9C7    8038 FF         CMP BYTE PTR DS:[EAX],0FF
这里有个压缩标志  把结尾后缀 .EEX  用0FF 替代
004DD9CA    75 06           JNZ SHORT Ekd5.004DD9D2
004DD9CC    C700 2E454558   MOV DWORD PTR DS:[EAX],5845452E
004DD9D2    61              POPAD
004DD9D3    8BE5            MOV ESP,EBP
004DD9D5    5D              POP EBP
004DD9D6    C3              RETN

这个 我就不过多解释了

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-22 16:09 编辑 [/i]][/color]

2012-2-22 16:19 砖家叫兽
入栈稍微复杂
004DD8A0    55              PUSH EBP
004DD8A1    8BEC            MOV EBP,ESP
004DD8A3    60              PUSHAD
004DD8A4    A1 009F4D00     MOV EAX,DWORD PTR DS:[4D9F00]
004DD8A9    3D 449F4D00     CMP EAX,Ekd5.004D9F44
004DD8AE    73 08           JNB SHORT Ekd5.004DD8B8
由于空间大小限制 所以这个CMP 用于防止过界
004DD8B0    8038 00         CMP BYTE PTR DS:[EAX],0
004DD8B3    74 4B           JE SHORT Ekd5.004DD900
找到空位置
004DD8B5    40              INC EAX
004DD8B6  ^ EB F1           JMP SHORT Ekd5.004DD8A9
004DD8B8    B8 049F4D00     MOV EAX,Ekd5.004D9F04
004DD8BD    8038 00         CMP BYTE PTR DS:[EAX],0
004DD8C0    74 03           JE SHORT Ekd5.004DD8C5
004DD8C2    40              INC EAX
004DD8C3  ^ EB F8           JMP SHORT Ekd5.004DD8BD
004DD8C5    40              INC EAX
从这里开始前移
004DD8C6    BA 049F4D00     MOV EDX,Ekd5.004D9F04
004DD8CB    3D 609F4D00     CMP EAX,Ekd5.004D9F60
004DD8D0    73 08           JNB SHORT Ekd5.004DD8DA
004DD8D2    8A08            MOV CL,BYTE PTR DS:[EAX]
004DD8D4    880A            MOV BYTE PTR DS:[EDX],CL
004DD8D6    40              INC EAX
004DD8D7    42              INC EDX
004DD8D8  ^ EB F1           JMP SHORT Ekd5.004DD8CB
往前面复制
004DD8DA    81FA 609F4D00   CMP EDX,Ekd5.004D9F60
004DD8E0    73 06           JNB SHORT Ekd5.004DD8E8
004DD8E2    C602 00         MOV BYTE PTR DS:[EDX],0
后面全部填充00
004DD8E5    42              INC EDX
004DD8E6  ^ EB F2           JMP SHORT Ekd5.004DD8DA
004DD8E8    8038 00         CMP BYTE PTR DS:[EAX],0
004DD8EB    75 03           JNZ SHORT Ekd5.004DD8F0
004DD8ED    48              DEC EAX
004DD8EE  ^ EB F8           JMP SHORT Ekd5.004DD8E8
004DD8F0    8038 00         CMP BYTE PTR DS:[EAX],0
004DD8F3    74 03           JE SHORT Ekd5.004DD8F8
004DD8F5    48              DEC EAX
004DD8F6  ^ EB F8           JMP SHORT Ekd5.004DD8F0
004DD8F8    40              INC EAX
004DD8F9    A3 009F4D00     MOV DWORD PTR DS:[4D9F00],EAX
修改记录
004DD8FE  ^ EB A4           JMP SHORT Ekd5.004DD8A4
004DD900    40              INC EAX
004DD901    A3 009F4D00     MOV DWORD PTR DS:[4D9F00],EAX
004DD906    68 06904D00     PUSH Ekd5.004D9006                       ; ASCII "JINYONG_000.EEX"
004DD90B    50              PUSH EAX
004DD90C    6A 00           PUSH 0
004DD90E    E8 4D5EFFFF     CALL Ekd5.004D3760
复制信息
004DD913    33DB            XOR EBX,EBX
004DD915    83FB 06         CMP EBX,6
004DD918    73 38           JNB SHORT Ekd5.004DD952
004DD91A    8B11            MOV EDX,DWORD PTR DS:[ECX]
004DD91C    33C0            XOR EAX,EAX
004DD91E    83F8 04         CMP EAX,4
004DD921    73 15           JNB SHORT Ekd5.004DD938
004DD923    80FA 61         CMP DL,61  字母小写 a
004DD926    72 08           JB SHORT Ekd5.004DD930
004DD928    80FA 7A         CMP DL,7A  字母小写z
004DD92B    77 03           JA SHORT Ekd5.004DD930
004DD92D    80EA 20         SUB DL,20  这就变成大写字母
004DD930    8ADA            MOV BL,DL
004DD932    C1CA 08         ROR EDX,8
004DD935    40              INC EAX
004DD936  ^ EB E6           JMP SHORT Ekd5.004DD91E
004DD938    81FA 2E454558   CMP EDX,5845452E
这个数值其实是文字 .EEX
004DD93E    74 04           JE SHORT Ekd5.004DD944
004DD940    43              INC EBX
004DD941    49              DEC ECX
004DD942  ^ EB D1           JMP SHORT Ekd5.004DD915
004DD944    C601 FF         MOV BYTE PTR DS:[ECX],0FF
检查末尾的0FF这个标记   之前说了 压缩文件后缀
004DD947    41              INC ECX
004DD948    8039 00         CMP BYTE PTR DS:[ECX],0
004DD94B    74 05           JE SHORT Ekd5.004DD952
004DD94D    C601 00         MOV BYTE PTR DS:[ECX],0
004DD950  ^ EB F5           JMP SHORT Ekd5.004DD947
004DD952    61              POPAD
004DD953    8BE5            MOV ESP,EBP
004DD955    5D              POP EBP
004DD956    C3              RETN

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.