一、symbian API

这里只说说对分析破解symbian软件用得到的API接口。

1、获取手机IMEI码:

CTelephony::TPhoneIdV1::TPhoneIdV1(void)

CTelephony::GetPhoneId(TRequestStatus &, TDes8 &)

获取的IMEI码的数据类型为unicode字符串类型,这是目前软件注册验证最喜欢用的,也是最直接有用的突破口。

2、比较函数:

TDesC8::Compare(TDesC8 const&)

TDesC16::Compare(TDesC16 const&)

TDesC16::CompareF(TDesC16 const&)

返回值为0即两个数据相同,一般在IDA Pro搜索Compare文本即可,这是最常用的之一了。

3、文件类:

RFile::Open(RFs &,TDesC16  const&,uint)  //打开文件,返回文件句柄

RFile::Read(TDes8 &)   //读取文件

RFile::Size(int &) //文件大小

注册方式用授权文件时也是很好的突破点。

4、窗口类:

CAknNoteDialog::CAknNoteDialog(void)

提示对话框,通过窗口类找突破口目前我还没有成功用过,所以对这些类了解很少。

5、字符串资源加载:

StringLoader::Load(TDes16 &,int,CCoeEnv *)

CCoeEnv::AllocReadResourceAsDes16LC(int) //一般搜索Resource就可以搜到一堆相关API

这个要用得先对资源文件的结构有所了解才能用,其中那个int类型参数值是字符串数据索引表起始地址+索引值,一般程序中是用字符串数据索引表起始地址+一个字符串的索引值,然后再用这个值加上与要加载的目的字符串的索引值差值,通过索引值来判断字符串内容进而确认是否是关键点,这个方法的关键是要对资源文件结构有所了解,找到字符串数据索引表的起始位置的地址,又因为加载字符串的地方非常多,所以实际使用很困难,不太推荐用这个方法。

6、加密类

(1)CRC32加密

Mem::Crc32(ulong &,void  const*,int) //对内存数据进行CRC32验证,用于防止程序数据被修改

(2)Base64加密

TImCodecB64::TImCodecB64(void)

TImCodecB64::Encode(TDesC8  const&,TDes8 &) //编码

TImCodecB64::Decode(TDesC8  const&,TDes8 &)  //解码

(3)SHA1加密

CSHA1::NewL(void)

调用SHA1执行加密的对象方法的汇编代码一般类似BL  R3,R3寄存器的值即该加密方法的 函数地址。

(4)RSA加密

RInteger::NewL(TDesC8  const&)

RInteger::NewL(int)  //这两句是用来创建大数的,第一句一般是生成模数n,第二句是生成公钥e

CRSAPublicKey::NewLC(RInteger &,RInteger &)  //用前两句生成的模数n和公钥e来生成公钥对象

CRSAPKCS1v15Verifier::NewLC(CRSAPublicKey  const&)  //用公钥对象生成验证对象

CRSASignature::NewLC(RInteger &)  //RInteger一般为明文,即注册码数据,生成签名对象

接下来的汇编代码中会按顺序出现一句BL  R3和一句BL  R2,执行BL  R2后的R0值即密文,用RSA加密一般是用IMEI的数据(可以先做一些处理)作为密文,软件作者通过解密程序(即注册机)算出明文生成注册码,而程序用加密把注册码加密还原出IMEI数据,然后再把还原出的数据与IMEI数据进行比对,具体RSA加密的原理请自行搜索了解。

7、数据拷贝:

TDes8::Copy(TDesC8  const&)

TDes16::Copy(TDesC8  const&)

TDes16::Copy(TDesC16  const&)

一般R0为返回值,R1为参数,即把R1指向的数据复制一份到R0指向的内存地址内,ARM汇编代码一般为:

LDR    R1,[SP,#100+var_10]   //将要复制的数据地址加载到R1
LDR    R0,[SP,#100+var_20]   //把要存储数据备份的内存地址加载到R0
TDes16::Copy(TDesC16  const&)  //调用函数,R1即函数的参数,R0为返回值。

8、堆栈数据安全清除:

CleanupStack::PushL(CBase *)

CleanupStack::PopAndDestroy(int)

CleanupStack::PopAndDestroy(void)

这个对分析没多大用处,但在修改代码时需要注意,PushL和PopAndDestroy需要配对使用,如果修改程序流程跳过了PushL,后面却执行PopAndDestroy也许会造成程序崩溃,所以如果发现改完程序运行崩溃了,可以检查一下是否是这个原因。

二、ARM汇编
1、函数调用
ARM汇编语言的函数调用只能使用R0、R1、R2、R3四个寄存器作为参数,超过四个参数的函数,后面的参数必须得使用堆栈,没有返回值的函数的参数从左至右相应对应,function(R0,R1,R2,R3,SP1,SP2....),有返回值的函数一般R0作为返回值,即R0=function(R1,R2,R3,SP1,SP2....)。
2、指令
CMP----比较
BEQ----两数相等跳转
BNE----两数不等跳转
BGE----操作数1大于等于操作数2跳转
BLE----操作数1小于等于操作数2跳转
B-------强制跳转,无需条件比对
ADD----加
SUB----减
MUL----乘
LSL----左移
LSR----右移
LDR----内存数据/地址加载
STR----内存数据/地址存储
NOP----空指令,不做任何操作
MOV----赋值
BL,BLX-函数调用
ARM指令分16位和32位,一般使用的是16位,调用系统API的代码语句为32位,怎么看呢?在IDA中看单行语句的十六进制代码,两个字节长度的即16位,四个字节的为32位。
3、代码修改
分析完软件,找到破解点后,如果采用爆破方式,就需要修改代码,修改前要先知道改后的汇编代码的机器码,才能在十六进制编辑器内修改,在这里推荐一个工具CeleASM,这个工具是用来将ARM汇编代码生成机器码(十六进制)的,之前因为不会用一直放在硬盘上,今天看了下ARM的一些文章,再经过一番折腾,终于弄明白了,发现CeleASM的强大了,在说这个软件前先说下ARM中跳转指令的寻址方式,ARM汇编的寻址方式共有9种,其中一种是相对寻址方式,相对寻址方式是以PC值为基址,到目的地址的偏移量,PC值即是要修改的代码地址,直接举个例子:
.text:79C27B0C                 CMP     R0, #0
.text:79C27B0E                 BEQ     loc_79C27B18 //如果你要把这句修改成跳转至loc_79C27B26
.text:79C27B10                 LDR     R1, [R0]
.text:79C27B12                 LDR     R1, [R1,#4]
.text:79C27B14                 BLX     R1
.text:79C27B16                 STR     R5, [R4,#0x58]
.text:79C27B18
.text:79C27B18 loc_79C27B18                            ; CODE XREF: sub_79C27AB4+5Aj
.text:79C27B18                 LDR     R0, [R4,#0x54]
.text:79C27B1A                 CMP     R0, #0
.text:79C27B1C                 BEQ     loc_79C27B26
.text:79C27B1E                 LDR     R1, [R0]
.text:79C27B20                 LDR     R1, [R1,#4]
.text:79C27B22                 BLX     R1
.text:79C27B24                 STR     R5, [R4,#0x54]
.text:79C27B26
.text:79C27B26 loc_79C27B26                            ; CODE XREF: sub_79C27AB4+68j
.text:79C27B26                 LDR     R0, [R4,#0x3C]
.text:79C27B28                 CMP     R0, #0
.text:79C27B2A                 BEQ     loc_79C27B34
.text:79C27B2C                 LDR     R1, [R0]
如果你要把79C27B0E位置的BEQ loc_79C27B18修改成B loc_79C27B26,即跳到loc_79C27B26处,那么你只要在CeleASM内填写如下内容:
AREA .text, CODE, READONLY
CeleASM
CODE16
B 0x18
END
然后按“汇编”按钮,就会显示如下内容:
Microsoft (R) ARM Macro Assembler Version 14.00.60131
Copyright (C) Microsoft Corporation.  All rights reserved.
ARM macroassembler      Page:1 
1                      AREA .text, CODE, READONLY 
2 00000000          CeleASM 
3 00000000             CODE16 
4 00000000 e00a         B 0x18 
5 00000002             END 
Assembly terminated, errors: 0, warnings: 0 

把BNE 0x18前的e00a高低位调转一下,即0ae0就是机器码,就可以用十六进制编辑器进行修改了。那么我们所输入的内容是什么意思呢?其实我们只要关注CODE16和B 0x18这两句,其他内容可以看作是模板,用的时候只要在CeleASM和END之间填写所要查询的ARM汇编代码即可。CODE16是告诉编译器我们使用的是16位的Thumb指令,ARM汇编指令有16位和32位两种,16位指令的机器码是2字节,32指令的机器码是4字节,这里用的是16位,16位指令寻址范围只能在32MB内,32位寻址范围在4GB内,如果你要查询的是32位的指令,只要把CODE16删除即可。B 0x18中的B就是强制跳转指令,0x18是79C27B0E地址到79C27B26地址的偏移量,即0x79C27B26-0x79C27B0E=0x18,最后附一些经常需要修改的语句查询结果。
Microsoft (R) ARM Macro Assembler Version 14.00.60131
Copyright (C) Microsoft Corporation.  All rights reserved.
ARM macroassembler      Page:1 
1                      AREA .text, CODE, READONLY 
2 00000000            
3 00000000          CeleASM 
4 00000000             CODE16 
5 00000000 2801         CMP R0,#0x1 
6 00000002 d106         BNE 0x10 
7 00000004 9940         LDR R1,[SP,#0x100] 
8 00000006 9440         STR R4,[SP,#0x100] 
9 00000008 2800         CMP R0,#0x0 
10 0000000a d00c         BEQ 0x1C 
11 0000000c 1c0e         MOV R6,R1 
12 0000000e 3201         ADD R2,#0x1 
13 00000010 e00a         B 0x18 
14 00000012 46c0         NOP 
15 00000014             END 
Assembly terminated, errors: 0, warnings: 0 

三、资源文件结构
了解了这个才有办法用字符串加载API作为突破口,但这个没有做过研究,只是通过别人研究结果试了一下,但实际使用效果不佳,所以也就不用,有兴趣的可以搜一下,网上有一篇这方面的文章,就不在此记录了。

分析symbian软件总结笔记相关推荐

  1. 《软件调试分析技术》学习笔记

    <软件调试分析技术>学习笔记(一) 今天开始写写一些心得体验. <软件调试分析技术>是好友Monster的处女作品.作为一直以的好伙伴,他是我看着长大的,(*^__^*) 嘻嘻 ...

  2. android录音笔记软件,录音笔记app

    录音笔记app这是一款超好用的录音软件了,在这个里面你可以轻松的记录下每一个会议的记录,还包括各种的学习什么的,你下载了这样一个软件以后,就相当于有了一款实用的手机了,可以很好的帮你去进行各种的工作会 ...

  3. 嵌入式之uboot源码分析-启动第二阶段学习笔记(下篇)

    接上部分---->嵌入式之uboot源码分析-启动第二阶段学习笔记(上篇) 注:如下内容来自朱老师物联网大讲堂uboot课件 3.2.14 CFG_NO_FLASH (1)虽然NandFlash ...

  4. 软考-软件设计师 笔记一(计算机组成与体系结构)

    本栏博客目录 软考-软件设计师 笔记一(计算机组成与体系结构) 软考-软件设计师 笔记二(操作系统基本原理) 软考-软件设计师 笔记三(数据库系统) 软考-软件设计师 笔记四(计算机网络) 软考-软件 ...

  5. 软考-软件设计师 笔记九(多媒体基础)

    本栏博客目录 软考-软件设计师 笔记一(计算机组成与体系结构) 软考-软件设计师 笔记二(操作系统基本原理) 软考-软件设计师 笔记三(数据库系统) 软考-软件设计师 笔记四(计算机网络) 软考-软件 ...

  6. 软考-软件设计师 笔记十(软件工程)

    本栏博客目录 软考-软件设计师 笔记一(计算机组成与体系结构) 软考-软件设计师 笔记二(操作系统基本原理) 软考-软件设计师 笔记三(数据库系统) 软考-软件设计师 笔记四(计算机网络) 软考-软件 ...

  7. SGX技术的分析与研究 学习笔记

    SGX技术的分析与研究 学习笔记 SGX技术的分析与研究 学习笔记 1 SGX架构概述 2 SGX关键技术 2.1 Enclave安全容器 2.2 Enclave保护机制 2.2.1 内存访问语义 2 ...

  8. 软考-软件设计师 笔记十二(数据流图)

    本栏博客目录 软考-软件设计师 笔记一(计算机组成与体系结构) 软考-软件设计师 笔记二(操作系统基本原理) 软考-软件设计师 笔记三(数据库系统) 软考-软件设计师 笔记四(计算机网络) 软考-软件 ...

  9. 分析一个软件要考虑的问题

    分析一个软件要考虑的问题 1.要分析它的所有功能,每一个细节都要注意到. 要知道它是干什么用的,它删除之后对其它地方有什么影响? 2.要找出它的设计缺陷所在.不合理的地方在哪里?并提出更好的改进措施. ...

最新文章

  1. android 使用NDK
  2. table取tr对象 vue_javascript的DOM对象终极总结:你必看的js面向对象
  3. 特征工程——categorical特征 和 continuous特征
  4. CRM One Order 事件处理元数据初始化的准确位置
  5. rss spring 接口_spring 接口支持返回多种格式
  6. 【2018.4.14】模拟赛之二-ssl2392 蚂蚁【图论】
  7. JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
  8. ZedGraph使用经验
  9. Mysql也可以联合多表更新和删除
  10. margin和padding的区别和用法
  11. C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
  12. triz矛盾矩阵_怎样利用项目TRIZ矛盾定义法,突破产品“创
  13. spss可以关键词词频分析吗_做关键词分析,我有4款免费词云工具
  14. 数字信号处理期末总复习
  15. 累计独立访客(UV)不低于 1000 是什么意思,快速开通流量主
  16. macOSX下格式化外接固态硬盘
  17. 为明天计划,而不要为明天忧虑
  18. QUIC 技术创新 让视频和图片分发再提速
  19. 完全用GNU/Linux工作,摈弃Windows---你我共勉
  20. winpe加载raid_为WinPE添加RAID卡驱动的几种步骤

热门文章

  1. 全国计算机等级考试二级Python语言程序设计模拟试卷A卷综合应用题
  2. 控制打印机打印开发过程及注意事项
  3. 国内最美最豪华图书馆!我一定要考上!
  4. HECKTOR2020第三名论文研读
  5. 基于全局信息的人脸识别总结
  6. 派生类的构造函数执行顺序
  7. word页眉横线怎么去掉,这3种方法简单快捷
  8. [java]JavaSE基础小项目:校园多人畅聊系统
  9. Cocos2dx引擎各历史版本下载
  10. cocos2dx-2.2.6版本下载地址