一杯酸汇编

一.反编译器一般会首先反编译紧随CALL调用的字节,其次才是CALL调用处的字节(反编译器会优先反编译条件false分支处的代码)

   1.一个CALL+字符后面接POP和代码:

CALL                     h   e    l    l   o         POP RET

E8 06 00 00 00 68 65 6c 6c 6F 00  58   C3  

 

   2.相同目标的跳转指令

jz + jnz
指令后面跟一个call xxx ,这样编译器会先处理跳转后的指令,将call视为指令

  3.用固定跳转的跳转来干扰

xor eax,eax   +  jz xxx  在jz后写0xE8

 

 

二,无效的汇编(NOP指令变形)

  1.

         E8    FF   C0    48一杯酸汇编_第1张图片

 

   2.

     一杯酸汇编_第2张图片

    66 B8  EB  05  31  C0  74  FA  E8

 

三.利用函数指针(干扰IDA F5)

1.

var_4 为 -4

call $5

add[esp + 4 +var_4],5         //相当于add [esp],5 ,因为CALL所以栈上为add的地址,+5后就刚好跳过retn                                  

retn

 

 

2.

sub esp,8

sub esp,4

cmp esp,1000h          //因为windows的最低内存页不可能被栈使用

jl  混淆处代码

add esp,4                    //还原        

jmp 正确地方

混淆处:add esp,104h   

正常代码

IDA会直接分析跳转到混淆处,进行add esp,104h从而破坏栈帧

 

四,运用结构化异常处理(SEH)

 

五.

Call 地址
xchg dword ptr [esp], 寄存器
pop 上面使用的寄存器...

eg.
0053A18F    E8 0E1E0000        call    0053BFA2                        
0053BFA2    871C24             xchg    dword ptr [esp], ebx            

005448F9                       pop     ebx                     

 

六.

---->push ebp

push ebx

mov ebx,ebp

xchg dword ptr [esp],ebx

 

----> push ecx

xchg    dword ptr [esp],ebp

mov ecx,ebp

pop ebp

 

----->push number

push ebx

push number

pop ebx

add ebx,xxx

sub ebx,xxx

and ebx,xxx        //一系列的计算操作

xchg dword ptr [esp],ebx

 

---->mov eax,edx

push edx

pop eax

 

call pop变形

这样来获取到CALL下面的地址+1:展开后:

 

 

 

你可能感兴趣的:(逆向)