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 带给我自己的变量就可以了。
改完以后,实验了一把,就在本地进程里面拦截,成功了!下星期再准备将它弄到目标进程,希望能顺利一点,别想今天一样,弄了整整一天啊!累死......
这两个周末基本上都在帮一个朋友做一个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 带给我自己的变量就可以了。
改完以后,实验了一把,就在本地进程里面拦截,成功了!下星期再准备将它弄到目标进程,希望能顺利一点,别想今天一样,弄了整整一天啊!累死......
相关文章推荐
- 搭建一个开发Predix软件的Windows系统(4)配置Java开发环境
- windows的系统怎样把一个软件设置成为开机自动启动?
- 搭建一个开发Predix软件的Windows系统(5)配置Node.js
- 搭建一个开发Predix软件的Windows系统(2)配置使用Predix工业云平台的基础环境
- 搭建一个开发Predix软件的Windows系统(3)Predix版的Hello World
- 搭建一个开发Predix软件的Windows系统(1)准备工作
- 微软正在修复Windows 10周年更新导致SSD系统冻结的一个问题
- CactiEZi中文版V10.1是基于CentOS6.0系统,整合Cacti等相关软件,重新编译而成的一个操作系统
- Windows 10系统PyCharm软件的 安装、激活、汉化 详细教程
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统?
- 番外篇:因为一个固态导致的——系统重装与JAVA软件环境下载安装配置
- 一个设想:基于colinux,去厚重虚拟化,共盘直接文件系统安装运行的windows,linux
- ISET 一个Matlab®软件包,它可以测量和可视化 当改变图象系统中的硬件和算法时对图象质量的影响!
- 『系统管理』Windows安装Subversion服务器软件
- windows系统安装软件弹出"Windows installer service could not be accessed.."解决办法
- 搭建一个Windows下的蜜罐系统
- Tangram:一个基于MFC框架的柔性软件开发系统
- Tangram:一个基于MFC框架的柔性软件开发系统
- Linux替代Windows系统软件比拼
- 一个Windows系统升级后图片无法保存的BUG