昨天室友突然问到我一个问
题,在写壳的时候,你是怎么获取壳.dll的加载基址的,努力地从记忆中搜寻着一些记忆,得出GetModuleHandle
的答案,那么问题来了,
GetmoduleHandle和Loadlibrary的区别是什么?
查阅相关资料,可以知道,Loadlibrary是用来将普通的dll这个文件载入到系统进程中,使得其成为一个系统模块,而GetModuleHandle是需要在进程已经加载至内存获取其中dll的句柄,另外,从MSDN中,查找到如下文献:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=vs.85).aspx
GetModuleHandle function:
Retrieves a module handle for the specified module. The module must have been loaded by the calling process.
而对于Loadlibrary在MSDN则是这样解释的:
Loadlibrary
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx
Loads the specified module into the address space of the calling process. The specified module may cause other modules to be loaded.
另外一个区别:
两个函数的区别还在于引用次数,Loadlibrary把模块映射进调用进程的地址空间后,如果必要,则增加模块的引用次数;而GetModuleHandle是在不增加引用次数的情况下返回已经映射模块的句柄.
加壳时的重定位问题
如何计算出重定位后的位置见上图:
分析过程:
6C9A1050=6c9A0000+1000+50;
重定位后的正确位置=原始位置(一般是个VA)-所在区段的VA+目标程序的ImageBase+壳代码RVA
- 0041C050=6C9A1050-6C9A0000+400000-1000+1C000;
这里为什么要减去1000,要解释一下:可以这么理解;
6C9A1050-6c9A0000得到的是PE头(1000+50)
而1C000这个RVA已经将PE头大小算在内的一个RVA了,这里相当于有两个PE头大小了,显然不对,所以这里要减去1000