简介:
免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀
以下的内容多为前人总结,杀软常见的三种方式:行为和云查杀、静态查杀
静态查杀:一般根据特征码识别到,然后对文件进行特征匹配
行为查杀(动态查杀):程序运行时对它的行为进行检测
云查杀:对文件内容及行为的检测,要实现这个需要确定文件(md5)唯一值,提取唯一的特征上传到病毒库
杀软是如何检测出恶意代码的?
-
特征码
人有自己的特征,代码也有自己的特征。杀毒软件都有着一套特征库,依靠检索程序代码是否和库中特征码是否吻合来判断某段代码是否属于病毒
-
启发式恶意软件检测
如果该程序的特征和行为与病毒程序类似,其匹配程度达到一定值就可以认为该程序是病毒程序
-
基于行为检测
与启发式检测类似,只是单纯依靠监测程序行为来作为标准。通过监视恶意代码运行过程,如利用系统监视工具观察恶意代码运行过程时系统环境的变化,或通过跟踪恶意代码执行过程使用的系统函数和指令特征分析恶意代码功能,如出现恶意行为,则属于恶意代码
关于绕过df的一些想法
对于任何的上线代码理论上都不应该被查杀,因为上线程序除了发送一些连接性服务器的包,其实并没有做其他事情,特征也是最少的。所以对于免杀我们最简单的一步也就是上线
因为df没有内存扫描,所以对于上线我们需要隐藏的特征有两个,一个为shellcode加密,一个为 apI自实现,只要实现了这两个我们的程序上线也就是轻轻松松的事情。
其次我们要做的就是避免我们的行为被杀软查杀,这里根据不同的行为,我们需要做不同的处理,总体来说也就是要降低杀软对我们的风险评估,如执行一些行为可以释放出子进程来进行执行,我们的子进程是不联网的,这会大大降低风险评估。然后我们可以通过进程通信将结果传给我们程序。二就是通过dll劫持等一系列办法让白程序执行我们的行为
测试环境:物理机+最新版的DF+最新版360
这里把DF更新到最新版本
简介:
免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀
以下的内容多为前人总结,杀软常见的三种方式:行为和云查杀、静态查杀
静态查杀:一般根据特征码识别到,然后对文件进行特征匹配
行为查杀(动态查杀):程序运行时对它的行为进行检测
云查杀:对文件内容及行为的检测,要实现这个需要确定文件(md5)唯一值,提取唯一的特征上传到病毒库
杀软是如何检测出恶意代码的?
-
特征码
人有自己的特征,代码也有自己的特征。杀毒软件都有着一套特征库,依靠检索程序代码是否和库中特征码是否吻合来判断某段代码是否属于病毒
-
启发式恶意软件检测
如果该程序的特征和行为与病毒程序类似,其匹配程度达到一定值就可以认为该程序是病毒程序
-
基于行为检测
与启发式检测类似,只是单纯依靠监测程序行为来作为标准。通过监视恶意代码运行过程,如利用系统监视工具观察恶意代码运行过程时系统环境的变化,或通过跟踪恶意代码执行过程使用的系统函数和指令特征分析恶意代码功能,如出现恶意行为,则属于恶意代码
关于绕过df的一些想法
对于任何的上线代码理论上都不应该被查杀,因为上线程序除了发送一些连接性服务器的包,其实并没有做其他事情,特征也是最少的。所以对于免杀我们最简单的一步也就是上线
因为df没有内存扫描,所以对于上线我们需要隐藏的特征有两个,一个为shellcode加密,一个为 apI自实现,只要实现了这两个我们的程序上线也就是轻轻松松的事情。
其次我们要做的就是避免我们的行为被杀软查杀,这里根据不同的行为,我们需要做不同的处理,总体来说也就是要降低杀软对我们的风险评估,如执行一些行为可以释放出子进程来进行执行,我们的子进程是不联网的,这会大大降低风险评估。然后我们可以通过进程通信将结果传给我们程序。二就是通过dll劫持等一系列办法让白程序执行我们的行为
测试环境:物理机+最新版的DF+最新版360
这里把DF更新到最新版本
下面是最简单的上线代码
unsigned char shellcode[] = {};
void* runtime = VirtualAlloc(NULL, 0, sizeof(shellcode), MEM_COMMIT |
MEM_RESERVE, PAGE_EXECUTE_READWRITE, NULL, 0);
memcpy(runtime, shellcode, sizeof(shellcode));
((void(*)())runtime)()
函数采用动态调用的方式
-
动态调用
-
动态调用(进阶)
-
自实现loadlibrary与自实现getprocaddress
-
https://github.com/xalicex/Get-DLL-and-Function-Addresses(自实现loadlibrary,但是没有兼容APISET,再比较大的免杀项目中可能会有问题)
-
https://github.com/gbmaster/loadLibrary(无法加载系统dll)
-
动态调用(进阶,在使用自己的dll时有用)
自实现导出表,这样杀软不知道你导出了哪些函数,也不知道些函数的地址
关于shellcode
-
加密
对shellcode进行加密,这个没有什么好谈的,网上有很多对数据的加密代码,我们可以进行多次加密,这样的效果会好很多
-
分段加密
分段过后用一种算法已经还原不了shellcode了,这种对于静态扫描也很有效
-
shellcode在dll中解密并无上线代码
这种往往需要配合exe资源文件来释放dll,在进行加载dll,可以与上面的自实现loadlibrary配合使用
替换我们的shellcode
上线截图
360
DF
成功上线
执行命令 也没有被杀
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77727.html