1. Trang chủ
  2. » Công Nghệ Thông Tin

Cracking part 32 pdf

6 201 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 155,29 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

safe_address: invoke ExitProcess,0 end start Cách 4: APi Redirection Một cách khác mà tôi nghĩ ra đó là dựa vào cơ chế quản lý các hàm api được gọi trong chương trình debug của Ollydb

Trang 1

1 Tạo lỗi ngoại lệ và nhảy tới bộ quản lý lỗi khi và chỉ khi chương trình không bị debug

2 Trong bộ xử lí, lấy cấu trúc EXCEPTION_POINTERS từ stack

3 Từ cấu trúc EXCEPTION_POINTERS, lấy cấu trúc CONTEXT

4 Thay đổi regEIP của cấu trúc CONTEXT sang vị trí lệnh mà chương trình sẽ thực thi tiếp

5 Đặt cờ EXCEPTION_CONTINUE_EXECUTION vào EAX

6 Phục hồi stack và tiếp tục thực thi chương trình

Code minh họa:

Code:

.586

.model flat, stdcall

option casemap:none

include d:\masm32\INCLUDE\Windows.inc

include d:\masm32\INCLUDE\user32.inc

include d:\masm32\INCLUDE\kernel32.inc

includelib d:\masm32\lib\user32.lib

includelib d:\masm32\lib\kernel32.lib

.data

strCaption db "OllyDbg Detector",0

strNotFound db "OllyDbg NOT found!",0

.code

ExcpHandler proc

mov eax, dword ptr [esp+4]; eax = EXCEPTION_POINTERS

mov eax, [eax+4] ; eax = CONTEXT

assume eax:ptr CONTEXT

mov [eax].regEip, offset safe_address; Change regEip

pushad

invoke MessageBox,0,addr strNotFound,addr strCaption,0

popad

xor eax, eax ;\

; ) Set EXCEPTION_CONTINUE_EXECUTION

dec eax ;/

retn 4 ; Normalize stack and return

ExcpHandler endp

start:

invoke SetUnhandledExceptionFilter,offset ExcpHandler

Trang 2

mov ebx,dword ptr [0FFFFFFFFh] ;Exception is here!

safe_address:

invoke ExitProcess,0

end start

Cách 4: APi Redirection

Một cách khác mà tôi nghĩ ra đó là dựa vào cơ chế quản lý các hàm api được gọi trong chương trình debug của Ollydbg Oleh Yuschuk (tác giả của OllyDbg) đã sử dụng api redirection khi chương trình bị debug gọi hàm api Có thể xem vd dưới đây:

Code:

00401000 >PUSH ASD.00403033 ; /FileName = "kernel32.dll"

00401005 CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA

|

|

' > 0040105C JMP DWORD PTR DS:[402004]; JMP DWORD PTR

DS:[<&KERNEL32.LoadLibraryA>]

|

|

' > 87FF4120 PUSH BFF776D0 ; PUSH KERNEL32.LoadLibraryA

87FF4125 JMP KERNEL32.BFF957CA

Điều này có nghĩa là, tác giả đã load bảng Import Table từ chương trình bị debug và sau

đó điền các giá trị mới vào IAT, redirect các hàm API gốc qua một buffer chứa hàm gọi tới địa chỉ API thật Quan trọng nhất là tác giả OllyDbg đã mô phỏng hàm

GetProcAddress , khiến cho nó luôn trả về giá trị đã bị redirect thay vì là giá trị gốc ban đầu.Vd như giá trị địa chỉ thật của IsDebuggerPresent trong vùng nhớ là BFF946F6, nhưng hàm luôn trả về 87FF4110, đây là redirected address Như vậy, ta sẽ dùng cách thức này để phát hiện Olly

Cách thức thực hiện:

1 Nạp thư viện kernel32.dll, ta sẽ có giá trị trả về là Image Base (vị trí mà thư viện này nạp trong vùng nhớ)

2 Gọi hàm Call GetProcAddress để lấy địa chỉ của hàm ExitProcess

3 So sánh giá trị trả về từ hàm GetProcAddress với giá trị từ Image Base của kernel32.dll

4 Nếu giá trị trả về là lớn hơn, đều này có nghĩa là hàm này được gọi trực tiếp, o bị redirected và ngược lại

Trang 3

Code minh họa:

Code:

.586

.model flat, stdcall

option casemap:none

include d:\masm32\INCLUDE\Windows.inc

include d:\masm32\INCLUDE\user32.inc

include d:\masm32\INCLUDE\kernel32.inc

includelib d:\masm32\lib\user32.lib

includelib d:\masm32\lib\kernel32.lib

.data

strCaption db "OllyDbg Detector",0

strFound db "OllyDbg found!",0

strNotFound db "OllyDbg NOT found!",0

strLibrary db "kernel32.dll",0

strFunction db "ExitProcess",0

.code

start:

invoke LoadLibrary,addr strLibrary

push eax; eax = kernel32.dll's Image Base

invoke GetProcAddress,eax,addr strFunction

; eax = ExitProcess's address or redirector ?

; ebx = kernel32.dll's Image Base

pop ebx

cmp eax,ebx ; Address of ExitProcess < Kernel32.dll's

; Image Base ?

jl Olly_Detected

invoke MessageBox,0,addr strNotFound,addr strCaption,NULL invoke ExitProcess,0

Olly_Detected:

invoke MessageBox,0,addr strFound,addr strCaption,NULL invoke ExitProcess,0

end start

Trang 4

computer_angel (http://www.reaonline.net) PHƯƠNG PHÁP DÙNG STACK

I – Giới thiệu :

I.1 – Giới thiệu :

- Phương pháp này được dùng trong trường hợp không tìm thấy Death-List ( trực tiếp – tìm thấy trong Olly; hay gián tiếp - Win32dasm … )

- Phương pháp này dựa trên cơ sở chuỗi Death-List thay vì hiện trực tiếp thì sẽ được “ ẩn

đi ” và chỉ xuất hiện khi được gọi đến Và để xuất hiện được thông báo chương trình cần phải lưu các thông số cần thiết vào STACK

- Phương pháp này chính là tìm các dữ liện được nạp vào từ trong STACK, từ đó ta truy

ra được mục tiêu cần tiếp cận

I.2 – Phương pháp tổng quát :

*** Load chương trình bằng Olly

*** Chạy chương trình với Fake Serial, chương trình sẽ hiện thông báo sai

*** Nhấn F12, Olly sẽ dùng lại chương trình tại điểm xuất hiện NAG

*** Nhấn Alt-K để mở cửa sổ : Call Stack of Main Thread

*** Double-Click vào hàm hiện thông báo ta trở về chương trình chính

*** Từ đây ta xác định được mục tiêu cần tiếp cận

I.3 – Dạng chương trình áp dụng :

>>>>>>> Tất cả các dạng chương trình đều có thể sử dụng phương pháp nạy Tuy nhiên, đối với các chương trình có sử dụng hàm MessageBoxA để hiện thông báo thì cách thức

sẽ có phần đơn giản hơn

- Dạng chuỗi được mã hoá, và chỉ xuất hiện khi quá trình xử lý

- Dạng không có chuỗi trong Olly, trong kWdsm 10 hay chuỗi mã hoá

- Dạng không có thông báo trong hàm MessageBoxA

- Dạng không sử dụng hàm MessageBoxA ( thường là các chương trình được viết bằng ngôn ngữ Borland Delphi )

II – Thực hành :

II.1 – Dạng chuỗi đã được mã hoá, và chỉ hiện diện sau khi đã được RE :

Homepage : http://www.audio-recorder.net

Soft : Audio Recorder Deluxe v2.2.36

Cracked File : ard.exe (Microsoft Visual C++ 6.0)

Trang 5

- Dùng PeiD kiểm tra biết chương trình được viết bằng Micorsoft Visual C++ 7.0

Method2

- Chạy thử chương trình với User (U) và Fake Serial (FR) ta nhận được thông báo

"Incorrect code" Ta không thể tìm được chuỗi này trong Olly cũng như trong kWdsm

10, nên ta dử dụng phương pháp dùng STACK :

**** Load và chạy chương trình với U và FR Chương trình xuất hiện thông báo

"Incorrect code" Giữ nguyên chương trình Quay trở lại Olly

**** Sau khi quay trở lại Olly, nhấn F12, Olly sẽ dừng chương trình lại Nhấn tiếp Alt-K

để hiện cửa sổ Call stack of main thread Ta thấy ngay thông báo :

Quote:

0012D8D8 0017030C hOwner = 0017030C (class='#32770',

0012D8DC 004E6758 Text = "Incorrect code"

0012D8E0 004E6448 Title = "Help"

0012D8E4 00000030 Style = MB_OK|MB_ICONEXCLAMATION|M

0012D8E8 00000000 LanguageID = 0 (LANG_NEUTRAL)

0012D8EC 004993A2 ? USER32.MessageBoxA ard.0049939C

0012D8F0 0017030C hOwner = 0017030C (class='#32770',

0012D8F4 004E6758 Text = "Incorrect code"

0012D8F8 004E6448 Title = "Help"

0012D8FC 00000030 Style = MB_OK|MB_ICONEXCLAMATION|M

0012D904 0041B21B ? ard.00499374 ard.0041B216

**** Ở đây ta chú ý đến dòng :

Quote:

0012D8EC 004993A2 ? USER32.MessageBoxA ard.0049939C

**** Double-Click vào dòng này ta đến địa chỉ 0049939C :

Quote:

0049939C | FF15 68365300 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>;

\MessageBoxA

004993A2 | 5E POP ESI ; <== Set BreakPoint here

**** Sau khi đặt BP ở đây, Olly sẽ dừng chương trình lại, nhấn F8 để xuất hiện lại thông

báo "Incorrect code" Nhấn OK để chấp nhận thông báo này, chương trình sẽ dừng lại

ngay tại điểm BP này Xoá điểm đặt BP này đi Và dùng F8 trace tiếp

**** Sau khi trace qua một số lần (ở chương trình này là 1 lần ) RETN ta nhìn lên trên chút và thấy

Quote:

0041B20C 68 48644E00 PUSH ard.004E6448 ; ASCII "Help"

0041B211 68 58674E00 PUSH ard.004E6758 ; ASCII "Incorrect code"

0041B216 > E8 59E10700 CALL ard.00499374

**** Ghi nhớ địa chỉ đoạn CODE này (0041B20C) Load chương trình lại bằng Olly, truy đến địa chỉ này ta thấy thông báo ở đây :

Trang 6

 

Ngày đăng: 01/07/2014, 13:20

TỪ KHÓA LIÊN QUAN