导语:随着每一个新版本的发布,破解iOS变得越来越困难,将iOS应用程序重新打包并重新签名,然后在未越狱的iOS设备上侧面载入(sideload),这一话题近年来引起了安全研究人员的极大兴趣。

介绍

随着每一个新版本的发布,破解iOS变得越来越困难,将iOS应用程序重新打包并重新签名,然后在未越狱的iOS设备上侧面载入(sideload),这一话题近年来引起了安全研究人员的极大兴趣。由于在iOS内核中实现了几个强制代码签名,因此在未越狱设备上侧面载入的应用程序会受到限制。这样做是为了防止恶意活动者在不知情用户设备上传播和运行不受信任的代码。这种强制代码签名与苹果AppStore应用程序审查过程相结合,为防止恶意应用程序被传播给iOS用户发挥了巨大作用。

虽然这些措施让攻击者更难针对AppStore用户,但也让安全研究人员更难独立评估iOS应用程序的安全性。安全研究人员想要将应用程序进行侧面载入最常见的两个原因是:

· 为了避免绕过应用程序开发人员为防止逆向工程而实现的几个二进制保护的需要。

· 在iOS的某些版本上,没有公共越狱。

本指南旨在为关于iOS应用程序重打包和签名的安全研究指出存在的挑战,同时提供如何克服这些挑战的建议。

现有的工作

有一些值得注意的研究和文章讨论了在未越狱设备上安装重打包和签名的应用程序问题。但是,其引用的研究要么缺乏足够的细节,要么仅仅演示了iOS应用程序重打包和签名的简单例子。

由于存在上述限制,因此写了本指南,本指南解决了在未越狱设备上使用不同的构建配置对应用程序重打包和签名的问题。特别是,将解决以下构建配置的重打包和签名:

· 从AppStore下载的应用程序

· 包含框架和/或dylibs的应用程序

· 使用App Extensions(应用扩展)和高级应用程序功能的应用程序。

· 绑定WatchKit应用程序的应用程序

方法

重新打包iOS应用程序大致可以分为六个步骤:

1.解密绑定在应用程序IPA中的MachO二进制文件

2.用自定义代码/库修补应用程序

3.为要部署重打包的应用程序的目标iOS设备生成Provisioning Profile(配置文件)

4.更新应用程序元数据以匹配Provisioning Profile

5.重签名应用程序的MachO二进制文件

6.将包归档并侧面载入到目标iOS设备

本指南将使用此方法演示示例iOS应用程序的重打包和签名。

开始

建立一个工作区

开始,研究人员使用适当的工具来设置工作区。用一个已破解的iOS设备来解密应用程序,用一个未破解的iOS设备来将重新打包的应用程序进行侧面载入。

本指南使用的是通过Saigon beta2越狱,运行iOS 10的iPod Touch 6,以及运行iOS 11的未越狱iPhone 6s。越狱和未越狱的设备都是64位的设备。

MacOS High Sierra

MacOS需要执行许多操作才能重新打包iOS应用程序。需要的工具包括Xcode、otool和codesign等工具。在撰写本文时,作者并不知道也可以使用FOSS作为替代方案实现重新打包iOS应用程序所需的相同操作。如果将来FOSS工具可以使用,本指南将会更新使用FOSS工具。

Xcode 9 +

用于生成具有权限(entitlement)权利的Provisioning Profiles ,它作为重新打包过程的一部分。

optool

它是一个开源工具,允许修补MachO的二进制文件。本指南使用optool向MachO二进制文件添加加载命令。

FridaGadget

为了演示如何用自定义代码对应用程序进行打补丁,本指南将Frida服务器绑定为一个共享库,通常称为FridaGadget。当生成补丁应用程序时,它将加载启动Frida服务器的dylib。然后可以连接到这个服务器并检测应用程序。

idevice* utilities

要将重新打包的应用程序安装到目标设备上,可以使用的几个选项之一是idevice* utilities。本指南使用ideviceinstaller、ideviceimagemounter和idevicedebug来安装和运行重新打包的应用程序。只需要实用程序ideviceimagemounter和idevicedebug使用debugserver生成应用程序。

重打包应用程序

1.应用程序存储二进制文件重打包

1.png

可以使用iTunes 12.6从AppStore下载iOS应用程序包(IPAs)。应该注意的是,新版本的iTunes不支持从AppStore下载应用程序。可以从以下链接下载iTunes 12.6。对于第一个重打包演示,Simple Notepad,使用一个简单的iOS应用程序来让读者熟悉重打包应用程序的六个步骤。

使用unzip或类似工具解压缩Simple Notepad IPA,得到一个名为“Plain Notes”的MachO可执行二进制文件。下面的代码片段展示了在Simple Notepad应用程序包中MachO二进制文件的布局:

Payload/
    Plain Notes.app/
        Plain Notes

1.1解密MachO二进制文件

创建了几个自动的解决方案解密AppStore二进制文件,如Clutch、dumpdecrypted或dump-ios。然而,其中有些自动解决方案中很难处理实现二进制保护的应用程序,比如调试器检测和/或连接检测。这就是为什么有时需要手动解密二进制文件。可以在以下链接中找到关于解密AppStore二进制文件的优秀指南。

解密Simple Notepad的第一步是设置debugserver,以便在应用程序启动时对其进行拦截并附加到应用程序。下面的代码片段演示了设置debugserver来附加到Simple Notepad应用程序:

amarekano-ipod:~/amarekano root# ./debugserver *:6666 -waitfor "Plain Notes" 
[email protected](#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.1
 for arm64.
Waiting to attach to process Plain Notes...
Listening to port 6666 for a connection from *...

设置好debugserver并拦截了Simple Notepad的启动之后,使用lldb连接到debugserver实例。要在内存中定位解密图像,需要知道图像的大小和图像偏移量。可以通过使用otool检查应用程序二进制文件的load命令来收集偏移量:

Amars-Mac:Plain Notes.app amarekano$ otool -l Plain\ Notes | grep -A4 LC_ENCRYPTION_INFO_64
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 16384
    cryptsize 1146880
      cryptid 1

由于系统范围的ASLR在iOS中被强制执行,所以需要在内存中定位图像的基本地址,然后计算该地址的偏移量。可以在lldb连接到debugserver并被附加到程序之后完成该操作:

(lldb) image list "Plain Notes"
[  0] BA5E5051-D100-3B60-B5C8-181CAC0BB3EE 0x000000010004c000 /var/containers/Bundle/Application/2FD88AFF-6841-44D2-878D-8BA1698F3343/Plain Notes.app/Plain Notes (0x000000010004c000)

值0x000000010004c000是内存中二进制图像的基本地址。现在可以使用该值转储解密后的图像。转储二进制文件的lldb命令如下所示:

(lldb) memory read --force --outfile ./decrypted.bin --binary --count 1146880 0x000000010004c000+16384
1146880 bytes written to './decrypted.bin',

count参数是cryptsize值,解密部分的偏移量是base address + cryptoffset。一旦转储了解密的内存区域,然后需要将它拼接到原始的AppStore二进制文件中。使用iTunes下载的iOS应用程序通常包含多个arch FAT二进制文件。为了正确地修补二进制文件,首先需要使用otool定位arm64体系结构的偏移量:

Amars-Mac:Plain Notes.app amarekano$ otool -fh Plain\ Notes | grep -A5 architecture\ 1 
architecture 1
    cputype 16777228
    cpusubtype 0
    capabilities 0x0
    offset 1441792
    size 1517824

使用加密信息中加密部分的偏移量并且FAT二进制文件中arm64 arch的偏移量,使用dd将解密图像拼接到原始二进制文件中。下面显示的查找值是FAT二进制文件中两个偏移值i.e cryptoff +偏移的和:

Amars-Mac:Plain Notes.app amarekano$ dd seek=1458176 bs=1 conv=notrunc if=./decrypted.bin of=Plain\ Notes 
1146880+0 records in
1146880+0 records out
1146880 bytes transferred in 4.978344 secs (230374 bytes/sec)

一旦完成了补丁,将cryptid值设置为0,这一操作可以通过将修补的二进制文件加载到MachO-View中实现,选择正确的架构和Load命令,并更新如下截图所示的值:

更新后,保存对二进制图像所做的更改,并将打过补丁的二进制文件复制到未打包的应用程序IPA中。

1.2 给应用程序打补丁

在Payload/Plain Notes.app/ 目录中,将FridaGadget.dylib和FridaGadget.config复制到解压缩的IPA。使用解密应用程序二进制文件和FridaGadget的解压缩包应该如下:

Payload/
    Plain Notes/
        Plain Notes
        FridaGadget.dylib
        FridaGadget.config

FridaGadget.config文件的内容如下:

Amars-Mac:Plain Notes.app amarekano$ cat FridaGadget.config 
{
  "interaction": {
    "type": "listen",
    "address": "0.0.0.0",
    "port": 8080,
    "on_load": "wait"
  }

地址和端口的值可以配置为目标设备上可访问的任何接口和端口。当通过重新打包的应用程序生成时,Frida服务器将监听这个接口和端口。

使用optool向应用程序二进制文件添加一个load命令。这个load命令指示应用程序二进制文件将FridaGadget.dylib加载到应用程序的进程空间。

Amars-Mac:sandbox amarekano$ optool install -c load -p "@executable_path/FridaGadget.dylib" -t Payload/Plain\ Notes.app/Plain\ Notes 
Found FAT Header
Found thin header...
Found thin header...
Inserting a LC_LOAD_DYLIB command for architecture: arm
Successfully inserted a LC_LOAD_DYLIB command for arm
Inserting a LC_LOAD_DYLIB command for architecture: arm64
Successfully inserted a LC_LOAD_DYLIB command for arm64
Writing executable to Payload/Plain Notes.app/Plain Notes...

1.3生成Provisioning Profile

修补了应用程序二进制文件以加载自定义的dylib,即FridaGadget。开始将要侧面载入到未越狱目标设备上的应用程序二进制文件的签名过程。该过程的第一步是为目标设备生成provisioning profile。是通过创建一个空的Xcode项目来实现的,该项目针对的是未越狱设备。

在构建这个项目之前,通常需要向Xcode添加一个AppleID,然后Xcode将为应用程序生成和管理签名证书。AppleID可能与一个免费的开发者帐户有关,或者是苹果开发者计划的一部分。在Xcode上设置AppleID可以通过menu; Preferences > Accounts完成。

所使用的签名证书如下图所示:

注意:如果在构建空项目时,碰巧将其部署到设备上,那么请在将重新打包的应用程序侧面载入到设备上之前确保将其删除。

下一步是从这个空项目中提取provisioning profile并重用它来重新打包目标应用程序。此provisioning profile位于:

 ~/Library/Developer/Xcode/DerivedData/repackdemo-<a random string>/Build/Products/Debug-iphoneos/repackdemo.app/embedded.mobileprovision

将此文件复制到未打包应用程序的Payload/Plain Notes.app目录中,如下面的目录布局所示:

Payload/
    Plain Notes/
        Plain Notes
        FridaGadget.dylib
        FridaGadget.config
        embedded.mobileprovision

使用以下命令从生成的provisioning profile中提取权限:

Amars-Mac:repackdemo.app amarekano$ security cms -D -i embedded.mobileprovision > profile.plist
Amars-Mac:repackdemo.app amarekano$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' profile.plist > entitlements.plist
Amars-Mac:repackdemo.app amarekano$ cat entitlements.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>6M9TEGX89M.com.example.amarekano.repackdemo</string>
    <key>com.apple.developer.team-identifier</key>
    <string>6M9TEGX89M</string>
    <key>get-task-allow</key>
    <true/>
    <key>keychain-access-groups</key>
    <array>
        <string>6M9TEGX89M.*</string>
    </array>
</dict>
</plist>

entitlements.plist文件包含应用程序二进制文件所需的权限,用于在未越狱的iOS环境中工作。这些entitlements.plist将在稍后的重新签名过程中使用,以签署应用程序二进制文件。

1.4更新应用程序元数据

下一步是将Simple Notepad app的Bundle标识符更新为上一节中生成的Provisioning Profile的Bundle标识符。在本例中,Provisioning Profile的bundle标识符是“com.example.amarekano.repackdemo”。使用以下命令更新未打包应用程序Payload/Plain Notes.app目录中的Info.plist文件:

Amars-Mac:sandbox amarekano$ /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.amarekano.repackdemo" Payload/Plain\ Notes.app/Info.plist

1.5MachO二进制文件重签名

要在MacOS系统上生成有效的代码签名标识列表,请运行以下命令:

Amars-Mac:~ amarekano$ security find-identity -p codesigning -v
  1) 49808436B649808449808436B6651498084336B6 "iPhone Developer: m******"
  2) F4F6830FB32AAF4F6830E2C5F4F68309F4FF6830 "Mac Developer: m*******"
  3) 41A1537676F3F41A153767FCC41A153767CC3767 "iPhone Developer: A******"
  4) 1E309C6B45C0E309C69E10E309C670E309C69C60 "iPhone Developer: a*********"
     4 valid identities found

使用用来生成Provisioning Profile的签名标识来对各种MachO二进制文件进行重签名。首先签名FridaGadget.dylib:

Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m***************" Payload/Plain\ Notes.app/FridaGadget.dylib 
Payload/Plain Notes.app/FridaGadget.dylib: replacing existing signature

在对dylib签名之后,使用第1.4节中生成的权限对应用程序二进制文件进行签名。

Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m*****************" --entitlements entitlements.plist  Payload/Plain\ Notes.app/Plain\ Notes 
Payload/Plain Notes.app/Plain Notes: replacing existing signature

1.6归档和安装

一旦二进制文件被重签名,使用zip实用程序将Payload目录重新打包到IPA

Amars-Mac:sandbox amarekano$ zip -qr Simple_Notes_resigned.ipa Payload/

然后用ideviceinstaller将重新打包的IPA安装到目标设备上,它是idevice实用工具套件的一部分:

Amars-Mac:sandbox amarekano$ ideviceinstaller -i Simple_Notes_resigned.ipa 
WARNING: could not locate iTunesMetadata.plist in archive!
Copying 'Simple_Notes_resigned.ipa' to device... DONE.
Installing 'com.example.amarekano.repackdemo'
Install: CreatingStagingDirectory (5%)
Install: ExtractingPackage (15%)
Install: InspectingPackage (20%)
Install: TakingInstallLock (20%)
Install: PreflightingApplication (30%)
Install: InstallingEmbeddedProfile (30%)
Install: VerifyingApplication (40%)
Install: CreatingContainer (50%)
Install: InstallingApplication (60%)
Install: PostflightingApplication (70%)
Install: SandboxingApplication (80%)
Install: GeneratingApplicationMap (90%)
Complete

1.7运行重新打包的应用程序

需要安装目标设备上iOS版本的DeveloperDiskImage,以便使用debugserver启动应用程序。不同iOS版本的Developer Disk图像位于MacOS的以下目录下:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

感兴趣的两个文件是Disk图像本身及其相应的签名。

· DeveloperDiskImage.dmg

· DeveloperDiskImage.dmg.signature

使用ideviceimagemounter将磁盘图像安装到目标设备上,如下所示:

Amars-Mac:sandbox amarekano$ ideviceimagemounter DeveloperDiskImage.dmg DeveloperDiskImage.dmg.signature 
Uploading DeveloperDiskImage.dmg
done.
Mounting...
Done.
Status: Complete

成功安装后,使用idevicedebug以调试模式启动应用程序:

Amars-Mac:sandbox amarekano$ idevicedebug -d run com.example.amarekano.repackdemo

应用程序需要在调试模式下运行的原因是,主要应用程序线程在启动时被暂停,使Frida服务器有时间对预先配置的端口进行启动和侦听。

在调试模式下运行后,连接Frida服务器并使用以下命令恢复应用程序线程:

Amars-Mac:sandbox amarekano$ frida -H 192.168.1.196:8080 -n Gadget
     ____
    / _  |   Frida 10.7.7 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at http://www.frida.re/docs/home/
[Remote::Gadget]-> %resume
[Remote::Gadget]-> String(ObjC.classes.NSBundle.mainBundle().objectForInfoDictionaryKey_('CFBundleName'))
"Plain Notes"
[Remote::Gadget]-> String(ObjC.classes.NSBundle.mainBundle().objectForInfoDictionaryKey_('CFBundleIdentifier'))
"com.example.amarekano.repackdemo"
[Remote::Gadget]->

这里,目标iOS设备的IP地址为192.168.1.196,Frida服务器正在监听端口8080。一旦连接到Frida服务器,就可以开始使用Frida检测应用程序。

2.使用框架的应用程序重打包

2.png

当重新打包使用框架的应用程序时,请记住,它需要解密和修补应用程序IPA中也包含的框架二进制文件。为了证明这一点,使用Adobe Acrobat的iOS应用程序作为示例。

解压Acrobat IPA,得到了以下MachO二进制文件的分布:

Payload/
    Adobe Acrobat.app/
        Frameworks/
            AdobeCreativeSDKCore.framework/
                AdobeCreativeSDKCore
            AdobeCreativeSDKUtility.framework/
                AdobeCreativeSDKUtility
            AdobeCreativeSDKGoogleLogin.framework/
                AdobeCreativeSDKGoogleLogin
        Adobe Acrobat

应用程序使用的框架位于上述Frameworks/目录下。有些应用程序还会捆绑dylibs,它也位于Frameworks/目录下。这个特定的Adobe Acrobat应用程序版本不包含任何dylibs。

2.1解密MachO二进制文件

对包含框架的应用程序进行解密,需要对主应用程序二进制文件以及各个框架进行解密,然后才能对它们进行重新打包。可以通过附加调试器并从内存中转储解密图像来手动实现这一点。或者,可以使用诸如Clutch2之类的自动化解决方案来生成解密的二进制文件。下面的代码片段显示了应用程序二进制文件的加密信息,并演示了使用lldb从内存中转储解密的应用程序二进制文件:

Amars-Mac:Adobe Acrobat.app amarekano$ otool -l Adobe\ Acrobat | grep -A4 LC_ENCRYPTION_INFO_64
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 16384
    cryptsize 16465920
      cryptid 1
....
(lldb) image list "Adobe Acrobat"
[  0] 397432D5-9186-37B8-9BA6-181F633D9C1F 0x000000010009c000 /var/containers/Bundle/Application/15E6A273-A549-4317-99D3-34B8A6623B5E/Adobe Acrobat.app/Adobe Acrobat (0x000000010009c000)
(lldb) memory read --force --outfile ./decbins/acrobat.bin --binary --count 16465920 0x000000010009c000+16384
16465920 bytes written to './decbins/acrobat.bin'

类似的,必须对与Adobe Acrobat应用程序绑定的三个框架中的每个框架进行解密。下面的代码片段显示了AdobeCreativeSDKCore框架二进制文件的加密信息,并演示了使用lldb从内存中转储解密框架二进制文件。

Amars-Mac:AdobeCreativeSDKCore.framework amarekano$ otool -l AdobeCreativeSDKCore | grep -A4 LC_ENCRYPTION_INFO_64
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 16384
    cryptsize 770048
      cryptid 1
....
(lldb) image list AdobeCreativeSDKCore
[  0] 3FA3C800-9B6A-3117-A193-36C775B81A43 0x00000001015ac000 /private/var/containers/Bundle/Application/15E6A273-A549-4317-99D3-34B8A6623B5E/Adobe Acrobat.app/Frameworks/AdobeCreativeSDKCore.framework/AdobeCreativeSDKCore (0x00000001015ac000)
(lldb) memory read --force --outfile ./decbins/AdobeCreativeSDKCore.bin --binary --count 770048 0x00000001015ac000+16384
770048 bytes written to './decbins/AdobeCreativeSDKCore.bin'

应用程序二进制文件和框架二进制文件被解密之后,将解密的二进制文件拼接到原始二进制文件中,然后使用MachO View将每个二进制文件的cryptid标志设置为0。

2.2给应用程序打补丁

要对应用程序进行打补丁,复制FridaGadget.dylib和FridaGadget.config配置文件到未打包应用程序包的Payload/Adobe Acrobat.app/目录下。复制后,使用optool将load命令添加到应用程序二进制文件中,如下所示:

Amars-Mac:sandbox amarekano$ optool install -c load -p "@executable_path/FridaGadget.dylib" -t Payload/Adobe\ Acrobat.app/Adobe\ Acrobat 
Found FAT Header
Found thin header...
Found thin header...
Inserting a LC_LOAD_DYLIB command for architecture: arm
Successfully inserted a LC_LOAD_DYLIB command for arm
Inserting a LC_LOAD_DYLIB command for architecture: arm64
Successfully inserted a LC_LOAD_DYLIB command for arm64
Writing executable to Payload/Adobe Acrobat.app/Adobe Acrobat...

2.3更新应用程序元数据

更新应用程序的Info.plist中的bundle标识符,来匹配生成的provisioning profile。生成配置文件已经在第1.3节中讨论过。

Amars-Mac:sandbox amarekano$ /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.amarekano.repackdemo" Payload/Adobe\ Acrobat.app/Info.plist

将目标设备的provisioning profile复制到Payload/Adobe Acrobat.app/目录下的未打包应用程序包中。

2.4MachO二进制文件重签名

首先,通过删除提取的“Adobe Acrobat.app”中的以及各个框架目录下的_CodeSignature目录,来删除现有的代码签名。文件夹布局如下:

Payload/
    Adobe Acrobat.app/
        _CodeSignature
        Frameworks/
            AdobeCreativeSDKCore.framework/
                _CodeSignature
            AdobeCreativeSDKUtility.framework/
                _CodeSignature
            AdobeCreativeSDKGoogleLogin.framework/
                _CodeSignature

一旦它们被删除,就可以对二进制文件进行签名。要做到这一点,首先对FridaGadget.dylib进行签名:

Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m***************" Payload/Adobe\ Acrobat.app/FridaGadget.dylib 
Payload/Adobe Acrobat.app/FridaGadget.dylib: replacing existing signature

然后是框架二进制文件:

Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m***************" Payload/Adobe\ Acrobat.app/Frameworks/AdobeCreativeSDKCore.framework/AdobeCreativeSDKCore
Payload/Adobe Acrobat.app/Frameworks/AdobeCreativeSDKCore.framework/AdobeCreativeSDKCore: replacing existing signature
Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m***************" Payload/Adobe\ Acrobat.app/Frameworks/AdobeCreativeSDKGoogleLogin.framework/AdobeCreativeSDKGoogleLogin
Payload/Adobe Acrobat.app/Frameworks/AdobeCreativeSDKGoogleLogin.framework/AdobeCreativeSDKGoogleLogin: replacing existing signature
Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m***************" Payload/Adobe\ Acrobat.app/Frameworks/AdobeCreativeSDKUtility.framework/AdobeCreativeSDKUtility 
Payload/Adobe Acrobat.app/Frameworks/AdobeCreativeSDKUtility.framework/AdobeCreativeSDKUtility: replacing existing signature

最后,用权限权利对程序的二进制文件签名。

Amars-Mac:sandbox amarekano$ codesign --force --sign "iPhone Developer: m***************" --entitlements entitlements.plist Payload/Adobe\ Acrobat.app/Adobe\ Acrobat
Adobe Acrobat: replacing existing signature

在1.3节中讨论了如何从provisioning profile生成权限。

2.5归档和安装

所有MachO二进制文件都重签名之后,只需将其存档到IPA中,然后将其侧面载入目标设备:

Amars-Mac:sandbox amarekano$ zip -qr Adobe_resigned.ipa Payload/

使用ideviceinstaller将应用程序安装到目标设备上,如下所示:

Amars-Mac:sandbox amarekano$ ideviceinstaller -i Adobe_resigned.ipa 
WARNING: could not locate iTunesMetadata.plist in archive!
Copying 'Adobe_resigned.ipa' to device... DONE.
Installing 'com.example.amarekano.repackdemo'
Install: CreatingStagingDirectory (5%)
...<truncated for brevity>...
Install: GeneratingApplicationMap (90%)
Install: Complete

2.6运行重新打包的应用程序

使用idevicedebug在调试模式下启动应用程序。

Amars-Mac:sandbox amarekano$ idevicedebug -d run com.example.amarekano.repackdemo

应用程序在调试模式下运行后,就可以连接到正在运行的Frida服务器

Amars-Mac:sandbox amarekano$ frida -H 192.168.1.116:8080 -n Gadget
     ____
    / _  |   Frida 10.7.7 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at http://www.frida.re/docs/home/
[Remote::Gadget]-> %resume
[Remote::Gadget]-> String(ObjC.classes.NSBundle.mainBundle().objectForInfoDictionaryKey_('CFBundleName'))
"Adobe Acrobat"
[Remote::Gadget]-> String(ObjC.classes.NSBundle.mainBundle().objectForInfoDictionaryKey_('CFBundleIdentifier'))
"com.example.amarekano.repackdemo"
[Remote::Gadget]->

未完待续…

源链接

Hacking more

...