知识屋:最实用的电脑技术知识网站
所在位置:首页 > 电脑技术

教你如何反汇编破解、注册机破解

发布时间:2015-03-03 13:47:23作者:知识屋

反汇编有什么用?一般是用来破解软件。当然,如果你技术过硬的话 ,你可以反汇编大部分代码,窃取别人的技术和秘密,可以自己学习,也可以贩卖给别人!

引言:

如果你反汇编学的牛b,说明你的汇编也不差,而且还可以做些一些违|法的行为(lz不建议)。但是技术不成熟之前还是老实点,不然后果严重。

一、注册机

大部分注册算法的原理是:软件或者用户自己触发了软件的注册模块-》软件跳转到注册认证模块。-》弹出注册窗口-》用户输入注册名+注册码A,把它们存放在内存中。然后软件的注册码验证部分根据用户输入的注册名生成正确的注册码B并和用户输入的注册码A做对比。如果结果为相同则注册通过,并运行“注册成功”后面的程序分支,比如解除各种软件限制。如果不相同则提示“无效的注册码,请重新输入!”或者“Invalid key!”等等警告。 

知道了原理,我们只要用SOFTICE和TRW2000等汇编调试软件去做软件的动态反汇编。来找到软件注册部分的入口(这个过程就不细说了,有兴趣去看看汇编调试和软件破解的资料) 

破解: 这时候后如果我们在软件的注册失败的那段代码前面加一个跳转,说得容易理解一点就是:跳过软件注册码验证失败后应该运行的分支,而将它转到注册成功的那个分支上。那么这时候不管你输入的注册码是对是错,都会提示注册成功。直接将它跳到注册通过的那个程序分支上。这是一种破解方式。还有一种就是直接屏蔽注册窗口,这个最简单,在那段窗口代码前面加一个跳转指令。这个适合于那种频繁弹出注册窗口但软件功能并没有限制的注册软件 

注册机: 通过反汇编和调试器跟踪来得到软件的注册码验证部分的汇编代码,然后根据它写出来的逆向算法生成的注册程序。就是注册机了

内存注册机:更简单了,因为经过上面的步骤,你已经知道的那个软件的注册算法。知道它会在做注册认证的时候将用户输入的注册码和正确的注册码做对比。把正确内存里的注册码取出来就OK了。所以内存注册机的使用方法都是:先开注册机,用注册机载入软件。然后你随便输入一个注册码,按确定。软件会提示注册失败,因为你的注册码是错误的。不过这个时候正确的注册码已经被内存注册机截取到了。

二、Delphi语言

1、用PEID等工具查看程序有没有加壳,一般都会有壳的,有专用脱壳工具的就省得麻烦了,直接用工具搞定。没有的话就只能在Ollydbg等动态调试工具中手动脱壳了,建议先到Google或是百度上搜索一下有没有前人脱类似壳的例子。具体过程不多说了。

2、运行脱壳后的程序,看有无自校验,有的话要先解除。一般是在Ollydbg中下CreateFileA、GetFileSize、ReadFile等断点来找到程序的自校验处,可以同时开两个Ollydbg来分别调试脱壳前后的程序,找到关键跳转处修改之。对于一些变态的程序要考虑使用代码Patch技术,即在壳解压完进入OEP前一刻运行自己的patch代码,此是后话。

3、标题中提到了Delphi程序,该是DeDe出场了,它强大的反编译功能我无法用语言描述,用过的人都知道。用DeDe反编译脱壳后的程序,如果不出意外很容易就能看到和Delphi源程序结构类似的汇编代码。通过它很快就能确定各个菜单、控件的事件代码,再在Ollydbg中相应处下断,找出爆破点或是算法代码。DeDe美中不足的是无法显示函数调用(如A函数在程序中具体有哪些地方调用它,有些时候这样的信息非常重要),还好有W32dsm这个静态反汇编工具帮我们解决这个难题。要想实现快速破解Delphi程序,应该DeDe、Ollydbg、W32dsm三者结合起来使用。

三、汇编语言

一、数据传输指令 
─────────────────────────────────────── 
      它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 
      1. 通用数据传送指令. 
          MOV      传送字或字节. 
          MOVSX    先符号扩展,再传送. 
          MOVZX    先零扩展,再传送. 
          PUSH      把字压入堆栈. 
          POP      把字弹出堆栈. 
          PUSHA    把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. 
          POPA      把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. 
          PUSHAD    把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. 
          POPAD    把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. 
          BSWAP    交换32位寄存器里字节的顺序 
          XCHG      交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) 
          CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) 
          XADD      先交换再累加.( 结果在第一个操作数里 ) 
          XLAT      字节查表转换. 
                  ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 
                  0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL ) 
      2. 输入输出端口传送指令. 
          IN        I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) 
          OUT      I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) 
            输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 
            其范围是 0-65535. 
      3. 目的地址传送指令. 
          LEA      装入有效地址. 
            例: LEA DX,string    ;把偏移地址存到DX. 
          LDS      传送目标指针,把指针内容装入DS. 
            例: LDS SI,string    ;把段地址:偏移地址存到DS:SI. 
          LES      传送目标指针,把指针内容装入ES. 
            例: LES DI,string    ;把段地址:偏移地址存到ES:DI. 
          LFS      传送目标指针,把指针内容装入FS. 
            例: LFS DI,string    ;把段地址:偏移地址存到FS:DI. 
          LGS      传送目标指针,把指针内容装入GS. 
            例: LGS DI,string    ;把段地址:偏移地址存到GS:DI. 
          LSS      传送目标指针,把指针内容装入SS. 
            例: LSS DI,string    ;把段地址:偏移地址存到SS:DI. 
      4. 标志传送指令. 
          LAHF      标志寄存器传送,把标志装入AH. 
          SAHF      标志寄存器传送,把AH内容装入标志寄存器. 
          PUSHF    标志入栈. 
          POPF      标志出栈. 
          PUSHD    32位标志入栈. 
          POPD      32位标志出栈. 

二、算术运算指令 
─────────────────────────────────────── 
            ADD      加法. 
          ADC      带进位加法. 
          INC      加 1. 
          AAA      加法的ASCII码调整. 
          DAA      加法的十进制调整. 
          SUB      减法. 
          SBB      带借位减法. 
          DEC      减 1. 
          NEC      求反(以 0 减之). 
          CMP      比较.(两操作数作减法,仅修改标志位,不回送结果). 
          AAS      减法的ASCII码调整. 
          DAS      减法的十进制调整. 
          MUL      无符号乘法. 
          IMUL      整数乘法. 
            以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), 
          AAM      乘法的ASCII码调整. 
          DIV      无符号除法. 
          IDIV      整数除法. 
            以上两条,结果回送: 
                商回送AL,余数回送AH, (字节运算); 
            或    商回送AX,余数回送DX, (字运算). 
          AAD      除法的ASCII码调整. 
          CBW      字节转换为字. (把AL中字节的符号扩展到AH中去) 
          CWD      字转换为双字. (把AX中的字的符号扩展到DX中去) 
          CWDE      字转换为双字. (把AX中的字符号扩展到EAX中去) 
          CDQ      双字扩展.      (把EAX中的字的符号扩展到EDX中去) 

三、逻辑运算指令 
─────────────────────────────────────── 
            AND      与运算. 
          OR        或运算. 
          XOR      异或运算. 
          NOT      取反. 
          TEST      测试.(两操作数作与运算,仅修改标志位,不回送结果). 
          SHL      逻辑左移. 
          SAL      算术左移.(=SHL) 
          SHR      逻辑右移. 
          SAR      算术右移.(=SHR) 
          ROL      循环左移. 
          ROR      循环右移. 
          RCL      通过进位的循环左移. 
          RCR      通过进位的循环右移. 
            以上八种移位指令,其移位次数可达255次. 
                移位一次时, 可直接用操作码.    如 SHL AX,1. 
                移位>1次时, 则由寄存器CL给出移位次数. 
                  如    MOV CL,04 
                      SHL AX,CL 

四、串指令 
─────────────────────────────────────── 
               DS:SI    源串段寄存器    :源串变址. 
              ES:DI    目标串段寄存器:目标串变址. 
              CX        重复次数计数器. 
              AL/AX    扫描值. 
              D标志    0表示重复操作中SI和DI应自动增量; 1表示应自动减量. 
              Z标志    用来控制扫描或比较操作的结束. 
          MOVS      串传送. 
              ( MOVSB    传送字符.      MOVSW    传送字.      MOVSD    传送双字. ) 
          CMPS      串比较. 
              ( CMPSB    比较字符.      CMPSW    比较字. ) 
          SCAS      串扫描. 
              把AL或AX的内容与目标串作比较,比较结果反映在标志位. 
          LODS      装入串. 
              把源串中的元素(字或字节)逐一装入AL或AX中. 
              ( LODSB    传送字符.      LODSW    传送字.      LODSD    传送双字. ) 
          STOS      保存串. 
              是LODS的逆过程. 
          REP              当CX/ECX<>0时重复. 
          REPE/REPZ        当ZF=1或比较结果相等,且CX/ECX<>0时重复. 
          REPNE/REPNZ      当ZF=0或比较结果不相等,且CX/ECX<>0时重复. 
          REPC            当CF=1且CX/ECX<>0时重复. 
          REPNC            当CF=0且CX/ECX<>0时重复. 

五、程序转移指令 
─────────────────────────────────────── 
       1>无条件转移指令 (长转移) 
          JMP      无条件转移指令 
          CALL      过程调用 
          RET/RETF过程返回. 
      2>条件转移指令 (短转移,-128到+127的距离内) 
          ( 当且仅当(SF XOR OF)=1时,OP1<OP2 ) 
          JA/JNBE 不小于或不等于时转移. 
          JAE/JNB 大于或等于转移. 
          JB/JNAE 小于转移. 
          JBE/JNA 小于或等于转移. 
            以上四条,测试无符号整数运算的结果(标志C和Z). 
          JG/JNLE 大于转移. 
          JGE/JNL 大于或等于转移. 
          JL/JNGE 小于转移. 
          JLE/JNG 小于或等于转移. 
            以上四条,测试带符号整数运算的结果(标志S,O和Z). 
          JE/JZ    等于转移. 
          JNE/JNZ 不等于时转移. 
          JC        有进位时转移. 
          JNC      无进位时转移. 
          JNO      不溢出时转移. 
          JNP/JPO 奇偶性为奇数时转移. 
          JNS      符号位为 "0" 时转移. 
          JO        溢出转移. 
          JP/JPE    奇偶性为偶数时转移. 
          JS        符号位为 "1" 时转移. 
      3>循环控制指令(短转移) 
          LOOP              CX不为零时循环. 
          LOOPE/LOOPZ      CX不为零且标志Z=1时循环. 
          LOOPNE/LOOPNZ    CX不为零且标志Z=0时循环. 
          JCXZ              CX为零时转移. 
          JECXZ            ECX为零时转移. 
      4>中断指令 
          INT      中断指令 
          INTO      溢出中断 
          IRET      中断返回 
      5>处理器控制指令 
          HLT      处理器暂停, 直到出现中断或复位信号才继续. 
          WAIT      当芯片引线TEST为高电平时使CPU进入等待状态. 
          ESC      转换到外处理器. 
          LOCK      封锁总线. 
          NOP      空操作. 
          STC      置进位标志位. 
          CLC      清进位标志位. 
          CMC      进位标志取反. 
          STD      置方向标志位. 
          CLD      清方向标志位. 
          STI      置中断允许位. 
          CLI      清中断允许位. 

六、伪指令 
─────────────────────────────────────── 
          DW        定义字(2字节). 
          PROC      定义过程. 
          ENDP      过程结束. 
          SEGMENT 定义段. 
          ASSUME    建立段寄存器寻址. 
          ENDS      段结束. 
          END      程序结束. 

(文章内容如有侵权,敬请来信告知,我们将及时撤销)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜