首页
社区
课程
招聘
[求助]MFC DLL实现无模块注入后,怎样调用显示窗口
发表于: 2014-5-20 19:56 11122

[求助]MFC DLL实现无模块注入后,怎样调用显示窗口

2014-5-20 19:56
11122
我通过加载MFC DLL到进程中,然后申请新内存空间,把DLL代码拷贝到新内存空间,做了重定向,然后FreeLibrary掉注入的DLL,从而来达到无模块注入

问题来了:当我FreeLibrary掉注入的DLL之后,调用DLL中的导出函数的新内存空间中的地址(重定向后的),就会出现崩溃,导出函数里边的功能是DoModule一个MFC窗口。想问下是不是无模块只适合调用那些无窗口显示的代码?

导出函数:
DWORD WINAPI MainThread(LPVOID lParam)
{
  //资源切换,无此宏对话框创建不成功
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  //保存旧的资源
  HINSTANCE hOldRes = AfxGetResourceHandle();
  //设置自己的DLL资源上去
  AfxSetResourceHandle(theApp.m_hInstance);

       //显示MFC窗口
  CMainView ManView;
  ManView.DoModal();

  //如果对话框不关闭,则后面的代码无法执行(模态会卡住)
  //还原旧资源
  AfxSetResourceHandle(hOldRes);

  return 0;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
无句柄的模块是不能使用资源的,很多API都不能用。
老老实实别重载了。
2014-5-20 21:54
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢,首先感谢下您的回答。我主要是想实现防止游戏检测到自己注入的DLL报非法的问题,所以想通过代码重载的方式,把原DLL模块给卸载了,然后直接调用代码的函数的地址实现显示外挂框的功能。

请问有其他什么方法可以既让游戏检测不到非法的DLL模块吗?
2014-5-20 22:18
0
雪    币: 248
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
换DEPLHI吧,他的窗口可以显示出来
2014-5-20 23:16
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
DELIPH是不是调用的sdk的API函数绘制的窗口,MFC因为用到了资源,所以才不行,如果不用mfc而是采用win32 的sdk编程自己绘制的窗口是不是就可以显示出来了?
2014-5-21 02:02
0
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
是的,重载出来的DLL也不能使用try-catch,很麻烦。
不过可以考虑断链等其他方式。
2014-5-21 02:49
0
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
// 在DllMain 或者 InitInstance 创建消息线程
CloseHandle(::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GameThreadProc, this, 0, &dwThreadID));



// GameThreadProc

DWORD WINAPI GameThreadProc(LPVOID lparam)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  // MFC的资源切换
    Cdemol *demol = new Cdemol;
    demol->Create(IDD_DIALOG1);
    demol->ShowWindow(SW_SHOW);

    MSG stMsg = {0};

    while (TRUE)
    {
        GetMessage(&stMsg,demol->GetSafeHwnd(),0,0);
        TranslateMessage(&stMsg);
        DispatchMessage(&stMsg);
    }

    return 0;
}
2014-5-21 09:22
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
(FARPROC)GetModuleFileNameA,
        (FARPROC)GetModuleFileNameW,
        (FARPROC)GetModuleHandleA,
        (FARPROC)GetModuleHandleW,
        (FARPROC)GetProcAddress,
hook自己模块的这些函数,然后让自己的模块,基本就能正常工作了。
2014-5-21 09:40
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这种方法可行吗?我记得以前试过过不用DoModule的方式,用Show的方法,也是不行的,可能真的是跟内存块不能访问资源有关系吧
2014-5-22 03:07
0
雪    币: 40
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不能显示窗口,那是否可以执行依赖窗口的代码呢,比如定时器
2017-10-17 15:21
0
游客
登录 | 注册 方可回帖
返回
//