自己实现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位程序无效,原因知道一点,请大牛们指教!
有代码,有真相。至于这个有啥用,不好说,知识对于我们来说是最重要的。大家玩儿去吧。嘿嘿。
代码:
出了点漏洞,忘记保存标志寄存器了
源地址: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; }
出了点漏洞,忘记保存标志寄存器了
相关文章推荐
- 自己动手实现MyCreateRemoteThread
- CreateRemoteThread 远程注入代码实现
- CreateRemoteThread函数实现远程注入6部曲
- CreateRemoteThread_远程CALL调用代码实现原理。
- CreateRemoteThread的使用(转载)
- 轻松玩转CreateRemoteThread (转载
- 轻松玩转CreateRemoteThread,让你的代码长出翅膀
- 简单的CreateRemoteThread例子
- 远程线程注入与CreateRemoteThread
- bypass HIPS CreateRemoteThread Monitor
- bypass HIPS CreateRemoteThread Monitor
- 简单的CreateRemoteThread例程-初学者必看
- CreateRemoteThread简单应用
- 我的使用createremotethread控制excel右键的源程序
- CreateRemoteThread
- 在Delphi中利用CreateRemoteThread远程注入例子
- CreateRemoteThread注入DLL
- CreateRemoteThread (转)
- (转载)CreateRemoteThread (代码注入)
- 在Delphi中利用CreateRemoteThread远程注入例子