- Dòng thứ 2, nếu chưa đăng kí, lệnh nhảy sẽ tới nhãn L222, xóa cờ này đi. - Đây có thể là mấu chốt của vấn đề.Giờ ta chọn tab RCP, Find chuỗi: ”Enter your registration code”. Dừng tại đây. - Như thế, phần nhập Registration Code là một Form, có ID 1200.Cùng một cách đã làm ở những bước trước, ta được: FORM ID 1200 AT (2 2 156 156) ID của Form này MODAL BEGIN TITLE "Registration" LABEL "Enter your registration code :" ID 1201 AT (6 102) FONT 1 FIELD ID 1202 AT (14 118 128 16) EDITABLE SINGLELINE UNDERLINED LEFTALIGN MAXCHARS 12 FONT 2 BUTTON "OK" ID 1203 AT (64 140 36 12) LEFTANCHOR FONT 0 BUTTON "Cancel" ID 1204 AT (107 140 36 12) LEFTANCHOR FONT 0 FORMBITMAP AT (4 30) BITMAP 1000 LABEL "Biorhythm for Palm OS®" ID 1206 AT (22 14) FONT 2 LABEL "Registration removes\013launching progress bar." ID 1207 AT (40 35) FONT 1 LABEL "Get registration code at :\013 www.mobilisoft.com" ID 1208 AT (14 70) FONT 1 GRAFFITISTATEINDICATOR ID 147 142 BUTTON "Keyboard" ID 1210 AT (7 140 50 12) LEFTANCHOR FONT 0 END - Trong References của Form nay chỉ có một mục. Double-Click vào nó, tới Code sau: 00000a12 4a2dffb5 TST.B -75(A5) 00000a16 584f ADDQ.W #4,A7 00000a18 670e BEQ L52 00000a1a 3f3c0514 MOVE.W #1300!$514,-(A7) ; Registration 00000a1e 4e4fa16f TRAP #15,$A16F = sysTrapFrmInitForm 00000a22 2448 MOVEA.L A0,A2 00000a24 544f ADDQ.W #2,A7 00000a26 602c BRA L53 00000a28 3f3c04b0 L52 MOVE.W #1200!$4b0,-(A7) ; Registration 00000a2c 4e4fa16f TRAP #15,$A16F = sysTrapFrmInitForm - Ở đây cũng có kiểm tra(màu vàng), nếu TRUE thì nhày tới nhãn L52, ngược lại thì gọi Form ID 1300. Xem Form ID 1300 là cái gì nào: - Lệnh thứ 2 ta quan tâm là chỗ màu đỏ: 00000a12 4a2dffb5 TST.B -75(A5) - Nó sẽ làm cái wái gì đấy với ô nhớ tại địa chỉ A5-75. - Ta đã biết A5-75 là một cờ, nếu nó bật lên 1, tức là chương trình đã có Valid Serial. Ngược lại thì chưa có. - Ta cũng thấy chương trình sẽ MOV 1 vào ô nhớ này trước khi có thông báo “đã đăng kí !”. Và cờ này sẽ được bật suốt khi chương trình đang chạy. Ngoài ra cũng có chỗ sẽ xóa cờ này đi nếu serial nhập vào là sai. Quay lại đoạn Code bung NAG nào, Alert ID 1100: 00001c50 4a00 TST.B D0 00001c52 4fef000c LEA 12(A7),A7 00001c56 6712 BEQ L222 00001c58 1b7c0001ffb5 MOVE.B #1,-75(A5) 00001c5e 3f3c03e8 MOVE.W #1000!$3e8,-(A7) ; Registered ! 00001c62 4e4fa192 TRAP #15,$A192 = sysTrapFrmAlert 00001c66 544f ADDQ.W #2,A7 00001c68 600e BRA L223 FORM ID 1300 AT (2 2 156 156) MODAL BEGIN TITLE "Registration" LABEL "You can check for updates at :\013 www.mobilisoft.com" ID 1301 AT (6 102) FONT 1 BUTTON "Close" ID 1303 AT (55 135 46 12) LEFTANCHOR FONT 0 FORMBITMAP AT (4 30) BITMAP 1000 00001c6a 422dffb5 L222 CLR.B -75(A5) 00001c6e 3f3c044c MOVE.W #1100!$44c,-(A7) ; Not registered ! 00001c72 4e4fa192 TRAP #15,$A192 = sysTrapFrmAlert - Trước lệnh so sánh để nhảy, cũng có TST.B, khi đăng kí chương trình, nó cũng sẽ làm gì đó với thanh ghi D0. Nếu kết quả trả về sai- tức lệnh nhảy ko xảy ra, cờ tại A5-75 sẽ được bật. Như thế, ta luôn muốn cờ tại A5-75 được bật. Giờ hãy tìm các nơi ô nhớ này được dùng tới. - Có 6 vị trí liên quan tới A5-75: - Tham chiếu tới từng em, gom lại được như sau: 1) 00000a12 4a2dffb5 TST.B -75(A5) 2) 00000c8e 1b40ffb5 MOVE.B D0,-75(A5) 3) 00000f5e 422dffb5 CLR.B -75(A5) 4) 00001c58 1b7c0001ffb5 MOVE.B #1,-75(A5) 5) 00001c6a 422dffb5 L222 CLR.B -75(A5) 6) 00001c78 102dffb5 L223 MOVE.B -75(A5),D0 - Dòng 1) sẽ kiểm tra giá trị tại A5-75, để xem nên hiện Form đăng kí hay Form thông báo “Already Registered !”(khác Alert “Registered”) - Dòng 3) sẽ xóa cờ tại A5-75 nếu số Serial nhập vào sai. - Dòng 4), 5) sẽ bật cờ tại A5-75. - Dòng 6) đưa giá trị tại A5-75 vào thanh ghi D0. - Và dòng 2) chính là nơi ta đang tìm. Đưa giá trị của D0 vào A5-75. - D0 chứa địa chỉ một ô nhớ khác, cũng có thể coi đây là một biến. Lúc là 0, lúc là 1(suy ra như thế vì nó MOV vào A5-75). Ta sẽ xem đoạn code tại dòng 2) như thế nào: 00000c80 2f0b MOVE.L A3,-(A7) 00000c82 4e4fa171 TRAP #15,$A171 = sysTrapFrmDrawForm 00000c86 486dffdc PEA -36(A5) 00000c8a 4eba0e1c JSR L211 00000c8e 1b40ffb5 MOVE.B D0,-75(A5) 00000c92 4fef000c LEA 12(A7),A7 00000c96 6608 BNE L71 - Như đã phân tích ở trên, việc đã đăng kí hay chưa tùy thuộc vào cờ tại A5-75 hay nói chính xác là tại D0. Vậy ta cần biết chuyện gì xảy ra với D0 trước khi tới dòng lệnh XANH. Xem ngay trên nó nào: 00000c8a 4eba0e1c JSR L211 - Lệnh này nhảy tới một subroutine hay một hàm(giống lệnh CALL nhỉ?). Ta cũng thấy nó trước đoạn code bung NAG ,xem lại Alert ID 1100: 00001c4c 4ebafe5a JSR L211 00001c50 4a00 TST.B D0 00001c52 4fef000c LEA 12(A7),A7 00001c56 6712 BEQ L222 00001c58 1b7c0001ffb5 MOVE.B #1,-75(A5) 00001c5e 3f3c03e8 MOVE.W #1000!$3e8,-(A7) ;Registered ! 00001c62 4e4fa192 TRAP #15,$A192 = sysTrapFrmAlert 00001c66 544f ADDQ.W #2,A7 00001c68 600e BRA L223 00001c6a 422dffb5 L222 CLR.B -75(A5) 00001c6e 3f3c044c MOVE.W #1100!$44c,-(A7) ; Not registered ! - Như thế, ở nhãn L211(máy các lão có thể khác) đã có gì xảy ra với D0. Click phải tại lệnh nhảy này, chọn: - Ta sẽ bay tới nhãn này: . ID 11 00 : 00 001 c4c 4ebafe5a JSR L 211 00 001 c 50 4a 00 TST.B D0 00 001 c52 4fef 000 c LEA 12 (A7),A7 00 001 c56 6 712 BEQ L222 00 001 c58 1b7c 000 1ffb5 MOVE.B #1, -75(A5) 00 001 c5e 3f3c03e8 MOVE.W # 10 00! $3e8,-(A7). 11 00 : 00 001 c 50 4a 00 TST.B D0 00 001 c52 4fef 000 c LEA 12 (A7),A7 00 001 c56 6 712 BEQ L222 00 001 c58 1b7c 000 1ffb5 MOVE.B #1, -75(A5) 00 001 c5e 3f3c03e8 MOVE.W # 10 00! $3e8,-(A7) ; Registered ! 00 001 c62. nào: 00 000 c 80 2f0b MOVE.L A3,-(A7) 00 000 c82 4e4fa1 71 TRAP #15 ,$A1 71 = sysTrapFrmDrawForm 00 000 c86 486dffdc PEA -36(A5) 00 000 c8a 4eba0e1c JSR L 211 00 000 c8e 1b40ffb5 MOVE.B D0,-75(A5) 00 000 c92