|
GetProcAddressEx | 整数型 | |
|
进程句柄 | 整数型 | | | |
模块句柄 | 整数型 | | | | 函数名 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
_局部1 | 整数型 | | |
_局部2 | 整数型 | | |
_局部3 | 整数型 | | |
_局部4 | 整数型 | | |
_局部5 | 字节集 | | |
_局部6 | 整数型 | | |
_局部7 | 整数型 | | |
_局部2 =
VirtualAllocEx (进程句柄, 0,
取文本长度 (函数名
), 4096, 4
)
如果真 (_局部2 = 0
)
返回 (0
)WriteProcessMemory_字节集 (进程句柄, _局部2, 到字节集 (函数名), 取文本长度 (函数名), 0)_局部4 =
GetProcAddress (GetModuleHandleA (“Kernel32”),
“GetProcAddress”)_局部5 =
{ 184
} +
到字节集 (_局部4
) +
{ 104
} +
到字节集 (_局部2
) +
{ 104
} +
到字节集 (模块句柄
) +
{ 255, 208, 195, 144
}_局部3 =
VirtualAllocEx (进程句柄, 0,
取字节集长度 (_局部5
), 4096, 4
)
如果真 (_局部3 = 0
)
VirtualFreeEx (进程句柄, _局部2, 0, 32768
)
返回 (0
)WriteProcessMemory_字节集 (进程句柄, _局部3, _局部5, 取字节集长度 (_局部5), 0)_局部6 =
CreateRemoteThread (进程句柄, 0, 0, _局部3, 0, 0, 0
)
如果真 (_局部6 = 0
)
VirtualFreeEx (进程句柄, _局部2, 0, 32768
)
VirtualFreeEx (进程句柄, _局部3, 0, 32768
)
返回 (0
)WaitForSingleObject (_局部6, 4294967295)GetExitCodeThread (_局部6, _局部7
)VirtualFreeEx (进程句柄, _局部2, 0, 32768
)VirtualFreeEx (进程句柄, _局部3, 0, 32768
)CloseHandle (_局部6
)返回 (_局部7
)
|
GetProcAddressEx1 | 整数型 | |
|
hProcess | 整数型 | | | |
hModule | 整数型 | | | | 函数名 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
dosHeader | IMAGE_DOS_HEADER | | |
ntHeaders | IMAGE_NT_HEADERS | | |
exportDir | IMAGE_EXPORT_DIRECTORY | | |
addressOfFunctions | 整数型 | | 0 |
addressOfNames | 整数型 | | 0 |
addressOfOrdinals | 短整数型 | | 0 |
i | 整数型 | | |
nameRva | 整数型 | | |
funcName | 文本型 | | |
exportRva | 整数型 | | |
如果真 (ReadProcessMemory_dosHeader (hProcess, hModule, dosHeader, 64, 0
) =
假)
返回 (0
)
如果真 (ReadProcessMemory_ntHeaders (hProcess, hModule + dosHeader.e_lfanew, ntHeaders, 248, 0
) = 0
)
返回 (0
)
exportRva = ntHeaders.OptionalHeader.DataDirectory
[1
].VirtualAddress
如果真 (ReadProcessMemory_exportDir (hProcess, hModule + exportRva, exportDir, 40, 0
) = 0
)
调试输出 (“读取导出表失败”)
返回 (0
)
重定义数组 (addressOfFunctions, 假, exportDir.NumberOfFunctions
)重定义数组 (addressOfNames, 假, exportDir.NumberOfNames
)重定义数组 (addressOfOrdinals, 假, exportDir.NumberOfNames
) ReadProcessMemory_intarray (hProcess, hModule + exportDir.AddressOfFunctions, addressOfFunctions, exportDir.NumberOfFunctions × 4, 0
) ReadProcessMemory_intarray (hProcess, hModule + exportDir.AddressOfNames, addressOfNames, exportDir.NumberOfNames × 4, 0
) ReadProcessMemory_shortarray (hProcess, hModule + exportDir.AddressOfNameOrdinals, addressOfOrdinals, exportDir.NumberOfNames × 2, 0
)
计次循环首 (exportDir.NumberOfNames, i
)
nameRva = addressOfNames
[i
]
funcName =
取空白文本 (取文本长度 (函数名
))

如果真 (ReadProcessMemory_文本型 (hProcess, hModule + nameRva, funcName,
取文本长度 (函数名
), 0
) =
假)
调试输出 (“读取函数名失败”)
返回 (0
)

如果真 (funcName = 函数名
)
返回 (hModule + addressOfFunctions
[addressOfOrdinals
[i
] + 1
]) 

计次循环尾 ()返回 (0
)|
GetProcAddressEx2 | 整数型 | |
|
hProcess | 整数型 | | | |
hModule | 整数型 | | | | 函数名 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
dosHeader | 字节集 | | |
ntHeaders | 字节集 | | |
exportDir | 字节集 | | |
addressOfFunctions | 整数型 | | 0 |
addressOfNames | 整数型 | | 0 |
addressOfOrdinals | 短整数型 | | 0 |
i | 整数型 | | |
nameRva | 整数型 | | |
funcName | 文本型 | | |
exportRva | 整数型 | | |
numberOfNames | 整数型 | | |
addressOfFunctionsRva | 整数型 | | |
addressOfNamesRva | 整数型 | | |
addressOfOrdinalsRva | 整数型 | | |
dosHeader =
取空白字节集 (64
)
如果真 (ReadProcessMemory_Bin (hProcess, hModule, dosHeader, 64, 0
) = 0
)
返回 (0
)
如果真 (取字节集数据 (dosHeader,
#短整数型, 1
) ≠ 23117
)
调试输出 (“MZ签名错误”)
返回 (0
)
ntHeaders =
取空白字节集 (248
)
如果真 (ReadProcessMemory_Bin (hProcess, hModule +
取字节集数据 (dosHeader,
#整数型, 61
), ntHeaders, 248, 0
) = 0
)
返回 (0
)
exportRva =
取字节集数据 (ntHeaders,
#整数型, 121
) exportDir =
取空白字节集 (40
)
如果真 (ReadProcessMemory_Bin (hProcess, hModule + exportRva, exportDir, 40, 0
) = 0
)
调试输出 (“读取导出表失败”)
返回 (0
)
numberOfNames =
取字节集数据 (exportDir,
#整数型, 24 + 1
) addressOfFunctionsRva =
取字节集数据 (exportDir,
#整数型, 28 + 1
) addressOfNamesRva =
取字节集数据 (exportDir,
#整数型, 32 + 1
) addressOfOrdinalsRva =
取字节集数据 (exportDir,
#整数型, 36 + 1
)
如果真 (numberOfNames ≤ 0
)
调试输出 (“未读取到任何函数”)
返回 (0
)
重定义数组 (addressOfFunctions, 假,
取字节集数据 (exportDir,
#整数型, 20 + 1
))
重定义数组 (addressOfNames, 假, numberOfNames
)重定义数组 (addressOfOrdinals, 假, numberOfNames
) ReadProcessMemory_intarray (hProcess, hModule + addressOfFunctionsRva, addressOfFunctions,
取数组成员数 (addressOfFunctions
) × 4, 0
) ReadProcessMemory_intarray (hProcess, hModule + addressOfNamesRva, addressOfNames,
取数组成员数 (addressOfNames
) × 4, 0
) ReadProcessMemory_shortarray (hProcess, hModule + addressOfOrdinalsRva, addressOfOrdinals,
取数组成员数 (addressOfOrdinals
) × 2, 0
)
计次循环首 (numberOfNames, i
)
nameRva = addressOfNames
[i
]
funcName =
取空白文本 (取文本长度 (函数名
))

如果真 (ReadProcessMemory_文本型 (hProcess, hModule + nameRva, funcName,
取文本长度 (函数名
), 0
) =
假)
调试输出 (“读取函数名失败”)
返回 (0
)

如果真 (funcName = 函数名
)
返回 (hModule + addressOfFunctions
[addressOfOrdinals
[i
] + 1
]) 

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