![]() |
打造不被杀的Topo工具程序 |
-------------定位结果------------ 序号 起始偏移 大小 结束偏移 0001 00000400 00000001 00000401 0002 00000402 00000003 00000405 只有第1,3,4,5四个字节是特征码,(特征码可真短啊,难怪那么快)。所以,只要改掉前5个字节就行了。 topo12.exe的入口代码如下 00401000 >/$Content$nbsp;6A 00 push 0 ; /pModule = NULL 00401002 │. E8 690E0000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA 00401007 │. A3 A0384000 mov dword ptr ds:[4038A0],eax 0040100C │. 6A 00 push 0 ; /lParam = NULL 0040100E │. 68 2C104000 push topo12.0040102C ; │DlgProc = topo12.0040102C 00401013 │. 6A 00 push 0 ; │hOwner = NULL 00401015 │. 68 E8030000 push 3E8 ; │pTemplate = 3E8 0040101A │. FF35 A0384000 push dword ptr ds:[4038A0] ; │hInst = NULL 00401020 │. E8 D90D0000 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA 00401025 │. 6A 00 push 0 ; /ExitCode = 0 00401027 \. E8 380E0000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess 前五个字节是6A00E8690E然后我把它改成 00401000 >/$Content$nbsp;6A 00 push 0 ; /lParam = NULL 00401002 │. 6A 00 push 0 ; │/pModule = NULL 00401004 │. E8 670E0000 call <jmp.&KERNEL32.GetModuleHandleA> ; │\GetModuleHandleA 00401009 │. A3 A0384000 mov dword ptr ds:[4038A0],eax ; │ 0040100E │. 68 2C104000 push _topo12.0040102C ; │DlgProc = topo12.0040102C 00401013 │. 6A 00 push 0 ; │hOwner = NULL 00401015 │. 68 E8030000 push 3E8 ; │pTemplate = 3E8 0040101A │. FF35 A0384000 push dword ptr ds:[4038A0] ; │hInst = NULL 00401020 │. E8 D90D0000 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA 00401025 │. 6A 00 push 0 ; /ExitCode = 0 00401027 \. E8 380E0000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess 一查,还是杀了。。。特征码定位一下 -------------定位结果------------ 序号 起始偏移 大小 结束偏移 0001 00000400 00000001 00000401 0002 00000402 00000001 00000403 0003 00000404 00000003 00000407 第1,3,5,6,7五个字节是特征码,是6A006A00E8670E,猜测毒霸是搜索入口点是否有push 0/call GetModuleHandleA代码,但是这个不太容易改,呵呵,这两个代码是紧紧在一起的,不太可能分开。但看看结果定位中有输入表段,可能毒霸计算了GetModuleHandleA的偏移,所以当E8690E改成E8670E时也能查出来。用OllyDBG打开topo12.exe,在call <jmp.&KERNEL32.GetModuleHandleA>这行上按回车,来到 00401E70 .- FF25 2C204000 jmp dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA 在输入表最后添一行 00401E70 $- FF25 2C204000 jmp dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA★原来的 00401E76 $- FF25 20204000 jmp dword ptr ds:[<&KERNEL32.GlobalAlloc>] ; kernel32.GlobalAlloc 00401E7C $- FF25 1C204000 jmp dword ptr ds:[<&KERNEL32.GlobalFree>] ; kernel32.GlobalFree 00401E82 $- FF25 24204000 jmp dword ptr ds:[<&KERNEL32.ReadFile>] ; kernel32.ReadFile 00401E88 $- FF25 14204000 jmp dword ptr ds:[<&KERNEL32.SetFilePointer>] ; kernel32.SetFilePointer 00401E8E $- FF25 10204000 jmp dword ptr ds:[<&KERNEL32.WriteFile>] ; kernel32.WriteFile 00401E94 $- FF25 18204000 jmp dword ptr ds:[<&KERNEL32.lstrcatA>] ; kernel32.lstrcatA 00401E9A $- FF25 0C204000 jmp dword ptr ds:[<&KERNEL32.lstrcpynA>] ; kernel32.lstrcpynA 00401EA0 $- FF25 08204000 jmp dword ptr ds:[<&KERNEL32.lstrlenA>] ; kernel32.lstrlenA 00401EA6 $- FF25 7C204000 jmp dword ptr ds:[<&comdlg32.GetOpenFileNameA>] ; comdlg32.GetOpenFileNameA 00401EAC $- FF25 2C204000 jmp dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA★添加这行 然后再把call 401E70改成call 401EAC 00401002 │. E8 690E0000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA 改成 00401002 │. E8 A50E0000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA 69改成了A5,保存,查毒,已经查不到了^_^。这时就可以确定毒霸是查找push 0/call 401E70代码和其它特征码来确定的,所以我们改成push 0/call 401EAC就能躲过查杀了。 有兴趣的可以再用其它杀毒软件查一下,打造真正不被杀的topo。 后记: 第一次用病毒特征码定位器,用的不好,只是用了手动操作,自动操作还不会。确定病毒特征码是比较辛苦的,这个是比较简单的,还有复杂的就要经过很多次的判断才能确定位置,例如DNS那个屏幕抖动的恶作剧程序,要先脱壳,再确定,确定了一次特征码后修改还会出现第二次特征码(猜测可能是杀毒软件为了提高效率有个优先特征码,然后再搜其他特征码)。具体的情况大家多多摸索。 ^_^ Have fun and enjoy it, Greetz to you all! |