12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 491|回复: 0

利用PEB结构体实现反调试

[复制链接]

345

主题

345

帖子

700

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
700
发表于 2019-8-20 11:23:42 | 显示全部楼层 |阅读模式
PEB(Process Environment Block,进程环境块)是存放进程信息的结构体,尺寸非常大,我们首先看看PEB结构体:typedef struct _PEB {               // Size: 0x1D8    000h    UCHAR           InheritedAddressSpace;    001h    UCHAR           ReadImageFileExecOptions;    002h    UCHAR           BeingDebugged;              //Debug运行标志    003h    UCHAR           SpareBool;    004h    HANDLE          Mutant;    008h    HINSTANCE       ImageBaseAddress;           //程序加载的基地址    00Ch    struct _PEB_LDR_DATA    *Ldr                //Ptr32 _PEB_LDR_DATA    010h    struct _RTL_USER_PROCESS_PARAMETERS  *ProcessParameters;    014h    ULONG           SubSystemData;    018h    HANDLE         ProcessHeap;    01Ch    KSPIN_LOCK      FastPebLock;    020h    ULONG           FastPebLockRoutine;    024h    ULONG           FastPebUnlockRoutine;    028h    ULONG           EnvironmentUpdateCount;    02Ch    ULONG           KernelCallbackTable;    030h    LARGE_INTEGER   SystemReserved;    038h    struct _PEB_FREE_BLOCK  *FreeList    03Ch    ULONG           TlsExpansionCounter;    040h    ULONG           TlsBitmap;    044h    LARGE_INTEGER   TlsBitmapBits;    04Ch    ULONG           ReadOnlySharedMemoryBase;    050h    ULONG           ReadOnlySharedMemoryHeap;    054h    ULONG           ReadOnlyStaticServerData;    058h    ULONG           AnsiCodePageData;    05Ch    ULONG           OemCodePageData;    060h    ULONG           UnicodeCaseTableData;    064h    ULONG           NumberOfProcessors;    068h    LARGE_INTEGER   NtGlobalFlag;               // Address of a local copy    070h    LARGE_INTEGER   CriticalSectionTimeout;    078h    ULONG           HeapSegmentReserve;    07Ch    ULONG           HeapSegmentCommit;    080h    ULONG           HeapDeCommitTotalFreeThreshold;    084h    ULONG           HeapDeCommitFreeBlockThreshold;    088h    ULONG           NumberOfHeaps;    08Ch    ULONG           MaximumNumberOfHeaps;    090h    ULONG           ProcessHeaps;    094h    ULONG           GdiSharedHandleTable;    098h    ULONG           ProcessStarterHelper;    09Ch    ULONG           GdiDCAttributeList;    0A0h    KSPIN_LOCK      LoaderLock;    0A4h    ULONG           OSMajorVersion;    0A8h    ULONG           OSMinorVersion;    0ACh    USHORT          OSBuildNumber;    0AEh    USHORT          OSCSDVersion;    0B0h    ULONG           OSPlatformId;    0B4h    ULONG           ImageSubsystem;    0B8h    ULONG           ImageSubsystemMajorVersion;    0BCh    ULONG           ImageSubsystemMinorVersion;    0C0h    ULONG           ImageProcessAffinityMask;    0C4h    ULONG           GdiHandleBuffer[0x22];    14Ch    ULONG           PostProcessInitRoutine;    150h    ULONG           TlsExpansionBitmap;    154h    UCHAR           TlsExpansionBitmapBits[0x80];    1D4h    ULONG           SessionId;} PEB, *PPEB; 其中与反调试技术密切相关的成员如下所示: 002h    UCHAR           BeingDebugged; 00Ch    struct _PEB_LDR_DATA    *Ldr; 018h    HANDLE         ProcessHeap; 068h    LARGE_INTEGER   NtGlobalFlag;  接下来分别讲解以上4PEB成员。 1BeingDebugged当进程处于调试状态时,BeingDebugged的值会被设置为1,进程在非调试状态下运行时,其值被设置为0。所以我们可以通过判断这个成员的值来决定我们程序的运行流程。测试代码如下:int main(){         charresult=0;         __asm         {                   moveax,fs:[0x30];//获取PEB的地址。                   moval,BYTE PTR [eax+2];                   movresult,al;//得到BeingDebugged成员的值。         }         if(result==1)                   printf("isdebugging\n");         else                   printf("notdebugging\n");         system("pause");//为了观察方便,添加的。         return0; } 2Ldr调试进程时,其堆内存就会出现一些特殊的标识,表示它正处于被调试状态。这些标识中最醒目的是在未使用的堆内存区域中填充着OxFEEEFEEE。我们利用这一特征即可判断进程是否处于被调试状态。PEB.Ldr成员指向一个_PEB_LDR_DATA结构体,而这个结构体就是在堆内存区域中创建的,所以我们可以扫描该区域来判断进程是否处于调试状态下。测试代码如下:int main(){         LPBYTEpLdr;                  DWORDpLdrSig[4]={0xEEFEEEFE,0xEEFEEEFE,0xEEFEEEFE,0xEEFEEEFE};         __asm         {                   moveax,fs:[0x30]; //PEB地址                   moveax,[eax+0xC];//Ldr                   movpLdr,eax;          }          __try         {                   while(1)                   {                if(!memcmp(pLdr,pLdrSig,sizeof(pLdrSig)))                            {                                printf("is debuggig\n");                                break;                            }                       else                            {                                pLdr++;                            }                   }         }         __except(EXCEPTION_EXECUTE_HANDLER)         {                   printf("notdebugging\n");         }            system("pause");         return0; } 3ProcessHeapProcessHeap是指向HEAP结构体的指针,在HEAP结构体中的两个成员FlagsForce Flags,它们的偏移分别为0xC0x10,进程运行正常时,Heap.Flags的成员值为0x2,HEAP.ForceFlags成员的值为0x0。进程处于调试状态时,这些值会发生变化。测试代码如下:(只测试了ForceFlags成员的值,测试Flags成员的值的方法是一样的)。int main(){         intresult=0;         __asm         {                   moveax,fs:[0x30]; //PEB地址                   moveax,[eax+0x18];//ProcessHeap成员                   moveax,[eax+0x10];//ForceFlags成员                   movresult,eax;          }         if(result!=0)                   printf("isdebugging\n");         else                   printf("notdebugging\n");         system("pause");         return0; }  4NtGlobalFlag调试进程时,PEB.NtGlobalFlag成员的值为被设置成0x70。所以,检测该成员的值即可判断进程是否处于被调试状态。测试代码如下:int main(){         intresult=0;         __asm         {                   moveax,fs:[0x30]; //PEB地址                   moveax,[eax+0x68];//NtGlobalFlag成员                   movresult,eax;          }         if(result==0x70)                   printf("isdebugging\n");         else                   printf("notdebugging\n");         system("pause");         return0; }  

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 15:57 , Processed in 0.078125 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表