本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/47979603

本文是对上一篇的补充。关于apihook的原理,效果动画,代码分析,实现细节和32位hook的源码请见上一篇:[Win32] API Hook(1)在32位系统上的实现

原理一样,就是换了个指令,jmp只能跳转32位大小,如果超过了就没法跳转了,所以更换指令,对于只会16位汇编和一点点Win32汇编的我,自然不懂amd64,百度到了一个,可惜原作者已不可考,谨对做出无私贡献的前辈奉上真诚的感谢!

mov rax,地址
push rax
ret

这回指令设计的非常巧妙,利用了一个ret,因为已经把返回地址压入栈了,因此直接返回到了我们自己的函数里了,因为用的ret,不是ret(at)num,因此入栈的实参并没有清除,而原来的返回地址已经在call的时候就入栈了,因此也会保留,完美地实现了跳转。

修改后dll源码如下,在win8.1 64位下完美实现了上一篇32位中的效果:

#include <stdio.h>
#include <windows.h>unsigned char code[12];
unsigned char oldcode[12];
FARPROC addr;
DWORD pid;int getpid()
{char buffer[255];DWORD get = 255;//判断环境是否为WOW64BOOL isWOW64;REGSAM p = KEY_READ;IsWow64Process(GetCurrentProcess(), &isWOW64);if (isWOW64)p |= KEY_WOW64_64KEY;HKEY hKey;if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\测试"), 0, NULL, 0, p, NULL, &hKey, NULL) != ERROR_SUCCESS){return 0;}if (RegQueryValueExA(hKey, "Main_PID", 0, NULL, (BYTE*)buffer, &get) != ERROR_SUCCESS){return 0;}return atoi(buffer);
}HANDLE WINAPI MyOpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId){HANDLE handle;if (getpid() == dwProcessId){SetLastError(5);return NULL;}DWORD old;if (VirtualProtectEx(GetCurrentProcess(), addr, 12, PAGE_EXECUTE_READWRITE, &old)){WriteProcessMemory(GetCurrentProcess(), addr, oldcode, 12, NULL);VirtualProtectEx(GetCurrentProcess(), addr, 12, old, &old);}handle = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);if (VirtualProtectEx(GetCurrentProcess(), addr, 12, PAGE_EXECUTE_READWRITE, &old)){WriteProcessMemory(GetCurrentProcess(), addr, code, 12, NULL);VirtualProtectEx(GetCurrentProcess(), addr, 12, old, &old);}return handle;
}BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:addr = 0;HMODULE hdll; hdll = LoadLibrary(TEXT("Kernel32.dll"));addr = GetProcAddress(hdll, "OpenProcess");if (addr){code[0] = 0x48;code[1] = 0xB8;code[10] = 0x50;code[11] = 0xC3;long long a = (long long)MyOpenProcess;RtlMoveMemory(code + 2, &a, 8);DWORD old;if (VirtualProtectEx(GetCurrentProcess(), addr, 12, PAGE_EXECUTE_READWRITE, &old)){RtlMoveMemory(oldcode, addr, 12);WriteProcessMemory(GetCurrentProcess(), addr, code, 12, NULL);VirtualProtectEx(GetCurrentProcess(), addr, 12, old, &old);}}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

本文是对上一篇的补充。关于apihook的原理,效果动画,代码分析,实现细节和32位hook的源码请见上一篇:[Win32] API Hook(1)在32位系统上的实现

[Win32] API Hook(2)在64位系统上的实现相关推荐

  1. 32位程序在64位系统上运行

    32位程序在64位系统上运行 32位系统下的MFC文件,怎么在64位的系统上面运行? 先将32位的应用程序转换为64位的应用程序. 从32位应用程序到64位应用程序 编译:starlight 这篇文章 ...

  2. 32位程序在64位系统上调用GetModuleFileNameEx失败

    今天客户打来电话说我们公司的服务器程序在新装的64位Windows 2003上以系统服务方式启动不起来.初步怀疑是我们的32位服务程序哪个地方在64位机上不兼容了.结果忙活了一上午,终于找到了问题所在 ...

  3. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  4. 关于在64位系统上,使用APlayer,运行报错“找不到指定的模块”

    使用APlayer开发了一个C#程序,原先开发电脑是32位的,安装电脑也是32位,只需要将相应的文件打包,然后在system32文件夹中放入atl71.dll和D3DX9_43.dll,项目运转正常. ...

  5. 64位系统上安装apache

    查看系统是多少位: # getconf LONG_BIT   显示: # 64 如果在64位系统上安装apache 正常情况下会报一下错误 /usr/lib/libexpat.so: could no ...

  6. win10 64位系统上注册wincc的ocx插件问题

    win10 64位系统上注册wincc的ocx插件问题 今天下载一个anigif动态图控件,注册时死活注册不了 在win10操作系统下注册OCX控件,主要有以下几个步骤: 1.以管理员的身份打开命令提 ...

  7. 修改32位的AutoCAD2012,使其能在64位系统上安装

    修改32位的AutoCAD2012,使其能在64位系统上安装 我们只需要下载AutoCAD2012的32位版,通过下面的修改就可以同时兼容32位和64位操作系统,二合一可以节省很多的硬盘开销.  1. ...

  8. hp1015驱动64位_在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动

    在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动 在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动 打印机是2005 ...

  9. 64位系统上运行32位程序的内存限制

    64位系统上运行32位程序能否申请到8G内存? 收藏到手机    转发   评论 2010-01-20 10:56 申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来 ...

  10. 在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动

    背景 打印机是2005年生产的,比较老了,在win10系统上使用自带的光盘来安装驱动会显示错误. win10安装步骤 1.进入hp 官网(https://support.hp.com/cn-zh/dr ...

最新文章

  1. Oracle JDBC连接服务名、SID和tnsnames.ora配置的多种方式
  2. 【人脸表情识别】情绪识别相关会议、比赛汇总(2018-2020)
  3. 谋定5G+工业互联网-陈肇雄:经信研究体系化应用部署规划
  4. Spring Ioc源码分析 之 Bean的加载(5):循环依赖处理(populateBean())
  5. void与void*详解
  6. 15_torch.sigmoid,torch.nn.Sigmoid之间的区别
  7. nit计算机应用基础是考试大纲,全国计算机应用技术证书考试(NIT)考试大纲(计算机应用基础Windows XP)...
  8. JavaScriptSerializer序列化与反序列化--备忘
  9. 获取redis中以某些字符串为前缀的KEY列表
  10. 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
  11. python try catch语句_Java try catch语句
  12. DVD-Cloner 2022 for mac(DVD光盘刻录工具)
  13. Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结Atitit HT
  14. 【金融科技前沿】【长文】金融监管、监管科技以及银行业监管报送概述
  15. SAP FICO面试题
  16. Java怎样在饼状图上标注数字_饼状图 - java_jun - 博客园
  17. 【Rust指南】错误的分类与传递|使用kind进行异常处理
  18. 爬虫爬出来的数据不全_Web Scraper教程(二)爬虫入门之当当畅销书爬取
  19. 《程序员练习生》第5期 学习编程的乐趣
  20. 同态加密能否拯救云计算

热门文章

  1. NOP法破解简易登录系统
  2. 机器视觉(十一):一维条码识别
  3. linux的dns怎么配置正向区域文件,Linux学习之路之DNS的配置文件和正解区域文件、反解区域文件...
  4. Linux账号和权限管理练习题
  5. Selenium WebDriver 测试Chrome浏览器
  6. 零散小知识(Website Recommend)
  7. java连接sql server 2012(免费的jar包下载及导入教程)
  8. windows配置samba客户端_安装配置Samba实现windows+linux文件共享
  9. ROS安装(Ubuntu18.04 melodic)
  10. 二极管的反向恢复原理