thằng này nó code bằng Microsoft Visual C++ 6.0 , đoạn mã hóa khá dài và lung tung , đáng lý tớ cho nó cái patch nhưng thấy nó so sánh nhiều chỗ và phương châm là tìm real serial nên sẽ
Trang 1Victim : DVD TO DIVX VCD RIPPER 3.0.0.2
Download : http://www.dvd222.com
Tools : OllyDbg v1.09d
Crack file : DVD2DIVXVCD.exe
Cracked by : dqtln
trên trang chủ của nó hiện có 2 softwares 39$ một em thằng này nó code bằng Microsoft Visual C++ 6.0 , đoạn mã hóa khá dài và lung tung , đáng lý tớ cho nó cái patch nhưng thấy nó so sánh nhiều chỗ và phương châm là tìm real serial nên sẽ phân tích đoạn mã hóa của nó vậy
dùng OllyDbg tìm đến thông báo lỗi "Registration failed!" , dịch chuyển lên một đoạn khá dài và ta đặt breakpoint như sau
CODE
00412720 57 PUSH EDI =>đặt breakpoint
ở đây có một số dòng
00412732 8B46 5C MOV EAX,DWORD PTR DS:[ESI+5C] =>đưa chuỗi name vào eax
00412735 8B68 F8 MOV EBP,DWORD PTR DS:[EAX-8] =>đưa chiều dài chuỗi name vào ebp
00412738 83FD 02 CMP EBP,2 =>so sánh với 2
0041273B 7D 16 JGE SHORT DVD2DIVX.00412753 =>nếu nhỏ hơn 2 thì bắn nag "Please input correct User Name!"
0041273D 33C0 XOR EAX,EAX
ở đây có một số dòng
00412752 C3 RETN
00412753 > 8B5E 60 MOV EBX,DWORD PTR DS:[ESI+60] =>đưa chuỗi serial vào ebx
00412756 8B53 F8 MOV EDX,DWORD PTR DS:[EBX-8] =>đưa chiều dài chuỗi serial vào edx
Trang 200412759 83FA 08 CMP EDX,8 =>so sánh với 8
0041275C 7D 16 JGE SHORT DVD2DIVX.00412774 =>nếu nhỏ hơn 8 thì bắn nag "Please input correct Registration Code!"
0041275E 33C0 XOR EAX,EAX
ở đây có một số dòng
00412773 C3 RETN
thằng này nó mã hóa 2 ký tự đầu tiên của chuỗi name 4 lần tính tổng hex của chuỗi name rồi mã hóa tiếp sau đó so sánh với 5 ký tự đầu tiên của chuỗi serial nhập vào nếu đúng thì bắn nag "Registration has succeeded!"
IMUL Signed integer multiply : thực hiện một phép nhân số nguyên có dấu trên
AL hoặc AX Nếu số nhân là 8 bit , số bị nhân là AL và tích là AX Nếu số nhân
là 16 bit , số bị nhân là AX và tích là DXAX Nếu số nhân là 32 bit , số bị nhân là EAX và tích là EDX:EAX Các cờ Carry và Overflow được ấn định nếu một tích
16 bit mở rộng vào AH , hoặc một tích 32 bit mở rộng vào DX , hoặc một tích 64 bit mở rộng vào EDX
các dạng thức chỉ lệnh : IMUL reg IMUL mem
chúng ta người vn nên toàn bị lý thuyết chi phối không có nhiều đkiện để thực hành , lý thuyết này áp dụng vào đây khá đơn giản
mov edx,65h
mov eax,66666667h
imul edx
ta giải thích thế này 65h*66666667h=28666666A3h , khi đó eax=666666A3h và edx=28h
ok vậy là được rồi , bi giờ ta tiếp tục phân tích đoạn mã hóa của chương trình giai đoạn mã hóa thứ nhất
Trang 3CODE
00412773 C3 RETN
00412774 > 0FB608 MOVZX ECX,BYTE PTR DS:[EAX] =>đưa ký tự đầu tiên của chuỗi name vào ecx , ta đặt kt1
00412777 897424 2C MOV DWORD PTR SS:[ESP+2C],ESI
0041277B 895C24 10 MOV DWORD PTR SS:[ESP+10],EBX =>đưa chuỗi serial vào ss:[esp+10]
0041277F 0FB658 01 MOVZX EBX,BYTE PTR DS:[EAX+1] =>đưa ký tự thứ 2 của chuỗi name vào ebx , ta đặt kt2
00412783 894424 18 MOV DWORD PTR SS:[ESP+18],EAX =>đưa chuỗi name vào ss:[esp+18]
00412787 8BC1 MOV EAX,ECX =>eax=kt1
00412789 83C8 41 OR EAX,41 =>eax = kt1 or 41
0041278C 894424 28 MOV DWORD PTR SS:[ESP+28],EAX
=>ss:[esp+28] = kt1 or 41
00412790 8BC3 MOV EAX,EBX =>eax=kt2
00412792 83C8 42 OR EAX,42 =>eax = kt2 or 42
00412795 8B5424 28 MOV EDX,DWORD PTR SS:[ESP+28] =>edx = kt1
or 41
00412799 894424 20 MOV DWORD PTR SS:[ESP+20],EAX =>ss:[esp+20]
= kt2 or 42
0041279D B8 67666666 MOV EAX,66666667 =>eax=66666667h
004127A2 83C9 43 OR ECX,43 =>ecx = kt1 or 43
004127A5 83CB 44 OR EBX,44 =>ebx = kt2 or 44
004127A8 F7EA IMUL EDX =>(kt1 or 41) * 66666667 = H1xxxxxxxx , edx=H1
004127AA 8B4424 28 MOV EAX,DWORD PTR SS:[ESP+28] =>eax = kt1
or 41
004127AE C1FA 02 SAR EDX,2 =>edx = H1/4
004127B1 C1F8 1F SAR EAX,1F =>eax = (kt1 or 41)/(2 mũ 1f) , eax=0 là cái chắc
004127B4 2BD0 SUB EDX,EAX =>edx = H1/4 - (a or 41)/(2 mũ 1f) = H1/4 004127B6 6BD2 0A IMUL EDX,EDX,0A =>edx=H1/4*0a
Trang 4004127B9 8B4424 28 MOV EAX,DWORD PTR SS:[ESP+28] =>eax = kt1
or 41
004127BD 2BC2 SUB EAX,EDX =>eax = (kt1 or 41) - H1/4*0a
004127BF 8B5424 20 MOV EDX,DWORD PTR SS:[ESP+20] =>edx = kt2
or 42
004127C3 0FB6C0 MOVZX EAX,AL =>eax = (kt1 or 41) - H1/4*0a
004127C6 894424 24 MOV DWORD PTR SS:[ESP+24],EAX
=>ss:[esp+24] = (kt1 or 41) - H1/4*0a
nếu ký tự đầu tiên của ta là chữ d thì sau loạt tính toán ss:[esp+24] = 1 (64
or 41)*66666667=28666666A3 , khi đó edx=28 ss:[esp+24] = (64 or 41) - 28/4*a = 1
giai đoạn mã hóa thứ hai
CODE
004127CA B8 67666666 MOV EAX,66666667 =>eax=66666667h
004127CF F7EA IMUL EDX =>(kt2 or 42) * 66666667 = H2xxxxxxxx , edx=H2
004127D1 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] =>eax = kt2
or 42
004127D5 C1FA 02 SAR EDX,2 =>edx=H2/4
004127D8 C1F8 1F SAR EAX,1F =>eax = (kt2 or 42)/(2 mũ 1f) , eax=0 là cái chắc
004127DB 2BD0 SUB EDX,EAX =>edx = H2/4 - (kt2 or 42)/(2 mũ 1f) = H2/4
004127DD 6BD2 0A IMUL EDX,EDX,0A =>edx=H2/4*0a
004127E0 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] =>eax = kt2
or 42
004127E4 2BC2 SUB EAX,EDX =>eax = (kt2 or 42) - H2/4*0a
Trang 5004127E6 0FB6C0 MOVZX EAX,AL =>eax = (kt2 or 42) - H2/4*0a
004127E9 894424 28 MOV DWORD PTR SS:[ESP+28],EAX =>ss:[esp+28]
= (kt2 or 42) - H2/4*0a
nếu ký tự thứ 2 của ta là chữ q thì sau loạt tính toán (71 or
42)*66666667=2E00000045 , khi đó edx=2E ss:[esp+28] = (71 or 42) - 2E/4*a = 5
giai đoạn mã hóa thứ ba
CODE
004127ED B8 67666666 MOV EAX,66666667 =>eax=66666667h
004127F2 F7E9 IMUL ECX
004127F4 8BC1 MOV EAX,ECX
004127F6 C1F8 1F SAR EAX,1F
004127F9 C1FA 02 SAR EDX,2
004127FC 2BD0 SUB EDX,EAX
004127FE 6BC2 0A IMUL EAX,EDX,0A
00412801 2BC8 SUB ECX,EAX
00412803 0FB6C1 MOVZX EAX,CL
00412806 894424 20 MOV DWORD PTR SS:[ESP+20],EAX =>ss:[esp+20]
= (kt1 or 43) - H3/4*0a
(64 or 43)*66666667=2933333371 , khi đó edx=29 ss:[esp+20] = (64 or 43)
- 29/4*a = 3
giai đoạn mã hóa thứ tư