Witam. Do assemblera zaglądam raz na ruski rok, ale coś mnie natchnęło, żeby spróbować jako tako zrozumieć pewne rzeczy.
Mam taki kod
IDA wysmażyła z tego coś takiego:
Kilka pytań:
1. Dobrze rozumiem, że obecność zmiennych lokalnych można rozpoznać po [EBP-xxx]? Nie widzę również ramki stosu, skąd w takim razie wzięło się __int64 result?
2. IDA stwierdziła, że funkcja przyjmuje dwa 8-bajtowe argumenty. Jeśli dobrze rozumiem to a1 = [ESP+4] i [ESP+8], a2 = [ESP+C] i [ESP+10]. Czym jest [ESP+14] w instrukcji MUL? OK, w międzyczasie jest push, więc esp się zmniejszył.
3. Prosiłbym o wyjaśnienie instrukcji RETN 10. (czyszczenie stosu z 16 bajtów?)
4. Jaki jest sens 3 instrukcji (OR ECX,EAX) skoro jej wynik jest nadpisywany w kolejnej instrukcji poprzez MOV? Ma ona związek z JNZ?
Z góry dziękuje za odpowiedzi i wyjaśnienia :)
Mam taki kod
Kod:
10001340 /$ 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
10001344 |. 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
10001348 |. 0BC8 OR ECX,EAX
1000134A |. 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
1000134E |. 75 09 JNZ SHORT ETS2Lib.10001359
10001350 |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
10001354 |. F7E1 MUL ECX
10001356 |. C2 1000 RETN 10
10001359 |> 53 PUSH EBX
1000135A |. F7E1 MUL ECX
1000135C |. 8BD8 MOV EBX,EAX
1000135E |. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
10001362 |. F76424 14 MUL DWORD PTR SS:[ESP+14]
10001366 |. 03D8 ADD EBX,EAX
10001368 |. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
1000136C |. F7E1 MUL ECX
1000136E |. 03D3 ADD EDX,EBX
10001370 |. 5B POP EBX
10001371 \. C2 1000 RETN 10
Kod:
__int64 sub_10001340(__int64 a1, __int64 a2) {
__int64 result; //qax@2
if (HIDWORD(a1) | HIDWORD(a2)) result = a1*a2;
else result = (_DWORD)a2 * (_QWORD)(DWORD)a1;
return result;
1. Dobrze rozumiem, że obecność zmiennych lokalnych można rozpoznać po [EBP-xxx]? Nie widzę również ramki stosu, skąd w takim razie wzięło się __int64 result?
2. IDA stwierdziła, że funkcja przyjmuje dwa 8-bajtowe argumenty. Jeśli dobrze rozumiem to a1 = [ESP+4] i [ESP+8], a2 = [ESP+C] i [ESP+10]. Czym jest [ESP+14] w instrukcji MUL? OK, w międzyczasie jest push, więc esp się zmniejszył.
3. Prosiłbym o wyjaśnienie instrukcji RETN 10. (czyszczenie stosu z 16 bajtów?)
4. Jaki jest sens 3 instrukcji (OR ECX,EAX) skoro jej wynik jest nadpisywany w kolejnej instrukcji poprzez MOV? Ma ona związek z JNZ?
Z góry dziękuje za odpowiedzi i wyjaśnienia :)