ASM" />

"Traduction C -> ASM [Résolu]

Signaler
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Bonsoir,
Est-ce que quelqu'un saurait me "traduire" ces quelques lignes en assembleur:
HANDLE hFile;
DWORD bw;
char CurDir[MAX_PATH];
GetCurrentDirectory(MAX_PATH, &CurDir);
hFile = CreateFile("C:\\config.bak", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
WriteFile(hFile, &CurDir, MAX_PATH, &bw, 0);
CloseHandle(hFile);

Merci

Neo_Fr
A voir également:

48 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
Voila fait.
Gaffe que ça écrit les 260 octets de CurDir comme voulu dans ton code. Pas grave à la relecture puisqu'il y a le 0 final parmi les 260 octets.

#define _WIN32_WINNT 0x0600
#include <windows.h>


char szFLBAK[] = "D:\\config.bak";


//HANDLE hFile;
//DWORD bw;
//char CurDir[MAX_PATH];
//GetCurrentDirectory(MAX_PATH, CurDir);
//hFile = CreateFile("D:\\config.bak", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
//WriteFile(hFile, CurDir, MAX_PATH, &bw, 0);
//CloseHandle(hFile);
__declspec(naked) void __stdcall bnWriteCurdir(VOID)
{
  __asm {
    push    0
    push    0
    push    CREATE_ALWAYS
    push    0
    push    0
    push    GENERIC_WRITE
    push    offset szFLBAK
    call    dword ptr CreateFile
    lea     edx, [esp - 264]  ;// bw(esp+260), CurDir(esp)
    cmp     eax, -1 ;// if(hfl == INVALID_HANDLE_VALUE) return;
    mov     ecx, edx
    je      short crdEXIT
    mov     esp, edx  ;// VARIABLES SUR STACK
    add     ecx, 260  ;// ADRESSE bw EN 2 TEMPS POUR CADRAGE INSTRUCTION
    push    eax       ;// PARAM CloseHandle
    push    0         ;// 1er PARAM WriteFile
    push    ecx
    push    260
    push    edx
    push    eax       ;// DERNIER PARAM WriteFile
    push    edx
    push    260
    call    dword ptr GetCurrentDirectory
    call    dword ptr WriteFile
    add     esp, 264  ;// RETABLIT STACK
    call    dword ptr CloseHandle
crdEXIT:
    ret     0
  }
}


#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) void __stdcall myWinMain()
{
  __asm {
    call    bnWriteCurdir
    push    0
    call    dword ptr ExitProcess
  }
}

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
Vois si tu peux trouver ça:
http://www.amazon.fr/Assembleur-x86-Jean-Bernard-Emond/dp/2744015644

Aucune idée pour tuto sur le net, il n'y en avait pas à mon époque.
Vois ce que tu trouves avec:
http://www.google.fr/search?hl=fr&q=%22assembleur+x86%22&meta=lr%3Dlang_fr
au besoin demande avant de perdre du temps sur un en particulier, il y a beaucoup de déchets sur ce sujet.

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Zut!!!
Bon ben.... essais #2

__declspec(naked) void __stdcall test (void)
{
    __asm {
        lea eax, [esp-12]
        mov    dword ptr[eax], 6C5C3A43h
        mov    dword ptr[eax+4], 2E676663h
        mov    dword ptr[eax+8], 006B6162h
        mov esp, eax
        push   0
        push   0
        push   CREATE_ALWAYS
        push   0
        push   0
        push   GENERIC_WRITE
        push   eax
        call   dword ptr CreateFile
        add esp, 12
        push eax
        call dword ptr CloseHandle
        ret
    }
}

C++ (@++)<!--
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Ahh Merci!!
Depuis 23h30 j'etais en train d'essayer n'importe quoi
Pour ceux que ca interrese voici le code fonctionnel:

#pragma comment(linker, "/entry:_WinMain")
__declspec(naked) void __stdcall _WinMain(void)
{
__asm {
lea eax, [esp-12]
mov dword ptr[eax], 6C5C3A43h
mov dword ptr[eax+4], 2E676663h
mov dword ptr[eax+8], 006B6162h
mov esp, eax
push 0
push 0
push CREATE_ALWAYS
push 0
push 0
push GENERIC_WRITE
push eax
call dword ptr CreateFile
add esp, 12
lea edx, [esp - 264] ;// bw(esp+260), CurDir(esp)
mov ecx, edx
mov esp, edx ;// VARIABLES SUR STACK
add ecx, 260 ;// ADRESSE bw EN 2 TEMPS POUR CADRAGE INSTRUCTION
push eax ;// PARAM CloseHandle
push 0 ;// 1er PARAM WriteFile
push ecx
push 260
push edx
push eax ;// DERNIER PARAM WriteFile
push edx
push 260
call dword ptr GetCurrentDirectory
call dword ptr WriteFile
add esp, 264 ;// RETABLIT STACK
call dword ptr CloseHandle
push 0
call dword ptr ExitProcess
}
}
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
La je ne suis plus sûr de rien mais, Neo_Fr, ta fonction ne serait t-elle pas mieux ainsi (ou quelque chose s'en rapprochant):

__declspec(naked) int __stdcall _WinMain(void)
{
__asm {
    lea     edx, [esp-264]
    mov     dword ptr[edx], 6C5C3A43h
    mov     dword ptr[edx+4], 2E676663h
    mov     dword ptr[edx+8], 006B6162h
    mov     esp, edx
    push    0
    push    0
    push    CREATE_ALWAYS
    push    0
    push    0
    push    GENERIC_WRITE
    push    edx
    call    dword ptr CreateFile
    mov     ecx, esp
    add     ecx, 260  ;// ADRESSE bw EN 2 TEMPS POUR CADRAGE INSTRUCTION
    push    eax       ;// PARAM CloseHandle
    push    0         ;// 1er PARAM WriteFile
    push    ecx
    push    0
    push    edx
    push    eax       ;// DERNIER PARAM WriteFile
    push    edx
    push    260
    call    dword ptr GetCurrentDirectory
    mov        [esp+8], eax
    call    dword ptr WriteFile
    call    dword ptr CloseHandle
    add     esp, 264  ;// RETABLIT STACK
    push    0
    call    dword ptr ExitProcess
  }
}

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oups. J'ai trouvé une petite erreur dans mon code:

__declspec(naked) int __cdecl main(void)
{
__asm {
    lea     edx, [esp-264]
    mov     dword ptr[edx], 6C5C3A43h
    mov     dword ptr[edx+4], 2E676663h
    mov     dword ptr[edx+8], 006B6162h
    mov     esp, edx
    push    0
    push    0
    push    CREATE_ALWAYS
    push    0
    push    0
    push    GENERIC_WRITE
    push    edx
    call    dword ptr CreateFile
    mov     ecx, esp
    mov    edx, esp   ; // Ligne ajouté ici
    add     ecx, 260
    push    eax
    push    0
    push    ecx
    sub     esp, 4
    push    edx
    push    eax
    push    edx
    push    260
    call    dword ptr GetCurrentDirectory
    mov        [esp+8], eax
    call    dword ptr WriteFile
    call    dword ptr CloseHandle
    add     esp, 264
    push    0
    call    dword ptr ExitProcess
  }
}

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
CurDir EST un pointeur donc pas de '&' devant.

Quel intérêt de le mettre en ASM ?
Soit c'est une petite fonction indépendante et il n'y a rien à gagner par rapport au compilo, soit ça fait partie d'un bloc de code et auquel cas il faut tout mettre en ASM.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
C'est pas pour gagner en vitesse, c'est juste pour faire une petite experience, il me faudrait juste la declaration des variables et l'apelle au fonction avec push et call, mais je ne sait pas comment declarer les variables, et je crois qu'il faut passer les parametre a l'envers?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
ok je te le fais, 2 mn.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
merci :D
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
C'est possible de declarer ca en asm?
char szFLBAK[] = "D:\\config.bak"; ?

J'aimerais faire la meme chose pour sa:
const BYTE Data[13] = "Test1\r\nTest2\0";
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
par exemple EAX adresse du buffer de "D:\\config.bak" + 0 final

mov dword ptr[eax], 635C3A44h   ;// "D:\c"
mov dword ptr[eax+4], 69666E6Fh ;// "onfi"
etc...

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
ok en faite on ecrit la valeur ascii en hexa par block de 4 et on rajoute h a la fin?

Quand on ecrit sur eax on ecrase pas des données?
Quand on a besoin de cette variable on fait push eax ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
ohe ohe, étudie l'ASM.
Je ne vais pas le détailler ici par bribes.
Si c'est un point particulier ok.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
tu connais un bon tuto pour commencer?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Et la référence des instructions, par ex. Intel
http://www.intel.com/products/processor/manuals/index.htm
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Ce petit bout de code est censé ecrire son path dans C:\lcfg.bak
mais il plante des la premiere instruction: "la memoire ne peut etre written"
mov dword ptr[eax], 006B6162h
pk?


#include <windows.h>
#pragma comment(linker, "/entry:_WinMain")
__declspec(naked) void __stdcall _WinMain(void)
{
__asm{
mov dword ptr[eax], 006B6162h ;// /0kab
mov dword ptr[eax+4], 2E676663h ;// .gfc
mov dword ptr[eax+8], 6C5C3A43h ;// l\:C
push 0
push 0
push 2 ;//CREATE_ALWAYS
push 0
push 0
push 1073741824 ;//GENERIC_WRITE
push eax
call dword ptr CreateFile
lea edx, [esp - 264] ;// bw(esp+260), CurDir(esp)
mov esp, edx ;// VARIABLES SUR STACK
add ecx, 260 ;// ADRESSE bw EN 2 TEMPS POUR CADRAGE INSTRUCTION
push eax ;// PARAM CloseHandle
push 0 ;// 1er PARAM WriteFile
push ecx
push 260
push edx
push eax ;// DERNIER PARAM WriteFile
push edx
push 260
call dword ptr GetCurrentDirectory
call dword ptr WriteFile
add esp, 264 ;// RETABLIT STACK
call dword ptr CloseHandle
push 0
call dword ptr ExitProcess
}
}
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
EAX doit contenir l'adresse d'un buffer, on n'écrit pas nimporte où en mémoire.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
On ne peut pas ecrire directement dans les registres?
Quand on fait char Test[32] ca n'alloue pas de memoire, ca ecrit directement dans la memoire cache du processeur non?
Sinon comment je peux faire pour obtenir un poiteur sur une zone de memoire libre?
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
"Quand on fait char Test[32] ca n'alloue pas de mémoire, ca ecrit directement dans la memoire cache du processeur non?"

Non. Un tableau fait reculer esp pour avoir sa mémoire sur le stack.

lea     edx, [esp - 264]

[esp - 264] est ton tableau char CurDir[260];
edx est son "pointeur".

mov byte ptr[edx], 0x66 équivaut à faire (CurDir[0] = 0x66 ou *pointeur = 0x66)

Ouvre un livre d'assembler avant de continuer plus loin. Il serait important de maitriser les concepts de registre et stack (entre autres) avant toute chose.

C++ (@++)<!--