Trao đổi với tôi

http://www.buidao.com

1/5/10

[MASM] Extract the file’s resource to a file.

Author: Benina

I-Mở đầu:

Có nhiều cách 1 file đẻ ra một file khác. File đẻ ra tôi gọi là file mẹ, còn file sinh ra tôi gọi là file con.
Cách thông dụng nhất là ta dùng resource của file mẹ để chứa file con, lúc đó loại resource là lọai binary tức là một file mã máy hay nói nôm na là file dll hay exe mà các bác muốn đính kèm vào file mẹ. Lúc này file mẹ “dính bầu”. Khi lập trình ta cho type của resource là RCDATA.

Để khi thực thi nó trích xuất ra file dll hay exe (tức là file mẹ đẻ con)như yêu cầu thì trong chương trình chính file mẹ(đã có resource rcdata là file dll hay exe mà ta đã add), đầu tiên ta dùng hàm FindResource để tìm resource đó, nó trả về là một handle mà ta dùng nó cho các hàm sau. Sau đó là dùng hàm LoadResource để load nó vào trong memory. Kế tiếp các bác dùng hàm SizeofResource để tính size của nó là bao nhiêu để dùng sau này. Kế đến bác dùng hàm LockResource sẽ chỉ định resource trong bộ nhớ. Nếu resource đã load bị lock, giá trị trả về là con trỏ đến byte đầu tiên của resource, nếu ngược lại là NULL.

Bây giờ ta đã có đủ các info cần thiết và resource binary đã load vào trong memory. Việc cuối cùng là cài đặt file dll hay exe như yêu cầu. Ta dùng hàm CreateFile để cài đặt. Sau khi cài đặt thành công ta bắt đầu copy toàn bộ resource trên đã load trong bộ nhớ vào file đã cài bằng hàm CreateFile. Để copy data vào file bạn phải dùng hàm WriteFile và một loop copy các byte lần lượt từ resource vào file với số bytes cần copy là size được tìm trước đó bằng hàm SizeofResource. Đến đây là xong và nhớ close handle file đã cài đặt.
Còn một cách củ chuối là các bác dùng 1 chương trình soạn thảo (có thể dùng Olly+Plugin) nào đó chuyển đổi và edit toàn bộ file dll (exe) thành một khối dữ liệu dạng số hex và khai báo khối data số hex đó vào chương trình như một biến có giá trị đầu và có size là tổng kích thước các bytes. Sau đó dùng hàm CreateFile và WriteFile như trên để tạo ra file dll.
Còn nếu các bác pro một chút, tức là bác hiểu rõ cấu trúc file PE và biết asm thì bác có thể tạo ra 1 file khác từ khối cấu trúc dữ liệu định dạng như cấu trúc file PE trong chương trình chính . Cách này pro ở chổ bác vừa code chương trình mẹ mà vửa code luôn dll trong 1 file chương trình. Link sau đây là một ví dụ: http://www.phreedom.org/solar/code/tinype/.
Một trong những người ứng dụng hoàn hảo pp này là tác giả patcher DUP2
Nói túm lại là làm sao bác load khối bytes là file dll vào memory và copy nó ra 1 file.
Tôi nhớ ko lầm thì có con trojan nó ko đính kèm khối data binary file dll vào trong nó, mà nó sẽ tìm khối binary trong 1 file khác, ví dụ như file ảnh jpg chẳng hạn. Nói chung nhiều mánh khóe trên giang hồ.
Chúc bác thành công.

II-Thực hành:

_Dùng RadASM làm bộ sọan thảo như thông thường.

_Trong Menu Project/Resource tôi add 1 resource có lọai type là RCDATA, file là masgbox.exe, Name là idc_exe, ID=500.

_Trong file inc nhớ khai báo

.const

idc_exe equ 500

_Sau đó tạo 1 button có Caption là “Extract”. Khi nhấn button này thì nó sẽ extract ra 1 file exe

Đây là file ExtractResource.inc



include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc

include \masm32\macros\macros.asm

includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib

DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM

.const

IDD_DIALOG1 equ 101
IDC_extract equ 1001 ;ID of Button Extract
idc_exe equ 500 ;ID of Resource file exe

;#########################################################################

.data?

hInstance dd ?
file_handle dd ? ;Handle of CreateFile
numWriten dd ? ;Using in WriteFile


;-------------------------------
;For Load Resource into memory
;-------------------------------

hResource DD ?
hDataOld DD ?
SizeRes DD ?
pData DD ?

.data


filename_ db 'virusfile.exe', 0 ;File name for extract file



;#########################################################################


Và đây là chương trình chính ExtractResource.asm

.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive

include ExtractResource.inc

.code

start:

invoke GetModuleHandle,NULL
mov hInstance,eax

invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0

;########################################################################

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

mov eax,uMsg
.if eax==WM_INITDIALOG

.elseif eax==WM_COMMAND
mov eax,wParam
mov edx,eax
shr edx,16
.if eax==IDC_extract

;----------------------------------------
;Your code at here
;----------------------------------------
;Loading the rc exe into memory
;----------------------------------------
INVOKE FindResource,hInstance,idc_exe,RT_RCDATA
mov hResource,eax
INVOKE LoadResource,hInstance,hResource
mov hDataOld,eax
INVOKE SizeofResource,hInstance,hResource
mov SizeRes,eax
INVOKE LockResource,hDataOld
mov pData,eax

;----------Loop write file-------------------------

invoke CreateFile,addr filename_,\
FILE_ALL_ACCESS,\
0,\
NULL,\
CREATE_ALWAYS,\
0,\
NULL
mov file_handle,eax
.if eax!=INVALID_HANDLE_VALUE
mov ebx,SizeRes
.while ebx>0
invoke WriteFile,file_handle,pData,1,addr numWriten,NULL

inc pData
dec ebx


.endw
invoke CloseHandle,file_handle
invoke MessageBox,hWin,chr$("Extract this file's resource to a file"),chr$("Tested"),MB_OK
.elseif
invoke MessageBox,hWin,chr$("No Extract this file's resource to a file"),chr$("Error"),MB_OK
.endif

.endif
;-------------------------------------------------------------------------------------
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret

DlgProc endp

end start

Năm 2008
Benina