当前位置:C++技术网 > 资讯 > 趣味讲解进程注入原理

趣味讲解进程注入原理

更新时间:2015-08-16 19:11:57浏览次数:1+次


    进程注入的概念网上一搜一大堆,至于理解到何种程度,因人而异。底下,我用我自己的理解方式给大家讲诉下原理,有说的不对的地方还望指正哈。(开场白一大堆:-D

    注入嘛,就其字面意思就是把“什么”注入到“目标体内”,哎,举个简单例子。你生病了,去医院医生给你打针,通过“注射器(针筒嘛)”把“”挤进你的“体内”,注意这里的三个加红的词。映射到软件上,注射器就是“打针程序”(HOOK技术那一篇文章有讲),药就是待注入“程序”(这个程序当然是你想完成某个目的的程序啦),体内就是“宿主进程”啦。

    好了,原理嘛,大体如此,但具体又是如何实现的呢?就是说,医生到底是怎么把药水挤进你体内的,当然你知道,医生是用手指推注射器的把柄,那么程序又是如何实现的呢?下面讲解。

    ①既然想注射了,当然要打开一个“缺口”,无论什么,只有有“破绽”了才好实施破坏大计嘛,好了对于计算机中的进程,你完全可以将他视为一个房子,里面的东西嘛,太多了,比如堆栈内存啊,计数器啊,各种表啊,各种对象啊,还有大多线程啊,太多了,总之你就将其视为房子,他有一个门,一个窗户,大门嘛那是留给操作系统用的,我们嘛就从窗户进去吧,反正只要进去就好啦,虽然有点猥琐,居然爬窗户进去。

    ②好了,既然窗户打开了,我们就爬窗户进去吧(可别说我猥琐哦!无耐啊!),接下来干什么呢?当然是找一块地方啦,一会我们要把“我们的人”藏进来呢!至于找多大的地方,你看你的人的体积而定啦!

    ③嗯,一切就绪了,把“线人”送进去吧。

    ④似乎一切都准备好了,正所谓“万事俱备只欠东风”,东风何在?我有不是诸葛孔明,我哪知道啊!但是这边有个但是,系统DLL都是加载到虚拟内存的固定位置的,所以,我们可以根据这个特性来找一下东风的踪迹。

    ⑤好了,东风没借到,但我找到东风的“家庭住址”,你不来,那只好动粗了,创建一个远程线程强制把你调用起来,别怪我,我也很无耐。

   ⑥下面就等吧,等我们的“线人”做完该做的了,我们就来做清洁工作吧。

    下面详细讲解程序中所用到的API

     FindWindow()、GetWindowThreadProcessId()这两个函数就是为了获得宿主进程的ID,当然也有很多其他的办法啦,比如直接用任务管理器也能找到ID

OpenProcess()这个API就是上面 所说的打开进程;VirtualAllocEx()就是 所说的向“宿主进程”申请内存;WriteProcessMemory()就是 所说的把特定的“DLL模块”写进“宿主进程”; GetProcAddress()就是上面所说的找“东风”地址,当然这里的东风是指“LoadLibraryA(), LoadLibraryA()是加载DLL文件的必备APICreateRemoteThread()就是上面说的,这个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