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 ?