首页
社区
课程
招聘
[讨论]论坛上两篇PE加载代码有点小问题
发表于: 2010-12-21 21:18 3603

[讨论]论坛上两篇PE加载代码有点小问题

2010-12-21 21:18
3603
我弄了一整天,发现了个小问题。

处理导入表的时候 一般都是用 LoadLibrary 然后 GetProcAddress 对吧

但是 GetProcAddress 获取地址以后 FreeLibrary 这个dll 那刚才获取的地址不就没用了,对吧 

dll文件里面的 函数关系很复杂的说,

简单说明一下

刚开始 pe加载器 最少有两个dll文件 

ntdll.dll
kernerl32.dll

A:
然后 加载 LoadLiarary(user32.dll) 提取函数地址。。。
然后 释放 FreeLibrary(user32.dll)  A提取的函数地址全部失效,无用了

B:
然后 加载 LoadLibrary(gdi32.dll) 提取函数地址。。。
加载 gdi32.dll 文件的时候 他会自动加载别的系统dll文件,比如 user32.dll ……
然后上面 A 的地址又变成全部有效了
然后 释放 FreeLibrary(gdi32.dll)  B提取的函数地址全部失效,无用了

C:……
D:……
E:……

然后然后全部加载完需要的dll文件

如果运行好 关联的那些都加载进去了 程序就可以运行

不然 运行到需要这些函数的时候,就会出现 内存无法访问!

 
我是在 VC9.0  windows xp sp2  windows 2003 sp2 上测试的

http://bbs.pediy.com/showthread.php?t=27134
HINSTANCE hInstance = [COLOR="Red"]LoadLibrary[/COLOR](lpDynPEBuff + pIID->Name);
      if(hInstance == NULL)
      {
        //导入这个dll失败
        delete lpDynPEBuff;
        return false;
      }

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

        if(fpFun == NULL)
        {
          //导出这个函数失败
          delete lpDynPEBuff;
          return false;
        }

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

      [COLOR="Red"]FreeLibrary[/COLOR](hInstance);


http://bbs.pediy.com/showthread.php?t=100635 

HINSTANCE hInstance = [COLOR="Red"]LoadLibraryA[/COLOR]((LPCSTR)pImp->Name);
    if (NULL == hInstance) {
      printf("Load library %s failed, error: %d\n", pImp->Name, GetLastError());
      return FALSE;
    }

    pOrgThunk = (PIMAGE_THUNK_DATA)(imagebase + pImp->OriginalFirstThunk);
    pFirstThunk = (PIMAGE_THUNK_DATA)(imagebase + pImp->FirstThunk);

    while (NULL != *(DWORD *)pOrgThunk) {
      if (pOrgThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG32) {
        fpFun = GetProcAddress(hInstance, (LPCSTR)(pOrgThunk->u1.Ordinal & 0x0000ffff));

        //DebugPrint("\t0x%x\n", pOrgThunk->u1.Ordinal);
      }
      else {
        pImportName = (PIMAGE_IMPORT_BY_NAME)(imagebase + pOrgThunk->u1.AddressOfData);
        fpFun = GetProcAddress(hInstance, (LPCSTR)pImportName->Name);

        //DebugPrint("\t%s\n", pImportName->Name);
      }

      //DebugPrint("\t\t0x%x\n", fpFun);

      pFirstThunk->u1.Ordinal = (LONG)fpFun;
      
      ++pFirstThunk;
      ++pOrgThunk;
    }
    [COLOR="Red"]FreeLibrary[/COLOR](hInstance);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//