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 


Inject DLL into process via lua script

 
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: Sat Oct 29, 2016 7:09 pm    Post subject: Inject DLL into process via lua script Reply with quote

Hello everyone!

I need a lua script that injects a DLL into a process. However, I can't use injectDLL(), because this doesn't work for the process I'm injecting a dll.

I need to use functions related to kernel, I guess.

I think the way to is kidn of this C++ way:

Code:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <tlhelp32.h>
 
typedef int (WINAPI* MsgBoxParam)(HWND, LPCSTR, LPCSTR, UINT);
using namespace std;
 
struct PARAMETERS{
          DWORD MessageBoxInj;
          char text[50];       
          char caption[25];
          int buttons;
//        HWND handle;
};
 
DWORD getPid(string procName);
int privileges();
DWORD myFunc(PARAMETERS * myparam); //(if you use Dev-C++ put static before DWORD)
DWORD Useless(); ////(if you use Dev-C++ put static before DWORD)
 
int main()
{
  privileges(); 
 
  DWORD pid = getPid("notepad.exe");
  if (pid==0) return 1; //error
 
   HANDLE p;
   p = OpenProcess(PROCESS_ALL_ACCESS,false,pid);
   if (p==NULL) return 1; //error
 
   char * mytext = "Hello by CodeCave!";
   char * mycaption = "Injection result";
 
   PARAMETERS data;   //let's fill in a PARAMETERS struct
   HMODULE user32 = LoadLibrary("User32.dll");
   data.MessageBoxInj = (DWORD)GetProcAddress(user32, "MessageBoxA");
   strcpy(data.text, mytext);
   strcpy(data.caption, mycaption);
   data.buttons = MB_OKCANCEL | MB_ICONQUESTION;
 
 
   DWORD size_myFunc = (PBYTE)Useless - (PBYTE)myFunc;  //this gets myFunc's size
 
 
   //--------now we are ready to inject
 
 
   LPVOID MyFuncAddress = VirtualAllocEx(p, NULL, size_myFunc, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 
   WriteProcessMemory(p, MyFuncAddress, (void*)myFunc,size_myFunc, NULL);
 
     
   LPVOID DataAddress = VirtualAllocEx(p,NULL,sizeof(PARAMETERS),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
 
   WriteProcessMemory(p, DataAddress, &data, sizeof(PARAMETERS), NULL);
 
   HANDLE thread = CreateRemoteThread(p, NULL, 0, (LPTHREAD_START_ROUTINE)MyFuncAddress, DataAddress, 0, NULL);
     
    if (thread!=0){
        //injection completed, not we can wait it to end and free the memory
        WaitForSingleObject(thread, INFINITE);   //this waits untill thread thread has finished
        VirtualFree(MyFuncAddress, 0, MEM_RELEASE); //free myFunc memory
        VirtualFree(DataAddress, 0, MEM_RELEASE); //free data memory
        CloseHandle(thread);
        CloseHandle(p);  //don't wait for the thread to finish, just close the handle to the process
        cout<<"Injection completed!"<<endl;
     }else{
                   cout<<"Error!"<<endl;
     }
 
     
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
DWORD getPid(string procName){
   HANDLE hsnap;
   PROCESSENTRY32 pt;
   hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   pt.dwSize = sizeof(PROCESSENTRY32);
   do{
          if(!strcmp(pt.szExeFile, procName.c_str())){
             DWORD pid = pt.th32ProcessID;
             CloseHandle(hsnap);
             return pid;
          }
   } while(Process32Next(hsnap, &pt));
   CloseHandle(hsnap);
   return 0;         
}
 
static DWORD myFunc(PARAMETERS * myparam){
             MsgBoxParam MsgBox = (MsgBoxParam)myparam->MessageBoxInj;
             int result = MsgBox(0, myparam->text, myparam->caption, myparam->buttons);
             switch(result){
                  case IDOK:
                  //your code         
                  break;           
                  case IDCANCEL:
                  //your code
                  break;
             }
             return 0;
}
 
static DWORD Useless(){ 
  return 0;
}
 
//this function is needed to get some extra privileges so your code will be able to work without conflicts with the system
int privileges(){
  HANDLE Token;
  TOKEN_PRIVILEGES tp;
  if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&Token))
  {
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        if (AdjustTokenPrivileges(Token, 0, &tp, sizeof(tp), NULL, NULL)==0){
         return 1; //FAIL
        }else{
         return 0; //SUCCESS
        }
   }     
   return 1;
}
 
//Note the use of 'static': VisualC++ in debug mode put Useless() before of myFunc() because of
//name order from Z to A, so when we try to calculate the size of my func with
//DWORD size_myFunc = (PBYTE)Useless - (PBYTE) myFunc;
//the result is negative and so when we try the injection the target app crashes.
//So to avoid any problem remember to put 'static' to those functions (adpted to your compiler)


Can someone "translate" this C++ code to lua script for me? Very Happy

Not entirely, just the parts needed to succesfully inject the DLL with lua. I mean, the memory allocation parts, the WriteProcessMemory etc.

I'm just looking for a lua script capable of injecting a dll into a process because I can't use injectDLL(), and it's not possible to modify the memory of the process normally, only using Kernel Mode (CheatEngine>Settings>Extra), so I need a lua script to inject the dll using this kernel thing somehow. Thanks.
Back to top
View user's profile Send private message
ZeroXJ4
How do I cheat?
Reputation: 0

Joined: 16 Dec 2016
Posts: 8
Location: Surfing on the Internet

PostPosted: Sat Dec 24, 2016 5:08 am    Post subject: Reply with quote

Im not Sure about what you're asking for. but its impossible for LUA Script
Back to top
View user's profile Send private message AIM Address
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