Windows逆向工程入门之MASM宏与API调用详解

目录

一、MASM宏编程解析

​关键知识点

​二、Windows API调用深度剖析

​关键知识点

​三、拓展知识点


一、MASM宏编程解析

示例代码1:寄存器保存与运算宏

SAVEREG MACRO
    push eax
    push ecx
    ... ; 保存所有通用寄存器
ENDM

ADDREG MACRO num1, num2
    mov  eax, num1
    add  eax, num2
ENDM

main proc
    SAVEREG
    ADDREG 1, 2
    ret
main endp
关键知识点
  1. 宏的作用

    • SAVEREG:保存所有通用寄存器(eaxecxedx等),常用于函数入口保存上下文。
    • ADDREG:将两个操作数相加,结果存入eax
  2. 堆栈平衡问题

    • 错误分析:示例中SAVEREG压入8个寄存器(32字节),但未通过pop恢复,导致ret执行时堆栈指针(ESP)错误,程序崩溃。
    • 修正方法
      RESTOREREG MACRO
          pop edi
          pop esi
          ... ; 逆序恢复寄存器
      ENDM
      main proc
          SAVEREG
          ADDREG 1, 2
          RESTOREREG
          ret
      main endp
    • 优化方案:使用pushad/popad指令一键保存/恢复所有寄存器。
  3. 宏的局限性

    • 参数类型需明确:ADDREG假设num1num2为立即数,若传递内存地址需用[]解引用。

二、Windows API调用深度剖析

示例代码2:MessageBoxA调用

#include <Windows.h>
int main() {
    MessageBoxA(0, "Hello", "0xCC", MB_ABORTRETRYIGNORE);
    return 0;
}
关键知识点
  1. API函数原型

    • 参数约定MessageBoxA使用stdcall调用约定,参数从右向左入栈,由被调用方清理堆栈。
    • 参数详解
      • hWnd: 父窗口句柄,0表示无父窗口。
      • lpText: 消息内容(LPCSTR类型,ANSI字符串)。
      • lpCaption: 标题(同上)。
      • uType: 按钮类型,如MB_ABORTRETRYIGNORE(0x00000002)。
  2. MASM中调用API

    • 声明与链接
      ; 声明API函数
      MessageBoxA PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD
      includelib user32.lib ; 链接库文件
    • 参数传递
      main proc
          push MB_ABORTRETRYIGNORE ; uType
          push offset Caption      ; lpCaption
          push offset Text         ; lpText
          push 0                   ; hWnd
          call MessageBoxA
          ret
      main endp
    • 简化指令:使用invoke自动处理参数顺序和堆栈平衡:
      invoke MessageBoxA, 0, offset Text, offset Caption, MB_ABORTRETRYIGNORE
  3. 逆向工程中的识别

    • 参数布局:通过push指令顺序可判断参数传递顺序。
    • 调用约定:若返回地址后堆栈由被调用方清理,则为stdcall

三、拓展知识点
  1. x86调用约定对比

    约定参数传递堆栈清理典型应用
    cdecl右到左,栈调用方C语言函数
    stdcall右到左,栈被调用方Windows API
    fastcall寄存器和栈被调用方性能敏感场景
  2. 逆向工程技巧

    • 寄存器跟踪:观察eax存储返回值,esp变化判断堆栈平衡。
    • 字符串定位:在.data段查找硬编码字符串(如"Hello"),快速定位关键代码。
    • API断点:通过bp MessageBoxA设置断点,分析调用上下文。
  3. 异常处理

    • 调用API后检查返回值(如eax是否为0),结合GetLastError诊断错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值