美文网首页
对抗反汇编方法

对抗反汇编方法

作者: 看点书 | 来源:发表于2018-05-24 19:48 被阅读0次

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

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

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

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

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

                     xor     eax, eax
    .text:00401035                 jz      short loc_401038
    .text:00401035 ; ---------------------------------------------------------------------------
    .text:00401037                 db 0E8h
    .text:00401038 ; ---------------------------------------------------------------------------
    .text:00401038
    .text:00401038 loc_401038:                             ; CODE XREF: .text:00401035�j
    .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();
    

    3.函数未识别的问题

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

    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)
    

    4,异常触发

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

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

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

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

    相关文章

      网友评论

          本文标题:对抗反汇编方法

          本文链接:https://www.haomeiwen.com/subject/obfejftx.html