MSVC Detours hooking Borland __fastcall

10/18/2013 14:37 BrendonHomo#1
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
10/18/2013 16:20 マルコ#2
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.
10/18/2013 16:35 BrendonHomo#3
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.
10/18/2013 16:55 Dr. Coxxy#4
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.
10/18/2013 17:08 BrendonHomo#5
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?
10/18/2013 17:22 Dr. Coxxy#6
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.
10/18/2013 19:02 MrSm!th#7
Was spricht dagegen, MS Detours mit einer naked Funktion zu nutzen?
10/18/2013 20:15 BrendonHomo#8
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!
10/19/2013 12:07 MrSm!th#9
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.