您的位置:首页 > 其它

自己实现CreateRemoteThread

2014-09-03 16:32 405 查看
此文章自己还没试过,只是看看,

源地址:http://bbs.pediy.com/showthread.php?t=148370

要自己实现CreateRemoteThread。原理很简单(牛们莫笑,我等菜鸟见识少,而且无聊得很,如果你们有空,可以来多陪会儿我们),就是挂起目标线程,然后把其eip指针指向我们事先设定好的代码区域(shellcode),shellcode负责在目标进程中创建线程,创建完成后,控制传回原来被我们改过eip的线程,这样,对目标进程就没有太大的影响了。描述得不是很清楚。

第一步:获取目标进程的主线程并将其挂起。

第二步:取得线程上下文,保存eip值到orgEip

第三步:通过结合orgEip创建可以正常返回的shellcode.该段代码需负责对主线程的线程上下文进行保存和恢复操作并在目标进程中创建所需的线程。

第四步:恢复目标进程中主线程的运行。



注意:该方法导致目标进程内存泄漏,我表示无奈(我也不想这样),而且对64位程序无效,原因知道一点,请大牛们指教!

有代码,有真相。至于这个有啥用,不好说,知识对于我们来说是最重要的。大家玩儿去吧。嘿嘿。

代码:
void MyCreateRemoteThread( HANDLE                   hProcess,
                           LPTHREAD_START_ROUTINE   lpThreadProc,
                           LPVOID                   lpContext)
/*

*/
{
    BOOL    bRet;
    DWORD   pid,tid,orgEip;
    HANDLE  hThread;
    PVOID   mem_base;
    CONTEXT ct;
    HMODULE hModule = GetModuleHandle( _T("kernel32.dll"));
    char    buffer[] = {
        0x60,//pushad
        0xe8,0x10,0x00,0x00,0x00,//call $ + 0x10

        0x00,0x00,0x00,0x00,    //orgEip
        0x00,0x00,0x00,0x00,    //addr of CreateThread
        0x00,0x00,0x00,0x00,    //thread_proc
        0x00,0x00,0x00,0x00,    //lpcontext

        0x5b,                   //pop ebx
        0x33,0xc0,              //xor eax,eax
        0x50,                   //push eax
        0x50,                   //push eax
        0xff,0x73,0x0c,         //push [ebx+0c]
        0xff,0x73,0x08,         //push [ebx+08]
        0x50,                   //push eax
        0x50,                   //push eax
        0x8b,0x03,              //mov eax,[ebx]
        0x89,0x5b,0x28,   //????// mov [ebx+xx],ebx
        0xff,0x53,0x04,         //call [ebx+4]
        0x61,                   //popad
        0xff,0x25,0x00,0x00,0x00,0x00};//jmp to orgEip

    pid = GetProcessId( hProcess );
    tid = FindMainThreadId( pid );

    hThread = OpenThread( THREAD_ALL_ACCESS,FALSE,tid );

    SuspendThread( hThread );

    ct.ContextFlags = CONTEXT_FULL;
    GetThreadContext( hThread,&ct );
    orgEip = ct.Eip;
    
    mem_base = VirtualAllocEx( hProcess,NULL,sizeof(buffer),MEM_COMMIT,PAGE_EXECUTE_READWRITE );
    //printf("base:%x\n",mem_base );
    *(PDWORD)(buffer + 6) = orgEip;
    *(PDWORD)(buffer + 10) = GetProcAddress( hModule,"CreateThread");
    *(PDWORD)(buffer + 14) = lpThreadProc;
    *(PDWORD)(buffer + 18) = lpContext;

    WriteProcessMemory( hProcess,mem_base,buffer,sizeof(buffer),NULL);
    ct.ContextFlags = CONTEXT_FULL;
    ct.Eip = (DWORD)mem_base;
    SetThreadContext( hThread,&ct );
    ResumeThread( hThread );
    
    CloseHandle( hThread );
    return;
}


出了点漏洞,忘记保存标志寄存器了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: