• 三种方法打印 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;
    }


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




  • 相关阅读:
    SQL中的数字格式化 (收藏)
    read about用法
    run into用法
    shoot for用法
    take off用法
    英语成语
    bring up用法
    satisfy with用法
    spend用法
    Linux环境进程间通信:共享内存
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6883868.html
Copyright © 2020-2023  润新知