关于ark取得进程的镜像文件路径

最近看到一个trojan把自己拷到回收站里隐藏,然后发现我两万年前写的ark取得的进程路径还是原路径。。。

突然想起来很久以前看到某群的讨论



 拿破伦19:22:03

话说,一个运行中的文件,然后移动他到其他目录~~

拿破伦19:22:33

有些检测他的路径会变成新的目录

KKindOf 19:23:05

丫的,这是面试题吧

DRL不爱天使 19:23:06

DRL不爱天使 19:23:32

你说的是Win7么

拿破伦 19:23:43

恩啊

DRL不爱天使 19:23:59

XP就不会

拿破伦 19:24:16

我在g盘根目录下运行的

DRL不爱天使 19:24:50

7的文件管理很优越

拿破伦 19:24:53

为啥win7可以了

拿破伦 19:25:06

这个能用来干坏事不

拿破伦 19:25:16

移动一个被占用的文件感觉。。。

DRL不爱天使 19:25:36

不知道 我是好人

DRL不爱天使 19:25:40

拿破伦 19:26:30

是啊,移动不会提示被占用。。。这个没想通

KKindOf 19:27:00

干啥,如果独占的就不能移动了

拿破伦 19:27:28

这个是程序打开,不知道怎么设置独占啊

KKindOf 19:35:10 

你就是说运行了后,然后就移动,这样别人扫描进程列表就扫不出正确的路径? 

拿破伦 19:35:21 

嗯 

宁妖01 19:35:34 

额 

拿破伦 19:35:35 

启动是的路径不对了 

=======================================================================================================

其实xp和win7下都是可以的,已经跑起来的进程,他的可执行文件只要在当前盘符下,随便移动。移动之后任务管理器可能会得不到进程已经变更的可执行文件名。




进程的文件名更改之后 eprocess的UCHAR ImageFileName[16];不会更新。SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;也不会主动更新

 

网上比较多的代码是找 eprocess → SectionObject. _SEGMENT_OBJECT →_SEGMENT→_CONTROL_AREA→_FILE_OBJECT

 

然后从 _FILE_OBJECT的filename结合RtlVolumeDeviceToDosName去取路径

 

一般情况下是ok的。但当进程运行起来之后,如果对镜像文件重命名,这时候再从_FILE_OBJECT的filename去取路径就只有原路径了

 

得到更改后路径的方法是得到FILE_OBJECT之后去调ObQueryNameString,(也可以自己实现ObQueryNameString,直接发irp)

 

详见NtQueryInformationProcess的实现


代码完全远程。 可以在XP WIN7 WIN764 WIN2003 等操作系统上成功实现修改进程路径。 已经封装成类,使用及其方便。 部分代码: 头文件: #ifndef ModifyProcessPath_h__ #define ModifyProcessPath_h__ // 结构定义 typedef struct _PROCESS_BASIC_INFORMATION { DWORD ExitStatus; ULONG PebBaseAddress; ULONG AffinityMask; LONG BasePriority; ULONG UniqueProcessId; ULONG InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; // API声明 typedef LONG (__stdcall *PZWQUERYINFORMATIONPROCESS) ( HANDLE ProcessHandle, ULONG ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ); class CModifyProcessPath { public: CModifyProcessPath(); BOOL Create(); BOOL ModifyProcessPath(LPCTSTR szPath); BOOL CamouflageExplorerPath(); }; #endif // ModifyProcessPath_h__ CPP部分代码: #include "StdAfx.h" #include "ModifyProcessPath.h" namespace MODIFY_PROCESS { wchar_t m_szModulePath[MAX_PATH]; DWORD dwGetModuleFileNameWAddress; DWORD dwModuleBaseAddress; //E9 (目标地址-当前地址 - 5) #pragma pack(1) typedef struct _JMPCODE { BYTE bJmp; DWORD dwAddr; }JMPCODE,*LPJMPCODE; #pragma pack() DWORD WINAPI MGetModuleFileNameW(HMODULE hModule,wchar_t * lpFilename,DWORD nSize); }; using namespace MODIFY_PROCESS; // 为了不影响在进程内使用 GetModuleFileNameW ,故hook之,返回正确的路径。 DWORD WINAPI MODIFY_PROCESS::MGetModuleFileNameW(HMODULE hModule,wchar_t * lpFilename,DWORD nSize) { typedef DWORD(WINAPI *MGetModuleFileNameWT)(HMODULE,LPWCH,DWORD); MGetModuleFileNameWT pMGetModuleFileNameW; pMGetModuleFileNameW = (MGetModuleFileNameWT)dwGetModuleFileNameWAddress; if(hModule == NULL || hModule ==(HMODULE)MODIFY_PROCESS::dwModuleBaseAddress) { StringCbCopyW(lpFilename,nSize,m_szModulePath); return wcslen(m_szModulePath); } return pMGetModuleFileNameW(hModule,lpFilename,nSize); } CModifyProcessPath::CModifyProcessPath() { } BOOL CModifyProcessPath::Create() { ZeroMemory(MODIFY_PROCESS::m_szModulePath,sizeof(MODIFY_PROCESS::m_szModulePath)); MODIFY_PROCESS::dwGet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值