Hallo,
Ich möchte mir der Performance wegen die eine oder andere Funktion in ASM schreiben. Meine ASM Kentnisse sind leider nicht sehr gross, aber gerade damit möchte ich mir etwas mehr erfahrung antrainieren.
Das ganze funktioniert so, dass ich den "shellcode" ins Memory schreibe und dann einen DLLCALL zur Adresse dieser Variabeln mache - mit den ganzen Parameter usw. Inline ASM sowie man es kennt, wird nicht unterstützt, daher dieser Weg.
Das funktioniert auch, nur weis ich nicht, wie ich die Parameter richtig übergeben muss. (Mangels Erfahrung in ASM)
Zunächst mal Ein Beispiel welches Funktioniert, da die Funktion nur einen Param zurückgibt (über das EAX Register) aber keine entgegen nimmt.
NASM CODE:
Daraus wird: "\x31\xc0\xfc\xb9\xff\x00\x00\x00\x05\x02\x00\x00\x00\xe2\xf9\xc3"
Rufe ich diesen "Shellcode/Inline Asm" in meinem Programm auf, gibt mir das dann auch 510 zurück.
Natürlich will ich auch Parameter übergeben, aber ich verstehe nicht recht wie das funktioniert - ich dachte ich könnte den Parameter einfach mit pop vom stack in ein register schreiben... aber das schein nicht zu funktionieren. Die Parameter liegen doch auf dem Stack bei cdecl?
Funktioniert leider nicht... (wollte das Zählerregister ECX mit dem Parameter befüllen)
Ich habe hier eine ASM Funktion gefunden, die den folgenden C Code abbildet:
C-CODE
=>
ASM CODE
Welcher auch funktioniert, und die Parameter entgegen nimmt.
Kann mir mal jemand erklähren, wie ich eine cdecl Parameterübergabe richtig in ASM entgegennehme, und was ich beachten muss? Evtl Datentypen problem?
Desweiteren habe ich auch etwas verständnisprobleme warum z.B. hier:
direkt auf den Stack zugegriffen wird und nicht mittels pop die ganzen Params runtergeholt werden?
mfg
Ich möchte mir der Performance wegen die eine oder andere Funktion in ASM schreiben. Meine ASM Kentnisse sind leider nicht sehr gross, aber gerade damit möchte ich mir etwas mehr erfahrung antrainieren.
Das ganze funktioniert so, dass ich den "shellcode" ins Memory schreibe und dann einen DLLCALL zur Adresse dieser Variabeln mache - mit den ganzen Parameter usw. Inline ASM sowie man es kennt, wird nicht unterstützt, daher dieser Weg.
Das funktioniert auch, nur weis ich nicht, wie ich die Parameter richtig übergeben muss. (Mangels Erfahrung in ASM)
Zunächst mal Ein Beispiel welches Funktioniert, da die Funktion nur einen Param zurückgibt (über das EAX Register) aber keine entgegen nimmt.
NASM CODE:
Code:
[SECTION .text]
BITS 32
global _start
_start:
xor eax, eax
CLD
MOV ECX, 0xFF
again:
ADD, EAX, 0x02
Loop again
ret
Rufe ich diesen "Shellcode/Inline Asm" in meinem Programm auf, gibt mir das dann auch 510 zurück.

Natürlich will ich auch Parameter übergeben, aber ich verstehe nicht recht wie das funktioniert - ich dachte ich könnte den Parameter einfach mit pop vom stack in ein register schreiben... aber das schein nicht zu funktionieren. Die Parameter liegen doch auf dem Stack bei cdecl?
Code:
[SECTION .text]
BITS 32
global _start
_start:
xor EAX, EAX
POP ECX
CLD
again:
ADD EAX, 0x02
Loop again
ret
Ich habe hier eine ASM Funktion gefunden, die den folgenden C Code abbildet:
C-CODE
Code:
void Bin2Hex0(UInt8 *hex, UInt8 *bin, UInt32 len) { // in hex room for 2*len+1 bytes
UInt8 c, d, *end = bin+len;
while (bin < end) {
c = *(bin++);
d = c >> 4;
*(hex++) = d + (d>9 ? 55 : 48);
d = c & 15;
*(hex++) = d + (d>9 ? 55 : 48);
}
*hex = 0;
}
ASM CODE
Code:
00000000 8B44240C mov eax,[esp+0xc]
00000004 56 push esi
00000005 8B742408 mov esi,[esp+0x8]
00000009 57 push edi
0000000A 8B7C2410 mov edi,[esp+0x10]
0000000E 8D1407 lea edx,[edi+eax]
00000011 3BFA cmp edi,edx
00000013 7332 jnc 0x47
00000015 53 push ebx
00000016 8A07 mov al,[edi]
00000018 47 inc edi
00000019 8AC8 mov cl,al
0000001B C0E904 shr cl,0x4
0000001E B309 mov bl,0x9
00000020 3AD9 cmp bl,cl
00000022 1ADB sbb bl,bl
00000024 80E307 and bl,0x7
00000027 80C300 add bl,0x0
Kann mir mal jemand erklähren, wie ich eine cdecl Parameterübergabe richtig in ASM entgegennehme, und was ich beachten muss? Evtl Datentypen problem?
Desweiteren habe ich auch etwas verständnisprobleme warum z.B. hier:
Code:
mov eax,[esp+0xc]
mfg
Zuletzt bearbeitet: