进程注入的概念网上一搜一大堆,至于理解到何种程度,因人而异。底下,我用我自己的理解方式给大家讲诉下原理,有说的不对的地方还望指正哈。(开场白一大堆:-D)
注入嘛,就其字面意思就是把“什么”注入到“目标体内”,哎,举个简单例子。你生病了,去医院医生给你打针,通过“注射器(针筒嘛)”把“药”挤进你的“体内”,注意这里的三个加红的词。映射到软件上,注射器就是“打针程序”(HOOK技术那一篇文章有讲),药就是待注入“程序”(这个程序当然是你想完成某个目的的程序啦),体内就是“宿主进程”啦。
好了,原理嘛,大体如此,但具体又是如何实现的呢?就是说,医生到底是怎么把药水挤进你体内的,当然你知道,医生是用手指推注射器的把柄,那么程序又是如何实现的呢?下面讲解。
①既然想注射了,当然要打开一个“缺口”,无论什么,只有有“破绽”了才好实施破坏大计嘛,好了对于计算机中的进程,你完全可以将他视为一个房子,里面的东西嘛,太多了,比如堆栈内存啊,计数器啊,各种表啊,各种对象啊,还有大多线程啊,太多了,总之你就将其视为房子,他有一个门,一个窗户,大门嘛那是留给操作系统用的,我们嘛就从窗户进去吧,反正只要进去就好啦,虽然有点猥琐,居然爬窗户进去。
②好了,既然窗户打开了,我们就爬窗户进去吧(可别说我猥琐哦!无耐啊!),接下来干什么呢?当然是找一块地方啦,一会我们要把“我们的人”藏进来呢!至于找多大的地方,你看你的人的体积而定啦!
③嗯,一切就绪了,把“线人”送进去吧。
④似乎一切都准备好了,正所谓“万事俱备只欠东风”,东风何在?我有不是诸葛孔明,我哪知道啊!但是这边有个但是,系统DLL都是加载到虚拟内存的固定位置的,所以,我们可以根据这个特性来找一下东风的踪迹。
⑤好了,东风没借到,但我找到东风的“家庭住址”,你不来,那只好动粗了,创建一个远程线程强制把你调用起来,别怪我,我也很无耐。
⑥下面就等吧,等我们的“线人”做完该做的了,我们就来做清洁工作吧。
下面详细讲解程序中所用到的API
FindWindow()、GetWindowThreadProcessId()这两个函数就是为了获得宿主进程的ID,当然也有很多其他的办法啦,比如直接用任务管理器也能找到ID
OpenProcess()这个API就是上面 ①所说的打开进程;VirtualAllocEx()就是 ②所说的向“宿主进程”申请内存;WriteProcessMemory()就是 ③所说的把特定的“DLL模块”写进“宿主进程”; GetProcAddress()就是上面所说的找“东风”地址,当然这里的东风是指“LoadLibraryA()”, LoadLibraryA()是加载DLL文件的必备API;CreateRemoteThread()就是上面说的⑤,这个API强制在宿主进程里面新建一个进程。WaitForSingleObject()、VirtualFreeEx()、CloseHandle()就是⑥所说的等待与清理。
至于DLL,就要看你想干什么了,因为一旦这个DLL进入宿主进程,那么它就有能力去修改一切了。这篇文章主要讲解的是如何注入,一定好好理解这里的思想,而不要拘泥于具体DLL的实现,注重注入的思想。
void Inject()
{
HWND hWnd=::FindWindow(NULL,_T("Windows 任务管理器"));
DWORD dwId;
::GetWindowThreadProcessId(hWnd,&dwId);
HANDLE hProcess=::OpenProcess(PROCESS_VM_OPERATION |
PROCESS_CREATE_THREAD |PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,dwId);
DWORD dwErr=::GetLastError();
char szDll[MAX_PATH]="D:\\MyDllInject\\Debug\\GetModule.dll";
PVOIDpvoid=::VirtualAllocEx(hProcess,NULL,sizeof(szDll),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
dwErr=::GetLastError();
DWORD dwWrite;
BOOL
result=::WriteProcessMemory(hProcess,pvoid,szDll,sizeof(szDll),&dwWrite);
PROC
proc=::GetProcAddress(::GetModuleHandle(_T("kernel32.dll")),"LoadLibraryA");
HANDLEhRemote=::CreateRemoteThread(hProcess,NULL,0(LPTHREAD_START_ROUTINE)proc,pvoid,0,NULL);
::WaitForSingleObject(hRemote,INFINITE);
::VirtualFreeEx(hProcess,pvoid,sizeof(szDll),0);
::CloseHandle(hProcess);
::CloseHandle(hRemote);
}
如果你任何问题都可以联系我QQ969722243