网上有delphi的简单加壳代码(在google上输入'加壳原理与简单实现加壳 delphi',会有一大把)
中间有段asm代码,如下:function AttachStart: dword; stdcall;   //我们定义的待填充数据    
asm    
       pushfd    
       pushad    
       mov eax,$12345678      //将会被自动计算并修改为加密初始地址    
       mov ebx,$1234          //将会被自动计算并修改为加密大小    
       mov ecx,0    
       @AA:    
       xor byte ptr[eax],$50   
       inc eax    
       inc ecx    
       cmp ecx,ebx    
       jbe @aa    
       popad    
       popfd    
       push $12345678        //将会被自动计算并修改为原OEP    
       ret    
end;   其中语句,拆开,都能明白其含义;写在一起,不明白怎么就达到了作者的效果。
'待填充数据'是在 标签 与 跳转 指令间产生的吗?
$12345678和$1234是随便什么值都行的吗?
'mov eax,$12345678      //将会被自动计算并修改为加密初始地址' 这句是否可以理解为:因为eax会自动保存返回值,所以给它什么值都无所谓?(好像也不对)
'push $12345678        //将会被自动计算并修改为原OEP' 这句到最后还要将加密的初始地址压栈?并且还会自动修改为元OEP?希望有耐心的高手帮我把这段代码详细讲解下,主要讲下这些指令在这个function里的实际作用(及 为何要这样做),而不要像一般教程里那样把这些指令功能罗列出来,谢谢。

解决方案 »

  1.   

    关注我也想知道。
    最近在在学BASM
      

  2.   

    默认都是四字节,因为目标寄存器是ebx,在没有使用Word Ptr或者Byte Ptr。
      

  3.   


           @AA:    
           xor byte ptr[eax],$50   
           inc eax    
           inc ecx    
           cmp ecx,ebx    
           jbe @aa 
    那 这段 就是 占位 代码?
      

  4.   

    个人建议还是从基础学起,先从汇编基础学,然后了解PE文件格式,及windows加载可执行文件的过程。
      

  5.   

    他的意思是,操作数$12345678 是占位的,后面程序还要计算,然后修改上去,就是把原来的oep给修改(xor)掉,
    然后的 push $12345678        //将会被自动计算并修改为原OEP     这句不大明白,
      

  6.   

    1、etoep-->X
    2、AttachStart函数地址开始查找$12345678
    3、换$12345678为X
    结果变成这样:
    function AttachStart: dword; stdcall;   //我们定义的待填充数据    
    asm    
           pushfd    
           pushad    
           mov eax,X     //将会被自动计算并修改为加密初始地址    
           mov ebx,$1234          //将会被自动计算并修改为加密大小    
           mov ecx,0    
           @AA:    
           xor byte ptr[eax],$50   
           inc eax    
           inc ecx    
           cmp ecx,ebx    
           jbe @aa    
           popad    
           popfd    
           push X       //将会被自动计算并修改为原OEP    
           ret    
    end;