首页
社区
课程
招聘
[分享]彻底改掉进程名
发表于: 2009-8-24 19:14 19913

[分享]彻底改掉进程名

2009-8-24 19:14
19913

写了个改进程名的东西,跟大家分享!技术含量不高,大牛飘过。

先总结一下,一个进程的名字有可能从以下部位获取(参考小伟同学的《伪造进程初探》一文):

一、EPROCESS中:
    1、EPROCESS-->ImageFileName(很常用,冰刃获取进程名的地方)
    2、EPROCESS-->SeAuditProcessCreationInfo->ImageFileName(任务管理器获取进程名的地方,NtQueryInformationProcess就是从这里获取进程名的)
    3、EPROCESS->SectionObject->Segment->ControlArea->FileObject->FileName(RKU获取进程名的方法)
    4、VAD(记录用户空间内存分配情况的数据结构,里面当然有进程的exe模块)
二、PEB中:
    1、PEB-->ProcessParameters-->ImagePathName
    2、PEB-->ProcessParameters-->CommandLine
    3、PEB-->ProcessParameters-->WindowTitle(这个地方比较奇怪,如果双击的是exe的快捷方式,则记录的是快捷方式的路径,还是一并改掉的好)
    4、PEB-->LDR-->InLoadOrderModuleList->第一个结构->FullDllName
    5、PEB-->LDR-->InLoadOrderModuleList->第一个结构->BaseDllName
    6、PEB-->LDR-->InMemoryOrderModuleList->第一个结构->FullDllName(此处的BaseDllName貌似为NULL,就不管它了)
    (PEB-->LDR-->InInitializationOrderModuleList这个表里貌似没有exe模块,也不管它了)

把这些地方都改掉即可彻底改掉进程名(如果不够彻底,谢谢补充!)。

示例代码如下(示例代码中以winmine.exe做测试,平台为XP SP3。代码中硬编码很多,通用性不强。囧):

//Fypher 
//http://hi.baidu.com/nmn714

VOID ChangeName(ULONG pProcess){
    ULONG peb,ProcessParameters,ldr;
    ULONG InLoadOrderModuleList;
    ULONG InMemoryOrderModuleList;
    ULONG tmp;

    KAPC_STATE kapc;
    PUCHAR str;
    PWCHAR wstr;
    
    //get PEB
    peb=*(PULONG)(pProcess + 0x1b0);
    
    KeStackAttachProcess((PEPROCESS)pProcess,&kapc);
    __try{
        ProcessParameters = *(PULONG)(peb + 0x010);

        //ImagePathName
        FindAndChangeUni(ProcessParameters+0x038);

        //CommandLine
        FindAndChangeUni(ProcessParameters+0x040);

        //WindowTitle
        FindAndChangeUni(ProcessParameters+0x070);

        //Ldr
        ldr = *(PULONG)(peb + 0x00c);

        //InLoadOrderModuleList->FullDllName
        InLoadOrderModuleList = *(PULONG)(ldr+0x00c);
        FindAndChangeUni(InLoadOrderModuleList+0x024);

        //InLoadOrderModuleList->BaseDllName
        FindAndChangeUni(InLoadOrderModuleList+0x02c);

        //InMemoryOrderModuleList->FullDllName
        InMemoryOrderModuleList = *(PULONG)(ldr+0x014);
        FindAndChangeUni(InMemoryOrderModuleList+0x024);
    }__except(1){
        KdPrint(("exception occured!"));
    }
    KeUnstackDetachProcess (&kapc);

    //EPROCESS-->ImageFileName
    FindAndChangeA(pProcess+0x174,16);

    //EPROCESS-->SeAuditProcessCreationInfo->ImageFileName
    FindAndChangeUni(*(PULONG)(pProcess + 0x1F4));

    //EPROCESS->SectionObject->Segment->ControlArea->FileObject->FileName
    //should use MmIsAddressValid to verify
    tmp=*(PULONG)(pProcess+0x138);
    tmp=*(PULONG)(tmp+0x14);
    tmp=*(PULONG)tmp;
    tmp=*(PULONG)(tmp+0x024);
    FindAndChangeUni(tmp+0x030);
    
    //VAD
    //should use MmIsAddressValid to verify
    tmp=*(PULONG)(pProcess+0x11c);
    tmp=*(PULONG)(tmp+0x10);
    tmp=*(PULONG)(tmp+0x018);
    tmp=*(PULONG)(tmp+0x024);
    FindAndChangeUni(tmp+0x030);
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 8
支持
分享
最新回复 (13)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
呵呵,谢谢分享,总结的不错~~~~
2009-8-24 20:07
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
记得很久以前玩Cain的时候,只会放到系统目录然后改个名字~自己写的XX东西根本不用进程
2009-8-24 20:15
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
方法3和4其实是同一个ControlArea,也就是同一个FileObject,改一处就行了~
2009-8-24 20:17
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
原来如此!学习了!
2009-8-24 20:35
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
6
hook 进程创建,记录Eprocess,随便你怎么改!我都知道你的完整路径
2009-8-24 21:11
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顶一下
   
6、PEB-->LDR-->InMemoryOrderModuleList->第一个结构->FullDllName

这个有点问题,exe不一定是所有模块中虚拟地址最小的,所以不一定在排在最前面
我的理解是每个模块都只有一项LDR_DATA_TABLE_ENTRY,只不过被链入3个链表,所以没必要重复查找
另外我从wrk上看到,关中断时发生缺页是直接蓝屏的,其他的操作系统不清楚,不过可以测试一下
2009-8-24 21:36
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
同楼上,Ldr有三个链,但每个模块只有一个LDR_DATA_TABLE_ENTRY结构
2009-8-24 22:08
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
9
但是InLoadOrderModuleList的第一个结构和InMemoryOrderModuleList的第一个结构不一样。

InLoadOrderModuleList的第一个结构的FullDllName记载了全路径,BaseDllName记载了进程名。而InMemoryOrderModuleList的第一个结构的FullDllName记载了进程名,BaseDllName为NULL。

看来还是遍历一遍比较彻底
2009-8-24 23:06
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
从名字就可以看出来,在每一个链表里的顺序是不一样的
2009-8-25 06:45
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
三个链的差别就在于顺序,Order~
2009-8-25 07:30
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了,貌似很强大
2009-8-25 12:11
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
13
我貌似看到很多硬编码了
2009-8-25 19:29
0
雪    币: 13
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
求一个能支持win64的代码。
2018-7-9 23:19
0
游客
登录 | 注册 方可回帖
返回
//