- UID
- 2875
- 阅读权限
- 10
- 在线时间
- 小时
- 最后登录
- 1970-1-1
该用户从未签到
|
很幸运认识到本论坛,让国内DCS工作者有一个学习的平台。
我也某企业DCS的工作人员,同样也是逆向爱好者,我们企业使用的是CENTUM VP 系统,工作这些年发现这个系统的报警系统是有问题的(不知道别的企业是不是这样),首先 高 低 温度 液位报警,这是一个很正常又很好的事情,可以提醒DCS操作人员哪里的问题不用一直盯着屏幕,但就是我们企业的报警,
不光是高 低 温度 液位报警,阀位限定等一些没必要报警的值频繁报警,这让DCS操作人员已不管报警声音,有些干脆关闭报警声,使这工作时不能即使发现问题,后果可想而知。(给我们制作DCS系统公司说 无法改变现状)
因为没有学习DCS的 GUI的制作,而且我们企业已有现成的分布式控制系统,我只要改进一些东西就好。
初步思想改进两个地方,1,报警,只报警高低 液位、温度。 2,自己分析温度和液位 是不是画直线,也就是传过来的值不变,有可能是硬件出了故障。
所以我只要逆出来我需要的的数据就好,同时HOOK住报警。
通过几天的逆向分析
在电脑屏幕显示的数据(温度、压力点),通过最底层组件进程实现。
数据是以 float类型也就是单精度浮点数存储。
具体实现方式:
这是刚启动CENTUM VP 启动的样子,
后启动一个画面后:
首先进程调用 CreateThread来创建线程,以后使用mfc90 模块来实现界面显示。
抽拉数据过程:使用内部模块SendRead发送数据,分配内存(这里的内存存储这需要显示在屏幕所要抽拉的标志)
从2B BE 00 56这里开始是发送数据头,这里是一个时间,高位 00 56始终不变,低位 每秒加1,到FF FF重置。
我把数据往上拉:
看到了显示数据的String字符串,以后使用WriteFile函数把这段数据写入一个驱动文件。
格式:WriteFile(BKTDI,DataAddress,Size,SizeWritte,异步操作句柄)
因为这里是驱动文件所以比较谨慎,所以还没有分析驱动文件的内部实现。
再来看看写入驱动文件后;调用了ReadFile,读文件
格式:ReadFile(BKTDI,这里存储这文件的固定内存偏移为9910,Size,SizeWritten,异步操作句柄).
这时发现 9910内存地址存储这需要显示的数值,不过是以大端序保存的(网络传输格式),x86 是以小端序存储的。
所以他分配了一块内存调用memCpy函数。
memcpy(Address,9910,Size)
使用htonl 函数把大端序转换为小端序。
htonl(Address)。这时Address就是屏幕所要显示的数据。
上面的步骤是电脑显示界面获取数据过程,如果我要抽拉全部(包括没有显示在电脑屏幕的数据),就得模拟他获取数据的过程。
难点就是驱动程序 BKTDI,实现过程,怎样交互的。这样得到了想要的数据,然后加以分析就可以判断数据是否假数据。(报警还没有搞 暂时不知道在哪个模块组件实现)。
这里希望上层制作DCS的大牛可以给我些提示与思路。
|
评分
-
查看全部评分
|