对抗反汇编分析的几种情况

1、插入流氓字节,阻止真正的指令被反汇编

线性反汇编和面向代码流的反汇编:

线性反汇编是遍历一个代码段,一次一条指令的线性反汇编,不考虑代码流的控制指令。而面向代码流的反汇编是会检查每一条指令。然后建立反汇编的地址列表,然后这样的反汇编算法会更加先进,而不易出错。比如:

	.text:00401035                 jz      short near ptr loc_401037+1
	.text:00401037
	.text:00401037 loc_401037:                             ; CODE XREF: .text:00401035j
	.text:00401037                 call    near ptr 8B4C55C7h

观察以上的汇编代码,你会发现jz跳转到了call 指令中间,这显然是不可能的,所以call指令一定是一个数据而不是代码,在此处按d键,然后再观察

​    .text:00401035                 jz      short loc_401038

​ .text:00401035 ; ---------------------------------------------------------------------------
​ .text:00401037 db 0E8h
​ .text:00401038 ; ---------------------------------------------------------------------------
​ .text:00401038
​ .text:00401038 loc_401038: ; CODE XREF: .text:00401035j
​ .text:00401038 mov eax, [ebp+0Ch]

这样显然很正确了,对于call 指令而言,如果后面四个字节跟的是地址,它对应的机器码是0xe8,此处显然是把数据0xe8当成了call指令,才会出现这样的问题。

2、固定条件的跳转指令

                               xor     eax, eax
.text:00401035                 jz      short loc_401038

3、函数指针问题

 mov [ebp+var_4],offset sub_4011c0;
 call [ebp+var_4]

可用IDA脚本语言IDC进行修正函数为AddCodeXref();

4、函数未识别的问题

可以按p键来强制把一段代码变成函数
但是要把流氓字节nop,不然函数可能会出问题。用IDA自带的patch program来做。
也可用脚本ida python 代码如下:

import idaapi
idaapi.CompileLine('static n_key(){ RunPythonStatement("nopIt()");}')
AddHotkey("Alt-N","n_key")
def nopIt():
	start=ScreenEA()
	end=NextHead(start)
	for ea in range(start,end):
		PatchByte(ea,0x90)
	Jump(end)

5、异常触发

  push offset sub_4014c0
  push large dword ptr fs:0
  mov large fs:0,esp
  xor ecx,ecx
  div ecx

属于滥用结构化异常(SEH)来对抗反汇编,通过人为构造一些比如访问一个无效的内存区域,除0等来触发异常,

SEH链是一个函数列表,处理线程的异常,列表中的函数要么处理异常,要么向下传递,如果传递到最后一个异常处理函数,就会被认为是一个不能处理的异常,弹出“an unhandled exception has occurred ”。

查找SEH链,操作系统会检查FS寄存器,这个寄存器中包含一个段选择子,从概念上来讲,链表以栈的方式工作,第一个调用的是最后一个加入链表的记录。前面的例子就是把自己的异常处理加入到链表的头部,然后用除0来触发异常,进而执行自己的代码。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值