dllmain
dll模块的函数入口
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
/*
DLL_PROCESS_ATTACH
用途:用于初始化资源
调用时机:第一次使用Loadlibrary加载到进程地址空间时调用
返回值:若此时返回FALSE, 会弹出一个错误, 然后立刻调用DLLMain, 并传入DLL_PROCESS_DETACH
DLL_PROCESS_DETACH
用途:用于释放资源
调用时机:调用FreeLibrary每次调用会减少引用计数, 当计数值为0, 则卸载dll
*/
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
OutputDebugString(TEXT("INterdll"));
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
main函数之前执行的代码
- dllmain
- 全局对象的构造
- 全局变量使用函数赋值
函数转发
- 函数转发:加载的DLL模块内部不提供函数实现,通过转发的形式,让其在其他DLL模块中查找函数实现并调用
//标准写法
#pragma comment(linker, "/EXPORT:[查找的函数名]=[函数实现所在的DLL模块].[实际导出的函数名]")
//案例
#pragma comment(linker, "/EXPORT:?fnDll@@YAHXZ=Dllorg.?fnDll@@YAHXZ")
- 替换dll: 通过函数转发的机制,替换自身的所创建的DLL为库DLL,从而使目标EXE程序在运行DLL时运行的是自己的DLL
- 替换流程
- 通过Depends工具,查找原DLL导出的函数名
- 新建一个DLL工程,在模块内通过函数转发调用该原DLL中的所有函数
- 将自己工程生成的DLL文件名替换为原DLL名字
- 将原DLL文件名更改为函数转发中的DLL名字
创建API
- Winexec:早期兼容16位的操作系统提供的API
WinExec("cmd /k copy D:\\process.exe d:\\1.exe", SW_NORMAL);
// 指令 显示模式
- ShellExecute
//打开一些文本文件:如tet、ppt、doc等
ShellExecute(NULL,
_T("edit"),
_T("C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"),
NULL,
NULL,
SW_NORMAL);
//打开文件夹
ShellExecute(NULL,
_T("explore"),
_T("C:\\Users\\Administrator\\Desktop"),
NULL,
NULL,
SW_NORMAL);
//打开搜索栏,不过一般无法准确定位到根目录搜索栏
ShellExecute(NULL,
_T("find"),
NULL,
NULL,
_T("C:\\Users\\Administrator\\Desktop"),
SW_NORMAL);
//打印文件
ShellExecute(NULL,
_T("print"),
_T("C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"),
NULL,
NULL,
SW_NORMAL);
//打开程序
ShellExecute(NULL,
_T("open"),
_T("cmd"),
NULL,
NULL,
SW_NORMAL);
//打开网页
ShellExecute(NULL,
_T("open"),
_T("www.baidu.com/s?wd=武汉科锐"),
NULL,
NULL,
SW_NORMAL);
HINSTANCE hRet = ShellExecute(NULL,
_T("open"),
_T("\"F:\\CR33\\windows\\03 dlmain,dll劫持和进程创建\\dir.bat\""),
NULL,
NULL,
SW_NORMAL);
命令行
- cmd + /c :启动命令行,执行后面的命令,立即关闭窗口
- cmd + /k :启动命令行,执行后面的命令,保持窗口不关闭