Tulisan Dasar Cracking
Selamat Datang................. Cracker..........
Symbian Cracking :

Stacker v2.02

Tools:
------
IDA Pro v4.04 or higher, I use ver 4.30
Hex Editor, aku punya WinHex

Target:
-------
SymbianWare Stacker v2.02

Saatnya Kita Mulai:
-----------
Jalankan programnya. Amati semua yang ada dilayar.
Setelah itu...

Buka stacker.app dengan Hex Editor dan amati semua kode dan huruf ascii. Pada alamat pertama di offset 0x10 kamu akan melihat "EPOC" yang berarti file EPOC dipakai pada aplikasi Symbian OS.

Turun kebawah dan kamu akan menemukan beberapa Unicode string diantara offset 0x76C0 dan 0x7FA0.

Apa yang kita baca?? Beberapa kata dan pesan yang berasal dari program stacker?
Ya, betul.

Sekarang kita lihat lebih dekat pada offset 0x7F18:

00007F18 U.n.r.e.g.i.s.t.e.r.e.d.!. .T.r.i.a.l. .i.s. .o.v.e.r....... ....... .d.
00007F60 a.y.s. .l.e.f.t. .t.o. .e.x.p.i.r.e.....U.n.r.e.g.i.s.t.e.r.e.d.

Woohh! Kita menemukan kata yang ada pada nag box pada saat stacker kita jalankan pertama kali. Catat alamatnya

Buka IDA...

Buka stacker.app.
Mark Load resources. Trus tekan OK!.

Sekarang IDA menampilkan disassembler ARM instruksi kode. Kamu boleh menjalankan Options/General/Auto Comments untuk penjelasan beberapa kode...

Sekarang turun kebawah sampai kamu menemukan offset yang kamu catat tadi.

. text:10007E9C dword_0_10007E9C DCD 0x6E0055, 0x650072, 0x690067, 0x740073,
.text:10007E9C 0x720065, 0x640065 ; DATA XREF: .text:10005830
.text:10007E9C DCD 0x200021, 0x720054, 0x610069, 0x20006C, 0x730069,
.text:10007E9C DCD 0x6F0020, 0x650076, 0x2E0072, 0
.text:10007ED8 dword_0_10007ED8 DCD 0xA0020, 0 ; DATA XREF: .text:100058A4

Sekarang klik kanan pada angka, pilih Undefine trus kita akan menuju:

. text:10007E9C unk_0_10007E9C DCB 0x55 ; U ; DATA XREF: .text:10005830o
.text:10007E9D DCB 0 ;
.text:10007E9E DCB 0x6E ; n
.text:10007E9F DCB 0 ;
.text:10007EA0 DCB 0x72 ; r
.text:10007EA1 DCB 0 ;
.text:10007EA2 DCB 0x65 ; e
.text:10007EA3 DCB 0 ;
.text:10007EA4 DCB 0x67 ; g
.text:10007EA5 DCB 0 ;
.text:10007EA6 DCB 0x69 ; i
.text:10007EA7 DCB 0 ;
.text:10007EA8 DCB 0x73 ; s
.text:10007EA9 DCB 0 ;
.text:10007EAA DCB 0x74 ; t
.text:10007EAB DCB 0 ;
.text:10007EAC DCB 0x65 ; e
.text:10007EAD DCB 0 ;
.text:10007EAE DCB 0x72 ; r
.text:10007EAF DCB 0 ;
.text:10007EB0 DCB 0x65 ; e
.text:10007EB1 DCB 0 ;
.text:10007EB2 DCB 0x64 ; d
.text:10007EB3 DCB 0 ;
.text:10007EB4 DCB 0x21 ; !
.text:10007EB5 DCB 0 ;
...............................................

Klik kanan pada "DATA XREF: .text:10005830o",
Pilih Jump dan klik OK. Kita ada pada:

.text:10005830 off_0_10005830 DCD loc_0_10007E9C ; DATA XREF: .text:1000580Cr

Klik kanan pada "DATA XREF: .text:1000580Cr", Pilih Jump dan klik OK. Akhirnya kita ada pada alamat:

.text:1000580C LDR R1, =dword_0_10007E9C ; Load from Memory

LDR adalah instruksi untuk meload string dari memory.
Jadi kita geser keatas untuk melihat beberapa kode sebelumnya

.text:100057BC BL sub_0_1000538C ; Branch with Link
.text:100057C0 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:100057C4 BNE loc_0_100058B0 ; Branch <<<<<<<
.text:100057C8 MOV R0, R4 ; Rd = Op2
.text:100057CC BL loc_0_100054C4 ; Branch with Link
.text:100057D0 SUBS R7, R0, #0 ; Rd = Op1 - Op2
.text:100057D4 BEQ loc_0_10005834 ; Branch <<<<<<<
.text:100057D8 BL loc_0_10006168 ; Branch with Link
.text:100057DC LDR R1, =0x5BED5021 ; Load from Memory
.text:100057E0 LDR R2, =0x5BED5020 ; Load from Memory
.text:100057E4 BL loc_0_100064A8 ; Branch with Link
.text:100057E8 MOV R0, R4 ; Rd = Op2
.text:100057EC BL loc_0_10005230 ; Branch with Link
.text:100057F0 MOV R0, R4 ; Rd = Op2
.text:100057F4 BL sub_0_1000538C ; Branch with Link
.text:100057F8 CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:100057FC BNE loc_0_100058B4 ; Branch <<<<<<<
.text:10005800 BL loc_0_10006168 ; Branch with Link
.text:10005804 MOV R4, R0 ; Rd = Op2
.text:10005808 ADD R0, SP, #0x20 ; Rd = Op1 + Op2
.text:1000580C LDR R1, =dword_0_10007E9C ; Load from Memory <--- Stupid String
.text:10005810 BL loc_0_10005B48 ; Branch with Link

Seperti yang kamu lihat ada tiga cabang conditional untuk menghindari string dimasukkan ke memori.
Ditandai dengan <<<<<<< yang berarti sepertinya program mengecek status register atau belum. Jika belum akan masuk ke string "unregistered".

Lebih ok bila kita mengecek BL sebelum branch. Kenapa? Kita terangkan codenya:

.text:100057BC BL sub_0_1000538C ; Branch with Link

Sebuah branch (call) ke satu fungsi. (BL selalu kembali instruksi selanjutnya)
Juga memberi hasil satu atau lebih terhadap register.

.text:100057C0 CMP R0, #0 ; Set cond. codes on Op1 - Op2

Register R0 dibandingkan dengan 0 (null).

.text:100057C4 BNE loc_0_100058B0 ; Branch if not equal

Jika R0 bukan 0 branch akan jalan, jika R0 adalah 0 tidak akan terjadi sesuatu.

Jadi kita harus memastikan bahwa hasil dari fungsi call (BL) bukan 0. Kemudian branch akan jalan sehingga program menjadi register.

OK. Kita mulai dengan kode yang satu ini:

.text:100057C4!
Klik kanan di BL sub_0_1000538C,
pilih jump dan kamu akan lihat:

.text:1000538C ; S U B R O U T I N E
.text:1000538C
.text:1000538C sub_0_1000538C ; CODE XREF: sub_0_100003F8+480p
.text:1000538C ; sub_0_100050CC+188p ...
.text:1000538C STMFD SP!, {R4,LR} ; Store Block to Memory
.text:10005390 SUB SP, SP, #8 ; Rd = Op1 - Op2
.text:10005394 MOV R4, R0 ; Rd = Op2
.text:10005398 LDR R3, [R4,#0xF8] ; Load from Memory
.text:1000539C CMP R3, #0 ; Set cond. codes on Op1 - Op2
.text:100053A0 BEQ loc_0_100053C4 ; Branch
.text:100053A4 MOV R0, SP ; Rd = Op2
.text:100053A8 LDR R1, =dword_0_10007D64 ; Load from Memory
.text:100053AC BL loc_0_10005B48 ; Branch with Link
.text:100053B0 MOV R0, R4 ; Rd = Op2
.text:100053B4 MOV R1, SP ; Rd = Op2
.text:100053B8 BL loc_0_10005C48 ; Branch with Link
.text:100053BC CMP R0, #0 ; Set cond. codes on Op1 - Op2
.text:100053C0 BNE loc_0_100053D0 ; Branch
.text:100053C4
.text:100053C4 loc_0_100053C4 ; CODE XREF: sub_0_1000538C+14j
.text:100053C4 MOV R0, #0 ; Rd = Op2
.text:100053C8 B loc_0_100053EC ; Branch
.text:100053C8 ; ---------------------------------------------------------------------------
.text:100053CC off_0_100053CC DCD dword_0_10007D64 ; DATA XREF: sub_0_1000538C+1Cr
.text:100053D0 ; ---------------------------------------------------------------------------
.text:100053D0
.text:100053D0 loc_0_100053D0 ; CODE XREF: sub_0_1000538C+34j
.text:100053D0 MOV R0, R4 ; Rd = Op2
.text:100053D4 MOV R1, R4 ; Rd = Op2
.text:100053D8 BL sub_0_100050CC ; Branch with Link
.text:100053DC LDR R3, [R4,#0xF8] ; Load from Memory
.text:100053E0 CMP R0, R3 ; Set cond. codes on Op1 - Op2
.text:100053E4 MOVNE R0, #0 ; Rd = Op2
.text:100053E8 MOVEQ R0, #1 ; Rd = Op2
.text:100053EC
.text:100053EC loc_0_100053EC ; CODE XREF: sub_0_1000538C+3Cj
.text:100053EC ADD SP, SP, #8 ; Rd = Op1 + Op2
.text:100053F0 LDMFD SP!, {R4,LR} ; Load Block from Memory
.text:100053F4 BX LR ; Branch to/from Thumb mode

Sekarang kita ingat: 0 adalah tidak register, bukan 0 adalah register.
Kita lihat yang lain selain 0 dimasukkan diregister R0. Ketemu?

.text:100053E8 MOVEQ R0, #1 ; move if equal

Jika instruksi cmp sebelum move sama dengan 1 maka akan dimasukkan di R0.

Tapi kita juga punya dua instruksi dimana 0 dimasukkan juga di R0.

.text:100053C4 MOV R0, #0 ; move
.text:100053E4 MOVNE R0, #0 ; move if not equal

Apa yang harus kita lakukan? Ketika kita melihat susunan kodenya, kita akan melihat dua cara untuk mengakhiri.

Salah satunya adalah

.text:100053C4 loc_0_100053C4 ; CODE XREF: sub_0_1000538C+14j

Yang kedua adalah

.text:100053D0 loc_0_100053D0 ; CODE XREF: sub_0_1000538C+34j

Kita butuh cara yang tepat untuk mengakhirinya dan harus ada 1 diregister R0.
Mari kita lakukan:

Ganti

.text:100053A0 BEQ loc_0_100053C4 ; Branch if equal

menjadi

.text:100053A0 B loc_0_100053C4 ; Branch always

sehingga branch selalu dijalankan.

Juga ganti

.text:100053C4 MOV R0, #0 ; R0 = 0

menjadi

.text:100053C4 MOV R0, #1 ; R0 = 1

sehingga 1 selalu dimasukkan diregister R0!

Susunan kodenya menjadi

.text:1000538C ; S U B R O U T I N E
.text:1000538C
.text:1000538C
.text:1000538C sub_0_1000538C ; CODE XREF: sub_0_100003F8+480p
.text:1000538C ; sub_0_100050C8+18Cp ...
.text:1000538C STMFD SP!, {R4,LR} ;
.text:10005390 SUB SP, SP, #8 ;
.text:10005394 MOV R4, R0 ;
.text:10005398 LDR R3, [R4,#0xF8] ;
.text:1000539C CMP R3, #0 ;
.text:100053A0 B loc_0_100053C4 ; Branch always <<<<<<< Changed
.text:100053A4 ; ---------------------------------------------------------------------------
.text:100053A4 MOV R0, SP ; .............All
.text:100053A8 LDR R1, =dword_0_10007D64 ; .......these
.text:100053AC BL loc_0_10005B48 ; .............instructions
.text:100053B0 MOV R0, R4 ; .............are
.text:100053B4 MOV R1, SP ; .............never
.text:100053B8 BL loc_0_10005C48 ; .............executed!!!
.text:100053BC CMP R0, #0 ; .............
.text:100053C0 BNE loc_0_100053D0 ; .............
.text:100053C4
.text:100053C4 loc_0_100053C4 ; CODE XREF: sub_0_1000538C+14j
.text:100053C4 MOV R0, #1 ; move R0 = 1 <<<<<<<< Changed
.text:100053C8 B loc_0_100053EC ;
.text:100053C8 ; ---------------------------------------------------------------------------
.text:100053CC off_0_100053CC DCD dword_0_10007D64 ; DATA XREF: sub_0_1000538C+1Cr
.text:100053D0 ; ---------------------------------------------------------------------------
.text:100053D0
.text:100053D0 loc_0_100053D0 ; CODE XREF: sub_0_1000538C+34j
.text:100053D0 MOV R0, R4 ; .............
.text:100053D4 MOV R1, R4 ; .............
.text:100053D8 BL loc_0_100050CC ; .............These
.text:100053DC LDR R3, [R4,#0xF8] ; .............also!
.text:100053E0 CMP R0, R3 ; .............
.text:100053E4 MOVNE R0, #0 ; .............
.text:100053E8 MOVEQ R0, #1 ; .............
.text:100053EC
.text:100053EC loc_0_100053EC ; CODE XREF: sub_0_1000538C+3Cj
.text:100053EC ADD SP, SP, #8 ;
.text:100053F0 LDMFD SP!, {R4,LR} ;
.text:100053F4 BX LR ; back

Kita hampir finish.

Sekarang kita tulis alamat offsets dari dua instruksi.
Yang pertama ada di 0x541C,

yang kedua ada di 0x5440.

Masuk ke Hex Editor dan lihat pada offset pertama:

0000541C 07 00 00 0A ã.... <<< this is the branch if equal instruction

ganti 0A menjadi EA

0000541C 07 00 00 EA ã...ê <<< this means branch always

Instruksi kedua yang harus kita ganti ada di

00005440 00 00 A0 E3 .. ã <<< move R0, 0

ganti 00 yang pertama dengan 01

00005440 01 00 A0 E3 .. ã <<< move R0, 1

YeaaHH! We got it!!!!!

WebMaster
Terus      Kembali
Komentar dan Mailing List
Crack One Software Every Day Make You The Real Cracker