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 学习了
还是 1.34 版的好,可惜只能在 x86 中运行
1.37 最烦的就是 当串口上没有数据交互时还有 timeout 事件的记录
不像 1.34,只有当有交互时才显示
没找到隐藏该事件的地方
LZ知道么,或者加加工改造下{:301_978:} 官网这个软件后面标着免费软件,你的pj是什么来的? 这个可以有,算是再次更新了 感谢
原版下载地址:http://www.sudt.com/cn/ap/download.htm 这个很有意思学习了 虽然不知道是什么,但看起来好像很厉害的样子! 楼主精神可嘉。不过用PortMon这个软件就没这个问题了。 值得学习 小小/ng 发表于 2019-9-17 13:17
官网这个软件后面标着免费软件,你的pj是什么来的?
不好意思昨天太晚了写的时候有点懵,不是破解,是修复数据只能显示前64字节的问题 jamesmeng 发表于 2019-9-17 14:52
楼主精神可嘉。不过用PortMon这个软件就没这个问题了。
PortMon好像不支持64位系统?Windows10x64之前弄过好几次一直没成功 学习了,谢谢分享