首页
社区
课程
招聘
[原创]S60软件分析的两个小技巧
2008-3-2 18:13 24006

[原创]S60软件分析的两个小技巧

2008-3-2 18:13
24006
最近换了个NOKIA手机玩,碰到个S60软件需要注册,于是重拾IDA,偶有所得,与大伙分享一下。这里不谈具体软件,只以S60 SDK自带的Hello World为例。

(1) 库序号调用 -> 库中具体函数名
反汇编Hello World后。注意里面很多系统API都是通过链接库中序号来导入的
.text:00008DAC                 MOV     R4, R0
.text:00008DB0                 SUB     SP, SP, #4
.text:00008DB4                 BL      avkon_131


由于S60下软件基本只能靠静态分析,这给我们的分析带来了很大不便,如何才能看到真正的函数名呢。首先我们找到该库,在SDK安装目录下\Symbian\9.2\S60_3rd_FP1\Epoc32\release\armv5\lib\下的avkon.dso和avkon.lib两个文件。这里dso文件顾名思义就是动态链接库吧。我们先来看看其中的符号信息,
arm-none-symbianelf-readelf.exe -a -W avkon.dso > avkon.txt

输出中我们可以看到有序号和函数名字的对应关系。
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     4 FUNC    GLOBAL DEFAULT    1 _Z11ApacPlain12v@@avkon{000a0000}[100056c6].dll
     2: 00000004     4 FUNC    GLOBAL DEFAULT    1 _Z11ApacPlain16v@@avkon{000a0000}[100056c6].dll


总不能对每个函数我都手动来修改其对应函数名吧,能否将将IDA反汇编中的函数名字给替换掉呢?通过万能的google,找到了下面现成的脚本
http://www.zhongts.net/MyEssay/ida.lib.htm,

对脚本略作修改,并将txt文件中无用的列去除后,执行该脚本。那讨厌的库函数序号终于都变为为函数名了,这样看起来是不是就舒服多了呢。
.text:00008DAC                 MOV     R4, R0
.text:00008DB0                 SUB     SP, SP, #4
.text:00008DB4                 BL      _ZN12CAknDocumentC2ER15CEikApplication ; CAknDocument::CAknDocument(CEikApplication &)


(2) 字符串 -> 字符串引用之处
如何才能快速找到注册码校验之处呢,首先我们就想到了注册码错误提示字符串调用之处。
由于多国语言支持的考虑,手机软件中所用的字符串一般都存储于rsc资源文件中。我们先来看看资源文件是如何被调用的。
.text:000086E4                 MOVL    R1, 0x277C4000
.text:000086EC                 ADD     R1, R1, #0xA
.text:000086F0                 LDR     R0, [R6,#4
.text:000086F4                 BL      _ZNK7CCoeEnv26AllocReadResourceAsDes16LCEi ; CCoeEnv::AllocReadResourceAsDes16LC(int)

其对应的程序源码就是类似于
			// Load a string from the resource file and display it
			HBufC* textResource = StringLoader::LoadLC( R_HEWB_COMMAND1_TEXT );

这里这个0x277C4000 + 0xa 就是该字符串对应的资源ID,如何把这里这个资源ID和具体资源对应起来呢。由于Symbian未提供rsc文件的文件格式,我们只能自己来分析了。

首先搜索rsc资源件很容易就找到了该字符串,其第一个字节为该串长度。(注: 由于在rsc文件中字符串起始位置不一定是双字节对齐,对中文字符串需按二进制来搜索)
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

000001B0   00 00 00 FF FF 00 00 00  00 00 00 00 0C 48 65 6C              Hel
000001C0   6C 6F 20 77 6F 72 6C 64  21 05 41 62 6F 75 74 59   lo world! AboutY


OK,我们在这里确实找到了出错提示串,其具体的ID号还要继续分析。
注意RSC末尾有很多两字节数,看上去很像索引数组什么的。
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000240   1D 00 22 00 3E 00 8D 00  A5 00 23 01 65 01 BC 01     " > ??# e ?
00000250   C9 01 CF 01 29 02 3E 02                            ??) > 

经过分析确认最后half word3E 02,其实也就是该表的索引其实位置指针,对应于文件偏移0x023e。同样的数组中其他值也是文件内部偏移位置。
0015
001d
0022
..
我们看到0x01bc在这个数组中索引为9, 这样我们就知道了该字符串的索引为9。但有个小问题是,每个资源文件的起始地址是不同,这个是在编译资源文件时动态生成的。
#define R_HEWB_COMMAND1_TEXT                      0x277c4009
#define R_ABOUT_DIALOG_TITLE                      0x277c400a

在浏览rsc文件时我们发现资源文件的第一行中有出现 C4 77 02 这几个byte内容,
这里我们我们大胆推断0x6.5字节偏移开始的WORD就是该资源文件起始ID的定义。
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   6B 4A 1F 10 00 00 00 00  C4 77 02 00 CB 07 86 79   kJ      膚  ?唝
00000010   01 B2 00 AA 0F 04 00 00  00 01 40 7C 27 04 48 45    ??     @|' HE

那么我们现在有了该资源ID: 0x277c4000 + 0x9 = 0x277c4009
然后就可以在IDA中搜索这个立即数,来找到其引用位置了。不过具体对于hello world这个程序,其索引值不是简单的一个ldr而是一条mvn一条add指令。这样就只能搜索0x277c4000了。

容易找到了这里,这里就是弹出Hello world对话框的代码了。
.text:0000876C loc_876C                                ; CODE XREF: .text:00008680j
.text:0000876C                 MOVL    R0, 0x277C4000
.text:00008774                 MOV     R1, #0
.text:00008778                 ADD     R0, R0, #9
.text:0000877C                 BL      CONE_11
.text:00008780                 MOV     R7, R0
.text:00008784                 MOV     R0, #0xBC
.text:00008788                 BL      _ZN4User7AllocZLEi ; User::AllocZL(int)
.text:0000878C                 MOV     R5, R0
.text:00008790                 BL      _ZN19CAknInformationNoteC1Ev ; CAknInformationNote::CAknInformationNote(void)
.text:00008794                 MOV     R1, R7
.text:00008798                 MOV     R0, R5
.text:0000879C                 BL      _ZN22CAknResourceNoteDialog9ExecuteLDERK7TDesC16 ; CAknResourceNoteDialog::ExecuteLD(TDesC16  const&)
.text:000087A0                 BL      _ZN12CleanupStack13PopAndDestroyEv ; CleanupStack::PopAndDestroy(void)
.text:000087A4


另外对S60的保护一般都还比较简单,所以也可以通过修改程序代码后运行查看运行情况,甚至更改流程直接打印出明码比较的注册码,这也是不难办到的,这就要发挥你的想象力啦。  

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (25)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2008-3-2 19:07
2
0
为什么只能靠静态分析?
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 26 2008-3-2 19:30
3
0
arm汇编指令基本 看不懂
雪    币: 82
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
星际 2008-3-2 19:34
4
0
学到不少东西。
雪    币: 716
活跃值: (162)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 6 2008-3-2 21:25
5
0
有点另类的东西,学习一下
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2008-3-3 15:08
6
0
我看成360软件分析了:))
雪    币: 243
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
hpxpj 1 2008-3-4 12:44
7
0
是啊!让我瞬间晕了!
雪    币: 400
活跃值: (239)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
marswu 4 2008-3-4 12:46
8
0
我也是看成360啦,呵!
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2008-3-4 18:14
9
0
一块三毛的IDC不错,,,
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
WHO-AM-I 2008-3-6 14:14
10
0
高手门搞定动态分析器吧!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Showstar 2008-3-10 09:22
11
0
,看不懂、、、
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lOOp 2008-3-10 22:06
12
0
完全不懂的东西只有收藏了。。。。
雪    币: 239
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
codez 3 2008-3-12 09:58
13
0
efd 工具导出,然后使用 zip2ids 压缩出 ids 拷贝到 epoc6 就可以了。
建议 efd 导出文件修正一下 constructor 的名字,方便 ida 确认 :D
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
追plato 2008-3-13 21:40
14
0
.....我去面壁~不是360软件分析啊???
雪    币: 244
活跃值: (34)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lonkil 1 2008-3-15 09:04
15
0
s60的逆向分析将回多起来的。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
啊田 2008-3-16 03:52
16
0
逐字逐句地看完这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子?!我纵横(论坛名称)多年,自以为再也不会有任何帖

子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子。楼主,是你让我深深地理解了‘人外有人,天外有天’这句话。谢谢侬!我知道无论

用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好看了!您找游戏函数的方法真是太厉害

了,您的无私奉献的精神真是太伟大了,您的帖子我愿意一辈子的看下去!看完这篇帖子,我哭了!!! 楼主的睿智和我的愚昧有着多么强烈的反差

啊!你的教程使我获得了新生,我感觉我的世界刹那间充满了绚丽的色彩,光芒似无数柄利刃割驰我腐朽的残躯,我在撕痛中惊醒,复苏……
  从今天起,我要重新书写我的人生……但是就发帖艺术的角度而言,这篇帖子不算太成功,但它的实验意义却远远大于成功本身。正所谓:“一马

奔腾,射雕引弓,天地都在我心中!”楼主真不愧为新一代的开山怪!
  楼主,你要继续努力啊!你是(论坛名称)社区的希望啊
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lOOp 2008-3-16 15:18
17
0
ls的也太。。。。。。。
雪    币: 239
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
codez 3 2008-5-15 10:50
18
0
you could also try to use objdump or efd to receive the symbol names.
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wead 2008-5-16 05:21
19
0
太棒了!!!
第一次見調試手機的
請問那裡有調試手機系統的資料或教程嗎??
十分感謝你。。。
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2008-5-16 08:45
20
0
太强了
这不是肯德基
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
expmonking 2008-6-28 18:49
21
0
学习以下  ~~~··
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
啤酒盖子 2010-2-13 12:15
22
0
学习,刚好碰到问题,这样借鉴下就学习很快咯
雪    币: 32
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ganthur 2010-2-16 01:08
23
0
受益匪浅了。感谢您的精彩分析
雪    币: 63
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mazero 2010-3-15 17:36
24
0
做个记号先。回头看
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wawt 2012-9-6 23:26
25
0
终于找到了答案,真难呀!好好学习下!
游客
登录 | 注册 方可回帖
返回