iOS逆向-day7:iOS 命令行工具开发

简介: iOS逆向-day7:iOS 命令行工具开发

image.png


一、命令行工具的创建 和 main函数的处理



  • 1.1、我们利用 Xcode创建一个命令行工具,取名:JKCommandLine,我们利用Xcode 的iOS环境创建的目的是:让Xcode 帮我们配置好各种环境,比如:签名、一些权限 等等


image.png

image.png


1.2、删除无用的文件


image.png


 

提示:main 函数里面我们返回了:return 0; 就是不需要界面的意思


1.3、Command + B 获取可执行文件


image.png

image.png

1.4、一般我们要的是发布版本的可执行文件,我们可以修改

image.png

image.png


1.5、我们把可执行文件拖到 用户手机目录下的 Device/usr/bin


image.png


增加 命令行工具的可执行权限,我们李恩杰设备后可以执行如下命令

chmod +x /usr/bin/JKCommandLine

命令行工具的使用

JKCommandLine


image.png


二、命令行功能分析



  • 2.1、功能分析,我们要获取一个 app 的架构 和 是否加壳,主要是根据头文件的前四个字节


image.png

image.png

2.2、具体的代码实现

#import <UIKit/UIKit.h>
#import <mach-o/fat.h>
#import <mach-o/loader.h>
int main(int argc, char * argv[]) {
    @autoreleasepool {
        printf("JKCommandLine-------");
        NSString *appPath = @"/private/var/mobile/Containers/Bundle/Application/4BB74232-94B6-4465-87E7-AFE4F6E5C91D/WebToon.app/WebToon";
        NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:appPath];
        int length = sizeof(uint32_t);
        // 读取最前面额 4 个字节 (magic number, 魔数,用来标识文件类型)
        NSData *magicData = [handle readDataOfLength:length];
        // 魔数,用来标识文件类型
        uint32_t magicNumber;
        // 把 magicData 4个字节的数据放到 magicNUmber 内存里面
        [magicData getBytes:&magicNumber length:length];
        if (magicNumber == FAT_CIGAM || magicNumber == FAT_MAGIC) {
              printf("FAT文件\n");
         } else if (magicNumber == MH_MAGIC || magicNumber == MH_CIGAM) {
              printf("非64bit架构文件\n");
         } else if (magicNumber == MH_MAGIC_64 || magicNumber == MH_CIGAM_64) {
              printf("64bit架构文件\n");
         } else {
              printf("读取失败");
         }
         printf("----0x%x\n", magicNumber);
         // 关闭文件处理器
         [handle closeFile];
         // return 0:就是需要界面的意思
         return 0;
    }
}


  • 提示:上面的代码在读取的时候会失败,如下,这是因为缺少权限的原因,后面在 给可执文件增加权限


image.png


三、读取用户输入的参数



  • 3.1、在 main 函数里面会获取到参数


/// main函数
/// @param argc 参数个数
/// @param argv 存放参数的数组
///  argv [0] 是当前可执行文件的路径
int main(int argc, char * argv[]) {
}


  • 第一个参数是固定的, argv [0] 是当前可执行文件的路径;当有参数的时候是从第二个参数开始的
  • 3.2、参数的设置
    一般来说,我们会在参数的前面会加一个 -,比如:我们常用的 Clutch,查看所有的 加壳的应用:Clutch -i


image.png

那么我们也设置两个参数:-i-s

#import <UIKit/UIKit.h>
#import <mach-o/fat.h>
#import <mach-o/loader.h>
/// main函数
/// @param argc 参数个数
/// @param argv 存放参数的数组
///  argv [0] 是当前可执行文件的路径
int main(int argc, char * argv[]) {
    @autoreleasepool {
       if (argc == 1) {
           printf("-l 查看Macho 信息\n -s 查看Macho 信息\n");
           return 0;
       }
       // 找不到对用的参数
       if (strcmp(argv[1], "-l") != 0 || strcmp(argv[1], "-s") != 0) {
           printf("-l 查看Macho 信息\n -s 查看Macho 信息\n");
           return 0;
       }
       // return 0:就是需要界面的意思
       return 0;
    }
}


image.png


四、给 Mach-0 文件增加 entitlements (权限)



  • 4.1、查看可执行文件的权限,这里我们使用的 ldid,当然也可以使用 codesign,下面我们以 JKCommandLine 为例,我们导出 JKCommandLine 权限,如下


cd 进入 JKCommandLine 可执行文件的路径
// 导出 JKCommandLine 可执行文件的权限
ldid -e JKCommandLine > JKCommandLine.entitlements


语法:导出权限:ldid -e 可执行文件名字 >> 可执行该文件的名字.entitlements,代表的意思是:将 可执行文件的权限导入到 可执行该文件的名字.entitlements  文件里面去


image.png


image.png

  • 提示:一个 > 代表覆盖,两个 >> 代表追加到文件的尾部
  • 权限:entitlements == plist == xml


  • 4.2、我们可以看到普通的一个 可执行文件全新啊很低,那么如何增加可执行文件的权限呢?我们可以获取 SpringBoard 的权限,然后再赋给我们的可执行文件的权限
  • 获取 SpringBoard 可执行文件,在路径:Device/System/Library/CoreServices/SpringBoard.app


image.png


获取 SpringBoard 权限

cd 进入 SpringBoard 可执行文件的路径
// 导出 SpringBoard 可执行文件的权限
ldid -e SpringBoard > SpringBoard.entitlements


image.png


将 SpringBoard 的权限 签给 其他的可执行文件,比如签给 JKCommandLine ,如下,我们把 SpringBoard.entitlements 放到 JKCommandLine目录下

cd 进入 JKCommandLine 可执行文件的路径
ldid -SSpringBoard.entitlements JKCommandLine



image.png

语法: 重新签回权限:ldid -S可执行该文件的名字.entitlements 可执行该文件的名字,这里的签名仅仅是签权限


  • 4.3、测试 JKCommandLine 文件的,我们可以看到我们有了读取其他app的权限


image.png


五、命令行工具的总结



  • 5.1、命令行工具的本质
    本质:可执行文件,跟app内部的可执行文件差不多

image.png


5.2、测试一下其他app的可执行文件,比如爱奇艺


image.png


六、拓展: MJAppTools



源码地址:https://github.com/CoderMJLee/MJAppTools

  • 6.1、下载源码后,执行以下两种的任意一种方式



image.png


6.2、复制编译后的生成的文件 MJAppTools 到 越狱手机的 iFunBox 的 usr/bin 目录下


image.png


6.3、复制 MJAppTools 到 越狱手机的 iFunBox 的 usr/bin 目录下

image.png


6.4、让 MJAppTools 具有执行的权利,终端链接越狱手机后,执行 chmod +x /usr/bin/MJAppTools

image.png


6.5、MJAppTools 的使用


image.png


6.6、JKAppTools 后面可以跟上图的命令,如 : -l <regex> 列出用户安装的应用

JKAppTools -l
目录
相关文章
|
9天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
117 1
|
2月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
2月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
66 1
|
2天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
17天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
37 9
|
13天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
16天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
14天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
17天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!