使用fastcall 代替汇编hook thiscall
利用fastcall中ecx edx传递的特性,解决了ecx需要内嵌汇编才能实现hook thiscall函数的问题。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <string>
#include "mhook-lib/mhook.h" class A
{
private:
int m_data;
char* m_sz[]; public:
int setMsg(const char* pstr, int data)
{
if (pstr != NULL && *(char*)pstr != '\0')
{
memcpy(m_sz, pstr, );
} m_data = data; return ;
} void showMsg()
{
if (m_sz[] != '\0')
{
printf("%s,%d\n", m_sz,m_data);
}
} }; typedef int (__thiscall A::* TYPE_Ptr)(const char* pstr, int data); typedef int (__fastcall * TYPE_setMsgPtr)(void* pthis, void* notUsed, const char*, int); TYPE_setMsgPtr pNew; int __fastcall HookSetMsg(void * pThis ,void * notUsed, const char* pstr, int data)
{ printf("hook new function\n");
return pNew(pThis, notUsed, pstr, data);
} TYPE_setMsgPtr pfnSetMsg = NULL; //实现hook thiscall 的方法,不需要用naked汇编
int main(int argc, char **argv)
{
A* theA = new A();
theA->setMsg("hello A!", ); theA->showMsg(); TYPE_Ptr px = &A::setMsg;
int x = *(int*)&px; //printf("%p,%p\n", px, x); pNew = (TYPE_setMsgPtr)x;
Mhook_SetHook((PVOID*)&pNew, HookSetMsg); theA->setMsg("hello B!", );
theA->showMsg(); theA->setMsg("hello C!", );
theA->showMsg(); return ;
}
仅列出关键代码,其他不展示了,不懂的留言。
使用fastcall 代替汇编hook thiscall的更多相关文章
- 汇编 -- Hook API (MessageBoxW)
说到HOOK.我看了非常多的资料和教程.无奈就是学不会HOOK.不懂是我的理解能力差.还是你们说的 不够明确,直到我看了下面这篇文章,最终学会了HOOK: http://blog.sina.com.c ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- X86调用约定 calling convention
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...
- [8]windows内核情景分析--窗口消息
消息与钩子 众所周知,Windows系统是消息驱动的,现在我们就来看Windows的消息机制. 早期的Windows的窗口图形机制是在用户空间实现的,后来为了提高图形处理效率,将这部分移入内核空间,在 ...
- 关于调用约定(cdecl、fastcall、、thiscall) 的一点知识(用汇编来解释)good
函数调用规范 当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个.什么样的参数.即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者 ...
- stdcall、cdecl、fastcall、thiscall 、naked call的汇编详解
函数调用规范 当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个.什么样的参数.即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者 ...
- 汇编Ring 3下实现 HOOK API
[文章标题]汇编ring3下实现HOOK API [文章作者]nohacks(非安全,hacker0058) [作者主页]hacker0058.ys168.com [文章出处]看雪论坛(bbs.ped ...
- c++hook内联汇编模板
1 #include "Windows.h" 2 #include "tlhelp32.h" 3 #include "String.h" 4 ...
- C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall
https://www.cnblogs.com/xiangtingshen/p/11014514.html C++函数调用约定_cdecl约定:参数:从右向左依次入栈堆栈平衡:调用方平衡 #inclu ...
随机推荐
- 修改tomcatlog输出等级
/usr/local/tomcat2/webapps/digital/WEB-INF/classes/log4j.properties log4j.properties配置如下(配置是转载): log ...
- 深入理解 Java 多线程核心知识
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...
- 这个表明将http协议转成websocket协议
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hdu2054 通过率低是有理由的
这虽然是一道水题,但却巨坑,他题面上不说数据范围,也没有说数据类型,事实就是数据范围巨大,整型实型都有,所以必须用字符串去写,但是又涉及到小数,所以还要删除小数后面多余的0,比如1==1.0000,这 ...
- Vue PC后台系统组件大全
1.https://vue.ant.design/ 2.http://element-cn.eleme.io/#/zh-CN 3.https://www.iviewui.com/ 4.https:// ...
- linux普通帐号可以临时切换到root(添加用户到sudoers中)
一般,进入terminal之后,默认是普通账户能操作的功能,能访问的目录有限,需要临时切换到root账户 那么此时就需要配置sudoers文件,可以让普通用户通过sudo命令临时切换到root账户 首 ...
- centos7安装supervisor
安装supervisor cd /root/tools/ wget http://pnxcvm0bq.bkt.clouddn.com/get-pip.py python get-pip.py pip ...
- 中间件详解,Django复习
day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...
- Redis 单机版
Redis 支持单机版和集群,下面的步骤是单机版安装步骤 1. # yum install -y gcc-c++ 1.1 由于是c语言编写,所以需要安装支持组件 2. 把压缩包上传到linux服务器上 ...
- bootstrap table 分页序号递增问题 (转)
原文地址:https://segmentfault.com/q/1010000011040346 如题,怎么在bootstrap table中显示序号,序号递增,并且分页有效,等于是每页10条,第2页 ...