逆向windows静态库

list all objs in static library 列出静态库中所有obj

lib staticlibrary.lib /List

export obj from static library 导出指定的obj

lib staticlibrary /EXTRACT:membername

disassemble obj file 反汇编obj

objdump -S membername.obj > membername.asm

标签: windows, assembly
日期: 2016-04-08 17:30:06, 8 years and 282 days ago

堆和栈的布局

+--------------------+ <----高地址
|       ...          |        
+--------------------+ <----栈起始地址
|   栈向低地址增长   |        
|         V          |        
|      自由空间      |        
|         ^          |        
|   堆向高地址增长   |        
+--------------------+ <----堆起始地址
|全局变量            |
|.data已初始化       |
|.bss未初始化        |        
+--------------------+        
|      ...           |        
+--------------------+ <-----低地址

80X86 32位CPU寄存器

  • 数据寄存器:EAX EBX ECX EDX
  • 变址寄存器:ESI EDI
  • 指针寄存器:ESP EBP
  • 段寄存器:ES CS SS DS FS GS
  • 指令急诊寄存器:EIP
  • 标志寄存器:EFlags

函数调用的出入栈保护

堆栈平衡:函数调用前后ESP值是一样的,本质上是保证EIP的一致

call address
address:
 push ebp;esp向下偏移4字节;将ebp的值拷贝至新esp位置
 mov ebp, esp;
 ...
 pop ebp
 ret
  • call address - 函数调用后esp位置存的是eip地址
  • 进入函数后保存ebp值至栈
  • 使ebp为esp此后可随意改变esp和便于使用ebp进行栈内寻址

条件跳转

ZF(zero flag)= EFlags第六位 CF(carry flag)=EFlags第零位

  • jmp jump
  • je,jz jump if (equal) zero 等于则跳转 ZF=1
  • jne,jnz jump if not (equal) zero 不等于则跳转 ZF=0
  • jb jump if below 小于则跳转CF=1
  • jnb jump if not below 不小于则跳转 CF=0
  • ja jump if above 大于则跳转 CF=0且ZF=0
  • jna jump if not above 不大于则跳转 CF=1或ZF=1

函数调用/返回

  • call address相当于push eip和jump address
  • ret 相当于pop eip
  • push xxx 相当于sub esp,4和mov esp,xxx
  • pop xxx 相当于mov [esp], xxx和add esp,4

栈上变量

push ebp
mov ebp,esp
sub esp,048;栈上开辟空间存局部变量和寄存器值
push ebx
push esi
push edi
lea edi,[ebp-0C0h];起始
mov ecx,30h;被重复执行次数
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi] ;rep指令的目的是重复其上面的指令STOS指令的目的是将eax中的值拷贝到ES:EDI指向的地址.

初始化堆栈和分配局部变量,向分配好的局部变量空间放入int3中断,防止栈上内容被意外执行。

参考

http://stackoverflow.com/questions/4024492/can-anyone-help-me-interpret-this-simple-disassembly-from-windbg

标签: assembly
日期: 2013-12-22 17:30:06, 11 years and 25 days ago