戳堆栈

2024-03-01

我试图了解堆栈到底是如何工作的,所以我将在这里重新创建一个带有一些问题的小示例。

假设我在 ASM 中有一段小代码,它执行以下操作:

(这一切都是x86、intel语法、Linux)

push ebp
mov ebp, esp
sub esp, 16

mov eax, 0xdeadbeef  <-- let's call this 'local variable a'
mov [ebp - 16], eax

mov eax, 0xabcdabcd  <-- let's call this 'local variable b'
mov [ebp - 12], eax

mov eax, 0xcacafafa  <-- let's call this 'local variable c'
mov [ebp - 8], eax

mov eax, 0xdada1111  <-- let's call this 'local variable d'
mov [ebp - 4], eax

call 0x10101010 <------- pretend that is the real address of function_B

mov esp, ebp
pop ebp
ret

现在假设我有一个名为的 C 函数function_B从 asm 代码中调用 get ,它看起来像这样:

asmlinkage void function_B(void){

    //some code here...

}

我如何访问a, b, c and d from function_B使用内联 ASM 代码?

这行得通吗?我应该采取不同的做法吗?

uint32_t val_a;
__asm__ __volatile__(
    ".intel_syntax noprefix;"
    "mov %0, dword [ebp + 4 + 4 + 0];"
    ".att_syntax;"
    : "=r" (val_a)
);

uint32_t val_b;
__asm__ __volatile__(
    ".intel_syntax noprefix;"
    "mov %0, dword [ebp + 4 + 4 + 4];"
    ".att_syntax;"
    : "=r" (val_b)
);

另外,我将如何访问a, b, c and d如果我的函数如下所示:

asmlinkage void function_B(unsigned int val){

    //some code here...

}

那这个呢:

void function_B(uint32_t fake){
    uint32_t* poke = &fake;
    uint32_t a = poke[0];
    uint32_t b = poke[1];
    uint32_t c = poke[2];
    uint32_t d = poke[3];
}

什么将为您提供当前 asm 代码的 a、b、c 和 d 的值(不会将任何参数推送到 function_B)。如果您还想将真实参数传递给 function_B,您仍然可以在最后一个真实参数之后添加假参数:

void function_B(unsigned int val,uint32_t fake)

这样做实际上更安全一些(然后使用内联汇编),因为它有更好的机会在优化中生存(例如堆栈帧省略)。但当然它仍然是一个黑客,我不会太依赖它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

戳堆栈 的相关文章

  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • vs2008 c#:Facebook.rest.api如何使用它来获取好友列表?

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo

随机推荐

  • LoadedEvent 的路由事件类处理程序不适用于大多数类

    我正在尝试为所有 Loaded 事件注册处理程序 EventManager RegisterClassHandler typeof UIElement FrameworkElement LoadedEvent new RoutedEvent
  • Flyway lambda 的 CDK 自定义资源响应

    我已经从以下位置获取了 Flyway lambda这个仓库 https github com Geekoosh flyway lambda我正在尝试实现一个自定义资源 只要迁移源文件夹发生更改 该资源就会调用 lambda 它工作正常 但偶
  • 处理器处理中断的速度有多快

    我正在研究中断 因此 大多数架构都是中断驱动的 如果一切都是中断驱动的 那么处理器处理所有这些的速度有多快 例如 当按下键盘按键时 它会创建一个中断 要求内核在缓冲区中查找新字符 在这种情况下 处理器的服务速度有多快 而且当发出中断时 处理
  • 如何使用 .env 文件覆盖 fastlane 应用程序文件中的值

    在某些情况下 我们需要覆盖 fastlane 应用程序文件中的值 例如使用不同的苹果帐户来发布应用程序 但没有记录的官方方法 最简单的方法是使用环境变量 Use an Appfile像这样 apple id ENV APPLE ID ema
  • 如果满足条件则打印上一行

    我想 grep 一个单词 然后找到该行中的第二列并检查它是否大于某个值 是的 我想打印上一行 Ex 输入文件 AAAAAAAAAAAAA BB 2 CCCCCCCCCCCCC BB 0 1 Output AAAAAAAAAAAAA 现在 我
  • 如何创建崩溃时重新启动的服务

    我正在使用创建服务CreateService http msdn microsoft com en us library ms682450 28VS 85 29 aspx 如果该服务发生崩溃 它将再次正常运行 并且我希望 Windows 在
  • 如何从 PHP 获取电子邮件及其附件

    我正在为朋友的婚礼编写一个照片库网络应用程序 他们想要一个照片库供客人提交他们当天拍摄的数码照片 在评估了所有选项后 我决定对用户来说最简单的事情就是让他们使用熟悉的界面 他们的电子邮件 然后让他们将图片作为附件发送 我已经创建了一个邮箱
  • 如何将 WCF 客户端代理生成的类中的方法标记为虚拟

    在 VS 2010 中 我创建了一个服务引用 该引用的代码生成 WCF 客户端代理类 Reference cs 我需要此类中的方法具有 Virtual 修饰符 以便它们可以在 Mock 中使用 当然 我可以手动编辑生成的代码 但每次更新引用
  • 通过 ajax 加载的表单上的 :remote => true/data-remote

    在我的 Rails 应用程序中 我有一个使用 jQuery 加载方法通过 Ajax 加载的表单 function load sales form product id sales form load product id 加载的表单有一个
  • Junit测试时如何将日志级别设置为DEBUG?

    我将 SLF4J 与 LOG4J 一起使用 配置通常位于log4j properties 并将日志级别设置为 INFO 但是在测试期间我想将日志设置为 调试 我看不出有什么方法可以实现自动化 也没有类似的东西log4j tests prop
  • PyOpenCL 矩阵乘法

    我有使用 pyopenCL 进行矩阵乘法的代码 我的问题是某些矩阵的结果是错误的 我不明白为什么 经过一番研究后 我认为它与类似的全球规模有关 但我不明白如何设置该值 例如 使用 numpy dtype float32 的矩阵 矩阵1 0
  • 如何使用 Angular 的装饰器模式来增强指令的链接功能?

    我正在开发一个 Angular 库 并寻找一种使用装饰器模式扩展指令的方法 angular module myApp decorator originaldirectiveDirective delegate function delega
  • Jekyll 右对齐文本

    如何在 Jekyll 中右对齐文本 我有一段文本想要右对齐 如果是 HTML 我会这样做 style text align right 我怎样才能用 Jekyll 在 Markdown 中做到这一点 Jekyll 2 0 使用 kramdo
  • DefaultConnection 和membership - localsqlserver 和defaultconnection 之间的连接是什么

    嗯 我真的无法理解这个问题 在 web config 我有
  • 编译器错误消息:CS0029:无法将类型“int”隐式转换为“string”

    我需要转换String表数据库的输入整数值在 C NET 4 中并尝试了受此启发的代码Link https stackoverflow com questions 2344411 how to convert string to integ
  • 获取 ASP.NET MVC 站点在文件系统中的路径

    我有一个 ASP NET MVC 项目 它有一个名为电子邮件的子文件夹 其中包含我的电子邮件模板的 HTM 文件 在网站的某些位置 我有一个控制器需要加载这些模板之一并将其作为电子邮件发送 我想要做的是使用反射来获取当前执行程序集的路径 但
  • Visual Studio Code 无法在 WSL2 上运行

    当我尝试在 WSL2 终端中打开 VS Code 时 如下所示 code 我收到以下错误 mkdir cannot create directory DIRECTORY Permission denied 当使用 sudo 启动时 sudo
  • 使用 Linq to SQL 进行多线程处理

    我正在构建一个应用程序 它需要我使用 DataContext 的内部线程 我的应用程序不断抛出异常InvalidOperationException类似于 There is already an open DataReader associ
  • 未知长度资产的 AVAssetResourceLoaderDelegate 实现

    我的 iOS 应用程序使用 AVPlayer 播放来自我的服务器的流音频并将其存储在设备上 我实现了 AVAssetResourceLoaderDelegate 因此我可以拦截该流 我改变了我的计划 从http到一个假方案 以便调用 AVA
  • 戳堆栈

    我试图了解堆栈到底是如何工作的 所以我将在这里重新创建一个带有一些问题的小示例 假设我在 ASM 中有一段小代码 它执行以下操作 这一切都是x86 intel语法 Linux push ebp mov ebp esp sub esp 16