PECode

#include <windows.h>
#include <stdio.h>

 

DWORD  RAVOffset(char*  lpBaseAddress,DWORD VirtualAddress);

void  main()
{

 char  FileName[256] = {0};
 
 GetCurrentDirectory(256,FileName);
 
 strcat(FileName,"//fenglei.exe");
 
 HANDLE  hOpenFile = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 
 
 HANDLE  hMapping = NULL;
 
 hMapping = CreateFileMapping(hOpenFile,NULL,PAGE_READONLY,0,0,0);
 
 if (hMapping == NULL)
 {
  printf("Mapping  File  Error/n");
  
  return;
 }
 
 LPVOID  lpMappingAddress = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
 
 if (lpMappingAddress == NULL)
 {
  printf("View  Mapping  Error/n");
  
  return;
 }
 
 char*  lpBaseAddress = (char*)lpMappingAddress;

 PIMAGE_DOS_HEADER  p_image_dos_header = (PIMAGE_DOS_HEADER)(lpBaseAddress);

 if (p_image_dos_header->e_magic == IMAGE_DOS_SIGNATURE)
 {
  printf("finded  The  NT  Header/n");
 }

 PIMAGE_NT_HEADERS  p_image_NT_header = (PIMAGE_NT_HEADERS)((char*)lpBaseAddress+p_image_dos_header->e_lfanew); 

 if (p_image_NT_header->Signature == IMAGE_NT_SIGNATURE)
 {
  printf("Finde  The  PE  Header/n");

 }

 PIMAGE_IMPORT_DESCRIPTOR  p_image_import_descriptory = (PIMAGE_IMPORT_DESCRIPTOR)((char*)lpBaseAddress+p_image_NT_header->OptionalHeader.DataDirectory[1].VirtualAddress);

 while (p_image_import_descriptory->FirstThunk)
 {
  char*  ModuName = lpBaseAddress + p_image_import_descriptory->Name;

  printf(" the  module  Name is :%s/n",ModuName);

  PIMAGE_IMPORT_DESCRIPTOR  pRaw_import_descriptoy = (PIMAGE_IMPORT_DESCRIPTOR)((char*)lpBaseAddress+RAVOffset(lpBaseAddress,p_image_NT_header->OptionalHeader.DataDirectory[1].VirtualAddress));

  PIMAGE_THUNK_DATA   p_image_thunk_data = (PIMAGE_THUNK_DATA)((char*)lpBaseAddress+RAVOffset(lpBaseAddress,p_image_import_descriptory->OriginalFirstThunk));

  while (p_image_thunk_data->u1.Function)
  {
    PIMAGE_IMPORT_BY_NAME  p_image_import_by_name = (PIMAGE_IMPORT_BY_NAME)((char*)lpBaseAddress+RAVOffset(lpBaseAddress,(DWORD)p_image_thunk_data->u1.AddressOfData));

      printf("The  Function  Name  Is:    %s/n",p_image_import_by_name->Name);

   p_image_thunk_data++;
  }

  p_image_import_descriptory++;
 }
}
DWORD  RAVOffset(char*  lpBaseAddress,DWORD VirtualAddress)
{
 PIMAGE_DOS_HEADER  p_image_dos_header = NULL;
 PIMAGE_NT_HEADERS  p_image_NT_header = NULL;
 PIMAGE_SECTION_HEADER  p_image_section_header = NULL;

 p_image_dos_header = (PIMAGE_DOS_HEADER)(lpBaseAddress);

 p_image_NT_header = (PIMAGE_NT_HEADERS)(lpBaseAddress+p_image_dos_header->e_lfanew);

 DWORD  NumberOfSection = p_image_NT_header->FileHeader.NumberOfSections;

 DWORD  index = 0;

 for (index = 0; index<NumberOfSection; index++)
 {
 
  p_image_section_header = (PIMAGE_SECTION_HEADER)((char*)lpBaseAddress+p_image_dos_header->e_lfanew+sizeof(IMAGE_NT_HEADERS))+index;
  
  if (VirtualAddress>=p_image_section_header->VirtualAddress&&VirtualAddress < p_image_section_header->VirtualAddress+p_image_section_header->SizeOfRawData)
  {
   DWORD  RAV = VirtualAddress - p_image_section_header->VirtualAddress; 


                       DWORD  Offset = p_image_section_header->PointerToRawData +RAV;

   return  Offset;
  }
 }
 return 0;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值