网上介绍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逆向的伪代码令人大跌眼镜的更多相关文章

  1. 自制反汇编逆向分析工具 与hopper逆向输出对比

    经过一个阶段5次迭代之后,本逆向分析工具功能基本成形.工具的基本功能介绍请参看前面的posts. 现在就和hopper的逆向函数伪代码的功能对比一下效果.在这里并非定胜劣,因为差异可以拿来对比参照,通 ...

  2. hopper反汇编工具的逆向伪代码功能并不理想

    hopper的逆向代码功能并不如想象中那么好,尤其是在逆向c++代码时.对于从ObjC进入iOS开发又不太清楚运行时的人员来说,hopper可以将反汇编码输出成[obj selector:what]这 ...

  3. 写给 iOS 开发者的 Hopper + lldb 简介

    最近,关于 @Steipete 在Radar发布的帖子,笔者看到很多人在问「你是怎么理解那个伪代码的」.笔者想写博客已经有一段时间了,现在正好就此发表第一篇博文.笔者在一个叫 Hopper 的工具上花 ...

  4. EF之ExecuteSqlCommand更新出现无效的解决方案

    本篇文章将会剖析为什么会出现这一现象.以及解决的办法 先来看一下代码 public static TResult AddTest() { TestDAL testdal = DALFactory.Cr ...

  5. <读书笔记>软件调试之道 :问题的核心-诊断

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...

  6. IT职业选择与定位

           (一)  位置有很多,最适合你的是哪个? 有的人在电子技术的层面工作,开发出性能强劲的芯片和硬件产品:有的人在别人开发的芯片和硬件上开发各种操作系统和驱动程序:有的人在各种操作系统或设备 ...

  7. mac下烦人的eclipse安装svn插件

    eclipse作为一个鸡肋般的java ide,颇有食之无味弃之可惜之感.最近公司统一对电脑做了一些处理,搞的我的eclipse都不能用了.重新安装了一下,各种maven.svn,代码格式什么的依赖神 ...

  8. 怎么跳出MySQL的10个大坑

    淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合作,共向 ...

  9. 解决iOS7中UITableView在使用autolayout时layoutSubviews方法导致的crash

    近期公司项目上线后,出现了大量的crash,发生在iOS7系统上,和UITableView相关: Auto Layout still required after executing -layoutS ...

随机推荐

  1. 8.Linux用户管理(上)

    1.什么是用户? 能正常登陆系统的都算用户 windows系统和linux系统的用户有什么区别? 本质上没有区别, linux支持多个用户同一时刻登陆系统, 互相之间不影响 而windows只允许同一 ...

  2. jenkins pipeline 流水线生产

    jenkins pipeline : pipeline { agent any parameters { string(name: 'git_version', defaultValue: 'v1.1 ...

  3. OTA升级详解(一)

    不积跬步,无以至千里: 不积小流,无以成江海. 出自荀子<劝学篇> 1.概念解释 OTA是何物? 英文解释为 Over The Air,既空中下载的意思,具体指远程无线方式,OTA 技术可 ...

  4. 页面报错常用状态码总结(Http常见状态码)

    作为一个互联网开发人员对于一些服务器返回的HTTP状态的意思都必须是了如指掌的,只有将这些状态码一一弄清楚,工作中遇到的各种问题才能够处理的得心应手.好了,下面就让我们来了解一下比较常见的HTTP状态 ...

  5. mysql的一些常用操作(一)

    1.启动Mysql服务 net start mysql 2.进入mysql环境中,由于自己没有设置密码,直接回车进入即可(要将bin加入到环境变量path中) mysql -u root -p 3.创 ...

  6. SpringBoot与MybatisPlus3.X整合之字段类型处理器(八)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  7. github实用的搜索小技巧

    查资源,学习优秀的框架,搜索是一种能力! 作为程序猿开发中最大的同性交友网站,github当之无愧,里面有很多优秀的开源框架,各种技术大佬混迹其中,有他们总结的学习教程,造好的轮子(开发的各种工具,技 ...

  8. 【MySQL】MySQL数据类型

    MySQL表数据存储大小说明 MySQL中规定,任何一条记录(数据表中每行数据)理论上的最大存储容量为 2^16 - 1 (Bytes) = 65535字节. MySQL数据类型思维导图 MySQL数 ...

  9. Apache Tomcat 远程代码执行漏洞(CVE-2019-0232)漏洞复现

    Apache Tomcat 远程代码执行漏洞(CVE-2019-0232)漏洞复现  一.     漏洞简介 漏洞编号和级别 CVE编号:CVE-2019-0232,危险级别:高危,CVSS分值:官方 ...

  10. 【AtCoder - 5659 】>< (思维题)

    >< 直接写中文了 Problem Statement 给定的是长度为N-1的字符串S. S中的每个字符都是<或>. 当对所有i(1≤i≤N-1)都满足以下条件时,N个非负整数 ...