欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]一个Win7X64内核注入32位进程的例子

[原创]一个Win7X64内核注入32位进程的例子

这是前段时间完成的一个内核注入的代码, 没用采用APC,无线程,无dll,启动时注入。
读取C:\\process.txt, process.txt存放需注入的进程名, 一行一个.
原理是在注册模块回调"\\WINDOWS\\SysWOW64\\KernelBase.dll"的时候修改已经被读入内存的OEP转入shellcode中,运行后再跳回去. 简单易懂. 也没有什么技术含量
之所以选择\\WINDOWS\\SysWOW64\\KernelBase.dll是因为SysWOW64中的DLL只有32位进程才会加载,这样就不需要判断是否是32位进程了。选择KernelBase.dll则是一个模块加载时机问题。其他一些dll加载时机都比较早了. 读取一些信息不太方便, 连PEB都没初始化完。
在修改内存中OEP时为了方便,X64TrapFrame都是用的硬编码,都是临时调试出来的。
因为在加载KernelBase.dll时, 内存中存放入口地址的指针位于RSI+0x7B0,通过直接修改这个值达到目的
//修改读入内存的OEP
PULONGLONG WriteOEP(PEPROCESS curProc, PULONGLONG pBuf)
{
    PEPROCESS proc = curProc;
    PETHREAD pThread = NULL;
    PULONGLONG pX64TrapFrame, pRsi, pRet, pOEP;
    NTSTATUS status;
    
    //获得KTHREAD
    pRet = ((ULONGLONG)curProc+0x308);
    pThread = *pRet - 0x420;
    //获得KTRAP_FRAME结构
    pX64TrapFrame = (ULONGLONG)pThread + 0x1d8;
  
    //获得pRsi寄存器
    pRsi = *pX64TrapFrame + 0x150;
    
    //获得OEP
    pRsi = *pRsi + 0x7B0;
    pOEP = *pRsi;
    *pRsi = pBuf;
    //写入shellcode+0x240
    //mov eax, 0x00000000
    //jmp eax
    RtlCopyMemory( (PUCHAR)pBuf+240, &pOEP, 4 );
    return pOEP;
}
自己看吧。可注释掉文件判断测试注入所有32位进程,Win7X64虚拟机测试没问题
近些天无聊在做一个网络防火墙, 搞定后放码,快完了.

上传的附件 KernelInject.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功