Win32 FS:[0xXX]信息

备忘录–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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值