电脑商网经销商论坛
游客:  注册 | 登录 | 会员 | 搜索 | 宣传 | 帮助 



 
标题: 如何破解Pocket PC (for ARM)软件
  本主题由 DennyCC 于 2008-1-10 10:51 设置高亮 
jodie
资深顾问
Rank: 8Rank: 8


UID 12686
精华 15
积分 3624
帖子 281
经验 3624 点
CPW 435 钱
阅读权限 90
注册 1970-1-1
状态 离线
发表于 2008-1-7 13:34  资料  个人空间  短消息  加为好友 
如何破解Pocket PC (for ARM)软件

一点心得,有错误请指出。

比较PC下的软件,Pocket PC上软件的破解是比较简单的。如果你有windows下软件的破解经历,那只要熟悉ARM汇编就够了。



一.所需知识

1.熟悉C语言和ARM汇编语言。

2.有Windows API编程的经验。

二.工具

1. Embedded VC++,用于动态调试待破解程序;

2. IDA Pro,需要全版,这样能反汇编不同类型CPU的程序,用于静态分析;

3. ResHacker,用于查看资源,找出敏感的字符串;

4.二进制编辑器,如UltraEdit,WinHex等,用于修改程序;

5.一种ARM的编译器,如EmbestIDE for ARM、ADS,SDT等,可以用于写一小段汇编代码,再嵌入到目标程序中,也可以用来熟悉ARM指令;

6.最好有一个pocket pc的设备(ARM CPU)。



如何破解Pocket PC (for ARM)软件【2】

wh_cxh

2004.1

三.注册码验证方式与破解方式

当我们输入一个软件的注册码时,软件必须与正确的注册码相比较,才能判断输入的正确与否,下面是常用的注册码验证方法。

1.将owner name或email运算得到正确的注册码,再和输入的注册码比较;

RealKeyCode = f(owner name/email);

If( inputKeyCode == RealkeyCode)

“注册成功”

else

“注册失败”

要强制破解,可以跳过inputKeyCode == RealkeyCode判断,直接执行“注册成功”。如果要做注册机,则要读懂RealKeyCode = f(owner name/email)这段代码。

如何快速找到注册码判断的入口点呢,这就要借助上面提及的工具了,很明显的标志是字符串“注册成功”与“注册失败”,当然在实际中提示是不完全相同的。如果提示信息以资源的形式保存,则要使用ResHacker查看;否则就需要反汇编程序。

用IDA Pro反汇编时,在反汇编过程中有一个System DLL Directory要输入路径,最好将pocket pc \windows目录下的dll复制到一个文件夹(不是所有的都能复制),如C:\WINDOWS\CE。这些动态库可以是x86模拟器的,因为IDA只是关心他们的引出函数。

找到提示信息后,一般很快能找出注册码比较点。

拿ProWord为例,在ResHacker中查看字符串资源,并没有发现相关注册成功失败的信息,在对话框资源142中可以看出需要输入User name和unlock code。用Ida反汇编,在String窗口中可以发现:

.data:00020CF4 00000044 unicode Thank you for registering ProWord

.data:00020D38 00000030 unicode Not a valid Unlock code

顺着串往上找,发现:

.text:000178A0 BL sub_197C4 ;返回R0 == 0则注册码错误

.text:000178A4 MOVS R3, R0

.text:000178A8 BEQ loc_178D8

.text:000178AC CMP R4, #0

.text:000178B0 MOV R0, #0

.text:000178B4 LDRNE R0, [R4,#0x20]

.text:000178B8 BL sub_191D8

.text:000178BC MOV R3, #1

.text:000178C0 MOV R0, R4

.text:000178C4 STR R3, [R4,#0x7C]

.text:000178C8 BL mfcce300_1969

.text:000178CC LDR R0, =aThankYouForReg

.text:000178D0 B loc_178E8

.text:000178D4 off_178D4 DCD aThankYouForReg ; DATA XREF: sub_17858+74 r

.text:000178D4 ; "Thank you for registering ProWord"

.text:000178D8 loc_178D8 ; CODE XREF: sub_17858+50 j

.text:000178D8 LDR R0, =aNotAValidUnloc

.text:000178DC B loc_178E8

.text:000178E0 off_178E0 DCD aNotAValidUnloc ; DATA XREF: sub_17858+80 r

.text:000178E0 ; "Not a valid Unlock code"



sub_197C4是重点,进入看看,发现调用sub_19540,返回R0==0则注册码错,而且sub_19540有两个地方调用,一个是启动程序时验证注册码,一个是输入注册码时验证,因此要进入sub_19540修改返回值,如果在sub_19540外修改,则需要修改两次,如有遗漏,有时输入注册码虽然提示正确,但重新启动程序时会再次提醒非注册版本,这种错误经常出现!



如何破解Pocket PC (for ARM)软件【3】

wh_cxh

2004.1



有的程序提示信息以串资源的形式保存,如:

STRINGTABLE

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

{

2202, "Enter Code"

2203, "Thank you for registering. \nNow you need to restart game to apply changes."

}

应用程序要显示字符串,首先要载入该串资源,用API则调用如下功能:

int LoadString(HINSTANCE hInstance, UINT uID,

LPTSTR lpBuffer, int cchBufferMax);

在ARM中函数调用参数传递约定:

func(R0,R1,R2,R3,SP,SP+4,…,SP+4*n),返回值在R0中。

上例中uID = 2203 = 0x89D,在反汇编代码中应该有如下类似代码:

MOV R1, #0x890 ;;不是MOV R1, #0x89D的原因请参阅ARM汇编手册

ORR R1, R1, #0xD

如何快速找到上述代码呢?可以在IDA中先生成.asm文件,File->roduce->Create ASM File。用Emeditor或其他可以用正则表示式查找功能的编辑器打开,查找MOV.*R.*#0x890,很快就能够发现。如果不太明白正则表示式,直接搜索#0x890也可,就是找到结果太多!

如果串资源是53569,”xxxxxxxx” 53679 = 0xD597,一时不明白MOV R1, #0x???,

就可以查找MOV.*R.*#0xD\d\d\d,找到后再缩小范围。

如果不使用API,用MFC 导入串资源是什么功能呢?

这就需要一份MFCCE300.DLL的引出函数列表,形如下:

……

1725 ?LoadTemplate@CDocTemplate@@UAAXXZ (public: virtual void __cdecl CDocTemplate:oadTemplate(void))

1724 ?LoadStringW@CString@@QAAHI@Z (public: int __cdecl CString:oadStringW(unsigned int))

……

可以从MFCCE300.LIB中导出来。这样就能明白mfcce300_1724,mfcce300_xxx是什么功能了,附件中包含这个文件。

顶部
 

 
exinqing.net exinqing.net
当前时区 GMT+8, 现在时间是 2008-12-2 07:23
本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区