代码还原动态调试之 pstree 条件表达式

1.条件表达式

lvl == level - 1 ? last ? shape_pointer->four : shape_pointer->second : gvar_9470[lvl + 1] ? shape_pointer->three : shape_pointer->first

2.有种cmp比较相等时为1,如 a == b, je跳转,表达式值为1

反汇编代码抽取相关部分:


    43cf:	48 8b 05 3a 4f 00 00 	mov    0x4f3a(%rip),%rax        # 9310 <age_to_color@@Base+0x30>    // 9310=shape_pointer
    43d6:	41 39 ee             	cmp    %ebp,%r14d               // level-1 ?= lvl
    43d9:	0f 84 49 07 00 00    	je     4b28 <__sprintf_chk@plt+0x23b8>  // edi=last ? (shape_pointer->four):(shape_pointer->second), jump 4409 
    43df:	48 8b 15 8a 50 00 00 	mov    0x508a(%rip),%rdx        # 9470 <stderr@@GLIBC_2.2.5+0x50>   // gvar_9470
    43e6:	42 8b 54 22 04       	mov    0x4(%rdx,%r12,1),%edx    // edx=gvar_9470+lvl*4+0x4=gvar_9470[lvl+1]
    43eb:	85 d2                	test   %edx,%edx                // edx ?= 0
    43ed:	0f 84 05 06 00 00    	je     49f8 <__sprintf_chk@plt+0x2288>  // rbx=shape_pointer->first,  jmpq 4409
    43f3:	48 8b 58 10          	mov    0x10(%rax),%rbx                  // rbx=shape_pointer->three
    43f7:	eb 10                	jmp    4409 <__sprintf_chk@plt+0x1c99>
    43f9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)

    4400:	48 83 c3 01          	add    $0x1,%rbx
    4404:	e8 87 fb ff ff       	callq  3f90 <__sprintf_chk@plt+0x1820>    // fun_3f90(const char ch)

    4409:	0f be 3b             	movsbl (%rbx),%edi          // edi=gvar_9470[lvl+1] ? shape_pointer->three:shape_pointer->first
                                                                // edi=last ? (shape_pointer->four):(shape_pointer->second), 
    440c:	40 84 ff             	test   %dil,%dil
    440f:	75 ef                	jne    4400 <__sprintf_chk@plt+0x1c90>
    4411:	48 8d 45 01          	lea    0x1(%rbp),%rax                   // rax=(rbp+0x1)=lvl++
    4415:	49 39 ef             	cmp    %rbp,%r15                        // rbp=lvl, r15=level-1
    4418:	74 06                	je     4420 <__sprintf_chk@plt+0x1cb0>  // 跳出 if (leaf == 0)
    441a:	48 89 c5             	mov    %rax,%rbp                        // rbp=lvl
    441d:	eb 81                	jmp    43a0 <__sprintf_chk@plt+0x1c30>
    441f:	90                   	nop

    ....

    49f8:	48 8b 18             	mov    (%rax),%rbx              // rbx=shape_pointer->first
    49fb:	e9 09 fa ff ff       	jmpq   4409 <__sprintf_chk@plt+0x1c99>

    ....

    4b28:	8b 4c 24 10          	mov    0x10(%rsp),%ecx      // ecx=(rsp+0x10)=last
    4b2c:	85 c9                	test   %ecx,%ecx            // last ?= 0
    4b2e:	74 1c                	je     4b4c <__sprintf_chk@plt+0x23dc>  // rbx=shape_pointer->second
    4b30:	48 8b 58 18          	mov    0x18(%rax),%rbx      // rbx=shape_pointer->four
    4b34:	e9 d0 f8 ff ff       	jmpq   4409 <__sprintf_chk@plt+0x1c99>
    4b39:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)

    ....

    4b4c:	48 8b 58 08          	mov    0x8(%rax),%rbx       // rbx=shape_pointer->second
    4b50:	e9 b4 f8 ff ff       	jmpq   4409 <__sprintf_chk@plt+0x1c99>

    ....

说明:以上代码就是比条件表达式的运算,执行步骤化简为
lvl == level - 1 ? last ? shape_pointer->four : shape_pointer->second : gvar_9470[lvl + 1] ? shape_pointer->three : shape_pointer->first
= (0|1) ? (last ? shape_pointer->four : shape_pointer->second) : (gvar_9470[lvl + 1] ? shape_pointer->three : shape_pointer->first)
= (0|1) ? (shape_pointer->four|shape_pointer->second) : (shape_pointer->three|shape_pointer->first)

说明:以上代码就是比条件表达式的运算,执行步骤化简为

lvl == level - 1 ? last ? shape_pointer->four : shape_pointer->second : gvar_9470[lvl + 1] ? shape_pointer->three : shape_pointer->first

= (0|1) ? (last ? shape_pointer->four : shape_pointer->second) : (gvar_9470[lvl + 1] ? shape_pointer->three : shape_pointer->first)
= (0|1) ? (shape_pointer->four|shape_pointer->second) : (shape_pointer->three|shape_pointer->first)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卸载node,下载nvm,下载node过程步骤及错误记录

网上有很多步骤&#xff0c;先跟着网上的步骤来&#xff1a; 卸载node和下载nvm步骤&#xff1a; window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09;-CSDN博客 使用NVM下载和安装NodeJS教程-CSDN博客 出现的问题&#xff1a; 1.nvm配置sett…

ENVI5.6使用笔记

目录 1. ENVI安装扩展2. ENVI绘制高光谱3D数据立体图3. 对本次工作存档&#xff0c;下次打开软件可直接续档 1. ENVI安装扩展 从ENVI App Store下载商店envi_app_store.zip&#xff0c;解压得到ENVI_App_Store.sav&#xff0c;将其复制到ENVI的扩展文件夹下&#xff08;例如E:…

中国桥梁空间分布数据

2020年中国桥梁空间分布数据&#xff0c;共包含102000余条数据。 数据属性表包括&#xff1a;地级市名、区县名、桥梁名称和经纬度。有shp和EXCEl两种格式数据。目前暂没有广西、广东和台湾三个省份数据。

【js】数组元素拼接、数组元素类型转换

一、数组元素拼接 二、数组元素类型转换 1、字符串数组 转换成 数字型数组 [1, 2, 3].map(Number) // [1,2,3] 2、数字型数组 转换成 字符串数组 [1, 2, 3].map(String) // [1, 2, 3]

干货:js解析url参数的作用、场景、方法和安全策略。

涉及到Web3D开发&#xff0c;Three.js和Babylon.js是两个备受推崇的引擎。它们都是基于WebGL的开源3D引擎&#xff0c;用于创建交互式的3D图形应用程序&#xff0c;但要细论起来&#xff0c;three.js普及度远超Babylon .js. 一、二者的介绍 Three.js&#xff1a; Three.js 是…

GitCode见证:华为云DevUI如何定义下一代前端开发

在当今快速发展的数字时代&#xff0c;前端开发已成为企业数字化转型的关键一环。随着用户对交互体验的期待不断增长&#xff0c;拥有一个强大、灵活且易于使用的前端解决方案变得至关重要。 DevUI的诞生&#xff0c;源于华为对研发工具的深入理解和长期积累&#xff0c;作为一…

【C++】开源:量化金融计算库QuantLib配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍量化交易库QuantLib配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

linux模拟aix盘19c单机asm安装补丁

linux模拟盘aix盘vi /etc/rc.d/rc.local/bin/ln /dev/sda /dev/rhdisk2/bin/ln /dev/sdb /dev/rhdisk3 /bin/chown grid:oinstall /dev/rhdisk*chmod 660 /dev/rhdisk* 一、19c安装GI&#xff08;Standalone Oracle Restart&#xff09; su - grid配置环境变量vi .profileex…

红酒与摄影:捕捉酒香与光影的交融

在摄影的世界里&#xff0c;每一个画面都是一段故事&#xff0c;每一束光线都是情感的载体。当红酒遇上摄影&#xff0c;两者之间的交融&#xff0c;仿佛开启了一场关于色彩、光影与情感的视觉盛宴。今天&#xff0c;就让我们一起探索红酒与摄影的奇妙结合&#xff0c;感受雷盛…

为什么我感觉 C 语言在 Linux 下执行效率比 Windows 快得多?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;Windows的终端或者叫控制台…

反射--通俗易懂

一、反射(Reflection) 反射就是:加载类&#xff0c;并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 动态语言&#xff0c;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他…

聊聊Redis持久化策略RDB

写在文章开头 为避免服务器宕机着情况导致redis内存数据库数据丢失&#xff0c;redis默认出通过rdb保证可靠性&#xff0c;本文将从源码的角度带读者了解rdb读写时机和写入流程。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角&#xff0c;看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

c++边界处理机制

1.vector std::vector&#xff1a;std::vector 是动态数组&#xff0c;它会在运行时动态地调整存储空间大小&#xff0c;因此当访问超出边界时&#xff0c;会触发运行时异常 std::out_of_range。可以通过try-catch块来捕获这种异常来处理越界访问。 #include <iostream>…

Mybatis数据封装

目录 解决方案&#xff1a; 1.起别名&#xff1a; 2.手动结果映射&#xff1a; 3.开启驼峰命名(推荐)&#xff1a; 我们看到查询返回的结果中大部分字段是有值的&#xff0c;但是deptId&#xff0c;createTime&#xff0c;updateTime这几个字段是没有值的&#xff0c;而数据…

项目管理系统厂商:奥博思发布《项目管理系统助力 IPD 高效落地》演讲

一场题为&#xff1a;“标准为基&#xff0c;项目之上 &#xff0c;持续提升 PMO 卓越中心”的全国 PMO 专业人士年度盛会在京召开。会议围绕 PMO 卓越中心能力提升、项目管理标准化、项目管理体系建设等核心话题力邀业界专家、卓有建树的 PMO 实践精英来演讲、交流、分享。 奥…

无人机在航拍领域有哪些独特优势?

那肯定是便宜啊&#xff0c;相比传统的飞机或直升机航拍作业&#xff0c;无人机航拍具有更快的响应速度和更低的成本。无人机可以随时随地进行起降&#xff0c;并在短时间内完成航拍任务&#xff0c;极大地提高了作业效率。同时&#xff0c;无人机的运营成本相对较低&#xff0…

C语言快速学习笔记

学习网站&#xff1a;C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com) 这个网站知识完整&#xff0c;讲解清晰。 在线C语言编程工具&#xff1a;菜鸟教程在线编辑器 (runoob.com) 国外学习网站&#xff1a;C语言介…

nanodiffusion代码逐行理解之time embedding

目录 一、time embedding调用过程二、time embedding定义过程三、PositionalEmbedding定义过程 time embedding本质上就是把时间步t转换为指定维度的嵌入向量&#xff0c;这个向量由时间步 &#xff0c;向量维度&#xff0c;周期等参数决定&#xff0c;可以简单理解为根据时间步…

说说硬件调试中发现的那些低级错误

高速先生成员--周伟 最近遇到很多debug相关的咨询&#xff0c;曾经我们说过&#xff0c;我们做过的板子越多&#xff0c;遇到问题的概率也越多&#xff0c;很多别人没遇到过的问题&#xff0c;说不定我们早就触过雷&#xff0c;从而类似的问题形成经验总结&#xff0c;就不会再…