转载 修改进程名

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

一、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);

}

其中,FindAndChangeUni和FindAndChangeA的作用是在一个字符串(UNICODE_STRING或CHAR)中定位“winmine.exe”并改成"winxxoo.exe"。代码如下:

//Fypher

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

VOID FindAndChangeUni(ULONG strAddr){

PUNICODE_STRING uniStr = (PUNICODE_STRING)strAddr;

ULONG len = uniStr->Length / 2;

ULONG maxLen = uniStr->MaximumLength / 2;

PWCHAR str = uniStr->Buffer;

ULONG i=0;

if(!str || len<11|| maxLen<11 )

return;

for(i=0;i<= len - 11;++i){

if(!_wcsnicmp(str+i,L"winmine.exe",11))

break;

}

if(i>len - 11)

return;

_asm{

cli

mov eax, cr0

and eax, not 0x10000

mov cr0, eax

}

//str可能是PEB中的,故try之

__try{

str[i+3]=L‘x‘;

str[i+4]=L‘x‘;

str[i+5]=L‘o‘;

str[i+6]=L‘o‘;

}__except(1){

}

_asm{

mov eax, cr0

or eax,0x10000

mov cr0,eax

sti

}

}

VOID FindAndChangeA(ULONG strAddr,ULONG len){

PUCHAR str = (PUCHAR)strAddr;

ULONG i=0;

if(!str || len<11 )

return;

for(i=0;i<= len - 11;++i){

if(!_strnicmp(str+i,"winmine.exe",11))

break;

}

if(i>len - 11)

return;

_asm{

cli

mov eax, cr0

and eax, not 0x10000

mov cr0, eax

}

//str可能是PEB中的,故try之

__try{

str[i+3]=‘x‘;

str[i+4]=‘x‘;

str[i+5]=‘o‘;

str[i+6]=‘o‘;

}__except(1){

}

_asm{

mov eax, cr0

or eax,0x10000

mov cr0,eax

sti

}

}

截图效果:

时间: 2024-11-03 22:40:02

转载 修改进程名的相关文章

正则化—Java中Split函数的用法技巧_(转载修改)

原文地址:http://www.cnblogs.com/liubiqu/archive/2008/08/14/1267867.html java.lang.string.split split 方法 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. stringObj.split([separator,[limit]]) 参数 stringObj 必选项.要被分解的 String 对象或文字.该对象不会被 split 方法修改. separator 可选项.字符串或 正则表达式对象,它

ListView 分页显示(转载+修改)下

通过实践发现,尚大大在判断”上一页“按钮和”下一页按钮“是否可用的地方,有问题: 原代码: public void checkButton(){ //索引值小于等于0,表示不能向前翻页了,以经到了第一页了. //将向前翻页的按钮设为不可用. if(index <=0){ btnLeft.setEnabled(false); } //值的长度减去前几页的长度,剩下的就是这一页的长度,如果这一页的长度比View_Count小,表示这是最后的一页了,后面在没有了. //将向后翻页的按钮设为不可用. e

(转载+ 修改) 深入理解UIWindow

转载于  http://www.cnblogs.com/smileEvday/archive/2012/11/16/UIWindow.html 每一个IOS程序都有一个UIWindow,在我们通过模板简历工程的时候,xcode会自动帮我们生成一个window,然后让它变成keyWindow并显示出来.这一切都来的那么自然,以至于我们大部分时候都忽略了自己也是可以创建UIWindow对象. 通常在我们需要自定义UIAlertView的时候(IOS 5.0以前AlertView的背景样式等都不能换)

转载 修改 Linux 内核 DM9000 支持 tiny210 开发板

错误现象: dm9000 dm9000: read wrong id 0x2b2a2928dm9000 dm9000: wrong id: 0x2b2a2928dm9000 dm9000: not found (-19). TCP cubic registeredNET: Registered protocol family 17Registering the dns_resolver key typeVFP support v0.3: implementor 41 architecture 3

Android为TV端助力:(转载)修改TextView字体样式

一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文就先介绍一下再 Android 下原生内置的一些字体的一些基本概念和使用. 需要注意的是,内置的一些字体只对英文有效. 二.Android 的默认字体 Android 系统默认使用的是一款叫做 Robote 的字体.Robote 本身就是 Google 自己的字体格式,Android 和 Chrom

linux Nginx安装(转载修改)

1.linux 下面安装 1.下载 pcre-8.10.tar.gz nginx-1.1.1.tar.gz 2.安装 pcre 让nginx支持rewrite pcre-8.10.tar.gz 上传到/home 目录下面 1) 解压 pcre tar zxvf pcre-8.10.tar.gz 解压 pcre 后 /home 下面会有 pcre-8.10 文件夹 2)配置pcre cd /home/ pcre-8.10 ./configure 输入该命令后屏幕会生成一堆文件,不用去管它 3)ma

修改Java程序的进程名

1.修改tomcat进程名字: 当同一个服务器上启动多个tomcat后,我们会在任务管理器中看见多个java.exe,当我们需要对某个tomcat进行监控时,却无法区分出该tomcat的进程,那么如何修改进程名呢? 可以使用端口号来区分不同的tomcat进程,使用netstat -nao | find "xxxx",xxxx是端口号,就可以找到所对应的进程.下面的方法可以直接修改tomcat的进程名为指定的名字,更便于辨认. 打开tomcat_home\bin\setclasspath

用python监控您的window服务

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.com/414605/782935 最近比较烦,研发给的pc服务版本在虚拟机上已经开始给客户使用了,服务老是莫名的死翘翘,客户不停的电话给我,搞的我心情很差,于是在一个下午,静下心来,用python写了个简单的监控进程的脚本,当发现进程消失的时候,立即调用服务,开启服务... 脚本的工作原理是这样的:脚本读取配置文件,读取预先配置好的调用系统

Android漫游记(6)---APP启动之旅(I)

Android基于Linux2.6+内核,我们看一张图,以对Android系统的架构有个感性的认识. 我们从Kernel层简单说明: 1.Kernel层:基于Linux2.6+内核,同时做了一些嵌入式环境做了一些针对性的优化调整. 2.Libraries层:包括Bionic C库,以及HAL(硬件驱动接口抽象)等API. 3.Android Runtime(ART)层:包含核心应用库和Dalvik虚拟机. 4.Application Framework层:纯JAVA的API框架,包括Activi