防止DLL注入不成功

yaozhu88 2009-05-21 05:26:03
http://www.rohitab.com/discuss/index.php?showtopic=29440
A very simple way how to protect our prog. from being injected by a dll... There are other ways too (for example a a ssdt hook (LdrLoadLibrary, RtlCreateUserThread...), or something...).
code:
CODE// ANTI DLL INJECTION by _FIL73R_

#include <windows.h>

BOOLEAN BlockAPI (HANDLE,CHAR *,CHAR *);
void AntiInject ();

/****************/
main()
{
CreateThread (0,0, (LPTHREAD_START_ROUTINE)AntiInject, 0, 0, 0);
while (TRUE); // loop forever... now to try and inject
}
/****************/

void AntiInject ()
{
HANDLE hProc = GetCurrentProcess();
while (TRUE) {
BlockAPI(hProc, "NTDLL.DLL", "LdrLoadDll");
Sleep (100);
}
}

BOOLEAN BlockAPI (HANDLE hProcess, CHAR *libName, CHAR *apiName)
{
CHAR pRet[]={0xC3};
HINSTANCE hLib = NULL;
VOID *pAddr = NULL;
BOOL bRet = FALSE;
DWORD dwRet = 0;

hLib = LoadLibrary (libName);
if (hLib) {
pAddr = (VOID*)GetProcAddress (hLib, apiName);
if (pAddr) {
if (WriteProcessMemory (hProcess,
(LPVOID)pAddr,
(LPCVOID)pRet,
sizeof (pRet),
&dwRet )) {
if (dwRet) {
bRet = TRUE;
}
}
}
FreeLibrary (hLib);
}
return bRet;
}

这是网上找来的,但是我用建立远程线程对其注入DLL,照样能注入啊。它的意思 是不是改成Ntdll.dll的导出函数LdrLoadDll的函数头字节为0x3c,导致调用LoadLibrary和LoadLibraryEx失败啊。
...全文
1639 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-09-08
  • 打赏
  • 举报
回复
Up。。。学习
jamseyang 2010-09-08
  • 打赏
  • 举报
回复
learning...
yottaer 2010-09-07
  • 打赏
  • 举报
回复
try catch
mszjk 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qq939178212 的回复:]
在Ring0拦截ZwCreateSection可以防止注入。
[/Quote]
拦NtCreateSection那是蛋疼的行为.
XYCDefine 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qq939178212 的回复:]
在Ring0拦截ZwCreateSection可以防止注入。
[/Quote]

到内核就好多了
/dev/null0 2010-09-04
  • 打赏
  • 举报
回复
在Ring0拦截ZwCreateSection可以防止注入。
rageliu 2009-08-06
  • 打赏
  • 举报
回复
detour有bug,多次remove和重新hook。就出问题
sunrl1985 2009-07-03
  • 打赏
  • 举报
回复
还有一种注入更简单,用MicroSoft的开发包detour
sunrl1985 2009-07-03
  • 打赏
  • 举报
回复
BOOL InjectDLL(DWORD m_dProcessID)
{
for (int i=0;i<=MaxQQProdID;i++)
{
if(QQProcessID[i]==m_dProcessID)
{
return TRUE;
}
}
QQProcessID[MaxQQProdID]=m_dProcessID;
MaxQQProdID=MaxQQProdID>=100?0:MaxQQProdID+1;

HANDLE hProcess=NULL;
HANDLE hThread=NULL;
char *m_strRemoteName=NULL;
char m_strDllName[100];
lstrcpy(m_strDllName,"D:\\QQ2009VC版本\\MyWorkResult\\QQ2009VC版本\\Inject\\debug\\Inject.dll");
__try
{
hProcess=::OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,
FALSE,m_dProcessID);
if(!hProcess)
return FALSE;

int m_iDllNameLen=(lstrlen(m_strDllName)+1)*(sizeof(char));
m_strRemoteName=(char *)VirtualAllocEx(hProcess,NULL,m_iDllNameLen,MEM_COMMIT,PAGE_READWRITE);

if(!m_strRemoteName)
return FALSE;

if(!WriteProcessMemory(hProcess,m_strRemoteName,(LPVOID)m_strDllName,m_iDllNameLen,NULL))
return FALSE;

PTHREAD_START_ROUTINE m_pThread_Routine=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryA");
if(!m_pThread_Routine)
return FALSE;

hThread=CreateRemoteThread(hProcess,NULL,0,m_pThread_Routine,m_strRemoteName,0,NULL);
if(!hThread)
return FALSE;

WaitForSingleObject(hThread,INFINITE);
return TRUE;
}
__finally
{
if(m_strRemoteName)
VirtualFreeEx(hProcess,m_strRemoteName,0,MEM_RELEASE);
if(hThread)
CloseHandle(hThread);
if(hProcess)
CloseHandle(hProcess);
}
}
IORI915189 2009-07-03
  • 打赏
  • 举报
回复
拦截自身LoadLibraryExW 这个函数吧

如果仅仅只是防御 远程线程 你可以按下面这样做

在程序初始化时把自身程序的所有线程ID 用个ULONG 数组保存起来
并动态维护这个ULONG数组 这个也是多线程程序所必需的吧 如果是单线程就更方便了
然后 在LoadLibraryExW假函数里做一个判断
判断当前的操作线程是否为自身程序原有的线程 如果不是 就是远程线程了

ULONG __stdcall Fake_LoadLibraryExW(LPCWSTR lpwLibFileName,HANDLE hFile,DWORD dwFlags)

{
ULONG TID=GetCurrentThreadId();
//把这个TID 循环对比一下 是否存在于自身TID 数组


if (flag)//存在则 通过
{
return MyReal_LoadLibraryExW(lpwLibFileName,hFile,dwFlags);
}
else
{
return FALSE;
}
}



上面的方法可以防止远程线程 在自身程序加载DLL


但还有个问题 值得注意
WINDOWS的 SetWindowsHookEx (设GUI全局钩子) 这个函数
因为他是切换到进程上下文 使用程序自身线程来加载DLL的 所以不能用判断TID的方法来判断了

这里再提供二个思路

一个是 判断当前加载 的DLL 是否有WINDOWS签名 是则放行 否则拦截 (稍微有点费时 但非常安全)

在一个是 判断路径
系统加载DLL时 是不会包含DLL路径的 直接是类似“kernel32.dll” 这样的
所以 可以判断当前路径是否包含路径分割符 是则拦截 否则放行 (速度快 安全性较高)


结合上面三种方法 自己写个规则来决定拦截与否吧
比直接定义模块名 兼容性高多了 也方便多了

mmxqq 2009-06-15
  • 打赏
  • 举报
回复

up
luckyboy101 2009-05-22
  • 打赏
  • 举报
回复
学习,只知道qq做了防止dll注入
彳亍de孑孓 2009-05-22
  • 打赏
  • 举报
回复
xuexi

up
TianChong 2009-05-22
  • 打赏
  • 举报
回复
防止DLL注入我用的是另一种方法:

//允许的模块列表
theApp.m_szAuthorizedList = " USER32.DLL RPCRT4.DLL KERNEL32.DLL GDI32.DLL ADVAPI32.DLL NTDLL.DLL MSVCRT.DLL SETUPAPI.DLL CFGMGR32.DLL WINMM.DLL SHELL32.DLL SHLWAPI.DLL MSVCR80.DLL MFC80.DLL OLE32.DLL COMCTL32.DLL OLEACC.DLL OLEAUT32.DLL ATL80.DLL MSVCM80.DLL MFC80CHS.DLL MSVCP80.DLL MFCM80.DLL MFCM80U.DLL MFC80U.DLL VCOMP.DLL SECUR32.DLL MSVCRT.DLL MSVCP60.DLL MFC60.DLL ";

然后定时枚举系统进程,找到自己进程本身并分析所加载的模块,发现不是本身所用的就强制FREE掉:
do
{
if(!IsModuleAuthorized(me32.szModule))
{
HMODULE hmodule = me32.hModule;
CloseHandle(hModuleSnap);
FreeLibrary(hmodule);
//发现可疑模块并已移除
return;
}
}
greatws 2009-05-21
  • 打赏
  • 举报
回复
是这样的,0xc3在汇编里就是return的意思。不过这种方式也阻止了其他正常DLL的加载。

WriteProcessMemory成功了吗?
biweilun 2009-05-21
  • 打赏
  • 举报
回复
学习学习这个看看
http://hi.baidu.com/%CE%CF%C5%A3%CD%F8%C2%E7/blog/item/92bbed94f16ac84cd1135edd.html
huofen2005 2009-05-21
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
学习...
跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头。最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编码(htmlencode)。 但是如果想用户输入支持一些格式,怎么办?一种办法就是很多论坛采用的BB Code的方法。使用特定的标签代替一些格式。比如:[B]表示粗体,等等。但是,BB Code这种形式并不被广泛接受,它的表现力实在太差了,而且并不是标准格式。 为了让用户的输入更具表现力,涌现了大量的Html编辑器控件,著名的有FCKEditor,FreeTextBox,Rich TextBox,Cute Editor,TinyMCE等等。比如,博客园的后台发随笔就支持Cute Editor和TinyMCE,我个人比较喜欢Cute Editor,功能强大,性能不错,而且容易定制。 使用这些Html编辑器控件的潜在危险,是用户可能会输入一些危险字符,注入到网站中,形成XSS攻击。一个最简单的输入就是: alert('xss') 如何防止呢?大致思路有三种: 1. 正则表达式的白名单过滤机制。 2. 正则表达式的黑名单替换机制。 3. 通过DOM对象过滤白名单和黑名单的标签。 其实我用的很简单,就是AntiXss.GetSafeHtmlFragment(html)方法,这个方法会替换掉html里的危险字符。比如: var html = "aaaaaaaaajavascriptalert('a')Test"; string safeHtml = AntiXss.GetSafeHtmlFragment(html); Console.WriteLine(safeHtml); 上面的危险内容被成功替换,返回的内容是: aaaaaaaaajavascript alert('a') Test 嗯,非常安全。然后,又有一个疑问了,是应该将用户的输入过滤之后写入数据库呢?还是在输出界面显示的时候进行过滤?其实,通常来讲,在输出界面显示的时候进行过滤就够了,将用户输入过滤后写入数据库不是很必要,因为即使这样也无法保证数据库中没有危险的数据。当然,上个双保险也没有什么不好的。
DRAT 2010 V4.3 正式版 Build 1220(已完美脱壳) 编译环境:Vista+Delphi7 使用环境:Win2K\WinXp\Win2003\Vista\Win2008\Window7 1.系统信息:可以查看操作系统版本、Cpu类型、内存信息、杀毒软件、防火墙、检测辅助(虚拟机、360安全卫士等)、硬盘大小等 2.文件管理:文件浏览、上传、下载、删除、运行 目录创建和删除。 3.屏幕控制:可以查看对方屏幕,鼠标控制,键盘控制 4.视频捕捉:可以捕获对方的视频摄像头影像 5.超级终端:也就是telnet命令执行 6.进程管理:可以查看对方进程,并可以终止进程。 7.插件管理:可以加载自定义插件扩展功能。 服务端体积:44.5 KB(压缩) 97.5 KB(无压缩) 启动方式简要说明 1.Active启动 第一次安装:360安全卫士无提示,即时上线 更新安装:文件及时替换完成 不重复上线 2.新建服务: 第一次安装:360安全卫士有提示,即时上线 更新安装:文件及时替换完成 不上线(防止重复上线发生) 插件使用及插件相关参数说明: HTTP.dll Http插件 0.1 By New4[D.S.T] 开放端口:5555 Socks4.dll Socks4插件 0.1 By New4[D.S.T] 开放端口:8080 Open3389.dll Open3389插件 0.1 By New4[D.S.T] 开放端口:3389(或原来的端口) UnSRAT.dll UnSRAT插件 0.1 By New4[D.S.T] 加载后自动清理,成功后生成日志log.txt 插件添加后:%SystemRoot%\System32\DRAT 为插件存放目录,如需可手动上传即可。 DRAT.exe 主程序文件校验: MD5: F543BDCB5282307AA37DAEDA72A16002 SHA1: 194ECC0483AA17FB7AFF6BF437FE02560ED1A63D CRC32: 666CDFD5 Server.dat 服务端文件校验:(如果发现MD5有问题请不要使用) MD5: 4CFC55CD6FAEAB3E4ACE1FD80F63A5E9 SHA1: 7EBCED74F6F5C421E9EDBA0DFD5AC2B1D7ECAAFF CRC32: 0C79CD0D 更新日志: V3.3 更换网络核心组件到Indy10 修正屏幕监控无法停止的错误 修正屏幕控制停止后连接未断开的错误 修正键盘输入时回车符导致客户端掉线 键盘输入不兼容旧版 修正GB内存的错误显示问题 修正客户端在注销状态无法控制的错误 增加发送Ctrl+Alt+Del键功能用于远程登录(只支持服务启动) 支持多选文件下载(暂时还不稳定) V3.4 修正异常掉线导致控制端崩溃的Bug 重写并优化屏幕控制部分代码 修正主机下线日志不显示及统计不正常的bug 重写插件管理接口代码 配置服务端可自选保存路径 修正文件传输被控端异常断开导致控制端内存占用过高的bug 修正文件传输控制端异常断开导致被控端出错的bug V3.5 修正Active Setup启动不稳定的bug 重写被控端网络连接逻辑判断 修正控制端关闭时导致掉机的bug 由于屏幕算法原因暂时不支持远程登录暂时删除 V3.6 屏幕监控增加捕获层功能(完美屏幕查看) 屏幕监控增加全屏模式(按F12键) 屏幕监控增加剪切板功能(尚有bug) 获取外网IP函数改写(不会出现程序打不开的bug) 修正一个http上线可能导致暂时性掉鸡的bug 支持远程登录修复发送Ctrl+Alt+Del键功能用于远程登录(只支持服务启动) V3.7 优化远程信息获取部分代码 通信协议修改不兼容旧版 修正一个上线可能存在的bug 重写视频功能速度有所提升 被控端掉线检测功能修复 在次修正Active Setup启动不稳定的bug 配置服务端默认.exe后缀 异常掉线容错次数设置为5次 V3.8 修正无视频点击视频设备主机掉线的bug 文件传输代码更换回DRAT3.2版 使用最新的系统判断函数(支持显示Vista\2008) 重新开启皮肤渲染效果(并提供56款皮肤更换,可到主页下载) 修改服务端和客户端掉线检测机制 V3.9 重写文件传输现在更加稳定 文件续传功能仅支持下载续传 文件传输功能支持Bit位传输 修正掉线检测的一个逻辑错误 新版修改协议不兼容旧版 V4.0 兼容Windows7 RTM版(由于注入原因暂时还不支持屏幕监控) 屏蔽了Active启动状态下发送Ctrl+Alt+Del键功能的错误 修正一个Active启动状态重复上线的问题 关闭窗口时如果出现关闭困难或者跳至主窗口请关闭皮肤功能 修正控制端心跳包检测 时间为60秒 修正被控端心跳包检测错误导致上下线 修复下线气泡提示的Bug 增加服务端配置信息保存项 修正设置皮肤导致读取其他配置的逻辑错误 修正摄像头MPEG录像功能并启用 修正屏幕传输掉线时出现的无法关闭窗口的错误(Error #10054) 修正大量主机掉线时可能会导致程序停止响应并出现内存错误 由于indy10线程池问题将网络组件换回indy9 插件管理功能移至控制中心 增加屏幕控制顶部标示主机IP地址 修正3.3之后版本可能会出现占CPU高的bug 修正内测第5版的主机下线后主机总数计数错误的bug 管理中心插件模块增加本地上传插件功能 优化自动上线主机统计部分代码 对服务端部分代码进行优化缩小体积 修正内存识别错误采用MB为单位计算 重写文件管理部分代码加快传输不兼容旧版 增加连接上限设置\是否使用服务端心跳设置\自动断开重复主机设置(默认不启用) 修改文件下载路径文件夹名以IP地址命名 修正旧版下载无法续传的错误 优化控制端命令发送部分代码 V4.1 修正一个同主机屏幕多开的bug 修正一个插件管理功能无法删除插件的bug 重写优化控制中心部分代码使运行更稳定 文件传输删除任务功能支持多选删除 控制中心获取的信息细节优化 修正上一个版本无法删除目录的bug 传输命令格式变更完全加密 V4.2 修正上一个版本插件传输失败的bug 抛弃旧版本文件传输功能重写 文件传输功能支持断点续传 文件传输功能支持文件多选操作 抛弃旧版本文件浏览功能重写 使用windows接口打造仿真explorer 使用windows本地图标组最大限度保证显示与类型相符 可正常读取网络磁盘\可读写光盘的数据(DRIVE_REMOTE\DRIVE_FIXED) V4.3 修正部分机器远程主机图标获取失败的bug
特别说明: 本软件谢绝任何支持或使用3721(及及该公司其他产品如雅虎助手等)的人士使用。 multiCCL      by niu-cow in NE365 开发调试环境及工具 : win2k+sp4 dev-cpp 4.992 Lcc_win32 MASM32 v9.0 Radasm ollydbg 1.10 winHex 12.5 包含文档: 1. multiCCL_f.exe 文件特征码专用版 2. multiCCL_m.exe 内存特征码专用版 3. multiCCL_inj.exe 注入代码块内存定位专用版 4. memtest.exe  用作内存定位时加载dll或运行exe或向目标进程注入的辅助程序          (为了防止主程序被杀毒软件Kill,用了远程线程注入) 5. AutoStartScanDll.dll 自动操作模块,使得部分操作自动化 6. multiCCL_readme.txt 本说明文档 7. multiCCL原理图示.htm 基本原理图示 功能: 原来已有的 文件特征码定位功能 (对 PE文件 和 非PE文件)--此功能已较稳定 本版新增功能:内存特征码定位(对PE文件)---------此功能测试中 因为现在杀毒软件针对特征码定位器设置了某些干扰,最终决定把文件定位和   内存定位做成两个独立的部分。 其实代码基本一样的,只为方便日后的维护和升级。 ----------------------------------- ......内存定位.重要提示....... 1.定位期间不要浏览任何放有病毒样本的文件夹 以免被杀毒软件的实时监控删掉 2. 现在打开杀毒软件的实时检测(保护级别在自定义中设置得严格些) 实时检测的执行动作可设置为: a. 提示用户操作 b. 禁止访问并删除 推荐选 a ,千万不要选“仅禁止访问”,“隔离”也不要选 3. 当然也可以按提示手动扫描内存 执行动作设为“仅报告”或“提示用户操作” 只要杀毒软件报告检测结果就行了,不需要它删除或禁用什么 4. 防火墙不要监视远程线程 因为multiCCL为了避免主程序被杀毒软件kill,用远程线程加载样本   (另外,正在找有关驱动方面的资料) ------------------------------------ ------------------------------------ 现在重点测试内存特征码的定位功能。 通过后再添加。现在的界面也还有点马虎,用cmd界面也是为测试 方便,因为随时都可输出中间信息。 ((听 tankaiha 一说还真不想写GUI界面了)) 需要说明的问题是:     1. 开始定位一个样本时,如果发现样本目录中存在旧的记录文件,           程序会读取并认可 旧记录中的特征码。 如果想完全重新开始定位,应该先把旧的记录文件删除或改名, 之后再打开multiCCL 。 2. 输出目录里不要放置任何您想保留的文件,以免给您带来损失。 定位过程中将删除里面的一些文件。 另一个简单的做法是:先手动在样本所在目录下建一个名为              output 的子目录,然后在选择目录的对话框点 “取消”,这样输出文件就都放到这个output 目录下了。 3. 设置保护片段时,如果所保护的片段本身是独立的特征码,就会        导致定位失败,因为所生成的文件会全部被杀,而且一直如此。         所以在设置前,          先要确认所保护的片段不是独立的特征码。 v 0.100 beta 之后的版本用的是等分法,限制区域的优化效果, 对于文件特征码来说是很不明显的, 而对于内存特征码的定位还是比较明显的。 ;  要注意的是,文件定位每次提醒杀毒时,一定要把识别出的文件全部删除, 否则程序会判断错误的。(内存定位就没关系了) 记录文件格式: 只要注意以下几个字段和键值就可以了: [CharactorCodz] ;特征码总数 CharactorTotal= ;特征码的记录格式是 H_起始偏移_结束偏移_长度_…… ;一般只要注意 起始偏移 结束偏移 就够了。记录的是文件偏移, ; 用十六进制表示 ;特征码1 Codz1= ;特征码2 Codz2= ;…… ;当OK=1时表示定位成功完成,ok=0表示定位没有完成 ok= ----------- ;文件定位的记录文件是 multiCCL_f_Log.txt ;内存定位的记录文件是 multiCCL_m_Log.txt ;都放在样本文件所在的目录下。 ----------- ;看内存定位结果时,还有一个字段需要注意的: [antiLocateCodz] newCodz=1 OK=1 CharactorTotal= Codz1= Codz2= …… ;这是杀毒软件针对内存定位干扰码,( antiLocateCodz ) ;定位不出内存特征码或修改内存特征码无效时, ;可以考虑修改入口点(修改代码或转移入口点), ;若以上修改还是无效,则试试修改干扰码。 ;---------------------------- ;另外也请看看更新记录,里面也有部分说明 ; ; 同时也请帮助统计定位一个样本特征码所需的时间,大致记录下就行 ; 结果请反馈到: http://vxer.cn/bbs/read.php?fid=9&tid=112&page=1 ;----------------------------------------------- ;统计内容包括: ;-------- ;基本信息: 哪种杀毒软件的XXX文件定位(病毒库版本XXXX) ;1 样本文件大小: ;2 总共定位出特征码片段的数量: ;3 总共需要杀毒软件扫描几次: ;4 定位总用时: ;5 定位结果评价: 基本可用/有较大偏差/很不可靠 ;---------------------------------------------- ;BTW: 本程序针对的目标是杀毒软件的复合特征码的定位,    当然也包括单一特征码了。 ;免责声明:本程序只供学习,不得用于商业。本程序可能存在某些缺陷,       及其他可能隐含的问题,      使用中可能造成的一切后果,均由使用者自行负责。 如果您对此很在意则请勿使用。 ;感谢您的测试,使用中请保留软件文档的完整,发现任何问题请到NE365的BBS上反馈。 ;(借用一下NE365的空间 http://vxer.cn/bbs ,一并致谢NE365 ;及各位网友的帮助和测试 ,大家多多支持NE365吧) ; ;特别说明:本软件谢绝任何支持或使用 3721 的人士使用。             niu-cow 2006-05-22 --------------------------------------------- 大致上找到了特征码没完没了的原因了   很可能是因为保护区域设置得过大,其中含有相当数量的隐含病毒特征, 导致启发式扫描的极高的实现机率。 实际测试中也发现当没有设置保护区域时, 定位出的特征码就很有限。   看来,设置合理的保护区域,对于定位是非常重要的, 尤其是针对“启发式扫描”(NOD32称之为“高级智能侦测模式”)的定位。   尽管以上只是猜测,不过本人认为这下被猜中了。 niu-cow 2006-05-31 20:08 ----------------   在tanknight(myCCL的作者)的BLOG上看到NOD32定位的有关讨论,据说定位 精度太高时,对NOD32的定位往往失败。一般控制在8--16字节为宜。   依照这个原理增加了个控制定位精度的模块,重复的现象有所减少,但 问题好象还没有解决。 niu-cow 2006-06-10 17:04 ------------------------------------------------------------------ ======================================================================================== ------------------------------------------------------------------ 更新历史: v 1.200 (当前版本) 1.为文件特征码定位部分增加了模拟鼠标键盘动作的自动操作模块, 这下可以在定位时抽空喝杯开水了(有关说明在模块的设置界面) 建议先手动操作定两三个特征码,之后设置使用自动操作 2.内存定位时exe的加载方式作了改变,这个版本用CREATE_SUSPEND参数 使进程或线程创建时处于挂起状态(类似于被调试器加载,因为 据网友反馈说部分杀毒软件的内存扫描对于OLLYDBG加载的程序 起作用,而对于MYCCL、multiCCL、CCL等的加载不起作用)。 dll的加载没改(因为目前还没找到更好的方法) 注:本版的memtest.exe、memtiCCL_m.exe、multiCCL_inj.exe 和之前的版本均无法兼容,不要混用。 2007-07-17 v 1.150 1.解决了memtest.exe被杀时,主程序的SendMessage无法返回的问题 2.为注入型的提升权限(只有当拥有Administrators以上权限时才起 作用) 这样就可以注入某些系统进程。 注:本版的memtest.exe、memtiCCL_m.exe、multiCCL_inj.exe 和之前的版本均无法兼容,不要混用。 2006-11-29 v 1.140 1.修正了第一次生成Except.txt(用于设置保护区域定位精度等)时, 未能生成完整的模板,导致很多使用者第一次使用时无所适从, 2.将内存定位的一个容易引起误解的“判断……”改为“将判断……” (以上两处BUG感谢网友woaicomputer等的反馈) 3.增加了定位注入数据块的特征码的功能(主要用于对付flux等) 方法是:a 想办法从内存中抓取注入的数据块 (这个要自己想办法) b 用multiCCL_inj.exe处理数据块并注入了目标进程, 结合杀毒软件扫描内存,进行判断定位 注:memtest.exe 再次升级,以适用于multiCCL_inj.exe 2006-11-15 v 1.130 (仅针对内存定位模块) 1.改变EXE的加载方式为创建进程(原来用LoadLibrary) 2.增加对保护区域设置的检测,这样加载失败的机率更少      (本版的 multiccl_m.exe 和 memtest.exe 与过去的版本不兼容) 2006-11-5 v 1.120 (仅针对内存定位模块) 因为有的杀毒软件监视远程线程,用注入法要先关闭这个监视 感觉这样有些麻烦,改用发消息让宿主程序主动加载 ( 此版的 multiccl_m.exe 和 memtest.exe 得配合使用了) 2006-10-23 v 1.110 (仅针对内存定位模块) 有网友(无涯)反馈说内存定位时有问题 发现问题的系统是WIN2003 本人在WIN2K+SP4下测试未发现问题 从出错截图看,问题很可能在杀进程的函数 检查源代码,只发现一个进程句柄没有及时关闭,修正了这个函数, 作为试探性修改,看看问题是否解决。 2006-07-14 v 1.100 : 1- 修正了处理干扰码的方式,并在记录中用~~作标记,或许有点用。 (注:干扰码也可能是特征码的一部分) 2- 修正了定位头端时的还原方式。 3- 生成文件时增加一秒停顿。 这个版本的两处修正都只是试探性的修改。 2006-07-04 v 1.010 : 仅修正了内存定位的模块,使其生成的文件数更少(定头端时) 这样每轮加载次数最多35次,绝大多数时候是28次 (尾端20次,头端8次) 文件定位仍用v 1.000版 2006-06-20 v 1.000 : 从本版本开始,已经是正式版了~~~~ 1- 记录文件文件名中 包含了样本文件名,以有所区别, 感谢pipapi的建议。 2- 增加了一个控制定位精度的功能。 具体是在Except.txt文件中改变dwX的值 当dwX=1 时精度为一字节(最高),如果存在旧的Except.txt 则请自行增加这个字段,如下(前后都不要有空格): [dwX] dwX=1 降低精度的目的是减少一些干扰(如NOD32的启发式扫描), 经实际测试发现仍然无法完全避免。 (一般降为 12-16 字节左右为宜,dwX的值用十进制) 保护区域设置的合适一些,不要太大才是最重要的。                  2006-06-09 v 0.120 beta: 1- 实际使用中发现,杀毒软件的“启发式扫描” (NOD32的称“高级智能侦测模式”的扫描速度实在慢, 为提高效率,减少每次生成文件的数量, 当然多扫一遍了(以 1 MB 计算)。 这样一来,对磁盘空间的需求也减少了一半。不过现在 的硬盘都很大,不会在乎这点的。 此修正针对文件定位(也包括内存定位前的干扰码定位) 2- 提示音作了细小的调整。 2006-05-31 v 0.110 beta: 1- 增加了内存定位功能(二分法),这样每定位一处特征码 最多只需加载64次(其中定尾端20次,头端32次) 2- 修正了卸载方式。 3- 彻底屏蔽限制点区能。 4- 文件定位仍使用 v 0.100 beta 版 2006-05-25 v 0.100 beta: 1- 修正了winXP下当软件路径带空格时出错的问题, 感谢 最近的星球 的测试和反馈 2- 改用了等分法(原来用二分法),效率提高明显。           测试过程中发现的一个偶然的错误却解决了算法中的一个  细节问题,进一步提高了效率(与理论效率相比) 激动ing ,每次最多可能生成64个文件 使用新版本时,把旧版本的记录文件重命名或删除吧, 以免造成潜在的冲突。 3- 增加了定位限制点的功能,就是说只定位限制点之前的部分 且直接从此点开始,   限制点之后的所有数据都将被随机数据串填充。               若需要保护某区数据,请与保护区域配合使用。 限制点的格式为 8 位的十六进制值,以表示文件偏移。 且只当标志设为1时起作用,限制标志为0时不起作用。 特别说明: 这个功能只是预留,目前测试表明没什么用处。   目前的版本只有文件定位功能,就不要使用限制点了。 4- 使用新算法的multiCCL版本号从 v 0.100 beta 开始。 目前只有文件定位功能。先测试BUG。 2006-05-22 v 0.017 beta-p: 再次作一小的修正,因为发现和卡巴对0.012版类似干扰, 这次是别的杀毒软件了,也不清楚原理是什么,干脆连 同干扰码一起定位了,这样还省心些。 (以后前面冒出的干扰码就不怕了, 今后的升级只要应付覆盖区冒出的干扰码就行了) 本BUG系astronomer反馈,致谢 2006-05-18 v 0.017 beta : 再次修正随机数据的生成方式,修正的效果有待测试 因为定位NOD32对彩虹桥英文1.02版的文件特征码时 发现有干扰。(感谢yxrx的测试)                 2006-05-18 v 0.016 beta-p: 1-修正一个针对已找出的特征码的覆盖方式, 因为针对ewido定位时,发现特征码不断地“往前长”, 看看更改后能否通过。 (只为只是小的修正,界面上仍标识为 v 0.016 ) 感谢 honhon 的测试和反馈。 2-用LCC_win32+RadAsm重写宿主程序(内存定位用),体积 更小了。                2006-05-16 v 0.016 beta : 1-修正了随机数据串的生成方式 (感谢abc27的针对NOD32的测试) 2=修正了其他已发现的次要的BUG。 2006-05-13 v 0.015 beta : 1-增加了内存定位的功能,为防止加载样本时被杀毒软件关 闭,启动了一个靶程序,用远程线程注入到宿主进程 2-当样本文件所在目录存在旧的记录文件时,程序将读取旧 记录文件中所记录的已定位出的特征码,并认可这些特 征码。 新增这个功能主要是考虑到有些杀毒软件的特征码片段 的数量很大,每次从头再来显然太浪费时间了。 尤其是相对烦琐的内存定位,万一中途意外中断, 丢弃之前的结果从头再来是不可容忍的。 3-修正了一些已发现的BUG(比较次要,不影响使用) 4-针对杀毒软件的干扰做了些应对性的改变。 2006-04-30 v 0.014 beta : 1-改用随机数据串填充,因为发现有的杀毒软件用检测填充 0来反定位(他们动作蛮快的哈) 2-把记录文件放到要定位的样本文件所在的目录下了,因为             考虑到以后杀毒软件可能会检测改写记录文件来反定位,              和输出文件放在一起不妥。 3-修正了一处因优化中带来的定位重复造成失败的BUG 感谢frip反馈 4-增加了保护片段(或区域设置),这是为了对付NDD32这类             关联输入表的特征码。(设置方法软件会有提示的) (此功能效果有等测试,感谢111111113提供有关针对NDD32的建议) 因为此版修复和更新相对较大,就跳到0.014 版了,本来想写内存定位的, 不过这两天忙于对付杀毒软件的反定位,内存定位就留到下个版本了。             (其实很想休息几天的,有点累) 2006-04-24 v 0.012 alpha : 1-修正了记录中特征码长度多出一个字节的错误。 ( tandaiha发现 ) 2-当发现特征码片段的长度超过32byte时,就取这32位作为片段结果 反正只要篡改片段里的任何一个字节就行,定出这么长就够了, 发现有的杀毒软件的取样片段(如卡巴斯基 vs AngleShell )               的长度有点不可思议,硬要找出片段的头端简直是浪费时间。            所以,在分析定位结果时,特征码片段的尾端一般是精确的,              当片段长度 <32bytes(记录中用的是十六进制的20) 时, 头端也是精确的,否则头端可能还在更前面。 反正记录结果对于修改来说,已经够用了。 2006-04-22 v 0.011 alpha : 重新排列了按键及暂停,便操作更简洁 2006-04-21 v 0.010 alpha : 原始版本,算法调试基本通过 2006-04-21
特别说明: 本软件谢绝任何支持或使用3721(及及该公司其他产品如雅虎助手等)的人士使用。 multiCCL      by niu-cow in NE365 开发调试环境及工具 : win2k+sp4 dev-cpp 4.992 Lcc_win32 MASM32 v9.0 Radasm ollydbg 1.10 winHex 12.5 包含文档: 1. multiCCL_f.exe 文件特征码专用版 2. multiCCL_m.exe 内存特征码专用版 3. multiCCL_inj.exe 注入代码块内存定位专用版 4. memtest.exe  用作内存定位时加载dll或运行exe或向目标进程注入的辅助程序          (为了防止主程序被杀毒软件Kill,用了远程线程注入) 5. multiCCL_readme.txt 本说明文档 6. multiCCL原理图示.htm 基本原理图示 功能: 原来已有的 文件特征码定位功能 (对 PE文件 和 非PE文件)--此功能已较稳定 本版新增功能:内存特征码定位(对PE文件)---------此功能测试中 因为现在杀毒软件针对特征码定位器设置了某些干扰,最终决定把文件定位和   内存定位做成两个独立的部分。 其实代码基本一样的,只为方便日后的维护和升级。 ----------------------------------- ......内存定位.重要提示....... 1.定位期间不要浏览任何放有病毒样本的文件夹 以免被杀毒软件的实时监控删掉 2. 现在打开杀毒软件的实时检测(保护级别在自定义中设置得严格些) 实时检测的执行动作可设置为: a. 提示用户操作 b. 禁止访问并删除 推荐选 a ,千万不要选“仅禁止访问”,“隔离”也不要选 3. 当然也可以按提示手动扫描内存 执行动作设为“仅报告”或“提示用户操作” 只要杀毒软件报告检测结果就行了,不需要它删除或禁用什么 4. 防火墙不要监视远程线程 因为multiCCL为了避免主程序被杀毒软件kill,用远程线程加载样本   (另外,正在找有关驱动方面的资料) ------------------------------------ ------------------------------------ 现在重点测试内存特征码的定位功能。 通过后再添加。现在的界面也还有点马虎,用cmd界面也是为测试 方便,因为随时都可输出中间信息。 ((听 tankaiha 一说还真不想写GUI界面了)) 需要说明的问题是:     1. 开始定位一个样本时,如果发现样本目录中存在旧的记录文件,           程序会读取并认可 旧记录中的特征码。 如果想完全重新开始定位,应该先把旧的记录文件删除或改名, 之后再打开multiCCL 。 2. 输出目录里不要放置任何您想保留的文件,以免给您带来损失。 定位过程中将删除里面的一些文件。 另一个简单的做法是:先手动在样本所在目录下建一个名为              output 的子目录,然后在选择目录的对话框点 “取消”,这样输出文件就都放到这个output 目录下了。 3. 设置保护片段时,如果所保护的片段本身是独立的特征码,就会        导致定位失败,因为所生成的文件会全部被杀,而且一直如此。         所以在设置前,          先要确认所保护的片段不是独立的特征码。 v 0.100 beta 之后的版本用的是等分法,限制区域的优化效果, 对于文件特征码来说是很不明显的, 而对于内存特征码的定位还是比较明显的。 ;  要注意的是,文件定位每次提醒杀毒时,一定要把识别出的文件全部删除, 否则程序会判断错误的。(内存定位就没关系了) 记录文件格式: 只要注意以下几个字段和键值就可以了: [CharactorCodz] ;特征码总数 CharactorTotal= ;特征码的记录格式是 H_起始偏移_结束偏移_长度_…… ;一般只要注意 起始偏移 结束偏移 就够了。记录的是文件偏移, ; 用十六进制表示 ;特征码1 Codz1= ;特征码2 Codz2= ;…… ;当OK=1时表示定位成功完成,ok=0表示定位没有完成 ok= ----------- ;文件定位的记录文件是 multiCCL_f_Log.txt ;内存定位的记录文件是 multiCCL_m_Log.txt ;都放在样本文件所在的目录下。 ----------- ;看内存定位结果时,还有一个字段需要注意的: [antiLocateCodz] newCodz=1 OK=1 CharactorTotal= Codz1= Codz2= …… ;这是杀毒软件针对内存定位干扰码,( antiLocateCodz ) ;定位不出内存特征码或修改内存特征码无效时, ;可以考虑修改入口点(修改代码或转移入口点), ;若以上修改还是无效,则试试修改干扰码。 ;---------------------------- ;另外也请看看更新记录,里面也有部分说明 ; ; 同时也请帮助统计定位一个样本特征码所需的时间,大致记录下就行 ; 结果请反馈到: http://vxer.cn/bbs/read.php?fid=9&tid=112&page=1 ;----------------------------------------------- ;统计内容包括: ;-------- ;基本信息: 哪种杀毒软件的XXX文件定位(病毒库版本XXXX) ;1 样本文件大小: ;2 总共定位出特征码片段的数量: ;3 总共需要杀毒软件扫描几次: ;4 定位总用时: ;5 定位结果评价: 基本可用/有较大偏差/很不可靠 ;---------------------------------------------- ;BTW: 本程序针对的目标是杀毒软件的复合特征码的定位,    当然也包括单一特征码了。 ;免责声明:本程序只供学习,不得用于商业。本程序可能存在某些缺陷,       及其他可能隐含的问题,      使用中可能造成的一切后果,均由使用者自行负责。 如果您对此很在意则请勿使用。 ;感谢您的测试,使用中请保留软件文档的完整,发现任何问题请到NE365的BBS上反馈。 ;(借用一下NE365的空间 http://vxer.cn/bbs ,一并致谢NE365 ;及各位网友的帮助和测试 ,大家多多支持NE365吧) ; ;特别说明:本软件谢绝任何支持或使用 3721 的人士使用。             niu-cow 2006-05-22 --------------------------------------------- 大致上找到了特征码没完没了的原因了   很可能是因为保护区域设置得过大,其中含有相当数量的隐含病毒特征, 导致启发式扫描的极高的实现机率。 实际测试中也发现当没有设置保护区域时, 定位出的特征码就很有限。   看来,设置合理的保护区域,对于定位是非常重要的, 尤其是针对“启发式扫描”(NOD32称之为“高级智能侦测模式”)的定位。   尽管以上只是猜测,不过本人认为这下被猜中了。 niu-cow 2006-05-31 20:08 ----------------   在tanknight(myCCL的作者)的BLOG上看到NOD32定位的有关讨论,据说定位 精度太高时,对NOD32的定位往往失败。一般控制在8--16字节为宜。   依照这个原理增加了个控制定位精度的模块,重复的现象有所减少,但 问题好象还没有解决。 niu-cow 2006-06-10 17:04 ------------------------------------------------------------------ ------------------------------------------------------------------ 更新历史: v 1.150 (当前版本) 1.解决了memtest.exe被杀时,主程序的SendMessage无法返回的问题 2.为注入型的提升权限(只有当拥有Administrators以上权限时才起 作用) 这样就可以注入某些系统进程。 注:本版的memtest.exe、memtiCCL_m.exe、multiCCL_inj.exe 和之前的版本均无法兼容,不要混用。 2006-11-29 v 1.140 1.修正了第一次生成Except.txt(用于设置保护区域定位精度等)时, 未能生成完整的模板,导致很多使用者第一次使用时无所适从, 2.将内存定位的一个容易引起误解的“判断……”改为“将判断……” (以上两处BUG感谢网友woaicomputer等的反馈) 3.增加了定位注入数据块的特征码的功能(主要用于对付flux等) 方法是:a 想办法从内存中抓取注入的数据块 (这个要自己想办法) b 用multiCCL_inj.exe处理数据块并注入了目标进程, 结合杀毒软件扫描内存,进行判断定位 注:memtest.exe 再次升级,以适用于multiCCL_inj.exe 2006-11-15 v 1.130 (仅针对内存定位模块) 1.改变EXE的加载方式为创建进程(原来用LoadLibrary) 2.增加对保护区域设置的检测,这样加载失败的机率更少      (本版的 multiccl_m.exe 和 memtest.exe 与过去的版本不兼容) 2006-11-5 v 1.120 (仅针对内存定位模块) 因为有的杀毒软件监视远程线程,用注入法要先关闭这个监视 感觉这样有些麻烦,改用发消息让宿主程序主动加载 ( 此版的 multiccl_m.exe 和 memtest.exe 得配合使用了) 2006-10-23 v 1.110 (仅针对内存定位模块) 有网友(无涯)反馈说内存定位时有问题 发现问题的系统是WIN2003 本人在WIN2K+SP4下测试未发现问题 从出错截图看,问题很可能在杀进程的函数 检查源代码,只发现一个进程句柄没有及时关闭,修正了这个函数, 作为试探性修改,看看问题是否解决。 2006-07-14 v 1.100 : 1- 修正了处理干扰码的方式,并在记录中用~~作标记,或许有点用。 (注:干扰码也可能是特征码的一部分) 2- 修正了定位头端时的还原方式。 3- 生成文件时增加一秒停顿。 这个版本的两处修正都只是试探性的修改。 2006-07-04 v 1.010 : 仅修正了内存定位的模块,使其生成的文件数更少(定头端时) 这样每轮加载次数最多35次,绝大多数时候是28次 (尾端20次,头端8次) 文件定位仍用v 1.000版 2006-06-20 v 1.000 : 从本版本开始,已经是正式版了~~~~ 1- 记录文件文件名中 包含了样本文件名,以有所区别, 感谢pipapi的建议。 2- 增加了一个控制定位精度的功能。 具体是在Except.txt文件中改变dwX的值 当dwX=1 时精度为一字节(最高),如果存在旧的Except.txt 则请自行增加这个字段,如下(前后都不要有空格): [dwX] dwX=1 降低精度的目的是减少一些干扰(如NOD32的启发式扫描), 经实际测试发现仍然无法完全避免。 (一般降为 12-16 字节左右为宜,dwX的值用十进制) 保护区域设置的合适一些,不要太大才是最重要的。                  2006-06-09 v 0.120 beta: 1- 实际使用中发现,杀毒软件的“启发式扫描” (NOD32的称“高级智能侦测模式”的扫描速度实在慢, 为提高效率,减少每次生成文件的数量, 当然多扫一遍了(以 1 MB 计算)。 这样一来,对磁盘空间的需求也减少了一半。不过现在 的硬盘都很大,不会在乎这点的。 此修正针对文件定位(也包括内存定位前的干扰码定位) 2- 提示音作了细小的调整。 2006-05-31 v 0.110 beta: 1- 增加了内存定位功能(二分法),这样每定位一处特征码 最多只需加载64次(其中定尾端20次,头端32次) 2- 修正了卸载方式。 3- 彻底屏蔽限制点区能。 4- 文件定位仍使用 v 0.100 beta 版 2006-05-25 v 0.100 beta: 1- 修正了winXP下当软件路径带空格时出错的问题, 感谢 最近的星球 的测试和反馈 2- 改用了等分法(原来用二分法),效率提高明显。           测试过程中发现的一个偶然的错误却解决了算法中的一个  细节问题,进一步提高了效率(与理论效率相比) 激动ing ,每次最多可能生成64个文件 使用新版本时,把旧版本的记录文件重命名或删除吧, 以免造成潜在的冲突。 3- 增加了定位限制点的功能,就是说只定位限制点之前的部分 且直接从此点开始,   限制点之后的所有数据都将被随机数据串填充。               若需要保护某区数据,请与保护区域配合使用。 限制点的格式为 8 位的十六进制值,以表示文件偏移。 且只当标志设为1时起作用,限制标志为0时不起作用。 特别说明: 这个功能只是预留,目前测试表明没什么用处。   目前的版本只有文件定位功能,就不要使用限制点了。 4- 使用新算法的multiCCL版本号从 v 0.100 beta 开始。 目前只有文件定位功能。先测试BUG。 2006-05-22 v 0.017 beta-p: 再次作一小的修正,因为发现和卡巴对0.012版类似干扰, 这次是别的杀毒软件了,也不清楚原理是什么,干脆连 同干扰码一起定位了,这样还省心些。 (以后前面冒出的干扰码就不怕了, 今后的升级只要应付覆盖区冒出的干扰码就行了) 本BUG系astronomer反馈,致谢 2006-05-18 v 0.017 beta : 再次修正随机数据的生成方式,修正的效果有待测试 因为定位NOD32对彩虹桥英文1.02版的文件特征码时 发现有干扰。(感谢yxrx的测试)                 2006-05-18 v 0.016 beta-p: 1-修正一个针对已找出的特征码的覆盖方式, 因为针对ewido定位时,发现特征码不断地“往前长”, 看看更改后能否通过。 (只为只是小的修正,界面上仍标识为 v 0.016 ) 感谢 honhon 的测试和反馈。 2-用LCC_win32+RadAsm重写宿主程序(内存定位用),体积 更小了。                2006-05-16 v 0.016 beta : 1-修正了随机数据串的生成方式 (感谢abc27的针对NOD32的测试) 2=修正了其他已发现的次要的BUG。 2006-05-13 v 0.015 beta : 1-增加了内存定位的功能,为防止加载样本时被杀毒软件关 闭,启动了一个靶程序,用远程线程注入到宿主进程 2-当样本文件所在目录存在旧的记录文件时,程序将读取旧 记录文件中所记录的已定位出的特征码,并认可这些特 征码。 新增这个功能主要是考虑到有些杀毒软件的特征码片段 的数量很大,每次从头再来显然太浪费时间了。 尤其是相对烦琐的内存定位,万一中途意外中断, 丢弃之前的结果从头再来是不可容忍的。 3-修正了一些已发现的BUG(比较次要,不影响使用) 4-针对杀毒软件的干扰做了些应对性的改变。 2006-04-30 v 0.014 beta : 1-改用随机数据串填充,因为发现有的杀毒软件用检测填充 0来反定位(他们动作蛮快的哈) 2-把记录文件放到要定位的样本文件所在的目录下了,因为             考虑到以后杀毒软件可能会检测改写记录文件来反定位,              和输出文件放在一起不妥。 3-修正了一处因优化中带来的定位重复造成失败的BUG 感谢frip反馈 4-增加了保护片段(或区域设置),这是为了对付NDD32这类             关联输入表的特征码。(设置方法软件会有提示的) (此功能效果有等测试,感谢111111113提供有关针对NDD32的建议) 因为此版修复和更新相对较大,就跳到0.014 版了,本来想写内存定位的, 不过这两天忙于对付杀毒软件的反定位,内存定位就留到下个版本了。             (其实很想休息几天的,有点累) 2006-04-24 v 0.012 alpha : 1-修正了记录中特征码长度多出一个字节的错误。 ( tandaiha发现 ) 2-当发现特征码片段的长度超过32byte时,就取这32位作为片段结果 反正只要篡改片段里的任何一个字节就行,定出这么长就够了, 发现有的杀毒软件的取样片段(如卡巴斯基 vs AngleShell )               的长度有点不可思议,硬要找出片段的头端简直是浪费时间。            所以,在分析定位结果时,特征码片段的尾端一般是精确的,              当片段长度 <32bytes(记录中用的是十六进制的20) 时, 头端也是精确的,否则头端可能还在更前面。 反正记录结果对于修改来说,已经够用了。 2006-04-22 v 0.011 alpha : 重新排列了按键及暂停,便操作更简洁 2006-04-21 v 0.010 alpha : 原始版本,算法调试基本通过 2006-04-21

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧