call

汇编语言:call、call far ptr、call word ptr、call dword ptr、call 寄存器 call指令是转移指令,CPU执行call指令,进行两步操作:(1)将当前IP或当前CS和IP压入栈中(2)转移。call 标号指令功能:将当前IP压入栈中,然后转移到标号处执行指令。call far ptr标号指令功能:将当前CS压入栈中,然后再将当前IP压入栈中,最后转移到标号处执行指令。call 16位寄存器指令功能:将当前IP压入栈中,然后转移到寄存器中指明的目的地址处执行指令。call word ptr 内存单元地址指令功能:将当前IP压入栈中,然后转移到内存中指明的目的地址处执行指令。 阅读详情
 

call dword ptr xxx与call xxx的比较

  610人阅读  评论(0)  收藏  举报
一:问题
call dword ptr xxx与call xxx

前者为什么比后者就效率了?还有一个问题

#include <iostream>
using namespace std;
int main()
{
cout<<"hello world!"<<endl;
__asm jmp main
return 0;
}

这个函数为啥不是死循环?怎么执行一会就结束?


如果加个计数器
#include <iostream>
using namespace std;

int a;
void Cout()
{
  a++;
  cout<<"hello world!"<<endl;
  __asm jmp main
  return 0;  
}

int main()
{
  __asm jmp Cout
  return 0;
}  

#include <iostream>
using namespace std;

int a;
void Cout()
{
  a++;
  cout<<"hello world!"<<endl;
  __asm call main
  return 0;  
}

int main()
{
  __asm call Cout
  return 0;
}  

第一个程序的a的值要大一些,也就是说jmp是效率的?输入表的调用为什么还要用call ?


上面这几个问题是看加密解密3 P278 关于输入表函数调用部分的思考,想不明白,请前辈高人帮忙!

二:解答:
fenchang说的是对的

//使用默认栈的大小0x100000 提交0x1000(一个页面)
#include "head.h"

int a;
int main()
{
  a++;
  cout<<"hello world!"<<" "<<a<<endl;
  __asm jmp main

  return 0;
  
}

a=12308 

//增大默认的大小为0x200000提交0x1000 
//1.exe
#include "head.h"
#pragma  comment(linker,"/stack:0x200000,0x1000")
int a;
int main()
{
  a++;
  cout<<"hello world!"<<" "<<a<<endl;
  __asm jmp main

  return 0;
  
}

a=24791

1:结论:是预订地址的空间不够导致了程序的退出,继续增大,程序将继续运行,而并不是抢占式多任务操作系统的任务调试会强制夺回CPU控制权


2:原因:进程空间会发生空间预订的现象——PEB TEB 和线程栈空间分配!
   
3:区别死循环
//2.exe
#include "head.h"

int a;
int main(int argc,char **argv)
{
  while(1)
  {
    a++;
    cout<<"hello world!"<<" "<<a<<endl;
  }
  return 0;
}

 与前面例子的区别:

 //1.exe 反汇编
00401005   /E9 06000000       jmp 1.00401010 ;__asm jmp main的位置
0040100A   |CC                int3
0040100B   |CC                int3
0040100C   |CC                int3
0040100D   |CC                int3
0040100E   |CC                int3
0040100F   |CC                int3
00401010   \55                push ebp  ;保存栈帧底
00401011    8BEC              mov ebp,esp ;开辟新栈帧
00401013    83EC 44           sub esp,44 ;保存变量
00401016    53                push ebx  
00401017    56                push esi
00401018    57                push edi
00401019    8D7D BC           lea edi,dword ptr ss:[ebp-44]
0040101C    B9 11000000       mov ecx,11
00401021    B8 CCCCCCCC       mov eax,CCCCCCCC ;实始化操作
00401026    F3:AB             rep stos dword ptr es:[edi]

………………………………………………省略N句……………………………………………………………………
004010A0  ^ E9 60FFFFFF       jmp 1.00401005  ;__asm jmp main 
………………………………………………………………………………………………………………………………
;这里是收复栈空间
004010A5    33C0              xor eax,eax  
004010A7    5F                pop edi
004010A8    5E                pop esi
004010A9    5B                pop ebx
004010AA    83C4 44           add esp,44


显然,程序在不停的支出栈空间,而并没有回收,使用call指令一样进行这样的操作!

//2.exe 反汇编

00401010    55                push ebp
00401011    8BEC              mov ebp,esp
00401013    83EC 44           sub esp,44
00401016    53                push ebx
00401017    56                push esi
00401018    57                push edi
00401019    8D7D BC           lea edi,dword ptr ss:[ebp-44]
0040101C    B9 11000000       mov ecx,11
00401021    B8 CCCCCCCC       mov eax,CCCCCCCC
00401026    F3:AB             rep stos dword ptr es:[edi]
……………………………………………………上面分配栈空间………………………………………………………………
00401028    B8 01000000       mov eax,1
0040102D    85C0              test eax,eax
0040102F    74 7F             je short 2.004010B0 ;whie(1)条件检测位置
00401031    8B0D 34464100     mov ecx,dword ptr ds:[414634] 
00401037    83C1 01           add ecx,1  ;计数器增加
0040103A    890D 34464100     mov dword ptr ds:[414634],ecx
………………………………………………省略N句,这里省略的部分没有栈操作…………………………………………………………
004010AB  ^ E9 78FFFFFF       jmp 2.00401028 ;循环继续

……………………………………………………回收栈空间…………………………………………………………………………
004010B0    33C0              xor eax,eax
004010B2    5F                pop edi
004010B3    5E                pop esi
004010B4    5B                pop ebx
004010B5    83C4 44           add esp,44
 
显然,循环中没有支出任何栈空间!
  

4:call dword ptr [xxxx],与call xxxx
 
  这两者的区别就在于一点IAT——IAT在OD中就是一段jmp xxxx,call动态链接库的DLL文件时我们根本不再需要先jmp一下,再jmp到函数当中!这个过程的实现如下
_declspec在编写DLL文件的导出函数时被程序员加上了,编译器的汇编阶断会将它转换成call dword ptr [xxxx],并加上一个__im__的标志,生成obj文件教给链接器处理的时候,链接器看到__im__就会直接修改为__im__xxxx!

5:jmp比call效率为什么要用call而不用jmp
A:如果使用jmp我们要自已回收栈空间,这样是浪费程序员的时候,因为程序中很大部分的功能都需要调用函数,所以这个功能被提取出来以方便操作——call!
B:C/C++也用这种方式,是因为它存在的基础是汇编语言,就像遗传!
【转】android call(mo)流程介绍,【转】超详细找call写call教程 神话:本人菜鸟,看了这篇文章+自己的摸索,感觉受益不少。希望这篇文章对某些人有帮助首先我们要知道一点,为什么要找CALL。CALL是什么?大家知道易里的子程序吧如何调用子程序的?这里的CALL就是调用子程序的意思,那问了为什么要找他的,答案是:当你些个游戏的智辅用模拟键盘操作的时候,被操作的永远是当前窗口,当窗口切换的时候,你的智辅就不起作用了,calL可以解决这点 还有一个是什么暂时我没兴趣不去... 阅读详情

相关推荐

Telephony MO CALL/IMS CALL

本篇文章介绍Telephony的MO(Mobile Original) call 的流程。 1.拨号App中输入号码并拨号,Android的源生的拨号App为Dialer(packages/apps/Dialer) 下面看一下在输入完号码,点击拨号按钮后,Dialer中都做了什么事情。 首先触发的是UI点击事件 DialpadFragment handleDialButtonPresse

djialin0418的专栏 4422

《汇编语言》第10章 call和ret指令

call和ret指令都是转移指令,经们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。这一章,我们讲解call和ret指令的原理。

chenyijun的专栏 1万+

Android call 流程以及其他case整理(4)--Conference Call

      Conference Call在项目中的场景不是很多,在日常生活应用也不是很多,基本上项目上的需求原生的代码已经足够。我所接触的只是之前在一个STK 运营商项目上时,对Conference call 有很多UI &amp; 功能的要求,所以趁此也做一个总结,本篇主要是对于IMS的情况做个总结。 1.Conference call 基本介绍     Conference call 就...

Clear_ws的博客 4450

CALL和RET指令(1)

第十章(1)

m0_72827793的博客 1098

CALL是如何炼成的之理论篇

遇到一个CALL应该如何写? 这个是写一个内挂不可避免的问题.刚初学的朋友可能会不知道如何入手.想起刚学这方面的时候,绕过很多弯路,现在把一些经验写出来给大家参考参考吧,不是很高深的东西,但我觉得对某些人很有帮助. CALL是什么? CALL是汇编中的一个指令,CPU执行这条指令会执行2个动作 一:压入EIP入栈 二:跳转到后面的地址.  跟RETN指令配合就实现了汇编中子程序的作用,通常我们常说

redsn0w的新家 1532

dword ptr指令详细解析

8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作

病毒实验三

title: viruslab3 date: 2016-01-05 20:13:57 categories: virus tags: virus --- 进程注入 工具:vs2012 ollydbg part1 编写二进制代码 弹出MessageBox对话框 并测试运行之 要求:首先写汇编代码片段完成以下功能 调用MessageBoxA()函数 弹出一个对话框 显示"I'm hacked!"...

weixin_33910759的博客 262

基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践

本文详细介绍了基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践。通过环境配置、PX4仿真环境搭建、自定义消息生成、Simulink通信实现及实时优化等步骤,提供了完整的无人机位置控制案例,帮助开发者实现高精度的实时联合仿真。

red88的博客 204

汇编语言_第10章 CALL和RET指令

call 和 ret 指令都是转移指令,它们都修改IP 或同时修改CS 和IP。 10.1 ret 和 retf ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。 CPU 执行ret指令时,进行下面2步操作: (1) (IP)=((ss)*16+(sp)) (2) (SP)=(SP)+2 相当于:pop IP CPU 执...

madao1234的博客 516

DDR ECC错误注入与寄存器配置实战指南

本文详细介绍了DDR ECC错误注入的核心价值与实战操作指南,包括通过FI_Dx和FI_ECC寄存器注入数据与ECC错误的方法。文章提供了环境准备、寄存器配置、错误检测及系统可靠性测试策略,帮助开发者验证内存系统的纠错能力和可靠性,提升硬件开发的稳定性与效率。

nnn11的博客 1104

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 415

call, call.call, call.call.call, 你也许还不懂这疯狂的call

你说你懂call, 我说你不懂,你可知a.call.call(b,'b'), 一起探究这疯狂的call。

成长的程序世界,一起成长 1110

Label Studio + SAM2分割半自动标注与yolo11训练

Label Studio + SAM2分割半自动标注与yolo11训练

schFallingCloud 1408

CALL入门篇一:CALL的本质

CALL入门篇一:CALL的本质*所谓的call,其实本质上来说就是一条汇编指令. *只要找到了关键代码的地址,传入适当参数,就可以借用游戏中已有功能来完成内挂的功能。 当程序被编译以后,便不会存在任何函数,存在的只是0和1.所以我们调用也只是这段机器码而已. 网上找CALL的教程很多,但是却是从一个游戏的某一个功能入手,比如说完美的打坐

fengfengfengmy的专栏 8943

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2672

Unreal 从入门到进阶 之 如何实现Pixel Streaming

Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻量级设备,同时将用户输入(如鼠标、键盘、触控)回传到服务器处理。UE的插件相对比较好用,但是就是环境下载总是失败。希望这篇文章对你有所帮助。

TxNet 1369

超级详细找CALL写CALL教程[转]

首先我们要知道一点,为什么要找CALL。CALL是什么?大家知道易里的子程序吧如何调用子程序的?这里的CALL就是调用子程序的意思,那问了为什么要找他的,答案是:当你些个游戏的外挂用模拟键盘操作的时候,被操作的永远是当前窗口,当窗口切换的时候,你的外挂就不起作用了,calL可以解决这点 还有一个是什么暂时我没兴趣不去研究它现在只研究CALL(萝卜加上)首先说明,这个教程以一个找CALL的练习程序...

weixin_34138056的博客 7554

8、Windows 部署ollama

一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,已被包括LangChain、Taskweaver等在内的多个热门项目高度集成。

Andy_shenzl的博客 1131

找call方法

带参数的call的找法,和普通攻击的相似,无非就是记录下来的地址可能会多一些,需要测试的也多一些,不过如果你能够对找出来的地址处的汇编代码进行简单的分析,那么也就还可以再排除大部分地址,减少测试量。关键Call的找法一直都是个不大不小让人头痛的问题,需要大量的汇编代码分析,还需要很多测试工作,当然还有一种变态的方法,那就是用OD断下后,把前前后后所有的call都测试一边,也能找到关键call,不过面对大量的call和无数次挂游戏,恐怕这个方法只能在理论上实现了。这就是利用堆栈进行关键call的另类找法。

mhsuifeng的博客 1290

PCL 使用RANSAC拟合平面【2026最新版】

RANSAC拟合平面算法原理和实现流程详解以及最大迭代次数和内点期望概率的设置方法。最后再对拟合后的平面法向量与向量(1,1,1)进行定向。博客长期更新,最近一次更新时间为:2026年4月24日。

点云侠的博客 42万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql call_mysql CALL语法使用详解

mysql CALL语法使用详解2019-09-10 09:56CALL语法CALL sp_name([parameter[,...]])CALL sp_name[()]CALL语句调用先前定义的存储过程 CREATE PROCEDURE。不带括号的存储过程可以在没有括号的情况下调用。也就是说,CALL p()而且 CALL p是等价的。CALL可以使用声明为OUT或INOUT参数的参数将值传回给...

weixin_34333047的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

找CALL入门写给对找call一片茫然的兄弟

找CALL入门写给对找call一片茫然的兄弟 我本人是一个菜鸟,学外挂不久,在做出了简单的显红蓝人物信息,通过前台按键模拟挂机的外挂后小满足了一段时间(汗,大概2小时左右的样子)我性质勃勃的开始进入了菜鸟学call的队伍中。 中间遇到很多问题。也去不少地方发帖求助,但……没有人愿意或者说没有高手有时间来指点下 坚持,放弃,不死心,郁闷,终于在今天摸到一点头绪,这里发出来希望对广大的菜鸟兄弟们有一点

fengfengfengmy的专栏 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

游戏内存Call技术-易语言绑定主线程调用CALL技术(游戏反检测call)

游戏Call技术-绑定主线程调用CALL技术(反游戏检测call) 我们在写call调用游戏进程里call时候,经常辅助运行一段时间后,游戏就会断线或崩溃掉,但是经过检查, 发现我们调用CALL的源代码又没发现写错误,这到底是怎样呢?{:100_162:} 其实这些是现在游戏的一些游戏反辅助检测导致的,并不是我们调用call的源代码没写对, 现在的游戏调用我们游戏进程里的各种CALL,都是游戏我们的主线程来执行的,如果不是游戏的主线程调用CALL, 就会奔溃或游戏掉线, 所以我们的辅助程序都是在游戏进程.

weiixn_kkcs的博客 7875

CALL 指令

CALL指令用在主程序中,实现子程序的调用。它类似无条件转移JMP指令,但是,子程序执行结束是要返回的;所以,CALL指令不仅要同JMP指令一样改变CS : IP以实现转移,而且还要保留下一条要执行指令的地址,以便返回时重新获取它。保护CS : IP值的方法是压入堆栈,获取CS : IP值的方法就是弹出堆栈。 CALL指令的4种格式如下: 

LKDUO的专栏 3409

给一个CALL传入适当的参数

作者:重楼 P}I*SV 0  给一个CALL传入适当的参数,是要看CALL内部调用了什么参数,而不是看CALL前面压入了什么.CALL前面压入的只是一个参考. B::?  =700) window.open(http://ghoffice.com/bbs/attachment/Fid_133/133_7886_049fc9b35c3cd98.jpg);" src="http:

fengfengfengmy的专栏 3781

函数和call详解

函数定义必须放在函数调用的前面,否则找不到标识符.例如:有时候代码很多,有互相调用,我们很难确保谁在前面谁在后面.例如call1调用call2 , call2又调用call1这时候是会报错的.怎么解决这个问题呢?就涉及到了函数的声明和定义这个时候我们就需要函数声明和函数定义分开的方法,这样就可以了.把函数第一句拷贝出来 加个;即可函数声明, 不带大括号 无函数体,也叫函数原型函数定义 ,带大括号 有函数体,也叫函数实现.一般函数声明放到头文件里,函数定义放到cpp里。

任鸟飞2217777779的博客 4418
上一篇: 上例中便是调用GetSystemMenu函数的
下一篇: 32位汇编没有基址跟偏移地址的概念
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值