一种还原ios类型字符串的方法
技术领域
1.本发明属于ios app安全分析及ios app司法取证领域,涉及一种还原ios类型字符串的方法。
背景技术:2.现有技术中,对ios系统的app的安全分析及司法取证分析的方法较少,通常的方法是只提供方法块的伪代码结构,却没有提供ios程序中变量类型和方法类型的数据结构。因此,对ios系统的app的安全分析及司法取证分析较为困难。因此,现有技术中,在ios app安全分析及ios app司法取证领域中尚无一种解析ios类型字符串、构建伪代码并便于对ios系统的app的安全分析及司法取证分析的方法。
技术实现要素:3.针对现有技术的技术问题,本发明提供了一种还原ios类型字符串的方法:通过解析并整合ios系统的app中变量类型字符串、方法类型字符串及对应方法名称字符串,从而构建伪代码,便于对ios系统的app的安全分析及司法取证分析。本技术涉及的术语做如下解释:
4.变量类型及变量名称字符串:
5.app中用一个类型关键词定义一个变量,如:
6.int a,*c;
7.struct mystruct b,*d;
8.其中的int,struct mystruct为类型关键词,但最终的ios系统的app中不是这样存储的,而是被标识成如下符号来表示:
9.i”a”,^i,
10.{mystruct=},
11.^{mystruct=}
12.如果变量被定义成值类型(如上述定义a,b)的情况,那么变量名称就是原来定义的名称a,b;如果变量被定义成指针类型(如上述定义*c,*d)的情况,那么变量名称就不表示出来(如:^i,^{mystruct=})
13.方法类型以及方法名称:
14.app中的函数是一个完成某种功能的代码块;由一对花括号“{}”包含,如:
‑
(void)test:(int)arg1{},这种方法是objective
‑
c(通常简称为oc)语言书写方法的形式。但最终的ios系统的app中标识成:v24@0:8i16,这就是方法类型字符串。其中,函数名称字符串是
‑
test:,英文冒号“:”后面为参数。
15.方法类型字符串只关注英文字符/符号,数字表示各个域的总的字节长度或者是当前英文字符/符号的起始字节。其中v表示void,@表示是在哪个类对象里面定义的这个方法,英文冒号
‘
:’表示方法sel,i表示整形int;这样三个符号就对应上面的方法
‑
(void)
test:(int)arg1{}。其中,i就是方法类型中的参数int,方法名称是
‑
test:。
16.模型元素:
17.指首尾匹配对应的一组符号,首尾也有可能都是同一个符号。比如,
18.结构体(struct)的模型元素是{}
19.整型(int)的模型元素是i
20.数组(var[])的模型元素是[]
[0021]
其中,i首尾是本身,而{},[]的首和尾是分别是{、[及]、}。
[0022]
模型数据:
[0023]
是由模型元素构成的一个数据集。
[0024]
模型元素名:指定义一个变量的名称,即变量名,如“int a;”,a就是变量名。
[0025]
本发明所提供的方法包括以下步骤:
[0026]
s100:设置运行环境并获取所需还原的ios类型字符串,包括以下步骤:
[0027]
加载模型元素,模型元素包括与开发语言中数据类型关键词一一对应的表达符号,所述模型元素同时包含于类型翻译表typeencoding中,所述模型元素分为简单数据模型元素、结构体模型元素、数组模型元素及联合体模型元素;
[0028]
获取所需还原的ios类型字符串,所述字符串包括变量类型字符串、方法字符串,其中方法字符串包括方法类型字符串及其各自对应的方法名称字符串;
[0029]
分别标记变量类型字符串、方法类型字符串及对应方法名称字符串,用以区分并用以后续分别各自处理;
[0030]
提取所述方法类型字符串所包含的参数字符串、返回类型字符串;
[0031]
s200:判断当前字符串的类型是否为方法字符串,如果是,执行步骤s300,否则为变量类型字符串,执行步骤s400;
[0032]
s300:处理方法字符串,包括处理方法类型字符串及处理方法名称字符串;包括以下步骤:
[0033]
s301:判断当前方法字符串是否为方法类型字符串,如果是,执行步骤s302,否则为方法名称字符串,执行步骤s304;
[0034]
s302:根据类型翻译表typeencoding和ios操作系统中app的二进制文件存储格式,提取方法类型字符串中各个域的字符串:各个域由英文字符/符号+数字顺序组成,英文字符/符号表示类型字符串,其中,
[0035]
第一域为v,表示空void,为返回类型字符串,数字表示各个域的总的字节长度;
[0036]
第二域为@,表示类对象,数字表示当前类对象的起始字节,其字节长度为8字节;
[0037]
第三域为英文冒号,表示方法sel,数字表示当前方法sel的起始字节,其字节长度为8字节;
[0038]
第四域及第四域之后的英文字符/符号表示参数类型字符串,所述参数类型字符串为类型翻译表typeencoding中的任一类型字符串,数字表示当前参数的起始字节,其字节长度为8字节;
[0039]
s303:根据步骤s302对各个域的分解结果,提取出方法类型字符串用以分析,执行步骤s400;
[0040]
s304:以英文冒号作为分隔符,逐一提取当前方法名称字符串的各个域名;
[0041]
s305:储存所提取的各个域名,执行步骤s600;
[0042]
s400:递归查找并获取模型数据中的模型元素,直至模型数据中不再具有嵌套且模型元素不能继续分解为止,其中,模型数据是由模型元素构成的一个数据集;
[0043]
s500:获取模型元素名:根据模型元素与类型翻译表typeencoding对应的表达符号,将当前对应的表达符号与模型元素名以空格隔开并顺序拼接;
[0044]
s600:整合结构:分别对方法字符串及变量类型字符串进行整合;
[0045]
s700:生成伪代码:将拼接的结构按变量/方法的格式输出伪代码。
[0046]
优选地,步骤s400包括以下步骤:
[0047]
s401:判断模型数据中当前模型元素是否为简单模型元素,如果是,执行步骤s402,否则,执行步骤s403;
[0048]
s402:获取模型数据中的当前模型元素,执行步骤s500;
[0049]
s403:递归查找模型数据中的当前模型元素,直至模型数据中不再具有嵌套且模型元素不能继续分解为止,获取模型数据中的当前模型元素。
[0050]
优选地,步骤s500包括以下步骤:
[0051]
s501:判断当前模型元素是否具有指针,如果是,执行步骤s502,否则执行步骤s503:
[0052]
s502:按当前具有指针的模型元素出现的位置命名,命名后的模型元素名沿用至伪代码且不做改变,命名规则为:相同的前缀+数字,其中,数字按自然数从小到大依次顺序递增,执行步骤s504;
[0053]
s503:在所提取的模型元素位置之后、双引号内的字符为不具有指针的模型元素名,执行步骤s504;
[0054]
s504:获取当前模型元素与类型翻译表typeencoding对应的表达符号,将当前对应的表达符号与模型元素名以空格隔开并顺序拼接。
[0055]
优选地,步骤s600包括以下步骤:
[0056]
s601:判断当前字符串是否为方法字符串,如果是,执行步骤s602,否则为变量类型字符串,执行步骤s700;
[0057]
s602:将方法的名称和结构进行整合:按步骤s302中所述的提取方法名称的顺序,依次拼接并输出拼接后的结构:按提取方法名称的顺序,以返回类型字符串开始并以参数类型字符串结尾的顺序,依次进行拼接。
[0058]
本发明具有以下有益效果:解决了在ios app安全分析及ios app司法取证领域中尚无一种还原ios类型字符串的方法的技术问题。
附图说明
[0059]
图1为本发明所提供的方法的总流程图;
[0060]
图2为本发明所提供的方法中类型翻译表typeencoding的示例图。
具体实施方式
[0061]
通过上述的方面内容,我们已经了解了字符串的形式和要提取字符串的内容。
[0062]
对于变量类型的字符串,需对其进行查找。例如,查找ios系统的app应用程序代码
中变量的关键词字符串,如:int类型用i标识,结构体用{}标识。但在查找模型数据中可能出现嵌套有相同的或者嵌套有其他类似的变量的关键词字符串。这时,需要递归查找模型数据中的当前模型元素,直至模型数据中不再具有嵌套且模型元素不能继续分解为止,再将分析出来的伪代码模型按出现的顺序拼接,并依次再往后查找。这样,才能与ios系统的app应用程序中的代码顺序保持一致,便于准确分析。
[0063]
对于方法字符串,其具有固定的顺序用以判断:前三个域均是固定的顺序,即,第一域是返回类型字符串,第二域是类对象的字符串,第三域是方法字符串,第四域及第四域之后的英文字符/符号表示参数类型字符串。查找并分析各个域之后,逐一提取方法名称字符串的各个域并拼接在一起,构成了方法名称伪代码。
[0064]
图1示出了本发明所提供的方法的总流程图。如图1所示,本发明的方法包括以下步骤:
[0065]
s100:设置运行环境并获取所需还原的ios类型字符串,包括以下步骤:
[0066]
加载模型元素,模型元素包括与开发语言中数据类型关键词一一对应的表达符号,模型元素同时包含于类型翻译表typeencoding中。
[0067]
图2示出了本发明所提供的方法中类型翻译表typeencoding的示例图。如图2所示,“code”这一列为模型元素,“meaning”这一列为所对应的含义。其中,模型元素分为简单数据模型元素、结构体模型元素、数组模型元素及联合体模型元素;例如,
[0068]
一个简单数据模型元素的实例:如整型数据类型int,其模型元素为i;浮点型数据类型float,其对应的模型元素为q;
[0069]
一个结构体模型元素的实例:如结构体数据类型struct mytest a,其在app中存储为{mytest=},其中mytest为结构体名称。由于我们只关注类型形式,所以这里我们直接看成模型元素是{};
[0070]
一个数组模型元素的实例:如数组数据类型char array[2],其在app中存储为[2c],2表示数组的大小,c表示数组的类型;由于我们只关注类型形式,所以这里我们直接看成模型元素是[];
[0071]
一个联合体模型元素的实例:如联合体类型数据union mydata b,其在app中存储为(mydata=),其中mydata为联合体名称;由于我们只关注类型形式,所以这里我们直接看成模型元素是()。
[0072]
获取所需还原的ios类型字符串,字符串包括变量类型字符串、方法字符串。例如,方法字符串:v24@0:8i16,其中方法字符串包括方法类型字符串及其各自对应的方法名称字符串。例如,该实施例中方法名称字符串为
‑
test:。
[0073]
分别标记变量类型字符串、方法类型字符串及对应方法名称字符串,用以区分并用以后续分别各自处理;
[0074]
提取方法类型字符串所包含的参数字符串、返回类型字符串;
[0075]
s200:判断当前字符串的类型是否为方法字符串,如果是,执行步骤s300,否则为变量类型字符串,执行步骤s400;
[0076]
s300:处理方法字符串,包括处理方法类型字符串及处理方法名称字符串;包括以下步骤:
[0077]
s301:判断当前方法字符串是否为方法类型字符串,如果是,执行步骤s302,否则
为方法名称字符串,执行步骤s304;
[0078]
s302:根据类型翻译表typeencoding和ios操作系统中app的二进制文件存储格式,提取方法类型字符串中各个域的字符串:各个域由英文字符/符号+数字顺序组成,英文字符/符号表示类型字符串,其中,
[0079]
第一域为v,表示空void,为返回类型字符串,数字表示各个域的总的字节长度;
[0080]
第二域为@,表示类对象,数字表示当前类对象的起始字节,其字节长度为8字节;
[0081]
第三域为英文冒号,表示方法sel,数字表示当前方法sel的起始字节,其字节长度为8字节;
[0082]
第四域及第四域之后的英文字符/符号表示参数类型字符串,所述参数类型字符串为类型翻译表typeencoding中的任一类型字符串,数字表示当前参数的起始字节,其字节长度为8字节;
[0083]
例如:v24@0:8i16,
[0084]
第一域为v,表示空void,为返回类型字符串,24表示各个域的总的字节长度为24字节;
[0085]
第二域为@,表示类对象,数字0表示当前类对象的起始字节从第0字节开始,其字节长度为8字节,即,至第7字节结束,占用8个字节空间。
[0086]
第三域为英文冒号,表示方法sel,数字8表示表示当前方法sel从第8字节开始,其字节长度为8字节,即,至第15字节结束,占用8个字节空间;
[0087]
第四域为参数类型字符串,实施例中为i,表示整形变量,数字16表示表示当前方法sel从第16字节开始,其字节长度为8字节,即,至第23字节结束,占用8个字节空间。因此,第二域至第四域总的字节长度为24字节。至应理解,参数类型字符串为类型翻译表typeencoding中的任一类型字符串,不仅仅限于本实施例中的实施例中的整形变量i;
[0088]
s303:根据步骤s302对各个域的分解结果,提取出方法类型字符串用以分析,执行步骤s400;
[0089]
s304:以英文冒号作为分隔符,逐一提取当前方法名称字符串的各个域名;
[0090]
s305:储存所提取的各个域名,执行步骤s600;
[0091]
s400:递归查找并获取模型数据中的模型元素,直至模型数据中不再具有嵌套且模型元素不能继续分解为止,其中,模型数据是由模型元素构成的一个数据集;步骤s400包括以下步骤:
[0092]
s401:判断模型数据中当前模型元素是否为简单模型元素,如果是,执行步骤s402,否则,执行步骤s403;
[0093]
s402:获取模型数据中的当前模型元素,执行步骤s500;
[0094]
s403:递归查找模型数据中的当前模型元素,直至模型数据中不再具有嵌套且模型元素不能继续分解为止,获取模型数据中的当前模型元素。
[0095]
s500:获取模型元素名:根据模型元素与类型翻译表typeencoding对应的表达符号,将当前对应的表达符号与模型元素名以空格隔开并顺序拼接;步骤s500包括以下步骤:
[0096]
s501:判断当前模型元素是否具有指针,如果是,执行步骤s502,否则执行步骤s503:
[0097]
s502:按当前具有指针的模型元素出现的位置命名,命名后的模型元素名沿用至
伪代码且不做改变,命名规则为:相同的前缀+数字,其中,数字按自然数从小到大依次顺序递增,执行步骤s504;
[0098]
例如,^i,其中“^”表示指针,“i”是模型元素在类型翻译表typeencoding中表示整形int,其模型元素名就是按照他所出现的位置给随机命的一个名字,这里使用arg1,arg2,......argn来命名。那么,该实施例中,具有指针的模型元素名为int*arg1;同理,如果查找到下一个具有指针的模型元素,如,^c,与之对应的模型元素名为*arg2,以此类推。
[0099]
s503:在所提取的模型元素位置之后、双引号内的字符为不具有指针的模型元素名,执行步骤s504;
[0100]
例如,i”myivar”,其中“i”在模型元素在类型翻译表typeencoding中表示整形int,“myivar”就表示所定义的变量名,即模型元素名。
[0101]
s504:获取当前模型元素与类型翻译表typeencoding对应的表达符号,将当前对应的表达符号与模型元素名以空格隔开并顺序拼接。
[0102]
s600:整合结构:分别对方法字符串及变量类型字符串进行整合;步骤s600包括以下步骤:
[0103]
s601:判断当前字符串是否为方法字符串,如果是,执行步骤s602,否则为变量类型字符串,执行步骤s700;
[0104]
s602:将方法的名称和结构进行整合:按步骤s302中的提取方法名称的顺序,依次拼接并输出拼接后的结构:按提取方法名称的顺序,以返回类型字符串开始并以参数类型字符串结尾的顺序,依次进行拼接。
[0105]
s700:生成伪代码:将拼接的结构按变量/方法的格式输出伪代码。
[0106]
例如,变量类型字符串:i”time”,^i,经过本方法处理后输出的伪代码是:int time;int*arg1。
[0107]
又如:方法类型字符串和方法名称字符串分别是:v24@0:8i16,
‑
test:,经过本方法处理后输出的伪代码是:
‑
(void)test:(int)arg1。
[0108]
通过本发明所提供的方法,解决了电子取证领域尚无还原ios类型字符串的方法的技术问题。
[0109]
应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。