自己动手实现MyCreateRemoteThread
标 题: 【原创】自己动手实现MyCreateRemoteThread
作 者: hackerlzc
时 间: 2012-03-24,15:29:03
链 接: http://bbs.pediy.com/showthread.php?t=148370
自己动手实现MyCreateRemoteThread
早就有了这个想法,可是一直没有做。最近实在闲,游戏不会打,书不想看,课不想上,晚上还是老睡不着觉……今天是周六,硬是狠心,把它实现了,打发一下无聊的时间。
要自己实现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; }