前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >调试与反调试系列丨跑的比main快的反调试

调试与反调试系列丨跑的比main快的反调试

原创
作者头像
极安御信安全研究院
发布2022-06-16 15:04:57
4900
发布2022-06-16 15:04:57
举报

作者:小阿栗

首先要了解“进程—线程”的关系

进程:可以理解为一个内存块,是一块虚拟内存。在3环(应用层)的结构是PEB,在内核的结构是EPROCESS。

线程:在CPU上根据时间片进行抢占切换,是为进程工作的。在3环(应用层)的结构是TEB,在内核的结构是ETHREAD。

进程本身没有任何执行能力,只是通过结构来描述。进程创建的时候,一定会有一个主线程运行。运行多线程有很多子线程,子线程的生命周期是由主线程决定的。

今天要讲的反调试是TLS(线程局部存储):可以简单理解为一个线程的CALLBACK。

一般情况:

进程创建->主线程运行代码

如果程序里存在TLS(线程局部存储):

进程创建->主线程创建->执行TLS回调函数->主线程运行代码

我们先来创建一个DLL项目。步骤如下:

1.选择新建项目

2.创建win32控制台应用程序->点击确定

3.勾选空项目,完成

4.新建源文件entry.cpp

5.配置

5.1 选择属性

5.2修改运行库,应用

6.添加#include#include

7.向链接器声明,要使用TLS

8.复制PIMAGE_TLS_CALLBACK里的三个参数

9.完成注册TLS函数的回调

10.重新生成->运行

发现没有运行到main函数

11.加断点,再运行

发现还是运行不起来.但是直接运行,可以正常打印,正常停止

12.试下其他调试器

12.1在od里运行:

发现不能进入主模块

12.2在IDA里打开:

Ida会自动停在main函数上,意味着静态调试也发现不了TLS

动态调试没进入主模块,静态调试看不到。想找到TLS需要先了解一个原理,Windows下可执行文件都是PE文件(包含exe、dll、sys、com等)

PE结构里->数据目录表(常见的导出表、导入表等)->TLS

所以,加入TLS_CALLBACK,在TLS表里会找到TLS回调函数,这是找到TLS回调的一个方法,但是常规方法找不到TLS回调函数。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档