FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号
得到KERNEL32.DLL基址的方法
FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号
得到KERNEL32.DLL基址的方法
今天在家调试程序,跟进了一个函数kernel32里面的GetVersion函数。最近刚好在学逆向。心一横,干脆把它逆了。
代码如下:
0043846A |. FF15 70F14500 call dword ptr [<&KERNEL32.GetVersion>] ; kernel32.GetVersion
一.C函数调用与堆栈的关系
C语言通过堆栈将参数传入函数内部
push和pop的时候esp用于指向栈顶——栈顶总是栈中地址最小的位置。push则esp减少,pop则esp增加。
二.函数调用规则
定义:函数调用规则是指调用者和被调用函数之间传递参数及返回参数的方法。
Windows上常用的有Pascal方式,WINAPI(_stdcall)方式以及C方式(_cdecl)。
1._cdecl方式
参数入栈:参数从右到左依次入栈
清理方式:函数返回后,调用者负责清理堆栈。这种调用会生成较大的可执行程序。
2._stdcall方式(WINAPI方式)
参数入栈:参数从右到左依次入栈
清理方式:被调用函数在返回前自行清理堆栈。生成代码比_cdecl方式小。
3.Pascal方式
入栈方式:参数从左到右依次入栈
清理方式:被调用函数在返回前自行清理堆栈
不支持可变参数的函数调用
此外Windows内核中还有常见的_fastcall快速调用;c++中有_thiscall方式。
任何调用方式,最终返回值都是写入eax,然后返回。外部从eax中取得返回值。 (全文…)