Modification mémoire d'un autre process

Voir le sujet précédent Voir le sujet suivant Aller en bas

Modification mémoire d'un autre process

Message par Admin le Ven 24 Mar - 15:35

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.
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

avatar
Admin
Admin

Messages : 38
Date d'inscription : 28/11/2016

Voir le profil de l'utilisateur http://assembleur64.forumactif.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum