Windows 系统文件保护(续)


研究了一晚上,发现:

第一种方法并不容易实现,而且过程繁琐
第二种方法可以实现,但由于需要采用远程注入的方式来调用未公开函数 SfcTerminateWatcherThread(sfc_os.dll 中序号为 2,此函数必须在 WinLogon 进程内调用才生效),这样就存在一个限制,因为要调用 CreateRemoteThread 在 WinLogon 进程空间内创建远程线程,而这个功能会被很多病毒监控程序截获而导致失败,所以也不易采用

最后只剩下第三种方案了,它采用 SfcFileException(sfc_os.dll 中序号为 5) 函数来临时禁止对某一个文件的保护,禁用时间是一分钟,超过一分钟后保护自动恢复。

最后决定采用第三方案,剩下的问题就是如何调用这个函数指针?满世界找都没有 vfp 调用函数指针的资料,以前研究过 Calvin Hsia's 的 vfp 多线程代码,记得可以用嵌入一段汇编代码的方法来实现函数指针的调用,由于太复杂,当时没有深究,回过头再看看,发现原来还是有所不同,他的汇编代码实现的是一段回调函数,调用函数指针的代码是在汇编块内,直接参数压栈后再 mov eax,函数指针,push eax,再 call eax,可惜咱这里需要先解决从执行 vfp 代码到执行汇编代码的转移,不适用,哭吧!

好在以前看过可以用调用最常见的 CallWindowProc 这个 api 函数的另类用法的文章,具体在那本书就记不起来了。只好自己写一段汇编代码,好长时间没摸汇编了,结果可想而知,经历不少于 10 次的自动重启之后,决定还是找找有没有别人写好的代码可用;运气好,最后找到一段名叫阿国的牛人写的 vb 代码(参见:http://www.aguoge.com/show.htm?id=23),虽然他写这段代码不是用来实现这个功能的,但它的那段汇编代码可以借用,改为 vfp 的语法来实现后的代码如下:


#define C_FILE      'c:/windows/notepad.exe'     && 改为你要关闭保护的文件

LOCAL cFile, hDll, pFunc, pFile, pParams, iResult
PRIVATE hHeap

DECLARE Long CallWindowProc IN WIN32API ;
  Long lpFunc, Long hWnd, Long nMsg, Long wParam, Long @ lParam

DECLARE Long GetProcessHeap IN WIN32API
DECLARE Long HeapAlloc IN WIN32API Long hHeap, Long dwFlags, Long dwBytes
DECLARE Long HeapFree  IN WIN32API Long hHeap, Long dwFlags, Long lpMem

DECLARE Long LoadLibrary IN WIN32API String lpFileName
DECLARE Long FreeLibrary IN WIN32API Long hModule
DECLARE Long GetProcAddress IN WIN32API AS GetAddr_n ;
  Long hModule, Long dwProcOrdinal

m.hDll = LoadLibrary( "sfc_os.dll" )
m.pFunc = GetAddr_n( m.hDll, 5 )       && 取 SfcFileException 的函数指针

m.hHeap = GetProcessHeap()
m.cFile = STRCONV( C_FILE+CHR(0), 5 )  && 函数 SfcFileException 需要 Unicode 格式的文件名
m.pFile = HeapAlloc( m.hHeap, 8, LEN(m.cFile) )
SYS( 2600, m.pFile, LEN(m.cFile), m.cFile )
m.pParams = HeapAlloc( m.hHeap, 8, 12 )
*!* 调用 SfcFileException 函数的参数: 0, 文件名, -1
SYS( 2600, m.pParams, 12, BINTOC(0,'rs')+BINTOC(m.pFile,'rs')+BINTOC(-1,'rs'))
m.iResult = CallPtrFunc( m.pFunc, m.pParams, 3 )
FreeLibrary( m.hDll )
HeapFree( m.hHeap, 0, m.pFile )
HeapFree( m.hHeap, 0, m.pParams )

IF ( 0 == m.iResult )
  TEXT TO m.cMsg NOSHOW TEXTMERGE
文件 <<C_FILE>> 的保护已被暂时关闭,一分钟后自动恢复 

现在你可以修改/更名/替换它了 ...
  ENDTEXT
  MESSAGEBOX
( m.cMsg, 64, '关闭保护成功' )
ELSE
  MESSAGEBOX
( '关闭保护失败,或许它本来就未受 Windows 保护。', 16, '错误' )
ENDIF


FUNCTION
CallPtrFunc( pFn, pParam, iCount )

  LOCAL sCode, pCode, iRet0, iRet1

  m.sCode = ;
    0h558BEC53E8000000005B81EB2C1100108D934A1100105264FF35000000006489250000 ;
  + 0h0000EB1F8B44240CE8000000005981E9531100108D91971100108990B800000033C0C3 ;
  + 0h8B550C8B4D108D148AEB068D52FCFF32490BC975F68B4508FFD0648F050000000083C4 ;
  + 0h048B4D1489015BC9C21000648F050000000083C40433C08B4D1489215BC9C210009090

  m.pCode = HeapAlloc( m.hHeap, 8, LEN(m.sCode) )
  SYS( 2600, m.pCode, LEN(m.sCode), m.sCode )

  m.iRet0 = 0
  m.iRet1 = CallWindowProc( m.pCode, m.pFn, m.pParam, m.iCount, @ m.iRet0 )
  HeapFree( m.hHeap, 0, m.pCode )

  IF ( m.iRet0 != m.iRet1 )
    m.iRet1 = -1
    ERROR '严重错误,函数执行结果不可用。'
  ENDIF
  RETURN
m.iRet1
ENDFUNC
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值