这篇网友chengnet帮了不少忙,另外chengnet你说你也post一篇flmask3.0,可是我没 瞧见啊,难道是我漏掉了吗,有人收到吗?能不能私下寄给我呢? 最近想在HC里组个"次级团体",大家把自己目前正在研究的软体名与遭遇的困难提出 来,当然也附上一些已经得到的结果,大家互相交换帮忙瞧瞧,因为有时候大家在解的 或有兴趣的软体不见得相同,所以有此想法.有兴趣的不妨留信给我. 另外chengnet,rzsplit的" 体"现在还在我硬碟里,没办法最近一堆死党来求"解", 只好些搁一边,还有一堆东西想整理出来post,星期天我再来研究研究........ ------------------------------------------------------------------------------ <一> 摘要 software : flmask 3.00 home page : http://www.advancetrend.com/flmask/index.htm file name : flmsk30e.exe reg_name : yupie reg_no : 61000001 <二> 缘起 这是能将图档加上还原性马赛克的程式,大概有在抓图的的望有应该都晓得这个程式,我原 先对它能解码赛克感到十分有兴趣,抓回来研究後才恍然大悟,它是能解码赛克,但必须是 由它所做出来的马赛克!所以应该是程式本身将图档的资料做编码产生马赛克,所以只要晓 得它的编码方式自然有办法将马赛克还原,就如同由reg_name去算出reg_no一样!这个程式 也不难,我又用了些时间找出为何00000000不是正确注册码,当然整理出结果是最费时间的. <叁> 执行情形 (1) 载入soft-ice後执行flmsk32,一进入程式後就先秀出注册画面,选择registration,在姓名 处填入yupie,注册号码填入12345678,Ctrl-d进入soft-ice後下bpx hmemcpy指令,按F5重 回到注册画面,按下确定soft-ice,马上进入soft-ice. (2) bd *,按F12共13次後出现错误画面. (3) 重覆1-2,这次按F12共12次,再来用F10去追. (4) 0137:00452CFD MOV EAX,[EBP-08] ;[EBP-08] reg_name 0137:00452D00 CALL 00403BCC ;reg_name长度EAX 0137:00452D05 CMP EAX,02 0137:00452D08 JLE 00452E99 ;输入reg_name长度若小於2则无法注 册 0137:00452D0E LEA EDX,[EBP-08] 0137:00452D11 MOV EAX,[EBX+00000208] 0137:00452D17 CALL 00420A90 0137:00452D1C MOV EAX,[EBP-08] ;[EBP-08] reg_no 0137:00452D1F CALL 00443118 0137:00452D24 TEST AL,AL 0137:00452D26 JZ 00452E89 ;若AL是00则注册失败 按F8切入00443118里看看 0137:00443118 PUSH EBP 0137:00443119 MOV EBP,ESP 0137:0044311B ADD ESP,-0C 0137:0044311E PUSH EBX 0137:0044311F PUSH ESI 0137:00443120 XOR EDX,EDX 0137:00443122 MOV [EBP-0C],EDX 0137:00443125 MOV [EBP-04],EAX 0137:00443128 MOV EAX,[EBP-04] 0137:0044312B CALL 00403D80 0137:00443130 XOR EAX,EAX 0137:00443132 PUSH EBP 0137:00443133 PUSH 00443227 0137:00443138 PUSH DWORD PTR FS:[EAX] 0137:0044313B MOV FS:[EAX],ESP 0137:0044313E MOV BYTE PTR [EBP-05],00 0137:00443142 MOV EAX,[EBP-04] 0137:00443145 CALL 00403BCC 0137:0044314A CMP EAX,08 ;比对输入reg_no 0137:0044314D JNZ 00443209 ;长度是否是8 0137:00443153 XOR ESI,ESI 0137:00443155 MOV BX,0003 0137:00443159 LEA EAX,[EBP-0C] 0137:0044315C PUSH EAX 0137:0044315D MOVZX EDX,BX 0137:00443160 MOV ECX,00000001 0137:00443165 MOV EAX,[EBP-04] 0137:00443168 CALL 00403DD0 0137:0044316D MOV EAX,[EBP-0C] ;将输入之reg_no由第叁位 0137:00443170 MOV AL,[EAX] ;起依序放入AL 0137:00443172 XOR EDX,EDX 0137:00443174 MOV DL,AL ;放入DL 0137:00443176 MOV ECX,EDX 0137:00443178 IMUL ECX,EDX ;计算平方数 0137:0044317B ADD ESI,ECX ;而後放入ESI 0137:0044317D INC EBX 0137:0044317E CMP BX,09 ;判断是否是reg_no最後一位 0137:00443182 JNZ 00443159 ;不是则进行下一位的计算 0137:00443184 AND ESI,800000FF ;取平方总合的最後两位数 0137:0044318A JNS 00443194 0137:0044318C DEC ESI 0137:0044318D OR ESI,FFFFFF00 0137:00443193 INC ESI 0137:00443194 LEA EAX,[EBP-0C] 0137:00443197 PUSH EAX 0137:00443198 MOV ECX,00000002 0137:0044319D MOV EDX,00000001 0137:004431A2 MOV EAX,[EBP-04] 0137:004431A5 CALL 00403DD0 0137:004431AA LEA EDX,[EBP-0C] ;[EBP-0C]输入reg_no之前二位 0137:004431AD XOR ECX,ECX 0137:004431AF MOV EAX,00443240 0137:004431B4 CALL 00403E58 0137:004431B9 OR EDX,-01 0137:004431BC MOV EAX,[EBP-0C] ;EAX放入输入reg_no之前二位数 0137:004431BF CALL 004076A4 ; 0137:004431C4 CMP ESI,EAX ;比对输入前二位是否等於後六位平 0137:004431C6 JNZ 00443209 ;方总合的末二位数,不是则注册失败 所以正确注册码是8位数字,且前两位数应该等於後六数平方总合的末二位数,例如610000 01,C4000002,当然00000000应该也可以,但输入後却得到失败的讯息,不管输入的是61000 001或00000000在0137:00452D24处EAX的内容均相同,所以我们继续追下去,一直到0137:0 0452D4E 时出现不同的结果,所以由此按F8切入. 0137:00452D1F CALL 00443118 0137:00452D24 TEST AL,AL 0137:00452D26 JZ 00452E89 0137:00452D2C LEA EDX,[EBP-04] 0137:00452D2F MOV EAX,[EBX+000001FC] 0137:00452D35 CALL 00420A90 0137:00452D3A LEA EDX,[EBP-08] 0137:00452D3D MOV EAX,[EBX+00000208] 0137:00452D43 CALL 00420A90 0137:00452D48 MOV EAX,[EBP-08] 0137:00452D4B LEA EDX,[EBP-04] 0137:00452D4E CALL 00443700 0137:00452D53 TEST AL,AL ;输入注册码为00000000时 0137:00452D55 JZ 00452E79 ;在此处会JUMP 00452E79 按F8切入0137:00452D4E 0137:00443700 PUSH EBP 0137:00443701 MOV EBP,ESP ..... 0137:00443750 LEA EAX,[EBP-08] 0137:00443753 MOV DL,35 0137:00443755 CALL 00442FB0 ;算出注册码47017690 0137:0044375A MOV EAX,[EBP-04] ;输入注册码放入EAX 0137:0044375D MOV EDX,[EBP-08] ;47017690放入EDX并与 0137:00443760 CALL 00403CDC ;输入注册码比对 0137:00443765 JNZ 0044377F ; 接下来还会有叁组号码33023792,0D024403,00000000,被挡掉,方式也是相同的,我就不浪 费篇幅了.其实在比对注册码若相同後面还会有一个"很像"是比对reg_name的地方,但它并 不是直接比对reg_name,而是将reg_name的位址与另一位址做比对,至於为何如此做我就不 晓得了.更有趣的是如果你输入的是这四组号码,显示出的讯息是reg_name错误,有兴趣的 人可以去找找看这些reg_name. (5) 最後重新执行flmask,填入yupie/61000001完成注册.如果有人嫌麻烦也可以用修改的方式. ========================== FLMASK32.EXE search : 0F 84 5D 01 00 00 replace: 74 04 90 90 90 90 ========================== 随意输入任何数字即可. <四> 结论 这个程式会挡掉四个注册码,00000000,,,但显示出来的讯息却是要你输入正确的reg_nam e,而其实在程式里也有"类似"比对reg_name的地方,我一直想找出reg_name但还是失败,不 晓得有没有人要接棒?最後感谢网友chengnet的"友情指点",帮了我不少忙,Thanks a lot!