• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

[Tutorial][1.10]MercOnlyItems

Dav92

Ist öfter hier
Registriert
13 Oktober 2006
Beiträge
852
So, nun ein "kleines" Tutorial von mir, wie man richtige MercOnlyItems erstellt.


Benötigte Programme/Dateien:
OllyDBG
ItemTypes.txt
patchstring.tbl
D2Client.dll
D2Game.dll

Und los gehts:
Zunächst solltet ihr euch einen neuen ItemType in der ItemTypes.txt anlegen und alle Items, die nachher MercOnly sein sollen, darauf

verlinken.

Dann öffnet ihr die D2Client.dll mit OllyDBG und geht zu folgender CodeStelle:
Code:
6FAED563  PUSH 0
6FAED565  PUSH 0
6FAED567  PUSH 0
6FAED569  PUSH 0
6FAED56B  PUSH EBP
6FAED56C  PUSH EBX
6FAED56D  CALL <JMP.&D2Common.#10756>

Da wir hier zu wenig Platz haben, müssen wir an eine Stelle springen, an der wir mehr Platz haben. In einer unveränderten

D2Client.dll hat es genügend Platz gegen Ende der dll ab Offset 6FB6C4A0.
Also springen wir dort hin. Danach sollte euer Code wie folgt aussehen:

Code:
6FAED563  JMP 6FB6C4A0
6FAED568  NOP
6FAED569  NOP
6FAED56A  NOP
6FAED56B  NOP
6FAED56C  NOP
6FAED56D  NOP
6FAED56E  NOP
6FAED56F  NOP
6FAED570  NOP
6FAED571  NOP

Ab Offset 6FB6C4A0 schreibt ihr folgendes:

Code:
6FB6C4A0  PUSH 0
6FB6C4A2  PUSH 0
6FB6C4A4  PUSH 0
6FB6C4A6  PUSH 0
6FB6C4A8  PUSH EBP
6FB6C4A9  PUSH EBX
6FB6C4AA  CALL <JMP.&D2Common.#10756>		;Alle Anforderungen erfüllt?
6FB6C4AF  TEST EAX,EAX				;Wenn nein, dann erlaube dem Merc
6FB6C4B1  JE D2Client.6FAED572			;nicht, das Item zu tragen
6FB6C4B7  PUSH 67				;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
6FB6C4B9  PUSH EBX				;ptItem
6FB6C4BA  CALL <JMP.&D2Common.#10731>		;Vergleicht den ItemType des Items mit dem vorgegebenen 
6FB6C4BF  JMP 6FAED572				;springt zurück in den Originalcode

Abspeichern und dann könnt ihr es testen. Ab sofort kann der Merc nur noch Items tragen, die auf den neuen ItemType verlinkt sind.

Aber bisher kann unser Charakter diese Items auch noch tragen und es wird noch kein "MercOnly"-String angezeigt. Um den "MercOnly"-

String kümmern wir uns jetzt:
Ihr öffnet nun die D2Client.dll wieder und geht zu folgendem Code:

Code:
6FAE395E  MOV EDX,EAX
6FAE3960  LEA ECX,DWORD PTR SS:[ESP+208]
6FAE3967  CALL ESI
6FAE3969  MOV EDX,DWORD PTR SS:[ESP+38]
6FAE396D  LEA ECX,DWORD PTR SS:[ESP+4208]
6FAE3974  CALL D2Client.6FB20430

Von nun an ist mehr Eigeninitiative von euch gefordert, da ich eine andere D2Client.dll verwende, und somit keine korrekten Offsets

für freie Stellen in der dll posten kann.
Ihr springt also vom Offset 6FAE395E zu einer freien Stelle, und nop'ed den Rest aus. An eurer freien Stelle, solltet ihr nachher

folgenden Code stehen haben:

Code:
  PUSH EAX				;\
  PUSH ECX				; | Zunächst sichern wir
  PUSH EDX				; | alle Register, so dass
  PUSH EBX				; | wir diese beliebig
  PUSH EBP				; | verwenden können
  PUSH ESI				; |
  PUSH EDI				;/
  MOV EAX,DWORD PTR DS:[6FBB58F0]	;ptItem
  PUSH 67				;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH EAX				;ptItem
  CALL <JMP.&D2Common.#10731>		;Vergleicht den ItemType des Items mit dem vorgegebenen
  TEST EAX,EAX				;Überspringt das Einfügen unseres
  JE SHORT ENDE				;neuen Strings, wenn das Item nicht den entsprechenden ItemType hat
  MOV ECX,2B98				;Nun öffnet ihr die patchstring.tbl und fügt am Ende einen neuen String ein. Mein Code ist so beschaffen, dass er nur mit folgendem String richtig arbeitet: "\red;(Mercenary only)" Nun notiert ihr euch den Index eures Strings. Wer AFJs .tbl-Editor nutzt klickt dazu auf "id#". Diesen Wert müsst ihr nun hier eintragen
  CALL <JMP.&D2Lang.#10004>		;Gibt einen ptr zu unserem String zurück
  XOR ECX,ECX				;\
WEITER:					; |
  MOV EDX,DWORD PTR DS:[EAX+ECX*4]	; | Dieser Code verfrachtet unseren String
  MOV DWORD PTR SS:[ESP+ECX*4+4224],EDX	; | auf den Stack, von wo aus dieser dann nachher vom Game gelesen wird
  INC ECX				; |
  CMP ECX,9				; |
  JLE SHORT WEITER			;/
ENDE:
  POP EDI				;\
  POP ESI				; | Stellt die ursprünglichen Register wieder her
  POP EBP				; |
  POP EBX				; |
  POP EDX				; |
  POP ECX				; |
  POP EAX				;/
  MOV EDX,EAX				;\
  LEA ECX,DWORD PTR SS:[ESP+208]	; | Teile des Originalcodes,
  CALL ESI				; | welcher benötigt wird,
  MOV EDX,DWORD PTR SS:[ESP+38]		; | um unseren String anzuzeigen
  LEA ECX,DWORD PTR SS:[ESP+4208]	; |
  CALL D2Client.6FB20430		;/
  JMP D2Client.6FAE3979			;springt zurück in den Originalcode

So, das war der kurze Teil. Um einen Check einzubauen, dass nur noch der Merc diese Items tragen kann, müssen 10 weitere Stellen

bearbeitet werden, 5 in der D2Client.dll und 6 in der D2Game.dll. Ab hier poste ich nur noch den Code. Ihr wisst inzwischen ja schon,

was ihr zu tun habe. Nämlich einfach an eine "leere" Stelle springen und dort den Code eintragen:

Die 5 Stellen in der D2Client.dll:
Code:
6FAE0538  JMP CHECK1
6FAE06B0  JMP CHECK2
6FAE118A  JMP CHECK3
6FAE2F3F  JMP CHECK4
6FB2B56B  JMP CHECK5

Code:
[color=red]CHECK1:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Client.6FAE053D
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH EBX
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER1
  XOR EAX,EAX
  JMP D2Client.6FAE053D
WEITER1:
  INC EAX
  JMP D2Client.6FAE053D

[color=red]CHECK2:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Client.6FAE06B5
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER2
  XOR EAX,EAX
  JMP D2Client.6FAE06B5
WEITER2:
  INC EAX
  JMP D2Client.6FAE06B5

[color=red]CHECK3:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Client.6FAE118F
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER3
  XOR EAX,EAX
  JMP D2Client.6FAE118F
WEITER3:
  INC EAX
  JMP D2Client.6FAE118F

[color=red]CHECK4:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Client.6FAE2F44
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH DWORD PTR DS:[6FBB58F0]
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER4:
  XOR EAX,EAX
  JMP D2Client.6FAE2F44
WEITER4:
  INC EAX
  JMP D2Client.6FAE2F44

[color=red]CHECK5:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Client.6FB2B570
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER5
  XOR EAX,EAX
  JMP D2Client.6FB2B570
WEITER5:
  INC EAX
  JMP D2Client.6FB2B570

Und nun zur D2Game.dll:

Code:
6FC44C65  JMP CHECK6
6FC451DB  JMP CHECK7
6FC44D5F  JMP CHECK8
6FC4602A  JMP CHECK9
6FC42FC2  JMP CHECK10
6FC46325  JMP CHECK11

Code:
[color=red]CHECK6:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Game.6FC44C6A
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER6
  XOR EAX,EAX
  JMP D2Game.6FC44C6A
WEITER6:
  INC EAX
  JMP D2Game.6FC44C6A

[color=red]CHECK7:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Game.6FC451E0
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER7
  XOR EAX,EAX
  JMP D2Game.6FC451E0
WEITER7:
  INC EAX
  JMP D2Game.6FC451E0

[color=red]CHECK8:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Game.6FC44D64
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER8
  XOR EAX,EAX
  JMP D2Game.6FC44D64
WEITER8:
  INC EAX
  JMP D2Game.6FC44D64

[color=red]CHECK9:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Game.6FC4602F
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER9
  XOR EAX,EAX
  JMP D2Game.6FC4602F
WEITER9:
  INC EAX
  JMP D2Game.6FC4602F

[color=red]CHECK10:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Game.6FC42FC7
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER10
  XOR EAX,EAX
  JMP D2Game.6FC42FC7
WEITER10:
  INC EAX
  JMP D2Game.6FC42FC7

[color=red]CHECK11:[/color]
  CALL <JMP.&D2Common.#10756>
  TEST EAX,EAX
  JE D2Game.6FC4632A
  PUSH 67                                       ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
  PUSH ESI
  CALL <JMP.&D2Common.#10731>
  TEST EAX,EAX
  JE SHORT WEITER11
  XOR EAX,EAX
  JMP D2Game.6FC4632A
WEITER11:
  INC EAX
  JMP D2Game.6FC4632A

So, nun sollten eure MercOnlyItems funktionieren. Viel Spaß damit.
 
Zuletzt bearbeitet:
Huhu.

Ich habe soeben alle Änderungen übernommen und die MercOnly-Items funktionieren einwandfrei, sehr schönes Tutorial.

Vielen Dank dafür und für die Hilfestellungen über ICQ. :)

Gruß
Xalthur
 
Hi,

nettet Tut aber einmal ganz laut MÖÖÖP.

Dav92 benutze grade in Zeiten von Vista und Win7 niemals harte JMP Befehle! denn dadurch das diese manuell eingefügt werden wird windows diese nicht relokieren (sind nicht in der relokationstabelle) sprich mit ASLR ist ein Crash sporadisch vorprogrammiert.

Der richtige Weg ist sich vorher die Basisadresse der Dll zu besorgen, dort den offset innerhalb der dll aufzuaddieren und dann dorthin zu springen!


Gruß

Seltsamuel
 
Hi,

Ich springe ja nicht zwischen dlls, von da her, macht es nichts. Es sind alles relative JMPs. Es wurde schließlich alles unter so gut wie allen Bedingungen getestet, was das Relocaten von D2Client.dll und D2Game.dll einschließt.
Im obigen Code gibt es nur zwei Zeilen, bei denen es Probleme mit ASLR gibt, nämlich:

Code:
 MOV EAX,DWORD PTR DS:[6FBB58F0]	;ptItem
und
Code:
  PUSH DWORD PTR DS:[6FBB58F0]

In nächster Zeit werde ich aber noch hinzufügen, wie man diese beiden in die Relocationtable einbaut.


MfG
 
Zurück
Oben