当前位置: 首页 > wzjs >正文

哪个网站可以免费做音乐相册网站域名查询官网

哪个网站可以免费做音乐相册,网站域名查询官网,网站建设内容的重点,做网站一年百万InlineHook翻译为内联钩子 内联也就是我们的内联汇编 钩子就是修改目标的执行流程或代码 #include<iostream> using namespace std; #include<Windows.h>DWORD OldPro 0; //老的保护权限 char OldCode[9] { 0 }; //hook前的汇编代码 DWORD RetData 0; …

InlineHook翻译为内联钩子   内联也就是我们的内联汇编 钩子就是修改目标的执行流程或代码

#include<iostream>
using namespace std;
#include<Windows.h>DWORD OldPro = 0;      //老的保护权限
char OldCode[9] = { 0 };  //hook前的汇编代码
DWORD RetData = 0;     //内联汇编结束需要返回的地址DWORD RetAddr = 0;     //原本被hook函数的返回地址
DWORD Num1 = 0;        //传入的参数1
DWORD Num2 = 0;        //传入的参数2
int Add(int a, int b)
{return a + b;
}_declspec(naked) void HookFun()
{__asm     //第一步备份原本的寄存器和Eflag{PUSHADPUSHFD}__asm{MOV EAX, [ESP+0x24]     //原本是esp保存返回地址但是由于前面写了备份寄存器和eflag共0x24个字节MOV RetAddr,EAXMOV EAX, [ESP+0x28]MOV Num1, EAXMOV EAX, [ESP+0x2C]MOV Num2, EAX}cout << RetAddr << Num1 << Num2;__asm{POPFDPOPAD}__asm   //提高栈顶{push        ebpmov         ebp, espsub         esp, 0xC0}__asm{jmp RetData}}VOID SetInlineHook(DWORD OldAddr, DWORD DeAddr)
{//第一步设置内存属性记得恢复属性BOOL bRet=VirtualProtect((LPVOID)OldAddr, 9, PAGE_EXECUTE_READWRITE, &OldPro);if (!bRet){return;}//第二步保存原本的指令memcpy(OldCode, (LPVOID)OldAddr, 9);//第三步 设置NOPmemset((LPVOID)OldAddr, 0x90, 9);//第三步 修改汇编DWORD JumpAddr = DeAddr - OldAddr - 5;  //计算跳转地址char JumpCode[5] = { 0 };JumpCode[0] = 0xE9;                    //0x90对应jmp*(PCHAR)(JumpCode + 1) = JumpAddr;     //将地址写入后四个位置memcpy((LPVOID)OldAddr, JumpCode, 5);//恢复属性RetData = OldAddr + 5;       //记录返回地址VirtualProtect((LPVOID)OldAddr, 9, PAGE_EXECUTE_READ, &OldPro);
}VOID UnsetInlineHook(DWORD HookAddr)
{//第一步修改属性DWORD OldProtection = 0;BOOL bVpro=VirtualProtect((LPVOID)HookAddr, 9, PAGE_EXECUTE_READWRITE, &OldProtection);if (!bVpro){return;}//写入之前保存的代码memcpy((LPVOID)HookAddr, OldCode, 9);//恢复属性VirtualProtect((LPVOID)HookAddr, 9, OldProtection,NULL);
}int main()
{SetInlineHook((DWORD)Add,(DWORD)HookFun);Add(1, 2);UnsetInlineHook((DWORD)Add);
}

 我们对简单的Add函数进行hook

首先写hook函数 

VOID SetInlineHook(DWORD OldAddr, DWORD DeAddr)
{//第一步设置内存属性记得恢复属性BOOL bRet=VirtualProtect((LPVOID)OldAddr, 9, PAGE_EXECUTE_READWRITE, &OldPro);if (!bRet){return;}//第二步保存原本的指令memcpy(OldCode, (LPVOID)OldAddr, 9);//第三步 设置NOPmemset((LPVOID)OldAddr, 0x90, 9);//第三步 修改汇编DWORD JumpAddr = DeAddr - OldAddr - 5;  //计算跳转地址char JumpCode[5] = { 0 };JumpCode[0] = 0xE9;                    //0x90对应jmp*(PCHAR)(JumpCode + 1) = JumpAddr;     //将地址写入后四个位置memcpy((LPVOID)OldAddr, JumpCode, 5);//恢复属性RetData = OldAddr + 5;       //记录返回地址VirtualProtect((LPVOID)OldAddr, 9, PAGE_EXECUTE_READ, &OldPro);
}

第一步对要进行hook的函数进行修改内存权限

BOOL bRet=VirtualProtect((LPVOID)OldAddr, 9, PAGE_EXECUTE_READWRITE, &OldPro);if (!bRet){return;}

第二步保存hook前目标函数的指令

memcpy(OldCode, (LPVOID)OldAddr, 9);

第三步将函数开头三个指令全部设置为NOP  //便于jmp NOP的硬编码为0x90

memset((LPVOID)OldAddr, 0x90, 9);

第四步开始修改汇编 将刚刚nop掉的改为jmp 并记录返回地址

注意跳转地址的计算方式是 跳转到目标地址减去要进行跳转函数的地址再减5(减5的原因是jmp指令长度为5)  

0xE9对应的是jmp指令这两步将JumpCode填充完毕然后写入到被hook函数的开头即可

JumpCode[0] = 0xE9;                    //0xE9对应jmp*(PCHAR)(JumpCode + 1) = JumpAddr;     //将地址写入后四个位置memcpy((LPVOID)OldAddr, JumpCode, 5);
DWORD JumpAddr = DeAddr - OldAddr - 5;  //计算跳转地址char JumpCode[5] = { 0 };JumpCode[0] = 0xE9;                    //0xE9对应jmp*(PCHAR)(JumpCode + 1) = JumpAddr;     //将地址写入后四个位置memcpy((LPVOID)OldAddr, JumpCode, 5);

最后记录返回地址(加5是因为当前地址的指令长度为5)并恢复属性

RetData = OldAddr + 5;       //记录返回地址
VirtualProtect((LPVOID)OldAddr, 9, PAGE_EXECUTE_READ, &OldPro);

到这里就完成了hook的准备操作 下面来看hook的过程

_declspec(naked) void HookFun()
{__asm     //第一步备份原本的寄存器和Eflag{PUSHADPUSHFD}__asm{MOV EAX, [ESP+0x24]     //原本是esp保存返回地址但是由于前面写了备份寄存器和eflag共0x24个字节MOV RetAddr,EAXMOV EAX, [ESP+0x28]MOV Num1, EAXMOV EAX, [ESP+0x2C]MOV Num2, EAX}cout << RetAddr << Num1 << Num2;__asm   //到这里我们的操作代码结束{POPFDPOPAD}__asm   //提高栈顶 恢复原本的指令{push        ebpmov         ebp, espsub         esp, 0xC0}__asm{jmp RetData}}

hook的代码是裸函数进行内联汇编(Inline)

第一步先保存所有的寄存器和Eflag  然后这里我们拿到我们想要的数据 比如函数的参数和函数返回地址 然后将保存的寄存器和eflag出栈  然后模拟提升栈顶的操作因为原本函数的这个操作被我们nop掉了   然后使用jmp跳转到我们记录的地址即可

最后取消掉我们的钩子避免出问题

VOID UnsetInlineHook(DWORD HookAddr)
{//第一步修改属性DWORD OldProtection = 0;BOOL bVpro=VirtualProtect((LPVOID)HookAddr, 9, PAGE_EXECUTE_READWRITE, &OldProtection);if (!bVpro){return;}//写入之前保存的代码memcpy((LPVOID)HookAddr, OldCode, 9);//恢复属性VirtualProtect((LPVOID)HookAddr, 9, OldProtection,NULL);
}

重点就是将原本保存的指令重新写入到函数的起始位置

memcpy((LPVOID)HookAddr, OldCode, 9);

简单来说InlineHook流程  就是使用jmp跳转到我们自己写的代码区域执行我们自己写的代码

注意的是每个步骤需要按照严格的顺序进行书写不然会出现很多问题

http://www.dtcms.com/wzjs/340840.html

相关文章:

  • 大庆企业做网站3seo
  • 网站欢迎页面怎么做网站排名优化价格
  • 用jquery打造个性网站百度一下全知道
  • 心理咨询师招聘优化大师手机版
  • 企业网站建设需要多少钱杭州seo网站推广排名
  • 可以免费创建网站的软件上海网站推广服务公司
  • 什么网站能代做预算保定seo网络推广
  • 东阿网站建设电话苏州seo免费咨询
  • 同企网站建设做网站百度app关键词优化
  • 石家庄网站运营seo如何快速排名百度首页
  • 南京紫米网络科技有限公司seo外链优化
  • 做网站建设销售辛苦吗b站24小时自助下单平台网站
  • 做外贸网站卖什么好处竞价托管服务多少钱
  • 杭州信贷网站制作陕西网页设计
  • 嘉兴网站优化排名湖南关键词网络科技有限公司
  • 武汉微信网站制作如何对一个网站进行seo
  • 网站建设的销售术语百度seo如何优化关键词
  • 网站app制作品牌营销推广代运营
  • 电子商务网站建设论文结论艾滋病多久能检查出来
  • 电商平台运营是做什么的seo搜索引擎优化薪酬
  • 购物网站主页怎么做百度手机端排名如何优化
  • 校园网站设计与实现产品推广方案范例
  • 株洲营销型网站建设邵阳seo优化
  • 赣州专业网站推广多少钱百度快速收录网站
  • 丰润网站建设引流推广多少钱一个
  • 做装修公司网站中国站长之家
  • 找设计公司上哪个网站百度会员登录入口
  • 漳州最专业的网站建设搜狗推广平台
  • 开发工具是什么意思湘潭网站seo
  • 北京网站建设外包公司网站设计平台