- UID
- 9863
注册时间2006-3-21
阅读权限10
最后登录1970-1-1
周游历练
TA的每日心情 | 慵懒 2015-12-17 23:46 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
昨天拿出N年前买的古董PPC,传上几本电子书,顺便找了个中国象棋游戏CChess v2.1装上,运行后显示未注册只能用7天。可能软件太不出名,没搜到注册码。由于没搞过PPC,也不懂ARM汇编,报着碰运气的观点,用IDA逆向了一下,还真找到关键代码了:
.text:00015018 CMP R0, R3
.text:0001501C MOV R0, R4
.text:00015020 BNE loc_15058
.text:00015024 LDR R2, =aCchess2_1_2
.text:00015028 MOV R3, #0x40
.text:0001502C LDR R1, =aRegisterSucces
.text:00015030 BL _MessageBoxW_CWnd__QAAHPBG0I_Z ; CWnd::MessageBoxW(ushort const *,ushort const *,uint)
.text:00015034 BL sub_15A94
.text:00015038 LDR R0, =unk_37858
.text:0001503C MOV R1, #0x63
.text:00015040 STR R1, [R0]
.text:00015044 B loc_15068
.text:00015044 ; -------------------------------------?
.text:00015048 off_15048 DCD unk_37858 ; DATA XREF: sub_14EB8+180r
.text:0001504C off_1504C DCD aRegisterSucces ; DATA XREF: sub_14EB8+174r
.text:0001504C ; "Register Success! Thank you!"
.text:00015050 off_15050 DCD aCchess2_1_2 ; DATA XREF: sub_14EB8+16Cr
.text:00015050 ; "CChess2.1"
.text:00015054 off_15054 DCD unk_37854 ; DATA XREF: sub_14EB8:loc_14FF8r
.text:00015058 ; -------------------------------------?
.text:00015058
.text:00015058 loc_15058 ; CODE XREF: sub_14EB8+168j
.text:00015058 LDR R2, =aCchess2_1_3
.text:0001505C MOV R3, #0x10
.text:00015060 LDR R1, =aRegisterFailed
.text:00015064 BL _MessageBoxW_CWnd__QAAHPBG0I_Z ; CWnd::MessageBoxW(ushort const *,ushort const *,uint)
.text:00015068
.text:00015068 loc_15068 ; CODE XREF: sub_14EB8+18Cj
.text:00015068 MOV R0, R4
.text:0001506C
.text:0001506C loc_1506C ; CODE XREF: sub_14EB8+150j
.text:0001506C MOV R1, #1
.text:00015070 BL _EndDialog_CDialog__QAAXH_Z ; CDialog::EndDialog(int)
.text:00015074 B loc_15298
虽然不懂ARM的汇编,但是发现和MSIL有点相似,LDR代表读取地址,B代码分支(branch)。看来关键的比较就是这句.text:00015020 BNE loc_15058,不相同则跳到出错框,相等就注册成功,典型的爆破。
下面就是咋修改了,下了ARM指令的说明,没找到NOP类似的空语句,可是发现ARM的指令都是4字节的。晕,那就干脆把BNE换成LDR R2, =aCchess2_1_2,反正这条语句运行两遍也没关系。
用UltraEdit打开文件,将0x00004420处的0C 00 00 1A换为LDR的数据24 20 9F E5,保存,上传。
注册时啥也不输入,点击register,搞定。呵呵,以后入睡前可以在古董PPC上玩会儿象棋了。 |
|