Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


[C++] Couldn't use OP/WPM/RPM yet! (dbk32.dll, dbk32.sys...)

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> General programming
View previous topic :: View next topic  
Author Message
DaviFN
Cheater
Reputation: 0

Joined: 23 Oct 2016
Posts: 32

PostPosted: Mon Oct 24, 2016 2:15 pm    Post subject: [C++] Couldn't use OP/WPM/RPM yet! (dbk32.dll, dbk32.sys...) Reply with quote

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!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> General programming All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites