2012-2-21 17:36
砖家叫兽
修改对话框接收玩家输入主角姓名代码(供学习用)
004D7C80 55 PUSH EBP
004D7C81 8BEC MOV EBP,ESP
004D7C83 51 PUSH ECX
004D7C84 81EC 00020000 SUB ESP,200
004D7C8A 8BCC MOV ECX,ESP
004D7C8C 51 PUSH ECX
004D7C8D C605 CA7C4D00 0>MOV BYTE PTR DS:[4D7CCA],1
004D7C94 E8 07130000 CALL Ekd5.004D8FA0
004D7C99 C605 CA7C4D00 0>MOV BYTE PTR DS:[4D7CCA],0
004D7CA0 8BE5 MOV ESP,EBP
004D7CA2 5D POP EBP
004D7CA3 C3 RETN
这个函数 做了特殊标记 调用子函数后还原
004D8FA0 55 PUSH EBP
004D8FA1 8BEC MOV EBP,ESP
004D8FA3 51 PUSH ECX
004D8FA4 68 50CA4D00 PUSH Ekd5.004DCA50
替换信息
004D8FA9 B9 88AD4C00 MOV ECX,Ekd5.004CAD88
存储了对话框信息的二进制代码
004D8FAE E8 4D390000 CALL Ekd5.004DC900
拷贝数据
004D8FB3 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004D8FB6 E8 959EF9FF CALL Ekd5.00472E50
004D8FBB 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004D8FBE 33C0 XOR EAX,EAX
004D8FC0 8941 44 MOV DWORD PTR DS:[ECX+44],EAX
004D8FC3 6A 00 PUSH 0
004D8FC5 6A 00 PUSH 0
004D8FC7 6A 7F PUSH 7F
人物编号?
004D8FC9 68 40010000 PUSH 140
004D8FCE 890D 00605000 MOV DWORD PTR DS:[506000],ECX
这里 衔接到买入卖出的改动 需根据实际情况调整
004D8FD4 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004D8FD7 90 NOP
004D8FD8 90 NOP
004D8FD9 E8 3E4CF9FF CALL Ekd5.0046DC1C
买入卖出对话框 调用就靠这个函数
现在由于已经改动了对话框 因此 对话框样子已经变了
004D8FDE 90 NOP
004D8FDF 90 NOP
004D8FE0 B9 88AD4C00 MOV ECX,Ekd5.004CAD88
存储了对话框信息的二进制代码
004D8FE5 68 28C94D00 PUSH Ekd5.004DC928
还原
004D8FEA E8 11390000 CALL Ekd5.004DC900
拷贝数据
004D8FEF 90 NOP
004D8FF0 8BE5 MOV ESP,EBP
004D8FF2 5D POP EBP
004D8FF3 C3 RETN
这个函数 用引擎复制数据来代替用EXESCOPE
使得一个对话框 可以在代码控制下 变形 从而作为别的用途
0046DE9C /. 55 PUSH EBP
0046DE9D |. 8BEC MOV EBP,ESP
0046DE9F |. 83EC 0C SUB ESP,0C
0046DEA2 |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
0046DEA5 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0046DEA8 |. 83F8 4E CMP EAX,4E
0046DEAB |. 0F84 8A000000 JE Ekd5.0046DF3B
0046DEB1 |. 3D 11010000 CMP EAX,111
0046DEB6 |. 74 09 JE SHORT Ekd5.0046DEC1
0046DEB8 |. 3D 15010000 CMP EAX,115
0046DEBD |. 74 1B JE SHORT Ekd5.0046DEDA
0046DEBF |. EB 48 JMP SHORT Ekd5.0046DF09
0046DEC1 |> 90 NOP
0046DEC2 |. 90 NOP
0046DEC3 |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
0046DEC6 |. 66:81F9 9D05 CMP CX,59D
0046DECB |. 75 3C JNZ SHORT Ekd5.0046DF09
0046DECD |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
0046DED0 |. C1EA 10 SHR EDX,10
0046DED3 |. 66:81FA 0003 CMP DX,300
0046DED8 |. 75 2F JNZ SHORT Ekd5.0046DF09
0046DEDA |> 803D CA7C4D00>CMP BYTE PTR DS:[4D7CCA],0
知道为什么要做标记了吧
0046DEE1 |. 74 28 JE SHORT Ekd5.0046DF0B
0046DEE3 |. 90 NOP
0046DEE4 |. 6A 2C PUSH 2C ; /Count = 2C (44.)
0046DEE6 |. 68 609F4D00 PUSH Ekd5.004D9F60 ; |Buffer = Ekd5.004D9F60
这个地址是缓冲区 由于配合着剧本的操作,所以我下一步只要对这个地址中的文字进行操作
0046DEEB |. 68 9D050000 PUSH 59D ; |ControlID = 59D (1437.)
0046DEF0 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; |
0046DEF3 |. 8B48 04 MOV ECX,DWORD PTR DS:[EAX+4] ; |
0046DEF6 |. 51 PUSH ECX ; |hWnd
0046DEF7 |. FF15 D07C4D00 CALL DWORD PTR DS:[4D7CD0] ; \GetDlgItemTextA
添加了一个新的函数 不再获取数字 而是可以获取字符 函数首地址是
DS:[004D7CD0]=77D6AE36 (USER32.GetDlgItemTextA)
有了这个函数 保证可以输入字符
0046DEFD |. 6A 00 PUSH 0 ; /Arg2 = 00000000
0046DEFF |. 6A 00 PUSH 0 ; |Arg1 = 00000000
0046DF01 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C] ; |
0046DF04 |. E8 A3020000 CALL Ekd5.0046E1AC ; \Ekd5.0046E1AC
0046DF09 |> EB 2E JMP SHORT Ekd5.0046DF39
0046DF0B |> 90 NOP
0046DF0C |. 90 NOP
0046DF0D |. 90 NOP
0046DF0E |. 6A 01 PUSH 1 ; /IsSigned = TRUE
0046DF10 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] ; |
0046DF13 |. 50 PUSH EAX ; |pSuccess
0046DF14 |. 68 9D050000 PUSH 59D ; |ControlID = 59D (1437.)
0046DF19 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; |
0046DF1C |. 8B48 04 MOV ECX,DWORD PTR DS:[EAX+4] ; |
0046DF1F |. 51 PUSH ECX ; |hWnd
0046DF20 |. FF15 74624800 CALL DWORD PTR DS:[<&USER32.GetDlgItemIn>; \GetDlgItemInt
这才是原始的获取数字的函数
0046DF26 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0046DF29 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0046DF2C |. 50 PUSH EAX ; /Arg2
0046DF2D |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
0046DF30 |. 51 PUSH ECX ; |Arg1
0046DF31 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C] ; |
0046DF34 |. E8 73020000 CALL Ekd5.0046E1AC ; \Ekd5.0046E1AC
0046DF39 |> EB 1C JMP SHORT Ekd5.0046DF57
0046DF3B |> 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
0046DF3E |. 90 NOP
0046DF3F |. 90 NOP
0046DF40 |. 90 NOP
0046DF41 |. 8B41 08 MOV EAX,DWORD PTR DS:[ECX+8]
0046DF44 |. 3D 00010000 CMP EAX,100
0046DF49 |. 75 0C JNZ SHORT Ekd5.0046DF57
0046DF4B |. 90 NOP
0046DF4C |. 90 NOP
0046DF4D |. 90 NOP
0046DF4E |. 8B11 MOV EDX,DWORD PTR DS:[ECX]
0046DF50 |. 52 PUSH EDX ; /hWnd
0046DF51 |. FF15 08634800 CALL DWORD PTR DS:[<&USER32.HideCaret>] ; \HideCaret
0046DF57 |> 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
0046DF5A |. 50 PUSH EAX
0046DF5B |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
0046DF5E |. 51 PUSH ECX
0046DF5F |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
0046DF62 |. 52 PUSH EDX
0046DF63 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
0046DF66 |. 8B11 MOV EDX,DWORD PTR DS:[ECX]
0046DF68 |. FF52 04 CALL DWORD PTR DS:[EDX+4]
0046DF6B |. 8BE5 MOV ESP,EBP
0046DF6D |. 5D POP EBP
0046DF6E \. C2 0C00 RETN 0C
2012-2-21 17:40
砖家叫兽
0046E1AC /$ 55 PUSH EBP
0046E1AD |. 8BEC MOV EBP,ESP
0046E1AF |. 51 PUSH ECX
0046E1B0 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0046E1B3 |. 33D2 XOR EDX,EDX
0046E1B5 |. F771 48 DIV DWORD PTR DS:[ECX+48]
0046E1B8 |. 8955 08 MOV DWORD PTR SS:[EBP+8],EDX
0046E1BB |. 803D CA7C4D00>CMP BYTE PTR DS:[4D7CCA],0
做标记的用途
0046E1C2 |. 0F85 91000000 JNZ Ekd5.0046E259
0046E1C8 |. 837D 0C 00 CMP DWORD PTR SS:[EBP+C],0
0046E1CC |. 0F84 96000000 JE Ekd5.0046E268
0046E1D2 |. 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
0046E1D6 |. 0F8E 8C000000 JLE Ekd5.0046E268
0046E1DC |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4]
0046E1DF |. 0FB641 41 |MOVZX EAX,BYTE PTR DS:[ECX+41]
0046E1E3 |. 3B45 08 |CMP EAX,DWORD PTR SS:[EBP+8]
0046E1E6 |. 7D 10 |JGE SHORT Ekd5.0046E1F8
0046E1E8 |. 8B41 48 |MOV EAX,DWORD PTR DS:[ECX+48]
0046E1EB |. 99 |CDQ
0046E1EC |. B9 0A000000 |MOV ECX,0A
0046E1F1 |. F7F1 |DIV ECX
0046E1F3 |. 2945 08 |SUB DWORD PTR SS:[EBP+8],EAX
0046E1F6 |.^ EB E4 \JMP SHORT Ekd5.0046E1DC
0046E1F8 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0046E1FB |. 8A45 08 MOV AL,BYTE PTR SS:[EBP+8]
0046E1FE |. 8841 40 MOV BYTE PTR DS:[ECX+40],AL
0046E201 |. 6A 00 PUSH 0 ; /IsSigned = FALSE
0046E203 |. 0FB641 40 MOVZX EAX,BYTE PTR DS:[ECX+40] ; |
0046E207 |. 50 PUSH EAX ; |Value
0046E208 |. 68 9D050000 PUSH 59D ; |ControlID = 59D (1437.)
0046E20D |. 8B51 04 MOV EDX,DWORD PTR DS:[ECX+4] ; |
0046E210 |. 52 PUSH EDX ; |hWnd
0046E211 |. FF15 E4624800 CALL DWORD PTR DS:[<&USER32.SetDlgItemIn>; \SetDlgItemInt
0046E217 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0046E21A |. 0FB641 4C MOVZX EAX,BYTE PTR DS:[ECX+4C]
0046E21E |. 50 PUSH EAX ; /lParam
0046E21F |. 50 PUSH EAX ; |wParam
0046E220 |. 68 B1000000 PUSH 0B1 ; |Message = EM_SETSEL
0046E225 |. 68 9D050000 PUSH 59D ; |ControlID = 59D (1437.)
0046E22A |. 8B51 04 MOV EDX,DWORD PTR DS:[ECX+4] ; |
0046E22D |. 52 PUSH EDX ; |hWnd
0046E22E |. FF15 90634800 CALL DWORD PTR DS:[<&USER32.SendDlgItemM>; \SendDlgItemMessageA
0046E234 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0046E237 |. E8 A4FBFFFF CALL Ekd5.0046DDE0
0046E23C |. 6A 01 PUSH 1 ; /Enable = TRUE
0046E23E |. 6A 01 PUSH 1 ; |/ControlID = 1
0046E240 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; ||
0046E243 |. 8B48 04 MOV ECX,DWORD PTR DS:[EAX+4] ; ||
0046E246 |. 51 PUSH ECX ; ||hWnd
0046E247 |. FF15 DC624800 CALL DWORD PTR DS:[<&USER32.GetDlgItem>] ; |\GetDlgItem
0046E24D |. 50 PUSH EAX ; |hWnd
0046E24E |. FF15 E8624800 CALL DWORD PTR DS:[<&USER32.EnableWindow>; \EnableWindow
0046E254 |. E9 CF000000 JMP Ekd5.0046E328
0046E259 |> 90 NOP
0046E25A |. 90 NOP
0046E25B |. 90 NOP
0046E25C |. 90 NOP
0046E25D |. 90 NOP
0046E25E |. 90 NOP
0046E25F |. 817D 04 4FE04>CMP DWORD PTR SS:[EBP+4],Ekd5.0046E04F
0046E266 |. 75 1E JNZ SHORT Ekd5.0046E286
0046E268 |> 90 NOP
此处的判断 完全是为了消除一开始对话框会显示数字1 的BUG
0046E269 |. 90 NOP
0046E26A |. 90 NOP
0046E26B |. 90 NOP
0046E26C |. 90 NOP
0046E26D |. 90 NOP
0046E26E |. 90 NOP
0046E26F |. 68 28694B00 PUSH Ekd5.004B6928 ; /Text = ""
这个地址内容就是空白 所以当你输入非法数字 (比方说 汉字 英文) 就会清空信息 由于前面设置了 CMP 所以 做了标记后 跳过这一段了
0046E274 |. 68 9D050000 PUSH 59D ; |ControlID = 59D (1437.)
0046E279 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; |
0046E27C |. 8B42 04 MOV EAX,DWORD PTR DS:[EDX+4] ; |
0046E27F |. 50 PUSH EAX ; |hWnd
0046E280 |. FF15 D8624800 CALL DWORD PTR DS:[<&USER32.SetDlgItemTe>; \SetDlgItemTextA
第一个函数算是接口,我是接到了剧本指令的相应位置来调用的,因此跟蛇夫座与剧本接口处修改差不太多
唯一不同的是,我这个接收文字机制全部在本引擎完成 获取了一个地址来存储信息 还需要配合剧本使用
当然 配合剧本 也有个好处 设置场景名 (比方为主角家设置个性名称,额,这是指金庸群侠传的情况)
总之 配合剧本是比较自由的
另 附两个有用信息
0046DC1C /$ 55 PUSH EBP
0046DC1D |. 8BEC MOV EBP,ESP
0046DC1F |. 51 PUSH ECX
0046DC20 |. 8B45 14 MOV EAX,DWORD PTR SS:[EBP+14]
0046DC23 |. 8941 3C MOV DWORD PTR DS:[ECX+3C],EAX
0046DC26 |. 8B0D 00605000 MOV ECX,DWORD PTR DS:[506000]
0046DC2C |. E8 3C3D0100 CALL Ekd5.0048196D
0046DC31 |. 50 PUSH EAX ; /人物
0046DC32 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C] ; |
0046DC35 |. 52 PUSH EDX ; |上限
0046DC36 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
0046DC39 |. 83C1 0C ADD ECX,0C ; |
0046DC3C |. E8 91F7FFFF CALL Ekd5.0046D3D2 ; \说话
0046DC41 |. 50 PUSH EAX
0046DC42 |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
0046DC45 |. 85C0 TEST EAX,EAX
0046DC47 |. 74 0C JE SHORT Ekd5.0046DC55
0046DC49 |. 50 PUSH EAX ; /Arg1
0046DC4A |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
0046DC4D |. 83C1 0C ADD ECX,0C ; |
0046DC50 |. E8 E5F7FFFF CALL Ekd5.0046D43A ; \Ekd5.0046D43A
0046DC55 |> 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
0046DC58 |. 51 PUSH ECX ; /Arg2
0046DC59 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8] ; |
0046DC5C |. 52 PUSH EDX ; |Arg1
0046DC5D |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
0046DC60 |. E8 33F4FFFF CALL Ekd5.0046D098 ; \Ekd5.0046D098
0046DC65 |. 50 PUSH EAX
0046DC66 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0046DC69 |. 8379 38 00 CMP DWORD PTR DS:[ECX+38],0
0046DC6D |. 74 12 JE SHORT Ekd5.0046DC81
0046DC6F |. 83C1 0C ADD ECX,0C
0046DC72 |. E8 60F8FFFF CALL Ekd5.0046D4D7
0046DC77 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0046DC7A |. C741 38 00000>MOV DWORD PTR DS:[ECX+38],0
0046DC81 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0046DC84 |. 83C1 0C ADD ECX,0C
0046DC87 |. E8 6DF7FFFF CALL Ekd5.0046D3F9
0046DC8C |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
0046DC8F |. 8BE5 MOV ESP,EBP
0046DC91 |. 5D POP EBP
0046DC92 \. C2 1000 RETN 10
这个是买入卖出对话框的修改
特别注明一点
0046DC26 |. 8B0D 00605000 MOV ECX,DWORD PTR DS:[506000]
DATA信息本人已经不用,而采用指针变量0指向首地址,此处需根据实际情况处理
004DC900 55 PUSH EBP
004DC901 8BEC MOV EBP,ESP
004DC903 51 PUSH ECX
004DC904 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
004DC907 53 PUSH EBX
004DC908 33DB XOR EBX,EBX
004DC90A 83FB 49 CMP EBX,49
004DC90D 73 0D JNB SHORT Ekd5.004DC91C
004DC90F 8B02 MOV EAX,DWORD PTR DS:[EDX]
004DC911 8901 MOV DWORD PTR DS:[ECX],EAX
004DC913 83C1 04 ADD ECX,4
004DC916 83C2 04 ADD EDX,4
004DC919 43 INC EBX
004DC91A ^ EB EE JMP SHORT Ekd5.004DC90A
004DC91C 5B POP EBX
004DC91D 8BE5 MOV ESP,EBP
004DC91F 5D POP EBP
004DC920 C2 0400 RETN 4
这个函数就是复制信息
而 对话框的二进制信息 大家可以在EXESCOPE等等中间 设置好
主要是设置 XY 坐标等等 还有就是 取消这个文字 我改成了 确定
不需要的控件 设置大小 X Y =0 或者 坐标 超出范围就可以了
[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-21 17:49 编辑 [/i]][/color]
2012-2-21 21:07
hrw_09
:hz1026:顶,强大
2012-3-4 11:15
南德逸剑
:hz1016:咦?不懂耶~~用法?
2012-3-4 13:18
周定乾坤
我很想说。。。然后在俺的电脑上,强制退出。。。- -
2012-3-4 22:10
灬棉崽灬
改了这个后是不是就可以自己设定主角的名字咯?
2012-3-6 10:12
513633522
回复 #6 灬棉崽灬 的帖子
还是有很大的限制性的 :hz1026:
2012-3-21 19:54
周定乾坤
回复 #6 灬棉崽灬 的帖子
木有蛇夫座的好用,你别被牛给耍了...
2012-3-22 20:37
砖家叫兽
[quote]原帖由 [i]灬棉崽灬[/i] 于 2012-3-4 22:10 发表
改了这个后是不是就可以自己设定主角的名字咯? [/quote]
配合着剧本用吧
比方我的判断都是跟剧本一起 利用整形进行计算的。
2012-3-22 20:38
砖家叫兽
[quote]原帖由 [i]周定乾坤[/i] 于 2012-3-21 19:54 发表
木有蛇夫座的好用,你别被牛给耍了... [/quote]
我改的是剧本指令 弹出神马的根据各方面因素来的
2012-3-22 20:39
砖家叫兽
[quote]原帖由 [i]513633522[/i] 于 2012-3-6 10:12 发表
还是有很大的限制性的 :hz1026: [/quote]
配合剧本用的指令 从本质上就不一样
而且 无外链 完全依靠反汇编在引擎内部解决问题
2012-3-22 20:43
砖家叫兽
[quote]原帖由 [i]南德逸剑[/i] 于 2012-3-4 11:15 发表
:hz1016:咦?不懂耶~~用法? [/quote]
关键配合着剧本用
2012-3-22 20:49
砖家叫兽
我自己测试时没发现什么异常
可能是打包的时候问题 可能是后来修正过的原因 甚至别处的BUG
配合剧本 配合指针 给什么人物命名都可以 给什么兵种命名都可以 总之 只是个接受文字的机制
额 抽象与具体的区别
[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-3-22 20:51 编辑 [/i]][/color]
页:
[1]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.