• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            How to Get Full Path In SYS

            Posted on 2009-10-29 12:13 S.l.e!ep.¢% 閱讀(310) 評(píng)論(0)  編輯 收藏 引用 所屬分類: RootKit
            [轉(zhuǎn)載]如何在驅(qū)動(dòng)程序(SYS)中得到當(dāng)前進(jìn)程的完整路徑和進(jìn)程名?
            2009-02-09 13:07

            首先利用PsGetCurrentProcess或IoGetCurrentProcess函數(shù)得到當(dāng)前進(jìn)程的句柄,這個(gè)句柄是指向_EPROCESS結(jié)構(gòu)的指針,_EPROCESS的結(jié)構(gòu)如下:

            typedef struct _EPROCESS
            {
            KPROCESS Pcb;
            NTSTATUS ExitStatus;
            KEVENT LockEvent;
            DWORD LockCount;
            QWORD CreateTime;
            QWORD ExitTime;
            PVOID LockOwner;
            DWORD UniqueProcessId;
            QWORD ActiveProcessLinks;
            DWORD QuotaPeakPoolUsage [2]; // NP, P
            DWORD QuotaPoolUsage [2]; // NP, P
            DWORD PagefileUsage;
            DWORD CommitCharge;
            DWORD PeakPagefileUsage;
            DWORD PeakVirtualSize;
            QWORD VirtualSize;
            DWORD Vm [12];
            DWORD LastProtoPteFault;
            DWORD DebugPort;
            DWORD ExceptionPort;
            DWORD ObjectTable;
            DWORD Token;
            DWORD WorkingSetLock [8];
            DWORD WorkingSetPage;
            BOOLEAN ProcessOutswapEnabled;
            BOOLEAN ProcessOutswapped;
            BOOLEAN AddressSpaceInitialized;
            BOOLEAN AddressSpaceDeleted;
            DWORD AddressCreationLock [9];
            DWORD ForkInProgress;
            DWORD VmOperation;
            DWORD VmOperationEvent;
            DWORD PageDirectoryPte;
            QWORD LastFaultCount;
            PVOID VadRoot;
            DWORD VadHint;
            DWORD CloneRoot;
            DWORD NumberOfPrivatePages;
            DWORD NumberOfLockedPages;
            WORD w184;
            BOOLEAN ExitProcessCalled;
            BOOLEAN CreateProcessReported;
            HANDLE SectionHandle;
            struct _PEB *Peb; // offset 0x1B0
            PVOID SectionBaseAddress;
            PVOID QuotaBlock;
            NTSTATUS LastThreadExitStatus;
            PROCESS_WS_WATCH_INFORMATION WorkingSetWatch;
            DWORD InheritedFromUniqueProcessId;
            ACCESS_MASK GrantedAccess;
            DWORD DefaultHardErrorProcessing;
            DWORD LdtInformation;
            DWORD VadFreeHint;
            DWORD VdmObjects;
            KMUTANT ProcessMutant;
            BYTE ImageFileName [16]; // offset 0x1FC
            DWORD VmTrimFaultValue [2];
            PVOID Win32Process;
            DWORD d1F8;
            DWORD d1FC;
            }
            EPROCESS,
            * PEPROCESS,
            **PPEPROCESS;

            從上面這個(gè)結(jié)構(gòu)可以看出,進(jìn)程名稱就是ImageFileName,只要用_EPROCESS的基地址加上偏移地址0x1FC就可以得到進(jìn)程名稱的地址,代碼如下:

            char *ProcessName = (char*)PsGetCurrentProcess() + 0x1FC;
            KdPrint((“Current Process Name: %s\n”, ProcessName));

            要得到完整路徑還需要利用_EPROCESS結(jié)構(gòu)中的_PEB結(jié)構(gòu)指針來得到ProcessParameters的地址。ProcessParameters保存著進(jìn)程的完整路徑。可以通過DDK附帶的WinDbg工具打開一個(gè)可執(zhí)行程序,然后用!peb命令來顯示_PEB的結(jié)構(gòu)信息。如下所示:

            ———————————————————————————————————————
            > !peb
            Debugger extension library [F:\WINNT\system32\ntsdexts] loaded
            PEB at 7FFDF000
            InheritedAddressSpace: No
            ReadImageFileExecOptions: No
            BeingDebugged: Yes
            ImageBaseAddress: 00400000
            Ldr.Initialized: Yes
            Ldr.InInitializationOrderModuleList: 131f88 . 132998
            Ldr.InLoadOrderModuleList: 131ee0 . 132988
            Ldr.InMemoryOrderModuleList: 131ee8 . 132990
            00400000 D:\NtSysInfo.exe
            77F80000 F:\WINNT\System32\ntdll.dll
            77E60000 F:\WINNT\system32\KERNEL32.dll
            77DF0000 F:\WINNT\system32\USER32.dll
            77F40000 F:\WINNT\system32\GDI32.DLL
            76AF0000 F:\WINNT\system32\comdlg32.dll
            70BD0000 F:\WINNT\system32\SHLWAPI.DLL
            77D90000 F:\WINNT\system32\ADVAPI32.dll
            77D20000 F:\WINNT\system32\RPCRT4.DLL
            71700000 F:\WINNT\system32\COMCTL32.DLL
            77560000 F:\WINNT\system32\SHELL32.DLL
            78000000 F:\WINNT\system32\MSVCRT.DLL
            777C0000 F:\WINNT\System32\WINSPOOL.DRV
            SubSystemData: 0
            ProcessHeap: 130000
            ProcessParameters: 20000
            WindowTitle: 'D:\NtSysInfo.exe'
            ImageFile: 'D:\NtSysInfo.exe'
            CommandLine: '"D:\NtSysInfo.exe" '
            DllPath: 'D:\;.;F:\WINNT\System32;F:\WINNT\system;F:\WINNT;F:\WINNT\system32;F:\WINNT;F:\WINNT\System32\Wbem;J:\WINDOWS;J:\WINDOWS\COMMAND;E:\WINDOWS\SYSTEM\WBEM;J:\WINDOWS;J:\WINDOWS\COMMAND;E:\WINDOWS\SYSTEM\WBEM;J:\WINDOWS;J:\WINDOWS\
            COMMAND'
            Environment: 0x10000


            從WinDbg輸出的PEB結(jié)構(gòu)信息可以看出ProcessParameters的地址為0x20000,ImageFile字段就是進(jìn)程的完整路徑。那么PorcessParamters的地址又保存在_PEB結(jié)構(gòu)的什么地方呢?_PEB結(jié)構(gòu)的基地址為0x7ffdf000,通過WinDbg的“db 0x7ffdf000” 命令顯示0x7ffdf000地址的信息可以發(fā)現(xiàn)ProcessParameters的地址保存在_PEB結(jié)構(gòu)的0x10偏移量處,內(nèi)容為0x20000。
            繼續(xù)用“db 0x20000”命令顯示ProcessParameters地址的內(nèi)容,偏移量為0x3C處保存完整路徑的地址,0x3C處的內(nèi)容如果是:0x20670,利用“db 0x20670”即可顯示出完整路徑。完整路徑用UNICODE格式保存。
            我們利用程序模擬上面的步驟則可以得到當(dāng)前進(jìn)程的完整路徑,代碼如下:

            PCWSTR GetCurrentProcessFileName()
            {
            DWORD dwAddress = (DWORD)PsGetCurrentProcess();
            if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)
            return NULL;
            dwAddress += 0x1B0;
            if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
            dwAddress += 0x10;
            if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
            dwAddress += 0x3C;
            if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;
            KdPrint((“Current Process Full Path Name: %ws\n”, (PCWSTR)dwAddress));
            return (PCWSTR)dwAddress;
            }

            Windows NT與Windows 2000的_EPROCESS結(jié)構(gòu)略有不同,所以偏移地址也不相同,故此上面的程序不能正常運(yùn)行于Windows NT。要想在Windows NT下獲得進(jìn)程名和完整路徑可以用類似的方法得出正確的偏移地址,進(jìn)而編寫出正確的程序。

            如果想得到關(guān)于如何在Windows 9x的驅(qū)動(dòng)程序(VXD)中得到當(dāng)前進(jìn)程的進(jìn)程名和完整路徑或者其他更多知識(shí),可以訪問費(fèi)爾安全實(shí)驗(yàn)室的網(wǎng)站:http://www.xfilt.com。


            69国产成人综合久久精品| 国产精品中文久久久久久久| 香港aa三级久久三级| 久久亚洲国产中v天仙www| 亚洲精品高清久久| 久久久久无码中| 久久久久久久97| 少妇内射兰兰久久| 久久99国产精品99久久| 久久国产午夜精品一区二区三区| 日本精品一区二区久久久| 人妻精品久久无码专区精东影业| 久久精品国产亚洲av影院| 99久久精品国产综合一区| 一本一道久久a久久精品综合| 亚洲国产欧美国产综合久久| 久久综合九色综合欧美狠狠| 无夜精品久久久久久| 久久男人Av资源网站无码软件 | 久久综合给合久久狠狠狠97色 | 久久精品国产一区二区电影| 久久99国产精品久久99小说| 俺来也俺去啦久久综合网| 久久高清一级毛片| 久久久婷婷五月亚洲97号色| 久久影院午夜理论片无码| 亚洲AV乱码久久精品蜜桃| 久久国产精品免费一区| 久久精品人人槡人妻人人玩AV | 99国产欧美精品久久久蜜芽| 欧美久久综合九色综合| 999久久久免费精品国产| 久久无码AV一区二区三区| 99久久免费国产精品| AV色综合久久天堂AV色综合在| 久久亚洲精品国产亚洲老地址| 久久国产免费观看精品| 中文字幕热久久久久久久| 欧美激情精品久久久久久| 热99re久久国超精品首页| 久久超乳爆乳中文字幕|