让别人的程序按自己的意愿运行

小白:小程,你知道有些iOS程序是没人性的吗?老是不按我的意愿来运行!

小程:我怎么知道你的意愿就是有人性的?

本文解决一个问题:修改别人的二进制程序并运行起来。

让别人的程序按你的意愿来运行,文明一点的做法就是拿到源码后加上自己的修改再生成新的程序并安装。

小白:哇,这句话好长,你能一口气说完吗?

但是,很多情况下我们是没有源码的,那怎么办呢?

一个办法是把程序的指令或者数据改掉;另一个办法是让程序执行到自已的代码上,再把流程或内存值给改掉。最终,让程序按自己的想法来运作。

小白:还能让程序执行到自己的代码?这不就是乾坤大挪移吗?

小程:这叫注入!

小白:那赶紧讲注入吧。

小程:不!我先讲硬改。

如何改掉程序的指令呢?

这里从iOS上的程序入手,举一个例子来说明。

这是一个会“过期”的程序,显示主页面的代码是这样的:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIAlertController* alertvc = nil;
    int expire = 1;
    if (expire) {
        alertvc = [UIAlertController alertControllerWithTitle:nil message:@"过期了!" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"算了" style:UIAlertActionStyleCancel handler:nil];
        [alertvc addAction:cancel];
    }
    else {
        alertvc = [UIAlertController alertControllerWithTitle:nil message:@"欢迎回来" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction* ok = [UIAlertAction actionWithTitle:@"太客气了" style:UIAlertActionStyleDefault handler:nil];
        [alertvc addAction:ok];
    }
    [self presentViewController:alertvc animated:YES completion:nil];
}

运行后会弹出一个框,可能是“欢迎回来”,也可能是“过期了”。

为了真实模拟,先把这个demo弄出一个ipa包,再来安装(而不是直接用xcode安装到手机),这个ipa包就是修改目标。

ipa是一个压缩包,里面包括了执行程序、配置文件、图片等资源。

如果是从itunes下载的app,则可以这样拿到ipa包:

这时,要对ipa做重签名才能通过第三方工具安装到越狱手机。

小白:小程,什么是重签名?

小程:简单来说,签名就是允许这个app以什么方式安装。上传到aapstore的app都是以发布证书来签名,允许通过itunes或appstore来安装,但不允许用第三方的工具比pp助手、itools之类的工具来安装。而这里的重签名,指的是用开发证书来签名,允许通过第三方工具来安装。

小白:咦?我为什么要通过第三方工具来安装?用appstore不是好好的吗?

小程:但是,如果想修改代码再运行,就只能通过第三方工具,难道你修改代码后还上传给aapstore吗?

小白:也对。那就是说,只有通过appstore下载的ipa才需要重签名了?如果原本就是第三方工具安装的ipa就不需要重签名了?

小程:是的。而且,很多第三方工具都提供自已的app库,这些app都是重签名了的。

小白:那重签名后,再次修改过的app,要不要重签名?

小程:实践证明,这时不需要再签名。



为了清除“修改了程序却不能安装”的障碍,这里介绍一下重签名的操作。

(一)重签名的准备

(1)mobileprovision文件

重签名需要用到描述文件即provision文件,并保证keychain里面有对应的证书。

可以创建证书与provision,再安装到keychain。或者让别人发一个p12文件与对应的provision,再双击安装。

(2)plist文件

重签名时要使用一个entitlements.plist 文件,可以直接找一个这样的文件来修改,保证get-task-allow字段为true即可。

也可以plistbuddy工具来生成一个plist:

/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i xxx.app/embedded.mobileprovision) > entitlements.plist   

/usr/libexec/PlistBuddy -c ‘Set :get-task-allow true‘ entitlements.plist  

xxx.app换成目标app,并且要cd到目标ipa的Payload目录再进行操作

(二)重签名

使用codesigh进行签名:

cp "xxx.mobileprovision" "Payload/xxx.app/embedded.mobileprovision"
--使用mobileprovision文件,覆盖app原有的(没有也照样拷贝过去)

/usr/bin/codesign -f -s "iPhone Developer: xxx (yyy)" --entitlements "Payload/entitlements.plist" "Payload/xxx.app"
--注意entitlements.plist要准备好

在codesign指定证书时,证书的名字(带括号、空格之类的),最好到keychain里面找到这个证书,然后右键在“简介”里面拷贝过去,避免“找不到”的提示。

把Payload压缩成ipa,注意不是Payload的上一级目录!



这个ipa安装到越狱手机后,跑起来是这样的:

小白:这么可恶!这个框太不友好了!

要去掉这个框,先要分析一下代码。

把ipa包解压,再进到xx.app内,找到执行文件,分析这个文件,这里用hopper来分析。

小白:hopper是什么东东?

小程:是分析二进制代码的倚天剑!

小白:有屠龙刀吗?

小程:有,ida是也!

小白:好可怕,亮剑吧!

启动hopper,小程的版本是这样的:

可以看到,弹框的代码是:

想要去掉弹框,可以选择不同的办法,比如把调用alertview的代码改成nop,比如把比较的值改掉不让它进过期的分支,比如把跳转指令“取反”地改一下......

小白:nop是什么?

小白:nooperation,空指令,什么都不做的,但占指令执行时间。

小白:我也想什么都nop!

这里演示把跳转指令改掉的办法。

先确定跳转的地方:

cbz,表示为0就跳转,而且是跳转到非过期的分支。也就是说,现在不是0,没有跳转。所以,修改的办法就是改为“不为0就跳转”。

把光标放在cbz命令行上,再切换至十六进制的表示页面:

可以看到cbz对应的十六进制是这样的(两个字节):

cbz即是:62 06 00 34

而cbnz(不是0就跳转)是:62 06 00 35

所以,修改为cbnz,就是这样:

保存为另一个执行文件:

把修改后的执行文件覆盖掉原文件,再把Payload目录打包,重命名为.ipa文件,再用第三方工具安装到手机(不需要重签名)。

最终,过期的提示消失了,看到了另一个提示:

小白:Oh Yeah!

总结一下,关键流程是,用hopper定位到目标代码的位置,并通过hopper修改保存。同时,应该注意ipa的重签名等常规的知识。“硬改”的办法,对汇编技能的要求较高,相对而言,如果只是想在iOS平台控制目标程序的运作,hook会是一个更有想象力的选择。



让别人的程序按自己的意愿运行

原文地址:http://blog.51cto.com/13136504/2061995

时间: 2024-12-18 16:09:46

让别人的程序按自己的意愿运行的相关文章

关注的就是别人的程序设计风格

对于我来说, 相当关注的就是别人的程序设计风格, 越是刚进入一个领域, 就越在乎和我使用的框架/工具箱的风格保持统一. 哪怕这个风格和我的习惯抵触的很厉害. 因为只有你象他那样做, 你才能做到真正的象他那样想. 当然, 针对"C#是否提供操作符重载"这类问题, 我们要关注的不仅仅是程序设计风格, 更多的是语言设计的理念这些问题. 平时在自己的领域之外, 多关心一下这些问题, 我们不需要实现自己的语言, 也可以逐步的练就熟悉环境的能力. 比如, 一个以类为依托的语言, 提供的特性肯定是一

3 weekend110的job提交的逻辑及YARN框架的技术机制 + MR程序的几种提交运行模式

途径1: 途径2: 途径3: 成功! 由此,可以好好比较下,途径1和途径2 和途径3 的区别. 现在,来玩玩weekend110的joba提交的逻辑之源码跟踪 原来如此,weekend110的job提交的逻辑源码,停在这了 hello world hello tom helllo jim jim is a bad boy hello jack hello baby baby is my nvshen hello world hello tom helllo jim jim is a bad bo

程序自启动及后台持续运行的研究(voip和GPS方式)

1,voip方式    1)首先要修改应用的plist配置,添加下面的设置:        Application does not run in background: NO        Required background modes: VOIP    注:添加这些配置之后,程序重启解锁就会自动运行application:                                  didFinishLaunchingWithOptions方法.    2)主要测试代码:- (BO

程序长时间后台保持运行

文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice

C# windows权限问题 程序如何以管理员身份运行程序

程序如何以管理员身份运行程序 最近在项目运行过程中遇到了一个问题,就是打开程序的过程中,软件会出现打开数据库是一个只读数据库,我们需要将客户端设置为以管理员身份运行才能解决这种问题.这样虽然可以解决问题但是却给用户和与用与沟通的人员带来了不便,使软件的简易性与易操作性大打折扣. 那么我们能否在开发的过程中使软件直接以管理员的身份进行运行呢,答案是肯定的.结合在网上查询的资料和我个人的理解下介绍一下. 第一步:打开VS2013右键点击项目->属性->安全性->勾选启用ClickOnce安全

Android应用程序框架层和系统运行库层日志系统源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少不了使用Log来监控和调试程序的执行.在上一篇文章Android日志系统驱动程序Logger源代码分析中,我们分析了驱动程序Logger的源代码,在前面的文章浅谈Android系统开发中Log的使用一文,我们也简单介绍在应用程序中使Log的方法,在这篇文章中,我们将详细介绍Android应用程序框架

该文件没有程序与之关联来运行该操作。请在控制面板的目录选项中创建关联 解决代码

打开控制面板-目录选项,或者打开随意一个目录,在菜单条--工具--目录选项 1.切换到文件类型选项卡,在以注冊的文件类型中找到要打开的文件类型 2.选中后点击以下的"高级"按扭 3.在弹出的对话框中的操作一栏里选择一个操作(相应该类文件右键菜单上的命令),然后点编辑 4.在弹出的对话框中点击"浏览"按扭,找到要打开该文件的程序 假设在第1步中找不到WMV,能够点击"新建"按扭 5.在弹出的对话框中输入要打开的文件类型,确定,到第1步 假设在第3步

iOS程序进入后台后仍运行定时器NSTimer

由于本应用需要在应用进入后台后还要进行定时的检测功能,因此对于我来说怎样让APP在进入后台后 保持运行状态是比较大的需求.然后在iOS系统中是很难实现的,不管是 通过 音频还是 定位系统,我查找了一些资料后都是只能申请到十分钟的运行态.没有所谓的长期运行的概念..... 然而在博客中突然看到这篇文章,尝试了下竟然可以运行很久.不管怎么样我还是先试试了......至于苹果是否能审核通过估计又是个难是 具体如下: 本文所讲为其中之一:iOS程序进入后台后十分钟之内就会被系统kill掉,怎么解决呢?我

【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”

原文网址:http://www.cnblogs.com/Dageking/archive/2013/05/15/3079394.html VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application” 升级vs2010到vs2012,突然发现build出来的应用程序无法运行,提示“不是有效的 win32 应用程序” or “not a valid win32 application”. 参考CSDN论坛