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

display_level

← Back to Miscellaneous
This explains how to display the level of monsters, npc, players with the normal client.

When you launch a GM client, you probably have noticed that you have alot of extra info.

01.jpg

Whether it's displayed is decided here :

OllyDbg - Client side

0043E950  |> \A1 6CC48B00   MOV EAX,DWORD PTR DS:[8BC46C]            ; GM client flag
0043E955  |.  85C0          TEST EAX,EAX
0043E957  |.  0F84 78030000 JE 0043ECD5                              ; Skip if it's not a GM client
0043E95D  |.  A1 90A60703   MOV EAX,DWORD PTR DS:[307A690]           ; Mini-map opened flag
0043E962  |.  85C0          TEST EAX,EAX
0043E964  |.  0F84 6B030000 JE 0043ECD5                              ; Skip if the mini-map is closed


If the client didn't jump, all the code fetching and drawing the level is executed, as well as the code for the rest of the info (attack, defense, ...) .
This is the code for the level only :

OllyDbg - Client side

0043E96A  |.  8B5424 10     MOV EDX,DWORD PTR SS:[ESP+10]
0043E96E  |.  68 FFFFFF00   PUSH OFFSET client                       ; /Color = <WHITE>
0043E973  |.  52            PUSH EDX                                 ; |hDC
0043E974  |.  FFD7          CALL EDI                                 ; \GDI32.SetTextColor
0043E976  |.  A1 44548F00   MOV EAX,DWORD PTR DS:[8F5444]
0043E97B  |.  8B35 30115F00 MOV ESI,DWORD PTR DS:[5F1130]
0043E981  |.  8B3D D4A25B00 MOV EDI,DWORD PTR DS:[<&USER32.wsprintfA
0043E987  |.  50            PUSH EAX                                 ; /<%d> => [8F5444] = 120.
0043E988  |.  8D4C24 40     LEA ECX,[ESP+40]                         ; |
0043E98C  |.  68 240A5C00   PUSH OFFSET client                       ; |Format = "Level   : %d"
0043E991  |.  51            PUSH ECX                                 ; |Buf
0043E992  |.  83C6 50       ADD ESI,50                               ; |
0043E995  |.  FFD7          CALL EDI                                 ; \USER32.wsprintfA
0043E997  |.  83C4 0C       ADD ESP,0C
0043E99A  |.  8D5424 3C     LEA EDX,[ESP+3C]
0043E99E  |.  52            PUSH EDX                                 ; /Arg1
0043E99F  |.  FFD5          CALL EBP                                 ; \kernel32.lstrlen
0043E9A1  |.  8B0D 2C115F00 MOV ECX,DWORD PTR DS:[5F112C]
0043E9A7  |.  8B5424 10     MOV EDX,DWORD PTR SS:[ESP+10]
0043E9AB  |.  50            PUSH EAX                                 ; /Arg5
0043E9AC  |.  8D4424 40     LEA EAX,[ESP+40]                         ; |
0043E9B0  |.  50            PUSH EAX                                 ; |Arg4
0043E9B1  |.  56            PUSH ESI                                 ; |Arg3
0043E9B2  |.  83C1 CE       ADD ECX,-32                              ; |
0043E9B5  |.  51            PUSH ECX                                 ; |Arg2
0043E9B6  |.  52            PUSH EDX                                 ; |Arg1
0043E9B7  |.  E8 B48AFCFF   CALL 00407470                            ; \client.00407470


All we have to do is swap this code and the TESTs code, and the client will display the level all the time, and if it's a GM client, it'll display the rest of the info.
Sounds pretty easy.

One important information about that piece of code. At the beginning (in my client), the value of ESP was 0012EC20.
Everytime you PUSH something, the value of ESP is changed. That's why you can see some ADD ESP,xx in the info code. It's to set the value back to it's initial value.
If the code ends with ESP not set to it's initial value, the application will crash.

The problem is that at the end of the Level info code, the value of ESP (in my client) is 0012EC0C.
It's only adjusted later in the code, after the next printf :

OllyDbg - Client side

0043E9D8  |.  83C4 24       ADD ESP,24


If we jump without adjusting the value of ESP, the client will crash.
Since we don't have extra space to add code, i will disable the second test (the mini-map one) and replace it with the code to adjust the value of ESP.

The first step is to just swap the codes. It'll give you something like that :

OllyDbg - Client side

0043E950  |> \8B5424 10             MOV EDX,DWORD PTR SS:[ESP+10]
0043E954  |.  68 FFFFFF00           PUSH OFFSET client.00FFFFFF                                  ; /Color = <WHITE>
0043E959  |.  52                    PUSH EDX                                                     ; |hDC
0043E95A  |.  FFD7                  CALL EDI                                                     ; \GDI32.SetTextColor
0043E95C  |.  A1 44548F00           MOV EAX,DWORD PTR DS:[8F5444]
0043E961  |.  8B35 30115F00         MOV ESI,DWORD PTR DS:[5F1130]
0043E967  |.  8B3D D4A25B00         MOV EDI,DWORD PTR DS:[<&USER32.wsprintfA>]
0043E96D  |.  50                    PUSH EAX                                                     ; /<%d> => [8F5444] = 0
0043E96E  |.  8D4C24 40             LEA ECX,[ESP+40]                                             ; |
0043E972  |.  68 240A5C00           PUSH OFFSET client.005C0A24                                  ; |Format = "Level   : %d"
0043E977  |.  51                    PUSH ECX                                                     ; |Buf
0043E978  |.  83C6 50               ADD ESI,50                                                   ; |
0043E97B  |.  FFD7                  CALL EDI                                                     ; \USER32.wsprintfA
0043E97D  |.  83C4 0C               ADD ESP,0C
0043E980  |.  8D5424 3C             LEA EDX,[ESP+3C]
0043E984  |.  52                    PUSH EDX                                                     ; /Arg1
0043E985  |.  FFD5                  CALL EBP                                                     ; \kernel32.lstrlen
0043E987  |.  8B0D 2C115F00         MOV ECX,DWORD PTR DS:[5F112C]
0043E98D  |.  8B5424 10             MOV EDX,DWORD PTR SS:[ESP+10]
0043E991  |.  50                    PUSH EAX                                                     ; /Arg5
0043E992  |.  8D4424 40             LEA EAX,[ESP+40]                                             ; |
0043E996  |.  50                    PUSH EAX                                                     ; |Arg4
0043E997  |.  56                    PUSH ESI                                                     ; |Arg3
0043E998  |.  83C1 CE               ADD ECX,-32                                                  ; |
0043E99B  |.  51                    PUSH ECX                                                     ; |Arg2
0043E99C  |.  52                    PUSH EDX                                                     ; |Arg1
0043E99D  |.  E8 CE8AFCFF           CALL 00407470                                                ; \client.00407470
0043E9A2  |.  A1 6CC48B00           MOV EAX,DWORD PTR DS:[8BC46C]                                ; GM client flag
0043E9A7  |.  85C0                  TEST EAX,EAX
0043E9A9  |.  0F84 26030000         JE 0043ECD5                                                  ; Skip if it's not a GM client
0043E9AF  |.  A1 90A60703           MOV EAX,DWORD PTR DS:[307A690]                               ; Mini-map opened flag
0043E9B4  |.  85C0                  TEST EAX,EAX
0043E9B6  |.  0F84 19030000         JE 0043ECD5                                                  ; Skip if the mini-map is closed


Now we are goin to replace the mini-map code with the ESP code :

OllyDbg - Client side

0043E9A2  |.  A1 6CC48B00           MOV EAX,DWORD PTR DS:[8BC46C]                                ; GM client flag
0043E9A7  |.  85C0                  TEST EAX,EAX
0043E9A9  |.  75 11                 JNE SHORT 0043E9BC                                           ; Go to the rest of the code if it's a GM client
0043E9AB  |.  83C4 14               ADD ESP,14                                                   ; Adjust ESP if it's not a GM client
0043E9AE  |.  E9 22030000           JMP 0043ECD5                                                 ; Skip if it's not a GM client
0043E9B3  |   90                    NOP
0043E9B4  |   90                    NOP
0043E9B5  |   90                    NOP
0043E9B6  |   90                    NOP
0043E9B7  |   90                    NOP
0043E9B8  |   90                    NOP
0043E9B9  |   90                    NOP
0043E9BA  |   90                    NOP
0043E9BB  |   90                    NOP
0043E9BC  |>  A1 68548F00           MOV EAX,DWORD PTR DS:[8F5468]


Now your normal client displays levels.

02.jpg

03.jpg

The GM client will behave the way it used to be. Except the info wont dissapear when you close the mini-map.