title: 汇编达人视频学习7(拓展课:外挂是什么、ESP寻址、EBP寻址、ESP传参的弊端)
date: 2021年8月4日 17点17分
tags: 汇编达人
categories: 汇编达人
24、外挂的本质
1、修改内存中的值
2、调用它的某个函数
25、ESP寻址
1、寄存器传参
函数:
mov eax,ecx
add eax,edx
ret
调用函数:
mov ecx,1
mov edx,2
call 0x地址
2、堆栈传参
当要传递的参数太多,寄存器不够用的时候,就要使用堆栈的方式,进行传参。
push 1
push 2
call 0x地址
0x地址:mov eax,dword ptr ss:【ESP + 4】
add eax,dword ptr ss:【ESP + 8】
ret
这就是通过ESP来达到找到参数或者变量的目的
3、ESP寻址的弊端
ESP是指向当前栈顶的,当用堆栈来传参或者临时存储一些值的时候,栈顶就会变化,当下面继续使用ESP的值去寻找原来的参数或者变量的时候,就要先修正这个变化,不修正的话,找到的值就是错的,或者如果存入的值太多,导致ESP变化很大,需要多次修改,这就很不好操作,这就是ESP寻址的弊端
push 1
push 2
call 0x地址
0x地址:
push ecx
push ebx
push edx
mov ecx,dword ptr ss:【ESP + 10】 //取得第二个参数
add ecx,dword ptr ss:【ESP + 14】 //取得第一个参数
mov eax,ecx
pop edx
pop ebx
pop ecx //栈,后进先出
ret
多了一堆push pop是方便ecx,ebx等寄存器的使用与恢复。
当你需要用到ecx,ebx,edx等寄存器的值的时候,就需要将它们的值存入到堆栈中,push eax ,push ecx等,为什么要存呢?因为函数可能要用到寄存器的值,当函数执行完了之后,寄存器的值可能会丢失。但是后边的程序可能需要用到ecx的值,但是被改了,或者丢失了,程序就坏了。
26、EBP寻址
EBP指向的是栈底。
push 1
push 2
call 0x地址
0x地址:
push ebp //保留原来ebp的值
mov ebp,esp //让ebp指向esp的地址
sub esp,0x10(16个字节) //提升当前堆栈空间,让esp向上移动,这时就有一块自己定义的堆栈空间随意使用
这段代码执行完之后,ebp、esp的变化如图:
这种情况下,如果有影响堆栈的操作的话,改变的是esp的值,而我ebp的值是相对保持不变的。我们就可以通过ebp来寻找其他参数或者变量,就不用多次修改esp的值。
继续上边的代码:
mov eax,dword ptr ss:【ebp + 8】 //取到第二个参数的值
add eax,dword ptr ss:【ebp + c】 //取到第一个参数的值
mov esp,ebp //把esp之前的栈顶的位置,还回去
pop ebp //把之前ebp栈底的地址取出来,放到ebp里
ret 8 //因为上面push 1 ,push 2的时候,改变了堆栈栈顶的地址,或者使用外平栈的方式来恢复。
这样,现在的栈底和栈顶所指向的位置就跟函数执行之前一样,也就是堆栈平衡了。