Dll 代码:
#include "stdafx.h" #include <iostream> #include <Windows.h> #include <tlhelp32.h>
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBox(NULL,L"DLL_PROCESS_ATTACH",L"LYSM",NULL); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
|
注入器代码:
#include "stdafx.h" #include<stdio.h> #include<Windows.h> #include<TlHelp32.h> #include <iostream>
using namespace std;
DWORD getProcessHandle(LPCTSTR lpProcessName) { HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)}; while (Process32Next(hProcessSnap,&process)) { if(strcmp(process.szExeFile, lpProcessName) == 0){return process.th32ProcessID;} }
cout << "没有找到进程" << endl; return 0; }
int main(int argc,char *argv[]) { DWORD dwpid = getProcessHandle("Injector.exe"); LPCSTR lpDllName = "E:\\MyFiles\\Programing\\vs2012\\MyPrograms\\Test_Dll\\Debug\\Test_Dll.dll";
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwpid ); if(!hProcess){cout << "OpenProcess 失败: " << GetLastError() << endl;}
DWORD dwSize = strlen(lpDllName)+1; LPVOID lpRemoteBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
if(!WriteProcessMemory( hProcess, lpRemoteBuf, lpDllName, dwSize, NULL )) {cout << "WriteProcessMemory 失败:" << GetLastError() << endl;} HANDLE hNewRemoteThread = CreateRemoteThread( hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpRemoteBuf, NULL, NULL ); if(!hNewRemoteThread){cout << "CreateRemoteThread 失败:" << GetLastError() << endl;}
WaitForSingleObject( hNewRemoteThread, INFINITE );
CloseHandle(hNewRemoteThread);
getchar(); return 0; }
|
此处为 32 位程序,所以注入 64 位进程会失败!
64 位注入,参考
int main() { BOOL bFlag = FALSE; char *szDllName = "MSGDLL.dll"; HANDLE hDestProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ); LPTHREAD_START_ROUTINE dwAddr = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); LPVOID pRemoteSpace = VirtualAllocEx(hDestProcess, NULL, strlen(szDllName) + , MEM_COMMIT, PAGE_READWRITE); bFlag = WriteProcessMemory(hDestProcess, pRemoteSpace, szDllName, strlen(szDllName) + , ); HANDLE hThread = CreateRemoteThread(hDestProcess, NULL, , dwAddr, pRemoteSpace, NULL, ); DWORD dwErr = GetLastError(); return ; }
|
注入器
#include <Windows.h> #include <Psapi.h>
#pragma comment (lib, "Psapi.lib")
__declspec(dllexport) DWORD ExportExample(LPSTR szMsg, DWORD dwCode);
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: { CHAR lpMainMoudleName[MAX_PATH]; CHAR lpMessage[MAX_PATH + ]; DWORD dwPID = GetCurrentProcessId(); GetModuleBaseName(GetCurrentProcess(), NULL, lpMainMoudleName, MAX_PATH); wsprintf(lpMessage, "Process name: %s, PID: %u ", lpMainMoudleName, dwPID); MessageBox(NULL, lpMessage, "msg.dll", MB_OK); break; } case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; }
DWORD ExportExample(LPSTR szMsg, DWORD dwCode) { LPVOID lpShowOut = HeapAlloc(GetProcessHeap(), , lstrlen(szMsg) + ); wsprintf((LPSTR)lpShowOut, "%s,%d", szMsg, dwCode); MessageBox(NULL, (LPSTR)lpShowOut, "由导出函数弹出的消息!", MB_OK); HeapFree(GetProcessHeap(), , lpShowOut); return ; }
|
需要注意的点都在那一大串注释中
64位进程,就得用64位的EXE来CreateRemoteThread, 另外DLL也应该是64位
32位进程,就得用32位的EXE来CreateRemoteThread, 另外DLL也应该是32位
把CreateRemoteThread的入口点函数设为LoadLibraryA(W),线程的那个参数设为DLL路径指针(在目标进程中,所以得把DLL路径拷到目标进程 中, 用VirtualAllocEx在目标进程中分配块空间,然后WriteProcessMemory).
这样可行的原因:
线程的函数原型DWORD ThreadProc(LPVOID lpParam)
LoadLibrary的函数原型HMODULE LoadLibrary(LPCTSTR lpFileName);
其实是一样的,指针都是同样大小,都只有一个参数,返回值无所谓..
另外在目标进程和本进程中LoadLibraryA(W)的虚拟地址是一样的..