我爱电脑技术论坛's Archiver

LOK 发表于 2008-6-7 22:49

打造不被杀的Topo工具程序

首先,关闭文件实时防毒,这点很关键,如果打开了,你用病毒特征码定位器是无法打开topo12.exe的,建一个临时文件夹作为存放生成临时文件用的目录,然后打开病毒特征码定位器,整体参数设置,手动操作,使用自定义路径,输入刚才你建的目录,确定。再设置手动操作,选“每次替换规定字节大小”,替换大小改为32(这里可以先改大点,然后再改小,下面会说到)。好了,可以开始生成了。可能有人会问,为什么不用自动操作呢?这是因为我觉得手动的方便,自动的操作太慢了,而且我的毒霸文件实时防毒有时还不能杀掉,不方便,所以用手动。可能我用的软件版本太低了,最新版应该有所改变。但手动需要了解这个特征码定位器的工作原理。 SZ4|-RQ]x
     q*S4E2w%De&y
下面我就根据自己的理解来说一下原理。杀毒软件是用特征码来判断是否是病毒的,特征码不会太多,也不会太长,因为太多太长会影响杀毒速度。而特征码定位器的工作原理就是把待分析的文件一段一段的字节替换为0(我们这里是32个为一段),其它代码保留,然后让杀毒软件去查毒,如果被杀掉了,就说明没替换的部分有特征码,如果没杀掉,就说明没有替换的部分已经没有特征码了,那么特征码一定在被替换的部分,这时就可以知道应该修改哪一段的代码了。用特征码来判断是否是病毒有个缺点,就是特征码是静态的,只要改一下代码实现相同的功能,特征码搜索就会失败,这样就不会报有毒了。原理看不懂不要紧,下面再详细操作一下就能理解了。 &KDT(ZQE0ARU
   u#JMAK/On ]
用病毒特征码定位器打开topo12.exe,出现pe文件段选择,然后添加所有的区段,确定,然后会告诉你硬盘空间是否够,如果不够就换一个大点的盘,在根目录下建一个目录,实在不行就去作者论坛[url]http://www.vxer.net/bbs[/url] 去问一下作者吧。(这里关于空间大小的问题我也不太懂,我用默认的路径它说我空间不够,我空间明明够的。。。知道的人请指点一下)然后go,完成后就最小化吧,等会再用。打开杀毒软件,杀毒选项是查所有软件,查到后删除,然后查一下生成文件的目录,查完后看看剩下哪几个文件,选结果定位,选刚才那个目录,然后会出现特征码的位置和大小,我这里是三个
c c*n/]&y#C    
x0Gn:P8J6_ n"?i     -------------定位结果------------ -we wc?#XfH
   
{5a ^q"S;d!t0a     序号   起始偏移   大小   结束偏移
Wx:l"a8v-s!~k    
DGg2?5Xz"U V:{   0001   00000400   00000020   00000420     b ] L-EAz k
    wj9lXXf#a!u
  0002   00001260   00000040   000012A0     %_-XH:a(k n
   `dn7m^(U)h&oy
  0003   000014C0   00000060   00001520     &Y4N6x1?i4x\
   
3D `!}g6bVu 看看目录里的文件,剩下了6个,这是什么意思呢?就是这6个文件里不含有特征码,由此可以说明,topo的特征码不止一处,有三处,而三处都相同才证明这是病毒,有一个不同都不算病毒,那么我们只要改一个地方就可以了。注意,这里是文件偏移,不是内存里的偏移,要转换,400相当于00401000,看一下特征码的位置,第一个和第二个在代码区,第三个在数据区,一般来说改代码区的容易些,因为数据区数据一改可能就会用不了,只要代码功能相同没有校验,代码改掉是没关系的。但是一看第二个位置,在文件的输入表上,这样就不好改了,输入表是不能随便改的,加上这段特征码可能是为了区分其它病毒用的,所以我们改第一个位置。
_!D5pw8{ MB q%O    
(NE3vH#`"K 而第一个位置大小有20h(32字节)太大了,32字节有很多命令的,代码不好改,所以我们这次改成1,把大小缩成最小,再生成一次,。有人会问,为什么第一遍就改小点呢?因为第一遍是不知道位置在哪,是确定位置的,文件会生成很多的,效率不高,确定了位置后可以不全部覆盖所有文件,只覆盖你需要的区域,这样第二遍生成的文件可以少很多。同样,添加区段,这时只要添加第一区段,起始位置00000400,检测大小00000020,(只要这么小就够了,因为我们知道其它的地方是没有用的,不需要浪费时间),添加,确定,然后go,查毒,结果定位,呵呵,看到结果了吗? 'pe!}'y7xG'wuow
-------------定位结果------------

LOK 发表于 2008-6-7 22:50

序号   起始偏移   大小   结束偏移
8W(N)fS;c8K    a/`/AOh&NJ
  0001   00000400   00000001   00000401     Iz a^u&M7q}
   
'B-T"~2aI8DN   0002   00000402   00000003   00000405     \Y"U Up4H
3F[i[`)m Z
   
%i6q!Y#is1[Z%?0{Z u 只有第1,3,4,5四个字节是特征码,(特征码可真短啊,难怪那么快)。所以,只要改掉前5个字节就行了。 V:DG.nh
   
a(\Un0@k topo12.exe的入口代码如下 *Q2sj{ xoc0?
     
5H&LG3B-gj.v 00401000 >/$Content$nbsp;6A 00           push 0                     ; /pModule = NULL
F4I$S2H:V    tYVfy?
00401002 │. E8 690E0000       call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
*n^ Z Eq-Er'g7Ca:?     v3?'D0u!{;^ [
00401007 │. A3 A0384000       mov dword ptr ds:[4038A0],eax ]7P[~)K n2p1J
   lNd e%U+p
0040100C │. 6A 00           push 0                     ; /lParam = NULL ,jiULwL$w
   
y(_Yd4j 0040100E │. 68 2C104000       push topo12.0040102C             ; │DlgProc = topo12.0040102C 'p ?N.G _ _]~(`
   KQM8Na
00401013 │. 6A 00           push 0                     ; │hOwner = NULL "`MtW i J4e
   
)Ss(v ^5gjIQ*wk\2s 00401015 │. 68 E8030000       push 3E8                     ; │pTemplate = 3E8
l^!r'A0{"|9kJ    7JzRDI?g
0040101A │. FF35 A0384000     push dword ptr ds:[4038A0]         ; │hInst = NULL
-m/sb(k*BW"mAS,~    t;K-Mo:QQ a \%j^
00401020 │. E8 D90D0000       call <jmp.&USER32.DialogBoxParamA>   ; \DialogBoxParamA
}/S'Dp \kgF    
f Ou p+N]7GG2H 00401025 │. 6A 00           push 0                     ; /ExitCode = 0 .U)QxZ'{IN~
   
D:Ba O L+v6_N9e,@*u7i 00401027 \. E8 380E0000       call <jmp.&KERNEL32.ExitProcess>     ; \ExitProcess @rna4^.kW'y
   
NYX G|%^2g&|7gL 前五个字节是6A00E8690E然后我把它改成
U#f6vbh8X      :FUi|9xbY/q3Czl
00401000 >/$Content$nbsp;6A 00         push 0                     ; /lParam = NULL
YSW ~|:o7E    S7~%k9T To2Q6F
00401002 │. 6A 00         push 0                     ; │/pModule = NULL
x,j@6N+F!m"N     M{9V)n/H |
00401004 │. E8 670E0000     call <jmp.&KERNEL32.GetModuleHandleA> ; │\GetModuleHandleA
^ tchZ)^`G    ro{6?;\#A3O;Ip
00401009 │. A3 A0384000     mov dword ptr ds:[4038A0],eax       ; │ ^,R @8oo3Z]-Ka
   :q&N@F@!M|
0040100E │. 68 2C104000     push _topo12.0040102C           ; │DlgProc = topo12.0040102C
Li ?4|;fjk R:zs    
zqt$?*l*bZ!T 00401013 │. 6A 00         push 0                     ; │hOwner = NULL s#T:|'u8S3Rf
   #l E~qEUI0o^HA|
00401015 │. 68 E8030000     push 3E8                     ; │pTemplate = 3E8
jn&tU}f R0D    
3COr"TvK 0040101A │. FF35 A0384000     push dword ptr ds:[4038A0]         ; │hInst = NULL
B k3K9q(W    | aJ;I+c
00401020 │. E8 D90D0000     call <jmp.&USER32.DialogBoxParamA>   ; \DialogBoxParamA
;rUJ2G.I8G bZ    
n0T|4j kxF 00401025 │. 6A 00         push 0                     ; /ExitCode = 0 ;mcp a^vy3f
   
k9~"n^4iG1q] c?P+r 00401027 \. E8 380E0000     call <jmp.&KERNEL32.ExitProcess>     ; \ExitProcess 7h _&KmL0h

t!nP4^(K:PL R    ~)l _;x U`LA,l m
一查,还是杀了。。。特征码定位一下
m'` xvD(Pv      H[2Hn?Va ]
    -------------定位结果------------
)Ng*?dY R}    0l0aQ-fS/Q
    序号   起始偏移   大小   结束偏移 )e1Wf T^Ls
   4glAV!z
  0001   00000400   00000001   00000401      c,S\*mY
   9@$_ ehrr
  0002   00000402   00000001   00000403     
[-H7G/E&k;T!XCCF    
*X6hLs'F9y5u b$k   0003   00000404   00000003   00000407

LOK 发表于 2008-6-7 22:50

第1,3,5,6,7五个字节是特征码,是6A006A00E8670E,猜测毒霸是搜索入口点是否有push 0/call GetModuleHandleA代码,但是这个不太容易改,呵呵,这两个代码是紧紧在一起的,不太可能分开。但看看结果定位中有输入表段,可能毒霸计算了GetModuleHandleA的偏移,所以当E8690E改成E8670E时也能查出来。用OllyDBG打开topo12.exe,在call <jmp.&KERNEL32.GetModuleHandleA>这行上按回车,来到
;P ] S5@n,w g    
$sQ U}-p3S 00401E70   .- FF25 2C204000   jmp dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA ;]!P S I6um(Q9Q'f
   !d/J4P0?Y3f F
在输入表最后添一行 nm:`]?(l#@A
   {P `8pJ{-z6n
00401E70   $- FF25 2C204000   jmp dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA★原来的
-Ie.kBIG?    
lY&Z1c!m2~6M 00401E76   $- FF25 20204000   jmp dword ptr ds:[<&KERNEL32.GlobalAlloc>]     ; kernel32.GlobalAlloc &ni/O)O,zLrZ
   
bO.l-n ?"d u 00401E7C   $- FF25 1C204000   jmp dword ptr ds:[<&KERNEL32.GlobalFree>]     ; kernel32.GlobalFree ,U:Pr,d~!Y R:@(Ef
   'pmAe7wvW3? \8d
00401E82   $- FF25 24204000   jmp dword ptr ds:[<&KERNEL32.ReadFile>]       ; kernel32.ReadFile xg'qM aQ+{ h&QI
   
Jh^&s;D Z8_ 00401E88   $- FF25 14204000   jmp dword ptr ds:[<&KERNEL32.SetFilePointer>]   ; kernel32.SetFilePointer
8_h jeJM    y-^Z!g)A;V3eA
00401E8E   $- FF25 10204000   jmp dword ptr ds:[<&KERNEL32.WriteFile>]       ; kernel32.WriteFile
V6jq)\ |y\B    
HG7V%`/[!] 00401E94   $- FF25 18204000   jmp dword ptr ds:[<&KERNEL32.lstrcatA>]       ; kernel32.lstrcatA
[ EE t j Sq-l    $j6PKT@$Z t o
00401E9A   $- FF25 0C204000   jmp dword ptr ds:[<&KERNEL32.lstrcpynA>]       ; kernel32.lstrcpynA
:h2RP;Nk    
B%kAg(P4Z!n 00401EA0   $- FF25 08204000   jmp dword ptr ds:[<&KERNEL32.lstrlenA>]       ; kernel32.lstrlenA
"B3^|"L3eM6Q    
"k OxqAj b 00401EA6   $- FF25 7C204000   jmp dword ptr ds:[<&comdlg32.GetOpenFileNameA>] ; comdlg32.GetOpenFileNameA _ @ \.W&B EY
   
-~qr)Mj[+J$l 00401EAC   $- FF25 2C204000   jmp dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA★添加这行
7u IF0h;X4s3h:ag.e    UGN7}1K]k
然后再把call 401E70改成call 401EAC
1`#Ctj:Z^;[    +_Z#}mIZH/m'SZLu
00401002 │. E8 690E0000   call <jmp.&KERNEL32.GetModuleHandleA>   ; \GetModuleHandleA -Xk N_A1Y[ oY
? O:J@#Z` @.d.G
   /h L2m&eLG1w
改成
2] hi&h ?8r4Y    w"k!|KuH
00401002 │. E8 A50E0000   call <jmp.&KERNEL32.GetModuleHandleA>   ; \GetModuleHandleA 't|c y6tl({Je&Z0x
8[r.o-o T(E W
   %eg([^!a%PK
69改成了A5,保存,查毒,已经查不到了^_^。这时就可以确定毒霸是查找push 0/call 401E70代码和其它特征码来确定的,所以我们改成push 0/call 401EAC就能躲过查杀了。
m!L)wT+|}Th    RA!T+ZAS v(\-F},re
有兴趣的可以再用其它杀毒软件查一下,打造真正不被杀的topo。 7N%h4@8E`

h:R/d km6v nD_    
LHKY9JV*{dQ 后记:
J\ BoR    )k%lB|K,^Ei
第一次用病毒特征码定位器,用的不好,只是用了手动操作,自动操作还不会。确定病毒特征码是比较辛苦的,这个是比较简单的,还有复杂的就要经过很多次的判断才能确定位置,例如DNS那个屏幕抖动的恶作剧程序,要先脱壳,再确定,确定了一次特征码后修改还会出现第二次特征码(猜测可能是杀毒软件为了提高效率有个优先特征码,然后再搜其他特征码)。具体的情况大家多多摸索。
&X U,`5^(r    
W+s Jb \-H3x ^_^

页: [1]
   

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.