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
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Je vient de commander un livre mais j'ai pas la patience d'attendre qu'il arrive

Peut - tu juste m'expliquer comment mettre "C:\lcfg.bak\0" dans eax (ou n'importe ou ailleur)

J'ai essayer:
lea edx, dword ptr[eax-8]
mov dword ptr[edx], 006B6162h
mov dword ptr[edx+4], 2E676663h
mov dword ptr[edx+8], 6C5C3A43h
mais ca plante a la deuxieme instructions "la memoire ne peut etre written"
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Tu peux l'empiler puis prendre l'adresse mémoire dans un registre par ex.
__asm
{
push 0x6B6162;
push 0x2E676663;
push 0x6C5C3A43;
mov edx,esp;
}
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
__declspec(naked) void __stdcall test (void)
{
    __asm {
        sub esp, 12
        mov eax, esp
        mov    dword ptr[eax], 6C5C3A43h
        mov    dword ptr[eax+4], 2E676663h
        mov    dword ptr[eax+8], 006B6162h
        push   0
        push   0
        push   2     ;//CREATE_ALWAYS
        push   0
        push   0
        push   1073741824 ;//GENERIC_WRITE
        push   eax
        call   dword ptr CreateFile
        add esp, 12
        push eax
        call dword ptr CloseHandle
        ret
    }
}

Ceci devrait créé un fichier nommé C:\lcfg.bakC++ (@++)<!--
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Ton programme marche mais ces quelques lignes non:

__asm{
sub esp, 12
mov eax, esp
mov dword ptr[eax], 6C5C3A43h
mov dword ptr[eax+4], 2E676663h
mov dword ptr[eax+8], 006B6162h
push 0
push 0
push 2 ;//CREATE_ALWAYS
push 0
push 0
push 1073741824 ;//GENERIC_WRITE
push eax
call dword ptr CreateFile
add esp, 12
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
ret
}
ca fait planter kernel32 "Access Violation" a 0x7C810D9C
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Tu initialises jamais ecx, comment peux-tu espérer un fonctionnement correct? D'autre part add esp,264, j'ai peut-être mal compté mais ça m'a pas l'air d'être le bon total. En plus il doit être au mauvais endroit puisque normalement en retour de WriteFile la pile pointe sur le handle empilé au commentaire // PARAM CloseHandle, donc pas besoin de bouger là.
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
MAX_PATH est egal a 260 + 4 pour l'extension .xxx, c'est brunews qui a coder tout ce qui est apres:
sub esp, 12
mov eax, esp
mov dword ptr[eax], 6C5C3A43h
mov dword ptr[eax+4], 2E676663h
mov dword ptr[eax+8], 006B6162h

initialiser ecx tu veux dire tt effacer?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Quand on débute, faut pas hésiter à faire le croquis de la stack sur papier pour s'y retrouver.

Pour info:
sub    esp, 12
mov    eax, esp
NON parallélisable, au moins 4 cycles de pénalité.
ESP est affecté, il ne peut pas servir de source dans l'autre pipeline ni dans le cycle suivant.

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
Comment le rendre "parallélisable"?
C'est de la que vient mon erreur?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Une mauvaise parallélisation d'instruction ne provoque rien d'autre qu'un code lent, pas d'erreur d'exécution.

Comment, he he c'est surement l'habitude qui fait qu'on pense la chose dès le début pour bien enchainer les instructions.
Pour ton code, c'est l'ensemble qu'il faut restructurer. Prends celui que j'ai fourni et regarde comment j'ai mis telle instruction à tel endroit, rien n'est au hasard. La décomposition d'affectation de ECX en 2 passes au lieu d'un LEA est un bon exemple.

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
Un derniere question comment je peux recuperer l'adresse d'une fonction exemple:
mov eax, 7C4EB8F4h ; &GetCurrentProcessId
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
mov eax, [GetCurrentProcessId] non ?

BruNews >>
    mov     esp, edx  ;// VARIABLES SUR STACK
    add     ecx, 260  ;// ADRESSE bw EN 2 TEMPS POUR CADRAGE INSTRUCTION
    push    eax       ;// PARAM CloseHandle
    ...
    add     esp, 264  ;// RETABLIT STACK
    call    dword ptr CloseHandle

Le HANDLE est pushé sur esp-264 mais CloseHandle essais de le récupérer sur esp. J'ai peut-être pas tout compris mais il y'aurait-il un problème là ?
C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
OUPS exact, comme quoi il ne faut pas écrire l'ASM à la va vite.
Faut juste inverser les 2 dernières lignes.

call    dword ptr CloseHandle
add     esp, 264  ;// RETABLIT STACK

ciao...
BruNews, MVP VC++
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Ah ca me rassure j'étais aussi en train de me casser la tête
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Oui c'est toujours mieux, l'autre version ecrivait les 264 caracteres, ce n'etait pas genant, mais merci quand meme
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ceci pourrait être plus rapide:

__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
    add     ecx, 260  ;// ADRESSE bw EN 2 TEMPS POUR CADRAGE INSTRUCTION
    push    eax       ;// PARAM CloseHandle
    push    0         ;// 1er PARAM WriteFile
    push    ecx
    sub        esp, 4   ;// Techniquement plus rapide de faire un sub qu'un push
    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
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Maintenant j'en suis a essayer de recuperer les adresse des fonctions et de les apeller comme ca:
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 2 ;//CREATE_ALWAYS
push 0
push 0
push 1073741824 ;//GENERIC_WRITE
push eax
mov eax, 7C801A24h ;//CreateFile
call eax
Ca me creer bien mon fichier C:\lcfg.bak sous WinXP Pro SP2
kernel32 build:5.1.2600.3119

mais les autres adresses que j'ai pu recuperer ne marche pas sa plante a GetCurrentDirectory.
Sinon personne ne connaitrait un site avec tt les adresses des fonctions de kernel32 de toutes les versions de windows?
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
T'as pas besoin de connaitre les adresses par coeur. Je t'ai fourni la méthode quelque post plus haut non ?

C++ (@++)<!--
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
On ne peut pas implémenter les adresses en dur (trop variable, fonction des versions des dlls systèmes), GetProcAdress sert à les retrouver à l'exécution.
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Justement si j'ai besoin des adresses car je fais des petits tests sur les buffer overflow et j'ai besoin d'ecrire en memoire tout en "dur"
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Ah les buffer overflow...
En fait pour avoir un truc solide, on réécrit la fonction GetProcAdress.
Cependant pour récupérer une adresse correcte pour faire des tests tu peux faire faire par ex. call GetCurrentDirectory, exécuter en Debug avec un breakpoint sur l'instruction et regarder sur quoi pointe GetCurrentDirectory, soit c'est marqué, soit tu peux exécuter instruction par instruction en vue Disassembly (F11 pour VC2005).