[Aidez-moi S.V.P]Type mismatch.

Signaler
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
-
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
-
Bonsoir,
Je cherche a modifier cela "push 22C5" (ASM) au offset 0x43517D par "push 22C4" (ASM), je croyais qu'il fallait utiliser __asm{} (C++) mais on pas dit de plutot utiliser WriteProcessMemory, alor j'ai dessidez de faire mon programme en VB6.


'...Il y quelque chose ici
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
'...Il y quelque chose ici
Dim hwnd As Long, phandle As Long, pid As Long
hwnd = FindWindow(vbNullString, "Gunz")
GetWindowThreadProcessId hwnd, pid
phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
WriteProcessMemory phandle, &H43517D, "22C4", LenB("22C4"), 0
'...Il y quelque chose ici


J'optien une erreur a &H43517D disant "Type mismatch", je n'arrive pas a trouver mon erreur et j'aimerais bien savoir si j'utilise la bonne function.

Merci d'avance.
(J'ai non seulement chercher sur VBFRANCE mais aussi sur google et je n'arrive pas a trouver pourquoi j'ai cette erreur.)

12 réponses

Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
En HEX le "push 22C4" = "68 C5 22"
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut
La déclaration de cette API trouvée sur le net :
Private Declare Function WriteProcessMemory Lib "kernel32" ( _
        ByVal hProcess As Long, _
        ByVal lpBaseAddress As Any, _
        lpBuffer As Any, _
        ByVal nSize As Long, _
        lpNumberOfBytesWritten As Long) As Long

Le dernier paramètre doit être fourni ByRef.
Deux solutions pour passer une constante, 0 :
- Déclarer une variable Long dans laquelle tu mets 0 et que tu places dans ce paramètre :
Dim lZero As Long
lZero = 0
WriteProcessMemory phandle, &H43517D, "22C4", LenB("22C4"), lZero
- Ajouter un ByVal pour qu'il accepte cette constante + préciser le type de la constante en la faisant suivre d'un & (symbole des Long) :
WriteProcessMemory phandle, &H43517D, "22C4", LenB("22C4"), ByVal 0&

D'autre part, je ne pense pas que la chaine à insérer soit de l'UniCode mais ces 4 caractères "22C4" représentent des chiffres --> Len et pas LenB.

Idem pour lpBuffer :
WriteProcessMemory phandle, &H43517D, ByVal "22C4", LenB("22C4"), ByVal 0
bien que je ne sois pas sûr qu'on puisse passer des chaines en ByVal.
Mieux vaudrait passer un tableau de bytes plutôt qu'une chaine à longueur variable (String), l'indexation de la variable en mémoire est plus directe :
Dim mBytes(0 To 3) As Byte
mBytes(0) = &H2  ' \
mBytes(1) = &H2  ' | Faudra voir s'il ne faut 
mBytes(2) = &HC  ' | pas inverser l'ordre
mBytes(3) = &H4  ' /
WriteProcessMemory phandle, &H43517D, mBytes(0), CLng(UBound(mBytes) + 1), ByVal 0

Et pourquoi pas passer un Long de cette valeur, 22C4& ?
Ca paraîtrait plus logique.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
j'ai oublié le & après le 0 des deux derniers exemples.
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
Merci boucoup. :)

Voici le code final:
Dim hWnd As Long, phandle As Long, lZero As Long, pid As Long
Dim mBytes(0 To 3) As Byte
lZero = 0
mBytes(0) = &H2  
mBytes(1) = &H2  
mBytes(2) = &HC  
mBytes(3) = &H4  
hWnd = FindWindow(vbNullString, "Gunz")
GetWindowThreadProcessId hWnd, pid
phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
WriteProcessMemory phandle, &H43517D, mBytes(0), CLng(UBound(mBytes) + 1), 0&


Il faudra que je test l'autre du tableau mBytes mais au moin je peut compiler. :)
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
Les ordre suivant ne functione pas:
mBytes(0) = &H2
mBytes(1) = &H2
mBytes(2) = &HC
mBytes(3) = &H4

mBytes(0) = &H4
mBytes(1) = &HC
mBytes(2) = &H2
mBytes(3) = &H2

mBytes(0) = &HC
mBytes(1) = &H4
mBytes(2) = &H2
mBytes(3) = &H2

mBytes(0) = &H6
mBytes(1) = &H8
mBytes(2) = &HC
mBytes(3) = &H4
mBytes(4) = &H2
mBytes(5) = &H2
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
"ne fonctionne pas" : définition ?
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
Je change pas le push 22C5 de 0x0043517D par, push 22C4. (Verifier a l'aide de cheatengine.)

J'ai essayer avec cette function:
      Private Function WriteHex(phandle As Long, Address As Long, WordLength As Long, MyHex As String) As String
      Dim pid As Long, lngBytesRead As Long, x As Long
      Dim bufReadBuffer() As Byte
          bufReadBuffer = MyHex
          WriteProcessMemory phandle, ByVal Address, ByVal VarPtr(bufReadBuffer(0)), ByVal WordLength, lngBytesRead
      End Function


Cette fois ci, sa semble bien changer la valeur car sa fait crasher le programme donc je ne vois pas mon erreur encore une fois, mais je finir par trouver par essai-erreur.

Merci quand meme jack. :)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
et lZero ?
Soit
WriteProcessMemory phandle, &H43517D, mBytes(0), CLng(UBound(mBytes) + 1), ByVal 0&
Soit
WriteProcessMemory phandle, &H43517D, mBytes(0), CLng(UBound(mBytes) + 1), lZero

Si tu dois écrire un Long, pourquoi se compliquer la vie ?
Dim lValeur As Long
lValeur = &H22C4
WriteProcessMemory phandle, &H43517D, lValeur, ByVal 4, ByVal 0&

Manque aussi les tests de sécurité :
Après
hWnd = FindWindow(vbNullString, "Gunz")
il serait judicieux de vérifier que hWnd n'est pas nul.
Idem pour pid, phandle

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
Dim lValeur As Long
lValeur = &H22C4
WriteProcessMemory phandle, &H43517D, lValeur, ByVal 4, ByVal 0& 

Provoque, runtime error: '6' overflow lorceque le programme est lancer. >.<
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
C'est deux la n'ont aucune action.
WriteProcessMemory phandle, &H43517D, mBytes(0), CLng(UBound(mBytes) + 1), ByVal 0&
Soit
WriteProcessMemory phandle, &H43517D, mBytes(0), CLng(UBound(mBytes) + 1), lZero 


J'ai fait un test pour voir si le hWnd, le pid ou le phandle son NULL mais il semble qu'il soit bien set. :S
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
mBytes(0) = &H68
mBytes(1) = &HC4
mBytes(2) = &H22
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
***Esque sa serais possible que l'ordre des byte soit. ***

mBytes(0) = &H68
mBytes(1) = &HC4
mBytes(2) = &H22