加壳器,练手之作,以此记录,如有错误,还望不吝赐教
使用PEB.BeginDebug与PEB.NtGlobalFlag检测是否被调试
bool BeginDebugged = false;
__asm
{
//获取PEB地址
mov eax, dword ptr fs : [0x30]
//获取PEB.BeginDebugged
mov al, byte ptr ds : [eax + 0x02]
mov BeginDebugged, al
}
//2.NtGlobalFlag在调试状态时值为0x70,正常下为0
int NtGlobalFlag = 0;
__asm
{
//获取PEB地址
mov eax, dword ptr fs : [0x30]
//获取PEB.NtGlobalFlag
mov eax, dword ptr ds : [eax + 0x68]
mov NtGlobalFlag, eax
}
NtGlobalFlag == 0x70 ? NtGlobalFlag = 1 : NtGlobalFlag = 0;通过查询注册表键查看是否在虚拟机中运行、
bool CheckWMWare()
{
if (pRegOpenKeyA(HKEY_CLASSES_ROOT, "\\Applications\\VMwareHostOpen.exe", &hkey) == ERROR_SUCCESS)
{
return true;
}
else
{
return false;
}
}先修复壳代码的重定位表,给原程序添加个区段并将修复好的壳代码的重定位表拷贝到新区段,将原程序的重定位表指向我们新增的区段,这样程序就会自动帮我们重定位壳代码中的数据。在壳代码中,修复原程序的重定位。
如果程序有tls表,会关闭随机基址。
弹窗密码会使用base64加密
使用AES_128对代码段进行加密(密钥为随机生成),使用LZ4算法对代码段进行压缩
修复IAT时将函数地址换成一段shellcode实现对IAT的加密,该shellcode包含多个花指令,shellcode执行完之后调用原本函数
win10 64VS2017MyShellX86Release生成 运行库为多线程MT 禁用优化AddShellToolX86Debug生成
