文档章节

闲来无事逆了点dbghelp里的东西

hzqst
 hzqst
发布于 2017/04/20 14:25
字数 574
阅读 69
收藏 1

1、ImageNtHeader,IsBadReadPtr是我自己加的

PIMAGE_NT_HEADERS32 WINAPI ImageNtHeader(PVOID Base)
{
	PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)Base;
	if (IsBadReadPtr(pDosHdr, sizeof(IMAGE_DOS_HEADER)))
		return NULL;
	if (IMAGE_DOS_SIGNATURE != pDosHdr->e_magic)
		return NULL;

	PIMAGE_NT_HEADERS32 pNTHdr32 = (PIMAGE_NT_HEADERS32)((PBYTE)pDosHdr + pDosHdr->e_lfanew);

	if (IsBadReadPtr(pNTHdr32, sizeof(IMAGE_NT_HEADERS32)))
		return FALSE;
	if (IMAGE_NT_SIGNATURE != pNTHdr32->Signature)
		return FALSE;

	return pNTHdr32;
}

2、ImageDirectoryEntryToDataEx,没Ex的懒得弄了直接把最后一个参数填0调用Ex

PVOID ImageDirectoryEntryToData32(ULONG_PTR BaseAddress, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size, PIMAGE_SECTION_HEADER *FoundHeader, PIMAGE_FILE_HEADER pFileHdr, PIMAGE_OPTIONAL_HEADER32 pOptHdr)
{
	if (DirectoryEntry < pOptHdr->NumberOfRvaAndSizes)
	{
		ULONG_PTR Rva = pOptHdr->DataDirectory[DirectoryEntry].VirtualAddress;
		if (Rva)
		{
			*Size = pOptHdr->DataDirectory[DirectoryEntry].Size;
			if (!MappedAsImage && Rva >= pOptHdr->SizeOfHeaders)
			{
				int NumSections = pFileHdr->NumberOfSections;
				PIMAGE_SECTION_HEADER pSecHdr = (PIMAGE_SECTION_HEADER)((PUCHAR)pOptHdr + pFileHdr->SizeOfOptionalHeader);
				for (int i = 0; i < NumSections; ++i)
				{
					if (Rva >= pSecHdr->VirtualAddress && Rva < pSecHdr->SizeOfRawData + pSecHdr->VirtualAddress)
					{
						if (FoundHeader)
							*FoundHeader = pSecHdr;
						return (PVOID)(BaseAddress + (Rva - pSecHdr->VirtualAddress) + pSecHdr->PointerToRawData);
					}
					++pSecHdr;
				}
				return NULL;
			}
			if (FoundHeader)
				*FoundHeader = NULL;
			return (PVOID)(BaseAddress + Rva);
		}
	}
	*Size = 0;
	return NULL;
}

PVOID ImageDirectoryEntryToData64(ULONG_PTR BaseAddress, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size, PIMAGE_SECTION_HEADER *FoundHeader, PIMAGE_FILE_HEADER pFileHdr, PIMAGE_OPTIONAL_HEADER64 pOptHdr)
{
	if (DirectoryEntry < pOptHdr->NumberOfRvaAndSizes)
	{
		ULONG_PTR Rva = pOptHdr->DataDirectory[DirectoryEntry].VirtualAddress;
		if (Rva)
		{
			*Size = pOptHdr->DataDirectory[DirectoryEntry].Size;
			if (!MappedAsImage && Rva >= pOptHdr->SizeOfHeaders)
			{
				int NumSections = pFileHdr->NumberOfSections;
				PIMAGE_SECTION_HEADER pSecHdr = (PIMAGE_SECTION_HEADER)((PUCHAR)pOptHdr + pFileHdr->SizeOfOptionalHeader);
				for (int i = 0; i < NumSections; ++i)
				{
					if (Rva >= pSecHdr->VirtualAddress && Rva < pSecHdr->SizeOfRawData + pSecHdr->VirtualAddress)
					{
						if (FoundHeader)
							*FoundHeader = pSecHdr;
						return (PVOID)(BaseAddress + (Rva - pSecHdr->VirtualAddress) + pSecHdr->PointerToRawData);
					}
					++pSecHdr;
				}
				return NULL;
			}
			if (FoundHeader)
				*FoundHeader = NULL;
			return (PVOID)(BaseAddress + Rva);
		}
	}
	*Size = 0;
	return NULL;
}

PVOID ImageDirectoryEntryToDataRom(ULONG_PTR BaseAddress, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size, PIMAGE_SECTION_HEADER *FoundHeader, PIMAGE_FILE_HEADER pFileHdr, PIMAGE_ROM_OPTIONAL_HEADER pOptHdr)
{
	int NumSections = pFileHdr->NumberOfSections;
	PIMAGE_SECTION_HEADER pSecHdr = (PIMAGE_SECTION_HEADER)((PUCHAR)pOptHdr + pFileHdr->SizeOfOptionalHeader);
	for (int i = 0; i < NumSections; ++i)
	{
		if (DirectoryEntry == 6 && !_stricmp((const char *)pSecHdr->Name, ".rdata"))
		{
			*Size = 0;
			for (ULONG_PTR j = (ULONG_PTR)((PUCHAR)BaseAddress + pSecHdr->PointerToRawData + 12); *(DWORD *)j; j += 28)
				*Size += 28;

			if (FoundHeader)
				*FoundHeader = pSecHdr;
			return (PVOID)(BaseAddress + pSecHdr->PointerToRawData);
		}
		if (DirectoryEntry == 3 && !_stricmp((const char *)pSecHdr->Name, ".pdata"))
		{
			if (FoundHeader)
				*FoundHeader = pSecHdr;
			return (PVOID)(BaseAddress + pSecHdr->PointerToRawData);
		}
		++pSecHdr;
	}
	*Size = 0;
	return NULL;
}

PVOID WINAPI ImageDirectoryEntryToDataEx(PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size, PIMAGE_SECTION_HEADER *FoundHeader)
{
	ULONG_PTR BaseAddress = (ULONG_PTR)Base;
	if (!BaseAddress)
	{
		SetLastError(ERROR_INVALID_HANDLE);
		return NULL;
	}
	if (BaseAddress & 1)
	{
		BaseAddress = BaseAddress & 0xFFFFFFFFFFFFFFFE;
		MappedAsImage = FALSE;
	}
	PIMAGE_NT_HEADERS32 pNtHdr32 = ImageNtHeader(Base);
	PIMAGE_FILE_HEADER pFileHdr;
	PIMAGE_OPTIONAL_HEADER32 pOptHdr;
	if (pNtHdr32)
	{
		pFileHdr = &pNtHdr32->FileHeader;
		pOptHdr = &pNtHdr32->OptionalHeader;
	}
	else
	{
		pFileHdr = (PIMAGE_FILE_HEADER)BaseAddress;
		pOptHdr = (PIMAGE_OPTIONAL_HEADER32)(BaseAddress + sizeof(IMAGE_FILE_HEADER));
	}
	if (pOptHdr->Magic == 267)
	{
		return ImageDirectoryEntryToData32(BaseAddress, MappedAsImage, DirectoryEntry, Size, FoundHeader, pFileHdr, pOptHdr);
	}
	if (pOptHdr->Magic == 523)
	{
		PIMAGE_OPTIONAL_HEADER64 pOptHdr64 = (PIMAGE_OPTIONAL_HEADER64)pOptHdr;
		return ImageDirectoryEntryToData64(BaseAddress, MappedAsImage, DirectoryEntry, Size, FoundHeader, pFileHdr, pOptHdr64);
	}
	if (pOptHdr->Magic == 263)
	{
		PIMAGE_ROM_OPTIONAL_HEADER pOptHdrRom = (PIMAGE_ROM_OPTIONAL_HEADER)pOptHdr;
		return ImageDirectoryEntryToDataRom(BaseAddress, MappedAsImage, DirectoryEntry, Size, FoundHeader, pFileHdr, pOptHdrRom);
	}
	*Size = 0;
	return NULL;
}

3、ImageRvaToVa

PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
{
	if (!NtHeaders)
	{
		SetLastError(ERROR_INVALID_PARAMETER);
		return 0i64;
	}
	
	PIMAGE_SECTION_HEADER pSecHdr = (PIMAGE_SECTION_HEADER)((PUCHAR)&NtHeaders->OptionalHeader + NtHeaders->FileHeader.SizeOfOptionalHeader);

	int NumSections = NtHeaders->FileHeader.NumberOfSections;
	for(int i = 0;i < NumSections; ++i)
	{
		if (Rva >= pSecHdr->VirtualAddress && Rva < pSecHdr->SizeOfRawData + pSecHdr->VirtualAddress)
		{
			(PIMAGE_SECTION_HEADER)pSecHdr;
		}
	}
	return NULL;
}

PVOID WINAPI ImageRvaToVa(PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva, PIMAGE_SECTION_HEADER *LastRvaSection)
{
	PIMAGE_SECTION_HEADER pSecHdr;

	if (!LastRvaSection)
	{
		pSecHdr = ImageRvaToSection(NtHeaders, Base, Rva);
	}
	else
	{
		pSecHdr = *LastRvaSection;
		if (!pSecHdr || !(Rva >= pSecHdr->VirtualAddress && Rva < pSecHdr->VirtualAddress + pSecHdr->SizeOfRawData))
			pSecHdr = ImageRvaToSection(NtHeaders, Base, Rva);
	}

	if (pSecHdr)
	{
		if (LastRvaSection)
			*LastRvaSection = pSecHdr;
		return (PUCHAR)Base + Rva - pSecHdr->VirtualAddress + pSecHdr->PointerToRawData;
	}

	return NULL;
}

 

© 著作权归作者所有

hzqst
粉丝 3
博文 12
码字总数 4676
作品 0
杭州
私信 提问
Ubuntu 12.04 LTS x64上安装炉石传说

其实安装了Wine以后只要做一下配置就能运行炉石了,但是似乎战网的设置选项不能使用。 在Configure Wine里的Libraries选项卡里,Add “dbghelp”,并把它设置为“disabled”。再Add “msvcp...

chuqixiaozhu
2014/04/09
0
0
Redis Gli - 一个基于命令行的 Redis 图形界面客户端

很久之前在 Github 上发现了一个用 Golang 来实现的命令行图形界面库,一直想用来做点东西。 周末闲来无事用它写了个基于命令行的 Redis 图形界面客户端,目前已经基本可用,欢迎大家试用,J...

mylxsw
04/22
0
0
高德地图怎样实现实时定位,得到当前地点的坐标,位置?

@铂金小猪 你好,想跟你请教个问题:逆地理编码的的回调函数加什么东西吗?为什么我的程序没有回调 -(void)reverseGeocodingSearch:(MAReverseGeocodingSearchOption*)geoCodingSearchOption...

夏柳柳
2012/09/13
46.9K
6
高德地图逆地理编码的的回调函数加什么东西吗?为什么我的程序没有回调

高德地图逆地理编码的的回调函数加什么东西吗?为什么我的程序没有回调 -(void)reverseGeocodingSearch:(MAReverseGeocodingSearchOption*)geoCodingSearchOption Result:(MAReverseGeocodin...

夏柳柳
2012/09/13
2.7K
0
ios百度地图逆地理编码(基于2.3.0--2.4.0SDK开发)

不得不说,现在的百度LBS部门是不是没人了啊,时不时的搞出来一些不好用得东西 要做百度的逆地理编码功能,肯定是要先启动百度服务了,这些就不再扯了。 //初始化地理编码类 注意:必须初始化...

浅唱那回忆
2014/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

跨域的理解,以及解决方案!

/*什么是跨域? * 跨域的主要原因是浏览器的同源策略。 * =>>所谓的同源策略就是A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。 * 什么是同源? * =>>同源就是协议相同、域名相同...

流年那么伤
6分钟前
1
0
Nginx配置try_fiels,php无法获取$_GET参数

平时开发都是用LNMP,新安装的虚拟机在配置nginx的rewrite的时候使用try_files命令。但是在写的时候配置成“try_files $uri $uri/ /index.php?q=args;”, 在PHP的web程序中,打印$_GET为空。...

叫我哀木涕
7分钟前
0
0
【原创】Microsoft Edge可以用localhost访问但无法用IP访问

Microsoft Edge可以用localhost和127.0.0.1访问但无法用本机IP访问, chrome ie都可以推测是edge的问题,网络是专用网络,防火墙也关了: 在edge里 按F12 以在控制台里看到这句 CONSOLE21301...

shzwork
7分钟前
0
0
Python利用数学方程式画4种不一样的心型图案

前言 下面这四个心型图案,是通过科学地计算,根据数学方程式生成的,虽然做的不是特别完美,但是基本的还是能实现的 第一个心型 结果图 第二心型 结果图 学习从来不是一个人的事情,要有个相互监...

A_裙232550246
8分钟前
0
0
微信带场景参数的二维码生成与使用?

微信公众号推广时,用户通过扫二维码关注公众号,需要统计用户是通过谁的二维码进行关注。 在用户扫码关注公众号时,二维码带上推广者的参数,在关注公众号后,获取到该推广者的参数。 目前有...

wxgzhgncj
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部