kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 2009
-
25 mars 2008 à 20:40
kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 2009
-
5 avril 2008 à 13:52
Bonjours, Ca fait déjà un bout de temps que je me demandait
si la fonction ci-dessous peut être convertie en VB. Je serrai très intéressée
à le faire si cela est possible, je post pas ici non plus pour me faire servir
sur un plateau la conversion donc si peut être vous auriez quelques trucs,
astuces pour m'aider sa s'errai simpa... Je n’aime pas trop me servir des
autres mais j’aurai virement voulu qu’on m’aide…
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 26 mars 2008 à 08:37
Testé, ca semble Ok.
Si tu as des questions, n'hésites pas.
------
Private Const MAX_MODULE_NAME32 As Long = 255
Private Const MAX_PATH As Long = 260
Private Const TH32CS_SNAPMODULE As Long = &H8
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule As String * MAX_MODULE_NAME32
szExeFile As String * MAX_PATH
End Type
Private Declare Function CloseHandle Lib "KERNEL32.dll" (ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Module32First Lib "KERNEL32.dll" (ByVal hSnapshot As Long, ByRef lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "KERNEL32.dll" (ByVal hSnapshot As Long, ByRef lpme As MODULEENTRY32) As Long
Private Function GetModuleBaseAddress(ByVal iProcId As Long, ByRef DLLName As String) As Long
Dim hSnap As Long
Dim xModule As MODULEENTRY32
Dim nLength As Long
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, iProcId)
xModule.dwSize = LenB(xModule)
If (Module32First(hSnap, xModule)) Then
nLength = Len(DLLName)
Do While (Module32Next(hSnap, xModule))
If (StrComp(Left$(xModule.szModule, nLength), DLLName, vbTextCompare) = 0) Then
GetModuleBaseAddress = xModule.modBaseAddr
Exit Do
End If
Loop
End If
CloseHandle hSnap
End Function
kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 20091 26 mars 2008 à 22:33
Merci beaucoup, Toi qui a l'air de t'y connaître un peut,
maintenant tu sais comment fait pour écrire un JNZ ou JMP ou encore JNZ to JMP
ou autre du genre, comment je peux faire pour convertir ça en long ? Ou comment
ça marche ? Ou c'est peut être plus compliquer que une simple conversion en
long mais en tout qua j'ai pu obtenir le code pour écrire un NOP.
------
Public Sub WriteANOP(Address As Long, Value As Byte)
Dim hwnd As Long, PID As Long, phandle As Long
PID = LastPidOpened
phandle = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
If (phandle <> 0) Then
WriteProcessMemory phandle, Address, Value, 1, 0&
End If
CloseHandle phandle
End Sub
------
Comment ca marche le système des 3 lettres... ( JNZ, NOP etc... )
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2008 à 05:02
oublie les lettres, elles ne servent qu'a nous aider a lire la chose...
NOP = &h90 (hexa 90)
... le reste a voir dans les docs intel.
tu ne pourra pourtant pas écrire 90 comme ça, faut être sur de la ou tu vas jouer (alignement, par exemple)
stoppes bien le process en face. possible aussi de jouer avec Set/GetThreadContext pour récupérer entre autres la valeur des registres.
que souhaites tu faire, au final ?
tu risques de devoir coder un brin en assembleur, et regarder le code généré par l'assembleur (masm, par exemple)
te donnera des valeurs numériques qui sont en fait des suites d'instructions
Renfield
Admin CodeS-SourceS- MVP Visual Basic
Vous n’avez pas trouvé la réponse que vous recherchez ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 28 mars 2008 à 08:49
&h75 c'est un JNZ
dans certaines conditions...
&h75 pris n'importe ou dans le code pourrait etre effectivement un JNZ, ou un morceau d'adresse, de donnée, ou un morceau d'une autre opérande. En fait, faut faire gaffe a l'alignement : un commande qui commencerait par &h75 sera bien un JNZ.
ici, on transforme un &h75 par un &hEB, transformant un JNZ (saut conditionnel, surement sur une égalité préalablement testée) en un JMP, un saut non conditionnel.
tu ne devrait pas avoir trop de difficulté à porter ce code en VB6...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 30 mars 2008 à 04:35
je vois une maladresse: tu recalcules deux fois le Hex2Ascii (2eme fois c'est pour le Len). Place le resultat dans une variable que tu utilisera ensuite.
kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 20091 30 mars 2008 à 15:04
Voici ma fonction HEX2ASCII
Function Hex2ASCII(sText As String) As String
On Error Resume Next
Dim sBuff() As String, A As Long
sBuff() = Split(sText, Space$(1))
For A = 0 To UBound(sBuff)
Hex2ASCII = Hex2ASCII & Chr$("&h" & sBuff(A))
DoEvents
Next A
End Function
kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 20091 30 mars 2008 à 15:06
Function Hex2Dec(sText As String) As Long
On Error GoTo err
Dim H As String
H = sText
Dim Tmp$
Dim lo1 As Integer, lo2 As Integer
Dim hi1 As Long, hi2 As Long
Const Hx = "&H"
Const BigShift = 65536 Const LilShift 256, Two 2
Tmp = H If UCase(Left$(H, 2)) "&H" Then Tmp Mid$(H, 3)
Tmp = Right$("0000000" & Tmp, 8)
If IsNumeric(Hx & Tmp) Then
lo1 = CInt(Hx & Right$(Tmp, Two))
hi1 = CLng(Hx & Mid$(Tmp, 5, Two))
lo2 = CInt(Hx & Mid$(Tmp, 3, Two))
hi2 = CLng(Hx & Left$(Tmp, Two))
Hex2Dec = CCur(hi2 * LilShift + lo2) * BigShift + (hi1 * LilShift) + lo1
End If
Exit Function
err:
End Function
kakenette
Messages postés218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 20091 30 mars 2008 à 15:55
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As String, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
------
Dim RendBase As Long
Dim sValue As String
Dim sPID As Long
sPID = PID("Test.exe")
sValue = Hex2ASCII("0F 84 5B 01 00 00")
RendBase = GetModuleBaseAddress(sPID, "RendDX9.dll")
WriteProcessMemory sPID, RendBase + &H128B91, sValue, Len(sValue), 0&
------
Le code ne fait aucune erreur mais ça ne marche pas. Est-je
fait une erreur ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 30 mars 2008 à 17:36
oui, c'est pas le PID qu'il te faut donner, mais un hProcess (obtenu via OpenProcess, et là, tu demande le droit d'ecriture...)
Penser à CloseHandle pour liberer le Handle
pour Hex2Dec, voir la fonction que je t'ai filé sur le Forum. (le tiens semble correct également)