易语言hook源码
A. 易语言截取键盘信息的代码怎么写
MS VC++ 的 c 程序可以实现。
方法哗哗:
(1)用键盘按键程序模拟法,把图像发送到clipboard
(2)把clipboard图像存入.bmp 图像文件(或别的格式)。
编译:
cl simu_keyboard.c user32.lib Gdi32.lib
特殊头文件:
#include <Windows.h>
#include <Winuser.h>
#include <memory.h>
提示:
(1)按键程序模拟子程序:
void snapscreen_2_clipboard()
{
keybd_event(VK_SNAPSHOT,0x2C,0,0);
keybd_event(VK_SNAPSHOT,0x2C,KEYEVENTF_KEYUP,0);
}
(2)clipboard图像存入.bmp 图像乱桐行文件
FILE *fout;
/* --------------------------------------------------------------
* dib
int GetBytesPerPixel(int depth);
int GetBytesPerRow(int width, int depth);
int GetBitmapBytes(int width, int height, int depth);
* --------------------------------------------------------------*/
int GetBytesPerPixel(int depth)
{ return (depth==32 ? 4 : 3);
}
int GetBytesPerRow(int width, int depth)
{
int bytesPerPixel = GetBytesPerPixel(depth);
int bytesPerRow = ((width * bytesPerPixel + 3) & ~3);
return bytesPerRow;
}
// bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, bmi.bmiHeader.biBitCount
int GetBitmapBytes(int width, int height, int depth)
{
return height * GetBytesPerRow(width, depth);
}
void save_clipboard_img_to_bmp()
{
char nameout[80];
HANDLE h_bitmap,h_dib;
BITMAPINFO bmi;
HDC hDC;
int imageBytes;
BITMAPFILEHEADER hdr;
int scanLineCount;
unsigned char *img;
if (!OpenClipboard(NULL)) {
printf("Can not open clipboard\n");
exit(0);
};
if (DEBUG ==1) printf("pass open clipboard\n");
// HANDLE GetClipboardData(UINT uFormat);
h_bitmap = GetClipboardData(CF_BITMAP);
h_dib = GetClipboardData(CF_DIB);
if (h_bitmap ==NULL || h_dib ==NULL){
printf("I got NULL bitmap: ");
} else { printf("I got bitmap: ");};
memcpy(&bmi,h_dib,sizeof(bmi));
printf("%d x %d \n",bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight);
hDC = CreateCompatibleDC(NULL); //轮枣 Gdi32.lib.
CloseClipboard();
bmi.bmiHeader.biCompression = BI_RGB;
// possible to use part of imgage with img_w,img_h
imageBytes = GetBitmapBytes(bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, bmi.bmiHeader.biBitCount);
printf("pass GetBitmapBytes=%d \n",imageBytes);
img = (char *) malloc(imageBytes);
if (!img) {
printf("No enought memory for img !\n"); exit(0);
}
// BITMAPFILEHEADER hdr;
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ (bmi.bmiHeader.biClrUsed * sizeof(RGBQUAD)) + bmi.bmiHeader.biSizeImage;
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ (bmi.bmiHeader.biClrUsed * sizeof(RGBQUAD));
scanLineCount = GetDIBits(hDC,h_bitmap,0,bmi.bmiHeader.biHeight, img, &bmi, DIB_RGB_COLORS);
strcpy(nameout,"keyb_tmp.bmp");
if ( (fout = fopen(nameout,"wb") ) == NULL ) {
printf("\007Cann't open output file: %s ", nameout);exit(1);
};
fwrite( &hdr, sizeof(BITMAPFILEHEADER ), 1, fout );
fwrite( &bmi, sizeof(BITMAPINFO), 1, fout );
fwrite( img, sizeof(unsigned char),imageBytes, fout );
fclose(fout);
printf("Output in %s\n",nameout);
}
/* -------end dib and bmp ----- */
B. 求助,易语言反HOOK源码,防止其他程序DLL注入
腾讯电脑管家可以帮助修复
a进入管家的首页后,点击右上角的“工具箱”芹宴按钮,点击“电脑诊所”
b进入“电脑诊所”找到“软件硬件”点击“丢失dll文件判拿”最后“一键修复”界面
可以根据自己弹出的对话框中显示的无法启动程序是丢掘首搭失的何种dll文件,找到对应的后,鼠标轻轻放在该项上,当出现了“立即修复”按钮后点击“立即修复”按钮。
完成以上步骤后,系统便自行修复了dll文件丢失的故障了,完成了修复
C. 易语言进程反注入源码
进程是否存在 (“dnf.exe”) .如果真 (bool) 输入法.激活 (取句柄2 (输入法.清除注入 (取特定目录 (10) +“\\Sougoo.ime”) 输入法.卸载 (
D. 易语言Hook拦截某进程所有信息
准备编写防火墙吗?据我所知,易语言可以实现检测网络是否连接,检测某并脊个进程是否存在,就比如关机猛蔽拿事件,可以有运行dos命令,bat命令等多枝搭种方式,我认为实现你说的只是部分,bug会很大。
E. 求易语言钩子注入dll及home呼出源码
易语言钩子DLL注入源码及源码说明2010-04-06 13:52[所有要使用到的API]
.版本 2
.DLL命令 LoadLibraryA, 整数型,"kernel32.dll","LoadLibraryA"
.参数 lpLibFileName, 文本型
.DLL命令 SetWindowsHookExA, 整数型, "user32.dll", "SetWindowsHookExA", 公开, SetWindowsHookEx
.参数 钩子类型, 整数型, , idHook
.参数 回调函数地址, 整数型, , lpfn
.参数 实例句柄, 整数型, , hmod
.参数 线程ID, 整数型, , dwThreadId
.DLL命令 FreeLibrary, 整数型, "kernel32.dll", "FreeLibrary", , 释放指定的动态链接库,它们早先是用LoadLibrary ;API函数装载的 非零表示成功,零表示失败。会设置GetLastError
.参数 库句柄, 整数型, , hLibMole,要释放的一个库句柄,在VB里使用只能用这个函数释放那些由应用程序明确装载的DLL。对LoadLibrary的每一次调用都应该有一个对应的FreeLibrary调用;
.DLL命令 UnhookWindowsHookEx, 整数型, "user32.dll", "UnhookWindowsHookEx", , UnhookWindowsHookEx
.参数 钩子句柄, 整数型, , hHook
.DLL命令 CallNextHookEx, 整数型, "user32.dll", "CallNextHookEx", 公开, CallNextHookEx
.参数 钩子句柄, 整数型, , hHook
.参数 代码值, 整数型, , ncode
.参数 附加参数1, 整数型, , wParam
.参数 附加参数2, 整数型, 传址, lParam
.DLL命令 GetProcAddress, 整数型, "kernel32.dll", "GetProcAddress", , 取进程路径
.参数 模块句柄, 整数型, , hMole
.参数 进程名称, 文本型, , lpProcName
.DLL命令 GetCurrentThreadId, 整数型, "kernel32.dll", "GetCurrentThreadId"
.DLL命令 获取特别文件夹位置_, 整数型, "shell32.dll", "SHGetSpecialFolderLocation"
.参数 窗口句柄, 整数型, , hwndOwner
.参数 文件夹位置, 整数型, , nFolder
.参数 结构, 项目标识符列表_, 传址, pIdl
.DLL命令 从列表id取路径_, 整数型, "shell32.dll", "SHGetPathFromIDListA", , $(b)
.参数 结构指针, 整数型, , pIdl
.参数 路径, 文本型, 传址, pszPath
.DLL命令 CallWindowProcA, 整数型, "user32.dll", "CallWindowProcA"
.参数 动态调用代码, 字节集, , 一定要用本人编写的
.参数 子程序, 子程序指针, , 子程序指针
.参数 参数, 整数型, 数组, 为整数数组,参数1为成员1…类推;文本型和字节集型(自定义结构)为指针
.参数 参数数目, 整数型, , 一定要和参数数组相符,不然会出错
.参数 是否C调用, 整数型, , 真为cdecl调用方式,假为stdcall调用方式(即标准WINAPI方式)
[这里函数所有代码和一个自定义类型,API代码在左边]
.版本 2
.程序集 程序集1
.程序集变量 临时呼出热键, 整数型
.程序集变量 临时载入窗口, 窗口
.程序集变量 钩子模块句柄, 整数型, , "1000"
.程序集变量 钩子句柄, 整数型, , "1000"
.程序集变量 钩子IDx, 整数型
.程序集变量 x, 整数型
.程序集变量 钩子句柄1, 整数型
.程序集变量 temp目录, 文本型
.程序集变量 xxx, 整数型
.程序集变量 热键钩子句柄, 整数型
.程序集变量 第一次, 逻辑型
.子程序 调用_调用子程序, 整数型, 公开, 呼叫某个函数 可以传入无限个参数 返回函数返回值
.参数 子程序指针, 子程序指针, , 指定函数
.参数 参数, 整数型, 可空 数组, 指定参数 可以不写, 参数为数组 格式为 参数[1]=xxx 参数[2]=xxx 文本型或字节集请用 转换指针 格式2 加入成员(参数,xxx)
.局部变量 动态调用代码, 字节集
动态调用代码 = { 85, 139, 236, 86, 139, 117, 16, 141, 78, 255, 133, 201, 124, 21, 139, 69, 12, 141, 4, 136, 65, 139, 16, 137, 85, 16, 255, 117, 16, 131, 232, 4, 73, 117, 242, 255, 85, 8, 137, 69, 12, 139, 69, 20, 133, 192, 116, 13, 141, 4, 181, 0, 0, 0, 0, 137, 69, 16, 3, 101, 16, 139, 69, 12, 94, 93, 194, 16, 0 }
返回 (CallWindowProcA (动态调用代码, 子程序指针, 参数, 取数组成员数 (参数), 0))
.子程序 操作_取特定目录, 文本型, 公开, 取特定的目录(返回所要取的指定目录名 无效返回空)
.参数 欲获取目录类型, 整数型, 可空, 0我的桌面 1临时目录 5我的文档 6我的收藏夹 7我的启动 11我的开始菜单 20系统字体 36Windows安装目录 37系统目录 [99更多]
.局部变量 路径, 文本型
.局部变量 标示结构, 项目标识符列表_
.局部变量 目录类型, 整数型
.如果真 (欲获取目录类型 = 99)
输出调试文本 (“0我的桌面 2我的程序 5我的文档 6我的收藏夹 7我的启动 8我最近的文档 9我的发送到 11我的开始菜单 13我的音乐 14我的视频 16我的桌面 20系统字体 22开始菜单组 23程序组 24启动组 25桌面 31收藏夹 32我的浏览器临时目录 33我的Cookies 34我的历史记录 36Windows安装目录 37系统目录 38文件安装目录 39我的图片 40用户目录 41系统目录 46文档 47管理工具 48我的管理工具 53音乐 54图片 55视频”)
.如果真结束
.如果 (欲获取目录类型 = 1)
目录类型 = 34
.否则
目录类型 = 欲获取目录类型
.如果结束
获取特别文件夹位置_ (0, 目录类型, 标示结构)
路径 = 取空白文本 (255)
从列表id取路径_ (标示结构.结构大小, 路径)
.如果真 (路径 = “”)
返回 (“”)
.如果真结束
.如果真 (欲获取目录类型 = 1)
路径 = 子文本替换 (路径, “History”, “Temp”, , , 真)
.如果真结束
返回 (路径 + “\”)
.子程序 注入_安装钩子DLL, 整数型, 公开, DLL注入 返回0=失败 整数型 DLL接口(代码值,参数1,参数2)
.参数 线程ID, 整数型, , -1 全局钩子
.参数 DLL全名, 文本型, , DLL全名
.参数 DLL接口, 文本型, 可空, 默认 整数型 钩子接口(代码值,参数1,参数2)
.局部变量 临时变量, 整数型
.局部变量 目录, 文本型
.局部变量 窗口句柄, 整数型
.如果真 (是否为空 (DLL接口) = 真)
DLL接口 = “钩子接口”
.如果真结束
.如果真 (线程ID = 0)
返回 (0)
.如果真结束
.如果真 (线程ID = -1)
线程ID = 0
.如果真结束
钩子IDx = 钩子IDx + 1
钩子模块句柄 [钩子IDx] = LoadLibraryA (DLL全名)
钩子句柄 [钩子IDx] = SetWindowsHookExA (3, GetProcAddress (钩子模块句柄 [钩子IDx], DLL接口), 钩子模块句柄 [钩子IDx], 线程ID)
目录 = 操作_取特定目录 (1)
写配置项 (目录 + “ada.ini”, “ada”, “钩子句柄”, 到文本 (钩子句柄 [钩子IDx]))
输出调试文本 (钩子IDx, 钩子模块句柄 [钩子IDx], 钩子句柄 [钩子IDx])
返回 (钩子IDx)
.版本 2
.子程序 注入_卸载钩子DLL, 逻辑型, 公开
.参数 钩子ID, 整数型, 可空, 卸载所有时无效
.参数 卸载所有, 逻辑型, 可空
.局部变量 xx, 整数型
.如果真 (卸载所有)
.如果真 (钩子IDx > 0)
.计次循环首 (钩子IDx, xx)
.如果真 (钩子模块句柄 [xx] ≠ 0)
FreeLibrary (钩子模块句柄 [xx])
UnhookWindowsHookEx (钩子句柄 [xx])
.如果真结束
.计次循环尾 ()
.如果真结束
返回 (真)
.如果真结束
.如果真 (钩子ID > 0)
.如果真 (钩子模块句柄 [钩子ID] ≠ 0)
FreeLibrary (钩子模块句柄 [钩子ID])
UnhookWindowsHookEx (钩子句柄 [钩子ID])
返回 (真)
.如果真结束
.如果真结束
返回 (假)
.子程序 注入_初始化钩子DLL, 整数型, 公开, DLL用.
.参数 代码值, 整数型
.参数 参数1, 整数型
.参数 参数2, 整数型
.参数 初始, 子程序指针
.局部变量 xxxx, 整数型
.如果真 (钩子句柄1 = 0)
temp目录 =操作_取特定目录 (1)
钩子句柄1 = 到整数 (读配置项 (temp目录 + “ada.ini”, “ada”, “钩子句柄”, ))
.如果真结束
.如果真 (第一次 = 假)
第一次 = 真
调用_调用子程序 (初始)
.如果真结束
返回 (CallNextHookEx (钩子句柄1, 代码值, 参数1, 参数2))
.子程序 注入_设置呼出窗口, 逻辑型, 公开
.参数 设置热键, 整数型
.参数 呼出窗口, 窗口
临时呼出热键 = 设置热键
临时载入窗口 = 呼出窗口
热键钩子句柄 = SetWindowsHookExA (2, 到整数 (&呼出键接口), 0, GetCurrentThreadId ())
.如果真 (热键钩子句柄 > 0)
返回 (真)
.如果真结束
返回 (假)
.子程序 呼出键接口, 整数型
.参数 一, 整数型
.参数 二, 整数型
.参数 三, 整数型
.如果真 (一 = 0 且 二 = 临时呼出热键 且 三 > 0)
.如果 (是否已创建 (临时载入窗口))
.如果 (临时载入窗口.可视)
临时载入窗口.可视= 假
.否则
临时载入窗口.可视= 真
.如果结束
.否则
载入 (临时载入窗口, , 假)
临时载入窗口.Esc键关闭= 假
临时载入窗口.最小化按钮= 真
.如果结束
.如果真结束
返回 (CallNextHookEx (热键钩子句柄, 一, 二, 三))
.版本 2
.数据类型 项目标识符列表_, , ITEMIDLIST
.成员 结构大小, 整数型, , , cb
.成员 标识符长度, 字节型, , "255", abID
此函数是用来调用指针函数的.就是CALL
取目录用这个我就不解释了
下面是源码主要函数
函数解释:
本函数参数1为要HOOK的线程ID,参数2为要注入的DLL名,参数3[可空]为DLL接口名字空则为"钩子接口".
下面解释是如何实现的:
1.首先使用LoadLibraryA获取DLL模块地址.
2.然后设置SetWindowsHookExA
参数一为HOOK类型,使用WH_GETMESSAGE(3) Hook来监视从GetMessage or PeekMessage函数返回息。
参数二为接口地址,就是说把消息返回转接到的位置,当然我们这里所使用的是我们DLL所公开的那个函数
参数三为接口模块的句柄即DLL的句柄(地址)
参数四为将要被HOOK的线程ID(0为全局HOOK,不推荐使用全局HOOK)
3.设置完后将钩子句柄写配置项到临时目录(后面将要使用).
说白了其实这个才是真正的接口(DLL里的接口只是在做转接而已),
我先讲这个函数是如何实现的(上面已经说了这才是真正的接口).
1,钩子句柄是一个程序集变量,先判断这个变量是否为0,如果等于0那么就是说这个函数第一次被使用,
第一次使用将读去上个函数写在临时目录的钩子句柄.
2.用一个逻辑变量(程序集变量或全局变量),来判断这个消息钩子是否第一次运行(为了防止后面调用
子程序被多次调用),是的话调用一个子程序(自己设置)
3.使用CallNextHookEx(呼叫下一个钩子)把当前HOOK的信息在传送回被HOOK的钩子里,那个钩子我们
就不用管了.
下来说下到底如何使用
首先在你的EXE程序里写这个(我就不多说这是干吗的了).
然后在DLL里写上这个代码(有人可能觉得眼熟,好像在什么地方见过,对了这个代码和
外挂作坊的钩子注入差不多)
下来说明下按键呼出窗口的函数
用变量把当前参数存起来(主要方便接口调用)
1.为当前运行线程设置一个键盘钩子
2.[接口]设置按键判断,如果按下我们设置的键将呼出窗口,如果这个窗口没创建将判断创建,
如果已经创建再次按下则会隐藏,
载入后的窗口把用ESC关闭的属性弄成假,不需要ESC关闭
3.最后就是再呼叫下以前的钩子.
最后就是卸载钩子DLL了.
判断是否要卸载全部的钩子,如果是就循环将现有钩子DLL全部卸载.
不是就按着ID来卸载
卸载方法:
1.FreeLibrary就是卸载一个载入的DLL
2.UnhookWindowsHookEx乃是卸载这个HOOK
-.-OK了这就是 钩子DLL注入,谢谢大家阅读,如果看不明白,
F. 易语言怎么hook关机命令
(信息框(“是仿备否关闭计算机”,0,“提示”) 然后判定返回值按下了哪个键 或者要密码的话做备亩毁个带密码的窗口,载入那个窗口,如果真(编辑框1.内容=“123” 且 编辑框2.内容=“456”) 则执行关闭系统() 求耐芦采纳!!
G. 易语言如何发送封包
易语言自带的有客户端,而且是可以发送的,还需要一个网截,E上面带的都有!
H. 易语言教程
IT9网络学院vip之零基础学习易语言教程(完整打包)
《易语言远程控制技术教程》
一切从零开始易语言辅助教程 荐
世宝易语言教程 荐
世恒易语言教程
中华隐士易语言全套高清课程【全套20课】完美收藏版
之乎者也易语言POST系列教程合集
仓库管理系统制作系列教程【全套1-11课】-全套打包下载易语言实战教程
华中红客基地易语言系列教程
天都吧易语言全套课程【共50课时】-史上最经典的易语言入门到精通课程【解压密码k9z6a3.b51..k】
技术海VIP课程易语言零基础到精通,特别好的最新教程!共2.27G!强烈推荐(1)
时光论坛易语言全套教程【易语言零基础+易语言抓包+易语言填表】完整版
易语言3D游戏开发视频教程+全套源码
易语言Hook从入门到精通
易语言VIP教程45课
易语言WEB QQ协议分析教程,实现各种QQ软件应用操作很不错的教程【共15课】 载很好的教程
易语言外挂初级【1-15】CE教程大全
易语言所有支持库 非静态库186个,静态库107个
易语言极品优秀源码
易语言正则表达式教程【精易论坛出品共12课时】-高清高速
易语言源码
易语言编程系统pdf 含详细目录
易语言网络编程
星缘正则表达式系列教程
甲壳虫vip之易语言培训班
精易论坛VIP-POST填表全套全套教程
觅风易语言教程
道德网安-易语言基本教程(共4章节)
集中营易语言百集学习视频(1·80集)
驱动级的一个应用实例(易语言,C++)语音教程
魔鬼作坊易语言外挂教程
黑手安全网VIP之易语言系列教程(打包)
黑猫论坛易语教程【共32课时】-很不错的HK易语言教程
黑鹰易语言教程 - -
独立团--VIP工具包.rar
易友编程助手源码.rar 2.86 MB
易语言2D游戏开发引擎最终版.rar 1.75 MB
易语言3D射击游戏源码.rar 28.95 MB
易语言DNF源码.rar 4.52 MB 2013-07-21
易语言nes模拟器源码.rar 211.11 KB
易语言Win8界面风格源码.rar 1.43 MB
易语言XP虚拟操作系统.rar 8.09 MB
易语言下载自绘界面.rar 833.22 KB
易语言仿iPhone4s源码.rar 2.32 MB
易语言天龙八部Flash窗口.rar 2.25 MB
易语言情人节礼物源码.rar 10.02 MB
易语言拳皇格斗游戏源码.rar 227.34 KB
易语言桌面版酷狗音乐.rar 383.84 KB
易语言梦想逍遥游整套源码.rar 38.15 MB
易语言模仿QQ2013登陆.rar 826.76 K
易语言炫彩界面库.rar 7.04 MB
易语言简单网络游戏.rar 1.22 MB
易语言绿盾杀毒软件源码.rar 1.66 MB
易语言网络游戏源码.zip 3.47 MB
易语言超酷启动界面.rar 4.47 MB
易语言酷炫界面引擎.rar 1.28 MB
易语言金山毒霸界面源码.rar 1.44 MB
易语言黑客记事本.rar
..............................
I. 易语言 HOOK API 教程 要详细的说明
#include#include "APIHook.h" extern CAPIHook g_OpenProcess; // 自定义OpenProcess函数 #pragma data_seg("YCIShared") HHOOK g_hHook = NULL; DWORD dwCurrentProcessId=0; #pragma data_seg() HANDLE WINAPI Hook_OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId) { typedef HANDLE (WINAPI *PFNTERMINATEPROCESS)(DWORD, BOOL,DWORD); if(dwProcessId != dwCurrentProcessId) { return ((PFNTERMINATEPROCESS)(PROC)g_OpenProcess)(dwDesiredAccess,bInheritHandle,dwProcessId); } return 0; } // 挂钩OpenProcess函数 CAPIHook g_OpenProcess("kernel32.dll", "OpenProcess", (PROC)Hook_OpenProcess); ////static HMODULE MoleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::CallNextHookEx(g_hHook, code, wParam, lParam); } BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId) { BOOL bOk; dwCurrentProcessId=dwThreadId; if(bInstall) { g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, MoleFromAddress(GetMsgProc), 0); bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; } API 通过HOOK OpenProcess() 实现进程防杀2007-07-04 14:41在WINDOWS操作系统下,当我们无法结束或者不知道怎样结束一个程序的时候,或者是懒得去找“退出”按钮的时候,通常会按“CTRL+ALT+DEL”呼出任务管理器,找到想结束的程序,点一下“结束任务”就了事了,呵呵,虽然有点粗鲁,但大多数情况下都很有效,不是吗? 设想一下,如果有这么一种软件,它所要做的工作就是对某个使用者在某台电脑上的活动作一定的限制,而唤培又不能被使用者通过“和历唯结束任务”这种方式轻易地解除限制,那该怎么做?无非有这么三种方法:1.屏蔽“CTRL+ALT+DEL”这个热键的组合;2.让程序不出现在任务管理器的列表之中;3.让任务管理器无法杀掉这个任务。对于第一种方法,这样未免也太残酷了,用惯了“结束任务”这种方法的人会很不习惯的;对于第二种方法,在WINDOWS 9X下可以很轻易地使用注册服务进程的方法实现,烂或但是对于WINDOWS NT架构的操作系统没有这个方法了,进程很难藏身,虽然仍然可以实现隐藏,但实现机制较为复杂;对于第三种方法,实现起来比较简单,我的作品:IPGate网址过滤器 就是采用的这种方式防杀的,接下来我就来介绍这种方法。 任务管理器的“结束任务”实际上就是强制终止进程,它所使用的杀手锏是一个叫做TerminateProcess()的Win32 API函数,我们来看看它的定义: BOOL TerminateProcess( HANDLE hProcess; // 将被结束进程的句柄 UINT uExitCode; // 指定进程的退出码 ); 看到这里,是不是觉得不必往下看都知道接下来要做什么:Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。 怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数: HANDLE OpenProcess( DWORD dwDesiredAccess, // 希望获得的访问权限 BOOL bInheritHandle, // 指明是否希望所获得的句柄可以继承 DWORD dwProcessId // 要访问的进程ID ); 脉络渐渐显现:在调用TerminateProcess()之前,必先调用OpenProcess(),而OpenProcess()的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要Hook的函数不是TerminateProcess()而是OpenProcess(),在每次调用OpenProcess()的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢? 至此,疑团全部揭开了。由Hook TerminateProcess()到Hook OpenProcess()的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了OpenProcess()上面,实现了进程防杀。喜悦之余,将这心得体会拿出来与大家分享。参考资料: http://hi..com/wlw7758/blog/item/9d109322816032f1d7cae2d7.html版权所有,谢绝抄袭!!!!!!
J. 易语言 如何通过 hook 获取控制台(类比为cmd)显示内容
可以参考C语言的成功案例。然后请求大神吧C语言的代码翻译过来;。。