1. 原理
主要通过API:CreateRemoteThread 来进行远程线程注入
2.远程线程注入Dll的步骤
1.通过进程Id打开指定的进程 2.在指定的进程,分配一段大小为要导入的dll文件名长度的一段内存空间,将dll的文件名写入到分配的内存中。 3.获取目的进程中的loadLibrary的函数地址。 4.创建远程线程,通过上一步获得的loadlibrary函数进行dll导入。 5.释放内存,卸载dll。
3.代码远程注入注意点
1.不能调用除kernel32和user32之外动态库中的api函数。 2.不能使用static字符串 3. 去掉编译器的/GZ编译选项。这个选项是默认的,不然注入进去被注入的程序会崩溃。 4. 要么把ThreadFunc和AfterThreadFunc声明为static,要么关闭编译器的“增量连接(incremental linking)”(看附录C)。 5. ThreadFunc中的局部变量总大小必须小于4k字节。注意,当degug编译时,这4k中大约有10个字节会被事先占用。 (注入64位的程序,那么也需要64位的dll,主要用的函数:NtCreateThreadEx)
4.代码实现
//提升权限
BOOL cRemoteThreadInject::grantPriviledge(char* priName)
{
if(NULL == priName)
{
return FALSE;
}
TOKEN_PRIVILEGES tokenPriviledge, oldPriviledge;
DWORD dwRetLength = sizeof(oldPriviledge);
HANDLE tokenHandle = NULL;
LUID uId;
if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &tokenHandle))
{
if (ERROR_NO_TOKEN != GetLastError())
{
return FALSE;
}
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenHandle))
{
return FALSE;
}
}
if (!Look