(ça parle de malware tout ça tout ça, prenez une bière, ça va démarrer)
Prez en franglais, déso monsql
Tout la prez est sur windows
- example avec puts avec MessageBox
- "la folle histoire de puts" (ou "on voulait de l'argent, fait taper un croc stp")
Partie 1 : Import par hash
Vous avez déjà compilé un truc?
#include <stdio.h>
#include <stdlib.h>
int main()
{
puts("Boussole ce soir !");
return EXIT_SUCCESS;
}
Vous avez déjà compilé un truc?
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
Quand on veut pas compiler avec les imports ?
Partie 1 : Import par hash
L'autre méthode du shlag
Partie 1 : Import par hash
L'autre méthode du shlag
#include <stdlib.h>
#include <Windows.h>
typedef int(WINAPI* MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);
int main()
{
HMODULE h = LoadLibraryA("kernel32.dll");
MessageBoxA messageBoxA = (MessageBoxA)GetProcAddress(h, "MessageBoxA");
messageBoxA(NULL, "Text", "Title", MB_OK);
return EXIT_SUCCESS;
}
Pas fait pour les moldus à la base :
Partie 1 : Import par hash
HMODULE h = LoadLibraryA("kernel32.dll"); <-----
Partie 1 : Import par hash
#include <stdlib.h>
#include <Windows.h>
typedef int(WINAPI* MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);
int main()
{
HMODULE h = LoadLibraryA("kernel32.dll");
MessageBoxA messageBoxA = (MessageBoxA)GetProcAddress(h, "MessageBoxA");
messageBoxA(NULL, "Text", "Title", MB_OK);
Partie 1 : Import par hash
Partie 1 : Import par hash
#include <stdlib.h>
#include <Windows.h>
int main()
{
ShellExecuteA(NULL, "open", "sc stop WinDefend", NULL, NULL, SW_RESTORE);
return EXIT_SUCCESS;
}
Partie 1 : Import par hash
#include <stdlib.h>
#include <Windows.h>
int main()
{
ShellExecuteA(NULL, "open", "sc stop WinDefend", NULL, NULL, SW_RESTORE);
return EXIT_SUCCESS;
}
#include <stdlib.h>
#include <Windows.h>
int main()
{
ShellExecuteA(NULL, "open", "sc stop WinDefend", NULL, NULL, SW_RESTORE);
return EXIT_SUCCESS;
}
Partie 1 : Import par hash
Ouais mais du coup chuis pas teuteu, je vois bien que le programme importe LoadLibrary et GetProcAddress !
Partie 1 : Import par hash
Ouais mais du coup chuis pas teuteu, je vois bien que le programme importe LoadLibrary et GetProcAddress !
Des programme légitimes utilisent exclusivement ça :
Partie 1 : Import par hash
Besoins : 1) LoadLibrary & GetProcAddress
Besoins : 1 et demie) kernel32.dll
Actions : 1) Charger en mémoire kernel32.dll
Actions : 2) Trouver LoadLibrary & GetProcAddress dans kernel32.dll
Partie 1 : Import par hash
La magie du Process Environment Block
Charger et trouver kernel32.dll
https://www.vergiliusproject.com/
La magie du Process Environment Block
Charger et trouver kernel32.dll
https://www.vergiliusproject.com/
La magie du Process Environment Block
struct _PEB_LDR_DATA
{
ULONG Length; //0x0
UCHAR Initialized; //0x4
VOID* SsHandle; //0x8
struct _LIST_ENTRY InLoadOrderModuleList; // <------ //0x10
struct _LIST_ENTRY InMemoryOrderModuleList; //0x20
struct _LIST_ENTRY InInitializationOrderModuleList; //0x30
VOID* EntryInProgress; //0x40
UCHAR ShutdownInProgress; //0x48
VOID* ShutdownThreadId; //0x50
};
Charger et trouver kernel32.dll
https://www.vergiliusproject.com/
La magie du Process Environment Block
struct _PEB_LDR_DATA
{
ULONG Length; //0x0
UCHAR Initialized; //0x4
VOID* SsHandle; //0x8
struct _LIST_ENTRY InLoadOrderModuleList; // <------ //0x10
struct _LIST_ENTRY InMemoryOrderModuleList; //0x20
struct _LIST_ENTRY InInitializationOrderModuleList; //0x30
VOID* EntryInProgress; //0x40
UCHAR ShutdownInProgress; //0x48
VOID* ShutdownThreadId; //0x50
};
Les auteurs de
malware be like :
Charger et trouver kernel32.dll
https://www.vergiliusproject.com/
Charger et trouver kernel32.dll
La magie du Process Environment Block
struct _PEB_LDR_DATA
{
...
struct _LIST_ENTRY InLoadOrderModuleList; // <------ //0x10
struct _LIST_ENTRY InMemoryOrderModuleList; //0x20
struct _LIST_ENTRY InInitializationOrderModuleList; //0x30
...
struct _LDR_DATA_TABLE_ENTRY
{
struct _LIST_ENTRY InLoadOrderLinks; //0x0
struct _LIST_ENTRY InMemoryOrderLinks; //0x10
struct _LIST_ENTRY InInitializationOrderLinks; //0x20
VOID* DllBase; // <------ //0x30
VOID* EntryPoint; //0x38
ULONG SizeOfImage; //0x40
struct _UNICODE_STRING FullDllName; //0x48
// ça s'rait'i pas c'qu'il nous faut
struct _UNICODE_STRING BaseDllName; // <------ //0x58
...
Trouver LoadLibray & GetProcAddress
Le header PE, salade, tomates, oignons
struct _LDR_DATA_TABLE_ENTRY
{
struct _LIST_ENTRY InLoadOrderLinks; //0x0
struct _LIST_ENTRY InMemoryOrderLinks; //0x10
struct _LIST_ENTRY InInitializationOrderLinks; //0x20
VOID* DllBase; // <------ //0x30
VOID* EntryPoint; //0x38
ULONG SizeOfImage; //0x40
struct _UNICODE_STRING FullDllName; //0x48
// ça s'rait'i pas c'qu'il nous faut
struct _UNICODE_STRING BaseDllName; // <------ //0x58
...
C'est quoi une DLL?
Partie 1 : Import par hash
Trouver LoadLibray & GetProcAddress
Le header PE, salade, tomates, oignons
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
Ok, mais le Process Environment Block (PEB)?
Une telle structure devrait être difficile d'accès non?
Non?
Partie 1 : Import par hash
Une telle structure devrait être difficile d'accès non?
Non?
Partie 1 : Import par hash
Les registres magiques de Windows
X86 | X64 |
---|---|
FS[0x30] | GS[0x60] |
_TEB | _TEB |
Partie 1 : Import par hash
Les registres magiques de Windows
X86 | X64 |
---|---|
FS[0x30] | GS[0x60] |
_TEB | _TEB |
struct _TEB (Thread Environment Block)
{
...
struct _PEB* ProcessEnvironmentBlock;
https://www.vergiliusproject.com/
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
Partie 1 : Import par hash
(ou "toujours plus de registres spéciaux un peu chelou")
CS
GS
ES
Pas de table de syscall en 32 bits
Voir : https://anti-reversing.com/Downloads/Anti-Reversing/The_Ultimate_Anti-Reversing_Reference.pdf
(ou "toujours plus de registres spéciaux un peu chelou")
Le registre CS, toujours plus
CS actuel : 0x23 (execution en 32 bits)
CS actuel : 0x23 (execution en 32 bits)
code_x86:
push 0x33
call $+5
; offset entre instruction actuelle et code_x64
add [esp+0x5C+var_5c]
retf
code_x64:
<junk>