【调试技术】用户态查看PEB和TEB

概述:用户态查看进程 PEB 和 TEB(通过windbg附加或启动调试的exe)

0x01 用户态查看 TEB 和 PEB

在双机调试的时候,可以直接使用 !PEB PID!TEB TID 获取进程和线程的相关信息,在用户态这两个命令就会失效。原因就是用户态不支持大写!TEB!PEB 命令。

在用户态调试时获取 tebpeb 的命令是小写的。

#获取 peb
!peb# 获取 teb
!teb

除此之外,这里提供另外一种思路。我们都知道 TEB 结构体中保存了PEB的地址,因此可以通过TEB获取PEB的相关信息。

这里以 notepad.exe 为例演示。

0x02 演示

准备步骤

  1. 运行 notepad.exeWin+R 输入 notepad 回车即可。
  2. 运行 windbg,并附加到进程 notepad.exe 上。

开始调试

查看当前线程

使用 ~. 查看当前线程(这里其实查看哪个线程都可以,因为当前进程的 PEB 只有一个,所有的 TEB 都指向了同一个 PEB)

0:007> ~.
.  7  Id: b8f4.d5a0 Suspend: 1 Teb: 000000a3`b61d1000 UnfrozenStart: ntdll!DbgUiRemoteBreakin (00007ff9`ab83c9c0)Priority: 0  Priority class: 32  Affinity: ff

可以看到 Teb 地址为 000000 a 3 ‘ b 61 d 1000 000000a3`b61d1000 000000a3‘b61d1000

查看TEB

dt ntdll!_Teb 000000a3`b61d1000

输出如下所示,可以看到 0x060 偏移处为 _PEB

0:007> dt ntdll!_Teb 000000a3`b61d1000+0x000 NtTib            : _NT_TIB+0x038 EnvironmentPointer : (null) +0x040 ClientId         : _CLIENT_ID+0x050 ActiveRpcHandle  : (null) +0x058 ThreadLocalStoragePointer : (null) +0x060 ProcessEnvironmentBlock : 0x000000a3`b61b8000 _PEB+0x068 LastErrorValue   : 0+0x06c CountOfOwnedCriticalSections : 0+0x070 CsrClientThread  : (null) +0x078 Win32ThreadInfo  : (null) +0x080 User32Reserved   : [26] 0+0x0e8 UserReserved     : [5] 0+0x100 WOW32Reserved    : (null) +0x108 CurrentLocale    : 0x804+0x10c FpSoftwareStatusRegister : 0+0x110 ReservedForDebuggerInstrumentation : [16] (null) +0x190 SystemReserved1  : [30] (null) +0x280 PlaceholderCompatibilityMode : 0 ''+0x281 PlaceholderHydrationAlwaysExplicit : 0 ''+0x282 PlaceholderReserved : [10]  ""+0x28c ProxiedProcessId : 0+0x290 _ActivationStack : _ACTIVATION_CONTEXT_STACK+0x2b8 WorkingOnBehalfTicket : [8]  ""+0x2c0 ExceptionCode    : 0n0+0x2c4 Padding0         : [4]  ""+0x2c8 ActivationContextStackPointer : 0x000000a3`b61d1290 _ACTIVATION_CONTEXT_STACK+0x2d0 InstrumentationCallbackSp : 0+0x2d8 InstrumentationCallbackPreviousPc : 0+0x2e0 InstrumentationCallbackPreviousSp : 0+0x2e8 TxFsContext      : 0xfffe+0x2ec InstrumentationCallbackDisabled : 0 ''+0x2ed UnalignedLoadStoreExceptions : 0 ''+0x2ee Padding1         : [2]  ""+0x2f0 GdiTebBatch      : _GDI_TEB_BATCH+0x7d8 RealClientId     : _CLIENT_ID+0x7e8 GdiCachedProcessHandle : (null) +0x7f0 GdiClientPID     : 0+0x7f4 GdiClientTID     : 0+0x7f8 GdiThreadLocalInfo : (null) +0x800 Win32ClientInfo  : [62] 0+0x9f0 glDispatchTable  : [233] (null) +0x1138 glReserved1      : [29] 0+0x1220 glReserved2      : (null) +0x1228 glSectionInfo    : (null) +0x1230 glSection        : (null) +0x1238 glTable          : (null) +0x1240 glCurrentRC      : (null) +0x1248 glContext        : (null) +0x1250 LastStatusValue  : 0+0x1254 Padding2         : [4]  ""+0x1258 StaticUnicodeString : _UNICODE_STRING ""+0x1268 StaticUnicodeBuffer : [261]  ""+0x1472 Padding3         : [6]  ""+0x1478 DeallocationStack : 0x000000a3`b6400000 Void+0x1480 TlsSlots         : [64] (null) +0x1680 TlsLinks         : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]+0x1690 Vdm              : (null) +0x1698 ReservedForNtRpc : (null) +0x16a0 DbgSsReserved    : [2] (null) +0x16b0 HardErrorMode    : 0+0x16b4 Padding4         : [4]  ""+0x16b8 Instrumentation  : [11] (null) +0x1710 ActivityId       : _GUID {00000000-0000-0000-0000-000000000000}+0x1720 SubProcessTag    : (null) +0x1728 PerflibData      : (null) +0x1730 EtwTraceData     : (null) +0x1738 WinSockData      : (null) +0x1740 GdiBatchCount    : 0+0x1744 CurrentIdealProcessor : _PROCESSOR_NUMBER+0x1744 IdealProcessorValue : 0x3030000+0x1744 ReservedPad0     : 0 ''+0x1745 ReservedPad1     : 0 ''+0x1746 ReservedPad2     : 0x3 ''+0x1747 IdealProcessor   : 0x3 ''+0x1748 GuaranteedStackBytes : 0+0x174c Padding5         : [4]  ""+0x1750 ReservedForPerf  : (null) +0x1758 ReservedForOle   : (null) +0x1760 WaitingOnLoaderLock : 0+0x1764 Padding6         : [4]  ""+0x1768 SavedPriorityState : (null) +0x1770 ReservedForCodeCoverage : 0+0x1778 ThreadPoolData   : (null) +0x1780 TlsExpansionSlots : (null) +0x1788 DeallocationBStore : (null) +0x1790 BStoreLimit      : (null) +0x1798 MuiGeneration    : 0+0x179c IsImpersonating  : 0+0x17a0 NlsCache         : (null) +0x17a8 pShimData        : (null) +0x17b0 HeapData         : 0+0x17b4 Padding7         : [4]  ""+0x17b8 CurrentTransactionHandle : (null) +0x17c0 ActiveFrame      : (null) +0x17c8 FlsData          : (null) +0x17d0 PreferredLanguages : (null) +0x17d8 UserPrefLanguages : (null) +0x17e0 MergedPrefLanguages : (null) +0x17e8 MuiImpersonation : 0+0x17ec CrossTebFlags    : 0+0x17ec SpareCrossTebBits : 0y0000000000000000 (0)+0x17ee SameTebFlags     : 8+0x17ee SafeThunkCall    : 0y0+0x17ee InDebugPrint     : 0y0+0x17ee HasFiberData     : 0y0+0x17ee SkipThreadAttach : 0y1+0x17ee WerInShipAssertCode : 0y0+0x17ee RanProcessInit   : 0y0+0x17ee ClonedThread     : 0y0+0x17ee SuppressDebugMsg : 0y0+0x17ee DisableUserStackWalk : 0y0+0x17ee RtlExceptionAttached : 0y0+0x17ee InitialThread    : 0y0+0x17ee SessionAware     : 0y0+0x17ee LoadOwner        : 0y0+0x17ee LoaderWorker     : 0y0+0x17ee SkipLoaderInit   : 0y0+0x17ee SpareSameTebBits : 0y0+0x17f0 TxnScopeEnterCallback : (null) +0x17f8 TxnScopeExitCallback : (null) +0x1800 TxnScopeContext  : (null) +0x1808 LockCount        : 0+0x180c WowTebOffset     : 0n0+0x1810 ResourceRetValue : (null) +0x1818 ReservedForWdf   : (null) +0x1820 ReservedForCrt   : 0+0x1828 EffectiveContainerId : _GUID {00000000-0000-0000-0000-000000000000}

查看PEB

dt ntdll!_PEB 0xa3b61b8000# 或者使用 dx 命令
dx -r1 ((ntdll!_PEB *)0xa3b61b8000)

输出如下所示,到此就看到了 notepad 的 PEB 了。后文补充了 PEB 结构体中 ProcessParameters 变量的分析和查看。

0:007> dt ntdll!_PEB 0xa3b61b8000+0x000 InheritedAddressSpace : 0 ''+0x001 ReadImageFileExecOptions : 0 ''+0x002 BeingDebugged    : 0x1 ''+0x003 BitField         : 0x84 ''+0x003 ImageUsesLargePages : 0y0+0x003 IsProtectedProcess : 0y0+0x003 IsImageDynamicallyRelocated : 0y1+0x003 SkipPatchingUser32Forwarders : 0y0+0x003 IsPackagedProcess : 0y0+0x003 IsAppContainer   : 0y0+0x003 IsProtectedProcessLight : 0y0+0x003 IsLongPathAwareProcess : 0y1+0x004 Padding0         : [4]  ""+0x008 Mutant           : 0xffffffff`ffffffff Void+0x010 ImageBaseAddress : 0x00007ff7`7ef80000 Void+0x018 Ldr              : 0x00007ff9`ab8db4c0 _PEB_LDR_DATA+0x020 ProcessParameters : 0x000001a6`50d52540 _RTL_USER_PROCESS_PARAMETERS+0x028 SubSystemData    : 0x00007ff9`9f7af1d0 Void+0x030 ProcessHeap      : 0x000001a6`50d50000 Void+0x038 FastPebLock      : 0x00007ff9`ab8db0e0 _RTL_CRITICAL_SECTION+0x040 AtlThunkSListPtr : (null) +0x048 IFEOKey          : (null) +0x050 CrossProcessFlags : 1+0x050 ProcessInJob     : 0y1+0x050 ProcessInitializing : 0y0+0x050 ProcessUsingVEH  : 0y0+0x050 ProcessUsingVCH  : 0y0+0x050 ProcessUsingFTH  : 0y0+0x050 ProcessPreviouslyThrottled : 0y0+0x050 ProcessCurrentlyThrottled : 0y0+0x050 ProcessImagesHotPatched : 0y0+0x050 ReservedBits0    : 0y000000000000000000000000 (0)+0x054 Padding1         : [4]  ""+0x058 KernelCallbackTable : 0x00007ff9`a9a80070 Void+0x058 UserSharedInfoPtr : 0x00007ff9`a9a80070 Void+0x060 SystemReserved   : 0+0x064 AtlThunkSListPtr32 : 0+0x068 ApiSetMap        : 0x000001a6`50c80000 Void+0x070 TlsExpansionCounter : 0+0x074 Padding2         : [4]  ""+0x078 TlsBitmap        : 0x00007ff9`ab8db440 Void+0x080 TlsBitmapBits    : [2] 0xffffffff+0x088 ReadOnlySharedMemoryBase : 0x00007df4`3dce0000 Void+0x090 SharedData       : (null) +0x098 ReadOnlyStaticServerData : 0x00007df4`3dce0750  -> (null) +0x0a0 AnsiCodePageData : 0x00007df5`3fe30000 Void+0x0a8 OemCodePageData  : 0x00007df5`3fe30000 Void+0x0b0 UnicodeCaseTableData : 0x00007df5`3fe60028 Void+0x0b8 NumberOfProcessors : 8+0x0bc NtGlobalFlag     : 0+0x0c0 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000+0x0c8 HeapSegmentReserve : 0x100000+0x0d0 HeapSegmentCommit : 0x2000+0x0d8 HeapDeCommitTotalFreeThreshold : 0x10000+0x0e0 HeapDeCommitFreeBlockThreshold : 0x1000+0x0e8 NumberOfHeaps    : 6+0x0ec MaximumNumberOfHeaps : 0x10+0x0f0 ProcessHeaps     : 0x00007ff9`ab8d9d40  -> 0x000001a6`50d50000 Void+0x0f8 GdiSharedHandleTable : 0x000001a6`51120000 Void+0x100 ProcessStarterHelper : (null) +0x108 GdiDCAttributeList : 0x14+0x10c Padding3         : [4]  ""+0x110 LoaderLock       : 0x00007ff9`ab8d55c8 _RTL_CRITICAL_SECTION+0x118 OSMajorVersion   : 0xa+0x11c OSMinorVersion   : 0+0x120 OSBuildNumber    : 0x4a65+0x122 OSCSDVersion     : 0+0x124 OSPlatformId     : 2+0x128 ImageSubsystem   : 2+0x12c ImageSubsystemMajorVersion : 0xa+0x130 ImageSubsystemMinorVersion : 0+0x134 Padding4         : [4]  ""+0x138 ActiveProcessAffinityMask : 0xff+0x140 GdiHandleBuffer  : [60] 0+0x230 PostProcessInitRoutine : (null) +0x238 TlsExpansionBitmap : 0x00007ff9`ab8db420 Void+0x240 TlsExpansionBitmapBits : [32] 1+0x2c0 SessionId        : 1+0x2c4 Padding5         : [4]  ""+0x2c8 AppCompatFlags   : _ULARGE_INTEGER 0x0+0x2d0 AppCompatFlagsUser : _ULARGE_INTEGER 0x0+0x2d8 pShimData        : 0x000001a6`50cc0000 Void+0x2e0 AppCompatInfo    : (null) +0x2e8 CSDVersion       : _UNICODE_STRING ""+0x2f8 ActivationContextData : 0x000001a6`50cb0000 _ACTIVATION_CONTEXT_DATA+0x300 ProcessAssemblyStorageMap : 0x000001a6`50d5b5c0 _ASSEMBLY_STORAGE_MAP+0x308 SystemDefaultActivationContextData : 0x000001a6`50ca0000 _ACTIVATION_CONTEXT_DATA+0x310 SystemAssemblyStorageMap : (null) +0x318 MinimumStackCommit : 0+0x320 SparePointers    : [4] (null) +0x340 SpareUlongs      : [5] 0+0x358 WerRegistrationData : 0x000001a6`52e00000 Void+0x360 WerShipAssertPtr : (null) +0x368 pUnused          : (null) +0x370 pImageHeaderHash : (null) +0x378 TracingFlags     : 0+0x378 HeapTracingEnabled : 0y0+0x378 CritSecTracingEnabled : 0y0+0x378 LibLoaderTracingEnabled : 0y0+0x378 SpareTracingBits : 0y00000000000000000000000000000 (0)+0x37c Padding6         : [4]  ""+0x380 CsrServerReadOnlySharedMemoryBase : 0x00007df4`66cb0000+0x388 TppWorkerpListLock : 0+0x390 TppWorkerpList   : _LIST_ENTRY [ 0x000000a3`b5f0f860 - 0x000000a3`b63ffb70 ]+0x3a0 WaitOnAddressHashTable : [128] (null) +0x7a0 TelemetryCoverageHeader : (null) +0x7a8 CloudFileFlags   : 0xe0+0x7ac CloudFileDiagFlags : 0+0x7b0 PlaceholderCompatibilityMode : 2 ''+0x7b1 PlaceholderCompatibilityModeReserved : [7]  ""+0x7b8 LeapSecondData   : 0x00007df5`3fe20000 _LEAP_SECOND_DATA+0x7c0 LeapSecondFlags  : 0+0x7c0 SixtySecondEnabled : 0y0+0x7c0 Reserved         : 0y0000000000000000000000000000000 (0)+0x7c4 NtGlobalFlag2    : 0

查看 ProcessParameters

为了进一步了解和查看,这里再查看 ProcessParameters 的变量。

查看 PEB 的输出可以看到 ProcessParameters 的结构体名为 _RTL_USER_PROCESS_PARAMETERS,该结构体保存了进程很多基础信息,如环境变量、命令行等等。查看当前 ProcessParameters

dx -r1 ((ntdll!_RTL_USER_PROCESS_PARAMETERS *)0x1a650d52540)# 或者
dt _RTL_USER_PROCESS_PARAMETERS 0x1a650d52540

输出如下所示:

0:007> dt _RTL_USER_PROCESS_PARAMETERS 0x1a650d52540
ntdll!_RTL_USER_PROCESS_PARAMETERS+0x000 MaximumLength    : 0x78a+0x004 Length           : 0x78a+0x008 Flags            : 0x6001+0x00c DebugFlags       : 0+0x010 ConsoleHandle    : (null) +0x018 ConsoleFlags     : 0+0x020 StandardInput    : (null) +0x028 StandardOutput   : (null) +0x030 StandardError    : (null) +0x038 CurrentDirectory : _CURDIR+0x050 DllPath          : _UNICODE_STRING ""+0x060 ImagePathName    : _UNICODE_STRING "C:\WINDOWS\system32\notepad.exe"+0x070 CommandLine      : _UNICODE_STRING ""C:\WINDOWS\system32\notepad.exe" "+0x080 Environment      : 0x000001a6`50d50fe0 Void+0x088 StartingX        : 0+0x08c StartingY        : 0+0x090 CountX           : 0+0x094 CountY           : 0+0x098 CountCharsX      : 0+0x09c CountCharsY      : 0+0x0a0 FillAttribute    : 0+0x0a4 WindowFlags      : 0x801+0x0a8 ShowWindowFlags  : 1+0x0b0 WindowTitle      : _UNICODE_STRING "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Notepad.lnk"+0x0c0 DesktopInfo      : _UNICODE_STRING "Winsta0\Default"+0x0d0 ShellInfo        : _UNICODE_STRING ""+0x0e0 RuntimeData      : _UNICODE_STRING ""+0x0f0 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR+0x3f0 EnvironmentSize  : 0x154e+0x3f8 EnvironmentVersion : 3+0x400 PackageDependencyData : (null) +0x408 ProcessGroupId   : 0x3ec+0x40c LoaderThreads    : 0+0x410 RedirectionDllName : _UNICODE_STRING ""+0x420 HeapPartitionName : _UNICODE_STRING ""+0x430 DefaultThreadpoolCpuSetMasks : (null) +0x438 DefaultThreadpoolCpuSetMaskCount : 0+0x43c DefaultThreadpoolThreadMaximum : 0

到这一步,基本上进程的详细信息就都可以看到了。如果是 windbg preview 版本,点几下就能看到一些信息,但是 Environment 环境变量是一个指针,如果需要查看,还是需要输入命令才行。

查看 Environment

_RTL_USER_PROCESS_PARAMETERS 结构中有三个成员与 Environment 相关

# 指向环境变量的指针
+0x080 Environment      : 0x000001a6`50d50fe0 Void# 环境变量的大小
+0x3f0 EnvironmentSize  : 0x154e# 环境变量的版本
+0x3f8 EnvironmentVersion : 3

通过环境变量指针和大小我们就可以看到环境变量的内容了

db 0x000001a6`50d50fe0 l 0x154e

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利…

Go基础——指针、结构体

1、指针 Go语言指针与C差不多,取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。 变量是一种使用方便的占位符,用于引用计算机内存地址。一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 …

jenkins实践篇(2)—— 自动打tag的可回滚发布模式

大家好,我是蓝胖子,在上一篇我简单介绍了如何基于特定分支做自动编译和发布,在生产环境中,为了更加安全和快速回滚,我采取的是通过对代码打tag的方式来进行部署,下面我将详细介绍整个发布过程的逻辑。 发布…

IDEA远程调试代码

IDEA->RUN->Edit Configurations 端口随便选一个,选择调试模块,然后用IDEA生成的命令调试 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:8081 -jar backend-1.18.11.jar &

SteerMouse for mac Mac万能鼠标设置工具 功能介绍

鼠标可谓是用户们在使用电脑时候的必备外接设备呢!适合你自己的鼠标设置也绝对能够优化你的Mac使用体验!想要更好的Mac体验就试试用Steermouse Mac版吧。它通过软件来自由设置你的鼠标操作!在这款万能鼠标设置工具中,用户可以在偏…

MFC String类的初始化学习

之前写过CString的用法; VC CString 编程实例图解_bcbobo21cn, cstring-CSDN博客 下面单独看一下CString的各种初始化方式; void CTest2View::OnDraw(CDC* pDC) {CTest2Doc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for nati…

性能测试知多少---性能分析与调优的原理

最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库。从操作系统(CPU调度,内存管理,进程调度,磁盘I/O)、网络、协议(HTTP, TCP/IP )&…

Codeforces Round 882 (Div. 2)

目录 A. The Man who became a God 题目分析: B. Hamon Odyssey 题目分析: C. Vampiric Powers, anyone? 题目分析: A. The Man who became a God 题目分析: n个人分成k组,每一组的力量都是这样的,那么如果分成k组那么就会有k-1个力量不被统计…

Android 11 Framework 增加自定义API到系统中

基于 Android 11 源码 根据网上的教程, 自己先捣鼓一波: frameworks\base\services 创建 hzyd文件夹 Android.bp内容: android_library_import {name: "services.hzyd",aars: ["MobileSDK-release.aar"],sdk_version: "current", }修改 fra…

tmux工具

B站学习地址:tmux教程

【深度学习】pytorch——Tensor(张量)详解

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ pytorch——Tensor 简介创建Tensortorch.Tensor( )和torch.tensor( )的区别torch.Tensor( )torch.tensor( ) tensor可以是一个数(标量)、一维数组(向量)、二维数组&…

C#WPF文本格式化模式实例

本文演示C#WPF文本格式化模式实例 WPF 文本渲染优缺点 WPF中的文本渲染和旧式的基于 GDI的应用程序的文本染有很大区别。很大一部分区 别是由于 WPF 的设备无关显示系统造成的,但 WPF 中的文本染也得到了显著增强,能更清晰地显示文本,在 LCD 监视器上尤其如此。 然而,W…

安全与HTTP协议:为何明文传输数据成为争议焦点?

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、H…

学习小结,学而时习之,坚持学习之,温顾学习之

学习python一个多月了,之前也有接触过,还花了不少钱报班,看了看入门的头两节课,就止步了。每一种编程语言的入门感觉都差不多,学到现在,我对python的基本数据类型还是没掌握好啊,每次列表字典怎…

【TS篇二】变量、数据类型、接口、解构赋值

文章目录 一、变量声明1.1 var1.2 let1.3 const1.4 let vs const 二、基本数据类型2.1 布尔值2.2 数字2.3 字符串2.4 数组2.5 元组2.6 Object2.7 Any2.8 Void2.9 Null 和 Undefined2.10 类型推断2.11 其它 三、接口3.1 基本示例3.2 可选属性3.3 只读属性 四、解构赋值4.1 数组解…

2015年亚太杯APMCM数学建模大赛C题识别网络中的错误连接求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 C题 识别网络中的错误连接 原题再现 网络是描述真实系统结构的强大工具——社交网络描述人与人之间的关系,万维网描述网页之间的超链接关系。随着现代技术的发展,我们积累了越来越多的网络数据,但这些数据部…

总结-关于stream流的利用

文章目录 前言一、需求二、我的写法 三、优化后的写法总结 前言 在工作中遇到了一个需求,很费劲的写了出来,但是导师看了直摇头,一顿操作帮我修改了,修改之后代码非常简洁,现对这部分做一个回顾总结。 一、需求 需求…

最近面试者对接口测试的理解真把我给笑拥了~

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

快速查看PHP扩展的版本信息

列出所有扩展 /data/app/bin/php -m[PHP Modules] bcmath Core ctype curl date dom fileinfo filter ftp gd hash iconv json ldap libxml mbstring mongodb mysqli mysqlnd openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar posix protobuf redis Reflection session shmo…

Hadoop PseudoDistributed Mode 伪分布式

Hadoop PseudoDistributed Mode 伪分布式加粗样式 hadoop101hadoop102hadoop103192.168.171.101192.168.171.102192.168.171.103namenodesecondary namenoderecource managerdatanodedatanodedatanodenodemanagernodemanagernodemanagerjob historyjob logjob logjob log 1. …