作者: Ntoskrnl[Germony] " F6 r; W0 E: ~3 h3 Z' C8 Y翻译:时间风 来自:幻影旅团http://www.ph4nt0m.org/0 D& K6 Y6 Y' A4 Y8 H* U& k+ b
来源:_blank>http://www.rootkit.com/6 i# l# t* g j C) y, A- P
原文:_blank>http://www.rootkit.com/newsread.php?newsid=212 $ c T3 g( b2 N, m" r) A 5 ~: h$ x0 M5 t0 B4 C% I) i) z3 b2 c7 c
正文:9 Z, r" v% `8 _ z* b+ i: `
' X# L, A; {0 p1 ]7 h6 i$ t5 |9 a在这篇文章中,我将为你展示如何废掉WFP,再不需要重起到安全模式或者是恢复控制台的情况下。是的,你听说过。. H! f, F- l9 N( F4 Y
我会向你演示如何改变系统文件并不会让系统注意到并且替换到原文件。如果你不知道WFP是什么,可以在google中7 `" j/ j3 q- i
搜索到:整个英特网都充斥着这样的文章。总之我能够保证并没有关于这个主题的文章。" L# w1 C& B% }
+ M& N9 E0 m0 G+ K5 k' Y4 D
实际上,我过去并不想放出来这篇文章。主要因为我害怕它会帮助病毒和间谍软件也去这么做。当时,因为我写了相 g6 Y f& P' t* [- \! h" M1 A关的代码并且马上给了某个人。改变我想法的是这个代码只会在你以管理员权限运行这个代码的时候才会起作用并且1 ~# l- b8 a5 k& H) K
这个程序以这个特权运行将会造成相当大的破坏。所以我认为这段代码不会造成很坏的影响。此外,系统文件保护如 ( d5 u( r, F. z% t2 q) O5 r果按照这个方法和用这个代码执行将会过时。所以我认为发布的时候到了。XP-SP2已经发布没有影响WFP,这样意味( D% D% e- V- ^9 G- t3 {
着这段代码的公布不会给任何人造成损坏(去使用这段代码或是相同的技术)。顺便说一句,欺骗WFP并不是什么难 1 c0 _9 S$ M o' O$ D$ m9 C事,他只花费了我2个小时去完成了它。" P6 S; T0 p9 S- g
1 H0 v. x1 X5 x# `9 n' L! K
首先,在我们编些什么之前,我们不得不来看看WFP是如何工作的。我不得不作这个去看看sfc_os.dll(sfc.dll如9 |7 F& L3 P5 u* h) i
果我们讨论的是Win2k)和Winlogon.exe(它是负责呼叫sfc.dll,当然了,去完成这个也是很简单的,亦仅仅需要3 Y% M; O4 H' h/ ?/ s+ J5 H
一个进程查看器)没有必要反汇编,我只是说Winlogon引用sfc.dll,当然了我那时指的是sfc_os.dll(绝大多数 $ \- q3 a, O7 N4 J# w3 q. o3 msfc.dll出口是向前的。当然我们讨论的是XP)这个函数是依次启动WFP,继续进入到sfc_os.dll序数1。是什么执7 ~1 ^" [# v7 J g5 t+ v
行这个函数呢?我过去通读了代码,那时我发现这个呼叫重新得到WFP的注册值得选择权,后来我看到许多事件填充, $ @( p2 T, h: x7 E) m7 j1 a突然我明白了 - J# i! W% h2 Z3 B7 m7 v, e 2 i1 \5 Q& ]$ O* m代码如下: 0 ? N v0 O6 I! p4 k' X7 q ( D* U% O8 \) J. A. Z# X- n4 I: O1 t# q! ~ X* D
.text:76C2B9ED push ebp0 i1 q% ~; b: e- d" d
.text:76C2B9EE mov ebp, esp7 o! V# G8 ^! q2 G6 F0 g; |
.text:76C2B9F0 push ebx9 _8 c T+ n. A* i2 w
.text:76C2B9F1 push esi - f; \ V1 e; E5 _$ @7 W.text:76C2B9F2 mov esi, [ebp+arg_0]3 @" T \2 i7 `$ U
.text:76C2B9F5 mov eax, [esi+14h] & g$ \. i- v2 S2 O/ C2 P.text:76C2B9F8 xor ebx, ebx3 }/ \+ ]7 R n
.text:76C2B9FA cmp eax, ebx# J3 Y5 T# m% Q- `" H D, A6 ~
.text:76C2B9FC jz short loc_76C2BA1B# _3 w# P* D! A o9 M5 k, W7 k
.text:76C2B9FE cmp [eax+134h], ebx i ?" f! h! W2 b% V
.text:76C2BA04 jz short loc_76C2BA1B/ |( {7 r4 |- h" Z% ~
.text:76C2BA06 mov eax, [eax+138h] 8 A, \2 K/ c% i* B7 I+ v; G1 Z# I.text:76C2BA0C and al, 1' J6 U: ~3 S) o6 @
.text:76C2BA0E dec al , L [$ ]8 W9 }, e.text:76C2BA10 neg al 3 d" r- _8 d* R; y3 _$ z. l2 ~.text:76C2BA12 sbb al, al 9 k& h. Y: G6 [& J.text:76C2BA14 inc al2 k, F% U! z* R- P3 r
.text:76C2BA16 mov byte ptr [ebp+arg_0], al & D6 ?$ |+ W+ [0 K( W3 I9 `.text:76C2BA19 jmp short loc_76C2BA1E+ Z' d! `. S+ ], t; A
.text:76C2BA1B 4 F- s* [+ t' Z# K$ e0 b# @ J.text:76C2BA1B loc_76C2BA1B: 6 T, T# `; h; D# T
.text:76C2BA1B 4 c! k- |- p/ c1 U$ M) G" V g.text:76C2BA1B mov byte ptr [ebp+arg_0], bl# g2 |# F) k+ X' H& [
.text:76C2BA1E 3 ^0 h4 t7 c9 ].text:76C2BA1E loc_76C2BA1E: # t. m6 r {' `4 i6 g* [
.text:76C2BA1E " D y. Q- ~( L6 T* p.text:76C2BA1E push [ebp+arg_0]; [& O/ f; M, x5 W
.text:76C2BA21 lea eax, [esi+8] o2 m& X/ z! ^( Z
.text:76C2BA24 push 0C5Bh, ^# W% u1 w* N p5 r5 M: u$ E
.text:76C2BA29 push 1000h! t6 k f! I& c% Z& u0 [* n) p, [/ E
.text:76C2BA2E push dword ptr [esi+10h] 8 \6 [& L8 Z. C* U E. E.text:76C2BA31 push eax) ?6 [; w" ]! C" U0 u
.text:76C2BA32 push ebx. I: V- |3 O G- T( s$ ?7 T: `
.text:76C2BA33 push ebx$ w! i6 r L: y6 W
.text:76C2BA34 push dword ptr [esi+4]7 }+ @; k z- g H% C2 F0 C9 T- \
.text:76C2BA37 push dword ptr [esi]: {# r5 ]: [1 l9 a
.text:76C2BA39 call ds:NtNotifyChangeDirectoryFile + o B5 i# F5 B- c5 H.text:76C2BA3F cmp eax, ebx' ?* K; \) X( {) B9 M5 b0 I
.text:76C2BA41 jge short loc_76C2BA9A % I; d9 s- v0 W" a& c.text:76C2BA43 cmp eax, 103h ) b, v: ^' @( a$ L1 U$ B6 h.text:76C2BA48 jnz short loc_76C2BA76 * Z$ u4 x3 W+ t3 n.text:76C2BA4A push ebx$ D) q7 l7 m* I
.text:76C2BA4B push 12 K# z B/ b! z9 K4 q9 E
.text:76C2BA4D push dword ptr [esi+4] " |1 x( X( s7 N0 g! C.text:76C2BA50 call ds:NtWaitForSingleObject ' p) X$ g/ f. O s9 J9 n5 [.text:76C2BA56 cmp eax, ebx2 G9 ~' C% p( O/ u7 ^* z0 q
.text:76C2BA58 jge short loc_76C2BA9A # \! ?: Y0 ^7 {: a* M + B5 d0 C0 k4 M& O! u5 b: \4 D# _( S5 M- k {( d8 P
X; q) d$ k7 w y/ K
我意识到WFP被以用户模式执行,仅仅是前后对照(一个多么残疾的保护)也许你不熟悉NtNotifyChangeDirectoryFile U ^. _) J o
(NT确定改变目录文件)FindFirstChangeNotification(寻找首先改变的通告的本地函数)...让我们看看msdn文档:# U5 r) ]8 Z% G9 {, F, y, ^4 T
7 C. c+ Q' ^& w2 z; r) z5 Z" D"FindFirstChangeNotification函数创建一个改变通告句柄并且建立最初的改变通告过滤条件。一个等待通告句柄的成功 9 ~4 o4 I0 \6 |; c执行当一个改变发生和一个过滤条件相匹配的时候在特定的目录或者分支。然而,这个函数不需要改变满足这个等待条件。" {$ d3 {0 C+ I+ n! q8 k1 g. w" u# p1 ]- F6 I# O; Y, s0 s
"这个等待函数能够监视特定目录或者子树通过使用FindFirstChangeNotification函数返回的句柄。一个等待满足这时候 7 M) |% G3 S6 ^2 Q: \* \一个过滤条件发生在监视目录或者子树5 e H. _" w6 e) Y4 o
5 V/ B0 V0 j5 }在这个等候已经被满足之后,应用程序能够回应给条件并且继续监视目录通过呼叫FindNextChangeNotification函数和合适的等待函数"当句柄不在需要的时候,她能够使用FindCloseChangeNotification函数关闭。": n, S' M; h' Q7 h& |
! @* X W' |* l7 L, O这个意味着什么呢?Winlogon的进程(通过sfc)监视每一个包含受保护文件的目录,实际上如果你用一个目标查看器调查进程(比如说基于sysinternals),你会看到一个句柄对于每一个受保护的目录。意味着我们只要关闭这些句柄用FindCloseChangeNotification或者CloseHandle去停止WFP监视系统目录。 ' v8 X/ D+ [& ?' j # \2 E$ }, y0 E" _6 T! l/ n& M- L好了,这里就是了:我们不能使WFP丧失能力从用户模式代码...cool,不是吗?不完全,事实上:如果这个工作不是那样简单会更好一些,我是说系统安全。 0 {6 C# X0 u. U" j) F$ o p$ i% y2 _' f \
让我们开始编写:这个函数的句法,我是这样写的: . g8 u; B. j* W2 p / c' c! I) } `3 P/ qvoid main() " s( H3 t0 G% v! X{ / z! x) a) ]4 s2 d. w# R9 q, n
if (FuckWFPInTheAss() == TRUE) 2 Z5 P0 Z* q2 }9 A9 H+ r$ h8 {{9 D6 X! U, R, |6 Q& n# w4 Q' F7 ^
// ok & ~9 j/ t* ~& J$ I6 w& @; }3 L6 _8 z} ( y# q* q4 u9 N. a) q9 W# [7 U" ]else 6 y* \4 B4 v4 ~$ M7 ]# ]{ 5 v/ |. v* ^, S// wrong) ?6 C8 O) z1 u6 @7 ?8 J
}+ w9 c' \; F0 g/ H. `$ f+ o& e8 u
}! K0 h, b8 ]1 V- t
* A0 t! X$ T! L! `" C1 Kif (!GetVersionEx((OSVERSIONINFO *) &osvi))* m! t% m1 D o2 H$ V
{ ! ] m; y, C" K) josvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);6 y, Z% | x, m Q9 e" _0 S
, } S- f. K2 k( f' @$ n5 \0 ~if (!GetVersionEx ((OSVERSIONINFO *) &osvi)) 7 F! k5 s6 {% V' p" t8 ]return FALSE;. q# A) J; r" \ |: C# T: M
}3 A. i" b! f0 t# Q, q