首页
社区
课程
招聘
[原创]教会微信:突破文件发送100M限制
发表于: 2019-8-15 13:20 14258

[原创]教会微信:突破文件发送100M限制

2019-8-15 13:20
14258

9102年了,我想大部分人使用微信的频率应该都会高于QQ了吧。

以前在QQ传文件的时候,哪里会想到会有文件大小限制,几G、几十G的文件随意传。

而现在,用微信传文件,很尴尬,只能传100M或更小的文件。

为什么做这个限制?我想可能是因为微信一开始就是手机应用。

所以限制文件大小,合情合理。

但是,现在微信也出了PC版本了,也有很多用户在使用PC版本微信,还在限制100M就有点说不过去了。

你说怕手机收到后下载耗流量,确实有点浪费,那你服务端可以区分一下嘛,用户也可以自己确认是否下载啊。

但是,微信并没有做什么,这就很影响PC上微信的使用体验了。

我要用微信传大文件啊(100M以上),因为我QQ密码忘了,因为我朋友QQ密码忘了...

好,既然如此,你不做...还是...你不做,那就我来做!

下载最新的PC微信(当时2.6.8.65),开始分析微信对文件大小限制是如何做的,然后一一突破。

在选择文件过程中就做了100M限制。

嗯,文件大小首先就想到了GetFileSize,下个断点看看。

艾玛啊,触发有点多啊,头疼。算了,换个思路。点击发送文件按钮,会弹出文件选择对话框,这是微软提供的。

写过win32 gui或者mfc程序的同学应该想到了,对弹出文件选择对话框的函数下断点。

不是~bp shell32!SHBrowseForFolderW这是目录选择~,也不是~bp shell32!SHFileOperationW~,而是这个:bp comdlg32!GetOpenFileNameW

根据返回地址7908eac2计算到在IDA中地址100deac2,用IDA翻看一下函数怎么做的。

微信可以同时选择多个文件,这里循环获取到路径,限制最多10个,然后进入sub_100DEED0处理。

进入函数sub_100DEED0之后,一下就看到获取文件大小的函数,然后是判断文件是否大于100M。

先手工windbg修改一下指令,验证是否正确。把0x6400000改为0,jl改成jge即可。篇幅原因,不展开了。

通过调试确认,100M以上文件绕过这个限制。

但是还没完,依然会弹框,居然还有二次验证。

调试函数sub_100DEED0,单步继续往下走,看看是哪里弹框。最终找到在sub_10099D70这个函数里还有校验。

同样进入sub_10099D70,找到校验代码。

windbg修改一下指令,验证是否正确。把0x6400000改为0,jle改成jge即可,调试确认绕过检查。

过了这两处检查后,文件成功显示在输入框中。

不过直接发送依然失败,显示“上传文件大小不能大于100M”,应该是服务器做了检查。

另外,微信还支持拖动文件发送,经过前面两步的突破,此时拖入文件依然提示“发送的文件大小不能大于100M”。

那继续把这个干掉吧。拖动文件首先想到的就是DragQueryFileW,加上断点试试。

确实拖动中会断下,但经过分析并不是关键代码,没有对文件进行处理,另外断下后,再跑起来,拖动文件失败。

所以另想他法。又想到了前面没有用处的getfilesizeex,再来尝试一下。

嘿嘿,没想到一下子找到了关键位置,getfilesizeex建了一功。

同样的方式,把0x6400000改为0,ja改成jbe,绕过这个校验。

OK,到这里,本地100M限制就成功突破,下面继续看看如何绕过服务器限制。

前面提到,能够选择大于100M文件之后,点击发送依然会失败,提示“上传文件大小不能大于100M”。

很明显服务器做了上传文件限制。

所以如何突破这个限制呢?

额,动不了服务器代码啊...

能够想到的就是在文件发送前,自动分割文件为小于100M的多个文件,然后将分割的文件自动发送出去,在接收方,把收到的每个文件再自动合并。

如此服务器也不会说文件大于100M了,对于用户来说,体验也是一致的。

是的,我就是这么实现的。

首先,找到发送文件的函数。

由于之前分享过如何找到发送消息的函数,详情请看文章微信PC端技术研究(3)-如何找到消息发送接口,所以这里不详细分析如何找到发送文件的函数了。

直接拿来用,就是这个函数sub_102382E0

接口大概是这个样子的。

然后hook sub_102382E0,拿到path文件路径后,获取文件大小,如果大于100M,则分割文件,然后重新调用sub_102382E0把分割文件发送出去。大概代码如下:

OK,突破服务器100M限制也完成了(详细实现代码请移步SuperWeChatPC开源项目)。

不过在测试中,发现bug多多(说的是微信)。

所以最后,我不得不面对现实,把文件分割成了每个10M大小的文件进行尝试,终于一个大于100M的文件发送成功了,并且非常稳定!

简单总结一下,我是如何让微信发送成功100M以上文件的。

因为接收方并没有做自动合并的功能,所以需要自己合并一下,也很简单。

让这个功能更完美,还需要做:

最后,想试用大文件传输功能,请下载最新的https://github.com/anhkgg/SuperWeChatPC

欢迎PR、star、试用。

也欢迎关注:汉客儿

 
 
 
 
 

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

收藏
免费 6
支持
分享
最新回复 (6)
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
不错,很有想法。不知道你有没有将接收方也做下处理。是否确认服务器的事还是接受方的事。
设计微信的人在传输文件这块,真是让人费解。点对点传输需要发服务器?如果需要,那服务器用它做什么文章呢?
我之前也做过类似试验,不知道是不是经过服务器还是接收方也需要去限制?后来想把接收方限制也去掉,想了想,让别人再重新安装无限制版,可能也不现实,就放弃了。
只能是微信自己觉悟了。
最后于 2019-8-15 14:31 被ssarg编辑 ,原因:
2019-8-15 14:18
0
雪    币: 12502
活跃值: (3058)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
ssarg 不错,很有想法。不知道你有没有将接收方也做下处理。是否确认服务器的事还是接受方的事。设计微信的人在传输文件这块,真是让人费解。点对点传输需要发服务器?如果需要,那服务器用它做什么文章呢?我之前也做过类 ...
大概是考虑到稳定性吧。因为假设有人传输太大的文件,可能会导致客户端崩溃?或者就算是p2p,但是为了防止非法交易,服务器会验证文件是否违法文件,你传个太大的文件服务器太累?感觉这样设计肯定有原因吧。
2019-8-15 15:10
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
5
ssarg 不错,很有想法。不知道你有没有将接收方也做下处理。是否确认服务器的事还是接受方的事。设计微信的人在传输文件这块,真是让人费解。点对点传输需要发服务器?如果需要,那服务器用它做什么文章呢?我之前也做过类 ...
在国内基本没有点对点的通信软件。一方面是为了实现更多功能,比如离线传输等。另一方面是为了监管。
2019-8-15 17:58
1
雪    币: 9
活跃值: (180)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
C++, hook,我喜欢的方向
2019-8-17 20:47
0
雪    币: 4737
活跃值: (4684)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习啦
2019-12-15 21:50
0
游客
登录 | 注册 方可回帖
返回
//