在steam客户端注入dll的时候发现steam客户端直接消失,一番调试操作,我怀疑是不是steam有什么检测?用x32dbg附加后发现断在了TLS回调函数处!
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPARAM lParam) { switch (dwReason) { case DLL_PROCESS_ATTACH: { MessageBoxA(0, "DLL_PROCESS_ATTACH", "报告", 0); DisableThreadLibraryCalls(hModule); HANDLE handle = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr); CloseHandle(handle); break; } case DLL_THREAD_ATTACH: { MessageBoxA(0, "DLL_THREAD_ATTACH", "报告", 0); break; } } }
TLS回调函数介绍
测试程序源代码
#include <windows.h> #pragma comment(linker, "/INCLUDE:__tls_used") void print_console(char* szMsg) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); WriteConsoleA(hStdout, szMsg, strlen(szMsg), NULL, NULL); } void NTAPI TLS_CALLBACK1(PVOID DllHandle, DWORD Reason, PVOID Reserved) { char szMsg[80] = { 0, }; wsprintfA(szMsg, "TLS_CALLBACK1() : DllHandle = %X, Reason = %dn", DllHandle, Reason); print_console(szMsg); return; } void NTAPI TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reserved) { char szMsg[80] = { 0, }; wsprintfA(szMsg, "TLS_CALLBACK2() : DllHandle = %X, Reason = %dn", DllHandle, Reason); print_console(szMsg); } #pragma data_seg(".CRT$XLX") PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] = { TLS_CALLBACK1, TLS_CALLBACK2, 0 }; #pragma data_seg() DWORD WINAPI ThreadProc(LPVOID lParam) { print_console("ThreadProc() startn"); print_console("ThreadProc() endn"); return 0; } int main(void) { HANDLE hThread = NULL; print_console("main() startn"); hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); WaitForSingleObject(hThread, 60 * 1000); CloseHandle(hThread); print_console("main() endn"); system("pause"); return 0; }
TLS_CALLBACK1() : DllHandle = 490000, Reason = 0 TLS_CALLBACK2() : DllHandle = 490000, Reason = 0
逆向此程序
void NTAPI TlsCallBackFunction(PVOID Handle, DWORD Reason, PVOID Reserve);
能否在程序运行过程中找到TLS回调函数数组?
TEB
nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +0x034 LastErrorValue : Uint4B +0x038 CountOfOwnedCriticalSections : Uint4B +0x03c CsrClientThread : Ptr32 Void +0x040 Win32ThreadInfo : Ptr32 Void +0x044 User32Reserved : [26] Uint4B +0x0ac UserReserved : [5] Uint4B +0x0c0 WOW32Reserved : Ptr32 Void +0x0c4 CurrentLocale : Uint4B +0x0c8 FpSoftwareStatusRegister : Uint4B +0x0cc SystemReserved1 : [54] Ptr32 Void +0x1a4 ExceptionCode : Int4B +0x1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK +0x1bc SpareBytes1 : [24] UChar +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +0x6b4 RealClientId : _CLIENT_ID +0x6bc GdiCachedProcessHandle : Ptr32 Void +0x6c0 GdiClientPID : Uint4B +0x6c4 GdiClientTID : Uint4B +0x6c8 GdiThreadLocalInfo : Ptr32 Void +0x6cc Win32ClientInfo : [62] Uint4B +0x7c4 glDispatchTable : [233] Ptr32 Void +0xb68 glReserved1 : [29] Uint4B +0xbdc glReserved2 : Ptr32 Void +0xbe0 glSectionInfo : Ptr32 Void +0xbe4 glSection : Ptr32 Void +0xbe8 glTable : Ptr32 Void +0xbec glCurrentRC : Ptr32 Void +0xbf0 glContext : Ptr32 Void +0xbf4 LastStatusValue : Uint4B +0xbf8 StaticUnicodeString : _UNICODE_STRING +0xc00 StaticUnicodeBuffer : [261] Uint2B +0xe0c DeallocationStack : Ptr32 Void +0xe10 TlsSlots : [64] Ptr32 Void +0xf10 TlsLinks : _LIST_ENTRY +0xf18 Vdm : Ptr32 Void +0xf1c ReservedForNtRpc : Ptr32 Void +0xf20 DbgSsReserved : [2] Ptr32 Void +0xf28 HardErrorsAreDisabled : Uint4B +0xf2c Instrumentation : [16] Ptr32 Void +0xf6c WinSockData : Ptr32 Void +0xf70 GdiBatchCount : Uint4B +0xf74 InDbgPrint : UChar +0xf75 FreeStackOnTermination : UChar +0xf76 HasFiberData : UChar +0xf77 IdealProcessor : UChar +0xf78 Spare3 : Uint4B +0xf7c ReservedForPerf : Ptr32 Void +0xf80 ReservedForOle : Ptr32 Void +0xf84 WaitingOnLoaderLock : Uint4B +0xf88 Wx86Thread : _Wx86ThreadState +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +0xf98 ImpersonationLocale : Uint4B +0xf9c IsImpersonating : Uint4B +0xfa0 NlsCache : Ptr32 Void +0xfa4 pShimData : Ptr32 Void +0xfa8 HeapVirtualAffinity : Uint4B +0xfac CurrentTransactionHandle : Ptr32 Void +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +0xfb4 SafeThunkCall : UChar +0xfb5 BooleanSpare : [3] UChar
_IMAGE_TLS_DIRECTORY32
struct _IMAGE_TLS_DIRECTORY32 { DWORD StartAddressOfRawData; DWORD EndAddressOfRawData; DWORD AddressOfIndex; // PDWORD DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK * DWORD SizeOfZeroFill; union { DWORD Characteristics; struct { DWORD Reserved0 : 20; DWORD Alignment : 4; DWORD Reserved1 : 8; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; } IMAGE_TLS_DIRECTORY32;
mov eax,fs:[0x2c] //+0x02c ThreadLocalStoragePointer : Ptr32 Void
ThreadLocalStoragePointer
是TEB(Thread Environment Block)结构体中的一个字段,它指向当前线程的TLS(Thread Local Storage)数组的起始地址。+0xf10 TlsLinks : _LIST_ENTRY
分析steam的steamservice.dll的TLS回调函数的作用
看雪ID:黑嘿黑
https://bbs.kanxue.com/user-home-780727.htm
# 往期推荐
3、安卓加固脱壳分享
球分享
原文始发于微信公众号(看雪学苑):x32TLS回调函数实验
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论