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

belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 - 4 mai 2010 à 23:28
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 - 5 mai 2010 à 22:02
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

belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 00:59
En HEX le "push 22C4" = "68 C5 22"
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 01:23
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)
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 01:25
j'ai oublié le & après le 0 des deux derniers exemples.
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 01:53
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. :)

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 02:39
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
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 10:37
"ne fonctionne pas" : définition ?
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 12:50
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. :)
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 12:54
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)
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 21:24
Dim lValeur As Long
lValeur = &H22C4
WriteProcessMemory phandle, &H43517D, lValeur, ByVal 4, ByVal 0& 

Provoque, runtime error: '6' overflow lorceque le programme est lancer. >.<
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 21:37
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
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 22:01
mBytes(0) = &H68
mBytes(1) = &HC4
mBytes(2) = &H22
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
5 mai 2010 à 22:02
***Esque sa serais possible que l'ordre des byte soit. ***

mBytes(0) = &H68
mBytes(1) = &HC4
mBytes(2) = &H22
Rejoignez-nous