[企业微信]关于群发上限的研究及绕过

poi2022-05-27技术交流1486

9.jpg

<span style="font-size: 16px;">企微群发有限制,但是公司销售每天都要群发数千人。9个9个发不现实。</span>

<span style="font-size: 16px;">虽然也有手动卡掉这个限制的存在,但让新人销售学这个也太折腾我了…手把手都得教半天</span>

<span style="font-size: 16px;">一怒之下把企微拖入od逆向,突然想起来,哦,我不会啊。</span>

<span style="font-size: 16px;">对od的认知仅限于查找弹窗,jmp跳过验证…….</span>

<span style="font-size: 16px;">
</span>

<span style="font-size: 16px;">唉,还是老实搜一下把,万一前辈造好了轮子呢?</span>

<span style="font-size: 16px;">github逛一圈,中文英文都搜了一遍,全网居然tmd没有?</span>

<span style="font-size: 16px;">有一些企微HOOK的,也没有群发突破上限的功能</span>

<span style="font-size: 16px;">行吧。</span>

<span style="font-size: 16px;">
</span>

<span style="font-size: 16px;">直接上万能的Cheat Engine,反复横跳抓到两个内存地址。</span>

<span style="font-size: 16px;"></span>

<span style="font-size: 16px;">抓到内存后,检测是啥改写了这两个地址。</span>

<span style="font-size: 16px;">(试过直接改数值,企微直接崩溃了……)</span>

<span style="font-size: 16px;">运气挺好,一个是DuiLib的地址,另一个直接就是基址+偏移的存在!</span>

<span style="font-size: 16px;">其实下面直接就显示了,WXWork.exe+398F56(企微版本:4.0.6.6516)</span>

<span style="font-size: 16px;">经过测试,有关上限的控制确实是这个地址。</span>

<span style="font-size: 16px;">直接把这段汇编空指令替换完事,完美突破群发9个的限制。</span>

<span style="font-size: 16px;">只是这样也不行啊,我总不能叫销售人手一个CE,用这么麻烦的方式修改吧…还不如手动卡bug!</span>

<span style="font-size: 16px;">所以又撸了一段代码,直接把 90 90 90 5D 写到WXWork.exe+398F56这个地址去。</span>

<span style="font-size: 16px;">(<span style="font-size: 16px;">90 90 90代表汇编的nop指令,啥都不做</span>)</span>

<span style="font-size: 16px;">就实现了,当企微版本是 4.0.6.6516 的情况下,运行此程序就可以直接突破群发9个的限制。</span>

<span style="font-size: 16px;">那问题又来了,企微未来更新呢?我tm还得重写?别人还得重下?
</span>

<span style="font-size: 16px;">这个偏移量应该会根据版本变化而变化的。</span>

<span style="font-size: 16px;">拿4.0.0.6008版本试了下,果然偏移变成了350816。(WXWork.exe+350816)</span>

<span style="font-size: 16px;">又瞅了眼汇编,直接搜这个字节数组确定地址,直接把 90 90 90 5D 写进去不就完事了?</span>

<span style="font-size: 16px;">
</span>

<span style="font-size: 16px;">
</span>

3.jpg

<span style="font-size: 16px;">结果用CE搜89 41 10 5D(长度为4的字节数组)出来一大堆数据…那不行啊。</span>

<span style="font-size: 16px;">继续往后加,一直加到16位,此时搜出来只有唯一地址了!</span>

<pre class="prism-highlight prism-language-basic">89 41 10 5D C2 04 00 CC CC CC 55 8B EC 83 EC 08

<span style="font-size: 16px;">根据搜出来的地址,再写入 90 90 90 5D,完事。</span>

<span style="font-size: 16px;">当然也可以写<span style="font-size: 16px;">16位</span>长度,就是没啥必要。</span>

<pre class="prism-highlight prism-language-basic">90 90 90 5D C2 04 00 CC CC CC 55 8B EC 83 EC 08

<span style="font-size: 16px;">上面说了一大堆实现原理,下面上优化后的代码。</span>

<span style="font-size: 16px;">本代码为按键精灵编写,调用了大漠插件。</span>

<pre class="prism-highlight prism-language-typescript">PutAttachment "c:\poi","*.*"
PutAttachment ".\Plugin", "RegDll.dll"
Call Plugin.RegDll.Reg("c:\poi\dm.dll")
Set dm = createobject("dm.dmsoft")
dm_ret = dm.SetPath("C:\poi")
//设置附件目录
ver = dm.Ver()
//以上为注册大漠插件

/////////////===================/////////////
//找多开企微所有句柄
HwndEx = Plugin.Window.Search("企业微信")
TracePrint "句柄数组为:" & HwndEx
//下面这句用于分割字符串,将获得的句柄组分割   
dim MyArray
MyArray = Split(HwndEx, "|")   
If UBound(MyArray)>=0 Then  
    i=0   
    For UBound(MyArray)   
        //下面这句将字符串转换成数值   
        TracePrint "第 " & i + 1 & " 个窗口句柄为:" & Clng(MyArray(i))
        hwnd = Clng(MyArray(i))
        result = dm.FindData(hwnd,"00000000-FFFFFFFF","89 41 10 5D C2 04 00 CC CC CC 55 8B EC 83 EC 08")
        TracePrint "企微检测地址为" & result
        dm_ret = dm.WriteData(hwnd, result, "90 90 90 5D")
        a = dm.ReadData(hwnd, result, 4)
        TracePrint a
        i=i+1   
    Next  
End If
EndScript
/////////////===================/////////////

<span style="font-size: 16px;">前面都是释放附件,注册大漠插件。用的免费的3.1233版本。
</span>

<span style="font-size: 16px;">因为销售都有多开的需求,所以得根据标题查找所有企业微信的句柄,保存至数组 <span style="color: #00B0F0; font-size: 16px;">HwndEx[] </span>。</span>

<span style="font-size: 16px;">随后遍历该数组,遍历的同时根据遍历出来的句柄 <span style="color: #00B0F0; font-size: 16px;">HwndEx[i]</span> 来查询</span>

<span style="font-size: 16px;">“89 41 10 5D C2 04 00 CC CC CC 55 8B EC 83 EC 08”</span>

<span style="font-size: 16px;">这个字节数组的当前地址,保存至 <span style="color: #00B0F0; font-size: 16px;">result</span> 。</span>

<span style="font-size: 16px;">继续用当前句柄 <span style="color: #00B0F0; font-size: 16px;">HwndEx[i]</span> ,将 90 90 90 5D 写入查到的地址 <span style="color: #00B0F0; font-size: 16px;">result</span> 中。</span>

<span style="font-size: 16px;">写完了再查一下这个地址,调试输出(TracePrint)看看是不是修改过的值。</span>


<span style="font-size: 16px;">本质上这个程序还是demo,拿一个按键精灵给别人用,缺点太多了….</span>

<span style="font-size: 16px;">实际上能调用大漠插件的方式有很多,易语言,c,c#,python啥的都可以。</span>

<span style="font-size: 16px;">但是个人电脑上只有按键精灵,还是前几天给朋友更新游戏辅助才下载的</span>

<span style="font-size: 16px;">后续打算改成vb6版,整合进常用工具箱(挖坑中)。</span>

<span style="font-size: 16px;">还没用过vb动内存。应该可以吧。</span>

<div class="bdsharebuttonbox"></div><script>window.bdshare_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"p_w_picpath":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"24"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>