hopper逆向的伪代码令人大跌眼镜
网上介绍hopper有逆向伪代码的文章很多,并以为其是万能而且cool B的。但是并没有人去求证hopper的逆向伪代码参考系数(参考价值,大家做过开发都清楚明白,有些功能看起来很花很cool但不实用)有多高,或者说可信度正确率(至少不要误导人,这比自己直接逆向分析反汇编代码有误还要冤狂)。上一篇已经提出了这个问题,本篇就来进一步求证,我只本着高中时代上过的政治思想课里面毛论中的实事求是精神,和一个程序员对代码的热爱,并非挑事端。
从我已经逆向过的函数中挑选三个出来,用hopper进行逆向输出伪代码,对比观察我想考察的点。
1.QuartzCore`CA::Context::client_port 观察hopper是否可以分析出^() Block。
2.QuartzCore`CA::Context::commit_commands 观察hopper是否可以分析出switch。
3.QuartzCore`drawLine(c风格函数)在适配到QuartzCore`-[CATextLayer _drawLine:inContext:atPoint:]时 观察hopper是否正确分析出传参。
首先是QuartzCore`CA::Context::client_port, 结果是hopper没有能分析出^() Block,还意外发现hopper在逆向伪代码时不考虑内存单元的引用在其它函数中的内容修改的情况。
下面是对hopper的逆向伪代码关于没有分析出^()Block的批注

接着是意外发现的另一个问题的相关批注

下面是对反汇编进行批注

然后是我逆向出来的代码:


第二个安排的测试点是函数QuartzCore`CA::Context::commit_commands,结果hopper没有分析出switch结构。

最后一个测试点是函数QuartzCore`drawLine,结果hopper在逆向其最善长的oc函数调用时分析传参失误。将QuartzCore`drawLine(c风格函数)在适配到QuartzCore`-[CATextLayer _drawLine:inContext:atPoint:]。hopper只会照着x64体系的传参约定,数着手指头硬生生地加入一个r8寄存器,粗暴地作为msg_send的第5个参数来对付,而并没有从编译器传参数的约定出发来考虑问题。

这个函数简单短小就一同贴上反汇编代码
QuartzCore`drawLine(objc_object*, void*, CGPoint, __CTLine const*):
0x1041ca4dc <+>: pushq %rbp
0x1041ca4dd <+>: movq %rsp, %rbp
0x1041ca4e0 <+>: movq %rsi, %rax
0x1041ca4e3 <+>: movq 0x50f2e(%rip), %rsi ; "_drawLine:inContext:atPoint:"
0x1041ca4ea <+>: movq %rax, %rcx
0x1041ca4ed <+>: popq %rbp
0x1041ca4ee <+>: jmpq *0x55d44(%rip) ; (void *)0x000000010357d800: objc_msgSend
hopper逆向的伪代码令人大跌眼镜的更多相关文章
- 自制反汇编逆向分析工具 与hopper逆向输出对比
经过一个阶段5次迭代之后,本逆向分析工具功能基本成形.工具的基本功能介绍请参看前面的posts. 现在就和hopper的逆向函数伪代码的功能对比一下效果.在这里并非定胜劣,因为差异可以拿来对比参照,通 ...
- hopper反汇编工具的逆向伪代码功能并不理想
hopper的逆向代码功能并不如想象中那么好,尤其是在逆向c++代码时.对于从ObjC进入iOS开发又不太清楚运行时的人员来说,hopper可以将反汇编码输出成[obj selector:what]这 ...
- 写给 iOS 开发者的 Hopper + lldb 简介
最近,关于 @Steipete 在Radar发布的帖子,笔者看到很多人在问「你是怎么理解那个伪代码的」.笔者想写博客已经有一段时间了,现在正好就此发表第一篇博文.笔者在一个叫 Hopper 的工具上花 ...
- EF之ExecuteSqlCommand更新出现无效的解决方案
本篇文章将会剖析为什么会出现这一现象.以及解决的办法 先来看一下代码 public static TResult AddTest() { TestDAL testdal = DALFactory.Cr ...
- <读书笔记>软件调试之道 :问题的核心-诊断
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...
- IT职业选择与定位
(一) 位置有很多,最适合你的是哪个? 有的人在电子技术的层面工作,开发出性能强劲的芯片和硬件产品:有的人在别人开发的芯片和硬件上开发各种操作系统和驱动程序:有的人在各种操作系统或设备 ...
- mac下烦人的eclipse安装svn插件
eclipse作为一个鸡肋般的java ide,颇有食之无味弃之可惜之感.最近公司统一对电脑做了一些处理,搞的我的eclipse都不能用了.重新安装了一下,各种maven.svn,代码格式什么的依赖神 ...
- 怎么跳出MySQL的10个大坑
淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合作,共向 ...
- 解决iOS7中UITableView在使用autolayout时layoutSubviews方法导致的crash
近期公司项目上线后,出现了大量的crash,发生在iOS7系统上,和UITableView相关: Auto Layout still required after executing -layoutS ...
随机推荐
- Jackson替换fastjson
为什么要替换fastjson 工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化.那么作为大量使用的基础框架,为什么还要进行替 ...
- i春秋DMZ大型靶场实验(三)内网转发DMZ2
更具实验文件知道存在源码泄露 下载源码进行源码审计 发现admin账号 查看user.php 发现mysql 账号 端口 对登录后源码进行审计 发现上传文件的两处漏洞 对 fiel name 可以 ...
- ThingJS和传统3D开发的区别
物联网3D可视化开发已经辐射到各行各业,无论车间还是消防,城市还是粮仓,亦或是地铁.科技园,物联网可视化是科技的进步,也是行业的进步.而传统的3D可视化开发实施起来并不那么乐观.如果使用ThingJS ...
- 5G:今天不谈技术,谈谈需求和应用
4G改变生活,5G改变社会.随着2019年5G手机的发布,5G时代已经拉开帷幕,无数嗅觉灵敏的投资人和创业者在研究5G行业的投资机会. 但是,市场研究侧重于技术细节与上游产业链设备投资居多,对于贴近消 ...
- css布局两端固定中间自适应
第一种:采用浮动 1.1首先来看一下网上一个哥们给的代码 <body> <div class="left">左</div> <div cl ...
- .NETCore下CI/CD之自动化测试
前言 为了呼应<中国.NET开发者峰会2019上海站>,作为演讲嘉宾,我希望和各位同行建立更多的互动,为此,我特地将部分演讲内容,整理成文章先行发布.本文从零开始,一步一步的引导,从安装J ...
- 源码剖析Yii错误 Invalid parameter number: no parameters were bound
ActiveRecord使用的一个陷阱导致 Invalid parameter number: no parameters were bound 请看下面的例子 $criteria = new CDb ...
- 我的第一个Python爬虫——谈心得
2019年3月27日,继开学到现在以来,开了软件工程和信息系统设计,想来想去也没什么好的题目,干脆就想弄一个实用点的,于是产生了做“学生服务系统”想法.相信各大高校应该都有本校APP或超级课程表之类的 ...
- MySQL:数据库基本认识
1.什么是数据库 通俗来讲,数据库就是用于存储数据的仓库.很多人可能会问,存储数据用文件不就行了吗?为什么还要弄数据库? 文件存储数据具有以下几个缺点: 文件的安全性问题 文件不利于查询和数据库管理 ...
- VS环境下基于C++的单链表实现
------------恢复内容开始------------ #include<iostream> using namespace::std; typedef int ElemType; ...