рдЖрдЬ рд░рд╛рдд рдкрд╣рд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ
рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ
ilya314 рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП Habr├й рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рд╕рдореНрдорд╛рдирдЬрдирдХ
рд╣рдмрд▓-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реВрдБред рдХреНрдпрд╛ рдЦреМрдл рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ PEB рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ Syshny рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдЕрд╕рд▓ рдореЗрдВ, рд▓реЗрдЦрдХ рдХреЗ рдкрд╛рд╕ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЙрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ - рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ рдЧреЗрдЯреЗрди рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдФрд░ рдХрд░реНрдиреЗрд▓ 32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рд╡рд┐рд╖рдп рдХреЛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдЖрдЗрдП рдПрдХ рдЖрдВрдЦ рдХреЗ рд╕рд╛рде рдЕрдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреАрдИрдмреА рд╡рд┐рдЬреНрдЮрд╛рдкрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ (рдПрдо $, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдЧреБрдгреЛрдВ рдХреА рдПрдХ рдПрдбрд╝реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Google рдпрд╛ рдбреАрдмрдЧрд░ рдХреЗ рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рдЖрддрд╛ рд╣реИ):
typedef struct _PEB { BOOLEAN InheritedAddressSpace; BOOLEAN ReadImageFileExecOptions; BOOLEAN BeingDebugged; BOOLEAN Spare; HANDLE Mutant; PVOID ImageBaseAddress; PPEB_LDR_DATA LoaderData; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; PVOID SubSystemData; PVOID ProcessHeap; PVOID FastPebLock; PPEBLOCKROUTINE FastPebLockRoutine; PPEBLOCKROUTINE FastPebUnlockRoutine; ULONG EnvironmentUpdateCount; PPVOID KernelCallbackTable; PVOID EventLogSection; PVOID EventLog; PPEB_FREE_BLOCK FreeList; ULONG TlsExpansionCounter; PVOID TlsBitmap; ULONG TlsBitmapBits[0x2]; PVOID ReadOnlySharedMemoryBase; PVOID ReadOnlySharedMemoryHeap; PPVOID ReadOnlyStaticServerData; PVOID AnsiCodePageData; PVOID OemCodePageData; PVOID UnicodeCaseTableData; ULONG NumberOfProcessors; ULONG NtGlobalFlag; BYTE Spare2[0x4]; LARGE_INTEGER CriticalSectionTimeout; ULONG HeapSegmentReserve; ULONG HeapSegmentCommit; ULONG HeapDeCommitTotalFreeThreshold; ULONG HeapDeCommitFreeBlockThreshold; ULONG NumberOfHeaps; ULONG MaximumNumberOfHeaps; PPVOID *ProcessHeaps; PVOID GdiSharedHandleTable; PVOID ProcessStarterHelper; PVOID GdiDCAttributeList; PVOID LoaderLock; ULONG OSMajorVersion; ULONG OSMinorVersion; ULONG OSBuildNumber; ULONG OSPlatformId; ULONG ImageSubSystem; ULONG ImageSubSystemMajorVersion; ULONG ImageSubSystemMinorVersion; ULONG GdiHandleBuffer[0x22]; ULONG PostProcessInitRoutine; ULONG TlsExpansionBitmap; BYTE TlsExpansionBitmapBits[0x80]; ULONG SessionId; } PEB, *PPEB;
рд╣рдо ProcessParameters рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рд╢рд╛рдорд┐рд▓ рд╣реИ
; рдкрд░реНрдпрд╛рд╡рд░рдг; рдФрд░ рдЕрдиреНрдп рдЙрдкрд╣рд╛рд░ рдЬреЛ рд░рд┐рдВрдЧ 3 рд╕реЗ рд░рд┐рдВрдЧ 3 рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдпрд╣реАрдВ рд╕реЗ рдлреНрд▓рд╛рдИ рдлреНрд▓рд╛рдИ рдкрд░ Syshnom рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ, рд░рдирдЯрд╛рдЗрдо рдорд╛рдирдХ рдХрд░реНрдиреЗрд▓ 32-> рдПрдирдбреАрдЯреАрдПрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╕ рд╣реБрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЦрдВрдб рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреАрдИрдмреА рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рдЪрд▓рд┐рдд рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред рдмрд╕ рдмрджрд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдЗрд╕ рдкрд░ рдХреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ AMD64 рдХреЗ рддрд╣рдд рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдордВрдЪ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЕрджреНрднреБрдд рдПрдо $ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рд╕рдиреЗ 64-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдирд▓рд╛рдЗрди рдПрд╕рдо рдЖрд╡реЗрд╖рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛, рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ
рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЦреЛрдЬ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ (рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХреВрдВрдЧрд╛, рдореИрдВ рдпрд╣ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдмрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдердХ рдЧрдпрд╛, рдЬрдмрдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐)ред
; ; Utils.asm ; INCLUDE Utils.inc .code GetCurrentUserProcessParameters PROC mov rax, gs:[60h] mov rax, [rax + 20h]; ret; GetCurrentUserProcessParameters ENDP END
рд╡реИрд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рд╡рд┐рдВрдбреЛрдЬрд╝ рдУрдПрд╕ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, 64-рдмрд┐рдЯ рдкреАрдИрдмреА рдореЗрдВ рдпрд╣ рдЬреАрдПрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
__declspec(naked) PVOID GetCurrentUserProcessParameters() { __asm { mov eax, fs:[30h]; mov eax, [eax + 10h]; ret; } }
PEB рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, 32 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП, ProcessParameters рдХреА рдСрдлрд╕реЗрдЯ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде, рдпрд╣ 16 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред 64 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП, 8 рдмрд╛рдЗрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдФрд░ 4 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдкрд╣рд▓реЗ BOOLEANs, 28 + 4 рдмрд╛рдЗрдЯреНрд╕ рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЖрдк рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдХреЛ рджреЗрдЦрдХрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рд╣рдо рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА PEB рдореЗрдВ рд╢рдХреНрддрд┐ рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ ProcessParameters рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдП рдкрд░реНрдпрд╛рд╡рд░рдг рдмреНрд▓реЙрдХ рдореЗрдВ рддрд╛рд░реЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рджреЗрдЦреЗрдВред M $ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд▓рд╛рдЗрдиреЗрдВ VAR = VALUE рдХреЗ рд░реВрдк рдХреА рд╣реИрдВ рдФрд░ рдПрдХ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рджреЛ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреА рдЖрдБрдЦреЛрдВ рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реЗрдВрдЧреЗ:
- рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдФрд░ рд╕реЗрд╡рд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕реНрдкреВрдлрд┐рдВрдЧ рдФрд░ рд▓реЗрдЦрди рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
- рдпрд╣ рд╣рдореЗрд╢рд╛ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЫрд╡рд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб, рдпрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛрдб, рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди рдЕрдзрд┐рдХрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдФрд░ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рдХреА рдЧреНрд░реЗрдиреНрдпреБрд▓рд┐рдЯреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рдВрдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рд╣рдо рдПрдХ рдЦрд░рд╛рдм рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЦрд░рд╛рдм / рд╕реНрдерд╛рдирд╛рдкрдиреНрди рд╣реИрдВ
- рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ (рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕реВрдЪрдХ) рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдирдХрд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреА рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ред
- рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдХрд╛рджрдорд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рдордп рдкреАрдИрдмреА (рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реЗ) рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рднреА рдереНрд░реЗрдбреНрд╕ "zanemit" рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИред
#include <windows.h> #include <stdio.h> #include <conio.h> #include "Utils.h" typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING; typedef struct _RTL_USER_PROCESS_PARAMETERS { ULONG MaximumLength; ULONG Length; ULONG Flags; ULONG DebugFlags; PVOID ConsoleHandle; ULONG ConsoleFlags; HANDLE StdInputHandle; HANDLE StdOutputHandle; HANDLE StdErrorHandle; UNICODE_STRING CurrentDirectoryPath; HANDLE CurrentDirectoryHandle; UNICODE_STRING DllPath; UNICODE_STRING ImagePathName; UNICODE_STRING CommandLine; PVOID Environment; ULONG StartingPositionLeft; ULONG StartingPositionTop; ULONG Width; ULONG Height; ULONG CharWidth; ULONG CharHeight; ULONG ConsoleTextAttributes; ULONG WindowFlags; ULONG ShowWindowFlags; UNICODE_STRING WindowTitle; UNICODE_STRING DesktopName; UNICODE_STRING ShellInfo; UNICODE_STRING RuntimeData; PVOID DLCurrentDirectory; } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; PVOID ReplacePEBEnvironmentTableAndAddValue(LPCWSTR Variable, LPCWSTR Value) { PRTL_USER_PROCESS_PARAMETERS ProcessParams; MEMORY_BASIC_INFORMATION MemoryInformation; PBYTE NewEnvironment; PWCHAR Token; size_t EnvironmentSize; if (!Variable || !Value || !*Variable || !*Value) return NULL; ProcessParams = GetCurrentUserProcessParameters(); Token = (PWCHAR)ProcessParams->Environment; while (!(!*Token && !*(Token + 1))) ++Token; EnvironmentSize = (ULONG_PTR)Token - (ULONG_PTR)ProcessParams->Environment; MemoryInformation.AllocationProtect = PAGE_EXECUTE_READWRITE; VirtualQuery(ProcessParams->Environment, &MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION)); NewEnvironment = (PBYTE)VirtualAlloc(0, EnvironmentSize + 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (NewEnvironment) { DWORD OldProtect = PAGE_EXECUTE_READWRITE, OldProtect2 = PAGE_EXECUTE_READWRITE; size_t Size = (wcslen(Variable) + wcslen(Value)) * sizeof(WCHAR) + 2 * sizeof(WCHAR); PWCHAR EnvironmentString = malloc(Size); if (EnvironmentString) { PVOID OldEnvironment = ProcessParams->Environment; UINT EndOfEnvironment = 0; _snwprintf_s(EnvironmentString, Size / sizeof(WCHAR), _TRUNCATE, L"%ws=%ws", Variable, Value); memcpy(NewEnvironment, ProcessParams->Environment, EnvironmentSize); *((PWCHAR)(NewEnvironment + EnvironmentSize)) = L'\0'; memcpy(NewEnvironment + EnvironmentSize + 2, EnvironmentString, Size - sizeof(WCHAR)); memcpy(NewEnvironment + EnvironmentSize + 2 + Size - sizeof(WCHAR), &EndOfEnvironment, 4); VirtualProtect(NewEnvironment, EnvironmentSize + 0x1000, MemoryInformation.AllocationProtect, &OldProtect); VirtualProtect(ProcessParams, sizeof(RTL_USER_PROCESS_PARAMETERS), PAGE_EXECUTE_READWRITE, &OldProtect); ProcessParams->Environment = NewEnvironment; VirtualProtect(ProcessParams, sizeof(RTL_USER_PROCESS_PARAMETERS), OldProtect, &OldProtect2); free(EnvironmentString); return OldEnvironment; } VirtualFree(NewEnvironment, 0, MEM_RELEASE); } return NULL; } void RestorePEBEnvironmentTable(PVOID OriginalEnvironment) { PRTL_USER_PROCESS_PARAMETERS ProcessParams; DWORD OldProtect = PAGE_EXECUTE_READWRITE, OldProtect2; PVOID OldEnvironment; if (!OriginalEnvironment) return; ProcessParams = GetCurrentUserProcessParameters(); VirtualProtect(ProcessParams, sizeof(RTL_USER_PROCESS_PARAMETERS), PAGE_EXECUTE_READWRITE, &OldProtect); OldEnvironment = ProcessParams->Environment; ProcessParams->Environment = OriginalEnvironment; VirtualProtect(ProcessParams, sizeof(RTL_USER_PROCESS_PARAMETERS), OldProtect, &OldProtect2); VirtualFree(OldEnvironment, 0, MEM_RELEASE); } void main(int argc, char *argv[]) { PVOID OriginalEnvironment; UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); OriginalEnvironment = ReplacePEBEnvironmentTableAndAddValue(L"NewVar", L"NewValue"); if (OriginalEnvironment) { WCHAR Buff[1024] = {0}; if (GetEnvironmentVariableW(L"NewVar", Buff, sizeof(Buff))) wprintf_s(L"GetEnvironmentVariableW(): NewVar == %ws\n", Buff); printf_s("Restoring PEB Environment Table...\n"); RestorePEBEnvironmentTable(OriginalEnvironment); if (!GetEnvironmentVariableW(L"NewVar", Buff, sizeof(Buff))) printf_s("GetEnvironmentVariableW(): NewVar not found\n"); } _getch(); }
рдлрд┐рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

"рдореВрд▓" рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд▓реМрдЯрдиреЗ рд╕реЗ рдХреИрд╢ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХрд░реНрдиреЗрд▓ 32 рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЗрдЦрдХ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдмрджрд▓рддреЗ рд╕рдордп рдХрд╛рдо рдХрд░реЗрдЧреА, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрджреНрдпрддрди: рдЬреИрд╕рд╛ рдХрд┐
рдХреНрд▓реАрд╡рд░рдорд╛рдЙрд╕ рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, _environ рдХреИрд╢ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, _wenviron рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдбреАрдмрдЧрд┐рдВрдЧ рдкреНрд░рд┐рдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рддреБрдореНрд╣рд╛рд░рд╛
rwx64