首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用通俗易懂的方式讲一上dll远程注入

2012-12-17 
用通俗易懂的方式讲一下dll远程注入不要说百度一大堆, 我比较蠢, 百度里面搜到的看不懂, 当然分只给贴代码

用通俗易懂的方式讲一下dll远程注入
不要说百度一大堆, 我比较蠢, 百度里面搜到的看不懂, 当然分只给贴代码+注释的人
[最优解释]
所谓远程注入,就是为了让别的程序运行我们自己的代码,想达到此目的,必须保证我们的代码在目标程序的内存空间中。

让我们的代码进入目标程序,成为目标程序的一部分一个简单的办法就是使用DLL,因为WINDOWS自身对此提供了很好的支持,可以很方便的将代码放入到目标程序中。


将DLL注入到别的程序中,方法有很多。最常用的是使用远程线程来注入。原理是让目标程序自己加载DLL.
WINDOWS有把DLL加载到自己内存空间的函数LoadLibrary,所以只要让目标程序自己调用这个函数就可以了。

如果给别的程序下命令来执行某个函数呢,可以使用 CreateRemoteThread。

一个例子代码




//重要的地方我会标出来
BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
{


//不重要,为了获得权限
    HANDLE hToken;
    if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
    {
        TOKEN_PRIVILEGES tkp;
        
        LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
        tkp.PrivilegeCount=1;
        tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
        
    }


    HANDLE hRemoteProcess;

//不慎重要,为了获得目标进程的句柄,以此来操作目标进程
    //打开远程线程
    if( (hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD 
[其他解释]
    //允许远程创建线程
                            PROCESS_VM_OPERATION 
[其他解释]
                //允许远程VM操作
                            PROCESS_VM_WRITE,                    //允许远程VM写
                            FALSE, dwRemoteProcessId ) )== NULL )
    {
        AfxMessageBox("OpenProcess Error!");
        return FALSE;
    }

//重要1  因为是让目标进程执行某个函数,所以不论是将要执行的函数,还是用的到的资源(比如字符串)都必须在目标程序的内存空间中。此处是分配存储字符串的空间,用来存储DLL位置。

    char *pszLibFileRemote;
    //在远程进程的内存地址空间分配DLL文件名缓冲区
    pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1, 
                            MEM_COMMIT, PAGE_READWRITE);
    if(pszLibFileRemote == NULL)
    {
        AfxMessageBox("VirtualAllocEx error! ");
        return FALSE;


    }

    //将DLL的路径名复制到刚才在申请的内存中,此内存是在目标程序中的。
    if( WriteProcessMemory(hRemoteProcess,
                pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL) == 0)
    {
        AfxMessageBox("WriteProcessMemory Error");
        return FALSE;
    }

//不重要
    //计算LoadLibraryA的入口地址
    PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
            GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");

    if(pfnStartAddr == NULL)
    {
        AfxMessageBox("GetProcAddress Error");
        return FALSE;
    }


//让目标程序调用函数。
    HANDLE hRemoteThread;
    if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, 
                pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)
    {
        AfxMessageBox("CreateRemoteThread Error");
        return FALSE;
    }

    return TRUE;
}



[其他解释]
看雪上有个穿透session0的远程注入函数,就是把一个为文档化的全局变量值改了,倒是很不错~不过比如宽字符函数名窄字符函数名那些,太麻烦了

热点排行