| | |
|
岱瀛
(deving)
| |
| | |
|
| | |
|
组别 | 经略使 |
级别 | 左将军 |
好贴 | 1 |
功绩 | 2293 |
帖子 | 1370 |
编号 | 55810 |
注册 | 2005-12-22 |
来自 | 人间 |
家族 | 慕容世家 |
| |
| | |
|
|
|
原帖由 yanguodong 于 2007-9-11 18:11 发表
00406471 /E9 E65E0300 jmp Ekd5.0043C35C(空白位置)
00406476 |90 nop
00406477 |90 nop
00406478 |90 ... 思路大概对了,但是改得并不是特别好。
这个是原来无反的代码,准确的讲,是无反判断是否有效的代码。
00406462 |> \6A 2C PUSH 2C ; /Arg1 = 0000002C
00406464 |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10] ; |
00406467 |. 8B49 08 MOV ECX,DWORD PTR DS:[ECX+8] ; |
0040646A |. E8 9A150000 CALL WaGan.00407A09 ; \WaGan.00407A09
0040646F |. 85C0 TEST EAX,EAX
00406471 |. 74 09 JE SHORT WaGan.0040647C
00406473 |. C745 F8 00000000 MOV DWORD PTR SS:[EBP-8],0
0040647A |. EB 33 JMP SHORT WaGan.004064AF
0040647C |> 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
而这一整段才是真正意义的反击代码。
004064B5 |. A1 042E4900 MOV EAX,DWORD PTR DS:[492E04]
004064BA |. 83C0 01 ADD EAX,1
004064BD |. A3 042E4900 MOV DWORD PTR DS:[492E04],EAX
004064C2 |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
004064C5 |. 8A11 MOV DL,BYTE PTR DS:[ECX]
004064C7 |. 52 PUSH EDX ; /Arg2
004064C8 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; |
004064CB |. 8A48 01 MOV CL,BYTE PTR DS:[EAX+1] ; |
004064CE |. 51 PUSH ECX ; |Arg1
004064CF |. E8 55F30200 CALL WaGan.00435829 ; \WaGan.00435829
004064D4 |. 83C4 08 ADD ESP,8
004064D7 |. 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
004064DA |. 8A02 MOV AL,BYTE PTR DS:[EDX]
004064DC |. 50 PUSH EAX ; /Arg2
004064DD |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10] ; |
004064E0 |. 8A51 01 MOV DL,BYTE PTR DS:[ECX+1] ; |
004064E3 |. 52 PUSH EDX ; |Arg1
004064E4 |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10] ; |
004064E7 |. E8 05000000 CALL WaGan.004064F1 ; \WaGan.004064F1
CALL WaGan.00407A09 这个,作用就是判断ecx武将他的身上是否有装备宝物属性具备 2C特征。
简单用剧本指令的形式讲,就是 无反装备测试。
但凡测试,就有true和false. 一般非0则为true,0则为false.
eax是没次call一个函数的返回值所在。 Test eax,eax 无非就是在判断eax是不是0值
JE SHORT WaGan.0040647C 看,零值跳转,代表假,说名不存在2C属性,所以执行反击代码。
如果非零,代表真,
MOV DWORD PTR SS:[EBP-8],0
JMP SHORT WaGan.004064AF
这个跳转再看结果,
CMP DWORD PTR SS:[EBP-8],0
JE SHORT WaGan.004064EC
其实就是 jmp 4064EC. 也就是说,不执行反击代码。
简单的用高级语言描述下这个函数,其实很简单就是
if (非受无反装备者攻击 && 被攻击方具备反击能力)
{
反击;
}
而你的目的是做成
if (非受无反装备者攻击 && 非受无发攻击部队攻击 && 被攻击方具备反击能力)
{
反击;
}
所以你的代码只需要这样写:
je short Ekd5.0043C365
jmp Ekd5.004064EC 攻击者带无反装备,跳过反击有效代码,返回
43C365 mov ecx,dword ptr ss:[ebp-10]
mov ecx,dword ptr ds:[ecx+8]
call Ekd5.00406610
and eax,0FF
cmp eax,27(兵种)
jnz Ekd5.0040647C
jmp Ekd5.004064EC 攻击是27兵种,跳过反击有效代码,返回
其他的一切其他特性,应该懂得改了吧。 这个属性如果是要做成人物特性,即以人物Data序号做判断的,也应该会吧。
祝果冻早日学成所有特性随意变更修改法。
对了,提醒下, 人物信息在exe里,经常有四种表达,两种常是ecx值,两种常是08栈值。
08栈值的都是个简单数字, 一个是Data序号,一个是战场形象编号。
而两个内存地址,分别是Data信息内存地址和战场信息内存地址。以1024Data为例, Data信息内存起始地址在 0xD6000处 战场信息内存地址在0x4B2c50处。
Data信息每0x48为一块,战场信息以0x24为一块。
所以应该经常可以看到Imual eax,eax,24 Imual eax,eax,48之类的指令。应该能明白这其中的玄机了吧。
内存各字节的意义,可参看ssbye的用FPE修改曹操传的贴子。
[ 本帖最后由 岱瀛 于 2007-9-11 22:06 编辑 ]
|
|
|
|