飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3629|回复: 7

[x64] 抛砖引玉2-PE64简单解析DLL导出表

[复制链接]
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2015-1-14 15:43:00 | 显示全部楼层 |阅读模式
    方便你们写劫持工具。。。自己去整吧~~

    1. /*
    2.         解析PE64 DLL 导出表
    3.         By 飘云/P.Y.G
    4.         www.chinapyg.com
    5. */
    6. #include "windows.h"
    7. #include "stdio.h"


    8. DWORD RVA2Offset(PIMAGE_NT_HEADERS pNTHeader, DWORD dwRVA)
    9. {
    10.         PIMAGE_SECTION_HEADER pSection = (PIMAGE_SECTION_HEADER)((DWORD)pNTHeader + sizeof(IMAGE_NT_HEADERS));

    11.         for(int i = 0; i < pNTHeader->FileHeader.NumberOfSections; i++)
    12.         {
    13.                 if(dwRVA >= pSection[i].VirtualAddress && dwRVA < (pSection[i].VirtualAddress + pSection[i].SizeOfRawData))
    14.                 {
    15.                         return pSection[i].PointerToRawData + (dwRVA - pSection[i].VirtualAddress);
    16.                 }
    17.         }

    18.         return 0;
    19. }

    20. void PE64_DLL(PCHAR lpFileName)
    21. {
    22.         HANDLE hfile = CreateFileA(lpFileName,
    23.                 GENERIC_READ|GENERIC_WRITE,
    24.                 FILE_SHARE_READ,
    25.                 NULL,
    26.                 OPEN_EXISTING,
    27.                 FILE_ATTRIBUTE_NORMAL,
    28.                 NULL);

    29.         if(hfile == INVALID_HANDLE_VALUE)
    30.         {
    31.                 printf("[P.Y.G]创建文件失败.\n");
    32.                 return ;
    33.         }
    34.         HANDLE hFileMapping = CreateFileMapping(hfile, NULL, PAGE_READONLY, 0, 0, NULL);
    35.         if (hFileMapping == NULL || hFileMapping == INVALID_HANDLE_VALUE)
    36.         {
    37.                 printf("[P.Y.G]创建共享内存失败 (%d).\n", GetLastError());
    38.                 return ;
    39.         }

    40.         LPBYTE lpBaseAddress = (LPBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
    41.         if (lpBaseAddress == NULL)
    42.         {
    43.                 printf("[P.Y.G]内存映射失败 (%d).\n", GetLastError());
    44.                 return ;
    45.         }
    46.         PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpBaseAddress;

    47.         // 验证PE合法性
    48.         if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
    49.         {
    50.                 printf("[PYG]--非PE文件!\n");       
    51.                 // 自行清理现场。。。
    52.                 return;
    53.         }

    54.         PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)(lpBaseAddress + pDosHeader->e_lfanew);

    55.         // 继续验证PE合法性
    56.         if(pNtHeaders->Signature != IMAGE_NT_SIGNATURE)
    57.         {
    58.                 printf("[PYG]--非PE文件!\n");
    59.                 // 自行清理现场。。。
    60.                 return;
    61.         }

    62.         int dwExportOffset = RVA2Offset(pNtHeaders, pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    63.         PIMAGE_EXPORT_DIRECTORY pExport = (PIMAGE_EXPORT_DIRECTORY)((DWORD)lpBaseAddress + dwExportOffset);
    64.         DWORD dwFunctionNameOffset = (DWORD)lpBaseAddress + RVA2Offset(pNtHeaders, pExport->Name);
    65.         DWORD* pdwNamesAddress = (DWORD*)((DWORD)lpBaseAddress + RVA2Offset(pNtHeaders, pExport->AddressOfNames));
    66.         DWORD* pdwFunctionAddress = (DWORD*)((DWORD)lpBaseAddress + RVA2Offset(pNtHeaders, pExport->AddressOfFunctions));
    67.         WORD* pwOrdinals = (WORD*)((DWORD)lpBaseAddress + RVA2Offset(pNtHeaders, pExport->AddressOfNameOrdinals));

    68.         DWORD dwNumberOfNames = pExport->NumberOfNames;

    69.         if(dwNumberOfNames > 0)
    70.         {
    71.                 printf("[P.Y.G]文件名: %s\n", dwFunctionNameOffset);
    72.                 printf("[P.Y.G]导出函数总数: %X\n", pExport->NumberOfFunctions);
    73.                 printf("[P.Y.G]名称函数总数: %X\n\n", pExport->NumberOfNames);

    74.                 printf("名称导出:\n\n");

    75.                 for(int i = 0; i < dwNumberOfNames; i++)
    76.                 {
    77.                         DWORD dwFunctionAddress = pdwFunctionAddress[pwOrdinals[i]];
    78.                         DWORD pdwFunNameOffset = (DWORD)lpBaseAddress + RVA2Offset(pNtHeaders, pdwNamesAddress[i]);

    79.                         printf("[P.Y.G][序号]: %-4X  [名称]: %-30s  [RVA]: 0x%08X\n", pExport->Base + i/* + 1*/, pdwFunNameOffset, dwFunctionAddress);
    80.                 }

    81.                 printf("\n序号导出:\n\n");

    82.                 for(int i = 0; i < pExport->NumberOfFunctions - dwNumberOfNames; i++)
    83.                 {
    84.                         printf("[P.Y.G][序号]: %-4d  [RVA]: 0x%08X\n", pExport->Base + i/* + 1*/, pdwFunctionAddress[i]);
    85.                 }
    86.         }else
    87.                 printf("\n\t---------- [P.Y.G]未找到导出表! ----------\n");


    88.         UnmapViewOfFile(lpBaseAddress);
    89.         CloseHandle(hFileMapping);
    90.         CloseHandle(hfile);

    91. }

    92. void main()
    93. {
    94.         char szFileName[MAX_PATH];
    95.         printf("请输入文件路径:\n");
    96.         scanf("%s", szFileName);
    97.         PE64_DLL(szFileName);
    98.         system("pause");
    99. }
    复制代码


    评分

    参与人数 3威望 +24 飘云币 +24 收起 理由
    small-q + 8 + 8 很给力!
    lucky_789 + 8 + 8 赞一个!
    逍遥枷锁 + 8 + 8 赞一个!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-3-10 20:59
  • 签到天数: 243 天

    [LV.8]以坛为家I

    发表于 2015-1-14 16:30:15 | 显示全部楼层
    此贴必火!感谢飘大,抢座留名.....{:soso_e113:}
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2015-1-14 17:14:38 | 显示全部楼层
    藤椅是我的。多谢飘哥抽空来分享技术
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-9-27 19:17
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2015-1-14 22:19:59 | 显示全部楼层
    良码善用之
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2016-1-13 12:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-1-15 08:59:01 | 显示全部楼层
    爽啊。。。。又是福利
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 628 天

    [LV.9]以坛为家II

    发表于 2015-1-15 12:24:19 | 显示全部楼层
    多谢飘哥抽空来分享技术
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-6-2 23:47
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2015-1-16 11:30:12 | 显示全部楼层
    谢谢分享谢谢分享谢谢分享
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    7 天前
  • 签到天数: 206 天

    [LV.7]常住居民III

    发表于 2015-1-16 11:34:55 | 显示全部楼层
    多谢分享  大大技术
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表