教你如何破解PocketPC程序 - 转dalao

Ken_Chan

社区贡献者
2005-04-01
4,236
0
0
教你如何破解PocketPC程序
【文章标题】: 【原创】教你如何破解PocketPC程序
【文章作者】: 大老
【作者邮箱】: dalao@126.com dalao2003_8@hotmail.com
【作者主页】: http://dalao2002.yeah.net
【作者QQ号】: 79234668
【软件名称】: 国产软件省去软件名《XXXX专业版》
【软件介绍】: XXXX专业版,在XXXX原有功能的基础上增加分组/随机铃声/个性振动、来电防火墙、短信拒接来电、个性皮肤/大头贴、通话记录隐形/联系人照片等新功能,分组任你设,规则任你定。拥XXXX,立刻让你的手机成为真正的商务手机!
【下载地址】: http://www.mycnknow.com
【保护方式】: 序列号
【编写语言】: C#.net
【使用工具】: Win2K、IDA pro 4.9 FULL 支持PocketPC调试版 多普达智能手机一部
【操作平台】: PocketPC
【参考文章】:WiNrOOt的编写PPC程序的loader--Intumical1.0126
【文章连接】:
------------------------------------------------------------
http://bbs.pediy.com/showthread.php...hreadid=18176&highlight=loaderIntumical1.0126
————————————————————————————----------------------------—————
【作者声明】: 此文献给所有爱好解密的朋友们!
--------------------------------------------------------------------------------
所属组织:=BCG= =[DCG]=
本人作品:
《文件加密狗检测工具 2.1》
《教你如何分析和修改XBOX游戏》
《大老的打狗教程第一篇如何解掉hasp的狗》
《大老的打狗教程第二篇如何解掉深思3的狗》
《大老的打狗教程第三篇(最终篇)如何解掉rockey4的狗》
《Armadill 3.XX 修复导入表加密部分及对应解决方法》
《教你如何破解Gba rom程序》
《深思4 rockey5 rockey6 新一代加密狗乱弹》

===============================================================================

程序是arm指令集的所以,先说一下arm 指令集资料:
===========================================
Arm指令集
(快速查找)

在本文档的汇编语法中,用 # 前缀表示立即值,用 & 表示十六进制值,用 % 表示二进制值,用 {花括号} 表示指令中可选的设置字段或位。下面表格中粗体的指令是核心 ARM 指令,其他的是值得包含的位和片段、移位选项和汇编器助记码(mnemonic)... 还列出了协处理器指令。但是用于 RISC OS 机器的 ARM 处理器不支持协处理器,只在一个可访问的芯片中提供了实际上的协处理器功能。其中包括设置 ARM、cache、MMU 的设施,等...

  指令 意义 最早的 CPU / 注释
ADC 带进位的加法 -
ADD 加法 -
AND 逻辑与 -
ASL 算术左移 这是一个选项,不是指令
ASR 算术右移 这是一个选项,不是指令
B 分支 -
BIC 位清除 -
BL 带连接的分支 -
BX 分支到 Thumb 代码 StrongARM SA1110 ?
CDP 协处理器数据操作 -
CMN 比较取负的值 -
CMP 比较值 -
EOR 异或两个值 -
LDC 装载内存到协处理器 -
LDM 装载多个寄存器 -
LDR 装载寄存器 -
LDRB 装载字节到寄存器 -
LDRH 装载半字到寄存器 StrongARM
LDRSB 装载有符号字节到寄存器 StrongARM
LDRSH 装载有符号半字到寄存器 StrongARM
LSL 逻辑左移 这是一个选项,不是指令
LSR 逻辑右移 这是一个选项,不是指令
MCR 协处理器寄存器传送 -
MLA 带累加的乘法 -
MOV 传送值/寄存器到一个寄存器 -
MRC 协处理器寄存器传送 -
MRS 传送状态标志到一个寄存器 ARM 6
MSR 传送一个寄存器的内容到状态标志 ARM 6
MUL 乘法 -
MVN 传送取负的(值) -
ORR 逻辑或 -
ROR 循环右移 这是一个选项,不是指令
RRX 带扩展的循环右移 这是一个选项,不是指令
RSB 反向减法 -
RSC 带借位的反向减法 -
SBC 带借位的减法 -
SMLAL 带累加的有符号长(64 位)乘法 StrongARM
SMULL 有符号长(64 位)乘法 StrongARM
STC 协处理器数据传送 -
STM 存储多个寄存器 -
STR 存储一个寄存器 -
STRB 存储一个字节(从一个寄存器) -
STRH 存储一个半字(从一个寄存器) StrongARM
STRSB 存储一个有符号字节(从一个寄存器) StrongARM
STRSH 存储一个有符号半字(从一个寄存器) StrongARM
SUB 减法 -
SWI 导致一个软件中断 -
SWP 交换寄存器与内存 ARM 3
TEQ 测试等价(概念上的 EOR) -
TST 测试并屏蔽(概念上的 AND) -
UMLAL 带累加的无符号长(64 位)乘法 StrongARM
UMULL 无符号长(64 位)乘法 StrongARM


RISC OS 的 BASIC 汇编器的伪指令
ADR 得到目标的地址(4K 之内)
ADRL 得到目标的地址(超过 4K)
ALIGN 把程序计数器设置到下个字的边界
DCx 定义字节(B)、半字(W)、字(D)、字符串(S)、或浮点(F)值
EQUx 定义字节(B)、半字(W)、字(D)、字符串(S)、或浮点(F)值
OPT 选择汇编选项
===========================================
分析:
这个软件有23天的试用,试用期过后再启动时会出来一个试用期过期的对话框让你输入注册码
先用ida4.9反汇编看看,ida对中文的支持个人感觉还是比较差!查找字符串结果一无所获!
换一个思路!跟踪分析看看!软件有时间限制的话一般都设置在主程序的开始来检测既然这样
就先看看程序的开始,静态分析
============================================================================================================
.text:00059C88 0D C0 A0 E1 MOV R12, SP ; Rd = Op2
.text:00059C8C F0 58 2D E9 STMFD SP!, {R4-R7,R11,R12,LR} ; Store Block to Memory
.text:00059C90 1C B0 8D E2 ADD R11, SP, #0x1C ; Rd = Op1 + Op2
.text:00059C94 04 D0 4D E2 SUB SP, SP, #4 ; Rd = Op1 - Op2
.text:00059C98 00 70 A0 E1 MOV R7, R0 ; Rd = Op2
.text:00059C9C 01 60 A0 E1 MOV R6, R1 ; Rd = Op2
.text:00059CA0 02 50 A0 E1 MOV R5, R2 ; Rd = Op2
.text:00059CA4 03 40 A0 E1 MOV R4, R3 ; Rd = Op2
.text:00059CA8 41 00 00 EB BL _cinit ; Branch with Link
.text:00059CA8
.text:00059CAC 04 30 A0 E1 MOV R3, R4 ; nShowCmd
.text:00059CB0 05 20 A0 E1 MOV R2, R5 ; lpCmdLine
.text:00059CB4 06 10 A0 E1 MOV R1, R6 ; hPrevInstance
.text:00059CB8 07 00 A0 E1 MOV R0, R7 ; hInstance
.text:00059CBC A4 C8 FF EB BL WinMain ; Branch with Link =====》c程序的主入口
.text:00059CBC
.text:00059CC0 00 40 A0 E1 MOV R4, R0 ; Rd = Op2
.text:00059CC4 20 40 0B E5 STR R4, [R11,#var_20] ; Store to Memory
.text:00059CC8 01 00 00 EA B loc_59CD4 ; Branch
.text:00
==============================================================================================================
进入程序主入口后开始用ida的动态调试用f2设置断点继续跟踪
.text:0004BF58 CC C1 9F E5 LDR R12, =0xFFFFFB54 ; Load from Memory
.text:0004BF5C 0C D0 8D E0 ADD SP, SP, R12 ; Rd = Op1 + Op2
.text:0004BF60 00 40 A0 E1 MOV R4, R0 ; Rd = Op2
.text:0004BF64 02 50 A0 E1 MOV R5, R2 ; Rd = Op2
.text:0004BF68 08 00 A0 E3 MOV R0, #8 ; Rd = Op2
.text:0004BF6C 11 1E A0 E3 MOV R1, #0x110 ; Rd = Op2
.text:0004BF70 28 00 8D E5 STR R0, [SP,#0x4C4+var_49C] ; Store to Memory
.text:0004BF74 28 00 8D E2 ADD R0, SP, #0x4C4+var_49C ; LPINITCOMMONCONTROLSEX
.text:0004BF78 2C 10 8D E5 STR R1, [SP,#0x4C4+var_49C.dwICC] ; Store to Memory
.text:0004BF7C E5 37 00 EB BL InitCommonControlsEx ; Branch with Link
.text:0004BF7C
.text:0004BF80 00 10 A0 E3 MOV R1, #0 ; dwCoInit
.text:0004BF84 00 00 A0 E3 MOV R0, #0 ; pvReserved
.text:0004BF88 DC 37 00 EB BL CoInitializeEx ; Branch with Link ==>初始化函数
.text:0004BF88
.text:0004BF8C 94 71 9F E5 LDR R7, =unk_62B88 ; Load from Memory
.text:0004BF90 00 30 A0 E3 MOV R3, #0 ; Rd = Op2
.text:0004BF94 04 20 A0 E1 MOV R2, R4 ; Rd = Op2
.text:0004BF98 00 10 A0 E3 MOV R1, #0 ; Rd = Op2
.text:0004BF9C 07 00 A0 E1 MOV R0, R7 ; Rd = Op2
.text:0004BFA0 5E 01 00 EB BL sub_4C520 ; Branch with Link
.text:0004BFA0
.text:0004BFA4 78 01 9F E5 LDR R0, =aCallhistory ; wchar_t *
.text:0004BFA8 05 10 A0 E1 MOV R1, R5 ; wchar_t *
.text:0004BFAC 04 40 87 E5 STR R4, [R7,#4] ; Store to Memory
.text:0004BFB0 9A 38 00 EB BL _wcsicmp ; Branch with Link
.text:0004BFB0
.text:0004BFB4 64 41 9F E5 LDR R4, =off_61A94 ; Load from Memory
.text:0004BFB8 01 60 A0 E3 MOV R6, #1 ; Rd = Op2
.text:0004BFBC 00 00 50 E3 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:0004BFC0 00 00 94 E5 LDR R0, [R4] ; Load from Memory
.text:0004BFC4 00 80 A0 E3 MOV R8, #0 ; Rd = Op2
.text:0004BFC8 06 50 A0 E1 MOV R5, R6 ; Rd = Op2
.text:0004BFCC 08 50 A0 11 MOVNE R5, R8 ; Rd = Op2
.text:0004BFD0 05 30 A0 E1 MOV R3, R5 ; Rd = Op2
.text:0004BFD4 10 20 8D E2 ADD R2, SP, #0x4C4+var_4B4 ; Rd = Op1 + Op2
.text:0004BFD8 00 10 A0 E3 MOV R1, #0 ; Rd = Op2
.text:0004BFDC 7C FF FF EB BL sub_4BDD4 =====》发现过这个call后就会出现过期对话框
.text:0004BFDC
.text:0004BFE0 00 00 50 E3 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:0004BFE4 40 00 00 4A BMI loc_4C0EC ; Branch
.text:0004BFE4
.text:0004BFE8 10 00 9D E5 LDR R0, [SP,#0x4C4+var_4B4] ; Load from Memory
.text:0004BFEC 00 00 50 E3 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:0004BFF0 3D 00 00 1A BNE loc_4C0EC ; Branch
.text:0004BFF0
===================================================
重新进入后继续分析

.text:0004BDD8 SUB SP, SP, #0x64
.text:0004BDDC MOV R5, R0
.text:0004BDE0 MOV R6, R1
.text:0004BDE4 MOV R8, R2
.text:0004BDE8 MOV R7, R3
.text:0004BDEC LDR R4, =unk_62C2C
.text:0004BDF0 MOV R10, #0
.text:0004BDF4 STR R10, [R8]
.text:0004BDF8 MOV R9, #5
.text:0004BDFC
.text:0004BDFC loc_4BDFC ; CODE XREF: sub_4BDD4+88j
.text:0004BDFC MOV R2, R5 ; lpName
.text:0004BE00 MOV R1, #0 ; bInitialOwner
.text:0004BE04 MOV R0, #0 ; lpsa
.text:0004BE08 BL CreateMutexW
.text:0004BE08
.text:0004BE0C CMP R0, #0
.text:0004BE10 STR R0, [R4]
.text:0004BE14 BEQ loc_4BF28
.text:0004BE14
.text:0004BE18 BL GetLastError
.text:0004BE18
.text:0004BE1C CMP R0, #0xB7
.text:0004BE20 BNE loc_4BE8C
.text:0004BE20
.text:0004BE24 MOV R1, R6 ; lpWindowName
.text:0004BE28 MOV R0, R5 ; lpClassName
.text:0004BE2C BL FindWindowW
.text:0004BE2C
.text:0004BE30 CMP R0, #0
.text:0004BE34 BNE loc_4BE6C
.text:0004BE34
.text:0004BE38 MOV R0, #0x1F4 ; dwMilliseconds
.text:0004BE3C BL Sleep
.text:0004BE3C
.text:0004BE40 MOV R1, R6 ; lpWindowName
.text:0004BE44 MOV R0, R5 ; lpClassName
.text:0004BE48 BL FindWindowW
.text:0004BE48
.text:0004BE4C CMP R0, #0
.text:0004BE50 BNE loc_4BE6C========》上面的代码是查找看看是否程序已经运行
.text:0004BE50
.text:0004BE54 SUB R9, R9, #1
.text:0004BE58 CMP R9, #0
.text:0004BE5C BGT loc_4BDFC
.text:0004BE5C
.text:0004BE60 LDR R0, =unk_80004005
.text:0004BE64 ADD SP, SP, #0x64
.text:0004BE68 LDMFD SP!, {R4-R10,PC}
.text:0004BE68
.text:0004BE6C ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0004BE6C
.text:0004BE6C loc_4BE6C ; CODE XREF: sub_4BDD4+60j
.text:0004BE6C ; sub_4BDD4+7Cj
.text:0004BE6C MOV R1, #0x400
.text:0004BE70 MOV R3, #0 ; lParam
.text:0004BE74 MOV R2, R7 ; wParam
.text:0004BE78 ORR R1, R1, #0xB ; Msg
.text:0004BE7C BL PostMessageW
.text:0004BE7C
.text:0004BE80 MOV R3, #1
.text:0004BE84 STR R3, [R8]
.text:0004BE88 B loc_4BF20
.text:0004BE88
.text:0004BE8C ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0004BE8C
.text:0004BE8C loc_4BE8C ; CODE XREF: sub_4BDD4+4Cj
.text:0004BE8C BL sub_30A28 ====》注意这个call(1)
.text:0004BE8C
.text:0004BE90 CMP R0, #0
.text:0004BE94 BEQ loc_4BEB4
.text:0004BE94
.text:0004BE98 LDR R1, =unk_62C0C
.text:0004BE9C MOVL R2, 0xFFFFFFFF
.text:0004BEA0 ADD R0, R1, #0x1C
.text:0004BEA4
.text:0004BEA4 loc_4BEA4 ; CODE XREF: sub_4BDD4+D8j
.text:0004BEA4 STR R2, [R1],#4
.text:0004BEA8 CMP R1, R0
.text:0004BEAC BNE loc_4BEA4
.text:0004BEAC
.text:0004BEB0 B loc_4BF20
.text:0004BEB0
.text:0004BEB4 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0004BEB4
.text:0004BEB4 loc_4BEB4 ; CODE XREF: sub_4BDD4+C0j
.text:0004BEB4 BL sub_4C1D0 =======>还有这个call的返回值
.text:0004BEB4
.text:0004BEB8 LDR R1, =unk_62C0C
.text:0004BEBC MOV R3, R0=====> 返回值传给r3寄存器
.text:0004BEC0 ADD R0, R1, #0x1C
.text:0004BEC4
.text:0004BEC4 loc_4BEC4 ; CODE XREF: sub_4BDD4+F8j
.text:0004BEC4 STR R3, [R1],#4
.text:0004BEC8 CMP R1, R0
.text:0004BECC BNE loc_4BEC4
.text:0004BECC
.text:0004BED0 CMP R3, #0==========>这里判断是否为0如果是则表示程序过期
.text:0004BED4 BNE loc_4BF20===》这是个关键跳转过期则不跳下面的代码是显示过期对话框的
.text:0004BED4
.text:0004BED8 ADD R0, SP, #0x84+var_84
.text:0004BEDC BL sub_3A770
.text:0004BEDC
.text:0004BEE0 ADD R0, SP, #0x84+var_5C
.text:0004BEE4 BL sub_3E0BC
.text:0004BEE4
.text:0004BEE8 LDR R3, =off_5B40C
.text:0004BEEC LDR R0, =off_5B404
.text:0004BEF0 STR R3, [SP,#0x84+var_84]
.text:0004BEF4 STR R0, [SP,#0x84+var_5C]
.text:0004BEF8 BL GetActiveWindow
.text:0004BEF8
.text:0004BEFC MOV R1, R0
.text:0004BF00 MOV R2, #0
.text:0004BF04 ADD R0, SP, #0x84+var_84
.text:0004BF08 BL sub_3E054
.text:0004BF08
.text:0004BF0C CMN R0, #1
.text:0004BF10 BNE loc_4BF18
========================================================
.text:0004BEB4地址的日期判断分析
========================================================
.text:0004C1D4 SUB SP, SP, #0x44 ; lpData
.text:0004C1D8 LDR R4, =aSoftwareMicros
.text:0004C1DC ADD R0, SP, #0x58+hKey
.text:0004C1E0 MOV R3, #sub_20000
.text:0004C1E4 STR R0, [SP,#0x58+lpData]
.text:0004C1E8 MOV R7, #0
.text:0004C1EC ORR R3, R3, #0x19 ; samDesired
.text:0004C1F0 STR R7, [SP,#0x58+hKey]
.text:0004C1F4 MOV R2, #0 ; ulOptions
.text:0004C1F8 MOV R1, R4 ; lpSubKey
.text:0004C1FC MOV R0, #0x80000001 ; hKey
.text:0004C200 BL RegOpenKeyExW
.text:0004C200
.text:0004C204 CMP R0, #0
.text:0004C208 BNE loc_4C34C
.text:0004C208
.text:0004C20C ADD R0, SP, #0x58+var_40
.text:0004C210 LDR R5, =aProxySharpv1_9
.text:0004C214 ADD R1, SP, #0x58+var_34
.text:0004C218 STR R0, [SP,#0x58+cbData]
.text:0004C21C STR R1, [SP,#0x58+lpData]
.text:0004C220 MOV R6, #0x10
.text:0004C224 LDR R0, [SP,#0x58+hKey] ; hKey
.text:0004C228 ADD R3, SP, #0x58+Type ; lpType
.text:0004C22C MOV R2, #0 ; lpReserved
.text:0004C230 STR R6, [SP,#0x58+var_40]
.text:0004C234 MOV R1, R5 ; lpValueName
.text:0004C238 BL RegQueryValueExW
.text:0004C238
.text:0004C23C CMP R0, #0
.text:0004C240 BNE loc_4C2CC
.text:0004C240
.text:0004C244 ADD R0, SP, #0x58+SystemTime ; lpSystemTime
.text:0004C248 BL GetLocalTime=========》取本地时间
.text:0004C248
.text:0004C24C LDRH R0, [SP,#0x58+SystemTime]
.text:0004C250 LDRH R3, [SP,#0x58+var_34]
.text:0004C254 MOV R0, R0,LSL#16
.text:0004C258 LDRH R5, [SP,#0x58+SystemTime.wMonth]===》取月
.text:0004C25C MOV R1, R0,LSR#16
.text:0004C260 LDRH R6, [SP,#0x58+var_34+2]
.text:0004C264 MOV R2, R3,LSL#16
.text:0004C268 MOV R0, #0x16C
.text:0004C26C SUB R2, R1, R2,LSR#16
.text:0004C270 ORR R0, R0, #1
.text:0004C274 MUL R4, R2, R0
.text:0004C278 MOV R0, R5,LSL#16
.text:0004C27C MOV R1, R0,LSR#16
.text:0004C280 MOV R3, R6,LSL#16
.text:0004C284 SUB R2, R1, R3,LSR#16
.text:0004C288 MOV R0, #0x1E
.text:0004C28C MLA R3, R2, R0, R4
.text:0004C290 LDRH R0, [SP,#0x58+var_2E]
.text:0004C294 MOV R1, R0,LSL#16
.text:0004C298 LDRH R0, [SP,#0x58+SystemTime.wDay]取天
.text:0004C29C SUB R2, R3, R1,LSR#16
.text:0004C2A0 MOV R1, R0,LSL#16
.text:0004C2A4 ADDS R3, R2, R1,LSR#16
.text:0004C2A8 BMI loc_4C338
.text:0004C2A8
.text:0004C2AC CMP R3, #0x17 ===》r3是已用天数和23比较看看是不是过期
.text:0004C2B0 BGE loc_4C338
.text:0004C2B0
.text:0004C2B4 LDR R0, [SP,#0x58+hKey] ; hKey
.text:0004C2B8 RSB R7, R3, #0x17
.text:0004C2BC BL RegCloseKey
.text:0004C2BC
.text:0004C2C0 MOV R0, R7
.text:0004C2C4 ADD SP, SP, #0x44
.text:0004C2C8 LDMFD SP!, {R4-R7,PC} ; lpData
.text:0004C2C8
.text:0004C2CC ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0004C2CC
.text:0004C2CC loc_4C2CC ; CODE XREF: sub_4C1D0+70j
.text:0004C2CC ADD R0, SP, #0x58+var_34 ; lpSystemTime
.text:0004C2D0 BL GetLocalTime
.text:0004C2D0
.text:0004C2D4 STR R7, [SP,#0x58+lpSecurityAttributes]
.text:0004C2D8 ADD R3, SP, #0x58+var_38
.text:0004C2DC STR R7, [SP,#0x58+cbData]
.text:0004C2E0 ADD R0, SP, #0x58+hKey
.text:0004C2E4 STR R3, [SP,#0x58+lpdwDisposition]
.text:0004C2E8 STR R0, [SP,#0x58+phkResult]
.text:0004C2EC MOV R3, #0 ; lpClass
.text:0004C2F0 MOV R2, #0 ; Reserved
.text:0004C2F4 STR R7, [SP,#0x58+lpData]
.text:0004C2F8 MOV R1, R4 ; lpSubKey
.text:0004C2FC MOV R0, #0x80000001 ; hKey
.text:0004C300 BL RegCreateKeyExW=====》建立一个新的注册表键值
.text:0004C300
.text:0004C304 CMP R0, #0
.text:0004C308 MOVNE R0, #0x17
.text:0004C30C ADDNE SP, SP, #0x44
.text:0004C310 LDMNEFD SP!, {R4-R7,PC}
.text:0004C314 STR R6, [SP,#0x58+cbData]
.text:0004C318 ADD R0, SP, #0x58+var_34
.text:0004C31C STR R0, [SP,#0x58+lpData]
.text:0004C320 MOV R3, #3 ; dwType
.text:0004C324 MOV R2, #0 ; Reserved
.text:0004C328 MOV R1, R5 ; lpValueName
.text:0004C32C LDR R0, [SP,#0x58+hKey] ; hKey
.text:0004C330 BL RegSetValueExW =====》写入注册表键值,这部分是处理第一次试用建立的日期时间
.text:0004C330
.text:0004C334 MOV R7, #0x17
.text:0004C338
.text:0004C338 loc_4C338 ; CODE XREF: sub_4C1D0+D8j
.text:0004C338 ; sub_4C1D0+E0j
.text:0004C338 LDR R0, [SP,#0x58+hKey] ; hKey
.text:0004C33C BL RegCloseKey
.text:0004C33C
.text:0004C340 MOV R0, R7
.text:0004C344 ADD SP, SP, #0x44
.text:0004C348 LDMFD SP!, {R4-R7,PC}
.text:0004C348
.text:0004C34C ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0004C34C
.text:0004C34C loc_4C34C ; CODE XREF: sub_4C1D0+38j
.text:0004C34C LDR R7, [SP,#0x58+var_38]
.text:0004C350 MOV R0, R7
.text:0004C354 ADD SP, SP, #0x44
.text:0004C358 LDMFD SP!, {R4-R7,P
========================================================

--------------------------------------------------------------------------------
【经验总结】
经过分析发现.text:0004BEB4是日期判断的关键改法有很多!比较好的一个改发就是
改0004C240 BNE loc_4C2CC========》BAL loc_4C2CC即可去处日期限制!
用winhex改完存盘测试ok!这个程序是我破解的第一个ppc程序总体感觉ppc的程序只要有毅力和耐心还是比较容易破解的!
如果用ida想调试ppc程序的话必须有有一台智能手机pda,没有手机听说可以用模拟器来调试!其实这个
程序还有可以再解的完美些!注意.text:0004BE8C(1)处的call经过分析发现这个call是注册码验证的call,我是赖的分
析了
有兴趣的朋友可以自己研究!再次感谢你耐心的看完这篇文章,希望对想研究PocketPC破解的初学者有所帮助!

--------------------------------------------------------------------------------
【版权声明】: 本文原创于大老主页, 转载请注明作者并保持文章的完整, 谢谢!

2006年07月09日 凌晨02:59:20