Bonjour,
j'essaye de m'initier a l'assembleur ARM et j'aurais quelques questions.
J'ai un exe qui appelle une fonction declarée dans une DLL comme montrée ci dessous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 __declspec(dllimport) void MyOutputDebugString(LPCTSTR lpOutputString); //-- EXE -- int _tmain(int argc, _TCHAR* argv[]) { MyOutputDebugString(L"ORIGINAL FUNCTION\n"); return 0; } //-- DLL BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } void MyOutputDebugString(LPCTSTR lpOutputString) { OutputDebugString(lpOutputString); }
Lorsque je decompile avec visual le process en train de tourner voici ce que j'obtiens :
Il faut savoir que sur ARM les 4 premiers paramètres d'une fonction sont passées par les registres R0 a R3, les suivants le sont sur la pile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 wmain: 00011000 E1A0C00D mov r12, sp 00011004 E92D0003 stmdb sp!, {r0, r1} 00011008 E92D5000 stmdb sp!, {r12, lr} 0001100C E24DD004 sub sp, sp, #4 00011010 E59F0024 ldr r0, [pc, #0x24] 00011014 E59F301C ldr r3, [pc, #0x1C] 00011018 E5933000 ldr r3, [r3] 0001101C E1A0E00F mov lr, pc 00011020 E1A0F003 mov pc, r3 00011024 E3A03000 mov r3, #0 00011028 E58D3000 str r3, [sp] 0001102C E59D0000 ldr r0, [sp] 00011030 E28DD004 add sp, sp, #4 00011034 E89DA000 ldmia sp, {sp, pc} 00011038 0001302C andeq r3, r1, r12, lsr #32 0001103C 0001201C andeq r2, r1, r12, lsl r0
Dans mon exemple j'ai choisi une fonction avec un seul argument.
Donc si on suit le programme on a :
mov r12, sp : sauve le pointeur de pile(SP) ds R12
stmdb sp!, {r0, r1} : sauve le registre R0 et R1 sur la pile et dec SP
stmdb sp!, {r12, lr} : sauve le registre R12 et LR sur SP et dec SP
sub sp, sp, #4 : alloue 4 octets sur la pile
ldr r0, [pc, #0x24] : mets dans R0 le contenu de l'adresse de PC avec un index de 0x24
C'est cette ligne avec laquelle j'ai du mal
En fait juste avant l'exécution de cette instruction PC = 0x00011010
et apres exécution j'ai R0 = 0x0001201c. Quand je regarde l'espace mémoire a cette adresse j'ai bien L"ORIGINAL FUNCTION\n", le premier paramètre de ma fonction.
Cependant la syntaxe [pc, #0x24] je ne comprends pas. Au debut je pensais que ca signifiait que l'on prends la valeur du PC et que l'on ajoute 0x24 ce qui me donnerait 0x00011010+0x24 = 0x11034 mais a 0x11034 j'ai E89DA000 cad
ldmia sp, {sp, pc} . Donc si quelqu'un pouvait m'éclairer sur le sujet...
Partager