DaviFN Cheater
  Reputation: 0
  Joined: 23 Oct 2016 Posts: 32
 
  | 
		
			
				 Posted: Mon Oct 24, 2016 2:15 pm    Post subject: [C++] Couldn't use OP/WPM/RPM yet! (dbk32.dll, dbk32.sys...) | 
				       | 
			 
			
				
  | 
			 
			
				Hello everyone. I've a simple problem, but I couldn't solve it yet because I'm a newbie in programming. See if you can help me:
 
 
I'm creating a C++ trainer for a game. I've created a lot of trainers before, but what happened to me this time is curious: I'm not able to use WriteProcessMemory()/ReadProcessMemory. But this only happens in Windows 7. I can use WPM and RPM normally in Win XP.
 
 
So I tried to google everything, and I found something capable of editing the memory of the game I'm targetting; Cheat Engine. But normal options in Cheat Engine couldn't edit memory (Memory Viewer just had ?? on it), I had to enable a Kernel Mode routine option for WPM/RPM (whatever). Never mind. But the important thing is that, if some program can edit that memory, mine could too. So here I am, trying to simulate the same thing CE does.
 
 
In sum, what I want is to use the WPM/RPM functions like Cheat Engine does. I think I'm in the way to do that, but just need a simple help. Have a look at my 
 
 
 	  | Code: | 	 		  
 
#include <cstdio>
 
#include <windows.h>
 
#include <tlhelp32.h>
 
#include <stdio.h> 
 
#include <objidl.h> 
 
#pragma comment(lib, "user32.lib") 
 
int newdata;
 
DWORD newdatasize;
 
 
 
 
 
typedef   HANDLE   (__stdcall *OPfunc)(DWORD dwDesiredAccess,BOOL  bInheritHandle,DWORD dwProcessId); 
 
typedef   bool   (__stdcall *WPMfunc)(HANDLE  hProcess,LPVOID  lpBaseAddress,LPCVOID lpBuffer,SIZE_T  nSize,SIZE_T  *lpNumberOfBytesWritten); 
 
typedef   bool   (__stdcall *RPMfunc)(HANDLE  hProcess,LPVOID  lpBaseAddress,LPCVOID lpBuffer,SIZE_T  nSize,SIZE_T  *lpNumberOfBytesWritten); 
 
 
 
 
void enableDebugPrivileges() {  
 
    HANDLE hcurrent=GetCurrentProcess();  
 
    HANDLE hToken;  
 
    BOOL bret=OpenProcessToken(hcurrent,40,&hToken);  
 
    LUID luid;  
 
    bret=LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid);  
 
    TOKEN_PRIVILEGES NewState,PreviousState;  
 
    DWORD ReturnLength;  
 
    NewState.PrivilegeCount =1;  
 
    NewState.Privileges[0].Luid =luid;  
 
    NewState.Privileges[0].Attributes=2;  
 
    AdjustTokenPrivileges(hToken,FALSE,&NewState,28,&PreviousState,&ReturnLength);  
 
}
 
 
 
BOOL SetProcessEditPriv(LPCSTR Priv, HANDLE pHandle) 
 
{ 
 
   HANDLE hToken; 
 
   LUID luid; 
 
   TOKEN_PRIVILEGES Privs; 
 
   ZeroMemory (&Privs, sizeof(Privs)); 
 
   if (!OpenProcessToken (pHandle, (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), 
 
      &hToken)) 
 
   { 
 
      printf("No se pudieron modificar los privilegios");
 
      return FALSE; 
 
   } 
 
   if (!LookupPrivilegeValue (NULL, Priv, &luid)) 
 
   { 
 
      CloseHandle (hToken); 
 
      return FALSE; 
 
   } 
 
 
   Privs.PrivilegeCount = 1; 
 
   Privs.Privileges[0].Luid = luid; 
 
   Privs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
 
 
   BOOL retValue = AdjustTokenPrivileges(hToken, FALSE, 
 
      &Privs, sizeof(Privs),NULL,NULL); 
 
   CloseHandle(hToken); 
 
   return retValue; 
 
 
}
 
 
 
 
 
void EnableDebugPriv()
 
{
 
    HANDLE hToken;
 
    LUID luid;
 
    TOKEN_PRIVILEGES tkp;
 
 
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
 
 
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
 
 
    tkp.PrivilegeCount = 1;
 
    tkp.Privileges[0].Luid = luid;
 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
 
    AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
 
 
    CloseHandle(hToken); 
 
}
 
 
int main( int, char *[] )
 
{
 
    
 
    
 
 
 
 
unsigned long PID; // We need this now to store the PID. 
 
HANDLE hProcess; //We will use this for OpenProcess 
 
HINSTANCE hDllTrainer; 
 
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
HWND hWindow = FindWindow(NULL, "Minesweeper"); 
 
GetWindowThreadProcessId(hWindow, &PID); 
 
DWORD ToBeWritten[]={0x90}; 
 
DWORD Newdatasize = sizeof(ToBeWritten); 
 
 
hDllTrainer = LoadLibrary("dbk32.dll"); 
 
if(hDllTrainer != NULL) { 
 
 
 
   } 
 
   else if(!hDllTrainer) { 
 
   MessageBoxA(0, "Error! Couldnt Load dbk32.dll! Quiting.", "ERROR!", MB_ICONINFORMATION); 
 
} 
 
    
 
    
 
    
 
 
OPfunc OP; 
 
OP=(OPfunc)GetProcAddress(hDllTrainer,"OP"); 
 
if(OP==NULL){MessageBox(NULL,"OP = NULL","",MB_OK);}
 
WPMfunc WPM; 
 
WPM=(WPMfunc)GetProcAddress(hDllTrainer,"WPM"); 
 
if(WPM==NULL){MessageBox(NULL,"WPM = NULL","",MB_OK);}
 
RPMfunc RPM; 
 
RPM=(RPMfunc)GetProcAddress(hDllTrainer,"RPM"); 
 
if(RPM==NULL){MessageBox(NULL,"RPM = NULL","",MB_OK);}
 
    
 
    //EnableDebugPriv();
 
enableDebugPrivileges();
 
 
    PROCESSENTRY32 entry;
 
    entry.dwSize = sizeof(PROCESSENTRY32);
 
 
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
 
 
    if (Process32First(snapshot, &entry) == TRUE)
 
    {
 
        while (Process32Next(snapshot, &entry) == TRUE)
 
        {
 
            if (stricmp(entry.szExeFile, "msd.exe") == 0)
 
            {  
 
                                         //HANDLE hProcess;
 
                HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, FALSE, entry.th32ProcessID);
 
 
 
//OP(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, FALSE, entry.th32ProcessID);
 
 
 
 
 
               if(hProcess)
 
               { printf("Process was found succesfully");
 
               
 
                SetProcessEditPriv(SE_DEBUG_NAME,hProcess);
 
               
 
               VirtualProtectEx(hProcess,(LPVOID)0x0001000C,256,PAGE_EXECUTE_READWRITE, NULL); 
 
              
 
               
 
               
 
               
 
               BYTE BufferOut = 0x00; 
 
   int BufferSize = sizeof(BufferOut); 
 
   int BufferIn; 
 
   SIZE_T bWritten; 
 
   DWORD OldProtection = -1; 
 
   MEMORY_BASIC_INFORMATION mbi; 
 
             // if (!VirtualProtectEx (hProcess, (LPVOID)0x0001000C, BufferSize, PAGE_EXECUTE_READWRITE, &OldProtection)) 
 
    //  printf("\n\nNo se han podido modificar los permisos de memoria. Error %d\n\n",GetLastError());
 
               BYTE bP = 0x00;
 
               if (ReadProcessMemory(hProcess, (LPVOID)0x0001000C, &bP, sizeof(BYTE), NULL)) 
 
{printf("\n\nLeitura feita. Resposta: %d",BufferOut);}else{printf("\n\nLeitura falhou. LastError:%d",GetLastError());}
 
               
 
               
 
               newdata = 30;
 
               newdatasize = sizeof(newdata);
 
               
 
               
 
               
 
               //func(hProcess, (LPVOID)0x0001000C, &bP, sizeof(BYTE),(DWORD*)2);
 
               
 
               
 
               //WPM(hProcess, (LPVOID)0x0001000C, &bP, sizeof(BYTE),NULL);
 
               //WPM(0,0,0,0,0);
 
               
 
                  
 
                  WPM(hProcess, (LPVOID)0x0001000C, &bP, sizeof(BYTE), NULL);// << This crashes. Why?
 
               
 
               if(WriteProcessMemory(hProcess, (LPVOID)0x0001000C, &bP, sizeof(BYTE),NULL))
 
         {
 
                    printf("\n\nMemory written succesfully.\n\n");
 
               } 
 
               else{printf("Erro ao manipular memoria! Codigo do erro: %d",GetLastError());}
 
               }
 
 
 
 
 
 
                CloseHandle(hProcess);
 
            }
 
        }
 
    }
 
 
    CloseHandle(snapshot);
 
 
 
system("pause>nul");
 
 
 
    return 0;
 
}
 
 | 	  
 
 
What is this horrible code?
 
 
Well, it turns out that Cheat Engine (the 5.X versions) uses a DLL called dbk32.dll. This DLL is somehow related to the functions of that Kernel thing. It basically loads a driver (dbk32.sys) and lets the Cheat Engine use the functions of RPM/WPM and OpenProcess (OP). So I tried to use that dll and that sys in my C++ program, in order to do what CE does (and, finally, be able to edit the memory).
 
 
I was able to somehow use the OP function (OpenProcess), and it worked. But the WPM and RPM functions crash my C++ program. Why is that?
 
 
Could you help me do what I want to do? I want to use those WPM and RPM functions properly, in order to be able to edit the memory of the game. I wish I could simply use the normal WriteProcessMemory thing.
 
 
The code above is just a scratch I created from zero, and it has nothing organized in it. Just look at the part "WPM(hProcess, (LPVOID)0x0001000C, &bP, sizeof(BYTE), NULL);// << This crashes. Why?" and tell me why it crashes.
 
 
Or, if there is another way to accomplish what I want, please help me.
 
 
Thanks!
 | 
			 
		  |