Modification mémoire d'un autre process
Page 1 sur 1
Modification mémoire d'un autre process
Voici un petit programme qui permet d'afficher ( et de modifier) les informations d'un autre programme en cours d'exécution. Il affiche aussi dans la console diverses informations concernant les modules du programme.
Si nous connaissons les adresses exactes des données manipulées par l'autre programme, nous pouvons donc les modifier pendant l’exécution (intéressant pour certains jeux pour augmenter notre nombre de vies !!).
A partir du nom de la fenêtre et de sa classe, notre programme la recherche grâce à la fonction FindWindowA. S'il ne la trouve pas, le programme se termine sinon il recherche l'identifiant du process associé (PID) par la fonction GetWindowThreadProcessId.
Avec cet identifiant nous recherchons le handle du process par la fonction OpenProcess ce qui nous permet de lire une zone mémoire par la fonction ReadProcessMemory. Et nous pouvons modifier une zone avec la fonction WriteProcessMemory. Pour ces 2 fonctions nous devons indiquer l'adresse de début de zone, le nombre d'octets à lire ou à écrire et soit l'adresse d'un buffer pour la lecture soit la zone contenant la modification pour l'écriture. Remarque : pour l’écriture le handle doit être ouvert avec le paramètre PROCESS_VM_WRITE.
En fin, le programme utilise la fonction CreateToolhelp32Snapshot pour créer une image des informations du process. Les informations du module principal sont récupérées par la fonction Module32First dans une structure du type MODULEENTRY32. Ici nous n'affichons que le nom du module, l'adresse de base et le chemin de l’exécutable. Les informations sur les autres modules peuvent être récupérées par la fonction Module32Next.
Si nous connaissons les adresses exactes des données manipulées par l'autre programme, nous pouvons donc les modifier pendant l’exécution (intéressant pour certains jeux pour augmenter notre nombre de vies !!).
A partir du nom de la fenêtre et de sa classe, notre programme la recherche grâce à la fonction FindWindowA. S'il ne la trouve pas, le programme se termine sinon il recherche l'identifiant du process associé (PID) par la fonction GetWindowThreadProcessId.
Avec cet identifiant nous recherchons le handle du process par la fonction OpenProcess ce qui nous permet de lire une zone mémoire par la fonction ReadProcessMemory. Et nous pouvons modifier une zone avec la fonction WriteProcessMemory. Pour ces 2 fonctions nous devons indiquer l'adresse de début de zone, le nombre d'octets à lire ou à écrire et soit l'adresse d'un buffer pour la lecture soit la zone contenant la modification pour l'écriture. Remarque : pour l’écriture le handle doit être ouvert avec le paramètre PROCESS_VM_WRITE.
En fin, le programme utilise la fonction CreateToolhelp32Snapshot pour créer une image des informations du process. Les informations du module principal sont récupérées par la fonction Module32First dans une structure du type MODULEENTRY32. Ici nous n'affichons que le nom du module, l'adresse de base et le chemin de l’exécutable. Les informations sur les autres modules peuvent être récupérées par la fonction Module32Next.
- Code:
;---programme 64 bits
; ce programme est extrait des exemples du site d'ICZELION
; à l'origine écrit pour 32 bits et compilateur MASM
; réecrit en 64 bits pour le compilateur Nasm par Paul DURELIN
; à partir du nom d'une fenêtre et de sa classe, ce programme affiche
; une zone de la mémoire du programme en exécution qui gére cette fenêtre.
; et il peut modifier une zone de la mémoire
; en fin il donne des informations sur le module principal du programme
; Mais à quoi peut_il servir ?
; par exemple lors de l'exiecution d'un jeu , il permet de s'attribuer des vies supplementaires
; ou des crédits ou des ressources !!! Mais évidement il faut connaitre le nom de la fenêtre (facile )
; sa classe (plus difficile à trouver) et l'adresse de la zone mémoire à modifier (pas évident à trouver)
; affichage dans la console
;==========================================================
; Constantes
;==========================================================
%include "../windowsinc64.inc"
TH32CS_SNAPMODULE equ 0x00000008
POSMEMOIRE equ 403155h ; pour afficher et modifier la zone mémoire de l'autre programme
INBOCTETS equ 100 ; nombre d'octets à lire
;=======================================
; segment des données initialisées
;=======================================
segment .data
;code page 850 é=82h à=85h è=8Ah ê=88h
szMessDebut db "Accueil : debut du programme",10,13
db "voir site ICZELION ",10,13,0
szMessFin db 10,13,"Fin du programme.",0
;szRetourLigne db 10,13,0
szMessNonTrouve db "Fen",88H,"tre non trouv",82h,"e",10,13,0
szMessOK db "Modification m",82h,"moire OK ! ",10,13,0
szClasseFen db "Classe1",0 ; classe à rechercher
szTitreFen: db 'Fenêtre 1', 0 ; fenêtre à rechercher
szDonnees db "MODIF !! ah ah ",0 ; données de modification
INBOCTETSDON equ $ - szDonnees ; nombre d'octets à écrire
szNomModule db "Nom du module : %s",10,13,0
szBaseAdr db "Base adresse : %p",10,13,0
szChemin db "Chemin : %s",10,13,0
iPEA: align 8 ; structure des informations sur les modules
iPe32: istruc MODULEENTRY32
iend
ILGMODULEENTRY32 equ $ - iPe32
;=======================================
; segment des données non initialisées
;=======================================
segment .bss
hMain resq 1
p_hand resq 1
pid_sc resq 1
iNbOctetsLus resq 1
szResult resb 100
szBuffer resb 5000
;=======================================
; segment de code
;=======================================
segment .text
global Main
extern afferreur,affmessageP,affconsoleP,afftoutregistreP,afftoutreg8a15P,affmemoireP,affmessage,saisieClavier,vidpiles
Main:
sub rsp, 8h ; alignement de la pile avant tout appel de procédure
sub rsp,20h
;recup handle de l'instance du programme
mov rcx,NULL
call GetModuleHandleA
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov [hMain],rax
push szMessDebut
call affconsoleP
;call saisieClavier
mov rcx,szClasseFen
mov rdx,szTitreFen
call FindWindowA ; recherche du handle fenêtre
cmp eax,NULL
je .nontrouve
mov rcx,rax ; handle de la fenêtre
mov rdx,pid_sc ; pid
call GetWindowThreadProcessId ; Determine PID with Windowhandle
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov rcx,PROCESS_VM_WRITE | PROCESS_VM_OPERATION |PROCESS_VM_READ
mov rdx,0
mov r8,[pid_sc]
call OpenProcess ; recherche handle du process
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov [p_hand],rax ; on le garde dans p_hand
push __LINE__
call afftoutregistreP
;lecture memoire
add rsp,20h
sub rsp,8h
push iNbOctetsLus
sub rsp,20h
mov rcx,rax
mov rdx,POSMEMOIRE
mov r8,szBuffer
mov r9,INBOCTETS
call ReadProcessMemory ; lecture de la mémoire
add rsp,10h
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
push __LINE__
push szBuffer
push 10
call affmemoireP
;call ecriture ; à mettre si on veut modifier la memoire
call rechinfo
mov rcx,[p_hand]
call CloseHandle ; fermeture
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov rax,0
jmp .main_fin
.nontrouve:
push szMessNonTrouve
call affconsoleP
jmp .main_fin
.gestionerreurs:
call afferreur
mov rax,1
jmp .fin
.main_fin:
push szMessFin
call affconsoleP
call saisieClavier
.fin:
mov rcx,rax ; code retour
call ExitProcess ; fin du programme
;=================================================
;procedure pour le write memoire
;=================================================
ecriture:
sub rsp,8h
;add rsp,20h
sub rsp,8h
push iNbOctetsLus
sub rsp,20h
mov rcx,[p_hand]
mov rdx,POSMEMOIRE
mov r8,szDonnees
mov r9,INBOCTETSDON
call WriteProcessMemory
add rsp,10h
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
push szMessOK
call affconsoleP
mov rax,0
jmp .fin
.erreur:
call afferreur
mov rax,-1
.fin:
add rsp,28h
ret
;===================================================
; Rechercher information du process
;===================================================
rechinfo:
sub rsp,28h
mov rcx,TH32CS_SNAPMODULE
mov rdx,[pid_sc]
call CreateToolhelp32Snapshot
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
mov rbx,ILGMODULEENTRY32
push __LINE__
call afftoutregistreP
mov dword[iPe32+MODULEENTRY32.dwSize],ILGMODULEENTRY32
mov r15,rax
mov rcx,rax
mov rdx,iPe32
call Module32First
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
push __LINE__
push iPe32
push 30
call affmemoireP
;exemple utilisation wsprintfa
mov rcx,szResult
mov rdx,szNomModule
lea r8,[iPe32+MODULEENTRY32.szModule ]
call wsprintfA
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
push szResult
call affconsoleP
;
mov rcx,szResult
mov rdx,szBaseAdr
;xor rax,rax
mov r8,[iPe32+MODULEENTRY32.modBaseAddr ]
;mov dword r8,rax
call wsprintfA
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
push szResult
call affconsoleP
;
mov rcx,szResult
mov rdx,szChemin
;xor rax,rax
lea r8,[iPe32+MODULEENTRY32.szExePath ]
;mov dword r8,rax
call wsprintfA
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
push szResult
call affconsoleP
;
mov rcx,r15
mov rdx,iPe32
call Module32Next
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
push __LINE__
push iPe32
push 30
call affmemoireP
mov rcx,r15
call CloseHandle
jmp .fin
.erreur:
call afferreur
mov rax,-1
.fin:
add rsp,28h
ret
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|