天天看點

加殼學習之挂起方式建立程序

技術标簽:挂起方式建立程序  核心句柄表  安全屬性

程式工能說明:通過process.exe建立出兩個程序(run.exe ie.exe),實作通過run.exe控制ie。将run.cpp編譯後将生成的exe路徑複制process.cpp的相應位置,編譯process.cpp并運作完成整個Demo測試,觀察運作的結果。(一個cpp一個項目不要寫到一個項目内)

工具: vs 2008

*字元集:使用多位元組字元集(不用會報錯)

// process.cpp 
#include "stdafx.h"
#include <Windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
    char szBuffer[256] = {0};
    char szHandle[8] = {0};
    
    SECURITY_ATTRIBUTES ie_sa_p = {0};//
    ie_sa_p.nLength  = sizeof(ie_sa_p);
    ie_sa_p.lpSecurityDescriptor = NULL;
    ie_sa_p.bInheritHandle = TRUE;//預設為flase 設定為true則句柄表可繼承

    SECURITY_ATTRIBUTES ie_sa_t = {0};
    ie_sa_t.nLength  = sizeof(ie_sa_t);
    ie_sa_t.lpSecurityDescriptor = NULL;
    ie_sa_t.bInheritHandle = TRUE;

    STARTUPINFO ie_si = {0};
    PROCESS_INFORMATION ie_pi;
    ie_si.cb = sizeof(ie_si);

    TCHAR szCmdLine[] = TEXT("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe www.baidu.com");
    //第三與第四個屬性為安全屬性,可以簡單的了解為未設定為true時目前建立線程、程序的核心句柄表不可被繼承
    //打開IE
    CreateProcess(
        NULL,
        szCmdLine,
        &ie_sa_p,//程序安全屬性 程序表可被繼承
        &ie_sa_t,//線程安全屬性 線程表可被繼承
        FALSE,//為true時代表此程序可被繼承
        CREATE_NEW_CONSOLE,
        NULL,
        NULL,
        &ie_si,
        &ie_pi);
    
    sprintf(szHandle, "%x %x", ie_pi.hProcess, ie_pi.hThread);
    sprintf(szBuffer, TEXT("run.exe %s"), szHandle);//拼接cmdLine 将程序和線程的參數拼接到run.exe

    STARTUPINFO si = {0};
    PROCESS_INFORMATION pi = {0};
    si.cb = sizeof(si);
    //建立程序run.exe控制之前建立的ie
    CreateProcess(
        NULL,
        szBuffer,
        NULL,
        NULL,
        TRUE,
        CREATE_NEW_CONSOLE,
        NULL,
        NULL,
        &si,
        &pi);

    return 0;
}      
// run.cpp

#include "stdafx.h"
#include <Windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwProcessHandle = -1;
    DWORD dwThreadHandle = -1;
    char szBuffer[256] = {0};

    //接收指令行參數
    memcpy(szBuffer, argv[2], 8);
    sscanf(szBuffer, "%x", &dwThreadHandle);
    memcpy(szBuffer, argv[1], 8);
    sscanf(szBuffer, "%x", &dwProcessHandle);


    printf("擷取IE主線程句柄 %0x\n", dwThreadHandle);
    printf("擷取IE程序句柄 %0x\n", dwProcessHandle);

    Sleep(5000);
    //挂起主線程
    ::SuspendThread((HANDLE)dwThreadHandle);
    printf("挂起主線程 %x\n", dwThreadHandle);
    Sleep(10000);

    //恢複主線程
    ::ResumeThread((HANDLE)dwThreadHandle);
    printf("恢複主線程\n");
    Sleep(5000);

    //關閉ID程序
    ::TerminateProcess((HANDLE)dwProcessHandle, 1);
    ::WaitForSingleObject((HANDLE)dwProcessHandle, INFINITE);

    printf("ID程序已經關閉。。。。\n");
    Sleep(1000);


    return 0;
}      

                                          ---建議先了解下多線程與建立程序在學習此文章

轉載于:https://www.cnblogs.com/zheh/p/5223697.html