在macOS上交叉编译arm64的程序并在IOS上运行

0x01 两种编译方式如下:

简单编写一个demo.c

#include <stdio.h>
int main()
{
printf("i am include");
return 0;
}

第一种使用-isysroot指定头文件

// -arch 表示要编译的架构 这里为armv7.
// -isysroot 指定头文件的根路径
clang -arch arm64 -o demo demo.c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk

第二种使用xcrun -sdk

xcrun -sdk iphoneos clang -arch arm64 -o demo demo.c  //xcrun -sdk 会使用最新的sdk去编译
  • 使用file命令查看编译出来的文件是什么架构

    ✗ file demo
    demo: Mach-O 64-bit executable arm64

0x02 使用scp拷贝到iphone中

使用scp把编译出的demo拷贝在iphone的/tmp目录下(端口默认是22)

  • scp demo root@iphoneip : /tmp/demo

执行出现 kill -9的错误
在这里插入图片描述
后面发现是可执行的文件未签名的原因才会出现kill -9

0x03 给可执行文件签名

  1. codesign给它签名

codesign -s “A2F872A1D9483EA7E16E6836CDF73B7917010A20” --entitlements demo.entitlements -f demo

其中A2F872A1D9483EA7E16E6836CDF73B7917010A20 可以通过/usr/bin/security find-identity -v -p codesigning指令获取
在这里插入图片描述
demo.entitlements文件内容如下

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>proc_info-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
        <key>platform-application</key>
        <true/>
    </dict>
</plist>
  • 签名前后的对比:

codesign -dvvv demo
或者codesign --display --verbose=4 demo
在这里插入图片描述

拷贝文件到手机中执行前后对比如下:
在这里插入图片描述

0x04 命令行编译OC

xcrun -sdk iphoneos clang -framework Foundation -arch arm64 hello.m -o hello

#include <dlfcn.h>
#include <mach-o/dyld_images.h>
#include <objc/runtime.h>
#import <Foundation/Foundation.h>

@interface Talker : NSObject

- (void) say: (NSString*) phrase;

@end


@implementation Talker

- (void) say: (NSString*) phrase {
  NSLog(@"%@\n", phrase);
}

@end



int main(void) {
    
    Talker *talker = [[Talker alloc] init];
    [talker say: @"Hello, Ice and Fire!"];
    [talker say: @"Hello, Ice and Fire!"];
    [talker release];

}

也需要签名

参考:
http://ourui.github.io/2014/09/12/2014-09-12-clang-compile-arm-file/
http://iosre.com/t/ios11-iphone-tool-killed-9-killed/12819
用命令行编译iPhone app
https://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art024
用clang编译C语言及OC小记
https://www.mobilezhao.com/?p=507

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值