首页 > 系统相关 >逆向 | windows TLS回调

逆向 | windows TLS回调

时间:2023-04-07 16:25:55浏览次数:48  
标签:TLS 逆向 console windows print msg DWORD 回调

逆向 | windows TLS回调

之前逆向的时候偶尔会碰到tls回调,但是没有自己实现过,今天想着实现一下。
参考的代码来自 逆向工程核心原理。
代码如下:

#include <windows.h>

#pragma comment (linker, "/INCLUDE:__tls_used")

void print_console(char* msg) {
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsoleA(hStdout, msg, strlen(msg), NULL, NULL);
}

DWORD WINAPI ThreadProc(LPVOID lParam) {	
	print_console("thread proc start \n");
	print_console("thread proc end \n");
	return 0;
}

VOID NTAPI TLS_CALLBACK1(PVOID DllHandle, DWORD Reason, PVOID Reversed) {
	char msg[55] = { 0 };
	wsprintfA(msg, "callback1: DllHandle=%X, Reason:%d \n", DllHandle, Reason);
	print_console(msg);
	MessageBox(0, 0, 0, 0);
}
VOID NTAPI TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reversed) {
	char msg[55] = { 0 };
	wsprintfA(msg, "callback2: DllHandle=%X, Reason:%d \n", DllHandle, Reason);
	print_console(msg);
}


#pragma data_seg(".CRT$XLB")
PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] = { TLS_CALLBACK1, TLS_CALLBACK2, 0 };

#pragma data_seg()

int main() {
	print_console("main hello \n");

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

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

有一个很魔幻的事情出现了,我的编译环境是vc6 x86,然后编译完我的tls回调并没有执行。
于是我去查了pe,发现tls回调表的位置上并没有回调函数,回调函数地址呗填写在了一个很靠后的位置(应该是链接器填写的问题)
经过patch以后可以执行回调,ida也能成功识别。
tls表结构可以参考这个文章:https://blog.csdn.net/weixin_30615767/article/details/98577560

主要的结构就是这个:

typedef struct _IMAGE_TLS_DIRECTORY32 
{
    DWORD   StartAddressOfRawData; //  TLS初始化数据的起始地址
    DWORD   EndAddressOfRawData;// TLS初始化数据的结束地址  两个正好定位一个范围,范围放初始化的值
    PDWORD  AddressOfIndex;// TLS 索引的位置
    PIMAGE_TLS_CALLBACK *AddressOfCallBacks;// Tls回调函数的数组指针
    DWORD   SizeOfZeroFill;// 填充0的个数
    DWORD   Characteristics;
} IMAGE_TLS_DIRECTORY32

就是回调数组指针上是一系列回调函数地址,结果链接器给我填错位置了,嗐。

标签:TLS,逆向,console,windows,print,msg,DWORD,回调
From: https://www.cnblogs.com/Mz1-rc/p/17296549.html

相关文章

  • Windows 短文件名相关 - IIS短文件名泄露
    今天接网安通告,说服务器有IIS短文件名泄露。可这短文件名是什么?拿完通告后回来一通查了个遍终于看明白了。先说短文件名是什么资料传说很久很久以前windows的文件名不能超过8个文件名和3个扩展名,也就是12345678.123就是最大长度了。但是到了windows95的时候,这个长度被扩展到......
  • golang TLS方式发送邮件
    packagemailimport( "crypto/tls" "errors" "fmt" "net/smtp" "net/textproto")typeloginAuthstruct{ username,passwordstring}//LoginAuthisfuncLoginAuth(usernamestring,passwordstring)......
  • Linux和Windows操作系统作为服务器之间的对比
     Linux比Windows操作系统更适合服务器= 开源免费:Linux是一个开放源代码操作系统,而WindowsServer是一个专有操作系统,属于商业操作系统,费用比较高。安全性:Linux在安全方面比WindowsServer更强大,这是因为它是开放源代码的,拥有更多的安全功能和选项,也因为它在全球范围内广泛使用,能......
  • frp内网穿透,linux服务器,windows客户端
    一、配置前准备1、下载frp,可以从github上下载下载地址:https://github.com/fatedier/frp/releases2、服务器端(点击名称下载)frp_0.48.0_linux_amd64.tar.gz3、客户端(点击名称下载)frp_0.48.0_windows_amd64.zip 二、将下载的frp文件,上传至linux服务器#进入指定文件夹cd/......
  • windows11安装wsl
    一:安装步骤1:打开电脑的搜索2:搜索框输入:powershell3:点击,自动进入窗口4:输入命令:wsl--install  二:遇到问题输入安装命令后,报错如下图:  三:解决方法控制面板--查看网络状态和任务--更改适配器设置--点击正在连接的网络--双击Internet协议版本4--输入如图2行数字即可......
  • 通过python控制windows窗口的关闭和显示
    代码:importwin32gui,win32con,win32apiimportos,sys,reimportctypesimporttimedefshowWindow(hwnd):#展示窗口,以下几行代码都可以唤醒窗口win32gui.ShowWindow(hwnd,win32con.SW_SHOW)win32gui.ShowWindow(hwnd,win32con.SW_SHOWNA)win32gu......
  • 用python的pywinauto组件控制微信Windows版
    使用pywinauto组件可以比较容易的操纵微信Windows版进行信息发送和接受 前提如下1、已经安装有关python组件。2、微信已经打开和登录,下面的代码不负责登录操作。3、微信版本3.9.2.23具体实现有两个类1、帮助类HelperimportdatetimeclassHelper:"""帮助类......
  • C++逆向分析——this指针
    this指针概述C++是对C的拓展,C原有的语法C++都支持,并在此基础上拓展了一些语法:封装、继承、多态、模板等等。C++拓展新的语法是为了让使用更加方便、高效,这样就需要编译器多做了很多事情,接下来我们就需要一一学习这些概念。封装之前我们学习过结构体这个概念,那么结构体可以......
  • Golang入门教程(一)GOPATH与工作空间(Windows)
    https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md Windows环境:下面我就以mymath为例来讲述如何编写应用包:cd$GOPATH/srcmkdirmymath//我的环境:$GOPATH=c:\mygo新建文件sqrt.go,内容如下://$GOPATH/src/mymath/sqrt.go源码如......
  • 流媒体技术学习笔记之(十一)Windows环境运行EasyDarwin
     流媒体平台框架下载安装Github下载下载地址:https://github.com/EasyDarwin/EasyDarwin/releases解压安装选择Windows安装平台的安装包(下载解压) 把解压生成的文件夹重命名放在本地磁盘,我这里测试放在E盘: 介绍其中的来个批处理文件:start.batWindows调试运......