Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 02:36

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

Advertisement



MSVC Detours hooking Borland __fastcall

Discussion on MSVC Detours hooking Borland __fastcall within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Apr 2009
Posts: 177
Received Thanks: 42
MSVC Detours hooking Borland __fastcall

hi,

ich habe derzeit wieder 'nen "kleines" problem, und zwar versuche ich in einem spiel eine __fastcall funktion mit microsoft detours zu hooken. das problem ist jetzt, dass die __fastcall funktion von microsoft gegenüber der von borland unterscheidet - access violation meldung.
es liegt eindeutig an der __fastcall convention.
ich könnte mir meine eigene detour funktion basteln und einen naked hook anwenden, aber den schritt möchte ich ungerne gehen, da ms detours mir schon alles "sauber" erledigt.
hat jemand vielleicht eine lösung, wie ich das jetzt mit der calling convention regel?

mfg
BrendonHomo is offline  
Old 10/18/2013, 16:20   #2

 
マルコ's Avatar
 
elite*gold: 1329
Join Date: Jun 2009
Posts: 1,873
Received Thanks: 960
afaik werden die Parameter einfach genau anders rum übergeben.

Sprich C++ wäre
Code:
ret __fastcall(p1,p2,p3);

// gelesen als p1,p2,p3
Borland/Embarcadero (Delphi?) wäre
Code:
function __fastcall(p1,p2,p3) : ret;

// gelesen als p3,p2,p1
Wenn du das kompensierst, sollte es theoretisch funktionieren.
マルコ is offline  
Thanks
1 User
Old 10/18/2013, 16:35   #3
 
elite*gold: 0
Join Date: Apr 2009
Posts: 177
Received Thanks: 42
Quote:
Originally Posted by マルコ View Post
afaik werden die Parameter einfach genau anders rum übergeben.

Sprich C++ wäre
Code:
ret __fastcall(p1,p2,p3);

// gelesen als p1,p2,p3
Borland/Embarcadero (Delphi?) wäre
Code:
function __fastcall(p1,p2,p3) : ret;

// gelesen als p3,p2,p1
Wenn du das kompensierst, sollte es theoretisch funktionieren.
gibt auch nur eine access violation, aber umgedreht wird nichtmal mehr das packet ausgelesen.
der selbe hook compiliert in borland klappt einwandfrei.
BrendonHomo is offline  
Old 10/18/2013, 16:55   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
zeig mal asm dump von der entsprechenden funktion, wirste aber wahrscheinlich net um nen naked hook o.ä. tricks drumrumkommen.
borland übergibt die ersten 3 parameter über eax, edx, ecx, die restlichen von links nach rechts über den stack - microsoft fastcall übergibt nur 2 über register ecx, edx, und die restlichen von rechts nach links, weshalb das logischerweise net funktioniert.

wenn es wie im bsp. da nur 3 parameter sind kannste microsoft fastcall benutzen und dir den ersten parameter per inline assember aus eax rausholen.
Dr. Coxxy is offline  
Thanks
1 User
Old 10/18/2013, 17:08   #5
 
elite*gold: 0
Join Date: Apr 2009
Posts: 177
Received Thanks: 42
Quote:
Originally Posted by Dr. Coxxy View Post
zeig mal asm dump von der entsprechenden funktion, wirste aber wahrscheinlich net um nen naked hook o.ä. tricks drumrumkommen.
borland übergibt die ersten 3 parameter über eax, edx, ecx, die restlichen von links nach rechts über den stack - microsoft fastcall übergibt nur 2 über register ecx, edx, und die restlichen von rechts nach links, weshalb das logischerweise net funktioniert.

wenn es wie im bsp. da nur 3 parameter sind kannste microsoft fastcall benutzen und dir den ersten parameter per inline assember aus eax rausholen.
ich könnte jetzt nen asm dump posten, aber es macht kein sinn weil die funktion nur 2 parameter hat. :/
kann ich per microsoft detours auch problemlos naked hooks setzen?
BrendonHomo is offline  
Old 10/18/2013, 17:22   #6
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by BrendonHomo View Post
ich könnte jetzt nen asm dump posten, aber es macht kein sinn weil die funktion nur 2 parameter hat. :/
kann ich per microsoft detours auch problemlos naked hooks setzen?
ich benutz keine microsoft detours, deswegen ka.
aber 2 parameter geht doch auch, d.h. die beiden parameter kommen über EAX und EDX, den aus edx kriegste ganz normal mit ms fastcall, den aus eax per inline assembler.
Code:
DWORD __fastcall MyFunc(DWORD __UselessECX, DWORD SecondParam)
{
  DWORD FirstParam;
  __asm mov FirstParam, eax;
  // Do whatever you want. In FirstParam ist jetzt der erste Parameter, der 2. in SecondParam
}
musste mal gucken, dass dir der compiler da sicher nicht im funktionsprolog eax überschreibt, sollte aber eigtl nicht passieren.

aber wie gesagt, zeig mal asm dump, dann können wir dir ziemlich genau sagen worauf du achten musst.
Dr. Coxxy is offline  
Thanks
1 User
Old 10/18/2013, 19:02   #7


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Was spricht dagegen, MS Detours mit einer naked Funktion zu nutzen?
MrSm!th is offline  
Thanks
1 User
Old 10/18/2013, 20:15   #8
 
elite*gold: 0
Join Date: Apr 2009
Posts: 177
Received Thanks: 42
Quote:
Originally Posted by Dr. Coxxy View Post
ich benutz keine microsoft detours, deswegen ka.
aber 2 parameter geht doch auch, d.h. die beiden parameter kommen über EAX und EDX, den aus edx kriegste ganz normal mit ms fastcall, den aus eax per inline assembler.
Code:
DWORD __fastcall MyFunc(DWORD __UselessECX, DWORD SecondParam)
{
  DWORD FirstParam;
  __asm mov FirstParam, eax;
  // Do whatever you want. In FirstParam ist jetzt der erste Parameter, der 2. in SecondParam
}


musste mal gucken, dass dir der compiler da sicher nicht im funktionsprolog eax überschreibt, sollte aber eigtl nicht passieren.

aber wie gesagt, zeig mal asm dump, dann können wir dir ziemlich genau sagen worauf du achten musst.
danke für deine Bemühung, aber es hat sich gerade erledigt. mit naked Funktion und MS detours geht's einwandfrei.

Quote:
Originally Posted by MrSm!th View Post
Was spricht dagegen, MS Detours mit einer naked Funktion zu nutzen?
ich hätte irgendwo gelesen, dass die MS detours mit naked funktionen nicht klappen, ich habe es soebend ausprobiert und es funktioniert einwandfrei!
BrendonHomo is offline  
Old 10/19/2013, 12:07   #9


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Nö, ein jump kann auf jede beliebige Adresse gesetzt werden. Was sich da nun für eine Funktion hinter verbirgt oder ob es gar Daten sind, ist dem Setzer des jumps egal. Bei einer naked Funktion bist halt nur du dafür verantwortlich, dass mit den Registern und dem Stack alles ordentlich vonstatten geht - insofern ist es nicht mehr so ordentlich und sauber wie mit einer wohldefinierten Funktion mit Parametern und Calling Convention. Aber es geht.
MrSm!th is offline  
Reply


Similar Threads Similar Threads
[Tutorial] Hooking, Detours, VTable etc.
08/21/2018 - Coding Tutorials - 5 Replies
Da man öfters hier im Forum die Frage aufkommen sieht "Wie male ich etwas auf ein Spiel" und "Wie sende ich Tastendrücke an mein spiel?!?111" Präsentiere ich hiermit stolz pünktlich zu Neujahr mein Tutorial rund ums Hooking, Detours, Searchpattern, VTables etc. 27 Seiten geballte Informationen mit 2 Beispielen für einen DirectInput und einen D3DHook. Download: HookingTutorial.rar | xup.in GL & HF
MSVC -__thiscall Implementation
08/13/2013 - C/C++ - 10 Replies
Jo, hier einmal die ausgelagerte Version der Diskussion über __thiscall. Kann jemand was zu der Implementation sagen? Wie schreibt es eigentlich der Standard vor (oder ist __thiscall MS spezifisch)? Mich wundert vor allem der sinnvolle Hinweis von IntelliSense, dass thiscall bei statischen Methoden nicht zulässig ist, während es der Compiler dennoch annimmt. Was wäre die eleganteste Methode, echte Klassenmethoden (keinen DX-like C-Nachbau) zu definieren, um sie nutzen zu können, sprich...
msvc++ kann kein projekt erstellen
09/03/2011 - C/C++ - 0 Replies
Hey, Immer wenn ich msvc++ starte und dann auf neues projekt gehe name eingebe steht unten das projekt xx wird erstellt.....fehler beim erstellen des projekts egal was ich mache es geht nicht weg pls help !



All times are GMT +1. The time now is 02:37.


Powered by vBulletin®
Copyright ©2000 - 2026, 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 ©2026 elitepvpers All Rights Reserved.