源码免杀笔记
最近沒什么心情寫博客,似乎停止不前了,唉,越來越懶了,不知道怎么回事,整理以前的筆記,這個免殺的,不知道內容過時了沒。
各個殺毒軟件查殺特點不一樣,大致總結以下,API函數,字符串,代碼段,資源段。免殺方法大致有如下幾種手段,動態函數調用,延遲加載DLL,合并區段,字符串隱藏,刪版權換版權,花指令,反調試等等細節,以上幾種方法基本上過掉大部分殺軟,當然有能力也可以自己改變程序的代碼實現原來的功能。
1.動態函數調用
有兩個函數是不能調用的,GetProcAddress,LoadLibrary。
殺毒軟件如果查殺到API函數上,可以用動態函數調用解決。
typedef int (WINAPI *MessageBoxAT)
(
HWND hWnd,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType
);
MessageBoxAT pMessageBoxA= (MessageBoxAT)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");
2.字符串隱藏
利用數組來隱藏,字符串處理相對比較簡單,隱藏的辦法有很多,舉出一種吧。
char name[]={'a','b','c','\0'};
name替換掉原來的字符串.
3.延遲加載DLL
源代碼上加上,或者寫成頭文件加上也可以.
#pragma comment(linker, "/OPT:NOWIN98")
#pragma comment(lib, "DELAYIMP.LIB")
#pragma comment(linker, "/DELAYLOAD:WININET.dll")
#pragma comment(linker, "/DELAYLOAD:WS2_32.dll")
#pragma comment(linker, "/DELAYLOAD:PSAPI.DLL")
#pragma comment(linker, "/DELAYLOAD:GDI32.dll")
#pragma comment(linker, "/DELAYLOAD:ADVAPI32.dll")
#pragma comment(linker, "/DELAYLOAD:SHELL32.dll")
#pragma comment(linker, "/DELAYLOAD:WINMM.dll")
#pragma comment(linker, "/DELAYLOAD:USER32.dll")
#pragma comment(linker, "/DELAYLOAD:WTSAPI32.dll")
#pragma comment(linker, "/DELAYLOAD:AVICAP32.dll")
#pragma comment(linker, "/DELAYLOAD:SHLWAPI.dll")
#pragma comment(linker, "/DELAYLOAD:MSVFW32.dll")
#pragma comment(linker, "/DELAY:nobind")
#pragma comment(linker, "/DELAY:unload")
4.合并區段
把其他區段合并到一個區段里,以前這個方法還管用,可以試試,但最好不要加。
#pragma comment(linker, "/MERGE:.rdata=.data")//把rdata區段合并到data區段里
#pragma comment(linker, "/MERGE:.text=.data")//把text區段合并到data區段里
#pragma comment(linker, "/MERGE:.reloc=.data")//把reloc區段合并到data區段里
4 .刪版權資源
有時對版權也查殺,可以換版權或者刪除。
5.花指令
如果殺在代碼段上可以加NOP來打亂程序的位置,一般不要加太多,有時也會查殺NOP。
__asm nop;
__asm nop;
__asm nop;
5.反調試
HKEY ck;
char strreg[] = {'S','O','F','T','W','A','R','E','\\','O','D','B','C','\0'};
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strreg,0,KEY_ALL_ACCESS,&ck))
{
return 0;
}
6.代碼換位
定位到特征碼后,看代碼中的程序是否可以代碼換位。
注意的細節:
定位360BD引擎的時候,找到入口點,填充入口點以上的代碼,查殺,如果免殺,就說明在這一區段.
map文件定位:
用OD找代碼的時候,有時上下沒有參考,可以用map文件來幫助,在VC6.0中設置map文件,然后拿出來,用OD里面的一個插件loadmap,載入map,重新運行,就可以了.
?
二進制文件與源碼定位之map文件利用
??? map文件是二進制和源碼之間對應的一個映射文件。
??? 我們假設根據第三步我們定位出了病毒的特征碼:
????????? 病毒名稱?????? 特征碼位置????? 內存地址
??????? svchost.dll 000038AA_00000002?? 100044AA
??????? svchost.dll 00005F98_00000002
??? 第一步設置VC編譯環境生成Map文件。
??? 在 VC 中,點擊菜單“Project -> Settings”選項頁(或按下 Alt+F7),選擇 C/C++ 選項卡,并在最下面的 Project Options 里面輸入:/Zd ,然后要點擊 Link 選項卡,選中“Generate mapfile”復選框,并在最下面的 Project Options 里面輸入:/mapinfo:lines,表示生成 MAP 文件時,加入行信息。設置完成。
??? 第二步編譯VC工程,設置活動工程編譯即可,這個不用說明。這個步驟完成后,在release(或debug)目錄,多了一個.map文件(比如svchost.map)。
??? 第三步打開map文件(用UE或文本編輯器打開都行),形式如下:
(begin)
Timestamp is 488fcef2 (Wed Jul 30 10:16:18 2008)
Preferred load address is 10000000
---------------------------------------------------------------------------1----(為方便說明,wrw添加)
Start???????? Length???? Name?????????????????? Class
0001:00000000 00010a50H .text?????????????????? CODE
0001:00010a50 00000485H .text$x???????????????? CODE
0002:00000000 000004c8H .idata$5??????????????? DATA
......
0003:00000010 00000004H .CRT$XIZ??????????????? DATA
0003:00000020 00001a50H .data?????????????????? DATA
0003:00001a70 00000688H .bss??????????????????? DATA
0004:00000000 000000a8H .rsrc$01??????????????? DATA
0004:000000b0 00000cf0H .rsrc$02??????????????? DATA
----------------------------------------------------------------------------2---(為方便說明,wrw添加)
? Address???????? Publics by Value????????????? Rva+Base???? Lib:Object
0001:00000000?????? ??0CAudio@@QAE@XZ????????? 10001000 f?? Audio.obj
0001:000000d0?????? ??_GCAudio@@UAEPAXI@Z????? 100010d0 f i Audio.obj
0001:000000d0?????? ??_ECAudio@@UAEPAXI@Z????? 100010d0 f i Audio.obj
0001:000000f0?????? ??1CAudio@@UAE@XZ????????? 100010f0 f?? Audio.obj
0001:000001e0?????? ?getRecordBuffer@CAudio@@QAEPAEPAK@Z 100011e0 f?? Audio.obj
0001:00000240?????? ?playBuffer@CAudio@@QAE_NPAEK@Z 10001240 f?? Audio.obj
0001:000002c0?????? ?InitializeWaveIn@CAudio@@AAE_NXZ 100012c0 f?? Audio.obj
? ......
0001:00003310?????? ?SendToken@CFileManager@@AAEHE@Z 10004310 f?? FileManager.obj
0001:00003320?????? ?UploadToRemote@CFileManager@@AAE_NPAE@Z 10004320 f?? FileManager.obj
0001:00003440?????? ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f?? FileManager.obj
0001:00003670?????? ?StopTransfer@CFileManager@@AAEXXZ 10004670 f?? FileManager.obj
0001:00003730?????? ?CreateLocalRecvFile@CFileManager@@AAEXPAE@Z 10004730 f?? FileManager.obj
? ......
----------------------------------------------------------------------------3---(為方便說明,wrw添加)
Line numbers for .\Release\FileManager.obj(E:\vtmp\gh0st3src\Server\svchost\common\FileManager.cpp) segment .text
??? 17 0001:00002630??? 20 0001:0000267f??? 21 0001:00002698??? 24 0001:000026d0
??? 25 0001:000026f8??? 26 0001:0000273c??? 29 0001:000027d0??? 33 0001:000027ee
??? 77 0001:000027f8??? 36 0001:000027fb??? 37 0001:00002803??? 77 0001:0000280d
? ......
?? 532 0001:0000340f?? 534 0001:00003414?? 537 0001:00003428?? 540 0001:00003440
?? 546 0001:0000345d?? 547 0001:00003487?? 548 0001:00003490?? 549 0001:00003492
?? 551 0001:0000349e?? 552 0001:000034b8?? 553 0001:000034cb?? 554 0001:000034d4
?? 558 0001:000034de?? 560 0001:000034e9?? 563 0001:000034ee?? 564 0001:00003506
? ......
(end)
我們看下,定位svchost.dll 的第一個特征碼內存地址為:100044AA,在第2塊中,我們可以找到RVA+BASE與之很接近的是
0001:00003440?????? ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f?? FileManager.obj
這樣我們可以定位到FileManager.cpp中的FixedUploadList函數,是不是范圍縮小了?
下面我們再縮小代碼行
利用這個公式:特征碼行偏移 = 特征碼地址(Crash Address)- 基地址(ImageBase Address)- 0x1000
看起來好像很難,其實很簡單,我們將100044AA去掉內存基址10000000,再減1000,因為PE很多從1000開始,可以得到代碼偏移地址為34AA。到第3塊中找對應的代碼行。
偏移地址34AA在(551 0001:0000349e?? 552 0001:000034b8 )中間,也就是551行和552行中間,我們到源程序中查找第551行:
??????? wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
這樣就定位出源代碼了,要怎么修改就怎么修改它就可以了。
總結
- 上一篇: 源码免杀-过启发式的思路
- 下一篇: 支持64位系统的XOR加密后内存加载PE