ban đầu chương trình đổi từng ký tự chuỗi name nhập vào thành ký tự hoa , lấy mã hex của từng ký tự chuỗi name đã được đổi thành chữ hoa tính toán ra một con số .... con số được tính toá
Trang 1Posted by: dqtln Jan 1 2004, 09:47 AM
Victim : Syllogism CrackMe #2
Tools : OllyDbg v1.09d
Crack file : Syllogism-crackme2.exe
Cracked by : dqtln
site biw.rult.at
dùng OllyDbg tìm đến thông báo lỗi , ta thấy như sau
CODE
004013F7 | E8 BA760000 CALL <JMP.&USER32.GetDlgItemTextA>;
\GetDlgItemTextA =>đặt breakpoint
004013FC | 6A 32 PUSH 32; /Count = 32 (50.)
004013FE | 68 D1B54000 PUSH Syllogis.0040B5D1; |Buffer =
Syllogis.0040B5D1
00401403 | 6A 69 PUSH 69; |ControlID = 69 (105.)
00401405 | FF75 08 PUSH DWORD PTR SS:[EBP+8]; |hWnd
00401408 | E8 A9760000 CALL <JMP.&USER32.GetDlgItemTextA>;
\GetDlgItemTextA
0040140D | E8 D6FEFFFF CALL Syllogis.004012E8 =>trace into
00401412 | 85C0 TEST EAX,EAX
00401414 | 75 18 JNZ SHORT Syllogis.0040142E
00401416 | 6A 00 PUSH 0; /Style = MB_OK|MB_APPLMODAL
00401418 | 68 ED914000 PUSH Syllogis.004091ED; |Title = "ERROR" 0040141D | 68 C6914000 PUSH Syllogis.004091C6; |Text = "Please Deposit 25 cents and try again."
Trang 2bi giờ ta đến 004012e8 xem hàm kiểm tra serial
CODE
004012E8 /$ 55 PUSH EBP
ở đây có một số dòng
004012FF | 50 PUSH EAX; |Arg1
00401300 | E8 EB110000 CALL Syllogis.004024F0; \Syllogis.004024F0
=>trace into nếu thích
00401305 | 83C4 0C ADD ESP,0C
00401308 | 33F6 XOR ESI,ESI =>esi=0
0040130A | EB 1E JMP SHORT Syllogis.0040132A
0040130C |> 8A0437 /MOV AL,BYTE PTR DS:[EDI+ESI] =>đưa từng
ký tự chuỗi name vào al
0040130F | 50 |PUSH EAX; /Arg1 =>đẩy từng ký tự lên stack
00401310 | E8 83FFFFFF |CALL Syllogis.00401298; \Syllogis.00401298
=>trace into để xem mã hóa chuỗi name thành serial
00401315 | 59 |POP ECX
ở đây có một số dòng
00401349 | E8 A2110000 CALL Syllogis.004024F0; \Syllogis.004024F0 0040134E | 83C4 0C ADD ESP,0C =>nếu trace down đến đây ta sẽ thấy serial tương ứng với name bên cửa sổ Registers (FPU) , d ecx = serial đúng
00401351 | 68 D1B54000 PUSH Syllogis.0040B5D1
ở đây có một số dòng
00401380 \ C3 RETN
ta đến 00401298 xem sao
Trang 3CODE
00401298 /$ 55 PUSH EBP
00401299 | 8BEC MOV EBP,ESP
0040129B | 83C4 C8 ADD ESP,-38
0040129E | 53 PUSH EBX
0040129F | 56 PUSH ESI
004012A0 | 57 PUSH EDI
004012A1 | 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8] =>đưa từng ký
tự chuỗi name vào ebx
004012A4 | 0FBEF3 MOVSX ESI,BL =>đưa từng ký tự chuỗi name vào esi 004012A7 | 56 PUSH ESI; /Arg1
004012A8 | E8 FB2B0000 CALL Syllogis.00403EA8; \Syllogis.00403EA8
=>trace into , đơn giản đổi từng ký tự chuỗi name thành chữ hoa
004012AD | 59 POP ECX
004012AE | 8BD8 MOV EBX,EAX =>đưa ký tự đã đổi thành chữ hoa vào ebx
004012B0 | BE 3D914000 MOV ESI,Syllogis.0040913D; ASCII
"4B7YS8K39D1NM1K9R8Q9A9A5A1A2N1P0A5V5X3B2W2J3L5U6Y3E3"
=>đưa chuỗi mặc định
"4B7YS8K39D1NM1K9R8Q9A9A5A1A2N1P0A5V5X3B2W2J3L5U6Y3E3" vào esi
004012B5 | 8D7D C8 LEA EDI,DWORD PTR SS:[EBP-38]
004012B8 | B9 0D000000 MOV ECX,0D
004012BD | F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR
DS:[ESI]
004012BF | A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
004012C0 | 0FBEC3 MOVSX EAX,BL =>đưa từng ký tự của name đã đổi thành chữ hoa vào eax
004012C3 | 8A9445 46FFFFF>MOV DL,BYTE PTR SS:[EBP+EAX*2-BA]
=>[ebp-38+eax*2-ba+38] vào dl vd ký tự ta nhập là l thì đổi sang chữa hoa
là L có mã 4c 4c*2+38-ba=16h=22 , tức lấy ký tự thứ 22 của chuỗi mặc định đưa vào dl chuỗi mặc định có 52 ký tự , ký tự đầu tiên là ký tự thứ 0 cho đến
ký tự cuối là 51
Trang 4004012CA | 8815 28914000 MOV BYTE PTR DS:[409128],DL =>lưu ký tự mới tính tại [409128]
004012D0 | 0FBECB MOVSX ECX,BL =>đưa từng ký tự của name đã đổi thành chữ hoa vào ecx
004012D3 | 8A844D 47FFFFF>MOV AL,BYTE PTR SS:[EBP+ECX*2-B9]
=>[ebp-38+ecx*2-ba+38] vào al
004012DA | A2 29914000 MOV BYTE PTR DS:[409129],AL =>lưu ký tự mới tính tại [409129]
004012DF | 5F POP EDI
004012E0 | 5E POP ESI
004012E1 | 5B POP EBX
004012E2 | 8BE5 MOV ESP,EBP
004012E4 | 5D POP EBP =>khôi phục các thanh ghi
004012E5 \ C3 RETN
tớ xem đoạn mã hóa không kỹ lắm với lại biết sơ sơ asm nên hình như có vấn đề trong cái đoạn mã hóa từ địa chỉ 00401298 bác nào thử qua có sai xót thì bảo nhá
ban đầu chương trình đổi từng ký tự chuỗi name nhập vào thành ký tự hoa , lấy
mã hex của từng ký tự chuỗi name đã được đổi thành chữ hoa tính toán ra một con số trong chuỗi mặc định có 52 ký tự , ký tự đầu tiên là 0 cho đến ký tự cuối là 51 con số được tính toán ra là số thứ tự trong chuỗi mặc định đó name : dqtln
serial : K3A5B2A5A
name : langdangngayqua
serial : A54BA2M1K34BA2M1A2M14BY3A5W24
Posted by: moonbaby Jan 3 2004, 02:40 PM
Trang 5QUOTE
Homepage : http://crackme.de
CrackMe : CrackMe3.zip (CrackMe3.exe )
Coder : BadSector ( MASM32 / TASM32 )
Type : Name / Serial
Packed : N / A
Crack Tool : OllyDbg 1.09d
Unpack Tool : N / A
Request : Correct Serial
Rule : N/A
Note : N/A
Đặt BreakPoint tại điểm sau :
QUOTE
004011F6 /$ 33DB XOR EBX,EBX
Sau khi load thì Olly dừng tại đây Giai đoạn mã hoá được tiến hành hai lần :
Giai đoạn mã hoá thứ nhất :
QUOTE
Trang 6Đưa từng ký tự của chuỗi U nhập vào trừ đi giá trị của CL ( ECX hiện thời là chiều dài chuỗi U nhập), kết quả được lưu ngay tại vị trí này hay nói cách khác ký tự mới tạo thành thay thế ký tự ban đầu của U nhập
004011FB |> 288B FF204000 /SUB BYTE PTR
DS:[EBX+4020FF],CL
Kiểm tra chuỗi nhập có khoảng trắng hay không, nếu có sẽ xử lý theo cách khác
00401201 | 80BB FF204000>|CMP BYTE PTR
DS:[EBX+4020FF],20
00401208 | 74 06 |JE SHORT crackme3.00401210
0040120A | 43 |INC EBX < === Tăng EBX lên 1
0040120B | 49 |DEC ECX < === Giảm ECX đi 1
0040120C |.^ 75 ED |JNZ SHORT crackme3.004011FB < === Lặp đến hết chuỗi
0040120E | EB 0A |JMP SHORT crackme3.0040121A < === Nếu hết chuỗi thì nhảy ra ngoài
Nếu chuỗi nhập có khoảng trắng thì sẽ gán bằng giá trị hiện thời của
CL ( ECX )
00401210 |> 008B FF204000 |ADD BYTE PTR
DS:[EBX+4020FF],CL
00401216 | 43 |INC EBX < === Tăng EBX lên 1
00401217 | 49 |DEC ECX < === Giảm ECX đi 1
00401218 |.^ 75 E1 \JNZ SHORT crackme3.004011FB < === Lặp đến hết chuỗi
Chuỗi được mã hoá ở giai đoạn này sẽ thay thế chuỗi U nhập ban đầu
ở cùng một vị trí trong bộ nhớ
Giai đoạn mã hoá thứ hai
Trang 7QUOTE
Giá trị ban đầu là chiều dài chuỗi U nhập ( giá trị sau khi thoát khỏi vòng lặp đầu tiên )
0040121A |> 4B DEC EBX < === EBX = EBX – 1
0040121B | 33C9 XOR ECX,ECX < === ECX = 00h
Đưa từng ký tự của chuỗi được mã hoá ở giai đoạn trên vào EAX, nhưng do ở đây EBX ban đầu chính là chiều dài chuỗi nhập và sau mỗi vòng lặp lại giảm đi 1 nên chuỗi sẽ được đưa vào là chuỗi ngược 0040121D |> 0FB683 FF2040>/MOVZX EAX,BYTE PTR
DS:[EBX+4020FF]
00401224 | 83F8 41 |CMP EAX,41 < === So sánh với 041h
00401227 | 73 03 |JNB SHORT crackme3.0040122C < === Nhảy nếu không nhỏ hơn
00401229 | 83C0 20 |ADD EAX,20 < === EAX = EAX + 020h 0040122C |> 83F8 5A |CMP EAX,5A < === So sánh với 05Ah 0040122F | 76 03 |JBE SHORT crackme3.00401234 < === Nhảy nếy nhỏ hơn hoặc bằng
00401231 | 83E8 20 |SUB EAX,20 < === EAX = EAX – 020h Đưa giá trị mới này lưu ở địa chỉ 0040214F ( vì ban đầu ECX = 00h )
00401234 |> 8881 4F214000 |MOV BYTE PTR
DS:[ECX+40214F],AL
0040123A | 4B |DEC EBX < === EBX = EBX - 1
0040123B | 41 |INC ECX < === ECX = ECX + 1
0040123C | 83F9 04 |CMP ECX,4 < === Chuỗi mã hoá lần đầu
là 4 ký tự
0040123F | 74 07 |JE SHORT crackme3.00401248 < === 4 ký
tự sau được mã hoá cách khác
So sánh ECX ( chiều dài chuỗi được xử lý ) với giá trị được lưu ở địa chỉ SS:[EBP-4] Giá trị này là chiều dài chuỗi + 1 vì ta thêm ký tự ASCII “-“ vào sau ký tự thứ 4 Nếu chưa hết thì lại tiếp tục vòng lặp Nếu đã hết chuỗi thì thoát ra ngoài
00401241 | 3B4D FC |CMP ECX,DWORD PTR SS:[EBP-4]
00401244 |.^ 75 D7 |JNZ SHORT crackme3.0040121D < ===
Trang 8lặp tiếp nếu chưa hết
00401246 | EB 0A |JMP SHORT crackme3.00401252 < === Thoát ra khỏi vòng lặp
00401248 |> C681 4F214000>|MOV BYTE PTR
DS:[ECX+40214F],2D < === ASCII = “-“
0040124F | 41 |INC ECX < === ECX = ECX + 1
00401250 |.^ EB CB \JMP SHORT crackme3.0040121D < === Tiếp tục quá trình lặp
Sau khi kết thúc giai đoạn mã hoá thứ hai, ta đến ngay lệnh này
QUOTE
00401252 |> \E8 6BFFFFFF CALL crackme3.004011C2
Trace thẳng vào trong ta đến :
004011C2 $ 33C9 XOR ECX,ECX < === ECX = 00h : là biến đếm của vòng lặp
Đưa từng ký tự của S nhập vào EAX
004011C4 > 0FBE81 272140>MOVSX EAX,BYTE PTR
DS:[ECX+402127]
Đưa từng ký tự của chuỗi mã hoá vào EBX
004011CB 0FBE99 4F2140>MOVSX EBX,BYTE PTR
DS:[ECX+40214F]
Ở đây ta thấy có một điều đặc biệt là tại sao lại so sánh với 1 ?? Thực
sư đây là một giai đoạn mã hoá chuỗi được tạo thành ở trên lần cuối Nhưng không mã hoá toàn bộ mà chỉ mã hoá ký tự thứ hai mà thôi Theo câu lệnh ta sẽ thấy là giá trị của ký tự thứ hai sẽ được cộng thêm
1
004011D2 83F9 01 CMP ECX,1 < === So sánh ECX với 1 <
Trang 9=== Rất quan trọng.!!!!
004011D5 74 16 JE SHORT crackme3.004011ED < === Nhảy đến giai đoạn mã hoá thứ ba
004011D7 3BC3 CMP EAX,EBX < === so sánh từng ký tự của S nhập và S thực với nhau
004011D9 74 03 JE SHORT crackme3.004011DE < === Nhảy đến thông báo sai ngay
004011DB EB 7B JMP SHORT crackme3.00401258
004011DD C3 RETN
004011DE > 83F8 00 CMP EAX,0 < === Kiểm tra xem đã kết thúc chuỗi chưa
004011E1 75 06 JNZ SHORT crackme3.004011E9 < == Nếu kết thúc thì đến thông báo đúng
004011E3 E9 85000000 JMP crackme3.0040126D
004011E8 C3 RETN
004011E9 > 41 INC ECX < === ECX = ECX + 1
004011EA ^ EB D8 JMP SHORT crackme3.004011C4 < === Tiếp tục vòng lặp
Kết luận :
QUOTE
1- Quá trình mã hoá chuỗi thực chất là ba gia đoạn chú không phải là hai
2- Gian đoạn thứ hai bao hàm trong quá trình kiểm tra chuỗi và chỉ diễn ra đối với ký tự thứ hai mà thôi
3- Và sau ký tự thứ tư sẽ được thêm vào “-“
Trang 10Vậy :
QUOTE
User : Moonbaby Serial : XA>>-IIHE
User : HVA-CrAcKeRtEaM Serial : L@BP-M?D;XHXATHY