【目标程序】: PPCMorse V 1.1
【破解目的】: 让程序自己弹出注册码
【应用平台】: PocketPC
【作者声明】: 只是感兴趣,没有其他目的,看到论坛有兄弟需要,才献丑了。失误之处敬请诸位大侠赐教。
【调试环境】:WinXP、IDA pro 5.2 、Windows Mobile 6.0 模拟器包 for Pocket PC、lordpe
还有Yonsm大侠的CeleASM,用于查找对应机器码。
【联系方式】:emb2001@163.com QQ:50540415 欢迎来信交流
―――――――――――――――――――――――――――――――――
【分析过程】:
1、现在我们该开始了。如果你已经有过破解Windows软件的经验,再和PPC操作系统打交道就比较容易了。先熟悉一下软件,点Settings下Registration菜单,出现注册界面。输入任意注册后,没有提示就退出了。
图01
2、运行前面提到的IDA工具。当IDA 问你处理器的种类(processor type)时,请选择ARM Processor: ARM就可以了。
图02
图03
3、用IDA分析完毕后,回到IDA用shift+F4打开the names window搜索“OK”,这个字符串来自软件注册的OK按钮。
图04
CDialog::OnOK(void) 0001778C
应该差不多就是与注册算法相关的信息了。
往上溯
图05
t:0001778C
.text:0001778C ; =============== S U B R O U T I N E =======================================
.text:0001778C
.text:0001778C ; Attributes: thunk
.text:0001778C
.text:0001778C ; protected: virtual void __cdecl CDialog::OnOK(void)
.text:0001778C _OnOK_CDialog__MAAXXZ ; CODE XREF: .text:00015F2C_p
.text:0001778C ; sub_16760+E4_p ...
.text:0001778C 00 C0 9F E5 LDR R12, =__imp__OnOK_CDialog__MAAXXZ
.text:00017790 00 F0 9C E5 LDR PC, [R12]
.text:00017790 ; End of function CDialog::OnOK(void)
4、在.text:0001778C 00 C0 9F E5 LDR R12, =__imp__OnOK_CDialog__MAAXXZ 按F2下断点,按F9运行。
模拟器中软件已运行,点Settings下Registration菜单,出现注册界面。输入任意注册码后,点OK后断下。
图06
观察LR的值,往上溯。
图07
图08
5、清除原有断点,在.text:00016818 loc_16818下,按F9运行。重新输入任意注册码后,点OK后断下。按F8步进。
.text:00016818 loc_16818
.text:00016818 LDR R4, =unk_1C1C0
.text:0001681C MOV R0, #0
.text:00016820 STR R0, [R4]
.text:00016824 LDR R0, =unk_1C100
.text:00016828 LDR R1, [R0] ; wchar_t * 准确注册码的unicode
.text:0001682C LDR R0, [R5] ; wchar_t * 输入假码的unicode
.text:00016830 BL wcscmp 比较
.text:00016834 MOVS R3, R0
.text:00016838 MOVEQ R0, #1
.text:0001683C STREQ R0, [R4]
.text:00016840 MOV R0, R6
.text:00016844 BL _OnOK_CDialog__MAAXXZ ; CDialog::OnOK(void)
.text:00016848 ADD R0, SP, #0x430+var_430
.text:0001684C BL __1CString__QAA_XZ ; CString::~CString(void)
.text:00016850 LDR R0, =off_19118
.text:00016854 STR R0, [SP,#0x430+var_428]
.text:00016858 ADD R0, SP, #0x430+var_428
.text:0001685C BL __1CFile__UAA_XZ ; CFile::~CFile(void)
.text:00016860 ADD SP, SP, #0x420
.text:00016864 LDMFD SP!, {R4-R6,PC}
.text:00016864 ; End of function sub_167
/////////////////////////////////////////////////////////////////////////////////////
//到此我们已经找到了注册码休息一下
////////////////////////////////////////////////////////////////////////////////////
6、pediy一下,让他弹出注册码,修改思路如下,可参照API资料。
.text:0001681C MOV R3, #0
.text:00016820 MOV R2, #0
.text:00016824 LDR R0, =unk_1C100
.text:00016828 LDR R1, [R0] 准确注册码的
.text:0001682C MOV R0, #0
.text:00016830 BL CWnd__MessageBoxW
打开IDA Imports window,搜索“MessageBoxW”。
图09
往上溯。
.text:000176CC ; =============== S U B R O U T I N E =======================================
.text:000176CC
.text:000176CC ; Attributes: thunk
.text:000176CC
.text:000176CC CWnd__MessageBoxW ; CODE XREF: .text:00012D3C_j
.text:000176CC ; sub_16760+D0_p
.text:000176CC 00 C0 9F E5 LDR R12, =__imp_CWnd__MessageBoxW
.text:000176D0 00 F0 9C E5 LDR PC, [R12]
.text:000176D0 ; End of function CWnd__MessageBoxW
.text:000176D0
找到MessageBoxW入口地址为000176CC
到现在可根据以下公式计算BL的偏移。
相对跳转,current为当前指令地址,des为目的地址,offset为偏移
if(current < dest + 8)
{
offset = (dest - current- 8)/4;
}else
{
offset = 0x1000000 - (current - dest +8 )/4;
}
因00016830 处调用 BL CWnd__MessageBoxW
计算offset = (176CC - 16830- 8)/4=3A5
BL的偏移得到了,就可以用Yonsm大侠的CeleASM查其它指令机器码了。
图10
7、万事俱备,总结一下。
.text:0001681C 00 30 A0 E3 MOV R3, #0 ; uType
.text:00016820 00 20 A0 E3 MOV R2, #0 ; lpCaption
.text:00016824 40 00 9F E5 LDR R0, =unk_1C100 原指令
.text:00016828 00 10 90 E5 LDR R1, [R0] ; lpText 原指令
.text:0001682C 00 00 A0 E3 MOV R0, #0 ; hWnd
.text:00016830 A5 03 00 EB BL CWnd__MessageBoxW
修改方法如下
先用lodepe的flc转化一下要修改的地址,再编辑后保存。
图11
图12
修改后如下图
图13
8、你现在运行这个软件看看,是不是成功了?
图14
/////////////////////////////////////////////////////////////////////////////////////
//第一次写教程,一个字“累”,比较破解软件本身累多了。终于可以休息了。
////////////////////////////////////////////////////////////////////////////////////
例子下载:
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
上传的附件: