i want to binary intercept a WSprintf function.
as i dont want to intercept all WSprintf functions i dont directly detour it, i call my own function where WSprintf() gets called.
to make things clearer i will show you some screens:
original function:
original function detoured:
(dbghelp.WSprintF_D is my function)
this is my source code:
i want to have the information stored in EAX and ECX
} GETInfo((wchar_t*)d1,(wchar_t*)d2); __asm{ POP EAX; POP ECX; MOV ESP,EBP; POP EBP;
PUSH ECX; //Saved bytes from original function PUSH EAX; LEA EAX, DWORD PTR SS:[EBP-0xA74]; jmp WPrintF_back; // Jump back to original address } }
unfortunately it crashes my game all the time
if followed in my debugger and the crashes get caused by:
caused EXCEPTION_ACCESS_VIOLATION (0xc0000005)
in module kernel32.dll at 001b:76E7C35D.
this confuses me even more ...
but as the error gets caused by my function you maybe see whats wrong.
1. Deine lokalen Variablen sind sehr wirr, da du für sie keinen Platz auf dem Stack reservierst. Sie werden zwar wahrscheinlich durch EBP korrekt addressiert, dann durch die PUSHs überschrieben, was an für sich immer noch funktioniert und die Werte richtig bleiben, allerdings sehr unsauber ist, weil das eigentlich unbeabsichtig war, denke ich.
2. Dein Hook besteht aus einem CALL und du beendest deine Funktion mit einem JMP. Entweder musst du wsprintf selber callen oder via JMP hooken.
Wenn du CALL zu JMP ändern würdest, dürfte es so gehen
(beim wsprintf-Aufruf kommt eax zuerst, dann ecx, deine GETInfo-Funktion erwartet sie anscheinend im umgedrehter Reihenfolge, hab's hier mal sozusagen richtig herum übergeben, damit es direkt in den CALL übergeht (angenommen, dass GETInfo cdecl ist)):
Hi,
danke für die hilfe.
mit dem jump klappt es jetzt.
nun steh ich aber vor dem nächsten problem.
EAC und ECX halten pointer auf einen UNICODE string.
ich hab schon einwenig rumprobiert, habe aber bisher nur geschaft mir den ersten buchstaben ausgeben zu lassen.
"EAC und ECX halten pointer auf einen UNICODE string."
Wenn's so ist, muss es ja an wcout liegen.
Hast du es also mal mit printf, cout oder MessageBox probiert?
Edit:
Achso, ja.. std::wcout << "Arg1: " << *Arg1 << " Arg2: " << *Arg2 << std::endl;
Hab die Sternchen übersehen.
Mach sie einfach weg und dann werden die Pointer nicht mehr dereferenziert,
sodass du die Adressen der Strings übergibst und nicht nur den ersten Char.
EDIT:
ich möchte die beiden argumente nun weiter verarbeiten und das mit der wsprintfW funktion.
nur steh ich vor dem problem, das sich danach aus mir unerklärlichen gründen der return von wsprintfW auf dem stack dort steht, wo die original funktion ihr zweites parameter herbekommt.
warum überschreibt die mir mein zuvor gepushtes ECX?
deswegen kommt bei der original funktion nicht mehr der original text an.
und beim nochmaligem aufruf der original funktion crashed das game mit ner null pointer exception.
Piss people off, intercept when they drink/eat! 10/04/2008 - WoW Exploits, Hacks, Tools & Macros - 3 Replies Ok, today I finally got enough Brewfest Tokens to buy the "Brew of the Month" Club Membership Form"
When I delivered it, i gain access to a vendor, a special Brewfest Member only vendor, that sold some Beer/vine.
When you drank it, you get an item "Empty Brew Bottle"
This is where the fun part begins:
When you got a Empty Brew Bottle, you can right click it and choose a target where to throw it, you can also throw it at people.
That doesn't seem like an exploit, well, if you throw it...