首页
社区
课程
招聘
为什么远线程注入dll,dllmain会调用很多次
发表于: 2012-3-24 16:41 8064

为什么远线程注入dll,dllmain会调用很多次

2012-3-24 16:41
8064
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        MessageBox(NULL,TEXT("注入次数!"),TEXT("提示"),MB_OK);
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                MessageBox(NULL,TEXT("DLL注入成功!"),TEXT("提示"),MB_OK);
                break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                MessageBox(NULL,TEXT("DLL卸载成功!"),TEXT("提示"),MB_OK);
                break;
        }
        return TRUE;
}

dllmain被调用了,但是会被反复调用很多次不知道为什么...

注入DLL的函数是在另一个DLL中的
int WINAPI cb_InjectDll(DWORD processID,PTCHAR dllName)
{
        int len = wcslen(dllName);
        LPVOID dllParam;
        HANDLE hProcess;
        HANDLE hThread;
        LPTHREAD_START_ROUTINE dllStartFunc;
        #ifdef INJECT_DEBUG
                DWORD errorCode;
                TCHAR code[128];
        #endif
        HMODULE hModule = GetModuleHandle(TEXT("kernel32.dll"));
        if (hModule == NULL)
        {
                return ID_ERT_GETM_FALSE;
        }
        hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);
        if (hProcess == 0)
        {
                return ID_RET_OPEN_FALSE;
        }
        dllParam = VirtualAllocEx(hProcess,NULL,len * 2 + 1,MEM_COMMIT,PAGE_READWRITE);
        if (dllParam == NULL)
        {
                CloseHandle(hProcess);
                return ID_RET_ML_FALSE;
        }
        if (!WriteProcessMemory(hProcess,dllParam,dllName,len * 2 + 1,NULL))
        {
                VirtualFreeEx(hProcess,dllParam,len * 2 + 1,MEM_RELEASE);
                CloseHandle(hProcess);
                return ID_RET_WRITE_FALSE;
        }
        dllStartFunc = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryW");
        if (dllStartFunc == NULL)
        {
                VirtualFreeEx(hProcess,dllParam,len * 2 + 1,MEM_RELEASE);
                CloseHandle(hProcess);
                return ID_RET_GETADD_FALSE;
        }
        hThread = CreateRemoteThread(hProcess,NULL,0,dllStartFunc,dllParam,0,NULL);
        #ifdef INJECT_DEBUG
                errorCode = GetLastError();
                wsprintf(code,TEXT("%d"),errorCode);
                MessageBox(NULL,code,NULL,MB_OK);
        #endif
        if (hThread == NULL)
        {
                VirtualFreeEx(hProcess,dllParam,len * 2 + 1,MEM_RELEASE);
                CloseHandle(hProcess);
                return ID_RET_CR_FALSE;
        }
        WaitForSingleObject(hThread,INFINITE);
        VirtualFreeEx(hProcess,dllParam,len * 2 + 1,MEM_RELEASE);
        CloseHandle(hThread);
        CloseHandle(hProcess);
        return ID_RET_SUCCESS;
}
而且用cmd tasklist /m命令查看被注入的程序的DLL引用中也没有被注入的函数

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 76
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
switch 写的很明白啊,load的时候至少要调用四次吧?
2012-3-24 16:56
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
求问如何提高权限的呢。我这貌似不行,在注入函数中出现权限错误。错误码5。

int AddPrivilege(const char *Name)        //提升权限
{
        HANDLE hToken;
        TOKEN_PRIVILEGES tp;
        LUID Luid;
       
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
        {
                return 1;
        }
       
        if (!LookupPrivilegeValue(NULL,Name,&Luid))
        {
                return 1;
        }
       
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        tp.Privileges[0].Luid = Luid;
       
        if (!AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
        {
                MessageBox(NULL,"AdjustTokenPrivileges error","error",MB_OK);
                return 1;
        }
        return 0;
}
2012-3-24 17:02
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
兄弟,代码一看就没问题,还亲自给你测试了一下,很正常啊!你是不是在exe程序多处调用cb_InjectDll函数了?不然怎么可能出现这个问题呢?
2012-3-24 17:46
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
5
DLL_THREAD_ATTACH
去查查这个常量的意义
2012-3-24 18:30
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
MessageBox(NULL,TEXT("注入次数!"),TEXT("提示"),MB_OK);

注入次数 这个表达错误啊,
那不叫注入次数,是DllMain多种事件发生的次数。

如果MessageBox(NULL,TEXT("DLL注入成功!"),TEXT("提示"),MB_OK);这个弹出多次那才有问题
2012-3-24 19:24
0
雪    币: 215
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
系统在有新线程创建和销毁的时候会给所有的dll的dllmain发送
case DLL_THREAD_ATTACH:
  case DLL_THREAD_DETACH:
这两个消息,可以查看一下msdn。
对这两个分支要做break
2012-3-24 19:30
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我的提 SE_DEBUG 权限代码:
bool AdjustProcessTokenPrivilege()
{
     LUID luidTmp;
     HANDLE hToken;
     TOKEN_PRIVILEGES tkp;

     if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
     {
         OutputDebugString("AdjustProcessTokenPrivilege OpenProcessToken Failed ! \n");
  
         return false;
     }
  
     if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp))
     {
         OutputDebugString("AdjustProcessTokenPrivilege LookupPrivilegeValue Failed ! \n");
  
         CloseHandle(hToken);
  
         return FALSE;
     }
  
     tkp.PrivilegeCount = 1;
     tkp.Privileges[0].Luid = luidTmp;
     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  
     if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
     {
         OutputDebugString("AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! \n");
  
         CloseHandle(hToken);
  
         return FALSE;
     }
     return true;
}
2012-3-24 21:48
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
DisableThreadLibraryCalls(hModule);
2012-3-24 22:08
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
还是不怎么明白...我的dll只有一个dllmain函数而且被注入的程序也是自己写的类似文本编辑器的一个程序,dll注入的过程只是点击一个按钮...然后执行注入操作,难道是因为我VB中调用的缘故?4楼调用的时候只出现一次“注入次数”和“DLL注入成功”的提示么?
再问个题外话为什么我fread读取二进制文件的时候老是读到“脚”这个字的时候所有后面的问题都读不到了呢,脚的Unicode码是1A 81,二进制的结束标识是什么?是不是冲突了啊,刚学这个,麻烦知道的给说下,谢谢
2012-3-25 02:31
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
文件读取的搞定了...文件打开方式弄错了...汗颜
2012-3-25 02:35
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
只出现一次。
结束标识一般是0,这里的fread跟结束标识没关系,跟参数2和参数3有关.
2012-3-25 04:48
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
tasklist /m test.dll 查看模块进程也正常...
2012-3-25 04:50
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我再看看我的代码吧...
2012-3-25 23:42
0
游客
登录 | 注册 方可回帖
返回
//