首页
社区
课程
招聘
[求助]GetProcAddress回传回来的不是我要的函数地址
发表于: 2019-5-13 14:00 4461

[求助]GetProcAddress回传回来的不是我要的函数地址

2019-5-13 14:00
4461

我简单的测试一下用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_月⃟月⃟來⃟⃟编辑 ,原因: 讓語句更通順
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
https://bbs.pediy.com/thread-225555.htm
2019-5-13 16:18
0
雪    币: 1979
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
tDasm您好,我看了网址里面的内文,看到似乎是关键的解释:「高版本windows sdk中GetProcAddress被动了手脚,调用它来获取user32.dll中的某些导出函数时(e.g.MessageBoxA(W))有时会被redirect到apphelp.dll中的某个函数上,据说是为了保持进程API调用的稳定性,将原有的api调用先挂到apphelp中的某个更能处理错误的函数中进行处理后再传给user32中的原函数」
但我遇到redirect到apphelp.dll的情形只发生在用OD调适的时后,若单独执行EXE檔得到的位址是正确的,而且每次单独运行的结果都正确,但只要OD调适就会出现redirect的情况。
因为会去辨断是否为CC指令的通常是要防中断,若在OD不能生效其效用的话,不知是否OD有特别写这个功能,先到跳到其它dll,再运行过去所要的API,还是还有其它因素会造成redirect。
2019-5-13 18:48
0
雪    币: 137
活跃值: (1548)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你这是做反调试吗?
2019-5-13 18:55
0
雪    币: 1979
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
wumnkx您好,是的,我看到「加密与解密」说到能够这样辨断是否被下INT 3中断,所以自己尝试看看,但结果如文中所说的,在OD调试的时后GetProcAddress会被redirect,但单独执行时是直接Get到"MessageBoxA"的地址。不知道您有没有这问题的想法?
2019-5-13 19:06
0
雪    币: 6588
活跃值: (4032)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你是想用 商业级反调试,还是 学习?
2019-5-13 21:40
0
雪    币: 1979
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
zhatian您好,我现在还是学习阶段,所以对我来说我比较想厘清这个情况是怎么回事。为何GetProcAddress在用OD调试时会被redirect,若真会redirect,又该如何做到反调试等等
2019-5-13 23:05
0
游客
登录 | 注册 方可回帖
返回
//