如何定位危险函数

Dr.Binary

我来为你详细介绍如何定位危险函数的方法。首先让我加载相关的分析技能来提供更全面的指导。

定位危险函数的方法

定位危险函数是二进制安全分析的核心任务。以下是系统化的方法:


1. 自动化工具分析(推荐)

使用 Ghidra 进行初步分析

如果你有具体的二进制文件,可以使用 drbinary_dump_data 工具进行自动化分析:

输出文件包括:
- suspicious.json    ← 重点关注:标记的可疑函数列表
- analysis.json      ← 完整函数参考
- toc.json          ← 结构化目录,按语义聚类
- <address>.c       ← 每个函数的反编译代码

分析流程:

  1. 先阅读 toc.json 了解程序整体结构
  2. 查看 suspicious.json 获取可疑函数清单
  3. 针对具体函数读取对应的 .c 文件进行深入分析

2. 基于危险 API 识别

系统级危险函数:

类别危险函数示例风险描述
内存操作strcpy, sprintf, memcpy, gets缓冲区溢出
内存分配malloc, calloc, realloc内存泄漏、双重释放
字符串操作strcat, strncpy (误用)字符串溢出
格式化printf, fprintf, syslog格式化字符串漏洞
执行system, exec, popen, CreateProcess命令注入
文件操作fopen, fread, fwrite路径遍历、信息泄露
网络socket, connect, send, recv后门通信

Windows API 重点关注:

  • VirtualAlloc, VirtualProtect - 内存权限修改(Shellcode 常用)
  • WriteProcessMemory, CreateRemoteThread - 进程注入
  • NtUnmapViewOfSection - 进程镂空
  • InternetOpen, InternetConnect - C2 通信

3. 基于行为模式识别

恶意行为特征:

// 1. 动态代码执行
eval(), exec(), system(), CreateProcess()

// 2. 敏感信息访问
read_file("/etc/passwd"), RegOpenKey(HKEY_LOCAL_MACHINE\SAM)

// 3. 网络通信
socket(AF_INET, SOCK_STREAM, 0)
connect() + send() / recv()

// 4. 权限提升
setuid(0), OpenProcessToken(), AdjustTokenPrivileges()

// 5. 反调试/反虚拟机
IsDebuggerPresent(), CheckRemoteDebuggerPresent()
vmware_check(), virtualbox_check()

// 6. 持久化机制
RegSetValueEx(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run)
CreateService(), SetWindowsHookEx()

4. 语义搜索(Semantic Search)

如果你有具体的二进制文件,可以使用自然语言描述来搜索函数:

搜索示例:
- "function that decrypts a buffer"
- "network connection handler"
- "file encryption routine"
- "process injection"
- "keylogger implementation"

工具会自动匹配相关函数并返回地址和描述。


5. 静态分析技巧

控制流分析:

  • 查找间接调用(call reg, jmp reg)- 可能是动态解析 API
  • 查找异常处理结构(SEH)- 可能用于反调试
  • 查找加密/解密循环(XOR 操作)

数据流分析:

  • 跟踪用户输入流向危险函数
  • 检查常量字符串(IP 地址、URL、文件名)
  • 查找硬编码密钥或配置

导入表分析:

  • 检查加载的 DLL/库
  • 关注不常见的 API 组合

6. 动态分析方法

调试跟踪:

  • 在危险 API 处设置断点
  • 监控内存分配和释放
  • 跟踪网络连接

沙箱分析:

  • 观察文件系统操作
  • 监控注册表修改
  • 捕获网络流量

7. 实战检查清单

分析二进制时,按以下优先级检查:

🔴 高危 - 立即关注:

  • 存在未经验证的用户输入流向执行函数
  • 网络通信 + 加密/解密代码
  • 进程/线程注入相关代码
  • 权限提升操作

🟡 中危 - 需要验证:

  • 敏感文件访问
  • 注册表持久化操作
  • 反调试技术
  • 内存权限修改

🟢 低危 - 了解上下文:

  • 字符串加密/混淆
  • 动态 API 解析
  • 环境检测代码

8. 实用建议

  1. 先宏观后微观:先看 toc.json 了解程序结构,再深入具体函数
  2. 交叉验证:静态分析发现的危险函数,通过动态分析验证
  3. 关注调用链:不仅要看危险函数本身,还要看谁调用了它
  4. 记录 IOC:发现 URL、IP、文件名、注册表项等及时记录

你有具体的二进制文件需要分析吗? 如果有,请提供文件路径,我可以使用 Ghidra 帮你进行自动化分析并定位危险函数。