WTL全称Windows Template Library,是基于模板的window界面库,架构在ATL只上,由于其基于模板,没有MFC那么多继承以及相互引用,因此静态链接出来的exe十分短小精悍。WTL自带app wizard,但是这个app wizard仅支持生成exe型的应用程序,而不支持生成嵌入WTL窗体的dll。
经过摸索,并查阅wtl新闻组上的相关资料,最终有了下面的在dll中嵌入wtl窗口的例子。例子很简单只导出了一个函数ShowDlg,调用这个函数会生成一个模态的对话框。
源码如下:
DLL中嵌入WTL窗体简单示例
系统载入dll的整体过程可以分为以下几个步骤:
1、将dll文件内容载入内存,并按照对齐粒度进行对齐并设置对应的各个内存区间的权限属性;
2、如果dll有重定位表,则进行重定位操作;
3、填充dll的导入表;
4、用ATTACH参数调用dll的入口函数进行初始化,之后返回imagebase即可。
因此了解了系统载入dll的整体流程,也就可以自己实现将dll载入内存并执行,这种方法对于加密等有一定意义。
但由于自己载入内存后,系统api GetProcAddress函数失效,因此在自己实现loadlibrary函数的同时必须自己实现此函数。
下面附上参考网上现有代码原理后写的代码。
进过少量测试,暂未发现bug,如发现bug,欢迎提出。
DLLLoader.h文件内容如下
//---------------------------------------------------------------------------
#ifndef DLLLoaderH
#define DLLLoaderH
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio .h>
#include <windows .h>
//---------------------------------------------------------------------------
//public functions
DWORD LoadDllFromMemory(LPVOID lpBuffer,__int64 BufferSize);
DWORD FreeDllFromMemory(LPVOID lpBaseAddress);
FARPROC GetDllProcAddress(LPVOID imagebase,char * FuncName);
// private functions
DWORD AlignDllToMemory(LPVOID lpBuffer,PIMAGE_DOS_HEADER &dosHeader,PIMAGE_NT_HEADERS &ntHeader,__int64 BufferSize); //从内存载入到对齐内存
DWORD GetAlignedSize(DWORD Origin,DWORD Alignment); //计算对齐后的位置
DWORD GetImageSize(PIMAGE_NT_HEADERS ntHeader,PIMAGE_SECTION_HEADER sectionHeaders); //计算总imagesize
DWORD Relocation(PIMAGE_NT_HEADERS ntHeader,LPVOID NewBase); //修正重定位
DWORD FillImportTable(LPVOID imagebase,PIMAGE_NT_HEADERS ntHeader); //填充IAT
//entrypoint function type
typedef UINT (CALLBACK * LPENTRYPOINT) (HANDLE hInstance, DWORD Reason, LPVOID Reserved);
#ifdef __cplusplus
}
#endif
#endif
</windows></stdio>
阅读全文…
最新评论