ECX auslesen |inj dll? or extern?

12/22/2008 13:39 Azunai#1
hi
also ich versuche jetzt schon ein wenig länger eine möglichkeit zu finden ECX an einer bestimmten stelle im code von Guild Wars auszulesen

bis jetzt hab ich eine DLL, die injected wird

die enthält ne func zum code patchen , um meine eigendliche funktion aufzurufen

soweit so gut, das klappt alles

da GW TLS (Thread Local Storage) nutzt hab ich meine func als "naked" definiert

um die register nicht zu ändern

jetzt möchte ich aber das in meiner funktion ECX ausgelesen wird und dann der wert in eine datei geschrieben werden kann (oder einfach ne datei erstellen mit filename = value of ECX)

ich habs mit zb dem hier versucht:
Code:
__asm PUSH 0                                                //hTemplateFile = NULL
__asm PUSH 80                                               // |Attributes = NORMAL
__asm PUSH 2                                                // |Mode = CREATE_ALWAYS
__asm PUSH 0                                                // |pSecurity = NULL
__asm PUSH 1                                                // |ShareMode = FILE_SHARE_READ
__asm PUSH 80000000                                         // |Access = GENERIC_READ
__asm PUSH ecx                        //<deine ascii value>     // |FileName = "deine ascii valie"
__asm call [CreateFileA] 					// \CreateFileA
und:
Code:
__asm ("mov  %%ecx , %0" : : "g" (myecx))
wobei myecx eine long var ist

und
Code:
  __asm__ ( "PUSH %0" : : "I" (0)); //hTemplateFile = NULL                                       
    __asm__ ("PUSH %0" : : "g" (80));                                               // |Attributes = NORMAL 
    __asm__ ("PUSH %0" : : "I" (2));                                                // |Mode = CREATE_ALWAYS 
    __asm__ ("PUSH %0" : : "I" (0));                                              // |pSecurity = NULL 
    __asm__ ("PUSH %0" : : "I" (1));                                               // |ShareMode = FILE_SHARE_READ 
    __asm__ ("PUSH %0" : : "g" (80000000));                                         // |Access = GENERIC_READ 
    __asm__ ("PUSH %0" :: "g" ("test.txt"));                        // |FileName = "test.txt" 
    __asm__("CALL %0" : : "c" (&CreateFileA));
btw nutze VC++ Express 08
letztes ist nicht in vc++ format, weiß nicht wie ichs umschreiben muss ^^

wär cool wenn mir jemand helfen könnt
12/22/2008 13:45 verT!c4L#2
Ich frag heut abend mal den Kollegen, der kennt sich besser aus mit Assembler als ich ^^
Vlt weiß der ja Rat!
12/23/2008 13:27 Azunai#3
und ? ^^ was hat er so gesagt ?
12/23/2008 13:29 verT!c4L#4
Bislang nichts sinnvolles... waren gestern auf ner Party, als er schon 3,8te im Kessel hatte
fiel mir ein das ich ihn ds fragen wollte, aber leider konnte ich seinen gefasel nicht mehr folgen obwohl ich der nüchternere von uns beiden war :/
12/23/2008 16:35 rEdoX#5
Quote:
__asm PUSH ecx //<deine ascii value> // |FileName = "deine ascii valie"
Du uebergibst keine gueltige Zeichenkette, sondern einen DWord.
12/24/2008 16:35 Azunai#6
?!?

wie meinst du das

das da erstellt einfach eine datei, die dann mit namen zb "123" heißt falls ECX an der stelle "123" ist ;P
12/24/2008 16:57 emjay#7
argh augenkrebs...
Code:
 
__asm{
  //please use more of this
  //thanks
}
ich glaube du solltest die finger von diesen thema haben, du erkennst ja nichtmals den unterschied zwischen hex und dec ( du übergibst hex values als dec...). ansonsten sollte variante eins funktionieren (variante 2 lässt mir sämtliche nackenhaare aufrecht stehen..). kannst auch auf nummer sicher gehen und dir eine stdcall function anlegen die ecx als parameter übergibt und halt das zeug macht, das du willst ohne dabei den stack zu verändern
12/24/2008 23:27 Azunai#8
hab den code fetzen da als fertige solution gefunden gehabt , und ja ich erkenn nicht viel in asm, weils recht neu für mich ist ;P
12/25/2008 03:02 link#9
rEdoX hat schon alles gesagt.
Naja, obwohl es eigentlich auch nicht richtig ausgedrückt ist, da CreateFileA als diesen Parameter keine Zeichenkette erwartet, macht ja auch keinen Sinn... eine unbestimmte Menge an Bytes auf dem Stack, sondern die Adresse zu einer.

Konvertiere die Zahl in einen String oder benutze wsprintf und übergebe die Adresse des Strings, der nun die Nummer enthält, als Parameter für den Namen an CreateFileA.
Wenn ECX 123 enthält, wird ein String an der Adresse 123 gesucht, was in einen Laufzeitfehler ausartet :-)

Pseudocode:
Code:
pushad
push 0
push 80
push 2
push 0
push 1
push 80000000
;=========
mov ebx, XXXX2 ;Adresse von max. 10 freien Bytes
push ecx
push XXXX1 ;Adresse, wo 25h, 64h, 0 zu finden ist
push ebx
call wsprintfA
add esp, 0ch
;=========
push ebx
call CreateFileA
popad