设为首页收藏本站

0GiNr技术社区

 找回密码
 申请加入

QQ登录

只需一步,快速开始

查看: 519|回复: 2

avpbase.dll的一点学习笔记(4)CBase::DoRecords

[复制链接]

4

主题

1

好友

11

积分

微牛

Rank: 1

贡献
0 点
威望
1 点
金钱
1038 元
经验
0 点
精华
0
发表于 2011-11-24 13:13:49 |显示全部楼层
凡本论坛原创内容,其作者享有著作权,未经许可谢绝转载。
卡巴对文件的查毒是调用的AVP_ProcessObject,然后经历了打开获取句柄、确定大小、格式识别和_GetFirstEntry后,就到了CBaseWork::DoRecords(WORD Type, R_File_CureData** curedata)中。这个帖子就扯下CBaseWork::DoRecords()。, D4 h+ c5 W  B4 [% W
在此之前小哭一下,_GetFirstEntry和_GetNextEntry似乎是蛮重要的代码,卡巴似乎把一个文件分成了多个Entry,然后_GetFirstEntry和_GetNextEntry将每个Entry读取到
  1. typedef struct _CWorkArea{
    $ ]% D4 ]! @+ F4 E1 p2 D+ @
  2.         BYTE    m_Header[HEADER_SIZE];6 x# m% c# C0 J/ V  p1 ]! G+ g2 |
  3.         BYTE    m_Page_A[PAGE_A_SIZE];$ p1 O2 e3 z6 Y# C0 c
  4.         BYTE    m_Page_B[PAGE_B_SIZE];1 D; i2 X( Y. v3 k  j9 {! [. w( T& X+ U
  5.         BYTE    m_Page_E[PAGE_E_SIZE];
    : z: r, j  f& m7 y) v% G
  6.         BYTE    m_Page_C[PAGE_C_SIZE];
复制代码
中,然后再由DoRecords对缓存查毒,可是,这么重要的两个函数竟然是在库文件krnengn.avc中的,哪位大神赐给我这两个函数的代码啊。* ~( E+ b: F9 z: U, z0 y$ `

/ J7 _+ n/ p: A- o- H% W& Ivoid* CBaseWork::DoRecords(WORD Type, R_File_CureData** curedata) 中做的事很简单,遍历每个病毒库,让他们都void* CBase::DoRecords(WORD type,CWorkArea* pWorkArea, R_File_CureData** curedata)一次,谁查到就返回了。
0 [( H# t, Y# Q. @6 X, Q' W& D6 L, ^* j3 E+ P& [8 M" n0 q+ {
CBase::DoRecords依据参数type来进行不同类型的查毒,我就只关注RT_FILE文件类型的查毒了,呃,这个,这个代码被我重名和注释后似乎也比较容易理解,我就直接贴代码了
  1. void* CBase::DoRecords(WORD type,CWorkArea* pWorkArea, R_File_CureData** curedata){
    + i1 d1 R& F: F( {% Z' I, j# h6 X
  2.         DWORD SubType=(DWORD)pWorkArea->m_SubType;6 f- i- M2 r* ~) X8 O
  3.         BData* _bdata=bdata;
    $ t% B: J# N0 s& F6 d. w1 V
  4.         switch(type)3 p! Y- ^$ ^+ k' z
  5.         {: p9 Y  T6 z8 o  D( K
  6.         case RT_FILE:' K6 M* y0 W; `" y
  7.                 {
    6 s1 x, ?  _3 L0 ^2 k+ `0 n
  8.                         DWORD SubType=(DWORD)pWorkArea->m_SubType;
    # y( E4 u: l# T
  9.                         UINT nSubTypeBitNo = GetSubtypeBitNo((BYTE)SubType);  //获取子类型
    " b7 f* }! o7 k- h/ @
  10.                         BYTE* pSubQueue = m_SubTypeRangeArray[nSubTypeBitNo].pSubQueue;
    ( b5 _$ w; k/ h& a
  11. & J3 z% P$ V& s% ?! n
  12.                         if(!pSubQueue)
    / A& z# F6 G4 R. s
  13.                                 break;4 h& Z# q; k! q0 s3 W

  14. 0 {8 g: j( K' F$ q& ^3 q( g  Z
  15.                         R_File_Cutted* rp0 = (R_File_Cutted*)(m_RPtrTable[type]);/ z4 P+ {- f0 H6 E
  16. ' j- a6 k- G9 U  ^- r5 S
  17.                         unsigned int nThisType = *pSubQueue;        // 取出本子类记录的个数
      P: j( `& r! w& S" L% J& L  B
  18.                         pSubQueue++;! p+ X, n  j5 z8 X7 e6 f
  19.                         unsigned int nNotThisType = *pSubQueue; " ^6 J4 _( [/ g/ a. ~1 V
  20.                         pSubQueue++;; j: I) \/ d4 O% M1 V: l

  21. 7 E& u5 W6 c; w1 L4 `
  22.                         // pRecordCutted pRecordShort 指向当前的记录
    $ j6 t  y1 [1 d5 `! ?, y8 t) H9 o
  23.                         R_File_Cutted* pRecordCutted=(R_File_Cutted*)(rp0 + (m_SubTypeRangeArray[nSubTypeBitNo].idx - 1));- T8 B/ Q8 U& w
  24.                         R_File_Short* pRecordShort = m_pFileShort + (m_SubTypeRangeArray[nSubTypeBitNo].idx - 1);- i5 \+ w4 ], K& O' b6 t& Z. j
  25. & Y! o+ U/ y$ [& b
  26.                         // 这个循环是由 nThisType 控制的
    & T; h9 ^% f- C3 g2 l, |8 D7 }
  27.                         while (true)          h# T: A: N, \$ I
  28.                         {
    " l" [. Y: n6 ]1 t: L
  29.                                 pRecordCutted++;
    . w+ O7 q- r! z# L7 o
  30.                                 pRecordShort++;0 T0 z% e4 R; k! ]' r2 Z! J

  31. % S& q% o+ ~9 S* ~6 I3 o; v
  32.                                 // 确保 nThisType 不是0$ _$ d9 E) G" T2 e; i
  33.                                 if (!nThisType)7 N5 \) n- W% L9 e1 ?% ~! R' v
  34.                                 {- M, }. q  u1 I/ q6 [
  35.                                         do1 A; e. Y( d1 s- l, I0 R. X
  36.                                         {; h6 h- C+ r1 m+ A7 I, d- G* c
  37.                                                 pRecordCutted += nNotThisType;
    ; X) y) f8 ?2 ~) y% J. _* _
  38.                                                 pRecordShort += nNotThisType;! F( ^. V4 ^( x$ X+ L( c0 k+ d& s

  39. : b8 _) J; M- e
  40.                                                 nThisType = *pSubQueue; pSubQueue++;- |/ {$ a9 R& m) u# A$ b1 t
  41.                                                 nNotThisType = *pSubQueue; pSubQueue++;3 Q3 {* _1 i3 [# m2 V4 G3 k  z
  42. 8 _& a, T$ h: h+ D+ q4 T) Q( @! v- H
  43.                                                 if (!nThisType && !nNotThisType)
    ; J* F8 g, u% c# B
  44.                                                 {
    ; F. N$ ]8 y5 j+ ^: ]% t
  45. #ifdef _DEBUG
    6 E+ p$ @, A3 _- A0 k
  46.                                                         if ((DWORD)(pRecordCutted - rp0) != m_SubTypeRangeArray[nSubTypeBitNo].nash_region_size + m_SubTypeRangeArray[nSubTypeBitNo].idx)
    # q7 q% x2 L( I+ Q9 h7 R; U  G
  47.                                                         {4 O* C$ R; o3 y6 U8 x
  48.                                                                 _asm int 3;# r$ \. Q' D- b& d* {2 l, s/ V
  49.                                                         }- T* J) @" _: Y1 t
  50. #endif
    7 {8 T% H* g% @% ?
  51.                                                         break;
    * Y4 R# H2 i; g) q. y: W
  52.                                                 }8 y( m: H3 d2 T/ k% X

  53. / C* [" k3 r8 F: v" z3 N: E
  54.                                         } while(!nThisType);
    / w) X- A1 o0 T  K  [

  55. ' V, {# e. [. K0 q
  56.                                         if (!nThisType)' ?+ W& i; W9 ~6 u) e/ ^7 _+ s. a
  57.                                                 break;! p2 ]0 `- Q! `& d0 E
  58.                                 }" H3 H: O7 U% E
  59.                                 nThisType--;; U9 t, B  s& d. V" }: N8 t

  60. ) J' [3 s0 J  E- B$ S7 d# u
  61. : Y6 |7 y$ U& R! A
  62.                                 // 长度大于2的记录,则确认ControlWord后CacheSum比较是否一样. w4 d  G# z5 F. R
  63.                                 // 小于2的记录则直接比较 ControlWord
    - x0 c0 |4 a* D# R+ r+ y4 X
  64.                                 if(pRecordShort->Len1>2){                                        5 k& y, g: E# C6 p! M
  65.                                         if ( ReadWordPtr(&pRecordShort->ControlWord) != ReadWordPtr((WORD*)(pWorkArea->m_Header + ReadWordPtr(&pRecordShort->Off1))) ) {
    9 Y0 p" l5 C0 g9 u, {
  66.                                                 continue;
      m% }7 M% F- D4 D" Z
  67.                                         }
    - _+ {" [" J" D- r  U, |5 B! M" M( M
  68.                                         else {
    9 g2 q- u* H! m" d/ o3 y: t
  69.                                                 AVP_word dwBase = ReadWordPtr(&pRecordShort->ControlWord);
    ! X  T% u$ P+ k1 G6 o6 F5 i
  70.                                                 AVP_word dwOff = ReadWordPtr(&pRecordShort->Off1);
    3 D* q, F& ]$ _0 G: i+ H& R
  71.                                                 unsigned char *pOffset = pWorkArea->m_Header + ReadWordPtr(&pRecordShort->Off1);
    6 u  ~- r0 @+ T4 O8 g1 O# W
  72.                                                 AVP_word dwFile = ReadWordPtr((WORD*)(pWorkArea->m_Header + ReadWordPtr(&pRecordShort->Off1)));                                                                                        ( r' _! G) K, K' i. [
  73.                                         }                                                6 `- i' g  S) R
  74.                                 }+ Y: r" Y8 B( b- p
  75.                                 else switch(pRecordShort->Len1){
    8 o% {2 M! v! N3 R# Y" E
  76.                                 case 1:
    % _, x. r9 J, k  x( r
  77.                                         if (((BYTE) ReadWordPtr(&pRecordShort->ControlWord)) != *(BYTE*)(pWorkArea->m_Header + ReadWordPtr(&pRecordShort->Off1)) ) continue;  U) Y" U3 N) |9 y
  78.                                         goto cklnk;2 E: J$ `6 W* ~* @4 C3 y5 l1 i, D/ j1 t
  79. : ]( R3 h0 g& W1 f" V# q
  80.                                 case 2:
      f, ~7 m) b& [  l# j8 ~: _
  81.                                         if (ReadWordPtr(&pRecordShort->ControlWord) != ReadWordPtr((WORD*)(pWorkArea->m_Header + ReadWordPtr(&pRecordShort->Off1))) ) continue;
    7 k7 @& X* p. p/ [1 ~
  82.                                         goto cklnk;9 ?2 a: d7 O- C* s( N9 E, C

  83. # X! X' Q. D. o: P( T) C$ A& [
  84.                                 case 0:2 Q0 B" k; g" ]
  85.                                         if ( ReadWordPtr(&pRecordCutted->LinkIdx) == (WORD)(-1)) continue;
    7 k6 i; R, v7 F( E0 ?
  86.                                         goto lnk;
    ( d- W7 M! S: {# P+ F
  87.                                 }
    ; R1 C' o: Y1 g* y. K3 c+ ?6 ?! n
  88. ! d7 ^: ^0 q" V5 u2 W& B& X( w4 E& j
  89.                                 if ( ReadDWordPtr(&pRecordCutted->Sum1) != CacheSum(pWorkArea->m_Header, ReadWordPtr(&pRecordShort->Off1), pRecordShort->Len1)) continue;7 W6 x. _! v% M7 o* t
  90. cklnk:
    8 t" t# z4 P( Z
  91.                                 // 确认 Sum1 或者 ControlWord 相等后查看是否有 Link,有的话就执行之/ b4 T+ B- }' D2 P, h  O. \1 M$ Q! g* S  b
  92.                                 if ( ReadWordPtr(&pRecordCutted->LinkIdx) != (WORD)(-1)) {
    9 M) R6 ?) w, Q9 d/ n/ u* ^' p
  93.                                         WORD ret;
    ( ]' }' S1 T! R: s7 [' ]
  94. lnk:& \; C) [% v  Z
  95.                                         if(pWorkArea->m_pScanObject->SType == OT_MEMORY_FILE) continue;
    6 p- y# |* {% E, G8 L4 I

  96. 8 I4 [+ E0 r$ d9 p7 J$ U
  97.                                         ret = m_LinkTable[type][ReadWordPtr(&pRecordCutted->LinkIdx)].ExecuteEntry(pWorkArea, 0);7 y. S" D% D  r$ L
  98.                                         if(ret==0) continue;  e% ]' C& G' ]/ k
  99.                                         if(ret==R_DETECT) {
    & f: x$ ?" G  g$ w/ z- z5 v' O9 L
  100.                                                 goto on;
    . O. z. C6 C7 S( f% G: }/ x& J
  101.                                         }  ^6 Y# `% b0 v% Y4 V: |3 [
  102.                                         if(ret!=R_PREDETECT) continue;9 g) S& V$ v! a6 d; e
  103.                                 }
    / Y: {+ D  i" V* v% g
  104. * n$ G/ _! R8 ]& y4 S
  105.                                 if ( !pRecordCutted->Len2 )' _1 k5 A& v' l) N8 {8 K0 J* X- b2 t
  106.                                         continue;
    4 k, @( P* C- M3 Q1 H
  107. " i- a8 y' H& p, X. O
  108.                                 // 比较 Sum2 是否一样
    # w( W. g0 i6 Y8 X3 T  J& R
  109.                                 if ( ReadDWordPtr(&pRecordCutted->Sum2) != CalcSum(pWorkArea->m_Header + ReadWordPtr(&pRecordCutted->Off2), pRecordCutted->Len2) )
    . \) g1 i) {. c' m
  110.                                 {
    : O* ?4 {+ U. J2 V9 r, {
  111.                                         if ( pRecordShort->Len1 < 8 )& C: b' G3 F, c$ b6 _2 j
  112.                                                 continue;
    ( [) n3 \* ]( {! Z2 @& y6 E) x; i

  113. ( l8 M: s& C9 Y+ {! D* T7 s8 K; [. v
  114.                                         if ( SubType == ST_OLE2 )" |& Z, W5 D( w# d: F8 f9 m4 Y. ~$ L# Z
  115.                                                 continue;; t0 c* U5 S. F" V, l6 p! q

  116. ' _) j' c! D0 |, L
  117.                                         if ( (ReadWordPtr(&pRecordCutted->Off2) == (PAGE_C_BEGIN+0x4000) )+ _" Y8 C; ?+ Q# \0 N$ A
  118.                                                 && (0x00E8 == ReadWordPtr((WORD*)(pWorkArea->m_Header + ReadWordPtr(&pRecordCutted->Off2))) )! ?8 R) y# J2 C; I  }: J
  119. ) X; \, T5 I' h
  120.                                                 && !(((WORD (*)(void*, void*))m_pBaseWork->_IsProgram) (pWorkArea->m_Header, pWorkArea->m_lpExt))& _3 {% M: G2 e1 B
  121.                                                 )continue;
    1 Q/ ?: c& M# Q6 J" V
  122. 8 o/ C+ ^. z) b% ~5 E( _
  123.                                         pWorkArea->m_dwRFlags|=RF_WARNING;6 Y% z! J  s& W3 D* t$ ]
  124.                                         if ( pWorkArea->m_pScanObject->MFlags & MF_ALLWARNINGS)
    ) p% D* [9 m0 z5 f3 {% F1 r7 [
  125.                                         {
    ) p; m* x* i% j: u: f4 K
  126.                                                 char* wn = pWorkArea->m_pScanObject->pWarningName;& t3 g1 y$ ]: h: Y! {+ q
  127.                                                 pWorkArea->m_pScanObject->pWarningName = (char*)ReadDWordPtr(&pRecordCutted->NameIdx);
    5 i5 g  [/ ?& |
  128.                                                 AvpCallback(AVP_CALLBACK_OBJECT_WARNING,(DWORD)pWorkArea->m_pScanObject);
    " J/ ]' F4 t" J7 q2 q( V! b
  129.                                                 pWorkArea->m_pScanObject->pWarningName=wn;
    9 y8 ?: `8 o# d( T- ]
  130.                                         }
    . _) m( `; o( P+ Z4 B) E
  131.                                         if(pRecordShort->Len1>_bdata->WarLen){
    + ^/ s4 q8 J8 s1 W; G
  132.                                                 _bdata->WarLen=pRecordShort->Len1;+ Q$ b) E" n$ z* n, L- }
  133.                                                 pWorkArea->m_pScanObject->pWarningName=(char*) ReadDWordPtr(&pRecordCutted->NameIdx);
    4 d2 y# P) D; [- R2 _" Y
  134.                                         }5 ]0 X  r8 q7 J0 `# p! J
  135.                                         continue;& b1 n" j1 y, K! w$ [1 p% A
  136.                                 }
    * q) k3 w5 s3 O$ V6 G" f
  137.                                 else{2 j; E% B) {  A6 s
  138.                                         pWorkArea->m_pScanObject->pVirusName = (char*) ReadDWordPtr(&pRecordCutted->NameIdx);" P. s& a0 T: G8 g$ `
  139.                                 }! ]5 I% p- Y( C6 k. y0 q6 M

  140. 0 d# q3 n3 Y8 P. w8 x
  141. on:
    " j9 O0 m- w+ h6 a( y* @  ~
  142.                                 // 此处是已经检测到病毒了,获取病毒名的序号
      \* D& E2 i+ v  P$ M, ?
  143.                                 pWorkArea->m_pScanObject->pVirusName = (char*) ReadDWordPtr(&pRecordCutted->NameIdx);
    2 L! s5 C6 \+ {+ m
  144. 1 D0 `0 v' j$ b# r- }9 S
  145.                                 if(callbackRecords&2){$ i2 {6 J- Q* P( F- i+ L! F' Q
  146.                                         pWorkArea->m_pCurRecord=pRecordCutted;
    9 s8 G' U% K' K  y1 M$ ^
  147.                                         pWorkArea->m_dwCurRecordType=type;
    $ ]$ n0 y7 i( `- A& b. o% k9 v' ~, ?
  148.                                         pWorkArea->m_dwCurRecordStatus=2;
    % E  Z( D7 ]8 d9 ]" J
  149. . Y, a0 Z0 j; r0 o( v  k) A
  150.                                         AvpCallback(AVP_CALLBACK_WA_RECORD,(DWORD)(pWorkArea));+ {) n, _  f& \% X0 S, d& w3 ]
  151.                                 }. n4 G' x/ o1 t- C
  152. 3 q! E% W  A9 L! Z$ K
  153.                                 if (pRecordCutted && curedata)
    # E, H6 T! z& A  [) t
  154.                                         *curedata = GetCureData(pRecordCutted - rp0);
    / x! Q* y+ n" D' L1 @( p
  155.                                 return pRecordCutted;
    $ |9 W1 ^1 ?2 `
  156.                         }( y) G" G0 o+ b& s" {3 {
  157.                 }) T* }, \/ x& `
  158.                 break;  T: v0 Y7 c% ]. ~% W! t
  159.         case RT_SECTOR:
复制代码
已有 1 人评分金钱 收起 理由
FlowerCode + 200 路过

总评分: 金钱 + 200   查看全部评分

回复

使用道具 举报

4

主题

1

好友

11

积分

微牛

Rank: 1

贡献
0 点
威望
1 点
金钱
1038 元
经验
0 点
精华
0
发表于 2011-11-24 13:20:09 |显示全部楼层
,忘记分类了。
; C  F# x8 Q+ k9 F# }
- {+ b7 y- K: S6 O& V/ C' {  f呃,我表示忏悔,从第一篇到现在,几近一个月的时间了,每天下班后磨磨唧唧看一点。
6 D. n! R# z. R  R5 f* M# _
$ y+ j) E0 K7 ]  E, ~/ D不过卡巴查毒的代码,似乎我感兴趣的都看完了_GetFirstEntry这种代码源码里也没有,我想逆一下的,似乎功力又不足。+ K# e2 R: H5 V' F2 m( A9 ?! I

8 l% |, {; W9 D  p' A1 Q有大牛的话,给指点下错误呗。
回复

使用道具 举报

13

主题

0

好友

111

积分

小牛

Rank: 2Rank: 2

贡献
0 点
威望
11 点
金钱
264 元
经验
186 点
精华
0
发表于 2011-12-14 23:36:20 |显示全部楼层
楼主很有毅力啊,病毒库源码是没有的,貌似早就被老外破解了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 申请加入

手机版|0GiNr技术社区   

GMT+8, 2012-5-20 03:48

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部