布鼓雷门1回~~VC++.NET 2010写的HOOK RECV代码

//那些函数,正是我们用来替换RECV函数的玩意儿了,必须让这些东西和RECV函数证明一样,这么相同呢,很轻松,VC++.NET也有相近VB的代码提醒(尽管少点),找三个适当的地点打上recv(小写)然后打圆括号……看到了?
int WINAPI m_ws2_recv(SOCKET s, char FAR *buf, int len, int flags)
{
    int nReturn = 0; 
//这么些东西记录了RECV的重临值,-一为不当,大家不处理,0为断开,别的嘛,就是事实上从SOCKET缓冲区复制了不怎么字节到RECV缓冲区。简单的讲,-一,0都不处理,其余值正是大家要从BUF里面读多少字节了!

ACCESS,extern “C” _declspec(dllexport) void __stdcall Init(DWORD PID ,HWND
FormHandle)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState());  
//这些……VC里叫宏吧,哎……说来话长,这句去掉也不在乎的

VC用分号来识别行甘休,而VB用回车;VB用圆括号表示数组,VC用方括号……不多说了,笔者也不是很驾驭,总而言之习惯就好

 

 hookfunc->newdata[6]=0xE0;//到那里是 JMP EAX
 hookfunc->newdata[7]=0xCC;//填充二个INT三,其实NOP(&h90)啥的也行,换句话说这么些不改、不理他都得以,可是翻看帖卯时见到部分人说CPU识别错代码,何人知道真假,照旧放个明明的相比较保障……
 memcpy(&hookfunc->newdata[1], &mFncAddress, 四); 
//那里替换了上边提到的 00000000 为大家用来替代RECV的函数的地点
 HookOnOne(hookfunc);  //将RECV函数前八字节交替为大家创设的代码——初叶HOOK
RECV
 return true;
}

三、类型转换:VB有显式或隐式的,而VC必须用显式的——即时内部存款和储蓄器里面存的便是不行东东你也无法直接拿来用,够严格,然则指针够灵活也够太灵活……调换时使用的不二等秘书技就是在圆括号内部写入你要的花色,前面随着你的参数就能够。例如:

三、VB.NET的DLL:公开3个主意,使得CLLacrosse可以找到并平素调用它。接下来的事情都在这几个DLL里面处理就行了,爱运营线程运转线程,想读什么就读什么,想写什么就写什么呢。结合从前完毕的HOOK本进程API的局地办法,完全可以用托管代码来HOOK和拍卖了。

void SendMsg(char *buf,DWORD len,DWORD Index);
void HookOnOne(HOOKSTRUCT *hookfunc);
void HookOffOne(HOOKSTRUCT *hookfunc);
bool HOOKAPI(DWORD Address,HOOKSTRUCT *hookfunc,DWORD mFncAddress);

 _dwIdNew = PID ;           
//备份PID,其实背后代码没用到,首如若为着鉴定分别注入了三个程序的话,是哪个程序发回去的音信吗
 _fHandle = FormHandle ;  //接收音信的窗口句柄,SendMsg函数用到
 hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, _dwIdNew);  
//展开进度,进一步操作他
}

//显著了,那几个事解除RECV HOOK的
extern “C” _declspec(dllexport) bool __stdcall UnHook_ws2_Recv()
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 HookOffOne(&_ws2_RecvHook);
    return true;
}
//—————————————————————————

 

伍、别的看看就领悟了,VC用API、常数等根本不表明……而是导入.H文件呢(头文件,而且个中能够用宏来改变API书写的名称,就好像VB表明API时那多少个小名吧),反正那几个工程里没用到。

 

int WINAPI m_ws2_recv(SOCKET s, char FAR *buf, int len, int flags);

 

一、VC里面阐明变量和VB不一致:类型在前,名称在后,例如:

真就是布鼓雷门,因为本身是学VB的,就算VB陆和.NET都算入门吧,可真的拿VC++写程序如故首先次。学B/C/D的就莫看了。

一、VC的DLL:导出1个函数,用来加载CLHighlander而后加载VB.NET的DLL并调用其钦赐方法,拾来行代码而已。

//那下边的这么些实物,便是一个定义,和底下写的函数实体一样申明就能够,VB里不用如此干编写翻译器也能辨别都有怎么样函数,可VC不成

 HookOffOne(&_ws2_RecvHook); //先关闭HOOK,因为早已进去大家的函数了
    nReturn = recv(s, buf, len, flags); 
//先运营原来的RECV,不然我们不可能得到或不可能博得方方面面被复制的内容
 HookOnOne(&_ws2_RecvHook); //继续HOOK

上面就二个用VB的人能明白为目的做简单表明和注释:

 //sndmsg((DWORD)len,(DWORD)nReturn);

 

等同于:

(DWO福睿斯D)LEN;正是把LEN调换到DWO汉兰达D类型,据本人晓得照旧是UINTEGEEnclave,要么是INTEGE奥迪Q5,可能两样API须求差别,小编直接都是按INTEGEHaval处理的,也正是说,前面那句相当于CTYPE(LEN,INTEGETiggo)了。

今天来编排一下帖子,因为用VB.NET达成了HOOK工作。

HWND  _fHandle ;  //接收音讯窗口句柄
DWORD _dwIdNew ;  //PID
HANDLE hProc; 
//进程内核句柄,就是OPENPROCESS展开PID得到的万分东东——读写内部存款和储蓄器用到
////////////////////////////////////////
DWORD _ws2_RecvIndex = 1 ;  //ws2_32.dll
RECVHOOK评释,实际和HOOK不妨,可是当您HOOK的函数多起来,你得区分是哪位函数发来的消息啊!
HOOKSTRUCT _ws2_RecvHook; //ws2_32.dll HOOK结构
////////////////////////////////////////

//表明全体都以以RECV函数为例,其实那些函数是1个通用函数

贰、注入器:远线程运维API的力量(那一个代码很久在此之前也发过了),当然,依照需求还恐怕供给设置某个经过访问权限也许更底层的事物。

 

//上边那个用来:记录被HOOK函数前八字节原本数据、创设新的八字节代码、将新代码替换RECV函数原来代码的

4、&将会吗后边的变量变为指针,*将会把指针形成相应的数码……说的不确切,应该是改换吧

 if ( nReturn == SOCKET_ERROR )
 return -1 ;
 
 SendMsg(buf ,nReturn,_ws2_RecvIndex);
//发送BUF里面NRETUEnclaveN个字节到接受窗体
  
    return(nReturn);
}
/////////////////////////////////////////////////////////////////////////////
//WSARECV

/////////////////////////////////////////////////////////////////////////////////

//将大家创设的代码写入——打开HOOK
void HookOnOne(HOOKSTRUCT *hookfunc)
{
 WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->newdata,
8, 0);
}

 

以上言论如有误导,请尽早提议………………以防造孽越来越深…………感谢………………

 

//发送WM_COPYDATA新闻到钦定窗口
void SendMsg(char *buf,DWORD len,DWORD Index)
{
          COPYDATASTRUCT cds;  
          cds.dwData = 0;//sizeof(COPYDATASTRUCT);   
//有的说那一个参数影响发送,还没用到,本来是存PID的,个人感到应该不会潜移默化
          cds.cbData = len;    //LPDATA里面包车型地铁字节数
          cds.lpData = buf;   //实际数据
         
SendMessage(_fHandle,WM_COPYDATA,(WPARAM)Index,(LPARAM)&cds); 
//发到INIT里面钦定的特别窗口
}

////////////////////////////////////////////////////////////////////////////////////
//recv,这一个函数将贯彻RECV函数的替换:只需实行叁遍就能够
////////////////////////////////////////////////////////////////////////////////////
extern “C” _declspec(dllexport) bool __stdcall Hook_ws2_Recv(DWORD
RecvAddress)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 HOOKAPI(RecvAddress,&_ws2_RecvHook,(DWORD)m_ws2_recv);
//这里,(DWORD)m_ws2_recv的再次回到值就是m_ws2_recv函数的地方!你看人家VC多造福……
    return true;
}

切实贯彻就不贴了,终归不应该归为原创,网上早已有不计其数好像代码了,只是一贯调用CorBindToRuntimeEx,使用远线程的并不是众多,之所以选择远线程是因为能够在VC的DLL的导出函数那里传来壹些参数。例如:加载的CL普拉多版本,标记,要调用的托管DLL,类,方法,参数等都得以由注入器传递,从而抓牢了通用性和操纵的灵活性。毕竟小编还没到纠结到底几个DLL的境地,当CLCRUISER加载达成并运转托管DLL时对方进度还不精通多出来多少DLL呢。

//将原先的函数内容写回——关闭HOOK
void HookOffOne(HOOKSTRUCT *hookfunc)
{
 WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->olddata,
8, 0);
}
//—————————————————————————

二、VC里面包车型客车函数、变量等等区分轻重缓急写,VB不区分,那一个一定要小心!

出于是用上两篇写的远线程调用,所以重重参数等等都以传播的,而不是直接得到的。

dim B as byte

bool HOOKAPI(DWORD Address,HOOKSTRUCT *hookfunc,DWORD mFncAddress)
{
 hookfunc->funcaddr = (FARPROC)Address; 
//那些地点用了贰个改造,把传入值调换来何结构个中注脚的一致
    memcpy(hookfunc->olddata, hookfunc->funcaddr, 8);
//记录RECV函数前八字节原本数据
 //上边开始创设汇编代码{0xB八, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00
}
 hookfunc->newdata[0]=0xB8;   //MOVE EAX
(EAX后边的数就是下面肆字节了)
 hookfunc->newdata[1]=0x00;
 hookfunc->newdata[2]=0x00;
 hookfunc->newdata[3]=0x00;
 hookfunc->newdata[4]=0x00; //到那里是 MOVE EAX 00000000
,那里的地方,将会在上边被轮换(注意是纯属地址)
 hookfunc->newdata[5]=0xFF; 

BYTE B ;

//自定义APIHOOK结构
typedef struct
{
    FARPROC funcaddr;  //RECV函数所在地方
 BYTE    olddata[8];      //RECV函数初叶的几个字节原始数据
 BYTE    newdata[8];   
//大家要写入的数量,汇编代码在底下,利用了EAX存储要跳转的地址,并且FF
E0这么些操作是相对地址的
}HOOKSTRUCT;
//0-四 : move eax 0x00000000
//相对地方,幸免了多个换算,其实那一个换算也简要,ADDRESS-MFUNADDRESS-伍就是
//5-7 : jmp eax

 

//下边传入了有些参数:被注入进程PID,要抽取再次回到音讯窗口的句柄

实在用VB.NET
HOOK本进度API早就弄好了,并且用了壹段时间,以为还是八面见光的。但是注入别的进度一贯在用VC,写起来代码真的不及VB.NET顺手,于是想到注入VB.NET的DLL到其它进度,其实那件事很已经有人在做,主若是给对方进度加载CL凯雷德的难题,其实那项职业都以由mscoree.dll完结的,本想用VB.NET写1段汇编代码注入到对方进度然后远线程,可看了看职业量确实十分的大,于是照旧采纳了3个VC写的DLL,导出了2个函数,然后远线程调用它用于加载CLKuga和VB.NET的DLL,那一个VC的DLL很简短,只是调用CorBindToRuntimeEx函数来加载CL汉兰达,并由之调用VB.NET写的DLL(便是3个常常化的类库,无需任何处理)中的方法。那样既然能够调用VB.NET的DLL中的方法了,那么接下去只需求在VB.NET的DLL中进行拍卖就行了。总括起来,主要是3块:

相关文章