首页
社区
课程
招聘
[原创]自己动手实现MyCreateRemoteThread
发表于: 2012-3-24 15:29 15910

[原创]自己动手实现MyCreateRemoteThread

2012-3-24 15:29
15910
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;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (13)
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
学习学习,各种技巧
2012-3-24 15:45
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
3
如果要写,也最好不要这么样 ....如果是好玩就无所谓,但可以更**一点...SetThreadContext( hThread,&ct )。。。GetThreadContext( hThread,&ct );。。。。这些都不用...
2012-3-24 16:51
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
4
真心求教,三环里如何不用Set/Get-ThreadContext 和 ZwSet/Get-ThreadContext,我想了好久也没主意。。。。。。。。

有种方式是改变eip处的指令,不过,这个在多线程环境下貌似不太好用。。。。。。。。
2012-3-24 17:08
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这样不行的,没给CSRSS发通知,这样的线程,基本做不了什么事。
2012-4-21 03:21
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
6
这个是在让进程内部自己调用CreateThread,难道进程自己调用CreateThread不会通知Csrss.exe?
2012-4-21 09:48
0
雪    币: 219
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
太强大了,只有崇拜的份.
2012-4-21 15:42
0
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
太强大了,只有膜拜的份.
2012-4-21 15:45
0
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
shellcode都上了。太强大了。
2012-4-21 15:46
0
雪    币: 615
活跃值: (590)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
学习了,好想法,好智慧。原来好的想法都是在无聊的时候才想出来的
2012-4-22 11:13
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
11
我以为啥子了,原来就是setthreadcontext注入
2012-4-22 11:20
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错的想法

谢谢分享
2012-4-22 12:11
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
用    GetThreadContext( hThread,&ct );
         orgEip = ct.Eip;
思路不错。
2012-4-28 16:37
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
14
呵呵挺有意思。
2012-4-30 10:57
0
游客
登录 | 注册 方可回帖
返回
//