添加沙箱功能和API钩子支持
- 在沙箱中实现了新的功能,包括内存分配和API钩子初始化 - 更新了沙箱类,增加了对WFP引擎的支持 - 添加了多个API的实现,如GetLastError、InitializeCriticalSection等 - 修改了主函数以使用新的沙箱功能,替换了恶意软件扫描功能 - 更新了项目文件以包含新的源文件和API实现 - 改进了错误处理和日志记录功能
This commit is contained in:
@@ -2,6 +2,28 @@
|
||||
|
||||
#include "sandbox_callbacks.h"
|
||||
|
||||
// 在文件开头添加AllocateMemory函数的声明
|
||||
auto Sandbox::AllocateMemory(size_t size) -> uint64_t {
|
||||
// 使用一个简单的内存分配策略
|
||||
static uint64_t next_address = 0x60000000; // 起始地址
|
||||
uint64_t allocated_address = next_address;
|
||||
|
||||
// 对齐到4KB
|
||||
size = (size + 0xFFF) & ~0xFFF;
|
||||
|
||||
// 分配内存
|
||||
uc_err err = uc_mem_map(m_ucEngine, allocated_address, size, UC_PROT_ALL);
|
||||
if (err != UC_ERR_OK) {
|
||||
printf("[!] Failed to allocate memory at 0x%llx: %u\n",
|
||||
allocated_address, err);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 更新下一个可用地址
|
||||
next_address += size + 0x1000; // 添加一个页面的间隔
|
||||
return allocated_address;
|
||||
}
|
||||
|
||||
std::string getDllNameFromApiSetMap(const std::string& apiSet) {
|
||||
const std::wstring wApiSet(apiSet.begin(), apiSet.end());
|
||||
|
||||
@@ -174,9 +196,19 @@ class cFixImprot : public peconv::t_function_resolver {
|
||||
private:
|
||||
Sandbox* m_sandbox; // Sandbox实例的指针
|
||||
};
|
||||
Sandbox::Sandbox() {}
|
||||
Sandbox::Sandbox() {
|
||||
m_ucEngine = nullptr;
|
||||
m_peInfo = nullptr;
|
||||
m_nextWfpEngineHandle = (HANDLE)0x1000; // 初始化WFP引擎句柄
|
||||
}
|
||||
|
||||
Sandbox::~Sandbox() {
|
||||
// 清理WFP引擎资源
|
||||
for (auto& pair : m_wfpEngines) {
|
||||
delete pair.second;
|
||||
}
|
||||
m_wfpEngines.clear();
|
||||
|
||||
// 1. 先清理高层资源
|
||||
m_crossSectionExecution.clear();
|
||||
envStrings.clear();
|
||||
@@ -631,7 +663,7 @@ auto Sandbox::InitEnv(std::shared_ptr<BasicPeInfo> peInfo) -> void {
|
||||
InitCommandLine(peInfo->inputFilePath);
|
||||
}
|
||||
|
||||
auto Sandbox::Run() -> void {
|
||||
auto Sandbox::Run(uint64_t address) -> void {
|
||||
// 初始化堆栈
|
||||
uc_err err = uc_mem_map(m_ucEngine, m_stackBase, m_stackSize,
|
||||
UC_PROT_READ | UC_PROT_WRITE);
|
||||
@@ -659,7 +691,7 @@ auto Sandbox::Run() -> void {
|
||||
&rbp);
|
||||
|
||||
// 设置入口点
|
||||
uint64_t entryPoint = m_peInfo->RecImageBase + m_peInfo->entryPoint;
|
||||
uint64_t entryPoint = (m_peInfo->RecImageBase + m_peInfo->entryPoint);
|
||||
|
||||
// 添加钩子
|
||||
uc_hook hook_code, hook_mem, hook_mem_unmap, hook_mem_write, hook_syscall;
|
||||
@@ -708,7 +740,7 @@ auto Sandbox::Run() -> void {
|
||||
if (err != UC_ERR_OK) {
|
||||
throw std::runtime_error("Failed to add syscall hook");
|
||||
}
|
||||
|
||||
auto customIP = address;
|
||||
// 设置EIP/RIP
|
||||
err = uc_reg_write(m_ucEngine,
|
||||
m_peInfo->isX64 ? UC_X86_REG_RIP : UC_X86_REG_EIP,
|
||||
@@ -718,11 +750,26 @@ auto Sandbox::Run() -> void {
|
||||
}
|
||||
|
||||
InitApiHooks();
|
||||
|
||||
std::cout << "Starting execution at " << std::hex << entryPoint
|
||||
<< std::endl;
|
||||
uint64_t timeout = 60 * 1000 * 1000;
|
||||
// 1.入口点是必须跑的
|
||||
if (m_peInfo->isDll) {
|
||||
// 给rcx和rdx设置dll应该设置的
|
||||
auto dll_fdwReason = 1;
|
||||
uc_reg_write(m_ucEngine, UC_X86_REG_RCX, &m_peInfo->RecImageBase);
|
||||
uc_reg_write(m_ucEngine, UC_X86_REG_RDX, &dll_fdwReason);
|
||||
}
|
||||
err = uc_emu_start(m_ucEngine, entryPoint, m_peInfo->imageEnd, timeout, 0);
|
||||
std::cerr << "Emulation error: " << uc_strerror(err) << std::endl;
|
||||
// 2. 有自定义地址 再跑自定义地址
|
||||
std::cerr << "Entry Point Emulation error: " << uc_strerror(err)
|
||||
<< std::endl;
|
||||
if (address != 0) {
|
||||
err = uc_emu_start(m_ucEngine, address, m_peInfo->imageEnd, timeout, 0);
|
||||
std::cerr << "Custom Emulation error: " << uc_strerror(err)
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
auto Sandbox::GetEnvString() -> std::vector<wchar_t> {
|
||||
|
||||
Reference in New Issue
Block a user