首页
社区
课程
招聘
[求助]关于PE输入表修复的问题——源自linxer代码
发表于: 2011-3-10 07:32 5215

[求助]关于PE输入表修复的问题——源自linxer代码

2011-3-10 07:32
5215
这两天翻出了以前linxer的一段代码
http://bbs.pediy.com/showthread.php?t=27134&page=2

有一个疑惑想请教下
  //循环扫描每个将有函数导入的dll
    for(; pIID->Name != NULL; pIID++)
    {
      /*曾看过OllyDump源代码,那里在重建导入表的时候,并没有初始化OriginalFirstThunk这个字段,
      所以这里也不对OriginalFirstThunk这个字段进行处理了*/
      IMAGE_THUNK_DATA *pITD = (IMAGE_THUNK_DATA *)(lpDynPEBuff + pIID->FirstThunk);

      HINSTANCE hInstance = LoadLibrary(lpDynPEBuff + pIID->Name);
      if(hInstance == NULL)
      {
        //导入这个dll失败
        delete lpDynPEBuff;
        return false;
      }

这里用LoadLibrary导入的dll,然后用查找函数的地址替换节中的数据,可是我发现查找到的comdlg32.dll或是其他的dll都无法正常加载。GetLastError()报一个126错误(找不到模块)。

有人说可能是依赖关系没有解决(我不知道是否是这个原因),可是如果这样,那么在加载PE的时候,系统是怎么判断依赖关系呢?

不知道大家有什么想法没?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
exe通过导入表知道依赖哪些dll,dll也可以有导入表啊,这就是一个递归的过程,直到该exe所需的所以dll都加载为止。
2011-3-10 10:10
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯,我再研究下,谢谢……
2011-3-10 23:09
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
// 循环扫描每个将要导入的dll
        for (; pIID->Name != NULL; pIID++)
        {
            //IMAGE_THUNK_DATA* pITD = (IMAGE_THUNK_DATA*)(lpDynPEBuf + pIID->FirstThunk);            
            PIMAGE_THUNK_DATA pRealIAT = (PIMAGE_THUNK_DATA)((unsigned long)lpDynPEBuf + pIID->FirstThunk);  
            PIMAGE_THUNK_DATA pOriginalIAT = (PIMAGE_THUNK_DATA)((unsigned long)lpDynPEBuf + pIID->OriginalFirstThunk);

            HINSTANCE hInstance = LoadLibraryA((LPCSTR)lpDynPEBuf + pIID->Name); assert(hInstance);

            //循环扫描dll内每个被导入函数
            for(; pOriginalIAT->u1.Ordinal != 0; pOriginalIAT++)
            {
                FARPROC fpFun = NULL;
                if(pOriginalIAT->u1.Ordinal & IMAGE_ORDINAL_FLAG32)
                {
                    //函数是以序号的方式导入的
                    fpFun = GetProcAddress(hInstance, (LPCSTR)(pOriginalIAT->u1.Ordinal & 0x0000ffff));
                }
                else
                {
                    //函数是以名称方式导入的
                    IMAGE_IMPORT_BY_NAME* pIIBN = (IMAGE_IMPORT_BY_NAME *)((DWORD)lpDynPEBuf + (DWORD)pOriginalIAT->u1.Ordinal);
                    fpFun = GetProcAddress(hInstance, (char *)pIIBN->Name);
                }

                pRealIAT->u1.Ordinal = (long)fpFun;
            }

            FreeLibrary(hInstance);
            hInstance = NULL;
        } //  end for
2011-3-16 10:19
0
游客
登录 | 注册 方可回帖
返回
//