dll简化注入
(错误请指正,谢谢了)
3步:
1,生成目标被插入的进程Dlg.exe,
2, 生成想插入的块,Inject.dll
3. 生成主线程main.exe,运行main.exe
Dll(动态链接库)是能运行所想的程序,但需要被*.exe文件加载,windows对进程的地址空间要求很严,某进程只能运行在自己的4G虚拟地址空间,不过windows的有些函数如CreateRemoteProcess(),主线程A在调用CreateRemoteProcess()时,可以往正在运行的某个进程B的4G虚拟地址空间中,创建远程线程 hThread,hThread属于主线程A,如图:
上图中的主线程为main.exe可以在已经运行的线程B,Dlg.exe 中创建远程线程 hThread,hThread属于主线程A,这可以从运行的情况得知,首先运行Dlg.exe进程,得到Dlg.exe的进程ID号,热启动3个建,调出任务管理器Taskmgr.exe,得知Dlg.exe的进程ID是4044,你的机子上可能是别的数字,要随机应变,在VC6.0下(或重开个cmd,切换下目录)运行main.exe,将Inject.dll插入Dlg.exe进程中,弹出控制台窗口下图:
和OK消息弹出对话框,这时,Dlg.exe对话框成等待状态,点确定(或关闭OK对话框),main函数返回,Press any key to continue ,Dlg.exe对话框成运行状态,不关闭DLG.exe对话框,就是pID不变的情况下,重新运行main.exe,控制台将直接返回了,而不再弹出OK对话框了, 说明在Dlg.exe的地址空间里已经有了hThread,具体的相关代码在打包文件中,Dlg.exe就是随便用vc6.0mfc创建了个对话框,不添加任何的代码,编译即可,
Inject.dll 的代码也是用vc6.0生成个动态链接库,代码如下:
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL,"dll 挂上了","OK",0);
//这里可以加入你想运行的代码,这里只是例子
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Main.exe程序的代码:
#include <iostream.h>
#include <windows.h>
BOOL Inject(DWORD dwProcessId/*进程ID*/, PCWSTR pszLibFile/*DLL路径和名称*/);
void main(void)
{
Inject(3080,L"D:\\123\\Inject1\\Debug\\Inject1.dll");
//这里的目录要变成你的具体目录,不要忘前加 L
//3080也要通过任务管理器查看,换成你的Dlg.exe进程PID号
}
BOOL Inject(DWORD dwProcessId/*进程ID*/, PCWSTR pszLibFile/*DLL路径和名称*/)
{
BOOL bOk = FALSE;
HANDLE hProcess = NULL, hThread = NULL;
PWSTR pszLibFileRemote = NULL;
__try {
// 获取目标进程的句柄
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // For WriteProcessMemory
FALSE, dwProcessId);
if (hProcess == NULL) __leave;
// 计算DLL路径的长度
int cch = 1 + lstrlenW(pszLibFile);
int cb = cch * sizeof(wchar_t);
//在远程进程为DLL的名字和路径分配内存
pszLibFileRemote = (PWSTR)
VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
if (pszLibFileRemote == NULL) __leave;
//把路径复制的远程进程的内存中
if (!WriteProcessMemory(hProcess, pszLibFileRemote,
(PVOID) pszLibFile, cb, NULL)) __leave;
//获取LoadLibraryW 在Kernel32.dll中的实际内存地址
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
if (pfnThreadRtn == NULL) __leave;
//创建远程线程
hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRtn, pszLibFileRemote, 0, NULL);
if (hThread == NULL) __leave;
// 等待线程结束
WaitForSingleObject(hThread, INFINITE);
bOk = TRUE;
}
__finally {
// 释放内存
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
}
return(bOk);
}
没什么技术含量,大牛笑笑!全当备份了!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)