rt;
   有一个办法是通过进程ID,取得文件,分析文件PE格式,取得其唯一性! 但由于本程序由sytem调起来的,没有权限去读取文件(这个文件对该用户没有设置访问权),所以这个方法基本通不过!
   只能通过PID,读取内存,然后取得一些相对唯一性标志,然后在各个OS上识别出相应的程序软件;
不知如何通过内存来实现!
   高分!....

解决方案 »

  1.   

    那么尝试读取该进程内存中的代码段(.text)的头部,也就是pe头了,应该可以。
      

  2.   

    通过ReadProcessMemory(),不过不知道有没有权限,你可以试试
      

  3.   

    如果是管理员的话,那么可以把程序提升为调试权限就可以openprocess()和ReadProcessMemory()了.
      

  4.   

    BOOL SetPrivilege(HANDLE handle) //本函数用于提升权限,提升到SE_DEBUG_NAME

    TOKEN_PRIVILEGES tkp; 
    HANDLE hToken; 
    if (!OpenProcessToken(handle,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) //打开当前进程失败 
    return FALSE; 
    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid); //查看当前权限
    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); //调整权限,如上设置
    return TRUE; 
    } DWORD ProcesstoPid(char *pid) //查找指定进程的PID(Process ID)
    {
    HANDLE hProcessSnap=NULL;
    char buffer[MAX_PATH];
    HANDLE cunterprocess=NULL;
    PROCESSENTRY32 pe32={0};
    int i;
    hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //打开进程快照
    if(hProcessSnap==(HANDLE)-1)
    {
    return 0;
    }
    pe32.dwSize=sizeof(PROCESSENTRY32);
    if(Process32First(hProcessSnap,&pe32)) //开始枚举进程
    {
    do
    {
    strcpy(buffer,pe32.szExeFile);
    for(i=strlen(buffer);i>0;i--) //截取进程名
    if(buffer[i]=='\\')
    break;
    if(!stricmp(pid,&buffer[i])) //判断是否和提供的进程名相等,是,返回进程的ID
    {
    cunterprocess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pe32.th32ProcessID);
    SetPrivilege(cunterprocess);
    return pe32.th32ProcessID;
    }
    }
    while(Process32Next(hProcessSnap,&pe32)); //继续枚举进程
    }
    else
    {
    return 0;
    }
    CloseHandle(hProcessSnap); //关闭系统进程快照的句柄
    return 0;
    }
      

  5.   

    就用这个去列遍然后提升权限再ReadProcessMemory判断
      

  6.   

    to: mythay(小黑) 
      读内存代码(.text)段? 不知道如何读取?to jacklzw88(不可爱咯) :
      ReadProcessMemory(), 不知道从何读取?读多少才能唯一性识别!
    我现在是这样做:
    MODULEINFO tmodinfo;
    if( GetModuleInformation(hProcess, hModule, &tmodinfo, sizeof(tmodinfo)) )
    {
        DWORD dwSize = 0;
        long tmpchar[4096/sizeof(long)];
        ReadProcessMemory(hProcess, tmodinfo.EntryPoint, tmpchar, sizeof(tmpchar), &dwSize);
    .....
    }读取前面4k,的内容,读取太多了,不知道有没有更好的办法? 我从tmodinfo.EntryPoint开始读取应该没有问题吧?
      

  7.   

    do
    {
    //在这里提升权限, //在这里读去, }
    while(Process32Next(hProcessSnap,&pe32)); //继续枚举进程
    读多少你就自己先输出看一下,多少能识别了就读多少
      

  8.   

    你可能理解错了,我意思是ReadProcessMemory(hProcess, tmodinfo.EntryPoint, tmpchar, sizeof(tmpchar), &dwSize);中的第二个参数,如何得到? 98与NT好像不同的!
    我用GetModuleInformation(hProcess, hModule, &tmodinfo, sizeof(tmodinfo))取得,但这个API在98中不支持的!
      

  9.   

    现在98不支持的很多了,不支持就不要了吧现在98微软都快不支持了,或者么你把这个dll打到你自己的包里去,动态去加载
      

  10.   

    关键是在Window98下, 动态LoadLibrary("psapi.dll")也调不起来的!
      

  11.   

    没有psapi.dll这个吗?没有psapi.dll这个你就自己释放一个下去。
      

  12.   

    放进去也不行的,这个DLL就是不支持在9x下被load.
      

  13.   

    是这样的,GetLastError() == 31Error Code: 31 A device attached to the system is not functioning.  ERROR_GEN_FAILURE