c语言02_数据类型上

news/2025/3/18 19:36:18/文章来源:https://www.cnblogs.com/Lyjia-n/p/18759342

 

一、c是怎么变成汇编的

1、裸函数是编译器不管的

⑴写一个空函数(里面什么都不写),f7f5打开反汇编

f11打开jmp

什么都没写里面还是有一大堆(是编译器和连接器做的)

⑵裸函数

f7f5查看反汇编找到调用的函数0040D708

f11打开

再f11打开,里面一行汇编代码都没有

①空函数

f7f5

运行后不进反汇编,先f10一行一行运行

运行至最后一行没有出错,证明空函数

②裸函数

f7f5

f10,出错

③原因

1️⃣将空函数打开反汇编看

call将0040D72D压入堆栈和把eip地址改到call后面0040101e

 f11后再f11

一直f10到0040D70e,return后回到③的第一张图

可以调用空函数是因为里面生成了return,可以返回

2️⃣打开裸函数

也有call(作用和空函数里面的一样)

f11再f11,只有int3(相当于断点,程序执行到这就会停下来)

3️⃣如果想让裸函数运行,可以再c里面写汇编

__asm{}                               (最好是两个_)

f7f5再f11f11    有ret可以返回,就能执行

 2、在裸函数里面实现一个加法

asm里面内容

 

 二、调用约定:参数的传递顺序

 

1、_cdecl:c/c++默认的调用约定(写不写都相当于写了)

从后往前压,外平栈

参数从后往前压栈,谁调用00400D79C这个函数谁负责平衡堆栈,add esp,8是在外面平衡堆栈(是在主函数叫外平栈)

 2、_ stdcall:

也是从后往前压,内平栈

 f10运行到00400D79C,f11进入函数再f11,再一行一行的运行到ret

一般只有一个ret,而这一行是ret 8,就相当于是add esp,8

这种是在子函数里面,叫内平栈

 3、_fastcall:用两个寄存器,传递速度快(不超过两个参数 ),还是从右到左

之前add是因为的是push了两个数 占用了8个字节,esp的值需要往上压8个字节

而mov是用两个寄存器传的值

f11打开进去看里面只有一个ret

 传2个参数改成传4个

他前两行也是用的push,

 进入函数,是ret 8

 (逆向中不能根据ret8就判断是两个参数,可能是cdecl或stdcall,也可能是fastcall中4个参数有两个寄存器) 

例外:如何区分一个call有几个参数

①根据函数调用:

错误判断:看有没有add,看call上面的值

 有可能push 4是在plus4里面没用是在pop里面用的

有可能0040D836以上的值不一定是给此行的call用的可能是给下一个的

正确判断:一行一行分析再结合参数调用和堆栈平衡的代码

三、callingconventionr入口 

 

1、修改入口例:随便写一个空函数,f7f5打开,旁边有一个call stack

 第一个main是我们的程序,最后一行的KERNEL32那一行调用了mainCRTStartup这个方法而这个又调用了我们写的main程序

 自己写的代码入(即callstack中第一个main)口不是真正程序入口

真正程序的入口是mainCRTStartup

 ------------------------------------------分割线---------------------------------------------

改入口点

 

 打开setting,选择link,选output,entry-point symbol改成test

 

 改了之后运行到void tset就不走了

2、找入口方法:找调用的函数后面有三个参数的

找到一个调用函数

push了三个参数,后面是add esp,0c;如果是两个参数平衡堆栈是add8,而0c是三个参数

 进add里面观察:

 (一)0:保存栈底

(二)1-3:提升堆栈

(三)6-8:保留控制台环境

(四)9-6:往缓冲区写内容

(五)8-8:有一个函数里面有5个参数三个push两个mov,调用函数是fastcall

①call进去

 a、进第一个函数4DFFFFFF看传了多少个参数,打开看到ret0c,是传了三个参数也是内平衡,是stdingcall

b、24FFFFFF:前面有两个push和add8且是外平衡,是cdecl

c、11FFFFFF:与b中的地址一样

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win11家庭版24H2,使用VMware虚拟机问题

一、安装VMware,提示 “安装程序检测到主机启用了 Hyper-v或 Device/credential Guard。。。”,我勾选了自动安装WHP后点击下一步,完成了VMware的安装。二、解压了一个虚拟机,用VMware打开并选择已复制虚拟机,出现“此平台不支持虚拟化”的错误,点击“是”也无法打开虚拟…

M-LAG

一、M-LAG简介 1.1 M-LAG使用场景​ M-LAG(Multichassis Link Aggregation Group)即跨设备链路聚合组,是一种实现跨设备链路聚合的机制。M-LAG主要应用于普通以太网络、VXLAN和IP网络的双归接入,可以起到负载分担或备份保护的作用。相较于另一种常见的可靠性接入技术——堆…

FastAPI测试策略:参数解析单元测试

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意第一章:核心测试方法论 1.1 三层测试体系架构 # 第一层:模型级测试 def test_user_model_validation():with pytest.raises(ValidationError):User(age=-5)…

MSTP协议

一、MSTP(多生成树协议)简介 1.1 MSTP(多生成树协议)使用场景MSTP(Multiple Spanning Tree Protocol,IEEE 802.1s), 基于 RSTP 的多实例扩展协议,通过划分多个生成树实例(MSTI)实现 VLAN 与生成树的灵活映射,在保留 RSTP 快速收敛特性的基础上,支持 多拓扑负载均衡…

Eth-Trunk协议

一、Eth-Trunk(链路聚合协议)使用场景 1.1 Eth-Trunk(链路聚合协议)简介​ 原名叫链路聚合组(Link Aggregation Group),通过将多个物理接口捆绑为一个逻辑接口,可以在不进行硬件升级的条件下,达到增加链路带宽的目的。1.2 Eth-Trunk(链路聚合协议)实现目的增加带宽链…

PPP协议

一、PPP(点对点协议)简介 1.1 PPP使用场景​ 我们家庭中使用最多的宽带接入方式就是PPPoE(PPP over Ethernet)。这是一种PPP利用以太网(Ethernet)资源,在以太网上运行PPP来对用户进行接入认证的技术,PPP负责在用户端和运营商的接入服务器之间建立通信链路。二、PPP(点…

以太帧格式

一、以太帧使用场景 1.1 Ethernet Ⅱ以太帧简介​ Ethernet II(又称 DIX 2.0)是最广泛使用的以太网帧格式,由DEC、Intel和Xerox在1982年标准化,是TCP/IP网络中最常见的链路层协议。1.2 Novell Netware 802.3 Raw以太帧简介​ 这是 1983 年 Novell 发布其划时代的 Netware/8…

单臂路由

一、单臂路由简介 1.1 单臂路由使用场景​ 单臂路由(Router-on-a-Stick)是一种通过路由器单个物理接口的多个逻辑子接口实现不同VLAN间通信的解决方案,其核心是利用802.1Q协议在交换机的Trunk链路传输多VLAN流量,路由器通过子接口为每个VLAN分配网关并完成跨网段路由。该方…

Windows 提权-服务_弱服务权限

本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 搜寻非标准服务1.1 cmd 1.2 powershell2 搜寻服务的弱权限2.1 枚举服务的弱权限:手动 2.2 …

前端html+css+js

之前只知道html和css,不知道可以用js设置事件监听,一些输入判断条件就不知道怎么写,上了web课程后有所了解 这是此次作业代码是ai生成的,不过可以凭自己大致看懂,加上ai的解释和课堂ppt有所收获点击查看代码 <!DOCTYPE html> <html lang="zh"> <…

Git分支管理与代码合并实践:保持特性分支与主分支同步

场景说明 在团队协作开发中,开发者经常需要在特性分支(如 dev_feature_xxx)上实现新功能,同时需要定期同步主分支(如 develop)的最新代码,避免最终合并时产生严重冲突。本文将通过一个实际案例,演示如何安全地将主分支更新合并到特性分支,并完成代码推送与合并请求。完…

dify工作流

一、简介 官方地址:https://docs.dify.ai/zh-hans/guides/workflow工作流通过将复杂的任务分解成较小的步骤(节点)降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了 LLM 应用面向复杂任务的性能,提升了系统的可解释性、稳定性和容错性。 Dify 工作流分为两…