GetModuleBaseAddress C++ To VB 6

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



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

27 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 mars 2008 à 08:25
possible.... of course.

je m'y colle
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
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... )

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

kakenette
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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
0

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

Posez votre question
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
27 mars 2008 à 22:04
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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...

après, si il est fonctionnel en C, no soucy
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
28 mars 2008 à 19:06
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
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
30 mars 2008 à 03:45
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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.

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...
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
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
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
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
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
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 ?

kakenette
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
30 mars 2008 à 16:45
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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)
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
30 mars 2008 à 19:05
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
31 mars 2008 à 07:54
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)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
31 mars 2008 à 09:36
sure de la valeur de 'RendBase' ?
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
31 mars 2008 à 18:03
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
0
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
31 mars 2008 à 18:10
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 avril 2008 à 06:20
ByVal 0& pour le dernier, normallement, si tu souhaites l'ignorer
0
Rejoignez-nous