宏Virus
前言: 去年自学了部分关于宏病毒的知识,一直忙于学新知识,转眼又过了年,年前没能汇总、整理、分享宏病毒相关的笔记与心得,这次通过两个样本聊聊常见的宏病毒。
样本一 |
样本二 |
加密混淆(附C++去混淆代码) |
加密混淆 |
Function XXX()
这种格式表示一个函数
End Function
Sub AutoOpen()
运行文档时候,自动运行宏
End Sub
#include "pch.h"
#include
#include
#include
#include
using namespace std;
/*
转换Ascii码
*/
// 保存转换后的数据
vector vNewData;
// 保存获取数字
string nSaveStr;
void FilterNumberOfAscii(const char* str,int & nSize);
int ToAsciiOfchar(int temp);
int main()
{
// 需要转换的数据
char Data[] = { "xxxxxxxxx" };
// 注意不能sizeof求数组大小,会把最后的'\0'也当作数据来比对的
int nDataSize = strlen(Data);
FilterNumberOfAscii(Data, nDataSize);
// 遍历输出转换后的数据
for (auto iter = vNewData.begin(); iter != vNewData.end(); ++iter)
{
cout << (*iter);
}
putchar('\n');
system("pause");
return 0;
}
// Ascii判断及转换
int ToAsciiOfchar(int temp)
{
// 保存转换后的Ascii
char cSaveAscii;
istringstream is(nSaveStr.c_str());
is >> temp;
// 2. 将数字判断是否是ascii码
if (isascii(temp))
{
// 3. 转换成ascii码保存到
cSaveAscii = toascii(temp);
vNewData.push_back(cSaveAscii);
nSaveStr.clear();
return 1;
}
return 0;
}
// 条件过滤
void FilterNumberOfAscii(const char* str, int & nSize)
{
int temp;
nSaveStr.clear();
for (int i = 0; i < nSize; i++)
{
temp = 0;
/*36!78asd99*/
// 1. 连续的数字就有可能是Ascii
if (('0' <= str[i]) && ('9' >= str[i]))
nSaveStr += str[i];
else
{
if (nSaveStr.size() != 0)
if (!ToAsciiOfchar(temp))
{
// 如果是连续数字且不是Ascii码怎么办?解决思路如下:
// 1、注意顺序是最后一个在最前面,调用reverse 反转
// nSaveStr.reserve();
//
// for (int i = 0; i < nSaveStr.size(); ++i)
// {
// // 2、把数据入栈即可
// vNewData.push_back();
// }
// 因为该样本加密规律 所以上面就用不到了
cout << "发现了连续数字非Ascii码: " << temp << endl;
}
// vNewData.push_back(str[i]);
}
}
// 注意:因为按照strlen长度来for,最后一次容器中内容也要转换
if (nSaveStr.size() != 0)
ToAsciiOfchar(temp);
}
样本一的分析就到这结束,通过上面的分析应该对宏有一定的认知与解密去混淆的思路,下面一起来看第二个样本。
以上代码被识别的数据做了三件事: 1、%ComSpEc% C:\Windows\system32\cmd.exe 2、cmd参数 /c的含义是执行指定字符串然后中止 3、混淆powershellb变量
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~