Vậy sau 14 lần loop, ta có EBX = 22345E64. Và hiện tại, EBP = ECX, do đó chương trình sẽ không loop nữa và ta đến đoạn code sau : Code: 00404C14 |> \8D4424 30 LEA EAX, DWORD PTR SS:[ESP+30] 00404C18 |. 53 PUSH EBX 00404C19 |. 68 D0044400 PUSH Wallpape.004404D0 ; ASCII "%08X" 00404C1E |. 50 PUSH EAX 00404C1F |. E8 AC6B0100 CALL Wallpape.0041B7D0 Trace qua đoan code trên ta đến đây : Code: 00404C24 |. 83C4 0C ADD ESP, 0C | ESP = ESP + C = 12EDCC + C = 12EDD8 00404C27 |. 33C0 XOR EAX, EAX | EAX = 0 Đến đây, ta lại bắt gặp 1 vòng lặp : Code: 00404C29 |> /8B4C84 10 /MOV ECX, DWORD PTR SS:[ESP+EAX*4+10] 00404C2D |. |40 |INC EAX 00404C2E |. |83F8 08 |CMP EAX, 8 00404C31 |. |8A4C0C 30 |MOV CL, BYTE PTR SS:[ESP+ECX+30] 00404C35 |. |884C06 FF |MOV BYTE PTR DS:[ESI+EAX-1], CL 00404C39 |.^\72 EE \JB SHORT Wallpape.00404C29 Và sau đây là cơ chế lặp loop của nó : Code: Quote: 00404C29 |> /8B4C84 10 /MOV ECX, DWORD PTR SS:[ESP+EAX*4+10] <==> ECX = ESP + EAX*4 + 10. Mà EAX = 0 => ECX = ESP + 10. Trace qua nó, ta thấy ECX = 5 (ta bỗng chợt nhớ về dãy số ở trên : 5, 3, 7, 1, 2, 6, 4, 0) Quote: 00404C2D |. |40 |INC EAX <==> EAX = EAX + 1. Do EAX = 0 => EAX = 1 Quote: 00404C2E |. |83F8 08 |CMP EAX, 8 <==> So sánh EAX với 8 Quote: 00404C31 |. |8A4C0C 30 |MOV CL, BYTE PTR SS:[ESP+ECX+30] <==> Load giá trị của [ESP+ECX+30] vào CL, mà ECX = 5 => gía trị của [ESP+30]+5 được load vào EAX (=5) Quote: 00404C35 |. |884C06 FF |MOV BYTE PTR DS:[ESI+EAX-1], CL <==> Lưu CL vào [ESI+EAX-1], mà EAX = 1 => CL được lưu vào ESI Quote: 00404C39 |.^\72 EE \JB SHORT Wallpape.00404C29 <==> Nếu EAX = 8 => thoát khỏi vòng lặp Sau 8 lần loop, ta có : Quote: Quote: Lần lặp thứ 1 ECX = 5 EAX = 1 CL = E (đây là giá trị được lưu trong [ESP+30] + 5) Lưu CL trong [EAX+ESI-1] (= ESI) Quote: Lần lặp thứ 2 ECX = 3 EAX = 2 CL = 4 (đây là giá trị được lưu trong [ESP+30] + 3) Lưu CL trong [EAX+ESI-1] (= ESI+1) Quote: Lần lặp thứ 3 ECX = 7 EAX = 3 CL = 4 (đây là giá trị được lưu trong [ESP+30] + 7) Lưu CL trong [EAX+ESI-1] (= ESI+2) Quote: Lần lặp thứ 4 ECX = 1 EAX = 4 CL = 2 (đây là giá trị được lưu trong [ESP+30] + 1) Lưu CL trong [EAX+ESI-1] (= ESI+3) Quote: Lần lặp thứ 5 ECX = 0 EAX = 5 CL = 2 (đây là giá trị được lưu trong [ESP+30] + 0) Lưu CL trong [EAX+ESI-1] (= ESI+4) Quote: Lần lặp thứ 6 ECX = 2 EAX = 6 CL = 3 (đây là giá trị được lưu trong [ESP+30] + 2) Lưu CL trong [EAX+ESI-1] (= ESI+5) Quote: Lần lặp thứ 7 ECX = 6 EAX = 7 CL = 6 (đây là giá trị được lưu trong [ESP+30] + 6) Lưu CL trong [EAX+ESI-1] (= ESI+6) Quote: Lần lặp thứ 8 ECX = 4 EAX = 8 CL = 5 (đây là giá trị được lưu trong [ESP+30] + 4) Lưu CL trong [EAX+ESI-1] (= ESI+7) Hãy nhớ lại xem nào : chúng ta có được số 22345E64 và 8 con số khác :5, 3, 7, 1, 0, 4, 6, 2. Và với vòng lặp trên, chương trình di chuyển mỗi số vào đúng vị trí của nó : Quote: - nhận giá trị tại ESP+30+5, sau đó lưu vào ESI (=E) - nhận giá trị tại ESP+30+3, sau đó lưu vào ESI+1 (=4) - nhận giá trị tại ESP+30+7, sau đó lưu vào ESI+2 (=4) - nhận giá trị tại ESP+30+1, sau đó lưu vào ESI+3 (=2) - nhận giá trị tại ESP+30+0, sau đó lưu vào ESI+4 (=2) - nhận giá trị tại ESP+30+2, sau đó lưu vào ESI+5 (=3) - nhận giá trị tại ESP+30+6, sau đó lưu vào ESI+6 (=6) - nhận giá trị tại ESP+30+4, sau đó lưu vào ESI+7 (=5) The_lighthouse(REA) CODE KEYGEN IN MASM32 I/ Giới thiệu: Bài này chủ yếu giới thiệu cách tạo giao diện của keygen hay patcher, còn việc code thuật toán để tạo key là tùy thuộc vào từng trường hợp cụ thể. II/ Bắt đâu: các tool cần thiết: MASM ver 7.0 trở lên,RGN Generator v1.01.( search trên google Yêu cầu phải biết lâp trình MASM32 mức cơ bản. 1)Thiết kế dialogue: Bạn có thể tạo dialogue hay tạo cửa sổ băng hàm CreateWindow.Tôi chọn cách nhanh và gọn là tạo dialoguebox, đây thực chất thì cũng là một cửa sổ, bạn có thể tạo nó bằng Visual C++ rồi lưu ở dạng file resource, tuy nhiên trong MASM32 bạn chỉ cần include :"include \masm32\include\dialogs.inc" Cách tạo một dialogue như sau:( bạn có thể tìm tut vầ lập trình MASM để hiểu thêm) Dialog "Caption of dialogue","MS Sans Serif",10, \ ; caption,font,pointsize WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \ ; style 4, \ ; control count 50,50,150,80, \ ; x y tọa độ vị trí dialogue, kcích thước dialogue 1024 ; memory buffer size DlgButton "caption button",kiểu,hàng,cột,rộng,cao,ID ;caption,style,vị trí (hàng, cột), kích thước, ID của button DlgIcon 500,10,10,101 DlgStatic "nội dung text hiển thị",kiểu,hàng,cột,rộng,cao,ID DlgEdit "nội dung text hiển thị",kiểu,hàng,cột,rộng,cao,ID như vậy với những control trên có thể tạo dialogue,button,icon,static, editbox. Đây chỉ là phần giới thiệu sơ qua, mà các bạn buộc phải biết trước khi vào phần tiếp theo: 2) Tạo dialogue xử lý các control: a)Tạo dialogue với form không phải là hình vuông: Đây là điều không thể thiếu nếu bạn muốn tạo một keygen đẹp, dialogue không chỉ là hình vuông mà là một hình bất kỳ, việc xử lý hình dạng dialogue tực hiện khi nhận thông điệp WM_INITDIALOG: ; > LOAD REGION_DATA invoke FindResource,hInstance,addr RsrcName,addr RsrcType mov RsrcHand, eax invoke LoadResource,hInstance,eax mov RsrcPoint, eax invoke SizeofResource,hInstance,RsrcHand mov RsrcSize, eax invoke LockResource,RsrcPoint mov RsrcPoint, eax ; > CREATE REGION AND PASS IT TO OUR WINDOW invoke ExtCreateRegion,NULL,RsrcSize,eax invoke SetWindowRgn,hWin,eax,TRUE với RsrcName db "RANGE",0 RsrcType db "RGN",0 hInstance dd ? RsrcHand dd ? . SS:[ESP+ 30] 00 404 C18 |. 53 PUSH EBX 00 404 C19 |. 68 D 004 4 400 PUSH Wallpape .00 4 404 D0 ; ASCII " %08 X" 00 404 C1E |. 50 PUSH EAX 00 404 C1F |. E8 AC6B 01 0 0 CALL Wallpape .00 41B7D0 Trace qua. SS:[ESP+EAX*4 + 10 ] 00 404 C2D |. | 40 |INC EAX 00 404 C2E |. |83F8 08 |CMP EAX, 8 00 404 C 31 |. |8A4C0C 30 |MOV CL, BYTE PTR SS:[ESP+ECX+ 30] 00 404 C35 |. |884C06 FF |MOV BYTE PTR DS:[ESI+EAX -1] , CL 00 404 C39. Code: 00 404 C24 |. 83C4 0C ADD ESP, 0C | ESP = ESP + C = 12 EDCC + C = 12 EDD8 00 404 C27 |. 33C0 XOR EAX, EAX | EAX = 0 Đến đây, ta lại bắt gặp 1 vòng lặp : Code: 00 404 C29 |> /8B4C84 10 /MOV