吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 1964|回复: 9

[转载技术] 抛砖引玉2-PE64简单解析DLL导出表

[复制链接]
Shark_鹏 发表于 2015-3-24 22:26 | 显示全部楼层 |阅读模式


#include "windows.h"
#include "stdio.h"


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

        for(int i = 0; i < pNTHeader->FileHeader.NumberOfSections; i++)
        {
                if(dwRVA >= pSection.VirtualAddress && dwRVA < (pSection.VirtualAddress + pSection.SizeOfRawData))
                {
                        return pSection.PointerToRawData + (dwRVA - pSection.VirtualAddress);
                }
        }

        return 0;
}

void PE64_DLL(PCHAR lpFileName)
{
        HANDLE hfile = CreateFileA(lpFileName,
                GENERIC_READ|GENERIC_WRITE,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);

        if(hfile == INVALID_HANDLE_VALUE)
        {
                printf("[P.Y.G]创建文件失败.\n");
                return ;
        }
        HANDLE hFileMapping = CreateFileMapping(hfile, NULL, PAGE_READONLY, 0, 0, NULL);
        if (hFileMapping == NULL || hFileMapping == INVALID_HANDLE_VALUE)
        {
                printf("[P.Y.G]创建共享内存失败 (%d).\n", GetLastError());
                return ;
        }

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

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

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

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

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

        DWORD dwNumberOfNames = pExport->NumberOfNames;

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

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

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

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

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

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


        UnmapViewOfFile(lpBaseAddress);
        CloseHandle(hFileMapping);
        CloseHandle(hfile);

}

void main()
{
        char szFileName[MAX_PATH];
        printf("请输入文件路径:\n");
        scanf("%s", szFileName);
        PE64_DLL(szFileName);
        system("pause");
}




评分

参与人数 18HB +19 THX +10 收起 理由
24567 + 1
Jawon + 1
一路走来不容易 + 1
Soul1999 + 1
后学真 + 1
飞刀梦想 + 1
冷亦飞 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
l278785481 + 1
xgbnapsua + 1
jaunic + 1
我是好人 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
liugu0hai + 1 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
hackysh + 1
消逝的过去 + 2
lies + 1
逍遥枷锁 + 4 + 1 好人有好报!你的热心我永远不忘!谢谢!
Shark恒 + 5 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Scar-疤痕 发表于 2015-3-25 06:51 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hackysh 发表于 2022-2-21 17:25 | 显示全部楼层


[快捷回复]-感谢楼主热心分享!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zwj00544 发表于 2022-2-22 03:15 | 显示全部楼层


[快捷回复]-软件反汇编逆向分析,软件安全必不可少!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
沙画 发表于 2022-3-9 12:44 | 显示全部楼层

感谢楼主分享。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-10 04:29 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-4 18:15 | 显示全部楼层

看起来有点复杂,收藏先,有空研究一下
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-23 20:34 | 显示全部楼层

666,学到了
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-17 09:13 | 显示全部楼层


楼主,牛逼啊!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-5-13 18:39 | 显示全部楼层

C也太厉害了
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

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