2018-12-30

代码注入

一般修改原始的程序,可以利用代码注入的方式。
注入代码可以选择利用FrameWork或者Dylib等三方库的方式注入。

一、FrameWork注入

  • 通过Xcode新建Framwork,将库安装进入APP包
  • 通过yololib注入Framwork库路径。命令:$yololib(空格)MachO文件路径(空格)库路径
    • 所有的Framwork加载都是由DYLD加载进入内存被执行的
    • 注入成功的库路径会写入到MachO文件的LC_LOAD_DYLIB字段中

1.重签名工程

新建或者打开需要注入代码的工程,修改对应版本,对工程进行重签名(此处可利用脚本进行自动重签名:在TARGETS-Build Phases中添加RUN Script,shell 中第一行里面输入工程中的脚本路径,然后直接Command+B进行编译,若编译失败,可Command+k清除下缓存,重启电脑打开工程重新编译)

重签名

此处,我事先把appSign.sh重签名脚本放在了工程根目录,${SRCROOT}/appSign.sh指令就是去运行根目录下的appSign.sh脚本文件。
编译成功后,当前工程中就多了一个Temp路径,里面有我们的app包;

此时,我们可以显示包内容,利用MachOView来查看可执行文件,重点关注load Command里的LC_LOAD_DYLIB字段,(这个字段决定了MarchO文件需要加载的一些三方库。程序启动时,dyld会去加载可执行文件,而应用中又依赖了这些三方库,三方库有的是在APP包里面,有的则是在系统里面,通过读取LC_LOAD_DYLIB字段,根据路径来加载这些第三方库,我们要做的FrameWork动态库注入,其实就是注入在此字段中,供程序加载)

2.注入自己的三方库

首先,新建FrameWork,然后在所建的FrameWork中插入代码,(为了测试,此处我自己新建了一个类,然后在load方法中NSLog一下)

新建framework


然后Command+B编译一下,app show-in-finder此时可以看到已经生成了对应framework,当然我们需要的是包里面含有此Framework,选择FrameWork注入这个包,显示包内容然后查看里面Frameworks文件夹,你可以看到此时里面已经又了ziyihook.framework(这是我自己所建的库名,实际名称以你自己所建为准)
对应framework


Framework中我们不需要添加所谓的依赖,只要在当前工程中创建了,它就会默认帮我们添加依赖了(当然,若是你的Xcode版本比较低的话,就需要手动添加一个依赖了,Copy Files里面)
注意:此时编译时已经将所建Framework打包进.app文件夹内,但是Command+R运行,并不会加载我们所创建的Framework,原因是因为对应MACH-O可执行文件中LC_LOAD_DYLIB字段并没有增加,即该字段中并没有我们所建Framework的路径。此时我们就需要去修改MACH-O,将framework路径加进去。
现在记录Frameworks文件夹中我们所建的库可执行文件,将它注入包中,记住这里的包不是当前工程的.APP包,我们编译运行重签名脚本时,当前工程的.app包就会被替换,运行的其实还是原来第三方ipa里面的可执行文件,所以我们需要修改的是原始的ipa包
此时我们可以通过yololib工具来进行修改MACH-O文件。(对原始.ipa包进行解压,显示包内容,进入iterm2,输入对应指令,我用的是越狱的微信ipa所以显示WeChat包名,后面是我们之前记录的所建库路径,直接回车即可修改成功。)
指令

然后检查一下MACH-O文件LC_LOAD_DYLIB中是否有增加,有增加即表示修改成功。
添加成功

OK,可以看到已经有了增加,有了相应路径就可以加载成功。修改成功后,只需在原始应用路径下打包Payload,将新生成的.ipa(包含了我们添加的framework)替换原来.ipa的即可


打包Payload


只保留新生成的ipa

Commad+K先清除下缓存,然后直接Command+R运行,可以看到已经打印,哈哈 开心。


成功注入

二、dylib注入

dylib库不属于ios的库,是macOS的库,其实很多插件就是采用这种方式注入的。

  • 通过Xcode新建Dylib库(注意:Dylib属于MacOS所以需要修改一些属性)
  • 添加Target依赖,让Xcode将自定义Dylib文件打包进入APP包。
  • 利用yololib进行注入。

1.重签名工程

同样的新建或者打开需要注入代码的工程,修改对应版本,对工程进行重签名。

2.添加dylib

点击“+”,选择macOS里的library。如图:


添加dylib

新建dylib

它和framework有很多不一样的地方需要注意:

  1. 新建的dylib属于macOS,而非iOS,所以选择target在iOS设备上无法编译,此时需要修改【Build Settings】下的【Base SDK】更改为iOS



    修改Base SDK

    2.要想把dylib跑到手机上,此时还需要修改签名,签名默认选择的是mac developer所以也要修改为ios developer


    修改code Sign

    3.此时编译,并不会生成dylib文件。还需要手动添加依赖,打包进framework中。

    添加依赖

    添加了依赖后,dylib文件就会被copy进我们的framework中去,然后被执行。
    此时Command+ B编译,framework文件夹就会有新建的dylib文件


3.修改March-O

同样的,注意点同上面framework注入。我们需要使用yololib工具来修改March-O文件,(增加LC_LOAD_DYLIB字段)。此时可以也采用脚本方式而不用终端。(终端中的命令都可以以脚本形式实现)
方法是在脚本文件中添加命令:
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libziyiHook.dylib"
左边是我们march-O路径,右边是插入的dylib路径

添加命令

同样的为了看到修改效果,我们在hook中写一句NSLog,看运行后是否打印。


添加NSLog

Command+R运行看答应结果,OK成功打印。搞定!


注入结果

最后可以去查看下相应March-O文件中的LC_LOAD_DYLIB字段,发现确实又了我们添加的动态库文件。

你可能感兴趣的:(2018-12-30)