回复 #2 岱瀛 的帖子
泛谈曹操传剧本的编写(下篇)
上篇只是RS剧本的低级篇,只要大家会动脑筋就行,下篇则更加涉及技术性的内容,所以岱瀛准备讲述详细点。
不错,108指令是能运用出很多变化,但是还是有些地方运用起来觉得别扭的,108条里面还有一些不好用怎么办? 一个字改,把不好的指令改掉,把缺少的指令改出来。
怎么改,反汇编了,这就是本下篇重点讨论的内容。
在曹操传的Exe以及其他一般MOD的Exe(说岳不是) ,剧本指令是从RS剧本里读进去后,有个switch的地方。
00410A1C |. FF248D 2F1141>JMP DWORD PTR DS:[ECX*4+41112F]
这条指令就是一个分支跳转,从41112F处有整个分支表,那里对应了108条指令的跳转位置。
先看小两条指令,
比如01和08指令,
01指令:
00410A2D |> \B8 04000000 MOV EAX,4
00410A32 |. E9 F4060000 JMP sui.0041112B
08指令:
00410A9D |> \8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00410AA0 |. 52 PUSH EDX ; /Arg1
00410AA1 |. E8 78380000 CALL sui.0041431E ; \sui.0041431E
00410AA6 |. 83C4 04 ADD ESP,4
00410AA9 |. E9 7D060000 JMP sui.0041112B
显然01指令没有什么用处,直接就跳到0041112B处了,而08及其他有功能的指令,都是Call另外地方的指令,最后完成后也是跳转到0041112B结束。
接着看下他Call的地方0041431E
0041431E /$ 55 PUSH EBP
0041431F |. 8BEC MOV EBP,ESP
00414321 |. 51 PUSH ECX
00414322 |. 6A 2E PUSH 2E
00414324 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00414327 |. E8 CB400000 CALL sui.004183F7
0041432C |. 66:8945 FC MOV WORD PTR SS:[EBP-4],AX
00414330 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00414333 25 FFFF0000 AND EAX,0FFFF
00414338 3D 00800000 CMP EAX,8000
0041433D 75 07 JNZ SHORT sui.00414346
0041433F B8 05000000 MOV EAX,5
00414344 EB 17 JMP SHORT sui.0041435D
00414346 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00414349 81E1 FFFF0000 AND ECX,0FFFF
0041434F 51 PUSH ECX
00414350 E8 03850100 CALL sui.0042C858
00414355 83C4 04 ADD ESP,4
00414358 B8 01000000 MOV EAX,1
0041435D |> 8BE5 MOV ESP,EBP
0041435F |. 5D POP EBP
00414360 \. C3 RETN
这个是整个函数的内容。
注意004183F7,这其实是一个解析参数的函数。我们每一条剧本指令,除了指令代号之外,都是带参数的,至于如何解析这个参数,都是通过Call 004183F7实现的。注意前面的PUSH 2E, 这是Call 004183F7的一个重要参数,叫做参数前缀,对应的就是剧本里剧本指令代码中参数前两个字节的那个前缀。刚好这种True和False的设置2E,所以这里就Push 2E,其实这个是可以改的,Exe里改了,然后剧本指令里把这个地方也改了,就OK了,不过这样Van的剧本编辑器就打不开了,这也就有加密的效果了哦。如果你有兴趣把所有指令的剧本参数前缀改一遍,设置分支表位置倒换下,那则是更大的加密了,不过你也得开始考虑自己写一个剧本编辑器了,用UE写剧本那根本不是人干的活。
我们看到,光荣的程序员还是很职业的,对传入参数有很仔细的检查确认,解析出来的数字放到自己函数里的局部变量之后SS:[EBP-4], 还做了很仔细的比较判断。
00414333 25 FFFF0000 AND EAX,0FFFF
00414338 3D 00800000 CMP EAX,8000
0041433D 75 07 JNZ SHORT sui.00414346
0041433F B8 05000000 MOV EAX,5
00414344 EB 17 JMP SHORT sui.0041435D
这一段代码就是这样的效果。
00414350 E8 03850100 CALL sui.0042C858这个地方才是真正完成调用对应功能函数的地方。
校验的代码,光荣的程序员很职业,但是中国的程序员通常都很天才,往往这种很职业的事是不干的,何况Van的编辑器对剧本指令和参数都有做合法性校验,有时候我们自己偷下懒,就悄悄把这个给改掉了,为什么要改掉,笨,如果要加一个参数,哪找空间,现成这里改最好。
当然,看过光荣的读参数那段代码确实很笨,当多个参数的时候,他是一个一个不厌其烦,其实可以用个循环搞定的,能省不少空间。
好了,大概的剧本修改指令的入门已经讲了,至于里面的内容,不同功能有不同代码,已经没办法这样泛谈了,要把108个谈一遍! 那不累死,再次佩服当年Van的研究。说说调试方法把,可以一层层追进去,追到调用API的地方,开个MSDN,查一下,你就知道API在干什么了,几个串起来,就更加明白了,再对应你在游戏里看的效果,我想该能清楚。
下面,学习上篇,也举个例子吧。举什么好呢,又不想在这里泄露隋唐的太多东西,选个有趣的讲吧,就是单挑场景的任意指定。那个由于说岳也已经用了,和大家也见过面了,我就不凡说说吧。这东东目前也就只有说岳和隋唐有,所以大家看看我想也是有点意思的吧。
话归正传:
且看68指令。单挑场景任意指定其实改的就是68指令,让其多了一个参数,指定哪张LOGO图片做为场景,然后我们扩展下LOGO,导多几个图进去也就OK了。
先全面看一下68指令原来的样子:
004110A8 |> \8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] //参数进来
004110AB |. 50 PUSH EAX ; /Arg1
004110AC |. E8 84640000 CALL Ekd5.00417535 ; \Ekd5.00417535
004110B1 |. 83C4 04 ADD ESP,4
004110B4 |. EB 75 JMP SHORT Ekd5.0041112B
00417535 /$ 55 PUSH EBP
00417536 |. 8BEC MOV EBP,ESP
00417538 |. 83EC 08 SUB ESP,8
0041753B |. 6A 02 PUSH 2 ; /这就是武将序号参数前缀
0041753D |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8] ; |
00417540 |. E8 B20E0000 CALL Ekd5.004183F7 ; 解析参数
00417545 |. 66:8945 FC MOV WORD PTR SS:[EBP-4],AX 得到第一个单挑武将序号
00417549 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0041754C |. 25 FFFF0000 AND EAX,0FFFF
00417551 |. 3D 00800000 CMP EAX,8000
00417556 |. 75 0A JNZ SHORT Ekd5.00417562
00417558 |. B8 05000000 MOV EAX,5
0041755D |. E9 82000000 JMP Ekd5.004175E4
00417562 |> 6A 02 PUSH 2 ; /武将序号参数前缀
00417564 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8] ; |
00417567 |. E8 8B0E0000 CALL Ekd5.004183F7 ; \解析参数
0041756C |. 66:8945 F8 MOV WORD PTR SS:[EBP-8],AX 得到第二个单挑武将序号
00417570 |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00417573 |. 81E1 FFFF0000 AND ECX,0FFFF
00417579 |. 81F9 00800000 CMP ECX,8000
0041757F |. 75 07 JNZ SHORT Ekd5.00417588
00417581 |. B8 05000000 MOV EAX,5
00417586 |. EB 5C JMP SHORT Ekd5.004175E4
00417588 |> 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0041758B |. 81E2 FFFF0000 AND EDX,0FFFF
00417591 |. 81FA 00040000 CMP EDX,400
00417597 |. 7D 25 JGE SHORT Ekd5.004175BE
00417599 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0041759C |. 25 FFFF0000 AND EAX,0FFFF
004175A1 |. 3D 00040000 CMP EAX,400
004175A6 |. 7D 16 JGE SHORT Ekd5.004175BE
004175A8 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004175AB |. 81E1 FFFF0000 AND ECX,0FFFF
004175B1 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
004175B4 |. 81E2 FFFF0000 AND EDX,0FFFF
004175BA |. 3BCA CMP ECX,EDX
004175BC |. 75 04 JNZ SHORT Ekd5.004175C2
004175BE |> 33C0 XOR EAX,EAX
004175C0 |. EB 22 JMP SHORT Ekd5.004175E4
004175C2 |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004175C5 |. 25 FFFF0000 AND EAX,0FFFF
004175CA |. 50 PUSH EAX ; /Arg2 第二个武将序号
004175CB |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
004175CE |. 81E1 FFFF0000 AND ECX,0FFFF ; |
004175D4 |. 51 PUSH ECX ; |Arg1 第一个武将序号
004175D5 |. B9 803C4B00 MOV ECX,Ekd5.004B3C80 ; |
004175DA |. E8 C0230300 CALL Ekd5.0044999F ; \关键的功能函数
004175DF |. B8 01000000 MOV EAX,1
004175E4 |> 8BE5 MOV ESP,EBP
004175E6 |. 5D POP EBP
004175E7 \. C3 RETN
0044999F /$ 55 PUSH EBP
004499A0 |. 8BEC MOV EBP,ESP
004499A2 |. 51 PUSH ECX
004499A3 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
004499A6 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] 拿出第一个武将序号
004499A9 |. 50 PUSH EAX ; /Arg1
004499AA |. E8 E107FDFF CALL Ekd5.0041A190 ; \Ekd5.0041A190
004499AF |. 83C4 04 ADD ESP,4
004499B2 |. 85C0 TEST EAX,EAX
004499B4 |. 74 14 JE SHORT Ekd5.004499CA
004499B6 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004499B9 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
004499BC |. 8951 0C MOV DWORD PTR DS:[ECX+C],EDX
004499BF |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004499C2 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004499C5 |. 8948 38 MOV DWORD PTR DS:[EAX+38],ECX
004499C8 |. EB 75 JMP SHORT Ekd5.00449A3F
004499CA |> 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C] 拿出第二个武将序号
004499CD |. 52 PUSH EDX ; /Arg1
004499CE |. E8 BD07FDFF CALL Ekd5.0041A190
004499D3 |. 83C4 04 ADD ESP,4
004499D6 |. 85C0 TEST EAX,EAX
004499D8 |. 74 14 JE SHORT Ekd5.004499EE
004499DA |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004499DD |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004499E0 |. 8948 0C MOV DWORD PTR DS:[EAX+C],ECX
004499E3 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
004499E6 |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
004499E9 |. 8942 38 MOV DWORD PTR DS:[EDX+38],EAX
004499EC |. EB 51 JMP SHORT Ekd5.00449A3F
004499EE |> 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004499F1 |. 6BC9 48 IMUL ECX,ECX,48
004499F4 |. 81C1 0000D600 ADD ECX,0D60000
004499FA |. E8 DDE00200 CALL Ekd5.00477ADC
004499FF |. 8AC8 MOV CL,AL
00449A01 |. 81E1 FF000000 AND ECX,0FF
00449A07 |. 6BC9 24 IMUL ECX,ECX,24
00449A0A |. 81C1 502C4B00 ADD ECX,Ekd5.004B2C50
00449A10 |. E8 FBCCFBFF CALL Ekd5.00406710
00449A15 |. 85C0 TEST EAX,EAX
00449A17 |. 74 14 JE SHORT Ekd5.00449A2D
00449A19 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00449A1C |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00449A1F |. 8951 0C MOV DWORD PTR DS:[ECX+C],EDX
00449A22 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00449A25 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00449A28 |. 8948 38 MOV DWORD PTR DS:[EAX+38],ECX
00449A2B |. EB 12 JMP SHORT Ekd5.00449A3F
00449A2D |> 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00449A30 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00449A33 |. 8942 0C MOV DWORD PTR DS:[EDX+C],EAX
00449A36 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00449A39 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
00449A3C |. 8951 38 MOV DWORD PTR DS:[ECX+38],EDX
00449A3F |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00449A42 |. E8 B1FBFFFF CALL Ekd5.004495F8
00449A47 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00449A4A |. 8901 MOV DWORD PTR DS:[ECX],EAX
00449A4C |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00449A4F . |. 833A 00 CMP DWORD PTR DS:[EDX],0 /////////EDX 00 4B 3c 80
00449A52 |. 74 30 JE SHORT Ekd5.00449A84
00449A54 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00449A57 |.E8 98ECFFFF CALL Ekd5.004486F4 ///重要的地方
00449A5C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00449A5F |. C640 12 01 MOV BYTE PTR DS:[EAX+12],1
00449A63 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00449A66 |. C641 3E 03 MOV BYTE PTR DS:[ECX+3E],3
00449A6A |. 6A 01 PUSH 1 ; /Arg1 = 00000001
00449A6C |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; |
00449A6F |. 8B4A 08 MOV ECX,DWORD PTR DS:[EDX+8] ; |
00449A72 |. E8 BD62FFFF CALL Ekd5.0043FD34 ; \Ekd5.0043FD34
00449A77 |. 6A 00 PUSH 0 ; /Arg1 = 00000000
00449A79 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; |
00449A7C |. 8B48 34 MOV ECX,DWORD PTR DS:[EAX+34] ; |
00449A7F |. E8 B062FFFF CALL Ekd5.0043FD34 \Ekd5.0043FD34
00449A84 |> 8BE5 MOV ESP,EBP
00449A86 |. 5D POP EBP
00449A87 \. C2 0800 RETN 8
接下来的代码太长了,不贴了,反正就是00486F4函数里面的,把关键地点的东西弄出来就好了。
00448AB7|. 6A 0A PUSH 0A ; /Arg1 = 0000000A
00448AB9 |. B9 B8694B00 MOV ECX,Ekd5.004B69B8 ; |
00448ABE |. E8 3BBB0200 CALL Ekd5.004745FE
00448AC3 |. 6A 0A PUSH 0A ; /Arg1 = 0000000A
00448AC5 |. B9 181B4B00 MOV ECX,Ekd5.004B1B18 ; |
00448ACA |. E8 71A8FBFF CALL Ekd5.00403340 0403340
00448ACF |. E8 0C3AFEFF CALL Ekd5.0042C4E0
00448AD4 |. E8 025BFDFF CALL Ekd5.0041E5DB
00448AD9 |. 6A 00 PUSH 0 ; /Arg2 = 00000000
00448ADB |. 6A 00 PUSH 0 ; |Arg1 = 00000000
00448ADD |. 8B8D E8FEFFFF MOV ECX,DWORD PTR SS:[EBP-118] ; |
00448AE3 |. E8 25AFFFFF CALL Ekd5.00443A0D ; \Ekd5.00443A0D
00448AE8 |. 6A 00 PUSH 0 ; /Arg2 = 00000000
00448AEA |. 6A 00 PUSH 0 ; |Arg1 = 00000000
00448AEC |. 8B8D E8FEFFFF MOV ECX,DWORD PTR SS:[EBP-118] ; |
00448AF2 |. E8 7CACFFFF CALL Ekd5.00443773 ; \Ekd5.00443773 (左上角头相)
00448AF7 |. E8 FA5AFDFF CALL Ekd5.0041E5F6 //画人物头象
00448AFC |. 6A 14 PUSH 14 ; /Arg1 = 00000014
00448AFE |. B9 181B4B00 MOV ECX,Ekd5.004B1B18 ; |
00448B03 |. E8 38A8FBFF CALL Ekd5.00403340 ; \Ekd5.00403340
00448B08 |. E8 D339FEFF CALL Ekd5.0042C4E0
00448B0D |. 8B8D E8FEFFFF MOV ECX,DWORD PTR SS:[EBP-118]
00448B13 |. E8 1CAAFFFF CALL Ekd5.00443534
00448B18 |. 6A 14 PUSH 14 ; /Arg1 = 00000014
00448B1A |. B9 181B4B00 MOV ECX,Ekd5.004B1B18 ; |
00448B1F |. E8 1CA8FBFF CALL Ekd5.00403340 ; \Ekd5.00403340
00448B24 |. E8 B739FEFF CALL Ekd5.0042C4E0
00448B29 |. E8 AD5AFDFF CALL Ekd5.0041E5DB
00448B2E |. 6A 00 PUSH 0 ; /Arg2 = 00000000
00448B30 |. 6A 01 PUSH 1 ; |Arg1 = 00000001
00448B32 |. 8B8D E8FEFFFF MOV ECX,DWORD PTR SS:[EBP-118] ; |
00448B38 |. E8 D0AEFFFF CALL Ekd5.00443A0D ; \Ekd5.00443A0D
00448B3D |. 6A 00 PUSH 0 ; /Arg2 = 00000000
00448B3F |. 6A 01 PUSH 1 ; |Arg1 = 00000001
00448B41 |. 8B8D E8FEFFFF MOV ECX,DWORD PTR SS:[EBP-118] ; |
00448B47 |. E8 27ACFFFF CALL Ekd5.00443773 ; \Ekd5.00443773
00448B4C |. E8 A55AFDFF CALL Ekd5.0041E5F6 //画人物头像
00448B51 |. 6A 4B PUSH 4B ; /Arg1 = 0000004B
00448B53 |. B9 181B4B00 MOV ECX,Ekd5.004B1B18 ; |
00448B58 |. E8 E3A7FBFF CALL Ekd5.00403340 ; \Ekd5.00403340
00448B5D |. E8 7E39FEFF CALL Ekd5.0042C4E0
00448B62 |. E8 745AFDFF CALL Ekd5.0041E5DB
00448B67 |. 68 F0BA4800 PUSH Ekd5.0048BAF0 ; /Arg1 = 0048BAF0 ASCII "LOGO.E5"
00448B6C |. 8D8D F0FEFFFF LEA ECX,DWORD PTR SS:[EBP-110] ; |
00448B72 |. E8 BE6FFDFF CALL Ekd5.0041FB35 ; \Ekd5.0041FB35
00448B77 |. 6A 04 PUSH 4 ; /Arg3 = 00000004
00448B79 |. 6A 00 PUSH 0 ; |Arg2 = 00000000
00448B7B |. 6A 00 PUSH 0 ; |Arg1 = 00000000
00448B7D |. B9 68AB4A00 MOV ECX,Ekd5.004AAB68 ; |
00448B82 |. E8 B96E0300 CALL Ekd5.0047FA40 ; \Ekd5.0047FA40
00448B87 |. 50 PUSH EAX ; /Arg2
00448B88 |. 6A 05 PUSH 5 ; |Arg1 = 00000005 //第几张LOGO图
00448B8A |. 8D8D F0FEFFFF LEA ECX,DWORD PTR SS:[EBP-110] ; |
00448B90 |. E8 F470FDFF CALL Ekd5.0041FC89 ; \Ekd5.0041FC89 //单挑背景
可以看出,原来代码里面是写死了第五张,我们只要把这个5变成一个变量,然后变量的值由剧本里的参数传进来不就行了吗?
没错。只要剧本里的68指令再多做一个参数就OK了,整个思路有了,改起来也就十分简单,纯粹是苦力活而已了。
我就把我的修改贴一下吧,功能是实现了,如果说改得不好,那也请各路大侠指点指点。
00417535 $ 55 PUSH EBP
00417536 . 8BEC MOV EBP,ESP
00417538 . 83EC 10 SUB ESP,10
0041753B . 33D2 XOR EDX,EDX
0041753D > 8955 F0 MOV DWORD PTR SS:[EBP-10],EDX
00417540 . 8A92 78754100 MOV DL,BYTE PTR DS:[EDX+417578]
00417546 . 81E2 FF000000 AND EDX,0FF
0041754C . 52 PUSH EDX
0041754D . 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00417550 . E8 A20E0000 CALL sui.004183F7
00417555 . 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
00417558 . 66:894495 F4 MOV WORD PTR SS:[EBP+EDX*4-C],AX
0041755D . 25 FFFF0000 AND EAX,0FFFF
00417562 . 3D 00800000 CMP EAX,8000
00417567 . 75 07 JNZ SHORT sui.00417570
00417569 . B8 05000000 MOV EAX,5
0041756E . EB 37 JMP SHORT sui.004175A7
00417570 > 83FA 02 CMP EDX,2
00417573 . 7D 06 JGE SHORT sui.0041757B
00417575 . 42 INC EDX
00417576 .^ EB C5 JMP SHORT sui.0041753D
00417578 . 0202 ADD AL,BYTE PTR DS:[EDX]
0041757A . 4F DEC EDI //这里是反汇编错误的翻译,其实应该是DB 02 DB 02 DB 4F这三条伪指令,三个前缀参数
0041757B > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0041757E . 25 FFFF0000 AND EAX,0FFFF
00417583 . 50 PUSH EAX
00417584 . 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00417587 . 81E1 FFFF0000 AND ECX,0FFFF
0041758D . 51 PUSH ECX
0041758E . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00417591 . 81E2 FFFF0000 AND EDX,0FFFF
00417597 . 52 PUSH EDX
00417598 . B9 803C4B00 MOV ECX,sui.004B3C80
0041759D . E8 FD230300 CALL sui.0044999F
004175A2 . B8 01000000 MOV EAX,1
004175A7 > 8BE5 MOV ESP,EBP
004175A9 . 5D POP EBP
004175AA . C3 RETN
这个地方改了一下,跳转到一个空白地点,那里新写了我加的代码,这也是一招经常用的方法.
00449A57 .^\E9 4FDBFCFF JMP Ekd5.004175AB
看这里
004175AB > /8B55 10 MOV EDX,DWORD PTR SS:[EBP+10]
004175AE . |52 PUSH EDX
004175AF . |E8 40110300 CALL Ekd5.004486F4
004175B4 . |83C4 04 ADD ESP,4
004175B7 . |E9 A0240300 JMP Ekd5.00449A5C
这里我是看原来那段出现两个头相的代码写得太差,不爽,合并到一起来,改写了,还有就是看那个VS不爽,中国人的单挑,干麻弄个象街头霸王一样的VS啊,去掉了。这一改还省下了一大片的空间,给其他修改利用,呵呵。这也是改EXE的必须啊。看代码,想办法,省空间,找空间大概就这过程。
00448AB7 |. 6A 0A PUSH 0A
00448AB9 |. B9 B8694B00 MOV ECX,Ekd5.004B69B8
00448ABE |. E8 3BBB0200 CALL Ekd5.004745FE
00448AC3 |. 6A 0A PUSH 0A
00448AC5 |> B9 181B4B00 /MOV ECX,Ekd5.004B1B18
00448ACA |. E8 71A8FBFF |CALL Ekd5.00403340
00448ACF |. E8 0C3AFEFF |CALL Ekd5.0042C4E0
00448AD4 |. E8 025BFDFF |CALL Ekd5.0041E5DB
00448AD9 |. 6A 00 |PUSH 0
00448ADB |. FF75 FC |PUSH DWORD PTR SS:[EBP-4]
00448ADE |. 8B8D E8FEFFFF |MOV ECX,DWORD PTR SS:[EBP-118]
00448AE4 |. E8 24AFFFFF |CALL Ekd5.00443A0D
00448AE9 |. 6A 00 |PUSH 0
00448AEB |. FF75 FC |PUSH DWORD PTR SS:[EBP-4]
00448AEE |. 8B8D E8FEFFFF |MOV ECX,DWORD PTR SS:[EBP-118]
00448AF4 |. E8 7AACFFFF |CALL Ekd5.00443773
00448AF9 |. E8 F85AFDFF |CALL Ekd5.0041E5F6
00448AFE |. 837D FC 00 |CMP DWORD PTR SS:[EBP-4],0
00448B02 |. 75 4B |JNZ SHORT Ekd5.00448B4F
00448B04 |. 6A 14 |PUSH 14
00448B06 |. 8345 FC 01 |ADD DWORD PTR SS:[EBP-4],1
00448B0A |.^ EB B9 \JMP SHORT Ekd5.00448AC5
00448B85 |. 50 PUSH EAX
00448B86 |. 8D8D F0FEFFFF LEA ECX,DWORD PTR SS:[EBP-110]
00448B8C |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00448B8F |. 52 PUSH EDX
00448B90 |. E8 F470FDFF CALL Ekd5.0041FC89
看到了吧,原来的Push改了,改成从[EBP+8] 拿了,对吧,这个值是从这里来的
(004175AB > /8B55 10 MOV EDX,DWORD PTR SS:[EBP+10]
004175AE . |52 PUSH EDX)
我想该明白了吧。好了就写到这了,睡觉去了。
|