GetModuleBaseAddress C++ To VB 6 [Résolu]

kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 25 mars 2008 à 20:40 - Dernière réponse : kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention
- 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…



--------
la fonction en C++
--------

DWORD GetModuleBaseAddress(DWORD iProcId, char* DLLName)
{
  HANDLE hSnap;
  MODULEENTRY32 xModule;
  hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, iProcId);
  xModule.dwSize = sizeof(MODULEENTRY32);
  if (Module32First(hSnap, &xModule))
  {
    while (Module32Next(hSnap, &xModule))
    {
        if (strcmp(xModule.szModule, DLLName) == 0)
        {
        CloseHandle(hSnap);
        return (DWORD)xModule.modBaseAddr;
        }
    }
  }
  CloseHandle(hSnap);
  return 0;
}

--------

kakenette
Afficher la suite 

Votre réponse

27 réponses

Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 26 mars 2008 à 08:37
3
Merci
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

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 119 internautes ce mois-ci

Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 26 mars 2008 à 08:25
0
Merci
possible.... of course.

je m'y colle
Commenter la réponse de Renfield
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 26 mars 2008 à 22:33
0
Merci
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... )

Je te remercie déjà énormément de ton aide.

kakenette
Commenter la réponse de kakenette
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 27 mars 2008 à 05:02
0
Merci
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
Commenter la réponse de Renfield
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 27 mars 2008 à 22:04
0
Merci
Et bien j'ai des sources en C++ de différentes actions
possibles sur un PID et j'aurai voulu les interpréter en VB...


Pour le JMP JNZ je ne comprends pas comment ça marche...

Pourquoi " \xEB " et c'est quoi ce " opcode == 0x75 " ?



------

        if( opcode == 0x75 ) {
        printf( "found opcode is JNZ, this is probably the correct address, attempting patch...\n\n" );

        if( !WriteProcessMemory( process_handle, patch_address, "\xEB", 1, 0 ) ) { //patch JNZ to JMP (unconditional)
            return_with_error( "memory could not be written\n" );
        }
      
        //verify the written byte
        ReadProcessMemory( process_handle, patch_address, &opcode, 1, 0 );
        if( opcode == 0xEB ) {
            printf( "patch successful!\n\n" );
            goto _return;
        }
        return_with_error( "memory could not be written" );
        }

------
Ce petit extrait de code, je l'ai récupéré je sais plus sur
quelle site maintenant, un site de programmation en C++


Et si j’ai bien compris, je ne peut pas writer directement un NOP ou JMP JNZ ou
du genre... il y a une genre de sélection préalable interne a faire ?

kakenette
Commenter la réponse de kakenette
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 28 mars 2008 à 08:49
0
Merci
&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...

après, si il est fonctionnel en C, no soucy
Commenter la réponse de Renfield
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 28 mars 2008 à 19:06
0
Merci
Ah je vois merci, mais maintenant sa se complique :

------
RendBase + 0x118A85
//on
FunctionText[6] = { 0x0F, 0x84, 0x5B, 0x01, 0x00, 0x00 };
//off
FunctionTextOFF[6] = { 0x0F, 0x85, 0x5B, 0x01, 0x00, 0x00 };
------

Maintenant je vois une sorte de tableau... Comment écrire ca...
J'ai la fonction :

------
Public Sub WriteToMem(Address As Long, Value As Long)
------

Ce que je peut déjà comprendre c'est que par exemple '0x0F' en VB donne '

&h0F' . . .

kakenette
Commenter la réponse de kakenette
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 30 mars 2008 à 03:45
0
Merci
WriteProcessMemory PID("test.exe"), RendBase + Hex2Dec("128B91"),
Hex2ASCII("0F 84 5B 01 00 00"), Len(Hex2ASCII("0F 84 5B 01 00 00")),
0&

Ca peux jouer ca ?

kakenette
Commenter la réponse de kakenette
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 30 mars 2008 à 04:35
0
Merci
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.

a part ce détail... je dirai:

dim sValue as string
sValue = Hex2ASCII("0F 84 5B 01 00 00")
WriteProcessMemory PID("test.exe"), RendBase + &h128B91& , sValue, Len(sValue), 0&

gaffe a avoir mis le parametre qui recoit sValue en ByVal As String dans ta déclaration d'api.

a voir aussi ce que contient "Hex2Dec" (que j'aurais appelé plutot Hex2Bin...
Commenter la réponse de Renfield
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 30 mars 2008 à 15:04
0
Merci
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
Commenter la réponse de kakenette
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 30 mars 2008 à 15:06
0
Merci
    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
Commenter la réponse de kakenette
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 30 mars 2008 à 15:55
0
Merci
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 ?

kakenette
Commenter la réponse de kakenette
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 30 mars 2008 à 16:45
0
Merci
Je croit que je peut pas écrire dans le processus, il me faut peut être un truc avec les privilèges ? ou des droits ?

kakenette
Commenter la réponse de kakenette
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 30 mars 2008 à 17:36
0
Merci
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)
Commenter la réponse de Renfield
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 30 mars 2008 à 19:05
0
Merci
Quand je fait ça, ca crash le processus :

------
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
------

Dim sPID As Long
Dim RendBase As Long
Dim sValue As String
Dim hProcess As Long

sPID = PID("Test.exe")
RendBase = GetModuleBaseAddress(sPID, "RendDX9.dll")
sValue = Hex2ASCII("0F 84 5B 01 00 00")
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, sPID)

If (hProcess <> 0) Then
WriteProcessMemory hProcess, RendBase + &H128B91, sValue, Len(sValue), 0&
End If

CloseHandle hProcess

------

Est-ce normal ?

kakenette
Commenter la réponse de kakenette
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 31 mars 2008 à 07:54
0
Merci
bien sur... tu joue avec la memoir d'un autre process, il aime pas ; c'est son droit ^^

arretes le au moins pendant ce labs de temps (SuspendThread, / ResumeThread)
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 31 mars 2008 à 09:36
0
Merci
sure de la valeur de 'RendBase' ?
Commenter la réponse de Renfield
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 31 mars 2008 à 18:03
0
Merci
En C++ c'est ca, et ca marche :(

------
BYTE Maison[6] = {0x0F, 0x84, 0x5B, 0x01, 0x00, 0x00};

RendDx9Base = GetModuleBaseAddress(pid, "RendDX9.dll");           
WriteProcessMemory(hand, (void*)(RendDx9Base + 0x128B91), &Maison,6, &bytes);
------

Quand je le fait en VB ca crash le processus

kakenette
Commenter la réponse de kakenette
kakenette 218 Messages postés dimanche 1 mai 2005Date d'inscription 15 novembre 2009 Dernière intervention - 31 mars 2008 à 18:10
0
Merci
Je pense que le problème est soit ca (Hex2ASCII) :
sValue = Hex2ASCII("0F 84 5B 01 00 00")

Soit ca :
RendBase + &H128B91

Ou encore le , 0& à la fin de la ligne WriteProcessMemory.

kakenette
Commenter la réponse de kakenette
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 1 avril 2008 à 06:20
0
Merci
ByVal 0& pour le dernier, normallement, si tu souhaites l'ignorer
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

GetModuleBaseAddress C++ To VB 6 - page 2