新手破解练习Crackme160之094 - JuNkLe-Serial

这个程序是NE格式的无法在32位以上机器运行, 复制到xp中可以运行
我们用ida反编译分析一下, 搜索文本"Enter Your"很快就在cseg01:007B 行看到了,

cseg01:0058 PROGRAM         proc near
cseg01:0058                 call    INITTASK
cseg01:005D                 call    @__SystemInit$qv ; __SystemInit(void)
cseg01:0062                 call    @__WinCrtInit$qv ; __WinCrtInit(void)
cseg01:0067                 push    bp
cseg01:0068                 mov     bp, sp
cseg01:006A                 xor     ax, ax
cseg01:006C                 call    @__StackCheck$q4Word ; Stack overflow check (AX)
cseg01:0071                 call    @ClrScr$qv      ; ClrScr(void)
cseg01:0076                 mov     di, offset unk_2456
cseg01:0079                 push    ds
cseg01:007A                 push    di
cseg01:007B                 mov     di, offset aEnterYourGiven ; "Enter Your Given Serial Nr = "
cseg01:007E                 push    cs
cseg01:007F                 push    di
cseg01:0080                 push    0
cseg01:0082                 call    @Write$qm4Textm6String4Word ; Write(var f; s: String; width: Word)
cseg01:0087                 call    @WriteLn$qm4Text ; WriteLn(var f: Text)
cseg01:008C                 call    @__IOCheck$qv   ; Exit if error
cseg01:0091                 mov     di, offset unk_2356
cseg01:0094                 push    ds
cseg01:0095                 push    di
cseg01:0096                 call    @Read$qm4Text4Real ; Read(var f; var v: Real{DX:BX:AX})
cseg01:009B                 mov     word_2286, ax
cseg01:009E                 mov     word_2288, bx
cseg01:00A2                 mov     word_228A, dx
cseg01:00A6                 call    @ReadLn$qm4Text ; ReadLn(var f: Text)
cseg01:00AB                 call    @__IOCheck$qv   ; Exit if error
cseg01:00B0                 mov     ax, word_2286
cseg01:00B3                 mov     bx, word_2288
cseg01:00B7                 mov     dx, word_228A
cseg01:00BB                 xor     cx, cx
cseg01:00BD                 xor     si, si
cseg01:00BF                 xor     di, di
cseg01:00C1                 call    @__Cmp$q4Realt1 ; Compare two reals
cseg01:00C6                 ja      short loc_F2
cseg01:00C8                 mov     di, offset unk_2456
cseg01:00CB                 push    ds
cseg01:00CC                 push    di
cseg01:00CD                 mov     di, offset aFuckYouFucking ; "Fuck, you fucking did it"
cseg01:00D0                 push    cs
cseg01:00D1                 push    di
cseg01:00D2                 push    0
cseg01:00D4                 call    @Write$qm4Textm6String4Word ; Write(var f; s: String; width: Word)
cseg01:00D9                 call    @WriteLn$qm4Text ; WriteLn(var f: Text)
cseg01:00DE                 call    @__IOCheck$qv   ; Exit if error
cseg01:00E3                 mov     di, offset unk_2356
cseg01:00E6                 push    ds
cseg01:00E7                 push    di
cseg01:00E8                 call    @ReadLn$qm4Text ; ReadLn(var f: Text)
cseg01:00ED                 call    @__IOCheck$qv   ; Exit if error
cseg01:00F2
cseg01:00F2 loc_F2:                                 ; CODE XREF: PROGRAM+6Ej
cseg01:00F2                 mov     ax, word_2286
cseg01:00F5                 mov     bx, word_2288
cseg01:00F9                 mov     dx, word_228A
cseg01:00FD                 mov     cx, 81h ; '
cseg01:0100                 xor     si, si
cseg01:0102                 xor     di, di
cseg01:0104                 call    @__Cmp$q4Realt1 ; Compare two reals
cseg01:0109                 jb      short locret_135
cseg01:010B                 mov     di, offset unk_2456
cseg01:010E                 push    ds
cseg01:010F                 push    di
cseg01:0110                 mov     di, offset aNopeWrongSeria ; "Nope Wrong Serial M..... ....."
cseg01:0113                 push    cs
cseg01:0114                 push    di
cseg01:0115                 push    0
cseg01:0117                 call    @Write$qm4Textm6String4Word ; Write(var f; s: String; width: Word)
cseg01:011C                 call    @WriteLn$qm4Text ; WriteLn(var f: Text)
cseg01:0121                 call    @__IOCheck$qv   ; Exit if error
cseg01:0126                 mov     di, offset unk_2356
cseg01:0129                 push    ds
cseg01:012A                 push    di
cseg01:012B                 call    @ReadLn$qm4Text ; ReadLn(var f: Text)
cseg01:0130                 call    @__IOCheck$qv   ; Exit if error

从上面代码可以看到 输入的数需要对比

cseg01:00B0                 mov     ax, word_2286
cseg01:00B3                 mov     bx, word_2288
cseg01:00B7                 mov     dx, word_228A

这三个数应该就是关键所在了, 双击word_2286可以跳转到其定义处

dseg03:00E5                 db  0Ah
dseg03:00E6 word_2286       dw 0                    ; DATA XREF: PROGRAM+43w
dseg03:00E6                                         ; PROGRAM+58r ...
dseg03:00E8 word_2288       dw 0                    ; DATA XREF: PROGRAM+46w
dseg03:00E8                                         ; PROGRAM+5Br ...
dseg03:00EA word_228A       dw 0                    ; DATA XREF: PROGRAM+4Aw
dseg03:00EA                                         ; PROGRAM+5Fr ...
dseg03:00EC unk_228C        db    0                 ; DATA XREF: InitWinCrt(void)+14o
dseg03:00EC                                         ; unknown_libname_27:loc_F34o ...

可以看到这三个数都是0, 那我们就看一下注册码是不是就是3个0?
我们输入验证, 完成正确, 再试了一下, 不管输入几个0也是对的~ 具体算法没看太明白, 就这么稀里糊涂的破解了~ 因为OD无法调试, 也这么着了吧_

 
 
 
这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-07-08 09:49  hankerstudio  阅读(14)  评论(0)    收藏  举报