windows中dllmain,创建进程和转发dll

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 :启动命令行,执行后面的命令,保持窗口不关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值