AccessPort v1.37串口数据抓取工具的最大抓取长度修改

所谓串口数据抓取,即在不打开串口的情况下(Windows上具有一个串口只能被一个程序打开的限制)“聆听”串口的数据交互,并记录下来,串口通信的设备不会留意到抓取工具的存在,类似网络抓包。这类软件通常使用客制化的驱动程序对相关消息进行截获,在破解通过串口通讯的硬件设备的通讯协议时十分实用,但通常收费且价格不菲。

AccessPort是SUDT开发的完全免费的串口助手与串口数据抓取工具,这款软件实际使用过程中比较顺利,但有一个十分严重的设计缺陷:对于长的数据包,只能显示前64字节:

这款软件最后一次更新是在7年前(好在最后一次更新添加了带签名的64位驱动,Windows10x64下可以正常抓取数据,要解决的仅仅是抓取的数据显示不全的问题),而用户反馈页面也早已下线。看来要想使其正常工作只能自己动手了。

仔细观察,发现长度(Length)的数值是正确的,只是显示的数据被截断了,说明软件内部肯定是获取到了完整数据,只是决定不显示出来。那么使用IDA开始分析。首先已知每一个抓取记录都会被输出为形为「Length: {0}, Data: {1}」的形式,于是先搜索字符串"Length",找到了对应的printf模板,可以看到处于data区块:

双击到达data区的对应部分,在变量名上右键,选择使用Xrefs框图查看引用关系,可以看到被叫做sub_435ED0的函数所引用:

定位到sub_435ED0,汇编看不懂,张嘴吃F5:

可以看到引用了模板字符串的代码在一个switch下,而且仅在switch的变量等于3或4时才执行。仔细观察软件主界面运行时的输出,发现对串口的写入和读取的事件分别叫做IRP_MJ_READ和IRP_MJ_WRITE,只有这两个事件发生时软件才会输出模板字符串那样的记录。查询一下,这两个事件的常量值确实为3和4,可以确定关键代码就在此处。

继续观察代码,其中函数sub_463999涉及到了模板字符串,那么这个sub_463999的作用一定就是扩展sprintf,将抓取到的数据根据设置不同进行转换(软件可以选择是直接显示文本还是显示十六进制)然后填进模板字符串里。那么处理抓取到的数据的代码一定就在case之下,sub_463999之上,只有这个叫做sub_435D80的函数了。在双击进入这个函数反编译其详细内容之前,参数列表中的两个常量引起了我的注意:

我们先点进第一个dword_4BE194看看:

我看到了什么?!0x40那不就是十进制的64吗!先别急,还是回上去反编译一下那个函数,注意这个64被传进了第四个变量也就是a4:

这就很清楚了嘛,v6首先赋值为a2,看起来是实际长度没错,然后如果a2大于a4,就把v6设置成a4。a4就是那个64的常量,也就是如果实际长度大于64,就强行截断到64。那么只需要把a4的值也就是上层调用的时候传入的常量dword_4BE194的值改掉就好了!先定位到常量所在的位置也就是.data:004BE194,然后使用菜单中的Edit->Patch program->Change byte对这一行数据进行修改:

既然是DWORD(32位),那干脆改到最大值(0xFFFFFFFF)算了:

最后,使用Edit->Patch program->Apply patches to input file将修改保存回exe文件,记得勾选备份源文件以免失败之后莫得恢复:

来测试一下,大成功!数据长度和数据内容均无误:

来抓取个实际设备(USB转串口的距离传感器),试试看能不能获取到其通信协议:

可以看到应该是由于接收程序算法的原因,每一包数据被分两次读取了,但数据内容拼接起来确实是完整的有效的JSON数据。
破解完毕,感谢观看!
最后放出一下破解过的主程序,去官网下下来完整软件之后覆盖主程序就可以了:链接: https://pan.baidu.com/s/1hhABbRFcNhiGcrM7GgDt9A 提取码: e7jy

THE END
喜欢就支持以下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称