首页
社区
课程
招聘
[求助]关于dll注入的问题一问,恳请解答
发表于: 2015-9-6 00:44 5278

[求助]关于dll注入的问题一问,恳请解答

2015-9-6 00:44
5278
小弟把dll成功注入到了游戏进程里面
但dll里面的代码,只要出现sleep这类的延时函数
游戏就会卡死
查询了一下,可用SetTimer这种时钟函数
在csdn复制了一段关于"纯c语言控制台"的SetTimer例子
#include <stdio.h>
#include <windows.h>

#define ID_TIMER 0

VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD);

int main(int argc, char * argv[])
{
        int ch = 0;
        int iId;
        MSG msg;

        iId = SetTimer(NULL, ID_TIMER, 100, TimerProc);

        while(GetMessage(&msg, NULL, 0, 0))
        {
                DispatchMessage(&msg);
        }

        KillTimer(NULL, iId);

        return 0;
}

VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTimer)
{
        printf("888\n");
}

发现是用while循环来发消息的,如果我的dll代码同样用while估计也是导致游戏卡死

主要不想另外创个时钟的线程,还是有什么其他办法不占用游戏主线程又不用另外开线程的

我的注入是使用远程线程注入

请各位大牛帮帮忙

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
因为DllMain在这些场合会被重新调用(例外是LOAD_LIBRARY_AS_DATAFILE和DisableThreadLibraryCalls这样跳过DllMain的场合)。为了避免造成死循环问题,操作系统给调用DllMain的代码加锁以确保DllMain会不被干涉地执行完毕而不会重入你自己这个DllMain。另外操作系统也在获取加载的DLL列表的时候加锁(比如LoadLibrary、FreeLibrary或者创建线程都会枚举当前进程的所有DLL来调用这些DLL的DllMain)来等待你的DllMain结束以避免获得不完整的DLL列表。但是这需要程序员的合作,不在DllMain中编写可能造成重新获取DLL加载锁的代码。

程序卡死不算什么严重后果,而且也很容易重现(加载其他的DLL,创建线程等等,在全局堆上分配内存都可能造成这个问题,如果内存分配器的线程同步锁没写好的话)。如果你在这里创建一个全局的钩子,这甚至会造成系统卡死。

这个问题无法调试,因为调试器需要在被调试的进程创建一个远程线程之后才能中断。最好的办法是不要在DllMain中放那些代码。
2015-9-6 03:20
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
简单的说,DllMain的调用前后系统加了一把loader-lock,导致很多API都不能调用,在DllMain里做的事情越少越好,否则容易死锁。解决你的问题,可以把dll 2静态链接到dll1,只要你在dll 1中随便什么函数调用一下dll 2里导出的函数就行。或者你也可以用微软的Detours库里的setdll工具,让dll 1强行依赖dll 2,这样系统加载dll 1时就会加载dll 2。
2015-9-6 03:21
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
难怪阿,查询下资料,DLLMAIN创建线程游戏立马崩溃
只是"可以把dll 2静态链接到dll1".....没试过.....
2015-9-6 03:22
0
雪    币: 62
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
线程呗

这能有啥招
2015-9-6 10:17
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
dll代码里面不能创建线程哦
2015-9-6 10:37
0
雪    币: 62
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
__beginthread

明显可以啊

要不能线程,那么多外挂怎么写的?
2015-9-6 11:48
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
直接上代码
上传的附件:
2015-9-6 11:50
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
#include <Windows.h>
#include <stdio.h>
#include <windows.h>

#include <string.h>
#include <stdlib.h>

#include <psapi.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <call.h>
#include <process.h>

#define bool int//因c语言里面没有bool的声明
#define true 1
#define false 0

unsigned int __stdcall ThreadFun(PVOID pM);
void trace(PTSTR szFormat, ...);//模仿debug輸函數
BOOL APIENTRY DllMain( HANDLE hModule,
                                          DWORD ul_reason_for_call,
                                          LPVOID lpReserved
                                          )
{
_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
}

unsigned int __stdcall ThreadFun(PVOID pM)
{
         trace("Hello World\n");  

        return 0;
}
void trace(PTSTR szFormat, ...)
{
       
        TCHAR szBuffer[1024];
        va_list pArgs;
        va_start(pArgs, szFormat);
        _vsntprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArgs);
   
        va_end(pArgs);
        OutputDebugString(szBuffer);
}
2015-9-6 11:52
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
嗯首先DLLMAIN里没判断ul_reason_for_call,这样每创建一个线程你的DLL又会创建一个线程
然后DLLMAIN没返回TRUE(编译器默认加上的应该是return 0吧?
2015-9-6 13:54
0
雪    币: 55
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
dllmain中执行,依赖它的exe 的加载dll的顺序,如何sleep期待功能函数工作,可能会卡死
还有就是 要确保exe没有freeliabrary,可以在dllmain中自己load一下,然后再用freelibraryandExitTherad实现
2015-9-6 15:17
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
解决了,搞了两天,几行汇编就干掉了
2015-9-6 17:48
0
游客
登录 | 注册 方可回帖
返回
//