ios逆向工程-动态分析
先说说为什么要分析应用吧,如果你想从一个ios应用中获取有用的信息,或者你想修改该应用的一些功能,前提当然是要先知道该app的逻辑和结构了。
动态分享工具比较少,我们先分析个简单的,全民工具Cycript
Cycript
http://iphonedevwiki.net/index.php/Cycript
cycript是一个脚本语言,大家都说可以看做Objective-JavaScript,形容的非常贴切。Cycript在Cydia自带源Cydia/Telesphoreo中就有,安装完以后用ssh登陆ios设备
|
1
|
ssh root@192.168.1.152 |
驱动你要分析的应用,查看PID,这里就拿自动启动的桌面SpringBoard做例子好了
|
1
2
|
ps aux | grep SpringBoardmobile 1514 0.7 10.6 577300 54720 ?? Ss 3:46PM 1:19.28 /System/Library/CoreServices/SpringBoard.app/SpringBoard |
找到PID(1514)后,用Cycript勾上应用
|
1
2
|
cycript -p 1514 cycript -p SpringBoard |
上面两句都可以勾上应用,勾上以后你就可以为所欲为了,先弹个窗口吧
|
1
2
3
|
cy# var alert = [[UIAlertView alloc] initWithTitle:@"asd" message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];#"<UIAlertView: 0x19c200f0; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x19c8e730>>"cy# [alert show] |
可以看到,凡是赋值出来的数据,cycript都会打印出信息来。在截个屏吧,这时候你会想,截屏怎么调呢。。。。这也难倒我了,这样我们先用静态工具class-dump导出头文件来,然后搜索shot,哈哈,出来了


|
1
2
3
|
cy# var shot = [SBScreenShotter sharedInstance]#"<SBScreenShotter: 0x19ccda20>"cy# [shot saveScreenshot:YES] |
Ctrl+D 退出
2.GDB
cycript功能强大,语法类似oc,非常好用,但是就是有有一个致命缺点,就是不能断点,无法停留在具体位置查看结果,这时候GDB就出来了,当然GDB早就出来了,GDB是强大的调试工具,怎么用GDB调试ios应用呢
GDB全名the GNU Project Debugger在cydia(数据源http://cydia.radare.org)中可以下到 .
GDB勾上应用,做法跟Cycript是一样的,可以通过PID,也可以使用应用名
|
1
2
|
gdb -p SpringBoardgdb -p 1514 |
或者可以先调用gdb ,后使用attach勾上应用也是一样的,取消勾使用detach
2. 断点break
|
1
2
|
b -[SpringBoard menuButtonDown:]b *(0xc41e) |
b断点可以断在函数上(但不是每次都能成功),也可以直接断在内存地址上,大家会问我怎么知道函数的内存地址是多少呢,这时候就请查看IDA吧
由于ASLR的原因,一般在IDA中获得的内存地址是不准确的,因为每次运行程序,内存地址都会有一定的偏移,在GDB中使用info sh获得偏移地址
|
1
2
3
4
5
|
gdb$ info shThe DYLD shared library state has not yet been initialized. Requested State Current StateNum Basename Type Address Reason | | Source | | | | | | | | |
你妹啊,什么都没有!!!!!!(OK,就此打住)
于是我找到了SpringBoard应用的目录文件,用file 命令导入
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
yuchenghaide-iPod:~ root# ps aux | grep SpringBoradroot 1915 0.0 0.1 338564 520 s000 S+ 11:02AM 0:00.01 grep SpringBoradyuchenghaide-iPod:~ root# ps aux | grep SpringBoardmobile 1514 0.0 11.3 588168 58320 ?? Ss 3:46PM 1:39.55 /System/Library/CoreServices/SpringBoard.app/SpringBoardroot 1917 0.0 0.1 338608 512 s000 S+ 11:02AM 0:00.01 grep SpringBoardroot 1877 0.0 0.4 349304 2124 s000 S 10:18AM 0:00.29 cycript -p SpringBoardyuchenghaide-iPod:~ root# cd /System/Library/CoreServices/SpringBoard.app/yuchenghaide-iPod:/System/Library/CoreServices/SpringBoard.app root# gdbGNU gdb 6.3.50.20050815-cvs (Fri May 20 08:08:42 UTC 2011)Copyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "--host=arm-apple-darwin9 --target=".gdb$ file SpringBoardunable to read unknown load command 0x80000028Reading symbols for shared libraries .. doneunable to read unknown load command 0x80000028gdb$ attach SpringBoardAttaching to program: `/System/Library/CoreServices/SpringBoard.app/SpringBoard', process 1514.0x3877aa58 in ?? ()Error while running hook_stop:Invalid type combination in equality test.gdb$ info shThe DYLD shared library state has been initialized from the executable's shared library information. All symbols should be present, but the addresses of some symbols may move when the program is executed, as DYLD may relocate library load addresses if necessary. Requested State Current StateNum Basename Type Address Reason | | Source | | | | | | | | 1 SpringBoard - - exec Y Y /System/Library/CoreServices/SpringBoard.app/SpringBoard (offset 0x0) 2 dyld - - init Y Y /usr/lib/dyld at 0x2be00000 with prefix "__dyld_" 3 StoreServices F - init Y ! /System/Library/PrivateFrameworks/StoreServices.framework/StoreServices 4 AirTraffic F - init Y ! /System/Library/PrivateFrameworks/AirTraffic.framework/AirTraffic 5 IOSurface F - init Y ! /System/Library/PrivateFrameworks/IOSurface.framework/IOSurface 6 MultitouchSupport F - init Y ! /System/Library/PrivateFrameworks/MultitouchSupport.framework/MultitouchSupport 7 MobileWiFi F - init Y ! /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi 8 libIOAccessoryManager.dylib - - init Y ! /usr/lib/libIOAccessoryManager.dylib 9 IOMobileFramebuffer F - init Y ! /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer 10 CoreSurface F - init Y ! /System/Library/PrivateFrameworks/CoreSurface.framework/CoreSurface 11 BluetoothManager F - init Y ! /System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager 12 CrashReporterSupport F - init Y ! /System/Library/PrivateFrameworks/CrashReporterSupport.framework/CrashReporterSupport 13 EAP8021X F - init Y ! /System/Library/PrivateFrameworks/EAP8021X.framework/EAP8021X 14 libmis.dylib - - init Y Y /usr/lib/libmis.dylib at 0xa3e000 (offset -0xff5c2000) |
你妹!offset = 0x0 ,这怎么回事!难倒真的是0吗?我试了一下
|
1
2
3
4
5
6
7
8
|
gdb$ b -[SpringBoard menuButtonDown:]Function "-[SpringBoard menuButtonDown:]" not defined.gdb$ b *(0xc41e)Breakpoint 1 at 0xc41egdb$ info bNum Type Disp Enb Address What1 breakpoint keep y 0x0000c41e <_mh_execute_header+46110>gdb$ c |
info b是打印出所有的断点,删除断点可以使用d 断点编号
c 表示继续程序,按home键-结果断点根本没有断下来。好吧,打住,GDB的命令大家可以到网上随意查询!
经过《ios应用逆向工程》作者之一snakeninny的解答,终于了解到在ios7.x之后gdb可能被舍弃了,代替它的是lldb
关于lldb的使用方法: http://bbs.iosre.com/forum.php?mod=viewthread&tid=52
总结:
恩,下节为大家分享lldb的具体使用,另外值得一提的是xcode调试工具就是lldb,所有学会使用lldb是非常重要的。
另外,假设我们在不断的努力下找到了我们想要的逻辑,我们应该怎么攻击或修改它呢。嘿嘿,还是等下回分解吧。
慢慢来!少年!
ios逆向工程-动态分析的更多相关文章
- iOS逆向工程概述(转)
逆向工程一词,对很多人来说可能很陌生,在android领域,我们经常会听到“反编译某个apk”,那么逆向工程从某种角度讲也包括反编译这项技术,这样一对比,可能我们就更容易理解逆向工程的定义了. 我们引 ...
- ios逆向工程-静态分析
最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> --- ...
- iOS逆向工程资料
链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)
- 我也要学iOS逆向工程--全局变量
大家好!很久不见了.我之前去音乐学院进修爵士吉他去了.现在回来了.之前我一直在学windows开发和逆向.后来到了音乐学院,老师推荐了1个录音软件叫logic prox.可惜啊!当时我只有个索尼的笔记 ...
- iOS逆向工程,(狗神)沙梓社大咖免费技术分享。
序言 简介:本文针对于广大iOS开发者,作为一名开发者,仅仅专注于一门语言可能已经不适用现在的市场需求,曾经因高薪和需求量巨大,而火爆一时的移动端开发者(Android,ios),如今的路却是不再那么 ...
- ios 逆向工程文档汇总
iOS逆向工程工具集 http://www.jianshu.com/p/7f9511d48e05 移动App入侵与逆向破解技术-iOS篇 http://blog.csdn.net/heiby/arti ...
- ios逆向工程
原 ios逆向工程-内部钩子(Method Swizzling) Method+Swizzling ios hook Method Swizzling(方法调配) 怎么说呢,先了解什么是钩子为什么 ...
- IOS 逆向工程之砸壳
在<iOS应用逆向工程>4.6.2节中,我们曾推荐使用iPhoneCake源的AppCrackr 1.7版给App砸壳.这种方式简单粗暴,省时省力,但正是因为它过于方便有木有,导致几乎所有 ...
- iOS 逆向工程(工具介绍)- 学习整理(转)
一.class-dump 简介:顾名思义,就是用来导出目标对象的class信息的工具,私有方法声明也能导出来. 原理:利用 Objective-C语言的 runtime 特性,将存 在Mach-O 文 ...
随机推荐
- 转载 URL短地址压缩算法
文章转载http://www.nowamagic.net/webdesign/webdesign_ShortUrlInTwitter.php /// <summary> /// 生成sal ...
- 【cs231n】卷积神经网络
较好的讲解博客: 卷积神经网络基础 深度卷积模型 目标检测 人脸识别与神经风格迁移 译者注:本文翻译自斯坦福CS231n课程笔记ConvNet notes,由课程教师Andrej Karpathy授权 ...
- C和C#两种方式实现邮件的简单接收
本文的主要内容是通过两种方式实现简单邮件的接收,一种方式是通过C语言实现,另一种是通过C#实现的, 两种方式在实现上有许多的不同之处,但是本质上都是一样的. 一,C语言实现方式 C语言接收邮件的步骤: ...
- RedLock 实现分布式锁
J并发是程序开发中不可避免的问题,根据系统面向用户.功能场景的不同,并发的重视程度会有不同.从程序的角度来说,并发意味着相同的时间点执行了相同的代码,而有些情况是不被允许的,比如:转账.抢购占库存等, ...
- CentOS开端口问题
关闭SELINUX ##查看SELINUX状态 /usr/sbin/sestatus -v getenforce #修改config配置文件,重启后即可 vi /etc/selinux/config ...
- Graphviz(转载)
简述 原文: http://www.tuicool.com/articles/vy2Ajyu 本文翻译自 Drawing Graphs using Dot and Graphviz 1. 许可 Cop ...
- Less开发指南(二)- 基本语法
(一)嵌套规则 [1]less可以让我们以嵌套的方式编写层叠样式,先看下面这段CSS: .box-a .hd { height: 20px; } .box-a .bd .txt { color: #0 ...
- JS种正则表达式的基础用法
基础语法 元字符 常用元字符 含义 . 匹配除换行符以外的任意字符 \w 匹配字母数字或下划线 \W 匹配不是字母.数字.下划线的字符 \d 匹配数字,相当于[0-9] \D 匹配不是数字的字符 \s ...
- [C#]委托实例分析(附源码)
一直都听说C#中的委托与事件非常重要,都没有什么切身的体会,而这次通过做一个WinForm二次开发的项目才真正感觉到了委托与事件的犀利之处. 1.C#中的事件和委托的作用? 事件代表一个组件能够被关注 ...
- c#批量上传图片到服务器示例分享
这篇文章主要介绍了c#批量上传图片到服务器示例,服务器端需要设置图片存储的虚拟目录,需要的朋友可以参考下 /// <summary> /// 批量上传图片 /// </summary ...