Bonjour,
A l'époque je n'avais pas pu poster ce code sur le site Developpez car c'est du hack et ils suppriment tout topique contenant du hack. Alors je le post ici.
Il s'agit d'un peb hack en asm, que j'avais bien commenté donc ça vous aidera à comprendre pour ceux qui sont intéressé par l'asm je vous conseille le compilo Fasm (https://flatassembler.net/), mis à jour régulièrement et contenant pleins d'exemples pour les débutants.
Voilà le code:
A l'époque je n'avais pas pu poster ce code sur le site Developpez car c'est du hack et ils suppriment tout topique contenant du hack. Alors je le post ici.
Il s'agit d'un peb hack en asm, que j'avais bien commenté donc ça vous aidera à comprendre pour ceux qui sont intéressé par l'asm je vous conseille le compilo Fasm (https://flatassembler.net/), mis à jour régulièrement et contenant pleins d'exemples pour les débutants.
Voilà le code:
Code :
format PE GUI 4.0
include 'include/windows/win32a.inc'
;--------------------------------------------------
section '.flat' code readable writeable executable
;--------------------------------------------------
;TEB
virtual at 0
Tib rd 7
EnvironmentPointer dd 0
Cid rd 2
ActiveRpcInfo dd 0
ThreadLocalStoragePointer dd 0
PEB dd 0
end virtual
;PEB
virtual at 0
InheritedAddressSpace db 0
ReadImageFileExecOptions db 0
BeingDebugged db 0
Spare db 0
Mutant dd 0
ImageBaseAddress dd 0
PPEB_LDR_DATA dd 0
end virtual
;PEB_LDR_DATA
virtual at 0
Length dd 0
Initialized dd 0
SsHandle dd 0
InLoadOrderModuleList rd 2
InMemoryOrderModuleList rd 2
InInitializationOrderModuleList rd 2
end virtual
;LIST_ENTRY
virtual at 0
Flink dd 0
Blink dd 0
end virtual
;LDR_MODULE
virtual at 0
; _InLoadOrderModuleList rd 2
_InMemoryOrderModuleList rd 2
_InInitializationOrderModuleList rd 2
BaseAddress dd 0
EntryPoint dd 0
SizeOfImage dd 0
FullDllName:
.Length dw 0
.MaximumLength dw 0
.Buffer dd 0
BaseDllName:
.Length dw 0
.MaximumLength dw 0
.Buffer dd 0
Flags dd 0
LoadCount dw 0
TlsIndex dw 0
HashTableEntry rd 2
TimeDateStamp dd 0
end virtual
entry $
mov eax,[fs:PEB]
mov eax,[eax+PPEB_LDR_DATA]
mov eax,[eax+InMemoryOrderModuleList]
mov eax,[eax+Flink]
mov eax,[eax+Flink]
mov eax,[eax+BaseAddress] ;Get Module Base
mov [ModuleBase],eax
cmp word [eax],0x5A4D ;Check MZ signature
jnz exit
add eax,[eax+0x3c] ;PE addr (DosHeader.e_lfanew)
cmp dword [eax],0x4550 ;Check PE signature
jnz exit
mov eax,[eax+0x78] ;PE.ExportTable RVA addr
add eax,[ModuleBase] ;Export Directory table VA
mov ecx,[eax+0x18] ;Number Of Names RVA
mov [NumberOfNames],ecx
mov ecx,[eax+0x1c] ;Address Table RVA
mov [AddressTable],ecx
mov ecx,[eax+0x24] ;Ordinal Table RVA
mov [OrdinalTable],ecx
mov esi,[eax+0x20] ;Name Table RVA
add esi,[ModuleBase] ;Name Table VA
xor ecx,ecx
re:
lodsd ;Get First Name RVA addr
add eax,[ModuleBase] ;Convert it to VA
push esi ;Save Name Table
mov esi,eax ;Prepare For lodsb
@@:
lodsb ;Hash the name
add dl,al
xor dh,dl
rol edx,8
cmp byte [esi],0
jnz @b
cmp edx,HashGetProcAddress ;cmp Hash with function
jz @f
xor edx,edx
pop esi ;Restore Name Table
inc ecx ;Name counter
cmp ecx,[NumberOfNames] ;Compare tested function with
jnz re ;total number of name
@@:
mov eax,[OrdinalTable]
add eax,[ModuleBase]
xor edx,edx
mov dx,word [eax+ecx*2] ;Get function ordinal VA
mov eax,[AddressTable]
add eax,[ModuleBase] ;Address Table VA
mov eax,[eax+edx*4] ;EAT+EOT*4
add eax,[ModuleBase] ;Function VA
mov [GetProcAddress],eax
push FunctionName1
push [ModuleBase]
call [GetProcAddress]
push DllName
call eax
push FunctionName2
push eax
call [GetProcAddress]
push 0
push Titre
push Message
push 0
call eax
exit:
leave
ret
AddressTable dd 0
OrdinalTable dd 0
ModuleBase dd 0
NumberOfNames dd 0
HashGetProcAddress = 0x6414d1d5
GetProcAddress dd 0
FunctionName1 db 'LoadLibraryA',0
FunctionName2 db 'MessageBoxA',0
DllName db 'user32.dll',0
Titre db 'titre',0
Message db 'Message',0