本文章分两部分-消化以下代码可以对DLL注入有入门效果
1.DLL代码及代码讲解
2.EXE代码及讲解
//1.DLL源码
#include <windows.h>
DWORD WINAPI Thread(LPVOID lpParam)
//定义一个线程,用来执行你需要执行的代码,好处是可以使用Sleep之类的API函数,而不会影响主进程的运行,如果把以下代码直接放在DllMain中,程序就会假死,注入效果就没有了。
{
while(true)
//无限循环用,当然你可以把true设为变量或者表达式,用来控制运行与结束
{
MessageBox(NULL,"程序运行!","温馨提示!",MB_OK);
Sleep(5000);
}
return 0;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
//只有得到 DLL_PROCESS_ATTACH 这个消息以后才能创建线程,具体什么原因我也说不清楚,此贴的目的是搭建一个可以在DLL中独立运行代码的结构
{
DWORD ThreadId;
CreateThread(NULL,NULL,Thread,NULL,NULL,&ThreadId);
//线程创建以后,上面的代码就可以被执行了
break;
}
default:break;
}
return TRUE;
}
//把以上代码编译成 NoProcessDll.dll
2.EXE源码
//上面我们建立了一个DLL,下面我们就要让DLL加载进程序的进程中。
#include <winsock2.h>
#include <stdio.h>
#include <tlhelp32.h>
#pragma comment (lib,"Advapi32.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//下面的代码作用是查找我们需要注入的进程名
DWORD pid;
HANDLE hSnapshot = NULL;
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
//建立一个进程快照,快照里面含有 进程名,PID等信息
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot,&pe);
//枚举进程快照,找出含有相应进程名的进程 PID
do
{
if(stricmp(pe.szExeFile,"notepad.exe")==0)
//这里是进行比较的地方,我们要注入的程序是 系统自带的记事本 找到进
{
pid = pe.th32ProcessID;
break;
}
}
while(Process32Next(hSnapshot,&pe)==TRUE);
CloseHandle (hSnapshot);
//清除快照
//
PWSTR pszLibFileRemote = NULL;
HANDLE hRemoteProcess = NULL,hRemoteThread = NULL;
//这里打开需要注入的进程
hRemoteProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // For WriteProcessMemory
FALSE, pid);
//**************
//星号中间的代码是为了得到我们需要注入的DLL文件的地址 NoProcessDll.dll 使我们需要注入的DLL文件 和我们的EXE文件处于同一目录下
char CurPath[256];
GetCurrentDirectory(256,CurPath);
strcat(CurPath,"\\NoProcessDll.dll");
int len = (strlen(CurPath)+1)*2;
WCHAR wCurPath[256];
MultiByteToWideChar(CP_ACP,0,CurPath,-1,wCurPath,256);
//**************
pszLibFileRemote = (PWSTR)
VirtualAllocEx(hRemoteProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);
// VirtualAllocEx 作用是在制定的进程中申请一个地方来放我们的DLL吧,我是这里理解的,VirtualAllocEx的中文解释可以在百度百科里面查到,{百度百科 http://baike.baidu.com/ } 相当于中文的MSDN ,有什么不懂得函数都可以去里面找。
WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
(PVOID) wCurPath, len, NULL);
//申请以后我们就要把DLL写入进程的内存里面去,这样进程才能调用使用DLL
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
// 检索指定的动态链接库(DLL)中的输出库函数地址。呵呵意思大概是这样,我也不大理解,但是好像只要是DLL远程注入都是用这几行代码,不理解就先放着,以后会理解的
hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0,
pfnThreadRtn, pszLibFileRemote, 0, NULL);
return 0;
}
//把以上代码生成Noexe.exe 与 NoProcessDll.dll 放在一起 然后我们启动记事本,然后运行Noexe.exe 然后记事本就会一直弹出对话框,我们的注入就成功了,你可以用360安全卫士或者其他可以查看进程模块的工具查看记事本的进程,可以在记事本的进程里面看到我们的 NoProcessDll.dll 模块
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!