Показать сообщение отдельно

Помогите выгрузить Dll
  #5318  
Старый 17.05.2010, 17:19
agrofyl2
Познающий
Регистрация: 25.04.2008
Сообщений: 51
С нами: 9497102

Репутация: 17
По умолчанию Помогите выгрузить Dll

Здравствуйте.
У меня есть код инжекта DLL
Код:
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <shlwapi.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "shlwapi.lib")


//I could just use PROCESS_ALL_ACCESS but it's always best to use the absolute bare minimum of priveleges, so that your code works in as
//many circumstances as possible.
#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
 
BOOL WriteProcessBYTES(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpBuffer,SIZE_T nSize);
 
BOOL LoadDll(char *procName, char *dllName);
BOOL InjectDLL(DWORD ProcessID, char *dllName);
unsigned long GetTargetProcessIdFromProcname(char *procName);
 
bool IsWindowsNT()
{
   // check current version of Windows
   DWORD version = GetVersion();
   // parse return
   DWORD majorVersion = (DWORD)(LOBYTE(LOWORD(version)));
   DWORD minorVersion = (DWORD)(HIBYTE(LOWORD(version)));
   return (version < 0x80000000);
}
 
//int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
int main() {
	cout << "Hello\n";
	Sleep(2000);
	while(1) {
		cout << "\n---------------------------------------------\n";
		char process[101], dllname[101];
		cout << "Enter process name (example: hl.exe)\n";
		cin.getline(process, 100);
		cout << "Enter dll name (example: 1vs16.dll)\n";
		cin.getline(dllname, 100);
		cout << "Try inject...\n";
		cout << "Process: " << process << " dll: " << dllname << endl;
		if(IsWindowsNT()) LoadDll(process, dllname);
		else cout << "Your system does not support this method";
	}
    return 0;
}
 
 
BOOL LoadDll(char *procName, char *dllName)
{
   DWORD ProcID = 0;
 
   ProcID = GetTargetProcessIdFromProcname(procName);
   cout << "Process ID: " << ProcID << endl;
 
   if(!(InjectDLL(ProcID, dllName))) cout << "Process located, but injection failed\n";
   else cout << "Successful!\n";
 
   return true;
}
 
BOOL InjectDLL(DWORD ProcessID, char *dllName)
{
   HANDLE Proc;
   char buf[50]={0};
   LPVOID RemoteString, LoadLibAddy;
 
   if(!ProcessID)
      return false;
 
   Proc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, ProcessID);
 
   if(!Proc)
   {
      sprintf(buf, "OpenProcess() failed: %d", GetLastError());
      cout << buf << endl;
      return false;
   }
 
   LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
 
   RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(dllName), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
   WriteProcessMemory(Proc, (LPVOID)RemoteString, dllName, strlen(dllName), NULL);
        CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);   
 
   CloseHandle(Proc);
 
   return true;
}
 
unsigned long GetTargetProcessIdFromProcname(char *procName)
{
   PROCESSENTRY32 pe;
   HANDLE thSnapshot;
   BOOL retval, ProcFound = false;
 
   thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
   if(thSnapshot == INVALID_HANDLE_VALUE)
   {
     cout << "Error: unable to create toolhelp snapshot\n";
      return false;
   }
 
   pe.dwSize = sizeof(PROCESSENTRY32);
 
   retval = Process32First(thSnapshot, &pe);
 
   while(retval)
   {
      if(StrStrI(pe.szExeFile, procName) )
      {
         ProcFound = true;
         break;
      }
 
      retval    = Process32Next(thSnapshot,&pe);
      pe.dwSize = sizeof(PROCESSENTRY32);
   } 
   return pe.th32ProcessID;
}
он работает.
Вопрос - как выгрузить длл, загруженную таким образом, из процеса

Последний раз редактировалось agrofyl2; 17.05.2010 в 17:37..
 
Ответить с цитированием