先贴两张界面截图:
图1 龙卷风设置界面
图2 龙卷风请求数据界面
CnStockDrv.dll 导出函数:
其中,请求数据的有
QueryKData
GetTradeData
QueryTradeData
GetMinData
QueryMinData
QueryManyReportData
QueryReportData
GetMinData和GetKData函数是没有代码的空函数,
QueryXXXX函数实际上通过lParam参数,发送MSGID为0x07E8的消息到龙卷风的设置窗口。然而我调用了这个函数也没个卵用。
除此之外:
GetTotalNumber
ReInitStockInfo
SCAskData
SCStockInit
SetNewsPath
都是保留兼容性的空函数,没有任何实现代码
------------ 以上的文字和图 并没有卵用 -------------
我跟踪了“补充数据”按钮的事件_TDfm_btnMendStartClick,请求历史数据其实是发了个消息给某个线程,而这个线程正是CnStockDrv中的的网络通信线程TDownloadTask。这样解决方法就用了,就是拼凑0x0856消息的参数,发消息到TDownloadTask线程,需要解决两个问题:
1.参数格式;
2.获取线程ID
a> 获取参数格式,OllyDBG中在上图发消息前设置,查看esi指向的内存内容即可获知
参数esi 寄存器指向 一个字符串(pascal 字符串),字符串格式如下:
个股F10 2|1|sh600688
当日分时 3|1|sh600688
日线历史 4|1|sh600688 4|2|sh600688 4|3|sh600688
历史5分钟 5|1|sh600688 5|2|sh600688 5|3|sh600688
分笔成交 6|3|sh600688
除权数据 7|1|sh600688
财务数据 8|1|sh600688
信息地雷 9|1|sh600688
b> 获取线程ID 比较麻烦,不过我们知道线程处理函数 sub_4D5C60, 我们可以用MS 研究院的Detours工具劫持修改函数前几个指令, 跳转到我们自己的函数,然后调用一下GetCurrentThreadId获取保存该线程ID。