| 
|  |  |  |  |  |  岱瀛 (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 编辑 ]
 |  |  |  |