mingw启动项学习
type
status
date
slug
tags
summary
category
icon
password
感觉网上没啥人做,突然有点兴趣稍微看看
版本
mingw-w64-v11.0.0
分析
入口
拿到一个mingw编译的程序,入口点大概长这样:
一般有两个tlscallback和一个maincrtstartup
TlsCallback
带符号的情况下我们可以查看到其分别是_dyn_tls_init函数和_dyn_tls_dtor函数
TlsCallback0
TlsCallback1
_dyn_tls_init
先看源码:
核心是调用了__mingw_TLScallback 函数
这里需要知道:纤程 - 维基百科,自由的百科全书 :纤程(英语:Fiber)是一种最轻量化的线程(lightweight threads)。它是一种用户态线程(user thread),让应用程序可以独立决定自己的线程要如何运作。操作系统内核不能看见它,也不会为它进行调度。
这里遍历了 key_dtor_list 并调用,但 key_dtor_list 怎么直接改也不清楚。
回到 __mingw_TLScallback 函数:
回到dyn_tls_init:,从 __xd_a 这里不断调用函数列表
试图写东西进去用但是写不进去会报错,感觉编译出来也不一定有这段
_dyn_tls_dtor
核心也是调用 __mingw_TLScallback ,如果启用MS_TLS的话有 dtor_list 调用
mainCRTStartup
_security_init_cookie
_security_init_cookie(), windows的机制:https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/security-init-cookie?view=msvc-170,
用于初始化类似windows canary,通过对多个时间、进程信息异或获取一个值存储在全局,逻辑比较简单不重点关注
_tmainCRTStartup
源码:
- 首先是自旋锁的设置,控制资源访问,这部分略过,
- 然后调用init_term,实际上就是从第一个参数的函数指针执行到第二个参数的函数指针
- _pei386_runtime_relocator :似乎是由于pe文件ld的bug加的init函数
- SetUnhandledExceptionFilter 函数:
SetUnhandledExceptionFilter 函数 (errhandlingapi.h)
- 使应用程序能够取代进程每个线程的顶级异常处理程序。
- 调用此函数后,如果在未调试的进程中发生异常,并且异常会将其引入未经处理的异常筛选器,该筛选器将调用 由 lpTopLevelExceptionFilter 参数指定的异常筛选器函数。
参数:
[in] lpTopLevelExceptionFilter
指向顶级异常筛选器函数的指针,每当 UnhandledExceptionFilter 函数获得控制权且进程未调试时,将调用该函数。 此参数的 NULL 值指定 UnhandledExceptionFilter 中的默认处理。
filter 函数的语法类似于 UnhandledExceptionFilter:它采用 LPEXCEPTION_POINTERS 类型的单个参数,具有 WINAPI 调用约定,并返回 LONG 类型的值。 筛选器函数应返回以下值之一。
值 | 含义 |
EXCEPTION_EXECUTE_HANDLER0x1 | 从 UnhandledExceptionFilter 返回 并执行关联的异常处理程序。 这通常会导致进程终止。 |
EXCEPTION_CONTINUE_EXECUTION0xffffffff | 从 UnhandledExceptionFilter 返回 ,并从异常点继续执行。 请注意,筛选器函数可以通过修改通过其 LPEXCEPTION_POINTERS 参数提供的异常信息来自由修改延续状态。 |
EXCEPTION_CONTINUE_SEARCH0x0 | 继续正常执行 UnhandledExceptionFilter。 这意味着遵守 SetErrorMode 标志,或调用“应用程序错误”弹出消息框。 |
返回值
SetUnhandledExceptionFilter 函数返回使用 函数建立的上一个异常筛选器的地址。 NULL 返回值表示当前没有顶级异常处理程序。
注解
发出 SetUnhandledExceptionFilter 将替换调用进程中所有现有线程和所有未来线程的现有顶级异常筛选器。
lpTopLevelExceptionFilter 指定的异常处理程序在导致错误的线程上下文中执行。 这可能会影响异常处理程序从某些异常(如无效堆栈)中恢复的能力。
_set_invalid_parameter_handler
Sets a function to be called when the CRT detects an invalid argument.
Parameters
- [in] pNewThe function pointer to the new invalid parameter handler.
Return Value
A pointer to the invalid parameter handler before the call.
duplicate_ppstrings
编译后被inline,就是把argc 和 argv复制出来
_main:C++初始化函数
找这个function list:__CTOR_LIST__执行,g++里面直接这样调用:
最后是 _tmain 也就是用户main函数,执行后exit结束完整程序
至此,程序基本分析完毕
上一篇
windows 反调试记录
下一篇
windows api记录
Loading...