日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

源码免杀笔记

發(fā)布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 源码免杀笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近沒什么心情寫博客,似乎停止不前了,唉,越來越懶了,不知道怎么回事,整理以前的筆記,這個免殺的,不知道內(nèi)容過時了沒。

各個殺毒軟件查殺特點不一樣,大致總結以下,API函數(shù),字符串,代碼段,資源段。免殺方法大致有如下幾種手段,動態(tài)函數(shù)調(diào)用,延遲加載DLL,合并區(qū)段,字符串隱藏,刪版權換版權,花指令,反調(diào)試等等細節(jié),以上幾種方法基本上過掉大部分殺軟,當然有能力也可以自己改變程序的代碼實現(xiàn)原來的功能。

1.動態(tài)函數(shù)調(diào)用

有兩個函數(shù)是不能調(diào)用的,GetProcAddress,LoadLibrary。

殺毒軟件如果查殺到API函數(shù)上,可以用動態(tài)函數(shù)調(diào)用解決。

typedef int (WINAPI *MessageBoxAT)

(

HWND hWnd,

LPCSTR lpText,

LPCSTR lpCaption,

UINT uType

);

MessageBoxAT pMessageBoxA= (MessageBoxAT)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");

2.字符串隱藏

利用數(shù)組來隱藏,字符串處理相對比較簡單,隱藏的辦法有很多,舉出一種吧。

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.合并區(qū)段

把其他區(qū)段合并到一個區(qū)段里,以前這個方法還管用,可以試試,但最好不要加。

#pragma comment(linker, "/MERGE:.rdata=.data")//把rdata區(qū)段合并到data區(qū)段里

#pragma comment(linker, "/MERGE:.text=.data")//把text區(qū)段合并到data區(qū)段里

#pragma comment(linker, "/MERGE:.reloc=.data")//把reloc區(qū)段合并到data區(qū)段里

4 .刪版權資源

有時對版權也查殺,可以換版權或者刪除。

5.花指令

如果殺在代碼段上可以加NOP來打亂程序的位置,一般不要加太多,有時也會查殺NOP。

__asm nop;

__asm nop;

__asm nop;

5.反調(diào)試

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.代碼換位
定位到特征碼后,看代碼中的程序是否可以代碼換位。


注意的細節(jié):
定位360BD引擎的時候,找到入口點,填充入口點以上的代碼,查殺,如果免殺,就說明在這一區(qū)段.

map文件定位:
用OD找代碼的時候,有時上下沒有參考,可以用map文件來幫助,在VC6.0中設置map文件,然后拿出來,用OD里面的一個插件loadmap,載入map,重新運行,就可以了.

?

二進制文件與源碼定位之map文件利用
??? map文件是二進制和源碼之間對應的一個映射文件。
??? 我們假設根據(jù)第三步我們定位出了病毒的特征碼:

????????? 病毒名稱?????? 特征碼位置????? 內(nèi)存地址
??????? svchost.dll 000038AA_00000002?? 100044AA
??????? svchost.dll 00005F98_00000002

??? 第一步設置VC編譯環(huán)境生成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 的第一個特征碼內(nèi)存地址為:100044AA,在第2塊中,我們可以找到RVA+BASE與之很接近的是

0001:00003440?????? ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f?? FileManager.obj

這樣我們可以定位到FileManager.cpp中的FixedUploadList函數(shù),是不是范圍縮小了?
下面我們再縮小代碼行
利用這個公式:特征碼行偏移 = 特征碼地址(Crash Address)- 基地址(ImageBase Address)- 0x1000
看起來好像很難,其實很簡單,我們將100044AA去掉內(nèi)存基址10000000,再減1000,因為PE很多從1000開始,可以得到代碼偏移地址為34AA。到第3塊中找對應的代碼行。
偏移地址34AA在(551 0001:0000349e?? 552 0001:000034b8 )中間,也就是551行和552行中間,我們到源程序中查找第551行:
??????? wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
這樣就定位出源代碼了,要怎么修改就怎么修改它就可以了。

總結

以上是生活随笔為你收集整理的源码免杀笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。