自己实现CreateRemoteThread

    此文章自己还没试过,只是看看,

   源地址: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;
}
出了点漏洞,忘记保存标志寄存器了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值