Program Name、Process ID、Window Handle、Process Handle 的转换函数

// Get ProcessID By ProgramName (Include Path or Not Include)
function GetPIDByProgramName(const APName: string): THandle;
// Get Window Handle By ProgramName (Include Path or Not Include)
function GetHWndByProgramName(const APName: string): THandle;
// Get Window Handle By ProcessID
function GetHWndByPID(const hPID: THandle): THandle;
// Get ProcessID By Window Handle
function GetPIDByHWnd(const hWnd: THandle): THandle;
// Get Process Handle By Window Handle
function GetProcessHndByHWnd(const hWnd: THandle): THandle;
// Get Process Handle By Process ID
function GetProcessHndByPID(const hAPID: THandle): THandle;




// Get Window Handle By ProgramName (Include Path or Not Include)
function GetHWndByProgramName(const APName: string): THandle;
begin
    Result:=GetHWndByPID(GetPIDByProgramName(APName));
end;

// Get Process Handle By Window Handle
function GetProcessHndByHWnd(const hWnd: THandle): THandle;
var
    PID: DWORD;
    AhProcess: THandle;
begin
    if hWnd<>0 then
    begin
    GetWindowThreadProcessID(hWnd, @PID);
    AhProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
    Result:=AhProcess;
    CloseHandle(AhProcess);
    end
    else
    Result:=0;
end;

// Get Process Handle By Process ID
function GetProcessHndByPID(const hAPID: THandle): THandle;
var
    AhProcess: THandle;
begin
    if hAPID<>0 then
    begin
    AhProcess := OpenProcess(PROCESS_ALL_ACCESS, false, hAPID);
    Result:=AhProcess;
    CloseHandle(AhProcess);
    end
    else
    Result:=0;
end;


// Get Window Handle By ProcessID
function GetPIDByHWnd(const hWnd: THandle): THandle;
var
    PID: DWORD;
begin
    if hWnd<>0 then
    begin
    GetWindowThreadProcessID(hWnd, @PID);
    Result:=PID;
    end
    else
    Result:=0;
end;


// Get Window Handle By ProcessID
function GetHWndByPID(const hPID: THandle): THandle;
type
    PEnumInfo = ^TEnumInfo;
    TEnumInfo = record
    ProcessID: DWORD;
    HWND: THandle;
    end;

    function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
    var
    PID: DWORD;
    begin
    GetWindowThreadProcessID(Wnd, @PID);
    Result := (PID <> EI.ProcessID) or
        (not IsWindowVisible(WND)) or
        (not IsWindowEnabled(WND));

    if not Result then EI.HWND := WND; //break on return FALSE 所以要反向檢查
    end;

    function FindMainWindow(PID: DWORD): DWORD;
    var
    EI: TEnumInfo;
    begin
    EI.ProcessID := PID;
    EI.HWND := 0;
    EnumWindows(@EnumWindowsProc, Integer(@EI));
    Result := EI.HWND;
    end;
begin
    if hPID<>0 then
    Result:=FindMainWindow(hPID)
    else
    Result:=0;
end;


// Get ProcessID By ProgramName (Include Path or Not Include)
function GetPIDByProgramName(const APName: string): THandle;
var
    isFound: boolean;
    AHandle, AhProcess: THandle;
    ProcessEntry32: TProcessEntry32;
    APath: array[0..MAX_PATH] of char;
begin
    try
    Result := 0;
    AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    ProcessEntry32.dwSize := Sizeof(ProcessEntry32);
    isFound := Process32First(AHandle, ProcessEntry32);

    while isFound do
    begin
        AhProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, ProcessEntry32.th32ProcessID);
        GetModuleFileNameEx(AhProcess, 0, @APath[0], sizeof(APath));

        if (UpperCase(StrPas(APath)) = UpperCase(APName)) or
        (UpperCase(StrPas(ProcessEntry32.szExeFile)) = UpperCase(APName)) then
        begin
        Result := ProcessEntry32.th32ProcessID;
        break;
        end;
        isFound := Process32Next(AHandle, ProcessEntry32);
        CloseHandle(AhProcess);
    end;
    finally
    CloseHandle(AHandle);
    end;
end;

`pwnlib` 是一个强大的 Python 库,常用于 CTF (Capture The Flag) 竞赛中的二进制漏洞利用开发。`process` 函数是 `pwnlib` 中用于启动一个新进程或连接到一个现有进程的一个方法。当你使用 `pwnlib` 的 `process` 函数来启动一个进程时,你可以通过参数来指定使用哪个版本的 `libc` 库,这对于漏洞利用尤为重要,因为在不同的环境中,`libc` 库的版本和地址可能会有所不同。 在使用 `pwnlib.process` 函数时,你可以通过 `libc` 参数来指定 `libc` 的路径或者使用 `pwnlib.libc` 模块的 `LibcSearcher` 来自动搜索本地系统中的 `libc` 版本。以下是一个简单的例子: ```python from pwn import * # 使用特定路径的 libc.so.6 文件 p = process('./vulnerable_program', env={'LD_PRELOAD': '/path/to/libc.so.6'}) # 或者使用 LibcSearcher 自动搜索并指定版本 libc = LibcSearcher('puts', 0xdeadbeef) # 假设 puts 的地址是 0xdeadbeef p = process('./vulnerable_program', env={'LD_PRELOAD': libc.path}) ``` 在上述代码中,`env={'LD_PRELOAD': '/path/to/libc.so.6'}` 是一个环境变量,它用于指定要预加载的 `libc` 共享库路径,这可以用来覆盖系统的 `libc` 版本,这对于确保漏洞利用的稳定性和兼容性是必要的。 使用 `pwnlib` 时需要注意的是,`LD_PRELOAD` 环境变量通常用于在程序运行时覆盖库的加载,这对于本地调试和漏洞利用开发非常有用。但在某些情况下,目标环境可能不允许修改 `LD_PRELOAD`,或者需要其他方式来指定 `libc`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值