您的位置:首页 > 其它

windows上一个小系统软件

2008-03-23 23:37 141 查看
这几个周末windows系统开发的总结

这两个周末基本上都在帮一个朋友做一个windows平台的系统软件,其实这个软件需要的技术我原本不是很明白,但是通过google和msdn的帮助,也凑合着实现了一些功能。
1) 抓取指定的窗口
这个通过api函数枚举当前的顶层窗口,在回调函数中判断标题是不是自己感兴趣的就行了,比较简单。一些暴力破解密码的软件可以这样实现;
2) Hook
这方面的资料很多,但是网上存在严重的“抄袭”现象,也许你会发现很多网页的内容都是一样,并且借鉴的意义不是很大。我使用了两个钩子:全局键盘钩子和针对特定进程的消息钩子。键盘钩子的实现比较顺利,但是消息钩子死活不行。一开始想设置断点调试,但是发现根本就没有断到指定的代码行,想想觉得自己的方法不对:dll文件已经被夹在到指定的线程,自己在本线程里面设置断点当然没有用啊。而是改变策略,设置一个全局的变量,如果进入了钩子处理函数就将其置1,然后在自己的对话框里面查询他的值,但是发现还是不行,百思不得其解。突然想到原因也许和第一次的一样:变量所处的进程不一样!所以新增了一个共享的代码段,一试果然可以了!
3) Api拦截
实现这个花的时间最多,在网上找了好多资料,后来又看了一下<windows核心编程>,弄清楚了一个大概。现代的windows版本在加载dll时,各个进程拥有自己的单独的地址空间,所以如果要想拦截某个进程的api调用,第一步是进入到目标进程的地址空间中。这个可以通过几种方法实现:远程进程调用,钩子。第一种方法是在目标进程的空间中新起一个现程,这样你就可以为所欲为了!我使用的是dll,因为轻车熟路了。下一个挑战就是拦截api了。又有两种流行的方法:改变模块的输入节和改写api所处的dll内容。前一种方法并不是万能的,因为目标进程可能没有输入节,还可能已经被加了壳。第二种方法也不足:并发问题。但是我还是采用了第二种方法,因为并发的可以解决,并且自己对这个东西也比较熟悉。壳的问题比较麻烦,去年就领教过一回了。在网上下载源码,很幸运得下到了一个台湾同胞写的几个函数,封装实现了api拦截的功能。自己创建了一个符合要求的数据结构,然后运行了一下,发现没有起作用,还把系统弄死了!重启后再来,用360安全卫士一看,自己的dll确实已经加载到了目标进程,其他的进程都没有,说明hook是起作用了。这下长了个心眼,但不调试,并且不加载到别的进程,就在本进程调试。跟进去一看,系统报错:ESP检查到不一致,可能是函数调用问题!
没办法,只好将代码反汇编,一步一步来,原来是这位兄弟的代码是在16位平台开发的,他把cs和ax都作为了16位的寄存器,导致在嵌入式的汇编语句前后压栈出栈的个数不相等,真是佩服windows!好了,总算找到原因,还比较好弄,这段嵌入式汇编的目的是为了得到dll中新api的代码段的段地址,cs只需要低16位就可以了,只需要把他带给ax,由ax 带给我自己的变量就可以了。
改完以后,实验了一把,就在本地进程里面拦截,成功了!下星期再准备将它弄到目标进程,希望能顺利一点,别想今天一样,弄了整整一天啊!累死......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐