本帖最后由 bester 于 2021-2-23 14:15 编辑
钉钉多开的实现拜读了论坛JuncoJet大哥的帖子,大哥用的是iat hook,需要用到loadpe修改导入表静态加载DLL,每次升级要修改一次钉钉略显麻烦,有点破坏了文件完整性
那我这个人喜欢优雅一点,采用inline hook技术,但又不想带个DLL,有点强迫症~ 主要是远程关闭互斥体句柄这事干得不优雅,对我来说学不到啥新玩意,不想造轮子
之前的企业多开和微信多开用了异常调试技术,有反馈说多开以后程序会卡住,不晓得啥原因,这次直接实践一下所谓微软官方提出的安全hook机制的“热补丁”Hot Patch hook,然后用汇编命令判断互斥体名称,修改堆栈
所谓热补丁技术,不是啥新鲜玩意,上图大家自己看,原始长这样
Hot Patch 以后
好处是什么呢,只需要改动2个字节,且不需要频繁挂钩脱钩,对于多线程来说更为安全,万一在你挂钩的时候,有个子线程调用该函数就gg,主要是该技术只需要挂钩一次,可不脱钩,如果非要脱钩也是在我们干完活以后的事了
然后我们直接看补码处是怎么操作的吧,我这边是直接使用了virtualallocEx申请了一段程序空间
006FF8DC 02C62610 \MutexName = "Local\{{239B7D43-86D5-4E5C-ADE6-CEC42155B475}}DingTalk_loginframe"
006FF8DC 008CA498 \MutexName = "Local\{{239B7D43-86D5-4E5C-ADE6-CEC42155B475}}DingTalk"
[Asm] 纯文本查看 复制代码 00F50000 60 pushad //先是保存eflags环境,为什么没有保存寄存器环境呢,是因为我懒,而且也没有使用到寄存器
00F50001 83F8 00 cmp eax,0x0 //此时eax的值 保存着互斥体的地址,所以判断是否为0,也就是判断是否存在互斥体
00F50004 74 08 je short 00F5000E //为0就直接跳到popad 直接调用原函数了,
00F50006 8138 4C006F00 cmp dword ptr ds:[eax],0x6F004C //这里是判断互斥体的前4个字节,如上面有写互斥体名称 也就是判断互斥体是否为Loca 这4个字母
00F5000C 74 06 je short 00F50014 //如果不是就调用原函数
00F5000E 61 popad
00F5000F - E9 1ED69475 jmp KernelBa.7689D632
00F50014 803D 5A00F500 0>cmp byte ptr ds:[0xF5005A],0x0 //这里的0xF5005A 保存的是一个写入标志,因为有两个不同的互斥体名,不判断的话会写入同一个互斥体名,就多开不了了,第一次写入1111,第二次写入2222 这个
00F5001B 74 0B je short 00F50028
00F5001D 61 popad
00F5001E C74424 0C 6400F>mov dword ptr ss:[esp+0xC],0xF50064 ; UNICODE "Local\{{8B69AE66-2222-2222-2222-2A53E84F7C33}}Ding" //这里是伪造的互斥体名称,2222是固定的,剩下的就是随机
00F50026 EB 12 jmp short 00F5003A //这里跳到 00F5003A 的意思是脱钩,因为在API函数那里我们有挂钩,干完了活就该脱钩,有挂钩就有脱钩是个好习惯
00F50028 C605 5A00F500 0>mov byte ptr ds:[0xF5005A],0x1 //如果之前写入过了1111这个互斥体,这里就会有标志了,上面那个判断就知道我们写过了 就会走2222这个互斥体
00F5002F 61 popad
00F50030 C74424 0C D200F>mov dword ptr ss:[esp+0xC],0xF500D2 ; UNICODE "Local\{{A9725700-1111-1111-1111-77EFA6D4383A}}Ding" //这里是第一次修改的互斥体
00F50038 ^ EB D5 jmp short 00F5000F
00F5003A 66:C705 30D6897>mov word ptr ds:[KernelBa.CreateMutexW],> //脱钩,写入NOP,那个API头2字节不写回去也可以正常调用,但是一般是写回原来的字节,我懒
00F50043 ^ EB CA jmp short 00F5000F
讲完原理,知道大家都想要成品,也准备好了
测试环境:钉钉v6.0.3 + windows 10 x64 v2004 +火绒(加vmp的也不报毒)
编写环境:易语言,以后考虑用C++重写一份,要源码的也可以丢出来
已知问题:360报毒是因为加了vmp资源保护,别的保护都没开,为了保护版权而已,其他没别的,都是练手的小玩意
使用方法:
写死了两个路径:
D:\Program Files (x86)\DingDing\main\current_new\DingTalk.exe //升级安装是这个路径
D:\Program Files (x86)\DingDing\main\current\DingTalk.exe //首次安装是这个路径,
如果你的钉钉不是这两个路径,也可以自定义,桌面新建一个path.txt,里面的内容就填D:\Program Files (x86)\DingDing\main\current\DingTalk.exe 这样就可以了,自动读取文本的路径的。
哦对了,你卸载钉钉 再重新下载,就会走上面那个首次安装的路径,前提是安装的时候把C盘改成D就可以了
优先是判断上面两个路径,如果都不存在才会读txt文本
差不多就这样,自己玩吧,看情况负责售后 上班无聊再说
钉钉多开小工具.vmp.rar
(891.53 KB, 下载次数: 1168)
|