-
-
[求助]GetProcAddress回传回来的不是我要的函数地址
-
发表于:
2019-5-13 14:00
4461
-
[求助]GetProcAddress回传回来的不是我要的函数地址
我简单的测试一下用GetProcAddress防INT 3断点
// FARPROC_0xCC.cpp : 定義主控台應用程式的進入點。
//
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
int main()
{
FARPROC addr;
(FARPROC&) addr = GetProcAddress(LoadLibrary(TEXT("USER32.dll")), "MessageBoxA");
printf("addr = %p; &addr = %p; GetProcAddress(...) = %p\n", addr, &addr, GetProcAddress(LoadLibrary(L"user32.dll"), "MessageBoxA"));
BYTE Mark = 0;
Mark = *((BYTE*)addr);
if (Mark == 0xCC)
printf("INT 3");
else
printf("nothing");
MessageBoxA(NULL, "Test", "Test", MB_OK);
getchar();
return 0;
}
在VS写完,直接执行是下面这结果(addr = 74307E60)
想当然,必定是nothing,因为我还没对MessageBoxA下断。
因此我去用OD看看,是否真的可行,先下两个指令:
1. bp MessageBoxA
2. bp GetProcAddress
第一个当然就是测试目标,而二呢,就是去看看它回传的地址长怎样。
首先先断在
GetProcAddress的地方,然后它的回传为eax = 724F30F0
且堆栈为下图,user32.dll的位址有确实地压进栈中!
这时后我就直接去看看
724F30F0是否为"MessageBoxA",结果发现
724F30F0是apphelp.dll的某位函数位址,而不是我要找的
"MessageBoxA"。
那我又直接去看
74307E60(VS写完执行的结果),结果
74307E60就是
"MessageBoxA"函数的位址。
这时我心中一堆疑惑。但还是F9继续执行OD,cmd视窗的结果
说"MessageBoxA"没有测到0xCC,但明显的是,有这结果是因为GetProcAddress回传的并不是
"MessageBoxA"的位址,而非沒有測到INT 3。
请问为什么会这样?百思不得其解
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-5-13 19:00
被wx_月⃟月⃟來⃟⃟编辑
,原因: 讓語句更通順