zoukankan      html  css  js  c++  java
  • 三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)

    这里能够简单的改动随意函数的返回地址。能够做到自己定义EIP的指向,就可以运行当前进程空间的随意指令,这里仅仅是让大家更清楚栈帧结构,没有涉及跨进程的inline HOOK 等,后面会陆续讲下读取随意进程内存。改动随意进程函数运行流程等方法。

            废话不多说了,直接上菜:     


    #include <stdio.h>
    #include <windows.h>
    
    /* 
    
    打印 main函数的返回地址的值(用途,你懂得!) 
    
    所需知识:函数栈帧结构
    
      C调用约定,自右向左压栈
    
      push argv
      push argc
      call main ; jmp main
    
    
    main:
      push ebp
      mov ebp, esp
      sub esp, 0x4 ; 0x4 == sum (sizeof(type) * count)
    
    
    栈中:
      argv
      argc ; new ebp + 8
      eip  ; main ret 地址 == new ebp + 4
      ebp  ; old ebp value, new ebp postation
      i    ; i 局部变量 == new ebp - 4
    
    
     */
    int main(int argc, char* argv[])
    {
    	int i = 0; // ebp - 4
    
    	__asm {
    
    		mov eax, [ebp + 4]
    		mov i, eax
    
    	}
    
    	printf("%08x
    ",i);
    
    	printf("%p
    ", *(DWORD*)(((DWORD)&argc) - 4));
    
    	printf("%p
    ", *(DWORD*)(((DWORD)&i) + 8));
    	
    	return 0;
    }


    还有以下的调试图。一目了然:




  • 相关阅读:
    封装
    魔术方法类与有关面向对象的关键字
    JS基础
    轮播效果
    进度条效果
    2018年6月
    2018年5月
    Monte Carlo tree search 学习
    2018年4月
    pachi 学习
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6883868.html
Copyright © 2011-2022 走看看