⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resourcedirectory.cpp

📁 一个用BCB写的壳!
💻 CPP
字号:
#include "stdafx.h"
#include "resourcedirectory.h"
#include "util.h"

using namespace std;

namespace PE {

CResourceDirectory::CResourceDirectory(LPBYTE pData, LPBYTE pBase, BOOL bRoot)
: m_pBase(pBase),
  m_strName("")
{
    CopyMemory(&m_rd, pData, sizeof(IMAGE_RESOURCE_DIRECTORY));

    LPBYTE pEntries = (pData + sizeof(IMAGE_RESOURCE_DIRECTORY));
    int nNumEntries = m_rd.NumberOfIdEntries + m_rd.NumberOfNamedEntries;

    // Load entries/directories
    for (int i = 0; i < nNumEntries; i++) {
        CResourceEntry *pre = new CResourceEntry(pEntries, pBase);
        
        if (pre) {
            IMAGE_RESOURCE_DIRECTORY_ENTRY rde;
            pre->GetDirInfo(&rde);

            if (rde.DataIsDirectory) {
                LPBYTE pDir = &pBase[rde.OffsetToDirectory];

                // Determine name
                string strName;

                if (rde.NameIsString) {
                    // Name is specified
                    LPBYTE pName = &pBase[rde.NameOffset];
                    strName = CUtil::GetResourceString(pName);
                } else {
                    // Name's not specified, check names table
                    if (rde.Id < 17 && bRoot == TRUE) {
                        strName = CUtil::GetResourceName(rde.Id);
                    } else {
                        char szName[64];
                        wsprintf(szName, "#%u", rde.Id);
                        strName = szName;
                    }
                }
                
                CResourceDirectory *prd = new CResourceDirectory(pDir, pBase);
                
                // Set name
                prd->SetName(strName);

                m_lstDirs.push_back(prd);
                delete pre;
            } else {
                // Add to entries list
                m_lstEntries.push_back(pre);
            }
        }

        pEntries += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
    }
}

CResourceDirectory::~CResourceDirectory(void)
{
    // Clean entries
    resEntIterator ei;

    for (ei = m_lstEntries.begin(); ei != m_lstEntries.end(); ei++) {
        CResourceEntry *pre = (*ei);
        if (pre) {
            delete pre;
        }
    }

    m_lstEntries.clear();

    // Clean directories
    resDirIterator di;

    for (di = m_lstDirs.begin(); di != m_lstDirs.end(); di++) {
        CResourceDirectory *prd = (*di);
        if (prd) {
            delete prd;
        }
    }

    m_lstDirs.clear();
}

void CResourceDirectory::GetInfo(IMAGE_RESOURCE_DIRECTORY *prd)
{
    if (IsBadWritePtr(prd, sizeof(IMAGE_RESOURCE_DIRECTORY)) == FALSE) {
        CopyMemory(prd, &m_rd, sizeof(IMAGE_RESOURCE_DIRECTORY));
    }
}

DWORD CResourceDirectory::GetNumDirectories(void) const
{
    return(m_lstDirs.size());
}

CResourceDirectory *CResourceDirectory::GetDirectory(DWORD dwIndex) const
{
    if (dwIndex < GetNumDirectories()) {
        resDirCIterator i;
        
        for (i = m_lstDirs.begin(); dwIndex; i++, dwIndex--);
        CResourceDirectory *prd = (*i);

        return(prd);
    }

    return(0);
}

DWORD CResourceDirectory::GetNumEntries(void) const
{
    return(m_lstEntries.size());
}

CResourceEntry *CResourceDirectory::GetEntry(DWORD dwIndex) const
{
    if (dwIndex < GetNumEntries()) {
        resEntCIterator i;

        for (i = m_lstEntries.begin(); dwIndex; i++, dwIndex--);
        CResourceEntry *pre = (*i);

        return(pre);
    }

    return(0);
}

void CResourceDirectory::SetName(string strName)
{
    m_strName = strName;
}

string CResourceDirectory::GetName(void) const
{
    return(m_strName);
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -