最近在写一个PE工具

这东西很多人都已经写的不想写了,对于我来说,才是第一次啊

现在已经完成了

IsPeFile(判断一个文件是否为PE文件) ,ShowPeInfo(显示出IMAGE_DOS_HEADE\IMAGE_FILE_HEADER\IMAGE_OPTIONAL_HEADER的各个成员的值),

RVA2Offset(相对虚拟地址转化为文件偏移),PrintfImportTable(打印处输入表的信息)

写的过程中出现问题比较多的是忘记转化指针,导致输出的内容完全乱七八糟。

下面贴一段RVA2Offset的代码,写的不好,求指点。

DWORD RVA2Offset(LPVOID lpAddress,DWORD RVA)
{
	PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)lpAddress;
	PIMAGE_NT_HEADERS32 nt_header = (PIMAGE_NT_HEADERS32)((BYTE*)lpAddress+dos_header->e_lfanew);
	PIMAGE_SECTION_HEADER section_header = (PIMAGE_SECTION_HEADER)((BYTE*)nt_header+sizeof(IMAGE_NT_HEADERS32));
	PIMAGE_SECTION_HEADER p=section_header;
	DWORD NumberOfSections =nt_header->FileHeader.NumberOfSections;	
	DWORD ImageBase=nt_header->OptionalHeader.ImageBase;

	//判断RVA是那个段的,计算出所在段的delta值,delta=段的RVA-段的Offset,再用RVA-delta就得到了对应的Offset地址了。

	DWORD SectionStartRVA = NULL;//RVA
	DWORD SectionEndRVA = NULL;//RVA
	DWORD SectionStartOffset = NULL;//Offset
	DWORD SectionEndOffset = NULL;//Offset
	DWORD delta =NULL;
	DWORD offset = NULL;
	for(DWORD i=0;i<NumberOfSections;i++,p++)
	{
		SectionStartRVA = p->VirtualAddress;//这里的成员VirtualAddress是一个RVA,不要看到VritualAddress就认为是VA;
		SectionEndRVA = p->Misc.VirtualSize+p->VirtualAddress;
		SectionStartOffset = p->PointerToRawData;
		SectionEndOffset =p->SizeOfRawData+p->PointerToRawData;
		delta = SectionStartRVA-SectionStartOffset;
		if(RVA>=SectionStartRVA&&RVA<SectionEndRVA)
		{
			offset = RVA-delta;
	//		printf("0x%x对应的Offset是0x%x\n",RVA,offset);
			return offset;
		}
		
	
	}
	
	printf("该RVA不属于任何区段");
	return 0;
}

  

 

整个程序运行效果:

please select a file!
PATH:C:\WINDOWS\system32\dllcache\AcGenral.dll
is a pe file!
SECTION NAME .text Characteristc 60000020
RAV 00001000 SIZE 00031FCD
RAW 00000400 Size 00032000
SECTION NAME .data Characteristc C0000040
RAV 00033000 SIZE 00008AFC
RAW 00032400 Size 00005C00
SECTION NAME .rsrc Characteristc 40000040
RAV 0003C000 SIZE 00187130
RAW 00038000 Size 00187200
SECTION NAME .reloc Characteristc 42000040
RAV 001C4000 SIZE 0000535E
RAW 001BF200 Size 00005400
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IMAGE_DOS_HEADER
PE address 0x000000e8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IMAGE_FILE_HEADER
Machine 0x014C
Number of Section 0x0004
Time Stamp 0x4802BD6F
Size of Optional Header 0x00E0
Characteristic 0x210E
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IMAGE_OPTIONAL_HEADER
Entry Point 0x0002606E
ImageBase 0x58FB0000
Size of Image 0x001CA000
SizeOfHeaders 0x00000400
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Export Directory RVA:0x00032F70  SIZE:0x0000005D
IMPORT Directory RVA:0x000316C8  SIZE:0x0000012C
Resource Directory RVA:0x0003C000  SIZE:0x00187130
Relocation Directory RVA:0x001C4000  SIZE:0x000038FC
TLS Directory RVA:0x00000000  SIZE:0x00000000
Import Address Table RVA:0x00001000  SIZE:0x0000043C
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
该文件的输入表位于offset 0x00030AC8
DllName ntdll.dll Original First Thunk  0x00031BC4  TimeStamp 0xFFFFFFFF Forward
erChain 0xFFFFFFFF FirstThunk 0x000013D0
DllName KERNEL32.dll Original First Thunk  0x00031854  TimeStamp 0xFFFFFFFF Forw
arderChain 0xFFFFFFFF FirstThunk 0x00001060
DllName USER32.dll Original First Thunk  0x00031AE4  TimeStamp 0xFFFFFFFF Forwar
derChain 0xFFFFFFFF FirstThunk 0x000012F0
DllName GDI32.dll Original First Thunk  0x0003182C  TimeStamp 0xFFFFFFFF Forward
erChain 0xFFFFFFFF FirstThunk 0x00001038
DllName ADVAPI32.dll Original First Thunk  0x000317F4  TimeStamp 0xFFFFFFFF Forw
arderChain 0xFFFFFFFF FirstThunk 0x00001000
DllName WINMM.dll Original First Thunk  0x00031BBC  TimeStamp 0xFFFFFFFF Forward
erChain 0xFFFFFFFF FirstThunk 0x000013C8
DllName ole32.dll Original First Thunk  0x00031C18  TimeStamp 0xFFFFFFFF Forward
erChain 0xFFFFFFFF FirstThunk 0x00001424
DllName OLEAUT32.dll Original First Thunk  0x00031ABC  TimeStamp 0xFFFFFFFF Forw
arderChain 0xFFFFFFFF FirstThunk 0x000012C8
DllName MSACM32.dll Original First Thunk  0x00031AB0  TimeStamp 0xFFFFFFFF Forwa
rderChain 0xFFFFFFFF FirstThunk 0x000012BC
DllName VERSION.dll Original First Thunk  0x00031BAC  TimeStamp 0xFFFFFFFF Forwa
rderChain 0xFFFFFFFF FirstThunk 0x000013B8
DllName SHELL32.dll Original First Thunk  0x00031ACC  TimeStamp 0xFFFFFFFF Forwa
rderChain 0xFFFFFFFF FirstThunk 0x000012D8
DllName SHLWAPI.dll Original First Thunk  0x00031ADC  TimeStamp 0xFFFFFFFF Forwa
rderChain 0xFFFFFFFF FirstThunk 0x000012E8
DllName USERENV.dll Original First Thunk  0x00031B94  TimeStamp 0xFFFFFFFF Forwa
rderChain 0xFFFFFFFF FirstThunk 0x000013A0
DllName UxTheme.dll Original First Thunk  0x00031BA4  TimeStamp 0xFFFFFFFF Forwa
rderChain 0xFFFFFFFF FirstThunk 0x000013B0
ImportTable信息输出完毕

  睡觉,明天继续搞起。

posted @ 2012-07-22 00:51  shremie  阅读(401)  评论(0)    收藏  举报