远程线程注入实现自删除

核心函数:

CreateRemoteThread    创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).

#include <windows.h>

#include <Tlhelp32.h>
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"user32.lib")

BOOL EnableDebugPriv( LPCTSTR szPrivilege )
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    
    if ( !OpenProcessToken( GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
        &hToken ) )
    {
        return FALSE;
    }
    if ( !LookupPrivilegeValue( NULL, szPrivilege, &sedebugnameValue ) )
    {
        CloseHandle( hToken );
        return FALSE;
    }
    
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
    {
        CloseHandle( hToken );
        return FALSE;
    }
    
    return TRUE;
}

typedef struct sARGVDATA
{
    DWORD OpenProcessAddr ;
    DWORD WaitForSingleObjectAddr ;
    DWORD DeleteFileAddr ;
    DWORD TerminateProcessAddr ;
    char File[MAX_PATH] ;
    DWORD pid ;
} ARGVDATA ;


DWORD WINAPI func(ARGVDATA *pArgv)
{
    typedef HANDLE (__stdcall *MyOpenProcess)(DWORD,BOOL,DWORD) ;
    typedef DWORD (__stdcall *MyWaitForSingleObject)(HANDLE,DWORD) ;
    typedef BOOL (__stdcall *MyDeleteFile)(LPCSTR) ;
    typedef BOOL (__stdcall *MyTerminateProcess)(HANDLE, UINT) ;
    
    HANDLE hProc ;
    MyOpenProcess pOpenProcess ;
    MyWaitForSingleObject pWaitForSingleObject ;
    MyDeleteFile pDeleteFile ;
    MyTerminateProcess pTerminateProcess ;
    
    pOpenProcess = (MyOpenProcess)pArgv->OpenProcessAddr ;
    pWaitForSingleObject = (MyWaitForSingleObject)pArgv->WaitForSingleObjectAddr ;
    pDeleteFile = (MyDeleteFile)pArgv->DeleteFileAddr ;
    pTerminateProcess = (MyTerminateProcess)pArgv->TerminateProcessAddr ;
        
    hProc = pOpenProcess(PROCESS_ALL_ACCESS,FALSE,pArgv->pid) ;
    if (hProc!=NULL)
    {
        pTerminateProcess(hProc, 0);
        pWaitForSingleObject(hProc,INFINITE) ;
        pDeleteFile(pArgv->File) ;
    }
    else
    {
        //删除文件
        pDeleteFile(pArgv->File) ;
    }
    
    return 0 ;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    ARGVDATA argc_data ;
    ARGVDATA *p_data ;
    HANDLE hSnap ;
    HANDLE hExp ;
    HINSTANCE hKernel ;
    FARPROC p_remote_thread ;
    PROCESSENTRY32 ps ;
    BOOL bRet ;
    
    hKernel = LoadLibrary("kernel32.dll") ;
    //填写远程线程参数
    argc_data.OpenProcessAddr = (DWORD)GetProcAddress(hKernel,"OpenProcess") ;
    argc_data.WaitForSingleObjectAddr = (DWORD)GetProcAddress(hKernel,"WaitForSingleObject") ;
    argc_data.DeleteFileAddr = (DWORD)GetProcAddress(hKernel,"DeleteFileA") ;
    argc_data.TerminateProcessAddr = (DWORD)GetProcAddress(hKernel,"TerminateProcess");
    argc_data.pid = GetCurrentProcessId() ;
    GetModuleFileName(NULL,argc_data.File,MAX_PATH) ;
    
    //打开目标进程,写入远程线程参数
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;
    bRet = Process32First(hSnap,&ps) ;
    while (bRet)
    {
        if (!strcmp(ps.szExeFile,"explorer.exe"))         //要注入的进程
        {
            break ;
        }
        bRet = Process32Next(hSnap,&ps) ;
    }
    
    EnableDebugPriv("SeDebugPrivilege");

    hExp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ps.th32ProcessID) ;
    
    if (NULL==hExp)
    {
        MessageBox(0,"打开EXPLORER失败!","DEBUG",0) ;
        return -1 ;
    }
    p_data = (ARGVDATA *)VirtualAllocEx(hExp,
        NULL,
        sizeof(ARGVDATA),
        MEM_COMMIT,
        PAGE_READWRITE) ;
    if (NULL==p_data)
    {
        MessageBox(0,"给参数分配内存失败!","DEBUG",0) ;
        CloseHandle(hExp) ;
        return -1 ;
    }
    
    if (FALSE==WriteProcessMemory(hExp,p_data,&argc_data,sizeof(ARGVDATA),NULL))
    {
        MessageBox(0,"参数写入内存失败!","DEBUG",0) ;
        CloseHandle(hExp) ;
        return -1 ;
    }
    
    //写入远程线程代码
    p_remote_thread = (FARPROC)VirtualAllocEx(hExp,NULL,1024*5,MEM_COMMIT,PAGE_EXECUTE_READWRITE) ;
    
    if (NULL==p_remote_thread)
    {
        MessageBox(0,"给线程分配内存失败!","DEBUG",0) ;
        CloseHandle(hExp) ;
        return -1 ;
    }
    if (FALSE==WriteProcessMemory(hExp,p_remote_thread,(FARPROC)&func,1024*5,NULL))
    {
        MessageBox(0,"线程写入失败!","DEBUG",0) ;
        CloseHandle(hExp) ;
        return -1 ;
    }

    CreateRemoteThread(hExp,NULL,0,(LPTHREAD_START_ROUTINE)p_remote_thread,p_data,0,NULL) ;
    WaitForSingleObject(p_remote_thread,INFINITE) ;
    FreeLibrary(hKernel) ;
    CloseHandle(hExp) ;
    
    MessageBox(NULL,"远程线程自删除演示","ADH-CN",0) ;

    while (1)
    {
        Sleep(3000);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值