ASM : Problème d'appel d'api

Tout sur les langages de programmation.

ASM : Problème d'appel d'api

Messagepar Chaosphere » 27 Janvier 2018, 21:49

Bonjour,

Déja je tiens à m'excuser par avance si je suis hors charte. Si c'est le cas vous pouvez locker mon topic sans soucis :D
J'essaye de programmer un virus en asm avec MASM (juste pour m'amuser hein) en Win32

Voici mon problème :

J'arrive à ajouter ma nouvelle section dans un exe, et a rediriger le point d'entrée vers mon virus.
Le code de mon virus s’exécute bien. Mon code est relogeable, c'est à dire qu'il est capable de s’exécuter à n'importe quel emplacement en mémoire.

Mon seul problème c'est que lorsque je lance mon fichier infecté, mes appels aux api ne marche plus.

Par exemple si j'appelle l'api MessageBox habituellement le call redirige vers l'une de ces lignes :

Address Hex dump Command Comments
00401416 $- FF25 00204000 JMP DWORD PTR DS:[<&kernel32.CloseHandle
0040141C $- FF25 04204000 JMP DWORD PTR DS:[<&kernel32.CreateFileA
00401422 $- FF25 08204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess
00401428 $- FF25 0C204000 JMP DWORD PTR DS:[<&kernel32.ReadFile>]
0040142E $- FF25 10204000 JMP DWORD PTR DS:[<&kernel32.SetFilePoin
00401434 $- FF25 14204000 JMP DWORD PTR DS:[<&kernel32.WriteFile>]
0040143A $- FF25 18204000 JMP DWORD PTR DS:[<&kernel32.lstrcpyA>]
00401440 $- FF25 20204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>]

Dans le fichier infecté ces adresses ne sont plus valide.

D'où ma question : Comment faire ? :D
Est-ce qu'il faut que je charge mes dll dynamiquement avec LoadLibrary ? Mais dans ce cas il faut justement que j'appelle l'api LoadLibrary et ca risque de ne pas marcher (le serpent qui se mord la queue)...

J'avais lu il y a longtemps quelqu'un qui disait qu'il fallait rechercher la chaine "kernel32.dll" en mémoire et à partir de là trouver l'adresse de LoadLibrary...

J'ai éssayé de trouver des infos sur tout ca mais je ne trouve pas grand chose...

Si quelqu'un pouvait m'aider ca serait super cool

Merci d'avance
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar baboon » 29 Janvier 2018, 11:11

Il y a plusieurs manière de faire ça, la plus classique est d'utiliser le PEB pour retrouver l'adresse de base de kernel32 et de parser son IAT pour trouver GetProcAddress / LoadLibraryA pour ensuite retrouver n'importe quelle fonction exportée.
Google + "kernel32 PEB export table" devrait te fournir les infos nécessaires
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3346
Inscription: 08 Juillet 2005, 17:49

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 29 Janvier 2018, 12:48

Merci Baboon

C'est justement ce que je venait de trouver....

Ce qui m'étonne c'est quand je l'avais fait je n'avais pas eu ce problème... Je crois que je devais être sous XP à l'époque, peut être que ca marchait différement
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 30 Janvier 2018, 11:20

Salut,

Encore une question....
au début d'un virus pour connaître l'adresse à laquelle s’exécute le virus, on fait ceci :

Code: Tout sélectionner
   call delta
delta:
   pop ebp
   sub ebp, delta


Ce qui écrase le registre EBP, et du coup je ne plus accéder aux variables locales (déclarées sur la pile) puisque j'y accède comme ca :

MASM : mov UneVariable, eax -> traduit en : MOV DWORD PTR SS:[EBP-4],EAX
Et du coup je ne peux plus utiliser la directive "LOCAL" de MASM dans mes procs. Ce qui est bien dommage car c'est bien pratique pour utiliser des structures exemple :

Code: Tout sélectionner
LOCAL NTHeader:IMAGE_NT_HEADERS
...
   inc NTHeader.FileHeader.NumberOfSections ; Nombre de section = Nombre de sections + 1
...



Au lieu de récupérer le delta dans ebp, est-il possible de le faire plutôt dans un autre registre ?
J'ai éssayé avec edx et apparement ca marche, mais est-ce que c'est propre de faire comme ca ?
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar baboon » 30 Janvier 2018, 15:58

En théorie tu peux utiliser n'importe quel registre, ça marchera aussi bien.
En pratique, il faut juste prendre garde à ne pas utiliser un registre qui pourrait être écrasé dans un appel à une sous fonction. En 32bit sous windows, la convention d'appel t'assure que tu peux utiliser edi, esi, ebx ou ebp : hxxps://msdn.microsoft.com/en-us/library/984x0h58.aspx

Tu pourrais très bien utiliser edx ou même esp si tu voulais, mais il faudrait prendre garde à ce que ce registre ne soit pas implicitement utilisé ou écrasé par une fonction / une instruction (typiquement esp est utilisé par les push donc c'est une mauvaise idée de faire n'importe quoi avec et edx est susceptible d'être écrasé sans préavis par n'importe quel API).

Enfin si tu utilises ces registres, n'oublie pas de les sauvegarder en début de fonction et de les restaurer à la fin pour respecter les conventions d'appels justement.
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3346
Inscription: 08 Juillet 2005, 17:49

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 31 Janvier 2018, 06:08

Cool merci

Si je comprend bien les registres edi, esi, ebx et ebp ne sont pas modifiés lors d'un appel à une api Win32 ?
Donc dans ce cas le plus simple serait que j'utilise le registre ebx alors...
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 31 Janvier 2018, 10:44

Salut Baboon,

J'ai encore une question :D
J'aimerais pouvoir accéder à mes variables en lecture / écriture dans la section de code...
J'ai donc rajouté ca dans link (j'utilise Radasm):
Code: Tout sélectionner
/section:.text,rwe


Mais lorsque j'execute mon programme j'ai une exception dès que je veux écrire dans mes variables :

Code: Tout sélectionner
mov [ebx + dwKernelBase], 2


De plus dans Ollydbg ma section de code (".text") a ces caractéritiques (je ne vois pas de Write):
Code: Tout sélectionner
Characteristics = CODE|EXECUTE|READ


Est-ce que j'ai oublié un truc ?
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 31 Janvier 2018, 11:34

C'est bon j'ai trouvé....

Il fallait mettre ca :

Code: Tout sélectionner
/section:.text,rwe


Dans les options du linker dans Project -> project option et pas dans Option -> make options
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 31 Janvier 2018, 19:47

C'est bon j'arrive à appeller les api avec la méthode du PEB :D

Ca déchire :P
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 01 Février 2018, 12:48

Salut Baboon,

Je sauvegarde l'entry point original pour pouvoir l'appeler plus tard :

Code: Tout sélectionner
mov eax, NTHeader.OptionalHeader.AddressOfEntryPoint
add eax, NTHeader.OptionalHeader.ImageBase
mov [ebx + _OEP], eax ; Sauvegarde de l'OEP


Ca marche, mais j'ai quand même une question...
Lorsqu'un .exe est chargé, la section de code n'est pas obligatoirement chargée à l'adresse ImageBase ?

Du coup ce code risque de planter non ? :

Code: Tout sélectionner
_push db 68h
_OEP   dd 0
ret
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar baboon » 02 Février 2018, 11:08

ImageBase + AddressOfEntryPoint te donnera toujours la bonne adresse, la seule chose qui me semble mauvaise dans ton code c'est la manière dont tu récupère l'ImageBase, c'est à dire depuis le PE, statiquement.
Aujourd'hui, avec l'ASLR, les exe peuvent être mappés n'importe où en mémoire (petite subtilité pour les PE 64 bits et l'option de linkage HIGHENTROPYVA mais ça sort un peu du scope de cette discussion...) il faut donc récupérer l'image base dynamiquement, soit à l'aide du delta offset, soit à l'aide de l'API GetModuleHandle appelé avec lpModuleName set à NULL.
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3346
Inscription: 08 Juillet 2005, 17:49

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 02 Février 2018, 11:22

hum ok

GetModuleHandle permet de récupérer l'imagebase ?

ok je vais regarder ca alors...
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar Chaosphere » 03 Février 2018, 13:44

Bon j'ai utilisé ta technique avec GetModulHandle et ca marche nickel :mrgreen:

Par contre là j'ai un problème bizarre.... Mon virus infecte bien mon programme de test (qui affiche juste une messagebox)
Par contre si je fait le test sur un autre exe, en l'occurence le programme tproc.exe (qui se trouve dans le répertoire de MASM et bien le tproc infecté ne veut pas se lancer... J'ai un message d'erreur de windows qui me dit que cet exe n'est pas valide...

En l'ouvrant avec FilaAlyzer il me dit que le fichier est tronqué et qu'il manque 260 octets

En fait je remarque que le rawSize de la dernière section du fichier (.rsrc) n'est pas alignée sur FileAlignement (cf mes captures d'écran)
et je crois que c'est ca qui fait planter l'execution du .exe

Je crois que tproc.exe est un exe packé, c'est peut être en rapport non ?

Les headers de section :
http://zupimages.net/viewer.php?id=18/05/38j7.png

Le optional header où on peut voir le FileAlignement :
http://zupimages.net/viewer.php?id=18/05/gkqb.png
Chaosphere
Elève
Elève
 
Messages: 45
Inscription: 15 Janvier 2018, 13:53

Re: ASM : Problème d'appel d'api

Messagepar baboon » 05 Février 2018, 20:25

Il me semble que l'alignement de la taille des sections sur le disque n'est pas forcé par Windows.
Probablement que tu t'attends à ce qu'elle le soit et ça te vautre tes calculs.
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3346
Inscription: 08 Juillet 2005, 17:49

Re: ASM : Problème d'appel d'api

Messagepar baboon » 05 Février 2018, 20:39

My bad, il semblerait que seule la dernière section ait le droit de ne pas être alignée : hxxps://github.com/corkami/docs/blob/ma ... eofrawdata
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3346
Inscription: 08 Juillet 2005, 17:49

Suivante

Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité