技术编程|自动重构Meterpreter绕过杀软·续
前言
要与Windows操作系统进行交互 , 软件通常会从动态链接库(DLL)中导入函数 。这些函数往往以明文形式存在“导入表”中 , 杀毒软件通常会利用此功能来检测和推断恶意行为 。为此我们展示了混淆器的思路和实现 , 该混淆器允许重构任何C/C ++软件以消除此痕迹 , 我们研究的重点是Meterpreter 。源代码位于:https://github.com/scrt/avcleaner.
介绍
在先前的文章中 , 我们展示了如何在不使用正则表达式的情况下准确地替换源代码中的字符串 。目的是减少那些依靠静态签名的二进制和安全性软件的内存占用 。
然而 , 除了源代码本身中的字符串文字外 , 我们还可以静态地收集和分析许多其他的指纹 。在这篇文章中 , 我们将展示如何从二进制文件中手动隐藏API导入 , 然后自动执行C/C ++编写的软件 。
API导入问题
让我们编写并构建一个简单的C程序 , 执行该程序会弹出一个警告框:#include
【技术编程|自动重构Meterpreter绕过杀软·续】int main(int argc, char** argv) {MessageBox(NULL, "Test", "Something", MB_OK);return 0;}
然后 , 使用你喜欢的编译器进行编译 。在这里 , MinGW用于从macOS到Windows的跨版本编译:x86_64-w64-mingw32-gcc test.c -o /tmp/toto.exe
之后 , 可以使用rabin2(包含在radare2中)或者GNU的字符串处理工具strings列出字符串:205│ 2010x00003c92 0x00408692 78.idataasciistrncmp 206│ 2020x00003c9c 0x0040869c 89.idataasciivfprintf 207│ 2030x00003ca8 0x004086a8 1112.idataasciiMessageBoxA 208│ 2040x00003d10 0x00408710 1213.idataasciiKERNEL32.dll 209│ 2050x00003d84 0x00408784 1011.idataasciimsvcrt.dll 210│ 2060x00003d94 0x00408794 1011.idataasciiUSER32.dll...9557│ 9553 0x0004f481 0x00458e81 3031ascii.refptr.__native_startup_state9558│ 9554 0x0004f4a0 0x00458ea0 1112ascii__ImageBase9559│ 9555 0x0004f4ac 0x00458eac 1112asciiMessageBoxA9560│ 9556 0x0004f4b8 0x00458eb8 1213asciiGetLastError9561│ 9557 0x0004f4c5 0x00458ec5 1718ascii__imp_MessageBoxA9562│ 9558 0x0004f4d7 0x00458ed7 2324asciiGetSystemTimeAsFileTime9563│ 9559 0x0004f4ef 0x00458eef 2223asciimingw_initltssuo_force9564│ 9560 0x0004f506 0x00458f06 1920ascii__rt_psrelocs_start
从上面显示的控制台输出中可以明显看出 , 字符串MessageBoxA出现了3次 。这是因为此函数必须从User32.dll中导入(稍后会对此进行详细介绍) 。
当然 , 该字符串不容易引起反病毒人士的注意 , 但是对于以下API来说绝对会备受关注:
InternetReadFile
ShellExecute
CreateRemoteThread
OpenProcess
ReadProcessMemory
WriteProcessMemory
…
隐藏API导入
在继续之前 , 让我们简要介绍一下开发人员在Windows系统上调用外部库中函数的不同方法:加载时动态链接运行时动态链接加载时动态链接
这是解析外部库中函数的默认方法 , 并且实际上由链接程序自动处理 。在编译时 , 将应用程序链接到它依赖的每个动态链接库(DLL)的导入库(.lib) 。对于每个导入的函数 , 连接器会分别将对应条目写入关联DLL的IAT(导入地址表)中
启动应用程序后 , 操作系统将扫描IAT并映射进程地址空间中列出的所有库 , 并且每个导入函数的地址都将更新为指向DLL的导出地址表中的相应条目 。
本文插图
运行时动态链接
另一种方法是手动执行此操作 , 方法是先用LoadLibrary加载相应的库 , 然后用GetProcAddress解析函数的地址 。例如 , 可以修改前面的示例 , 使其依赖于运行时动态链接 。
推荐阅读
- 摄像头|小米截胡中兴屏下摄像头技术,小米研发还是供应链技术?
- AI人工智能|原创 智能门锁改造计划,德施曼小嘀全自动电子猫眼锁Q3M上线小米有品
- 马斯克|马斯克用活猪演示脑机接口技术:实时读取猪脑信息 心灵感应成真了
- 人工智能|济南将打造全球首个人工智能医药研发自动化实验室
- 三防|带你了解三防手持终端的秘密
- 第三|原创 小米发布第三代屏下相机技术,或将在Mix 4上首秀?
- 海信|首个新兴显示技术分标委成立 海信牵头制定国标
- 中年|Python编程语言有什么独特的优势呢?
- |马斯克用活猪演示脑机技术,他希望今年年底前能在人体内植入
- 智能家居|原创 智能门锁改造计划,德施曼小嘀全自动电子猫眼锁Q3M上线小米有品
