易语言还原x64跨进程“GetModuleHandle+GetProcAddress”实现过程(纯内存) 第1张

调用模块:精易模块

易语言代码:

.版本 2
.支持库 spec

.程序集 程序集1

.子程序 _启动子程序, 整数型
.局部变量 h, 整数型
.局部变量 x64_k32, 长整数型

h = 进程_打开 (进程_名取ID (“explorer.exe”))
调试输出 (_GetProcAddress64 (h, “kernel32.dll”, “QueryDosDeviceA”))
x64_k32 = _GetModuleHandle64 (h, “kernel32.dll”)
调试输出 (x64_k32, _GetProcAddress64Ex (h, x64_k32, “QueryDosDeviceA”))
返回 (0)

.子程序 _GetProcAddress64Ex, 长整数型, 公开
.参数 hProcess, 整数型
.参数 hModule, 长整数型
.参数 ProcName, 文本型
.局部变量 nt, 长整数型
.局部变量 export, 长整数型
.局部变量 NumberOfNames, 整数型
.局部变量 Functions, 长整数型
.局部变量 Names, 长整数型
.局部变量 NameOrdinals, 长整数型
.局部变量 Len, 整数型
.局部变量 Name, 文本型
.局部变量 i, 整数型
.局部变量 ReadData, 字节集

.如果真 (hModule = 0)
    返回 (0)
.如果真结束
ReadData = 取空白字节集 (4)

ZwWow64ReadVirtualMemory64 (hProcess, hModule + 60, ReadData, 4, 0)
nt = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, nt + 136, ReadData, 4, 0)
export = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 24, ReadData, 4, 0)
NumberOfNames = 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 28, ReadData, 4, 0)
Functions = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 32, ReadData, 4, 0)
Names = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 36, ReadData, 4, 0)
NameOrdinals = hModule + 取字节集数据 (ReadData, #整数型, )

Len = 取文本长度 (ProcName)
Name = 取空白文本 (Len)

.计次循环首 (NumberOfNames, i)

    ZwWow64ReadVirtualMemory64 (hProcess, Names + (i - 1) × 4, ReadData, 4, 0)
    _ZwWow64ReadVirtualMemory64 (hProcess, hModule + 取字节集数据 (ReadData, #整数型, ), PtrStr (Name), Len, 0)
    .如果真 (到小写 (Name) = 到小写 (ProcName))
        ZwWow64ReadVirtualMemory64 (hProcess, NameOrdinals + (i - 1) × 2, ReadData, 2, 0)
        ZwWow64ReadVirtualMemory64 (hProcess, Functions + 取字节集数据 (ReadData, #短整数型, ) × 4, ReadData, 4, 0)
        返回 (hModule + 取字节集数据 (ReadData, #整数型, ))
    .如果真结束

.计次循环尾 ()
返回 (0)

.子程序 _GetProcAddress64, 长整数型, 公开
.参数 hProcess, 整数型
.参数 ModuleName, 文本型
.参数 ProcName, 文本型
.局部变量 hModule, 长整数型
.局部变量 nt, 长整数型
.局部变量 export, 长整数型
.局部变量 NumberOfNames, 整数型
.局部变量 Functions, 长整数型
.局部变量 Names, 长整数型
.局部变量 NameOrdinals, 长整数型
.局部变量 Len, 整数型
.局部变量 Name, 文本型
.局部变量 i, 整数型
.局部变量 ReadData, 字节集

hModule = _GetModuleHandle64 (hProcess, ModuleName)
ReadData = 取空白字节集 (4)

ZwWow64ReadVirtualMemory64 (hProcess, hModule + 60, ReadData, 4, 0)
nt = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, nt + 136, ReadData, 4, 0)
export = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 24, ReadData, 4, 0)
NumberOfNames = 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 28, ReadData, 4, 0)
Functions = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 32, ReadData, 4, 0)
Names = hModule + 取字节集数据 (ReadData, #整数型, )

ZwWow64ReadVirtualMemory64 (hProcess, export + 36, ReadData, 4, 0)
NameOrdinals = hModule + 取字节集数据 (ReadData, #整数型, )

Len = 取文本长度 (ProcName)
Name = 取空白文本 (Len)

.计次循环首 (NumberOfNames, i)

    ZwWow64ReadVirtualMemory64 (hProcess, Names + (i - 1) × 4, ReadData, 4, 0)
    _ZwWow64ReadVirtualMemory64 (hProcess, hModule + 取字节集数据 (ReadData, #整数型, ), PtrStr (Name), Len, 0)
    .如果真 (到小写 (Name) = 到小写 (ProcName))
        ZwWow64ReadVirtualMemory64 (hProcess, NameOrdinals + (i - 1) × 2, ReadData, 2, 0)
        ZwWow64ReadVirtualMemory64 (hProcess, Functions + 取字节集数据 (ReadData, #短整数型, ) × 4, ReadData, 4, 0)
        返回 (hModule + 取字节集数据 (ReadData, #整数型, ))
    .如果真结束

.计次循环尾 ()
返回 (0)

.子程序 _GetModuleHandle64, 长整数型, 公开
.参数 hProcess, 整数型
.参数 ModuleName, 文本型
.局部变量 PBI, 长整数型, , "6"
.局部变量 Ldr, 长整数型
.局部变量 ModuleHandle, 长整数型
.局部变量 pName, 长整数型
.局部变量 wName, 字节集
.局部变量 Name, 文本型
.局部变量 Len, 整数型
.局部变量 wLen, 整数型
.局部变量 ReadData, 字节集

.如果真 (ZwWow64QueryInformationProcess64 (hProcess, 0, PBI, 48, 0) = 0)
    ReadData = 取空白字节集 (8)

    ZwWow64ReadVirtualMemory64 (hProcess, PBI [2] + 24, ReadData, 8, 0)
    Ldr = 取字节集数据 (ReadData, #长整数型, )
    ZwWow64ReadVirtualMemory64 (hProcess, Ldr + 16, ReadData, 8, 0)
    Ldr = 取字节集数据 (ReadData, #长整数型, )
    ModuleHandle = -1
    Len = 取文本长度 (ModuleName)
    wLen = Len × 2
    wName = 取空白字节集 (wLen)
    Name = 取空白文本 (Len)
    .判断循环首 (ModuleHandle ≠ 0)

        ZwWow64ReadVirtualMemory64 (hProcess, Ldr + 48, ReadData, 8, 0)
        ModuleHandle = 取字节集数据 (ReadData, #长整数型, )
        .如果真 (ModuleHandle = 0)
            跳出循环 ()
        .如果真结束

        ZwWow64ReadVirtualMemory64 (hProcess, Ldr + 96, ReadData, 8, 0)
        pName = 取字节集数据 (ReadData, #长整数型, )
        _ZwWow64ReadVirtualMemory64 (hProcess, pName, PtrBin (wName), wLen, 0)
        WideCharToMultiByteX (0, 0, wName, wLen, Name, Len, 0, 0)

        .如果真 (到小写 (Name) = 到小写 (ModuleName))
            返回 (ModuleHandle)
        .如果真结束

        ZwWow64ReadVirtualMemory64 (hProcess, Ldr, ReadData, 8, 0)
        Ldr = 取字节集数据 (ReadData, #长整数型, )
    .判断循环尾 ()
.如果真结束
返回 (0)

.子程序 PtrStr, 整数型
.参数 Str, 文本型

置入代码 ({ 49, 192, 139, 69, 8, 133, 192, 116, 2, 139, 0, 137, 236, 93, 194, 4, 0 })
返回 (0)

.子程序 PtrBin, 整数型
.参数 Bin, 字节集

置入代码 ({ 139, 69, 8, 139, 0, 133, 192, 116, 3, 131, 192, 8, 137, 236, 93, 194, 4, 0 })
返回 (0)

.版本 2

.DLL命令 OpenProcess, 整数型, "kernel32.dll", "OpenProcess"
    .参数 进程对象, 整数型
    .参数 继承句柄, 整数型
    .参数 进程标识符, 整数型

来源:精易论坛