tezca_system
Messages postés25Date d'inscriptionlundi 6 mars 2006StatutMembreDernière intervention 5 mars 2007
-
6 sept. 2006 à 21:45
ToutEnMasm
Messages postés591Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 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.
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.
ToutEnMasm
Messages postés591Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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++
Vous n’avez pas trouvé la réponse que vous recherchez ?
tezca_system
Messages postés25Date d'inscriptionlundi 6 mars 2006StatutMembreDerniè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
tezca_system
Messages postés25Date d'inscriptionlundi 6 mars 2006StatutMembreDerniè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...
ToutEnMasm
Messages postés591Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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
Messages postés591Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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:
tezca_system
Messages postés25Date d'inscriptionlundi 6 mars 2006StatutMembreDerniè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:
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.
ToutEnMasm
Messages postés591Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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
ToutEnMasm
Messages postés591Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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