PE资源结构及读取

本文深入探讨了Windows可执行文件(PE)的资源结构,包括对话框、字符串、图像等,并详细阐述了如何从PE文件中提取和读取这些资源。通过实例解析,了解微软的资源管理机制,有助于提升对Windows程序逆向分析和二进制修改的理解。
摘要由CSDN通过智能技术生成

 

PE 资源结构及读取
作者: Sunline               lisunlin0@yahoo.com.cn       2007 7
源代码下载 :http://download.csdn.net/source/359338   其中的 Source 文件夹中 .

      
下面的一些函数是我在学习 PE 结构时参考 Matt Pietrek 的《 A Tour of the Win32 Portable Executable File Format 》和 Microsoft 的《 Visual Studio, Microsoft Portable Executable and Common Object File Format Specification 》以及部分网上的代码所写成的,是研究如何直接读取 PE 资源的一手资料 ( 比如其中的 LoadString LoadAccelerators LoadMenu LoadIcon 函数,没有其它任何可用的参考资料 , VC 调试时跟踪到相应的函数内部,通过汇编代码和自己丰富的想象力才搞清楚的。 ) ,希望可以给研究 PE 格式的朋友一些帮助。其中大部分是自己 Debug 得出的,可能有不妥的地方,敬请斧正。
// ResFunc.cpp
// 描述:
//             从PE文件中取得资源
// 作者:
//             SunLine 2007年07月
// Description:
//             get resources from a pe module
// Authority:
//             Write by Sunline July, 2007
// All rights reserved.
 
 
#include <windows.h>
#include "ResFunc.h"
#include "libc.h"
 
extern "C"
{     
       DWORD __stdcall _SizeofResource(HMODULE hModule, HRSRC hResInfo)
       {
              DWORD dwRet;
              if(hResInfo)
                     dwRet = PIMAGE_RESOURCE_DATA_ENTRY(hResInfo)->Size;
              else
                     dwRet = 0;
              return dwRet;
       }
 
       HGLOBAL __stdcall _LoadResource( HMODULE hModule, HRSRC hResInfo)
       {
              HGLOBAL hRet;
              if(hResInfo)
                     hRet = HGLOBAL((LPBYTE)hModule + PIMAGE_RESOURCE_DATA_ENTRY(hResInfo)->OffsetToData);
              else
                     hRet = NULL;
              return hRet;
       }
 
       LPVOID __stdcall _LockResource(HGLOBAL hResData)
       {
              return (LPVOID)hResData;
       }
 
       HRSRC   __stdcall _FindResourceA( HMODULE hModule, LPCSTR lpName, LPCSTR lpType)
       {
              return _FindResourceExA(hModule, lpType, lpName, 0);
       }
       HRSRC   __stdcall _FindResourceW( HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType)
       {
              return _FindResourceExW(hModule, lpType, lpName, 0);
       }
 
       HRSRC   __stdcall _FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage)
       {
              HRSRC hRsrc = NULL;
              WCHAR wTypeName[MAX_PATH];
              WCHAR wResName[MAX_PATH];
              LPWSTR pwTypeName;
              LPWSTR pwResName;
              if(MAKEINTRESOURCEA(lpType) == lpType)
              {
                     pwTypeName = (LPWSTR)lpType;
              }
              else
              {
                     int nTypeLen = lstrlenA(lpType) + 1;
                     int nUnicodeStrLen = nTypeLen * sizeof(WCHAR);
                     pwTypeName = (LPWSTR)_malloc(nUnicodeStrLen);
                     nUnicodeStrLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, /
                            lpType, nTypeLen, wTypeName, nUnicodeStrLen);
                     pwTypeName = wTypeName;
              }
 
              if(MAKEINTRESOURCEA(lpName) == lpName)
              {
                     pwResName = (LPWSTR)lpName;
              }
              else
              {
                     int nNameLen = lstrlenA(lpName) + 1;
                     int nUnicodeStrLen = nNameLen * sizeof(WCHAR);
                     nUnicodeStrLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, /
                            lpType, nNameLen, wResName, nUnicodeStrLen);
                     pwResName = wResName;
              }
 
              if(pwTypeName && pwResName)
              {
                     hRsrc = _FindResourceExW(hModule, pwTypeName, pwResName, wLanguage);
              }
              else
                     hRsrc = NULL;
              return hRsrc;
       }
 
       HRSRC   __stdcall _FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage)
       {
              PIMAGE_RESOURCE_DATA_ENTRY res = NULL;
              if(hModule == NULL)
                     hModule = GetModuleHandleW(NULL);
              if((lpName != 0) && (lpType != 0))
              {
                     if(!hModule)
                            hModule = GetModuleHandleA(NULL);
                     PIMAGE_RESOURCE_DIRECTORY pResDir = PIMAGE_RESOURCE_DIRECTORY( /
                            LPBYTE(hModule) + PIMAGE_NT_HEADERS((LPBYTE)hModule + /
                            PIMAGE_DOS_HEADER(hModule)->e_lfanew)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress/
                            );
                     ProcRes(res, hModule, LPBYTE(pResDir), pResDir, LEVELE_RESDIR, lpName, lpType, wLanguage);
              }
              return (HRSRC)res;
       }
 
       // Accelerators function
       HACCEL __stdcall _LoadAcceleratorsA( HINSTANCE hInst, LPCSTR lpTableName)
       {
              int nAccItem = 0;
              PACCTABENTRY pAccTabEntry = (PACCTABENTRY)_GetResDataA(hInst, lpTableName, (LPCSTR)RT_ACCELERATOR);
              for(nAccItem = 0; TRUE; nAccItem++)
              {
                     WORD wFlags = pAccTabEntry[nAccItem].fFlags;
                     if(wFlags & 0x80) // The entry is last in an accelerator table.
                     {
                            if(wFlags & 0x60) // 0x60 is binary 01100000, the low 5 bits is legal;
                                   nAccItem = 0;
                            else
                                 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值