堆栈传参
当函数需要同时处理多个参数,需要使用堆栈传参满足需求。
例如:同时求5个数的和?
PUSH 1
PUSH 2
PUSH 3
PUSH 4
PUSH 5
CALL 0x00
MOV EAX,DWORD PTR DS:[ESP+0x14]
MOV EAX,DWORD PTR DS:[ESP+0x10]
MOV EAX,DWORD PTR DS:[ESP+0xC]
MOV EAX,DWORD PTR DS:[ESP+8]
MOV EAX,DWORD PTR DS:[ESP+4]
RETN
入栈参数
执行结果
堆栈平衡
- 如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在ret这条指令之前,ESP指向的是我们压入堆栈的指令。
- 如果通过堆栈传递参数了,那么在函数执行完毕后,需要平衡参数导致的堆栈变化。
push 1
push 2
call 0x00xxxxxx
add esp,8 //外平栈
//函数内栈平衡
mov eax, dword ptr ds:[dsp+8]
add eax, dword ptr ds:[dsp+4]
ret
外平栈
push 1
push 2
call 0x00xxxxxx
//函数内栈平衡
mov eax, dword ptr ds:[dsp+8]
add eax, dword ptr ds:[dsp+4]
ret 8 //内平栈
内平栈
外挂思路
- 修改内存
直接修改内存中参数的值
- 跨进程函数调用
自己实现第三方应用跨进程函数调用
使用CE等软件跨进程处理
网友评论