HX3 Foren  

  HX3 Foren > Konstruktiv > Software- und Webentwicklung

Software- und Webentwicklung Planung, Programmierung und Administration
UML, JavaScript/DOM, ASP, JSP, PHP, Apache, MySQL, Python, Perl (...)

Antwort
 
Themen-Optionen Ansicht
Alt 08.08.2006, 12:49   #1 (permalink)
Tokio Hotel Fan 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von boonz
 
Registriert seit: 04.05.2005
Ort: Bahamas
Alter: 32
Beiträge: 1.460
boonz eine Nachricht über ICQ schicken boonz eine Nachricht über Skype™ schicken
Standard [w32 asm]Dynamic Link Libraries

Tach,

da ich grade ein bisschen Assembler mache, dachte ich mir, dass es vielleicht jemanden interessiert. Bücher & Hefte raus, jetzt wird gelernt

Dynamic Link Libraries

Dabei handelt es sich um eine unter Windows verwendete Programmbibliothek. Sie haben das gleiche Format wie .exe - Dateien, enthalten also auch Opcodes, Ressourcen usw., enden aber auf .dll .

Warum?

Warum soll ich meinen Programm-Code in einer DLL verpacken, wenn ich es auch genausogut in die eigentliche Anwendung schreiben kann?
Ganz einfach: Ich bin vielleicht nicht der einzige, der den Kram in der DLL brauch! Vielleicht wollen andere Anwendungen auch gerne darauf zugreifen, aber das geht wohl schlecht, wenn es in meiner .exe eingebunden ist. Das führt natürlich auch zu ziemlicher Arbeits-Speicher-Schon-Tour: Die Datei muss nur einmal in den Speicher geladen werden und kann von da so oft wie nötig benutzt werden.

Es gibt sogar noch einen Vorteil, die sog. "Modularität":
Sagen wir, in der DLL seien irgendwelche Funktionen archiviert. Nun müssen aber einige dieser Funktionen geändert / geupdatet werden, wieauchimmer. Anstatt jetzt in allen Anwendungen diese Funktionen ändern zu müssen, nimmt man die Änderungen einmal an der DLL vor und alle Programme sind geupdatet. Im großen Stil wie z.B. beim Office Paket o.Ä. führt das natürlich zu enormen Arbeits-Vereinfachung.

DLLs werden auch gerne in noch einer anderen Fuktion verwendet: Als Plug-Ins.
Ich möchte gerne eine kleine Erweiterung zu meinem Lieblings-Programm schreiben. Eine koch-mir-den-kaffee-funktion. Kein Problem:
Den Code in einer DLL verfassen, Plug-In im Programm aktivieren, fertig ist. Dynamische Einbindbarkeit, Dynamic Linking

Wie?

Schön, schön, wie sieht das Ganze in der Praxis aus?
Nun, Windows bietet zwei Möglichkeiten, eine DLL einzubinden:

Implizit:
Windows lädt die DLL automatisch mit dem Client-Programm (das Programm, das die DLL "anfordert"), bevor der Client ausgeführt wird, sodass er auf die DLL zugreifen kann.
Diese Methode ist ratsam, wenn der Client mindestens eine Prozedur aus der DLL braucht, da Windows es ja sowieso in den Speicher lädt, da wir es Windows ja implizit mitgeteilt haben.

Explizit
Was passiert aber, wenn die DLL-Datei gar nicht da ist? Die Anwendung wird gar nicht erst gestartet werden. Das lässt sich mit explizitem Einbinden vermeiden:
Hierbei lädt Windows die DLL erst, wenn der erste Client die DLL während des Ausführens "anfordert".

Zum Anfordern verwendet man (unter Assembly) folgende Funktionen:
LoadLibrary - um die DLL in den Speicher zu laden
GetProcAddress - um die Adresse der jeweiligen Funktionen zu erlangen
FreeLibrary - um die DLL wieder aus dem Speicher "freizulassen", weil sie nicht mehr gebraucht wird

Wie genau?

Nun, DLLs enthalten exportierte & nicht-exportierte Funktionen, sprich publike und private Funktionen. Die exportierten Funktionen dienen dem Client, wohingegen dieser von den privaten nichts weiß, diese dienen der DLL intern.

Jede DLL hat einen Einsprungspunkt (Entrypoint). Dieser wird vom System "angesprochen", wenn ein Client nach der DLL verlangt. Im Einsprungspunkt kann die DLL auch Speicherplatz reservieren.

Ein typischer Einsprungspunkt ist so aufgebaut:

Code:
BOOL WINAPI DllEntryPoint(

    HINSTANCE hinstDLL,	// handle to DLL module 
    DWORD fdwReason,	// reason for calling function 
    LPVOID lpvReserved 	// reserved 
   );
Es werden also beim Aufruf des Einsprungpunktes drei Parameter weitergegeben, von denen der dritte aber nicht benutzt wird.

hInstDLL ist der module handle der DLL. Eine Art Erkennungsmarke der DLL, die sich nicht ändert, es sei denn die DLL wird neu-geladen.

fdwReason kann vier verschiedene Werte haben:
  • DLL_PROCESS_ATTACH - das nutzt man, wenn die DLL zum ersten Mal in den Speicher gelesen wird. Es dient zur Initialisierung.
  • DLL_PROCESS_DETACH - hiermit wird die DLL aus dem Speicher gelesen. Man kann zB. Speicher wieder freigeben.
  • DLL_THREAD_ATTACH - man erzeugt einen neuen Thread.
  • DLL_THREAD_DETACH - ein Thread im Prozess wird wieder gelöscht.

Funktionen in der DLL können irgendwo abgelagert werden, aber wenn sie exportiert werden sollen, dann müssen sie zusätzlich in einer .DEF-Datei verzeichnet sein. Dazu später.

Das DLL-Skelett

*Bemerkung: Ich verwende MASM-Syntax & -Bibliotheken

DLLSkelett.asm
Code:
.386 
.model flat, stdcall 
option casemap:none 

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data

.data?

.code

DLLEntry proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
	
	.if reason == DLL_PROCESS_ATTACH	; Initialisierung,wenn die DLL geladen wird
		mov eax,TRUE			; eax muss TRUE sein, damit die DLL läuft
	.elseif reason == DLL_PROCESS_DETACH	
		; Code für das Entladen der DLL
	.elseif reason == DLL_THREAD_ATTACH		
		; Thread im Prozess starten
	.elseif reason == DLL_THREAD_DETACH		 
		; Thread im Prozess zerstören
	.endif
	Ret
	
DLLEntry Endp

ExpFunc1 proc
	; Code für die erste Funktion
	Ret
ExpFunc1 EndP

ExpFunc2 proc
	; Code für die zweite Funktion
	Ret
ExpFunc2 EndP

ExpFunc3 proc
	; Code für die dritte Funktion
	Ret
ExpFunc3 EndP

end DLLEntry
Skelett.def

Code:
LIBRARY   DLLSkelett
EXPORTS  _ExpFunc1   @   01  
               _ExpFunc2   @   02
               _ExpFunc3   @   03
Hehehe, ich halte den Programmcode für ziemlich selbst-erklärend. Später mehr dazu, wie man die Funktionen dann auch aufrufen kann.

*P.S.:

Für Code-Beispiele in Hochsprachen siehe Wikipedia:
Dynamic Link Library - Wikipedia
__________________
Zitat:

"Sodomy non sapiens."
- Pterry (Mort)

o
L_
OL
"This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat."

"Tokio Hotel Fan" -edited by Burns :P
- auch edited by Burns :P
boonz ist offline   Mit Zitat antworten
Alt 13.08.2006, 12:32   #2 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard AW: [w32 asm]Dynamic Link Libraries

Hi boons,

ich habe folgendes Anliegen: Ich spiele derzeit gerne C&C Stunde Null und das Spiel finde ich echt super, aber manchmal wird das vermiest durch cheater die immer genau wissen was auf der Karte los ist und weiß was der Gegner in seiner Basis macht. Das nennt sich Maphack und ist auch bei anderen Real Time Strategy Spielen vertreten, we z.B. Warcraft 3. Da dachte ich mir warum schauste dir das ganze nichtmal an und versuchst erstmal zu verstehen wie das funktioniert, damit man dagegen vielleicht was unternehmen kann.

Der Cheat verändert über Opcodes in der Memory von game.dat (generals) einige Einträge um das Spiel clientside zu verändern. Ich habe bereits versucht passende Adressen für bestimmte Aktionen zu finden, und diese zu verändern. Das geht auch ganz gut, aber wenn ich das ganze über die ausgegeben Opcodes ändern will geht das nicht. Überhaupt scheinen sich die Adressen beim Neustart der Anwendung zu verändern. Zudem habe ich auch keine Ahnung wie ich letztendlich die Werte der Adressen ausgeben und per Asm im Spiel irgendwie anzeigen lassen kann. Erster weg wäre es erstmal local hinzubekommen. Ziel ist es natürlich von dem jenigen auszulesen, mit dem man im Spiel per p2p verbunden ist. Hast du da vielleicht Ideen ob und wie man das bewerkstelligen kann?

Mfg, xezon.
xezon ist offline   Mit Zitat antworten
Alt 13.08.2006, 13:43   #3 (permalink)
Tokio Hotel Fan 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von boonz
 
Registriert seit: 04.05.2005
Ort: Bahamas
Alter: 32
Beiträge: 1.460
boonz eine Nachricht über ICQ schicken boonz eine Nachricht über Skype™ schicken
Standard AW: [w32 asm]Dynamic Link Libraries

Sie haben Post.
__________________
Zitat:

"Sodomy non sapiens."
- Pterry (Mort)

o
L_
OL
"This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat."

"Tokio Hotel Fan" -edited by Burns :P
- auch edited by Burns :P
boonz ist offline   Mit Zitat antworten
Alt 14.08.2006, 09:11   #4 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard AW: [w32 asm]Dynamic Link Libraries

Auslesen von localen Veränderungen in Programmmemory - coding-board
xezon ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Kontakt - HX3.de - Archiv - Nach oben

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias



SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119