-
-
[讨论]论坛上两篇PE加载代码有点小问题
-
发表于: 2010-12-21 21:18 3606
-
我弄了一整天,发现了个小问题。
处理导入表的时候 一般都是用 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
http://bbs.pediy.com/showthread.php?t=100635
处理导入表的时候 一般都是用 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);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [讨论]论坛上两篇PE加载代码有点小问题 3607
- [求助]问个CRC32计算问题 3533
- [求助]水印是什么意思? 3361
- [求助]如何添加多个新节(比如30个) 3621
- [求助]INT3 断点是不是不能随便下的 6269
看原图
赞赏
雪币:
留言: