Traduction c++ ---> asm

Résolu
tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007 - 6 sept. 2006 à 21:45
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 8 sept. 2006 à 09:05
Bonjour,

j'adore l'asm, sa fluidité, son agilité a pacourir les registres, sa rudesse et sa capacité à obeir au doigt et a l'oeil. Je connais le c++, plus moins que plus. mais mieux que l'asm.
Passons au chose passionante, par rapidité et souci de voir un résultat prompt et correct j'ai codé un bout de code en c++, le voici:

#include <windows.h>


int main(void)
{




 
 // On crée la structure startupinfo
 STARTUPINFO startupinfo;
 // On la rempli avec des 0
 memset (&startupinfo, 0, sizeof (STARTUPINFO)) ;
 // on indique a la structure sa taille
 startupinfo.cb = sizeof(startupinfo);
 
 // On crée la structure process
 PROCESS_INFORMATION process;
 // On la rempli avec des 0
 memset (&process, 0, sizeof (PROCESS_INFORMATION)) ;


 // La ou on va placer la portion de memoire lu
 char memread[1];
 // Si on passe des arguments
 char* cmdline;
 
 // on recupere les arguments
 cmdline = GetCommandLine();
 
 // on crée le proces
 if (CreateProcess("LogTarget.exe", cmdline, NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS,NULL, NULL, &startupinfo, &process))
 {
  // On ecrit dans la memoide du grog
  WriteProcessMemory (process.hProcess, (LPVOID)0x401016, "\x90", 1, NULL);
  WriteProcessMemory (process.hProcess, (LPVOID)0x401017, "\x90", 1, NULL);


  // On a plus besoin de rien faire on ferme l'handle
  // pas le prog juste l'handle
  CloseHandle (process.hProcess);
  CloseHandle (process.hThread);


 }
 else
 {
  // on a pas pu l'ouvrir
  MessageBox(NULL, "Erreur Imposible d'ouvrir Crackme.exe", "Erreur", MB_OK|MB_ICONERROR);
  exit(-1);
 }


 return 1;


}

Je me suis inspiré evidement pour ceux qui reconnaisse, donc ce que je souhait par dessus tout c'est reecrire ce code en assembleur Win32. Pourriez vous m'aider svp c'est important pour moi.
Je pense qu'après cela je serais plus complet.
Je commence evidement dès ce soir.
Merci par avance

P.S: ce qui m'embete c'est pas trop les appels de fonction evidement et le passage en pile de leur argument, c'est entre autre quelques details, la traduction du de la fonction memset.
A voir également:

15 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2006 à 00:45
typedef struct _STARTUPINFO {
  DWORD cb;
  LPTSTR lpReserved;
  LPTSTR lpDesktop;
  LPTSTR lpTitle;
  DWORD dwX;
  DWORD dwY;
  DWORD dwXSize;
  DWORD dwYSize;
  DWORD dwXCountChars;
  DWORD dwYCountChars;
  DWORD dwFillAttribute;
  DWORD dwFlags;
  WORD wShowWindow;
  WORD cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;


memset dit de mettre chaque octet à 0.
MAIS serait idiot pour cb vu qu'on doit y mettre la size.
16 membres de 4 octets + 2 WORD donc sizeof = 68.
On dira donc 16 DWORDs à remplir de 0 (pas membre cb qui est le 1er).


lea eax, [esp-4] ; adresse dernier membre future STARTUPINFO
mov ecx, 16 ; on ne fera pas le membre cb
sub esp, 68 ; a que voila une belle STARTUPINFO
setZERO: ; bouclage du memset, 4 octets mis à zero par passe
mov dword ptr[eax], 0
sub eax, 4
sub ecx, 1 ; meilleur que "dec ecx" pour l'alignement des instructions
jnz short setZERO
mov dword ptr[eax], 68 ; cb = sizeof(STARTUPINFO)


Inutile de faire de la philo sur l'ASM, trace plutot sur papier le schéma de la pile (ESP) et tout deviendra clair.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2006 à 11:35
comment ça "non importé" ???
WriteProcessMemory tu l'obtiens par GetProcAddress si tu ne veux pas qu'il soit en clair dans les imports de l'exe.

ciao...
BruNews, MVP VC++
3
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
7 sept. 2006 à 05:56
Salut,
Pas besoin de redefinir les structures les plus courantes avec masm et de se livrer a de la programmation genre listing parfaitement illisible.Masm est un langage de haut niveau très proche du c dans son écriture.
                     ToutEnMasm

;---------------------------------------------
include windows.inc

Main Proc


        Local startupinfo:STARTUPINFOA
           invoke RtlZeroMemory,addr startupinfo,sizeof startupinfo
        ..
        .... et la suite
         
ret


Main endp
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2006 à 09:21
ouhhh qu'il est médisant ToutEnAsm ce matin....
Je n'ai rien redéfini, la définition de la structure est en C, copier-coller de MSDN juste pour l'avoir devant les yeux que je l'ai mise ici.

Plus sérieux:
MASM n'est qu'un assembleur. Il est livré avec un analyseur syntaxique à base de macros qui remplaceront les lignes avec "invoke, "addr" et autres bidules de ce genre mais ce n'est pas cela qui en fera un langage, il manque (comme en C) le compilo et surtout son optimiseur.

"...par rapidité et souci de voir un résultat prompt et correct..."
Au vu du 1er paragraphe de ce post, on voit qu'on a affaire à un complet débutant. La demande est ASM et non pas du C en moins bon. Si c'est pour PUSHer 2 params et faire un call sur RtlZeroMemory, vaut mieux rester en C, le compilo aurait inséré direct de l'ASM en place du call.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007
7 sept. 2006 à 11:19
Bonjour,

En effet très clair en prennant le temps.
Vraiment formidable.
A terme ce bout de code devera etre integrer a un exe afin de lui permettre de se patcher lui meme...donc faire du bas niveau est vraiment nécessaire selon moi.
Merci beaucoup
0
tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007
7 sept. 2006 à 11:26
lol ca sera peut etre l'objet d'un autre post...mais si vous avez des bonnes docs, des liens des methodes du code a propos de l'utilisation de fonction non importé dans un exe.........notamment WriteProcessMemory, (afin de patcher evidement) je suis tout ouie.

Car comment patcher un exe de lui meme, si la fonction qui sert a patcher n'est pas importée? Appremment faire le Mac Gyver avec l'IAT...

merci par avance
0
tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007
7 sept. 2006 à 12:37
D'accord c'est que j'ai mal exprimé ma question... merci beaucoup.
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
7 sept. 2006 à 13:50
Précision utile,
Aucune médisance de ma part,je ne fais que préciser qu'avec masm nombre de définitions sont déja dans windows.inc,c'est tout.
Tant qu'au machin bidule du genre invoke et addr , on vient bien la un nostalgique de la programmation binaire (la c'est franchement de la médisance (rire))


                                            ToutEnMasm


 
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
7 sept. 2006 à 14:14
J'ai oublié de préciser qu'avec GetProcAddress il faut crypter le nom de la fonction qui doit se trouver obligatoirement en data sinon il vaut mieux utiliser la librairie c'est plus simple.Mais dans un cas comme dans l'autre un bon debugger n'a pas beaucoup de problèmes pour identifier les fonctions.
On peut aussi faire appel a non import (c'est a dire aucune librairie) un exemple est sur mon site page librairie,
                                       ToutEnMasm

                          
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2006 à 15:06
Bien fait de préciser car si c'est pour mettre:
pfnc = GetProcAddress(hkrnl32, "WriteProcessMemory")
alors autant linker directement l'appel de fonction.

De toute manière, comme le dit ToutEnAsm, on pourra toujours lire sous debug ce qu'il y a à l'adresse passée à GetProcAddress. Disons que ça te fera au moins un bon exercice.

Exemle possible parmi tant d'autres, faire sa chaine à l'exécution ainsi rien en data:

char szWPM[20];
*((DWORD*) szWPM) = 'tirW'; // 74697257h
*((DWORD*) (szWPM + 4)) = 'orPe'; // 6F725065h
*((DWORD*) (szWPM + 8)) = 'ssec'; // 73736563h
*((DWORD*) (szWPM + 12)) = 'omeM'; // 6F6D654Dh
*((DWORD*) (szWPM + 16)) = 'yr'; // 7972h
pfnc = GetProcAddress(hkrnl32, szWPM);

tu mettras en ASM, pas le temps.

ciao...
BruNews, MVP VC++
0
tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007
7 sept. 2006 à 17:00
"J'ai oublié de préciser qu'avec GetProcAddress il faut crypter le nom de la fonction qui doit se trouver obligatoirement en data sinon il vaut mieux utiliser la librairie c'est plus simple."

Que veux tu dire Toutenasm?

Exemle possible parmi tant d'autres, faire sa chaine à l'exécution ainsi rien en data:

"char szWPM[20];
*((DWORD*) szWPM) = 'tirW'; // 74697257h
*((DWORD*) (szWPM + 4)) = 'orPe'; // 6F725065h
*((DWORD*) (szWPM + 8)) = 'ssec'; // 73736563h
*((DWORD*) (szWPM + 12)) = 'omeM'; // 6F6D654Dh
*((DWORD*) (szWPM + 16)) = 'yr'; // 7972h
pfnc = GetProcAddress(hkrnl32, szWPM);"

Que veux tu dire brunews?

Juste les grandes lignes car je sens que je vais devoir potasser tout ca encore.

Tout ces bouts de code seront integrer direcement en hexa a mon exe ainsi il se patchera de lui meme.

jump vers notre routine de patch, qui patchera directement dans a la volée.
enfin voila ^.^
0
tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007
7 sept. 2006 à 17:08
Enfin je commence a comprendre tu as pusher WriteProcessMemory.. a faire en asm ok...alalala c long c dur mais qu'est ce que c bon
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 sept. 2006 à 20:49
salut,




avec le hInstance, on peut aussi aller chercher directement l'adresse de la fonction a importer dans le pe header de la dll souhaitée. Tout en cryptant bien sure la chaine de recherche de la dll et de la fonction importée par un simple xor.

@++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
8 sept. 2006 à 07:53
Salut,
Le problème peut se poser simplement.La dll contient une série de données formatées contenant le nom de la fonction et son adresse .La donnée formatée est reconnaissable uniquement par le nom de fonction qu'elle contient,il faut donc le former en mémoire pour retrouver l'adresse de la fonction (voir le PE format).
Suivant la manière dont on va former ce nom,la fonction utilisée sera plus ou moins lisible.
Par exemple,on peut écrire un programme récupérant un pointeur sur cette zone et rechercher le nom d'une fonction lettre par lettre en chargeant un registre avec.
c'est beaucoup plus long a suivre que de mettre le nom en data et d'appeler getprocadress.
Comment procéder,voir l'exemple de non import sur mon site,il se livre a cet exercice mais sans cacher ce qu'il cherche.
                                       ToutEnMasm
 
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
8 sept. 2006 à 09:05
Une précision sur le debugger,
Normalement constitué , un debugger rencontrant un saut ou un call dans une dll , lit le tableau de correspondance Nom-adresses (dans la dll) et affiche le nom dans la ligne.
Que reste t-il des divers moyens utilisés pour cacher l'appel,ben .... pas grand chose.
                                ToutEnMasm
0
Rejoignez-nous