首页
社区
课程
招聘
Symbian 60手机软件破解手记
2006-7-10 01:19 16827

Symbian 60手机软件破解手记

2006-7-10 01:19
16827
【文章标题】: Symbian 60的手机软件破解手记
【文章作者】: 海风月影[NE365][DFCG]
【软件名称】: Symbian 60手机软件
【使用工具】: IDA 4.9,WINHEX
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】

  nokia的智能手机用的操作系统是Symbian 60 简称 S60。这个操作系统不同于windows操作系统,执行的文件是.APP文件,其实就相当于windows里的.exe文件,当然,没有动态调试器了(od是肯定不能用的),只能用静态分析,工具只好选用强大的IDA(尽量用4.9版本的,4.5版本貌似对此支持不好)。修改代码工具用winhex或ultraedit都可以,只要能进行定位,修改16进制代码就行。
  
  其实对我来说,破解S60手机软件障碍还是很大的。首先,没有手机模拟器,电脑上不能运行,也没有调试器。完全是修改代码,传到手机上,运行后才知道结果。其次,不是PC机的CPU,因此OPCODE也不一样,要重新去理解,不过好在有点基础的人很快能看懂。第三,我是第一次用IDA分析软件,对于E文不太好的我来说,这么强大的功能在我这里发挥不出来。
  
  这是一篇破解手记,因此大家可能看起来没头绪,我只是想记录下我从开始接触手机软件到破解后的过程。
  
  刚刚换手机,下了一些手机软件,很奇怪,手机软件也有破解版,汗~~~(破解真是无处不在),然而出于好奇心,我也想了解了解手机软件的破解,所以在百度,GOOGLE上大搜一番,很遗憾,只找到2篇关于S60软件的破解,而且思路都是一样,用IDA分析,查找相关的字符信息(程序的交互性决定了它肯定会告诉你是否注册成功),PC软件我们也通常这么做。与PC软件不同的是,手机软件设计者考虑的是手机的资源问题,效率问题,一个手机软件是不可能动不动就占用个nMB内存的,或者启动一下程序花个几分钟,这样的软件显然没人会用。我看过一本关于博弈游戏编程的书,里面提到手机上的博弈游戏软件必须考虑到一些PC机编程所不需要过多考虑的问题,如棋盘表示用bit棋盘就很省内存,而且运算速度比一般棋盘快。扯远了~~ 手机软件都会用明码存放一些敏感信息,始终能找到的,加上手机软件一般不大,呵呵,更轻松了。网上 TEAM n7uG 的教程就搜索到了如 aYouHave,aDayLeft,aRegisterCallCo 之类的字符串,大家一看就知道这些与注册有关。顺着思路下去,分析它的跳转语句,一定能找到破解点。看到这里大家可能会说,手机软件破解也太简单了吧。确实不错,对于一个手机软件爆破来说,是很简单的事,于是,我就随便找
  了个软件自己去尝试一下。
  
  我在www.symbianware.com网站上随便下了一个我手机能用的软件SMSMACHINE(我手机不能用我就不能验证我是否破解成功),首先,安装软件,运行,提示我还有15天的试用期,然后进去,选注册,随便填,确定,显示错误的注册码(这是英文软件,显示的是:wrong code ),然后继续可以使用。把日期调到1个月后,发现不能进软件了,提示试用期已到,然后要求注册,注册码当然也是错的,然后就退出了,看来这个软件是时间限制。破解思路,只要超过15天还能用就能算无时间限制版了。
  用UNMAKESIS解压缩安装文件,解压后有主要的几个文件: .app , .rsc , .mbm。.app不说了,这个是程序文件;.rsc是资源文件,这里和PC机上不同,PC机是把资源文件编译到EXE文件里的,这里是分开放的,里面是UNICODE的字符,方便汉化。 .mbm是软件的图库文件。
  用IDA载入.app文件,CPU选ARM,确定后让IDA分析完。这里我发现一个问题,IDA4.5对ARM的支持不好,基本不能自动解码,要手动处理。方法是:
这里引用 TEAM n7uG的教程里原文

在程序的开头处找到CODE32,点一下,然后按alt+g,弹出一个对话框Segment Register Value,在Value里面输入1,点OK。然后菜单项Options->General,点第二个标签Analysis,右下角有个按钮Reanalyse program,点一下开始对代码进行重新分析。一会儿,汇编代码就出来了。一般情况下不能将所有代码完全分析,你就得手工逐个的右击DCD 0x...等数据,选择undefine,然后重新进行Reanalyse program的工作,直到你能看清楚自己所感兴趣的代码为止。


  而IDA4.9直接自动全部分析出来,然后看Names window找相关字符串,很遗憾,找不到一点点和注册有关系的信息:-(,这是怎么回事呢?后来我找到了一些汉化软件的教程,我试着汉化一下这个软件,突然在.rsc文件中找到了wrong code,Program's trial period is over!等信息。然后看了看关于S60软件的设计,发现NOKIA推出最近几个版本的SDK,把手机的资源全部整合到一个文件中了,不再把资源放在程序里了。我再次看了看n7uG的教程,2001年的...无语了,原来教程老了,不实用了。但还是有思路的,软件不是要读取资源嘛,读取资源肯定要用到API函数,对这个函数下断点。。。等等,好像只能静态分析。没办法,找到API函数  
  AllocReadResourceAsDes16LC__C7CCoeEnvi; CCoeEnv::AllocReadResourceAsDes16LC(int)
  
  意思很明确,申请读取资源方面的,后面还跟着一个
  
  OpenL__16CContactDatabaseQ216CContactDatabase13TThreadAccess; CContactDatabase::OpenL(CContactDatabase::TThreadAccess)
  
  整个代码如下
  .text:10006724                 [color=#0000D0]ADD     R1, R5, #0
  .text:10006726                 [color=#0000D0]ADD     R1, #0x9C
  .text:10006728                 [color=#0000D0]STR     R0, [R1]
  .text:1000672A                 [color=#FF0000]BL      PopAndDestroy__12CleanupStack [color=#008000]; CleanupStack::PopAndDestroy(void)
  .text:1000672E                 LDR     R0, [R5,#4]
  .text:10006730                 LDR     R1, =0x5DA0B05F
  .text:10006732                 [color=#FF0000]BL      AllocReadResourceAsDes16LC__C7CCoeEnvi [color=#008000]; CCoeEnv::AllocReadResourceAsDes16LC(int)
  .text:10006736                 [color=#0000D0]ADD     R1, R0, #0
  .text:10006738                 LDR     R0, [R5,#0x7C]
  .text:1000673A                 [color=#FF0000]BL      AVKON_465
  .text:1000673E                 [color=#0000D0]ADD     R1, R5, #0
  .text:10006740                 [color=#0000D0]ADD     R1, #0xA0
  .text:10006742                 [color=#0000D0]STR     R0, [R1]
  .text:10006744                 [color=#FF0000]BL      PopAndDestroy__12CleanupStack [color=#008000]; CleanupStack::PopAndDestroy(void)
  .text:10006748                 [color=#0000D0]MOV     R0, #0
  .text:1000674A                 [color=#FF0000]BL      OpenL__16CContactDatabaseQ216CContactDatabase13TThreadAccess [color=#008000]; CContactDatabase::OpenL(CContactDatabase::TThreadAccess)
  .text:1000674E                 [color=#0000D0]ADD     R1, R5, #0
  .text:10006750                 [color=#0000D0]ADD     R1, #0xE8
  


  先申请缓冲区,然后打开资源,但打开资源传入的参数是CContactDatabase::TThreadAccess,是个类?参数是又栈传入的,不动态调试不容易看出来,这个可是需要编程的基础,对于我来说等于天书了,无能力逆向。这条路走不通了。要另想办法
  
  突然想起来,时间到了之后,注册码输入不正确,程序会自动退出。为什么不在退出上下功夫呢?这个退出肯定不是程序结束后的退出,一定调用了API(windows下也是这样的)。继续寻找,找到了下面API函数:
  
  Exit__9CEikAppUi ; CEikAppUi::Exit(void)
  
  这个肯定是退出函数了,点右键,JUMP TO XREF OPERAND ,

  

       p .text:100069A4 [color=#FF0000]BL      Exit__9CEikAppUi[color=#008000]; CEikAppUi::Exit(void) 
  Down p .text:10006C14 [color=#FF0000]BL      Exit__9CEikAppUi[color=#008000]; CEikAppUi::Exit(void) 
  

  就出现2条,也就是程序就2处调用了退出函数,下面一处是这里
  

  .text:10006C08 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006C08
  .text:10006C08 loc_10006C08                            [color=#008000]; CODE XREF: .text:10006BF8j
  .text:10006C08                 [color=#0000D0]ADD     R0, R6, #0
  .text:10006C0A                 [color=#0000D0]ADD     R0, #0xE4
  .text:10006C0C                 LDR     R0, [R0]
  .text:10006C0E                 [color=#FF0000]BL      sub_100085F4
  .text:10006C12                 [color=#0000D0]ADD     R0, R6, #0
  .text:10006C14                 [color=#FF0000]BL      CEikAppUi__Exit_void_ [color=#008000]; 这里程序退出
  .text:10006C18                 B       loc_10006E7A
  .text:10006C1A [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006C1A
  .text:10006C1A loc_10006C1A                            [color=#008000]; CODE XREF: .text:10006B3Cj
  .text:10006C1A                 [color=#0000D0]ADD     R0, R6, #0
  .text:10006C1C                 [color=#FF0000]BL      sub_100070EC
  .text:10006C20                 B       loc_10006E7A
  .text:10006C22 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006C22


  
  这几段看不出什么东西,我们需要向上或向下看,可以看到

  
  .text:10006B1C                 [color=#0000D0]CMP     R1, #0x1E
  .text:10006B1E                 BGT     loc_10006B8E
  .text:10006B20                 [color=#0000D0]CMP     R1, #0x1C
  .text:10006B22                 BLT     loc_10006B26
  .text:10006B24                 B       loc_10006D68
  .text:10006B26 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006B26
  .text:10006B26 loc_10006B26                            [color=#008000]; CODE XREF: .text:10006B22j
  .text:10006B26                 [color=#0000D0]CMP     R1, #9
  .text:10006B28                 BNE     loc_10006B2C
  .text:10006B2A                 B       loc_10006CD0
  .text:10006B2C [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006B2C
  .text:10006B2C loc_10006B2C                            [color=#008000]; CODE XREF: .text:10006B28j
  .text:10006B2C                 [color=#0000D0]CMP     R1, #9
  .text:10006B2E                 BGT     loc_10006B5C
  .text:10006B30                 [color=#0000D0]CMP     R1, #4
  .text:10006B32                 BNE     loc_10006B36
  .text:10006B34                 B       loc_10006C5E
  .text:10006B36 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006B36
  .text:10006B36 loc_10006B36                            [color=#008000]; CODE XREF: .text:10006B32j
  .text:10006B36                 [color=#0000D0]CMP     R1, #4
  .text:10006B38                 BGT     loc_10006B4A
  .text:10006B3A                 [color=#0000D0]CMP     R1, #2
  .text:10006B3C                 BEQ     loc_10006C1A
  .text:10006B3E                 [color=#0000D0]CMP     R1, #2
  .text:10006B40                 BGT     loc_10006C22
  .text:10006B42                 [color=#0000D0]CMP     R1, #1
  .text:10006B44                 BNE     loc_10006B48
  .text:10006B46                 B       loc_10006CD0
  .text:10006B48 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  .text:10006B48
  .text:10006B48 loc_10006B48                            [color=#008000]; CODE XREF: .text:10006B44j
  .text:10006B48                 B       loc_10006E7A
 


  显然,CMP R1,数值,然后跳转,这个不是switch选择语句嘛?一般哪里用选择语句呢?很容易就想到消息循环,也就是说,这个退出是正常退出,是我们选择关闭程序,然后程序退出。那么另一个毫无疑问就是试用期满的退出。分析一下附近的代码

  
  .text:1000696C                 [color=#FF0000]BL      REG_CALC
  .text:10006970                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:10006972                 [color=#FF0000]BL      CMP_STR         [color=#008000]; 这里也有个比较函数
  .text:10006972                                         [color=#008000];
  .text:10006976                 [color=#0000D0]CMP     R0, #0
  .text:10006978                 BEQ     loc_1000697C    [color=#008000]; 试用版的就跳
  .text:10006978                                         [color=#008000]; ★不跳就是注册版了,启动时检测,爆破点
  .text:1000697A                 B       [color=#b000b0]END             [color=#008000]; 非试用版,结束这段代码
  .text:1000697C [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:1000697C
  .text:1000697C loc_1000697C                            [color=#008000]; CODE XREF: .text:10006978j
  .text:1000697C                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:1000697E                 [color=#FF0000]BL      TIME_LEFT       [color=#008000]; 读取时间信息
  .text:1000697E                                         [color=#008000];
  .text:10006982                 [color=#0000D0]CMP     R0, #0
  .text:10006984                 BEQ     loc_10006A1C    [color=#008000]; 试用期没满?跳走显示NAG
  .text:10006984                                         [color=#008000]; 否则显示试用期满
  .text:10006986                 [color=#FF0000]BL      Static__7CCoeEnv [color=#008000]; CCoeEnv::Static(void)
  .text:1000698A                 LDR     R1, =0x5DA0B061
  .text:1000698C                 LDR     R2, =0x5DA0B070
  .text:1000698E                 [color=#FF0000]BL      InfoWinL__C9CEikonEnvii [color=#008000]; CEikonEnv::InfoWinL(int,int)
  .text:10006992                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:10006994                 [color=#FF0000]BL      REG_WINDOW      [color=#008000]; 试用期满后注册
  .text:10006994                                         [color=#008000];
  .text:10006994                                         [color=#008000];
  .text:10006998                 [color=#0000D0]MOV     R0, [color=#FF0000]SP          [color=#008000]; 传入比较的参数
  .text:10006998                                         [color=#008000];
  .text:1000699A                 [color=#FF0000]BL      CMP_STR         [color=#008000]; 这里是个比较字符串函数
  .text:1000699A                                         [color=#008000]; 返回R0的值
  .text:1000699A                                         [color=#008000]; R0=0就是比较不相等
  .text:1000699A                                         [color=#008000]; 上面不远还有一个此函数
  .text:1000699E                 [color=#0000D0]CMP     R0, #0
  .text:100069A0                 BNE     END_FUNC        [color=#008000]; R0不等于0则跳转
  .text:100069A0                                         [color=#008000]; 这个是一定要跳转的
  .text:100069A0                                         [color=#008000]; 否则就退出了
  .text:100069A2                 [color=#0000D0]ADD     R0, R5, #0
  .text:100069A4                 [color=#FF0000]BL      CEikAppUi__Exit_void_ [color=#008000]; ★这里是试用期满的退出
  .text:100069A8                 B       [color=#b000b0]END
  

  
  当然,可以猜测,这段代码是开始运行程序时执行的,可以在10006978点爆破,不让它跳,启动时就不会有NAG了。但是功能方面不能保证,因为这只是启动时的检测(其实这个软件也就这一处检测一下)。为了找出检测的所有点,我们可以找出下面这个函数调用的所有地方
  
  .text:1000699A                 BL      CMP_STR         ; 这里是个比较字符串函数
  
  这个函数是比较函数,比较的都是和注册有关系的^_^,点右键选 Jump to xref to operand,就是查找所有调用这个函数的地方,共4处
  

  Up   p REG_WINDOW+1A   [color=#FF0000]BL      CMP_STR                                  
       p .text:10006972  [color=#FF0000]BL      CMP_STR         [color=#008000]; 比较函数               
  Down p .text:1000699A  [color=#FF0000]BL      CMP_STR         [color=#008000]; 这里是个比较字符串函数 
  Down p ABOUT_WINDOW+3E [color=#FF0000]BL      CMP_STR                                  
  


  可以看到,第一处是在注册窗口中调用,显然是判断是否注册成功的,第二,第三处上面已经有了,在启动时分别判断是否注册了和试用期是否满了,第四处我已经写出来了,是关于这个窗口里调用的,我们进去看看
  

  .text:100095A4 ABOUT_WINDOW                            [color=#008000]; CODE XREF: .text:100093DAp
  .text:100095A4
  .text:100095A4 var_14          = -0x14
  .text:100095A4 var_10          = -0x10
  .text:100095A4 var_C           = -0xC
  .text:100095A4
  .text:100095A4                 [color=#0000D0]PUSH    {R4-R6,LR}
  .text:100095A6                 [color=#0000D0]MOV     R6, R8
  .text:100095A8                 [color=#0000D0]PUSH    {R6}
  .text:100095AA                 LDR     R4, =0xFFFFF6DC
  .text:100095AC                 [color=#0000D0]ADD     [color=#FF0000]SP, R4
  .text:100095AE                 [color=#0000D0]ADD     R0, [color=#FF0000]SP, #0x14+var_C
  .text:100095B0                 MOVL    R1, 0x400
  .text:100095B4                 [color=#FF0000]BL      __10TBufBase16i
  .text:100095B8                 [color=#FF0000]BL      Static__7CCoeEnv [color=#008000]; CCoeEnv::Static(void)
  .text:100095BC                 LDR     R1, =0x5DA0B062
  .text:100095BE                 [color=#FF0000]BL      AllocReadResourceAsDes16LC__C7CCoeEnvi [color=#008000]; CCoeEnv::AllocReadResourceAsDes16LC(int)
  .text:100095C2                 [color=#0000D0]ADD     R1, R0, #0
  .text:100095C4                 [color=#0000D0]ADD     R0, [color=#FF0000]SP, #0x14+var_C
  .text:100095C6                 [color=#FF0000]BL      Append__6TDes16RC7TDesC16 [color=#008000]; TDes16::Append(TDesC16 const &)
  .text:100095CA                 [color=#FF0000]BL      PopAndDestroy__12CleanupStack [color=#008000]; CleanupStack::PopAndDestroy(void)
  .text:100095CE                 MOVL    R4, 0x810
  .text:100095D2                 [color=#0000D0]ADD     R4, [color=#FF0000]SP
  .text:100095D4                 [color=#0000D0]ADD     R0, R4, #0
  .text:100095D6                 [color=#FF0000]BL      sub_10005D70
  .text:100095DA                 [color=#0000D0]ADD     R0, R4, #0
  .text:100095DC                 [color=#FF0000]BL      REG_CALC
  .text:100095E0                 [color=#0000D0]ADD     R0, R4, #0
  .text:100095E2                 [color=#FF0000]BL      CMP_STR         [color=#008000]; 这里可以看到
  .text:100095E2                                         [color=#008000]; 和启动时的判断过程一样
  .text:100095E2                                         [color=#008000];
  .text:100095E6                 [color=#0000D0]ADD     R5, R0, #0
  .text:100095E8                 [color=#0000D0]ADD     R0, R4, #0
  .text:100095EA                 [color=#FF0000]BL      nullsub_2
  .text:100095EE                 [color=#0000D0]CMP     R5, #0          [color=#008000]; 等于0就是未注册的
  .text:100095EE                                         [color=#008000];
  .text:100095F0                 BEQ     loc_10009608
  .text:100095F2                 [color=#FF0000]BL      Static__7CCoeEnv [color=#008000]; CCoeEnv::Static(void)
  .text:100095F6                 LDR     R1, =0x5DA0B063 [color=#008000]; "注册版",资源的位置
  .text:100095F6                                         [color=#008000];
  .text:100095F8                 B       loc_1000960E
  .text:100095F8 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:100095FA                 				ALIGN 4
  .text:100095FC dword_100095FC  DCD 0xFFFFF6DC          [color=#008000]; DATA XREF: ABOUT_WINDOW+6r
  .text:10009600 dword_10009600  DCD 0x5DA0B062          [color=#008000]; DATA XREF: ABOUT_WINDOW+18r
  .text:10009604 dword_10009604  DCD 0x5DA0B063          [color=#008000]; DATA XREF: ABOUT_WINDOW+52r
  .text:10009608 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:10009608
  .text:10009608 loc_10009608                            [color=#008000]; CODE XREF: ABOUT_WINDOW+4Cj
  .text:10009608                 [color=#FF0000]BL      Static__7CCoeEnv [color=#008000]; CCoeEnv::Static(void)
  .text:1000960C                 LDR     R1, =0x5DA0B064 [color=#008000]; "未注册",资源的位置
  .text:1000960C                                         [color=#008000];
  .text:1000960E
  .text:1000960E loc_1000960E                            [color=#008000]; CODE XREF: ABOUT_WINDOW+54j
  .text:1000960E                 [color=#FF0000]BL      AllocReadResourceAsDes16LC__C7CCoeEnvi [color=#008000]; CCoeEnv::AllocReadResourceAsDes16LC(int)
  .text:1000960E                                                                [color=#008000]; 调用资源的函数
  


  大家可能比较奇怪,我为什么确定这个是注册窗口,我又没有调试过程序。这里,我们在ABOUT_WINDOW上点右键选 Jump to xref to operand
  

  Up p .text:100093DA [color=#FF0000]BL      ABOUT_WINDOW 
  


  就一处地方,双击,进去看看
  

  .text:100093CC loc_100093CC                            [color=#008000]; DATA XREF: .text:1000D374o
  .text:100093CC                 [color=#0000D0]PUSH    {R4,LR}
  .text:100093CE                 [color=#0000D0]SUB     [color=#FF0000]SP, [color=#FF0000]SP, #0x100
  .text:100093D0                 [color=#0000D0]ADD     R4, R1, #0
  .text:100093D2                 [color=#0000D0]CMP     R4, #0x32       [color=#008000]; "注册",菜单选项
  .text:100093D2                                         [color=#008000];
  .text:100093D4                 BEQ     loc_100093E0
  .text:100093D6                 [color=#0000D0]CMP     R4, #0x33       [color=#008000]; "关于",菜单选项
  .text:100093D6                                         [color=#008000];
  .text:100093D8                 BNE     loc_10009402    [color=#008000]; 2个都不是,跳走
  .text:100093D8                                         [color=#008000];
  .text:100093DA                 [color=#FF0000]BL      ABOUT_WINDOW
  .text:100093DE                 B       loc_10009410
  .text:100093E0 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:100093E0
  .text:100093E0 loc_100093E0                            [color=#008000]; CODE XREF: .text:100093D4j
  .text:100093E0                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:100093E2                 [color=#FF0000]BL      sub_10005D70
  .text:100093E6                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:100093E8                 [color=#FF0000]BL      REG_CALC        [color=#008000]; 计算注册码
  .text:100093E8                                         [color=#008000];
  .text:100093EC                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:100093EE                 [color=#FF0000]BL      REG_WINDOW      [color=#008000]; 显示注册窗口
  .text:100093EE                                         [color=#008000];
  .text:100093F2                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:100093F4                 [color=#FF0000]BL      nullsub_2
  .text:100093F8                 [color=#0000D0]MOV     R0, [color=#FF0000]SP
  .text:100093FA                 [color=#0000D0]MOV     R1, #2
  .text:100093FC                 [color=#FF0000]BL      sub_10005D8C
  .text:10009400                 B       loc_10009410
  .text:10009402 [color=#008000]; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:10009402
  .text:10009402 loc_10009402                            [color=#008000]; CODE XREF: .text:100093D8j
  .text:10009402                 [color=#FF0000]BL      AVKON_42        [color=#008000]; 这里应该是系统的功能
  .text:10009402                                         [color=#008000]; 我手机上这里是
  .text:10009402                                         [color=#008000]; "添加到捷径"
  .text:10009402                                         [color=#008000]; 而且不用汉化,
  .text:10009402                                         [color=#008000]; 就是说资源应该是手机里的
  .text:10009406                 LDR     R1, [R0]
  .text:10009408                 LDR     R2, [R1,#0x4C]
  .text:1000940A                 [color=#0000D0]ADD     R1, R4, #0
  .text:1000940C                 [color=#FF0000]BL      sub_1000A4AC
  .text:10009410
  .text:10009410 loc_10009410                            [color=#008000]; CODE XREF: .text:100093DEj
  .text:10009410                                         [color=#008000]; .text:10009400j
  .text:10009410                 [color=#0000D0]ADD     [color=#FF0000]SP, [color=#FF0000]SP, #0x100
  .text:10009412                 [color=#0000D0]POP     {R4}
  .text:10009414                 [color=#0000D0]POP     {R0}
  .text:10009416                 [color=#FF0000]BX      R0
  

  
  这里很容易看出来的,也不需要过多分析。
  最后,就是破解了,分析一下这个:
  
  
  Up   p REG_WINDOW+1A   [color=#FF0000]BL      CMP_STR                                  
       p .text:10006972  [color=#FF0000]BL      CMP_STR         [color=#008000]; 比较函数               
  Down p .text:1000699A  [color=#FF0000]BL      CMP_STR         [color=#008000]; 这里是个比较字符串函数 
  Down p ABOUT_WINDOW+3E [color=#FF0000]BL      CMP_STR                                  
  


  其实爆破点就是1个,就是启动那里判断是否注册的一个点,上面说了,但是修改时候有些头疼,我没有OPCODE的表,不知道NOP这个命令的OPCODE,晕了。我们换个思路,每次判断是否注册,程序都调用了CMP_STR这个函数,我们可以在这里做文章,这个函数返回值在R0里面,R0=0则比较结果不相同,所以,我们只要让它返回不是0就可以了
  

  .text:100061B0                 [color=#FF0000]BL      Compare__C7TDesC16RC7TDesC16 [color=#008000]; TDesC16::Compare(TDesC16 const &)
  .text:100061B4                 [color=#0000D0]MOV     R1, #0
  .text:100061B6                 [color=#0000D0]CMP     R0, #0
  .text:100061B8                 BNE     loc_100061BC
  .text:100061BA                 [color=#0000D0]MOV     R1, #1
  .text:100061BC
  .text:100061BC loc_100061BC                            [color=#008000]; CODE XREF: CMP_STR+24j
  .text:100061BC                 [color=#0000D0]CMP     R1, #0
  .text:100061BE                 BEQ     loc_100061C8
  .text:100061C0
  .text:100061C0 Wrong                                   [color=#008000]; CODE XREF: CMP_STR+Cj
  .text:100061C0                 [color=#0000D0]MOV     R0, #0          [color=#008000]; R0不是以0返回就OK了
  .text:100061C0                                         [color=#008000]; 改成MOV R0,#1
  .text:100061C0                                         [color=#008000]; 二进制码为 01 21
  .text:100061C2                 B       [color=#b000b0]END
  


  函数中唯一返回R0=0的地方,我们改成R0=1就可以了,在IDA最下面看看这个100061C0地址对应的文件偏移:623C。用16进制编辑工具,定位偏移623C,修改 00 21 为 01 21,保存,破解成功。
  
引用fxyang的话:

破解了这里就全部的破解了这个软件。(模块化编程的弊端?)


  
  后记:
  这篇文章写了很久。第一,因为没什么资料,误打误撞了半天。第二,因为课程比较紧,耽误了点时间。
  这里,需要感谢的是 TEAM n7uG 的教程,没有这篇教程,我花的时间可能更多。还要感谢fxyang,他的破解方法给了我启发。
  
  另外,论坛上已经出现一些手机方面的文章,但可惜的是都是WIN CE 操作系统下的,很容易看出来的,WINCE下的程序每个语句都是4字节,而Symbian 60程序是2字节。这个系统的API函数不同于WINCE,又没有调试器,算法就分析不出来了。
  
  第一次用IDA分析东西,分析的不彻底,大家可能看得不是很清晰,只能说对不起大家了
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于海风月影, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年07月10日 1:20:05
本代码由xTiNt自动着色 http://kbadboy.yeah.net

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

收藏
点赞7
打赏
分享
最新回复 (18)
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2006-7-10 01:37
2
0
晕,怎么修改得不能看了?谁能指点一下?
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2006-7-10 12:42
3
0
不错!

手机软件破解很少看到教程的阿
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
lisorgu 2006-7-13 09:44
4
0
很兴奋能看到一篇关于手机软件的破解,还是你厉害啊
雪    币: 150
活跃值: (116)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
乱乱 1 2006-7-24 15:58
5
0
模拟器在s60开发包中有。
要是有动态调试器就爽了
雪    币: 158
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
modi 2006-7-24 21:53
6
0
刚买了一台palm OS系统的手机,发觉都是共享软件,而且收费?贵...
想破解,但反汇编出来的东东看不懂..
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无影者 2006-7-24 23:00
7
0
好东东,难得见到,学习学习
雪    币: 7976
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 2006-8-3 08:44
8
0
最初由 乱乱 发布
模拟器在s60开发包中有。
要是有动态调试器就爽了


ida5.0有一个插件可以实现!
雪    币: 239
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
codez 3 2006-8-29 10:55
9
0
很详细的文章,提一些方面,希望对楼主有所帮助.

1. rsc 文件分析辅助工具可以在我的 blog 上面获取,支持 3/4 中格式 :)
-> http://my.opera.com/jiezhang

2. 建议不要使用 ida 4.9 做分析,因为我比较过他分析出的 api 名字很多是错误的,我也不知道原因,可以尝试用 ida 5.0 或者 ida 4.8+ 我的插件(可以在 my blog 获取)

3. 关于模拟器的问题,不要希望尝试在模拟器上跑真正的 symbian 程序,不是一个系统 :(

4. 最后提一个文中的不妥的地方: ARM/thumb 也就是 32 bits/16 bits instruction 与 symbian 和 wince 无关,symbian 程序同样可以使用 arm 也就是 32 bits 的 arm 方式编译。

我最近也在研究这个方面,有兴趣的朋友可以一起交流,毕竟这方面的资料过于少了,呵呵。
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2006-9-4 10:11
10
0
非常感谢codez给的建议,今天才看到你的回帖

1,我已经下载,非常感谢,最近硬盘坏了,什么东西资料都没有了,过几天我把东西找回来传一份 rsc给你

2,已经升级到了 IDA 5.0 ,分析的时候 IDA 5.0还没出来,所以只用了 IDA 4.9 ,文章中我也提到 曾经用 IDA4.5分析,但是效果不好,看来 IDA 升级的效果是非常明显的

3,系统方面我就不了解了,难道只有在手机上才能运行.APP 文件?

4,对于 Symbian我只是一个新手,不是很了解,感谢你提出文中BUG!!
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2009-5-28 14:34
11
0
支持,学习中……
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
挂挂 2009-5-29 08:50
12
0
原来手机 软件也可以破解 啊
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunwayrain 2009-5-29 09:15
13
0
受教中,长见识了!
雪    币: 263
活跃值: (128)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
komawang 2010-2-1 16:09
14
0
学习了~~

雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
feierin 2010-2-2 10:38
15
0
   
膜拜一下海风
邪恶的触角伸展到了嵌入式平台这一块
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
编程小猪 2010-2-2 23:26
16
0
如果能把最新版的x-plore 破解了,就爽歪歪了。。。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bdrdc 2010-2-25 22:29
17
0
多谢楼主分享,学到了很多。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haber 2010-2-26 09:29
18
0
谢谢楼主,仰视下
雪    币: 411
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kmlch 2010-2-26 10:37
19
0
好文。手机软件3年前楼主就开始搞了。膜拜下。
游客
登录 | 注册 方可回帖
返回