能力值:
( 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中放那些代码。
|
能力值:
( 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。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
难怪阿,查询下资料,DLLMAIN创建线程游戏立马崩溃
只是"可以把dll 2静态链接到dll1".....没试过.....
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
线程呗
这能有啥招
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
dll代码里面不能创建线程哦
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
__beginthread
明显可以啊
要不能线程,那么多外挂怎么写的?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
直接上代码
|
能力值:
( 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);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
嗯首先DLLMAIN里没判断ul_reason_for_call,这样每创建一个线程你的DLL又会创建一个线程
然后DLLMAIN没返回TRUE(编译器默认加上的应该是return 0吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
dllmain中执行,依赖它的exe 的加载dll的顺序,如何sleep期待功能函数工作,可能会卡死
还有就是 要确保exe没有freeliabrary,可以在dllmain中自己load一下,然后再用freelibraryandExitTherad实现
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
解决了,搞了两天,几行汇编就干掉了
|
|
|