Giờ thì bạn biết EDX sẽ là gì rồi há.. Rồi giờ thì vào trong CALL nào.. Còn em này thì gọi là MagicString hen... Nếu muốn gọn thì đầu Function chính bạn UCase luôn fSerials.. Thay vì UCa
Trang 1YNAVTLHURL
JAXWXSBGAI
CFOAXVQLBI
NBIWKQWWPQ
Thử đếm xem có tất cả bao nhiêu chuỗi 100 (64h) tất cả Giờ thì bạn biết EDX sẽ
là gì rồi há
Rồi giờ thì vào trong CALL nào
Code:
003511D8 | 68 30603500 PUSH scrabb_1.00356030 ; /String =
"ZXHYGKLQ9867WEPRCDSANMJBVFTU5342"
003511DD | FF15 3C503500 CALL NEAR DWORD PTR
DS:[<&KERNEL32.lstrl>; \lstrlenA
Thêm 1 MagicString
Vậy tạm gọi như sau Các dãy string vừa rồi ta gọi là TableString
Còn em này thì gọi là MagicString hen
Code:
003511EA | 8A1D 30603500 MOV BL, BYTE PTR DS:[356030]
003511F0 | 8B7C24 14 MOV EDI, DWORD PTR SS:[ESP+14]
BL = Name.Char
EDI =fSerials
Code:
003511F4 |> /33C0 /XOR EAX, EAX
003511F6 | |8A07 |MOV AL, BYTE PTR DS:[EDI]
003511F8 | |84C0 |TEST AL, AL
003511FA | |74 52 |JE SHORT scrabb_1.0035124E
003511FC | |3C 30 |CMP AL, 30
003511FE | |7C 48 |JL SHORT scrabb_1.00351248
00351200 | |3C 7A |CMP AL, 7A
00351202 | |7F 44 |JG SHORT scrabb_1.00351248
AL = fSerials.Char
If AL = Then Exit Loop
Code:
Trang 2003511FC | 3C 30 |CMP AL, 30
003511FE | 7C 48 |JL SHORT scrabb_1.00351248
00351200 | 3C 7A |CMP AL, 7A
00351202 | 7F 44 |JG SHORT scrabb_1.00351248
If AL nằm trong khoảng 30 - 7A (alphabe - Numberic) thì xử lý Else Exit Loop Code:
00351204 | 50 |PUSH EAX
00351205 | E8 36FEFFFF |CALL scrabb_1.00351040
PUSH Char vào Stack
Trong CALL
Code:
00351040 /$ 33C0 XOR EAX, EAX
00351042 | 8A4424 04 MOV AL, BYTE PTR SS:[ESP+4]
00351046 | 3C 61 CMP AL, 61
00351048 | 7C 07 JL SHORT scrabb_1.00351051
0035104A | 3C 7A CMP AL, 7A
0035104C | 7F 03 JG SHORT scrabb_1.00351051
0035104E | 83E8 20 SUB EAX, 20
00351051 \> C3 RET
Khúc này thì mọi ng chắc đã wen Đại khái là UCase Char thôi Nếu muốn gọn thì đầu Function chính bạn UCase luôn fSerials Thay vì UCase từng Char như thế này
Code:
0035120F | 84DB |TEST BL, BL
00351211 | /74 11 |JE SHORT scrabb_1.00351224
BL lúc này đang chứa Name.Char Nên khúc này chỉ là kiểm tra Char đó có phải là
kí tự NULL không Nếu không thì Jump còn không thì tính tiếp
Code:
00351215 |> /3AC8 |/CMP CL, AL
00351217 | |74 2B ||JE SHORT scrabb_1.00351244
00351219 | |8A8A 31603500 ||MOV CL, BYTE PTR DS:[EDX+356031]
0035121F | |42 ||INC EDX
00351220 | |84C9 ||TEST CL, CL
Trang 300351222 |.^\75 F1 |\JNZ SHORT scrabb_1.00351215
CL = MagicString.Char
AL = fSeriasl.Char
Đoạn Loop trên nhằm kiểm tra trong fSerials có chứa kí tự tương ứng trong
MagicString
Code:
00351228 | 8A06 |MOV AL, BYTE PTR DS:[ESI]
0035122A | 50 |PUSH EAX
0035122B | E8 10FEFFFF |CALL scrabb_1.00351040
AL = TableString(Index).Char
Gán AL là kí tự trong chuỗi thuộc TableString đang xử lý (được PUSH ở ngoài Function này) Sau đó UCase
Code:
00351230 | 0FBEC0 |MOVSX EAX, AL
00351233 | 99 |CDQ
00351234 | F7FD |IDIV EBP
Thực hiện phép chia AL với EBP (EBP = MagicString.Length)
Code:
0035123C | 3BD1 |CMP EDX, ECX
Kiểm tra EDX là số dư phép chia = 0 hay không (ECX đang = 0 do phép XOR trc đó)
Nếu không bằng nhau then Exit Function Else Point đến kí tự tiếp theo của
fSerials & TableString(Index)
Chà Xui thật Tut đầu tiên mà đụng ngay em GameHouse loại này Đoạn code nó tuy cũng như các loại khác nhưng bị biến đổi đi tí chút dẫn đến hơi khó nhìn để Keygen
Vậy ta gút lại Function này xem sao
Code:
Trang 4Public Function CheckSerials (ByVal in_strfSerials As String, ByVal
in_strTableString As String)
Const strMagicString As String =
"ZXHYGKLQ9867WEPRCDSANMJBVFTU5342"
Code:
003511D8 | 68 30603500 PUSH scrabb_1.00356030 ; /String =
"ZXHYGKLQ9867WEPRCDSANMJBVFTU5342"
003511DD | FF15 3C503500 CALL NEAR DWORD PTR
DS:[<&KERNEL32.lstrl>; \lstrlenA
003511E3 | 8BE8 MOV EBP, EAX
Quote:
* MagicString.Length Sau đó gán Length đó vào EBP
Code:
003511F6 | 8A07 |MOV AL, BYTE PTR DS:[EDI] ; MOV AL, fSerials.Char
003511F8 | 84C0 |TEST AL, AL
003511FA | 74 52 |JE SHORT scrabb_1.0035124E
003511FC | 3C 30 |CMP AL, 30
003511FE | 7C 48 |JL SHORT scrabb_1.00351248
00351200 | 3C 7A |CMP AL, 7A
00351202 | 7F 44 |JG SHORT scrabb_1.00351248 ; 30 < AL < 7A (Numberic & Alphabe)
00351204 | 50 |PUSH EAX
Trang 500351205 | E8 36FEFFFF |CALL scrabb_1.00351040 ; UCase
Quote:
* Đơn giản chỉ là lấy kí tự đầu tiên của fSerials gán vào AL, sau đó kiểm tra
nó có phải là Alphabe & Numric hay không (If Not Then DIE) sau đó UCase
Code:
00351213 | 8ACB |MOV CL, BL ; CL =
MagicString.Char
00351215 |> 3AC8 |/CMP CL, AL
00351217 | 74 2B ||JE SHORT scrabb_1.00351244
00351219 | 8A8A 31603500 ||MOV CL, BYTE PTR DS:[EDX+356031] ; MOV CL, MagicString.Char.Next
0035121F | 42 ||INC EDX ; MagicString.NextChar
00351220 | 84C9 ||TEST CL, CL
00351222 |.^ 75 F1 |\JNZ SHORT scrabb_1.00351215 ; End Of MagicString
00351224 |> \32C9 |XOR CL, CL
Quote:
* Gán CL là từng kí tự trong MagicString và kiểm tra kí tự đó với
fSerials.Char ban nãy xem có bằng hay không Nếu bằng thì Exit Loop với EDX là vị trí kí tự đó trong MagicString Trong trường hợp sau khi check hết
cả MagicString mà không tìm ra kí tự tương ứng thí CL sẽ clear = 0
Trang 6Code: