Traduction c++ ---> asm [Résolu]

tezca_system 25 Messages postés lundi 6 mars 2006Date d'inscription 5 mars 2007 Dernière intervention - 6 sept. 2006 à 21:45 - Dernière réponse : ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 7 sept. 2006 à 00:45
3
Merci
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++

Merci BruNews 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de BruNews
Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 7 sept. 2006 à 11:35
3
Merci
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++

Merci BruNews 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de BruNews
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 7 sept. 2006 à 05:56
0
Merci
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
Commenter la réponse de ToutEnMasm
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 7 sept. 2006 à 09:21
0
Merci
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++
Commenter la réponse de BruNews
tezca_system 25 Messages postés lundi 6 mars 2006Date d'inscription 5 mars 2007 Dernière intervention - 7 sept. 2006 à 11:19
0
Merci
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
Commenter la réponse de tezca_system
tezca_system 25 Messages postés lundi 6 mars 2006Date d'inscription 5 mars 2007 Dernière intervention - 7 sept. 2006 à 11:26
0
Merci
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
Commenter la réponse de tezca_system
tezca_system 25 Messages postés lundi 6 mars 2006Date d'inscription 5 mars 2007 Dernière intervention - 7 sept. 2006 à 12:37
0
Merci
D'accord c'est que j'ai mal exprimé ma question... merci beaucoup.
Commenter la réponse de tezca_system
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 7 sept. 2006 à 13:50
0
Merci
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


 
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 7 sept. 2006 à 14:14
0
Merci
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

                          
Commenter la réponse de ToutEnMasm
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 7 sept. 2006 à 15:06
0
Merci
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++
Commenter la réponse de BruNews
tezca_system 25 Messages postés lundi 6 mars 2006Date d'inscription 5 mars 2007 Dernière intervention - 7 sept. 2006 à 17:00
0
Merci
"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 ^.^
Commenter la réponse de tezca_system
tezca_system 25 Messages postés lundi 6 mars 2006Date d'inscription 5 mars 2007 Dernière intervention - 7 sept. 2006 à 17:08
0
Merci
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
Commenter la réponse de tezca_system
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 7 sept. 2006 à 20:49
0
Merci
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.

@++
Commenter la réponse de cs_patatalo
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 8 sept. 2006 à 07:53
0
Merci
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
 
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 8 sept. 2006 à 09:05
0
Merci
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
Commenter la réponse de ToutEnMasm

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.