首页
社区
课程
招聘
[原创]教你如何破解PocketPC程序[原创]
发表于: 2006-7-9 03:10 7359

[原创]教你如何破解PocketPC程序[原创]

2006-7-9 03:10
7359
【文章标题】: 【原创】教你如何破解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?threadid=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

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 5696
活跃值: (2542)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持大老,沙发先坐。
2006-7-9 09:34
0
雪    币: 93944
活跃值: (200219)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习
2006-7-9 09:39
0
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个的强,不过看不明白,只能作为保存
2006-7-9 09:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 小剑 发布
这个的强,不过看不明白,只能作为保存

这个也看不懂吗?
呵呵,汇编很容易看懂的。
破解只破解了前面的,后面的还没有解开
IDA静态分析是很强。

BTW: 我是其作者,请尊重国产软件,谢谢
2006-7-9 11:11
0
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
什么时候可以动态调试就好了.
2006-7-9 14:48
0
雪    币: 10500
活跃值: (2159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 zjfeng 发布
这个也看不懂吗?
呵呵,汇编很容易看懂的。
破解只破解了前面的,后面的还没有解开
IDA静态分析是很强。

........

这样说还有暗桩哦??
2006-7-9 15:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习,好象Ida4.9是不能动态调试的呀。要用5.0才行,可惜只见识过demo版的,谁有正式版奉献一下啊。
2006-7-9 18:15
0
雪    币: 11705
活跃值: (970)
能力值: ( LV12,RANK:779 )
在线值:
发帖
回帖
粉丝
9
向作者敬礼。

最初由 zjfeng 发布
BTW: 我是其作者,请尊重国产软件,谢谢
........
2006-7-9 19:14
0
雪    币: 1866
活跃值: (95)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
最初由 kryso 发布
什么时候可以动态调试就好了.

4.9的已经可以动态调试了!而且非常好用!
2006-7-10 22:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
IDA pro 4.9 FULL 支持PocketPC调试版

在那有得下啊???
2006-7-11 02:40
0
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 dalao 发布
4.9的已经可以动态调试了!而且非常好用!


可以了?比如一个游戏可以玩着来调试?
2006-7-11 03:23
0
雪    币: 367
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
小峰是无处不在啊
2006-7-11 08:34
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
怎么做到动态调试的?
讲讲方法
2006-7-11 15:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
在那有得下啊???
2006-7-11 15:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
bne
beq
b
nop
这些指令的机器码是多少啊?
2006-7-17 16:55
0
游客
登录 | 注册 方可回帖
返回
//