首页
社区
课程
招聘
[原创]一个Win7X64内核注入32位进程的例子
发表于: 2015-4-26 18:18 22679

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

2015-4-26 18:18
22679

这是前段时间完成的一个内核注入的代码, 没用采用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虚拟机测试没问题

近些天无聊在做一个网络防火墙, 搞定后放码,快完了.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (20)
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
抱歉,没仔细看。。。。。
2015-4-26 18:52
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还是谢谢LZ的辛勤劳动;我的观点有点直接,见谅。
2015-4-26 18:53
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
你把代码看完再喷啊。。。。都没见你下附件
2015-4-26 20:53
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
给大家带来的不适抱歉。
2015-4-26 22:30
0
雪    币: 2
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错~~
2015-4-27 00:20
0
雪    币: 202
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
凡是对看雪提供支持的朋友,我都会努力点个赞。。。
2015-4-28 16:20
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持,就是有大量硬编码..
2015-5-25 11:03
0
雪    币: 31
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
刚睡醒,占个楼...
2016-4-22 21:12
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
路过留个mark
2016-4-22 21:42
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
MARK
2016-5-16 15:36
0
雪    币: 39
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
小白请教?把什么注入了?shellcode?我想把dll注入怎么搞呀?
2016-5-16 22:53
0
雪    币: 441
活跃值: (1055)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
13
下来看看 多谢分享
2016-5-19 13:27
0
雪    币: 39
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
哥唉,怎样把shellcode改为注入dll?
2016-5-19 17:06
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
方法不错.就是.... 硬编码硬伤
2016-5-20 18:37
0
雪    币: 79
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持楼主,辛苦了
2016-5-23 14:10
0
雪    币: 79
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
UCHAR shellcode[] = {X,X,X,X,X}; 里面的内容是什么东东?如何添加一个动态库注入?
2016-5-23 15:11
0
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
666
2020-5-5 22:43
0
雪    币: 515
活跃值: (3272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem
19
777
2020-5-6 02:28
0
雪    币: 15
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
驱动中如何判断当前进程是32位还是64位呢.我记得有一个命令可以查询(不是ZwQueryInformationProcess)但忘了是什么了.
2020-5-8 11:37
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
硬编码是硬伤,亲测win7 64 虚拟机蓝屏
加载成功,启动进程的时候蓝屏
2020-6-9 01:10
0
游客
登录 | 注册 方可回帖
返回
//