#include "Global.h"


static BOOL bIsPe32Plus = 0;                  //标志,用于表示是否为pe32+文件
static INT64 mode = 0;                        //标志,用于表示读入的模式,若为0代表是内存读入,不为0,代表是文件打开,此时mode是文件路径指针。
static byte* data = NULL;                     //用于存放读入的PE文件

static IMAGE_SECTION_HEADER ish[20] = { 0 };  //用于存放区段头
static int nNumOfSections = 0;                //表示有多少个区段
static IMAGE_DATA_DIRECTORY idd[0x10] = { 0 };//用于存放数据目录表
static BYTE ibrl[0x200][0x1000] = { 0 };      //用于存放重定位相关信息

static CHAR szSectionColName[6][MAX_PATH] =   //区段对话框listview的列名
{
    "Name","VOffset","VSize","ROffset","RSize","Flags"
};
enum SectionColPos {scp_name=0,scp_voffset,scp_vsize,scp_roffset,scp_rsize,scp_flags};      //区段对话框listview列位置索引
static int nSectionColNum = 6;

//RVA转文件偏移
static INT RVAtoFileOff(INT nRva)
{
    for (int i = 0; i < nNumOfSections; ++i)
    {
        if ((nRva >= ish[i].VirtualAddress) && (nRva <= (ish[i].VirtualAddress + ish[i].Misc.VirtualSize)))
        {
            return nRva - ish[i].VirtualAddress + ish[i].PointerToRawData;
            break;
        }
    }
    MessageBox(NULL, "RVA转换无解", NULL, 0);
    return -1;
} 

//RVA找到对应的区段名
static CHAR* RVAToSectionName(INT nRva)
{
    for (int i = 0; i < nNumOfSections; ++i)
    {
        if ((nRva >= ish[i].VirtualAddress) && (nRva <= (ish[i].VirtualAddress + ish[i].Misc.VirtualSize)))
        {
            return (CHAR*)ish[i].Name;
            break;
        }
    }
    MessageBox(NULL, "RVA转换无解", NULL, 0);
    return NULL;
}

//得到基本的PE文件信息
VOID GetBasicPEInfo(HWND hwndDlg)
{
    
    if (mode == NULL)  //说明在内存中
    {
        HANDLE hDestProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, nLastPID);
        HMODULE hModule[200] = { 0 };
        DWORD cbNeeded = 0;
        MODULEINFO mi = { 0 };
        EnumProcessModulesEx(hDestProcess, hModule, 200 * 4, &cbNeeded, LIST_MODULES_ALL);
        GetModuleInformation(hDestProcess, hModule[0], &mi, sizeof(mi));
        data = (PBYTE)malloc(mi.SizeOfImage);
        ReadProcessMemory(hDestProcess, hModule[0], data, mi.SizeOfImage, NULL);

    }
    else //说明是文件中
    {
        HANDLE hFile = CreateFile((CHAR*)mode, FILE_READ_ACCESS, FILE_SHARE_READ, NULL, OPEN_ALWAYS, NULL, NULL);
        DWORD dwFileSize = GetFileSize(hFile, NULL);
        data = (BYTE*)malloc(dwFileSize);
        ReadFile(hFile, data, dwFileSize, NULL, NULL);
        CloseHandle(hFile);
    }


    PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)data;
    if (pidh->e_magic != IMAGE_DOS_SIGNATURE)
    {
        MessageBox(NULL, "不是个PE文件", "错误信息", MB_OK);
        return;
    }

    PIMAGE_NT_HEADERS32 pinh = (PIMAGE_NT_HEADERS32)(&data[pidh->e_lfanew]);

    if (pinh->Signature != IMAGE_NT_SIGNATURE)
    {
        MessageBox(NULL, "不是个PE文件", "错误信息", MB_OK);
        return;
    }
    PIMAGE_FILE_HEADER pifh = &pinh->FileHeader;

    CHAR szTemp[20] = { 0 };
    wsprintf(szTemp, "%04X", pifh->SizeOfOptionalHeader);
    HWND hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT15);
    Edit_SetText(hwndTemp, szTemp);

    wsprintf(szTemp, "%04X", pifh->Characteristics);
    hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT13);
    Edit_SetText(hwndTemp, szTemp);

    nNumOfSections = pifh->NumberOfSections;
    wsprintf(szTemp, "%04X", pifh->NumberOfSections);
    hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT10);
    Edit_SetText(hwndTemp, szTemp);

    wsprintf(szTemp, "%08X", pifh->TimeDateStamp);
    hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT11);
    Edit_SetText(hwndTemp, szTemp);

    if (pinh->OptionalHeader.Magic == 0x20B)
    {
        bIsPe32Plus = TRUE;

        PIMAGE_NT_HEADERS64 pinh64 = (PIMAGE_NT_HEADERS64)(&data[pidh->e_lfanew]);
        PIMAGE_OPTIONAL_HEADER64 pioh64 = &pinh64->OptionalHeader;
        
        wsprintf(szTemp, "%08X", pioh64->AddressOfEntryPoint);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT1);
        Edit_SetText(hwndTemp, szTemp);

        StringCbPrintf(szTemp, 20, "%016llX", pioh64->ImageBase);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT2);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh64->SizeOfImage);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT3);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh64->BaseOfCode);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT4);
        Edit_SetText(hwndTemp, szTemp);

        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
        Edit_SetText(hwndTemp, "None");

        wsprintf(szTemp, "%08X", pioh64->SectionAlignment);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT6);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh64->FileAlignment);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT7);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%04X", pioh64->Magic);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT8);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%04X", pioh64->Subsystem);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT9);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh64->SizeOfHeaders);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT12);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh64->CheckSum);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT14);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh64->NumberOfRvaAndSizes);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT16);
        Edit_SetText(hwndTemp, szTemp);


        for (int i = 0; i < 0x10; ++i)
        {
            idd[i] = (pioh64->DataDirectory)[i];
        }

        PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(++pinh64);

        for (int i = 0; i < nNumOfSections; ++i, ++pish)
        {
            ish[i] = *pish;
        }

        return; 
    }
    else  //32位image
    {
        PIMAGE_OPTIONAL_HEADER32 pioh32 = &pinh->OptionalHeader;

        wsprintf(szTemp, "%08X", pioh32->AddressOfEntryPoint);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT1);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->ImageBase);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT2);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->SizeOfImage);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT3);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->BaseOfCode);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT4);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->BaseOfData);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->SectionAlignment);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT6);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->FileAlignment);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT7);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%04X", pioh32->Magic);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT8);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%04X", pioh32->Subsystem);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT9);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->SizeOfHeaders);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT12);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->CheckSum);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT14);
        Edit_SetText(hwndTemp, szTemp);

        wsprintf(szTemp, "%08X", pioh32->NumberOfRvaAndSizes);
        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT16);
        Edit_SetText(hwndTemp, szTemp);


        for (int i = 0; i < 0x10; ++i)
        {
            idd[i] = (pioh32->DataDirectory)[i];
        }

        PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(++pinh);

        for (int i = 0; i < nNumOfSections; ++i, ++pish)
        {
            ish[i] = *pish;
        }

    }

}




//输出表对话框       3
INT_PTR ExportTableDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndLV;
    static CHAR szColName[4][50] = { "Ordinal","RVA","Offset","Function Name" };
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)&data[mode ? RVAtoFileOff(idd[0].VirtualAddress) : idd[0].VirtualAddress];
            int nOrder[10] = { IDC_EDIT1,IDC_EDIT2,IDC_EDIT3,IDC_EDIT4,IDC_EDIT6,IDC_EDIT7,IDC_EDIT8,IDC_EDIT9,IDC_EDIT10 };

            //int nValue[10] = {pied->Characteristics,...}; 这样子是不行的
            DWORD *nValue = (DWORD*)malloc(10 * sizeof(DWORD));
            nValue[0] = idd[0].VirtualAddress;
            nValue[1] = pied->Characteristics;
            nValue[2] = pied->Base;
            nValue[3] = pied->Name;
            nValue[4] = pied->NumberOfFunctions;
            nValue[5] = pied->NumberOfNames;
            nValue[6] = pied->AddressOfFunctions;
            nValue[7] = pied->AddressOfNames;
            nValue[8] = pied->AddressOfNameOrdinals;

            CHAR szTemp[80] = { 0 };
            HWND hwndTemp = NULL;
            for (int i = 0; i < 9; ++i)
            {
                hwndTemp = GetDlgItem(hwndDlg, nOrder[i]);
                StringCbPrintf(szTemp, 80, "%08X", nValue[i]);
                Edit_SetText(hwndTemp, szTemp);
            }

            hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
            StringCbPrintf(szTemp, 80, "%s", &data[mode?RVAtoFileOff(pied->Name):pied->Name]);
            Edit_SetText(hwndTemp, szTemp);

            hwndLV = GetDlgItem(hwndDlg, IDC_LIST1);
            LVCOLUMN lvc = { 0 };
            lvc.mask = LVCF_TEXT | LVCF_WIDTH;
            lvc.cx = 100;
            
            for (int i = 0; i < 4; ++i)
            {
                lvc.pszText = szColName[i];
                ListView_InsertColumn(hwndLV, i, &lvc);
            }

            PWORD pOrd = (PWORD)&data[mode ? RVAtoFileOff(pied->AddressOfNameOrdinals) : pied->AddressOfNameOrdinals];
            PDWORD pFun = (PDWORD)&data[mode ? RVAtoFileOff(pied->AddressOfFunctions) : pied->AddressOfFunctions];
            PCHAR pName = (PCHAR)&data[mode ? RVAtoFileOff(pied->Name) : pied->Name]; 
            pName += strlen(pName) + 1;
            PCHAR pTemp = pName;
            LVITEM lvi = { 0 };
            lvi.mask = LVIF_TEXT;
            
            for (int i = 0; i < pied->NumberOfFunctions; ++i)
            {
                if (!pFun[i])
                    continue;

                lvi.iItem = i;
                StringCbPrintf(szTemp, 80, "%d", i + pied->Base);
                lvi.pszText = szTemp;
                ListView_InsertItem(hwndLV, &lvi);

                StringCbPrintf(szTemp, 80, "%08X", pFun[i]);
                ListView_SetItemText(hwndLV, i, 1, szTemp);
                StringCbPrintf(szTemp, 80, "%08X", RVAtoFileOff(pFun[i]));
                ListView_SetItemText(hwndLV, i, 2, szTemp);
                
                int j;
                for (j = 0; j < pied->NumberOfNames; ++j)
                {
                    if (pOrd[j] == i)
                    {
                        pTemp = pName;
                        

                        for (int k = 0; k < j; k++)
                        {
                            pTemp += strlen(pTemp) + 1;
                        }
                        ListView_SetItemText(hwndLV, i, 3, pTemp);
                        break;
                    }
                }
                if (j >= pied->NumberOfNames)
                {
                    ListView_SetItemText(hwndLV, i, 3, "无名");
                }
            }

            break;
        }
        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }

    return FALSE;
}

//输入表对话框       3
INT_PTR ImportTableDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndLV1, hwndLV2;
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            hwndLV1 = GetDlgItem(hwndDlg, IDC_LIST1);
            hwndLV2 = GetDlgItem(hwndDlg, IDC_LIST2);

            ListView_SetExtendedListViewStyle(hwndLV1, LVS_EX_FULLROWSELECT);
            ListView_SetExtendedListViewStyle(hwndLV2, LVS_EX_FULLROWSELECT);

            CHAR szColName1[6][50] = { "DllName","OriginalFirstThunk","TimeDateStamp","ForwarderChain","Name","FirstThunk" };
            CHAR szColName2[5][50] = { "ThunkRVA","ThunkOffset","ThunkValue","Hint","ApiName" };

            LVCOLUMN lvc = { 0 };
            lvc.mask = LVCF_WIDTH | LVCF_TEXT;
            lvc.cx = 100;

            for (int i = 0; i < 6; ++i)
            {
                lvc.pszText = szColName1[i];
                ListView_InsertColumn(hwndLV1, i, &lvc);
            }
            for (int i = 0; i < 5; ++i)
            {
                lvc.pszText = szColName2[i];
                ListView_InsertColumn(hwndLV2, i, &lvc);
            }

            PIMAGE_IMPORT_DESCRIPTOR piid = (PIMAGE_IMPORT_DESCRIPTOR)&data[mode?RVAtoFileOff(idd[1].VirtualAddress):idd[1].VirtualAddress];
            CHAR szTemp[MAX_PATH] = { 0 };
            int k = 0;
            while (piid->FirstThunk)
            {
                LVITEM lvi = { 0 };
                lvi.mask = LVIF_TEXT;
                lvi.iItem = k;
                StringCbPrintf(szTemp, MAX_PATH, "%s", &data[mode ? RVAtoFileOff(piid->Name) : piid->Name]);
                lvi.pszText = szTemp;
                ListView_InsertItem(hwndLV1, &lvi);

                StringCbPrintf(szTemp, MAX_PATH, "%08X", piid->OriginalFirstThunk);
                ListView_SetItemText(hwndLV1, k, 1, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", piid->TimeDateStamp);
                ListView_SetItemText(hwndLV1, k, 2, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", piid->ForwarderChain);
                ListView_SetItemText(hwndLV1, k, 3, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", piid->Name);
                ListView_SetItemText(hwndLV1, k, 4, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", piid->FirstThunk);
                ListView_SetItemText(hwndLV1, k, 5, szTemp);

                ++k;
                ++piid;
            }



            break;
        }

        case WM_NOTIFY:
        {
            switch (((LPNMHDR)(lParam))->code)
            {
                case NM_CLICK:
                {
                    if (((LPNMHDR)(lParam))->hwndFrom == hwndLV1)
                    {
                        ListView_DeleteAllItems(hwndLV2);
                        int nIndex = ListView_GetSelectionMark(hwndLV1);
                        CHAR szBuffer[20] = { 0 };
                        ListView_GetItemText(hwndLV1, nIndex, 5, szBuffer, 20);
                        DWORD dwFirstThunk = HexStrToDec32(szBuffer);

                        if (!bIsPe32Plus)
                        {
                            PIMAGE_THUNK_DATA32 pitd32 = (PIMAGE_THUNK_DATA32)(&data[mode ? RVAtoFileOff(dwFirstThunk) : dwFirstThunk]);

                            CHAR szTemp[100] = { 0 };
                            int k = 0;
                            while (pitd32->u1.Function)
                            {
                                LVITEM lvi = { 0 };
                                lvi.mask = LVIF_TEXT;
                                lvi.iItem = k;

                                StringCbPrintf(szTemp, 100, "%08X", dwFirstThunk + k * 4);
                                lvi.pszText = szTemp;
                                ListView_InsertItem(hwndLV2, &lvi);
                                StringCbPrintf(szTemp, 100, "%08X", RVAtoFileOff(dwFirstThunk + k * 4));
                                ListView_SetItemText(hwndLV2, k, 1, szTemp);
                                StringCbPrintf(szTemp, 100, "%08X", pitd32->u1.Function);
                                ListView_SetItemText(hwndLV2, k, 2, szTemp);


                                if (pitd32->u1.Function & 0x8000'0000) //最高位为1,则为序号
                                {
                                    ListView_SetItemText(hwndLV2, k, 3, "---");
                                    StringCbPrintf(szTemp, 100, "Ordinal:%X h  %d d", pitd32->u1.Function ^ 0x8000'0000, pitd32->u1.Function ^ 0x8000'0000);
                                    ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                }
                                else  //最高位为0,则可能是函数地址,或者是API名称
                                {
                                    if (mode)  //说明是API名称
                                    {
                                        PIMAGE_IMPORT_BY_NAME piibn = (PIMAGE_IMPORT_BY_NAME)&data[RVAtoFileOff(pitd32->u1.Function)];

                                        StringCbPrintf(szTemp, 100, "%04X", piibn->Hint);
                                        ListView_SetItemText(hwndLV2, k, 3, szTemp);
                                        StringCbPrintf(szTemp, 100, "%s", piibn->Name);
                                        ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                    }
                                    else //说明是函数地址
                                    {
                                        ListView_SetItemText(hwndLV2, k, 3, "---");
                                        ListView_SetItemText(hwndLV2, k, 4, "---");
                                    }
                                }


                                ++pitd32;
                                ++k;
                            }
                        }
                        else; //pe32+
                        {
                            PIMAGE_THUNK_DATA64 pitd64 = (PIMAGE_THUNK_DATA64)(&data[mode ? RVAtoFileOff(dwFirstThunk) : dwFirstThunk]);

                            CHAR szTemp[100] = { 0 };
                            int k = 0;
                            while (pitd64->u1.Function)
                            {
                                LVITEM lvi = { 0 };
                                lvi.mask = LVIF_TEXT;
                                lvi.iItem = k;

                                StringCbPrintf(szTemp, 100, "%08X", dwFirstThunk + k * 4);
                                lvi.pszText = szTemp;
                                ListView_InsertItem(hwndLV2, &lvi);
                                StringCbPrintf(szTemp, 100, "%08X", RVAtoFileOff(dwFirstThunk + k * 4));
                                ListView_SetItemText(hwndLV2, k, 1, szTemp);
                                StringCbPrintf(szTemp, 100, "%016llX", pitd64->u1.Function);
                                ListView_SetItemText(hwndLV2, k, 2, szTemp);


                                if (pitd64->u1.Function & 0x8000'0000'0000'0000) //最高位为1,则为序号
                                {
                                    ListView_SetItemText(hwndLV2, k, 3, "---");
                                    StringCbPrintf(szTemp, 100, "Ordinal:%X h  %d d", pitd64->u1.Function ^ 0x8000'0000'0000'0000, pitd64->u1.Function ^ 0x8000'0000'0000'0000);
                                    ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                }
                                else  //最高位为0,则可能是函数地址,或者是API名称
                                {
                                    if (mode)  //说明是API名称
                                    {
                                        PIMAGE_IMPORT_BY_NAME piibn = (PIMAGE_IMPORT_BY_NAME)&data[RVAtoFileOff(pitd64->u1.Function)];

                                        StringCbPrintf(szTemp, 100, "%04X", piibn->Hint);
                                        ListView_SetItemText(hwndLV2, k, 3, szTemp);
                                        StringCbPrintf(szTemp, 100, "%s", piibn->Name);
                                        ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                    }
                                    else //说明是函数地址
                                    {
                                        ListView_SetItemText(hwndLV2, k, 3, "---");
                                        ListView_SetItemText(hwndLV2, k, 4, "---");
                                    }
                                }


                                ++pitd64;
                                ++k;
                            }
                            
                        }
                    }
                    
                    
                    

                    break;
                }
            }
            break;
        }
        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }
    return FALSE;
}

//资源对话框         3
INT_PTR ResourceDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndTV = NULL;
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            hwndTV = GetDlgItem(hwndDlg, IDC_TREE1);
            HWND hwndTemp;
            CHAR szTemp[MAX_PATH] = { 0 };
            WCHAR szTempW[MAX_PATH] = { 0 };
            PIMAGE_RESOURCE_DIRECTORY pird = (PIMAGE_RESOURCE_DIRECTORY)&data[mode ? RVAtoFileOff(idd[2].VirtualAddress) : idd[2].VirtualAddress];

            hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT1);
            StringCbPrintf(szTemp, MAX_PATH, "%04X", pird->NumberOfNamedEntries);
            Edit_SetText(hwndTemp, szTemp);
            hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT2);
            StringCbPrintf(szTemp, MAX_PATH, "%04X", pird->NumberOfIdEntries);
            Edit_SetText(hwndTemp, szTemp);

            PIMAGE_RESOURCE_DIRECTORY_ENTRY pirde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(pird+1);
            
            TVINSERTSTRUCT tvis = { 0 };
            HTREEITEM hParentNode = NULL;

            CHAR szType[0x20][50] = { "XXX","Cursor","Bitmap","Icon","Menu","Dialog" ,"字符串" ,"FontDir" ,"Font" ,"Accelerator" ,"RCData" ,"MessageTable" ,"Group_Cursor" ,"Group_Icon","XXX","XXX","Version" ,"DlgInclude" ,"XXX","PlugPlay","VXD","AniCursor","AniIcon","HTML","Manifest" };
            for (int i = 0; i < pird->NumberOfIdEntries + pird->NumberOfNamedEntries; ++i,++pirde)
            {
                tvis.hParent = NULL;
                tvis.hInsertAfter = TVI_SORT;
                tvis.item.mask = TVIF_TEXT | TVIF_CHILDREN;
                tvis.item.cChildren = 1;
                if (pirde->NameIsString == 0)
                {
                    StringCbPrintfA(szTemp, MAX_PATH, "%s", szType[pirde->Id]);            
                }
                else
                {
                    PIMAGE_RESOURCE_DIR_STRING_U pirdsu = (PIMAGE_RESOURCE_DIR_STRING_U)&data[mode ? RVAtoFileOff(idd[2].VirtualAddress + pirde->NameOffset) : idd[2].VirtualAddress + pirde->NameOffset];
                    StringCbPrintfW(szTempW, pirdsu->Length * 2 + 2, L"%s", pirdsu->NameString);
                    WideCharToMultiByte(CP_ACP, NULL, szTempW, -1, szTemp, wcslen(szTempW) + 1, NULL, FALSE);
                }
                tvis.item.pszText = szTemp;
                tvis.item.cchTextMax = MAX_PATH;
                hParentNode = TreeView_InsertItem(hwndTV, &tvis);

                PIMAGE_RESOURCE_DIRECTORY pird_lv2 = (PIMAGE_RESOURCE_DIRECTORY)&data[mode ? RVAtoFileOff(idd[2].VirtualAddress+pirde->OffsetToDirectory) : idd[2].VirtualAddress+ pirde->OffsetToDirectory];
                
                TVITEM tvi = { 0 };
                tvi.mask = TVIF_PARAM;
                tvi.hItem = hParentNode;
                tvi.lParam = (DWORD(pird_lv2->NumberOfNamedEntries) << 16 | pird_lv2->NumberOfIdEntries);
                TreeView_SetItem(hwndTV, &tvi);

                PIMAGE_RESOURCE_DIRECTORY_ENTRY pirde_lv2 = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(pird_lv2+1);
                tvis.hParent = hParentNode;
                tvis.hInsertAfter = TVI_SORT;
                tvis.item.mask = TVIF_TEXT | TVIF_PARAM;

                for (int j = 0; j < pird_lv2->NumberOfIdEntries + pird_lv2->NumberOfNamedEntries; ++j,++pirde_lv2)
                {
                    if (pirde_lv2->NameIsString == 0)
                    {
                        StringCbPrintfA(szTemp, MAX_PATH, "%d", pirde_lv2->Id);
                    }
                    else
                    {
                        PIMAGE_RESOURCE_DIR_STRING_U pirdsu_lv2 = (PIMAGE_RESOURCE_DIR_STRING_U)&data[mode ? RVAtoFileOff(idd[2].VirtualAddress + pirde_lv2->NameOffset) : idd[2].VirtualAddress + pirde_lv2->NameOffset];
                        StringCbPrintfW(szTempW, pirdsu_lv2->Length * 2 + 2, L"%s", pirdsu_lv2->NameString);
                        WideCharToMultiByte(CP_ACP, NULL, szTempW, -1, szTemp, wcslen(szTempW) + 1, NULL, FALSE);
                    }
                    tvis.item.pszText = szTemp;
                    tvis.item.lParam = 0x8000'0000 | pirde_lv2->OffsetToDirectory;
                    TreeView_InsertItem(hwndTV, &tvis);
                }

            }

            

            break;
        }

        case WM_NOTIFY:
        {
            LPNMHDR lpnmh = (LPNMHDR)lParam;

            switch (lpnmh->code)
            {
                case TVN_SELCHANGED:
                {
                    CHAR szTemp[20] = { 0 };
                    HWND hwndTemp = NULL;
                    HTREEITEM hti = TreeView_GetSelection(hwndTV);

                    TVITEM tvi;
                    tvi.hItem = hti;
                    tvi.mask = TVIF_PARAM;
                    TreeView_GetItem(hwndTV, &tvi);
                    LPARAM tvilParam = tvi.lParam;

                    if (tvilParam & 0x8000'0000) //第三层
                    {
                        LPARAM lPar = tvilParam ^ 0x8000'0000;

                        PIMAGE_RESOURCE_DIRECTORY pird = (PIMAGE_RESOURCE_DIRECTORY)&data[mode ? RVAtoFileOff(idd[2].VirtualAddress + lPar) : idd[2].VirtualAddress + lPar];

                        PIMAGE_RESOURCE_DIRECTORY_ENTRY pirde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(pird + 1);
                        PIMAGE_RESOURCE_DATA_ENTRY pirda = (PIMAGE_RESOURCE_DATA_ENTRY)&data[mode ? RVAtoFileOff(idd[2].VirtualAddress+pirde->OffsetToData) : idd[2].VirtualAddress+pirde->OffsetToData];

                        StringCbPrintf(szTemp, 20, "%08X", pirda->OffsetToData);
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
                        Edit_SetText(hwndTemp, szTemp);
                        StringCbPrintf(szTemp, 20, "%08X", RVAtoFileOff(pirda->OffsetToData));
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT6);
                        Edit_SetText(hwndTemp, szTemp);
                        StringCbPrintf(szTemp, 20, "%08X", pirda->Size);
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT7);
                        Edit_SetText(hwndTemp, szTemp);

                        HTREEITEM hParent = TreeView_GetParent(hwndTV, hti);
                        TVITEM tvi;
                        tvi.hItem = hParent;
                        tvi.mask = TVIF_PARAM;
                        TreeView_GetItem(hwndTV, &tvi);
                        LPARAM lPar2 = tvi.lParam;

                        StringCbPrintf(szTemp, 20, "%04X", HIWORD(lPar2));
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT3);
                        Edit_SetText(hwndTemp, szTemp);

                        StringCbPrintf(szTemp, 20, "%04X", LOWORD(lPar2));
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT4);
                        Edit_SetText(hwndTemp, szTemp);

                    }
                    else //第二层
                    {
                        StringCbPrintf(szTemp, 20, "%04X", HIWORD(tvilParam));
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT3);
                        Edit_SetText(hwndTemp, szTemp);

                        StringCbPrintf(szTemp, 20, "%04X", LOWORD(tvilParam));
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT4);
                        Edit_SetText(hwndTemp, szTemp);

                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
                        Edit_SetText(hwndTemp, "");
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT6);
                        Edit_SetText(hwndTemp, "");
                        hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT7);
                        Edit_SetText(hwndTemp, "");

                    }

                    break;
                }
            }

            break;
        }

        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }
    return FALSE;
}

//重定位对话框       3
INT_PTR RelocationDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndLV1, hwndLV2;
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            hwndLV1 = GetDlgItem(hwndDlg, IDC_LIST1);
            hwndLV2 = GetDlgItem(hwndDlg, IDC_LIST2);

            ListView_SetExtendedListViewStyle(hwndLV1, LVS_EX_FULLROWSELECT);
            ListView_SetExtendedListViewStyle(hwndLV2, LVS_EX_FULLROWSELECT);

            CHAR szColName1[4][50] = { "Index","Section","RVA","Items"};
            CHAR szColName2[5][50] = { "Index","RVA","Offset","Type","Far Address"};

            LVCOLUMN lvc = { 0 };
            lvc.mask = LVCF_WIDTH | LVCF_TEXT;
            lvc.cx = 100;

            for (int i = 0; i < 4; ++i)
            {
                lvc.pszText = szColName1[i];
                ListView_InsertColumn(hwndLV1, i, &lvc);
            }
            for (int i = 0; i < 5; ++i)
            {
                lvc.pszText = szColName2[i];
                ListView_InsertColumn(hwndLV2, i, &lvc);
            }

            PIMAGE_BASE_RELOCATION pibr = (PIMAGE_BASE_RELOCATION)&data[mode ? RVAtoFileOff(idd[5].VirtualAddress) : idd[5].VirtualAddress];
            int k = 0;
            CHAR szTemp[100] = { 0 };
            while (pibr->VirtualAddress)
            {
                memcpy(&ibrl[k], pibr, pibr->SizeOfBlock);
                if (pibr->SizeOfBlock > 0x1000)
                {
                    MessageBox(hwndDlg, "pibr空间不够", "错误信息", MB_OK);
                }
                LVITEM lvi = { 0 };
                lvi.mask = LVIF_TEXT;
                lvi.iItem = k;
                StringCbPrintf(szTemp, 100, "%d", k);
                lvi.pszText = szTemp;
                ListView_InsertItem(hwndLV1, &lvi);
                ListView_SetItemText(hwndLV1, k, 1, RVAToSectionName(pibr->VirtualAddress));
                StringCbPrintf(szTemp, 100, "%08X", pibr->VirtualAddress);
                ListView_SetItemText(hwndLV1, k, 2, szTemp);
                int nCount = ((pibr->SizeOfBlock - 8) / 2);
                StringCbPrintf(szTemp, 100, "%Xh / %dd", nCount,nCount);
                ListView_SetItemText(hwndLV1, k, 3, szTemp);
                
                pibr = (PIMAGE_BASE_RELOCATION)((ULONGLONG)pibr + pibr->SizeOfBlock);
                ++k;
            }

            break;
        }

        case WM_NOTIFY:
        {
            switch (((LPNMHDR)(lParam))->code)
            {
                case NM_CLICK:
                {
                    if (((LPNMHDR)(lParam))->hwndFrom == hwndLV1)
                    {
                        ListView_DeleteAllItems(hwndLV2);
                        int nIndex = ListView_GetSelectionMark(hwndLV1);

                        int nCount = (((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->SizeOfBlock - 8) / 2;
                        CHAR szTemp[100] = { 0 };
                        WORD* pItem = (WORD*)((ULONGLONG)&(((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->SizeOfBlock) + 4);
                        for (int j = 0; j < nCount ; ++j,++pItem)
                        {
                            
                            LVITEM lvi = { 0 };
                            lvi.mask = LVIF_TEXT;
                            lvi.iItem = j;

                            StringCbPrintf(szTemp, 100, "%d", j + 1);
                            lvi.pszText = szTemp;
                            ListView_InsertItem(hwndLV2, &lvi);

                            StringCbPrintf(szTemp, 100, "%08X", ((DWORD)(*pItem) & 0x0fff)+ ((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->VirtualAddress);
                            ListView_SetItemText(hwndLV2, j, 1, szTemp);

                            StringCbPrintf(szTemp, 100, "%08X", RVAtoFileOff(((DWORD)(*pItem) & 0x0fff) + ((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->VirtualAddress));
                            ListView_SetItemText(hwndLV2, j, 2, szTemp);

                            int type = ((*pItem) & 0xf000) >> 12;
                            switch (type)
                            {
                                case IMAGE_REL_BASED_ABSOLUTE:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_ABSOLUTE");
                                    break;
                                }
                                case IMAGE_REL_BASED_HIGH:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_HIGH");
                                    break;
                                }
                                case IMAGE_REL_BASED_LOW:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_LOW");
                                    break;
                                }
                                case IMAGE_REL_BASED_HIGHLOW:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_HIGHLOW");
                                    break;
                                }
                                case IMAGE_REL_BASED_HIGHADJ:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_HIGHADJ");
                                    break;
                                }
                                case IMAGE_REL_BASED_MACHINE_SPECIFIC_5:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_MACHINE_SPECIFIC_5");
                                    break;
                                }
                                case IMAGE_REL_BASED_RESERVED:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_RESERVED");
                                    break;
                                }
                                case IMAGE_REL_BASED_MACHINE_SPECIFIC_7:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_MACHINE_SPECIFIC_7");
                                    break;
                                }
                                case IMAGE_REL_BASED_MACHINE_SPECIFIC_8:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_MACHINE_SPECIFIC_8");
                                    break;
                                }
                                case IMAGE_REL_BASED_MACHINE_SPECIFIC_9:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_MACHINE_SPECIFIC_9");
                                    break;
                                }
                                case IMAGE_REL_BASED_DIR64:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "IMAGE_REL_BASED_DIR64");
                                    break;
                                }
                                default:
                                {
                                    StringCbPrintf(szTemp, 100, "%s", "Others");
                                    break;
                                }
                            }
                            ListView_SetItemText(hwndLV2, j, 3, szTemp);

                            if (bIsPe32Plus) //pe32+的地址是16个字节
                            {
                                StringCbPrintf(szTemp, 100, "%016llX", *(ULONGLONG*)&data[mode ? RVAtoFileOff(((DWORD)(*pItem) & 0x0fff)+ ((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->VirtualAddress) : (*pItem) & 0x0fff+ ((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->VirtualAddress]);
                            }
                            else  //PE32的地址是8个字节
                            {
                                StringCbPrintf(szTemp, 100, "%08X", *(DWORD*)&data[mode ? RVAtoFileOff(((DWORD)(*pItem) & 0x0fff) + ((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->VirtualAddress) : (*pItem) & 0x0fff + ((PIMAGE_BASE_RELOCATION)(ibrl[nIndex]))->VirtualAddress]);
                            }                                                                                //+的优先级高于&,所以这里必须括号
                            ListView_SetItemText(hwndLV2, j, 4, szTemp);


                        }



                    }

                    break;
                }

            }

            break;
        }

        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }
    return FALSE;
}

//TLS表对话框        3
INT_PTR TlsTableDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            if (!bIsPe32Plus)  //pe32
            {
                PIMAGE_TLS_DIRECTORY32 pibr = (PIMAGE_TLS_DIRECTORY32)&data[mode ? RVAtoFileOff(idd[9].VirtualAddress) : idd[9].VirtualAddress];

                CHAR szTemp[100] = { 0 };
                HWND hwndTemp;
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT1);
                StringCbPrintf(szTemp, 100, "%08X", pibr->StartAddressOfRawData);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT2);
                StringCbPrintf(szTemp, 100, "%08X", pibr->EndAddressOfRawData);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT3);
                StringCbPrintf(szTemp, 100, "%08X", pibr->AddressOfIndex);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT4);
                StringCbPrintf(szTemp, 100, "%08X", pibr->AddressOfCallBacks);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
                StringCbPrintf(szTemp, 100, "%08X", pibr->SizeOfZeroFill);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT6);
                StringCbPrintf(szTemp, 100, "%08X", pibr->Characteristics);
                Edit_SetText(hwndTemp, szTemp);
            }
            else  //pe32+
            {
                PIMAGE_TLS_DIRECTORY64 pibr64 = (PIMAGE_TLS_DIRECTORY64)&data[mode ? RVAtoFileOff(idd[9].VirtualAddress) : idd[9].VirtualAddress];

                CHAR szTemp[100] = { 0 };
                HWND hwndTemp;
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT1);
                StringCbPrintf(szTemp, 100, "%016llX", pibr64->StartAddressOfRawData);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT2);
                StringCbPrintf(szTemp, 100, "%016llX", pibr64->EndAddressOfRawData);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT3);
                StringCbPrintf(szTemp, 100, "%016llX", pibr64->AddressOfIndex);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT4);
                StringCbPrintf(szTemp, 100, "%016llX", pibr64->AddressOfCallBacks);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT5);
                StringCbPrintf(szTemp, 100, "%08X", pibr64->SizeOfZeroFill);
                Edit_SetText(hwndTemp, szTemp);
                hwndTemp = GetDlgItem(hwndDlg, IDC_EDIT6);
                StringCbPrintf(szTemp, 100, "%08X", pibr64->Characteristics);
                Edit_SetText(hwndTemp, szTemp);
            }

            break;
        }
        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }
    return FALSE;
}

//延迟输入表对话框   3
INT_PTR DelayImportDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndLV1, hwndLV2;
    
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            hwndLV1 = GetDlgItem(hwndDlg, IDC_LIST2);
            hwndLV2 = GetDlgItem(hwndDlg, IDC_LIST3);

            ListView_SetExtendedListViewStyle(hwndLV1, LVS_EX_FULLROWSELECT);
            ListView_SetExtendedListViewStyle(hwndLV2, LVS_EX_FULLROWSELECT);

            CHAR szColName1[7][50] = { "DllName","OriginalFirstThunk","TimeDateStamp","BoundImportAddressTableRVA","Name","FirstThunk","ModuleHandle" };
            CHAR szColName2[5][50] = { "ThunkRVA","ThunkOffset","ThunkValue","Hint","ApiName" };

            LVCOLUMN lvc = { 0 };
            lvc.mask = LVCF_WIDTH | LVCF_TEXT;
            lvc.cx = 100;

            for (int i = 0; i < 7; ++i)
            {
                lvc.pszText = szColName1[i];
                ListView_InsertColumn(hwndLV1, i, &lvc);
            }
            for (int i = 0; i < 5; ++i)
            {
                lvc.pszText = szColName2[i];
                ListView_InsertColumn(hwndLV2, i, &lvc);
            }

            PIMAGE_DELAYLOAD_DESCRIPTOR pidd = (PIMAGE_DELAYLOAD_DESCRIPTOR)&data[mode ? RVAtoFileOff(idd[13].VirtualAddress) : idd[13].VirtualAddress];
            CHAR szTemp[MAX_PATH] = { 0 };
            int k = 0;
            while (pidd->ImportAddressTableRVA)
            {
                LVITEM lvi = { 0 };
                lvi.mask = LVIF_TEXT;
                lvi.iItem = k;
                StringCbPrintf(szTemp, MAX_PATH, "%s", &data[mode ? RVAtoFileOff(pidd->DllNameRVA) : pidd->DllNameRVA]);
                lvi.pszText = szTemp;
                ListView_InsertItem(hwndLV1, &lvi);

                StringCbPrintf(szTemp, MAX_PATH, "%08X", pidd->ImportNameTableRVA);
                ListView_SetItemText(hwndLV1, k, 1, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", pidd->TimeDateStamp);
                ListView_SetItemText(hwndLV1, k, 2, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", pidd->BoundImportAddressTableRVA);
                ListView_SetItemText(hwndLV1, k, 3, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", pidd->DllNameRVA);
                ListView_SetItemText(hwndLV1, k, 4, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", pidd->ImportAddressTableRVA);
                ListView_SetItemText(hwndLV1, k, 5, szTemp);
                StringCbPrintf(szTemp, MAX_PATH, "%08X", *(DWORD*)&data[mode ? RVAtoFileOff(pidd->ModuleHandleRVA) : pidd->ModuleHandleRVA]);
                ListView_SetItemText(hwndLV1, k, 6, szTemp);
                ++k;
                ++pidd;
            }



            break;
        }

        case WM_NOTIFY:
        {
            switch (((LPNMHDR)(lParam))->code)
            {
                case NM_CLICK:
                {
                    if (((LPNMHDR)(lParam))->hwndFrom == hwndLV1)
                    {
                        ListView_DeleteAllItems(hwndLV2);
                        int nIndex = ListView_GetSelectionMark(hwndLV1);
                        CHAR szBuffer[20] = { 0 };
                        ListView_GetItemText(hwndLV1, nIndex, 1, szBuffer, 20);            //这DelayImport得解析INT,才有名字,IAT即便是在文件中也是个地址
                        DWORD dwFirstThunk = HexStrToDec32(szBuffer);
                        
                        if (!bIsPe32Plus)
                        {
                            PIMAGE_THUNK_DATA32 pitd32 = (PIMAGE_THUNK_DATA32)(&data[mode ? RVAtoFileOff(dwFirstThunk) : dwFirstThunk]);

                            CHAR szTemp[100] = { 0 };
                            int k = 0;
                            while (pitd32->u1.Function)
                            {
                                LVITEM lvi = { 0 };
                                lvi.mask = LVIF_TEXT;
                                lvi.iItem = k;

                                StringCbPrintf(szTemp, 100, "%08X", dwFirstThunk + k * 4);
                                lvi.pszText = szTemp;
                                ListView_InsertItem(hwndLV2, &lvi);
                                StringCbPrintf(szTemp, 100, "%08X", RVAtoFileOff(dwFirstThunk + k * 4));
                                ListView_SetItemText(hwndLV2, k, 1, szTemp);
                                StringCbPrintf(szTemp, 100, "%08X", pitd32->u1.Function);
                                ListView_SetItemText(hwndLV2, k, 2, szTemp);


                                if (pitd32->u1.Function & 0x8000'0000) //最高位为1,则为序号
                                {
                                    ListView_SetItemText(hwndLV2, k, 3, "---");
                                    StringCbPrintf(szTemp, 100, "Ordinal:%X h  %d d", pitd32->u1.Function ^ 0x8000'0000, pitd32->u1.Function ^ 0x8000'0000);
                                    ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                }
                                else  //最高位为0,则可能是函数地址,或者是API名称
                                {
                                    if (mode)  //说明是API名称
                                    {
                                        PIMAGE_IMPORT_BY_NAME piibn = (PIMAGE_IMPORT_BY_NAME)&data[RVAtoFileOff(pitd32->u1.Function)];

                                        StringCbPrintf(szTemp, 100, "%04X", piibn->Hint);
                                        ListView_SetItemText(hwndLV2, k, 3, szTemp);
                                        StringCbPrintf(szTemp, 100, "%s", piibn->Name);
                                        ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                    }
                                    else //说明是函数地址
                                    {
                                        ListView_SetItemText(hwndLV2, k, 3, "---");
                                        ListView_SetItemText(hwndLV2, k, 4, "---");
                                    }
                                }


                                ++pitd32;
                                ++k;
                            }
                        }
                        else  //pe32+
                        {
                            PIMAGE_THUNK_DATA64 pitd64 = (PIMAGE_THUNK_DATA64)(&data[mode ? RVAtoFileOff(dwFirstThunk) : dwFirstThunk]);
                            CHAR szTemp[100] = { 0 };
                            int k = 0;
                            while (pitd64->u1.Function)
                            {
                                LVITEM lvi = { 0 };
                                lvi.mask = LVIF_TEXT;
                                lvi.iItem = k;

                                StringCbPrintf(szTemp, 100, "%08X", dwFirstThunk + k * 4);
                                lvi.pszText = szTemp;
                                ListView_InsertItem(hwndLV2, &lvi);
                                StringCbPrintf(szTemp, 100, "%08X", RVAtoFileOff(dwFirstThunk + k * 4));
                                ListView_SetItemText(hwndLV2, k, 1, szTemp);
                                StringCbPrintf(szTemp, 100, "%016llX", pitd64->u1.Function);
                                ListView_SetItemText(hwndLV2, k, 2, szTemp);


                                if (pitd64->u1.Function & 0x8000'0000'0000'0000) //最高位为1,则为序号
                                {
                                    ListView_SetItemText(hwndLV2, k, 3, "---");
                                    StringCbPrintf(szTemp, 100, "Ordinal:%X h  %d d", pitd64->u1.Function ^ 0x8000'0000'0000'0000, pitd64->u1.Function ^ 0x8000'0000'0000'0000);
                                    ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                }
                                else  //最高位为0,则可能是函数地址,或者是API名称
                                {
                                    if (mode)  //说明是API名称
                                    {
                                        PIMAGE_IMPORT_BY_NAME piibn = (PIMAGE_IMPORT_BY_NAME)&data[RVAtoFileOff(pitd64->u1.Function)];

                                        StringCbPrintf(szTemp, 100, "%04X", piibn->Hint);
                                        ListView_SetItemText(hwndLV2, k, 3, szTemp);
                                        StringCbPrintf(szTemp, 100, "%s", piibn->Name);
                                        ListView_SetItemText(hwndLV2, k, 4, szTemp);
                                    }
                                    else //说明是函数地址
                                    {
                                        ListView_SetItemText(hwndLV2, k, 3, "---");
                                        ListView_SetItemText(hwndLV2, k, 4, "---");
                                    }
                                }


                                ++pitd64;
                                ++k;
                            }
                        }
                    }




                    break;
                }
            }
            break;
        }
        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }
    return FALSE;
}

//数据目录表对话框   2
INT_PTR DataDirectoryDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            CHAR szTemp[20] = { 0 };
            HWND hwndTemp;
            int nOrder[0x20] =
            { IDC_EDIT1,IDC_EDIT2,IDC_EDIT3,IDC_EDIT4,IDC_EDIT5,IDC_EDIT6,IDC_EDIT7,IDC_EDIT8,IDC_EDIT33, IDC_EDIT34, IDC_EDIT9,IDC_EDIT10,IDC_EDIT11,IDC_EDIT12,IDC_EDIT13,IDC_EDIT14,IDC_EDIT15,IDC_EDIT16,IDC_EDIT17,IDC_EDIT18,IDC_EDIT19,IDC_EDIT20,IDC_EDIT21,IDC_EDIT22,IDC_EDIT23,IDC_EDIT24,IDC_EDIT25,IDC_EDIT26,IDC_EDIT27,IDC_EDIT28,IDC_EDIT29,IDC_EDIT30 };
            for (int i = 0; i < 0x10; ++i)
            {
                wsprintf(szTemp, "%08X", idd[i].VirtualAddress);
                hwndTemp = GetDlgItem(hwndDlg, nOrder[2*i]);
                Edit_SetText(hwndTemp, szTemp);

                wsprintf(szTemp, "%08X", idd[i].Size);
                hwndTemp = GetDlgItem(hwndDlg, nOrder[2*i+1]);
                Edit_SetText(hwndTemp, szTemp);
            }
            

            break;
        }

        case WM_COMMAND:
        {
            switch (LOWORD(wParam))  //每个一个DialogBox
            {
                case IDC_BUTTON1:  //Export Table
                {
                    if (idd[0].Size == 0)
                    {
                        MessageBox(hwndDlg, "输出表不存在", "错误信息", MB_OK);
                        break;
                    }
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG5), hwndDlg, (DLGPROC)ExportTableDlg);
                    break;
                }
                case IDC_BUTTON2:  //Import Table
                {
                    if (idd[1].Size == 0)
                    {
                        MessageBox(hwndDlg, "输入表不存在", "错误信息", MB_OK);
                        break;
                    }
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG6), hwndDlg, (DLGPROC)ImportTableDlg);
                    break;
                }
                case IDC_BUTTON3:  //Resource
                {
                    if (idd[2].Size == 0)
                    {
                        MessageBox(hwndDlg, "资源表不存在", "错误信息", MB_OK);
                        break;
                    }
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG7), hwndDlg, (DLGPROC)ResourceDlg);
                    break;
                }
                case IDC_BUTTON4:  //Relocation
                {
                    if (idd[5].Size == 0)
                    {
                        MessageBox(hwndDlg, "重定位表不存在", "错误信息", MB_OK);
                        break;
                    }
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG8), hwndDlg, (DLGPROC)RelocationDlg);
                    break;
                }
                case IDC_BUTTON5:  //TlsTable
                {
                    if (idd[9].Size == 0)
                    {
                        MessageBox(hwndDlg, "TLS表不存在", "错误信息", MB_OK);
                        break;
                    }
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG9), hwndDlg, (DLGPROC)TlsTableDlg);
                    break;
                }
                case IDC_BUTTON7:  //DelayImport
                {
                    if (idd[13].Size == 0)
                    {
                        MessageBox(hwndDlg, "延迟输入表不存在", "错误信息", MB_OK);
                        break;
                    }
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG10), hwndDlg, (DLGPROC)DelayImportDlg);
                    break;
                }
            }
            break;
        }

        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }
    return FALSE;
}

//区段对话框         2
INT_PTR SectionDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndSectionListView = NULL;
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            RECT rc = { 0 };
            GetWindowRect(hwndDlg, &rc);

            hwndSectionListView = CreateWindow(WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS,
                0, 0, 0, 0, hwndDlg, NULL, g_hInst, NULL);
            ListView_SetExtendedListViewStyle(hwndSectionListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
            SetWindowPos(hwndSectionListView, HWND_TOP, 0, 50,
                rc.right - rc.left, rc.bottom - rc.top - 100, SWP_SHOWWINDOW);

            LVCOLUMN lvc = { 0 };

            lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
            lvc.cx = 150;
            lvc.fmt = LVCFMT_LEFT;

            for (int i = 0; i < nSectionColNum; ++i)
            {
                lvc.pszText = szSectionColName[i];
                ListView_InsertColumn(hwndSectionListView, i, &lvc);
            }

            LVITEM lvi = { 0 };
            lvi.mask = LVIF_TEXT;
            CHAR szTemp[20] = { 0 };
            for (int i = 0; i < nNumOfSections; ++i)
            {
                lvi.iItem = i;
                lvi.iSubItem = 0;
                lvi.pszText = (CHAR*)&ish[i].Name;
                ListView_InsertItem(hwndSectionListView, &lvi);

                wsprintf(szTemp, "%08X", ish[i].VirtualAddress);
                ListView_SetItemText(hwndSectionListView, i, SectionColPos::scp_voffset, szTemp);

                wsprintf(szTemp, "%08X", ish[i].Misc.VirtualSize);
                ListView_SetItemText(hwndSectionListView, i, SectionColPos::scp_vsize, szTemp);

                wsprintf(szTemp, "%08X", ish[i].PointerToRawData);
                ListView_SetItemText(hwndSectionListView, i, SectionColPos::scp_roffset, szTemp);

                wsprintf(szTemp, "%08X", ish[i].SizeOfRawData);
                ListView_SetItemText(hwndSectionListView, i, SectionColPos::scp_rsize, szTemp);

                wsprintf(szTemp, "%08X", ish[i].Characteristics);
                ListView_SetItemText(hwndSectionListView, i, SectionColPos::scp_flags, szTemp);
            }

            break;
        }

        case WM_CLOSE:
        {
            EndDialog(hwndDlg, 0);
            break;
        }
    }

    return FALSE;
}

//PE对话框           1             //后面的数字代表层次
INT_PTR PEDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            GetBasicPEInfo(hwndDlg);

            break;
        }

        case WM_COMMAND:
        {

            switch (LOWORD(wParam))
            {
                case IDC_BUTTON1: //Sections
                {
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG3), hwndDlg, (DLGPROC)SectionDlg);
                    break;
                }
                case IDC_BUTTON2: //Directories
                {
                    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG4), hwndDlg, (DLGPROC)DataDirectoryDlg);
                    break;
                }
            }


            break;
        }

        case WM_CLOSE:
        {
            free(data);
            EndDialog(hwndDlg, 0);
            break;
        }
    }



    return FALSE;
}



//PE对话框线程的入口函数
DWORD PEInfoDlg(LPVOID lpParam)
{
    bIsPe32Plus = FALSE;
    mode = (INT64)lpParam; //0代表是内存,否则就是磁盘文件完整路径

    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG2), hwndMainWnd, (DLGPROC)PEDlg);

    return 0;
}

以下是资源文件.rc:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDR_MENU1 MENU
BEGIN
    POPUP "文件"
    BEGIN
        MENUITEM "打开PE文件",                      ID_40001
        MENUITEM "得到更多信息",                      ID_40017
    END
    POPUP "选项"
    BEGIN
        MENUITEM "置于顶层",                        ID_40004
    END
    POPUP "查看"
    BEGIN
        MENUITEM "立即刷新",                        ID_40005
    END
END

IDR_MENU2 MENU
BEGIN
    POPUP "ProcessTabMenu"
    BEGIN
        MENUITEM "结束进程",                        ID_PROCESSTABMENU_40010
        MENUITEM "进程属性",                        ID_PROCESSTABMENU_40011
        MENUITEM "得到PE信息",                      ID_PROCESSTABMENU_40012
        MENUITEM "代码注入",                        ID_PROCESSTABMENU_40013
        MENUITEM "保护该进程",                       ID_PROCESSTABMENU_40014
        MENUITEM "注入DLL",                       ID_PROCESSTABMENU_40016
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 305, 260
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END

IDD_DIALOG2 DIALOGEX 0, 0, 347, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[PE Editor]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    GROUPBOX        "Basic PE Header Information",IDC_STATIC,7,7,252,186
    LTEXT           "EntryPoint",IDC_STATIC,7,24,34,8
    LTEXT           "ImageBase",IDC_STATIC,7,46,36,8
    LTEXT           "SizeOfImage",IDC_STATIC,7,66,42,8
    LTEXT           "BaseOfCode",IDC_STATIC,7,84,41,8
    LTEXT           "BaseOfData",IDC_STATIC,7,105,40,8
    LTEXT           "SectionAlignment",IDC_STATIC,7,126,56,8
    LTEXT           "FileAlignment",IDC_STATIC,7,151,43,8
    LTEXT           "Magic",IDC_STATIC,7,170,19,8
    EDITTEXT        IDC_EDIT1,55,25,51,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,55,47,51,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT3,55,67,52,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT4,55,86,51,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT5,55,106,51,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT6,55,127,51,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT7,55,152,51,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT8,55,171,52,14,ES_AUTOHSCROLL
    LTEXT           "Subsystem",IDC_STATIC,120,24,36,8
    LTEXT           "NumberOfSections",IDC_STATIC,120,46,60,8
    LTEXT           "TimeDateStamp",IDC_STATIC,120,66,51,8
    LTEXT           "SizeOfHeaders",IDC_STATIC,120,84,48,8
    LTEXT           "Characteristics",IDC_STATIC,120,105,48,8
    LTEXT           "Checksum",IDC_STATIC,120,126,33,8
    LTEXT           "SizeOfOptionalHeader",IDC_STATIC,120,151,72,8
    LTEXT           "NumOfRvaAndSizes",IDC_STATIC,120,170,64,8
    EDITTEXT        IDC_EDIT9,191,23,54,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT10,191,45,54,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT11,191,65,54,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT12,191,83,54,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT13,191,104,53,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT14,191,125,54,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT15,191,150,53,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT16,191,169,53,14,ES_AUTOHSCROLL
    PUSHBUTTON      "Sections",IDC_BUTTON1,276,22,50,14
    PUSHBUTTON      "Directories",IDC_BUTTON2,276,65,50,14
END

IDD_DIALOG3 DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[Section Table]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END

IDD_DIALOG4 DIALOGEX 0, 0, 299, 324
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[Directory Table]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    GROUPBOX        "Directory Information",IDC_STATIC,7,7,226,294
    LTEXT           "ExportTable",IDC_STATIC,7,47,40,8
    LTEXT           "ImportTable",IDC_STATIC,7,65,40,8
    LTEXT           "Resource",IDC_STATIC,7,82,31,8
    LTEXT           "Exception",IDC_STATIC,7,99,32,8
    LTEXT           "Security",IDC_STATIC,7,116,27,8
    LTEXT           "Relocation",IDC_STATIC,7,134,34,8
    LTEXT           "Debug",IDC_STATIC,7,152,22,8
    LTEXT           "Copyright",IDC_STATIC,7,166,32,8
    LTEXT           "GlobalPtr",IDC_STATIC,7,185,30,8
    LTEXT           "TlsTable",IDC_STATIC,7,201,27,8
    LTEXT           "LoadConfig",IDC_STATIC,7,218,37,8
    LTEXT           "BoundImport",IDC_STATIC,7,235,42,8
    LTEXT           "IAT",IDC_STATIC,7,252,12,8
    LTEXT           "DelayImport",IDC_STATIC,7,271,40,8
    LTEXT           "COM",IDC_STATIC,7,289,16,8
    LTEXT           "Reserved",IDC_STATIC,7,309,32,8
    EDITTEXT        IDC_EDIT1,73,47,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,135,47,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT3,73,65,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT4,135,65,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT5,73,82,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT6,135,82,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT7,73,99,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT8,135,99,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT9,74,134,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT10,135,134,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT11,73,152,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT12,135,152,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT13,73,166,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT14,135,166,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT15,73,185,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT16,135,185,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT17,73,201,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT18,135,201,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT19,73,218,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT20,135,218,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT21,73,235,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT22,135,235,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT23,73,252,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT24,135,252,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT25,73,271,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT26,135,271,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT27,73,289,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT28,135,289,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT29,72,303,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT30,135,303,40,14,ES_AUTOHSCROLL
    LTEXT           "RVA",IDC_STATIC,81,25,14,8
    LTEXT           "Size",IDC_STATIC,137,25,14,8
    PUSHBUTTON      "...",IDC_BUTTON1,189,47,14,14
    PUSHBUTTON      "...",IDC_BUTTON2,189,65,14,14
    PUSHBUTTON      "...",IDC_BUTTON3,189,82,14,14
    PUSHBUTTON      "...",IDC_BUTTON4,189,134,14,14
    PUSHBUTTON      "...",IDC_BUTTON5,189,201,14,14
    PUSHBUTTON      "...",IDC_BUTTON7,189,272,14,14
    EDITTEXT        IDC_EDIT33,73,116,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT34,135,116,40,14,ES_AUTOHSCROLL
END

IDD_DIALOG5 DIALOGEX 0, 0, 327, 248
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[ Export Table]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    GROUPBOX        "Export Information",IDC_STATIC,7,7,239,119
    CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,133,313,108
    LTEXT           "OffToExpTbl",IDC_STATIC,7,21,41,8
    LTEXT           "Characteristic",IDC_STATIC,7,40,45,8
    LTEXT           "Base",IDC_STATIC,7,59,16,8
    LTEXT           "Name",IDC_STATIC,7,77,19,8
    LTEXT           "NameStr",IDC_STATIC,7,99,28,8
    LTEXT           "NumOfFuncs",IDC_STATIC,139,21,42,8
    LTEXT           "NumOfNames",IDC_STATIC,139,40,44,8
    LTEXT           "AddrOfFuncs",IDC_STATIC,139,59,43,8
    LTEXT           "AddrOfNames",IDC_STATIC,139,77,46,8
    LTEXT           "AddrOfOrds",IDC_STATIC,139,99,40,8
    EDITTEXT        IDC_EDIT1,64,21,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,63,40,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT3,63,59,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT4,63,77,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT5,41,99,61,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT6,188,21,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT7,188,40,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT8,188,59,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT9,188,77,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT10,188,99,40,14,ES_AUTOHSCROLL
END

IDD_DIALOG6 DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[Import Table]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,295,63
    CONTROL         "",IDC_LIST2,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,70,295,99
END

IDD_DIALOG7 DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[Resource Directory]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,182,162
    GROUPBOX        "Root Directory",IDC_STATIC,197,7,105,42
    GROUPBOX        "Selected Directory",IDC_STATIC,197,54,105,37
    GROUPBOX        "Selected Item",IDC_STATIC,198,99,104,70
    LTEXT           "Name Entries",IDC_STATIC,197,19,43,8
    LTEXT           "ID Entries",IDC_STATIC,197,33,32,8
    EDITTEXT        IDC_EDIT1,245,18,57,14,ES_AUTOHSCROLL | ES_READONLY
    EDITTEXT        IDC_EDIT2,245,32,57,14,ES_AUTOHSCROLL | ES_READONLY
    LTEXT           "Name Entries",IDC_STATIC,197,66,43,8
    LTEXT           "ID Entires",IDC_STATIC,197,79,32,8
    EDITTEXT        IDC_EDIT3,245,63,57,14,ES_AUTOHSCROLL | ES_READONLY
    EDITTEXT        IDC_EDIT4,245,77,57,14,ES_AUTOHSCROLL | ES_READONLY
    LTEXT           "RVA",IDC_STATIC,198,110,14,8
    LTEXT           "Offset",IDC_STATIC,198,129,22,8
    LTEXT           "Size",IDC_STATIC,197,151,14,8
    EDITTEXT        IDC_EDIT5,245,108,57,14,ES_AUTOHSCROLL | ES_READONLY
    EDITTEXT        IDC_EDIT6,245,130,57,14,ES_AUTOHSCROLL | ES_READONLY
    EDITTEXT        IDC_EDIT7,246,148,56,14,ES_AUTOHSCROLL | ES_READONLY
END

IDD_DIALOG8 DIALOGEX 0, 0, 309, 208
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[ Relocation ]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    GROUPBOX        "Blocks",IDC_STATIC,7,7,295,76
    GROUPBOX        "Block Items",IDC_STATIC,7,90,295,111
    CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,15,295,67
    CONTROL         "",IDC_LIST2,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,103,295,98
END

IDD_DIALOG9 DIALOGEX 0, 0, 225, 144
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[TLS Table]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    GROUPBOX        "TLS Information",IDC_STATIC,7,7,155,128
    LTEXT           "DataBlockStartVA",IDC_STATIC,7,25,57,8
    LTEXT           "DataBlockEndVA",IDC_STATIC,7,41,53,8
    LTEXT           "IndexVariableVA",IDC_STATIC,7,61,54,8
    LTEXT           "CallBackTableVA",IDC_STATIC,7,79,53,8
    LTEXT           "SizeOfZeroFill",IDC_STATIC,7,95,44,8
    LTEXT           "Characteristics",IDC_STATIC,7,113,48,8
    EDITTEXT        IDC_EDIT1,106,25,56,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,106,41,56,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT3,106,61,55,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT4,106,79,56,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT5,106,95,56,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT6,106,113,56,14,ES_AUTOHSCROLL
END

IDD_DIALOG10 DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "",IDC_LIST2,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,295,62
    CONTROL         "",IDC_LIST3,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,68,295,101
END

IDD_DIALOG11 DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "[Inject Code]"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    EDITTEXT        IDC_EDIT1,133,63,89,42,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL
    LTEXT           "VA to inject(in hex)",IDC_STATIC1,7,38,87,8
    EDITTEXT        IDC_EDIT2,133,38,50,14,ES_UPPERCASE | ES_AUTOHSCROLL
    LTEXT           "目标地址的若干条指令",IDC_STATIC,7,62,85,8
    PUSHBUTTON      "得到指令",IDC_BUTTON1,241,63,50,14
    LTEXT           "要注入的指令",IDC_STATIC,7,119,49,8
    EDITTEXT        IDC_EDIT3,133,123,90,46,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL
    PUSHBUTTON      "注入指令",IDC_BUTTON2,242,124,50,14
    LTEXT           "Static",IDC_STATIC2,59,17,174,8
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 298
        TOPMARGIN, 7
        BOTTOMMARGIN, 253
    END

    IDD_DIALOG2, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 340
        TOPMARGIN, 7
        BOTTOMMARGIN, 193
    END

    IDD_DIALOG3, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 169
    END

    IDD_DIALOG4, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 292
        TOPMARGIN, 7
        BOTTOMMARGIN, 317
    END

    IDD_DIALOG5, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 320
        TOPMARGIN, 7
        BOTTOMMARGIN, 241
    END

    IDD_DIALOG6, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 169
    END

    IDD_DIALOG7, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 169
    END

    IDD_DIALOG8, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 201
    END

    IDD_DIALOG9, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 218
        TOPMARGIN, 7
        BOTTOMMARGIN, 137
    END

    IDD_DIALOG10, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 169
    END

    IDD_DIALOG11, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 169
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//

IDD_DIALOG1 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG2 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG3 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG4 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG5 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG6 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG7 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG8 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG9 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG10 AFX_DIALOG_LAYOUT
BEGIN
    0
END

IDD_DIALOG11 AFX_DIALOG_LAYOUT
BEGIN
    0
END

#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

以下是

posted on 2017-03-25 19:21  fuckitup123  阅读(694)  评论(0编辑  收藏  举报