← Back to DevelopmentAging & Mixing viewer.dll generatorProgramsClan filesInternet Information ServiceOllyDbg tutorialsMiscellaneousSkinsLinks / Files

friendly_crystals

← Back to Miscellaneous
To make crystal monsters friendly, we need to do 2 things :
- Add a flag to know its crystal monster (at ESI+47AC)
- Add comparison case to make the crystals friendly

When you click on a crystal, it's added to the monster stack. Here's the piece of code we're interested in :

OllyDbg - Server side

0055E52E  |> \837C24 1C 09  CMP DWORD PTR SS:[LOCAL.204],9
0055E533  |.  75 0C         JNE SHORT 0055E541
0055E535  |.  8B95 48010000 MOV EDX,DWORD PTR SS:[EBP+148]
0055E53B  |.  8996 30390000 MOV DWORD PTR DS:[ESI+3930],EDX
0055E541  |>  33C0          XOR EAX,EAX


Apparently there's a special case for if a value is equal to 9. Don't really know what it is I haven't tested.
It's where we are going to add the flag (as usual, too lazy to comment the code).
There's not enough space to put the new code, so we're going to jump. In my example, the new code will be at the offset 08B80000 (it's in the GFantasy section) :

OllyDbg - Server side

0055E52E  |> \837C24 1C 09  CMP DWORD PTR SS:[LOCAL.204],9
0055E533  \.  E9 C81A6208   JMP 08B80000
0055E538      90            NOP
0055E539      90            NOP
0055E53A      90            NOP
0055E53B      90            NOP
0055E53C      90            NOP
0055E53D      90            NOP
0055E53E      90            NOP
0055E53F      90            NOP
0055E540  /.  90            NOP
0055E541  |>  33C0          XOR EAX,EAX


And the new code :

OllyDbg - Server side

08B80000   \75 0E                       JNE SHORT 08B80010                              ; If it's not the "9" case jump to the flag instruction
08B80002    8B95 48010000               MOV EDX,DWORD PTR SS:[EBP+148]                  ; "9" case instruction (original)
08B80008    8996 30390000               MOV DWORD PTR DS:[ESI+3930],EDX                 ; "9" case instruction (original)
08B8000E    EB 0A                       JMP SHORT 08B8001A                              ; Skip flag instruction
08B80010    C786 AC470000 01000000      MOV DWORD PTR DS:[ESI+47AC],1                   ; Adding a flag at ESI+47AC
08B8001A  ^ E9 22E59DF7                 JMP 0055E541                                    ; We go back to where we left


Now that our flag is set, we need to use it. Here's the piece of code we're interested in (it's in a procedure computing which monster attacks which one) :

OllyDbg - Server side

005615D7  |.  33D2               |XOR EDX,EDX
005615D9  |>  85C9               |TEST ECX,ECX
005615DB  |.  74 24              |JE SHORT 00561601
005615DD  |.  8B85 CC470000      |MOV EAX,DWORD PTR SS:[EBP+47CC]
005615E3  |.  85C0               |TEST EAX,EAX
005615E5  |.  75 18              |JNE SHORT 005615FF
005615E7  |.  8B85 F8460000      |MOV EAX,DWORD PTR SS:[EBP+46F8]
005615ED  |.  85C0               |TEST EAX,EAX
005615EF  |.  74 10              |JE SHORT 00561601
005615F1  |.  8B8E E4460000      |MOV ECX,DWORD PTR DS:[ESI+46E4]
005615F7  |.  3B81 706C0000      |CMP EAX,DWORD PTR DS:[ECX+6C70]
005615FD  |.  74 02              |JE SHORT 00561601
005615FF  |>  33D2               |XOR EDX,EDX
00561601  |>  3BB5 00470000      |CMP ESI,DWORD PTR SS:[EBP+4700]
00561607  |.  0F84 9A000000      |JE 005616A7


Two things here :
- Clearing EDX at offset 005615FF makes the monsters not attack each others
- With crystal monsters ECX is always empty and the first JE is always taken, skipping offset 005615FF.
We're going to add our test before TEST ECX,ECX.

As usual, no space. We're going to jump to offset 08B80024 :

OllyDbg - Server side

005615D7  |.  33D2                      XOR EDX,EDX
005615D9  |>  E9 46EA6108               JMP 08B80024
005615DE  |   90                        NOP
005615DF  |   90                        NOP
005615E0  |.  90                        NOP
005615E1  |.  90                        NOP
005615E2  |.  90                        NOP
005615E3  |.  90                        NOP
005615E4  |.  90                        NOP
005615E5  |.  90                        NOP
005615E6  |.  90                        NOP
005615E7  |.  90                        NOP
005615E8  |.  90                        NOP
005615E9  |.  90                        NOP
005615EA  |.  90                        NOP
005615EB  |.  90                        NOP
005615EC  |.  90                        NOP
005615ED  |.  90                        NOP
005615EE  |.  90                        NOP
005615EF  |.  90                        NOP
005615F0  |.  90                        NOP
005615F1  |.  90                        NOP
005615F2  |.  90                        NOP
005615F3  |.  90                        NOP
005615F4  |.  90                        NOP
005615F5  |.  90                        NOP
005615F6  |.  90                        NOP
005615F7  |.  90                        NOP
005615F8  |.  90                        NOP
005615F9  |.  90                        NOP
005615FA  |.  90                        NOP
005615FB  |.  90                        NOP
005615FC  |.  90                        NOP
005615FD  |.  90                        NOP
005615FE  |.  90                        NOP
005615FF  |.  90                        NOP
00561600  |.  90                        NOP
00561601  |.  90                        NOP
00561602  |.  90                        NOP
00561603  |.  90                        NOP
00561604  |.  90                        NOP
00561605  |.  90                        NOP
00561606  |.  90                        NOP
00561607  |.  0F84 9A000000             JE 005616A7


And the new code :

OllyDbg - Server side

08B80024   \8B86 AC470000               MOV EAX,DWORD PTR DS:[ESI+47AC]                 ; We load the flag for the first monster
08B8002A    85C0                        TEST EAX,EAX                                    ; Checking if it's 0
08B8002C    74 32                       JE SHORT 08B80060                               ; If 0, it's not a crystal, we jump
08B8002E    8B85 AC470000               MOV EAX,DWORD PTR SS:[EBP+47AC]                 ; We load the flag for the second monster
08B80034    85C0                        TEST EAX,EAX                                    ; Checking if it's 0
08B80036    75 26                       JNE SHORT 08B8005E                              ; If it's not 0, it means both monsters are crystals, we jump to clear EDX
08B80038    85C9                        TEST ECX,ECX                                    ; (original)
08B8003A    74 24                       JE SHORT 08B80060
08B8003C    8B85 CC470000               MOV EAX,DWORD PTR SS:[EBP+47CC]                 ; (original)
08B80042    85C0                        TEST EAX,EAX                                    ; (original)
08B80044    75 18                       JNE SHORT 08B8005E
08B80046    8B85 F8460000               MOV EAX,DWORD PTR SS:[EBP+46F8]                 ; (original)
08B8004C    85C0                        TEST EAX,EAX                                    ; (original)
08B8004E    74 10                       JE SHORT 08B80060
08B80050    8B8E E4460000               MOV ECX,DWORD PTR DS:[ESI+46E4]                 ; (original)
08B80056    3B81 706C0000               CMP EAX,DWORD PTR DS:[ECX+6C70]                 ; (original)
08B8005C    74 02                       JE SHORT 08B80060
08B8005E    31D2                        XOR EDX,EDX                                     ; (original)
08B80060    3BB5 00470000               CMP ESI,DWORD PTR SS:[EBP+4700]                 ; (original)
08B80066  ^ E9 9C159EF7                 JMP 00561607                                    ; We go back to where we left


Your monster crystals are now friendly :) .
They don't attack each others, but they still attack pets and normal monsters.