创建远线程相关

原创 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;
}
 

DLL注入技术之远线程注入

玩了这么久的hack,竟然到最近玩一个QQ显IP小软件的时候才知道注入是干什么用的,惭愧惭愧。刚好看到一个论坛上有一系列简明的说dll注入的文章 特此转载 正规主题 ...
  • u010887709
  • u010887709
  • 2013年06月28日 15:36
  • 1656

创建远程线程实现DLL注入

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

远程线程注入的原理和实现方法

转载:http://blog.csdn.net/whatday/article/details/8975930 一、远程线程注入基本原理 远程线程注入——相信对Windows底层编程和系统安全熟悉...
  • heluan123132
  • heluan123132
  • 2015年06月08日 14:36
  • 5545

Dll注入-远线程注入

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

SSDT HOOK拦截远线程的创建(下)

http://nokyo.blogbus.com/logs/37850401.html   第三部分:从进程句柄获取信息   在第二部分我们使用了一个前提:可以通过进程句柄得到PID...
  • jiangqin115
  • jiangqin115
  • 2015年11月10日 14:10
  • 345

win7 64bit下远程线程注入技术(进程劫持入门技术)

http://blog.csdn.net/arvon2012/article/details/7766439本文是配合上文学习和使用的。上文中,最后,我们生成了可以hook api的dll,那么怎么把...
  • MaxWoods
  • MaxWoods
  • 2015年04月22日 14:13
  • 2415

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

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

代码注入之远程线程篇

引子           前些日子由于项目要求,在网上到处找资料,于无意中发现了 CodeProject 上的一篇很老的文章,文章标题为: Three Ways to Inject Your C...
  • qq1978366308
  • qq1978366308
  • 2016年04月10日 18:04
  • 1167

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

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

Java - 请说出与线程同步以及线程调度相关的方法。

- wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁; - sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedExcept...
  • chimomo
  • chimomo
  • 2017年10月26日 18:01
  • 256
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建远线程相关
举报原因:
原因补充:

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