?? mylock.asm
字號(hào):
include w32.inc ;Win32頭文件
.386p
;
; 系統(tǒng)時(shí)間結(jié)構(gòu)定義
;
SYSTEMTIME struct
st_wYear WORD 0 ;年
st_wMonth WORD 0 ;月
st_wDayOfWeek WORD 0 ;星期幾
st_wDay WORD 0 ;日
st_wHour WORD 0 ;小時(shí)
st_wMinute WORD 0 ;分
st_wSecond WORD 0 ;秒
st_wMilliseconds WORD 0 ;毫秒
SYSTEMTIME ends
IMAGE_NT_SIGNATURE EQU 000004550h ;PE文件標(biāo)識(shí)'PE'
;
; 目錄表結(jié)構(gòu)定義
;
IMAGE_DATA_DIRECTORY STRUC
VirtualAddress DD ? ;RVA地址
Size DD ? ;長(zhǎng)度
IMAGE_DATA_DIRECTORY ENDS
;*****************************************************
;**** PE文件頭結(jié)構(gòu)定義 ****
;*****************************************************
IMAGE_NT_HEADERS STRUC
;-----------------PE文件標(biāo)識(shí)'PE'
Signature DD ? ; 4 ;PE文件標(biāo)識(shí)'PE'
;-----------------PE文件頭
Machine DW ? ; 6
NumberOfSections DW ? ; 8 ; 塊數(shù)目
TimeDateStamp DD ? ; 12 ; 文件時(shí)間
PointerToSymbolTable DD ? ; 16
NumberOfSymbols DD ? ; 20 ; 符號(hào)表中符號(hào)個(gè)數(shù)
SizeOfOptionalHeader DW ? ; 22 ; 可選部首長(zhǎng)度
Characteristics DW ? ; 24 ; 信息標(biāo)志
;-----------------可選部首
Magic DW ? ; 26 ; 標(biāo)志字(總是010bh)
MajorLinkerVersion DB ? ; 27 ; 連接器版本號(hào)
MinorLinkerVersion DB ? ; 28
SizeOfCode DD ? ; 32 ; 代碼段大小
SizeOfInitializedData DD ? ; 36 ; 已初始化數(shù)據(jù)塊大小
SizeOfUninitializedData DD ? ; 40 ; 未初始化數(shù)據(jù)塊大小
AddressOfEntryPoint DD ? ; 44 ; 程序起始RVA
BaseOfCode DD ? ; 48 ; 代碼段起始RVA
BaseOfData DD ? ; 52 ; 數(shù)據(jù)段起始RVA
ImageBase DD ? ; 56 ; 裝入基址RVA
SectionAlignment DD ? ; 60 ; 塊對(duì)齊
FileAlignment DD ? ; 64 ; 文件塊對(duì)齊
MajorOperatingSystemVersion DW ? ; 66 ; 所需操作系統(tǒng)版本號(hào)
MinorOperatingSystemVersion DW ? ; 68
MajorImageVersion DW ? ; 70 ; 用戶自定義版本號(hào)
MinorImageVersion DW ? ; 72
MajorSubsystemVersion DW ? ; 74 ; 所需子系統(tǒng)版本號(hào)
MinorSubsystemVersion DW ? ; 76
Win32VersionValue DD ? ; 80 ; 保留
SizeOfImage DD ? ; 84 ; 文件各部分總長(zhǎng)
SizeOfHeaders DD ? ; 88 ; 部首及塊表大小
CheckSum DD ? ; 92 ; 累加和
Subsystem DW ? ; 94
DllCharacteristics DW ? ; 96
SizeOfStackReserve DD ? ; 100
SizeOfStackCommit DD ? ; 104
SizeOfHeapReserve DD ? ; 108
SizeOfHeapCommit DD ? ; 112
LoaderFlags DD ? ; 116
NumberOfRvaAndSizes DD ? ; 120
DataDirectory IMAGE_DATA_DIRECTORY 16 DUP (<0>) ;目錄表
IMAGE_NT_HEADERS ENDS
;*****************************************************
;**** 塊表結(jié)構(gòu)定義 ****
;*****************************************************
IMAGE_SIZEOF_SHORT_NAME EQU 8
IMAGE_SECTION_HEADER STRUC
Name DB 8 DUP (0) ; 塊名
SVirtualSize DD ? ; 該段真實(shí)長(zhǎng)度
SVirtualAddress DD ? ; 該塊的RVA
SizeOfRawData DD ? ; 該塊物理長(zhǎng)度
PointerToRawData DD ? ; 該塊物理偏移
PointerToRelocations DD 0 ; 重定位的偏移
PointerToLinenumbers DD 0 ; 行號(hào)表的偏移
NumberOfRelocations DW 0 ; 重定位項(xiàng)數(shù)目
NumberOfLinenumbers DW 0 ; 行號(hào)表的數(shù)目
SFlags DD ? ; 塊屬性
IMAGE_SECTION_HEADER ENDS
.DATA
mem_offset dd 0 ; address of allocated memory
curr_disp dd 0 ; displacement
bytes_read dd ? ; 計(jì)數(shù)內(nèi)存單元
File_Handle dd 0 ; 文件句柄
Section_Addr dd 0 ; 塊表地址
PE_Header_Addr dd 0 ; PE文件頭數(shù)據(jù)地址
sys_time SYSTEMTIME <0> ; 系統(tǒng)時(shí)間定義的結(jié)構(gòu)
PE_Header IMAGE_NT_HEADERS <0> ; PE文件頭的結(jié)構(gòu)
Section_Table IMAGE_SECTION_HEADER 0Fh dup (<0>) ; 塊表的結(jié)構(gòu)
Header_Len equ size PE_Header + size Section_Table ; PE文件頭和塊表的長(zhǎng)度
Checker_Len equ Checker_End - Checker_Start ; 外殼程序的長(zhǎng)度
Import_Len equ Import_End - My_Import ; 外殼程序的Import表(輸入表)的長(zhǎng)度
Error_Msg db '出錯(cuò)',0
Error_Cmd db '命令行有錯(cuò)!',0dh,0ah,0dh,0ah,'Usage: Cheaker filename',0
OK_Cap db '成功!',0
OK_Msg db '搞定了,Mission Complete!',0
Welcome db '執(zhí)行文件有關(guān)信息: ',80h dup(?)
num_secs db 10,13,'塊數(shù)目 : %02i 代碼段大小 : %08lX',0
img_base db 10,13,'裝入基址RVA : %08lX 已初始化數(shù)據(jù)塊大小 : %08lX',0
ep_rva db 10,13,'程序入口RVA : %08lX 未初始化數(shù)據(jù)塊大小 : %08lX',0
size_img db 10,13,'文件各部分總長(zhǎng) : %08lX 塊對(duì)齊 : %08lX',0
size_head db 10,13,'部首及塊表大小 : %08lX 文件塊對(duì)齊 : %08lX',0
base_code db 10,13,'代碼段起始RVA : %08lX 連接器版本號(hào) : %i.%02i',0
base_data db 10,13,'數(shù)據(jù)段起始RVA : %08lX Dll的屬性字 : %i',0
size_udata db 10,13,'未初始化數(shù)據(jù)塊大小 : %08lX',0
Error_nofile db '文件沒找到!',0
Error_nospace db '沒有足夠未用空間裝入新塊表!',0
Error_nope db '不是有效的PE文件!',0
Error_Format db '格式化軟盤出錯(cuò)!',0
Error_Write db '寫盤出錯(cuò)!',0
Text_Buff db 1d0h dup(?) ;輸出字符串緩沖區(qū)
P_Text dd ? ;字符串緩沖區(qū)指針
new_section:
obj_name db '.ZD_CHK',0 ; 塊名
virt_size dd 0 ; 塊長(zhǎng)
virt_addr dd 0 ; 該塊RVA地址
raw_size dd 0 ; 該塊物理長(zhǎng)度
raw_offset dd 0 ; 該塊物理偏移
unused dd 0,0,0 ; 未用
obj_flags dd 0E0000020h ; 屬性 (r/w/c/x)
hDevice dd ?
;_File db "\\.\vwin32",0
; _CB dd 0h
; _REGS = $
; _reg_EBX dd 0
; _reg_EDX dd 0
; _reg_ECX dd 0
; _reg_EAX dd 0
; _reg_EDI dd 0
; _reg_ESI dd 0
; _reg_Flags dd 0
;
Format_ID db 18h,1h,1h,2h
db 18h,1h,2h,2h
db 18h,1h,3h,2h
db 18h,1h,4h,2h
db 18h,1h,5h,2h
db 18h,1h,6h,2h
db 18h,1h,7h,2h
db 18h,1h,8h,2h
db 18h,1h,9h,2h
db 18h,1h,0ah,2h
db 18h,1h,0bh,2h
db 18h,1h,0ch,2h
db 18h,1h,0dh,2h
db 18h,1h,0eh,2h
db 18h,1h,0fh,2h
db 18h,1h,10h,2h
db 18h,1h,11h,2h
db 18h,1h,12h,2h
.CODE
start:
; ----- 處理命令行 ------------------------------------------------------
call GetCommandLineA ; 獲得命令行字符串指針
mov edi,eax ; 保存到edi
mov ecx, -1 ; 計(jì)數(shù)器
mov al, 0 ; 查找0(結(jié)束符)
push edi ; 保存
repnz scasb ; 查找結(jié)束符
not ecx ; 返回整個(gè)字符串長(zhǎng)度
pop edi ;
mov al, 20h ; 查找20h(第一個(gè)空格后就是目標(biāo)文件名)
repnz scasb ; 查找
dec ecx ; 獲得命令行字符串指針
test ecx,ecx ; 是否有效
jnz Mov_Filename
no_commandline:
push 0 ; Null
push offset Error_Msg ; 對(duì)話框標(biāo)題的地址
push offset Error_Cmd ; 對(duì)話框內(nèi)容加上基址
push 0 ; MB_OK
call MessageBoxA ; 調(diào)用User32!MessageBoxA生成對(duì)話框
jmp quit
Mov_Filename: ;在對(duì)話框的標(biāo)題后加上文件名
push edi ;保存文件名指針
lea esi,Welcome+18 ;目的地址
Loop_Mov:
mov al,byte ptr [edi] ;讀入一個(gè)字節(jié)
mov byte ptr [esi],al ;寫一個(gè)字節(jié)
test al,al ;是否結(jié)束
jz open_file
inc edi
inc esi
jmp Loop_Mov
; ----- 打開文件 -------------------------------------------------------------
open_file:
pop edi
push 0 ; 臨時(shí)文件句柄
push FILE_ATTRIBUTE_NORMAL ; 文件屬性
push OPEN_EXISTING ; 打開方式
push 0 ; 安全屬性指針
push 0 ; 共享模式
push GENERIC_READ + GENERIC_WRITE ; 讀寫方式
push edi ; 文件名指針
call CreateFile
cmp eax, INVALID_HANDLE_VALUE ; 是否成功
jz file_not_found
mov File_Handle, eax ; 保存文件句柄
; ----- 讀3ch處的PE文件頭文件指針 -----------------------------------------------
push FILE_BEGIN ; 移動(dòng)方式(由文件開始處計(jì)數(shù))
push 0 ;
push 3Ch ; 文件指針(3ch處為PE文件頭文件指針)
push File_Handle ; 文件句柄
call SetFilePointer ; 移動(dòng)文件指針
push 0 ; lpOverlapped指針為空
push offset bytes_read ; 計(jì)數(shù)內(nèi)存單元
push 4 ; 讀4個(gè)字節(jié)(一個(gè)dword)
push offset PE_Header_Addr ; 讀到PE_Header_Addr處
push File_Handle ; 文件句柄
call ReadFile ; 讀文件
; ----- 讀PE文件頭 -----------------------------------------------
push FILE_BEGIN ; 由文件開始處計(jì)數(shù)
push 0
push PE_Header_Addr ; PE文件頭文件指針
push File_Handle ; 文件句柄
call SetFilePointer ; 移動(dòng)文件指針
push 0 ; lpOverlapped指針為空
push offset bytes_read ; 計(jì)數(shù)內(nèi)存單元
push Header_Len ; 文件頭長(zhǎng)度=PE文件頭大小+塊表大小
push offset PE_Header ; 讀到PE_Header處
push File_Handle ; 文件句柄
call ReadFile ; 讀文件
; ----- 檢查PE文件標(biāo)識(shí) ----------------------------------------------------
cmp [PE_Header.Signature], IMAGE_NT_SIGNATURE ; 檢查是否是PE文件
jnz not_valid_pe
; ----- 顯示文件有關(guān)信息 ----------------------------------------------------
call show_some_info ; 顯示文件有關(guān)信息
; ----- 獲得塊表偏移 --------------------------------------------
movzx eax, [PE_Header.SizeOfOptionalHeader] ; 可選部首的長(zhǎng)度
add eax, 18h ; 塊表地址(18h為目錄表大小)
mov Section_Addr, eax ; 保存之
; ----- 檢查是否有足夠的未用空間裝入新的塊表 ---------------------------------------
movzx eax, [PE_Header.NumberOfSections] ; 塊的個(gè)數(shù)
inc eax ; 加上1個(gè)新塊
mov ecx, 28h ; 每個(gè)塊表項(xiàng)的大小(28h個(gè)字節(jié))
mul ecx ; 塊的個(gè)數(shù)乘以每個(gè)塊表項(xiàng)的大小=塊表大小
add eax, Section_Addr ; 加上塊表的地址
add eax, PE_Header_Addr ; 加上PE文件頭文件指針=新的文件頭總長(zhǎng)
cmp eax, [PE_Header.SizeOfHeaders] ; 和原文件頭比較大小
jg no_space ; 如果大于就說明沒有文件未用空間裝新的塊表
; ----- 保存輸入表(Import表)的RVA地址 -------------------------------------------
mov eax, [PE_Header.DataDirectory.(8).VirtualAddress] ;獲得Import表的RVA地址
mov Import_Address, eax ;保存之
; ----- 格式化密匙盤 -------------------------------------------
; call Into_Ring_0
extrn DeviceIoControl:proc
push NULL
push FILE_FLAG_DELETE_ON_CLOSE
push 0
push 0
push 3
push 0
push Offset File
call CreateFileA
mov hDevice,eax
;DeviceIoControl (hVWin32, VWIN32_DIOC_DOS_IOCTL,
; ®s, sizeof(regs), ®s, sizeof(regs),
; &cb, 0);
jmp write
mov reg_EAX,0500h
mov reg_EDX,0100h
mov reg_ECX,1800h
mov reg_EBX,offset Format_ID
push 0
push offset CB
push 7*4
push offset REGS
push 7*4
push offset REGS
push 4
push hDevice
call DeviceIoControl
and reg_Flags,0001h
jnz Format_err
write:
mov reg_EAX,0201h
mov reg_EDX,0000h
mov reg_ECX,0001h
mov reg_EBX,offset Disk_Buffer
push 0
push offset CB
push 7*4
push offset REGS
push 7*4
push offset REGS
push 4
push hDevice
call DeviceIoControl
and reg_Flags,0001h
jnz Write_err
mov ecx,512
xor eax,eax
xor edx,edx
_nextadd:
add eax,dword ptr Disk_Buffer+edx
add edx,4
loop _nextadd
mov disk_key,eax
; ----- 產(chǎn)生密匙 -----------------------------------------------
extrn GetSystemTime:proc
push offset sys_time ; SYSTEMTIME struc
call GetSystemTime
movzx ax, [sys_time.st_wMilliseconds] ; get millisecond
mov key, al ; save as encryption key
mov esi, offset Section_Table ; 塊表起始地址
movzx ecx, [PE_Header.NumberOfSections] ; 塊的個(gè)數(shù)
; ----- 對(duì)塊進(jìn)行加密 -----------------------------------------------
Next_Section:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -