返回列表 发帖

利用易语言编写保护进程软件

利用易语言编写保护进程软件
本节将使用 全局钩子DLL + APIHOOK 这两组功能,做一个简单的进程保护程序
先来说说原理吧,当我们要对某个程序进行进行操作时,常会用到进程句柄。例如在要关闭结束一个进程,或要读写某个进程里的内存时更是离不开这个进程句柄。

什么是进程句柄?

  在windows系统里有存在着很多的各种各样的句柄,在要操作读写某进程内存时就得用到该进程的进程句柄,就像我们要操作某个窗口时会用到窗口句柄,



为了阻止别人的程序操作我们的进程,就不能让他有机会得到我们这个进程的进程句柄。

下面是读写某个进程内存的过程

先取某进程ID - 打开该进程ID得进程句柄 - 调用读写内存API时提供该进程句柄 - 关闭进程句柄



上面的重点,就是第二步,打开进程ID得到进程句柄。每个进程的进程ID,在运行期间是不变的也在整个系统里是唯一的,不会有同时两个进程的进程ID相同的情况发生,所以我们可以监控打开进程这个功能,判断要打开的那个进程ID是否是我们要保护的进程ID。



第一步的取进程ID的方式有很多,所以不好监控。

第三步因为打开进程时所得到的进程句柄并非在整个系统里都是唯一的,所以若去监视读写内存的API,判断进程句柄是得不到什么好处的。

第四步更是无关紧要了


--------------------------------------------------------------------------------

下面让我们看看,打开进程这个API功能

  

QUOTE:
Dll命令名:打开进程_
  所处动态链接库的文件名:kernel32.dll
  在所处动态链接库中的命令名:OpenProcess
  返回值类型:整数型
  参数<1>的名称为“访问级别”,类型为“整数型”。注明:2035711完全访问。
  参数<2>的名称为“子进程继承”,类型为“整数型”。注明:0为子进程继承。
  参数<3>的名称为“进程ID”,类型为“整数型”。注明:要打开的进程标识。




--------------------------------------------------------------------------------

为了达到监控打开进程这个API,我们得使用APIHOOK。但是,APIHOOK只能用在当前进程。为了能够监控整个系统,我们把APIHOOK编写在DLL文件里,再用全局钩子DLL的功能,把DLL插入到全系统里,达到监控所有进程的目的



下面是DLL的代码


QUOTE:
.版本 2

.程序集 程序集1
.程序集变量 保护进程, 整数型, , , 需要保护的进程ID
.程序集变量 序号, 整数型


.子程序 DLL接口, 整数型, 公开
.参数 一, 整数型
.参数 二, 整数型
.参数 三, 整数型

返回 (DLL初始化 (一, 二, 三, &初始, &退出))

.子程序 初始
.局部变量 temp, 字节集

读共享内存 (0, temp, 4, “禁止打开进程”)
保护进程 = 取字节集数据 (temp, #整数型, )
.如果真 (保护进程 ≠ 取自进程ID ())
  序号 = 安装APIHOOK (“kernel32.dll”, “OpenProcess”, &钩子处理)
  信息框 (“当前进程:” + 取执行文件名 () + “ APIHOOK:” + 到文本 (序号), 0, )
.如果真结束

.子程序 退出

恢复APIHOOK (序号)

.子程序 钩子处理, 整数型
.参数 权限, 整数型
.参数 续承, 整数型
.参数 进程ID, 整数型
.局部变量 返回, 整数型

.如果真 (保护进程 = 进程ID)
  返回 (0)
.如果真结束
恢复APIHOOK (序号)
返回 = 打开进程_ (权限, 续承, 进程ID)
加载APIHOOK (序号)
返回 (返回)




在DLL初始时,从共享内存里取出要进行保护的进程ID

再判断一下当前进程不是要保护的进程ID一样的话,就安装APIHOOK,若是自进程的话,是不需要监控的



在DLL退出时,要恢复APIHOOK,不恢复的话会产生一些内存非法操作的



在打开进程的回调子程序 钩子处理() 里进行监控判断

若当前正要打开的进程是正是保护的那个进程ID时,返回0,也就是打开进程失败的返回值就是0.


--------------------------------------------------------------------------------

有了下面的DLL代码后,再来编写EXE的安装全局钩子功能


QUOTE:
.版本 2

.程序集 窗口程序集1

.子程序 __启动窗口_创建完毕
.局部变量 进程ID, 整数型

模块注册 ()
进程ID = 取自进程ID ()
创建窗口互斥体 (_启动窗口.取窗口句柄 (), “禁止打开进程”)
写共享内存 (0, 到字节集 (进程ID), “禁止打开进程”)
安装钩子DLL (0, “mydll.dll”)

.子程序 __启动窗口_将被销毁

卸载钩子 (3)




这里,我们在程序创建完毕时就安装全局钩子进行保护。当然啦,在安装之前,先把要保护的进程ID写到共享内存里去。

在程序要结果运行时,别忘了卸载钩子!


--------------------------------------------------------------------------------

以上代码简单的实现了保护我们的进程不被别人打开,大家可以在系统的任务管理器里的 进程页,结束进程试试



由此可见,学会对系统API的调用有好处外,清楚的了解某个API的作用对于使用APIHOOK进行监控更有好处





注意。本节例子是用全局钩子做的,由于易语言所编的全局钩子在DLL退出时,常会引发系统的 explorer.exe 进程无响应或非法操作。所以本节例子只供学习参考用。若要实际应用时,可尝试一下 云外归鸟 的全局钩子支持库试试。www.mxconfig.cn   自由空间

http://www.mxconfig.cn

返回列表