[真心求助]PE文件里的一些指针运算的问题!!!
if (fKernel32){
fread( &dos_header, 1, sizeof(IMAGE_DOS_HEADER), fKernel32 ); //dos_header是IMAGE_DOS_HEADER的实例
fseek( fKernel32, dos_header.e_lfanew, 0 );
fread( &header, 1, sizeof(IMAGE_NT_HEADERS), fKernel32 ); //到此为止已经找到了IMAGE_NT_HEADERS的位置
int k = 0;
for ( int i = 0; i < header.FileHeader.NumberOfSections; i++ )
IMAGE_SECTION_HEADER section;
memset( §ion, 0, sizeof(IMAGE_SECTION_HEADER) );
fread( §ion, 1, sizeof(IMAGE_SECTION_HEADER), fKernel32 );
if ( strcmp( ".text", (char*)§ion.Name ) == 0 )
k = section.VirtualAddress - section.PointerToRawData;
HMODULE module = LoadLibrary( Kernel32 );
void *proc = GetProcAddress( module, "GetTickCount" );
int offset = (int)proc - header.OptionalHeader.ImageBase;
int file_offset = offset - k;
Log::Error("%16x\n",file_offset);
fseek( fKernel32, file_offset, 0 );
为了上下文,所以代码有些长。不过我的问题不复杂,熟悉PE文件的哥哥请接着往下看
我的问题是:k = section.VirtualAddress - section.PointerToRawData; //这里的k是否可以理解成节头和节数据之间的距离?不然,k的意义是什么?
module和proc分别获得了Kernel32的实际地址及其输出函数GetTickCount的实际地址,那么接下来的offset的意义是什么?用输出函数的实际地址减去PE文件的虚拟地址,这有什么意义吗? 接着最后面的file_offset = offset - k 的意义又是什么?
懂的哥哥请不吝赐教,刚注册,分不多,感谢!