Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 23:20

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



In wow Static pointer finden

Discussion on In wow Static pointer finden within the General Coding forum part of the Coders Den category.

Reply
 
Old 03/19/2007, 21:34   #31
 
sd333221's Avatar
 
elite*gold: 9
Join Date: Dec 2005
Posts: 621
Received Thanks: 365
Quote:
Originally posted by silon+Mar 18 2007, 20:40--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (silon @ Mar 18 2007, 20:40)</td></tr><tr><td id='QUOTE'>
Um korrekt zu sein, wird nur der Thread, der den Software Breakpoint auslöst, angehalten. Alle anderen laufen wie gewohnt weiter. Ob der Debugger die anderen Threads trotzdem anhält, steht ihm frei (was die meisten aber tun).
[/b]

Wow, du bist aber schlau,
und da der Code den er anhalten will beim Schreiben vom Leben liegt, was wird da wohl passieren?

</span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (silon)</td></tr><tr><td id='QUOTE'>
Weil die Suche in der Form gar nicht notwendig ist. Es ist - was Prozessorzeit und Speichernutzung angeht - billiger einen Software Breakpoint auszulösen und zu behandeln als einen Speicherbereich nach Werten (Pattern) zu durchsuchen.
[/b][/quote]
Hättest du den Post vom Threadstarter genau gelesen, wäre dir vielleicht aufgefallen, dass er darauf hingewiesen hat das warden nach Veränderungen im Speicher sucht und dann eventuell den Account flaggt

</span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (silon)</td></tr><tr><td id='QUOTE'>
Du bezeichnest redox' Methode mit dem dazugehörigen Code als unsauber und später sagst du selbst, dein eigener Code wäre dreckig? Komischer Kautz bist du
[/b][/quote]
Ist das dein ernst?
Du verstehst wohl nicht dass es auf keinen Fall angemessen ist einen Prozess debuggerartig zu manipulieren, dass er nicht mehr alleine laufen kann (mit z.B. dem EBFE trick ) [der überigens verdammt viel CPU braucht (...) als am Programmstart kurz (gerade mal ne halbe Sekunde) nach diesem Pattern zu scannen

Quote:

Ich hatte mich schon immer gefragt, ob man mit so einem scheiss Geld machen kann.
1.Was soll hier ein "scheiss" sein?
2.Hättest du in meinem Post weitergelesen (die Begründung warum ich den Quellcode hier jetzt _nicht_ poste) wärst du vielleicht zu dem Schluss gekommen, dass das mit dem Geld nicht ernst gemeint war

Da coded man was, was die Frage des Topicstarters (der ausdrücklich nach einem POINTER gesucht hat) beantwortet und dann kommt so ein Neunmalkluger und meint iergendwelche Codemanipulationen wären besser...

Grüße

<!--QuoteBegin--sd333221
@Mar 19 2007, 18:31

Code gibts gegen Geld per PM
(...)
Code ist raus an: 1.
[/quote]
Ich hatte mich schon immer gefragt, ob man mit so einem scheiss Geld machen kann.
sd333221 is offline  
Old 03/20/2007, 11:08   #32
 
elite*gold: 0
Join Date: Mar 2006
Posts: 111
Received Thanks: 0
Hi "Haxx0r",

Quote:
Originally posted by sd333221+Mar 19 2007, 21:34--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (sd333221 @ Mar 19 2007, 21:34)</td></tr><tr><td id='QUOTE'>Wow, du bist aber schlau,
und da der Code den er anhalten will beim Schreiben vom Leben liegt, was wird da wohl passieren?[/b]

Ich hatte nicht vor Anfängertutorials zu verfassen. Da musst du dich anderswo umsehen.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Hättest du den Post vom Threadstarter genau gelesen, wäre dir vielleicht aufgefallen, dass er darauf hingewiesen hat das warden nach Veränderungen im Speicher sucht und dann eventuell den Account flaggt
Ach, ein Tutorial über die Funktionsweise von Warden möchtest du auch noch? Denkst du ernsthaft, dich würde im Ernstfall die Tatsache schützen, dass dein Tool keinen Code in WoW (oder Diablo 2) manipuliert? Es gibt genug öffentlich-zugängliche Artikel, wo die Aktivität von Warden aufgezeichnet wurde (API-Hooking). Deshalb brauchst du mich gar nicht auf diesen Punkt hinweisen, da es "deine" Methode genau so betrifft.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Ist das dein ernst?
Du verstehst wohl nicht dass es auf keinen Fall angemessen ist einen Prozess debuggerartig zu manipulieren,
"auf keinen Fall angemessen" "debuggerartig zu manipulieren" *lach*

Du kannst Software-Breakpoints auslösen und behandeln ohne den Prozess in den Debug-Mode zu setzen. Die Idee kommt dir vielleicht beim Lesen dieser beiden Artikel von Matt Pietrek:




Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
dass er nicht mehr alleine laufen kann (mit z.B. dem EBFE trick ) [der überigens verdammt viel CPU braucht (...) als am Programmstart kurz (gerade mal ne halbe Sekunde) nach diesem Pattern zu scannen
Halbe Sekunde? Bei mir dauert das auslösen und behandeln eines Software-Breakpoints 1,8ms.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
1.Was soll hier ein "scheiss" sein?
Dein Code, laut deiner eigenen Aussage.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
2.Hättest du in meinem Post weitergelesen (die Begründung warum ich den Quellcode hier jetzt _nicht_ poste) wärst du vielleicht zu dem Schluss gekommen, dass das mit dem Geld nicht ernst gemeint war
Nicht erkennbar. Ich kann auch etwas behaupten und später, wenn ich den Fehler erkannt habe, sagen: "Nein, das hast du ganz falsch kapiert. Es war so gemeint ..."

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Da coded man was, was die Frage des Topicstarters (der ausdrücklich nach einem POINTER gesucht hat) beantwortet
Da hast du Recht, der Topicstarter wollte einen Pointer haben, also zitiere ich dich einfach:

"Wenn ich mir Zeit nehmen würden würde ich sicher auch schnellere Methoden finden =>
Pointer sofort rauskriegen"

Für mich wären das nicht irgendwelche Suchoperationen im Speicher sondern das Auslesen eines Pointers an einer statischen Adresse und anhand der bekannten struct - als Beispiel nehme ich einfach eine Linked-List-Implementierung - geht man alle Units durch, bis man bei seiner eigenen Unit ist und dort liest man seinen Health aus. Das wäre in meinen Augen eine saubere Lösung mit "deiner" Methode ohne Code zu manipulieren.

Um das hier nicht unnötig in die Länge zu ziehen, kannst du gleich deinen Code posten (Binärdatei wäre auch ok). Vielleicht reden wir auch nur aneinander vorbei.

Es geht mir hier einzig und allein um die Aussage, die du an Redox gerichtet hast. In meinen Augen hast du dich damit jeder fachlichen Kompetenz disqualifiziert. Ob dir meine Meinung etwas bedeutet oder am Arsch vorbeigeht, ist mir auch wieder egal.

<!--QuoteBegin--sd333221
@Mar 19 2007, 21:34
und dann kommt so ein Neunmalkluger und meint iergendwelche Codemanipulationen wären besser...[/quote]
Ja.
SilonVier is offline  
Old 03/20/2007, 13:56   #33
 
sd333221's Avatar
 
elite*gold: 9
Join Date: Dec 2005
Posts: 621
Received Thanks: 365
Quote:
Originally posted by SilonVier+Mar 20 2007, 11:08--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (SilonVier @ Mar 20 2007, 11:08)</td></tr><tr><td id='QUOTE'> Hi "Haxx0r",

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Wow, du bist aber schlau,
und da der Code den er anhalten will beim Schreiben vom Leben liegt, was wird da wohl passieren?
Ich hatte nicht vor Anfängertutorials zu verfassen. Da musst du dich anderswo umsehen.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Hättest du den Post vom Threadstarter genau gelesen, wäre dir vielleicht aufgefallen, dass er darauf hingewiesen hat das warden nach Veränderungen im Speicher sucht und dann eventuell den Account flaggt
Ach, ein Tutorial über die Funktionsweise von Warden möchtest du auch noch? Denkst du ernsthaft, dich würde im Ernstfall die Tatsache schützen, dass dein Tool keinen Code in WoW (oder Diablo 2) manipuliert? Es gibt genug öffentlich-zugängliche Artikel, wo die Aktivität von Warden aufgezeichnet wurde (API-Hooking). Deshalb brauchst du mich gar nicht auf diesen Punkt hinweisen, da es "deine" Methode genau so betrifft.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Ist das dein ernst?
Du verstehst wohl nicht dass es auf keinen Fall angemessen ist einen Prozess debuggerartig zu manipulieren,
"auf keinen Fall angemessen" "debuggerartig zu manipulieren" *lach*

Du kannst Software-Breakpoints auslösen und behandeln ohne den Prozess in den Debug-Mode zu setzen. Die Idee kommt dir vielleicht beim Lesen dieser beiden Artikel von Matt Pietrek:




Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
dass er nicht mehr alleine laufen kann (mit z.B. dem EBFE trick ) [der überigens verdammt viel CPU braucht (...) als am Programmstart kurz (gerade mal ne halbe Sekunde) nach diesem Pattern zu scannen
Halbe Sekunde? Bei mir dauert das auslösen und behandeln eines Software-Breakpoints 1,8ms.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
1.Was soll hier ein "scheiss" sein?
Dein Code, laut deiner eigenen Aussage.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
2.Hättest du in meinem Post weitergelesen (die Begründung warum ich den Quellcode hier jetzt _nicht_ poste) wärst du vielleicht zu dem Schluss gekommen, dass das mit dem Geld nicht ernst gemeint war
Nicht erkennbar. Ich kann auch etwas behaupten und später, wenn ich den Fehler erkannt habe, sagen: "Nein, das hast du ganz falsch kapiert. Es war so gemeint ..."

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Da coded man was, was die Frage des Topicstarters (der ausdrücklich nach einem POINTER gesucht hat) beantwortet
Da hast du Recht, der Topicstarter wollte einen Pointer haben, also zitiere ich dich einfach:

"Wenn ich mir Zeit nehmen würden würde ich sicher auch schnellere Methoden finden =>
Pointer sofort rauskriegen"

Für mich wären das nicht irgendwelche Suchoperationen im Speicher sondern das Auslesen eines Pointers an einer statischen Adresse und anhand der bekannten struct - als Beispiel nehme ich einfach eine Linked-List-Implementierung - geht man alle Units durch, bis man bei seiner eigenen Unit ist und dort liest man seinen Health aus. Das wäre in meinen Augen eine saubere Lösung mit "deiner" Methode ohne Code zu manipulieren.

Um das hier nicht unnötig in die Länge zu ziehen, kannst du gleich deinen Code posten (Binärdatei wäre auch ok). Vielleicht reden wir auch nur aneinander vorbei.

Es geht mir hier einzig und allein um die Aussage, die du an Redox gerichtet hast. In meinen Augen hast du dich damit jeder fachlichen Kompetenz disqualifiziert. Ob dir meine Meinung etwas bedeutet oder am Arsch vorbeigeht, ist mir auch wieder egal.

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
und dann kommt so ein Neunmalkluger und meint iergendwelche Codemanipulationen wären besser...
Ja. [/b]

Quote:

Quote:
Originally posted by -sd333221@Mar 19 2007, 21:34
Wow, du bist aber schlau,
und da der Code den er anhalten will beim Schreiben vom Leben liegt, was wird da wohl passieren?
Ich hatte nicht vor Anfängertutorials zu verfassen. Da musst du dich anderswo umsehen.
Probier es einfach selber aus, Mister Neunmalklug, setze un Olly einen Breakpoint auf die Adresse wo das Leben geschrieben wird, dann pausiert Olly auch nur den Thread und was passiert? Wow hält an

Quote:
Deshalb brauchst du mich gar nicht auf diesen Punkt hinweisen, da es "deine" Methode genau so betrifft.
Ich schreibe nicht in Warcraft

Quote:
Du kannst Software-Breakpoints auslösen und behandeln ohne den Prozess in den Debug-Mode zu setzen.
Aber du musst iergendwas an WoW verändern damit ne Exception geworfen wird, und das wird immer so sein und wird auch immer erkennbar sein


Quote:
Halbe Sekunde? Bei mir dauert das auslösen und behandeln eines Software-Breakpoints 1,8ms.
Alles leere behauptungen, lass doch mal Code von dir sehen wenn du so ein Profi bist wie du es hier zu
sein vorgibst


Quote:
<!--QuoteBegin--sd333221
Quote:
@Mar 19 2007, 21:34
1.Was soll hier ein "scheiss" sein?

Dein Code, laut deiner eigenen Aussage.
[/quote]
Ich habe nur gesagt, dass es schnell gecoded ist und deshalb nicht für Anfänger geeignet die
sich dann vielleicht einen schlechten Codestil angewöhnen


Quote:
Für mich wären das nicht irgendwelche Suchoperationen im Speicher sondern das Auslesen eines Pointers an einer statischen Adresse und anhand der bekannten struct - als Beispiel nehme ich einfach eine Linked-List-Implementierung - geht man alle Units durch, bis man bei seiner eigenen Unit ist und dort liest man seinen Health aus. Das wäre in meinen Augen eine saubere Lösung mit "deiner" Methode ohne Code zu manipulieren.
Siehe den "Leere-Behauptungen" Quote

Außerdem hat diese ganze Diskussion hier nichts zu suchen, in der du meinen Code
runtermachst ohne ihn überhaupt zu kennen (das sagt ja schonmal einiges über deine Ziele aus)
wenn du mir noch etwas mitteilen möchtest, statt produktiv zu der Fragestellung beizutragen, dann benutze dazu bitte die Private-Nachricht Funktion

Grüße
und blase nicht den Topic hier auf
sd333221 is offline  
Old 03/20/2007, 23:27   #34
 
elite*gold: 0
Join Date: Mar 2007
Posts: 18
Received Thanks: 2
Quote:
Probier es einfach selber aus, Mister Neunmalklug, setze un Olly einen Breakpoint auf die Adresse wo das Leben geschrieben wird, dann pausiert Olly auch nur den Thread und was passiert? Wow hält an
Wo zum Teufel habe ich gesagt, ich würde OllyDbg dafür verwenden? Die zwei geposteten Links und aus meinen Aussagen hättest du erkennen können, das ich selbst Code geschrieben habe, der auf Software-Breakpoints und Exceptions reagiert (was nun wirklich nicht schwer ist).

Quote:
Ich schreibe nicht in Warcraft
Was ist eigentlich los mit dir? Ich gebe dir Links, du ignorierst sie, ich weise dich darauf hin es gäbe Aufzeichnung darüber, dass Warden auch außerhalb des eigenen Prozesses scannt, was du auch ignorierst und mir mit dem Argument ankommst du würdest nichts in den Prozess schreiben. Die meisten AutoIt Bots überschreiben auch keine byte(s) im WoW-Prozess, trotzdem wurde in der Vergangenheit dafür gebannt. Komisch, hä? Ts ...

Bevor du eine Unterhaltung über Warscheinlichkeiten anfängst: Müssen wir nicht führen, in dem speziellen Fall ist sie unbedeutend gering.

Quote:
Aber du musst iergendwas an WoW verändern damit ne Exception geworfen wird, und das wird immer so sein und wird auch immer erkennbar sein
Die Aussage ist genau so sinnlos wie alles andere. Jede Manipulation/Aktivität an/von Software oder generell am Computer mit seinem Betriebssystem lässt sich nachweisen. Schaue dir das seid Jahren aktive zick-zack-Spiel auf rootkit.com an zwischen Rootkit-Entwickler und Anti-Rootkit-Entwickler.

Quote:
Quote:
Halbe Sekunde? Bei mir dauert das auslösen und behandeln eines Software-Breakpoints 1,8ms.
Alles leere behauptungen, lass doch mal Code von dir sehen wenn du so ein Profi bist wie du es hier zu
sein vorgibst
Wenn du die Links, die ich dir gepostet habe, wenigstens angeschaut hättest, würdest du jetzt nicht nach Code fragen und du würdest sagen: "Ich habe es nie selbst implementiert aber ich weiss genau was du meinst".

Statt SetUnhandledExceptionFilter hook ich direkt KiUserExceptionDispatcher:

Code:
LONG __stdcall CHooks&#58;&#58;BreakpointHandler&#40;EXCEPTION_POINTERS *pEX&#41;
{
	if &#40;pEX->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT&#41; {
 *CHooks *p = CHooks&#58;&#58;GetInst&#40;&#41;;
 *HIVEC&#58;&#58;iterator i = p->m_vHooks.begin&#40;&#41;;
 *for &#40;; i != p->m_vHooks.end&#40;&#41;; i,,&#41; {
 *	if &#40;&#40;*i&#41;->pvFromFunc != pEX->ExceptionRecord->ExceptionAddress&#41;
 * *continue;

 *	pEX->ContextRecord->Eip = &#40;DWORD&#41;&#40;*i&#41;->pFirstChain->byJmpHookFunc;
 *	return EXCEPTION_CONTINUE_EXECUTION;
 *}
	}

 * *return EXCEPTION_CONTINUE_SEARCH; 
}

BOOL __stdcall CHooks&#58;&#58;Hooked_KiUserExceptionDispatcher&#40;PEXCEPTION_RECORD pExceptionRecord, PCONTEXT pCTX&#41;
{
	__asm pushad

	EXCEPTION_POINTERS ptrs;
	BOOL bRet;

	ptrs.ContextRecord = pCTX;
	ptrs.ExceptionRecord = pExceptionRecord;
	if &#40;pExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT&#41;
 *bRet = CHooks&#58;&#58;GetInst&#40;&#41;->BreakpointHandler&#40;&ptrs&#41; == 0;
	else
 *bRet = CHooks&#58;&#58;GetInst&#40;&#41;->ExceptionHandler&#40;&ptrs&#41; == 0;

	__asm popad

	return bRet;
}

VOID __declspec&#40;naked&#41; CHooks&#58;&#58;KiUserExceptionDispatcher_ASM&#40;VOID&#41;
{
	__asm {
 *// kein copy & paste
 *cmp eax, 0
 *je ex_handled
 *jmp &#91;m_fnHandleExInDispatcher&#93;
ex_handled&#58;
 *jmp &#91;m_fnSkipExInDispatcher&#93;
	}
}
Und was ist jetzt dabei?
Es steht dir frei den fehlenden Teil zu rekonstruieren und selbst einen Speedtest durchzuführen.

Deinen Code oder die Binärdatei hast du immernoch nicht gepostet ...

Quote:
Quote:
Dein Code, laut deiner eigenen Aussage.
Ich habe nur gesagt, dass es schnell gecoded ist und deshalb nicht für Anfänger geeignet die
sich dann vielleicht einen schlechten Codestil angewöhnen
Du hast den Begriff "dreckig gecoded" verwendet und nicht "schnell gecoded".
Was bringt jetzt diese Pingeligkeit?

Quote:
Außerdem hat diese ganze Diskussion hier nichts zu suchen, in der du meinen Code
runtermachst ohne ihn überhaupt zu kennen (das sagt ja schonmal einiges über deine Ziele aus)
Bist du irgendwie bescheuert? Ich habe dir genau gesagt, worum es mir hier wirklich geht. Lese dir das Ende meines letzten Beitrages noch paar mal durch, vielleicht findest du es noch.
Was für einen Code du geschrieben hast ist mir ziemlich egal, weil ich damit nichts zu tun habe. Ursprünglich war mir das nicht mehr Wert als eine kleine Bemerkung. Da du aber absolut nicht kritikfähig bist, befinden wir uns nun in dieser Situation. Dabei war das anfangs so einfach. Du hast eine nicht korrekte Aussage gemacht und ich habe sie korrigiert. Wegen der Korrektur warst du angepisst und es kam die ironische Bemerkung "Wow, du bist aber schlau" anstatt in Ruhe zu fragen - wenn du es nicht verstanden hast - wie ich darauf komme. Hättest du mich gleich anfangs danach gefragt, hätte ich dir das im Detail erklärt.

Quote:
wenn du mir noch etwas mitteilen möchtest, statt produktiv zu der Fragestellung beizutragen, dann benutze dazu bitte die Private-Nachricht Funktion
Tue nicht so als ob du ein Moderator bist. Neji hat nichts gegen die Unterhaltung, solange wir beim Thema bleiben und zu einem Forum gehört eine Diskussion - womit wir voll drin sind.

Quote:
und blase nicht den Topic hier auf
s. o.
silon is offline  
Old 03/21/2007, 09:48   #35
 
elite*gold: 0
Join Date: Aug 2005
Posts: 443
Received Thanks: 72
Richtig, ich habe nichts gegen so eine Diskussion, solange Sie sachlich bleibt.
Allerdings entwickelt sich das langsam in eine "Wer ist der bessere Coder" Diskussion.

Ursprünglich wurde nach einer Möglichkeit gefragt, an den Pointer für HP zu kommen um den Wert dort auszulesen.

Ich würde es für Sinnvoll halten wenn du deinen Code evtl hier posten könntest, damit man vernünftig über die "pros and cons" Diskuttieren kann. Damit meine ich die Technik und nicht den Stil!

.....also soweit alles in Butter...sobald Beleidigungen losgehen, mach ich dicht. Also HF beim Diskuttieren weiterhin

ps (zum Thema ) :

"You can do a loop by using VirtualQueryEx. And then you can read out each allocate page by using ReadProcessMemory. "
neji is offline  
Old 03/21/2007, 10:36   #36
 
elite*gold: 0
Join Date: Mar 2007
Posts: 18
Received Thanks: 2
Quote:
Originally posted by neji+Mar 21 2007, 09:48--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (neji @ Mar 21 2007, 09:48)</td></tr><tr><td id='QUOTE'>Allerdings entwickelt sich das langsam in eine "Wer ist der bessere Coder" Diskussion.[/b]

Wenn es nach mir geht, wird das auch nicht passieren (im letzten Beitrag: "Was für einen Code du geschrieben hast ist mir ziemlich egal, weil ich damit nichts zu tun habe. Ursprünglich war mir das nicht mehr Wert als eine kleine Bemerkung.").

<!--QuoteBegin--neji
@Mar 21 2007, 09:48
.....also soweit alles in Butter...sobald Beleidigungen losgehen, mach ich dicht. Also HF beim Diskuttieren weiterhin [/quote]
Das wird nicht nötig sein, Bärchen
silon is offline  
Old 03/21/2007, 13:40   #37
 
sd333221's Avatar
 
elite*gold: 9
Join Date: Dec 2005
Posts: 621
Received Thanks: 365
Ok, ich gebe mich geschlagen;
Nehmt den Code von silon der ist schneller
sd333221 is offline  
Old 03/21/2007, 13:53   #38
 
BlackFog's Avatar
 
elite*gold: 105
Join Date: Mar 2007
Posts: 5,073
Received Thanks: 558
Ähmm dumme Frage -. -. Wie mach ich den asm - code zu einer laufähigen exe ?

MFG

BlackFog nicht BlackFrog
BlackFog is offline  
Old 03/21/2007, 14:15   #39
 
sd333221's Avatar
 
elite*gold: 9
Join Date: Dec 2005
Posts: 621
Received Thanks: 365
Das ist kein asm, das ist C++ mit inline asm;
Benutze einfach den Microsoft Cpp Compiler um das zu compilieren
sd333221 is offline  
Old 03/21/2007, 15:10   #40
 
elite*gold: 0
Join Date: Mar 2007
Posts: 18
Received Thanks: 2
Der Code ist so ohne weiteres nicht lauffähig. Damit wollte ich nur das Konzept zeigen.

Die Klassen CHooks und CMemory umfassen gemeinsam etwa 3000 Zeilen Code (ohne Anti-Debugging/Disassembling, "Anti-Detection" ...) und die möchte ich nicht veröffentlichen.

Bevor man mit dem oberen Code rumspielt, kann man den glatt selbst schreiben, da ein großer Teil fehlt.
silon is offline  
Old 03/22/2007, 14:44   #41
 
BlackFog's Avatar
 
elite*gold: 105
Join Date: Mar 2007
Posts: 5,073
Received Thanks: 558
Ahh ok hab mich schon gewundert warum der nicht läüft und sah auch auf den ersten blick nicht an cpp aus.

Mfg
BlackFog
BlackFog is offline  
Old 03/22/2007, 14:49   #42
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
Quote:
Originally posted by neji@Mar 21 2007, 09:48
"You can do a loop by using VirtualQueryEx. And then you can read out each allocate page by using ReadProcessMemory. "
Was bringt es mir jede verschobene Seite zu lesen, ich blick nicht ganz wie mich das dann wieder zu den HP führt ^^


@silon
Ich möchte das problem dma eben mit diesen Pointern lösen, wenn mir einer erklären kann wie ich anhand von der Adresse die die Hp Schreibt wieder auf die Dynamische Adresse der HP kommen kann und möglichst so das ich ohne asm in reinem c++ Arbeiten kann.
Bot_interesierter is offline  
Old 03/22/2007, 15:04   #43
 
elite*gold: 0
Join Date: Aug 2005
Posts: 443
Received Thanks: 72
jede "verschobene" seite? hast du das mit google übersetzt oder so? ;-)

Der Virtuelle Speicher von Prozessen ist in fortlaufende "Seiten" aufgeteilt. Jede dieser Pages hat einen Speicherbereich von - bis den du dann mit ReadProcessMemory durchsuchen kannst.

Allerdings kann man diese Methode eher nutzen, wenn man nach einem bestimmten Wert sucht, also etwa wie in TSearch.
neji is offline  
Old 03/22/2007, 16:30   #44
 
elite*gold: 0
Join Date: Mar 2007
Posts: 18
Received Thanks: 2
(Das ist unabhängig der vorherigen Beiträge zu lesen)

Du _musst_ ASM können. Es kommt mir vor, du würdest nicht wissen was du da versuchst oder wie das ursprünglich in C/C++ aussah. Ich habe für dich ein kleines Beispiel erstellt:

Code:
#include &#60;windows.h>

struct UNIT_PLAYER {
	char name&#91;20&#93;;
	int currentHealth; 
	int maxHealth;
};

UNIT_PLAYER *PlayerList = &#40;UNIT_PLAYER*&#41;malloc&#40;sizeof&#40;UNIT_PLAYER&#41; * 2&#41;; // 2 units

bool main&#40;&#41;
{
	memset&#40;PlayerList, 0, sizeof&#40;PlayerList&#41;&#41;;

	// dummy werte für unit 0
	strcpy&#40;PlayerList&#91;0&#93;.name, &#34;foo&#34;&#41;;
	PlayerList&#91;0&#93;.currentHealth = 100;
	PlayerList&#91;0&#93;.maxHealth = 100;

	// dummy werte für unit 1
	strcpy&#40;PlayerList&#91;1&#93;.name, &#34;foo 2&#34;&#41;;
	PlayerList&#91;1&#93;.currentHealth = 200;
	PlayerList&#91;1&#93;.currentHealth = 200;
	
	return false;
}
In dem Fall bildet die struct eine einzige Unit. Doch wie greifen Spiele auf diese Units zu? Irgendwie muss das Spiel alle Units erreichen. Oft wird dafür eine Linked List verwendet und der Pointer auf die erste Unit (ob Spieler oder Monster ist egal) wird global in einer Variable gespeichert. Der Offset darauf ist konstant (egal ob es später vielleicht ein Pointer auf ein Pointer wird ...).

Kompilieren wir uns den oberen Code und schauen ihn in VS05 in der Disassembly Sicht an (Wärend dem debuggen Rechte Maustaste drücken -> Go to Disassembly).

Das ganze sieht bei mir so aus:

Code:
bool main&#40;&#41;
{
&#40;...&#41;
	memset&#40;PlayerList, 0, sizeof&#40;PlayerList&#41;&#41;;

004113BE push    4  
004113C0 push    0  
004113C2 mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
004113C7 push    eax 
004113C8 call    @ILT+120&#40;_memset&#41; &#40;41107Dh&#41; 
004113CD add     esp,0Ch 



	// dummy werte für unit 0
	strcpy&#40;PlayerList&#91;0&#93;.name, &#34;foo&#34;&#41;;

004113D0 push    offset string &#34;foo&#34; &#40;416744h&#41; 
004113D5 mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
004113DA push    eax 
004113DB call    @ILT+170&#40;_strcpy&#41; &#40;4110AFh&#41; 
004113E0 add     esp,8 



	PlayerList&#91;0&#93;.currentHealth = 100;

004113E3 mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
004113E8 mov     dword ptr &#91;eax+14h&#93;,64h 


	PlayerList&#91;0&#93;.maxHealth = 100;

004113EF mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
004113F4 mov     dword ptr &#91;eax+18h&#93;,64h 



	// dummy werte für unit 1
	strcpy&#40;PlayerList&#91;1&#93;.name, &#34;foo 2&#34;&#41;;

004113FB push    offset string &#34;foo 2&#34; &#40;41673Ch&#41; 
00411400 mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
00411405 add     eax,1Ch 
00411408 push    eax 
00411409 call    @ILT+170&#40;_strcpy&#41; &#40;4110AFh&#41; 
0041140E add     esp,8 



	PlayerList&#91;1&#93;.currentHealth = 200;

00411411 mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
00411416 mov     dword ptr &#91;eax+30h&#93;,0C8h 



	PlayerList&#91;1&#93;.currentHealth = 200;

0041141D mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
00411422 mov     dword ptr &#91;eax+30h&#93;,0C8h 
	


	return false;

00411429 xor     al,al 
}
Du siehst erstmal den Befehl in C++ und dann den dafür erzeugten ASM-Code. Schau dir besonders die Zuweisungen an. Eigentlich müssten Dinge wie "mov dword ptr [eax+14h], 64h" dir recht bekannt vorkommen (64h wird da wohl ein Register oder lokale Variable sein). Schau dir besonders die Unterschiede zwischen den beiden Zuweisungen an:

Code:
// Für Unit 0

004113EF mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
004113F4 mov     dword ptr &#91;eax+18h&#93;,64h
Code:
// Für Unit 1

0041141D mov     eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93; 
00411422 mov     dword ptr &#91;eax+30h&#93;,0C8h
eax hält in beiden Fällen einen Pointer auf den _anfang_ des Arrays. Im ersten Fall addiert er bei der Zuweisung zu eax 18h, das wäre dezimal 24. Wenn wir uns die struct anschaun, belegt der Name 20 und wenn wir den dazuaddieren, wären wir bei currentHealth. Ein int hat auf meiner Maschine eine Länge von 4 byte, also 24.
Unit 1 liegt im Speicher direkt nach Unit 0 und Unit 0 hat insgesamt eine Länge von 28 (Name=20, maxHealth=4, currentHealth=4). Um auf den Anfang der Unit 1 zuzugreifen (dem Namen) müssten wir immer 1C addieren (was du bei der Zuweisung des Namens oben sehen kannst).

Bevor die Zuweisung + Adressierung kommt, wird eax der Pointer auf den Anfang der ersten Unit zugewiesen. Diese steht in dem Fall _immer_ (!) an der Position 418178h, den ich für einen "Hack" nur auslesen müsste ohne irgendwas am Code zu ändern. Es ändert trotzdem nichts daran, dass ich Wissen muss wie lang die struct ist, sonst komme ich nicht an Unit 1.

Bei Spielen hast du es oft, das es für jede Aktion eine Funktion gibt z. B. SetCurrentHealth und an die wird direkt ein Pointer als Parameter übergeben. Der Funktionsprototyp würde so aussehen: SetCurrentHealth(UNIT_PLAYER *p, int newHealth).
Vor dem Aufruf würde das bei meinem Code vielleicht so aussehen:

Code:
push edx // newHealth
mov eax,dword ptr &#91;PlayerList &#40;418178h&#41;&#93;
add eax,1Ch
push eax // Unit 1 Ptr
Um also an den Pointer für Unit 0 zu kommen (um 1 zu erreichen), kann es sicherlich nicht schaden den Code anzuschauen der deine Funktion aufruft. Bei dem Beispiel würde es ereichen wenn ich die Operation sehe "mov dword ptr [eax+30h],0C8h" den Inhalt von eax zu nehmen und die Datei im Speicher nach diesem Wert zu durchsuchen. Der Suchvorgang wäre eine einmalige Aktion, da ich bei einem Fund einfach von 418178h lesen brauche.

Wenn du das erstmal verstanden hast, wirst du es auch ohne Probleme und mit ein bisschen Verwendung deines Kopfes sicherlich auch auf ähnliche Varianten (z. B. Linked Lists) anwenden können.
Für den Fall das du nicht weisst wie der ASM-Code bei der Verwendung von Linked Lists aussehen könnte, würde ich dir empfehlen selbst ein Testszenario zu erstellen und dir dann deinen eigenen ASM-Code anzuschaun den der Compiler erzeugt.

Manchmal ist diese Methode nicht so einfach anwendbar (__declspec(thread)). Hier wäre mehr Aufwand zu betreiben.
Viele überschreiben aber paar byte und speichern den Inhalt von eax an eine "konstente Adresse" (jmp-hooks). Das ist aber nichts zwangsläufig eine gute Lösung. Siehe SetCurrentHealth-Funktion und die Parameter, die für jede Unit geeignet wäre ... auf der anderen Seite bei Double-Linked-Lists annehmbar
Dafür gibt es aber genug Tutorials, die du mit google finden kannst.
silon is offline  
Old 01/04/2008, 19:20   #45
 
elite*gold: 0
Join Date: Dec 2007
Posts: 37
Received Thanks: 1
die letzte antwort nenn ich mal häftig versteh rein gar nix heull
Bullz is offline  
Reply


Similar Threads Similar Threads
Pointer finden!
08/16/2010 - General Coding - 6 Replies
Hey Leute.... Wie finde ich daraus die Pointer Adresse? http://www5.pic-upload.de/16.08.10/q7xtw1icrrsa.j pg Wenn ich über "Find out what accesses this address" geh kommt leider nix! http://www5.pic-upload.de/16.08.10/k7viq51wnoep.j pg
Pointer finden..
03/29/2010 - 4Story - 7 Replies
Macht einen Rechtsklick auf die Variable, „Find out what accesses this address” und bestätigt die Meldung mit „Yes”. Jetzt öffnet sich der Disassembler und ein Helper. Geht im Helper auf „Auto-Hack“, dort müsste jetzt euere Adresse stehen. Klick Sie an und wartet bis unten ein Eintrag erscheint. Wenn ihr einen habt, macht einen Rechtsklick und wählt „Go To->In Current Tab“. An der grau markierten Stelle wird auf die Variable über den Pointer zugegriffen. Normalerweiße wird entweder etwas...
Per static pointer an pinball score kommen
09/19/2009 - General Coding - 5 Replies
Hi! Ich versuche nun bestimmt seit 2tagen (zu lernzwecken memory reading etc...) über den pointer den mir CE gegeben hat (00025040 -> ) und das offset (0x52) an die eigendliche adresse der Punktezahl zu kommen....erfolglos. Ich hab verschiedenes probiert (zuviel um jede möglichkeit hier zu posten :P) Könnte mir jemand ein kleines beispiel posten wie man über einen pointer & ein offset an die eigendliche adresse kommt? Oder nur den theoretischen ablauf?
Hilfe bei static pointer (CE)
03/04/2009 - General Coding - 7 Replies
Hallo epvper^^ ich bin ein pointer noob... ich hab ein kleines Problem mit static Pointern. vllt hab ich auch einfach das prinzip falsch verstanden Also: Ziel: Atk Speed in Requiem.



All times are GMT +2. The time now is 23:20.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.