通过PEiD查找程序的壳什么类型
通过OllyDBG找到入口点,用管理员权限
通过LordPE来脱壳,dump出转储文件
如果运行不了,通过ImportREC修复转出文件的导入表
OllyDBG四个部分
左上角是CPU指令
右上角为寄存器
左下角为内存
右下角为栈
每个框左边为地址,右边为内容
通用寄存器
8086数据寄存器
AX CX DX BX
AX有两个字节,例:AX=1234H
可分AH,AL(高8位,低8位)
EAX为32位寄存器,E为扩展的意思,其中低16位为AX


8086是16位cpu,其物理地址宽度20位
物理地址=段地址*10H+偏移地址

内存寻址方式
段寄存器
段 | 偏移(16b) | 主要用途 |
---|---|---|
CS | IP | 指令寻址 |
SS | SP/BP | 堆栈寻址 |
DS | BX/DI/SI或16位数 | 数据寻址 |
ES | 串指令的DI | 串目标寻址 |
CS:IP
逻辑地址:1000h:500h
物理地址:10500h
命令的地址:CS:IP=CS10H+IP
堆栈指针地址:SS:SP=SS10H+SP
栈底指针地址:SS:BP=SS*10H+BP
mov ax , [bx]
数据地址:AX=[DS*10H+BX]
SI:源变址寄存器,用来存放相对于DS段之源变址指针
DI:目的变址寄存器,用来存放相对于ES段的变址指针
mov ax, [di] [ES*10h+di]
jmp 相当于 mov ip,一个地址
call 相当于
push ip
jmp 函数地址
或
push cs
push ip
jmp 函数地址
ret相当于
pop ip
或
pop ip
pop cs
具体cpu操作:
ip=[ss10h+sp]
sp=sp+2
cs=[ss10h+sp]
sp=sp+2
div
div bx
被除数 | 除数 | 商 | 余数 |
---|---|---|---|
ax | 8b | al | ah |
dx:ax | 16b | ax | dx |
edx:eax | 32b | eax | edx |
标志寄存器


判定CF时,把两者当成无符号数,看是否进位
判定OF时,把两者当成有符号数,看是否进位或借位
执行加法指令ADD:
OF标志位根据操作数的符号及其变化情况来设置:若两个操作数的符号相同,而结果的符号与之相反时,OF=1,否则OF=0。溢出位既然是根据数的符号及其变化来设置的,当然他使用来表示带符号数的溢出的。
执行减法指令SUB:
减法的OF位的设置方法为:若两个数的符号相反,而结果的符号与减数的符号相同,则OF=1,除上述情况外OF=0。OF=1说明带符号数的减法运算结果是错误的。

adc, sbb
adc ax bx (ax=ax+bx+CF)
sbb ax,bx (ax=ax-bx-CF)

80386通用寄存器:
EAX :累加器”(accumulator index), 它是很多加法乘法指令的缺省寄存器。
EBX :”基地址”寄存器(base index), 在内存寻址时存放基地址。
ECX: 计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。 、
EDX: 则总是被用来放整数除法产生的余数。
ESI/EDI :分别叫做”源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串。
EBP:拓展基址指针,指向栈的基本信息,静态指针,通常指向栈底。
ESP:栈顶指针,32位系统通常每次减少4字节。
EIP:扩展指令指针。在调用函数时,这个指针被存储在栈中,用于后面的使用。在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。
ESP:扩展栈指针。这个寄存器指向栈顶的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。
EBP:扩展基指针。这个寄存器在函数的执行过程中通常是保持不变的。它作为一个静态指针使用,用于指向基本栈的信息,例如,使用了偏移量的函数的数据和变量。这个指针通常指向函数使用栈底部。
网友评论