截获 Windows socket API(转)

截获 Windows socket API  1前言本文主要介绍了如何实现替换Windows上的API函数,实现Windows API Hook(当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如屏幕取词,个人防火墙等。这种API Hook技术并不是很新,但是涉及的领域比较宽广,要想做好有一定的技术难度。本文是采集了不少达人的以前资料并结合自己的实验得出的心得体会,在这里进行总 阅读详情

转载原文链接:https://blog.youkuaiyun.com/glliuxueke/article/details/2702608

1前言

本文主要介绍了如何实现替换Windows上的API函数,实现Windows API Hook(当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如屏幕取词,个人防火墙等。
这种API Hook技术并不是很新,但是涉及的领域比较宽广,要想做好有一定的技术难度。本文是采集了不少达人的以前资料并结合自己的实验得出的心得体会,在这里进行总结发表,希望能够给广大的读者提供参考,达到抛砖引玉的结果。


2问题
最近和同学讨论如何构建一个Windows上的简单的个人防火墙。后来讨论涉及到了如何让进程关联套接字端口,替换windows API,屏幕取词等技术。
其中主要的问题有:
1) 采用何种机制来截获socket的调用?
一般来说,实现截获socket的方法有很多很多,最基本的,可以写驱动,驱动也有很多种,TDI驱动, NDIS驱动,Mini port驱动…。由于我使用的是Win2000系统,所以截获socket也可以用Windows SPI来进行。另外一种就是Windows API Hook技术。
由于我没什么硬件基础,不会写驱动,所以第一种方法没有考虑,而用SPI相对比较简单。但是后来觉得Windows API Hook适应面更广,而且觉得自己动手能学到不少东西,就决定用Windows API Hook来尝试做socket Hook.

2) API Hook的实现方法?
实际上就是对系统函数的替换,当然实现替换的方法大概不下5,6种吧,可以参考《Windows核心编程》第22章。不过我使用的方法与其不近相同,应该相对比较简单易懂。


3原理
我们知道,系统函数都是以DLL封装起来的,应用程序应用到系统函数时,应首先把该DLL加载到当前的进程空间中,调用的系统函数的入口地址,可以通过 GetProcAddress函数进行获取。当系统函数进行调用的时候,首先把所必要的信息保存下来(包括参数和返回地址,等一些别的信息),然后就跳转到函数的入口地址,继续执行。其实函数地址,就是系统函数“可执行代码”的开始地址。那么怎么才能让函数首先执行我们的函数呢?呵呵,应该明白了吧,把开始的那段可执行代码替换为我们自己定制的一小段可执行代码,这样系统函数调用时,不就按我们的意图乖乖行事了吗?其实,就这么简单。Very very简单。 :P
实际的说,就可以修改系统函数入口的地方,让他调转到我们的函数的入口点就行了。采用汇编代码就能简单的实现Jmp XXXX, 其中XXXX就是要跳转的相对地址。
我们的做法是:把系统函数的入口地方的内容替换为一条Jmp指令,目的就是跳到我们的函数进行执行。而Jmp后面要求的是相对偏移,也就是我们的函数入口地址到系统函数入口地址之间的差异,再减去我们这条指令的大小。用公式表达如下:
int nDelta = UserFunAddr – SysFunAddr - (我们定制的这条指令的大小);
Jmp nDleta;
为了保持原程序的健壮性,我们的函数里做完必要的处理后,要回调原来的系统函数,然后返回。所以调用原来系统函数之前必须先把原来修改的系统函数入口地方给恢复,否则,系统函数地方被我们改成了Jmp XXXX就会又跳到我们的函数里,死循环了。

那么说一下程序执行的过程。
我们的dll“注射”入被hook的进程 -> 保存系统函数入口处的代码 -> 替换掉进程中的系统函数入口指向我们的函数 -> 当系统函数被调用,立即跳转到我们的函数 -> 我们函数进行处理 -> 恢复系统函数入口的代码 -> 调用原来的系统函数 -> 再修改系统函数入口指向我们的函数(为了下次hook)-> 返回。
于是,一次完整的Hook就完成了。

好,这个问题明白以后,讲一下下个问题,就是如何进行dll“注射”?即将我们的dll注射到要Hook的进程中去呢?
很简单哦,这里我们采用调用Windows提供给我们的一些现成的Hook来进行注射。举个例子,鼠标钩子,键盘钩子,大家都知道吧?我们可以给系统装一个鼠标钩子,然后所有响应到鼠标事件的进程,就会“自动”(其实是系统处理了)载入我们的dll然后设置相应的钩子函数。其实我们的目的只是需要让被注射进程载入我们的dll就可以了,我们可以再dll实例化的时候进行函数注射的,我们的这个鼠标钩子什么都不干的。


4简单的例子OneAddOne
讲了上面的原理,现在我们应该实战一下了。先不要考虑windows系统那些繁杂的函数,我们自己编写一个API函数来进行Hook与被Hook的练习吧,哈哈。


第一步,首先编写一个add.dll,很简单,这个dll只输出一个API函数,就是add啦。
新建一个win32 dll工程,
add.cpp的内容:

#include "stdafx.h"

int WINAPI add(int a,int b){  //千万别忘记声明WINAPI 否则调用的时候回产生声明错误哦!
 return a+b;
}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{undefined
    return TRUE;
}


然后别忘了在add.def里面输出函数:

LIBRARY  Add
DESCRIPTION "ADD LA"
EXPORTS
 add  @1;

编译,ok,我们获得了add.dll


第二步,编写1+1主程序
新建一个基于对话框的工程One,
在 OnOK()里面调用add函数:
ConeDlg.h里面加入一些变量的声明:
….
Public:
 HINSTANCE hAddDll;
 typedef int (WINAPI*AddProc)(int a,int b);
 AddProc add;
…

ConeDlg.cpp里进行调用:

void COneDlg::OnOK()
{undefined
 // TODO: Add extra validation here
 if (hAddDll==NULL)
  hAddDll=::LoadLibrary("add.dll");

 add=(AddProc)::GetProcAddress(hAddDll,"add");

 int a=1;
 int b=2;
 int c=add(a,b);
 CString tem;
 temp.Format("%d+%d=%d",a,b,c);
 AfxMessageBox(temp);
}

OK,编译运行,正确的话就会显示1+2=3咯

第3步,要动手Hook咯,爽阿
新建一个MFC的 dll工程,Hook
在Hook.dll工程里:

添加一个鼠标Hook MouseProc,鼠标hook什么也不做
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{undefined
 LRESULT RetVal= CallNextHookEx(hhk,nCode,wParam,lParam);
 return RetVal;
}

添加鼠标钩子的安装和卸载函数:
BOOL InstallHook()
{undefined
 
 hhk=::SetWindowsHookEx(WH_MOUSE,MouseProc,hinst,0);

 ….
 return true;
}

void UninstallHook()
{undefined
 ::UnhookWindowsHookEx(hhk);
}

再实例化中获得一些参数
BOOL CHookApp::InitInstance()
{undefined
 获得dll 实例,进程句柄
hinst=::AfxGetInstanceHandle();
 DWORD dwPid=::GetCurrentProcessId();
 hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);
//调用注射函数
 Inject();
 return CWinApp::InitInstance();
}

好,最重要的注射函数:
void Inject()
{undefined
 
 if (m_bInjected==false)
 { //保证只调用1次
  m_bInjected=true;

  //获取add.dll中的add()函数
  HMODULE hmod=::LoadLibrary("add.dll");
  add=(AddProc)::GetProcAddress(hmod,"add");
  pfadd=(FARPROC)add;
  
  if (pfadd==NULL)
  {undefined
   AfxMessageBox("cannot locate add()");
  }

  // 将add()中的入口代码保存入OldCode[]
  _asm
  {
   lea edi,OldCode
   mov esi,pfadd
   cld
   movsd
   movsb
  }

  NewCode[0]=0xe9;//实际上0xe9就相当于jmp指令
  //获取Myadd()的相对地址
  _asm
  {
   lea eax,Myadd
   mov ebx,pfadd
   sub eax,ebx
   sub eax,5
   mov dword ptr [NewCode+1],eax
  }
  //填充完毕,现在NewCode[]里的指令相当于Jmp Myadd
  HookOn(); //可以开启钩子了
 }
}

开启钩子的函数
void HookOn()
{
 ASSERT(hProcess!=NULL);

 DWORD dwTemp=0;
 DWORD dwOldProtect;
 
 //将内存保护模式改为可写,老模式保存入dwOldProtect
 VirtualProtectEx(hProcess,pfadd,5,PAGE_READWRITE,&dwOldProtect);
     //将所属进程中add()的前5个字节改为Jmp Myadd
 WriteProcessMemory(hProcess,pfadd,NewCode,5,0);
 //将内存保护模式改回为dwOldProtect
 VirtualProtectEx(hProcess,pfadd,5,dwOldProtect,&dwTemp);

 bHook=true;
}

关闭钩子的函数
void HookOff()//将所属进程中add()的入口代码恢复
{
 ASSERT(hProcess!=NULL);

 DWORD dwTemp=0;
 DWORD dwOldProtect;

 VirtualProtectEx(hProcess,pfadd,5,PAGE_READWRITE,&dwOldProtect);
 WriteProcessMemory(hProcess,pfadd,OldCode,5,0);
 VirtualProtectEx(hProcess,pfadd,5,dwOldProtect,&dwTemp);
 bHook=false;
}

然后,写我们自己的Myadd()函数
int WINAPI Myadd(int a,int b)
{undefined
 //截获了对add()的调用,我们给a,b都加1
 a=a+1;
 b=b+1;

 HookOff();//关掉Myadd()钩子防止死循环

 int ret;
 ret=add(a,b);

 HookOn();//开启Myadd()钩子
 
 return ret;
}

然后别忘记在hook.def里面输出 
InstallHook  
 MouseProc
 Myadd
 UninstallHook 
四个函数。
(全部的程序会贴在最后面的)

好到这里基本上大功告成咯

第4步,我们就可以修改前面的One的测试程序了

增加一个安装钩子的函数/按钮
void COneDlg::doHook()
{undefined
 hinst=LoadLibrary("hook.dll");
 if(hinst==NULL)
 {undefined
  AfxMessageBox("no hook.dll!");
  return;
 }
 typedef BOOL (CALLBACK *inshook)();
 inshook insthook;

 insthook=::GetProcAddress(hinst,"InstallHook");
 if(insthook==NULL)
 {undefined
  AfxMessageBox("func not found!");
  return;
 }

 DWORD pid=::GetCurrentProcessId();
 BOOL ret=insthook();
}

别忘了退出时卸掉钩子
void COneDlg::OnCancel()
{undefined
 // TODO: Add extra cleanup here
 typedef BOOL (CALLBACK *UnhookProc)();
 UnhookProc UninstallHook;

 UninstallHook=::GetProcAddress(hinst,"UninstallHook");
 if(UninstallHook==NULL) UninstallHook();
 if (hinst!=NULL)
 {undefined
  ::FreeLibrary(hinst);
 }
 if (hAddDll!=NULL)
 {undefined
  ::FreeLibrary(hAddDll);
 }
 CDialog::OnCancel();
}

好了,大功告成咯,现在运行一下One,
先点Ok,测试1+2=3 没问题,
然后点Hook,安装钩子,,显示installhook ok,然后再点一下ok,
哈哈,发现结果1+2=5 !!!???
Hook成功啦!
附上Hook.cpp的原码
/
Hook.cpp

// Hook.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "Hook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CHookApp

BEGIN_MESSAGE_MAP(CHookApp, CWinApp)
 //{undefined{AFX_MSG_MAP(CHookApp)
  // NOTE - the ClassWizard will add and remove mapping macros here.
  //    DO NOT EDIT what you see in these blocks of generated code!
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CHookApp construction

CHookApp::CHookApp()
{undefined
 // TODO: add construction code here,
 // Place all significant initialization in InitInstance
}

/
// The one and only CHookApp object

CHookApp theApp;

//变量定义

//不同Instance共享的该变量
#pragma data_seg("SHARED")
static HHOOK  hhk=NULL; //鼠标钩子句柄
static HINSTANCE hinst=NULL; //本dll的实例句柄 (hook.dll)
#pragma data_seg()
#pragma comment(linker, "/section:SHARED,rws")
//以上的变量共享哦!

CString temp; //用于显示错误的临时变量
bool bHook=false; //是否Hook了函数
bool m_bInjected=false; //是否对API进行了Hook
BYTE OldCode[5]; //老的系统API入口代码
BYTE NewCode[5]; //要跳转的API代码 (jmp xxxx)
typedef int (WINAPI*AddProc)(int a,int b);//add.dll中的add函数定义
AddProc add; //add.dll中的add函数
HANDLE hProcess=NULL; //所处进程的句柄
FARPROC pfadd;  //指向add函数的远指针
DWORD dwPid;  //所处进程ID
//end of 变量定义

//函数定义
void HookOn(); //开启钩子
void HookOff(); //关闭钩子
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam); //鼠标钩子函数
void Inject(); //具体进行注射,替换入口的函数
int WINAPI Myadd(int a,int b); //我们定义的新的add()函数
BOOL InstallHook(); //安装钩子函数
void UninstallHook(); //卸载钩子函数
//end of 函数定义


BOOL CHookApp::InitInstance()
{undefined
 //获取自身dll句柄
 hinst=::AfxGetInstanceHandle();
 //获取所属进程id和句柄
 DWORD dwPid=::GetCurrentProcessId();
 hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwid);
 //调用函数注射
 Inject();
 
 return CWinApp::InitInstance();
}

int CHookApp::ExitInstance()
{undefined
 // 如果add钩子开着,则将其关闭
 if (bHook)
  HookOff();

 return CWinApp::ExitInstance();
}

BOOL InstallHook()
{undefined
 
 hhk=::SetWindowsHookEx(WH_MOUSE,MouseProc,hinst,0);

 if (hhk==NULL)
 {undefined
  DWORD err=::GetLastError();
  temp.Format("hook install failed!:%d",err);
  AfxMessageBox(temp);
  return false;
 }

 AfxMessageBox("hook installed!");
 return true;
}

void UninstallHook()
{undefined
 if (hhk!=NULL)
 ::UnhookWindowsHookEx(hhk);
 AfxMessageBox("Unhooked!");
}

void Inject()
{undefined
 
 if (m_bInjected==false)
 {undefined
  m_bInjected=true;


  //读取add.dll并查找到add()函数
  HMODULE hmod=::LoadLibrary("add.dll");
  add=(AddProc)::GetProcAddress(hmod,"add");
  pfadd=(FARPROC)add;
  
  if (pfadd==NULL)
  {undefined
   AfxMessageBox("cannot locate add()");
  }

  // 将add()的入口代码保存到OldCode里
  _asm
  {
   lea edi,OldCode
   mov esi,pfadd
   cld
   movsd
   movsb
  }

  NewCode[0]=0xe9;//第一个字节0xe9相当于jmp指令
  //获取Myadd()的相对地址
  _asm
  {
   lea eax,Myadd
   mov ebx,pfadd
   sub eax,ebx
   sub eax,5
   mov dword ptr [NewCode+1],eax
  }
  //填充完毕,现在NewCode[]里面就相当于指令 jmp Myadd
  HookOn();
 }
}

int WINAPI Myadd(int a,int b)
{undefined
 //截获了对add()的调用,我们给a,b都加1
 a=a+1;
 b=b+1;


 HookOff();//关掉Myadd()钩子防止死循环

 int ret;
 ret=add(a,b);

 HookOn();//开启Myadd()钩子
 
 return ret;
}

LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
  )
{undefined

 LRESULT RetVal= CallNextHookEx(hhk,nCode,wParam,lParam);
 return RetVal;
}


void HookOn()
{
 ASSERT(hProcess!=NULL);

 DWORD dwTemp=0;
 DWORD dwOldProtect;
 
 //将内存保护模式改为可写,老模式保存入dwOldProtect
 VirtualProtectEx(hProcess,pfadd,5,PAGE_READWRITE,&dwOldProtect);
    //将所属进程中add的前5个字节改为Jmp Myadd
 WriteProcessMemory(hProcess,pfadd,NewCode,5,0);
 //将内存保护模式改回为dwOldProtect
 VirtualProtectEx(hProcess,pfadd,5,dwOldProtect,&dwTemp);

 bHook=true;
}

void HookOff()//将所属进程中add()的入口代码恢复
{
 ASSERT(hProcess!=NULL);

 DWORD dwTemp=0;
 DWORD dwOldProtect;

 VirtualProtectEx(hProcess,pfadd,5,PAGE_READWRITE,&dwOldProtect);
 WriteProcessMemory(hProcess,pfadd,OldCode,5,0);
 VirtualProtectEx(hProcess,pfadd,5,dwOldProtect,&dwTemp);
 bHook=false;
}

//
hook.def

LIBRARY      "Hook"
DESCRIPTION  'Hook Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
 InstallHook  
 MouseProc
 Myadd
 UninstallHook

5 实战Hook Win Socket API

如果对于上面这章的的理解没有什么问题的化,我想对于windows API的Hook应该也就是按部就班的做就可以了,不会有太大的问题,只要足够细心耐心,善于处理发现一些细节问题就行了。

当然,为了使我们的程序使用起来更灵活方便,必须要改进我们的程序结构,因为我们要Hook很多的API,不可能为每个API制定一套注射、截获的函数,
所以,我设计了一个类来储存某个API的一些信息:
class CHookFuncInfo
{undefined
public:
 CHookFuncInfo(LPCTSTR szLibName,LPCTSTR szOldname,LPCTSTR szNewName)
 {undefined
  //构造函数必须设定三个参数
  strcpy(LibraryName,szLibName);
  strcpy(OldFuncName,szOldname);
  strcpy(NewFuncName,szNewName);
  Injected=false;
 }
public:
 HINSTANCE hinstLib; //该函数所在dll模块的实例句柄
 FARPROC fpFunc;  //指向原函数的指针
 BYTE OldCode[5]; //原函数入口处的代码
 BYTE NewCode[5]; //跳转到我们函数入口地址的代码Jmp xxxx
 FARPROC fpMyFunc; //指向我们函数地址的指针
 char LibraryName[256]; //该函数所属的dll模块的名称
 char OldFuncName[256]; //原API函数名
 char NewFuncName[256]; //我们程序中定义的新API函数名
 bool Injected; //该函数是否被Hook
};

对某API函数的注射都可以用Inject()来处理
void Inject(CHookFuncInfo* phinfo);
开/关某个API可以用HookOn/HookOff来处理
void HookOff(CHookFuncInfo * phinfo);
void HookOn(CHookFuncInfo * phinfo);

需要注意的是,在汇编代码里,不可以直接对对象的指针进行调用
即 mov eax, phinfo->fpFunc;诸如此类的代码是不被允许的。
所以我们要加入新的变量,处理完毕,将变量值传回给传入的对象指针:
void Inject(CHookFuncInfo * phinfo)
{undefined
 …….

 FARPROC fpFunc=phinfo->fpFunc;
 BYTE OldCode[5],NewCode[5];
……
 汇编代码
……
  memcpy(phinfo->OldCode,OldCode,5);
  memcpy(phinfo->NewCode,NewCode,5);  
  HookOn(phinfo);//开启钩子
 return;
}


举个例子:
CHookFuncInfo hinfoSendto("wsock32.dll","sendto","MySendto");
//创建一个sendto函数的API钩子
然后注射-〉开启钩子-〉…

下面是我定义的MySendto()的代码:
int WINAPI MySendto(
  SOCKET s,                       
  const char FAR *buf,           
  int len,                        
  int flags,                      
  const struct sockaddr FAR *to, 
  int tolen                       
  )
{undefined
 int ret;
 HookOff(&hinfoSendto);//关钩子

 //下面这段就是通过WM_COPYDATA传递消息的方法,
//将一些sendto()的数据通过字符串方式传递给
//名为”XsockSpy”的窗体。
//XsockSpy窗体只需要响应对WM_COPYDATA的处理和显示就OK了,很简单。

 HWND hwnd=::FindWindow("#32770","XSockSpy");
 CString temp;
 temp.Format("pid:%d sending %d bytes",g_pid,len);
 if(hwnd!=NULL)
 {undefined
  COPYDATASTRUCT cpdata;
  cpdata.dwData=0;
  cpdata.lpData=temp.GetBuffer(0);
  cpdata.cbData=temp.GetLength();
  ::SendMessage(hwnd,WM_COPYDATA,0,(LPARAM)&cpdata);
 }
 
 //调用真正的sendto()函数
 ret=::sendto(s,buf,len,flags,to,tolen);
 if (ret==SOCKET_ERROR
 {undefined
  temp.Format("send error:%d",WSAGetLastError());
  AfxMessageBox(temp);
 }
 //开钩子
 HookOn(&hinfoSendto);
 return ret;
};

基于API HOOK的软件行为分析系统 基于API HOOK的软件行为分析系统(Qt) 阅读详情

相关推荐

掌握Windows Sockets API:网络编程指南

本文还有配套的精品资源,点击获取 简介:Windows Sockets是微软Windows平台中的网络编程API,提供标准化网络协议访问。本文将详细介绍其核心概念、API函数、多线程与异步操作,以及错误处理。同时提供实际应用示例,如HTTP服务器、P2P文件共享、在线聊天室和网络监控工具,帮助开发者构建跨平台网络应用程序。 1. Windows Sockets基础...

weixin_42284380的博客 853

window下的socket

变量ul的初始值为1,这是由于无符号长整型是32位的,也就是在二进制下有32位,因此设置为1即为将第一位设置为1,表示“真”。WSADATA是Windows Socket API的一个结构体,WSADATA结构体包含Winsock版本号\实现此Winsock服务的最高版本号。描述此Winsock实现的可读字符串。提供实现的关于Winsock的需要的基本信息。connect函数执行成功时返回0,失败时返回-1,并设置相应的错误代码。在windows下创建一个socket,可以借助Winsock库来实现。

mankeywang的博客 576

CTF实战:从ECDSA签名漏洞到flag获取

本文详细解析了ECDSA签名算法在CTF比赛中的实战应用,重点探讨了随机数重用和参数泄露等常见漏洞。通过PWNHUB六月赛的例题,展示了如何从签名数据中恢复私钥并获取flag,同时提供了防御措施和实战技巧,帮助参赛者提升解题能力。

weixin_42706667的博客 273

【Windows编程】Windows Socket API介绍

01、目录 目录01、目录02、浅谈Socket(套接字)03、浅谈TCP/IP七层模型04、浅谈三次握手,四次挥手05、Socket API介绍5.1 WSAStartup5.2 WSAClearup5.3 socket5.4 closesocket5.5 bind5.6 Listen5.7 accept5.8 connect5.9 send5.10 recv06、附录07、总结 02、浅谈Socket(套接字) socket(插座)编程是一门技术,它主要是在网络通信中经常用到。英文单词意思是“插座”。

Cain Xcy的博客 2773

从零配置ORB-SLAM3:TUM-VI数据集yaml文件参数调优指南

本文深入解析了ORB-SLAM3在TUM-VI数据集上的yaml配置文件参数调优方法。针对双目惯性模式,详细拆解了相机标定、IMU噪声模型和ORB特征提取三大模块的关键参数,解释了其原理与影响,并通过实战案例展示了如何通过调整特征点数量、FAST阈值及IMU噪声参数,有效提升系统在低纹理环境下的鲁棒性和轨迹精度。

weixin_29071809的博客 151

保姆级教程:用Kvaser DB Editor从零创建你的第一个DBC文件(附CAN信号属性详解)

本文提供了一份详细的Kvaser DB Editor教程,指导用户从零开始创建DBC文件,并深入解析CAN信号属性的关键设置。通过步骤清晰的安装指南、信号属性配置详解和实用技巧,帮助工程师和学生快速掌握CAN总线通信的核心工具,提升工作效率。

weixin_27076351的博客 246

Windows Socket API 使用经验

Windows Socket API 使用经验 本文是我在进行MS-Windows、HP-unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 一、WSAStartup函数 int WSAStartup( WORD wVersionRequested, LPWSADATA lpW...

毛毛帅 241

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1565

如何看懂c语言的api函数,如何截获API函数

我曾经写过一个截获MessageBoxW的程序,可以看看,或许对你有一些帮助.该程序是基于HOOK原理,主要是将自己的函数放到目标PROCESS的地址空间,这里是使用HOOK实现.首先建立一个MOUSE的HOOK程序,然后在全局鼠标HOOK的DLL中做截获动作,可以在PROCESS_ATTACH时做,也可以在鼠标的HOOK链函数中做.建立全局HOOK我就不说了,可以在网上很多地方看到.主要是截获动...

weixin_31301881的博客 406

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3754

人形机器人电路板和算法分析

人形机器人电路板与算法深度剖析 电路板领域:人形机器人电子系统分为计算、驱动、感知、能源、通信五大模块。主控板采用高性能SoM(如NVIDIA Jetson AGX Orin),需满足严格电源完整性(PDN)与信号完整性(SI)要求;关节驱动板集成MCU、GaN/SiC功率器件及高精度编码器接口,采用刚柔结合PCB以适应狭小空间。挑战包括热-振可靠性(85°C/10G振动)、高密度互连(3mil线宽)及EMC兼容性。 算法领域:运动控制依赖MPC(模型预测控制)与强化学习(RL),实现实时动态平衡;感知算法

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 305

C# Windows API Hook(转载)

转自【未完待续的博客http://blog.sina.com.cn/yy520xxr】 前言 本文主要介绍了如何实现替换Windows上的API函数,实现Windows API Hook(当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如屏幕取词,个人防火墙等。这种API Hook技术并不是很新,但是涉及的领域比较宽...

614

Error: Flash Download failed - Target DLL has been cancelled

由于换了新电脑,keil重装了下,然而之前的MCU的支持包没有安装,以及一些其他的问题,导致可以编译但是不能将程序烧录到单片机中。现整理一下解决思路: 1、将支持包下载并添加: 找到你需要用的MCU的具体型号: 例如: 点击网址,下载安装包,或者在csdn等其他网址下载安装包,将下载好的pack包放到keil5的安装目录下的.Download中: 点击file中的import,将路径选择到.........

hanhan的博客 5万+

网络数据截获方法

网络数据截获方法作者:浩海孤帆@bbs.net130.com网络数据截获方法网络数据包截获机制是网络入侵检测系统的基础组件。一般指通过截获整个网络的所有信息流量,根据信息源主机,目标主机,服务协议端口等信息简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更高层的应用程序进行分析。流程图如下:图5.1?网络数据截获流程一方面要,网络截取模块要能保证截取到所有网络上的数据包,尤其是检测到被分片的数据

超然楼 5779

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Windows API Hook

原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是因为看了原文,我才学会了HOOK,鉴于原文的排版不是很好, 又没有原工程例子源码下载,因此我决定对其重新整理,文章后面附有我测试时的工程源码下载地址。 注:我测试的环境为Win7+VS2008+MFC 原文出处,好像是这篇:http:/

jiangqin115的专栏 1004

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Windows HOOK API (二)

资料来源:http://blog.sina.com.cn/s/blog_628821950100xmuc.html HooK MessageBox消息:http://blog.youkuaiyun.com/friendan/article/details/12222651 前言 本文主要介绍了如何实现替换Windows上的API函数,实现Windows API Hook(当然,对于socket的

六月心悸 1314

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux钩子拦截删除文件,利用HOOKAPI拦截文件操作

功能简介HookAPI 是一个截获Windows 32位API函数的开发包,它可以在Windows调用某个API函数的时候,先调用自己编写的函数,从而实现特殊的功能。HookAPI同样也适用于截获用户自己编写的DLL文件中的输出函数。1.5系统特点:1)自己编写的替代函数的参数形式和原API函数完全一样,方便了Delphi和VB用户的使用。2)实时截获所有新建立的进程,即进程建立后马上安装钩子,而...

weixin_36080429的博客 710

利用HOOKAPI拦截文件操作

先读下HookAPI 使用文档:功能简介HookAPI 是一个截获Windows 32位API函数的开发包,它可以在Windows调用某个API函数的时候,先调用自己编写的函数,从而实现特殊的功能。HookAPI同样也适用于截获用户自己编写的DLL文件中的输出函数。 1.5系统特点:1)自己编写的替代函数的参数形式和原API函数完全一样,方便了Delphi和VB用户的使用。2)实时截获所有新建立的...

bruce135lee的专栏 4107

(转)Windows下Hook API技术

什么叫Hook API?所谓Hook就是钩子的意思,而API是指Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能,Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。在讲Hook API之前先来看一下如何Hook消息,例如Hook全局键盘消息,从而可

gxj1680的专栏 643
上一篇: HTTP劫持
下一篇: Windows Hook案例分析与技术探索
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值