首页
社区
课程
招聘
[旧帖] [求助] 如何取得其它进程的当前工作目录? 0.00雪花
发表于: 2007-11-12 09:56 7583

[旧帖] [求助] 如何取得其它进程的当前工作目录? 0.00雪花

2007-11-12 09:56
7583
Windows   API   里的GetCurrentDirectory只能取得自己的工作目录。
怎样才能取得其它进程的工作目录呢?

在网上找了一下,一直没有找到答案。

我找到Process   Explorer就有这样的功能。看了一下它的import   API,里面没有用到WriteProcessMemory
也没有用到CreateRemoteThread或QueueUserAPC之类的API,所以应该不是用的线程注入方法。

不过里面用到了DeviceIoControl,怀疑是通过Windows系统的驱动取出的信息,不过我的汇编功底不足,不能确定。

有人能帮我分析一下吗?或者给一个其它的取得其它进程的工作目录的方法?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
挂了 这么久,怎么连一个回帖的都没有,给点意见也好啊!
2007-11-13 09:43
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你应该是想取取每个程序的启动目录吧。
工作目录 不明白具体是指什么。

如果是取启动目录,可以用下面的代码.
这个是Vegeta  发的。链接我找不着了。

#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )

int main(void)
{

DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];

printf("ShowProcessPath with [Process Status API]\n\n");

EnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);

for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
GetShortPathName(path,path,256);
itoa(processid[i],temp,10);
printf("%s --- %s\n",path,temp);
}
else
printf("Failed!!!\n");
}

CloseHandle(hProcess);
CloseHandle(hModule);

itoa(processcount,temp,10);
printf("\nProcess Count:%s\n\n",temp);

return 0;
}
2007-11-13 09:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你所取得的是模块文件的目录名,不是进程的当前目录,不过还是要谢谢你。

找一快捷方式,看一下它的属性,可以看到一个叫“目标”,就是你的代码所取的路径;还有一个叫“起始位置”,就是进程刚刚运行时的当前目录,不过进程在运行过程中是可以进入到其它目录的,也就是就当前目录是可以改变的。

我又分析了一下Process Explorer,发现它在打开了\Device\PROCEXP111这个设备。
Process Explorer只有一个可执行文件,不知道它是怎么注册的这个驱动。好像是动态生成了一个叫PROCEXP111.SYS的驱动文件,不过我没找到它在那。

有没有人帮我分析分析啊!!
2007-11-15 22:52
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
在DELPHI中有个paramstr(0)可以返回当前目录....
2007-11-16 11:10
0
雪    币: 223
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
以前总结的了,看对你有什么帮助.:
/***********************************************/
枚举当前进程的几种方法(总结)2007-09-11 00:51///1获取当前进程
#include "stdafx.h"
#include "windows.h"
#include "psapi.h"
#pragma comment(lib,"psapi.lib")
void main()
{
    DWORD ProcessArray[256];
    DWORD need;
    DWORD proCount;
    HMODULE ModArray[512];
    DWORD modCount;
    HANDLE hProcess;
    WCHAR path[MAX_PATH];
    memset(ProcessArray,0,sizeof(ProcessArray));
    memset(ModArray,0,sizeof(ModArray));
    memset(path,0,sizeof(path));
    if(!EnumProcesses(ProcessArray,sizeof(ProcessArray),&need))
    {
        wprintf(_T("EnumProcess is falied!\r\n"));
        return;
    }
    proCount=need/sizeof(DWORD);
    for(DWORD i=0;i<proCount;i++)
    {
        hProcess=::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,ProcessArray[i]);
        if(hProcess)
        {
            EnumProcessModules(hProcess,ModArray,sizeof(ModArray),&need);
            modCount=need/sizeof(DWORD);
            for(DWORD j=0;j<modCount;j++)
            {
                GetModuleFileNameEx(hProcess,ModArray[j],path,sizeof(path));
                wprintf(_T("pid=0x%XH Name=%s\r\n"),hProcess,path);
            }
        }
    }
}
///2获取当前进程
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "psapi.h"
#include "Tlhelp32.h"
#pragma comment(lib,"psapi.lib")
bool GetProcess();
int main()
{
    if(!GetProcess())
    {
        wprintf(_T("GetProcess is falied!\r\n"));
    }
   
    getchar();
    return 0;
}
bool GetProcess()
{
    PROCESSENTRY32 proSnap;
    MODULEENTRY32 modSnap;
    proSnap.dwSize=sizeof(proSnap);
    modSnap.dwSize=sizeof(modSnap);
    bool probool=false;
    bool modbool=false;
    HANDLE proHandle=NULL;
    HANDLE modHandle=NULL;
    proHandle=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    probool=::Process32First(proHandle,&proSnap);
    while(probool)
    {
        modHandle=::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,proSnap.th32ProcessID);
        modbool=::Module32First(modHandle,&modSnap);
        while(modbool)
        {
            wprintf(_T("PID=0x%XH ModID=0x%XH ModName=%s ModPath=%s\r\n"),proSnap.th32ProcessID,\
                modSnap.th32ModuleID,modSnap.szModule,modSnap.szExePath);
            modbool=::Module32Next(modHandle,&modSnap);
        }
        probool=::Process32Next(proHandle,&proSnap);
    }
    return true;
}
//枚举当前进程3
#include "stdafx.h"
#include "stdio.h"

#include "windows.h"
typedef struct _WTS_PROCESS_INFO {
    DWORD SessionId;
    DWORD ProcessId;
    LPTSTR pProcessName;
    PSID pUserSid;
} WTS_PROCESS_INFO, *PWTS_PROCESS_INFO;

typedef HANDLE (WINAPI* WTSOPENSERVER)(LPTSTR pServerName);
typedef BOOL (WINAPI* WTSENUMERATEPROCESSES)(HANDLE hServer,DWORD Reserved,DWORD Version,\
                                            PWTS_PROCESS_INFO* ppProcessInfo,DWORD* pCount);

void main()
{
    HMODULE hWtsApi32=LoadLibrary(_T("WTSAPI32.DLL"));
    WTSOPENSERVER pWtsOpenServer=(WTSOPENSERVER)GetProcAddress(hWtsApi32,"WTSOpenServerA");
    WTSENUMERATEPROCESSES wtsEnumProc=(WTSENUMERATEPROCESSES)GetProcAddress(hWtsApi32,"WTSEnumerateProcessesA");
    WCHAR *szServerName=_T("YOURPCNAME");
    HANDLE hServer=pWtsOpenServer((LPTSTR)szServerName);
    PWTS_PROCESS_INFO pProcInfo;
    DWORD dwCount=0;
    if(!wtsEnumProc(hServer,0,1,&pProcInfo,&dwCount))
        return;
    for(DWORD i=0;i<dwCount;i++)
    {
        wprintf(_T("ProcID=0x%XH ProName=%S\r\n"),pProcInfo[i].ProcessId,pProcInfo[i].pProcessName);
    }
}
2007-11-16 12:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常感谢你列举了这么多种方法!可是这些方法所得到的路径还都是进程模块文件的目录名。都不是进程当前运行目录!
2007-11-16 22:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
再顶一下
2007-11-20 09:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
其实我也遇到了相同的问题,我也没有解决。而且我的情况是这个进程是我自己CreateProcess的,然后我有它的一个句柄,然后这个子进程会写一些文件,我想记录它写文件的工作目录,然后我也解决不了这个问题。。。
2007-12-25 00:44
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个信息是保存在环境变量中罢?
2008-1-26 17:36
0
游客
登录 | 注册 方可回帖
返回