首页
社区
课程
招聘
[求助]谁有遍历过PE文件资源表的现成代码给我一份。。。急
发表于: 2012-12-5 18:28 6537

[求助]谁有遍历过PE文件资源表的现成代码给我一份。。。急

2012-12-5 18:28
6537
函数的原型如下
DWORD MovResource(LPVOID ResourceAddr , LPVOID TargetAddr);

返回值资源的总大小,就是所以移动的数据。

第一个参数是资源表的VA,当然可以是RVA,写的时候注明即可,还有需要传入文件基址的话传入也可以,也可以在函数内部动态获取,当然也可以当做基址已经知道,直接传进来用,这个不是重点。

第二个参数是目标地址。

不能直接根据数据目录那个结构体里面提供的那个 Size 直接移动,要遍历资源的内部结构,我正是因为那样直接用的那个Size最后错了,所以需要遍历资源的内部结构体。

先谢谢了。。。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 61
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
老是有人读贴,却从未有人回帖。。。
2012-12-14 16:19
0
雪    币: 299
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
void RESOURCE_Dlg::MakeTree(HTREEITEM hitem,IMAGE_RESOURCE_DIRECTORY* lpIMAGE_RESOURCE_DIRECTORY)
{
        WORD nCount = lpIMAGE_RESOURCE_DIRECTORY->NumberOfIdEntries + lpIMAGE_RESOURCE_DIRECTORY->NumberOfNamedEntries;
        IMAGE_RESOURCE_DIRECTORY_ENTRY* lpRESOURCE_DIRECTORY = (struct _IMAGE_RESOURCE_DIRECTORY_ENTRY *)(lpIMAGE_RESOURCE_DIRECTORY + 1);
        for (int i = 0 ; i < nCount; i ++)
        {
               
                if (lpRESOURCE_DIRECTORY->DataIsDirectory == 1)
                {
                        CString csTemp;
                        DWORD RESOURCEAdder = lpRESOURCE_DIRECTORY->OffsetToDirectory + (DWORD)m_lpIMAGE_RESOURCE_DIRECTORY;

                        csTemp.Format("资源编号%d : 目录地址%p",lpRESOURCE_DIRECTORY->Id,lpRESOURCE_DIRECTORY->OffsetToDirectory + m_dwMemImageBase);

                        HTREEITEM newhitem = m_TreeRESOURCE.InsertItem(csTemp,hitem);
               
                        MakeTree(newhitem,(struct _IMAGE_RESOURCE_DIRECTORY *)RESOURCEAdder);
                }
                else
                {
                        CString csTemp;
                        DWORD RESOURCEAdder = lpRESOURCE_DIRECTORY->OffsetToDirectory + (DWORD)m_lpIMAGE_RESOURCE_DIRECTORY;
                        IMAGE_RESOURCE_DATA_ENTRY * lpRESOURCE_DATA = (struct _IMAGE_RESOURCE_DATA_ENTRY *)(lpRESOURCE_DIRECTORY->OffsetToDirectory + (DWORD)m_lpIMAGE_RESOURCE_DIRECTORY);

                        csTemp.Format("数据地址%p,数据长度%p",lpRESOURCE_DATA->OffsetToData,lpRESOURCE_DATA->Size);
                       
                        m_TreeRESOURCE.InsertItem(csTemp,hitem);
                }
                lpRESOURCE_DIRECTORY++;
        }

        return;
}

BOOL RESOURCE_Dlg::OnInitDialog()
{
        CDialog::OnInitDialog();
       
        m_TreeRESOURCE.DeleteAllItems();
        HTREEITEM hitem = m_TreeRESOURCE.InsertItem("资源表");
        MakeTree(hitem,m_lpIMAGE_RESOURCE_DIRECTORY);
        SetWindowLong(m_hWnd,GWL_STYLE,
       GetWindowLong(m_hWnd,GWL_STYLE)|TVS_CHECKBOXES|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT);
        return TRUE;  // return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX Property Pages should return FALSE
}

翻了下当时写的作业,希望对你有帮助。
按你这函数原型估计很少人那样写。

上传的附件:
2012-12-14 20:43
0
雪    币: 61
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看到有人回帖,激动万分啊。。。太感谢兄弟了,我写个壳,写到这里然后断码了,发个帖子等待回复。。。差点就等不下去了。。。
2012-12-15 22:53
0
雪    币: 61
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大哥。。。你那是个商业软件吗?  不是的话 开源了吧      你给我的那一个函数,我用不了。。。貌似里面有个资源树的  类,应该是操作二叉树的吧,我看过资源,就是二叉树的方式。。。开源了,绝对是个精华,给我们这些小菜学习学习。。。反正就看你那一个函数,便知道,源码设计的特别好。。。
2012-12-15 23:47
0
游客
登录 | 注册 方可回帖
返回
//