使用C++代码调用目标程序函数心得

c++实验六总结(自用) 实验目的 掌握派生类的声明方法函数与析构函数的执行顺序与构造规则 阅读详情

本文所提到的所有观点均来自个人理解体会,技术指导:易道云tiger

使用C++语言调用游戏函数,关键点就两个,一个是要把他函数仿照出来,一个是找一个位置调用。

其实到这里我也知道之前在疑问笔记里提出的“为什么分析一个函数要‘参数’,‘返回值’,‘调用约定’三大件”问题的答案了,因为我们想要把这个函数模仿出来,就必然的需要这些内容。

        以下面地址6DA8B3这个函数为例:他的三大件就是参数:“void*”,返回值:“某结构体或类指针”返回值,调用约定:“thiscall”。

当然返回值是怎么得到“某结构体或类指针”这个结论的,还需要到eax所指向的内存分析,这里略过。

下面是对函数的仿照:

typedef class Res
{
    // 定义函数指针
	typedef psro_string(Res::*PROC_WCHAR1)(wchar_t*);
public:
    // 函数指针实例
	static PROC_WCHAR1 _ReadTitle;
}*PRes;

ps:参数是怎么分析出是wchar_t*类型的需要到函数内部去看,略过

有了上面的代码之后,我们还需要给_ReadTitle初始化。因为我们是要调用别人写好的函数,所以使用typedef定义函数指针,而不是函数类型。把_ReadTitle赋值成函数对应的地址,即9A46C0(地址见图一)。完成这样的操作之后,一旦我们在自己的代码里(已经完成注入的)调用_ReadTitle,线程就会跑到_ReadTitle所指向的VA去执行。

关于仿照函数这个步骤,以前用汇编调用函数换成用C++代码调用函数的时候,老师怎么教我就怎么写,你如果问我为什么要仿照人家函数,我自己思考也应该能想出来,但是始终没有理解深刻。就好比小时候读“举头望明月,低头思故乡”,我张口就来的“表达了作者的思乡之情”,但是真正有一天我开始外出求学,某一天夜里站在阳台,恰好月光皎洁,恰好凉风吹过脖颈我打个寒战,一瞬间才体会到,哦,原来这才是举头望明月,低头思故乡。

所以对于新知识的理解,向来都是纸上得来终觉浅,绝知此事要躬行。从书本上学来的原理永远不及自己冥思苦想最后的明悟更加深刻。

以上是笔者个人的心得体会,如有纰漏还请不吝指教。

c++中内联函数那点事 1 内联(inline)函数     c++在编译时可以讲调用的函数代码嵌入到主调函数中,这种嵌入到主调函数中的函数称为内联函数,又称为内嵌函数或内置函数。 定义内联函数时,在函数定义和函数原型声明时都使用inline,也可以只在其中一处使用,其效果一样。 内联函数在编译时用内联函数函数的函数体替换,所以不发生函数调用,不需要保护现场,恢复现场,节省了开销... 阅读详情

相关推荐

使用Windbg调试目标程序去分析异常的两实战案例分享

使用Windbg动态调试目标程序去分析异常的两实战案例分享。

dvlinker的技术专栏 2万+

c++函数调用

函数完成任务后,如果有数值需要返回,则在声明函数时,在函数名前写好返回值类型。通常函数名以“动词+名词”的方式命名,中间以一个下划线隔开(C\C++风格)有时,一个函数还需要传入一些参数,参数列表写在函数名后的一对小括号中。一个函数就是完成一项任务的独立代码块,它以名字作为整个代码块的代表。即使没有参数需要传入,函数名后的小括号也不能省略。如果不需要返回任何值,则在函数名前写 void。参数列表是用逗号隔开的,每个参数都要注明其类型。

黑白无常的博客 1万+

使用Windbg排查C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题

C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题的排查

dvlinker的技术专栏 1万+

C/C++函数调用方式总结

在C语言中,假设我们有这样的一个函数: int function(int a,int b) 调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 栈是一种先进后

sinat_35945236的博客 2872

Python实战:ERA5风场数据区域提取与风向合成可视化全流程解析

本文详细解析了使用Python处理ERA5风场数据的完整流程,包括NC文件读取、特定区域数据提取、u/v分量合成风向风速的计算,以及利用Matplotlib进行风场时空演变可视化。内容涵盖从环境搭建、数据获取到高级绘图与性能优化的实战经验,为气象数据分析、风能评估及气候研究提供了一套清晰、可操作的技术指南。

swift5iosmith的博客 305

SAP FIORI静态磁贴从零到一:配置实战与权限打通

本文详细介绍了SAP FIORI静态磁贴的配置流程与权限管理,从准备工作到后台配置、目标映射、前台组织及权限分配,提供了实战技巧与常见问题解决方案。重点解析了静态磁贴的创建、目标映射配置及权限打通等关键步骤,帮助用户快速掌握FIORI静态磁贴的配置方法。

weixin_29266647的博客 250

c++函数学习总结

一、知识点1.函数的数据类型时函数的返回值类型(若数据类型为void,则无返回值)。2.函数名时标识符,一个程序中除了主函数名必须为main外,其余函数的名字按照标识符的取名规则可以任意选取,最好取有助于记忆的名字。3.形式参数(形参)表可以是空的(即无参函数),也可以有多个形参,形参间用逗号隔开,不管有无参数,函数名后的圆括号都必须有。形参必须有类型说明,形参可以是变量名、数组名或指针名,它的作...

sdau20171766的博客 415

Codesys电子凸轮Cam表实战:从可视化配置到程序化构建

本文详细介绍了Codesys电子凸轮Cam表的实战应用,从可视化配置到程序化构建的全过程。通过包装机和印刷机案例,解析Cam表的基础设置、调试技巧及动态构建方法,帮助工程师快速掌握电子凸轮技术,提升运动控制精度和效率。

weixin_29309785的博客 300

C++ 中调用其他应用程序的方法(转自:http://yulv.net/archives/20/)

转自:http://yulv.net/archives/20/ 三个SDK函数 WinExec,ShellExecute,CreateProcess 实现调用其他程序的方法三个SDK函数: WinExec, ShellExecute,CreateProcess 可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProce

WEN2222的专栏 639

大模型时代必备技能:3种向量量化技术对比(PQ/AQ/RVQ)与选型指南

本文深入解析了大模型时代处理海量向量数据的关键技术——向量量化。通过对比Product Quantization (PQ)、Additive Quantization (AQ)和Residual Vector Quantization (RVQ)三种主流技术的核心原理、性能表现与适用场景,为工程师提供了从理论到实践的选型指南,旨在解决向量存储与检索的效率瓶颈,助力RAG等大模型应用高效落地。

silver的专栏 800

如何在RT-DETR-R18中修改ultralytics的yaml文件(附完整代码)

本文详细指导如何在RT-DETR模型中,通过修改Ultralytics框架的yaml配置文件,将Backbone从ResNet50轻量化替换为ResNet18。核心步骤包括自定义ResNet18基础模块、调整HybridEncoder的expansion参数至0.5,并协同修改检测头Decoder层数,最终提供完整的配置文件代码,助力开发者在资源受限环境下部署轻量级实时目标检测模型。

weixin_29091445的博客 290

C++中使用ShellExecute函数调用其他窗口程序时,参数设置为隐藏,后续能通过发消息给这个被调用程序显示,能显示出来窗口吗

可行但非万能:通过发送消息显示窗口在技术上是可行的,但高度依赖目标程序的消息处理逻辑。推荐直接控制:优先使用直接显示窗口,避免依赖消息机制。健壮性建议结合FindWindow和确保准确获取句柄。添加重试逻辑应对窗口创建延迟。处理权限问题确保跨权限层级控制。思路来源使用C++中的ShellExecute函数启动一个窗口程序时设置为隐藏,后续能否通过发送消息让被调用的程序显示窗口。

学无止尽,谨言慎行! 1463

Blender.粒子效果

Blender.粒子效果 ✦ shift+A新建一个棱角球,细分(之后要分解成许多小颗粒) ✦ 给球添加粒子系统,这时播放粒子会向下掉,力场权重☛重力☛0后,粒子会在球体周围运动 ✦ shift+A添加一个力场,调整力场强度 ✦如果粒子运动太快,我们可以在输出属性中调整时间重映射的原始值 ✦想让粒子在球周围运动而不是发散出去,在物理属性找到力场设置,调整流的大小 ✦S键将球形缩小到看不见 ✦给粒子变添加立方体的形状,在粒子属性里找到渲染选项,将“光晕”改为“物体”,在实例物体中选择新建的立方

weixin_46385629的博客 6670

C++函数调用过程和内置函数详解

上图表示函数调用过程:①程序先执行函数调用之前的语句;②流程的控制转移到被调用函数入口处,同时进行参数传递;③执行被调用函数中函数体的语句;④流程返回调用函数的下一条指令处,将函数返回值带回;⑤接着执行主调函数未执行的语句。         这样就要求在转到被调用函数之前,要记下当时执行的指令的地址,还要“保护现场”(记下当时有关的信息),方便在函数调用之后继续执行。在函数调用之后,流程

全村的希望的博客 4596

手把手教你学simulink实例--基于Simulink的轨道交通车辆悬挂系统仿真

轨道交通车辆悬挂系统是保证列车运行平稳性、舒适性和安全性的重要组成部分。通过悬挂系统的合理设计,可以有效减小车辆在运行过程中受到的轨道不平顺和振动影响。基于MATLAB/Simulink平台进行悬挂系统仿真,可以对悬挂系统的动力学行为、控制策略以及性能优化等环节进行建模与分析,从而验证系统的设计性能并优化参数。本项目旨在构建一个完整的轨道交通车辆悬挂系统仿真模型,包括悬挂系统动力学建模、控制策略模块以及性能评估模块,并通过仿真验证系统的稳定性和舒适性。

MHD0815的博客 1034

华为OD机考双机位C卷 - 区间交集(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 区间交集

算法大师! 1138

c++注入dll调用call

这个函数很简单,里面内嵌的汇编代码,用来调用test的call,首先我们申明一个a=2,和一个引用类型r。这个可以和上面拿到的汇编进行对比,这个是按照c语言的调用约定来的,这个push的顺序是不能变的哈,后面直接调用call。不出意外的话,应该会弹出两个窗口,一个是注入成功窗口,一个是输出基址的窗口。我们想调用test函数,就必须知道这个函数在内存的地址,但是每次重启电脑,地址都是变化的。我们的目标是在dll调用到test.exe的test函数,这个dll还没有达到我们的目标,我们还需要继续完善。

qq_59848320的博客 2922

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

你的C++代码有多慢?使用 perf 精准揪出耗时函数!

利用Linux系统自带的性能分析工具perf来精准定位C++代码中的耗时函数,从而有效提升程序性能。

Lion_Long的博客 1929

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++内置函数(内嵌函数,内联函数)

调用函数时需要一定的时间和空间的开销。  C++提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(inline function),又称内嵌函数。在有些书中把它译成内联函数。指定内置函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。 #include using namespace std;i

妙心的专栏 3394

老版QQ原生表情gif动态

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

VC++ DLL注入目标程序

向其他程序注入DLL的原理比较简单就是调用几个windowsAPI,在目标程序中开启一个线程,在这个线程中加载动态库,动态库被加载时会执行初始化的函数,我们就可以在这个初始化函数中对目标程序做任何想做的事情。。。或者让目标程序代替你的程序做一些事情。。当目标程序注入DLL后,这个负责注入的程序就可以关闭了。下面是一个简单的函数,传入目标程序的句柄和要注入的动态库的全路径。void InjectDL...

jiyanglin的博客 1195

C/C++逆向:函数逆向分析-调用约定分析

在进行函数逆向分析时,分析其具有非常重要的作用,因为调用约定直接影响了函数的参数传递、返回值、栈管理、寄存器使用等多个方面,不同的编译器和平台可能有不同的默认调用约定,识别调用约定可以帮助判断代码是由哪种编译器生成的。例如:①Windows API 函数通常使用 stdcall 调用约定。②在 x64 平台,Windows 使用的调用约定与 Linux 的 System V 调用约定有所不同。③通过调用约定,可以更好地识别代码的上下文,甚至推断出目标程序使用的编译器和编译选项。

WolvenSec的博客 1280

C++基础02(函数)

这个问题的答案比较复杂,总体的基本原则是,只要让系统在使用它们的时候,可以有效地区分各个不同的版本,那它们就可以形成合法的重载版本。在C语言中,相同作用域内的重名函数会引起冲突,哪怕它们拥有不同的参数列表也不行,而在C++中,重名函数只要满足一定的要求,可以同时存在,这大大拓展了函数设计的灵活性。使用内置函数可以节省运行时间,但却增加了目标程序的长度,因此一般只将规模很小(一般为5个语句一下)而使用频繁的函数(如定时采集数据的函数)声明为内置函数。的价值,在C++的函数模板、类模板中,利用。

jxcklfn的博客 1014

python 调用c语言方法详解,python调用c代码

python 调用c语言方法详解,python调用c代码

一名正义的白帽黑客 3021

C++函数内置、函数重载、函数模板

C++内置函数 C++提供一种可以提高效率的方法,在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去,这种函数称为C++的内置函数。 指定内置函数的方法很简单,只需要在函数首行的左端加一个关键字inline即可。 inline int AddSum(int num_1,int num_2)//函数定义 { int sum; sum=num_1+num_2; return sum; //将sum的值返回到调用函数处 } 可以在声明函数和定义函数时都写inline,也可以只在其

weixin_48669767的博客 179

ubuntu c/c++ 生成.so 并被python调用

文章目录一 c 生成 .so二 c++ 生成 .so2.1 单个c++ 生成 .so2.2 多个 c++ 生成 .so三 python调用.so 一 c 生成 .so 1.编写源文件: 建立一个源文件,名命func.c: #include<stdio.h> int func(int a) { printf("func receive num is %d\n", a); return 0; } 2.编译生成动态链接库.so: 输入指令: gcc -g -rdynamic func.c -fP

Mihu_Tutu的博客 2332

c++ 函数模板

c++ obj文件 obj文件就是目标文件,是源程序经过编译程序编译后生成的 不能直接执行,需要连接程序连接后才能生成可执行文件,这样就能执行 一般由机器代码组成,但也可以是自己定义的一些伪指令代码(需有专门的解释程序对其进行解释执行) 连接程序 把目标代码和它所使用的库文件连接的程序 obj文件与exe文件的区别 编译:当前源代码编译成二进制目标文件(obj文件) 链接(link): ...

若尘的博客 2157
上一篇: 钩子注入原理讲解(SetWindowsHook注入)
下一篇: MFC窗口创建类提示“没有注册类”
hx___y
博客等级 码龄6年 5粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值