[Olly]Was bedeutet Loca.1

08/03/2010 01:47 ¿Freaky¿#1
Hallo,
ich lerne gerade Olly.
Und ich habe schon vieles gesehen wo Local.1 oder Local.2 steht und das mag C++ irgent wie nicht :(
Was bedeutet das und wie benutze ich das ?
mfg Freaky
08/03/2010 03:04 MrSm!th#2
Das sind einfach Namen, die Olly einsetzt, um es dir zu erleichtern.
Er analysiert den Stack und den Zugriff auf darin enthaltene Variablen und erkennt so, was Parameter (ARG1,2,3...) und was lokale Variablen sind (Local1,2,3...).

eine lokale Variable in C++:

Code:
void foo()
{
int x = 0;
}
wäre in asm

Code:
sub esp, 4
mov [esp], 0
wobei Olly dann das esp durch Local1 ersetzt.

Wenn du den Code als inline ASM in deinem Source nutzen willst, musst du Local1 usw. entweder durch die korrekten Stackzugriffe ersetzen (esp, esp+4 usw. oder ebp-4 usw.) oder lokale Variablen in der Funktion deklarieren und dann diese an die Stellen im ASM einsetzen.
Aber einfach stump den asm code copy&pasten geht in keinem Falle.
08/03/2010 03:22 ¿Freaky¿#3
Danke, aber ich verstehe das nicht genau.
Also hier habe ich auch ein local.
Wie finde ich heraus was das local ist an diesem Beispie:

Code:
00414B40  . 55              PUSH EBP
00414B41  . 8BEC            MOV EBP,ESP
00414B43  . 51              PUSH ECX
00414B44  . 8B4D 0C         MOV ECX,DWORD PTR SS:[ARG.2]
00414B47  . 8D45 FC         LEA EAX,[LOCAL.1]
00414B4A  . 50              PUSH EAX                                 ; Arg3 => OFFSET LOCAL.1
00414B4B  . 6A 00           PUSH 0                                   ; Arg2 = 0
00414B4D  . 51              PUSH ECX                                 ; Arg1 => [ARG.2]
08/03/2010 03:33 MrSm!th#4
Sagte ich doch schon, in der Funktion, in der du dich gerade aufhälst, ist das die erste lokale Variable.
08/03/2010 04:01 ¿Freaky¿#5
Also wer es das dann dort das hier:
Code:
PUSH EBP
richtig ?
08/03/2010 04:21 Akorn#6
Quote:
Originally Posted by ¿Freaky¿ View Post
Also wer es das dann dort das hier:
Code:
PUSH EBP
richtig ?
Das ist nicht die erste locale variable sondern dort wird der alte ebp wert auf dem stack gesichert. Die erste locale Variable kommt direct danach.

PHP Code:
00414B40  55              PUSH EBP
00414B41  
8BEC            MOV EBP,ESP
00414B43  
51              PUSH ECX
00414B44  
8B4D 0C         MOV ECX,DWORD PTRSS:[ebp+12]
00414B47  8D45 FC         LEA EAX,[ebp-4]
00414B4A  50              PUSH EAX                                 Arg3 => OFFSET LOCAL.1
00414B4B  
6A 00           PUSH 0                                   Arg2 0
00414B4D  
51              PUSH ECX                                 Arg1 => [ARG.2
So Sieht der code ohne die hilfsnamen von Olly aus.
08/03/2010 13:45 mydoom#7
Quote:
Originally Posted by ¿Freaky¿ View Post
Danke, aber ich verstehe das nicht genau.
Also hier habe ich auch ein local.
Wie finde ich heraus was das local ist an diesem Beispie:

Code:
00414B40  . 55              PUSH EBP
00414B41  . 8BEC            MOV EBP,ESP
00414B43  . 51              PUSH ECX
00414B44  . 8B4D 0C         MOV ECX,DWORD PTR SS:[ARG.2]
00414B47  . 8D45 FC         LEA EAX,[LOCAL.1]
00414B4A  . 50              PUSH EAX                                 ; Arg3 => OFFSET LOCAL.1
00414B4B  . 6A 00           PUSH 0                                   ; Arg2 = 0
00414B4D  . 51              PUSH ECX                                 ; Arg1 => [ARG.2]
<ot>Poste bitte noch weitere Beispiele. Es macht Spaß diese Unterwegs zu "lösen" ;D </ot>

Aber ich hätte selbst noch eine Frage dazu:
ARG.2 ist EBP+12, weil vor dem Basepointer (EBP+4) noch die Rücksprungadresse liegt und deshalb EBP+8 das erste Argument bzw EBP+12 das Zweite Argument ist oder?
08/03/2010 14:24 ¿Freaky¿#8
Ich bin jetzt voll am verzweifel ^^
Ok weiß jetzt wie ihr auf ebp gekommen seid.
Aber woher kommt +12 und -4 ?

Code:
00414B44  . 8B4D 0C         MOV ECX,DWORD PTRSS:[ebp+12] 
00414B47  . 8D45 FC         LEA EAX,[ebp-4]
08/03/2010 14:46 mydoom#9
Der Stack "wächst" von den hohen zu niedrigen Adressen (zB FFFFFF-000000) und der Base Pointer (EBP) markiert ja den Anfang des "Scopes" der aktuellen Funktion. Wie sich das +12 erklärt steht in meinem letzten Post. Zu EBP-4:

Das hier sei der Stack:
[ESP]
[Local.1] (Also entweder EBP-4 oder ESP+4)
[EBP]

(hoffe das ist so richtig :D)
08/03/2010 15:01 SmackJew#10
Quote:
Originally Posted by MrSm!th View Post
Code:
void foo()
{
int x = 0;
}
wäre in asm

Code:
sub esp, 4
mov [esp], 0
Falsch, ohne dword ptr ist das Verhalten nicht definiert.
08/03/2010 16:27 Akorn#11
Quote:
Originally Posted by mydoom View Post
<ot>Poste bitte noch weitere Beispiele. Es macht Spaß diese Unterwegs zu "lösen" ;D </ot>

Aber ich hätte selbst noch eine Frage dazu:
ARG.2 ist EBP+12, weil vor dem Basepointer (EBP+4) noch die Rücksprungadresse liegt und deshalb EBP+8 das erste Argument bzw EBP+12 das Zweite Argument ist oder?
Quote:
Originally Posted by mydoom View Post
Der Stack "wächst" von den hohen zu niedrigen Adressen (zB FFFFFF-000000) und der Base Pointer (EBP) markiert ja den Anfang des "Scopes" der aktuellen Funktion. Wie sich das +12 erklärt steht in meinem letzten Post. Zu EBP-4:

Das hier sei der Stack:
[ESP]
[Local.1] (Also entweder EBP-4 oder ESP+4)
[EBP]

(hoffe das ist so richtig :D)
Ja ist es.

Quote:
Originally Posted by MrSm!th View Post
Das sind einfach Namen, die Olly einsetzt, um es dir zu erleichtern.
Er analysiert den Stack und den Zugriff auf darin enthaltene Variablen und erkennt so, was Parameter (ARG1,2,3...) und was lokale Variablen sind (Local1,2,3...).

eine lokale Variable in C++:

Code:
void foo()
{
int x = 0;
}
wäre in asm

Code:
sub esp, 4
mov [esp], 0
Ich addressiere die lokalen Variablen lieber mit dem BasePoint register als mit den StackPoint register.
Z.B.
PHP Code:
sub esp,8
mov 
[ebp-4],
Ich finde das ist einfacher da das BasePoint register ja immer auf den Stack anfahng einer funktion zeigt und sich nicht durch push und pop Verändert.
Was die Addressierung der lokalen Variablen ja einfacher macht.
08/04/2010 19:51 MrSm!th#12
Quote:
Originally Posted by mydoom View Post
<ot>Poste bitte noch weitere Beispiele. Es macht Spaß diese Unterwegs zu "lösen" ;D </ot>

Aber ich hätte selbst noch eine Frage dazu:
ARG.2 ist EBP+12, weil vor dem Basepointer (EBP+4) noch die Rücksprungadresse liegt und deshalb EBP+8 das erste Argument bzw EBP+12 das Zweite Argument ist oder?
jop, ist richtig
Quote:
Originally Posted by SmackJew View Post
Falsch, ohne dword ptr ist das Verhalten nicht definiert.
weiß ich doch, bin schreibfaul und hierfür hats gereicht ;>

Quote:
Originally Posted by ¿Freaky¿ View Post
Ich bin jetzt voll am verzweifel ^^
Ok weiß jetzt wie ihr auf ebp gekommen seid.
Aber woher kommt +12 und -4 ?

Code:
00414B44  . 8B4D 0C         MOV ECX,DWORD PTRSS:[ebp+12] 
00414B47  . 8D45 FC         LEA EAX,[ebp-4]
das ist das offset vom pointer :rolleyes:
sind ja nicht alle parameter an der selben stelle.

ob ebp oder esp entscheidet die calling convention und je nachdem, wird + oder - genommen (bei cdecl immer + und bei stdcall kommts drauf an)

__stdcall:

funktion beginnt damit, den base pointer zu sichern und dann den stack poiter reinzukopieren, damit man auf parameter und lokale variablen zugreifen kann, ohne calls und push'es mitten in der funktion beachten zu müssen:

Code:
push ebp
mov ebp, esp
sub esp, 4  //platz für eine lokale variable und diese ist nun bei esp oder ebp-4
mov eax, [epb+8] // epb zeigt auf den alten ebp wert, ebp+4 auf die return adresse und ebp+8 auf den ersten parameter
mov ebx, [ebp-4] //oder eben [esp]
das könnte auch so ersetzt werden:

Code:
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ARG1]
mov ebx, [LOCAL1]
bei einer __cdecl funktion würde für alles esp genutzt:

Code:
sub esp, 4
mov eax, [esp+8] //erster parameter (da esp durch das sub esp verringert wurde)
mov ebx, [esp]   //local 1
// und wenn jetzt ein push kommt, greift man direkt anders zu(nervig, wenn man sowas reversed)
push eax
mov eax, [esp+C] //erster parameter
mov ebx, [esp+4] //local 1
hoffe, nun ists verständlich.

und ja, vor die klammern kommt eine ptr größe.
es muss nicht dword ptr sein, es geht auch ein word, lieber Jude aus Brasilien ;O

also denkt euch dword ptr davor und dann passts
08/05/2010 01:01 SmackJew#13
Quote:
Originally Posted by MrSm!th View Post
weiß ich doch, bin schreibfaul und hierfür hats gereicht ;>
:mofo: They call me SmackJew