首页
社区
课程
招聘
未解决 [求助]TLS回调函数release版本进不去,求解决方法
发表于: 2019-5-8 12:26 3224

未解决 [求助]TLS回调函数release版本进不去,求解决方法

2019-5-8 12:26
3224
自己最近在学习反调试,看到了利用TLS进行反调试这一块,于是自己写了一个小程序进行测试,但是发现只有在Debug下才会进入TLS回调函数,Release版本进不去,请问这是为什么?????求大神解决。
程序运行结果如下:
debug版本:
Release版本:
代码:
#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 = %d\n",
		DllHandle, Reason);
	print_console(szMsg);
}

void NTAPI TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
{
	char szMsg[80] = { 0, };
	wsprintfA(szMsg, "TLS_CALLBACK2() : DllHandle = %X, Reason = %d\n",
		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() start\n");

	print_console("ThreadProc() end\n");

	return 0;
}
int main()
{
	HANDLE hThread = NULL;
	print_console("main() start\n");

	hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
	WaitForSingleObject(hThread, 60 * 1000);
	CloseHandle(hThread);

	print_console("main() end\n");
	return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1787
活跃值: (2055)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
随意引入一个User32库的函数,比如MessageBox试试。做壳的时候我发现程序如果不引用任何DLL,TLS回调函数在一些版本Windows上会执行一些则不会,我没去深究为何,只是发现引入User32后就都能正常运行了。我不知道你遇到的问题会不会也和这个有这个关系,比如Release版比Debug版少引入一些DLL。这样的现象我还没去深究为何,还请知道的大大指点指点
2019-5-8 14:19
0
雪    币: 910
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
终于解决了 ,按照这篇文章中的写法就可以解决这个问题了https://www.jianshu.com/p/841d360777de
2019-10-14 17:06
0
游客
登录 | 注册 方可回帖
返回
//