【文章标题】: WinReplace
【文章作者】: kflnig又名:狂枫
【作者邮箱】: lnig1(at)163.com
【作者QQ号】: 自己都忘了。
【软件名称】: WinReplace
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: fixdbg、PEiD
【操作平台】: WinXP
【难易程度】极易。
【软件介绍】: WinReplace是一款功能强大的多文件字符串替换工具,它可以在不打开文件的情况下,批量地将文件中匹配的字符串一次性替换成您定义的字符串。
【作者声明】:都只要15块钱一个了,有钱的朋友你不要用我的破解序列号了。我写教程,很是害怕误人子弟,大家注意努力发现错误!
【作者期望】:希望小鸟会使用OD所有的功能。
    这几天本来想去捏一个软柿子,谁知被软柿子捏了一把。WINCHM我拿它没辙,只好来拿WINREPLACE来开刀了,没有办法,谁叫它们都姓WIN呢!
    既然没有壳,那么不用DEDE分析的人是傻瓜。
    点击进去目标winreplace,registform赫然在目,一不小心随便点了一下就看到字符串“注册名称和注册号码均不能为空”。很容易找到下面:
/*4B12EF*/  MOV ECX,DWORD PTR SS:[EBP-8];[EBP-8]用户名
/*4B12F2*/  MOV EDX,DWORD PTR SS:[EBP-4];[EBP-4]伪码
/*4B12F5*/  MOV EAX,EBX
/*4B12F7*/  CALL WinRepla.004B1078  ;关键call,踏进去!
/*4B12FC*/  CMP AL,1;注册是否成功的标志位
/*4B12FE*/  JNZ SHORT WinRepla.004B1319
进入关键call,很长很长……大家也不用害怕因为尽是一些相同的call。所以我们可以很快分析完毕。写完此文我有一点感触就是要了解DELPHI等自带的库函数,有必要的话我们真的需要针对它写一写,真的很重要,可以避免让你在call的海洋中打转。我估计这个软件就用了好多。介绍一点经验吧。对于软件大量使用库函数,我一般都是先粗跟踪,步过每个call的时候眼睛紧盯信息窗口。看看有什么发生,一般若是库函数,那么总会有一点动作。很好辨认。所以你不要问我下面我怎么知道它们是在这么干,多数,我就是凭借上面这个方法判别出来的。
用户名:kflnig
伪码:19900501(唉,把我的生日都豁出去了)。只能输入数字不要是英文字符。
004B1128   .  E8 CB35F5FF   CALL WinRepla.004046F8
004B112D   .  8B45 DC       MOV EAX,DWORD PTR SS:[EBP-24]  ; 前四位移入eax
004B1130   .  E8 BF77F5FF   CALL WinRepla.004088F4      ;  前四位的转成数字值
004B1135   .  8BF8          MOV EDI,EAX                   ;  保存在EDI中
004B1137   .  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
004B113A   .  50            PUSH EAX
004B113B   .  B9 02000000   MOV ECX,2
004B1140   .  BA 05000000   MOV EDX,5
004B1145   .  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
004B1148   .  E8 AB35F5FF   CALL WinRepla.004046F8
004B114D   .  8B45 D8       MOV EAX,DWORD PTR SS:[EBP-28]  ;  五六2位
004B1150   .  E8 9F77F5FF   CALL WinRepla.004088F4    ; 五六两位的转成数字值
004B1155   .  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX   ;  保存在[ebp-8]中
004B1158   .  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
004B115B   .  50            PUSH EAX
004B115C   .  B9 02000000   MOV ECX,2
004B1161   .  BA 07000000   MOV EDX,7
004B1166   .  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
004B1169   .  E8 8A35F5FF   CALL WinRepla.004046F8
004B116E   .  8B45 D4       MOV EAX,DWORD PTR SS:[EBP-2C]    ;  七八2位
004B1171   .  E8 7E77F5FF   CALL WinRepla.004088F4      ;  七八两位的转成数字
004B1176   .  8945 F4       MOV DWORD PTR SS:[EBP-C],EAX     ;  放到[ebp-c]中
004B1179   .  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
004B117C   .  8D047F       LEA EAX,DWORD PTR DS:[EDI+EDI*2];相当于eax=edi*3
004B117F   .  E8 3476F5FF   CALL WinRepla.004087B8 ;重要极了,是16进制转10进制
004B1184   .  FF75 D0       PUSH DWORD PTR SS:[EBP-30]
004B1187   .  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
004B118A   .  8B45 F4    MOV EAX,DWORD PTR SS:[EBP-C] ;[EBP-C]来自004B1176
004B118D   .  03C0          ADD EAX,EAX                      ;  eax=eax*2
004B118F   .  E8 2476F5FF   CALL WinRepla.004087B8
004B1194   .  FF75 CC       PUSH DWORD PTR SS:[EBP-34]
004B1197   .  8D55 C8       LEA EDX,DWORD PTR SS:[EBP-38]
004B119A   .  6BC6 0D       IMUL EAX,ESI,0D;ESI中的是用户名长度。
004B119D   .  E8 1676F5FF   CALL WinRepla.004087B8
004B11A2   .  FF75 C8       PUSH DWORD PTR SS:[EBP-38]
004B11A5   .  8D55 C4       LEA EDX,DWORD PTR SS:[EBP-3C]
004B11A8 .  6B45 F8 43  IMUL EAX,DWORD PTR SS:[EBP-8],43;[EBP-8]来自004B1155
004B11AC   .  E8 0776F5FF   CALL WinRepla.004087B8
004B11B1   .  FF75 C4       PUSH DWORD PTR SS:[EBP-3C]
004B11B4   .  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
004B11B7   .  BA 04000000   MOV EDX,4
004B11BC   .  E8 9733F5FF   CALL WinRepla.00404558
004B11C1   .  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14];这里的地址恒为12f214
004B11C4   .  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]
004B11C7   .  E8 1834F5FF   CALL WinRepla.004045E4;EAX须=EDX
004B11CC   . /75 02         JNZ SHORT WinRepla.004B11D0;谁跳谁傻瓜
004B11CE   . |B3 01         MOV BL,1
    好了假如告诉了你那么多,你会怎么办!首先我们必须了解12f214值在哪里变动,我们可以对症下药。
    所以我们如下操作:查看——>监视。
    添加一个监视[12f214],你不会连这个都不能理解吧!
再用OD调试一遍。把注册码改成199005010016。因为假如是19900501,在执行这句MOV EAX,DWORD PTR SS:[EBP-14]后EAX的值会是00 00 00 00。所以我怀疑是注册码不够长。
软件开始有这么写语句:
004B107C   .  B9 07000000   MOV ECX,7
004B1081   >  6A 00         PUSH 0
004B1083   .  6A 00         PUSH 0
004B1085   .  49            DEC ECX
004B1086   .^ 75 F9         JNZ SHORT WinRepla.004B1081
这里就毫不留情的将[12f214]变成了0。OD里调试就可以知道了。当突然执行过这里的时候
004B10E9   .  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
004B10EC   .  E8 0736F5FF   CALL WinRepla.004046F8;这里,这里
004B10F1   .  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
[12f214]变成了00 E9 10 6C。从上面我们知道CALL WinRepla.004046F8有着类似于copy的功能,其实我估计和DELPHI中的copy函数差不多,所以那个值我分外的怀疑。
当我输入d [12f214]的时候一切就揭晓了。
00E9106C  30 30 31 36                                      0016
不用我多说了吧!是伪码8位后截断剩下的东西。
总结一下这个软件的算法。
序列号与用户名无关,与长度有关,输入一个8位数字。假如我们认为前8位是12345678。
那么前4位1234×3=3702;前四位的值×3
7、8两位78×2=156;7、8两位的数值×2
6×13=78;用户名长度×Dh
56×43h=3752;5、6两位的值×43h
依次连接n1,n2,n3,成n。然后真正的序列号就是把8位数字和n。
所以
用户名:kflnig
注册码:123456783702156783752
就注册成功了。
文章到此为止,希望可以混个精华帖。自觉此文非常适合想飞的小鸟。大家给鼓个掌,就为了我写文章的积极。记个时间:2007年2月21日0时45分。破解只花了我半个小时,写文章写了5个小时。