创建远线程相关

原创 2007年10月14日 22:44:00

LPBYTE CreateThreadFun1(LPBYTE pCode, DWORD dwCodeAdr, DWORD dwCallFunAdr, LPDWORD pFunRetVal, LPDWORD pError)
...{
    DWORD    dwFunError;
    dwFunError 
= (DWORD)&GetLastError;
    
*(DWORD *)(pCode + 0x00)    = 0x042474FF;            //push        d,[esp+04]
    *( BYTE *)(pCode + 0x04)    = 0xE8;                    //Call        *(DWORD *)(pCode + 0x05)    = dwCallFunAdr - (4+5);    //            Fun相对地址
    *(DWORD *)(pCode + 0x05)    = dwCallFunAdr - (dwCodeAdr+0x04+5);//            dwCallFunAdr相对地址
    *( BYTE *)(pCode + 0x09)    = 0xA3;                    //mov        [         ],eax
    *(DWORD *)(pCode + 0x0A)    = (DWORD)pFunRetVal;    //             FunRetVal
    *( BYTE *)(pCode + 0x0E)    = 0xE8;                    //Call
    *(DWORD *)(pCode + 0x0F)    = dwFunError -   (dwCodeAdr+0x0E+5);//            GetLastError相对地址
    *( BYTE *)(pCode + 0x13)    = 0xA3;                    //mov        [      ],eax
    *(DWORD *)(pCode + 0x14)    = (DWORD)pError;        //             pError
    *( BYTE *)(pCode + 0x18)    = 0xC2;                    //retn
    *( WORD *)(pCode + 0x19)    = 0x0004;                //            04  //一个参数返回
    *( WORD *)(pCode + 0x1B)    = 0xCC;                    //int        3
    return pCode;
}


HMODULE ProcRemtLoadDll(HANDLE hProc, 
char * pDllPath)
...{
    BYTE    Code[
0x20];    //00
    HMODULE hModule;    //20
    int        nError;        //24    //28 :pDllPath
    DWORD   dwSize = 0x20+4+4+1024, dwNedsize;
    
char *    plibstr;
    BOOL    bRet;
    Fun1    pFunLoadLib;
    HANDLE    thd_hd;
    pFunLoadLib 
= (Fun1)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryA");
    
if(pFunLoadLib == NULL)
        
return NULL;
    plibstr 
=(char *)VirtualAllocEx(hProc, 0, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    
if(plibstr == NULL)
        
return NULL;
    CreateThreadFun1(Code, (DWORD)plibstr, (DWORD)pFunLoadLib, (LPDWORD)(plibstr
+0x20), (LPDWORD)(plibstr+0x24));
    dwNedsize 
= 0x20;
    bRet 
= WriteProcessMemory(hProc, plibstr, Code, dwNedsize, &dwSize);            //复制代码
    if(bRet == FALSE || dwSize != dwNedsize )
    
...{
        VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE );
        
return NULL;
    }

    dwNedsize 
= (DWORD)strlen(pDllPath) + 1;
    bRet 
= WriteProcessMemory(hProc, plibstr+0x28, pDllPath, dwNedsize, &dwSize);    //复制参数
    if(bRet == FALSE || dwSize != dwNedsize )
    
...{
        VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE );
        
return NULL;
    }

    thd_hd 
= ::CreateRemoteThread(hProc, 00, (LPTHREAD_START_ROUTINE)plibstr, (void *)(plibstr+0x28), NULL, NULL);
    
if(thd_hd == NULL)
    
...{
        VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE);
        
return NULL;
    }

    WaitForSingleObject(thd_hd,INFINITE);
    CloseHandle(thd_hd);
    dwNedsize 
= 4;
    bRet 
= ::ReadProcessMemory(hProc, plibstr+0x20&hModule, dwNedsize, &dwSize);
    
if(bRet == FALSE || dwSize != dwNedsize )
    
...{
        VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE);
        
return NULL;
    }

    
if(hModule == NULL)
    
...{
        bRet 
= ::ReadProcessMemory(hProc, plibstr+0x24&nError , dwNedsize, &dwSize);
        
if(bRet == FALSE || dwSize != dwNedsize )
        
...{
            VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE);
            
return NULL;
        }

        ::SetLastError(nError);
    }

    bRet 
= VirtualFreeEx(hProc, plibstr, 0, MEM_RELEASE);
    
if(bRet == FALSE)
        
return NULL;
    
return hModule;
}


BOOL ProcRemtFreeDll(HANDLE hProc, HMODULE hModule)
...{
    BYTE    Code[
0x20];    //00
    BOOL    bRetVal;    //20
    int        nError;        //24    //28 :hModule
    DWORD   dwSize = 0x20+4+4, dwNedsize;
    
char *    plibstr;
    BOOL    bRet;
    Fun1    pFunFreeLib;
    HANDLE thd_hd;
    pFunFreeLib 
= (Fun1)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "FreeLibrary");
    
if(pFunFreeLib == NULL) return NULL;
    plibstr 
=(char *)VirtualAllocEx(hProc, 0, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    
if(plibstr == NULL) return NULL;
    CreateThreadFun1(Code, (DWORD)plibstr, (DWORD)pFunFreeLib, (LPDWORD)(plibstr
+0x20), (LPDWORD)(plibstr+0x24));
    dwNedsize 
= 0x20;
    bRet 
= WriteProcessMemory(hProc, plibstr, Code, dwNedsize, &dwSize);            //复制代码
    if(bRet == FALSE || dwSize != dwNedsize )    return NULL;
    thd_hd 
= ::CreateRemoteThread(hProc, 00, (LPTHREAD_START_ROUTINE)plibstr, (void *)(hModule), NULL, NULL);
    
if(thd_hd == NULL) 
    
...{
        VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE);
        
return NULL;
    }

    WaitForSingleObject(thd_hd,INFINITE);
    CloseHandle(thd_hd);
    dwNedsize 
= 4;
    bRet 
= ::ReadProcessMemory(hProc, plibstr+0x20&bRetVal, dwNedsize, &dwSize);
    
if(bRet == FALSE || dwSize != dwNedsize )
    
...{
        VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE);
        
return NULL;
    }

    
if(bRetVal == NULL)
    
...{
        bRet 
= ::ReadProcessMemory(hProc, plibstr+0x24&nError , dwNedsize, &dwSize);
        
if(bRet == FALSE || dwSize != dwNedsize )
        
...{
            VirtualFreeEx(hProc, plibstr, 
0, MEM_RELEASE);
            
return NULL;
        }

        ::SetLastError(nError);
    }

    bRet 
= VirtualFreeEx(hProc, plibstr, 0, MEM_RELEASE);
    
if(bRet == FALSE)   return NULL;
    
return bRetVal;
}



BOOL RunWithDll(
char * pRunCmd, char * pDllPath)
...{
    
char *    pCmd    = NULL;
    
char *    pCurDir = NULL;
    BOOL    bPart    
= FALSE;
    
char     szCurDir[1024];
    DWORD    dwLen;
    DWORD    i;
    
while(*pRunCmd == ' ')    pRunCmd++;
    dwLen 
= (DWORD)strlen(pRunCmd);
    
for(i=0; i<dwLen; i++)
    
...{
        
if(pRunCmd[i] == ' ' && bPart == FALSE)
        
...{
            pCmd 
= pRunCmd + i;
            
break;
        }

        
if(pRunCmd[i] == '"')
        
...{
            
if(bPart)    bPart = FALSE;
            
else        bPart = TRUE;
        }

    }

    
if(pCmd == NULL)
    
...{
        pCmd 
= pRunCmd;
    }

    
for(; i>0; i--)
    
...{
        
if(pRunCmd[i] == '/')
        
...{
            memset(szCurDir, 
0sizeof(szCurDir));
            
if(pRunCmd[0== '"')
            
...{
                strncpy(szCurDir, pRunCmd
+1, i-1);
                szCurDir[i
-1= 0;
            }

            
else
            
...{
                strncpy(szCurDir, pRunCmd  , i  );
                szCurDir[i] 
= 0;
            }

            pCurDir 
= szCurDir;
            
break;
        }

    }

//    MsgA("pCmd:%s pCurDir:%s", pCmd, pCurDir);
    PROCESS_INFORMATION ProcessInfo; 
    STARTUPINFOA StartupInfo;
    ZeroMemory(
&StartupInfo, sizeof(StartupInfo));
    StartupInfo.cb 
= sizeof(StartupInfo);        //Only compulsory field
    StartupInfo.wShowWindow = SW_SHOW;            //windows media player not show
    StartupInfo.dwFlags = STARTF_USESHOWWINDOW;        
    
if(CreateProcessA(NULL, pRunCmd, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL,
        pCurDir, 
&StartupInfo, &ProcessInfo) == FALSE)
    
...{
        
return FALSE;
    }

    
if(ProcRemtLoadDll(ProcessInfo.hProcess, pDllPath) == FALSE)
    
...{
        ::ResumeThread(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);
        
return FALSE;
    }

    ::ResumeThread(ProcessInfo.hThread);        
//CREATE_SUSPENDED  for wait the dll load done
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
    
return TRUE;
}
 

如何在远程线程中创建新的线程

 如何在远程线程中创建新的线程对待这个问题,首先要考虑一个重要因素。即远程线程已经不是原先进程中的线程,由其创建的线程,必然存在于远程线程所在的进程当中。所以应该按照对待创建远程线程这个问题一样处理。...
  • brain_
  • brain_
  • 2007-01-17 00:06:00
  • 1660

创建远程线程实现DLL注入

最近在学逆向,学到了DLL注入。DLL注入有三种方式:创建远程线程(该方法不适用于win7及以上的OS),使用注册表(APPInit_DLLs,该方法不适用于xp及以上的OS)。消息勾取(SetWin...
  • woqq773743943
  • woqq773743943
  • 2016-04-12 21:56:45
  • 1130

远程线程注入与卸载 修改版

#include //快照需要的头文件 //快照判断进程是否已经注入 BOOL InjectModuleInto(DWORD dwProcessId) { BOOL bFound = NU...
  • lunatic7
  • lunatic7
  • 2018-01-22 02:33:54
  • 66

windows 远程线程介绍

  远程线程指把当前进程部分代码注入到其他进程做为线程执行,虽然钩子程序能挂钩其他程序的消息,但钩子程序退出,注入的dll也就退出了,而远程线程不会随着本地进程退出而结束。而且可以处理更多的事情,而不...
  • delphihero
  • delphihero
  • 2005-07-17 20:50:00
  • 1286

CreateRemoteThread远程线程向其他进程注入线程

要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程 该函数的原型如下: HANDLE CreateRemoteThread(      HAND...
  • zhoujiaxq
  • zhoujiaxq
  • 2013-12-27 14:13:20
  • 2644

delphi远程线程插入(DLL注入)

delphi远程线程插入(DLL注入)2009年07月18日 星期六 01:08远程注入DLL方法有很多种,也是很多木马病毒所使用的隐藏进程的方法,因为通过程序加载的DLL在进程管理器是没有显示的.这...
  • hack_wg
  • hack_wg
  • 2009-09-21 13:48:00
  • 1781

windows-CODE注入(远程线程注入)

远程线程注入
  • u013761036
  • u013761036
  • 2016-08-14 17:25:05
  • 3067

Dll注入-远线程注入

此篇实例来自于《逆向工程核心原理》一书,与《windows核心编程》等类似书籍上的例子相差无几,但是更为简洁,因为作为了解重点代码以备用来调试相关代码使用,因此删掉了不必要的代码 先贴源代码#incl...
  • qq_20977145
  • qq_20977145
  • 2016-06-21 23:38:12
  • 2874

[GNU/Linux] Linux系统调用-线程相关(一):基本知识

线程包含的信息:每个线程中都包含有表示自身执行环境的信息,其中至少包括:标识线程的线程ID、一组寄存器的值、栈、调度优先级和策略、信号屏蔽字、errno变量和线程的私有数据。 线程函数的错误处理...
  • hepangda
  • hepangda
  • 2017-07-25 19:16:20
  • 326

vb.net远线程注入

  • 2007年08月02日 09:11
  • 34KB
  • 下载
收藏助手
不良信息举报
您举报文章:创建远线程相关
举报原因:
原因补充:

(最多只允许输入30个字)