如何检测自己程序的API被HOOK了
检查调用堆栈吧,如果调用当前方法的不是已知的或期望的则是被hook了。
比如javascript语言的:
var?test=function(){
???console.log(test.caller);//打印是谁调用当前方法的
};
var?callTest=function(){
????test();//调用test方法,test方法内部可以得到是callTest方法调用的
};
callTest();//正常调用;
//接下为演示hook
var?_bakTest=test;
var?test=function(){//hook?test方法
????_bakTest();//调用原来的test方法
};
callTest();//此时原来test方法内部的test.caller并不是callTest方法
如何使用WINSOCK命令处理消息,Api hook拦截修改socket数据包
面重点介绍创建挡截 WinSock 外挂程序基本步骤:
(1) 创建 DLL 项目选择 Win32 Dynamic-Link Library 再选择 An empty DLL project
(2) 新建文件 wsock32.h 按步骤输入代码:
① 加入相关变量声明:
HMODULE hModule=NULL; // 模块句柄
char buffer[1000]; // 缓冲区
FARPROC proc; // 函数入口指针
② 定义指向原WinSock库所函数址指针变量WinSock库共提供70函数限于篇幅选择几用函数列关些库函数说明参考MSDN相关内容
// 定义指向原 WinSock 库函数址指针变量
SOCKET (__stdcall *socket1)(int ,int,int);// 创建 Sock 函数
int (__stdcall *WSAStartup1)(WORD,LPWSADATA);// 初始化 WinSock 库函数
int (__stdcall *WSACleanup1)();// 清除 WinSock 库函数
int (__stdcall *recv1)(SOCKET ,char FAR * ,int ,int );// 接收数据函数
int (__stdcall *send1)(SOCKET ,const char * ,int ,int);// 发送数据函数
int (__stdcall *connect1)(SOCKET,const struct sockaddr *,int);// 创建连接函数
int (__stdcall *bind1)(SOCKET ,const struct sockaddr *,int );// 绑定函数
...... 其函数址指针定义略
(3) 新建 wsock32.cpp 文件按步骤输入代码:
① 加入相关文件声明:
#include
#include
#include "wsock32.h"
② 添加DllMain函数函数首先需要加载原WinSock库并获取库所函数址代码:
BOOL WINAPI DllMain (HANDLE hInst,ULONG ul_reason_for_call,LPVOID lpReserved)
{
if(hModule==NULL){
// 加载原 WinSock 库原 WinSock 库已复制 wsock32.001
hModule=LoadLibrary("wsock32.001");
}
else return 1;
// 获取原 WinSock 库所函数址并保存面仅列部代码
if(hModule!=NULL){
// 获取原 WinSock 库初始化函数址并保存 WSAStartup1
proc=GetProcAddress(hModule,"WSAStartup");
WSAStartup1=(int (_stdcall *)(WORD,LPWSADATA))proc;
// 获取原 WinSock 库消除函数址并保存 WSACleanup1
proc=GetProcAddress(hModule i,"WSACleanup");
WSACleanup1=(int (_stdcall *)())proc;
// 获取原创建 Sock 函数址并保存 socket1
proc=GetProcAddress(hModule,"socket");
socket1=(SOCKET (_stdcall *)(int ,int,int))proc;
// 获取原创建连接函数址并保存 connect1
proc=GetProcAddress(hModule,"connect");
connect1=(int (_stdcall *)(SOCKET ,const struct sockaddr *,int ))proc;
// 获取原发送函数址并保存 send1
proc=GetProcAddress(hModule,"send");
send1=(int (_stdcall *)(SOCKET ,const char * ,int ,int ))proc;
// 获取原接收函数址并保存 recv1
proc=GetProcAddress(hModule,"recv");
recv1=(int (_stdcall *)(SOCKET ,char FAR * ,int ,int ))proc;
...... 其获取函数址代码略
}
else return 0;
return 1;
}开机是显示没有找到APIHook_Dll.dll, 怎么办啊?电脑高手帮帮忙
可以从启动项去掉,不过看文件名有点像病毒的文件...
Hook是勾子,很多病毒都会利用勾子来监视键盘输入的...
你可以杀一下毒...
如果知道这个文件是那个程序的就另说了
如何理解createmutex
第一种方法,在程序没有执行 CreateMutex和OpenMutex 这两个api之前 Hook,一般都是主线程开始的代码,如果用一个程序检查该程序运行然后hook,根本就来不及Hook,因为Hook了的时候,该程序早就把这 2个函数执行了,除非要hook windows系统的程序装载器,当装载器把程序的代码映射到内存后,挂起该进程,然后hook
第二种方法,修改该程序的exe文件,把里面的导入表中这2个api的dll文件名修改成你自己写的dll文件名,然后在自己写个dll,改程序调用你写的dll中的api,随便想返回给他什么值自己看着办。
第三种方法,也是最好的方法,下载一个反汇编工具,找到 使用 这2个api的地方,肯定有个判断语句,判断是否多开,正常的是有多开,就结束程序,现在修改那个判断的汇编指令即可。