首页
社区
课程
招聘
[旧帖] [求助]如何获取模块长度(大小) 0.00雪花
发表于: 2012-2-21 18:02 1804

[旧帖] [求助]如何获取模块长度(大小) 0.00雪花

2012-2-21 18:02
1804
大家都知道 GetModuleHandle() 或者 LoadLibrary() 返回的是模块在程序领空的地址(模块基址)
但有时候需要取得该模块的长度,怎么做.... 求大神支招!!

突然在这里卡壳了,因为需要暴搜模块的字节码,不想从0x400000一直搜索到结尾.....
通过PE文件头处的便宜可以获得模块长度,但这个长度好像是文件长度,不知道内存里的长度是不是这个= =!

求大神指点~~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你是小强麽??????
2012-2-21 18:18
0
雪    币: 125
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习一下,哈哈
2012-2-21 19:08
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
其实有个简单的方法。。。

就是分析模块的PE头。。。
2012-2-21 19:21
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
5
LPVOID GetModuleSize(LPVOID ModuleBase)
{
        PROCESS_BASIC_INFORMATION* ppbi;
        PULONG temp;
        ZwQueryInformationProcess(GetCurrentProcess(),ProcessBasicInformaion,ppbi,sizeof(PROCESS_BASIC_INFORMATION* ),&temp);
        LDR_DATA_TABLE_ENTRY* ldte=*(ppbi.PebBaseAddress.LoaderData).InMemoryOrderModuleList;
        LDR_DATA_TABLE_ENTRY* ldte1=ldte;
        do
        {
                LPVOID return_value=-1; // ERR_NOT_FOUND
                if (ldte1.DllBase==ModuleBase) then return_value=ldte1.Reserved3;//SizeOfImage
                ldte1=ldte1.InMemoryOrderLinks.Flink;
        }while(ldte1!=ldte)
        return return_value;
}

大概这样不知道行不行
2012-2-21 19:28
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
#include <stdio.h>
#include <windows.h>
DWORD module_size(char *name)
{
	DWORD base = 0;
	IMAGE_DOS_HEADER dos_header = {0};
	IMAGE_NT_HEADERS nt_headers = {0};

	base = (DWORD)GetModuleHandle(name);
	if(!base)return -1;
	dos_header = *(IMAGE_DOS_HEADER*)base;
	if(dos_header.e_magic != 'M' + 'Z' * 256)
	{
		return -1;
	}
	nt_headers = *(IMAGE_NT_HEADERS*)(base + dos_header.e_lfanew);
	if(nt_headers.Signature != 'P' + 'E' * 256)
	{
		return -1;
	}
	return nt_headers.OptionalHeader.SizeOfImage;
}
int main(int argc, char *argv[])
{
	if(argc == 1)
	{
		printf("size: %d\n",module_size(NULL));
		return 0;
	}else if(argc == 2)
	{
		DWORD addr = module_size(argv[1]);
		if(addr != -1)
		{
			printf("size: %d\n",addr);
			return 0;
		}else{
			printf("module %s not found\n",argv[1]);
			return -1;
		}
	}
	return -1;
}

大概这样。嗯。
2012-2-21 19:57
0
雪    币: 2792
活跃值: (2588)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
  BOOL WINAPI GetModuleInformation(
  __in HANDLE hProcess,
  __in HMODULE hModule,
  __out LPMODULEINFO lpmodinfo,
  __in DWORD cb
  );

http://baike.baidu.com/view/2003517.htm
2012-2-21 21:25
0
游客
登录 | 注册 方可回帖
返回
//