`
java-mans
  • 浏览: 11414901 次
文章分类
社区版块
存档分类
最新评论

rtb : Cocoa/iPhone App/Library 嵌入资源文件

 
阅读更多

转载自:http://www.0x123.com/x/371.html

At a glance

软件开发中,可能需要把用到的资源文件嵌入到二进制执行文件中,例如生成单个执行文件、防止机密或版权信息被PE工具查看或修改、嵌入图片资源到静态库中等等。在Mac OSX Cocoa 或iOS开发中,编译生成的Product.app是一个APP包,其实就是个文件夹,右键Show Package Contents或者去掉 .app 扩展后双击打开就可以查看包内容,修改包里面的任何资源文件都不会影响程序正常运行,要提交到App Store的程序在修改资源文件后运行下codesign(安装Xcode时已经装了这个dev tool)重签名就可以了:

$ codesign -fvs "Your Identity"path/to/appfile.app

我之前写的ElfCodeSigner就是基于codesign的。

所以嵌入二进制资源文件也算是一种有效的保护手段。

结合我以前Windows开发中用到的措施,我想到了三种方案:

  • Base64编码。
    N久前在CSDN上给一个网友提供的方法,当时他的需求是对一些中英文字符串数据的编解码。我当时给出的Base64方案算是比较简便而且行之有效的。Base64方法同样适用于今天要讨论的嵌入资源问题。
    NSString 和 NSData可以互转,UIImage也提供了initWithData:的创建方法,所以将image data 进行base64编码后保存在一个NSString常量中,在用到时进行base64解码再[UIImage initWithData:]。
    此方法在处理很小的数据时比较有用,网上也有比较成熟的NSData+Base64类别类供使用。
  • PNG等资源的压缩加密
    经过加密处理的PNG图像用普通看图软件查看时只能看到一片透明或空白图带点斑点这样的无效图,但在程序运行时图像显示正常,这个加密方法在j2me、iOS等游戏和应用开发被大量使用。网上现成的加密工具很多,但可以被简单的逆向还原原图。
  • 转换成bytes数组。
    大多数资源嵌入都采用这种方案,原理很简单,把资源文件的每位字符转换成十六进制bytes[],几乎所有语言都提供了bytes[]到data的直接转换。
    大多数十六进制编辑器可以将hex结果保存为文件。被解密或修改比较困难,需要知道图形基本格式、熟练UE等十六进制编辑器、猜测、运气等。

最近公司项目中需要把一些图片资源嵌入到静态库中,我考虑了下还是用bytes的方法比较好,Cocoa原生支持其不会留下被修改的余地。一些简单的图标用CG画上去。这样公开出去的库只有一个.a文件和几个必要的.h文件。

下午闲着没事,就操起Xcode在新配的MacBook上写下了我这第一个跑在Mac OS上的C程序。

Release notes

rtb(Resource To Bytes)是一个命令行小工具,将二进制资源文件转换为bytes数组,方便在程序中使用嵌入资源。

由于时间仓促,rtb仅在Mac OS SL上测试过,对应应用在Mac OS桌面程序和iOS App中测试过,以后有时间再改成跨平台的。目前没发现什么bug。

使用方法:打开Terminal,cd到rtb所在目录,运行

$./rtb image.png

将生成

unsigned char image_png[] = { ….. };
unsigned int image_png_len = 16045;

2011071801115495

变量名称根据资源文件名而来,数字开头的会加前缀 “__” ,文件名中非英文和数字的字符转换为下划线”_”(使用了isalnum()测试函数),在数组变量名称添加”_len”后缀作为数组长度变量名称。

例如”123te的 st5.png”将生成变量名unsigned char __123te____st5_png[] 和 unsigned int __123te____st5_png_len 。

Example

首先执行rtb生成.h文件:

$./rtb test.png > test.png.h

新建一个Window Base的iPhone项目,添加test.png.h文件到项目中,在
- (BOOL)application: didFinishLaunchingWithOptions:
方法中创建一个UIImage并把它添加到一个ImageView中:

1 #import"test.png.h"

2

3 //............

4 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

5 {

6 [self.window makeKeyAndVisible];

7

8 unsignedchar*imgBytes = test_png;

9 NSUInteger imgLenght = test_png_len;

10 NSData *imgData = [NSData dataWithBytesNoCopy:imgBytes length:imgLenght freeWhenDone:NO];

11 // UIImage *image = [UIImage imageWithData:imgData];

12 // or

13 UIImage *image = [[UIImage alloc] initWithData:imgData];

14

15 UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

16 imageView.frame = self.window.frame;

17 imageView.contentMode = UIViewContentModeCenter;

18 [self.window addSubview:imageView];

19 [imageView release];

20

21 [image release];

22 return YES;

23 }

因为在程序加载时已经将test.png.h中的数组加载到内存中,所以使用NSData的dataWithBytesNoCopy方法即可,不需要再Copy一份,转换成NSData后也不需要释放它,所以freeWhenDonw参数值NO.

Code Review

我C语言很烂,就不贴代码了。注释、空行加起来80多行,核心功能代码就是fopen这个资源文件:

if ((fp = fopen(argv[1], “r”)) != NULL)

从文件头取到(getc(fp))到EOF,fprintf(stdout,”0x%02x”,ch):

for (p = 0; (length < 0 || p < length) && (ch = getc(fp)) != EOF; p++)
{
char *c = p ? “,n ” : “ “;
fprintf(fpo, “%s0x%02x”, (p % COLS) ? “, ” : c, ch);
}

Download

已收录至Cocoa-Utilities:https://github.com/Sundae/Cocoa-Utilities


分享到:
评论

相关推荐

    一个简单的网页 Websocket 连接并实现心跳 Heartbeat

    创建 Socket 连接很简单,一行代码即可。 ... 如果服务器采用 SSL,只需要将 ws:// 替换成 wss:// let ws = new WebSocket('wss://echo.websocket.org/'); 然后是通过回调函数获取服务器消息以及对连接状态进行捕捉。...

    url数据的红与黑

    root@bt:/pentest/backdoors/web/weevely# ./main.py -t -u http://hack-test.com/Hackademic_RTB1/wp-content/plugins/hax.php -p koko Weevely 0.3 - Generate and manage stealth PHP backdoors. Copyright (c) ...

    中国鲜花专递网模型

    采用软件Microsoft Visual Studio 2005和SQLSERVER2000 ,本网站是模仿中国鲜花专递网制作,采用语言C#。购物车采用最先进的profile技术。采用三层构架。仅供学习,请不要用于任何商业用途

    nginx安装步骤教程

    nginx 在阿里云centeros7安装步骤,一步一步亲手操作,遇到的问题文档也有给出解答说明

    openrtb-macrosub:OpenRTB宏替换的NodeJS实现

    #OpenRTB宏替代者# ##用法## var sub = require ( './openrtb-macrosub' ) ;sub ( 'http://some/crazy/win/URL/{$AUCTION_ID}/{$AUCTION_PRICE}' , { id : 'some-id' , price : 500 } ) ;// This will output '...

    optimal-rtb:支持 KDD'14 论文“Optimal Real-Time Bidding for Display Advertising”中的实验的基准测试框架

    展示广告的最佳实时出价 支持实时出价优化实验的基准测试框架。 此类问题的描述和基准测试在。 在当前版本中,我们实现了上述参考文献中描述的逻辑回归 CTR 估计器和标准...然后在optimal-rtb/scripts/您可以简单地

    openrtb:Go的OpenRTB协议定义

    安装要安装,请使用go get : go get github.com/bsm/openrtb/v3用法package mainimport ( "log" "github.com/bsm/openrtb/v3")func main () { file , err := os . Open ( "stored.json" ) if err != nil { log . ...

    campaign-manager:RTB4Free 的活动管理 UI,开源投标方 DSP

    活动管理器 - RTB4FREE 活动管理用户界面 活动管理用户界面 这个 repo 的镜像可以直接从 获得帮助 用户文档可以在找到 源代码 要开始使用代码,首先确保您的计算机上安装了以下内容: 接下来,从这个 Github 存储库...

    rtb4free:RTB4FREE核心存储库,当前包含文档,API Explorer和该项目中其他存储库的指针的源代码-dsp source code

    RTB4免费 RTB4FREE是用于基于RTB的数字广告的企业实力竞标平台。 RTB4FREE具有以下功能: 战役管理 数据管理(DMP)功能 使用多种策略进行竞标 分析历史媒体和价格信息 Github上的组织包含用于运行完全可扩展系统的...

    rtb-akka:基于Akka的RTB仿真系统(Java)

    使用Akka的RTB简单项目快速开始只需执行mvn jetty:run 并转到http://localhost:9090/place-bid/simple-ad 您将看到广告请求的出价结果。 您可以通过提供-Dbidders参数来更改模拟投标人的-Dbidders ,默认情况下有5个...

    matlab Robotics 9.9 工具箱 最新版

    1. 下载:可以根据自己matlab版本下载对应的版本,连接http://www.petercorke.com/RTB/ 2. 安装: •To install the Toolbox simply unpack the archive which will create the directory (folder) rvctools, and ...

    OpenRTB:OpenRTB 的 PHP 抽象

    开放式实时出价 OpenRTB 的 PHP 抽象 请注意 OpenRTB 软件包目前正在开发中。 该实现基于 OpenRTB 2.2 规范 ( )。 将很快提供实施的详细说明。

    rtb:实时竞价算法实现

    rtb Jim Caine - 2014 年 11 月 - 德保罗大学 - 计算广告2014 年 11 月编写的项目。利用爱品优发布的历史实时出价数据探索实时出价算法。 机器学习算法(逻辑回归、决策树分类、LDA、朴素贝叶斯)用于预测任何给定...

    rtb:C程序员的工具箱

    实时广播 C的程序员工具箱 目录 doc :文档 inc :包含目录 test :单元测试 执照 版权(C)2020-2021 Robert Coffey 根据MIT许可证发布。 您应该已经与该库一起收到了许可证的副本。 如果没有,请参阅

    openrtb:Open RTB是一种用于在数字媒体上进行实时出价的协议

    OpenRTB 3.0 关于OpenRTB 关于OpenMedia AdCOM:广告通用对象模型 关于此存储库 在任何时候,此存储库的master分支都包含OpenRTB的最新版本。 有关最新规范,请参见master分支中的 。 存在先前版本的分支。 ...

    scala-openrtb:@Powerspace使用的Scala OpenRTB工具

    Scala OpenRTB是一个完整的Scala库,它以功能的方式为基于的实体提供protobuf绑定以及JSON序列化。 该库还为出价模型提供了SerDes,旨在在不久的将来支持其他DSP。 伪像 上Scala openrtb工件。 建造 像其他任何SBT...

    openrtb:通过protobuf的Java和其他语言的OpenRTB模型; Java的Helper OpenRTB库,包括JSON序列化

    Google OpenRTB库 该库支持OpenRTB规范,提供了所有支持protobuf的语言的绑定,以及对Java的其他支持,例如JSON序列化和验证。 请参阅我们的入门! 将Github问题跟踪器用于错误,RFE或任何支持。 检查以获取详细的...

    rtb:Radx-rad工具箱-开源

    这个独立的工具箱包含samll实用程序,希望它们可以帮助您准备将数据提交到Radx-rad protal。

    小程序websocket心跳库(websocket-heartbeat-miniprogram)

    前言 在16年的时候因为项目接触到websocket,而后对心跳重连做了一次总结,写了篇博客,而后18年对之前github上的demo代码进行了再次开发和开源,最终封装成库。如下: ... 在2020年也就是今年初,同事建议说可以考虑...

    RTB:机器人技术工具箱-机器人技术简介-QUT

    即时出价v10.4 机器人工具箱v10.4 QUT机器人技术MOOC简介中的代码

Global site tag (gtag.js) - Google Analytics