Win32 FS:[0xXX]信息

来源:互联网 发布:watershed算法原理 编辑:程序博客网 时间:2024/06/05 19:07

备忘录–2017-07-24

我正在一个其他进程的虚拟空间中:

0、我应该怎么往这个空间中写数据呢?
1、我应该怎么定位这个空间中与当前进程的相关信息呢?
2、我应该怎么定位我写入的数据呢?

以下内容并不能完全解决所有问题…

FS:[0xXX]:这是维基百科的一些说明

//可以如下使用void main(){    DWORD i = 0;    __asm    {        mov eax, fs:[0x20]        mov i, eax    }    printf("%d", i);}

PEB(不用点我,没有连接):翻译称进程环境块,看看官网提供的阉割版,看看它实际的样子,具体有什么用,不明,但是也可以从一些字段猜测。今次只是临时保存,还未经测试。测试后补充。

微软阉割版PEB结构体:毕竟是不开源的系统。

PEB结构体导出分享:这是外国朋友收集到的WIN32平台下各个版本的PEB结构说明,无注释。网页版详细,同样是无注释的。

#pragma pack(push)#pragma pack(1)template <class T>struct LIST_ENTRY_T{    T Flink;    T Blink;};template <class T>struct UNICODE_STRING_T{    union    {        struct        {            WORD Length;            WORD MaximumLength;        };        T dummy;    };    T _Buffer;};template <class T, class NGF, int A>struct _PEB_T{    union    {        struct        {            BYTE InheritedAddressSpace;            BYTE ReadImageFileExecOptions;            BYTE BeingDebugged;            BYTE _SYSTEM_DEPENDENT_01;        };        T dummy01;    };    T Mutant;    T ImageBaseAddress;    T Ldr;    T ProcessParameters;    T SubSystemData;    T ProcessHeap;    T FastPebLock;    T _SYSTEM_DEPENDENT_02;    T _SYSTEM_DEPENDENT_03;    T _SYSTEM_DEPENDENT_04;    union    {        T KernelCallbackTable;        T UserSharedInfoPtr;    };    DWORD SystemReserved;    DWORD _SYSTEM_DEPENDENT_05;    T _SYSTEM_DEPENDENT_06;    T TlsExpansionCounter;    T TlsBitmap;    DWORD TlsBitmapBits[2];    T ReadOnlySharedMemoryBase;    T _SYSTEM_DEPENDENT_07;    T ReadOnlyStaticServerData;    T AnsiCodePageData;    T OemCodePageData;    T UnicodeCaseTableData;    DWORD NumberOfProcessors;    union    {        DWORD NtGlobalFlag;        NGF dummy02;    };    LARGE_INTEGER CriticalSectionTimeout;    T HeapSegmentReserve;    T HeapSegmentCommit;    T HeapDeCommitTotalFreeThreshold;    T HeapDeCommitFreeBlockThreshold;    DWORD NumberOfHeaps;    DWORD MaximumNumberOfHeaps;    T ProcessHeaps;    T GdiSharedHandleTable;    T ProcessStarterHelper;    T GdiDCAttributeList;    T LoaderLock;    DWORD OSMajorVersion;    DWORD OSMinorVersion;    WORD OSBuildNumber;    WORD OSCSDVersion;    DWORD OSPlatformId;    DWORD ImageSubsystem;    DWORD ImageSubsystemMajorVersion;    T ImageSubsystemMinorVersion;    union    {        T ImageProcessAffinityMask;        T ActiveProcessAffinityMask;    };    T GdiHandleBuffer[A];    T PostProcessInitRoutine;    T TlsExpansionBitmap;    DWORD TlsExpansionBitmapBits[32];    T SessionId;    ULARGE_INTEGER AppCompatFlags;    ULARGE_INTEGER AppCompatFlagsUser;    T pShimData;    T AppCompatInfo;    UNICODE_STRING_T<T> CSDVersion;    T ActivationContextData;    T ProcessAssemblyStorageMap;    T SystemDefaultActivationContextData;    T SystemAssemblyStorageMap;    T MinimumStackCommit;};typedef _PEB_T<DWORD, DWORD64, 34> PEB32;typedef _PEB_T<DWORD64, DWORD, 30> PEB64;#pragma pack(pop)

ReactOS:百度百科说明。这是一个克隆winnt的开源操作系统。

ReactOS文档:此处定位到peb__teb.h,可以从此处查看到一些源码信息。

PEB之转存工具:我这下载时显示404,但是作者的说明可以加深理解。

PEB之读取指定进程的环境变量字符串数据:我下下来用了,比如我当前的谷歌浏览器是读不,OD读不了,但是自己写的小程序,execel.exe是可以读的。也许可以提供思路。但是好像有个小问题,它使它读过的进程线程暂停了。

非PEB的一些笔记:涵盖的内容挺多。

PEB一个实际应用:读2.ntdll. 读3kernel32。

2017-7-29:在内存中不使用API而通过PEB遍历模块列表##下载链接

#region---------流程描述//说明 ://  1、不展开时为了取得结构体申明的名称,展开为了后续写汇编代码时好处理偏移//  2、注意字符串是wchar_t类型的,不是char类型//汇编:void main(){    __asm //只索引主模块,如果要查找其他模块可以进行遍历    {        mov eax, fs:[0x30]      //PEB        mov eax, [eax + 0x0c]   //_PEB_LDR_DATA        mov eax, [eax + 0x0c]   //InLoadOrderModuleList起点        mov ecx, [eax]          //跳过第1个模块。我的系统是win10,到这里就到了test_.exe        mov ecx, [ecx]          //跳过第2个模块。我的系统是win10,到这里就到了ntdll.dll        mov ecx, [ecx]          //跳过第3个模块。我的系统是win10,到这里就到了kernel32.dll    #region  //以下应当使用循环,可遍历出所有dll信息        mov ebx, [eax + 0x18]   //DllBase        mov ebx, [eax + 0x28]   //FullDllName :完整路径        mov ebx, [eax + 0x30]   //BaseDllName :文件名    #endregion //循环遍历可以使用多种方式,例如DllBase=0,或者使用do{}while(主模块地址!=InLoadOrderLinks[0])等;    }}#endregion
原创粉丝点击