Archive for the ‘Kĩ thuật Internal Keygen_Ví dụ 2’ Category


b. Ví dụ 2 :

Phần tiếp theo , chúng ta sẽ làm thêm một ví dụ nữa. Ở ví dụ này chúng ta sẽ thực hành trên một crackme. Cách thức thực hiện trên crackme cũng hoàn toàn tương tự như khi chúng ta thực hiện đối với Software ở trên. Oki, chúng ta bắt đầu : ).
Chạy thử Crackme, tiến hành nhập thông tin và nhấn nút “Check It!”. Chằng thấy có Nag nào bắn ra cả.

ex1

Nhấn nút “Give Up!” để exit .Mở Ollydbg lên và load crackme vào (crackme này được code bằng Microsoft Visual C++ 6.0).
Sau khi load xong , dùng chức năng Search For \ All referenced text strings để tìm kiếm thông tin. Chúng ta có được kết quả như sau :

ex2

Double Click tại 00401639 chúng ta sẽ quay trở lại màn hình chính của Ollydbg. Dịch lên một chút , ta đặt BP tại 004015BC. Nhấn F9 để Run , tiến hành nhập lại Fake Information. Sau đó nhấn “Check It!”, Ollydbg sẽ Ice tại điểm đặt BP. Nhấn F8 để Trace, chúng ta sẽ có như sau :

ex3

Như mọi người nhìn thấy thì Crackme này sẽ tiến hành một số quá trình kiểm tra như sau : Độ dài của UserName mà chúng ta nhập vào phải thỏa mãn điều kiện là 5 < Length(FakeUser) < 20. Bên cạnh đó thì chiều dài của FakeSerial mà chúng ta nhập vào cũng phải bằng với chiều dài của FakeUser. Nếu như chúng ta nhập đúng các thông tin thỏa mãn tất cả các điều kiện trên thì chúng ta sẽ vượt qua được quá trình check này. Sau đoạn check ở trên chúng ta sẽ gặp một vòng lặp tính toán ra Real Serial của Crackme . Cụ thể như sau :

ex4

Do đặc thù của kĩ thuật Internal Keygen như đã nói ở trên , ở đây ta không cần quan tâm đến quá trình tính toán Serial như thế nào. Ta chỉ cần biết rằng đây chính là vòng lặp dùng cho việc tính ra Real Serial và giá trị trong thanh ghi AL tại địa chỉ 00401629 chính là giá trị RealSerial sau mỗi quá trình tính toán của vòng lặp . Vòng lặp này có số lần lặp phụ thuộc vào chiều dài của chuỗi UserName mà chúng ta nhập vào.
Nhưng mọi người để ý rằng, ngay tại lần lặp đầu tiên giá trị thứ nhất của RealSerial sẽ được tính toán , sau đó giá trị này được lưu vào thanh ghi AL. Tiếp theo , tại địa chỉ 00401629 là quá trình so sánh kí tự đầu tiên trong chuỗi Fake Serial mà chúng ta nhập vào với giá trị Real Serial lưu trong thanh ghi AL. Nếu 2 giá trị này khác nhau thì ngay lập tức sẽ có một lệnh nhảy thoát ra khỏi vòng lặp tính toán. Vậy tức là nếu như ngay từ đầu kết quả so sánh này đã sai thì chúng ta luôn bị out khỏi vòng lặp và sẽ không thể biết hểt được giá trị tiếp theo sẽ sinh ra của chuỗi Real Serial. Đây là điều mà chúng ta không muốn! Vậy hướng giải quyết ở đây là thế nào?

Để ý rằng dưới câu lệnh :

00401629 . 38040A CMP BYTE PTR DS:[EDX+ECX], AL ; <== FakeSerial[i] = Temp ?

là một lệnh nhảy làm cho chúng ta out ra khỏi vòng lặp tính toán :

0040162C . /75 1C JNZ SHORT Rith_Cra.0040164A ; <== If not, Jump to Bad boy

nhưng chúng ta thấy rằng, chuỗi FakeSerial của chúng ta được đưa vào thanh ghi EDX. Mà giá trị trong BYTE PTR DS:[EDX+ECX] chính là kí tự đầu tiên của chuỗi Fake Serial(lúc đầu ECX = 0). Quan sát thấy , ngay dưới lệnh nhảy ở trên là lệnh :

0040162E . 41 INC ECX ; <== i ++

Vậy ta có thể kết luận một điều rất quan trọng như sau : Nếu như giá trị trong BYTE PTR DS:[EDX+ECX] = AL (tức là giá trị đầu tiên của chuỗi FakeSerial mà chúng ta nhập vào bằng với giá trị RealSerial của quá trình tính toán) thì chúng ta sẽ không bị out khỏi vòng lặp tại lệnh nhảy , do đó giá trị ECX sẽ tăng lên để trỏ tới vị trí tiếp theo trong chuỗi FakeSerial. Vậy thì ngay tại chỗ này , chúng ta nảy ra một ý tưởng là , chúng ta sẽ dùng chính chuỗi FakeSerial này để lưu chuỗi Serial của quá trình tính toán.

Để thực hiện được điều này chúng ta chỉ việc thay đổi câu lệnh so sánh tại 00401629. Tại địa chỉ này, nhấn Space để mở cửa sổ Assemble , chúng ta edit lại như sau :

ex6

Tiếp theo chúng ta sẽ NOP câu lệnh nhảy tại 0040162C. Ta sẽ có được như sau :

ex7

Oki , tiến hành Run thử và Dump tại thanh ghi EDX , chúng ta sẽ có được kết quả mà chúng ta mong muốn . Vậy là qua bước thứ nhất tìm ra nơi tính toán RealSerial và nơi lưu trữ giá trị RealSerial :

ex8

Bước tiếp theo chúng ta sẽ cho hiện cái RealSerial này thông qua cái MessageBox. Công việc này hết sức đơn giản. Chúng ta chỉ việc trỏ tới vị trí của dòng :

0040163E 68 20304000 PUSH Rith_Cra.00403020 ; ASCII "Well done cracker!"

sau đó nhấn Space và sửa thành :

PUSH EDX

Cuối cùng chúng ta Save thành quả của chúng ta thành một file exe. Chạy file này lên, nhập thông tin vào nhớ là chiều dài UserName phải bằng với chiều dài Serial nhập vào : ). Chúng ta sẽ có được kết quả như sau :

ex10

Vậy là thành công rồi !!!

Best Regards
_[Kienmanowar]_

–++–==[ Greatz Thanks To ]==–++–
My family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQCrker,
the_Lighthouse, Merc, Hoadongnoi, Nini … all REA‘s members, TQN, HacNho, RongChauA,
Deux, tlandn, light.phoenix, dqtln, ARTEAM …. all my friend, and YOU.

–++–==[ Thanks To ]==–++–
iamidiot, WhyNotBar, trickyboy, dzungltvn, takada, hurt_heart, haule_nth, hytkl v..v..

I want to thank Teddy Roggers for his great site, Reversing.be folks(especially haggar),
Arteam folks(Shub-Nigurrath, MaDMAn_H3rCuL3s) and all folks on crackmes.de, thank
to all members of unpack.cn (especially fly and linhanshi). Great thanks to lena151(I like
your tutorials). And finally, thanks to RICARDO NARVAJA and all members on
CRACKSLATINOS.

>>>> If you have any suggestions, comments or corrections email me: kienmanowar[at]reaonline.net