逆向工程总结 第1篇
静态分析是在程序尚未运行的状态下进行的逆向分析。主要使用反汇编、伪代码、流程图、代码修改等方式,常用的静态分析工具有Hopper、IDA Pro等。
Hopper / IDA Pro能够将Mach-O文件的机器语言代码反编译成汇编代码、OC伪代码或者swift伪代码。
Hopper/IDA Pro的地址都是未使用ASLR的VM Address。
以wordios为例,通过Hopper我们可以查看wordios可执行文件里的所有方法。如果我们对某个方法感兴趣,只要一搜就能看到,但只能看到汇编代码或者OC伪代码实现;我们看到该app有很多比如sub_10004f850这样的函数名,说明该app对大量方法名使用了代码混淆的防护手段。
逆向工程总结 第2篇
还是就一家之言,抛砖引玉。理论方面,必须清楚的认识逆向的本质是什么。放到更大的环境下来看,逆向从来不是最终目的,最终目的一般是要实现某个东西。
广义上,逆向不仅仅是调试二进制可执行格式,反汇编,破解。逆向是心理模型的建立过程,以及模型实现的底层细节的确定过程。人脑天然不能推演复杂的系统,面对软件,必须采用各种工程手段来控制,把握软件的复杂性。你为了理解系统,你读代码,无论是源码还是汇编,甚至二进制机械指令,都是一个逆向过程,其结果就是建立了一个模糊的心理模型,用于理解系统的运作过程。然而系统代码是复杂的,庞大的,只凭脑力难以定位底层细节,需要借助工具,如反汇编器,调试器,模拟器。
人只能靠脑力仅能推演很短的代码量,通过纯汇编去推演高层逻辑,是人脑不可承受的,即便理论是可能的,但时间也是不可承受的。所以推演必须要让cpu来执行,人脑只负责在特定的条件下让系统停下来,读取推演的结果。于是就有了调试器。调试器仅是调试的工具,调试的概念更加广泛。它包含两个阶段,第一是心理模型的建立过程,第二阶段是模型的细节的确定过程。在整个过程中,调试器,让人脑力工作量指数下降。
逆向中涉及的心理模型的包括:
逆向工程总结 第3篇
ptrace是一种对运行中的进程进行跟踪和控制的手段,通过ptrace,一个ptrace可以动态地读写另一个进程的内存和寄存器,包括指令空间、数据空间、堆栈以及所有的寄存器。同时,ptrace还提供了一个非常很有用的PT_DENY_ATTACH参数,用来告诉系统阻止调试器附加,所以,最常用的反调试就是通过调用ptrace来实现。
参数1:要做的事情
参数2:要控制的进程ID
参数3:地址
参数4:数据
参数3和参数4都由参数1决定要传递的地址和数据。
参数1的列表
调用方式:
效果:
当我们尝试使用动态调试时,会直接报segmentation fault:11错误。
逆向工程总结 第4篇
动态分析,简单来说就是,我们可以直接使用LLDB调试别人的程序,在静态分析中必须联系上下文进行分析与猜测,而动态分析时只需要把相关寄存器或栈内容打印出来便一目了然,甚至可以直接修改返回值来验证结果的准确性。
LLDB只能运行在macOS上,若要调试iOS应用,需要先在设备上运行一个叫做debugserver的工具。
debugserver扮演服务器的角色,把在macOS端执行的各种LLDB指令传递给设备端,并把设备端的结果反馈到macOS终端,这种调试方式称为远程调试。
如果当前的iOS设备进行过真机调试,那么debugserver会被自动安装到Develop/usr/bin目录,可以通过爱思助手将其导出到macOS上
由于debugserver缺少task_for_pid权限,所以只能调试自己的应用,如果要调试第三方应用,就需要对debugserver进行处理,在iOS11运行还需要加上platform-application权限。
具体步骤:
a. 在导出的debugserver同级目录下创建一个名为“”的文件,并输入以下内容
b. 在终端使用codesign进行签名
codesign -f -s - --entitlements ./debugserver
c. 将签名后的debugserver复制到设备 /usr/bin/ 目录下,并添加执行权限
chmod +x /usr/bin/debugserver
把debugserber复制到“/usr/bin/”目录的好处是,在任意目录下都可以直接运行debugserver。
开启debugserer
// *:端⼝号
// *代表接受任意IP的连接,使⽤iPhone的某个端⼝启动debugserver服务(只要不是保留端⼝号就⾏)
// -a 进程
// 输⼊APP的进程信息(进程ID或者进程名称)
$ debugserver *:端⼝号 -a 进程
a. 10011端口映射
b. 让设备中的debugserver附加到 wordios 进程
c. 打开一个新的终端,使LLDB连接到debugserer
比如调试 [ showMore:],只要知道方法的起始地址,就可以给方法设置断点,我们可以在Hopper中找到这个方法的地址。
但是由于ASLR机制,使得进程每次启动时,地址空间都会被简单地随机化,相当于在Mach-O起始地址前会增加一段随机地址值,所以Hopper中的方法地址并不是真正的地址
真正的地址 = ASLR偏移值 + Hopper方法地址
用以下命令查看应用的ASLR偏移值
image list -f -o
如下图,偏移值为 0x0000000000398000
在Hopper找到showMore:的静态地址 0x000000010006b9ec
计算出方法的真实地址,打断点 (breakpoint set --address ASLR偏移地址+方法静态地址)。
breakpoint set --address 0x0000000000398000+0x000000010006b9ec
逆向工程总结 第5篇
1. windows上,windbg调试,翻泄漏的win2k,nt4代码,源码调试reactos以理解窗口系统,ida/gdb调试vmware的gdbstub接口,以理解内核异常分发(适用于win,linux,mac),SysinternalsSuite监控系统,这方面工具很多。书籍也很多。
2. linux上,visualgdb远程调试内核还是命令程序都是受到良好支持的,是理解内核中的关键机制很给力的工具。linux从内核到命令任何开源c/c++,你基本都能编译调试版。命令行版如gdb,lldb其实并不适合调试源码,因为导航太差。另外linux上很多工具对了解系统非常有用,建议看《linux内核精髓》
3. android上,aosp代码是开源的,但是代码的native部分没有直接受官方支持的调试手段。visualgdb很接近这个目标,在深入配置之后,native代码是可调的。对于framework部分,android studio 是可做到的,只是配置比较麻烦。在深入配置之后,你基本上可以源码调试init,zygote,framework,以及其他感兴趣的组件。对于android内核可以用qemu的gdbstub接口来配置。调试真机内核是个大坑,还是别想了。
逆向工程总结 第6篇
Frida是一个跨平台的轻量级Hook框架,支持所有主流操作系统,它可以帮助逆向研究人员对指定的进程进行分析。它主要提供了精简的Python接口和功能丰富的JS接口,除了使用自身的控制台交互以外,还可以利用Python将JS脚本库注入目标进程。使用Frida可以获取进程详细信息、拦截和调用指定函数、注入代码、修改函数、从iOS应用程序中dump类和类方法信息等。
Frida能实现很多功能,以下介绍几种比较常用的功能:
● frida-ls-devices
图中显示有一个连接usb接口名为iPhone的设备。
● frida-ps -U //-U 代表连接到 USB 设备
跟踪函数: 比如跟踪id为9218的进程中的compress函数:
frida-trace -U -i compress 9218
当触发该方法时会在终端输出。
逆向工程总结 第7篇
完整性检测可以确认目标文件是否被脱壳、是否被静态注入、内容是否被修改、是否被重签名等。常见的方式有:
为了使未越狱的设备也能顺利使用插件,通常会在LoadCommand(加载命令)中增加一个LC_LOAD_DYLIB或者LC_LOAD_WEAK_DYLIB的方式来指向自己的动态库路径,从而实现注入功能,这种方式通常也被称为“静态注入”。
记载命令检测即检测Mach-O文件的LoadCommand中的LC_LOAD_DYLIB或LC_LOAD_WEAK_DYLIB是否存在异常,代码如下:
代码段检测技术主要用来检测“_TEXT, _text”是否被修改(当然也可以检查其他的section),示例如下:
其中,&_mh_execute_header指向Mach-O在内存中的起始位置,getsectiondata函数返回指定Section的内存地址及大小。
实际应用中可以将正确的Hash值存到服务器或者加密后存到本地,在进程启动时进行比对,如果不匹配则可以做一些逻辑处理。
被修改的应用若要在非越狱机器上使用,必要的一个环节就是对其重签名。
签名信息检测就是检测LC_CODE_SIGNATURE中的特征信息(比如TeamID)是否和用户自己的相匹配。
逆向工程总结 第8篇
本次实习,时间虽短,但基本达到了为毕业设计收集资料,完善所学知识,将理论与实践相结合的多重目的。
在实习工程中,我们了解了道路与桥梁工程设计的全过程及一般步骤,了解了结构设计的新动向和新方法,了解了有关的施工技术。
实习实质是毕业前的模拟演练,在即将走向社会,踏上工作岗位之即,这样的磨砺很重要。希望人生能由此延展开来,真正使所学所想有用武之地。
经过这些天的实习,通过实践,使我学到了很多实践知识。通过亲身的接触,使我近距离的观察了整个房屋的建造过程,学到了很多很适用的具体的.施工知识,这些知识往往是我在学校很少接触,很少注意的,但又是十分重要基础的知识。
逆向工程总结 第9篇
(1)在去工地实习之前,已经对工地有一个宏观的认识,但对一些具体环节很困惑,如箍筋的制作,钢筋的绑扎,混凝土试块的预制、基础承台的制作等等只有在现场才能看到。
(2)房屋梁、板、柱的混凝土怎么浇筑的。也都需要在现场才能了解。
(3)施工方案和施工组织设计的形式和内容是什么样的。
(4)C1和B4幢楼的楼板裂纹是什么形状,有没有超过限定的宽度以及对结构会不会产生影响,产生哪种影响。都亟待了解。
(5)监理单位通过何种形式来管理施工单位以及怎样去协调建设单位和施工单位之间的关系。也是我的困惑之一。并寄希望于这次实习会让我茅塞顿开。
逆向工程总结 第10篇
案例选择了一个即时通讯app,确定需要逆向的功能-猜拳和扔骰子,然后从UI层面下手寻找切入点,找到当前控制器以及对应的控件类型,接着利用frida监听当前控制器的方法调用,拿到方法调用之后找到关键方法,打印该方法的堆栈调用,使用hopper静态分析堆栈调用中涉及的每一个方法的实现代码,再结合动态分析打印方法的参数值,找到关键代码,最终还原了该功能的实现代码。
本文分享了iOS逆向工程的大部分知识和技术,由于篇幅有限,开篇中的思维导图有某些知识点没有展开细讲,主要还是讲解逆向工程中的攻击手段和防御手段。
攻击手段有应用脱壳、运行时分析、静态分析、动态调试、修改可执行文件、注入动态库等。
防御手段有代码混淆、反调试、反注入、Hook检测、越狱检测、完整性检测等。
总之,iOS逆向工程中攻击的基本流程就是:先想尽一切办法寻找切入点(突破口),接着通过静态分析与动态调试相结合、跟踪和分析目标程序的核心代码、理解其设计思路等,从而还原出相似代码。
几乎所有的防御手段都是根据攻击手段来布置的,需要注意的是,即使做了这些防御手段,也不代表一定不会被破解,世界上没有十全十美的APP,只要黑客技术够强,总能发现一些漏洞,我们能做的只有做尽可能多的防御措施,迫使攻击者放弃破解的念头。
在文章的最后,通过逆向第三方App中的一个有趣的功能去把所有介绍的逆向技术真正地运用到实战当中。
a. 书籍:《iOS应用逆向与安全之道》
b. 视频:《iOS底层原理》
逆向工程总结 第11篇
运行时分析是常用的攻击手段,具体方案或工具有Cycript / Reveal / LookinLoader / Flex / class-dump等。
Cycript是一款脚本语言,混合了OC与JS语法解释器,能够探测和修改运行中的应用程序,主要用于注入目标程序来实现运行时调试,在重启程序后所有的修改会失效。
利用Cycript向目标App注入代码,从表面现象入手来获取当前的界面布局及控制器,从而定位可疑方法或函数,然后进行各种调用测试,最终定位被逆向功能的入口。
安装方法: 越狱设备直接在Cydia中安装
使用方法:a. 注入目标程序,例如注入运行中的wordios;
b. 使用Cycript语法进行运行时分析。
实例一:
查看wordios的BundleId / APP运行路径 / DocumentPath / CachePath / 当前的KeyWindow / 当前控制器 / 视图层级等等
其中jjcript是我事先封装好的一个接口文件,部分接口实现如下:
Reveal / LookinLoader 是一款强大的UI调试工具,可以调试任何一个iOS应用。它可以在运行时查看App的界面层级关系,还可以实时修改程序界面,不用重新运行程序就可以看到修改之后的效果,免去了每次修改代码后又重新启动的过程。逆向工程里面通常用Reveal / LookinLoader来快速定位感兴趣的控件,进而找到控制器,再用Cycript进行事件分析。
(Reveal)
(LookinLoader)
Flex是一个iOS应用的内部调试工具。当它加载时,会向目标程序上方添加一个悬浮的工具栏,通过这个工具栏可以查看和修改视图的层级结构、动态修改类的属性、动态调用实例和方法、动态查看类和框架以及动态修改UI等。
class-dump是一个命令行工具,它利用Object-C语言的运行时特性将二进制文件中的类、方法及属性等信息导出为头文件。
下载方法:从下载最新安装包,双击打开,将“class-dump”拖动到/usr/local/bin目录下即可使用。
以wordios为例来讲解它的使用方法:
class-dump -S -s -H -o ./Headers
逆向工程总结 第12篇
Theos是一个跨平台的越狱开发工具包,它为开发者准备好了一些代码模板、预置了一些基本的Makefile脚本,方便开发插件。
Theos相当于对CydiaSubstrate的封装,因此能实现对Objective-C运行时的Hook,也能实现对C语言函数的Hook。
简单来说,Theos可以通过修改二进制文件里某个方法的实现,以达到破解的目的。
以上是逆向工程中常用的攻击手段,有一点需要注意的是,当我们成功修改完可执行文件之后,直接替换原文件安装到手机上是运行不了,这时候就需要用到重签名了。
一旦修改了应用的二进制文件,或者增加、修改了应用里面的资源,应用本身的签名就会被破坏,由于iOS内核中强制部署了许多代码签名机制,运行修改后的应用会闪退甚至安装不成功,这样就可以避免攻击者在用户的设备上传播并运行不受信的代码。
如果希望将破坏了签名的安装包,安装到非越狱的手机上,需要对安装包进行重签名的操作。
有两个注意点:
a. 安装包中的可执行文件必须是经过脱壳的,重签名才会有效。
b. .app包内部的所有动态库(.framework、.dylib)、AppExtension(PlugIns文件夹,拓展名是appex)、WatchApp(Watch文件夹)都需要重新签名
重签名步骤:
b. 从文件中提取出权限文件。
在终端敲以下命令即可提取:
security cms -D -i >
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' >
查看可用的证书:
security find-identity -v -p codesigning
对.app内部的动态库、AppExtension等进行签名:
codesign -fs 证书ID
对.app包进行签名:
codesign -fs 证书ID --entitlements
也可以使用一些带有 UI 的重签名工具。例如:
iOS App Signer可以对.app重签名打包成ipa,需要在.app包中提供对应的文件。
iReSign可以对ipa进行重签名,需要提供、文件的路径。
重签名的过程中遇到的问题与注意点:
a. 只能对脱壳的可执行文件进行重签名。
b. 工具只能对ipa进行重签名,app内的动态库、AppExtension需要先手动重签名,最后再使用工具进行ipa重签名。
c. 重签名打包成ipa安装到手机时如出现DeviceNotSupportB...错误,应该是文件里面的UISupportedDevices字段的问题,需要把这个字段去掉再重新打包。
逆向工程总结 第13篇
iOS程序可以通过class-dump、hopper、IDA等获取类名、方法名、以及分析程序的执行逻辑。如果很容易被别人看到类名、方法名是干嘛用的,就很容易被人破解。所以进行代码混淆,将加大别人的分析难度。
在iOS中,代码混淆主要还是对源码进行混淆,比如类名、方法名、协议名、属性名。通过宏定义混淆,例如把Person这个类的名字混淆成abcd:
如果直接将类名、方法名改成abcd什么的,确实可以混淆,但是自己维护也很麻烦。
注意点:
● 不能用宏定义混淆系统方法
● 不能混淆init开头的方法
● 如果xib、storyboard用到的内容,需要修改一下,比如说控制器名用到了混淆,那么xib、storyboard中用到名称需要手动去修改一下,因为系统是不会帮你换的(使用某些工具可以自动化替换)
● 不要什么都去混淆,因为混淆代码太多上架会被拒,只混淆关键代码
● 可以考虑将需要混淆的代码就加个前缀,这样就跟正常代码好区分
逆向工程总结 第14篇
当自己编写的dylib无法加载到目标应用的时候,就表明此应用做了反注入保护。我们可以通过Build Settings -> Signing -> Enable Hardened Runtime 改为YES,或者Capabilities来设置。这样在runtime的时候,会检查注入库的签名与ipa的签名是否一致,签名不一致就无法注入。
以下链接是官方给出的解决方案:
逆向工程总结 第15篇
指的是SysinternalsSuite,apimonitor,windbg,od,ida,x64dbg,wireshark,unicorn,panda等专门的逆向工具,有源码的调源码,没源码的看文档教程。对于调试模型底层原理建议看《软件调试》
底层软件:
bios,uefi,grub,uboot,bootloader,要么jtag,要么模拟器(qemu,bochs,vmware)加上visualgdb,或者ida
进程创建,可执行文件加载器(重定位,动态链接),异常处理过程:
建议找代码研读,最好是调试,异常处理是难以调试的,因为它是建立调试的基础机制,调试它会造成混乱,一个有效的策略是用系统级模拟器做调试,如qemu,bochs,或vmware
===================================================
好了就写这么多吧。
感觉受到暴击的同学移步这里
逆向工程总结 第16篇
很多应用为了确保安全性需要对越狱环境进行检测,如果机器越狱了则不启用某些敏感功能(比如微信的指纹支付功能,在越狱状态下就会自动关闭)。
具体方案:
越狱环境几乎都安装了Cydia、Sileo及其附属文件,可以用下列代码检测:
如果设备已经越狱,就可以读取到系统应用列表的内容,以此来作为检测依据,可以用下列代码检测:
URLSchemes是苹果公司提供的用来跳转到系统应用或跳转到其他应用的一种机制。
这种机制提供了一种检测越狱的思路:
如果能打开Cydia或其他非官方应用,则说明已经越狱,利用“- (BOOL)canOpenUrl:(NSURL *)url”方法来测试相应应用的URLSchemes是否有效就能判定。
逆向工程总结 第17篇
iOS中有很多好用的脱壳工具,比如Clutch、dumpdecrypted、AppCrackr、Crackulous。
以dumpdecrypted为例进行脱壳,流程如下:
a. 首先我们要生成“砸壳”用的动态库;
b. 到越狱手机上寻找要“砸壳”的app路径(通过ssh连接设备,在终端用ps -e | grep wordios命令获取设备当前运行的所有应用信息中名字包括wordios的应用,我们可以找到wordios的运行路径;
c. 使用Cycript注入wordios进程,然后输入以下指令获取Document目录
d. 然后通过爱思助手进入该目录,将拷贝到该目录下;
e. 终端进入该目录,执行下方命令:
DYLD_INSERT_LIBRARIES= /var/containers/Bundle/Application/48C8B703-726F-4304-89E8-7D6F725792F4/
f. 执行命令后会生成已脱壳的可执行文件,后缀名为.decrypted;
g. 通过MachOView工具分析,LC_ENCRYPTION_INFO_64 中的Crypt ID 为0,说明脱壳成功。
逆向工程总结 第18篇
首先本次实习最大的收获之一就是学会了适应环境。通过这次实习我适应了工地生活。有了这段时间的锻炼,不问以后做什么工作都有了一种吃苦耐劳的毅力。还有就是懂得了在工地上一名监理人员应该如何去和建设方、施工方交流等。
其次,通过这次实习使我在工程的理论知识与实践经验相结合有了更深一步的理解。应该说在学校学习的专业知识都是理论上的,与实际还是有点差别的。在建材大市场二期审图的过程中,结合着图集以及以前听过讲座的经验,反复的研究,使自己的识图能力有很大提高;还有就是在与费老一起统计一期工程的剩余工程量的时候。让我对房屋的细部构造有了新的了解,知道了房屋的工程量是如何组成的,加深了对书本上概念的理解;在二期工程快开工时,有机会和陶工一起监督施工方复核标高,使我接触了水准仪、全站仪,并温习了一些它们的使用方法;在参与实习工作的过程中,懂得了我们的主要任务就是管理。其中信息管理是管理过程的一个重要组成部分。来往的收发文件都是有效管理施工方一种形式。也提高了自己文件管理能力。
最后,因此次实习的一个重要目的之一就是写一篇关于混凝土裂缝的小论文,工地正好给我提供了这个机会,因C1和B4幢楼楼板开裂,所以有检测单位提供的材料和数据。经过观察(开裂的楼板和拍摄的照片)、研读检测单位提供的材料、分析三个过程,使其成为小论文内容的一个重要组成部分。
与此同时也发现了很多现场的东西与书本上讲的并不太一致。
(1)工地在合同以及现场管理方面较为混乱。
(2)个别项目在未招标的情况下,建设单位就组织施工单位开始施工,施工单位的施工力量较薄弱、施工队伍繁杂。例如:一期的门窗工程在开工前未报送任何资料(企业资质文件,主材的合格证及检测报告,门窗合格证,施工方案等),甲方单独分包的施工队伍就有很多家,交叉作业复杂,缺乏统一的管理,导致了现场管理较为混乱的局面,且因人员和设备均不能满足施工要求而导致进度缓慢。