CreateRemoteThread远程线程注入Dll与Hook

CreateRemoteThread虽然很容易被检测到,但是在有些场合还是挺有用的。每次想用的时候总想着去找以前的代码,现在在这里记录一下。

CreateRemoteThread远程注入

DWORD dwOffect,dwArgu;

BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId ,DWORD dwOffect,DWORD dwArgu)
{
    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 );//通知系统修改进程权限
        CloseHandle(hToken);
    }

    HANDLE hRemoteProcess;

    //打开远程线程
    if( (hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD |    //允许远程创建线程
        PROCESS_VM_OPERATION |                //允许远程VM操作
        PROCESS_VM_WRITE,                    //允许远程VM写
        FALSE, dwRemoteProcessId ) )== NULL )
    {
        return FALSE;
    }

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

    //将DLL的路径名复制到远程进程的内存空间
    if( WriteProcessMemory(hRemoteProcess,
        pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL) == 0)
    {
        CloseHandle(hRemoteProcess);
        return FALSE;
    }

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

    if(pfnStartAddr == NULL)
    {
        return FALSE;
    }

    HANDLE hRemoteThread;
    hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, 
        pfnStartAddr, pszLibFileRemote, 0, NULL);
    WaitForSingleObject(hRemoteThread,INFINITE);
    if( hRemoteThread == NULL)
    {

        CloseHandle(hRemoteProcess);
        return FALSE;
    }
    DWORD dwDllAddr;
    GetExitCodeThread(hRemoteThread,&dwDllAddr);
    if(dwDllAddr!=0)
    {    
        dwDllAddr += dwOffect;
        HANDLE hHookFunc;
        hHookFunc = CreateRemoteThread( hRemoteProcess, NULL, 0, 
            (PTHREAD_START_ROUTINE)dwDllAddr, (LPVOID)dwArgu, 0, NULL);
        WaitForSingleObject(hHookFunc,INFINITE);
        if( hHookFunc == NULL)
        {
            CloseHandle(hRemoteThread);
            CloseHandle(hRemoteProcess);
            return FALSE;
        }
        CloseHandle(hHookFunc);

    }
    else
    {
        CloseHandle(hRemoteProcess);
        CloseHandle(hRemoteThread);
        return FALSE;

    }
    CloseHandle(hRemoteProcess);
    CloseHandle(hRemoteThread);
    return TRUE;
}

void Hook(int dwPid)
{ 
    char curpath[260];
    GetModuleFileName(NULL,curpath,260);
    *strrchr(curpath,'\\') = '\0';
    strcat(curpath,"\\this.dll");
    HMODULE hTmpDll = LoadLibrary(curpath);
    dwOffect = (DWORD)GetProcAddress(hTmpDll,"HookFun");
    dwOffect -= (DWORD)hTmpDll;
    FreeLibrary(hTmpDll);
    CreateRemoteDll(curpath,dwPid,dwOffect,dwArgu);
}

Hook代码

__declspec(naked) void MyHookGetRes()
{
    __asm
    {
        pushad
        pushfd
    }
    MyFun();
    __asm
    {
        popfd
        popad
        add esp,0xc
        jmp uRetAddr
    }
}

ULONG uHookAddr = 0x11111  + (DWORD)hModule;
HANDLE handle = GetCurrentProcess();
char MyJMP[5]={0};
MyJMP[0]=(char)0xe9;
ULONG uTempAddr=(ULONG)MyJMP;
uRetAddr = uHookAddr + 5;
ULONG uSkillJmp=(ULONG)MyHookGetRes-uHookAddr-5;
__asm
{
    mov eax,uSkillJmp
        mov ebx, uTempAddr
        add ebx ,1
        mov [ebx],eax
        mov ecx,[ebx]
}
WriteProcessMemory(handle,(LPVOID)(uHookAddr),(LPVOID)MyJMP,5,NULL);
posted @ 2016-05-11 17:08  reyzal  阅读(964)  评论(0编辑  收藏  举报