首页
社区
课程
招聘
[原创] 企业微信多开(自动登录小思路)
发表于: 2022-11-10 11:52 3940

[原创] 企业微信多开(自动登录小思路)

2022-11-10 11:52
3940

多开

1. 处理互斥锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
typedef HANDLE(WINAPI* fnCreateMutexW)(LPSECURITY_ATTRIBUTES lpMutexAttribute, BOOL bInitialOwner, LPCWSTR lpName);
DWORD g_oldCreateMutexWAddr;
EVInlineReplaceHook g_ReplaceHook;
 
HANDLE WINAPI NewVreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttribute, BOOL bInitialOwner, LPCWSTR lpName)
{
    if (lpName != NULL) {
        wstring sName = lpName;
        if (sName.find(L"ExclusiveObjectInstance1") != wstring::npos)
        {
            //暂停hook
            g_ReplaceHook.PauseReplace();
            return (HANDLE)22;
 
        }
        else if (sName.find(L"ExclusiveObject") != wstring::npos)
        {
            return (HANDLE)22;
        }
    }
    fnCreateMutexW oldCreateMutexW = (fnCreateMutexW)g_oldCreateMutexWAddr;
    //暂停hook
    g_ReplaceHook.PauseReplace();
    HANDLE hHandle = oldCreateMutexW(lpMutexAttribute, bInitialOwner, lpName);
 
    //继续hook
    g_ReplaceHook.ResumeReplace();
    return hHandle;
 
}
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    wchar_t buff[100] = { 0 };
    BYTE bCode[7] = { 0 };
    DWORD dwNewAddr = { 0 };
    PBYTE pbCode;
    DWORD pid = { 0 };
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        // 从模块中获取函数地址
        g_oldCreateMutexWAddr = (DWORD)GetProcAddress(GetModuleHandleW(L"Kernel32.dll"), "CreateMutexW");
        dwNewAddr = (DWORD)NewVreateMutexW;
        pbCode = bCode;
        *pbCode++ = 0xB8;
        CopyMemory(pbCode, &dwNewAddr, sizeof(dwNewAddr));
        pbCode += sizeof(dwNewAddr);
        *pbCode++ = 0xFF;
        *pbCode = 0xE0;
        g_ReplaceHook.StartReplace(g_oldCreateMutexWAddr, bCode, 7);
        pid = GetCurrentProcessId();
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

2. 处理目录

特征码:

1
83C6??FF75??8B85????????5756C701????????83C1??8D50??83C0??5250

hook相关的我个人能力不强,就是一步步跟,用od和dbg混合来用(因为od的一些插件使用上来说,还是比较方便的)一步步排查,(删除文档目录下wxwork目录下的Global目录,然后通过创建文件夹和创建文件的函数来下短点,然后用ce工具搜索 Global 这个关键字,还有就是用ida(本地自己跑了很久)通过字符串查找(也是Global)定位到位置,本人hook的是高版本,所以改了目录和长度,低版本的比较简单,直接改目录名称的那个地址对应的信息就行),这是我主要的hook思路,不是hook完之后的特征码吗,虽然有些差异,来回试一试(真不多,hook试的次数那是真让我崩溃(我汇编本来就水,大部分基础函数对应汇编我压根不会,这才是我hook花费大量时间的原因,真没啥捷径可走(特征点当我没说)))

 

搜索完毕之后反汇编一下

 

image-20221110112811342

 

image-20221110112948501

这个地方我就不继续带下去了 ,其实你使用od或者dbg工具查看下,看下堆栈很快就会找到的,如果觉得Global这个不好找,可以往上推呀,不会不碍事,下面就有偏移量,自己对着看就知道了(没有基础的话,可以先去b站看看微信hook的,很快的)

 

代码处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// 4.0.2.6026 这个用下面代码没啥问题
// 多开全局配置hook地址
#define HOOK_GLOBAL 0x43511A4
#define HOOK_GLOBAL_ORIGIN 0x42A2030
 
//上一层的hook看个人喜好了,都不一样的哈,这一层也是,个人觉得这种用起来爽一点
DWORD HookGlobalEsp = { 0 };
DWORD HookGlobalJmp = { 0 };
DWORD HookGlobalCall = { 0 };
void __declspec(naked) decGlobal() {
    __asm {
        mov HookGlobalEsp, esp
        pushad
    }
    GlobalReplace(HookGlobalEsp);
    HookGlobalCall = getWxWorkAddBase() + HOOK_GLOBAL_ORIGIN;
    HookGlobalJmp = getWxWorkAddBase() + HOOK_GLOBAL + HOOK_LEN;
    __asm {
        popad
        call HookGlobalCall
        jmp HookGlobalJmp
    }
}
DWORD GlobalReplace(DWORD esp)
{
    if (strfileUserId != "") {
        // 这块是需要获取到 wxWork 生成的绝对路劲哈,这样生成一个HistoryLogin文件夹 这样方便之后自动登录的时候查找到自动登录所需要的账户使用的文件夹是哪一个
        CHAR systemUserPath[0x100] = { 0 };
        DWORD ps = *(DWORD*)(*(DWORD*)esp);
        ReadProcessMemory(GetCurrentProcess(), (LPCVOID)ps, systemUserPath, 0x100, NULL);
        LPCWSTR tt = (LPCWSTR)systemUserPath;
        string path = WCharToMByte(tt);
        path.append("\\HistoryLogin\\");
        path.append(strfileUserId);
        string dirName = getDirName(path);
        if (dirName == "") {
            // getUUID() 需要自己处理下 这块我就是生成了一大串字符串而已,UUID生成器
            strfileName = getUUID();
        }
        else {
            strfileName = dirName;
        }
    }
    else {
        strfileName = getUUID();
    }
    strfileNameTwo = strfileName;
    DWORD fileName = getVariableAdd((DWORD)&strfileName);
    * (DWORD*)(esp + 0x1c) = fileName;
    return TRUE;
}
 
//// 4.0.8.6604 这块需要处理下 当然了 自己hook相关地方 能达到效果也是一样
//// 多开全局配置hook地址
//#define HOOK_GLOBAL 0x37DC295
//#define HOOK_GLOBAL_ORIGIN 0x1065F0
DWORD GlobalReplace(DWORD esp)
{
    // 设置目录路径
    strfileName = getStrfileName();
    DWORD* length = (DWORD*)(esp + 0x4);
    // 1. 设置文件名长度
    int WriteValue = strfileName.length();
    *length = WriteValue;
 
    // 2. 修改Global目录名
    wchar_t nextName[100];
    memset(nextName, 0, 100);
    wsprintf(nextName, L"%s", strfileName.c_str());
    DWORD odp = 0;
    DWORD da = *((DWORD*)esp);
    VirtualProtect((LPVOID)da, sizeof(nextName), PAGE_EXECUTE_READWRITE, &odp);
    if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)da, nextName, sizeof(nextName), NULL) != 0) {
        VirtualProtect((LPVOID)da, sizeof(nextName), odp, &odp);
    }
    return TRUE;
}

如果喜欢或者对您有帮助的话,请点点赞哈,满足下鄙人的小虚荣心 哈哈哈哈 ღ( ´・ᴗ・` )比心


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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 3221
活跃值: (3031)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
新版本,多开容易被封,底层收集近百种信息
2024-2-19 17:04
0
雪    币: 45
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2024-8-21 21:51
0
游客
登录 | 注册 方可回帖
返回
//