<一> 摘要 software : NomadNews 1.35 home page : http://www.nomadnews.com file name : NN1p35 reg_no : yupie-839521196 : <二> 缘起 一个能自Newsgroup将图档撷取的程式,介面相当简单,没有什麽太复杂的功能,本身还附有 一个相当简单的看图程式但不太好用,功能也不多,可能无法抓取中文,我曾试着抓下tw.b bs上的文章但都是乱码.其实类似的软体很多,但找出它的注册码倒是花了我不少精神,蛮 有趣的.未注册版有只能抓取25篇文章的限制. <叁> 执行情形 (1) 载入soft-ice後执行nomadnew,进入程式後选择register,填入1234567890,Ctrl-d进入so ft-ice後下bpx getwindowtexta指令,按F5重回到注册画面,按下确定soft-ice,马上进入s oft-ice. (2) 按F11後按F12共33次後出现错误画面. (3) 重覆1-2,这次按F12共32次,再来用F10去追. 0137:00419964 CMP EAX,01 0137:00419967 JNZ 004199A0 0137:00419969 SUB ESP,04 0137:0041996C LEA EAX,[EBP-14] 0137:0041996F MOV [EBP-10],ESP 0137:00419972 PUSH EAX 0137:00419973 MOV ECX,[EBP-10] 0137:00419976 CALL 0042DA00 0137:0041997B MOV BYTE PTR [EBP-04],01 0137:0041997F MOV BYTE PTR [EBP-04],00 0137:00419983 MOV ECX,[0043862C] 0137:00419989 CALL 0042C000 ;就是这里啦 0137:0041998E PUSH 00 0137:00419990 TEST EAX,EAX ;只要EAX=0注册失败 0137:00419992 JZ 004199B9 ;下"rfl +z"就出现注册成功的讯息 在137:00419989处按F8切入 0137:0042C000 MOV EAX,FS:[00000000] 0137:0042C006 PUSH EBP 0137:0042C007 MOV EBP,ESP 0137:0042C009 PUSH FF 0137:0042C00B PUSH 0042C189 0137:0042C010 PUSH EAX 0137:0042C011 MOV FS:[00000000],ESP 0137:0042C018 SUB ESP,18 0137:0042C01B MOV EAX,00000039 0137:0042C020 MOV [EBP-24],ECX 0137:0042C023 PUSH EBX 0137:0042C024 MOV ECX,00000036 0137:0042C029 PUSH ESI 0137:0042C02A MOV [EBP-1B],AL ;以下几行将896371196 0137:0042C02D PUSH EDI ;放入记忆体中 0137:0042C02E MOV [EBP-1A],CL ; 0137:0042C031 MOV DWORD PTR [EBP-04],00000000 ; 0137:0042C038 MOV EDX,00000031 ; 0137:0042C03D MOV [EBP-15],AL ; 0137:0042C040 MOV [EBP-17],DL ; 0137:0042C043 MOV [EBP-16],DL ; 0137:0042C046 MOV BYTE PTR [EBP-1C],38 ; 0137:0042C04A MOV EAX,[EBP+08] ;[EBP+08]=1234567890 0137:0042C04D MOV [EBP-14],CL ; 0137:0042C050 MOV BYTE PTR [EBP-19],33 ; 0137:0042C054 MOV BYTE PTR [EBP-18],37 ; 0137:0042C058 MOV BYTE PTR [EBP-13],30 ; 0137:0042C05C MOV EDI,[EAX-08] ;比对输入reg_no长度 0137:0042C05F CMP EDI,0A ;是否大於10 0137:0042C062 JGE 0042C085 ; 到这里我们可能是找到注册码,所以重新回到注册画面,输入896371196结果竟然是不对!所 以再追下去看看. 0137:0042C064 MOV DWORD PTR [EBP-04],FFFFFFFF 0137:0042C06B CALL 0042C193 0137:0042C070 XOR EAX,EAX ;注册失败EAX清除成0 0137:0042C072 MOV ECX,[EBP-0C] 0137:0042C075 POP EDI 0137:0042C076 MOV FS:[00000000],ECX 0137:0042C07D POP ESI 0137:0042C07E POP EBX 0137:0042C07F MOV ESP,EBP 0137:0042C081 POP EBP 0137:0042C082 RET 0004 0137:0042C085 PUSH 2D 0137:0042C087 LEA ECX,[EBP+08] 0137:0042C08A CALL 0042DE68 ;算出输入注册码"-"前的数字 0137:0042C08F CMP EAX,01 ;长度,放入EAX并做比对 0137:0042C092 JL 0042C064 ; 0137:0042C094 SUB EDI,EAX ;算出输入注册码"-"後的数字 0137:0042C096 CMP EDI,0A ;长度,放入EDI并做比对 0137:0042C099 JNZ 0042C064 ; 在此处只要是跳到0042C064则EAX就会被清除成0,然後就是注册失败.那0137:0042C08A的 副程式是做什麽的,如果你追进去的话会发现它会比对你所输入的reg_no是否含有字元"-", 我花了很久才解出这一部分,有兴趣的人可以自己瞧瞧,我就不列出来了. 重新再回到到注册画面,随便输入几组有字元"-"的号码,看看在执行副程式0042DE68後EA X的值.像是12-3456789,而此时EAX=2这不是字元"-"前的数字长度吗!在0042C096中EDI则 是字元"-"後的数字长度,所以我们推得正确的注册码应该是像XXXXXX-123456789的型式. 再回到到注册画面,输入yupie-123456789. 0137:0042C09B PUSH EAX 0137:0042C09C LEA ECX,[EBP+08] 0137:0042C09F LEA EAX,[EBP-10] 0137:0042C0A2 PUSH EAX 0137:0042C0A3 CALL 0042E10E 0137:0042C0A8 LEA ECX,[EBP-10] 0137:0042C0AB DEC EDI 0137:0042C0AC MOV EAX,[EBP-10] 0137:0042C0AF MOV BYTE PTR [EBP-04],01 0137:0042C0B3 MOV ESI,[EAX-08] 0137:0042C0B6 CALL 0042E17A 0137:0042C0BB PUSH EDI 0137:0042C0BC LEA EAX,[EBP-20] 0137:0042C0BF PUSH EAX 0137:0042C0C0 LEA ECX,[EBP+08] 0137:0042C0C3 CALL 0042DDEA 0137:0042C0C8 MOV BYTE PTR [EBP-04],02 0137:0042C0CC XOR ECX,ECX 0137:0042C0CE CMP ESI,ECX ;是否已比对到第五位数 0137:0042C0D0 JLE 0042C0FD ; 0137:0042C0D2 MOV EAX,[EBP-20] ;以下是计算注册码 0137:0042C0D5 MOV EDX,[EBP-10] ; 0137:0042C0D8 MOVSX EDI,BYTE PTR [ECX+EAX] ; 0137:0042C0DC MOVSX EAX,BYTE PTR [ECX+EDX] ; 0137:0042C0E0 LEA EBX,[ECX+55] ; 0137:0042C0E3 XOR EAX,EBX ; 0137:0042C0E5 MOV EBX,0000000A ; 0137:0042C0EA CDQ ; 0137:0042C0EB IDIV EBX ; 0137:0042C0ED MOVSX EDX,DL ; 0137:0042C0F0 SUB EDI,EDX ;这里就是比对点 0137:0042C0F2 CMP EDI,30 ; 0137:0042C0F5 JNZ 0042C111 0137:0042C0F7 INC ECX 0137:0042C0F8 CMP ECX,09 0137:0042C0FB JL 0042C0CE ;进行第六位数字以後的比对 0137:0042C0FD CMP ECX,09 0137:0042C100 JGE 0042C128 0137:0042C102 MOV EAX,[EBP-20] 0137:0042C105 MOV DL,[ECX+EBP-1C] ;正确的reg_no 0137:0042C109 CMP [ECX+EAX],DL ;[ECX+EAX]输入之reg_no 0137:0042C10C JNZ 0042C162 ; 0137:0042C10E INC ECX 0137:0042C10F JMP 0042C0FD 最後得到正确的注册码yupie-839521196. <四> 结论 这个程式挺有意思的,在前面我以为找到了注册码,结果它只用了其中的四个数字,在找到 正确的注册码型式我又花了一些时间,不过也学了不少经验.