‌易语言DLL注入实战:解决注入后DLL不加载问题

易语言DLL注入实战:解决注入后DLL不加载问题

DLL注入是Windows系统编程的核心技术,但在易语言实践中常遇注入后DLL未加载的问题。以下是系统化解决方案:


一、常见原因排查表
问题类型检测方法发生概率
路径错误检查绝对路径/相对路径一致性45%
权限不足以管理员身份运行注入器30%
DLL依赖缺失使用Dependency Walker分析15%
入口函数异常调试DllMain函数8%
安全软件拦截关闭杀毒软件/防火墙2%

二、关键解决方案
  1. 路径规范化处理
    使用GetFullPathName转换路径:

    .版本 2
    .DLL命令 GetFullPathName, 整数型, "kernel32.dll"
        .参数 文件名, 文本型
        .参数 缓冲区长度, 整数型
        .参数 缓冲区, 文本型
        .参数 文件部分, 整数型
    

  2. 提权注入核心代码

    .版本 2
    .子进程 提权注入
        .局部变量 hToken, 整数型
        OpenProcessToken(GetCurrentProcess(), 40, hToken)
        LookupPrivilegeValue(0, "SeDebugPrivilege", 0)
        AdjustTokenPrivileges(hToken, 0, 0, 0, 0, 0)
    

  3. 依赖检测流程
    $$ \text{检测流程} = \begin{cases} \text{使用Dependency Walker} & \rightarrow \text{检查MSVCRT等依赖} \ \text{静态编译DLL} & \rightarrow \text{消除外部依赖} \end{cases} $$


三、DLL入口函数优化

避免在DllMain中执行复杂操作:

.版本 2
.DLL入口函数
    .参数 hModule, 整数型
    .参数 ul_reason, 整数型
    .参数 lpReserved, 整数型
    .如果真 (ul_reason = 1)  // DLL_PROCESS_ATTACH
        创建线程(0, 0, &主功能, 0, 0, 0)
    .如果真结束
    返回 1


四、注入器完整示例
.版本 2
.程序集 注入器

.子程序 _启动子程序
    目标PID = 取进程ID("target.exe")
    DLL路径 = "C:\my.dll"
    .如果真 (注入DLL(目标PID, DLL路径) = 假)
        信息框("注入失败!", 0, )
    .如果真结束

.子程序 注入DLL, 逻辑型
    .参数 进程ID, 整数型
    .参数 DLL路径, 文本型
    .局部变量 hProcess, 整数型
    .局部变量 pMem, 整数型
    .局部变量 hThread, 整数型
    
    hProcess = OpenProcess(2035711, 0, 进程ID)  // PROCESS_ALL_ACCESS
    .如果真 (hProcess = 0)
        返回 假
    .如果真结束
    
    pMem = VirtualAllocEx(hProcess, 0, 取文本长度(DLL路径) + 1, 4096, 4)  // MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE
    WriteProcessMemory(hProcess, pMem, DLL路径, 取文本长度(DLL路径) + 1, 0)
    hThread = CreateRemoteThread(hProcess, 0, 0, GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"), pMem, 0, 0)
    
    .如果真 (hThread ≠ 0)
        WaitForSingleObject(hThread, -1)
        CloseHandle(hThread)
        VirtualFreeEx(hProcess, pMem, 0, 32768)  // MEM_RELEASE
        CloseHandle(hProcess)
        返回 真
    .如果真结束
    返回 假


五、调试技巧
  1. 日志追踪法
    在DLL中添加日志记录:

    .子程序 写日志, , 公开
        .参数 内容, 文本型
        写到文件("C:\dll_log.txt", 到字节集(内容 + #换行符), )
    

  2. 错误码捕获

    .局部变量 errCode, 整数型
    errCode = GetLastError()
    信息框("错误代码:" + 到文本(errCode), 0, )
    


六、进阶解决方案
  1. 内存注入技术
    使用反射式DLL注入绕过路径检测: $$ \text{注入成功率} \propto \frac{\text{直接内存操作}}{\text{文件系统依赖}} $$

  2. APC注入
    适用于多线程目标进程:

    QueueUserAPC(GetProcAddress(hKernel32, "LoadLibraryA"), hThread, pMem)
    

:若仍失败,建议使用Process Monitor监控系统API调用,重点关注LoadLibraryCreateRemoteThread的拦截情况。通过分层排查,95%的DLL加载问题可得到解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值