首页

软件调试论坛众多朋友的呕心之作,汇集国内密界一流好手,展示软件调试最深处。

1. 本论坛精华手册由收集了看雪技术论坛 2000.9.1 ～ 2001.9.8 期间的精华内容，共936余篇原创文章。
2. 本论坛精华手册中的所有内容，个人用户可以免费的收藏、参考，但是谢绝任何商业网站及传统媒体（如出版物）摘编转载！！！
3. 未经看雪学院的授权许可，任何人不得擅自进行篡改、反编译，及将其全部或部分用于商业用途或把本精华手册收录到出版物内。
4. 本精华手册内收录的帖子及图片的相关版权归各版权所有人所有。
5. 欢迎在保持论坛精华手册的完整下散发该教学包。
6. 本精华手册所有文章仅为学习研究软件内含的设计思想和原理。对于您使用本精华中技术所导致的一切后果我们不负任何责任！
7. 特别感谢论坛中的各位版主在论坛辛勤的工作及所有网友对论坛的支持，没有你们的帮助，论坛是无法得到发展及壮大的，也感谢所有将自己的经验无私奉献的朋友们。
8. 其他各类事宜，所有解释权归看雪学院及其论坛或相关的论坛注册用户所有。
书号：5053-6923-7/TP.3948
出版日期：2001年9月
出版单位：电子工业出版社
由本站与广大网友合作的新书《加密与解密--软件保护技术与解决方案》上市，全国新华书店发行，需要者可到本地各大书店咨询。
不论是解密爱好者还是软件编程者都应该好好去看看。

发行团体：看雪学院
本站域名：http://www.pediy.com
发布时间：2001年9月8日

Copyright © 2000-2002 KanXue Studio All Rights Reserve


关于看雪学院

` 关于看雪学院 看雪学院
  • 看雪学院简介

        看雪学院是一个非商业性质的纯技术站点，致力于软件的加密与解密研究。本站的目的是推动国内的加密与解密技术发展，希望通过我们的努力，为广大的加解密爱好者提供一个交流场所。看雪学院提供的所有资源，仅限于个人及教育用途，决非为任何商业目的。
        看雪学院创建于2000年元月，这个主页是当时国内惟一一个从技术角度研究加解密的站点。在这几年的发展历程中，我们得到了无数朋友的关心和支持，在我们最困难的时候，始终有很多朋友在关注、支持着看雪学院。看雪学院提供的技术论坛（看雪技术论坛）成了国内知名的加解密技术论坛，吸引了密界众多高手，大家以知识共享的精神，无私地将自己所知的技术奉献出来了，原创了几千余篇文章，极大地推动了国内加解密技术发展。
        加密与解密技术在相辅相成中不断发展，既没有无坚不摧的矛，也不会有坚不可摧的盾。一个不熟悉敌手的战士不会有太多的胜利机会，不熟悉解密技术的软件开发者，也很难开发出更加先进的保护技术。希望读者看过本精华集后，能够对当今流行的各种软件保护技术及破解技术有所了解，避免在软件保护上犯一些常识性的错误。
  • 联系我们

    • 　　看雪学院: http://www.pediy.com

    ©2000-2004 PE diy.com All rights reserved.
    By KanXue Studio


序言

试论crack的几个问题
——论坛精华3之前言

首先向我们辛勤的看雪老兄致敬！因为我们一直期待的精华3和大家见面了！

前些日子在QQ里不自量力的答应看雪写精华3的前言，由于工作上的一些原因直到今天才动笔，也只是在这个时候才真正体会到这确实是一件苦差事，也许是大家对这个集子的期望值之高所给的压力吧，因为看雪学院的东西必是精品已经不知不觉成了圈里人的共识。

在这里要插一句，大家完全可以跳过这个前言来看里面内容绝对没有丝毫的影响。如果下面的罗嗦您认为对您还有一些帮助的话那将是我的荣幸！

很让人高兴的是一批又一批的拆解高手从看雪学院诞生，国内的cracker达到了空前的数量，这在以前是很难想象的。同时也随之带来了些这样和那样的问题。今天借这个机会想和大家简单聊聊几个关于cracker的话题。

先聊聊所谓的CRACK精神吧，这种精神不象HACK精神，并没有在网络上形成一种统一的说法，笼统的说，其实这是一种自由的精神，CRACKER最关心的是程序的保护方式和加密思想及其可能存在的漏洞。正如TIANWEI所说：“其实我这个网页也是说明一个道理，这个时代，没有什么不是自由的！信息化的变革敲打着每家每户的门窗……”所以说，crack不等于盗版，至于个别的个人行为我们无权说三道四，但也不希望个别的行为使人们对CRACK曲解。

其次，让我们搞清楚作为一名CRACKER最需要具备的基本条件。其实那并不是扎实的汇编功底和编程基础。你可以完全不懂这些，crack的秘诀就是勤奋+执著！记住并能做到这两点你一样可以变的优秀。cracking是一个枯燥无味而漫长的过程这点大家都很清楚所以关于执著没什么多说的。但关于勤奋我想就不是每一个人都能做好的了，我很难想象在论坛上对别人要求这要求那，只要一不满足他的要求就破口大骂的主儿。要知道兴趣的东西是勉强不得的，好些东西人家写出来是仁义，不写呢是本分，没有人有什么责任和义务去做这些事情。一些问题劝大家还是先自己试着动手解决解决实在不行了再去问别人，因为这样不会使你在顺利得到解答的同时失去独自解决问题的成就和快感。要知道没有很好的自学和动手能力你就不会走的更远。

第三，cracker的几个阶段。（关于这点我记得在论坛里有提过）所谓阶段也是人为划分的，所以它们之间并没有太严格的界限，我们只以破解注册码保护形式的程序笼统的说说。

第一个阶段应该算是爆破的阶段（暂不考虑加壳的因素），绝大多数软件都可以通过修改来得到破解，它需要我们大致了解程序加密的过程并准确的找到其判断点，由于一些现成的工具和经验使我们找这些近乎成为机械的运动（尤其是在WINDOWS下的软件）所以爆破一个软件变的相对容易，但不是说一定是容易的。我认为最经典的爆破对象就是一个模拟器软件，如果你知道我说的是哪一个的话可以去研究研究它的加密。

如果有一天你不是一上来就是拿着斧头砍来砍去而是从内存里嗅出了一串儿注册码的话，那就恭喜你进阶了。

第三个阶段应该是追出非明码比较的注册码了，它们通常多为多条件和计算型形式，这个时候你要拿出笔和纸来，在搞清楚部分算法的同时，找到合适的断点让软件的自动计算和你的手动计算结合一起算出注册码来。

第四个阶段就是作出通用的注册机。这需要你完全搞明白注册算法和加密原理。通常这个过程是非常痛苦的。如果你对自己充满信心想体会一下的话那最好的选择就是AJJ的CRACKME2——层层设防了。通常到这个时候你就可以算是一名高手了。

第五个阶段就是学习掌握一定的密码学知识，并了解常见的公共加密算法，做出利用成熟加密算法或密码学原理加密软件的注册机或提出解决之方法。如果你能达到这个境界，那么恭喜你可以成为一名职业选手了，你将和世界最知名的CRACKER平起平坐。

其实有时候我们能做出其中一个软件的注册机却不能爆破另一个，这也是很常见的现象，因为各阶段并没有太明显的界限嘛，所以我们只是大概对号入座。

第四，学做CRACKER。如果你是一名CRACKER，那请听我句劝，千万不要狂妄自大，自以为是，因为永远有人比你更优秀。学着平易近人是你最大的财富，尤其是对比你入门晚的同胞。别以外入门晚就一定差，就算差，差的也只是经验，也许也只是今天的事情，明天就有可能成为你的老师。SUNBIRD和看雪不是功力最深的CRACKER，却是大家最尊敬的CRACKER之一也是这个道理。

忽然发现本来是写前言却罗罗嗦嗦了一大堆废话真是让大家见笑了。精华3共收录1400篇文章，内容之全是前两个精华所不能相比的，你完全可以把它当作部解密工具书来看。但例子再好永远是例子，把它转化成自己的东西从而灵活的运用是我们最大的希望。记住不要在阅读论坛的同时丢掉了勤奋中最重要的自学和动手的能力，因为只有这些才能让你走的比别人更远。还没有完成学业的朋友们，在这里还想说句心里话给你们，CRACKING个极其消耗时间的事情，还是以学业为重。

“我们需要一个更明亮的未来，如果前辈没有给我们，那么就让我们自己来创造吧！”

最后，对每一篇文章的作者和众多的1212表示由衷的感谢。希望大家共同努力，一起撑起一片更晴朗的天空！
（编者注：1212 是001软件调试论坛早期的一个公共帐号，类似于guest帐号）

jojo
2001.8.11晨于北京


movsx,cdq

 标 题:各位老师请指教。movsx,cdq是什么意思。另外这段程序的密码算法。谢谢 (2千字)
发信人:guest
时 间:2000-5-28 6:27:23
详细信息:
:bpx hmemcpy
Break due to BPX KERNEL!HMEMCPY (ET=517.75 milliseconds)
:bc *
:u cs:eip l 200
0167:0043B5C0 55 PUSH EBP
0167:0043B5C1 8BEC MOV EBP,ESP
0167:0043B5C3 56 PUSH ESI
0167:0043B5C4 8B7508 MOV ESI,[EBP+08]----输入密码
0167:0043B5C7 57 PUSH EDI
0167:0043B5C8 BF3412C72F MOV EDI,2FC71234
0167:0043B5CD 85F6 TEST ESI,ESI
0167:0043B5CF 743A JZ 0043B60B
0167:0043B5D1 8A06 MOV AL,[ESI]
0167:0043B5D3 84C0 TEST AL,AL
0167:0043B5D5 7434 JZ 0043B60B
0167:0043B5D7 53 PUSH EBX
0167:0043B5D8 BBF8110000 MOV EBX,000011F8
0167:0043B5DD 0FBEC0 MOVSX EAX,AL
0167:0043B5E0 50 PUSH EAX
0167:0043B5E1 E83F550600 CALL 004A0B25
0167:0043B5E6 8BC8 MOV ECX,EAX
0167:0043B5E8 8BC3 MOV EAX,EBX
0167:0043B5EA 99 CDQ
0167:0043B5EB F7F9 IDIV ECX
0167:0043B5ED 83C404 ADD ESP,04
0167:0043B5F0 81C390010000 ADD EBX,00000190
0167:0043B5F6 40 INC EAX
0167:0043B5F7 0FAFF8 IMUL EDI,EAX
0167:0043B5FA 8A4601 MOV AL,[ESI+01]
0167:0043B5FD 46 INC ESI
0167:0043B5FE 84C0 TEST AL,AL
0167:0043B600 75DB JNZ 0043B5DD
0167:0043B602 8BC7 MOV EAX,EDI
0167:0043B604 5B POP EBX
0167:0043B605 5F POP EDI
0167:0043B606 5E POP ESI
0167:0043B607 5D POP EBP
0167:0043B608 C20400 RET 0004
0167:0043B60B 8BC7 MOV EAX,EDI
0167:0043B60D 5F POP EDI
0167:0043B60E 5E POP ESI
0167:0043B60F 5D POP EBP
0167:0043B610 C20400 RET 0004

标 题:回答 (2千字)
发信人:冰毒
时 间:2000-5-28 8:48:28
详细信息:

你好,希望这些注释对你有帮助.

0167:0043B5C1 8BEC MOV EBP,ESP
0167:0043B5C3 56 PUSH ESI
0167:0043B5C4 8B7508 MOV ESI,[EBP+08]
0167:0043B5C7 57 PUSH EDI
0167:0043B5C8 BF3412C72F MOV EDI,2FC71234 <-EDI初始化
0167:0043B5CD 85F6 TEST ESI,ESI
0167:0043B5CF 743A JZ 0043B60B
0167:0043B5D1 8A06 MOV AL,[ESI] <-取密码的第一个字
0167:0043B5D3 84C0 TEST AL,AL
0167:0043B5D5 7434 JZ 0043B60B <-如果空白,则跳出
0167:0043B5D7 53 PUSH EBX
0167:0043B5D8 BBF8110000 MOV EBX,000011F8 <-EBX初始化
0167:0043B5DD 0FBEC0 MOVSX EAX,AL <- 将所取字移入EAX
0167:0043B5E0 50 PUSH EAX <-保存
0167:0043B5E1 E83F550600 CALL 004A0B25 <-估计是对该字进行一些操作
0167:0043B5E6 8BC8 MOV ECX,EAX
0167:0043B5E8 8BC3 MOV EAX,EBX
0167:0043B5EA 99 CDQ <-EDX清零
0167:0043B5EB F7F9 IDIV ECX <-EAX除以ECX,商放在EAX,余数在EDX
0167:0043B5ED 83C404 ADD ESP,04
0167:0043B5F0 81C390010000 ADD EBX,00000190 <-EBX+190h
0167:0043B5F6 40 INC EAX <-EAX+1
0167:0043B5F7 0FAFF8 IMUL EDI,EAX <- EDI*EAX 积在EDI
0167:0043B5FA 8A4601 MOV AL,[ESI+01] <-取下一个字
0167:0043B5FD 46 INC ESI <-ESI+1 指向下一字
0167:0043B5FE 84C0 TEST AL,AL <- 是否已取完所有字
0167:0043B600 75DB JNZ 0043B5DD <-否,则继续对下一个进行运算
0167:0043B602 8BC7 MOV EAX,EDI <-运算结果放入EAX
0167:0043B604 5B POP EBX
0167:0043B605 5F POP EDI
0167:0043B606 5E POP ESI
0167:0043B607 5D POP EBP
0167:0043B608 C20400 RET 0004 <- 返回程序调用处
0167:0043B60B 8BC7 MOV EAX,EDI
0167:0043B60D 5F POP EDI
0167:0043B60E 5E POP ESI
0167:0043B60F 5D POP EBP
0167:0043B610 C20400 RET 0004

MOVSX 将字节(Byte)或字(Word)操作数分别扩展成Word或Dword,并保留该值的符号(正负).

CDQ 是一个让很多初学者感到困惑的指令. 它大多出现在除法运算之前. 它实际的作用只是把EDX的所有位都设成EAX最高位的值. 也就是说,当EAX <80000000, EDX 00000000; 当EAX >= 80000000, EDX 则为FFFFFFFF).

冰毒于2000年5月28日


看雪学苑

 标 题:请高手给看一下这段代码有何作用? (5千字)
发信人:1212
时 间:2000-8-18 10:28:33
详细信息:
我在破解时,以下一段代码我不知道有何具体作用,请高手给看一下.

ESI为我输入的假密码地址
* Referenced by a CALL at Addresses:
|:00405169 , :004071A6
|
:00402CAC 53 push ebx
:00402CAD 56 push esi
:00402CAE 57 push edi
:00402CAF 89C6 mov esi, eax
:00402CB1 50 push eax
:00402CB2 85C0 test eax, eax
:00402CB4 7451 je 00402D07
:00402CB6 31C0 xor eax, eax
:00402CB8 31DB xor ebx, ebx
:00402CBA BFCCCCCC0C mov edi, 0CCCCCCC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CC5(C)
|
:00402CBF 8A1E mov bl, byte ptr [esi]
:00402CC1 46 inc esi
:00402CC2 80FB20 cmp bl, 20
:00402CC5 74F8 je 00402CBF
:00402CC7 B500 mov ch, 00
:00402CC9 80FB2D cmp bl, 2D
:00402CCC 7445 je 00402D13
:00402CCE 80FB2B cmp bl, 2B
:00402CD1 7442 je 00402D15
:00402CD3 80FB24 cmp bl, 24
:00402CD6 7442 je 00402D1A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D18(U)
|
:00402CD8 84DB test bl, bl
:00402CDA 7432 je 00402D0E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CF4(C)
|
:00402CDC 80EB30 sub bl, 30
:00402CDF 80FB09 cmp bl, 09
:00402CE2 772A ja 00402D0E
:00402CE4 39F8 cmp eax, edi
:00402CE6 7726 ja 00402D0E
:00402CE8 8D0480 lea eax, dword ptr [eax+4*eax]
:00402CEB 01C0 add eax, eax
:00402CED 01D8 add eax, ebx
:00402CEF 8A1E mov bl, byte ptr [esi]
:00402CF1 46 inc esi
:00402CF2 84DB test bl, bl
:00402CF4 75E6 jne 00402CDC
:00402CF6 FECD dec ch
:00402CF8 7410 je 00402D0A
:00402CFA 85C0 test eax, eax
:00402CFC 7C10 jl 00402D0E

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402D0C(C), :00402D51(U)
|
:00402CFE 59 pop ecx
:00402CFF 31F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D11(U)
|
:00402D01 8932 mov dword ptr [edx], esi
:00402D03 5F pop edi
:00402D04 5E pop esi
:00402D05 5B pop ebx
:00402D06 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402CB4(C), :00402D24(C)
|
:00402D07 46 inc esi
:00402D08 EB04 jmp 00402D0E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CF8(C)
|
:00402D0A F7D8 neg eax
:00402D0C 7EF0 jle 00402CFE

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402CDA(C), :00402CE2(C), :00402CE6(C), :00402CFC(C), :00402D08(U)
|:00402D3C(C), :00402D43(C)
|
:00402D0E 5B pop ebx
:00402D0F 29DE sub esi, ebx
:00402D11 EBEE jmp 00402D01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CCC(C)
|
:00402D13 FEC5 inc ch

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CD1(C)
|
:00402D15 8A1E mov bl, byte ptr [esi]
:00402D17 46 inc esi
:00402D18 EBBE jmp 00402CD8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CD6(C)
|
:00402D1A BFFFFFFF0F mov edi, 0FFFFFFF
:00402D1F 8A1E mov bl, byte ptr [esi]
:00402D21 46 inc esi
:00402D22 84DB test bl, bl
:00402D24 74E1 je 00402D07

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D4F(C)
|
:00402D26 80FB61 cmp bl, 61
:00402D29 7203 jb 00402D2E
:00402D2B 80EB20 sub bl, 20

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D29(C)
|
:00402D2E 80EB30 sub bl, 30
:00402D31 80FB09 cmp bl, 09
:00402D34 760B jbe 00402D41
:00402D36 80EB11 sub bl, 11
:00402D39 80FB05 cmp bl, 05
:00402D3C 77D0 ja 00402D0E
:00402D3E 80C30A add bl, 0A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D34(C)
|
:00402D41 39F8 cmp eax, edi
:00402D43 77C9 ja 00402D0E
:00402D45 C1E004 shl eax, 04
:00402D48 01D8 add eax, ebx
:00402D4A 8A1E mov bl, byte ptr [esi]
:00402D4C 46 inc esi
:00402D4D 84DB test bl, bl
:00402D4F 75D5 jne 00402D26
:00402D51 EBAB jmp 00402CFE
:00402D53 C3 ret

标 题:这是一个很典型的函数，相当于C语言中的atoi( )、atol( )函数 (939字)
发信人:dr0
时 间:2000-8-18 10:56:35
详细信息:

就是把字符串转换成对应的整数，比如将串“123456”转换成整数123456，“-787878”转换成-787878。破解注册码的时候会经常碰到，不用在这个函数中单步跟踪，直接按一下F12返回，这时在EAX寄存器中存放的就是转换结果，看它如何处理这个转换结果即可。

这个函数可能会有变形，即在不同的编译器中的具体实现代码稍有不同，可以用下面的特征代码识别，即只要看到这段代码基本上可以断定是个atol( )函数，因为这是在判断正负号（若为负数则返回前有个求补操作，即neg eax）：
cmp bl, 2D
je 00402D13
..........
cmp bl, 2B
je 00402D15
转换用的是秦九韶多项式算法，因为任何十进制数均可以展开成10的多项式的形式。不停地乘以10，然后再加上当前位即可，用下面的指令实现的：

:00402CE8 8D0480 lea eax, dword ptr [eax+4*eax] //乘以5
:00402CEB 01C0 add eax, eax //再乘以2
:00402CED 01D8 add eax, ebx //加上当前位


IEEE浮点数的存放格式

标 题:跟兄弟们一起复习一下IEEE浮点数的存放格式 (818字)
发信人:-=1212=-
时 间:2001-3-1 21:31:36
详细信息:
对于大小为32-bit的浮点数（32-bit为单精度，64-bit浮点数为双精度，80-bit为扩展精度浮点数），
1、其第31 bit为符号位，为0则表示正数，反之为复数，其读数值用s表示；
2、第30～23 bit为幂数，其读数值用e表示；
3、第22～0 bit共23 bit作为系数，视为二进制纯小数，假定该小数的十进制值为x；

则按照规定，该浮点数的值用十进制表示为：
＝ (-1)^s * (1 + x) * 2^(e - 127)

对于49E48E68来说，
1、其第31 bit为0，即s = 0
2、第30～23 bit依次为100 1001 1，读成十进制就是147，即e = 147。
3、第22～0 bit依次为110 0100 1000 1110 0110 1000，也就是二进制的纯小数0.110 0100 1000 1110 0110 1000，其十进制形式为0.78559589385986328125，即x = 0.78559589385986328125。

这样，该浮点数的十进制表示
=　(-1)^s * (1 + x) * 2^(e - 127)
=　(-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127)
= 1872333

你可以用windows自带的计算器算一下。


[最弱智]考题

标 题:出道小题吧。 (302字)
发信人:[最弱智]
时 间:2001-1-9 13:33:30
详细信息:
DWORD algo( DWORD m )
{
int i;
for( i=0; i<32; i++ )
if( m & 1 )
m = ( m>>1 ) ^ 0x12345678;
else
m >>= 1;
return m;
}

问题：
(1) 该函数是否存在逆算法？
(2) 如果存在，给出逆算法，并说明逆算法有什么限制。
(3) 如果不存在，请说明理由，并对原算法稍做修改使之可逆。

标 题:给个答案吧。 (347字)
发信人:[最弱智]
时 间:2001-1-10 10:08:23
详细信息:

该算法部分可逆。用于异或的 0x12345678 是“部分可逆”的原因。当
algo 的参数在一个范围之内的时候，算法可逆。这个范围留给各位去找找吧。

逆算法：

unsigned long ogla( unsigned long m )
{
int i;
for( i=0; i<32; i++ )
if( m & 0x10000000 )
m = ( ( m ^ 0x12345678 ) << 1 ) | 1;
else
m <<= 1;
return m;
}


信用卡号的秘密

标 题:信用卡号的秘密----姑妄说之姑妄听 (391字)
发信人:小楼
时 间:2000-12-30 10:55:30
详细信息:
信用卡号码是一个16位数字, 比如
1 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4

从左至右取奇数位数字,得到
1 3 5 7 9 9 7 5
每个数字乘以2,若大于9则减去9,这样得到
2 6 1 5 9 9 5 1
将这些数字分别相加, 再加上原号码的偶数位数字
2+6+1+5+9+9+5+1+2+4+6+8+0+8+6+4=76
如果和能被10整除, 说明这是一个有效的信用卡号
所以上面的信用卡号可以修正为
1 2 3 4 5 6 7 8 9 0 9 8 7 6 5 8


Cracker最简单的任务

 标 题:Cracker最简单的任务 (1千字)
发信人:henryw
时 间:2001-5-15 12:50:28
详细信息:
Cracker最简单的任务

我们中间很多人都是从一点不懂Crack开始的，为了更好地帮助新加入我们行列的cracker，特地将一年前在Newbies Project Forum上看到的一个初始计划提供给大家，看看能够得到些什么启发。

目标软件的名称是Accoustica 2.01a。

初始计划的开始是列出需要的工具（我自己加了一些）：
1. Debugger: SoftIce, TRW2000...
2. Disassembler: W32Dasm, IDA pro...
3. HexEditor: HexWorkshop, Hview, Hedit...
4. Resource Editor: BRW, Exescope, Restorator, ResHack...
5. Registry Monitor: RegMon...
6. File Monitor: FileMon...

LaZaRus将任务分成四部分，开篇当然是最简单的任务了：
I. 简单任务
I.1 对于目标文件你发现了什么？
可以查找程序本身，帮助文件，或者其他什么地方。只是不能用*任何*工具，而是直接观察程序本身。
I.2 在W32Dasm里面找到什么有趣的东西了吗？
无论用什么反汇编工具，看看字符串列表中有什么让人怀疑的东西。
I.3 出错框是哪种类型的对话框？
I.4 程序在哪里保存注册信息？
注册表？文件？程序本身？
I.5 程序在哪里保存还剩多少天的信息？
注册表？文件？程序本身？

第二部分才是想办法进行最完美的Patch，寻找注册码是在第三部分。第四部分是写注册机以及让出错框显示正确注册码。

LaZaRus写出了一个Cracker在面对一个目标程序时候应该进行的观察，很多初学者不够重视这个步骤，结果会绕很大的弯路才能接近目标。所以，作为Crack的初学者(包括我在内)，不要太着急，第一步要学会使用各种方法对程序进行侦查行动。我们往往忽视了最简单的观察，直接进入Patch或者寻找注册码这步了。坚持简单的观察，不但对自身水平的提高很有帮助，而且在论坛发问也不会太盲目，小楼兄前几天也不至于如此言辞激烈了。


WAREZ无形帝国

 标 题:灌水一篇 －－ WAREZ无形帝国，从嬴政大哥那里得到的 我想会有一部分兄弟没有看过吧 (12千字)
发信人:NYDoll[FCG]
时 间:2001-6-23 20:02:31
详细信息:
WAREZ无形帝国 赢政2001/05/02摘自熏衣草

--------------------------------------------------------------------------------

WAREZ无形帝国

这会儿夜深了，他们昏昏睡去。随便哪栋建筑的某一个黑洞洞的窗口，你冷眼望
去，没准就能看到一台白色的电脑，静静地卧在主人的书桌上。如果那主人睡得
足够深，你就打开他的抽屉，现在你看到了什么？哦，我不是指他的私人日记，
也没让你翻他的相册 和笔盒。结果呢，你没看到几张盗版软件么？

谁敢说自己的个人电脑里没有一个软件是非法的呢？是一个庞大的无形的盗版帝
国支撑着我们走进了IT时代。这么说似乎并不夸张。那么，你想了解它们的始作
俑者的身份和来历么？你想了解它们的组织结构和体系么？你想了解真相么？是
一个偶然的机会，我们了解到这一切，并希望把它们公之于众。现在，我们就这么
做了。

二
最早的软件盗版组织在70年代末80年代初就已经出现了，这是在国外诞生的一种
奇怪的自发性民间组织。它的成员是一些青少年电脑爱好者。他们是运用自己的
技术破解各类机种中运行的软件（包括个人电脑和电视游戏机），以非法方式传
播，但不以赢利为目的纯技术团伙。在早期没有互联网的情况下，他们用电话线
传输游戏以及一些自制运行的展示程序（DEMO），并展开不定期的技术交流，同
一地区组织间还经常性地交换成员。这些组织遍布在南北美洲、欧洲和南非等地。
20世纪90年代，PC机在全球的普及和互联网的日益发展，为这些组织的成长壮大
创造了良好的土壤。这个组织是无形的，他们有自己的信念和约定俗成的行规，
他们没有自己网站，不赚钱，破解的游戏只用FTP上传以供下载，并通过BBS交流
信息。其组织成员很有奉献精神，以自己是“WAREZ”或“0DAY”组织成员为荣。
在美国的一些大学中，如果一个学生是“0DAY”成员，他的计算机教师甚至会考
虑在他的成绩单中加分--因为加入此种盗版组织意味着你在技术上的优秀。这些
组织早期的首脑有的现已成为律师、 医生和政府官员等社会中坚力量。

这里我们要解释一下“WAREZ”的含义，它是国外从事软件盗版制作者的统称。
“WARE”表示破解软件，“Z”表示零（ZERO），意为在不到一天的时间里破解软件。
那么“0 D AY”的意思也就不言而喻了。

下面我们再介绍一下这类组织破解正版软件的流程。
三
首先是提供组负责购买游戏或取得资料，然后是解密组负责将软件解密，这个组
的成员往往是最多的，也是技术含量最高的。再往后是包装组。在这里光盘破解
组织和硬盘破解组织的“行规”是不同的。硬盘版要求2.8×65，即不能超过65个
压缩包，每个压缩包的大小不能超过2.8兆，他们认为超过这个标准就不能算硬盘版，
对下载者就是一种欺骗。光盘版则没有这种限制，15兆一个ISO光盘镜像包，使用者
全部下载后再将其解压刻录于光盘，就可以玩完整的光盘游戏。具体压缩一般的规矩
是这样：一个ISO包内含一个ZIP包，ZIP包内含的多媒体文件再用ACE压缩。这样保证
了1：12的压缩率，便于网上传播--以上所说的完全是一种对玩家利益的考虑。最后
是发行组，负责在FTP上上传破解后 的游戏软件。

这些组织破解的游戏通常放在国外地下站点，通过FTP下载时需要验证你的IP，看
是否是它的成员，而且IP通过检验进入FTP后你会看到欢迎词，以及“本站是XX组织北美
第XX发行站”之类的字样。它还将告诉你今天有那些游戏上传、昨天有那些游戏上传、
你上传过多少游戏，下载过多少游戏，制作过多少有趣的DEMO程序。如果你长期没有破
解游戏上传记录，将取消你的IP记录。

各种组织没有自己专门的FTP下载基地，你可以自愿提供资源，当然站长也可以加
入到各类组织中去。无论是组织成员还是站长，凡是自愿加入这种组织的，都具有相当
的责任心，当某一成员破解上传的游戏在其他的站上被别人抢先破解上传过了，那么你
破解的将被CANCEL。而如果他做的硬盘版没有你的完美，那么他也将自动CANCEL掉自己
的那个版本。这个规则保证了优胜劣汰，保证了所有破解软件只有一个版本，但它肯定
是最完美的。

各大组织的外围成员来自世界各地，只要他们愿意，而且技术上能做得到，就可
以同时加入几个盗版组织。而当你从学校毕业有了一份正当的职业后，再没有精力做这
种义务劳动了，那么你将从组织中自动淡出。

由此可见，这种组织从加入到管理到退出完全依赖一种自我完善的机制。它是松
散的，同时又非常合理。但由于它的开放性，有时也会出现某方面人员的匮乏。如果你
用写字板打开盗版软件中的.NFO文件，很可能看到“我们目前缺乏解密组和提供组人员
，诚邀有志者加盟……”等字样。

除去这种非法的盗版游戏传播工作，“0DAY”组织成员还热衷于制作一种自动播
放的有动画、有音乐的小DEMO程序。他们通过它来宣传自己的组织，炫耀自己的技术，
有时还通过这种小程序来攻击竞争对手--这招实在算不得不文明。这种程序字节数越
小、播放时间越长就越好，在这方面创记录的是CLASS组成员的一个程序，它只有27K。
在PC机硬盘版游戏解压缩的执行文件也是破解组织比拼技术的一种方式。英国的老牌组
织MYTH的安装界面甚至提供俄罗斯方块游戏，用以打发你在安装游戏时等待的时光。
目前国际知名的PC游戏软件盗版组织中专门破解制作光盘版的有RAZOR1911、FA
IRLIGHT和DEVIANCE，专门制作硬盘版的有CLASS、MYTH和DD。应用软件盗版组织中CORE
、FOREST、ING和PARADIGM是最有名的。其中FOREST专门破解图形软件。目前世界上所有
流通的盗版图形软件几乎都是由这个组织破解的。

四
这一节将简要介绍一下RAZOR1911组织从1985年至今在Commodore64，Amiga和PC
机上的经历（C64和Amiga都是80年代的4位/8位游戏机），因为它是此类组织发展历程中
最具代表性的一个。

1985年10月一个雨后的傍晚，3个年轻的挪威计算机爱好者决定成立一个计算机小
组，破解Commodore64机种的游戏软件。他们并不很清楚成立一个小组都需要些什么，
但他们从1941、Section 8、Jedi2001、Hellmates、SCC等著名的软件破解小组那里得
到了很多灵感。

好的组织要有个好名字，一个朋友为他们起名叫RAZOR2992，他们不喜欢这个名字
，不久就改名为RAZOR1911。许多人问他们为什么用这个名字，他们就回答说因为在C64
游戏机破解组织中，有太多没脑子的孩子用类似666这种号码在他们的DEMO、信笺和盘盒
上，他们觉得这很幼稚，他们需要神秘感，1911在16进制算法中可转化为777，是对666
的一种讽刺。后来他们也曾用Project$777的名字制作Amiga游戏机的DEMO。
C64时代很短暂，他们做了许多DEMO和一些软件破解，成为挪威有名的小组之一。
他们的名作不多，其中一些至今还在Commodore64纪念光盘里流通（C64可在MS-DOS和U
NIX系统中模拟运行）。后来该小组一些成员分裂出去，进入TCC和Megaforce。其余的人
决定加入Active CrackingCrew（ACC）组织。在那里他们学会如何象一个专业的软件破
解者那样工作，并第一次把视线投向了整个世界。他们为自己广泛宣传，6个月后又参加
了在丹麦举办的被称为“顶极精英”者的国际聚会，这种聚会的另一种称谓是“拷贝团
拜”（COPY-PARTIES）。他们在会上评选出1987年年度最佳解密高手。TRIAD小组的Mr.
Z以微弱票数险胜RawDeal的Laffen，获得了“年度最佳解密高手”的称号。当时FAIRLI
GHT还和ACC现场合作破解了一个詹姆士．邦德的007游戏。从丹麦回到挪威，兴奋的年轻
人重组了RAZOR1911，在AMIGA机种上和RAW DEAL合作，东山再起。

在AMIGA上的发展开始非常缓慢，1988年才开始陆续做出一些DEMO，并在全球有了
一些成员。当时的许多DEMO相当原始，但是有好的想法，好的图像和动听的音乐，后来
它们大部分都遗失了。不象许多新成员所想象的那样，RAZOR1911的老成员们都明白他们
真正希望成为的是一个最好的游戏破解组织，而不仅是一个DEMO制作组。当他们在DEMO
制作上有了些名气后时常与许多专门的游戏软件破解组织联系，1989年，当一些组织解
散后，其成员都被RAZOR1911吸收进去。其中Zodact和Onyx分别是美国和欧洲的主力游戏
破解组织，由于这些富有经验的成员的加入，RAZOR1911很快转型为一个真正的游戏破解
组织--在后来的PC机时代，那时吸收的成员仍然是RAZOR1911最好最有力的成员。
他们同时还掌握了大量盗用电话线路的技术，这使得他们可以将自己的联系网轻
易地扩展到全世界。在1989年的最后两周里他们有了两个世界第一的破解作品--Pock
et Rockets和StripPokerⅡ。同时他们也受到了其他组织的恶性竞争。到了1991年4月
，他们已经破解了50个AMIGA游戏软件。这之后AMIGA机种软件很难破解了，它的每张盘
都有密码锁，你不得不一次次面对各种不同的新问题，而NTSC/PAL两种制式的差别使得
美国人没有补丁就不能玩欧洲的游戏。而且现在有太多的小组在竞争，大家常常为破解
同一个游戏而暗中比赛，压力变大了，而这时的整个社会经济都处于疲软状态，许多组
织没有足够的钱支持下去。
对未来RAZOR的创建者没有足够明确的方向。但这时一个富有才华的PC软件破解者
Darwin将PC机带入了他们的视线。RAZOR很快关闭了AMIGA专线。他们彻底地重组了组织
，包括匿名的投资者和 DoctorNo、Onyx、Zodact等一批过去的精英。他们合作破解了
一大批电脑游戏软件，在业内口碑甚好。他们由紧凑、精干、高效率的小组很快变为了
一个庞大无形的游戏破解机构。RAZOR变成了一个大公司式的玩意儿，他们不断地破解游
戏、制作修改器、提取游戏动画……4年内他们几乎破解了600个游戏和无数的其他产品。
1995年后国际互联网有了长足发展，RAZOR组织充分利用它并有了更广阔的发布渠
道，他们比以前任何时候都更快更多地接触到饥渴的人群。这一年他们还插足CD-ROM领
域。开始只是以RAZOR1911的名义零星地破解了一些光盘版游戏。他们一开始没有过多关
注这个领域，直到软盘游戏越来越少，他们也真正重视起光盘游戏并取得了这个领域的
主导地位。目前他们仍然是全球最大的PC光盘游戏盗版组织并深受一些年轻人的崇拜，
他们同样着迷于对游戏破解技术的攻坚，并喜欢穿着印有RAZOR1911标志的外套招摇过市。
作为一个如此庞大的组织，他们也存在着这样那样的问题。他们在94和95年有过
两次大分裂，更甚至有些人物被警方逮捕和备案。但他们还是度过了难关，继续发展着
。关于这些盗版组织更详细的历史材料都在他们这些年来破解的PC游戏所附的.nfo文件
中，你从中可以了解到他们许多被遗忘的秘密。

五
我们对国外的盗版制作组织有了初步的了解，但是外国政府是如何对待这些组织
的呢？我们前面说过，盗版制作者很有一种黑客精神：追求绝对技术，追求完全共享。
这在客观上已经侵犯了软件厂商的利益。更何况你不为盈利，并不代表着别人也不想盈
利！在加拿大、德国和南非等地，盗版软件销售十分猖獗，而在俄国一切都几乎是公开
的。实际俄国的DD组织就直接从事赢利性销售。几乎所有的盗版组织都被大公司告上过
法庭。最近的例子是关于EA公司出品游戏FIFA2000的。由于盗版组织的“提供组”成员
渗入EA公司内部，致使母盘外流，结果盗版FIFA2000比正版提前出了1个月。EA公司愤怒
之中在俄国、英国和德国分别将DD、MYTH和CLASS告上法庭。俄国DD组织成员被抓，判刑
，后来司法部门收受贿赂，将该组织成员释放。英国法院则认为MYTH只在网上传播硬盘
版，自己没有网站和广告，没有万维网（WWW）的链接，没有赢利，所以判定MYTH组织无
罪。德国的CLASS则只是罚款了事，没有追究任何刑事责任。但是现在的盗版组织都不敢
碰EA这样的大公司，他们总是等EA的正版游戏出品了再做破解版。因为这种公司的势力
实在太大了。其他的时候盗版总是比正版出得快，《暗黑破坏神Ⅱ》（DIABLOⅡ）的盗
版（光盘破解版）比美国本土正式版提早两天上市而且破解得相当完美！其原因正如上
所述，正版从业者中有些本身就是“WAREZ”成员。
这些还只是游戏软件，在国外应用软件破解在某种程度上比游戏软件的破解技术
难度高得多，而且风险也更大。以北美地区为例，任何一款正版游戏最高售价也不过49
.9美金，而正版应用软件的价格都要上100美元，而盗版软件一张只卖到9美元。这种价
格差听起来很容易让我们联想到我国的盗版现状。盗版组织四处网罗的枝蔓在我国又是
如何延伸的呢？

六
中国最早的个人“WAREZ”组织志愿者、中国“中文解密基地”网站站长曾想建立
自己的“CHINA 0DAY”组织，而且他在国内的志同道合者也不在少数，但是他们很快发
现在中国不可能产生“0DAY”组织。很多人把原因简单地归结为某种“民族性”的障碍
，这是不对的。这里面存在很大的经济因素、社会因素和技术因素的问题。从经济上讲
，欧美国家IT业和电信业本来就发达，每年个人无论在软硬件消费还是网络服务费用上
，相对于人均收入都是微乎其微的。经济的发达带动了社会的发展和教育水平的进步，
这意味着在发达国家更多有计算机天赋的青年可以有条件从事这一爱好，而在中国如果
一个计算机天才在山区诞生了，那么他永远将无法证明自己。而即使当一个中国青年终
于可以承担自己在计算机上投入的金钱时，他已经不具备加入“0DAY”的条件和精力了
。谈到技术，我国目前网络带宽很难让人满意，每秒钟十几K怎么和国外50兆/秒的速度
相比？不要说0 DAY，就是上传下载恐怕也要5DAY不止啊。把这一切制约因素都通通抛
开不谈，仅仅说一句“中国人没有这种素质和意识”是不公平的。目前国内一些向往“
WAREZ”组织的青年，都希望到国外去施展一下自己在这方面的“才华”。 如果说以上
的青年还只是对电脑技术的迷恋，那么GAMEZ88组织可就不是这样了。
据说它是FAIRLIGHT一个18岁在斯坦福大学读书的成员在中国搞的一个纯赢利组织，具体
成员分布不详。GAMEZ88的游戏都是在国外破解然后在国内压制成盘的，真正好的技术在
国外，国内盗版组织几乎不具备破解能力。据说FAIRLIGHT专门有外国组，负责破解多语
种游戏软件。简体中文版《魔法门之英雄无敌Ⅲ》的硬盘版很可能就是靠国外小组破解
的。这是国内比较有来历的盗版组织，其他的一些零散组织则采取互相盗用或到国外
WWW网站下载的方式制作盗版光盘。另外香港也是一个盗版天堂，大陆的许多盗版软件都
是从那里流入的。

这里有一个很大的怪圈：盗版商人痛恨伪正版商，因为他们比自己谋取了更多的
暴利。一张盗版盘成本2元，利润只有1元，这1元还是层层批发商一起来分的。而伪正版
商很可能与一些正版厂商内部人员串通，用千元报酬获得图片、攻略和手册说明书，然
后便翻版印制，以盗版的成本和正版的价格出售给拥护正版游戏的玩家。而另一方面盗
版制作者却巴不得国家下力气抓盗版，盗版销售被限制了，盗版商赔了，但是由于光盘
的减少，制作者反而会奇货可居而赚得更多！这就是我国盗版市场的冰山一角。 七
文章到这里就结束了，由于信息来源的局限性，某些具体细节的真实我们已无从
验证，有兴趣的读者欢迎继续与我们交流看法。最后要说的是，我们写本文的目的，不
是为盗版行为歌功颂德。它是对劳动的不尊重，更是阻碍经济正常运转的毒瘤，无论盗
版者的初衷是什么，他们都永远是我们要打击的对象。

这篇文章摘自2000.9月上期（17）的《大众软件》（总第82期）
全文的立意是介绍WareZ，“打击盗版”，但是首先我要申明的是
这只是文中的观点。

正如文中所说WareZ是“不以赢利为目的纯技术团伙”，“他们有
自己的信念和约定俗成的行规，他们没有自己网站，不赚钱，破解
的游戏只用FTP上传以供下载，并通过BBS交流信息。其组织成员很
有奉献精神，以自己是‘WAREZ’或‘0 DAY’组织成员为荣”，只
不过他们的成果被那些商人所利用才有今天的所谓“盗版软件”。

这正如大家现在嘴里所说的“黑客”和以前所指真正意义上的“Hacker”
之间的区别。

希望这篇文章对大家理解WareZ有所帮助。


D命令

 标 题:谈谈softice中d的用法 (4千字)
发信人:henryw
时 间:2001-8-2 21:30:46
详细信息:
谈谈softice中d的用法

所有的cracker都使用过softice中d的功能，比如d eax来看eax指向的内存中是什么。

不过，有些人可能不知道d的功能远不止此。

如果需要看看eax指向的内存中其地址指向的内存地址你会怎么做？比如eax＝493576，你d 493576，发现那里的内存是1A22D23，于是你再d 1A22D23，发现里面放的是你的注册名，那么，如何一次性地指向1A22D23呢？

无论在softice或者trw2000中，都可以使用d *eax这个命令，注意前面的*，就是它，使得softice一下子就知道你需要指向eax内存处指向的地方。

此外，对于浮点运算很多cracker很头疼。下面我举个例子如何使用d来简化我们的工作。

让我们来看看Trojan Remover 4.2.9吧。在其注册中有这么一段：

016F:004B0531 LEA EAX,[EBP-18]
016F:004B0534 MOV EDI,EBX
016F:004B0536 MOV EDX,[EBP-04]
016F:004B0539 MOV DL,[EDX+EDI-01] <------ 序列号的第一个字符
016F:004B053D CALL `VCL30!System.@LStrFromChar@001FB870`
016F:004B0542 MOV EAX,[EBP-18]
016F:004B0545 CALL `VCL30!SysUtils.StrToInt@0F6FDFF6`
016F:004B054A CMP EAX,BYTE +02
016F:004B054D JNL 004B0593 <------ >=2
016F:004B054F LEA EAX,[EBP-18] <------ <2
016F:004B0552 MOV EDX,[EBP-04]
016F:004B0555 MOV DL,[EDX+EDI-01]
016F:004B0559 CALL `VCL30!System.@LStrFromChar@001FB870`
016F:004B055E MOV EAX,[EBP-18]
016F:004B0561 CALL `VCL30!SysUtils.StrToInt@0F6FDFF6`
016F:004B0566 ADD EAX,BYTE +03
016F:004B0569 JNO 004B0570
016F:004B056B CALL `VCL30!System.@IntOver@51F89FF7`
016F:004B0570 IMUL EAX,EAX,BYTE +51 <------ x51H 放到eax里
016F:004B0573 JNO 004B057A
016F:004B0575 CALL `VCL30!System.@IntOver@51F89FF7`
016F:004B057A MOV EDI,EAX
016F:004B057C LEA EDX,[EBP-18]
016F:004B057F MOV EAX,EDI
016F:004B0581 CALL `VCL30!SysUtils.IntToStr@0F6FDFF6`
016F:004B0586 MOV EDX,[EBP-18]
016F:004B0589 LEA EAX,[EBP-08]
016F:004B058C CALL `VCL30!System.@LStrCat@51F89FF7`
016F:004B0591 JMP SHORT 004B05CB
016F:004B0593 LEA EAX,[EBP-18]
016F:004B0596 MOV EDX,[EBP-04]
016F:004B0599 MOV DL,[EDX+EDI-01]
016F:004B059D CALL `VCL30!System.@LStrFromChar@001FB870`
016F:004B05A2 MOV EAX,[EBP-18]
016F:004B05A5 CALL `VCL30!SysUtils.StrToInt@0F6FDFF6`
016F:004B05AA IMUL EAX,EAX,BYTE +2F
016F:004B05AD JNO 004B05B4
016F:004B05AF CALL `VCL30!System.@IntOver@51F89FF7`
016F:004B05B4 MOV EDI,EAX
016F:004B05B6 LEA EDX,[EBP-18]
016F:004B05B9 MOV EAX,EDI
016F:004B05BB CALL `VCL30!SysUtils.IntToStr@0F6FDFF6`
016F:004B05C0 MOV EDX,[EBP-18]
016F:004B05C3 LEA EAX,[EBP-08]
016F:004B05C6 CALL `VCL30!System.@LStrCat@51F89FF7`
016F:004B05CB INC EBX
016F:004B05CC DEC ESI
016F:004B05CD JNZ NEAR 004B0531
016F:004B05D3 MOV EAX,[EBP-08]
016F:004B05D6 CALL `VCL30!SysUtils.StrToFloat@044134E0`
016F:004B05DB FSTP TWORD [EBP-12] <---------- 记着打开softice的浮点窗口
016F:004B05DE WAIT
016F:004B05DF FLD TWORD [EBP-12]
016F:004B05E2 FLD TWORD [004B0674]
016F:004B05E8 FMULP ST1
016F:004B05EA FLD TWORD [004B0680]
016F:004B05F0 FSUBP ST1
016F:004B05F2 FSTP TWORD [EBP-12]
016F:004B05F5 WAIT
016F:004B05F6 JMP SHORT 004B0612
016F:004B05F8 MOV EAX,[EBP-04]
016F:004B05FB CALL `VCL30!SysUtils.StrToInt@0F6FDFF6`
016F:004B0600 MOV [EBP-1C],EAX

我们在4B05DB处打开了浮点窗口（用wf命令），这条命令会将浮点栈ST0的数字保存到了EBP-12处，先记下浮点栈里显示的数字，然后F8单步到4B05DE，我们先用d ebp-12看看，看见一堆的byte，相信我们中很多人记不住浮点格式吧，就算记住了你会去计算它一下吗？显然不会！那怎么办？盲人摸象？不！我们来试试dt ebp-12。看到什么了？就是刚才从浮点栈里保存去的数字！

这是怎么一回事？看看这一段解释（摘自Softice4命令中文解说，太平洋软件资讯站）：

命令: D
作用: 显示某内存区域的内容
语法: D[size] [address [l length]]
用法:
size: B 字节; W 字; D 双字; S 短实型; L 长实型;
T 10b长实型
D 命令在所指定的内存区域开始显示指定长度的内存
单元内容. 格式将根据size来变.对于双字类型, 将分
两种情况:

1.如果指定地址为32位的段, 格式为32bytes的16进制
值(即8位16进制值)
2.如果指定地址为16位的段, 则格式为16:16指针的形
式(即4:4位16进制值)

如果没有指定地址,D 命令将继上次命令后的地址开始
显示.如果数据窗口可见,则结果在数据窗口中显示,否
则显示在命令窗口中.但若用了参数L 和长度, 则结果
不论数据窗口可见还是不可见,都显示在命令窗口中.

点评: 无

有些意思吧？


R命令

标 题:★从轻松试卷 v4.03 的破解看 r fl z 的妙用★ (16千字)
发信人:paulyoung
时 间:2001-3-25 2:18:21
详细信息:
★从轻松试卷 v4.03 的破解看 r fl z 的妙用★

作者:PaulYoung
E-mail:paulyoung@yeah.net
软件简介：顾名思义啦。
URL:http://easypaper.yeah.net （最新版本是 v4.04　，相信也差不了多少）
破解工具：SOFT-ICE V4.0.5
二○○一年三月二十四日凌晨

==============================================================================================================
    首先感谢★小牧童★大师的指点，才能使我能用 W32DASM V8.93 反汇编轻松试卷。虽然我是用动态跟踪破解的，但要写破解心得，首选还是 w32DASM 。
==============================================================================================================

    好了，首先自我介绍一番，我是名初学者，学了个把两个月破解吧，因此，汇编知识自然是鸟之又鸟的了，但熟能生巧嘛，而且我又是看雪破解论坛的常客，一来二往，真的学了不少东西。
    最近我学了一招 r fl z ，功能大概跟 a 指令差不多吧，不过我觉得它按起来顺手多了。TRW2000 和　SOFT-ICE　均可使用，灵活运用，对破解能起到事半功倍的作用。
    下面，我就以轻松试卷为例，看看 r fl z 有何妙处吧。

    1、运行轻松试卷，在注册框的学校/单位、用户名、注册号处填写，随你便啦。
    2、Ctrl+D　激活SOFT-ICE，下 BPX HMEMCPY。F5 退出，点击确定，被拦截。
    3、下 BD *　，中断所有断点。
    4、按12次 F12 （因为13次出错），开始看：

:004019A5 8D4DF8 lea ecx, dword ptr [ebp-08] //程序入口
:004019A8 51 push ecx
:004019A9 8BD7 mov edx, edi
:004019AB 8D45F4 lea eax, dword ptr [ebp-0C]
:004019AE E8D5721200 call 00528C88
:004019B3 FF431C inc [ebx+1C]
:004019B6 8D55F4 lea edx, dword ptr [ebp-0C]
:004019B9 58 pop eax
:004019BA E80D751200 call 00528ECC
:004019BF 50 push eax
:004019C0 FF4B1C dec [ebx+1C]
:004019C3 8D45F4 lea eax, dword ptr [ebp-0C]
:004019C6 BA02000000 mov edx, 00000002
:004019CB E818741200 call 00528DE8
:004019D0 FF4B1C dec [ebx+1C]
:004019D3 8D45F8 lea eax, dword ptr [ebp-08]
:004019D6 BA02000000 mov edx, 00000002
:004019DB E808741200 call 00528DE8 //学校名、单位名不能为空（我掉头就溜……）
:004019E0 59 pop ecx
:004019E1 84C9 test cl, cl
:004019E3 745F je 00401A44 　　　　　　//下 r fl z ,F5退出，可看到上面提示
:004019E5 66C743101400 mov [ebx+10], 0014
:004019EB 8D5701 lea edx, dword ptr [edi+01]
:004019EE 8D45F0 lea eax, dword ptr [ebp-10]
:004019F1 E892721200 call 00528C88
:004019F6 FF431C inc [ebx+1C]
:004019F9 8D45F0 lea eax, dword ptr [ebp-10]
:004019FC 33D2 xor edx, edx
:004019FE 8955EC mov dword ptr [ebp-14], edx
:00401A01 8D55EC lea edx, dword ptr [ebp-14]
:00401A04 FF431C inc [ebx+1C]
:00401A07 E8E8A90100 call 0041C3F4
:00401A0C 8D45EC lea eax, dword ptr [ebp-14]
:00401A0F 8B00 mov eax, dword ptr [eax]
:00401A11 E886420100 call 00415C9C
:00401A16 FF4B1C dec [ebx+1C]
:00401A19 8D45EC lea eax, dword ptr [ebp-14]
:00401A1C BA02000000 mov edx, 00000002
:00401A21 E8C2731200 call 00528DE8
:00401A26 FF4B1C dec [ebx+1C]
:00401A29 8D45F0 lea eax, dword ptr [ebp-10]
:00401A2C BA02000000 mov edx, 00000002
:00401A31 E8B2731200 call 00528DE8
:00401A36 8B0B mov ecx, dword ptr [ebx]
:00401A38 64890D00000000 mov dword ptr fs:[00000000], ecx
:00401A3F E972030000 jmp 00401DB6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004019E3(C)
|
:00401A44 66C743102000 mov [ebx+10], 0020
:00401A4A 33C0 xor eax, eax
:00401A4C 8945E8 mov dword ptr [ebp-18], eax
:00401A4F 8D55E8 lea edx, dword ptr [ebp-18]
:00401A52 FF431C inc [ebx+1C]
:00401A55 8B86DC020000 mov eax, dword ptr [esi+000002DC]
:00401A5B E8F8A60D00 call 004DC158
:00401A60 8D55E8 lea edx, dword ptr [ebp-18]
:00401A63 52 push edx
:00401A64 8D5711 lea edx, dword ptr [edi+11]
:00401A67 8D45E4 lea eax, dword ptr [ebp-1C]
:00401A6A E819721200 call 00528C88
:00401A6F FF431C inc [ebx+1C]
:00401A72 8D55E4 lea edx, dword ptr [ebp-1C]
:00401A75 58 pop eax
:00401A76 E851741200 call 00528ECC
:00401A7B 50 push eax
:00401A7C FF4B1C dec [ebx+1C]
:00401A7F 8D45E4 lea eax, dword ptr [ebp-1C]
:00401A82 BA02000000 mov edx, 00000002
:00401A87 E85C731200 call 00528DE8
:00401A8C FF4B1C dec [ebx+1C]
:00401A8F 8D45E8 lea eax, dword ptr [ebp-18]
:00401A92 BA02000000 mov edx, 00000002
:00401A97 E84C731200 call 00528DE8 //用户名不能为空（傻子才会跟进去）
:00401A9C 59 pop ecx
:00401A9D 84C9 test cl, cl
:00401A9F 745F je 00401B00　　　　　　　　　　//下 r fl z ,F5退出，可看到上面提示
:00401AA1 66C743102C00 mov [ebx+10], 002C
:00401AA7 8D5712 lea edx, dword ptr [edi+12]
:00401AAA 8D45E0 lea eax, dword ptr [ebp-20]
:00401AAD E8D6711200 call 00528C88
:00401AB2 FF431C inc [ebx+1C]
:00401AB5 8D45E0 lea eax, dword ptr [ebp-20]
:00401AB8 33D2 xor edx, edx
:00401ABA 8955DC mov dword ptr [ebp-24], edx
:00401ABD 8D55DC lea edx, dword ptr [ebp-24]
:00401AC0 FF431C inc [ebx+1C]
:00401AC3 E82CA90100 call 0041C3F4
:00401AC8 8D45DC lea eax, dword ptr [ebp-24]
:00401ACB 8B00 mov eax, dword ptr [eax]
:00401ACD E8CA410100 call 00415C9C
:00401AD2 FF4B1C dec [ebx+1C]
:00401AD5 8D45DC lea eax, dword ptr [ebp-24]
:00401AD8 BA02000000 mov edx, 00000002
:00401ADD E806731200 call 00528DE8
:00401AE2 FF4B1C dec [ebx+1C]
:00401AE5 8D45E0 lea eax, dword ptr [ebp-20]
:00401AE8 BA02000000 mov edx, 00000002
:00401AED E8F6721200 call 00528DE8
:00401AF2 8B0B mov ecx, dword ptr [ebx]
:00401AF4 64890D00000000 mov dword ptr fs:[00000000], ecx
:00401AFB E9B6020000 jmp 00401DB6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401A9F(C)
|
:00401B00 66C743103800 mov [ebx+10], 0038
:00401B06 33C0 xor eax, eax
:00401B08 8945D8 mov dword ptr [ebp-28], eax
:00401B0B 8D55D8 lea edx, dword ptr [ebp-28]
:00401B0E FF431C inc [ebx+1C]
:00401B11 8B86E0020000 mov eax, dword ptr [esi+000002E0]
:00401B17 E83CA60D00 call 004DC158
:00401B1C 8D55D8 lea edx, dword ptr [ebp-28]
:00401B1F 52 push edx
:00401B20 8D5724 lea edx, dword ptr [edi+24]
:00401B23 8D45D4 lea eax, dword ptr [ebp-2C]
:00401B26 E85D711200 call 00528C88
:00401B2B FF431C inc [ebx+1C]
:00401B2E 8D55D4 lea edx, dword ptr [ebp-2C]
:00401B31 58 pop eax
:00401B32 E895731200 call 00528ECC
:00401B37 50 push eax
:00401B38 FF4B1C dec [ebx+1C]
:00401B3B 8D45D4 lea eax, dword ptr [ebp-2C]
:00401B3E BA02000000 mov edx, 00000002
:00401B43 E8A0721200 call 00528DE8
:00401B48 FF4B1C dec [ebx+1C]
:00401B4B 8D45D8 lea eax, dword ptr [ebp-28]
:00401B4E BA02000000 mov edx, 00000002
:00401B53 E890721200 call 00528DE8 //注册号不能为空（快点走吧……）
:00401B58 59 pop ecx
:00401B59 84C9 test cl, cl
:00401B5B 745F je 00401BBC　　　　　　　　　　　　　//下 r fl z ,F5退出，可看到上面提示
:00401B5D 66C743104400 mov [ebx+10], 0044
:00401B63 8D5725 lea edx, dword ptr [edi+25]
:00401B66 8D45D0 lea eax, dword ptr [ebp-30]
:00401B69 E81A711200 call 00528C88
:00401B6E FF431C inc [ebx+1C]
:00401B71 8D45D0 lea eax, dword ptr [ebp-30]
:00401B74 33D2 xor edx, edx
:00401B76 8955CC mov dword ptr [ebp-34], edx
:00401B79 8D55CC lea edx, dword ptr [ebp-34]
:00401B7C FF431C inc [ebx+1C]
:00401B7F E870A80100 call 0041C3F4
:00401B84 8D45CC lea eax, dword ptr [ebp-34]
:00401B87 8B00 mov eax, dword ptr [eax]
:00401B89 E80E410100 call 00415C9C
:00401B8E FF4B1C dec [ebx+1C]
:00401B91 8D45CC lea eax, dword ptr [ebp-34]
:00401B94 BA02000000 mov edx, 00000002
:00401B99 E84A721200 call 00528DE8
:00401B9E FF4B1C dec [ebx+1C]
:00401BA1 8D45D0 lea eax, dword ptr [ebp-30]
:00401BA4 BA02000000 mov edx, 00000002
:00401BA9 E83A721200 call 00528DE8
:00401BAE 8B0B mov ecx, dword ptr [ebx]
:00401BB0 64890D00000000 mov dword ptr fs:[00000000], ecx
:00401BB7 E9FA010000 jmp 00401DB6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401B5B(C)
|
:00401BBC 66C743105C00 mov [ebx+10], 005C
:00401BC2 33C0 xor eax, eax
:00401BC4 8945C4 mov dword ptr [ebp-3C], eax
:00401BC7 8D55C4 lea edx, dword ptr [ebp-3C]
:00401BCA FF431C inc [ebx+1C]
:00401BCD 8B86D8020000 mov eax, dword ptr [esi+000002D8]
:00401BD3 E880A50D00 call 004DC158
:00401BD8 8D55C4 lea edx, dword ptr [ebp-3C]
:00401BDB 33C0 xor eax, eax
:00401BDD 8B0A mov ecx, dword ptr [edx]
:00401BDF 8D55C8 lea edx, dword ptr [ebp-38]
:00401BE2 51 push ecx
:00401BE3 8945C8 mov dword ptr [ebp-38], eax
:00401BE6 FF431C inc [ebx+1C]
:00401BE9 8B86DC020000 mov eax, dword ptr [esi+000002DC]
:00401BEF E864A50D00 call 004DC158
:00401BF4 8D45C8 lea eax, dword ptr [ebp-38]
:00401BF7 8B00 mov eax, dword ptr [eax]
:00401BF9 33D2 xor edx, edx
:00401BFB 8955FC mov dword ptr [ebp-04], edx
:00401BFE 8D4DFC lea ecx, dword ptr [ebp-04]
:00401C01 FF431C inc [ebx+1C]
:00401C04 5A pop edx
:00401C05 E8762C0100 call 00414880
:00401C0A FF4B1C dec [ebx+1C]
:00401C0D 8D45C4 lea eax, dword ptr [ebp-3C]
:00401C10 BA02000000 mov edx, 00000002
:00401C15 E8CE711200 call 00528DE8
:00401C1A FF4B1C dec [ebx+1C]
:00401C1D 8D45C8 lea eax, dword ptr [ebp-38]
:00401C20 BA02000000 mov edx, 00000002
:00401C25 E8BE711200 call 00528DE8
:00401C2A 66C743105000 mov [ebx+10], 0050
:00401C30 66C743106800 mov [ebx+10], 0068
:00401C36 33C0 xor eax, eax
:00401C38 8945C0 mov dword ptr [ebp-40], eax
:00401C3B 8D55C0 lea edx, dword ptr [ebp-40]
:00401C3E FF431C inc [ebx+1C]
:00401C41 8B86E0020000 mov eax, dword ptr [esi+000002E0]
:00401C47 E80CA50D00 call 004DC158
:00401C4C 8D55C0 lea edx, dword ptr [ebp-40]
:00401C4F 8D45FC lea eax, dword ptr [ebp-04]
:00401C52 E875721200 call 00528ECC
:00401C57 50 push eax
:00401C58 FF4B1C dec [ebx+1C]
:00401C5B 8D45C0 lea eax, dword ptr [ebp-40]
:00401C5E BA02000000 mov edx, 00000002
:00401C63 E880711200 call 00528DE8 //恭喜你，你已成功注册（哈……哈……，快成功了！）
:00401C68 59 pop ecx
:00401C69 84C9 test cl, cl
:00401C6B 0F84C0000000 je 00401D31　　　　　　　//下 r fl z ,F5退出，可看到上面提示
:00401C71 66C743107400 mov [ebx+10], 0074
:00401C77 33C0 xor eax, eax
:00401C79 8945BC mov dword ptr [ebp-44], eax
:00401C7C 8D55BC lea edx, dword ptr [ebp-44]
:00401C7F FF431C inc [ebx+1C]
:00401C82 8B86D8020000 mov eax, dword ptr [esi+000002D8]
:00401C88 E8CBA40D00 call 004DC158
:00401C8D 8D55BC lea edx, dword ptr [ebp-44]
:00401C90 33C0 xor eax, eax
:00401C92 8B0A mov ecx, dword ptr [edx]
:00401C94 8D55B8 lea edx, dword ptr [ebp-48]
:00401C97 51 push ecx
:00401C98 8945B8 mov dword ptr [ebp-48], eax
:00401C9B FF431C inc [ebx+1C]
:00401C9E 8B86DC020000 mov eax, dword ptr [esi+000002DC]
:00401CA4 E8AFA40D00 call 004DC158
:00401CA9 8D55B8 lea edx, dword ptr [ebp-48]
:00401CAC 8B0A mov ecx, dword ptr [edx]
:00401CAE 51 push ecx
:00401CAF E818340100 call 004150CC
:00401CB4 83C408 add esp, 00000008
:00401CB7 FF4B1C dec [ebx+1C]
:00401CBA 8D45B8 lea eax, dword ptr [ebp-48]
:00401CBD BA02000000 mov edx, 00000002 //D EDX ,ALT+↑可看到注册码
:00401CC2 E821711200 call 00528DE8
:00401CC7 FF4B1C dec [ebx+1C]
:00401CCA 8D45BC lea eax, dword ptr [ebp-44]
:00401CCD BA02000000 mov edx, 00000002
:00401CD2 E811711200 call 00528DE8
:00401CD7 66C743108000 mov [ebx+10], 0080
:00401CDD 8D573D lea edx, dword ptr [edi+3D]
:00401CE0 8D45B4 lea eax, dword ptr [ebp-4C]
:00401CE3 E8A06F1200 call 00528C88
:00401CE8 FF431C inc [ebx+1C]
:00401CEB 8D45B4 lea eax, dword ptr [ebp-4C]
:00401CEE 33D2 xor edx, edx
:00401CF0 8955B0 mov dword ptr [ebp-50], edx
:00401CF3 8D55B0 lea edx, dword ptr [ebp-50]
:00401CF6 FF431C inc [ebx+1C]
:00401CF9 E8F6A60100 call 0041C3F4
:00401CFE 8D45B0 lea eax, dword ptr [ebp-50]
:00401D01 8B00 mov eax, dword ptr [eax]
:00401D03 E8B03E0100 call 00415BB8 //弹出“恭喜你，你已成功注册”窗口

**************************************************************************************************************

    大家明白了吗？r fl z 并不会真的修改程序，只是起到模拟的作用，用它来验证某些 CALL 的功能非常好用，象我这种不太懂汇编的初学者来说，看到可疑的 CALL 与 jne,je 时，在jne/je 处下 r fl z ，再 F5 退出，看一看提示，就毋须象以前那样乱 D or ？一通，甚至 F8 跟入，徒劳无功了。如象 00401C63 处，在 00401C6B je 00401D31 处下 r fl z,弹出成功窗口，说明这个call有问题，虽然跟进这个 call 只能看到正确注册码的前三位，但很多软件还是用这种办法直接找到注册码或 F8 跟入再找到注册码的。

注：1、各位验证某个 call 时最好先 BD * 中断之前的所有断点，再在这个 call 设断，下 r fl z ，F5 退出后，如果发现不是验证注册码的 call ，按确定一般都可以被 TRW2000,SOFT-ICE 拦截，以便继续验证。（因为验证可能不止一次，如上例，以免重复作无谓的劳动。）
    2、00401C6B je 00401D31 处必须下 r fl z，否则你是不可能来到00401CBD mov edx, 00000002的，切记，切记！


Softice宏定义

 标 题:我的部分softice宏定义，仅供参考 (854字)
发信人:十夜
时 间:2000-7-31 9:14:26
详细信息:

 MACRO sname=" s 0 l FFFFFFFF 'Tennight.C' "
MACRO sserial=" s 0 l FFFFFFFF '13131313' "
MACRO wideser=" s 0 l FFFFFFFF '1',0,'3',0,'1',0,'3',0,'1',0,'3',0,'1',0,'3'
  "
MACRO widename=" s 0 l FFFFFFFF 'T',0,'e',0,'n',0,'n',0,'i',0,'g',0,'h',0,'t',0,'.',0,'C'
  "
MACRO argdlg="D esp->c ; p ret"
MACRO argwin="D esp->8 ; p ret"
MACRO argreg="D ESP->14;"
MACRO argpe="D ESP->4;"
MACRO bpxget=" bpx GetDlgItemTextA DO \" argdlg \" ; bpx GetWindowTextA DO \"
  argwin \" "
MACRO bpxget16=" bpx GetDlgItemText; bpx GetWindowText "
MACRO bpxgeta=" bpx GetDlgItemTextA; bpx getwindowtexta; bpx getdlgitemint;
  bpx getdlgitemtext; bpx getwindowtext; bpx getwindowtextw; bpx getdlgitemtextw
  "
MACRO reg="bpx RegQueryValueExA IF *(ESP->8) == '%1' DO \" argreg \" "
MACRO bpxpe=" bpx LoadLibraryA DO \" argpe \" "
MACRO anti=" bpx CreatFileA DO \" argpe \" "


看雪学苑

 标 题:已经找到几种解决在SOFTICE中在第一条指令中断的方法，希望大家找到更多更好的.多谢看雪兄的提示. (980字)
发信人:ljttt
时 间:2000-7-23 16:16:18
详细信息:
1、根据看雪兄的提示，用ProcDump找到压缩程序的入口点所在的Section，修改其characteristics为E000020，就成功了。不过要注意对有其自身的代码检查功能的程序。跟踪时注意跳转。对Asprotect压缩过的程序不行。

2、以上方法不行的话，再试试这种方法
以下为步骤：
1、用ProcDump修改该程序的入口点所在的Section为E000020。（其实这步不要好象也行）
2、用ProcDump修改程序的入口点，使其减一。比如：ProcDump显示Entry Point:0005B001就改为0005B000。
（如果新的入口点不和原入口点在同一Section会出现什么问题?？请高手赐教。Asprotect压缩过的程序刚好为我们留了一个字节的空间。）
3、用HIEW修改新的入口点的这一个字节的内容为0xCC。（就是int 3)
4、用SoftICE的Loader装入程序，Ctrl-D中断，设置I3HERE ON。(以前我就是没有设置I3HERE ON所以不成功）
5、Load。中断在入口。刚刚好。呵呵....
这种方法我刚发现。有效性有多大还请大家一起试一下。我试了试对Asprotect压缩过的程序可以。这种方法的思路来自一位高手的一篇以前的SOFTICE for DOS中对DOS4GW中断的文章。我把它移植到M$中来。不过中断后别忘了设置I3HERE OFF免得麻烦。


WinME

 标 题:WinME 小故事 (从网上来) (748字)
发信人:WinDos2K
时 间:2000-9-15 14:42:26
详细信息:
MS 在ME上将real mode 清除,改动io.sys的工能.不运行config.sys,command.com与win.com ,直接跟vmm32.vxd连通,因
此没有autoexec.bat与INT68 (real debugger debugger) interface,
而S-ICE 需要在real mode装载自已,但因win.com不运行
(win.com会找寻并装载real mode debugger),又没有autoexec.bat,Numega没法运行winice.exe.
不知是Numega找到或MS通知,在debug build的io.sys 会
运行一个叫 debugger.exe的程序,故在Numega 站有debugger.exe下载.(跟MS提供的有异,会装载winice.exe)
另Win98MEDDK裹有debug用的io.sys(checked io.sys or winboot.sys),以上是原厂方法.
但另外有人发现原io.sys会装载另一各字的debugger,
(loader.exe),象wmeldr.zip裹便是,有源码可参考.此为
土法,但比原厂的方便,0.3 版可选装或不装winice.exe,现
已有人说hmemcpy这断点不能在ME上工作,我没用它debug,
only安装.


调试符号文件*.NMS

标 题:转载：如何生成SoftICE可用的调试符号文件*.NMS (1千字)
发信人:1212
时 间:2001-4-15 22:12:49
详细信息:
除了可以直接从PE文件中提取出其Export Table中的函数符号名之外，SoftICE可以直接使用的调试符号文件只有*.NMS。

得到可执行程序的NMS文件的途径如下：

1、DBG/PDB－>NMS
如果在编译时生成了*.DBG/*.PDB文件，直接用SoftICE Symbol Loader打开*.DBG文件，然后选择菜单Module－>Translate即可生成*.NMS。在Translate选项中选择Include source则生成的*.NMS中包含有程序源码（当然前提是*.DBG/*.PDB中有源码），就可以在源码一级进行调试，否则NMS文件只包含符号名而没有源码。Windows系统本身的符号文件在其安装光盘上有。

SoftICE自带的命令行工具（在其util16目录下）dbg2map.exe还可以将DBG转换成MAP文件，参考下面的3。

2、SYM－>NMS
可以用SoftICE自带的命令行工具nmsym.exe将*.SYM转换成*.NMS。

3、MAP－>NMS
如果没有可执行程序的源码，也没有*.DBG/*.PDB文件，可以先用IDA对程序进行反汇编，IDA可以识别出常用的库函数并生成*.MAP文件（链接器link.exe、tlink.exe也可以生成MAP文件，当然必须是自己写的程序）。再利用SoftICE自带的命令行工具msym.exe将MAP转换成SYM文件，然后参考上面的2得到NMS文件。
对于没有源码的COM组件，还可以利用Matt Pietrek写的TLBDBG（http://www.microsoft.com/msj/0399/code/TLBDBG.zip）根据其TypeLib得到MAP/DBG文件，进而再得到NMS文件。注意TLBDBG只能处理进程内COM服务器。

当然上述文件格式的转换还可以用其它工具来完成。

要加载*.NMS文件，只需在SoftICE Symbol Loader的菜单Edit－>SoftICE Initialize Settings－>Symbols中指定相应的NMS文件并重启即可。

作者；Netguy


TRW抓图的方法

标 题:trw抓图的方法(326字)
发信人:冷雨飘心[BCG]
时 间:2001-8-1 21:58:37
详细信息:

还记得ver blue 命令吗?当然是改变字体和背景颜色的.就是Ver命令包含机关,

Ver keep试试,就是保持屏幕,任你抓!不过只能抓system代码屏幕,如果要抓运行的,就要

作一点处理, 调试程序时,如果向后继续运行有输出(E.g.跳出出错对话框),就会破坏屏幕显示,所以只好A ****:******** jmp eip使程序中止以免破坏屏幕,这时再抓图吗,明白了? 注意trw版本,我的是1.22,其他版本没有测试.

补充,如果不是非常快地跳出对话框等,也可以输入ver keep命令,一只手马上回车,另一只手按按print screen键,不过要手足够快,如果是星际高手,将很有帮助,否则看来只能按上述方法了

标 题:除了ver blue,ver keep外好像没有什么有用的命令: (176字)
发信人:冷雨飘心[BCG]
时 间:2001-8-3 20:33:21
详细信息:

还有ver mem--显示内存分配信息
ver info --嘿嘿可能是一些调试信息
ver say --输出坐标信息
ver erro -用来调试?
ver test -没有作用
ver tst1-没有作用
....好像没有什么有用的东东


TRW2k1.23除Bug记

 标 题:Trw2k1.23除Bug记 (4千字)
发信人:xiaqin[CCG]
时 间:2001-7-11 20:08:42
详细信息:
Trw2k1.23除Bug记

【声明】
我写这篇文章是以技术交流为主，希望大家在转载时能保持文章的完整性

相信玩破解的朋友都知道Trw2000.（废话）。Trw2000和ICE相比，体积小。使用时不用重新起到计算机。还可以脱壳。等等诸多优点。但是，稳定性差强人意。对硬件要求高。对很多的硬件不兼容！

这不小弟的电脑就属于那种不能使用trw2000.显示卡不支持!!!!呜.....呜.....痛苦啊！

先看看小弟的机器配置(是不是惨不能睹)
CPU Pentium MMX233
内 存 64MB
主 版 华硕 TX97-E
显示卡 创新 Graphics Blaster Exxtreme 4MB (Permedia 2V显示芯片) <<--就是他惹的祸！

情况是这样的，运行Trw2k1.23后,计算机的按键盘、移到鼠标都没有反应。同死机了一样。Ctrl+Alt+Del都不能重新启动计算机。必需按机箱上的RESET.才可以重新启动计算机。

如果在一开始就载入了ICE的话，这时Ctrl+D进入S-ice可以发现在下面。

EAX=000B8000 EBX=00000000 ECX=CA76AE1C EDX=000003DA ESI=000B8000
EDI=C1773E60 EBP=CA76AE10 ESP=CA76ADF0 EIP=C18FB458 o d I s Z a P c
CS=0028 DS=0030 SS=0030 ES=0030 FS=0078 GS=0030
==================================================byte==============PROT==?0)==
0030:00000000 CC 00 FF 2F 2B 04 70 00-C3 E2 00 F0 2B 04 70 00 .../+.p.....+.p.
0030:00000010 2B 04 70 00 54 FF 00 F0-08 80 00 F0 6F EF 00 F0 +.p.T.......o...
0030:00000020 00 00 00 C8 87 E9 00 F0-6F EF 00 F0 6F EF 00 F0 ........o...o...
0030:00000030 6F EF 00 F0 6F EF 00 F0-57 EF 00 F0 6F EF 00 F0 o...o...W...o...
==========================================================================ROT32

0028:C18FB42D ADD [EAX],AL
0028:C18FB42F PUSHAD 
0028:C18FB430 MOV [C193EE00],ESI
0028:C18FB436 MOV [C193EE04],EDI
0028:C18FB43C MOV [C193EDF8],EAX
0028:C18FB441 CALL C191ACC4
0028:C18FB446 POPAD
0028:C18FB447 RET
0028:C18FB448 PUSH EDX
0028:C18FB449 PUSH EAX
0028:C18FB44A MOV EDX,000003D4
0028:C18FB44F ADD EDX,06
0028:C18FB452 IN AL,DX
0028:C18FB453 TEST AL,01
0028:C18FB455 JNZ C18FB452
0028:C18FB457 IN AL,DX <--|al=0 跳不出这个循环
0028:C18FB458 TEST AL,01 <<--光标停在此处。 |形成死循环。
0028:C18FB45A JZ C18FB457 <--|这是造成计算机的原因.
0028:C18FB45C POP EAX
0028:C18FB45D POP EDX
0028:C18FB45E RET
0028:C18FB45F PUSH EBP
0028:C18FB460 MOV EBP,ESP
0028:C18FB462 PUSH EDX 
0028:C18FB463 PUSH EBX  
====================================TRW2000(01)+DF6D============================
:pagein n 1.txt
:pagein n 2.txt

PAGEIN address Trw2000

解决的方法:0028:C18FB45A JNZ C18FB457

这个方法同样适用于trw2000以前的各个版本.但是只能适用于在创新 Graphics Blaster Exxtreme 4MB (Permedia 2V显示芯片)上使用，不能在其他显示卡使用。不然的话同样会死机。

xiaqin
China Cracking Group
2001.06.15


DLLShow V4.6

 标 题:翻译的第三篇，软件算法和 OllyDB的用法（新的调试软件） (10千字)
发信人:TAE!
时 间:2001-7-19 19:13:44
详细信息:
原著：Hoof Arted

译者：TAE![CCG]

唉，这篇翻译的实在是太烂了，大家就看看如何使用新的调试工具 OllyDB 吧。

新手教程 by Hoof Arted (Hoof's Workshop)

教程 - ；破解并且做 DLLShow by Software By Design 的注册机（奇怪，这篇好像没有注册机）

目标 : DLLShow V4.6 - http://www.gregorybraun.com/

工具 : OllyDBG.exe - http://www.suddendischarge.com

这是我的第一片教程，我希望有时间写更多的，我是一个破解新手，搞破解已经花了我
太多的时间了，但我仍然有很长的路要走，我尽力使这篇文章通俗易懂，我认为只有在
你熟悉目标软件的情况下，你才可以破解它，我将开始描述调我们这课需要的试产品。

我不是一个好的 SoftIce 迷，光是熟悉指令和安装就花了我许多时间，我也很喜欢使用
W32dasm 但我尽管使用它在许多场合有很多限制。我升级到Windows2000后，竟然运行不
了32dasm 了，我想找一个和它相同的调试/反编译软件，如果要比 w32dasm 更强大的，
那我就已经找到了，它就是 Ollydbg，做这是：Oleh Yuschuk，这是给像我一样已经等了
很久的人的一个工具，会使用 w32dasm 的你，你也将会掌握它的。

一个伟大的工作即将开始。

干掉它，跟我来吧，做我所作的，并且我尽我所能的解释给你听。

我选择这个目标的原因是它没有一个好用的卸载程序，许多程序员小贩都不把他们的软件
做的很友好:(

让我们开始吧！

到我上面写的那个网站下载一个目标程序。解压缩并且安装它，运行 DLLShow 并且选择
注册选项。你将看见软件需要输入名字，公司和注册码，我们现在已经可以大致确定这是
一个根据姓名和公司名来生成注册码的软件，这也是破解过程中的一个进展。我们要找出
密码，并且看它使如何产生的。

好的，现在我们要输入注册码但我们根本没有正确的注册码，打开 Ollydbg 并且用它打开
软件(DLLShow.exe)。默认的，你将看见4段不同用处的调试窗口，左上角的用于显示反编
译代码，右上角的用于显示寄存器数据这是非常有用的，不像softice，你想查看寄存器中
有疑问的地址，那么这个调试器显示地址的内容，如果程序使ascii码值(姓名或注册码:)，
都将显示它并且你不需要转换。（这段翻译的有些难懂，我也很难理解原文）

左下角，显示当前所载入的软件数据在内存中的位置，这对找出数据很有帮助，你将待会儿
将看见我是如何利用它的，右下角显示被各种函数所使用的内存，我也是初学者，也不知道
这个窗口的所有用处，但是现在，我们并不需要知道。

那好，用调试器载入程序，我们需要运行它。选择"Deebug" 并且点击"Run"或按 F9。软件
将像平时一样运行。去注册窗口并且输入名字，公司和注册码我输入的是：

NAME : Hoof Arted
COMPANY : Hoof's Workshop
SERIAL : 77777777

你现在可以是用任何数字作注册码，我喜欢7，而且保持在8个字符，这将是我干得快些，(他
们说7是幸运数字！)

我们知道如果我们点击 “OK”按钮，软件将会弹出一个“愚蠢破解者”的窗口，我们需要知道在
哪里设置断点，我喜欢首先试着用 GetDlgItemTextA ，在 Ollydbg 中设置断点有一些不同，
因为查找函数不像你希望的那样工作，右击左上角的窗口，并且选择 “Search for NAME (LABEL)”
这将出现一个带有许多软件所使用的函数的小窗口，向下拉动滑动条到了USER32.GetDlgItemTextA
并且使它处于高亮状态，右击它选择"Find references to import"，；另一个窗口打开了，显示
着软件调用函数的地址，通过按F2在每一个上面都设置一个断点，然后他的左边就会变成红色，
如果有任何地方呼叫这里都会被调试器所暂停。

好的，现在单击目标软件的“OK”按钮。调试器将停在地址 4159FB 这里，我们不关心函数
GetDlgItem function 是如何运行的，所以我们点击地址 4159FB 并且按 F2 来清除断点，然后，
选择下一行再按 F2 来恢复断点。按 F9 来运行软件以通过这个地方，它再次被停下来了，我们
可以看见 ESI 寄存器(右上角) 现在有一个Ascii码"Hoof Arted"，真不错！它现在得到我们的
名字了，如果我们再次按 F9，目标软件将再次停在相同的断点，但是这次，ESI 已经是我们的
公司名了，是一个 ASCII。按 F9 第三次 Esi 将显示我们输入的注册码。好，现在我们知道程序
已经得到我们所有的信息了。它将要用这些信息作什么呢？

因为它已经得到了我们输入的所有信息了，我们需要从这儿将它带到软件中，我们不能再按F9运行，
因为要找到我们想要得到的东西，所以我们按 F7 来一步步的运行，直到你到了以下代码处 :

0040D717 |. 8D4C24 40 LEA ECX,DWORD PTR SS:[ESP+40] <<<<<<<<
0040D71B |. 51 PUSH ECX
0040D71C |. E8 25990000 CALL DLLShow.00417046 <<<<<<< Call (a)
0040D721 |. 56 PUSH ESI
0040D722 |. 8BD8 MOV EBX,EAX
0040D724 |. E8 37820000 CALL DLLShow.00415960 <<<<<<< Call (b)
0040D729 |. 83C4 38 ADD ESP,38
0040D72C |. 3D 92A71901 CMP EAX,119A792
0040D731 |.,75 18 JNZ SHORT DLLShow.0040D74B

现在，如果你进入了第一个Call (Call A) 你将看见它对我们的注册码做了些社那么，我们对
暂时不关心这个，设置断点在 0040D721 并按 F9，当我们停在下一行的时候，我们可以看看寄
存器 EAX ，我的显示为 04A2CB71，这个数的十进制是什么？用计算器算一下看看，这是我们
输入的假注册码！call A 是将我们的假注册码转换为16进制， Hmmmm...有趣，可能下一个call
就是计算正确注册码的地方了，按 F7 进入 call 然后停一停，有些东西我需要解释给你听。

正如你所看到的，函数被显示在下面：

00415960 /$ 51 PUSH ECX ;
DLLShow.00426006
00415961 |. 53 PUSH EBX
00415962 |. 8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
00415966 |. 56 PUSH ESI
00415967 |. 33F6 XOR ESI,ESI
00415969 |. 53 PUSH EBX ; /Length Of Name
0041596A |. 897424 0C MOV DWORD PTR SS:[ESP+C],ESI ; |
0041596E |. FF15 B4E04100 CALL DWORD PTR DS:[<&KERNEL32.lstrlen>; \lstrlenA
00415974 |. 85DB TEST EBX,EBX
00415976 |.,74 4F JE SHORT DLLShow.004159C7
00415978 |. 85C0 TEST EAX,EAX
0041597A |.,74 4B JE SHORT DLLShow.004159C7
0041597C |. 33D2 XOR EDX,EDX
0041597E |. 85C0 TEST EAX,EAX
00415980 |.,7E 45 JLE SHORT DLLShow.004159C7
00415982 |. 55 PUSH EBP
00415983 |. 57 PUSH EDI
00415984 |. BE 183E4200 MOV ESI,DLLShow.00423E18 ;ASCII"|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw"
00415989 |. BF 01000000 MOV EDI,1
0041598E |. 2BF3 SUB ESI,EBX
00415990 |. 8BCB MOV ECX,EBX ;
00415992 |. 2BFB SUB EDI,EBX
00415994 |> 0FBE1C0E MOVSX EBX,BYTE PTR DS:[ESI+ECX] ; 将上面的Ascii依次移动到EBX
00415998 |. 0FBEAC10 E03D4>MOVSX EBP,BYTE PTR DS:[EAX+EDX+423DE0] ; chr(423DE0 + Len + Pos) 放入 EBP
004159A0 |. 0FAFDD IMUL EBX,EBP ; 相乘
004159A3 |. 8D2C0F LEA EBP,DWORD PTR DS:[EDI+ECX]
004159A6 |. 0FAFDD IMUL EBX,EBP ; 相乘结果再乘位数
004159A9 |. 0FBE29 MOVSX EBP,BYTE PTR DS:[ECX] ; 移动名字的字符到EBP
004159AC |. 0FAFDD IMUL EBX,EBP ; 相乘结果再乘以名字字符
004159AF |. 8B6C24 10 MOV EBP,DWORD PTR SS:[ESP+10] ;
004159B3 |. 03EB ADD EBP,EBX ; 累加
004159B5 |. 42 INC EDX ; 下一个字符
004159B6 |. 41 INC ECX
004159B7 |. 3BD0 CMP EDX,EAX ; 名字结束了吗？
004159B9 |. 896C24 10 MOV DWORD PTR SS:[ESP+10],EBP ; 存入[ESP＋10]
004159BD |.^7C D5 JL SHORT DLLShow.00415994 ; 跳转，形成循环
004159BF |. 8BC5 MOV EAX,EBP ;
004159C1 |. 5F POP EDI
004159C2 |. 5D POP EBP
004159C3 |. 5E POP ESI
004159C4 |. 5B POP EBX
004159C5 |. 59 POP ECX
004159C6 |. C3 RETN

Ollydbg做的比较好的就是他可以给语句添加注释，你还可以随时更改这些注释，我还
从没有看见其他的调试器可以做到这一点（译者：TRW不就可以？）你只需要对着语句
点击右键然后选择“Comment”即可，那很简单。这样你就不需要把重要的地方记在纸
上了。

好，我们看见那个函数检查了名字的个数(0041596E)，然后它就移动下面的 ascii：
"|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw" (00415984)放进了内
存。那么，这所有的动作说明了什么呢？好的，如果我们熟悉它的话，就会发现它移动
我们上面所说的每个字符一个一个的放入EBX。EBP中的值就是从地址 423de0 + (我们
名字的个数) + (字符的位置)。但是，423de0 里面又是什么呢？让我们把它找出来，
右击左下部的并且选择要去的地址，输入 423de0 然后单击“OK”，你将看到以下片断：

00423DE0 23 73 65 72 42 26 6E 7A 7C 6D 66 4D 31 2F 35 28 #serB&nz|mfM1/5(
00423DF0 21 73 64 24 4D 71 2E 7B 73 5D 2B 73 46 6A 74 4B !sd$Mq.{s]+sFjtK
00423E00 70 7A 53 64 74 7A 6F 58 71 6D 62 5E 41 6C 40 64 pzSdtzoXqmb^Al@d
00423E10 76 3A 73 3F 78 2F 00 00 7C 62 21 70 7A 2A 6C 73 v:s?x/..|b!pz*ls
00423E20 3B 72 6E 7C 6C 66 24 76 69 5E 41 78 70 65 29 72 ;rn|lf$vi^Axpe)r
00423E30 78 35 61 69 63 26 39 2F 32 6D 35 6C 73 69 34 40 x5aic&9/2m5lsi4@
00423E40 30 64 6D 5A 77 39 34 63 6D 71 70 66 68 77 0dmZw94cmqpfhw

这是有用代码的第二段，下一行乘以两个值，我这里是“66”和“7C”，它然后它乘
以总数，用名字的位数1 (H)、2(o).... 它然后用名字的第一个字符和乘积，在我这儿
是48 (H)，然后所有的数都这样，我得总数是1E159AD，继续按F7直到呢到达以下片断：

00415400 /$ 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
00415404 |. 56 PUSH ESI
00415405 |. 8B35 84C34200 MOV ESI,DWORD PTR DS:[42C384] ;
DB95DB95 = Hardcoded
0041540B |. 50 PUSH EAX
0041540C |. 81CE 78030000 OR ESI,378 ; Or
with 378 = DB95DBFD
00415412 |. E8 49050000 CALL DLLShow.00415960
00415417 |. 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
0041541B |. 03F0 ADD ESI,EAX ; Add
Name total and Co total to DB95DBFD
0041541D |. 51 PUSH ECX
0041541E |. E8 3D050000 CALL DLLShow.00415960
00415423 |. 83C4 08 ADD ESP,8
00415426 |. 03C6 ADD EAX,ESI ;
Total = E2F7A8AE
00415428 |. 5E POP ESI

这是在干什么呢？它带着你的总数，并且加上它的 hardcoded，(DB95DB95 OR 378) = DB95DBFD
整个计算此数过程以公司名重复的，两个总和的地址指向 E2F7A8AE 这个数，做的所有事情就是转化
成十进制数。这个数就是注册码了！

按 F9 直到得到错误讯息并且输入一个新的注册码，就是他!!! 你已经破解它了。

现在我们知道注册码被生产了，你可以做一个属于你自己的注册机了，我已经破解这个公司出的许
多软件了，因为他们是很懒惰的。他们使用同一种算法，仅仅是换个ID"DB95DB95".

我希望你能从这个教程中学到一些关于 Ollydbg 的使用方法，这是一个新的调试软件。

Hoof Arted (Hoof's Workshop) "Go forth and KICK ass!"

h_arted@hotmail.com


网吧计费软件专用版 2.0

 标 题:网吧计费软件专用版 2.0--注册篇。简单的Ollydbg破解教程，不知道那个组织能收留我！呵呵和！ (879字)
发信人:忘了自己
时 间:2001-8-2 20:31:16
详细信息:
网吧计费软件专用版 2.0--注册篇
－－－－－－－－－Ollydbg破解

作者：忘了自己
时间：2001年8月2日 20：00

使用工具：OllyDbg

软件名称：网吧计费软件专用版 2.0
下载地址: ftp://211.100.8.153/download/102/12112_netbar.zip

步骤：
1。用OllyDbg加载网吧计费软件专用版 2.0。按F9执行。
2。ALT＋E选择到MSVBVM60.dll模块，按右键，选择“Search for ->Name (label)” 出现软件所调用函数的窗口，向下拉动找到VB函数__vbaStrComp 并选择它,按下F2。
3。回到主程序，选注册，OllyDbg拦截住，此时什么也没有，按F9继续。
4。回到主程序，填入注册码 1234567890 ，点注册。
5。OllyDbg拦截。哈哈，看右下角。。。。OK。（注意：注册码有45之多，调整 窗口大小以显示所有注册码。）

哈哈！原来OllyDbg破解注册码这么简单！怎么样，你要不要试一试。

感谢大唐飞侠的教程！

我的注册码是

6914462

1123161A981322EB82815777113B21C149AC0302DCC14

转载时希望保持完整，谢谢！


W32Dasm8.93捉虫记

 标 题:W32DASM8.93捉虫记 湖北 wuhuashang
时 间:2000-7-21 9:01:47
详细信息:
W32DASM8.93捉虫记 湖北 wuhuashang
W32DASM是调试修改程序的强大工具，作为SOFTICE的辅助工具W32DASM为CRACKER必备。
当前许多软件采用注册方式，输入注册号,若正确显示"THANK YOU",否则显示"INCORRECT PASSWORD",用W32DASM反编译该软件,然后查找指定的错误信息如"INCORRECT PASSWORD"或其他因没有注册而显示的某些提示信息,假若被找到,对熟练的CRACKER而言,可能10分钟后便完成破解,而对于没有破解经验的计算机爱好者,只要他有一点汇编语言知识,再看一些别人用W32DASM破解的文章,用不了几天,他便可以破解INTERNET网上的许多共享软件;但是如果显示的信息并不是英文而是中文如"注册号不正确",您试着也找......,您发现只要是中文信息,W32DASM是没法对中文反编译的!
W32DASM不支持中文日文韩文的反编译,把它看作BUG应该可以被修改,磨刀不误砍柴工!.
我写此文章不是教人破解软件的加密信息,而是写出修改此软件的BUG的过程,假设反编译的中文软件DEMO.EXE,输入错误注册号后显示"无效的注册号".
1.您可以用HEXEDIT修改为"ERRORPASS"(若被未知的软件压缩加密呢?),修改后最好注销或重新启动计算机(内存有ERRORPASS字串)
2.启动W32DASM,打开DEMO.EXE,在32DASM反编译约1-3秒钟后CTRL+D切入SOFTICE
S DS:0 L FFFFFFFF "ERRORPA" (不要输入为ERRORPASS,就是不要完整啦)
若没有找到退出SOFTICE,重新打开DEMO.EXE,大约3秒钟后CTRL+D切入SOFTICE(依次类推),经过一翻斗争
在167:00610175处发现有"ERRORPASS"字串.
3.设置断点BPM 167:610175,退出SOFTICE,W32DASM继续编译,马上被SOFTICE拦截,分析:W32DASM能反编译的字 符串的ASCII值在20H-7F之间,必然有CMP AX,20类似的比较,上下观察并没有该语句,退出SOFTICE,马上又被 SOFTICE拦截下来,停止在CS:417241处:

.0041721A: 8B8530FFFFFF mov eax,[ebp][0FFFFFF30]
.00417220: 85C0 test eax,eax
.00417222: 0F848B000000 je .0004172B3
.00417228: 8B93A5726000 mov edx,[ebx][0006072A5]
.0041722E: 8B8B081F6F00 mov ecx,[ebx][0006F1F08]
.00417234: 8D040A lea eax,[edx][ecx]
.00417237: 8B9530FFFFFF mov edx,[ebp][0FFFFFF30]
.0041723D: 0FBE0C10 movsx ecx,b,[eax][edx]

说明:D DS:EAX+EDX 好家伙!原来正在读入"ERRORPASS",可以猜想,W32DASM能识别的字符串的ASCII码为20-7D之间而中文的ASCII码>A0 (是负数),改CS:417244 75 CC ==>90 90 ,中文信息不就可以处理吗?哈哈,别高兴太早,会失败得惨!记录下CS:417241 83F9207C5C
.00417241: 83F920 cmp ecx,020 ;" "
.00417244: 7C5C jl .0004172A2 -------- (1)
.00417246: 8B83A5726000 mov eax,[ebx][0006072A5]
.0041724C: 8B93081F6F00 mov edx,[ebx][0006F1F08]
.00417252: 8D0C10 lea ecx,[eax][edx]
.00417255: 8B8530FFFFFF mov eax,[ebp][0FFFFFF30]
.0041725B: 0FBE1401 movsx edx,b,[ecx][eax]
.0041725F: 83FA7D cmp edx,07D ;"}"
.00417262: 7F3E jg .0004172A2

.00417264: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.0041726A: 8B83081F6F00 mov eax,[ebx][0006F1F08]
.00417270: 8D1401 lea edx,[ecx][eax]
.00417273: 8B8D30FFFFFF mov ecx,[ebp][0FFFFFF30]
.00417279: 0FBE440AFF movsx eax,b,[edx][ecx][-0001]
.0041727E: 83F820 cmp eax,020 ;" "
说明:有敏感的比较,共有多少处要修改呢?您不是设置有断点吗?退出SOFTICE,必然又拦截下来,用笔记录拦截的CS:IP.
.00417281: 7C23 jl .0004172A6 -------- (2)
.00417283: 8B93A5726000 mov edx,[ebx][0006072A5]
.00417289: 8B8B081F6F00 mov ecx,[ebx][0006F1F08]
.0041728F: 8D040A lea eax,[edx][ecx]
.00417292: 8B9530FFFFFF mov edx,[ebp][0FFFFFF30]
.00417298: 0FBE4C10FF movsx ecx,b,[eax][edx][-0001]
.0041729D: 83F97D cmp ecx,07D ;"}"
.004172A0: 7F04 jg .0004172A6

.004172A2: 33C0 xor eax,eax
.004172A4: EB05 jmps .0004172AB
.004172A6: B801000000 mov eax,000000001 ;" "
.004172AB: 898574FFFFFF mov [ebp][0FFFFFF74],eax
.004172B1: EB4B jmps .0004172FE
.004172B3: 8B93A5726000 mov edx,[ebx][0006072A5]
.004172B9: 8B8B081F6F00 mov ecx,[ebx][0006F1F08]
.004172BF: 8D040A lea eax,[edx][ecx]
.004172C2: 8B9530FFFFFF mov edx,[ebp][0FFFFFF30]
.004172C8: 0FBE0C10 movsx ecx,b,[eax][edx]
.004172CC: 83F920 cmp ecx,020 ;" "
.004172CF: 7C1E jl .0004172EF -------- (3)
.004172D1: 8B83A5726000 mov eax,[ebx][0006072A5]
.004172D7: 8B93081F6F00 mov edx,[ebx][0006F1F08]
.004172DD: 8D0C10 lea ecx,[eax][edx]
......
00417392: 0FBE0431 movsx eax,b,[ecx][esi]
.00417396: 83F820 cmp eax,020 ;" "
.00417399: 7C25 jl .0004173C0 -------- (4)
.0041739B: 8B93A5726000 mov edx,[ebx][0006072A5]
.004173A1: 8B8B081F6F00 mov ecx,[ebx][0006F1F08]
.004173A7: 8D040A lea eax,[edx][ecx]
.004173AA: 8B9530FFFFFF mov edx,[ebp][0FFFFFF30]
.004173B0: 8D0C10 lea ecx,[eax][edx]
.004173B3: 0FBE0431 movsx eax,b,[ecx][esi]
.004173B7: 83F87D cmp eax,07D ;"}"
.004173BA: 0F8E68FFFFFF jle .000417328
.004173C0: 8B9530FFFFFF mov edx,[ebp][0FFFFFF30]
.004173C6: 85D2 test edx,edx
.004173C8: 0F8483000000 je .000417451
.004173CE: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.004173D4: 8B83081F6F00 mov eax,[ebx][0006F1F08]
.004173DA: 8D1401 lea edx,[ecx][eax]
.004173DD: 8B8D30FFFFFF mov ecx,[ebp][0FFFFFF30]
.004173E3: 66833C0A20 cmp w,[edx][ecx],020 ;" "
此处的比较有点奇怪,为啥是CMP WORD PTR [EDX+ECX],20 而不是CMP BYTE PTR[EDX+ECX],20呢?而且有好几个地方.
.004173E8: 7256 jb .000417440 -------- (5)
.004173EA: 8B83A5726000 mov eax,[ebx][0006072A5]
.004173F0: 8B93081F6F00 mov edx,[ebx][0006F1F08]
.004173F6: 8D0C10 lea ecx,[eax][edx]

......
.004173F9: 8B8530FFFFFF mov eax,[ebp][0FFFFFF30]
.004173FF: 66833C017D cmp w,[ecx][eax],07D ;"}"
.00417404: 773A ja .000417440
.00417406: 8B93A5726000 mov edx,[ebx][0006072A5]
.0041740C: 8B8B081F6F00 mov ecx,[ebx][0006F1F08]
.00417412: 8D040A lea eax,[edx][ecx]
.00417415: 8B9530FFFFFF mov edx,[ebp][0FFFFFF30]
.0041741B: 66837C10FF20 cmp w,[eax][edx][-0001],020 ;" "
多好的比较方式,用此方法可以快速解决某些西文软件不能输入汉字的问题.不是吗?

.00417421: 7221 jb .000417444 -------- (6)
.00417423: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.00417429: 8B83081F6F00 mov eax,[ebx][0006F1F08]
.0041742F: 8D1401 lea edx,[ecx][eax]
.00417432: 8B8D30FFFFFF mov ecx,[ebp][0FFFFFF30]
.00417438: 66837C0AFF7D cmp w,[edx][ecx][-0001],07D ;"}"
.0041743E: 7704 ja .000417444
.00417440: 33C0 xor eax,eax
.00417442: EB05 jmps .000417449
.00417444: B801000000 mov eax,000000001 ;" "
.00417449: 898570FFFFFF mov [ebp][0FFFFFF70],eax
.0041744F: EB47 jmps .000417498
.00417451: 8B93A5726000 mov edx,[ebx][0006072A5]
.00417457: 8B8B081F6F00 mov ecx,[ebx][0006F1F08]
.0041745D: 8D040A lea eax,[edx][ecx]

......
00460556: 8A0418 mov al,[eax][ebx]
.00460559: 3C20 cmp al,020 ;" "
.0046055B: 7204 jb .000460561 -------- (7)
.0046055D: 3C7D cmp al,07D ;"}"
.0046055F: 7613 jbe .000460574
.00460561: 68DE3D4C00 push 0004C3DDE ;" L=?
.00460566: 8D95C0FEFFFF lea edx,[ebp][0FFFFFEC0]
.0046056C: 52 push edx
.0046056D: E8E8E60400 call .0004AEC5A
.00460572: EB2D jmps .0004605A1
.00460574: 6A01 push 001
我试所有的类似 CMP xxxx,20
JB/JL xxxx (该行用90 90 替换)
经验证发现许多应该显示的字符串也没有显示,惨惨惨!问题出在比较的方式不一样.您可以用HEXEDIT打开一个EXE文件,所有被显示字符串末尾有一个字节00H,当读取字符串完毕后读入字符00H,此时JB/JL必然成立,必须正常跳转,不能被改成NOP,所以改思路:
CMP WORD PTR [XXXX],20
JB/JL XXXX ==>90 90
CMP BYTE PTR[XXXX],20 { 对照(3)(4) (7)处} ===>20改00
JB/JL XXXX ==>JB改JE
完整记录下要修改处的CS:IP或16进制字串,用UNASPACK脱掉W32DASM的外壳,再用HEXEDIT(必须记录被修改处的16进制字串)或HACKVIEW修改,最后您去测试,中文信息是不是全显示出来了?

版权所有，请不要修改原内容


W32Dasm中的中文串

标 题:让w32dasm中的中文串正确显示！ (3千字)
发信人:bpx
时 间:2001-3-25 23:45:37
详细信息:
毫无疑问，w32dasm 是我们的武器。哪一位破客离得了它呀！IDA虽号称最强大，但我一般不愿去碰它。
（w32dasm我用的是自制的白金版, 不象所谓的黄金版有一个丑陋的小黑窗口)
不过，w32dasm有太多地方需要完善。当反汇编有中文字串的软件时，遇到的一个显著问题是中文串都以乱码显示，
这可是大大的不好! 现在让我们来解决它！
首先，用w32dasm 反汇编一个软件（如：notepad.exe), 然后， 然后怎么呢？当然是按下Ctrl-D祭出我们的
终极法宝softice啦，下断：
bpx gdi32!textout
F5后随便在w32dasm中移动一下光标，softice便拦截下来
按下F12就回到了 下面45E77E处。把附近的代码稍稍细看一下就会发现，作者对于要显示的字串是逐字符显示的，这样做的目的可能是有时为了以红色显示串的某一部分。如从串资源引用窗口双击某一串时，光标将移到那个串上并以红色显示那个串。在大多数情况下用不着这样。我们只要一口气将串显示出来中文串就能正确显示了，这样显示速度还更快！

Break due to BPX #0187:0045E782 (ET=4.41 seconds)
:u 45e754 l 40
原代码段：
017F:0045E754 6A01 PUSH 01 ;* Change here
017F:0045E756 8BD6 MOV EDX,ESI ;* and here
017F:0045E758 03D3 ADD EDX,EBX ;* and here
017F:0045E75A 81C2B4126F00 ADD EDX,006F12B4
017F:0045E760 52 PUSH EDX
017F:0045E761 FFB3A0126F00 PUSH DWORD PTR [EBX+006F12A0]
017F:0045E767 8B4DF4 MOV ECX,[EBP-0C]
017F:0045E76A 0FAFCE IMUL ECX,ESI
017F:0045E76D 8B45F8 MOV EAX,[EBP-08]
017F:0045E770 03C8 ADD ECX,EAX
017F:0045E772 51 PUSH ECX
017F:0045E773 FFB35C126F00 PUSH DWORD PTR [EBX+006F125C]
017F:0045E779 E802060500 CALL GDI32!TextOutA
017F:0045E77E 46 INC ESI
017F:0045E77F 8B55FC MOV EDX,[EBP-04]
017F:0045E782 3BF2 CMP ESI,EDX ;* Change here
017F:0045E784 0F823BFFFFFF JB 0045E6C5
017F:0045E78A 8B8BADF60100 MOV ECX,[EBX+0001F6AD]
017F:0045E790 85C9 TEST ECX,ECX
017F:0045E792 747B JZ 0045E80F

改成如下代码段：
================ Sun Mar 25 22:21:53 2001
:u 45e754 l 40
017F:0045E754 FF75FC PUSH DWORD PTR [EBP-04] ;串的长度
017F:0045E757 90 NOP
017F:0045E758 8BD3 MOV EDX,EBX ；EBX串的偏移基址，直接置入edx
017F:0045E75A 81C2B4126F00 ADD EDX,006F12B4
017F:0045E760 52 PUSH EDX ;串的地址
017F:0045E761 FFB3A0126F00 PUSH DWORD PTR [EBX+006F12A0]
017F:0045E767 8B4DF4 MOV ECX,[EBP-0C]
017F:0045E76A 0FAFCE IMUL ECX,ESI
017F:0045E76D 8B45F8 MOV EAX,[EBP-08]
017F:0045E770 03C8 ADD ECX,EAX
017F:0045E772 51 PUSH ECX
017F:0045E773 FFB35C126F00 PUSH DWORD PTR [EBX+006F125C]
017F:0045E779 E802060500 CALL GDI32!TextOutA
017F:0045E77E 46 INC ESI
017F:0045E77F 8B55FC MOV EDX,[EBP-04]
017F:0045E782 3BF6 CMP ESI,ESI ; 不用循环了
017F:0045E784 0F823BFFFFFF JB 0045E6C5
017F:0045E78A 8B8BADF60100 MOV ECX,[EBX+0001F6AD]
017F:0045E790 85C9 TEST ECX,ECX
017F:0045E792 747B JZ 0045E80F

建议保留原来的版本，当需要反汇编中文软件时就用这个改良版。


W32Dasm反汇编功能增强

 标 题:确实不错，还有一篇关于去除防反汇编功能的文章 (7千字)
发信人:1212
时 间:2000-7-23 11:17:32
详细信息:
主页：http://personal.dfminfo.com.cn/~kuangren/index.htm

准备工作:SOFTICE,W32DASM,HEXEDIT(两份,一份HEXEDIT1.EXE为原版未加密,反汇编OK,二份HEXEDIT2.EXE为ASPROTECT加密,无法反汇编,原因是文件头的信息.TEXT不能被W32DASM支持).故先必须记录下两个HEXEDIT被反汇编后在W32DASM窗口中前至少10行的内容(文件头包含的信息).首先记录下每个FLAG,开始攻击
.TEXT HEXEDIT1.EXE FLAG=60000020
.TEXT HEXEDIT2.EXE FLAG=C0000040其他信息因为文件被加密数据不会相同.本人没有教好的方法,采用最笨的吧,监视EAX,EBX等或某内存的数值为60000020(C0000040),若监视成功,必然会进行分别判断处理!

载入SOFTICE,启动W32DASM
打开反汇编文件HEXEDIT2.EXE点'OK'前BPX READFILE,要拦好几个地方,每拦一次注意是否有LOOP,BD *跳出循环,再 BE *以免手指会按的发抖.
.0045705A: E996000000 jmp .0004570F5 -------- (1)
.0045705F: 8B83A5726000 mov eax,[ebx][0006072A5]
.00457065: 03C7 add eax,edi
.00457067: 50 push eax
.00457068: 6BD61C imul edx,esi,01C ;" "
.0045706B: 03D3 add edx,ebx
.0045706D: 81C26A491700 add edx,00017496A ;" Ij"
.00457073: 52 push edx
.00457074: E8E17B0500 call .0004AEC5A -------- (2)
.00457079: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.0045707F: 8B443924 mov eax,[ecx][edi][00024]
好长的一条龙呀!而且下的其他断点,下次再用无效,感谢BPX READFILE每次失败后很快又到此风水宝坻.
D DS:ECX+EDI+24 我发现记录下来的FLAG反复在此显示,有多少个FALG?就循环多少次..
.00457083: 8BD6 mov edx,esi
.00457085: C1E203 shl edx,003 ;" "
.00457088: 2BD6 sub edx,esi
.0045708A: 89849382491700 mov [ebx][edx]*4[000174982],eax
保存所有的FALG数值到另外的地方,下次必读此内存,看来反汇编过程就在下面不远了.
.00457091: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.00457097: 8B443910 mov eax,[ecx][edi][00010]
.0045709B: 8BD6 mov edx,esi
.0045709D: C1E203 shl edx,003 ;" "
.004570A0: 2BD6 sub edx,esi
.004570A2: 8984937A491700 mov [ebx][edx]*4[00017497A],eax
.004570A9: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.004570AF: 8B443914 mov eax,[ecx][edi][00014]
.004570B3: 8BD6 mov edx,esi
.004570B5: C1E203 shl edx,003 ;" "
.004570B8: 2BD6 sub edx,esi
.004570BA: 8984937E491700 mov [ebx][edx]*4[00017497E],eax
.004570C1: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.004570C7: 8B44390C mov eax,[ecx][edi][0000C]
.004570CB: 8BD6 mov edx,esi
.004570CD: C1E203 shl edx,003 ;" "
.004570D0: 2BD6 sub edx,esi
.004570D2: 89849372491700 mov [ebx][edx]*4[000174972],eax
.004570D9: 8B8BA5726000 mov ecx,[ebx][0006072A5]
.004570DF: 8B443908 mov eax,[ecx][edi][00008]
.004570E3: 8BD6 mov edx,esi
.004570E5: C1E203 shl edx,003 ;" "
.004570E8: 2BD6 sub edx,esi
.004570EA: 89849376491700 mov [ebx][edx]*4[000174976],eax
.004570F1: 83C728 add edi,028 ;"("
.004570F4: 46 inc esi
ESI 做为计数器
.004570F5: 0FB78B381F6F00 movzx ecx,w,[ebx][0006F1F38]
. ECX统计有多少个SECTION(为MM),每个SECTION对应一个FLAG(记录没有)?JB 45705F循环MM次.

.004570FC: 3BF1 cmp esi,ecx
.004570FE: 0F825BFFFFFF jb .00045705F -------- (1)

循环结束,文件头的信息全部反汇编完毕就到此了,又跳到45711E.
.00457104: 33F6 xor esi,esi
.00457106: EB16 jmps .00045711E -------- (2)
.00457108: 8BC6 mov eax,esi
.0045710A: C1E003 shl eax,003 ;" "
.0045710D: 2BC6 sub eax,esi
.0045710F: F684838549170020 test b,[ebx][eax]*4[000174985],020
若JE成立跳到了45711D,ESI=ESI+1,我发现将不能正常反汇编(啥也没做嘛!)，
蒙蒙蒙!我更改此处的代码后连续反编译几个被加密的软件,蛙!一切正常,收工吃饭.
.00457117: 7404 je .00045711D -------- (1)
.00457119: 8BFE mov edi,esi
.0045711B: EB0C jmps .000457129 -------- (2)
.0045711D: 46 inc esi

.0045711E: 0FB783381F6F00 movzx eax,w,[ebx][0006F1F38]
.00457125: 3BF0 cmp esi,eax
EAX为SECTION计数器,好象是要继续进行个SECTION的反汇编了,JB 457108循环MM次.
.00457127: 72DF jb .000457108 -------- (3)
下面的代码难道不是在干可恶的反编译的勾当?
.00457129: 8BD7 mov edx,edi
.0045712B: C1E203 shl edx,003 ;" "
.0045712E: 2BD7 sub edx,edi
.00457130: 8B8C937A491700 mov ecx,[ebx][edx]*4[00017497A]
.00457137: 898BBC376F00 mov [ebx][0006F37BC],ecx
.0045713D: 6BC71C imul eax,edi,01C ;" "
.00457140: 03C3 add eax,ebx
.00457142: 056A491700 add eax,00017496A ;" Ij"
.00457147: 50 push eax
.00457148: 8D938D6A1700 lea edx,[ebx][000176A8D]
.0045714E: 52 push edx
.0045714F: E8067B0500 call .0004AEC5A -------- (4)
汉语功底不好,但是修改的地方已经指出来了.在我的主页HTTP://PERSONAL.DFMINFO.COM.CN/~KUANGREN可以下载W32DASM8.93(修改了不能调试中文信息的BUG,修改了不能调试VB中的信息的BUG,修改了不能静态反汇编的BUG.)


修改exescope6.10

 标 题:修改exescope6.10 (2千字)
发信人:小楼
时 间:2001-7-8 20:44:29
详细信息:
修改exescope6.10

曾经发现有些用upx压缩的软件，用prodump1.62解压后虽然可以反编译，但不能用exescope等察看或修改其中的资源。最近有人又出题，modemspy v1.6。用fileinfo看是upx0.72版压缩，用prodump解压运行无误，wdasm也可以反编译并找到其中的字符串。可是用exescope6.10等就是不能修改，说“"Cannot recognize the internal structure”。
用ultraedit打开modemspy.exe，在起始部看到
$Id: UPX 0.72 Copyright (C) 1996-1999 Laszlo Molnar & Markus Oberhumer $
$Id: NRV 0.61 Copyright (C) 1996-1999 Markus F.X.J. Oberhumer $
$License: NRV for UPX is distributed under special license
字样，估计就是NRV带来的麻烦。

猜想NRV防止修改资源的原理是，修改资源前的标记；或者对资源进行特别压缩。如果是前者，exescope等是依照这些标记来显示资源的。最好的办法是找到这些标记，改回来；从而用任何资源修改器都可以认识。只是我才疏学浅，不知方法？在此诚心请教。 如果资源被特别压缩了就很困难了，不过好像还没有看到这类软件，哈哈。

我的办法是修改exescope，使得不管这些标记对错，都显示。所以用wdasm反编译exescope6.10（872.960字节）英文原版，在“字符串引用”中寻找“Cannot recognize the internal structure”字样，共2处。(1)cs:00436577；(2)cs:004ACD78。用trw分别设断，用exescope打开解压的dump-modemspy.exe，在“字符串”中打开一个，被trw拦下：
......
:004ACD6D 3B45E0 cmp eax, dword ptr [ebp-20] <==eax为0
:004ACD70 7F15 jg 004ACD87 <==not jump
:004ACD72 8B15F8694B00 mov edx, dword ptr [004B69F8]

* Possible Reference to String Resource ID=00140: "Cannot recognize the internal structure, %s"
|
:004ACD78 B88C000000 mov eax, 0000008C
:004ACD7D E86E4A0000 call 004B17F0
:004ACD82 E97B020000 jmp 004AD002

OK。再用它打开一个没有压缩的程序，
:004ACD6D 3B45E0 cmp eax, dword ptr [ebp-20] <==eax为一个大数
:004ACD70 7F15 jg 004ACD87 <==jump

所以用hiew打开exescope.exe，到
:004ACD70 7F15 jg 004ACD87
~~
改为:004ACD70 EB15 jmp 004ACD87 <==强迫跳转
~~
保存后用之修改并保存解压的dump-modemspy.exe，OK。

标 题:好像不行。修改以后。exescope6.10不能打开以前一些可以打开的文件了。 (空)
发信人:披头二
时 间:2001-7-9 1:44:20
详细信息:


HEXEDIT2.54显示汉字

 标 题:让HEXEDIT2.54显示汉字(5千字)
发信人: wuhuashang
时 间:2000-7-23 11:30:45
详细信息:
让HEXEDIT2.54显示汉字 湖北 wuhuashang

主页：http://personal.dfminfo.com.cn/~kuangren/index.htm

某些西文软件存在不能输入汉字或显示汉字的问题,可能原因是编写软件的作者没有考虑周全,我在此介绍一种调试修改的方法,以供大家参考.
准备工作:工具:SOFTICE,HACKVIEW,HEXEDIT2.54.用写字板写几个字如"THISISDEMO我在演示",保存后注销或启动计算机.
1.载入SOFTICE,用HEXEDIT打开刚才写的文件,您发现在窗口右栏仅显示THISISDEMO,汉字全部为'.',现在的任务是要显示正确的汉字.CTRL+D切入SOFTICE ,下断点BPX TEXTOUT,退出后更改字母T为M,立即被SOFTICE拦截,
2.BC * ,按若干次F12回到HEXEDIT的领空,
S DS:0 L FFFFFFFF "MHISISDEM",大搜捕后共有好几个地址,真正的地址是DS:00XXXXXX,而非DS:CXXXXXXX, 也就是小的地址为HEXEDIT实际存取的地址.
3.BPM DS:00XXXXXX W (不是R/RW,否则一直被SOFTICE拦截无法返回).
退出SOFTICE,再将M改为T,好!SOFTICE成功拦截,可以猜想,程序下一步便要读该地址的内容,然后判别其中的 字符串是否在20H-7FH之间,决定是否正常显示.
BPE 0 修改断点为BPM DS:00XXXXXX R,退出SOFTICE,立即又被SOFTICE拦截,原来是用MOVSB把DS:00XXXXXX中 的字符串复制到DS:00YYYYYY,
4.BD *
BPM DS:00YYYYYY R 退出SOFTICE,立即被拦截返回SOFTICE中,好漂亮!停止在CS:412616

004125F2: C745FC00000000 mov d,[ebp][-0004],000000000 ;"
.004125F9: E903000000 jmp .000412601
.004125FE: FF45FC inc d,[ebp][-0004]
.00412601: 8B4510 mov eax,[ebp][00010]
.00412604: 3945FC cmp [ebp][-0004],eax
.00412607: 0F8D20000000 jge .00041262D
.0041260D: 8B45FC mov eax,[ebp][-0004]
.00412610: 8B4D08 mov ecx,[ebp][00008]
.00412613: 8A0408 mov al,[eax][ecx]
说明:D DS:EAX+ECX ---文章中的字符串!
.00412616: 50 push eax
.00412617: E894FFFFFF call .0004125B0 -------- (1)
.0041261C: 83C404 add esp,004 ;" "
.0041261F: 8B4DFC mov ecx,[ebp][-0004]
.00412622: 8B550C mov edx,[ebp][0000C]
.00412625: 880411 mov [ecx][edx],al
说明:AL=?,若AL为可以显示的字符,则经过(1)CALL处理后还是原来的AL
若AL为不可显示(如汉字)字符,则经过(1)CALL处理后AL=2E('.'),原来汉字变成一个'.',此CALL有问题!
.00412628: E9D1FFFFFF jmp .0004125FE
.0041262D: E900000000 jmp .000412632
.00412632: 5F pop edi
.00412633: 5E pop esi
.00412634: 5B pop ebx
.00412635: C9 leave
.00412636: C3 retn
看CALL中的代码:
.004125B0: 55 push ebp
.004125B1: 8BEC mov ebp,esp
.004125B3: 53 push ebx
.004125B4: 56 push esi
.004125B5: 57 push edi
.004125B6: 0FBE4508 movsx eax,b,[ebp][00008]
.004125BA: 83F820 cmp eax,020 ;" "
.004125BD: 0F8C1A000000 jl .0004125DD -------- (1)
比20H小,AL=2E ,也就是一个'.'
.004125C3: 0FBE4508 movsx eax,b,[ebp][00008]
.004125C7: 83F87E cmp eax,07E ;"~"
.004125CA: 0F8F0D000000 jg .0004125DD -------- (2)
比7EH大,AL=2E ,也就是一个'.'
.004125D0: 8A4508 mov al,[ebp][00008]
.004125D3: E90C000000 jmp .0004125E4
.004125D8: E907000000 jmp .0004125E4
.004125DD: B02E mov al,02E ;"."
你在此处想改头换面?
.004125DF: E900000000 jmp .0004125E4
.004125E4: 5F pop edi
.004125E5: 5E pop esi
.004125E6: 5B pop ebx
.004125E7: C9 leave
.004125E8: C3 retn
.004125E9: 55 push ebp
.004125EA: 8BEC mov ebp,esp

在HACKVIEW中改CS:4125BA之间的代码为
CMP EAX,00
JL 4125DF
或用HEXEDIT修改0F8C1A000000为0F8C1C000000
保存退出.正是:汉字西文均显示,古怪字符变成'.'

版权所有，请不要修改原内容


crackcode代码分享

 标 题:crackcode代码分享笔记(一) (8千字)
发信人:豆豆虾
时 间:2001-8-9 23:33:17
详细信息:
crackcode代码分享笔记(一)
今天有些失眠，睡不着，所以闲着也是闲着。今天刚把crackcode下了，挺小的才11.5k。
把它反汇编了。想慢慢的把程序从头读一遍，估计不会很难吧！：）今天还行，看了一点点，
先和大家分享。我的汇编语言也学的马虎，如果你们觉注释还能看得过去的，就将就将！
:00401000 53 push ebx
:00401001 55 push ebp
:00401002 56 push esi
:00401003 57 push edi
:00401004 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Crackcode 2000 -- Author:Ru Feng "
->"(http:\\ocqpat.163.net)"
|
:00401006 68AC624000 push 004062AC

* Possible StringData Ref from Data Obj ->"Thank you for using the Crackcode!Let "
->"us make the keygen so easy!"
|
:0040100B 6868624000 push 00406268
:00401010 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:00401012 FF15C0504000 Call dword ptr [004050C0]
^^^^^^^^^^^^^^－－－》显示作者的堂堂大名。
:00401018 BE20A44000 mov esi, 0040A420
:0040101D BF04010000 mov edi, 00000104
:00401022 56 push esi
:00401023 57 push edi

* Reference To: KERNEL32.GetCurrentDirectoryA, Ord:0000h
|
:00401024 FF1504504000 Call dword ptr [00405004]
^^^^^^^^^^^^^^^－－－》取得当前的路径。

* Possible StringData Ref from Data Obj ->"CRACKCODE.INI"
|
:0040102A 68DC604000 push 004060DC

* Possible StringData Ref from Data Obj ->"\"
|
:0040102F 6864624000 push 00406264
:00401034 56 push esi
:00401035 E8360A0000 call 00401A70
:0040103A 59 pop ecx
:0040103B 59 pop ecx
:0040103C 50 push eax
:0040103D E82E0A0000 call 00401A70
:00401042 59 pop ecx
:00401043 BD50674000 mov ebp, 00406750
:00401048 59 pop ecx
^^^^^^^^^^^^^^^^－－》以上这段代码实现一个函数
strcat（）比如获得当前路径为C:\crackcode；那么
结果这段代码合并为：c:\crackcode\crackcode.ini

来看看00401A70中的代码：
:00401A70 8B4C2404 mov ecx, dword ptr [esp+04]
^^^^^^^^－－－》ECX获得指向路径字符串
ECX=40A620
:00401A74 57 push edi
:00401A75 F7C103000000 test ecx, 00000003
:00401A7B 740F je 00401A8C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401A8A(C)
|
:00401A7D 8A01 mov al, byte ptr [ecx]
:00401A7F 41 inc ecx
:00401A80 84C0 test al, al
:00401A82 743B je 00401ABF
:00401A84 F7C103000000 test ecx, 00000003
:00401A8A 75F1 jne 00401A7D

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A7B(C), :00401AA2(C), :00401ABD(U)
|
:00401A8C 8B01 mov eax, dword ptr [ecx]
:00401A8E BAFFFEFE7E mov edx, 7EFEFEFF
:00401A93 03D0 add edx, eax
:00401A95 83F0FF xor eax, FFFFFFFF
:00401A98 33C2 xor eax, edx
:00401A9A 83C104 add ecx, 00000004
:00401A9D A900010181 test eax, 81010100
:00401AA2 74E8 je 00401A8C
^^^^^^^^^^^^^^^^－－》这段代码是循环取四个字符
确定到那四个字符为结尾
:00401AA4 8B41FC mov eax, dword ptr [ecx-04]
:00401AA7 84C0 test al, al
:00401AA9 7423 je 00401ACE
:00401AAB 84E4 test ah, ah
:00401AAD 741A je 00401AC9
:00401AAF A90000FF00 test eax, 00FF0000
:00401AB4 740E je 00401AC4
:00401AB6 A9000000FF test eax, FF000000
:00401ABB 7402 je 00401ABF
:00401ABD EBCD jmp 00401A8C
^^^^^^^^^^^^^^^－－》这段代码为确定最后四个字符
中有多少个字符。分别跳到下面相应的程序
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A82(C), :00401ABB(C)
|
:00401ABF 8D79FF lea edi, dword ptr [ecx-01]
:00401AC2 EB0D jmp 00401AD1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401AB4(C)
|
:00401AC4 8D79FE lea edi, dword ptr [ecx-02]
:00401AC7 EB08 jmp 00401AD1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401AAD(C)
|
:00401AC9 8D79FD lea edi, dword ptr [ecx-03]
:00401ACC EB03 jmp 00401AD1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401AA9(C)
|
＝＝＝＝＝＝＝＝＝＝＝＝＝＝下面的代码和也以上代码相似，不再作解释＝＝＝＝＝＝＝
:00401ACE 8D79FC lea edi, dword ptr [ecx-04]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401A65(U), :00401AC2(U), :00401AC7(U), :00401ACC(U)
|
:00401AD1 8B4C240C mov ecx, dword ptr [esp+0C]
:00401AD5 F7C103000000 test ecx, 00000003
:00401ADB 7419 je 00401AF6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401AED(C)
|
:00401ADD 8A11 mov dl, byte ptr [ecx]
:00401ADF 41 inc ecx
:00401AE0 84D2 test dl, dl
:00401AE2 7464 je 00401B48
:00401AE4 8817 mov byte ptr [edi], dl
:00401AE6 47 inc edi
:00401AE7 F7C103000000 test ecx, 00000003
:00401AED 75EE jne 00401ADD
:00401AEF EB05 jmp 00401AF6

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401B0E(C), :00401B28(U)
|
:00401AF1 8917 mov dword ptr [edi], edx
:00401AF3 83C704 add edi, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401ADB(C), :00401AEF(U)
|
:00401AF6 BAFFFEFE7E mov edx, 7EFEFEFF
:00401AFB 8B01 mov eax, dword ptr [ecx]
:00401AFD 03D0 add edx, eax
:00401AFF 83F0FF xor eax, FFFFFFFF
:00401B02 33C2 xor eax, edx
:00401B04 8B11 mov edx, dword ptr [ecx]
:00401B06 83C104 add ecx, 00000004
:00401B09 A900010181 test eax, 81010100
:00401B0E 74E1 je 00401AF1
:00401B10 84D2 test dl, dl
:00401B12 7434 je 00401B48
:00401B14 84F6 test dh, dh
:00401B16 7427 je 00401B3F
:00401B18 F7C20000FF00 test edx, 00FF0000
:00401B1E 7412 je 00401B32
:00401B20 F7C2000000FF test edx, FF000000
:00401B26 7402 je 00401B2A
:00401B28 EBC7 jmp 00401AF1

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

小结： 希望大家能不能帮我解答，以上代码中不明白的地方。

1、:00401A75 F7C103000000 test ecx, 00000003 －－》为什么要TEST??

2 对以下代码中为什么要加上7EFEFEFF 然后再XOR FFFFFFFF，能不能告诉我原因？
:00401A8C 8B01 mov eax, dword ptr [ecx]
:00401A8E BAFFFEFE7E mov edx, 7EFEFEFF
:00401A93 03D0 add edx, eax
:00401A95 83F0FF xor eax, FFFFFFFF
:00401A98 33C2 xor eax, edx
:00401A9A 83C104 add ecx, 00000004
:00401A9D A900010181 test eax, 81010100
:00401AA2 74E8 je 00401A8C

谢谢大家的帮助！！

今天就到这里，就到这里。。。。。。 （待续）豆豆虾
2001.8.9 23：36完成
历时：1个小时。

标 题:crackcode代码分享笔记(一)问题跟踪 (4千字)
发信人:豆豆虾
时 间:2001-8-11 15:37:45
详细信息:

以下是两位组织代号为[BCG]的回答：（感谢这两位热心的朋友）

6767[BCG]
1.pop ecx应该是对应前面的那个push eax,测试call的返回值；
2.在许多程序中见过，可能与编译器有关

冷雨飘心[BCG]
1.test ecx,3->>判断是否从内存存储以4为节的地址开始,这可能是某种编译器所要求的存储方式,还有
2.是一段经典程序,估计是Vc生的代码,在于判断最后取到的四个字符是否全部为0,加7EFEFEFF
然后再XOR FFFFFFFF变反最后与81010100 比较正是起到了这种作用,你可以自己运算一下就会明白了.

于是我用vc模拟crackcode，通过strcat来实现该功能。发现用VC6编译出来，和crackcode的代码完全不
同。估计是作者使用另一函数来实现。（原因在于如果人为的去写程序，估计不会用到TEST EAX,3这段程序。）

#include <afx.h>
#include<string.h>
int main()
{
char buffer[20];
char aaa[]="/";
char bbb[]="a xia";
strcpy(buffer,"I am");
strcat(buffer,aaa);
strcat(buffer,bbb);

return 0 ;
}
00401010 56 push esi
:00401011 894C240C mov dword ptr [esp+0C], ecx
:00401015 57 push edi
:00401016 668944240E mov word ptr [esp+0E], ax
:0040101B 83C9FF or ecx, FFFFFFFF

* Possible StringData Ref from Data Obj ->"I am"
|
:0040101E BF30504000 mov edi, 00405030
:00401023 33C0 xor eax, eax
:00401025 F2 repnz
:00401026 AE scasb
:00401027 668B153C504000 mov dx, word ptr [0040503C]
:0040102E F7D1 not ecx
:00401030 2BF9 sub edi, ecx
:00401032 6689542414 mov word ptr [esp+14], dx
:00401037 8D542418 lea edx, dword ptr [esp+18]
:0040103B 8BC1 mov eax, ecx
:0040103D 8BF7 mov esi, edi
:0040103F 8BFA mov edi, edx
:00401041 C1E902 shr ecx, 02
:00401044 F3 repz
:00401045 A5 movsd
:00401046 8BC8 mov ecx, eax
:00401048 33C0 xor eax, eax
:0040104A 83E103 and ecx, 00000003
:0040104D 8D542418 lea edx, dword ptr [esp+18]
:00401051 F3 repz
:00401052 A4 movsb
:00401053 8D7C240E lea edi, dword ptr [esp+0E]
:00401057 83C9FF or ecx, FFFFFFFF
:0040105A F2 repnz
:0040105B AE scasb
:0040105C F7D1 not ecx
:0040105E 2BF9 sub edi, ecx
:00401060 8BF7 mov esi, edi
:00401062 8BD9 mov ebx, ecx
:00401064 8BFA mov edi, edx
:00401066 83C9FF or ecx, FFFFFFFF
:00401069 F2 repnz
:0040106A AE scasb
:0040106B 8BCB mov ecx, ebx
:0040106D 4F dec edi
:0040106E C1E902 shr ecx, 02
:00401071 F3 repz
:00401072 A5 movsd
:00401073 8BCB mov ecx, ebx
:00401075 8D542418 lea edx, dword ptr [esp+18]
:00401079 83E103 and ecx, 00000003
:0040107C F3 repz
:0040107D A4 movsb
:0040107E 8D7C2410 lea edi, dword ptr [esp+10]
:00401082 83C9FF or ecx, FFFFFFFF
:00401085 F2 repnz
:00401086 AE scasb
:00401087 F7D1 not ecx
:00401089 2BF9 sub edi, ecx
:0040108B 8BF7 mov esi, edi
:0040108D 8BD9 mov ebx, ecx
:0040108F 8BFA mov edi, edx
:00401091 83C9FF or ecx, FFFFFFFF
:00401094 F2 repnz
:00401095 AE scasb
:00401096 8BCB mov ecx, ebx
:00401098 4F dec edi
:00401099 C1E902 shr ecx, 02
:0040109C F3 repz
:0040109D A5 movsd
:0040109E 8BCB mov ecx, ebx
:004010A0 83E103 and ecx, 00000003
:004010A3 F3 repz
:004010A4 A4 movsb
:004010A5 5F pop edi
:004010A6 5E pop esi
:004010A7 5B pop ebx
:004010A8 83C420 add esp, 00000020
:004010AB C3 ret

今天就到这里，就到这里。。。。。。 豆豆虾
2001.8.10 15：10完成
历时：0.5个小时。

标 题:crackcode代码分享笔记(二) (5千字)
发信人:豆豆虾
时 间:2001-8-10 18:33:35
详细信息:

感谢你们看我的笔记，能够互相交流提高！谁能告诉我上一篇留下的问题吗？？谢谢！！
接着上一回继续看代码。看代码之前我们先来认识一个API函数：
功能：获取INI文件中与指定关键字对应的参数（字符串性）并将此参数拷贝
到lpReturnedString中。

DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // points to section name
LPCTSTR lpKeyName, // points to key name
LPCTSTR lpDefault, // points to default string
LPTSTR lpReturnedString, // points to destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // points to initialization filename
);

参 数
lpApplicationName String 待寻找的关键字所在的段
lpKeyName String 与参数相对应的关键字名
lpDefault String 指定的关键字不存在时返回的缺省值
lpReturnedString String 预先分配好的长度至少为nSize字节的字符串缓冲区
nSized Integer 将要装入lpReturnedString缓冲区的最大字符数
lpFileName String 初始化文件的名字

返回值 Integer 拷贝到lpReturnedString缓冲区的字符数

* Possible StringData Ref from Data Obj ->"Options"
|
:00401049 BB30604000 mov ebx, 00406030
:0040104E 56 push esi //==> INI FILENAME
:0040104F 57 push edi //==>SIZE OF BUFFER

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:0000h
|
:00401050 8B3D60504000 mov edi, dword ptr [00405060]
:00401056 6824A54000 push 0040A524 //==>POINT FOR BUFFER
:0040105B 55 push ebp //==>DEFAULT STRING

* Possible StringData Ref from Data Obj ->"CommandLine"
|
:0040105C 68D0604000 push 004060D0 //==>KEY NAME
:00401061 53 push ebx //==>SECTION NAME
:00401062 FFD7 call edi //==>GetPrivateProfileStringA
:00401064 56 push esi
:00401065 6A02 push 00000002
:00401067 6840A64000 push 0040A640
:0040106C 55 push ebp

* Possible StringData Ref from Data Obj ->"Mode"
|
:0040106D 685C624000 push 0040625C
:00401072 53 push ebx
:00401073 FFD7 call edi
:00401075 56 push esi
:00401076 6A09 push 00000009
:00401078 6888974000 push 00409788
:0040107D 55 push ebp

* Possible StringData Ref from Data Obj ->"First_Break_Address"
|
:0040107E 6848624000 push 00406248
:00401083 53 push ebx
:00401084 FFD7 call edi
:00401086 56 push esi
:00401087 6A03 push 00000003
:00401089 6884974000 push 00409784
:0040108E 55 push ebp

* Possible StringData Ref from Data Obj ->"First_Break_Address_Code"
|
:0040108F 682C624000 push 0040622C
:00401094 53 push ebx
:00401095 FFD7 call edi
:00401097 56 push esi
:00401098 6A03 push 00000003
:0040109A 6880974000 push 00409780
:0040109F 55 push ebp

* Possible StringData Ref from Data Obj ->"First_Break_Address_Code_Lenth"
|
:004010A0 680C624000 push 0040620C
:004010A5 53 push ebx
:004010A6 FFD7 call edi
:004010A8 56 push esi
:004010A9 6A09 push 00000009
:004010AB 6874974000 push 00409774
:004010B0 55 push ebp

* Possible StringData Ref from Data Obj ->"Second_Break_Address"
|
:004010B1 68F4614000 push 004061F4
:004010B6 53 push ebx
:004010B7 FFD7 call edi
:004010B9 56 push esi
:004010BA 6A03 push 00000003
:004010BC 6870974000 push 00409770
:004010C1 55 push ebp

* Possible StringData Ref from Data Obj ->"Second_Break_Address_Code_Lenth"
|
:004010C2 68D4614000 push 004061D4
:004010C7 53 push ebx
:004010C8 FFD7 call edi
:004010CA 56 push esi
:004010CB BE64974000 mov esi, 00409764
:004010D0 6A09 push 00000009
:004010D2 56 push esi
:004010D3 55 push ebp

* Possible StringData Ref from Data Obj ->"Save_Code_Address"
|
:004010D4 68C0614000 push 004061C0
:004010D9 53 push ebx
:004010DA FFD7 call edi
:004010DC 6888974000 push 00409788

通过GetPrivateProfileStringA获得各个参数的值。也就是读出crackcode.ini的内容。
[Options]
CommandLine=winzip32.exe
Mode=2
First_Break_Address=407C1C
First_Break_Address_Code=BE
First_Break_Address_Code_Lenth=5
Second_Break_Address=457923
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDI

今天就到这里，就到这里。。。。。。 （待续）豆豆虾
2001.8.10 18：36完成
历时：0.5个小时。

标 题:crackcode代码分享笔记(三) (8千字)
发信人:豆豆虾
时 间:2001-8-11 17:23:54
详细信息:

来！继续crackcode的下一步代码分析：
:004010DC 6888974000 push 00409788 －－》point to "First_Break_Address"
:004010E1 E8A8070000 call 0040188E －－》把文本地址转换为HEX
:004010E6 A3A0984000 mov dword ptr [004098A0], eax －－》奖转换后的结果保存
:004010EB C7042480974000 mov dword ptr [esp], 00409780 －－》point to "First_Break_Address_Code_Lenth"
:004010F2 E897070000 call 0040188E
:004010F7 8B0DA0984000 mov ecx, dword ptr [004098A0]
:004010FD A350A64000 mov dword ptr [0040A650], eax
:00401102 03C1 add eax, ecx －－》First_Break_Address+lenth
:00401104 C7042474974000 mov dword ptr [esp], 00409774
:0040110B A39C984000 mov dword ptr [0040989C], eax
:00401110 E879070000 call 0040188E
:00401115 A398984000 mov dword ptr [00409898], eax
:0040111A C7042470974000 mov dword ptr [esp], 00409770 －－》"Second_Break_Address"
:00401121 E868070000 call 0040188E
:00401126 8B0D98984000 mov ecx, dword ptr [00409898] －－》"Second_Break_Address_Code_Lenth"
:0040112C A354A64000 mov dword ptr [0040A654], eax
:00401131 BF40A64000 mov edi, 0040A640
:00401136 03C1 add eax, ecx －－》Second_Break_Address+lenth

* Possible StringData Ref from Data Obj ->"0"
|
:00401138 C70424BC614000 mov dword ptr [esp], 004061BC
:0040113F 57 push edi －－》"MODE"
:00401140 A394984000 mov dword ptr [00409894], eax
:00401145 E886080000 call 004019D0
:0040114A 59 pop ecx
:0040114B 85C0 test eax, eax
:0040114D 59 pop ecx
:0040114E 7506 jne 00401156
:00401150 210544A64000 and dword ptr [0040A644], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040114E(C)
|

* Possible StringData Ref from Data Obj ->"1"
|
:00401156 68B8614000 push 004061B8
:0040115B 57 push edi
:0040115C E86F080000 call 004019D0
:00401161 59 pop ecx
:00401162 85C0 test eax, eax
:00401164 59 pop ecx
:00401165 750A jne 00401171
:00401167 C70544A6400001000000 mov dword ptr [0040A644], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401165(C)
|

* Possible StringData Ref from Data Obj ->"2"
|
:00401171 68B4614000 push 004061B4
:00401176 57 push edi
:00401177 E854080000 call 004019D0
:0040117C 59 pop ecx
:0040117D 85C0 test eax, eax
:0040117F 59 pop ecx
:00401180 750A jne 0040118C
:00401182 C70544A6400002000000 mov dword ptr [0040A644], 00000002

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401180(C)
|

* Possible StringData Ref from Data Obj ->"3"
|
:0040118C 68B0614000 push 004061B0
:00401191 57 push edi
:00401192 E839080000 call 004019D0
:00401197 59 pop ecx
:00401198 85C0 test eax, eax
:0040119A 59 pop ecx
:0040119B 750A jne 004011A7
:0040119D C70544A6400003000000 mov dword ptr [0040A644], 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040119B(C)
|
＝＝＝＝以上程序是对处理mode不同值，在[0040A644]地址中作标志＝＝＝＝＝＝＝＝＝＝＝
相当于
switch( mode )
{
case '0':
mode=0;
case '1':
mode=1;
case '2':
mode=2;
case '3':
mode=3;
}

* Possible StringData Ref from Data Obj ->"EAX"
|
:004011A7 68AC614000 push 004061AC
:004011AC 56 push esi －－》"Save_Code_Address"
:004011AD E81E080000 call 004019D0
:004011B2 59 pop ecx
:004011B3 85C0 test eax, eax
:004011B5 59 pop ecx
:004011B6 7511 jne 004011C9
:004011B8 C605609740008B mov byte ptr [00409760], 8B
:004011BF C7054CA64000F0909090 mov dword ptr [0040A64C], 909090F0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011B6(C)
|

* Possible StringData Ref from Data Obj ->"EBX"
|
:004011C9 68A8614000 push 004061A8
:004011CE 56 push esi
:004011CF E8FC070000 call 004019D0
:004011D4 59 pop ecx
:004011D5 85C0 test eax, eax
:004011D7 59 pop ecx
:004011D8 7511 jne 004011EB
:004011DA C605609740008B mov byte ptr [00409760], 8B
:004011E1 C7054CA64000F3909090 mov dword ptr [0040A64C], 909090F3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011D8(C)
|

* Possible StringData Ref from Data Obj ->"ECX"
|
:004011EB 68A4614000 push 004061A4
:004011F0 56 push esi
:004011F1 E8DA070000 call 004019D0
:004011F6 59 pop ecx
:004011F7 85C0 test eax, eax
:004011F9 59 pop ecx
:004011FA 7511 jne 0040120D
:004011FC C605609740008B mov byte ptr [00409760], 8B
:00401203 C7054CA64000F1909090 mov dword ptr [0040A64C], 909090F1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011FA(C)
|

* Possible StringData Ref from Data Obj ->"EDX"
|
:0040120D 68A0614000 push 004061A0
:00401212 56 push esi
:00401213 E8B8070000 call 004019D0
:00401218 59 pop ecx
:00401219 85C0 test eax, eax
:0040121B 59 pop ecx
:0040121C 7511 jne 0040122F
:0040121E C605609740008B mov byte ptr [00409760], 8B
:00401225 C7054CA64000F2909090 mov dword ptr [0040A64C], 909090F2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040121C(C)
|

* Possible StringData Ref from Data Obj ->"EDI"
|
:0040122F 689C614000 push 0040619C
:00401234 56 push esi
:00401235 E896070000 call 004019D0
:0040123A 59 pop ecx
:0040123B 85C0 test eax, eax
:0040123D 59 pop ecx
:0040123E 7511 jne 00401251
:00401240 C605609740008B mov byte ptr [00409760], 8B
:00401247 C7054CA64000F7909090 mov dword ptr [0040A64C], 909090F7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040123E(C)
|

* Possible StringData Ref from Data Obj ->"ESI"
|
:00401251 6898614000 push 00406198
:00401256 56 push esi
:00401257 E874070000 call 004019D0
:0040125C 59 pop ecx
:0040125D 85C0 test eax, eax
:0040125F 59 pop ecx
:00401260 7511 jne 00401273
:00401262 C6056097400090 mov byte ptr [00409760], 90
:00401269 C7054CA6400090909090 mov dword ptr [0040A64C], 90909090

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401260(C)
|

* Possible StringData Ref from Data Obj ->"EBP"
|
:00401273 6894614000 push 00406194
:00401278 56 push esi
:00401279 E852070000 call 004019D0
:0040127E 59 pop ecx
:0040127F 85C0 test eax, eax
:00401281 59 pop ecx
:00401282 7511 jne 00401295
:00401284 C605609740008B mov byte ptr [00409760], 8B
:0040128B C7054CA64000F5909090 mov dword ptr [0040A64C], 909090F5
＝＝＝＝以上程序是对处理Save_Code_Address不同值，做相应的处理＝＝＝＝＝＝
相当于
switch( Save_Code_Address )
{
case 'EAX':
code1=8B;
code2=909090F0；
case 'EBX':
code1=8B;
code2=909090F0；
case 'EC':
code1=8B;
code2=909090F0；
case 'EDX':
code1=8B;
code2=909090F0；
case 'EDI':
code1=8B;
code2=909090F0；
case 'ESI':
code1=90;
code2=909090F0；
case 'EBP':
code1=8B;
code2=909090F0；

}

小结： 希望大家能帮我解答。为什么不同的寄存器会变成这样不同的数字？
它到底是代表什么？？

今天就到这里，就到这里。。。。。。 （待续）豆豆虾
2001.8.11 17：17完成
历时：1.8个小时。

标 题:crackcode代码分享笔记(四)－依依惜别篇 (6千字)
发信人:豆豆虾
时 间:2001-8-12 20:23:36
详细信息:

Go on..... 各位看官： （上一讲中提到的问题，不知道谁知道？能否赐教！谢了！）

:00401295 833D4CA6400000 cmp dword ptr [0040A64C], 00000000 －》40A64C的值看上一讲
:0040129C 7513 jne 004012B1 －－》比较是否设定需要读取的寄存器；
如果设定了值，转向4012B1.否则继续。
:0040129E 56 push esi
:0040129F C60560974000BE mov byte ptr [00409760], BE
:004012A6 E8E3050000 call 0040188E
:004012AB 59 pop ecx
:004012AC A34CA64000 mov dword ptr [0040A64C], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040129C(C)
|
:004012B1 6824A54000 push 0040A524 －－》指向被跟踪的程序名
:004012B6 E813000000 call 004012CE －－》创建该程序进程
:004012BB 59 pop ecx
:004012BC 5F pop edi
:004012BD 5E pop esi
:004012BE 5D pop ebp
:004012BF 85C0 test eax, eax
:004012C1 5B pop ebx
:004012C2 7405 je 004012C9
:004012C4 E841000000 call 0040130A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012C2(C)
|
:004012C9 33C0 xor eax, eax
:004012CB C21000 ret 0010

下面看call 004012CE 子程序，前我们来研究一个API〔CreatProcess〕它的参数说明
可是一大摞。

BOOL CreateProcess(
LPCTSTR lpApplicationName,
// pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);

说明
创建一个新进程
返回值
Long，非零表示成功，零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpApplicationName String，要执行的应用程序的名字。可设为vbNullString；在这种情况下，应用程序的名字应在lpCommandLine参数的起始处出现
lpCommandLine String，要执行的命令行。可用GetCommandLine函数取得一个进程使用的命令行。windows会尽可能地根据下述搜索顺序来查找执行文件：
（1）包含了父进程执行文件的目录
（2）父进程当前的目录
（3）由GetSystemDirectory返回的系统目录
（4）仅适于windows NT：16位系统目录
（5）由GetSystemDirectory返回的windows目录
（6）由PATH环境变量指定的目录
lpProcessAttributes SECURITY_ATTRIBUTES，指定一个SECURITY_ATTRIBUTES结构，或传递零值表示采用不允许继承的默认描述符。该参数定义进程的安全特性
lpThreadAttributes SECURITY_ATTRIBUTES，指定一个SECURITY_ATTRIBUTES结构，或传递零值表示采用不允许继承的默认描述符。该参数定义进程之主进程的安全特性
bInheritHandles Long，TRUE表示允许当前进程中的所有句柄都由新建的子进程继承
dwCreationFlags Long，来自API32.TXT文件的一个或多个下述常数之一，它们都带有前缀CREATE_。下面这些用于VB程序员：
CREATE_SEPARATE_WOW_VDM（仅适用于NT）：启动一个16位的windows应用程序时，强迫它在自己的内存空间运行
CREATE_SHARED_WOW_VDM（仅适用于NT）：启动一个16位的windows应用程序时，强迫它在共享的16位虚拟机内运行
CREATE_SUSPENDED：立即挂起新进程。除非调用ResumeThread函数。
IDLE_PRIORITY_CLASS：新进程应该有非常低的优先级，只有在系统空闲的时候才能运行。基本值是4
HIGH_PRIORITY_CLASS：新进程应该有非常高的优先级，基本值是13
NORMAL_PRIORITY_CLASS：标准优先级。如进程位于前台，则基本值是9；如在后台。则优先值是7
lpEnvironment 任何类型，指向一个环境块的指针
lpCurrentDriectory String，新进程的当前目录路径
lpStartupInfo STARTUPINFO，指定一个STARTUPINFO结构，其中包含了创建进程时使用的附加信息
lpProcessInformation PROCESS_INFORMATION，该结构用于容纳新进程的进程和线程标识。大多数情况下，一旦这个函数返回，父应用程序都会关闭两个句柄。

可怕吗？？我好害怕怕哦！！呵呵～～～ 其实你使用起来，是非常的简单的 ：）
因为许多的参数都可以用0来表示。
比如：
CreateProcess(0, serail.exe,0,0,FALSE,
CREATE_SUSPENDED, 0,0,&startupInfo, &ProcessInformation);

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
这个例子是不是挺可爱的。40多行的说明，用起来不过两行而已。在这里强调一下
有一部分的crack工具都使用这个程序哦！！比如 内存补丁程序，还有现在这个crackcode
还有新版的DEDE也用到。你说是不是值得去学习它呢？？？
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

=======================call 004012CE 子程序========================

* Referenced by a CALL at Address:
|:004012B6
|
:004012CE 55 push ebp
:004012CF 8BEC mov ebp, esp
:004012D1 83EC44 sub esp, 00000044
:004012D4 56 push esi
:004012D5 33F6 xor esi, esi
:004012D7 6A44 push 00000044
:004012D9 8D45BC lea eax, dword ptr [ebp-44]
:004012DC 56 push esi
:004012DD 50 push eax
:004012DE E86D080000 call 00401B50
:004012E3 83C40C add esp, 0000000C
:004012E6 8D45BC lea eax, dword ptr [ebp-44]
:004012E9 C745BC44000000 mov [ebp-44], 00000044
:004012F0 6810A44000 push 0040A410
:004012F5 50 push eax
:004012F6 56 push esi
:004012F7 56 push esi
:004012F8 6A02 push 00000002
:004012FA 56 push esi
:004012FB 56 push esi
:004012FC 56 push esi
:004012FD FF7508 push [ebp+08]
:00401300 56 push esi

* Reference To: KERNEL32.CreateProcessA, Ord:0000h
|
:00401301 FF1508504000 Call dword ptr [00405008]
:00401307 5E pop esi
:00401308 C9 leave
:00401309 C3 ret
=======================call 004012CE 子程序========================

估计大伙可能看到这会不会一头雾水呢？？为了更好理解它。

建议：下载R!SC's Process Patcher 原代码进行研究。

大伙是不是觉得这样写下去，挺没有劲的！对吗？这个CRACK论坛不是中国最火的吗？
为什么没有人愿意解答我的问题？？只是希望得到结果（突破25位的限制）！：（

好失望！！原以为先有付出，才会有收获，唉！！ 我去了！ 这是最后的一篇文章。

byebye 曾经给过我一些希望的两位[FCG]朋友。
（依依惜别篇）豆豆虾
2001.8.12 19：10完成
历时：2.1个小时


crackcode突破25位限制分析

 标 题:当当虾和豆豆虾crackcode突破25位限制的分享笔记 (9千字)
发信人:当当虾
时 间:2001-8-24 19:54:12
详细信息:
各位大虾好：
我是当当虾，对了，那外号为"豆豆虾"的是我非常好的网友，最近他从事销售
要出远门，跑客户，所以不会常来，我暂时接替他。他一句话：都是为了生活。
生活本来就是很乱，的确啊！还是古人云的好：生活本来就是一团麻绳，理也理不清。
呵呵～～～但是有一点是使我本人都很欣慰的事情：很开心，而且有空的时间可以做
自己喜欢的事，一句话"走自己的路，让别人羡慕去吧！"（据说，这句话是出自一位
crack老前辈对新生辈出年代的询询教诲！ ）

话说回来，想当初我的好友"豆豆虾"，一来看雪论坛就"炸"道，我想也许是有
两点原因在这里解释一下：
1、无论如何，人都是有虚荣心，想出点小名很正常，其实一个主要原因想得到别人的认
可。我本人比较欣赏通过自己的实力去得到别人的认可。
2、"炸"道本身谐音，有点标新立异，其根本的就是在众目睽睽下，想吸引别人的注意。
芸芸众生过往云烟。所以啊！比如这一招式，在追女仔中非常常见，好好体会和掌握吧！
哈哈～～～ 我和"豆豆虾"都是光有理论无实践。 估计有人要吐啦。。。。哈哈～～

我当当虾在这表示歉意。此次的目的，是想把"炸坏的道路给修一修"，
"将功补过"吧！豆豆虾曾经把修改crackcode的过程讲述过，经过我的再跟踪，写写凑凑
一番，"文物"得以出土问世。哈哈～～～～

【如何突破crackcode的25位限制】
1、突破crackcode的25位限制的经过
在论坛中，有一些贴子常提到crackcode存在25位的限制。可是rufeng又隐退江湖，
（江湖盛传他可能在修炼内功，准备东山再起）。于是好友豆豆虾（学过一点汇编，知道
一些常用工具的使用），凡心欲动，本意是想一一步分析，对代码原理有个总的了解。
然后再对证下药。所谓手到病除。他说如果一一分析下去，也许在作修改的时候，就不
会在一个数据结构上兜圈子，当时猜想rufeng是定义一个25位的字符数组，没有考虑到
获得的结果会超过25位的情况。 【爆破，可以采取直捣黄龙；作注册机，得看懂整个注册
码；修改代码，得看懂程序的实现原理，然后再OEM自己的思路。】

2、为什么crackcode存在25位限制（打算介绍简单些，因为它牵扯到的面比较广）
crackcode调用getthreadcontext函数，返回一个结构指针，利用其读取被跟踪
程序的寄存器（eax、edx...)中的值（这个函数的功能非常的棒）。rufeng巧妙的应用
了六个寄存器（Edi，Esi，Ebx，Edx，Ecx，Eax），返回它们注册码，一个寄存器
只能存4个字符，所以6*4=24，确切的说，crackcode取到的字符长度不能超过24个。
比如EAX=44324432--->储存"D2D2"四个字符。

3、如何突破它的限制？？
如果把程序通读一遍，似乎发现没有办法去突破这个限制，因为这是设计上的
失误。如果细细去琢磨crackcode，会发现它两次调用getthreadcontext函数。其实第
一次的时候，就可以得到要读取注册码的地址。根据crackcode.ini中Save_Code_Address
的值，对应寄存器储存的值。为什么crackcode要去两次调用getthreadcontext函数，其中
的奥秘，把程序认认真真的通读几遍（读到凌晨4点，窗外一片寂寂。在路灯下，几个清洁
工的身影，默默无闻的清洗大地，在我们匆匆来往的街道，还以清爽的感觉。）
好了！上面既然第一次调用的时候，已经能确定注册码的位置，何不拿它示问。于是可以
调用ReadProcessMemory，把注册码得到。

4、修改程序（代码修改位置401448－－－40149B）
我这有豆豆虾修改时的草稿：
＝＝＝＝＝＝＝＝＝判断save_code_address需要读取的寄存器＝＝＝＝＝＝＝＝＝＝＝
----deal with ebp----
mov ebx,40a64c －－－－－－－crackcode对save_code_address处理后存放的地址
mov ecx,40a1cc
mov al,byte ptr [ebx]
cmp al,0f5 －－－－－－－为什么要进行这样比较，crackcode代码分享笔记(三)中
有讲述。我把相关的部分放在附录中。
je final
----deal with eax----
sub ecx,4
cmp al,0f0
je final
----deal with ecx----
sub ecx,4
cmp al,0f1
je final
----deal with edx----
sub ecx,4
cmp al,0f2
je final
----deal with ebx----
sub ecx,4
cmp al,0f3
je final
----deal with esi----
sub ecx,4
cmp al,090
je final
----deal with edi----
sub ecx,4
//cmp al,0f7
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
＝＝＝＝＝＝＝＝＝＝以下为从内存中读取注册码，并显示＝＝＝＝＝＝＝＝
final：

---deal with mem---
push 0
push 28 //size
push 409B80 //buffer ======缓冲区
push d,[ecx] //baseaddr ======存放注册码的地址。
push d,[40a410] //hprocess
call d,[405024] ====调用ReadProcessMemory.从存放注册码的地址读入缓冲区
---deal with mem---

display:
mov ebx,409B80 ＝＝＝显示缓冲区
jmp 40149c

结束语：所有的人都恐惧孤独，但唯有在孤独之中，我们才能学会了解自己，学习如何处理
我们自己永恒的孤独。 ：）
【爆破，可以采取直捣黄龙；作注册机，得看懂整个注册码；
修改代码，得看懂程序的实现原理，然后再OEM自己的思路。】

当当虾 耗时：6小时
2001年8月24日 18:07
附录：

* Possible StringData Ref from Data Obj ->"EAX"
|
:004011A7 68AC614000 push 004061AC
:004011AC 56 push esi －－》"Save_Code_Address"
:004011AD E81E080000 call 004019D0
:004011B2 59 pop ecx
:004011B3 85C0 test eax, eax
:004011B5 59 pop ecx
:004011B6 7511 jne 004011C9
:004011B8 C605609740008B mov byte ptr [00409760], 8B
:004011BF C7054CA64000F0909090 mov dword ptr [0040A64C], 909090F0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011B6(C)
|

* Possible StringData Ref from Data Obj ->"EBX"
|
:004011C9 68A8614000 push 004061A8
:004011CE 56 push esi
:004011CF E8FC070000 call 004019D0
:004011D4 59 pop ecx
:004011D5 85C0 test eax, eax
:004011D7 59 pop ecx
:004011D8 7511 jne 004011EB
:004011DA C605609740008B mov byte ptr [00409760], 8B
:004011E1 C7054CA64000F3909090 mov dword ptr [0040A64C], 909090F3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011D8(C)
|

* Possible StringData Ref from Data Obj ->"ECX"
|
:004011EB 68A4614000 push 004061A4
:004011F0 56 push esi
:004011F1 E8DA070000 call 004019D0
:004011F6 59 pop ecx
:004011F7 85C0 test eax, eax
:004011F9 59 pop ecx
:004011FA 7511 jne 0040120D
:004011FC C605609740008B mov byte ptr [00409760], 8B
:00401203 C7054CA64000F1909090 mov dword ptr [0040A64C], 909090F1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011FA(C)
|

* Possible StringData Ref from Data Obj ->"EDX"
|
:0040120D 68A0614000 push 004061A0
:00401212 56 push esi
:00401213 E8B8070000 call 004019D0
:00401218 59 pop ecx
:00401219 85C0 test eax, eax
:0040121B 59 pop ecx
:0040121C 7511 jne 0040122F
:0040121E C605609740008B mov byte ptr [00409760], 8B
:00401225 C7054CA64000F2909090 mov dword ptr [0040A64C], 909090F2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040121C(C)
|

* Possible StringData Ref from Data Obj ->"EDI"
|
:0040122F 689C614000 push 0040619C
:00401234 56 push esi
:00401235 E896070000 call 004019D0
:0040123A 59 pop ecx
:0040123B 85C0 test eax, eax
:0040123D 59 pop ecx
:0040123E 7511 jne 00401251
:00401240 C605609740008B mov byte ptr [00409760], 8B
:00401247 C7054CA64000F7909090 mov dword ptr [0040A64C], 909090F7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040123E(C)
|

* Possible StringData Ref from Data Obj ->"ESI"
|
:00401251 6898614000 push 00406198
:00401256 56 push esi
:00401257 E874070000 call 004019D0
:0040125C 59 pop ecx
:0040125D 85C0 test eax, eax
:0040125F 59 pop ecx
:00401260 7511 jne 00401273
:00401262 C6056097400090 mov byte ptr [00409760], 90
:00401269 C7054CA6400090909090 mov dword ptr [0040A64C], 90909090

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401260(C)
|

* Possible StringData Ref from Data Obj ->"EBP"
|
:00401273 6894614000 push 00406194
:00401278 56 push esi
:00401279 E852070000 call 004019D0
:0040127E 59 pop ecx
:0040127F 85C0 test eax, eax
:00401281 59 pop ecx
:00401282 7511 jne 00401295
:00401284 C605609740008B mov byte ptr [00409760], 8B
:0040128B C7054CA64000F5909090 mov dword ptr [0040A64C], 909090F5
＝＝＝＝以上程序是对处理Save_Code_Address不同值，做相应的处理＝＝＝＝＝＝
相当于
switch( Save_Code_Address )
{
case 'EAX':
code1=8B;
code2=909090F0；
break;
case 'EBX':
code1=8B;
code2=909090F0；
break;
case 'EC':
code1=8B;
code2=909090F0；
break;
case 'EDX':
code1=8B;
code2=909090F0；
break;
case 'EDI':
code1=8B;
code2=909090F0；
break;
case 'ESI':
code1=90;
code2=909090F0；
break;
case 'EBP':
code1=8B;
code2=909090F0；
break;

}

标 题:当当虾和豆豆虾crackcode粘贴版的分享笔记终结篇 (18千字)
发信人:当当虾
时 间:2001-8-26 13:30:30
详细信息:

各位大虾好：
我是当当虾，上回贴子中已经介绍了“如何突破crackcode的25位限制”，接下来
，继续讲述在这基础上豆豆虾如何修改crackcode，把它变成具有粘贴功能！

【如何让crackcode变得具有粘贴功能】
前言：
整个过程当成一个project（项目），真的可以过把瘾哦！：）

1、如何让crackcode变得具有粘贴功能的经过
当初豆豆虾修改成突破25位后，无意中看到一个贴，说到crackcode不具有粘贴
功能，使用起来特不方便的。豆豆虾想，嘿！还真的是挺实用的一个功能。开始琢磨如何
修改代码。这其中的过程，从琢磨、修改、调试自至成功。对于豆豆虾来说，充满乐趣
和熬夜。但我想，如果能把乐趣，与更多人来分享，那不是更快乐吗？！人生几何，自
己觉好的东东，暂且不论其好与坏，都可以拿出来与别人分享，也许希望能马上得到认
可，如果遭到冷嘲热讽后，而不继续前行，会觉很可惜。还是那一句老话－－"走自己的
路，让别人说去吧！"时间可以证明一切（ 呵呵～～～，两篇文章始终围绕这个中心思想
哦！如果能我有机会再碰到，从前教过我语文的老师，或许可以拿到个60分及格哦！哈
哈～～。我非常留念从前的老师、朋友、同学，如果有机会在一起的，多好，如今都各
奔东西。前几天电视采访大运大使杨澜时，她说常在梦中梦见最多的是，自己的校
园，每个角落，和同学们度过美好时光。珍惜在你自己周围的朋友、亲人吧！一份汗水、
一份喜悦；一份帮助，一份友情。

2、编写具有粘贴功能的程序
需要加入粘贴功能，必须得知道如何编写具有粘贴功能的程序，以及实现的原
理。
豆豆虾说“简单，在internet上，随时随地都能找到你需要的东西”，于是找到了如
下的程序：
how to place text on the clipboard

cstring source;
//put your text in source
if(openclipboard())
{
hglobal clipbuffer;
char * buffer;
emptyclipboard();
clipbuffer = globalalloc(gmem_ddeshare, source.getlength()+1);
buffer = (char*)globallock(clipbuffer);
strcpy(buffer, lpcstr(source));
globalunlock(clipbuffer);
setclipboarddata(cf_text,clipbuffer);
closeclipboard();
}
how to get text off of the clipboard
this is easy really but here it is for completeness

char * buffer;
if(openclipboard())
{

buffer = (char*)getclipboarddata(cf_text);
//do something with buffer here
//before it goes out of scope

}

closeclipboard();

对以上的代码作了小小的调整。如何使用这段代码？在vc中自动生成一个基于于对话框
程序，双击ok按钮，把以下程序粘贴过去，这样大功告成。运行程序，点击ok键，这样
在剪贴板中的内容就是“test for clipbroad!!”
void CClipbroadDlg::OnOK()
{
// TODO: Add extra validation here
CString source("test for clipbroad!!!"); //初始化source
//put your text in source
if(OpenClipboard()) //打开剪贴板
{
HGLOBAL clipbuffer;
char * buffer;
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
//分配一段dde内存
EmptyClipboard(); //清空剪贴板
buffer = (char*)GlobalLock(clipbuffer); //锁定申请到的内存
strcpy(buffer, LPCSTR(source)); //复制字符串到内存
GlobalUnlock(clipbuffer); //解锁内存
SetClipboardData(CF_TEXT,clipbuffer); //设定剪贴板的内容
CloseClipboard(); ｝ //关闭剪贴板
}

3、转换vc程序为汇编程序。
为什么要这样呢？？原因有两点：一、对于CF_TEXT之类的宏，不知道到底是代表什么
值
二、汇编程序反编译可以非常简单的照搬到程序中。
我把iczelion的第一个masm的ok演示程序修改成如下：
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data

MsgCaption db "Iczelion's tutorial no.2",0
MsgBoxText db "Win32 Assembly is Great!",0

.data?
hMemory HANDLE ?
pMemory DWORD ?

.code
start:

invoke OpenClipboard,NULL ;打开剪贴板
test eax,eax
je endpro
mov edi,offset MsgCaption ; 取得标题，把它当成剪贴板中的内容
or ecx,0FFFFFFFFh
xor eax,eax
repnz scasb
not ecx ;得到标题长度
sub edi,ecx
push ecx
push edi ;这两个push也许不需要。没有时间去尝试
inc ecx
invoke GlobalAlloc,GMEM_DDESHARE,ecx ;锁定申请到的内存
mov hMemory,eax
invoke EmptyClipboard ;/清空剪贴板
invoke GlobalLock,hMemory ;锁定申请到的内存
mov pMemory,eax
pop esi
pop ecx
mov edi,eax
rep movs byte ptr [edi],byte ptr [esi] ;/复制字符串到内存

invoke GlobalUnlock,pMemory ;解锁内存
invoke SetClipboardData,CF_TEXT,pMemory; ;设定剪贴板的内容
invoke CloseClipboard ;关闭剪贴板
endpro:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start

4、再看看反编译的结果：（其中一个目的是想得到需要宏的数值，其实也有简单
的方法，就是查询windows.h）

//******************** Program Entry Point ********
:00401000 6A00 push 00000000

* Reference To: USER32.OpenClipboard, Ord:01D0h
|
:00401002 E88B000000 Call 00401092
:00401007 85C0 test eax, eax
:00401009 745B je 00401066

* Possible StringData Ref from Data Obj ->"Iczelion's tutorial no.2"
|
:0040100B BF00304000 mov edi, 00403000
:00401010 83C9FF or ecx, FFFFFFFF
:00401013 33C0 xor eax, eax
:00401015 F2 repnz
:00401016 AE scasb
:00401017 F7D1 not ecx
:00401019 2BF9 sub edi, ecx
:0040101B 51 push ecx
:0040101C 57 push edi
:0040101D 41 inc ecx
:0040101E 51 push ecx
:0040101F 6800200000 push 00002000 //,GMEM_DDESHARE

* Reference To: KERNEL32.GlobalAlloc, Ord:0168h
|
:00401024 E87B000000 Call 004010A4
:00401029 A334304000 mov dword ptr [00403034], eax

* Reference To: USER32.EmptyClipboard, Ord:00B3h
|
:0040102E E853000000 Call 00401086
:00401033 FF3534304000 push dword ptr [00403034]

* Reference To: KERNEL32.GlobalLock, Ord:0173h
|
:00401039 E86C000000 Call 004010AA
:0040103E A338304000 mov dword ptr [00403038], eax
:00401043 5E pop esi
:00401044 59 pop ecx
:00401045 8BF8 mov edi, eax
:00401047 F3 repz
:00401048 A4 movsb
:00401049 FF3538304000 push dword ptr [00403038]

* Reference To: KERNEL32.GlobalUnlock, Ord:017Ah
|
:0040104F E85C000000 Call 004010B0
:00401054 FF3538304000 push dword ptr [00403038]
:0040105A 6A01 push 00000001 //,CF_TEXT

* Reference To: USER32.SetClipboardData, Ord:021Fh
|
:0040105C E837000000 Call 00401098

* Reference To: USER32.CloseClipboard, Ord:003Bh
|
:00401061 E81A000000 Call 00401080

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401009(C)
|
:00401066 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Iczelion's tutorial no.2"
|
:00401068 6800304000 push 00403000

* Possible StringData Ref from Data Obj ->"Win32 Assembly is Great!"
|
:0040106D 6819304000 push 00403019
:00401072 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:00401074 E813000000 Call 0040108C
:00401079 6A00 push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
|
:0040107B E81E000000 Call 0040109E

5、寻找空间插入代码
前面做了如此多的准备工作，都是为了这一步。正所谓，现实中机会是
很多，关键你的知识是否已经准备充足呢？？：）
首先使用topo软件，进行测量crackcode中是否有空间插入代码。然后再使用
hiew进行静态的写入代码。运行前，需要把代码的SECTION属性，通过pebulid编辑
成可读可写的。
通过topo得到空间后，接下来你需要做一个小小的计划。
1、404400 －－－插入代码的开始
2、404900 －－－调用函数的地址
3、404A00－－－调用的函数名
同时，调用的函数入口，必须得通过getprocessaddress，getmodulehandled
得到。
以下是豆豆虾的笔记：

getprocessaddress call dword ptr [4050A8]
getmodulehandled call dword ptr [405038]
KERNEL32.DLL-------405530
USER32.DLL-----------40553d
plan :
1、404400－－－code
2、404900－－－address of function
3、404A00－－－function's name

404A00－－－function's name

▓ 00004A00: 4F 70 65 6E-43 6C 69 70-62 6F 61 72-64 00 90 90 OpenClipboard éé
▓ 00004A10: 45 6D 70 74-79 43 6C 69-70 62 6F 61-72 64 00 90 EmptyClipboard é
▓ 00004A20: 47 6C 6F 62-61 6C 41 6C-6C 6F 63 00-90 90 90 90 GlobalAlloc éééé
▓ 00004A30: 47 6C 6F 62-61 6C 4C 6F-63 6B 00 90-90 90 90 90 GlobalLock ééééé
▓ 00004A40: 47 6C 6F 62-61 6C 55 6E-6C 6F 63 6B-00 90 90 90 GlobalUnlock ééé
▓ 00004A50: 53 65 74 43-6C 69 70 62-6F 61 72 64-44 61 74 61 SetClipboardData
▓ 00004A60: 00 90 90 90-90 90 90 90-90 90 90 90-90 90 90 90 ééééééééééééééé
▓ 00004A70: 43 6C 6F 73-65 43 6C 69-70 62 6F 61-72 64 00 90 CloseClipboard é

404900－－－address of function
OpenClipboard = 404900 ---user32.dll
EmptyClipboard = 404904 ---user32.dll
GlobalAlloc = 404908 ---kernel32.dll
GlobalLock = 40490C ---kernel32.dll
GlobalUnlock = 404910 ---kernel32.dll
SetClipboardData = 404914 ---user32.dll
CloseClipboard = 404918 ---user32.dll

hmemory = 40491C var
pmemory = 404920 var

好了，有了如此之多的准备，该开始修改了，八年抗战该结束了
呵呵～～～
＝＝＝＝＝＝＝＝＝＝突破24位的修改＝＝＝＝＝＝＝＝＝＝＝＝＝
:00401448 BB4CA64000 mov ebx, 0040A64C
:0040144D B9CCA14000 mov ecx, 0040A1CC
:00401452 8A03 mov al, byte ptr [ebx]
:00401454 3CF5 cmp al, F5
:00401456 7426 je 0040147E
:00401458 83E904 sub ecx, 00000004
:0040145B 3CF0 cmp al, F0
:0040145D 741F je 0040147E
:0040145F 83E904 sub ecx, 00000004
:00401462 3CF1 cmp al, F1
:00401464 7418 je 0040147E
:00401466 83E904 sub ecx, 00000004
:00401469 3CF2 cmp al, F2
:0040146B 7411 je 0040147E
:0040146D 83E904 sub ecx, 00000004
:00401470 3CF3 cmp al, F3
:00401472 740A je 0040147E
:00401474 83E904 sub ecx, 00000004
:00401477 3C90 cmp al, 90
:00401479 7403 je 0040147E
:0040147B 83E904 sub ecx, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401456(C), :0040145D(C), :00401464(C), :0040146B(C), :00401472(C)
|:00401479(C)
|
:0040147E 6A00 push 00000000
:00401480 6A28 push 00000028
:00401482 68809B4000 push 00409B80
:00401487 FF31 push dword ptr [ecx]
:00401489 FF3510A44000 push dword ptr [0040A410]

* Reference To: KERNEL32.ReadProcessMemory, Ord:0000h
|
:0040148F FF1524504000 Call dword ptr [00405024]
:00401495 BB809B4000 mov ebx, 00409B80
:0040149A E9612F0000 jmp 00404400
＋＋＋＋＋＋＋＋＋这句jmp到插入的代码处＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋
:0040149F 90 nop
:004014A0 90 nop
:004014A1 90 nop
:004014A2 90 nop

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404504(U)
|
:004014A3 53 push ebx
:004014A4 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:004014A6 FF15C0504000 Call dword ptr [004050C0]
:004014AC E8BB040000 call 0040196C
＝＝＝＝＝＝＝＝＝突破24位的修改＝＝＝＝＝＝＝＝＝＝＝＝＝＝

＝＝＝＝＝＝＝＝＝增加粘贴功能＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
:00404400 6660 pusha
:00404402 669C pushf //保护寄存器
－－－－－－－－－取得各个函数的入口－－－－－－－－－－－－
:00404404 683D554000 push 0040553D

* Reference To: KERNEL32.GetModuleHandleA, Ord:0000h
|
:00404409 FF1538504000 Call dword ptr [00405038]
:0040440F 8BF8 mov edi, eax

* Possible StringData Ref from Code Obj ->"OpenClipboard"
|
:00404411 68004A4000 push 00404A00
:00404416 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:00404417 FF15A8504000 Call dword ptr [004050A8]
:0040441D A300494000 mov dword ptr [00404900], eax

* Possible StringData Ref from Code Obj ->"EmptyClipboard"
|
:00404422 68104A4000 push 00404A10
:00404427 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:00404428 FF15A8504000 Call dword ptr [004050A8]
:0040442E A304494000 mov dword ptr [00404904], eax

* Possible StringData Ref from Code Obj ->"SetClipboardData"
|
:00404433 68504A4000 push 00404A50
:00404438 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:00404439 FF15A8504000 Call dword ptr [004050A8]
:0040443F A318494000 mov dword ptr [00404918], eax

* Possible StringData Ref from Code Obj ->"CloseClipboard"
|
:00404444 68704A4000 push 00404A70
:00404449 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:0040444A FF15A8504000 Call dword ptr [004050A8]
:00404450 A314494000 mov dword ptr [00404914], eax
:00404455 6830554000 push 00405530

* Reference To: KERNEL32.GetModuleHandleA, Ord:0000h
|
:0040445A FF1538504000 Call dword ptr [00405038]
:00404460 8BF8 mov edi, eax

* Possible StringData Ref from Code Obj ->"GlobalAlloc"
|
:00404462 68204A4000 push 00404A20
:00404467 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:00404468 FF15A8504000 Call dword ptr [004050A8]
:0040446E A308494000 mov dword ptr [00404908], eax

* Possible StringData Ref from Code Obj ->"GlobalLock"
|
:00404473 68304A4000 push 00404A30
:00404478 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:00404479 FF15A8504000 Call dword ptr [004050A8]
:0040447F A30C494000 mov dword ptr [0040490C], eax
* Possible StringData Ref from Code Obj ->"GlobalUnlock"
|
:00404484 68404A4000 push 00404A40
:00404489 57 push edi

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:0040448A FF15A8504000 Call dword ptr [004050A8]
:00404490 A310494000 mov dword ptr [00404910], eax
－－－以下为剪贴板调用（注意在程序中没有对错误的结果进行判断）－－－－－－
:00404495 6A00 push 00000000
:00404497 FF1500494000 call dword ptr [00404900]
:0040449D FF1504494000 call dword ptr [00404904]
:004044A3 BF809B4000 mov edi, 00409B80
:004044A8 83C9FF or ecx, FFFFFFFF
:004044AB 33C0 xor eax, eax
:004044AD F2 repnz
:004044AE AE scasb
:004044AF F7D1 not ecx
:004044B1 2BF9 sub edi, ecx
:004044B3 57 push edi
:004044B4 51 push ecx
:004044B5 41 inc ecx
:004044B6 51 push ecx
:004044B7 6800200000 push 00002000
:004044BC FF1508494000 call dword ptr [00404908]
:004044C2 A31C494000 mov dword ptr [0040491C], eax
:004044C7 50 push eax
:004044C8 FF150C494000 call dword ptr [0040490C]
:004044CE A320494000 mov dword ptr [00404920], eax
:004044D3 59 pop ecx
:004044D4 5E pop esi
:004044D5 8BF8 mov edi, eax
:004044D7 F3 repz
:004044D8 A4 movsb
:004044D9 FF3520494000 push dword ptr [00404920]
:004044DF FF1510494000 call dword ptr [00404910]
:004044E5 FF3520494000 push dword ptr [00404920]
:004044EB 6A01 push 00000001
:004044ED FF1518494000 call dword ptr [00404918]
:004044F3 FF1514494000 call dword ptr [00404914]
－－－－－－－－－－－以下为恢复被覆盖的代码－－－－－－－－－
:004044F9 669D popf
:004044FB 6661 popa
:004044FD 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Crackcode 2000 -- Author:Ru Feng "
->"(http:\\ocqpat.163.net)"
|
:004044FF 68AC624000 push 004062AC
:00404504 E99ACFFFFF jmp 004014A3

终于写完了，回头得让豆豆虾请我大餐不可！

【结束语】作家（Terry Berger)曾写道：“花园是生命本身的绝佳比喻。虽然并非
所有人都是园丁，但我们都栽下家族和友谊的种籽，而的确，我们也必须悉心照
顾它们，才能让它们生长茁壮。”不论你住在都市或乡村，独局或和他人合住，远
离家人或是亲友就在身边---都请记住，你每天都要好好照顾自己的“花园”，必须付
出时间、心血，和爱，照顾你的“部族”，才能得到快乐的酬报。
当当虾 耗时：8小时
2001年8月26日 13:33


Active Registry Monitor

标 题:它是将输入的内容作变换，再与内设的字串相比较，（估计只有暴破这一条路） (8千字)
发信人:Fpc
时 间:2001-4-8 16:05:52
详细信息:
Trace Arm BY Fpc

在追踪注册码计算过程时很容易到这里。

下面这个CALL的作用是：将输入的0X18字节的注册信息变换为0X10字节的注册码1。
* Referenced by a CALL at Addresses:
|:0048BB15 , :0048BB50 , :0048BBED , :0048BC48
|
:0048BDC8 55 push ebp
:0048BDC9 8BEC mov ebp, esp
:0048BDCB 83C4E4 add esp, FFFFFFE4
:0048BDCE 894DF8 mov dword ptr [ebp-08], ecx

Ecx指向输入的注册码

:0048BDD1 8955E4 mov dword ptr [ebp-1C], edx Edx好象等于18
:0048BDD4 8945FC mov dword ptr [ebp-04], eax

Eax指向一个字节的码表：
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10

上面的这三个MOV比较重要

:0048BDD7 8B45FC mov eax, dword ptr [ebp-04]
:0048BDDA 8B00 mov eax, dword ptr [eax]
:0048BDDC 8945F4 mov dword ptr [ebp-0C], eax
:0048BDDF 8B45FC mov eax, dword ptr [ebp-04]
:0048BDE2 8B4004 mov eax, dword ptr [eax+04]
:0048BDE5 8945F0 mov dword ptr [ebp-10], eax
:0048BDE8 8B45FC mov eax, dword ptr [ebp-04]
:0048BDEB 8B4008 mov eax, dword ptr [eax+08]
:0048BDEE 8945EC mov dword ptr [ebp-14], eax
:0048BDF1 8B45FC mov eax, dword ptr [ebp-04]
:0048BDF4 8B400C mov eax, dword ptr [eax+0C]
:0048BDF7 8945E8 mov dword ptr [ebp-18], eax

:0048BDFA 55 push ebp
:0048BDFB 8B45E8 mov eax, dword ptr [ebp-18]
:0048BDFE 50 push eax
:0048BDFF 8B45F8 mov eax, dword ptr [ebp-08]
:0048BE02 8B00 mov eax, dword ptr [eax]
:0048BE04 0578A46AD7 add eax, D76AA478
:0048BE09 50 push eax
:0048BE0A 6A07 push 00000007
:0048BE0C 8D45F4 lea eax, dword ptr [ebp-0C]
:0048BE0F 8B4DEC mov ecx, dword ptr [ebp-14]
:0048BE12 8B55F0 mov edx, dword ptr [ebp-10]
:0048BE15 E856FEFFFF call 0048BC70
:0048BE1A 59 pop ecx

:0048BE1B 55 push ebp
:0048BE1C 8B45EC mov eax, dword ptr [ebp-14]
:0048BE1F 50 push eax
:0048BE20 8B45F8 mov eax, dword ptr [ebp-08]
:0048BE23 8B4004 mov eax, dword ptr [eax+04]
:0048BE26 0556B7C7E8 add eax, E8C7B756
:0048BE2B 50 push eax
:0048BE2C 6A0C push 0000000C
:0048BE2E 8D45E8 lea eax, dword ptr [ebp-18]
:0048BE31 8B4DF0 mov ecx, dword ptr [ebp-10]
:0048BE34 8B55F4 mov edx, dword ptr [ebp-0C]
:0048BE37 E834FEFFFF call 0048BC70
。。。。。

:0048C653 59 pop ecx
:0048C654 55 push ebp
:0048C655 8B45F4 mov eax, dword ptr [ebp-0C]
:0048C658 50 push eax
:0048C659 8B45F8 mov eax, dword ptr [ebp-08]
:0048C65C 8B4024 mov eax, dword ptr [eax+24]
:0048C65F 0591D386EB add eax, EB86D391
:0048C664 50 push eax
:0048C665 6A15 push 00000015
:0048C667 8D45F0 lea eax, dword ptr [ebp-10]
:0048C66A 8B4DE8 mov ecx, dword ptr [ebp-18]
:0048C66D 8B55EC mov edx, dword ptr [ebp-14]
:0048C670 E8FFF6FFFF call 0048BD74
:0048C675 59 pop ecx
:0048C676 8B45FC mov eax, dword ptr [ebp-04]
:0048C679 8B55F4 mov edx, dword ptr [ebp-0C]
:0048C67C 0110 add dword ptr [eax], edx
:0048C67E 8B45FC mov eax, dword ptr [ebp-04]
:0048C681 8B55F0 mov edx, dword ptr [ebp-10]
:0048C684 015004 add dword ptr [eax+04], edx
:0048C687 8B45FC mov eax, dword ptr [ebp-04]
:0048C68A 8B55EC mov edx, dword ptr [ebp-14]
:0048C68D 015008 add dword ptr [eax+08], edx
:0048C690 8B45FC mov eax, dword ptr [ebp-04]
:0048C693 8B55E8 mov edx, dword ptr [ebp-18]
:0048C696 01500C add dword ptr [eax+0C], edx
:0048C699 8BE5 mov esp, ebp
:0048C69B 5D pop ebp
:0048C69C C20400 ret 0004

这一段非常长，结构却差不多，因此大部分内容都略过了。这个CALL过后会形成一个0X10字节的注册码1。接下来注册码1会被扩展为0X20字节，然后与已经计算好的0X3F0组字串相比较，与其中一组相同即可。

call 0048BC70是用于变换的一个CALL（共有四个），被调用16次：（真是变态！）
结合入口参数看

:0048BDFA 55 push ebp
:0048BDFB 8B45E8 mov eax, dword ptr [ebp-18]
:0048BDFE 50 push eax ;<1>
:0048BDFF 8B45F8 mov eax, dword ptr [ebp-08]
:0048BE02 8B00 mov eax, dword ptr [eax]
:0048BE04 0578A46AD7 add eax, D76AA478
:0048BE09 50 push eax ;<2>
:0048BE0A 6A07 push 00000007 ;<3>
:0048BE0C 8D45F4 lea eax, dword ptr [ebp-0C]
:0048BE0F 8B4DEC mov ecx, dword ptr [ebp-14]
:0048BE12 8B55F0 mov edx, dword ptr [ebp-10]
:0048BE15 E856FEFFFF call 0048BC70
:0048BE1A 59 pop ecx

Call(1):
* Referenced by a CALL at Addresses:
|:0048BE15 , :0048BE37 , :0048BE59 , :0048BE7B , :0048BE9D
|:0048BEBF , :0048BEE1 , :0048BF03 , :0048BF25 , :0048BF47
|:0048BF69 , :0048BF8B , :0048BFAD , :0048BFCF , :0048BFF1
|:0048C013
|
:0048BC70 55 push ebp
:0048BC71 8BEC mov ebp, esp
:0048BC73 83C4F4 add esp, FFFFFFF4
:0048BC76 894DF4 mov dword ptr [ebp-0C], ecx
:0048BC79 8955F8 mov dword ptr [ebp-08], edx
:0048BC7C 8945FC mov dword ptr [ebp-04], eax

:0048BC7F 8B45F4 mov eax, dword ptr [ebp-0C] ; Eax=Ecx
:0048BC82 334510 xor eax, dword ptr [ebp+10] ; Eax^=<1>
:0048BC85 2345F8 and eax, dword ptr [ebp-08] ; Eax&=Edx
:0048BC88 334510 xor eax, dword ptr [ebp+10] ; Eax^=<1>
:0048BC8B 03450C add eax, dword ptr [ebp+0C] ; Eax+=<2>

:0048BC8E 8B55FC mov edx, dword ptr [ebp-04]
:0048BC91 0102 add dword ptr [edx], eax ; Save it

:0048BC93 33C0 xor eax, eax
:0048BC95 8A4508 mov al, byte ptr [ebp+08] ; Eax=<3>
:0048BC98 B920000000 mov ecx, 00000020
:0048BC9D 2BC8 sub ecx, eax
:0048BC9F 8B45FC mov eax, dword ptr [ebp-04]
:0048BCA2 8B00 mov eax, dword ptr [eax]
:0048BCA4 D3E8 shr eax, cl
:0048BCA6 8A4D08 mov cl, byte ptr [ebp+08]
:0048BCA9 8B55FC mov edx, dword ptr [ebp-04]
:0048BCAC 8B12 mov edx, dword ptr [edx]
:0048BCAE D3E2 shl edx, cl ; And this part:
:0048BCB0 0BC2 or eax, edx ; Roll left N<3> bits

:0048BCB2 8B55FC mov edx, dword ptr [ebp-04]
:0048BCB5 8902 mov dword ptr [edx], eax
:0048BCB7 8B45FC mov eax, dword ptr [ebp-04]
:0048BCBA 8B55F8 mov edx, dword ptr [ebp-08]
:0048BCBD 0110 add dword ptr [eax], edx ; Add again

:0048BCBF 8BE5 mov esp, ebp
:0048BCC1 5D pop ebp
:0048BCC2 C20C00 ret 000C

For short, Call(1) looks like :

push ebp
mov ebp, esp
push ebx ; Ebx will serve as a Temp
push eax
push edx

mov eax, ecx
xor eax, dword ptr [ebp+10]
and eax, edx ; Shit! Cant write a KeyGen Coz of this
xor eax, dword ptr [ebp+10]
add eax, dword ptr [ebp+c]
mov ebx, eax ; Temp=Eax

mov al, byte ptr [ebp+08] ; Eax=<3>
mov cl, 20
sub cl, al
mov eax, ebx
shr eax, cl
mov cl, byte ptr [ebp+08]
mov edx, ebx
shl edx, cl ; And this part:
or eax, edx ; Roll left N<3> bits

pop edx
add eax, edx
mov ebx, eax
pop eax
mov dword ptr [eax], ebx
pop ebx
mov esp, ebp
pop ebp
ret 000C

本来是要追出注册码计算过程，然后写出注册机。这个注册机原理是根据3F0组字串写出逆过程，现在看是不可能了，原因就在于那个AND（不可逆）。所以ARM只能解压后再暴破。：-（

标 题:与peterchen大哥商榷,Active Registry Monitor的另一种轻松破解!!! (5千字)
发信人:南木
时 间:2001-4-8 18:03:39
详细信息:

与peterchen大哥商榷,Active Registry Monitor的另一种轻松破解!!!

按照peterchen大哥的<<完美的暴力!>>一文的方法
seach:85C074BE8945F8--->75 也就是je->jne
^^
所有的限制都除去了,但遗憾的是---在我的机器上(W2000),'options'菜单中的子菜单'Settings'不能使用!不知道在Window98上能不能使用?

怎么办? 当然'操家伙'干掉它了!!!

.
.
.
:00496B63 E880D1F6FF call 00403CE8
:00496B68 83F818 cmp eax, 00000018----------->注册码是否是24位
:00496B6B 0F85A6000000 jne 00496C17
:00496B71 8B45EC mov eax, dword ptr [ebp-14]
:00496B74 E833D3F6FF call 00403EAC
:00496B79 8945F8 mov dword ptr [ebp-08], eax
:00496B7C 8B45F8 mov eax, dword ptr [ebp-08]
:00496B7F E864ECFFFF call 004957E8----------------------->关键对比!!!
:00496B84 84C0 test al, al
:00496B86 7478 je 00496C00------------------------->跳就死!!!
:00496B88 B201 mov dl, 01
:00496B8A A1F8D64400 mov eax, dword ptr [0044D6F8]
:00496B8F E8106DFBFF call 0044D8A4
:00496B94 8945F0 mov dword ptr [ebp-10], eax
:00496B97 BA01000080 mov edx, 80000001
:00496B9C 8B45F0 mov eax, dword ptr [ebp-10]
:00496B9F E8986DFBFF call 0044D93C
:00496BA4 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\SOFTWARE\SmartLine Vision\ARM\Registration"
|
:00496BA6 BAE46C4900 mov edx, 00496CE4
:00496BAB 8B45F0 mov eax, dword ptr [ebp-10]
:00496BAE E8E56EFBFF call 0044DA98
:00496BB3 8845F7 mov byte ptr [ebp-09], al
:00496BB6 8D45E8 lea eax, dword ptr [ebp-18]
:00496BB9 8B55F8 mov edx, dword ptr [ebp-08]
:00496BBC E85FD0F6FF call 00403C20
:00496BC1 8B4DE8 mov ecx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"Code"
|
:00496BC4 BA186D4900 mov edx, 00496D18
:00496BC9 8B45F0 mov eax, dword ptr [ebp-10]
:00496BCC E8F373FBFF call 0044DFC4
:00496BD1 6A00 push 00000000
:00496BD3 668B0D206D4900 mov cx, word ptr [00496D20]
:00496BDA B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thank you for registering !"
|
:00496BDC B82C6D4900 mov eax, 00496D2C
:00496BE1 E8E6E4FBFF call 004550CC
:00496BE6 A124744B00 mov eax, dword ptr [004B7424]
:00496BEB 8B00 mov eax, dword ptr [eax]
:00496BED E83A27FBFF call 0044932C
:00496BF2 A1E8704B00 mov eax, dword ptr [004B70E8]
:00496BF7 C60001 mov byte ptr [eax], 01
:00496BFA C645FF01 mov [ebp-01], 01
:00496BFE EB2C jmp 00496C2C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496B86(C)
|
:00496C00 6A00 push 00000000
:00496C02 668B0D206D4900 mov cx, word ptr [00496D20]
:00496C09 33D2 xor edx, edx

* Possible StringData Ref from Code Obj ->"The registration code is invalid!"
|
:00496C0B B8506D4900 mov eax, 00496D50
:00496C10 E8B7E4FBFF call 004550CC
:00496C15 EB15 jmp 00496C2C
.
.
.
.
由以上w32dam反汇编的代码可看出,(用查找文本"Thank you for registering"可轻易找到),
:00496B86 je 00496C00 是关键的跳跃,运行Active Registry Monitor,输入注册码123456781234567812345678(注意必须为24位),ctrl+D呼出softice ,下断点bpx showwindow
来到:00496B86 je 00496C00 用命令r fl z ,然后F5,弹出对话框---You have regestered version. Ok!! 马上启动Hex WorkShop 将84c07478b201改为84c07578b201,存盘,重新运行
Active Registry Monitor,哎呀,提示对话框'涛声依旧',随便输入注册码(24位),弹出对话框
---You have regestered version. 看来只成功了一半!!!

另一半在哪儿呢? 肯定是程序中的其它地方还进行了对比!!!

:00496B7F E864ECFFFF call 004957E8 该call为关键call,F8进去
看看,

* Referenced by a CALL at Addresses:
|:004958EE , :00496B7F ------------------------------------->增大眼睛哟!!!!
|
:004957E8 55 push ebp
:004957E9 8BEC mov ebp, esp
:004957EB 83C4D8 add esp, FFFFFFD8
:004957EE 33D2 xor edx, edx
.
.
.
原来:004958EE处也进行了对比,这下就清楚了,跳到

:004958EE E8F5FEFFFF call 004957E8
:004958F3 84C0 test al, al
:004958F5 740C je 00495903------------------>关键!!!
:004958F7 C645FF01 mov [ebp-01], 01
:004958FB A1E8704B00 mov eax, dword ptr [004B70E8]
:00495900 C60001 mov byte ptr [eax], 01

如法炮制,马上启动Hex WorkShop 将84c0740cc645ff01改为84c0750cc645ff01,存盘,重新运行
Active Registry Monitor,哎呀,提示对话框不见了,试一试'options'菜单中的子菜单'Settings'
,一切OK,大功告成!!!!!!

总结:
将84c07478b201改为84c07578b201

将84c0740cc645ff01改为84c0750cc645ff01


Advanced Launcher 1.3

 标 题:暴破　Advanced Launcher 1.3 (5千字)
发信人:paulyoung
时 间:2001-7-1 19:46:16
详细信息:
    希望本文能起到抛砖引玉的作用，引出哪位高手从注册码方面入手，破解它的注册码，并竟暴破是不得己而为之！！

_________________________________________________________________________________________________

暴破　Advanced Launcher 1.3

作 者：PaulYoung
时 间：2001年6月30日凌晨
软件简介：一个超级好用的桌面管理工具
URL：http://www.serpik.net/alaunch/alaunch.zip
破解工具：Caspr V1.100,FileInfo V2.45a,Soft-Ice V4.05,W32Dasm V8.93,Hiew V6.55
*************************************************************************************************

    这个本来很早就有网友向我求破了，可惜本人这段时间经常出差，无空理会，今晚抽空把它干掉了。
    这个软件的注册，我估计是先填入注册码，然后重启，假如注册码正确的话，而且注册码必须符合它的加密算法，会显示相应的注册人，这种注册码，我可没办法。如果哪位高人能破解这类软件的注册码，还望不吝赐教。
    下面我想谈谈如果暴破它。

    用FI侦察到它是用asprotect V1.2?加的壳，用CASPR V1.100方可脱掉它的壳，其它低版本的CASPR可不行哦。

一、注册提示窗口

    运行软件，出现讨厌的提示窗口。请注意它的提示信息！
    此时下CTRL＋D激活SOFTICE，下 bpx destroywindow,
    F5退出，点击RUN，程序立即被中断，按一下F12，
    再下 S 0 L 90000000 'functional' （这是它的提示信息中一个比较特别的单词，因此我选搜索它）
你会找到象xxx:yyyyyyyy 这样的地址，下 BPM 30:yyyyyyyy
中断所有断点，F5 退出。关闭软件。
重建BPM 30:yyyyyyyy这个断点，再重新运行Advanced Launcher，程序被中断，按F12　24次出现提示窗口，因此再重来，按23次。
    看好了……

* Referenced by a CALL at Address:
|:0046EE39 //就是它了！！在下面
|
:0046EDE0 E909000000 jmp 0046EDEE
:0046EDE5 5F pop edi
:0046EDE6 1AA1E3E11052 sbb ah, byte ptr [ecx+5210E1E3]
:0046EDEC 874B8B xchg dword ptr [ebx-75], ecx
:0046EDEF 0D50404700 or eax, 00474050
:0046EDF4 A1BC3F4700 mov eax, dword ptr [00473FBC]
:0046EDF9 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Data Obj ->"$;C"
|
:0046EDFB 8B155CDF4600 mov edx, dword ptr [0046DF5C]
:0046EE01 E8BEC1FDFF call 0044AFC4
:0046EE06 A150404700 mov eax, dword ptr [00474050]
:0046EE0B 8B00 mov eax, dword ptr [eax]
:0046EE0D 8B10 mov edx, dword ptr [eax]
:0046EE0F FF92D8000000 call dword ptr [edx+000000D8] //调用提示窗口，下909090909090干掉它，或者向上看……
:0046EE15 A150404700 mov eax, dword ptr [00474050]
:0046EE1A 8B00 mov eax, dword ptr [eax]
:0046EE1C E82F3FF9FF call 00402D50
:0046EE21 C3 ret

:0046EE22 8BC0 mov eax, eax
:0046EE24 53 push ebx
:0046EE25 8BD8 mov ebx, eax
:0046EE27 6A00 push 00000000
:0046EE29 A1BC3F4700 mov eax, dword ptr [00473FBC]
:0046EE2E 8B00 mov eax, dword ptr [eax]
:0046EE30 8B4024 mov eax, dword ptr [eax+24]
:0046EE33 50 push eax
:0046EE34 E8AB7CF9FF call 00406AE4
:0046EE39 E8A2FFFFFF call 0046EDE0　　　　//下9090909090干掉它

重新运行，哈，提示窗口没有了，YEAH！！！
:0046EE0F FF92D8000000 call dword ptr [edx+000000D8]
:0046EE39 E8A2FFFFFF call 0046EDE0
这两个CALL，随便改其中一个就行了。

二、时间限制

    先别得意得太早，它还有时间限制，过期后使用一些功能时还会出现提示注册信息的，这个好办，在W32DASM的"串式参考"处找到提示信息，如下……

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046F8C8(U)
|
:0046F8D6 803D203D470000 cmp byte ptr [00473D20], 00
:0046F8DD 7425 je 0046F904 //改为7525
:0046F8DF 6824000400 push 00040024

* Possible StringData Ref from Data Obj ->"Confirm"
|
:0046F8E4 B908F94600 mov ecx, 0046F908

* Possible StringData Ref from Data Obj ->"The evaluation period has expired.
Would "
->"you like to register Advanced "
->"Launcher now?"

三、如果你还觉得在ABOUT处的Unregistered version碍眼的话，学我用HEXWORKSHOP把它改为你想显示的字眼就行了，当然用UEDIT也可。

*************************************************************************************************

    看来，我已经彻底搞定它了，如果哪位发现还有什么不足的地方，请指正。
还想看更多的破解文章吗？欢迎光临 Cracker 初体验 http://paulyoung.yeah.net
_________________________________________________________________________________________________

    另外，本人接到一MM紧急求助，欲破解《精微档案工资管理》，用 Fox Pro 编写，注册码形式，小弟用　bpx readfile 可以中断，可惜水平有限，无法找到注册码，希望哪位大侠能英雄救美，伸出友谊之手，解掉这个软件，最好能有破解教程啦！！mail to: paulyoung@yeah.net

http://mindy_c.home.chinaren.com/jwrj.exe （不支持断线续传，请用IE直接下载）

    破解前请先清空原有的数据，重新填写新的信息，方可激活注册 ID 项菜单。

软件简介：《精微档案工资管理》是为实现机关、事业单位人事工资管理自动化而精心研制的，其主要功能如右边所列。主要特点是“像傻瓜相机一样易用、像保险箱一样安全、像七巧板一样灵活、像工艺品一样美观”。


Aesop GIF Creator v1.02.302

标 题:Aesop GIF Creator v1.02.302 (3千字)
发信人:alang
时 间:2001-3-14 17:03:54
详细信息:
软件名称:Aesop GIF Creator v1.02.302
软件大小:749(kb)
补丁大小:264(kb)
软件简介:“Aesop”是允许你制作包括深于世故的工作室-质量，
特殊效果，三次扩散工艺字形和形象操作特点的GIF图象难以相信
的广告的（旗，钮，线，lables，背景，为网点标题，并且其他）
的强大的工具动产大大地看的（在穿过形象移动正文的例子）能在
两三分实现成为多帧可交换的图像文件格式调色板优化和数据压缩
给你得到小的规模GIF的可能性简单和方便的接口使这程序对用图
表示的设计里的初学者来说经验丰富的程序编制员来说起作用。
软件下载:http://www.yukudr.com/software/index.html
=========================================================
使用工具:w32dasm、文本编辑器
启动软件，随便输入注册码，请记住错误提示。
打开w32dasm，装入软件，找到错误提示处：
------------------
:0048F240 A158A64900 mov eax, dword ptr [0049A658]
:0048F245 8B00 mov eax, dword ptr [eax]
:0048F247 80B87EFB070000 cmp byte ptr [eax+0007FB7E], 00
:0048F24E 7518 jne 0048F268
:0048F250 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Aesop"
|
:0048F252 B9D0F24800 mov ecx, 0048F2D0

* Possible StringData Ref from Code Obj ->"Invalid unlock key."
|
:0048F257 BA08F34800 mov edx, 0048F308
-------------------
向上查找到：
-------------------
:0048F183 E85C4EF7FF call 00403FE4
:0048F188 8D9500FFFFFF lea edx, dword ptr [ebp+FFFFFF00]
:0048F18E A158A64900 mov eax, dword ptr [0049A658]
:0048F193 8B00 mov eax, dword ptr [eax]
:0048F195 E89E7F0000 call 00497138
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:0048F19A A158A64900 mov eax, dword ptr [0049A658]
:0048F19F 8B00 mov eax, dword ptr [eax]
:0048F1A1 80B87EFB0700FB cmp byte ptr [eax+0007FB7E], FB
:0048F1A8 0F8592000000 jne 0048F240
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:0048F1AE B201 mov dl, 01
:0048F1B0 A1F8994800 mov eax, dword ptr [004899F8]
:0048F1B5 E83EA9FFFF call 00489AF8
:0048F1BA 8BF0 mov esi, eax
:0048F1BC BA02000080 mov edx, 80000002
:0048F1C1 8BC6 mov eax, esi
:0048F1C3 E8D0A9FFFF call 00489B98
:0048F1C8 33C9 xor ecx, ecx
----------------------
将0048F1A8 处的 jne 修改为 je
或干脆点将0F8592000000全部用90替换
还没有完事,此时注册提示成功,但退出再进入还是没有注册.
需要找到注册检测地址.
见到0048F195处的call吗?还等什么?进去呀!
----------------------
:004971AC E85FD0F6FF call 00404210
:004971B1 8B85F4FEFFFF mov eax, dword ptr [ebp+FFFFFEF4]
:004971B7 8D95F8FEFFFF lea edx, dword ptr [ebp+FFFFFEF8]
:004971BD E81A1EF7FF call 00408FDC
:004971C2 8B95F8FEFFFF mov edx, dword ptr [ebp+FFFFFEF8]
:004971C8 58 pop eax
:004971C9 E84ACFF6FF call 00404118
:004971CE 7516 jne 004971E6
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:004971D0 33D2 xor edx, edx
:004971D2 8B8370040000 mov eax, dword ptr [ebx+00000470]
:004971D8 E8937AFAFF call 0043EC70
:004971DD C6837EFB0700FB mov byte ptr [ebx+0007FB7E], FB
:004971E4 EB07 jmp 004971ED
-----------------------
将004971CE处的 jne 改为 je 即可
好了收工!
如需此软件的汉化文件,请到《阿郎居》。

欢迎光临《阿郎居》！
langlirong@163.net
http://alang.shangdu.net


AmazingMIDI v 1.60

 标 题:不知道有没有人破过 AmazingMIDI v 1.60 ? 也不知道好不好用 ? 呵呵.. (4千字)
发信人:IcySword
时 间:2001-7-18 4:28:21
详细信息:
作者：每位Cracker都可以
对像：AmazingMIDI v 1.60
保护：注册码
工具: trw2000

安装并运行 AmazingMIDI , 弹出一个窗口,提示"注册后不再显示此窗口"之类的内容, 点"确定"来到程序的主界面, 在"帮助"菜单里有一个"注册"子菜单, 点击它, 弹出注册框, (嘻嘻,这个软件的注册对话框里只有一个文本输入框,是不是挺简单的---心里想), 输入 789789 , 点"确定",先来碰碰运气,( :-( 晕~~,
有这样碰运气的吗? ) , 呵呵, 其实也不是什么碰运气, 只是想看看它会弹出什么错误信息来. 果然,
"抱歉!注册号码错误." 随着"震耳欲聋"的报错声弹了出来,(不是吧, 没声卡也能发声? 倒,, 没声卡都被你说了出来, 以后我怎么见人呀,?~! )

再次输入 789789
运行 trw2000
下断点 bpx hmemcpy
F5 或 G 返回程序界面,点击"确定", 随后程序会被中断
bc 清除断点
pmodule 领空
接下来的工作就是不停的按F12 而且口中也得跟着F12的次数念念有词, 到了 33 次----
STOP ! 按F10单步执行后,来到下面的代码处:

:00405D66 83F801 cmp eax, 00000001
:00405D69 0F85B6000000 jne 00405E25
:00405D6F 51 push ecx
:00405D70 8D442470 lea eax, dword ptr [esp+70]
:00405D74 8BCC mov ecx, esp
:00405D76 89642410 mov dword ptr [esp+10], esp
:00405D7A 50 push eax
:00405D7B E887B50100 call 00421307
:00405D80 8D4C240C lea ecx, dword ptr [esp+0C]
:00405D84 C644247C00 mov [esp+7C], 00
:00405D89 51 push ecx
:00405D8A E861010000 call 00405EF0
:00405D8F 8BC8 mov ecx, eax
:00405D91 E8AA180000 call 00407640
:00405D96 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Data Obj ->"<<@::5<720"
|
:00405D98 BE58054400 mov esi, 00440558 // d eax 可以看到被加密过的789789

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DBF(C)
|
:00405D9D 8A10 mov dl, byte ptr [eax] // d esi 可以看到 <<@::5<720 等字符

:00405D9F 8A1E mov bl, byte ptr [esi]
:00405DA1 8ACA mov cl, dl
:00405DA3 3AD3 cmp dl, bl
:00405DA5 751E jne 00405DC5 // 不能跳哦,
:00405DA7 84C9 test cl, cl
:00405DA9 7416 je 00405DC1 // 抬头可见 mov cl, dl 即取完
// 输入的字符时就跳
:00405DAB 8A5001 mov dl, byte ptr [eax+01]
:00405DAE 8A5E01 mov bl, byte ptr [esi+01]
:00405DB1 8ACA mov cl, dl
:00405DB3 3AD3 cmp dl, bl
:00405DB5 750E jne 00405DC5 // 也不能跳哦,
:00405DB7 83C002 add eax, 00000002
:00405DBA 83C602 add esi, 00000002
:00405DBD 84C9 test cl, cl
:00405DBF 75DC jne 00405D9D // 没取完输入的字符就跳回去继续取

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DA9(C)
|
:00405DC1 33C0 xor eax, eax
:00405DC3 EB05 jmp 00405DCA

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00405DA5(C), :00405DB5(C)
|
:00405DC5 1BC0 sbb eax, eax
:00405DC7 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DC3(U)
|
:00405DCA 85C0 test eax, eax
:00405DCC 8D4C2408 lea ecx, dword ptr [esp+08]
:00405DD0 0F94C3 sete bl
:00405DD3 E8BAB70100 call 00421592
:00405DD8 84DB test bl, bl
:00405DDA 7513 jne 00405DEF // 这里不跳可不行, 呵呵
:00405DDC 6AFF push FFFFFFFF
:00405DDE 6A00 push 00000000
.
.
.
.
.

这个程序利用固定的 key ( 9876543210 ) 把输入的字符进行加密并反向取值, 然后与 <<@::5<720 相比较, 如果相等则注册码正确, 否则就错误(废话!!) , 所以注册码也是固定的.


ARMADILLO2.0

 标 题:注册你的ARMADILLO2.0成为专业版（加入BCG的第三篇） (8千字)
发信人:大老
时 间:2001-6-29 12:51:34
详细信息:
注册你的ARMADILLO2.0成为专业版（加入BCG的第三篇）

工具：TRW2000 W32DASM大老专版
破解人：大老
大老的主页：HTTP://DALAO2001.YEAH.NET
软件下载：www.exetools
这是一个非常不错的给你的软件加保护！限制的软件！
没有注册版将对你加保护的软件开头加一段ARMADILLO2.0没有注册的的信息！
第一步：脱壳用armkiller13可以直接脱掉他的壳！
第二步：注册这个软件！嘿嘿！
:00402911 59 pop ecx
:00402912 50 push eax
:00402913 E8B3800100 call 0041A9CB
:00402918 83C40C add esp, 0000000C
:0040291B FF3570604200 push dword ptr [00426070]
:00402921 8D8500FDFFFF lea eax, dword ptr [ebp+FFFFFD00]
:00402927 50 push eax
:00402928 E8437E0100 call 0041A770
:0040292D 59 pop ecx
:0040292E 59 pop ecx
:0040292F E8E5BD0000 call 0040E719
:00402934 84C0 test al, al
:00402936 5E pop esi
:00402937 741B je 00402954====>这里要跳！(741B改成EB1B)
:00402939 E88EBE0000 call 0040E7CC
:0040293E 84C0 test al, al

* Possible StringData Ref from Data Obj ->"Professional"
|
:00402940 B814614200 mov eax, 00426114
:00402945 7505 jne 0040294C

* Possible StringData Ref from Data Obj ->"Basic"
|
:00402947 B80C614200 mov eax, 0042610C
:0040294C 50 push eax

* Possible StringData Ref from Data Obj ->", %s Trial Edition"
|
:0040294D 68F8604200 push 004260F8
:00402952 EB19 jmp 0040296D
:00402954 E873BE0000 call 0040E7CC ===>注意这
:00402959 84C0 test al, al

* Possible StringData Ref from Data Obj ->"Professional"
|
:0040295B B814614200 mov eax, 00426114
:00402960 7505 jne 00402967 ===>这里要跳

* Possible StringData Ref from Data Obj ->"Basic"
|
:00402962 B80C614200 mov eax, 0042610C
:00402967 50 push eax

* Possible StringData Ref from Data Obj ->", %s Edition"
|
:00402968 68E8604200 push 004260E8
:0040296D 8D8500FDFFFF lea eax, dword ptr [ebp+FFFFFD00]
:00402973 53 push ebx
:00402974 50 push eax
:00402975 E8E67E0100 call 0041A860
:0040297A 59 pop ecx
:0040297B 59 pop ecx
:0040297C 50 push eax
:0040297D E849800100 call 0041A9CB
:00402982 83C40C add esp, 0000000C
:00402985 8D8500FDFFFF lea eax, dword ptr [ebp+FFFFFD00]
:0040298B 50 push eax
:0040298C FF35F00C4300 push dword ptr [00430CF0]

* Reference To: USER32.SetWindowTextA, Ord:025Eh
|
:00402992 FF15E4314200 Call dword ptr [004231E4]
:00402998 5F pop edi
:00402999 5B pop ebx
:0040299A C9 leave
:0040299B C3 ret
===================================================================
注意这个CALL （00402954 call 0040E7CC）咱们进入嘿嘿！
:0040E7CC 55 push ebp
:0040E7CD 8BEC mov ebp, esp
:0040E7CF 81EC00010000 sub esp, 00000100
:0040E7D5 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:0040E7DB 6800010000 push 00000100
:0040E7E0 50 push eax

* Possible StringData Ref from Data Obj ->"VERSION"
|
:0040E7E1 6814634200 push 00426314

* Reference To: KERNEL32.GetEnvironmentVariableA, Ord:0109h
|
:0040E7E6 FF15A8304200 Call dword ptr [004230A8]
:0040E7EC 85C0 test eax, eax
:0040E7EE 7504 jne 0040E7F4======〉一定要跳！(7504改成EB04)
:0040E7F0 32C0 xor al, al
:0040E7F2 C9 leave
:0040E7F3 C3 ret

:0040E7F4 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]

* Possible StringData Ref from Data Obj ->"Professional"
|
:0040E7FA 6814614200 push 00426114
:0040E7FF 50 push eax
:0040E800 E83B300100 call 00421840=====>关键CALL
:0040E805 F7D8 neg eax
:0040E807 59 pop ecx
:0040E808 1BC0 sbb eax, eax
:0040E80A 59 pop ecx
:0040E80B 40 inc eax
:0040E80C C9 leave
:0040E80D C3 ret
====================================================================
进入call 00421840
:00421840 55 push ebp
:00421841 8BEC mov ebp, esp
:00421843 57 push edi
:00421844 56 push esi
:00421845 53 push ebx
:00421846 8B750C mov esi, dword ptr [ebp+0C]
:00421849 8B7D08 mov edi, dword ptr [ebp+08]
:0042184C 8D0588204300 lea eax, dword ptr [00432088]
:00421852 83780800 cmp dword ptr [eax+08], 00000000
:00421856 753B jne 00421893 ===>这里改成JMP4218C2(753B=>EB6A)
:00421858 B0FF mov al, FF
:0042185A 8BFF mov edi, edi
:0042185C 0AC0 or al, al
:0042185E 742E je 0042188E
:00421860 8A06 mov al, byte ptr [esi]
:00421862 46 inc esi
:00421863 8A27 mov ah, byte ptr [edi]
:00421865 47 inc edi
:00421866 38C4 cmp ah, al
:00421868 74F2 je 0042185C
:0042186A 2C41 sub al, 41
:0042186C 3C1A cmp al, 1A
:0042186E 1AC9 sbb cl, cl
:00421870 80E120 and cl, 20
:00421873 02C1 add al, cl
:00421875 0441 add al, 41
:00421877 86E0 xchg al, ah
:00421879 2C41 sub al, 41
:0042187B 3C1A cmp al, 1A
:0042187D 1AC9 sbb cl, cl
:0042187F 80E120 and cl, 20
:00421882 02C1 add al, cl
:00421884 0441 add al, 41
:00421886 38E0 cmp al, ah
:00421888 74D2 je 0042185C
:0042188A 1AC0 sbb al, al
:0042188C 1CFF sbb al, FF
:0042188E 0FBEC0 movsx eax, al
:00421891 EB34 jmp 004218C7

* Possible Reference to Dialog: DialogID_0078, CONTROL_ID:00FF, ""
|
:00421893 B8FF000000 mov eax, 000000FF
:00421898 33DB xor ebx, ebx
:0042189A 8BFF mov edi, edi
:0042189C 0AC0 or al, al
:0042189E 7427 je 004218C7
:004218A0 8A06 mov al, byte ptr [esi]
:004218A2 46 inc esi
:004218A3 8A1F mov bl, byte ptr [edi]
:004218A5 47 inc edi
:004218A6 38D8 cmp al, bl
:004218A8 74F2 je 0042189C
:004218AA 50 push eax
:004218AB 53 push ebx
:004218AC E89A010000 call 00421A4B==〉这里好像是注册码比较！
:004218B1 8BD8 mov ebx, eax
:004218B3 83C404 add esp, 00000004
:004218B6 E890010000 call 00421A4B
:004218BB 83C404 add esp, 00000004
:004218BE 38C3 cmp bl, al
:004218C0 74DA je 0042189C
:004218C2 1BC0 sbb eax, eax ======这里改成MOV EAX,0
:004218C4 83D8FF sbb eax, FFFFFFFF
:004218C7 5B pop ebx
:004218C8 5E pop esi
:004218C9 5F pop edi
:004218CA C9 leave
:004218CB C3 ret
经过跟踪发现只要这个CALL的EAX返回值EAX=0即可！成为注册版
收工！改的不对的地方请个位指点！
另外问一下各位高手：
KERNEL32.GetEnvironmentVariableA, Ord:0109h==》这个函数是干啥用的！
大老：2001-6-29 10:54


B-Jigsaw6.02

标 题:各位新年快乐,小弟在这里奉上B-Jigsaw6.02的破解给大家拜年! (21千字)
发信人:bnbnf
时 间:2001-1-24 22:08:17
详细信息:
软件名称：B-Jigsaw
整理日期：2001.1.21
最新版本：6.02
文件大小：1394KB
软件授权：共享软件
使用平台：Win95/98/NT
发布公司：Home Page
软件下载：http://www.newhua.com/BJigsaw.htm
软件简介：
    一流的拼图游戏，支持用BMP、JPG格式的图片创建拼图，并能生成锯齿状拼图。

    我为何要破解这个软件，说来话长，唉！都是怪自己不好，在前些日子将MM气哭了，总得要想点办法来哄哄她笑呀,希望她不要再生我的气了
由于这个软件没有注册的时候，拼好的图像有几个大字写着“你还没有注册”，看来看去总觉得不顺眼，有的瑕疵东西又怎么能给自己心爱的MM呢
于是就有想破解这个软件的念头了，但我的汇编语言基础这么差,只能怪自己读书时没有好好学好这门了,呜呼~~~~~~~~~~~
没有办法还是试试吧！日后要多来论坛里逛逛了，大虾们可要多多指导我这只小菜鸟呀！
我很菜，可能下面会有很多错漏的地方，希望各位指正
    在没有注册这个软件的时候,它首先会跳出一个要求你注册的画面和告诉你这个软件还有多少天的试用时间等
我猜想这个软件，应该是在一开始运行的时候，就比较WINDOWS注册表里某个地方，查这个软件是否注册，如果没有注册的话，就会跳出那个
窗口，否则XXXXXXXXXX，但自己没有注册表分析软件呀,于是按了一下那个注册按钮，看到有USER NAME和REGISTRATION CODEG两个输入地方，看来
这个软件是围绕注册名来计算注册码的，在那两个输入的地方乱输入几个数字，按OK钮后跳出INVALID　USER　NAME　ORREGISTRATION　CODE，
马上想起用暴力破解的方法，记下INVALID　USER　NAME　ORREGISTRATION　CODE，用反汇编工具W32dsm89载入后按STRING　DATA　REFERENCES找INVALID　USER　NAME　ORREGISTRATION　CODE
，这是怎么搞的，没有这些字符呀，难道给X了，这下可难倒我了，我还打算把它反汇编出来后找那跳出的INVALID　USER　NAME　ORREGISTRATION　CODE来看看它附近哪个地方能改呢.
看来今次HIEW要“下岗”了。还是用SOFTICE4.5吧
1）在注册窗口中的USER NAME输入:　LINUX
              REGISTRATION CODE输入:12345678
2）按CTRL-D呼叫出SOFTICE,然后下中断指令HMEMCPY回车后,按F5返回注册程式,按下注册窗中的"OK"按钮.
3）下BD*指令
4）一直按F12，到了第13下跳出INVALID　USER　NAME　ORREGISTRATION　CODE注册失败窗口，计算注册码的地方应在上面
5)重复上面1－3步，按12下F12来到这里
* Possible StringData Ref from Data Obj ->"@驞"
|
:0040F300 A170024A00 mov eax, dword ptr [004A0270]
:0040F305 E8CE2A0000 call 00411DD8
:0040F30A 8BF8 mov edi, eax
:0040F30C A1A0644A00 mov eax, dword ptr [004A64A0]
:0040F311 8938 mov dword ptr [eax], edi
:0040F313 8BC7 mov eax, edi
:0040F315 8B10 mov edx, dword ptr [eax]
:0040F317 FF92CC000000 call dword ptr [edx+000000CC]
:0040F31D 48 dec eax
:0040F31E 0F85A6020000 jne 0040F5CA
:0040F324 66C746101400 mov [esi+10], 0014
:0040F32A 33C9 xor ecx, ecx
:0040F32C 894DFC mov dword ptr [ebp-04], ecx
:0040F32F 8D55FC lea edx, dword ptr [ebp-04]
:0040F332 FF461C inc [esi+1C]
:0040F335 A1A0644A00 mov eax, dword ptr [004A64A0]
:0040F33A 8B08 mov ecx, dword ptr [eax]
:0040F33C 8B81D4020000 mov eax, dword ptr [ecx+000002D4]
:0040F342 E8F9940300 call 00448840
:0040F347 66C746100800 mov [esi+10], 0008 －－－－－－－－－－－－＞按12下F12后就停在这里
:0040F34D 66C746102000 mov [esi+10], 0020
:0040F353 33D2 xor edx, edx
:0040F355 8955F8 mov dword ptr [ebp-08], edx
:0040F358 8D55F8 lea edx, dword ptr [ebp-08]
:0040F35B FF461C inc [esi+1C]
:0040F35E A1A0644A00 mov eax, dword ptr [004A64A0]
:0040F363 8B08 mov ecx, dword ptr [eax]
:0040F365 8B81D8020000 mov eax, dword ptr [ecx+000002D8]
:0040F36B E8D0940300 call 00448840
:0040F370 66C746100800 mov [esi+10], 0008
:0040F376 8BC3 mov eax, ebx
:0040F378 E8C30B0000 call 0040FF40
:0040F37D 66C746102C00 mov [esi+10], 002C
:0040F383 33D2 xor edx, edx
:0040F385 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0040F388 8955F4 mov dword ptr [ebp-0C], edx
:0040F38B 8BC3 mov eax, ebx
:0040F38D FF461C inc [esi+1C]
:0040F390 8B55FC mov edx, dword ptr [ebp-04]
:0040F393 E814060000 call 0040F9AC
:0040F398 8D55F4 lea edx, dword ptr [ebp-0C]
:0040F39B 8D45F8 lea eax, dword ptr [ebp-08]
:0040F39E E889750700 call 0048692C＜--------------------------------进入这个CALL看看
:0040F3A3 50 push eax
:0040F3A4 FF4E1C dec [esi+1C]
:0040F3A7 8D45F4 lea eax, dword ptr [ebp-0C]
:0040F3AA BA02000000 mov edx, 00000002
:0040F3AF E8A8740700 call 0048685C
:0040F3B4 59 pop ecx
:0040F3B5 84C9 test cl, cl
:0040F3B7 0F846D010000 je 0040F52A
:0040F3BD B201 mov dl, 01
:0040F3BF A13C3D4200 mov eax, dword ptr [00423D3C]
:0040F3C4 E8B34A0100 call 00423E7C
:0040F3C9 66C746100800 mov [esi+10], 0008
:0040F3CF 8BF8 mov edi, eax
:0040F3D1 BA02000080 mov edx, 80000002
:0040F3D6 8BC7 mov eax, edi
:0040F3D8 E8EF720700 call 004866CC
:0040F3DD 66C746103800 mov [esi+10], 0038
:0040F3E3 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Data Obj ->"Software\ADCSoft\BJigsaw"
|
:0040F3E6 8B15ECE74900 mov edx, dword ptr [0049E7EC]
:0040F3EC E867730700 call 00486758
:0040F3F1 FF461C inc [esi+1C]
:0040F3F4 8B10 mov edx, dword ptr [eax]
:0040F3F6 B101 mov cl, 01
:0040F3F8 8BC7 mov eax, edi
:0040F3FA E8794B0100 call 00423F78
:0040F3FF 50 push eax
:0040F400 FF4E1C dec [esi+1C]
:0040F403 8D45F0 lea eax, dword ptr [ebp-10]
:0040F406 BA02000000 mov edx, 00000002
:0040F40B E84C740700 call 0048685C
:0040F410 59 pop ecx
:0040F411 84C9 test cl, cl
:0040F413 0F84DE000000 je 0040F4F7
:0040F419 66C746105000 mov [esi+10], 0050
:0040F41F 8D45E8 lea eax, dword ptr [ebp-18]

* Possible StringData Ref from Data Obj ->"Vjcpm aqw hqt tgikuvgtkpi."
|
:0040F422 8B15E8E74900 mov edx, dword ptr [0049E7E8]
:0040F428 E82B730700 call 00486758
:0040F42D FF461C inc [esi+1C]
:0040F430 8D4DEC lea ecx, dword ptr [ebp-14]
:0040F433 8B10 mov edx, dword ptr [eax]
:0040F435 33C0 xor eax, eax
:0040F437 8945EC mov dword ptr [ebp-14], eax
:0040F43A 8BC3 mov eax, ebx
:0040F43C FF461C inc [esi+1C]
:0040F43F E8540B0000 call 0040FF98
:0040F444 FF4E1C dec [esi+1C]
:0040F447 8D45E8 lea eax, dword ptr [ebp-18]
:0040F44A BA02000000 mov edx, 00000002
:0040F44F E808740700 call 0048685C
:0040F454 66C746104400 mov [esi+10], 0044
:0040F45A 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"B-Jigsaw"
|
:0040F45C B96AE94900 mov ecx, 0049E96A
:0040F461 837DEC00 cmp dword ptr [ebp-14], 00000000
:0040F465 7405 je 0040F46C
:0040F467 8B55EC mov edx, dword ptr [ebp-14]
:0040F46A EB05 jmp 0040F471

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F465(C)
|
:0040F46C BA73E94900 mov edx, 0049E973

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F46A(U)
|
:0040F471 A1B8644A00 mov eax, dword ptr [004A64B8]
:0040F476 8B00 mov eax, dword ptr [eax]
:0040F478 E837720700 call 004866B4
:0040F47D 66C746105C00 mov [esi+10], 005C

* Possible StringData Ref from Data Obj ->"UserName"
|
:0040F483 BA74E94900 mov edx, 0049E974
:0040F488 8D45E4 lea eax, dword ptr [ebp-1C]
:0040F48B E8C8720700 call 00486758
:0040F490 FF461C inc [esi+1C]
:0040F493 8B10 mov edx, dword ptr [eax]
:0040F495 8B4DFC mov ecx, dword ptr [ebp-04]
:0040F498 8BC7 mov eax, edi
:0040F49A E8754C0100 call 00424114
:0040F49F FF4E1C dec [esi+1C]
:0040F4A2 8D45E4 lea eax, dword ptr [ebp-1C]
:0040F4A5 BA02000000 mov edx, 00000002
:0040F4AA E8AD730700 call 0048685C
:0040F4AF 66C746106800 mov [esi+10], 0068

* Possible StringData Ref from Data Obj ->"RegCode"
|
:0040F4B5 BA7DE94900 mov edx, 0049E97D
:0040F4BA 8D45E0 lea eax, dword ptr [ebp-20]
:0040F4BD E896720700 call 00486758
:0040F4C2 FF461C inc [esi+1C]
:0040F4C5 8B10 mov edx, dword ptr [eax]
:0040F4C7 8B4DF8 mov ecx, dword ptr [ebp-08]
:0040F4CA 8BC7 mov eax, edi
:0040F4CC E8434C0100 call 00424114
:0040F4D1 FF4E1C dec [esi+1C]
:0040F4D4 8D45E0 lea eax, dword ptr [ebp-20]
:0040F4D7 BA02000000 mov edx, 00000002
:0040F4DC E87B730700 call 0048685C
:0040F4E1 FF4E1C dec [esi+1C]
:0040F4E4 8D45EC lea eax, dword ptr [ebp-14]
:0040F4E7 BA02000000 mov edx, 00000002
:0040F4EC E86B730700 call 0048685C
:0040F4F1 66C746100800 mov [esi+10], 0008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F413(C)
|
:0040F4F7 897DD8 mov dword ptr [ebp-28], edi
:0040F4FA 837DD800 cmp dword ptr [ebp-28], 00000000
:0040F4FE 7421 je 0040F521
:0040F500 8B4DD8 mov ecx, dword ptr [ebp-28]
:0040F503 8B01 mov eax, dword ptr [ecx]
:0040F505 8945DC mov dword ptr [ebp-24], eax
:0040F508 66C746108000 mov [esi+10], 0080
:0040F50E BA03000000 mov edx, 00000003
:0040F513 8B45D8 mov eax, dword ptr [ebp-28]
:0040F516 8B08 mov ecx, dword ptr [eax]
:0040F518 FF51FC call [ecx-04]
:0040F51B 66C746107400 mov [esi+10], 0074

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F4FE(C)
|
:0040F521 8BC3 mov eax, ebx
:0040F523 E8E4B80200 call 0043AE0C
:0040F528 EB7A jmp 0040F5A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F3B7(C)
|
:0040F52A 66C746109800 mov [esi+10], 0098
:0040F530 8D45D0 lea eax, dword ptr [ebp-30]

* Possible StringData Ref from Data Obj ->"Kpxcnkf wugt pcog qt tgikuvtcvkqp "
->"eqfg."
|
:0040F533 8B15E4E74900 mov edx, dword ptr [0049E7E4]
:0040F539 E81A720700 call 00486758
:0040F53E FF461C inc [esi+1C]
:0040F541 8D4DD4 lea ecx, dword ptr [ebp-2C]
:0040F544 8B10 mov edx, dword ptr [eax]
:0040F546 33C0 xor eax, eax
:0040F548 8945D4 mov dword ptr [ebp-2C], eax
:0040F54B 8BC3 mov eax, ebx
:0040F54D FF461C inc [esi+1C]
:0040F550 E8430A0000 call 0040FF98
:0040F555 FF4E1C dec [esi+1C]
:0040F558 8D45D0 lea eax, dword ptr [ebp-30]
:0040F55B BA02000000 mov edx, 00000002
:0040F560 E8F7720700 call 0048685C
:0040F565 66C746108C00 mov [esi+10], 008C
:0040F56B 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"B-Jigsaw"
|
:0040F56D B985E94900 mov ecx, 0049E985
:0040F572 837DD400 cmp dword ptr [ebp-2C], 00000000
:0040F576 7405 je 0040F57D
:0040F578 8B55D4 mov edx, dword ptr [ebp-2C]
:0040F57B EB05 jmp 0040F582

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F576(C)
|
:0040F57D BA8EE94900 mov edx, 0049E98E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F57B(U)
|
:0040F582 A1B8644A00 mov eax, dword ptr [004A64B8]
:0040F587 8B00 mov eax, dword ptr [eax]
:0040F589 E826710700 call 004866B4＜-------------------------------------------------------如果您走过这个CALL的话就玩完了
:0040F58E FF4E1C dec [esi+1C]
:0040F591 8D45D4 lea eax, dword ptr [ebp-2C]
:0040F594 BA02000000 mov edx, 00000002
:0040F599 E8BE720700 call 0048685C
:0040F59E 66C746100800 mov [esi+10], 0008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F528(U)
|
:0040F5A4 FF4E1C dec [esi+1C]
:0040F5A7 8D45F8 lea eax, dword ptr [ebp-08]
:0040F5AA BA02000000 mov edx, 00000002
:0040F5AF E8A8720700 call 0048685C
:0040F5B4 FF4E1C dec [esi+1C]
:0040F5B7 8D45FC lea eax, dword ptr [ebp-04]
:0040F5BA BA02000000 mov edx, 00000002
:0040F5BF E898720700 call 0048685C
:0040F5C4 66C746100000 mov [esi+10], 0000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F31E(C)
|
* Reference To: bjigsaw._FormRegistration
|
:0040F5CA 8B0DA0644A00 mov ecx, dword ptr [004A64A0]
:0040F5D0 8B19 mov ebx, dword ptr [ecx]
:0040F5D2 895DC8 mov dword ptr [ebp-38], ebx
:0040F5D5 85DB test ebx, ebx
:0040F5D7 741E je 0040F5F7
:0040F5D9 8B03 mov eax, dword ptr [ebx]
:0040F5DB 8945CC mov dword ptr [ebp-34], eax
:0040F5DE 66C74610B000 mov [esi+10], 00B0
:0040F5E4 BA03000000 mov edx, 00000003
:0040F5E9 8B45C8 mov eax, dword ptr [ebp-38]
:0040F5EC 8B08 mov ecx, dword ptr [eax]
:0040F5EE FF51FC call [ecx-04]
:0040F5F1 66C74610A400 mov [esi+10], 00A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F5D7(C)
|
:0040F5F7 8B16 mov edx, dword ptr [esi]
:0040F5F9 64891500000000 mov dword ptr fs:[00000000], edx
:0040F600 5F pop edi
:0040F601 5E pop esi
:0040F602 5B pop ebx
:0040F603 8BE5 mov esp, ebp
:0040F605 5D pop ebp
:0040F606 C3 ret

* Referenced by a CALL at Addresses:
|:00406EF7 , :004074D0 , :0040F39E , :0040F887
|
:0048692C 55 push ebp-----------------------------------------＞从上面的CALL来到这里
:0048692D 8BEC mov ebp, esp
:0048692F 53 push ebx
:00486930 8B00 mov eax, dword ptr [eax]
:00486932 8B12 mov edx, dword ptr [edx]
:00486934 E83B23FFFF call 00478C74＜------------------------------------------注册CODE就在这里面进入吧
:00486939 0F94C0 sete al
:0048693C 83E001 and eax, 00000001
:0048693F 5B pop ebx
:00486940 5D pop ebp
:00486941 C3 ret

* Referenced by a CALL at Addresses:
|:00419FFF , :0041A5E9 , :0041A759 , :0041A8CD , :004220C6
|:00424685 , :004246A3 , :00425241 , :0042645D , :00426521
|:004268FC , :004269BB , :00426E16 , :0042706A , :004275D5
|:00427793 , :0042E31D , :0042E3B5 , :0042F4C8 , :0043EAF7
|:00447932 , :004479BD , :00448623 , :00448898 , :00457CD3
|:0045810A , :0045A5C3 , :0045AFA0 , :00465D73 , :0046AA4B
|:0046B9F9 , :00486934
|
:00478C74 53 push ebx-------------------------------从这里出来
:00478C75 56 push esi
:00478C76 57 push edi
:00478C77 89C6 mov esi, eax----------哈哈~看到这里的指令真兴奋啊!
:00478C79 89D7 mov edi, edx----------寄存器传来传去的，
:00478C7B 39D0 cmp eax, edx**********************在比较什么呀!看看自己的真正CODE吧
:00478C7D 0F848F000000 je 00478D12
:00478C83 85F6 test esi, esi
:00478C85 7468 je 00478CEF
:00478C87 85FF test edi, edi
:00478C89 746B je 00478CF6
:00478C8B 8B46FC mov eax, dword ptr [esi-04]
:00478C8E 8B57FC mov edx, dword ptr [edi-04]
:00478C91 29D0 sub eax, edx
:00478C93 7702 ja 00478C97
:00478C95 01C2 add edx, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478C93(C)
|
:00478C97 52 push edx
:00478C98 C1EA02 shr edx, 02
:00478C9B 7426 je 00478CC3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478CB9(C)
|
:00478C9D 8B0E mov ecx, dword ptr [esi]
:00478C9F 8B1F mov ebx, dword ptr [edi]
:00478CA1 39D9 cmp ecx, ebx
:00478CA3 7558 jne 00478CFD
:00478CA5 4A dec edx
:00478CA6 7415 je 00478CBD
:00478CA8 8B4E04 mov ecx, dword ptr [esi+04]
:00478CAB 8B5F04 mov ebx, dword ptr [edi+04]
:00478CAE 39D9 cmp ecx, ebx
:00478CB0 754B jne 00478CFD
:00478CB2 83C608 add esi, 00000008
:00478CB5 83C708 add edi, 00000008
:00478CB8 4A dec edx
:00478CB9 75E2 jne 00478C9D
:00478CBB EB06 jmp 00478CC3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478CA6(C)
|
:00478CBD 83C604 add esi, 00000004
:00478CC0 83C704 add edi, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478C9B(C), :00478CBB(U)
|
:00478CC3 5A pop edx
:00478CC4 83E203 and edx, 00000003
:00478CC7 7422 je 00478CEB
:00478CC9 8B0E mov ecx, dword ptr [esi]
:00478CCB 8B1F mov ebx, dword ptr [edi]
:00478CCD 38D9 cmp cl, bl
:00478CCF 7541 jne 00478D12
:00478CD1 4A dec edx
:00478CD2 7417 je 00478CEB
:00478CD4 38FD cmp ch, bh
:00478CD6 753A jne 00478D12
:00478CD8 4A dec edx
:00478CD9 7410 je 00478CEB
:00478CDB 81E30000FF00 and ebx, 00FF0000
:00478CE1 81E10000FF00 and ecx, 00FF0000
:00478CE7 39D9 cmp ecx, ebx
:00478CE9 7527 jne 00478D12

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478CC7(C), :00478CD2(C), :00478CD9(C)
|
:00478CEB 01C0 add eax, eax
:00478CED EB23 jmp 00478D12

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478C85(C)
|
:00478CEF 8B57FC mov edx, dword ptr [edi-04]
:00478CF2 29D0 sub eax, edx
:00478CF4 EB1C jmp 00478D12

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478C89(C)
|
:00478CF6 8B46FC mov eax, dword ptr [esi-04]
:00478CF9 29D0 sub eax, edx
:00478CFB EB15 jmp 00478D12

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478CA3(C), :00478CB0(C)
|
:00478CFD 5A pop edx
:00478CFE 38D9 cmp cl, bl
:00478D00 7510 jne 00478D12
:00478D02 38FD cmp ch, bh
:00478D04 750C jne 00478D12
:00478D06 C1E910 shr ecx, 10
:00478D09 C1EB10 shr ebx, 10
:00478D0C 38D9 cmp cl, bl
:00478D0E 7502 jne 00478D12
:00478D10 38FD cmp ch, bh

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478C7D(C), :00478CCF(C), :00478CD6(C), :00478CE9(C), :00478CED(U)
|:00478CF4(U), :00478CFB(U), :00478D00(C), :00478D04(C), :00478D0E(C)
|
:00478D12 5F pop edi
:00478D13 5E pop esi
:00478D14 5B pop ebx
:00478D15 C3 ret

清除中断后，回到注册窗口打入刚才看到的REGISTRATION CODE　希望看到的THANK　YOU　FOR　REGISTERING出来了，
刚学破解的朋友有兴趣的话下载一个练习练习吧！发现无论你用怎么样的注册名，它的CODE都是以BJ开始的，我没去研究了（悄悄的告诉您，其实是自己的功力不够啊！）西西.
但有一个真的很不明白，无论我怎么样去修改日期，这个软件都没有出现过期的窗口，来来去去都是5－8天左右，有兴趣的大虾下载研究研究呀，指点一下我们这个等级的菜鸟
也好呀!不罗唆了，我还要赶着拼好“功课”给MM老师呀！到期交不到作业给MM后果不堪设想啊。
    最后祝：各位财源滚滚来，有情人终成眷属　：)
            看雪兄的论坛人气急升1000000000000000000000000000点


CCProxy v3.94

 标 题:5.1活动刚到家，打开电脑就破了“代理服务器 CCProxy v3.94”，内容如下 (4千字)
发信人:conanxu[BCG]
时 间:2001-5-4 17:10:5
详细信息:
代理服务器 CCProxy v3.94破解过程
用TRW载入程序
下断点bpx 403137

:00403101 8D4C2410 lea ecx, dword ptr [esp+10]
:00403105 E8A22A0200 call 00425BAC
:0040310A 8D8C24C4100000 lea ecx, dword ptr [esp+000010C4]
:00403111 8D9424C4040000 lea edx, dword ptr [esp+000004C4]
:00403118 51 push ecx
:00403119 8D8424C80C0000 lea eax, dword ptr [esp+00000CC8]
:00403120 52 push edx
:00403121 50 push eax
:00403122 E889F3FFFF call 004024B0
:00403127 8D8C24D0080000 lea ecx, dword ptr [esp+000008D0]
:0040312E 6A0C push 0000000C
:00403130 8D9424D4100000 lea edx, dword ptr [esp+000010D4]
:00403137 51 push ecx -->d edx 可以看到序列号
:00403138 52 push edx
:00403139 E8E2040100 call 00413620
:0040313E 8B0D84C94300 mov ecx, dword ptr [0043C984]
:00403144 83C418 add esp, 00000018
:00403147 A350C24300 mov dword ptr [0043C250], eax
:0040314C 894C2414 mov dword ptr [esp+14], ecx
:00403150 85C0 test eax, eax
:00403152 C68424CC14000005 mov byte ptr [esp+000014CC], 05
:0040315A 7415 je 00403171

* Possible Reference to String Resource ID=00128: "代理服务器 CCProxy v3.94 (5用户演示版)"
|
:0040315C 6880000000 push 00000080
:00403161 8D4C2418 lea ecx, dword ptr [esp+18]
:00403165 E80C270200 call 00425876
:0040316A 8B542414 mov edx, dword ptr [esp+14]
:0040316E 52 push edx
:0040316F EB10 jmp 00403181

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040315A(C)
|

* Possible Reference to String Resource ID=00127: "代理服务器 CCProxy v3.94"
|
:00403171 6A7F push 0000007F
:00403173 8D4C2418 lea ecx, dword ptr [esp+18]
:00403177 E8FA260200 call 00425876
:0040317C 8B442414 mov eax, dword ptr [esp+14]
:00403180 50 push eax

--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------

在"关于"中注册输入刚才得到的序列号并下断点bpx 4047cf

* Possible StringData Ref from Data Obj ->"system"
|
:004047BC 6848C14300 push 0043C148
:004047C1 FFD3 call ebx
:004047C3 8BB620020000 mov esi, dword ptr [esi+00000220]
:004047C9 6A0C push 0000000C
:004047CB 8D442414 lea eax, dword ptr [esp+14]
:004047CF 56 push esi -->e eax 可以看到注册号
:004047D0 50 push eax
:004047D1 E84AEE0000 call 00413620
:004047D6 83C40C add esp, 0000000C
:004047D9 85C0 test eax, eax
:004047DB 5F pop edi
:004047DC 5E pop esi
:004047DD 5B pop ebx

* Possible Reference to Dialog: DialogID_0088, CONTROL_ID:00FF, ""
|
:004047DE 6AFF push FFFFFFFF
:004047E0 6A40 push 00000040
:004047E2 750B jne 004047EF

* Possible Reference to String Resource ID=00125: "注册成功"
|
:004047E4 6A7D push 0000007D
:004047E6 E898520200 call 00429A83
:004047EB 33C0 xor eax, eax
:004047ED EB0C jmp 004047FB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004047E2(C)
|

* Possible Reference to String Resource ID=00126: "注册失败"
|
:004047EF 6A7E push 0000007E
:004047F1 E88D520200 call 00429A83
:004047F6 B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004047ED(U)
|
:004047FB 8B0D84C94300 mov ecx, dword ptr [0043C984]
:00404801 A350C24300 mov dword ptr [0043C250], eax
:00404806 894C2400 mov dword ptr [esp], ecx
:0040480A 85C0 test eax, eax
:0040480C C784240C04000000000000 mov dword ptr [esp+0000040C], 00000000
:00404817 7407 je 00404820

好注册成功了
如果要暴破把
:0040315A 7415 je 00403171 -->jmp 00403171
:004047E2 750B jne 004047EF -->nop
nop

conanxu[BCG]
conanxu@eastday.com


Cool Tray 2001 (2.0.0)

 标 题:PeterChen and [FCG]member,我交作业了：《Cool Tray 2001 (2.0.0) 爆破札记》 (5千字)
发信人:paulyoung
时 间:2001-7-21 20:47:20
详细信息:
Cool Tray 2001 (2.0.0) 爆破札记

    特别感谢TAE![CCG]对我的大力帮助，使我顺利完成此次破解！

作　　者：PaulYoung[FCG,BCG]
时　　间：2001年7月21日
软件简介：1、从1901年至2060年共计160年的中国农历历法，精确、方便，同时弥补了 Windows 时钟没有农历和星期显示；2、直观精确的键盘按键次数统计，操作异常方便；3、记录鼠标在屏幕上移动的距离，可以选择八种距离单位，击键次数严格区分左键、右键、单击、双击；4、在 Windows 任务栏状态区中提示物理内存、CPU 使用率图形显示，防止系统崩溃；5、即时、整点汉语语音报时，包含公历、农历日期及时间，小巧实用的闹钟，可以方便提醒您时间；6、Windows 任务栏状态区中动画显示 CD-ROM 中是否有光碟，可以通过右键菜单或双击图标开关 CD-ROM；软件对 CPU 的使用率低于百分之一，并且操作使用绝对直观方便！
下　　载：http://mengliao.126.com
功能限制：未注册版在切换功能时，有提示窗口，而且时间非常的长，令人厌烦。
破解工具：FILEINFO V2.43A,CASPR 1.100,W32DASM V8.93,HIEW V6.45,TRW2000 V1.03
_________________________________________________________________________________________________

一、用FILEINFO侦察，发现其用ASPROTECT 1.1加壳，用CASPR脱壳。该软件防SOFT-ICE，反汇编找到出错语句，往上看……

:004B236E E879FBFFFF call 004B1EEC　//NOP掉此call
:004B2373 84C0 test al, al
:004B2375 7457 je 004B23CE
.
.
.
* Possible StringData Ref from Data Obj ->"信息：

SoftICE 正在运行！

请退出 "
->"Debug 模式后，再运行本软件。"

    二、脱壳后的程序运行出错，估计它有自校验。用TRW 2000　LOAD此软件，F10直到……

:004B2402 E875BDF9FF call 0044E17C //此处出错，F8跟入……再F10单步跟踪……直到
:0044E1AD FF572C call [edi+2C] //此处出错，F8跟入……再F10单步跟踪……直到
:004472BC E87BC0FBFF call 0040333C //此处出错，F8跟入……再F10单步跟踪……直到

:004A95A1 8B45FC mov eax, dword ptr [ebp-04]
:004A95A4 3B45F8 cmp eax, dword ptr [ebp-08]
:004A95A7 740C je 004A95B5 //改为750C

* Possible StringData Ref from Data Obj ->"002FAE36" //出错信息
|
:004A95A9 6858964A00 push 004A9658
:004A95AE 6A00 push 00000000
:004A95B0 E837D1F5FF call 004066EC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A95A7(C)
|
:004A95B5 33C0 xor eax, eax

自校验问题解决。

三、在软件“关于”处，有“未注册版本，请您注册！”的信息，在“串式参考”处找到这条信息，来到……

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004B1A68(C), :004B1A6D(C), :004B1A78(C), :004B1A7D(C) //此4处调用，进入……
|

* Possible StringData Ref from Data Obj ->"未注册版本，请您注册！"
|
:004B1ACF B83C1C4B00 mov eax, 004B1C3C
:004B1AD4 894728 mov dword ptr [edi+28], eax

来到……

:004B1A62 8B55E4 mov edx, dword ptr [ebp-1C]
:004B1A65 3B55D4 cmp edx, dword ptr [ebp-2C]
:004B1A68 7565 jne 004B1ACF //改为7465
:004B1A6A 3B45D0 cmp eax, dword ptr [ebp-30]
:004B1A6D 7560 jne 004B1ACF //改为7460
:004B1A6F 8B45D8 mov eax, dword ptr [ebp-28]
:004B1A72 8B55DC mov edx, dword ptr [ebp-24]
:004B1A75 3B55CC cmp edx, dword ptr [ebp-34]
:004B1A78 7555 jne 004B1ACF //改为7455
:004B1A7A 3B45C8 cmp eax, dword ptr [ebp-38]
:004B1A7D 7550 jne 004B1ACF //改为7450
:004B1A7F 8D55E8 lea edx, dword ptr [ebp-18]

现在在“关于”处已经显示为注册版本了，注册信息放在注册表中的……

REGEDIT4

[HKEY_CURRENT_USER\Software\Mengliao\Cool Tray\Ver 2001 (2.0.0)\Registration]
"RegName"="用户名"
"RegCompany"="公司"
"RegSerial"="注册码"

你爱怎么填就怎么填吧。

四、但现在的程序在切换功能时，还有提示窗口。
此时在 TRW2000 下BPX HMEMCPY ，再切换功能，立即中断，按F12直到出现提示窗口，注册提示窗口消失时，再次中断于……

:004A98F2 C3 ret

往上看……

:004A9893 8B542404 mov edx, dword ptr [esp+04]
:004A9897 3B542414 cmp edx, dword ptr [esp+14]
:004A989B 751A jne 004A98B7 //改为741A
:004A989D 3B442410 cmp eax, dword ptr [esp+10]
:004A98A1 7514 jne 004A98B7 //改为7414
:004A98A3 8B442408 mov eax, dword ptr [esp+08]
:004A98A7 8B54240C mov edx, dword ptr [esp+0C]
:004A98AB 3B54241C cmp edx, dword ptr [esp+1C]
:004A98AF 7504 jne 004A98B5
:004A98B1 3B442418 cmp eax, dword ptr [esp+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A98AF(C)
|
:004A98B5 7434 je 004A98EB //改为7534

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004A989B(C), :004A98A1(C)
|
:004A98B7 80BB2508000000 cmp byte ptr [ebx+00000825], 00
:004A98BE 752B jne 004A98EB
:004A98C0 8B0D98204D00 mov ecx, dword ptr [004D2098]
:004A98C6 8B09 mov ecx, dword ptr [ecx]
:004A98C8 B201 mov dl, 01

_________________________________________________________________________________________________

    终于彻底搞定了！PeterChen，最近实在太忙了，这篇文章水平虽然不高，但也算是对Free Cracking Group 的一点小小心意吧。


DISKdata v3.2.0

 标 题:DISKdata v3.2.0之暴力破解 (6千字)
发信人:cqzrd
时 间:2000-10-1 8:40:55
详细信息:
DISKdata v3.2.0暴力破解

对不起大家了，先前发的那个贴子太疏忽了，没有验证便发了上去，我今天试了一下
结果不能用，%$&*$%%#·，结果贻笑大方，结果我的脸象个XX。

下面我把正确的破解方法写出来。
工具：TRW2K，UltraEdit
步骤：
1。用TRW2K载入DISKdata，按F10，一直到出现NAG窗。
2。退出程序，被TRW拦截，看一下此时的eip，在其上的Call上设断。
:0049101F E838D6FBFF call 0044E65C **在此设断**
:00491024 A1643A4900 mov eax, dword ptr [00493A64] **TRW将在此处中断**
:00491029 8B00 mov eax, dword ptr [eax]
:0049102B E8ACD6FBFF call 0044E6DC
:00491030 E8B32AF7FF call 00403AE8
3。再次载入程序，中断后F8进入，再一直按F10，直到NAG窗出现。
4。当NAG窗退出时，TRW中断，按F4看看用户屏幕有什么变化，没有。此时TRW屏幕显示如下：
:0048AB6C 8B0DF8394900 mov ecx, dword ptr [004939F8]
:0048AB72 A1643A4900 mov eax, dword ptr [00493A64]
:0048AB77 8B00 mov eax, dword ptr [eax]
:0048AB79 8B15644C4800 mov edx, dword ptr [00484C64]
:0048AB7F E8D83AFCFF call 0044E65C
:0048AB84 A1F8394900 mov eax, dword ptr [004939F8] **在此设断**
:0048AB89 8B00 mov eax, dword ptr [eax]
:0048AB8B 8B10 mov edx, dword ptr [eax]
:0048AB8D FF92D8000000 call dword ptr [edx+000000D8] **出现NAG窗**
:0048AB93 A1F8394900 mov eax, dword ptr [004939F8] **TRW将在此中断**
:0048AB98 8B00 mov eax, dword ptr [eax]
:0048AB9A E8B983F7FF call 00402F58

可以看出48ab8d是调用NAG窗的模块，有兴趣的同志可以进去看看，里面便是判断是否注册的地方。
5。把断点设于48AB84，重新LOAD，中断后，R eip 48ab93，按F5试试（CRACK就是要不断的试）。
6。结果程序正确执行。试试功能，没问题。把48AB84到48AB8D的代码NOP掉，再把时间调后一年看看，
依然没问题。Cracked success?
7。执行菜单命令，%^&*...，我倒，NAG窗又出来了，只好继续拦截。
8。执行万能拦窗断点，bpx destroywindow，F5，拦住。
9。pmodule后，再不断的F12，直到：
0167:0048F875 648920 MOV [FS:EAX],ESP
0167:0048F878 803D4049490000 CMP BYTE [00494940],00
0167:0048F87F 7533 JNZ 0048F8B4 (NO JUMP)**在此设断 R EIP 48F8B4**
0167:0048F881 8B0DF8394900 MOV ECX,[004939F8]
0167:0048F887 A1643A4900 MOV EAX,[00493A64]
0167:0048F88C 8B00 MOV EAX,[EAX]
0167:0048F88E 8B15644C4800 MOV EDX,[00484C64]
0167:0048F894 E8C3EDFBFF CALL 0044E65C
0167:0048F899 A1F8394900 MOV EAX,[004939F8] **在此设断 R EIP 48F8A8**
0167:0048F89E 8B00 MOV EAX,[EAX]
0167:0048F8A0 8B10 MOV EDX,[EAX]
0167:0048F8A2 FF92D8000000 CALL NEAR [EDX+D8] **出现NAG窗**
0167:0048F8A8 A1F8394900 MOV EAX,[004939F8] **TRW将在此中断**
0167:0048F8AD 8B00 MOV EAX,[EAX]
0167:0048F8AF E8A436F7FF CALL 00402F58
0167:0048F8B4 A1C8484900 MOV EAX,[004948C8]
0167:0048F8B9 8B804C010000 MOV EAX,[EAX+014C]
0167:0048F8BF 8945DC MOV [EBP-24],EAX
0167:0048F8C2 33C0 XOR EAX,EAX
0167:0048F8C4 8945E0 MOV [EBP-20],EAX
0167:0048F8C7 8D85DCFEFFFF LEA EAX,[EBP+FFFFFEDC]
0167:0048F8CD 8945E4 MOV [EBP-1C],EAX
0167:0048F8D0 B898FA4800 MOV EAX,0048FA98
0167:0048F8D5 8945E8 MOV [EBP-18],EAX
0167:0048F8D8 C745EC01000000 MOV DWORD [EBP-14],01
0167:0048F8DF 33C0 XOR EAX,EAX
0167:0048F8E1 8945F0 MOV [EBP-10],EAX
0167:0048F8E4 8D45DC LEA EAX,[EBP-24]
0167:0048F8E7 50 PUSH EAX
0167:0048F8E8 E8C300FCFF CALL `SHELL32!SHBrowseForFolderA`
0167:0048F8ED 85C0 TEST EAX,EAX
0167:0048F8EF 0F847F010000 JZ NEAR 0048FA74
0167:0048F8F5 8D95DCFEFFFF LEA EDX,[EBP+FFFFFEDC]
0167:0048F8FB 52 PUSH EDX
0167:0048F8FC 50 PUSH EAX
0167:0048F8FD E8B600FCFF CALL `SHELL32!SHGetPathFromIDListA`
0167:0048F902 8D45FC LEA EAX,[EBP-04]
0167:0048F905 8D95DCFEFFFF LEA EDX,[EBP+FFFFFEDC]
0167:0048F90B B900010000 MOV ECX,0100
0167:0048F910 E83B45F7FF CALL 00403E50
0167:0048F915 8B45FC MOV EAX,[EBP-04]
0167:0048F918 E88345F7FF CALL 00403EA0
0167:0048F91D 85C0 TEST EAX,EAX
0167:0048F91F 0F8E4F010000 JNG NEAR 0048FA74
0167:0048F925 8B83FC030000 MOV EAX,[EBX+03FC]
0167:0048F92B 8BB054020000 MOV ESI,[EAX+0254]
0167:0048F931 8BC6 MOV EAX,ESI
......
10。在48F87F处设断，强行跳过试试。成功了，没有NAG窗了。再在48F899处设一下R eip 48F8A8试试，
也跳过去了，再仔细看看48F899处的代码，与48AB84处比一下，一模一样。
11。把该处代码改后，再执行菜单看，结果---我倒，还有NAG。想想第10步，明白了吧。哈哈，用UltraEdit查找一下
48F899到48F8A2处的代码，有多少处？这就是我推荐用UltraEdit的好处，替换吧。再执行看。这次
应该没问题了吧，再有问题我就$%%$%$#@....

结论：因为在48ab93中断时，用户屏幕没有变化，所以可以猜测程序在上一个CALL中，只是判断程序有
无注册，所以可以在其上试着跳过看看，我破解的其它程序则一般是需要不断CALL进去后找到一
个判断点来决定是否出现NAG窗。
改法：
查找 a1f8394900 8b00 8b10 ff92d8000000(共有7处)
替换为-> 9090909090 9090 9090 909090909090

注：本人名字有朋友提醒说发不出音来，遂决定改名为KanKer（砍客）。从这次的破解来看，我想我叫
砍客应该是没人有意见了吧？呵呵。

=============<完>=============
Cracked by cqzrd


Fashget(Jetcat) 0.96a china

 标 题:被狗搞的头大，找个小软件换换脑子，flashget96a去广告条 (5千字)
发信人:新疆
时 间:2001-7-10 12:17:13
详细信息:
flashget(Jetcat) 0.96a china 注册破解（暴破）
软件说明：很好的断点续传软件，功能不比netants差。甚至更好。可惜广告条
影响我们小猫有限的带宽。
软件很简单，没有加壳，注册方式很简单，适合初学者学习。
好吧，我这里输入“新疆[BCG]“ 注册码特殊点，输入”9999999999“
注册特殊的是，用户名和注册码要先输入完毕，重新启动软件，才能知道是否注册成功。（我想它一定是在注册表中留下脚印）
果然regmon报告
2997 13.86794960 Jetcar CloseKey HKCU\software\JetCar\JetCar SUCCESS
2998 13.86800160 Jetcar SetValueEx HKCU\software\JetCar\JetCar\General\RegName SUCCESS "新疆[BCG]"
2999 13.86801600 Jetcar CloseKey HKCU\software\JetCar\JetCar\General SUCCESS
3000 13.86806560 Jetcar OpenKey HKCU\software SUCCESS hKey: 0xC2A138B0
3001 13.86811760 Jetcar OpenKey HKCU\software\JetCar SUCCESS hKey: 0xC2A177D0
3002 13.86816240 Jetcar OpenKey HKCU\software\JetCar\JetCar SUCCESS hKey: 0xC2A18980
3003 13.86817600 Jetcar CloseKey HKCU\software SUCCESS
3004 13.86818960 Jetcar CloseKey HKCU\software\JetCar SUCCESS
3005 13.86823760 Jetcar OpenKey HKCU\software\JetCar\JetCar\General SUCCESS hKey: 0xC2A177D0
3006 13.86825120 Jetcar CloseKey HKCU\software\JetCar\JetCar SUCCESS
3007 13.86827840 Jetcar SetValueEx HKCU\software\JetCar\JetCar\General\RegPass SUCCESS "9999999999"
3008 13.86829280 Jetcar CloseKey HKCU\software\JetCar\JetCar\General SUCCESS
3009 13.86975600 Jetcar QueryValueEx 0xC18278E0\C:\WINDOWS\media\chord.wav NOTFOUND
到这我们不用管它，知道就行了

用W32DASM反编译查看"regpass"
发现调用在00486801 0041690A两处。前一处是用来给注册表写信息用的，后一处才是重注册表里调信息用的
好了用TRW2000载入：下bpx 0041690A
程序中断在0041690A
:0041696A 681C424D00 push 004D421C
:0041696F 8D4C2410 lea ecx, dword ptr [esp+10]

* Possible StringData Ref from Data Obj ->"General"
|
:00416973 688C334D00 push 004D338C
:00416978 51 push ecx
:00416979 8BCE mov ecx, esi
:0041697B C744243400000000 mov [esp+34], 00000000
:00416983 E8D2750800 call 0049DF5A
:00416988 8B54240C mov edx, dword ptr [esp+0C]
:0041698C BB01000000 mov ebx, 00000001
:00416991 885C2424 mov byte ptr [esp+24], bl
:00416995 8B42F8 mov eax, dword ptr [edx-08]
:00416998 85C0 test eax, eax
:0041699A 0F84CF000000 je 00416A6F
:004169A0 8B442408 mov eax, dword ptr [esp+08]
:004169A4 8B48F8 mov ecx, dword ptr [eax-08]
:004169A7 85C9 test ecx, ecx
:004169A9 0F84C0000000 je 00416A6F
:004169AF 57 push edi
:004169B0 53 push ebx
:004169B1 6A43 push 00000043
:004169B3 8D4C2420 lea ecx, dword ptr [esp+20]
:004169B7 E8CDD10600 call 00483B89
:004169BC 8D4C241C lea ecx, dword ptr [esp+1C]
:004169C0 53 push ebx
:004169C1 51 push ecx
:004169C2 8D4C2414 lea ecx, dword ptr [esp+14]
:004169C6 C644243002 mov [esp+30], 02
:004169CB E878D60600 call 00484048
:004169D0 8B542418 mov edx, dword ptr [esp+18]
:004169D4 8B00 mov eax, dword ptr [eax]
:004169D6 52 push edx
:004169D7 50 push eax
:004169D8 E8ABE60500 call 00475088
:004169DD 83C408 add esp, 00000008
:004169E0 8D4C241C lea ecx, dword ptr [esp+1C]
:004169E4 85C0 test eax, eax
:004169E6 0F94C0 sete al
:004169E9 25FF000000 and eax, 000000FF
:004169EE 8BF8 mov edi, eax
:004169F0 E81E1D0700 call 00488713
:004169F5 8D4C2418 lea ecx, dword ptr [esp+18]
:004169F9 885C2428 mov byte ptr [esp+28], bl
:004169FD E8111D0700 call 00488713
:00416A02 8B4C2410 mov ecx, dword ptr [esp+10]
:00416A06 57 push edi
:00416A07 8D542418 lea edx, dword ptr [esp+18]
:00416A0B 51 push ecx
:00416A0C 52 push edx
:00416A0D 8BCE mov ecx, esi
:00416A0F E89C000000 call 00416AB0
:00416A14 8B44240C mov eax, dword ptr [esp+0C]
:00416A18 8B4C2414 mov ecx, dword ptr [esp+14]
:00416A1C 50 push eax
:00416A1D 51 push ecx
======================================================================================
:00416A1E E865E60500 call 00475088--------------这个CALL判断注册正确与否
:00416A23 83C408 add esp, 00000008 正确EAX=0否则为FFFFFFFF
:00416A26 885C2428 mov byte ptr [esp+28], bl
:00416A2A 85C0 test eax, eax
:00416A2C 5F pop edi
:00416A2D 8D4C2410 lea ecx, dword ptr [esp+10]
:00416A31 7537--->90 90 jne 00416A6A---------------这里千万不能跳，要不广告条就出来了
=====================================================================================
:00416A33 E8DB1C0700 call 00488713
:00416A38 8D4C2408 lea ecx, dword ptr [esp+08]
:00416A3C C644242400 mov [esp+24], 00
:00416A41 E8CD1C0700 call 00488713
:00416A46 8D4C240C lea ecx, dword ptr [esp+0C]
:00416A4A C7442424FFFFFFFF mov [esp+24], FFFFFFFF
:00416A52 E8BC1C0700 call 00488713
:00416A57 8BC3 mov eax, ebx
:00416A59 5E pop esi
:00416A5A 5B pop ebx
:00416A5B 8B4C2414 mov ecx, dword ptr [esp+14]
:00416A5F 64890D00000000 mov dword ptr fs:[00000000], ecx
:00416A66 83C420 add esp, 00000020
:00416A69 C3 ret

好了用winhex 找上面的HEX 改75 37 为90 90就收工了

新疆[BCG]
2001.07.10


FISH精美屏保

标 题:FISH精美屏保暴力破解---WD32ASM893版 (6千字)
发信人:孙锋
时 间:2001-2-5 21:45:06
详细信息:
FISH精美屏保暴力破解---WD32ASM893版
作者：孙锋
Email：sffs@263.net
主页：http://sffs.6to23.com

先用WD32ASM8.93超级中文版进行反汇编，然后查找，会看到：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D097(C)
|
:0040D0AD 6A03 push 00000003
:0040D0AF E82C67FFFF call 004037E0
:0040D0B4 83C404 add esp, 00000004
:0040D0B7 8945F8 mov dword ptr [ebp-08], eax
:0040D0BA 837DF800 cmp dword ptr [ebp-08], 00000000
:0040D0BE 7414 je 0040D0D4 //----->修改74-75即jne->je
:0040D0C0 C70500FE410003000000 mov dword ptr [0041FE00], 00000003
:0040D0CA 6A01 push 00000001
:0040D0CC E8A86EFFFF call 00403F79
:0040D0D1 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D0BE(C) //---------->修改处，往上找。
|
:0040D0D4 833D00FE410000 cmp dword ptr [0041FE00], 00000000
:0040D0DB 7458 je 0040D135 //---------------修改74->75即jne->je
:0040D0DD C605B1DD410001 mov byte ptr [0041DDB1], 01
:0040D0E4 C605B2DD410001 mov byte ptr [0041DDB2], 01
:0040D0EB 833D00FE410001 cmp dword ptr [0041FE00], 00000001
:0040D0F2 7514 jne 0040D108 //-------------------修改74->75即jne->je

* Possible StringData Ref from Data Obj ->"TEMP registration OK" //-----2条鱼！
|
:0040D0F4 6834E54100 push 0041E534
:0040D0F9 6892000000 push 00000092
:0040D0FE 8B4D08 mov ecx, dword ptr [ebp+08]
:0040D101 51 push ecx

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
|
:0040D102 FF1514A24100 Call dword ptr [0041A214]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D0F2(C) //-------------修改的地方，往上找
|
:0040D108 833D00FE410002 cmp dword ptr [0041FE00], 00000002
:0040D10F 7514 jne 0040D125

* Possible StringData Ref from Data Obj ->"BASIC registration OK" //-------3条鱼！
|
:0040D111 684CE54100 push 0041E54C
:0040D116 6892000000 push 00000092
:0040D11B 8B5508 mov edx, dword ptr [ebp+08]
:0040D11E 52 push edx

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
|
:0040D11F FF1514A24100 Call dword ptr [0041A214]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D10F(C)
|
:0040D125 833D00FE410003 cmp dword ptr [0041FE00], 00000003 //----->
:0040D12C 7D07 jge 0040D135 //------>　比较大于则跳，所以改为小于7D->7E
:0040D12E 33C0 xor eax, eax
:0040D130 E91B010000 jmp 0040D250

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040D0DB(C), :0040D12C(C)
|
:0040D135 833D00FE410003 cmp dword ptr [0041FE00], 00000003
:0040D13C 7545 jne 0040D183 //--------修改75-74即jne->je

* Possible StringData Ref from Data Obj ->"DELUXE registration OK" //-----7条鱼！
|
:0040D13E 6864E54100 push 0041E564
:0040D143 6892000000 push 00000092
:0040D148 8B4508 mov eax, dword ptr [ebp+08]
:0040D14B 50 push eax

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
|
:0040D14C FF1514A24100 Call dword ptr [0041A214]
:0040D152 C605B1DD410001 mov byte ptr [0041DDB1], 01 //----
:0040D159 C605B2DD410001 mov byte ptr [0041DDB2], 01 //----
:0040D160 C605B3DD410001 mov byte ptr [0041DDB3], 01 //----
:0040D167 C605B4DD410001 mov byte ptr [0041DDB4], 01 //----
:0040D16E C605B5DD410001 mov byte ptr [0041DDB5], 01 //----
:0040D175 C605B6DD410001 mov byte ptr [0041DDB6], 01 //----
:0040D17C 33C0 xor eax, eax
:0040D17E E9CD000000 jmp 0040D250

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D13C(C) //-------------------------根据上面的值变化，也要修改。
|
:0040D183 6878104200 push 00421078
:0040D188 6892000000 push 00000092
:0040D18D 8B4D08 mov ecx, dword ptr [ebp+08]
:0040D190 51 push ecx

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
|
:0040D191 FF1514A24100 Call dword ptr [0041A214]
:0040D197 33C0 xor eax, eax
:0040D199 E9B2000000 jmp 0040D250

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CFD1(C)

下面是参考dyiyd兄的提示写的：感谢dyiyd兄。

修改了上面的内容注册就是任意注册码了。而且是DELUXE，7条鱼！！！但是还有启动注册框NAG，下面来去掉他！

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404194(C)
|
:004041A0 833D00FE410000 cmp dword ptr [0041FE00], 00000000 //----0041FE00是否为0
:004041A7 740E je 004041B7 //-----等于0就跳，玩完了。 74->75即je->jne
:004041A9 C605B1DD410001 mov byte ptr [0041DDB1], 01
:004041B0 C605B2DD410001 mov byte ptr [0041DDB2], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004041A7(C)
|
:004041B7 6A03 push 00000003
:004041B9 E822F6FFFF call 004037E0
:004041BE 83C404 add esp, 00000004
:004041C1 85C0 test eax, eax
:004041C3 7434 je 004041F9 //------>eax=0就跳，玩完了。74->75即je->jne
:004041C5 C70500FE410003000000 mov dword ptr [0041FE00], 00000003 //-----使0041FE00=3
:004041CF C605B1DD410001 mov byte ptr [0041DDB1], 01
:004041D6 C605B2DD410001 mov byte ptr [0041DDB2], 01
:004041DD C605B3DD410001 mov byte ptr [0041DDB3], 01
:004041E4 C605B4DD410001 mov byte ptr [0041DDB4], 01
:004041EB C605B5DD410001 mov byte ptr [0041DDB5], 01
:004041F2 C605B6DD410001 mov byte ptr [0041DDB6], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404186(C), :004041C3(C)
|
:004041F9 833D00FE410000 cmp dword ptr [0041FE00], 00000000
:00404200 7410 je 00404212
:00404202 837DFC00 cmp dword ptr [ebp-04], 00000000
:00404206 740A je 00404212
:00404208 6A01 push 00000001
:0040420A E86AFDFFFF call 00403F79

所以只要使0041FE00=3就可以了，所以我们可以这么修改。
<------------完--------->

标 题:再论FISH精美屏保（VER:0.99G)暴力破解---WD32ASM893版,请高手们给提点意见！！！ (2千字)
发信人:1212
详细信息:

再论FISH精美屏保（VER:0.99G)暴力破解---WD32ASM893版,请孙锋给提点意见！！！
作者： 李海涛
Email：lihaitao@xaonline.com

先用WD32ASM8.93超级中文版进行反汇编，然后查找，会看到：

* Possible StringData Ref from Data Obj ->"SOFTWARE\Sachs\SachsAquarium"
|
:004042F2 68D4024200 push 004202D4
:004042F7 8D4DA0 lea ecx, dword ptr [ebp-60]
:004042FA 51 push ecx
:004042FB E800DB0000 call 00411E00
:00404300 83C408 add esp, 00000008
:00404303 C7057020420000000000 mov dword ptr [00422070], 00000000
改：C7057020420003000000 mov dword ptr [00422070], 00000003
:0040430D 8D5590 lea edx, dword ptr [ebp-70]
:00404310 52 push edx
:00404311 683F000F00 push 000F003F
:00404316 6A00 push 00000000
:00404318 8D45A0 lea eax, dword ptr [ebp-60]
:0040431B 50 push eax
:0040431C 6802000080 push 80000002
:
:
:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404485(C)
|
:00404491 833D7020420000 cmp dword ptr [00422070], 00000000
:00404498 740E je 004044A8
:0040449A C605C9FD410001 mov byte ptr [0041FDC9], 01（第二条）
:004044A1 C605CAFD410001 mov byte ptr [0041FDCA], 01（第三条）

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404498(C)
|
:004044A8 6A03 push 00000003
:004044AA E861F3FFFF call 00403810
:004044AF 83C404 add esp, 00000004
:004044B2 85C0 test eax, eax
:004044B4 7434 je 004044EA （不nop掉只有三条鱼）
改：90 nop
90 nop
:004044B6 C7057020420003000000 mov dword ptr [00422070], 00000003
:004044C0 C605C9FD410001 mov byte ptr [0041FDC9], 01 （第二条）
:004044C7 C605CAFD410001 mov byte ptr [0041FDCA], 01 （第三条）
:004044CE C605CBFD410001 mov byte ptr [0041FDCB], 01 （第四条）
:004044D5 C605CCFD410001 mov byte ptr [0041FDCC], 01 （第五条）
:004044DC C605CDFD410001 mov byte ptr [0041FDCD], 01 （第六条）
:004044E3 C605CEFD410001 mov byte ptr [0041FDCE], 01 （第七条）至于第一条吗？你想想吧！！！

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404477(C), :004044B4(C)
|
:004044EA 833D7020420003 cmp dword ptr [00422070], 00000003
:004044F1 0F8511010000 jne 00404608
:004044F7 8D459C lea eax, dword ptr [ebp-64]
:004044FA 50 push eax
:004044FB 6880324200 push 00423280
:00404500 8D4D88 lea ecx, dword ptr [ebp-78]
:00404503 51 push ecx
:00404504 6A00 push 00000000

标 题:查找Sachs Marine Aquarium 0.99G Beta 注册码要点 (2千字)
发信人:lijing
时 间:2001-2-6 18:13:40
详细信息:

Sachs Marine Aquarium 0.99G Beta 破解要点

1、输入任意注册码，但要求格式为6个大字字母+6位数字，我输入的是：AAAAAA123456
打bpx hmemcpy下断点，中断后，小心地跟踪，一直来到：
* Possible StringData Ref from Data Obj ->"TESTFISH"
|
:0040DABF 6834064200 push 00420634
:0040DAC4 684C1E4200 push 00421E4C

* Reference To: KERNEL32.lstrcmpiA, Ord:02FFh
|
:0040DAC9 FF1598B04100 Call dword ptr [0041B098] ; 比较临时注册码'TESTFISH'
:0040DACF 85C0 test eax, eax
:0040DAD1 750A jne 0040DADD
:0040DAD3 C7057020420001000000 mov dword ptr [00422070], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DAD1(C)
|
:0040DADD 6A02 push 00000002
:0040DADF E82C5DFFFF call 00403810 ; 进入后，可找到BASIC注册码
:0040DAE4 83C404 add esp, 00000004
:0040DAE7 85C0 test eax, eax
:0040DAE9 7414 je 0040DAFF
:0040DAEB C7057020420002000000 mov dword ptr [00422070], 00000002
:0040DAF5 6A01 push 00000001
:0040DAF7 E8B964FFFF call 00403FB5
:0040DAFC 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DAE9(C)
|
:0040DAFF 6A03 push 00000003
:0040DB01 E80A5DFFFF call 00403810 ; 进入后，可找到DELUXE注册码
:0040DB06 83C404 add esp, 00000004
:0040DB09 8945F8 mov dword ptr [ebp-08], eax
:0040DB0C 837DF800 cmp dword ptr [ebp-08], 00000000
:0040DB10 7414 je 0040DB26
:0040DB12 C7057020420003000000 mov dword ptr [00422070], 00000003
:0040DB1C 6A01 push 00000001
:0040DB1E E89264FFFF call 00403FB5
:0040DB23 83C404 add esp, 00000004

2、进入 call 00403810 ，来到下边时，可找到真正注册码：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040398E(C)
|
:004039A1 8D45E8 lea eax, dword ptr [ebp-18]
:004039A4 50 push eax ; d eax，可看到真注册码
:004039A5 684C1E4200 push 00421E4C ; d 00421E4C，可看到假注册码

* Reference To: KERNEL32.lstrcmpiA, Ord:02FFh
|
:004039AA FF1598B04100 Call dword ptr [0041B098] ; 注册码比较
:004039B0 85C0 test eax, eax
:004039B2 7507 jne 004039BB
:004039B4 B801000000 mov eax, 00000001
:004039B9 EB02 jmp 004039BD

3、如果只需要注册码的话，可以直接下断点bpx 004039A4，然后打d eax，即可得到正确的注册码。第1次中断得到BASIC REGISTRATION CODE，第2次中断得到DELUXE REGISTRATION CODE。


Freeceltool

标 题:freeceltool 空当接龙工具破解手记 (1千字)
发信人:孙锋
时 间:2001-1-31 10:32:17
详细信息:
freeceltool 空当接龙工具破解手记
作者：孙锋
Email：sffs@263.net
主页：http://sffs.6to23.com

下载地址是：http://www.win2000.com.cn/down/fceltool.exe

用W32DASM8.93（中文版）将它反汇编，在串试数据参考里找到注册失败的对话，到达它的位置，看看它是从那里来得，代码如下：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409AB8(C)
|
:00409B29 6A00 push 00000000
:00409B2B 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册码错误,注册失败!"
|
:00409B2D 6808CD4F00 push 004FCD08
:00409B32 E85A6E0800 call 00490991
到00409AB8看看
:00409AB8 756F jne 00409B29
用16进制工具把75改74。
再次查找到“未注册版”这个字符串。代码如下：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403950(C)
|

* Possible StringData Ref from Data Obj ->"未注册版"
|
:004039B7 6880B44F00 push 004FB480
:004039BC 8B8D74FFFFFF mov ecx, dword ptr [ebp+FFFFFF74]
:004039C2 81C104010000 add ecx, 00000104
:004039C8 E8D0BD0600 call 0046F79D
好了，到00403950处，代码如下：
:00403950 7465 je 004039B7
将74改为75。
再查找“在未注册版本中，批量求解的局数不能超过3局”。找到位置如下：
* Possible StringData Ref form Data obj ->"(中间是找到的字符串,三行)"

:004051E3 6864C0F00 PUSH OO4FC064
:...
:...

* Referenced by a (U)nconditional or (C)onditional Jump at Addreeses:
|:004051D9(C),:004051DD(C)

就找这两个地址：
:0051C9 7539 jne 00405204
改 75 为 74
:004051DD 7E25 jle 00405304
改 7E 为 74
完成注册破解过程。

成为任意注册版。
<------完------->


GetSmar

标 题:GetSmart破解手记 (1011字)
发信人:孙锋
时 间:2001-2-2 11:01:29
详细信息:
GetSmart破解手记
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
http://phy.qfnu.edu.cn/personal/~sffs/index.htm

这是一个支持断点续传的软件，据网友说比jetcar要好。
如使用hview可以使用下面的方法：

在F4下Decode方式中用F5查找：00448f3e然后F3修改7310 为7710。
同样查找：0044856b然后修改0F841C0A0000为0F851C0A0000。
(如果只破解此处，程序会告诉你这个程序是Cracked!的。并且在使用的时候
使用一分多钟就停止，必须再手动启动正下载的程序。）所以还需要破解下面的地方，就成为完美破解版了。

查找0044857a然后修改0F850B0A0000为0F840B0A0000.

其他编辑软件可以使用下面的方法：

查找：00448f3e:7310-------->00448f3e:7710
查找：0044856b:0F841C0A0000------>0044856B:0F851C0A0000
查找：0044857a:0F850B0A0000------->0044857a:0F840B0A0000
即可成为任意注册版。
注册信息为Registered=01和Serial="你输入的几（正确的为20）位数字的hex值"

完成注册后就不会有使用限制了。

用时：2分钟破解，3分钟复查

<--------完-------->

标 题:再来一贴：wd32asm反编译getsmart破解 (945字)
发信人:孙锋
时 间:2001-2-2 11:02:43
详细信息:

在用wd32asm反编译getsmart后，查找字符串“Your serial number is invalid"
然后向上找，看到下面的代码：
*Refernced by a (U)nconditional or (C)onditional Jump at Address:
|:0044857a(C)--------------------->这是第一个要查找修改的地方
|
:00448f8b EB44 jmp 00448FD1
*Refernced by a (U)nconditional or (C)onditional Jump at Address:
|:0044856B(c)--------------------->这是第二个要查找修改的地方
|
:00448F8D C605325F480000 mov byte ptr [00485f32],00
|

继续往上看就可以看到GetSmart is noe registered!!"
继续往上：
*Refernced by a (U)nconditional or (C)onditional Jump at Address:
|:00448F3E(C)--------------------->这是第三个要查找修改的地方
|
:00448F50 8B8534F9FFFF mov eax dword ptr [epx+fffff934]
分别把光标移动到这几个突出的位置上，然后就可以在wd32asm的底层看到要用hiew查找的
位置了。具体的修改方法参见我刚才帖出的文章。当然还有直接破解的其他方法但是可能会
导致程序无法执行，这样的修改是最好的，至少我是这么认为的，请不要见怪。


GetSmart

标 题:GetSmart暴力破解手记-----有谁愿意写追注册码和注册机！下载http://sffs.6to23.com (6千字)
发信人:孙锋
时 间:2001-2-7 1:31:22
详细信息:
GetSmart暴力破解
作者：孙锋
Email:sffs@263.net
主页：http://sffs.6to23.com
据说这个软件比Jetcar还好，可是我没觉出来，呵呵，不管了，破解了再说。
修改点3ECB8和4857A。 下面我们来看看喽：

首先破解的是使用天数的限制，我们先使软件过期，然后查找出错提示语句：
* Possible Reference to String Resource ID=00012: "FireWall refused to connect."
|
:0043ECA2 6A0C push 0000000C

* Reference To: GDI32.CreateFontA, Ord:0036h
|
:0043ECA4 FF1578904700 Call dword ptr [00479078]
:0043ECAA A3301F4900 mov dword ptr [00491F30], eax
:0043ECAF 33C0 xor eax, eax
:0043ECB1 A0325F4800 mov al, byte ptr [00485F32]
:0043ECB6 85C0 test eax, eax
:0043ECB8 751D jne 0043ECD7 //------------就是这里了，改751D->741D，即jne->je
:0043ECBA 8B0DF46F4800 mov ecx, dword ptr [00486FF4]
:0043ECC0 51 push ecx

* Possible StringData Ref from Data Obj ->"Unregistered - day %ld of evaluation." //未注册版本
| //天数限制提示
:0043ECC1 68F41E4800 push 00481EF4
:0043ECC6 8D9500FCFFFF lea edx, dword ptr [ebp+FFFFFC00]
:0043ECCC 52 push edx
:0043ECCD E80DFF0200 call 0046EBDF
:0043ECD2 83C40C add esp, 0000000C
:0043ECD5 EB14 jmp 0043ECEB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043ECB8(C) //-------------->这就是我们修改成注册版本的地方，往上找吧。
|

* Possible StringData Ref from Data Obj ->"Registered version." //注册版本
|
:0043ECD7 681C1F4800 push 00481F1C
:0043ECDC 8D8500FCFFFF lea eax, dword ptr [ebp+FFFFFC00]
:0043ECE2 50 push eax
:0043ECE3 E8F7FE0200 call 0046EBDF
:0043ECE8 83C408 add esp, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043ECD5(U)
|
:0043ECEB 8D8D00FCFFFF lea ecx, dword ptr [ebp+FFFFFC00]
:0043ECF1 51 push ecx
:0043ECF2 6827040000 push 00000427
:0043ECF7 8B5508 mov edx, dword ptr [ebp+08]
:0043ECFA 52 push edx

然后咱们再来破解注册失败的地方，修改为注册成功，查找出错提示语句，会看到：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00448F1C(U)
|
:00448F2D 8B8530F9FFFF mov eax, dword ptr [ebp+FFFFF930]
:00448F33 25FF000000 and eax, 000000FF
:00448F38 3B8580F9FFFF cmp eax, dword ptr [ebp+FFFFF980]
:00448F3E 7310 jnb 00448F50
:00448F40 8B8D34F9FFFF mov ecx, dword ptr [ebp+FFFFF934]
:00448F46 8B11 mov edx, dword ptr [ecx]
:00448F48 899534F9FFFF mov dword ptr [ebp+FFFFF934], edx
:00448F4E EBCE jmp 00448F1E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00448F3E(C)
|
:00448F50 8B8534F9FFFF mov eax, dword ptr [ebp+FFFFF934]
:00448F56 8A4804 mov cl, byte ptr [eax+04]
:00448F59 880DDF6C4800 mov byte ptr [00486CDF], cl
:00448F5F E8DAD4FDFF call 0042643E
:00448F64 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"GetSmart is now registered!!" //注册成功
|
:00448F66 68F42B4800 push 00482BF4

* Possible StringData Ref from Data Obj ->"Thanks you for supporting GetSmart." //注册成功
|
:00448F6B 68142C4800 push 00482C14

* Possible Reference to String Resource ID=00192: "Thanks you for supporting GetSmart." //注册成功
|
:00448F70 68C0000000 push 000000C0
:00448F75 E8C5810100 call 0046113F
:00448F7A 83C408 add esp, 00000008
:00448F7D 50 push eax
:00448F7E E815850100 call 00461498
:00448F83 83C40C add esp, 0000000C
:00448F86 E8F3810100 call 0046117E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044857A(C) //---------------修改这里了，呵呵。
|
:00448F8B EB44 jmp 00448FD1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044856B(C)
|
:00448F8D C605325F480000 mov byte ptr [00485F32], 00

* Possible Reference to String Resource ID=00024: "Can't start download!"
|
:00448F94 6A18 push 00000018
:00448F96 6A00 push 00000000
:00448F98 68C86C4800 push 00486CC8
:00448F9D E87E5F0200 call 0046EF20
:00448FA2 83C40C add esp, 0000000C
:00448FA5 E894D4FDFF call 0042643E
:00448FAA 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Wrong serial number!" //错误提示
|
:00448FAC 68382C4800 push 00482C38

* Possible StringData Ref from Data Obj ->"Your serial number is invalid" //错误提示
|
:00448FB1 68502C4800 push 00482C50

* Possible Reference to String Resource ID=00193: "Your serial number is invalid" //错误提示
|
:00448FB6 68C1000000 push 000000C1
:00448FBB E87F810100 call 0046113F
:00448FC0 83C408 add esp, 00000008
:00448FC3 50 push eax
:00448FC4 E8CF840100 call 00461498
:00448FC9 83C40C add esp, 0000000C
:00448FCC E8AD810100 call 0046117E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00448F8B(U)
|
:00448FD1 833D286D480000 cmp dword ptr [00486D28], 00000000
:00448FD8 740F je 00448FE9

我们晚上找找看看0044857A地方；

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044854D(C)
|
:0044855F 8B8D70F9FFFF mov ecx, dword ptr [ebp+FFFFF970]
:00448565 0FBE5104 movsx edx, byte ptr [ecx+04]
:00448569 85D2 test edx, edx
:0044856B 0F841C0A0000 je 00448F8D
:00448571 33C0 xor eax, eax
:00448573 A0325F4800 mov al, byte ptr [00485F32]
:00448578 85C0 test eax, eax
:0044857A 0F850B0A0000 jne 00448F8B //--------->修改85->84,即jne->je
:00448580 C605325F480001 mov byte ptr [00485F32], 01

* Reference To: KERNEL32.GetTickCount, Ord:016Dh
|
:00448587 FF15A0914700 Call dword ptr [004791A0]
:0044858D 33D2 xor edx, edx

好了，完成了破解，在修改后一定要注意先随便输入注册码，成为“正版”哟，呵呵。


Ip tools v1.10

标 题:Ip tools v1.10破解法 (4千字)
发信人:sun_t
时 间:2001-2-26 12:13:05
详细信息:
ip tools v1.10 crack..............
by SUN_T
2001.2.26 please keep!
tools: trw2000 and w89dasm

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

:004B3202 E83166F5FF call 00409838
:004B3207 FF75EC push [ebp-14]

* Possible StringData Ref from Code Obj ->"] Self test .."
|
:004B320A 6844354B00 push 004B3544
:004B320F 8D45F0 lea eax, dword ptr [ebp-10]
:004B3212 BA03000000 mov edx, 00000003
:004B3217 E8740DF5FF call 00403F90
:004B321C 8B55F0 mov edx, dword ptr [ebp-10]
:004B321F 8B03 mov eax, dword ptr [ebx]
:004B3221 8B80DC010000 mov eax, dword ptr [eax+000001DC]
:004B3227 8B8030010000 mov eax, dword ptr [eax+00000130]
:004B322D 8B08 mov ecx, dword ptr [eax]
:004B322F FF5134 call [ecx+34]
:004B3232 E87563FDFF call 004895AC
:004B3237 8B1594984B00 mov edx, dword ptr [004B9894]
:004B323D 3B82B4000000 cmp eax, dword ptr [edx+000000B4]
:004B3243 740F je 004B3254-----------------------------------------------------jmp to ok!

* Possible StringData Ref from Code Obj ->"Program was corrupted !"
|
:004B3245 B85C354B00 mov eax, 004B355C
:004B324A E86104F9FF call 004436B0
:004B324F E97E020000 jmp 004B34D2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3243(C)
|
:004B3254 6824354B00 push 004B3524

:00497160 8B06 mov eax, dword ptr [esi]
:00497162 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:00497168 E813BEF8FF call 00422F80
:0049716D 837DF800 cmp dword ptr [ebp-08], 00000000
:00497171 0F84C9010000 je 00497340
:00497177 8D55F4 lea edx, dword ptr [ebp-0C]
:0049717A 8B06 mov eax, dword ptr [esi]
:0049717C 8B80F4010000 mov eax, dword ptr [eax+000001F4]
:00497182 E8F9BDF8FF call 00422F80
:00497187 837DF400 cmp dword ptr [ebp-0C], 00000000
:0049718B 0F84AF010000 je 00497340
:00497191 8D55F0 lea edx, dword ptr [ebp-10]
:00497194 8B06 mov eax, dword ptr [esi]
:00497196 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:0049719C E8DFBDF8FF call 00422F80
:004971A1 8B45F0 mov eax, dword ptr [ebp-10]
:004971A4 E8DF7CFFFF call 0048EE88
:004971A9 8BF8 mov edi, eax
:004971AB 8D55F0 lea edx, dword ptr [ebp-10]
:004971AE 8B06 mov eax, dword ptr [esi]
:004971B0 8B80F4010000 mov eax, dword ptr [eax+000001F4]
:004971B6 E8C5BDF8FF call 00422F80
:004971BB 8B45F0 mov eax, dword ptr [ebp-10]
:004971BE E8617DFFFF call 0048EF24
:004971C3 663BF8 cmp di, ax
:004971C6 0F8574010000 jne 00497340
:004971CC A1AC994B00 mov eax, dword ptr [004B99AC]
:004971D1 BAFF010000 mov edx, 000001FF
:004971D6 E8957CFFFF call 0048EE70---------------------------first calculating
:004971DB 8BF8 mov edi, eax
:004971DD A1E8984B00 mov eax, dword ptr [004B98E8]
:004971E2 BAFF010000 mov edx, 000001FF
:004971E7 E8847CFFFF call 0048EE70-------------------------second calculating
:004971EC 3BF8 cmp edi, eax
:004971EE 0F854C010000 jne 00497340--------------the most import jmp!!
:004971F4 8D55F8 lea edx, dword ptr [ebp-08]

note: using the same sub. to calculte !! silly!!
if return eax=0,so you can get what you want!!
Let's go to change it!>>>>>

* Referenced by a CALL at Addresses:
|:004971D6 , :004971E7 , :004B29F3 , :004B2A04
|
:0048EE70 53 push ebx
:0048EE71 33C9 xor ecx, ecx
:0048EE73 85D2 test edx, edx
:0048EE75 7C0B jl 0048EE82
:0048EE77 42 inc edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048EE80(C)
|
:0048EE78 33DB xor ebx, ebx
:0048EE7A 8A18 mov bl, byte ptr [eax]
:0048EE7C 03CB add ecx, ebx
:0048EE7E 40 inc eax
:0048EE7F 4A dec edx
:0048EE80 75F6 jne 0048EE78

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048EE75(C)
|
:0048EE82 8BC1 mov eax, ecx---------------------------xor eax,eax ok!
:0048EE84 5B pop ebx
:0048EE85 C3 ret

so,you have to change 0048ee82 and 004b3243h
bye!!


IPTOOLS 1.11

标 题:IPTOOLS (5千字)
发信人:bnbnf
时 间:2001-3-12 1:08:28
详细信息:
软件名称：IP Tools
整理日期：2001.3.10
最新版本：1.11
文件大小：944KB
软件授权：共享软件
使用平台：Win9x/Me/2000/NT
发布公司：home page
软件简介：
    集成了许多TCP/IP实用工具于一体，比如本地信息、连接信息、端口扫描、PING、TRACE、WHOIS、FINGER、NSLOOKUP、Telnet客户端、 NETBIOS信息、IP监视器等等。

下BPX中断后，大约按十次F12来到这里

:004972F1 8B45F8 mov eax, dword ptr [ebp-08]--------------注册名的地址
:004972F4 8D55FC lea edx, dword ptr [ebp-04]
:004972F7 E84804F7FF call 00407744
:004972FC 8B55FC mov edx, dword ptr [ebp-04]
:004972FF 8BC7 mov eax, edi
:00497301 E8AABCF8FF call 00422FB0
:00497306 8D55F8 lea edx, dword ptr [ebp-08]
:00497309 8B06 mov eax, dword ptr [esi]
:0049730B 8BB8F4010000 mov edi, dword ptr [eax+000001F4]
:00497311 8BC7 mov eax, edi
:00497313 E868BCF8FF call 00422F80
:00497318 8B45F8 mov eax, dword ptr [ebp-08]
:0049731B 8D55FC lea edx, dword ptr [ebp-04]
:0049731E E82104F7FF call 00407744
:00497323 8B55FC mov edx, dword ptr [ebp-04]
:00497326 8BC7 mov eax, edi
:00497328 E883BCF8FF call 00422FB0
:0049732D 8D55F8 lea edx, dword ptr [ebp-08]
:00497330 8B06 mov eax, dword ptr [esi]
:00497332 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:00497338 E843BCF8FF call 00422F80
:0049733D 837DF800 cmp dword ptr [ebp-08], 00000000----------比较
:00497341 0F84C9010000 je 00497510－－－－－－－－－－－－－－－如果你没有输入注册名的话，在这里玩完啦
:00497347 8D55F4 lea edx, dword ptr [ebp-0C]
:0049734A 8B06 mov eax, dword ptr [esi]
:0049734C 8B80F4010000 mov eax, dword ptr [eax+000001F4]
:00497352 E829BCF8FF call 00422F80
:00497357 837DF400 cmp dword ptr [ebp-0C], 00000000-------------这里也是比较你有否输入的地方，
:0049735B 0F84AF010000 je 00497510－－－－－－－－－－－－－－－－－但这里比较的是你有否输入注册码不同而己
:00497361 8D55F0 lea edx, dword ptr [ebp-10]
:00497364 8B06 mov eax, dword ptr [esi]
:00497366 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:0049736C E80FBCF8FF call 00422F80
:00497371 8B45F0 mov eax, dword ptr [ebp-10]
:00497374 E8DF7CFFFF call 0048F058
:00497379 8BF8 mov edi, eax
:0049737B 8D55F0 lea edx, dword ptr [ebp-10]
:0049737E 8B06 mov eax, dword ptr [esi]
:00497380 8B80F4010000 mov eax, dword ptr [eax+000001F4]
:00497386 E8F5BBF8FF call 00422F80
:0049738B 8B45F0 mov eax, dword ptr [ebp-10]
:0049738E E8617DFFFF call 0048F0F4－－－－－－－－－－－大家可不好小看这个CALL，它可利害的啊，后来才知道它在比较注册码位数。
                                                                    （其实到现在也有点怀疑是否真的要注册码的位数大于1，反正我输入两位，就不会在下面的00497396处跳跃，也就不会跳到注册错误窗口）
                                                                                请各位大哥跟下这个CALL，指导一下小菜呀！在这里先谢啦。

:00497393 663BF8 cmp di, ax
:00497396 0F8574010000 jne 00497510------------如果不相同的话就西西啦
:0049739C A1B0994B00 mov eax, dword ptr [004B99B0]
:004973A1 BAFF010000 mov edx, 000001FF
:004973A6 E8957CFFFF call 0048F040
:004973AB 8BF8 mov edi, eax
:004973AD A1E8984B00 mov eax, dword ptr [004B98E8]
:004973B2 BAFF010000 mov edx, 000001FF
:004973B7 E8847CFFFF call 0048F040-------------------想了解多点的话，在这里跟进入
:004973BC 3BF8 cmp edi, eax
:004973BE 0F854C010000 jne 00497510－－－－－－－－－－－在这下A指令将JNZ改为JZ后，一直走，走过0049740A的CALL后就注册成功了
:004973C4 8D55F8 lea edx, dword ptr [ebp-08]
:004973C7 8B06 mov eax, dword ptr [esi]
:004973C9 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:004973CF E8ACBBF8FF call 00422F80
:004973D4 8B55F8 mov edx, dword ptr [ebp-08]
:004973D7 A1949A4B00 mov eax, dword ptr [004B9A94]
:004973DC E8C7C8F6FF call 00403CA8
:004973E1 8D55F8 lea edx, dword ptr [ebp-08]
:004973E4 8B06 mov eax, dword ptr [esi]
:004973E6 8B80F4010000 mov eax, dword ptr [eax+000001F4]
:004973EC E88FBBF8FF call 00422F80
:004973F1 8B55F8 mov edx, dword ptr [ebp-08]
:004973F4 A11C994B00 mov eax, dword ptr [004B991C]
:004973F9 E8AAC8F6FF call 00403CA8
:004973FE 8BC3 mov eax, ebx
:00497400 E8E7F9FFFF call 00496DEC
* Possible StringData Ref from Code Obj ->
|
:00497405 B85C754900 mov eax, 0049755C
:0049740A E8A1C2FAFF call 004436B0-------------------来到这里就注册成功了
:0049740F B201 mov dl, 01
:00497411 A1F8444300 mov eax, dword ptr [004344F8]
:00497416 E839D2F9FF call 00434654
:0049741B 8BD8 mov ebx, eax
:0049741D B101 mov cl, 01

**************************************************************************************

|:00497341(C), :0049735B(C), :00497396(C), :004973BE(C)
|

* Possible StringData Ref from Code Obj

|
:00497510 B86C764900 mov eax, 0049766C
:00497515 E896C1FAFF call 004436B0----------------------注册错误窗口


lockdown2000 v7.0.0.6

标 题:如何破解lockdown2000 v7.0.0.6 (4千字)
发信人:wocy
时 间:2000-12-28 1:13:13
详细信息:
如何破解lockdown2000 v7.0.0.6
-----------------------------
雪椰
2000,12,25am
Email:wocy@263.net
Http://wocy.yeah.net(有本例中的补丁）

------------------------------
1，检查文件被压缩过了，因为懒得脱壳，所以决定内存补丁
2，以前有一点资料（看雪精华2）
标 题:Lockdown2000_7.0.0.1破解手记 (3千字)
发信人:十夜
时 间:2000-5-26 12:02:17
详细信息:
Lockdown2000_7.0.0.1破解手记
本人属懒派狂人，自下载Lockdown2000_7.0.0.1后一直等待破解的出现，但是始终不见其踪影。
本着你不烦我我不破你的原则平静的度过了十天，终于，讨厌的东西出现了，看来只有按原则
办事了，不想这东西加了壳，又臭又硬，还好在吴朝相的主页找到了脱壳后的汉化版本，省了
一道工序，可以开始工作了。

用W32Dasm反编译Lockdown2000.exe，找那个让我讨厌的东西(过期提示)，如下所示：
:004C313D E8321CFEFF call 004A4D74
:004C3142 84C0 test al, al
:004C3144 7546 jne 004C318C
:004C3146 E8B516FEFF call 004A4800
:004C314B 48 dec eax
:004C314C 7D27 jge 004C3175
:004C314E A14C9E4D00 mov eax, dword ptr [004D9E4C]
:004C3153 8B00 mov eax, dword ptr [eax]
:004C3155 E82AC5F8FF call 0044F684

* Possible StringData Ref from Code Obj ->"The trial period on this demo "
->"of LockDown 2000 has expired."
往上看看004C3144那一行能跳过过期提示，改为jmp 004C318C就不会过期了，但这也太那个……

注意一下call 004A4D74，看起来好像很有意思，到004A4D74去看看：
* Referenced by a CALL at Addresses:
|:004B5127 , :004B524E , :004B56FC , :004B5C0F , :004BD36D
|:004BE723 , :004C313D , :004C6AF4 , :004CBA42 , :004CCFAB
|:004CF4A3 , :004CF5FF
|
:004A4D74 55 push ebp
:004A4D75 8BEC mov ebp, esp
:004A4D77 B905000000 mov ecx, 00000005

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A4D81(C)
|
:004A4D7C 6A00 push 00000000
:004A4D7E 6A00 push 00000000
:004A4D80 49 dec ecx
:004A4D81 75F9 jne 004A4D7C
:004A4D83 53 push ebx
:004A4D84 56 push esi
:004A4D85 33C0 xor eax, eax
:004A4D87 55 push ebp
:004A4D88 68E0514A00 push 004A51E0
:004A4D8D 64FF30 push dword ptr fs:[eax] 《---------（1）
:004A4D90 648920 mov dword ptr fs:[eax], esp

* Possible StringData Ref from Code Obj ->"LD2KReg.ini"
|
:004A4D93 B9F8514A00 mov ecx, 004A51F8 〈-----------（2）
:004A4D98 B201 mov dl, 01
:004A4D9A A1C8A14700 mov eax, dword ptr [0047A1C8]
:004A4D9F E8CC54FDFF call 0047A270
:004A4DA4 8BD8 mov ebx, eax
:004A4DA6 6A00 push 00000000
:004A4DA8 8D45E0 lea eax, dword ptr [ebp-20]
:004A4DAB 50 push eax

* Possible StringData Ref from Code Obj ->"Register"
|
:004A4DAC B90C524A00 mov ecx, 004A520C

* Possible StringData Ref from Code Obj ->"Register"
|
:004A4DB1 BA0C524A00 mov edx, 004A520C
:004A4DB6 8BC3 mov eax, ebx
:004A4DB8 8B30 mov esi, dword ptr [eax]
:004A4DBA FF16 call dword ptr [esi]
:004A4DBC 8D45DC lea eax, dword ptr [ebp-24]
:004A4DBF E8B4F9FFFF call 004A4778
:004A4DC4 8B55DC mov edx, dword ptr [ebp-24]
:004A4DC7 8B45E0 mov eax, dword ptr [ebp-20]
:004A4DCA E8BDF2F5FF call 0040408C
:004A4DCF 7537 jne 004A4E08
…………………………………………………………
好像很受欢迎的样子，而且它还提到了LD2KReg.ini，再看看后面的代码，应该是判断注册的地方，程序很简单，将004A4DCF的jne 004A4E08改为je 004A4E08即可成为注册版。

3，估计7006版跟7001版差不多，关键是找到这个检验主函数
上面这段函数中（1）-（2）
这段函数估计不会变。代码是 64，89，20，b9
4,搜索15f:400000 l fffffff 64，89，20，b9

find date at 15f:xxxxxx
bpx 15f:xxxxxx
5,重启程式，中断后跟踪，发现这个主函数在15f:4a4a64
date:55,8b,ec,b9,05,00
改为:b8,01,00,00,00,c3(mov eax,1 ret)
6,rpp,这个世界清净了.
标 题:没什么用吧，上线时它会自动到server上校验的，然后就。。。呵呵 (空)
发信人:arbiter
时 间:2000-12-28 15:14:46
详细信息:

标 题:呵呵，我只是知道而已，我好懒的，我觉得这个软体很讨厌，他能自动去server校验，就有可能把你的个人信息偷... (178字)
发信人:arbiter
时 间:2000-12-28 19:56:12
详细信息:

标题: 呵呵，我只是知道而已，我好懒的，我觉得这个软体很讨厌，他能自动去server校验，就有可能把你的个人信息偷走，不过我想断它的socket api有可能发现那里跳出的nag窗。呵呵！

内容:
标 题:如何破解lockdown2000 v7.0.0.6(补) (4千字)
发信人:wocy
时 间:2001-1-3 23:02:14
详细信息:
如何破解lockdown2000 v7.0.0.6(补)
-----------------------------
雪椰
2001,01,03pm
Email:wocy@263.net
Http://wocy.yeah.net(有本例中的补丁）

------------------------------
这个补丁的不完全不解，在我主页上，感觉不好。刚好今天有空，搞定它。
1,
软件用aspack加壳，先脱壳

2，
前面的7006补丁会出现连上服务器验证。失败后提示信息->
"LockDown 2000 has detected that you are running an unauthorized copy..."
(也可根据楼上那位根据 http://www.lockdown2000.com/order_now.html)
you will go to ...
-------------------------------------
* Possible StringData Ref from Code Obj ->"LockDown 2000 has detected that "
->"you are running an unauthorized "
->"copy.

Licenses are purchased "
->"on a per computer basis.

If you "
->"believe you are seeing this message "
->"in error or would like to purchase "
->"a license for this computer, please "
->"visit:

http://www.lockdown2000.com/

or "
->"call:

(800)422-5130 or (603)740-4590"
|
:004D739C B85C754D00 mov eax, 004D755C
:004D73A1 E83EF6F7FF call 004569E4
:004D73A6 C6059481610001 mov byte ptr [00618194], 01
:004D73AD 8B45FC mov eax, dword ptr [ebp-04]
:004D73B0 E8D351F7FF call 0044C588

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D7356(C) -----------------》(c)
|
:004D73B5 E8F2C3F2FF call 004037AC
---------------------------------------------
Retrance (C) it to.....
:004D72C8 E883BDF2FF call 00403050
:004D72CD 84DB test bl, bl
:004D72CF 0F85EC000000 jne 004D73C1 ----------->point (1)
:004D72D5 803DA481610000 cmp byte ptr [006181A4], 00
:004D72DC 740D je 004D72EB
:004D72DE 803D08CB4D0000 cmp byte ptr [004DCB08], 00
:004D72E5 0F84D6000000 je 004D73C1 ----------->jmp exit point.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D72DC(C)
|
:004D72EB 803D08CB4D0000 cmp byte ptr [004DCB08], 00
:004D72F2 7510 jne 004D7304
:004D72F4 8B45FC mov eax, dword ptr [ebp-04]
:004D72F7 E8C4030000 call 004D76C0
:004D72FC 84C0 test al, al
:004D72FE 0F84BD000000 je 004D73C1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D72F2(C)
|
:004D7304 803D0CCB4D0000 cmp byte ptr [004DCB0C], 00
:004D730B 0F85B0000000 jne 004D73C1
:004D7311 C6050CCB4D0001 mov byte ptr [004DCB0C], 01
:004D7318 33C0 xor eax, eax
:004D731A 55 push ebp
:004D731B 683E734D00 push 004D733E
:004D7320 64FF30 push dword ptr fs:[eax]
:004D7323 648920 mov dword ptr fs:[eax], esp
:004D7326 8B45FC mov eax, dword ptr [ebp-04]
:004D7329 8B80D0050000 mov eax, dword ptr [eax+000005D0]
:004D732F E8B0C3FDFF call 004B36E4
:004D7334 33C0 xor eax, eax
:004D7336 5A pop edx
:004D7337 59 pop ecx
:004D7338 59 pop ecx
:004D7339 648910 mov dword ptr fs:[eax], edx
:004D733C EB7C jmp 004D73BA
:004D733E E9B9C1F2FF jmp 004034FC
:004D7343 8B45FC mov eax, dword ptr [ebp-04]
:004D7346 8B80D0050000 mov eax, dword ptr [eax+000005D0]
:004D734C 81B8A040000091010000 cmp dword ptr [eax+000040A0], 00000191
:004D7356 755D jne 004D73B5 ------->not equ ,jump (c)
----------------------------------------------------------------------------
3,Modify point (1) :jmp xxxxx(exit point)
0f 85 ec
e9 ed 00

4,还有下面几个点有校验
4d868c
4d8c2d
4d91ca
4d9769
同上
4d9cb3
4da1de
这两个不太一样
80 3d a4 81 61
e9 e7 00 00 00
5,all clear.


MightyFax

标 题:一个超容易破解的软件！ (5千字)
发信人:uhlan
时 间:2001-1-21 9:03:28
详细信息:
对于第一次学习破解的朋友，这是一个很好的学习软件。
对于高手来说，他们可以在2分钟内就把它给干掉了。^^

软件名：MightyFax

软件简介： 这是一个很简单的传真软件，没有华丽的外表，但是很实用。

你可以用打印文件的功能从你的 Word 等软件直接把文件传真出去。

另一方面你也可以接收外来的传真。

下载地址：
http://members.aol.com/rksrks2/mf32.exe （win9x version)
http://members.aol.com/rksfiles4/mfnt.exe (NT version)

我这里演示的是 win9x version

所用的工具：
1.softICE 4.05.可在下列网址download
http://mud.sz.jsinfo.net/per/aaron/files/debuggers/win/si405w9x.zip

2.HIEW 6.01
下载地址： http://go2.163.com/%7Etoye/tools/hiew640reg.zip

知识要求： 1。具备基本的汇编知识。
2。懂得 softICE 的基本操作。

破解思路：
运行 MightyFAX 时，它会跳出一个窗口，提示我们这个软件还没有注册。并提示
这个软件还可以用多少天，然后要我们选择注册或是继续试用。

所以我就猜想程序的流程可能是这样的。

1> 载入程序。

2> 判断这个程序注册没有
如果注册了，就跳到主程序。
如果没有注册， 就继续。

3> 判断软件有没有过期。
如果没有过期，就跳到注册窗口，要求注册。
如果过期了， 就进行一些处理，（比如使程序不能继续使用等）
然后就跳到注册窗口，要求注册。

从上面可看到，我们只要找到程序在那里判断有没有注册，就很容易破了这个软件的。

让我们开始吧！讲了那么多费话，我鸡蛋也中了不少。555555

I. 找出判断关键！

1) 用 SoftICE 的 Symbol Loader 载入MightyFAX,
如何载入？到看雪大哥的网页看看吧！http://www.kanxue.com/
那里有详细的教材。

2） 被 SoftICE 拦下来后，下 wc (这个命令是否使人联想到什么地方了？^^)

3) 然后，就是狂按 F10 啦！一直到跳出那个要求注册的窗口为止。

4) 回到 SoftICE 的 Symbol Loader ，选 File---> Save SoftICE History As...
吧刚才我们所看到的东西都保存下来。

5) 用随便一个编辑工具打开我们刚才保存的文件。

6） 现在让我们来分析它，我把其中一部分贴在下面了。

.......

0177:004DA4AE XOR EAX,EAX
0177:004DA4B0 PUSH EBP
0177:004DA4B1 PUSH 004DA619
0177:004DA4B6 PUSH DWORD PTR FS:[EAX]
0177:004DA4B9 MOV FS:[EAX],ESP
0177:004DA4BC MOV EAX,004DE21C
0177:004DA4C1 MOV EDX,[004DD4A0]
0177:004DA4C7 CALL 004037F8
0177:004DA4CC PUSH 00
0177:004DA4CE PUSH 01
0177:004DA4D0 PUSH 01
0177:004DA4D2 MOV ECX,004DA634
0177:004DA4D7 MOV EDX,004DA644
0177:004DA4DC MOV EAX,004DA650
0177:004DA4E1 CALL 004ADBF4
0177:004DA4E6 LEA EAX,[EBP-10]
0177:004DA4E9 CALL 004938B8
0177:004DA4EE MOV EDX,[EBP-10]
0177:004DA4F1 MOV EAX,004DE270
0177:004DA4F6 CALL 004037F8
0177:004DA4FB LEA EAX,[EBP-10]
0177:004DA4FE CALL 004938B8
0177:004DA503 MOV EAX,[EBP-10]
0177:004DA506 MOV EDX,[004DE258]
0177:004DA50C CALL 004AF8F0
0177:004DA511 XOR AL,01
0177:004DA513 MOV [004DE1A2],AL
0177:004DA518 MOV CX,001A
0177:004DA51C MOV DX,000A
0177:004DA520 MOV AX,07D0
0177:004DA524 CALL 004ADCF4
0177:004DA529 MOV EAX,004DE1A4
0177:004DA52E MOV EDX,004DA664
0177:004DA533 CALL 004037F8
0177:004DA538 XOR EAX,EAX
0177:004DA53A PUSH EBP
0177:004DA53B PUSH 004DA560
0177:004DA540 PUSH DWORD PTR FS:[EAX]
0177:004DA543 MOV FS:[EAX],ESP
0177:004DA546 PUSH 004DA66C
0177:004DA54B CALL 0040583C
0177:004DA550 PUSH EAX
0177:004DA551 CALL 004057BC
0177:004DA556 XOR EAX,EAX
0177:004DA558 POP EDX
0177:004DA559 POP ECX
0177:004DA55A POP ECX
0177:004DA55B MOV FS:[EAX],EDX
0177:004DA55E JMP 004DA56A ----------> (JUMP )
0177:004DA56A MOV EAX,[004DD62C]
0177:004DA56F CALL 00428D00
0177:004DA574 CALL 00493F1C
0177:004DA579 TEST AL,AL -----------> 判断有没有注册
0177:004DA57B JZ 004DA5B8 -----------> (NO JUMP) (对比关键，跳则不用注册！）
0177:004DA57D MOV EAX,004DE27C
0177:004DA582 MOV EDX,004DA680
0177:004DA587 CALL 004037F8
0177:004DA58C MOV EAX,[004DE258]
0177:004DA591 CALL 004AE4C8
0177:004DA596 CALL 004AE1A4
0258:0070 JNZ 00A3 ------------------> （JUMP)
:x

........

在整个文件当中，我只找到三个 jump，第一个是无条件的 jump ，所以不用管它。

剩下两个，从前面的程序流程我们可以很容易猜到第一个判断是看注册没有，

第二个是判断有没有过期。

7) 为了检验我们的判断对不对，用 SoftICE 再载入程序。一直按 F10 直到这里。

......
0177:004DA57B JZ 004DA5B8
........

下 rfl +z 将 no jump 改为 jump

然后继续按一下 F10, 再按 F5 离开。

8) 这时，我们就可以发现程序直接进入主程序，而不再出现注册窗口。

II. 修改程序。

9) 现在，就让我们来修改它吧。运行 HIEW （同样，看雪大哥的教材也有 HIEW的介绍

先去看看，再继续下去。）

10）用 HIEW 载入 MF.exe

11）按 F4 选择 Decode

12） 按 F5 , 输入偏址： 004DA57B 然后回车。

13) 咦？！怎么出现 “jump out of file” 的提示？

(为什么会这样，各位高手能给点提示吗？)

14) 只好用另外一种方法啦。

15) 用 SoftICE 载入 MF.exe

16) 来到
....
0177:004DA57B JZ 004DA5B8
.....

下 d 0177:004da57b

可看到机器码：

74 3B B8 7C E2 4D 00

17) 用 HIEW 重新载入 mf.exe.

18） 按 F7， 输入 74 3B B8 7C E2 4D 00

19） 按 F3, 将 74 改为 75.

20) 修改好后，F9存盘（按回车后到下一行，再按ESC让对话框消失，然后按F9）。


MP3 to EXE v 2.6

 标 题:MP3 to EXE v 2.6破解手记 (8千字)
发信人:X man
时 间:2001-9-8 23:16:05
详细信息:
MP3 to EXE v 2.6破解手记
作者:lb[BCG]或X man
软件简介：
With MP3 to EXE you can create Selfplaying MP3 Songs. While the Song
is played you can change the Volume (Left and Right seperate), see an
VU-Meter, change the position in the MP3-Song, Loop the Song, view
the TAG's with Information about the Song.
And you change this Information with MP3 to EXE before creating the
file.
工具：fi,trw2000,w32dasm,hiew
该软件是一年前下的，直到今天才搞定，看来我太失败了（肺腑之言）
首先用FI检测有无壳，很幸运没有。
用W32DASM反编译，查找"The Registrationinformation is wrong. Try again?"
来到* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0046F1B4(C), :0046F1F9(C)-----------------------//从这两处跳来
|-------------------------------------------------//向上来到这两处

* Possible Reference to Dialog: DialogID_0065, CONTROL_ID:0064, "Text"
|
:0046F2D8 6A64 push 00000064

* Reference To: kernel32.Sleep, Ord:0000h
|
:0046F2DA E8ED68F9FF Call 00405BCC
:0046F2DF 6A04 push 00000004

* Possible StringData Ref from Code Obj ->"Error"
|
:0046F2E1 B938F44600 mov ecx, 0046F438

* Possible StringData Ref from Code Obj ->"The Registrationinformation is "
->"wrong. Try again?"
|
:0046F2E6 BA40F44600 mov edx, 0046F440
:0046F2EB A140144800 mov eax, dword ptr [00481440]
:0046F2F0 8B00 mov eax, dword ptr [eax]
:0046F2F2 E80103FCFF call 0042F5F8
:0046F2F7 83F807 cmp eax, 00000007
:0046F2FA 750A jne 0046F306
:0046F2FC A1E8494800 mov eax, dword ptr [004849E8]
:0046F301 E84EE0FBFF call 0042D354
**********
来到0046F1B4(C), :0046F1F9(C)处
* Possible StringData Ref from Code Obj ->"MP3-"
|
:0046F164 6890F34600 push 0046F390
:0046F169 8BC7 mov eax, edi
:0046F16B E8008BF9FF call 00407C70
:0046F170 8BC8 mov ecx, eax
:0046F172 A108154800 mov eax, dword ptr [00481508]
:0046F177 8B00 mov eax, dword ptr [eax]
:0046F179 8B800C030000 mov eax, dword ptr [eax+0000030C]
:0046F17F 8BD7 mov edx, edi
:0046F181 E8AADFFFFF call 0046D130
:0046F186 83C003 add eax, 00000003
:0046F189 8D4DEC lea ecx, dword ptr [ebp-14]
:0046F18C BA08000000 mov edx, 00000008
:0046F191 E86682F9FF call 004073FC
:0046F196 FF75EC push [ebp-14]

* Possible StringData Ref from Code Obj ->"-B9"
|
:0046F199 68A0F34600 push 0046F3A0
:0046F19E 8D45F0 lea eax, dword ptr [ebp-10]
:0046F1A1 BA03000000 mov edx, 00000003
:0046F1A6 E8654BF9FF call 00403D10
:0046F1AB 8B55F0 mov edx, dword ptr [ebp-10]----你填的serial number
:0046F1AE 58 pop eax------------------------正确的serial number
:0046F1AF E8AC4BF9FF call 00403D60
:0046F1B4 0F851E010000 jne 0046F2D8-------------跳到出错的地方
:0046F1BA 8D55FC lea edx, dword ptr [ebp-04]
:0046F1BD 8B83E0010000 mov eax, dword ptr [ebx+000001E0]
:0046F1C3 E85805FBFF call 0041F720
:0046F1C8 8B55FC mov edx, dword ptr [ebp-04]
:0046F1CB 8D4DEC lea ecx, dword ptr [ebp-14]
:0046F1CE A108154800 mov eax, dword ptr [00481508]
:0046F1D3 8B00 mov eax, dword ptr [eax]
:0046F1D5 E81A7F0000 call 004770F4
:0046F1DA 8B55EC mov edx, dword ptr [ebp-14]
:0046F1DD 8D4DF0 lea ecx, dword ptr [ebp-10]
:0046F1E0 A108154800 mov eax, dword ptr [00481508]
:0046F1E5 8B00 mov eax, dword ptr [eax]
:0046F1E7 E8087F0000 call 004770F4
:0046F1EC 8B45F0 mov eax, dword ptr [ebp-10]-------经变换后你填的注册码

* Possible StringData Ref from Code Obj ->"巗Y窫綅鉮<=w0燔-"
|
:0046F1EF BAACF34600 mov edx, 0046F3AC-----------------------经变换后正确的注册码
:0046F1F4 E8674BF9FF call 00403D60
:0046F1F9 0F85D9000000 jne 0046F2D8---------------跳到出错的地方
:0046F1FF B201 mov dl, 01
:0046F201 A118AC4500 mov eax, dword ptr [0045AC18]
:0046F206 E809BBFEFF call 0045AD14
:0046F20B 8BF0 mov esi, eax
:0046F20D BA02000080 mov edx, 80000002
:0046F212 8BC6 mov eax, esi
:0046F214 E88FBBFEFF call 0045ADA8
看到上面的地方，我想已经成功了一半了，但是当我一次次的追进CALL中，却发现离目标又远了。
（在CALL中转来转去，老是找不到注册码是如何变化的。请高手指点一二。^_^）
并且，我发现call 00403D60在两次出现后运算的结果都不同。
在
:0046F1AF E8AC4BF9FF call 00403D60
:0046F1B4 0F851E010000 jne 0046F2D8---要保证call 00403D60的输出为EAX=0
在
:0046F1F4 E8674BF9FF call 00403D60
:0046F1F9 0F85D9000000 jne 0046F2D8---要保证call 00403D60的输出为EAX不为0
SO，在别无它法时，我突然想到了每次打开MP3TOEXE都会有个NAG，不如查找它的关键字吧！
于是几经波折，来到了最关键的地方：
* Possible StringData Ref from Code Obj ->"MP3-"
|
:004799A8 680C9B4700 push 00479B0C
:004799AD 8BC7 mov eax, edi
:004799AF E8BCE2F8FF call 00407C70
:004799B4 8BC8 mov ecx, eax
:004799B6 8BD7 mov edx, edi
:004799B8 8B860C030000 mov eax, dword ptr [esi+0000030C]
:004799BE E86D37FFFF call 0046D130
:004799C3 83C003 add eax, 00000003
:004799C6 8D4DF4 lea ecx, dword ptr [ebp-0C]
:004799C9 BA08000000 mov edx, 00000008
:004799CE E829DAF8FF call 004073FC
:004799D3 FF75F4 push [ebp-0C]

* Possible StringData Ref from Code Obj ->"-B9"
|
:004799D6 681C9B4700 push 00479B1C
:004799DB 8D45F8 lea eax, dword ptr [ebp-08]
:004799DE BA03000000 mov edx, 00000003
:004799E3 E828A3F8FF call 00403D10
:004799E8 8B55F8 mov edx, dword ptr [ebp-08]
:004799EB 58 pop eax
:004799EC E86FA3F8FF call 00403D60
:004799F1 7556 jne 00479A49---------是不是和刚才的地方很象
----------将JNE改成JE既成任意注册版！哈哈
:004799F3 8D4DFC lea ecx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"Free"
|
:004799F6 BAEC9A4700 mov edx, 00479AEC
:004799FB 8BC3 mov eax, ebx
:004799FD E8FA15FEFF call 0045AFFC
:00479A02 8B55FC mov edx, dword ptr [ebp-04]
:00479A05 8D4DF8 lea ecx, dword ptr [ebp-08]
:00479A08 8BC6 mov eax, esi
:00479A0A E8E5D6FFFF call 004770F4
:00479A0F 8B55F8 mov edx, dword ptr [ebp-08]
:00479A12 8D4DFC lea ecx, dword ptr [ebp-04]
:00479A15 8BC6 mov eax, esi
:00479A17 E8D8D6FFFF call 004770F4
:00479A1C 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"巗Y窫綅鉮<=w0燔-"
|
:00479A1F BA289B4700 mov edx, 00479B28
:00479A24 E837A3F8FF call 00403D60
:00479A29 751E jne 00479A49 ----------将JNE改成JE既成任意注册版！哈哈
:00479A2B 33D2 xor edx, edx
:00479A2D 8B86EC010000 mov eax, dword ptr [esi+000001EC]
:00479A33 E8445CFAFF call 0041F67C
:00479A38 B8E84C4800 mov eax, 00484CE8

* Possible StringData Ref from Code Obj ->"MP3TOEXE_2"
|
:00479A3D BA449B4700 mov edx, 00479B44
:00479A42 E8E19FF8FF call 00403A28
:00479A47 EB0D jmp 00479A56
好了，由于我是BEGINNER，所以只有爆破了。高手可不要见笑哦！
PATCH：
用HIEW，打开MP3TOEXE.exe,按F4，选择第三个选项，按F5,输入78df1,将7556改成7456
在将它下面的751E改成741E,按F9，F10。OK！文件就改好了。
打开注册表编辑器来到
HKEY_LOCAL_MACHINE\Software\Oliver Buschjost\MP3TOEXE\v2.6
将其中lName、Serial改成您的大名和Seria 码(可以任意填）

END：
软件搞定了，但是注册码是如何变化的还是不明白。望高手给我指点一二。

X man or lb[BCG]
lbcool@elong.com
2001.9.8


Mulitword ver 3.0

标 题:暴力破解3 (6千字)
发信人:peterchen
时 间:2001-2-18 20:26:15
详细信息:
本人暴力破解3
有人问为什么3?明明是2才对啊！
第2本人已经成功了可惜不会用udeit32有代换改法一次就几十个？
搞到程序出错！现在有一种方法了就是，不说先等你看完先！
mulitword ver 3.0
可是这个是新版来的！
也就是kanjiweb!
用W32dsm89反后，以前都是从字符串入手！
现在介绍一种比较快的方法，就是W32dsm89的查找功能，输入
"SORRY !! ERROR SERIAL NO"一会就找到了！
本些也要说明些是从错误对话窗入手，而且字符串有时会找到一些"thank
you"之类的话也就是从注册完窗来开枪！这里本人也要多说几句了！
错误窗与完成窗有什么区别了？就有好像敌人与朋友你说有什么区别啊？
错误窗就要kill也就我们所说的跳过它，而且完成窗就是让它执行！
浪话少说来：

* Possible StringData Ref from Code Seg 001 ->"SORRY !! ERROR SERIAL NO"
|
:0001.3A43 68E45E push 5EE4
:0001.3A46 685D3A push SEG ADDR of Segment 0001

* Possible StringData Ref from Code Seg 001 ->"ERROR !!"
|
:0001.3A49 68DA5E push 5EDA
:0001.3A4C 6A00 push 0000
:0001.3A4E 9A04170000 call USER.MESSAGEBOX //->goodover讨厌的对话窗出来了？
第一步找出跳到些call，有时会问如何找了这样你就不要偷懒了要有纸和笔做记录！
记哪么些了？是偏移值，注意这里的偏移值是 0001.3a4e不是状态栏下的@offset!
而且还还要记些call跟着的东西？有时还要进去看一看？如果是带偏移值也要记住这个值为什么了？
激法些call有时不是直接,当你向上分析时有时出现je or jne之类后面是些call后面的值,通过复杂的运行
后也回到激活些call!也好像走路一样，可以走直路、弯曲山路或小径等多种走法但最终也是要到目的！

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.3937(C)
|
:0001.3A34 8B76F8 mov si, [bp-08]
:0001.3A37 EB34 jmp 3A6D //->第一个跳过些些call
第二步是找出为什么来不到这里的原因？

:0001.3A39 90 nop

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.39F6(C)
|
:0001.3A3A BE0100 mov si, 0001
:0001.3A3D FF760E push word ptr [bp+0E]
:0001.3A40 68473A push SEG ADDR of Segment 0001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.39ED(C)
:0001.39F4 0BC0 or ax, ax
:0001.39F6 7542 jne 3A3A //->看到没有？ 就是它了！我要寻根问底再向上分析！
:0001.39F8 C646FBFF mov byte ptr [bp-05], FF
:0001.39FC 33F6 xor si, si
:0001.39FE 56 push si
:0001.39FF 66FF76FC push word ptr [bp-04]
:0001.3A03 FF76F6 push word ptr [bp-0A]
:0001.3A06 9A1A071B3A call 0001.071A
:0001.3A0B 83C408 add sp, 0008
:0001.3A0E 6A04 push 0004
:0001.3A10 8D46EE lea ax, [bp-12]
:0001.3A13 16 push ss
:0001.3A14 50 push ax
:0001.3A15 FF76F6 push word ptr [bp-0A]
:0001.3A18 9A66092D3A call 0001.0966
:0001.3A1D 83C408 add sp, 0008
:0001.3A20 6A01 push 0001
:0001.3A22 8D46FB lea ax, [bp-05]
:0001.3A25 16 push ss
:0001.3A26 50 push ax
:0001.3A27 FF76F6 push word ptr [bp-0A]
:0001.3A2A 9A6609413A call 0001.0966
:0001.3A2F 83C408 add sp, 0008
:0001.3A32 EB1F jmp 3A53 第二个跳过此call

:0001.39EB F3 repz
:0001.39EC A6 cmpsb
:0001.39ED 7405 je 39F4 //->是这里？
:0001.39EF 1BC0 sbb ax, ax
:0001.39F1 1DFFFF sbb ax, FFFF

总结：je 39F4->jne 3A3A.....->call USER.MESSAGEBOX 完蛋！
jmp 3A6D and jmp 3A53 to good bye call USER.MESSAGEBOX! Yeach!
所以我只要把jne 3a3a 不跳->jmp 3A53 跳过些call！
知道如何做了？ 找3a3a，9090 如果你这样做不是改一个而是改了多个，很容易出错！
正确的是上面+3a3a也就是0BC0+3a3a(要改得)! seach 0BC0 3a3a->0BC0 9090现在只有个
^^^^
了，你再找就找不到也就是你改对！当然可以@offset值的用hiew640reg来改！
我试了试乱输入注册，程序不见了？见鬼我把时间调到2002年！难道还有时间限制？
不管了调回2001正常，注册变成灰色也就是成攻了！时间调前或后都没有时间了！
我初次暴力如何错误，请大家指教！thanks! 请问一下 jne 3a3a 能改成
je 3a3a or jmp3a3a我个人看应该不行这样也是跳得啊？程序是拿来练习已经删除了,
由于资料与软件太多了不知道放在哪儿了？

我破解完在整理资料时找到coolfly破解
★目标软件: KanjiWEB3.0
时间限制: 大约一个月

1998年12月25日晚23:14分
KANJIWEB 是个不错的内码转换程序，但是有时间限制，需要注册。
首先打开 MultiWord.exe 程序，然后选择 register，
在注册框中输入任意字符，切换到 winice ,输入:
bpx getdlgitemtext ，按F5键回到程序，按下OK按键，程序被中断，
我们就从这儿一路P下去，最后到了
....
....
....

30f7:39c9 xor byte ptr [si],86
:39cc inc si
:39cd lea ax,[bp+fe2f]
:39d1 cmp si,ax
:39d3 jb 39c9

程式到此循环九遍，程式在判断九位注册码，追到

30f7:3a4e call messagebox

此时出现注册失败的画面，因此我就从此开始逆查，往上一看，

xxxx:39eb repz cmpsb
:39ed jz 39f4 '判断语句，如果相等则跳到29f4继续执行。
xxxx:xxxx .
.
xxxx:39f4 or ax ax
xxxx:39f6 jnz 3a3a '比较，如果不等则跳到3a3a处。

按F10键执行到3a3a处一看:

xxxx:3a3a mov si,0001
...
...
xxxx:3a4e call user!messagebox '执行到此处就会出现上面的注册失败的画面。
....
xxxx:3a6d or si,si
xxxx:3a6f jnz 3a87 '跳到3a87，并结束注册

所以39f6 处的比较绝对有问题，假设相等就不会跳跃了，我们从39f6往下看:

....
....
xxxx:3a32 jmp 3a53
xxxx:3a34 mov si,[bp-08]
xxxx:3a37 jmp 3a6d

而跳到3a53处往下执行是:
....
....
xxxx:3a6f jnz 3a87
....
xxxx:3a74 call user!getparent '处理注册
....
xxxx:3a82 call user!sendmessage '发送注册信息。
....
xxxx:3a87 xxxx
....
xxxx:3a8c call user!enddialog '注册结束信息

我想上面的关键语句行一看就会明白39ed和39f6语句有问题

方法，下code on 命令将修改下列机械码：

30f7:39f6 jnz 3a3a -> nop nop (因为是两个字节，所以填两个nop)

退出后，注册成功，软件可以正常使用啦！

【结论】

查找: MULTWORD.EXE (49,008 BYTE)
<1> 0BC0 <7542> C646FBFF -> 0BC0 <9090> C646FBFF
^^^^ ^^^^
破解完成，可以上床睡觉了。看看表，哇，很晚了吗？see you letter!

他是用softice来破解而我的是用w32am89！
这个软件的作者也太懒新版与旧版虽然汇编偏移不同，而汇编内容着不多是一样的！
最后结果是一样！softice和trw2000 破解暴力是就容易找准错误call如call USER.MESSAGEBOX如果
后面是一些偏移而且上下就不只一个call就比较麻烦？但分析汇编内容w32am89就比较好了！
所以他们各有千秋!如果你能把他们一起运用，会促进你的破解速度！很久没有打这样多字了，手都软了！


NetStat4.0

 标 题:《NetStat4.0的破解实录》---->为申请FCG而做 (10千字)
发信人:yuppc
时 间:2001-6-17 17:45:35
详细信息:
《NetStat4.0的破解实录》

破解作者:yuppc
破解时间:2001年6月17日
破解难度:易
注:(转载希望保持完整)

软件概述:
1>软件名:NetStat4.0
2>软件作用(摘):介绍:这是一个强大的Internet工具，它能够让你通过图形界面查看当前的网络连接情况，你可以用它来了解和防堵非法连接。不管你是连接到网站、检查信件、发送ICQ信息，还是无意中打开了一个后门程序，XMS都将会注意到这些活动，并对你进行提醒，同时还能够显示每个连接的详细情况。
3>评:这是一个非常好的网络软件,在网络自由英雄时代有些人们连自己的网络门户都无法看受,为什麽?那是因为他们还不了解自己的机器!此软件有全监控能力，向用户提供连接Ip、端口等信息和控制的图形化操作！
4>未注册软件只有十五天的使用期.
5>主页:http://www.freshsw.com
6>最新版本:X-NetStat 5.0 Standard Beta 1(05-02-01)

破解目的:为加入CCG奋斗!

破解工具:
1>regshot ====>注册表工具
2>w32asm中文黄金板 ====>反汇编工具
3>TRW2000 =====>动态调试工具
4>Hex shop =====>十六进制编辑器

破解方法:
方法一:注册表分析及静态反汇编法(适用大部分在注册表内加入时间标志位的时间限制软件)
方法二:标准破解法(很传统,也很实用)

破解开始:
分析:软件安装后,第一次启动,软件"标题栏"显示"15 days left";第二次启动,软件的"标题栏"显示"14 days left";改动日期,向后改动,"标题栏"显示天数减少;向前改动,"标题栏"天数增加(看起来较容易呀),但当日期超过安装日期时提示错误.

方法一:注册表分析及反汇编

1>使用regshot为注册表"拍摄"镜像并对软件安装前后的Reg进行对比，发现键值"HLM\software\XNSvc\when",是软件启动时新建的.
2>发现:当我们删除REG中的"when"键后,软件启动后将重新建立"when"键,并从新开始记时(也就是重新从15开始倒数),可以得知此键应为软件的安装时间标志.
3>初步设想:如果当软件启动时都从新建立"when"键,那麽软件的时间约束不就解除了,并且是全功能的!!
4>使用w32asm黄金版进行反绘编,查找"when",过程如下:
第12下到站(共有15处含when,其中包括"whenreg_pro4""whenlv""Registeredwhen"):有人问那为什麽是第12个呢,其实搜能搜到2大块个真正完全搭配的when程序带,就是第12次停时和第15次停时,而第15次的程序段显然不是(分析一下嘛:-)
下面是源程序:
* Referenced by a CALL at Addresses:
|:00508CE5 , :00508D05 , :00519DEA , :00519E05 , :00519E54
| ^^^^^^^^^^
:00518624 53 push ebx
:00518625 56 push esi

* Possible StringData Ref from Code Obj ->"DaysLeft"
|
:00518626 B8FC865100 mov eax, 005186FC
:0051862B E80CE5FFFF call 00516B3C
:00518630 B201 mov dl, 01
:00518632 A1D0BF4700 mov eax, dword ptr [0047BFD0]
:00518637 E8003BF6FF call 0047C13C
:0051863C 8BD8 mov ebx, eax
:0051863E BA02000080 mov edx, 80000002
:00518643 8BC3 mov eax, ebx
:00518645 E8CE3BF6FF call 0047C218
:0051864A B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\SOFTWARE\XNSvc"
|
:0051864C BA10875100 mov edx, 00518710
:00518651 8BC3 mov eax, ebx
:00518653 E8043DF6FF call 0047C35C

* Possible StringData Ref from Code Obj ->"when"=====>第一个(我们停在这)
|
:00518658 BA28875100 mov edx, 00518728
:0051865D 8BC3 mov eax, ebx
:0051865F E8D442F6FF call 0047C938=====>检查键值when的call
:00518664 84C0 test al, al====>标志位(when是否存在)
:00518666 7415 je 0051867D===>否,跳(解决问题的跳)

* Possible StringData Ref from Code Obj ->"when"=====>第二个
|
:00518668 BA28875100 mov edx, 00518728
:0051866D 8BC3 mov eax, ebx
:0051866F E83C41F6FF call 0047C7B0
:00518674 DD1DB89D5300 fstp qword ptr [00539DB8]
:0051867A 9B wait
:0051867B EB24 jmp 005186A1====>正常跳转(将取得本地时间与when值比较)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00518666(C)
|
:0051867D E82E23EFFF call 0040A9B0====>新建立when键(破解时间所在)
:00518682 DD1DB89D5300 fstp qword ptr [00539DB8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00518617(C)
|
:00518688 9B wait
:00518689 FF35BC9D5300 push dword ptr [00539DBC]
:0051868F FF35B89D5300 push dword ptr [00539DB8]

* Possible StringData Ref from Code Obj ->"when"====>第三个
|
:00518695 BA28875100 mov edx, 00518728
:0051869A 8BC3 mov eax, ebx
:0051869C E8FB40F6FF call 0047C79C
-------------------------------------------------------
5>用Hex shop改地址518666内容---7515--->eb15
时间限制解决,使用者永远可以使用!
6>总结:方法快速、简便、安全性好，缺点是软件不太美观（标志栏总有“15 days left”）

*************************************************************
因此下面介绍一下完美破解：

方法二:
1>把日期调到过期时间.
2>记下过期提示框所显示的的英文.
3>老方法,用w32asm黄金版查找字符串:
查找"Evaluation period over"(或者"Evaluation",可能会找到的多些呀)
发现了三个地方:
---------------------------------------------------------
4>开始分析:
第一处(看源程序,显然不对吗),不信,你向上看有这样的句子(这个程序有些怪,它有"反注册"功能):
* Possible StringData Ref from Code Obj ->"Warning"
|
:00508C9F BAA48D5000 mov edx, 00508DA4

* Possible StringData Ref from Code Obj ->"This will unregister your copy "=====>是反注册的标志嘛,所以……
->"of X-NetStat.
You will have to "
->"re-enter your registration information. "
->"Do you wish to proceed?"
:
:
:
:00508D47 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->" - Evaluation period over"=====>第一处
|
:00508D4A BA8C8E5000 mov edx, 00508E8C

------------------------------------------------------------
第二处(这个可以认定是具体的调用),源程序如下:
* Referenced by a CALL at Addresses:
|:005047E0 , :00510513 , :00519E5D , :0052185C
| ^^^^^^^^
:005107EC 53 push ebx
:005107ED BBC8D95200 mov ebx, 0052D9C8
:005107F2 B930000000 mov ecx, 00000030

* Possible StringData Ref from Code Obj ->"Evaluation period over"=======>第二处
|
:005107F7 BADC085100 mov edx, 005108DC

* Possible StringData Ref from Code Obj ->"Your evaluation period for XNS "
->"has expired. XNS will no longer "
->"be functional until you register.
Please "
->"consider purchasing X-NetStat "
->"Professional."
|
:005107FC B8FC085100 mov eax, 005108FC
:00510801 E8EE46F9FF call 004A4EF4

* Possible StringData Ref from Code Obj ->"X-NetStat Professional - Evaluation "
->"period over"
:
:
下面有一小群mov和call,所以我猜是具体调用,先不要理她,请记住上面调用这段程序的call的地址!(十分感谢)

--------------------------------------------------------
第三处(仔细看,停的位置给你标出了):
* Possible StringData Ref from Code Obj ->"creating udpstats"
|
:00519DC4 B8A8A15100 mov eax, 0051A1A8
:00519DC9 E86ECDFFFF call 00516B3C
:00519DCE 8B0B mov ecx, dword ptr [ebx]
:00519DD0 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"?A"
|
:00519DD2 A1BCE94500 mov eax, dword ptr [0045E9BC]
:00519DD7 E87C5AF4FF call 0045F858
:00519DDC A3DCD95200 mov dword ptr [0052D9DC], eax
:00519DE1 E8BAE6FFFF call 005184A0======>注册检查call(我当然知道,我追过嘛)
:00519DE6 84C0 test al, al=====>标志位
:00519DE8 7578 jne 00519E62=========>关键跳(完美破解所在)
:00519DEA E835E8FFFF call 00518624=====>检测软件安装时间（时间在注册表HLM\software\XNSvc\when)
:00519DEF 85C0 test eax, eax
:00519DF1 7E40 jle 00519E33====>过期就跳
:00519DF3 8D55F0 lea edx, dword ptr [ebp-10]
:00519DF6 8B03 mov eax, dword ptr [ebx]
:00519DF8 E877C5F1FF call 00436374
:00519DFD FF75F0 push [ebp-10]
:00519E00 68C4A15100 push 0051A1C4
:00519E05 E81AE8FFFF call 00518624
:00519E0A 8D55EC lea edx, dword ptr [ebp-14]
:00519E0D E842F7EEFF call 00409554
:00519E12 FF75EC push [ebp-14]

* Possible StringData Ref from Code Obj ->" days left)"
|
:00519E15 68D0A15100 push 0051A1D0
:00519E1A 8D45F4 lea eax, dword ptr [ebp-0C]
:00519E1D BA04000000 mov edx, 00000004
:00519E22 E861A1EEFF call 00403F88
:00519E27 8B55F4 mov edx, dword ptr [ebp-0C]
:00519E2A 8B03 mov eax, dword ptr [ebx]
:00519E2C E873C5F1FF call 004363A4
:00519E31 EB21 jmp 00519E54

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00519DF1(C)
|
:00519E33 8D55E8 lea edx, dword ptr [ebp-18]
:00519E36 8B03 mov eax, dword ptr [ebx]
:00519E38 E837C5F1FF call 00436374
:00519E3D 8D45E8 lea eax, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->" - Evaluation period over"====>第三处(我们停在这!)
|
:00519E40 BAE4A15100 mov edx, 0051A1E4
:00519E45 E886A0EEFF call 00403ED0
:00519E4A 8B55E8 mov edx, dword ptr [ebp-18]
:00519E4D 8B03 mov eax, dword ptr [ebx]
:00519E4F E850C5F1FF call 004363A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00519E31(U)
|
:00519E54 E8CBE7FFFF call 00518624=====>检查注册表的when键值
:00519E59 85C0 test eax, eax
:00519E5B 7D05 jge 00519E62
:00519E5D E88A69FFFF call 005107EC======>过期时跳出的nag(这也是调用第二处程序的call,让记的地址记了吗!)

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00519DE8(C), :00519E5B(C)
|
:00519E62 E8DDB5FFFF call 00515444 =====>正常的程序调用
:00519E67 803DF8B5520000 cmp byte ptr [0052B5F8], 00
:00519E6E 7405 je 00519E75
:00519E70 E84F69FFFF call 005107C4
------------------------------------------------------------------
5>现在清楚了吗,动手:改地址519de8的7578----->eb78
6>收工!:-)


office2000

 标 题:我有破解office2000 50次限制的方法
发信人:1212
时 间:2000-11-24 21:16:12
详细信息:
昨天的有位要找office2000 解除50次限制限制的注册码的，我这里有两个，你可以试一试,不知能否成功
安装系列号.

mw92j c2rr6 7tcck dv2c6 4bqrw

破解 ,解除50次限制
注册方式选电话注册，注册码：ck4t f9vc 或者 cyjq 6ym7
我用这两个码在我机器是是注册成功的。

若注册不成功，那就手动破解它吧！

我的实战经历：
运行trw2000, 选电话注册，任意输入8个注册码(dddddddd)后，单击确定之后，
立即按ctrl+n,trw2000中断后输入命令pm加空格键,加车，再一步一步的按f10键，用不了按多少次，运行这步代码:
call xxxxxx;....
cmp eax,01 <-- 这是关键，eax 等于1表示注册码检验正确，为0当然不正确，要做
的就是在运行这条指令时（这条指令上有光带）输入命令: r eax 1
使等于1，按f5,大功告成，注册成功，赶快抄下注册成功的注册码吧，下次重装机器时用得着.!!
我这两个注册码就是这样得到的.

那位用这个方法成功了的，发email(wjt@sina.com)给我吧，让我也高兴高兴，我喜欢收信!

以下是我从网上找到的.

中文 office2000 的破解方法

--------------------------------------------------------------------------------

微软的Office2000的确不同凡响。不过加密技术却不敢恭维，
甚至令人觉得是故意放水。由于office2000采取的是一机一ID的加密手段，在没找到注册机之前，恐怕只好自己动手用softice拆解了。虽然softice号称第一拆密软件，而且还都是汇编语言，不过请不要担心，照猫画虎保证3分钟搞定。

如果您还没有softice的话，可以download一个。

安装softice的时候有两个小问题，一是配显卡时千万选中上面那个check框，这样softice就会在一个窗口里弹出来，而不会切换到全屏（那样容易花屏），二是接下来一屏中默认没有鼠标，建议最好选一个鼠标（通常是第一个选项）。其余选项均为默认。安装并重启后softice将驻留，呼叫热键为Ctrl+D，您可以随时切换，用法就象“整人专家”之类的东西。

在softice中有四个窗口是拆解时必须的，一是寄存器窗口，即显示EAX=00000000等的窗口，可以输入WR开关；二是数据窗口，即显示分为左、中、右三段，分别为内存地址、十六进制码和ASCII码的窗口，可以输入WD开关；三是代码窗口，即显示汇编代码的地方，可以输入WC开关；四是命令窗口，即要输入一些命令的地方。(如果您没看到某个窗口请输入命令把它打开）。好了，闲话少说，开始说office2000的拆法吧。首先运行office2000的任意组件以便弹出限制窗口，不要按“下一步”，而是从“其它选项”中将“Internet”改为“电话注册”，之后在“确认”框中随便输入一个八位密码，比如：CDCD CDCD（中间的空格是自动生成的，不要输入，有的字母或数字不能输入是正常的）。按“下一步”后迅速按下Ctrl+D切换到softice窗口，（不必象其它教程中所说的那样设置断点，因为微软在此处没有用常规的取密码方法，使用任何断点反而都会失效，我也是屡试不中在情急之下才发现原来可以直接中断的）。按F12（即追踪）直到代码区高亮的一句为CMP EAX，01为止。从这一句起按F10（即单步追踪），注意EAX的值，它一般很小，大概仅有最右边一两位数不是零，当代码区中有几句大概是LEA EAX，[EBP-001C]...PUSH EAX的时候，EAX的值会突然变大两次，其中第一次EAX=01XXXXXX或EAX=00DXXXXX，可以输入命令D EAX并回车（即显示EAX处的内容），可以在数据区看到您机器的ID号！第二次EAX=008XXXXX或EAX=006XXXXX，（依前次EAX值而定），可以输入D EAX并回车，看到数据区是CDCDCDCD（就是您刚才乱输入的密码），用鼠标将数据区下移两三行（因为在刚才的上两行处将存放算好的密码）[如果您没有配鼠标可以输入D EAX-24即可]。继续按F10突然间在数据区您所设定的位置出现了八位字母和数字混合的字符串！！赶紧抄下来吧，这就是密码了。^_^

输入G并回车让程序运行完，出现了错误提示，不过这是最后一次了！！！输入您刚才抄下来的密码并按“下一步”看到“成功注册”的画面了吗？心里真的有点爽...

如果您没找到CMP EAX，01却出现了错误对话框，可能是中断时按的时间不太准，不必着急，再来一次。如果您连续几次找不到，请记住有一句令您等待较长时间的语句，比如：RET，下一次到这一句后就开始按F10吧，祝你好运！

有时连输三次错误码后到下一屏再按上一步退回到注册画面好追一些。有时拆不开可能与D版质量有关，反正不贵，多买几个版本试一试吧！

虽然我说了一大堆，其实操作起来也就几分钟的事。

祝大家都有好心情！！！！

感谢网友 newx 提供
相关信息:
  • 我有破解office2000 50次限制的方法(3千字)(1212 11-24 21:16)
    • 用 GC6J3-GTQ62-FP876-94FBR-D3DX8 Full version 不用破 !(空)(WinDos2K 昨天2:27)


offline explorer 1.4

标 题:for new-newbies（脱壳+patch）,学破解不足三天者请进，高手如果不怕浪费时间，也请指点一下。 (8千字)
发信人:ama
时 间:2001-1-5 21:15:45
详细信息:
虽然网上现在到处找得到offline explorer 1.4的破解了，可是一个多月前我还辛辛苦苦地到处找破解（那时还有一次可怜兮兮地在论坛1212了一回，问了一句“OFFLINE EXPLORER好像很难破”之类的话，好不容易找到一个注册码，却又是无用的），现在参照看雪教学几篇文章破了几个软件之后，正好网上也没找到关于它的教程，终于可以自己拿它来开刀了！同时也把这十余天来学破解的一点经验总结一下，可能有助于比我还要new的new-newbies。如果您是大、中级（大侠、大虾、中侠、中虾……）的那么除非您有意指点一下，是无须浪费时间的了，因为我一定会很啰嗦的！！:-) 开工！
一 工具：1 国产精品：冲击波和TRW2000 1.22，感谢两位作者，（好像TRW2000不再更新了，不然怎么主页上有人问注册的事却没人回答）。
2 十六进制（HEX）编辑器WINHEX（前几天才从hying兄那儿学了一招，破之，马上就派上用场了！）或HEXWORKSHOP等。以及W32DASM——静态反汇编利器。
3 看雪教学（有工具也得有课本啊！当字典用也行，这一编只是习题附不标准答案）。大家有什么不明白的请查课本
4 TARGET：OFFLINE EXPLORER 1.4317 OFFLINE EXPLORER PRO 1.4338

二 手动脱壳：我觉得新手学脱壳其实也没什么，对于一些简单的壳（什么是壳？看书去！不过也可以一句话来形容，就是把壳剥了，我们才可以对蛋白蛋黄为所欲为），有了咱们的国产精品，实在是so easy!何况现在要找一个没加壳的实在不是一件容易的事(可不是所有的壳都这么易脱的，只是我运气好罢了，脱不了别怪我)。
1 将冲击波挎到OE目录下，运行它，窗口中的数字就是蛋白之所在了，我这儿是00504C08。
2 运行TRW，载入OE.EXE，LOAD，于是我们来到了TRW的窗口。
3 bpx cs:504c08,因为这样可样设一个断点，当程序运行时就会停在那儿（别笑，别骂我啰嗦，开始时我的确是连这个都要想想的。）回车，再G，再回车，你会发现你在XXX:00504c08处。
4 MAKEPE AAA.EXE,那么你将会在OE的目录下生成一个AAA.EXE的文件，这就是脱壳后的程序了，这就是蛋白蛋黄了，你会发现蛋白、蛋黄、比原先完全的一个还要大，原来是494K，现在成了1.40M了。是不是SO EASY！

二 开始PATCH OFFLINE EXPLORER 1.4317
1 我们的对象是OFFLINE EXPLORER 1.4317，因为我觉得它比较有助于思考，比OFFLINE EXPLORER PRO 1.4338要麻烦一点。打开TRW，CTRL+N，我们又来到WINDOWS窗口，跟平时输注册码一样，输入自己的NAME，再随便输入一列数字，不要按OK。再按CTRL+N，回到TRW，bpx hmemcpy(这是WINDOWS的底层函数，不明白？没关系，要明白的话，就去看课本)，按一下F5，又来到了WINDOWS，按下OK，我们又到了TRW窗口，这时你可以看到窗口下面有KERNEL的字样，这时我们不在程序中，键入bc *,清除我们上面设的断点，pmoudle,你会发现窗口下面已经变成了OE！CODE等字样了，也就是说，我们来到了程序中了！
2 连续按F10，来到下面
016F:004CE0A1 MOV EAX,[0050BD84]
016F:004CE0A6 MOV EAX,[EAX]
016F:004CE0A8 CALL 004534B0 //SORRY窗口出现，按下确定
016F:004CE0AD XOR EAX,EAX //又回到TRW
016F:004CE0AF POP EDX
3 运行W32DASM，反汇编。（当然你也可样在TRW中用U命令。）找到上面的语句，看如何跳过上面的SORRY窗口，运气好的话，上面很容易找到一个比较，你跳过去后，就可以注册了，不过我们的运气不好。
:004CE0A8 E80354F8FF call 004534B0

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004CDFD1(U), :004CDFE8(U)
|
:004CE0AD 33C0 xor eax, eax //有两处可以JMP过来,let's go!
让我们往前看：
:004CDF66 E869490200 call 004F28D4//FORTH //这个CALL可疑，F8进去看看
:004CDF6B 84C0 test al, al //THIRD这儿不能为0
:004CDF6D 747E je 004CDFED //SECOND这儿就可以跳过下面的JMP，我们可以试一试，在:004CDF6F A16CBB5000 mov eax, dword ptr [0050BB6C] HEX编辑器下改机器码为757E，即je
:004CDF74 8B00 mov eax, dword ptr [eax] 改为jne,好像成功了，但是没有，你:004CDF76 C6808806000001 mov byte ptr [eax+00000688], 01 运行程序，又成了NOT REGISTER
:004CDF7D A16CBB5000 mov eax, dword ptr [0050BB6C] 所以NEXT
:004CDF82 8B00 mov eax, dword ptr [eax]
:004CDF84 058C060000 add eax, 0000068C
:004CDF89 8B55FC mov edx, dword ptr [ebp-04]
:004CDF8C E8E75EF3FF call 00403E78
:004CDF91 A16CBB5000 mov eax, dword ptr [0050BB6C]
:004CDF96 8B00 mov eax, dword ptr [eax]
:004CDF98 0590060000 add eax, 00000690
:004CDF9D 8B55F8 mov edx, dword ptr [ebp-08]
:004CDFA0 E8D35EF3FF call 00403E78
:004CDFA5 8BB310030000 mov esi, dword ptr [ebx+00000310]
:004CDFAB 807E4700 cmp byte ptr [esi+47], 00
:004CDFAF 7425 je 004CDFD6
:004CDFB1 8D55F4 lea edx, dword ptr [ebp-0C]
:004CDFB4 8B8608020000 mov eax, dword ptr [esi+00000208]
:004CDFBA 8B08 mov ecx, dword ptr [eax]
:004CDFBC FF511C call [ecx+1C]
:004CDFBF 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004CDFC2 A16CBB5000 mov eax, dword ptr [0050BB6C]
:004CDFC7 8B00 mov eax, dword ptr [eax]
:004CDFC9 8B55FC mov edx, dword ptr [ebp-04]
:004CDFCC E873530200 call 004F3344
:004CDFD1 E9D7000000 jmp 004CE0AD //FIRST如何不让程序运行这JMP呢？
上面的CALL（之所以程序重新开始又变成NOT REGISTER，是因为程序开始时又调用了这个CALL，检测到AL为0，你可以用TRW载入程序前为这个CALL设个断点看看）进入后一直来到下面：
:004F2E58 3B02 cmp eax, dword ptr [edx]
:004F2E5A 7506 jne 004F2E62
:004F2E5C C645FF01 mov [ebp-01], 01 // THIRD若置1，则为注册
:004F2E60 EB06 jmp 004F2E68 // 上面有许多个直接JMP到4F2E68，都不能跳
:004F2E62 83C204 add edx, 00000004
:004F2E65 4B dec ebx
:004F2E66 75F0 jne 004F2E58
:004F2E68 33C0 xor eax, eax
:004F2E6A 5A pop edx
:004F2E6B 59 pop ecx
:004F2E6C 59 pop ecx
:004F2E6D 648910 mov dword ptr fs:[eax], edx
:004F2E70 688A2E4F00 push 004F2E8A
:004F2E75 8D45F0 lea eax, dword ptr [ebp-10]
:004F2E78 BA03000000 mov edx, 00000003
:004F2E7D E8C60FF1FF call 00403E48
:004F2E82 C3 ret
:004F2E83 E99409F1FF jmp 0040381C
:004F2E88 EBEB jmp 004F2E75
:004F2E8A 8A45FF mov al, byte ptr [ebp-01]//SECOND [EBP-1]中为注册标志
:004F2E8D 5E pop esi
:004F2E8E 5B pop ebx
:004F2E8F 8BE5 mov esp, ebp
:004F2E91 5D pop ebp
:004F2E92 C3 ret//FIRST CALL结束，向上看
所以实际上只要把上面一个你会直接JMP到4F2E68的语句改为JMP向4F2E5C就可以了（在实际上我是4F2E26这一句的），你可以先在TRW下键入A指令测试，A 4F2E26，回车，然后把变化了的机器码抄下来（最好抄长一些，保证它在程序中是唯一的），用HEX编辑器改一下，再运行一下，怎么样？可以了吧。把时间向后调，成功了！
四 关于OFFLINE EXPLORER PRO 1.4338
在这个版本中，比较跟上面在同个原理的，如下
:004CFDD6 E8FD800200 call 004F7ED8 //这个CALL里面也是比较，进去看看
:004CFDDB 84C0 test al, al
:004CFDDD 747E je 004CFE5D
--------------
:004F7ED8 8BC2 mov eax, edx
:004F7EDA 8BD1 mov edx, ecx
:004F7EDC E89BFAFFFF call 004F797C //很快又是一个CALL？再进去！
:004F7EE1 C3 ret
又是一连串的比较，最终又看AL的值是否为1，这儿可以按上面的方法将AL置1，但是这儿还有另一种修改的方法，如果你在进这个CALL之前把ESP EBP ESI EDI 的值记一下，你会发现它们的值并没有变（我的理解是不变就可以不理下面的东西，不知有没有错，各位大侠请指点一下），所以实际上你只要把刚进入这个CALL的指令改为AL置1，再RET就可以了。用HEX编辑器改一下，重新居动，你会发现已经是REGISTERED的了，只是没有你的名字而已。这应该在注册表中可以改动的，不过我没试，你可以自己找找。
那么前面的是否也可以用第二种方法？好像不行，至少我没找到可以修改的地方，在进入TEST AL AL之前那个CALL之后的机器码我用十六进制编辑器打开后并没有找到，不知是何原因，如果你找到了麻烦你告诉我。
五 几句废话
1 如果你有什么问题不懂的话，最好先去看看书，好像论坛常有人问些教学里说得很明白的问题。
2 如果你对破解本身不感兴趣而只为了某个软件找不到破解而要学和话，我劝你还是等一等，如果网上没有，一般也不是你我这种菜鸟学上几天就可以搞掂的。破解可能是一种乐趣，也可能是一种痛苦。论坛精华中有小楼的一篇破解杂谈，建议看看。


OICQ HACK 1.0

标 题:OICQ HACK 1.0 破解过程 (9千字)
发信人:jink
时 间:2001-4-23 21:52:24
详细信息:
OICQ HACK 1.0 B 可执行文件：OicqHack.exe
此程序未注册将无法开启多号码探测和号码文件列表模式。
演算方式：将用户输入的Register进行演算（输入的前6位不参于演算），将程序的Serial进行演算（同Award BIOS密码演算方法一样），比较两次演算的结果，相同则注册成功。
由于倒算注册码嫌麻烦，改用修改法：

破解过程如下：

:00405C65 8935EC5E4400 mov dword ptr [00445EEC], esi
:00405C6B 8BD6 mov edx, esi
:00405C6D 83C224 add edx, 00000024
:00405C70 B911000000 mov ecx, 00000011
:00405C75 8B83D4010000 mov eax, dword ptr [ebx+000001D4]
:00405C7B E8D48A0000 call 0040E754
:00405C80 A1EC5E4400 mov eax, dword ptr [00445EEC]
:00405C85 50 push eax
:00405C86 E845F9FFFF call 004055D0————————————————进入总比较call
:00405C8B 59 pop ecx
:00405C8C 85C0 test eax, eax————————————————为0就为未注册
:00405C8E 7415 je 00405CA5
:00405C90 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Registration Successed"
|
:00405C92 68DF144400 push 004414DF

* Possible StringData Ref from Data Obj ->"Thanks for your registration, "————————通过
->"all limits are removed now."
|
:00405C97 68A5144400 push 004414A5
:00405C9C 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:00405C9E E8A3700300 Call 0043CD46
:00405CA3 EB13 jmp 00405CB8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405C8E(C)
|
:00405CA5 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Registration failed"
|
:00405CA7 680F154400 push 0044150F

* Possible StringData Ref from Data Obj ->"Incorrect register code."————————未通过
|
:00405CAC 68F6144400 push 004414F6
:00405CB1 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:00405CB3 E88E700300 Call 0043CD46

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405CA3(U)
|
:00405CB8 6A03 push 00000003
:00405CBA 8B15EC5E4400 mov edx, dword ptr [00445EEC]
:00405CC0 52 push edx
:00405CC1 E8EEF8FFFF call 004055B4
:00405CC6 83C408 add esp, 00000008
:00405CC9 8BC3 mov eax, ebx
:00405CCB E8203E0100 call 00419AF0
:00405CD0 8B55D8 mov edx, dword ptr [ebp-28]
:00405CD3 64891500000000 mov dword ptr fs:[00000000], edx
:00405CDA 5E pop esi
:00405CDB 5B pop ebx
:00405CDC 8BE5 mov esp, ebp
:00405CDE 5D pop ebp
:00405CDF C3 ret

总比较call
:004055D0 55 push ebp
:004055D1 8BEC mov ebp, esp
:004055D3 53 push ebx
:004055D4 56 push esi
:004055D5 57 push edi
:004055D6 8B5D08 mov ebx, dword ptr [ebp+08]
:004055D9 8D4304 lea eax, dword ptr [ebx+04]
:004055DC 50 push eax
:004055DD 53 push ebx
:004055DE E8E5000000 call 004056C8
:004055E3 83C408 add esp, 00000008
:004055E6 8D7324 lea esi, dword ptr [ebx+24]
:004055E9 83C606 add esi, 00000006
:004055EC 56 push esi
:004055ED E8DA340300 call 00438ACC————————————此call将用户输入的Register进行演算
:004055F2 59 pop ecx 由于程序此后还将多次调用此call对用户输入的Register进行计算并比较
:004055F3 8BF8 mov edi, eax 所以改下面的那个jne是没有用的，最好的方法是改这个call
:004055F5 897B44 mov dword ptr [ebx+44], edi
:004055F8 8D4304 lea eax, dword ptr [ebx+04]
:004055FB 50 push eax
:004055FC 53 push ebx
:004055FD E89A000000 call 0040569C————————————此call将程序的Serial进行演算，我的Serial是：OH100B4003312064，经此call演算后为45303DA5
:00405602 83C408 add esp, 00000008
:00405605 3BF8 cmp edi, eax
:00405607 751A jne 00405623
:00405609 8D5324 lea edx, dword ptr [ebx+24]
:0040560C 52 push edx
:0040560D 53 push ebx
:0040560E E82D040000 call 00405A40
:00405613 83C408 add esp, 00000008
:00405616 C70301000000 mov dword ptr [ebx], 00000001
:0040561C B801000000 mov eax, 00000001
:00405621 EB06 jmp 00405629

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405607(C)
|
:00405623 33D2 xor edx, edx
:00405625 33C0 xor eax, eax
:00405627 8913 mov dword ptr [ebx], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405621(U)
|
:00405629 5F pop edi
:0040562A 5E pop esi
:0040562B 5B pop ebx
:0040562C 5D pop ebp
:0040562D C3 ret

此call将用户输入的Register进行演算（有N多个地方将调用它，也就可知演算不只一次）
* Referenced by a CALL at Addresses:
|:004016B8 , :004017E3 , :00401F0F , :00401F19 , :004023A5
|:004023AF , :004023D1 , :004037E2 , :004037F3 , :0040389E
|:004038AA , :00403BC4 , :00403C51 , :0040439E , :004043A7
|:004047EC , :00404815 , :0040483E , :00404977 , :00404986
|:004049C5 , :004049D1 , :00405560 , :004055ED , :00438B3B
|
:00438ACC 55 push ebp
:00438ACD 8BEC mov ebp, esp
:00438ACF 53 push ebx
:00438AD0 56 push esi
:00438AD1 57 push edi
:00438AD2 33FF xor edi, edi
:00438AD4 8B7508 mov esi, dword ptr [ebp+08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438AE6(C)
|
:00438AD7 8A1E mov bl, byte ptr [esi]
:00438AD9 46 inc esi
:00438ADA 0FBEC3 movsx eax, bl
:00438ADD 50 push eax
:00438ADE E8DD1B0000 call 0043A6C0
:00438AE3 59 pop ecx
:00438AE4 85C0 test eax, eax
:00438AE6 75EF jne 00438AD7
:00438AE8 80FB2B cmp bl, 2B
:00438AEB 7405 je 00438AF2
:00438AED 80FB2D cmp bl, 2D
:00438AF0 750E jne 00438B00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438AEB(C)
|
:00438AF2 80FB2D cmp bl, 2D
:00438AF5 0F94C0 sete al
:00438AF8 83E001 and eax, 00000001
:00438AFB 8A1E mov bl, byte ptr [esi]
:00438AFD 46 inc esi
:00438AFE EB18 jmp 00438B18

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438AF0(C)
|
:00438B00 33C0 xor eax, eax
:00438B02 EB14 jmp 00438B18

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438B20(C)
|
:00438B04 0FBECB movsx ecx, bl
:00438B07 8BD7 mov edx, edi
:00438B09 8A1E mov bl, byte ptr [esi]
:00438B0B 03D2 add edx, edx
:00438B0D 8D1492 lea edx, dword ptr [edx+4*edx]
:00438B10 03D1 add edx, ecx
:00438B12 83C2D0 add edx, FFFFFFD0
:00438B15 46 inc esi
:00438B16 8BFA mov edi, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00438AFE(U), :00438B02(U)
|
:00438B18 80FB30 cmp bl, 30
:00438B1B 7C05 jl 00438B22
:00438B1D 80FB39 cmp bl, 39
:00438B20 7EE2 jle 00438B04

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438B1B(C)
|
:00438B22 85C0 test eax, eax———————不管别的，将这一锅改为：mov eax,45303DA5
:00438B24 7406 je 00438B2C———————————— nop
:00438B26 8BC7 mov eax, edi———————————— nop
:00438B28 F7D8 neg eax—————————————— nop
:00438B2A EB02 jmp 00438B2E———————————— nop
nop
* Referenced by a (U)nconditional or (C)onditional Jump at Address: nop
|:00438B24(C) nop
|
:00438B2C 8BC7 mov eax, edi———————一共7个nop，这样字节数刚好。这样退出此call后eax就是45303DA5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438B2A(U)
|
:00438B2E 5F pop edi
:00438B2F 5E pop esi
:00438B30 5B pop ebx
:00438B31 5D pop ebp
:00438B32 C3 ret

最后整理：
用UltraEdit载入OicqHack.exe
查找：7c 05 80 fb 39 7e e2 85 c0 74 06 8b c7 f7 d8 eb 02 8b c7 5f 5e 5b 5d
改为：— — — — — — — b8 a5 3d 30 45 90 90 90 90 90 90 90 — — — —
注：（ — 为不改变）

改完收工！！！

经过以上其实还有问题，你们自己看看动动手吧。

标 题:将程序的Serial改成0，注册码填0就是注册版,haha....我发现有在先算oicqpass的东西，但是没有搞到，这种东... (140字)
发信人:zombieys
时 间:2001-4-24 16:00:47
详细信息:

标题: 将程序的Serial改成0，注册码填0就是注册版,haha....我发现有在先算oicqpass的东西，但是没有搞到，这种东西放出来就会天下大乱的。


PE EXPLORER 1.3

 标 题:如何完美破解PE EXPLORER 1.3（加入BCG的第二篇） (9千字)
发信人:大老
时 间:2001-6-29 12:51:00
详细信息:
如何完美破解PE EXPLORER 1.3（加入BCG的第二篇）

PE EXPLORER 1.3是个非常不错的CRACK辅助软件可以对PE格式的文件进行反编译属性编辑等等！
破解人： 大老
注册方式：注册码
使用限制：30天试用
工具：TRW2000 W32DASM大老专版
大老的主页：HTTP://DALAO2001.YEAH.NET
软件下载：www.exetools
这是我第二次在破解这个程序它的加密方法和上一版没有变。好咱们来破掉它.
第一步算出它的注册码！
=====================================================================
:004D29F1 8D4000 lea eax, dword ptr [eax+00]
:004D29F4 55 push ebp
:004D29F5 8BEC mov ebp, esp
:004D29F7 83C4BC add esp, FFFFFFBC
:004D29FA 53 push ebx
:004D29FB 56 push esi
:004D29FC 33D2 xor edx, edx
:004D29FE 8955BC mov dword ptr [ebp-44], edx
:004D2A01 8955E8 mov dword ptr [ebp-18], edx
:004D2A04 8955E4 mov dword ptr [ebp-1C], edx
:004D2A07 8945EC mov dword ptr [ebp-14], eax
:004D2A0A 33C0 xor eax, eax
:004D2A0C 55 push ebp
:004D2A0D 68812C4D00 push 004D2C81
:004D2A12 64FF30 push dword ptr fs:[eax]
:004D2A15 648920 mov dword ptr fs:[eax], esp
:004D2A18 8D45C3 lea eax, dword ptr [ebp-3D]
:004D2A1B B165 mov cl, 65
:004D2A1D BA21000000 mov edx, 00000021
:004D2A22 E86500F3FF call 00402A8C
:004D2A27 33C0 xor eax, eax
:004D2A29 8945F8 mov dword ptr [ebp-08], eax
:004D2A2C 33C0 xor eax, eax
:004D2A2E 8945F4 mov dword ptr [ebp-0C], eax
:004D2A31 8D45C3 lea eax, dword ptr [ebp-3D]
:004D2A34 8B159CF94E00 mov edx, dword ptr [004EF99C]
:004D2A3A E8A14CF3FF call 004076E0
:004D2A3F 8D45C3 lea eax, dword ptr [ebp-3D]
:004D2A42 8945FC mov dword ptr [ebp-04], eax
:004D2A45 60 pushad
:004D2A46 8B7DFC mov edi, dword ptr [ebp-04]
:004D2A49 B818E41736 mov eax, 3617E418
:004D2A4E 3107 xor dword ptr [edi], eax
:004D2A50 B82EFC35A9 mov eax, A935FC2E
:004D2A55 314704 xor dword ptr [edi+04], eax
:004D2A58 B8B972D857 mov eax, 57D872B9
:004D2A5D 314708 xor dword ptr [edi+08], eax
:004D2A60 B837B43D49 mov eax, 493DB437
:004D2A65 31470C xor dword ptr [edi+0C], eax
:004D2A68 8B07 mov eax, dword ptr [edi]
:004D2A6A 334704 xor eax, dword ptr [edi+04]
:004D2A6D 8B5F08 mov ebx, dword ptr [edi+08]
:004D2A70 335F0C xor ebx, dword ptr [edi+0C]
:004D2A73 8945F8 mov dword ptr [ebp-08], eax
:004D2A76 895DF4 mov dword ptr [ebp-0C], ebx
:004D2A79 61 popad
:004D2A7A A1A0F94E00 mov eax, dword ptr [004EF9A0]
:004D2A7F E85C11F3FF call 00403BE0
:004D2A84 83F810 cmp eax, 00000010《——比较注册码是否是16位
:004D2A87 0F8CD1010000 jl 004D2C5E
:004D2A8D 8D45E8 lea eax, dword ptr [ebp-18]
:004D2A90 50 push eax
:004D2A91 B908000000 mov ecx, 00000008
:004D2A96 BA01000000 mov edx, 00000001
:004D2A9B A1A0F94E00 mov eax, dword ptr [004EF9A0]
:004D2AA0 E83F13F3FF call 00403DE4
:004D2AA5 8D45E4 lea eax, dword ptr [ebp-1C]
:004D2AA8 50 push eax
:004D2AA9 B908000000 mov ecx, 00000008
:004D2AAE BA09000000 mov edx, 00000009
:004D2AB3 A1A0F94E00 mov eax, dword ptr [004EF9A0]
:004D2AB8 E82713F3FF call 00403DE4
:004D2ABD 8D4DBC lea ecx, dword ptr [ebp-44]
:004D2AC0 BA08000000 mov edx, 00000008
:004D2AC5 8B45F8 mov eax, dword ptr [ebp-08]
:004D2AC8 E8DB45F3FF call 004070A8
:004D2ACD 8B55BC mov edx, dword ptr [ebp-44]
:004D2AD0 8B45E8 mov eax, dword ptr [ebp-18]前8位的真假注册码
:004D2AD3 E81812F3FF call 00403CF0《—比较前八位注册码
:004D2AD8 0F8560010000 jne 004D2C3E=>跳就OVER
:004D2ADE 8D4DBC lea ecx, dword ptr [ebp-44]
:004D2AE1 BA08000000 mov edx, 00000008
:004D2AE6 8B45F4 mov eax, dword ptr [ebp-0C]
:004D2AE9 E8BA45F3FF call 004070A8
:004D2AEE 8B55BC mov edx, dword ptr [ebp-44]
:004D2AF1 8B45E4 mov eax, dword ptr [ebp-1C]后8位的真假注册码
:004D2AF4 E8F711F3FF call 00403CF0《—比较后八位注册码
:004D2AF9 0F853F010000 jne 004D2C3E=>跳就OVER
:004D2AFF B88CF94E00 mov eax, 004EF98C
:004D2B04 8B159CF94E00 mov edx, dword ptr [004EF99C]
:004D2B0A E8A90EF3FF call 004039B8
:004D2B0F B890F94E00 mov eax, 004EF990
:004D2B14 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004D2B17 8B55E8 mov edx, dword ptr [ebp-18]
:004D2B1A E80D11F3FF call 00403C2C
:004D2B1F B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"``A淍LA訞孉
MmrSra媡@"
|
:004D2B21 A1D0C94000 mov eax, dword ptr [0040C9D0]
:004D2B26 E86502F3FF call 00402D90
:004D2B2B 8BD8 mov ebx, eax
:004D2B2D 8BC3 mov eax, ebx
:004D2B2F E860D4F3FF call 0040FF94
:004D2B34 BA00020000 mov edx, 00000200
:004D2B39 8BC3 mov eax, ebx
:004D2B3B 8B08 mov ecx, dword ptr [eax]
:004D2B3D FF11 call dword ptr [ecx]
:004D2B3F 33C9 xor ecx, ecx
:004D2B41 33D2 xor edx, edx
:004D2B43 8BC3 mov eax, ebx
:004D2B45 8B30 mov esi, dword ptr [eax]
:004D2B47 FF560C call [esi+0C]
:004D2B4A BE08000000 mov esi, 00000008
:004D2B4F 8D55C3 lea edx, dword ptr [ebp-3D]
:004D2B52 B920000000 mov ecx, 00000020
:004D2B57 8BC3 mov eax, ebx
:004D2B59 E88ED0F3FF call 0040FBEC
:004D2B5E 8D55F8 lea edx, dword ptr [ebp-08]
:004D2B61 B904000000 mov ecx, 00000004
:004D2B66 8BC3 mov eax, ebx
:004D2B68 E87FD0F3FF call 0040FBEC
:004D2B6D 8D55F4 lea edx, dword ptr [ebp-0C]
:004D2B70 B904000000 mov ecx, 00000004

======================================================================

我的注册码是dalao/9B2B793D1EE5C68E
第二步去掉时间限制！
这个软件很奇怪！当你输入正确的注册码后将在PE EXPLORER的目录中生成一pexdata.rdat文件但是还是有时间限制！我猜这个软件的注册有两方面一个是注册码一个是网上注册然后把注册标志写到某个地方！才能完全注册去掉时间限制！不过不要紧下面中只要改半个字节即可去掉时间限制！嘿嘿!
==============================================================================
* Possible StringData Ref from Code Obj ->"12345678FEDCBA98"
|
:004D33A0 8B15A8F94E00 mov edx, dword ptr [004EF9A8]
:004D33A6 E80D06F3FF call 004039B8
:004D33AB 8B45F0 mov eax, dword ptr [ebp-10]
:004D33AE 80782401 cmp byte ptr [eax+24], 01
:004D33B2 7508 jne 004D33BC
:004D33B4 8B45F0 mov eax, dword ptr [ebp-10]
:004D33B7 E838F6FFFF call 004D29F4
:004D33BC E8AFDAFFFF call 004D0E70
:004D33C1 8B45F0 mov eax, dword ptr [ebp-10]====》注意这个！
:004D33CB 0F85DA070000 jne 004D3BAB =======〉不调就是试用版
:004D33D1 8B45F0 mov eax, dword ptr [ebp-10]
:004D33D4 8B9834020000 mov ebx, dword ptr [eax+00000234]
:004D33DA 83C305 add ebx, 00000005

===============================================================================
一般改法只要改掉这句004D33CB 0F85DA070000 jne 004D3BAB
把（0F85DA070000改成0F84DA070000）即可！
现在咱们要提升一个档次！我讲讲高级的改法！嘿嘿！
大家注意[eax+00000254]这个内存地址！找出和这个注册标志相关的程序！
|:004D33C4 80B85402000000 cmp byte ptr [eax+00000254], 00
用BPM 下断点！以下就是核心程序
:004D3169 89836C020000 mov dword ptr [ebx+0000026C], eax
:004D316F 8B8364020000 mov eax, dword ptr [ebx+00000264]
:004D3175 3B45F0 cmp eax, dword ptr [ebp-10]
:004D3178 751A jne 004D3194 ===》跳就是注册版
:004D317A 8B8368020000 mov eax, dword ptr [ebx+00000268]
:004D3180 3B45EC cmp eax, dword ptr [ebp-14]
:004D3183 750F jne 004D3194 ===》跳就是注册版
:004D3185 8B836C020000 mov eax, dword ptr [ebx+0000026C]
:004D318B 3B45E8 cmp eax, dword ptr [ebp-18]
:004D318E 7504 jne 004D3194 ===》跳就是注册版
:004D3190 33C0 xor eax, eax
:004D3192 EB02 jmp 004D3196 ===〉到这你就OVER
:004D3194 B001 mov al, 01
:004D3196 888354020000 mov byte ptr [ebx+00000254], al
:004D319C 8B45F4 mov eax, dword ptr [ebp-0C]
:004D319F 50 push eax
:004D31A0 B85C0D4D00 mov eax, 004D0D5C
:004D31A5 668B0D9C624F00 mov cx, word ptr [004F629C]
:004D31AC 8B150CFA4E00 mov edx, dword ptr [004EFA0C]
:004D31B2 E8C1DCFFFF call 004D0E78
:004D31B7 33C0 xor eax, eax
:004D31B9 5A pop edx
:004D31BA 59 pop ecx
:004D31BB 59 pop ecx
大家现在明白了吧嘿嘿！高级改法吧004D3178地址的（750F改成EB0F)
收工有啥错误的地方请大家多提批评！

大老
http://dalao2001.yeah.net
2001.6.29


PE Explorer Version 1.40

 标 题:对不起，该软件未经测试便弄上来，让大家笑话了，下面是基本完整破解版。 (19千字)
发信人:KanKer
时 间:2001-8-17 1:34:00
详细信息:
PE Explorer Version 1.40暴力破解提示

主要为帮助上面那位朋友解决汉化的障碍。
下载地址：
http://realdown.com/$www.winzheng.com$/system/PE.Explorer.v1.40.WinAll-BROKEN/bpx14001.zip

******************************************

经过追踪，可知以下跳转可解决时间过期问题：
:004DD547 A174C24F00 mov eax, dword ptr [004FC274]
:004DD54C C7003F000000 mov dword ptr [eax], 0000003F
:004DD552 833DB4B94F0000 cmp dword ptr [004FB9B4], 00000000
:004DD559 740D je 004DD568 **不跳740D->9090**(1)
:004DD55B 833DB8B94F0000 cmp dword ptr [004FB9B8], 00000000
:004DD562 0F852B010000 jne 004DD693 **跳,0F852B010000->
E92C01000090**(2)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD559(C)
|
:004DD568 8B45EC mov eax, dword ptr [ebp-14]
:004DD56B E8689FF2FF call 004074D8
:004DD570 84C0 test al, al
:004DD572 0F84FB000000 je 004DD673
:004DD578 33C0 xor eax, eax
:004DD57A 55 push ebp
:004DD57B 6835D64D00 push 004DD635
:004DD580 64FF30 push dword ptr fs:[eax]
:004DD583 648920 mov dword ptr fs:[eax], esp
:004DD586 8B45F0 mov eax, dword ptr [ebp-10]
:004DD589 8B8030020000 mov eax, dword ptr [eax+00000230]
:004DD58F 8B55EC mov edx, dword ptr [ebp-14]
:004DD592 E8912DF3FF call 00410328
:004DD597 8B45F0 mov eax, dword ptr [ebp-10]
:004DD59A 83C028 add eax, 00000028
:004DD59D 33C9 xor ecx, ecx
:004DD59F BA00020000 mov edx, 00000200
:004DD5A4 E8E354F2FF call 00402A8C
:004DD5A9 8B45F0 mov eax, dword ptr [ebp-10]
:004DD5AC 8B8030020000 mov eax, dword ptr [eax+00000230]
:004DD5B2 E81128F3FF call 0040FDC8
:004DD5B7 3D00020000 cmp eax, 00000200
:004DD5BC 753B jne 004DD5F9
:004DD5BE 8B45F0 mov eax, dword ptr [ebp-10]
:004DD5C1 8B8030020000 mov eax, dword ptr [eax+00000230]
:004DD5C7 33C9 xor ecx, ecx
:004DD5C9 33D2 xor edx, edx
:004DD5CB 8B18 mov ebx, dword ptr [eax]
:004DD5CD FF530C call [ebx+0C]
:004DD5D0 8B45F0 mov eax, dword ptr [ebp-10]
:004DD5D3 8B9830020000 mov ebx, dword ptr [eax+00000230]
:004DD5D9 8BC3 mov eax, ebx
:004DD5DB E8E827F3FF call 0040FDC8
:004DD5E0 8BC8 mov ecx, eax
:004DD5E2 8B45F0 mov eax, dword ptr [ebp-10]
:004DD5E5 8D5028 lea edx, dword ptr [eax+28]
:004DD5E8 8BC3 mov eax, ebx
:004DD5EA E81128F3FF call 0040FE00
:004DD5EF 8B45F0 mov eax, dword ptr [ebp-10]
:004DD5F2 E881F9FFFF call 004DCF78
:004DD5F7 EB32 jmp 004DD62B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD5BC(C)
|
:004DD5F9 8B45F0 mov eax, dword ptr [ebp-10]
:004DD5FC 83C028 add eax, 00000028
:004DD5FF 33C9 xor ecx, ecx
:004DD601 BA00020000 mov edx, 00000200
:004DD606 E88154F2FF call 00402A8C
:004DD60B B8B4B94F00 mov eax, 004FB9B4

* Possible StringData Ref from Code Obj ->"trial version"
|
:004DD610 8B15CCB94F00 mov edx, dword ptr [004FB9CC]
:004DD616 E89D63F2FF call 004039B8
:004DD61B B8B8B94F00 mov eax, 004FB9B8

* Possible StringData Ref from Code Obj ->"12345678FEDCBA98"
|
:004DD620 8B15D0B94F00 mov edx, dword ptr [004FB9D0]
:004DD626 E88D63F2FF call 004039B8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD5F7(U)
|
:004DD62B 33C0 xor eax, eax
:004DD62D 5A pop edx
:004DD62E 59 pop ecx
:004DD62F 59 pop ecx
:004DD630 648910 mov dword ptr fs:[eax], edx
:004DD633 EB5E jmp 004DD693
:004DD635 E94E5BF2FF jmp 00403188
:004DD63A 8B45F0 mov eax, dword ptr [ebp-10]
:004DD63D 83C028 add eax, 00000028
:004DD640 33C9 xor ecx, ecx
:004DD642 BA00020000 mov edx, 00000200
:004DD647 E84054F2FF call 00402A8C
:004DD64C B8B4B94F00 mov eax, 004FB9B4

* Possible StringData Ref from Code Obj ->"trial version"
|
:004DD651 8B15CCB94F00 mov edx, dword ptr [004FB9CC]
:004DD657 E85C63F2FF call 004039B8
:004DD65C B8B8B94F00 mov eax, 004FB9B8

* Possible StringData Ref from Code Obj ->"12345678FEDCBA98"
|
:004DD661 8B15D0B94F00 mov edx, dword ptr [004FB9D0]
:004DD667 E84C63F2FF call 004039B8
:004DD66C E8BB5DF2FF call 0040342C
:004DD671 EB20 jmp 004DD693

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD572(C)
|
:004DD673 B8B4B94F00 mov eax, 004FB9B4

* Possible StringData Ref from Code Obj ->"trial version"
|
:004DD678 8B15CCB94F00 mov edx, dword ptr [004FB9CC]
:004DD67E E83563F2FF call 004039B8
:004DD683 B8B8B94F00 mov eax, 004FB9B8

* Possible StringData Ref from Code Obj ->"12345678FEDCBA98"
|
:004DD688 8B15D0B94F00 mov edx, dword ptr [004FB9D0]
:004DD68E E82563F2FF call 004039B8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004DD562(C), :004DD633(U), :004DD671(U)
|
:004DD693 8B45F0 mov eax, dword ptr [ebp-10]
:004DD696 80782401 cmp byte ptr [eax+24], 01
:004DD69A 7508 jne 004DD6A4 **跳，75->EB**(3)
:004DD69C 8B45F0 mov eax, dword ptr [ebp-10]
:004DD69F E838F6FFFF call 004DCCDC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DD69A(C)
|
:004DD6A4 E817D9FFFF call 004DAFC0
:004DD6A9 8B45F0 mov eax, dword ptr [ebp-10]
:004DD6AC 80B85402000000 cmp byte ptr [eax+00000254], 00
:004DD6B3 0F85F5070000 jne 004DDEAE **跳,0F85F5070000->
E9F607000090**(4)
:004DD6B9 8B45F0 mov eax, dword ptr [ebp-10]
:004DD6BC 8B9834020000 mov ebx, dword ptr [eax+00000234]
:004DD6C2 83C305 add ebx, 00000005
:004DD6C5 8D95C8FCFFFF lea edx, dword ptr [ebp+FFFFFCC8]
:004DD6CB 8BC3 mov eax, ebx

上面标号处修改，共4处。

************************************************

下面破除过期功能限制：
经调试可知，下面程序段为功能限制处（可设断destroywindow来捕获）：

:004F6AAC 0B00 or eax, dword ptr [eax]
:004F6AAE 0000 add byte ptr [eax], al
:004F6AB0 27 daa
:004F6AB1 206E6F and byte ptr [esi+6F], ch
:004F6AB4 7420 je 004F6AD6
:004F6AB6 666F outsw
:004F6AB8 756E jne 004F6B28
:004F6ABA 64000400 add byte ptr fs:[eax+eax], al
:004F6ABE 0000 add byte ptr [eax], al
:004F6AC0 53 push ebx
:004F6AC1 8B15E8BD4F00 mov edx, dword ptr [004FBDE8]
:004F6AC7 833A00 cmp dword ptr [edx], 00000000
:004F6ACA 740A je 004F6AD6 **设断** （1）
:004F6ACC 8B1DE8BD4F00 mov ebx, dword ptr [004FBDE8]
:004F6AD2 8B1B mov ebx, dword ptr [ebx]
:004F6AD4 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004F6AB4(C), :004F6ACA(C)
|
:004F6AD6 5B pop ebx
:004F6AD7 C3 ret

* Referenced by a CALL at Address:
|:004F7BF2
|
:004F6AD8 53 push ebx
:004F6AD9 8B1528BF4F00 mov edx, dword ptr [004FBF28]
:004F6ADF 833A00 cmp dword ptr [edx], 00000000
:004F6AE2 740A je 004F6AEE **设断** （2）
:004F6AE4 8B1D28BF4F00 mov ebx, dword ptr [004FBF28]
:004F6AEA 8B1B mov ebx, dword ptr [ebx]
:004F6AEC FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6AE2(C)
|
:004F6AEE 5B pop ebx
:004F6AEF C3 ret

* Referenced by a CALL at Address:
|:004F7C12
|
:004F6AF0 53 push ebx
:004F6AF1 8B1578C14F00 mov edx, dword ptr [004FC178]
:004F6AF7 833A00 cmp dword ptr [edx], 00000000
:004F6AFA 740A je 004F6B06 **设断** （3）
:004F6AFC 8B1D78C14F00 mov ebx, dword ptr [004FC178]
:004F6B02 8B1B mov ebx, dword ptr [ebx]
:004F6B04 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6AFA(C)
|
:004F6B06 5B pop ebx
:004F6B07 C3 ret

* Referenced by a CALL at Address:
|:004F7C32
|
:004F6B08 53 push ebx
:004F6B09 8B15A0C04F00 mov edx, dword ptr [004FC0A0]
:004F6B0F 833A00 cmp dword ptr [edx], 00000000
:004F6B12 740A je 004F6B1E **设断** （4）
:004F6B14 8B1DA0C04F00 mov ebx, dword ptr [004FC0A0]
:004F6B1A 8B1B mov ebx, dword ptr [ebx]
:004F6B1C FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6B12(C)
|
:004F6B1E 5B pop ebx
:004F6B1F C3 ret

* Referenced by a CALL at Address:
|:004F4F6E
|
:004F6B20 53 push ebx
:004F6B21 8B157CBC4F00 mov edx, dword ptr [004FBC7C]
:004F6B27 833A00 cmp dword ptr [edx], 00000000
:004F6B2A 740A je 004F6B36 **设断** （5）
:004F6B2C 8B1D7CBC4F00 mov ebx, dword ptr [004FBC7C]
:004F6B32 8B1B mov ebx, dword ptr [ebx]
:004F6B34 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6B2A(C)
|
:004F6B36 5B pop ebx
:004F6B37 C3 ret

:004F6B38 53 push ebx
:004F6B39 8B15E4BD4F00 mov edx, dword ptr [004FBDE4]
:004F6B3F 833A00 cmp dword ptr [edx], 00000000
:004F6B42 740A je 004F6B4E **设断** （6）
:004F6B44 8B1DE4BD4F00 mov ebx, dword ptr [004FBDE4]
:004F6B4A 8B1B mov ebx, dword ptr [ebx]
:004F6B4C FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6B42(C)
|
:004F6B4E 5B pop ebx
:004F6B4F C3 ret

* Referenced by a CALL at Address:
|:004F7CC2
|
:004F6B50 53 push ebx
:004F6B51 A150BD4F00 mov eax, dword ptr [004FBD50]
:004F6B56 833800 cmp dword ptr [eax], 00000000
:004F6B59 740C je 004F6B67 **设断** （7）
:004F6B5B 8B1D50BD4F00 mov ebx, dword ptr [004FBD50]
:004F6B61 8B1B mov ebx, dword ptr [ebx]
:004F6B63 8BC2 mov eax, edx
:004F6B65 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6B59(C)
|
:004F6B67 5B pop ebx
:004F6B68 C3 ret

:004F6B69 8D4000 lea eax, dword ptr [eax+00]
:004F6B6C 55 push ebp
:004F6B6D 8BEC mov ebp, esp
:004F6B6F 53 push ebx
:004F6B70 A144BE4F00 mov eax, dword ptr [004FBE44]
:004F6B75 833800 cmp dword ptr [eax], 00000000
:004F6B78 7411 je 004F6B8B **设断** （8）
:004F6B7A 8B1D44BE4F00 mov ebx, dword ptr [004FBE44]
:004F6B80 8B1B mov ebx, dword ptr [ebx]
:004F6B82 8BC2 mov eax, edx
:004F6B84 8BD1 mov edx, ecx
:004F6B86 8A4D08 mov cl, byte ptr [ebp+08]
:004F6B89 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6B78(C)
|
:004F6B8B 5B pop ebx
:004F6B8C 5D pop ebp
:004F6B8D C20400 ret 0004

:004F6B90 55 push ebp
:004F6B91 8BEC mov ebp, esp
:004F6B93 53 push ebx
:004F6B94 A100C14F00 mov eax, dword ptr [004FC100]
:004F6B99 833800 cmp dword ptr [eax], 00000000
:004F6B9C 7411 je 004F6BAF **设断** （9）
:004F6B9E 8B1D00C14F00 mov ebx, dword ptr [004FC100]
:004F6BA4 8B1B mov ebx, dword ptr [ebx]
:004F6BA6 8BC2 mov eax, edx
:004F6BA8 8BD1 mov edx, ecx
:004F6BAA 8A4D08 mov cl, byte ptr [ebp+08]
:004F6BAD FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6B9C(C)
|
:004F6BAF 5B pop ebx
:004F6BB0 5D pop ebp
:004F6BB1 C20400 ret 0004

:004F6BB4 55 push ebp
:004F6BB5 8BEC mov ebp, esp
:004F6BB7 53 push ebx
:004F6BB8 A170BD4F00 mov eax, dword ptr [004FBD70]
:004F6BBD 833800 cmp dword ptr [eax], 00000000
:004F6BC0 7411 je 004F6BD3 **设断** （10）
:004F6BC2 8B1D70BD4F00 mov ebx, dword ptr [004FBD70]
:004F6BC8 8B1B mov ebx, dword ptr [ebx]
:004F6BCA 8BC2 mov eax, edx
:004F6BCC 8BD1 mov edx, ecx
:004F6BCE 8A4D08 mov cl, byte ptr [ebp+08]
:004F6BD1 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6BC0(C)
|
:004F6BD3 5B pop ebx
:004F6BD4 5D pop ebp
:004F6BD5 C20400 ret 0004

:004F6BD8 53 push ebx
:004F6BD9 A120C24F00 mov eax, dword ptr [004FC220]
:004F6BDE 833800 cmp dword ptr [eax], 00000000
:004F6BE1 740C je 004F6BEF **设断** （11）
:004F6BE3 8B1D20C24F00 mov ebx, dword ptr [004FC220]
:004F6BE9 8B1B mov ebx, dword ptr [ebx]
:004F6BEB 8BC2 mov eax, edx
:004F6BED FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6BE1(C)
|
:004F6BEF 5B pop ebx
:004F6BF0 C3 ret

:004F6BF1 8D4000 lea eax, dword ptr [eax+00]

* Referenced by a CALL at Addresses:
|:004F7C56 , :004F7C7B , :004F7CA0
|
:004F6BF4 53 push ebx
:004F6BF5 A1FCBD4F00 mov eax, dword ptr [004FBDFC]
:004F6BFA 833800 cmp dword ptr [eax], 00000000
:004F6BFD 740C je 004F6C0B **设断** （12）
:004F6BFF 8B1DFCBD4F00 mov ebx, dword ptr [004FBDFC]
:004F6C05 8B1B mov ebx, dword ptr [ebx]
:004F6C07 8BC2 mov eax, edx
:004F6C09 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6BFD(C)
|
:004F6C0B 5B pop ebx
:004F6C0C C3 ret

:004F6C0D 8D4000 lea eax, dword ptr [eax+00]

* Referenced by a CALL at Addresses:
|:004CFBF4 , :004CFC31 , :004CFC6E , :004F7CE6 , :004F7D0B
|:004F7D30
|
:004F6C10 53 push ebx
:004F6C11 A108BF4F00 mov eax, dword ptr [004FBF08]
:004F6C16 833800 cmp dword ptr [eax], 00000000
:004F6C19 740C je 004F6C27 **设断** （13）
:004F6C1B 8B1D08BF4F00 mov ebx, dword ptr [004FBF08]
:004F6C21 8B1B mov ebx, dword ptr [ebx]
:004F6C23 8BC2 mov eax, edx
:004F6C25 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6C19(C)
|
:004F6C27 5B pop ebx
:004F6C28 C3 ret

:004F6C29 8D4000 lea eax, dword ptr [eax+00]

* Referenced by a CALL at Address:
|:004F4F82
|
:004F6C2C 53 push ebx
:004F6C2D A1CCBC4F00 mov eax, dword ptr [004FBCCC]
:004F6C32 833800 cmp dword ptr [eax], 00000000
:004F6C35 740C je 004F6C43 **设断** （14）
:004F6C37 8B1DCCBC4F00 mov ebx, dword ptr [004FBCCC]
:004F6C3D 8B1B mov ebx, dword ptr [ebx]
:004F6C3F 8BC2 mov eax, edx
:004F6C41 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F6C35(C)
|
:004F6C43 5B pop ebx
:004F6C44 C3 ret

功能限制标号共有14处，下面以修改（1）处为例：

:004F6ABE 0000 add byte ptr [eax], al
:004F6AC0 53 push ebx
:004F6AC1 8B15E8BD4F00 mov edx, dword ptr [004FBDE8]
:004F6AC7 833A00 cmp dword ptr [edx], 00000000
:004F6ACA 740A je 004F6AD6 **设断** （1）
:004F6ACC 8B1DE8BD4F00 mov ebx, dword ptr [004FBDE8]
:004F6AD2 8B1B mov ebx, dword ptr [ebx]
:004F6AD4 FFD3 call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004F6AB4(C), :004F6ACA(C)
|
:004F6AD6 5B pop ebx
:004F6AD7 C3 ret

在（1）设断拦住后，走到004F6AD4处，看ebx的值是多少（此处为4cbad8），记下后如下修改代码。

原代码：
:004F6ACA 740A je 004F6AD6
:004F6ACC 8B1DE8BD4F00 mov ebx, dword ptr [004FBDE8]
:004F6AD2 8B1B mov ebx, dword ptr [ebx]

改为：
:004F6ACA BBD8BA4C00 mov ebx,4cbad8 -->追到的EBX的值
:004F6ACF 90 nop
:004F6AD0 90 nop
:004F6AD1 90 nop
:004F6AD2 90 nop
:004F6AD3 90 nop

其它13处设断追值修改法同上。下面列出修改后的代码：

（1） :004F6ACA-->BBD8BA4C009090909090
（2） :004F6AE2-->BBA0C44C009090909090
（3） :004F6AFA-->BB40C54C009090909090
（4） :004F6B12-->BB3CCF4C009090909090
（5） :004F6B2A-->BB4CD64C009090909090
（6） :004F6B42-->BBA8E64C009090909090
（7） :004F6B59-->BB08E94C009090909090
（8） :004F6B78-->BB40014D009090909090
（9） :004F6B9C-->BB34044D009090909090
（10）:004F6BC0-->BBF8054D009090909090
（11）:004F6BE1-->暂未找到，请有兴趣的朋友自行测试修改！
（12）:004F6BFD-->BBD8EC4C009090909090
（13）:004F6C19-->BBA4F54C009090909090
（14）:004F6C35-->BBA8FC4C009090909090

至此基本修改完毕！

补丁下载地址：
http://user.7host.com/kanker/crack/pexplorer-crack.exe

<Cracked by KanKer>

有空的时候来坎坷亦乐园坐坐
http://kanker.ccoo.com


PE-explorer 1.4

 标 题:PE-explorer 1.4 的简要破解过程(1千字)
发信人:4
时 间:2001-8-8 8:38:12
详细信息:

PE-explorer 1.4 的简要破解过程。

004DD69F: E838F6FFFF call 0004DCCDC
004DD6A4: E817D9FFFF call 0004DAFC0
004DD6A9: 8B45F0 mov eax,[ebp][-0010]
004DD6AC: 80B85402000000 cmp b,[eax][000000254],000 ;" "
004DD6B3: 0F85F5070000 jne 0004DDEAE <<==修改 jne 为 je
004DD6B9: 8B45F0 mov eax,[ebp][-0010]
004DD6BC: 8B9834020000 mov ebx,[eax][000000234]
004DD6C2: 83C305 add ebx,005 ;""
004DD6C5: 8D95C8FCFFFF lea edx,[ebp][0FFFFFCC8]
004DD6CB: 8BC3 mov eax,ebx
004DD6CD: E8DAA2F2FF call 0004079AC
004DD6D2: 8B95C8FCFFFF mov edx,[ebp][0FFFFFCC8]
004DD6D8: B8D4B94F00 mov eax,0004FB9D4
004DD6DD: E8D662F2FF call 0004039B8
004DD6E2: A1D4B94F00 mov eax,[0004FB9D4]

使用Winhex打开pexplorer.exe, 然后找出offset Addreess : 000dcab3h，
再修改0F85F5070000 为 0F84F5070000。

先用 “名字：444 注册号：FA7349671EE5C68E” 注册， 跟着使用Winhex打开pexplorer.exe, 然后找出offset Addreess : 000dcab3h， 再修改0F85F5070000 为 0F84F5070000。


Picturetoexe v3.60 beta #2

 标 题:picturetoexe v3.60 beta #2不完全破解 (2千字)
发信人:kingtall
时 间:2001-4-30 13:28:53
详细信息:
本篇破解并不完全，希望起到抛砖引玉的作用。
作者：kingtall

软件名称：picturetoexe v3.60 beta #2
URL ftp://ftp.download.com.cn/pub/new_multimedia/apr_beta.zip
工具：trw2000,superbpm,dede

未注册时有三个限制。
每次运行程序，有nag，提示注册；
选中图片后，按preview按钮，有对话框，说你没注册；
运行create做出的文件，画面上有提示注册文字。

首先脱壳。因为用bo2k找不到入口点，所以手动跟踪，找到入口为517648。
用trw pedump命令脱壳。脱壳后的文件没有修复注册表，不能运行，但可以反汇编。
用dede反汇编，不用管出错信息，一路按确定，最后dump successful。

选中procedure/tform1/button7click，右键选show additonal data，显示caption='preview'，这就是我们要找的。右键选disassemble，可见
00504F5C 803D81C3510000 cmp byte ptr [$51C381], $00 <==注册标志，非0表示注册。
00504F63 7516 jnz 00504F7B
00504F65 B940000000 mov ecx, $00000040
00504F6A 8B1568C65100 mov edx, [$51C668]
00504F70 A104C65100 mov eax, dword ptr [$51C604]

|
00504F75 E842AAFBFF call 004BF9BC
00504F7A C3 ret

00504F7B E926000000 jmp 00504FA6 <==直接跳到ret，难道注册后也不能preview?
00504F80 46 inc esi
00504F81 F1 DB $F1 //
00504F82 4F dec edi
00504F83 8DF6 lea esi, esi
00504F85 E9565968B1 jmp B1B8A8E0
00504F8A D5 aad
00504F8B 9C pushf
00504F8C A2428B9357 mov byte ptr [$57938B42], al
00504F91 F60C5C DB $F6, $0C, $5C // byte ptr [esp+ebx*2]
00504F94 AC lodsb
00504F95 16 push ss
00504F96 F6A375F515C5 mul byte ptr [ebx+$C515F575], al
00504F9C 9B wait
00504F9D B456 mov ah, $56
00504F9F 131B adc ebx, [ebx]
00504FA1 5F pop edi
00504FA2 2B4424AA sub eax, dword ptr [esp-$56]
00504FA6 C3 ret

现在找一找程序对[51C381]进行修改的地方。
用trw 装入 apr.exe，下bpm 51c381 ，g。trw第二次弹出时
0167:005043CA C60581C3510000 MOV BYTE [0051C381],00 <==改为1
0167:005043D1 E945000000 JMP 0050441B

只要在这里把[0051C381]改为1，做出的幻灯片就不包含提示注册信息，按preview按钮时没有响应。
只有开始的nag无法去掉。


Platypus Animator v5.4

标 题:乱解瞎破AviMaker (2千字)
发信人:alang
时 间:2001-1-2 4:40:06
详细信息:
破解AviMaker
---------------------------------------------------------------------
软件名称：Platypus Animator v5.4
软件简介：是一个给你最简单的操作方式制作AVI
动画的工具，可以让你选择bmp、dib、
gif、jpg、rle、pcx、tif、tga等格式
图形文件并搭配wav声音文件即可完成
AVI动画，内附avi动画观看功能，可以
让你随时边看边制作，相当方便。
软件下载：http://www.c-point.com/

破解人:阿郎
级别:处女(大笨鸟)
使用工具:w32dsm、UltraEdit
本人初学,如有不正确之处,请来信告知!
---------------------------------------------------------------------
这个软件在注册时，不管对错，都不弹出提示框。“大笨鸟”没见过这样情况，
怎么办？只有碰碰运气啦。
打开w32dsm装入AviMaker，查找REGISTER（俺想：这里面一定有关于REGISTER
的项目，如没有俺再想它法）。好幸运耶！

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406721(U)
| ^^^^^^^^^^^
:0040674C 8B5604 mov edx, dword ptr [esi+04]
:0040674F 57 push edi

* Reference To: USER32.AppendMenuA, Ord:0007h
|
:00406750 8B3D5C264A00 mov edi, dword ptr [004A265C]
:00406756 6A00 push 00000000
:00406758 6A00 push 00000000
:0040675A 6800080000 push 00000800
:0040675F 52 push edx
:00406760 FFD7 call edi
:00406762 8B4604 mov eax, dword ptr [esi+04]

* Possible StringData Ref from Data Obj ->"&Register..." //俺也不知是什么?可能是好东西吧.
|
:00406765 68004E4C00 push 004C4E00
:0040676A 6816040000 push 00000416

看到有下划线的00406721(U)吗?跳到 00406721处:

:00406711 FF1558264A00 Call dword ptr [004A2658]
:00406717 50 push eax
:00406718 E8D3000800 call 004867F0
:0040671D 8BF0 mov esi, eax
:0040671F 85F6 test esi, esi
:00406721 E926000000 jmp 0040674C //这是已经改过的
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00406726 0434 add al, 34
:00406728 59 pop ecx
:00406729 4B dec ebx
:0040672A 008D4C2404C7 add byte ptr [ebp+C704244C], cl
:00406730 44 inc esp
:00406731 2414 and al, 14
:00406733 0100 add dword ptr [eax], eax

在00406721处将 je 改为 jmp .为什么这样改?俺也不知道,瞎蒙呗.
现在退出,启动AviMaker,喂!怎么回事?连用户名和注册码都免输入
啦,帮助项内的注册栏没有啦.
这到好,省去俺不少闲工夫!QQQ!
B-B!

阿郎
langlirong@163.net
http://alang.shangdu.net
02/01/2001 晚

.-'''''-.
.' `.
: :
: :
: _/| :
: =/_/ :
`._/ | .'
( / ,|...-'
\_/^\/||__
_/~ `""~`"` \_
__/ -'/ `-._ `\_\__
/ /-'` `\ \ \-.\


PolyView 3.00.b5

标 题:PolyView 破解 (5千字)
发信人:alang
时 间:2000-12-31 7:28:50
详细信息:
PolyView 破解

软件名称：PolyView Version 3.00.b5
软件简介：看图工具，具有简单的图像处理功能。
软件下载：http://www.polybytes.com

破解人:阿郎
级别:菜菜...鸟级
本人初学,如有不正确之处,请来信告知!

PolyView Version 3.00.b5此软件可能版本老了一点,但对我这样的
初学者正好练练手实在合适不过的啦.
使用工具:w32dsm(作者是个天才)、UltraEdit（绝好的工具）
首先打开PolyView在注册处添入用户名贺密码，点击确定。这时跳
出提示窗，请记住提示语。
再打开w32dsam，装入PolyView，查找错误提示语，查找结果如下：
:0043EA4A EB1E jmp 0043EA6A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043E9A9(U)
| ^^^^^^^^^^^

* Possible Reference to String Resource ID=00141: "Unregistered"
|
:0043EA4C 688D000000 push 0000008D
:0043EA51 8BCF mov ecx, edi
:0043EA53 E886060600 call 0049F0DE
:0043EA58 53 push ebx
:0043EA59 53 push ebx

* Possible StringData Ref from Data Obj ->"Registration unsuccessful. Please "
->"verify that you have entered the "
->"information exactly as shown on "
->"your registration letter."
//错误提示处
|
:0043EA5A 68EC124F00 push 004F12EC
:0043EA5F 899E6C010000 mov dword ptr [esi+0000016C], ebx
:0043EA65 E888890600 call 004A73F2
从错误提示处向上看，看到了什么？“Unregistered”当然，再向上查看到什么？
对啦！看到了0043E9A9(U)是不是。此处是关键，他是从0043E9A9促跳转来的，
看看去！好嘞，说去就去：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043E978(U)
|
:0043E97F 898670010000 mov dword ptr [esi+00000170], eax
:0043E985 8D442478 lea eax, dword ptr [esp+78]
:0043E989 50 push eax
:0043E98A 8BCF mov ecx, edi
:0043E98C E821020600 call 0049EBB2
:0043E991 8B442474 mov eax, dword ptr [esp+74]
:0043E995 8B0F mov ecx, dword ptr [edi]
:0043E997 50 push eax
:0043E998 51 push ecx
:0043E999 89866C010000 mov dword ptr [esi+0000016C], eax
:0043E99F E8ACFBFEFF call 0042E550
:0043E9A4 83C408 add esp, 00000008
:0043E9A7 85C0 test eax, eax
:0043E9A9 E99E000000 jmp 0043EA4C //修改处
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:0043E9AE 003B add byte ptr [ebx], bh
:0043E9B0 EB0F jmp 0043E9C1
:0043E9B2 85B3000000E8 test dword ptr [ebx+E8000000], esi
:0043E9B8 61 popad
:0043E9B9 0E push cs
:0043E9BA 06 push es
:0043E9BB 0085C07410E8 add byte ptr [ebp+E81074C0], al
注意0043E9A9处,还等什么,等着上菜吗?改它!
好啦,启动PolyView,随便输入注册.好爽！提示注册成功。完工啦！吃饭去啦！

慢着！请留步！再启动PolyView，什么？竟然没有注册！*&^%$_@%$&*)(
此时想起猫少爷的理想:
“每天可以不睡觉,天天都有开心事.时间可以调进度,废除一夫一妻制.”(可能是这样吧)

还是回到现实来吧!静下心来!开动脑筋.
肯定在哪里还进行检测,沿着0043E9A9向上行,看到0043E99F了吗?此处很可疑.
不管它,看看再说,
:0042E550 64A100000000 mov eax, dword ptr fs:[00000000]

* Possible Reference to Menu: MenuID_00FF
|
:0042E556 6AFF push FFFFFFFF
:0042E558 6858464C00 push 004C4658
:0042E55D 50 push eax
:0042E55E 64892500000000 mov dword ptr fs:[00000000], esp
:0042E565 83EC08 sub esp, 00000008
:0042E568 53 push ebx
:0042E569 55 push ebp
:0042E56A 56 push esi
:0042E56B 57 push edi
:0042E56C 8B7C2428 mov edi, dword ptr [esp+28]
:0042E570 6880844F00 push 004F8480
:0042E575 57 push edi
:0042E576 E8C5000000 call 0042E640
:0042E57B 8B5C2434 mov ebx, dword ptr [esp+34]
:0042E57F 83C408 add esp, 00000008
:0042E582 3BC3 cmp eax, ebx
:0042E584 7518 jne 0042E59E //修改
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:0042E586 B801000000 mov eax, 00000001
:0042E58B 8B4C2418 mov ecx, dword ptr [esp+18]
:0042E58F 64890D00000000 mov dword ptr fs:[00000000], ecx
:0042E596 5F pop edi
:0042E597 5E pop esi
:0042E598 5D pop ebp
:0042E599 5B pop ebx
:0042E59A 83C414 add esp, 00000014
:0042E59D C3 ret
向下走!看到0042E584处了吗?ok!管它三七二十一、三八二十四。改！
在进入PolyView注册，退出。再进入PolyView哇噻！在关于项显示：此软件注册给阿郎。
酷必啦！这回该泡方便面吃啦，已经饿的走不出去啦，(悲喜交加)god！

阿郎
langlirong@163.net
http://alang.shangdu.net

2000年12月28日


Reptile V2.01

 标 题:Reptile V2.01之暴力破解(难度：简单，但反映出一种思路) (6千字)
发信人:KanKer
时 间:2000-10-31 10:34:51
详细信息:
Reptile V2.01之暴力破解(难度：简单，但反映出一种思路)

来源：整理D盘时发现的，软件上提供的地址为：http://www.sausage.com中的某处，估计已有新版本出来了。
但据我估计，其加密方式应该不会变的。Size:2M
功能：制作网页背景的好东东(广告语：感觉设计个人风格的网页很难吗？试试它，轻松做个很有味道的背景出来......)
限制：必须注册才能运行。用UPX5.0压缩过的，用Procdump1.62解压后不能正常运行。
其判断注册的程序是位于windows\system\SausReg.exe
工具：trw2k122,ultraedit
破解过程：

1。用TRW载入运行，设断bpm createwindowex，中断后，下pmodule。

2。一直按F10直到出现NAG屏。在其上的CALL处设断。如下：
0167:004B73BC E8EFEAF4FF CALL 00405EB0
0167:004B73C1 8B1D48924B00 MOV EBX,[004B9248]
0167:004B73C7 8B03 MOV EAX,[EBX]
0167:004B73C9 E87294F7FF CALL 00430840
0167:004B73CE 8B03 MOV EAX,[EBX]
0167:004B73D0 BA28744B00 MOV EDX,004B7428
0167:004B73D5 E87E91F7FF CALL 00430558
0167:004B73DA 8B0D80924B00 MOV ECX,[004B9280]
0167:004B73E0 8B03 MOV EAX,[EBX]
0167:004B73E2 8B15A0C44A00 MOV EDX,[004AC4A0]
0167:004B73E8 E86B94F7FF CALL 00430858 **在此处设断，按F8进入**
0167:004B73ED 8B0DD0914B00 MOV ECX,[004B91D0]
0167:004B73F3 8B03 MOV EAX,[EBX]
0167:004B73F5 8B15ECC04900 MOV EDX,[0049C0EC]
0167:004B73FB E85894F7FF CALL 00430858

3。再次运行中断后，按F8进入，按F10直到出现NAG屏，重复该两步。依次为：
0167:00430877 33C0 XOR EAX,EAX
0167:00430879 55 PUSH EBP
0167:0043087A 689B084300 PUSH DWORD 0043089B
0167:0043087F 64FF30 PUSH DWORD [FS:EAX]
0167:00430882 648920 MOV [FS:EAX],ESP
0167:00430885 8BCB MOV ECX,EBX
0167:00430887 33D2 XOR EDX,EDX
0167:00430889 8B45F8 MOV EAX,[EBP-08]
0167:0043088C 8B30 MOV ESI,[EAX]
0167:0043088E FF5624 CALL NEAR [ESI+24] **在此处设断，按F8进入**
0167:00430891 33C0 XOR EAX,EAX
0167:00430893 5A POP EDX
0167:00430894 59 POP ECX
0167:00430895 59 POP ECX
0167:00430896 648910 MOV [FS:EAX],EDX
*********************
*********************
0167:0042BA32 64FF30 PUSH DWORD [FS:EAX]
0167:0042BA35 648920 MOV [FS:EAX],ESP
0167:0042BA38 8B45FC MOV EAX,[EBP-04]
0167:0042BA3B 6683B8CE01000000 CMP WORD [EAX+01CE],BYTE +00
0167:0042BA43 7412 JZ 0042BA57
0167:0042BA45 8B5DFC MOV EBX,[EBP-04]
0167:0042BA48 8B55FC MOV EDX,[EBP-04]
0167:0042BA4B 8B83D0010000 MOV EAX,[EBX+01D0]
0167:0042BA51 FF93CC010000 CALL NEAR [EBX+01CC] **在此处设断，按F8进入**
0167:0042BA57 33C0 XOR EAX,EAX
0167:0042BA59 5A POP EDX
0167:0042BA5A 59 POP ECX
0167:0042BA5B 59 POP ECX
*********************
*********************
0167:004B01AA E8A139F5FF CALL 00403B50
0167:004B01AF 8D45DC LEA EAX,[EBP-24]
0167:004B01B2 E821C0FCFF CALL 0047C1D8 **在此处设断，按F8进入**
0167:004B01B7 2C01 SUB AL,01
0167:004B01B9 0F8282000000 JC NEAR 004B0241
0167:004B01BF 48 DEC EAX
0167:004B01C0 2C02 SUB AL,02
0167:004B01C2 0F838A000000 JNC NEAR 004B0252
0167:004B01C8 33C9 XOR ECX,ECX
0167:004B01CA B201 MOV DL,01
0167:004B01CC A188B94900 MOV EAX,[0049B988]
0167:004B01D1 E862B7F7FF CALL 0042B938
0167:004B01D6 8945F4 MOV [EBP-0C],EAX
0167:004B01D9 33C0 XOR EAX,EAX

4。在该CALL进入后，便进入判断核心：
0167:0047C1D8 55 PUSH EBP
0167:0047C1D9 8BEC MOV EBP,ESP
0167:0047C1DB 83C4E8 ADD ESP,BYTE -18
0167:0047C1DE 53 PUSH EBX
0167:0047C1DF 56 PUSH ESI
0167:0047C1E0 57 PUSH EDI
0167:0047C1E1 8BF0 MOV ESI,EAX
0167:0047C1E3 8D7DE8 LEA EDI,[EBP-18]
0167:0047C1E6 B906000000 MOV ECX,06
0167:0047C1EB F3A5 REP MOVSD
0167:0047C1ED 8D45E8 LEA EAX,[EBP-18]
0167:0047C1F0 8B1500B94700 MOV EDX,[0047B900]
0167:0047C1F6 E87183F8FF CALL 0040456C
0167:0047C1FB 33C0 XOR EAX,EAX
0167:0047C1FD 55 PUSH EBP
0167:0047C1FE 6867C24700 PUSH DWORD 0047C267
0167:0047C203 64FF30 PUSH DWORD [FS:EAX]
0167:0047C206 648920 MOV [FS:EAX],ESP
0167:0047C209 E84AFAFFFF CALL 0047BC58 **此CALL为判断是否注册处，标志存放于AL**
0167:0047C20E A2D4A94B00 MOV [004BA9D4],AL **若AL=0，则未注册，否则注册**
0167:0047C213 803DD4A94B0000 CMP BYTE [004BA9D4],00
0167:0047C21A 752D JNZ 0047C249 **在此设断，把此处改为JMP**
0167:0047C21C E86FFFFFFF CALL 0047C190
0167:0047C221 84C0 TEST AL,AL
0167:0047C223 7410 JZ 0047C235
0167:0047C225 813DD8A94B009001+CMP DWORD [004BA9D8],0190
0167:0047C22F 7D04 JNL 0047C235
0167:0047C231 B302 MOV BL,02
0167:0047C233 EB16 JMP SHORT 0047C24B
0167:0047C235 8D45E8 LEA EAX,[EBP-18]
0167:0047C238 E803F7FFFF CALL 0047B940
0167:0047C23D 84C0 TEST AL,AL
0167:0047C23F 7404 JZ 0047C245
0167:0047C241 B303 MOV BL,03

在47c21a处，下r fl z，按F5看看，OK，程序正常运行，因此可知，只须把此处的75改为EB即可。
但该程序由UPX压缩，没法直接改，便下断bpm 47c21a,看是什么地方往此处写的75。

5。重新运行，第二次中断后，你会来到下处：
0167:00561061 11DB ADC EBX,EBX
0167:00561063 730B JNC 00561070
0167:00561065 8A06 MOV AL,[ESI] **在此处给AL赋值**
0167:00561067 46 INC ESI
0167:00561068 8807 MOV [EDI],AL
0167:0056106A 47 INC EDI **程序在此处中断,edi=47c21a,al=75**
0167:0056106B EBEB JMP SHORT 00561058

看看EDI恰好等于47c21a，AL恰好等于75。呵呵，看看75是从哪里来的呢?——[ESI]。

6。下断bpm esi-1，重新运行。结果发现程序仍中断于0167:0056106A，由此可知esi-1处的代码没被
改变过。

7。下指令d esi-1，抄下内存中的代码。
75 2d 12 fc 9e 88 a0 b1 a0 81 11 d8 90
--
8。用ultraedit打开Reptile.exe，查找上述代码，把75改为EB即可。
运行一下，作几个背景瞧瞧，呵呵，成功了吧？

<Cracked by KanKer>


S-SPLINE的

 标 题:关于S-SPLINE的问题，哪位高手给我一个完美的爆破方案？ (10千字)
发信人:netcowboy
时 间:2001-5-31 23:04:39
详细信息:
下载地：http://www.shortcut.nl/S-Spline/Shortcut_S-SplineDemo.zip

这个软件注册码非常难算,软件设计者算法到了变态的地步.我看的头都大了.而且这个软件还设了陷井.当你上网后,他会到它网站的数据库去比较,如果没有注册过,当即将你的注册版改为未注册版.
这个软件用用Asprotect1.2以后的版本加壳 ,得手动脱壳,还得修复输入表.以下分析部分引BLOWFISH的分析结果。
输入注册码之后的判断：

0177:0040BB11 PUSH 004BF728 //DialogRegister::RegisterButton.OnClick( )
0177:0040BB16 CALL 0041EBB6
0177:0040BB1B LEA ECX,[EBP-01EC]
0177:0040BB21 CALL 0041C0CF
0177:0040BB26 AND DWORD PTR [EBP-04],00
0177:0040BB2A PUSH 0040118F
0177:0040BB2F PUSH 0041EB3F
0177:0040BB34 PUSH 03
0177:0040BB36 PUSH 18
0177:0040BB38 LEA EAX,[EBP-00F0]
0177:0040BB3E PUSH EAX
0177:0040BB3F CALL 0047E80A
0177:0040BB44 MOV ECX,[EBP-24]
0177:0040BB47 MOV BYTE PTR [EBP-04],01
0177:0040BB4B CALL 00427F9E
0177:0040BB50 MOV EBX,EAX
0177:0040BB52 CALL 0042FA11
0177:0040BB57 LEA EAX,[EBP-00A8]
0177:0040BB5D PUSH EAX
0177:0040BB5E LEA ECX,[EBX+000001E0]
0177:0040BB64 CALL 00428000 //GetWindowTextA( ), Name
0177:0040BB69 MOV ESI,004BF724
0177:0040BB6E PUSH ESI
0177:0040BB6F LEA ECX,[EBP-00A8]
0177:0040BB75 MOV BYTE PTR [EBP-04],02
0177:0040BB79 CALL 00420B42
0177:0040BB7E LEA EAX,[EBP-0090]
0177:0040BB84 PUSH EAX
0177:0040BB85 LEA ECX,[EBX+00000224]
0177:0040BB8B CALL 00428000 //GetWindowTextA( ), Company
0177:0040BB90 PUSH ESI
0177:0040BB91 LEA ECX,[EBP-0090]
0177:0040BB97 MOV BYTE PTR [EBP-04],03
0177:0040BB9B CALL 00420B42
0177:0040BBA0 MOV ECX,EBX
0177:0040BBA2 CALL 0040B9D9
0177:0040BBA7 LEA EAX,[EBP-01B8]
0177:0040BBAD LEA ECX,[EBX+0000019C]
0177:0040BBB3 PUSH EAX
0177:0040BBB4 CALL 00428000 //GetWindowTextA( ), Serial[1]
0177:0040BBB9 MOV ESI,EAX
0177:0040BBBB LEA EAX,[EBP-01A0]
0177:0040BBC1 PUSH EAX
0177:0040BBC2 LEA ECX,[EBX+00000158]
0177:0040BBC8 MOV BYTE PTR [EBP-04],04
0177:0040BBCC CALL 00428000 //GetWindowTextA( ), Serial[2]
0177:0040BBD1 MOV EDI,EAX
0177:0040BBD3 LEA EAX,[EBP-0170]
0177:0040BBD9 PUSH EAX
0177:0040BBDA LEA ECX,[EBX+00000114]
0177:0040BBE0 MOV BYTE PTR [EBP-04],05
0177:0040BBE4 CALL 00428000 //GetWindowTextA( ), Serial[3]
0177:0040BBE9 MOV [EBP-1C],EAX
0177:0040BBEC LEA EAX,[EBP-0158]
0177:0040BBF2 PUSH EAX
0177:0040BBF3 LEA ECX,[EBX+000000D0]
0177:0040BBF9 MOV BYTE PTR [EBP-04],06
0177:0040BBFD CALL 00428000 //GetWindowTextA( ), Serial[4]
0177:0040BC02 MOV [EBP-14],EAX
0177:0040BC05 LEA EAX,[EBP-0188]
0177:0040BC0B PUSH EAX
0177:0040BC0C LEA ECX,[EBX+0000008C]
0177:0040BC12 MOV BYTE PTR [EBP-04],07
0177:0040BC16 CALL 00428000 //GetWindowTextA( ), Serial[5]
........
0177:0040BE4E PUSH EAX
0177:0040BE4F MOV ECX,ESI
0177:0040BE51 CALL 00459A71 //第一处疯狂计算的地方，
0177:0040BE56 TEST AL,AL
0177:0040BE58 MOV [EBP-15],AL //返回值
0177:0040BE5B JNZ 0040BF1C
0177:0040BE61 LEA EAX,[EBP-40]
0177:0040BE64 PUSH EAX
0177:0040BE65 LEA ECX,[EBX+48]
0177:0040BE68 CALL 00428000 //GetWindowTextA
...........
0177:0040BF0F PUSH EAX
0177:0040BF10 MOV ECX,ESI
0177:0040BF12 CALL 00459A71 //第二处疯狂计算的地方
0177:0040BF17 MOV [EBP-15],AL //返回值
0177:0040BF1A JMP 0040BF1E
0177:0040BF1C XOR EDI,EDI
0177:0040BF1E LEA EAX,[EBP-60]
0177:0040BF21 PUSH EAX
0177:0040BF22 LEA ECX,[EBX+48]
0177:0040BF25 CALL 00428000
0177:0040BF2A PUSH 004BF704 //注册码的第一部分Serial[1]的黑名单“!AMOK”？
0177:0040BF2F MOV ECX,EAX
0177:0040BF31 MOV BYTE PTR [EBP-04],27
0177:0040BF35 CALL 0041FC03 //strcmp( )
0177:0040BF3A TEST AL,AL
0177:0040BF3C JNZ 0040BF84
0177:0040BF3E LEA EAX,[EBP-40]
0177:0040BF41 PUSH EAX
0177:0040BF42 LEA ECX,[EBX+0000019C]
0177:0040BF48 CALL 00428000 //GetWindowTextA( ), Serial[6]
0177:0040BF4D PUSH 004BF6FC //注册码的最后一部分的黑名单？（有不可显示字符）
0177:0040BF52 MOV ECX,EAX
0177:0040BF54 MOV BYTE PTR [EBP-04],28
0177:0040BF58 CALL 0041FC03 //strcmp( )，跟进去可看到CMPSB指令
0177:0040BF5D MOV [EBP-0D],AL //比较的结果。
0177:0040BF60 LEA ECX,[EBP-3C]
0177:0040BF63 MOV BYTE PTR [EBP-04],29
0177:0040BF67 CALL 0040117A
0177:0040BF6C LEA ECX,[EBP-40]
0177:0040BF6F MOV BYTE PTR [EBP-04],27
0177:0040BF73 CALL 0040117A
0177:0040BF78 CMP BYTE PTR [EBP-0D],00 //标志位
0177:0040BF7C JNZ 0040BF84
0177:0040BF7E AND BYTE PTR [EBP-0D],00
0177:0040BF82 JMP 0040BF88
0177:0040BF84 MOV BYTE PTR [EBP-0D],01

启动时联网检查新版本（BPM WININET!InternetOpenUrlA X DO "d *(esp+8)"）：
017F:00AF1870 68 74 74 70 3A 2F 2F 77-77 77 2E 73 68 6F 72 74 http://www.short
017F:00AF1880 63 75 74 2E 6E 6C 2F 63-67 69 2D 62 69 6E 2F 43 cut.nl/cgi-bin/C
017F:00AF1890 68 65 63 6B 2E 63 67 69-3F 75 70 64 61 74 65 25 heck.cgi?update%
017F:00AF18A0 32 30 73 2D 73 70 6C 69-6E 65 5F 32 5F 78 00 00 20s-spline_2_x..

启动时联网检查注册码，如果检查不通过又成为unregistered。这个检查是随机的，即并非每次启动都检查。
017F:00AF2C10 68 74 74 70 3A 2F 2F 77-77 77 2E 73 68 6F 72 74 http://www.short
017F:00AF2C20 63 75 74 2E 6E 6C 2F 63-67 69 2D 62 69 6E 2F 43 cut.nl/cgi-bin/C
017F:00AF2C30 68 65 63 6B 2E 63 67 69-3F 4A 56 43 36 35 4A 58 heck.cgi?JVC65JX
017F:00AF2C40 46 56 4F 56 57 36 4E 47-50 50 56 56 45 34 4B 48 FVOVW6NGPPVVE4KH
017F:00AF2C50 49 41 00 2E 6E 6C 2F 53-51 00 00 00 51 00 00 00 IA..nl/SQ...Q...

相关的代码：
0177:004159DD LEA ECX,[ESI+0000089C]
0177:004159E3 PUSH ECX
0177:004159E4 LEA EAX,[ESI+00000884]
0177:004159EA PUSH EAX
0177:004159EB LEA EAX,[ESI+0000086C]
0177:004159F1 PUSH EAX
0177:004159F2 MOV ECX,ESI
0177:004159F4 CALL 00413013 //联网检查有无新版本
0177:004159F9 TEST AL,AL
0177:004159FB JZ 00415A4B
0177:004159FD LEA EAX,[ESI+00000884]
0177:00415A03 PUSH EAX
0177:00415A04 LEA EAX,[EBP-30]
0177:00415A07 PUSH 004C065C //"update"
0177:00415A0C PUSH EAX
0177:00415A0D CALL 00402CF8
0177:00415A12 SUB ESP,0C
0177:00415A15 MOV ECX,ESP
0177:00415A17 MOV [EBP-10],ESP
0177:00415A1A PUSH 004C0650 //"available"
0177:00415A1F PUSH ECX
0177:00415A20 MOV ECX,EAX
0177:00415A22 MOV BYTE PTR [EBP-04],37
0177:00415A26 CALL 0041FFC9
0177:00415A2B MOV ECX,[EBP-14]
0177:00415A2E CALL 0041BADD
0177:00415A33 LEA ECX,[EBP-2C]
0177:00415A36 MOV BYTE PTR [EBP-04],38
0177:00415A3A CALL 0040117A
0177:00415A3F MOV BYTE PTR [EBP-04],24
0177:00415A43 LEA ECX,[EBP-30]
0177:00415A46 JMP 00415AEA
0177:00415A4B CMP BYTE PTR [ESI+000000D4],00 //标志位
0177:00415A52 PUSH FF
0177:00415A54 JZ 00415AA1
0177:00415A56 PUSH 0000E156
.......................
0177:00415A9F JMP 00415AEA
0177:00415AA1 PUSH 0000E15E
.......................
0177:00415AEA CALL 0040117A
0177:00415AEF MOV ECX,ESI
0177:00415AF1 CALL 004161C5 //本地检查注册码，并随机联网检查注册码
0177:00415AF6 FLD1
0177:00415AF8 FSTP REAL8 PTR [ESI+00000298]

在上面的0177:00415AF1处跟进去，看见本地判断注册码的地方：

0177:0041644C CALL [EAX+14] //判断注册码，里面是疯狂的计算
0177:0041644F MOV ECX,004D420C
0177:00416454 MOV [EBP-0D],AL //判断的结果
0177:00416457 CALL 0041E80A
0177:0041645C CMP BYTE PTR [EBP-0D],00 //注册码错误？
0177:00416460 JZ 004168BD
0177:00416466 MOV ECX,[EDI+00000208]
0177:0041646C CMP ECX,[004A5C78]
0177:00416472 LEA EAX,[EDI+00000208]
0177:00416478 JNZ 00416482

再在上面的0177:0041644C处跟进去，疯狂的计算就开始了。第一处比较注册码的地方如下：

0177:004629C8 MOV EAX,[EBP-0244]
0177:004629CE IMUL EAX,EAX,000343FD //疯狂的乘法（RSA？）
0177:004629D4 ADD EAX,00269EC3
0177:004629D9 MOV [EBP-0244],EAX
0177:004629DF MOV EAX,[EBP+FFFFF1A8]
0177:004629E5 ADD EAX,[EBP+FFFFF19C]
0177:004629EB PUSH EAX
0177:004629EC PUSH 00
0177:004629EE PUSH DWORD PTR [EBP-0244]
0177:004629F4 CALL 004791DC
0177:004629F9 ADD ESP,0C
0177:004629FC MOV [EBP+FFFFF198],EAX
0177:00462A02 MOV EAX,[EBP+FFFFF1B4]
0177:00462A08 SUB EAX,[EBP+FFFFF198]
0177:00462A0E SUB EAX,0A
0177:00462A11 CMP [EBP-0174],EAX
0177:00462A17 JGE 00462A7D
0177:00462A19 MOV EAX,[EBP-0174]
0177:00462A1F MOVSX EAX,BYTE PTR [EAX+EBP-0160]
0177:00462A27 MOV [EBP-0178],EAX
0177:00462A2D CMP DWORD PTR [EBP-0178],39
0177:00462A34 JLE 00462A47
0177:00462A36 MOV EAX,[EBP-0178]
0177:00462A3C SUB EAX,41
0177:00462A3F MOV [EBP-0178],EAX
0177:00462A45 JMP 00462A56
0177:00462A47 MOV EAX,[EBP-0178]
0177:00462A4D SUB EAX,30
0177:00462A50 MOV [EBP-0178],EAX
0177:00462A56 MOV EAX,[EBP-0178]
0177:00462A5C MOVSX EAX,BYTE PTR [EAX+EBP-34] //真注册码
0177:00462A61 MOV ECX,[EBP+10]
0177:00462A64 ADD ECX,[EBP-0174]
0177:00462A6A MOVSX ECX,BYTE PTR [ECX] //假注册码
0177:00462A6D CMP EAX,ECX //比较
0177:00462A6F JZ 00462A78
0177:00462A71 XOR AL,AL //bad guy
0177:00462A73 JMP 0046A910
0177:00462A78 JMP 004626A5
我共找到跳到46A910的有5个比较分别为：462A73，463069，4647F7，465BB5，46A90C。
我将其全部JZ改为JNZ，但程序出错，而且自动启动OUTLOOK发信给作者。哪位高手给我一个完美的爆破方案？

标 题:改这里的一个跳转就可以了 (316字)
发信人:blowfish
时 间:2001-6-1 10:17:14
详细信息:

0177:0041644C CALL [EAX+14] //判断注册码，里面是疯狂的计算
0177:0041644F MOV ECX,004D420C
0177:00416454 MOV [EBP-0D],AL //判断的结果
0177:00416457 CALL 0041E80A
0177:0041645C CMP BYTE PTR [EBP-0D],00 //注册码错误？
0177:00416460 JZ 004168BD

标 题:这样修改就没问题了。 (1千字)
发信人:netcowboy
时 间:2001-6-3 2:01:29
详细信息:

:004168AE 6A04 push 00000004
:004168B0 8D8708020000 lea eax, dword ptr [edi+00000208]
:004168B6 50 push eax
:004168B7 FF9704020000 call dword ptr [edi+00000204]

改为：:004168AE 6A04 push 00000004
:004168B0 8D8708020000 lea eax, dword ptr [edi+00000208]
:004168B6 50 push eax
:004168B7 83C408 add esp, 00000008
:004168BA 90 nop
:004168BB 90 nop
:004168BC 90 nop

最后把BLOWFISH兄说的那个跳，改一下就成注册版了。
0177:0041644C CALL [EAX+14] //判断注册码，里面是疯狂的计算
0177:0041644F MOV ECX,004D420C
0177:00416454 MOV [EBP-0D],AL //判断的结果
0177:00416457 CALL 0041E80A
0177:0041645C CMP BYTE PTR [EBP-0D],00 //注册码错误？
0177:00416460 JZ 004168BD //改为JNZ就可以了。

我怀疑我是脱壳问题。我用的是CASPR1。1脱的壳。脱完后，只有1。92M。可是用TR2000脱的壳却有2。04M，BLOWFISH，这是为什么？
为什么在TR2000下设BPX 47E910时，程并没有停在那个地址，而是停在别的地址，DB？，DB？一大堆，这是为什么？PNEWSEC也是如此


SafeClean V3.02

 题:免注册 SafeClean V3.02
发信人:zombieys
时 间:2000-12-8 22:34:58
详细信息:
免注册 SafeClean Utilities Version 3.02

环保卫士SafeClean Utilities V3.02,优秀的垃圾清除软件，装机必备:)。
用fi2.30侦测SafeCln.exe，一看是用PECompact1.23/1.24压缩的，拿trw200脱壳，用trw2000加载，按f10/f8一路跟踪下来，当走到
.
.
.
480de3 push ebx <=在这下pedump //真正的程序入口
489de4 push esi
480de5 push edi
.
.
.
这时下pedump即可，接着随便抄点机器码，用winhex验证一下是否脱壳成功，好像成功了。脱壳后文件大小为1,359,872 字节。

sc2.0是keyfile保护的(sc2.0?不要误会不是StarCraft而是SafeClean2.0），sc3.02也是，不过它把keyfile写在注册表里：

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSysSettings]
SystemDataCheck 58C36EF6B9156F9F
SystemDataCode 这个太多了......
SystemDataSize 58

现在开始正式工作了，我喜欢用s-ice,确认winice.dat中有这一句EXP=c:\windows\system\advapi32.dll。用loader装载，下bpx regqureyvalueexa,按2次f5进入SafeClean的地盘，跟着慢慢看程序，我发现它根据4ffce4置1或0判断程序是否注册，是1则是注册版。然后再次用loader装载，下bpm 4ffce4,在分析程序，再次省略跟踪若干......
当程序走到这里：

467ba0 jnz 467bb8 ->mov byte ptr [4ffce4],01
467ba2 mov [esi+2c],al ->jmp 467bb8
467ba5 mov byte ptr [esi+4c],01
jnz之前有一个call,是算key的，有兴趣的话慢慢看吧，我可没空，按我的方法改，就可成为免注册版。

整理一下，用winhex修改
查找：751688462CC6464C01
改成：c605e4fc4f0001eb0f

完活。

有什么错误/问题的话，找我，提前祝各位元旦快乐!!!!

cracked by zombieys
my oicq is 1789655
my hp is zombieys.yeah.net/zombieys.126.com
thanks for your supports

附送sc3.02真正的key，把它存成key.txt

=========Reg Code part 1=========
2931D422F0A86D57
=========Reg Code part 2=========
AA7853A39D5A5BD4D256694BA1999E60A96F04D004492FFD4E1D01D9917DCB359F96803278FCECFA05
=========Finish Reg Code=========


SHOWURL

 序 号:17753
标 题:应妖二妖二的要求，贴上SHOWURL的破解过程。 (11千字)
发信人:hsf
时 间:2001-5-5 14:02:38
详细信息:
今天上班回来睡了一觉，后来拿这个软件来玩，发现里面有较多的比较。时不时跳出一个注册码错误的对话框。在411c50,408a1a,和45a036附近的跳转改为jmp,jmp,nopnop.随便输入注册码，不出错，但还是没用。前面检测的地方还是没改到，重新运行又为试用版。总之，没搞定。：－（
这里是破它验证注册码和注册类型的地方，注册窗口的破解在上面所说的地方。
终于搞定!
OK!大功告成，打个Kiss!
* Possible StringData Ref from Code Obj ->"REGID"
|
:0045A218 B9E0A34500 MOV ECX, 0045A3E0

* Possible StringData Ref from Code Obj ->"APPINFO"
|
:0045A21D BAF0A34500 MOV EDX, 0045A3F0
:0045A222 8BC3 MOV EAX, EBX
:0045A224 8B38 MOV EDI, dword PTR [EAX]
:0045A226 FF17 CALL dword PTR [EDI]
:0045A228 6A00 PUSH 00000000
:0045A22A 8D45F0 LEA EAX, dword PTR [EBP-10]
:0045A22D 50 PUSH EAX

* Possible StringData Ref from Code Obj ->"REGNAME"
|
:0045A22E B900A44500 MOV ECX, 0045A400

* Possible StringData Ref from Code Obj ->"APPINFO"
|
:0045A233 BAF0A34500 MOV EDX, 0045A3F0
:0045A238 8BC3 MOV EAX, EBX
:0045A23A 8B38 MOV EDI, dword PTR [EAX]
:0045A23C FF17 CALL dword PTR [EDI]
:0045A23E 8B45F8 MOV EAX, dword PTR [EBP-08]
:0045A241 8B00 MOV EAX, dword PTR [EAX]
:0045A243 50 PUSH EAX
:0045A244 8D45E0 LEA EAX, dword PTR [EBP-20]
:0045A247 50 PUSH EAX

* Possible StringData Ref from Code Obj ->"INIPATH"
|
:0045A248 B910A44500 MOV ECX, 0045A410

* Possible StringData Ref from Code Obj ->"APPINFO"
|
:0045A24D BAF0A34500 MOV EDX, 0045A3F0
:0045A252 8BC3 MOV EAX, EBX
:0045A254 8B38 MOV EDI, dword PTR [EAX]
:0045A256 FF17 CALL dword PTR [EDI]
:0045A258 8B55E0 MOV EDX, dword PTR [EBP-20]
:0045A25B 8B45F8 MOV EAX, dword PTR [EBP-08]
:0045A25E E8ED99FAFF CALL 00403C50
:0045A263 8BC3 MOV EAX, EBX
:0045A265 E80A8DFAFF CALL 00402F74
:0045A26A 8D45E8 LEA EAX, dword PTR [EBP-18]
:0045A26D E88A99FAFF CALL 00403BFC
:0045A272 83CBFF OR EBX, FFFFFFFF
:0045A275 8B45F4 MOV EAX, dword PTR [EBP-0C]
:0045A278 BA20A44500 MOV EDX, 0045A420
:0045A27D E80A9DFAFF CALL 00403F8C
:0045A282 761F JBE 0045A2A3 ;----->让它一定跳，改为“EB1F”
:0045A284 A11CF84A00 MOV EAX, dword PTR [004AF81C]
:0045A289 8B00 MOV EAX, dword PTR [EAX]
:0045A28B 50 PUSH EAX
:0045A28C 6A00 PUSH 00000000
:0045A28E 8B0DE4F74A00 MOV ECX, dword PTR [004AF7E4]
:0045A294 8B09 MOV ECX, dword PTR [ECX]
:0045A296 8B55F4 MOV EDX, dword PTR [EBP-0C]
:0045A299 8B45F0 MOV EAX, dword PTR [EBP-10]
:0045A29C E873FAFFFF CALL 00459D14
:0045A2A1 8BD8 MOV EBX, EAX

* Referenced by a (U)nconditional OR (C)onditional Jump at Address:
|:0045A282(C)
|
:0045A2A3 85DB TEST EBX, EBX
:0045A2A5 0F8CF8000000 JL 0045A3A3 ;------>别跳了，改为“909090909090”
:0045A2AB 8D45DC LEA EAX, dword PTR [EBP-24]
:0045A2AE 8B4DF0 MOV ECX, dword PTR [EBP-10]

* Possible StringData Ref from Code Obj ->"User Name "
|
:0045A2B1 BA2CA44500 MOV EDX, 0045A42C
:0045A2B6 E80D9CFAFF CALL 00403EC8
:0045A2BB 8B55DC MOV EDX, dword PTR [EBP-24]
:0045A2BE 8BC6 MOV EAX, ESI
:0045A2C0 8B08 MOV ECX, dword PTR [EAX]
:0045A2C2 FF5134 CALL [ECX+34]
:0045A2C5 8D45D8 LEA EAX, dword PTR [EBP-28]
:0045A2C8 8B4DF4 MOV ECX, dword PTR [EBP-0C]

* Possible StringData Ref from Code Obj ->"Registration ID "
|
:0045A2CB BA40A44500 MOV EDX, 0045A440
:0045A2D0 E8F39BFAFF CALL 00403EC8
:0045A2D5 8B55D8 MOV EDX, dword PTR [EBP-28]
:0045A2D8 8BC6 MOV EAX, ESI
:0045A2DA 8B08 MOV ECX, dword PTR [EAX]
:0045A2DC FF5134 CALL [ECX+34]
:0045A2DF 83EB01 SUB EBX, 00000001
:0045A2E2 7207 JB 0045A2EB ;---->这里，你跳则为Single User,想成为“Single User”吗？
; 想就改为“EB07”，不想就算了；
:0045A2E4 7421 JE 0045A307 ;---->想成为"Site user"吗？想就改为“EB21”，不想就算了

:0045A2E6 4B DEC EBX
:0045A2E7 743A JE 0045A323 ;---->想成为“Royalty Free user”吗？不想就没机会了，还是
; 改成“EB3A”吧，呵呵呵!
:0045A2E9 EB5F JMP 0045A34A

* Referenced by a (U)nconditional OR (C)onditional Jump at Address:
|:0045A2E2(C)
|
:0045A2EB 8D45E4 LEA EAX, dword PTR [EBP-1C]

* Possible StringData Ref from Code Obj ->"Single User"
|
:0045A2EE BA5CA44500 MOV EDX, 0045A45C
:0045A2F3 E89C99FAFF CALL 00403C94
:0045A2F8 8D45EC LEA EAX, dword PTR [EBP-14]

* Possible StringData Ref from Code Obj ->"This is a registered version of " ;--->这是单用户的授权书吧？自己翻译吧
->"ShowURL.
You may use the software "
->"on any single computer, or use "
->"the software on a network, provided "
->"that each person accessing the "
->"Software through the network must "
->"have a registered version of ShowURL"
|
:0045A2FB BA70A44500 MOV EDX, 0045A470
:0045A300 E88F99FAFF CALL 00403C94
:0045A305 EB43 JMP 0045A34A

* Referenced by a (U)nconditional OR (C)onditional Jump at Address:
|:0045A2E4(C)
|
:0045A307 8D45E4 LEA EAX, dword PTR [EBP-1C]

* Possible StringData Ref from Code Obj ->"Site"
|
:0045A30A BA64A54500 MOV EDX, 0045A564
:0045A30F E88099FAFF CALL 00403C94
:0045A314 8D45EC LEA EAX, dword PTR [EBP-14]

* Possible StringData Ref from Code Obj ->"Using of this software on any " ;----->这是站点的授权书吧？自己翻译吧
->"number of computers and networks "
->"is hereby granted. Provided that "
->"all computers must be within a "
->"same building, and is owned by "
->"%s"
|
:0045A317 BA74A54500 MOV EDX, 0045A574
:0045A31C E87399FAFF CALL 00403C94
:0045A321 EB27 JMP 0045A34A

* Referenced by a (U)nconditional OR (C)onditional Jump at Address:
|:0045A2E7(C)
|
:0045A323 8D45E4 LEA EAX, dword PTR [EBP-1C]

* Possible StringData Ref from Code Obj ->"Royalty Free" ;---->这是“皇室免费”的授权书吧？自己翻译吧
|
:0045A326 BA20A64500 MOV EDX, 0045A620
:0045A32B E86499FAFF CALL 00403C94
:0045A330 8D45EC LEA EAX, dword PTR [EBP-14]

* Possible StringData Ref from Code Obj ->"The right to distribute ShowURL "
->"on a royalty free basis is hereby "
->"granted to %s. "
|
:0045A333 BA38A64500 MOV EDX, 0045A638
:0045A338 E85799FAFF CALL 00403C94
:0045A33D 8D45E8 LEA EAX, dword PTR [EBP-18]

* Possible StringData Ref from Code Obj ->"ShowURL may not be resold as an "
->"application. The right to distribute "
->"ShowURL does not pass to users "
->"other than registerd users shown "
->"above."
|
:0045A340 BA94A64500 MOV EDX, 0045A694
:0045A345 E84A99FAFF CALL 00403C94

* Referenced by a (U)nconditional OR (C)onditional Jump at Addresses:
|:0045A2E9(U), :0045A305(U), :0045A321(U)
|
:0045A34A 8D45D4 LEA EAX, dword PTR [EBP-2C]
:0045A34D 8B4DE4 MOV ECX, dword PTR [EBP-1C]

* Possible StringData Ref from Code Obj ->"License Type " ;---->这是你的执照类型，你是选的哪种？我选的是“站点”
| ; 你呢？
:0045A350 BA2CA74500 MOV EDX, 0045A72C
:0045A355 E86E9BFAFF CALL 00403EC8
:0045A35A 8B55D4 MOV EDX, dword PTR [EBP-2C]
:0045A35D 8BC6 MOV EAX, ESI
:0045A35F 8B08 MOV ECX, dword PTR [EAX]
:0045A361 FF5134 CALL [ECX+34]
:0045A364 BA20A44500 MOV EDX, 0045A420
:0045A369 8BC6 MOV EAX, ESI
:0045A36B 8B08 MOV ECX, dword PTR [EAX]
:0045A36D FF5134 CALL [ECX+34]
:0045A370 8D45D0 LEA EAX, dword PTR [EBP-30]
:0045A373 50 PUSH EAX
:0045A374 8B45F0 MOV EAX, dword PTR [EBP-10]
:0045A377 8945C8 MOV dword PTR [EBP-38], EAX
:0045A37A C645CC0B MOV [EBP-34], 0B
:0045A37E 8D55C8 LEA EDX, dword PTR [EBP-38]
:0045A381 33C9 XOR ECX, ECX
:0045A383 8B45EC MOV EAX, dword PTR [EBP-14]
:0045A386 E8C1F3FAFF CALL 0040974C
:0045A38B 8B55D0 MOV EDX, dword PTR [EBP-30]
:0045A38E 8BC6 MOV EAX, ESI
:0045A390 8B08 MOV ECX, dword PTR [EAX]
:0045A392 FF5134 CALL [ECX+34]
:0045A395 8B55E8 MOV EDX, dword PTR [EBP-18]
:0045A398 8BC6 MOV EAX, ESI
:0045A39A 8B08 MOV ECX, dword PTR [EAX]
:0045A39C FF5134 CALL [ECX+34]
:0045A39F B301 MOV BL, 01
:0045A3A1 EB02 JMP 0045A3A5

* Referenced by a (U)nconditional OR (C)onditional Jump at Address:
|:0045A2A5(C)
|
:0045A3A3 33DB XOR EBX, EBX

* Referenced by a (U)nconditional OR (C)onditional Jump at Address:
|:0045A3A1(U)
|
:0045A3A5 33C0 XOR EAX, EAX


SmartWhoIs 3.0 (build 21)

 标 题:【 标题：SmartWhoIs 3.0 (build 21) 破解手记 】
发信人:mcny@work
时 间:2000-11-30 3:33:38
详细信息:
【 标题：SmartWhoIs 3.0 (build 21) 破解手记 】
==========================================================================================
软件 ：SmartWhoIs 3.0 (Build21)
软件简介 ：网络查询工具，能查询IP地址或域名的位置、注册人、联系信息等，它还可以对数据
进行缓存，使你可以建立自己的数据库，支持Socks5防火墙

下载处 ：http://www.tamos.com/
若以上连接找不到(build21)次版本号的，可以到我这里下载：
http://www.freedrive.com/ASP/PostFolderShortcut.asp?fsc=15913190
（找share\SmartWhoIs\sw3.zip ,需有freedrive的免费帐号）

注册方式 ：keyfile (*.s3l / *.swl )

程序保护 ：Asprotect 加壳 + Checksum 检测 + Regmon/Filemon检测 + 加密'Evaluation' 等字样。
（有检测Debugger，但不知是否与保护有关）

过期方式 ：未过期时，主窗口有Evaluation Version 字样。程序结束前，会出现一个对话框。
过期后，会在其子目录 \ico 下拷贝建立一个 itReserved.png 文件（拷贝自文件
ico\itDomName.png）。
可以换另一个方式说，若发现 ico\itReserved.png 文件，则程序运行后出现过期对话框，
并马上结束。若没有发现，则继续试用。

破解 ：使不过期。
使用工具 ：W32Dasm 8.93 , Filemon4.22 , Regmon4.22 , UltraEdit 7.20

《 在写本文的当儿，CORE也刚刚发布了注册机。可去 http://hambo.yeah.net 》
==========================================================================================

1）此程序是用 Asprotect 加壳的, 用 Caspr0.952 可以正常脱壳。已脱壳的程序，运行后马上结束。
这是由于 Checksum 的关系。以下可以避开Checksum 失败。

004E619D jz 004E71A4 --> jmp 004E71A4

2）用W32Dasm发现 StrnREF 中有字符串"FilemonClass"、"RegmonClass" 。用文本编辑器UltraEdit将它们改
成其它字符就可以避开对 Filemon 和 Regmon 的检测了。
无论有无避开检测，以上两个软件都可以运行，然而结果就有微小区别。好比Filemon 中的
ico\itReserved.png ，若事先不避开是不会记录在案的。（我差点儿就走宝了！）

3）004E60CA call 004B9E10 为 Keyfile 的关键。

4）"Would you like to purchase this product? "
"Thank You for trying this evaluation version !"
" - Evalution Version"
以上三个字符串都被加密，（有多处）皆调用 call 004B95F8 来还原。

5）关键代码（局部），仅供参考。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E60AF(C)
|
:004E60CA E8413DFDFF call 004B9E10 //开始运行时，对KeyFile的检测、操作部分 <= 注意！
:004E60CF E8F8C8F1FF call 004029CC //时间计算。
:004E60D4 A198954E00 mov eax, dword ptr [004E9598]
:004E60D9 833800 cmp dword ptr [eax], 00000000
:004E60DC 754D jne 004E612B
:004E60DE E8CD30FCFF call 004A91B0 //检测Filemon的存在，
:004E60E3 84C0 test al, al
:004E60E5 7544 jne 004E612B //若检测到Filemon，则跳转。
:004E60E7 8B15BC924E00 mov edx, dword ptr [004E92BC]
:004E60ED 8B12 mov edx, dword ptr [edx]
:004E60EF 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Data Obj ->"ico\itReserved.png"
|
:004E60F2 B928624E00 mov ecx, 004E6228
:004E60F7 E84CDEF1FF call 00403F48
:004E60FC 8B45F0 mov eax, dword ptr [ebp-10]
:004E60FF E80C2DF2FF call 00408E10
:004E6104 84C0 test al, al
:004E6106 7423 je 004E612B //若没有该文件则跳转，否则出现过期对话框。
:004E6108 8D4DEC lea ecx, dword ptr [ebp-14]
:004E610B 66BA1F00 mov dx, 001F

* Possible StringData Ref from Data Obj ->"S>|演e?u?=?I|~??ǹ顄?幊;}璃8椴痞"
|
:004E610F B844624E00 mov eax, 004E6244
:004E6114 E8DF34FDFF call 004B95F8 //这个调用将以上密文转换成如下文本
:004E6119 8B45EC mov eax, dword ptr [ebp-14] //[eax]="Would you like to
purchase this product? "
:004E611C E8B730FCFF call 004A91D8
:004E6121 E8BE41FDFF call 004BA2E4

==========================================================================================
【笔者的所有改动】: WD=W32Dasm UE=UltraEdit
==========================================================================================
1) CHECKSUM
WD:004E619D 7405 jz 004E71A4 --> eb05 jmp
UE:000E559Dh

2)"RegmonClass" and "FilemonClass"
UE: 000A85C9h FilemonClass --> FilemanClose
UE: 000A85A4h RegmonClass --> RegmanClose

3) 避开所有加密字的符串，即避开过期限制。
WD:004E2530 7407 je 004e2539 --> 9090 nop nop
UE:000E1930h

WD:004BA2EB 7548 jne 004ba335 --> eb48 jmp
UE:000B96EBh

WD:004CA1BE 753B jne 004CA1FB --> eb3b jmp
UE:000C95BEh

WD:004E27E5 733C jnb 004E2823 --> eb3c jmp
UE:000E1BE5h

WD:004E391A 7242 jb 004E395E --> eb42 jmp
UE:000E2D1Ah

WD:004e60DC 754D je 004E612B --> eb4d jmp
UE:000E54E3h

WD:004CAE6C 753C jne 004CAEAA --> eb3c jmp
UE:000CA26Ch

4)最后，莫忘了留下名字 8^)
UE: 00f4d13h "Evaluation Version" --> "McNy@Work [200011]" (change to my name)
UE: 00f4b85h "Order Now!" --> alls 00 00 00 00 00 00 00 00 00 00 (delete link)

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
笔者 ：McNy@Work
网址 ：http://mcny.yeah.net 或 http://mcny.iscool.net （施工缓慢，请见谅。。。）
日期 ：2000年11月29日
Email ：mcny_work@yahoo.com
（邮件主题请以"WANTED:McNycn"开始，注意英文字母大小写，否则我将收不到喔！）
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~


SNAGIT32 5.10

 标 题:初学者，不知道有没有机会进入[CCG]? 附：SNAGIT32 5.10破解。 (5千字)
发信人:傲世男儿
时 间:2000-9-28 12:21:52
详细信息:
熬夜写了第一篇破解教程，希望能敲开（不是敲破，^-^）[CCG]的大门，不足之处还望SUN.BIRD[CCG]及各位大客批评指正。
snagit 32 v5.10
SnagIt 可以方便快速地截取 Windows 桌面上的任何内容，它可以卷动 Web 页面供你一次截取，可以捕捉视频图像，还可以抓取文本内容。 --我最欣赏的就是这点。
下载:URL ftp://263.idp.com.cn/pub/newsoft/graphics/grp-cap/snagit.exe
工具： Trw2k 1.22，w32dsm。

先来破解snagit32.exe:

输入任意注册码后，下断点hmemcpy,断住后搜索这个字符串地址为xxxxxxxx，下断点bpm xxxxxxx。再断后到处找找，会看到下面的内容：

:00447EA6 85C0 test eax, eax
:00447EA8 8945EC mov dword ptr [ebp-14], eax
:00447EAB 0F84DD020000 je 0044818E
:00447EB1 83FF0E cmp edi, 0000000E
:00447EB4 0F82C3020000 jb 0044817D // 检查原始注册码长度，不能小于0x0E(14)。

:00447EF3 FF1508C44A00 Call dword ptr [004AC408] //过滤掉注册码中的-%@#^&*……)，长度-〉eax
:00447EF9 6A31 push 00000031
:00447EFB 83F80E cmp eax, 0000000E //看看这个长度是否等于14
:00447EFE 59 pop ecx
:00447EFF 0F8598000000 jne 00447F9D //不相等的话，注册失败
:00447F05 8B55EC mov edx, dword ptr [ebp-14]
:00447F08 807A0C38 cmp byte ptr [edx+0C], 38 //注册码的倒数第二位= '8'?
:00447F0C 8A420D mov al, byte ptr [edx+0D]
:00447F0F 0F8588000000 jne 00447F9D //跳就按新用户处理，不跳则可能是老用户
:00447F15 3C34 cmp al, 34 //---------------------------------->
:00447F17 740C je 00447F25 //倒数第一位等于2，3，4则为老用户
:00447F19 3C33 cmp al, 33
:00447F1B 7408 je 00447F25
:00447F1D 3C32 cmp al, 32
:00447F1F 7404 je 00447F25 //<----------------------------------
:00447F21 3AC1 cmp al, cl
:00447F23 7578 jne 00447F9D //跳就是新用户

就按照新用户追下去吧

:00448078 E8AAC60000 call 00454727 <---密码在此验证
:0044807D 8BD8 mov ebx, eax <---注意：这里将eax-->ebx

* Possible Reference to Dialog: DialogID_0098, CONTROL_ID:00FF, ""
|
:0044807F 6AFF push FFFFFFFF
:00448081 8D4DF0 lea ecx, dword ptr [ebp-10]
:00448084 895DE4 mov dword ptr [ebp-1C], ebx
:00448087 E826FA0300 call 00487AB2
:0044808C 80FB01 cmp bl, 01 <---到这里才判断bl是否为1
:0044808F 0F85BF000000 jne 00448154 <---不等就注册失败

所以我们要跟进" :00448078 E8AAC60000 call 00454727" 这个call看看哪里改变了eax。

注册码的判断比较繁琐，当我发现下面的xor eax,eax后，便放弃了找注册码的念头，只要改2个字节就可以完工，何必浪费青春呢？

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044793D(C)
|
:0044794F 33C0 xor eax, eax //到这里之前eax已经是0了，就改它好了
//改为40(inc eax) 90 (nop)
:00447951 EBF7 jmp 0044794A
:00447953 B839814A00 mov eax, 004A8139
:00447958 E8BF570200 call 0046D11C
:0044795D 51 push ecx

到这里，snagit32.exe已经破掉了：
有下面两个注册方法：
1。把上面所提到的关键点都修改一下，这样注册码可以随意输入，长度，内容都不限。
2。只修改2个字节：
s: 33C0EBF7B839814A00
r: 4090--------------
然后在输入注册码的时候输入：xxxxxxxxxxxxAx （长度14，其中x可以为任意字母或数字，A为不等于8的任意字母或数字）

再来破studio.exe.
找到
:0041D457 C784242C01000000000000 mov dword ptr [esp+0000012C], 00000000
:0041D462 837AF80E cmp dword ptr [edx-08], 0000000E //判断你刚刚在snagit主输入的注册码长度>=14
:0041D466 7C6C jl 0041D4D4 //小于就抱歉了 改为9090
:0041D468 8B542410 mov edx, dword ptr [esp+10]

再向下找
:0041D4B5 E856000000 call 0041D510 //这个call里面判断你的注册码正确与否。
//如果有朋友想找注册码，我想在这边找比较好。
:0041D4BA 3C01 cmp al, 01
:0041D4BC 7505 jne 0041D4C3 //跳出就over，改为9090
:0041D4BE BB01000000 mov ebx, 00000001

到这里，studio.exe已经破掉了：
s: f80e7c6c8b542410 （如果你的密码本身输的就是14位，这里不用改了）
r: ----9090--------
s: 3c017505bb010000
r: ----9090--------

还有一点要说说，在snagit32中注册成功后会提示输入用户名，它会自动将你登陆的用户名字放在编辑框内。因此一定用到了这样的一个win32 api,在w32dsm反编译结果中查找get，结果一下子就找到了:GetUserName((得到登陆用户名)，和GetComputerName（得到机器名）。昨天那位提问怎样在程序中关联打开文档的[CCG]的朋友，你也可以用这样的方法，直接搜索Reg,会找到几乎所有的操作注册表的win32 api，如下：

Import Module 009: ADVAPI32.dll

Addr:0017E894 hint(015E) Name: RegCreateKeyA
Addr:0017E8A4 hint(017B) Name: RegQueryValueExA
Addr:0017E92E hint(00AA) Name: GetFileSecurityA
Addr:0017E844 hint(015B) Name: RegCloseKey
Addr:0017E852 hint(0172) Name: RegOpenKeyExA
Addr:0017E862 hint(016A) Name: RegEnumValueA
Addr:0017E872 hint(017A) Name: RegQueryValueA
Addr:0017E884 hint(0185) Name: RegSetValueA
Addr:0017E90C hint(0166) Name: RegEnumKeyA
Addr:0017E91A hint(019B) Name: SetFileSecurityA
Addr:0017E8B8 hint(0186) Name: RegSetValueExA
Addr:0017E8CA hint(015F) Name: RegCreateKeyExA
Addr:0017E8DC hint(0164) Name: RegDeleteValueA
Addr:0017E8EE hint(0162) Name: RegDeleteKeyA
Addr:0017E8FE hint(0171) Name: RegOpenKeyA

这样再去查msdn，目的性就强的多。：）

傲世男儿
09/28/2000


Snappy Fax 2000

标 题:Snappy Fax 2000 (2千字)
发信人:bnbnf
时 间:2001-2-2 0:29:05
详细信息:
软件名称：Snappy Fax 2000
整理日期：2001.1.19
最新版本：2.11.2.1
文件大小：2075KB
软件授权：共享软件
使用平台：Win95/98/NT/2000
发布公司：Home Page
软件简介：
    运用您的扫描器、打印机和 Fax Modem 将您的计算机变成一台传真机。
破解工具：W32dasm，HIEW，这两个当然少不了。
下载地址：http://www.newhua.com/SNAPPYFAX.HTM
近几天，在论坛里好像看到很多网友在玩暴力破解，所以今天也来热闹热闹，我不喜欢玩暴力破解，原因只有二个，因为玩这个东西的人有二种，（在没有注册码输入的软件除处）一种是高高手，另一种就是小菜类，我当然是后者了，说句老实话，程序又不是自己写的，又怎么知道它如何走的呢？一般的暴力破解只是改一两个地方就成为注册版了，多没趣，当然前提条件是作者没有装陷井的的前提下了，大家在玩暴力破解的时候可能都会遇到这个问题，就是改了自己认为的地方，但后来的结果发现错误，都会怀着运气+瞎猜的方法去改到正确，我不提倡初学者去玩暴力破解，用ICE去看看程序的流程不是还要好吗？以上内容只是我的个人意见，不认同的，可以当我没有说过（不是的话又有人骂我了！）
一般用暴力破解的入手都是看看软件中的提示，也就是破解的入口点了，就Snappy Fax 2000这个软件来说，在你填上注册名和错误的注册号后，它就会跳出一个错误的窗口，说THE REGISTRATION KEY IS NOT VALID 这个就是我们破解它的入口点，用W32dasm来反汇编它后找这些提示就行了。
我就用W32dasm将Snappy Fax 2000 EXE文件反汇编后找到THE REGISTRATION KEY IS NOT VALID如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0054A7B8(C)--------------------------------------------找这个地址就行了
|

* Possible StringData Ref from Code Obj ->"alert.wav"
|
:0054A884 B80CA95400 mov eax, 0054A90C
:0054A889 E8724E1000 call 0064F700
:0054A88E 6A00 push 00000000
:0054A890 668B0D18A95400 mov cx, word ptr [0054A918]
:0054A897 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"The Registration Key is not Valid."—————————这就是破解的入口点
|
:0054A899 B858A95400 mov eax, 0054A958
:0054A89E E8A16BF2FF call 00471444

:0054A7AA 8B800C030000 mov eax, dword ptr [eax+0000030C]
:0054A7B0 59 pop ecx
:0054A7B1 E896B1F5FF call 004A594C
:0054A7B6 3C01 cmp al, 01
:0054A7B8 0F85C6000000 jne 0054A884-----------------------这个就是鬼了，用HIEW改JNE为JE，即是将85改为84。按F9保存后运行它试试，在输入的地方填上你喜欢的名字和注册码就成为注册版了。因为这个是决定你的注册码是否正解后跳转的地方！
:0054A7BE A15CFD6600 mov eax, dword ptr [0066FD5C]
:0054A7C3 8B00 mov eax, dword ptr [eax]
:0054A7C5 8B800C030000 mov eax, dword ptr [eax+0000030C]

是否觉得很没趣，再一次说明，以上内容，只是我的观点，不认同者...............


ssreader3.54

 标 题:我喜欢暴力，暴力破解ssreader3.54的图书阅读.下载和1/4页面限制! (5千字)
发信人:741106
时 间:2001-8-8 11:03:54
详细信息:
ssreader.exe 脱壳后修改以下地方，不注册读书卡照样正常下载阅读。

015F:00420AA4 E8FFA1FEFF CALL 0040ACA8 -------> 进行读书卡认证,可以把它改成nop
015F:00420AA9 84C0 TEST AL,AL
015F:00420AAB 7474 JZ 00420B21 ----> 改成 nop 不跳出现下载到本地图书馆的目录选择框,
015F:00420AAD 8B15184C5500 MOV EDX,[00554C18]
015F:00420AB3 833A00 CMP DWORD [EDX],BYTE +00
015F:00420AB6 751A JNZ 00420AD2
015F:00420AB8 8B8D58FEFFFF MOV ECX,[EBP+FFFFFE58]
015F:00420ABE B201 MOV DL,01
015F:00420AC0 A1A0885300 MOV EAX,[005388A0]

015F:0040ADA0 E817070000 CALL 0040B4BC ---->下载框中选中本地图书馆后又要进行认证 改成 nop
015F:0040ADA5 84C0 TEST AL,AL 返回0 失败
015F:0040ADA7 740E JZ 0040ADB7 故此处改成 nop nop （不跳走）
015F:0040ADA9 B001 MOV AL,01
015F:0040ADAB 8B55D4 MOV EDX,[EBP-2C]
015F:0040ADAE 64891500000000 MOV [FS:00],EDX
015F:0040ADB5 EB0C JMP SHORT 0040ADC3
015F:0040ADB7 33C0 XOR EAX,EAX
015F:0040ADB9 8B55D4 MOV EDX,[EBP-2C]
015F:0040ADBC 64891500000000 MOV [FS:00],EDX

015F:0041BAE0 E8D7F9FEFF CALL 0040B4BC ----> 浏览中选中点击书名，p之后进行读书卡认证，此处不修改，改后会死机
015F:0041BAE5 84C0 TEST AL,AL
015F:0041BAE7 0F858F000000 JNZ NEAR 0041BB7C -->此行改成硬跳转

此行改成如下代码.

015F:0041BAE7 E990000000 JMP 0041BB7C
015F:0041BAEC 90 NOP

:0041B62A E88DFEFEFF call 0040B4BC
:0041B62F 84C0 test al, al
:0041B631 0F843F020000 je 0041B876

兄弟们：
pdg2.dll 中 (pdg2.dll 的壳我脱不了，是飘雪兄脱的壳，谢谢飘雪）

ocr 图象拷贝，文字 1/4页面限制解除方法：

:1000441D 0F87C3070000 ja 10004BE6 ------> 本处机器码全改成 90
:10004423 85D2 test edx, edx
:10004425 0F8694070000 jbe 10004BBF
:1000442B 837D1000 cmp dword ptr [ebp+10], 00000000
:1000442F 0F868A070000 jbe 10004BBF
:10004435 8D421F lea eax, dword ptr [edx+1F]
:10004438 8BCB mov ecx, ebx
:1000443A C1E805 shr eax, 05

:1000654D 0FAFCB imul ecx, ebx
:10006550 C1E802 shr eax, 02
:10006553 05E8030000 add eax, 000003E8
:10006558 3BC8 cmp ecx, eax
:1000655A 762D jbe 10006589 -----> 76 改成 eb 直接跳转
:1000655C 8B4D18 mov ecx, dword ptr [ebp+18]
:1000655F 85C9 test ecx, ecx
:10006561 7406 je 10006569
:10006563 8B01 mov eax, dword ptr [ecx]
:10006565 6A01 push 00000001
:10006567 FF10 call dword ptr [eax]

:1000BF59 59 pop ecx
:1000BF5A 8B4D0C mov ecx, dword ptr [ebp+0C]
:1000BF5D 6A04 push 00000004 ----> 1/4页面限制关键点。改成push 1, (6a 04 改成 6a 01)
:1000BF5F 0FAFC8 imul ecx, eax
:1000BF62 8B45FC mov eax, dword ptr [ebp-04]
:1000BF65 5B pop ebx
:1000BF66 0FAF45F8 imul eax, dword ptr [ebp-08]
:1000BF6A 99 cdq

pdg2.dll 文件中，一个我未解决的问题，阅读其它用户下载的的书籍不能显示内容，有兴趣的兄弟们请研究一下。

打开其它用户下载的书，哏踪流程 (pdg2.dll中）

0167:024F7271 E8430F0000 CALL 024F81B9 ---->此call判断用户名是否一致，是显示页面，否提示无权，追进去
0167:024F7276 FF7604 PUSH DWORD [ESI+04]
0167:024F7279 E896B30200 CALL 02522614
0167:024F727E 56 PUSH ESI
0167:024F727F E890B30200 CALL 02522614
0167:024F7284 59 POP ECX
0167:024F7285 59 POP ECX
0167:024F7286 E84AB30200 CALL 025225D5
0167:024F728B 5E POP ESI
0167:024F728C C3 RET
0167:024F728D 8B4C2404 MOV ECX,[ESP+04]

0167:024F8B7A FF5024 CALL NEAR [EAX+24] ----> 发现此call显示“无权阅读” 思路来了，前面应该有判断语句，通过静态分析，改变跳转来试试。
0167:024F8B7D 33C0 XOR EAX,EAX
0167:024F8B7F E9851A0000 JMP 024FA609
0167:024F8B84 D9862C210000 FLD DWORD [ESI+212C]
0167:024F8B8A 8B4D08 MOV ECX,[EBP+08]
0167:024F8B8D D9C0 FLD ST0
0167:024F8B8F D99900010000 FSTP DWORD [ECX+0100]
0167:024F8B95 DC1D40A55402 FCOMP QWORD [0254A540]

往前踪发现：

0167:024F8935 FF5038 CALL NEAR [EAX+38]
0167:024F8938 85C0 TEST EAX,EAX
0167:024F893A 0F85A9000000 JNZ NEAR 024F89E9 ----> 分支点，用户名一致，跳走，不一致，不走。改成硬跳转，用户名不一致时将显示空白页，不提示“无权”

{ 改成硬跳转 这样
0167:024F893A E9AA000000 JMP 024F89E9
0167:024F893F 90 NOP
修改之后，不提示无权阅读，但也不能显示页面内容，兄弟我黔鹿技穷，谁能在我的肩镑上继续前行？

}

0167:024F8940 8B4DEC MOV ECX,[EBP-14]
0167:024F8943 2186A4210000 AND [ESI+21A4],EAX
0167:024F8949 85C9 TEST ECX,ECX
0167:024F894B 7406 JZ 024F8953
0167:024F894D 8B01 MOV EAX,[ECX]
0167:024F894F 6A01 PUSH BYTE +01
0167:024F8951 FF10 CALL NEAR [EAX]
0167:024F8953 837DFC00 CMP DWORD [EBP-04],BYTE +00

有发现问题请通知我。

有兴趣者请与我联系索取pdg2.dll(wjt@sina.com)


ssreader352

标 题:ssreader.exe 352 破解过和简述 (1千字)
发信人:wu jing ting
时 间:2001-4-15 1:42:23
详细信息:
令晚上网用超星下载一本builder的书，谁知它说我没有读卡注册，试着破解，竟轻易成功。

装上trw2000，运行ssreader，用它默认网址选择电脑类书籍，要进行阅读跳出提示窗口，它提示没有读书卡注册，要现在注册否，就在这个提示窗口处于焦点时，ctrl+n trw中断之后，下命令pmodudle ，再按ctrl+n,在提示窗口中选否，窗口被关闭，又被trw拦截，
0167:0040A07D 7538 JNZ 0040A0B7 (NO JUMP)
0167:0040A07F 6A24 PUSH BYTE +24
0167:0040A081 68FE245100 PUSH DWORD 005124FE
0167:0040A086 68DB245100 PUSH DWORD 005124DB
0167:0040A08B 8BC3 MOV EAX,EBX
0167:0040A08D E80AE70B00 CALL 004C879C
0167:0040A092 50 PUSH EAX
0167:0040A093 E81C621000 CALL `USER32!MessageBoxA`

中断在此处
0167:0040A098 83F806 CMP EAX,BYTE +06
0167:0040A09B 7509 JNZ 0040A0A6

往上发现有跳转指令 0040A07D 可跳过这个提示窗口，试着把它改成
jmp short 0040A0B7
又重新一试，不出现提示注册窗口，竟然成功！！可以阅读和下载书了!真是得来全不费工夫！
接下来的事就既改ssreader.exe中的机器码了.
ssreader.exe 352用upx加壳了的，要先脱壳，脱壳程序方法看雪教程里都有，我的破解知识全是从看雪教程学的，感谢看雪！！
说出来，让让有破解基础的初学者好练习，也好下载书籍。


Stealth Anonymizer 2.6

 标 题:[吐血推荐]关于Stealth Anonymizer，也请看看上文为盼！ (1千字)
发信人:tangdx
时 间:2001-8-12 16:40:09
详细信息:
各位看客，你们好！
自从七月的中国大封网以来，这次封网于以往的屏蔽代理服务器方式大不同。有些站点如www.xys.org（我一直比较喜欢的文学站点）即使用代理服务器也不能访问！各位访问YAHOO的搜索功能（主题词BIGNEWS和BIGNE ）即可明了。我一直在寻找可以自由浏览的方式。功夫不负有心人！终于找到了。这就是：
Stealth Anonymizer 2.6
http://www.photono-software.de/Stealther/

该软件允许你掩饰身份访问、拦阻cookie、观察、修改有关你的网络浏览器发出的私人信息。浏览访问时为每个页自动改变代理使之保证最大的安全。批量检查每个代理服务器其响应时间、验证其匿名性等。
它有三种浏览模式可选：直接连接，Stealth Mode, Super Stealth Mode。Super Stealth Mode，这种模式下用代理访问的进出数据全是加密，浏览器的代理首先要设置为127.0.0.1:14000(或localhost:14000) 。未注册不提代Super Stealth Mode。注册方式：在线注册
现在让我们去CRACK吧！

工具： FI
DEDE
TRW2000
这些大家都应该明了！

首先运行该软件和DEDE、TRW2000。由于该软件用DELPHI4编写，故可用DEDE方便地DUMP出来。看DEDE中PROCETURES栏，其中有UnitName:u_unlock ClassName:Tfrm_unlock一项。这就是我们的目标。选中它，在右边框可以看到Events:finished_veri RVA:004928B8 Hint:0014一项。双击它我们可以看到以下代码：

00492905 E86A8EFFFF call 0048B774
0049290A 3C01 cmp al, $01
0049290C 757F jnz 0049298D

* Possible String Reference to: "Unlock Key Verification Progress SU
| CCESSFULL!"
|

看清楚的吗？！
让我们来注册Stealth Anonymizer吧！选File/Unlock Trial Version
在其中随意填些字符，我填的是B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8
用TRW2000设断点BPX 0049290A，注册，中断，修改al为01即可。
至于其注册原理我并无仔细研究，SORRY！


Swish 2.0 alpha 1

标 题:Swish 2.0 alpha 1不完全破解，看来得找找EnableMenuItem的标记 (2千字)
发信人:小小K
时 间:2000-12-28 12:09:01
详细信息:
软件名称：Swish 2.0 alpha 1
软件功能：可以容易的做出FLASH特技动画
下载地址：ftp://202.102.233.11/ke/photo/SetupSwish200a1.rar

BPX GETWINDOWTEXT (因为，你每输入一个字符就去比较注册)

0167:0044B552 CALL 00511343
0167:0044B557 MOV AL,[EBX] <-----输入的号,从第一个开始
0167:0044B559 TEST AL,AL
0167:0044B55B JZ 0044B579
0167:0044B55D MOV [EBP-10],EBX
0167:0044B560 SUB AL,30
0167:0044B562 PUSH EAX
0167:0044B563 CALL 0041FDD9 <-----个个变码出来
0167:0044B568 POP ECX
0167:0044B569 MOV ECX,[EBP-10]
0167:0044B56C MOV [ECX],AL
0167:0044B56E MOV AL,[ECX+01]
0167:0044B571 INC ECX
0167:0044B572 TEST AL,AL
0167:0044B574 MOV [EBP-10],ECX
0167:0044B577 JNZ 0044B560 <-----是否全变码完成
0167:0044B579 PUSH BYTE +24
0167:0044B57B LEA EAX,[EBP+FFFFFF4C]
0167:0044B581 PUSH BYTE +00
0167:0044B583 PUSH EAX
0167:0044B584 CALL 004B5610
……（略）
0167:0044B61F PUSH EAX
0167:0044B620 LEA EAX,[EBP-44]
0167:0044B623 PUSH EAX
0167:0044B624 CALL 004B51D0 <-----？？？
0167:0044B629 PUSH EDI
……（略）
0167:0044B709 E892990600 CALL 004B50A0
0167:0044B70E 83C40C ADD ESP,BYTE +0C
0167:0044B711 85C0 TEST EAX,EAX <-----此时，EBX=0 我把此改为：TEST EBX,EBX (呵…)
0167:0044B713 7414 JZ 0044B729 <-----EAX=0,提示注册码正确；
0167:0044B715 E8BED80D00 CALL 00528FD8 <-
0167:0044B71A E8B9D80D00 CALL 00528FD8 <-
0167:0044B71F 8B400C MOV EAX,[EAX+0C]
0167:0044B722 6838010000 PUSH DWORD 0138 <-0138
0167:0044B727 EB1E JMP SHORT 0044B747
0167:0044B729 395D0C CMP [EBP+0C],EBX
0167:0044B72C 7507 JNZ 0044B735
0167:0044B72E 53 PUSH EBX
0167:0044B72F FF1578D55400 CALL `USER32!MessageBeep`
0167:0044B735 E89ED80D00 CALL 00528FD8 <-
0167:0044B73A E899D80D00 CALL 00528FD8 <-
0167:0044B73F 8B400C MOV EAX,[EAX+0C]
0167:0044B742 6832010000 PUSH DWORD 0132 <-0132
0167:0044B747 50 PUSH EAX
0167:0044B748 FF15FCD65400 CALL `USER32!LoadIconA`
……（略）

只是由于时间、精力、功力……因素，注册码又长（50位）；唉…只好用用暴力……
我是把 TEXT EAX,EAX 改为 TEXT EBX,EBX
F: 83C40C85C07414E8
^^
E: 83C40C85DB7414E8
^^
但，好奇怪，注册完成后，他还是无法'输出'？？？？（网上的注册机算出来的号也不行！）
看来得找找EnableMenuItem的标记；
有谁可以交流一下吗？

小小K
2000.12.28


system cleaner 98

标 题:SYSTEM CLEANER 暴力破解 (1千字)
发信人:kobe
时 间:2001-1-4 21:30:17
详细信息:
————————————————————————
system cleaner 98的破解 ]
————————————————————————
说起system cleaner来，这个软件还是不错的，对window$
的用户。。。。西。。。系统中总有些没用的东东，想
clean掉么？？？？用systemcleaner吧。。。他可以让
你一夜之间，，，，~~~~~~~~~~~~~~
西。。。不做广告了。。let's begin>>>>>>>>
此软件有时间限制，30天，之后不registe 就玩完了！！！
哈。。。
其实很简单crack就是了！
.....“在那里，在那里见过你。。。你的笑容这样熟悉。。”
这次破接我没用softice，，够很吧？
首先。 win32dasm 反汇编，，，，
等啊等啊。。。。。。。。。。。。
。
。
。
到
0049ce53 ba1e000000 mov edx,0000001e
0049ce58 e8aba3feff call 00487208
0049ce5d 8b03 mov eax,[ebx]
0049ce5f ba05000000 mov edx,00000005
0049ce64 e86fa4feff call 004872d8
.
.
.
.
其中1e是不是很熟？right 他就是30 的16进制
接下来。。。。
改之》》》》》》
用hview 或cooldebug都可以！
我用hview。。
用hex搜到ba 1e 00 00 00 改为=====》》》ba ff ff ff 00
ok!!!!!!!
可用上亿天，，，，岂不是合注册版一样。。。
哈哈。。。。。。
————————————————————

注：cooldebug 的改发也一样。。。
同样，debug 也可改。。。。
————————————————————


The Cleaner 3.2 BUILD 3205

标 题:The Cleaner 3.2 BUILD 3205的破解(10千字)
发信人:TAE!
时 间:2001-1-27 13:03:37
详细信息:
我(TAE!)的第二篇破解教程
目标软件:The Cleaner 3.2 BUILD 3205
保护方式:序列号
破解方法:暴力破解
下载地址:http://www.moosoft.com
软件简介:The Cleaner searches your hard drive cleans it of all known
Trojans. Using a unique patent-pending technology, The Cleaner
compares each file against a list of all know Trojans. You
can scan your entire system or just one file. The program
also allows you to periodically update your Trojan database
file to keep it current with the latest research. If you're
going to expose your system to the dangers of the internet,
keep it clean with The Cleaner!

此软件以前的版本如3.1很好破解,但这个3.2版的注册码始终搞不定,跟踪的时候
发现内存中出现了3.1版本的两个注册码,但在此版本中不能用.
但暴力破解却非常简单,先用fileinfo检查一下它穿了什么"衣服",哦,原来是UPX0.9?
用TRW载入程序,跟踪,脱壳.

顺便问一下
:XXXX:XXXXXXXX PUSH EAX <-----为什么我在这一行用TRW的makepe命令时,它会说: ........ Rebuild Import Table error!
脱壳后反汇编它,查找串式数据,发现出现了以前版本的注册码3310-EEC2-21D0-0C82于是
双击它,出现下面的程序.
* Referenced by a CALL at Addresses:
|:00495B11 , :004A98CD , :004AD6B2
|
:004B252C 55 push ebp
:004B252D 8BEC mov ebp, esp
:004B252F 81C4F0FDFFFF add esp, FFFFFDF0
:004B2535 53 push ebx
:004B2536 56 push esi
:004B2537 57 push edi
:004B2538 33D2 xor edx, edx
:004B253A 8995F4FDFFFF mov dword ptr [ebp+FFFFFDF4], edx
:004B2540 8995F0FDFFFF mov dword ptr [ebp+FFFFFDF0], edx
:004B2546 8955FC mov dword ptr [ebp-04], edx
:004B2549 8955F8 mov dword ptr [ebp-08], edx
:004B254C 8BF8 mov edi, eax
:004B254E B908000000 mov ecx, 00000008
:004B2553 8D8508FEFFFF lea eax, dword ptr [ebp+FFFFFE08]

* Possible StringData Ref from Data Obj ->"
String?@"
|
:004B2559 8B15AC104000 mov edx, dword ptr [004010AC]
:004B255F E8441DF5FF call 004042A8
:004B2564 33C0 xor eax, eax
:004B2566 55 push ebp
:004B2567 68F1284B00 push 004B28F1
:004B256C 64FF30 push dword ptr fs:[eax]
:004B256F 648920 mov dword ptr fs:[eax], esp
:004B2572 33C0 xor eax, eax
:004B2574 55 push ebp
:004B2575 68A4284B00 push 004B28A4
:004B257A 64FF30 push dword ptr fs:[eax]
:004B257D 648920 mov dword ptr fs:[eax], esp
:004B2580 8B9750530000 mov edx, dword ptr [edi+00005350]
:004B2586 8D45FC lea eax, dword ptr [ebp-04]

* Possible StringData Ref from Data Obj ->"ibu.dll"
|
:004B2589 B90C294B00 mov ecx, 004B290C
:004B258E E8F517F5FF call 00403D88
:004B2593 8D8770B35101 lea eax, dword ptr [edi+0151B370]

* Possible StringData Ref from Data Obj ->"Unregistered Shareware"
|
:004B2599 BA1C294B00 mov edx, 004B291C
:004B259E E87115F5FF call 00403B14
:004B25A3 8D8774B35101 lea eax, dword ptr [edi+0151B374]
:004B25A9 E81215F5FF call 00403AC0
:004B25AE 8B45FC mov eax, dword ptr [ebp-04]
:004B25B1 E89E55F5FF call 00407B54
:004B25B6 84C0 test al, al
:004B25B8 0F84BA020000 je 004B2878
:004B25BE 8B55FC mov edx, dword ptr [ebp-04]
:004B25C1 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B25C7 E8562CF5FF call 00405222
:004B25CC 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B25D2 E8502FF5FF call 00405527
:004B25D7 8D9770B35101 lea edx, dword ptr [edi+0151B370]
:004B25DD 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B25E3 E8101BF5FF call 004040F8
:004B25E8 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B25EE E8D12EF5FF call 004054C4
:004B25F3 8D55F8 lea edx, dword ptr [ebp-08]
:004B25F6 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B25FC E8F71AF5FF call 004040F8
:004B2601 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B2607 E8B82EF5FF call 004054C4
:004B260C 8D8528FEFFFF lea eax, dword ptr [ebp+FFFFFE28]
:004B2612 E8112DF5FF call 00405328
:004B2617 8D8774B35101 lea eax, dword ptr [edi+0151B374]
:004B261D 8B55F8 mov edx, dword ptr [ebp-08]
:004B2620 E8EF14F5FF call 00403B14
:004B2625 8B45F8 mov eax, dword ptr [ebp-08]

* Possible StringData Ref from Data Obj ->"3310-EEC2-21D0-0C82"***
|
:004B2628 BA3C294B00 mov edx, 004B293C
:004B262D E81A18F5FF call 00403E4C
:004B2632 740F je 004B2643
:004B2634 8B45F8 mov eax, dword ptr [ebp-08]

* Possible StringData Ref from Data Obj ->"27F9-996A-BBBA-793E"***
|
:004B2637 BA58294B00 mov edx, 004B2958
:004B263C E80B18F5FF call 00403E4C
:004B2641 752A jne 004B266D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B2632(C)
|
:004B2643 8D8770B35101 lea eax, dword ptr [edi+0151B370]

* Possible StringData Ref from Data Obj ->"Unregistered Shareware"
|
:004B2649 BA1C294B00 mov edx, 004B291C
:004B264E E8C114F5FF call 00403B14
:004B2653 8D8774B35101 lea eax, dword ptr [edi+0151B374]
:004B2659 E86214F5FF call 00403AC0
:004B265E 33DB xor ebx, ebx
:004B2660 33C0 xor eax, eax
:004B2662 5A pop edx
:004B2663 59 pop ecx
:004B2664 59 pop ecx
:004B2665 648910 mov dword ptr fs:[eax], edx
:004B2668 E943020000 jmp 004B28B0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B2641(C)
|
:004B266D 8B45F8 mov eax, dword ptr [ebp-08]
:004B2670 E8C716F5FF call 00403D3C
:004B2675 83F813 cmp eax, 00000013
:004B2678 742A je 004B26A4
:004B267A 8D8770B35101 lea eax, dword ptr [edi+0151B370]

* Possible StringData Ref from Data Obj ->"Unregistered Shareware"
|
:004B2680 BA1C294B00 mov edx, 004B291C
:004B2685 E88A14F5FF call 00403B14
:004B268A 8D8774B35101 lea eax, dword ptr [edi+0151B374]
:004B2690 E82B14F5FF call 00403AC0
:004B2695 33DB xor ebx, ebx
:004B2697 33C0 xor eax, eax
:004B2699 5A pop edx
:004B269A 59 pop ecx
:004B269B 59 pop ecx
:004B269C 648910 mov dword ptr fs:[eax], edx
:004B269F E90C020000 jmp 004B28B0

一看就知道有三个地方调用,经过分析发现第一个Call是输入注册数据时的调用.第二个未知,而第三个就是程序启动时检查你是否已经注册,所以来到了这里

* Possible StringData Ref from Data Obj ->"Windows Directory: "
|
:004AD69A BA2CDE4A00 mov edx, 004ADE2C
:004AD69F E8E466F5FF call 00403D88
:004AD6A4 8B8574FFFFFF mov eax, dword ptr [ebp+FFFFFF74]
:004AD6AA E849F1FDFF call 0048C7F8
:004AD6AF 8B45FC mov eax, dword ptr [ebp-04]
:004AD6B2 E8754E0000 call 004B252C \ <----- 来到这里
:004AD6B7 84C0 test al, al - 看起来很眼熟呀!
:004AD6B9 754C jne 004AD707 / 将这里改为je试试
:004AD6BB 8B45FC mov eax, dword ptr [ebp-04]
:004AD6BE 0570B35101 add eax, 0151B370

* Possible StringData Ref from Data Obj ->"Unregistered Shareware"
|
:004AD6C3 BA48DE4A00 mov edx, 004ADE48
:004AD6C8 E84764F5FF call 00403B14
:004AD6CD 8B0DF06F4B00 mov ecx, dword ptr [004B6FF0]
:004AD6D3 A1B86F4B00 mov eax, dword ptr [004B6FB8]
:004AD6D8 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Data Obj ->"念@"
|
:004AD6DA 8B15548D4900 mov edx, dword ptr [00498D54]
:004AD6E0 E85F37F8FF call 00430E44
:004AD6E5 A1F06F4B00 mov eax, dword ptr [004B6FF0]
:004AD6EA 8B00 mov eax, dword ptr [eax]
:004AD6EC E8DB18F8FF call 0042EFCC
:004AD6F1 83F802 cmp eax, 00000002
:004AD6F4 7511 jne 004AD707
:004AD6F6 A1B86F4B00 mov eax, dword ptr [004B6FB8]
:004AD6FB 8B00 mov eax, dword ptr [eax]
:004AD6FD E88238F8FF call 00430F84
:004AD702 E951060000 jmp 004ADD58

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004AD6B9(C), :004AD6F4(C)
|

* Possible StringData Ref from Data Obj ->"Load Database"
|
:004AD707 B868DE4A00 mov eax, 004ADE68
:004AD70C E8E7F0FDFF call 0048C7F8
:004AD711 8B45FC mov eax, dword ptr [ebp-04]
:004AD714 80B86053000000 cmp byte ptr [eax+00005360], 00
:004AD71B 7417 je 004AD734
:004AD71D A12C6F4B00 mov eax, dword ptr [004B6F2C]
:004AD722 8B00 mov eax, dword ptr [eax]
:004AD724 8B80E4010000 mov eax, dword ptr [eax+000001E4]

* Possible StringData Ref from Data Obj ->"Loading database..."
|
:004AD72A BA80DE4A00 mov edx, 004ADE80
:004AD72F E88C57F9FF call 00442EC0

将:004AD6B9 754C jne 004AD707
改为: 744C je 004ad707

运行一下,果然注册成功,再也不会出现注册提示框了.


UltraEdit-32 v8.10.a

 标 题:UltraEdit-32 v8.10.a 暴力破解 (4千字)
发信人:BinC
时 间:2001-5-11 15:05:38
详细信息:
UltraEdit-32 v8.10.a 暴力破解
（转载请保持完整，谢谢！）

作者：BinC
E-Mail: ket-c@21cn.com
HomePage: http://reredrum.126.com
破解工具：W32DASM
破解日期：2001.05.07
整理日期: 2001.05.11

软件名称：UltraEdit-32
最新版本：v8.10.a
软件授权：共享软件
使用平台：Win95/98/NT
软件下载：抱歉，忘了！^_^但相信许多站点都有。
软件简介：
不用多说，Window最好的16进制编辑器。

前言：
这里这种破解方法参考了丁丁虾（想称呼为“丁丁虾大虾”，但总觉得别扭，只好委屈你了^_^）破解UltraEdit-32 v7.0a的文档，特别感谢！

首先使用W32DASM反汇编。找到以下代码：

* Possible StringData Ref from Data Obj ->"Settings"
|
:00480CE0 68F8FC4F00 push 004FFCF8
:00480CE5 E89265F9FF call 0041727C
:00480CEA A1D48E5000 mov eax, dword ptr [00508ED4]
:00480CEF 2B05E08E5000 sub eax, dword ptr [00508EE0]
:00480CF5 50 push eax
:00480CF6 E8824D0100 call 00495A7D
:00480CFB 83F82D cmp eax, 0000002D
~~~~~~~~~~~~~~~~~比较日期，2D为45天，最大可改为120(7F)天，但没什么意义:)
:00480CFE 59 pop ecx
:00480CFF 7F0C jg 00480D0D
:00480D01 399E48010000 cmp dword ptr [esi+00000148], ebx
:00480D07 0F8576FFFFFF jne 00480C83

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00480CFF(C)
|
:00480D0D E81890F8FF call 00409D2A
~~~~~~~~~~~~~当软件过期时，此CALL将弹出填写注册码的窗口，改为nop可跳过
:00480D12 391DA08E5000 cmp dword ptr [00508EA0], ebx
:00480D18 758A jne 00480CA4
~~~~~~~~~~~~当软件过期时弹出填写注册码的窗口按Cancel按钮后，将弹出警告窗口，改为je可跳过
:00480D1A A19C055000 mov eax, dword ptr [0050059C]
:00480D1F 894510 mov dword ptr [ebp+10], eax
:00480D22 894514 mov dword ptr [ebp+14], eax

* Possible Reference to String Resource ID=00068: "UltraEdit 45 Day Evaluation time expired!!!!"
|
:00480D25 6A44 push 00000044
:00480D27 8D4D10 lea ecx, dword ptr [ebp+10]
:00480D2A C645FC02 mov [ebp-04], 02
:00480D2E E8B7A30200 call 004AB0EA

* Possible Reference to String Resource ID=00069: "To continue to use UltraEdit you must send the registration "
|
:00480D33 6A45 push 00000045
:00480D35 8D4D14 lea ecx, dword ptr [ebp+14]
:00480D38 E8ADA30200 call 004AB0EA
:00480D3D 6830200000 push 00002030
:00480D42 FF7510 push [ebp+10]
:00480D45 FF7514 push [ebp+14]
:00480D48 53 push ebx

…………
……

这样就去掉了过期时弹出的窗口。现在我们来改掉未过期时弹出的窗口，在此代码基础上向上查找，来到：

* Possible StringData Ref from Data Obj ->"Days to expire"
|
:00480C6E 68A4FD4F00 push 004FFDA4
:00480C73 57 push edi
:00480C74 E80366F9FF call 0041727C
:00480C79 A1D48E5000 mov eax, dword ptr [00508ED4]
:00480C7E A3E08E5000 mov dword ptr [00508EE0], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00480D07(C)
|
:00480C83 391DA08E5000 cmp dword ptr [00508EA0], ebx
:00480C89 7519 jne 00480CA4
~~~~~~~~~~~~~这个跳转将弹出未过期时的提示窗口，改为je可不跳转

* Possible Reference to String Resource ID=00005: "ULTRAEDT.MAC"
…………
………

分析过后，用UltraEdit32打开UE主程序文件（用UltraEdit改UltraEdit？？以毒攻毒？？呵呵），然后这样改：
一、试用日期：存放在地址：00080CFDH ，最大为120天（即7FH），默认为45天（即2DH）；
二、去掉未过期时的注册警告窗口：地址 00080C89H 的 75 改为 74
三、过期时：
1、去掉填写注册码的窗口：00080D0DH —— 00080D12H(共5个字节）全改为 90
2、去掉过期的警告窗口：00080D18H 的 75 改为 74

这样改后，还有一点微暇，就是软件启动后主窗体没有马上得到焦点，得过一段时间（等于弹出窗口从弹出到关闭这段时间）才能得到焦点，估计UE使用了计时器，如果能找到的话就爽了……^_^

后记：此软件非常“热门”（指破解），相信网上关于此软件的破解方法满天飞，这里用的是最简单的破解法，水平不高，但也是我初学破解的一点经验，还希望能得到高手的指点！

BinC
10:47 11.05.2001
mailto: ket-c@21cn.com


Update NOW 2000

标 题:Update NOW 2000 暴力破解方法！ (8千字)
发信人:洋白菜
时 间:2001-2-11 23:15:31
详细信息:
Update NOW 2000 暴力破解方法！

工具：trw2000 (搞破解人士必备物品，可以消痛止血、健脾、化痰.....)
IDA (巨酷的软件，高手必备)
HIEW (不用他改字节用什么？)

步骤一：先下载Update NOW 2000 （@#$@%$&^%）
步骤二：先用W32dsm反编译，结果出错！（@#$@%$&^%）
步骤三：知道他防W32dsm，那么我们的IDA就要上场了！！用IDA反编译！（使用方法到看雪那里找）
步骤四：在注册处随便输入几个字符提示谢谢（这也要谢？）发现他写到windows/update.ini里面
NAME=xxxxx
SERIAL=xxxxx
那么根据福尔莫斯理论，我们已经找到关键的线索的在IDA下找着SERIAL字符串（最好加上那个找字符串的插件），
会找到好几个，
但是关键在这里

004356FD push offset aName ; "NAME"
00435702 lea edx, [esp+278h+var_258]
00435706 push offset aOption ; "OPTION"
0043570B push edx
0043570C mov ecx, eax
0043570E call sub_48716A
00435713 push eax
00435714 lea ecx, [esp+274h+var_250]
00435718 mov byte ptr [esp+274h+var_4], 5
00435720 call sub_470D4D
00435725 lea ecx, [esp+270h+var_258]
00435729 mov byte ptr [esp+270h+var_4], 3
00435731 call sub_470C14
00435736 mov eax, [esp+270h+var_250]
0043573A cmp [eax-8], esi
0043573D jz loc_4358D5
00435743 push offset aRegister ; "register" --------黑名单！
00435748 push eax
00435749 call __strcmpi
0043574E add esp, 8
00435751 cmp eax, esi
00435753 jz loc_4358D5
00435759 mov eax, [esp+270h+var_250]
0043575D push offset aHanliner ; "hanliner" --------黑名单！
00435762 push eax
00435763 call __strcmpi
00435768 add esp, 8
0043576B cmp eax, esi
0043576D jz loc_4358D5
00435773 mov ecx, [esp+270h+var_250]
00435777 push offset aOpq98 ; "opq98" --------黑名单！（这个知道是谁吧，哈哈！）
0043577C push ecx
0043577D call __strcmpi
00435782 add esp, 8
00435785 cmp eax, esi
00435787 jz loc_4358D5
0043578D mov edx, [esp+270h+var_250]
00435791 push offset aWenling ; "wenling"
00435796 push edx
00435797 call __strcmpi
0043579C add esp, 8
0043579F cmp eax, esi
004357A1 jz loc_4358D5
004357A7 push 6
004357A9 push offset aWww_pcchina_ne ; "www.pcchina.net"
004357AE lea eax, [esp+278h+var_18C]
004357B5 push 0FFFFFFC7h
004357B7 push eax
004357B8 lea ecx, [esp+280h+var_250]
004357BC call sub_401800
004357C1 push ecx
004357C2 mov ecx, esp
004357C4 mov [esp+284h+var_260], esp
004357C8 push eax
004357C9 call sub_470C82
004357CE mov ecx, ebp
004357D0 call sub_43B100
004357D5 call ?AfxGetModuleState@@YGPAVAFX_MODULE_STATE@@XZ ; AfxGetModuleState(void)
004357DA mov eax, [eax+4]
004357DD push esi
004357DE push offset aSerial ; "SERIAL" -------开始启动的时候检验这里！
004357E3 lea ecx, [esp+278h+var_258]
004357E7 push offset aOption ; "OPTION"
004357EC push ecx
004357ED mov ecx, eax
004357EF call sub_48716A
004357F4 push eax
004357F5 lea ecx, [esp+274h+var_254]
004357F9 mov byte ptr [esp+274h+var_4], 6
00435801 call sub_470D4D
00435806 lea ecx, [esp+270h+var_258]
0043580A mov byte ptr [esp+270h+var_4], 3
00435812 call sub_470C14
00435817 lea edi, [esp+270h+var_18C]
0043581E or ecx, 0FFFFFFFFh
00435821 xor eax, eax
00435823 repne scasb
00435825 not ecx
00435827 dec ecx
00435828 lea edi, [esp+270h+var_10C]
0043582F mov edx, ecx
00435831 or ecx, 0FFFFFFFFh
00435834 repne scasb
00435836 not ecx
00435838 dec ecx
00435839 cmp ecx, edx
0043583B jz short loc_43586D --------程序启动的时候这里条转往下可是一
0043583D 会儿程序又会条到会到下面！
0043583D loc_43583D: ; CODE XREF: sub_435550+36Bj -----又跳到这里！通过trw跟踪发现问题！
0043583D lea edi, [ebp+2D50h]
00435843 push esi
00435844 push 0B1h
00435849 mov ecx, edi
0043584B call sub_46BE10
00435850 test eax, eax
00435852 jz loc_4367F1
00435858 push 5
0043585A mov ecx, edi
0043585C call sub_4700EC --------这里出现那个延时干扰框！怎么办不不用说了吧！
00435861 mov edx, [ebp+2D6Ch]
00435867 push edx
00435868 jmp loc_435900

程序已经没有干扰了，但是是，关于里面还是未注册不爽，继续改！
============================================================
找到字符串UNREGISTERED

00401322 lea edi, [esp+138h+var_10C]
00401326
00401326 loc_401326: ; CODE XREF: sub_4011C0+184j
00401326 mov dl, [eax]
00401328 mov cl, dl
0040132A cmp dl, [edi]
0040132C jnz short loc_40134A
0040132E test cl, cl
00401330 jz short loc_401346
00401332 mov dl, [eax+1]
00401335 mov cl, dl
00401337 cmp dl, [edi+1]
0040133A jnz short loc_40134A
0040133C add eax, 2
0040133F add edi, 2
00401342 test cl, cl
00401344 jnz short loc_401326
00401346
00401346 loc_401346: ; CODE XREF: sub_4011C0+170j
00401346 xor eax, eax
00401348 jmp short loc_40134F
0040134A ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
0040134A
0040134A loc_40134A: ; CODE XREF: sub_4011C0+16Cj
0040134A ; sub_4011C0+17Aj
0040134A sbb eax, eax
0040134C sbb eax, 0FFFFFFFFh
0040134F
0040134F loc_40134F: ; CODE XREF: sub_4011C0+188j
0040134F test eax, eax
00401351 jnz short loc_401372 -------这里枪毙！
00401353 mov eax, [esp+138h+var_128]
00401357 lea ecx, [esp+138h+var_10C]
0040135B push eax
0040135C push offset aRegisteredToS_ ; "Registered to %s."
00401361 push ecx
00401362 call ds:wsprintfA
00401368 add esp, 0Ch
0040136B lea edx, [esp+138h+var_10C]
0040136F push edx
00401370 jmp short loc_401377
00401372 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

00401372
00401372 loc_401372: ; CODE XREF: sub_4011C0+EAj --这里是从004012AA条过来的，把那里枪毙
00401372 ; sub_4011C0+191j --这里是从00401351上面那里条过来的，也枪毙！
00401372 push offset aUnregistered ; "UNREGISTERED" --------在这里！
00401377
00401377 loc_401377: ; CODE XREF: sub_4011C0+1B0j
00401377 push 433h
0040137C mov ecx, esi

剩下的就是用HIEW去执行枪决了！一阵乱抢扫射后世界有寂静了下来！！
这几天没工夫研究它的注册算法！谁有空找一下吧！

洋白菜
http://www.crackbest.com
http://www.crackbest.net


VFP&EXE1.72C

标 题:暴破VFP&EXE1.72C (5千字)
发信人:maxl
时 间:2001-3-18 19:49:06
详细信息:
我得到的版本为VFP&EXE 1.72C (http://cfyn.yeah.net)
经分析其加密方式是这样的:
首先用自带的ZIP控件将原程序打包,再用内含的释放文件头与之合并为新
文件.当使用时文件头加载后,将打包程序段先释放到存在DESKTOP.INI的目录
下(如Recycled),再生成一个PATH文件,经锁定后,解压加载执行.
顺便说一下,VFP&EXE中的所谓的改文件结构,就是用不同的ZIP密码打包,
而另一种就是XOR.
至于它加密的文件很好脱壳,用BlastWave跟一下即可找到入口点,再用TRW
的MAKEPE便可脱掉.
现在我们来谈一下如何把VFP&EXE1.72变为注册版,LET'S GO
先脱壳(它是用UPX0.94压的)------UPX脱壳很简单我就不说了
再用W32DASM反成ASM后,我们可看到:

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004563B3(C), :00456460(C)
|
:00456481 A134B84500 mov eax, dword ptr [0045B834]
:00456486 8B96A4020000 mov edx, dword ptr [esi+000002A4]
:0045648C E80FD9FAFF call 00403DA0
:00456491 7509 jne 0045649C
:00456493 803D18B8450001 cmp byte ptr [0045B818], 01
:0045649A 747F je 0045651B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456491(C)
|

* Possible StringData Ref from Code Obj ->" 演示版"
|
:0045649C BABC664500 mov edx, 004566BC
:004564A1 8B8620020000 mov eax, dword ptr [esi+00000220]

..................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045649A(C)
|
:0045651B 8D85ECFBFFFF lea eax, dword ptr [ebp+FFFFFBEC]
:00456521 8B4DF4 mov ecx, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"Ver "
|
:00456524 BAE8664500 mov edx, 004566E8
:00456529 E8AED7FAFF call 00403CDC
:0045652E 8B95ECFBFFFF mov edx, dword ptr [ebp+FFFFFBEC]
:00456534 8B86F0010000 mov eax, dword ptr [esi+000001F0]
:0045653A E87172FCFF call 0041D7B0
:0045653F 8D85ECFBFFFF lea eax, dword ptr [ebp+FFFFFBEC]
:00456545 8B8EA4020000 mov ecx, dword ptr [esi+000002A4]

* Possible StringData Ref from Code Obj ->"注册给:"
|
:0045654B BAF8664500 mov edx, 004566F8
:00456550 E887D7FAFF call 00403CDC
:00456555 8B95ECFBFFFF mov edx, dword ptr [ebp+FFFFFBEC]
:0045655B 8B8620020000 mov eax, dword ptr [esi+00000220]
:00456561 E84A72FCFF call 0041D7B0

* Possible StringData Ref from Code Obj ->" === 谢谢您注册正式版！ "
->"==="
|
:00456566 BA08674500 mov edx, 00456708

将:00456491 7509 jne 0045649C ---->9090 nopnop
:0045649A 747F je 0045651B ---->EB7F jmp 0045651B
这两句PATH后就可显示为注册版了!
Is it easy? 不过别急,这时程序只是显示为注册版,但加密后的程序仍有次数限制. :(
下一步,我们来分析一下其限制所在,开头我不是提到一个释放文件头吗,那限制段就一定在其中了.
用ULTRAEDIT打开脱壳后的文件,在其中找ASCII字串"MZP"(可执行文件标识),一公有三处：
第一处就不说了,后两处各对应两个可执行文件,两个文件一模一样,长度为154113(25a01H)字节.
这两个文件便为释放文件头,那哪个是用于加密的呢? 你可在MZP后找一空区分别写上不同的字符
再用它去加密文件,之后,我们可查加密文件的头部,从而确定后一个是加密所用的文件头.
好了,即然确定了加密段,就让我们来看看它的代码:
把文件单独分离出来, 先运行一下弹出个框,说是“132版以下加密的,不能运行.”先别去管他，只要
能用说明就文件没坏,用FILEINFO先查一下(反汇编前必备), MY GOD!居然也用UPX压了,去壳再来,我们
可看到:
:0044C87D 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"\winhelq.ini"
..............

:0044C8B4 E8B7A8FBFF call 00407170
:0044C8B9 807DFE34 cmp byte ptr [ebp-02], 34
:0044C8BD 7604 jbe 0044C8C3
:0044C8BF C645FE01 mov [ebp-02], 02

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044C8BD(C)
|
:0044C8C3 807DFE33 cmp byte ptr [ebp-02], 33
:0044C8C7 7627 jbe 0044C8F0
:0044C8C9 8BC3 mov eax, ebx
:0044C8CB E804A9FBFF call 004071D4
:0044C8D0 6A30 push 00000030

* Possible StringData Ref from Code Obj ->"警告"
|
:0044C8D2 B9D0C94400 mov ecx, 0044C9D0

* Possible StringData Ref from Code Obj ->" 对不起！您的使用期已到，继续使用需注册，注册"
->"费200元。

注册信箱：cfyns@163.net "
->" 或

cfyns@21cn.com "
->"

欢迎您光临我的网站：http://cfyn.yeah.ne"
->"t "
原来它的次数限制放在C:\WINDOWS\winhelq.ini　(注:这是隐藏文件) 的RVA=D9处，用一次加一次.
判段在这里
:0044C8B4 E8B7A8FBFF call 00407170 获得使用次数
:0044C8B9 807DFE34 cmp byte ptr [ebp-02], 34
:0044C8BD 7604 jbe 0044C8C3　　　　　　　　　 超过34次就完了
:0044C8BF C645FE01 mov [ebp-02], 02
所以解限制的最简方法就是删了winhelq.ini　,不过做为一名CRACKER可不行，下面我们彻底破了它.
其实,改法很多,只要把7604--->9090就可以了,但改完后文件大了很多,再压一下还大，惨了放不回去了.
看来只有在不解压的情况下改了. 要不解压,首先想到的是用SMC(self modifying code), 但我不太会,
(高手可一试) 我改的方法是靠UPX的非全码加压,原来我们要改的7604并没有改变,所以,可这样改:
Search C10BC16C4B347604 (共两处)
modify to ------------9090
现在,你再加密试试,没有次数限制了吧. :)

MXL


VirTime HTMLock V1.4.0

 序 号:17896
标 题:VirTime HTMLock V1.4.0 破解之暴力篇 (7千字)
发信人:paulyoung
时 间:2001-5-6 4:21:13
详细信息:
VirTime HTMLock V1.4.0 破解之暴力篇

作 者：PaulYoung
时 间：2001.05.05 凌晨
软件简介：帮助您创建基于 JavaScript 的密码保护页面
DOWNLOAD: http://www.inhua.com/down/htl.zip
破解工具：RegMon,TRW 2000 V1.03,HIEW V6.55

**************************************************************************************************************

    今天下载了一个 VirTime HTMLock V1.4.0 ，本来想搞定它的注册码，可惜自己汇编水平有限，且现在已是夜深人静了，无奈何，先暴力解决它，哪位大虾有兴趣再算算它的注册码吧。
    （注：这个软件注册码采用了实时检验模式，注册码不正确则 OK 键禁用。）

    一、用 RegMon 监视，运行软件，发觉它读取如下两个注册表键值：

HKLM\SOFTWARE\VirTime\HTL1.4.0\UserName SUCCESS "NOBODY" （用户名）
HKLM\SOFTWARE\VirTime\HTL1.4.0\RegKey SUCCESS "NOKEY"　 （注册码）

    我想它会不会是启动时读取这两个键值并正确与否，来判断它是否为注册版，后经我反汇编分析，证实了我的猜测（分析过程略）

    二、打开 REGEDIT ，把这两个键值分别改为 "PaulYoung" and "78787878"
    三、用 TRW 2000 LOAD 此软件，F10　单步分析，如下：

//******************** Program Entry Point ********
:004630EC 55 push ebp
:004630ED 8BEC mov ebp, esp
:004630EF 83C4F4 add esp, FFFFFFF4
:004630F2 B8642F4600 mov eax, 00462F64
:004630F7 E8042FFAFF call 00406000
:004630FC A138574600 mov eax, dword ptr [00465738]
:00463101 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"HTMLock"
|
:00463103 BA6C314600 mov edx, 0046316C
:00463108 E81B18FEFF call 00444928
:0046310D E896DEFFFF call 00460FA8 //好面善哦，F8 跟进看一看
:00463112 84C0 test al, al
:00463114 7446 je 0046315C

***************
* Referenced by a CALL at Address:
|:0046310D
|
:00460FA8 55 push ebp
:00460FA9 8BEC mov ebp, esp
:00460FAB 6A00 push 00000000
:00460FAD 6A00 push 00000000
:00460FAF 6A00 push 00000000

...

F10直到

...

:0046102A B9C8104600 mov ecx, 004610C8
:0046102F 8B15E8684600 mov edx, dword ptr [004668E8]
:00461035 E85E2CFAFF call 00403C98
:0046103A C605F068460000 mov byte ptr [004668F0], 00
:00461041 C6050869460000 mov byte ptr [00466908], 00
:00461048 E87FFDFFFF call 00460DCC
:0046104D 8B15F4684600 mov edx, dword ptr [004668F4]
:00461053 A1F8684600 mov eax, dword ptr [004668F8]
:00461058 E827EBFFFF call 0045FB84 //D EAX=假注册码(F8 跟进看一看)

********
* Referenced by a CALL at Addresses:
|:004609C3 , :00460A3F , :00460C82 , :00461058
|
:0045FB84 55 push ebp
:0045FB85 8BEC mov ebp, esp
:0045FB87 83C4F8 add esp, FFFFFFF8
:0045FB8A 53 push ebx
:0045FB8B 56 push esi
:0045FB8C 33C9 xor ecx, ecx
:0045FB8E 894DF8 mov dword ptr [ebp-08], ecx
:0045FB91 8BDA mov ebx, edx
:0045FB93 8BF0 mov esi, eax
:0045FB95 33C0 xor eax, eax
:0045FB97 55 push ebp
:0045FB98 681EFC4500 push 0045FC1E
:0045FB9D 64FF30 push dword ptr fs:[eax]
:0045FBA0 648920 mov dword ptr fs:[eax], esp
:0045FBA3 C645FF00 mov [ebp-01], 00
:0045FBA7 8BC3 mov eax, ebx
:0045FBA9 E89E40FAFF call 00403C4C
:0045FBAE 83F802 cmp eax, 00000002
:0045FBB1 7C55 jl 0045FC08
:0045FBB3 8BC6 mov eax, esi
:0045FBB5 E89240FAFF call 00403C4C
:0045FBBA 83F824 cmp eax, 00000024 //注册码是否为36位
:0045FBBD 7C49 jl 0045FC08 //9090 NOP 掉(@ Offset 0005EFBDh)
:0045FBBF 33DB xor ebx, ebx
:0045FBC1 8BC6 mov eax, esi
:0045FBC3 E88440FAFF call 00403C4C
:0045FBC8 83E802 sub eax, 00000002
:0045FBCB 85C0 test eax, eax
:0045FBCD 7E0F jle 0045FBDE
:0045FBCF BA01000000 mov edx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045FBDC(C)
|
:0045FBD4 8A4C16FF mov cl, byte ptr [esi+edx-01]
:0045FBD8 02D9 add bl, cl
:0045FBDA 42 inc edx
:0045FBDB 48 dec eax
:0045FBDC 75F6 jne 0045FBD4 （跟踪时要下 r fl z ,否则不能跟下去）

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045FBCD(C)
|
:0045FBDE 33C0 xor eax, eax
:0045FBE0 8AC3 mov al, bl
:0045FBE2 33D2 xor edx, edx
:0045FBE4 52 push edx
:0045FBE5 50 push eax
:0045FBE6 8D45F8 lea eax, dword ptr [ebp-08]
:0045FBE9 E85AFEFFFF call 0045FA48
:0045FBEE 8B45F8 mov eax, dword ptr [ebp-08]
:0045FBF1 8A400E mov al, byte ptr [eax+0E]
:0045FBF4 3A4622 cmp al, byte ptr [esi+22] 　 //比较第35位（比较是否为 "i" )
:0045FBF7 750F jne 0045FC08 　　　　 　　 //750F改为740F (@ Offset 0005EFF7h)
:0045FBF9 8B45F8 mov eax, dword ptr [ebp-08]
:0045FBFC 8A400F mov al, byte ptr [eax+0F]
:0045FBFF 3A4623 cmp al, byte ptr [esi+23]　　 //比较第36位（比较是否为"D" )
:0045FC02 7504 jne 0045FC08 　　　　　　//7504改为7404　（@ Offset 5F002h）
:0045FC04 C645FF01 mov [ebp-01], 01 //程序走到这里就可以注册成功了

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045FBB1(C), :0045FBBD(C), :0045FBF7(C), :0045FC02(C)
|
:0045FC08 33C0 xor eax, eax
:0045FC0A 5A pop edx

*****

:0046312E E8BDDAFFFF call 00460BF0
:00463133 84C0 test al, al
:00463135 7514 jne 0046314B
:00463137 8B1570554600 mov edx, dword ptr [00465570]
:0046313D 8B12 mov edx, dword ptr [edx]
:0046313F A170554600 mov eax, dword ptr [00465570]
:00463144 8B00 mov eax, dword ptr [eax]
:00463146 E885F7FFFF call 004628D0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463135(C)
|
:0046314B A138574600 mov eax, dword ptr [00465738]
:00463150 8B00 mov eax, dword ptr [eax]
:00463152 E8351CFEFF call 00444D8C //弹出软件运行界面

    "This program is registered to PaulYoung.Thank you for useing this program."

    YEAH!!!!!!!! zzzzZZZZZZZZ（你干什么？我想睡觉！！！！！:D )

    由于小弟学习 Crack 没几天，且这个软件我还未使用过，如有错误之处，望各位大侠指出，多谢多谢！！

**************************************************************************************************************
欢迎光临我的网络小屋：

"Cracker 初体验"

http://paulyoung.yeah.net


Virtual Driver 2000 (tm) Version 5.0

标 题:如何制作注册版的Virtual Driver 2000 (tm) Version 5.0 (2千字)
发信人:IceFish
时 间:2001-2-3 0:12:36
详细信息:
如何制作注册版的Virtual Driver 2000 (tm) Version 5.0:

一、当出现提示框"Virtual Drive Evaluation Version .Please click "OK" to contiue "时，
在Ctrl+n进入trw中，
:pmodule (返回)
按下“OK”鍵,程序中断如下:
(分析可见旁边注释)

0177:0040C632 LEA ECX,[EBP+FFFFFF10]
0177:0040C638 MOV BYTE [EBP-04],11
0177:0040C63C CALL `ZEN!?GetDWORD@ZRegBase@@QAEKH@Z`
0177:0040C642 CMP DWORD [0042BA08],BYTE +00 //与42BA08中比较
0177:0040C649 MOV ESI,EAX
0177:0040C64B JZ 0040C65B //相等则可跳过那个提示框:)
0177:0040C64D PUSH BYTE -01
0177:0040C64F PUSH BYTE +00
0177:0040C651 PUSH DWORD 01C8
0177:0040C656 CALL `MFC42!ord_000004AF` //提示框"Virtual Drive Evaluation Version...."
0177:0040C65B TEST ESI,ESI //你会在这儿中断，请向上看
0177:0040C65D JZ NEAR 0040C838
0177:0040C663 MOV EAX,[EBP-14]
0177:0040C666 CMP DWORD [EAX+0178],BYTE +00

在0040c642处可下d 42BA08 可见这个内存中的值为15，我将其改为0。再回到程序中，此时的
mgr已经是注册版了。我想知道程序是在哪儿给42BA08赋值的,于是下bpm 42BA08.

二，设好断点
:bpm 42ba08,
重新运行mgr.exe，程序果然中断。
0177:0040BAB1 PUSH DWORD 1393
0177:0040BAB6 LEA ECX,[EBP-20]
0177:0040BAB9 CALL `ZEN!?GetDWORD@ZRegBase@@QAEKH@Z`
0177:0040BABF MOV ECX,EAX
0177:0040BAC1 AND ECX,FF00
0177:0040BAC7 CMP ECX,9900
0177:0040BACD JNZ 0040BADB
0177:0040BACF MOV ECX,1113
0177:0040BAD4 AND EAX,FF
0177:0040BAD9 JMP SHORT 0040BAF3 //如果跳到0040BAF1，哈哈。。
0177:0040BADB CMP ECX,8800
0177:0040BAE1 JNZ 0040BAEF
0177:0040BAE3 MOV ECX,4811
0177:0040BAE8 AND EAX,FF
0177:0040BAED JMP SHORT 0040BAF3
0177:0040BAEF MOV ECX,EAX
0177:0040BAF1 XOR EAX,EAX //EAX清零^_^
0177:0040BAF3 MOV [ESI+D0],EAX //给42BA08赋值:),再向上看
0177:0040BAF9 CMP ECX,1113 //你会在这儿中断
0177:0040BAFF JZ 0040BB54
0177:0040BB01 CMP ECX,4811
0177:0040BB07 JZ 0040BB60
0177:0040BB09 PUSH DWORD 0042B3B4
0177:0040BB0E LEA EAX,[EBP-10]
0177:0040BB11 PUSH DWORD 1B5B
0177:0040BB16 PUSH EAX
0177:0040BB17 CALL `MFC42!ord_00000B01`

三、用hiew将0040BA09改为JMP SHORT 0040BAF1,此时mgr就被patch为注册版的了。只需改动一个
字节。^_^

*****　程序早就破过了，应peterchen要求,写了这个简要的过程，希望大家能够喜欢!

                        十三少
                      China Cracking Group
                           2000.2.2


Visual Zip Password Recovery 4.0

 标 题:Visual Zip Password Recovery 4.0破解 (1千字)
发信人:yuky
时 间:2000-10-13 12:28:11
详细信息:
此软件可破解Winzip加密的密码,不注册会不断弹出对话框。本人认为此软件很优秀,速度快,支持多台计算机并行计算。

打开注册对话框，name:yxg,registration key:78787878,在trw2000中下bpx hmemcpy，被拦下单步跟踪，这里离比对处还很远，眼都有些受不了了，看到

:474d7a mov edx,[ebp-4];edx:'yxg'

:474d95 mov edx,[ebp-8];edx:'78787878'

:48c058 mov eax,[48fb48]
:xxxxxx mov eax,[eax]; eax:'78787878'
:xxxxxx call 403ed0; 计算密码长度
:xxxxxx cmp eax,byte +10; 长度为16吗？
:xxxxxx jnz near 48c22a; 不同则跳出'The password is wrong!'

将eax改为10避开此跳，向下是对用户名密码的判断算法，不是太复杂，但懒得研究了，知道是从密码中取出一些数，和另外算出的8个数异或，最后一个为0则注册成功。直到

:48c11c cmp byte[ebp-7c],00
:xxxxxx jnz near 48c1ed; 如果不为0，跳出'The password is wrong!'

修改[ebp-7c]的值，避过此跳，按F5则注册成功！

所以改jnz near 48c1ed为nop就行了，

搜索:0f85c7000000
改为:909090909090

后记：因为暴力破解，并没有弄清楚注册过程，每次运行都要重新注册，只要密码为16位就可以。有空会弄清楚的，并写出注册机。


WebMirror

标 题:《破解webmirror残记》 (2千字)
发信人:alang
时 间:2001-1-11 5:33:21
详细信息:
暴力破解WebMirror
=======================================================

软件简介：可以将网站快速下载到本地，以供脱机浏览。它可以提
供页面大小和时间的信息。
操作系统:Win95/98/NT/2000
下载地址：http://www.maccasoft.com/webmirror/index.html
破解工具：反汇编工具、编辑器
级别：初级（大笨鸟）
本人初学,如有不正确之处,希望各位大侠给予指正.
本人信箱:langlirong@163.net
=======================================================
破解简单过程：
WebMirror在注册之后，显示注册信息，没有明显的错误提示。
首先打开w32dsm装入WebMirror（好在没有压缩），查找unregistered，
应该有三处还是四处记不准啦，在如下之处注意：

:00408261 89C6 mov esi, eax
:00408263 EB58 jmp 004082BD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004081AB(C)
|^^^^^^^^^^^^
* Possible StringData Ref from Data Obj ->"Unregistered Evaluation"
|
:00408265 BEA9C14200 mov esi, 0042C1A9
:0040826A 8DBC249E000000 lea edi, dword ptr [esp+0000009E]
:00408271 57 push edi

看到画底线处,跳到004081AB:

* Reference To: wmwin.W?GetSerial$:CRegisterDlg$n(pnapna)$CString$$
|
:004081A4 E82BA90000 call 00412AD4
:004081A9 85C9 test ecx, ecx
:004081AB 0F84B4000000 je 00408265 //改nop
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:004081B1 89F0 mov eax, esi
:004081B3 8DBC249E000000 lea edi, dword ptr [esp+0000009E]
* Reference To: wmwin.W?$cv:CString$n()pna
|
:004081BA E865DB0000 call 00415D24
:004081BF 89C6 mov esi, eax
:004081C1 57 push edi

干脆将004081AB 处的 0F84B4000000 改为 909090909090
保存退出,启动webmirror输入用户名和注册码,成功!
慢!为何显示0个人使用?看着不舒服,别急!
找到下面之处:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004081C8(C)
|
:004081DA 5F pop edi
:004081DB 83F901 cmp ecx, 00000001
:004081DE 7528 jne 00408208 //改 je
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Possible StringData Ref from Data Obj ->"1Ue Proa)UlmtdUes% sr"

将 jne 改为 je
好啦,该收工啦!

欢迎光临<阿郎据>
langlirong@163.net
http://alang.shangdu.net

10/1/2001


Winace v2.0b5

标 题:初探winace. (1千字)
发信人:arbiter
时 间:2001-2-1 23:07:33
详细信息:
Winace v2.0b5
压缩软件我比较喜用这个,因为它支持几乎所有的压缩格式,方便的很.
最新版是不是这个b5我也不知道了,但这个还是试用版,有功能限制.是不是可以
把它改成full function使用我也没尝试了,因为好累,而且破功能限制我都没有
经验呀,呵呵,见笑.
今天只是简单的分析了一下它的时间限制,还有就是找到了它的注册检测主程
,当然我也不知道那里面具体是不是注册校验部分,不过我大概看了一下,应该就

是它了,有兴趣有能力的朋友可以去看看. 如下.

主程序是用aspack2k压缩的,用unaspack 1.0.9.1可脱壳.

时间限制破解:
offset: 5a976c
改法:
sourceCode: 8b c3 34 01 74 07 8b 07 e8 e5 f5
substiCode: 8b c3 34 01 eb 07 8b 07 e8 e5 f5
注册主模块:
offset: 5c9782 ( 断在这里,上面将变换好的name和你输入的regcode
分别放入EDX,EAX )

可将此处校验改变使注册成功.

offset:
XXXX:002404fb CALL XXXXXXXX
TEST EAX, EAX
JZ XXXXXXXX
改法:
sourceCode: 85 c0 74 17 e8 07 ed 00 00 83 3d 88 65 29 00
substiCode: 85 c0 90 90 e8 07 ed 00 00 83 3d 88 65 29 00

上述两处修改在用编辑器查找时最好将整串全部查找.


winhex ver9.53

 标 题:免注册你的winhex ver9.53 (1千字)
发信人:电神魔鬼
时 间:2000-9-21 21:12:24
详细信息:
免注册你的winhex ver9.53

昨天看精华论的贴字时看到有人讨论winhex9.53的注册问题，呵呵......又撞我枪口上了。winhex是一个非常出色的专业16进制编辑器，扩展功能也十分强大，用它来找个账号密码类的易如反掌，不要瞎联想呀。而且它的注册方式也比较安全，初学cracker的人一般无从下手，它在填完注册码后，它把算过的密码存在WinHex.cfg中，在启动的时候比较，对的话注册，错的话当然就bb啦。现在谈谈winhex的要害和一般软件的通病，未注册的winhex不能存超过250kb的程序，会跳一个框的，告诉你没注册别想存盘。他倒霉就倒霉在这个框上了，我们下bpx lockmytask逆推跟踪，也就是往回倒着看呀，一定要在winhex的地盘看，否则的话你什么也找不到的，你会看见它比较[45759d]是不是0，不是0的话，就跳框，要害所在了，这里判断你是否是注册用户。我们关掉winhex下bpx hmemcpy，再重新启动winhex，被拦倒按f12到winhex领空，下bmp 45759d,按f5被拦到...剩下的事，就该你们的了，特超级的简单我只把结果写出来好了，分析方法适用于winhex Ver8.75-9.53。类似的还有winrar，不过这是keyfile保护的，都让人破烂了，我就不凑热闹了，此类软件的弱点都在弹处的框上，因为判断你没注册才跳框的，如果程序员们立刻改变注册保护，都在标题栏上写一个大DEMO，就得想其他对策了。好了废话写完了，我为什么要写这么多废话呢?因为winhex太简单，凑不够字数^-^。感谢看完我的废话。

ram:[45759d] ->01

450250 jnz 450280 ->nop

7521b85c
9090b85c

45027e jz 450284 ->jmp 450284

3b027404
3b02eb04

43e450 mov byte ptr [eax],00 ->mov byte ptr [eax],01

83E813C60000
83E813C60001

43e564 mov byte ptr [eax],00 ->mov byte ptr [eax],01

83e81bc6000000
83e81bc6000001

因字数不够，再凑点儿。winhex的主页上还有一个game修改器，由于是同一作者，注册方式一样:)。
贴出结果:

ram:[416a13] ->01

4129a9 jnz 4129c0 ->nop

7515B003
9090B003

4129be jz 4129c4 ->jmp 4129c4

3B05045F41007404
3B05045F4100eb04

cracked by 电神魔鬼
oicq:1789655有空呼我呀
thanks for your supports


WinHex9.6

 标 题:WinHex9.6破解手记,上次的有错漏，这次重贴。让各位见笑了。
发信人:hying[CCG]
时 间:2000-11-29 14:11:13
详细信息:
WinHex9.6破解手记,上次的有错漏，这次重贴。
WinHex是一个功能强大的编辑软件,最新是9.6版,我从其官方主页下载的软件包打开后,其WinHex.exe的日期是11月19日,如果不是这个日期的,即使同是9.6版,可能注册方法也可能会不一样.
WinHex把注册码存放在winhex.cfg中,比如code1为78787878(16进制04b23526),code2为69696969(16进制04277dc9),在winhex.cfg中就可查找到2635b204c97d2704,启动时读入内存ds:00458344和ds:00458348,用bpm 458344可停在如下地方.

0167:0043FE45 MOV EAX,[00458344] <-停在此处，取出code1
0167:0043FE4A MOV EDX,EAX
0167:0043FE4C SHL EAX,03
0167:0043FE4F SUB EAX,EDX
0167:0043FE51 ADD EAX,00016AAA
0167:0043FE56 TEST EAX,EAX
0167:0043FE58 JNS 0043FE5D
0167:0043FE5A ADD EAX,BYTE +07
0167:0043FE5D SAR EAX,03
0167:0043FE60 CMP EAX,[00458348] <-code1运算后和code2比较
0167:0043FE66 SETZ [0045A7B1] <-置标志位

上面一段代码很简单，大家都应该能读明白，破解似乎到此也该结束了,但事实是不管标志位为0或1,都显示未注册.而且下bpm 45a7b1发现这个标志位再也没有用到.而且code1和code2也再也没用到.难道没法注册吗？
再回头看,由它的未注册提示框向前反推,得到地址[45a7d3]是一个关键标志位,如为0则提示未注册,如位1则不在提示.那哪个地方对此标志置1呢?反汇编后找到如下地址

0167:0044016A CMP BYTE [0045A75F],00
0167:00440171 SETNZ AL
0167:00440174 MOV EDX,0045A7DB
0167:00440179 SUB EDX,BYTE +08
0167:0044017C MOV [EDX],AL

可看出45a75f如为0则标志位也为0,为未注册,如0045A75F处不为0,则为注册版.那又是哪个地方控制着45a75f的值呢？经查找有两个地方值得怀疑，其中一个是4152fb，但调试时发现始终没有运行到那个地方，另外一个是43fa17,它处在一个call内，全部调用如下：

0167:0043F8DC PUSH EBX
0167:0043F8DD PUSH ESI
0167:0043F8DE PUSH EDI
0167:0043F8DF PUSH EBP
0167:0043F8E0 ADD ESP,FFFFF004
0167:0043F8E6 PUSH EAX
0167:0043F8E7 ADD ESP,BYTE -04
0167:0043F8EA MOV EBP,ESP
0167:0043F8EC MOV EAX,00453BD4
0167:0043F8F1 CALL 0040D624
0167:0043F8F6 MOV EAX,0045AFC8
0167:0043F8FB MOV ECX,08000000
0167:0043F900 MOV EDX,80000000
0167:0043F905 CALL 0040AA04 <-进入看一下，下面有说明
0167:0043F90A MOV EBX,EAX
0167:0043F90C LEA EAX,[ESP+04]
0167:0043F910 MOV [EBP+00],EAX
0167:0043F913 PUSH DWORD 1000
0167:0043F918 MOV EAX,[EBP+00]
0167:0043F91B PUSH EAX
0167:0043F91C PUSH EBX
0167:0043F91D CALL `KERNEL32!_lread` <-读user.txt 注1
0167:0043F922 MOV [0045A884],EAX
0167:0043F927 PUSH EBX
0167:0043F928 CALL `KERNEL32!FindCloseChangeNotification`
0167:0043F92D INC EBX
0167:0043F92E JZ NEAR 0043FA77 <-如没读到则跳 （拜托！千万别让它跳）
0167:0043F934 CMP DWORD [0045A884],BYTE +19
0167:0043F93B JL NEAR 0043FA77 <-如文件太短则跳
0167:0043F941 MOV EAX,EBP
0167:0043F943 CALL 004099D4
0167:0043F948 TEST AL,AL
0167:0043F94A JZ NEAR 0043FA77
0167:0043F950 MOV EAX,EBP
0167:0043F952 CALL 00409A2C
0167:0043F957 TEST AL,AL
0167:0043F959 JZ NEAR 0043FA77
0167:0043F95F PUSH DWORD 00453BE0
0167:0043F964 PUSH DWORD 0045AFC8
0167:0043F969 CALL `KERNEL32!lstrcmpiA` 〈-第一行是否为"User:" 注2
0167:0043F96E TEST EAX,EAX
0167:0043F970 JNZ NEAR 0043FA77
0167:0043F976 MOV EAX,EBP
0167:0043F978 CALL 004099D4
0167:0043F97D TEST AL,AL
0167:0043F97F JZ NEAR 0043FA77
0167:0043F985 MOV EAX,EBP
0167:0043F987 CALL 00409A2C
0167:0043F98C TEST AL,AL
0167:0043F98E JZ NEAR 0043FA77
0167:0043F994 MOV EDX,0045AFC8
0167:0043F999 MOV EAX,0045A6A8
0167:0043F99E CALL 004050A4
0167:0043F9A3 MOV BL,02
0167:0043F9A5 MOV ESI,00453BE8
0167:0043F9AA MOV EDI,0045A6E5
0167:0043F9AF MOV EAX,EBP
0167:0043F9B1 CALL 004099D4
0167:0043F9B6 TEST AL,AL
0167:0043F9B8 JZ NEAR 0043FA77
0167:0043F9BE MOV EAX,EBP
0167:0043F9C0 CALL 00409A2C
0167:0043F9C5 TEST AL,AL
0167:0043F9C7 JZ NEAR 0043FA77
0167:0043F9CD PUSH ESI
0167:0043F9CE PUSH DWORD 0045AFC8
0167:0043F9D3 CALL `KERNEL32!lstrcmpiA` <-第3行是否为"Addr1:"
0167:0043F9D8 TEST EAX,EAX
0167:0043F9DA JNZ NEAR 0043FA77
0167:0043F9E0 MOV EAX,EBP
0167:0043F9E2 CALL 004099D4
0167:0043F9E7 TEST AL,AL
0167:0043F9E9 JZ NEAR 0043FA77
0167:0043F9EF MOV EAX,EBP
0167:0043F9F1 CALL 00409A2C
0167:0043F9F6 TEST AL,AL
0167:0043F9F8 JZ 0043FA77
0167:0043F9FA MOV EDX,0045AFC8
0167:0043F9FF MOV EAX,EDI
0167:0043FA01 CALL 004050A4
0167:0043FA06 ADD EDI,BYTE +3D
0167:0043FA09 ADD ESI,BYTE +07
0167:0043FA0C DEC BL
0167:0043FA0E JNZ 0043F9AF <-跳回，再比较第5行是否为"Addr2:"
0167:0043FA10 MOV BL,02
0167:0043FA12 MOV ESI,00453BF8
0167:0043FA17 MOV EDI,0045A75F <-注意这个地方，0045A75F比较可疑
0167:0043FA1C MOV EAX,EBP
0167:0043FA1E CALL 004099D4
0167:0043FA23 TEST AL,AL
0167:0043FA25 JZ 0043FA77
0167:0043FA27 MOV EAX,EBP
0167:0043FA29 CALL 00409A2C
0167:0043FA2E TEST AL,AL
0167:0043FA30 JZ 0043FA77
0167:0043FA32 PUSH ESI
0167:0043FA33 PUSH DWORD 0045AFC8
0167:0043FA38 CALL `KERNEL32!lstrcmpiA` <-第7行是否为"Code1:"
0167:0043FA3D TEST EAX,EAX
0167:0043FA3F JNZ 0043FA77
0167:0043FA41 MOV EAX,EBP
0167:0043FA43 CALL 004099D4
0167:0043FA48 TEST AL,AL
0167:0043FA4A JZ 0043FA77
0167:0043FA4C MOV EAX,EBP
0167:0043FA4E CALL 00409A2C
0167:0043FA53 TEST AL,AL
0167:0043FA55 JZ 0043FA77
0167:0043FA57 MOV EDX,EDI
0167:0043FA59 MOV EAX,0045AFC8
0167:0043FA5E MOV ECX,10
0167:0043FA63 CALL 0040D3A8 <-进入看一下，下面有说明
0167:0043FA68 CMP EAX,BYTE +10
0167:0043FA6B JNZ 0043FA77 <-第8行是否有32个字符.上次我竟然连16进
0167:0043FA6D ADD EDI,BYTE +10 制与10进制都没看清，真是糊涂
0167:0043FA70 ADD ESI,BYTE +07
0167:0043FA73 DEC BL
0167:0043FA75 JNZ 0043FA1C <-跳回，再比较第9行是否为"Code2:"、
0167:0043FA77 ADD ESP,1004 第10行是否有32个字符
0167:0043FA7D POP EBP
0167:0043FA7E POP EDI
0167:0043FA7F POP ESI
0167:0043FA80 POP EBX
0167:0043FA81 RET
————————————————————————————
CALL 0040AA04 的内容
0167:0040AA04 PUSH BYTE +00
0167:0040AA06 OR ECX,80
0167:0040AA0C PUSH ECX
0167:0040AA0D PUSH BYTE +03
0167:0040AA0F PUSH BYTE +00
0167:0040AA11 PUSH BYTE +01
0167:0040AA13 PUSH EDX
0167:0040AA14 PUSH EAX
0167:0040AA15 CALL `KERNEL32!CreateFileA` <-打开文件 注3
0167:0040AA1A RET
————————————————————————————
CALL 0040D3A8 的内容
0167:0040D3A8 PUSH EBX
0167:0040D3A9 PUSH ESI
0167:0040D3AA PUSH EDI
0167:0040D3AB PUSH EBP
0167:0040D3AC PUSH ECX
0167:0040D3AD MOV [ESP],ECX
0167:0040D3B0 MOV EBP,EDX <-EBP变为0045A75F
0167:0040D3B2 MOV EDI,EAX
0167:0040D3B4 XOR ESI,ESI
0167:0040D3B6 JMP SHORT 0040D3B9
0167:0040D3B8 INC EDI
0167:0040D3B9 MOV AL,[EDI] <-取第8行第1位
0167:0040D3BB CMP AL,20
0167:0040D3BD JZ 0040D3B8
0167:0040D3BF CMP AL,09
0167:0040D3C1 JZ 0040D3B8
0167:0040D3C3 CMP AL,0D
0167:0040D3C5 JZ 0040D3B8
0167:0040D3C7 CMP AL,0A
0167:0040D3C9 JZ 0040D3B8
0167:0040D3CB CMP BYTE [EDI],00
0167:0040D3CE JZ 0040D432
0167:0040D3D0 MOV AL,[EDI]
0167:0040D3D2 CMP AL,61
0167:0040D3D4 JC 0040D3DD
0167:0040D3D6 CMP AL,7A
0167:0040D3D8 JA 0040D3DD
0167:0040D3DA SUB BYTE [EDI],20
0167:0040D3DD INC EDI
0167:0040D3DE MOV AL,[EDI] <-取第8行第2位
0167:0040D3E0 CMP AL,61
0167:0040D3E2 JC 0040D3EB
0167:0040D3E4 CMP AL,7A
0167:0040D3E6 JA 0040D3EB
0167:0040D3E8 SUB BYTE [EDI],20
0167:0040D3EB MOV EAX,EDI
0167:0040D3ED DEC EAX
0167:0040D3EE MOV BL,[EAX]
0167:0040D3F0 MOV EAX,EBX
0167:0040D3F2 AND EAX,FF
0167:0040D3F7 BT [00453940],EAX
0167:0040D3FE JNC 0040D432 <-第1位为空则跳
0167:0040D400 MOV AL,[EDI]
0167:0040D402 AND EAX,FF
0167:0040D407 BT [00453940],EAX
0167:0040D40E JNC 0040D432 <-第2位为空则跳,
0167:0040D410 MOV EAX,EBX
0167:0040D412 CALL 0040D38C \
0167:0040D417 SHL EAX,04 |
0167:0040D41A PUSH EAX | 如第1、2位分别为"1"和"2",
0167:0040D41B MOV AL,[EDI] |- 则经此处变换后dl中值为16进
0167:0040D41D CALL 0040D38C | 制数"12"
0167:0040D422 POP EDX |
0167:0040D423 ADD DL,AL / /运行到此0045A75F已不再为零了,但启
0167:0040D425 MOV [EBP+ESI+00],DL <-\动画面仍有……only(仅供试用)字样
0167:0040D429 INC ESI <-每使用2位code,ESI加1
0167:0040D42A CMP ESI,[ESP] <-ESI是否等于16,故猜想code有32位
0167:0040D42D JZ 0040D432
0167:0040D42F INC EDI
0167:0040D430 JMP SHORT 0040D3B9
0167:0040D432 MOV EAX,ESI
0167:0040D434 POP EDX
0167:0040D435 POP EBP
0167:0040D436 POP EDI
0167:0040D437 POP ESI
0167:0040D438 POP EBX
0167:0040D439 RET
----------------------------------------------------------
如果第8行太短，则启动时会出现"For evaluation purposes only"(仅供试用)字样，由于小弟E文比较差劲，经有人提醒后才注意到，虽然好象没别的问题，但最好还是去掉它，如下
0167:00433739 MOV AL,[0045A76B] <-取第8行第25、26组成的字符，如太短则取出为00
0167:0043373E ADD AX,025E
0167:00433742 CALL 00408B28 <-下面说明
0167:00433747 MOV EDX,EAX <-如上面al为00，则返回eax为"For……"的地址
0167:00433749 MOV EAX,0045AFC8
0167:0043374E CALL 004050A4
0167:00433753 CMP BYTE [0045A7D3],00
0167:0043375A JNZ 0043377A
0167:0043375C XOR EAX,EAX
0167:0043375E MOV AL,[00459F15]
0167:00433763 LEA EAX,[EAX+EAX*8]
0167:00433766 LEA EAX,[EAX*2+00453B58]
0167:0043376D PUSH EAX
0167:0043376E PUSH DWORD 0045AFC8
0167:00433773 CALL `KERNEL32!lstrcatA`
0167:00433778 JMP SHORT 00433798
0167:0043377A PUSH DWORD 004337D0
0167:0043377F PUSH DWORD 0045AFC8
0167:00433784 CALL `KERNEL32!lstrcatA`
0167:00433789 PUSH DWORD 0045A6A8
0167:0043378E PUSH DWORD 0045AFC8
0167:00433793 CALL `KERNEL32!lstrcatA`
0167:00433798 PUSH BYTE +01
0167:0043379A PUSH EDI
0167:0043379B PUSH BYTE -01
0167:0043379D PUSH DWORD 0045AFC8
0167:004337A2 PUSH EBX
0167:004337A3 CALL `USER32!DrawTextA` <-显示字符，用d 45afc8就可看见将显示的内容
0167:004337A8 MOV EAX,[ESP]

---------------------------------------------------------------
CALL 00408B28的内容
0167:00408B28 PUSH EBX
0167:00408B29 PUSH ESI
0167:00408B2A MOV EBX,[0045B810]
0167:00408B30 ADD EBX,BYTE +0A
0167:00408B33 TEST EBX,EBX
0167:00408B35 JZ 00408B96
0167:00408B37 CMP AX,[0045A82C] <-如eax大于16进制27D(即原AL不小于20）则跳，
0167:00408B3E JA 00408B96 如跳，启动时名字前就不会有其他字样，
0167:00408B40 MOV DL,[00459F15]
0167:00408B46 CMP DL,01
0167:00408B49 JZ 00408B54
0167:00408B4B MOVZX ECX,WORD [0045A832]
0167:00408B52 ADD EBX,ECX
0167:00408B54 CMP DL,01
0167:00408B57 JNA 00408B62
0167:00408B59 MOVZX ECX,WORD [0045A834]
0167:00408B60 ADD EBX,ECX
0167:00408B62 CMP DL,02
0167:00408B65 JNA 00408B70
0167:00408B67 MOVZX ECX,WORD [0045A836]
0167:00408B6E ADD EBX,ECX
0167:00408B70 CMP DL,03
0167:00408B73 JNA 00408B7E
0167:00408B75 MOVZX EDX,WORD [0045A838]
0167:00408B7C ADD EBX,EDX
0167:00408B7E MOVZX ESI,AX
0167:00408B81 SUB ESI,BYTE +02
0167:00408B84 JL 00408B9B
0167:00408B86 INC ESI
0167:00408B87 MOV EAX,EBX \
0167:00408B89 CALL 00405038 |
0167:00408B8E INC EAX |对EBX进行运算，得到指向某一字符串的地址
0167:00408B8F ADD EBX,EAX |如原AL取00，则EBX指向"For……only",如AL
0167:00408B91 DEC ESI |为其他值，则指向其它字符串
0167:00408B92 JNZ 00408B87 /
0167:00408B94 JMP SHORT 00408B9B
0167:00408B96 MOV EBX,00408BA0
0167:00408B9B MOV EAX,EBX
0167:00408B9D POP ESI
0167:00408B9E POP EBX
由此可见，第8行必须至少有26位，而且第25位必须大于2。
——-------————————————————————————————
注1：注意上边DS：EAX就是所读到内容存放的地址，我是6AEAD8
注2：注意上边DS：453BE0是正确内容的地址，DS：45AFC8是有待判断的内容的地址。（似乎不区分大小写）
注3：用d ds:eax就可看到打开文件的文件名，winhex安装在d:\winhex，则可看到d:\winhex\user.txt

写到这儿，查看了一下看雪论坛精华II,发现有好几篇winhex的破解文章，有9.3、9.4、9.5、9.53,每次注册方法都不一样,到这个9.6的注册已经与code1和code2无关了.由此想到,做一个假的注册功能(幸好假注册还不算太复杂,假标志也没有用来产生一些"事故",不然我的爱机……)可能也是一种不错的保护方法.
本人水平有限,不对之处请各位高手指正.
作者:hying[CCG]


winhex9.73

标 题:如何完美破解winhex9.73的功能限制！ (8千字)
发信人:大老
时 间:2001-3-13 8:50:57
详细信息:
完美破解winhex9.73的功能限制！

所用工具：trw2000国人的骄傲 w32dasm8.93破解利器
软件下载：www.pchome.net
破解人:大老
邮件:dalao@top86.com
破解目标：冲破 WinHex 不能编辑保存大于 250 KB 文件的限制
软件简介：一个很不错的16进制文件编辑与磁盘编辑软件。WinHex以文件小、速度快，功能不输其它的Hex十六进位编辑器工具得到了ZDNet SoftwareLibrary五颗星最高评价，可做Hex与ASCII码编辑修改，多文件寻替换功能，一般运算及逻辑运算，磁盘磁区编辑(支持FAT16、FAT32和NTFS)自动搜寻编辑，文件对比和分析等功能，另外8.3版新增了RAM编辑功能!
这个软件的作者很变态加了很多的标志来判断是否为真的注册版
而未注册版的判断则少了很多！注意：这就是漏洞！！xixi
进入正题：
先用w32dasm反编译winhex.exe 注意：以下汇编是我改过后的！
然后查找3DFA00会找到两次
第一次
:0041666D E8DEC1FEFF call 00402850
:00416672 3DFA000000 cmp eax, 000000FA ===》打开文件时比较文件是否大于250k （1）
:00416677 90 nop ====》这里一定不能跳！
:00416678 90 nop
:00416679 C644240201 mov [esp+02], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041664D(U), :00416662(C)
|
:0041667E 8D842404010000 lea eax, dword ptr [esp+00000104]
:00416685 BAC5F84500 mov edx, 0045F8C5
第二次
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043153E(C)
|
:0043154A DF6D08 fild qword ptr [ebp+08]
:0043154D D80D88154300 fmul dword ptr [00431588]
:00431553 E8F812FDFF call 00402850
:00431558 3DFA000000 cmp eax, 000000FA ====》比较文件是否大于250k （2）
:0043155D EB20 jmp 0043157F ====》这里一定要跳
:0043155F 803DAEF9450000 cmp byte ptr [0045F9AE], 00
:00431566 7517 jne 0043157F
:00431568 66B84F00 mov ax, 004F
:0043156C E87B77FDFF call 00408CEC
以上是准备工作
现在用调试工具trw2000来去掉250K的功能限制！
设断点bpx 431558
打开一个大于250K的文件随便改几处！点激save
短点拦截按一次F12一次F10
:00453154 E8DBE3FDFF call 00431534
:00453159 84C0 test al, al =====》我们将来到这
:0045315B 0F84CA010000 je 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045314C(C)
|
:00453161 803D7AF9450002 cmp byte ptr [0045F97A], 02
:00453168 750D jne 00453177
:0045316A 80BE4721000000 cmp byte ptr [esi+00002147], 00
:00453171 0F84B4010000 je 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453168(C)
|
:00453177 8BC6 mov eax, esi
:00453179 E8AE3CFFFF call 00446E2C
:0045317E 84C0 test al, al
:00453180 0F84A5010000 je 0045332B
:00453186 837E2400 cmp dword ptr [esi+24], 00000000
:0045318A 7531 jne 004531BD
:0045318C 80BE4621000000 cmp byte ptr [esi+00002146], 00
:00453193 7528 jne 004531BD
:00453195 8B460C mov eax, dword ptr [esi+0C]
:00453198 E81FA0FBFF call 0040D1BC
:0045319D 880424 mov byte ptr [esp], al
:004531A0 807E3203 cmp byte ptr [esi+32], 03
:004531A4 7417 je 004531BD
:004531A6 803C2400 cmp byte ptr [esp], 00
:004531AA 7511 jne 004531BD
:004531AC 8B560C mov edx, dword ptr [esi+0C]
:004531AF 66B80A00 mov ax, 000A
:004531B3 E8806DFBFF call 00409F38
:004531B8 E96E010000 jmp 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045318A(C), :00453193(C), :004531A4(C), :004531AA(C)
|
:004531BD 807E3204 cmp byte ptr [esi+32], 04
:004531C1 7507 jne 004531CA
:004531C3 B301 mov bl, 01
:004531C5 E961010000 jmp 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004531C1(C)
|
:004531CA 80BE4621000000 cmp byte ptr [esi+00002146], 00
:004531D1 7434 je 00453207
:004531D3 8A8646210000 mov al, byte ptr [esi+00002146]
:004531D9 E872F7FBFF call 00412950
:004531DE 84C0 test al, al
:004531E0 0F8445010000 je 0045332B
:004531E6 8D4604 lea eax, dword ptr [esi+04]
:004531E9 E83A4CFCFF call 00417E28
:004531EE 84C0 test al, al
:004531F0 740E je 00453200
:004531F2 B301 mov bl, 01
:004531F4 8BC6 mov eax, esi
:004531F6 E8ED38FFFF call 00446AE8
:004531FB E92B010000 jmp 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004531F0(C)
|
:00453200 33DB xor ebx, ebx
:00453202 E924010000 jmp 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004531D1(C)
|
:00453207 DF6E10 fild qword ptr [esi+10]
:0045320A D81D34334500 fcomp dword ptr [00453334]
:00453210 DFE0 fstsw ax
:00453212 9E sahf
:00453213 EB0D jmp 00453222 ======》判断是否为注册版这一定要跳
:00453215 803DAEF9450000 cmp byte ptr [0045F9AE], 00
:0045321C 0F8409010000 je 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453213(U)
|
:00453222 803D7AF9450000 cmp byte ptr [0045F97A], 00
:00453229 7521 jne 0045324C
:0045322B 803DDDF9450000 cmp byte ptr [0045F9DD], 00
:00453232 7518 jne 0045324C
:00453234 803C2400 cmp byte ptr [esp], 00
:00453238 7412 je 0045324C
:0045323A 8B460C mov eax, dword ptr [esi+0C]
:0045323D B201 mov dl, 01
:0045323F E83091FBFF call 0040C374
:00453244 84C0 test al, al
:00453246 0F84DF000000 je 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00453229(C), :00453232(C), :00453238(C)
|
:0045324C DF6E10 fild qword ptr [esi+10]
:0045324F D81D38334500 fcomp dword ptr [00453338]
:00453255 DFE0 fstsw ax
:00453257 9E sahf
:00453258 EB0D jmp 00453267 ==============》还有这一定要跳
:0045325A 803DAEF9450000 cmp byte ptr [0045F9AE], 00
:00453261 0F84C4000000 je 0045332B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453258(U)
|

* Possible Reference to Menu: MenuID_0002
|
:00453267 6A02 push 00000002
:00453269 668B8620210000 mov ax, word ptr [esi+00002120]
:00453270 E82FA1FBFF call 0040D3A4
:00453275 8BD0 mov edx, eax
:00453277 8B4E0C mov ecx, dword ptr [esi+0C]
:0045327A 8D4604 lea eax, dword ptr [esi+04]
:0045327D E82E36FCFF call 004168B0 ==============》注意这个call控制写盘操作 (3)
:00453282 84C0 test al, al
:00453284 0F84A1000000 je 0045332B
:0045328A 807E3203 cmp byte ptr [esi+32], 03
:0045328E 750D jne 0045329D
:00453290 A017EF4500 mov al, byte ptr [0045EF17]
:00453295 888645210000 mov byte ptr [esi+00002145], al
:0045329B EB26 jmp 004532C3
进入(3)的call
------------------------------------------------------------
:00416014 DB45D4 fild dword ptr [ebp-2C]
:00416017 DF6DE4 fild qword ptr [ebp-1C]
:0041601A DEC1 faddp st(1), st(0)
:0041601C DF7DE4 fistp qword ptr [ebp-1C]
:0041601F 9B wait
:00416020 DF6DE4 fild qword ptr [ebp-1C]
:00416023 D81DB0614100 fcomp dword ptr [004161B0]
:00416029 DFE0 fstsw ax
:0041602B 9E sahf
:0041602C EB21 jmp 0041604F ================>>关键必须跳!不跳只能保存280K (4)
:0041602E DF6DE4 fild qword ptr [ebp-1C]
:00416031 D81DB4614100 fcomp dword ptr [004161B4]
:00416037 DFE0 fstsw ax
:00416039 9E sahf
:0041603A 7313 jnb 0041604F
-----------------------------------------------------------
这样 save的功能限制就解除了!
解除save as的功能限制和解除save的功能限制一样(设断点bpx 431558)
希望大家能举一反三!另外说一下!其中(4)的判断是winhex9.71版以后才加上的!请大家注意!


winhex9.82

 标 题:winhex9.82快速破解法！！ (1千字)
发信人:ydmis
时 间:2001-5-17 21:58:47
详细信息:
winhex9.82完美破解法！保存大于250K！
:004172C7 C644240200 mov [esp+02], 00
:004172CC 803DFF19460000 cmp byte ptr [004619FF], 00
:004172D3 751A jne 004172EF <-改为jmp 004172EA（1）
:004172D5 DF6D0C fild qword ptr [ebp+0C]
:004172D8 D80DCC734100 fmul dword ptr [004173CC]
:004172DE E86DB5FEFF call 00402850
:004172E3 3DFA000000 cmp eax, 000000FA
:004172E8 7D05 jge 004172EF
:004172EA C644240201 mov [esp+02], 01

:00417534 8D471C lea eax, dword ptr [edi+1C]
:00417537 50 push eax
:00417538 8A4D08 mov cl, byte ptr [ebp+08] <-改为B10190即mov cl,1（2）
:0041753B 8BD6 mov edx, esi
:0041753D 8B45FC mov eax, dword ptr [ebp-04]
:00417540 E867F4FFFF call 004169AC
:00417545 84C0 test al, al
:00417547 0F94C3 sete bl

:00444081 E84EF1FFFF call 004431D4
:00444086 803D8F19460000 cmp byte ptr [0046198F], 00
:0044408D 0F95C0 setne al <-改为909090（3）
:00444090 BA0B1A4600 mov edx, 00461A0B
:00444095 83EA0C sub edx, 0000000C
:00444098 8802 mov byte ptr [edx], al
:0044409A 6A00 push 00000000
:0044409C A1C4294600 mov eax, dword ptr [004629C4]
:004440A1 50 push eax


WinISO v4.0

 标 题:WinISO v4.0 (3千字)
发信人:zest
时 间:2001-8-22 22:36:48
详细信息:
参考国外高手之patch
____ _ __ ____ ____
_/ __)_/ |_ |_/ |_/ __)
_\ __) \ _/ |\ --|\ __)_
.-' \__| \_|__| \____| \__| `-.
| Flying Horse Cracking Force _|_
_|_ \_/
\_/ RelType: Patch |
| Cracker: Charles Manson |
| |
`--------------------[31/07/2001]-'

WinISO v4.0
http://www.winiso.com/download.htm

(1)=====================================================================

:0040B48C 81FF00003000 cmp edi, 00300000
:0040B492 7630 jbe 0040B4C4================>改jmp!!
* Reference To: WinISO._fmMainWnd
|
:0040B494 8B15CC074C00 mov edx, dword ptr [004C07CC]
:0040B49A 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"STOP"
|
:0040B49C 68AE414B00 push 004B41AE

* Possible StringData Ref from Data Obj ->"Unregistered Version can not extract "
->"large files(>3MB) "
|
:0040B4A1 6876414B00 push 004B4176

(2)=====================================================================

:0040BAE8 817D1400004006 cmp dword ptr [ebp+14], 06400000
:0040BAEF 762F jbe 0040BB20================>改jmp!!
* Reference To: WinISO._fmMainWnd
|
:0040BAF1 8B15CC074C00 mov edx, dword ptr [004C07CC]
:0040BAF7 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"STOP"
|
:0040BAF9 689C424B00 push 004B429C

* Possible StringData Ref from Data Obj ->"Unregistered Version can not process "
->"large image file(>100MB). "
|
:0040BAFE 685C424B00 push 004B425C

(3)=====================================================================

:0040C80E 81B9CC05000000004006 cmp dword ptr [ecx+000005CC], 06400000
:0040C818 762E jbe 0040C848================>改jmp!!
:0040C81A A1CC074C00 mov eax, dword ptr [004C07CC]
:0040C81F 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"STOP"
|
:0040C821 68A3434B00 push 004B43A3

* Possible StringData Ref from Data Obj ->"Unregistered Version can not process "
->"large image file(>100MB). "
|
:0040C826 6863434B00 push 004B4363

(4)=====================================================================

:0040FFEC 817F0800C80000 cmp dword ptr [edi+08], 0000C800
:0040FFF3 7620 jbe 00410015================>改jmp!!
:0040FFF5 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"STOP"
|
:0040FFF7 68FE634B00 push 004B63FE

* Possible StringData Ref from Data Obj ->"Unregistered Version can not process "
->"large image file(>100MB). "
|
:0040FFFC 68BE634B00 push 004B63BE

=====================================================================

自诩为高手的cracker可试试其注册码的难度!!!!!!!!!!!!!!!!!!!!!!!!!!
自诩为高手的cracker可试试其注册码的难度!!!!!!!!!!!!!!!!!!!!!!!!!!


YATS32 v8.1 build 6

 标 题:破解YATS32 v8.1 build 6 (2千字)
发信人:guest
时 间:2000-9-22 11:23:57
详细信息:
软件名称：YATS32
版本： v8.1 build 6
下载地址：http://www.dillobits.com/bin/yats3281.exe
http://newhua.21f.net/down/yats3281.exe
保护类型：注册码
破解类型：patch
难度级别：easy
软件描述：时间同步工具

该软件用UPX压缩过，解压后反汇编，利用W32Dasm的reference功能，找到如下的地方。很明显DS:[00456970]中存放的是注册的标志，非零值表示已注册。

:0040123F 391D70694500 cmp dword ptr [00456970], ebx
:00401245 747C je 004012C3
:00401247 57 push edi
:00401248 8DBEBC010000 lea edi, dword ptr [esi+000001BC]

* Possible StringData Ref from Data Obj ->"Registered to "
|
:0040124E 682CE14300 push 0043E12C
:00401253 8BCF mov ecx, edi
:00401255 E82B5D0200 call 00426F85

查找串“00456970”，又找到另外两个地方，把相关的跳转指令全部改掉就OK。

第二处：

:00404AD1 391D70694500 cmp dword ptr [00456970], ebx

* Reference To: USER32.PostMessageA, Ord:0000h
|
:00404AD7 8B3DB0144300 mov edi, dword ptr [004314B0]
:00404ADD 750C jne 00404AEB

第三处：

:00407BD9 833D7069450000 cmp dword ptr [00456970], 00000000
:00407BE0 56 push esi
:00407BE1 8BF1 mov esi, ecx
:00407BE3 7476 je 00407C5B
:00407BE5 A1CC1F4500 mov eax, dword ptr [00451FCC]
:00407BEA 8945F0 mov dword ptr [ebp-10], eax
:00407BED 8365FC00 and dword ptr [ebp-04], 00000000
:00407BF1 8945E8 mov dword ptr [ebp-18], eax

* Possible Reference to String Resource ID=00617: "YATS32"
|
:00407BF4 6869020000 push 00000269
:00407BF9 8D4DF0 lea ecx, dword ptr [ebp-10]
:00407BFC C645FC01 mov [ebp-04], 01
:00407C00 E8F1F50100 call 004271F6

* Possible StringData Ref from Data Obj ->" - "

BTW：若你能写出注册机，你就是高手！


Z-FILE试用版

 标 题:最后也没算出序列号。暴掉了事了。这是大概过程。 (10千字)
发信人:LL[CCG]
时 间:2001-6-1 3:03:38
详细信息:
Z-FILE试用版的破解过程。
下载：http://www.newhua.com.cn/down/ZFile30TGB.exe
用途：文件加密。
限制：序列号。
因为没有算出序列号来，只好爆破了。本来不好意思拿出来的，但是JSJYT让我写过程，我只好出来现了。：）
这个软件的关键点比较难找，输入的序列号不和它的格式连关键点都看不到，我大概说一下方法。
启动软件后，会出现让你输入序列号的对话框。随便输入几个字符，点确定。什么变化都没有。。。。不愧是加密软件。一点蛛丝马迹都不留。（很多软件输入错误后都会出现对话框，这个时候用MESSAGEBOXA之类的断点，几秒中就能找到关键点。比用HMEMCPY快多了。然后反汇编找关键点是那里来的，就能看到算法了。）没办法，只好用HMEMCPY来跟了，由于没有出错的提示很难找关键点，跟的时候最好用BPM把存序列号的地址断下，免得漏掉。
我没有用上面的方法，因为太难找。我用的方法如下：
经过分析软件会把你输入的序列号存入注册表，启动时检验，不对就出提示。让你再次输入。可以用REGQUERYVALUEEXA下断，在读出数据的时候进入程序领空。我这里大概断了40来次。。。。。。也不容易呀 ！终于看到了输入的错误注册码。然后就F10一步一步的跟下去。当然用BPM监视也可以。
不管用那种方法，最后会到下面这里：
:0041D3CC 83F80D cmp eax, 0000000D 这里是比较长度是不是13位以上
:0041D3CF 7422 je 0041D3F3
:0041D3D1 33C0 xor eax, eax
:0041D3D3 BA02000000 mov edx, 00000002
:0041D3D8 50 push eax
:0041D3D9 8D45FC lea eax, dword ptr [ebp-04]
:0041D3DC FF4F1C dec [edi+1C]
:0041D3DF E8501A0600 call 0047EE34
:0041D3E4 58 pop eax
:0041D3E5 8B17 mov edx, dword ptr [edi]
:0041D3E7 64891500000000 mov dword ptr fs:[00000000], edx
:0041D3EE E9E0070000 jmp 0041DBD3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041D3CF(C)
|
:0041D3F3 C6458358 mov [ebp-7D], 58
:0041D3F7 66C747101400 mov [edi+10], 0014
:0041D3FD 837DFC00 cmp dword ptr [ebp-04], 00000000
:0041D401 7405 je 0041D408
:0041D403 8B4DFC mov ecx, dword ptr [ebp-04]
:0041D406 EB05 jmp 0041D40D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041D401(C)
|
:0041D408 B952BA4800 mov ecx, 0048BA52

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041D406(U)
|
:0041D40D 0FBE410C movsx eax, byte ptr [ecx+0C]
:0041D411 83F858 cmp eax, 00000058 比较第13位是不是X
:0041D414 7422 je 0041D438
:0041D416 33C0 xor eax, eax
:0041D418 BA02000000 mov edx, 00000002
:0041D41D 50 push eax
:0041D41E 8D45FC lea eax, dword ptr [ebp-04]
:0041D421 FF4F1C dec [edi+1C]
:0041D424 E80B1A0600 call 0047EE34
:0041D429 58 pop eax
:0041D42A 8B17 mov edx, dword ptr [edi]
:0041D42C 64891500000000 mov dword ptr fs:[00000000], edx
:0041D433 E99B070000 jmp 0041DBD3
:0041D438 837DFC00 cmp dword ptr [ebp-04], 00000000
:0041D43C 7405 je 0041D443
:0041D43E 8B4DFC mov ecx, dword ptr [ebp-04]
:0041D441 EB05 jmp 0041D448
:0041D443 B953BA4800 mov ecx, 0048BA53
:0041D448 837DFC00 cmp dword ptr [ebp-04], 00000000
:0041D44C 8A4108 mov al, byte ptr [ecx+08]
:0041D44F 7405 je 0041D456
:0041D451 8B55FC mov edx, dword ptr [ebp-04]
:0041D454 EB05 jmp 0041D45B
:0041D456 BA54BA4800 mov edx, 0048BA54
:0041D45B 837DFC00 cmp dword ptr [ebp-04], 00000000
:0041D45F 8A5204 mov dl, byte ptr [edx+04]
:0041D462 7405 je 0041D469
:0041D464 8B4DFC mov ecx, dword ptr [ebp-04]
:0041D467 EB05 jmp 0041D46E
:0041D469 B955BA4800 mov ecx, 0048BA55
:0041D46E 8A09 mov cl, byte ptr [ecx]
:0041D470 0FBED8 movsx ebx, al
:0041D473 83FB30 cmp ebx, 00000030
:0041D476 7C09 jl 0041D481
:0041D478 83FB39 cmp ebx, 00000039
:0041D47B 7F04 jg 0041D481
:0041D47D 04D0 add al, D0
:0041D47F EB44 jmp 0041D4C5
:0041D481 0FBED8 movsx ebx, al
:0041D484 83FB61 cmp ebx, 00000061
:0041D487 7C09 jl 0041D492
:0041D489 83FB7A cmp ebx, 0000007A
:0041D48C 7F04 jg 0041D492
:0041D48E 04A9 add al, A9
:0041D490 EB33 jmp 0041D4C5
:0041D492 0FBED8 movsx ebx, al
:0041D495 83FB41 cmp ebx, 00000041
:0041D498 7C09 jl 0041D4A3
:0041D49A 83FB5A cmp ebx, 0000005A
:0041D49D 7F04 jg 0041D4A3
:0041D49F 04E3 add al, E3
:0041D4A1 EB22 jmp 0041D4C5
:0041D4A3 33C0 xor eax, eax
:0041D4A5 BA02000000 mov edx, 00000002
:0041D4AA 50 push eax
:0041D4AB 8D45FC lea eax, dword ptr [ebp-04]
:0041D4AE FF4F1C dec [edi+1C]
:0041D4B1 E87E190600 call 0047EE34
:0041D4B6 58 pop eax
:0041D4B7 8B17 mov edx, dword ptr [edi]
:0041D4B9 64891500000000 mov dword ptr fs:[00000000], edx
:0041D4C0 E90E070000 jmp 0041DBD3
:0041D4C5 0FBEDA movsx ebx, dl
:0041D4C8 83FB30 cmp ebx, 00000030
:0041D4CB 7C0A jl 0041D4D7
:0041D4CD 83FB39 cmp ebx, 00000039
:0041D4D0 7F05 jg 0041D4D7
:0041D4D2 80C2D0 add dl, D0
:0041D4D5 EB46 jmp 0041D51D
:0041D4D7 0FBEDA movsx ebx, dl
:0041D4DA 83FB61 cmp ebx, 00000061
:0041D4DD 7C0A jl 0041D4E9
:0041D4DF 83FB7A cmp ebx, 0000007A
:0041D4E2 7F05 jg 0041D4E9
:0041D4E4 80C2A9 add dl, A9
:0041D4E7 EB34 jmp 0041D51D
:0041D4E9 0FBEDA movsx ebx, dl
:0041D4EC 83FB41 cmp ebx, 00000041
:0041D4EF 7C0A jl 0041D4FB
:0041D4F1 83FB5A cmp ebx, 0000005A
:0041D4F4 7F05 jg 0041D4FB
:0041D4F6 80C2E3 add dl, E3
:0041D4F9 EB22 jmp 0041D51D
:0041D4FB 33C0 xor eax, eax
:0041D4FD BA02000000 mov edx, 00000002
:0041D502 50 push eax
:0041D503 8D45FC lea eax, dword ptr [ebp-04]
:0041D506 FF4F1C dec [edi+1C]
:0041D509 E826190600 call 0047EE34
:0041D50E 58 pop eax
:0041D50F 8B17 mov edx, dword ptr [edi]
:0041D511 64891500000000 mov dword ptr fs:[00000000], edx
:0041D518 E9B6060000 jmp 0041DBD3
:0041D51D 0FBED9 movsx ebx, cl
:0041D520 83FB30 cmp ebx, 00000030
:0041D523 7C0A jl 0041D52F
:0041D525 83FB39 cmp ebx, 00000039
:0041D528 7F05 jg 0041D52F
:0041D52A 80C1D0 add cl, D0
:0041D52D EB46 jmp 0041D575
:0041D532 83FB61 cmp ebx, 00000061
:0041D535 7C0A jl 0041D541
:0041D537 83FB7A cmp ebx, 0000007A
:0041D53A 7F05 jg 0041D541
:0041D53C 80C1A9 add cl, A9
:0041D53F EB34 jmp 0041D575
:0041D541 0FBED9 movsx ebx, cl
:0041D544 83FB41 cmp ebx, 00000041
:0041D547 7C0A jl 0041D553
:0041D549 83FB5A cmp ebx, 0000005A
:0041D54C 7F05 jg 0041D553
:0041D54E 80C1E3 add cl, E3
:0041D551 EB22 jmp 0041D575
:0041D553 33C0 xor eax, eax
:0041D555 BA02000000 mov edx, 00000002
:0041D55A 50 push eax
:0041D55B 8D45FC lea eax, dword ptr [ebp-04]
:0041D55E FF4F1C dec [edi+1C]
:0041D561 E8CE180600 call 0047EE34
:0041D566 58 pop eax
:0041D567 8B17 mov edx, dword ptr [edi]
:0041D569 64891500000000 mov dword ptr fs:[00000000], edx
:0041D570 E95E060000 jmp 0041DBD3 上面的一堆应该是判断输入的是不是数字和字母

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041D52D(U), :0041D53F(U), :0041D551(U)
|
:0041D575 0FBEC0 movsx eax, al 这里就是算法开始了。
:0041D578 8BF0 mov esi, eax
:0041D57A 0FBEC9 movsx ecx, cl
:0041D57D C1E604 shl esi, 04
:0041D580 2BF0 sub esi, eax
:0041D582 C1E606 shl esi, 06
:0041D585 03F0 add esi, eax
:0041D587 0FBEC2 movsx eax, dl
:0041D58A 8BD0 mov edx, eax
:0041D58C C1E205 shl edx, 05
:0041D58F 2BD0 sub edx, eax
:0041D591 C1E602 shl esi, 02
:0041D594 03D2 add edx, edx
:0041D596 03F2 add esi, edx
:0041D598 03F1 add esi, ecx
:0041D59A 83FEFF cmp esi, FFFFFFFF
:0041D59D 7C05 jl 0041D5A4
:0041D59F 83FEFF cmp esi, FFFFFFFF
:0041D5A2 7E22 jle 0041D5C6 我实在是没办法让ESI=FFFFFFFF只好去关键点了。
:0041D5A4 33C0 xor eax, eax
:0041D5A6 BA02000000 mov edx, 00000002
:0041D5AB 50 push eax
:0041D5AC 8D45FC lea eax, dword ptr [ebp-04]
:0041D5AF FF4F1C dec [edi+1C]
:0041D5B2 E87D180600 call 0047EE34
:0041D5B7 58 pop eax
:0041D5B8 8B17 mov edx, dword ptr [edi]
:0041D5BA 64891500000000 mov dword ptr fs:[00000000], edx
:0041D5C1 E90D060000 jmp 0041DBD3 跳出。
然后就是关键点：
:004014C8 8B0E mov ecx, dword ptr [esi]
:004014CA 51 push ecx
:004014CB E858BD0100 call 0041D228 这个应该是把输入的数字保存到注册表
:004014D0 59 pop ecx
:004014D1 84C0 test al, al
:004014D3 0F846DFFFFFF je 00401446 这个就是关键点了。
到此就完事了。因为实在是算不出来只好把关键点暴掉，然后用123456789000X注册成功。
要想完全暴掉，就把所有的判断都改了，随便几个字母就OK了。
那位大哥能把算法指点一二 ？？感激不禁。
LL[CCG]


登录奇兵v3.01

标 题:《登录奇兵》v3.01的破解---请指教 (4千字)
发信人:alang
时 间:2001-2-16 13:08:05
详细信息:
《登录奇兵》v3.01的破解
======================================
3.01版可登录5400个网站.本人破解只为学习,因是初涉,可能在破解中存在许多错误之处,
烦请各位前辈不吝赐教,因本人手中没有全部网站资料,所以无法测试,如那位大侠有资料的
话,请发给我一份,谢谢!
本人信箱:langlirong@163.net
=======================================
破解过程:
---------------------------------------------
(1)将软件装入w32dsm之后,查到错误提示处:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A3A00(C)
| ^^^^^^^^^^^

* Possible StringData Ref from Code Obj ->"Invalid key. Please re enter"
|
:004A3B8D B8F03C4A00 mov eax, 004A3CF0
:004A3B92 E8B514FBFF call 0045504C
----------------------------------------------
看到用^画线之处,跳槽到004A3A00处:
----------------------------------------------
* Possible StringData Ref from Code Obj ->"Addurlversion 1.0"
|
:004A39F3 B9183C4A00 mov ecx, 004A3C18
:004A39F8 5A pop edx
:004A39F9 E84EFDFFFF call 004A374C
:004A39FE 84C0 test al, al
:004A3A00 0F8487010000 je 004A3B8D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Possible StringData Ref from Code Obj ->"winzips32.ini"
|
:004A3A06 B9483C4A00 mov ecx, 004A3C48
-------------------------------------------------
将 je 改为 jne .为何这样改,俺也不知道,照葫芦画瓢呗.
(2)然后找到如下之处:
-------------------------------------------------
:00505E06 E865DFEFFF call 00403D70
:00505E0B 8B8304030000 mov eax, dword ptr [ebx+00000304]
:00505E11 8B10 mov edx, dword ptr [eax]
:00505E13 FF92F4000000 call dword ptr [edx+000000F4]
:00505E19 83F832 cmp eax, 00000032
:00505E1C 7F25 jg 00505E43
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00505E1E 8B8328030000 mov eax, dword ptr [ebx+00000328]
:00505E24 8B10 mov edx, dword ptr [eax]
:00505E26 FF92F4000000 call dword ptr [edx+000000F4]
:00505E2C 83F832 cmp eax, 00000032
:00505E2F 7F12 jg 00505E43
--------------------------------------------------
将 00505E1C 7F25 改为 00505E1C EB25
或 00505E2F 7F12 改为 00505E2F EB12
(3)去掉登录著名目录搜索限制,找到:
--------------------------------------------------
:0051287A FF92F4000000 call dword ptr [edx+000000F4]
:00512880 83F832 cmp eax, 00000032
:00512883 7E16 jle 0051289B
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00512885 8B45FC mov eax, dword ptr [ebp-04]
:00512888 8B8028030000 mov eax, dword ptr [eax+00000328]
:0051288E 8B10 mov edx, dword ptr [eax]
:00512890 FF92F4000000 call dword ptr [edx+000000F4]
:00512896 83F832 cmp eax, 00000032
:00512899 7F1D jg 005128B8
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00512883(C)
|
:0051289B 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"注册用户专用！"
|
:0051289D B9D04C5100 mov ecx, 00514CD0

* Possible StringData Ref from Code Obj ->"注册用户才可以使用本功能"
----------------------------------------------------
将 7E16 改为 9090
7F1D 改为 EB1D
(4)去掉引擎搜索50个的限制
----------------------------------------------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005063E2(U)
|
:005063F4 8D55F4 lea edx, dword ptr [ebp-0C]
:005063F7 8B8300050000 mov eax, dword ptr [ebx+00000500]
:005063FD E8F6C7F2FF call 00432BF8
:00506402 8B45F4 mov eax, dword ptr [ebp-0C]
:00506405 E8C62EF0FF call 004092D0
:0050640A 3BF0 cmp esi, eax
:0050640C EB30 jmp 0050643E
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:0050640E 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"IptErrNue ny��"
|
:00506410 B9BC645000 mov ecx, 005064BC

* Possible StringData Ref from Code Obj ->"Your Entry a Range To Number Bigger "
->"Than Total Board Count"
----------------------------------------------------
将 :0050640C EB30 处改为 jmp (上面之处是我已改过的)
破解结束.
由于水平有限,破解过程个能过于繁琐,有不当之处请指正.

欢迎光临《阿郎居》
langlirong@163.net
http://alang.shangdu.net


丁氏彩票电脑预测软件密码解除

标 题:丁氏彩票电脑预测软件密码解除-联想中国共享软件水准 [BCG]出品 (2千字)
发信人:冷雨飘心
时 间:2001-4-22 22:19:59
详细信息:
文章名称: 丁氏彩票电脑预测软件密码解除
作　　者：冷雨飘心
破解时间：2001-4-22

破解工具：TRW2000 V1.23 Hiew V6.40 W32dasm黄金版

下载地址:http://go4.163.com/~tianjiwang/cpuc.htm

贫穷不是社会主义,社会主义要消灭贫穷,这口号已经喊了几十年了,然而贫穷者依然贫穷,富有者依旧富有,人们投机心理不断滋生,不论什么人都想撞一撞大运,彩票业应运而生,彩票软件也不断涌现,举丁氏彩票电脑预测软件为例,虽然我没有用,但大致看了一下粗糙的界面以及注册方法,仿佛并不值108人民币!也居然加入共享软件的大流充数...哎埃...

相信诸位cracker去写,也会好的多...悲伤

目标:节省108元

难易程度:极易,弱智型

注册码已经有人贴出:djh7500但是每次启动都要输一遍,讨厌...
曾尝试修改眺过注册画面,没有成功,那位高人可以指点?

说明:软件用VB编写,不用smartcheck,trw 5分钟简单搞定
开始:
填入注册码:随意
找到4b2d14:je 4b2d33 r eip 4b2d33
0167:0040152C PUSH DWORD 00419D90 //程序入口
0167:00401531 CALL `MSVBVM60!ThunRTMain`//VB固定结构 进入
0167:00401536 ADD [EAX],AL
***********************************************************
F8,go,to here
0167:660241A0 PUSH EAX
0167:660241A1 MOV ECX,ESI
0167:660241A3 CALL 66001AD4
0167:660241A8 TEST EAX,EAX
0167:660241AA JZ 660241C0
0167:660241AC MOV EAX,[EBP-64]
0167:660241AF MOV ECX,[EAX+04E4]
0167:660241B5 TEST ECX,ECX
0167:660241B7 JZ 660241C0
0167:660241B9 PUSH BYTE -01
0167:660241BB CALL 6600A5D0
0167:660241C0 MOV ECX,ESI
0167:660241C2 CALL 66051B78 //跳出注册画面
下断点bpx hmemcpy
确定,被拦截 go to here:
0167:0043A3B7 CALL `MSVBVM60!__vbaFreeObj`
0167:0043A3BD MOV EBX,[0040102C]
0167:0043A3C3 LEA ECX,[EBP-3C]
0167:0043A3C6 LEA EDX,[EBP-2C]
0167:0043A3C9 PUSH ECX
0167:0043A3CA PUSH EDX
0167:0043A3CB PUSH BYTE +02
0167:0043A3CD CALL EBX
0167:0043A3CF ADD ESP,BYTE +0C
0167:0043A3D2 TEST DI,DI
0167:0043A3D5 JZ NEAR 0043A4AB //注意若(JUMP)跳出错误框
改为nop即可 hiew F7查找:0043A3D5 0f 84 d0 00 00 00 ==>6 nop

下次启动出现输入密码框时,什么也不用填写,直接确定ok!
108元到手了,可见软件保护是多么弱智!
附诗一句:

五花马，千金裘，呼儿将出换美酒，与尔同销万古愁。

好,收工,明天再把易经八卦彩票预测6.3的破解过程写出来,现在该学习了!


分析家数据批量转换器

 标 题:分析家数据批量转换器暴力破解手记 (3千字)
发信人:忘了自己
时 间:2001-9-7 1:48:59
详细信息:
分析家数据批量转换器暴力破解手记

作者：忘了自己
时间：2001年9月9日 0：47

今天是我的生日，破解此软件作为自己生日礼物！：）

使用工具：W32dasm
WinHex

软件名称：分析家数据批量转换器
下载地址:

只是检验LuStockConvert3.exe的注册码，没有注册不能使用全部功能。

软件简介:
这是LuStockConvert3.exe的辅助程序，
可以批量转换分析家的历史分笔成交数据(PRP文件)和通用数据(DAD文件)。
生成的数据库类型增加了EXCEL的CSV文件，感谢COOLSON的提示。

使用注意
1 第一次使用建议用覆盖方式，因为程序对有关的日期进行
检验，如果已有的数据库是最新生成而又使用粘帖方式，
可能程序不转换任何数据。
2 源数据的目录要写完整的，这是考虑历史数据有可能
不在分析家目录下，程序默认给出的是分析家的数据目录。
3 开始日期和结束日期是为了方便分段转换而设，键入小于
19900101的数据，程序就不使用这个数据。
4 建议与LuStockConvert3.exe放在一个目录下，二者转换的
数据库是一致的，过滤文件Filter.Txt也是通用的。
5 程序对数据文件内的数据日期进行了排序，以保证不遗漏数据，
如果有很多个DAD文件在一起，即使数据有重叠，也能正常转换。
6 这个程序没有独立的注册器，只是检验LuStockConvert3.exe
的注册码，没有注册不能使用全部功能。

破解步骤:
1:用FI检测主程序没有加壳,VC程序.(太好了,心里有底了.)
2:W32dasm反汇编.
3:寻找到"已注册" 哈哈,例行公事,向上翻,又看到"未注册"继续翻 .....................................
4:
* Possible StringData Ref from Data Obj ->"批量转换分析家数据 - "
|
:00402011 68B8534300 push 004353B8
:00402016 52 push edx
:00402017 FFD7 call edi
:00402019 391D90744300 cmp dword ptr [00437490], ebx
:0040201F 745A je 0040207B <===(就是他,一跳就玩完.改为 NOP )
:00402021 8D44242C lea eax, dword ptr [esp+2C]
:00402025 8D4C2440 lea ecx, dword ptr [esp+40]
:00402029 50 push eax
:0040202A 51 push ecx
:0040202B FFD5 call ebp
:0040202D 8D542440 lea edx, dword ptr [esp+40]

* Possible StringData Ref from Data Obj ->" 已注册"
|
:00402031 68B0534300 push 004353B0
:00402036 52 push edx
:00402037 FFD5 call ebp
:00402039 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402057(C)
|
:0040203B 8B465C mov eax, dword ptr [esi+5C]

* Possible Reference to String Resource ID=00001: "?!"
|
:0040203E BA01000000 mov edx, 00000001
:00402043 D3E2 shl edx, cl
:00402045 8BB82C050000 mov edi, dword ptr [eax+0000052C]
:0040204B 0BFA or edi, edx
:0040204D 41 inc ecx
.......

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040201F(C)
|
:0040207B 8D442440 lea eax, dword ptr [esp+40]

* Possible StringData Ref from Data Obj ->"未注册"
|
:0040207F 68A8534300 push 004353A8

5:启动WinHex打开主文件 寻找 201F 将745A 改为 9090 搞定!

如要转载请保留全文 忘了自己


汉字通KanjiWEB

 标 题:加入BCG的申请文章之三 (3千字)
发信人:NYDoll
时 间:2001-5-6 15:25:12
详细信息:
破解 汉字通KanjiWEB 手记

作者: 娃娃（NYDoll）

软件简介:『汉字通』 "KanjiWEB”提供中文简体字、中文繁体字、日文三种藏珠字集描边字型，在任何视窗环境下均可显示，并且不论任何解析度的印表机，都可印出没有锯齿状、漂亮的汉字。 是一个小巧好用的多内码转换器

破解工具： W32Dasm（白金修正版） 这个版本是Robot兄给我的，在次表示感谢 UltraEdit（目前为止我最喜欢的十六进制编辑器）

---------------------------------------------------------------------

这个软件是我初学破解时的联手东东，也是我第一个破解成功的作品所以我很珍惜它，一直都备份好几份，放在我的硬盘中，今天我写出它的 破解方法，表示对我的Crack生涯的怀念，：D

-----------
这个软件很怪，到现在我仍然不知道它在何处比对注册码，所以只能暴力破解了
用W32Dasm反汇编程序，然后查找出错时的对话框“Sorry！Error SERIAL”，来到：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.38F4(U)
|
:0001.3944 C78636FE0100 mov word ptr [bp-01CA], 0001
:0001.394A FF760E push word ptr [bp+0E]

* Possible StringData Ref from Data Seg 004 ->"SORRY !! ERROR SERIAL NO" 《---- 光标停在这里
|
:0001.394D B8F508 mov ax, 08F5
:0001.3950 8CDA mov dx, ds
:0001.3952 52 push dx
:0001.3953 50 push ax

* Possible StringData Ref from Data Seg 004 ->"ERROR !!"
|
:0001.3954 B8EC08 mov ax, 08EC
:0001.3957 8CDA mov dx, ds
:0001.3959 52 push dx
:0001.395A 50 push ax
:0001.395B 6A00 push 0000
:0001.395D 9AD7020000 call USER.MESSAGEBOX

发现这个出错对话框其实是从 |:0001.38F4 跳到这里的，于是来到 |:0001.38F4:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.38BE(U)
|
:0001.38D1 83BE38FE09 cmp word ptr [bp+FE38], 0009
:0001.38D6 7CE8 jl 38C0
:0001.38D8 8D86BCFE lea ax, [bp+FEBC]
:0001.38DC 8CD2 mov dx, ss
:0001.38DE 52 push dx
:0001.38DF 50 push ax
:0001.38E0 8D863AFE lea ax, [bp+FE3A]
:0001.38E4 8CD2 mov dx, ss
:0001.38E6 52 push dx
:0001.38E7 50 push ax
:0001.38E8 9A7C77B338 call 0001.777C
:0001.38ED 83C408 add sp, 0008
:0001.38F0 23C0 and ax, ax
:0001.38F2 7403 je 38F7 《--- 将这里改为 JMP 就可以注册成功了！！
:0001.38F4 E94D00 jmp 3944 《---- 如果程序运行到这里，则注册失败！！

结果，用UltraEdit打开MULTWORD.EXE,将23 C0 74 03 E9 4D 改为 23 C0 75 03 E9 4D 再次注册，重新运行即可发现运行成功了，但是它的注册信息存放到哪里呢？？ 注册表？-No 初始化文件？-No 其实它在注册成功后改动安装目录下的一个名为MULTFONT.DLL这个文件，具体如下:

用UltraEdit打开这个软件注册前和注册后的MULTFONT.DLL，通过比较可以发现:

原版： 00019140h：06 05 D1 07 FF B7 C1 CA C9 D0 DE B3 D0 D2 00 29
00019150h：0E 35 14 00 00 00 00 00 00 41 4E 44 59 1E

破解后： 00019140h：15 02 66 19 FF B7 C2 D7 C9 D0 D0 BE D2 DC 00 10
00019150h：0E 24 06 00 00 00 00 00 00 41 4E 44 59 1E

发现了这一点之后，发布它的破解成果就容易多了，用WinPatch做一个补丁程序就解决了，呵呵

------ 娃娃（NYDoll） ---- E-Mail：NYDoll@Etang.com ----- QQ：15110296 -------


红外遥控编码分析仪3.0

标 题:破解红外遥控编码分析仪3.0——上次问过的，现在终于破了。 (6千字)
发信人:Passion
时 间:2001-2-16 10:43:57
详细信息:
破解红外遥控编码分析仪3.0
Passion

前不久一同学使用红外遥控编码分析仪3.0，说是未注册版本仅仅可输出红外线接口数据3次（3次的确也太少了点），于是找我碰碰运气看能不能破。我瞧这软件说明，说要向作者付“一吨午饭”注册，天啊！要勒紧裤带少吃多少顿才能凑足这一吨？“民以食为天”，破吧！
这个东西加了壳，由于我脱壳经验不足，在这里耽搁了两天。Fileinfo查不出是什么壳，后来下了个GTW，说是ASPack 1.083，于是用PROCDUMP的unpack，脱出来的文件却不能运行，出什么EAccessVoilation。找个专门脱它的工具，照样非法操作。看来只有手工脱了。还好，我们有中国人值得骄傲的TRW2000。
找入口点找得我头晕，（此处省略不成功脱壳过程XXXX次）。后来终于碰上了一个段转换的RET，执行完RET后来到以下处：

A1BCA34800 mov eax, dword ptr [0048A3BC] ;这条居然是入口！不是PUSH EBP?
C1E002 shl eax, 02
A3C0A34800 mov dword ptr [0048A3C0], eax
57 push edi
51 push ecx

在MOV EAX, dword ptr [0048A3BC]处来个PEDUMP，嘿嘿，脱壳成功。

接着便是破注册的过程了。程序运行时会生成一个本机号，估计是把电脑的各种参数都计算出来凑成一块儿的。算法复杂得很。——先试试再说。运行程序IRVIEWER.EXE，啪地出来个窗口告诉你没注册，还把本机号多少多少多少告诉你。按确定后点菜单中的注册出现注册输入框。随便乱填后按确定，窗体先消失，然后告诉你错误。没的说，跟吧。下断 bpx hmemcpy，断后pmodule，清断点按F10跟踪，在IRVIEWER和COMCTL32.DLL和kernerl、user等之间跳了几次后终于来到以下处：

:00402A7A 8B0D50354900 mov ecx, dword ptr [00493550]
:00402A80 8B01 mov eax, dword ptr [ecx]
:00402A82 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00402A88 E80B210400 call 00444B98
:00402A8D 8D45FC lea eax, dword ptr [ebp-04]
:00402A90 E8DB360000 call 00406170
:00402A95 50 push eax
:00402A96 E8212F0000 call 004059BC ;这里验证注册码是否正确。
:00402A9B 59 pop ecx
:00402A9C 3B0548BD4900 cmp eax, dword ptr [0049BD48] ;正确标志
:00402AA2 0F95C2 setne dl ;对则DL为0，否则……
:00402AA5 83E201 and edx, 00000001 ;否则为1
:00402AA8 52 push edx
:00402AA9 FF4DD4 dec [ebp-2C]
:00402AAC 8D45FC lea eax, dword ptr [ebp-04]
:00402AAF BA02000000 mov edx, 00000002
:00402AB4 E8E3600800 call 00488B9C
:00402AB9 59 pop ecx
:00402ABA 84C9 test cl, cl
:00402ABC 7429 je 00402AE7 ;这里不跳则出错。
:00402ABE 6A00 push 00000000

但如果改00402ABC处的JE，居然无效。只有改00402AA2处了。把setne dl和AND EDX,00000001改成MOV EDX,0和NOP即可。
也就是把
0F 95 C2 83 E2 01 52
改为：
BA 00 00 00 00 90 ..

改掉脱壳后的EXE文件后再运行，选菜单中的注册，在注册框中乱填一气，按确定。……嗯？什么都没有？
那这样算不算注册成功？关闭程序再运行，仍然提示未注册。看来不行。
不过注意到一点，乱填一气的注册码在程序再度运行后在注册框中仍然存在，看来注册这一步应该是通过了，但程序启动的时候还有一步检验的过程，那儿通不过，就得每次运行程序都得注册一次了。
用FILEmonitor和regmonitor监视程序运行中注册表和文件的变化，终于从千头万绪中看到了C:\WINDOWS\IRVIEW.INI文件。注册框的检验通过后关闭程序时会把“正确”的注册码写入C:\WINDOWS\IRVIEW.INI文件。其内容为：

[Register]
SerialNum=0987654321

这样就需要跟踪程序开始读文件的部分。我于是就用TRW2000来LOAD它，下断Createfilea也好，下getprivateprofilestring也好，下getprivateprofileint也好，下readfile也好，下openfile和其ex也好，居然要么是什么都拦不住（这是什么原因还请各位指点），要么就是在弹出提示未注册框后中断。我几乎觉得山穷水尽了。后来仔细想想又找到了法子。——程序不是会把这个“正确”的注册码读进来吗？我就查它就行了。
在弹出注册框时按Ctrl+M切入TRW2000，s 0 ffffffff '0987654321'，真的找到一个地址47B490。
退出程序重新load，下bpm 47b490 w，后来中断几次，看看哪次47b490处会出现0987654321。
哈哈，这里！——这里中断已经离目标不远了。
（据REGMON分析，程序是先读许多注册表参数再读的IRVIEW.INI文件，也就是说很可能本机号的计算在注册码的读出之前处理，可以跳过许多麻烦的算法程序了。）

不多久来到此处：

:0040325B E80C270000 call 0040596C
:00403260 A348BD4900 mov dword ptr [0049BD48], eax
:00403265 B850BD4900 mov eax, 0049BD50
:0040326A E8012F0000 call 00406170
:0040326F 50 push eax
:00403270 E847270000 call 004059BC ;这里是验证过程
:00403275 59 pop ecx
:00403276 3B0548BD4900 cmp eax, dword ptr [0049BD48] ;这里是关键比对
:0040327C 0F849E000000 je 00403320 ;正确则跳，否则出错。
:00403282 66C7459C5000 mov [ebp-64], 0050
:00403288 8D45D0 lea eax, dword ptr [ebp-30]
:0040328B E8B02E0000 call 00406140
:00403290 8BD0 mov edx, eax
:00403292 FF45A8 inc [ebp-58]
:00403295 A148BD4900 mov eax, dword ptr [0049BD48]
:0040329A E89D2F0000 call 0040623C
:0040329F 8D55D0 lea edx, dword ptr [ebp-30]
:004032A2 52 push edx
:004032A3 8D45CC lea eax, dword ptr [ebp-34]
:004032A6 E8952E0000 call 00406140
:004032AB 50 push eax
:004032AC FF45A8 inc [ebp-58]

* Possible StringData Ref from Data Obj ->"该软件没有注册,请向作者注册.
注册号: "
|
:004032AF BA01A84800 mov edx, 0048A801
………… ;下边就省了。

很好。把je 00403320改成JMP 00403320就行。
也就是做以下修改：
0F 84 9E 00 00 00 66 C7
E9 9F 00 .. .. 90 .. ..

保存文件后运行，万事大吉！——实际上只改此处就行。

这个软件在华军上的软件分类中的“其他栏目”中有下载，不是列表中的第一个地址！那是错的，虽然也是一个IR.EXE，却是什么InternetRadio。 ^_^
这个东西如果用静态分析查找字串引用的方法来破可能还会简单得多，我没这样做，因为……还不熟，找注册码就更没本事了。嘿嘿！

后记：
本文在打字过程中完成50%左右时正待保存，却出来个保存错误，然后Uedit32被中止，我差点气晕，赶忙启动TRW2000，查找内存中的"IRVIEW.INI"，结果万幸，找到了我这可怜的半篇文章。但VMM模式下不可写盘，我于是下个BPX HMEMCPY，暂时退出，随便在那个程序的框中敲一字符，断时就脱离VMM模式了，来个w，好，总算没浪费力气。
——Passion写于情人节后两天。


华表3.34专业版

 标 题:华表3.34专业版解密过程及思考 (3千字)
发信人:ywc2000
时 间:2001-8-22 8:52:35
详细信息:
华表3.34专业版解密过程
华表软件不愧是中国人的自豪，功能较强但体积很小。已经有许多朋友对它进行过破解。近日天气酷热，待在家里没事，将它拿出来试用一下，是一个未注册版，先解密吧。
使用工具：w32dasm、hiew
破解难度：低
先是按照提示字符：注册码不正确，请仔细检查！找到44FD5,原来是由444F92跳过来的：
:00444F8A E8718A0900 call 004DDA00　&#61663;有问题，进去看看！
:00444F8F 6685C0 test ax, ax　　&#61663;只要ax=0，就跳出注册失败提示。
:00444F92 7E3D jle 00444FD1　&#61663;跳到失败处。
如果你立即很简单地将jle改为nop，你会发现是不行的。
但只要不使ax=0即可使之不出现错误提示，关键在上面的call中，进入call 004DDA00看看：
:004DDA00 6AFF push FFFFFFFF
:004DDA02 68A8625300 push 005362A8
:004DDA07 64A100000000 mov eax, dword ptr fs:[00000000]
...以下一段略过...
:004DDA43 746E je 004DDAB3 &#61663;通向结束之路！
:004DDA45 8A0E mov cl, byte ptr [esi]
:004DDA47 80F941 cmp cl, 41
:004DDA4A 0F8D9A000000 jnl 004DDAEA　&#61663;通向成功之路！
:004DDA50 660FBE6C16FE movsx bp, byte ptr [esi+edx-02]
:004DDA56 83ED30 sub ebp, 00000030
:004DDA59 C744242401000000 mov [esp+24], 00000001
:004DDA61 663BE8 cmp bp, ax
:004DDA64 7C4D jl 004DDAB3　&#61663;通向结束之路！
以下你会看到je 004DDAB3是一条既短又快的结束之路，注册失败！而jnl 004DDAEA则是一条又长又复杂的成功之路。选择谁，似乎是不言而喻的。但你会发现选择长征之路的成功希望极小，此时你才会想起毛泽东的伟大，他来的话，可能会成功。于是我别无选择了通向结束之路。
将:004DDA43 746E je 004DDAB3改为:004DDA43 EB6E jmp 004DDAB3：
:004DDAB3 8D4C2410 lea ecx, dword ptr [esp+10]
:004DDAB7 C644245C00 mov [esp+5C], 00
:004DDABC E8D2D50200 call 0050B093
:004DDAC1 8D4C2414 lea ecx, dword ptr [esp+14]
:004DDAC5 C744245CFFFFFFFF mov [esp+5C], FFFFFFFF
:004DDACD E8C1D50200 call 0050B093
:004DDAD2 6633C0 xor ax, ax &#61663;它是注册失败之源！

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DDE0D(U)
|
:004DDAD5 8B4C2454 mov ecx, dword ptr [esp+54]
:004DDAD9 5F pop edi
:004DDADA 5E pop esi
:004DDADB 5D pop ebp
:004DDADC 5B pop ebx
:004DDADD 64890D00000000 mov dword ptr fs:[00000000], ecx
:004DDAE4 83C450 add esp, 00000050
:004DDAE7 C20400 ret 0004

第一反应是将:004DDAD2 6633C0 xor ax, ax 改为mov ax,01或or ax,1，但你会发现改过后字节比原来的长，导致程序出错。静下心来想一下，它为什么要xor ax,ax呢，ax中的值在此之前肯定不为0，所以为了注册失败必须将它改为0，我要的正是ax为不0，于是只要将xor ax,ax改为nop即可，很简单！用hiew进行上述修改原程序后，程序不再出现讨厌的要你注册的提示了，已经是一个注册版了，到注册的地方随便填入什么，也没关系了，当然，不填也没关系。填上自己的大名，按“注册”，出现注册成功的提示，在“关于”中，你会满意地发现该软件合法使用人为你！
破解时间：30分钟。
不仅是解了这个软件，更重要的是一种新的思路。


金锋邮件群发 V2.4

 标 题:暴力破解：金锋邮件群发 V2.4 (价值125元！) (12千字)
发信人:mazhenyu
时 间:2001-8-17 16:35:15
详细信息:
软件下载：http://www.jinfengnet.com
文件尺寸：998,912

用language查看，程序没有加壳。
用W32Dasm反汇编破解。

破解分两步走：

1. 破解注册码：

根据“串式参考”找到注册错误提示信息“对不起，注册码错误，如果您已经付费请与作者联系以获得正确的注册码。”，双击：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CCCE8(C)
|
:004CCD8E 8D45F8 lea eax, dword ptr [ebp-08]
:004CCD91 BA20D24C00 mov edx, 004CD220
:004CCD96 E8B170F3FF call 00403E4C
:004CCD9B 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]
:004CCDA1 50 push eax
:004CCDA2 8D95C0FEFFFF lea edx, dword ptr [ebp+FFFFFEC0]
:004CCDA8 8B8634050000 mov eax, dword ptr [esi+00000534]
:004CCDAE E86D54F6FF call 00432220
:004CCDB3 8B85C0FEFFFF mov eax, dword ptr [ebp+FFFFFEC0]
:004CCDB9 50 push eax
:004CCDBA 8B45F8 mov eax, dword ptr [ebp-08]
:004CCDBD E88270F3FF call 00403E44
:004CCDC2 8BC8 mov ecx, eax
:004CCDC4 BA03000000 mov edx, 00000003
:004CCDC9 58 pop eax
:004CCDCA E87D72F3FF call 0040404C
:004CCDCF 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]
:004CCDD5 BA2CD24C00 mov edx, 004CD22C
:004CCDDA E86D70F3FF call 00403E4C
:004CCDDF 8B85C4FEFFFF mov eax, dword ptr [ebp+FFFFFEC4]
:004CCDE5 50 push eax
:004CCDE6 8D95BCFEFFFF lea edx, dword ptr [ebp+FFFFFEBC]
:004CCDEC 8B45F8 mov eax, dword ptr [ebp-08]
:004CCDEF E8D4B8F3FF call 004086C8
:004CCDF4 8B95BCFEFFFF mov edx, dword ptr [ebp+FFFFFEBC]
:004CCDFA 58 pop eax
:004CCDFB E85471F3FF call 00403F54

:004CCE00 744A je 004CCE4C <======== 将“74”改为“EB”

:004CCE02 6A00 push 00000000
:004CCE04 668B0D40D14C00 mov cx, word ptr [004CD140]
:004CCE0B B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"对不起，注册码错误，如果您已经付费请与作者联系"
->"以获得正确的注册码。"
|
:004CCE0D B878D14C00 mov eax, 004CD178
:004CCE12 E81DCDF9FF call 00469B34
:004CCE17 8B8634050000 mov eax, dword ptr [esi+00000534]
:004CCE1D 8B10 mov edx, dword ptr [eax]
:004CCE1F FF92B0000000 call dword ptr [edx+000000B0]
:004CCE25 8B8650050000 mov eax, dword ptr [esi+00000550]
:004CCE2B 33D2 xor edx, edx
:004CCE2D E80653F6FF call 00432138
:004CCE32 8B8674070000 mov eax, dword ptr [esi+00000774]
:004CCE38 B201 mov dl, 01
:004CCE3A E8F952F6FF call 00432138
:004CCE3F 33C0 xor eax, eax
:004CCE41 5A pop edx
:004CCE42 59 pop ecx
:004CCE43 59 pop ecx
:004CCE44 648910 mov dword ptr fs:[eax], edx
:004CCE47 E950020000 jmp 004CD09C

2. 破解网上验证：

根据“串式参考”找到注册错误提示信息“在线验证用户信息失败，如果您确实已经付费，请稍后再试或与作者联系。”，双击：

为了提高可靠性，这个软件共使用4个服务器进行验证：
如果与第一个服务器连接成功了，就注册成功；
如果与第一个服务器的连接不成功，就改用第二个服务器进行连接；
如果4个服务器都连接不上，则注册失败；
破解时只要使第一个服务器注册成功即可，不必再理会后面的3个备份服务器。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CCE00(C)
|
:004CCE4C 8B8650050000 mov eax, dword ptr [esi+00000550]

* Possible StringData Ref from Code Obj ->"正在通过网络服务器1验证用户信息..."
|
:004CCE52 BA38D24C00 mov edx, 004CD238
:004CCE57 E8F453F6FF call 00432250

* Possible StringData Ref from Code Obj ->"http://www.jinfengnet.com/user/dat/"
|
:004CCE5C 6864D24C00 push 004CD264
:004CCE61 FF75E8 push [ebp-18]

* Possible StringData Ref from Code Obj ->".jf"
|
:004CCE64 6890D24C00 push 004CD290
:004CCE69 8D85B8FEFFFF lea eax, dword ptr [ebp+FFFFFEB8]
:004CCE6F BA03000000 mov edx, 00000003
:004CCE74 E88B70F3FF call 00403F04
:004CCE79 8B85B8FEFFFF mov eax, dword ptr [ebp+FFFFFEB8]
:004CCE7F E8B8D6FEFF call 004BA53C
:004CCE84 84C0 test al, al

:004CCE86 0F85F4000000 jne 004CCF80 <======== 将“85”改为“84”

:004CCE8C 8B8650050000 mov eax, dword ptr [esi+00000550]

* Possible StringData Ref from Code Obj ->"正在通过网络服务器2验证用户信息..."
|
:004CCE92 BA9CD24C00 mov edx, 004CD29C
:004CCE97 E8B453F6FF call 00432250

* Possible StringData Ref from Code Obj ->"http://go7.163.com/jinfengnet/user/dat/"
|
:004CCE9C 68C8D24C00 push 004CD2C8
:004CCEA1 FF75E8 push [ebp-18]

* Possible StringData Ref from Code Obj ->".jf"
|
:004CCEA4 6890D24C00 push 004CD290
:004CCEA9 8D85B4FEFFFF lea eax, dword ptr [ebp+FFFFFEB4]
:004CCEAF BA03000000 mov edx, 00000003
:004CCEB4 E84B70F3FF call 00403F04
:004CCEB9 8B85B4FEFFFF mov eax, dword ptr [ebp+FFFFFEB4]
:004CCEBF E878D6FEFF call 004BA53C
:004CCEC4 84C0 test al, al
:004CCEC6 0F85B4000000 jne 004CCF80 <======== 转向同一个地址004CCF80
:004CCECC 8B8650050000 mov eax, dword ptr [esi+00000550]

* Possible StringData Ref from Code Obj ->"正在通过网络服务器3验证用户信息..."
|
:004CCED2 BAF8D24C00 mov edx, 004CD2F8
:004CCED7 E87453F6FF call 00432250

* Possible StringData Ref from Code Obj ->"http://jinfengnet.myrice.com/user/dat/"
|
:004CCEDC 6824D34C00 push 004CD324
:004CCEE1 FF75E8 push [ebp-18]

* Possible StringData Ref from Code Obj ->".jf"
|
:004CCEE4 6890D24C00 push 004CD290
:004CCEE9 8D85B0FEFFFF lea eax, dword ptr [ebp+FFFFFEB0]
:004CCEEF BA03000000 mov edx, 00000003
:004CCEF4 E80B70F3FF call 00403F04
:004CCEF9 8B85B0FEFFFF mov eax, dword ptr [ebp+FFFFFEB0]
:004CCEFF E838D6FEFF call 004BA53C
:004CCF04 84C0 test al, al
:004CCF06 7578 jne 004CCF80 <======== 转向同一个地址004CCF80
:004CCF08 8B8650050000 mov eax, dword ptr [esi+00000550]

* Possible StringData Ref from Code Obj ->"正在通过网络服务器4验证用户信息..."
|
:004CCF0E BA54D34C00 mov edx, 004CD354
:004CCF13 E83853F6FF call 00432250

* Possible StringData Ref from Code Obj ->"http://jinfengsoft.home.chinaren.com/user/dat/"
|
:004CCF18 6880D34C00 push 004CD380
:004CCF1D FF75E8 push [ebp-18]

* Possible StringData Ref from Code Obj ->".htm"
|
:004CCF20 68B8D34C00 push 004CD3B8
:004CCF25 8D85ACFEFFFF lea eax, dword ptr [ebp+FFFFFEAC]
:004CCF2B BA03000000 mov edx, 00000003
:004CCF30 E8CF6FF3FF call 00403F04
:004CCF35 8B85ACFEFFFF mov eax, dword ptr [ebp+FFFFFEAC]
:004CCF3B E8FCD5FEFF call 004BA53C
:004CCF40 84C0 test al, al
:004CCF42 753C jne 004CCF80 <======== 转向同一个地址004CCF80
:004CCF44 6A00 push 00000000
:004CCF46 668B0D40D14C00 mov cx, word ptr [004CD140]
:004CCF4D B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"在线验证用户信息失败，如果您确实已经付费，请稍"
->"后再试或与作者联系。"
|
:004CCF4F B8C8D34C00 mov eax, 004CD3C8
:004CCF54 E8DBCBF9FF call 00469B34
:004CCF59 8B8650050000 mov eax, dword ptr [esi+00000550]
:004CCF5F 33D2 xor edx, edx
:004CCF61 E8D251F6FF call 00432138
:004CCF66 8B8674070000 mov eax, dword ptr [esi+00000774]
:004CCF6C B201 mov dl, 01
:004CCF6E E8C551F6FF call 00432138
:004CCF73 33C0 xor eax, eax
:004CCF75 5A pop edx
:004CCF76 59 pop ecx
:004CCF77 59 pop ecx
:004CCF78 648910 mov dword ptr fs:[eax], edx
:004CCF7B E91C010000 jmp 004CD09C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004CCE86(C), :004CCEC6(C), :004CCF06(C), :004CCF42(C) <======== 可以从4个地方转来
|
:004CCF80 B201 mov dl, 01 <======== 验证成功，就转到此处
:004CCF82 A164514800 mov eax, dword ptr [00485164]
:004CCF87 E8D882FBFF call 00485264
:004CCF8C 8BD8 mov ebx, eax
:004CCF8E BA00000080 mov edx, 80000000
:004CCF93 8BC3 mov eax, ebx
:004CCF95 E86A83FBFF call 00485304
:004CCF9A 8D85A8FEFFFF lea eax, dword ptr [ebp+FFFFFEA8]
:004CCFA0 E83FD1FEFF call 004BA0E4
:004CCFA5 8B95A8FEFFFF mov edx, dword ptr [ebp+FFFFFEA8]
:004CCFAB 8BC3 mov eax, ebx
:004CCFAD E8B683FBFF call 00485368
:004CCFB2 8D85A4FEFFFF lea eax, dword ptr [ebp+FFFFFEA4]
:004CCFB8 E827D1FEFF call 004BA0E4
:004CCFBD 8B95A4FEFFFF mov edx, dword ptr [ebp+FFFFFEA4]
:004CCFC3 B101 mov cl, 01
:004CCFC5 8BC3 mov eax, ebx
:004CCFC7 E87884FBFF call 00485444
:004CCFCC 8D85A0FEFFFF lea eax, dword ptr [ebp+FFFFFEA0]
:004CCFD2 E8A9F4FEFF call 004BC480
:004CCFD7 8B8DA0FEFFFF mov ecx, dword ptr [ebp+FFFFFEA0]
:004CCFDD 33D2 xor edx, edx
:004CCFDF 8BC3 mov eax, ebx
:004CCFE1 E8FA85FBFF call 004855E0
:004CCFE6 8BC3 mov eax, ebx
:004CCFE8 E8E782FBFF call 004852D4
:004CCFED 8D859CFEFFFF lea eax, dword ptr [ebp+FFFFFE9C]
:004CCFF3 E8F0D9FEFF call 004BA9E8
:004CCFF8 8B959CFEFFFF mov edx, dword ptr [ebp+FFFFFE9C]
:004CCFFE 8BC3 mov eax, ebx
:004CD000 E86383FBFF call 00485368
:004CD005 8D8598FEFFFF lea eax, dword ptr [ebp+FFFFFE98]
:004CD00B E8D8D9FEFF call 004BA9E8
:004CD010 8B9598FEFFFF mov edx, dword ptr [ebp+FFFFFE98]
:004CD016 B101 mov cl, 01
:004CD018 8BC3 mov eax, ebx
:004CD01A E82584FBFF call 00485444
:004CD01F 8D8594FEFFFF lea eax, dword ptr [ebp+FFFFFE94]
:004CD025 E8D6D4FEFF call 004BA500
:004CD02A 8B8D94FEFFFF mov ecx, dword ptr [ebp+FFFFFE94]
:004CD030 33D2 xor edx, edx
:004CD032 8BC3 mov eax, ebx
:004CD034 E8A785FBFF call 004855E0
:004CD039 8BC3 mov eax, ebx
:004CD03B E89482FBFF call 004852D4
:004CD040 8BC3 mov eax, ebx
:004CD042 E8B55EF3FF call 00402EFC
:004CD047 C605880E4E0001 mov byte ptr [004E0E88], 01
:004CD04E B87C0E4E00 mov eax, 004E0E7C
:004CD053 E86C6BF3FF call 00403BC4
:004CD058 B8800E4E00 mov eax, 004E0E80
:004CD05D E8626BF3FF call 00403BC4

* Possible StringData Ref from Code Obj ->"恭喜！您已注册为付费用户了。"
|
:004CD062 B814D44C00 mov eax, 004CD414
:004CD067 E8C0CBF9FF call 00469C2C
:004CD06C 8B8650050000 mov eax, dword ptr [esi+00000550]

* Possible StringData Ref from Code Obj ->"您已注册为付费用户了"

可以使用UltraEdit进行修改，修改完毕后，就是真正的“破解版”了。

注册时需在线，点击用户注册选项，输入盘符(一般填“c”)，并随便输入假用户注册码(20位任意数字)，点击“付费用户注册”，注册成功！

太棒了！

By the way，这个版本(V2.4)的软件中有不少Bug，例如：发送出去的邮件的“发送时间”不对。

马震宇
2001.8.17.


乱刀

 标 题:转载：“乱刀”破解手记 (1千字)
发信人:1212
时 间:2000-9-3 9:48:55
详细信息:
“乱刀”破解手记
乱刀（blade.exe）是国人编写的一个破解帐号口令的程序，我没用过，因为我对黑客技术没什么研究。上个月何洋兄把它寄给我，我最近才有空搞定它。
通过初步分析可以发现这个软件在注册表里作了手脚以便记录使用次数。修改注册表不太容易而且有点胜之不武。大概跟了一下，发现它用的算法比较怪，难以直接找到转跳点，故采用迂回战术。
1，用pebble32.exe（用Exescope也行）打开它，可以发现对话“166”的caption是“感谢您”。进去一看，果然是注册成功的提示。
2，用DeASM反汇编它，在“Dlg参考”中找到对话“A6”(即166的16进制)，双击后看到：
* Possible Reference to Dialog: DialogID_00A6
:00417DBF 68A600000 push 000000A6
... ...
向上看，可以看到：
:00417A22 7532 jne 00417A56
修改他没有用（试出来的呀），再向上，看到:
:004179F2 85C0 test eax, eax
:004179F4 0F8565010000 jne 00417B5F
在trw2000下g 004179F4，拦到后把Z改为1，OK!
经过察看，发现它在C:\生成了一个名为blade.sys的隐含文件，打开它可以到看注册名和经过加密运算的注册码。
不喜欢用TRW2000的朋友只要把注册好的blade.sys拷贝到c:\即可完成注册，blade.sys在“白菜乐园”可以找到。
----------DayDreamer 2000-5-22
IHaveNoDream@China.com


盲打指法练习 v3.0

 标 题:标准盲打指法练习 v3.0破解手记 (2千字)
发信人:孙锋
时 间:2000-12-26 23:42:31
详细信息:
标准盲打指法练习 v3.0破解手记
时间：2000年12月21日
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#

今天从"番外地"下载了一个软件"标准盲打指法练习 v3.0",想看看这个软件到底怎样,下载的是没有注册的文件(当然也下载了注册号),刚好今天学校里要进行大扫除,而我们班要进行实习,我排在后天下午，有空!来破解一下吧.因为从网上看到有的网友说注册码不对的情况(我下载的可以使用),所以就做来个破解文件吧.

好了动手吧.

我在这里用到的软件有:

Hview 5.91 (很老的了) (也可以用Ultra Edit 32)
W32Dasm8.93

以上软件可在白菜大哥那里下载。

步骤:
1、先用W32Dasm8.93 反汇编zsTyping.exe，查找字符串"注册失败！"，查找到地址为：

* Refereced by a (U)nconditional or (C)onditioanl Jump at Addres:
|:00410ce0(c)------------------------------------------------->>>>>(这里是破解的关键）
|

* Possible StringData Ref form Data obj ->(乱码)
->"email:zsemail9169_cn@sina.com(还有一点乱码）

|
:00410CE9 688C9D4500 push 00459D8C

2、再往上看看可以看到“注册成功”的字符串，地址为：

:00410CE0 7407 je 004110CE9-------------------------->>>>（修改为 jne 004110CE9即可）
（这里是判断如果注册码正确就跳转到“注册成功”对话框）

* Possible StringData Ref form Data Obj ->"" (里面是一些乱码）
->"" (里面是一些乱码）
:00410CE2 68D09D4500 push 00459DD0
:00410CE7 EB05 jmp 00410CEE

* Refereced by a (U)nconditional or (C)onditioanl Jump at Addres:
|:00410ce0(c)--------------------------------------------------->>>>>(这里是破解的关键）
| （这里是判断如果注册码错误就跳转到“注册失败”对话框）

* Possible StringData Ref form Data obj ->(乱码)
->"email:zsemail9169_cn@sina.com(还有一点乱码）

|
:00410CE9 688C9D4500 push 00459D8C

3、在破解时我还看到有“软件已注册”的字符串，位置是：

:00401181 7507 jne 0040118A -------------------------------->>>>>(修改这里为 je 0040118A即可)
（这里是判断是否注册，如果没有注册就跳转到“未注册版本”对话框）

* Possible StringData Ref form Data obj ->"(乱码)"
->" (乱码):http://zstyping.126.com"
->"E-mail: zsemail9169_cn@sina.com"

|
:00401183 681C514500 push 0045511C
:00401188 EB50 jmp 0040118F

* Refereced by a (U)nconditional or (C)onditioanl Jump at Addres:
|:00401181(c) ------------------------------------------------>>>>>(破解的关键地方）
|

* Possible StringData Ref form Data obj ->" (乱码)"
->http://zstyping.126.com E-mail:"
->"E-mail: zsemail9169_cn@sina.com"
->"zsnetemail@8848.com"
|
:0040118A 68C8504500 push 00450C8

4、现在进行修改：

启动Hview5.91
选择目标文件后使用F4功能，再选择 Decode模式，

F5查找1181，然后F3修改7507为7407，可以完成“软件已经注册”的破解。
F5查找10CE0，然后F3修改7407为7507，可以完成“注册成功”和“注册失败”的破解。


密码大师4.0

 标 题:密码大师4.0破解过程 (3千字)
发信人:conanxu[BCG]
时 间:2001-5-6 16:23:05
详细信息:
密码大师4.0破解过程
软件下载:http://www.inhua.com/down/jm4.0.zip
用Trw2000载入文件运行，下断点bpx messageboxa，选择大于2M的文件，被拦下，按F12到下面
016F:004020D1 LEA ECX,[EBP+FFFE772C]
016F:004020D7 CALL 004892A1
016F:004020DC MOV EDX,[EBP-10]
016F:004020DF MOV EAX,[EDX+1FBC]
016F:004020E5 MOV ECX,[EBP-10]
016F:004020E8 CMP DWORD [ECX+EAX*4+101C],00200B20 -->监测文件长度
016F:004020F3 JNA 004020F7 -->不跳就死，改为JMP SHORT 004020F7
016F:004020F5 JMP SHORT 00402118
016F:004020F7 MOV EDX,[EBP-10]
016F:004020FA MOV EAX,[EDX+1FBC]
016F:00402100 ADD EAX,BYTE +01
016F:00402103 MOV ECX,[EBP-10]
016F:00402106 MOV [ECX+1FBC],EAX
016F:0040210C MOV EDX,[EBP-10]
016F:0040210F CMP DWORD [EDX+1FBC],BYTE +02 -->监测载入文件数目
016F:00402116 JNG 00402140 -->不跳就死，改为JMP SHORT 00402140
016F:00402118 PUSH BYTE +00
016F:0040211A PUSH DWORD 005B8710
016F:0040211F PUSH DWORD 005B84DC
016F:00402124 MOV ECX,[EBP-10]
016F:00402127 CALL 00484682 -->这里面就是错误提示了，向上看看
016F:0040212C MOV BYTE [EBP-04],00
016F:00402130 LEA ECX,[EBP+FFFE772C]
016F:00402136 CALL 00488A4E
016F:0040213B JMP 00402238
016F:00402140 MOV BYTE [EBP-04],00
016F:00402144 LEA ECX,[EBP+FFFE772C]
016F:0040214A CALL 00488A4E
破解完成。。。。。
退出。。。
什么。。。。竟然有出现提示窗口，干掉他，下断点bpx messageboxa，运行软件，推出，程序被栏下，按2次F12到下面
016F:00402FD9 POP ECX
016F:00402FDA MOV [EBP-04],ECX
016F:00402FDD PUSH BYTE +00
016F:00402FDF PUSH DWORD 005B8710
016F:00402FE4 PUSH DWORD 005B84DC
016F:00402FE9 MOV ECX,[EBP-04]
016F:00402FEC CALL 00484682 -->这个就是退出的提示窗口了，用5个nop盖了它
016F:00402FF1 MOV ECX,[EBP-04]
016F:00402FF4 CALL 0047F1B9
016F:00402FF9 POP EDI
016F:00402FFA POP ESI
016F:00402FFB POP EBX
016F:00402FFC ADD ESP,BYTE +44
016F:00402FFF CMP EBP,ESP
016F:00403001 CALL 0041F440
016F:00403006 MOV ESP,EBP
016F:00403008 POP EBP
本想该结束了吧，没想到退出时又出现了提示窗口，bpx messageboxa，按2次F12到下面
016F:00424773 AND ECX,BYTE +04
016F:00424776 TEST ECX,ECX
016F:00424778 JZ 004247E8 -->这个跳转可以带过下面的CALL，改为JMP SHORT 004247E8
016F:0042477A CMP DWORD [EBP+10],BYTE +00
016F:0042477E JZ 0042479D
016F:00424780 PUSH BYTE +0A
016F:00424782 LEA EDX,[EBP+FFFFCFDC]
016F:00424788 PUSH EDX
016F:00424789 MOV EAX,[EBP+10]
016F:0042478C PUSH EAX
016F:0042478D CALL 004280D0
016F:00424792 ADD ESP,BYTE +0C
016F:00424795 MOV [EBP+FFFFCFD4],EAX
016F:0042479B JMP SHORT 004247A7
016F:0042479D MOV DWORD [EBP+FFFFCFD4],00
016F:004247A7 LEA ECX,[EBP+FFFFF000]
016F:004247AD PUSH ECX
016F:004247AE MOV EDX,[EBP+14]
016F:004247B1 PUSH EDX
016F:004247B2 MOV EAX,[EBP+FFFFCFD4]
016F:004247B8 PUSH EAX
016F:004247B9 MOV ECX,[EBP+0C]
016F:004247BC PUSH ECX
016F:004247BD MOV EDX,[EBP+08]
016F:004247C0 PUSH EDX
016F:004247C1 CALL 00424800 -->这里是错误框
016F:004247C6 ADD ESP,BYTE +14
016F:004247C9 MOV [EBP+FFFFEFF8],EAX
016F:004247CF CMP DWORD [EBP+08],BYTE +02
016F:004247D3 JNZ 004247E0
016F:004247D5 PUSH DWORD 005E5688
016F:004247DA CALL `KERNEL32!InterlockedDecrement`
016F:004247E0 MOV EAX,[EBP+FFFFEFF8]
016F:004247E6 JMP SHORT 004247FB
016F:004247E8 CMP DWORD [EBP+08],BYTE +02
016F:004247EC JNZ 004247F9
载运行一下，一切流畅，到此破解终于完成了
烦。。。。。

conanxu[BCG]
conanxu@eastday.com


敏思法律文书编辑

标 题:破文一篇，和和 (2千字)
发信人:copyyour
时 间:2001-4-14 16:51:48
详细信息:
敏思法律文书编辑（普及版）

破解方法

工具：w32dasm,hiew640

先用w32dasm反汇编

* Reference To: MSVCRT._mbscmp, Ord:0159h
|
:00401AC2 FF1520064100 Call dword ptr [00410620]
:00401AC8 83C408 add esp, 00000008
:00401ACB 85C0 test eax, eax
:00401ACD 53 push ebx
:00401ACE 7530 jne 00401B00============>改此处为74就ok了

* Reference To: MFC42.Ordinal:0339, Ord:0339h
|
:00401AD0 E859C00000 Call 0040DB2E
:00401AD5 83C404 add esp, 00000004
:00401AD8 8D4C240C lea ecx, dword ptr [esp+0C]
:00401ADC C7442418FFFFFFFF mov [esp+18], FFFFFFFF

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:00401AE4 E8DBC00000 Call 0040DBC4
:00401AE9 5F pop edi
:00401AEA 5E pop esi
:00401AEB B801000000 mov eax, 00000001
:00401AF0 5B pop ebx
:00401AF1 8B4C2404 mov ecx, dword ptr [esp+04]
:00401AF5 64890D00000000 mov dword ptr fs:[00000000], ecx
:00401AFC 83C410 add esp, 00000010
:00401AFF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401ACE(C)
|

* Reference To: MFC42.Ordinal:0339, Ord:0339h
|
:00401B00 E829C00000 Call 0040DB2E
:00401B05 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401ABA(C)
|
:00401B08 6A00 push 00000000
:00401B0A 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册码错误! 正确注册后，才可以使用"
|
:00401B0C 680C614100 push 0041610C

* Reference To: MFC42.Ordinal:04B0, Ord:04B0h

太简单，没什么写的，就是要注意在w32dasm中的地址与hiew中地址转化的方法，看雪教程中有详细介绍，我就不多说了
我还全靠bnbnf大哥，提醒呢，和和

cracked by copyyour(CCG)


木马克星IPARMOR4.0 30

 标 题:入门习作：木马克星IPARMOR4.0 30 TIMES LIMITS CRACK AND REG (10千字)
发信人:crack123
时 间:2001-6-22 17:38:20
详细信息:
IPARMOR4.0 30 TIMES LIMITS CRACK AND REG

该软件DEMO版有运行30次限制，在注册窗口输入用户名及注册码后，
点按“注册”按钮无提示。
用fi240观察后知其为DELPHI编程，故用 DEDE 反编译，发现在下列
地址处为“注册”钮入口子程序：

（DEDE 2.50）

procedure TForm7.SpeedButton1Click(Sender: TObject);
begin
{
004A06DC 55 push ebp
004A06DD 8BEC mov ebp, esp
004A06DF 81C4DCFEFFFF add esp, $FFFFFEDC
004A06E5 53 push ebx
004A06E6 56 push esi
004A06E7 33C9 xor ecx, ecx
004A06E9 898DDCFEFFFF mov [ebp+$FFFFFEDC], ecx
004A06EF 898DECFEFFFF mov [ebp+$FFFFFEEC], ecx
004A06F5 898DE4FEFFFF mov [ebp+$FFFFFEE4], ecx
004A06FB 898DE0FEFFFF mov [ebp+$FFFFFEE0], ecx
004A0701 898DE8FEFFFF mov [ebp+$FFFFFEE8], ecx
004A0707 898DF4FEFFFF mov [ebp+$FFFFFEF4], ecx
004A070D 898DF0FEFFFF mov [ebp+$FFFFFEF0], ecx
004A0713 898DFCFEFFFF mov [ebp+$FFFFFEFC], ecx
004A0719 898DF8FEFFFF mov [ebp+$FFFFFEF8], ecx
004A071F 8BD8 mov ebx, eax
004A0721 33C0 xor eax, eax
004A0723 55 push ebp
004A0724 681E094A00 push $004A091E

***** TRY
|
004A0729 64FF30 push dword ptr fs:[eax]
004A072C 648920 mov fs:[eax], esp
004A072F 8D95F8FEFFFF lea edx, [ebp+$FFFFFEF8]

* Reference to control TForm7.Edit2 : TEdit
|
004A0735 8B83E8020000 mov eax, [ebx+$02E8]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
004A073B E89CDEF8FF call 0042E5DC
-->计算用户名字符长度
004A0740 8B85F8FEFFFF mov eax, [ebp+$FFFFFEF8]
004A0746 8D95FCFEFFFF lea edx, [ebp+$FFFFFEFC]

* Reference to: sysutils.UpperCase(System.AnsiString):System.AnsiString;
|
004A074C E8B77FF6FF call 00408708
-->>用户名小写字母转换为大写字母
004A0751 8B95FCFEFFFF mov edx, [ebp+$FFFFFEFC]
004A0757 8D8500FFFFFF lea eax, [ebp+$FFFFFF00]
004A075D B9FF000000 mov ecx, $000000FF

* Reference to: system.@LStrToString;
|
004A0762 E81939F6FF call 00404080
004A0767 8D9500FFFFFF lea edx, [ebp+$FFFFFF00]

* Reference to control TForm7.tIceLock1 : tIceLock
|
004A076D 8B83D0020000 mov eax, [ebx+$02D0]

|
004A0773 E828BCFEFF call 0048C3A0
004A0778 8D85F0FEFFFF lea eax, [ebp+$FFFFFEF0]

* Reference to control TForm7.tIceLock1 : tIceLock
|
004A077E 8BB3D0020000 mov esi, [ebx+$02D0]

* Reference to field tIceLock.OFFS_0024
|
004A0784 8D5624 lea edx, [esi+$24]

* Reference to: system.@LStrFromString(String;ShortString);
| or: system.@WStrFromString(WideString;ShortString);
|
004A0787 E8BC38F6FF call 00404048
004A078C 8B85F0FEFFFF mov eax, [ebp+$FFFFFEF0]
004A0792 8D95F4FEFFFF lea edx, [ebp+$FFFFFEF4]

* Reference to: sysutils.Trim(System.AnsiString):System.AnsiString;
|
004A0798 E8AF81F6FF call 0040894C
004A079D 8B95F4FEFFFF mov edx, [ebp+$FFFFFEF4]
004A07A3 8D8500FFFFFF lea eax, [ebp+$FFFFFF00]
004A07A9 B9FF000000 mov ecx, $000000FF

* Reference to: system.@LStrToString;
|
004A07AE E8CD38F6FF call 00404080
004A07B3 8D9500FFFFFF lea edx, [ebp+$FFFFFF00]
004A07B9 8BC6 mov eax, esi

|
004A07BB E8E0BBFEFF call 0048C3A0
004A07C0 8D95E8FEFFFF lea edx, [ebp+$FFFFFEE8]

* Reference to control TForm7.Edit1 : TEdit
|
004A07C6 8B83DC020000 mov eax, [ebx+$02DC]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
004A07CC E80BDEF8FF call 0042E5DC
004A07D1 8B95E8FEFFFF mov edx, [ebp+$FFFFFEE8]
004A07D7 8D8DECFEFFFF lea ecx, [ebp+$FFFFFEEC]

* Reference to control TForm7.StringCrypt2000X1 : TStringCrypt2000X
|
004A07DD 8B83F0020000 mov eax, [ebx+$02F0]

|
004A07E3 E8B0CFFEFF call 0048D798
004A07E8 8B85ECFEFFFF mov eax, [ebp+$FFFFFEEC]
004A07EE 50 push eax
004A07EF 8D95E0FEFFFF lea edx, [ebp+$FFFFFEE0]

* Reference to control TForm7.tIceLock1 : tIceLock
|
004A07F5 8B83D0020000 mov eax, [ebx+$02D0]

* Reference to field tIceLock.OFFS_0224
|
004A07FB 8B8024020000 mov eax, [eax+$0224]
004A0801 056D010000 add eax, +$0000016D

* Reference to: sysutils.IntToStr(System.Integer):System.AnsiString;overload;
|
004A0806 E8F582F6FF call 00408B00
-->>计算注册码
004A080B 8B95E0FEFFFF mov edx, [ebp+$FFFFFEE0]
-->>注册码进[EDX]
004A0811 8D8DE4FEFFFF lea ecx, [ebp+$FFFFFEE4]

* Reference to control TForm7.StringCrypt2000X1 : TStringCrypt2000X
|
004A0817 8B83F0020000 mov eax, [ebx+$02F0]

|
004A081D E876CFFEFF call 0048D798
004A0822 8B95E4FEFFFF mov edx, [ebp+$FFFFFEE4]
004A0828 58 pop eax
* Reference to: system.@LStrCmp;
|
004A0829 E88639F6FF call 004041B4
004A082E 0F859B000000 jnz 004A08CF
-->>字符串比较，转移则FAILURE
不转移注册成功！！！！
* Reference to control TForm7.DiskInfo2000X1 : TDiskInfo2000X
|
004A0834 8B83EC020000 mov eax, [ebx+$02EC]

* Reference to field TDiskInfo2000X.OFFS_0044
|
004A083A 8B5044 mov edx, [eax+$44]
004A083D 8D85DCFEFFFF lea eax, [ebp+$FFFFFEDC]
004A0843 B934094A00 mov ecx, $004A0934

* Reference to: system.@LStrCat3;
|
004A0848 E8A338F6FF call 004040F0
004A084D 8B95DCFEFFFF mov edx, [ebp+$FFFFFEDC]
004A0853 8D8500FFFFFF lea eax, [ebp+$FFFFFF00]
004A0859 B9FF000000 mov ecx, $000000FF

* Reference to: system.@LStrToString;
|
004A085E E81D38F6FF call 00404080
004A0863 8D9500FFFFFF lea edx, [ebp+$FFFFFF00]

* Reference to control TForm7.tIceLock1 : tIceLock
|
004A0869 8B83D0020000 mov eax, [ebx+$02D0]

|
004A086F E82CBBFEFF call 0048C3A0

* Possible String Reference to: 'Register ok!'
|
004A0874 B840094A00 mov eax, $004A0940

* Reference to: dialogs.ShowMessage(System.AnsiString);
|
004A0879 E8BA16FBFF call 00451F38

|
004A087E E885FDFFFF call 004A0608

* Reference to Form7
|
004A0883 A1F84C4B00 mov eax, dword ptr [$4B4CF8]

* Reference to field Form7.OFFS_02D4
|
004A0888 8B80D4020000 mov eax, [eax+$02D4]

* Possible String Reference to: 'registed!'
|
004A088E BA58094A00 mov edx, $004A0958

* Reference to: controls.TControl.SetText(TControl;System.String);
|
004A0893 E874DDF8FF call 0042E60C
004A0898 33D2 xor edx, edx

* Reference to control TForm7.SpeedButton1 : TSpeedButton
|
004A089A 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: controls.TControl.SetVisible(TControl;System.Boolean);
|
004A08A0 E84FDCF8FF call 0042E4F4
004A08A5 33D2 xor edx, edx

* Reference to control TForm7.Edit1 : TEdit
|
004A08A7 8B83DC020000 mov eax, [ebx+$02DC]

* Reference to: controls.TControl.SetVisible(TControl;System.Boolean);
|
004A08AD E842DCF8FF call 0042E4F4
004A08B2 33D2 xor edx, edx

* Reference to control TForm7.Label3 : TLabel
|
004A08B4 8B83D8020000 mov eax, [ebx+$02D8]

* Reference to: controls.TControl.SetVisible(TControl;System.Boolean);
|
004A08BA E835DCF8FF call 0042E4F4

* Possible String Reference to: 'registed'
|
004A08BF BA6C094A00 mov edx, $004A096C

* Reference to control TForm7.Label2 : TLabel
|
004A08C4 8B83E0020000 mov eax, [ebx+$02E0]

* Reference to: controls.TControl.SetText(TControl;System.String);
|
004A08CA E83DDDF8FF call 0042E60C
004A08CF 33C0 xor eax, eax
004A08D1 5A pop edx
004A08D2 59 pop ecx
004A08D3 59 pop ecx
004A08D4 648910 mov fs:[eax], edx

****** FINALLY
|
* Possible String Reference to: '^[嬪]?
|
004A08D7 6825094A00 push $004A0925
004A08DC 8D85DCFEFFFF lea eax, [ebp+$FFFFFEDC]
004A08E2 BA03000000 mov edx, $00000003

* Reference to: system.@LStrArrayClr;
|
004A08E7 E85C35F6FF call 00403E48
004A08EC 8D85E8FEFFFF lea eax, [ebp+$FFFFFEE8]

* Reference to: system.@LStrClr(String);
|
004A08F2 E82D35F6FF call 00403E24
004A08F7 8D85ECFEFFFF lea eax, [ebp+$FFFFFEEC]
004A08FD BA03000000 mov edx, $00000003

* Reference to: system.@LStrArrayClr;
|
004A0902 E84135F6FF call 00403E48
004A0907 8D85F8FEFFFF lea eax, [ebp+$FFFFFEF8]

* Reference to: system.@LStrClr(String);
|
004A090D E81235F6FF call 00403E24
004A0912 8D85FCFEFFFF lea eax, [ebp+$FFFFFEFC]

* Reference to: system.@LStrClr(String);
|
004A0918 E80735F6FF call 00403E24
004A091D C3 ret

004A091E E9152FF6FF jmp 00403838
004A0923 EBB7 jmp 004A08DC

****** END
|
004A0925 5E pop esi
004A0926 5B pop ebx
004A0927 8BE5 mov esp, ebp
004A0929 5D pop ebp
004A092A C3 ret

}
end ;
因此，在TRW2000 中下BPX 4A06DC 后，F5返回IPMARMOR,在注册窗口输入
用户名“CRACK123"及注册码"123123"后点击“注册”钮，立即被
TRW2000拦截到IPMARMOR领空，跟踪到4A0811处，用D EDX 显示注册码为
“1903395948”，
故：用户名 CRACK123
注册码 1903395948

若将4A082E处JNZ NEAR 4A08CF 改为NOP（6个），则成为任意注册版！！

请勿见笑，多提意见！！
〈END>


商务奇兵2.0

标 题:破解过程-----请多多指教 (2千字)
发信人:alang
时 间:2000-12-31 7:31:21
详细信息:
[商务奇兵]破解过程

软件名： 商务奇兵
软件版本： 2.0
软件大小： 971KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.worldfax.net/
软件简介： 软件将您的进出口广告信息在一小时内同时自动刊登到世界知名
的3000多个从事国际贸易的电子公告版和300个新闻组上。可以无限次发布，
无需提前在各公告版注册，具备刊登情况统计。电子公告版是使用最频繁也是
信息沟通最快捷和最有效的一种方案。如果有客户在找寻某个项目和服务而正
是你所能提供的，而其中有某个客户在电子公告版看到你发布的消息，那么你
就抓到了机会。

空中飘着鹅毛大雪,(只有北方下这么大的雪)在雪中深吸两口凉气,倍感凉爽清
新.脚下踩着厚厚的雪发出咯吱咯吱的声音,觉得那样亲切,仿佛世界凝固啦!
...啪!..谁拿雪球打我!..对不起!
好久没见到这样的大雪啦,...是!马上开工.
好大的雪呀!....别打.

其实这个软件破解很简单，简单的不敢相信,这里只做学习交流之用，为了国
产软件的发展，请各位大虾破费注册。

所需工具：w32dsm 、aspack脱壳工具、编辑器
1。[商务奇兵]是中文软件，压缩之后在w32dsm早不到我们所需要的东西。
所以先对软件脱壳，过程略。
2。打开[商务奇兵]注册，随便输入姓名和注册码，肯定是错误的，点击确定，
弹出提示框，记住提示内容invalid key...。
3。打开w32dsm装入[商务奇兵]查找错误提示invalid key..
4.哇噻!...找到了耶!!!

:004C3B6C B9903D4C00 mov ecx, 004C3D90
:004C3B71 5A pop edx
:004C3B72 E84DFDFFFF call 004C38C4
:004C3B77 84C0 test al, al
:004C3B79 0F8487010000 je 004C3D06 //修改处
--------------------------------------------------------------------------------------------------------------------------
略：
--------------------------------------------------------------------------------------------------------------------------
* Possible StringData Ref from Code Obj ->"Thanks for registered"//出钱就微笑!
|
:004C3CE9 B8403E4C00 mov eax, 004C3E40
:004C3CEE E87D14F9FF call 00455170
:004C3CF3 C783E002000001000000 mov dword ptr [ebx+000002E0], 00000001
:004C3CFD 8BC3 mov eax, ebx
:004C3CFF E84082F8FF call 0044BF44
:004C3D04 EB0A jmp 004C3D10

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C3B79(C)
|

* Possible StringData Ref from Code Obj ->"Invalid key. Please re enter"//错误提示!*
|
:004C3D06 B8603E4C00 mov eax, 004C3E60
:004C3D0B E86014F9FF call 00455170

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
在错误提示处向上走,看到004c3b79(c)啦吧.
去吧!在004c3b79处进行修改,别说不会修改.
ok
退出,进入[商务奇兵]注册时随便输入.爽!!

《阿郎居》
langlirong@163.net
http://alang.shangdu.net

2000年12月25日


视窗锁王ver4.8

 标 题:破解视窗锁王ver4.8的一点提示 (1千字)
发信人:玉川
时 间:2001-7-8 0:07:47
详细信息:
破解视窗锁王ver4.8的一点提示

上边我的暴力破解不完整。程序运行后只能自动隐藏驱动器，而
不能隐藏目录。现我发现如要完美破解它，有如下几点提示，让我们一起来搞定它：

1。该程序注册码的计算比较代码在文件regconfig.exe中。
我已找到了软件序列号的计算在smith.vxd中。我还未找到注册
码的计算过程，根据我跟踪的结果初步判定，它在regconfig.exe中。regconfig.exe是通过smith.vxd的dos中断调入内存运行。

2。:00404D47 6A01 push 00000001
:00404D49 8B0D103E4200 mov ecx, dword ptr [00423E10]
:00404D4F 51 push ecx

* Reference To: KERNEL32.DeviceIoControl, Ord:0000h
|
:00404D50 FF1578A14100 Call dword ptr [0041A178] <--下bpx
:00404D56 6A00 push 00000000
:00404D58 6A00 push 00000000
:00404D5A 6A00 push 00000000
:00404D5C 6A00 push 00000000
:00404D5E 68F0000000 push 000000F0
:00404D63 68883E4200 push 00423E88
:00404D68 6A02 push 00000002
:00404D6A 8B15103E4200 mov edx, dword ptr [00423E10]
:00404D70 52 push edx

* Reference To: KERNEL32.DeviceIoControl, Ord:0000h
|
:00404D71 FF1578A14100 Call dword ptr [0041A178]
:00404D77 8B45D0 mov eax, dword ptr [ebp-30]

在404d50处下bpx.进入call.下断点:bpx call ORD_0001,进入该call.进入后可要

小心了，凡是遇上call和int,最好按F8键。首先进入vmm,而后vwin32,再次便来到
了smith.vxd.哈哈，这时候你会发现许多有趣的东西了。
好啦，让我们一起来搞定这个坏东西！看谁先搞出注册码来.
一定要用SICE,记住！

标 题:要暴破视窗锁王ver4.8原来如此简单，过去从注册入手还真的走了不少弯路。其实根本 (1千字)
发信人:玉川
时 间:2001-7-8 19:42:13
详细信息:

要暴破视窗锁王ver4.8原来如此简单，过去从注册入手还真的走了不少弯路。其实根本
不用管它，就从0注册开始稍稍改动一下便搞定了。

视窗锁王ver4.8的完美破解
第一步：

用tNOPeunc.exe脱掉LockSmith.exe的壳。
用winhex打开脱壳后的LockSmith.exe,查找TRW和NUMEGA SOFTICE,把这些字符串改名。
第二步:

用W32Dasm打开脱壳后的locksmith.exe.

一：

:0040444D 6802000080 push 80000002

* Reference To: ADVAPI32.RegOpenKeyExA, Ord:0000h
|
:00404452 FF1528A04100 Call dword ptr [0041A028]
:00404458 85C0 test eax, eax
:0040445A 7414 je 00404470 <--je改为jmp,既74改为eb
:0040445C 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"请在本程序运行后按热键进入系统注册"
|
:0040445E 68A01B4200 push 00421BA0

* Possible StringData Ref from Code Obj ->" 这是未注册版本，用户可以按下Ctrl+Alt+Del发"
->"现本程序，并且用结束任务来破坏它对您硬盘的管理"
|
:00404463 68C41B4200 push 00421BC4

二。

:0040460C EB0A jmp 00404618

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404539(C)
|
:0040460E C785E4FEFFFF01000000 mov dword ptr [ebp+FFFFFEE4], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040460C(U)
|
:00404618 EB0A jmp 00404624

从40460c处改到404618，既：
查找:eb0ac785e4feffff01000000
改为:e8ff09000083ec0890909090

这样改后，在注册中以0进行注册。哈哈，改后，同注册版没有区别了。
我还是想找出它的注册码!


视窗锁王ver4.8

 标 题:“美萍”来看看，视窗锁王ver4.8彻底完蛋了。破解原来如此简单。只改两字节.哈哈哈....... (4千字)
发信人:玉川
时 间:2001-7-10 18:11:22
详细信息:
萍”来看看，视窗锁王ver4.8彻底完蛋了。破解原来如此简单。只改两字节.哈哈哈.......

用w32dasm打开discal.vxd,找到如下代码:
:000001A0 83EC10 sub esp, 00000010
:000001A3 56 push esi
:000001A4 33F6 xor esi, esi
:000001A6 56 push esi
:000001A7 6A02 push 00000002
:000001A9 893500000000 mov dword ptr [00000000], esi
:000001AF 893500000000 mov dword ptr [00000000], esi
:000001B5 E862090000 call 00000B1C
:000001BA 85C0 test eax, eax
:000001BC 0F85F5000000 jne 000002B7
:000001C2 8D442404 lea eax, dword ptr [esp+04]
:000001C6 50 push eax
:000001C7 6800000000 push 00000000
:000001CC 6802000080 push 80000002
:000001D1 E83E090000 call 00000B14
:000001D6 83C40C add esp, 0000000C
:000001D9 85C0 test eax, eax
:000001DB 0F85D6000000 jne 000002B7
:000001E1 8B442404 mov eax, dword ptr [esp+04]
:000001E5 8D4C2410 lea ecx, dword ptr [esp+10]
:000001E9 8D542408 lea edx, dword ptr [esp+08]
:000001ED 51 push ecx
:000001EE 52 push edx
:000001EF 56 push esi
:000001F0 56 push esi
:000001F1 6800000000 push 00000000
:000001F6 50 push eax
:000001F7 E810090000 call 00000B0C
:000001FC 83C418 add esp, 00000018
:000001FF 85C0 test eax, eax
:00000201 0F85A3000000 jne 000002AA
:00000207 8B442408 mov eax, dword ptr [esp+08]
:0000020B 8D4C2410 lea ecx, dword ptr [esp+10]
:0000020F 8D54240C lea edx, dword ptr [esp+0C]
:00000213 3578EFCDAB xor eax, ABCDEF78
:00000218 51 push ecx
:00000219 52 push edx
:0000021A 89442410 mov dword ptr [esp+10], eax
:0000021E 8B44240C mov eax, dword ptr [esp+0C]
:00000222 56 push esi
:00000223 56 push esi
:00000224 6800000000 push 00000000
:00000229 50 push eax
:0000022A E8DD080000 call 00000B0C
:0000022F 83C418 add esp, 00000018
:00000232 85C0 test eax, eax
:00000234 7574 jne 000002AA
:00000236 8B4C240C mov ecx, dword ptr [esp+0C]
:0000023A 33D2 xor edx, edx
:0000023C 81F1780AE305 xor ecx, 05E30A78
:00000242 BEDF150000 mov esi, 000015DF
:00000247 8BC1 mov eax, ecx
:00000249 F7F6 div esi
:0000024B BE56000000 mov esi, 00000056
:00000250 81C278563412 add edx, 12345678
:00000256 23CA and ecx, edx
:00000258 33D2 xor edx, edx
:0000025A 8BC1 mov eax, ecx
:0000025C F7F6 div esi
:0000025E 8BC1 mov eax, ecx
:00000260 8BF2 mov esi, edx
:00000262 33D2 xor edx, edx
:00000264 03F1 add esi, ecx
:00000266 B9BB230000 mov ecx, 000023BB
:0000026B F7F1 div ecx
:0000026D 8B442408 mov eax, dword ptr [esp+08]
:00000271 81C2AF010000 add edx, 000001AF
:00000277 33F2 xor esi, edx
:00000279 81EE05270000 sub esi, 00002705
:0000027F 3BC6 cmp eax, esi
:00000281 8974240C mov dword ptr [esp+0C], esi
:00000285 7523 jne 000002AA <--nop掉
:00000287 8B542404 mov edx, dword ptr [esp+04]
:0000028B C7050000000001000000 mov dword ptr [00000000], 00000001
:00000295 52 push edx
:00000296 E869080000 call 00000B04
:0000029B 83C404 add esp, 00000004
:0000029E E89D000000 call 00000340
:000002A3 5E pop esi
:000002A4 83C410 add esp, 00000010
:000002A7 C20800 ret 0008

只要把00000285行nop掉，全搞定了。既7523改为9090既可。
现在注册码可任意输入了.不过，改该文件前，重起windows,按F8键，单步装载，不让discal.vxd装入.

说明:000001bc和000001d1两处是查找系统中是否装有SICE和TRW.

第二：

在smith.vxd中还有防SICE和TRW的暗桩，如：
:00002761 55 push ebp
:00002762 8BEC mov ebp, esp
:00002764 83EC24 sub esp, 00000024
:00002767 8B450C mov eax, dword ptr [ebp+0C]
:0000276A 56 push esi
:0000276B 8BF1 mov esi, ecx
:0000276D C745F84F000000 mov [ebp-08], 0000004F
:00002774 83662000 and dword ptr [esi+20], 00000000
:00002778 894624 mov dword ptr [esi+24], eax
:0000277B 8B4508 mov eax, dword ptr [ebp+08]
:0000277E C70600000000 mov dword ptr [esi], 00000000
:00002784 89461C mov dword ptr [esi+1C], eax
:00002787 8D45DC lea eax, dword ptr [ebp-24]
:0000278A 50 push eax
:0000278B 6A41 push 00000041
:0000278D E84A100000 call 000037DC
:00002792 817DF886F30000 cmp dword ptr [ebp-08], 0000F386 <----此处防SICE
:00002799 750F jne 000027AA
:0000279B 6A01 push 00000001
:0000279D E8F20F0000 call 00003794
:000027A2 50 push eax
:000027A3 6A00 push 00000000
:000027A5 E8B6100000 call 00003860
:000027AA 8BC6 mov eax, esi
:000027AC 5E pop esi
:000027AD C9 leave
:000027AE C20800 ret 0008
但是这样一改，仍然还有防SICE和TRW的代码，有兴趣的朋友可继续查找。

当然，如你系统中未装载SICE和TRW,则不需修改以上防SICE和TRW处的代码.
作者也真是的，如你购买了正确的注册码，系统中仍有SICE的话，仍不会注册成功。用心险恶!!!
有兴趣的朋友，可根据以上代码和locksmith.exe中的一段代码写出它的注册机


太阳镜++

标 题:暴力破解太阳镜++ (607字)
发信人:幻影2001
时 间:2001-4-9 16:36:16
详细信息:
先备份原来的文件
运行提示为“这是〈太阳镜＋＋〉的未注册版本!”

1、用FI sunglass.exe得出为UPX 1.0加的壳
2、用PDUMP32 V1.6脱壳
3、用W32DASM反汇编
4、用串式参考找到“这是《太阳镜++》的未注册版本！”双击
找到如下内容：

004B1003 MOV ECX， 004B10FC
004B1008 MOV EAX， DWORD PTR [004BEA3C]
004B100D MOV EAX， DWORD PTR [EAX]
004B100F CALL 004324D4

向上查找可以跳过此段的地方

004B0FE3 CMP DWORD PTR [EAX+0C]，00000000
004B0FE7 JNE 004B1014 =〉此处刚好跳过去

将JNE 7530 改为EB30

测试成功，所有限制解除

嘻嘻……我第一次用W32DASM有什么不足的地方望指正


天网防火墙个人版2.0(beta)

标 题:天网防火墙个人版2.0(beta)的破解!!! (20千字)
发信人:TAE!
时 间:2001-1-26 22:21:47
详细信息:
大家最近是不是冬眠了呀,好像很少有人写教程了,唉!就让小弟辛苦一下吧!希望大家支持!
BTW:谁能够写一篇 Grduw3.13(其它版本也行)的破解教程呀?我一直没能将它破掉,KeyFile保护的.

目标软件:天网防火墙个人版2.0(beta)
保护方式:序列号
破解方法:暴力破解
破解人:TAE! (初学者)
说明:此软件可以免费在其网站获得注册码,但这次为了练习一下,还是将其解掉吧,毕竟对我有百利而无一害.

先运行一下,发现启动时让你输入注册名,注册码.
按取消后,正常运行,没有功能限制.
首先,试着用 TRW 找出它的注册码,但由于本人功力太弱,没能破解掉.
所以就想想别的方法咯,用W32dasm反汇编它!选择 String data references(字串数据参考),找啊,找啊...猜我找到了什么?
* Referenced by a CALL at Address:
|:00403CD4
|
:00405F1C 55 push ebp
:00405F1D 8BEC mov ebp, esp
:00405F1F 83C4B4 add esp, FFFFFFB4
:00405F22 53 push ebx
:00405F23 56 push esi
:00405F24 57 push edi
:00405F25 8BD8 mov ebx, eax
:00405F27 8D75B4 lea esi, dword ptr [ebp-4C]
:00405F2A B8580A4C00 mov eax, 004C0A58
:00405F2F E80C8B0900 call 0049EA40
:00405F34 66C746100800 mov [esi+10], 0008
:00405F3A 33D2 xor edx, edx
:00405F3C 33C9 xor ecx, ecx
:00405F3E 8955FC mov dword ptr [ebp-04], edx
:00405F41 BA2DFD4B00 mov edx, 004BFD2D
:00405F46 FF461C inc [esi+1C]
:00405F49 8D45EC lea eax, dword ptr [ebp-14]
:00405F4C 66C746101400 mov [esi+10], 0014
:00405F52 66C746102000 mov [esi+10], 0020
:00405F58 894DF8 mov dword ptr [ebp-08], ecx
:00405F5B FF461C inc [esi+1C]
:00405F5E 66C746101400 mov [esi+10], 0014
:00405F64 66C746102C00 mov [esi+10], 002C
:00405F6A E8F5680B00 call 004BC864
:00405F6F FF461C inc [esi+1C]
:00405F72 8D55E8 lea edx, dword ptr [ebp-18]
:00405F75 8B08 mov ecx, dword ptr [eax]
:00405F77 33C0 xor eax, eax
:00405F79 51 push ecx
:00405F7A 8945E8 mov dword ptr [ebp-18], eax
:00405F7D 52 push edx

* Possible StringData Ref from Data Obj ->"UserName"*********
|
:00405F7E BA24FD4B00 mov edx, 004BFD24
:00405F83 FF461C inc [esi+1C]
:00405F86 8D45F0 lea eax, dword ptr [ebp-10]
:00405F89 E8D6680B00 call 004BC864
:00405F8E FF461C inc [esi+1C]

* Possible StringData Ref from Data Obj ->"Register"*********
|
:00405F91 BA1BFD4B00 mov edx, 004BFD1B
:00405F96 8B08 mov ecx, dword ptr [eax]
:00405F98 8D45F4 lea eax, dword ptr [ebp-0C]
:00405F9B 51 push ecx
:00405F9C E8C3680B00 call 004BC864
:00405FA1 FF461C inc [esi+1C]
:00405FA4 8B10 mov edx, dword ptr [eax]
:00405FA6 8B8300030000 mov eax, dword ptr [ebx+00000300]
:00405FAC 59 pop ecx
:00405FAD 8B38 mov edi, dword ptr [eax]
:00405FAF FF17 call dword ptr [edi]
:00405FB1 8D55E8 lea edx, dword ptr [ebp-18]
:00405FB4 8D45FC lea eax, dword ptr [ebp-04]
:00405FB7 E8F4690B00 call 004BC9B0
:00405FBC FF4E1C dec [esi+1C]
:00405FBF 8D45E8 lea eax, dword ptr [ebp-18]
:00405FC2 BA02000000 mov edx, 00000002
:00405FC7 E8B4690B00 call 004BC980
:00405FCC FF4E1C dec [esi+1C]
:00405FCF 8D45EC lea eax, dword ptr [ebp-14]
:00405FD2 BA02000000 mov edx, 00000002
:00405FD7 E8A4690B00 call 004BC980
:00405FDC FF4E1C dec [esi+1C]
:00405FDF 8D45F0 lea eax, dword ptr [ebp-10]
:00405FE2 BA02000000 mov edx, 00000002
:00405FE7 E894690B00 call 004BC980
:00405FEC FF4E1C dec [esi+1C]
:00405FEF 8D45F4 lea eax, dword ptr [ebp-0C]
:00405FF2 BA02000000 mov edx, 00000002
:00405FF7 E884690B00 call 004BC980
:00405FFC 66C746103800 mov [esi+10], 0038
:00406002 BA43FD4B00 mov edx, 004BFD43
:00406007 8D45DC lea eax, dword ptr [ebp-24]
:0040600A E855680B00 call 004BC864
:0040600F FF461C inc [esi+1C]
:00406012 8D55D8 lea edx, dword ptr [ebp-28]
:00406015 8B08 mov ecx, dword ptr [eax]
:00406017 33C0 xor eax, eax
:00406019 51 push ecx
:0040601A 8945D8 mov dword ptr [ebp-28], eax
:0040601D 52 push edx

* Possible StringData Ref from Data Obj ->"RegisterKey"*********
|
:0040601E BA37FD4B00 mov edx, 004BFD37
:00406023 FF461C inc [esi+1C]
:00406026 8D45E0 lea eax, dword ptr [ebp-20]
:00406029 E836680B00 call 004BC864
:0040602E FF461C inc [esi+1C]

* Possible StringData Ref from Data Obj ->"Register"*********
|
:00406031 BA2EFD4B00 mov edx, 004BFD2E
:00406036 8B08 mov ecx, dword ptr [eax]
:00406038 8D45E4 lea eax, dword ptr [ebp-1C]
:0040603B 51 push ecx
:0040603C E823680B00 call 004BC864
:00406041 FF461C inc [esi+1C]
:00406044 8B10 mov edx, dword ptr [eax]
:00406046 8B8300030000 mov eax, dword ptr [ebx+00000300]
:0040604C 59 pop ecx
:0040604D 8B38 mov edi, dword ptr [eax]
:0040604F FF17 call dword ptr [edi]
:00406051 8D55D8 lea edx, dword ptr [ebp-28]
:00406054 8D45F8 lea eax, dword ptr [ebp-08]
:00406057 E854690B00 call 004BC9B0
:0040605C FF4E1C dec [esi+1C]
:0040605F 8D45D8 lea eax, dword ptr [ebp-28]
:00406062 BA02000000 mov edx, 00000002
:00406067 E814690B00 call 004BC980
:0040606C FF4E1C dec [esi+1C]
:0040606F 8D45DC lea eax, dword ptr [ebp-24]
:00406072 BA02000000 mov edx, 00000002
:00406077 E804690B00 call 004BC980
:0040607C FF4E1C dec [esi+1C]
:0040607F 8D45E0 lea eax, dword ptr [ebp-20]
:00406082 BA02000000 mov edx, 00000002
:00406087 E8F4680B00 call 004BC980
:0040608C FF4E1C dec [esi+1C]
:0040608F 8D45E4 lea eax, dword ptr [ebp-1C]
:00406092 BA02000000 mov edx, 00000002
:00406097 E8E4680B00 call 004BC980
:0040609C 8B4DF8 mov ecx, dword ptr [ebp-08]
:0040609F 8B55FC mov edx, dword ptr [ebp-04]
:004060A2 8BC3 mov eax, ebx
:004060A4 E85FFCFFFF call 00405D08
:004060A9 888305030000 mov byte ptr [ebx+00000305], al
:004060AF BA02000000 mov edx, 00000002
:004060B4 8A8305030000 mov al, byte ptr [ebx+00000305]
:004060BA 50 push eax
:004060BB 8D45F8 lea eax, dword ptr [ebp-08]
:004060BE FF4E1C dec [esi+1C]
:004060C1 E8BA680B00 call 004BC980
:004060C6 FF4E1C dec [esi+1C]
:004060C9 8D45FC lea eax, dword ptr [ebp-04]
:004060CC BA02000000 mov edx, 00000002
:004060D1 E8AA680B00 call 004BC980
:004060D6 58 pop eax
:004060D7 8B16 mov edx, dword ptr [esi]
:004060D9 64891500000000 mov dword ptr fs:[00000000], edx
:004060E0 5F pop edi
:004060E1 5E pop esi
:004060E2 5B pop ebx
:004060E3 8BE5 mov esp, ebp
:004060E5 5D pop ebp
:004060E6 C3 ret

喔~,看到胜利之神在向我招手了!
这分明就是文件中存放注册信息的标志字符串(可以这么叫吗?)
什么,听不懂?举个例子吧!
有的软件将注册信息放在一个文件里,通常是<软件名>.ini 或<软件名>.dat 中,如:WinZip Self-Extract 2.2.
你注册后,那么在天网防火墙的 .ini 文件,也就是配置文件中就应该有以下几项:
[register]
username=你的注册名
registerkey=您的注册码
想想看,所以软件每次启动的时候都会读取.ini中有没有这几项,若有就检查注册名和你的注册码是不是匹配;
若没有发现这几项,就直接判断您还没有注册,就跳出提示框啦!
所以我们可以从这里入手,向上看发现它是 00403CD4 Call 过来的.
于是我来到了这里:
果然是将注册信息放在了 SNFW.INI 文件中!

* Possible StringData Ref from Data Obj ->"SNFW.INI"
|
:00403C50 BA2BFB4B00 mov edx, 004BFB2B
:00403C55 8D45F0 lea eax, dword ptr [ebp-10]
:00403C58 E8078C0B00 call 004BC864
:00403C5D FF45D4 inc [ebp-2C]
:00403C60 33C0 xor eax, eax
:00403C62 8945EC mov dword ptr [ebp-14], eax
:00403C65 8D55F0 lea edx, dword ptr [ebp-10]
:00403C68 FF45D4 inc [ebp-2C]
:00403C6B 8D4DEC lea ecx, dword ptr [ebp-14]
:00403C6E 58 pop eax
:00403C6F E8648D0B00 call 004BC9D8
:00403C74 8D4DEC lea ecx, dword ptr [ebp-14]
:00403C77 8B09 mov ecx, dword ptr [ecx]
:00403C79 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"胤C"
|
:00403C7B A110B14300 mov eax, dword ptr [0043B110]
:00403C80 E83B010000 call 00403DC0
:00403C85 898300030000 mov dword ptr [ebx+00000300], eax
:00403C8B FF4DD4 dec [ebp-2C]
:00403C8E 8D45EC lea eax, dword ptr [ebp-14]
:00403C91 BA02000000 mov edx, 00000002
:00403C96 E8E58C0B00 call 004BC980
:00403C9B FF4DD4 dec [ebp-2C]
:00403C9E 8D45F0 lea eax, dword ptr [ebp-10]
:00403CA1 BA02000000 mov edx, 00000002
:00403CA6 E8D58C0B00 call 004BC980
:00403CAB FF4DD4 dec [ebp-2C]
:00403CAE 8D45F4 lea eax, dword ptr [ebp-0C]
:00403CB1 BA02000000 mov edx, 00000002
:00403CB6 E8C58C0B00 call 004BC980
:00403CBB FF4DD4 dec [ebp-2C]
:00403CBE 8D45F8 lea eax, dword ptr [ebp-08]
:00403CC1 BA02000000 mov edx, 00000002
:00403CC6 E8B58C0B00 call 004BC980
:00403CCB C6830503000000 mov byte ptr [ebx+00000305], 00
:00403CD2 8BC3 mov eax, ebx
:00403CD4 E843220000 call 00405F1C \<------来到了这儿
:00403CD9 84C0 test al, al - 咦!很眼熟喔.
:00403CDB 7541 jne 00403D1E /
:00403CDD 33C9 xor ecx, ecx
:00403CDF B201 mov dl, 01

* Possible StringData Ref from Data Obj ->"@F"
|
:00403CE1 A1DC304C00 mov eax, dword ptr [004C30DC]
:00403CE6 E8D1700000 call 0040ADBC
:00403CEB 8BF8 mov edi, eax
:00403CED 8BC7 mov eax, edi
:00403CEF 8B10 mov edx, dword ptr [eax]
:00403CF1 FF92D8000000 call dword ptr [edx+000000D8]
:00403CF7 8BF7 mov esi, edi
:00403CF9 8975E4 mov dword ptr [ebp-1C], esi
:00403CFC 85F6 test esi, esi
:00403CFE 741E je 00403D1E
:00403D00 8B06 mov eax, dword ptr [esi]
:00403D02 8945E8 mov dword ptr [ebp-18], eax
:00403D05 66C745C82C00 mov [ebp-38], 002C
:00403D0B BA03000000 mov edx, 00000003
:00403D10 8B45E4 mov eax, dword ptr [ebp-1C]
:00403D13 8B08 mov ecx, dword ptr [eax]
:00403D15 FF51FC call [ecx-04]
:00403D18 66C745C82000 mov [ebp-38], 0020

试着将 :00403CDB jne 00403D1E
改为 :00403CDB je 00403D1E
也就是将 7541
改为 7441
运行一下,嗯!很好,那个讨厌的注册提示框再也不会出现了.

这应该是我的第一篇破解教程,唉!我终于体会到各位大哥的辛苦了,写这东西的确耗时间.我可是用拼音输入法打的喔!
在此,感谢:
看雪,Icebird,Icebird,冰毒,DDxia,ErrorFree,tKC,EGis
带我进入了破解世界.


推箱子1.9

 标 题:老长时间来不了！！！先来点点心 (5千字)
发信人:CrackerABC[BCG]
时 间:2001-5-31 19:00:50
详细信息:
关于蒋刚的推箱子1.9版本的破解

下载地址：http://www.3q1.com/zip/Cargador.zip

首先这个软件的作者在做这个程序的时候加上了对自身程序的CRC校验，所以在破解的时候我开始一直没找到破解点，在我老友gfh的提示下，我知道了破解点，下面是破解的代码（根据前几个版本的破解，只做修改如下，如果还有问题，请喜欢这个游戏的朋友告诉我还有什么限制，谢谢）

修改要点：

<1>去掉要注册和未注册的限制。
<2>去掉文件的自身CRC校验功能。

下面是用w32dsmv8.93反汇编得到的部分关键代码：

<1>去掉要注册和未注册的限制：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004020D6(C)
|
:00402141 8D45E4 lea eax, dword ptr [ebp-1C]
:00402144 8D55E8 lea edx, dword ptr [ebp-18]
:00402147 E8E4AB0600 call 0046CD30
:0040214C 8B55E4 mov edx, dword ptr [ebp-1C]
:0040214F 8B45FC mov eax, dword ptr [ebp-04]
:00402152 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00402158 E853C20300 call 0043E3B0
:0040215D 803DF85E490001 cmp byte ptr [00495EF8], 01 //----->注册标志，1。
:00402164 7544 jne 004021AA//------->修改为：90 nop
90 nop,跳过检验
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004020F1(C)
|
:00402166 33D2 xor edx, edx
:00402168 8B45FC mov eax, dword ptr [ebp-04]
:0040216B 8B80D8020000 mov eax, dword ptr [eax+000002D8]
:00402171 E846C00300 call 0043E1BC
:00402176 B201 mov dl, 01
:00402178 8B45FC mov eax, dword ptr [ebp-04]
:0040217B 8B8000030000 mov eax, dword ptr [eax+00000300]
:00402181 E836C00300 call 0043E1BC

* Possible StringData Ref from Code Obj ->"关于"
|
:00402186 BA18224000 mov edx, 00402218
:0040218B A1F45E4900 mov eax, dword ptr [00495EF4]
:00402190 E81BC20300 call 0043E3B0
:00402195 8B45FC mov eax, dword ptr [ebp-04]
:00402198 8B9000030000 mov edx, dword ptr [eax+00000300]
:0040219E A1F45E4900 mov eax, dword ptr [00495EF4]
:004021A3 E830B00200 call 0042D1D8
:004021A8 EB42 jmp 004021EC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402164(C) //----------------------------------------------------->破解点，往上看看。
|
:004021AA 33D2 xor edx, edx
:004021AC 8B45FC mov eax, dword ptr [ebp-04]
:004021AF 8B8000030000 mov eax, dword ptr [eax+00000300]
:004021B5 E802C00300 call 0043E1BC
:004021BA B201 mov dl, 01
:004021BC 8B45FC mov eax, dword ptr [ebp-04]
:004021BF 8B80D8020000 mov eax, dword ptr [eax+000002D8]
:004021C5 E8F2BF0300 call 0043E1BC

* Possible StringData Ref from Code Obj ->"注册" //---->如果没注册就让你注册，注册了就没限制了！
|
:004021CA BA28224000 mov edx, 00402228
:004021CF A1F45E4900 mov eax, dword ptr [00495EF4]
:004021D4 E8D7C10300 call 0043E3B0
:004021D9 8B45FC mov eax, dword ptr [ebp-04]
:004021DC 8B90F8020000 mov edx, dword ptr [eax+000002F8]
:004021E2 A1F45E4900 mov eax, dword ptr [00495EF4]
:004021E7 E8ECAF0200 call 0042D1D8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

怎么程序不能运行？是不是程序有自身校验的功能，来看看吧。

<2>去掉文件的自身CRC校验功能。

如果只修改了上面就不能运行程序，所以要修改程序的CRC校验地点，查看反汇编的字符串，看到"最经典的游戏——推箱子"，呵呵，看来有问题，因为在程序开始和结束的时候都没有这个提示和语句啊。看看吧。

|:00403B8B(U)
|
:00403BD4 8B55C4 mov edx, dword ptr [ebp-3C]
:00403BD7 F6421220 test [edx+12], 20
:00403BDB 7509 jne 00403BE6
:00403BDD 817DBC00000700 cmp dword ptr [ebp-44], 00070000
:00403BE4 7CA7 jl 00403B8D

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00403B77(C), :00403BDB(C)
|
:00403BE6 8A4DC2 mov cl, byte ptr [ebp-3E]
:00403BE9 03C9 add ecx, ecx
:00403BEB 3A4DC3 cmp cl, byte ptr [ebp-3D]
:00403BEE 7411 je 00403C01 //------------->修改它!7511 jne 00403C01
:00403BF0 A1145B4900 mov eax, dword ptr [00495B14]
:00403BF5 8B00 mov eax, dword ptr [eax]
:00403BF7 E8ECF00200 call 00432CE8
:00403BFC E98A000000 jmp 00403C8B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403BEE(C) //-------->看看去!
|
:00403C01 66C745DC3800 mov [ebp-24], 0038

* Possible StringData Ref from Data Obj ->"最经典的游戏——推箱子"//----->有点怪异!!!
|
:00403C07 BABCE34700 mov edx, 0047E3BC
:00403C0C 8D45F0 lea eax, dword ptr [ebp-10]
:00403C0F E8688C0700 call 0047C87C
:00403C14 FF45E8 inc [ebp-18]
:00403C17 8B10 mov edx, dword ptr [eax]
:00403C19 8B0D145B4900 mov ecx, dword ptr [00495B14]
:00403C1F 8B01 mov eax, dword ptr [ecx]
:00403C21 E80EEA0200 call 00432634
:00403C26 FF4DE8 dec [ebp-18]
:00403C29 8D45F0 lea eax, dword ptr [ebp-10]
:00403C2C BA02000000 mov edx, 00000002
:00403C31 E8BA8C0700 call 0047C8F0
:00403C36 8B0D145B4900 mov ecx, dword ptr [00495B14]
:00403C3C 8B01 mov eax, dword ptr [ecx]
* Reference To: Cargador._Main_Form
|
:00403C3E 8B0D085B4900 mov ecx, dword ptr [00495B08]

通过上面两处的修改，程序就完成了破解，大家看看如何？


推箱子v1.6

 标 题:这个行吗? (2千字)
发信人:DimRacker
时 间:2001-5-14 0:40:57
详细信息:
《推箱子v1.6(230关)》破解方法

由于小生水平较低，文章中难免有错误之处，还请大师指正。谢谢!
我是用“标志位法”破解的，没有一步步的追它的sn。
进入《推箱子》，添入姓名：DimRacker 号码：34343434
ctrl+N进TRW2K/bpx hmemcpy/F5/点“注册”/bd1/按14下F12/F10，到下面
0167:00402731 MOV EAX,[EBP+FFFFFDCC] 停到这儿。
:
之间略过若干行。因为我要找的是它的注册标志位，所以不管它是怎么算的。
一直按F10，(很长，看清楚，有捷径:)直到下面
:
0167:00402CB6 CMP BYTE CARGADOR!@Regist@Registered,00 可疑!d一下，0167:0048A1DC为00，保险起见，F9/bpm 0167:0048A1DC/bd*
0167:00402CBD JNZ NEAR 0040319B 不跳。
经验证，0167:00402CBD若跳转则注册成功。标志位找到了，你可以在程序启动时用它拦住，改为免注册版。不过我不崇尚暴力。:)
继续吧。进入《推箱子》，添入姓名：DimRacker 号码：34343434
ctrl+N进TRW2K/be3/F5/点“注册”/bd3，到下面
0167:00401DBA MOV BYTE CARGADOR!@Regist@Registered,01 先置1。
0167:00401DC1 MOV DWORD [EBP-04],01 停到这儿。
0167:00401DC8 MOV EAX,[EBP-04]
0167:00401DCB MOV AL,[EBP+EAX+FFFFFEC5] 总算出来了。此时AL为注册号的第一位。先别忙着抄号。
0167:00401DD2 MOV EDX,[EBP-04]
0167:00401DD5 CMP AL,[EBP+EDX+FFFFFF2A] 此时[EBP+EDX+FFFFFF2A]为刚输入的注册号的第一位。d一下可知sn有6位：343434
好啦，在0167:00401DCB行打d EBP+EAX+FFFFFEC5，将它和后边5位字符抄下来，这就是正确的注册号。
懒得抄的话可以在0167:00401DD5行打d EBP+EDX+FFFFFF2A，将6位号直接写入到343434的位置上。
0167:00401DDC JZ 00401DF1 相同才跳。
0167:00401DDE MOV BYTE CARGADOR!@Regist@Registered,00 将标志位重置为0。
0167:00401DE5 MOV BYTE CARGADOR!@Regist@ReadReg,00
0167:00401DEC JMP 004020A3 要是到了这儿就没戏了。
0167:00401DF1 INC DWORD [EBP-04]
0167:00401DF4 CMP DWORD [EBP-04],BYTE +07 轮一遍。
0167:00401DF8 JNZ 00401DC8
0167:00401DFA CMP BYTE CARGADOR!@Regist@Registered,00 判断是否注册。
0167:00401E01 JZ NEAR 004020A3 要是到了这儿就没戏了。
0167:00401E07 CMP BYTE CARGADOR!@Regist@ReadReg,00
0167:00401E0E JNZ NEAR 004020A3 要是到了这儿就没戏了。
0167:00401E14 MOV BYTE CARGADOR!@Regist@ReadReg,00
:
OK!搞定。
注：
此程序每次注册均有一个随机的序号，所以你解出的注册号不能用于其它场合。但可以在注册后将C:\WINDOWS\Msimgsiz.cfg copy to 未注册的机子里使之注册。当然也可以写注册机，再不行就……我还是不崇尚暴力。:)
此外，此游戏的关数记录在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下，RegistryNum为打过的关数，RegistrySys为当前的关数。第1关的值：0xFFFFFF39=4294967097

DimRacker
23:57 2001-05-13


推箱子Ver:1.6

标 题:破解《推箱子》Ver:1.6（230关） 注册版 (1千字)
发信人:李海涛
时 间:2001-4-1 13:30:47
详细信息:
破解《推箱子》Ver:1.6（230关） 注册版

【下载地址】
http://www.3q1.com/zip/Cargador.zip

【主 页】
http://www.3q1.com

【说 明】
未注册版本只能玩30关。破它！！！

破解工具：
(1)Trw2000 1.22
(2)UltraEdit-32 v7.10b
(3)WD32ASM8.93超级中文版

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401D4A(C)
|
:00401D1A 8B45F8 mov eax, dword ptr [ebp-08]
:00401D1D 8A8405C1FEFFFF mov al, byte ptr [ebp+eax-0000013F]
:00401D24 8B55F8 mov edx, dword ptr [ebp-08]
:00401D27 3A841526FFFFFF cmp al, byte ptr [ebp+edx-000000DA]
:00401D2E 7413 je 00401D43
:00401D30 C605A8A1480000 mov byte ptr [0048A1A8], 00
改：C605A8A1480001 mov byte ptr [0048A1A8], 01
:00401D37 C60512A3480000 mov byte ptr [0048A312], 00
:00401D3E E9B2020000 jmp 00401FF5

用UltraEdit打开Cargador.exe
找到：C6 05 A8 A1 48 00 00
修改：C6 05 A8 A1 48 00 01
只需修改一个字节，就变成了注册版了！！！

作者：李海涛
Email：lihaitao@xaonline.com

标 题:简单！！主要注意FLAG! (854字)
发信人:THK
时 间:2001-4-1 15:21:48
详细信息:

反汇编后找到“恭喜注册”，看到以48a1a8位判断对象，下bpm 48a1a8
来几次后到这里：
:00401D05 C685C8FEFFFF00 mov byte ptr [ebp+FFFFFEC8], 00
:00401D0C C605A8A1480001 mov byte ptr [0048A1A8], 01
:00401D13 C745F801000000 mov [ebp-08], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401D4A(C)
|
:00401D1A 8B45F8 mov eax, dword ptr [ebp-08]
:00401D1D 8A8405C1FEFFFF mov al, byte ptr [ebp+eax-0000013F] //在此D ebp+eax-13f 可看到注册码（不判断长度）
:00401D24 8B55F8 mov edx, dword ptr [ebp-08]
:00401D27 3A841526FFFFFF cmp al, byte ptr [ebp+edx-000000DA]
:00401D2E 7413 je 00401D43
:00401D30 C605A8A1480000 mov byte ptr [0048A1A8], 00
:00401D37 C60512A3480000 mov byte ptr [0048A312], 00
标 题:推箱子1到230关选关器!!! (153字)
发信人:李海涛
时 间:2001-4-1 14:59:29
详细信息:
REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"RegistrySys"=dword:0000001e
"RegistryNum"=dword:0000001e


网凯公路招投标版

标 题:copyyour第二篇破文（精彩哟，呵呵） (5千字)
发信人:copyyour
时 间:2001-4-3 19:54:22
详细信息:
被宰软件：《网凯公路招投标版》
采用定额：96公路预算定额功能概述：工程量清单投标报价-FIDIC投标报价

下载地址:http://www.buildsky.com/download/网凯公路招投标版.exe

破解使用工具：w32dasm（用的是风飘雪CCG制作的黄金中文版，很好用的哟 ）hiew640reg版

破解等级(莱鸟)

破解过程：昨日小弟发表进入破解界的第一篇破文后，等到众多前辈的鼓励，尤其是看雪大哥将我的第一篇文章贴上精字标签的时候，让小弟感激不尽。我要努力！！！！这是小弟的高呼，昨日晚上得到一位大哥的情报，说某网站软件标价贵得吓人都是上千元的东东（嘿嘿，比winme还贵,去看看是什么软件），当即小弟牵着带有广告条尾巴的蚂蚁前去下载回家，安装好后运行。

当！的一声，TMD弹出一对话框，"没有软件狗或软件版本和软件狗不匹配，现将启动《网凯公路招投标版》学习版，啊啊！！！！！软件狗，我看狗色变，当即想把它删掉，别碰狗，小心它咬你，进入了软件，帮助---关于《网凯公路招投标版》里面也是写的学习版，完了，还是请那位大哥襄助，没事我就来看看你，由于不会用trw2000中的某些函数，小弟只好请出风飘雪（CCG）前不久发布的w32dasm黄金中文版了。

启动w32adsm,选择反汇编----打开文件==指向《网凯公路招投标版》的exe文件，点确定进行反汇编，经过长时间等待，反汇编结束了，这时就点击快截图标的倒数第二个（串式参考 英文是：string data references)弹出一个清单框，里面全是这个exe文件的重要字符，我一下就拉倒最后（我喜欢重最后看）慢慢向上搜索重要字符，慢慢的我看见"没有软件狗或软件版本和软件狗不匹配，现将启动《网凯公路招投标版》学习版"这个字符串，啊，就是它,我双击这个字符来到

* Possible StringData Ref from Data Obj ->"没有软件狗或软件版本与软件狗不匹配，
将启动网?===我来到这里
->"费鞍?"
|
:00415B32 686CFA4E00 push 004EFA6C
:00415B37 E8EFDB0800 call 004A372B
:00415B3C C7868001000001000000 mov dword ptr [esi+00000180], 00000001

这是小弟就顺藤摸瓜，跟着这句话就向上查看，看看到底是什么东西来检查他是否跳出这个对话框的，向上看吧

* Reference To: GDI32.GetDeviceCaps, Ord:0125h
|
:00415AAC 8B3D94904C00 mov edi, dword ptr [004C9094]======================这些地方没发现什么跳转
:00415AB2 6A58 push 00000058
:00415AB4 50 push eax
:00415AB5 FFD7 call edi
:00415AB7 8945EC mov dword ptr [ebp-14], eax
:00415ABA 8B4DD8 mov ecx, dword ptr [ebp-28]
:00415ABD DB45EC fild dword ptr [ebp-14]
:00415AC0 6A5A push 0000005A
:00415AC2 51 push ecx
:00415AC3 DC3D68A54C00 fdivr qword ptr [004CA568]
:00415AC9 D99EC0000000 fstp dword ptr [esi+000000C0]
:00415ACF FFD7 call edi
:00415AD1 8D4DD0 lea ecx, dword ptr [ebp-30]
:00415AD4 8986C4000000 mov dword ptr [esi+000000C4], eax
:00415ADA E8807E0800 call 0049D95F
:00415ADF 8D55B8 lea edx, dword ptr [ebp-48]
:00415AE2 C7057C5A4F001E000000 mov dword ptr [004F5A7C], 0000001E
:00415AEC 89156C5A4F00 mov dword ptr [004F5A6C], edx
:00415AF2 C705785A4F0014000000 mov dword ptr [004F5A78], 00000014
:00415AFC E8BF380600 call 004793C0
:00415B01 8D45B8 lea eax, dword ptr [ebp-48]
:00415B04 8D4DEC lea ecx, dword ptr [ebp-14]
:00415B07 50 push eax
:00415B08 E82F4B0800 call 0049A63C
:00415B0D 8B00 mov eax, dword ptr [eax]======================这些地方没发现什么跳转

* Possible StringData Ref from Data Obj ->"网凯公路2000版"
|
:00415B0F 68A8FA4E00 push 004EFAA8
:00415B14 50 push eax
:00415B15 E839FE0600 call 00485953
:00415B1A 83C408 add esp, 00000008
:00415B1D 8D4DEC lea ecx, dword ptr [ebp-14]
:00415B20 85C0 test eax, eax =====================比较什么我还不懂
:00415B22 0F95C3 setne bl================这个是什么也不懂
:00415B25 E8A44A0800 call 0049A5CE
:00415B2A 84DB test bl, bl
:00415B2C 7418 je 00415B46===============哈哈只有你我最懂了改为jne让你不跳
:00415B2E 6A00 push 00000000
:00415B30 6A00 push 00000000

发现一处je后，小弟就开始拿出hiew640了，装载程序exe后，来到:00415B2C 7418 je 00415B46这个地方，把光标移到7418的4下面，按f3,改4为5，这就是很多大哥们说的74改75之内的东东了，按esc,再按f9保存后退出，呵呵，我要开始再运行了了，老天保佑，我没听到当的一声了，程序直接启动完成，看帮助里面的关于，也变成《网凯公路招投标版》了，试了学习版中禁止的功能，呵呵，全部能用了，破解完成！！！小弟第一次打狗哟。但是不幸，遇见的是一只没脾气的纸狗，比一般的软件都还不如，唉。

该公司的另外一款软件《网凯公路概预算版》也用同样方法破解，而还有一款就不行了（电信版）希望各位大哥指教！！

收拾起工具，挑灯再看看雪教程，明天会更美好！！！

小弟第二次写破文，不对之处，请各位前辈高人指出，小弟不胜感激！！！

copyyour@sina.com

cracked by copyyour

呵呵

2001.4.3


网络吸血鬼3.3

标 题:暴力破解《网络吸血鬼3.3》 (9千字)
发信人:mjing
时 间:2001-3-15 16:36:12
详细信息:
暴力破解《网络吸血鬼3.3》

作者：mjing(菜鸟级)

E-mail:mjing@wx88.net

时间：2001.3.15

工具：soft-ice 4.01,icedump 6.015,ultraedit 8.0,FileMon

下载地址：(某D版光盘)

    保护方式：这个软件采用注册码保护，其将输入的注册码保存到其目录

下的一个名为VAMPIRE.key的文件中，到下次启动时再进行判断。

    分析：基于上面的原因，断点不太好下，尝试用bpx createfilea

断点，但是这个家伙启动时使用createfilea函数次数过多，严重干扰了跟踪，

我花了很长时间逐一查看，居然没有发现有用线索？？？(它倒底是用什么函数

打开文件？？，哪位指点一下)而且用DASM反汇编也不好使，找不到

“VAMPIRE.key”等字符串，简直把我逼到了山穷水尽的地步。还好，借助

FileMon的神威，终于发现它的一个致使弱点，每次它都会删除VAMPIRE.key

文件，即使该文件不存在！

载入Vampire.exe，下断点，bpx deletefilea ,按F5运行，过一会儿，被拦下

后，按一下F11，回到程序的领空中

015F:0048BF58 POP EDX
015F:0048BF59 POP ECX
015F:0048BF5A POP ECX
015F:0048BF5B MOV FS:[EAX],EDX
015F:0048BF5E JMP 0048BF9C
015F:0048BF60 JMP 00403234
015F:0048BF65 MOV EAX,004ADA60
015F:0048BF6A CALL 00403A84
015F:0048BF6F LEA EDX,[EBP-08]
015F:0048BF72 XOR EAX,EAX
015F:0048BF74 CALL 004028CC
015F:0048BF79 MOV EAX,[EBP-08]
015F:0048BF7C LEA ECX,[EBP-04]
015F:0048BF7F MOV EDX,0048BFF8
015F:0048BF84 CALL 00407CE4
015F:0048BF89 MOV EAX,[EBP-04]
015F:0048BF8C CALL 00403EC4
015F:0048BF91 PUSH EAX
015F:0048BF92 CALL KERNEL32!DeleteFileA　　;删除了VAMPIRE.key文件
015F:0048BF97 CALL 0040354C
015F:0048BF9C XOR EAX,EAX
015F:0048BF9E POP EDX
015F:0048BF9F POP ECX
015F:0048BFA0 POP ECX
015F:0048BFA1 MOV FS:[EAX],EDX
015F:0048BFA4 PUSH 0048BFBE
015F:0048BFA9 LEA EAX,[EBP-0C]
015F:0048BFAC MOV EDX,00000003
015F:0048BFB1 CALL 00403AA8
015F:0048BFB6 RET
015F:0048BFB7 JMP 00403430
015F:0048BFBC JMP 0048BFA9
015F:0048BFBE POP EDI
015F:0048BFBF POP ESI
015F:0048BFC0 POP EBX
015F:0048BFC1 MOV ESP,EBP
015F:0048BFC3 POP EBP
015F:0048BFC4 RET
015F:0048BFC5 ADD [EAX],AL
015F:0048BFC7 ADD BH,BH
015F:0048BFC9 INVALID

小心地按F10，返回几个CALL之后，到达如下地盘：

015F:0049AF27 MOV EAX,[004AC96C]
015F:0049AF2C CMP DWORD PTR [EAX],07
015F:0049AF2F JNZ 0049AF49
015F:0049AF31 MOV DL,01
015F:0049AF33 MOV EAX,[EBP-04]
015F:0049AF36 CALL 0049AD30
015F:0049AF3B MOV EAX,[004AC9A8]
015F:0049AF40 MOV EAX,[EAX]
015F:0049AF42 CALL 004316EC
015F:0049AF47 JMP 0049AF5D
015F:0049AF49 MOV EAX,[EBP-04]
015F:0049AF4C MOV BYTE PTR [EAX+00000630],01
015F:0049AF53 XOR EDX,EDX
015F:0049AF55 MOV EAX,[EBP-04]
015F:0049AF58 CALL 0049AD30
015F:0049AF5D CALL 0048BEDC ;停在这里
015F:0049AF62 MOV EAX,[004AC9A0]
015F:0049AF67 CMP DWORD PTR [EAX],00 ---
015F:0049AF6A JNZ 0049AF8D | 这个
015F:0049AF6C MOV EAX,[EBP-04] | 结构
015F:0049AF6F MOV EAX,[EAX+0000050C] | 大大
015F:0049AF75 CALL 0047210C | 可疑
015F:0049AF7A MOV EAX,[EBP-04] |
015F:0049AF7D MOV EAX,[EAX+0000050C] |
015F:0049AF83 CALL 00471C24 |
015F:0049AF88 JMP 0049B00D ---
015F:0049AF8D XOR EDX,EDX
015F:0049AF8F MOV EAX,[EBP-04]
015F:0049AF92 MOV EAX,[EAX+0000035C]
015F:0049AF98 CALL 00421AB8
015F:0049AF9D XOR EDX,EDX
015F:0049AF9F MOV EAX,[EBP-04]
015F:0049AFA2 MOV EAX,[EAX+00000360]
015F:0049AFA8 CALL 00421AB8
015F:0049AFAD XOR EDX,EDX
015F:0049AFAF MOV EAX,[EBP-04]
015F:0049AFB2 MOV EAX,[EAX+00000364]
015F:0049AFB8 CALL 00421AB8
015F:0049AFBD XOR EDX,EDX
015F:0049AFBF MOV EAX,[EBP-04]
015F:0049AFC2 MOV EAX,[EAX+000003B8]

在015F:0049AF6A一行试着下命令:

r fl z ,F5运行，运气不错，瞎猫碰上死耗子，广告窗

居然没有了，抄下机器码，用UEdit一改，就破解了:>

切入015F:0049AF5D CALL 0048BEDC　再跟踪一下，

想找出注册码，但是奇迹再也没有出现，只看见许多可疑

的代码，但实在看不懂其算法，哪位高手指点一下？？

最后，跟踪到如下一段

015F:0048BF14 CALL 00461634
015F:0048BF19 MOV EAX,[EBP-04]
015F:0048BF1C PUSH EAX
015F:0048BF1D LEA EAX,[EBP-08]
015F:0048BF20 PUSH EAX
015F:0048BF21 LEA EAX,[EBP-0C]
015F:0048BF24 MOV ECX,0048BFE4
015F:0048BF29 MOV EDX,[004ADA60]
015F:0048BF2F CALL 00403D4C
015F:0048BF34 MOV EAX,[EBP-0C]
015F:0048BF37 MOV ECX,00000009
015F:0048BF3C MOV EDX,00000001
015F:0048BF41 CALL 00403F04
015F:0048BF46 MOV EDX,[EBP-08]
015F:0048BF49 POP EAX
015F:0048BF4A CALL 00403E10
015F:0048BF4F JZ 0048BF56 ;改为JMP 就没有广告窗了

                                    因此上面的Call有重大

                                    嫌疑，很可能是注册比较

    但看不懂:(

015F:0048BF51 CALL 0040ACF4
015F:0048BF56 XOR EAX,EAX
015F:0048BF58 POP EDX
015F:0048BF59 POP ECX
015F:0048BF5A POP ECX
015F:0048BF5B MOV FS:[EAX],EDX
015F:0048BF5E JMP 0048BF9C
015F:0048BF60 JMP 00403234
015F:0048BF65 MOV EAX,004ADA60
015F:0048BF6A CALL 00403A84
015F:0048BF6F LEA EDX,[EBP-08]
015F:0048BF72 XOR EAX,EAX
015F:0048BF74 CALL 004028CC
015F:0048BF79 MOV EAX,[EBP-08]
015F:0048BF7C LEA ECX,[EBP-04]
015F:0048BF7F MOV EDX,0048BFF8
015F:0048BF84 CALL 00407CE4
015F:0048BF89 MOV EAX,[EBP-04]
015F:0048BF8C CALL 00403EC4
015F:0048BF91 PUSH EAX
015F:0048BF92 CALL KERNEL32!DeleteFileA
015F:0048BF97 CALL 0040354C
015F:0048BF9C XOR EAX,EAX
015F:0048BF9E POP EDX

OK，又算是完成了一篇“破”文，确实很破（谁让我是只菜鸟呢），

不要问我原理，我也不知道。

破解软件运气也很哦，当然，这上建立在一定的经验和功力上的。

原本不打算再写破文了，但是破了的东东不写出来，总好像没完成

一件什么事似的，顺便说一句，上面的方法也可以搞掉新出来的

Net Vampire Pro 4.0b 。我好像只会暴力破解，不过本人非常热爱

和平:)好了，以后有机会再见吧！


文件加密工具fedt2.40

 标 题:文件加密工具fedt2.40(7月22日修改后)破解过程 (4千字)
发信人:小球[CCG]
时 间:2001-7-24 17:34:12
详细信息:
文件加密工具fedt2.40(7月22日修改后)破解过程！
URL http://www.soft999.com/download1/fedtw240_b0722.exe
又是很久没有写破解过程了，一，是因为家里有事，二，是没有什么值得写的。
最近才闲了下了，应朋友要求，赶快写个过程！
这个共享软件很是有趣，他的注册方式很是特别，如果你输入的注册码不对的话，注册的按钮是不会亮的，也就仍然是灰的。它属于输入注册码就即时比较的那种，所以才记录下我的破解过程，供大家参考！
这个软件有壳，但是不难脱。这里我就不详细介绍了，关键还是在如何追出注册码。
运行这个软件，找到注册的地方，首先生成ID，也就是机器码。然后来到注册处，先输入你的名字，我输入zzglf，然后运行trw2000，下断bpx hmemcpy。然后在注册码输入的地方输入一个字符，我输入f。程序马上trw中断了，回到了trw中。注意！现在不要清楚断点，也就是不要bd*或bc*，后面还要用到。按一下F5，程序再次被断，这时用trw的命令pmodule，回到程序的领空，接着按F10来到这里：
:004131BB 8D45FC lea eax, dword ptr [ebp-04] **停在这儿
:004131BE E819F6FEFF call 004027DC **F10代过
:004131C3 83F804 cmp eax, 00000004 **EAX中是名字的长度
:004131C6 0F8CE7000000 jl 004132B3 **一定要大于4
再按F5，程序又会被中断下来，命令：pmodule来到程序的领空：
按几下F10来到：
:004131E7 8D45F8 lea eax, dword ptr [ebp-08] **停在这儿
:004131EA E8EDF5FEFF call 004027DC **F10代过
:004131EF 83F808 cmp eax, 00000008 **EAX中是你输入的字符的长度。
:004131F2 0F94C2 sete dl
:004131F5 83E201 and edx, 00000001
:004131F8 52 push edx
:004131F9 FF4DE4 dec [ebp-1C]
好了，bc*清除断点。然后下bpx 4131EF，按F5回到程序中。继续输入字符吧，你没有输入字符的时候都会被中断下来，你要再按F5回到程序中继续输入注册码！你也要注意EAX里面的变化哦！等到EAX＝8时就不要再按F5了。这时就要分析程序了，一直按F10来到：
:00413247 5A pop edx **D EDX看到你的名字。
:00413248 E857AFFFFF call 0040E1A4
:0041324D 8D4DEC lea ecx, dword ptr [ebp-14]
:00413250 51 push ecx
:00413251 8D45F4 lea eax, dword ptr [ebp-0C]
:00413254 E833F5FEFF call 0040278C
:00413259 8BD0 mov edx, eax
:0041325B FF45E4 inc [ebp-1C]
:0041325E 8B4DC4 mov ecx, dword ptr [ebp-3C]
:00413261 8B81EC020000 mov eax, dword ptr [ecx+000002EC]
:00413267 E8648D0300 call 0044BFD0
:0041326C 8D45F4 lea eax, dword ptr [ebp-0C]
:0041326F 5A pop edx **D EDX看到你的假的注册码
:00413270 E873770600 call 0047A9E8 **这个Call一定要进。
:00413275 84C0 test al, al
:00413277 0F95C1 setne cl
:0041327A 83E101 and ecx, 00000001
:0041327D 51 push ecx
:0041327E FF4DE4 dec [ebp-1C]

* Referenced by a CALL at Addresses:
|:0040E6A4 , :00412FE1 , :00413270 , :004133DC , :00415515
|
:0047A9E8 55 push ebp
:0047A9E9 8BEC mov ebp, esp
:0047A9EB 53 push ebx
:0047A9EC 8B00 mov eax, dword ptr [eax] **假
:0047A9EE 8B12 mov edx, dword ptr [edx] **真
:0047A9F0 E8AFF6FEFF call 0046A0A4 **进去就是比较了。
:0047A9F5 0F94C0 sete al
:0047A9F8 83E001 and eax, 00000001
:0047A9FB 5B pop ebx
:0047A9FC 5D pop ebp
:0047A9FD C3 ret

:0046A0A4 53 push ebx
:0046A0A5 56 push esi
:0046A0A6 57 push edi
:0046A0A7 89C6 mov esi, eax
:0046A0A9 89D7 mov edi, edx
:0046A0AB 39D0 cmp eax, edx **比较咯！
:0046A0AD 0F848F000000 je 0046A142 **注意，爆破不能改这儿！
:0046A0B3 85F6 test esi, esi
:0046A0B5 7468 je 0046A11F
:0046A0B7 85FF test edi, edi
:0046A0B9 746B je 0046A126
:0046A0BB 8B46FC mov eax, dword ptr [esi-04]
:0046A0BE 8B57FC mov edx, dword ptr [edi-04]
:0046A0C1 29D0 sub eax, edx
:0046A0C3 7702 ja 0046A0C7
:0046A0C5 01C2 add edx, eax

爆破修改就改开始的地方吧！
:00413277 0F95C1 setne cl
:0041327A 83E101 and ecx, 00000001
改为：
:00413277 XXXXXXX mov al，01
:004132XX 90 nop
:0041327A 83E101 and ecx, 00000001

ok！搞定！我记得有一个crackme也是这种的保护模式！大家可以试试！

小球[CCG]
2001-7-25


雪花屏保

标 题:一个不错的雪花屏保破解手记 (1千字)
发信人:wocy
时 间:2000-12-29 20:08:20
详细信息:
Crack the snowflake3d screen save doc.
----------------------
雪椰
2000,12,28am
Email:wocy@263.net
Http://wocy.yeah.net
------------------------
Use W32asm open the file snowflake3d.scr
1,find the string "Registration" will go to...

Name: DialogID_006C, # of Controls=002, Caption:"Registration", ClassName:""
001 - ControlID:0001, Control Class:"BUTTON" Control Text:"OK"
002 - ControlID:FFFF, Control Class:"STATIC" Control Text:"Registration Successful"
Name: DialogID_006D, # of Controls=003, Caption:"Registration", ClassName:""
001 - ControlID:0002, Control Class:"BUTTON" Control Text:"OK"
002 - ControlID:FFFF, Control Class:"STATIC" Control Text:"Registration Code Invalid!"
003 - ControlID:FFFF, Control Class:"STATIC" Control Text:"You must enter the exact same information as you used to purchase this softwar"
Name: DialogID_006E, # of Controls=003, Caption:"Message", ClassName:""

2,find the dialog 6c&6d you go to ....

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401412(C) <----------c
|
:004014CA 8B1598654200 mov edx, dword ptr [00426598]
:004014D0 6A00 push 00000000
:004014D2 6820124000 push 00401220
:004014D7 53 push ebx

* Possible Reference to Dialog: DialogID_006D
|
:004014D8 6A6D push 0000006D
:004014DA 52 push edx

---->c
:00401408 E883100000 call 00402490
:0040140D 83C410 add esp, 00000010
:00401410 85C0 test eax, eax
:00401412 0F84B2000000 je 004014CA <----------(1)
3,modify 1 with jne xxxx
4,runing,regist,press any code,you will ok
5,the world cleaned.


伊妹捕神中文版

 标 题:《伊妹捕神中文版》 破解过程详解 (6千字)
发信人:幻影2001
时 间:2001-4-29 6:43:34
详细信息:
作者：幻影2001
软件说明：伊妹捕神中文版
下载地址：http://www.shareware.net.cn/dl.asp?id={AB15C060-C608-4D03-968E-8977C6CBAC0C}
使用工具：HIEW，W32DASM，Upx 1.07 + UpxGui中文版 ，FI

步骤1、用FI查看为UPX压缩，用pdump32解压缩后无法正确显示字符串，TRW2000 跟踪后发现脱壳不完整。所以只好用Upx 1.07 + UpxGui中文版来脱壳了,
2、W32DASM反汇编查找“未注册”字样，找到后双击鼠标来到他的调用地址
向上查找能够跳过此段的地方，如下：

:004065BF 0F8490000000 je 00406655 （2）此处修改为NOP就可以 ~~~~~~~~~~~~ 了
909090909090
:004065C5 33C0 xor eax, eax
:004065C7 8945D0 mov dword ptr [ebp-30], eax
:004065CA 8D55D0 lea edx, dword ptr [ebp-30]
:004065CD FF45C4 inc [ebp-3C]
:004065D0 8B4DA4 mov ecx, dword ptr [ebp-5C]
:004065D3 8B81D8020000 mov eax, dword ptr [ecx+000002D8]
:004065D9 E882770300 call 0043DD60
:004065DE 8D55D0 lea edx, dword ptr [ebp-30]
:004065E1 8D45D4 lea eax, dword ptr [ebp-2C]
:004065E4 8B0A mov ecx, dword ptr [edx]

* Possible StringData Ref from Data Obj ->"ym"
|
:004065E6 BA20674700 mov edx, 00476720
:004065EB 51 push ecx
:004065EC 66C745B87400 mov [ebp-48], 0074
:004065F2 E8C5C30600 call 004729BC
:004065F7 FF45C4 inc [ebp-3C]
:004065FA 8B10 mov edx, dword ptr [eax]
:004065FC A158664700 mov eax, dword ptr [00476658]
:00406601 59 pop ecx
:00406602 E869450100 call 0041AB70
:00406607 FF4DC4 dec [ebp-3C]
:0040660A 8D45D0 lea eax, dword ptr [ebp-30]
:0040660D BA02000000 mov edx, 00000002
:00406612 E875C40600 call 00472A8C
:00406617 FF4DC4 dec [ebp-3C]
:0040661A 8D45D4 lea eax, dword ptr [ebp-2C]
:0040661D BA02000000 mov edx, 00000002
:00406622 E865C40600 call 00472A8C
* Reference To: Project1._Form1
|
:00406627 8B0D74AE4700 mov ecx, dword ptr [0047AE74]
:0040662D 33D2 xor edx, edx
:0040662F 8B01 mov eax, dword ptr [ecx]
:00406631 8B8034030000 mov eax, dword ptr [eax+00000334]
:00406637 E8946D0100 call 0041D3D0
* Reference To: Project1._Form1
|
:0040663C 8B0D74AE4700 mov ecx, dword ptr [0047AE74]
:00406642 8B01 mov eax, dword ptr [ecx]
:00406644 C680D103000001 mov byte ptr [eax+000003D1], 01
:0040664B 8B45A4 mov eax, dword ptr [ebp-5C]
:0040664E E8B5A20200 call 00430908
:00406653 EB4F jmp 004066A4 （1）=====》此处跳过则 成功，由于是无条件跳跃，所以还要向上找

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004065BF(C)
|
:00406655 66C745B88000 mov [ebp-48], 0080

* Possible StringData Ref from Data Obj ->"伊妹捕神 1.2版 [未注册版]"
|
:0040665B BA23674700 mov edx, 00476723
:00406660 8D45CC lea eax, dword ptr [ebp-34]
:00406663 E854C30600 call 004729BC
:00406668 FF45C4 inc [ebp-3C]
:0040666B 8B10 mov edx, dword ptr [eax]
* Reference To: Project1._Form1
|
:0040666D 8B0D74AE4700 mov ecx, dword ptr [0047AE74]
:00406673 8B01 mov eax, dword ptr [ecx]
:00406675 E816770300 call 0043DD90
:0040667A FF4DC4 dec [ebp-3C]
:0040667D 8D45CC lea eax, dword ptr [ebp-34]
:00406680 BA02000000 mov edx, 00000002
:00406685 E802C40600 call 00472A8C
:0040668A 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"WARNING"
|
:0040668C 6855674700 push 00476755

* Possible StringData Ref from Data Obj ->"Invalid Serial Number!"
|
:00406691 683E674700 push 0047673E
:00406696 8B45A4 mov eax, dword ptr [ebp-5C]
:00406699 E8CED30300 call 00443A6C
:0040669E 50 push eax

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:0040669F E8A4CF0600 Call 00473648

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406653(U)
|
:004066A4 FF4DC4 dec [ebp-3C]
:004066A7 8D45FC lea eax, dword ptr [ebp-04]
:004066AA BA02000000 mov edx, 00000002
:004066AF E8D8C30600 call 00472A8C
:004066B4 8B4DA8 mov ecx, dword ptr [ebp-58]
:004066B7 64890D00000000 mov dword ptr fs:[00000000], ecx
:004066BE 5F pop edi
:004066BF 5E pop esi
:004066C0 5B pop ebx
:004066C1 8BE5 mov esp, ebp
:004066C3 5D pop ebp
:004066C4 C3 ret

:004066C5 90 nop
:004066C6 90 nop
:004066C7 90 nop
:004066C8 53 push ebx
:004066C9 8BD8 mov ebx, eax
:004066CB 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"Register"
|
:004066CD 6891674700 push 00476791

* Possible StringData Ref from Data Obj ->"This is an UNREGISTERED version,please "
->"register it!"
|
:004066D2 685D674700 push 0047675D
:004066D7 8BC3 mov eax, ebx
:004066D9 E88ED30300 call 00443A6C
:004066DE 50 push eax

3、用HIEW打开cutemailcapturer.exe文件，按两下回车键，然后按F5输入5BBF回 车找到以上代码，将光标移到（2）所指代码处按F3修改F9存盘。
4、现在可以运行《伊妹捕神中文版》来试一下了，呵呵注册字样消失了，输入注 册码测试，注册成功！！！！ : )
破解完成。


赢证股市分析软件V2.01

 标 题:《赢证股市分析软件》V2.01 高级版的破解 (10千字)
发信人:佳洁士
时 间:2001-5-8 17:04:17
详细信息:
《赢证股市分析软件》V2.01 高级版的破解

软件名称：《赢证股市分析软件》V2.01
发布日期： 2001.3.5
软件来源：《软件》杂志第4期配套光盘。
软件简介：
《赢证股市分析软件》主要面向广大中小投资者，特别是上班族股民，为他们提供一种功能强大，价廉物美的炒股工具。

软件分为共享版，标准版和高级版三个版本，用户可以完全免费地，无期限地试用共享版软件，充分体会软件强大的功能。如果用户感到软件的功能能够满足自己的需要，就可以注册成为标准版或高级版，以获取更多更全面的功能和厂家提供的更多服务内容。

高级版是《赢证股市分析软件》系列产品中最优秀的版本。与标准版的唯一区别就是增加了“赢证红绿灯”信号。该信号是一种全新的选股方式，是由计算机通过对大量的历史数据进行智能分析总结出来的具有普遍规律性的选股法。经过实际验证，该信号能够获得非常准确清晰的买卖结果，以红绿灯的方式直接表现在K线图中。

【声明】
我写这篇文章是以技术交流为主，希望大家在转载时能保持文章的完整性。

作 者：佳洁士
解密日前：2001年4月26日
解密工具：1、Trw2000 1.22
2、W32Dasm 8.93 超级中文版

从软件帮助文件的介绍上可以得知，软件的使用权限越高，功能越强大，而使用权限是同过注册码来确定的，小弟的功力太菜。追不到它的注册码。不得已用爆破手段来搞定它。

找到我们的神兵利器W32Dasm 8.93 超级中文版反汇编《赢证股市分析软件》的主程序StockNT.exe。静态分析看看能够有什么收获。皇天不负有心人。让我找到了共享版、标准版、高级版等关键字符串。并记下了他们的内存地址（memory offset）。

共享版： 0042AE28 MOV EAX,005135E0

标准版： 0042AE35 PUSH DWORD 005135D0

高级版： 0042AE41 PUSH DWORD 005135C0

我们可以利用在W32Dasm 8.93 超级中文版找到的内存地址（memory offset），在Trw2000中下中断点。

在TRW2000运行窗口用Browse选中StockNT.exe，然后用Loaf按钮装载。装载文件后，将中断在这文件的主函数(即程序的入口处)。

将中断点下在共享版上：bpx 0042AE28

..............
0167:0042ADE9 LEA ECX,[EDI+EDI*4]
0167:0042ADEC PUSH BYTE +00
0167:0042ADEE LEA ECX,[ECX+ECX*4]
0167:0042ADF1 LEA ECX,[EBX+ECX*4]
0167:0042ADF4 LEA ECX,[ECX+ECX*4]
0167:0042ADF7 LEA EDX,[ECX+ECX*4]
0167:0042ADFA LEA ECX,[EBP+EDX*4+00]
0167:0042ADFE MOV EDX,[EAX+1C]
0167:0042AE01 PUSH ECX
0167:0042AE02 PUSH DWORD 05C2 //将05C2压入堆栈. 关键哦！
0167:0042AE07 PUSH EDX
0167:0042AE08 CALL `USER32!SendMessageA` ==>重点!!! 按F8进入此CALL.
0167:0042AE0E TEST EAX,EAX 试着下 EAX=1（这是以EAX为旗帜）
0167:0042AE10 JNZ 0042AE30 可以看见变成标准版。随便移动鼠标，
0167:0042AE12 CALL 004CFC96 又变回共享版了。
0167:0042AE17 MOV ECX,[EAX+04]
0167:0042AE1A CALL 00499610
0167:0042AE1F TEST EAX,EAX
0167:0042AE21 MOV EAX,005135F0
0167:0042AE26 JNZ 0042AE2D
0167:0042AE28 MOV EAX,005135E0 <<=共享版
0167:0042AE2D PUSH EAX
0167:0042AE2E JMP SHORT 0042AE46
0167:0042AE30 CMP EAX,BYTE +01 //比较EAX是不是等于1
0167:0042AE33 JNZ 0042AE3C //不相等就跳，
0167:0042AE35 PUSH DWORD 005135D0 <<=标准版
0167:0042AE3A JMP SHORT 0042AE46
0167:0042AE3C CMP EAX,BYTE +02 //比较EAX是不是等于2
0167:0042AE3F JNZ 0042AE4F //不相等就跳，
0167:0042AE41 PUSH DWORD 005135C0 <<=高级版
0167:0042AE46 LEA ECX,[ESP+14]
0167:0042AE4A CALL 004B7D9F
0167:0042AE4F MOV EAX,[ESP+10]
0167:0042AE53 MOV EDX,[ESI]
0167:0042AE55 MOV ECX,[EAX-08]
.....................

看到共享版、标准版、高级版的区别了吗! 他们都是以EAX的值作为判断共享版、标准版、高级版的!

也就是说：当EAX=0 为共享版
当EAX=1 为标准版
当EAX=2 为高级版

向上看看，看何处使EAX可为1、2 。可以找到这里：

0167:0042AE08 CALL `USER32!SendMessageA`
0167:0042AE0E TEST EAX,EAX <<-强制使EAX=1，软件将变成标准版。
0167:0042AE10 JNZ 0042AE30 强制使Eax=2，软件会变成高级版。

如果在上述部位强制使EAX=1。虽然在使用权限中会变成了标准版、高级版，但是还是有很多的功能不能正常使用。比如红绿灯功能就不能使用，也就是说软件表面上变成是标准版、高级斑，但同实际上还是共享版。只是文字改变了。可以肯定程序在某处有全局变量注册旗帜。

现在要做的事情就是找到这个注册旗帜!!!

按F8进入0167:0042AE08 CALL `USER32!SendMessageA`
这时将来到系统文件USER32.dll的邻空。
按F10慢慢走，看看程序要把我们带到什么地方?
....................
0167:BFF559E6 CALL BFF55000
0167:BFF559EB PUSH DWORD [ESP+04]
0167:BFF559EF CALL BFF5506B
0167:BFF559F4 TEST EAX,EAX
0167:BFF559F6 JZ BFF55A5E
0167:BFF559F8 TEST BYTE [EAX+2F],02
0167:BFF559FC JZ BFF55A5E
0167:BFF559FE MOV CX,[FS:28]
0167:BFF55A06 CMP [EAX+20],CX
0167:BFF55A0A JNZ BFF55A5E
0167:BFF55A0C MOV EDX,[BFF5D5D2]
0167:BFF55A12 ADD EDX,1112
0167:BFF55A18 CMP WORD [EDX+0A],BYTE +00
0167:BFF55A1D JNZ BFF55A5E
0167:BFF55A1F CMP WORD [EDX+1A],BYTE +00
0167:BFF55A24 JNZ BFF55A5E
0167:BFF55A26 PUSH EAX
0167:BFF55A27 PUSH CX
0167:BFF55A29 PUSH WORD 00
0167:BFF55A2D CALL `KERNEL32!MapSL`
0167:BFF55A32 MOV ECX,EAX
0167:BFF55A34 POP EAX
0167:BFF55A35 ADD ECX,BYTE +5E
0167:BFF55A38 CMP WORD [ECX+0A],BYTE +00
0167:BFF55A3D JNZ BFF55A5E
0167:BFF55A3F CMP WORD [ECX+1A],BYTE +00
0167:BFF55A44 JNZ BFF55A5E
0167:BFF55A46 MOV CX,[EAX+2A]
0167:BFF55A4A MOV ES,CX
0167:BFF55A4D MOVZX EAX,WORD [EAX+28]
0167:BFF55A51 MOV EAX,[ES:EAX+02]
0167:BFF55A55 PUSH DS
0167:BFF55A56 POP ES
0167:BFF55A57 CALL BFF5500C
0167:BFF55A5C JMP EAX <<==回到StockNT.exe
......................

经过上面不长不短的代码。突然从系统文件USER32.dll的领空返回到了StockNT.exe的领空。

这可是软件的关键的部位，好好的分析一下。
......................

EAX=004B440A EBX=00000005 ECX=C174DC30 EDX=000194C4 ESI=0079F7DC
EDI=000007D1 EBP=00000008 ESP=0079F730 EIP=004B440A o d I s Z a P c
CS=0167 DS=016F SS=016F ES=016F FS=0FAF GS=0000 SS:0079FA04=000005C2 看这儿! ==================================================byte==============PROT========
0030:00000000 9E 0F C9 D8 65 04 70 00-16 00 E9 CD 65 04 70 00 ....e.p.....e.p.
0030:00000010 65 04 70 00 54 FF 00 F0-08 80 00 F0 6F EF 00 F0 e.p.T.......o...
0030:00000020 00 00 EF 08 8C 19 CA CE-6F EF 00 F0 6F EF 00 F0 ........o...o...
0030:00000030 6F EF 00 F0 6F EF 00 F0-9A 00 E9 CD 65 04 70 00 o...o.......e.p.
==========================================================================ROT32

0167:004B4409 RET
0167:004B440A PUSH EBP 
0167:004B440B MOV EBP,ESP
0167:004B440D CMP DWORD PTR [EBP+0C],00000360
0167:004B4414 JNZ 004B441B
0167:004B4416 PUSH 01
0167:004B4418 POP EAX
0167:004B4419 JMP 004B4435
0167:004B441B PUSH DWORD PTR [EBP+08]
0167:004B441E CALL 004B4385
0167:004B4423 PUSH DWORD PTR [EBP+14]
0167:004B4426 PUSH DWORD PTR [EBP+10]
0167:004B4429 PUSH DWORD PTR [EBP+0C]
0167:004B442C PUSH DWORD PTR [EBP+08]
0167:004B442F PUSH EAX
0167:004B4430 CALL 004B419D
0167:004B4435 POP EBP
0167:004B4436 RET 0010
0167:004B4439 MOV EAX,004B440A
0167:004B443E RET
0167:004B443F MOV EAX,004E24A0
0167:004B4444 CALL 004A3488
0167:004B4449 SUB ESP,40
0167:004B444C PUSH EBX 
0167:004B444D PUSH ESI  
====================================STOCKNT!.text+000B3409======================
Break due to BPX #0167:0042AE02 (ET=2.31 seconds)
:pagein n 23.txt

.................

0167:004B440A PUSH EBP
0167:004B440B MOV EBP,ESP
0167:004B440D CMP DWORD PTR [EBP+0C],00000360 取堆栈的值与0360作比较
0167:004B4414 JNZ 004B441B
0167:004B4416 PUSH 01 //将01压入堆栈 <<=注册旗帜哦
0167:004B4418 POP EAX //从堆栈取出01到EAX
0167:004B4419 JMP 004B4435

[EBP+0C]=05C2，05C2是不是很眼熟，在什么地方见过。找一找？

把0167:004B440D CMP DWORD PTR [EBP+0C],00000360 改成0167:004B440D CMP DWORD PTR [EBP+0C],000005C2。来改变软件的跳转方向。

按F5回到程序，这时可以发现软件在使用权限上已经变成了标准版。试一试各种功能。都可以正常使用(除红绿灯功能外)。从前面的分析我们知道！高级版与标准版的区别！只是EAX值的不同，EAX=2就是高级版。

0167:004B440D CMP DWORD PTR [EBP+0C],000005C2
0167:004B4414 JNZ 004B441B
0167:004B4416 PUSH 01 改为：PUSH 02
0167:004B4418 POP EAX
0167:004B4419 JMP 004B4435

这样一来，不就使EAX=2了嘛。看使用权限中是不是就变成了高级版。 试一下高级版中的红绿灯功能。可以正常使用了。

最后整理一下：

高级版的修改方法:
找到：817D0C6003000075056A01
改成：------C205----------02 注：“ - ” 表示不用改!

佳洁士
2001.04.26

后记：在写《赢证股市分析软件》破解记录时，发现一个有趣的现象。我写破解录时喜欢把软件的名称作为文件名称，比如说："赢证股市分析软件.txt".此时再运行赢证，赢证会提示软件已经在运行之中。不知这算不算软件的Bug。

广告： 我们的目标，没有加密! -----佳洁士


有声有色3.33

标 题:有声有色3.33破解过程 (4千字)
发信人:Jacky_Wu
时 间:2001-2-9 1:26:52
详细信息:
有声有色3.33破解过程:
1.用pdump32对MUSREA.EXE进行解压(UPX)
2.用W32dsm89进行反汇编，分析以下代码：
:00508D01 83FA1E cmp edx, 0000001E --->检查c:\WINDOWS\HELP\NETWEB.HLP(这个
文件记录巳使用次数)中Fendir值
是否大于等于30
:00508D04 7D48 jge 00508D4E --->若大于则跳并提示试用期满,故将此处代码
7D48改为9090(即用两个NOP指令代替)
:00508D06 833DDC7551001E cmp dword ptr [005175DC], 0000001E
:00508D0D 7D3F jge 00508D4E
:00508D0F 833DDC7551001E cmp dword ptr [005175DC], 0000001E
:00508D16 7D36 jge 00508D4E
:00508D18 803D2476510001 cmp byte ptr [00517624], 01 -->检查注册表 [HKEY_LOCAL_MACHINE\Software\Nico Mak
Computing\WinZip\WinIni]
"Setting"值是否为1
:00508D1F 742D je 00508D4E ---> 若为1则跳并提示试用期满，故可将此处
代码742D改为9090,使其无法跳转

:00508D21 803D2576510001 cmp byte ptr [00517625], 01 -->检查注册表
[HKEY_LOCAL_MACHINE\Software\朱江软件有限公司\
有声有色 3.12]
"TextSetting"值是否为1
:00508D28 7424 je 00508D4E --->若为1则跳并提示试用期满，故可将此处
代码7424改为9090,使其无法跳转

:00508D2A 803D2676510001 cmp byte ptr [00517626], 01 -->检查注册表
[HKEY_LOCAL_MACHINE\Software\
Microsoft\MediaPlayer\Player]
"CrlMoveTo"值是否为1
:00508D31 741B je 00508D4E -->若为1则跳并提示试用期满，故可将此处
代码741B改为9090,使其无法跳转
:00508D33 803D2776510001 cmp byte ptr [00517627], 01 -->检查注册表
[HKEY_LOCAL_MACHINE\Software\CLASSES\CLSID\
{00005104-0000-0000-8008-00AA006O2ER4}]
"51851856985adsf"值是否为1
:00508D3A 7412 je 00508D4E -->若为1则跳并提示试用期满，故可将此处
代码7412改为9090,使其无法跳转

:00508D3C 803D2876510001 cmp byte ptr [00517628], 01 -->检查注册表
[HKEY_LOCAL_MACHINE\Software\
Microsoft\IE Setup\SETUP]
"InstallOption"值是否为1
:00508D43 7409 je 00508D4E -->若为1则跳并提示试用期满，故可将此处
代码7409改为9090,使其无法跳转

:00508D45 803D2976510001 cmp byte ptr [00517629], 01 -->检查注册表
[HKEY_USERS\.DEFAULT\Software\Microsoft\
Windows\CurrentVersion\Explorer]
"HotKey"值是否为1
:00508D4C 7513 jne 00508D61 -->若为1则不会跳并提示试用期满，故可将此处
代码7513改为EB13(即JMP SHORT 00508D61), 使其完成跳转

:00508D61 42 inc edx -->此处为试用次数累加部分，把此处代码42改为90即可使
程序的累加失效，以获得无限次使用。


有声有色3.36

标 题:有声有色3.36的壳如何脱？它有CRC校验，第一层是UPX0.72，第二层不知是UPX多少的。 (空)
发信人:gfh[CCG]
时 间:2000-12-31 0:45:25
详细信息:

标 题:一个不用脱壳的方法，也不是内存补丁。-你猜？ (1千字)
发信人:wocy
时 间:2001-1-1 4:02:17
详细信息:

方法如下：
1，这个软件的运行天数放在\windows\help\netweb.hlp里
所以你只需删除这个文件便可以继续用了。
2，但是如果你的已经过期了话，那么还的修改注册表
-----------------------------------------------------------
**Original contents Maybe deleted or modified**
H.L.K\Software\Microsoft\MediaPlayer\Player\CrlMoveTo: 0x00000000
H.L.K\Software\Microsoft\IE Setup\Setup\InstallOption: 0x00000000
H.L.K\Software\CLASSES\CLSID\{00005104-0000-0000-8008-00AA006O2ER4}\51851856985adsf: 0x00000000
H.L.K\Software\Nico Mak Computing\WinZip\WinIni\Setting: 0x00000000
H.L.K\Software\朱江软件有限公司\有声有色 3.12\TextSetting: 0x00000000
H.U\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\HotKey: 0x00000000

**Keys&Values Modified | Added in the 2ndShot**
H.L.K\Software\Microsoft\MediaPlayer\Player\CrlMoveTo: 0x00000001
H.L.K\Software\Microsoft\IE Setup\Setup\InstallOption: 0x00000001
H.L.K\Software\CLASSES\CLSID\{00005104-0000-0000-8008-00AA006O2ER4}\51851856985adsf: 0x00000001
H.L.K\Software\Nico Mak Computing\WinZip\WinIni\Setting: 0x00000001
H.L.K\Software\朱江软件有限公司\有声有色 3.12\TextSetting: 0x00000001
H.U\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\HotKey: 0x00000001
-----------------------------------------
他们中如果你只改一个，程式会给你改回来。要同时改。

3，所以有这个方法：
在有声有色目录里建个bat文件，
ok.bat
del %winbootdir%\help\newweb.hlp

然后在有声有色的属性里加上：在程式运行时先运行的批处理 -》ok.bat

4,然后你就可以不用脱壳了，当然你也可以编个程式做以上功能
前面加上你的大名，告知这是你的作品，不得随意转载。
5，付：iceworld好象在白菜发表过这个破解。
6，如果你是专为脱壳，算我没说。


源江科技出的源代码(VB篇)

 标 题:呵呵！源江科技出的“源代码(VB篇)”破解过程^_^ (6千字)
发信人:Cyrix686
时 间:2001-7-28 18:45:09
详细信息:

[开场白]

唉！

刚刚买了几张碟回来，但是除了那几张MPEG4好用之外，另外两张软件碟都不好用！

特别是那张“金山软件3000全集”，读不到！

还有那张源江科技出的“源代码(VB篇)”，原来要输入注册码，才可以用它自带的浏览器！！！！

我倒！注册费要20元？那别人买正版的呢？呵呵！可能附送了注册码吧？我这个盗版就没有！结果用不了！

只好自己动手！顺便作为庆祝FCG主页的ASP更新程序下个星期正式使用^_^http://www.cn778.net/index.asp

[说明]

目标软件：源江科技出的“源代码(VB篇)”的浏览器（和注册器）

使用工具：W32Dasm 8.93、UltraEdit-32

[开始]

如果没注册，用它自带的浏览器browse.exe，一开始就会弹出“你的程序未注册”的对话框，然后自动退出！（呵呵！没有图片，因为忘记了在没注册之前截图^_^）

要注册，就要用自带的注册器Regedit.exe，当然，我没有正确的注册码，按确定，会在软件左下角出现“注册失败”的字样（如图一）！呵呵！我就觉得源江科技有点“傻”，居然提供一个注册器，这个东西却是他的致命伤（看后文就知道了^_^）！

最开始破解这个东西还有一点小插曲（我摆了个大乌龙^_^）——我把那两个文件copy到硬盘，接着用fi来检测一下有没有加壳（sunbird大哥教的^_^），结果没有，这个软件使用Delphi编的，然后用W32Dasm反编译browse.exe，然后打开“串式参考”，找到“你的程序未注册”，双击，看到代码如下：

* Possible StringData Ref from Code Obj ->"RegCode"
|
:0046EC69 B91CED4600 mov ecx, 0046ED1C
:0046EC6E B201 mov dl, 01
:0046EC70 A180D04600 mov eax, dword ptr [0046D080]
:0046EC75 E84EE9FFFF call 0046D5C8
:0046EC7A A328294700 mov dword ptr [00472928], eax
:0046EC7F 6A00 push 00000000
:0046EC81 8D45FC lea eax, dword ptr [ebp-04]
:0046EC84 50 push eax

* Possible StringData Ref from Code Obj ->"vbsource"
|
:0046EC85 B92CED4600 mov ecx, 0046ED2C

* Possible StringData Ref from Code Obj ->"yjkj"
|
:0046EC8A BA40ED4600 mov edx, 0046ED40
:0046EC8F A128294700 mov eax, dword ptr [00472928]
:0046EC94 E8C3E9FFFF call 0046D65C
:0046EC99 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"nsygbd0001"
|
:0046EC9C BA50ED4600 mov edx, 0046ED50 \
:0046ECA1 E87A50F9FF call 00403D20 / 呵呵！很明显吧？
:0046ECA6 7416 je 0046ECBE / 把je改成jne就行啦！

* Possible StringData Ref from Code Obj ->"您的程序未注册" //找到这里，往上找一找
|
:0046ECA8 B864ED4600 mov eax, 0046ED64
:0046ECAD E832B5FDFF call 0044A1E4
:0046ECB2 A180184700 mov eax, dword ptr [00471880]
:0046ECB7 8B00 mov eax, dword ptr [eax]
:0046ECB9 E8B28BFDFF call 00447870

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046ECA6(C)
|
:0046ECBE 33C0 xor eax, eax
:0046ECC0 5A pop edx
:0046ECC1 59 pop ecx
:0046ECC2 59 pop ecx
:0046ECC3 648910 mov dword ptr fs:[eax], edx
:0046ECC6 68F0EC4600 push 0046ECF0

呵呵！用UltraEdit32载入browse.exe，查找E87A50F9FF，然后把紧接在后面的74选中，准备改成75，可是怎么改也改不了！呵呵！有什么地方出错呢？马上上网，找到peter，给peter看了看代码，他也是这么说的，但是，我就是改不了！呵呵！想了想，哦！原来那个文件是“只读文件”！所以当然改不了了！^_^（不知大家有犯过这种错误没有^_^）（感谢peter的帮助！）

好了，把browse.exe改好后，运行，但是会出现一些错误的对话框，大概是我没有copy光碟上面其他的东西过来吧？但是，虽然可以进到browse.exe主界面，可是由于这个原因，仍然看不到那些内容！呵呵！由于硬盘空间有限，我不想把全部内容copy到硬盘，所以决定放弃这种方法！

那我们就从Regedit.exe（不是windows那个哦！）入手吧！既然它有注册功能，就可能会成功^_^

用W32Dasm反编译Regedit.exe，打开“串式参考”，找到“注册失败”，双击，回到主界面，看到如下的代码：

* Possible StringData Ref from Code Obj ->"nsygbd0001" //很熟悉吧？browse.exe也有的
|
:0045C6AB BA24C74500 mov edx, 0045C724 \
:0045C6B0 E8EF75FAFF call 00403CA4 / 又是熟悉的东东！
:0045C6B5 7520 jne 0045C6D7 / 把jne改成je，刚好与browse.exe
:0045C6B7 8BC3 mov eax, ebx 的改法相反！
:0045C6B9 E8E6FEFFFF call 0045C5A4
:0045C6BE C6057CF8450001 mov byte ptr [0045F87C], 01

* Possible StringData Ref from Code Obj ->"注册成功" // 我们期待的^_^
|
:0045C6C5 BA38C74500 mov edx, 0045C738
:0045C6CA 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:0045C6D0 E8BBF3FFFF call 0045BA90
:0045C6D5 EB24 jmp 0045C6FB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045C6B5(C)
|

* Possible StringData Ref from Code Obj ->"注册失败" //找到了！往上找一找！
|
:0045C6D7 BA4CC74500 mov edx, 0045C74C
:0045C6DC 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:0045C6E2 E8A9F3FFFF call 0045BA90
:0045C6E7 33D2 xor edx, edx
:0045C6E9 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:0045C6EF E80C85FCFF call 00424C00
:0045C6F4 C6057CF8450000 mov byte ptr [0045F87C], 00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045C6D5(U)
|
:0045C6FB 33C0 xor eax, eax
:0045C6FD 5A pop edx
:0045C6FE 59 pop ecx
:0045C6FF 59 pop ecx
:0045C700 648910 mov dword ptr fs:[eax], edx
:0045C703 6818C74500 push 0045C718

呵呵！还是一样，把Regedit.exe的属性去掉“只读”（吸取教训呀^_^），然后用UltraEdit32找到E8EF75FAFF，把紧接在后面的75改成74，呵呵！保存，退出！直接执行Regedit.exe，乱输入一些注册码（呵呵！我是没有输入的^_^如果太太好运，输入正确的注册码，呵呵！那就会出现“注册失败”哦！），看看窗口的左下脚，出现“注册成功”了吧？

呵呵！然后，回到光碟里面，执行光碟上面那个browse.exe就行啦！

[后记]

其实，真正破解这个软件（不知道是不是叫做软件），所需要的时间应该可以控制在3分钟的，但是由于我的“乌龙”，结果用了半个小时^_^大家在破解软件的时候，可要注意这一点哦！（扔鸡蛋，有谁会像你这么傻！！%&*%##@!）

还有，写这篇东西也用的将近半个小时！^_^

要下载已破解的Regedit.exe，到FCG主页吧！http://www.cn778.net/index.asp

Cyrix686
2001-7-28


智能狂拼

 标 题:智能狂拼试用版之破解 (1千字)
发信人:custer
时 间:2000-9-4 9:04:25
详细信息:
找到cspy.imf文件，用W32dasm打开可以看到如下字样：

* Referenced by a CALL at Address:
|:10006AD3
|
:10004550 A15CE10310 mov eax, dword ptr [1003E15C]
:10004555 85C0 test eax, eax
:10004557 742D je 10004586
:10004559 A160E10310 mov eax, dword ptr [1003E160]
:1000455E 85C0 test eax, eax
:10004560 751E jne 10004580
:10004562 6A10 push 00000010 <------- 改为jmp 10004586,OK

* Possible StringData Ref from Data Obj ->"中文之星智能狂拼试用版本"
|
:10004564 68DCE10310 push 1003E1DC

* Possible StringData Ref from Data Obj ->"中文之星智能狂拼试用版本的使用期限已到。

如"
->"要继续使用，请购买正式版本。
请访问 "
->"www.cstar.com.cn 获取详细信息。
"
|
:10004569 6864E10310 push 1003E164
:1000456E 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0195h
|
:10004570 FF15D0350D10 Call dword ptr [100D35D0]
:10004576 C70560E1031001000000 mov dword ptr [1003E160], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004560(C)
|
:10004580 B801000000 mov eax, 00000001
:10004585 C3 ret

custer
2000.9.3


鹦鹉螺网络助手v1.68

标 题:鹦鹉螺网络助手v1.68--胡解过程 (2千字)
发信人:alangju
时 间:2001-1-13 0:06:21
详细信息:
鹦鹉螺网络助手v1.68--破解过程
==============================================================
软件简介：鹦鹉螺网络助手是一个功能强大，方便易用的专业网络工具集。
她基于Windows Socket2.0，提供了在互联网和企业内部网络上
广泛使用的多种工具，包括：Ping、TraceRoute(路由跟踪)、
Host lookup(主机查询)、Finger(帐号查询)、同步本地主机时
钟的Time(网络时钟)、WhoIs(域名查询)、端口扫描、IP地址扫
描、QoD服务、增强的快速拨号、支持多帐号的电邮检查。
操作系统:Win95/98/me/NT/2000
下载地址：http://netkit.top263.net
破解工具：反汇编工具、编辑器
级别：初级（大笨鸟）
本人初学,如有不正确之处,希望各位大侠给予指正.
本人信箱:langlirong@163.net
===============================================================
本人无意要破坏别人的劳动果实，此破解只作学习和交流用，不得用于其他
用途。
破解过程：
启动NetKit，随便输入用户名和注册码确定，弹出错误提示框，请记住。
打开反汇编工具，装入NetKit，找到错误提示处：

* Possible Reference to String Resource ID=00016: "s?
|
:004168B4 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"鹦鹉螺网络助手"
|
:004168B6 68C8E14500 push 0045E1C8

* Possible StringData Ref from Data Obj ->"抱歉，无效注册码！"
向上找到 00416856(c) 立即跳到 00416856

:00416840 57 push edi
:00416841 E8E5150200 call 00437E2B
:00416846 8D4C2418 lea ecx, dword ptr [esp+18]
:0041684A C644242C01 mov [esp+2C], 01
:0041684F E8CC010000 call 00416A20
^^^^^^^^^^^^^
:00416854 85C0 test eax, eax
:00416856 745C je 004168B4 //不对跳到004168B4
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00416858 8B3F mov edi, dword ptr [edi]
:0041685A E8E7D50200 call 00443E46
:0041685F 8B4004 mov eax, dword ptr [eax+04]
:00416862 57 push edi

将00416856处 je 改为 jne
此时注册显示成功.但退出重新进入,提示未注册.
还需找到检测点,请看00416856处上面的call,还等什么?进入呀:

:00416A86 52 push edx
:00416A87 E844B60000 call 004220D0
:00416A8C 83C40C add esp, 0000000C
:00416A8F C644242000 mov [esp+20], 00
:00416A94 85C0 test eax, eax
:00416A96 8D4C2428 lea ecx, dword ptr [esp+28]
:00416A9A 752D jne 00416AC9 //不对跳到00416AC9
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00416A9C E815160200 call 004380B6
:00416AA1 8D4C242C lea ecx, dword ptr [esp+2C]
:00416AA5 C7442420FFFFFFFF mov [esp+20], FFFFFFFF
:00416AAD E804160200 call 004380B6

将 00416A9A 的 752D 改为 9090
现在打开NetKit,输入用户名和注册码(随便啦)看看,是不是正版软件啦.
OK！整理一下，收工。

阿郎
langlirong@163.net
http://alang.shangdu.net

12/01/2001


BadCopy99 v2.0

标 题:BadCopy99 v2.0注册器！用CRACKCODE做的。要的请进！内有…… (791字)
发信人:1212
时 间:2001-1-1 22:37:44
详细信息:
强力拷贝软件，可以将您无法读出的光盘或软盘里的文件尽可能的复制出来，尽量减少您的损失，经过试用，效果的确不同凡响，原来更本无法读出的几张光盘和软盘里的文件，几乎都完好无缺的拷了出来，强力推荐！
CRACKCODE2000：

[Options]
CommandLine=BCopy99.exe
Mode=2
First_Break_Address=4723A3
First_Break_Address_Code=58
First_Break_Address_Code_Lenth=2
Second_Break_Address=4723A4
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EAX

***\E-mail:lihaitao@xaonline.com\***
*** 注册名：lihtao@sina.com 注册码：408434 ***
*** bpx 4723A3 D EAX=您输的注册码***
*** bpx 4723A4 D EAX=正确的注册码***
****\E-mail:lihaitao@public.xa.sn.cn\****
*** 程序老家：http://www.jufsoft.com ***
*Download: http://www.jufsoft.com/download/bcopy99v2.exe*


Readbook v1.4

 标 题:Readbook v1.4破解实战(天意II+W32dasm破解并用crackcode2000来写注册机) (3千字)
发信人:wind[CCG]
时 间:2000-9-9 14:16:34
详细信息:
Readbook v1.4破解实战(天意II+W32dasm破解并用crackcode2000来写注册机)

本文作者:wind[CCG]
作者主页:http://biggow.8u8.com

1、这里仍然要应用w32dasm来辅助分析，然后用天意II，来下断点！就算用trw2000
或者是soft-ice下bpx hmemcpy或其他断点，也未必会找到比较核心！这里我们可
以解用w32dasm来分析！

2、这个程序没有加壳，所以，直接使用w32dasm来反汇编程序，将它保存成文本！
不要退出，我们可以string data ref,这里我们找到了"您已经成功地注册了!"
然后，来到如下程序段：
:0040A13D 6864384600 push 00463864
:0040A142 8BCE mov ecx, esi
:0040A144 E8C4F20200 call 0043940D
:0040A149 EB38 jmp 0040A183
-->这里没有我们需要的东西，往上找，来到：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409F9C(C)
|
:0040A00B 8D8544FFFFFF lea eax, dword ptr [ebp+FFFFFF44]
:0040A011 50 push eax
:0040A012 E8AF960200 call 004336C6
:0040A017 8B854CFFFFFF mov eax, dword ptr [ebp+FFFFFF4C]
:0040A01D 8B8D48FFFFFF mov ecx, dword ptr [ebp+FFFFFF48]
:0040A023 8BB544FFFFFF mov esi, dword ptr [ebp+FFFFFF44]
:0040A029 03C8 add ecx, eax
:0040A02B 038D50FFFFFF add ecx, dword ptr [ebp+FFFFFF50]
:0040A031 69F631750000 imul esi, 00007531
:0040A037 69C931750000 imul ecx, 00007531
-->这个片段就是计算注册码的部分了！我们就用天意II在40a00b下断点！看看！
：(1)先启动Readbook v1.4，来到输入注册码的地方，输入信息！
Name:wind[CCG]
Code:8989898989
(2)然后alt+z呼出天意II，下bpx 40a00b! 用g命令返回到readbook
(3)按"填写完毕"按钮，来到天意II调试环境！
(4)来到push eax，就可以知道eax里是我们输入的名字，那么下面那个call是检查你输入的Name是否符合
要求！
-->OK,我们在往下看一些程序片段！

我们来到这里：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A0FD(C)
|
:0040A0E2 3975FC cmp dword ptr [ebp-04], esi
:0040A0E5 741D je 0040A104
:0040A0E7 8B55EC mov edx, dword ptr [ebp-14]
:0040A0EA 8BC8 mov ecx, eax
:0040A0EC 83E17F and ecx, 0000007F
:0040A0EF 03348A add esi, dword ptr [edx+4*ecx]
:0040A0F2 40 inc eax -->在这里,看esi寄存器的值,就是注册码的16进制形式!
:0040A0F3 3DFF0F0000 cmp eax, 00000FFF
:0040A0F8 A3B8544600 mov dword ptr [004654B8], eax
:0040A0FD 72E3 jb 0040A0E2
:0040A0FF 3975FC cmp dword ptr [ebp-04], esi
:0040A102 7547 jne 0040A14B

-->这一端就是比对注册码的地方，我们同样可以使用天意II来下断点获得我们的注册码，这个程序在这里
可以生成很多注册码，所以，我们就开始捕捉行动！
：(1)在40a0e2处下断点，bpx 40a0e2！
(2)从天意II的调试环境中,可以发现这段程序会生成很多个注册码,太多了!
我们只要其中一个!就可以了!
(3)我们用crackcode2000来制作一个注册机就可以给任何想要自己注册码朋友使用了!
我的注册码:
Name:wind[CCG]
Code:634315452

附上crackcode2000配置文件:
[Options]
CommandLine=readbook.exe
Mode=1
First_Break_Address=40A0F2
First_Break_Address_Code=40
First_Break_Address_Code_Lenth=1
Save_Code_Address=ESI
/*这是wind安全网斑竹制作的注册器!http://biggow.8u8.com*/


Winzip8.0

标 题:我写了一个Winzip8.0的注册机供大家参考 (225字)
发信人:floatsnow
时 间:2001-4-9 22:43:17
详细信息:
[Options]
CommandLine=winzip32.exe
Mode=2
First_Break_Address=407AA9
First_Break_Address_Code=56
First_Break_Address_Code_Lenth=1
Second_Break_Address=4692F3
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDI
标 题:修改一下!差点误人子弟,sorry! (1千字)
发信人:peterchen
时 间:2001-4-10 6:42:02
详细信息:
------------------------------------------------------------------------------------
PeterChen:
以上是个人总结,学习就是要好好的总结才能得出新的好经验!
[Options]
CommandLine=
Mode=
First_Break_Address=
First_Break_Address_Code=
First_Break_Address_Code_Lenth=
Save_Code_Address=
-------------------------------------------------------------------------------------
整个注册机程序内容就是这些内容!
CommandLine 这是被取注册码的EXE文件名
Mode 采用模式读取注册码
First_Break_Address 放输入密码或者是ID (假的密码),的地址!
First_Break_Address_Code 通过是取输入汇编内容,的十六值(机器码)
前两个代码!也就是1byet长度!
First_Break_Address_Code_Lenth 这是填长度,由于是取代码
总长度是2,才对一时之把字符串
与汉字混淆了!数字与字母都是
一个才半个字节才对.
Save_Code_Address 就是放真正密码的地址或者是寄存器
大一致上就是这样了,其它模式大小同理!
不过要注意只能作用trw2000 or sice,直接找到密码软件的注册机
也许只能作出用"d"找到密码的注册机!
--------------------------------------------------------------------------------------


美萍反黄卫士2.26

 标 题:标志位法破解----美萍反黄卫士2.26 (4千字)
发信人:8989
时 间:2001-7-27 20:22:44
详细信息:
标志位法破解----美萍反黄卫士2.26

作者fpx[CCG]
主页fpxfpx.longcity.net

应一个朋友之邀而写.我已经有几个月没写过破解心得了,写教程比破解累多了.
最近喜欢同门的6767兄,高产;破解勇,详细
http://www.mpsoft.net/killporn22.exe
破解工具w32dasm,unaspack
1.unaspack脱壳 我的主页可下载中文版unaspack
2.w32dasm反汇编,串式参考
"未注册版本只能使用30天，现在还剩"

:00475365 8B08 mov ecx, dword ptr [eax]
:00475367 FF5158 call [ecx+58]
:0047536A 833D44C2470000 cmp dword ptr [0047C244], 00000000 ======47c244为标志位
:00475371 0F8504010000 jne 0047547B 跳到已注册
:00475377 E8D0C0FFFF call 0047144C
:0047537C A354C24700 mov dword ptr [0047C254], eax

* Possible StringData Ref from Code Obj ->"未注册版本只能使用30天，现在还剩"
|
:00475381 68F8584700 push 004758F8
:00475386 8D55AC lea edx, dword ptr [ebp-54]
:00475389 A158C24700 mov eax, dword ptr [0047C258]
:0047538E 2B0554C24700 sub eax, dword ptr [0047C254]
:00475394 40 inc eax
:00475395 E81635F9FF call 004088B0
:0047539A FF75AC push [ebp-54]
:0047539D 6824594700 push 00475924
:004753A2 8D45B0 lea eax, dword ptr [ebp-50]
:004753A5 BA03000000 mov edx, 00000003
:004753AA E889EBF8FF call 00403F38
:004753AF 8B55B0 mov edx, dword ptr [ebp-50]
:004753B2 8B8380030000 mov eax, dword ptr [ebx+00000380]
:004753B8 E88BA6FBFF call 0042FA48
:004753BD 8B1554C24700 mov edx, dword ptr [0047C254]
:004753C3 8B8378030000 mov eax, dword ptr [ebx+00000378]
:004753C9 E81261FEFF call 0045B4E0
:004753CE A158C24700 mov eax, dword ptr [0047C258]
:004753D3 83E80F sub eax, 0000000F
:004753D6 3B0554C24700 cmp eax, dword ptr [0047C254]
:004753DC 7D50 jge 0047542E
:004753DE 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"注册信息"
|
:004753E0 6828594700 push 00475928

* Possible StringData Ref from Code Obj ->"软件试用期还剩"
|
:004753E5 683C594700 push 0047593C
:004753EA 8D55A4 lea edx, dword ptr [ebp-5C]
:004753ED A158C24700 mov eax, dword ptr [0047C258]
:004753F2 40 inc eax
:004753F3 2B0554C24700 sub eax, dword ptr [0047C254]
:004753F9 E8B234F9FF call 004088B0
:004753FE FF75A4 push [ebp-5C]
:00475401 6824594700 push 00475924

* Possible StringData Ref from Code Obj ->",请赶快向美萍公司注册(0371-8749676)"
|
:00475406 6854594700 push 00475954

3.w32dasm查找菜单,从头查找47c244

:00474F36 8B06 mov eax, dword ptr [esi]
:00474F38 E807ACFDFF call 0044FB44
:00474F3D 8D55D4 lea edx, dword ptr [ebp-2C]
:00474F40 A1F4D94700 mov eax, dword ptr [0047D9F4]
:00474F45 E822C7FFFF call 0047166C
:00474F4A 8B55D4 mov edx, dword ptr [ebp-2C] ****
:00474F4D A1F8D94700 mov eax, dword ptr [0047D9F8]****
:00474F52 E831F0F8FF call 00403F88 ****=>追入===========
:00474F57 7513 jne 00474F6C ****
:00474F59 E816D3FFFF call 00472274
:00474F5E 84C0 test al, al
:00474F60 750A jne 00474F6C
:00474F62 C70544C2470001000000 mov dword ptr [0047C244], 00000001 =========标志位,置1

4.上面****为破解经典句式(你若看到了一点感觉都没有,破解算是白学了)
:00403F88 53 push ebx
:00403F89 56 push esi
:00403F8A 57 push edi
:00403F8B 89C6 mov esi, eax
:00403F8D 89D7 mov edi, edx
:00403F8F 39D0 cmp eax, edx ===========
:00403F91 0F848F000000 je 00404026

5.crackcode作注册机

[Options]
CommandLine=shield.exe
Mode=2
First_Break_Address=474F52 =========
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=403F8F =========
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX

2001.7.27


美萍反黄专家2.0

 标 题:很久没来这了，上一篇美萍反黄专家2.0注册码破解 (8千字)
发信人:conanxu[BCG]
时 间:2001-7-19 18:22:24
详细信息:
美萍反黄专家2.0注册码破解
:0046FA81 B978FF4600 mov ecx, 0046FF78
:0046FA86 8B15E0794700 mov edx, dword ptr [004779E0]
:0046FA8C E8AF43F9FF call 00403E40
:0046FA91 8B55D4 mov edx, dword ptr [ebp-2C]
:0046FA94 8B839C030000 mov eax, dword ptr [ebx+0000039C]
:0046FA9A 8B8008020000 mov eax, dword ptr [eax+00000208]
:0046FAA0 8B08 mov ecx, dword ptr [eax]
:0046FAA2 FF5158 call [ecx+58]
:0046FAA5 8D55D0 lea edx, dword ptr [ebp-30]
:0046FAA8 A1E8794700 mov eax, dword ptr [004779E8]
:0046FAAD E87AD1FFFF call 0046CC2C
:0046FAB2 8B55D0 mov edx, dword ptr [ebp-30]
:0046FAB5 A1EC794700 mov eax, dword ptr [004779EC]
:0046FABA E84544F9FF call 00403F04 -->这个CALL有点可疑，进入
:0046FABF 750A jne 0046FACB
:0046FAC1 C705F45E470001000000 mov dword ptr [00475EF4], 00000001 -->让475EF4为1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046FABF(C)
|
:0046FACB A1E8794700 mov eax, dword ptr [004779E8]
:0046FAD0 E8B7C0FFFF call 0046BB8C
:0046FAD5 48 dec eax
:0046FAD6 7507 jne 0046FADF
:0046FAD8 33C0 xor eax, eax
:0046FADA A3F45E4700 mov dword ptr [00475EF4], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046FAD6(C)
|
:0046FADF 833DF45E470000 cmp dword ptr [00475EF4], 00000000
:0046FAE6 0F8504010000 jne 0046FBF0 -->跳往已注册版本
:0046FAEC E81BCFFFFF call 0046CA0C
:0046FAF1 A3F85E4700 mov dword ptr [00475EF8], eax

* Possible StringData Ref from Code Obj ->"未注册版本只能使用30天，现在还剩"
|
:0046FAF6 688CFF4600 push 0046FF8C
:0046FAFB 8D55C8 lea edx, dword ptr [ebp-38]
:0046FAFE A1FC5E4700 mov eax, dword ptr [00475EFC]
:0046FB03 2B05F85E4700 sub eax, dword ptr [00475EF8]
:0046FB09 40 inc eax
:0046FB0A E8D98CF9FF call 004087E8
:0046FB0F FF75C8 push [ebp-38]
:0046FB12 68B8FF4600 push 0046FFB8
:0046FB17 8D45CC lea eax, dword ptr [ebp-34]
:0046FB1A BA03000000 mov edx, 00000003
:0046FB1F E89043F9FF call 00403EB4
:0046FB24 8B55CC mov edx, dword ptr [ebp-34]
:0046FB27 8B83D4030000 mov eax, dword ptr [ebx+000003D4]
:0046FB2D E832FEFBFF call 0042F964
:0046FB32 8B15F85E4700 mov edx, dword ptr [00475EF8]
:0046FB38 8B83CC030000 mov eax, dword ptr [ebx+000003CC]
:0046FB3E E89DB1FEFF call 0045ACE0
:0046FB43 A1FC5E4700 mov eax, dword ptr [00475EFC]
:0046FB48 83E80F sub eax, 0000000F
:0046FB4B 3B05F85E4700 cmp eax, dword ptr [00475EF8]
:0046FB51 7D50 jge 0046FBA3
:0046FB53 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"注册信息"
|
:0046FB55 68BCFF4600 push 0046FFBC

* Possible StringData Ref from Code Obj ->"软件试用期还剩"
|
:0046FB5A 68D0FF4600 push 0046FFD0
:0046FB5F 8D55C0 lea edx, dword ptr [ebp-40]
:0046FB62 A1FC5E4700 mov eax, dword ptr [00475EFC]
:0046FB67 40 inc eax
:0046FB68 2B05F85E4700 sub eax, dword ptr [00475EF8]
:0046FB6E E8758CF9FF call 004087E8
:0046FB73 FF75C0 push [ebp-40]
:0046FB76 68B8FF4600 push 0046FFB8

* Possible StringData Ref from Code Obj ->",请赶快向美萍公司注册(0371-8749676)"
|
:0046FB7B 68E8FF4600 push 0046FFE8
:0046FB80 8D45C4 lea eax, dword ptr [ebp-3C]
:0046FB83 BA04000000 mov edx, 00000004
:0046FB88 E82743F9FF call 00403EB4
:0046FB8D 8B45C4 mov eax, dword ptr [ebp-3C]
:0046FB90 E82344F9FF call 00403FB8
:0046FB95 50 push eax
:0046FB96 8BC3 mov eax, ebx
:0046FB98 E86F5EFCFF call 00435A0C
:0046FB9D 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:0046FB9E E89D75F9FF Call 00407140

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046FB51(C)
|
:0046FBA3 A1F85E4700 mov eax, dword ptr [00475EF8]
:0046FBA8 3B05FC5E4700 cmp eax, dword ptr [00475EFC]
:0046FBAE 7E40 jle 0046FBF0

* Reference To: killporn.DllUnregisterServer, Ord:0000h
|
:0046FBB0 E83BF2FFFF Call 0046EDF0
:0046FBB5 BA04000000 mov edx, 00000004
:0046FBBA 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:0046FBC0 E8E3A3FBFF call 00429FA8
:0046FBC5 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:0046FBCB E89CA3FBFF call 00429F6C
:0046FBD0 8BD0 mov edx, eax
:0046FBD2 8D4DBC lea ecx, dword ptr [ebp-44]
:0046FBD5 8BB3D8020000 mov esi, dword ptr [ebx+000002D8]
:0046FBDB 8B86FC010000 mov eax, dword ptr [esi+000001FC]
:0046FBE1 8B38 mov edi, dword ptr [eax]
:0046FBE3 FF570C call [edi+0C]
:0046FBE6 8B55BC mov edx, dword ptr [ebp-44]
:0046FBE9 8BC6 mov eax, esi
:0046FBEB E87436FEFF call 00453264

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0046FAE6(C), :0046FBAE(C)
|
:0046FBF0 833DF45E470001 cmp dword ptr [00475EF4], 00000001
:0046FBF7 0F8573010000 jne 0046FD70

* Possible StringData Ref from Code Obj ->"已注册版本"
|
:0046FBFD BA14004700 mov edx, 00470014
:0046FC02 8B83A0030000 mov eax, dword ptr [ebx+000003A0]
:0046FC08 E857FDFBFF call 0042F964
:0046FC0D 33D2 xor edx, edx
:0046FC0F 8B83CC030000 mov eax, dword ptr [ebx+000003CC]
:0046FC15 E832FCFBFF call 0042F84C
:0046FC1A 33D2 xor edx, edx
:0046FC1C 8B83D4030000 mov eax, dword ptr [ebx+000003D4]
:0046FC22 E825FCFBFF call 0042F84C
:0046FC27 8D45B8 lea eax, dword ptr [ebp-48]
:0046FC2A E851CBFFFF call 0046C780
:0046FC2F 8B55B8 mov edx, dword ptr [ebp-48]

--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------

:00403F04 53 push ebx
:00403F05 56 push esi
:00403F06 57 push edi
:00403F07 89C6 mov esi, eax
:00403F09 89D7 mov edi, edx
:00403F0B 39D0 cmp eax, edx -->EDX为正确注册码
:00403F0D 0F848F000000 je 00403FA2
:00403F13 85F6 test esi, esi
:00403F15 7468 je 00403F7F
:00403F17 85FF test edi, edi
:00403F19 746B je 00403F86
:00403F1B 8B46FC mov eax, dword ptr [esi-04]
:00403F1E 8B57FC mov edx, dword ptr [edi-04]
:00403F21 29D0 sub eax, edx
:00403F23 7702 ja 00403F27
:00403F25 01C2 add edx, eax

好像此软件序列号必须为8位
以下是CRACKCODE2000的注册器
[Options]
CommandLine=shield.exe
Mode=2
First_Break_Address=46FABA
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=403F0B
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX

conanxu[BCG]
Home Page:http://conanxu.51.net/
Email:conanxu@eastday.com


美萍网管大师

 标 题:美萍网管大师及安全卫士快速查注册码。 (1千字)
发信人:coolbadman
时 间:2001-7-18 11:18:56
详细信息:
用W23DASM，查找字符串：regnum
查到一个，不理它，再往下查。
停住后，可以看到一个经典对比：
* Possible StringData Ref from Code Obj ->"RegNum"
|
:00474455 B8FC444700 mov eax, 004744FC
:0047445A E8DDF6FFFF call 00473B3C
:0047445F 3BD8 cmp ebx, eax <--呵呵。
:00474461 750A jne 0047446D <--只改这里为9090不行，后面还有暗桩。
:00474463 B801000000 mov eax, 00000001
:00474468 E983000000 jmp 004744F0

用CRACKCODE2000，写CRACKCODE.INI内容：
[Options]
CommandLine=smenu.exe
Mode=1 //因为注册码是16进制放在内存，所以用1
First_Break_Address=47445f
First_Break_Address_Code=3B
First_Break_Address_Code_Lenth=2
Save_Code_Address=EBX

搞定。

不知道为什么美萍从2.0开始就一直用这种注册码对比方法？虽然美萍不断变换算法，对了，新版的网管大师学万象加入了“You are big pig”这种无聊的字符进入运算，你们猜是什么？是“TRW”“SICE”还有一个好象是“NTSICE”。但对比却一成不变，所以我一直用上面的方法破。不知道为什么美萍一直用aspack1.07压缩？可能他们不知道有unaspack1091，呵。

美萍检测SICE的方法是运行时检查C:\AUTOEXEC.BAT里有没有SICE的命令行。我就备份了一个空白的AUTOEXEC.BAT，装载了SICE后，备份原AUTOEXEC.BAT，把空白的AUTOEXEC.BAT放在C盘下，再运行美萍啥事都没。检测TRW是检查TRW是否装载在内存。脱壳后用ULTRAEDIT32等软件查找字符串"TRW"，会找到两个，把前几个字符是RAM的那个改为000或其他，另一个是用来加入运算的，改不改无所谓。

另：我是情狼。呵呵。


闹钟&笑话1.0

 标 题:申请加入BCG第三篇破文：闹钟&笑话1.0破解过程 (2千字)
发信人:皇贤
时 间:2001-8-1 3:39:58
详细信息:
闹钟&笑话1.0破解过程：
CRACKTOOLS：trw2000 1.23、W32DASM中文版、language 2000 V4.5
1、习惯性动作：用language 2000 V4.5查文件是否加壳，发现ASPACK2.1加壳。UNASPACK脱之。
2、习惯性动作：用W32DASM反汇编一下，看是否有线索（即注册失败与成功的提示字符串）
找到如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004822E6(C), :004822F4(C)
|
:00482310 8B45FC mov eax, dword ptr [ebp-04] //将假注册码输到EAX
:00482313 8B55F4 mov edx, dword ptr [ebp-0C] //将真注册码输到EDX
:00482316 E8D91BF8FF call 00403EF4 //真假注册码对比
:0048231B 7528 jne 00482345 //不相同则跳到失败地方
:0048231D 8B55FC mov edx, dword ptr [ebp-04]
:00482320 8BC3 mov eax, ebx
:00482322 E829010000 call 00482450
:00482327 84C0 test al, al
:00482329 741A je 00482345
:0048232B C683F402000000 mov byte ptr [ebx+000002F4], 00

* Possible StringData Ref from Code Obj ->"您已注册完成，谢谢您使用闹钟和笑话1.0!"
|
:00482332 B8B8234800 mov eax, 004823B8
:00482337 E898D3FFFF call 0047F6D4
:0048233C 8BC3 mov eax, ebx
:0048233E E8D9B0FCFF call 0044D41C
:00482343 EB0A jmp 0048234F

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048231B(C), :00482329(C)
|

* Possible StringData Ref from Code Obj ->"注册码错误!"
|
:00482345 B8E8234800 mov eax, 004823E8
:0048234A E885D3FFFF call 0047F6D4

激活TRW2000，下BPX 00482316 F5返回。

运行闹钟&笑话1.0 ，填假注册码78787878。点注册，被拦下。

F8进这个:00482316 call 00403EF4，如下：

:00403EF4 53 push ebx
:00403EF5 56 push esi
:00403EF6 57 push edi
:00403EF7 89C6 mov esi, eax
:00403EF9 89D7 mov edi, edx
:00403EFB 39D0 cmp eax, edx //呵呵~~
:00403EFD 0F848F000000 je 00403F92
:00403F03 85F6 test esi, esi
:00403F05 7468 je 00403F6F

做CRACKCODE注册机：
[Options]
CommandLine=joke.exe
Mode=2
First_Break_Address=482316
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=403EFB
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX

这个软件的注册有点象美萍。


我们都爱背单词

标 题:“我们都爱背单词”简易破解及注册机的写法 (608字)
发信人:hsf
时 间:2001-4-25 23:45:28
详细信息:
“我们都爱背单词”简易破解及注册机的写法：
：bpx hmemcpy
ctrl+N
press OK button
：bc
：pmodule
F12 press 6 times, when press 7 times goto error-show
so press 6 times ONLY.
F10 press until 4992b7,
In here ,
：d edx
can show real register code to you!
write it down in paper.and next time input the real code to him.

next we write a crackcode.ini

[Options]
CommandLine=winzip32.exe
Mode=2
First_Break_Address=407C1C
First_Break_Address_Code=BE
First_Break_Address_Code_Lenth=5
Second_Break_Address=457923
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDI

大功告成，打个Kiss!


WinImage

 标 题:WinImage密码的另一种破解——WinHex破解法 (2千字)
发信人:大唐飞侠
时 间:2001-7-12 14:15:44
详细信息:
WinImage密码的另一种破解——WinHex破解法

作者：大唐飞侠
时间：2001年7月12日

使用工具：WinHex 9.x

软件名称：WinImage
最新版本：v6.00.6000
下载地址:http://gt.onlinedown.net/down/winima60.exe
汉化版：http://newhua.ucatv.com.cn/down/ha_winimage6006000_yy.exe
操作系统：Win9x/ME/NT4/2000
软件说明：可制作、解压磁盘映像

破解步骤：
1、运行WinImage，选Options--->Registering
填Name：datang
Registration Code：70867086
点击OK,跳出注册失败信息，先不要按确定!
2、运行WinHex，点击RAM Editor或按Alt+F9，选WinImage中的Primary Memory，然后点击Text suchen
搜索字符串，填datang或70867086，点击OK，搜索过程结合F3、Page Up和Page Down边查边看，搜索
结果如下：

006BEAB0 D8 EA 6B 00 54 EE 6B 00 CB 21 FA BF F1 00 00 00 仃k.T頺.??..
006BEAC0 DC EB 6B 00 0C D1 44 00 0E 00 00 00 0C D1 44 00 茈k..袲......袲.
006BEAD0 E8 D4 44 00 10 D5 44 00 44 41 54 41 4E 47 00 00 柙D..誅.DATANG.. <---我填的Name
006BEAE0 4B B8 F7 BF 77 42 F7 BF 90 A4 FC BF 66 B8 1F 9D K各縲B骺悿f??
006BEAF0 00 00 EF 9B 00 00 BA F2 02 00 A0 7B 02 00 47 06 ..餂..候..爗..G.

...........
?
06BEBB0 FF FF FF FF DC EB 6B 00 A7 A2 43 00 CC EB 6B 00 ����茈k.БC.屉k.
006BEBC0 9C BA 44 00 62 30 5D 02 E8 D4 44 00 32 35 44 33 満D.b0].柙D.25D3
006BEBD0 30 36 32 00 00 EC 6B 00 E8 D4 44 00 62 30 5D 02 062..靕.柙D.b0].
006BEBE0 F8 ED 6B 00 02 A4 43 00 F8 EB 6B 00 F8 EC 6B 00 k...k.k.
006BEBF0 0C D1 44 00 43 17 F5 BF 32 35 44 33 30 36 32 00 .袲.C.蹩25D3062. <---我期待的注册码
006BEC00 00 00 00 00 47 06 02 00 88 00 F4 00 97 00 01 01 ....G...???..

...........

006BECD0 02 00 0B 00 00 00 FE 3D BA F2 0B 00 E8 14 0D 00 ......?候..?..
006BECE0 00 00 C2 7C 8F 2C 04 7D 97 0F 6F 04 00 00 08 00 ..聕?.}?o.....
006BECF0 00 00 08 00 02 00 A8 01 37 30 38 36 37 30 38 36 ......?70867086 <---我填的Reg Code
006BED00 00 17 BC 01 C1 01 14 7D 86 0E 27 17 26 01 A8 01 ..??.}?'.&.?
006BED10 7F 00 05 34 36 7D EB 35 01 00 00 00 DF 20 7F 00 ..46}?....?.

使用WinHex破解就那么简单，但它只能对付少数软件。
我早就使用WinHex破解过好多软件，今天写出来放在这里供大家参考，写得不好大家还请大家多多指教。


极速登录3.6

 标 题:极速登录3.6---用winHEX破解VB程序之例二 (1千字)
发信人:8989
时 间:2001-9-2 18:54:40
详细信息:
极速登录3.6---用winHEX破解VB程序之例二

下载http://61.128.193.30:8080/cgi-bin/dl.pl?url=ftp://61.128.193.30/soft/soft_netassistant/fastin.exe

VB编的程序，追踪起来很烦。郁闷之际想起winhex
1、运行fastin.exe，注册
填入姓名：fpx.yeah.net
注册码：87654321
点击立即注册，先不要关闭注册窗口!
2、运行WinHex，点击RAM Editor或按Alt+F9，选fastin中的Primary Memory，然后点击hex search搜索十六进制字符串，填入380037003600，点击确定，可惜什么也没找到
想起作者的提示，qq号不是注册号，作者的qq号是4714875
搜索十六进制字符串，填入340037003100(要学会为什么这么填），点击确定，搜索结果如下

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

00407920 16 00 00 00 31 00 33 00 37 00 30 00 32 00 37 00 ....1.3.7.0.2.7.
00407930 39 00 37 00 39 00 30 00 36 00 00 00 0E 00 00 00 9.7.9.0.6.......
00407940 38 00 38 00 30 00 34 00 31 00 30 00 31 00 00 00 8.8.0.4.1.0.1...
00407950 0E 00 00 00 38 00 38 00 33 00 39 00 37 00 37 00 ....8.8.3.9.7.7.
00407960 32 00 00 00 0E 00 00 00 38 00 38 00 32 00 34 00 2.......8.8.2.4.
00407970 30 00 37 00 34 00 00 00 0E 00 00 00 34 00 37 00 0.7.4.......4.7.
00407980 31 00 34 00 38 00 37 00 35 00 00 00 0E 00 00 00 1.4.8.7.5.......
00407990 38 00 37 00 31 00 38 00 33 00 38 00 32 00 00 00 8.7.1.8.3.8.2...
004079A0 22 00 00 00 66 00 61 00 6C 00 6C 00 69 00 6E 00 "...f.a.l.l.i.n.
004079B0 6C 00 6F 00 76 00 65 00 77 00 69 00 74 00 68 00 l.o.v.e.w.i.t.h.
004079C0 68 00 65 00 72 00 00 00 18 00 00 00 01 00 92 01 h.e.r.........?
004079D0 04 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 ................

以下是全部注册码，姓名任意
13702797906  8804101  8839772  8824074  4714875  8718382
如果没有猜错，第一个是作者的手机号，后面是作者常用电话
最后才发现，qq号也是注册号，作者和我们开了个玩笑^-^
2001。9


32BITFTP

 标 题:《32BITFTP的破解实录》==>让程序成为我们的"注册机"-->申请BCG第二篇 (5千字)
发信人:yuppc
时 间:2001-6-29 18:32:01
详细信息:
《32BITFTP的破解实录》===>让程序成为我们的"注册机"

破解作者:yuppc
破解时间:2001年6月29日
破解难度:易
注:(转载希望保持完整,文章归CCG、BCG、FCG所有)

软件概述:
1>软件名:32bitFTP(V p9.30.06)
2>软件作用(摘):介绍:这是一个强大的Internet工具，有着小巧的身体,但同样有着完美的功能,是上传/下载的FTP好工具.(支持命令模式,有丰富的状态显示)
3>评:这是一个非常好的网络软件,
4>未注册软件只有三十天的使用期,但它也是共享版中较友善的软件之一(启动时有NAG框).
5>主页:http://www.ElectraSoft.com/ or http://www.blkbox.com/~jonk/
email: FaxMail@ElectraSoft.com or jonk@blkbox.com

破解原因:昨天BCG老大要求我上传两个(关于"推箱子"游戏)的文件,我用IE传着传着就死机了(不明身份的原因:-).接着开始寻找上传FTP软件,得到了它,可是太可恶了,好象有人动过这个软件(启动时便显示注册码,并注册成功,但第二次启动时又要求注册,显示注册码错误),好到软件主页去DOWNLOAD一个原版的,……!!

破解目的:为加入CCG奋斗!(其实很多自我验证的软件都可以成为自身的注册机,只是看如何找到切入点了)

破解工具:
1>w32asm大老专版 ====>反汇编工具
2>SOFTice4.0 =====>动态调试工具
3>Hex shop =====>十六进制编辑器
4>Find 、Note =====>WINDOWS自带的查找工具
6>眼镜一副 =====>(原因:程序的字太小,保护眼睛) (有人向我扔番茄,接住----吃)^>^

破解方法:静态查找、动态分析！(让自我验证的软件都可以成为自身的注册机)

破解开始：
1>用W32asm打开32bitFTP.exe,发现其调用文件32bitftp.ini;

2>查找文件32bitftp.ini,并且发现了(它保存了你使用时要登陆的FTP地址和……):

32bitftp.ini文件部分内容(文件位置C:\WINDOWS\)：

[Configure] =======>主要的设置段
CurrentRegisterName=yuppc =====>注册名
CurrentRegisterEmailAddr=one@one.net =====>注册E-MAIL
CurrentEmailAddress=one@one.one =====>当前E-MAIL地址
CurrentUserStatus=3033353C3B3E =====>最近输入的注册码(正确注册后注册码存放位,可是明码存放呀,不注册可没有呀)
CurrentUserTmpReg=06060417 =====>假注册码(未注册时显示的临时注册码)
CurrentSession=ftp://202.xxx.xxx.xxx =====>最近连接的站点(绝密,哈)
CurrentViewer=
ThisProgramDir=D:\32BITFTP\ =======>安装目录

3>好很明显了,打开Loader,开始动态跟踪;

4>输入注册名\假E-MAIL地址\假注册码,设断hmemcpy进行跟踪;

5>跟踪到下面:

:004030F7 BF54154800 mov edi, 00481554 ======>真确注册码
:004030FC BE541E4800 mov esi, 00481E54 ======>假注册码

注:在这打命令---d edi,发现正确注册码3033353C3B3E;

6>其实到这就可以看到真假注册码了,但是……(我还要加入BCG呢,不能停)
接着看下面源码分析:

:00403101 33D2 xor edx, edx
:00403103 F3A6 repz cmpsb ======>循环比较
:00403105 0F85B2000000 jne 004031BD =======>关键跳(1),不对就跳
:0040310B BF54154800 mov edi, 00481554 ======>正确注册码地址
:00403110 83C9FF or ecx, FFFFFFFF
:00403113 F2 repnz
:00403114 AE scasb
:00403115 F7D1 not ecx
:00403117 49 dec ecx ======>ECX是真确注册码字符个数
:00403118 BF541E4800 mov edi, 00481E54 =======>假注册码地址(重点A)
^^^^^^^^
:0040311D 8BD1 mov edx, ecx ====>真注册码字符个数传到EDX中
:0040311F 83C9FF or ecx, FFFFFFFF
:00403122 F2 repnz
:00403123 AE scasb
:00403124 F7D1 not ecx
:00403126 49 dec ecx ========>ECX中是假注册码字符个数
:00403127 3BCA cmp ecx, edx =====>假真注册码字符个数比较
:00403129 0F858E000000 jne 004031BD ====>关键跳(2),不对就跳
:0040312F BF541E4800 mov edi, 00481E54 ====>将输入(假)注册码地址传给EDI(重点B)
^^^^^^^^
:
:
7>接下来软件开始调用文件32BITFTP.INI,并且把输入(假)注册码写入文件32BITFTP.INI(开始面有分析地址),以方便软件启动时的CRC校验(关键呀).
:
:

* Possible StringData Ref from Data Obj ->"32BITFTP.INI" ===>磁盘文件(C:\WINDOWS\32BITFTP.INI)
|
:0040313D 680CF94500 push 0045F90C
:
:

* Possible StringData Ref from Data Obj ->"CurrentUserStatus" ====>存放CODE的地方(上面提到过)
|
:00403157 68B0F94500 push 0045F9B0
:0040315C 83E103 and ecx, 00000003

* Possible StringData Ref from Data Obj ->"Configure" =====>(分支目的地)
|
:0040315F 6854F94500 push 0045F954
:00403164 F3 repz
:00403165 A4 movsb
:00403166 C705C03A480001000000 mov dword ptr [00483AC0], 00000001

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:02E5h =====>写入调用
^^^^^^^^^^|^^^^^^^^^^^^^^^
:00403170 FF1524324400 Call dword ptr [00443224]

* Possible StringData Ref from Data Obj ->"32bit FTP"
|
:00403176 683CFE4500 push 0045FE3C

* Possible StringData Ref from Data Obj ->"Thank you for registering " ====>成功注册提示(+我们的目的地+)
|
:0040317B 68F0E64400 push 0044E6F0

8>知道我要做什麽了吧(想一下,如果软件自动将正确的注册码写如文件32BITFTP.INI那有多棒);

9>动手(你的最爱):改动“关键跳(1)”、“重点A”、“重点B”
地址403105的0F85B2000000改为909090909090 ===>不许跳
地址403118的BF541E4800改为BF54154800 ====>改成真正注册码地址
地址40312F的BF541E4800改为BF54154800 ====>改成真正注册码地址

10>运行程序进行注册,成功注册后打开C:\WINDOWS\32bitFTP.ini文件,看看[Configure]中的CurrentRegisterName和CurrentUserStatus,是不是注册名和注册吗! :-)

11>总结:如此以来,我们就可以用软件自身作为注册机,任选注册名了!!(其实很多自我验证的软件都可以成为自身的注册机,只是看如何找到切入点了)

12>收工.

--------------作者:yuppc----------2001.6.29


3DMark2001

标 题:破解心得之3DMark2001篇 (10千字)
发信人:时空幻影
时 间:2001-4-18 14:34:06
详细信息:
破解心得之3DMark2001篇
作者：时空幻影
时间：2001年4月17日
工具：W23DASM白金版汉化版、TRW2000 v1.22注册版

用TRW2000载入3DMark2001.EXE后按F5让程序继续运行，然后点菜单中的“Register->Register 3DMark2001...”，
输入User Name：时空幻影
输入Registration Code：12345-67890-09876-54321
按Ctrl+N激活TRW2000，用BPX HMEMCPY设置断点，再按F5，点OK，程序会被拦。
输入PMODULE后再回车，进入3DMark2001的领空，再一直按F10到下面这个地方：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439CD4(C)
|
:00439D33 8B4B48 mov ecx, dword ptr [ebx+48]
:00439D36 8D542410 lea edx, dword ptr [esp+10]
:00439D3A 52 push edx
:00439D3B 8D442424 lea eax, dword ptr [esp+24]
:00439D3F 50 push eax
:00439D40 E8AB7CFDFF call 004119F0 <--按F8进入
:00439D45 83F803 cmp eax, 00000003
:00439D48 7737 ja 00439D81
:00439D4A FF2485189E4300 jmp dword ptr [4*eax+00439E18]
:00439D51 6A01 push 00000001
:00439D53 8BCD mov ecx, ebp

进入后再一直按F10到下面这个地方：

* Referenced by a CALL at Address:
|:00439D40
|
:004119F0 8B442408 mov eax, dword ptr [esp+08]
:004119F4 56 push esi
:004119F5 57 push edi
:004119F6 6A01 push 00000001
:004119F8 8BF9 mov edi, ecx
:004119FA 8B4C2410 mov ecx, dword ptr [esp+10]
:004119FE 50 push eax
:004119FF 51 push ecx
:00411A00 8BCF mov ecx, edi
:00411A02 E839030000 call 00411D40 <--按F8进入
:00411A07 8BF0 mov esi, eax
:00411A09 85F6 test esi, esi
:00411A0B 7507 jne 00411A14
:00411A0D 8BCF mov ecx, edi
:00411A0F E8ACFEFFFF call 004118C0

进入后再一直按F10到下面这个地方：

* Possible StringData Ref from Code Obj ->"竴 j"
|
:00411D42 68E2186600 push 006618E2
:00411D47 64A100000000 mov eax, dword ptr fs:[00000000]
:00411D4D 50 push eax
:00411D4E 64892500000000 mov dword ptr fs:[00000000], esp
:00411D55 83EC24 sub esp, 00000024
:00411D58 53 push ebx
:00411D59 56 push esi
:00411D5A 8BF1 mov esi, ecx
:00411D5C 57 push edi
:00411D5D 8974240C mov dword ptr [esp+0C], esi
:00411D61 E8CA21FFFF call 00403F30
:00411D66 8B00 mov eax, dword ptr [eax]
:00411D68 33DB xor ebx, ebx
:00411D6A 3BC3 cmp eax, ebx
:00411D6C 0F85E6010000 jne 00411F58
:00411D72 8B7C2444 mov edi, dword ptr [esp+44]
:00411D76 57 push edi
:00411D77 8BCE mov ecx, esi
:00411D79 E8A2FCFFFF call 00411A20 <--按F8进入
:00411D7E 84C0 test al, al
:00411D80 0F84B9010000 je 00411F3F
:00411D86 385C2448 cmp byte ptr [esp+48], bl
:00411D8A 0F848C010000 je 00411F1C
:00411D90 8B5704 mov edx, dword ptr [edi+04]
:00411D93 3BD3 cmp edx, ebx
:00411D95 7506 jne 00411D9D

进入后再一直按F10到下面这个地方：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A84(C)
|
:00411AA6 8B4C2410 mov ecx, dword ptr [esp+10]
:00411AAA 8B4904 mov ecx, dword ptr [ecx+04]
:00411AAD 8B11 mov edx, dword ptr [ecx]
:00411AAF 8D442414 lea eax, dword ptr [esp+14]
:00411AB3 50 push eax
:00411AB4 895C2430 mov dword ptr [esp+30], ebx
:00411AB8 FF520C call [edx+0C] <--按F8进入
:00411ABB 8AD8 mov bl, al
:00411ABD 8B442418 mov eax, dword ptr [esp+18]
:00411AC1 85C0 test eax, eax
:00411AC3 5F pop edi
:00411AC4 5D pop ebp
:00411AC5 741C je 00411AE3
:00411AC7 8D48FF lea ecx, dword ptr [eax-01]
:00411ACA 8A01 mov al, byte ptr [ecx]
:00411ACC 84C0 test al, al
:00411ACE 740A je 00411ADA
:00411AD0 3CFF cmp al, FF
:00411AD2 7406 je 00411ADA
:00411AD4 FEC8 dec al
:00411AD6 8801 mov byte ptr [ecx], al
:00411AD8 EB09 jmp 00411AE3

进入后再一直按F10到下面这个地方：

* Reference To: MFC42.Ordinal:0337, Ord:0337h
|
:005FE0E4 E87F290000 Call 00600A68
:005FE0E9 83C404 add esp, 00000004
:005FE0EC 8D542450 lea edx, dword ptr [esp+50]
:005FE0F0 52 push edx
:005FE0F1 6A14 push 00000014
:005FE0F3 50 push eax
:005FE0F4 8D4C241C lea ecx, dword ptr [esp+1C]
:005FE0F8 89442420 mov dword ptr [esp+20], eax
:005FE0FC E8AFA9F9FF call 00598AB0
:005FE101 8B442414 mov eax, dword ptr [esp+14]
:005FE105 83C050 add eax, 00000050
:005FE108 89442418 mov dword ptr [esp+18], eax
:005FE10C 8944241C mov dword ptr [esp+1C], eax
:005FE110 8D4C2410 lea ecx, dword ptr [esp+10]
:005FE114 51 push ecx
:005FE115 8D542434 lea edx, dword ptr [esp+34]
:005FE119 52 push edx
:005FE11A 8D442428 lea eax, dword ptr [esp+28]
:005FE11E 50 push eax
:005FE11F 8BCE mov ecx, esi
:005FE121 C644245402 mov [esp+54], 02
:005FE126 E8450A0000 call 005FEB70 <--把注册码的每个字符(除开"-")与密码表中的字符比较，
:005FE12B 84C0 test al, al 求出该字符在密码表中的序号。
:005FE12D 755B jne 005FE18A <--跳至注册码计算部分
:005FE12F 8B4C2418 mov ecx, dword ptr [esp+18]
:005FE133 8B542414 mov edx, dword ptr [esp+14]
:005FE137 51 push ecx
:005FE138 52 push edx
:005FE139 8D4C2418 lea ecx, dword ptr [esp+18]
:005FE13D C644245001 mov [esp+50], 01
:005FE142 E849ADE6FF call 00468E90
:005FE147 8B442414 mov eax, dword ptr [esp+14]
:005FE14B 50 push eax

以下为注册码计算部分：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005FE12D(C)
|
:005FE18A 8B4C2414 mov ecx, dword ptr [esp+14] <--[ECX]="12345678900987654321"中每个
字符在密码表中的序号，每个占4个字节
:005FE18E 8B5108 mov edx, dword ptr [ecx+08]
:005FE191 8B410C mov eax, dword ptr [ecx+0C]
:005FE194 8B6904 mov ebp, dword ptr [ecx+04]
:005FE197 8B742428 mov esi, dword ptr [esp+28] <--ESI为密码表的长度，即21h
:005FE19B 03C2 add eax, edx
:005FE19D 8B11 mov edx, dword ptr [ecx]
:005FE19F 03C5 add eax, ebp
:005FE1A1 03C2 add eax, edx
:005FE1A3 33D2 xor edx, edx
:005FE1A5 F7F6 div esi
:005FE1A7 8B5910 mov ebx, dword ptr [ecx+10]
:005FE1AA 3BDA cmp ebx, edx
:005FE1AC 0F8510010000 jne 005FE2C2 <--这个和以下的JNE都不能跳转，否则GAME OVER
:005FE1B2 8B511C mov edx, dword ptr [ecx+1C]
:005FE1B5 8B4120 mov eax, dword ptr [ecx+20]
:005FE1B8 8B5918 mov ebx, dword ptr [ecx+18]
:005FE1BB 03C2 add eax, edx
:005FE1BD 8B5114 mov edx, dword ptr [ecx+14]
:005FE1C0 03C3 add eax, ebx
:005FE1C2 03C2 add eax, edx
:005FE1C4 33D2 xor edx, edx
:005FE1C6 F7F6 div esi
:005FE1C8 8B6924 mov ebp, dword ptr [ecx+24]
:005FE1CB 3BEA cmp ebp, edx
:005FE1CD 0F85EF000000 jne 005FE2C2
:005FE1D3 8B5130 mov edx, dword ptr [ecx+30]
:005FE1D6 8B4134 mov eax, dword ptr [ecx+34]
:005FE1D9 03C2 add eax, edx
:005FE1DB 03412C add eax, dword ptr [ecx+2C]
:005FE1DE 034128 add eax, dword ptr [ecx+28]
:005FE1E1 33D2 xor edx, edx
:005FE1E3 F7F6 div esi
:005FE1E5 8B5938 mov ebx, dword ptr [ecx+38]
:005FE1E8 3BDA cmp ebx, edx
:005FE1EA 0F85D2000000 jne 005FE2C2
:005FE1F0 8B5110 mov edx, dword ptr [ecx+10]
:005FE1F3 8D042B lea eax, dword ptr [ebx+ebp]
:005FE1F6 03C2 add eax, edx
:005FE1F8 33D2 xor edx, edx
:005FE1FA F7F6 div esi
:005FE1FC 8B793C mov edi, dword ptr [ecx+3C]
:005FE1FF 3BFA cmp edi, edx
:005FE201 0F85B9000000 jne 005FE2C0
:005FE207 8B5124 mov edx, dword ptr [ecx+24]
:005FE20A 8D041F lea eax, dword ptr [edi+ebx]
:005FE20D 03C2 add eax, edx
:005FE20F 33D2 xor edx, edx
:005FE211 F7F6 div esi
:005FE213 8B6940 mov ebp, dword ptr [ecx+40]
:005FE216 3BEA cmp ebp, edx
:005FE218 0F85A2000000 jne 005FE2C0
:005FE21E 8D042F lea eax, dword ptr [edi+ebp]
:005FE221 03C3 add eax, ebx
:005FE223 33D2 xor edx, edx
:005FE225 F7F6 div esi
:005FE227 8B5944 mov ebx, dword ptr [ecx+44]
:005FE22A 3BDA cmp ebx, edx
:005FE22C 0F858E000000 jne 005FE2C0
:005FE232 8D042B lea eax, dword ptr [ebx+ebp]
:005FE235 03C7 add eax, edi
:005FE237 33D2 xor edx, edx
:005FE239 F7F6 div esi
:005FE23B 8B4148 mov eax, dword ptr [ecx+48]
:005FE23E 3BC2 cmp eax, edx
:005FE240 757E jne 005FE2C0
:005FE242 03C3 add eax, ebx
:005FE244 03C5 add eax, ebp
:005FE246 33D2 xor edx, edx
:005FE248 F7F6 div esi
:005FE24A 39514C cmp dword ptr [ecx+4C], edx
:005FE24D 7571 jne 005FE2C0
:005FE24F 51 push ecx
标 题:3DMark2001注册机源代码（C++ Build 5.0编译通过） (1千字)
发信人:时空幻影
时 间:2001-4-18 14:37:05
详细信息:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Passcode="ABCDEFHJKLMNPQRSTUVWXYZ0123456789";
AnsiString r;
AnsiString s1,s2,s3,s4;
int i,k,t1,t2,t3,m[5];
if (Edit1->Text=="") r="shikonghuanying@sina.com";
else
{
r=Edit1->Text.Delete(6,2);
r=r.Delete(11,2);
r=r.Delete(16,2);
r=r.Delete(3,1);
}
for (i=1,t1=0;i<5;i++)
{
k=int(r[i])%0x21;
t1=t1+k;
s1=s1+Passcode[k+1];
}
s1=s1+Passcode[t1%0x21+1];
for (i=6,t2=0;i<10;i++)
{
k=int(r[i])%0x21;
t2=t2+k;
s2=s2+Passcode[k+1];
}
s2=s2+Passcode[t2%0x21+1];
for (i=11,t3=0;i<15;i++)
{
k=int(r[i])%0x21;
t3=t3+k;
s3=s3+Passcode[k+1];
}
s3=s3+Passcode[t3%0x21+1];
m[0]=(t1+t2+t3)%0x21;
m[1]=(t2+t3+m[0])%0x21;
m[2]=(t3+m[0]+m[1])%0x21;
m[3]=(m[0]+m[1]+m[2])%0x21;
m[4]=(m[1]+m[2]+m[3])%0x21;
s4+=Passcode[m[0]+1];
s4+=Passcode[m[1]+1];
s4+=Passcode[m[2]+1];
s4+=Passcode[m[3]+1];
s4+=Passcode[m[4]+1];
Edit1->Text=s1+"-"+s2+"-"+s3+"-"+s4;
}
//---------------------------------------------------------------------------


5StarZip 2001

标 题:5StarZip 2001 破解----初学者破解入门 --- [BCG]系列 (1千字)
发信人:CrackerABC[BCG]
时 间:2001-4-13 10:07:58
详细信息:
5StarZip 2001 破解----初学者破解入门

URL http://software.wx88.net/down/5starzip2001.exe

本软件不适宜用s 30:0 l ffffffff ''搜索大法来查找注册码。
可以使用bpx hmemcpy中断的方法来注册。

下面是他的追踪过程。

1、首先输入注册信息：

NAME：CRACKERACB[BCG]
CODE：1212121212

2、然后呼出TRW2000，下bpx hmemcpy万能中断，F5返回程序空间后，点注册被拦截，开始按F12，共计14次（15次出现出错信息），接下来就是小心的按F10了，一直到下面的位置：
0167：004964C5 MOV EAX，[EBX+01C8] ；---->D EDX得到注册码： AXVFZFNAPEMFAGZ

3、需要注意的是注册码的获取，有人可能要问，为什么在这个地方下D EDX呢？语句中并没有EDX啊，呵呵，这也就是初学者应该注意的地方，时刻注意数据窗口中各个寄存器等的明亮和灰暗情况，适当的时候对明亮的寄存器下D ，可以得到注册码的哟，这仅仅是对初学者来说不断的尝试D EDX ，D EAX，D ECX 等等的，如果时间长了就可以直接找到存放注册信息的语句，省事多了。

4、本节还要学会直接下断点，这里呢是：bpx 4964C5（在上面找的啊以后用就可以直接下了），然后中断后，下D EDX就好了。

好了不多说了，今天的破解就到这里了，下课。

<----完-----> CrackerABC[BCG]


ACDSEE 2.3

 标 题:《 ACDSEE 2.3 》的另类注册码破解 高手请看最后的问题（谢了）！！！ (5千字)
发信人:RATARICE[BCG]
时 间:2001-5-26 16:38:33
详细信息:
《 ACDSEE 2.3 》的另类注册码破解
目标：ACDSEE 2.3
因为自己的机器上有用它，虽有注册码，但不是自己破的，总觉得不舒服。遂自己动手，丰衣足食！
作者：RATARICE[BCG]
工具：TRW2000 1.2
过程：
一、 运行程序，填好注册码：
name:RATARICE[BCG]
code:987654321
二、 启动TRW；CTRL+N、bpx hmemcpy、CTRL+N。
三、 点“OK”。被拦。下bd *;pmodule。代码如下：

015F:00407AA4 LEA EDX,[ESP+7C]
015F:00407AA8 PUSH DWORD 01F5
015F:00407AAD PUSH EDX
015F:00407AAE PUSH DWORD 82
015F:00407AB3 PUSH ESI
015F:00407AB4 CALL EDI
015F:00407AB6 LEA EAX,[ESP+7C]
015F:00407ABA LEA ECX,[ESP+3C]
015F:00407ABE PUSH EAX
015F:00407ABF PUSH ECX
015F:00407AC0 CALL 004072F0 ---------------------->关键CALL
015F:00407AC5 ADD ESP,BYTE +08
015F:00407AC8 TEST EAX,EAX
015F:00407ACA JNG 00407B37 ---------------------->关键跳转

追入上面的CALL。来到：

015F:004072F0 PUSH ESI
015F:004072F1 MOV ESI,[ESP+08]
015F:004072F5 PUSH ESI
015F:004072F6 MOV DWORD [004BE040],00
015F:00407300 CALL 00407330 ---------------------->可能是比较长度
015F:00407305 ADD ESP,BYTE +04
015F:00407308 TEST EAX,EAX
015F:0040730A JNZ 0040730E ---------------------->这里要跳才行
015F:0040730C POP ESI
015F:0040730D RET
015F:0040730E MOV EAX,[ESP+0C]
015F:00407312 PUSH EAX
015F:00407313 PUSH ESI
015F:00407314 PUSH DWORD 004BE450
015F:00407319 CALL 00442F10 ---------------------->关键CALL，追入！
015F:0040731E ADD ESP,BYTE +0C
015F:00407321 NEG EAX
015F:00407323 SBB EAX,EAX
015F:00407325 POP ESI
015F:00407326 NEG EAX
015F:00407328 MOV [004BE040],EAX
015F:0040732D RET

追入后，到下面：

015F:00442F10 MOV ECX,[ESP+08]
015F:00442F14 SUB ESP,84
015F:00442F1A LEA EAX,[ESP+00]
015F:00442F1E PUSH EBX
015F:00442F1F PUSH ESI
015F:00442F20 PUSH EDI
015F:00442F21 PUSH EAX
015F:00442F22 PUSH ECX
015F:00442F23 CALL 00443600
015F:00442F28 LEA EDI,[ESP+14]
015F:00442F2C OR ECX,BYTE -01
015F:00442F2F XOR EAX,EAX
015F:00442F31 ADD ESP,BYTE +08
015F:00442F34 REPNE SCASB
015F:00442F36 NOT ECX
015F:00442F38 DEC ECX
015F:00442F39 MOV EAX,2AAAAAAB
015F:00442F3E MOV ESI,ECX
015F:00442F40 IMUL ESI
015F:00442F42 MOV EAX,EDX
015F:00442F44 SHR EAX,1F
015F:00442F47 LEA EDI,[EDX+EAX+01]
015F:00442F4B XOR EDX,EDX
015F:00442F4D TEST ESI,ESI
015F:00442F4F JNG 00442F62
015F:00442F51 XOR EAX,EAX
015F:00442F53 MOV CL,[ESP+EAX+0C]------
015F:00442F57 ADD EAX,EDI |
015F:00442F59 MOV [ESP+EDX+38],CL |---------------->对名字进行处理
015F:00442F5D INC EDX | 取单数位！！！
015F:00442F5E CMP EAX,ESI |
015F:00442F60 JL 00442F53 ------------
015F:00442F62 MOV EAX,[ESP+9C]
015F:00442F69 MOV ECX,[ESP+94]
015F:00442F70 MOV BYTE [ESP+EDX+38],00
015F:00442F75 LEA EDX,[ESP+64]
015F:00442F79 PUSH BYTE +29
015F:00442F7B PUSH EDX
015F:00442F7C PUSH EAX
015F:00442F7D PUSH ECX
015F:00442F7E CALL 00442FE0 ----------------------------->对注册码进行处理。（不明白）
015F:00442F83 ADD ESP,BYTE +10
015F:00442F86 LEA ESI,[ESP+64] ------------------------->处理后的注册码 d esi 可见！
015F:00442F8A LEA EAX,[ESP+38] ------------------------->处理后的名字 d eax 可见！
015F:00442F8E MOV DL,[EAX] ------
015F:00442F90 MOV BL,[ESI] |
015F:00442F92 MOV CL,DL |
015F:00442F94 CMP DL,BL |
015F:00442F96 JNZ 00442FC7 |
015F:00442F98 TEST CL,CL |
015F:00442F9A JZ 00442FB2 |
015F:00442F9C MOV DL,[EAX+01] |
015F:00442F9F MOV BL,[ESI+01] | 把处理后的注册码和名字
015F:00442FA2 MOV CL,DL |----------------------> 进行比较
015F:00442FA4 CMP DL,BL | 一致就成功了！！！
015F:00442FA6 JNZ 00442FC7 |
015F:00442FA8 ADD EAX,BYTE +02 |
015F:00442FAB ADD ESI,BYTE +02 |
015F:00442FAE TEST CL,CL |
015F:00442FB0 JNZ 00442F8E |
015F:00442FB2 XOR EAX,EAX |
015F:00442FB4 XOR ECX,ECX |
015F:00442FB6 TEST EAX,EAX |
015F:00442FB8 SETZ CL |
015F:00442FBB MOV EAX,ECX -------
015F:00442FBD POP EDI
015F:00442FBE POP ESI
015F:00442FBF POP EBX
015F:00442FC0 ADD ESP,84
015F:00442FC6 RET
015F:00442FC7 SBB EAX,EAX
015F:00442FC9 POP EDI
015F:00442FCA SBB EAX,BYTE -01
015F:00442FCD XOR ECX,ECX
015F:00442FCF TEST EAX,EAX
015F:00442FD1 SETZ CL
015F:00442FD4 POP ESI
015F:00442FD5 MOV EAX,ECX
015F:00442FD7 POP EBX
015F:00442FD8 ADD ESP,84
015F:00442FDE RET

基本上明白了它的工作原理，但因为本人的能力有限，不能理解它对注册码的加密算法，
所以只好退之求其次了，它对名字的处理可谓简单之极！所以让处理后的名字和处理后的注册码
相等是可以做到的！
在上面 d esi 可以看到处理后的注册码，我的是A（空格）DA,所以只要名字的单数位是它们
就可以了！我填的是AB（空格）CDEA！
再点“OK”，提示注册成功！
最后：
哪位高手可以告诉我它的注册码的加密算法？？？（请写的越详细越好）


Ace FTP 1.30

标 题:贴一个教程，Ace FTP 1.30 ,菜鸟请进！ (13千字)
发信人:machoman[CCG]
时 间:2001-3-27 8:58:45
详细信息:
AceFTP 1.31软件是一个巨好的FTP工具，很多地方都有下载这个软件的注册方式非常具有典型性，很容易就可
以跟出注册。对于我machoman这样的菜鸟水平的小混混也能用它来实践写写注册机的感觉。
结果:
注册名：CCG (China Crack Group 中国人自己的破解组 ^_^)
注册码：6TYPY7-652A34-LMVJA7-YE4JYB

工具 ：
soft ice 4.05
dasm32
步骤:
我先在注册名处输入'CCG'
然后输入假注册码'31415926' (SunBird老大说的好记^_^,)

再用ice 中的bpx hmemcpy下断点。再用F12进入程序空间。然后用
bd hmemcpy 屏蔽掉这个断点
国外的软件的注册方式,温柔的一般都是通过注册名算出注册码的先看看我的注册名在哪把
在ice下用 S 30:0 L ffffffff 'CCG' 命令查找我的注册码的位置.
然后就可以看见在内存单元的一处找到你下的名字,在我的机器上是这样的,不同机器上偏移位置可能不同
30:80607612 43 43 47 00 00 00 00 00-00 00 00 00 00 00 00 00 CCG.................
接下来要做的就是对这个内存位置下断点
bpm 30: 80607612

在下面的位置可以看见以下代码。关于是如何
找到这个位置的,就需要有一点耐性,呵呵,我就是没有,所以好多软件都搞不定:_(,经常听初学者说如何找
到关键的注册码比较的位置,我要说的就是要多在内存中下断点,看看你的信息在哪里被读取处理,这样你就
会顺藤摸瓜找对地方.注册信息一般都会在内存中搬动几次的,我通过几次的查询在如下位置发现了关键的
地方,这里就可以具体分析注册码了,看见4bd321处的 CCG了吗?我就是根据它来找到注册部分的^_^
****************************************************************************
第一段程序的功能是把用户名形成密码的一个输入。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD355(C)
|
:004BD31B 8D45E4 lea eax, dword ptr [ebp-1C]
:004BD31E 8B55F4 mov edx, dword ptr [ebp-0C]//大写的 'CCG'
:004BD321 8A541AFF mov dl, byte ptr [edx+ebx-01]//顺序取其中的字符
:004BD325 E81E6CF4FF call 00403F48
:004BD32A 8B45E4 mov eax, dword ptr [ebp-1C]//分离的字符
:004BD32D 8B55EC mov edx, dword ptr [ebp-14]//串"FJ7ESTYULPVBNMCRY567AA8234452734",这就是注册码的样本字符
:004BD330 E8D76FF4FF call 0040430C//这个调用,求出根据用户名选取的字符，这里要跟进去看看分析
:004BD335 85C0 test eax, eax//这里该不为0的字符选取.
:004BD337 7E1A jle 004BD353//跳就是不需要的字符
:004BD339 8D45E0 lea eax, dword ptr [ebp-20]
:004BD33C 8B55F4 mov edx, dword ptr [ebp-0C]
:004BD33F 8A541AFF mov dl, byte ptr [edx+ebx-01]
:004BD343 E8006CF4FF call 00403F48
:004BD348 8B55E0 mov edx, dword ptr [ebp-20]
:004BD34B 8D45F0 lea eax, dword ptr [ebp-10]
:004BD34E E8D56CF4FF call 00404028

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD337(C)
|
:004BD353 43 inc ebx
:004BD354 4E dec esi//名字字符的长度减一
:004BD355 75C4 jne 004BD31B//循环取数

****************************************************************************
；注册码算法是把根据用户名字符形成的字符串的顺序每个字符在样本字符集合中查找偏移
；位置，再把偏移位置求平方加上上次的结果，再减去本身，把结果除以0x20取余，把余
；数加1，的结果在样本字符的结果偏移地址的字符作为真正注册码的一个字符。
；用数学公式表示为：
;offset_character[i]=mahine[(distance*distance-distance-last_distance)%0x20+1]
;这个公式不包刮每6个字符间隔的一个'-'字符。
|:004BD314(C)
|
:004BD357 8D45F4 lea eax, dword ptr [ebp-0C]
:004BD35A 8B55F0 mov edx, dword ptr [ebp-10]
:004BD35D E8D66AF4FF call 00403E38
:004BD362 8B45F4 mov eax, dword ptr [ebp-0C]；字符'CC'
:004BD365 E8B66CF4FF call 00404020 ；这个调用只是判断字符串的长度
:004BD36A 83F818 cmp eax, 00000018；根据注册名选取的小于24个字符吗？
:004BD36D 7D2E jge 004BD39D
:004BD36F BE18000000 mov esi, 00000018
:004BD374 2BF0 sub esi, eax//在ESI寄存器中是要添加的字符个数,凑足24个字符
:004BD376 85F6 test esi, esi
:004BD378 7E23 jle 004BD39D
:004BD37A BB01000000 mov ebx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD39B(C)
|
:004BD37F 8D45DC lea eax, dword ptr [ebp-24]
:004BD382 8B55EC mov edx, dword ptr [ebp-14]
:004BD385 8A541AFF mov dl, byte ptr [edx+ebx-01]
:004BD389 E8BA6BF4FF call 00403F48//串行添加字符的调用程序,把样本字符中符合条件的添加到CC后面凑足24个字符
:004BD38E 8B55DC mov edx, dword ptr [ebp-24]
:004BD391 8D45F4 lea eax, dword ptr [ebp-0C]
:004BD394 E88F6CF4FF call 00404028
:004BD399 43 inc ebx
:004BD39A 4E dec esi //循环记数,直到凑足24个字符为止,这个新的字符串就是用来生成注册码的输入量
:004BD39B 75E2 jne 004BD37F

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD36D(C), :004BD378(C)
|
:004BD39D 8B45F4 mov eax, dword ptr [ebp-0C]
:004BD3A0 E87B6CF4FF call 00404020
:004BD3A5 83F818 cmp eax, 00000018
:004BD3A8 7E16 jle 004BD3C0；把字符集的数据添加到用户名选
；取字符后，加24个字符。
:004BD3AA 8D45F4 lea eax, dword ptr [ebp-0C]
:004BD3AD 50 push eax
:004BD3AE B918000000 mov ecx, 00000018
:004BD3B3 BA01000000 mov edx, 00000001
:004BD3B8 8B45F4 mov eax, dword ptr [ebp-0C]
:004BD3BB E8686EF4FF call 00404228

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD3A8(C)
|
:004BD3C0 8D45F0 lea eax, dword ptr [ebp-10]
:004BD3C3 E8D869F4FF call 00403DA0
:004BD3C8 BB01000000 mov ebx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD44F(C)
|
:004BD3CD 8B45F4 mov eax, dword ptr [ebp-0C]；生成的字符串(用户名+样本字符选取)
:004BD3D0 8A4418FF mov al, byte ptr [eax+ebx-01]
:004BD3D4 8845EB mov byte ptr [ebp-15], al
:004BD3D7 8D45D8 lea eax, dword ptr [ebp-28]
:004BD3DA 8A55EB mov dl, byte ptr [ebp-15]
:004BD3DD E8666BF4FF call 00403F48
:004BD3E2 8B45D8 mov eax, dword ptr [ebp-28]；顺序取出其中的每个字符。
:004BD3E5 8B55EC mov edx, dword ptr [ebp-14]；样本字符集合地址
:004BD3E8 E81F6FF4FF call 0040430C；在样本字符集合中查找，该字符的位置
:004BD3ED 8BF0 mov esi, eax；ESI中为该字符在样本字符集合中的偏移地址
:004BD3EF 8B45EC mov eax, dword ptr [ebp-14]；样本集合地址
:004BD3F2 E8296CF4FF call 00404020；求样本字符集合的长度
:004BD3F7 50 push eax；长度为0x20,32个，它将作为取模的模数
:004BD3F8 8BC6 mov eax, esi
:004BD3FA F7EE imul esi；偏移位置求平方
:004BD3FC 2BC6 sub eax, esi；再把结果减去一个偏移地址
:004BD3FE 03C7 add eax, edi；edi中为上次的偏移位置，跟EAX求和。
:004BD400 5A pop edx；样本字符集合的长度，32个
:004BD401 8BCA mov ecx, edx
:004BD403 99 cdq
:004BD404 F7F9 idiv ecx；把上一步的结果除以32，0X20
:004BD406 8BF2 mov esi, edx；把余数放在esi中
:004BD408 46 inc esi；余数再加1
:004BD409 8BFE mov edi, esi
:004BD40B 8B45EC mov eax, dword ptr [ebp-14]；样本字符集合地址
:004BD40E 8A4430FF mov al, byte ptr [eax+esi-01]；把集合中的该位置的字
；符取出，为注册码的一个字符。
:004BD412 8845EA mov byte ptr [ebp-16], al
:004BD415 8D45D4 lea eax, dword ptr [ebp-2C]
:004BD418 8A55EA mov dl, byte ptr [ebp-16]
:004BD41B E8286BF4FF call 00403F48
:004BD420 8B55D4 mov edx, dword ptr [ebp-2C]
:004BD423 8D45F0 lea eax, dword ptr [ebp-10]
:004BD426 E8FD6BF4FF call 00404028
:004BD42B 8BC3 mov eax, ebx
:004BD42D B906000000 mov ecx, 00000006；结果位置为6的倍数加'-'字符
:004BD432 99 cdq
:004BD433 F7F9 idiv ecx
:004BD435 85D2 test edx, edx
:004BD437 7512 jne 004BD44B
:004BD439 83FB18 cmp ebx, 00000018；
:004BD43C 7D0D jge 004BD44B；
:004BD43E 8D45F0 lea eax, dword ptr [ebp-10]
:004BD441 BAD4D44B00 mov edx, 004BD4D4
:004BD446 E8DD6BF4FF call 00404028

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD437(C), :004BD43C(C)
|
:004BD44B 43 inc ebx
:004BD44C 83FB19 cmp ebx, 00000019；比较注册码转换完了吗？
:004BD44F 0F8578FFFFFF jne 004BD3CD；没完，跳到4BD3CD循环生成下一个注册码字符。
:004BD455 8B45F8 mov eax, dword ptr [ebp-08]
:004BD458 8B55F0 mov edx, dword ptr [ebp-10]
:004BD45B E89469F4FF call 00403DF4
:004BD460 33C0 xor eax, eax
:004BD462 5A pop edx
:004BD463 59 pop ecx
:004BD464 59 pop ecx
:004BD465 648910 mov dword ptr fs:[eax], edx

* Possible StringData Ref from Code Obj ->"_^["
|
:004BD468 6897D44B00 push 004BD497

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD495(U)
|
:004BD46D 8D45D4 lea eax, dword ptr [ebp-2C]
:004BD470 BA05000000 mov edx, 00000005
:004BD475 E84A69F4FF call 00403DC4
:004BD47A 8D45EC lea eax, dword ptr [ebp-14]
:004BD47D BA03000000 mov edx, 00000003
:004BD482 E83D69F4FF call 00403DC4
:004BD487 8D45FC lea eax, dword ptr [ebp-04]
:004BD48A E81169F4FF call 00403DA0
:004BD48F C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD39B(C)
****************************************************************************
//以下的汇编程序段的作用是：把用户输入的用户名串行化在样本字符集合中进行查表，如
//用户名字符在样本字符集合中存在就把该字符记录下来返回后保存在数组，若不在就返回
//EAX为零，不保存。
:0040430C 85C0 test eax, eax//字符为0吗？
:0040430E 7440 je 00404350
:00404310 85D2 test edx, edx//串存在吗？
:00404312 7431 je 00404345
:00404314 53 push ebx
:00404315 56 push esi
:00404316 57 push edi
:00404317 89C6 mov esi, eax
:00404319 89D7 mov edi, edx
:0040431B 8B4FFC mov ecx, dword ptr [edi-04]
:0040431E 57 push edi
:0040431F 8B56FC mov edx, dword ptr [esi-04]
:00404322 4A dec edx
:00404323 781B js 00404340
:00404325 8A06 mov al, byte ptr [esi]
:00404327 46 inc esi
:00404328 29D1 sub ecx, edx
:0040432A 7E14 jle 00404340

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040433E(U)
|
:0040432C F2 repnz
:0040432D AE scasb
:0040432E 7510 jne 00404340
:00404330 89CB mov ebx, ecx
:00404332 56 push esi
:00404333 57 push edi
:00404334 89D1 mov ecx, edx
:00404336 F3 repz
:00404337 A6 cmpsb
:00404338 5F pop edi
:00404339 5E pop esi
:0040433A 740C je 00404348//要记录的字符。
:0040433C 89D9 mov ecx, ebx
:0040433E EBEC jmp 0040432C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404323(C), :0040432A(C), :0040432E(C)
|
:00404340 5A pop edx
:00404341 31C0 xor eax, eax
:00404343 EB08 jmp 0040434D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404312(C)
|
:00404345 31C0 xor eax, eax
:00404347 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040433A(C)
|
:00404348 5A pop edx
:00404349 89F8 mov eax, edi
:0040434B 29D0 sub eax, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404343(U)
|
:0040434D 5F pop edi
:0040434E 5E pop esi
:0040434F 5B pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040430E(C)
|
:00404350 C3 ret

后记：程序把用户名和注册号放在注册表中的
HKEY_CURRENT_USER\Software_Visicom Media\AceExpertFTP\Registration
注册机及原代码附在后面

标 题:注册机，感谢gfh[CCG],yeah2000[CCG]两位师兄指点^_^! (2千字)
发信人:machoman[CCG]
时 间:2001-3-27 9:02:07
详细信息:

 //编译方法  cl ace_jm.c user32.lib
#include<windows.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
char *dpoint,*dpoint1,*point,*point1,charstr[100],covert[100],username[100],char1,convertname[100];
DWORD k,wwf,wwf2,rtn2,len,number,i,j,rtn,lena,charmm;

char *rtww;
//机器注册码字符集合
LPSTR machine="FJ7ESTYULPVBNMCRY567AA8234452734";

void main(void)
{
//第一部分程序是在ace1.30中用户名的变换算法，在程序中把用户名的变换字符跟注册码的数据交换
//算法进行比较，如果正确则注册成功。它只是把用户名字符串的长度进行截取。根据长度算出的间隔长
//度，取出比较字符。
///////////////////////////////////////////////////////////////////////////////////////////
printf("please input big characters:\n");
scanf("%s",charstr);
getchar();
strcpy(username,charstr);
/*********************************************************************************/
//把输入的小写变成大写字符，这个程序第一次出
number=lstrlen(username);
if(number<5)
{printf("please input user name characters
    can 't lower 5 NULL\n");
return;
}
point=&char1;
point1=convertname;
for(i=0;i<number;i++)
{
point=&username[i];
rtn=IsCharAlpha(*point);
if(rtn==0)
{printf("IsCharAlpha
    error");
return;
}
CharUpper(point);
*point1=*point;
point1=point1+1;
}

/*********************************************************************************/
//下面的这段程序是把用户输入的用户名在密码字符集合中进行查表，如用户名字符在密码字符集合中存
//在就把该字符保存在数组convert中，并把其后的空间顺序用密码字符集合添加满24个字符。
strcpy(charstr,convertname);
printf("%s",convertname);
len=strlen(charstr);
point=charstr;
k=0;
for (i=0;i<=len;i++,point++)
{rtww=strchr(machine,*point);
if(rtww!=0)
{
covert[k++]=*point;}
}
lena=lstrlen(covert);
strncpy(&covert[lena],machine,24-lena);
//printf("\nthe string is:%s\n",covert);
/*********************************************************************************/
//下面的程序段是在字符集中定位字符，并按6个一组进行分组排列成注册码。
point=covert;
point1=machine;
dpoint1=username;
wwf2=0;
for (i=0;i<24;i++,point++,dpoint1++)
{
rtww=strchr(machine,*point);
if(rtww!=0)
{ wwf=rtww-point1+1;
number=(wwf*wwf-wwf+wwf2)%0x20+1;
wwf2=number;
dpoint=point1+wwf2-1;
*dpoint1=*dpoint;
if((i+1)%6==0&&i<23)
*(++dpoint1)=0x2d;
}
}
printf("\nresult string:%s\n",username);
}


AcqURL 5.1

 标 题:转贴 Ronnier 的 AcqURL 5.1 注册黑名单的破解 (7千字)
发信人:fishs
时 间:2001-5-14 22:52:08
详细信息:
软件名称：AcqURL 5.1 汉化版
下载地址：http://fishs.guomai.sh.cn/soft/wl/pacqurl51-f.exe (830kb)
软件介绍：很不错的书签工具。
破解目的：用老版本的注册机生成的注册码注册时，过一段时间就会跳出警告框，说检测到一个非法的注册码。
破解工具：W32Dsm89

用 W32Dsm 反汇编 AcqURL.exe 文件，如果没有破解而使用网上的注册码，点击一个书签后会弹出“XXX（当前用户名） You have been identified...”这样一个对话框，所以，在 W32Dsm 中用查找->查找文本查找 You have been identified，可以找到就一处调用，为了方便说明我把整块相关代码都给抄出来，而找到的地方在这块代码的最后（注意找找哦^_^）：

:0051746F E8BCB8EEFF call 00402D30
:00517474 8BF0 mov esi, eax
:00517476 81FEBFD8A700 cmp esi, 00A7D8BF
:0051747C 0F8FFD000000 jg 0051757F
:00517482 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"Hex19571"
|
:00517485 BAA0775100 mov edx, 005177A0
:0051748A E8E1CAEEFF call 00403F70
:0051748F 0F84EA000000 je 0051757F
:00517495 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"$1957197"
|
:00517498 BAB4775100 mov edx, 005177B4
:0051749D E8CECAEEFF call 00403F70
:005174A2 0F84D7000000 je 0051757F
:005174A8 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"12345432"
|
:005174AB BAC8775100 mov edx, 005177C8
:005174B0 E8BBCAEEFF call 00403F70
:005174B5 0F84C4000000 je 0051757F
:005174BB 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000323"
|
:005174BE BADC775100 mov edx, 005177DC
:005174C3 E8A8CAEEFF call 00403F70
:005174C8 0F84B1000000 je 0051757F
:005174CE 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000347"
|
:005174D1 BAF0775100 mov edx, 005177F0
:005174D6 E895CAEEFF call 00403F70
:005174DB 0F849E000000 je 0051757F
:005174E1 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000360"
|
:005174E4 BA04785100 mov edx, 00517804
:005174E9 E882CAEEFF call 00403F70
:005174EE 0F848B000000 je 0051757F
:005174F4 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000423"
|
:005174F7 BA18785100 mov edx, 00517818
:005174FC E86FCAEEFF call 00403F70
:00517501 747C je 0051757F
:00517503 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000452"
|
:00517506 BA2C785100 mov edx, 0051782C
:0051750B E860CAEEFF call 00403F70
:00517510 746D je 0051757F
:00517512 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000489"
|
:00517515 BA40785100 mov edx, 00517840
:0051751A E851CAEEFF call 00403F70
:0051751F 745E je 0051757F
:00517521 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000702"
|
:00517524 BA54785100 mov edx, 00517854
:00517529 E842CAEEFF call 00403F70
:0051752E 744F je 0051757F
:00517530 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000703"
|
:00517533 BA68785100 mov edx, 00517868
:00517538 E833CAEEFF call 00403F70
:0051753D 7440 je 0051757F
:0051753F 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000893"
|
:00517542 BA7C785100 mov edx, 0051787C
:00517547 E824CAEEFF call 00403F70
:0051754C 7431 je 0051757F
:0051754E 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10000931"
|
:00517551 BA90785100 mov edx, 00517890
:00517556 E815CAEEFF call 00403F70
:0051755B 7422 je 0051757F
:0051755D 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10001148"
|
:00517560 BAA4785100 mov edx, 005178A4
:00517565 E806CAEEFF call 00403F70
:0051756A 7413 je 0051757F
:0051756C 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"10001156"
|
:0051756F BAB8785100 mov edx, 005178B8
:00517574 E8F7C9EEFF call 00403F70
:00517579 0F85E9010000 jne 00517768

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0051747C(C), :0051748F(C), :005174A2(C), :005174B5(C), :005174C8(C)
|:005174DB(C), :005174EE(C), :00517501(C), :00517510(C), :0051751F(C)
|:0051752E(C), :0051753D(C), :0051754C(C), :0051755B(C), :0051756A(C)
|
:0051757F 8D45F8 lea eax, dword ptr [ebp-08]
:00517582 8B9398040000 mov edx, dword ptr [ebx+00000498]
:00517588 8B5228 mov edx, dword ptr [edx+28]
:0051758B E8ECC6EEFF call 00403C7C
:00517590 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->" You have been identified as someone "
->"using AcqURL with an ILLEGAL registration "
->"number! "
|
:00517593 BACC785100 mov edx, 005178CC
:00517598 E8DFC6EEFF call 00403C7C
:0051759D 8D45F0 lea eax, dword ptr [ebp-10]

看到这里又一大堆跳转点了吧？就是 0051757F 那里，上面有一大堆地方条件跳转到此处，这里往下就是程序处理这些黑名单注册码的代码段了，我就不抄出来了，您看看就清楚了，大概就是修改 REG.DAT，把软件改为 Expired，并在 ACQ.INI 中添上一个 [Check] 段，加入变量 Crack，值为此注册码在黑名单中的序号，把当前书签文件复制到 C:\bdatab.dat，然后破坏当前书签文件等等吧，具体我也看不懂，因为俺不会编程。^O^
OK, OK, 来看看破解方法，0051757F 的上面，就是 00517579 那里，有一个非零跳转到 00517768，这里 00517768 开始就是正常的启动浏览器打开 URL 的程序段了。那么，找到刚才那一大堆的条件跳转的第一个，就是 0051747C 这里，把原来的 jg 0051757F 改为 jmp 00517768，这样就永远跳过这段处理非法注册码的程序段了。代码这么算：先把目标地址减去指令地址，00517768-0051747C=2EC，由于这条 jmp 指令本身长度为 5，所以再减 5，2EC-5=2E7，这就是相对偏移了。所以把原来的 0F8FFD000000 改为 E9E7020000，E9 是 jmp，后面是相对偏移，字节少一个，补上一个 nop，就是 90，搞定。：）
嗯，我所理解的就是这样了，因为自己也不会编程，所以都是些自己的理解，如果哪里说错了千万别笑我哦。^_^

Ronnier
http://ronnier.yeah.net/


Active Ebook Compiler4.01

 标 题:Active Ebook Compiler的注册算法 (14千字)
发信人:henryw
时 间:2001-5-9 12:30:42
详细信息:
[软件名称]
ACTIVEBOOK COMPILER 4.01
[下载地址]
http://www.ans2000.com/

感觉上和做成chm没什么特别大的区别。无非是变成了exe文件，变成共享文件（I hate it!），用
VBScript或者JAVAScript 编辑起来会更容易一点。不过它的Search功能可远远不如chm的。不过也算是
一个不错的东东了。

下面是Active Ebook Compiler的注册算法，如有不当指出，请大家指正。
注册码分两部分，和注册时填入的方式是一样的。
1. 数字部分，8位
2. 字母部分，9位
数字4-8位的计算需要查表，表的位置在49547C - 4956BB。

字母部分计算完成后会将顺序倒转。

注册成功后注册信息会写入window目录下面的asn2000.ini文件中。

* Referenced by a CALL at Addresses:
|:0041035A , :0041AB95 , :0041FEDA , :00437FE0
|
:0042AD00 81EC00010000 sub esp, 00000100
:0042AD06 53 push ebx
:0042AD07 56 push esi
:0042AD08 8BB4240C010000 mov esi, dword ptr [esp+0000010C] <--- UserID，5位
:0042AD0F B90A000000 mov ecx, 0000000A <--- A放入ecx
:0042AD14 C744240800000000 mov [esp+08], 00000000
:0042AD1C 6A00 push 00000000
:0042AD1E 8D4601 lea eax, dword ptr [esi+01] <--- nc+1放入eax
:0042AD21 56 push esi
:0042AD22 99 cdq
:0042AD23 F7F9 idiv ecx <--- eax除以ecx，余数在edx
:0042AD25 B840420F00 mov eax, 000F4240
:0042AD2A 6A08 push 00000008
:0042AD2C 2BC6 sub eax, esi <--- F4240 - UserID 放在eax
:0042AD2E 80C230 add dl, 30
:0042AD31 88542414 mov byte ptr [esp+14], dl <--- 数字部分第1位
:0042AD35 99 cdq
:0042AD36 F7F9 idiv ecx <--- eax除以ecx，余数在edx
:0042AD38 8D0476 lea eax, dword ptr [esi+2*esi] <--- 3*UserID放入eax，
:0042AD3B 80C230 add dl, 30
:0042AD3E 88542415 mov byte ptr [esp+15], dl <--- 数字部分第2位
:0042AD42 99 cdq
:0042AD43 F7F9 idiv ecx <--- eax除以ecx，余数在edx
:0042AD45 80C230 add dl, 30
:0042AD48 88542416 mov byte ptr [esp+16], dl <--- 数字部分第3位
:0042AD4C 8D542414 lea edx, dword ptr [esp+14]
:0042AD50 52 push edx
:0042AD51 E81AECFFFF call 00429970 <--------计算其余的数字部分
:0042AD56 6A00 push 00000000
:0042AD58 8D442424 lea eax, dword ptr [esp+24]
:0042AD5C 6A08 push 00000008
:0042AD5E 50 push eax
:0042AD5F 56 push esi
:0042AD60 E86BEAFFFF call 004297D0 <--------计算字母部分
:0042AD65 8BB42430010000 mov esi, dword ptr [esp+00000130]
:0042AD6C 83C420 add esp, 00000020
:0042AD6F 8D442408 lea eax, dword ptr [esp+08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042AD95(C)
|
:0042AD73 8A10 mov dl, byte ptr [eax]
:0042AD75 8A1E mov bl, byte ptr [esi]
:0042AD77 8ACA mov cl, dl
:0042AD79 3AD3 cmp dl, bl
:0042AD7B 752E jne 0042ADAB
:0042AD7D 84C9 test cl, cl
:0042AD7F 7416 je 0042AD97
:0042AD81 8A5001 mov dl, byte ptr [eax+01]
:0042AD84 8A5E01 mov bl, byte ptr [esi+01]
:0042AD87 8ACA mov cl, dl
:0042AD89 3AD3 cmp dl, bl
:0042AD8B 751E jne 0042ADAB
:0042AD8D 83C002 add eax, 00000002
:0042AD90 83C602 add esi, 00000002
:0042AD93 84C9 test cl, cl
:0042AD95 75DC jne 0042AD73

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042AD7F(C)
|
:0042AD97 33C0 xor eax, eax
:0042AD99 33C9 xor ecx, ecx
:0042AD9B 85C0 test eax, eax
:0042AD9D 0F94C1 sete cl
:0042ADA0 5E pop esi
:0042ADA1 8BC1 mov eax, ecx
:0042ADA3 5B pop ebx
:0042ADA4 81C400010000 add esp, 00000100
:0042ADAA C3 ret

-------------------------------------------------------------------------------------
数字部分4-8位的计算：

* Referenced by a CALL at Addresses:
|:0042AD51 , :0042AEB7 , :0042AF87 , :0042B051 , :0042B127
|:0042B1F1 , :0042B308 , :0042B3D1 , :0042B4A7 , :0042B571
|:0042B641 , :0042B7A7 , :0042B877 , :0042B941 , :0042BA14
|:0042BAE7 , :0042BBB1 , :0042BCC8 , :0042BD91 , :0042BE67
|:0042BF31
|
:00429970 8B44240C mov eax, dword ptr [esp+0C] <----- UserID放入eax
:00429974 2507000080 and eax, 80000007
:00429979 7905 jns 00429980 <----- 正数的话就跳
:0042997B 48 dec eax
:0042997C 83C8F8 or eax, FFFFFFF8
:0042997F 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00429979(C)
|
:00429980 8B4C2408 mov ecx, dword ptr [esp+08] <----- 8放入ecx
:00429984 8D14C8 lea edx, dword ptr [eax+8*ecx] <----- eax+8*8放入edx
:00429987 8B442404 mov eax, dword ptr [esp+04]
:0042998B 80C130 add cl, 30
:0042998E 8D14957C544900 lea edx, dword ptr [4*edx+0049547C] <---- edx中是表地址
:00429995 884803 mov byte ptr [eax+03], cl <---- 数字部分第4位
:00429998 8A0A mov cl, byte ptr [edx] <---- 表的内容，送一个字节进cl
:0042999A 884804 mov byte ptr [eax+04], cl <---- 数字部分第5位
:0042999D 8A4A01 mov cl, byte ptr [edx+01]
:004299A0 884805 mov byte ptr [eax+05], cl <---- 数字部分第6位
:004299A3 8A4C2410 mov cl, byte ptr [esp+10]
:004299A7 8A5202 mov dl, byte ptr [edx+02]
:004299AA 80C130 add cl, 30
:004299AD 885006 mov byte ptr [eax+06], dl <---- 数字部分第7位
:004299B0 884807 mov byte ptr [eax+07], cl <---- 数字部分第8位
:004299B3 8A5004 mov dl, byte ptr [eax+04] <-----------------------------
:004299B6 8A08 mov cl, byte ptr [eax] <- (5)<->(1),第5位和第1位换位置
:004299B8 8810 mov byte ptr [eax], dl <-
:004299BA 884804 mov byte ptr [eax+04], cl <-----------------------------
:004299BD 8A5005 mov dl, byte ptr [eax+05] <---- (6)<->(2)
:004299C0 8A4801 mov cl, byte ptr [eax+01]
:004299C3 885001 mov byte ptr [eax+01], dl
:004299C6 884805 mov byte ptr [eax+05], cl
:004299C9 8A5006 mov dl, byte ptr [eax+06] <---- (7)<->(3)
:004299CC 8A4802 mov cl, byte ptr [eax+02]
:004299CF 885002 mov byte ptr [eax+02], dl
:004299D2 884806 mov byte ptr [eax+06], cl
:004299D5 C3 ret
-----------------------------------------------------------------------------------
字母部分计算：
* Referenced by a CALL at Addresses:
|:00429761 , :00429AB0 , :00429C16 , :00429CE6 , :00429DB0
|:00429E86 , :00429F50 , :0042A067 , :0042A130 , :0042A206
|:0042A2D0 , :0042A3A0 , :0042A506 , :0042A5D6 , :0042A6A0
|:0042A773 , :0042A846 , :0042A910 , :0042AA27 , :0042AAF0
|:0042ABC6 , :0042AC90 , :0042AD60 , :0042AEC6 , :0042AF96
|:0042B060 , :0042B136 , :0042B200 , :0042B317 , :0042B3E0
|:0042B4B6 , :0042B580 , :0042B650 , :0042B7B6 , :0042B886
|:0042B950 , :0042BA23 , :0042BAF6 , :0042BBC0 , :0042BCD7
|:0042BDA0 , :0042BE76 , :0042BF40
|
:004297D0 81EC1C010000 sub esp, 0000011C
:004297D6 8B842420010000 mov eax, dword ptr [esp+00000120]
:004297DD 53 push ebx
:004297DE 56 push esi
:004297DF 57 push edi
:004297E0 50 push eax
:004297E1 8D4C242C lea ecx, dword ptr [esp+2C]

* Possible StringData Ref from Data Obj ->"%05d"
|
:004297E5 687C594900 push 0049597C
:004297EA 51 push ecx
:004297EB E88E820100 call 00441A7E
:004297F0 8A5C2437 mov bl, byte ptr [esp+37] <--- UserID字串第（4）位
:004297F4 8A4C2434 mov cl, byte ptr [esp+34] <--- UserID字串第（1）位
:004297F8 8A542435 mov dl, byte ptr [esp+35] <--- UserID字串第（2）位
:004297FC 80EB30 sub bl, 30
:004297FF 80E930 sub cl, 30
:00429802 885C242F mov byte ptr [esp+2F], bl <--- 保存到esp+2F处，下面用到。
:00429806 8A5C2438 mov bl, byte ptr [esp+38] <--- UserID字串第（5）位
:0042980A 80C14A add cl, 4A
:0042980D 8A442436 mov al, byte ptr [esp+36] <--- UserID字串第（3）位
:00429811 80EB30 sub bl, 30
:00429814 884C2419 mov byte ptr [esp+19], cl <--- 字母部分第（2）位
:00429818 80EA30 sub dl, 30
:0042981B B15A mov cl, 5A
:0042981D 885C2430 mov byte ptr [esp+30], bl <--- 保存到esp+30处，下面用到。
:00429821 80C34C add bl, 4C
:00429824 2ACA sub cl, dl
:00429826 885C2418 mov byte ptr [esp+18], bl <--- 字母部分第（1）位
:0042982A 8A5C242F mov bl, byte ptr [esp+2F]
:0042982E 884C241A mov byte ptr [esp+1A], cl <--- 字母部分第（3）位
:00429832 B158 mov cl, 58
:00429834 2ACB sub cl, bl
:00429836 2C30 sub al, 30
:00429838 884C241B mov byte ptr [esp+1B], cl <--- 字母部分第（4）位
:0042983C 8AC8 mov cl, al
:0042983E 80C141 add cl, 41
:00429841 8A5C2430 mov bl, byte ptr [esp+30]
:00429845 884C241C mov byte ptr [esp+1C], cl <--- 字母部分第（5）位
:00429849 B153 mov cl, 53
:0042984B 2ACA sub cl, dl
:0042984D 044B add al, 4B
:0042984F 884C241D mov byte ptr [esp+1D], cl <--- 字母部分第（6）位
:00429853 8844241E mov byte ptr [esp+1E], al <--- 字母部分第（7）位
:00429857 B059 mov al, 59
:00429859 B158 mov cl, 58
:0042985B 2AC3 sub al, bl
:0042985D 2ACA sub cl, dl
:0042985F 8844241F mov byte ptr [esp+1F], al <--- 字母部分第（8）位
:00429863 8B842440010000 mov eax, dword ptr [esp+00000140]
:0042986A 884C2420 mov byte ptr [esp+20], cl <--- 字母部分第（9）位
:0042986E 8B8C2444010000 mov ecx, dword ptr [esp+00000144]
:00429875 83C40C add esp, 0000000C
:00429878 3BC1 cmp eax, ecx
:0042987A C644241500 mov [esp+15], 00
:0042987F 743A je 004298BB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004298B9(C)
|
:00429881 85C0 test eax, eax
:00429883 7C1E jl 004298A3
:00429885 83F808 cmp eax, 00000008
:00429888 7F19 jg 004298A3
:0042988A 85C9 test ecx, ecx
:0042988C 7C15 jl 004298A3
:0042988E 83F908 cmp ecx, 00000008
:00429891 7F10 jg 004298A3
:00429893 8A5C0C0C mov bl, byte ptr [esp+ecx+0C] <--- 准备将刚才生成的字母的顺序倒过来。
:00429897 8A54040C mov dl, byte ptr [esp+eax+0C]
:0042989B 885C040C mov byte ptr [esp+eax+0C], bl
:0042989F 88540C0C mov byte ptr [esp+ecx+0C], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00429883(C), :00429888(C), :0042988C(C), :00429891(C)
|
:004298A3 48 dec eax
:004298A4 41 inc ecx
:004298A5 85C0 test eax, eax
:004298A7 7C12 jl 004298BB
:004298A9 83F808 cmp eax, 00000008
:004298AC 7F0D jg 004298BB
:004298AE 85C9 test ecx, ecx
:004298B0 7C09 jl 004298BB
:004298B2 83F908 cmp ecx, 00000008
:004298B5 7F04 jg 004298BB
:004298B7 3BC1 cmp eax, ecx
:004298B9 75C6 jne 00429881

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042987F(C), :004298A7(C), :004298AC(C), :004298B0(C), :004298B5(C)
|
:004298BB 8D7C240C lea edi, dword ptr [esp+0C]
:004298BF 83C9FF or ecx, FFFFFFFF
:004298C2 33C0 xor eax, eax
:004298C4 F2 repnz
:004298C5 AE scasb
:004298C6 F7D1 not ecx
:004298C8 2BF9 sub edi, ecx
:004298CA 8BD1 mov edx, ecx
:004298CC 8BF7 mov esi, edi
:004298CE 8BBC2430010000 mov edi, dword ptr [esp+00000130]
:004298D5 C1E902 shr ecx, 02
:004298D8 F3 repz
:004298D9 A5 movsd
:004298DA 8BCA mov ecx, edx
:004298DC 83E103 and ecx, 00000003
:004298DF F3 repz
:004298E0 A4 movsb
:004298E1 5F pop edi
:004298E2 5E pop esi
:004298E3 5B pop ebx
:004298E4 81C41C010000 add esp, 0000011C
:004298EA C3 ret
--------------------------------------------------------------------------------


adbin 1.2

 标 题:adbin 1.2 (23千字)
发信人:程式猎人
时 间:2000-9-16 23:03:53
详细信息:
AdBin V1.2
程式猎人
简介：这个是一个上网加速的软件，它可以将你访问的网站时，可以将广告进行屏障掉，所
以这样就可以增加的上网速度。
追踪：RN：01234567
对于追踪这个软件，可是花了我几天的时间才将它追踪出来。在前几天，没有将它追踪
出来，因为这个软件在破解过程中的确有一定的难度，所以那几天没有将它追踪出来。
但是昨天我又将它拿出来进行破解，因为我昨天有一种不死不归的感觉。终于将这个软件给
破解出来了，那么现在再想一下，这个软件如果要定位的话，它应当属于中上水平。现在就
来向大家介绍如何在前几天没有将它追踪出来的情况。

:00402676 E8D6080000 call 00402F51
:0040267B A180564100 mov eax, dword ptr [00415680]
:00402680 53 push ebx

* Possible StringData Ref from Code Obj ->"VWhxVA"
|
:00402681 6852734000 push 00407352
:00402686 57 push edi

* Possible Reference to Dialog: DialogID_006C
|
:00402687 6A6C push 0000006C
:00402689 50 push eax
:0040268A E883F1FFFF call 00401812
:0040268F 83F801 cmp eax, 00000001
:00402692 0F85A8000000 jne 00402740
:00402698 8D45A4 lea eax, dword ptr [ebp-5C]
:0040269B 50 push eax
:0040269C E8DF870000 call 0040AE80
:004026A1 83F80A cmp eax, 0000000A ****
:004026A4 59 pop ecx
:004026A5 7225 jb 004026CC
:004026A7 8D45A4 lea eax, dword ptr [ebp-5C]
:004026AA 50 push eax
:004026AB E8D0870000 call 0040AE80
:004026B0 83F814 cmp eax, 00000014 ***
:004026B3 59 pop ecx
:004026B4 7716 ja 004026CC
:004026B6 8D45A4 lea eax, dword ptr [ebp-5C]
:004026B9 50 push eax

* Reference To: ABKernel.SetLic, Ord:001Dh
|
:004026BA FF1500104100 Call dword ptr [00411000]
:004026C0 6A01 push 00000001

* Reference To: ABKernel.SetEnabled, Ord:001Ch
|
:004026C2 FF151C104100 Call dword ptr [0041101C]
:004026C8 59 pop ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004025D4(U)
|
:004026C9 59 pop ecx
:004026CA EB74 jmp 00402740

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004026A5(C), :004026B4(C)
|
:004026CC 53 push ebx

* Possible StringData Ref from Data Obj ->"Adbin"
|
:004026CD 6890414100 push 00414190

* Possible StringData Ref from Data Obj ->"The licence code you entered has "
->"been generated illegally."
|
:004026D2 6870424100 push 00414270
:004026D7 FFD6 call esi
现在我们当然是首先按正常的破解过程来破解它，这个软件在我刚刚破解时就发现了它是
一个比较特殊的注册过程。在上面就是这个软件的输入注册码后所进行的工作。在这里我们
将能得到什么呢？如果按照正常的注册比较过程的话，它在上面应当有比较的地方，但是在
这里我们将无法得到比较的地方，仅能得到的是比较你所输入注册码的位数值，在这里我们
可以轻松的得到这个软件所要求的位数，输入的注册码一定要满足A(H)<=RN<=14(H)，如果
你没有满足上面的要求，程序会提示你输入的注册码不正确。我现在输入的RN：0123456789
后，程序没有出现提示了。但是我追踪后发现在这里它也仅仅是比较位数，没有进行注册码
的比较。那么这个软件就成了在开始时比较注册码方式的注册方法了。这种软件的破解关键
大于找到软件在那里进行比较的地方。于是就使用W32DASM进行反汇编，想要找到关键的比
较地方，如果要让我这么轻松就找到了，那么这个软件的难度也就无法称为中上水平了。
在W中发现了
* Possible StringData Ref from Data Obj ->"Software\Paw-Print\Adbin"
程序使用注册表选项，查找相应的选项，发现了下面比较敏感的选项。
RegistrationEval:VZYmhL4l39KA
RegistrationKey:0123456789
以我个人的经验来说，只要发现这个关键的地方就可以成功一半了。这样的软件通常在程
序中使用相应的注册键值来进行运算。我于是就在W中对RegistrationKey进行查找，大家一
定会想到了这个结果就是没有查找到。那么我没有查找到这个键值，我可以查找到你使用读
取这个键的函数，我查找读取注册表的函数,但是它没有什么用处，它也无法将引导我向成
功的彼岸，没有办法了。以上就是我前几天没有将这个软件破解出来的过程。昨天我想再尝
试一下破解这个软件，这回我得到使用前几天没有用过方法对它进行破解。
现在我们再说一些破解方面的事情，对于那种使用先输入注册码，再重新启动后进行比较
的注册过程，对于我们这些破解者来说，破解它们比破解那种直接进行注册码比较的软件增
加了一定的难度，通常就是这点难度使用那些初学者或者是掌握了一定的破解方法和技艺的
人也不好破解。对于这种软件的破解关键就是找到程序在启动时，在那个函数中对我们输入
的注册码进行比较的。我们破解者面对是几千个甚至是几万个函数，我们将如何找到它的比
较地方呢。对于不同的软件应当有着不同的破解方法，但是它有着几个相似的破解方法。那
么我在这里使用的就是过期的破解方法。
大家现在向上看，你们会发现在注册表中不仅有RegistrationKey这个键值，而且还有Reg
istrationEval这个键值，那么它有什么用处呢。我不是设计者，所以我也不知道，但是破
解经验告诉我，这个键值一定与注册有关，具体什么关系我也只有试一试才知道。于是我将
这个键值中的VZYmhL4l39KA设为空，再重新启动软件，现在软件告诉你它已经过期了。那么
这就说明它的值同注册肯定有关系，我又将它copy回注册表中，重新启动软件，它没有出现
提示过期。现在我就将这个作为我向它发起攻击的突破点。
现在调出trw，用它对这个软件进行追踪。

:0040B4A6 FF1504124100 Call dword ptr [00411204]
:0040B4AC 50 push eax
:0040B4AD E8FF7AFFFF call 00402FB1 <-出错，进入
:0040B4B2 8945A0 mov dword ptr [ebp-60], eax
:0040B4B5 50 push eax
在指出的地方出错，通常我们使用这种方法进行追踪的关键是找到能不能跳过此call的地
方，向上看没有发现，于是就进入call中。下同：

:00403035 8BCB mov ecx, ebx
:00403037 E8A0180000 call 004048DC <-出错，进入
:0040303C A10C584100 mov eax, dword ptr [0041580C]

:00404921 8BCF mov ecx, edi
:00404923 E84BC9FFFF call 00401273 <-出错，进入

:004012C9 8D8D4CFFFFFF lea ecx, dword ptr [ebp+FFFFFF4C]
:004012CF E824010000 call 004013F8 <-出错，进入

:0040152B FFD7 call edi
* Reference To: ABKernel.GetStat, Ord:0015h
:0040152D FF1514104100 Call dword ptr [00411014] <-出错，进入
:00401533 83F801 cmp eax, 00000001
:00401536 7405 je 0040153D

我来到这里就出现地址的变化，因为在通常我们的地址是004?????，而现在进入到00C???
??，这个地址中。我也是现在才明白，这时进入了程序中调用的dll程序了。那么它进入那
个dll中，上面就有答案，
* Reference To: ABKernel.GetStat, Ord:0015h
这个就是关键，它一定进入ABKernel.dll中，因为在W中可以发现程序有这样一个dll文件
。因为我使用Nu来追踪，所以当时不知道它进入了那个dll，我只知道找到比较的地方，，E
xported fn(): GetStat - Ord:0016h
:10003088 E851E0FFFF call 100010DE <-出错，进入
:1000308D A158160110 mov eax, dword ptr [10011658]
:10003092 C3 ret
进入call中如下：
:100010DE E85E1E0000 call 10002F41
:100010E3 85C0 test eax, eax
:100010E5 740E je 100010F5
:100010E7 83251416011000 and dword ptr [10011614], 00000000
:100010EE 83253416011000 and dword ptr [10011634], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100010E5(C)
|
:100010F5 E900000000 jmp 100010FA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100010F5(U)
|
:100010FA 833D3416011000 cmp dword ptr [10011634], 00000000
:10001101 750A jne 1000110D
:10001103 B920160110 mov ecx, 10011620
:10001108 E8E3410000 call 100052F0 <-出错，进入

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001101(C)
|
:1000110D 833D1416011000 cmp dword ptr [10011614], 00000000
:10001114 750A jne 10001120
:10001116 B900160110 mov ecx, 10011600
:1000111B E8D0410000 call 100052F0 <-出错，进入

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001114(C)
|
:10001120 833D3416011000 cmp dword ptr [10011634], 00000000
:10001127 740D je 10001136
:10001129 833D1416011000 cmp dword ptr [10011614], 00000000
:10001130 7404 je 10001136
:10001132 33C0 xor eax, eax
:10001134 EB03 jmp 10001139

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001127(C), :10001130(C)
|
:10001136 6A01 push 00000001
:10001138 58 pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001134(U)
|
:10001139 50 push eax
:1000113A E89B1F0000 call 100030DA
:1000113F 59 pop ecx
:10001140 C3 ret
当我追踪到上面时，我终于对自己说，这个软件可能要破解成功了。因为现在我已经能够
看到胜利的曙光了。上面有push 01;pop eax这两个命令，所以它有可能表示注册成功。现
在的工作还是进入call中
:100052F0 B8D6D50010 mov eax, 1000D5D6
:100052F5 E8EA150000 call 100068E4
:100052FA 81EC10080000 sub esp, 00000810
:10005300 56 push esi
:10005301 8BF1 mov esi, ecx
:10005303 57 push edi
:10005304 8975E8 mov dword ptr [ebp-18], esi
:10005307 833E00 cmp dword ptr [esi], 00000000
:1000530A 0F8561020000 jne 10005571
:10005310 6A01 push 00000001
:10005312 5F pop edi
:10005313 6A00 push 00000000
:10005315 893E mov dword ptr [esi], edi
:10005317 E8B0FCFFFF call 10004FCC <-出错，进入
:1000531C 85C0 test eax, eax
:1000531E 59 pop ecx
:1000531F 0F844C020000 je 10005571
:10005325 53 push ebx

上面有一个比较的地方，也是这个软件出错的地方，故进入call中。

:1000516C 8D45C0 lea eax, dword ptr [ebp-40] <-0123456789
:1000516F 50 push eax
:10005170 E83B100000 call 100061B0
:10005175 83F80A cmp eax, 0000000A
:10005178 59 pop ecx
:10005179 7213 jb 1000518E
:1000517B 8D45C0 lea eax, dword ptr [ebp-40]
:1000517E 50 push eax
:1000517F E82C100000 call 100061B0
:10005184 83F814 cmp eax, 00000014 ***
:10005187 59 pop ecx
:10005188 0F86AC000000 jbe 1000523A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10005179(C)
|
:1000518E 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Adbin Licence"
|
:10005190 6830070110 push 10010730

* Possible StringData Ref from Data Obj ->"This version of Adbin from Paw-Print "
->"Software has been tampered with."
|
:10005195 6888060110 push 10010688

* Reference To: USER32.GetActiveWindow, Ord:00DDh
|
:1000519A FF1584E10010 Call dword ptr [1000E184]
:100051A0 50 push eax

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:100051A1 FF1580E10010 Call dword ptr [1000E180]
:100051A7 C7055816011004000000 mov dword ptr [10011658], 00000004
:100051B1 EB3D jmp 100051F0

当我来这里我终于对自己说，成功一半了，为什么？你们看到没有在这里我们已经可以看
到我输入的注册码了，它开始检查注册码的位数了。同我们在输入注册码时的一样，这就说
明我已经离比较的地方不远了。向下我就应当可以发现比较的地方。

:1000523A 6A01 push 00000001
:1000523C 8D45C0 lea eax, dword ptr [ebp-40]
:1000523F 5F pop edi
:10005240 57 push edi
:10005241 50 push eax <-RN：0123456789
:10005242 E8A9FCFFFF call 10004EF0
:10005247 59 pop ecx
:10005248 59 pop ecx
:10005249 33C9 xor ecx, ecx
:1000524B 3D85050000 cmp eax, 00000585 ***
:10005250 0F9DC1 setnl cl
:10005253 41 inc ecx
:10005254 8BC1 mov eax, ecx
:10005256 3BC7 cmp eax, edi
:10005258 A358160110 mov dword ptr [10011658], eax
:1000525D 0F8586000000 jne 100052E9
:10005263 6A03 push 00000003
到达这里我就知道已经到达这个软件的比较核心了。因为这里有所有我想得到的东西，一
是RN，二是比较命令。现在的任务就是找到实际注册码了，进入call中：

:10004EF0 55 push ebp
:10004EF1 8BEC mov ebp, esp
:10004EF3 83EC28 sub esp, 00000028
:10004EF6 834DF8FF or dword ptr [ebp-08], FFFFFFFF
:10004EFA 53 push ebx
:10004EFB 56 push esi
:10004EFC 57 push edi
:10004EFD 8B7D08 mov edi, dword ptr [ebp+08]
:10004F00 33DB xor ebx, ebx
:10004F02 895DFC mov dword ptr [ebp-04], ebx
:10004F05 8A07 mov al, byte ptr [edi]
:10004F07 84C0 test al, al
:10004F09 747A je 10004F85

* Possible StringData Ref from Data Obj ->"n61O0rRxdkVHt5ZwqYUzoNDmCybcghfaMLj4liT8pQ3J2I"
->"vWP9euS7BKFGEAXs"
|
:10004F0B BEB0040110 mov esi, 100104B0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F83(C)
|
:10004F10 0FBEC0 movsx eax, al
:10004F13 50 push eax
:10004F14 56 push esi
:10004F15 E856130000 call 10006270
:10004F1A 59 pop ecx
:10004F1B 85C0 test eax, eax
:10004F1D 59 pop ecx
:10004F1E 0F8490000000 je 10004FB4
:10004F24 2BC3 sub eax, ebx
:10004F26 2BC6 sub eax, esi
:10004F28 48 dec eax
:10004F29 8BC8 mov ecx, eax
:10004F2B 7903 jns 10004F30
:10004F2D 83C13E add ecx, 0000003E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F2B(C)
|
:10004F30 8D5C0B01 lea ebx, dword ptr [ebx+ecx+01]
:10004F34 83FB3E cmp ebx, 0000003E
:10004F37 7C0A jl 10004F43
:10004F39 8BC3 mov eax, ebx
:10004F3B 6A3E push 0000003E
:10004F3D 99 cdq
:10004F3E 5B pop ebx
:10004F3F F7FB idiv ebx
:10004F41 8BDA mov ebx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F37(C)
|
:10004F43 837DF8FF cmp dword ptr [ebp-08], FFFFFFFF
:10004F47 7505 jne 10004F4E
:10004F49 894DF8 mov dword ptr [ebp-08], ecx
:10004F4C EB10 jmp 10004F5E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F47(C)
|
:10004F4E 83F907 cmp ecx, 00000007
:10004F51 7F61 jg 10004FB4
:10004F53 8B45FC mov eax, dword ptr [ebp-04]
:10004F56 6BC007 imul eax, 00000007
:10004F59 03C1 add eax, ecx
:10004F5B 8945FC mov dword ptr [ebp-04], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F4C(U)
|
:10004F5E 47


ADC公司游戏

标 题:初学者请看! (2千字)
发信人:破！
时 间:2000-12-28 20:44:16
详细信息:
11期的软件杂志收录了ADC（不是ACD SYSTEM哟!呵呵...)公司的四款好玩的游戏:HEX MINES(增强的扫雷游戏),
B-PUZZLE(拼图游戏),CTRIS2000(增强版俄罗斯方块),BJIGSAW(另一类的拼图游戏).我试着破了一次以后,发现这四个游戏不光是游戏好玩,对于破解的新手来说,也是不可多得的练习品哟(就是很那个了...呵呵..),昨天我本来贴了一篇贴子讲了它们比较的地方以及如何可以看到注册码,贴出去后想想还是得再写一篇详细一点的,想我2个月前刚学破解的时候,看我自己写的那篇文章一定是什么也看不懂了,所以为了和我一样的初学者门能够尽快地跨进破解的大门,我就写了这篇非常非常初级的教程,就算你还没有任何破解的经验,照着我的文章中去做,很快就能找到了.好了,废话说到这,READY?GO!
先拿BJIGSAW来开刀吧!顺序如下:
1.运行TRW2000(什么?你没有?我倒!!!!!!!!!)
2.点击BROWSE按钮,找到"Bjigsaw.exe",再点TRW2000中的LOAD按钮.好了,看到TRW2000的窗口了吧?
3.下指令G,回车.
什么是"G"呢?顾名思义,就是GO了,就是让程序按照它原来的方向运行下去,我们什么都不干.
4.看到ADC公司做的恼人的事了吧?三个灰灰的按钮,拦住了你进入游戏的路,硬是要你等待5秒,太不近人情了!下手破 吧!
5.好了,难熬的5秒过去了,三个按钮都可以按了,下面我们选择REGISTER....按钮.好了,你可以输入注册码了.我输 的是NAME:luoyi NUMBER: 654321.这些信息你当然可以想怎么输怎么输了,不要学我,自己随便输个东西吧!
6.别急着点OK,先CTRL+M切入TRW2000中设好断点再说.这里,我们当然是用hmemcpy这个万能断点了,为什么说它是万 能的呢?因为无论你点按钮也好,输入字符也好,总得触发这个中断,所以,一般用这个断点还是比较有效的!
7.下面可以点ok了.点完之后,你会发现,你又回到trw2000中了.
8.现在你有两个选择,一个是按F12看按多少次出现失败信息,下次继续的时候把次数减一就可以了.在这个软件中是
F23次出现错误信息,所以你第二次跟的时候就按22此就可以了(可怜的显示器呀!!).另一种选择就是PMODULE!这是
TRW2000特有的命令,极大地方便了我们的破解工作,它的意思就是让代码往下走,直到走到我们正在跟的程序为止!
怎么样?很伟大的命令吧?这里,我选择了第二种方法.
9.好了,PMODULE以后,你回到了程序中了,不要急着F10往下走,先看看再说.PAGE DOWN,PAGE UP几下,????????
LSTRCMP???这不就是字符串比较吗?我们在这里下个断点,然后看看程序在调用这个API之前压了些什么参数到堆栈里.紧贴着它上面的一句就是PUSH EAX,这不是明摆着的事了么?DEAX吧!好了,在数据窗口看到注册码了吧?我看到的是:
12157468,注册码就是它了!
怎么样?很简单的事情吧?其他的几个也差不多,你自己动动手就会知道的!不过CTRIS2000得比较不和这里一样,其关键之处我已经写在我的上一篇文章中去了,具体过程我打算过几天看看情况再贴出来吧.
请多指教!


Add/Remove 4Good 2

标 题:Add/Remove 4Good 2注册码 跟踪过程，稍麻烦些---[BCG]参考教程 (12千字)
发信人:CrackerABC[BCG]
时 间:2001-4-13 20:46:02
详细信息:
Add/Remove 4Good 2注册码 跟踪过程，稍麻烦些---[BCG]入门教程

作者：CrackerABC[BCG]
作者主页：http://crackerabc.longcity.net

这个软件呢就是一个典型的跟进CALL计算子程序的例子，下面开始了。

1、首先随便输入任意注册信息：
Name：sunfeng
Code: 31415926
2、启动TRW2000，点确定后用Ctrl+N呼叫出来，然后下bpx hmemcpy
3、F5返回程序空间后，点注册被TRW2000拦截到其领域，下BD *中断所有断点。
4、开始按F12，共计23次（24次时出错），请仔细看了，

0167:004018D5 PUSH DWORD FF /////这里是你按第一次F10后的位置
0167:004018DA MOV ECX,[EBP-10]
0167:004018DD PUSH DWORD 00408460
0167:004018E2 ADD ECX,01A0
0167:004018E8 CALL `MFC40!ord_00000D36`
0167:004018ED PUSH DWORD 00408360
0167:004018F2 LEA ECX,[EBP-18]
0167:004018F5 CALL `MFC40!ord_000001E3`
0167:004018FA MOV DWORD [EBP-04],00
0167:00401901 MOV EAX,[EAX]
0167:00401903 PUSH DWORD 004085A4
0167:00401908 PUSH EAX
0167:00401909 CALL `MSVCRT40!_mbscmp`
0167:0040190F MOV DWORD [EBP-04],FFFFFFFF
0167:00401916 ADD ESP,BYTE +08
0167:00401919 CMP EAX,BYTE +01
0167:0040191C MOV EAX,[EBP-14]
0167:0040191F SBB [EBP-14],EAX
0167:00401922 NEG DWORD [EBP-14]
0167:00401925 CALL 00401A33
0167:0040192A CMP DWORD [EBP-14],BYTE +00
0167:0040192E JZ 00401949
0167:00401930 PUSH BYTE +01
0167:00401932 MOV ECX,[EBP-10]
0167:00401935 CALL `MFC40!ord_00000910`
0167:0040193A MOV EAX,[EBP-0C]
0167:0040193D POP EDI
0167:0040193E MOV [FS:00],EAX
0167:00401944 POP ESI
0167:00401945 MOV ESP,EBP
0167:00401947 POP EBP
0167:00401948 RET
0167:00401949 CALL 00401620 ////按F8跟进去这里是计算的子程序入口
0167:0040194E TEST EAX,EAX ////这里可是典型的组合啊。
0167:00401950 JZ NEAR 004019F8 ///
0167:00401956 LEA EAX,[EBP-18]

下面是跟进去的代码段：

0167:00401620 MOV EAX,[FS:00]
0167:00401626 PUSH EBP
0167:00401627 MOV EBP,ESP
0167:00401629 PUSH BYTE -01
0167:0040162B PUSH DWORD 004017A5
0167:00401630 MOV ECX,FFFFFFFF
0167:00401635 PUSH EAX
0167:00401636 MOV [FS:00],ESP
0167:0040163D SUB ESP,BYTE +0C
0167:00401640 SUB EAX,EAX
0167:00401642 PUSH EDI
0167:00401643 MOV EDI,00408360
0167:00401648 REPNE SCASB
0167:0040164A NOT ECX
0167:0040164C DEC ECX
0167:0040164D CMP ECX,BYTE +06
0167:00401650 JNC 00401663
0167:00401652 XOR EAX,EAX
0167:00401654 MOV ECX,[EBP-0C]
0167:00401657 POP EDI
0167:00401658 MOV [FS:00],ECX
0167:0040165F MOV ESP,EBP
0167:00401661 POP EBP
0167:00401662 RET
0167:00401663 MOV EDI,00408360
0167:00401668 MOV ECX,FFFFFFFF
0167:0040166D SUB EAX,EAX
0167:0040166F REPNE SCASB
0167:00401671 NOT ECX
0167:00401673 SUB EDX,EDX
0167:00401675 LEA EAX,[ECX-01]
0167:00401678 MOV ECX,0C
0167:0040167D DIV ECX
0167:0040167F MOV EAX,[0040835C]
0167:00401684 LEA ECX,[EBP-10]
0167:00401684 LEA ECX,[EBP-10] ////D ECX得到87ae2401my69，这可不是真注册码哟。和他紧挨的 //// 是感谢注册的语句，迷惑人。
0167:00401687 MOV AL,[EAX+EDX]
0167:0040168A PUSH EAX
0167:0040168B PUSH DWORD 0040859C
0167:00401690 CALL `MFC40!ord_000001E3`
0167:00401695 PUSH EAX
0167:00401696 LEA ECX,[EBP-14]
0167:00401699 MOV DWORD [EBP-04],00
0167:004016A0 PUSH ECX
0167:004016A1 CALL `MFC40!ord_00000332`
0167:004016A6 MOV BYTE [EBP-04],02
0167:004016AA CALL 0040179D
0167:004016AF MOV EDI,00408360
0167:004016B4 MOV ECX,FFFFFFFF
0167:004016B9 MOV DWORD [EBP-10],00
0167:004016C0 SUB EAX,EAX
0167:004016C2 REPNE SCASB
0167:004016C4 NOT ECX
0167:004016C6 DEC ECX
0167:004016C7 JZ 00401741
0167:004016C9 TEST BYTE [EBP-10],01
0167:004016CD JNZ 00401728
0167:004016CF MOV EAX,[EBP-10]
0167:004016D2 MOV AL,[EAX+00408360]
0167:004016D8 CMP AL,7F
0167:004016DA JG NEAR 00401773
0167:004016E0 CMP AL,20
0167:004016E2 JL NEAR 00401784
0167:004016E8 CBW
0167:004016EA MOV CL,02
0167:004016EC IDIV CL
0167:004016EE ADD AL,20
0167:004016F0 CMP AL,5A
0167:004016F2 JNG 004016FA
0167:004016F4 CMP AL,61
0167:004016F6 JNL 004016FA
0167:004016F8 ADD AL,06
0167:004016FA CMP AL,39
0167:004016FC JNG 00401704
0167:004016FE CMP AL,41
0167:00401700 JNL 00401704
0167:00401702 ADD AL,08
0167:00401704 PUSH EAX
0167:00401705 LEA ECX,[EBP-18]
0167:00401708 LEA EAX,[EBP-14]
0167:0040170B PUSH EAX
0167:0040170C PUSH ECX
0167:0040170D CALL `MFC40!ord_00000332`
0167:00401712 PUSH EAX
0167:00401713 LEA ECX,[EBP-14]
0167:00401716 MOV BYTE [EBP-04],03
0167:0040171A CALL `MFC40!ord_000002F8`
0167:0040171F MOV BYTE [EBP-04],02 ////此处多次调用，D ECX得到逐个注册码，最后为6582-1YWRS
0167:00401723 CALL 00401795
0167:00401728 MOV EDI,00408360
0167:0040172D MOV ECX,FFFFFFFF
0167:00401732 INC DWORD [EBP-10]
0167:00401735 SUB EAX,EAX
0167:00401737 REPNE SCASB
0167:00401739 NOT ECX
0167:0040173B DEC ECX
0167:0040173C CMP ECX,[EBP-10]
0167:0040173F JA 004016C9
0167:00401741 PUSH DWORD 00408460
0167:00401746 MOV EAX,[EBP-14]
0167:00401749 PUSH EAX
0167:0040174A CALL `MSVCRT40!_mbscmp`
0167:00401750 ADD ESP,BYTE +08
0167:00401753 MOV ECX,[EBP-10]
0167:00401756 MOV DWORD [EBP-04],FFFFFFFF
0167:0040175D CMP EAX,BYTE +01
0167:00401760 SBB [EBP-10],ECX
0167:00401763 NEG DWORD [EBP-10]
0167:00401766 CALL 004017AF
0167:0040176B MOV EAX,[EBP-10]
0167:0040176E JMP 00401654
0167:00401773 MOV DWORD [EBP-04],FFFFFFFF
0167:0040177A CALL 004017AF
0167:0040177F JMP 00401652
0167:00401784 MOV DWORD [EBP-04],FFFFFFFF
0167:0040178B CALL 004017AF
0167:00401790 JMP 00401652
0167:00401795 LEA ECX,[EBP-18]
0167:00401798 JMP `MFC40!ord_000002C2`
0167:0040179D LEA ECX,[EBP-10]
0167:004017A0 JMP `MFC40!ord_000002C2`
0167:004017A5 MOV EAX,00406E70
0167:004017AA JMP `MSVCRT40!__CxxFrameHandler`
0167:004017AF LEA ECX,[EBP-14]
0167:004017B2 JMP `MFC40!ord_000002C2`
0167:004017B7 INT3
0167:004017B8 INT3
0167:004017B9 INT3
0167:004017BA INT3
0167:004017BB INT3
0167:004017BC INT3
0167:004017BD INT3
0167:004017BE INT3
0167:004017BF INT3
0167:004017C0 PUSH EBX
0167:004017C1 PUSH ESI
0167:004017C2 PUSH EDI
0167:004017C3 MOV EBX,ECX
0167:004017C5 CALL `MFC40!ord_0000104D`
0167:004017CA MOV ECX,EBX
0167:004017CC CALL 004014A0
0167:004017D1 CALL 004015A0
0167:004017D6 TEST EAX,EAX
0167:004017D8 JZ NEAR 00401867
0167:004017DE PUSH DWORD 00408674
0167:004017E3 LEA ECX,[EBX+60]
0167:004017E6 CALL `MFC40!ord_00001574`
0167:004017EB PUSH DWORD 004085C8
0167:004017F0 LEA ECX,[EBX+E0]
0167:004017F6 LEA EDI,[EBX+01E0]
0167:004017FC CALL `MFC40!ord_00001574`
0167:00401801 PUSH DWORD 004085BC
0167:00401806 LEA ECX,[EBX+A0]
0167:0040180C LEA ESI,[EBX+01A0]
0167:00401812 CALL `MFC40!ord_00001574`
0167:00401817 PUSH DWORD 00408360
0167:0040181C MOV ECX,EDI
0167:0040181E CALL `MFC40!ord_00001574`
0167:00401823 PUSH DWORD 00408460
0167:00401828 MOV ECX,ESI
0167:0040182A CALL `MFC40!ord_00001574`
0167:0040182F PUSH DWORD 004085B8
0167:00401834 LEA ECX,[EBX+0120]
0167:0040183A CALL `MFC40!ord_00001574`
0167:0040183F PUSH BYTE +00
0167:00401841 MOV ECX,EDI
0167:00401843 CALL `MFC40!ord_0000090D`
0167:00401848 PUSH BYTE +00
0167:0040184A MOV ECX,ESI
0167:0040184C CALL `MFC40!ord_0000090D`
0167:00401851 PUSH BYTE +00
0167:00401853 LEA ECX,[EBX+0160]
0167:00401859 CALL `MFC40!ord_0000090D`
0167:0040185E MOV EAX,01
0167:00401863 POP EDI
0167:00401864 POP ESI
0167:00401865 POP EBX
0167:00401866 RET
0167:00401867 PUSH DWORD 004085A4
0167:0040186C LEA ECX,[EBX+01E0]
0167:00401872 CALL `MFC40!ord_00001574`
0167:00401877 PUSH DWORD 004085A4
0167:0040187C LEA ECX,[EBX+01A0]
0167:00401882 CALL `MFC40!ord_00001574`
0167:00401887 MOV EAX,[00408358]
0167:0040188C LEA ECX,[EBX+60]
0167:0040188F PUSH EAX
0167:00401890 CALL `MFC40!ord_00001574`
0167:00401895 MOV EAX,01
0167:0040189A POP EDI
0167:0040189B POP ESI
0167:0040189C POP EBX
0167:0040189D RET
0167:0040189E INT3
0167:0040189F INT3
0167:004018A0 MOV EAX,[FS:00]
0167:004018A6 PUSH EBP
0167:004018A7 MOV EBP,ESP
0167:004018A9 PUSH BYTE -01
0167:004018AB PUSH DWORD 00401A29
0167:004018B0 PUSH EAX
0167:004018B1 MOV [FS:00],ESP
0167:004018B8 SUB ESP,BYTE +0C
0167:004018BB MOV [EBP-10],ECX
0167:004018BE PUSH ESI
0167:004018BF PUSH EDI
0167:004018C0 ADD ECX,01E0
0167:004018C6 PUSH DWORD FF
0167:004018CB PUSH DWORD 00408360
0167:004018D0 CALL `MFC40!ord_00000D36`
0167:004018D5 PUSH DWORD FF
0167:004018DA MOV ECX,[EBP-10]
0167:004018DD PUSH DWORD 00408460
0167:004018E2 ADD ECX,01A0
0167:004018E8 CALL `MFC40!ord_00000D36`
0167:004018ED PUSH DWORD 00408360
0167:004018F2 LEA ECX,[EBP-18]
0167:004018F5 CALL `MFC40!ord_000001E3`
0167:004018FA MOV DWORD [EBP-04],00
0167:00401901 MOV EAX,[EAX]
0167:00401903 PUSH DWORD 004085A4
0167:00401908 PUSH EAX
0167:00401909 CALL `MSVCRT40!_mbscmp`
0167:0040190F MOV DWORD [EBP-04],FFFFFFFF
0167:00401916 ADD ESP,BYTE +08
0167:00401919 CMP EAX,BYTE +01
0167:0040191C MOV EAX,[EBP-14]
0167:0040191F SBB [EBP-14],EAX
0167:00401922 NEG DWORD [EBP-14]
0167:00401925 CALL 00401A33
0167:0040192A CMP DWORD [EBP-14],BYTE +00
0167:0040192E JZ 00401949
0167:00401930 PUSH BYTE +01
0167:00401932 MOV ECX,[EBP-10]
0167:00401935 CALL `MFC40!ord_00000910`
0167:0040193A MOV EAX,[EBP-0C]
0167:0040193D POP EDI
0167:0040193E MOV [FS:00],EAX
0167:00401944 POP ESI
0167:00401945 MOV ESP,EBP
0167:00401947 POP EBP
0167:00401948 RET
0167:00401949 CALL 00401620
0167:0040194E TEST EAX,EAX
0167:00401950 JZ NEAR 004019F8
0167:00401956 LEA EAX,[EBP-18]
0167:00401959 LEA ECX,[EBP-14]
0167:0040195C MOV DWORD [EBP-18],00
0167:00401963 MOV DWORD [EBP-14],00
0167:0040196A PUSH EAX
0167:0040196B PUSH ECX
0167:0040196C PUSH BYTE +00
0167:0040196E PUSH DWORD 000F003F
0167:00401973 PUSH BYTE +00
0167:00401975 PUSH BYTE +00
0167:00401977 PUSH BYTE +00
0167:00401979 PUSH DWORD 0040857C
0167:0040197E PUSH DWORD 80000002
0167:00401983 CALL `ADVAPI32!RegCreateKeyExA`
0167:00401989 MOV EDI,EAX
0167:0040198B TEST EDI,EDI
0167:0040198D JNZ 004019BC
0167:0040198F PUSH DWORD 0200
0167:00401994 MOV EAX,[EBP-14]
0167:00401997 PUSH DWORD 00408360
0167:0040199C PUSH BYTE +03
0167:0040199E PUSH BYTE +00
0167:004019A0 PUSH DWORD 00408578
0167:004019A5 PUSH EAX
0167:004019A6 CALL `ADVAPI32!RegSetValueExA`
0167:004019AC MOV EDI,EAX
0167:004019AE MOV EAX,[EBP-14]
0167:004019B1 PUSH EAX
0167:004019B2 CALL `ADVAPI32!RegCloseKey`
0167:004019B8 TEST EDI,EDI
0167:004019BA JZ 004019CF
0167:004019BC PUSH BYTE +00
0167:004019BE PUSH BYTE +00
0167:004019C0 PUSH DWORD 0040886C
0167:004019C5 CALL `MFC40!ord_00000425`
0167:004019CA JMP 00401930
0167:004019CF CMP DWORD [EBP-10],BYTE +00
0167:004019D3 MOV EAX,00
0167:004019D8 JZ 004019E0
0167:004019DA MOV EAX,[EBP-10]
0167:004019DD MOV EAX,[EAX+20]
0167:004019E0 PUSH BYTE +00
0167:004019E2 PUSH DWORD 0040885C
0167:004019E7 PUSH DWORD 004087DC
0167:004019EC PUSH EAX
0167:004019ED CALL `USER32!MessageBoxA`
0167:004019F3 JMP 00401930
0167:004019F8 PUSH BYTE -01
0167:004019FA CALL `USER32!MessageBeep`
0167:00401A00 CMP DWORD [EBP-10],BYTE +00
0167:00401A04 MOV EAX,00
0167:00401A09 JZ 00401A11
0167:00401A0B MOV EAX,[EBP-10]
0167:00401A0E MOV EAX,[EAX+20]
0167:00401A11 PUSH BYTE +30
0167:00401A13 PUSH DWORD 004087C8
0167:00401A18 PUSH DWORD 00408688
0167:00401A1D PUSH EAX ///下面的语句就是弹出出错对框的了。

如果跟的不细心，就会得到一个近似相象的注册码87ae2401my69，其实是假的。

好了，自己总结总结，那些地方应该跟进去呢。下课了。

<------完------->


ADD/Remove v2.0

 标 题:哈哈，我又上来了，cd-check的文章不知有没有人看？.......这次改贴一篇有关注册码的译文吧! (3千字)
发信人:1212
时 间:2000-9-9 11:58:56
详细信息:
ADD/Remove v2.0
(计算系列号）
破解人：punisher
软件的保护机制：你必须填入User Name和Registration Code。注册码是用你输入的名字计算出来的。
破解过程：我试过用Wdasm32来反汇编，但失败了，所以我用SOFTICE跟踪程序以便发现注册码。
一启动程序就遇上一个破框要你注册，破框上有一组按钮其中包括'Register Later'，点击它会进入程序主窗口。看一下标题栏，有'UNREGISTERED VERSION'的字样。点击"EXIT"，退出程序时又跳出刚才的那个破框。
让我们解决它吧！
启动程序，在破框中键入你的名字和一个假的注册码，然后按Ctrl-D激活SOFTICE，下断点GetWindowTextA，再按Ctrl-D回到破框。这时就可以点击"unlock",程序会被SOFTICE拦截在GetWindowTextA中，因为程序要有俩个CALL去获取我们的名字和注册码，所以我们现在在SOFTICE的命令窗中输入"X"并按回车以略过第一个CALL。
马上，SOFTICE第二次中断在GetWindowTextA中，按F11步出这个CALL，然后按F12来到这里：
call 004053B6
push 00408360 ; 你在这里
lea ecx, [ebp-18]
call 00405386
mov dword ptr[ebp-04], 0000000
mov eax, [eax]
push eax
call [0040A810]
mov dword ptr[ebp-04], FFFFFFFF
add esp, 08
cmp eax, 01
mov eax, [ebp-14]
sbb [ebp-14], eax
neg dword ptr[ebp-14]
call 00401A33
cmp dword ptr[ebp-14], 00
jz 00401949 ; 跳到计算注册码的CALL
在内存中搜寻一下你的假注册码吧，只要键入：
s 0 LFFFFFFF '15151515'（我是用15151515）
你会在数据窗中发现你输入的东东。按住ALT和PAGEDOWN组合键，直到在数据窗中看到"UNREGISTERED USER",在它之前你会看到四个数字并有一个破折号"-",这是注册码的第一部分。记下来，可别忘了破折号哦！
现在要跟入"jz 00401949"这个跳转指令了，你会来到这里：
call 00401620 ; 这个CALL计算注册码的第二部分
test eax, eax
jz 004019F8 ; <- 若在这里跳就惨了
按F8追入CALL 00401620，按F10跟踪到这里：
mov eax, [004835C ]
lea ecx, [ebp-10
mov al, [edx + eax] ; 这是注册码的第二部分的第一个字符
在光条带过mov al, [edx + eax]时键入命令：
? al
记下al的ASCII码内容，不管是数字还是字母。
继续按F10来到这里：
Test byte ptr[ebp-10] 01
jnz 00401728
mov eax, [ebp-10]
mov al, [eax+00408360] ; 在al中存入你的名字的第一个字母
cmp al, 7F
jg 00401773
cmp al, 20
jl 00401784
cbw
mov cl, 02
idiv cl ;将该字母的值除以2
add al, 20 ;再加上20
cmp al, 61
jge 004016FA
add al, 06
cmp al, 39
jle 00401704
cmp al, 41
add al, 08 ;用 ? al 取得运算后的字符
push eax
以上就是注册码的计算过程，它取出你的名字的第一个字符，将它除以2，然后加上20。若结果是字母就存起来，若不是就加上8后再转换。接着，程序会略过第二个字符而用第三个字符进行同样的运算，直到没有字符为止。
在算出注册码后，程序从CALL中返回，测试EAX的值，如果是零就跳转到出错对话框；非零就在注册表中存入你的注册码和名字。
为了取得注册码，你就必须一直在CALL中跟踪，在"add al,08"指令时用'? al'并记下al的内容。跟踪完这个CALL后再将注册码的第一部分与这部分的内容连起来。注意，注册码的长度是取决于你名字的长度。
我用的名字是Punisher,我的注册码=6582-mHWYR
你自己试试吧，快去拥有属于你的注册码!


Advanced Batch Converter v2.3

标 题:找到了一个窝......... (1千字)
发信人:alang
时 间:2001-3-13 7:22:26
详细信息:
软件名称:Advanced Batch Converter v2.3
软件简介:Advanced Batch Converter是你能简单地用来转换标准图形文件的软件，其最大的特点是可以批量转换图形格式,而且支持的文件很多。
输入格式：
BMP，JPG，GIF，PNG，TIF，JPEG，RLE，DIB，PCD，ICB，ICO，WMF，TIFF，TGA，PCX，SCR，EMF，JIF，VDA，JFIF，RGB，AFI，VST，胜利，CEL，JPE，RGBA，PIC，PCC，CUT,PPM PGM，PBM，SGI，RLA，RPF，PSD，PDD，BW。
输出格式：
BMP，JPG，JPEG，GIF，PNG，PCX，TGA，EPS，TIF,TIFF，ICO。
另外， 也是简单的支持全格式的图象观察器。
软件下载:http://www.gold-software.com/abc.html?v20

找到的万能注册码如下(共二十个):

万能注册码(1)
7447-UGYGJVNY
万能注册码(2)
GJnb-GHJty-56
万能注册码(3)
halyava2000#1
万能注册码(4)
Fg56+H?554-22
万能注册码(5)
908923GD#23?k
万能注册码(6)
MNG-KL54?gFRE
万能注册码(7)
KK^dfg#ed56Rf
万能注册码(8)
G=Fg?67#23-Ph
万能注册码(9)
Kl-HGFHGH^fg6
万能注册码(10)
HHGf#f%jk-56F
万能注册码(11)
h&tyfFGG567#d
万能注册码(12)
h&tyfFGG567#d
万能注册码(13)
KRT-gH-t$23HH
万能注册码(14)
jne001callHTY
万能注册码(15)
OOp-^&ghDFFGH
万能注册码(16)
PMHG-RTYFGH#7
万能注册码(17)
LJ-FYU%f78?SF
万能注册码(18)
UPS-GC-^EDGFG
万能注册码(19)
86fiTYg
万能注册码(20)
HPPYBRTHDYPTR

欢迎光临《阿郎居》
langlirong@yeah.net
http://alang.shangdu.net

标 题:过程 (16千字)
发信人:alang
时 间:2001-3-14 7:35:19
详细信息:

你好!就我个人认为(也许不正确),abc.exe软件不是将注册码写入注册表的,而是每次将你的注册码同这二十个注册码相比较,因为泥将abc.exe复制之后启动,还是没有注册.因此我认为不是检测注册表重的注册码.
破结过程很简单:
你只要找到:0053C652 处,向下看就可以看到依次二十个注册码.
:0053C652 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Data Obj ->"halyava2000#1"
|
:0053C655 BAB4CB5300 mov edx, 0053CBB4
:0053C65A E8098AECFF call 00405068
:0053C65F 8D55F0 lea edx, dword ptr [ebp-10]
:0053C662 58 pop eax
:0053C663 E8A88BECFF call 00405210
:0053C668 0F8468040000 je 0053CAD6
:0053C66E 8B06 mov eax, dword ptr [esi]
:0053C670 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C676 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C67C BA01000000 mov edx, 00000001
:0053C681 E85621F7FF call 004AE7DC
:0053C686 83C010 add eax, 00000010
:0053C689 50 push eax
:0053C68A 8D45E0 lea eax, dword ptr [ebp-20]

* Possible StringData Ref from Data Obj ->"Fg56+H?554-22"
|
:0053C68D BACCCB5300 mov edx, 0053CBCC
:0053C692 E8D189ECFF call 00405068
:0053C697 8D55E0 lea edx, dword ptr [ebp-20]
:0053C69A 58 pop eax
:0053C69B E8708BECFF call 00405210
:0053C6A0 0F8430040000 je 0053CAD6
:0053C6A6 8B06 mov eax, dword ptr [esi]
:0053C6A8 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C6AE 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C6B4 BA01000000 mov edx, 00000001
:0053C6B9 E81E21F7FF call 004AE7DC
:0053C6BE 83C010 add eax, 00000010
:0053C6C1 50 push eax
:0053C6C2 8D45D0 lea eax, dword ptr [ebp-30]

* Possible StringData Ref from Data Obj ->"908923GD#23?k"
|
:0053C6C5 BAE4CB5300 mov edx, 0053CBE4
:0053C6CA E89989ECFF call 00405068
:0053C6CF 8D55D0 lea edx, dword ptr [ebp-30]
:0053C6D2 58 pop eax
:0053C6D3 E8388BECFF call 00405210
:0053C6D8 0F84F8030000 je 0053CAD6
:0053C6DE 8B06 mov eax, dword ptr [esi]
:0053C6E0 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C6E6 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C6EC BA01000000 mov edx, 00000001
:0053C6F1 E8E620F7FF call 004AE7DC
:0053C6F6 83C010 add eax, 00000010
:0053C6F9 50 push eax
:0053C6FA 8D45C0 lea eax, dword ptr [ebp-40]

* Possible StringData Ref from Data Obj ->"MNG-KL54?gFRE"
|
:0053C6FD BAFCCB5300 mov edx, 0053CBFC
:0053C702 E86189ECFF call 00405068
:0053C707 8D55C0 lea edx, dword ptr [ebp-40]
:0053C70A 58 pop eax
:0053C70B E8008BECFF call 00405210
:0053C710 0F84C0030000 je 0053CAD6
:0053C716 8B06 mov eax, dword ptr [esi]
:0053C718 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C71E 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C724 BA01000000 mov edx, 00000001
:0053C729 E8AE20F7FF call 004AE7DC
:0053C72E 83C010 add eax, 00000010
:0053C731 50 push eax
:0053C732 8D45B0 lea eax, dword ptr [ebp-50]

* Possible StringData Ref from Data Obj ->"KK^dfg#ed56Rf"
|
:0053C735 BA14CC5300 mov edx, 0053CC14
:0053C73A E82989ECFF call 00405068
:0053C73F 8D55B0 lea edx, dword ptr [ebp-50]
:0053C742 58 pop eax
:0053C743 E8C88AECFF call 00405210
:0053C748 0F8488030000 je 0053CAD6
:0053C74E 8B06 mov eax, dword ptr [esi]
:0053C750 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C756 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C75C BA01000000 mov edx, 00000001
:0053C761 E87620F7FF call 004AE7DC
:0053C766 83C010 add eax, 00000010
:0053C769 50 push eax
:0053C76A 8D45A0 lea eax, dword ptr [ebp-60]

* Possible StringData Ref from Data Obj ->"G=Fg?67#23-Ph"
|
:0053C76D BA2CCC5300 mov edx, 0053CC2C
:0053C772 E8F188ECFF call 00405068
:0053C777 8D55A0 lea edx, dword ptr [ebp-60]
:0053C77A 58 pop eax
:0053C77B E8908AECFF call 00405210
:0053C780 0F8450030000 je 0053CAD6
:0053C786 8B06 mov eax, dword ptr [esi]
:0053C788 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C78E 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C794 BA01000000 mov edx, 00000001
:0053C799 E83E20F7FF call 004AE7DC
:0053C79E 83C010 add eax, 00000010
:0053C7A1 50 push eax
:0053C7A2 8D4590 lea eax, dword ptr [ebp-70]

* Possible StringData Ref from Data Obj ->"Kl-HGFHGH^fg6"
|
:0053C7A5 BA44CC5300 mov edx, 0053CC44
:0053C7AA E8B988ECFF call 00405068
:0053C7AF 8D5590 lea edx, dword ptr [ebp-70]
:0053C7B2 58 pop eax
:0053C7B3 E8588AECFF call 00405210
:0053C7B8 0F8418030000 je 0053CAD6
:0053C7BE 8B06 mov eax, dword ptr [esi]
:0053C7C0 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C7C6 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C7CC BA01000000 mov edx, 00000001
:0053C7D1 E80620F7FF call 004AE7DC
:0053C7D6 83C010 add eax, 00000010
:0053C7D9 50 push eax
:0053C7DA 8D4580 lea eax, dword ptr [ebp-80]

* Possible StringData Ref from Data Obj ->"HHGf#f%jk-56F"
|
:0053C7DD BA5CCC5300 mov edx, 0053CC5C
:0053C7E2 E88188ECFF call 00405068
:0053C7E7 8D5580 lea edx, dword ptr [ebp-80]
:0053C7EA 58 pop eax
:0053C7EB E8208AECFF call 00405210
:0053C7F0 0F84E0020000 je 0053CAD6
:0053C7F6 8B06 mov eax, dword ptr [esi]
:0053C7F8 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C7FE 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C804 BA01000000 mov edx, 00000001
:0053C809 E8CE1FF7FF call 004AE7DC
:0053C80E 83C010 add eax, 00000010
:0053C811 50 push eax
:0053C812 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70]

* Possible StringData Ref from Data Obj ->"GJnb-GHJty-56"
|
:0053C818 BA74CC5300 mov edx, 0053CC74
:0053C81D E84688ECFF call 00405068
:0053C822 8D9570FFFFFF lea edx, dword ptr [ebp+FFFFFF70]
:0053C828 58 pop eax
:0053C829 E8E289ECFF call 00405210
:0053C82E 0F84A2020000 je 0053CAD6
:0053C834 8B06 mov eax, dword ptr [esi]
:0053C836 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C83C 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C842 BA01000000 mov edx, 00000001
:0053C847 E8901FF7FF call 004AE7DC
:0053C84C 83C010 add eax, 00000010
:0053C84F 50 push eax
:0053C850 8D8560FFFFFF lea eax, dword ptr [ebp+FFFFFF60]

* Possible StringData Ref from Data Obj ->"h&tyfFGG567#d"
|
:0053C856 BA8CCC5300 mov edx, 0053CC8C
:0053C85B E80888ECFF call 00405068
:0053C860 8D9560FFFFFF lea edx, dword ptr [ebp+FFFFFF60]
:0053C866 58 pop eax
:0053C867 E8A489ECFF call 00405210
:0053C86C 0F8464020000 je 0053CAD6
:0053C872 8B06 mov eax, dword ptr [esi]
:0053C874 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C87A 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C880 BA01000000 mov edx, 00000001
:0053C885 E8521FF7FF call 004AE7DC
:0053C88A 83C010 add eax, 00000010
:0053C88D 50 push eax
:0053C88E 8D8550FFFFFF lea eax, dword ptr [ebp+FFFFFF50]

* Possible StringData Ref from Data Obj ->"090JkTRfgvb@1"
|
:0053C894 BAA4CC5300 mov edx, 0053CCA4
:0053C899 E8CA87ECFF call 00405068
:0053C89E 8D9550FFFFFF lea edx, dword ptr [ebp+FFFFFF50]
:0053C8A4 58 pop eax
:0053C8A5 E86689ECFF call 00405210
:0053C8AA 0F8426020000 je 0053CAD6
:0053C8B0 8B06 mov eax, dword ptr [esi]
:0053C8B2 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C8B8 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C8BE BA01000000 mov edx, 00000001
:0053C8C3 E8141FF7FF call 004AE7DC
:0053C8C8 83C010 add eax, 00000010
:0053C8CB 50 push eax
:0053C8CC 8D8540FFFFFF lea eax, dword ptr [ebp+FFFFFF40]

* Possible StringData Ref from Data Obj ->"KRT-gH-t$23HH"
|
:0053C8D2 BABCCC5300 mov edx, 0053CCBC
:0053C8D7 E88C87ECFF call 00405068
:0053C8DC 8D9540FFFFFF lea edx, dword ptr [ebp+FFFFFF40]
:0053C8E2 58 pop eax
:0053C8E3 E82889ECFF call 00405210
:0053C8E8 0F84E8010000 je 0053CAD6
:0053C8EE 8B06 mov eax, dword ptr [esi]
:0053C8F0 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C8F6 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C8FC BA01000000 mov edx, 00000001
:0053C901 E8D61EF7FF call 004AE7DC
:0053C906 83C010 add eax, 00000010
:0053C909 50 push eax
:0053C90A 8D8530FFFFFF lea eax, dword ptr [ebp+FFFFFF30]

* Possible StringData Ref from Data Obj ->"jne001callHTY"
|
:0053C910 BAD4CC5300 mov edx, 0053CCD4
:0053C915 E84E87ECFF call 00405068
:0053C91A 8D9530FFFFFF lea edx, dword ptr [ebp+FFFFFF30]
:0053C920 58 pop eax
:0053C921 E8EA88ECFF call 00405210
:0053C926 0F84AA010000 je 0053CAD6
:0053C92C 8B06 mov eax, dword ptr [esi]
:0053C92E 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C934 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C93A BA01000000 mov edx, 00000001
:0053C93F E8981EF7FF call 004AE7DC
:0053C944 83C010 add eax, 00000010
:0053C947 50 push eax
:0053C948 8D8520FFFFFF lea eax, dword ptr [ebp+FFFFFF20]

* Possible StringData Ref from Data Obj ->"OOp-^&ghDFFGH"
|
:0053C94E BAECCC5300 mov edx, 0053CCEC
:0053C953 E81087ECFF call 00405068
:0053C958 8D9520FFFFFF lea edx, dword ptr [ebp+FFFFFF20]
:0053C95E 58 pop eax
:0053C95F E8AC88ECFF call 00405210
:0053C964 0F846C010000 je 0053CAD6
:0053C96A 8B06 mov eax, dword ptr [esi]
:0053C96C 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C972 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C978 BA01000000 mov edx, 00000001
:0053C97D E85A1EF7FF call 004AE7DC
:0053C982 83C010 add eax, 00000010
:0053C985 50 push eax
:0053C986 8D8510FFFFFF lea eax, dword ptr [ebp+FFFFFF10]

* Possible StringData Ref from Data Obj ->"PMHG-RTYFGH#7"
|
:0053C98C BA04CD5300 mov edx, 0053CD04
:0053C991 E8D286ECFF call 00405068
:0053C996 8D9510FFFFFF lea edx, dword ptr [ebp+FFFFFF10]
:0053C99C 58 pop eax
:0053C99D E86E88ECFF call 00405210
:0053C9A2 0F842E010000 je 0053CAD6
:0053C9A8 8B06 mov eax, dword ptr [esi]
:0053C9AA 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C9B0 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C9B6 BA01000000 mov edx, 00000001
:0053C9BB E81C1EF7FF call 004AE7DC
:0053C9C0 83C010 add eax, 00000010
:0053C9C3 50 push eax
:0053C9C4 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]

* Possible StringData Ref from Data Obj ->"7447-UGYGJVNY"
|
:0053C9CA BA1CCD5300 mov edx, 0053CD1C
:0053C9CF E89486ECFF call 00405068
:0053C9D4 8D9500FFFFFF lea edx, dword ptr [ebp+FFFFFF00]
:0053C9DA 58 pop eax
:0053C9DB E83088ECFF call 00405210
:0053C9E0 0F84F0000000 je 0053CAD6
:0053C9E6 8B06 mov eax, dword ptr [esi]
:0053C9E8 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053C9EE 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053C9F4 BA01000000 mov edx, 00000001
:0053C9F9 E8DE1DF7FF call 004AE7DC
:0053C9FE 83C010 add eax, 00000010
:0053CA01 50 push eax
:0053CA02 8D85F0FEFFFF lea eax, dword ptr [ebp+FFFFFEF0]

* Possible StringData Ref from Data Obj ->"LJ-FYU%f78?SF"
|
:0053CA08 BA34CD5300 mov edx, 0053CD34
:0053CA0D E85686ECFF call 00405068
:0053CA12 8D95F0FEFFFF lea edx, dword ptr [ebp+FFFFFEF0]
:0053CA18 58 pop eax
:0053CA19 E8F287ECFF call 00405210
:0053CA1E 0F84B2000000 je 0053CAD6
:0053CA24 8B06 mov eax, dword ptr [esi]
:0053CA26 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053CA2C 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053CA32 BA01000000 mov edx, 00000001
:0053CA37 E8A01DF7FF call 004AE7DC
:0053CA3C 83C010 add eax, 00000010
:0053CA3F 50 push eax
:0053CA40 8D85E0FEFFFF lea eax, dword ptr [ebp+FFFFFEE0]

* Possible StringData Ref from Data Obj ->"UPS-GC-^EDGFG"
|
:0053CA46 BA4CCD5300 mov edx, 0053CD4C
:0053CA4B E81886ECFF call 00405068
:0053CA50 8D95E0FEFFFF lea edx, dword ptr [ebp+FFFFFEE0]
:0053CA56 58 pop eax
:0053CA57 E8B487ECFF call 00405210
:0053CA5C 7478 je 0053CAD6
:0053CA5E 8B06 mov eax, dword ptr [esi]
:0053CA60 8B8084030000 mov eax, dword ptr [eax+00000384]
:0053CA66 8B808C000000 mov eax, dword ptr [eax+0000008C]
:0053CA6C BA01000000 mov edx, 00000001
:0053CA71 E8661DF7FF call 004AE7DC
:0053CA76 83C010 add eax, 00000010
:0053CA79 50 push eax
:0053CA7A 8D85D0FEFFFF lea eax, dword ptr [ebp+FFFFFED0]

* Possible StringData Ref from Data Obj ->"86fiTYg"
|
:0053CA80 BA64CD5300 mov edx, 0053CD64
:0053CA85 E8DE85ECFF call 00405068
:0053CA8A 8D95D0FEFFFF lea edx, dword ptr [ebp+FFFFFED0]
:0053CA90 58 pop eax
:0053CA91 E87A87ECFF call 00405210
:0053CA96 743E je 0053CAD6
:0053CA98 8B06


Advanced Email Searcher1.1

 标 题:希望我可以加入BCG！ (5千字)
发信人:注册码
时 间:2001-7-31 16:09:40
详细信息:
Advanced Email Searcher1.1
我很想加入bcg，所以赶快写破文。看到老大crackabc需要邮件群发软件，我也来试试。
注册码，大家都说了，比较容易。但是它在后面还有检测，我没有找到比较正确的注册码的地方，所以只有爆破了！^_^
注册码的关键的call就在
:0049A3B0 8B4DF8 mov ecx, dword ptr [ebp-08]
:0049A3B3 8B55FC mov edx, dword ptr [ebp-04]
:0049A3B6 8BC3 mov eax, ebx
:0049A3B8 E8F7000000 call 0049A4B4 <----这个就是关键的地方，里面有假的注册码哦！进入看看。
:0049A3BD 84C0 test al, al

|:0049A3B8 , :0049A648
|
:0049A4B4 55 push ebp
:0049A4B5 8BEC mov ebp, esp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049A467(C)
|
:0049A4B7 83C4F0 add esp, FFFFFFF0
:0049A4BA 53 push ebx
:0049A4BB 33DB xor ebx, ebx
:0049A4BD 895DF4 mov dword ptr [ebp-0C], ebx
:0049A4C0 895DF0 mov dword ptr [ebp-10], ebx
:0049A4C3 894DF8 mov dword ptr [ebp-08], ecx
:0049A4C6 8955FC mov dword ptr [ebp-04], edx
:0049A4C9 8B45FC mov eax, dword ptr [ebp-04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049A465(C)
|
:0049A4CC E8AF9AF6FF call 00403F80
:0049A4D1 8B45F8 mov eax, dword ptr [ebp-08]
:0049A4D4 E8A79AF6FF call 00403F80
:0049A4D9 8B4508 mov eax, dword ptr [ebp+08]
:0049A4DC E89F9AF6FF call 00403F80
:0049A4E1 33C0 xor eax, eax
:0049A4E3 55 push ebp
:0049A4E4 683EA54900 push 0049A53E
:0049A4E9 64FF30 push dword ptr fs:[eax]
:0049A4EC 648920 mov dword ptr fs:[eax], esp
:0049A4EF 8D45F0 lea eax, dword ptr [ebp-10]
:0049A4F2 8B4DF8 mov ecx, dword ptr [ebp-08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049A47C(C)
|
:0049A4F5 8B55FC mov edx, dword ptr [ebp-04]
:0049A4F8 E81B99F6FF call 00403E18
:0049A4FD 8B45F0 mov eax, dword ptr [ebp-10]
:0049A500 8D55F4 lea edx, dword ptr [ebp-0C]
:0049A503 E8F07AFEFF call 00481FF8
:0049A508 8B55F4 mov edx, dword ptr [ebp-0C]
:0049A50B 8B4508 mov eax, dword ptr [ebp+08]
:0049A50E E8C999F6FF call 00403EDC <---就是这里
:0049A513 7504 jne 0049A519
:0049A515 B301 mov bl, 01
:0049A517 EB02 jmp 0049A51B

:00403EDC 53 push ebx
:00403EDD 56 push esi
:00403EDE 57 push edi
:00403EDF 89C6 mov esi, eax
:00403EE1 89D7 mov edi, edx
:00403EE3 39D0 cmp eax, edx <----比较了，两个假的。^_^
:00403EE5 0F848F000000 je 00403F7A
:00403EEB 85F6 test esi, esi
:00403EED 7468 je 00403F57
:00403EEF 85FF test edi, edi
:00403EF1 746B je 00403F5E
:00403EF3 8B46FC mov eax, dword ptr [esi-04]
:00403EF6 8B57FC mov edx, dword ptr [edi-04]
:00403EF9 29D0 sub eax, edx
:00403EFB 7702 ja 00403EFF
:00403EFD 01C2 add edx, eax

:0049A3BD 84C0 test al, al <－－－修改下面的跳转就行了。

修改后就出现了老大说的那个现象了，可以肯定下面还有校验的地方，接着先下看看。
:0049A659 E86A3FF9FF call 0042E5C8
:0049A65E 33D2 xor edx, edx
:0049A660 8B8384030000 mov eax, dword ptr [ebx+00000384]
:0049A666 E85922FEFF call 0047C8C4 <----这个可能就是验证的call
:0049A66B C60538024A0000 mov byte ptr [004A0238], 00 <---注册的标志变成零了
:0049A672 EB21 jmp 0049A695

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049A64F(C)
|
:0049A674 8B15D44D4E00 mov edx, dword ptr [004E4DD4]
:0049A67A 8BC3 mov eax, ebx
:0049A67C E8473FF9FF call 0042E5C8
:0049A681 B201 mov dl, 01
:0049A683 8B8384030000 mov eax, dword ptr [ebx+00000384]
:0049A689 E83622FEFF call 0047C8C4
:0049A68E C60538024A0000 mov byte ptr [004A0238], 00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049A672(U)
|
:0049A695 803D38024A0000 cmp byte ptr [004A0238], 00 <---这里验证
:0049A69C 7507 jne 0049A6A5 <----这里要改为je
:0049A69E 8BC3 mov eax, ebx
:0049A6A0 E89B010000 call 0049A840 <----就是那个出错的call

这样改完，就可以成功的注册了，但是在启动的时候他还是要检验一个地方：
* Possible StringData Ref from Data Obj ->"default.aes"
|
:00499E3F 8B152C024A00 mov edx, dword ptr [004A022C]
:00499E45 8BC3 mov eax, ebx
:00499E47 E848F1FFFF call 00498F94
:00499E4C 33C0 xor eax, eax
:00499E4E A334024A00 mov dword ptr [004A0234], eax
:00499E53 8BC3 mov eax, ebx
:00499E55 E8F6060000 call 0049A550
:00499E5A 803D3C024A0000 cmp byte ptr [004A023C], 00 <---这里验证
:00499E61 7509 jne 00499E6C <---改为je
:00499E63 8BD3 mov edx, ebx
:00499E65 8BC3 mov eax, ebx
:00499E67 E828030000 call 0049A194 <----注册的对话框

"default.aes"，就是这个文件里有注册的校验。
到次就完全搞定了！
希望我可以加入BCG！


Advanced Evaluator 3.5

标 题:Advanced Evaluator 3.5 (另一强大的科学计算器--注册运算也很强大哟)破解~~新手请进~~有详细注解~高手们做... (12千字)
发信人:Sam.com
时 间:2001-3-10 14:26:44
详细信息:
标题: Advanced Evaluator 3.5 (另一强大的科学计算器--注册运算也很强大哟)破解~~新手请进~~有详细注解~高手们做个注册机吧~~~呵呵

内容:
差点就要放弃啦~~~~~~~

软件名称：Advanced Evaluator 3.5 (功能强大的科学计算器)
下载地址：http://61.134.4.193:8080/appsoftware/calculator/ae35.zip (708KB)
注册形式：Name & Key (我用了Name:Sam Von Key:67676767) 30天限制，过了30天就不能用了
破解原因：同上次一样，找了一大堆计算器想算注册码，这个也一样不合我心意，但它有注册保护，刚好可以练一下
但这个比上次那个难多啦(对于我来说)，看我的标题就知道啦，不过这次可增加了我不少经验值，顺便问
下大家，有哪个计算器软件或其它工具可以进行汇编的shl,nor,rol,xor等这些逻辑运算的请告诉我下载
地址~~~~谢谢大家~~~~

破解过程及心得：
这次破解简直是瞎猫捉到死老鼠，一开始当然是例行公事一样的填入我的Name&Key，打开Trw2000，输入bpx hmemcpy，然后按确定，Booom~~~Trw拦下来啦，然后就bd、pmodule，来到了程序的代码中，呵呵~~~~有谁算过这个过程要多长时间。通常来说这时我都会看看各个寄存器的值，一般来说这时eax的值就是你Name or Key的长度，而我这里是我Name的长度7，好啦它读了我的Name，马上用s命令查找'Sam Von'(s命令会用吧，反正我刚学的时候就不怎么会用，谁不懂就问吧)，找到啦，当然是“bpm 地址 rw”啦，这个命令很好用的，只要任何程序读写了存放我的Name的地址，Trw就会中断了，我的猜想是程序读我的Name作比较或者作运算或者把它放到第二个地址去，所以我通常有个习惯就是用bpm把所有存放我Name & Key的地址都设中断，反正程序一读我的Name&Key就是要做小动作啦，所以这样比较容易跟也容易找到核心，当程序再次中断时，我发现它在拿我的Name和sudi比较，但我用sudi来注册时一样出错，那这个可能是黑名单吧，这里应该不是重点，再跟~~~~~~~又发现程序在查我Name的二进制，要用到二进制来运算，麻烦啦，继续~~~~~~中间好多F8 F10的不停的按，反正要注意各寄存器的值，在Trw中的汇编代码窗口右上角的提示很重要，多多留意，一发现出现有疑的数据就要d来看看。其中有几个地方应该都是运算重点，但我没有贴出代码，只给出地址，有兴趣的就自己看看吧：在4027EC处程序用我Name的16进制加上某个地址再与另一地址比较；在478B1B处程序作了运算(用了除法等命令)；在479471-->4794B0处程序将我Name的二进制连续放在内存中然后比较、查表、运算。最下面我贴出那些代码是对Key的比较运算，反正我再跟下去就晕啦，因为后面的call很多，运算也很复杂，我看不懂代码，但我想后面应该就是运算核心啦，高手们可以研究一下。上面的过程我花了两天时间，始终搞不懂，你一定想问我为什么不用反汇编呢，其实我一早用过啦，程序是Delphi写的，里面一点有用的字串都没有，只有十多行而已(BTW:为什么纯Delphi的程序用W32dasm反汇编后在字串表中都只有几行呢，是程序本身的设计还是Delphi的限制呢)，我开始怀疑是否是我的起点过高呢~~~~~~~~~~~~呵呵
眼花啦~~~~每次看下面运算的代码都不得重点，我实在看不懂运算的过程，而且后面的call太多啦，唉没心机啦，于是像傻子一样不停的按F10~~~~忽然在4799AB处停了下来，其实这里我以前也来过几次，不过总觉得比较语句应该是cmp al,01之类的才是重要的判断，不会同2比吧，给骗了~~~这时将al改为2就完全破解啦，这完全是我无路可走才想到乱改一气的，所以说捉到死老鼠啦~~~~~呵呵
再说两句，破解真的好累，写文章就更累~~~~这是我写的第三篇，这几天都没精神啦，另外我写的可能很乱很罗嗦，请大家原谅，我文笔本来就不好，加上我写的这些都是想保留下来以后温习用的，所以写的很详细(因为我是一个新手，功力0.6级)，记得我刚开始学破解时到处找教程，但几乎每个教程都那么简单，可能我人蠢吧，很多东西看不懂，所以我就将破解的过程整理后贴出来咯，希望能帮得了一些新手，也请高手指正，毕竟这些都是我自己理解的东西~~~~难免有错的~~~~谢了~~~~~~~~~~~~~

以下为核心判断的call

* Referenced by a CALL at Addresses:
|:00478C93 , :00478CA2 , :00479039 , :00479049 , :0047974C
|:00479780 , :004799A6
|
:00478A48 53 push ebx
:00478A49 56 push esi
:00478A4A 57 push edi
:00478A4B 55 push ebp
:00478A4C 8BEA mov ebp, edx
:00478A4E B202 mov dl, 02 <----dl=2 此为注册标志想办法保持这个数就行啦
:00478A50 8B7504 mov esi, dword ptr [ebp+04]<---[C60994]=252E---假密码
:00478A53 8B4804 mov ecx, dword ptr [eax+04]<---[C67F88]=1CD3---真密码
-------------------------------------------------------------------------------------------------
To：新手~~~~~~~~~~
我不知道程序将我的Name和Key作了什么运算，反正到了此处程序就拿这两个数作比较，我就称它们为真假密码吧，请留意程序并没有将密码连续放在内存中，而是分散的，它的存放是这样的[ebp(eax)]是密码的基地址，[ebp(eax)+4]是密码的值，[ebp(eax)+8]是下一个密码的基地址，程序先比较第一个密码，不等的话还会去比较第二个，这一点我就不明白啦，第一个不等就算啦嘛，为何还做下面的比较，就算后面的密码相等bl也不可能变为2呀，这是我第一次碰到的情况，所以我把它记了下来，不要说我罗嗦呀~~~~~~~~~~
-------------------------------------------------------------------------------------------------
:00478A56 3BF1 cmp esi, ecx
:00478A58 7D04 jge 00478A5E <---此处esi>ecx所以跳啦
:00478A5A 33D2 xor edx, edx <---不跳的话edx就被清为0啦
:00478A5C EB20 jmp 00478A7E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A58(C)
|
:00478A5E 3BF1 cmp esi, ecx <----再比不等dl就变为1啦
:00478A60 7E1C jle 00478A7E
:00478A62 B201 mov dl, 01
:00478A64 EB18 jmp 00478A7E <----一定跳啦，不过dl为1啦

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A90(C)
|
:00478A66 8BC6 mov eax, esi <----基地址
:00478A68 8BEF mov ebp, edi
:00478A6A 8B7504 mov esi, dword ptr [ebp+04]<----第二个密码22B4
:00478A6D 8B4804 mov ecx, dword ptr [eax+04]<----211
:00478A70 3BF1 cmp esi, ecx
:00478A72 7D04 jge 00478A78 <------看~~就算相等也没用，刚才dl已经为1啦
:00478A74 33D2 xor edx, edx
:00478A76 EB06 jmp 00478A7E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A72(C)
|
:00478A78 3BF1 cmp esi, ecx
:00478A7A 7E02 jle 00478A7E
:00478A7C B201 mov dl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478A5C(U), :00478A60(C), :00478A64(U), :00478A76(U), :00478A7A(C)
|
:00478A7E 8B7008 mov esi, dword ptr [eax+08]<----下一个密码的基地址
:00478A81 85F6 test esi, esi
:00478A83 0F95C1 setne cl <----在Trw中此句是"setnz cl" 所以cl=1
:00478A86 8B7D08 mov edi, dword ptr [ebp+08]<----下一个密码的基地址
:00478A89 85FF test edi, edi
:00478A8B 0F95C3 setne bl <----bl=1,第二次到此bl=0下面就不跳啦共比较了四次
:00478A8E 22CB and cl, bl
:00478A90 75D4 jne 00478A66 <----在Trw中此句是jnz 所以跳了
:00478A92 8B7808 mov edi, dword ptr [eax+08]
:00478A95 85FF test edi, edi
:00478A97 0F94C1 sete cl
:00478A9A 8B7508 mov esi, dword ptr [ebp+08]
:00478A9D 85F6 test esi, esi
:00478A9F 0F95C3 setne bl
:00478AA2 22CB and cl, bl
:00478AA4 7402 je 00478AA8
:00478AA6 B201 mov dl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AA4(C)
|
:00478AA8 85F6 test esi, esi
:00478AAA 0F94C1 sete cl
:00478AAD 85FF test edi, edi
:00478AAF 0F95C0 setne al
:00478AB2 22C8 and cl, al
:00478AB4 7402 je 00478AB8
:00478AB6 33D2 xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AB4(C)
| 上面的代码没能将dl=02
:00478AB8 8BC2 mov eax, edx <---此处edx=0所以al=0 注意ret后就是比较啦
:00478ABA 5D pop ebp
:00478ABB 5F pop edi
:00478ABC 5E pop esi
:00478ABD 5B pop ebx
:00478ABE C3 ret

=================================================================================================

:0047999A 8B45EC mov eax, dword ptr [ebp-14]
:0047999D 8945F0 mov dword ptr [ebp-10], eax
:004799A0 8B55F4 mov edx, dword ptr [ebp-0C]
:004799A3 8B45F0 mov eax, dword ptr [ebp-10]
:004799A6 E89DF0FFFF call 00478A48 <----上面的代码
:004799AB 3C02 cmp al, 02 <----呵呵~~~~~~~看下面的代码，根本没有跳转语句，跟
进后面的call找不到重点，所以说我是瞎撞的
-------------------------------------------------------------------------------------------------
在此如果将al改成02就OK啦(这里看起来很简单，当然啦这是结果，但想想之前的过程真的很恐怖，好多次想放弃啦，有耐心才会成功的，不过还要有点运气，有时按着F8就睡着啦，等你睡醒后看一眼，可能关键处就在那等左你呢~~~~~~哈哈)NAG消失，进入程序，再次运行，完全没问题，看看About没我的名字，Why？？程序怎么判断我注册呢？注册表？？？好了，Regmon出手，程序读了HKEY_CURRENT_USER\AppEvents\precomp，好啦，试试改名，呵呵~~~~~~~出来啦，要我注册，其实程序并没有保存我的Name&Key只是如果不注册，此键值就有个标志，注册了就改为另一个标志(都不是明文，记不下来)，气死我啦，把它改为Sam.com~~~~咦!!眼花了？？？？怎么没叫我注册呢？再改为Sam Von~~~~我拷~~~还是进去了，原来程序只有一个不注册的标志，只要键值不是它就行啦，这东西注册挺贵的，不会这么儿戏吧，不过这鍵不是这么容易就能找得到的(找到也不敢乱动它吧呵呵~~~~~~~~~~~~)，而且它的注册码算法很复杂(个人认为)，请留意下面我提供的算法代码，注册码保护得这么好这里却~~~~~这该怎么形容呀~~~~哈哈哈哈~~~想不起~~~我语文很差的~~~~呵呵
-------------------------------------------------------------------------------------------------

:004799AD 8B4508 mov eax, dword ptr [ebp+08]
:004799B0 0F9400 sete byte ptr [eax]
:004799B3 8D45F0 lea eax, dword ptr [ebp-10]
:004799B6 E869EEFFFF call 00478824
:004799BB 8D45F4 lea eax, dword ptr [ebp-0C]
:004799BE E861EEFFFF call 00478824
:004799C3 33C0 xor eax, eax
:004799C5 5A pop edx
:004799C6 59 pop ecx
:004799C7 59 pop ecx
:004799C8 648910 mov dword ptr fs:[eax], edx
:004799CB 68E5994700 push 004799E5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004799E3(U)
|
:004799D0 8D45F8 lea eax, dword ptr [ebp-08]
:004799D3 BA02000000 mov edx, 00000002
:004799D8 E8AF9FF8FF call 0040398C
:004799DD C3 ret

以下应该是注册码算法的核心开始，想研究密码算法的请看看吧，我功力还不够~~~~~~~~~~~

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479592(C)
|
:0047956D 8D45F8 lea eax, dword ptr [ebp-08]
:00479570 8B55FC mov edx, dword ptr [ebp-04]<---此行运行过后d edx=>[edx]=67676767 是我输入的注册码，已变为Hex的啦
:00479573 4E dec esi
:00479574 3B72FC cmp esi, dword ptr [edx-04]
:00479577 7205 jb 0047957E
:00479579 E80697F8FF call 00402C84

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479577(C)
|
:0047957E 46 inc esi
:0047957F 0FB65432FF movzx edx, byte ptr [edx+esi-01]<---注册码第一位edx=67
:00479584 8B9495F8FBFFFF mov edx, dword ptr [ebp+4*edx-00000408]<--注意edx参与了运算我猜 它在查表，过了这行就d edx,二进制？？算一算原来
是67的二进制，所以我开始怕了，这两个call我跟进 去却搞不懂，头晕啦，高手请吧
:0047958B E85CA6F8FF call 00403BEC
:00479590 46 inc esi
:00479591 4B dec ebx
:00479592 75D9 jne 0047956D
:00479594 EB12 jmp 004795A8 <---这里跳过去后应该就是算法的核心，高手研究一下吧

这段代码要运行好几次，因为注册码和姓名的每一位查表运算都要经过这里，我觉得好复杂呀，后面的代码我就不贴了，因为有很多call很难写清楚，请大家反汇编后找一找吧~~~~~~~~不说啦~~~~~~我开始眼花啦~~~~~~~

13:33 2001-3-10


AlgoLab PtVector

 标 题:AlgoLab PtVector的破解及注册机的编写 (17千字)
发信人:robot
时 间:2001-5-4 13:46:41
详细信息:

软件简介：algolab_photo_vector_v1.01 能将位图转换成矢量图！使用方便、功能强大！
下载地址：ftp://202.108.252.18/stcsr/rj/txtx/b-apv101.zip
破解工具：SoftICE 4.05，W32Dasm

说明：该软件没有壳，而且可以反复注册，真是合Cracker的脾气。分析一下程序后，进行暴破还是很容易的，但我更喜欢看他的注册码的计算。
破解开始：
运行程序后，选择Help下的About，就会进行注册。分别填入User Name，Company Name，E-mail Address和Registration，Ctrl+D进入SoftICE，下bpx GetWindowTextA，按注册按钮，程序会被拦下来，下面为用W32Dasm反编译的注册时的Call
* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:004171AF E8E2120200 Call 00438496 ====> GetWindowTextA
......
:004171F5 8D55E0 lea edx, dword ptr [ebp-20]
:004171F8 52 push edx ====> Registration
:004171F9 8D45E8 lea eax, dword ptr [ebp-18]
:004171FC 50 push eax ====> E-mail Address
:004171FD 8D4DDC lea ecx, dword ptr [ebp-24]
:00417200 51 push ecx ====> User Name
:00417201 E888CFFFFF call 0041418E ====> 关键比对，我们将追进去
:00417206 83C40C add esp, 0000000C
:00417209 898578FFFFFF mov dword ptr [ebp+FFFFFF78], eax ====> eax作为判断标志
:0041720F 83BD78FFFFFF00 cmp dword ptr [ebp+FFFFFF78], 00000000 ====> 是否注册成功
:00417216 7559 jne 00417271 ====> 没有则转
......
:00417234 6A00 push 00000000
:00417236 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Successful Registration!"
|
:00417238 68740A4400 push 00440A74

* Reference To: MFC42.Ordinal:04B0, Ord:04B0h
|
:0041723D E838130200 Call 0043857A ====> MessageBoxA
:00417242 C645FC01 mov [ebp-04], 01
:00417246 8D4DF0 lea ecx, dword ptr [ebp-10]
上面的其他判断过程略过，其中，eax=1则用户名输入错误；eax=2则E-mail地址输入错误；eax=3则注册码输入错误

从上面我们看出，00417201语句的call 0041418E是注册计算和比对的关键，我们追进去，如下：

:004141B8 8B4D10 mov ecx, dword ptr [ebp+10]
:004141BB E860DEFEFF call 00402020
:004141C0 50 push eax ====> 注册码地址入栈
:004141C1 E8DF63FFFF call 0040A5A5 ====> 计算注册码是否正确的call

此call首先比较注册码长度是否等于19(13h)，如果相等则将前18个注册码的ascii值相加，除以36(24h)，余数如果小于10，则检测值等于相应的数字，否则检测值等于'A'+余数-10，即为A-Z的一个字符，如果检测值与第19个字符相等，则注册码正确，返回EAX=1，否则EAX=0
4141C1语句可以这样理解，程序建立一个子程序或函数，用来检测注册码是否正确：call TestCorrect(Registration)

:004141C6 83C404 add esp, 00000004
:004141C9 8845F8 mov byte ptr [ebp-08], al
:004141CC 8B45F8 mov eax, dword ptr [ebp-08]
:004141CF 25FF000000 and eax, 000000FF
:004141D4 85C0 test eax, eax ====> 注册码是否正确
:004141D6 7507 jne 004141DF ====> 正确则转
:004141D8 B803000000 mov eax, 00000003 ====> 错误号
:004141DD EB7F jmp 0041425E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004141D6(C)
|
:004141DF 8B4D10 mov ecx, dword ptr [ebp+10]
:004141E2 E839DEFEFF call 00402020 ====> 返回ecx的内容地址指针
====> 这里指向输入的注册码地址
:004141E7 50 push eax

* Reference To: MSVCRT.strlen, Ord:02BEh
|
:004141E8 E88F480200 Call 00438A7C
:004141ED 83C404 add esp, 00000004
:004141F0 8945DC mov dword ptr [ebp-24], eax
:004141F3 8B4DDC mov ecx, dword ptr [ebp-24]
:004141F6 51 push ecx ====> 注册码的长度
:004141F7 8B4D10 mov ecx, dword ptr [ebp+10]
:004141FA E821DEFEFF call 00402020
:004141FF 50 push eax ====> 注册码地址
:00414200 6A11 push 00000011 ====> 进行计算并变换代码的长度
:00414202 8D55E0 lea edx, dword ptr [ebp-20]
:00414205 52 push edx ====> 进行计算并变换代码的存放地址
:00414206 E84362FFFF call 0040A44E ====> 代码变换，共17(11h)个，很重要
:0041420B 83C410 add esp, 00000010
:0041420E 8B4D08 mov ecx, dword ptr [ebp+08] ====> ecx用户名地址
:00414211 E80ADEFEFF call 00402020
:00414216 50 push eax
:00414217 E8FF5CFFFF call 00409F1B ====> 进行计算
对用户名变换后得到一个检测值，结果返回到EAX
变换过程：将用户名各个字符的ascii值相加，然后除以1Ah(26)，余数+"A"-0Ah即余数+37h

:0041421C 83C404 add esp, 00000004
:0041421F 8845FC mov byte ptr [ebp-04], al
:00414222 0FBE45E4 movsx eax, byte ptr [ebp-1C] ====> 变换代码的第5个值
:00414226 0FBE4DFC movsx ecx, byte ptr [ebp-04] ====> 取出用户名的计算值
:0041422A 3BC1 cmp eax, ecx ====> 进行比较
:0041422C 7407 je 00414235 ====> 相等则继续
:0041422E B801000000 mov eax, 00000001 ====> 错误号
:00414233 EB29 jmp 0041425E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041422C(C)
|
:00414235 8B4D0C mov ecx, dword ptr [ebp+0C]
:00414238 E8E3DDFEFF call 00402020
:0041423D 50 push eax ====> E-mail地址
:0041423E E8D85CFFFF call 00409F1B ====> 进行计算，过程同用户名计算一样
:00414243 83C404 add esp, 00000004
:00414246 8845F4 mov byte ptr [ebp-0C], al
:00414249 0FBE55E6 movsx edx, byte ptr [ebp-1A] ====> 变换代码的第7个值
:0041424D 0FBE45F4 movsx eax, byte ptr [ebp-0C] ====> 取出E-mail的计算值
:00414251 3BD0 cmp edx, eax ====> 进行比较
:00414253 7407 je 0041425C ====> 相等则转
:00414255 B802000000 mov eax, 00000002 ====> 错误号
:0041425A EB02 jmp 0041425E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414253(C)
|
:0041425C 33C0 xor eax, eax ====> 正确的eax值

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004141DD(U), :00414233(U), :0041425A(U)
|
:0041425E 8BE5 mov esp, ebp
:00414260 5D pop ebp
:00414261 C3 ret
上面这段的关键是对注册码进行变换和对用户名和E-mail地址的计算，其中，对用户名和E-mail地址的计算已经说完，现在看看如何对注册码进行变换，即414206的call 0040A44E语句，如下：

* Referenced by a CALL at Addresses:
|:00409D73 , :0040A673 , :0040A6F6 , :00414206 , :004142DD
|
:0040A44E 55 push ebp
:0040A44F 8BEC mov ebp, esp
:0040A451 83EC24 sub esp, 00000024
:0040A454 C745F810000000 mov [ebp-08], 00000010 ====> 设初值
:0040A45B 8B4510 mov eax, dword ptr [ebp+10]
:0040A45E 8A4811 mov cl, byte ptr [eax+11] ====> 取出注册码的第18个字符
:0040A461 884DF4 mov byte ptr [ebp-0C], cl
:0040A464 8A55F4 mov dl, byte ptr [ebp-0C]
:0040A467 52 push edx ====> 第18个字符入栈
:0040A468 E801FDFFFF call 0040A16E ====> 进行计算，计算结果返回到eax中
上句可以看作是对某个参数进行变换的函数，如ChangeCode(edx)，计算过程：如果edx(要计算的字符的ascii值)在30h-39h，则返回结果为0-9，否则返回结果为edx+"A"-0ah=edx-37h

:0040A46D 83C404 add esp, 00000004
:0040A470 8945FC mov dword ptr [ebp-04], eax ====> 计算结果放到[ebp-04]中，为说明方便，设值为X18
:0040A473 8B4508 mov eax, dword ptr [ebp+08] ====> 变换码的地址
:0040A476 8B4D10 mov ecx, dword ptr [ebp+10]
:0040A479 8A11 mov dl, byte ptr [ecx] ====> 取注册码的第1个字符
:0040A47B 8810 mov byte ptr [eax], dl ====> 放到变换码中，即注册码的第1个字符也是变换码的第1个字符
:0040A47D C745F000000000 mov [ebp-10], 00000000 ====> 设初值
:0040A484 EB09 jmp 0040A48F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A51D(U)
|
:0040A486 8B45F0 mov eax, dword ptr [ebp-10] ====> 取出变换次数值
:0040A489 83C001 add eax, 00000001 ====> 准备取下一个字符
:0040A48C 8945F0 mov dword ptr [ebp-10], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A484(U)
|
:0040A48F 8B4DF0 mov ecx, dword ptr [ebp-10]
:0040A492 3B4DF8 cmp ecx, dword ptr [ebp-08] ====> 是否变换完毕
:0040A495 0F8D87000000 jnl 0040A522 ====> 没有，则继续
:0040A49B 8B45F0 mov eax, dword ptr [ebp-10] ====> 取出变换次数值
:0040A49E 99 cdq
:0040A49F 2BC2 sub eax, edx
:0040A4A1 D1F8 sar eax, 1 ====> 除以2
:0040A4A3 8945E4 mov dword ptr [ebp-1C], eax
:0040A4A6 8B55FC mov edx, dword ptr [ebp-04] ====> 第18个注册码的计算值X18
:0040A4A9 F7DA neg edx ====> 取负数，即-X18
:0040A4AB 2B55F0 sub edx, dword ptr [ebp-10] ====> -X18-变换次数
:0040A4AE 8955DC mov dword ptr [ebp-24], edx ====> 放到[ebp-24]中
:0040A4B1 837DE400 cmp dword ptr [ebp-1C], 00000000 ====> 要变换的是否是第2、3个的注册码
:0040A4B5 7409 je 0040A4C0 ====> 是则转
:0040A4B7 8B45FC mov eax, dword ptr [ebp-04] ====> 第18个注册码的计算值X18
:0040A4BA 0345F0 add eax, dword ptr [ebp-10] ====> X18+变换次数
:0040A4BD 8945DC mov dword ptr [ebp-24], eax ====> 放到[ebp-24]中
40A486-40A4BD的计算：i=1~19表示注册码字符所在的位置，如果变换的是第2和3个的注册码，则[ebp-24]=-(X18+i-2)，否则=(X18+i-2)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A4B5(C)
|
:0040A4C0 6A24 push 00000024 \
:0040A4C2 8B4DDC mov ecx, dword ptr [ebp-24] \
:0040A4C5 F7D9 neg ecx |
:0040A4C7 51 push ecx ====> 这段跟注册码变换无关
:0040A4C8 E829FEFFFF call 0040A2F6 |
:0040A4CD 83C408 add esp, 00000008 /
:0040A4D0 8945E8 mov dword ptr [ebp-18], eax /

:0040A4D3 8B5510 mov edx, dword ptr [ebp+10] ====> 注册码地址
:0040A4D6 0355F0 add edx, dword ptr [ebp-10]
:0040A4D9 8A4201 mov al, byte ptr [edx+01] ====> 取出相应的注册码
:0040A4DC 8845E0 mov byte ptr [ebp-20], al
:0040A4DF 8A4DE0 mov cl, byte ptr [ebp-20]
:0040A4E2 51 push ecx
:0040A4E3 E886FCFFFF call 0040A16E ====> 进行变换
:0040A4E8 83C404 add esp, 00000004
:0040A4EB 8945EC mov dword ptr [ebp-14], eax ====> 结果放入到[ebp-14]中
:0040A4EE 8B55EC mov edx, dword ptr [ebp-14]
:0040A4F1 2B55DC sub edx, dword ptr [ebp-24] ====> -[ebp-24]，因此跟注册码所在的位置有关
:0040A4F4 8955EC mov dword ptr [ebp-14], edx
:0040A4F7 6A24 push 00000024 ====> 为什么是24h？因为字符0~9加上A~Z正好共36个(24h)
:0040A4F9 8B45EC mov eax, dword ptr [ebp-14]
:0040A4FC 50 push eax
:0040A4FD E8F4FDFFFF call 0040A2F6 ====> 进行变换
变换过程：如果[ebp-14]为负数，则[ebp-14]+24h，直到为非负值且小于24h；如果[ebp-14]为正数且大于等于24h，则[ebp-14]-24h直到为非负值且小于24h

:0040A502 83C408 add esp, 00000008
:0040A505 8945EC mov dword ptr [ebp-14], eax
:0040A508 8B4DEC mov ecx, dword ptr [ebp-14]
:0040A50B 51 push ecx
:0040A50C E8A9FBFFFF call 0040A0BA ====> 根据上面相应的计算结果确定变换代码
确定过程：如果[ebp-14](即ecx)的值在0-9，则转为相应的数字，即eax=ecx+30h，否则eax=ecx+"A"-0ah=ecx+37h

:0040A511 83C404 add esp, 00000004
:0040A514 8B5508 mov edx, dword ptr [ebp+08]
:0040A517 0355F0 add edx, dword ptr [ebp-10]
:0040A51A 884201 mov byte ptr [edx+01], al ====> 变换结果放入到变换代码地址中
:0040A51D E964FFFFFF jmp 0040A486

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A495(C)
|
:0040A522 8BE5 mov esp, ebp
:0040A524 5D pop ebp
:0040A525 C3 ret

总结上面的变换过程：
1. 注册码必须是19个字符且字符范围在0~9和A~Z之间
2. 设注册码用R来表示，则R19=((R1+R2+...+R18) mod 24h)+(30h或37h)，如果前面的余数<=9则+30h，否则+37h
3. 设第18位注册码的变换码为X18，则X18=R18-37h(注册码在A~Z)或X18=R18-30h(注册码在0~9)，如果用笔计算一下就可知道，R18肯定是A~Z之间的字符，因此，X18=R18-37h
4. 用户名和E-mail地址名的计算值=(所有字符的ascii值相加 mod 1Ah)+37h，注意：用户名和E-mail地址名不能用中文字符
5. 变换代码的计算过程(用y表示)
(1) y1=r1
(2) 如果i=2或3， yi=((X1-(-(X18+i-2))) mod 24h)+30h或37h=(X1+X18+i-2) mod 24h)+30h或37h
(3) 如果i=4到17，yi=((X1-(X18+i-2))±n*24h)+30h或37h=(X1-X18-i+2±n*24h)+30h或37h n=0,1,2
6. y5与用户名的计算值相等，y7与E-mail地址的计算值相等，因此，y5和y7肯定是在A~Z之间
根据上面的变换过程我们可以做出这个软件的注册器，第一种方法是先构造一个19位的注册码，然后利用第5,7,18位的注册码再相应构造用户名和E-mail地址，这种方法虽然简单，但用户名和E-mail地址可能很难看，因为我们还是喜欢用户名和E-mail地址易懂的注册码，因此采用第二种方法
第二种方法是先构造用户名和密码，生成相应的计算值，再构造第18位的注册码，然后根据用户名和密码的计算值及第18位的注册码确定第5和第7位的注册码，而第1~4，6，8~17位的注册码随机生成，只要符合在0~9或A~Z之间即可，最后生成第18位的注册码，根据这个思路，注册机如下(VB程序)：
Private Sub Command1_Click()
Dim UserName, EmailAddress, RegCode, UserNameLong, EmailLong
Dim CheckUserCode, CheckEmailCode, RandCode, CheckCode
RegCode = "": CheckCode = ""
UserName = Text1.Text
EmailAddress = Text2.Text
UserNameLong = Len(Text1.Text)
EmailLong = Len(Text2.Text)
If UserNameLong = 0 Then
MsgBox "用户名不能为空！", vbOKOnly, "请输入用户名"
Exit Sub
Else
For i = 1 To UserNameLong
CheckUserCode = CheckUserCode + Asc(Mid(UserName, i, 1))
Next
CheckUserCode = (CheckUserCode Mod 26) + &H41
End If
If EmailLong = 0 Then
MsgBox "Email地址不能为空！", vbOKOnly, "请输入Email地址"
Exit Sub
Else
For i = 1 To EmailLong
CheckEmailCode = CheckEmailCode + Asc(Mid(EmailAddress, i, 1))
Next
CheckEmailCode = (CheckEmailCode Mod 26) + &H41
End If
GetReg18:
Reg18 = MakeRndCode()
If Reg18 <= &H39 Then
GoTo GetReg18
Else
Reg18Mod = Reg18 - &H37
End If
Reg5 = (Reg18Mod + 3 + CheckUserCode - &H37) Mod &H24
If Reg5 <= 9 Then
Reg5 = Reg5 + &H30
Else
Reg5 = Reg5 + &H37
End If
If Reg5 > &H5A Then GoTo GetReg18
Reg7 = (Reg18Mod + 5 + CheckEmailCode - &H37) Mod &H24
If Reg7 <= 9 Then
Reg7 = Reg7 + &H30

Else
Reg7 = Reg7 + &H37
End If
If Reg7 > &H5A Then GoTo GetReg18
For i = 1 To 4
RandCode = MakeRndCode()
RegCode = RegCode + Chr(RandCode)
Next
RegCode = RegCode + Chr(Reg5)
RandCode = MakeRndCode()
RegCode = RegCode + Chr(RandCode)
RegCode = RegCode + Chr(Reg7)
For i = 8 To 17
RandCode = MakeRndCode()
RegCode = RegCode + Chr(RandCode)
Next
RegCode = RegCode + Chr(Reg18)
RandCode = 0
For i = 1 To 18
RandCode = RandCode + Asc(Mid(RegCode, i, 1))
Next
RandCode = RandCode Mod &H24
If RandCode <= 9 Then
RegCode = RegCode + Chr(RandCode + &H30)
Else
RegCode = RegCode + Chr(RandCode + &H37)
End If
Text3.Text = RegCode
End Sub

Function MakeRndCode()
Dim a
Randomize
NextRnd:
Do
a = Int(Rnd * 120)
Loop Until a >= &H30 And a <= &H5A
If a > &H39 And a < &H41 Then
GoTo NextRnd
End If
MakeRndCode = a
End Function


All Aboard! SE 2.5

 All Aboard! SE 完全破解实战

    只需要一个网卡，不需要设置，就可以和别人共享上网，这就是All Aboard的特别之处。它支持各种上网方式：Analog MODEM、 xDSL 、Cable MODEM、 ISDN 、T1, T3/E1, E3以及Satellite ，真的是一个非常棒的上网共享工具。未注册版有30天的试用期，而且只用户数也少。这个软件加密部分的汇编代码挺复杂的，我们也不能从对程序的动态跟踪过程中找到或者直接推算出正确的注册码，而且即便是你看明白了汇编代码，也要花一些时间才能想到实现注册机的算法，否则直接通过对程序的跟踪而用穷举法写出注册机，真的是“等到花儿也榭了”也难以算出正确注册码，即使你用1G的P4来跑注册机程序，不信你可以试试，哈哈。。。^_^

程序名　：All Aboard! SE
版本 　 ：V2.5
大小 　 ：1,182KB
运行平台：Windows 95/98/Me/NT/2000
保护方式：注册码
破解方式：注册码破解
破解难度：较难
程序下载：allaboard25.exe
附件　　：注册机及其C语言源程序

破解步骤：

1. 用softice载入windows（通过CTRL+D来检查softice是否已经准备好，按F5退出softice）；

2. 在“开始”菜单中点击“All_Aboard Standard Edition”下的“Server Settings”，然后选择“License”进行注册；

3. 在“License”中输入：12345678（随意）；

4. 用CTRL+D呼出softice，下万能断点：bpx hmemcpy，按F5返回到All Aboard；

5. 在All Aboard中点击“应用”，很快程序就被softice拦截下来；

6. 用 bd * 暂停断点 bpx hmemcpy ；

7. 按F12键8次，返回到All Aboard的领空，程序停留在下面的地方（注意此时Softice中显示的是“CONTYPE!.text+000241A2”字样，程序的注册码程序放在contype.dll和key_prot.dll两个动态连接库中，因为“Server Settings”调用的是settings.exe，所以我们是不可能在Softice看到所谓的“ALL_ABOARD”领空字样的，之所以会用“All Aboard领空”的表述，主要是简化而已，因为你在破解过程中会碰到“SETTINGS!.text”、“CONTYPE!.text”和“KEY_PROT!.text”的字样，这里统统用All Aboard来代表，不做区分了）：
。。。
0167:100251A2　CALL　[USER32!GetWindowTextA]
0167:100251A8　MOV　ECX, [EBP+10]　　　　　　　　　　　　<-- 程序停在这里
0167:100251AB　PUSH　FF
0167:100251AD　CALL　1002322F
0167:100251B2　JMP　100251D4
。。。

8. 连续按F10（多少次我可不知道啊^_^），注意是否有可疑的地方，中间你会进入WINDOWS系统区域“COMCTL32!.text”中，按F12继续走，最后你会发现在还没有重新返回到All Aboard的领空之前All Aboard就已经弹出窗口“Invalid License Key”告诉你注册码错误。是不是有点奇怪：为什么都没有看到任何跟输入注册码“12345678”相关的程序段就被告之注册码错误？那么程序究竟在何处判断注册码正确与否的呢？看来刚才我们下的断点“bpx hmemcpy”不能正确拦截到关键的地方，没关系，山不转水转，我们换另外一个断点试试；

9. 首先在Softice中用 BC * 清除原来设置的断点，然后重新来到All Aboard中注册的地方，输入注册码“12345678”并按“应用”，接着All Aboard弹出“Invalid License Key”的错误窗口，按CTRL+D呼出Softice，下断点“bpx lockmytask”（这个断点的作用是拦截按键的动作），然后按F5返回，点击“确定”按钮，程序马上被Softice拦截下来；

10. 用 bd * 暂停断点 bpx lockmytask ，然后按F12键20次，返回到All Aboard的领空，程序停留在下面的地方：
。。。
0167:100034A6　CALL　[USER32!MessageBoxA]
0167:100034AC　PUSH　ESI　　　　　　　　　　　　　　　　　<-- 程序停在这里
0167:100034AD　CALL　[KERNEL32!FreeLibrary]
0167:100034B3　LEA　ECX, [ESP+0C]
0167:100034B7　MOV　[ESP+00000118], BL
0167:100034BE　CALL　1002304E
0167:100034C3　LEA　ECX, [ESP+08]
0167:100034C7　MOV　DWORD PTR [ESP+00000118], FFFFFFFF
0167:100034D2　CALL　1002304E
0167:100034D7　POP　ESI
0167:100034D8　MOV　EAX, 00000001
0167:100034DD　POP　EBX
0167:100034DE　MOV　ECX, [ESP+00000108]
0167:100034E5　MOV　FS:[00000000], ECX
0167:100034EC　ADD　ESP, 00000114
0167:100034F2　RET
。。。

11. 上面0167:100034A6的CALL [USER32!MessageBoxA]自然就是刚才错误框的弹出地方了，按一下F12（或按多次F10）走出这段子程序，来到它的下一条指令：
。。。
0167:1000D7BA　MOV　ECX, [ESI+00000090]
0167:1000D7C0　MOV　EDX, [ESI+1C]
0167:1000D7C3　MOV　EDI, EAX
0167:1000D7C5　PUSH　EDI
0167:1000D7C6　PUSH　ECX
0167:1000D7C7　PUSH　EDX
0167:1000D7C8　CALL　10003360
0167:1000D7CD　ADD　ESP, 0C　　　　　　　　　　　　　　　<-- 程序来到这里
0167:1000D7D0　TEST　EAX, EAX
0167:1000D7D2　JZ　1000D831
。。。

12. 从步骤10的程序中返回后来到0167:1000D7CD　ADD ESP, 0C，往前看我们会发现其上一句0167:1000D7C8是个子程序CALL 10003360，而错误框正是从它里面跑出来的，所以我们要进去看一看：将鼠标移到0167:1000D7C5　PUSH EDI处点击一下，然后按F9在此设置断点；

13. 按F5返回All Aboard，重新输入注册码“12345678”，然后按“应用”按钮，程序被Softice拦截并停在0167:1000D7C5　PUSH EDI处，按F10走到0167:1000D7C8　CALL 10003360停下来，分别用 D EDI 、D ECX 和 D EDX 命令，你会发现EDI指向我们输入的注册码“12345678”，哈哈。。。现在终于找到了和输入注册码有关系的地方，自然不能放过它，按F8进入这个CALL 10003360去看看：
0167:10003360　PUSH　FF
0167:10003362　PUSH　100285B6
0167:10003367　MOV　EAX, FS:[00000000]
0167:1000336D　PUSH　EAX
0167:1000336E　MOV　FS:[00000000], ESP
0167:10003375　SUB　ESP, 00000108
0167:1000337B　MOV　EAX, [10035974]
0167:10003380　PUSH　EBX
0167:10003381　PUSH　ESI
0167:10003382　MOV　[ESP+08], EAX
0167:10003386　XOR　EBX, EBX
0167:10003388　MOV　[ESP+0C], EAX
0167:1000338C　MOV　[ESP+00000118], EBX
0167:10003393　MOV　ECX, [10036E0C]
0167:10003399　MOV　BYTE PTR [ESP+00000118], 01
0167:100033A1　CMP　ECX, EBX
0167:100033A3　JZ　100033B1
0167:100033A5　CMP　[10036E08], EBX
0167:100033AB　JNZ　1000345B
。。。
0167:1000345B　MOV　ESI, [ESP+08]
0167:1000345F　CALL　ECX
0167:10003461　MOV　ECX, [ESP+00000128]
0167:10003468　PUSH　EAX
0167:10003469　PUSH　ECX　　　　　　　　　　　　　　　　　<-- ECX指向我们输入的注册码“12345678”
0167:1000346A　CALL　[10036E08]
0167:10003470　TEST　EAX, EAX
0167:10003472　JNZ　100034F3
0167:10003474　PUSH　00000011
0167:10003476　LEA　ECX, [ESP+0C]
0167:1000347A　CALL　100232C5
。。。

14. 按F10走到0167:1000346A　CALL [10036E08]停下，分别用 D EAX 和 D ECX 命令，你会看到ECX指向我们输入的注册码“12345678”，而EAX指向的内存区域则是数据“17 00 03 ...”，没有什么特别的字符串，那么CALL [10036E08]究竟有何作用呢？继续按F10走到0167:10003472　JNZ 100034F3，你会发现此时由于EAX=0程序将继续往下走而不是跳到100034F3去：
。。。
0167:10003474　PUSH 00000011
0167:10003476　LEA ECX, [ESP+0C]
0167:1000347A　CALL 100232C5
0167:1000347F　TEST　EAX, EAX
0167:10003481　JZ　100034B3
0167:10003483　PUSH　00000022
0167:10003485　LEA　ECX, [ESP+10]
0167:10003489　CALL　100232C5
0167:1000348E　TEST　EAX, EAX
0167:10003490　JZ　100034B3
0167:10003492　MOV　EDX, [ESP+0C]
0167:10003496　MOV　EAX, [ESP+08]
0167:1000349A　MOV　ECX, [ESP+00000120]
0167:100034A1　PUSH　00000010
0167:100034A3　PUSH　EDX
0167:100034A4　PUSH　EAX
0167:100034A5　PUSH　ECX
0167:100034A6　CALL　[USER32!MessageBoxA]　　　　　　　　　<-- 这里又来到步骤10的地方
0167:100034AC　PUSH　ESI
0167:100034AD　CALL　[KERNEL32!FreeLibrary]
0167:100034B3　LEA　ECX, [ESP+0C]
0167:100034B7　MOV　[ESP+00000118], BL
0167:100034BE　CALL　1002304E
0167:100034C3　LEA　ECX, [ESP+08]
0167:100034C7　MOV　DWORD PTR [ESP+00000118], FFFFFFFF
0167:100034D2　CALL　1002304E
0167:100034D7　POP　ESI
0167:100034D8　MOV　EAX, 00000001
0167:100034DD　POP　EBX
0167:100034DE　MOV　ECX, [ESP+00000108]
0167:100034E5　MOV　FS:[00000000], ECX
0167:100034EC　ADD　ESP, 00000114
0167:100034F2　RET
。。。

15. 接着刚才继续按F10往下走（除了0167:10003472　JNZ　100034F3能跳离这里，程序将必然会继续往下走），当走过0167:100034A6　CALL　[USER32!MessageBoxA]这句时你会看到可恶的错误窗又跑出来了（其实这里就是步骤10的地方），现在说明0167:1000346A处的CALL　[10036E08]一定有问题，接下来知道该怎么做了吧^_^；

16. 按一下错误框的“确定”按钮，程序将返回Softice，先用 BD * 暂停以前设置的所有断点，然后将鼠标移到0167:1000346A　CALL　[10036E08]并按F9在这里设置断点，接着按F5返回All Aboard；

17. 重新输入注册码“12345678”进行注册，按“应用”，程序被Softice拦截住停在0167:1000346A　CALL　[10036E08]，按F8进去看个究竟：
。。。
0167:012A13EE　PUSH　EBP
0167:012A13EF　MOV　EBP, ESP
0167:012A13F1　SUB　ESP, 00000010
0167:012A13F4　PUSH　ESI
0167:012A13F5　MOV　ESI, [EBP+0C]
0167:012A13F8　MOV　AL, [ESI]　　　　　　　　　　　　　　　<-- ESI指向内存数据“17 00 03 ...”
0167:012A13FA　MOV　[EBP+0C], AL
0167:012A13FD　MOV　AL, [ESI+01]
0167:012A1400　MOV　[EBP+0D], AL
0167:012A1403　MOV　AL, [ESI+02]
0167:012A1406　MOV　[EBP+0E], AL
0167:012A1409　LEA　EAX, [EBP-08]
0167:012A140C　PUSH　EAX
0167:012A140D　LEA　EAX, [EBP-0C]
0167:012A1410　PUSH　EAX
0167:012A1411　LEA　EAX, [EBP-10]
0167:012A1414　PUSH　EAX
0167:012A1415　LEA　EAX, [EBP+08]
0167:012A1418　PUSH　EAX
0167:012A1419　LEA　EAX, [EBP+0C]
0167:012A141C　PUSH　EAX
0167:012A141D　PUSH DWORD PTR [EBP+08]　　　　　　　　　　　<-- [EBP+08]指向我们输入的注册码“12345678”
0167:012A1420　CALL　012A122D
0167:012A1425　TEST　EAX, EAX
0167:012A1427　JZ　012A1466
。。。

18. 进入上面的程序后，如果你看一下Softice中程序领空的位置，你会发现此时我们已经进入Key_prot.dll中了。按F10一路走，一路用 D 寄存器名 命令，你会发现0167:012A13F8　MOV　AL, [ESI]时ESI指向的内存区域是刚才步骤0167:1000346A　CALL　[10036E08]的入口参数“17 00 03”，下面的几条指令将这几个数放进堆栈中，中间有很多的PUSH EAX，我们用 D EAX 并没有看到可疑字符串，而且内存数据也没什么特别的，当走到0167:012A141D　PUSH DWORD PTR [EBP+08]时[EBP+08]=00D74390，用 D 00D74390 你会看到内存里是我们输入的注册码“12345678”，那么0167:012A1420的CALL　012A122D有什么作用呢？没办法，按F8进去看看吧：
。。。
0167:012A122D　PUSH　EBP
0167:012A122E　MOV　 EBP, ESP
0167:012A1230　SUB　ESP, 00000028
0167:012A1233　PUSH　EBX
0167:012A1234　PUSH　ESI　　　　　　　　　　　　　　　　　　<-- ESI指向内存数据“17 00 03 ...”
0167:012A1235　PUSH　EDI　　　　　　　　　　　　　　　　　　<-- EDI指向我们输入的注册码“12345678”
0167:012A1236　CALL　012A100C
0167:012A123B　MOV　 ESI, [EBP+08]
0167:012A123E　PUSH　 ESI
0167:012A123F　CALL　012A13AB
0167:012A1244　CMP　BYTE PTR [ESI], 00
0167:012A1247　POP　 ECX
0167:012A1248　JZ　 012A137D
。。。

19. 按F10走到0167:012A1236　CALL　012A100C，用 D EBX 、D ESI 和 D EDI 命令，你会发现ESI指向内存数据“17 00 03 ...”，而EDI指向我们输入的注册码“12345678”，为了明白CALL　012A100C的作用，按F8进去看看：
。。。
0167:012A100C　AND　BYTE PTR [10009D60], 00
0167:012A1013　MOV　BYTE PTR [10009D40], 51
0167:012A101A　MOV　BYTE PTR [10009D41], 39
0167:012A1021　MOV　BYTE PTR [10009D42], 52
0167:012A1028　MOV　BYTE PTR [10009D43], 32
0167:012A102F　MOV　BYTE PTR [10009D44], 57
0167:012A1036　MOV　BYTE PTR [10009D45], 5A
0167:012A103D　MOV　BYTE PTR [10009D46], 41
0167:012A1044　MOV　BYTE PTR [10009D47], 53
0167:012A104B　MOV　BYTE PTR [10009D48], 58
0167:012A1052　MOV　BYTE PTR [10009D49], 38
0167:012A1059　MOV　BYTE PTR [10009D4A], 4B
0167:012A1060　MOV　BYTE PTR [10009D4B], 42
0167:012A1067　MOV　BYTE PTR [10009D4C], 4D
0167:012A106E　MOV　BYTE PTR [10009D4D], 47
0167:012A1075　MOV　BYTE PTR [10009D4E], 54
0167:012A107C　MOV　BYTE PTR [10009D4F], 35
0167:012A1083　MOV　BYTE PTR [10009D50], 33
0167:012A108A　MOV　BYTE PTR [10009D51], 44
0167:012A1091　MOV　BYTE PTR [10009D52], 45
0167:012A1098　MOV　BYTE PTR [10009D53], 43
0167:012A109F　MOV　BYTE PTR [10009D54], 36
0167:012A10A6　MOV　BYTE PTR [10009D55], 59
0167:012A10AD　MOV　BYTE PTR [10009D56], 34
0167:012A10B4　MOV　BYTE PTR [10009D57], 4E
0167:012A10BB　MOV　BYTE PTR [10009D58], 48
0167:012A10C2　MOV　BYTE PTR [10009D59], 50
0167:012A10C9　MOV　BYTE PTR [10009D5A], 37
0167:012A10D0　MOV　BYTE PTR [10009D5B], 56
0167:012A10D7　MOV　BYTE PTR [10009D5C], 25
0167:012A10DE　MOV　BYTE PTR [10009D5D], 4A
0167:012A10E5　MOV　BYTE PTR [10009D5E], 46
0167:012A10EC　MOV　BYTE PTR [10009D5F], 55
0167:012A10F3　RET
。。。

20. 哇噻！程序将总共32个字符分别依次放在内存地址10009D40开始的地方，按F10走到最后一句0167:012A10F3　RET，用 D 10009D40 我们可以看到这串字符是： “Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”，再按一次F10，从这个子程序中返回：
。。。
0167:012A1236　CALL　012A100C
0167:012A123B　MOV　ESI, [EBP+08]　　　　　　　　　　　　　<-- 返回后程序来到这里
0167:012A123E　PUSH　ESI　　　　　　　　　　　　　　　　　　<-- ESI指向我们输入的注册码“12345678”
0167:012A123F　CALL　012A13AB
0167:012A1244　CMP　BYTE PTR [ESI], 00
0167:012A1247　POP　ECX
0167:012A1248　JZ　012A137D
。。。

21. 按F10走到0167:012A123F　CALL　012A13AB，用 D ESI 可以看到ESI指向我们输入的注册码“12345678”，按F8跟踪进入CALL　012A13AB里去看看：
。。。
0167:012A13AB　PUSH　EBP
0167:012A13AC　MOV　EBP, ESP
0167:012A13AE　SUB　ESP, 00000040
0167:012A13B1　PUSH　ESI
0167:012A13B2　MOV　ESI, [EBP+08]
0167:012A13B5　LEA　EAX, [EBP-40]
0167:012A13B8　PUSH　ESI　　　　　　　　　　　　　　　　　　<-- ESI指向我们输入的注册码“12345678”
0167:012A13B9　PUSH　EAX
0167:012A13BA　CALL　012A1940
0167:012A13BF　CMP　BYTE PTR [EBP-40], 00
0167:012A13C3　POP　ECX
0167:012A13C4　POP　ECX
0167:012A13C5　JZ　012A13EB
。。。

22. 按F10走到0167:012A13BA　CALL　012A1940，用 D ESI 可以看到ESI指向我们输入的注册码“12345678”，再次按F8跟踪进入CALL　012A1940里去看看：
。。。
0167:012A1940　PUSH EDI
0167:012A1941　MOV EDI, [ESP+08]
0167:012A1945　JMP 012A19B1
。。。
0167:012A19B1　MOV ECX, [ESP+0C]
0167:012A19B5　TEST ECX, 00000003　　　　　　　　　　　　　<-- ECX指向我们输入的注册码“12345678”
0167:012A19BB　JZ 012A19D6
。。。
0167:012A19D1　MOV [EDI], EDX　　　　　　　　　　　　　　　<-- 将处理后得到的注册码字符放在[EDI]中
0167:012A19D3　ADD EDI, 00000004　　　　　　　　　　　　　 <-- 指针EDI加4，用于下一次存放注册码字符
下面的指令比上面两句先执行。。。
0167:012A19D6　MOV EDX, 7EFEFEFF　　　　　　　　　　　　　 <-- EDX赋值为7EFEFEFF
0167:012A19DB　MOV EAX, [ECX]　　　　　　　　　　　　　　　<-- 取出4位注册码放在EAX中
0167:012A19DD　ADD EDX, EAX　　　　　　　　　　　　　　　　<-- 注册码的ASCII值加上7EFEFEFF
0167:012A19DF　XOR EAX, FFFFFFFF　　　　　　　　　　　　　 <-- 注册码的ASCII值与FFFFFFFF异或
0167:012A19E2　XOR EAX, EDX　　　　　　　　　　　　　　　　<-- 将上面两步注册码的计算结果进行异或
0167:012A19E4　MOV EDX, [ECX]　　　　　　　　　　　　　　　<-- 将刚才取出的4位注册码备份放在EDX中
0167:012A19E6　ADD ECX, 00000004　　　　　　　　　　　　 　<-- 指向字符串的指针加4，即指向下4个字符
0167:012A19E9　TEST EAX, 81010100　　　　　　　　　　　　　<-- 将刚才注册码的计算结果和81010100异或
0167:012A19EE　JZ 012A19D1　　　　　　　　　　　　　　　　 <-- 异或结果为零则跳到100019D1去
0167:012A19F0　TEST DL, DL　　　　　　　　　　　　　　　　 <-- 否则测试取出的4位注册码字符第一位是否为零，即字符串已经结束
0167:012A19F2　JZ 012A1A28
0167:012A19F4　TEST DH, DH　　　　　　　　　　　　　　　　 <-- 如果第一位有效则继续测试第二位
0167:012A19F6　JZ 012A1A1F
0167:012A19F8　TEST EDX, 00FF0000　　　　　　　　　　　　　<-- 如果第二位有效则继续测试第三位
0167:012A19FE　JZ 012A1A12
0167:012A1A00　TEST EDX, FF000000　　　　　　　　　　　　　<-- 如果第三位有效则继续测试第四位
0167:012A1A06　JZ 012A1A0A
0167:012A1A08　JMP 012A19D1
0167:012A1A0A　MOV [EDI], EDX　　　　　　　　　　　　　　　<-- 如果取出的字符第四位为零则直接将EDX的值存在[EDI]中并返回（因为最后的DL=00刚好可以作为字符串结束符）
0167:012A1A0C　MOV EAX, [ESP+08]
0167:012A1A10　POP EDI
0167:012A1A11　RET
0167:012A1A12　MOV [EDI], DX　　　　　　　　　　　　　　　　<-- 如果取出的字符第三位为零则将DX的值（即前两位字符）存在[EDI]中，然后在其后补“00”并返回
0167:012A1A15　MOV EAX, [ESP+08]
0167:012A1A19　MOV BYTE PTR [EDI+02], 00
0167:012A1A1D　POP EDI
0167:012A1A1E　RET
0167:012A1A1F　MOV [EDI], DX　　　　　　　　　　　　　　　　<-- 如果取出的字符第二位为零则将DX的值存在[EDI]中并返回
0167:012A1A22　MOV EAX, [ESP+08]
0167:012A1A26　POP EDI
0167:012A1A27　RET
0167:012A1A28　MOV [EDI], DL　　　　　　　　　　　　　　　　<-- 如果取出的字符第二位为零则将DL=00放在[EDI]中作为字符串结束符并返回
0167:012A1A2A　MOV EAX, [ESP+08]
0167:012A1A2E　POP EDI
0167:012A1A2F　RET
。。。

23. 上面的程序段到底有什么作用呢？看起来好象挺复杂，不能明显的明白是什么意思。如果你在上面的程序段的适当地方用F9设置一个断点，然后返回All Aboard试者多次输入不同的字符（平常用的或者是很古怪的字符，例如中文字符等），你会发现无论你输入什么样的字符，都没有发现某个字符被滤掉的情况，最后你会明白其实这段程序的作用就是将我们输入的注册码“12345678”从内存地址[ECX]转移到[EDI]去，至于为什么这么简单的任务要搞得如此复杂我也不明白，大概是故意给CRACKER看的吧，哈哈。。。；

24. 按F10走出上面的程序段，我们会从步骤20的0167:012A13BA　CALL　012A1940中返回来到其下一句：
。。。
0167:012A13BA　CALL　012A1940
0167:012A13BF　CMP　BYTE PTR [EBP-40], 00　　　　　　　　　　<-- 我们来到这里
0167:012A13C3　POP　ECX
0167:012A13C4　POP　ECX
0167:012A13C5　JZ　012A13EB
。。。

25. 此时用 D EBP-40 你会看到内存中是刚才处理后的输入注册码“12345678”（也就是输入注册码的备份），CMP　BYTE PTR [EBP-40], 00的作用是判断输入的字符串是否为空，显然当按F10走到0167:012A13C5　JZ　012A13EB时程序将继续运行其下一条指令，而不是跳到012A13EB去：
。。。
0167:012A13C5　JZ　012A13EB
0167:012A13C7　LEA　ECX, [EBP-40]　　　　　　　　　　　　　　<-- ECX指向我们输入的注册码“12345678”
0167:012A13CA　MOV　AL, [ECX]　　　　　　　　　　　　　　　　<-- 取出一个字符
0167:012A13CC　CMP　AL, 61　　　　　　　　　　　　　　　　　 <-- 取出的字符和61，即和“a”比较
0167:012A13CE　JL　012A13D8
0167:012A13D0　CMP　AL, 7A　　　　　　　　　　　　　　　　　 <-- 如果字符大于等于“a”则和7A，即和“z”比较
0167:012A13D2　JG　012A13D8
0167:012A13D4　SUB　AL, 20　　　　　　　　　　　　　　　　　 <-- 如果是小写字母则变成大写字母
0167:012A13D6　MOV　[ECX], AL　　　　　　　　　　　　　　　　<-- 将处理后的注册码字符存在[ECX]中
0167:012A13D8　MOV　AL, [ECX]
0167:012A13DA　CMP　AL, 20　　　　　　　　　　　 　　　　　　<-- 如果不是小写字母则判断是否是空格（即20）
0167:012A13DC　JZ　012A13E5　　　　　　　　　 　 　　　　　　<-- 是空格则取下一个字符，空格字符不保存
0167:012A13DE　CMP　AL, 2D　　　　　　　　　　　 　　　　　　<-- 如果不是空格则判断是否是减号“-”（即2D）
0167:012A13E0　JZ　012A13E5　　　　　　　　　 　 　 　　　　<-- 是减号“-”则取下一个字符，减号“-”不保存
0167:012A13E2　MOV　[ESI], AL　　　　　　　　 　 　 　　　　<-- 如果既不是小写字母，也不是空格或减号，则直接保存字符
0167:012A13E4　INC　ESI　　　　　　　　　　　 　 　 　　　　<-- 处理后的注册码字符保存在这里
0167:012A13E5　INC　ECX　　　　　　　　　　　 　 　 　　　　<-- 原始注册码放在这里
0167:012A13E6　CMP　BYTE PTR [ECX], 00　　　　 　 　 　　　 <-- 是否已经处理完注册码字符
0167:012A13E9　JNZ　012A13CA　　　　 　 　　　 　 　 　　　 <-- 没有处理完则继续
0167:012A13EB　POP　ESI
0167:012A13EC　LEAVE
0167:012A13ED　RET
。。。

26. 上面已经讲过步骤22的作用其实是将输入的注册码备份在另外一个内存地址，到了上面的程序段时ECX和ESI其实都同样指向我们输入的注册码“12345678”，而上面程序段的作用是：将小写字母转变成大写字母，滤掉其中的空格“ ”及减号“-”。到底过滤掉空格和减号之后的注册码变成什么样子了呢？你还是可以设置断点，然后输入含有空格和减号的注册码来看，例如：输入注册码为“12 567-66”，则处理后变成“125676666”；输入“12--345”，结果为“1234545”；输入“-123456”，结果为“1234566”；输入“123456--”，结果为“123456--”，哈哈。。。是不是奇怪，减号或空格出现在最后就滤不掉了，不管它了，程序就是这样走的嘛^_^

27. 按F10走出上面的程序段，我们会从步骤19的0167:012A123F　CALL　012A13AB中返回来到其下一句：
。。。
0167:012A123F　CALL　012A13AB
0167:012A1244　CMP　BYTE PTR [ESI], 00　　　　　　　　　　　<-- 我们来到这里
0167:012A1247　POP　ECX
0167:012A1248　JZ　012A137D
。。。

28. 现在用 D ESI 你将看到[ESI]中是处理后的输入注册码，因为我们输入的注册码是“12345678”，没有小写，也没有空格或减号，所以还是老样子， CMP　BYTE PTR [ESI], 00是判断处理后的输入注册码是否为空，显然这里程序将会走到0167:012A1248　JZ　012A137D的下一句，不会跳到012A137D去：
。。。
0167:012A1248　JZ　012A137D
0167:012A124E　PUSH　10009060　　　　　　　　　　　　　　 　<-- 内存地址10009060中是字符串“DEMO”
0167:012A1253　PUSH　ESI　　　　　　　　　　　　　　　　　　<-- ESI指向处理后的注册码“12345678”
0167:012A1254　CALL　012A18B0
0167:012A1259　POP　ECX
0167:012A125A　TEST　EAX, EAX
0167:012A125C　POP　ECX
0167:012A125D　JZ　012A137D
。。。

29. 当按F10走到0167:012A1254　CALL　012A18B0时用 D 10009060 和 D ESI 命令，你会分别看到字符串“DEMO”和处理后的注册码“12345678”，不用说，CALL　012A18B0的作用肯定是判断我们输入的注册码是否是默认的“DEMO”，你将看到程序将在0167:012A125D　JZ　012A137D继续往下走而不发生跳转：
。。。
0167:012A125D　JZ　012A137D
0167:012A1263　XOR　EDI, EDI
0167:012A1265　PUSH　00000020
0167:012A1267　LEA　EAX, [EBP-28]
0167:012A126A　PUSH　EDI
0167:012A126B　PUSH　EAX
0167:012A126C　CALL　012A16A0
0167:012A1271　MOV　[EBP-04], EDI
0167:012A1274　MOV　[EBP-08], EDI
0167:012A1277　ADD　ESP, 0000000C
0167:012A127A　MOV　EDI, 10009D40
0167:012A127F　JMP　012A1284
。。。

30. 按F10走到0167:012A126C　CALL 012A16A0停下，用 D EDI 和 D EAX 命令，你会发现没有任何可疑的数据，但我们还是按F8进入CALL 012A16A0里去大概瞧一瞧吧：
。。。
0167:012A16A0　MOV　EDX, [ESP+0C]
0167:012A16A4　MOV　ECX, [ESP+04]
0167:012A16A8　TEST　EDX, EDX
0167:012A16AA　JZ　012A16F3
0167:012A16AC　XOR　EAX, EAX
0167:012A16AE　MOV　AL, [ESP+08]
0167:012A16B2　PUSH　EDI
0167:012A16B3　MOV　EDI, ECX
0167:012A16B5　CMP　EDX, 00000004
0167:012A16B8　JB　012A16E7
0167:012A16BA　NEG　ECX
0167:012A16BC　AND　ECX, 00000003
0167:012A16BF　JZ　012A16C9
0167:012A16C1　SUB　EDX, ECX
0167:012A16C3　MOV　[EDI], AL
0167:012A16C5　INC　 EDI
0167:012A16C6　DEC　ECX
0167:012A16C7　JNZ　012A16C3
0167:012A16C9　MOV　ECX, EAX
0167:012A16CB　SHL　EAX, 08
0167:012A16CE　ADD　EAX, ECX
0167:012A16D0　MOV　ECX, EAX
0167:012A16D2　SHL　EAX, 10
0167:012A16D5　ADD　EAX, ECX
0167:012A16D7　MOV　ECX, EDX
0167:012A16D9　AND　EDX, 00000003
0167:012A16DC　SHR　 ECX, 02
0167:012A16DF　JZ　012A16E7
0167:012A16E1　REPZ　STOSD　　　　　　　　　　　　　　　　　　<-- EDI指向内存地址0063ED44
0167:012A16E3　TEST　EDX, EDX
0167:012A16E5　JZ　012A16ED
0167:012A16E7　MOV　[EDI], AL
0167:012A16E9　INC　 EDI
0167:012A16EA　DEC　EDX
0167:012A16EB　JNZ　012A16E7
0167:012A16ED　MOV　EAX, [ESP+08]
0167:012A16F1　POP　EDI
0167:012A16F2　RET
。。。

31. 上面子程序的关键指令是0167:012A16E1处的REPZ　STOSD，走到这里时我们可以看到此刻AL=00，而EDI则指向内存地址0063ED44，所以这个子程序的作用就是将内存地址0063ED44开始的地方清零，暂且不去管它，按F10走出这个子程序，来到0167:012A126C　CALL 012A16A0的下一句：
。。。
0167:012A126C　CALL　012A16A0
0167:012A1271　MOV　[EBP-04], EDI
0167:012A1274　MOV　[EBP-08], EDI
0167:012A1277　ADD　ESP, 0000000C
0167:012A127A　MOV　EDI, 10009D40
0167:012A127F　JMP　012A1284
。。。
0167:012A1284　MOV　EAX, [EBP-08]
0167:012A1287　MOVZX　EAX, BYTE PTR [EAX+ESI]　　　　　　　<-- [EAX+ESI]中是处理后的输入注册码“12345678”
0167:012A128B　PUSH　EAX　　　　　　　　　　　　　　　　　　<-- 将取出的注册码字符压栈
0167:012A128C　PUSH　EDI　　　　　　　　　　　　　　　　　　<-- EDI指向字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”
0167:012A128D　CALL　012A17F0
0167:012A1292　POP　ECX
0167:012A1293　TEST　EAX, EAX
0167:012A1295　POP　ECX
0167:012A1296　JZ　012A1379
。。。

32. 按F10走到0167:012A1287　MOVZX　EAX, BYTE PTR [EAX+ESI]，下命令：D EAX+ESI，你会看到内存中是处理后的输入注册码“12345678”，而这条指令的作用就是取出一个字符放在EAX中，下一条语句PUSH　EAX将这个字符压栈，走到0167:012A128C　PUSH　EDI时用 D EDI 你会发现内存中藏着步骤19的那串奇怪的字符“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”，下面的CALL　012A17F0一定有问题，让我们按F8杀进去：
。。。
0167:012A17F0　XOR　EAX, EAX
0167:012A17F2　MOV　AL, [ESP+08]　　　　　　　　　　　　　　<-- 取出堆栈中的注册码字符放入AL，初值为31，即“1”
0167:012A17F6　PUSH　EBX　　　　　　　　　　　　　　　　　　下面以注册码第一个字符“1”来注解程序
0167:012A17F7　MOV　EBX, EAX　　　　　　　　　　　　　　　　<-- 将注册码字符备份在EBX中，EBX=00000031
0167:012A17F9　SHL　EAX, 08　　　　　　　　　　　　　　　　 <-- EAX左移8为等于00003100
0167:012A17FC　MOV　EDX, [ESP+08]
0167:012A1800　TEST　 EDX, 00000003　　　　　　　　　　　　 <-- EDX指向字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”
0167:012A1806　JZ　012A181B　　　　　　　　　　　　　　　　 <-- 这条指令跟我们的输入没有任何关系，不用理它
。。。
0167:012A181B　OR　EBX, EAX　　　　　　　　　　　　　　　　 <-- EBX与EAX或，结果EBX=00003131
0167:012A181D　PUSH　EDI
0167:012A181E　MOV　EAX, EBX　　　　　　　　　　　　　　　　<-- EAX=EBX=00003131
0167:012A1820　SHL　EBX, 10　　　　　　　　　　　　　　　　 <-- EBX左移16位，得到EBX=31310000
0167:012A1823　PUSH　ESI
0167:012A1824　OR　EBX, EAX　　　　　　　　　　　　　　　　 <-- EBX与EAX相或，得到EBX=31313131
0167:012A1826　MOV　ECX, [EDX]　　　　　　　　　　　 　　　 <-- 取出字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”的其中4位
0167:012A1828　MOV　EDI, 7EFEFEFF　　　　　　　　　　 　　　<-- EDI赋值为7EFEFEFF
0167:012A182D　MOV　EAX, ECX　　　　　　　　　　　　 　　　 <-- ECX初始值为32523951，即字符串的前4位“Q9R2”
0167:012A182F　MOV　ESI, EDI　　　　　　　　　　　　 　　　 <-- ESI=EDI=7EFEFEFF
0167:012A1831　XOR　ECX, EBX　　　　　　　　　　　　 　　　 <-- ECX异或EBX，即32523951^31313131
0167:012A1833　ADD　ESI, EAX　　　　　　　　　　　　 　　　 <-- ESI=7EFEFEFF+32523951
0167:012A1835　ADD　EDI, ECX　　　　　　　　　　　　 　　　 <-- EDI=7EFEFEFF+32523951^31313131
0167:012A1837　XOR　ECX, -01　　　　　　　　　　　　　　 　 <-- ECX=32523951^31313131^FFFFFFFF
0167:012A183A　XOR　EAX, -01　　　　　　　　　　　　　　 　 <-- EAX=32523951^FFFFFFFF
0167:012A183D　XOR　ECX, EDI　　　　　　　　　　　　　　 　 <-- ECX=ECX^EDI
0167:012A183F　XOR　EAX, ESI　　　　　　　　　　　　　　 　 <-- EAX=EAX^ESI
0167:012A1841　ADD　EDX, 00000004　　　　　　　　　　　　 　<-- EDX指向字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”的下面4位
0167:012A1844　AND　ECX, 81010100　　　　　　　　　　　　 　<-- 将ECX和81010100作与测试
0167:012A184A　JNZ　012A1868　　　　　　　　　　　　　　 　 <-- 不为零则跳到012A1868去
0167:012A184C　AND　EAX, 81010100　　　　　　　　　　　　 　<-- 为零则将EAX和81010100作与测试
0167:012A1851　JZ　 012A1826　　　　　　　　　　　　　　　　<-- 为零则取出字符串“Q9R2WZAS......”的下4位继续判断
0167:012A1853　AND　EAX, 01010100　　　　　　　　　　　　　 <-- 否则将将EAX和01010100作与测试
0167:012A1858　JNZ　012A1862　　　　　　　　　　　　　 　　 <-- 不为零则跳到012A1862去
0167:012A185A　AND　ESI, 80000000　　　　　　　　　　　　　 <-- 为零则将ESI和80000000作与测试
0167:012A1860　JNZ　012A1826　　　　　　　　　　　　　 　　 <-- 不为零则取出字符串“Q9R2WZAS......”的下4位继续判断
0167:012A1862　POP　ESI
0167:012A1863　POP　EDI
0167:012A1864　POP　EBX
0167:012A1865　XOR　EAX, EAX　　　　　　　　　　　　　 　　 <-- EAX清零
0167:012A1867　RET

0167:012A1868　MOV　EAX, [EDX-04]　　　　　　　　　　　　　 <-- 将刚才取出的4位字符重新放入EAX，此时EAX=32523951，BL=31
0167:012A186B　CMP　AL, BL　　　　　　　　　　　　　　　　　<-- 判断AL=‘Q’是否等于BL=‘1’
0167:012A186D　JZ　012A18A5　　　　　　　　　　　　　　　　 <-- 相等则跳到012A18A5
0167:012A186F　TEST　AL, AL　　　　　　　　　　　　　　　　 <-- 不等则判断AL是否等于00，既是否取完了字符串“Q9R2WZAS......”
0167:012A1871　JZ　012A1862　　　　　　　　　　　　　　　　 <-- 等于零则跳到012A1862
0167:012A1873　CMP　AH, BL　　　　　　　　　　　　　　　　　<-- 判断AH=‘9’是否等于BL=‘1’
0167:012A1875　JZ　012A189E　　　　　　　　　　　　　　　　 <-- 相等则跳到012A189E
0167:012A1877　TEST　 AH, AH　　　　　　　　　　　　　　　　<-- 不等则判断AH是否等于00
0167:012A1879　JZ　012A1862　　　　　　　　　　　　　　　　 <-- 等于零则跳到012A1862
0167:012A187B　SHR　EAX, 10　　　　　　　　　　　　　　　　 <-- EAX右移16位，得到EAX=00003252
0167:012A187E　CMP　AL, BL　　　　　　　　　　　　　　　　　<-- 判断AL=‘R’是否等于BL=‘1’
0167:012A1880　JZ　012A1897　　　　　　　　　　　　　　　　 <-- 相等则跳到012A1897
0167:012A1882　TEST　AL, AL　　　　　　　　　　　　　　　　 <-- 不等则判断AL是否等于00
0167:012A1884　JZ　012A1862　　　　　　　　　　　　　　　　 <-- 等于零则跳到012A1862
0167:012A1886　CMP　AH, BL　　　　　　　　　　　　　　　　　<-- 判断AH=‘2’是否等于BL=‘1’
0167:012A1888　JZ　012A1890　　　　　　　　　　　　　　　　 <-- 相等则跳到012A1897
0167:012A188A　TEST　AH, AH　　　　　　　　　　　　　　　　 <-- 不等则判断AH是否等于00
0167:012A188C　JZ　012A1862　　　　　　　　　　　　　　　　 <-- 等于零则跳到012A1862
0167:012A188E　JMP　012A1826　　　　　　　　　　　　　　　　<-- 如果条件都不满足则跳到012A1826取下4位字符

0167:012A1890　POP　ESI
0167:012A1891　POP　EDI
0167:012A1892　LEA　EAX, [EDX-01]　　　　　　　　　　　　　 <-- 将与BL=‘1’相等的字符的地址放在EAX中
0167:012A1895　POP　EBX
0167:012A1896　RET

0167:012A1897　LEA　EAX, [EDX-02]　　　　　　　　　　　　　 <-- 将与BL=‘1’相等的字符的地址放在EAX中
0167:012A189A　POP　ESI
0167:012A189B　POP　EDI
0167:012A189C　POP　EBX
0167:012A189D　RET

0167:012A189E　LEA　EAX, [EDX-03]　　　　　　　　　　　　　 <-- 将与BL=‘1’相等的字符的地址放在EAX中
0167:012A18A1　POP　ESI
0167:012A18A2　POP　EDI
0167:012A18A3　POP　EBX
0167:012A18A4　RET

0167:012A18A5　LEA　EAX, [EDX-04]　　　　　　　　　　　　　 <-- 将与BL=‘1’相等的字符的地址放在EAX中
0167:012A18A8　POP　ESI
0167:012A18A9　POP　DI
0167:012A18AA　POP　EBX
0167:012A18AB　RET
。。。

33. 当我们第一次进入上面的子程序时，由于程序将输入注册码的第一个字符“1”压栈，所以0167:012A17F2　MOV　AL, [ESP+08]这条指令将“1”放在AL中。按F10走到0167:012A184A　JNZ　012A1868你会发现此时零标志位为1，程序继续执行下一条指令AND　EAX, 81010100，到了0167:012A1851　JZ　 10001826时程序将跳回012A1826并取出 “Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”的下4位字符“WZAS”进行判断，如此循环，最后你会走到0167:012A1853　AND　EAX, 01010100这一句，然后到了0167:012A1858　JNZ　012A1862时程序将会跳到012A1862去，等一等，看看012A1862开始的指令，先是：POP　ESI、POP　EDI、POP　EBX，然后是：XOR　EAX, EAX和RET，在我们CRACK软件的过程中，XOR　EAX, EAX可以称得上是死亡指令了，因为当你你在关键的子程序中发现XOR　EAX, EAX后子程序就返回这样的情况时，通常表示你已经完蛋了，EAX的返回值为零一般表示判断失败，不过也没什么奇怪的，本来我们输入注册码就是随意的，所以中途被判死刑是很正常的事嘛^_^

34. 也许你会问：为什么我能如此肯定程序跳到012A1862去就完蛋了呢？首先是破解的经验感觉，其次是对程序的分析：在0167:012A184A　JNZ　012A1868时我们可以看到其实这段程序原本可以绕过012A1862而跑到012A1868去的，而我们在这段子程序执行了才一半就已经返回了，下面012A1868开始还有好长一段程序没有运行，总不可能这段程序是垃圾吧？所以我肯定我们应该要跳到012A1868去，但是什么样的注册码字符才能通过刚才那段程序的验证而跳到012A1868去呢？目前我们还不清楚，既然软的不行，咱们就来硬的：用 BD * 暂停前面的断点，将鼠标移到0167:012A17F0　XOR　EAX, EAX并按F9在此设置断点，然后按F5返回All Aboard，重新输入注册码“12345678”，按“应用”，被Softice拦截住后按F10走到0167:012A184A　JNZ　012A1868停下，此时零标志位为1，下命令：RFL Z 改变程序的运行轨迹，按一下F10就来到了012A1868处，其下的指令请看注解；

35. 从上面的跟踪我们可以分析出：如果注册码字符通过了上半段程序的验证后，程序将会把与这个注册码字符相同的字符在字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中的地址值放在EAX中并返回，那么你是否已经明白了些什么呢？哈哈。。。既然程序将字符在“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中的地址取出放在EAX中，那么我们输入的注册码字符必须在这串字符中间，否则如何找到它对应的地址呢？^_^也就是我们输入的注册码字符必须从“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”选出才能通过上面的子程序验证；

36. 因为字符“1”并没有在“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中，所以当按F10走到0167:012A186D　JZ　012A18A5要用命令 RFL Z 改变程序运行的方向，否则又会在0167:012A188E　JMP　012A1826时跳回012A1826处验证字符的程序，之后我们按F10一直走出上面的子程序：
。。。
0167:012A1281　MOV　ESI, [EBP+08]　　　　　　　　　　　　　 <-- ESI指向处理后的输入注册码“12345678”
0167:012A1284　MOV　EAX, [EBP-08]　　　　　　　　　　　　　 <-- EAX是注册码字符的地址偏移值
0167:012A1287　MOVZX　EAX, BYTE PTR [EAX+ESI]　　　　　　　<-- EAX+ESI指向处理后的输入注册码“12345678”的某一位
0167:012A128B　PUSH　EAX　　　　　　　　　　　　　　　　　　 <-- 将取出的注册码字符压栈
0167:012A128C　PUSH　EDI　　　　　　　　　　　　　　　　　　 <-- EDI指向字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”
0167:012A128D　CALL　012A17F0　　　　　　　　　　　　　　　　<-- 验证并取得注册码字符在字符串“Q9R2WZAS...”中的地址值
0167:012A1292　POP　ECX　　　　　　　　　　　　　　　　　　　<-- 我们来到这里
0167:012A1293　TEST　EAX, EAX　　　　　　　　　　　　　　　　<-- 测试EAX返回值，为零就完蛋了！
0167:012A1295　POP　ECX
0167:012A1296　JZ　012A1379
0167:012A129C　SUB　EAX, EDI　　　　　　　　　　　　　　　　 <-- 求得注册码字符在字符串“Q9R2WZAS...”中的偏移值
0167:012A129E　PUSH　00000008　　　　　　　　　　　　　　　　<-- 压栈立即数00000008
0167:012A12A0　MOV　EBX, EAX　　　　　　　　　　　　　　　　 <-- 字符偏移值备份在EBX中
0167:012A12A2　MOV　EAX, [EBP-04]　　　　　　　　　　　　　　<-- [EBP-04]的初始值等于0
0167:012A12A5　CDQ　　　　　　　　　　　　　　　　　　　　　 <-- 将EAX的值扩展到EDX中
0167:012A12A6　POP　ECX　　　　　　　　　　　　　　　　　　　<-- 立即数00000008出栈赋予ECX
0167:012A12A7　IDIV　ECX　　　　　　　　　　　　　　　　　　 <-- EAX除以ECX=00000008
0167:012A12A9　PUSH　00000003　　　　　　　　　　　　　　　　<-- 压栈立即数00000003
0167:012A12AB　MOV　ESI, EAX　　　　　　　　　　　　　　　　 <-- 除法的商EAX赋予ESI
0167:012A12AD　MOV　EAX, [EBP-04]　　　　　　　　　　　　　　<-- 将内存地址EBP-04中的内容赋给EAX
0167:012A12B0　CDQ　　　　　　　　　　　　　　　　　　　　　 <-- 将EAX的值扩展到EDX中
0167:012A12B1　IDIV　ECX　　　　　　　　　　　　　　　　　　 <-- EAX除以ECX=00000008
0167:012A12B3　POP　ECX　　　　　　　　　　　　　　　　　　　<-- 立即数00000003出栈赋予ECX
0167:012A12B4　CMP　EDX, ECX　　　　　　　　　　　　　　　　 <-- 除法余数EDX和ECX=00000003比较
0167:012A12B6　JG　012A12C4　　　　　　　　　　　　　　　　　<-- 大于3则跳到012A12C4去
0167:012A12B8　SUB　ECX, EDX　　　　　　　　　　　　　　　　 <-- 小于3则用3减去余数EDX，结果放在ECX中
0167:012A12BA　LEA　EAX, [EBP+ESI-28]　　　　　　　　　　　　<-- 内存地址值EBP+ESI-28赋予EAX
0167:012A12BE　SHL　BL, CL　　　　　　　　　　　　　　　　　 <-- 字符偏移值左移CL位
0167:012A12C0　OR　 [EAX], BL　　　　　　　　　　　　　　　　<-- 左移结果存入内存地址EBP+ESI-28中
0167:012A12C2　JMP　012A12DA
0167:012A12C4　LEA　ECX, [EDX-03]　　　　　　　　　　　　　　<-- 余数大于3则用余数减去03，结果放在ECX中
0167:012A12C7　MOV　EAX, EBX　　　　　　　　　　　　　　　　 <-- 字符偏移值备份在EAX中
0167:012A12C9　SAR　EAX, CL　　　　　　　　　　　　　　　　　<-- 字符偏移值右移CL位
0167:012A12CB　PUSH　0000000B　　　　　　　　　　　　　　　　<-- 压栈立即数0000000B
0167:012A12CD　POP　ECX　　　　　　　　　　　　　　　　　　　<-- 立即数0000000B出栈赋予ECX
0167:012A12CE　SUB　ECX, EDX　　　　　　　　　　　　　　　　 <-- ECX=0000000B减去余数EDX
0167:012A12D0　OR　[EBP+ESI-28], AL　　　　　　　　　　　　　<-- 内存地址EBP+ESI-28的值与AL相或
0167:012A12D4　SHL　BL, CL　　　　　　　　　　　　　　　　　 <-- 字符偏移值左移0000000B-EDX位
0167:012A12D6　MOV　[EBP+ESI-27], BL　　　　　　　　　　　　 <-- 结果放在内存地址EBP+ESI-27中
0167:012A12DA　INC　[EBP-08]　　　　　　　　　　　　　　　　 <-- 注册码字符偏移值加1
0167:012A12DD　ADD　DWORD PTR [EBP-04], 00000005　　　　　　<-- 内存地址EBP-04中的值递增加5
0167:012A12E1　CMP　DWORD PTR [EBP-08], 00000010　　　　　　<-- 循环16次
0167:012A12E5　JL　012A1281
。。。

37. 上面程序的具体算法注解已经比较清楚，我们很明显得知的信息是注册码应该有16位，因为0167:012A12E1　CMP　DWORD PTR [EBP-08], 00000010这一句表明了这一点，不过因为程序中并没有检测我们输入的注册码是否真的有16位，所以我们不用担心，还可以继续往下走，另外，程序将处理结果放在内存地址EBP+ESI-28和EBP+ESI-27中，而EBP+ESI-28的初始值等于0063ED44，也就是步骤30被清零的那个内存地址处，EBP始终是保持不变的，每次循环ESI都会由EAX对8的除法的商得到，而EAX初始值为00，每次循环递增加5，至此，我们已经将上面的算法过程从具体的程序中脱离了出来（因为其它的指令不依赖具体的内存地址）；

38. 按F10继续走到上面程序段的下一条指令（即经过了16次循环以后）：
。。。
0167:012A12E5　JL 012A1281
0167:012A12E7　XOR EAX, EAX　　　　　　　　　　　　　　　　 <-- 我们走到这里，EAX=0
0167:012A12E9　MOV CL, [EBP+EAX-27]　　　　　　　　　　　　 <-- EBP-28指向刚才处理后的结果
0167:012A12ED　XOR [EBP+EAX-28], CL　　　　　　　　　　　　 <-- 前一字节被后一字节异或
0167:012A12F1　INC EAX　　　　　　　　　　　　　　　　　　　<-- 指向下一个字节
0167:012A12F2　CMP EAX, 00000009　　　　　　　　　　　　　　<-- 循环9次
0167:012A12F5　JL 012A12E9
。。。

39. 从上面的程序可以看出16位的注册码经过处理后得到10字节的数据，例如 D0，D1，D2，D3，D4，D5，D6，D7，D8，D9，然后依次将后一个字节的数据异或到前一个字节，如：T0 = D0 XOR D1，T8 = D8 XOR D9，也许你还不太明白为什么会是10字节数据，不是只循环了9次吗？是的，虽然程序只循环了9次，但是程序每次循环都会操作一前一后两个字节的内容，所以9次循环后其实处理了10个字节的数据；

40. 按F10继续走过这段程序，来到其下面一句（为了便于注解，假设16位的注册码经过上面所有的程序处理过后得到10字节的数据为：T0，T1，T2，T3，T4，T5，T6，T7，T8，T9）：
。。。
0167:012A12F7　MOV　EAX, [EBP+0C]　　　　　　　　　　　　　　<-- 地址值0063EDAC赋给EAX
0167:012A12FA　MOV　CL, [EBP-25]　　　　　　　　　　　　　　 <-- EBP-25指向T3
0167:012A12FD　MOV　EDX, [EBP+18]　　　　　　　　　　　　　　<-- 地址值0063ED94赋给EDX
0167:012A1300　MOV　[EAX], CL　　　　　　　　　　　　　　　　<-- T3放在内存地址0063EDAC中
0167:012A1302　MOV　CL, [EBP-23]　　　　　　　　　　　　　　 <-- EBP-23指向T5
0167:012A1305　MOV　[EAX+01], CL　　　　　　　　　　　　　　 <-- T5放在内存地址0063EDAD中
0167:012A1308　MOV　CL, [EBP-28]　　　　　　　　　　　　　　 <-- EBP-28指向T0
0167:012A130B　MOV　[EAX+02], CL　　　　　　　　　　　　　　 <-- T0放在内存地址0063EDAE中
0167:012A130E　MOVZX　EAX, BYTE PTR [EBP-27]　　　　　　　　 <-- 取出T1放在EAX中
0167:012A1312　MOV　ECX, EAX　　　　　　　　　　　　　　　　 <-- T1备份在ECX中
0167:012A1314　AND　EAX, 00000007　　　　　　　　　　　　　　<-- T1和07相与
0167:012A1317　SHR　ECX, 03　　　　　　　　　　　　　　　　　<-- T1右移3位
0167:012A131A　MOV　[EDX], ECX　　　　　　　　　　　　　　　 <-- 右移结果放在内存地址0063ED94中
0167:012A131C　MOVZX　ECX, BYTE PTR [EBP-26]　　　　　　　　 <-- 取出T2放在ECX中
0167:012A1320　MOVZX　EDX, BYTE PTR [EBP-24]　　　　　　　　 <-- 取出T4放在EDX中
0167:012A1324　SHL　ECX, 08　　　　　　　　　　　　　　　　　<-- T2左移8位
0167:012A1327　OR　ECX, EDX　　　　　　　　　　　　　　　　　<-- ECX=0000XX**，T2=XX，T4=**
0167:012A1329　MOV　EDX, [EBP+10]　　　　　　　　　　　　　　<-- 地址值0063EDA8赋给EDX
0167:012A132C　MOV　[EDX], ECX　　　　　　　　　　　　　　　 <-- ECX=0000XX**存入内存地址0063EDA8中
0167:012A132E　MOV　ECX, [EBP+14]　　　　　　　　　　　　　　<-- 地址值0063ED90赋给ECX
0167:012A1331　MOVZX　EAX, WORD PTR [2*EAX+10009050]　　　　 <-- 用 （T1 AND 07）* 2 查表，结果放在EAX中
0167:012A1339　MOV　[ECX], EAX　　　　　　　　　　　　　　　 <-- 查表结果存入内存地址0063ED90中
0167:012A133B　MOVZX　EAX, BYTE PTR [EBP-22]　　　　　　　　 <-- 取出T6放在EAX中
0167:012A133F　MOVZX　ECX, BYTE PTR [EBP-21]　　　　　　　　 <-- 取出T7放在ECX中
0167:012A1343　SHL　EAX, 08　　　　　　　　　　　　　　　　　<-- T6左移8位
0167:012A1346　OR　EAX, ECX　　　　　　　　　　　　　　　　　<-- EAX=0000XX**，T6=XX，T7=**
0167:012A1348　MOVZX　ECX, BYTE PTR [EBP-20]　　　　　　　　 <-- 取出T8放在ECX中
0167:012A134C　SHL　EAX, 08　　　　　　　　　　　　　　　　　<-- EAX=00XX**00
0167:012A134F　OR　EAX, ECX　　　　　　　　　　　　　　　　　<-- EAX=00XX**##，T6=XX，T7=**，T8=##
0167:012A1351　MOV　ECX, [EBP+1C]　　　　　　　　　　　　　　<-- 地址值0063ED98赋给ECX
0167:012A1354　MOV　[ECX], EAX　　　　　　　　　　　　　　　 <-- EAX=00XX**##存入内存地址0063ED98中
。。。

41. 上面程序的作用目前还不得而知，需要说明的地方是0167:012A1331　MOVZX　EAX, WORD PTR [2*EAX+10009050]这条指令，因为 EAX = T1 AND 07，所以EAX小于等于7，按F10走到这条指令时用 D 10009050 可以发现EAX分别等于0，1，2，3，4，5，6，7时这条指令从内存中取出的对应值分别是0002，0003，0006，000A，0019，0032，0001，03E8，继续按F10走完上面的程序，来到其下一句：
。。。
0167:012A1356　XOR ECX, ECX　　　　　　　　　　　　　　　　　<-- ECX清零
0167:012A1358　XOR EAX, EAX　　　　　　　　　　　　　　　　　<-- EAX清零
0167:012A135A　MOVZX EDX, [EBP+ECX-28]　　　　　　　　　　　 <-- EBP+ECX-28指向Ti，i=0，1，2....9
0167:012A135F　ADD EAX, EDX　　　　　　　　　　　　　　　　　<-- 将Ti累加
0167:012A1361　INC ECX　　　　　　　　　　　　　　　　　　　 <-- 指向下一个Ti
0167:012A1362　CMP ECX, 00000009　　　　　　　　　　　　　　 <-- 循环9次
0167:012A1365　JL 012A135A
0167:012A1367　MOVZX ECX, BYTE PTR [EBP-1F]　　　　　　　　　<-- EBP-1F指向T9
0167:012A136B　AND EAX, 000000FF　　　　　　　　　　　　　　 <-- 上面的累加和跟000000FF相与
0167:012A1370　XOR EAX, ECX　　　　　　　　　　　　　　　　　<-- EAX等于EAX异或T9
0167:012A1372　NEG EAX　　　　　　　　　　　　　　　　　　　 <-- 求EAX的负数
0167:012A1374　SBB EAX, EAX　　　　　　　　　　　　　　　　　<-- EAX=EAX-CF标志位
0167:012A1376　INC EAX　　　　　　　　　　　　　　　　　　　 <-- EAX加1
0167:012A1377　JMP 012A13A4　　　　　　　　　　　　　　　　　<-- 程序返回
。。。
0167:012A13A4　POP EDI
0167:012A13A5　POP ESI
0167:012A13A6　POP EBX
0167:012A13A7　LEAVE
0167:012A13A8　RET 0018
。。。

42. 注意：上面的累加和EAX=T0+T1+T2+T3+T4+T5+T6+T7+T8，继续按F10走出这个子程序，我们将来到步骤17中0167:012A1420　CALL　012A122D的下一句：
。。。
0167:012A1420　CALL　1000122D
0167:012A1425　TEST　EAX, EAX　　　　　　　　　　　　　　　　<-- 我们来到这里
0167:012A1427　JZ　012A1466　　　　　　　　　　　　　　　　　<-- 跳到012A1466去就完蛋了
0167:012A1429　MOV　AL, [ESI]　　　　　　　　　　　　　　　　<-- ESI指向T3
0167:012A142B　CMP　AL, [EBP+0C]　　　　　　　　　　　　　　 <-- 判断T3是否等于[EBP+0C]=17
0167:012A142E　JNZ　012A1466
0167:012A1430　MOV　AL, [ESI+01]　　　　　　　　　　　　　　 <-- ESI+1指向T5
0167:012A1433　CMP　AL, [EBP+0D]　　　　　　　　　　　　　　 <-- 判断T5是否等于[EBP+0D]=00
0167:012A1436　JNZ　012A1466
0167:012A1438　MOV　AL, [ESI+02]　　　　　　　　　　　　　　 <-- ESI+2指向T0
0167:012A143B　CMP　AL, [EBP+0E]　　　　　　　　　　　　　　 <-- 判断T0是否等于[EBP+0E]=03
0167:012A143E　JNZ　012A1466
0167:012A1440　CMP　DWORD PTR [EBP+08], 00000000　　　　　　<-- 判断[EBP+08]=0000XX**是否等于0，其中T2=XX，T4=**
0167:012A1444　JNZ　012A144B
0167:012A1446　PUSH　00000001　　　　　　　　　　　　　　　　<-- 立即数00000001压栈
0167:012A1448　POP　EAX　　　　　　　　　　　　　　　　　　　<-- 立即数00000001出栈赋给EAX
0167:012A1449　JMP　012A1468
0167:012A144B　LEA　EAX, [EBP-04]
0167:012A144E　PUSH　EAX
0167:012A144F　PUSH　10009068
0167:012A1454　CALL　012A14E7
0167:012A1459　MOV　ECX, [EBP-04]
0167:012A145C　XOR　EAX, EAX
0167:012A145E　CMP　ECX, [EBP+08]
0167:012A1461　SETLE　AL
0167:012A1464　JMP　012A1468
0167:012A1466　XOR　EAX, EAX
0167:012A1468　POP　ESI
0167:012A1469　LEAVE
0167:012A146A　RET　0008
。。。

43. 我们从0167:012A1420　CALL　1000122D中返回时EAX等于0，所以程序将跳到012A1466去，而012A1466处的指令是XOR　EAX, EAX，肯定完蛋，所以步骤41时EAX应该要不等于0才对，考察012A1372开始的指令：NEG EAX、SBB EAX, EAX和INC EAX，若要EAX最后不等于0，则在012A1372时EAX必须等于0，这样EAX的返回值才会等于1而非0；

44. 按F10走到0167:012A1427　JZ　012A1466时用命令 RFL Z 改变程序原来的执行方向，使其继续往下走，通过对上面程序的分析，我们知道只有当T3=17、T5=00、T0=03且T2=T4=0时程序才会走到0167:012A1446　PUSH　00000001去，下一句0167:012A1448　POP　EAX使得EAX=00000001，从而表示注册码正确；

注册码算法整理。。。

45. 程序终于走完了，是不是头都大了^_^，现在让我们清理一下大脑，将注册码的算法整理一下：

    ①. 首先，注册码总共有16位，且每个字符都必须从字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中取得；

    ②. 经过步骤32得到注册码字符在字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中的对应地址内存EAX，在步骤36的0167:012A129C　SUB　EAX, EDI指令后将其转化成在字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中偏移值，例如我们输入的注册码中有字符“2”，则这个注册码字符在字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中对应的偏移值为3；

    ③. 每个注册码字符都经过步骤36进行计算，其方法如下：
        a. 假设注册码字符在字符串“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”中对应的偏移值放在EBX中；
        b. EAX=XXXX，第一个注册码字符对应的EAX=0，以后对应每个注册码EAX递增加5（如第二个注册码字符对应EAX=5，第三个对应EAX=10，以此类推）；
        c. ESI = EAX / 8，EDX = EAX % 8；
        d. EDX和3比较：
           如果EDX小于等于3，则 BL 左移 3-EDX 位，BL 存入 [ESI] 中；
           如果EDX大于3，则 EAX = EBX ，EAX 右移 EDX-3 位，用 AL 或 [ESI] 的内容
                                         BL 左移 0B-EDX 位，BL 存入 [ESI+1]中；

    ④. 16位注册码经过步骤③得到10字节的数据：
        D0，D1，D2，D3，D4，D5，D6，D7，D8，D9

    ⑤. Di（i=0，1，2...9）经过步骤39进行异或运算得到10字节数据Ti（i=0，1，2...9）：
        T0 = D0 XOR D1，T1 = D1 XOR D2，T2 = D2 XOR D3，T3 = D3 XOR D4，T4 = D4 XOR D5
        T5 = D5 XOR D6，T6 = D6 XOR D7，T7 = D7 XOR D8，T8 = D8 XOR D9，T9 = D9

    ⑥. Ti（i=0，1，2...9）经过步骤41进行首次验证：
        EAX = T0 + T1 + T2 + T3 + T4 + T5 + T6 + T7 + T8，ECX = T9
        EAX = EAX AND 000000FF，EAX = EAX XOR ECX
        验证通过条件：EAX 必须等于 0

    ⑦. 首次验证通过后Ti（i=0，1，2...9）经过步骤42进行再次验证：
        验证通过条件：
        T3 必须等于 17
        T5 必须等于 00
        T0 必须等于 03
        T2 和 T4 必须等于 00

    ⑧. 通过了上面所有的验证后，表示注册码正确。

注册机算法研究。。。

46. 写到这里你是不是已经有点跃跃欲试想立马去写注册机呢？哈哈。。。告诉你，不行^_^！为什么？不是已经完全知道程序的注册码算法了吗？难道不可以用穷举法将注册码抓出来吗？是的，理论上我们可以利用穷举法将所有可能的注册码找出来，可是你有没有想过，16位的注册码，每位注册码字符有32中变化（即“Q9R2WZASX8KBMGT53DEC6Y4NHP7V%JFU”之一），这样你的程序中将会有32的16次方共1208925819614629174706176次FOR语句循环，按验证一个注册码电脑需要百分之一秒的时间计算（实际上没有这么快），你的电脑要跑12089258196146291747061.76秒，也就是383347862637820年，是不是等到地老天荒也等不到啊，哈哈。。。^_^

47. 既然穷举法不可行，我们只能通过进一步分析注册码算法来找到注册机的突破口了：

    ⑴. 回头看一看步骤45的步骤⑦和步骤⑥两个验证条件，原程序中是先验证步骤⑥，条件满足后才验证步骤⑦，那么我们可不可以反其道而行之，先找到仅仅符合步骤⑦条件的注册码形式，然后再反推是否有符合步骤⑥的注册码，如果反推成功，岂不是就得到注册码了吗^_^；

    ⑵. 那么T3、T5、T0、T2和T4是否能由注册码的某些单独位导出呢？从步骤⑤我们可知Ti是由Di得到的，而 Ti = Di XOR Di+1，也就是Ti只由Di和Di+1决定；从步骤③我们知道Di是注册码经过计算放在[ESI]和[ESI+1]中得到的，而 ESI = EAX / 8，EAX又由具体的注册码决定，那么Di跟ESI（也就是EAX）的关系是怎样的呢？

    ⑶. 下面我们来演示一下注册码字符经过计算之后怎样得到Di的，注册码有16位，这里用0，1，2，3，......D，E，F代表：

注册码：　　　　　0　　1　　2　　3　　4　　5　　6　　7　　8　　9　　A　　B　　C　　D　　E　　F

对应的EAX取值：　 0　　5　 10　 15　 20　 25　　30　 35　 40　 45　 50　 55　60　 65　　70　 75

对应的ESI=EAX/8： 0　　0　　1　　1　　2　　3　　3　　4　　5　　5　　6　　6　　7　　8　　8　　9

对应的EDX=EAX%8： 0　　5　　2　　7　　4　　1　　6　　3　　0　　5　　2　　7　　4　　1　　6　　3

是否影响Di+1？：　N　　Y　　N　　Y　　Y　　N　　Y　　N　　N　　Y　　N　　Y　　Y　　N　　Y　　N

    注：上面一行Di+1的i等于ESI=EAX/8，而是否影响Di+1是根据EDX=EAX%8是否大于3来决定的（Y表示影响，N表示不影响），这一点在步骤③中可知；

    ⑷. 从步骤⑶我们可以得到如下结论：
        D0 由注册码字符“0”和“1”得到（即注册码第0位和第1位，以下类似）；
        D1 由注册码字符“1”，“2”和“3”得到；
        D2 由注册码字符“3”和“4”得到；
        D3 由注册码字符“4”，“5”和“6”得到；
        D4 由注册码字符“6”和“7”得到；
        D5 由注册码字符“8”和“9”得到；
        D6 由注册码字符“9”，“A”和“B”得到；
        D7 由注册码字符“B”和“C”得到；
        D8 由注册码字符“C”，“D”和“E”得到；
        D9 由注册码字符“E”和“F”得到；

    ⑸. 从步骤⑷我们可以得到如下结论：
        T0 由注册码字符“0”，“1”，“2”和“3”得到；
        T1 由注册码字符“1”，“2”，“3”和“4”得到；
        T2 由注册码字符“3”，“4”，“5”和“6”得到；
        T3 由注册码字符“4”，“5”，“6”和“7”得到；
        T4 由注册码字符“6”，“7”，“8”和“9”得到；
        T5 由注册码字符“8”，“9”，“A”和“B”得到；
        T6 由注册码字符“9”，“A”，“B”和“C”得到；
        T7 由注册码字符“B”，“C”，“D”和“E”得到；
        T8 由注册码字符“C”，“D”，“E”和“F”得到；
        T9 由注册码字符“E”和“F”得到；

        注：看步骤⑤中Di是怎样影响Ti的

48. 通过上面对注册码算法的进一步研究我们可以开始写注册机了：

    Ⅰ. 利用步骤45的计算找到使TO等于03的注册码字符“0”，“1”，“2”，“3”；

    Ⅱ. 利用Ⅰ得到的“3”找到使T2等于00的注册码字符“4”，“5”，“6”；

    Ⅲ. 利用Ⅱ得到的“4”，“5”，“6”找到使T3等于17的注册码字符“7”；

    Ⅳ. 利用Ⅲ得到的“6”，“7”找到使T4等于00的注册码字符“8”，“9”；

    Ⅴ. 利用Ⅳ得到的“8”，“9”找到使T5等于00的注册码字符“A”，“B”；

    Ⅵ. 利用上面得到的注册码字符“0”，“1”，“2”，“3”，“4”，“5”，“6”，“7”，“8”，“9”， “A”，“B”找到满足步骤⑥的注册码字符“C”，“D”，“E”，“F”；

    Ⅶ. 现在每个注册码字符都找到了，将它们按顺序拼起来得到“0123456789ABCDEF”，这就是正确的注册码了^_^。

更进一步的研究。。。

49. 至此，我们可以写出注册机了，那么是否就此大功告成呢？非也！用注册机产生一个注册码先，例如是“QQ93QQQNR%B3QP3Q”，用这个注册码在All Aboard中注册，结果自然是成功了，你看到了什么呢？All Aboard显示“All Aboard Max Users 10”的信息，哈。。。为什么是10个用户？这样不是还意味着还有其它的用户数注册码吗？那么程序是如何决定用户数的呢？

50. 回头看看步骤40，其中0167:012A1331处有条查表语句MOVZX　EAX, WORD PTR [2*EAX+10009050]，而我们当时已经知道对应EAX=0，1，2，3，4，5，6，7得到的结果分别为0002，0003，0006，000A，0019，0032，0001，03E8，其中的000A对应的10进制数就是10，有没有觉得这个000A就是用户数呢^_^？而 EAX = T1 AND 07，我们可以利用输入注册码“QQ93QQQNR%B3QP3Q”再次跟踪程序，来到0167:012A1331　MOVZX　EAX, WORD PTR [2*EAX+10009050]时你会发现EAX=03，所以这条指令执行以后EAX恰好等于000A，也就是10，哈哈。。。这个地方肯定就是计算用户数的关键之处，因此最终T1决定了用户数，我们可以看到0x0019=25，0x0032=50，0x03E8=1000，哇噻，最多可以支持1000个用户，很恐怖啊，哈哈。。。有趣的是，如果你去All Aboard的官方网站跑一趟，你会发现他们只提供All Aboard! SE最大10个用户的支持，而且要159.95美圆的注册费，哎，大家来我这里注册算了，少收一点钱嘛，哈哈^_^！；

51. 为了完善注册机，我们应该将上面的注册机算法重新调整一下：

    Ⅰ. 利用步骤45的计算找到使TO等于03的注册码字符“0”，“1”，“2”，“3”；

    Ⅱ. 利用Ⅰ得到的“1”，“2”，“3”找到符合用户数要求（你想要的^_^）的注册码字符“4”；

    Ⅲ. 利用Ⅱ得到的“3”，“4”找到使T2等于00的注册码字符“5”，“6”；

    Ⅳ. 利用Ⅲ得到的“4”，“5”，“6”找到使T3等于17的注册码字符“7”；

    Ⅴ. 利用Ⅳ得到的“6”，“7”找到使T4等于00的注册码字符“8”，“9”；

    Ⅵ. 利用Ⅴ得到的“8”，“9”找到使T5等于00的注册码字符“A”，“B”；

    Ⅶ. 利用上面得到的注册码字符“0”，“1”，“2”，“3”，“4”，“5”，“6”，“7”，“8”，“9”， “A”，“B”找到满足步骤⑥的注册码字符“C”，“D”，“E”，“F”；

    Ⅷ. 现在你可以随心所欲的得到你想要的注册码了，哈哈。。。^_^！

52. 完了吗？没有！为什么？还有一点遗留问题：也许有朋友会问在步骤42中的0167:012A1440　CMP　DWORD PTR [EBP+08], 00000000如果[EBP+08]不等于0，程序会在0167:012A1444　JNZ　012A144B时跳到012A144B去，其下面有条指令0167:012A1461　SETLE　AL同样也可能使得AL等于1，这样返回之后EAX不也是等于1吗？是的，但只是有可能使EAX返回值为1，其返回值并不能肯定是什么？如果你跟踪到0167:012A1454　CALL　012A14E7里面去，你会发现程序会去取系统时间，然后经过复杂的运算得到某个值，最后通过指令0167:012A145E　CMP　ECX, [EBP+08]来确定AL的取值。如果你在这段程序设置断点，然后输入注册码时用默认的“DEMO”，你会发现All Aboard会调用这里的程序段，你可以试着随便输入一个注册码，然后用暴力法走过这里的程序，并且让AL返回值为1，你会发现All Aboard显示的“All Aboard Expires:”中的天数非常奇怪，依据你输入的注册码的情况，会有“-2142552 days”或者“353466 days”的奇怪结果，所以由此看来这段程序其实是计算你的注册码还有多少使用天数；

53. OK，到这里是真的没有什么疑问了，如果你还有，自己去研究吧，这篇破解实战写得真是好辛苦啊，希望下次不要再有这样的差事了^_^！！！

作者：ddcrack (2001/7/18)


AltoMP3 Maker

 标 题:今天发的好帖子不少，令我等小辈大呼过瘾，羡慕之至！手痒之下我也拽了个软件，试试手气。还不错，现在发出... (3千字)
发信人:crack007
时 间:2001-5-5 0:12:53
详细信息:
标题: 今天发的好帖子不少，令我等小辈大呼过瘾，羡慕之至！手痒之下我也拽了个软件，试试手气。还不错，现在发出来，以后加入青年队时也好有个交代。您说是不是？:D

内容:
AltoMP3 Maker的破解

作者：Crack007
主页：http://www.crack007.com ( ^-^ )
破解日期：2001-5-4
破解工具：TRW2000 1.22 W32DASM3 8.93
难度：☆

软件下载地址：http://soft.zz.ha.cn/query/down1.asp?softnumber=5471&dtype=2&path=/AltoMP3Maker213.exe

软件简介：　　AltoMP3 Maker除了可以将音乐CD直接制作成MP3，还可以播放音乐CD，并支持 CDDB2和Windows的explorer shell功能，可在资源管理器中的音轨文件上按下右键 ，直接制作MP3。高速高品质的输出：使用自动同步技术，使用LAME压缩引擎：可 以高速压缩出完美品质的MP3，支持VRB，亦可更换使用BLADE压缩引擎。

1、启动TRW2000

2、运行Flashsoft

随便输入注册信息：

用户名:Crack007
注册码:78787878

3. 按 CTRL+N 激活 TRW2000

输入如下 2 条命令

bpx hmemcpy 设置中断条件

4. 按F5键，回到 AltoMP3.exe 的注册窗口

按 " OK " 按钮 ,TRW2000 窗口被激活自动弹出

bc * 取消中断

pmodule 从系统内核中返回到 AltoMP3.exe

中断至以下代码：

:00488942 5E pop esi <---- Pmodule

然后按F10 N下:D

:00442545 52 push edx
:00442546 E8B5020000 call 00442800 <-----关键Call,跟进。
:0044254B 25FF000000 and eax, 000000FF
:00442550 85C0 test eax, eax
:00442552 7444 je 00442598 〈-----若不为0则Game Over!
:00442554 6AFF push FFFFFFFF
:00442556 6A00 push 00000000

* Possible Reference to String Resource ID=57687: "盜 鑼?"
|
:00442558 6857E10000 push 0000E157
:0044255D E84FE10400 call 004906B1 <-----弹出错误对话框
:00442562 8B4DE4 mov ecx, dword ptr [ebp-1C]
:00442565 81C198000000 add ecx, 00000098

跟进后来到如下代码：

* Referenced by a CALL at Addresses:
|:00442546 , :0044ECD4 , :00452254 , :00452370 , :0045363E
|:0045375A , :00454DB3 , :00454EEA , :004553BC , :004554D8
|:0045A44A , :0045A581 , :0045A933 , :0045AA6A , :0045ACD3
|:0045AE04
|
:00442800 55 push ebp
:00442801 8BEC mov ebp, esp
:00442803 8B4D0C mov ecx, dword ptr [ebp+0C]
:00442806 E88551FCFF call 00407990
:0044280B 50 push eax
:0044280C 8B4D08 mov ecx, dword ptr [ebp+08]
:0044280F E87C7AFFFF call 0043A290 〈------再跟进
:00442814 F7D8 neg eax
:00442816 1BC0 sbb eax, eax
:00442818 F7D8 neg eax
:0044281A 5D pop ebp
:0044281B C20800 ret 0008

* Referenced by a CALL at Addresses:
|:0043A27A , :0044280F , :0044A0EF , :0044B6AA
|
:0043A290 55 push ebp
:0043A291 8BEC mov ebp, esp
:0043A293 51 push ecx
:0043A294 894DFC mov dword ptr [ebp-04], ecx
:0043A297 8B4508 mov eax, dword ptr [ebp+08] 〈----显示输入的注册码：78787878.ReLg7wxa(有点迷惑，不知什么时候加上了.ReLg7wxa)
:0043A29A 50 push eax
:0043A29B 8B4DFC mov ecx, dword ptr [ebp-04]
:0043A29E 8B11 mov edx, dword ptr [ecx] 〈----过此处下 d edx 可显示正确注册码ReLg7wxaOTHzYKzo
:0043A2A0 52 push edx
:0043A2A1 E89A950300 call 00473840
:0043A2A6 83C408 add esp, 00000008
:0043A2A9 8BE5 mov esp, ebp
:0043A2AB 5D pop ebp
:0043A2AC C20400 ret 0004

整理一下：

用户名:Crack007
注册码:ReLg7wxaOTHzYKzo

结束。

有一点搞不懂，就是不知这ReLg7wxa是怎么来的？


Altomp3maker 2.11

标 题:Altomp3maker 2.11破解手记 (1千字)
发信人:孙锋
时 间:2001-1-29 0:05:32
详细信息:
Altomp3maker 2.11破解手记
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
http://sffs.6to23.com

好长时间没有来联系软件破解了，今天下载了altomp3maker，就拿他来练手了。听说是很好的mp3制作软件。大家有兴趣就来练手吧。
当前最新版本为2.11。下载地址是ftp://ftp.eware.com.cn/pub/multimedia/mp3/AltoMP3Maker21.exe。

使用工具：
TRW20001.23

步骤：
1、启动altomp3maker后选择注册项，然后输入以下信息：
Name:sunfeng
Code:1212121212
2、启动trw2000，然后bpx hmemcpy中断，F5返回程式，点击OK，被trw2000拦截到。
3、bd *中断断点，然后按F12共计24次。
4、然后再一直按F10到下面地址：
0167:00442163 CALL 00407970 ;-------->F8跟进去
5、继续按F10，到下面地址，D ECX即可得到正确注册码。
0167:004421F0 LEA ECX,[EBP-18] ;----->D ECX得到正确的注册码：rWr4PRZB2LBXycjg
...
0167:004421FB PUSH ECX ;-------->D ECX ,得到注册码同上。
6、另外的注册码：
Name:孙锋
Code:wAAnBEZUxBgazIG5
7、用正确的注册号重新完成注册。

<----------完----------->


APIS32

 标 题:《APIS32》的注册码算法 还请各位大侠帮忙写一下注册机！！！！ (15千字)
发信人:RATARICE[BCG]
时 间:2001-8-7 20:36:46
详细信息:
《APIS32》的注册码算法

目标：APIS32
不用多说，相信大家都用过！
作者：RATARICE[BCG]
工具：FI、WB2000、TRW2000 1.23、W32DSM89
过程：
一、 用FI检查，发现是用PETITE 1.2压过。用WB2000找到程序入口，在用TRW脱掉。
二、 运行软件，填注册信息后，下BPX HMEMCPY。被拦，来到下面代码：

******************************************************************

* Referenced by a CALL at Addresses:
|:00401711 , :004018AF , :0040248C , :004026B9 , :00402E96 ----------->共有5处检查
|
:00405040 51 push ecx
:00405041 53 push ebx
:00405042 55 push ebp
:00405043 56 push esi
:00405044 57 push edi
:00405045 6A50 push 00000050
:00405047 6840B74000 push 0040B740

* Possible StringData Ref from Data Obj ->"UserKey"
|
:0040504C 6888A64000 push 0040A688
:00405051 E81A030000 call 00405370
:00405056 83C40C add esp, 0000000C
:00405059 83F810 cmp eax, 00000010 ---------------->注册码必须大于等于16
:0040505C 7D08 jge 00405066
:0040505E 33C0 xor eax, eax
:00405060 5F pop edi
:00405061 5E pop esi
:00405062 5D pop ebp
:00405063 5B pop ebx
:00405064 59 pop ecx
:00405065 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040505C(C)
|
:00405066 6A2F push 0000002F
:00405068 68C0C34000 push 0040C3C0

* Possible StringData Ref from Data Obj ->"UserName"
|
:0040506D 6878A64000 push 0040A678
:00405072 E8F9020000 call 00405370
:00405077 83C40C add esp, 0000000C
:0040507A 83F805 cmp eax, 00000005 --------------------->名字必须大于等于5
:0040507D 7D08 jge 00405087
:0040507F 33C0 xor eax, eax
:00405081 5F pop edi
:00405082 5E pop esi
:00405083 5D pop ebp
:00405084 5B pop ebx
:00405085 59 pop ecx
:00405086 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040507D(C)
|
:00405087 BF40B74000 mov edi, 0040B740
:0040508C 83C9FF or ecx, FFFFFFFF
:0040508F 33C0 xor eax, eax
:00405091 C60551B7400000 mov byte ptr [0040B751], 00
:00405098 F2 repnz
:00405099 AE scasb
:0040509A F7D1 not ecx
:0040509C 2BF9 sub edi, ecx
:0040509E 8BC1 mov eax, ecx
:004050A0 8BF7 mov esi, edi
:004050A2 BF54B74000 mov edi, 0040B754
:004050A7 C1E902 shr ecx, 02
:004050AA F3 repz
:004050AB A5 movsd
:004050AC 8BC8 mov ecx, eax
:004050AE 33C0 xor eax, eax
:004050B0 83E103 and ecx, 00000003
:004050B3 F3 repz
:004050B4 A4 movsb
:004050B5 BF49B74000 mov edi, 0040B749
:004050BA 83C9FF or ecx, FFFFFFFF
:004050BD F2 repnz
:004050BE AE scasb
:004050BF F7D1 not ecx
:004050C1 2BF9 sub edi, ecx
:004050C3 8BD1 mov edx, ecx
:004050C5 8BF7 mov esi, edi
:004050C7 BF5CB74000 mov edi, 0040B75C
:004050CC C1E902 shr ecx, 02
:004050CF F3 repz
:004050D0 A5 movsd
:004050D1 8BCA mov ecx, edx
:004050D3 83E103 and ecx, 00000003
:004050D6 32DB xor bl, bl
:004050D8 F3 repz
:004050D9 A4 movsb
:004050DA BE41B74000 mov esi, 0040B741
:004050DF BF54B74000 mov edi, 0040B754

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405103(C)
| 注册码第一次变形
:004050E4 57 push edi ------------------
:004050E5 E8E6010000 call 004052D0 |---->要追进去，它算出的数给al
:004050EA 8ACB mov cl, bl |---->bl初值等于0
:004050EC 83C404 add esp, 00000004 |
:004050EF 80C150 add cl, 50 |---->cl=bl+50
:004050F2 83C702 add edi, 00000002 |
:004050F5 32C1 xor al, cl |---->al与cl异或运算
:004050F7 FEC3 inc bl |---->bl加一
:004050F9 8846FF mov byte ptr [esi-01], al |---->将结果放入esi-01
:004050FC C60600 mov byte ptr [esi], 00 |---->将结果的下一位置0
:004050FF 46 inc esi |---->将指针进一
:00405100 80FB08 cmp bl, 08 |---->要循环8次
:00405103 72DF jb 004050E4 ---------------
:00405105 6854B74000 push 0040B754 注意： 注册码计算后变形，记作：（1）
:0040510A 6840B74000 push 0040B740
:0040510F E8EC010000 call 00405300 ------------------>注册码的第二次变形，要追入！
:00405114 BFC0C34000 mov edi, 0040C3C0
:00405119 83C9FF or ecx, FFFFFFFF
:0040511C 33C0 xor eax, eax
:0040511E 83C408 add esp, 00000008
:00405121 F2 repnz
:00405122 AE scasb
:00405123 F7D1 not ecx
:00405125 2BF9 sub edi, ecx
:00405127 33ED xor ebp, ebp
:00405129 8BD1 mov edx, ecx
:0040512B 8BF7 mov esi, edi
:0040512D BF5EB74000 mov edi, 0040B75E
:00405132 C1E902 shr ecx, 02
:00405135 F3 repz
:00405136 A5 movsd
:00405137 8BCA mov ecx, edx
:00405139 83E103 and ecx, 00000003
:0040513C F3 repz
:0040513D A4 movsb
:0040513E BFC0C34000 mov edi, 0040C3C0
:00405143 83C9FF or ecx, FFFFFFFF
:00405146 F2 repnz
:00405147 AE scasb
:00405148 F7D1 not ecx
:0040514A 49 dec ecx
:0040514B 80F908 cmp cl, 08
:0040514E 884C2410 mov byte ptr [esp+10], cl
:00405152 7330 jnb 00405184
:00405154 8B542410 mov edx, dword ptr [esp+10]
:00405158 BFC0C34000 mov edi, 0040C3C0
:0040515D 81E2FF000000 and edx, 000000FF
:00405163 83C9FF or ecx, FFFFFFFF
:00405166 81C25EB74000 add edx, 0040B75E
:0040516C F2 repnz
:0040516D AE scasb
:0040516E F7D1 not ecx
:00405170 2BF9 sub edi, ecx
:00405172 8BC1 mov eax, ecx
:00405174 8BF7 mov esi, edi
:00405176 8BFA mov edi, edx
:00405178 C1E902 shr ecx, 02
:0040517B F3 repz
:0040517C A5 movsd
:0040517D 8BC8 mov ecx, eax
:0040517F 83E103 and ecx, 00000003
:00405182 F3 repz
:00405183 A4 movsb

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405152(C)
|
:00405184 C60566B7400000 mov byte ptr [0040B766], 00 -------------->取名字的前8位！
:0040518B B954B74000 mov ecx, 0040B754
:00405190 BE08000000 mov esi, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004051B9(C)
|
:00405195 8A01 mov al, byte ptr [ecx] --------------
:00405197 3C20 cmp al, 20 |
:00405199 730E jnb 004051A9 |
:0040519B 33D2 xor edx, edx |
:0040519D 25FF000000 and eax, 000000FF |
:004051A2 8A510A mov dl, byte ptr [ecx+0A] |
:004051A5 0BD0 or edx, eax |
:004051A7 EB0C jmp 004051B5 |
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:00405199(C) | 分别取（2）与名字
| | 进行异或运算
:004051A9 33D2 xor edx, edx | 结果累加到ebp
:004051AB 25FF000000 and eax, 000000FF |
:004051B0 8A510A mov dl, byte ptr [ecx+0A] |
:004051B3 33D0 xor edx, eax |
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:004051A7(U) |
| |
:004051B5 03EA add ebp, edx |
:004051B7 41 inc ecx |
:004051B8 4E dec esi |
:004051B9 75DA jne 00405195 ------------------------
:004051BB 33C0 xor eax, eax
:004051BD 5F pop edi
:004051BE 85ED test ebp, ebp ----------------------->检查ebp是否为0，若为0
:004051C0 5E pop esi 则注册成功，反之失败！
:004051C1 5D pop ebp
:004051C2 0F94C0 sete al ----------------------------->置标志位
:004051C5 5B pop ebx
:004051C6 59 pop ecx
:004051C7 C3 ret

*************************************************************

* Referenced by a CALL at Address:
|:004050E5
|
:004052D0 8B4C2404 mov ecx, dword ptr [esp+04] ---------->将注册码的地址赋给ecx
:004052D4 8A01 mov al, byte ptr [ecx] --------------->取第一个数给al
:004052D6 3C39 cmp al, 39 --------------------------->与39比较
:004052D8 7E04 jle 004052DE ------------------------->小于等于就跳
:004052DA 04C9 add al, C9 --------------------------->若大于al=al+c9
:004052DC EB02 jmp 004052E0 ------------------------->跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052D8(C)
|
:004052DE 04D0 add al, D0 --------------------------->al=al+d0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052DC(U)
|
:004052E0 8A4901 mov cl, byte ptr [ecx+01] ------------>取第二个数给cl
:004052E3 80F939 cmp cl, 39 --------------------------->与39比较
:004052E6 7E09 jle 004052F1 ------------------------->小于等于就跳
:004052E8 C0E004 shl al, 04 --------------------------->若大于al逻辑左移4位
:004052EB 80E937 sub cl, 37 --------------------------->cl=cl-37
:004052EE 0AC1 or al, cl ---------------------------->al与cl进行或运算
:004052F0 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052E6(C)
|
:004052F1 C0E004 shl al, 04 -------------------------->al逻辑左移4位
:004052F4 80E930 sub cl, 30 -------------------------->cl=cl-30
:004052F7 0AC1 or al, cl --------------------------->al与cl进行或运算
:004052F9 C3 ret

**************************************************************

* Referenced by a CALL at Address: 共两重循环，见下：
|:0040510F
|
:00405300 53 push ebx
:00405301 55 push ebp
:00405302 8B6C2410 mov ebp, dword ptr [esp+10]
:00405306 56 push esi
:00405307 57 push edi
:00405308 8B7C2414 mov edi, dword ptr [esp+14]
:0040530C 33C9 xor ecx, ecx
:0040530E 2BFD sub edi, ebp
:00405310 897C2418 mov dword ptr [esp+18], edi
:00405314 EB04 jmp 0040531A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405364(C)
|
:00405316 8B7C2418 mov edi, dword ptr [esp+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405314(U)
|
:0040531A 8D3429 lea esi, dword ptr [ecx+ebp]
:0040531D 33D2 xor edx, edx
:0040531F B801000000 mov eax, 00000001
:00405324 C744241407000000 mov [esp+14], 00000007
:0040532C 8A1437 mov dl, byte ptr [edi+esi]
:0040532F 8BFA mov edi, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405350(C)
|
:00405331 8BD7 mov edx, edi ----------------------- 取出（1）中的数，自己与
:00405333 0FAFC2 imul eax, edx | 自己相乘得一个数，直到
:00405336 3D99880000 cmp eax, 00008899 | 这个数大于8899，再将这个
:0040533B 7E0A jle 00405347 | 数与8899相除，取余。共乘
:0040533D 99 cdq | 8会（1）中的数。最后将
:0040533E BB99880000 mov ebx, 00008899 | 得数赋给eax。
:00405343 F7FB idiv ebx |
:00405345 8BC2 mov eax, edx | 退出第一重循环，进入第二
| 重循环！
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:0040533B(C) |
| |
:00405347 8B542414 mov edx, dword ptr [esp+14] |
:0040534B 4A dec edx |
:0040534C 89542414 mov dword ptr [esp+14], edx |
:00405350 75DF jne 00405331 -----------------------
:00405352 99 cdq -------------------------------- 再将eax与bb相除，把余数
:00405353 BFBB000000 mov edi, 000000BB | 作为结果保存。
:00405358 F7FF idiv edi |
:0040535A 41 inc ecx | 这是第二重循环，共8回！
:0040535B 83F908 cmp ecx, 00000008 |
:0040535E 8816 mov byte ptr [esi], dl | 得到注册码的最终变形
:00405360 C6042900 mov byte ptr [ecx+ebp], 00 | 记位（2）
:00405364 7CB0 jl 00405316 ------------------------
:00405366 5F pop edi
:00405367 5E pop esi
:00405368 5D pop ebp
:00405369 5B pop ebx
:0040536A C3 ret

三、 虽然明白了它的注册算法，但终因本人功力不够，没能写出注册机，还请大侠们帮忙写出它的注册机， 让我也可早日拿到注册码！！！也能从中多学点知识！！！

！！！！！！！！！！！！！！！！！！静待佳音！！！！！！！！！！！！！！！！！！


APIS32NT v1.4

 标 题:API Spy for NT v1.4 (16千字)
发信人:1212
时 间:2000-10-25 20:13:05
详细信息:
APIS32NT v1.4
http://www.biosys.net/apis32

这个软件加过壳，壳中似有检测调试器断点的反跟踪代码。真正入口如下：
001B:004185BD MOV ESP,[ESP+14]
001B:004185C1 POP ESI
001B:004185C2 MOV EDI,ESI
001B:004185C4 ADD ESI,000015D7
001B:004185CA PUSH 05
001B:004185CC POP ECX
001B:004185CD REPZ MOVSB
001B:004185CF POPAD
001B:004185D0 POPF
001B:004185D2 JMP 004045A0 //入口地址
这里不关心脱壳，主要是讲如何制作它的注册机。

先用bpx GetDlgItemTextA设断，会中断两次，分别读入UserName和UserKey。然后用BPM或BPR监视你输入的假注册码，发现它将注册码写入注册表之后未再对读入的注册码作进一步的判断就弹出了“错误的注册码”对话框。这说明它肯定判断的是从注册表中读出来的注册码，即先写入注册表再读出来进行判断，用RegMon也可以证实这一点。于是用bpx RegQueryValueExA设断，中断后按两下F12，就看见了判断的代码。首先是判断长度：

:0041EEEC 83EC2C sub esp, 0000002C
:0041EEEF 53 push ebx
:0041EEF0 55 push ebp
:0041EEF1 56 push esi
:0041EEF2 57 push edi
:0041EEF3 6A50 push 00000050
:0041EEF5 68C0AE4000 push 0040AEC0

* Possible StringData Ref from Data Obj ->"UserKey"
|
:0041EEFA 6898864000 push 00408698
:0041EEFF E868030000 call 0041F26C //RegQueryValueExA( )
:0041EF04 83C40C add esp, 0000000C
:0041EF07 83F811 cmp eax, 00000011 //strlen(UserKey) >= 0x11?
:0041EF0A 7D0A jge 0041EF16
:0041EF0C 33C0 xor eax, eax //bad guy
:0041EF0E 5F pop edi
:0041EF0F 5E pop esi
:0041EF10 5D pop ebp
:0041EF11 5B pop ebx
:0041EF12 83C42C add esp, 0000002C
:0041EF15 C3 ret

:0041EF16 6A2F push 0000002F
:0041EF18 68C0BE4000 push 0040BEC0

* Possible StringData Ref from Data Obj ->"UserName"
|
:0041EF1D 6888864000 push 00408688
:0041EF22 E845030000 call 0041F26C //RegQueryValueExA( )
:0041EF27 83C40C add esp, 0000000C
:0041EF2A 83F805 cmp eax, 00000005 //strlen(UserName) >= 5 ?
:0041EF2D 7D0A jge 0041EF39
:0041EF2F 33C0 xor eax, eax //bad guy
:0041EF31 5F pop edi
:0041EF32 5E pop esi
:0041EF33 5D pop ebp
:0041EF34 5B pop ebx
:0041EF35 83C42C add esp, 0000002C
:0041EF38 C3 ret

:0041EF39 6A1E push 0000001E
:0041EF3B 8D442418 lea eax, dword ptr [esp+18]
:0041EF3F 68C0BE4000 push 0040BEC0
:0041EF44 50 push eax
:0041EF45 E812070000 call 0041F65C
:0041EF4A 83C40C add esp, 0000000C
:0041EF4D 8D4C2414 lea ecx, dword ptr [esp+14]
:0041EF51 51 push ecx
:0041EF52 E845FFFFFF call 0041EE9C //strupr(UserName)
:0041EF57 8D7C2418 lea edi, dword ptr [esp+18]
:0041EF5B 83C9FF or ecx, FFFFFFFF
:0041EF5E 33C0 xor eax, eax //bad guy
:0041EF60 83C404 add esp, 00000004
:0041EF63 F2 repnz
:0041EF64 AE scasb
:0041EF65 F7D1 not ecx
:0041EF67 49 dec ecx
:0041EF68 83F905 cmp ecx, 00000005 //strlen(UserName) >= 5?
:0041EF6B 7308 jnb 0041EF75
:0041EF6D 5F pop edi
:0041EF6E 5E pop esi
:0041EF6F 5D pop ebp
:0041EF70 5B pop ebx
:0041EF71 83C42C add esp, 0000002C
:0041EF74 C3 ret

接下来它要判断注册码的第8位，即UserKey[8]。如下，显然要满足条件
(UserKey[8] ^ 0x20) + 0xF3 = 0 （溢出的进位位不考虑）
从而可知注册码的第8个字符是横杠字符"-"。

:0041EF75 8A1DC8AE4000 mov bl, byte ptr [0040AEC8] //取出UserKey[8]
...............................................
:0041EF85 80F320 xor bl, 20
...............................................
:0041EFCB 80C3F3 add bl, F3
...............................................
:0041EFD0 740A je 0041EFDC
:0041EFD2 33C0 xor eax, eax //bad guy
:0041EFD4 5F pop edi
:0041EFD5 5E pop esi
:0041EFD6 5D pop ebp
:0041EFD7 5B pop ebx
:0041EFD8 83C42C add esp, 0000002C
:0041EFDB C3 ret

注意到此时bl寄存器的值应为0，这bl要作为下面这个循环的循环控制变量。该循环先将注册码的另外16个字符转换成8个字节，比如注册码是"11223344-55667788"，则得到的8个字节是
0x11, 0x22,0x33,0x44,0x55,0x66,0x77,0x88
用数组a[ ]表示这8个字节，下面的循环对应的C语句就是：
char a[8];
for(k = 0; k < 8; k++)
{
a[k] = UserKey[k] ^ (k + 0x50);
}
由于异或运算可逆，所以已知a[k]是可以求出UserKey[k]的。

:0041EFDC BEC1AE4000 mov esi, 0040AEC1
:0041EFE1 BFD4AE4000 mov edi, 0040AED4
:0041EFE6 57 push edi
:0041EFE7 E8E0010000 call 0041F1CC //将注册码中的两个字符转换成一个字节
:0041EFEC 8ACB mov cl, bl //(cl) = k
:0041EFEE 83C404 add esp, 00000004
:0041EFF1 80C150 add cl, 50 //(cl) = k + 0x50
:0041EFF4 83C702 add edi, 00000002 //指向后续的两个字符
:0041EFF7 32C1 xor al, cl // a[k] ^= k + 0x50
:0041EFF9 FEC3 inc bl // k++
:0041EFFB 8846FF mov byte ptr [esi-01], al
:0041EFFE C60600 mov byte ptr [esi], 00
:0041F001 46 inc esi
:0041F002 80FB08 cmp bl, 08
:0041F005 72DF jb 0041EFE6 //继续循环

之后对a[ ]进行不可逆变换，得到新的8个字节，如下：

* Referenced by a CALL at Address:
|:0041F011
|
:0041F1FC 53 push ebx
:0041F1FD 55 push ebp
:0041F1FE 8B6C2410 mov ebp, dword ptr [esp+10]
:0041F202 56 push esi
:0041F203 57 push edi
:0041F204 8B7C2414 mov edi, dword ptr [esp+14]
:0041F208 33C9 xor ecx, ecx //外循环控制变量初值
:0041F20A 2BFD sub edi, ebp
:0041F20C 897C2418 mov dword ptr [esp+18], edi
:0041F210 EB04 jmp 0041F216

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F260(C)
|
:0041F212 8B7C2418 mov edi, dword ptr [esp+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F210(U)
|
:0041F216 8D3429 lea esi, dword ptr [ecx+ebp]
:0041F219 33D2 xor edx, edx
:0041F21B B801000000 mov eax, 00000001 //累乘器的初值
:0041F220 C744241407000000 mov [esp+14], 00000007 //内循环控制变量的初值
:0041F228 8A1437 mov dl, byte ptr [edi+esi]//取出a[k]
:0041F22B 8BFA mov edi, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F24C(C)
|
:0041F22D 8BD7 mov edx, edi
:0041F22F 0FAFC2 imul eax, edx //累乘器乘以a[k]
:0041F232 3D99880000 cmp eax, 00008899
:0041F237 7E0A jle 0041F243
:0041F239 99 cdq
:0041F23A BB99880000 mov ebx, 00008899
:0041F23F F7FB idiv ebx //对0x8899求余
:0041F241 8BC2 mov eax, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F237(C)
|
:0041F243 8B542414 mov edx, dword ptr [esp+14]
:0041F247 4A dec edx //内循环控制变量减1
:0041F248 89542414 mov dword ptr [esp+14], edx
:0041F24C 75DF jne 0041F22D //内循环，求乘幂
:0041F24E 99 cdq
:0041F24F BFBB000000 mov edi, 000000BB
:0041F254 F7FF idiv edi //对0xBB求余
:0041F256 41 inc ecx
:0041F257 83F908 cmp ecx, 00000008 //8个字节均处理完？
:0041F25A 8816 mov byte ptr [esi], dl //保存余数
:0041F25C C6042900 mov byte ptr [ecx+ebp], 00
:0041F260 7CB0 jl 0041F212 //外循环，共处理8个字节
:0041F262 5F pop edi
:0041F263 5E pop esi
:0041F264 5D pop ebp
:0041F265 5B pop ebx
:0041F266 C3 ret

上述循环可等价表示如下：
for(k = 0; k < 8; k++)
{
temp = 1L;
for(j = 7; j > 0; j--)
{
temp *= a[k];
if (temp > 0x00008899L)
{
temp %= 0x00008899L;
}
}

a[k] = temp % 0x000000BBL;
}
对于这个不可逆的变换，我们可以根据变换之后的8字节的值来用穷举的方法猜出变换之前的8个字节的值，最坏的情况只需要猜(256 * 8)次即可，当然也可能无解。优化一下的话最坏只要猜256次。

紧跟着它要从UserName得到一个新的长为8的串UserString。下面的处理等价于C语句：

char index = 0;
for(k = 0; k < 8; k++)
{
UserString[k] = UserName[index++];
index %= NameLen;
}
即如果UserName的长度大于等于8，则新串UserString就是UserName的前8个字符，否则把UserName串重复多次，然后取整个串的前8个字符即可。

:0041F016 8D7C241C lea edi, dword ptr [esp+1C]
:0041F01A 83C9FF or ecx, FFFFFFFF
:0041F01D 33C0 xor eax, eax
:0041F01F 83C408 add esp, 00000008
:0041F022 F2 repnz
:0041F023 AE scasb
:0041F024 F7D1 not ecx
:0041F026 2BF9 sub edi, ecx
:0041F028 33ED xor ebp, ebp
:0041F02A 8BD1 mov edx, ecx
:0041F02C 8BF7 mov esi, edi
:0041F02E BFDEAE4000 mov edi, 0040AEDE
:0041F033 C1E902 shr ecx, 02
:0041F036 F3 repz
:0041F037 A5 movsd
:0041F038 8BCA mov ecx, edx
:0041F03A 83E103 and ecx, 00000003
:0041F03D F3 repz
:0041F03E A4 movsb
:0041F03F 8D7C2414 lea edi, dword ptr [esp+14]
:0041F043 83C9FF or ecx, FFFFFFFF
:0041F046 F2 repnz
:0041F047 AE scasb
:0041F048 F7D1 not ecx
:0041F04A 49 dec ecx
:0041F04B 80F908 cmp cl, 08 //判UserName的长度
:0041F04E 884C2410 mov byte ptr [esp+10], cl
:0041F052 732F jnb 0041F083 //大于等于8则取前8个字符
:0041F054 8B542410 mov edx, dword ptr [esp+10] //否则拼也要拼8个字符出来
:0041F058 8D7C2414 lea edi, dword ptr [esp+14]
:0041F05C 81E2FF000000 and edx, 000000FF
:0041F062 83C9FF or ecx, FFFFFFFF
:0041F065 81C2DEAE4000 add edx, 0040AEDE
:0041F06B F2 repnz
:0041F06C AE scasb
:0041F06D F7D1 not ecx
:0041F06F 2BF9 sub edi, ecx
:0041F071 8BC1 mov eax, ecx
:0041F073 8BF7 mov esi, edi
:0041F075 8BFA mov edi, edx
:0041F077 C1E902 shr ecx, 02
:0041F07A F3 repz
:0041F07B A5 movsd
:0041F07C 8BC8 mov ecx, eax
:0041F07E 83E103 and ecx, 00000003
:0041F081 F3 repz
:0041F082 A4 movsb

最后就是利用UserString[ ]和UserKey[ ]进行判断。这也是一个循环。

:0041F028 33ED xor ebp, ebp
......................................................
:0041F083 C605E6AE400000 mov byte ptr [0040AEE6], 00
:0041F08A B9D4AE4000 mov ecx, 0040AED4
:0041F08F BE08000000 mov esi, 00000008 //循环控制变量k = 8
:0041F094 8A01 mov al, byte ptr [ecx] //取出a[k]
:0041F096 3C20 cmp al, 20 //和0x20相比，分两种情况处理
:0041F098 730E jnb 0041F0A8
:0041F09A 33D2 xor edx, edx
:0041F09C 25FF000000 and eax, 000000FF
:0041F0A1 8A510A mov dl, byte ptr [ecx+0A] //取出UserString[k]
:0041F0A4 0BD0 or edx, eax //与a[k]相或
:0041F0A6 EB0C jmp 0041F0B4
:0041F0A8 33D2 xor edx, edx
:0041F0AA 25FF000000 and eax, 000000FF
:0041F0AF 8A510A mov dl, byte ptr [ecx+0A] //取出UserString[k]
:0041F0B2 33D0 xor edx, eax //与a[k]异或
:0041F0B4 03EA add ebp, edx //累加到ebp中
:0041F0B6 41 inc ecx //下一个字节
:0041F0B7 4E dec esi //k--;
:0041F0B8 75DA jne 0041F094 //继续循环

:0041F0BA 33C0 xor eax, eax
:0041F0BC 5F pop edi
:0041F0BD 85ED test ebp, ebp //累加和为0吗？
:0041F0BF 5E pop esi
:0041F0C0 5D pop ebp
:0041F0C1 0F94C0 sete al //为0则OK，否则bad guy
:0041F0C4 5B pop ebx
:0041F0C5 83C42C add esp, 0000002C
:0041F0C8 C3 ret

上面这个循环可等价为：
long ebp = 0
for(k = 0; k < 8; k++)
{
if (a[k] < 0x20)
{
ebp += UserString[k] | a[k];
}
else
{
ebp += UserString[k] ^ a[k];
}
}

注册码正确与否的标准为：

if (ebp)
{
printf("Wrong key");
}
else
{
printf("good guy");
}

最后这个循环初看之下也比较难求逆，因为其中的或运算是不可逆的。但实际上我们只要让(a[k] < 0x20)这个条件永远不会满足即可避开这个或运算，此时上面这个循环简化为可逆的异或变换：
for(k = 0; k < 8; k++)
{
ebp += UserString[k] ^ a[k];
}

这样要想让累加和ebp为0，只要满足a[k] = UserString[k]（k = 0, ..., 7）即可，由于UserString[k]是由可显示的用户名得来的，所以肯定满足(a[k] >= 0x20)。至此得到注册机如下：

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
char UserName[128];
char UserString[8];
char a[8];
int index, len;
char k, j;
signed long temp, guess;
char SuccessCounter;

do
{
printf("Input your name(at least 5 chars):");
gets(UserName);
len = strlen(UserName);
} while(len < 5);

strupr(UserName);

index = 0;
for(k = 0; k < 8; k++)
{
a[k] = UserString[k] = UserName[index++];
index %= len;
}

//下面用穷举求出变换前的8个字节
SuccessCounter = 0;
for(k = 0; k < 8; k++)
{
for(guess = 0; guess <= 255; guess++)
{
temp = 1L;
for(j = 7; j > 0; j--)
{
temp *= guess;
if (temp > 0x00008899L)
{
temp %= 0x00008899L;
}
}

if ((temp % 0x000000BBL) == a[k])
{
SuccessCounter++;
a[k] = guess;
break;
}
}
}

//判断8个字节是否全部穷举成功
if (SuccessCounter != 8)
{
printf("Guess failed.\n");
exit(-1);
}

for(k = 0; k < 8; k++)
{
a[k] ^= (k + 0x50);
}

printf("Your registration key is: ");
for(k = 0; k < 4; k++)
{

标 题:续 (1千字)
发信人:1212
时 间:2000-10-25 20:14:19
详细信息:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
char        UserName[128];
char        UserString[8];
char        a[8];
int          index, len;
char        k, j;
signed long  temp, guess;
char        SuccessCounter;

do
{
printf("Input your name(at least 5 chars):");
gets(UserName);
len = strlen(UserName);
} while(len < 5);

strupr(UserName);

index = 0;
for(k = 0; k < 8; k++)
{
a[k]  = UserString[k] = UserName[index++];
index %= len;
}

//下面用穷举求出变换前的8个字节
SuccessCounter = 0;
for(k = 0; k < 8; k++)
{
for(guess = 0; guess <= 255; guess++)
{
temp = 1L;
for(j = 7; j > 0; j--)
{
temp *= guess;
if (temp > 0x00008899L)
{
temp %=
  0x00008899L;
}
}

if ((temp % 0x000000BBL) == a[k])
{
SuccessCounter++;
a[k] = guess;
break;
}
}
}

//判断8个字节是否全部穷举成功
if (SuccessCounter != 8)
{
printf("Guess failed.\n");
exit(-1);
}

for(k = 0; k < 8; k++)
{
a[k] ^= (k + 0x50);
}

printf("Your registration key is: ");
for(k = 0; k < 4; k++)
{
printf("%02X", a[k] & 0xFF);
}
printf("-");
for(k = 4; k < 8; k++)
{
printf("%02X", a[k] & 0xFF);
}
printf("\n");
}

blowfish


APISpy32 2.5

标 题:APISpy32 2.5的注册 (7千字)
发信人:henryw
时 间:2001-4-1 12:15:43
详细信息:
APISpy32 2.5的注册

[软件介绍]
此软件可以显示软件启动过程中所有调用的API以及他们的参数，这对于破解
广告条的软件极为有用。如果不注册，只能记录20个Call。

[下载]
krack.126.com

[破解过程]
这个软件的注册比较特殊，是依靠计算注册码来得到注册名字。
似乎很难使用逆向算法来得到自己想要的注册名。

====================================================================

注册过程描述：
1. 将假注册码16位取前8位和后7位组成一个新的注册码RegNew，末尾加字节00H.
2. 每次依次取RegNew的两个字节，第一个字节放入al, 第二个字节放入cl,
如果第一个字节(al)小于等于39H，则将al+D0H, 如果大于39H，则将al+C9,
如果第二个字节(cl)小于等于39H, 则将cl-30H，如果大于39H, 则将cl-37。
然后al左移4位，al or cl生成新的一个字节，依次和50H-57H作xor，得到的8个
新字节替代假code位置的前8位。
3. 取现在假code位置的前8位开始运算。
设EAX=1
取出假code一个字节，乘以eax，如果比8899H大，则Eax放入eax除以8899H的余数。
继续用假code的同一个字节乘以eax，乘以7次后将此时的eax除以BBH，获得余数。
然后取假code第二个字节，设eax=1，作同样运算。
如此生成的8个余数作为新的字节。
4. 此8个新字节应同注册名字的8位相同。注册名字不够8位的，需要从注册名字起始位
置往后取相应的个数添加到末尾去。

====================汇编编码开始========================================

注册第2步
——————
:004050E5 E8E6010000 call 004052D0 <--------- 追入后如下面详细所述
:004050EA 8ACB mov cl, bl
:004050EC 83C404 add esp, 00000004
:004050EF 80C150 add cl, 50
:004050F2 83C702 add edi, 00000002
:004050F5 32C1 xor al, cl
:004050F7 FEC3 inc bl
:004050F9 8846FF mov byte ptr [esi-01], al
:004050FC C60600 mov byte ptr [esi], 00
:004050FF 46 inc esi
:00405100 80FB08 cmp bl, 08
:00405103 72DF jb 004050E4

* Referenced by a CALL at Address:
|:004050E5
|
:004052D0 8B4C2404 mov ecx, dword ptr [esp+04]
:004052D4 8A01 mov al, byte ptr [ecx] <----- 前一个字节
:004052D6 3C39 cmp al, 39
:004052D8 7E04 jle 004052DE
:004052DA 04C9 add al, C9
:004052DC EB02 jmp 004052E0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052D8(C)
|
:004052DE 04D0 add al, D0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004052DC(U)
|
:004052E0 8A4901 mov cl, byte ptr [ecx+01] <---- 后一个字节
:004052E3 80F939 cmp cl, 39
:004052E6 7E09 jle 004052F1
:004052E8 C0E004 shl al, 04
:004052EB 80E937 sub cl, 37
:004052EE 0AC1 or al, cl
:004052F0 C3 ret

注册第3步
----------
* Referenced by a CALL at Address:
|:0040510F
..............
..............
:0040531F B801000000 mov eax, 00000001
:00405324 C744241407000000 mov [esp+14], 00000007 <---- 小循环计数
:0040532C 8A1437 mov dl, byte ptr [edi+esi] <---- 第二步生成的字节
:0040532F 8BFA mov edi, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405350(C)
|
:00405331 8BD7 mov edx, edi
:00405333 0FAFC2 imul eax, edx <---- eax乘以edx，
:00405336 3D99880000 cmp eax, 00008899 <---- 和8899H比较
:0040533B 7E0A jle 00405347 <---- 不大就跳
:0040533D 99 cdq
:0040533E BB99880000 mov ebx, 00008899
:00405343 F7FB idiv ebx <---- eax/ebx余数在edx
:00405345 8BC2 mov eax, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040533B(C)
|
:00405347 8B542414 mov edx, dword ptr [esp+14] <---- 小循环次数->edx
:0040534B 4A dec edx <---- 减1次
:0040534C 89542414 mov dword ptr [esp+14], edx <---- 放回到esp+14处存起来
:00405350 75DF jne 00405331 <---- 不够7次继续小循环
:00405352 99 cdq
:00405353 BFBB000000 mov edi, 000000BB
:00405358 F7FF idiv edi <---- eax/edi，余数在edx
:0040535A 41 inc ecx
:0040535B 83F908 cmp ecx, 00000008 <----------大循环计数
:0040535E 8816 mov byte ptr [esi], dl <---- 余数的dl
:00405360 C6042900 mov byte ptr [ecx+ebp], 00
:00405364 7CB0 jl 00405316 <---- 够8次吗？
:00405366 5F pop edi
:00405367 5E pop esi
:00405368 5D pop ebp
:00405369 5B pop ebx
:0040536A C3 ret

注册第4步
----------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004051B9(C)
|
:00405195 8A01 mov al, byte ptr [ecx] <----- 第三步生成的字节，ecx内已经是注册码了。
:00405197 3C20 cmp al, 20
:00405199 730E jnb 004051A9
:0040519B 33D2 xor edx, edx
:0040519D 25FF000000 and eax, 000000FF
:004051A2 8A510A mov dl, byte ptr [ecx+0A]
:004051A5 0BD0 or edx, eax <------- al比20H小，则or, 只有
0 or 0似乎才能使得最后的ebp为0
:004051A7 EB0C jmp 004051B5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405199(C)
|
:004051A9 33D2 xor edx, edx
:004051AB 25FF000000 and eax, 000000FF
:004051B0 8A510A mov dl, byte ptr [ecx+0A]
:004051B3 33D0 xor edx, eax <------- al比20h大，则xor，只要edx=eax即可。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004051A7(U)
|
:004051B5 03EA add ebp, edx <------- 所得结果都加到ebp中去。
:004051B7 41 inc ecx
:004051B8 4E dec esi
:004051B9 75DA jne 00405195
:004051BB 33C0 xor eax, eax
:004051BD 5F pop edi
:004051BE 85ED test ebp, ebp
:004051C0 5E pop esi
:004051C1 5D pop ebp
:004051C2 0F94C0 sete al <------- 如果ebp为零则Flag Z=1, al=1，注册成功。
:004051C5 5B pop ebx
:004051C6 59 pop ecx
:004051C7 C3 ret
==============================汇编编码完====================================

不知道能否写出逆算法，似乎不能吧。于是只好写了个小程序，生成一个表，列出在特定位置上什么样的一个
byte可以对应算出一个可见AscII字符。注册码的第9位可以任意字符。最后一位注册码算出的可见ascii字符似乎
只能为'('，不知道有没有弄错?

这是其中的一个注册码：
RegName: TTTTTTT(
RegCode: 35343736g313033A

标 题:可逆，对应的注册码还不止一个！我用CHINA作用户名就得到三四个,如：0Je60Y4b0cQ0Max27 (空)
发信人:china 2000
时 间:2001-4-1 18:04:07
详细信息:

标 题:something (1千字)
发信人:1212
时 间:2001-4-1 20:46:09
详细信息:

something i did long long ago:)

for(i=0x31;i<0x7f;i++)
{
for(j=0x31;j<0x7f;j++)
{
n1=i;
n2=j;
if(n1<=0x39)
n1=(n1+0xd0)&0x00ff;
else n1=(n1+0xc9)&0x00ff;
n1=(n1<<4)&0x00ff;
if (n2<=0x39)
n2=(n2-0x30)&0x00ff;
else n2=(n2-0x37)&0x00ff;
num[i][j]=n1|n2;
switch(n)
{
case 0:
m=num[i][j]^(0x50);
break;
case 1:
m=num[i][j]^(0x51);
break;
case 2:
m=num[i][j]^(0x52);
break;
case 3:
m=num[i][j]^(0x53);
break;
case 4:
m=num[i][j]^(0x54);
break;
case 5:
m=num[i][j]^(0x55);
break;
case 6:
m=num[i][j]^(0x56);
break;
case 7:
m=num[i][j]^(0x57);
break;
default:
;
}
a=b=m;
for (k=0;k<6;k++)
{
a*=b;
if(a>0x8899)
a%=0x8899;
}
c=a%0xbb;
if (c==name[n])
{
ser[2*n]=i,ser[2*n+1]=j;
n++;
if (n>=8)
goto exit;
else goto calc;
}
}
}


AppBuilder for mfc 3.07

 标 题:“川大软件”开发的MFC可视化开发工具AppBuilder for mfc 3.07简体中文版注册码 (2千字)
发信人:CrackerABC[BCG]
时 间:2001-5-7 9:28:05
详细信息:
AppBuilder for mfc 3.07简体中文版注册码

这个软件是由“川大软件”开发的MFC可视化开发工具，主要是用与VC++的开发，下载地址是：

URL http://www.ucancode.com/Download/AppBuilder307/AppBuilderformfc_chs_307.zip

下面是我的注册码（又是针对机器码来计算注册码的）
================================================================================
注册码：5CM9U#@MX0#MC （机器码）
产品密码：50795-4991-7345-82

================================================================================

下面是过程：

1、首先随便输入任意注册码：12121212

2、启动TRW2000，然后使用搜索法

s 30:0 l ffffffff '12121212'
找到一个地址 *********
然后下 BPM 30:********

3、F5返回程序空间，点注册被拦截

4、下BD *

5、PMODULE后被拦截

6、然后一直按F10到下面的位置：

0167:007CF673 MOV ECX,EAX
0167:007CF675 CALL 008484D4
0167:007CF67A MOV EDX,[00A2D58C]
0167:007CF680 MOV [ESP+0C],EDX
0167:007CF684 LEA EAX,[ESP+0C]
0167:007CF688 MOV ECX,ESI
0167:007CF68A PUSH EAX
0167:007CF68B PUSH DWORD 0428
0167:007CF690 MOV BYTE [ESP+0280],01
0167:007CF698 CALL 0084AA0A
0167:007CF69D MOV ECX,EAX
0167:007CF69F CALL 008484D4
0167:007CF6A4 MOV ECX,[ESP+08] //------D ECX 机器码
0167:007CF6A8 MOV EAX,[ECX-08] //------D EAX 假注册码
0167:007CF6AB TEST EAX,EAX
0167:007CF6AD JZ NEAR 007CF8E3
0167:007CF6B3 MOV EDX,[ESP+0C]
0167:007CF6B7 MOV EAX,[EDX-08]
0167:007CF6BA TEST EAX,EAX
0167:007CF6BC JZ NEAR 007CF8E3
0167:007CF6C2 PUSH EBX
0167:007CF6C3 MOV ECX,00A35010
0167:007CF6C8 CALL 0084B0CC
0167:007CF6CD PUSH DWORD 07D0
0167:007CF6D2 CALL `KERNEL32!Sleep`
0167:007CF6D8 MOV ECX,00A35010
0167:007CF6DD CALL 0084B0E1
0167:007CF6E2 LEA ECX,[ESP+0128]
0167:007CF6E9 CALL 0077D450
0167:007CF6EE MOV EAX,[ESP+10]
0167:007CF6F2 LEA ECX,[ESP+08]
0167:007CF6F6 PUSH EAX
0167:007CF6F7 PUSH ECX
0167:007CF6F8 MOV BYTE [ESP+0284],02
0167:007CF700 CALL 0078AE50
0167:007CF705 MOV EDX,[ESP+14]
0167:007CF709 MOV EAX,[EAX] //------D EDX 假注册码
0167:007CF70B PUSH EDX //------D EAX 真注册码
0167:007CF70C PUSH EAX
0167:007CF70D CALL 00828C42
0167:007CF712 ADD ESP,BYTE +10
0167:007CF715 LEA ECX,[ESP+08]
0167:007CF719 TEST EAX,EAX

注：

不知道这个软件是怎么回事，每次都要输入注册码，但是这个注册码是绝对正确的，进入以后也提示是注册成功了，我想可能是软件公司开发时就是这样的吧。

*************************************************

主页：http://sffs.533.net （[BCG]大本营）

软件破解，软件注册，破解教学，破解申请，注册机码。

请保留我的信息，谢谢！

**************************************************


Applet Marquee Wizard v3.5

 标 题:再贴一篇译文 (1千字)
发信人:1212
时 间:2000-9-10 10:32:54
详细信息:
Applet Marquee Wizard v3.5
破解者：punisher(译者注：punisher为原文作者)
保护机制：姓名/注册码
破解过程：运行程序，出现主窗口和一个要你注册的nag screen。点击这个破框上的"Register"按钮，弹出注册窗口(还有一个preview窗口，关掉它)。
键入你的名字和随便一个注册码。我用punisher和45454545。
按Ctrl-d激活SOFTICE，下断点BPX HMEMCPY，按F5返回注册窗口。现在点击'REGISTER'，程序被SOFTICE拦截。程序在到达保护机制前总共调用了三次HMEMCPY函数，我们必须略过前两次，所以按F5两次。我们现在是处在第三个调用HMEMCPY函数的CALL中，按F10直到这里：
0117:9E8E shr ecx, 2
0117:9E92 repz movsd <- 将你的名字移到另一个位址
0117:9E96 pop ecx
0117:9E98 and ecx, 3
0117:9E9C repz movsb
0117:9E9F xor dx, dx
在 REPZ MOVSD时看一下EDI的内容：
D ES:EDI
将光标带过REPZ MOVSB时你会看见你的名字被拷贝到你D过的位址中。注意一下你名字的起始地址，它的形式是253F:00000000(位址由于计算机的不同而各异)。我们将通过以下指令发现你名字的真实地址并在其上下断点：
PAGE 253F:00000000 <-你的地址会不同
你会看到：
Linear Physical Attributes Type
xxxxxxxx xxxxxxxx P D A U SYSTEM
你想要的是Linear的地址，所以你可以根据名字的字符数在该范围上下断点。你选择的段基址必须是30，如下：
BPR 30:xxxxxxxx 30:xxxxxxxx+8 rw
现在按F5让程序继续运行，SOFTICE会中断在此：
:00408DC9 repz cmpsb <- 我们的名字和真名比较
:00408DCB jz 00408DF1
:00408DCD mov al, [esi-01]
:00408DD0 cmp al, 61
:00408DD3 jb 00408DDD
:00408DD5 cmp al, 7A
:00408DD8 ja 00408DDD
在:00408dc9 repz cmpsb处，D ESI会看到你的名字，D EDI会看到两处ALPHA字符。第一处是和你的名字比较，第二处就是你的注册码了。还不快记下来!我看到的是p97z和23ws3,输入后OK!


Aqua 3D Screen Saver v1.5

标 题:一个水族箱屏保，破解不完全，谁帮忙看看？ (2千字)
发信人:lijing
时 间:2001-4-12 15:17:35
详细信息:
软件下载：http://www.digimindsoft.com/aqua3d.exe
软件大小：552KB

问题：用找到的注册码可以注册成功，但屏幕保护出来大约10秒钟后，还是出现“未注册”提示框，让按“空格”键输入注册码。请高手看看，哪里有限制？

Aqua 3D Screen Saver v1.5 注册码算法

用户名：任意
注册码格式：xxxx-xxxx-xxxx-xxxx (共19位，由0-F的数字组成)

一、关键代码
:0040C0A8 E8A38EFFFF call 00404F50 ;判断注册码格式及位数是否为13H位，第5位是否为'-'
:0040C0AD 83C414 add esp, 00000014
:0040C0B0 84C0 test al, al ; 若符合xxxx-xxxxxxxxxxxxxx格式，则al=01，
:0040C0B2 0F8493000000 je 0040C14B ; 不跳
:0040C0B8 8B45E8 mov eax, dword ptr [ebp-18] ; ax=1-4位
:0040C0BB 8B55E4 mov edx, dword ptr [ebp-1C] ; dx=6-9位
:0040C0BE 8B4DE0 mov ecx, dword ptr [ebp-20] ; cx=11-14位
:0040C0C1 057E340000 add eax, 0000347E
:0040C0C6 33C2 xor eax, edx
:0040C0C8 33C1 xor eax, ecx
:0040C0CA 35CD540000 xor eax, 000054CD
:0040C0CF 663945EE cmp word ptr [ebp-12], ax ; [ebp-12]=16-19位
:0040C0D3 7576 jne 0040C14B ; 相等即可注册成功
:0040C0D5 A1F0454400 mov eax, dword ptr [004445F0]
:0040C0DA 8945E8 mov dword ptr [ebp-18], eax
:0040C0DD 8945EC mov dword ptr [ebp-14], eax

* Possible Reference to String Resource ID=59145: "Registration"
|
:0040C0E0 6809E70000 push 0000E709
:0040C0E5 8D4DE8 lea ecx, dword ptr [ebp-18]
:0040C0E8 C645FC02 mov [ebp-04], 02
:0040C0EC E8540A0200 call 0042CB45

* Possible Reference to String Resource ID=59147: "Thanks for support!"
|
:0040C0F1 680BE70000 push 0000E70B
:0040C0F6 8D4DEC lea ecx, dword ptr [ebp-14]
:0040C0F9 E8470A0200 call 0042CB45
:0040C0FE 85F6 test esi, esi
:0040C100 7504 jne 0040C106
:0040C102 33C0 xor eax, eax
:0040C104 EB03 jmp 0040C109

二、判断注册码是否为13H(19)位
:00404FB3 83F913 cmp ecx, 00000013
:00404FB6 7425 je 00404FDD

三、判断注册码第5位是否为'-'号
:00404FDD 807E042D cmp byte ptr [esi+04], 2D
:00404FE1 7425 je 00405008

四、注册码算法

(((1-4位 + 347E) xor (6-9位)) xor (11-14位)) xor 54CD ==16-19位

五、一组可用的注册码
User name: 任意
Reg. Code: 1111-1111-1111-1142

六、注册信息保存在注册表中
[HKEY_USERS\.DEFAULT\Software\Digital Minds Software\AQUA3D\Aqua3D]
"UserName"="abcdef"
"RegCode"="1111-1111-1111-1142"

标 题:限制解除咯！可是鱼却越游越慢，不知道是我的机器的事还是，程序被毁！呵呵... (37字)
发信人:小球[CCG]
时 间:2001-4-12 23:33:05
详细信息:

404cc7 改jne 为je
你试试？呵呵......


asmstudio5.0

 标 题:asmstudio5.0完全完美破解版的诞生过程（和初学者共同学习！） (1千字)
发信人:hsf
时 间:2001-5-2 5:01:00
详细信息:
这是个比较容易破解的软件。许多人都这样说。我这里并不是要说如何暴破它，我不知道如何作注册机，所以呢，想投机取巧，利用他本身来获得注册码，当然这是在暴破的基础上。也就是说，把它改成一个注册机。呵呵呵，我想，这又是一种好的笨办法啦。
step1. 暴破
:bpx hmemcpy
ctrl+N
press "OK"
bd
pmodule
F12 两次，走到415a22　有cmp ecx,[exa+08]
紧接着下一句是跳转语句。跳则over,不跳则OK!
不让它跳，当然是将这条语句改为909090909090了。暴破完毕！
当然，你把cmp 改成mov 也行，而且更简单。不让他比较，而是
让他把正确的注册码赋值给ecx,呵呵呵。
＝＝＝＝＝＝＝＝
可是这样有个后遗症，因为它会将不正确的注册码写入注册表，
在重新运行软件时，一检查，是错的，又会把它变成未注册的试用版。怎么办？？？
step 2 作注册机
既然这样，让它把正确的注册码写入注册表就行了。
刚才不是有6个字节都是nop指令吗？太浪费了，让他作点有益的事情吧经过跟踪，发现后面有一条语句为mov edx,[esp+01f0]
此句和前面ecx的赋值语句（mov ecx,[esi+01f0]）相似，而这里面
（esi+01f0)放的就是我们输入的错误的注册码，只不过是16进制的而已。那好，我们把这个单元放入正确的注册码。
把909090909090改为898EF0010000就可以了。
实践是检验真理的唯一标准。试试看，重新运行软件后，它仍是
正式版！而且你不放心的话，可以用regedit打开注册表来看，是不
是多了一个regcode的键名？键值就是真正的注册码啦。
这样，一个自动注册的“注册机”就诞生了！
OK！大功告成，打个Kiss!
By The Way,有人可能会问，你怎么知道机器码要改成898EF001000000？
试嘛。　先用
:a 0167:415a28
0167:415a28 mov [esi+01f0],ecx
此时代码区肯定不是象上面的语句一样，而是
mov [esi+DOSMSG_BackFill_Allowed],ecx
用
:d 0167:415a28 可以看到此条语句的代码为898e00000000
不合要求。怎么办？在代码区不能实现，就直接在内存数据区改嘛
把鼠标移到内存数据区，把898e后面两个字节改为0f10就行了。
碰到不知道语句的代码是什么时，都可以用这个方法来试一下。
呵呵呵，这又是一种好的笨办法啦。



ASP2DLL V3.3.14

标 题:crackASP2DLL (7千字)
发信人:peterchen
时 间:2001-4-16 0:56:15
详细信息:
软件名称: ASP2DLL V3.3.14
软件设计：XDE, Inc.
软件主页：http://xde.net/products/download2.asp
联系邮件：
更新时间：2001-04-13
授权方式：共享软件
操作系统：Windows 95/98/NT
试用限制：30天
购买金额：＄250.00
软件大小：3238KB
星级评定：★★★★★
软件简介：ASP2DLL 能将 ASP 程序转化成 VB 5.0 或 VB 6.0 原代码，从而使您的 Web 应用程序可以被编辑成 ActiveX DLL。
本地下载：http://www.downme.com/download/8838Setup_ASP2DLL.exe
外地下载：http://xde.net/distrib/Setup_ASP2DLL.exe
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
昨天答应了FCG合伙人，Cyrix686（他是建网站主力，哈哈所以网页设计他一个包办）
他要我破解这个工具刚好今天有空就看一看想不到这么变态总算暴破解完了！
小球试一试，追出密码与其它计算过程让别人写出注册机行吗？
作者：PeterChen
这个工具是用vb5编写的，密码太怪了想追密码也不好看出来！
最后想一想就算追出密码也不好输入，所以就决定暴力破解它算了！
多么变态的注册码？
以下是试用注册码：
-----------------------------------------------------------------------
* Possible StringData Ref from Code Obj ->"88x3p5BeabcdfghijklmnoqrstuvwyzACDEFGHIJKLMNOP"
->"QRSTUVWXYZ 1246790-.#/\!@$<>&*()[]{}';:,?=+~`^"
->"|%_" ------------->注册码的样本！
|
:00404E9B BA58314000 mov edx, 00403158

d|5S53|?mJ_:3|oi(p|~a+e'?ljRU//--------->看到没有试用注册码就是这样，要破解注册码
就麻烦了？

windows/xde.lic
-----------------------------------------------------------------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E177A(U)
|
:004E1786 0FBF8DACFEFFFF movsx ecx, word ptr [ebp+FFFFFEAC]
:004E178D 85C9 test ecx, ecx
:004E178F 0F8511020000 jne 004E19A6//----------->je (000e178fh)
:004E1795 C745FC0A000000 mov [ebp-04], 0000000A
:004E179C C78538FFFFFF04000280 mov dword ptr [ebp+FFFFFF38], 80020004
:004E17A6 C78530FFFFFF0A000000 mov dword ptr [ebp+FFFFFF30], 0000000A
:004E17B0 C78548FFFFFF04000280 mov dword ptr [ebp+FFFFFF48], 80020004
:004E17BA C78540FFFFFF0A000000 mov dword ptr [ebp+FFFFFF40], 0000000A
:004E17C4 C78558FFFFFF04000280 mov dword ptr [ebp+FFFFFF58], 80020004
:004E17CE C78550FFFFFF0A000000 mov dword ptr [ebp+FFFFFF50], 0000000A

* Possible StringData Ref from Code Obj ->"PPlease save your temporary registration "
->"code, then restart ASP2DLL"
|
:004E17D8 C785F8FEFFFF6C964200 mov dword ptr [ebp+FFFFFEF8], 0042966C
:004E17E2 C785F0FEFFFF08000000 mov dword ptr [ebp+FFFFFEF0], 00000008
:004E17EC 8D95F0FEFFFF lea edx, dword ptr [ebp+FFFFFEF0]
:004E17F2 8D8D60FFFFFF lea ecx, dword ptr [ebp+FFFFFF60]
--------------------------------------------------------------------------
* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:004E17F8 FF154C134000 Call dword ptr [0040134C]

:00460668 6683BDD0FDFFFF00 cmp word ptr [ebp+FFFFFDD0], 0000
:00460670 0F85A5000000 jne 0046071B----->je (00060670h)
:00460676 B90A000000 mov ecx, 0000000A
:0046067B B804000280 mov eax, 80020004
:00460680 898D44FFFFFF mov dword ptr [ebp+FFFFFF44], ecx
:00460686 898D54FFFFFF mov dword ptr [ebp+FFFFFF54], ecx
:0046068C 898D64FFFFFF mov dword ptr [ebp+FFFFFF64], ecx
:00460692 8D9534FEFFFF lea edx, dword ptr [ebp+FFFFFE34]
:00460698 8D8D74FFFFFF lea ecx, dword ptr [ebp+FFFFFF74]
:0046069E 89854CFFFFFF mov dword ptr [ebp+FFFFFF4C], eax
:004606A4 89855CFFFFFF mov dword ptr [ebp+FFFFFF5C], eax
:004606AA 89856CFFFFFF mov dword ptr [ebp+FFFFFF6C], eax

* Possible StringData Ref from Code Obj ->"RRegistration Error"
|
:004606B0 C7853CFEFFFF04BC4100 mov dword ptr [ebp+FFFFFE3C], 0041BC04
:004606BA C78534FEFFFF08000000 mov dword ptr [ebp+FFFFFE34], 00000008

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:004606C4 FF154C134000 Call dword ptr [0040134C]
:004606CA 8D8D44FFFFFF lea ecx, dword ptr [ebp+FFFFFF44]
:004606D0 51 push ecx
:004606D1 8D9554FFFFFF lea edx, dword ptr [ebp+FFFFFF54]
:004606D7 52 push edx
:004606D8 8D8564FFFFFF lea eax, dword ptr [ebp+FFFFFF64]
:004606DE 50 push eax
:004606DF 6A00 push 00000000
:004606E1 8D8D74FFFFFF lea ecx, dword ptr [ebp+FFFFFF74]
:004606E7 51 push ecx

* Reference To: MSVBVM60.rtcMsgBox, Ord:0253h
|
:004606E8 FF1504114000 Call dword ptr [00401104]
--------------------------------------------------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00460A56(U)
|
:00460AE8 66833D54E04E0000 cmp word ptr [004EE054], 0000
:00460AF0 0F85C4000000 jne 00460BBA------>je (00060af0h)
:00460AF6 B904000280 mov ecx, 80020004
:00460AFB B80A000000 mov eax, 0000000A
:00460B00 898D4CFFFFFF mov dword ptr [ebp+FFFFFF4C], ecx
:00460B06 898D5CFFFFFF mov dword ptr [ebp+FFFFFF5C], ecx
:00460B0C 898D6CFFFFFF mov dword ptr [ebp+FFFFFF6C], ecx
:00460B12 8D9534FEFFFF lea edx, dword ptr [ebp+FFFFFE34]
:00460B18 8D8D74FFFFFF lea ecx, dword ptr [ebp+FFFFFF74]
:00460B1E 898544FFFFFF mov dword ptr [ebp+FFFFFF44], eax
:00460B24 898554FFFFFF mov dword ptr [ebp+FFFFFF54], eax
:00460B2A 898564FFFFFF mov dword ptr [ebp+FFFFFF64], eax

* Possible StringData Ref from Code Obj ->"YYou have run out of class conversion "
->"credits"
|
:00460B30 C7853CFEFFFF7CBC4100 mov dword ptr [ebp+FFFFFE3C], 0041BC7C
:00460B3A C78534FEFFFF08000000 mov dword ptr [ebp+FFFFFE34], 00000008

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:00460B44 FF154C134000 Call dword ptr [0040134C]
---------------------------------------------------------------------------------
总结：seach:0F8511020000------>84 or offset 000e178fh
^^
0F85A5000000------>84 00060670h
^^

0F85C4000000------>84 00060af0h
^^
还要找查出xde.lic,删除它！
它在win98，是windows目录，如果是win2000,就是winnt目录中！
最好有windows的查找功能，找到删除就行了！
xde.lic是放密码的文件！
---------------------------------------------------------------------------------
如果只想破解它的密码，我把要注册两个主要文件上载了！
ASP2DLL.exe主程序用来测试是否注册？
XDERegister.exe密码成器，就是在这里破解出密码了，本身有两个条件限制试用注册码。
到http://freecracker.myetang.com/
站点镜像
longcity.net
还有其它破解文件与教程！
去下载吧？看有啊位大客能破解它的密码，或者写注册机？
---------------------------------------------------------------------------------


Audio Companion 1.14

标 题:Audio Companion 1.14 (3千字)
发信人:d16
时 间:2001-2-23 13:13:56
详细信息:
目标软件:Audio Companion 1.14
软件作用:主要用来抓CD音轨并制为MP3、WAV等格式，也可以播放CD,不注册时只能抓CD上的前两首
破解工具:TRW2000、Ultra Edit 8
过程：
在Enter Password:对话框胡乱填敲几个字符，设断点：bpx hmemcpy后点OK，被中断，清断点后PMODULE来到程序领空(或按9~10下F12)，直接来到这里：

:00404CD8 E873FDFFFF call 00404A50
:00404CDD 85C0 test eax, eax
:00404CDF 7456 je 00404D37 ;跳了就出现"Not a valid password!"对话框
************************************************************************************************ :00404A50 83EC50 sub esp, 00000050 ;所以在call 00404A50按F8进去
...... ;一直F10走到这里

:00404ABD E86E0C0000 call 00405730 ;调用00405730
:00404AC2 85C0 test eax, eax
:00404AC4 741E je 00404AE4 ;不跳的话继续
:00404AC6 8D4C2400 lea ecx, dword ptr [esp]
:00404ACA 6824114400 push 00441124
:00404ACF 51 push ecx
:00404AD0 B9E80B4400 mov ecx, 00440BE8
:00404AD5 E8560C0000 call 00405730 ;又调用00405730
:00404ADA 85C0 test eax, eax
:00404ADC 7406 je 00404AE4 ;不跳的话就return，所以看看00404AE4
:00404ADE 33C0 xor eax, eax
:00404AE0 83C450 add esp, 00000050
:00404AE3 C3 ret
************************************************************************************************
:00404AE4 8B1564114400 mov edx, dword ptr [00441164]
...... ;按数次F10
:00404B02 E8290C0000 call 00405730
:00404B07 85C0 test eax, eax
:00404B09 741E je 00404B29
:00404B0B 8D442400 lea eax, dword ptr [esp]
:00404B0F 6824114400 push 00441124
:00404B14 50 push eax
:00404B15 B9E80B4400 mov ecx, 00440BE8
:00404B1A E8110C0000 call 00405730
:00404B1F 85C0 test eax, eax
:00404B21 7406 je 00404B29
:00404B23 33C0 xor eax, eax
:00404B25 83C450 add esp, 00000050 ;和上面代码完全一样，还调用00405730，不
:00404B28 C3 ret ;跳的话就RETURN，再到00404B29去看看
************************************************************************************************
;还是一样的代码，不跳就RETURN，再跳两次来到下面：
:00404BB3 A164114400 mov eax, dword ptr [00441164]
:00404BB8 0C08 or al, 08
:00404BBA A364114400 mov dword ptr [00441164], eax
:00404BBF B801000000 mov eax, 00000001 ;eax置1
:00404BC4 83C450 add esp, 00000050
:00404BC7 C3 ret ;看来应从这里返回就可以注册成功.

解决方法:
1.把E873FDFFFF(call 00404A50)改为B801000000(mov eax, 00000001)。
2.把E873FDFFFF85C07456改为E873FDFFFF85C07556,就是je变jne。
3.把几个相似模块里第一次调用00405730后面的74(je)改为75(jne)。

注：
1.前两种解决方法很方便，但不彻底：输入password后显示"Thanks for registering!"并可完全使用，但下一次启动就又成了未注册版。第三种方法虽麻烦些，但没有上面的问题。为什么？极盼赐答。
2.关于那个反复被CALL的00405730，我进去看过，因为能力有限，未能有所斩获。但我认为password一定可以从那里得到，而且我认为我的解决方法不太高明，均请各位高手补充，多谢。
3.这个软件的破解十分容易，结构简单，像我这样的菜鸟都能搞定。且体积不大——190K，新手一定要试试。
URL:http://www.yes2.net/down/audiocom.zip

标 题:搞定！ (2千字)
发信人:THK
时 间:2001-2-23 19:38:05
详细信息:

ok!
我来讲讲！
016F:00404A50 SUB ESP,BYTE +50
016F:00404A53 CALL 004048B0
016F:00404A58 PUSH EAX <--------- ? eax 注意到吗？
016F:00404A59 LEA EAX,[ESP+34]
016F:00404A5D PUSH EAX
016F:00404A5E MOV ECX,00440BE8
016F:00404A63 CALL 00405770
016F:00404A68 LEA ECX,[ESP+30]
016F:00404A6C PUSH ECX
016F:00404A6D CALL 00404A10
016F:00404A72 ADD ESP,BYTE +04
016F:00404A75 LEA EDX,[ESP+18]
016F:00404A79 MOV ECX,00440BE8
016F:00404A7E PUSH EDX
016F:00404A7F CALL 004059D0
016F:00404A84 PUSH EAX
016F:00404A85 MOV ECX,00440BE8
016F:00404A8A CALL 00405C10
016F:00404A8F LEA ECX,[ESP+00]
016F:00404A93 PUSH BYTE +10
016F:00404A95 PUSH ECX
016F:00404A96 PUSH EAX
016F:00404A97 CALL 00424CC7
016F:00404A9C ADD ESP,BYTE +0C
016F:00404A9F LEA EDX,[ESP+00]
016F:00404AA3 MOV ECX,00440BE8
016F:00404AA8 PUSH EDX
016F:00404AA9 CALL 00405990
016F:00404AAE LEA EAX,[ESP+30] <-------? eax 正确的password
016F:00404AB2 PUSH DWORD 00441124 <-----? 441124 你输入的
016F:00404AB7 PUSH EAX
016F:00404AB8 MOV ECX,00440BE8
016F:00404ABD CALL 00405730 开始比较
016F:00404AC2 TEST EAX,EAX
--------------------------------------------------------------
016F:00405730 MOV EAX,[ESP+04]
016F:00405734 PUSH ESI
016F:00405735 XOR ESI,ESI
016F:00405737 MOV CL,[EAX] <------ 取一位到cl
016F:00405739 PUSH EDI
016F:0040573A MOV EDI,[ESP+10]
016F:0040573E TEST CL,CL <-------测试
016F:00405740 JZ 00405754
016F:00405742 MOV EDX,EDI
016F:00405744 SUB EDX,EAX
016F:00405746 CMP CL,[EDX+EAX] <------比较
016F:00405749 JNZ 00405763
016F:0040574B MOV CL,[EAX+01]
016F:0040574E INC ESI <--------
016F:0040574F INC EAX <--------计数器
016F:00405750 TEST CL,CL
016F:00405752 JNZ 00405746
016F:00405754 MOV CL,[ESI+EDI]
016F:00405757 XOR EAX,EAX
016F:00405759 TEST CL,CL
016F:0040575B POP EDI
016F:0040575C POP ESI
016F:0040575D SETNZ AL <-----------标志位

password:Bn9-pW-56z-aa
我们都在成长！

THK


Audio Companion v1.11

标 题:tKC破解教程#113（第一部分）中文译文 (2千字)
发信人:风飘雪
时 间:2001-2-22 16:25:21
详细信息:
tKC破解教程#113（第一部分）中文译文

翻译 风飘雪

工具
=====
SoftICE v4.05
W32Dasm v8.93
Hacker's View v6.55
SmartCheck v6.03
ProcDump32 v1.6.2
TRW2000 v1.22
IDA v4.04
Windows Commander v4.51
Delphi, VB, C++或TASM （编注册机，打补丁）

你可以在以下站点得到它们
http://protools.cjb.net
http://w3.to/protools
http://www.crackstore.com

Part 1
=====

Audio Companion v1.11

作者 : Roni Music, Malmoe-Sweden
公司 : Roni Music
主页 : http://www.ronimusic.com
URL : http://www.ronimusic.com/audiocom.htm
大小 : 2000KB

用 SoftIce得到有效的注册码

说明: 注册时, 需要提供你的用户ID，你可在软件窗口顶部看到它。如果没看到，请
下载软件的最新版本。购买后，你会获得一个基于你用户ID的注册码，成为合法用户。
本教程中我的用户ID=2DEAD6E2

1. 运行AUDIOCOM.EXE, 点击 HELP/PASSWORD子菜单，在注册对话框输入
以下信息:

Password : 73881050PSWD

这时不要点OK按扭

2. 按 [ CTRL + D ]激活SoftIce, 设置断点如下:

bpx GetDlgItemTextA

按X 或F5 返回主程序

3. 现在按下 OK 键... 你又回到SoftIce!
在 SoftIce 按F11, F5, 按F11 直到如下代码段 :

______________________________________________________________

015F:00404C62 FF15E0624200 CALL [USER32!GetDlgItemTextA]
015F:00404C68 E873FDFFFF CALL 004049E0 <== 中断于此
015F:00404C6D 85C0 TEST EAX,EAX
015F:00404C6F 7456 JZ 00404CC7 ==> ***
...
...
015F:00404CC4 C21000 RET 0010
015F:00404CC7 8D442404 LEA EAX,[ESP+04] <== ***
015F:00404CCB 68880B4300 PUSH 00430B88
015F:00404CD0 50 PUSH EAX
015F:00404CD1 B9784E4400 MOV ECX,00444E78
015F:00404CD6 E8250A0000 CALL 00405700
015F:00404CDB 8D4C2404 LEA ECX,[ESP+04]
015F:00404CDF 51 PUSH ECX
015F:00404CE0 E88BFCFFFF CALL 00404970
015F:00404CE5 83C404 ADD ESP,04 ===> d eax
015F:00404CE8 8D542404 LEA EDX,[ESP+04]

_____________________AUDIOCOM!.text+3C61___________________

下断 BPX 015F:00404C62
按 F10 八次 - 停在015F:00404CE5 -看 EAX的值
:

: d eax ==> 你看到119AD111，保存地址 0167:0067F640
把它记下来，有可能就是注册码
再下面两行可看到你的程序ID.

4. 打入以下命令清除所有断点
BD *
按F5或 X 返回主程序。

5. 重复注册过程，键入119AD111作为你的注册码，点
OK ..... 哈哈! 屏幕闪出 " thank you .... " .

6. 注册码究竟藏在哪儿呢？
注册信息保存在AUDIOCOM.INI中，见下

[Init]
Always on Top=0
Window Xpos=10
Window Ypos=10
Password=119AD111
Screen=0
Used Before=1

标 题:Audiocom 1.13版破解 (1千字)
发信人:风飘雪
时 间:2001-2-23 10:46:11
详细信息:

重要更正（Audiocom 1.13版破解）

tKC破解教程113 part1不知为何人所写，我从破解文库下的
照原文翻译帖了上去。
下软件自己一试，他的破解完全不对。
我的是Audiocom 1.13版

0167:00404C82 CALL `USER32!GetDlgItemTextA`
0167:00404C88 CALL 00404A00 ==》关键比较，F8跟进
0167:00404C8D TEST EAX,EAX
0167:00404C8F JZ 00404CE7 出错，跳

0167:00404A0D PUSH EAX
0167:00404A0E MOV ECX,0043FA98
0167:00404A13 CALL 00405720
0167:00404A18 LEA ECX,[ESP+30]
0167:00404A1C PUSH ECX
0167:00404A1D CALL 004049C0
0167:00404A22 ADD ESP,BYTE +04
0167:00404A25 LEA EDX,[ESP+18]
0167:00404A29 MOV ECX,0043FA98
0167:00404A2E PUSH EDX
0167:00404A2F CALL 00405980
0167:00404A34 PUSH EAX
0167:00404A35 MOV ECX,0043FA98
0167:00404A3A CALL 00405BC0
0167:00404A3F LEA ECX,[ESP+00]
0167:00404A43 PUSH BYTE +10
0167:00404A45 PUSH ECX
0167:00404A46 PUSH EAX
0167:00404A47 CALL 00424857
0167:00404A4C ADD ESP,BYTE +0C ==》d eax
0167:00404A4F LEA EDX,[ESP+00]
404a4c处d eax
看上面的窗口，第二行，你的ID号
第四行，注册码
Bn9-pW-56z-aa
注册信息保存在AUDIOCOM.INI中


Audio Companion Ver1.13

标 题:用SOFTICE破解Audio Companion Ver1.13手记 (4千字)
发信人:pcrocker
时 间:2001-2-7 22:31:33
详细信息:
用SOFTICE破解Audio Companion Ver1.13（转载请保持完整）
作者：Pcrocker

文件大小：189KB
软件授权：共享软件
使用平台：Win95/98

软件简介：
抓CD音轨，WAV到CD，CD到WAV，通过卡录音。下面是E文简介：
This program consists of three parts: one to read from the computer's CD-ROM unit digitally (CD Ripper), a wav to MP3/WMA encoder, a MP3 to wav decoder and a maximizer (Batch Processor) and a sound recorder allowing you to record music via your computer's sound card (Audio Splitter).

http://software.wx88.net/down/audiocom.zip (从新浪当的)

安装后，运行，出现干扰信息，让你注册。它根据你的机器算出一个ID（可能与硬件有关），我这里是9C8FDCD8。在菜单中有一项是password（也就是Serial Number）。随便填，出现注册失败的提示，可气的是接着还跟出记事本，而且在程序结束时记事本还出现，可恶！！！
注意，本软件在未注册版本会有一定的使用限制。
好了，不多说了。下面搬出S-ICE，运行程序，在PASSWORD中填入：67676767；
^D到S-ICE，下bpx hmemcpy；
^D再回来，按OK，到S-ICE，下bd *；
按F12数次，到Audio Companion，代码如下：

:00404C6E 8BB424CC000000 mov esi, dword ptr [esp+000000CC]
:00404C75 6A1E push 0000001E
:00404C77 68D4FF4300 push 0043FFD4

* Possible Reference to Dialog: PASSWORDDIALOG, CONTROL_ID:041A, ""
|
:00404C7C 681A040000 push 0000041A
:00404C81 56 push esi

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:00404C82 FF15E4524200 Call dword ptr [004252E4] ;<---- F12会返回在这里
:00404C88 E873FDFFFF call 00404A00 ;<---- 判断password的call，不正确时eax=0
:00404C8D 85C0 test eax, eax ;<---- 跳下去就完了，提示注册失败
:00404C8F 7456 je 00404CE7
:00404C91 8D442404 lea eax, dword ptr [esp+04]

* Possible StringData Ref from Data Obj ->"Uibolt~gps~sfhjtufsjoh!"
|
:00404C95 68A4BB4200 push 0042BBA4

追进 call 00404a00，向前走不远就发现一个 Call 后面跟的是 test eax,eax， 有点可疑。果然。。。。

* Referenced by a CALL at Addresses:
|:004012C0 , :00404C88 , :00404D7C , :0040A5CA , :0040B24B
|:00411674
|
:00404A00 83EC50 sub esp, 00000050
:00404A03 E858FEFFFF call 00404860
:00404A08 50 push eax
:00404A09 8D442434 lea eax, dword ptr [esp+34]
:00404A0D 50 push eax
:00404A0E B998FA4300 mov ecx, 0043FA98
:00404A13 E8080D0000 call 00405720
:00404A18 8D4C2430 lea ecx, dword ptr [esp+30]
:00404A1C 51 push ecx
:00404A1D E89EFFFFFF call 004049C0
:00404A22 83C404 add esp, 00000004
:00404A25 8D542418 lea edx, dword ptr [esp+18]
:00404A29 B998FA4300 mov ecx, 0043FA98
:00404A2E 52 push edx
:00404A2F E84C0F0000 call 00405980
:00404A34 50 push eax
:00404A35 B998FA4300 mov ecx, 0043FA98
:00404A3A E881110000 call 00405BC0
:00404A3F 8D4C2400 lea ecx, dword ptr [esp]
:00404A43 6A10 push 00000010
:00404A45 51 push ecx
:00404A46 50 push eax
:00404A47 E80BFE0100 call 00424857
:00404A4C 83C40C add esp, 0000000C
:00404A4F 8D542400 lea edx, dword ptr [esp]
:00404A53 B998FA4300 mov ecx, 0043FA98
:00404A58 52 push edx
:00404A59 E8E20E0000 call 00405940
:00404A5E 8D442430 lea eax, dword ptr [esp+30] ;<---- 在这里 d eax，看到的就是程序算出的password，赶快记下来：Bn9-pW-56z-aa
:00404A62 68D4FF4300 push 0043FFD4 ;<---- 在这里 d 43ffd4，是输入的内容：67676767
:00404A67 50 push eax
:00404A68 B998FA4300 mov ecx, 0043FA98
:00404A6D E86E0C0000 call 004056E0 ;<---- 进行比较
:00404A72 85C0 test eax, eax ;<---- password正确时，eax=1
:00404A74 741E je 00404A94 ;<---- 不正确时，eax=0，跳到下面去继续比较，不重要了
:00404A76 8D4C2400 lea ecx, dword ptr [esp]
:00404A7A 68D4FF4300 push 0043FFD4
:00404A7F 51 push ecx
:00404A80 B998FA4300 mov ecx, 0043FA98
:00404A85 E8560C0000 call 004056E0
:00404A8A 85C0 test eax, eax
:00404A8C 7406 je 00404A94
:00404A8E 33C0 xor eax, eax
:00404A90 83C450 add esp, 00000050
:00404A93 C3 ret

返回程序中，仍提示注册失败，该死的记事本又出来了，不管它。重新输入password：Bn9-pW-56z-aa，出现感谢注册的消息框，Yeah！又搞定了一个，经验值+1。^_^
共耗时10（写这个攻略却至少有30分钟，呵呵），给大家的元宵节礼物。

完成时间：2001/02/07 22：00


Award BIOS密码

 标　题　：浅析Award BIOS密码的破解(910字)
作　者　：yuky
时　间　： 2000.11.20 17:22
详细信息：
Award BIOS版本有很多，有些有通用密码，但加密算法几乎没变，C语言算法描述
为：

int code(char str[8])
{
short i=0,ren;
int bin;
bin=str[i++];
while(str[i])
{
bin=bin<<2;
ren=str[i++];
bin+=ren;
}
return bin;
}

是将输入的字符左移两位加下一个字符，直到最后扩充到一个字，Superior
Password存放在BIOS的0x1c或0x3a处,User Password存放到0x63处，不同的版本可
能会不同。从加密算法看是有损加密，无法从密文反推得出密码，我用了一种方法。
还有很多其他的方法，比如穷举法，也很容易，可以分别在数字、小写字母、大写字
母范围中穷举。

我的方法是（不要看我，我可想不出来）：密码长不超过8位，通过近位循环左移两
位，可表示为4a-164k+k，其中a为密码，k=0-3,用数学式表示为：(...((4a7-
65535k7+a6)4-65535k6+a5)...)4-65535k1+a0=w其中ai 为密码，ki=0-3,w为密
字,考虑到前5位密码的循环左移等于算术左移，即k7..k4=0，所以又可简化为：
47a7+46a6+...+a0=w+65535(42k3+4k2+k1)
式中42k3+4k2+k1,记为k，则k只有0-41共42个可能取值，要破密码，无非是求ai在
32-126之间的整数解，下面给出我的程序：

unsigned char *crack(char f)
{
char i=0,j=0,k=1;
unsigned int p,s=0,a=1,t;
unsigned char *b;
p=getpass1(f); 取出密字
do
{
s+=a;
t=floor(p/s);
i++;
a*=4;
}
while(t<32||t>126);
b=malloc((unsigned char*)i);
b[0]=t;
for(i=i-1;i>0;i--)
{
p-=b[j++]*pow(4,i);
s-=pow(4,i);
b[k++]=floor(p/s);
}
b[k]=0;
return(b);b即为密码
}

整个过程就是这样，如果有错请告诉我。详细的程序可到晓光之家下载。
还有程序只有在进入操作系统后才能运行，如果密码设的是System方式，则进不到系
统，只好放电了:(..

我有一个想法，就是制作一个模拟键盘的装置（可控制键盘也行），可以向键盘接口
（串口、PS/2)发送ASCII码，只要编一个小程序，让它不断的发送数字和回车，用穷
举法击破它，可破解System的密码。据我所知，用硬件破密码的还不多，现在我正在
学习单片机，鄙人才疏学浅，不知能否做到，哪位有高招不妨交流一下。

2000.11.20 于太原

源程序：

#include <math.h>
#include <conio.h>
#define ON 0
#define OFF 1
void change(unsigned char x,unsigned char y)
{
outportb(0x70,x);
outportb(0x71,y);
}
unsigned int sum()
{
int i;
unsigned int s=0;
for(i=0x10;i<=0x2d;i++)
{
outportb(0x70,i);
s+=inportb(0x71);
}
return(s);
}
void chsum()
{
unsigned int s;
s=sum();
change(0x2e,s>>8);
change(0x2f,s<<8>>8);
}
void clear()
{
unsigned char a;
outportb(0x70,0x11);
a=inportb(0x71)-0xc0;
change(0x11,0xc0);
chsum();
outportb(0x70,0x62);
if(inportb(0x71)==0xff)
{
outportb(0x71,0xff-a);
outportb(0x70,0x7b);
a=inportb(0x71)-a;
change(0x7b,a);
}
}
void display()
{
int i,j=0;
printf("Your Bios Mem at 0x10--0x7f:\n");
for(i=0x10;i<=0x7f;i++)
{
outportb(0x70,i);
printf("%4x",inportb(0x71));
j++;
if(j%16==0) printf("\n");
}
}
int code(char str[8])
{short i=0,ren;
int bin;
bin=str[i++];
while(str[i])
{
bin=bin<<2;
ren=str[i++];
bin+=ren;
}
return bin;
}
void chpass(char str[8])
{
change(0x1c,code(str)%0x100);
change(0x1d,code(str)/0x100);
chsum();
}
unsigned int getpass1(char i)
{
unsigned int a,b,p;
unsigned char x;
if(i==0) x=0x1c;
if(i==1) x=0x63;
outportb(0x70,x);
a=inportb(0x71);
outportb(0x70,x+1);
b=inportb(0x71);
p=(b<<8)+a;
return(p);
}

unsigned char *crack(char f)
{
char i=0,j=0,k=1;
unsigned int p,s=0,a=1,t;
unsigned char *b;
p=getpass1(f);
do
{
s+=a;
t=floor(p/s);
i++;
a*=4;
}
while(t<32||t>126);
b[0]=t;
for(i=i-1;i>0;i--)
{
p-=b[j++]*pow(4,i);
s-=pow(4,i);
b[k++]=floor(p/s);
}
b[k]=0;
return(b);
}
main()
{
unsigned char *p;
clrscr();
textmode(3);
printf("Award Bios Password Crack v2.0\nWritten By Yuky (Add:97091B2,NCIT)\n");
display();
p=crack(0);
printf("Your BIOS Superviosr Password:");
textcolor(RED+BLINK);
cprintf("%s\n",p);
printf("\n");
printf("Your BIOS User Password:");
textcolor(GREEN+BLINK);
cprintf("%s",crack(1));
}


BabyGame v2.10

 标 题:BabyGame 破解方法及注册码表 (1千字)
发信人:crack123
时 间:2001-7-4 20:28:40
详细信息:
BabyGame 破解方法及注册码表
软件名称：BabyGame v2.10
保护方式：注册码、非注册时运行三次或累计运行
时间超过30分钟即弹出注册窗无法运行。

一、破解方法：
1、程序运行后检查其安装目录，发现多出两个文件
babygame.dpt和regfile,程序不能运行后删除这两个
文件既可再运行三次或累计运行时间30分钟。
2、以上做法仍没有彻底解决使用问题，还得使用TRW
跟踪看看，进入程序注册输入窗，输入crack123及
98989898后ctrl+N切换至TRW窗，下
s 30:0 l ffffffff '98989898'
找到两个地址，相应下bpm 地址 rw后
G返回程序，点击确定被TRW拦下，在
kernel32!comparestringa+0011处，
F12、F10数次返回程序上空后，F10继续跟踪。
经多次反复跟踪确定在程序行
7d0d jnz 0d7a (no jump)
改为 eb0d jmp 0d7a (jump)
程序即现实成功注册。

二、注册码表如下：
经跟踪程序计算注册码程序段，发现其采用查表法
（见下）。

使用方法：用户名不分大小写一一对应变换为->后的
字母或数字即为相应的注册码(字母必须大写）。现在
看来真是太简单了（尤其是数字和汉字只要换成对应
位数的A就成）。

例：crack123 ---->> MJ2MPAAA

a->2 b->G c->M d->N e->5 f->D
g->H h->1 i->T j->8 k->P l->W
m->3 n->Q o->C p->9 q->R r->J
s->L t->4 u->K v->B w->E x->6
y->F z->7 &->V
数字1～9、汉字及其他键盘可输入字符->A

另：用邻近内存查找法在错误注册码附近也可看到
同样长度的正确注册码，同时也能看到注册码表。

注册机连接：http://crack123.51.net/reg-babygame.exe

<crack123>

标 题:BabyGame 注册机源码(1千字)
发信人:crack123
时 间:2001-7-4 22:46:43
详细信息:

 不太清楚手动脱壳的要求，请解释一下!

BabyGame 注册机源码(太简单了，所以不好意思认为这样的就可以及格)：
BCB 5.0

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,l;
char j;
AnsiString name,code;
code="2GMN5DH1T8PW3QC9RJL4KBE6F7VA";  //注册码表
if (Edit1->Text=="" )
{
Edit1->SetFocus();
return;
}
name=Edit1->Text;  从用户名输入框中读取用户名字符串
l=Edit1->Text.Length();  计算用户名程度
for (i=1;i<=l;i++)      逐位转换用户名字符->注册码字符
{
j=name[i] ;
if ((j>='A')&(j<='Z'))
{
j=j-64;  是大写字母计算查表下标
j=code[j];
}
else if ((j>='a')&(j<='z'))
{
j=j-96;  是小写字母计算查表下标
j=code[j];
}
else if(j=='&')
    是"&"查表下标为27
j=code[27];
else
j=code[28];
      数字、汉字等其余字符
下标为28

Edit2->Text=Edit2->Text+
  j; 逐位在注册码
}

  框中显示注码
}
//------------------------------------------------------------


BananaSplitter 1.0

 标 题:BananaSplitter 1.0破解实战 (10千字)
发信人:garfield cat
时 间:2000-9-11 13:35:10
详细信息:
感谢大家解答了fstsw命令的作用,使我解了这个软件,为了感谢各位,特地送上!!!再次感谢大家的热心!
下载地址:ftp://www.newhua.com/bsplit10.zip 大小:450K
是个分割软件,具介绍应该比较好用,具体我没仔细用过,只是为了破解才下的!
我是个新手,进入CRACK的时间才刚好一个月.请高手多多批评,指教.

开工.前面一大堆的准备工作,我不多说了,直接切入正题:

:0047B4A7 E8848BF8FF call 00404030
:0047B4AC 83F807 cmp eax, 00000007 //长度是否为7位
:0047B4AF 7408 je 0047B4B9
:0047B4B1 C60601 mov byte ptr [esi], 01 //[ESI]为标志(00为注册,01为未注册)
:0047B4B4 E94C010000 jmp 0047B605 //SOFT作者言:"去死吧!!"

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B4AF(C)
|
:0047B4B9 8D45F4 lea eax, dword ptr [ebp-0C]
:0047B4BC 8B55FC mov edx, dword ptr [ebp-04]
:0047B4BF 8A12 mov dl, byte ptr [edx] //将密码第一位取出
:0047B4C1 E8928AF8FF call 00403F58 //将该位数COPY到[EBP-0C]中
:0047B4C6 8B45F4 mov eax, dword ptr [ebp-0C]
:0047B4C9 8BD7 mov edx, edi
:0047B4CB E8FC78F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B4D0 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B4D2 833F00 cmp dword ptr [edi], 00000000
:0047B4D5 7403 je 0047B4DA //必须跳,否则……
:0047B4D7 C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B4D5(C)
|
:0047B4DA 8BDA mov ebx, edx
:0047B4DC 03DB add ebx, ebx //将第一位的16进制乘2,放入EBX中
:0047B4DE 8D45F0 lea eax, dword ptr [ebp-10]
:0047B4E1 8B55FC mov edx, dword ptr [ebp-04]
:0047B4E4 8A5201 mov dl, byte ptr [edx+01] //取第二位
:0047B4E7 E86C8AF8FF call 00403F58 //将该位数COPY到[EBP-10]中
:0047B4EC 8B45F0 mov eax, dword ptr [ebp-10]
:0047B4EF 8BD7 mov edx, edi
:0047B4F1 E8D678F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B4F6 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B4F8 833F00 cmp dword ptr [edi], 00000000
:0047B4FB 7403 je 0047B500 ****
:0047B4FD C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B4FB(C)
|
:0047B500 03DA add ebx, edx //EBX再加第二位的16进制
:0047B502 8D45EC lea eax, dword ptr [ebp-14]
:0047B505 8B55FC mov edx, dword ptr [ebp-04]
:0047B508 8A5202 mov dl, byte ptr [edx+02] //取第三位
:0047B50B E8488AF8FF call 00403F58 //将该位数COPY到[EBP-14]中
:0047B510 8B45EC mov eax, dword ptr [ebp-14]
:0047B513 8BD7 mov edx, edi
:0047B515 E8B278F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B51A 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B51C 833F00 cmp dword ptr [edi], 00000000
:0047B51F 7403 je 0047B524 ****
:0047B521 C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B51F(C)
|
:0047B524 8BC2 mov eax, edx
:0047B526 03C0 add eax, eax //将第三位的16进制形式乘2
:0047B528 03D8 add ebx, eax //再加
:0047B52A 8D45E8 lea eax, dword ptr [ebp-18]
:0047B52D 8B55FC mov edx, dword ptr [ebp-04]
:0047B530 8A5203 mov dl, byte ptr [edx+03] //取第四位
:0047B533 E8208AF8FF call 00403F58 //将该位数COPY到[EBP-18]中
:0047B538 8B45E8 mov eax, dword ptr [ebp-18]
:0047B53B 8BD7 mov edx, edi
:0047B53D E88A78F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B542 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B544 833F00 cmp dword ptr [edi], 00000000
:0047B547 7403 je 0047B54C ****
:0047B549 C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B547(C)
|
:0047B54C 03DA add ebx, edx //再加
:0047B54E 8D45E4 lea eax, dword ptr [ebp-1C]
:0047B551 8B55FC mov edx, dword ptr [ebp-04]
:0047B554 8A5204 mov dl, byte ptr [edx+04] //取第五位
:0047B557 E8FC89F8FF call 00403F58 //将该位数COPY到[EBP-1C]中
:0047B55C 8B45E4 mov eax, dword ptr [ebp-1C]
:0047B55F 8BD7 mov edx, edi
:0047B561 E86678F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B566 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B568 833F00 cmp dword ptr [edi], 00000000
:0047B56B 7403 je 0047B570 ****
:0047B56D C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B56B(C)
|
:0047B570 8BC2 mov eax, edx
:0047B572 03C0 add eax, eax //第五位16进制乘2
:0047B574 03D8 add ebx, eax //再加
:0047B576 8D45E0 lea eax, dword ptr [ebp-20]
:0047B579 8B55FC mov edx, dword ptr [ebp-04]
:0047B57C 8A5205 mov dl, byte ptr [edx+05] //取第6位
:0047B57F E8D489F8FF call 00403F58 //将该位数COPY到[EBP-20]中
:0047B584 8B45E0 mov eax, dword ptr [ebp-20]
:0047B587 8BD7 mov edx, edi
:0047B589 E83E78F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B58E 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B590 833F00 cmp dword ptr [edi], 00000000
:0047B593 7403 je 0047B598 ****
:0047B595 C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B593(C)
|
:0047B598 03DA add ebx, edx //再加
:0047B59A 895DDC mov dword ptr [ebp-24], ebx
:0047B59D DB45DC fild dword ptr [ebp-24] //装入ST0
:0047B5A0 D83540B64700 fdiv dword ptr [0047B640] //除0,相当于取十位上的数
:0047B5A6 E8ED75F8FF call 00402B98 //取出来变为16进制,放入EAX
:0047B5AB 03C0 add eax, eax //乘2
:0047B5AD 8D0480 lea eax, dword ptr [eax+4*eax] //乘5
:0047B5B0 2BD8 sub ebx, eax //再用EBX减
:0047B5B2 43 inc ebx //加1
:0047B5B3 8D45D8 lea eax, dword ptr [ebp-28]
:0047B5B6 8B55FC mov edx, dword ptr [ebp-04]
:0047B5B9 8A5206 mov dl, byte ptr [edx+06] //取第七位
:0047B5BC E89789F8FF call 00403F58 //将该位数COPY到[EBP-28]中
:0047B5C1 8B45D8 mov eax, dword ptr [ebp-28]
:0047B5C4 8BD7 mov edx, edi
:0047B5C6 E80178F8FF call 00402DCC //测试该位是否为数字(0 -9)并换成16进制
:0047B5CB 8BD0 mov edx, eax //EAX为该位的16进制形式
:0047B5CD 3BDA cmp ebx, edx //是否等于EBX
:0047B5CF 7403 je 0047B5D4
:0047B5D1 C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B5CF(C)
|
:0047B5D4 8BD7 mov edx, edi
:0047B5D6 8B45FC mov eax, dword ptr [ebp-04]
:0047B5D9 E8EE77F8FF call 00402DCC //将整个密码变为16进制
:0047B5DE 8BD0 mov edx, eax
:0047B5E0 8955DC mov dword ptr [ebp-24], edx \
:0047B5E3 DB45DC fild dword ptr [ebp-24] |
:0047B5E6 D81D44B64700 fcomp dword ptr [0047B644] |
:0047B5EC DFE0 fstsw ax //COPY状态寄存器到AX |=>密码是否大于1000000
:0047B5EE 9E sahf //COPY状态位到标志寄存器中 |
:0047B5EF 7211 jb 0047B602 //如小于就JUMP /
:0047B5F1 8955D4 mov dword ptr [ebp-2C], edx \
:0047B5F4 DB45D4 fild dword ptr [ebp-2C] |
:0047B5F7 D81D48B64700 fcomp dword ptr [0047B648] |
:0047B5FD DFE0 fstsw ax |=>密码是否小于等于3000000
:0047B5FF 9E sahf |
:0047B600 7603 jbe 0047B605 //如小于等于则JUMP /

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B5EF(C)
|
:0047B602 C60601 mov byte ptr [esi], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047B4B4(U), :0047B600(C)
|
:0047B605 33C0 xor eax, eax
:0047B607 5A pop edx
:0047B608 59 pop ecx
:0047B609 59 pop ecx
:0047B60A 648910 mov dword ptr fs:[eax], edx
:0047B60D 6837B64700 push 0047B637

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047B635(U)
|
:0047B612 8D45D8 lea eax, dword ptr [ebp-28]
:0047B615 E89687F8FF call 00403DB0
:0047B61A 8D45E0 lea eax, dword ptr [ebp-20]
:0047B61D BA06000000 mov edx, 00000006
:0047B622 E8AD87F8FF call 00403DD4
:0047B627 8D45FC lea eax, dword ptr [ebp-04]
:0047B62A E88187F8FF call 00403DB0
:0047B62F C3 ret

注册后写入注册表：HKEY_USERS\.DEFAULT\Software\Teddyware\BananaSplitter
"RegName"="(可以随便填)"
"RegNum"="1288543" <===这个数是注册器算出来的

算法总结:假设输入密码为S(必须为7位,且全部为数字0-9) 注册时输入的NAME根本没用.
将密码S的每一位分别换为16进制数,分别为S1 S2 S3 S4 S5 S6 S7

S1*2+S2+S3*2+S4+S5*2+S6=A

[A-(取十进制形式A十位上的数)*10]+1=B

B是否等于S7

并且 1000000<S<3000000

注册器:注册码还真不少!

main()
{
int a,b,s1,s2,s3,s4,s5,s6,s7;
long i=1000000;
for(a=0,b=0;i<=3000000;i++)
{
s1=i/1000000;
s2=i/100000%10;
s3=i/10000%100%10;
s4=i/1000%1000%100%10;
s5=i/100%10000%1000%100%10;
s6=i/10%100000%10000%1000%100%10;
s7=i%10;
a=s1*2+s2+s3*2+s4+s5*2+s6;
b=a-a/10*10+1;
if(b==s7)
printf("\t%ld",i);
}
}

如有错误请指出，EMAIL:CL517@YEAH.NET
最后谢谢大家能够听我哆嗦完!

garfield cat


Banner Maker Professional 3.0.1.0

标 题:Banner Maker Professional 3.0.1.0 的破解 (2千字)
发信人:TAE!
时 间:2001-1-2 20:20:45
详细信息:
小弟是个初学者,以后还望各位大虾多多指点;)

Banner Maker Professional 3.0.1.0 的破解

介绍:一个简单易用的制作广告条的软件,
也可以看做一个简单的制图软件.
难度:非常简单,建议高手略过.

到程序的注册窗口,输入注册名,注册码
按 OK,什么!?注册码没反应,退出,再运行,还是未注册,&#$^@!#$&~ 看来程序似乎有 BUG 哦!呵呵 :)
让我来修理修理它;-)
切到 TRW 下,下断点 Bpx hmemcpy,回到注册窗口,按 OK
我们又回到了 TRW 下
按 N 多次F12后,

:00501588 E89F23F3FF call 0043392C
:0050158D 8B45F8 mov eax, dword ptr [ebp-08]<------我们来到了这里 EAX 是你输入的注册码(当然是假的咯 ;-)
:00501590 BAD8165000 mov edx, 005016D8 * 下 D 005016d8 后显示一串数据 3122545210621
:00501595 E8FE2AF0FF call 00404098 * 比较注册码的 CALL
:0050159A 0F85AB000000 jne 0050164B
:005015A0 A1145D5100 mov eax, dword ptr [00515D14]
:005015A5 C6800808000000 mov byte ptr [eax+00000808], 00
:005015AC B201 mov dl, 01
:005015AE A168B44500 mov eax, dword ptr [0045B468]
:005015B3 E8B09FF5FF call 0045B568
进入哪个CALL,来到了这儿:
:00404098 53 push ebx
:00404099 56 push esi
:0040409A 57 push edi
:0040409B 89C6 mov esi, eax
:0040409D 89D7 mov edi, edx
:0040409F 39D0 cmp eax, edx * 非常有趣哦,将 3122545210621 和你的注册名比较?
:004040A1 0F848F000000 je 00404136
:004040A7 85F6 test esi, esi
:004040A9 7468 je 00404113
:004040AB 85FF test edi, edi
:004040AD 746B je 0040411A
:004040AF 8B46FC mov eax, dword ptr [esi-04]
:004040B2 8B57FC mov edx, dword ptr [edi-04]
:004040B5 29D0 sub eax, edx
:004040B7 7702 ja 004040BB
:004040B9 01C2 add edx, eax
用3122545210621作注册码,成功!
后来发现,在注册名栏中输入任意字符,用3122545210621作注册码,全部成功!


BCWipe v2.34.2

标 题:猜数记---BCWIPE注册半破解 (25千字)
发信人:Fpc
时 间:2001-4-2 19:41:12
详细信息:
猜数记---BCWIPE注册半破解
作者：Fpc
目标：取得注册码

软件名称：BCWipe v2.34.2
主页：www.jetico.com
简介：外壳扩展程序，用于完全抹除磁盘上的敏感信息，使它人无法恢复（当然自己也不能，所以要小心呀。）

前几天贴过暴破注册的方法，但遇到有注册码输入而没追出，感觉实在是不舒服。今天又追了一次，没有完全成功，但已经可以注册了。‘猜数记’就来源于此，注册码是一点点试出来的，有点搞笑。
原因就在于，作者不是那么笨。BW先判断输入的注册码（Irc）格式是否正确，接下来将Irc中各字符变为32进制数，作变换与两个给定的字串比较，若不等则注册失败。

它的格式是“WP-####-####-####-####”，“#”可以是数字或字母。

首先给出一个有效的注册码“WP-1234-&*^%-81VH-7F21”，最后的8位是关键，中间的“&*^%”可以用别的符号和数字‘0’以及字母‘I’、‘O’的任意组合来代替。

在本破解中，先看注册码计算的核心部分：
《1》
这个CALL对Irc作变换处理，如果出口是Eax=1，则表示需进一步处理；若出口是Eax=0，则表示不需要可以直接验证Irc是否正确（这个很重要）。

* Referenced by a CALL at Address:
|:10012C95
|
:10012CC0 8B442408 mov eax, dword ptr [esp+08]
:10012CC4 53 push ebx
:10012CC5 8B5C2408 mov ebx, dword ptr [esp+08]
:10012CC9 56 push esi
:10012CCA 57 push edi
:10012CCB 33F6 xor esi, esi
:10012CCD 8D7810 lea edi, dword ptr [eax+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012CF5(C)
|
:10012CD0 8A4FFF mov cl, byte ptr [edi-01] <- 从Irc最后一位开始取一个字符
:10012CD3 4F dec edi
:10012CD4 51 push ecx <- 将这个字符压栈
:10012CD5 E8A6000000 call 10012D80 《2》 将它换成32进制数，返回值在Eax中
:10012CDA 83C404 add esp, 00000004
:10012CDD 83F8FF cmp eax, FFFFFFFF <- Eax=-1表示Irc中含有不在码表中的字符
:10012CE0 741E je 10012D00 <- 向下跳，准备返回。这个跳转在本破解中起到关键作用！！

:10012CE2 6A05 push 00000005
:10012CE4 50 push eax
:10012CE5 56 push esi
:10012CE6 53 push ebx
:10012CE7 E824000000 call 10012D10
:10012CEC 83C605 add esi, 00000005
:10012CEF 83C410 add esp, 00000010
:10012CF2 83FE50 cmp esi, 00000050
:10012CF5 7CD9 jl 10012CD0 <- 不到16次则继续
:10012CF7 5F pop edi
:10012CF8 5E pop esi

:10012CF9 B801000000 mov eax, 00000001 <- 表示Irc中的字符均可转换为32进制数
:10012CFE 5B pop ebx
:10012CFF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012CE0(C)
|
:10012D00 5F pop edi <- 遇到“不正常”字符时跳到这里
:10012D01 5E pop esi
:10012D02 33C0 xor eax, eax
:10012D04 5B pop ebx
:10012D05 C3 ret

《2》 这个CALL将调用前的最后一次压栈字符换算为32进制数，返回值在Eax中，注意32进制数从0开始；
若所查的字符不在其中则 Eax=-1。
例如：1->0，3->2，9->8，W->A，K->17，M->1F，&->-1，0->-1。

* Referenced by a CALL at Address:
|:10012CD5
|
:10012D80 8A0D5CC30210 mov cl, byte ptr [1002C35C]

这个地址是32进制数的码表（很重要）：
“12345678 9QWERTYU PASDFGHK LZXCVBNM” <- 注意其中没有0、I、O

:10012D86 33C0 xor eax, eax
:10012D88 84C9 test cl, cl
:10012D8A 7413 je 10012D9F
:10012D8C 8A542404 mov dl, byte ptr [esp+04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D9D(C)
|
:10012D90 3ACA cmp cl, dl
:10012D92 740E je 10012DA2
:10012D94 8A885DC30210 mov cl, byte ptr [eax+1002C35D]
:10012D9A 40 inc eax
:10012D9B 84C9 test cl, cl
:10012D9D 75F1 jne 10012D90

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D8A(C)
|
:10012D9F 83C8FF or eax, FFFFFFFF <- 如果字符不在其中则Eax=-1
<- 想不到这个也是有用的
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D92(C)
|
:10012DA2 C3 ret
:10012DA3 90 nop

《3》这个CALL编写的实在是精彩，其作用是将得到的32进制数作移位变换，存放于目标地址。

* Referenced by a CALL at Address:
|:10012CE7
|
:10012D10 8B442408 mov eax, dword ptr [esp+08]
:10012D14 53 push ebx
:10012D15 56 push esi
:10012D16 57 push edi
:10012D17 8BF8 mov edi, eax
:10012D19 81E707000080 and edi, 80000007 <- Edi值每次都在变，在下面用作移位的位数（很高明）
:10012D1F 7905 jns 10012D26 <- Edi=0、5、2、7、4、1、8.....

:10012D21 4F dec edi <-
:10012D22 83CFF8 or edi, FFFFFFF8 <- 这三个好象不会被执行到
:10012D25 47 inc edi <-

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D1F(C)
|
:10012D26 8B74241C mov esi, dword ptr [esp+1C]
:10012D2A 8B5C2410 mov ebx, dword ptr [esp+10] <- 取得目标地址，内容一开始时为空
:10012D2E 99 cdq

:10012D2F B908000000 mov ecx, 00000008
:10012D34 83E207 and edx, 00000007
:10012D37 2BCE sub ecx, esi
:10012D39 BEFF000000 mov esi, 000000FF
:10012D3E 03C2 add eax, edx
:10012D40 33D2 xor edx, edx
:10012D42 D3FE sar esi, cl
:10012D44 C1F803 sar eax, 03 <- 调整Eax的位置

Eax的改变方式是随着这个CALL的调用Eax=0、0、1、1、2、3、3、4、4、.......

:10012D47 03C3 add eax, ebx <- Eax指向目标地址

:10012D49 8BCF mov ecx, edi
:10012D4B 8A7001 mov dh, byte ptr [eax+01]
:10012D4E 8BDE mov ebx, esi
:10012D50 8A10 mov dl, byte ptr [eax]
:10012D52 D3E3 shl ebx, cl

:10012D54 8B4C2418 mov ecx, dword ptr [esp+18] <- 取得一个32进制数
:10012D58 23F1 and esi, ecx <- 相当于Esi=Ecx
:10012D5A 8BCF mov ecx, edi
:10012D5C D3E6 shl esi, cl <- Esi*2的N次方
:10012D5E F7D3 not ebx
:10012D60 23D3 and edx, ebx
:10012D62 5F pop edi
:10012D63 0BD6 or edx, esi <- 结果送Edx，注意它用Or的方式保留低位字节的值

:10012D65 5E pop esi
:10012D66 8BCA mov ecx, edx
:10012D68 5B pop ebx

:10012D69 8808 mov byte ptr [eax], cl
:10012D6B C1F908 sar ecx, 08
:10012D6E 884801 mov byte ptr [eax+01], cl
:10012D71 C3 ret

小结：综合《1》和《2》《3》，程序按从后到前的顺序取得Irc，换成32进制数，移位得到注册码1（Rc1）。
举例如下(可能有错误，只是表明计算过程是这样的)：
假设Irc：WP-1234-2345-4567-6789，则(以下为16进制)
9->8，8*1=8；
8->7，7*20=E0。 Rc1[0]=E0 OR 8=E8；
7->6，6*4=18；
6->5，5*80=280。 Rc1[1]=80 OR 18=98；Rc1[2]=2；
7->6，6*10=60。 Rc1[2]=60 OR 2=62；（注意这个位只计算一次）
6->5，5*2=A；
5->4，4*40=100。 Rc1[3]=00 OR A=A；Rc1[4]=1；
.........................
生成的Rc1：E8 98 62 0A 01

这个Rc1要与下面的字串作比较，因为我看不出算法，无法反推，只能用计算器来算（这个过程很麻烦）

====================================================================

* Referenced by a CALL at Addresses:
|:1000728A , :1000771C , :10007BD4
|
:10007620 83EC0C sub esp, 0000000C
:10007623 8B0D00420310 mov ecx, dword ptr [10034200]
:10007629 8B542410 mov edx, dword ptr [esp+10]
:1000762D 33C0 xor eax, eax
:1000762F 53 push ebx
:10007630 89442404 mov dword ptr [esp+04], eax
:10007634 56 push esi
:10007635 8944240C mov dword ptr [esp+0C], eax
:10007639 51 push ecx
:1000763A 6689442414 mov word ptr [esp+14], ax
:1000763F 68CC410310 push 100341CC
:10007644 8D442410 lea eax, dword ptr [esp+10]
:10007648 52 push edx
:10007649 50 push eax
:1000764A E8119D0000 call 10011360 <= 详细在下面

* Possible StringData Ref from Data Obj ->"$LS98" <= 看是否为此
|
:1000764F 8B35F8410310 mov esi, dword ptr [100341F8]
:10007655 83C410 add esp, 00000010
:10007658 8D442408 lea eax, dword ptr [esp+08] <= 由IRC求得的码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000767E(C)
|
:1000765C 8A10 mov dl, byte ptr [eax]
:1000765E 8A1E mov bl, byte ptr [esi]
:10007660 8ACA mov cl, dl
:10007662 3AD3 cmp dl, bl
:10007664 751E jne 10007684
:10007666 84C9 test cl, cl
:10007668 7416 je 10007680
:1000766A 8A5001 mov dl, byte ptr [eax+01]
:1000766D 8A5E01 mov bl, byte ptr [esi+01]
:10007670 8ACA mov cl, dl
:10007672 3AD3 cmp dl, bl
:10007674 750E jne 10007684
:10007676 83C002 add eax, 00000002
:10007679 83C602 add esi, 00000002
:1000767C 84C9 test cl, cl
:1000767E 75DC jne 1000765C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10007668(C)
|
:10007680 33C0 xor eax, eax
:10007682 EB05 jmp 10007689

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10007664(C), :10007674(C)
|
:10007684 1BC0 sbb eax, eax
:10007686 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10007682(U)
|
:10007689 85C0 test eax, eax <- 此处改为CMP EAX,EAX就可暴破

:1000768B 7443 je 100076D0

* Possible StringData Ref from Data Obj ->"$BCWP"
|
:1000768D 8B35FC410310 mov esi, dword ptr [100341FC] <- 另一次机会
:10007693 8D442408 lea eax, dword ptr [esp+08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100076B9(C)
|
:10007697 8A10 mov dl, byte ptr [eax]
:10007699 8A1E mov bl, byte ptr [esi]
:1000769B 8ACA mov cl, dl
:1000769D 3AD3 cmp dl, bl
:1000769F 751E jne 100076BF <-
:100076A1 84C9 test cl, cl
:100076A3 7416 je 100076BB
:100076A5 8A5001 mov dl, byte ptr [eax+01]
:100076A8 8A5E01 mov bl, byte ptr [esi+01]
:100076AB 8ACA mov cl, dl
:100076AD 3AD3 cmp dl, bl
:100076AF 750E jne 100076BF
:100076B1 83C002 add eax, 00000002
:100076B4 83C602 add esi, 00000002
:100076B7 84C9 test cl, cl
:100076B9 75DC jne 10007697

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100076A3(C)
|
:100076BB 33C0 xor eax, eax
:100076BD EB05 jmp 100076C4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000769F(C), :100076AF(C)
|
:100076BF 1BC0 sbb eax, eax
:100076C1 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100076BD(U)
|
:100076C4 85C0 test eax, eax
:100076C6 7408 je 100076D0
:100076C8 5E pop esi
:100076C9 33C0 xor eax, eax
:100076CB 5B pop ebx
:100076CC 83C40C add esp, 0000000C
:100076CF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000768B(C), :100076C6(C)
|
:100076D0 8B44241C mov eax, dword ptr [esp+1C]
:100076D4 8B4C240E mov ecx, dword ptr [esp+0E]
:100076D8 5E pop esi
:100076D9 5B pop ebx
:100076DA 8908 mov dword ptr [eax], ecx

* Possible Reference to String Resource ID=00001: "%d Hours"
|
:100076DC B801000000 mov eax, 00000001
:100076E1 83C40C add esp, 0000000C
:100076E4 C3 ret

====================================================================

在:1000764A处的调用

* Referenced by a CALL at Addresses:
|:1000764A , :1000788A
|
:10011360 6AFF push FFFFFFFF
:10011362 6880A40210 push 1002A480
:10011367 64A100000000 mov eax, dword ptr fs:[00000000]
:1001136D 50 push eax
:1001136E 64892500000000 mov dword ptr fs:[00000000], esp
:10011375 83EC14 sub esp, 00000014
:10011378 8B442430 mov eax, dword ptr [esp+30]
:1001137C 8B4C2428 mov ecx, dword ptr [esp+28]
:10011380 56 push esi
:10011381 8B742428 mov esi, dword ptr [esp+28]
:10011385 50 push eax
:10011386 51 push ecx
:10011387 56 push esi
:10011388 C744241000000000 mov [esp+10], 00000000
:10011390 E89B180000 call 10012C30 <- 见下面
:10011395 83C40C add esp, 0000000C
:10011398 85C0 test eax, eax <- 不能让Eax返回值为0
:1001139A 7412 je 100113AE <- 跳下去就有大麻烦了，因为它会按别的方式计算Rc，我实在是不想跟下去
:1001139C 33C0 xor eax, eax <- 大家不信可以跟一跟
:1001139E 5E pop esi
:1001139F 8B4C2414 mov ecx, dword ptr [esp+14]
:100113A3 64890D00000000 mov dword ptr fs:[00000000], ecx
:100113AA 83C420 add esp, 00000020
:100113AD C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001139A(C)
|
:100113AE 33D2 xor edx, edx
:100113B0 89542410 mov dword ptr [esp+10], edx
:100113B4 89542414 mov dword ptr [esp+14], edx
:100113B8 33C0 xor eax, eax
:100113BA 89542420 mov dword ptr [esp+20], edx
:100113BE 89442408 mov dword ptr [esp+08], eax
:100113C2 8944240C mov dword ptr [esp+0C], eax
:100113C6 8B542430 mov edx, dword ptr [esp+30]
:100113CA 8D4C2434 lea ecx, dword ptr [esp+34]
:100113CE 51 push ecx
:100113CF 8D44240C lea eax, dword ptr [esp+0C]
:100113D3 52 push edx
:100113D4 8D4C2418 lea ecx, dword ptr [esp+18]
:100113D8 50 push eax
:100113D9 51 push ecx
:100113DA C644243001 mov [esp+30], 01
:100113DF E83C140000 call 10012820
:100113E4 83C410 add esp, 00000010
:100113E7 85C0 test eax, eax
:100113E9 7434 je 1001141F
:100113EB 8B44240C mov eax, dword ptr [esp+0C]
:100113EF 85C0 test eax, eax
:100113F1 7409 je 100113FC
:100113F3 50 push eax
:100113F4 E8AA340000 call 100148A3
:100113F9 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100113F1(C)
|
:100113FC 8B442414 mov eax, dword ptr [esp+14]
:10011400 85C0 test eax, e


Beyond compare 1.9e

 标 题:Beyond compare 1.9e 注册机! (3千字)
发信人:bpx
时 间:2001-8-29 17:17:23
详细信息:
 由于工作的关系很久没来这了, 利用回家休假, 破了一套(勉强一点说还包括cuteftp4.24) 特贴上来与大家共享

// Key Generator for Beyond compare 1.9e(latest version), an excellent file
  compare program by
// www.scootersoftware.com
// Cracked by BPX

#include <windows.h>
#include <tchar.h>

#include "resource.h"

// Return value must be of BOOL type
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL,
  DlgProc, (LPARAM)hInstance);
return 0;
}

BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL) {
EndDialog(hWnd, 0);
return TRUE;
}
}

return FALSE;
}

void CalcKey(HWND);
BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HICON hIcon;
HMENU hSysMenu;

switch (msg)
{
case WM_INITDIALOG:
hIcon = LoadIcon((HINSTANCE)lParam, MAKEINTRESOURCE(MAINICON));
SendMessage(hWnd, WM_SETICON, TRUE, (LPARAM)hIcon);
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);

SendMessage(GetDlgItem(hWnd, IDC_NAME),
  EM_LIMITTEXT, 120, 0L);
SendMessage(GetDlgItem(hWnd, IDC_ORGANIZATION),
  EM_LIMITTEXT, 120, 0L);

hSysMenu = GetSystemMenu(hWnd, FALSE);
if (hSysMenu != NULL) {
AppendMenu(hSysMenu,
  MF_SEPARATOR, NULL, NULL);
// IDM_ABOUT must be
  in the system command range.
// IDM_ABOUT &
  0xFFF0) == IDM_ABOUTBOX
// IDM_ABOUT < 0xF000
AppendMenu(hSysMenu,
  MF_STRING, IDM_ABOUT, TEXT("关于..."));
}
// tell the default procedure to set focus
  to the first non-disabled
// control that have a tab-stop.
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL) {
EndDialog(hWnd, 0);
return TRUE;
}
else if (LOWORD(wParam) == IDOK) {
CalcKey(hWnd);
return TRUE;
}
break;

case WM_SYSCOMMAND:
if (LOWORD(wParam) == IDM_ABOUT) {
DialogBoxParam(GetModuleHandle(NULL),
  MAKEINTRESOURCE(IDD_ABOUT), NULL, AboutDlgProc, 0);
return TRUE;
}
}

return FALSE;
}

void CalcKey(HWND hWnd)
{
TCHAR buf[260] = "Beyond Compare 1";
TCHAR name[120], organization[120], key[9];
unsigned char data[1024];
int *p, esi, ecx, eax, edx;

for (esi = 0, p = (int*)&data[0]; esi < 256; esi++)
  {
for (ecx = 0, eax = esi << 24; ecx
  < 8; ecx++) {
edx = 0;

if ((eax & 0x8000000)
  != 0)
edx
  = 0x4c11db7;
eax += eax;
edx ^= eax;
eax = edx;
}
*p++ = eax;
}

GetDlgItemText(hWnd, IDC_NAME, name, sizeof(name));
GetDlgItemText(hWnd, IDC_ORGANIZATION, organization, sizeof(organization));
_tcsncat(buf, name, _tcslen(name));
_tcsncat(buf, organization, _tcslen(organization));
_tcsupr(buf);

int len = _tcslen(buf);

for (int i = 0; i < len; i++) {
if ((unsigned char)(buf[i] - 'A') <
  26)
buf[i] = buf[i] - 'A'
  + 10;
else if ((unsigned char)(buf[i] - '0')
  < 10)
buf[i] = buf[i] - '0';
else
_tcsncpy(&buf[i],
  &buf[i+1], len - i - 1), len--, i--;
}

for (eax = edx = 0, ecx = len, p = (int*)data; ecx > 0; ecx--,
  edx++) {
esi = buf[edx];
esi ^= eax >> 24;
esi &= 0xff;
esi = p[esi];
eax <<= 8;
esi ^= eax;
eax = esi;
}

wsprintf(key, "%08x", eax);
SetDlgItemText(hWnd, IDC_KEY, key);
}


Beyond Compare v1.9d

标 题:Beyond Compare v1.9d (2千字)
发信人:Blowfish
时 间:2001-2-4 17:27:23
详细信息:
http://www.scootersoftware.com/bc19d.exe

这是一个非常好用的用来比较、同步文件和目录的工具，特别是用来比较不同版本的源程序之间的不同（VC自带的WinDiff也可以，SourceSafe这种版本控制工具自然也有这种比较功能），应属于程序员的必备工具之一。

破解非常简单，跟踪策略（也就是选择断点的策略）有这么几种：
1、用GetPrivateProfileStringA跟它启动时的判断，因注册码在INI文件种；
2、用hmemcpy跟它输入注册码后的判断；
3、用W32Dasm、DeDe、IDA等反汇编之后利用string reference来选择合适的断点。比如用IDA反汇编之后可以看到_TMainForm_Register1Click( )这个成员函数，这是输入注册码并点击“Register”按钮之后所要执行的回调函数。

最终将注意力集中到如下生成并判断注册码的地方：

sub_4A9CDC proc near ; CODE XREF: sub_4A8678+932
; _TMainForm_Register1Click

var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4

push ebp
mov ebp, esp
push 0
push 0
push 0
push ebx
xor eax, eax
push ebp
push offset loc_4A9D6B
push dword ptr fs:[eax]
mov fs:[eax], esp
push offset _str_Beyond_Compare_.Text
push ds:dword_4B6EB4
push ds:dword_4B6EB8
lea eax, [ebp+var_8]
mov edx, 3
call @System@@LStrCatN$qqrv ; System __linkproc__ LStrCatN(void)
mov eax, [ebp+var_8] //串起来的串
call sub_4A72D0 //返回生成的数
lea ecx, [ebp+var_4]
mov edx, 8
call @Sysutils@IntToHex$qqrii ; Sysutils::IntToHex(int,int)
mov eax, [ebp+var_4]
push eax
lea eax, [ebp+var_C]
mov edx, offset byte_4B6EEC
call unknown_libname_36
mov edx, [ebp+var_C]
pop eax
call @Sysutils@CompareText$qqrx17System@AnsiStringxt1 ; Sysutils::CompareText(System::AnsiString,System::AnsiString)
test eax, eax
setz ds:byte_4B6EB2
mov bl, ds:byte_4B6EB2
xor eax, eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push offset loc_4A9D72

loc_4A9D5D: ; CODE XREF: sub_4A9CDC+94
lea eax, [ebp+var_C]
mov edx, 3
call sub_403C9C
retn

loc_4A9D6B: ; DATA XREF: sub_4A9CDC+D
jmp @System@@HandleFinally$qqrv ; System __linkproc__ HandleFinally(void)

jmp short loc_4A9D5D

loc_4A9D72: ; DATA XREF: sub_4A9CDC+7C
mov eax, ebx
pop ebx
mov esp, ebp
pop ebp
retn
sub_4A9CDC endp

align 4
_str_Beyond_Compare_ dd 0FFFFFFFFh ; _top ; DATA XREF: sub_4A9CDC+18
dd 16 ; Len
db 'Beyond Compare 1',0 ; Text

显然，它先把字符串 “Beyond Compare 1”和UserName、Organization用LSrtCatN( )串接起来，再用串起来的这个串鼓捣出一个数来，用IntToHex( )将该数转换成十六进制串，最后用CompareText( )来比较注册码。有兴趣的自己写个注册机。

BF


BrainsBreaker3.0

标 题:谁能找出BrainsBreaker3.0(巨好的拼图游戏)注册码？《论坛精华2》没搞定！ (16千字)
发信人:zest
时 间:2001-2-27 14:12:44
详细信息:

谁能找出BrainsBreaker3.0(巨好的拼图游戏)注册码？《论坛精华2》没搞定！
破这种既好玩又有极大难度的软件才过瘾！
http://www.brainsbreaker.com/download.htm或
http://ourworld.compuserve.com/homepages/jtrujillo/bbsetup.exe
==========================================================================
1、Pack:我不填
Name:zest
Your ID:aaaa
Key:CCCCCCCCCCCCCCCC
--------------------------------------------------------------------------
2、此程序老在0167:00452509～0167:0045278F处循环，循环结束后出注册错误框，
注意0167:00452543 PUSH DWORD [EBP-0C]处PUSH之值，你可下断点
bpx 452546 do"d*esp"看看，我用TRW2K122。
值依次变为full,entry,brainsbreaker,summer96,spring96,winter96,contry。
--------------------------------------------------------------------------
3、我做如下3个断点跟踪：①bpx 452546 do"d*esp" ②bpx 452653 ③bpx 45274e
如KEY个数小于16个，正常中断顺序为①②①②①②......
如KEY个数大于等于16个，正常中断顺序为①②③①②③......
为了便于跟踪，我的KEY填16个c，你或许会曰：NOP掉45274e此行(key数<16还要
NOP掉452653)不就行了？的确，你注册成功了！上WC轻松一刻！
--------------------------------------------------------------------------
4、一泡尿工夫你会发觉你的程序DIE得很惨！
--------------------------------------------------------------------------
5、程序注册后(强迫注册)会在BBRK.INI加入：
[PACKBrainsBreaker]
0=zest
1=aaaa
2=1076e9867711e9867711e9867711e9867711
3=2100
4=4e37d9b1
5=5533cba4
注：上[PACK***]中***有可能就是full,entry,brainsbreaker,summer96,spring96,
winter96,contry其中之一,细观察断点①。我发觉[PACKfull]会出错，见上第3点，
[PACKentry]和[PACKBrainsBreaker]可注册成功！其余[PACK***]说是成功了，
但功能有限制。我爱[PACKBrainsBreaker]，使用后没任何功能限制！
--------------------------------------------------------------------------
6、每次想玩时得跟踪注册一次才能消除其功能限制，麻烦！谁叫我没$19.95呢。
你可试做一个PATCH看看，或用SMC方法。
--------------------------------------------------------------------------
7、谁能找到注册码？
==========================================================================
0167:00452509 FF36 PUSH DWORD [ESI]-------->循环开始处！
0167:0045250B 8D4DF0 LEA ECX,[EBP-10]
0167:0045250E E891990100 CALL 0046BEA4
0167:00452513 8D45F0 LEA EAX,[EBP-10]
0167:00452516 B9B05C4B00 MOV ECX,004B5CB0
0167:0045251B 50 PUSH EAX
0167:0045251C E84D54FDFF CALL 0042796E
0167:00452521 837DF802 CMP DWORD [EBP-08],BYTE +02
0167:00452525 8945D0 MOV [EBP-30],EAX
0167:00452528 6A2C PUSH BYTE +2C
0167:0045252A 752A JNZ 00452556
0167:0045252C E8EA380400 CALL 00495E1B
0167:00452531 8BF0 MOV ESI,EAX
0167:00452533 59 POP ECX
0167:00452534 85F6 TEST ESI,ESI
0167:00452536 7440 JZ 00452578
0167:00452538 FF75E4 PUSH DWORD [EBP-1C]-------->$$CCCCCCCCCCCCCCCC
0167:0045253B 8BCE MOV ECX,ESI
0167:0045253D FF75DC PUSH DWORD [EBP-24]-------->aaaa
0167:00452540 FF75C8 PUSH DWORD [EBP-38]-------->zest
0167:00452543 FF75F4 PUSH DWORD [EBP-0C]-------->注意变化！
0167:00452546 E8EC55FDFF CALL 00427B37
0167:0045254B C706847C4A00 MOV DWORD [ESI],004A7C84
0167:00452551 8975FC MOV [EBP-04],ESI
0167:00452554 EB26 JMP SHORT 0045257C
0167:00452556 E8C0380400 CALL 00495E1B
0167:0045255B 85C0 TEST EAX,EAX
0167:0045255D 59 POP ECX
0167:0045255E 7418 JZ 00452578
0167:00452560 FF75E4 PUSH DWORD [EBP-1C]
0167:00452563 8BC8 MOV ECX,EAX
0167:00452565 FF75DC PUSH DWORD [EBP-24]
0167:00452568 FF75C8 PUSH DWORD [EBP-38]
0167:0045256B FF75F4 PUSH DWORD [EBP-0C]
0167:0045256E E8C455FDFF CALL 00427B37
0167:00452573 8945FC MOV [EBP-04],EAX
0167:00452576 EB04 JMP SHORT 0045257C
0167:00452578 8365FC00 AND DWORD [EBP-04],BYTE +00
0167:0045257C 8B4DFC MOV ECX,[EBP-04]
0167:0045257F 8D951CFFFFFF LEA EDX,[EBP+FFFFFF1C]
0167:00452585 52 PUSH EDX
0167:00452586 8B01 MOV EAX,[ECX]
0167:00452588 FF5008 CALL NEAR [EAX+08]-------->此CALL估计重要！
0167:0045258B 8BF0 MOV ESI,EAX-------->注意EAX值变化！
0167:0045258D 6A08 PUSH BYTE +08
0167:0045258F 59 POP ECX
0167:00452590 0FB63E MOVZX EDI,BYTE [ESI]
0167:00452593 8BC7 MOV EAX,EDI
0167:00452595 6A01 PUSH BYTE +01
0167:00452597 99 CDQ
0167:00452598 F7F9 IDIV ECX
0167:0045259A 8BC7 MOV EAX,EDI
0167:0045259C 5B POP EBX
0167:0045259D C1E803 SHR EAX,03
0167:004525A0 0FB6443001 MOVZX EAX,BYTE [EAX+ESI+01]
0167:004525A5 8BCA MOV ECX,EDX
0167:004525A7 D3E3 SHL EBX,CL
0167:004525A9 23D8 AND EBX,EAX
0167:004525AB 895D08 MOV [EBP+08],EBX
0167:004525AE 7406 JZ 004525B6
0167:004525B0 6A01 PUSH BYTE +01
0167:004525B2 5B POP EBX
0167:004525B3 895D08 MOV [EBP+08],EBX
0167:004525B6 8A4604 MOV AL,[ESI+04]
0167:004525B9 6A08 PUSH BYTE +08
0167:004525BB 0C04 OR AL,04
0167:004525BD 59 POP ECX
0167:004525BE C0E002 SHL AL,02
0167:004525C1 884604 MOV [ESI+04],AL
0167:004525C4 8BC7 MOV EAX,EDI
0167:004525C6 99 CDQ
0167:004525C7 F7F9 IDIV ECX
0167:004525C9 6A08 PUSH BYTE +08
0167:004525CB 8BC8 MOV ECX,EAX
0167:004525CD 8BC7 MOV EAX,EDI
0167:004525CF 99 CDQ
0167:004525D0 5F POP EDI
0167:004525D1 F7FF IDIV EDI
0167:004525D3 85DB TEST EBX,EBX
0167:004525D5 751B JNZ 004525F2
0167:004525D7 8D7C3101 LEA EDI,[ECX+ESI+01]
0167:004525DB 8D4A01 LEA ECX,[EDX+01]
0167:004525DE B001 MOV AL,01
0167:004525E0 B301 MOV BL,01
0167:004525E2 D2E0 SHL AL,CL
0167:004525E4 8BCA MOV ECX,EDX
0167:004525E6 D2E3 SHL BL,CL
0167:004525E8 F6D0 NOT AL
0167:004525EA 0A1F OR BL,[EDI]
0167:004525EC 22C3 AND AL,BL
0167:004525EE 8807 MOV [EDI],AL
0167:004525F0 EB0E JMP SHORT 00452600
0167:004525F2 8D443101 LEA EAX,[ECX+ESI+01]
0167:004525F6 B301 MOV BL,01
0167:004525F8 8BCA MOV ECX,EDX
0167:004525FA D2E3 SHL BL,CL
0167:004525FC F6D3 NOT BL
0167:004525FE 2018 AND [EAX],BL
0167:00452600 0FB63E MOVZX EDI,BYTE [ESI]
0167:00452603 8BC7 MOV EAX,EDI
0167:00452605 6A08 PUSH BYTE +08
0167:00452607 99 CDQ
0167:00452608 59 POP ECX
0167:00452609 F7F9 IDIV ECX
0167:0045260B 8BC8 MOV ECX,EAX
0167:0045260D 8D4101 LEA EAX,[ECX+01]
0167:00452610 3D80000000 CMP EAX,80
0167:00452615 7E02 JNG 00452619
0167:00452617 33C0 XOR EAX,EAX
0167:00452619 8A543001 MOV DL,[EAX+ESI+01]
0167:0045261D 8D443001 LEA EAX,[EAX+ESI+01]
0167:00452621 80CA04 OR DL,04
0167:00452624 BBDE100000 MOV EBX,10DE
0167:00452629 C0EA02 SHR DL,02
0167:0045262C 8810 MOV [EAX],DL
0167:0045262E A1E86C4B00 MOV EAX,[004B6CE8]
0167:00452633 99 CDQ
0167:00452634 F7FB IDIV EBX
0167:00452636 85D2 TEST EDX,EDX
0167:00452638 750E JNZ 00452648
0167:0045263A 8BC7 MOV EAX,EDI
0167:0045263C 6A08 PUSH BYTE +08
0167:0045263E 99 CDQ
0167:0045263F 5F POP EDI
0167:00452640 8D4C3102 LEA ECX,[ECX+ESI+02]
0167:00452644 F7FF IDIV EDI
0167:00452646 0811 OR [ECX],DL
0167:00452648 FF05E86C4B00 INC DWORD [004B6CE8]
0167:0045264E 8A4601 MOV AL,[ESI+01]
0167:00452651 A804 TEST AL,04
0167:00452653 740B JZ 00452660-------->NOP掉它!!!!!!
0167:00452655 33C9 XOR ECX,ECX
0167:00452657 394D08 CMP [EBP+08],ECX
0167:0045265A 0F94C1 SETZ CL
0167:0045265D 894D08 MOV [EBP+08],ECX
0167:00452660 F6D0 NOT AL
0167:00452662 884601 MOV [ESI+01],AL
0167:00452665 33C0 XOR EAX,EAX
0167:00452667 394508 CMP [EBP+08],EAX
0167:0045266A 0F84F2000000 JZ NEAR 00452762
0167:00452670 8B4DFC MOV ECX,[EBP-04]
0167:00452673 50 PUSH EAX
0167:00452674 50 PUSH EAX
0167:00452675 8D45B0 LEA EAX,[EBP-50]
0167:00452678 8B11 MOV EDX,[ECX]
0167:0045267A 50 PUSH EAX
0167:0045267B FF5210 CALL NEAR [EDX+10]
0167:0045267E 8BF0 MOV ESI,EAX
0167:00452680 6A08 PUSH BYTE +08
0167:00452682 59 POP ECX
0167:00452683 0FB63E MOVZX EDI,BYTE [ESI]
0167:00452686 8BC7 MOV EAX,EDI
0167:00452688 6A01 PUSH BYTE +01
0167:0045268A 99 CDQ
0167:0045268B F7F9 IDIV ECX
0167:0045268D 8BC7 MOV EAX,EDI
0167:0045268F 5B POP EBX
0167:00452690 C1E803 SHR EAX,03
0167:00452693 0FB6443001 MOVZX EAX,BYTE [EAX+ESI+01]
0167:00452698 8BCA MOV ECX,EDX
0167:0045269A D3E3 SHL EBX,CL
0167:0045269C 23D8 AND EBX,EAX
0167:0045269E 7403 JZ 004526A3
0167:004526A0 6A01 PUSH BYTE +01
0167:004526A2 5B POP EBX
0167:004526A3 8A4604 MOV AL,[ESI+04]
0167:004526A6 6A08 PUSH BYTE +08
0167:004526A8 0C04 OR AL,04
0167:004526AA 59 POP ECX
0167:004526AB C0E002 SHL AL,02
0167:004526AE 884604 MOV [ESI+04],AL
0167:004526B1 8BC7 MOV EAX,EDI
0167:004526B3 99 CDQ
0167:004526B4 F7F9 IDIV ECX
0167:004526B6 6A08 PUSH BYTE +08
0167:004526B8 8BC8 MOV ECX,EAX
0167:004526BA 8BC7 MOV EAX,EDI
0167:004526BC 99 CDQ
0167:004526BD 5F POP EDI
0167:004526BE F7FF IDIV EDI
0167:004526C0 85DB TEST EBX,EBX
0167:004526C2 7521 JNZ 004526E5
0167:004526C4 8D7C3101 LEA EDI,[ECX+ESI+01]
0167:004526C8 8D4A01 LEA ECX,[EDX+01]
0167:004526CB B001 MOV AL,01
0167:004526CD D2E0 SHL AL,CL
0167:004526CF 8BCA MOV ECX,EDX
0167:004526D1 F6D0 NOT AL
0167:004526D3 88450B MOV [EBP+0B],AL
0167:004526D6 B001 MOV AL,01
0167:004526D8 D2E0 SHL AL,CL
0167:004526DA 8A4D0B MOV CL,[EBP+0B]
0167:004526DD 0A07 OR AL,[EDI]
0167:004526DF 22C8 AND CL,AL
0167:004526E1 880F MOV [EDI],CL
0167:004526E3 EB14 JMP SHORT 004526F9
0167:004526E5 8D443101 LEA EAX,[ECX+ESI+01]
0167:004526E9 B101 MOV CL,01
0167:004526EB 884D0B MOV [EBP+0B],CL
0167:004526EE 8BCA MOV ECX,EDX
0167:004526F0 8A550B MOV DL,[EBP+0B]
0167:004526F3 D2E2 SHL DL,CL
0167:004526F5 F6D2 NOT DL
0167:004526F7 2010 AND [EAX],DL
0167:004526F9 0FB606 MOVZX EAX,BYTE [ESI]
0167:004526FC 894508 MOV [EBP+08],EAX
0167:004526FF 6A08 PUSH BYTE +08
0167:00452701 99 CDQ
0167:00452702 59 POP ECX
0167:00452703 F7F9 IDIV ECX
0167:00452705 8BF8 MOV EDI,EAX
0167:00452707 8D4701 LEA EAX,[EDI+01]
0167:0045270A 3D80000000 CMP EAX,80
0167:0045270F 7E02 JNG 00452713
0167:00452711 33C0 XOR EAX,EAX
0167:00452713 8A4C3001 MOV CL,[EAX+ESI+01]
0167:00452717 8D443001 LEA EAX,[EAX+ESI+01]
0167:0045271B 80C904 OR CL,04
0167:0045271E C0E902 SHR CL,02
0167:00452721 8808 MOV [EAX],CL
0167:00452723 A1E86C4B00 MOV EAX,[004B6CE8]
0167:00452728 99 CDQ
0167:00452729 B9DE100000 MOV ECX,10DE
0167:0045272E F7F9 IDIV ECX
0167:00452730 85D2 TEST EDX,EDX
0167:00452732 750F JNZ 00452743
0167:00452734 8B4508 MOV EAX,[EBP+08]
0167:00452737 6A08 PUSH BYTE +08
0167:00452739 8D4C3E02 LEA ECX,[ESI+EDI+02]
0167:0045273D 5F POP EDI
0167:0045273E 99 CDQ
0167:0045273F F7FF IDIV EDI
0167:00452741 0811 OR [ECX],DL
0167:00452743 FF05E86C4B00 INC DWORD [004B6CE8]
0167:00452749 8A4601 MOV AL,[ESI+01]
0167:0045274C A804 TEST AL,04
0167:0045274E 7409 JZ 00452759-------->NOP掉它!!!!!!!!
0167:00452750 33C9 XOR ECX,ECX
0167:00452752 85DB TEST EBX,EBX
0167:00452754 0F94C1 SETZ CL-------->CL应为1
0167:00452757 8BD9 MOV EBX,ECX-------->赋值
0167:00452759 F6D0 NOT AL
0167:0045275B 85DB TEST EBX,EBX-------->ebx不应为0
0167:0045275D 884601 MOV [ESI+01],AL
0167:00452760 7539 JNZ 0045279B-------->应该让它跳！
0167:00452762 837DFC00 CMP DWORD [EBP-04],BYTE +00
0167:00452766 7411 JZ 00452779
0167:00452768 8B4DFC MOV ECX,[EBP-04]
0167:0045276B E819F3FAFF CALL 00401A89
0167:00452770 FF75FC PUSH DWORD [EBP-04]
0167:00452773 E8002F0400 CALL 00495678
0167:00452778 59 POP ECX
0167:00452779 8B75D4 MOV ESI,[EBP-2C]
0167:0045277C 83C604 ADD ESI,BYTE +04
0167:0045277F 8975D4 MOV [EBP-2C],ESI
0167:00452782 833E00 CMP DWORD [ESI],BYTE +00
0167:00452785 740D JZ 00452794
0167:00452787 8D4DF0 LEA ECX,[EBP-10]
0167:0045278A E8B5970100 CALL 0046BF44
0167:0045278F E975FDFFFF JMP 00452509-------->大循环，跳到上面第一行！
0167:00452794 33F6 XOR ESI,ESI
0167:00452796 E9ED010000 JMP 00452988-------->此JMP跳过了注册成功的CALL！
0167:0045279B 33FF XOR EDI,EDI
0167:0045279D 397DD0 CMP [EBP-30],EDI
0167:004527A0 7C11 JL 004527B3
0167:004527A2 FF75D0 PUSH DWORD [EBP-30]
0167:004527A5 BBB05C4B00 MOV EBX,004B5CB0
0167:004527AA 8BCB MOV ECX,EBX
0167:004527AC E865730000 CALL 00459B16
0167:004527B1 EB05 JMP SHORT 004527B8
0167:004527B3 BBB05C4B00 MOV EBX,004B5CB0
0167:004527B8 393D845A4B00 CMP [004B5A84],EDI
0167:004527BE 7518 JNZ 004527D8
0167:004527C0 6A05 PUSH BYTE +05
0167:004527C2 C705BC584B000100+MOV DWORD [004B58BC],01
0167:004527CC E821560000 CALL 00457DF2
0167:004527D1 59 POP ECX
0167:004527D1 59 POP ECX
0167:004527D2 893DBC584B00 MOV [004B58BC],EDI
0167:004527D8 6848010000 PUSH DWORD 0148
0167:004527DD E8D0E20200 CALL 00480AB2
0167:004527E2 3BC7 CMP EAX,EDI
0167:004527E4 59 POP ECX
0167:004527E5 7410 JZ 004527F7
0167:004527E7 FF75DC PUSH DWORD [EBP-24]
0167:004527EA 8BC8 MOV ECX,EAX
0167:004527EC FF75C8 PUSH DWORD [EBP-38]
0167:004527EF FF75F4 PUSH DWORD [EBP-0C]
0167:004527F2 E83660FEFF CALL 0043882D-------->此CALL注册成功！
0167:004527F7 8B45EC MOV EAX,[EBP-14]
0167:004527FA FF7004 PUSH DWORD [EAX+04]
0167:004527FD FF1564754A00 CALL `USER32!UpdateWindow`
0167:00452803 8B75FC MOV ESI,[EBP-04]
0167:00452806 8D4508 LEA EAX,[EBP+08]
0167:00452809 6A01 PUSH BYTE +01

/\zest/\2000.2

标 题:半破BrainsBreaker3.0!!改1字节!!一点补充。 (1千字)
发信人:zest
时 间:2001-2-28 23:27:52
详细信息:

半破BrainsBreaker3.0!!改1字节!!一点补充。
1、首先:
在BBRK.INI加入：
[PACKBrainsBreaker]
0=zest
1=aaaa
2=1076e9867711e9867711e9867711e9867711
3=2100
4=4e37d9b1
5=5533cba4
详见上篇找出注册假成功部分！

2、[HKEY_CLASSES_ROOT\BrainsBreaker_Puzzle\ID]
@="af123835144e2f34a8a56cbb980357a8b43055347f980017"
因为注册假成功还会在注册表改为此值。如你已经注册假成功了则不需改动。
详见上篇怎样注册假成功部分！

3、改：BBRK32.EXE
0167:00426B85 1BC0 SBB EAX,EAX
0167:00426B87 40 INC EAX
0167:00426B88 85C0 TEST EAX,EAX
0167:00426B8A 0F8504010000 JNZ NEAR 00426C94
^^
84
0167:00426B90 8D8500FFFFFF LEA EAX,[EBP+FFFFFF00]
0167:00426B96 8BCB MOV ECX,EBX
0167:00426B98 50 PUSH EAX
4、运行程序已无功能限制！在Options显示注册成功。
5、但有文件被改动的nag和自己做的拼图有限制。
6、注册码不知怎么找！估计就在附近！没找到对比处，太乱。
7、00452337～00452A4B是检测注册码正确与否部分，004265C4～00426D0B是文件启动
检测是否注册部分，程序段非常相似，我是依此找突破口的。
8、你可把上[PACKBrainsBreaker]改[PACKFull]、[PACKEntry]、[PACKCountry]等
试试，[PACKFull]有问题，[PACKCountry]是DEMO。

/\zest/\2000.2

标 题:给篇教程，虽然是针对老版本的，但基本的scheme没太大变化 (85字)
发信人:1212
时 间:2001-3-3 18:18:18
详细信息:

* Chapter 3 : BrainsBreaker v2.1

Tools used: Softice, Wdasm (or IDA)

Output: Brains Breaker v2.1 crack

Indeed a fun game to play! In fact I spent about 2-3 hours just playing the game before I started to crack it. It seems like some puzzles are only demos? Hmm, must be a nasty bug...but mr. Juan Trujillo Tarradas dont have to worry, we'll fix that for him! We'll just go to the "enter registraion name/serial" window and crack it like any other program... yeah...right...eh..only one problem... where is it?! At times like this I always go to the helpfile to try to find some usefull information, and look what I found:

Once your payment is processed, you'll receive an e-mail message containing your
registration code with the instructions to enter it in the program that makes
fully playable all the puzzles (if registered the Full pack) or the puzzles in the Entry set.
Ah...The registration window is hidden! How to find it then?

Step 1 - finding the registration window!
I choosed to disasemble the program, and searched after some well- choosen strings like "registration". I found this hit (after disasming with Wdasm, no need to use IDA if we dont have to):

* Possible StringData Ref from Data Obj ->"Registration info. Program version "
Interesting indeed! I browsed down a bit through the code and found alot of even more interesting strings there, including "Pack", "Name", "Your ID" and "Key:". Looks like this could be the place where we enter our registration details. Now we want to know how we execute this code, so we browse upwards through the code. We notice that this code is called from another location:
* Referenced by a CALL at Address:
|:0044C881
Now we know where this code was executed from. Go up to that location and have a look:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044B8CF(C)
|
:0044C852 6A06                    push 00000006
:0044C854 FFB381010000            push dword ptr [ebx+00000181]
:0044C85A E8CF49FDFF              call 0042122E
:0044C85F E9EB0C0000              jmp 0044D54F
:0044C864 6A1C                    push 0000001C
:0044C866 E8723FFDFF              call 004207DD
:0044C86B 898590FEFFFF            mov dword ptr [ebp+FFFFFE90], eax
:0044C871 85C0                    test eax, eax
:0044C873 0F84D60C0000            je 0044D54F
:0044C879 6A00                    push 00000000
:0044C87B FFB590FEFFFF            push dword ptr [ebp+FFFFFE90]
:0044C881 E85FE40100              call 0046ACE5		<-- here is the intersting call
:0044C886 E9C40C0000              jmp 0044D54F
Hmm, judging from this code, we'd say that the call to the interesting routine will never be executed because the program will jump at offset 44C85F, and we dont see any other jump references...Here is a good example of how bad wdasm disassembles sometimes. There ARE references to the interesting call, if you use IDA you'll see them. The problem is that it referenced through the instruction "jmp dword ptr [4*eax+0044B96B]" and that's why Wdasm doesnt find it. Go to offset 44B964, you'll find this offset using IDA.
(It is possible to find it using Wdasm as well but it takes some more work. As you can see from the code snippet above, we'd like to jump to either offset 44C864 or 44C879 to execute our "enter registraion information" call, so try a search on "44C864" and you'll land in a very intersting place!)
:0044B964 FF24856BB94400          jmp dword ptr [4*eax+0044B96B]

:0044B96B C7C34400                DWORD 0044C3C7
:0044B96F 5CC44400                DWORD 0044C45C
:0044B973 CEC44400                DWORD 0044C4CE
:0044B977 C0C84400                DWORD 0044C8C0
:0044B97B 64C84400                DWORD 0044C864   <-- You'll land here if you're using Wdasm
:0044B97F C0C84400                DWORD 0044C8C0
:0044B983 8BC84400                DWORD 0044C88B
:0044B987 C0C84400                DWORD 0044C8C0
:0044B98B C0C84400                DWORD 0044C8C0
:0044B98F C0C84400                DWORD 0044C8C0
:0044B993 C0C84400                DWORD 0044C8C0
:0044B997 C0C84400                DWORD 0044C8C0
:0044B99B C0C84400                DWORD 0044C8C0
:0044B99F C0C84400                DWORD 0044C8C0
:0044B9A3 C0C84400                DWORD 0044C8C0
:0044B9A7 C0C84400                DWORD 0044C8C0
:0044B9AB C0C84400                DWORD 0044C8C0
:0044B9AF C0C84400                DWORD 0044C8C0
:0044B9B3 C0C84400                DWORD 0044C8C0
:0044B9B7 FEC54400                DWORD 0044C5FE
Ah - great! At offset 44B964, based on the value in eax, a jump is taken. So in order to execute our interesting call, eax should hold a value of 4 (4h*4h = 10h. 44B96Bh+10h = 44B97Bh and that's the offset where the interesting jump address is stored).
Now we need to know where anything gets saved in eax, so trace upwards through the dead-listing and you'll find that offset 0044B8A2 is the one we're searching for.
:0044B8A2 8B4607                  mov eax, dword ptr [esi+07]
:0044B8A5 3D50040000              cmp eax, 00000450
:0044B8AA 0F8F99000000            jg 0044B949
:0044B8B0 0F849A0E0000            je 0044C750
...
:0044B949 3D68040000              cmp eax, 00000468
:0044B94E 7F6B                    jg 0044B9BB
:0044B950 0F84EB080000            je 0044C241
:0044B956 05AEFBFFFF              add eax, FFFFFBAE	;Same as "sub eax,452"
:0044B95B 83F813                  cmp eax, 00000013
:0044B95E 0F875C0F0000            ja 0044C8C0
:0044B964 FF24856BB94400          jmp dword ptr [4*eax+0044B96B]
There, now it's pretty easy to figure out what value we need to execute our "enter registation information" call. First of all it has to be over 450h, becuase we want to take the jump at offset 44B8AA. It must be lower than 468h because we DONT want to take the jump at offset 44B94E or at 44B950. Substract 452 from our value, and if the result is below or equal to 13h execute the jump at 44B964. We already know that we want eax to be 4 when the jump is beeing executed so therefor we want eax to be 452+4=456h at offset 44B8A2 in order to bring up the registraion window. To see if this theory is correct, lets test it in practice! Boot up the game, and put a breakpoint on cs:44B8A2 (make sure that brainsbreaker has control when you set the breakpoint, otherwise CS wont point to brainsbreakers code). Now choose a menu item, and softice will break due to our breakpoint. You will see that a value is moved into eax (the value depends on what menu-item we choosed). Step over the instruction and edit the eax register using the r command. Change to value to 456 instaed and let it run...YES! The "enter registraion information" windows pops up!

Step 2 - What pack do we want?
Ok, we got four edit fields that we must fill in, where the first one is "Pack:". Remember what the help file said? There are two different registraion "packs", one called Entry pack and another one called Full pack so we can easily guess that we shall enter either "full pack", "full" or something. To find out if we are right, let's enter "full pack" in the first field, and just some bogus info in the other fields. Now we go on as we normally do when cracking a name/serial protection, set a breakpoint on a string fetching function (GetDlgItemTextA, GetWindowTextA, hmemcpy or whatever, you know them :)) or try the breakpoint on windows message (bmsg) way...do whatever you want, just as long as you break in, I choosed to break on the windows message wm_gettext.
You all problaby know how to proceed from now on. Find our entered string (Full pack), and put a breakpoing on memory range (bpr) on it and then feel the code. You'll see ALOT of "repnz scasb" function (used alot for length checking if al=0), and a few "repz movsb functions. Just step through them, and put a new bpr everytime the string is copied. Remove an old breakpoint only when you see that it's overwritten with something else.
If you're having trouble telling the interesting code from the uninteresting I'll give you the offset where the interesting part begins, it's at offset 4012BD:

:004012BD 0FBE06                  movsx eax, byte ptr [esi]
:004012C0 50                      push eax
:004012C1 E8EE560000              call 004069B4
:004012C6 59                      pop ecx
:004012C7 8BD8                    mov ebx, eax
:004012C9 50                      push eax
:004012CA 0FBE17                  movsx edx, byte ptr [edi]
We start out by moving the first letter in our entered string into eax (in our case it's 46h, 'F'). What the next few lines do is that it copies that value into other registers (not really interesting), but the last instruction is very interesting. It takes a byte from what edi is pointing to and moves it into edx. I wonder what edi points to, dont you? Let's find out! "d edi" in softice, and now look in the datawindow. "Entry Full Upgrade..." and so on. Weee! We now know (ok, not exactly know, but it's a VERY good guess) that we shall enter "Full" in the first edit field, because we do want the fully registered copy, dont we?

Step 3 - Examining the protection scheme Time for the real pain, the real protection scheme. So, start out by entering something in the edit fields, I entered "Full", "Cruehead", "111", "1230123". Now we do like we did last time, but this time we're only interested in when the program is doing anything with our entered serial, so we choose to breakpoing on that string (1230123 in my case). Same story as before, a lot of length checking and string copying...I know it's pretty boring, but just hang in there. After some time you'll get to offset 401440. This is where its finally gets somewhat first interesting. What the program does is that it compares all characters in the serial with "-", but as our serial doesnt have a "-", we continue without any change. After some more uninteresting length checkings we get to the same offset again, but this time the program compares every character in our serial with "0". If it finds a match, the zero is removed and instead an O is put there. Our new code will be "123O123". We find ourself at this offset once again after some more time in softice. This time the program checks if any of the characters in the serial is '1'. If they are, replace them with a "L" instead. Our new code will be "L23OL23". After this, each of our characters in the serial will be compared to (in order and in hex): 00,3B,0D and 0A. We dont have to care about this because these bytes wont be found in our serial.
Geez, so much debuging and yet nothing really interesting, but fear not - we are getting there. After a while we'll land at offset 46AC55 and here is where the fun part begins.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046ACB3(C)
|
:0046AC4C FF35BC554800            push dword ptr [004855BC]
:0046AC52 8B45E8                  mov eax, dword ptr [ebp-18]
:0046AC55 0FBE10                  movsx edx, byte ptr [eax]	<-- We'll land here
:0046AC58 52                      push edx
:0046AC59 E856BDF9FF              call 004069B4
:0046AC5E 59                      pop ecx
:0046AC5F 50                      push eax
:0046AC60 E8BDBAFAFF              call 00416722
:0046AC65 8845EF                  mov byte ptr [ebp-11], al
:0046AC68 33C0                    xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046ACA5(C)
|
:0046AC6A 8BC8                    mov ecx, eax
:0046AC6C BA01000000              mov edx, 00000001
:0046AC71 D3E2                    shl edx, cl
:0046AC73 33C9                    xor ecx, ecx
:0046AC75 8A4DEF                  mov cl, byte ptr [ebp-11]
:0046AC78 23D1                    and edx, ecx
:0046AC7A 740E                    je 0046AC8A
:0046AC7C 8BCB                    mov ecx, ebx
:0046AC7E B201                    mov dl, 01
:0046AC80 D2E2                    shl dl, cl
:0046AC82 8B4DF6                  mov ecx, dword ptr [ebp-0A]
:0046AC85 081431                  or byte ptr [ecx+esi], dl
:0046AC88 EB0E                    jmp 0046AC98

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046AC7A(C)
|
:0046AC8A 8BCB                    mov ecx, ebx
:0046AC8C B201                    mov dl, 01
:0046AC8E D2E2                    shl dl, cl
:0046AC90 F6D2                    not dl
:0046AC92 8B4DF6                  mov ecx, dword ptr [ebp-0A]
:0046AC95 201431                  and byte ptr [ecx+esi], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046AC88(U)
|
:0046AC98 43                      inc ebx
:0046AC99 83FB08                  cmp ebx, 00000008
:0046AC9C 7503                    jne 0046ACA1
:0046AC9E 46                      inc esi
:0046AC9F 33DB                    xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046AC9C(C)
|
:0046ACA1 40                      inc eax
:0046ACA2 83F805                  cmp eax, 00000005
:0046ACA5 7CC3                    jl 0046AC6A
:0046ACA7 FF45F0                  inc [ebp-10]
:0046ACAA FF45E8                  inc [ebp-18]
:0046ACAD 8B45F0                  mov eax, dword ptr [ebp-10]
:0046ACB0 3B45FC                  cmp eax, dword ptr [ebp-04]
:0046ACB3 7C97                    jl 0046AC4C
Whoah, quite some code there! But dont worry, we really dont have to understand it (as you will see later), we just need to know where the output is stored. The code here isnt very hard to understand either, but we'll deal with it later. To save some time, I'll tell you now that output will be created at offset 46AC85 and 46AC95. You will see that after the loop, a few bytes (how many depends on the length of the serial entered) have been generated from our serial and saved at the address that ecx+esi points to at offset 46AC85. You can now remove all breakpoints and put one (breakpoint on memory range - bpr) on our nely created bytes (in our case it will be 5 of them). Just to make sure you got the correct spot, the bytes for "L23OL23" is 4B,6F,B7,F4,06. As you will see this string will be copied around a bit, but just follow the same procedure as last time (same procedure as every year, james). After a little while you'll land in the next interesting spot:
:00459B50 8BC1                    mov eax, ecx
:00459B52 99                      cdq
:00459B53 F7FB                    idiv ebx
:00459B55 8B45E4                  mov eax, dword ptr [ebp-1C]
:00459B58 03C2                    add eax, edx
:00459B5A 8A16                    mov dl, byte ptr [esi]	<-- You'll be here
:00459B5C 3010                    xor byte ptr [eax], dl
:00459B5E 41                      inc ecx
:00459B5F 46                      inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00459B4E(U)
|
:00459B60 8B45FC                  mov eax, dword ptr [ebp-04]
:00459B63 2BC3                    sub eax, ebx
:00459B65 3BC8                    cmp ecx, eax
:00459B67 7CE7                    jl 00459B50
Not that hard to understand. One byte will be XOR'd with each of our new bytes, and a few others as well (these are constants). This final byte will have a value of 0E in our case. You should always be very suspicious when you see an instruction that uses XOR. The only exception is when it's followed by two registers of the same kind, because then (as you all problaby already know) it just sets the register to zero. Now after this loop we'll get to the first check. If you start stepping through the code you'll soon see that the byte which were XOR'd with our "registraion bytes" will be compared to zero. If it matches, go on, otherwise it's a fake code. Finally we're getting somewhere! We now know that after quite a lot of different manipulations of our serial (remember that we had two different manipulations, the first created a couple of bytes based on our serial, and the other XOR'ed them together along with a few other constant bytes) we shall have a final value of zero! Remember this as we'll use it later, but for now, just change the program so it continues, preferable by changing the final byte from 0E to 00 (you should always try to patch as little as possible, atleast while investigating a protection scheme). One can almost guess that somewhere nearby there will be another (or more) checks, and therefor we start stepping through the next piece of code. This is pretty hard, you have to feel where something interesting happends, but I'll tell you that at offset 459d01 something is happening:
:00459D01 3B4DEC                  cmp ecx, dword ptr [ebp-14]
:00459D04 7D4F                    jge 00459D55

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00459D53(C)
|
:00459D06 8BC1                    mov eax, ecx
:00459D08 99                      cdq
:00459D09 F7FF                    idiv edi
:00459D0B 8B45E0                  mov eax, dword ptr [ebp-20]
:00459D0E 8A1C10                  mov bl, byte ptr [eax+edx]
:00459D11 0FB745F0                movzx eax, word ptr [ebp-10]
:00459D15 3BC8                    cmp ecx, eax
:00459D17 7D09                    jge 00459D22
:00459D19 0FB7D1                  movzx edx, cx
:00459D1C 8B45F4                  mov eax, dword ptr [ebp-0C]
:00459D1F 321C10                  xor bl, byte ptr [eax+edx]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00459D17(C)
|
:00459D22 0FB7560C                movzx edx, word ptr [esi+0C]
:00459D26 3BCA                    cmp ecx, edx
:00459D28 7D09                    jge 00459D33
:00459D2A 0FB7C1                  movzx eax, cx
:00459D2D 8B5610                  mov edx, dword ptr [esi+10]
:00459D30 321C02                  xor bl, byte ptr [edx+eax]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00459D28(C)
|
:00459D33 0FB74614                movzx eax, word ptr [esi+14]
:00459D37 3BC8                    cmp ecx, eax
:00459D39 7D09                    jge 00459D44
:00459D3B 0FB7D1                  movzx edx, cx
:00459D3E 8B4618                  mov eax, dword ptr [esi+18]
:00459D41 321C10                  xor bl, byte ptr [eax+edx]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00459D39(C)
|
:00459D44 8BC1                    mov eax, ecx
:00459D46 99                      cdq
:00459D47 F7FF                    idiv edi
:00459D49 8B45E0                  mov eax, dword ptr [ebp-20]
:00459D4C 881C10                  mov byte ptr [eax+edx], bl
:00459D4F 41                      inc ecx
:00459D50 3B4DEC                  cmp ecx, dword ptr [ebp-14]
:00459D53 7CB1                    jl 00459D06
A pretty easy to understand protection here. Take the first char in the "pack" field, xor it with the first char in the "Username" field and finally xor this with the first char in the "ID" field. Save this byte and then proceed with the second character, the third and so on. I suppose a table will describe it better:

Pack string: | 46 | 75 | 6C | 6C |  |
Username String: | 43 | 72 | 75 | 65 | 68 | 65
ID string: | 31 | 32 | 33 |  |  |
Result after XOR: | 34 | 35 | 2A | 09 | 68 | 65

"Hey! You only got 6 characters in the table, but the strings can be longer (and one of them in fact is)!" Calm down, That's because something is happening after 6 bytes has been processed. Now the first byte in our "result string" (34 in our case) will also be included the scheme. So, 34 will be xor'ed to every 7'th char in the other strings, and in our case the "username" string will be the only one effected, as the others are too small. The result is written in the first position in the "result string", thus removing the old value. After 6 more bytes, it does the same again , thus keeping the size of the result string to 6 bytes. When 20h (=32 dec) characters has been processed the routine is done.
Something has to be happening with these 6 bytes (why write that routine otherwise), so lets put a bpr on them. You will break in a string comparing routine. So...this string is compared to another string! Very interesting indeed... I wonder what happends if they matches??? let's see! Change one of the strings so it matches the other and let the program run...

YEEEEES! Program registered!

So, now all we have to do is to make the strings match...just one BIG problem...One would have thought that the string that our "pack, username, ID" string was compared with should be constant...but this is not true! It changes everytime, so there is not a chance to make these strings match eachother! First I thought this was some anti-cracking feature, but that is not true either. I changed the program so it would display a little messagebox with the first bytes of the string, and I ran it without softice (for the first time in months, softice wasnt loaded on my machine :)). No luck, it still changed! One alternative still remains...patching!

Step 4 - Cracking it! First of all I'd like to say that I dont really like patches because one never knows what comes with a patch. It could be a nasty checksum, or even worse - a delayed checksum. That's why I always like to find/calculate a valid serial when cracking name/serial protections, but when you're out of ideas, I guess patching can be justified. But even if we are going to patch, let's patch as little as we have too. We dont have to patch the first check (remember? one byte is compared to zero...) as we can pretty easily find a serial that justifies that. As most crackers are lazy by nature (well, atleast I am :)), lets just write a quick and dirty bruteforcer. You can find my source and the executable for it here. Run it, and we'll get the serial 125000. If our bruteforcer does what it's suppose to do we would now get by the first check by using this seriall, so let's test it! Go back to the register window, and enter the same information as before, but change the serial to 125000. Wow! It worked! Of course we didnt get the "thanks for registering" message, but we didnt expect that either, because the last check is still there. For reasons that I told you about earlier we have to patch that (or spend the next couple of weeks trying to figure out a way how to crack it without patching, but as I said - we're all lazy).

Of course the next question will be Where shall we patch? Before we can answer that we have to make sure we understand what we want to do. In this case we want two strings to match eachother (or atleast making the program think they do). If we investigate the comparision routine we see that the routine compares the number of bytes specified in edi. In our case edi=6 and therefor 6 bytes are compared. If we look at the code right after the comparison routine we will also see that dl is set to 1 if the strings matches. If they dont dl is set to zero. Now we can make a small list of possible patches:

1)   Action: Set edi to zero so that zero bytes will be compared.
Consequence: The strings wont be compared.
2)   Action: Overwrite the two strings with the same 6 bytes.
Consequence: The strings will match.
3)   Action: Fake the return value so dl will be set to one either way.
Consequence: The program thinks that the strings matches.
4)   Action: Fake a conditional jump
Consequence: The program thinks that the strings matches.
There are even more possibilites but these are more than enough. We can choose any of these and the program would, in theory, think our entered serial is valid. Let's try for example to set edi to zero. First of all lets find where the program sets edi to 6:
:00459C43 8B7508                  mov esi, dword ptr [ebp+08]
:00459C46 807E2400                cmp byte ptr [esi+24], 00
:00459C4A 7415                    je 00459C61
:00459C4C BF06000000              mov edi, 00000006
Can we change this into "mov edi,0" instead? Yes we can but the program would crash later due to a couple of "IDIV" instructions that relies on edi not beeing zero. So where can we change edi to zero then? Look at this:
:00459CFF 33C9                    xor ecx, ecx
:00459D01 3B4DEC                  cmp ecx, dword ptr [ebp-14]
:00459D04 7D4F                    jge 00459D55
...
This is the begining of the code that creates the 6 bytes long string from our entered Name, ID and Pack. This code is completely useless if we change edi to zero (because zero bytes will be compared) so we can saftly patch here. Let's change the code so it looks like this instead:
:00459CFF 33FF                    xor edi,edi	;set edi to zero
:00459D01 EB52                    jmp 00459D55	;Jump over the rest
                        ;of the function
Oh yeah! This works very nicely! Patch it using your favourite hex-editor and run it.

Integrity check:
Program seems to be altered from his original contents

Of course...a checksum function as well. How can we crack this then?

In fact, the author has already done half the work for us. Notice how the message is presented - through a messagebox! Very good news for us crackers, we just have to put a bpx on MessageBoxA now in order to land right in the interesting code. So, do just that and trace upward and you'll see this:

:00442CC2 E870DBFFFF              call 00440837
:00442CC7 3D22334455              cmp eax, 55443322	;Whoah! What a nice hardcoded value!
:00442CCC 7472                    je 00442D40		;Take this jump if you want to jump
                            ;over the messagebox!
:00442CCE 6810200100              push 00012010
:00442CD3 FF35843B4800            push dword ptr [00483B84]
:00442CD9 83C4FC                  add esp, FFFFFFFC
:00442CDC 66C70424BE00            mov word ptr [esp], 00BE
:00442CE2 E8C16FFFFF              call 00439CA8
:00442CE7 50                      push eax
:00442CE8 6A00                    push 00000000
:00442CEA E80AEF0300		  call USER32!MessageBoxA
You can see directly that something is fuzzy about the "cmp eax, 55443322" line. That looks VERY suspicious if you ask me (why not say "Hey Cracker! I'm here!!!" instead). Now we could quickly crack this just by changing the "je 00442D40" instruction to "jmp 00442D40" but we wont do that. The program might save the value returned in eax and use it later on for more checksum-checking (this is infact true for this program) so instead we want the above call to return 55443322. So, let's trace the call! You'll soon find this piece of code:
:00440DAE E8B504FCFF              call 00401268
:00440DB3 83C40C                  add esp, 0000000C
:00440DB6 85C0                    test eax, eax
:00440DB8 752E                    jne 00440DE8
:00440DBA A1803B4800              mov eax, dword ptr [00483B80]
:00440DBF 8B10                    mov edx, dword ptr [eax]
:00440DC1 8B0D243B4800            mov ecx, dword ptr [00483B24]
:00440DC7 8911                    mov dword ptr [ecx], edx
:00440DC9 B822334455              mov eax, 55443322	;We want this!
:00440DCE 50                      push eax
Now, this isnt very hard either. As the program is already patched the call at line 440DAE will return eax<>0 and thus the jump will be taken. Btw that call is our good old "comparision" call. As you see it's used quite a lot in the program so it was a good idea not to patch there! Now just nop away the jump. 55443322 will be stored in eax and the checksum routine thinks that everything is alright and we have a fully functional registered copy of BrainsBreaker!

Step 5 - Making a nice crack!
You can skip this part if you want to. This step is not really necessary, but if we were to release a crack for this program we had to make a nice looking patcher. The problem is that we dont know how to bring up the "enter registraion info" window, and thus the user wouldnt have anywhere to enter his name. We can solve this by making our own little "registraion window" that asks for a username in our patcher. If you look where BrainsBreaker saves the registraion information you will see that all of the reg-info is saved in the "BBRK.INI" file. It will save both plaintext and encrypted values. It will look something like this:

[PackFull]			;What pack we're using
0=Cruehead			;Username plain text
1=123				;ID plain text
2=7E15AB3D1516D6		;Serial encrypted
3=2100				;Not sure. I believe it's version number
4=192BEC6D323CF86C		;Username encrypted
5=6B6BAA			;ID encrypted
Of course I didnt know all of this before I fully examined the program. I started out by putting a breakpoint on GetPrivateProfileStringA and when the encrypted serial line was read I put a bpr on that so I would see what was happening to that string. I wont describe every step on how I did it because it's fairly easy. Instead I'll try to describe how it works:

Every two letters in '7E15AB3D1516D6' is in fact one byte. So first of all the string is transformed so it looks like this : 7E 15 AB 3D 15 16 D6 . 7 bytes that is. Now this string is Xor'ed against a four byte long string that was "5A 59 99 08". This string caught my curiosity because it didnt look like a hardcoded value and neither could I find it in the .EXE file but I continued nevertheless, not worring aout it. The strings was xor'ed like this:

String from INI file: | 7E | 15 | AB | 3D | 15 | 16 | D6
Four byte string: | 5A | 59 | 99 | 08 | 5A | 59 | 99
Result after XOR: | 24 | 4C | 32 | 35 | 4F | 4F | 4F

You see? The result is '$L25OOO'. Our entered serial string (somewhat transformed). The same procedure is done with the two other encrypted strings. If the decrypted username matches the username in plain text and if the decrypted ID matches the ID in plain text, then the program executes the registration check with the decrypted serial. The program will gladly accept it because we have patched the last check!

Ok, I sat down one night and coded this crack. It worked great on my computer but when I tried it on another computer it simply didnt work! Back to the drawing board again. It turned out that I was right when thinking that the 4 bytes xor string was strange. After some more examination I found out that this value was created from a special ID which is stored in the registry. The ID is created the first time brainsbreaker is installed and there is'nt much point in reversing the algorigthm for creating a BrainsBreaker ID becuase it uses the "TlsGetValue" function as source. The complete ID is about 50 bytes long but only 8 of these bytes are used to create the xor string (if you're really interested byte number 5,10,8,13,17,19,22,38 of the ID is used to make the xorstring). That's why my crack didnt work on the other machine - when I installed BrainsBreaker for the first time a different ID was created and thus also a different xorstring. So I sat down another night and re-coded the crack, this time for windows as we need to access the registry. This time the crack worked like a sharm on both machines! Oh joy oh joy!

Thoughts about BrainsBreaker
This is not important for the crack, but it's never the less very interesting. I'm not sure about this but it looks like every puzzle is a stand-alone part of the program. Every puzzle stores a number of things including the name of the author of the puzzle, if the main program has been altered, wether this puzzle is free/demo/registered and a number of other things. My guess is that these values (or flags) are stored directly after the mainprogram checks if it's registered or not. This way every puzzle can check if the main program has been cracked. But we dont have to care about all of this because the crack I presented above takes care of everything :). None of these flags are stored directly in the .exe file, instead they are stored in encrypted state. At startup these puzzles are decrypted using different keysources but the most common seems to be "(c)J. Trujillo T." I managed to get this info by stumbeling across a "xor [edi],al" function when the program was loading the startup screen with all the puzzles. That of course cought my interest and I started to examine it a bit more closer.

A small hint : It's a good idea to search the deadlisting for "MessageBoxA" functions as these can give you alot of usefull information sometimes. Fake a flag or something to make the program show the messagebox. For example I found out that every puzzle stores if the main program has been altered or not (if it has, a value of 12345 is stored in each of the puzzles) using this method.

But there are some things that remains a mystery for me still. I havnt been able to figure out how to bring up the registration-window yet and you can find a few very interesting functions if you look at the dead-listing:

Addr:00487ABC Ord:  14 (000Eh) Name: __DebuggerHookData
Addr:004035BC Ord:  15 (000Fh) Name: __lockDebuggerData(void)
Addr:004035E4 Ord:  16 (0010h) Name: __unlockDebuggerData(void)
Antidebugging functions problaby but I havnt seen any marks of them. Pretty strange...

Conclusion - BrainsBreaker:
A somewhat complicated protection scheme, but nothing that we havnt seen before. The hidden registraion window is a good idea but it's far to easy to find it using a dead-listing approach.

标 题:破BrainsBreaker3.0[07b]! (9千字)
发信人:zest
时 间:2001-3-10 0:11:50
详细信息:

破BrainsBreaker3.0[07b]!
http://www.brainsbreaker.com/download.htm
非常感谢1212提供的Cruehead的优秀教程。
如有疑问，请参看此教程!
http://www.instinct.org/fravia/99solu/cruecom.htm

===========================================================
1、Key运算检测，最后保证[eax]为0，可BPM跟踪。
0167:00426D93 8BC1 MOV EAX,ECX
0167:00426D95 99 CDQ
0167:00426D96 F7FF IDIV EDI
0167:00426D98 8D041A LEA EAX,[EDX+EBX]
0167:00426D9B 8A1431 MOV DL,[ECX+ESI]
0167:00426D9E 3010 XOR [EAX],DL ******
0167:00426DA0 41 INC ECX
0167:00426DA1 3B4DF8 CMP ECX,[EBP-08]
0167:00426DA4 7CED JL 00426D93---->循环9次

改为：
0167:00426D93 8BC1 MOV EAX,ECX
0167:00426D95 99 CDQ
0167:00426D96 F7FF IDIV EDI
0167:00426D98 8D041A LEA EAX,[EDX+EBX]
0167:00426D9B 8A10 MOV DL,[EAX] ******
0167:00426D9D 90 NOP
0167:00426D9E 3010 XOR [EAX],DL ******we shall have a final value of zero
0167:00426DA0 41 INC ECX
0167:00426DA1 3B4DF8 CMP ECX,[EBP-08]
0167:00426DA4 7CED JL 00426D93
===========================================================
2、Pack、Name、Your ID运算检测，对比处可BPM跟踪。
0167:00427587 33C9 XOR ECX,ECX
0167:00427589 8BC1 MOV EAX,ECX
0167:0042758B 668B7D0C MOV DI,[EBP+0C]
0167:0042758F 99 CDQ
0167:00427590 F77DFC IDIV DWORD [EBP-04]
0167:00427593 8B45F8 MOV EAX,[EBP-08]
0167:00427596 03D0 ADD EDX,EAX
0167:00427598 663B7DE4 CMP DI,[EBP-1C]
0167:0042759C 8A02 MOV AL,[EDX]
0167:0042759E 7306 JNC 004275A6
0167:004275A0 8B7DE8 MOV EDI,[EBP-18]
0167:004275A3 32040F XOR AL,[EDI+ECX]
0167:004275A6 668B7D0C MOV DI,[EBP+0C]
0167:004275AA 663B7E0C CMP DI,[ESI+0C]
0167:004275AE 7306 JNC 004275B6
0167:004275B0 8B7E10 MOV EDI,[ESI+10]
0167:004275B3 32040F XOR AL,[EDI+ECX]
0167:004275B6 668B7D0C MOV DI,[EBP+0C]
0167:004275BA 663B7E14 CMP DI,[ESI+14]
0167:004275BE 7306 JNC 004275C6
0167:004275C0 8B7E18 MOV EDI,[ESI+18]
0167:004275C3 32040F XOR AL,[EDI+ECX]
0167:004275C6 FF450C INC DWORD [EBP+0C]
0167:004275C9 8802 MOV [EDX],AL
0167:004275CB 0FB74D0C MOVZX ECX,WORD [EBP+0C]
0167:004275CF 83F920 CMP ECX,BYTE +20
0167:004275D2 7CB5 JL 00427589---->循环20h次
0167:004275D4 FF75F4 PUSH DWORD [EBP-0C]

改为：(乱改程序会崩溃!)
0167:00427587 33C9 XOR ECX,ECX
0167:00427589 C745FC00000000 MOV DWORD [EBP-04],00 ******because zero bytes will be compared
0167:00427590 E93F000000 JMP 004275D4 ******
0167:00427595 F8 CLC
0167:00427596 03D0 ADD EDX,EAX
0167:00427598 663B7DE4 CMP DI,[EBP-1C]
0167:0042759C 8A02 MOV AL,[EDX]
0167:0042759E 7306 JNC 004275A6
0167:004275A0 8B7DE8 MOV EDI,[EBP-18]
0167:004275A3 32040F XOR AL,[EDI+ECX]
0167:004275A6 668B7D0C MOV DI,[EBP+0C]
0167:004275AA 663B7E0C CMP DI,[ESI+0C]
0167:004275AE 7306 JNC 004275B6
0167:004275B0 8B7E10 MOV EDI,[ESI+10]
0167:004275B3 32040F XOR AL,[EDI+ECX]
0167:004275B6 668B7D0C MOV DI,[EBP+0C]
0167:004275BA 663B7E14 CMP DI,[ESI+14]
0167:004275BE 7306 JNC 004275C6
0167:004275C0 8B7E18 MOV EDI,[ESI+18]
0167:004275C3 32040F XOR AL,[EDI+ECX]
0167:004275C6 FF450C INC DWORD [EBP+0C]
0167:004275C9 8802 MOV [EDX],AL
0167:004275CB 0FB74D0C MOVZX ECX,WORD [EBP+0C]
0167:004275CF 83F920 CMP ECX,BYTE +20
0167:004275D2 7CB5 JL 00427589
0167:004275D4 FF75F4 PUSH DWORD [EBP-0C]
===========================================================
3、程序注册检验对比处及是否被修改检验处如下：
* Referenced by a CALL at Addresses:
|:00405FC3 , :00420734 , :004213E0 , :004225A3 , :00426DAE
|:0042763A , :00427788 , :00459AF8 , :0046EBF0 , :00470C39
|:004800B5 , :00491CC4
|
:00495EC0 8B44240C mov eax, dword ptr [esp+0C]
:00495EC4 85C0 test eax, eax
:00495EC6 7444 je 00495F0C
:00495EC8 8B542404 mov edx, dword ptr [esp+04]
:00495ECC 56 push esi
:00495ECD 57 push edi
:00495ECE 8BF2 mov esi, edx
:00495ED0 8B7C2410 mov edi, dword ptr [esp+10]
:00495ED4 0BD7 or edx, edi
:00495ED6 83E203 and edx, 00000003
:00495ED9 7432 je 00495F0D
:00495EDB A901000000 test eax, 00000001
:00495EE0 740B je 00495EED
:00495EE2 8A0E mov cl, byte ptr [esi]
:00495EE4 3A0F cmp cl, byte ptr [edi]
:00495EE6 7552 jne 00495F3A
:00495EE8 46 inc esi
:00495EE9 47 inc edi
:00495EEA 48 dec eax
:00495EEB 741D je 00495F0A

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495EE0(C), :00495F08(C)
|
:00495EED 8A0E mov cl, byte ptr [esi]
:00495EEF 8A17 mov dl, byte ptr [edi]
:00495EF1 38D1 cmp cl, dl
:00495EF3 7545 jne 00495F3A
:00495EF5 8A4E01 mov cl, byte ptr [esi+01]
:00495EF8 8A5701 mov dl, byte ptr [edi+01]
:00495EFB 38D1 cmp cl, dl
:00495EFD 753B jne 00495F3A
:00495EFF 83C702 add edi, 00000002
:00495F02 83C602 add esi, 00000002
:00495F05 83E802 sub eax, 00000002
:00495F08 75E3 jne 00495EED

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495EEB(C), :00495F44(C)
|
:00495F0A 5F pop edi
:00495F0B 5E pop esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00495EC6(C)
|
:00495F0C C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00495ED9(C)
|
:00495F0D 8BC8 mov ecx, eax
:00495F0F 83E003 and eax, 00000003
:00495F12 C1E902 shr ecx, 02
:00495F15 742B je 00495F42
:00495F17 F3 repz
:00495F18 A7 cmpsd
:00495F19 7427 je 00495F42
:00495F1B 8B4EFC mov ecx, dword ptr [esi-04]
:00495F1E 8B57FC mov edx, dword ptr [edi-04]
:00495F21 38D1 cmp cl, dl
:00495F23 7510 jne 00495F35
:00495F25 38F5 cmp ch, dh
:00495F27 750C jne 00495F35
:00495F29 C1E910 shr ecx, 10
:00495F2C C1EA10 shr edx, 10
:00495F2F 38D1 cmp cl, dl
:00495F31 7502 jne 00495F35
:00495F33 38F5 cmp ch, dh

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495F23(C), :00495F27(C), :00495F31(C), :00495F4C(C), :00495F53(C)
|:00495F66(C)
|
:00495F35 B800000000 mov eax, 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495EE6(C), :00495EF3(C), :00495EFD(C)
|
:00495F3A 1BC0 sbb eax, eax
:00495F3C 5F pop edi
:00495F3D 83D8FF sbb eax, FFFFFFFF
:00495F40 5E pop esi
:00495F41 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495F15(C), :00495F19(C)
|
:00495F42 85C0 test eax, eax
:00495F44 74C4 je 00495F0A
:00495F46 8B16 mov edx, dword ptr [esi]
:00495F48 8B0F mov ecx, dword ptr [edi]
:00495F4A 38CA cmp dl, cl
:00495F4C 75E7 jne 00495F35
:00495F4E 48 dec eax
:00495F4F 7418 je 00495F69
:00495F51 38EE cmp dh, ch
:00495F53 75E0 jne 00495F35
:00495F55 48 dec eax
:00495F56 7411 je 00495F69
:00495F58 81E10000FF00 and ecx, 00FF0000
:00495F5E 81E20000FF00 and edx, 00FF0000
:00495F64 3BD1 cmp edx, ecx
:00495F66 75CD jne 00495F35
:00495F68 48 dec eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495F4F(C), :00495F56(C)
|
:00495F69 5F pop edi
:00495F6A 5E pop esi
:00495F6B C3 ret
不能乱改，否则崩溃，程序其他部分还会调用此处，此乃程序高明之处。
===========================================================
4、程序被修改提示框的去除我用R!SC'sPatcher v1.4做PATCH，
   非常简单，按1,2改。软件可在TOYE工具处下载。
我的bbrk32.rpp如下：
F=bbrk32.exe:
O=cr_bbrk32.exe:
P=426d9c/14,31/10,90:
P=427589/8b,c1,66,8b,7d,0c,99,f7,7d,fc,8b,45/c7,45,fc,00,00,00,00,e9,3f,00,00,00:
$
===========================================================
5、运行生成的cr_bbrk32.exe，
We have a fully functional REGISTERED copy of BrainsBreaker3.0[07b]!
===========================================================

/\zest/\2001.3.8


CCProxy 4.11

 标 题:CCproxy最新版破解,有个小小的玩笑 (17千字)
发信人:TAE!
时 间:2001-8-15 23:24:15
详细信息:
目标软件:CCProxy 4.11
保护方式:注册码
破解人:TAE![CCG][BCG][FCG]
破解方式:算注册码

运行软件发现程序自动生成一个机器码,需要让用户输入序列号和注册码,你可以随便输入
一些,我输入的是:
序列号:12345678
注册码:78787878

进入TRW设置断点 bpx hmemcpy,回到程序点注册,这时被TRW拦住,按两次F5,为什么?因为第
三次按F5,错误提示就出来了,其实系统使用了三次USER32.GetWindowTextA函数分别读取机
器码,序列号和注册码,那么我们当然要在系统读取机器码和序列号之后进行跟踪喽,按过两
次F5之后,便是程序第三次调用USER32.GetWindowTextA来读取注册码了,这时候, 我们被中
断在系统函数hmemcpy的附近,那么我们要回到程序中呀,所以下命令pmodule,这时来到了下
面这里:

* Reference To: USER32.GetWindowTextA, Ord:015Eh //其实你也可以直接下这个断点的
^^^^^^^^^^^^^^^^^^^^^^
:0042C9DD FF15FC434300 Call dword ptr [004343FC]
:0042C9E3 8B4D10 mov ecx, dword ptr [ebp+10] //应该回到了这里
:0042C9E6 6AFF push FFFFFFFF
:0042C9E8 E8BCC7FFFF call 004291A9
:0042C9ED EB0B jmp 0042C9FA

:0042C9EF 8B4510 mov eax, dword ptr [ebp+10]
:0042C9F2 FF30 push dword ptr [eax]
:0042C9F4 56 push esi
:0042C9F5 E8EEF1FFFF call 0042BBE8

:0042C9FA 5F pop edi
:0042C9FB 5E pop esi
:0042C9FC 5D pop ebp
:0042C9FD C20C00 ret 000C

一直跟着它走,来到这里:

:00405944 8B8620020000 mov eax, dword ptr [esi+00000220]

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:02E5h
|
:0040594A 8B1D18424300 mov ebx, dword ptr [00434218]
:00405950 8D7E5C lea edi, dword ptr [esi+5C]
:00405953 57 push edi //edi是文件名,也就是CCProxy.ini
:00405954 50 push eax

* Possible StringData Ref from Data Obj ->"RegCode"
|
:00405955 68B0014400 push 004401B0

* Possible StringData Ref from Data Obj ->"System"
|
:0040595A 68D8024400 push 004402D8
:0040595F FFD3 call ebx //这里是调用WritePrivateProfileStringA,
:00405961 8B8624020000 mov eax, dword ptr [esi+00000224]
:00405967 57 push edi //edi是文件名,也就是CCProxy.ini
:00405968 50 push eax

* Possible StringData Ref from Data Obj ->"UserName"
|
:00405969 681C024400 push 0044021C

* Possible StringData Ref from Data Obj ->"System"
|
:0040596E 68D8024400 push 004402D8
:00405973 FFD3 call ebx //这里是调用WritePrivateProfileStringA,
:00405975 8B862C020000 mov eax, dword ptr [esi+0000022C]
:0040597B 57 push edi //edi是文件名,也就是CCProxy.ini
:0040597C 50 push eax

* Possible StringData Ref from Data Obj ->"SerialCode"
|
:0040597D 68C0014400 push 004401C0

* Possible StringData Ref from Data Obj ->"System"
|
:00405982 68D8024400 push 004402D8
:00405987 FFD3 call ebx //这里是调用WritePrivateProfileStringA,

经过跟踪不能发现,上面一段程序是将序列号,注册码写入文件CCProxy.ini中
格式是这样的:
=====================
[System]
Setup=1
RegCode=78787878
UserName=
SerialCode=12345678
=====================
跟踪到这里我就发现这个程序很奇怪,一般来说程序注册的过程应该是这样的,
即判断注册码的合法性,如果正确那么写入注册表或者是文件中,错误的话应该
不写入的,而这个程序还没有判断正误就将注册信息写入了文件,奇怪!另外如
你仔细观察机器码,你会发现每次注册,机器码都会改变,奇怪!可能会有陷阱!
无论如何我们还是继续跟踪吧!

:00405989 E8F2D4FFFF call 00402E80 //这里要进入哟,因为下面就是关键的跳转了
:0040598E F7D8 neg eax
:00405990 1BC0 sbb eax, eax
:00405992 40 inc eax
:00405993 A3BC034400 mov dword ptr [004403BC], eax
:00405998 A1240E4400 mov eax, dword ptr [00440E24]
:0040599D 8944240C mov dword ptr [esp+0C], eax
:004059A1 BB00000000 mov ebx, 00000000
:004059A6 895C241C mov dword ptr [esp+1C], ebx
:004059AA 747D je 00405A29 //关键的跳转.
:004059AC 8D4C2410 lea ecx, dword ptr [esp+10]

* Possible Reference to String Resource ID=00128: "CCProxy v4.11(evaluation version only for 5 clients)"
|
:004059B0 6880000000 push 00000080
:004059B5 51 push ecx
:004059B6 E885D6FFFF call 00403040
:004059BB 83C408 add esp, 00000008
:004059BE 50 push eax
:004059BF 8D4C2410 lea ecx, dword ptr [esp+10]
:004059C3 C644242001 mov [esp+20], 01
:004059C8 E8AB340200 call 00428E78
:004059CD 8D4C2410 lea ecx, dword ptr [esp+10]
:004059D1 885C241C mov byte ptr [esp+1C], bl
:004059D5 E865330200 call 00428D3F
:004059DA E8833A0200 call 00429462
:004059DF 3BC3 cmp eax, ebx
:004059E1 7409 je 004059EC
:004059E3 8B10 mov edx, dword ptr [eax]
:004059E5 8BC8 mov ecx, eax
:004059E7 FF5274 call [edx+74]
:004059EA EB02 jmp 004059EE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004059E1(C)
|
:004059EC 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004059EA(U)
|
:004059EE 8B4C240C mov ecx, dword ptr [esp+0C]
:004059F2 51 push ecx
:004059F3 8BC8 mov ecx, eax
:004059F5 E85C2E0200 call 00428856
:004059FA 8D542410 lea edx, dword ptr [esp+10]

* Possible Reference to String Resource ID=00126: "Register failed!"
|
:004059FE 6A7E push 0000007E
:00405A00 52 push edx
:00405A01 E83AD6FFFF call 00403040
:00405A06 83C408 add esp, 00000008
:00405A09 50 push eax
:00405A0A 8D4C2410 lea ecx, dword ptr [esp+10]
:00405A0E C644242002 mov [esp+20], 02
:00405A13 E860340200 call 00428E78
:00405A18 8D4C2410 lea ecx, dword ptr [esp+10]
:00405A1C 885C241C mov byte ptr [esp+1C], bl
:00405A20 E81A330200 call 00428D3F
:00405A25 53 push ebx
:00405A26 53 push ebx
:00405A27 EB79 jmp 00405AA2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004059AA(C)
|
:00405A29 8D4C2410 lea ecx, dword ptr [esp+10]

* Possible Reference to String Resource ID=00127: "CCProxy v4.11"
|
:00405A2D 6A7F push 0000007F
:00405A2F 51 push ecx
:00405A30 E80BD6FFFF call 00403040
:00405A35 83C408 add esp, 00000008
:00405A38 50 push eax
:00405A39 8D4C2410 lea ecx, dword ptr [esp+10]
:00405A3D C644242003 mov [esp+20], 03
:00405A42 E831340200 call 00428E78
:00405A47 8D4C2410 lea ecx, dword ptr [esp+10]
:00405A4B 885C241C mov byte ptr [esp+1C], bl
:00405A4F E8EB320200 call 00428D3F
:00405A54 E8093A0200 call 00429462
:00405A59 3BC3 cmp eax, ebx
:00405A5B 7409 je 00405A66
:00405A5D 8B10 mov edx, dword ptr [eax]
:00405A5F 8BC8 mov ecx, eax
:00405A61 FF5274 call [edx+74]
:00405A64 EB02 jmp 00405A68

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405A5B(C)
|
:00405A66 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405A64(U)
|
:00405A68 8B4C240C mov ecx, dword ptr [esp+0C]
:00405A6C 51 push ecx
:00405A6D 8BC8 mov ecx, eax
:00405A6F E8E22D0200 call 00428856
:00405A74 8D542410 lea edx, dword ptr [esp+10]

* Possible Reference to String Resource ID=00125: "Register successfully!"
|
:00405A78 6A7D push 0000007D
:00405A7A 52 push edx
:00405A7B E8C0D5FFFF call 00403040
:00405A80 83C408 add esp, 00000008
:00405A83 50 push eax
:00405A84 8D4C2410 lea ecx, dword ptr [esp+10]
:00405A88 C644242004 mov [esp+20], 04
:00405A8D E8E6330200 call 00428E78
:00405A92 8D4C2410 lea ecx, dword ptr [esp+10]
:00405A96 885C241C mov byte ptr [esp+1C], bl
:00405A9A E8A0320200 call 00428D3F
:00405A9F 53 push ebx
:00405AA0 6A40 push 00000040

现在我们就进入call 00402E80吧!

* Referenced by a CALL at Addresses:
|:00403F41 , :004048C5 , :0040539A , :00405989
|
:00402E80 64A100000000 mov eax, dword ptr fs:[00000000]
:00402E86 6AFF push FFFFFFFF
:00402E88 6831184300 push 00431831
:00402E8D 50 push eax
:00402E8E B80C100000 mov eax, 0000100C
:00402E93 64892500000000 mov dword ptr fs:[00000000], esp
:00402E9A E8113A0100 call 004168B0
:00402E9F A1240E4400 mov eax, dword ptr [00440E24]
:00402EA4 56 push esi
:00402EA5 57 push edi
:00402EA6 89442408 mov dword ptr [esp+08], eax
:00402EAA C784241C10000000000000 mov dword ptr [esp+0000101C], 00000000
:00402EB5 E890AF0200 call 0042DE4A
:00402EBA 8B4004 mov eax, dword ptr [eax+04]
:00402EBD 8B888C000000 mov ecx, dword ptr [eax+0000008C]
:00402EC3 51 push ecx
:00402EC4 8D4C240C lea ecx, dword ptr [esp+0C]
:00402EC8 E8FB5F0200 call 00428EC8
:00402ECD 6A2E push 0000002E
:00402ECF 8D4C240C lea ecx, dword ptr [esp+0C]
:00402ED3 E8B1070200 call 00423689
:00402ED8 8D542410 lea edx, dword ptr [esp+10]
:00402EDC 50 push eax
:00402EDD 52 push edx
:00402EDE 8D4C2410 lea ecx, dword ptr [esp+10]
:00402EE2 E82A070200 call 00423611
:00402EE7 50 push eax
:00402EE8 8D4C240C lea ecx, dword ptr [esp+0C]
:00402EEC C684242010000001 mov byte ptr [esp+00001020], 01
:00402EF4 E87F5F0200 call 00428E78
:00402EF9 8D4C2410 lea ecx, dword ptr [esp+10]
:00402EFD C684241C10000000 mov byte ptr [esp+0000101C], 00
:00402F05 E8355E0200 call 00428D3F
:00402F0A A1240E4400 mov eax, dword ptr [00440E24]
:00402F0F 8944240C mov dword ptr [esp+0C], eax
:00402F13 8B4C2408 mov ecx, dword ptr [esp+08]
:00402F17 8D54240C lea edx, dword ptr [esp+0C]
:00402F1B 51 push ecx

* Possible StringData Ref from Data Obj ->"%s.ini"
|
:00402F1C 68CC014400 push 004401CC
:00402F21 52 push edx
:00402F22 C684242810000002 mov byte ptr [esp+00001028], 02
:00402F2A E8BD0A0200 call 004239EC
:00402F2F 8B442418 mov eax, dword ptr [esp+18]
:00402F33 83C40C add esp, 0000000C

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:013Ah
|
:00402F36 8B3520424300 mov esi, dword ptr [00434220]
:00402F3C 8D8C2414080000 lea ecx, dword ptr [esp+00000814]
:00402F43 50 push eax
:00402F44 6800040000 push 00000400
:00402F49 51 push ecx
:00402F4A 68802C4400 push 00442C80

* Possible StringData Ref from Data Obj ->"SerialCode"
|
:00402F4F 68C0014400 push 004401C0

* Possible StringData Ref from Data Obj ->"system"
|
:00402F54 68B8014400 push 004401B8
:00402F59 FFD6 call esi
:00402F5B 8B54240C mov edx, dword ptr [esp+0C]
:00402F5F 8D842414040000 lea eax, dword ptr [esp+00000414]
:00402F66 52 push edx
:00402F67 6800040000 push 00000400
:00402F6C 50 push eax
:00402F6D 68802C4400 push 00442C80

* Possible StringData Ref from Data Obj ->"RegCode"
|
:00402F72 68B0014400 push 004401B0

* Possible StringData Ref from Data Obj ->"system"
|
:00402F77 68B8014400 push 004401B8
:00402F7C FFD6 call esi
:00402F7E 8D4C2410 lea ecx, dword ptr [esp+10]
:00402F82 51 push ecx
:00402F83 E8B8FEFFFF call 00402E40 //这个就是生成机器码的地方!

上面是从文件CCproxy.ini中读取数据,并产生机器码,
我系统生成的机器码是"080808082808",(后来发现是个假的)
继续跟踪,一直来到这里:

:00402FCC 52 push edx //这个是机器码"080808082808"
:00402FCD 50 push eax //这个是你输入的注册码"78787878"
:00402FCE E83DFBFFFF call 00402B10 //算注册码的call
:00402FD3 8D8C2400000000 lea ecx, dword ptr [esp]
:00402FDA 6A0C push 0000000C
:00402FDC 8D9424240C0000 lea edx, dword ptr [esp+00000C24]
:00402FE3 52 push edx
:00402FE4 52 push edx
:00402FE5 E886380100 call 00416870

进入call 00402B10 然后一直按F10,一直来到这里:
程序会根据"microserver0"和"ccproxy20010"还有你的序列号来生成注册码.
:00402B8E 8B442434 mov eax, dword ptr [esp+34]
:00402B92 0FBE0408 movsx eax, byte ptr [eax+ecx];将microserver0的字符依次传给eax
:00402B96 0FBE140B movsx edx, byte ptr [ebx+ecx];将ccproxy20010的字符依次传给eax
:00402B9A 03C2 add eax, edx ;相加给eax
:00402B9C BD3E000000 mov ebp, 0000003E ;"3E"给ebp
:00402BA1 0FBE140F movsx edx, byte ptr [edi+ecx];将序列号的字符依次传给edx
:00402BA5 03C2 add eax, edx ;相加给eax
:00402BA7 0FBE11 movsx edx, byte ptr [ecx] ;将机器码的字符依次传给edx
:00402BAA 03C2 add eax, edx ;再相加给eax
:00402BAC 99 cdq
:00402BAD F7FD idiv ebp ;最后的和除以ebp,也就是"3E"余数给dl
:00402BAF 83FA1A cmp edx, 0000001A ;大于"1A"吗?
:00402BB2 7D05 jge 00402BB9 ;大于就跳
:00402BB4 80C261 add dl, 61 ;小于就加上61
:00402BB7 EB0D jmp 00402BC6 ;跳到00402bc6处

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402BB2(C)
|
:00402BB9 83FA34 cmp edx, 00000034 ;大于"34"吗?
:00402BBC 7D05 jge 00402BC3 ;大于就跳
:00402BBE 80C227 add dl, 27 ;小于就减去"27"
:00402BC1 EB03 jmp 00402BC6 ;跳到00402bc6处

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402BBC(C)
| |
:00402BC3 80EA04 sub dl, 04 ;上面如果小于就到了这里,减去"4"

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402BB7(U), :00402BC1(U)
|
:00402BC6 8B442438 mov eax, dword ptr [esp+38]
:00402BCA 88140E mov byte ptr [esi+ecx], dl ;保存注册码!
:00402BCD 41 inc ecx ;指向下一个机器码的字符
:00402BCE 48 dec eax ;计数器
:00402BCF 89442438 mov dword ptr [esp+38], eax
:00402BD3 75B9 jne 00402B8E ;形成循环
上面就是形成注册码的过程.
:00402BD5 5F pop edi //到了这里你可以用d esp+38来查看注册码
:00402BD6 5E pop esi
:00402BD7 5D pop ebp
:00402BD8 5B pop ebx
:00402BD9 83C420 add esp, 00000020
:00402BDC C3 ret

用这个注册码注册,显示注册成功,可是再次运行软件,还是没是未注册版,那么我们将断点设在
生产注册码后的地方,也就是00402BD5这里,重新运行程序,第一次中断,下命令查看注册码显示
的就是刚才程序生产的假注册码,下命令 g,再次被中断,这时再次查看注册码,这个就是真的注
册码了,只不过你不能在注册对话框输入,只能在文件中修改,呵呵,就这样吧!


CCProxy4.0

 标 题:多谢版主！我是用来做CCProxy4.0的注册机用的。第一个注册机。光做花了我近一个小时。 (2千字)
发信人:WenXinJY
时 间:2001-7-24 23:24:40
详细信息:
:00402C1E 8B442434 mov eax, dword ptr [esp+34]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402C1C(U)
|
:00402C22 0FBE0408 movsx eax, byte ptr [eax+ecx] ;指向字符串 microserver0,12位，参与注册码的计算
:00402C26 0FBE140B movsx edx, byte ptr [ebx+ecx] ;指向字符串 ccproxy20010,12位，参与注册码的计算
:00402C2A 03C2 add eax, edx ；加
:00402C2C BD3E000000 mov ebp, 0000003E ；将来算注册码时作除数用的
:00402C31 0FBE140F movsx edx, byte ptr [edi+ecx] ;指向“序列号”,最多12位，不足12位的，后面补两个0x0，余下的位数用特征码的相应位补充，参与注册码的计算
:00402C35 03C2 add eax, edx ；加
:00402C37 0FBE11 movsx edx, byte ptr [ecx] ;指向“特征码”,12位，参与注册码的计算
:00402C3A 03C2 add eax, edx ；加
至此为止加完四个字符串的相应位
:00402C3C 99 cdq
:00402C3D F7FD idiv ebp ；除以0x3e，得余数有用
:00402C3F 83FA1A cmp edx, 0000001A ；余数>0x1a,则转向下一判断
:00402C42 7D05 jge 00402C49
:00402C44 80C261 add dl, 61 ；小于0x1a则加上0x61
:00402C47 EB0D jmp 00402C56

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402C42(C)
|
:00402C49 83FA34 cmp edx, 00000034 ；若大于0x1a再看是否大于0x34
:00402C4C 7D05 jge 00402C53 ；不小于则转向402c53，减去4
:00402C4E 80C227 add dl, 27 ；小于则加上0x27
:00402C51 EB03 jmp 00402C56 ；每位注册码都这样算。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402C4C(C)
|
:00402C53 80EA04 sub dl, 04

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402C47(U), :00402C51(U)
|
:00402C56 8B442438 mov eax, dword ptr [esp+38]
:00402C5A 88140E mov byte ptr [esi+ecx], dl ；保存注册码
:00402C5D 41 inc ecx
:00402C5E 48 dec eax ；计数剩余的注册码位数，没算完则继续
:00402C5F 89442438 mov dword ptr [esp+38], eax
:00402C63 75B9 jne 00402C1E

注册机：

代理服务器软件CCProxy 4.0的注册机。

下载地址：http://software.wx88.net/down/ccproxy40.zip

注册机: (tc2.0编译通过:tcc -mt -lt crk-ccp)

#include "stdio.h"
/* Key Generator for CCProxy Ver 4.0 */
/* tcc -mt -lt crk-ccp */
main()
{
char *str1="microserver0";
char *str2="ccproxy20010";
char setup[13];
char rn[13];
char sn[13];
int i=0;
int temp;
L1:
puts("请输入您的特征码(共12位)：");
gets(setup);
if(strlen(setup)-12)goto L1;
L2:
puts("请输入您的序列号(共12位)：");
gets(rn);
if(strlen(rn)-12)goto L2;
for(i=0;i<12;i++)
{
temp=(str1[i]+str2[i]+setup[i]+rn[i])%0x3e;
sn[i]=temp>=0x1a?(temp>=0x34?temp-4:temp+0x27):(temp+0x61);
}
sn[i]=0;
printf("\n\n多谢使用西风瘦马的第一个注册机！\n您的注册码是: %s",sn);
getch();
}


CD Keeper 1.0

 标 题:CD Keeper 1.0 (4千字)
发信人:6767[BCG]
时 间:2001-7-26 22:48:52
详细信息:
CD Keeper 1.0
by Fpc[CCG] @2001/07

tools:softice

又是个VB程序，1.0版，界面作的不好看，功能不清楚。

在注册窗口，输入信息后下Bpx hmemcpy，拦截可追到下面：

|
:004366A4 8B4DDC mov ecx, dword ptr [ebp-24] <- 输入的注册码
:004366A7 51 push ecx
:004366A8 FF1524104000 call dword ptr [00401024] <- 返回长度
:004366AE 8B55E0 mov edx, dword ptr [ebp-20]
:004366B1 33DB xor ebx, ebx
:004366B3 83F810 cmp eax, 00000010 <- 是否为16字节
:004366B6 52 push edx
:004366B7 0F94C3 sete bl
:004366BA F7DB neg ebx
:004366BC FF1524104000 call dword ptr [00401024]
:004366C2 8B55E4 mov edx, dword ptr [ebp-1C]
:004366C5 33C9 xor ecx, ecx
:004366C7 83F808 cmp eax, 00000008 <- 这个比较不用理
:004366CA 52 push edx
:004366CB 0F94C1 sete cl
:004366CE F7D9 neg ecx
:004366D0 68D4294100 push 004129D4
:004366D5 0BD9 or ebx, ecx
:004366D7 FF15B8104000 call dword ptr [004010B8] <- 验证是否为空串
:004366DD F7D8 neg eax
:004366DF 1BC0 sbb eax, eax
:004366E1 F7D8 neg eax
:004366E3 F7D8 neg eax
:004366E5 23D8 and ebx, eax
:004366E7 8B45E8 mov eax, dword ptr [ebp-18]
:004366EA 50 push eax
:004366EB 68D4294100 push 004129D4
:004366F0 FF15B8104000 call dword ptr [004010B8] <- 验证是否为空串
:004366F6 F7D8 neg eax
:004366F8 1BC0 sbb eax, eax
:004366FA 8D4DDC lea ecx, dword ptr [ebp-24]
:004366FD F7D8 neg eax
:004366FF F7D8 neg eax
:00436701 23D8 and ebx, eax

... ...

:00436723 8D55D4 lea edx, dword ptr [ebp-2C]
:00436726 51 push ecx
:00436727 52 push edx
:00436728 6A04 push 00000004
:0043672A FF1534104000 call dword ptr [00401034]
:00436730 83C428 add esp, 00000028
:00436733 6685DB test bx, bx
:00436736 0F8404070000 je 00436E40 <- 若上面的验证通过，这里不会跳

很长的一段垃圾........

:00436814 C745E400000000 mov [ebp-1C], 00000000
:0043681B FFD3 call ebx
:0043681D 8D8D14FFFFFF lea ecx, dword ptr [ebp+FFFFFF14]
:00436823 8D55D8 lea edx, dword ptr [ebp-28]
:00436826 51 push ecx
:00436827 8D45E0 lea eax, dword ptr [ebp-20]
:0043682A 52 push edx
:0043682B 50 push eax
:0043682C E8FF53FFFF call 0042BC30 <- 计算与比较注册码的核心
:00436831 8D4DD8 lea ecx, dword ptr [ebp-28]
:00436834 8BD8 mov ebx, eax <<- 保存出口状态

... ...

:0043685B 83C420 add esp, 00000020
:0043685E 6685DB test bx, bx <<- 测试注册是否成功
:00436861 0F8452040000 je 00436CB9
:00436867 8B0E mov ecx, dword ptr [esi]

进入核心call看看，好长的一段代码：

* Referenced by a CALL at Addresses:
|:0042361D , :0043682C
|
:0042BC30 55 push ebp
:0042BC31 8BEC mov ebp, esp
:0042BC33 83EC08 sub esp, 00000008
:0042BC36 68462C4000 push 00402C46
:0042BC3B 64A100000000 mov eax, dword ptr fs:[00000000]
:0042BC41 50 push eax
:0042BC42 64892500000000 mov dword ptr fs:[00000000], esp

... ... KeyGen ruion process

:0042C0CA 8B450C mov eax, dword ptr [ebp+0C]
:0042C0CD 8B55DC mov edx, dword ptr [ebp-24]
:0042C0D0 8B08 mov ecx, dword ptr [eax]
:0042C0D2 51 push ecx <- "d ecx"
:0042C0D3 52 push edx <- "d edx"
:0042C0D4 FF15B8104000 call dword ptr [004010B8] <- __vbastrcmp，比较真码与假码
:0042C0DA F7D8 neg eax
:0042C0DC 1BC0 sbb eax, eax

一个可用的注册码：

i6767@263.net
A0U58207032F0V63

[End]


CDR Inspector v1.0

标 题:CDR Inspector v1.0 (7千字)
发信人:Sun Bird [CCG]
时 间:2001-3-24 1:34:25
详细信息:
【前言】

今天在朋友的软磨硬泡（电话骚扰）、威逼（绝交警告）利诱（请客答谢）下，我不得不答应帮他破解这个软件。由于我工作特别忙，开始我还很担心软件采用“马拉松”式的保护机制（典型的代表为“SmyNes”），着手后才发现软件的作者简直太善良了;-)
这个软件的破解过程十分简单，我希望破解初学者更多地注意教程中的“★★★ 破解经验提示 ★★★”，那里面大多是一些总结性的文字，对初学者迅速进入破解大门多少会有些帮助的;-)

【正文】

软件名称：CDR Inspector v1.0
下载地址：http://www.ocloud.com/
简单介绍：CDR Inspector 可以读出 CDR 盘片信息，自动识别生产商，并可读出 CDR 中记录的有关记录信息，如容量、介质类型、支持的刻录速度等，让你对你购卖的 CDR 心中有数，同时可以读取光驱设备性能参数。

作者：Sun Bird [CCG]
工具：FileInfo v2.43、DeASPack v2.11、TRW2000 v1.22
日期：2001年3月23日

破解过程：

(1) 使用 FileInfo v2.43 检测一下软件主程序“CDRInspector.exe”，果然有料，编程语言是 Delphi，还加了壳，是 ASPack v2.11 :-(

★★★ 破解经验提示 ★★★
现在的软件为了防破解大多经过了加压或加壳，而且目前很多外壳软件均防常见的破解工具。所以在破解前应首先使用文件外壳检测软件检测一下主程序，以免跟踪时在软件外壳部分转来转去浪费时间和精力或者直接被软件外壳搞死:-( 这可是破解初学者应该养成的良好习惯^_^
推荐使用 FileInfo v2.43、Get Type v2.60

(2) 使用 DeASPack v2.11 将主程序“CDRInspector.exe”脱壳（注意 DeASPack 默认将脱壳后的程序命名为“out.exe”）。

★★★ 破解经验提示 ★★★
要想在破解过程中不“受制于人”，那么必须掌握手动脱壳技术！现在手动脱壳的极品工具组合为 BlastWave2000 v0.2 和 TRW2000 v1.22 （向 Ding Boy，刘涛涛、朱南灏大虾致敬！）
常有初学者提问“如何脱 XXXX 壳”。在此建议初学者，既然在手动脱壳方面比较“手潮”，那么一定要密切关注各类破解工具站点，这些站点会及时更新各种专用解压脱壳工具。
推荐站点：http://www.exetools.com/
http://www.suddendischarge.com/
http://protools.cjb.net/

(3) 运行“out.exe”，嘣－－“Unregistered version. Please register.”（由于软件没有找到“out.CHS”，所以显示英文提示信息，这样对于破解非常有利），不用考虑了，点“确定”吧;-)

★★★ 破解经验提示 ★★★
TRW2000、SoftICE 或者标准版的 W32Dasm 等常用破解工具均不支持汉字，而我们在破解国产软件时又经常需要查找提示信息，常有初学者对此一筹莫展:-( 其实为了方便破解，我们可以使用 UltraEDIT、WinHex 等编辑软件将汉字提示信息更改为英文，这样常用破解工具就可以使用了^_^

(4) 进入软件主界面，点“About”，在 About 窗口点“Register Now”，在 Register 窗口输入相关信息：

Username：Sun Bird [CCG]
Registration Code：31415926

★★★ 破解经验提示 ★★★
现在很多软件在防破解方面下了很大的功夫，有的软件发现输入的注册码为“12345678”、“78787878”或者“88888888”等简单重复时会直接使注册失败，根本不去判断注册名和注册码之间的逻辑关系；有的软件则对注册码采用实时判断，这样如果输入简单重复的注册码在破解时会郁闷之极，因为很难判断现在正确的注册码对应的是第几个“8”:-(
使用圆周率或者自己熟悉的字符串（例如身份证号码、出生年月日等）做为假注册码，可以避免类似的麻烦^_^

(5) 运行 TRW2000 v1.22 ，按 Ctrl-N 进入 TRW2000

BPX HMEMCPY <--- 下“万能”断点
G <--- 继续运行（即回到 out）

★★★ 破解经验提示 ★★★
前面我们已经提到过，现在很多软件反破解工具，有些软件在启动后检测到有 SoftICE、TRW2000 甚至天意II v0.46 这类破解工具时拒绝继续运行直接退出，而有些恶毒的软件则干脆导致死机:-(
在软件启动后再运行 TRW2000 可以避免部分软件对破解工具的检测^_^

(6) 在 Register 窗口点“OK”，马上被 TRW2000 中断

BC * <--- 清除断点
PMODULE <--- 回到 out 领空

(7) 按 F12 7 次、F10 1 次后来到这里：

:0045DEEA 8B45E4 mov eax, dword ptr [ebp-1C] <--- 光棒停在这里
:0045DEED 8D55E8 lea edx, dword ptr [ebp-18]
:0045DEF0 E8FF020000 call 0045E1F4
:0045DEF5 8B45E8 mov eax, dword ptr [ebp-18]
:0045DEF8 50 push eax
:0045DEF9 8D55D4 lea edx, dword ptr [ebp-2C]
:0045DEFC 8B45FC mov eax, dword ptr [ebp-04]
:0045DEFF E820010000 call 0045E024
:0045DF04 8D45D4 lea eax, dword ptr [ebp-2C]
:0045DF07 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0045DF0A 5A pop edx
:0045DF0B E8ECF5FFFF call 0045D4FC
:0045DF10 8D4DF0 lea ecx, dword ptr [ebp-10]
:0045DF13 8D45F4 lea eax, dword ptr [ebp-0C]
:0045DF16 BA08000000 mov edx, 00000008
:0045DF1B E8A0F0FFFF call 0045CFC0
:0045DF20 8D55D0 lea edx, dword ptr [ebp-30]
:0045DF23 8B45FC mov eax, dword ptr [ebp-04]
:0045DF26 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:0045DF2C E8D7ACFCFF call 00428C08
:0045DF31 8B55D0 mov edx, dword ptr [ebp-30]
:0045DF34 8B45F0 mov eax, dword ptr [ebp-10]
:0045DF37 E8A85EFAFF call 00403DE4 <--- 关键 Call，需要 F8 跟进
:0045DF3C 7541 jne 0045DF7F
:0045DF3E 8D55CC lea edx, dword ptr [ebp-34]
:0045DF41 8B45FC mov eax, dword ptr [ebp-04]
:0045DF44 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:0045DF4A E8B9ACFCFF call 00428C08
:0045DF4F 8B45CC mov eax, dword ptr [ebp-34]
:0045DF52 50 push eax
:0045DF53 8D55C8 lea edx, dword ptr [ebp-38]
:0045DF56 8B45FC mov eax, dword ptr [ebp-04]
:0045DF59 8B80D8020000 mov eax, dword ptr [eax+000002D8]
:0045DF5F E8A4ACFCFF call 00428C08
:0045DF64 8B55C8 mov edx, dword ptr [ebp-38]
:0045DF67 8B45FC mov eax, dword ptr [ebp-04]
:0045DF6A 59 pop ecx
:0045DF6B E854010000 call 0045E0C4
:0045DF70 8B45FC mov eax, dword ptr [ebp-04]
:0045DF73 C7803402000001000000 mov dword ptr [ebx+00000234], 00000001
:0045DF7D EB57 jmp 0045DFD6

(8) 按 F8 跟进关键 Call：

:00403DE4 53 push ebx
:00403DE5 56 push esi
:00403DE6 57 push edi
:00403DE7 89C6 mov esi, eax
:00403DE9 89D7 mov edi, edx
:00403DEB 39D0 cmp eax, edx <--- 典型比较
:00403DED 0F848F000000 je 00403E82
:00403DF3 85F6 test esi, esi
:00403DF5 7468 je 00403E5F
:00403DF7 85FF test edi, edi
:00403DF9 746B je 00403E66
:00403DFB 8B46FC mov eax, dword ptr [esi-04]
:00403DFE 8B57FC mov edx, dword ptr [edi-04]
:00403E01 29D0 sub eax, edx
:00403E03 7702 ja 00403E07
:00403E05 01C2 add edx, eax

当光棒停在 :00403DEB cmp eax, edx 处时，D EAX 可得到正确的注册码、D EDX 可得到输入的假注册码。
其实当光棒停在第 (7) 步 :0045DF37 call 00403DE4 处时，即在按 F8 跟进关键 Call 之前，D EAX 已经可以得到正确的注册码、D EDX 可得到输入的假注册码。

★★★ 破解经验提示 ★★★
常有初学者提问“怎么才能知道需要按 F12 多少次”。其实通常情况是，当按了 F12 N+1 次后软件就提示注册码错误的信息了，第一反应自然是“注册码判断的过程可能在 F12 N 次后的部分”，所以下次就少按 1 次 F12 喽。
在什么时候需要 F8 跟进 Call、什么时候使用 D、？ 命令则需要有一定的破解经验了。对于破解经验比较少的初学者可以采用最原始的方法，当碰到对寄存器进行操作的命令后就 D 或 ？ 一下、碰到 Call 就跟进去、碰到比较命令就对比较的寄存器 D 或 ？ 一下……一定要勤记笔记！破解时一定会失败若干次，通常是没有跟进某个 Call 或者是对某个判断、跳转没有注意，那么下次可以对照笔记快速定位，否则每次都要从头来过可就太惨了:-(
每一次破解都是一次经验的积累，当破解经验越来越丰富的时候，自然而然会对某些命令比较敏感，直觉上认为这些 Call、判断、跳转一定有问题，而事实往往证明这些就是关键点。因为软件的保护机制是有规律可循的，所以有经验的破解者能够比较迅速的找到关键点。
这些直觉是任何书本、教程都无法讲清楚的，所谓“只可意会，不可言传”。要想获得这些直觉，没有任何捷径，只有不停地实践！

注册信息：

注册名：Sun Bird [CCG]
注册码：AF40E7648DD90464

现在可以运行原版软件“CDRInspector.exe”进行注册了（软件的注册信息存储在注册表“HKEY_CURRENT_USER\Software\OCloud\CDR Inspector”处）。

【后记】

我用了 5 分钟左右的时间破解，而写这篇教程却断断续续花费了大约 NN 个小时，其间包括完成本职工作、外出开会、陪客户吃饭、加班以及和老板“谈心”……搞得我十分郁闷:-(
还有，今天早上在“白菜乐园”处看到已经有 CCG 成员提供了 CDR Inspector v1.0 的注册码^_^


CDRWin 4.0A BETA

标 题:破解心得之CDRWin 4.0A BETA篇 (18千字)
发信人:时空幻影
时 间:2001-4-24 16:28:01
详细信息:
破解心得之CDRWin 4.0A BETA篇

作者：时空幻影
时间：2001年4月20日
破解工具：W32DASM v8.93白金版汉化版、TRW2000 v1.23注册版

软件名称：CDRWin
发布公司：Golden Hawk Technology
最新版本：4.0A Beta
操作系统：Win9x/ME/NT4/2000
软件简介：CDRWin 是一套强力的特点极多的刻录软件，它可以：支持 AUDIO、CDROM (Mode1)、CDROM-XA (Mode2)、CD-I、混合型、多重扇区盘片；独有的 CUE SHEET 语言可以 100% 定制盘片的布局，避免其他刻录软件在不同 track 之间产生间隔的现象；强大的备份功能可以防止盘片上原有数据的损失；符合 ISO9660 磁盘控制标准；可以制作光盘启动盘；支持 Karaoke CD G 盘片（需要Sony CDW-900E, Panasonic 或 Yamaha 刻录机）；仅有的支持 Philips/Kodak/HP 家族刻录机 Disc-at-once 技术的软件；支持盘片的 UPC 码和 track 的 ISRC 码；支持“Kodak Disc Transporter”高速盘片复制技术。

由于该软件没有加壳，所以破解相对容易一些！！！呵呵，希望大家指出不足之处！！！
1.执行CDRWin 4.0A BETA，点击unlock图标，填入
name：shikonghuanying
company：Changsha
Unlock Key：12345-67890-09876-54321
Check Key：ABCDE-BCDEF-FEDCB-EDCBA（为什么要这样？待会儿再告知）
2.执行TRW2000，按ctrl+N激活它，用BPX HMEMCPY设置断点，再按F5继续.
3.点击Unlock，会被TRW2000拦下，输入BD *使断点暂时失效，再输入PMODULE跳入程序领空。
4.再按几下F10，会到以下所指的地方：

* Possible Reference to String Resource ID=00255: "Invalid disc count specified."
|
:0041DF43 6AFF push FFFFFFFF
:0041DF45 68D0664700 push 004766D0
:0041DF4A 64A100000000 mov eax, dword ptr fs:[00000000]
:0041DF50 50 push eax
:0041DF51 64892500000000 mov dword ptr fs:[00000000], esp
:0041DF58 83EC38 sub esp, 00000038
:0041DF5B A1F0A04A00 mov eax, dword ptr [004AA0F0]
:0041DF60 53 push ebx
:0041DF61 56 push esi
:0041DF62 57 push edi
:0041DF63 8965F0 mov dword ptr [ebp-10], esp
:0041DF66 8BF1 mov esi, ecx
:0041DF68 8945E0 mov dword ptr [ebp-20], eax
:0041DF6B C745FC00000000 mov [ebp-04], 00000000
:0041DF72 8945E4 mov dword ptr [ebp-1C], eax
:0041DF75 8945E8 mov dword ptr [ebp-18], eax
:0041DF78 8945EC mov dword ptr [ebp-14], eax
:0041DF7B 8B4E68 mov ecx, dword ptr [esi+68]
:0041DF7E 8D45E0 lea eax, dword ptr [ebp-20]
:0041DF81 BB03000000 mov ebx, 00000003
:0041DF86 50 push eax
:0041DF87 885DFC mov byte ptr [ebp-04], bl
:0041DF8A E81DC30400 call 0046A2AC
:0041DF8F 8D4DE4 lea ecx, dword ptr [ebp-1C]
:0041DF92 51 push ecx <--按F10会到这里，然后继续按F10
:0041DF93 8B4E6C mov ecx, dword ptr [esi+6C]
:0041DF96 E811C30400 call 0046A2AC
:0041DF9B 8B4E70 mov ecx, dword ptr [esi+70]
:0041DF9E 8D55E8 lea edx, dword ptr [ebp-18]
:0041DFA1 52 push edx
:0041DFA2 E805C30400 call 0046A2AC
:0041DFA7 8B4E74 mov ecx, dword ptr [esi+74]
:0041DFAA 8D45EC lea eax, dword ptr [ebp-14]
:0041DFAD 50 push eax
:0041DFAE E8F9C20400 call 0046A2AC
:0041DFB3 8D4DBC lea ecx, dword ptr [ebp-44]
:0041DFB6 8D55C0 lea edx, dword ptr [ebp-40]
:0041DFB9 51 push ecx
:0041DFBA 8D45C4 lea eax, dword ptr [ebp-3C]
:0041DFBD 52 push edx
:0041DFBE 8B55E8 mov edx, dword ptr [ebp-18]
:0041DFC1 8D4DC8 lea ecx, dword ptr [ebp-38]
:0041DFC4 50 push eax
:0041DFC5 51 push ecx

* Possible StringData Ref from Data Obj ->"%lx-%lx-%lx-%lx" <--指明了Unlock Key的格式
|
:0041DFC6 68FC214A00 push 004A21FC
:0041DFCB 52 push edx
:0041DFCC E82C860300 call 004565FD <--检查是不是符合上面的格式，并把字符转为HEX
:0041DFD1 83C418 add esp, 00000018
:0041DFD4 83F804 cmp eax, 00000004
:0041DFD7 0F8597000000 jne 0041E074
:0041DFDD 8D45CC lea eax, dword ptr [ebp-34]
:0041DFE0 8D4DD0 lea ecx, dword ptr [ebp-30]
:0041DFE3 50 push eax
:0041DFE4 8D55D4 lea edx, dword ptr [ebp-2C]
:0041DFE7 51 push ecx
:0041DFE8 8B4DEC mov ecx, dword ptr [ebp-14]
:0041DFEB 8D45D8 lea eax, dword ptr [ebp-28]
:0041DFEE 52 push edx
:0041DFEF 50 push eax

* Possible StringData Ref from Data Obj ->"%lx-%lx-%lx-%lx" <--指明了Check Key的格式
|
:0041DFF0 68FC214A00 push 004A21FC
:0041DFF5 51 push ecx
:0041DFF6 E802860300 call 004565FD <--检查是不是符合上面的格式，并把字符转为HEX
:0041DFFB 83C418 add esp, 00000018
:0041DFFE 83F804 cmp eax, 00000004
:0041E001 7571 jne 0041E074
:0041E003 8B4DE4 mov ecx, dword ptr [ebp-1C]
:0041E006 8845FC mov byte ptr [ebp-04], al
:0041E009 8D55CC lea edx, dword ptr [ebp-34]
:0041E00C 8D45BC lea eax, dword ptr [ebp-44]
:0041E00F 52 push edx
:0041E010 8B55E0 mov edx, dword ptr [ebp-20]
:0041E013 50 push eax
:0041E014 51 push ecx
:0041E015 52 push edx
:0041E016 E845630000 call 00424360 <--按F8进入
:0041E01B 83C410 add esp, 00000010
:0041E01E 895DFC mov dword ptr [ebp-04], ebx

下面为Unlock Key和Check Key比较的部分，假设Key的各部分为：
Unlock Key：12345-67890-09876-54321
^^^^^ ^^^^^ ^^^^^ ^^^^^
u1 u2 u3 u4

Check Key：ABCDE-BCDEF-FEDCB-EDCBA
^^^^^ ^^^^^ ^^^^^ ^^^^^
c1 c2 c3 c4

* Referenced by a CALL at Address:
|:0041E016
|
:00424360 8B4C2410 mov ecx, dword ptr [esp+10]
:00424364 53 push ebx
:00424365 55 push ebp
:00424366 56 push esi
:00424367 8B742418 mov esi, dword ptr [esp+18]
:0042436B 8B19 mov ebx, dword ptr [ecx] <--ebx=c4
:0042436D 57 push edi
:0042436E 8B3E mov edi, dword ptr [esi] <--edi=u4
:00424370 8B4604 mov eax, dword ptr [esi+04] <--eax=u3
:00424373 8BD7 mov edx, edi
:00424375 33D0 xor edx, eax
:00424377 3BDA cmp ebx, edx
:00424379 7525 jne 004243A0 <--这个和下面两个jne一定不能跳转
:0042437B 8B5608 mov edx, dword ptr [esi+08] <--edx=u2
:0042437E 8BDA mov ebx, edx
:00424380 33D8 xor ebx, eax
:00424382 8B4104 mov eax, dword ptr [ecx+04] <--eax=c3
:00424385 3BC3 cmp eax, ebx
:00424387 7517 jne 004243A0
:00424389 8B460C mov eax, dword ptr [esi+0C] <--eax=u1
:0042438C 8BD8 mov ebx, eax
:0042438E 33DA xor ebx, edx
:00424390 8B5108 mov edx, dword ptr [ecx+08] <--edx=c2
:00424393 3BD3 cmp edx, ebx
:00424395 7509 jne 004243A0
:00424397 8B510C mov edx, dword ptr [ecx+0C] <--edx=c1
:0042439A 33C7 xor eax, edi
:0042439C 3BD0 cmp edx, eax
:0042439E 7413 je 004243B3 <--这个则一定要跳转

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00424379(C), :00424387(C), :00424395(C)
|
:004243A0 6A00 push 00000000
:004243A2 6A00 push 00000000
:004243A4 6A00 push 00000000
:004243A6 6838FFFFFF push FFFFFF38
:004243AB E8F0360000 call 00427AA0 <--弹出注册失败窗口
:004243B0 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042439E(C)
|
:004243B3 8B6C2418 mov ebp, dword ptr [esp+18]
:004243B7 8B7C2414 mov edi, dword ptr [esp+14]
:004243BB 56 push esi
:004243BC 55 push ebp
:004243BD 57 push edi
:004243BE E8ED040000 call 004248B0 <--按F8进入
:004243C3 83C40C add esp, 0000000C
:004243C6 85C0 test eax, eax
:004243C8 7510 jne 004243DA
:004243CA 50 push eax
:004243CB 50 push eax
:004243CC 50 push eax
:004243CD 6837FFFFFF push FFFFFF37
:004243D2 E8C9360000 call 00427AA0 <--弹出注册失败窗口
:004243D7 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004243C8(C)
|
:004243DA 8B1E mov ebx, dword ptr [esi]
:004243DC C1EB10 shr ebx, 10
:004243DF 66335E04 xor bx, word ptr [esi+04]
:004243E3 81E3FFFF0000 and ebx, 0000FFFF
:004243E9 8D43F1 lea eax, dword ptr [ebx-0F]
:004243EC 3DBC040000 cmp eax, 000004BC
:004243F1 7E13 jle 00424406 <--这个一定要跳转
:004243F3 6A00 push 00000000
:004243F5 6A00 push 00000000
:004243F7 6A00 push 00000000
:004243F9 6834FFFFFF push FFFFFF34
:004243FE E89D360000 call 00427AA0 <--弹出注册失败窗口
:00424403 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004243F1(C)
|
:00424406 83C30F add ebx, 0000000F
:00424409 81FBBC040000 cmp ebx, 000004BC
:0042440F 7D13 jge 00424424 <--这个也一定要跳转
:00424411 6A00 push 00000000
:00424413 6A00 push 00000000
:00424415 6A00 push 00000000
:00424417 6835FFFFFF push FFFFFF35
:0042441C E87F360000 call 00427AA0 <--弹出注册失败窗口
:00424421 83C410 add esp, 00000010

在那个call 00427AA0按F8进入后来到以下：

* Referenced by a CALL at Addresses:
|:004242D8 , :004243BE
|
:004248B0 8B44240C mov eax, dword ptr [esp+0C]
:004248B4 8B542404 mov edx, dword ptr [esp+04]
:004248B8 53 push ebx
:004248B9 55 push ebp
:004248BA 8B18 mov ebx, dword ptr [eax] <--ebx=54321
:004248BC 57 push edi
:004248BD 8BFA mov edi, edx
:004248BF 83C9FF or ecx, FFFFFFFF
:004248C2 33C0 xor eax, eax
:004248C4 F2 repnz
:004248C5 AE scasb
:004248C6 F7D1 not ecx
:004248C8 49 dec ecx
:004248C9 83F906 cmp ecx, 00000006 <--检查name的长度是否大于等于6，
:004248CC 726B jb 00424939 name的长度应该>=6
:004248CE 8B6C2414 mov ebp, dword ptr [esp+14]
:004248D2 83C9FF or ecx, FFFFFFFF
:004248D5 8BFD mov edi, ebp
:004248D7 F2 repnz
:004248D8 AE scasb
:004248D9 F7D1 not ecx
:004248DB 49 dec ecx
:004248DC 83F906 cmp ecx, 00000006 <--检查company的长度是否大于等于6,
:004248DF 7258 jb 00424939 company的长度应该>=6
:004248E1 F7C3FFFF0000 test ebx, 0000FFFF
:004248E7 7450 je 00424939
:004248E9 F7C30000FFFF test ebx, FFFF0000
:004248EF 7448 je 00424939
:004248F1 56 push esi
:004248F2 6A02 push 00000002
:004248F4 52 push edx
:004248F5 E846000000 call 00424940 <--按F8进入
:004248FA 6A02 push 00000002
:004248FC 55 push ebp
:004248FD 8BF0 mov esi, eax
:004248FF E83C000000 call 00424940 <--按F8进入
:00424904 8BC8 mov ecx, eax
:00424906 8BD0 mov edx, eax
:00424908 81E10000FF00 and ecx, 00FF0000
:0042490E 83C410 add esp, 00000010
:00424911 C1EA10 shr edx, 10
:00424914 0BCA or ecx, edx
:00424916 8BD0 mov edx, eax
:00424918 81E200FF0000 and edx, 0000FF00
:0042491E C1E010 shl eax, 10
:00424921 0BD0 or edx, eax
:00424923 33C0 xor eax, eax
:00424925 C1E908 shr ecx, 08
:00424928 C1E208 shl edx, 08
:0042492B 0BCA or ecx, edx
:0042492D 33CE xor ecx, esi
:0042492F 5E pop esi
:00424930 3BCB cmp ecx, ebx
:00424932 5F pop edi
:00424933 5D pop ebp
:00424934 5B pop ebx
:00424935 0F94C0 sete al
:00424938 C3 ret

第一个call 00424940是把name进行计算，第二个call 00424940是把company进行计算。

* Referenced by a CALL at Addresses:
|:004248F5 , :004248FF
|
:00424940 8B442408 mov eax, dword ptr [esp+08]
:00424944 56 push esi
:00424945 48 dec eax
:00424946 740E je 00424956
:00424948 48 dec eax
:00424949 7404 je 0042494F <--在这里一般都会跳转，而且应该要跳转
:0042494B 33C0 xor eax, eax
:0042494D 5E pop esi
:0042494E C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00424949(C)
|
:0042494F BEA0804A00 mov esi, 004A80A0
:00424954 EB05 jmp 0042495B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00424946(C)
|
:00424956 BE60804A00 mov esi, 004A8060

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00424954(U)
|
:0042495B 8B542408 mov edx, dword ptr [esp+08]
:0042495F 57 push edi
:00424960 8BFA mov edi, edx
:00424962 83C9FF or ecx, FFFFFFFF
:00424965 33C0 xor eax, eax
:00424967 6A00 push 00000000
:00424969 F2 repnz
:0042496A AE scasb
:0042496B F7D1 not ecx
:0042496D 49 dec ecx
:0042496E 51 push ecx
:0042496F 52 push edx
:00424970 56 push esi
:00424971 E8DA2E0200 call 00447850 <--按F8进入
:00424976 83C410 add esp, 00000010
:00424979 5F pop edi
:0042497A 5E pop esi
:0042497B C3 ret

进入后的这一段代码比较重要，对求出注册码的u4部分起关键作用。

<tr> tr>
   进入后的这一段代码比较重要，对求出注册码的u4部分起关键作用。

* Referenced by a CALL at Addresses:
|:0042463C   , :004247FE   , :00424971   , :0042508B   , :00447F8D
|
:00447850 8B442410                mov eax, dword ptr [esp+10]
:00447854 8B542408                mov edx, dword ptr [esp+08]
:00447858 57                      push edi
:00447859 8B7C2410                mov edi, dword ptr [esp+10]
:0044785D 6685FF                  test di, di
:00447860 743E                    je 004478A0
:00447862 53                      push ebx
:00447863 55                      push ebp
:00447864 56                      push esi
:00447865 8B742414                mov esi, dword ptr [esp+14]
:00447869 81E7FFFF0000            and edi, 0000FFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044789B(C)
|
:0044786F 33C9                    xor ecx, ecx
:00447871 8BE8                    mov ebp, eax
:00447873 8A0A                    mov cl, byte ptr [edx]      <--edx为存放name或company的内存地址
:00447875 42                      inc edx
:00447876 8BD9                    mov ebx, ecx
:00447878 33D8                    xor ebx, eax
:0044787A 83E30F                  and ebx, 0000000F
:0044787D C1ED04                  shr ebp, 04
:00447880 8B049E                  mov eax, dword ptr [esi+4*ebx]     <--esi为存放密码表的内存地址
:00447883 33C5                    xor eax, ebp
:00447885 C1E904                  shr ecx, 04
:00447888 8BD8                    mov ebx, eax
:0044788A 83E10F                  and ecx, 0000000F
:0044788D 83E30F                  and ebx, 0000000F
:00447890 33CB                    xor ecx, ebx
:00447892 C1E804                  shr eax, 04
:00447895 8B0C8E                  mov ecx, dword ptr [esi+4*ecx]
:00447898 33C1                    xor eax, ecx
:0044789A 4F                      dec edi
:0044789B 75D2                    jne 0044786F
:0044789D 5E                      pop esi
:0044789E 5D                      pop ebp
:0044789F 5B                      pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447860(C)
|
:004478A0 5F                      pop edi
:004478A1 C3                      ret

密码表：
     0x00000000     0x1C3E887E     0x387D10FC     0x24439882
     0x70FA21F8     0x6CC4A986     0x48873104     0x54B9B97A
     0xE1F443F0     0xFDCACB8E     0xD989530C     0xC5B7DB72
     0x910E6208     0x8D30EA76     0xA97372F4     0xB54DFA8A

    到这里，相信大家应该对其注册算法比较清楚了，自己写一下注册机，提高一下自己的编程能力。

我的注册码为：
          name：时空幻影
       company：湖南长沙
    Unlock Key：3520A324-303B8C46-1810AD6E-A9D27FF5
     Check Key：9CF2DCD1-051B2F62-282B2128-B1C2D29B

标 题:破解心得之CDRWin 4.0A BETA篇（续） (24千字)
发信人:时空幻影
时 间:2001-4-24 16:29:18
详细信息:

破解心得之CDRWin 4.0A BETA篇（续）

作者：时空幻影
时间：2001年4月20日
破解工具：W32DASM v8.93白金版汉化版、TRW2000 v1.23注册版

软件名称：CDRWin
发布公司：Golden Hawk Technology
最新版本：4.0A Beta
操作系统：Win9x/ME/NT4/2000
软件简介：CDRWin 是一套强力的特点极多的刻录软件，它可以：支持 AUDIO、CDROM (Mode1)、CDROM-XA (Mode2)、CD-I、混合型、多重扇区盘片；独有的 CUE SHEET 语言可以 100% 定制盘片的布局，避免其他刻录软件在不同 track 之间产生间隔的现象；强大的备份功能可以防止盘片上原有数据的损失；符合 ISO9660 磁盘控制标准；可以制作光盘启动盘；支持 Karaoke CD G 盘片（需要Sony CDW-900E, Panasonic 或 Yamaha 刻录机）；仅有的支持 Philips/Kodak/HP 家族刻录机 Disc-at-once 技术的软件；支持盘片的 UPC 码和 track 的 ISRC 码；支持“Kodak Disc Transporter”高速盘片复制技术。

但是我高兴的太早了，输入后的确注册成功，然而在退出软件重新运行时，弹出了一个窗口，大意是说我是通过非法手段注册的（气死我了，我的注册机已经写好了，看来我又要重新写了！55555……）。继续祭出我们的两大法宝TRW2000和W32DASM搞定它。
在上一节这么一段代码如下：
* Referenced by a CALL at Addresses:
|:004242D8 , :004243BE <==这里有两个调用该CALL的地址，其中:004243BE是上一节用过的，那么剩下的
| 就应该是启动时用到的
:004248B0 8B44240C mov eax, dword ptr [esp+0C]
:004248B4 8B542404 mov edx, dword ptr [esp+04]
:004248B8 53 push ebx
:004248B9 55 push ebp
:004248BA 8B18 mov ebx, dword ptr [eax] <--ebx=54321
:004248BC 57 push edi
:004248BD 8BFA mov edi, edx
:004248BF 83C9FF or ecx, FFFFFFFF
:004248C2 33C0 xor eax, eax
:004248C4 F2 repnz
:004248C5 AE scasb
:004248C6 F7D1 not ecx
:004248C8 49 dec ecx
:004248C9 83F906 cmp ecx, 00000006 <--检查name的长度是否大于等于6，
:004248CC 726B jb 00424939 name的长度应该>=6
:004248CE 8B6C2414 mov ebp, dword ptr [esp+14]
:004248D2 83C9FF or ecx, FFFFFFFF
:004248D5 8BFD mov edi, ebp
:004248D7 F2 repnz
:004248D8 AE scasb
:004248D9 F7D1 not ecx
:004248DB 49 dec ecx
:004248DC 83F906 cmp ecx, 00000006 <--检查company的长度是否大于等于6,
:004248DF 7258 jb 00424939 company的长度应该>=6
:004248E1 F7C3FFFF0000 test ebx, 0000FFFF
:004248E7 7450 je 00424939
:004248E9 F7C30000FFFF test ebx, FFFF0000
:004248EF 7448 je 00424939
:004248F1 56 push esi
:004248F2 6A02 push 00000002
:004248F4 52 push edx
:004248F5 E846000000 call 00424940 <--按F8进入
:004248FA 6A02 push 00000002
:004248FC 55 push ebp
:004248FD 8BF0 mov esi, eax
:004248FF E83C000000 call 00424940 <--按F8进入
:00424904 8BC8 mov ecx, eax
:00424906 8BD0 mov edx, eax
:00424908 81E10000FF00 and ecx, 00FF0000
:0042490E 83C410 add esp, 00000010
:00424911 C1EA10 shr edx, 10
:00424914 0BCA or ecx, edx
:00424916 8BD0 mov edx, eax
:00424918 81E200FF0000 and edx, 0000FF00
:0042491E C1E010 shl eax, 10
:00424921 0BD0 or edx, eax
:00424923 33C0 xor eax, eax
:00424925 C1E908 shr ecx, 08
:00424928 C1E208 shl edx, 08
:0042492B 0BCA or ecx, edx
:0042492D 33CE xor ecx, esi
:0042492F 5E pop esi
:00424930 3BCB cmp ecx, ebx
:00424932 5F pop edi
:00424933 5D pop ebp
:00424934 5B pop ebx
:00424935 0F94C0 sete al
:00424938 C3 ret

因此用TRW2000载入它后设置断点BPX 004242D8，按F5继续执行，程序会被拦下，然后按F10单步执行。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042416A(C)
|
:004242C9 6820DD4A00 push 004ADD20
:004242CE 68F0DB4A00 push 004ADBF0
:004242D3 68B0DB4A00 push 004ADBB0
:004242D8 E8D3050000 call 004248B0 <--程序会在这里被拦下，然后按F10单步执行
:004242DD 83C40C add esp, 0000000C
:004242E0 85C0 test eax, eax
:004242E2 7510 jne 004242F4 <--会跳转
:004242E4 50 push eax
:004242E5 50 push eax
:004242E6 50 push eax
:004242E7 6836FFFFFF push FFFFFF36
:004242EC E8AF370000 call 00427AA0
:004242F1 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004242E2(C)
|
:004242F4 A124DD4A00 mov eax, dword ptr [004ADD24]
:004242F9 56 push esi
:004242FA 8B3520DD4A00 mov esi, dword ptr [004ADD20]
:00424300 C1EE10 shr esi, 10
:00424303 33F0 xor esi, eax
:00424305 81E6FFFF0000 and esi, 0000FFFF
:0042430B 8D46F1 lea eax, dword ptr [esi-0F]
:0042430E 3DBC040000 cmp eax, 000004BC
:00424313 7E13 jle 00424328 <--会跳转
:00424315 6A00 push 00000000
:00424317 6A00 push 00000000
:00424319 6A00 push 00000000
:0042431B 6834FFFFFF push FFFFFF34
:00424320 E87B370000 call 00427AA0
:00424325 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00424313(C)
|
:00424328 83C60F add esi, 0000000F
:0042432B 81FEBC040000 cmp esi, 000004BC
:00424331 5E pop esi
:00424332 7D13 jge 00424347 <--会跳转
:00424334 6A00 push 00000000
:00424336 6A00 push 00000000
:00424338 6A00 push 00000000
:0042433A 6835FFFFFF push FFFFFF35
:0042433F E85C370000 call 00427AA0
:00424344 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00424332(C)
|
:00424347 6820DD4A00 push 004ADD20
:0042434C E89F060000 call 004249F0 <--在这里按F8进入
:00424351 83C404 add esp, 00000004
:00424354 C705ECDE4A0001000000 mov dword ptr [004ADEEC], 00000001

进入后会到这里：

* Referenced by a CALL at Addresses:
|:0042434C , :00424425
|
:004249F0 81EC50020000 sub esp, 00000250
:004249F6 53 push ebx
:004249F7 B9947BECBE mov ecx, BEEC7B94 <--BEEC7B94和下一个的6962423E均为u4的黑名单
:004249FC B83E426269 mov eax, 6962423E
:00424A01 56 push esi
:00424A02 57 push edi
:00424A03 C7442414F219749C mov [esp+14], 9C7419F2 <--9C7419F2和以下的也是黑名单
:00424A0B C7442418026BCB74 mov [esp+18], 74CB6B02
:00424A13 C744241C6BE1237B mov [esp+1C], 7B23E16B
:00424A1B C744242087F1202E mov [esp+20], 2E20F187
:00424A23 C7442424E3BD575B mov [esp+24], 5B57BDE3
:00424A2B C7442428CB5E95FF mov [esp+28], FF955ECB
:00424A33 C744242C0F362704 mov [esp+2C], 0427360F
:00424A3B C7442430991AD3FC mov [esp+30], FCD31A99
:00424A43 C74424341F907CFA mov [esp+34], FA7C901F
:00424A4B C74424383096C30F mov [esp+38], 0FC39630
:00424A53 C744243C8876E44A mov [esp+3C], 4AE47688
:00424A5B C7442440207B6B77 mov [esp+40], 776B7B20
:00424A63 C7442444379F82C6 mov [esp+44], C6829F37
:00424A6B C7442448BD9B4A53 mov [esp+48], 534A9BBD
:00424A73 C744244C6E4AD346 mov [esp+4C], 46D34A6E
:00424A7B C74424508F31A8A7 mov [esp+50], A7A8318F
:00424A83 C7442454B6FF065E mov [esp+54], 5E06FFB6
:00424A8B C74424581040B78F mov [esp+58], 8FB74010
:00424A93 C744245C9B0083D9 mov [esp+5C], D983009B
:00424A9B C7442460F77F1105 mov [esp+60], 05117FF7
:00424AA3 C74424641889E956 mov [esp+64], 56E98918
:00424AAB C744246865F557DA mov [esp+68], DA57F565
:00424AB3 C744246CA340DE10 mov [esp+6C], 10DE40A3
:00424ABB C74424706D611D09 mov [esp+70], 091D616D
:00424AC3 C744247440F1DECF mov [esp+74], CFDEF140
:00424ACB C7442478C0CB2B0A mov [esp+78], 0A2BCBC0
:00424AD3 C744247CB437E178 mov [esp+7C], 78E137B4
:00424ADB C784248000000086B1D7CC mov dword ptr [esp+00000080], CCD7B186
:00424AE6 C78424840000002B400C9A mov dword ptr [esp+00000084], 9A0C402B
:00424AF1 C7842488000000CF24DEBE mov dword ptr [esp+00000088], BEDE24CF
:00424AFC C784248C0000004C0464E4 mov dword ptr [esp+0000008C], E464044C
:00424B07 C78424900000009F3DCD1C mov dword ptr [esp+00000090], 1CCD3D9F
:00424B12 C7842494000000C4F3FC0C mov dword ptr [esp+00000094], 0CFCF3C4
:00424B1D C78424980000005B6632E8 mov dword ptr [esp+00000098], E832665B
:00424B28 C784249C0000009573EABD mov dword ptr [esp+0000009C], BDEA7395
:00424B33 C78424A0000000AE960F86 mov dword ptr [esp+000000A0], 860F96AE
:00424B3E C78424A4000000EA0DE039 mov dword ptr [esp+000000A4], 39E00DEA
:00424B49 C78424A8000000702C89D2 mov dword ptr [esp+000000A8], D2892C70
:00424B54 C78424AC0000003B07435E mov dword ptr [esp+000000AC], 5E43073B
:00424B5F C78424B000000010925172 mov dword ptr [esp+000000B0], 72519210
:00424B6A C78424B4000000C856D743 mov dword ptr [esp+000000B4], 43D756C8
:00424B75 C78424B80000003BD6A585 mov dword ptr [esp+000000B8], 85A5D63B
:00424B80 898C24BC000000 mov dword ptr [esp+000000BC], ecx
:00424B87 898424C0000000 mov dword ptr [esp+000000C0], eax
:00424B8E C78424C4000000BCF1F1C4 mov dword ptr [esp+000000C4], C4F1F1BC
:00424B99 C78424C8000000B210BD6F mov dword ptr [esp+000000C8], 6FBD10B2
:00424BA4 C78424CC0000007150FCF2 mov dword ptr [esp+000000CC], F2FC5071
:00424BAF C78424D0000000A1AA5BF8 mov dword ptr [esp+000000D0], F85BAAA1
:00424BBA C78424D400000089E541A2 mov dword ptr [esp+000000D4], A241E589
:00424BC5 C78424D8000000E48ECBDD mov dword ptr [esp+000000D8], DDCB8EE4
:00424BD0 C78424DC000000F629A74C mov dword ptr [esp+000000DC], 4CA729F6
:00424BDB C78424E0000000115A059C mov dword ptr [esp+000000E0], 9C055A11
:00424BE6 C78424E400000086A0B24A mov dword ptr [esp+000000E4], 4AB2A086
:00424BF1 C78424E80000008FA4D3E3 mov dword ptr [esp+000000E8], E3D3A48F
:00424BFC C78424EC00000096878DCC mov dword ptr [esp+000000EC], CC8D8796
:00424C07 C78424F0000000B0F80B64 mov dword ptr [esp+000000F0], 640BF8B0
:00424C12 C78424F4000000FEDE03F4 mov dword ptr [esp+000000F4], F403DEFE
:00424C1D C78424F80000004EEA5B65 mov dword ptr [esp+000000F8], 655BEA4E
:00424C28 C78424FC000000791A49AE mov dword ptr [esp+000000FC], AE491A79
:00424C33 C7842400010000CA0708EE mov dword ptr [esp+00000100], EE0807CA
:00424C3E C78424040100004AC3A72E mov dword ptr [esp+00000104], 2EA7C34A
:00424C49 C784240801000077D0E14F mov dword ptr [esp+00000108], 4FE1D077
:00424C54 C784240C0100009C2FA21A mov dword ptr [esp+0000010C], 1AA22F9C
:00424C5F C7842410010000A19D120D mov dword ptr [esp+00000110], 0D129DA1
:00424C6A C7842414010000F5E9DAA3 mov dword ptr [esp+00000114], A3DAE9F5
:00424C75 C784241801000060571A3C mov dword ptr [esp+00000118], 3C1A5760
:00424C80 C784241C0100001AE50B72 mov dword ptr [esp+0000011C], 720BE51A
:00424C8B C7842420010000F4FFADF0 mov dword ptr [esp+00000120], F0ADFFF4
:00424C96 C78424240100004D955A7F mov dword ptr [esp+00000124], 7F5A954D
:00424CA1 C784242801000027E4CADF mov dword ptr [esp+00000128], DFCAE427
:00424CAC C784242C010000D4F3A51C mov dword ptr [esp+0000012C], 1CA5F3D4
:00424CB7 C78424300100003EADE8D6 mov dword ptr [esp+00000130], D6E8AD3E
:00424CC2 C78424340100002CB7896E mov dword ptr [esp+00000134], 6E89B72C
:00424CCD C78424380100000C22B146 mov dword ptr [esp+00000138], 46B1220C
:00424CD8 C784243C0100004C30F574 mov dword ptr [esp+0000013C], 74F5304C
:00424CE3 C7842440010000E46A51A9 mov dword ptr [esp+00000140], A9516AE4
:00424CEE 8BB42460020000 mov esi, dword ptr [esp+00000260]
:00424CF5 898C242C020000 mov dword ptr [esp+0000022C], ecx
:00424CFC 89842430020000 mov dword ptr [esp+00000230], eax
:00424D03 33FF xor edi, edi
:00424D05 8B16 mov edx, dword ptr [esi]
:00424D07 C78424440100000007F858 mov dword ptr [esp+00000144], 58F80700
:00424D12 C78424480100007A2E6396 mov dword ptr [esp+00000148], 96632E7A
:00424D1D C784244C010000ED92EA4C mov dword ptr [esp+0000014C], 4CEA92ED
:00424D28 C7842450010000A3747F7A mov dword ptr [esp+00000150], 7A7F74A3
:00424D33 C7842454010000D4E5B9BC mov dword ptr [esp+00000154], BCB9E5D4
:00424D3E C7842458010000ED132F38 mov dword ptr [esp+00000158], 382F13ED
:00424D49 C784245C010000708F3F52 mov dword ptr [esp+0000015C], 523F8F70
:00424D54 C78424600100003C09796F mov dword ptr [esp+00000160], 6F79093C
:00424D5F C7842464010000C26B3CEB mov dword ptr [esp+00000164], EB3C6BC2
:00424D6A C7842468010000B85CD5BC mov dword ptr [esp+00000168], BCD55CB8
:00424D75 C784246C01000033D74E1B mov dword ptr [esp+0000016C], 1B4ED733
:00424D80 C7842470010000D9BB22F1 mov dword ptr [esp+00000170], F122BBD9
:00424D8B C78424740100004E80F4C7 mov dword ptr [esp+00000174], C7F4804E
:00424D96 C78424780100006ADA3DFD mov dword ptr [esp+00000178], FD3DDA6A
:00424DA1 C784247C010000BB6B47F9 mov dword ptr [esp+0000017C], F9476BBB
:00424DAC C7842480010000563242A5 mov dword ptr [esp+00000180], A5423256
:00424DB7 C78424840100002F33ADEC mov dword ptr [esp+00000184], ECAD332F
:00424DC2 C784248801000015635500 mov dword ptr [esp+00000188], 00556315
:00424DCD C784248C010000279EA928 mov dword ptr [esp+0000018C], 28A99E27
:00424DD8 C7842490010000C3D7A0D9 mov dword ptr [esp+00000190], D9A0D7C3
:00424DE3 C78424940100006EAF16C0 mov dword ptr [esp+00000194], C016AF6E
:00424DEE C784249801000053A1ACB6 mov dword ptr [esp+00000198], B6ACA153
:00424DF9 C784249C010000F311FF1B mov dword ptr [esp+0000019C], 1BFF11F3
:00424E04 C78424A00100007FFA4A11 mov dword ptr [esp+000001A0], 114AFA7F
:00424E0F C78424A40100002680190E mov dword ptr [esp+000001A4], 0E198026
:00424E1A C78424A801000009990021 mov dword ptr [esp+000001A8], 21009909
:00424E25 C78424AC010000D1A8A14D mov dword ptr [esp+000001AC], 4DA1A8D1
:00424E30 C78424B0010000ED000012 mov dword ptr [esp+000001B0], 120000ED
:00424E3B C78424B40100006A274114 mov dword ptr [esp+000001B4], 1441276A
:00424E46 C78424B8010000182975CE mov dword ptr [esp+000001B8], CE752918
:00424E51 C78424BC010000DC9DF7D8 mov dword ptr [esp+000001BC], D8F79DDC
:00424E5C C78424C00100009938A35C mov dword ptr [esp+000001C0], 5CA33899
:00424E67 C78424C4010000F2C0A635 mov dword ptr [esp+000001C4], 35A6C0F2
:00424E72 C78424C80100003BA6FC5D mov dword ptr [esp+000001C8], 5DFCA63B
:00424E7D C78424CC010000616CF549 mov dword ptr [esp+000001CC], 49F56C61
:00424E88 C78424D0010000F5D34ADD mov dword ptr [esp+000001D0], DD4AD3F5
:00424E93 C78424D4010000F9F39E77 mov dword ptr [esp+000001D4], 779EF3F9
:00424E9E C78424D801000093A56641 mov dword ptr [esp+000001D8], 4166A593
:00424EA9 C78424DC010000FBB547C8 mov dword ptr [esp+000001DC], C847B5FB
:00424EB4 C78424E0010000996E1682 mov dword ptr [esp+000001E0], 82166E99
:00424EBF C78424E4010000C1483A70 mov dword ptr [esp+000001E4], 703A48C1
:00424ECA C78424E8010000B05B00BF mov dword ptr [esp+000001E8], BF005BB0
:00424ED5 C78424EC0100008AE26E87 mov dword ptr [esp+000001EC], 876EE28A
:00424EE0 C78424F0010000FDC18C7D mov dword ptr [esp+000001F0], 7D8CC1FD
:00424EEB C78424F4010000E1C1329B mov dword ptr [esp+000001F4], 9B32C1E1
:00424EF6 C78424F8010000C5CEDF41 mov dword ptr [esp+000001F8], 41DFCEC5
:00424F01 C78424FC010000858A0B0F mov dword ptr [esp+000001FC], 0F0B8A85
:00424F0C C7842400020000A8F7B49B mov dword ptr [esp+00000200], 9BB4F7A8
:00424F17 C78424040200006F9BA29A mov dword ptr [esp+00000204], 9AA29B6F
:00424F22 C7842408020000DDCF7D82 mov dword ptr [esp+00000208], 827DCFDD
:00424F2D C784240C020000810829FE mov dword ptr [esp+0000020C], FE290881
:00424F38 C7842410020000D344D0EB mov dword ptr [esp+00000210], EBD044D3
:00424F43 C784241402000045621FF7 mov dword ptr [esp+00000214], F71F6245
:00424F4E C784241802000081DB5AF0 mov dword ptr [esp+00000218], F05ADB81
:00424F59 C784241C02000011E4F0AB mov dword ptr [esp+0000021C], ABF0E411
:00424F64 C7842420020000DFD567EB mov dword ptr [esp+00000220], EB67D5DF
:00424F6F C78424240200006F404C30 mov dword ptr [esp+00000224], 304C406F
:00424F7A C78424280200001941279A mov dword ptr [esp+00000228], 9A274119
:00424F85 C7842434020000C50A9410 mov dword ptr [esp+00000234], 10940AC5
:00424F90 C7842438020000FD37B872 mov dword ptr [esp+00000238], 72B837FD
:00424F9B C784243C0200008BE00FAE mov dword ptr [esp+0000023C], AE0FE08B
:00424FA6 C784244002000058050368 mov dword ptr [esp+00000240], 68030558
:00424FB1 C7842444020000F6F6D1C8 mov dword ptr [esp+00000244], C8D1F6F6
:00424FBC C7842448020000E41606BD mov dword ptr [esp+00000248], BD0616E4
:00424FC7 C784244C0200005B5FC673 mov dword ptr [esp+0000024C], 73C65F5B
:00424FD2 C78424500200006288114A mov dword ptr [esp+00000250], 4A118862
:00424FDD C7842454020000FA38D8DA mov dword ptr [esp+00000254], DAD838FA
:00424FE8 C7842458020000445C278A mov dword ptr [esp+00000258], 8A275C4

:00424FF3 C744240C6A1A9E5C mov [esp+0C], 5C9E1A6A
:00424FFB C7442410144043EF mov [esp+10], EF434014
:00425003 33C9 xor ecx, ecx
:00425005 8D442418 lea eax, dword ptr [esp+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042501C(C)
|
:00425009 8B18 mov ebx, dword ptr [eax]
:0042500B 81F390AD34B8 xor ebx, B834AD90
:00425011 3BD3 cmp edx, ebx
:00425013 7434 je 00425049
:00425015 83C008 add eax, 00000008
:00425018 41 inc ecx
:00425019 83F949 cmp ecx, 00000049
:0042501C 7CEB jl 00425009
:0042501E 33C9 xor ecx, ecx
:00425020 8D442410 lea eax, dword ptr [esp+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00425037(C)
|
:00425024 8B30 mov esi, dword ptr [eax]
:00425026 81F690AD34B8 xor esi, B834AD90
:0042502C 3BD6 cmp edx, esi
:0042502E 740F je 0042503F
:00425030 83C008 add eax, 00000008
:00425033 41 inc ecx
:00425034 83F901 cmp ecx, 00000001
:00425037 7CEB jl 00425024
:00425039 893D30514A00 mov dword ptr [004A5130], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042502E(C)
|
:0042503F 5F pop edi
:00425040 5E pop esi
:00425041 5B pop ebx
:00425042 81C450020000 add esp, 00000250
:00425048 C3 ret

呵呵！这些黑名单还真不少啊，希望你的不会在此之列！继续按F10经过两个ret后会来到如下地方：

* Possible StringData Ref from Data Obj ->"CDRWIN.DAT"
|
:004034E6 68CC124A00 push 004A12CC
:004034EB C645FC01 mov [ebp-04], 01
:004034EF E83C0C0200 call 00424130
:004034F4 83C40C add esp, 0000000C <--来到这里
:004034F7 895DFC mov dword ptr [ebp-04], ebx
:004034FA E8711B0200 call 00425070 <--按F8进入
:004034FF 85C0 test eax, eax
:00403501 7542 jne 00403545 <--一定要跳转，否则就弹出了那讨厌的窗口
:00403503 53 push ebx
:00403504 8D4D88 lea ecx, dword ptr [ebp-78]
:00403507 E834F60000 call 00412B40
:0040350C 8D4D88 lea ecx, dword ptr [ebp-78]
:0040350F C645FC03 mov [ebp-04], 03
:00403513 E8CA5A0600 call 00468FE2
:00403518 8D4D88 lea ecx, dword ptr [ebp-78]
:0040351B 885DFC mov byte ptr [ebp-04], bl
:0040351E E800570600 call 00468C23
:00403523 8D4DEC lea ecx, dword ptr [ebp-14]
:00403526 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0040352D E811970600 call 0046CC43
:00403532 33C0 xor eax, eax
:00403534 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00403537 64890D00000000 mov dword ptr fs:[00000000], ecx
:0040353E 5F pop edi
:0040353F 5E pop esi
:00403540 5B pop ebx
:00403541 8BE5 mov esp, ebp
:00403543 5D pop ebp
:00403544 C3 ret

按F8进入会来到如下地方：

* Referenced by a CALL at Address:
|:004034FA
|
:00425070 51 push ecx
:00425071 A120DD4A00 mov eax, dword ptr [004ADD20]
:00425076 6A00 push 00000000
:00425078 8D4C2404 lea ecx, dword ptr [esp+04]
:0042507C 6A04 push 00000004
:0042507E 83C064 add eax, 00000064
:00425081 51 push ecx
:00425082 68E07F4A00 push 004A7FE0
:00425087 89442410 mov dword ptr [esp+10], eax
:0042508B E8C0270200 call 00447850 <--按F8进入
:00425090 C1E810 shr eax, 10
:00425093 33D2 xor edx, edx
:00425095 66390526DD4A00 cmp word ptr [004ADD26], ax
:0042509C 0F94C2 sete dl
:0042509F 8BC2 mov eax, edx
:004250A1 83C414 add esp, 00000014
:004250A4 C3 ret

按F8进入会来到如下地方：

* Referenced by a CALL at Addresses:
|:0042463C , :004247FE , :00424971 , :0042508B , :00447F8D
|
:00447850 8B442410 mov eax, dword ptr [esp+10]
:00447854 8B542408 mov edx, dword ptr [esp+08]
:00447858 57 push edi
:00447859 8B7C2410 mov edi, dword ptr [esp+10]
:0044785D 6685FF test di, di
:00447860 743E je 004478A0
:00447862 53 push ebx
:00447863 55 push ebp
:00447864 56 push esi
:00447865 8B742414 mov esi, dword ptr [esp+14]
:00447869 81E7FFFF0000 and edi, 0000FFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044789B(C)
|
:0044786F 33C9 xor ecx, ecx
:00447871 8BE8 mov ebp, eax
:00447873 8A0A mov cl, byte ptr [edx] <--edx为存放u4+100的内存地址
:00447875 42 inc edx
:00447876 8BD9 mov ebx, ecx
:00447878 33D8 xor ebx, eax
:0044787A 83E30F and ebx, 0000000F
:0044787D C1ED04 shr ebp, 04
:00447880 8B049E mov eax, dword ptr [esi+4*ebx] <--esi为存放密码表的内存地址
:00447883 33C5 xor eax, ebp
:00447885 C1E904 shr ecx, 04
:00447888 8BD8 mov ebx, eax
:0044788A 83E10F and ecx, 0000000F
:0044788D 83E30F and ebx, 0000000F
:00447890 33CB xor ecx, ebx
:00447892 C1E804 shr eax, 04
:00447895 8B0C8E mov ecx, dword ptr [esi+4*ecx]
:00447898 33C1 xor eax, ecx
:0044789A 4F dec edi
:0044789B 75D2 jne 0044786F
:0044789D 5E pop esi
:0044789E 5D pop ebp
:0044789F 5B pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447860(C)
|
:004478A0 5F pop edi
:004478A1 C3 ret

大家对上面这段代码是不是有点眼熟，是的。可惜是“代码依旧，密码已非”。这次我想大家应该能够编出正确的注册机了吧！

附：密码表2
00000000 1DB71064 3B6E20C8 26D930AC
76DC4190 6B6B51F4 4DB26158 5005713C
EDB88320 F00F9344 D6D6A3E8 CB61B38C
9B64C2B0 86D3D2D4 A00AE278 BDBDF21C

我的正确的注册码：
name：时空幻影
company：湖南长沙
Unlock Key：69684041-65AD2ED1-4B34AD7F-A9D27FF5
Check Key：C0BA3FB4-0CC56E90-2E9983AE-E2E6D28A

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Edit1->Text.Length()<6||Edit2->Text.Length()<6)
{
Application->MessageBoxA("Name和Company字符数必须大于等于6","警告",MB_OK);
return;
}
AnsiString s1=Edit1->Text,s2=Edit2->Text,s3;
int passcode1[16]={0x00000000,0x1c3e887e,0x387d10fc,0x24439882,
0x70fa21f8,0x6cc4a986,0x48873104,0x54b9b97a,
0xe1f443f0,0xfdcacb8e,0xd989530c,0xc5b7db72,
0x910e6208,0x8d30ea76,0xa97372f4,0xb54dfa8a};
int passcode2[16]={0x00000000,0x1cb71064,0x3b6e20c8,0x26d930ac,
0x71dc4190,0x6b6b51f4,0x4db26158,0x5005713c,
0xedb88320,0xf00f9344,0xd6d6a3e8,0xcb61b38c,
0x9b64c2b0,0x86d3d2d4,0xa0cae278,0xbdbdf21c};
int u[4],c[4],t,t1,t2,t3,t4,i,sum=0,temp=0;
for (i=1;i<=Edit1->Text.Length();i++)
{
t=int(s1[i]);
if (t<0) t+=256;
t1=(t^temp)&0x0f;
t2=passcode1[t1]^((temp>>4)&0x0fffffff);
t3=(t>>4)&0x0f;
t4=t3^(t2&0x0f);
temp=((t2>>4)&0x0fffffff)^passcode1[t4];
}
sum=temp;
temp=0;
for (i=1;i<=Edit2->Text.Length();i++)
{
t=int(s2[i]);
if (t<0) t+=256;
t1=(t^temp)&0x0f;
t2=passcode1[t1]^((temp>>4)&0x0fffffff);
t3=(t>>4)&0x0f;
t4=t3^(t2&0x0f);
temp=((t2>>4)&0x0fffffff)^passcode1[t4];
}
temp=((temp>>0x18)&0xff)+((temp>>8)&0xff00)+((temp<<8)&0xff0000)+(temp<<0x18);
u[3]=sum^temp;
sum=u[3]+100;
temp=0;
for (i=1;i<=4;i++)
{
t=sum%0x100;
sum=sum>>8;
if (t<0) t+=256;
t1=(t^temp)&0x0f;
t2=passcode2[t1]^((temp>>4)&0x0fffffff);
t3=(t>>4)&0x0f;
t4=t3^(t2&0x0f);
temp=((t2>>4)&0x0fffffff)^passcode2[t4];
}
u[2]=(0x4bc^((u[3]>>0x10)&0xffff))+((temp>>0x10)<<0x10);
u[1]=u[2]*u[3];
u[0]=u[1]*u[2]*u[3];
c[0]=u[3]^u[0];
c[1]=u[0]^u[1];
c[2]=u[1]^u[2];
c[3]=u[2]^u[3];
Edit3->Text=IntToHex(u[0],8)+"-"+IntToHex(u[1],8)+"-"+IntToHex(u[2],8)+"-"+IntToHex(u[3],8);
Edit4->Text=IntToHex(c[0],8)+"-"+IntToHex(c[1],8)+"-"+IntToHex(c[2],8)+"-"+IntToHex(c[3],8);
}
//---------------------------------------------------------------------------


CDSpace Power+

 标 题:CDSpace Power+注册算法 (7千字)
发信人:machoman[CCG]
时 间:2001-7-27 12:00:59
详细信息:
介绍一个很好的虚拟光驱软件。非常好用，能对付很多保护光盘游戏。大家试试看，这家伙把SafeDisc系列的都
搞定了。
http://www.cdspace.com
CDSpace Power+

Name:machoman[CCG]
Evaluation:S14159212781592600
注册部分在ChoiceOS.dll文件中，非常简单。

:10007640 6AFF push FFFFFFFF
:10007642 6860C50010 push 1000C560
:10007647 64A100000000 mov eax, dword ptr fs:[00000000]
:1000764D 50 push eax
:1000764E 64892500000000 mov dword ptr fs:[00000000], esp
:10007655 83EC10 sub esp, 00000010
:10007658 8D4C2408 lea ecx, dword ptr [esp+08]
:1000765C C744241800000000 mov [esp+18], 00000000

* Reference To: MFC42.Ordinal:021C, Ord:021Ch
|
:10007664 E8C1420000 Call 1000B92A
:10007669 8D4C2404 lea ecx, dword ptr [esp+04]
:1000766D C644241801 mov [esp+18], 01

* Reference To: MFC42.Ordinal:021C, Ord:021Ch
|
:10007672 E8B3420000 Call 1000B92A
:10007677 8D4C2400 lea ecx, dword ptr [esp]
:1000767B C644241802 mov [esp+18], 02

* Reference To: MFC42.Ordinal:021C, Ord:021Ch
|
:10007680 E8A5420000 Call 1000B92A
:10007685 8B442420 mov eax, dword ptr [esp+20]
:10007689 C644241803 mov [esp+18], 03
:1000768E 8378F812 cmp dword ptr [eax-08], 00000012;注册码长度为18个字符
:10007692 740E je 100076A2
:10007694 C644241802 mov [esp+18], 02
:10007699 8D4C2400 lea ecx, dword ptr [esp]
:1000769D E9E1000000 jmp 10007783

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10007692(C)
|
:100076A2 8A00 mov al, byte ptr [eax]
:100076A4 3C73 cmp al, 73 ;注册码第一个字符为"s"
:100076A6 7412 je 100076BA
:100076A8 3C53 cmp al, 53 ；或注册码第一个字符"S"
:100076AA 740E je 100076BA
:100076AC C644241802 mov [esp+18], 02
:100076B1 8D4C2400 lea ecx, dword ptr [esp]
:100076B5 E9C9000000 jmp 10007783

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:100076A6(C), :100076AA(C)
|
:100076BA 6A04 push 00000004
:100076BC 8D442410 lea eax, dword ptr [esp+10]
:100076C0 6A07 push 00000007
:100076C2 50 push eax
:100076C3 8D4C242C lea ecx, dword ptr [esp+2C]

* Reference To: MFC42.Ordinal:10B6, Ord:10B6h
|
:100076C7 E848430000 Call 1000BA14
:100076CC 50 push eax
:100076CD 8D4C240C lea ecx, dword ptr [esp+0C]
:100076D1 C644241C04 mov [esp+1C], 04

* Reference To: MFC42.Ordinal:035A, Ord:035Ah
|
:100076D6 E8F7420000 Call 1000B9D2
:100076DB 8D4C240C lea ecx, dword ptr [esp+0C]
:100076DF C644241803 mov [esp+18], 03

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:100076E4 E811420000 Call 1000B8FA
:100076E9 6A06 push 00000006
:100076EB 8D4C2410 lea ecx, dword ptr [esp+10]
:100076EF 6A0C push 0000000C
:100076F1 51 push ecx
:100076F2 8D4C242C lea ecx, dword ptr [esp+2C]

* Reference To: MFC42.Ordinal:10B6, Ord:10B6h
|
:100076F6 E819430000 Call 1000BA14
:100076FB 50 push eax
:100076FC 8D4C2408 lea ecx, dword ptr [esp+08]
:10007700 C644241C05 mov [esp+1C], 05

* Reference To: MFC42.Ordinal:035A, Ord:035Ah
|
:10007705 E8C8420000 Call 1000B9D2
:1000770A 8D4C240C lea ecx, dword ptr [esp+0C]
:1000770E C644241803 mov [esp+18], 03

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:10007713 E8E2410000 Call 1000B8FA
:10007718 8B542404 mov edx, dword ptr [esp+04]
:1000771C 52 push edx ；注册码的最后6位“592600”转换为整型计算，生成8-11位注册码

* Reference To: MSVCRT.atoi, Ord:023Dh
|
:1000771D FF15A0D20010 Call dword ptr [1000D2A0]
:10007723 8D0C40 lea ecx, dword ptr [eax+2*eax]
:10007726 83C404 add esp, 00000004
:10007729 C1E104 shl ecx, 04
:1000772C 2BC8 sub ecx, eax
:1000772E 8D542400 lea edx, dword ptr [esp]
:10007732 C1E105 shl ecx, 05
:10007735 2BC8 sub ecx, eax
:10007737 8D0C89 lea ecx, dword ptr [ecx+4*ecx]
:1000773A D1E1 shl ecx, 1
:1000773C 2BC8 sub ecx, eax
:1000773E 8BC1 mov eax, ecx
:10007740 3511110000 xor eax, 00001111
:10007745 2D9B460000 sub eax, 0000469B
:1000774A 3521570000 xor eax, 00005721
:1000774F 25A5FF0000 and eax, 0000FFA5
:10007754 83C053 add eax, 00000053
:10007757 50 push eax ；计算结果在eax中，我的是‘1278’

* Possible StringData Ref from Data Obj ->"%0.4X"
|
:10007758 6830050110 push 10010530
:1000775D 52 push edx

* Reference To: MFC42.Ordinal:0B02, Ord:0B02h
|
:1000775E E8C1410000 Call 1000B924
:10007763 8B442414 mov eax, dword ptr [esp+14]
:10007767 8B4C240C mov ecx, dword ptr [esp+0C]
:1000776B 50 push eax；计算出来的结果
:1000776C 51 push ecx；你的注册玛中输入的8-11位的数据

* Reference To: MSVCRT._mbsicmp, Ord:015Fh
|
:1000776D FF15B8D20010 Call dword ptr [1000D2B8]
:10007773 83C414 add esp, 00000014
:10007776 C644241802 mov [esp+18], 02
:1000777B 85C0 test eax, eax；相等吗？相等注册成功！
:1000777D 8D4C2400 lea ecx, dword ptr [esp]
:10007781 7445 je 100077C8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000769D(U), :100076B5(U)
|

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:10007783 E872410000 Call 1000B8FA
:10007788 8D4C2404 lea ecx, dword ptr [esp+04]
:1000778C C644241801 mov [esp+18], 01

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:10007791 E864410000 Call 1000B8FA
:10007796 8D4C2408 lea ecx, dword ptr [esp+08]
:1000779A C644241800 mov [esp+18], 00

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:1000779F E856410000 Call 1000B8FA
:100077A4 8D4C2420 lea ecx, dword ptr [esp+20]
:100077A8 C7442418FFFFFFFF mov [esp+18], FFFFFFFF

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:100077B0 E845410000 Call 1000B8FA
:100077B5 33C0 xor eax, eax
:100077B7 8B4C2410 mov ecx, dword ptr [esp+10]
:100077BB 64890D00000000 mov dword ptr fs:[00000000], ecx
:100077C2 83C41C add esp, 0000001C
:100077C5 C20400 ret 0004
麻烦尾哥写个注册机，这真的是个非常好的软件。绝非垃圾。


CDSPACE1.95

标 题:CDSPACE1.95破解手记(专为初学者而作!) (8千字)
发信人:夜月
时 间:2000-12-30 17:00:42
详细信息:
CDSPCE1.95破解纪录
这个软件本来在《看雪论坛精华2》中，菜鸟大师已经写了一片很详细的破解纪录,可是在我自己破解的过程中
,发现还有些事情没讲清楚,特别是看注册码的地方,"为什么我在这里D EAX就可以看到注册码?"这可能是广大
初学者在看破解文章的时候最搞不清楚的地方.可是,恕我孤陋寡闻,把这一点讲得很清楚的好像只有城市猎人,
说道这里,我就不得不提提城市猎人的《探索杂志》，这的确是一分很好的杂志，尤其是前几期的《初学天地》栏目，可能是我见到的写的最好的入门教程了，所以，广大想学破解的朋友们，花点时间到城市猎人的网站
上去下载它的前几期杂志读一读我觉得是最好的入门方法了！好了，废话就说到这里，下面开始我们的正题。
REDAY？GO！
1。架起TRW2000，LOAD CDSPACE，调出注册窗口，随便输入一些信息。我的输入如下所示，你完全不必和我
的一样。
NAME：luoyi
REGISTRATION CODE：654321
2。CTRL+M，切入TRW2000，下断点“G GETWINDOWTEXT”，“G”回到程序中。
3。一按“OK”，我们就又回到TRW2000了。
4。PMODULE。你将看到如下代码：
015F:00409322 E80B680000 CALL `MFC42!ord_00000942`
015F:00409327 83C664 ADD ESI,BYTE +64 <-------------你停在这里！
015F:0040932A 56 PUSH ESI
015F:0040932B 68EB030000 PUSH DWORD 03EB
015F:00409330 57 PUSH EDI
015F:00409331 E8FC670000 CALL `MFC42!ord_00000942`
015F:00409336 5F POP EDI
015F:00409337 5E POP ESI
015F:00409338 C20400 RET 04
稍有一点asm知识的就可以看出，这一段代码对我们破解没有什么作用，因为它没有跳转，所以我们就不必和它费事，F12跳过即可。可是跳出来以后，发现还是没有跳转，所以我们就继续F12。两次以后，来到了这里：

015F:00409570 E829660000 CALL `MFC42!ord_000018BE`
015F:00409575 8D4C2410 LEA ECX,[ESP+10] <--------从这里出来了！
015F:00409579 E89C650000 CALL `MFC42!ord_0000021C`
015F:0040957E 33F6 XOR ESI,ESI
015F:00409580 8D4C2414 LEA ECX,[ESP+14]
015F:00409584 8974242C MOV [ESP+2C],ESI
015F:00409588 E88D650000 CALL `MFC42!ord_0000021C`
015F:0040958D 8B4760 MOV EAX,[EDI+60]
015F:00409590 8D6F60 LEA EBP,[EDI+60]
015F:00409593 C644242C01 MOV BYTE [ESP+2C],01
015F:00409598 8378F806 CMP DWORD [EAX-08],BYTE +06
015F:0040959C 7D0C JNL 004095AA
到了这里以后，就不能再F12了，为什么呢？因为有这一句的存在！
015F:00409598 8378F806 CMP DWORD [EAX-08],BYTE +06
015F:0040959C 7D0C JNL 004095AA
这是一个有条件跳转，我们当然不能放过它！于是，在这一段里我们改用F10跟踪。一直就到了这个跳转，这里是比较什么来跳的呢？我们D EAX一下，发现是： luoyi，那么[EAX-8]，又是什么呢？一般在这种情况下，
[EAX-8]里存放的都是[EAX]中存储的字符串的长度，这一点，就是靠你经验的积累了，当然了，如果你的API
够熟的话，就当我在说废话吧，呵呵。。。。于是在这里，我们知道了名字的长度要大于或等于6才行。好了，回去改改吧，我改的是： NAME：luoyiluo，这里有句话得提醒新手们，回去之前，一定不要忘了
在你跟到的地方用F9设断，否则，输完信息后再想回来，又得累死你的显示器了。呵呵。。废话少说，我们继续，名字这一关已经过了，下面我们继续走：
015F:0040959E 56 PUSH ESI
015F:0040959F 56 PUSH ESI
015F:004095A0 6810884100 PUSH DWORD 00418810
015F:004095A5 E902010000 JMP 004096AC
015F:004095AA 8B5764 MOV EDX,[EDI+64]
015F:004095AD 8D5F64 LEA EBX,[EDI+64]
015F:004095B0 837AF810 CMP DWORD [EDX-08],BYTE +10
015F:004095B4 740C JZ 004095C2
这里又来了一个比较，比较什么呢？有了我上面说的基础，你应该很容易就猜到了吧？D EDX，发现是：
654321，无疑，这里就是判断注册码的长度了，注册码的长度得等于10才正确。别急，你还得搞清楚一个问题
这里的10和我们平常说的10可是有大大的不同，这里是16进制，这里的10就是我们平时说的16，这一点可经常
让一些初学破解的人栽跟头呢。（比如我。。呵呵。。。）于是，我们又回到程序中，改信息如下：（你不会忘记设断点吧？）
REGISTRATION CODE ：0987654321123456
好了，长度都对了，下面我们继续走：
015F:004095B6 56 PUSH ESI
015F:004095B7 56 PUSH ESI
015F:004095B8 68FC874100 PUSH DWORD 004187FC
015F:004095BD E9EA000000 JMP 004096AC

015F:004095C2 33C9 XOR ECX,ECX <-------长度正确了，我们就走到这里来了!--|
015F:004095C4 8A040A MOV AL,[EDX+ECX] |
015F:004095C7 3C30 CMP AL,30 这一段比较,看你的注册码中有没有 |
015F:004095C9 7C04 JL 004095CF 一些特殊的字符,你应该好好看看, | 015F:004095CB 3C39 CMP AL,39 这可是锻炼ASM能力的好机会! |
015F:004095CD 7E10 JNG 004095DF |
015F:004095CF 3C41 CMP AL,41 |
015F:004095D1 0F8CC7000000 JL NEAR 0040969E |
015F:004095D7 3C46 CMP AL,46 |
015F:004095D9 0F8FBF000000 JG NEAR 0040969E | 015F:004095DF 41 INC ECX |
015F:004095E0 83F908 CMP ECX,BYTE +08 |
015F:004095E3 7CDF JL 004095C4 <------------------------------------------|
.............
.............
015F:00409644 8B03 MOV EAX,[EBX]
015F:00409646 8B542410 MOV EDX,[ESP+10]
015F:0040964A 50 PUSH EAX
015F:0040964B 52 PUSH EDX
015F:0040964C FF158C264100 CALL `MSVCRT!_mbscmp` <------------------!!!!!!!!
015F:00409652 83C408 ADD ESP,BYTE +08
015F:00409655 85C0 TEST EAX,EAX
015F:00409657 6A00 PUSH BYTE +00
015F:00409659 6A00 PUSH BYTE +00
015F:0040965B 754A JNZ 004096A7 <-------------跳过去就玩完了.呵呵...
..................
..................
015F:0040969C EB13 JMP SHORT 004096B1 <----------正确的时候才能走到这儿跳
015F:0040969E 56 PUSH ESI
015F:0040969F 56 PUSH ESI
015F:004096A0 68B0874100 PUSH DWORD 004187B0
015F:004096A5 EB05 JMP SHORT 004096AC
015F:004096A7 6890874100 PUSH DWORD 00418790
015F:004096AC E8E1640000 CALL `MFC42!ord_000004B0` <------------出错处！

015F:004096B1 8D4C2414 LEA ECX,[ESP+14]
015F:004096B5 C644242C00 MOV BYTE [ESP+2C],00
015F:004096BA E843640000 CALL `MFC42!ord_00000320`
015F:004096BF 8D4C2410 LEA ECX,[ESP+10]
015F:004096C3 C744242CFFFFFFFF MOV DWORD [ESP+2C],FFFFFFFF
015F:004096CB E832640000 CALL `MFC42!ord_00000320`
015F:004096D0 8B4C2424 MOV ECX,[ESP+24]
015F:004096D4 5F POP EDI
015F:004096D5 5E POP ESI
015F:004096D6 5D POP EBP
015F:004096D7 64890D00000000 MOV [FS:00],ECX
015F:004096DE 5B POP EBX
015F:004096DF 83C420 ADD ESP,BYTE +20
015F:004096E2 C3 RET
来到这里以后,有感觉的话,可能已经可以感觉到该是作关键性的比较的时候了。让我们PAGE DOWN几下，???
看到我打"!!!!"的那个比较了了么?这么明显的事,不用我再教了吧?
015F:0040964A 50 PUSH EAX
015F:0040964B 52 PUSH EDX
015F:0040964C FF158C264100 CALL `MSVCRT!_mbscmp` <------------------!!!!!!!!
015F:00409652 83C408 ADD ESP,BYTE +08
015F:00409655 85C0 TEST EAX,EAX
015F:00409657 6A00 PUSH BYTE +00
015F:00409659 6A00 PUSH BYTE +00
015F:0040965B 754A JNZ 004096A7
D EAX,D EDX,你就可以看到正确的注册码和你输入的注册码了。这里你又可以看到城市猎人的《探索杂志》
中总结的经典比较形势
MOV EDX，[ ]
MOV EAX，[ ]
CALL XXXXXXXX
TEST XXX，XXX
JZ/JNZ XXXXXXXX
的威力了吧？呵呵。。。所以我说，那是一份很好的杂志吧？
好了，写到这里，CDSPACE的破解也就说完了，相信应该不会有人说看不懂吧？我是尽力把东西写的好懂一点
，尽量向大家讲清楚“为什么”而不是告诉你“是什么”就完事了，我自己也是个初学者，深切的体会到初学者在跟程序的时候的种种迷惑，我只是尽我所能把我的经验讲述出来，让大家少走一点弯路。希望这样的文章
能够得到大家的喜欢。
另外：注册后，程序把注册信息放在：
HKEY_LOCAL_MACHINE\SOFTWARE\SPACE INTERNATION\CDSPACE\SETTINGS\NAME 注册名
HKEY_LOCAL_MACHINE\SOFTWARE\SPACE INTERNATION\CDSPACE\SETTINGS\EVALUATION 注册码
删除这两个键或是改变它们的值都可以使程序回到未注册状态，你又可以继续练习！
请多指教！
作者：夜月(“破！”这个名字我自己都觉得不太好听，所以改了，呵呵。。。。希望大家能记得我）
E-MAIL： luoyi.ly@263.net
oicq:36606500
欢迎大家以各种方式和我联系！


ChinaRen校友录伴侣 v1.01

 标 题:本人处女作，不知BCG可否收留？ (1千字)
发信人:crackboy
时 间:2001-8-7 20:06:32
详细信息:
第一篇

软件名称：ChinaRen校友录伴侣
版本：v1.01 build 10717
下载地址：http://alumni.chinaren.com/

工具：PW32GOLD，TRW1.23。

过程：
先用PW32反汇编，查找“你输入的用户注册码不正确”。
来到如下地址：
:004B5026 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:004B502C E847EDF7FF call 00433D78
:004B5031 8B55EC mov edx, dword ptr [ebp-14]
:004B5034 58 pop eax
:004B5035 E8E2F0F4FF call 0040411C------->比较
:004B503A 7416 je 004B5052 ------->不跳即死

* Possible StringData Ref from Code Obj ->"您输入的用户注册码不正确。"
|
:004B503C B8B8524B00 mov eax, 004B52B8
:004B5041 E85A46FAFF call 004596A0
:004B5046 8BC3 mov eax, ebx
:004B5048 E87B99F9FF call 0044E9C8
:004B504D E9DE010000 jmp 004B5230

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B503A(C)
|
:004B5052 8D55E8 lea edx, dword ptr [ebp-18]

.....................................................................................

进比较CALL
:0040411C 53 push ebx
:0040411D 56 push esi
:0040411E 57 push edi
:0040411F 89C6 mov esi, eax---->真的注册码（D EAX）
:00404121 89D7 mov edi, edx---->假的注册码（D EDX）
:00404123 39D0 cmp eax, edx---->比较
:00404125 0F848F000000 je 004041BA

......................................................................................

运行程序，打开注册框，注册名填crackboy,注册码填123456.
先不要按确定，运行TRW，BPX 0040411F，F5回到程序，按确定被拦下，
这时下D EAX 可看到真的注册码023690261367041454。回到程序用真注册码注册成功！

整理注册码如下：
注册名：crackboy
注册码：023690261367041454

如转载请保持文章完整性。

标 题:贴这个的注册机 (1千字)
发信人:伪装者[CCG]
时 间:2001-8-7 21:34:09
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[20];
int i,d,x,y,z,m,n;
unsigned long c,e=0,f=0,o=0,p=0;
start:printf("*********CRAP 1.0*********\nThis keygen is made by Pretender\nPlease
  input your name : ");
gets(string);
d=strlen(string);
for(i=0;i<d;i++)
if(string[i]>='A'&&string[i]<='Z') string[i]+=32;
x=string[0]&1;y=string[d-1]&1;
m=x;n=y;
if(x==0&&y==0) {x=0x3b;y=0x17;z=0x7;}
if(x==0&&y==1) {x=0x3b;y=0x7;z=0x17;}
if(x==1&&y==0) {x=0x17;y=0x3b;z=0x7;}
if(x==1&&y==1) {x=0x17;y=0x7;z=0x3b;}
for(i=0;i<d;i++)
{c=string[i];
e+=c;e+=x;
f+=c*y;
o=c/z;o+=p;o+=(i+1)*z;p=o;}
e*=x;f*=y;o*=x;o*=y;o*=z;
e%=1000000;f%=1000000;o%=1000000;
printf("Your Register code is  : ");
if(m==0&&n==0) printf("%06lu%06lu%06lu",f,o,e);
if(m==0&&n==1) printf("%06lu%06lu%06lu",o,f,e);
if(m==1&&n==0) printf("%06lu%06lu%06lu",o,e,f);
if(m==1&&n==1) printf("%06lu%06lu%06lu",e,o,f);
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}


ChinaZip 5.0

标 题:再次凑凑热闹：破解心得之ChinaZip 5.0（中华压缩）篇 (8千字)
发信人:时空幻影
时 间:2001-4-10 11:27:00
详细信息:
破解心得之ChinaZip 5.0（中华压缩）篇

作者：时空幻影
时间：2001年4月6日
工具：W32DASM8.93黄金版中文版、TRW2000 1.22已注册版、CASPR （一种脱壳工具）、FILEINFO 2.43a。

过程：
先用FILEINFO查看ChinaZip.exe有没有加壳，果然它是由ASPack v2.001加的壳，用CASPR脱掉它的壳，再用W32DASM反汇编，点工具栏上的“STING REF（串式参考）”，查找可疑的字符串，果然看到字符串“您的注册码不正确!”，双击它，再往上翻，看看有什么跳转指令，果然马上找到了，如下所示：

:004DF699 8D4DF8 lea ecx, dword ptr [ebp-08] <--在TRW2000中用PMODULE后再按几次F10就会到这
:004DF69C 8B55FC mov edx, dword ptr [ebp-04]
:004DF69F 8BC3 mov eax, ebx
:004DF6A1 E87AFEFFFF call 004DF520 <--这里按F8进入这里，这里面计算注册码
:004DF6A6 8D55F4 lea edx, dword ptr [ebp-0C]
:004DF6A9 A1A4AD4E00 mov eax, dword ptr [004EADA4]
:004DF6AE 8B00 mov eax, dword ptr [eax]
:004DF6B0 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004DF6B6 E8BD37F5FF call 00432E78
:004DF6BB 8B45F4 mov eax, dword ptr [ebp-0C]
:004DF6BE 8B55F8 mov edx, dword ptr [ebp-08]
:004DF6C1 E8324AF2FF call 004040F8 <--这里面注册码进行比较
:004DF6C6 7568 jne 004DF730 <--跳转的话就GAME OVER了
:004DF6C8 A108AF4E00 mov eax, dword ptr [004EAF08]
:004DF6CD 8B00 mov eax, dword ptr [eax]
:004DF6CF 8B8008040000 mov eax, dword ptr [eax+00000408]
:004DF6D5 B201 mov dl, 01
:004DF6D7 E8F090FEFF call 004C87CC
:004DF6DC 8D55F0 lea edx, dword ptr [ebp-10]
:004DF6DF A1F8AF4E00 mov eax, dword ptr [004EAFF8]
:004DF6E4 8B00 mov eax, dword ptr [eax]
:004DF6E6 E89515F7FF call 00450C80
:004DF6EB 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->" - 注册用户!"
|
:004DF6EE BA7CF74D00 mov edx, 004DF77C
:004DF6F3 E8F848F2FF call 00403FF0
:004DF6F8 8B55F0 mov edx, dword ptr [ebp-10]
:004DF6FB A108AF4E00 mov eax, dword ptr [004EAF08]
:004DF700 8B00 mov eax, dword ptr [eax]
:004DF702 E8A137F5FF call 00432EA8
:004DF707 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"注册成功！"
|
:004DF709 B98CF74D00 mov ecx, 004DF78C

* Possible StringData Ref from Code Obj ->"谢谢您的宝贵支持."
|
:004DF70E BA98F74D00 mov edx, 004DF798
:004DF713 A1F8AF4E00 mov eax, dword ptr [004EAFF8]
:004DF718 8B00 mov eax, dword ptr [eax]
:004DF71A E8951BF7FF call 004512B4
:004DF71F A1EC345100 mov eax, dword ptr [005134EC]
:004DF724 C7803402000001000000 mov dword ptr [ebx+00000234], 00000001
:004DF72E EB0A jmp 004DF73A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF6C6(C)
|

* Possible StringData Ref from Code Obj ->"您的注册码不正确!"
|
:004DF730 B8B4F74D00 mov eax, 004DF7B4 <--双击字符串“您的注册码不正确!”来到这，然后往上看
:004DF735 E81288F7FF call 00457F4C

在那个CALL 004DF520按F8进入后就看到以下指令：

* Referenced by a CALL at Address:
|:004DF6A1
|
:004DF520 55 push ebp
:004DF521 8BEC mov ebp, esp
:004DF523 6A00 push 00000000
:004DF525 6A00 push 00000000
:004DF527 6A00 push 00000000
:004DF529 6A00 push 00000000
:004DF52B 6A00 push 00000000
:004DF52D 6A00 push 00000000
:004DF52F 6A00 push 00000000
:004DF531 53 push ebx
:004DF532 56 push esi
:004DF533 57 push edi
:004DF534 894DF8 mov dword ptr [ebp-08], ecx
:004DF537 8955FC mov dword ptr [ebp-04], edx
:004DF53A 8B45FC mov eax, dword ptr [ebp-04]
:004DF53D E85A4CF2FF call 0040419C
:004DF542 33C0 xor eax, eax
:004DF544 55 push ebp
:004DF545 6808F64D00 push 004DF608
:004DF54A 64FF30 push dword ptr fs:[eax]
:004DF54D 648920 mov dword ptr fs:[eax], esp
:004DF550 33F6 xor esi, esi
:004DF552 8D45F4 lea eax, dword ptr [ebp-0C]
:004DF555 8B55FC mov edx, dword ptr [ebp-04]
:004DF558 E8A348F2FF call 00403E00
:004DF55D 8B45F4 mov eax, dword ptr [ebp-0C]
:004DF560 E8834AF2FF call 00403FE8 <--这里计算用户名的长度
:004DF565 8BF8 mov edi, eax
:004DF567 85FF test edi, edi <--判断用户名长度是否为0
:004DF569 7E57 jle 004DF5C2
:004DF56B BB01000000 mov ebx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF5C0(C)
|
:004DF570 8B45F4 mov eax, dword ptr [ebp-0C]
:004DF573 8A4418FF mov al, byte ptr [eax+ebx-01] <--[EAX]为用户名的内存表示
:004DF577 E858FFFFFF call 004DF4D4 <--判断AL里的数是否为素数
:004DF57C 84C0 test al, al <--为素数的话AL为1，否则为0
:004DF57E 7425 je 004DF5A5
:004DF580 8D45E8 lea eax, dword ptr [ebp-18] <--以下为计算注册码字符部分
:004DF583 8B55F4 mov edx, dword ptr [ebp-0C]
:004DF586 8A541AFF mov dl, byte ptr [edx+ebx-01]
:004DF58A E88149F2FF call 00403F10
:004DF58F 8B45E8 mov eax, dword ptr [ebp-18]
:004DF592 8D55EC lea edx, dword ptr [ebp-14]
:004DF595 E81294F2FF call 004089AC <--小写转换成大写
:004DF59A 8B55EC mov edx, dword ptr [ebp-14]
:004DF59D 8D45F0 lea eax, dword ptr [ebp-10]
:004DF5A0 E84B4AF2FF call 00403FF0 <--合并字符

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF57E(C)
|
:004DF5A5 83FB01 cmp ebx, 00000001 <--以下为计算注册码数字部分
:004DF5A8 740A je 004DF5B4
:004DF5AA 8B45F4 mov eax, dword ptr [ebp-0C]
:004DF5AD 0FB64418FE movzx eax, byte ptr [eax+ebx-02]
:004DF5B2 EB06 jmp 004DF5BA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF5A8(C)
|
:004DF5B4 8B45F4 mov eax, dword ptr [ebp-0C]
:004DF5B7 0FB600 movzx eax, byte ptr [eax]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF5B2(U)
|
:004DF5BA 8D748612 lea esi, dword ptr [esi+4*eax+12]
:004DF5BE 43 inc ebx
:004DF5BF 4F dec edi
:004DF5C0 75AE jne 004DF570

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF569(C)
|
:004DF5C2 8D55E4 lea edx, dword ptr [ebp-1C]
:004DF5C5 8BC6 mov eax, esi <--ESI为注册码数字部分的十六进制
:004DF5C7 E8A497F2FF call 00408D70 <--十六进制转换成十进制的字符串
:004DF5CC 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004DF5CF 8D45F4 lea eax, dword ptr [ebp-0C]
:004DF5D2 8B55F0 mov edx, dword ptr [ebp-10]
:004DF5D5 E85A4AF2FF call 00404034 <--把注册码的字符部分与数字部分合并
:004DF5DA 8B45F8 mov eax, dword ptr [ebp-08]
:004DF5DD 8B55F4 mov edx, dword ptr [ebp-0C]
:004DF5E0 E8D747F2FF call 00403DBC
:004DF5E5 33C0 xor eax, eax
:004DF5E7 5A pop edx
:004DF5E8 59 pop ecx
:004DF5E9 59 pop ecx
:004DF5EA 648910 mov dword ptr fs:[eax], edx
:004DF5ED 680FF64D00 push 004DF60F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DF60D(U)
|
:004DF5F2 8D45E4 lea eax, dword ptr [ebp-1C]
:004DF5F5 BA05000000 mov edx, 00000005
:004DF5FA E88D47F2FF call 00403D8C
:004DF5FF 8D45FC lea eax, dword ptr [ebp-04]
:004DF602 E86147F2FF call 00403D68
:004DF607 C3 ret

这是我第一次写破解心得，错误遗漏再所难免，希望大家指正。
由于我没时间写注册机了，哪位编程爱好者写一下吧！！呵呵！！！


ChinaZip v2.0

 标 题:ChinaZip v2.0的注册码算法(初学者)
发信人:dyiyd
时 间:2000-11-30 11:55:25
详细信息:
ChinaZip v2.0的注册码算法(初学者)
很少写破解心得，不足之处请指正。
为什么要选择ChinaZip呢？因为ChinaZip的算法比较简单，非常适合初学者。
能让每一个初学者都能学会如何分析注册码的算法，写出注册机。（是谁在笑我...）^o^
由于本文是针对初学者，所以下面的破解过程我尽量写的详细一些。

软件介绍：
中华压缩(ChinaZip) V2.0
中华压缩是一个国产的压缩、解压缩软件，暂时只支持 zip 压缩格式，
正式版本将逐步支持RAR,ARJ,CAB 等更多的压缩格式。软件的界面、操作习惯、
程序快捷键将完全兼容 WinZip。

下载地：
http://www.soft999.com/download2/ChinaZip.exe

软件保护：
1.Aspack1.07b
2.注册码保护
-----------------

使用工具：
1.UnAspack v1.0.9.1
2.Trw2000 v1.22
3.W32dsm v8.9黄金版
4.Crackcode2000
5.VB 5.0
-------------------------
现在开始破解喽！...............

1.首先运行ChinaZip.exe
2.在帮助菜单下找到注册部分

3.用户名：dyiyd(你可输入你的名字）
注册码：98989898

4.按确定后出现“您的注册码不正确!” (这可是破解的线索哦！)
5.将ChinaZip.exe用UnAspack v1.0.9.1脱壳(有兴趣的朋友可手动脱壳。我比较懒....^o^)
6.w32dsm v8.9黄金版载入已脱壳的ChinaZip.exe
7.搜索“您的注册码不正确”字符串。很快便找到了....
8.下面开始静态分析...从“您的注册码不正确!”向上看
---------------------------------------

* Possible StringData Ref from Code Obj ->"?�蹕]"
|
:004D1DD3 68D51E4D00 push 004D1ED5
:004D1DD8 64FF30 push dword ptr fs:[eax]
:004D1DDB 648920 mov dword ptr fs:[eax], esp
:004D1DDE A1CC6D4E00 mov eax, dword ptr [004E6DCC]
:004D1DE3 8B00 mov eax, dword ptr [eax]
:004D1DE5 8B10 mov edx, dword ptr [eax]
:004D1DE7 FF92D8000000 call dword ptr [edx+000000D8]
:004D1DED 48 dec eax
:004D1DEE 0F85B6000000 jne 004D1EAA
:004D1DF4 8D55FC lea edx, dword ptr [ebp-04]
:004D1DF7 A1CC6D4E00 mov eax, dword ptr [004E6DCC]
:004D1DFC 8B00 mov eax, dword ptr [eax]
:004D1DFE 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:004D1E04 E87F10F6FF call 00432E88----------------------------/*取出你输入的用户名*/
:004D1E09 8D4DF8 lea ecx, dword ptr [ebp-08]
:004D1E0C 8B55FC mov edx, dword ptr [ebp-04]--------------/*[ebp-04]存放是你的用户名*/
:004D1E0F 8BC3 mov eax, ebx
:004D1E11 E8D6FDFFFF call 004D1BEC----------------------------/*注册码计算部分*/
:004D1E16 8D55F4 lea edx, dword ptr [ebp-0C]
:004D1E19 A1CC6D4E00 mov eax, dword ptr [004E6DCC]
:004D1E1E 8B00 mov eax, dword ptr [eax]
:004D1E20 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004D1E26 E85D10F6FF call 00432E88----------------------------/*取出你输入的注册码*/
:004D1E2B 8B45F4 mov eax, dword ptr [ebp-0C]--------------/*[ebp-0C]存放你输入的注册码*/
:004D1E2E 8B55F8 mov edx, dword ptr [ebp-08]--------------/*[ebp-08]存放真正的注册码*/
:004D1E31 E89A22F3FF call 004040D0----------------------------/*这个Call一定是注册码比较处*/
:004D1E36 7568 jne 004D1EA0-----------------------------/*我们来到这里。哈哈！有点儿意思了吧？*/
/*这里要跳就跳过了所有注册成功的信息*/
:004D1E38 A1306F4E00 mov eax, dword ptr [004E6F30]
:004D1E3D 8B00 mov eax, dword ptr [eax]
:004D1E3F 8B8008040000 mov eax, dword ptr [eax+00000408]
:004D1E45 B201 mov dl, 01
:004D1E47 E89CB3FDFF call 004AD1E8
:004D1E4C 8D55F0 lea edx, dword ptr [ebp-10]
:004D1E4F A120704E00 mov eax, dword ptr [004E7020]
:004D1E54 8B00 mov eax, dword ptr [eax]
:004D1E56 E8E1EEF7FF call 00450D3C
:004D1E5B 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->" - 注册用户!"
|
:004D1E5E BAEC1E4D00 mov edx, 004D1EEC
:004D1E63 E86021F3FF call 00403FC8
:004D1E68 8B55F0 mov edx, dword ptr [ebp-10]
:004D1E6B A1306F4E00 mov eax, dword ptr [004E6F30]
:004D1E70 8B00 mov eax, dword ptr [eax]
:004D1E72 E84110F6FF call 00432EB8
:004D1E77 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"注册成功！"
|
:004D1E79 B9FC1E4D00 mov ecx, 004D1EFC

* Possible StringData Ref from Code Obj ->"谢谢您的宝贵支持."
|
:004D1E7E BA081F4D00 mov edx, 004D1F08
:004D1E83 A120704E00 mov eax, dword ptr [004E7020]
:004D1E88 8B00 mov eax, dword ptr [eax]
:004D1E8A E8E1F4F7FF call 00451370
:004D1E8F A174F05000 mov eax, dword ptr [0050F074]
:004D1E94 C7803402000001000000 mov dword ptr [ebx+00000234], 00000001
:004D1E9E EB0A jmp 004D1EAA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1E36(C)--------------------------------------------------------------/*注意这个偏移地址，向上找到此偏移地址*/
|

* Possible StringData Ref from Code Obj ->"您的注册码不正确!"
|
:004D1EA0 B8241F4D00 mov eax, 004D1F24
:004D1EA5 E84661F8FF call 00457FF0
--------------------------------------------------------

9.到现在为止我们只要知道这个Call
:004D1E31 E89A22F3FF call 004040D0----------------------------/*这个Call一定是注册码比较处*/
如果用Trm2000跟踪的话,按F8进入

:004040D0 53 push ebx
:004040D1 56 push esi
:004040D2 57 push edi
:004040D3 89C6 mov esi, eax
:004040D5 89D7 mov edi, edx
:004040D7 39D0 cmp eax, edx----------------------------/*这是注册码的比较核心
eax是你输入的注册码
edx是真正的注册码
(下面我们可用这个地方用
CRACKCODE2000做个注册机)*/
:004040D9 0F848F000000 je 0040416E
:004040DF 85F6 test esi, esi
:004040E1 7468 je 0040414B
:004040E3 85FF test edi, edi
:004040E5 746B je 00404152
:004040E7 8B46FC mov eax, dword ptr [esi-04]
:004040EA 8B57FC mov edx, dword ptr [edi-04]
:004040ED 29D0 sub eax, edx
:004040EF 7702 ja 004040F3
:004040F1 01C2 add edx, eax

10.运行Trw2000,在运行ChinaZip.exe重复2、3步
11.按Ctrl-N呼出Trw2000
下断点bpx 4d1e31
按确定后程序立刻被Trw2000接管
下命令d edx 哈哈你看到什么?......注册码？^_^

至此我们已经知道了注册码，但是这并不是我们的最终目的。我们是想知道他是如何计算出来的？往下看吧^_^

12.重复10步.....
下断点bpx 004D1E11 我们来到这里
:004D1E09 8D4DF8 lea ecx, dword ptr [ebp-08]
:004D1E0C 8B55FC mov edx, dword ptr [ebp-04]--------------/*[ebp-04]存放是你的用户名*/
:004D1E0F 8BC3 mov eax, ebx
:004D1E11 E8D6FDFFFF call 004D1BEC----------------------------/*注册码计算部分*/
:004D1E16 8D55F4 lea edx, dword ptr [ebp-0C]
:004D1E19 A1CC6D4E00 mov eax, dword ptr [004E6DCC]
:004D1E1E 8B00 mov eax, dword ptr [eax]

按F8进入call 004D1BEC来到
* Referenced by a CALL at Address:
|:004D1E11
|
:004D1BEC 55 push ebp
:004D1BED 8BEC mov ebp, esp
:004D1BEF 6A00 push 00000000
:004D1BF1 6A00 push 00000000
:004D1BF3 6A00 push 00000000
:004D1BF5 6A00 push 00000000
:004D1BF7 6A00 push 00000000
:004D1BF9 6A00 push 00000000
:004D1BFB 6A00 push 00000000
:004D1BFD 53 push ebx
:004D1BFE 56 push esi
:004D1BFF 57 push edi
:004D1C00 894DF8 mov dword ptr [ebp-08], ecx
:004D1C03 8955FC mov dword ptr [ebp-04], edx
:004D1C06 8B45FC mov eax, dword ptr [ebp-04]
:004D1C09 E86625F3FF call 00404174
:004D1C0E 33C0 xor eax, eax
:004D1C10 55 push ebp

* Possible StringData Ref from Code Obj ->"?�鉤媇婾?
|
:004D1C11 68D41C4D00 push 004D1CD4
:004D1C16 64FF30 push dword ptr fs:[eax]
:004D1C19 648920 mov dword ptr fs:[eax], esp
:004D1C1C 33F6 xor esi, esi
:004D1C1E 8D45F4 lea eax, dword ptr [ebp-0C]
:004D1C21 8B55FC mov edx, dword ptr [ebp-04]
:004D1C24 E8AF21F3FF call 00403DD8
:004D1C29 8B45F4 mov eax, dword ptr [ebp-0C]
:004D1C2C E88F23F3FF call 00403FC0-----------------------------/*确定注册码的长度*/
:004D1C31 8BF8 mov edi, eax------------------------------/*将注册码的长度(Eax)作为循环次数
保存在Edi当中*/
:004D1C33 85FF test edi, edi
:004D1C35 7E57 jle 004D1C8E------------------------------/*检查用户名是否为空值若是则跳*/
:004D1C37 BB01000000 mov ebx, 00000001-------------------------/*将Ebx赋值1(表示弟1次循环）

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C8C(C)
|
:004D1C3C 8B45F4 mov eax, dword ptr [ebp-0C]---------------/*将用户名取出*/
:004D1C3F 8A4418FF mov al, byte ptr [eax+ebx-01]-------------/*将第1位的AscII码取出，结果保存在al中*/
:004D1C43 E858FFFFFF call 004D1BA0-----------------------------/*判断该AscII中的数是否为素数(我们将在下面详解)*/
:004D1C48 84C0 test al, al-------------------------------/*若是al=1 若不是al=0*/
:004D1C4A 7425 je 004D1C71-------------------------------/*al=0跳转*/
:004D1C4C 8D45E8 lea eax, dword ptr [ebp-18]
:004D1C4F 8B55F4 mov edx, dword ptr [ebp-0C]
:004D1C52 8A541AFF mov dl, byte ptr [edx+ebx-01]
:004D1C56 E88D22F3FF call 00403EE8-----------------------------/*
:004D1C5B 8B45E8 mov eax, dword ptr [ebp-18]
:004D1C5E 8D55EC lea edx, dword ptr [ebp-14]
:004D1C61 E8166DF3FF call 0040897C-----------------------------/*这三个Call将素数提出并且转换成大写*/
:004D1C66 8B55EC mov edx, dword ptr [ebp-14]
:004D1C69 8D45F0 lea eax, dword ptr [ebp-10]
:004D1C6C E85723F3FF call 00403FC8-----------------------------/*

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C4A(C)
|
:004D1C71 83FB01 cmp ebx, 00000001-------------------------/*比较是否为第1次循环*/
:004D1C74 740A je 004D1C80-------------------------------/*若是第1次循环则跳转*/
:004D1C76 8B45F4 mov eax, dword ptr [ebp-0C]---------------/*将用户名转移到Eax中*/
:004D1C79 0FB64418FE movzx eax, byte ptr [eax+ebx-02]----------/*取出1位AscII码*/
:004D1C7E EB06 jmp 004D1C86------------------------------/*无条件转移到004D1C86*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C74(C)
|
:004D1C80 8B45F4 mov eax, dword ptr [ebp-0C]---------------/*将用户名转移到Eax中*/
:004D1C83 0FB600 movzx eax, byte ptr [eax]-----------------/*将用户名第1位的AscII码移到Eax中*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C7E(U)
|
:004D1C86 8D748612 lea esi, dword ptr [esi+4*eax+12]---------/*[esi+4*eax+12]是注册码的计算公式
计算结果保存在Esi当中*/
:004D1C8A 43 inc ebx-----------------------------------/*当前循环次数+1*/
:004D1C8B 4F dec edi-----------------------------------/*总循环次数-1*/
:004D1C8C 75AE jne 004D1C3C------------------------------/*edi不等于0转移*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C35(C)
|
:004D1C8E 8D55E4 lea edx, dword ptr [ebp-1C]
:004D1C91 8BC6 mov eax, esi------------------------------/*将Esi中的运算结果移至Eax中*/
:004D1C93 E8A870F3FF call 00408D40
:004D1C98 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004D1C9B 8D45F4 lea eax, dword ptr [ebp-0C]
:004D1C9E 8B55F0 mov edx, dword ptr [ebp-10]
:004D1CA1 E86623F3FF call 0040400C-----------------------------/*将运算结果转换成字符串
将上面AscII码为素数的字母+字符串
这就是注册码*/----终于算完了^o^
:004D1CA6 8B45F8 mov eax, dword ptr [ebp-08]
:004D1CA9 8B55F4 mov edx, dword ptr [ebp-0C]
:004D1CAC E8E320F3FF call 00403D94
:004D1CB1 33C0 xor eax, eax
:004D1CB3 5A pop edx
:004D1CB4 59 pop ecx
:004D1CB5 59 pop ecx
:004D1CB6 648910 mov dword ptr fs:[eax], edx

* Possible StringData Ref from Code Obj ->"_[迕缷jjS乩h"
|
:004D1CB9 68DB1C4D00 push 004D1CDB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1CD9(U)
|
:004D1CBE 8D45E4 lea eax, dword ptr [ebp-1C]
:004D1CC1 BA05000000 mov edx, 00000005
:004D1CC6 E89920F3FF call 00403D64
:004D1CCB 8D45FC lea eax, dword ptr [ebp-04]
:004D1CCE E86D20F3FF call 00403D40
:004D1CD3 C3 ret---------------------------------------/*退出子程序*/

至于判断是否为素数的算法也很简单：
按F8进入 call 004D1BA0
* Referenced by a CALL at Address:
|:004D1C43
|
:004D1BA0 55 push ebp
:004D1BA1 8BEC mov ebp, esp
:004D1BA3 51 push ecx
:004D1BA4 53 push ebx
:004D1BA5 56 push esi
:004D1BA6 8845FF mov byte ptr [ebp-01], al
:004D1BA9 C645FD02 mov [ebp-03], 02
:004D1BAD C645FE01 mov [ebp-02], 01
:004D1BB1 8A4DFF mov cl, byte ptr [ebp-01]
:004D1BB4 49 dec ecx
:004D1BB5 80E902 sub cl, 02
:004D1BB8 722A jb 004D1BE4
:004D1BBA 41 inc ecx
:004D1BBB B302 mov bl, 02--------------------------------/*bl=2*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1BE2(C)
|
:004D1BBD 33C0 xor eax, eax
:004D1BBF 8A45FF mov al, byte ptr [ebp-01]-----------------/*将用户名的1位AscII码移至al*/
:004D1BC2 33D2 xor edx, edx
:004D1BC4 8AD3 mov dl, bl--------------------------------/*将Bl-->dl*/
:004D1BC6 8BF2 mov esi, edx------------------------------/*将edx-->esi*/
:004D1BC8 33D2 xor edx, edx------------------------------/*edx清零(异或）*/
:004D1BCA F7F6 div esi-----------------------------------/*eax/esi结果保存在eax余数保存在edx*/
:004D1BCC 85D2 test edx, edx-----------------------------/*检查是否有余数*/
:004D1BCE 7503 jne 004D1BD3------------------------------/*若有则跳*/
:004D1BD0 FE45FD inc [ebp-03]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1BCE(C)
|
:004D1BD3 807DFD02 cmp byte ptr [ebp-03], 02
:004D1BD7 7606 jbe 004D1BDF
:004D1BD9 C645FE00 mov [ebp-02], 00
:004D1BDD EB05 jmp 004D1BE4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1BD7(C)
|
:004D1BDF 43 inc ebx----------------------------------/*edx+1*/
:004D1BE0 FEC9 dec cl
:004D1BE2 75D9 jne 004D1BBD-----------------------------/不等于0跳*/

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004D1BB8(C), :004D1BDD(U)
|
:004D1BE4 8A45FE mov al, byte ptr [ebp-02]
:004D1BE7 5E pop esi
:004D1BE8 5B pop ebx
:004D1BE9 59 pop ecx
:004D1BEA 5D pop ebp
:004D1BEB C3 ret

大家基本上看明白了吧？
将用户名的一位AscII码提出/2 /3 /4 /5.........如果能被他本身整除即为素数....

总结一下算法：
如：用户名是adyiyd(为什么要加一个a呢？)^o^一会儿就知道了。

字符串： a d y i y d
AscII： 61 64 79 69 79 64
十进制： 97 100 121 105 121 100

注册码=SN
a为素数--->A(将他提出)---(原来a的ASCII码是个素数)^_^
SN=A+((97*4+18)*2+(100*4+18)+(121*4+18)+(105*4+18)+(121*4+18))----(为什么第一位*2最后一位没有算呢？大家看看上边就清楚了)
SN=A2672

整理一下：
用户名: adyiyd
注册码: A2672

我们一起写一个注册机....

第一种方法：
用Crackcode2000(具体用法请参考看雪主页里RuFeng教程)
CRACKCODE.INI中加入
[Options]
CommandLine=ChinaZip.exe
Mode=2
First_Break_Address=4D1E31
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=4040D7
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX

第二种方法：
因为本文针对的是初学者，所以用VB编制注册机
源代码如下....
Private Sub Command1_Click()

Dim Sum As Long '第二部分总数
Dim StrString As String '第一部分字符串
Dim Strfull As String '输入的用户名
Dim StrPassWord As String '处理后的密码
Dim StrSingle As Integer '单独处理的字符的ASC码值
Dim intLen As Integer '用户名长度
Dim I As Integer, J As Integer
Dim flgFrist As Boolean '标示是否为第一次循环
StrString = ""
Sum = 0
'初始化为第一次循环
flgFrist = True

intLen = Len(Text1(0).Text)
If intLen <= 1 Then
MsgBox "请输入英文字符", vbInformation, "提示"
With Text1(0)
.SelStart = 0
.SelLength = Len(.Text)
.SetFocus
End With
Exit Sub
End If
'处理第二部分数字累加
For I = 1 To intLen - 1
StrSingle = Asc(Mid(Text1(0).Text, I))
'输入中文提示
If StrSingle < 0 Then
MsgBox "请输入英文字符", vbInformation, "提示"

With Text1(0)
.SelStart = 0
.SelLength = Len(.Text)
.SetFocus
End With
'如果为中文,则退出循环
Exit Sub
End If
Sum = Sum + StrSingle * 4 + 18
Next I

StrSingle = Asc(Mid(Text1(0).Text, 1))
Sum = Sum + StrSingle * 4 + 18
'累加和处理结束
StrPassWord = Trim(Str(Sum))

'处理第一部分字符连接
For I = 1 To intLen
StrSingle = Asc(Mid(Text1(0).Text, I))
J = 2
Do While StrSingle Mod J <> 0
If StrSingle = CLng(J) Then
Exit Do
End If
J = J + 1
Loop

If StrSingle = CLng(J) Then
StrString = StrString & UCase(Chr(StrSingle))
End If
Next I

Text1(1).Text = Trim(StrString) & Trim(StrPassWord)
With Text1(1)
.SelStart = 0
.SelLength = Len(.Text)
.SetFocus
End With
End Sub

注：本程序没有对中文字符进行处理

这种方法虽然笨一些，但是非常清楚。还是看不懂得朋友看看我家的注视吧!
写了这么多，手已经麻了。还希望大家能够满意

希望和大家多多交流!多提宝贵意见!^_^
注册机我的网页可以下载到
http://dyiyd.yeah.net
dyiyd@yeah.net


ChinaZip V7.0

 标 题:破解：ChinaZip V7.0 (价值29元！) (2千字)
发信人:mazhenyu
时 间:2001-8-20 9:46:03
详细信息:
软件下载：http://chinazip.home.chinaren.com/

首先找到ChinaZip.exe的注册错误提示信息：“注册码不正确，无法注册”
因为真假注册码比较以后才会出现这个提示

========

W32Dasm反汇编和TRW2000一起使用

* 用language查看，程序使用ASPack加壳(与V6.02不同)
* 使用DeASPack 2.11(http://www.exetools.com下载)脱壳
* 用W32Dasm反汇编，根据“串式参考”找到注册错误提示信息“注册码不正确，无法注册”，双击

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4DEC(C) <========
|

* Possible StringData Ref from Code Obj ->"注册码不正确,无法注册!"
|
:004F4E64 B8484F4F00 mov eax, 004F4F48
:004F4E69 E81E3DF6FF call 00458B8C
:004F4E6E 33C0 xor eax, eax
:004F4E70 5A pop edx
:004F4E71 59 pop ecx
:004F4E72 59 pop ecx
:004F4E73 648910 mov dword ptr fs:[eax], edx
:004F4E76 689B4E4F00 push 004F4E9B

发现是从004F4DEC跳转过来的，鼠标右键双击004F4DEC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4D30(C)
|
:004F4DA6 8BD8 mov ebx, eax
:004F4DA8 33C0 xor eax, eax
:004F4DAA 55 push ebp
:004F4DAB 68944E4F00 push 004F4E94
:004F4DB0 64FF30 push dword ptr fs:[eax]
:004F4DB3 648920 mov dword ptr fs:[eax], esp
:004F4DB6 8D55F8 lea edx, dword ptr [ebp-08]
:004F4DB9 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:004F4DBF E860E1F3FF call 00432F24
:004F4DC4 8B45F8 mov eax, dword ptr [ebp-08]
:004F4DC7 50 push eax
:004F4DC8 8D55F0 lea edx, dword ptr [ebp-10]
:004F4DCB 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:004F4DD1 E84EE1F3FF call 00432F24
:004F4DD6 8B55F0 mov edx, dword ptr [ebp-10]
:004F4DD9 8D4DF4 lea ecx, dword ptr [ebp-0C]
:004F4DDC 8BC3 mov eax, ebx
:004F4DDE E8C9010000 call 004F4FAC
:004F4DE3 8B55F4 mov edx, dword ptr [ebp-0C]
:004F4DE6 58 pop eax
:004F4DE7 E830F3F0FF call 0040411C <========
:004F4DEC 7576 jne 004F4E64
:004F4DEE B201 mov dl, 01
:004F4DF0 A158254500 mov eax, dword ptr [00452558]

对照“风飘雪”的破解教程，发现可疑的关键Call在004F4DE7

打开TRW2000

在ChinaZip.exe的注册栏中填入注册名称“mazhenyu”和注册码“87654321”，但不点击“确定”

“Ctrl+N”激活TRW2000

在004F4DE7处下断点：bpx 004F4DE7，回车，然后按“F5”退出

点击ChinaZip.exe注册栏中的“确定”

程序被中断

结果在004F4DE7处找到真假注册码：
d eax=87654321
d edx=MAE4836

用注册码“MAE4836”进行注册，注册成功！

太棒了！

由于ChinaZip.exe脱过壳，我卸载后重装了一下。当然不重装也可以正常使用，我只是觉着不太舒服，呵呵。

马震宇
2001.8.18.


chm帮助编辑器v2.6

标 题:chm帮助编辑器v2.6 注册码破解详谈之二*解码篇* (11千字)
发信人:TAE!
时 间:2001-2-4 13:36:50
详细信息:
目标软件:chm帮助编辑器v2.6
破 解 人:TAE!
保护方式:序列号
破解方式:分析出注册码
软件介绍:此软件的作者似乎处境相当困难,此篇的目的在于学习,
请支持一下其作者,注册吧!
下载地址:http://kshii.51.net/

序言:其实这个软件的注册码计算,比较部分相当简单,关键在于破解方法!

如果用常规的方法即输入注册码,设断点,按注册,那就会什么反应都没有,
那就换个方法吧!
软件的试用次数过了以后,会跳出一个Nag,说已经过期,想想看,软件怎么知道
我们有没有注册呢?肯定是读取了某处的一个注册标志!就从这里入手,如何?
在软件弹出Nag时,到TRW下命令Pmodule,这时回到程序,按确定,又回到了TRW
(Pmodule真是个很好用的命令),然后就向上查看,发现有两个地方可以跳过Nag:

:0047A276 E8BDFDFFFF call 0047A038 //*很关键的地方*
:0047A27B A1E0B84800 mov eax, dword ptr [0048B8E0]
:0047A280 8B80CC060000 mov eax, dword ptr [eax+000006CC]
:0047A286 81780CF4010000 cmp dword ptr [eax+0C], 000001F4
:0047A28D 0F845A010000 je 0047A3ED //检查是否已经注册.(第一个)
:0047A293 6800010000 push 00000100
:0047A298 8D85F7FEFFFF lea eax, dword ptr [ebp+FFFFFEF7]
:0047A29E 50 push eax

* Possible StringData Ref from Data Obj ->""
|
:0047A29F 6828A44700 push 0047A428

* Possible StringData Ref from Data Obj ->"PWes" //win.ini中的字符
|
:0047A2A4 68F8A44700 push 0047A4F8

* Possible StringData Ref from Data Obj ->"AgeSet" //win.ini中的字符
|
:0047A2A9 6834A44700 push 0047A434
:0047A2AE E8E5C7F8FF call 00406A98
:0047A2B3 8D45FC lea eax, dword ptr [ebp-04]
:0047A2B6 8D95F7FEFFFF lea edx, dword ptr [ebp+FFFFFEF7]
:0047A2BC B901010000 mov ecx, 00000101
:0047A2C1 E85E9BF8FF call 00403E24
:0047A2C6 8D45F8 lea eax, dword ptr [ebp-08]
:0047A2C9 50 push eax
:0047A2CA B901000000 mov ecx, 00000001
:0047A2CF BA01000000 mov edx, 00000001
:0047A2D4 8B45FC mov eax, dword ptr [ebp-04]
:0047A2D7 E8A09DF8FF call 0040407C

* Possible StringData Ref from Data Obj ->"1234567890!@#$%^-*()QWERTYUIOPASDFGHJKLZXCVBNM"
->"qwertyuiopasdfghjklzxcvbnm"
|
:0047A2DC BA44A44700 mov edx, 0047A444
:0047A2E1 8B45F8 mov eax, dword ptr [ebp-08]
:0047A2E4 E8779EF8FF call 00404160
:0047A2E9 8BD8 mov ebx, eax
:0047A2EB 83FB3E cmp ebx, 0000003E
:0047A2EE 7E5D jle 0047A34D //检查使用次数(第二个)
:0047A2F0 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"软件过期"
|
:0047A2F2 6808A54700 push 0047A508

* Possible StringData Ref from Data Obj ->"您的试用期限已过,若有继续使用本软件,请您注册."
|
:0047A2F7 6814A54700 push 0047A514

进入那个call 0047A038

:0047A038 53 push ebx
:0047A039 8BD8 mov ebx, eax
:0047A03B 8B83BC060000 mov eax, dword ptr [ebx+000006BC]
:0047A041 8B4070 mov eax, dword ptr [eax+70]
:0047A044 E80BFEFFFF call 00479E54 //*计算比较注册码*
:0047A049 84C0 test al, al
:0047A04B 743A je 0047A087
:0047A04D 8B83BC060000 mov eax, dword ptr [ebx+000006BC]
:0047A053 8B4070 mov eax, dword ptr [eax+70]
:0047A056 E8DD9FF8FF call 00404038
:0047A05B 50 push eax

进入CAll 00479E54

:00479E54 55 push ebp
:00479E55 8BEC mov ebp, esp
:00479E57 33C9 xor ecx, ecx
:00479E59 51 push ecx
:00479E5A 51 push ecx
:00479E5B 51 push ecx
:00479E5C 51 push ecx
:00479E5D 51 push ecx
:00479E5E 51 push ecx
:00479E5F 51 push ecx
:00479E60 51 push ecx
:00479E61 53 push ebx
:00479E62 56 push esi
:00479E63 8945FC mov dword ptr [ebp-04], eax
:00479E66 8B45FC mov eax, dword ptr [ebp-04]
:00479E69 E8BAA1F8FF call 00404028
:00479E6E 33C0 xor eax, eax
:00479E70 55 push ebp

* Possible StringData Ref from Data Obj ->"闁�朊[迕��"
|
:00479E71 68EC9F4700 push 00479FEC
:00479E76 64FF30 push dword ptr fs:[eax]
:00479E79 648920 mov dword ptr fs:[eax], esp
:00479E7C 33DB xor ebx, ebx
:00479E7E 8B45FC mov eax, dword ptr [ebp-04]
:00479E81 E8EE9FF8FF call 00403E74 //检查Win.ini中是否有一个Pset=XXX(存放注册码的地方)
:00479E86 83F80D cmp eax, 0000000D //比较注册码的位数是否为13位,我们在这里设断点.
:00479E89 0F8542010000 jne 00479FD1 //发现EAX不是13个跳走,是13个继续检查

所以在win.ini中加入这样一句Pset=1234567890abc,在此运行程序此时被中断,继续F10
走到这里

* Possible StringData Ref from Data Obj ->"Ee"
|
:00479EA8 BA04A04700 mov edx, 0047A004
:00479EAD E8D2A0F8FF call 00403F84 //检查第一个和第二个字符是不是Ee
:00479EB2 0F8519010000 jne 00479FD1 //不是就跳
:00479EB8 8D45F0 lea eax, dword ptr [ebp-10]
:00479EBB 50 push eax
:00479EBC B901000000 mov ecx, 00000001
:00479EC1 BA03000000 mov edx, 00000003
:00479EC6 8B45FC mov eax, dword ptr [ebp-04]
:00479EC9 E8AEA1F8FF call 0040407C
:00479ECE 8B45F0 mov eax, dword ptr [ebp-10]

* Possible StringData Ref from Data Obj ->"@"
|
:00479ED1 BA10A04700 mov edx, 0047A010
:00479ED6 E8A9A0F8FF call 00403F84 //检查第三个字符是不是@
:00479EDB 0F85F0000000 jne 00479FD1 //不是就跳
:00479EE1 8D45EC lea eax, dword ptr [ebp-14]
:00479EE4 50 push eax
:00479EE5 B901000000 mov ecx, 00000001
:00479EEA BA0A000000 mov edx, 0000000A
:00479EEF 8B45FC mov eax, dword ptr [ebp-04]
:00479EF2 E885A1F8FF call 0040407C
:00479EF7 8B45EC mov eax, dword ptr [ebp-14]

* Possible StringData Ref from Data Obj ->"%"
|
:00479EFA BA1CA04700 mov edx, 0047A01C
:00479EFF E880A0F8FF call 00403F84 //检查倒数第四个字符是不是%
:00479F04 0F85C7000000 jne 00479FD1
:00479F0A 8D45E8 lea eax, dword ptr [ebp-18]
:00479F0D 50 push eax
:00479F0E B901000000 mov ecx, 00000001
:00479F13 BA0B000000 mov edx, 0000000B
:00479F18 8B45FC mov eax, dword ptr [ebp-04]
:00479F1B E85CA1F8FF call 0040407C
:00479F20 8B45E8 mov eax, dword ptr [ebp-18]

* Possible StringData Ref from Data Obj ->"("
|
:00479F23 BA28A04700 mov edx, 0047A028
:00479F28 E857A0F8FF call 00403F84 //检查倒数第三个字符是不是(
:00479F2D 0F859E000000 jne 00479FD1
:00479F33 8D45E4 lea eax, dword ptr [ebp-1C]
:00479F36 50 push eax
:00479F37 B901000000 mov ecx, 00000001
:00479F3C BA0D000000 mov edx, 0000000D
:00479F41 8B45FC mov eax, dword ptr [ebp-04]
:00479F44 E833A1F8FF call 0040407C
:00479F49 8B45E4 mov eax, dword ptr [ebp-1C]

* Possible StringData Ref from Data Obj ->")"
|
:00479F4C BA34A04700 mov edx, 0047A034
:00479F51 E82EA0F8FF call 00403F84 //检查倒数第一个字符是不是)
:00479F56 7579 jne 00479FD1
:00479F58 8D45E0 lea eax, dword ptr [ebp-20]
:00479F5B 50 push eax
:00479F5C B906000000 mov ecx, 00000006
:00479F61 BA04000000 mov edx, 00000004
:00479F66 8B45FC mov eax, dword ptr [ebp-04]
:00479F69 E80EA1F8FF call 0040407C
:00479F6E 8B45E0 mov eax, dword ptr [ebp-20]
:00479F71 E8C2A0F8FF call 00404038
:00479F76 8BF0 mov esi, eax
:00479F78 8D55F8 lea edx, dword ptr [ebp-08]
:00479F7B A1E0B84800 mov eax, dword ptr [0048B8E0]
:00479F80 8B80C0060000 mov eax, dword ptr [eax+000006C0]
:00479F86 E83567FBFF call 004306C0
:00479F8B 8B45F8 mov eax, dword ptr [ebp-08]
:00479F8E E8A5A0F8FF call 00404038
:00479F93 8BC8 mov ecx, eax
:00479F95 8A16 mov dl, byte ptr [esi]
:00479F97 8A4107 mov al, byte ptr [ecx+07]
:00479F9A 3AC2 cmp al, dl \
:00479F9C 7533 jne 00479FD1 \
:00479F9E 8A5601 mov dl, byte ptr [esi+01] \
:00479FA1 8A4104 mov al, byte ptr [ecx+04] \
:00479FA4 3AC2 cmp al, dl \
:00479FA6 7529 jne 00479FD1 \
:00479FA8 8A5602 mov dl, byte ptr [esi+02] \
:00479FAB 8A01 mov al, byte ptr [ecx] \
:00479FAD 3AC2 cmp al, dl \
:00479FAF 7520 jne 00479FD1 |检查其它六位数.经过跟踪发现
:00479FB1 8A5603 mov dl, byte ptr [esi+03] /其它这六位数,必须都在它给的
:00479FB4 8A4109 mov al, byte ptr [ecx+09] / ID中,只是排列顺序不同.
:00479FB7 3AC2 cmp al, dl / 至于是如何排列的,自己研究吧
:00479FB9 7516 jne 00479FD1 / 很简单的.
:00479FBB 8A5604 mov dl, byte ptr [esi+04] /
:00479FBE 8A4102 mov al, byte ptr [ecx+02] /
:00479FC1 3AC2 cmp al, dl /
:00479FC3 750C jne 00479FD1 /
:00479FC5 8A5605 mov dl, byte ptr [esi+05] /
:00479FC8 8A4106 mov al, byte ptr [ecx+06] /
:00479FCB 3AC2 cmp al, dl /
:00479FCD 7502 jne 00479FD1
:00479FCF B301 mov bl, 01 <------------看到希望了

我的ID:Nsd5JLy!jt
注册码:Ee@!JNtdy%(b)

自己跟一跟,很简单的,只是切入的方法不同而已.

后记:这篇好像注重了方法,若你想写出注册机,就自己分析吧!
这个软件的注册很特别,我破解的方法也很特别,
所以说解软件,一定不能轻易放弃,要从不同的地方入手,多想想办法一定会有收获的!
标 题:注册码排列算法，可以用C的字符排列功能写出注册机。 (177字)
发信人:孙锋
时 间:2001-2-4 14:49:19
详细信息:
首先是固定的前三位：Ee@
然后是固定的后四位：%(b)
中间部分这样算：
假设你的ID 是： 123456789A
那你就这样排： 8 5 1 A 3 7
应该是这样的。
可以用C写个注册机的。

标 题:chm帮助编辑器 v2.6 注册机(TC2.0) (576字)
发信人:1212
时 间:2001-2-4 11:50:53
阅读次数:76
详细信息:

main()
{ char serials[11], register_code[14];
printf("chm帮助编辑器 v2.6 注册机\n\n");
printf("软件序号：");
gets(serials);
register_code[0]='E';
register_code[1]='e';
register_code[2]='@';
register_code[3]=serials[7];
register_code[4]=serials[4];
register_code[5]=serials[0];
register_code[6]=serials[9];
register_code[7]=serials[2];
register_code[8]=serials[6];
register_code[9]='%';
register_code[10]='(';
register_code[11]='*';
register_code[12]=')';
register_code[13]='\0';
printf("注 册 码：%s",register_code);
}


chm帮助编辑器v2.61

标 题:《chm帮助编辑器V2.61》注册码破解心得： (11千字)
发信人:小　明
时 间:2001-2-17 15:50:22
详细信息:
软件名称：chm帮助编辑器V2.61
下载地址：http://kshii.51.net/
破解工具：TRW1.23注册版
破解目的：注册码及其产生机制
破解过程：在注册界面里，用bpx hmemcpy等方法都拦不住，说明作者在这方面下了很大功夫，但百密难免一疏，在使用31次后会跳出一个NAG，提示试用期已到，这是cracker最喜欢见到的：），此时按^N，并下命令PMODULE，又回到NAG画面，点确定后立刻被拦，往上找就会看到如下代码：
016F:0047A204 LEA EAX,[EBP+FFFFFEF7]
016F:0047A20A PUSH EAX
016F:0047A20B PUSH DWORD 0047A4F8　　　　　　　　|
016F:0047A210 PUSH DWORD 0047A4FC　　　　　　　　|读取win.ini的[AgeSet]中的
016F:0047A215 PUSH DWORD 0047A504　　　　　　　　|Pnum的值，即软件序号
016F:0047A21A CALL `KERNEL32!GetProfileStringA`　|
016F:0047A21F CMP BYTE [EBP+FFFFFEF7],00
016F:0047A226 JNZ NEAR 0047A2C7　　　　　　　　　如Pnum非空则跳过去
016F:0047A22C CALL 00402A4C　　　　　　　　　　　|
016F:0047A231 LEA EAX,[EBP-04]　　　　　　　　　|
016F:0047A234 CALL 00403BF4　　　　　　　　　　　|
016F:0047A239 MOV EBX,0A　　　　　　　　　　　　|
016F:0047A23E MOV EAX,49　　　　　　　　　　　　|
016F:0047A243 CALL 00402BF4　　　　　　　　　　　|
016F:0047A248 MOV ESI,EAX　　　　　　　　　　　 |
016F:0047A24A INC ESI　　　　　　　　　　　　　 |
016F:0047A24B LEA EAX,[EBP+FFFFFEF0]　　　　　　|随机产生新的软件序号
016F:0047A251 PUSH EAX　　　　　　　　　　　　　 |（10个字符）
016F:0047A252 MOV ECX,01　　　　　　　　　　　　|
016F:0047A257 MOV EDX,ESI　　　　　　　　　　　 |
016F:0047A259 MOV EAX,0047A514　　　　　　　　　|
016F:0047A25E CALL 0040407C　　　　　　　　　　　|
016F:0047A263 MOV EDX,[EBP+FFFFFEF0]　　　　　　|
016F:0047A269 LEA EAX,[EBP-04]　　　　　　　　　|
016F:0047A26C CALL 00403E7C　　　　　　　　　　　|
016F:0047A271 DEC EBX　　　　　　　　　　　　　 |
016F:0047A272 JNZ 0047A23E　　　　　　　　　　　|
016F:0047A274 MOV EAX,[0048B8E0]
016F:0047A279 MOV EAX,[EAX+06C0]
016F:0047A27F MOV EDX,[EBP-04]
016F:0047A282 CALL 004306F0
016F:0047A287 MOV EDX,0047A568
016F:0047A28C MOV EAX,[0048B8E0]
016F:0047A291 CALL 004306F0
016F:0047A296 MOV EAX,[EBP-04]
016F:0047A299 CALL 00404038
016F:0047A29E PUSH EAX
016F:0047A29F PUSH DWORD 0047A4FC
016F:0047A2A4 PUSH DWORD 0047A504
016F:0047A2A9 CALL `KERNEL32!WriteProfileStringA`　将软件序号写入win.ini
016F:0047A2AE PUSH DWORD 0047A5C0
016F:0047A2B3 PUSH DWORD 0047A5C8
016F:0047A2B8 PUSH DWORD 0047A504
016F:0047A2BD CALL `KERNEL32!WriteProfileStringA`　写入Pwes，即试用次数
016F:0047A2C2 JMP 0047A4BD
016F:0047A2C7 LEA EAX,[EBP+FFFFFEEC]
016F:0047A2CD LEA EDX,[EBP+FFFFFEF7]
016F:0047A2D3 MOV ECX,0101
016F:0047A2D8 CALL 00403E24
016F:0047A2DD MOV EDX,[EBP+FFFFFEEC]
016F:0047A2E3 MOV EAX,[0048B8E0]
016F:0047A2E8 MOV EAX,[EAX+06C0]
016F:0047A2EE CALL 004306F0
016F:0047A2F3 PUSH DWORD 0100
016F:0047A2F8 LEA EAX,[EBP+FFFFFEF7]
016F:0047A2FE PUSH EAX
016F:0047A2FF PUSH DWORD 0047A4F8
016F:0047A304 PUSH DWORD 0047A5D0
016F:0047A309 PUSH DWORD 0047A504
016F:0047A30E CALL `KERNEL32!GetProfileStringA`　读取Pset值
016F:0047A313 LEA EAX,[EBP+FFFFFEE8]
016F:0047A319 LEA EDX,[EBP+FFFFFEF7]
016F:0047A31F MOV ECX,0101
016F:0047A324 CALL 00403E24
016F:0047A329 MOV EDX,[EBP+FFFFFEE8]
016F:0047A32F MOV EAX,[0048B8E0]
016F:0047A334 MOV EAX,[EAX+06C8]
016F:0047A33A CALL 004306F0
016F:0047A33F XOR EDX,EDX
016F:0047A341 MOV EAX,[0048B8E0]
016F:0047A346 CALL 0047A108　　　　　　　　这个CALL是关键，从这里追进去
016F:0047A34B MOV EAX,[0048B8E0]
016F:0047A350 MOV EAX,[EAX+06CC]
016F:0047A356 CMP DWORD [EAX+0C],01F4
016F:0047A35D JZ NEAR 0047A4BD
  .
  .
  .
---------------------------------
016F:0047A108 PUSH EBX
016F:0047A109 MOV EBX,EAX
016F:0047A10B MOV EAX,[EBX+06BC]
016F:0047A111 MOV EAX,[EAX+70]
016F:0047A114 CALL 00479E54　　　　这个CALL是关键的关键，判断注册码的真假，再追...
016F:0047A119 TEST AL,AL
016F:0047A11B JZ 0047A157
016F:0047A11D MOV EAX,[EBX+06BC]
016F:0047A123 MOV EAX,[EAX+70]
016F:0047A126 CALL 00404038
016F:0047A12B PUSH EAX
016F:0047A12C PUSH DWORD 0047A15C
016F:0047A131 PUSH DWORD 0047A164
016F:0047A136 CALL `KERNEL32!WriteProfileStringA`
016F:0047A13B MOV EAX,[EBX+06CC]
016F:0047A141 MOV DWORD [EAX+0C],01F4
016F:0047A148 MOV EDX,0047A174
016F:0047A14D MOV EAX,[0048B8E0]
016F:0047A152 CALL 004306F0
016F:0047A157 POP EBX
016F:0047A158 RET
-----------------------------
016F:00479E54 PUSH EBP
016F:00479E55 MOV EBP,ESP
016F:00479E57 MOV ECX,07
016F:00479E5C PUSH BYTE +00
016F:00479E5E PUSH BYTE +00
016F:00479E60 DEC ECX
016F:00479E61 JNZ 00479E5C
016F:00479E63 PUSH EBX
016F:00479E64 PUSH ESI
016F:00479E65 MOV [EBP-04],EAX
016F:00479E68 MOV EAX,[EBP-04]
016F:00479E6B CALL 00404028
016F:00479E70 XOR EAX,EAX
016F:00479E72 PUSH EBP
016F:00479E73 PUSH DWORD 0047A066
016F:00479E78 PUSH DWORD [FS:EAX]
016F:00479E7B MOV [FS:EAX],ESP
016F:00479E7E MOV BYTE [EBP-05],00　将注册的标志置为假
016F:00479E82 MOV EAX,[EBP-04]
016F:00479E85 CALL 00403E74　　　　　计算注册码的长度
016F:00479E8A CMP EAX,BYTE +0D　　　等13吗？
016F:00479E8D JNZ NEAR 0047A043　　　不是，说明是假的，那就在此下中断，把win.ini
016F:00479E93 LEA EAX,[EBP-1C]　　　里的Pset值改为123456789abcd，再来吧
016F:00479E96 PUSH EAX
016F:00479E97 MOV ECX,02
016F:00479E9C MOV EDX,01
016F:00479EA1 MOV EAX,[EBP-04]
016F:00479EA4 CALL 0040407C　　　　　取注册码的前2位
016F:00479EA9 MOV EAX,[EBP-1C]
016F:00479EAC MOV EDX,0047A080
016F:00479EB1 CALL 00403F84
016F:00479EB6 JNZ NEAR 0047A043　　是“El”吗？不是则假
016F:00479EBC LEA EAX,[EBP-20]
016F:00479EBF PUSH EAX
016F:00479EC0 MOV ECX,01
016F:00479EC5 MOV EDX,03
016F:00479ECA MOV EAX,[EBP-04]
016F:00479ECD CALL 0040407C　　　　取注册码的第3位
016F:00479ED2 MOV EAX,[EBP-20]
016F:00479ED5 MOV EDX,0047A08C
016F:00479EDA CALL 00403F84
016F:00479EDF JNZ NEAR 0047A043　　是“@”吗？不是则假
016F:00479EE5 LEA EAX,[EBP-24]
016F:00479EE8 PUSH EAX
016F:00479EE9 MOV ECX,01
016F:00479EEE MOV EDX,0A
016F:00479EF3 MOV EAX,[EBP-04]
016F:00479EF6 CALL 0040407C　　　　取注册码的第10位
016F:00479EFB MOV EAX,[EBP-24]
016F:00479EFE MOV EDX,0047A098
016F:00479F03 CALL 00403F84
016F:00479F08 JNZ NEAR 0047A043　　是“%”吗？不是则假
016F:00479F0E LEA EAX,[EBP-28]
016F:00479F11 PUSH EAX
016F:00479F12 MOV ECX,01
016F:00479F17 MOV EDX,0B
016F:00479F1C MOV EAX,[EBP-04]
016F:00479F1F CALL 0040407C　　　　取注册码的第11位
016F:00479F24 MOV EAX,[EBP-28]
016F:00479F27 MOV EDX,0047A0A4
016F:00479F2C CALL 00403F84
016F:00479F31 JNZ NEAR 0047A043　　是“s”吗？不是则假
016F:00479F37 LEA EAX,[EBP-2C]
016F:00479F3A PUSH EAX
016F:00479F3B MOV ECX,01
016F:00479F40 MOV EDX,0D
016F:00479F45 MOV EAX,[EBP-04]
016F:00479F48 CALL 0040407C　　　　取注册码的第13位
016F:00479F4D MOV EAX,[EBP-2C]
016F:00479F50 MOV EDX,0047A0B0
016F:00479F55 CALL 00403F84
016F:00479F5A JNZ NEAR 0047A043　是“e”吗？不是则假
016F:00479F60 LEA EAX,[EBP-0C]
016F:00479F63 PUSH EAX
016F:00479F64 MOV ECX,06
016F:00479F69 MOV EDX,04
016F:00479F6E MOV EAX,[EBP-04]
016F:00479F71 CALL 0040407C　　　取软件序号的第4至9位
016F:00479F76 LEA EAX,[EBP-30]　以下将序号的第4至9位做简单的变换：
016F:00479F79 PUSH EAX　　　　　　如将“456789”变成“896745”
016F:00479F7A MOV ECX,02
016F:00479F7F MOV EDX,05
016F:00479F84 MOV EAX,[EBP-0C]
016F:00479F87 CALL 0040407C
016F:00479F8C PUSH DWORD [EBP-30]
016F:00479F8F LEA EAX,[EBP-34]
016F:00479F92 PUSH EAX
016F:00479F93 MOV ECX,02
016F:00479F98 MOV EDX,03
016F:00479F9D MOV EAX,[EBP-0C]
016F:00479FA0 CALL 0040407C
016F:00479FA5 PUSH DWORD [EBP-34]
016F:00479FA8 LEA EAX,[EBP-38]
016F:00479FAB PUSH EAX
016F:00479FAC MOV ECX,02
016F:00479FB1 MOV EDX,01
016F:00479FB6 MOV EAX,[EBP-0C]
016F:00479FB9 CALL 0040407C
016F:00479FBE PUSH DWORD [EBP-38]
016F:00479FC1 LEA EAX,[EBP-0C]
016F:00479FC4 MOV EDX,03
016F:00479FC9 CALL 00403F34
016F:00479FCE LEA EDX,[EBP-10]
016F:00479FD1 MOV EAX,[0048B8E0]
016F:00479FD6 MOV EAX,[EAX+06C0]
016F:00479FDC CALL 004306C0　　　　　－－变换到此结束－－
016F:00479FE1 MOV EBX,01
016F:00479FE6 LEA EAX,[EBP-14]　　从这里到016F:0047A03D是一个循环，EBX是循环变量
016F:00479FE9 PUSH EAX
016F:00479FEA MOV ECX,01
016F:00479FEF MOV EDX,EBX
016F:00479FF1 MOV EAX,[EBP-10]
016F:00479FF4 CALL 0040407C　　　　取软件序号的第EBX位
016F:00479FF9 LEA EAX,[EBP-18]
016F:00479FFC PUSH EAX
016F:00479FFD MOV EDX,07
016F:0047A002 SUB EDX,EBX
016F:0047A004 MOV ECX,01
016F:0047A009 MOV EAX,[EBP-0C]
016F:0047A00C CALL 0040407C　　　　取注册码的第7-EBX位
016F:0047A011 MOV EDX,0047A0BC　　在0047A0BC处有一张表：“123456789!@#$%^-*()PLWAQokmIJNuhbYGVtfcRDXeszESZrdxFTCygvUHBijnOKMplqwa”
016F:0047A016 MOV EAX,[EBP-14]
016F:0047A019 CALL 00404160　　　　算出注册码的第7-EBX位在上表中的位置
016F:0047A01E MOV ESI,EAX　　　　　存入ESI
016F:0047A020 MOV EDX,0047A0BC
016F:0047A025 MOV EAX,[EBP-18]
016F:0047A028 CALL 00404160　　　　算出软件序号的第EBX位在上表中的位置
016F:0047A02D MOV EDX,EAX　　　　　存入EDX及EAX
016F:0047A02F DEC EDX
016F:0047A030 CMP ESI,EDX　　　　ESI=EDX-1?
016F:0047A032 JZ 0047A039　　　是则真
016F:0047A034 INC EAX
016F:0047A035 CMP ESI,EAX　　　　ESI=EAX+1?
016F:0047A037 JNZ 0047A043　　　 不是则假
016F:0047A039 INC EBX
016F:0047A03A CMP EBX,BYTE +07　　　共循环6次
016F:0047A03D JNZ 00479FE6　　　　　－－循环结束－－
016F:0047A03F MOV BYTE [EBP-05],01　真注册码的标志
016F:0047A043 XOR EAX,EAX
016F:0047A045 POP EDX
016F:0047A046 POP ECX
016F:0047A047 POP ECX
016F:0047A048 MOV [FS:EAX],EDX
016F:0047A04B PUSH DWORD 0047A06D
016F:0047A050 LEA EAX,[EBP-38]
016F:0047A053 MOV EDX,0C
016F:0047A058 CALL 00403C18
016F:0047A05D LEA EAX,[EBP-04]
016F:0047A060 CALL 00403BF4
016F:0047A065 RET
---------------------------------
    总结一下注册码的产生机制：注册码为13位，其中第12位为任意字符，注册码的形式为：El@??????%s?e，第4－9位是根据软件序号的前6位产生的，而且不是唯一的（一个软件序号大概对应2^6=64个注册码）。分析上述算法不难做出注册机，不过作者的处境好象很困难，所以最好不要将注册机传播。
    这里给出几个成功的注册码：
    软件序号　　　注册码
  1234567890　El@325476%s?e
  61WM!dgQ^N　El@27pAx@%s?e
    另外，从2.21版的分析中发现一个数字：“740926”，估计是作者的生日，到时别忘了给他寄份贺卡喔。


chn-boy

标 题:我贴出代码段。。不再写注册机了，算法很简单，你看看应该就会了 (7千字)
发信人:chn-boy
时 间:2001-1-4 12:04:23
详细信息:
代码分析：

这是一个Fn(Name)+Fc(Company) = Fs(Code)的模式，也就是说将输入的Name、Company和Code分别进行运算，如果
Name和Company的运算后的值相加等于Code运算后的值，那么就可以了。

全文分四部分，就是讲Fn(Name)、Fc(Company)、Fs(Code)以及输入是否正确的判断地点。

第一部分：—— Fs(Code) 代码端如下：

:0040BA60 83EC08 sub esp, 00000008
:0040BA63 89542404 mov dword ptr [esp+04], edx
:0040BA67 53 push ebx
:0040BA68 C744240400000000 mov [esp+04], 00000000
:0040BA70 56 push esi
:0040BA71 57 push edi
:0040BA72 55 push ebp
:0040BA73 BE01000000 mov esi, 00000001 //将esi置1，算Fs(Code)时要用到
:0040BA78 51 push ecx
:0040BA79 8BE9 mov ebp, ecx // ebp = 输入Code的位置Offset
:0040BA7B FF15F4134100 call dword ptr [004113F4]
:0040BA81 8D78FF lea edi, dword ptr [eax-01] // edi=Code长度
:0040BA84 85FF test edi, edi
:0040BA86 7C3B jl 0040BAC3

:0040BA88 8A5C3D00 mov bl, byte ptr [ebp+edi] // 将Code中的字符赋给bl
:0040BA8C 80FB30 cmp bl, 30 |
:0040BA8F 7209 jb 0040BA9A | 判断Code是不是数字，在这里说明一下，判断Code必须全部为数字
:0040BA91 80FB39 cmp bl, 39 | 的Call在前面，在此省略
:0040BA94 7704 ja 0040BA9A |
:0040BA96 85FF test edi, edi //看字符是否运算完？是从后到前运算的
:0040BA98 7D0E jge 0040BAA8

:0040BA9A B914D44000 mov ecx, 0040D414
:0040BA9F 8B542414 mov edx, dword ptr [esp+14]
:0040BAA3 E848FBFFFF call 0040B5F0

:0040BAA8 33C0 xor eax, eax
:0040BAAA 8D0CB6 lea ecx, dword ptr [esi+4*esi] // ecx = esi * 5
:0040BAAD 8AC3 mov al, bl
:0040BAAF 83E830 sub eax, 00000030 //取十进制数字值，
:0040BAB2 0FAFC6 imul eax, esi
:0040BAB5 8D344D00000000 lea esi, dword ptr [2*ecx+00000000] // esi = ecx * 2
:0040BABC 01442410 add dword ptr [esp+10], eax // [esp+10]放累加和
:0040BAC0 4F dec edi
:0040BAC1 79C5 jns 0040BA88

:0040BAC3 8B442410 mov eax, dword ptr [esp+10] // 此Call将运算完后的值返回到 eax
:0040BAC7 5D pop ebp
:0040BAC8 5F pop edi
:0040BAC9 5E pop esi
:0040BACA 5B pop ebx
:0040BACB 83C408 add esp, 00000008
:0040BACE C3 ret

第二部分：Fn(Name) 和 Fc(Company) 的代码段：
:00406790 53 push ebx
:00406791 56 push esi
:00406792 668BD9 mov bx, cx
:00406795 57 push edi
:00406796 55 push ebp
:00406797 8BF2 mov esi, edx // esi 放 Name 或 Company 的位置偏移
:00406799 85F6 test esi, esi
:0040679B 7475 je 00406812
:0040679D 803E00 cmp byte ptr [esi], 00 // 判断是否为空？
:004067A0 7470 je 00406812
:004067A2 8BFE mov edi, esi
:004067A4 B9FFFFFFFF mov ecx, FFFFFFFF
:004067A9 2BC0 sub eax, eax
:004067AB F2 repnz
:004067AC AE scasb
:004067AD F7D1 not ecx
:004067AF 49 dec ecx // ecx放字符串长度
:004067B0 6685DB test bx, bx
:004067B3 7444 je 004067F9
:004067B5 6683FB01 cmp bx, 0001
:004067B9 743E je 004067F9
:004067BB 0FB7FB movzx edi, bx
:004067BE 8BC7 mov eax, edi
:004067C0 99 cdq
:004067C1 F7F9 idiv ecx
:004067C3 0FBE0416 movsx eax, byte ptr [esi+edx]
:004067C7 0FAFC2 imul eax, edx
:004067CA 0FAFC7 imul eax, edi
:004067CD 03C1 add eax, ecx
:004067CF 33D2 xor edx, edx // 置0，即从第一个字符开始处理
:004067D1 85C9 test ecx, ecx
:004067D3 7E19 jle 004067EE
:004067D5 8BD9 mov ebx, ecx
:004067D7 2BDF sub ebx, edi
:004067D9 0FBE3C16 movsx edi, byte ptr [esi+edx] // edi放字符串的单个字符
:004067DD 8BEB mov ebp, ebx
:004067DF 2BEA sub ebp, edx
:004067E1 42 inc edx
:004067E2 83C56F add ebp, 0000006F
:004067E5 0FAFFD imul edi, ebp
:004067E8 03C7 add eax, edi
:004067EA 3BCA cmp ecx, edx
:004067EC 7FEB jg 004067D9 // 是否全部运算完？
:004067EE 85C0 test eax, eax
:004067F0 7D25 jge 00406817
:004067F2 F7D8 neg eax // 如果为负则取补
:004067F4 5D pop ebp
:004067F5 5F pop edi
:004067F6 5E pop esi
:004067F7 5B pop ebx
:004067F8 C3 ret

:00406817 5D pop ebp |
:00406818 5F pop edi |
:00406819 5E pop esi | 此段代码我怎么也看不明白 —— 画蛇添足？ *_^
:0040681A 5B pop ebx |
:0040681B C3 ret |

第三部分：Fn(Name) + Fc(Company)的部分在：
:00406820 53 push ebx
:00406821 56 push esi
:00406822 57 push edi
:00406823 8BD9 mov ebx, ecx
:00406825 668BCA mov cx, dx
:00406828 668BFA mov di, dx
:0040682B 8B542410 mov edx, dword ptr [esp+10] // edx = Name的偏移
:0040682F 6681E1FF00 and cx, 00FF
:00406834 66C1EF08 shr di, 08
:00406838 E853FFFFFF call 00406790 // Fn()
:0040683D 668BCF mov cx, di
:00406840 8BF0 mov esi, eax // 运算和先放到 esi种暂存
:00406842 6685C9 test cx, cx
:00406845 7517 jne 0040685E
:00406847 8B542414 mov edx, dword ptr [esp+14]
:0040684B E840FFFFFF call 00406790
:00406850 8D0C33 lea ecx, dword ptr [ebx+esi]
:00406853 5F pop edi
:00406854 0FAFC8 imul ecx, eax
:00406857 8BC1 mov eax, ecx
:00406859 5E pop esi
:0040685A 5B pop ebx
:0040685B C20800 ret 0008
:0040685E 6641 inc cx
:00406860 8B542414 mov edx, dword ptr [esp+14] // edx = Company的偏移
:00406864 E827FFFFFF call 00406790
:00406869 03C6 add eax, esi // Fn(Name) + Fc(Company)
:0040686B 5F pop edi
:0040686C 03C3 add eax, ebx
:0040686E 5E pop esi
:0040686F 5B pop ebx
:00406870 C20800 ret 0008

第四部分：输入是否正确的判断地点
:00406CF8 8BE8 mov ebp, eax // ebp = Fn(Name) + Fc(Company)
:00406CFA 2BEE sub ebp, esi // esi = Fs(Code)
:00406CFC 85ED test ebp, ebp
:00406CFE 7429 je 00406D29 // 相等就行了

算法是不是很简单？看看就会了，如果还是有疑问的话，那么动态跟踪好了。。呵呵


ClassExplorer

 标 题:ClassExplorer的破解 (13千字)
发信人:henryw
时 间:2001-7-29 16:55:35
详细信息:
今天来说说ClassExplorer的破解。

这是个非常好的Delphi工具，有点类似VB中各个sub之间切换的味道，当然还有其他功能，对Delphi感兴趣的网友记得看看。

以前它是收费软件，而今它已经是free了，只是不那么彻底，下载的时候需要提供给站台自己的信息，它才会给你寄上注册码。说是一个工作日完成，结果我等了n个工作日也没有等到。

这是我为什么要破解这个free软件的其中一个原因。另外一个原因是，2年前我用过它，只是自己没有追出注册码，是在BBS上认识的一个朋友给的。而今我想看看自己到底有没有长进。

破解完这个软件，以后恐怕很难再有时间破解了。算是对自己破解的一段总结吧。

用trw2000 bpx hmemcpy断下，F12大约14次看到进入ClassExplorer领空就使用F10跟。

015F:021CE428 PUSH EBX
015F:021CE429 PUSH ESI
015F:021CE42A PUSH EDI
015F:021CE42B PUSH EBP
015F:021CE42C MOV EBP,ECX
015F:021CE42E MOV EDI,EDX
015F:021CE430 MOV EBX,EAX
015F:021CE432 MOV ESI,00C1B362
015F:021CE437 MOV EAX,EBX
015F:021CE439 CALL 021CE350
015F:021CE43E TEST AL,AL
015F:021CE440 JNZ 021CE456
015F:021CE442 MOV ECX,EBP
015F:021CE444 MOV EDX,EDI
015F:021CE446 MOV EAX,EBX
015F:021CE448 CALL 021CE1B8 《-- 这个Call需要跟进去看。
015F:021CE44D TEST AL,AL
015F:021CE44F JZ 021CE456
015F:021CE451 MOV ESI,0040D3DA
015F:021CE456 MOV EAX,ESI
015F:021CE458 POP EBP
015F:021CE459 POP EDI
015F:021CE45A POP ESI
015F:021CE45B POP EBX
015F:021CE45C RET

程序会带你到这里来，这是一张黑名单，凡是不幸榜上有名者不能注册。举个例子：Markus, NAMESergy等等。
内存21CE330处是张表，程序根据它来产生黑名单。也就是黑名单的变相加密解密。

015F:021CE372 MOV EBX,021CE330
015F:021CE377 MOV AL,[EBX]
015F:021CE379 XOR AL,35
015F:021CE37B AND EAX,FF
015F:021CE380 MOV [EBP-08],EAX
015F:021CE383 MOV DWORD [EBP-0C],01
015F:021CE38A XOR EDI,EDI
015F:021CE38C CMP EDI,[EBP-08]
015F:021CE38F JNL 021CE3E2
015F:021CE391 LEA EAX,[EBP-10]
015F:021CE394 CALL `VCL50!@System@@LStrClr$qqrr17System@AnsiString`
015F:021CE399 INC EBX
015F:021CE39A MOV AL,[EBX]
015F:021CE39C XOR AL,35
015F:021CE39E AND EAX,FF
015F:021CE3A3 LEA EDX,[EAX+01]
015F:021CE3A6 ADD [EBP-0C],EDX
015F:021CE3A9 MOV ESI,EAX
015F:021CE3AB DEC ESI
015F:021CE3AC TEST ESI,ESI
015F:021CE3AE JL 021CE3CD
015F:021CE3B0 INC ESI
015F:021CE3B1 INC EBX
015F:021CE3B2 LEA EAX,[EBP-14]
015F:021CE3B5 MOV DL,[EBX]
015F:021CE3B7 XOR DL,35
015F:021CE3BA CALL `VCL50!@System@@LStrFromChar$qqrr17System@AnsiStringc`
015F:021CE3BF MOV EDX,[EBP-14]
015F:021CE3C2 LEA EAX,[EBP-10]
015F:021CE3C5 CALL `VCL50!@System@@LStrCat$qqrv`
015F:021CE3CA DEC ESI
015F:021CE3CB JNZ 021CE3B1
015F:021CE3CD MOV EDX,[EBP-10] //程序在这里准备比对黑名单。
015F:021CE3D0 MOV EAX,[EBP-04] //
015F:021CE3D3 CALL `VCL50!@Sysutils@CompareText$qqrx17System@AnsiStringt1`
015F:021CE3D8 TEST EAX,EAX
015F:021CE3DA JZ 021CE3E2
015F:021CE3DC INC EDI
015F:021CE3DD CMP EDI,[EBP-08]
015F:021CE3E0 JL 021CE391
015F:021CE3E2 CMP EDI,[EBP-08]
015F:021CE3E5 JL 021CE3F9
015F:021CE3E7 SUB EBX,021CE330
015F:021CE3ED MOV EAX,[EBP-0C]
015F:021CE3F0 DEC EAX
015F:021CE3F1 CMP EBX,EAX
015F:021CE3F3 JNZ 021CE3F9
015F:021CE3F5 XOR EAX,EAX
015F:021CE3F7 JMP SHORT 021CE3FB
015F:021CE3F9 MOV AL,01
015F:021CE3FB MOV EBX,EAX
015F:021CE3FD XOR EAX,EAX
015F:021CE3FF POP EDX
015F:021CE400 POP ECX
015F:021CE401 POP ECX
015F:021CE402 MOV [FS:EAX],EDX
015F:021CE405 PUSH DWORD 021CE41F
015F:021CE40A LEA EAX,[EBP-14]
015F:021CE40D MOV EDX,02
015F:021CE412 CALL `VCL50!@System@@LStrArrayClr$qqrv`
015F:021CE417 RET

如此我们进入了第二段，从21CE448进去，进入21Ce115 Call 21CDFBC看看。
这里程序将对你的名字进行变形换位。
015F:021CDFD5 PUSH DWORD 021CE066
015F:021CDFDA PUSH DWORD [FS:EAX]
015F:021CDFDD MOV [FS:EAX],ESP
015F:021CDFE0 MOV EAX,EBX
015F:021CDFE2 MOV EDX,[EBP-04]
015F:021CDFE5 CALL `VCL50!@System@@LStrAsg$qqrv`
015F:021CDFEA MOV EAX,[EBX]
015F:021CDFEC CALL `VCL50!@System@@LStrLen$qqrv`
015F:021CDFF1 MOV EDI,EAX
015F:021CDFF3 SAR EDI,1
015F:021CDFF5 JNS 021CDFFA
015F:021CDFF7 ADC EDI,BYTE +00
015F:021CDFFA TEST EDI,EDI
015F:021CDFFC JNG 021CE050
015F:021CDFFE MOV ESI,01
015F:021CE003 MOV EAX,[EBX] <-- [EBX]，名字的地址。
015F:021CE005 MOV AL,[EAX+ESI-01]
015F:021CE009 XOR EDX,EDX
015F:021CE00B MOV DL,AL
015F:021CE00D AND EDX,BYTE +01
015F:021CE010 CMP EDX,BYTE +01
015F:021CE013 JNZ 021CE04C
015F:021CE015 MOV EDX,[EBX]
015F:021CE017 MOV [EBP-05],AL
015F:021CE01A MOV EAX,[EBX]
015F:021CE01C CALL `VCL50!@System@@LStrLen$qqrv`
015F:021CE021 SUB EAX,ESI
015F:021CE023 MOV EDX,[EBX]
015F:021CE025 PUSH DWORD [EDX+EAX]
015F:021CE028 MOV EAX,EBX
015F:021CE02A CALL `VCL50!@System@UniqueString$qqrr17System@AnsiString`
015F:021CE02F POP EDX
015F:021CE030 MOV [EAX+ESI-01],DL
015F:021CE034 MOV EAX,[EBX]
015F:021CE036 CALL `VCL50!@System@@LStrLen$qqrv`
015F:021CE03B SUB EAX,ESI
015F:021CE03D PUSH EAX
015F:021CE03E MOV EAX,EBX
015F:021CE040 CALL `VCL50!@System@UniqueString$qqrr17System@AnsiString`
015F:021CE045 POP EDX
015F:021CE046 MOV CL,[EBP-05]
015F:021CE049 MOV [EAX+EDX],CL
015F:021CE04C INC ESI
015F:021CE04D DEC EDI
015F:021CE04E JNZ 021CE003
015F:021CE050 XOR EAX,EAX
015F:021CE052 POP EDX
015F:021CE053 POP ECX
015F:021CE054 POP ECX
015F:021CE055 MOV [FS:EAX],EDX
015F:021CE058 PUSH DWORD 021CE06D
015F:021CE05D LEA EAX,[EBP-04]
015F:021CE060 CALL `VCL50!@System@@LStrClr$qqrr17System@AnsiString`
015F:021CE065 RET

过了这段，下一段程序将产生两个数字序列，为
一、01 02 03 04 ... 0F 10
二、01 23 45 67 89 AB CD EF FE DC ...32 10
在21CE120处的Call要进去看看，会发现生成第一个数字序列。
当运行Call 21CD4C0的时候，生成第二个序列。就像这样：
015F:021CD4D1 MOV DWORD [EBX],67452301
015F:021CD4D7 MOV DWORD [EBX+04],EFCDAB89
015F:021CD4DE MOV DWORD [EBX+08],98BADCFE
015F:021CD4E5 MOV DWORD [EBX+0C],10325476
015F:021CD4EC POP EBX
015F:021CD4ED RET

程序在这里将变形的姓名和上述的数字序列生成一个新的字串：
015F:021CDCF4 PUSH EBX
015F:021CDCF5 PUSH ESI
015F:021CDCF6 PUSH EDI
015F:021CDCF7 PUSH EBP
015F:021CDCF8 PUSH ECX
015F:021CDCF9 MOV ESI,ECX ECX= 变形姓名长度
015F:021CDCFB MOV [ESP],EDX EDX= 变形姓名地址
015F:021CDCFE MOV EBX,EAX
015F:021CDD00 MOV EBP,[EBX+10]
015F:021CDD03 MOV EAX,ESI
015F:021CDD05 SHL EAX,03
015F:021CDD08 ADD [EBX+10],EAX [EBX]=01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
015F:021CDD0B CMP EBP,[EBX+10]
015F:021CDD0E JNG 021CDD13
015F:021CDD10 INC DWORD [EBX+14]
015F:021CDD13 MOV EAX,ESI
015F:021CDD15 SHR EAX,1D
015F:021CDD18 ADD [EBX+14],EAX
015F:021CDD1B SHR EBP,03
015F:021CDD1E AND EBP,BYTE +3F
015F:021CDD21 XOR EDI,EDI
015F:021CDD23 TEST EBP,EBP
015F:021CDD25 JZ 021CDD6D
015F:021CDD27 MOV EDI,EBP
015F:021CDD29 MOV EAX,40
015F:021CDD2E SUB EAX,EBP
015F:021CDD30 MOV EBP,EAX
015F:021CDD32 CMP EBP,ESI
015F:021CDD34 JNG 021CDD49
015F:021CDD36 MOVZX EAX,DI
015F:021CDD39 LEA EDX,[EBX+EAX+18]
015F:021CDD3D MOV EAX,[ESP]
015F:021CDD40 MOV ECX,ESI
015F:021CDD42 CALL `VCL50!@System@Move$qqrpxvpvi`
015F:021CDD47 JMP SHORT 021CDDB8
015F:021CDD49 MOVZX EAX,DI
015F:021CDD4C LEA EDX,[EBX+EAX+18]
015F:021CDD50 MOV EAX,[ESP]
015F:021CDD53 MOV ECX,EBP
015F:021CDD55 CALL `VCL50!@System@Move$qqrpxvpvi`
015F:021CDD5A PUSH BYTE +0F
015F:021CDD5C LEA ECX,[EBX+18]
015F:021CDD5F MOV EAX,EBX
015F:021CDD61 MOV EDX,03
015F:021CDD66 CALL 021CD5D8
015F:021CDD6B SUB ESI,EBP
015F:021CDD6D CMP ESI,BYTE +40
015F:021CDD70 JL 021CDDA5
015F:021CDD72 MOVZX EAX,DI
015F:021CDD75 MOV EDX,[ESP]
015F:021CDD78 LEA EAX,[EDX+EAX]
015F:021CDD7B LEA EDX,[EBX+18]
015F:021CDD7E MOV ECX,40
015F:021CDD83 CALL `VCL50!@System@Move$qqrpxvpvi`
015F:021CDD88 PUSH BYTE +0F
015F:021CDD8A LEA ECX,[EBX+18]
015F:021CDD8D MOV EAX,EBX
015F:021CDD8F MOV EDX,03
015F:021CDD94 CALL 021CD5D8
015F:021CDD99 ADD DI,BYTE +40
015F:021CDD9D SUB ESI,BYTE +40
015F:021CDDA0 CMP ESI,BYTE +40
015F:021CDDA3 JNL 021CDD72
015F:021CDDA5 MOVZX EAX,DI
015F:021CDDA8 MOV EDX,[ESP]
015F:021CDDAB LEA EAX,[EDX+EAX]
015F:021CDDAE LEA EDX,[EBX+18]
015F:021CDDB1 MOV ECX,ESI
015F:021CDDB3 CALL `VCL50!@System@Move$qqrpxvpvi` 把变形名字接到后面。
015F:021CDDB8 POP EDX
015F:021CDDB9 POP EBP
015F:021CDDBA POP EDI
015F:021CDDBB POP ESI
015F:021CDDBC POP EBX
015F:021CDDBD RET

015F:021CDDC0 PUSH EBX
015F:021CDDC1 PUSH ESI
015F:021CDDC2 MOV EBX,EDX
015F:021CDDC4 MOV ESI,EAX
015F:021CDDC6 MOV EAX,[EBX+10]
015F:021CDDC9 SHR EAX,03
015F:021CDDCC AND AX,BYTE +3F
015F:021CDDD0 MOV EDX,EAX
015F:021CDDD2 XOR ECX,ECX
015F:021CDDD4 MOV CL,DL
015F:021CDDD6 MOV BYTE [EBX+ECX+18],80 <-- 变形名字所在位置后。
015F:021CDDDB INC EDX
015F:021CDDDC MOV CX,3F
015F:021CDDE0 SUB CX,AX
015F:021CDDE3 MOV EAX,ECX
015F:021CDDE5 CMP AX,BYTE +08
015F:021CDDE9 JNC 021CDE22
015F:021CDDEB AND EDX,FF
015F:021CDDF1 LEA EDX,[EBX+EDX+18]
015F:021CDDF5 MOVZX EAX,AX
015F:021CDDF8 XOR ECX,ECX
015F:021CDDFA XCHG EAX,EDX
015F:021CDDFB CALL `VCL50!@System@@FillChar$qqrv`
015F:021CDE00 PUSH BYTE +0F
015F:021CDE02 LEA ECX,[EBX+18]
015F:021CDE05 MOV EAX,EBX
015F:021CDE07 MOV EDX,03
015F:021CDE0C CALL 021CD5D8
015F:021CDE11 LEA EAX,[EBX+18]
015F:021CDE14 XOR ECX,ECX
015F:021CDE16 MOV EDX,38
015F:021CDE1B CALL `VCL50!@System@@FillChar$qqrv`
015F:021CDE20 JMP SHORT 021CDE3A
015F:021CDE22 AND EDX,FF
015F:021CDE28 LEA EDX,[EBX+EDX+18]
015F:021CDE2C MOVZX EAX,AX
015F:021CDE2F SUB EAX,BYTE +08
015F:021CDE32 XOR ECX,ECX
015F:021CDE34 XCHG EAX,EDX
015F:021CDE35 CALL `VCL50!@System@@FillChar$qqrv`
015F:021CDE3A MOV EAX,[EBX+10]
015F:021CDE3D MOV [EBX+50],EAX
015F:021CDE40 MOV EAX,[EBX+14]
015F:021CDE43 MOV [EBX+54],EAX
015F:021CDE46 PUSH BYTE +0F
015F:021CDE48 LEA ECX,[EBX+18]
015F:021CDE4B MOV EAX,EBX
015F:021CDE4D MOV EDX,03
015F:021CDE52 CALL 021CD5D8 〈-------- 关键Call进去看看。
015F:021CDE57 MOV EDX,ESI
015F:021CDE59 MOV EAX,EBX
015F:021CDE5B MOV ECX,10
015F:021CDE60 CALL `VCL50!@System@Move$qqrpxvpvi`
015F:021CDE65 MOV EAX,EBX
015F:021CDE67 XOR ECX,ECX
015F:021CDE69 MOV EDX,58
015F:021CDE6E CALL `VCL50!@System@@FillChar$qqrv`
015F:021CDE73 POP ESI
015F:021CDE74 POP EBX
015F:021CDE75 RET

程序的准备工作做完，下面开始注册第一步。21CDE52 Call 21CD5D8，这个Call有600多行。
进行一系列运算后生成一个16位的数字。然后将这个16位数字转成一个32位的字串。

最后从这个32位字串中取出8位作ID，另外24位作为注册码。
这是最后的程序：
015F:021CE125 MOV EAX,[EBP-10] <-- EAX中就是32位的字串地址。
015F:021CE128 CALL `VCL50!@System@@LStrLen$qqrv`
015F:021CE12D MOV ESI,EAX
015F:021CE12F TEST ESI,ESI
015F:021CE131 JNG 021CE186
015F:021CE133 MOV EBX,01
015F:021CE138 MOV EAX,EBX
015F:021CE13A AND EAX,80000003
015F:021CE13F JNS 021CE146
015F:021CE141 DEC EAX
015F:021CE142 OR EAX,BYTE -04
015F:021CE145 INC EAX
015F:021CE146 TEST EAX,EAX
015F:021CE148 JNZ 021CE165
015F:021CE14A LEA EAX,[EBP-14]
015F:021CE14D MOV EDX,[EBP-10]
015F:021CE150 MOV DL,[EDX+EBX-01]
015F:021CE154 CALL `VCL50!@System@@LStrFromChar$qqrr17System@AnsiStringc`
015F:021CE159 MOV EDX,[EBP-14]
015F:021CE15C MOV EAX,EDI
015F:021CE15E CALL `VCL50!@System@@LStrCat$qqrv` <--- ID连接
015F:021CE163 JMP SHORT 021CE182
015F:021CE165 LEA EAX,[EBP-18]
015F:021CE168 MOV EDX,[EBP-10]
015F:021CE16B MOV DL,[EDX+EBX-01]
015F:021CE16F CALL `VCL50!@System@@LStrFromChar$qqrr17System@AnsiStringc`
015F:021CE174 MOV EDX,[EBP-18]
015F:021CE177 MOV EAX,[EBP-08]
015F:021CE17A CALL `VCL50!@System@@LStrCat$qqrv` <--- 注册码连接
015F:021CE17F MOV EAX,[EBP-08]
015F:021CE182 INC EBX
015F:021CE183 DEC ESI
015F:021CE184 JNZ 021CE138
015F:021CE186 XOR EAX,EAX
015F:021CE188 POP EDX
015F:021CE189 POP ECX
015F:021CE18A POP ECX
015F:021CE18B MOV [FS:EAX],EDX
015F:021CE18E PUSH DWORD 021CE1B0
015F:021CE193 LEA EAX,[EBP-18]
015F:021CE196 MOV EDX,04
015F:021CE19B CALL `VCL50!@System@@LStrArrayClr$qqrv`
015F:021CE1A0 LEA EAX,[EBP-04]
015F:021CE1A3 CALL `VCL50!@System@@LStrClr$qqrr17System@AnsiString`
015F:021CE1A8 RET

以下就是比较ID和注册码了，不贴了。

对于那个600多行的Call，没看懂，只是写注册机干脆就把它贴上，注意传入的参数位置就可以了。反正传出的结果是正确的。其实我写这个注册机所学到的东西远比破解这个软件要多。

注册机代码太长，不贴了。

感谢大家看完。


ClockWise 3.03

 标 题:破解ClockWise 3.03 (7千字)
发信人:crazyedea
时 间:2001-6-6 21:38:38
详细信息:
软件名称：ClockWise 3.03
下载地址：http://software.wx88.net/down/InstallCW.exe
软件简介：一个结合了数字时钟、日历、提醒/备忘时钟、计时和程序调度的时间管理实用工具，它可以安排5个提醒和多达30个单独的程序事件，另外，它还可以通过Inter net或原子钟自动设置系统时间。你可以用它自动安排关机和重新启动的时间。
破解难度：简单
破解人:Edea (QQ:3849036)

先用Fi分析，发现没有加壳（呵呵，占便宜了）
用WDASM反汇编：随便填注册码，点Register，弹出ERROR的对话框，在WDASM中查找ERROR。找到后往上看，发现是从0041b04a跳过来的，上面的0041b043可能就是关键CALL。

0177:0041B040 PUSH ESI
0177:0041B041 MOV ESI,ECX
0177:0041B043 CALL 0041B090 ----->值得注意，跟入
0177:0041B048 TEST EAX,EAX
0177:0041B04A JZ 0041B071 ------>跳则死
0177:0041B04C MOV ECX,ESI
0177:0041B04E CALL 0041B2A0
0177:0041B053 PUSH BYTE +40
0177:0041B055 PUSH DWORD 00452920
0177:0041B05A PUSH DWORD 00452D58
0177:0041B05F MOV ECX,ESI
0177:0041B061 CALL 0043714E
0177:0041B066 PUSH BYTE +00
0177:0041B068 MOV ECX,ESI

打开注册对话框，填入：
User Name:Edea
Serial Number:300 （这个地方必须是300、1000、2000、5000等，后面再详细说明）
Registration:9876543210 （随便填一个）
打开TRW2000，下断点bpx 0041B043，点Register，被拦下。
按F8跟入
Call form 0041B043
0177:0041B090 SUB ESP,BYTE +0C
0177:0041B093 PUSH EBX
0177:0041B094 PUSH EBP
0177:0041B095 MOV EBP,ECX
0177:0041B097 PUSH ESI
0177:0041B098 XOR ECX,ECX
0177:0041B09A XOR ESI,ESI
0177:0041B09C MOV EAX,[EBP+60] ------>将User Name放入EAX
0177:0041B09F PUSH EDI
0177:0041B0A0 MOV EAX,[EAX-08]
0177:0041B0A3 TEST EAX,EAX
0177:0041B0A5 MOV [ESP+10],EAX
0177:0041B0A9 JZ NEAR 0041B28B
0177:0041B0AF MOV EAX,[EBP+68] ------->将Serial Number放入EAX
0177:0041B0B2 MOV EDX,[EAX-08]
0177:0041B0B5 TEST EDX,EDX
0177:0041B0B7 JNG NEAR 0041B28B
0177:0041B0BD MOV EDX,[EBP+64] ------>将Registration放入EDX
0177:0041B0C0 CMP DWORD [EDX-08],BYTE +05
0177:0041B0C4 JNG NEAR 0041B28B
0177:0041B0CA PUSH EAX
0177:0041B0CB CALL 004249C3
0177:0041B0D0 MOV EBX,EAX
0177:0041B0D2 ADD ESP,BYTE +04
0177:0041B0D5 CMP EBX,BYTE +01
0177:0041B0D8 JC NEAR 0041B281
0177:0041B0DE CMP EBX,012C ------>这几个地方要注意了，程序把
0177:0041B0E4 JNA 0041B0F2 Serial Number分别与300，
0177:0041B0E6 CMP EBX,03E8 1000,2000,5000等比较，如果
0177:0041B0EC JC NEAR 0041B281 不是它们中的一个，就注册失败
0177:0041B0F2 CMP EBX,07D0
0177:0041B0F8 JNA 0041B106
0177:0041B0FA CMP EBX,1388
0177:0041B100 JC NEAR 0041B281
0177:0041B106 CMP EBX,1B58
0177:0041B10C JNA 0041B11A
0177:0041B10E CMP EBX,2767
0177:0041B114 JC NEAR 0041B281
0177:0041B11A CMP EBX,2A16
0177:0041B120 JNA 0041B12E
0177:0041B122 CMP EBX,2A53
0177:0041B128 JC NEAR 0041B281
0177:0041B12E CMP EBX,2EE0
0177:0041B134 JNA 0041B142
0177:0041B136 CMP EBX,4E20
0177:0041B13C JC NEAR 0041B281
0177:0041B142 CMP EBX,5208
0177:0041B148 JA NEAR 0041B281
0177:0041B14E MOV ECX,[ESP+10]
0177:0041B152 XOR EAX,EAX
0177:0041B154 TEST ECX,ECX
0177:0041B156 JNG 0041B175
0177:0041B158 MOV EDX,[EBP+60]
0177:0041B15B LEA ECX,[EAX+01]
0177:0041B15E MOV EDI,[ESP+10]
0177:0041B162 MOVSX EAX,BYTE [EDX+EAX]
0177:0041B166 IMUL EAX,ECX
0177:0041B169 ADD EAX,EDI
0177:0041B16B ADD ESI,EAX
0177:0041B16D MOV EAX,ECX
0177:0041B16F MOV ECX,EDI
0177:0041B171 CMP EAX,ECX
0177:0041B173 JL 0041B15B
0177:0041B175 MOV EDX,[ESP+10]
0177:0041B179 LEA ECX,[ESP+14] ----->中间很多循环，如果你不想做注册机
0177:0041B17D IMUL EDX,EBX 就不用管它了
0177:0041B180 PUSH BYTE +10
0177:0041B182 ADD EDX,ESI
0177:0041B184 PUSH ECX
0177:0041B185 PUSH EDX
0177:0041B186 CALL 0042F30B
0177:0041B18B MOV DL,[ESP+20]
0177:0041B18F ADD ESP,BYTE +0C
0177:0041B192 TEST DL,DL
0177:0041B194 JZ 0041B1B4
0177:0041B196 LEA ESI,[ESP+14]
0177:0041B19A MOVSX EAX,DL
0177:0041B19D PUSH EAX
0177:0041B19E CALL 00425F90
0177:0041B1A3 ADD ESP,BYTE +04
0177:0041B1A6 MOV [ESI],AL
0177:0041B1A8 MOV DL,[ESI+01]
0177:0041B1AB INC ESI
0177:0041B1AC TEST DL,DL
0177:0041B1AE JNZ 0041B19A
0177:0041B1B0 MOV DL,[ESP+14]
0177:0041B1B4 LEA EDI,[ESP+14]
0177:0041B1B8 OR ECX,BYTE -01
0177:0041B1BB XOR EAX,EAX
0177:0041B1BD REPNE SCASB
0177:0041B1BF NOT ECX
0177:0041B1C1 DEC ECX
0177:0041B1C2 CMP ECX,BYTE +04
0177:0041B1C5 JNC 0041B20C
0177:0041B1C7 LEA EDI,[ESP+14]
0177:0041B1CB OR ECX,BYTE -01
0177:0041B1CE XOR EAX,EAX
0177:0041B1D0 REPNE SCASB
0177:0041B1D2 NOT ECX
0177:0041B1D4 DEC ECX
0177:0041B1D5 LEA EDI,[ESP+14]
0177:0041B1D9 MOV [ESP+ECX+15],AL
0177:0041B1DD OR ECX,BYTE -01
0177:0041B1E0 REPNE SCASB
0177:0041B1E2 NOT ECX
0177:0041B1E4 DEC ECX
0177:0041B1E5 INC ECX
0177:0041B1E6 JZ 0041B1F3
0177:0041B1E8 MOV DL,[ESP+ECX+13]
0177:0041B1EC MOV [ESP+ECX+14],DL
0177:0041B1F0 DEC ECX
0177:0041B1F1 JNZ 0041B1E8
0177:0041B1F3 MOV DL,30
0177:0041B1F5 LEA EDI,[ESP+14]
0177:0041B1F9 OR ECX,BYTE -01
0177:0041B1FC XOR EAX,EAX
0177:0041B1FE MOV [ESP+14],DL
0177:0041B202 REPNE SCASB
0177:0041B204 NOT ECX
0177:0041B206 DEC ECX
0177:0041B207 CMP ECX,BYTE +04
0177:0041B20A JC 0041B1C7
0177:0041B20C MOV AL,[ESP+17]
0177:0041B210 MOV CL,[ESP+16]
0177:0041B214 MOV [ESP+19],AL
0177:0041B218 MOV [ESP+18],CL
0177:0041B21C MOV CL,[ESP+15]
0177:0041B220 MOV AL,BL
0177:0041B222 MOV BYTE [ESP+1A],00
0177:0041B227 MOV [ESP+17],CL
0177:0041B22B MOV [ESP+16],DL
0177:0041B22F IMUL DL
0177:0041B231 CMP AL,41
0177:0041B233 JC 0041B239
0177:0041B235 CMP AL,5A
0177:0041B237 JNA 0041B247
0177:0041B239 ADD AL,4A
0177:0041B23B CMP AL,4F
0177:0041B23D JZ 0041B243
0177:0041B23F CMP AL,49
0177:0041B241 JNZ 0041B231
0177:0041B243 ADD AL,4A
0177:0041B245 JMP SHORT 0041B231
0177:0041B247 MOV [ESP+14],AL
0177:0041B24B MOV AL,[ESP+10]
0177:0041B24F IMUL CL
0177:0041B251 CMP AL,30
0177:0041B253 JC 0041B259
0177:0041B255 CMP AL,39
0177:0041B257 JNA 0041B25D
0177:0041B259 ADD AL,4A
0177:0041B25B JMP SHORT 0041B251
0177:0041B25D MOV [ESP+15],AL
0177:0041B261 MOV EAX,[EBP+64] ------>把假的Registration放入EAX
0177:0041B264 LEA EDX,[ESP+14] ------>把真的Registration放入EDX
0177:0041B268 PUSH EAX
0177:0041B269 PUSH EDX
0177:0041B26A CALL `KERNEL32!lstrcmpA` ------>比较
0177:0041B270 TEST EAX,EAX
0177:0041B272 JNZ 0041B281 ------>不相等吗？去死吧！
0177:0041B274 POP EDI

正确的注册码：
User Name:Edea
Serial Number:300
Registration:F00880


CMailServer 2.6+

标 题:刚刚破了CMailServer 2.6+，但得出的序列号有特殊字符（0x81)，在注册框无法输入，如何解决？ (空)
发信人:mr.wei
时 间:2001-3-22 16:42:05
详细信息:
标 题:最后找到了解决办法！ (303字)
发信人:mr.wei
时 间:2001-3-24 15:32:39
详细信息:
1、使用ALt＋小键盘是不行的，这一点我提问前就试过了。

2、blowfish 说：编程给那个窗口发消息可以把不可显示字符塞进去注册成功！
能否给出代码？你所说的我无法实现！

3、我的解决方法：
注册文件是ini文件，在DOS窗口下用EDIT的16进制编辑模式将注册码长度改为需要的长度，存盘后再用HIEW改为真正的注册码。

标 题:你说的第3种方法对于注册码存放与机器无关的软件是可以的，但Shadow Security Scanner似乎不同 (432字)
发信人:blowfish
时 间:2001-3-24 16:01:41
详细信息:

写Shadow Security Scanner的俄国佬似乎是把注册码用Windows的序列号作为密钥加密后放在注册表中的（没深究），所以在自己的机器上注册之后把存放在注册表中的注册信息拷贝到别人的机器上无法使用。

1、可以用FindWindow( )之类的先找到输入注册码的编辑框，如果是单行的编辑框直接用SetWindowText/SetDlgItemText把注册码填进去；如果是多行的编辑框，可以先用SendMessage给它发一个全部选中的消息，再发一个Replace消息，用自己的注册码来替换编辑框中的文本。


CMailServer V3.2

 标 题:CMailServer V3.2 注册码算法及CrackCode 2000 的注册机 (4千字)
发信人:paulyoung
时 间:2001-8-18 14:38:02
详细信息:
CMailServer V3.2 注册码算法及CrackCode 2000 的注册机

作　　者：PaulYoung
时　　间：2001.08.18
软件简介：1、支持通用邮件客户端软件 Outlook Express、Foxmail 等收发邮件。2、支持 Web 页面收发邮件。3、支持 Internet 收发邮件。4、支持用户通过 Web 浏览器申请邮箱、修改邮箱密码、修改用户信息等资料。5、支持管理员新建、删除、禁用用户邮箱和设置用户邮箱大小。6、支持管理员同时向多个用户发送邮件。7、支持管理员生成 HTML 和 INI 格式的用户邮箱信息报表。8、支持作为 NT 服务运行。
软件下载：http://microserver.top263.net/cmailserver/cmailserver32cr2.exe
破解工具：TRW 2000,CrackCode 2000
_________________________________________________________________________________________________

    首先感谢 TAE![CCG] 关于 CCproxy 4.11d 的破解方法给我的启示，使我了解到“遥志软件”系列软件的注册陷阱，下面，我说说另外一个“遥志软件”：CMailServer V3.2 的注册码破解，因为与 CCProxy 同属一系列，所以注册码算法方面比较相似，TAE![CCG]，借你的算法来参考一下吧。哈……
    在注册框处填写任意序列号和注册码，运行 TRW ，下 bpx hmemcpy ，F5退出，点确定，中断后下 bd *，再下 pmodule ，按1次F12（2次出错），F10单步跟踪……

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004176E5(C)
|
:0041774B 8B4C2418 mov ecx, dword ptr [esp+18]
:0041774F 8B542414 mov edx, dword ptr [esp+14]
:00417753 8D44242C lea eax, dword ptr [esp+2C]
:00417757 50 push eax
:00417758 51 push ecx //机器码
:00417759 52 push edx //假注册码
:0041775A E831FBFFFF call 00417290 //计算注册码，F8进入，F10单步跟踪

.
.
.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417353(C)
|
:0041730E 8B442434 mov eax, dword ptr [esp+34]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041730C(U)
|
:00417312 0FBE0408 movsx eax, byte ptr [eax+ecx] //将microserver1的字符依次传给eax
:00417316 0FBE140B movsx edx, byte ptr [ebx+ecx] //将cmailserver3的字符依次传给edx
:0041731A 03C2 add eax, edx //eax+edx的和放到eax
:0041731C BD3E000000 mov ebp, 0000003E //"3E"给ebp
:00417321 0FBE140F movsx edx, byte ptr [edi+ecx] //将序列号的字符依次传给edx
:00417325 03C2 add eax, edx //相加给eax
:00417327 0FBE11 movsx edx, byte ptr [ecx] //将机器码的字符依次传给edx
:0041732A 03C2 add eax, edx //再相加给eax
:0041732C 99 cdq
:0041732D F7FD idiv ebp //最后的和除以ebp,也就是"3E"余数给dl
:0041732F 83FA1A cmp edx, 0000001A //大于"1A"吗
:00417332 7D05 jge 00417339 //大于就跳
:00417334 80C261 add dl, 61 //小于就加上61
:00417337 EB0D jmp 00417346 //跳到00417346处

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417332(C)
|
:00417339 83FA34 cmp edx, 00000034 //大于"34"吗
:0041733C 7D05 jge 00417343 //大于就跳
:0041733E 80C227 add dl, 27 //小于就减去"27"
:00417341 EB03 jmp 00417346

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041733C(C)
|
:00417343 80EA04 sub dl, 04 //上面如果小于就到了这里,减去"4"

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417337(U), :00417341(U)
|
:00417346 8B442438 mov eax, dword ptr [esp+38]
:0041734A 88140E mov byte ptr [esi+ecx], dl //保存注册码
:0041734D 41 inc ecx //指向下一个机器码的字符
:0041734E 48 dec eax //计数器
:0041734F 89442438 mov dword ptr [esp+38], eax
:00417353 75B9 jne 0041730E //形成循环
:00417355 5F pop edi
:00417356 5E pop esi
:00417357 5D pop ebp
:00417358 5B pop ebx
:00417359 83C420 add esp, 00000020
:0041735C C3 ret

    一大串的算法，令我等菜鸟头痛，如何快速知道自己的注册码呢，我教你一个方法吧。在
:00417355 5F pop edi
处设断，重新运行 CMailServer ，程序会被中断，F10几次后，会来到
:00402C95 E846B20200 call 0042DEE0 //下 d eax 可以直接看到注册码。

用 CrackCode 2000 写个注册机吧：

[Options]
CommandLine=CMailServer.exe
Mode=0
First_Break_Address=402C95
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=2
Save_Code_Address=EAX

在程序一运行就会看到正确的注册码，序列号可以任意，也可以为空。你填入注册码时，会提示注册失败，不要怕，这是个陷阱，如果提示你成功你就完蛋了。重新运行吧，你会发现已经成为注册用户了。哈……
再次感谢 TAE![CCG] 师父！

THE END


color pilot

标 题:嘿嘿，凑巧激活了输入注册码的窗口，且找到注册码，但看起来象假注册码 (11千字)
发信人:1212
时 间:2000-9-30 12:46:47
详细信息:

color pilot
下载：ftp://ftp2.tiandown.com/pub/software/graphics/grp-oth/pilot.exe 1.8M color 图像处理软件

这个软件把一些字符串资源放在language目录下的INI文件中，以便支持多国语言。

把下面的[EBX+00000498]强行赋值为1就可以出现Register菜单：

001B:00487E10 CALL 00486C2C
001B:00487E15 TEST AL,AL
001B:00487E17 JZ 00487E22
001B:00487E19 MOV BYTE PTR [EBX+00000498],02
001B:00487E20 JMP 00487E29
001B:00487E22 MOV BYTE PTR [EBX+00000498],00
001B:00487E29 MOV EAX,EBX
001B:00487E2B CALL 0048B5E4
001B:00487E30 MOV AL,[EBX+00000498]
001B:00487E36 SUB AL,01
001B:00487E38 JB 00487E49
001B:00487E3A JZ 00487EA2
001B:00487E3C DEC AL
001B:00487E3E JZ 00487EDE
001B:00487E44 JMP 00487F13

判断注册码的地方如下：

001B:0047956B MOV EAX,[EBP-04]
001B:0047956E LEA ECX,[EBX+00000204]
001B:00479574 LEA EDX,[EBX+00000200]
001B:0047957A CALL 0047937C //检查注册码的格式并转换成整数
001B:0047957F TEST AL,AL
001B:00479581 JNZ 0047958C
001B:00479583 MOV EAX,EBX
001B:00479585 CALL 004792F8 //bad guy
001B:0047958A JMP 004795C1
001B:0047958C MOV ECX,[EBX+00000208]
001B:00479592 MOV EDX,[EBX+00000204]
001B:00479598 MOV EAX,[EBX+00000200]
001B:0047959E CALL 0044FA24 //判断注册码的值是否正确
001B:004795A3 TEST AL,AL
001B:004795A5 JNZ 004795B0
001B:004795A7 MOV EAX,EBX
001B:004795A9 CALL 004792F8 //bad guy
001B:004795AE JMP 004795C1
001B:004795B0 MOV EAX,EBX
001B:004795B2 CALL 004795E4
001B:004795B7 MOV DWORD PTR [EBX+00000150],00000001

先跟进上面的CALL 0047937C，看见它判断注册码的格式。其注册码格式为nnnnn-nnnnnnnnn-nnnn。

001B:004793EA MOV EDX,[EBP-04]
001B:004793ED MOV EAX,0047953C //横杠字符'-'
001B:004793F2 CALL 00403F60 //strstr( )
001B:004793F7 MOV EBX,EAX
001B:004793F9 TEST EBX,EBX
001B:004793FB JZ 004794FC //jump if bad guy
001B:00479401 LEA EAX,[EBP-0C]
001B:00479404 PUSH EAX
001B:00479405 MOV ECX,EBX
001B:00479407 DEC ECX
001B:00479408 MOV EDX,00000001
001B:0047940D MOV EAX,[EBP-04]
001B:00479410 CALL 00403ED8
001B:00479415 LEA EAX,[EBP-04]
001B:00479418 MOV ECX,EBX
001B:0047941A MOV EDX,00000001
001B:0047941F CALL 00403F18
001B:00479424 MOV EDX,[EBP-04]
001B:00479427 MOV EAX,0047953C //横杠字符
001B:0047942C CALL 00403F60 //strstr( )
001B:00479431 MOV EBX,EAX
001B:00479433 TEST EBX,EBX
001B:00479435 JZ 004794FC //jump if bad guy
001B:0047943B LEA EAX,[EBP-10]
001B:0047943E PUSH EAX
001B:0047943F MOV ECX,EBX
001B:00479441 DEC ECX
001B:00479442 MOV EDX,00000001
001B:00479447 MOV EAX,[EBP-04]
001B:0047944A CALL 00403ED8
001B:0047944F LEA EAX,[EBP-04]
001B:00479452 MOV ECX,EBX
001B:00479454 MOV EDX,00000001
001B:00479459 CALL 00403F18
001B:0047945E LEA EAX,[EBP-14]
001B:00479461 MOV EDX,[EBP-04]
001B:00479464 CALL 00403AF0
001B:00479469 XOR EAX,EAX
001B:0047946B PUSH EBP
001B:0047946C PUSH 004794E7
001B:00479471 PUSH DWORD PTR FS:[EAX]
001B:00479474 MOV FS:[EAX],ESP
001B:00479477 MOV EAX,[EBP-0C] //注册码第一部分
001B:0047947A CALL 00403CD4 //strlen( )
001B:0047947F CMP EAX,05 //长度必须为5
001B:00479482 JZ 0047948E //jump if good guy
001B:00479484 XOR EAX,EAX
001B:00479486 POP EDX
001B:00479487 POP ECX
001B:00479488 POP ECX
001B:00479489 MOV FS:[EAX],EDX
001B:0047948C JMP 004794FC
001B:0047948E MOV EAX,[EBP-0C] //注册码第一部分
001B:00479491 CALL 00407614 //atol( )
001B:00479496 MOV [ESI],EAX //保存第一部分
001B:00479498 MOV EAX,[EBP-10] //注册码第二部分
001B:0047949B CALL 00403CD4 //strlen( )
001B:004794A0 CMP EAX,09 //长度必须为9
001B:004794A3 JZ 004794AF
001B:004794A5 XOR EAX,EAX
001B:004794A7 POP EDX
001B:004794A8 POP ECX
001B:004794A9 POP ECX
001B:004794AA MOV FS:[EAX],EDX
001B:004794AD JMP 004794FC
001B:004794AF MOV EAX,[EBP-10] //注册码第二部分
001B:004794B2 CALL 00407614 //atol( )
001B:004794B7 MOV [EDI],EAX //保存第二部分
001B:004794B9 MOV EAX,[EBP-14] //注册码第三部分
001B:004794BC CALL 00403CD4 //strlen( )
001B:004794C1 CMP EAX,04 //长度必须为4
001B:004794C4 JZ 004794D0
001B:004794C6 XOR EAX,EAX
001B:004794C8 POP EDX
001B:004794C9 POP ECX
001B:004794CA POP ECX
001B:004794CB MOV FS:[EAX],EDX
001B:004794CE JMP 004794FC
001B:004794D0 MOV EAX,[EBP-14] //注册码第三部分
001B:004794D3 CALL 00407614 //atol( )
001B:004794D8 MOV EDX,[EBP+08]
001B:004794DB MOV [EDX],EAX //保存第三部分
001B:004794DD XOR EAX,EAX
001B:004794DF POP EDX
001B:004794E0 POP ECX
001B:004794E1 POP ECX
001B:004794E2 MOV FS:[EAX],EDX
001B:004794E5 JMP 004794F8
001B:004794E7 JMP 00403300
001B:004794EC CALL 004035A4
001B:004794F1 JMP 004794FC
001B:004794F3 CALL 004035A4
001B:004794F8 MOV BYTE PTR [EBP-05],01 //good guy
001B:004794FC XOR EAX,EAX
001B:004794FE POP EDX
001B:004794FF POP ECX
001B:00479500 POP ECX
001B:00479501 MOV FS:[EAX],EDX
001B:00479504 PUSH 00479526
001B:00479509 LEA EAX,[EBP-14]
001B:0047950C MOV EDX,00000003
001B:00479511 CALL 00403A7C
001B:00479516 LEA EAX,[EBP-04]
001B:00479519 CALL 00403A58
001B:0047951E RET
001B:0047951F JMP 004034FC
001B:00479524 JMP 00479509
001B:00479526 MOV AL,[EBP-05] //返回值
001B:00479529 POP EDI
001B:0047952A POP ESI
001B:0047952B POP EBX
001B:0047952C MOV ESP,EBP

判断完格式之后，就开始检查注册码的这三部分的值（下面的代码启动时也要调用的）：

001B:0044FA24 PUSH EBX
001B:0044FA25 PUSH ESI
001B:0044FA26 PUSH EDI
001B:0044FA27 PUSH EBP
001B:0044FA28 ADD ESP,-34
001B:0044FA2B MOV EBP,ECX
001B:0044FA2D MOV EDI,EDX
001B:0044FA2F MOV ESI,EAX
001B:0044FA31 MOV DWORD PTR [ESP+08],D2F1A9FC
001B:0044FA39 MOV DWORD PTR [ESP+0C],3F50624D
001B:0044FA41 FLD REAL8 PTR [ESP+08]
001B:0044FA45 FMUL REAL4 PTR [0044FBF0]
001B:0044FA4B CALL 00402A04
001B:0044FA50 FLD REAL8 PTR [ESP+08]
001B:0044FA54 FMUL REAL4 PTR [0044FBF4]
001B:0044FA5A FMUL REAL8 PTR [ESP+08]
001B:0044FA5E FMUL REAL8 PTR [ESP+08]
001B:0044FA62 FSUBRP ST(1),ST
001B:0044FA64 FSTP REAL8 PTR [ESP]
001B:0044FA67 WAIT
001B:0044FA68 FLD REAL8 PTR [ESP]
001B:0044FA6B CALL 00402A54
001B:0044FA70 FSTP REAL8 PTR [ESP]
001B:0044FA73 WAIT
001B:0044FA74 MOV EAX,00000005
001B:0044FA79 FLD REAL8 PTR [ESP]
001B:0044FA7C FMUL REAL4 PTR [0044FBF8]
001B:0044FA82 FSTP REAL8 PTR [ESP]
001B:0044FA85 WAIT
001B:0044FA86 DEC EAX
001B:0044FA87 JNZ 0044FA79
001B:0044FA89 FLD REAL8 PTR [ESP]
001B:0044FA8C CALL 00402A78
001B:0044FA91 CDQ
001B:0044FA92 XOR EAX,EDX
001B:0044FA94 SUB EAX,EDX
001B:0044FA96 CMP EAX,ESI //注册码第一部分
001B:0044FA98 SETZ BL //bl = 1 if good guy
001B:0044FA9B FLD REAL8 PTR [ESP+08]
001B:0044FA9F CALL 00402A44
001B:0044FAA4 FSTP REAL10 PTR [ESP+10]
001B:0044FAA8 WAIT
001B:0044FAA9 FLD REAL8 PTR [ESP+08]
001B:0044FAAD FMUL REAL4 PTR [0044FBF4]
001B:0044FAB3 FLDLN2
001B:0044FAB5 FXCH ST(1)
001B:0044FAB7 FYL2X
001B:0044FAB9 FLD REAL10 PTR [ESP+10]
001B:0044FABD FMULP ST(1),ST
001B:0044FABF FSTP REAL10 PTR [ESP+1C]
001B:0044FAC3 WAIT
001B:0044FAC4 FLD REAL8 PTR [ESP+08]
001B:0044FAC8 CALL 00402A14
001B:0044FACD FSTP REAL10 PTR [ESP+28]
001B:0044FAD1 WAIT
001B:0044FAD2 FLD REAL8 PTR [ESP+08]
001B:0044FAD6 FMUL REAL4 PTR [0044FBF8]
001B:0044FADC FLDLN2
001B:0044FADE FXCH ST(1)
001B:0044FAE0 FYL2X
001B:0044FAE2 FLD REAL10 PTR [ESP+28]
001B:0044FAE6 FMULP ST(1),ST
001B:0044FAE8 FLD REAL10 PTR [ESP+1C]
001B:0044FAEC FSUBRP ST(1),ST
001B:0044FAEE FSTP REAL8 PTR [ESP]
001B:0044FAF1 WAIT
001B:0044FAF2 FLD REAL8 PTR [ESP]
001B:0044FAF5 CALL 00402A54
001B:0044FAFA FSTP REAL8 PTR [ESP]
001B:0044FAFD WAIT
001B:0044FAFE MOV EAX,00000009
001B:0044FB03 FLD REAL8 PTR [ESP]
001B:0044FB06 FMUL REAL4 PTR [0044FBF8]
001B:0044FB0C FSTP REAL8 PTR [ESP]
001B:0044FB0F WAIT
001B:0044FB10 DEC EAX
001B:0044FB11 JNZ 0044FB03
001B:0044FB13 FLD REAL8 PTR [ESP]
001B:0044FB16 CALL 00402A78
001B:0044FB1B CDQ
001B:0044FB1C XOR EAX,EDX
001B:0044FB1E SUB EAX,EDX
001B:0044FB20 TEST BL,BL
001B:0044FB22 JZ 0044FB28
001B:0044FB24 CMP EAX,EDI //注册码第二部分
001B:0044FB26 JZ 0044FB2C
001B:0044FB28 XOR EAX,EAX
001B:0044FB2A JMP 0044FB2E
001B:0044FB2C MOV AL,01
001B:0044FB2E MOV EBX,EAX
001B:0044FB30 FLD REAL8 PTR [ESP+08]
001B:0044FB34 FMUL REAL4 PTR [0044FBF4]
001B:0044FB3A CALL 00402A04
001B:0044FB3F FMUL REAL8 PTR [ESP+08]
001B:0044FB43 FMUL REAL8 PTR [ESP+08]
001B:0044FB47 FSTP REAL10 PTR [ESP+10]
001B:0044FB4B WAIT
001B:0044FB4C FLD REAL8 PTR [ESP+08]
001B:0044FB50 FMUL REAL4 PTR [0044FBFC]
001B:0044FB56 CALL 00402A44
001B:0044FB5B FSTP REAL10 PTR [ESP+1C]
001B:0044FB5F WAIT
001B:0044FB60 FLD REAL8 PTR [ESP+08]
001B:0044FB64 FMUL REAL4 PTR [0044FBF8]
001B:0044FB6A FLDLN2
001B:0044FB6C FXCH ST(1)
001B:0044FB6E FYL2X
001B:0044FB70 FLD REAL10 PTR [ESP+1C]
001B:0044FB74 FMULP ST(1),ST
001B:0044FB76 FLD REAL10 PTR [ESP+10]
001B:0044FB7A FADDP ST(1),ST
001B:0044FB7C FSTP REAL8 PTR [ESP]
001B:0044FB7F WAIT
001B:0044FB80 FLD REAL8 PTR [ESP]
001B:0044FB83 CALL 00402A54
001B:0044FB88 FSTP REAL8 PTR [ESP]
001B:0044FB8B WAIT
001B:0044FB8C MOV EAX,00000004
001B:0044FB91 FLD REAL8 PTR [ESP]
001B:0044FB94 FMUL REAL4 PTR [0044FBF8]
001B:0044FB9A FSTP REAL8 PTR [ESP]
001B:0044FB9D WAIT
001B:0044FB9E DEC EAX
001B:0044FB9F JNZ 0044FB91
001B:0044FBA1 FLD REAL8 PTR [ESP]
001B:0044FBA4 CALL 00402A78
001B:0044FBA9 CDQ
001B:0044FBAA XOR EAX,EDX
001B:0044FBAC SUB EAX,EDX
001B:0044FBAE TEST BL,BL
001B:0044FBB0 JZ 0044FBB6
001B:0044FBB2 CMP EAX,EBP //注册码第三部分
001B:0044FBB4 JZ 0044FBBA
001B:0044FBB6 XOR EAX,EAX
001B:0044FBB8 JMP 0044FBBC
001B:0044FBBA MOV AL,01
001B:0044FBBC MOV EBX,EAX
001B:0044FBBE FLD REAL10 PTR [0044FC00]
001B:0044FBC4 FADD REAL8 PTR [ESP+08]
001B:0044FBC8 FSTP REAL8 PTR [ESP+08]
001B:0044FBCC WAIT
001B:0044FBCD FLD REAL10 PTR [0044FC0C]
001B:0044FBD3 FCOMP REAL8 PTR [ESP+08]
001B:0044FBD7 FSTSW AX
001B:0044FBD9 SAHF
001B:0044FBDA SETBE AL
001B:0044FBDD OR AL,BL
001B:0044FBDF JZ 0044FA41
001B:0044FBE5 MOV EAX,EBX //返回值
001B:0044FBE7 ADD ESP,34
001B:0044FBEA POP EBP
001B:0044FBEB POP EDI
001B:0044FBEC POP ESI
001B:0044FBED POP EBX
001B:0044FBEE RET

至此找到注册码，注册码有很多个。但是输入之后还是unregistered，看来还有古怪，暂时也不知道注册码存放在哪里。

标 题:如果把[EBX+00000498]的值改为2，不仅出现Register菜单，还会在About里头显示假注册码 (22字)
发信人:1212
时 间:2000-9-30 14:51:10
详细信息:

看来这个标志位有点意思

标 题:假注册码在这里：HKEY_LOCAL_MACHINE\SOFTWARE\Invention Office RG\Color Pilot 4.02\LocalSettings (34字)
发信人:1212
时 间:2000-9-30 15:20:21
详细信息:

是加密过的，只是个简单的异或加密。


Cool ASCII Art Maker V1.21

 标 题:如何破解Cool ASCII Art Maker V1.21注册码 (2千字)
发信人:paulyoung
时 间:2001-5-3 15:04:02
详细信息:
如何破解Cool ASCII Art Maker V1.21注册码

作　　者：PaulYoung
破解时间：2001.5.3
软件简介：图像转文本工具
下　　载：http://serser.top263.net/products/caa/caa.htm
破解工具：TRW 2000 V1.03
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

    该软件运行时弹出提示注册框，很不爽，破吧！
    1、填入用户名、注册码，运行TRW 2000，下 bpx hmemcpy ，F5 退出，按OK，中断于TRW 2000。
    2、BD *（中断所有断点），PMODULE （跳到程序领空），按F12，8次出错，因此BE *（重建断点），F5退出，再按OK，这次按7次。
    3、F10　单步跟踪。
.
.
.

:00404207 8D45FC lea eax, dword ptr [ebp-04]
:0040420A BA02000000 mov edx, 00000002
:0040420F E83C100900 call 00495250
:00404214 59 pop ecx
:00404215 84C9 test cl, cl
:00404217 743B je 00404254 //下 r fl z ，改变跳转方向，否则再跟几步就出错，不能跟踪到计算　　　　　　　　　　　　　　　　　　　　　　　　　注册码的CALL
:00404219 66C746101400 mov [esi+10], 0014

* Possible StringData Ref from Data Obj ->"The code is not correct!"　　　　　（出错信息）
|
:0040421F BAA4854900 mov edx, 004985A4
:00404224 8D45F0 lea eax, dword ptr [ebp-10]
:00404227 E8200F0900 call 0049514C
:0040422C FF461C inc [esi+1C]
:0040422F 8B00 mov eax, dword ptr [eax]
:00404231 E812740500 call 0045B648
:00404236 FF4E1C dec [esi+1C]
:00404239 8D45F0 lea eax, dword ptr [ebp-10]
:0040423C BA02000000 mov edx, 00000002
:00404241 E80A100900 call 00495250
:00404246 8B0E mov ecx, dword ptr [esi]
:00404248 64890D00000000 mov dword ptr fs:[00000000], ecx
:0040424F E909010000 jmp 0040435D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404217(C)
|
:00404254 33C0 xor eax, eax
:00404256 8945E8 mov dword ptr [ebp-18], eax
:00404259 8D55E8 lea edx, dword ptr [ebp-18]
:0040425C FF461C inc [esi+1C]
:0040425F 8B83C8020000 mov eax, dword ptr [ebx+000002C8]
:00404265 E8EEC10500 call 00460458 //D EDX ,ALT+↓，看到了吗，是CODE耶（全部数字）
:0040426A 8D55E8 lea edx, dword ptr [ebp-18]
:0040426D 8D45EC lea eax, dword ptr [ebp-14]
:00404270 8B0A mov ecx, dword ptr [edx]
.
.
.

    注：用户名不支持中文，为什么？因为我试过呀！！！！:)

**************************************************************************************************************

    小弟为庆祝“五一”国际劳动节，特制了一个网页，主要是面向初学破解者，本站坚持原创精神，软件均为本人原创作品，当然也放了不少大师级人马的经典破解教程，非常适合初学者学习。

欢迎光临！！！！

* Cracker 初体验 *

http://paulyoung.yeah.net


CopyFaster 1.0

 标 题:在win2000下破解CopyFaster (7千字)
发信人:moonlite
时 间:2001-7-14 12:25:36
详细信息:
在win2000下破解CopyFaster
---庆祝 Beijing 2008 奥运申办成功！

破解者：moonlite
目标： CopyFaster 1.0 Final Release
应用平台：Windows 2000 only
下载：http://www.lowtek.com/copyfaster/download/
大小：101k
软件用途： CopyFaster is a software utility that enables Windows 2000 Explorer
to copy big files faster when copying to and from the same hard drive.
工具：SoftIce For NT
保护： 每次启动都弹出注册窗，提示注册; CRC校验。

破解过程：
[1] 启动 Symbol Loader,并加载执行copyfast.exe。SoftIce 被激活， F5一次，copyfaster注册窗弹出。
[2] 输入姓名“moonlite” 和注册码“1818518”。CTL+D 来到ICE的领空。键入：
S 10:0 L FFFFFFFF "1818518"， 找到一处地址并BPM下断点，F5回到注册窗，点击 OK，没拦到，奇怪？
试着该为S 10:0 L FFFFFFFF 31,00,38,00,31,00,38,00,35,00,31,00,18 (注：seach注册码的WideChar
形式，即：“1 8 1 8 5 1 8”）。找到一处地址，但BPM下断点后，仍然没拦到。

改方法：BPM GETWINDOWTEXTW，返回主程点击OK，被ICE拦住去路。如下：

-------------------
:0040373C FF75E0 push [ebp-20]
:0040373F 895DFC mov dword ptr [ebp-04], ebx
:00403742 FF75DC push [ebp-24]
:00403745 FF75EC push [ebp-14]

* Reference To: USER32.GetWindowTextW, Ord:0165h
|
:00403748 FF1568B24000 Call dword ptr [0040B268]//读取姓名；
:0040374E 85C0 test eax, eax // eax=姓名字符串的长度；<===光标在这！
:00403750 7506 jne 00403758//不为空则跳；
:00403752 8B45DC mov eax, dword ptr [ebp-24]
:00403755 668918 mov word ptr [eax], bx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403750(C)
|
:00403758 8B4610 mov eax, dword ptr [esi+10]
--------------

再按F5，又被ICE拦住：

--------------
:00403783 FF75E4 push [ebp-1C]
:00403786 FF75EC push [ebp-14]

* Reference To: USER32.GetWindowTextW, Ord:0165h
|
:00403789 FF1568B24000 Call dword ptr [0040B268]
:0040378F 85C0 test eax, eax//eax=密码字符串的长度；<===光标在这！
:00403791 7506 jne 00403799//不为空则跳；
:00403793 8B45E4 mov eax, dword ptr [ebp-1C]
:00403796 668918 mov word ptr [eax], bx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403791(C)
|
:00403799 FF75E4 push [ebp-1C]
---------------

[3]好看的部分：

-->在00403791处跳到了这里：
:00403799 FF75E4 push [ebp-1C]
:0040379C FF75DC push [ebp-24]
:0040379F E853FDFFFF call 004034F7//进去瞧瞧 ******┐
:004037A4 FF75E4 push [ebp-1C]
:004037A7 FF75DC push [ebp-24]
:004037AA E8C2E4FFFF call 00401C71
:004037AF 8D4DC8 lea ecx, dword ptr [ebp-38]
:004037B2 E8F7FBFFFF call 004033AE
:004037B7 8D45C8 lea eax, dword ptr [ebp-38]
:004037BA 8BCE mov ecx, esi
:004037BC 50 push eax
:004037BD C645FC02 mov [ebp-04], 02
:004037C1 E86FFDFFFF call 00403535
----------

call 到了这里：
* Referenced by a CALL at Addresses:
|:004034BF , :0040379F
|
:004034F7 FF742404 push [esp+04]
:004034FB E867E3FFFF call 00401867
:00403500 85C0 test eax, eax
:00403502 750A jne 0040350E
:00403504 68040000E2 push E2000004
:00403509 E8F4030000 call 00403902

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403502(C)
|
:0040350E 56 push esi
:0040350F FF742408 push [esp+08]
:00403513 E866E2FFFF call 0040177E//注意：这个call不远就有个JE跳转，
机不可失，得进去看看……》
:00403518 8BF0 mov esi, eax
:0040351A FF74240C push [esp+0C]
:0040351E E885E3FFFF call 004018A8
:00403523 3BF0 cmp esi, eax
:00403525 5E pop esi
:00403526 740A je 00403532
:00403528 68050000E2 push E2000005
:0040352D E8D0030000 call 00403902
----------

* Referenced by a CALL at Address:
|:00403513
|
:0040177E 55 push ebp
:0040177F 8BEC mov ebp, esp
:00401781 83EC0C sub esp, 0000000C
:00401784 56 push esi
:00401785 8B7508 mov esi, dword ptr [ebp+08]
:00401788 8D45F4 lea eax, dword ptr [ebp-0C]//eax指向输入的姓名：
为WideChar形式：
“m.o.o.n.l.i.t.e.”

:0040178B 6A00 push 00000000
:0040178D 50 push eax
:0040178E E8D6FEFFFF call 00401669
:00401793 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Data Obj ->"CopyFaster is Copyright (c) 2000 "
->"Spencer Low. All rights reserved. "
->"If you use CopyFaster, pay $9.99 "
->"to register it by going to: http://www.lowtek."
->"com/copyfaster/"
|
:00401796 6868E14000 push 0040E168
:0040179B 50 push eax
:0040179C E806FFFFFF call 004016A7
-------------

接下来，从 004017A1 到 004017D4便是对姓名字符串变换。

-----------
:00403513 E866E2FFFF call 0040177E//算注册码；
:00403518 8BF0 mov esi, eax//返回的eax=通过姓名算出的真正的注册码送给esi：
我的是：“1756057853”，用钢笔记下来，
以防丢失；
:0040351A FF74240C push [esp+0C]//将输入的伪注册码地址入栈；
:0040351E E885E3FFFF call 004018A8//将输入的伪注册码经转换后变为十进制形式：
返回的eax为“0001818518”；

:00403523 3BF0 cmp esi, eax//真假注册码相比较；
:00403525 5E pop esi
:00403526 740A je 00403532//相等，则是good boy;
:00403528 68050000E2 push E2000005
:0040352D E8D0030000 call 00403902

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403526(C)
|
:00403532 C20800 ret 0008
-------------
F5，返回主程。

[4] 尾声：
将注册码该为 “1756057853”，输入。按OK，成功！
注册成功后，在注册表中生成两个键值：

[ H K E Y _ U S E R S \ S - 1 - 5 - 2 1 - 1 8 4 4 2 3 7 6 1 5 - 1 6 8 2 5 2 6 4 8 8 - 1 9 5 7 9 9 4 4 8 8 - 5 0 0 \ S o f t w a r e \ L o w T e k \ C o p y F a s t e r \ R e g i s t r a t i o n ]
" N a m e " = " m o o n l i t e "
" N u m b e r " = " 1 7 5 6 0 5 7 8 5 3 "

[5]后语：已经有半年多没用SICE啦，可是在WIN2K下还没有别的选择。这是本人第一次在WIN2000下破解。望各位高手多多指教！

★☆ moonlite 于2001-7-13☆★


CPUCOOL 5.1000

标 题:CPUCOOL 5.1000注册码分析 (6千字)
发信人:夜月
时 间:2001-1-19 10:50:42
详细信息:
文章名称：CPUCOOL 5.1000注册码分析
作者：夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的：帮助和我一样的初学者们。
软件名称：CPUCOOL
软件简介：一个CPU降温软件，也可以定时优化内存。具体的效果怎么样，我也不太清楚。（呵呵...没用温度计
量过...)。
保护分析：这个软件在你输入注册码的时候会进行一次判断。如果你就只找到这一处判断的话，还不能注册成功。
另一个检测点说实在的，我也找了好久，主要原因有兴趣的朋友用W32dasm分析一下就知道了----
虽然所有的对话框中的字符串，都能够在反汇编后找到，可是，它们的附近一个有用的跳转都没有，
后来，找了好久用了bpm，全局flag,注册表监视，反正能想的招我都想了，才找到了第二个检测点。
还是有点运气的成分在里面的。它判断注册码的算法在反汇编后唯一的特点就是一个“%d”，两处检测
点的字符串参考（w32dasm内）都有这个“%d”。两个检测点找到了以后分析就是很简单的事了，不过
这个软件的算法，需要一点浮点指令的知识。我以前没看过浮点指令的介绍，哪位大虾能e_mail给小弟
一份的话，小弟感激不尽！不过，这里的两个浮点指令都比较简单，我看着它们的形式也就猜出意思了
所以，如果你现在也不懂浮点指令的话，没关系的，猜吧！好了，废话少说，下面我们切入正题：
教程正文
输入注册码，用trw2000的万能中断hmemcpy+pmodule一会儿还找不出关键的跳转，我是用bpm的方法找
到了下面的这一处：
* Possible StringData Ref from Data Obj ->"%d"
|
:00414039 687C854600 push 0046857C
:0041403E 50 push eax
:0041403F E80C2C0200 call 00436C50
:00414044 8B4C2414 mov ecx, dword ptr [esp+14]
:00414048 BF83000000 mov edi, 00000083
:0041404D 8BC1 mov eax, ecx <------eax中保存了你输入的注册码（16进制）
:0041404F 83C40C add esp, 0000000C
:00414052 99 cdq
:00414053 F7FF idiv edi
:00414055 85D2 test edx, edx
:00414057 0F85C2000000 jne 0041411F <-----注册码要是83H的整数倍

:0041405D B83DCB883E mov eax, 3E88CB3D
:00414062 F7E9 imul ecx
:00414064 C1FA05 sar edx, 05
:00414067 8BC2 mov eax, edx
:00414069 C1E81F shr eax, 1F
:0041406C 03D0 add edx, eax
:0041406E 3BD7 cmp edx, edi
:00414070 0F8EA9000000 jle 0041411F <-----这一段是变相对注册码的大小进行判断

:00414076 81F980470100 cmp ecx, 00014780 <------14780H是一个不能使用的号码！
:0041407C 7467 je 004140E5

:0041407E 8BC1 mov eax, ecx
:00414080 B97F000000 mov ecx, 0000007F
:00414085 99 cdq
:00414086 F7F9 idiv ecx <------注册码不能是7FH的整数倍
:00414088 85D2 test edx, edx
:0041408A 7459 je 004140E5
:0041408C 8D542468 lea edx, dword ptr [esp+68]
:00414090 B9DC8D4700 mov ecx, 00478DDC
:00414095 52 push edx
这里就是我说的第一处判断了。详细的分析，我已经写在旁边，相信有一点汇编基础的朋友就能够很轻
松的看懂了。不过在那个变相判断注册码大小的地方，我还编了一个小程序算出来注册码必须大于
252*131=33012。有兴趣的朋友可以验证一下。
经过了这个“卡子”我们可以得出注册码必须要是131大于251的整数倍，而且，还不能被7FH整除，当
然，还得排除一个作者已知的CRACK号码。下面，我们来到第二个检测点：
* Possible StringData Ref from Data Obj ->" %d"
|
:00421FA0 6864974600 push 00469764
:00421FA5 50 push eax
:00421FA6 E8A54C0100 call 00436C50
:00421FAB 8B442424 mov eax, dword ptr [esp+24]
:00421FAF 83C40C add esp, 0000000C
:00421FB2 99 cdq
:00421FB3 F73DA88D4700 idiv dword ptr [00478DA8] [478DA8]=1A19H=6681
:00421FB9 8BE8 mov ebp, eax
:00421FBB 99 cdq
:00421FBC 33C2 xor eax, edx
:00421FBE 896C2418 mov dword ptr [esp+18], ebp
:00421FC2 2BC2 sub eax, edx
:00421FC4 83E001 and eax, 00000001
:00421FC7 33C2 xor eax, edx
:00421FC9 2BC2 sub eax, edx
:00421FCB 742D je 00421FFA 上面一连串的位运算就是看是否是6681的奇数倍
:00421FCD DB442418 fild dword ptr [esp+18] <----我猜应该是操作数被LOAD
:00421FD1 32DB xor bl, bl
:00421FD3 D9FA fsqrt <----我猜应该是开方的意思
:00421FD5 E8464B0100 call 00436B20
:00421FDA 8BF0 mov esi, eax
:00421FDC B903000000 mov ecx, 00000003
:00421FE1 46 inc esi
:00421FE2 3BF1 cmp esi, ecx
:00421FE4 7E14 jle 00421FFA
:00421FE6 8BC5 mov eax, ebp
:00421FE8 99 cdq
:00421FE9 F7F9 idiv ecx
:00421FEB 85D2 test edx, edx
:00421FED 7409 je 00421FF8
:00421FEF 83C102 add ecx, 00000002
:00421FF2 3BCE cmp ecx, esi
:00421FF4 7CF0 jl 00421FE6
:00421FF6 EB02 jmp 00421FFA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00421FED(C)
|
:00421FF8 B301 mov bl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00421FCB(C), :00421FE4(C), :00421FF6(U)
|
:00421FFA 84DB test bl, bl
:00421FFC 7512 jne 00422010
:00421FFE 6A20 push 00000020
:00422000 8D4C2418 lea ecx, dword ptr [esp+18]
:00422004 E8B0D80200 call 0044F8B9
:00422009 68DC8D4700 push 00478DDC
:0042200E EB1E jmp 0042202E
上面这段代码很简单吧？呵呵...我的注释也就加的不多了。下面我就把注册码应该满足的条件列出来：
假设输入的数字为N。则其必须满足：(用C语言的运算符表示）
1.（N%131)=0，(N/131)>251;
2. (N%6681)=0.
3. 设N/6681=M.则M必须为奇数。
4. 设INT(SQRT(M))=K,则：K>2且从3到K+1所有的奇数都不能被M整除。
这就是我总结出来的CPUCOOL的注册码应该满足的规律，如有疏漏，尽请执教！


cpucool 6.1x

标 题:关于cpucool 6.1x的探讨！ (2千字)
发信人:小球[CCG]
时 间:2001-4-4 22:23:52
详细信息:
很早以前就想拿cupcool练练，今天在来试试，果然有点眉目了！可是还是不理想。请高手们赐教哦！

填好注册码123456789
下断：
bpm 016f：006eecb8
按几下f10来到这：
:0041CE07 8B4C241C mov ecx, dword ptr [esp+1C] *你输入的注册码，ecx＝075bcd15(十六进制的)
:0041CE0B BF83000000 mov edi, 00000083
:0041CE10 8BC1 mov eax, ecx
:0041CE12 83C40C add esp, 0000000C
:0041CE15 99 cdq
:0041CE16 F7FF idiv edi *做除法，余数在edx中。
:0041CE18 5F pop edi
:0041CE19 85D2 test edx, edx *余数为零？那你就成功了！
:0041CE1B 0F85EF000000 jne 0041CF10
:0041CE21 B83DCB883E mov eax, 3E88CB3D
:0041CE26 F7E9 imul ecx
:0041CE28 C1FA05 sar edx, 05 *edx＝商
:0041CE2B 8BC2 mov eax, edx
:0041CE2D C1E81F shr eax, 1F
:0041CE30 03D0 add edx, eax
:0041CE32 81FA83000000 cmp edx, 00000083 *是不是83的倍数呢？想蒙混过关？没门！呵呵...
:0041CE38 0F8ED2000000 jle 0041CF10
:0041CE3E 81F980470100 cmp ecx, 00014780 *这不是黑名单吗？14780＝83840十进制的
:0041CE44 0F8489000000 je 0041CED3 *这里跳到警告框了，挺吓人的。
:0041CE4A 8BC1 mov eax, ecx
:0041CE4C B97F000000 mov ecx, 0000007F
:0041CE51 99 cdq
:0041CE52 F7F9 idiv ecx *再被7f除
:0041CE54 85D2 test edx, edx *余数是零吗？
:0041CE56 747B je 0041CED3 *跳到警告框了！
:0041CE58 8D542474 lea edx, dword ptr [esp+74]
:0041CE5C B9A4064A00 mov ecx, 004A06A4
:0041CE61 52 push edx
:0041CE62 881DF3074A00 mov byte ptr [004A07F3], bl
:0041CE68 E867C10400 call 00468FD4

下面我们来自己做个注册码吧！找几个数乘以131吧。比如641*131＝83971，填入试试吧！别用640*131啊！为什么？你试试便知！呵呵！可是有个问题。下次运行时还是提示未注册！百思不得其解！请高手指点一二。小弟在此先谢过了！！！

小球[CCG]

序 号:12914
标 题:是这样的 (368字)
发信人:zombieys
时 间:2001-4-5 16:48:08
详细信息:

程序启动时有另一套判断程序，我做的是cpucool6.0.9，在注册后，它在4a1fbb置1，表示已注册，下bpm 4a1fbb，重新启动cpucool，然后很快就能找到它的判断点，是这里
440305 jz 440403 ->nop //跳过去的话就die了，所以nop掉它，没空细分析，好忙:(
44030b mov byte ptr [4a1fbb],01

ok了

cracked by zombieys
my oicq is 1789655
my hp is zombieys.126.com
thanks for your supports

标 题:cupcool补充！！！！ (7千字)
发信人:小球[CCG]
时 间:2001-4-7 11:37:18
详细信息:

经过反复的试验，发现程序在开始的时候，也要检验我输的注册码。只不过是又经过烦琐的计算，我很难算出来！（我是不行了）不过我发现了一点算码的踪迹！希望有高人写写注册机！
为大众造福哦！
运行程序，输入注册码！随便吧，比如：83971，85150，85281。这里我输入85281。
注册成功！退出程序。用ice或trw把它载入！load它！
按F10来到这里：
:0045427A FF15A8424700 Call dword ptr [004742A8]
:00454280 50 push eax
:00454281 E8F1F90000 call 00463C77 *这里进入，不然会出错的！
:00454286 8945A0 mov dword ptr [ebp-60], eax
:00454289 50 push eax
:0045428A E829F1FFFF call 004533B8
:0045428F 8B45EC mov eax, dword ptr [ebp-14]
:00454292 8B08 mov ecx, dword ptr [eax]
由上面call到此：
:00463C77 FF742410 push [esp+10]
:00463C7B FF742410 push [esp+10]
:00463C7F FF742410 push [esp+10]
:00463C83 FF742410 push [esp+10]
:00463C87 E8516A0000 call 0046A6DD *这里进入
:00463C8C C21000 ret 0010
到这儿：
:0046A6DD 53 push ebx
:0046A6DE 56 push esi
:0046A6DF 57 push edi
:0046A6E0 83CBFF or ebx, FFFFFFFF
:0046A6E3 E89FEDFFFF call 00469487
:0046A6E8 8BF0 mov esi, eax
:0046A6EA E867310000 call 0046D856
:0046A6EF FF74241C push [esp+1C]
:0046A6F3 8B7804 mov edi, dword ptr [eax+04]
:0046A6F6 FF74241C push [esp+1C]
:0046A6FA FF74241C push [esp+1C]
:0046A6FE FF74241C push [esp+1C]
:0046A702 E8C8470000 call 0046EECF
:0046A707 85C0 test eax, eax
:0046A709 743B je 0046A746
:0046A70B 85FF test edi, edi
:0046A70D 740E je 0046A71D
:0046A70F 8B07 mov eax, dword ptr [edi]
:0046A711 8BCF mov ecx, edi
:0046A713 FF9084000000 call dword ptr [eax+00000084]
:0046A719 85C0 test eax, eax
:0046A71B 7429 je 0046A746

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A70D(C)
|
:0046A71D 8B06 mov eax, dword ptr [esi]
:0046A71F 8BCE mov ecx, esi
:0046A721 FF5050 call [eax+50] *这里进入，不然会出错的！
:0046A724 85C0 test eax, eax
:0046A726 7515 jne 0046A73D
:0046A728 8B4E1C mov ecx, dword ptr [esi+1C]
按F10到这儿：
:0044A915 C7457840624800 mov [ebp+78], 00486240
:0044A91C E8BF3DFFFF call 0043E6E0 *在由这里进入！
:0044A921 3BF7 cmp esi, edi
:0044A923 7410 je 0044A935
:0044A925 8BCE mov ecx, esi
:0044A927 E8447DFEFF call 00432670
:0044A92C 56 push esi
:0044A92D E863E30100 call 00468C95
:0044A932 83C404 add esp, 00000004
为什么要在0044a91c进入呢？如果是高手就会说：“凭感觉了！”其实不然。哪一个call要进，哪个不要进，是有一定的规律的。
就那本程序来说，有出错框的地方一定要进（废话）。出错的call上面的call你也要进！还有象0044a921处的call，如果你按F10代过的话，程序将运行一段。你会怎么想？对，这里有可能是算码的call！根据上面种种迹象表明你的猜想是80%正确的，（感觉？）那还犹豫什么？按F8进入吧！
总之了，关于该进入哪个call的问题，确实让人头疼。你只有不断的、反复的调用调试，才能摸透这个程序！嗨！说了半天，告诉你一个秘诀：一个字------------试！
呵呵！！！！！言归正传
由上面进入的庞大的算码过程！我倒.......
:0043E6E0 6AFF push FFFFFFFF
:0043E6E2 68D8284700 push 004728D8
:0043E6E7 64A100000000 mov eax, dword ptr fs:[00000000]
:0043E6ED 50 push eax
:0043E6EE 64892500000000 mov dword ptr fs:[00000000], esp
:0043E6F5 81EC9C050000 sub esp, 0000059C
:0043E6FB A1B0D44900 mov eax, dword ptr [0049D4B0]
:0043E700 53 push ebx
:0043E701 55 push ebp
:0043E702 8BE9 mov ebp, ecx
:0043E704 56 push esi
:0043E705 57 push edi
:0043E706 896C2424 mov dword ptr [esp+24], ebp
:0043E70A 89442418 mov dword ptr [esp+18], eax
:0043E70E 33DB xor ebx, ebx
:0043E710 8D8C2464010000 lea ecx, dword ptr [esp+00000164]
:0043E717 53 push ebx
:0043E718 899C24B8050000 mov dword ptr [esp+000005B8], ebx
:0043E71F E82CF50000 call 0044DC50
:0043E724 53 push ebx
:0043E725 8D8C24FC000000 lea ecx, dword ptr [esp+000000FC]
:0043E72C C68424B805000001 mov byte ptr [esp+000005B8], 01
:0043E734 E8A7E20000 call 0044C9E0
:0043E739 53 push ebx
:0043E73A 8D4C2474 lea ecx, dword ptr [esp+74]
:0043E73E C68424B805000002 mov byte ptr [esp+000005B8], 02
:0043E746 E865AD0000 call 004494B0
:0043E74B 6A01 push 00000001
:0043E74D C68424B805000003 mov byte ptr [esp+000005B8], 03
:0043E755 881DEA054A00 mov byte ptr [004A05EA], bl
:0043E75B 891DB4054A00 mov dword ptr [004A05B4], ebx
:0043E761 E806A50200 call 00468C6C
:0043E766 83C404 add esp, 00000004
:0043E769 8944241C mov dword ptr [esp+1C], eax
:0043E76D 3BC3 cmp eax, ebx
:0043E76F C68424B405000004 mov byte ptr [esp+000005B4], 04
:0043E777 740B je 0043E784
:0043E779 8BC8 mov ecx, eax
:0043E77B E8D07B0000 call 00446350
:0043E780 8BF0 mov esi, eax
:0043E782 EB02 jmp 0043E786
.
.
.
.
这里没有稿费，所以略去中间无数过程。为节省大家时间，一直按F10代过吧，到了这里：
:0043ED89 68E8654800 push 004865E8
:0043ED8E 56 push esi
:0043ED8F E869390100 call 004526FD
:0043ED94 8B4C2420 mov ecx, dword ptr [esp+20] *取到算码后的结果，本例中是：3AF5CDFE=989187582（十进制的）你把989187582改为989187419试试！
:0043ED98 BE83000000 mov esi, 00000083 *好像很熟哦！这不是131吗？（十进制）
:0043ED9D 8BC1 mov eax, ecx *结果送到eax中做除数
:0043ED9F 83C40C add esp, 0000000C
:0043EDA2 99 cdq
:0043EDA3 F7FE idiv esi *除法，余数在edx中。
:0043EDA5 85D2 test edx, edx *又检验是否为零。
:0043EDA7 7433 jne 0043EDDC *不能整除的跳走，当然是出错了！我猜不出注册码来。只有该这儿了。改为je
:0043EDA9 B83DCB883E mov eax, 3E88CB3D
:0043EDAE F7E9 imul ecx
:0043EDB0 C1FA05 sar edx, 05
:0043EDB3 8BC2 mov eax, edx
:0043EDB5 C1E81F shr eax, 1F
:0043EDB8 03D0 add edx, eax
:0043EDBA 81FAFF000000 cmp edx, 000000FF
:0043EDC0 7E1A jle 0043EDDC
:0043EDC2 51 push ecx

到次成功了！在启动试试！哈哈！注册版了吧！呵呵....
不对之处请您指教！

小球[CCG]
2001/4/7


Cpukiller 2.0

 标 题:献给初学者(高手也看看) 破解 Cpukiller 2.0 (1千字)
发信人:gcehi
时 间:2000-9-17 11:28:42
详细信息:
献给初学者 破解 Cpukiller 2.0

软件名称： Cpukiller 2.0
软件大小： 500kb
软件授权： 共享软件
使用平台： Win95/98/NT
下载地址： 自己找吧，哈哈
软件简介： 能减慢某些程序运行太快的缺点!

解密日前：2000年9月17日
解密工具：Trw2000 1.22

用bpx hmemcpy拦下，下pmodule
从这里出来......
0167:0043F4E7 MOV EAX,[EBP-14]----------载入姓名
0167:0043F4EA LEA EDX,[EBP-10]
0167:0043F4ED CALL 0043F114--------------计算注册码
0167:0043F4F2 MOV EAX,[EBP-10]----------过了这一行
0167:0043F4F5 PUSH EAX-------------------下d eax可见注册码
0167:0043F4F6 LEA EDX,[EBP-14]
0167:0043F4F9 MOV EAX,[EBP-04]
0167:0043F4FC MOV EAX,[EAX+0214]
0167:0043F502 CALL 0041C3B0--------------比较注册码
0167:0043F507 MOV EDX,[EBP-14]
0167:0043F50A POP EAX
0167:0043F50B CALL 00403D24
0167:0043F510 JNZ NEAR 0043F5BA
0167:0043F516 mov dl, 01
0167:0043F518 mov eax, dword ptr [0043B828]
0167:0043F51D call 0043B95C
0167:0043F522 mov dword ptr [ebp-08], eax
........

怎么样，简单吗?练练手吧! (我只用了1分钟不到，哈哈)不过写可残了
姓名:gce 注册码:KASAKIWMIASISKIA

!有没有高手能写一下它的注册码生成过程!

欢迎光临: http://www.luosz.cn.gs
与我联系: gcehi@kali.com.cn


Crkme12

 标 题:皮特陈，这个是中文的不必翻译啦。 (7千字)
发信人:飞刀浪子
时 间:2001-6-4 12:15:47
详细信息:
程序名:Crkme12.com
这是皮特陈给我的3个DOS的CRACKME中的一个，另外的一个太简单，还有一个又太复杂，只有这个适中，所以用
他来写过程，也算对皮特陈有个交代，免得问的我连QQ都不敢上，呵呵。
跟踪工具:DEBUG

-U 100 L 142
128E:0100 E9EE00 JMP 01F1
.
.
128E:01F1 E80000 CALL 01F4 ;跳到此处
128E:01F4 5D POP BP ;取得相对偏移,这可是外壳病毒常用的手法哦
128E:01F5 33DB XOR BX,BX
128E:01F7 8BC3 MOV AX,BX
128E:01F9 BFC300 MOV DI,00C3
128E:01FC 893F MOV [BX],DI ;将PSP+0的地方放一个RET,这可是有目的。
128E:01FE 81C39000 ADD BX,0090 ；这个90做为结束代码的入口
128E:0202 53 PUSH BX
128E:0203 2E CS:
128E:0204 FF363600 PUSH [0036] ；取段址，因是COM文件，其实没必要
128E:0208 1F POP DS
128E:0209 1E PUSH DS ；此处压入DS,SI用做下面的RETF到程序入口用
128E:020A 56 PUSH SI ；!!!!!!这可是他的巧妙之处，后面再说
128E:020B 8D76E2 LEA SI,[BP-1E]
128E:020E 8BFB MOV DI,BX
128E:0210 B90F00 MOV CX,000F ；此处移动0F字节到PSP+90的地方，移了些什么，看注一
128E:0213 F2 REPNZ
128E:0214 A4 MOVSB
128E:0215 C64625BE MOV BYTE PTR [BP+25],BE ;注意，此处会改变219的代码
128E:0219 64 DB 64 ；被改为MOV SI,103
128E:021A 0301 ADD AX,[BX+DI]
128E:021C 66 DB 66 ；此处其实就是MOV EDX,[BP-0F],只不过DEBUG太老土，识别不了
128E:021D 8B56F1 MOV DX,[BP-0F]
128E:0220 66 DB 66 ；同上
128E:0221 8B5EF5 MOV BX,[BP-0B]
128E:0224 66 DB 66
128E:0225 8B6EF9 MOV BP,[BP-07]
128E:0228 8B0E0101 MOV CX,[0101] ；CX为EE
128E:022C AC LODSB ；下面在做解码
128E:022D 66 DB 66 ；如果你用32位调试器就可以看到它们的真面目
128E:022E C1 DB C1
128E:022F C20866 RET 6608
128E:0232 33D3 XOR DX,BX
128E:0234 66 DB 66
128E:0235 03D5 ADD DX,BP
128E:0237 66 DB 66
128E:0238 D3C5 ROL BP,CL
128E:023A 32C2 XOR AL,DL
128E:023C 8844FC MOV [SI-04],AL
128E:023F E2EB LOOP 022C
128E:0241 CB RETF ;解码完毕，进入程序。如果程序正常执行会返回到128E:100处执行程序， ;如在DEBUG下，会返回到PSP+0的地方执行那条RET指令，之后回到PSP+90
;的结束代码处，这就是上面那个SI的妙处

;此处为程序的入口,可以脱壳了,将BX=0,CX=EE,再取个名字,W 回写就不用我说了吧.
128E:0100 B409 MOV AH,09
128E:0102 BA7201 MOV DX,0172
128E:0105 CD21 INT 21
128E:0107 B40A MOV AH,0A
128E:0109 BAD201 MOV DX,01D2
128E:010C CD21 INT 21
128E:010E B409 MOV AH,09
128E:0110 BABA01 MOV DX,01BA
128E:0113 CD21 INT 21
128E:0115 BF7201 MOV DI,0172
128E:0118 33ED XOR BP,BP
128E:011A 33DB XOR BX,BX
128E:011C 33C0 XOR AX,AX
128E:011E 33F6 XOR SI,SI
128E:0120 56 PUSH SI
128E:0121 BED201 MOV SI,01D2 ;下面是一连串的运算
128E:0124 8A0ED301 MOV CL,[01D3] ;谁数学好,去做这道题吧,呵呵.
128E:0128 80C102 ADD CL,02
128E:012B 50 PUSH AX
128E:012C AC LODSB
128E:012D 8A25 MOV AH,[DI]
128E:012F 84E4 TEST AH,AH
128E:0131 7422 JZ 0155
128E:0133 02D8 ADD BL,AL
128E:0135 1B45FE SBB AX,[DI-02]
128E:0138 12C4 ADC AL,AH
128E:013A 03E8 ADD BP,AX
128E:013C 86CB XCHG CL,BL
128E:013E D3D5 RCL BP,CL
128E:0140 86CB XCHG CL,BL
128E:0142 AA STOSB
128E:0143 E2E7 LOOP 012C
128E:0145 58 POP AX
128E:0146 5E POP SI
128E:0147 31AC6601 XOR [SI+0166],BP ;注三 ，此处的BP值随密码变动的
128E:014B 0F DB 0F
128E:014C 95 XCHG BP,AX
128E:014D C0 DB C0
128E:014E 02E0 ADD AH,AL
128E:0150 83C602 ADD SI,+02
128E:0153 EBCB JMP 0120
128E:0155 BAC501 MOV DX,01C5
128E:0158 58 POP AX
128E:0159 84E4 TEST AH,AH ;如想爆破,就是这里了
128E:015B 7503 JNZ 0160
128E:015D BACC01 MOV DX,01CC
128E:0160 B409 MOV AH,09
128E:0162 CD21 INT 21
128E:0164 5E POP SI
128E:0165 C3 RET ;返回到PSP+90处执行退出代码。注二

注一：
128E:0090 33C0 XOR AX,AX ；程序执行完后将自己清0，想不让我们看他的代码
128E:0092 BF0001 MOV DI,0100 ；在KV300中也有类似代码。
128E:0095 B9FFFE MOV CX,FEFF
128E:0098 F3 REPZ
128E:0099 AA STOSB
128E:009A B8004C MOV AX,4C00 ;由于程序破坏了PSP+0的代码,所以不能用INT 20结束
128E:009D CD21 INT 21
可以看出程序结束的最终代码在PSP+90的地方
注二:
我们脱壳后,此处已不在适合用RET了,我们可以用INT 20 或MOV AX,4C00,INT 21 来体面的结束它.
我用了INT 21来结束它,我们改了程序后,结果又被注三处改为其他代码,所以在注三处将[SI+166]改为[SI+16B]
也就是让他去修改后面的代码,只要不动到我的结束部分就行了.
其实我们还可以将程序裁剪小一些,留给你去做吧.

现在我讲一下那个SI的用处，其实就是程序正常执行时SI=IP=100，而在DEBUG下，SI被清0了，其中DX（它本该=DS）也一样，也有程序用它来做反跟踪。
我们只要用DEBUG载入程序后，手工将SI=100，就可正常进入程序入口了。说穿了，就是这么诈。

飞刀浪子 留
2001.6.4


CSharp

 标 题:这个软件：http://www.psb.sz.js.cn/images/dir/3/CSharpEdSetup.exe 我研究了好久都没破成功
发信人:1212
时 间:2000-12-7 13:33:19
详细信息:

标 题:好玩
发信人:blowfish
时 间:2000-12-8 11:42:06
详细信息:

该软件的注册码存放在其目录下的CSharpEd.bin文件中。文件结构如下：
struct RegInfo
{
DWORD UserNameLength; //值等于USER_NAME_LENGTH
char UserName[USER_NAME_LENGTH]; //包括末尾的'\0'字符
DWORD RegCodeLength;
char RegCode[REG_CODE_LENGTH];
}

启动时判断注册码：

* Possible StringData Ref from Data Obj ->"CSharpEd.bin"
|
:00406D45 689C244F00 push 004F249C
:00406D4A 8D4C2410 lea ecx, dword ptr [esp+10]
:00406D4E 50 push eax
:00406D4F 51 push ecx
:00406D50 C744243000000000 mov [esp+30], 00000000
:00406D58 E80E760800 call 0048E36B
:00406D5D 8D4C2410 lea ecx, dword ptr [esp+10]
:00406D61 C644242402 mov [esp+24], 02
:00406D66 E86B730800 call 0048E0D6
:00406D6B 8B54240C mov edx, dword ptr [esp+0C]

* Possible StringData Ref from Data Obj ->"S3"
|
:00406D6F 6898244F00 push 004F2498
:00406D74 8D442408 lea eax, dword ptr [esp+08]
:00406D78 52 push edx
:00406D79 50 push eax
:00406D7A E8814B0100 call 0041B900
:00406D7F 83C40C add esp, 0000000C
:00406D82 8B4C2404 mov ecx, dword ptr [esp+04]
:00406D86 C644242403 mov [esp+24], 03
:00406D8B 8B41F8 mov eax, dword ptr [ecx-08]
:00406D8E 85C0 test eax, eax
:00406D90 751A jne 00406DAC
:00406D92 E8F9180000 call 00408690
:00406D97 8B501C mov edx, dword ptr [eax+1C]
:00406D9A 6A00 push 00000000
:00406D9C 6A00 push 00000000
:00406D9E 6A10 push 00000010
:00406DA0 52 push edx

* Reference To: USER32.PostMessageA, Ord:01DEh
|
:00406DA1 FF1544774C00 Call dword ptr [004C7744]
:00406DA7 E9CD000000 jmp 00406E79

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406D90(C)
|
:00406DAC 8D442404 lea eax, dword ptr [esp+04]
:00406DB0 56 push esi
:00406DB1 50 push eax
:00406DB2 8D4C2410 lea ecx, dword ptr [esp+10]

* Possible StringData Ref from Data Obj ->"Antechinus C# Editor Licensed "
->"by "
|
:00406DB6 6874244F00 push 004F2474
:00406DBB 51 push ecx
:00406DBC E81E760800 call 0048E3DF

跟进上面判断注册码的地方，用ReadFile设断点，最终会看见计算注册码的地方，拷下来就可以做一个keyfile maker了。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BB4E(C)
|
:0041BB45 0FBE1431 movsx edx, byte ptr [ecx+esi]
:0041BB49 03C2 add eax, edx
:0041BB4B 41 inc ecx
:0041BB4C 3BCF cmp ecx, edi
:0041BB4E 7CF5 jl 0041BB45

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BB43(C)
|
:0041BB50 99 cdq
:0041BB51 F7FF idiv edi
:0041BB53 53 push ebx
:0041BB54 55 push ebp
:0041BB55 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BB59 8BE8 mov ebp, eax
:0041BB5B 55 push ebp
:0041BB5C 6A00 push 00000000
:0041BB5E E8B92A0700 call 0048E61C
:0041BB63 8BC7 mov eax, edi
:0041BB65 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BB69 99 cdq
:0041BB6A 2BC2 sub eax, edx
:0041BB6C D1F8 sar eax, 1
:0041BB6E 8D1C30 lea ebx, dword ptr [eax+esi]
:0041BB71 0FBE0430 movsx eax, byte ptr [eax+esi]
:0041BB75 03C5 add eax, ebp
:0041BB77 99 cdq
:0041BB78 2BC2 sub eax, edx
:0041BB7A D1F8 sar eax, 1
:0041BB7C 50 push eax
:0041BB7D 6A01 push 00000001
:0041BB7F E8982A0700 call 0048E61C
:0041BB84 8A4437FD mov al, byte ptr [edi+esi-03]
:0041BB88 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BB8C 50 push eax
:0041BB8D 6A02 push 00000002
:0041BB8F E8882A0700 call 0048E61C
:0041BB94 0FBE4E05 movsx ecx, byte ptr [esi+05]
:0041BB98 0FBE5604 movsx edx, byte ptr [esi+04]
:0041BB9C 0FBE4603 movsx eax, byte ptr [esi+03]
:0041BBA0 03CA add ecx, edx
:0041BBA2 03C8 add ecx, eax
:0041BBA4 B856555555 mov eax, 55555556
:0041BBA9 F7E9 imul ecx
:0041BBAB 8BCA mov ecx, edx
:0041BBAD C1E91F shr ecx, 1F
:0041BBB0 8D440A03 lea eax, dword ptr [edx+ecx+03]
:0041BBB4 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BBB8 89442410 mov dword ptr [esp+10], eax
:0041BBBC 0420 add al, 20
:0041BBBE 50 push eax
:0041BBBF 6A03 push 00000003
:0041BBC1 E8562A0700 call 0048E61C
:0041BBC6 8B542410 mov edx, dword ptr [esp+10]
:0041BBCA 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BBCE 8D042A lea eax, dword ptr [edx+ebp]
:0041BBD1 99 cdq
:0041BBD2 2BC2 sub eax, edx
:0041BBD4 D1F8 sar eax, 1
:0041BBD6 2C1C sub al, 1C
:0041BBD8 50 push eax
:0041BBD9 6A04 push 00000004
:0041BBDB E83C2A0700 call 0048E61C
:0041BBE0 8A4437FE mov al, byte ptr [edi+esi-02]
:0041BBE4 8D6C37FE lea ebp, dword ptr [edi+esi-02]
:0041BBE8 0420 add al, 20
:0041BBEA 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BBEE 50 push eax
:0041BBEF 6A05 push 00000005
:0041BBF1 E8262A0700 call 0048E61C
:0041BBF6 8A4B02 mov cl, byte ptr [ebx+02]
:0041BBF9 80C103 add cl, 03
:0041BBFC 51 push ecx
:0041BBFD 6A06 push 00000006
:0041BBFF 8D4C2434 lea ecx, dword ptr [esp+34]
:0041BC03 E8142A0700 call 0048E61C
:0041BC08 0FBE4C37FF movsx ecx, byte ptr [edi+esi-01]
:0041BC0D 0FBE5602 movsx edx, byte ptr [esi+02]
:0041BC11 0FBE4601 movsx eax, byte ptr [esi+01]
:0041BC15 03CA add ecx, edx
:0041BC17 0FBE5500 movsx edx, byte ptr [ebp+00]
:0041BC1B 03C8 add ecx, eax
:0041BC1D 0FBE06 movsx eax, byte ptr [esi]
:0041BC20 03CA add ecx, edx
:0041BC22 03C8 add ecx, eax
:0041BC24 B867666666 mov eax, 66666667
:0041BC29 F7E9 imul ecx
:0041BC2B D1FA sar edx, 1
:0041BC2D 8BCA mov ecx, edx
:0041BC2F C1E91F shr ecx, 1F
:0041BC32 03D1 add edx, ecx
:0041BC34 8D4C242C lea ecx, dword ptr [esp+2C]
:0041BC38 80EA03 sub dl, 03
:0041BC3B 52 push edx
:0041BC3C 6A07 push 00000007
:0041BC3E E8D9290700 call 0048E61C
:0041BC43 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BC75(C)
|
:0041BC45 8B54242C mov edx, dword ptr [esp+2C]
:0041BC49 8A0413 mov al, byte ptr [ebx+edx]
:0041BC4C 3C5B cmp al, 5B
:0041BC4E 7C08 jl 0041BC58
:0041BC50 3C60 cmp al, 60
:0041BC52 7F04 jg 0041BC58
:0041BC54 2C2A sub al, 2A
:0041BC56 EB0E jmp 0041BC66

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041BC4E(C), :0041BC52(C)
|
:0041BC58 3C41 cmp al, 41
:0041BC5A 7C04 jl 0041BC60
:0041BC5C 3C7A cmp al, 7A
:0041BC5E 7E11 jle 0041BC71

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BC5A(C)
|
:0041BC60 8AC3 mov al, bl
:0041BC62 D0E0 shl al, 1
:0041BC64 045D add al, 5D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BC56(U)
|
:0041BC66 50 push eax
:0041BC67 53 push ebx
:0041BC68 8D4C2434 lea ecx, dword ptr [esp+34]
:0041BC6C E8AB290700 call 0048E61C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BC5E(C)
|
:0041BC71 43 inc ebx
:0041BC72 83FB08 cmp ebx, 00000008
:0041BC75 7CCE jl 0041BC45
:0041BC77 8B742428 mov esi, dword ptr [esp+28]
:0041BC7B 8D4C242C lea ecx, dword ptr [esp+2C] //计算出来的注册码
:0041BC7F 51 push ecx
:0041BC80 8BCE mov ecx, esi
:0041BC82 E8C4210700 call 0048DE4B

算完之后就是比较注册码：

:0041B86C E85F020000 call 0041BAD0 //计算注册码
:0041B871 8B44241C mov eax, dword ptr [esp+1C]
:0041B875 83C408 add esp, 00000008
:0041B878 8D74245C lea esi, dword ptr [esp+5C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041B89E(C)
|
:0041B87C 8A10 mov dl, byte ptr [eax] //正确的注册码
:0041B87E 8A1E mov bl, byte ptr [esi] //假注册码
:0041B880 8ACA mov cl, dl
:0041B882 3AD3 cmp dl, bl
:0041B884 751E jne 0041B8A4
:0041B886 84C9 test cl, cl
:0041B888 7416 je 0041B8A0
:0041B88A 8A5001 mov dl, byte ptr [eax+01]
:0041B88D 8A5E01 mov bl, byte ptr [esi+01]
:0041B890 8ACA mov cl, dl
:0041B892 3AD3 cmp dl, bl
:0041B894 750E jne 0041B8A4
:0041B896 83C002 add eax, 00000002
:0041B899 83C602 add esi, 00000002
:0041B89C 84C9 test cl, cl
:0041B89E 75DC jne 0041B87C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041B888(C)
|
:0041B8A0 33C0 xor eax, eax
:0041B8A2 EB05 jmp 0041B8A9

比较完毕之后它会在下面的地方放一个全局标志：

* Referenced by a CALL at Addresses:
|:00406534 , :0040B7DB , :0040BA5E
|
:00409160 A0A9A24F00 mov al, byte ptr [004FA2A9]
:00409165 C3 ret

以后就判断这个标志位：

:0040B7DB E880D9FFFF call 00409160 //取标志位
:0040B7E0 84C0 test al, al
:0040B7E2 751E jne 0040B802
:0040B7E4 6AFF push FFFFFFFF
:0040B7E6 6A00 push 00000000

* Possible Reference to String Resource ID=00223: "Working with projects is only available to registered users"
|
:0040B7E8 68DF000000 push 000000DF

BTW：老外可真及时，C#刚出不久就出了相应的软件产品，值得学习。


Cute FTP Ver 4.0 build 19

标 题:Cute FTP Ver 4.0 build 19 的注册码破解 (820字)
发信人:pcrocker
时 间:2001-2-5 12:42:26
详细信息:
这个软件也许有人破过，昨天使用时提示过期，决定破了它，增加一些经验值。^-^
版本日期：2000-03-18，下载地址记不清了，好象是从网易个人主页的一个链接当的，你也许可以在别处找到。

试用期结束后，运行时提示过期，到注册窗口。（随便输）上面是SN-666777666，下面是NAME-aaabbb。到SOFTICE，下bpx hmemcpy。返回程序，register，到SICE了，bd *，按F12到程序领空后再按一次F12，按几次F10后出现失败窗口。注意到一个call，下bpx 489ab8。返回程序再register，追进这个call，F10向前走。发现检查SN是否为0E个。返回程序重新registe，SN=66677766677766，还是追进这个call，F10向前走，到eip=4ab141处（此处有点眼熟），d eax----输入的注册码，d ecx----算出的注册码，我的机器是 A2222222222222（真奇怪，有没有搞错？！），bc *。回到程序，输入正确的注册码，注册成功，收工。
该程序的注册码存放于注册表中，注册姓名可以随便改。

用时15分钟，很容易 ：-）。


CUTEFTP

 标 题:ery 的破解处女作!!!------昨天晚上把东西龙出来了,愿我们共同交流提高!
发信人:ery
时 间:2000-12-15 9:33:56
详细信息:
最近一段时间不知怎么就喜欢上了破解.----想来别人都说爱是盲目的,嘿嘿,没错!--还是言归正传把!
独立的开始破解是从MAGICWIN 开始的,那个软件很好破.CUTEFTP 则花了我两个多小时.下面是小生的一点点经验,愿与前辈及各位同志分享.
当然开始还是老一套.我用的是SOFTICE4.05和ULTRAEDIT-32 (爱,这个东西我还没有破了:> ).
1. 点击CUTEFTP(以下简称CF),他会要你注册.不过没有ULTRAEDIT讨厌.UE的老是横在你面前.还不能关闭.好了,我们选择注册就是了.输入REG-S:78787878(俺夜学会乐:>), REG-NAME:LUOM,回车.
2. 下CTRL-D 进入SICE.再下 BPX HMEMCPY, THEN PRESS CTRL-D RETURN TO CF.
3. REGISTRATE AGAIN, AND YOU'LL RETURN TO SICE.
4. 下 BC *, 然后PRESS F12, 11 TIMES.
5. 然后 F10, 一路下去.到 017F:00490603 PUSH EAX ...............D EAX YOU'LL FIND '78787878'
6. 所以这以后的一段代码很重要.仔细分析:
017F:00490603 PUSH EAX ........................... D EAX, YOU FIND 78787878
0604 LEA EAX, < ESP+10>
0608 PUSH EAX
0609 CALL 004B2B70...................此处该是比较REG-S的地方, F8进入..........
060E ADD ESP,08
0611 TEST AX, AX
0614 JNZ 00490684
0616 LEA ECX, < ESP+14>
061A PUSH 0000F05D
061F PUSH ECX
0620 CALL 00425D40...................和下面的0639处 一样有CALL,用F8 进入后发现是注册 0625 MOV EDI, <EAX> 的信息,故问题应该在上面的CALL!
0627 LEA EDX. <ESP+18>
062B PUSH 0000F057
0630 PUSH EDX
0631 MOV DWORD PTR < ESP+68>
0639 CALL 00425D40
063E ADD ESP, 10
0641 MOV EAX, <EAX>
0643 PUSH 00
0645 PUSH EDI
0646 PUSH EAX
0647 MOV ECX, ESI
0649 MOV BYTE PTR <ESP+64>,01
064E CALL 004D4CC3 .................一过此处就跳出出错窗口.所以要注意前面的代码!
7. 进入后发现是如下:
017F:004B2B70 SUB ESP, 20
......
2B7E MOV EDI, ESI ......... 下D ESI, YOU FIND 78787878, 此处是开始计算注册吗位数
........
2B85 CMP ECX, 0E ............. 比较REG-S的位数,D 0E, E=14,:>
2B8A PUSH ESI
2B8B CALL 004C0843.................当然是比较注册码位数的子程序,F8进入,看第八点:)
..........
2BC6 LEA EAX, < ESP+38>...............D EAX YOU FIND :A2222222222222
......... D <ESP+38> GET: 12345678901234
2BCA PUSH 0E
2BCC LEA ECX, <ESP+2C>
2BD0 PUSH EAX ........................ D EAX GET :12345678901234
2BD1 PUSH ECX .........................D ECX GET : A2222222222222
2BD2 CALL 004BF1E0....................比较位数正确的注册码!不用管
2BD7 ADD ESP, 2C
2BDA TEST EAX, EAX
2BDC JNZ 004B2BEE ...............如果REG-S 错就跳出错窗
8. 进入后来到 004B2B90 PUSH 0E.....................注册码位数
2B92 LEA EAX, <ESP,20>...............注册码'78787878'
2B98 CALL 004BE540..........比较位数,F8进入到
004BE540 MOV ECX, <ESP+14> .............14 位
...................
004DE54D MOV ESI, <ESP+14>.........D ESI, FIND '78787878'
................... D ESP+14, FIND '14'
004DE560 JNZ 004BE5D1...........位数不对就跳!

8. 在004BE540 AND 004DE560 之间还有一个出错跳转.我第一次用'78787878'时 就给条了出去.但从 2B85 处可知注册码位数在14位.所以跳出来后再回到这儿下断.再次输入注册码,该为12345678901234. 再F8进入004B2B8B CALL 004C0843,再进入到004B2B98的 CALL 004BE540处.F8进入.
9. 你会发现有一个14此轮回的比较子程序. 如果你的注册码位数不正确,就跳到出错窗.我改完后,轮转完即回到上一级程序继续执行.当然后面的,你应该猜得到该比较什么了吧!
10. 这一次你可以一直走到 004B2BC6 处. 赋值. D EAX AND D ESP+38 YOU FIND WHAT? :>
11. THAT IS WHAT WE WANT:SOFTWARE: CUTEFTP VERSION4.2 BUILD 10.3.1
REG-S : A2222222222222,
REG-N: LUOM.
第二天一上班就连线,注册.
嘿嘿嘿,一切尽在掌握 :D
12. 好啦,我们夜不用关后面是什么了.我夜可以放下活儿吃晚饭饭去乐:>>>>>

ERYL
的破解DA作
写于 2000.12.14.8:50 PM


cuteftp4.0.19

 标 题:忙了一个月后，终于有空了。闲来把cuteftp4.0.19的注册码追了一下，却发现其注册码与用户名好像无关。码：a...
发信人:KanKer
时 间:2000-12-22 23:44:28
详细信息:
标题: 忙了一个月后，终于有空了。闲来把cuteftp4.0.19的注册码追了一下，却发现其注册码与用户名好像无关。码：a2222222222222(a后共有13个2)，名：任意。：

内容:

标 题:CuteFTP v4.0.19破解过程提示
发信人:KanKer
时 间:2000-12-23 13:50:41
详细信息:

大致过程如下：
经过痛苦的追踪，来到下处：
:00489A76 6AFF push FFFFFFFF
:00489A78 6820F94F00 push 004FF920
:00489A7D 50 push eax
:00489A7E 64892500000000 mov dword ptr fs:[00000000], esp
:00489A85 83EC44 sub esp, 00000044
:00489A88 55 push ebp
:00489A89 56 push esi
:00489A8A 57 push edi
:00489A8B 8BF1 mov esi, ecx
:00489A8D 6A01 push 00000001
:00489A8F E87ED00300 call 004C6B12
:00489A94 85C0 test eax, eax
:00489A96 0F84B0050000 je 0048A04C
:00489A9C 8DBE94000000 lea edi, dword ptr [esi+00000094]
:00489AA2 6A00 push 00000000
:00489AA4 8BCF mov ecx, edi
:00489AA6 C7442410FFFFFF7F mov [esp+10], 7FFFFFFF
:00489AAE E874EA0300 call 004C8527
:00489AB3 50 push eax ****d eax将看到你输入的假注册码****
:00489AB4 8D442410 lea eax, dword ptr [esp+10]
:00489AB8 50 push eax
:00489AB9 E822160200 call 004AB0E0 ****F8进去****
:00489ABE 83C408 add esp, 00000008
:00489AC1 6685C0 test ax, ax
:00489AC4 756E jne 00489B34

下面是489ab9按F8进去后的程序段：

:004AB0E0 83EC20 sub esp, 00000020
:004AB0E3 83C9FF or ecx, FFFFFFFF
:004AB0E6 33C0 xor eax, eax
:004AB0E8 56 push esi
:004AB0E9 8B74242C mov esi, dword ptr [esp+2C]
:004AB0ED 57 push edi
:004AB0EE 8BFE mov edi, esi
:004AB0F0 F2 repnz
:004AB0F1 AE scasb
:004AB0F2 F7D1 not ecx
:004AB0F4 49 dec ecx ****ecx中存放假注册码的长度****
:004AB0F5 83F90E cmp ecx, 0000000E ****比较假注册码的长度是否为14****
:004AB0F8 7573 jne 004AB16D
:004AB0FA 56 push esi
:004AB0FB E88A6A0000 call 004B1B8A ****假注册码大小写转换段****

* Possible Reference to String Resource ID=00014: "Paste Url"
|
:004AB100 6A0E push 0000000E
:004AB102 8D442420 lea eax, dword ptr [esp+20]
:004AB106 56 push esi
:004AB107 50 push eax
:004AB108 E823480000 call 004AF930
:004AB10D 8D4C2428 lea ecx, dword ptr [esp+28]
:004AB111 C644243600 mov [esp+36], 00
:004AB116 51 push ecx
:004AB117 E80467FEFF call 00491820
:004AB11C 8BF0 mov esi, eax
:004AB11E 56 push esi
:004AB11F E8EC63FEFF call 00491510
:004AB124 8D542420 lea edx, dword ptr [esp+20] ****d edx将看到
第二行就是你输入
的假注册码****
:004AB128 8BF8 mov edi, eax
:004AB12A 52 push edx
:004AB12B 56 push esi
:004AB12C C644242800 mov [esp+28], 00
:004AB131 E86A65FEFF call 004916A0 ****按过此call后，将在假注册码
上一行，出现真正的注册码****
:004AB136 8D442438 lea eax, dword ptr [esp+38]

* Possible Reference to String Resource ID=00014: "Paste Url"
|
:004AB13A 6A0E push 0000000E
:004AB13C 8D4C242C lea ecx, dword ptr [esp+2C]
:004AB140 50 push eax
:004AB141 51 push ecx
:004AB142 E889530000 call 004B04D0 ****比较真假注册码****
:004AB147 83C42C add esp, 0000002C
:004AB14A 85C0 test eax, eax
:004AB14C 7510 jne 004AB15E

虽然在此前也对假注册码做过一些变换，但对真正的比较并不起作用。

<Cracked by KanKer>


CYBERsitter 2000

 标 题:CYBERsitter 2000
发信人:1212
时 间:2000-10-9 19:37:29
详细信息:
http://www.cybersitter.com

CYBERsitter 2000

输入注册码之后的判断：

:004D720F A1E0014E00 mov eax, dword ptr [004E01E0]
:004D7214 8B00 mov eax, dword ptr [eax]
:004D7216 E80547FAFF call 0047B920 //判断注册码
:004D721B 84C0 test al, al
:004D721D 751E jne 004D723D

* Possible StringData Ref from Code Obj ->"The serial number you entered "
->"is invalid."
|
:004D721F B894854D00 mov eax, 004D8594
:004D7224 E86B53FAFF call 0047C594

启动时的判断也是调用同一个子程序：

:004C9454 A1E0014E00 mov eax, dword ptr [004E01E0]
:004C9459 8B00 mov eax, dword ptr [eax]
:004C945B E8C024FBFF call 0047B920 //判断注册码
:004C9460 8B155C014E00 mov edx, dword ptr [004E015C]
:004C9466 8802 mov byte ptr [edx], al //保存判断的结果
:004C9468 A15C014E00 mov eax, dword ptr [004E015C]
:004C946D 803800 cmp byte ptr [eax], 00 //检查判断的结果
:004C9470 755F jne 004C94D1
:004C9472 A1E0014E00 mov eax, dword ptr [004E01E0]

* Possible StringData Ref from Code Obj ->"Unregistered"
|
:004C9477 BAC0A24C00 mov edx, 004CA2C0
:004C947C E897AAF3FF call 00403F18

用来判断注册码的子程序如下。显然这个子程序只被以上两处调用。如果把这个子程序的函数体改掉，让它总返回1就行了。如果只修改输入注册码时的那条判断指令，则启动时还是未注册。另外，注册码很好找的，只要注册码的四部分能分别被4个数整除即可，这四个数可能是根据用户名得来的。

* Referenced by a CALL at Addresses:
|:004C945B , :004D7216
|
:0047B920 55 push ebp
:0047B921 8BEC mov ebp, esp
:0047B923 B904000000 mov ecx, 00000004
:0047B928 6A00 push 00000000
:0047B92A 6A00 push 00000000
:0047B92C 49 dec ecx
:0047B92D 75F9 jne 0047B928

......................................................

:0047BA65 B001 mov al, 01
:0047BA67 84C0 test al, al
:0047BA69 7410 je 0047BA7B
:0047BA6B 8B45EC mov eax, dword ptr [ebp-14] //注册码第一部分
:0047BA6E E891E2F8FF call 00409D04 //atol( )
:0047BA73 99 cdq
:0047BA74 F7FB idiv ebx //整除吗？
:0047BA76 85D2 test edx, edx
:0047BA78 0F94C0 sete al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047BA69(C)
|
:0047BA7B 84C0 test al, al
:0047BA7D 7410 je 0047BA8F
:0047BA7F 8B45E8 mov eax, dword ptr [ebp-18] //注册码第二部分
:0047BA82 E87DE2F8FF call 00409D04 //atol( )
:0047BA87 99 cdq
:0047BA88 F7FE idiv esi //整除吗？
:0047BA8A 85D2 test edx, edx
:0047BA8C 0F94C0 sete al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047BA7D(C)
|
:0047BA8F 84C0 test al, al
:0047BA91 7411 je 0047BAA4
:0047BA93 8B45E4 mov eax, dword ptr [ebp-1C] //注册码第三部分
:0047BA96 E869E2F8FF call 00409D04 //atol( )
:0047BA9B 99 cdq
:0047BA9C F77DF4 idiv [ebp-0C] //整除吗
:0047BA9F 85D2 test edx, edx
:0047BAA1 0F94C0 sete al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047BA91(C)
|
:0047BAA4 84C0 test al, al
:0047BAA6 7411 je 0047BAB9
:0047BAA8 8B45E0 mov eax, dword ptr [ebp-20] //注册码第三部分
:0047BAAB E854E2F8FF call 00409D04 //atol( )
:0047BAB0 99 cdq
:0047BAB1 F77DF0 idiv [ebp-10] //整除吗？
:0047BAB4 85D2 test edx, edx
:0047BAB6 0F94C0 sete al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047BAA6(C)
|
:0047BAB9 8845FB mov byte ptr [ebp-05], al //函数返回值

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047B95F(C), :0047BA00(U), :0047BA18(U), :0047BA30(U), :0047BA48(U)
|:0047BA5E(U)
|
:0047BABC 33C0 xor eax, eax
:0047BABE 5A pop edx
:0047BABF 59 pop ecx
:0047BAC0 59 pop ecx
:0047BAC1 648910 mov dword ptr fs:[eax], edx
:0047BAC4 68E6BA4700 push 0047BAE6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047BAE4(U)
|
:0047BAC9 8D45DC lea eax, dword ptr [ebp-24]
:0047BACC BA05000000 mov edx, 00000005
:0047BAD1 E81284F8FF call 00403EE8
:0047BAD6 8D45FC lea eax, dword ptr [ebp-04]
:0047BAD9 E8E683F8FF call 00403EC4
:0047BADE C3 ret

:0047BADF E9D87DF8FF jmp 004038BC
:0047BAE4 EBE3 jmp 0047BAC9
:0047BAE6 8A45FB mov al, byte ptr [ebp-05] //函数返回值
:0047BAE9 5F pop edi
:0047BAEA 5E pop esi
:0047BAEB 5B pop ebx
:0047BAEC 8BE5 mov esp, ebp
:0047BAEE 5D pop ebp
:0047BAEF C3 ret


dfx V4.0

 标 题:dfx V4.0破解过程 (10千字)
发信人:程式猎人
时 间:2000-9-24 15:21:41
详细信息:
dfx V4.0破解过程
程式猎人
追踪：email:dahuilang@sohu.com
RN:01234567
设bpx hmemcpy中断拦截程序。如下：
015F:03A3780C PUSH EDI
015F:03A3780D PUSH DWORD 80
015F:03A37812 PUSH EAX
015F:03A37813 PUSH DWORD CD
015F:03A37818 PUSH EBX
015F:03A37819 CALL ESI
015F:03A3781B TEST EAX,EAX <-出来 读取第一个值
015F:03A3781D JZ NEAR 03A379E7
015F:03A37823 LEA ECX,[ESP+18]
015F:03A37827 PUSH DWORD 80
015F:03A3782C PUSH ECX
015F:03A3782D PUSH DWORD D3
015F:03A37832 PUSH EBX
015F:03A37833 CALL ESI
015F:03A37835 MOV EDI,[03A4C0A4]
015F:03A3783B TEST EAX,EAX 读取第二个值
015F:03A3783D JNZ 03A3784E
015F:03A3783F LEA EDX,[ESP+18]
015F:03A37843 PUSH DWORD 03A50AC0
015F:03A37848 PUSH EDXz
015F:03A37849 CALL EDI
015F:03A3784B ADD ESP,BYTE +08
015F:03A3784E PUSH DWORD 7F02
015F:03A37853 PUSH BYTE +00
015F:03A37855 CALL `USER32!LoadCursorA`
015F:03A3785B MOV ESI,[03A4C168]
015F:03A37861 PUSH EAX
015F:03A37862 CALL ESI
015F:03A37864 LEA EAX,[ESP+14]
015F:03A37868 LEA ECX,[ESP+0518]
015F:03A3786F PUSH EAX
015F:03A37870 LEA EDX,[ESP+14]
015F:03A37874 PUSH ECX
015F:03A37875 LEA EAX,[ESP+0120]
015F:03A3787C PUSH EDX
015F:03A3787D LEA ECX,[ESP+18]
015F:03A37881 PUSH EAX
015F:03A37882 PUSH ECX
015F:03A37883 LEA EDX,[ESP+2C]
015F:03A37887 PUSH DWORD 03A51AD4
015F:03A3788C LEA EAX,[ESP+B0]
015F:03A37893 PUSH EDXw
015F:03A37894 PUSH EAX
015F:03A37895 CALL `DFXG11!?dfxpEnterSerialNumber@@YAHPAD0PAH10101@Z`
015F:03A3789A ADD ESP,BYTE +20
015F:03A3789D TEST EAX,EAX
015F:03A3789F JNZ NEAR 03A3793A 关键的跳跃地方，进入上面的call中。
015F:03A378A5 PUSH EAX
015F:03A378A6 CALL ESI
015F:03A378A8 MOV EAX,[03A51AD4]
015F:03A378AD CMP EAX,BYTE +05
015F:03A378B0 MOV EAX,[ESP+0C]
015F:03A378B4 JNZ 03A378F7
015F:03A378B6 TEST EAX,EAX
015F:03A378B8 JZ 03A378C3
015F:03A378BA LEA ECX,[ESP+0118]
015F:03A378C1 JMP SHORT 03A3792D
程序在上面就是一个关键的地方，进入call中查看。
015F:03A34DE0 MOV ECX,[ESP+24]
015F:03A34DE4 LEA EAX,[ESP+38]
015F:03A34DE8 PUSH EDX
015F:03A34DE9 PUSH EAX
015F:03A34DEA PUSH ECX
015F:03A34DEB CALL 03A35020
015F:03A34DF0 ADD ESP,BYTE +14
015F:03A34DF3 TEST EAX,EAX
015F:03A34DF5 JZ 03A34E04
015F:03A34DF7 POP EDI
015F:03A34DF8 POP ESI
015F:03A34DF9 POP EBP
015F:03A34DFA MOV EAX,01
015F:03A34DFF POP EBX
015F:03A34E00 ADD ESP,BYTE +08
015F:03A34E03 RET
015F:03A34E04 MOV EAX,[ESP+30]
015F:03A34E08 TEST EAX,EAX
015F:03A34E0A JNZ 03A34E46
015F:03A34E0C MOV DWORD [EDI],05
进入后将到达这里是关键的地方，不用多说再进入了。
015F:03A35020 PUSH EBX
015F:03A35021 MOV EBX,[ESP+18]
015F:03A35025 PUSH EBP
015F:03A35026 MOV EBP,[ESP+10]
015F:03A3502A PUSH ESI
015F:03A3502B MOV ESI,[ESP+10]
015F:03A3502F MOV DWORD [EBP+00],00
015F:03A35036 MOV DWORD [EBX],00
015F:03A3503C TEST ESI,ESI
015F:03A3503E JZ NEAR 03A351FA
015F:03A35044 PUSH ESI
015F:03A35045 CALL 03A40650
015F:03A3504A ADD ESP,BYTE +04
015F:03A3504D TEST EAX,EAX
015F:03A3504F JZ 03A3505A
015F:03A35051 POP ESI
015F:03A35052 POP EBP
015F:03A35053 MOV EAX,01
015F:03A35058 POP EBX
015F:03A35059 RET

015F:03A3505A PUSH EDI
015F:03A3505B MOV EDI,ESI
015F:03A3505D OR ECX,BYTE -01
015F:03A35060 XOR EAX,EAX
015F:03A35062 REPNE SCASB
015F:03A35064 NOT ECX
015F:03A35066 DEC ECX
015F:03A35067 POP EDI
015F:03A35068 CMP ECX,BYTE +08
015F:03A3506B JNZ 03A3507C
015F:03A3506D MOV EAX,[ESP+18]
015F:03A35071 MOV DWORD [EBX],01
015F:03A35077 MOV BYTE [EAX],30
015F:03A3507A JMP SHORT 03A3509A
015F:03A3507C CMP ECX,BYTE +09 *******
015F:03A3507F JNZ NEAR 03A351FA
015F:03A35085 MOV AL,[ESI]
015F:03A35087 MOV ECX,[ESP+18]
015F:03A3508B INC ESI
015F:03A3508C CMP AL,67 ***
015F:03A3508E MOV [ECX],AL
015F:03A35090 JZ 03A3509A
015F:03A35092 CMP AL,47
015F:03A35094 JNZ NEAR 03A351FA
015F:03A3509A PUSH BYTE +30
015F:03A3509C PUSH BYTE +4F
015F:03A3509E PUSH ESI
015F:03A3509F CALL 03A40610
015F:03A350A4 ADD ESP,BYTE +0C
015F:03A350A7 TEST EAX,EAX
015F:03A350A9 JZ 03A350B4
015F:03A350AB POP ESI
015F:03A350AC POP EBP
015F:03A350AD MOV EAX,01
015F:03A350B2 POP EBX
015F:03A350B3 RET
015F:03A350B4 PUSH BYTE +30
015F:03A350B6 PUSH BYTE +6F
015F:03A350B8 PUSH ESI
015F:03A350B9 CALL 03A40610
015F:03A350BE ADD ESP,BYTE +0C
015F:03A350C1 TEST EAX,EAX
015F:03A350C3 JZ 03A350CE
015F:03A350C5 POP ESI
015F:03A350C6 POP EBP
015F:03A350C7 MOV EAX,01
015F:03A350CC POP EBX
015F:03A350CD RET
015F:03A350CE PUSH BYTE +41
015F:03A350D0 PUSH BYTE +61
015F:03A350D2 PUSH ESI
015F:03A350D3 CALL 03A40610
015F:03A350D8 ADD ESP,BYTE +0C
015F:03A350DB TEST EAX,EAX
015F:03A350DD JZ 03A350E8
015F:03A350DF POP ESI
015F:03A350E0 POP EBP
015F:03A350E1 MOV EAX,01
015F:03A350E6 POP EBX
015F:03A350E7 RET
015F:03A350E8 PUSH BYTE +42
015F:03A350EA PUSH BYTE +62
015F:03A350EC PUSH ESI
015F:03A350ED CALL 03A40610
015F:03A350F2 ADD ESP,BYTE +0C
015F:03A350F5 TEST EAX,EAX
015F:03A350F7 JZ 03A35102
015F:03A350F9 POP ESI
015F:03A350FA POP EBP
015F:03A350FB MOV EAX,01
015F:03A35100 POP EBX
015F:03A35101 RET
015F:03A35102 PUSH BYTE +43
015F:03A35104 PUSH BYTE +63
015F:03A35106 PUSH ESI
015F:03A35107 CALL 03A40610
015F:03A3510C ADD ESP,BYTE +0C
015F:03A3510F TEST EAX,EAX
015F:03A35111 JZ 03A3511C
015F:03A35113 POP ESI
015F:03A35114 POP EBP
015F:03A35115 MOV EAX,01
015F:03A3511A POP EBX
015F:03A3511B RET
015F:03A3511C PUSH BYTE +44
015F:03A3511E PUSH BYTE +64
015F:03A35120 PUSH ESI
015F:03A35121 CALL 03A40610
015F:03A35126 ADD ESP,BYTE +0C
015F:03A35129 TEST EAX,EAX
015F:03A3512B JZ 03A35136
015F:03A3512D POP ESI
015F:03A3512E POP EBP
015F:03A3512F MOV EAX,01
015F:03A35134 POP EBX
015F:03A35135 RET
015F:03A35136 PUSH BYTE +45
015F:03A35138 PUSH BYTE +65
015F:03A3513A PUSH ESI
015F:03A3513B CALL 03A40610
015F:03A35140 ADD ESP,BYTE +0C
015F:03A35143 TEST EAX,EAX
015F:03A35145 JZ 03A35150
015F:03A35147 POP ESI
015F:03A35148 POP EBP
015F:03A35149 MOV EAX,01
015F:03A3514E POP EBX
015F:03A3514F RET
015F:03A35150 PUSH BYTE +46
015F:03A35152 PUSH BYTE +66
015F:03A35154 PUSH ESI
015F:03A35155 CALL 03A40610
015F:03A3515A ADD ESP,BYTE +0C
015F:03A3515D TEST EAX,EAX
015F:03A3515F JZ 03A3516A
015F:03A35161 POP ESI
015F:03A35162 POP EBP
015F:03A35163 MOV EAX,01
015F:03A35168 POP EBX
015F:03A35169 RET
015F:03A3516A LEA EDX,[ESP+14]
015F:03A3516E PUSH EDX
015F:03A3516F PUSH ESI
015F:03A35170 CALL 03A3DB80
015F:03A35175 ADD ESP,BYTE +08
015F:03A35178 TEST EAX,EAX
015F:03A3517A JZ 03A35185
015F:03A3517C POP ESI
015F:03A3517D POP EBP
015F:03A3517E MOV EAX,01
015F:03A35183 POP EBX
015F:03A35184 RET
015F:03A35185 MOV EAX,[ESP+14]
015F:03A35189 TEST EAX,EAX
015F:03A3518B JZ 03A351FA
015F:03A3518D MOV AL,[ESI]
015F:03A3518F CMP AL,41
015F:03A35191 JZ 03A351DE
015F:03A35193 MOV ECX,[03A50BD4]
015F:03A35199 CMP ECX,BYTE +0A
015F:03A3519C JNZ 03A351A8
015F:03A3519E CMP AL,36
015F:03A351A0 JZ 03A351DE
015F:03A351A2 POP ESI
015F:03A351A3 POP EBP
015F:03A351A4 XOR EAX,EAX
015F:03A351A6 POP EBX
015F:03A351A7 RET
015F:03A351A8 CMP ECX,BYTE +0B ***
015F:03A351AB JNZ 03A351B7 ***
015F:03A351AD CMP AL,37
015F:03A351AF JZ 03A351DE
015F:03A351B1 POP ESI
015F:03A351B2 POP EBP
015F:03A351B3 XOR EAX,EAX
015F:03A351B5 POP EBX
015F:03A351B6 RET
015F:03A351B7 CMP ECX,BYTE +0C
015F:03A351BA JNZ 03A351C6
015F:03A351BC CMP AL,38
015F:03A351BE JZ 03A351DE
015F:03A351C0 POP ESI
015F:03A351C1 POP EBP
015F:03A351C2 XOR EAX,EAX
015F:03A351C4 POP EBX
015F:03A351C5 RET
015F:03A351C6 CMP ECX,BYTE +0D
015F:03A351C9 JNZ 03A351D5
015F:03A351CB CMP AL,39
015F:03A351CD JZ 03A351DE
015F:03A351CF POP ESI
015F:03A351D0 POP EBP
015F:03A351D1 XOR EAX,EAX
015F:03A351D3 POP EBX
015F:03A351D4 RET
015F:03A351D5 CMP ECX,BYTE +0E
015F:03A351D8 JNZ 03A351DE
015F:03A351DA CMP AL,42
015F:03A351DC JNZ 03A351FA
015F:03A351DE MOV EAX,[ESP+1C]
015F:03A351E2 PUSH EAX
015F:03A351E3 PUSH DWORD 03A4E32C
015F:03A351E8 PUSH ESI
015F:03A351E9 CALL `MSVCRT!sscanf`
015F:03A351EF ADD ESP,BYTE +0C
015F:03A351F2 CMP EAX,BYTE +01
015F:03A351F5 JNZ 03A351FA
015F:03A351F7 MOV [EBP+00],EAX
015F:03A351FA POP ESI
015F:03A351FB POP EBP
015F:03A351FC XOR EAX,EAX
015F:03A351FE POP EBX
015F:03A351FF RET
现在就可以得到注册码了，在那里呢？首先来看
015F:03A3507C CMP ECX,BYTE +09 *******
015F:03A3507F JNZ NEAR 03A351FA
015F:03A35085 MOV AL,[ESI]
015F:03A35087 MOV ECX,[ESP+18]
015F:03A3508B INC ESI
015F:03A3508C CMP AL,67 ***
015F:03A3508E MOV [ECX],AL
015F:03A35090 JZ 03A3509A
015F:03A35092 CMP AL,47
015F:03A35094 JNZ NEAR 03A351FA
先比较你的注册码是否为9位，然后比较第一位是否G/g，如果是的话，将达到向下比较，在上面的那么代码中，其中大部分是跳跃的。最后你将到达这里
015F:03A351A8 CMP ECX,BYTE +0B ***
015F:03A351AB JNZ 03A351B7 ***
015F:03A351AD CMP AL,37
015F:03A351AF JZ 03A351DE
比较第二位是否为7，如果是的话，将到达正确的地方。
游戏结束了。
注册码为：G7???????。
这里?将是任何一个数都可以的。如果你没有研究明白，还想研究的话，可以将下面的这个注册表值删除就可以了。同时第二种注册方法也是将它改为3就可以了。
HKEY_LOCAL_MACHINE\Software\DFX\11\REGISTRATION\stat\(默认)这个值改为3，就可以注册成功了，如果改为其它值就是注册不成功的。


dfx3.3

 标 题:破解入门5 (3千字)
发信人:PeterChen
时 间:2000-9-23 1:32:20
详细信息:
破解入门5
作者：peterchen
很久没有破解过软件了？好就来一篇安装win me之后破解winmap插软件
dfx3.3！这个是我的好朋友[ghf(ccg)]先把注册码告诉我！就是不肯写过程
其实它是也通用注册码(32313231)，对初学者是一个很好练习软件！
由于久没有破解一开始差点连破解工具也不会用了？*_*
破解就好像读书一样，是逆水而行！
其实许多人也破解了就是不肯写过也许是太容易了，不说浪费来开始！
基本不说了！
就是谈论一下究竟下什么中断较了好？
许多（我的朋友也内）bpx hmemcpy，确定也能中断就是比较麻烦！
我就先用bpx getwindowtexta（不行），好就用一个能拦多数特殊软件的
bpx getdlgitemtexta!这当然好用了，多数用拦灰色菜单的软件还记得我破解的
winamp吗？（你没有听过，如果想看一看就下载看雪论坛2！我的破解入门篇）
过里最好用较简单的数好，我就用了12121212！会有人问为什么不大哥的
78787878了？你试一试就知道，好了如果用这个就要等很久才会出现或不出现
错误对窗也就是很难拦阻！
这久很多我过没有介绍用什么工具？
是trw2000!
1.输入 12121212
2.ctrl+n
3.bpx getdlgiemtexta
4.按 F10 44次来到这里：
......
016F:04CC6334 LEA EAX,[ESP+14]
016F:04CC6338 LEA ECX,[ESP+0518]
016F:04CC633F PUSH EAX
016F:04CC6340 LEA EDX,[ESP+10]
016F:04CC6344 PUSH ECX
016F:04CC6345 LEA EAX,[ESP+0120]
016F:04CC634C PUSH EDX
016F:04CC634D LEA ECX,[ESP+1C]
016F:04CC6351 PUSH EAX
016F:04CC6352 PUSH ECX
016F:04CC6353 LEA EDX,[ESP+2C]
016F:04CC6357 PUSH DWORD 04CDE7FC
其实来到这里就game over!:
why?
016F:04CC635C LEA EAX,[ESP+B0]
光条来到这里就会出现: ss:[7191c0]=32313231
一般是d 32313231，现在不灵了！
请看一下寄存器窗口中的：
esp=007191c0
d esp
就出现你用的e-mail
我的就是peter@163.net
再 d 7191c0
就是12121212
它是由32313231组成出来的！
ss就是浮标寄存器要用softice也许才能看到32313231为什么是注册码？
请各大客如果愿意用softice来看，发现如果有错就指出来谢谢！
016F:04CC6363 PUSH EDX
016F:04CC6364 PUSH EAX
016F:04CC6365 CALL `DFXG11!?dfxpEnterSerialNumber@@YAHPAD0PAH10101@Z`
(这里也是做注册机要找地方）
如果有错也欢迎指出来！
016F:04CC636A ADD ESP,BYTE +20
016F:04CC636D TEST EAX,EAX
016F:04CC636F JZ 04CC6380
016F:04CC6371 POP EDI
016F:04CC6372 POP ESI
016F:04CC6373 MOV EAX,01
016F:04CC6378 POP EBX
016F:04CC6379 ADD ESP,090C
016F:04CC637F RET
016F:04CC6380 PUSH BYTE +00
016F:04CC6382 CALL ESI
016F:04CC6384 CMP DWORD [04CDE7FC],BYTE +05
016F:04CC638B JNZ 04CC63C1
016F:04CC638D LEA ECX,[ESP+98](ss:[7191c0]=32313231 也就是注册码)
现在更能证明找注册码不一定是某个寄存器？
换句说不论你如何找或快慢，只要找到注册码就是成功！^_^
这个我破解了很久，一开始不知道它是这样不用d或?
直接把注册码显示出来，也就是明码！
如果不是有朋友破解了给我注册码，到现在也不知道是如何破解也就是这篇过程
也不会问世？
这个软件除了这样找注册码也有暴力破解！
暴力破解也有几种！
1.也是注册码入手，就是修一下不用注册码或乱输入！
2.就是把注册提示窗kill！
3.就是把灰色菜单直接破解！
本人不会暴力破解请各大客愿意写一下吗？
我最想知道就是第三种？
还有这个注册机见得多，就是不知道如何编写？
谁如何编写或把原代码公开？最好是c语言！
说一下注册码的注册过程也不错！
这篇算根大家暂时告别！太多事要做，上网不多了！
如果要我帮的人，笑话谁找你？是的，交流的初学者欢迎e-mail！
还如果e-mail软件最好不要太大，至大也不要超才10m!
如果过程有错欢迎指出或批评?


Dialup Constructor 3.70

 标 题:菜鸟破解录自之 Dialup Constructor 及算法分析 (6千字)
发信人:xiA Qin
时 间:2000-9-11 11:34:55
详细信息:
菜鸟破解录自之 Dialup Constructor

软件名称： Dialup Constructor
软件版本： 3.70
软件大小： 1914KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.grv.com.au/
软件简介： 这个工具软件，你可以在一个窗口下完成如DUN、TCP/IP、Modem等的设置；并且可以对你所用的IE或网景浏览器进行起始页设置；设置MSOutlookExpress和MSMailandNews。可以说和网络有关的所有设置都可以用这个软件来完成。它也支持代理服务器，它内置拨号器，你直接可以用它来拨号上网。

作 者：xiA Qin
级 别：很菜....很菜.....
解密日前：2000年9月11日
解密工具：Trw2000 1.22

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行程序，输入注册信息。

Code Entry No:315788015 //软件自动生成的
Code Entry Key:833632 //软件自动生成的
Licence No:1234567890
Licenced To:Chinese xia
Organisation:[CCG]

................................
015F:0040B24D MOV EAX,[0044A61C]
015F:0040B252 PUSH DWORD 0044A50C
015F:0040B257 PUSH BYTE +09
015F:0040B259 PUSH EAX
015F:0040B25A CALL `DCV3!_pp_getvarnum@12`
015F:0040B25F MOV ECX,[0044A61C]
015F:0040B265 PUSH DWORD 0044A440
015F:0040B26A PUSH BYTE +0A
015F:0040B26C PUSH ECX
015F:0040B26D CALL `DCV3!_pp_getvarnum@12`
015F:0040B272 MOV EDX,[0044A440] //? EDX Code key 16进制
015F:0040B278 MOV EAX,[0044A50C] //? EAX Code No 16进制
015F:0040B27D MOV ECX,[0044A768] //? ECX 输入的注册码 16进制
015F:0040B283 PUSH DWORD 000F4EBE
015F:0040B288 PUSH EDX
015F:0040B289 PUSH EAX
015F:0040B28A PUSH ECX
015F:0040B28B CALL `DCV3!_pp_tcode@16` //按F8进入。
015F:0040B290 DEC EAX
015F:0040B291 JZ 0040B2B2
015F:0040B293 PUSH BYTE +00
015F:0040B295 PUSH DWORD 004437B0
015F:0040B29A PUSH DWORD 00443780
015F:0040B29F PUSH ESI
015F:0040B2A0 CALL `USER32!MessageBoxA` //注册失败对话框。
015F:0040B2A6 XOR EAX,EAX
015F:0040B2A8 POP ESI
015F:0040B2A9 MOV [0044A7A0],EAX
015F:0040B2AE ADD ESP,BYTE +68
015F:0040B2B1 RET
。。。。。。。。。。。。。。。。。。。

按F8进入0040B28B CALL `DCV3!_pp_tcode@16`

015F:0041E965 PUSH EBP
015F:0041E966 MOV EDX,[ESP+10]
015F:0041E96A MOV EBP,ESP
015F:0041E96C PUSH ESI
015F:0041E96D PUSH EDI
015F:0041E96E ADD DWORD [EBP+14],BYTE +34
015F:0041E972 CMP EDX,BYTE +01
015F:0041E975 JNL 0041E97C
015F:0041E977 MOV EDX,01
015F:0041E97C MOV EDI,[EBP+0C] //将Code No移入寄存器EDI
015F:0041E97F MOV ECX,EDI //移入ECX
015F:0041E981 MOV EAX,EDI //移入EAX
015F:0041E983 AND ECX,1F00 //ECX=ECX AND 1F00
015F:0041E989 AND EAX,0007E000 //EAX=EAX AND 7E000
015F:0041E98E SHR ECX,08 //ECX逻辑右移08
015F:0041E991 IMUL ECX,ECX,F3 //ECX=ECX*F3
015F:0041E997 SHR EAX,0D //EAX逻辑右移0D
015F:0041E99A ADD EAX,07BC //EAX=EAX+7BC
015F:0041E99F IMUL EAX,EAX,BYTE +44 //EAX=EAX*44
015F:0041E9A2 ADD ECX,EAX //ECX=ECX+EAX
015F:0041E9A4 MOV EAX,EDI //将EDI移入寄存器EAX
015F:0041E9A6 AND EAX,00780000 //EAX=EAX AND 780000
015F:0041E9AB SHR EAX,13 //EAX逻辑右移19
015F:0041E9AE IMUL EAX,EAX,0108 //EAX=EAX*108
015F:0041E9B4 LEA ESI,[ECX+EAX] //ESI=ECX+EAX
015F:0041E9B7 MOV ECX,EDI //将EDI移入寄存器ECX
015F:0041E9B9 AND ECX,7F800000 //ECX=ECX*7F800000
015F:0041E9BF AND EDI,FF //EDI=EDI AND FF
015F:0041E9C5 SHR ECX,0F //ECX逻辑右移16
015F:0041E9C8 MOV EAX,[EBP+14] //[EBP+14]移入寄存器EAX
015F:0041E9CB IMUL EAX,EAX,BYTE +07 //EAX=EAX*07
015F:0041E9CE ADD ECX,EDI //ECX=ECX+EDI
015F:0041E9D0 IMUL ECX,ECX,BYTE +03 //ECX=ECX*03
015F:0041E9D3 ADD ECX,EAX //ECX=ECX+EAX
015F:0041E9D5 MOV EAX,01 //01移入寄存器EAX
015F:0041E9DA LEA ECX,[ECX+EDX*2] //ECX=ECX+EDX*2
015F:0041E9DD MOV EDX,ESI //将esi移入edx
015F:0041E9DF IMUL EDX,EDX,BYTE +1F //EDX=EDX*1F
015F:0041E9E2 ADD EDX,ECX //EDX=EDX ADD ECX
015F:0041E9E4 LEA ECX,[ESI*2+00] //ECX=ESI*2
015F:0041E9EB MOV ESI,EDX //EDX移入ESI
015F:0041E9ED AND ESI,7FFFFFFF
015F:0041E9F3 CMP ESI,[EBP+08] //真假注册码比较。? [EBP+08]是输入的注册吗。
015F:0041E9F6 JZ 0041EA02 ? ESI是正确的注册码。
015F:0041E9F8 ADD EDX,ECX
015F:0041E9FA INC EAX
015F:0041E9FB CMP EAX,BYTE +32 //有50个注册码?!?@#
015F:0041E9FE JNG 0041E9EB
015F:0041EA00 XOR EAX,EAX
015F:0041EA02 POP EDI
015F:0041EA03 POP ESI
015F:0041EA04 POP EBP
015F:0041EA05 RET 10
.....................................

根据以上分析，我们就可以推出程序注册计算公式，如下：

假设：Code No=A1、Code key=B1

{[(A1 AND 1F00) SHR 08]*F3+{[(A1 AND 7E000) SHR D]+7BC}*44}+{[(A1 AND 780000) SHR 13]*108}=B

[((A1 AND 7F800000) SHR 16)+(A1 AND FF)]*3+[F4EF2*07]+B1*2=C

B*1F+C=D

将D转换成10进制，就是正确的注册码。

举例说明：
Code No=315788015
Code key=833632

{[(315788015 AND 1F00) SHR 08]*F3+{[(315788015 AND 7E000) SHR D]+7BC}*44}+{[(315788015 AND 780000) SHR 13]*108}

={(A00 SHR 08)*F3+[(28000 SHR D)+7BC]*44}+[(500000 SHR 13)*108]
=A*f3+(14+7BC)*44+(A*108)
=97E+7D0*44+A50
=97E+21340+A50
=2270E

[((315788015 AND 7F800000) SHR 16)+(315788015 AND FF)]*3+[F4EF2*07]+833632*2

=[(12800000 SHR 16)+EF]*3+6B9A6B+1970C0
=(2500+EF)*3+850B2B
=25EF*3+850B2B
=42BAB2

2270E*1F+42BAB2=C7C5DD

C7C5DD转换成10进制是13092317

整理一下：(注册码与注册名和注册组织无关!!)
Code Entry No:315788015 //软件自动生成的
Code Entry Key:833632 //软件自动生成的
Licence No:13092317
Licenced To:xiA Qin
Organisation:[CCG]


DirectMediaXtra.x32 V2.01

 标 题:DirectMediaXtra.x32 V2.01 注册码的计算 (13千字)
发信人:robot
时 间:2001-8-3 23:37:29

详细信息:
题外话：以前每逢寒暑假，都能有时间找来几个软件练练手，但这个假期不行，参编的一本书的几万字还没动笔，也就没时间破解了。还有，现在我只是对注册的计算过程感兴趣，而对暴破兴趣不大，但这需要更多的时间去分析，无疑增加了难度，而且现在很多软件越来越破了，也没有那么大的精力去做，只好将放假前做的这个破解整理一下发表在这。
下载地址：http://media2.533.net/source/DirectMediaXtra201_FullDownload.exe
软件简介：一个Authorware多媒体XTRA插件，安装后可以很方便地插入MIDI、视频、FLASH等多媒体文件，并能很方便地对它们进行控制。
破解工具：IDA Pro 4.15，SoftICE 4.05 for Win9X
破解过程：首先，将DirectMediaXtra安装到Authorware的xtras文件夹下，这是安装程序会在xtras下面DirectMediaXtra.x32，这个就是外部多媒体插件。安装好后，运行Authorware 5.2，选择Insert->Tabuleiro Xtras->DirectMediaXtra，出现DirectMediaXtra Properties后，会显示Unregisted，单击register后，随便输入用户名和序列号，激活SoftICE，下bpx hmemcpy(当然，还有更好的断点可下，好像是getwindowtexta，时间长了，记不清了)，按F12、F10直到来到下面

.text:100086A0 arg_0 = dword ptr 4 ====> 注册码
.text:100086A0 arg_4 = dword ptr 8 ====> 用户名

.text:100086A0
.text:100086A0 sub esp, 18h
.text:100086A3 mov eax, dword_1003AA90
.text:100086A8 push ebx
.text:100086A9 push ebp
.text:100086AA mov ebp, [esp+20h+arg_0]
.text:100086AE push esi
.text:100086AF push edi
.text:100086B0 mov [esp+28h+var_C], eax
.text:100086B4 mov edi, ebp
.text:100086B6 or ecx, 0FFFFFFFFh
.text:100086B9 xor eax, eax
.text:100086BB repne scasb
.text:100086BD not ecx
.text:100086BF dec ecx
.text:100086C0 cmp ecx, 14h ====> 注册码是否20位
.text:100086C3 jnz loc_100088D6 ====> 不是则错
.text:100086C9 mov cl, [ebp+3] ====> 第4位注册码
.text:100086CC mov dl, [ebp+4] ====> 第5位注册码
.text:100086CF mov [esp+28h+var_16], al
.text:100086D3 lea eax, [esp+28h+var_18]
.text:100086D7 push eax
.text:100086D8 mov [esp+2Ch+var_18], cl
.text:100086DC mov [esp+2Ch+var_17], dl
.text:100086E0 call _atoi ====> 将第4、5位注册码转为数字
.text:100086E5 add esp, 4
.text:100086E8 cmp eax, 14h ====> 是否是"20"
.text:100086EB jnz loc_100088D6 ====> 不是则错
.text:100086F1 mov al, [ebp+2] \
.text:100086F4 mov cl, [ebp+0] > ====> 取注册码的前3位
.text:100086F7 mov dl, [ebp+1] /
.text:100086FA mov byte ptr [esp+28h+arg_0+2], al
.text:100086FE mov byte ptr [esp+28h+arg_0], cl
.text:10008702 mov byte ptr [esp+28h+arg_0+1], dl
.text:10008706 mov byte ptr [esp+28h+arg_0+3], 0
.text:1000870B lea esi, [esp+28h+var_C] ====> esi指向"DMX"
.text:1000870F lea eax, [esp+28h+arg_0] ====> 指向注册码的前3位
.text:10008713 mov dl, [eax] \
.text:10008715 mov bl, [esi] |
.text:10008717 mov cl, dl |
.text:10008719 cmp dl, bl |
.text:1000871B jnz short loc_1000873B |
.text:1000871D test cl, cl |
.text:1000871F jz short loc_10008737 |
.text:10008721 mov dl, [eax+1] |
.text:10008724 mov bl, [esi+1] |
.text:10008727 mov cl, dl \
.text:10008729 cmp dl, bl /====> 比较注册码的前3位是否是"DMX"
.text:1000872B jnz short loc_1000873B |
.text:1000872D add eax, 2 |
.text:10008730 add esi, 2 |
.text:10008733 test cl, cl |
.text:10008735 jnz short loc_10008713 |
.text:10008737 xor eax, eax |
.text:10008739 jmp short loc_10008740 |
.text:1000873B sbb eax, eax |
.text:1000873D sbb eax, 0FFFFFFFFh |
.text:10008740 test eax, eax |
.text:10008742 jnz loc_100088D6 /
.text:10008748 mov al, [ebp+7] ====> Regcode(8)
.text:1000874B lea ecx, [esp+28h+arg_0]
.text:1000874F push ecx
.text:10008750 mov byte ptr [esp+2Ch+arg_0], al
.text:10008754 call _atoi ====> 转为数字
.text:10008759 mov dl, [ebp+0Bh] ====> Regcode(12)
.text:1000875C mov edi, eax ====> edi=Regcode(8)
.text:1000875E lea eax, [esp+2Ch+arg_0]
.text:10008762 mov byte ptr [esp+2Ch+arg_0], dl
.text:10008766 push eax
.text:10008767 call _atoi ====> 转为数字
.text:1000876C mov cl, [ebp+11h] ====> Regcode(18)
.text:1000876F lea edx, [esp+30h+arg_0]
.text:10008773 push edx
.text:10008774 mov ebx, eax ====> ebx=Regcode(12)
.text:10008776 mov byte ptr [esp+34h+arg_0], cl
.text:1000877A call _atoi
.text:1000877F mov [esp+34h+var_8], eax ====> Regcode(18)放到这里
.text:10008783 mov al, [ebp+0Ch] ====> Regcode(13)
.text:10008786 lea ecx, [esp+34h+arg_0]
.text:1000878A mov byte ptr [esp+34h+arg_0], al
.text:1000878E push ecx
.text:1000878F call _atoi
.text:10008794 mov dl, [ebp+10h] ====> Regcode(17)
.text:10008797 mov esi, eax ====> esi=Regcode(13)
.text:10008799 lea eax, [esp+38h+arg_0]
.text:1000879D mov byte ptr [esp+38h+arg_0], dl
.text:100087A1 push eax
.text:100087A2 call _atoi
.text:100087A7 mov cl, [ebp+8] ====> Regcode(9)
.text:100087AA lea edx, [esp+3Ch+arg_0]
.text:100087AE push edx
.text:100087AF mov [esp+40h+var_4], eax ====> Regcode(17)放到这里
.text:100087B3 mov byte ptr [esp+40h+arg_0], cl
.text:100087B7 call _atoi
.text:100087BC mov ecx, [esp+40h+var_8] ====> Regcode(18)
.text:100087C0 mov edx, [esp+40h+var_4] ====> Regcode(17)
.text:100087C4 add eax, ecx ====> Regcode(9)+Regcode(18)
.text:100087C6 lea ecx, [esi+esi*2] ====> Regcode(13)*3
.text:100087C9 mov [esp+40h+var_11], 0
.text:100087CE mov [esp+40h+var_D], 0
.text:100087D3 lea eax, [eax+edx*4] ====> Regcode(17)*4+Regcode(9)+Regcode(18)
.text:100087D6 add ecx, eax ====> Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)
.text:100087D8 movsx eax, byte ptr [esp+40h+var_C+2] ====> eax="X"
.text:100087DD add ecx, ebx ====> Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)+Regcode(12)
.text:100087DF lea esi, [ecx+edi+0Eh] ====> Regcode(8)+Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)+Regcode(12)+0Eh
.text:100087E3 mov ecx, [esp+40h+var_C] ====> ecx="DM"
.text:100087E7 movsx edx, ch ====> edx="M"
.text:100087EA movsx ecx, cl ====> ecx="D"
.text:100087ED add eax, edx
.text:100087EF add eax, ecx ====> eax="D"+"M"+"X"=E9h
.text:100087F1 mov ecx, 3E8h ====> ecx=3E8h=1000
.text:100087F6 lea eax, [eax+eax*4] ====> eax*5=48Dh
.text:100087F9 shl eax, 2 ====> eax*4=1234h
.text:100087FC cdq
.text:100087FD idiv esi ====> 整除
.text:100087FF add eax, 73h ====> 商+73h
.text:10008802 cdq
.text:10008803 idiv ecx ====> 除以1000，取余数
.text:10008805 mov al, [ebp+0Dh] ====> Regcode(14)
.text:10008808 mov cl, [ebp+12h] ====> Regcode(19)
.text:1000880B mov [esp+40h+var_13], al
.text:1000880F mov al, [ebp+9] ====> Regcode(10)
.text:10008812 mov [esp+40h+var_12], cl
.text:10008816 mov cl, [ebp+0Eh] ====> Regcode(15)
.text:10008819 mov [esp+40h+var_F], al
.text:1000881D mov [esp+40h+var_E], cl
.text:10008821 mov esi, edx ====> esi=余数
.text:10008823 mov dl, [ebp+6] ====> Regcode(7)
.text:10008826 mov [esp+40h+var_14], dl
.text:1000882A mov dl, [ebp+13h] ====> Regcode(20)
.text:1000882D mov [esp+40h+var_10], dl
.text:10008831 lea edx, [esp+40h+var_14] ====> 位置顺序：R(7)R(14)R(19)
.text:10008835 push edx
.text:10008836 call _atoi ====> 转为整数
.text:1000883B mov edi, eax ====> 放到edi中
.text:1000883D lea eax, [esp+44h+var_10] ====> 位置顺序：R(20)R(10)R(15)
.text:10008841 push eax
.text:10008842 call _atoi ====> 转为整数
.text:10008847 add esp, 20h
.text:1000884A mov ecx, eax ====> 放到ecx中
.text:1000884C cmp edi, esi ====> 与余数比较
.text:1000884E jnz loc_100088D6 ====> 不等则错误
.text:10008854 mov eax, 55555556h
.text:10008859 imul esi ====> 乘以余数
.text:1000885B mov eax, edx ====> 取高位数放到eax中
.text:1000885D mov esi, 3E8h
.text:10008862 shr eax, 1Fh ====> 右移1F位，即除以2^31
.text:10008865 lea eax, [edx+eax+159h] ====> +345(159h)
.text:1000886C cdq
.text:1000886D idiv esi ====> 除以1000
.text:1000886F cmp ecx, edx ====> 进行比较
.text:10008871 jnz short loc_100088D6 ====> 不等则错误
.text:10008873 mov edx, [esp+28h+arg_4] ====> 用户名
.text:10008877 or ecx, 0FFFFFFFFh
.text:1000887A mov edi, edx
.text:1000887C xor eax, eax
.text:1000887E repne scasb
.text:10008880 not ecx
.text:10008882 dec ecx
.text:10008883 test ecx, ecx ====> 用户名是否为空
.text:10008885 jle short loc_100088D6 ====> 为空则错误
:
:
:
.text:100088C2 mov eax, 1 ====> 成功的旗标eax=1
.text:100088C7 and ecx, 3
.text:100088CA repe movsb
.text:100088CC pop edi
.text:100088CD pop esi
.text:100088CE pop ebp
.text:100088CF pop ebx
.text:100088D0 add esp, 18h
.text:100088D3 retn 8
.text:100088D6 pop edi
.text:100088D7 pop esi
.text:100088D8 pop ebp
.text:100088D9 xor eax, eax ====> 失败的旗标eax=0
.text:100088DB pop ebx
.text:100088DC add esp, 18h
.text:100088DF retn 8
.text:100088DF sub_100086A0 endp

注册码的计算过程：前5个字符必须为"DMX20"
设X=Regcode(8)+Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)+Regcode(12)+14
Y=(hex("D")+hex("M")+hex("X"))*20
Z=((Y \ X)+115) mod 1000
Z=Regcode(7,14,19)
(Z*55555556h的高位+345) mod 1000=Regcode(20,10,15)

根据上面的计算过程，随机生成第8、9、12、13、17、18和6、11、16位的注册码后，再推算出第7、10、14、15、19、20位的注册码即可，注册机已做成。
注册成功后，会在DirectMediaXtra.x32所在的文件夹下生成一个名为dmx2.lic的隐藏注册文件，里面就是注册名和注册码，可以用文本编辑器打开，以后只要把这个注册文件复制到相应文件夹即可。
附记：该公司的另一个插件，WebXtra 3.0的注册过程跟DirectMediaXtra.x32完全一样，只是稍有不同，有兴趣的可以试一试，至于下载url，我没有，是CrackerABC email给我的，可以找他联系


Diskbase 5.11

 标 题:Diskbase 5.11的破解和注册算法(俺是新手) (18千字)
发信人:fengy
时 间:2001-5-21 18:13:26
详细信息:
软件名称: Diskbase 5.11
软件下载: www.diskbase.com
软件用途: 这个软件的功能类似于CDCollection,就是能够存储CD的目录结构----数据库,以便离线查找.

工具: TRW2000 1.22 , W32dasm ,FileInfo v2.43
日期: 2000.5.18
作者: Fengy

特此,感谢toye和 bnbnf大哥对俺的帮助!!!

过程:
1) 使用 FileInfo v2.43 检测主程序“diskbase.exe”,没有壳的,是delphi编译的

2) 用W32dasm反编译diskbase.exe,结果如下:

主程序:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047735F(C)
|
:004773EE 8B45FC mov eax, dword ptr [ebp-04]
:004773F1 8D9008020000 lea edx, dword ptr [eax+00000208]
:004773F7 8B45FC mov eax, dword ptr [ebp-04]
:004773FA 051C020000 add eax, 0000021C
:004773FF E82CF7FFFF call 00476B30 <<---- 注册验证过程,追入
:00477404 84C0 test al, al
:00477406 0F85BD000000 jne 004774C9 <<---- 分界点了
:0047740C C685B0FDFFFF00 mov byte ptr [ebp+FFFFFDB0], 00

* Possible StringData Ref from Code Obj ->"The DiskBase program is now registered. "
| <<---- 注册正确的提示信息
:00477413 BAFC754700 mov edx, 004775FC
:00477418 8D85B0FDFFFF lea eax, dword ptr [ebp+FFFFFDB0]
:0047741E E841F4F8FF call 00406864

* Possible StringData Ref from Code Obj ->"Please make a backup copy of the "
->"file:"
$
$
$
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00477406(C)
|
:004774C9 6A30 push 00000030

* Possible StringData Ref from Code Obj ->"DiskBase Registration"
|
:004774CB B944774700 mov ecx, 00477744 <<---- 注册错误的提示信息

* Possible StringData Ref from Code Obj ->"This license number is not valid. "
->"Please check if you entered all "
->"data in exactly the same form "
->"in which you received it."
|
:004774D0 BA5C774700 mov edx, 0047775C
:004774D5 A124864900 mov eax, dword ptr [00498624]
:004774DA E815F3FAFF call 004267F4

**************************************************************************

* Referenced by a CALL at Addresses: 注册验证过程子程序
|:00476BB2 , :004773FF
|
:00476B30 55 push ebp
:00476B31 8BEC mov ebp, esp
:00476B33 83C4E8 add esp, FFFFFFE8
:00476B36 8955F8 mov dword ptr [ebp-08], edx
:00476B39 8945FC mov dword ptr [ebp-04], eax
:00476B3C C645F700 mov [ebp-09], 00
:00476B40 8B45FC mov eax, dword ptr [ebp-04]
:00476B43 E814F0FFFF call 00475B5C
:00476B48 8B55FC mov edx, dword ptr [ebp-04]
:00476B4B 81C2A4000000 add edx, 000000A4
:00476B51 B8886B4700 mov eax, 00476B88
:00476B56 E8D1BEF8FF call 00402A2C
:00476B5B 85C0 test eax, eax
:00476B5D 7F20 jg 00476B7F
:00476B5F 8D55F0 lea edx, dword ptr [ebp-10]
:00476B62 8B45FC mov eax, dword ptr [ebp-04]
:00476B65 E8B6F2FFFF call 00475E20 <<----- 根据你的注册信息计算注册码子程
:00476B6A 8B45F8 mov eax, dword ptr [ebp-08]
:00476B6D 8B4008 mov eax, dword ptr [eax+08] <<----- eax = 你随便输入的注册码
:00476B70 3B45F0 cmp eax, dword ptr [ebp-10] <<----- [ebp-10] 正确的注册码
:00476B73 750A jne 00476B7F <<------不一样就错了!!!
:00476B75 837DF000 cmp dword ptr [ebp-10], 00000000
:00476B79 7404 je 00476B7F
:00476B7B C645F701 mov [ebp-09], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00476B5D(C), :00476B73(C), :00476B79(C)
|
:00476B7F 8A45F7 mov al, byte ptr [ebp-09]
:00476B82 8BE5 mov esp, ebp
:00476B84 5D pop ebp
:00476B85 C3 ret

***************************************************************
|
* Referenced by a CALL at Address: 计算regcode的子程序
|:00476B65
|
:00475E20 55 push ebp
:00475E21 8BEC mov ebp, esp
:00475E23 83C4EC add esp, FFFFFFEC
:00475E26 8955EC mov dword ptr [ebp-14], edx
:00475E29 8945F0 mov dword ptr [ebp-10], eax
:00475E2C 33C0 xor eax, eax
:00475E2E 8945F4 mov dword ptr [ebp-0C], eax
:00475E31 C745FC78563412 mov [ebp-04], 12345678 <<---- 以下称为op1
:00475E38 C745F821436587 mov [ebp-08], 87654321 <<---- 以下称为op2 ;就是对这两个参数操作
:00475E3F 55 push ebp
:00475E40 8B45F0 mov eax, dword ptr [ebp-10]
:00475E43 83C024 add eax, 00000024 <<---- name :
:00475E46 E81DFFFFFF call 00475D68
:00475E4B 59 pop ecx
:00475E4C 55 push ebp
:00475E4D 8B45F0 mov eax, dword ptr [ebp-10]
:00475E50 83C064 add eax, 00000064 <<---- organization:
:00475E53 E810FFFFFF call 00475D68
:00475E58 59 pop ecx
:00475E59 55 push ebp
:00475E5A 8B45F0 mov eax, dword ptr [ebp-10] <<---- address1:
:00475E5D 05A4000000 add eax, 000000A4
:00475E62 E801FFFFFF call 00475D68
:00475E67 59 pop ecx
:00475E68 55 push ebp
:00475E69 8B45F0 mov eax, dword ptr [ebp-10]
:00475E6C 05E4000000 add eax, 000000E4 <<----- address2:
:00475E71 E8F2FEFFFF call 00475D68
:00475E76 59 pop ecx
:00475E77 55 push ebp
:00475E78 8B45F0 mov eax, dword ptr [ebp-10]
:00475E7B 053C010000 add eax, 0000013C <<----- City:
:00475E80 E8E3FEFFFF call 00475D68
:00475E85 59 pop ecx
:00475E86 8B45F0 mov eax, dword ptr [ebp-10]

:00475E89 698058020000C7000000 imul eax, dword ptr [eax+00000258], 000000C7
:00475E93 0145FC add dword ptr [ebp-04], eax
:00475E96 8B45F0 mov eax, dword ptr [ebp-10]
:00475E99 8B8058020000 mov eax, dword ptr [eax+00000258]
:00475E9F 05C7000000 add eax, 000000C7
:00475EA4 F76DF8 imul [ebp-08]
:00475EA7 8945F8 mov dword ptr [ebp-08], eax
:00475EAA 8B45FC mov eax, dword ptr [ebp-04]
:00475EAD 0345F8 add eax, dword ptr [ebp-08]
:00475EB0 8B55EC mov edx, dword ptr [ebp-14]
:00475EB3 8902 mov dword ptr [edx], eax <<---- 注册码!!!恭喜!!!
:00475EB5 837DF40A cmp dword ptr [ebp-0C], 0000000A
:00475EB9 7D07 jge 00475EC2
:00475EBB 8B45EC mov eax, dword ptr [ebp-14]
:00475EBE 33D2 xor edx, edx
:00475EC0 8910 mov dword ptr [eax], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475EB9(C)
|
:00475EC2 8BE5 mov esp, ebp
:00475EC4 5D pop ebp
:00475EC5 C3 ret

**********************************************************************

对用户输入信息的处理子程序--------用来生成为计算regcode的参数
|
:00475D68 55 push ebp
:00475D69 8BEC mov ebp, esp
:00475D6B 81C4F4FEFFFF add esp, FFFFFEF4
:00475D71 56 push esi
:00475D72 57 push edi
:00475D73 8BF0 mov esi, eax
:00475D75 8DBDF4FEFFFF lea edi, dword ptr [ebp+FFFFFEF4]
:00475D7B 33C9 xor ecx, ecx
:00475D7D 8A0E mov cl, byte ptr [esi]
:00475D7F 41 inc ecx
:00475D80 F3 repz
:00475D81 A4 movsb
:00475D82 33C0 xor eax, eax
:00475D84 8A85F4FEFFFF mov al, byte ptr [ebp+FFFFFEF4] <<---- string长度
:00475D8A 85C0 test eax, eax
:00475D8C 0F8E86000000 jle 00475E18
:00475D92 8945F4 mov dword ptr [ebp-0C], eax
:00475D95 C745FC01000000 mov [ebp-04], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475E16(C)
|
:00475D9C 8B45FC mov eax, dword ptr [ebp-04]
:00475D9F 8A8405F4FEFFFF mov al, byte ptr [ebp+eax-0000010C]
:00475DA6 8845FB mov byte ptr [ebp-05], al
:00475DA9 807DFB61 cmp byte ptr [ebp-05], 61 <<---- 'a'
:00475DAD 7206 jb 00475DB5
:00475DAF 807DFB7A cmp byte ptr [ebp-05], 7A <<---- 'z'
:00475DB3 760C jbe 00475DC1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475DAD(C)
|
:00475DB5 807DFB41 cmp byte ptr [ebp-05], 41 <<---- 'A'
:00475DB9 7255 jb 00475E10
:00475DBB 807DFB5A cmp byte ptr [ebp-05], 5A <<---- 'Z'
:00475DBF 774F ja 00475E10

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475DB3(C)
|
:00475DC1 8B4508 mov eax, dword ptr [ebp+08]
:00475DC4 FF40F4 inc [eax-0C]
:00475DC7 8A45FB mov al, byte ptr [ebp-05]
:00475DCA E8DDCCF8FF call 00402AAC <<---- 转换为大写字母
:00475DCF 8845FB mov byte ptr [ebp-05], al
:00475DD2 8A45FB mov al, byte ptr [ebp-05]
:00475DD5 8D0480 lea eax, dword ptr [eax+4*eax] <<---- 从这就开始注册算法了,一个一个字符.注意!!!
:00475DD8 40 inc eax
:00475DD9 25FF000000 and eax, 000000FF
:00475DDE 8B5508 mov edx, dword ptr [ebp+08]
:00475DE1 0142FC add dword ptr [edx-04], eax <<----- [edx-04]= op1 +(string[i]*5+1)& 0xff)
:00475DE4 8B4508 mov eax, dword ptr [ebp+08]
:00475DE7 83C0FC add eax, FFFFFFFC
:00475DEA B201 mov dl, 01
:00475DEC E81BFFFFFF call 00475D0C <<---- 注册算法一部分
:00475DF1 8A45FB mov al, byte ptr [ebp-05]
:00475DF4 8D0480 lea eax, dword ptr [eax+4*eax]
:00475DF7 40 inc eax
:00475DF8 25FF000000 and eax, 000000FF
:00475DFD 8B5508 mov edx, dword ptr [ebp+08]
:00475E00 0142F8 add dword ptr [edx-08], eax
:00475E03 8B4508 mov eax, dword ptr [ebp+08]
:00475E06 83C0F8 add eax, FFFFFFF8
:00475E09 B201 mov dl, 01
:00475E0B E828FFFFFF call 00475D38

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00475DB9(C), :00475DBF(C)
|
:00475E10 FF45FC inc [ebp-04]
:00475E13 FF4DF4 dec [ebp-0C]
:00475E16 7584 jne 00475D9C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475D8C(C)
|
:00475E18 5F pop edi
:00475E19 5E pop esi
:00475E1A 8BE5 mov esp, ebp
:00475E1C 5D pop ebp
:00475E1D C3 ret

****************************************************************
|
:00475D0C 55 push ebp
:00475D0D 8BEC mov ebp, esp
:00475D0F 83C4F8 add esp, FFFFFFF8
:00475D12 8855FB mov byte ptr [ebp-05], dl
:00475D15 8945FC mov dword ptr [ebp-04], eax
:00475D18 807DFB00 cmp byte ptr [ebp-05], 00
:00475D1C 7613 jbe 00475D31

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475D2F(C)
|
:00475D1E 55 push ebp
:00475D1F 8B45FC mov eax, dword ptr [ebp-04]
:00475D22 E8B1FFFFFF call 00475CD8
:00475D27 59 pop ecx
:00475D28 FE4DFB dec [ebp-05]
:00475D2B 807DFB00 cmp byte ptr [ebp-05], 00
:00475D2F 77ED ja 00475D1E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475D1C(C)
|
:00475D31 59 pop ecx
:00475D32 59 pop ecx
:00475D33 5D pop ebp
:00475D34 C3 ret

****************************************************************

* Referenced by a CALL at Address:
|:00475D22
|
:00475CD8 55 push ebp
:00475CD9 8BEC mov ebp, esp
:00475CDB 83C4F8 add esp, FFFFFFF8
:00475CDE 8945FC mov dword ptr [ebp-04], eax
:00475CE1 8B45FC mov eax, dword ptr [ebp-04]
:00475CE4 F6400380 test [eax+03], 80
:00475CE8 0F9545FB setne byte ptr [ebp-05] <<---- 对这条语句要理解对,感谢toye&bnbnf
:00475CEC 807DFB00 cmp byte ptr [ebp-05], 00
:00475CF0 7411 je 00475D03
:00475CF2 8B45FC mov eax, dword ptr [ebp-04]
:00475CF5 8B00 mov eax, dword ptr [eax]
:00475CF7 03C0 add eax, eax
:00475CF9 83C801 or eax, 00000001
:00475CFC 8B55FC mov edx, dword ptr [ebp-04]
:00475CFF 8902 mov dword ptr [edx], eax
:00475D01 EB05 jmp 00475D08

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475CF0(C)
|
:00475D03 8B45FC mov eax, dword ptr [ebp-04]
:00475D06 D120 shl dword ptr [eax], 1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475D01(U)
|
:00475D08 59 pop ecx
:00475D09 59 pop ecx
:00475D0A 5D pop ebp
:00475D0B C3 ret

****************************************************************

* Referenced by a CALL at Address:
|:00475E0B
|
:00475D38 55 push ebp
:00475D39 8BEC mov ebp, esp
:00475D3B 83C4F8 add esp, FFFFFFF8
:00475D3E 8855FB mov byte ptr [ebp-05], dl
:00475D41 8945FC mov dword ptr [ebp-04], eax
:00475D44 33C0 xor eax, eax
:00475D46 8A45FB mov al, byte ptr [ebp-05]
:00475D49 251F000080 and eax, 8000001F
:00475D4E 7905 jns 00475D55
:00475D50 48 dec eax
:00475D51 83C8E0 or eax, FFFFFFE0
:00475D54 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475D4E(C)
|
:00475D55 B220 mov dl, 20
:00475D57 2AD0 sub dl, al
:00475D59 8B45FC mov eax, dword ptr [ebp-04]
:00475D5C E8ABFFFFFF call 00475D0C
:00475D61 59 pop ecx
:00475D62 59 pop ecx
:00475D63 5D pop ebp
:00475D64 C3 ret

在注册子程序对注册码的验证中(call 00475E20),通过输入的注册信息对 12345678 和87654321 操作,得到注册码的.
这里要注意的是,有两个flag分别针对0x12345678 和0x87654321操作数,就是setne那.
注册算法挺容易看明白的,关键是setne的操作.

3)几点说明
(1)在分界点直接修改jne 004774C9 --->je 004774C9 时,注册成功,生成keyfile,但是,下次,还提示要求注册.

(2)对于keyfile的注册方式,俺有很多地方不太明白,没概念;论坛上的winrar 和 ultraedit俺还在学习.能不能多介绍一些.

标 题:keyfile的文章俺已经收到,多谢大哥们,昨天,可能贴漏的注册算法. (2千字)
发信人:fengy
时 间:2001-5-22 10:22:37
详细信息:

 下面是俺写的注册算法的C程序(在TC20下测试过)
说明:下面的算法,在输入注册信息时,最好别输入特别的情况,如:space...
俺没有作过多的这种验证,只在连续的字符情况下试过.

#include <ctype.h>
#include <stdio.h>
#include <string.h>

int flag1 = 0;
int flag2 = 0;
long int op1 ,op2;

int computereg(unsigned char *string);

void main( void )
{
unsigned char name[60];/*= "fengy";*/
unsigned char organization[60];/*= "home";*/
unsigned char address1[60];/*= "beijing1";*/
unsigned char address2[60];/*= "beijing2";*/
unsigned char city[60];/* = "beijing3";*/
long int regcode;

flag2 = 0;
flag1 = 0;
op1 = 0x12345678;
op2 = 0x87654321;
printf("Please input your name:");
gets(name);
printf("Please input your organization :");
gets(organization);
printf("Please input your address1:");
gets(address1);
printf("Please input your address2:");
gets(address2);
printf("Please input your city:");
gets(city);
printf(" name : %s \n org  : %s \n add1 : %s \n add2
  : %s  \n city : %s \n", name , organization , address1 , address2 , city
  );
computereg(name);
computereg(organization);
computereg(address1);
computereg(address2);
computereg(city);

regcode = op1+0xc7 + op2*0xc8;

printf("regcode : %lx \n",regcode);
printf("\t------Fengy--------\n");
getch();

}

int computereg(unsigned char *string)
{
int slen;
int i,j;
long int op;
slen = strlen(string);
for(i = 0 ; i< slen ; i++)
{

if(string[i]<0x41) return 0;
if (islower(string[i]) != 0 )
{
string[i]= toupper(string[i]);
}

op1 = (long int)((string[i]*5+1)&
  0xff) + op1;

if(((op1&0xff000000)&0x80000000)
  != 0)
{
flag1 = 1;
}
else
{
flag1 = 0;
}

if (flag1 == 0)
            /* zf = 1  [ebp-05]=
  0*/
{
op1= op1+op1;
}
else

    /* zf = 0  ,setne [ebp-05] =  1*/
{
op1 = (op1+op1)|0x00000001;
}

op2 = (long int)((string[i]*5+1)&0xff)
  + op2;

for(j = (0x20-1) ; j>0 ; j--)
{

if(((op2&0xff000000)&0x80000000)
  != 0)
{
flag2
  = 1;
}
else
{
flag2
  = 0;
}

if (flag2 == 0) /*
  zf = 1  [ebp-05]= 0*/
{
op2=
  op2+op2;
}
else

        /* zf = 0  ,setne [ebp-05] =  1*/
{
op2
  = (op2+op2)|0x00000001;
}

}

}
return 0;

}

---- Fengy ----


DISKdata v3.3.2

 标 题:给TAE!的小礼物－－－对DISKdata v3.3.2注册算法的分析 (14千字)
发信人:CoolBob[CCG]
时 间:2001-7-13 2:05:23
详细信息:
DISKdata v3.3.2 (Write a KeyGen　use TC2.0)

本文作者：CoolBob[CCG] * [CCG] stands for cHINA cRACKING gROUP
coolbob@21cn.com QQ:1618778
所用工具：SoftICE4.05,DeDe v2.50,Turbo C 2.0
目标网址：http://www.digallery.com/diskdata/

前言：
      一日TAE!大虾问小弟对DISKdata这个东东的注册算法有没有兴趣，偶当时正与MM聊的火热，也没在意:)　后来收信的时候看到了TAE!的信才想起来。
      小弟在匆忙中完成此篇，有什么错误的地方，欢迎广大的高手为小弟指正 ;d
正文：运行DISKdata后，点击右边那个About页，在Licensed to与License key文本框中分别填入姓名与注册码。不要急着点击Set按钮，观察一番先。发现下面有个Licensed copies:None Expiration:None,很明显这个程序有很多种注册方式!现在按Ctrl+D弹出SoftICE，下BPX Hmemcpy.按F5回到系统中来。再点击Set按钮.啪～SoftICE露出了她那丑陋的脸^O^。12次F12后(为什么是12次呢，因为Delphi 5写的GetText(),一般要按12次，嘿嘿，不信你试试!)来到了这里:
* Reference to: controls.TControl.GetText(TControl):System.String;
|
00490ED6 E8E5F7F9FF call 004306C0
00490EDB 8B45F0 mov eax, [ebp-$10] //d eax,License key
00490EDE 8D55F4 lea edx, [ebp-$0C]

* Reference to: sysutils.Trim(System.AnsiString):System.AnsiString;
|
00490EE1 E82E77F7FF call 00408614
00490EE6 8B45F4 mov eax, [ebp-$0C]
00490EE9 8D4DFC lea ecx, [ebp-$04]

* Possible String Reference to: 'DISKdata'
|
00490EEC BA9C134900 mov edx, $0049139C

|
00490EF1 E8CA05FEFF call 004714C0 //第一个比较点，F8跟进
00490EF6 84C0 test al, al //出来时al=0就886
00490EF8 0F84C7030000 jz 004912C5
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
在DeDe中双击00490EF1处，
……　……　……
00471559 8B5DF0 mov ebx, [ebp-$10]
0047155C 03DB add ebx, ebx
0047155E 4B dec ebx
0047155F 8D4301 lea eax, [ebx+$01]
00471562 D1F8 sar eax, 1
00471564 7903 jns 00471569
00471566 83D000 adc eax, +$00
00471569 99 cdq
0047156A F7FE idiv esi
0047156C 8BC2 mov eax, edx

|
0047156E E841FFFFFF call 004714B4
00471573 F7EE imul esi
00471575 50 push eax
00471576 8D4301 lea eax, [ebx+$01]
00471579 D1F8 sar eax, 1
0047157B 7903 jns 00471580
0047157D 83D000 adc eax, +$00
00471580 99 cdq
00471581 F7FE idiv esi
00471583 58 pop eax
00471584 2BD0 sub edx, eax
00471586 52 push edx
00471587 8D45DC lea eax, [ebp-$24]
0047158A B9C4164700 mov ecx, $004716C4
0047158F 8B55F8 mov edx, [ebp-$08]

* Reference to: system.@LStrCat3;
|
00471592 E85529F9FF call 00403EEC
00471597 8B45DC mov eax, [ebp-$24]
0047159A 5A pop edx
0047159B 8A4410FF mov al, byte ptr [eax+edx-$01] //从一个固定的字符串'DISKdata-'中取数'D'放入al中，以后依次循环
0047159F 8845EF mov [ebp-$11], al
004715A2 BAC8164700 mov edx, $004716C8
004715A7 8D45D4 lea eax, [ebp-$2C]

* Reference to: system.@PStrCpy;
|
004715AA E88115F9FF call 00402B30
004715AF 8D45D0 lea eax, [ebp-$30]

* Reference to MainForm
|
004715B2 8B55FC mov edx, [ebp-$04]
004715B5 8A541AFF mov dl, byte ptr [edx+ebx-$01] //从我们输入的License key中取一个放入dl中
004715B9 885001 mov [eax+$01], dl //保存dl
004715BC C60001 mov byte ptr [eax], $01
004715BF 8D55D0 lea edx, [ebp-$30]
004715C2 8D45D4 lea eax, [ebp-$2C]
004715C5 B102 mov cl, $02

* Reference to: system.@PStrNCat;
|
004715C7 E83415F9FF call 00402B00
004715CC 8D55D4 lea edx, [ebp-$2C]
004715CF 8D45CC lea eax, [ebp-$34]

* Reference to: system.@PStrCpy;
|
004715D2 E85915F9FF call 00402B30
004715D7 8D45D0 lea eax, [ebp-$30]

* Reference to MainForm
|
004715DA 8B55FC mov edx, [ebp-$04]
004715DD 8A141A mov dl, byte ptr [edx+ebx] //接着取License key中的数
004715E0 885001 mov [eax+$01], dl
004715E3 C60001 mov byte ptr [eax], $01
004715E6 8D55D0 lea edx, [ebp-$30]
004715E9 8D45CC lea eax, [ebp-$34]
004715EC B103 mov cl, $03

* Reference to: system.@PStrNCat;
|
004715EE E80D15F9FF call 00402B00 //连接这两个数字,假设我们输入的License key为'12345'，那么连接后为$12
004715F3 8D55CC lea edx, [ebp-$34]
004715F6 8D45D8 lea eax, [ebp-$28]

* Reference to: system.@LStrFromString(String;ShortString);
| or: system.@WStrFromString(WideString;ShortString);
|
004715F9 E84628F9FF call 00403E44
004715FE 8B45D8 mov eax, [ebp-$28]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
00471601 E86E71F9FF call 00408774 //字符串转化为十六进制$12
00471606 8BD0 mov edx, eax //dl就是转化好的数,12->0x12
00471608 8A45EF mov al, byte ptr [ebp-$11] //al='D'
0047160B 32D0 xor dl, al //异或
0047160D 8D45E8 lea eax, [ebp-$18]

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
00471610 E8B327F9FF call 00403DC8
00471615 8D45E4 lea eax, [ebp-$1C]
00471618 8B55E8 mov edx, [ebp-$18]

* Reference to: system.@LStrCat;
|
0047161B E88828F9FF call 00403EA8
00471620 FF45F0 inc dword ptr [ebp-$10]
00471623 4F dec edi //edi=LEN(License key)
00471624 0F852FFFFFFF jnz 00471559 //循环
……　……　……
* Reference to: system.@LStrLen:Integer;
| or: system.@DynArrayLength;
| or: system.DynArraySize(Pointer):Integer;
|
00471649 E85228F9FF call 00403EA0
0047164E 8B55E4 mov edx, [ebp-$1C]
00471651 8A5C02FF mov bl, byte ptr [edx+eax-$01] //bl=上面循环后算出来的最后一位数
00471655 8B45F4 mov eax, [ebp-$0C]
00471658 8B00 mov eax, [eax]

|
0047165A E86D000000 call 004716CC //除最后一位外，其它的相加，和&0xff
0047165F 3AD8 cmp bl, al //比较
00471661 7404 jz 00471667 //不等就886
……　……　……
call 004716CC　如下：
……　……　……
004716F8 BA01000000 mov edx, $00000001
004716FD 8B4DFC mov ecx, [ebp-$04]
00471700 0FB64C11FF movzx ecx, byte ptr [ecx+edx-$01] //取上面那个循环(EIP:0047160B) XOR后的结果
00471705 81E3FF000000 and ebx, $000000FF
0047170B 03CB add ecx, ebx //连加
0047170D 81E1FF000000 and ecx, $000000FF
00471713 8BD9 mov ebx, ecx
00471715 42 inc edx
00471716 48 dec eax
00471717 75E4 jnz 004716FD
…… …… ……
* Reference to: controls.TControl.GetText(TControl):System.String;
|
00490F37 E884F7F9FF call 004306C0
00490F3C 8B45DC mov eax, [ebp-$24] //取姓名
00490F3F 8D55E0 lea edx, [ebp-$20]

* Reference to: sysutils.UpperCase(System.AnsiString):System.AnsiString;
|
00490F42 E88974F7FF call 004083D0 //将小写字母转化为大写
00490F47 8B45E0 mov eax, [ebp-$20]
00490F4A 8D55E4 lea edx, [ebp-$1C]

…… …… ……
|
00490F55 E87207FEFF call 004716CC
00490F5A 25FF000000 and eax, $000000FF
00490F5F 3BF0 cmp esi, eax //esi=上面那个循环XOR后的结果的第5、6两个个数字转化为十六进制后的数，eax=姓名的所有字母大写后的AScii码之和
00490F61 0F8552030000 jnz 004912B9 //不等就886
…… …… ……

* Reference to: system.@LStrCmp;
|
00490FBF E8EC2FF7FF call 00403FB0 //比较。上面那个循环XOR后的结果的第一、二个数字与姓名的第一、二个字母比较
00490FC4 0F85EF020000 jnz 004912B9 //不等就886
00490FCA 8D45C0 lea eax, [ebp-$40]
00490FCD 50 push eax
00490FCE 8D55B8 lea edx, [ebp-$48]

…… …… ……
* Reference to: system.@LStrCmp;
|
00491041 E86A2FF7FF call 00403FB0 //比较。上面那个循环XOR后的结果的第三、四个数字与姓名的倒数第二、一个字母比较
00491046 0F856D020000 jnz 004912B9
…… …… ……
下面的这段代码就是把上面那个循环XOR后的结果中的第十一位至第十四位与系统时间比较了
* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
00491094 E8DB76F7FF call 00408774 //字符串转化为整数
00491099 66B90100 mov cx, $0001
0049109D 5A pop edx

* Reference to: sysutils.EncodeDate(System.Word;System.Word;System.Word):System.TDateTime;
|
0049109E E8C986F7FF call 0040976C //经过一番运算后
004910A3 DD5D98 fstp qword ptr [ebp-$68] //以浮点数保存，在SoftICE下wf
004910A6 9B wait

* Reference to: sysutils.Date:System.TDateTime;
|
004910A7 E83089F7FF call 004099DC //取系统时间，2001＝0x7D1,经过运算
004910AC DC5D98 fcomp qword ptr [ebp-$68] //与刚才的那个数比较
004910AF DFE0 fstsw ax
004910B1 9E sahf
004910B2 0F83F5010000 jnb 004912AD //if jump,Bad guy!
004910B8 8D4594 lea eax, [ebp-$6C]
004910BB 50 push eax
004910BC B904000000 mov ecx, $00000004
004910C1 BA07000000 mov edx, $00000007
004910C6 8B45FC mov eax, [ebp-$04]
…… …… ……
* Possible String Reference to: '9999'
|
004910D1 BAC8134900 mov edx, $004913C8

* Reference to: system.@LStrCmp;
|
004910D6 E8D52EF7FF call 00403FB0 //这里是比较，如果面那个循环XOR后的结果的第7～10四个数字要是等于'9999'的话，那么注册栏下面的Licensed copies:会显示Site!
004910DB 7512 jnz 004910EF //注意上面那个'9999'

* Possible String Reference to: 'Site' //还有这个'Site'
|
004910E3 BAD8134900 mov edx, $004913D8

* Reference to: controls.TControl.SetText(TControl;System.String);
|
004910E8 E803F6F9FF call 004306F0
004910ED EB24 jmp 00491113
004910EF 8D4590 lea eax, [ebp-$70]
004910F2 50 push eax
004910F3 B904000000 mov ecx, $00000004
004910F8 BA07000000 mov edx, $00000007
004910FD 8B45FC mov eax, [ebp-$04]

…… …… ……
* Possible String Reference to: '12/99' //注意这个'12/99'
|
0049115A BAF4134900 mov edx, $004913F4

* Reference to: system.@LStrCmp;
|
0049115F E84C2EF7FF call 00403FB0//这里是比较，如果面那个循环XOR后的结果的第11～14四个数字要是等于'1299'的话，那么注册栏下面的Expiration:会显示None!也就是永不过期!
00491164 7512 jnz 00491178

* Reference to control TMainForm.ExpirationLabel : TLabel
|
00491166 8B8360040000 mov eax, [ebx+$0460]

* Possible String Reference to: 'None' //还有这个'None'
|
0049116C BA04144900 mov edx, $00491404

* Reference to: controls.TControl.SetText(TControl;System.String);
|
00491171 E87AF5F9FF call 004306F0
00491176 EB63 jmp 004911DB
00491178 8D857CFFFFFF lea eax, [ebp+$FFFFFF7C]
0049117E 50 push eax
0049117F B902000000 mov ecx, $00000002
00491184 BA0B000000 mov edx, $0000000B
00491189 8B45FC mov eax, [ebp-$04]
…… …… ……
下面还有一段代码就是对注册表的操作了。忽略
－－－－－－－－－DISKdata.reg－－－－－－－－－－－－－－－－－－－－－－
REGEDIT4

[HKEY_CURRENT_USER\Software\Digital Information Gallery\DiskData\Settings]
"Licensee"="CoolBob[CCG]"
"Key"="070614165C544D58147D7861725D3D"

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
:),还是帖个注册机，嘿嘿。
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

#include<stdio.h>
#include<ctype.h>
#include<string.h>
main(){
char name[60];
char code[15];
int n=0,i,result_xor=0;
char str[]="DISKdata-DISKdata-";
char date[]="99991299"; /* you can change this for try other License 12 stands for month */
clrscr(); /* 99 stands for 2099 year,Max year in our Windows98,9999 for 'Site' */
printf("DISKdata v3.3.2 keymaker by CoolBob[CCG]\n");
printf("written at 2001-7-13\n");
printf("Enter your name:");
gets(name);
strupr(name);
for(i=0;i<=1;i++)
code[i]=str[i]^name[i];
code[2]=str[2]^name[strlen(name)-2];
code[3]=str[3]^name[strlen(name)-1];
for(i=0;i<strlen(name);i++)
n=n+name[i];
n=n&0xff;
if (n/0x10>9) code[4]=n/0x10+0x37^str[4];
else
code[4]=n/0x10+0x30^str[4];
if (n%0x10>9) code[5]=n%0x10+0x37^str[5];
else
code[5]=n%0x10+0x30^str[5];
for(i=6;i<14;i++)
code[i]=str[i]^date[i-6];
result_xor=name[0]+name[1]+name[strlen(name)-1]+name[strlen(name)-2];
result_xor=result_xor+(code[4]^str[4])+(code[5]^str[5]);
for(i=0;i<8;i++)
result_xor=result_xor+date[i];
result_xor=result_xor&0xff;
code[14]=result_xor^str[14];
printf("License key is:");
for(i=0;i<15;i++)
if (code[i]<=0xF) printf("0%X",code[i]);
else
printf("%X",code[i]);
printf("\npress any key to exit!\n");
getch();
}

-------------------------------------------------------------------------------------
2001-7-13 written by CoolBob

标 题:对注册机的一点补充 (187字)
发信人:CoolBob[CCG]
时 间:2001-7-13 16:43:54
详细信息:

char date[]="99991299'//注册机中的这个'9999'可以用'CCG!'来代替，这样生成的注册码就能显示Liscensed Copies:CCG!

因为这个是用Ｓｅｔｗｉｎｄｏｗｔｅｘｔ来搞定的，所以你可以看看那个调用


Don't Panic 3.2

 标 题:Don't Panic 3.2的破解过程(俺是新手) (3千字)
发信人:fengy
时 间:2001-5-15 17:33:45
详细信息:
在这里,俺看了、学了很多的东东,很是精彩,很是值得学习,但是,更主要是一种精神,这才是让我最值得学习的.
这是俺第一次写破解过程,会有很多不对的地方,请各位多多鼓励,多提建议!!!多谢.

软件名称: Don't Panic
软件下载: www.newhua.com
软件用途: 这个东东可以让你快速的隐藏你所开的窗口(包括任务栏),并且留下你想留给外面看的内容.说简单一点,就是以防不法活动时被擒...*_*

工具: TRW2000 1.22 , W32dasm ,FileInfo v2.43
日期: 2000.5.14
作者: Fengy

过程:

1) 使用 FileInfo v2.43 检测主程序“dp.exe”,没有壳的,好,否则,俺就不会了:)

2) 用W32dasm反编译dp.exe,结果如下:

:00410FE0 A5 movsd
:00410FE1 8BCA mov ecx, edx
:00410FE3 83E103 and ecx, 00000003
:00410FE6 F3 repz
:00410FE7 A4 movsb
:00410FE8 E8F3FEFFFF call 00410EE0
:00410FED 8BF0 mov esi, eax
:00410FEF 56 push esi << ---- esi中为随便输入的注册码
:00410FF0 E8DBFDFFFF call 00410DD0 << ---- 注册码验证子程序,追入
:00410FF5 83C408 add esp, 00000008
:00410FF8 85C0 test eax, eax
:00410FFA 7558 jne 00411054 << ---- 这里就是分界点了
:00410FFC 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Don't Panic!"
|
:00410FFE 6874064200 push 00420674 <<----这里就是输入错误regcode时的提示信息.

* Possible StringData Ref from Data Obj ->"The registration number you have "
->"entered is not valid. Please "
->"enter a valid registration number."
|
:00411003 6810224200 push 00422210
:00411008 53 push ebx

*********************************************************
* Referenced by a CALL at Addresses:
|:00404989 , :0040BD16 , :0040BD85 , :0040CD02 , :00410FF0
|
:00410DD0 8B442404 mov eax, dword ptr [esp+04]
:00410DD4 68D135E2E1 push E1E235D1 <<----
:00410DD9 681953C633 push 33C65319 <<----这两个就是验证注册码正确与否的参数了
:00410DDE 50 push eax
:00410DDF E8DCFFFFFF call 00410DC0 <<----继续进入
:00410DE4 33D2 xor edx, edx
:00410DE6 B9BB0B0000 mov ecx, 00000BBB
:00410DEB F7F1 div ecx
:00410DED 83C40C add esp, 0000000C
:00410DF0 8BC2 mov eax, edx <<----余数 或者 说是模操作的结果
:00410DF2 F7D8 neg eax <<----只有eax = 0时,cf = 0
:00410DF4 1BC0 sbb eax, eax
:00410DF6 40 inc eax
:00410DF7 C3 ret

* Referenced by a CALL at Address:
|:00410DDF
|
:00410DC0 8B442404 mov eax, dword ptr [esp+04] <<----很是眼熟吧,就是你随便输入的注册码
:00410DC4 8B4C240C mov ecx, dword ptr [esp+0C] <<---- 0xE1E235D1
:00410DC8 33C1 xor eax, ecx
:00410DCA 0FAF442408 imul eax, dword ptr [esp+08] <<-----0x33C65319
:00410DCF C3 ret

注册码验证的过程很简单:

(XXX xor 0xE1E235D1)*0x33C65319%0x00000BBB == 0 就可以了
^^^^^^^^^^^^ (2)
如:xxx = 0xE1E233D8
= 3789698008

3)几点说明
(1)在分界点直接修改jne 00411054 --->je 00411054 时,可以看到对注册表的操作...,注册成功,但是,下次,还提示要求注册,可能还可以通过修改注册表来实现注册,我没试过,谁有兴趣可以试试.

(2)注册验证中,*0x33C65319的结果的低位部分保存在eax中,是用eax来与0x0BBB取模的.

(3)算XXX的过程,我没有研究明白,好像不能逆运算得到(请指教),因为用的是低位结果.所以,我是用C写了个程序穷举得到的结果.

-------Fengy-------


Don't Panic! 4.0

 标 题:破解Don't Panic! 4.0(我又来了) (5千字)
发信人:TAE!
时 间:2001-6-22 1:25:39
详细信息:
软件名称：Don't Panic! 4.0
保护方式：注册码
破解人：TAE[FCG] TAE[BCG]
软件简介：一个过滤网上黄色信息的软件！
下载地址:去华军软件园搜索一下吧!呵呵!
破解方法：计算出注册码

********************************************
*首先在这里感谢 小球[CCG]的鼎立相助，呵呵！*
********************************************

运行程序，大家都会吧？呵呵。
找到输入注册码的窗口，什么？找不到？我倒！
输入假注册码111－111－1111
进入trw的调试窗口，下断点hmemcpy
回到程序选“OK”立马被拦。
F10，然后到了这里：
* Reference To: USER32.GetDlgItemTextA, Ord:0107h
|
:0041241D 8B2D48E34100 mov ebp, dword ptr [0041E348]
:00412423 6800010000 push 00000100
:00412428 68043B6500 push 00653B04

* Possible Reference to Dialog: DLGFILEWAIT, CONTROL_ID:0448, ""
|
:00412479 6848040000 push 00000448
:0041247E 83E103 and ecx, 00000003
:00412481 53 push ebx
:00412482 F3 repz
:00412483 A4 movsb
:00412484 FFD5 call ebp
:00412486 BF043C6500 mov edi, 00653C04
:0041248B 83C9FF or ecx, FFFFFFFF
:0041248E 33C0 xor eax, eax
:00412490 68043B6500 push 00653B04
:00412495 F2 repnz
:00412496 AE scasb
:00412497 F7D1 not ecx
:00412499 2BF9 sub edi, ecx
:0041249B 8BF7 mov esi, edi
:0041249D 8BD1 mov edx, ecx
:0041249F BF043B6500 mov edi, 00653B04
:004124A4 83C9FF or ecx, FFFFFFFF
:004124A7 F2 repnz
:004124A8 AE scasb
:004124A9 8BCA mov ecx, edx
:004124AB 4F dec edi
:004124AC C1E902 shr ecx, 02
:004124AF F3 repz
:004124B0 A5 movsd
:004124B1 8BCA mov ecx, edx
:004124B3 83E103 and ecx, 00000003
:004124B6 F3 repz
:004124B7 A4 movsb
:004124B8 E8F3FEFFFF call 004123B0 \\运行此CAll后假注册码就变成了数值型
:004124BD 8BF0 mov esi, eax
:004124BF 56 push esi
:004124C0 E8DBFDFFFF call 004122A0 \\这里是关键
:004124C5 83C408 add esp, 00000008
:004124C8 85C0 test eax, eax
:004124CA 7558 jne 00412524 \\不跳肯定完蛋！
:004124CC 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Don't Panic!"
|
:004124CE 6810174200 push 00421710

* Possible StringData Ref from Data Obj ->"The registration number you have "
->"entered is not valid. Please "
->"enter a valid registration number."
|
:004124D3 681C334200 push 0042331C
:004124D8 53 push ebx

进入这个call 004123B0，到了这里：
|:00405419 , :0040CD7A , :0040CDE9 , :0040DFEE , :004124C0 \\很多调用哟！
|
:004122A0 8B442404 mov eax, dword ptr [esp+04]
:004122A4 68D135E2E1 push E1E235D1 \\注意这个数 （1）
:004122A9 681953C633 push 33C65319 \\注意这个数 （2）
:004122AE 50 push eax
:004122AF E8DCFFFFFF call 00412290 \\进去瞧瞧

进入call 00412290，这里：
:00412290 8B442404 mov eax, dword ptr [esp+04] \\这个是假注册码
:00412294 8B4C240C mov ecx, dword ptr [esp+0C] \\这个是数（1）
:00412298 33C1 xor eax, ecx \\异或两个数
:0041229A 0FAF442408 imul eax, dword ptr [esp+08] \\然后乘数（2）
:0041229F C3 ret \\返回到。。。下面

:004122B4 33D2 xor edx, edx \\清空寄存器edx
:004122B6 B9BB0B0000 mov ecx, 00000BBB \\BBB放到ecx
:004122BB F7F1 div ecx \\eax除ecx也就是除BBB，余数放进了edx
:004122BD 83C40C add esp, 0000000C
:004122C0 8BC2 mov eax, edx \\余数给eax
:004122C2 F7D8 neg eax \\求补
:004122C4 1BC0 sbb eax, eax \\eax-eax-cf=>eax *eax最后要等于0*
:004122C6 40 inc eax \\加1 *这里eax才会变成1.才满足后面
的条件,这也就是间接要求余数 为0*
.
.
:004124C8 85C0 test eax, eax
:004124CA 7558 jne 00412524 \\跳过去就爽了!!

* Possible StringData Ref from Data Obj ->"Don't Panic!"
|
:004124CE 6810174200 push 00421710

* Possible StringData Ref from Data Obj ->"The registration number you have "
->"entered is not valid. Please "
->"enter a valid registration number."

算法:
输入的注册码转换为数值型与E1E235D1异或再乘33C65319/BBB最后余数为0即可
一个有效的注册码:3789698513

再次感谢 小球[CCG]的鼎立相助，呵呵！


Don't Panic! 40

 标 题:再贴一次--------Don't Panic! 40 的破文 (7千字)
发信人:lancelot[CCG]
时 间:2001-8-29 18:21:18
详细信息:
软件名： Don't Panic! v4.0
下载地址： http://www.panicware.com/downloads/DontPanic40.exe
大小： 704KB
用途： Don't Panic！提供您使用电脑时的隐私,
时常有人在您身后晃来晃去，“不小心”就看到您的电脑屏幕吗？
Don'tPanic！让您以最简单的方法保障您的隐私。
让您按一下鼠标或键盘就能隐藏或关闭程序，再按一下就能把程序在便出来。
从此以后，不管是写信、上网、使用电脑软件都不用怕有别人靠近了！
工具： trw2000 v1.23

小弟初来咋到，请诸位老大多多关照，下面是破文。

运行Don't Panic!，输入任意注册码，先别按确定，运行trw2000，设断 bpx hmemcpy
或bpx getdlgitemtexta，回到Don't Panic!程序，按确定，被trw拦下，下 pmodule 来到程序领空，
按 F10 若干下，来到这里：

:004123C8 E8F3FEFFFF call 004122C0-------------(1) 这两个call是计算核心，
:004123CD 8BF0 mov esi, eax 一定要跟进去。
:004123CF 56 push esi
:004123D0 E8DBFDFFFF call 004121B0-------------(2)
:004123D5 83C408 add esp, 00000008
:004123D8 85C0 test eax, eax-----------------EAX 不为 0，则跳
:004123DA 7558 jne 00412434 如果跳，就注册成功

* Referenced by a CALL at Address:
|:004123C8
|
:004122C0 8B442404 mov eax, dword ptr [esp+04] 先进第(1)个call
:004122C4 50 push eax
:004122C5 E844360000 call 0041590E------------------------再跟进去,到 0041590e
:004122CA 83C404 add esp, 00000004
:004122CD C3 ret----------------------------------回到 004123cd

* Referenced by a CALL at Addresses:
|:004122C5 , :0041599D , :004186F9 , :00418727 , :00418752
|
:0041590E 53 push ebx
:0041590F 55 push ebp
:00415910 56 push esi
:00415911 57 push edi
:00415912 8B7C2414 mov edi, dword ptr [esp+14]-----------这里下d edi 可看见你的假注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415942(U)
|
:00415916 833DAC5C420001 cmp dword ptr [00425CAC], 00000001
:0041591D 7E0F jle 0041592E--------------------------这里一定跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041591D(C)
|
:0041592E 0FB607 movzx eax, byte ptr [edi]
:00415931 8B0DA05A4200 mov ecx, dword ptr [00425AA0]
:00415937 8A0441 mov al, byte ptr [ecx+2*eax]
:0041593A 83E008 and eax, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041592C(U)
|
:0041593D 85C0 test eax, eax
:0041593F 7403 je 00415944---------------------------跳
:00415941 47 inc edi
:00415942 EBD2 jmp 00415916

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041593F(C)
|
:00415944 0FB637 movzx esi, byte ptr [edi]
:00415947 47 inc edi
:00415948 83FE2D cmp esi, 0000002D
:0041594B 8BEE mov ebp, esi
:0041594D 7405 je 00415954
:0041594F 83FE2B cmp esi, 0000002B
:00415952 7504 jne 00415958-------------------------再跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415952(C)
|
:00415958 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415989(U)
|
:0041595A 833DAC5C420001 cmp dword ptr [00425CAC], 00000001
:00415961 7E0C jle 0041596F-------------------------再跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415961(C)
|
:0041596F A1A05A4200 mov eax, dword ptr [00425AA0]
:00415974 8A0470 mov al, byte ptr [eax+2*esi]
:00415977 83E004 and eax, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041596D(U)
|
:0041597A 85C0 test eax, eax
:0041597C 740D je 0041598B
:0041597E 8D049B lea eax, dword ptr [ebx+4*ebx] 这5行把你输入的假注册码
:00415981 8D5C46D0 lea ebx, dword ptr [esi+2*eax-30] 当成一个整数，以十六进制
:00415985 0FB637 movzx esi, byte ptr [edi] 的形式存在 ebx 中。
:00415988 47 inc edi
:00415989 EBCF jmp 0041595A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041597C(C)
|
:0041598B 83FD2D cmp ebp, 0000002D
:0041598E 8BC3 mov eax, ebx--------------------------ebx 的值移到 eax 中
:00415990 7502 jne 00415994
:00415992 F7D8 neg eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415990(C)
|
:00415994 5F pop edi
:00415995 5E pop esi
:00415996 5D pop ebp
:00415997 5B pop ebx
:00415998 C3 ret-----------------------------------这里又回到 004122ca,
然后又 ret 到 004123cd,
接着来到第(2)个call

* Referenced by a CALL at Addresses:
|:00405329 , :0040CC8A , :0040CCF9 , :0040DEFE , :004123D0 现在跟进第(2)个call
|
:004121B0 8B442404 mov eax, dword ptr [esp+04]
:004121B4 68D135E2E1 push E1E235D1 这两个数字干什么用的？
:004121B9 681953C633 push 33C65319
:004121BE 50 push eax
:004121BF E8DCFFFFFF call 004121A0 跟进去看，来到 004121a0
:004121C4 33D2 xor edx, edx
:004121C6 B9BB0B0000 mov ecx, 00000BBB
:004121CB F7F1 div ecx 把 EAX 中的值除与 BBB
:004121CD 83C40C add esp, 0000000C 再把余数给 EAX
:004121D0 8BC2 mov eax, edx
:004121D2 F7D8 neg eax
:004121D4 1BC0 sbb eax, eax
:004121D6 40 inc eax 如果余数为0，这里将使
:004121D7 C3 ret EAX 为 1，回到 004123d5

* Referenced by a CALL at Address:
|:004121BF
|
:004121A0 8B442404 mov eax, dword ptr [esp+04] 原来是把 eax 中的值
:004121A4 8B4C240C mov ecx, dword ptr [esp+0C] 与 E1E235D1 异或后再与
:004121A8 33C1 xor eax, ecx 33C65319 相乘
:004121AA 0FAF442408 imul eax, dword ptr [esp+08]
:004121AF C3 ret-----------------------------------回到 004121c4

总结一下：程序把你输入的注册码当作一个10位的整数，并转换成16进制数，然后与E1E235D1异或后再乘
33C65319,得到的乘积除去BBB，如果能整除，则注册成功。

好，现在可以写 KeyGen 了，用C语言写的 KeyGen如下，多简单啊：

#include <stdio.h>
#include <math.h>

void main()
{
int x=0,y=0;
for(int i=0; i<2147483647; i++)
{
x=i;
x^=0xe1e235d1;
x*=0x33c65319;
x%=0xbbb;
if (x==0)
printf("i=%d\n",i);
}
}

运行 KeyGen ,随便抄一个注册码下来，0011210112，注册，成功！！！

Don't Panic! v4.0 crack by lancelot 2001.6.26


DubIt V2.01

 标 题:好长时间没有向这里贴文章了，今天写一个比较简单的，难度不在，不过没有下载地址。 (18千字)
发信人:程式猎人
时 间:2000-10-10 20:48:14
详细信息:

DubIt V2.01
类别：视频工具
版本：2.01
文件大小：1897KB
授权：共享软件
运行平台：Win95/98/NT
作者网站：http://programhunter.126.com
软件简介： 可在观看Image或Movie的时候，实时加入语音，然后生成标准的.AVI文件。
追踪：name：dahuilang
RN：01234567
这个软件是同著名的snagit32图象捕捉软件是同一个公司出口的软件。所以在破解它时同破解snigit的软件是相同的。现在开始破解，在输入注册码前，你一定要写一个表格后，才能输入注册码。记得一定要是公司的名字才是有效的。
:0040DCFA 8BD8 mov ebx, eax <-从这里出来
:0040DCFC 83FB12 cmp ebx, 00000012
:0040DCFF 0F8C4B010000 jl 0040DE50
程序在这里比较你的注册码是否小于18位，所以在这里可以设RN：01234567890123456789，向下追踪：
:0040DD05 8D4760 lea eax, dword ptr [edi+60]

* Possible StringData Ref from Data Obj ->"0123456789ABCDEF-"
|
:0040DD08 6854CD4500 push 0045CD54
:0040DD0D 50 push eax
:0040DD0E E8ED4F0100 call 00422D00
:0040DD13 59 pop ecx
:0040DD14 3BC3 cmp eax, ebx
:0040DD16 59 pop ecx
:0040DD17 0F8533010000 jne 0040DE50
:0040DD1D 8D4F60 lea ecx, dword ptr [edi+60]
:0040DD20 8D5C3B60 lea ebx, dword ptr [ebx+edi+60]
:0040DD24 3BCB cmp ecx, ebx
:0040DD26 8BC1 mov eax, ecx
:0040DD28 7312 jnb 0040DD3C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040DD30(U), :0040DD3A(C)
|
:0040DD2A 80392D cmp byte ptr [ecx], 2D
:0040DD2D 7503 jne 0040DD32
:0040DD2F 41 inc ecx
:0040DD30 EBF8 jmp 0040DD2A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DD2D(C)
|
:0040DD32 8A11 mov dl, byte ptr [ecx]
:0040DD34 8810 mov byte ptr [eax], dl
:0040DD36 40 inc eax
:0040DD37 41 inc ecx
:0040DD38 3BC3 cmp eax, ebx
:0040DD3A 72EE jb 0040DD2A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DD28(C)
|
:0040DD3C 802000 and byte ptr [eax], 00
:0040DD3F 8D4760 lea eax, dword ptr [edi+60]
:0040DD42 50 push eax
:0040DD43 8D4DFC lea ecx, dword ptr [ebp-04]
:0040DD46 E8CD4C0200 call 00432A18
:0040DD4B 8D45F8 lea eax, dword ptr [ebp-08]

* Possible Reference to Dialog: DialogID_0095, CONTROL_ID:0004, "Open"
|
:0040DD4E 6A04 push 00000004
:0040DD50 50 push eax
:0040DD51 8D4DFC lea ecx, dword ptr [ebp-04]
:0040DD54 8D5F5C lea ebx, dword ptr [edi+5C]
:0040DD57 E8DC1E0200 call 0042FC38
:0040DD5C 50 push eax
:0040DD5D 8BCB mov ecx, ebx
:0040DD5F E8334D0200 call 00432A97
:0040DD64 8D4DF8 lea ecx, dword ptr [ebp-08]
:0040DD67 E83E4C0200 call 004329AA
:0040DD6C 8B45FC mov eax, dword ptr [ebp-04]
:0040DD6F 8D4DFC lea ecx, dword ptr [ebp-04]
:0040DD72 8B40F8 mov eax, dword ptr [eax-08]
:0040DD75 83C0FC add eax, FFFFFFFC
:0040DD78 50 push eax
:0040DD79 8D45F8 lea eax, dword ptr [ebp-08]
:0040DD7C 50 push eax
:0040DD7D E8321F0200 call 0042FCB4
:0040DD82 50 push eax
:0040DD83 8D4DFC lea ecx, dword ptr [ebp-04]
:0040DD86 E80C4D0200 call 00432A97
:0040DD8B 8D4DF8 lea ecx, dword ptr [ebp-08]
:0040DD8E E8174C0200 call 004329AA
:0040DD93 8B1B mov ebx, dword ptr [ebx]
:0040DD95 6A10 push 00000010
:0040DD97 6A05 push 00000005
:0040DD99 8BCE mov ecx, esi
:0040DD9B FF75FC push [ebp-04]
:0040DD9E 53 push ebx
:0040DD9F E864190000 call 0040F708
:0040DDA4 6A01 push 00000001
:0040DDA6 8BD8 mov ebx, eax
:0040DDA8 58 pop eax
:0040DDA9 3AD8 cmp bl, al *******
:0040DDAB 0F8583000000 jne 0040DE34
:0040DDB1 83A6D000000000 and dword ptr [esi+000000D0], 00000000
:0040DDB8 8986C4000000 mov dword ptr [esi+000000C4], eax
:0040DDBE 8D4760 lea eax, dword ptr [edi+60]
:0040DDC1 8BCE mov ecx, esi
:0040DDC3 50 push eax

* Possible StringData Ref from Data Obj ->"RegistrationKey"
|
:0040DDC4 6844CD4500 push 0045CD44

* Possible StringData Ref from Data Obj ->"Settings"
|
:0040DDC9 6864C64500 push 0045C664
:0040DDCE E8D4100300 call 0043EEA7
:0040DDD3 8B761C mov esi, dword ptr [esi+1C]
:0040DDD6 FF761C push [esi+1C]
程序在***处是一个关键的跳跃，因为下面有一个比较明显的地方，"RegistrationKey"这个地方就是程序将要向注册表中写入数据的键值，所以现在应当分析一下那个比较的地方。现在就进入call 0040F708中。
:0040F708 55 push ebp
:0040F709 8BEC mov ebp, esp
:0040F70B 83EC4C sub esp, 0000004C
:0040F70E 8365F800 and dword ptr [ebp-08], 00000000
:0040F712 8065FE00 and byte ptr [ebp-02], 00
:0040F716 53 push ebx
:0040F717 56 push esi
:0040F718 57 push edi
:0040F719 6A0F push 0000000F
:0040F71B 8D45E8 lea eax, dword ptr [ebp-18]
:0040F71E 6A00 push 00000000
:0040F720 8BD9 mov ebx, ecx
:0040F722 50 push eax
:0040F723 C645FF01 mov [ebp-01], 01
:0040F727 E8F4300100 call 00422820
:0040F72C 8B7D0C mov edi, dword ptr [ebp+0C]

* Reference To: KERNEL32.lstrlenA, Ord:0308h
|
:0040F72F 8B35D0C24400 mov esi, dword ptr [0044C2D0]
:0040F735 83C40C add esp, 0000000C
:0040F738 57 push edi
:0040F739 FFD6 call esi
:0040F73B 50 push eax
:0040F73C 8D45E8 lea eax, dword ptr [ebp-18]
:0040F73F 57 push edi
:0040F740 50 push eax
:0040F741 E86A290100 call 004220B0
:0040F746 83C40C add esp, 0000000C
:0040F749 66837D1005 cmp word ptr [ebp+10], 0005
:0040F74E 7413 je 0040F763
:0040F750 66837D1006 cmp word ptr [ebp+10], 0006
:0040F755 740C je 0040F763
:0040F757 FF7508 push [ebp+08]
:0040F75A 8BCB mov ecx, ebx
:0040F75C E8BD000000 call 0040F81E
:0040F761 EB0F jmp 0040F772

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040F74E(C), :0040F755(C)
|
:0040F763 6A10 push 00000010
:0040F765 6A00 push 00000000
:0040F767 FF7508 push [ebp+08]
:0040F76A E890390100 call 004230FF
:0040F76F 83C40C add esp, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F761(U)
|
:0040F772 8945F8 mov dword ptr [ebp-08], eax
:0040F775 8D45B4 lea eax, dword ptr [ebp-4C]
:0040F778 50 push eax
:0040F779 E8B0070100 call 0041FF2E
:0040F77E 85C0 test eax, eax
:0040F780 59 pop ecx
:0040F781 7509 jne 0040F78C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040F7A0(C), :0040F7B6(C)
|
:0040F783 8065FF00 and byte ptr [ebp-01], 00
:0040F787 E983000000 jmp 0040F80F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F781(C)
|
:0040F78C 8D4510 lea eax, dword ptr [ebp+10]
:0040F78F 6A02 push 00000002
:0040F791 50 push eax
:0040F792 8D45B4 lea eax, dword ptr [ebp-4C]
:0040F795 50 push eax
:0040F796 E89F070100 call 0041FF3A
:0040F79B 83C40C add esp, 0000000C
:0040F79E 85C0 test eax, eax
:0040F7A0 74E1 je 0040F783
:0040F7A2 8D45F8 lea eax, dword ptr [ebp-08]
:0040F7A5 6A02 push 00000002
:0040F7A7 50 push eax
:0040F7A8 8D45B4 lea eax, dword ptr [ebp-4C]
:0040F7AB 50 push eax
:0040F7AC E889070100 call 0041FF3A
:0040F7B1 83C40C add esp, 0000000C
:0040F7B4 85C0 test eax, eax
:0040F7B6 74CB je 0040F783
:0040F7B8 8D45E8 lea eax, dword ptr [ebp-18]
:0040F7BB 50 push eax
:0040F7BC 8D45B4 lea eax, dword ptr [ebp-4C]
:0040F7BF 50 push eax
:0040F7C0 E823080100 call 0041FFE8
:0040F7C5 59 pop ecx
:0040F7C6 85C0 test eax, eax
:0040F7C8 59 pop ecx
:0040F7C9 7509 jne 0040F7D4
:0040F7CB 2045FF and byte ptr [ebp-01], al *****
:0040F7CE C645FE0A mov [ebp-02], 0A
:0040F7D2 EB3B jmp 0040F80F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F7C9(C)
|
:0040F7D4 0FB75D14 movzx ebx, word ptr [ebp+14]
:0040F7D8 57 push edi
:0040F7D9 FFD6 call esi
:0040F7DB 83F80E cmp eax, 0000000E
:0040F7DE 7C27 jl 0040F807
:0040F7E0 83C70C add edi, 0000000C
:0040F7E3 6A02 push 00000002
:0040F7E5 57 push edi
:0040F7E6 E886070100 call 0041FF71 /*/*/*/*/*
:0040F7EB 59 pop ecx
:0040F7EC 83F841 cmp eax, 00000041
:0040F7EF 59 pop ecx
:0040F7F0 7304 jnb 0040F7F6
:0040F7F2 33C0 xor eax, eax
:0040F7F4 EB03 jmp 0040F7F9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F7F0(C)
|
:0040F7F6 83E841 sub eax, 00000041

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F7F4(U)
|
:0040F7F9 3BC3 cmp eax, ebx
:0040F7FB 7312 jnb 0040F80F
:0040F7FD 8065FF00 and byte ptr [ebp-01], 00
:0040F801 C645FE0B mov [ebp-02], 0B
:0040F805 EB08 jmp 0040F80F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F7DE(C)
|
:0040F807 8065FF00 and byte ptr [ebp-01], 00
:0040F80B C645FE0C mov [ebp-02], 0C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040F787(U), :0040F7D2(U), :0040F7FB(C), :0040F805(U)
|
:0040F80F 33C0 xor eax, eax
:0040F811 5F pop edi
:0040F812 8A65FE mov ah, byte ptr [ebp-02]
:0040F815 5E pop esi
:0040F816 8A45FF mov al, byte ptr [ebp-01]
:0040F819 5B pop ebx
:0040F81A C9 leave
:0040F81B C21000 ret 0010
现在进入后分析一下，我们将要得到什么值才能在外面的那个比较的地方不跳跃，应当是al值，所以这里将先看一看al返回前那个值是由什么决定的。现在先从后面来看一看，发现程序将使用[ebp-01]来决定al值，那么就先分析[ebp-01]的的值在什么地方可以变化。因为在外面的比较地方只有当al=1时，才能注册成功，所以看一看在哪里可以得到[ebp-01]=1。 我们发现在*****处可以使用[ebp-01]=al，当al=1时就满足条件的。所以进入call 0041FFE8中
:0041FFE8 55 push ebp
:0041FFE9 8BEC mov ebp, esp
:0041FFEB 83EC7C sub esp, 0000007C
:0041FFEE 6A30 push 00000030
:0041FFF0 33C9 xor ecx, ecx
:0041FFF2 58 pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00420000(C)
|
:0041FFF3 0FB7D1 movzx edx, cx
:0041FFF6 41 inc ecx
:0041FFF7 884415EC mov byte ptr [ebp+edx-14], al
:0041FFFB 40 inc eax
:0041FFFC 663D3900 cmp ax, 0039
:00420000 76F1 jbe 0041FFF3
:00420002 6A41 push 00000041
:00420004 58 pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00420012(C)
|
:00420005 0FB7D1 movzx edx, cx
:00420008 41 inc ecx
:00420009 884415EC mov byte ptr [ebp+edx-14], al
:0042000D 40 inc eax
:0042000E 663D4600 cmp ax, 0046
:00420012 76F1 jbe 00420005
:00420014 53 push ebx
:00420015 56 push esi
:00420016 57 push edi
:00420017 8B7D0C mov edi, dword ptr [ebp+0C]
:0042001A 6A02 push 00000002
:0042001C 894DFC mov dword ptr [ebp-04], ecx
:0042001F 8D470C lea eax, dword ptr [edi+0C]
:00420022 50 push eax
:00420023 E849FFFFFF call 0041FF71
:00420028 8B7508 mov esi, dword ptr [ebp+08]
:0042002B 8945FC mov dword ptr [ebp-04], eax
:0042002E 8D45FC lea eax, dword ptr [ebp-04]
:00420031 6A02 push 00000002
:00420033 50 push eax
:00420034 56 push esi
:00420035 E800FFFFFF call 0041FF3A
:0042003A 8D4708 lea eax, dword ptr [edi+08]

* Possible Reference to Dialog: DialogID_0095, CONTROL_ID:0004, "Open"
|
:0042003D 6A04 push 00000004
:0042003F 50 push eax
:00420040 E82CFFFFFF call 0041FF71
:00420045 8945FC mov dword ptr [ebp-04], eax
:00420048 8D45FC lea eax, dword ptr [ebp-04]
:0042004B 6A02 push 00000002
:0042004D 50 push eax
:0042004E 56 push esi
:0042004F E8E6FEFFFF call 0041FF3A
:00420054 8D4584 lea eax, dword ptr [ebp-7C]
:00420057 50 push eax
:00420058 E825F5FFFF call 0041F582
:0042005D 0FB706 movzx eax, word ptr [esi]
:00420060 8D5E02 lea ebx, dword ptr [esi+02]
:00420063 50 push eax
:00420064 8D4584 lea eax, dword ptr [ebp-7C]
:00420067 53 push ebx
:00420068 50 push eax
:00420069 E83CF5FFFF call 0041F5AA
:0042006E 8D4584 lea eax, dword ptr [ebp-7C]
:00420071 50 push eax
:00420072 8D45DC lea eax, dword ptr [ebp-24]
:00420075 50 push eax
:00420076 E8CDF5FFFF call 0041F648
:0042007B 83C440 add esp, 00000040
:0042007E 6A32 push 00000032
:00420080 6A00 push 00000000
:00420082 53 push ebx
:00420083 E898270000 call 00422820
:00420088 83C40C add esp, 0000000C
:0042008B 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004200B1(C)
|
:0042008D 0FB7F3 movzx esi, bx
:00420090 8BC6 mov eax, esi
:00420092 D1E8 shr eax, 1
:00420094 8A0438 mov al, byte ptr [eax+edi]
:00420097 50 push eax
:00420098 E834FFFFFF call 0041FFD1
:0042009D 59 pop ecx
:0042009E 8A4C35DC mov cl, byte ptr [ebp+esi-24]
:004200A2 83E10F and ecx, 0000000F
:004200A5 38440DEC cmp byte ptr [ebp+ecx-14], al ***
:004200A9 7510 jne 004200BB
:004200AB 43 inc ebx
:004200AC 43 inc ebx
:004200AD 6683FB10 cmp bx, 0010
:004200B1 72DA jb 0042008D
:004200B3 6A01 push 00000001
:004200B5 58 pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004200BD(U)
|
:004200B6 5F pop edi
:004200B7 5E pop esi
:004200B8 5B pop ebx
:004200B9 C9 leave
:004200BA C3 ret
进入这里后你将发现这里将是比较的关键地方，你可以看到***不断同你输入的注册码进行比较，在这里你就可以得到你的注册码前8位的值，这样就可以得到注册码了。但是象你这样输入的注册码程序提示是以前的注册码，那么如何再分析呢？这个就是一个经验了，因为在以前破解那个snagit时也遇到过这样的问题，如何解决呢？就是程序将在下面将使用得到这样的结论，如下：
:0040F7E3 6A02 push 00000002
:0040F7E5 57 push edi 第13，14位值（如：23）
:0040F7E6 E886070100 call 0041FF71 /*/*/*/*/*
:0040F7EB 59 pop ecx
:0040F7EC 83F841 cmp eax, 00000041 eax=23
:0040F7EF 59 pop ecx
:0040F7F0 7304 jnb 0040F7F6
:0040F7F2 33C0 xor eax, eax
:0040F7F4 EB03 jmp 0040F7F9
这里是程序从上面的call下来后，到达这里，这个edi经分析是第13，14位值，并且在下面使用这两个值同41比较，如果你输入的注册码中第13，14位值合并后小于这个41的话，程序就认为是以前的版本，所以在这里只要先将第13位设大于4的数就可以了。
现在设RN：01234567FFFFFFFFFF
再进行上面的那个验证过程，就可以得到下面的注册码了。

*****************************
* RN：E20C37EBFFFFFFFFFF *
*****************************


Dynamic Mail Pro 3.0

 标 题:Dynamic Mail Pro 3.0 破解手记 (1千字)
发信人:孙锋
时 间:2000-12-26 23:45:31
详细信息:
Dynamic Mail Pro 3.0 破解手记
时间：2000年12月23 日下午18：30-18：33
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net

刚刚去番外地发表了关于MiniPad 2000 1.5 的破解，又顺手把番外地提供的Dynamic Mail Pro 3.0
下载来了。同时还有一个破解文件，毕竟那不是自己的，所以还是自己来算自己的注册码吧。
在我的机器上得到的信息是Series No:DMP20-47-32563,还是用我的TRW2000老弟来工作吧。

步骤：
1、启动Dynamic Mail Pro 3.0，进行注册，输入信息为：
Series No: DMP20-47-32563
Regiester Code: 1212121212
Register Name: sunfeng
Organisation: siling
2、启动TRW2000，OK载入内存。
3、Ctrl+N呼出TRW2000，bpx hmemcpy中断，F5返回程序，Register。
4、TRW2000拦截后，BD *中断所有中断，F12共计16次（因为17次提示注册错误）。
5、然后F10多次到下面的位置：
0167: 0045F0D0 CALL NEAR [EDX+A0]
6、F8进入到CALL中，再F10多次到下面的位置：
0167:0045F192 MOV EDX,EAX ;------------------------D EAX得到注册码：DP-1993-487398
7、整理：
Series No: DMP20-47-32563
Regiester Code: DP-1993-487398
Register Name: sunfeng
Organisation: siling
8、需要值得指出的是，在您的机器上的1067：将与我的机器不同。

<-------完-------->


Dynamic Opt-In Emailer 2.020

 标 题:Dynamic Opt-In Emailer 2.020 破解手记 (1千字)
发信人:孙锋
时 间:2000-12-26 23:44:54
详细信息:
Dynamic Opt-In Emailer 2.020 破解手记
时间：2000年12月23日晚上21：00-21：07
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net

跟刚才破解的Dynamic Mail Pro 3.0是同一个公司的产品，破解过程相似，在我的机器
上得到的信息是Series No:DOE-2691998682。
还是用我的TRW2000。

步骤：
1、启动Dynamic Opt-In Emailer 2.020，进行注册，输入信息为：
Series No: DOE-2691998682
Regiester Code: 1212121212
Register Name: sunfeng
Organisation: siling
2、启动TRW2000，OK载入内存。
3、Ctrl+N呼出TRW2000，bpx hmemcpy中断，F5返回程序，Register。
4、TRW2000拦截后，BD *中断所有中断，F12共计16次（因为17次提示注册错误）。
5、然后F10,22次到下面的位置：
0167: 0043392A CALL NEAR [EDX+A0]
6、F8进入到CALL中，再F10,42次到下面的位置：
0167:00433A1C MOV EDX,EAX ;------------------------D EAX得到注册码：DOE-2086321119
7、整理：
Register Name: sunfeng
Organisation: siling
Series No: DOE-2691998682
Regiester Code: DOE-2086321119

8、需要值得指出的是，在您的机器上的1067：将与我的机器不同。

<-------完-------->


Dynamic Web Ranking

 标 题:Dynamic Web Ranking破解手记 (1千字)
发信人:孙锋
时 间:2000-12-26 23:44:18
详细信息:
Dynamic Web Ranking破解手记
时间：2000年12月25日凌晨
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
今天晚上下载了这个公司软件产品的全部系列，已经完工的是Dynamic Mail Pro3.0,Dynamic Opt-In
Emailer 2.020,Dynamic Web Wizard,现在破解这个软件.同样的，注册的时候软件会让你连接主页后判断是
否在其数据库中存在这个注册号，否则提示注册号框为Cancelled。还是老方法-----就是直接去注册
表注册，利用得到的注册号去注册，就可以看到注册人和注册公司的名称了，不知道是怎么回事，我
用了两个用户名和公司名得到的注册码都是：DWR-4319109554
先写下破解过程吧。

工具：TRW2000 1.22注册版

步骤：
1、启动Dynamic Web Rnaking，进行注册，输入信息为：
Series No: DWR-4582027614
Regiester Code: 1212121212
Register Name: sunfeng
Organisation: siling
2、启动TRW2000，OK载入内存。
3、Ctrl+N呼出TRW2000，bpx hmemcpy中断，F5返回程序，Register。
4、TRW2000拦截后，BD *中断所有中断，F12共计16次，然后F10到下面的位置：
0167:0048C085 CALL NEAR [ECX+A0] ;-------------->F8跟踪进入
5、F8进入CALL领域，F10多次后到下面的位置：
0167:0048C17B PUSH EAX ;
0167:0048C17C CALL 004661B0
0167:0048C181 MOV EDX,EAX ;------>D EAX-->正确的注册码：DWR-4319109554
6、X退出TRW2000，整理：
Series No: DWR-4582027614
Regiester Code: DWR-4319109554
Register Name: sunfeng
Organisation: siling
7、奇怪的是我用“孙锋”和“新领网”做用户名和公司名时，得到的注册码也是这个。
8、在注册时，它要连接作者主页，如果作者没有给你入库，则无法正常注册，所以就只好找
别的办法了----修改注册表。
在注册表的位置和做成的注册机文件（与用户名和公司名无关）内容是：
REGEDIT4
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Dynamic Web Ranking\Register]
"Organisation"="新领网"
"RegisterCode"="DWR-4319109554"
"Series No"="DWR-4582027614"
"UserName"="孙锋"

<----------完----------->


Dynamic Web Wizard

 标 题:Dynamic Web Wizard破解手记 (1千字)
发信人:孙锋
时 间:2000-12-26 23:43:43
详细信息:
Dynamic Web Wizard破解手记
时间：2000年12月24日凌晨
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
今天晚上下载了这个公司软件产品的全部系列，已经完工的是Dynamic Mail Pro3.0,Dynamic Opt-In Emailer 2.020,现在破解这个软件。
在注册的时候软件会让你连接主页后判断是否在其数据库中存在这个注册号，
否则提示注册号框为Cancelled。我找到一个方法，就是直接去注册表注册，
利用得到的注册号去注册，就可以看到注册人和注册公司的名称了，不知道是
怎么回事，我用了两个用户名和公司名得到的注册码都是：DWW-8503182901
不明白怎么回事，是不是我机器有问题了。不管了，先写下破解过程吧。

工具：TRW2000 1.22注册版

步骤：
1、启动Dynamic Web Wizard，进行注册，输入信息为：
Series No: DWW-3964565456
Regiester Code: 1212121212
Register Name: sunfeng
Organisation: siling
2、启动TRW2000，OK载入内存。
3、Ctrl+N呼出TRW2000，bpx hmemcpy中断，F5返回程序，Register。
4、TRW2000拦截后，BD *中断所有中断，F12共计16次，然后F10到下面的位置：
0167:004372B9 PUSH EDX
0167:004372BA CALL NEAR [ECX+A0] ;-------------->F8跟踪进入
5、F8进入CALL领域，F10多次后到下面的位置：
0167:00437309 PUSH ECX ;
0167:0043730A CALL 00426D80
0167:0043730F MOV EDX,EAX ;------>D EAX-->正确的注册码：DWW-8503182901
6、X退出TRW2000，整理：
Series No: DWW-3964565456
Regiester Code: DWW-8503182901
Register Name: sunfeng
Organisation: siling
7、奇怪的是我用“孙锋”和“新领网”做用户名和公司名时，得到的注册码也是这个。
8、在注册时，它要连接作者主页，如果作者没有给你入库，则无法正常注册，所以就只好找
别的办法了----修改注册表。
在注册表的位置和做成的注册机文件（与用户名和公司名无关）内容是：
REGEDIT4
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Dynamic Web Wizard\Register]
"Organisation"="新领网"
"RegisterCode"="DWW-8503182901"
"Series No"="DWW-3964565456"
"UserName"="孙锋"

<---------完----------->


E-ditor 2

标 题:E电子图书制作软件E-ditor 2破解手记暨回复灰松鼠朋友的来信 (2千字)
发信人:孙锋
时 间:2000-12-28 1:09:19
详细信息:
E电子图书制作软件E-ditor 2破解手记暨回复灰松鼠朋友的来信
时间：2000年12月28日凌晨
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
http://phy.qfnu.edu.cn/personal/~sffs/index.htm
今天收到了“灰松鼠”朋友的来信，问我如何使用TRW2000解密，说实在的，我
学习解密也不过是1个多月的时间，开始的时候是兴趣，学习了看雪、RUFENG等等大侠
的破解教学，自己也常拿软件来练习，可是很少成功，现在也许开始入门了，又有朋友
来问我，我真不知道该怎么回复大家。我想以后我会写一些我学习的经历（入门）教程
的，希望大家可以对我加以指导和理解。谢谢大家了。
现在我就“灰松鼠”说的E-ditor 2软件来进行破解，希望可以说明白。这个软件
其实很容易就得到了注册码，我用了不到一分钟的时间。首先要明白的是软件在什么地
方判断注册码的正确与否，一般是有CMP语句、TEST语句、CALL语句和JMP，JE，JNE等等
来做的，在破解的时候一定注意在程序CALL比较和JMP跳转之前的PUSH 语句，往往这里就
是正确注册码的存放地点，有时不是，而是我们输入的错误的信息，这时就应该跟进去了。
一般的应该跟进去的地方，都有个CALL语句进跟一个TEST和JMP等语句，这是判断是否跟
进的依据（这也并不是唯一的），有时候程序加壳了，还需要先脱壳，然后、再跟踪进去。
再说一下，我说的万能中断最好别用F9，因为F9是对当前光标的语句执行，并不是万能中
断，大家可以用bpx hmemcpy语句来实现万能中断的功能。再一点就是判断F12按键次数的
方法是：先一直按，记录直到出现错误提示的次数，正确的方法是记录次数减去1，如下面
的例子，是15-1=14。

工具：
TRW2000

步骤：

1、启动E-ditor 2，选择注册项，随便输入注册信息。我输入的是：
UserName : sunfeng
RegisterCode: 121212121212
2、启动TRW2000，OK载入内存。
3、Ctrl+N呼叫出TRW2000，bpx hmemcpy万能中断，F5返回E-ditor 2程序领域。
4、点击Register，被TRW2000拦截到。
5、按F12共计14次（因为15次时出现注册错误对话框），然后开始按F10。
6、一直按F10到下面位置：（也就是4-5次）
0167:0049106D PUSH EAX ;------------->D EAX就得到正确注册码了。
;------------->4FF2091B2E3EC559
0167:0049106E LEA EDX,[EBP-10]
7、整理注册。
8、其他注册码：

User Name-------------------RegisterCode

孙锋-----------------------4F4B7A7E2A
灰松鼠---------------------4F5B6F770E95C0
番外地---------------------4F57455F0D8F21
我们没有钱所以我们用盗版---4F4E60687E0E8000910A8C6D577A0E902CA223A2278F65233A
9、完成任务。

<-----------完---------------->


Easy Applet Builder 1.5

 标 题:Easy Applet Builder破解（入门级） (5千字)
发信人:2000yeah
时 间:2000-10-1 0:23:52
详细信息:
软件名称：Easy Applet Builder破解（入门级）

版本号码：1.5

文件大小：1.57 MB

发布日期：2000-09-30

购买信息：共享软件

操作平台：Windows 95/98/Me/NT

相关主页链接：http://www.taijisoftware.com/

新手可以拿来练习一下

Easy Applet Builder能够帮助你轻松创建38种Java applet，它们能够使你的主页变得更为专业。

这些全部可以定制（字体、颜色等）applet被分为五个分类：图像（淡入/淡出、星状闪烁、放大/缩小等）、
文字（日期、滚动、波浪等）、航行（登录、菜单、链接等）、游戏（LightOn、Puzzle、TicTacToe）、工具
（留言本、IP查找器等）。最新版本增加了一个新的applet，并对帮助和教程进行了增强。

工具：W32dsm

此软件有两个固定的注册码

:00470A34 55 push ebp
:00470A35 8BEC mov ebp, esp
:00470A37 6A00 push 00000000
:00470A39 53 push ebx
:00470A3A 56 push esi
:00470A3B 8BD8 mov ebx, eax
:00470A3D 33C0 xor eax, eax
:00470A3F 55 push ebp
:00470A40 68280B4700 push 00470B28
:00470A45 64FF30 push dword ptr fs:[eax]
:00470A48 648920 mov dword ptr fs:[eax], esp
:00470A4B 8D55FC lea edx, dword ptr [ebp-04]
:00470A4E 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00470A54 E85312FCFF call 00431CAC
:00470A59 8B45FC mov eax, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"789654123" －－－－－－－－－－－－“注册码1”
|
:00470A5C BA3C0B4700 mov edx, 00470B3C
:00470A61 E8E633F9FF call 00403E4C
:00470A66 741D je 00470A85
:00470A68 8D55FC lea edx, dword ptr [ebp-04]
:00470A6B 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00470A71 E83612FCFF call 00431CAC
:00470A76 8B45FC mov eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"987456321" －－－－－－－－－－－－－“注册码2”
|
:00470A79 BA500B4700 mov edx, 00470B50
:00470A7E E8C933F9FF call 00403E4C
:00470A83 7578 jne 00470AFD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00470A66(C)
|
:00470A85 B201 mov dl, 01
:00470A87 A17C534500 mov eax, dword ptr [0045537C]
:00470A8C E82B4AFEFF call 004554BC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00470A2A(C)
|
:00470A91 8BF0 mov esi, eax
:00470A93 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\taijisoftware\EasyAppletBuilder"
|
:00470A95 BA640B4700 mov edx, 00470B64
:00470A9A 8BC6 mov eax, esi
:00470A9C E8174BFEFF call 004555B8
:00470AA1 84C0 test al, al
:00470AA3 741D je 00470AC2 －－－－－－－－－－－－－“相等就跳”
:00470AA5 8D55FC lea edx, dword ptr [ebp-04]
:00470AA8 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00470AAE E8F911FCFF call 00431CAC
:00470AB3 8B4DFC mov ecx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"regcode"
|
:00470AB6 BA980B4700 mov edx, 00470B98
:00470ABB 8BC6 mov eax, esi
:00470ABD E8924CFEFF call 00455754

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00470AA3(C)
|
:00470AC2 6A00 push 00000000
:00470AC4 668B0DA00B4700 mov cx, word ptr [00470BA0]
:00470ACB B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thank you ! Restart application "
->"to validate the registration"
|
:00470ACD B8AC0B4700 mov eax, 00470BAC
:00470AD2 E8C935FEFF call 004540A0
:00470AD7 A1EC834900 mov eax, dword ptr [004983EC]
:00470ADC 8B00 mov eax, dword ptr [eax]
:00470ADE C6809011000001 mov byte ptr [eax+00001190], 01
:00470AE5 A1CC984900 mov eax, dword ptr [004998CC]
:00470AEA E811A3FDFF call 0044AE00
:00470AEF A1EC834900 mov eax, dword ptr [004983EC]
:00470AF4 8B00 mov eax, dword ptr [eax]
:00470AF6 E8E9DD0000 call 0047E8E4
:00470AFB EB15 jmp 00470B12

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00470A83(C)
|
:00470AFD 6A00 push 00000000
:00470AFF 668B0DA00B4700 mov cx, word ptr [00470BA0]
:00470B06 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"invalid registration code !"
|
:00470B08 B8F40B4700 mov eax, 00470BF4
:00470B0D E88E35FEFF call 004540A0

－－初学破解，错误难免，请各位大侠指点，谢谢。－－－2000.10.1－2000yeah－－－

注册码：

789654123

987456321


Easy CD 2.0

 标 题:我又成功了！破Easy CD 2.0成功！ (373字)
发信人:quboo
时 间:2000-9-14 21:06:33
详细信息:
我又成功了！破Easy CD 2.0成功！
User:quboo cracked
Code:AECDC83BC4
我试一试写写教程。
先填User:quboo cracked Code:12121212然后bpx hmemcpy.中断后用F12跑呀跑。
出现错误信息。记下它在SoftIce中的位置，然后再来一次。这次在错误信息的
上面发现
0137:0047CCFE CALL 00403F84 //紧挨下面是
xxxx:xxxxxxxx JNZ 0047CD75 //很可疑，压F8进入上面的CALL
进入后打d EAX或d EDX就看见啦！


Easy CD-DA Extractor V4.3.2

 标 题:注册 Easy CD-DA Extractor V4.3.2 (23千字)
发信人:6767[BCG]
时 间:2001-5-27 13:20:10
详细信息:
Easy CD-DA Extractor V4.3.2
by 6767 [BCG]

工具：SoftIce, Wd32asm(写过程)，UPX(用于解压缩)
用途：音乐CD的数据库及操作管理
地址：http://xt.onlinedown.net/down/ezcddax432.exe (4M多)
保护：20次使用限制；输入的注册信息不正确则UNLOCK不激活。

本想FOOL这个东东，没想到被FOOL了。安装后，运行，出现一个NAG，告诉你还可以用19次，上面还有KEY、KEY1，但随便输入信息，UNLOCK按纽不被激活，有一点麻烦。退出，观察注册表 -- [HKEY_CURRENT_USER\Software\Poikosoft\Easy CD-DA Extractor 4.3]，好象没有记录使用次数的。那么就有可能是在文件中，是不是在它的目录下呢？按日期排序，列在最前面的有一个 Lame.dll(很有意思的名字)。再运行一次，回来看看，果然是它。将它备份，运行一次再履盖回来会不会有帮助呢？结果一试之下，好嘛，直接就告诉你使用次数用完!(也省得点20次NAG和退出了)。让我们开始吧 ^_^

运行，在KEY中输入：6767 [BCG]，KEY1：JA88EUGPA。^D到SI，下Bpx hmemcpy(越来越喜欢这个万能中断)，F5返回，在KEY1中再输入一个‘A’，立刻被拦到。按一次F5，再下 Bd *阻断。由于不是TRW，需要几次F12返回程序领空，你会返回到下面的程序段中：

* Referenced by a CALL at Addresses:
|:004630D9 , :004631E9
|
:00463210 55 push ebp
:00463211 8BEC mov ebp, esp
:00463213 83C4C8 add esp, FFFFFFC8
:00463216 53 push ebx
:00463217 8BD8 mov ebx, eax
:00463219 B898F35600 mov eax, 0056F398
:0046321E E86D840C00 call 0052B690
:00463223 66C745D81400 mov [ebp-28], 0014
:00463229 33D2 xor edx, edx
:0046322B 8955F0 mov dword ptr [ebp-10], edx
:0046322E 8D55F0 lea edx, dword ptr [ebp-10]
:00463231 FF45E4 inc [ebp-1C]
:00463234 8B83EC020000 mov eax, dword ptr [ebx+000002EC]
:0046323A E8FDC90700 call 004DFC3C
:0046323F 8D45F0 lea eax, dword ptr [ebp-10] <- 返回到这里，F10向下追踪
:00463242 33D2 xor edx, edx
:00463244 8955FC mov dword ptr [ebp-04], edx
:00463247 8D55FC lea edx, dword ptr [ebp-04]
:0046324A FF45E4 inc [ebp-1C]
:0046324D E8CAAC0E00 call 0054DF1C
:00463252 FF4DE4 dec [ebp-1C]
:00463255 8D45F0 lea eax, dword ptr [ebp-10]
:00463258 BA02000000 mov edx, 00000002
:0046325D E8CAA90E00 call 0054DC2C
:00463262 66C745D80800 mov [ebp-28], 0008
:00463268 66C745D82000 mov [ebp-28], 0020
:0046326E 33C0 xor eax, eax
:00463270 8945EC mov dword ptr [ebp-14], eax
:00463273 8D55EC lea edx, dword ptr [ebp-14]
:00463276 FF45E4 inc [ebp-1C]
:00463279 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:0046327F E8B8C90700 call 004DFC3C
:00463284 8D45EC lea eax, dword ptr [ebp-14]
:00463287 33D2 xor edx, edx
:00463289 8955F8 mov dword ptr [ebp-08], edx
:0046328C 8D55F8 lea edx, dword ptr [ebp-08]
:0046328F FF45E4 inc [ebp-1C]
:00463292 E885AC0E00 call 0054DF1C
:00463297 FF4DE4 dec [ebp-1C]
:0046329A 8D45EC lea eax, dword ptr [ebp-14]
:0046329D BA02000000 mov edx, 00000002
:004632A2 E885A90E00 call 0054DC2C
:004632A7 66C745D80800 mov [ebp-28], 0008
:004632AD 66C745D82C00 mov [ebp-28], 002C
:004632B3 8B45FC mov eax, dword ptr [ebp-04] <- 名字在[Eax]
:004632B6 85C0 test eax, eax
:004632B8 7405 je 004632BF <- BadGuy
:004632BA 8B4DFC mov ecx, dword ptr [ebp-04]
:004632BD EB05 jmp 004632C4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004632B8(C)
|
:004632BF B976EC5600 mov ecx, 0056EC76 <- 这里放的是‘0x00’

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004632BD(U)
|
:004632C4 51 push ecx
:004632C5 8B45F8 mov eax, dword ptr [ebp-08] <- 输入的注册码(Irc)到Eax
:004632C8 85C0 test eax, eax
:004632CA 7405 je 004632D1 <- BadGuy
:004632CC 8B55F8 mov edx, dword ptr [ebp-08]
:004632CF EB05 jmp 004632D6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004632CA(C)
|
:004632D1 BA76EC5600 mov edx, 0056EC76

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004632CF(U)
|
:004632D6 52 push edx
:004632D7 E818040000 call 004636F4 <- !!! 计算注册码(Rc)的核心 !!!
:004632DC 83C408 add esp, 00000008
:004632DF 8BD0 mov edx, eax
:004632E1 8D45F4 lea eax, dword ptr [ebp-0C]
:004632E4 E89FA70E00 call 0054DA88 <- 将Rc复制到[ebp-0c]
:004632E9 FF45E4 inc [ebp-1C]
:004632EC 8D55F8 lea edx, dword ptr [ebp-08] <- Irc
:004632EF 66C745D80800 mov [ebp-28], 0008 <- 被这个0008骗的好惨，正确的Rc是10个字符!
:004632F5 8D45F4 lea eax, dword ptr [ebp-0C] <- Rc
:004632F8 E813AA0E00 call 0054DD10 <- 真假码比较!!
:004632FD 84C0 test al, al <- 出口 al=0 则比较失败
:004632FF 7440 je 00463341
:00463301 B001 mov al, 01 <- 准备激活UNNLOCK按纽
:00463303 BA02000000 mov edx, 00000002
:00463308 50 push eax
:00463309 8D45F4 lea eax, dword ptr [ebp-0C]
:0046330C FF4DE4 dec [ebp-1C]
:0046330F E818A90E00 call 0054DC2C

?......... <- 不重要，省略。

:00463383 C3 ret

*****************************************
这里是对核心CALL的分析：
*****************************************

* Referenced by a CALL at Addresses:
|:00429AB5 , :0044F9BF , :004632D7
|
:004636F4 55 push ebp
:004636F5 8BEC mov ebp, esp
:004636F7 8B4508 mov eax, dword ptr [ebp+08] <- Irc放入Eax
:004636FA 8A5008 mov dl, byte ptr [eax+08] <- 第9个
:004636FD 8A4009 mov al, byte ptr [eax+09] <- 第10个
:00463700 80F2AA xor dl, AA <- 0xAA 是魔术字
:00463703 34AA xor al, AA
:00463705 0FBEC8 movsx ecx, al
:00463708 0FBED2 movsx edx, dl
:0046370B 8BC1 mov eax, ecx
:0046370D 50 push eax <- **
:0046370E 52 push edx <- **
:0046370F 8B450C mov eax, dword ptr [ebp+0C]
:00463712 50 push eax
:00463713 E878FDFFFF call 00463490 <- 跟踪追击!
:00463718 83C40C add esp, 0000000C
:0046371B B850525900 mov eax, 00595250
:00463720 5D pop ebp
:00463721 C3 ret

它的注册算法有点变态：

* Referenced by a CALL at Address:
|:00463713
|
:00463490 55 push ebp
:00463491 8BEC mov ebp, esp
:00463493 83C4E8 add esp, FFFFFFE8
:00463496 53 push ebx
:00463497 56 push esi
:00463498 57 push edi
:00463499 8B5D08 mov ebx, dword ptr [ebp+08]
:0046349C 53 push ebx
:0046349D E87E7E0C00 call 0052B320 <- 里面转半天，只是为取名字长度到 Eax
:004634A2 59 pop ecx
:004634A3 83F87F cmp eax, 0000007F <- 是否大于 7F
:004634A6 7604 jbe 004634AC
:004634A8 C6437F00 mov [ebx+7F], 00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004634A6(C)
|
:004634AC 33C0 xor eax, eax
:004634AE 8BFB mov edi, ebx
:004634B0 83C9FF or ecx, FFFFFFFF
:004634B3 BE5B525900 mov esi, 0059525B <-
:004634B8 F2 repnz
:004634B9 AE scasb
:004634BA F7D1 not ecx
:004634BC 2BF9 sub edi, ecx
:004634BE 8BD1 mov edx, ecx
:004634C0 87F7 xchg edi, esi <-
:004634C2 C1E902 shr ecx, 02
:004634C5 8BC7 mov eax, edi
:004634C7 F3 repz
:004634C8 A5 movsd <-
:004634C9 8BCA mov ecx, edx
:004634CB 83E103 and ecx, 00000003
:004634CE F3 repz
:004634CF A4 movsb <- 将名字移到 0059525B
:004634D0 685B525900 push 0059525B
:004634D5 E892EB0C00 call 0053206C <- 验证，作无用功
:004634DA 59 pop ecx
:004634DB 685B525900 push 0059525B
:004634E0 E83B7E0C00 call 0052B320 <- 取名字长到 Eax
:004634E5 59 pop ecx

****************** 这里开始初始化 ***************

:004634E6 8945FC mov dword ptr [ebp-04], eax
:004634E9 33FF xor edi, edi
:004634EB 33C0 xor eax, eax
:004634ED 8945F8 mov dword ptr [ebp-08], eax
:004634F0 33D2 xor edx, edx
:004634F2 8955F4 mov dword ptr [ebp-0C], edx
:004634F5 33C9 xor ecx, ecx
:004634F7 894DF0 mov dword ptr [ebp-10], ecx
:004634FA 8B5D0C mov ebx, dword ptr [ebp+0C] <-
:004634FD 8B7510 mov esi, dword ptr [ebp+10] <- 见调用前的两次入栈 **
:00463500 33C0 xor eax, eax
:00463502 8945EC mov dword ptr [ebp-14], eax
:00463505 C745E85B525900 mov [ebp-18], 0059525B
:0046350C 8B55EC mov edx, dword ptr [ebp-14]
:0046350F 8B4DFC mov ecx, dword ptr [ebp-04]
:00463512 3BD1 cmp edx, ecx <- 是否处理完名字，搞不懂
:00463514 0F8D15010000 jnl 0046362F

**************** 一个大循环生成中间注册码 ******************

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463629(C)
|
:0046351A 8B45E8 mov eax, dword ptr [ebp-18]
:0046351D 8A10 mov dl, byte ptr [eax] <- 顺次取名字中字符
:0046351F 52 push edx
:00463520 E8CBFEFFFF call 004633F0 <- 结果到 Eax，保证谁都认不出

>>>>>>>>>>>>>>>>>

* Referenced by a CALL at Address:
|:00463520
|
:004633F0 55 push ebp
:004633F1 8BEC mov ebp, esp
:004633F3 53 push ebx
:004633F4 33C0 xor eax, eax
:004633F6 8B4D08 mov ecx, dword ptr [ebp+08] <- 名字
:004633F9 BA94F65600 mov edx, 0056F694

******************************
[0056F694]处是一个码表，与 0xAA异或可还原(还会用到)：
******************************

FA 98 F0 9E FD 9C E6 9D - F9 E8 E9 F3 EF 9F ED E2
E0 E1 F8 FE 92 E7 E4 EC - EB F2 FF 99 EE 93

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046340C(C) <- 这个循环找 Bl 在码表中的位置|
:004633FE 8BD9 mov ebx, ecx
:00463400 80F3AA xor bl, AA
:00463403 3A1A cmp bl, byte ptr [edx]
:00463405 7407 je 0046340E
:00463407 40 inc eax
:00463408 42 inc edx
:00463409 83F81E cmp eax, 0000001E
:0046340C 7CF0 jl 004633FE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463405(C)
|
:0046340E 83F81E cmp eax, 0000001E
:00463411 7508 jne 0046341B
:00463413 B813000000 mov eax, 00000013 <- 找不到则 Eax=13
:00463418 5B pop ebx
:00463419 5D pop ebp
:0046341A C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463411(C)
|
:0046341B 0FBE9094F65600 movsx edx, byte ptr [eax+0056F694]
:00463422 8BC2 mov eax, edx
:00463424 8BC8 mov ecx, eax
:00463426 C1E104 shl ecx, 04
:00463429 03C8 add ecx, eax
:0046342B C1E106 shl ecx, 06
:0046342E 2BC8 sub ecx, eax
:00463430 C1E107 shl ecx, 07
:00463433 2BC8 sub ecx, eax
:00463435 C1E105 shl ecx, 05
:00463438 2BC8 sub ecx, eax
:0046343A 89C8 mov eax, ecx
:0046343C 05FB300000 add eax, 000030FB <- 结果在 Eax 中
:00463441 5B pop ebx
:00463442 5D pop ebp
:00463443 C3 ret

<<<<<<<<<<<<<<<<<<<<<<<<

看下面的运算，我说不明白，自己看吧：

:00463525 59 pop ecx
:00463526 0531270403 add eax, 03042731
:0046352B 35AABBAABB xor eax, BBAABBAA
:00463530 85FF test edi, edi
:00463532 750F jne 00463543
:00463534 8B7D0C mov edi, dword ptr [ebp+0C]
:00463537 0FAFF8 imul edi, eax
:0046353A 0FAFF8 imul edi, eax
:0046353D 0FAFF8 imul edi, eax
:00463540 0FAFF8 imul edi, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463532(C)
|
:00463543 8B55F8 mov edx, dword ptr [ebp-08]
:00463546 85D2 test edx, edx
:00463548 7518 jne 00463562
:0046354A 8B4D10 mov ecx, dword ptr [ebp+10]
:0046354D 0FAFC8 imul ecx, eax
:00463550 0FAFC8 imul ecx, eax
:00463553 0FAFC8 imul ecx, eax
:00463556 0FAFC8 imul ecx, eax
:00463559 0FAFC8 imul ecx, eax
:0046355C 0FAFC8 imul ecx, eax
:0046355F 894DF8 mov dword ptr [ebp-08], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463548(C)
|
:00463562 8B55F4 mov edx, dword ptr [ebp-0C]
:00463565 85D2 test edx, edx
:00463567 750C jne 00463575
:00463569 8B4D0C mov ecx, dword ptr [ebp+0C]
:0046356C 0FAFC8 imul ecx, eax
:0046356F 0FAFC8 imul ecx, eax
:00463572 894DF4 mov dword ptr [ebp-0C], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463567(C)
|
:00463575 8B55F0 mov edx, dword ptr [ebp-10]
:00463578 85D2 test edx, edx
:0046357A 7515 jne 00463591
:0046357C 8B4D10 mov ecx, dword ptr [ebp+10]
:0046357F 0FAFC8 imul ecx, eax
:00463582 0FAFC8 imul ecx, eax
:00463585 0FAFC8 imul ecx, eax
:00463588 0FAFC8 imul ecx, eax
:0046358B 0FAFC8 imul ecx, eax
:0046358E 894DF0 mov dword ptr [ebp-10], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046357A(C)
|
:00463591 85C0 test eax, eax
:00463593 7505 jne 0046359A
:00463595 05CC0C0000 add eax, 00000CCC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00463593(C)
|
:0046359A 8BD0 mov edx, eax
:0046359C 8B4DF0 mov ecx, dword ptr [ebp-10]
:0046359F 0FAFD7 imul edx, edi
:004635A2 03D1 add edx, ecx
:004635A4 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004635A7 33D3 xor edx, ebx
:004635A9 03D2 add edx, edx
:004635AB 03D3 add edx, ebx
:004635AD 8BFA mov edi, edx
:004635AF 8BD0 mov edx, eax
:004635B1 0FAF55F8 imul edx, dword ptr [ebp-08]
:004635B5 03D1 add edx


EASY MP3 2.2

 标 题:《EASY MP3 2.2》的注册码破解 高手莫入！ (2千字)
发信人:ratarice
时 间:2001-5-5 21:46:57
详细信息:
《EASY MP3 2.2》的注册码破解
作者：RATARICE
目标：EASY MP3 2.2
这是一个用来将WAV档案转换成MP3或者将MP3档案转成WAV的小程序。支援长档名，且可以设定当档案转 完後自动删除，节省硬盘的空间。对于喜欢转MP3档案的人是个相当方便的工具。
工具：TRW2000 1.22
过程：运行TRW。
再运行EASY MP3，SYSTEM---->ABOUT。
填上name:RATARICE
sn:87654321 （瞎填的）
ctrl+N（呼出TRW） , 下bpx hmemcpy , ctrl+N（返回程序）
确认。
被拦。下bd * , pmodule , 按7次（大概是，第8次出错）。
代码如下：（从下往上看）

:0043D6E4 8B45F8 mov eax, dword ptr [ebp-08]
:0043D6E7 E85893FCFF call 00406A44
:0043D6EC 69C0F1000000 imul eax, 000000F1
:0043D6F2 8D55F8 lea edx, dword ptr [ebp-08]
:0043D6F5 E81A93FCFF call 00406A14
:0043D6FA 8B45F8 mov eax, dword ptr [ebp-08]
:0043D6FD 50 push eax --------------------------->打d eax 就是你的注册码了。
:0043D6FE 8D55FC lea edx, dword ptr [ebp-04]
:0043D701 8B83E8010000 mov eax, dword ptr [ebx+000001E8]
:0043D707 E8BCE2FDFF call 0041B9C8
:0043D70C 8B55FC mov edx, dword ptr [ebp-04]
:0043D70F 58 pop eax ---------------------------->可疑，向上看看。
:0043D710 E8C363FCFF call 00403AD8
:0043D715 0F8522010000 jne 0043D83D ----------------------->关键跳转，向上找。
:0043D71B 6A00 push 00000000
:0043D71D 668B0D48D94300 mov cx, word ptr [0043D948]
:0043D724 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thank you for registering Easy "
->"MP3!"
|
:0043D726 B854D94300 mov eax, 0043D954
:0043D72B E8A48AFFFF call 004361D4
.
.
.

.
.
.
:0043D833 E8C4B9FEFF call 004291FC
:0043D838 E9DA000000 jmp 0043D917

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043D715(C)
|
:0043D83D 6A00 push 00000000
:0043D83F 668B0D48D94300 mov cx, word ptr [0043D948]
:0043D846 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Bad luck, feel free to try again."
|
:0043D848 B8B0D94300 mov eax, 0043D9B0
:0043D84D E88289FFFF call 004361D4
:0043D852 A15C8B4400 mov eax, dword ptr [00448B5C]
:0043D857 8B00 mov eax, dword ptr [eax]
:0043D859 8B80DC010000 mov eax, dword ptr [eax+000001DC]
:0043D85F 8B10 mov edx, dword ptr [eax]
至此，软件告破。
整理以下：
name:RATARICE
sn:253502357


EasyASP 4.0

 标 题:EasyASP 4.0破解手记 (2千字)
发信人:孙锋
时 间:2000-12-26 23:43:05
详细信息:
EasyASP 4.0破解手记（2000年12月18日凌晨4：23--4：28）

作者：孙 锋 sffs@263.net(曲阜师范大学电教系97级142#)
新领网：http://djx.qfnu.edu.cn/djx/sffs/index.htm

已经是深夜4点多了，刚刚用了2个多小时下载了Dreamweaver Ultra Dev 4.0(29.8M)，顺便下载了几个其他程序，其中就有个ASP程序的设计软件，（身体也够大的，5M多，没办法，下载就是了），结果下载以后看到是没有注册的版本，所以就自己来算自己的注册号了。
这个软件的设计者也真“缺德”，本来我想用自己的中文名字“孙锋”来注册，可是，他不给我注册(在破解的过程中无法得到注册号)，没办法，只好用英文名字了(嘿嘿，其实也只是汉语拼音)，在破解过程中，我修改了几个Company名发现，注册算法程序对Company并不要求，只是根据输入的Name来计算，这是比较好搞定的。好了还是用我自己的老方法了-------用TRW2000跟踪拦截注册。

1、启动TRW2000
2、输入任意的注册姓名、公司名和注册号。(注意姓名不能是中文名字)
我在这里输入的是：
Name: sunfeng
Company: sinling
Registeration Code: 121212
3、Ctrl+N呼叫出TRW2000。
4、bpx hmemcpy中断
5、F5返回程序领域，点击register。这时程序被TRW2000拦截。
6、bd * 中断所有中断
7、按F12共计16次。(为什么???因为如果我们按F12到17次时，程序会告诉注册错误，所以我们在拦截时只 要按16次F12就可以了。)
8、在TRW2000的窗口中按F10，直到下面的位置：

0167:006540EC CALL NEAR [EDX+A0]
0167:006540F2 FNCLEX
0167:006540F4 TEST EAX EAX

然后按F8进入CALL领域。
9、进入CALL领域后，按10几次F10到下面的位置：

0167:00654132 PUSH ECX ------->；下 D ECX得到注册码：C3VuZmVuZw
0167:00654133 PUSH EDX
0167:00654134 CALL EDI
10、X退出TRW2000领域，回到程序领域。退出TRW2000程序。
11、整理一下：

Name: sunfeng
Company: sinling
Registeration Code: c3VuZmVuZw

12、再用得到的注册码重新注册，就可以看到你注册成功的界面了。

闲着没事，再算几个自己的注册号，得到下面的结果：Company 任意

Name REgisteration Code

Sunfeng U3VuZmVuZw

Sun Feng U3VuIEZlbmc
13、注册程序对注册表的操作是：
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\EasyASP\General Options]

UserName: sunfeng
Company: sinling
Password: c3VuZmVuZw
14、做个自己的注册机吧：用文本编辑软件把下面的内容存为EsayASPreg.reg即可。

REGEDIT4

[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\EasyASP\General Options]
"UserName"="sunfeng"
"Company"="sinling"
"Password"="c3VuZmVuZw"

---完---
作者：孙 锋 sffs@263.net
新领网：http://djx.qfnu.edu.cn/djx/sffs/index.htm

斑竹：
您好，我是一名ASP爱好者，今天晚上从你的站上下载了一个软件
EasyASP4.0，发现他没有注册号码，所以就自己破解了一下，为了给广大的ASP
爱好者和使用本软件的网友们提供方便，特向您提供注册码，我也帮您破解了一
个注册码。
Name : webcn.net
Company: webcn.net
Registeration Code: d2ViY24ubmV0
您的朋友：孙 锋


Easymail3.102

 标 题:送你一个WIN2K下EASYMAIL3。102的破解教程 (1千字)
发信人:netcowboy
时 间:2001-5-26 18:01:56
详细信息:
软件名称：Easymail3.102
软件大小：1.12M
简 介：webmail邮件系统(25用户限制）
使用平台：WinNTsp6/win2k
下载网址：http://www.rockislands.com/downloadwem.html

作 者：netcowboy(以前叫jfxie)
级 别：初学者
个人主页: httP://goto169.126.com
破解工具：sice4.05 for nt ProcDump FI243

先用FI243进行测试，此程序用的是UPX加壳。
我用ProcDump给主程序EASYMAIl3.102进行了脱壳。
拿出SICE FOR NT（我感觉在NT下，SICE比9X下稳定，不像在9X在动不动就出错，但设断点比较麻烦）

填写注册码 ：12345678
下断点memcpy
F5，点确定，没栏住。
没有出错提示？其怪，难道我的注册码不对，再加长一点。填上下22222222222222222222。
有出错提示了，真让我猜对了！！但还是没拦住？以前都在9X下用TR2000，难道在NT下设的断点不对。（后来在论坛上看雪告诉我在NT下，MEMCPY基本什么都拦不住，这是后话），先拦住它这个出错框再说，下
BPX MESSAGEBOXEXA
F5，点确定，这回可拦住了。按F12，程序返回WINDOWS，按出错框确定。再次拦住。按F12来到EASYMAIL的上空，程序停在00404A0B，上面是出错框，004a05:call [user32!messageboxa],我向上找，到00482D处，有个JZ能跳到004A0B。上面则是一个比较。在它前面设个断点再说，
BPX 404802，按F5返回，再进行注册。点确定，这回程序被拦在404802，小心的按F10，到40486C，D ECX 出现注册码！足足32位。这下完工。如果要爆破，只要把后面的两个跳改为NOP即可。

我的几点疑惑,请论坛上的大脱哥们解答：

这个软件不能反汇编（反汇编后WASM死机），所以上代码比较少。这个软件是用网卡的IP地址算注册码。脱壳后，我对其进行了修改，我想它再压缩一下，因为它太大了。用UPX和ASPACK都不行，压完后不能执行。


EditorPro Suite 2.0

标 题:我现在总不认真，刚才输入有错误，现在更正，toye大哥把上边的删除了吧。 (10千字)
发信人:孙锋
时 间:2001-4-4 9:25:23
详细信息:
EditorPro Suite 2.0的简单破解--“W32DSM直接找注册码”

下载地址在 http://www.51soft.com/share/download.asp?url=http://dl2.51soft.com/system/wzcl/editpros.exe

本来这个软件我是用爆破的方法来破解的，当时我没注意到详细的信息，所以费了好大的劲，今天早上来了，打开机器看看昨天写的东西，突然发现下面的代码，呵呵，灵感来了，测试使用“EPS-#######506###”格式注册，我尝试输入"EPS-1234567506789",我KAO ，TNND，成功了！枉费了我那么多时间啊，下面是用w32dsm893反汇编出来的部分源代码。有兴趣的大家看看吧。

* Possible StringData Ref from Code Obj ->"?A"
|
:005ADB12 A1A8164100 mov eax, dword ptr [004116A8]
:005ADB17 E87C55E5FF call 00403098
:005ADB1C 8B55FC mov edx, dword ptr [ebp-04]
:005ADB1F 898278050000 mov dword ptr [edx+00000578], eax

* Possible StringData Ref from Code Obj ->"Software\D C AL CODA\EditorPro"
|
:005ADB25 B82CE35A00 mov eax, 005AE32C
:005ADB2A 8B55FC mov edx, dword ptr [ebp-04]
:005ADB2D 8B8A78050000 mov ecx, dword ptr [edx+00000578]

* Possible StringData Ref from Code Obj ->"Reopen"
|
:005ADB33 BA64E35A00 mov edx, 005AE364
:005ADB38 E8A7DBFFFF call 005AB6E4
:005ADB3D 8B45FC mov eax, dword ptr [ebp-04]
:005ADB40 C6807005000000 mov byte ptr [eax+00000570], 00
:005ADB47 8B45FC mov eax, dword ptr [ebp-04]
:005ADB4A C680F804000000 mov byte ptr [eax+000004F8], 00
:005ADB51 B91E000000 mov ecx, 0000001E

* Possible StringData Ref from Code Obj ->"3550"
|
:005ADB56 BA74E35A00 mov edx, 005AE374

* Possible StringData Ref from Code Obj ->"EPS-#######506###" //--->重点啊！！！格式符合，#任意！ ^^^^^^^^^^^^^^^^^
|
:005ADB5B B884E35A00 mov eax, 005AE384
:005ADB60 E84781FCFF call 00575CAC

* Possible StringData Ref from Code Obj ->"Software\D C AL CODA\TraySuite"
|
:005ADB65 B9A0E35A00 mov ecx, 005AE3A0
:005ADB6A B201 mov dl, 01
:005ADB6C A18C964500 mov eax, dword ptr [0045968C]
:005ADB71 E872C7EAFF call 0045A2E8
:005ADB76 8945EC mov dword ptr [ebp-14], eax
:005ADB79 6A00 push 00000000
:005ADB7B 8D45D8 lea eax, dword ptr [ebp-28]
:005ADB7E 50 push eax

* Possible StringData Ref from Code Obj ->"Options"
|
:005ADB7F BA54E35A00 mov edx, 005AE354

* Possible StringData Ref from Code Obj ->"EPSSerial"
|
:005ADB84 B9C8E35A00 mov ecx, 005AE3C8
:005ADB89 8B45EC mov eax, dword ptr [ebp-14]
:005ADB8C E8EBC7EAFF call 0045A37C
:005ADB91 8B55D8 mov edx, dword ptr [ebp-28]
:005ADB94 8B45FC mov eax, dword ptr [ebp-04]
:005ADB97 0564050000 add eax, 00000564
:005ADB9C E85F62E5FF call 00403E00
:005ADBA1 8B45EC mov eax, dword ptr [ebp-14]
:005ADBA4 E81F55E5FF call 004030C8
:005ADBA9 8B45FC mov eax, dword ptr [ebp-04]
:005ADBAC 8D8868050000 lea ecx, dword ptr [eax+00000568]
:005ADBB2 8B45FC mov eax, dword ptr [ebp-04]
:005ADBB5 8D906C050000 lea edx, dword ptr [eax+0000056C]
:005ADBBB 8B45FC mov eax, dword ptr [ebp-04]
:005ADBBE 8B8064050000 mov eax, dword ptr [eax+00000564]
:005ADBC4 E86782FCFF call 00575E30
:005ADBC9 84C0 test al, al
:005ADBCB 0F8595000000 jne 005ADC66
:005ADBD1 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"The EditorPro Suite "
|
:005ADBD3 68DCE35A00 push 005AE3DC
:005ADBD8 8D55D0 lea edx, dword ptr [ebp-30]
:005ADBDB B81E000000 mov eax, 0000001E
:005ADBE0 E8A3C1E5FF call 00409D88
:005ADBE5 FF75D0 push [ebp-30]

* Possible StringData Ref from Code Obj ->" day Trial period has expired." //--->30天试用过期啦
|
:005ADBE8 68FCE35A00 push 005AE3FC
:005ADBED 6824E45A00 push 005AE424
:005ADBF2 6830E45A00 push 005AE430

* Possible StringData Ref from Code Obj ->"Click Yes to enter Registration "
->"Code"
|
:005ADBF7 683CE45A00 push 005AE43C
:005ADBFC 6824E45A00 push 005AE424
:005ADC01 6830E45A00 push 005AE430

* Possible StringData Ref from Code Obj ->"Click No to quit."
|
:005ADC06 686CE45A00 push 005AE46C
:005ADC0B 8D45D4 lea eax, dword ptr [ebp-2C]
:005ADC0E BA09000000 mov edx, 00000009
:005ADC13 E80065E5FF call 00404118
:005ADC18 8B45D4 mov eax, dword ptr [ebp-2C]
:005ADC1B 668B0D80E45A00 mov cx, word ptr [005AE480]
:005ADC22 B202 mov dl, 02
:005ADC24 E8E334EBFF call 0046110C
:005ADC29 83F806 cmp eax, 00000006
:005ADC2C 7527 jne 005ADC55
:005ADC2E 33D2 xor edx, edx
:005ADC30 8B45FC mov eax, dword ptr [ebp-04]
:005ADC33 E8C8680000 call 005B4500
:005ADC38 8B45FC mov eax, dword ptr [ebp-04]
:005ADC3B 80B86805000000 cmp byte ptr [eax+00000568], 00
:005ADC42 7422 je 005ADC66
:005ADC44 A11C306000 mov eax, dword ptr [0060301C]
:005ADC49 8B00 mov eax, dword ptr [eax]
:005ADC4B E83893EAFF call 00456F88
:005ADC50 E98D060000 jmp 005AE2E2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005ADC2C(C)
|
:005ADC55 A11C306000 mov eax, dword ptr [0060301C]
:005ADC5A 8B00 mov eax, dword ptr [eax]
:005ADC5C E82793EAFF call 00456F88
:005ADC61 E97C060000 jmp 005AE2E2

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005ADBCB(C), :005ADC42(C)
|
:005ADC66 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"?A"

注册和未注册的信息

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005A5281(U)
|
:005A52A6 807D1000 cmp byte ptr [ebp+10], 00
:005A52AA 7438 je 005A52E4

* Possible StringData Ref from Code Obj ->"UNREGISTERED: " //---->未注册
|
:005A52AC 68F0535A00 push 005A53F0
:005A52B1 8D55E4 lea edx, dword ptr [ebp-1C]
:005A52B4 8B450C mov eax, dword ptr [ebp+0C]
:005A52B7 E8CC4AE6FF call 00409D88
:005A52BC FF75E4 push [ebp-1C]

* Possible StringData Ref from Code Obj ->" days left" //----->剩下的日子不多了。
|
:005A52BF 6808545A00 push 005A5408
:005A52C4 8D45E8 lea eax, dword ptr [ebp-18]
:005A52C7 BA03000000 mov edx, 00000003
:005A52CC E847EEE5FF call 00404118
:005A52D1 8B55E8 mov edx, dword ptr [ebp-18]
:005A52D4 8B45F0 mov eax, dword ptr [ebp-10]
:005A52D7 8B80D8020000 mov eax, dword ptr [eax+000002D8]
:005A52DD E81634E9FF call 004386F8
:005A52E2 EB21 jmp 005A5305

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005A52AA(C)
|
:005A52E4 8D45E0 lea eax, dword ptr [ebp-20]
:005A52E7 8B4D18 mov ecx, dword ptr [ebp+18]

* Possible StringData Ref from Code Obj ->"Registered: " //---->注册啦。
|
:005A52EA BA1C545A00 mov edx, 005A541C
:005A52EF E8B0EDE5FF call 004040A4
:005A52F4 8B55E0 mov edx, dword ptr [ebp-20]
:005A52F7 8B45F0 mov eax, dword ptr [ebp-10]
:005A52FA 8B80D8020000 mov eax, dword ptr [eax+000002D8]
:005A5300 E8F333E9FF call 004386F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005A52E2(U)
|
:005A5305 8D45DC lea eax, dword ptr [ebp-24]
:005A5308 8B4D1C mov ecx, dword ptr [ebp+1C]

* Possible StringData Ref from Code Obj ->"Web site: "

感谢你的注册，呵呵，真熟悉的面容，我喜欢。

* Referenced by a CALL at Address:
|:005ADC33
|
:005B4500 55 push ebp
:005B4501 8BEC mov ebp, esp
:005B4503 83C4F4 add esp, FFFFFFF4
:005B4506 8955F4 mov dword ptr [ebp-0C], edx
:005B4509 8945FC mov dword ptr [ebp-04], eax
:005B450C 8B45FC mov eax, dword ptr [ebp-04]
:005B450F 8D9064050000 lea edx, dword ptr [eax+00000564]

* Possible StringData Ref from Code Obj ->"EditorPro"
|
:005B4515 B888455B00 mov eax, 005B4588
:005B451A E80918FCFF call 00575D28
:005B451F 84C0 test al, al
:005B4521 7457 je 005B457A
:005B4523 6A00 push 00000000
:005B4525 668B0D94455B00 mov cx, word ptr [005B4594]
:005B452C B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thank you for registering!" //--->俺喜欢！！
|
:005B452E B8A0455B00 mov eax, 005B45A0
:005B4533 E8D4CBEAFF call 0046110C
:005B4538 8B45FC mov eax, dword ptr [ebp-04]
:005B453B C6806805000000 mov byte ptr [eax+00000568], 00

* Possible StringData Ref from Code Obj ->"Software\D C AL CODA\TraySuite"
|
:005B4542 B9C4455B00 mov ecx, 005B45C4
:005B4547 B201 mov dl, 01
:005B4549 A18C964500 mov eax, dword ptr [0045968C]
:005B454E E8955DEAFF call 0045A2E8
:005B4553 8945F8 mov dword ptr [ebp-08], eax
:005B4556 8B45FC mov eax, dword ptr [ebp-04]
:005B4559 8B8064050000 mov eax, dword ptr [eax+00000564]
:005B455F 50 push eax

* Possible StringData Ref from Code Obj ->"EPSSerial"
|
:005B4560 B9EC455B00 mov ecx, 005B45EC

* Possible StringData Ref from Code Obj ->"Options"

<-----代码段结束了----->


Email地址搜索器

 标 题:Email地址搜索器 (14千字)
发信人:custer
时 间:2000-10-17 17:01:33
详细信息:
执行emailserach，点击注册，输入
name=12345678 code=12345678
确定后出现 "注册名不正确"
用w32dasm打开emailserach，看到如下信息：

:00403F24 55 push ebp
:00403F25 E879FD0100 call 00423CA3
:00403F2A 51 push ecx
:00403F2B 8BCC mov ecx, esp
:00403F2D 89642418 mov dword ptr [esp+18], esp
:00403F31 53 push ebx
:00403F32 E8D1250200 call 00426508
:00403F37 51 push ecx
:00403F38 8D8780010000 lea eax, dword ptr [edi+00000180]
:00403F3E 8BCC mov ecx, esp
:00403F40 89642420 mov dword ptr [esp+20], esp
:00403F44 50 push eax
:00403F45 C78424A800000000000000 mov dword ptr [esp+000000A8], 00000000
:00403F50 E8B3250200 call 00426508
:00403F55 8BCF mov ecx, edi
:00403F57 C78424A4000000FFFFFFFF mov dword ptr [esp+000000A4], FFFFFFFF
:00403F62 E869150000 call 004054D0 <----进入此处的call
:00403F67 85C0 test eax, eax
:00403F69 7511 jne 00403F7C
:00403F6B 50 push eax
:00403F6C 50 push eax

* Possible StringData Ref from Data Obj ->"注册名不正确"
|
:00403F6D 68480C4400 push 00440C48
:00403F72 E8396D0200 call 0042ACB0
:00403F77 E940010000 jmp 004040BC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403F69(C)
|
:00403F7C 51 push ecx
:00403F7D 8BCC mov ecx, esp
:00403F7F 8964241C mov dword ptr [esp+1C], esp
:00403F83 55 push ebp
:00403F84 E87F250200 call 00426508
:00403F89 51 push ecx
:00403F8A C78424A400000001000000 mov dword ptr [esp+000000A4], 00000001
:00403F95 8BCC mov ecx, esp
:00403F97 8964241C mov dword ptr [esp+1C], esp
:00403F9B 53 push ebx
:00403F9C E867250200 call 00426508
:00403FA1 8BCF mov ecx, edi
:00403FA3 C78424A4000000FFFFFFFF mov dword ptr [esp+000000A4], FFFFFFFF
:00403FAE E89D160000 call 00405650 <----进入此处的call
:00403FB3 85C0 test eax, eax
:00403FB5 7511 jne 00403FC8
:00403FB7 50 push eax
:00403FB8 50 push eax

* Possible StringData Ref from Data Obj ->"注册码不正确"
|
:00403FB9 68380C4400 push 00440C38
:00403FBE E8ED6C0200 call 0042ACB0
:00403FC3 E9F4000000 jmp 004040BC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403FB5(C)
|
:00403FC8 6A00 push 00000000
:00403FCA 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册成功!"
|
:00403FCC 682C0C4400 push 00440C2C
:00403FD1 C7878801000001000000 mov dword ptr [edi+00000188], 00000001
:00403FDB E8D06C0200 call 0042ACB0

* Possible StringData Ref from Data Obj ->"\windows.reg"
|
:00403FE0 681C0C4400 push 00440C1C
:00403FE5 8D4C2414 lea ecx, dword ptr [esp+14]
:00403FE9 E8C3260200 call 004266B1
:00403FEE 8D4C241C lea ecx, dword ptr [esp+1C]
:00403FF2 BB02000000 mov ebx, 00000002
:00403FF7 6A1E push 0000001E
:00403FF9 51 push ecx
:00403FFA 899C24A4000000 mov dword ptr [esp+000000A4], ebx

========================================================================
:004054D0 6AFF push FFFFFFFF
:004054D2 6850244300 push 00432450
:004054D7 64A100000000 mov eax, dword ptr fs:[00000000]
:004054DD 50 push eax
:004054DE 64892500000000 mov dword ptr fs:[00000000], esp
:004054E5 83EC0C sub esp, 0000000C
:004054E8 53 push ebx
:004054E9 56 push esi
:004054EA 57 push edi
:004054EB 8B7C2428 mov edi, dword ptr [esp+28]
:004054EF 83C9FF or ecx, FFFFFFFF
:004054F2 33C0 xor eax, eax
:004054F4 8D54240C lea edx, dword ptr [esp+0C]
:004054F8 F2 repnz
:004054F9 AE scasb
:004054FA F7D1 not ecx
:004054FC 2BF9 sub edi, ecx
:004054FE C744242001000000 mov [esp+20], 00000001
:00405506 8BC1 mov eax, ecx
:00405508 8BF7 mov esi, edi
:0040550A 8BFA mov edi, edx
:0040550C C1E902 shr ecx, 02
:0040550F F3 repz
:00405510 A5 movsd
:00405511 8BC8 mov ecx, eax
:00405513 83E103 and ecx, 00000003
:00405516 F3 repz
:00405517 A4 movsb
:00405518 8A4C240F mov cl, byte ptr [esp+0F] ；[esp+0c]指向产品密钥
:0040551C 8A44240C mov al, byte ptr [esp+0C] ；
:00405520 8A5C240D mov bl, byte ptr [esp+0D] ；将产品密钥的各个字母
:00405524 8A54240E mov dl, byte ptr [esp+0E] ；
:00405528 80C104 add cl, 04 ；与其位数相加。
:0040552B FEC0 inc al ；
:0040552D 884C240F mov byte ptr [esp+0F], cl ；如:32(2)+1=33(3)
:00405531 8A4C2413 mov cl, byte ptr [esp+13] ；
:00405535 80C302 add bl, 02 ； 6E(n)+2=70(p)
:00405538 80C203 add dl, 03 ；
:0040553B 80C108 add cl, 08 ；密钥：2ndJ8gIFkNF'
:0040553E 8844240C mov byte ptr [esp+0C], al ；
:00405542 8A442410 mov al, byte ptr [esp+10] ；得到：3pgN=mPNtXQl
:00405546 885C240D mov byte ptr [esp+0D], bl ；
:0040554A 8A5C2411 mov bl, byte ptr [esp+11] ；
:0040554E 8854240E mov byte ptr [esp+0E], dl ；
:00405552 8A542412 mov dl, byte ptr [esp+12] ；
:00405556 884C2413 mov byte ptr [esp+13], cl ；
:0040555A 8A4C2417 mov cl, byte ptr [esp+17] ；
:0040555E 0405 add al, 05 ；
:00405560 80C306 add bl, 06 ；
:00405563 80C207 add dl, 07 ；
:00405566 80C10C add cl, 0C ；
:00405569 88442410 mov byte ptr [esp+10], al ；
:0040556D 8A442414 mov al, byte ptr [esp+14] ；
:00405571 885C2411 mov byte ptr [esp+11], bl ；
:00405575 8A5C2415 mov bl, byte ptr [esp+15] ；
:00405579 88542412 mov byte ptr [esp+12], dl ；
:0040557D 8A542416 mov dl, byte ptr [esp+16] ；
:00405581 884C2417 mov byte ptr [esp+17], cl ；
:00405585 8D4C240C lea ecx, dword ptr [esp+0C] ；
:00405589 0409 add al, 09 ；
:0040558B 80C30A add bl, 0A ；
:0040558E 80C20B add dl, 0B ；
:00405591 51 push ecx ；
:00405592 8D4C242C lea ecx, dword ptr [esp+2C] ；
:00405596 88442418 mov byte ptr [esp+18], al ；
:0040559A 885C2419 mov byte ptr [esp+19], bl ；
:0040559E 8854241A mov byte ptr [esp+1A], dl ；
:004055A2 E8E4110200 call 0042678B
:004055A7 8B74242C mov esi, dword ptr [esp+2C]
:004055AB 8B442428 mov eax, dword ptr [esp+28]
:004055AF 33D2 xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004055CF(C)
|
:004055B1 8A18 mov bl, byte ptr [eax]
:004055B3 8ACB mov cl, bl
:004055B5 3A1E cmp bl, byte ptr [esi]
:004055B7 751C jne 004055D5
:004055B9 3ACA cmp cl, dl
:004055BB 7414 je 004055D1
:004055BD 8A5801 mov bl, byte ptr [eax+01]
:004055C0 8ACB mov cl, bl
:004055C2 3A5E01 cmp bl, byte ptr [esi+01]
:004055C5 750E jne 004055D5
:004055C7 83C002 add eax, 00000002
:004055CA 83C602 add esi, 00000002
:004055CD 3ACA cmp cl, dl
:004055CF 75E0 jne 004055B1 ;这段是将算出的值与name比较

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004055BB(C)
|
:004055D1 33C0 xor eax, eax
:004055D3 EB05 jmp 004055DA

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004055B7(C), :004055C5(C)
|
:004055D5 1BC0 sbb eax, eax
:004055D7 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004055D3(U)
|
:004055DA 33C9 xor ecx, ecx
:004055DC 3BC2 cmp eax, edx
:004055DE 0F94C1 sete cl
:004055E1 84C9 test cl, cl
:004055E3 88542420 mov byte ptr [esp+20], dl
:004055E7 8D4C2428 lea ecx, dword ptr [esp+28]
:004055EB 742F je 0040561C
:004055ED E851100200 call 00426643
:004055F2 8D4C242C lea ecx, dword ptr [esp+2C]
:004055F6 C7442420FFFFFFFF mov [esp+20], FFFFFFFF
:004055FE E840100200 call 00426643
:00405603 B801000000 mov eax, 00000001
:00405608 8B4C2418 mov ecx, dword ptr [esp+18]
:0040560C 64890D00000000 mov dword ptr fs:[00000000], ecx
:00405613 5F pop edi
:00405614 5E pop esi
:00405615 5B pop ebx
:00405616 83C418 add esp, 00000018
:00405619 C20800 ret 0008

下面是注册码的计算过程，基本雷同，有兴趣可自行计算。
=======================================================================
:00405650 6AFF push FFFFFFFF
:00405652 6870244300 push 00432470
:00405657 64A100000000 mov eax, dword ptr fs:[00000000]
:0040565D 50 push eax
:0040565E 64892500000000 mov dword ptr fs:[00000000], esp
:00405665 83EC0C sub esp, 0000000C
:00405668 53 push ebx
:00405669 56 push esi
:0040566A 57 push edi
:0040566B 8B7C2428 mov edi, dword ptr [esp+28]
:0040566F 83C9FF or ecx, FFFFFFFF
:00405672 33C0 xor eax, eax
:00405674 8D54240C lea edx, dword ptr [esp+0C]
:00405678 F2 repnz
:00405679 AE scasb
:0040567A F7D1 not ecx
:0040567C 2BF9 sub edi, ecx
:0040567E C744242001000000 mov [esp+20], 00000001
:00405686 8BC1 mov eax, ecx
:00405688 8BF7 mov esi, edi
:0040568A 8BFA mov edi, edx
:0040568C C1E902 shr ecx, 02
:0040568F F3 repz
:00405690 A5 movsd
:00405691 8BC8 mov ecx, eax
:00405693 B803000000 mov eax, 00000003
:00405698 23C8 and ecx, eax
:0040569A F3 repz
:0040569B A4 movsb
:0040569C 8A54240C mov dl, byte ptr [esp+0C]
:004056A0 8A4C240D mov cl, byte ptr [esp+0D]
:004056A4 8A5C240E mov bl, byte ptr [esp+0E]
:004056A8 02D0 add dl, al
:004056AA 80C105 add cl, 05
:004056AD 8854240C mov byte ptr [esp+0C], dl
:004056B1 8A54240F mov dl, byte ptr [esp+0F]
:004056B5 884C240D mov byte ptr [esp+0D], cl
:004056B9 B102 mov cl, 02
:004056BB 02D8 add bl, al
:004056BD 02D1 add dl, cl
:004056BF 885C240E mov byte ptr [esp+0E], bl
:004056C3 8A5C2410 mov bl, byte ptr [esp+10]
:004056C7 8854240F mov byte ptr [esp+0F], dl
:004056CB 8A542411 mov dl, byte ptr [esp+11]
:004056CF 80C306 add bl, 06
:004056D2 02D0 add dl, al
:004056D4 885C2410 mov byte ptr [esp+10], bl
:004056D8 8A5C2412 mov bl, byte ptr [esp+12]
:004056DC 88542411 mov byte ptr [esp+11], dl
:004056E0 8A542413 mov dl, byte ptr [esp+13]
:004056E4 80C304 add bl, 04
:004056E7 02D1 add dl, cl
:004056E9 8A4C2417 mov cl, byte ptr [esp+17]
:004056ED 885C2412 mov byte ptr [esp+12], bl
:004056F1 8A5C2414 mov bl, byte ptr [esp+14]
:004056F5 88542413 mov byte ptr [esp+13], dl
:004056F9 8A542415 mov dl, byte ptr [esp+15]
:004056FD FEC3 inc bl
:004056FF 02D0 add dl, al
:00405701 FEC1 inc cl
:00405703 885C2414 mov byte ptr [esp+14], bl
:00405707 884C2417 mov byte ptr [esp+17], cl
:0040570B 8D4C240C lea ecx, dword ptr [esp+0C]
:0040570F 51 push ecx
:00405710 8D4C242C lea ecx, dword ptr [esp+2C]
:00405714 88542419 mov byte ptr [esp+19], dl
:00405718 E86E100200 call 0042678B
:0040571D 8B74242C mov esi, dword ptr [esp+2C]
:00405721 8B442428 mov eax, dword ptr [esp+28]
:00405725 33D2 xor edx, edx

===================
因为软件很多功能没有，我也不愿意用，故没有最后结果，不知是否对。


EmEditor v3 Version 3.09

标 题:EmEditor v3 Version 3.09 汉化版注册码算法分析 (8千字)
发信人:chn-boy
时 间:2001-1-9 5:11:05
详细信息:
EmEditor v3 Version 3.09 汉化版注册码算法分析

软件名称：EmEditor v3 Version 3.09
下载地址：http://www.inhua.com/EmEditor.htm
软件说明：简单好用的文本编辑器，支持多种配置，自定义颜色、字体、工具栏、快捷键设置，可以调整行距，避免中文排列过于紧密，
具有选择文本列块的功能(按ALT 键拖动鼠标)，并允许无限撤消、重做，总之功能多多，使用方便，是替代记事本的最佳编辑
器。
调试工具：SoftICE 4.05、W32dsm89
调试平台：Win2K

作者：chn-boy
日期：2001-1-9

【第一步】：
下中断：bpx GetWindowTextW do "d esp->8; p ret; "，然后输入你的Virtual Code，点注册。我输入的是：9999 8888 7777 6666
程序拦断在如下代码段处：

:004173CD 53 push ebx
:004173CE 8D86F2030000 lea eax, dword ptr [esi+000003F2]
:004173D4 53 push ebx
:004173D5 50 push eax
:004173D6 FF7508 push [ebp+08]
:004173D9 FF1584334300 Call dword ptr [00433384] / GetWindowTextW()
:004173DF 668907 mov word ptr [edi], ax / 中断拦断在此，四个输入框，你将会被拦断四次
/ 每次将十进制值返回给ax，如9999 = 0x270F, 那么 AX = 270F
/ 为了表达方便，我分别用①、②、③、④来表示
:004173E2 46 inc esi
:004173E3 47 inc edi
:004173E4 47 inc edi
:004173E5 83FE04 cmp esi, 00000004 / 是不是有了四个窗口输入？
:004173E8 7CE3 jl 004173CD
:004173EA 8D45F4 lea eax, dword ptr [ebp-0C] / 将得到的四个值连续放到eax偏移处
/ 此处，用 d eax，可以查看到你输入的四个十进制值
:004173ED 50 push eax
:004173EE E8F5FEFFFF call 004172E8 / 核心处，判断算法，查看输入的注册码是否正确？

:004173F3 3BC3 cmp eax, ebx / 如果 eax = ebx ，那么输入正确
:004173F5 5F pop edi
:004173F6 742A je 00417422
:004173F8 33C9 xor ecx, ecx
:004173FA 83F802 cmp eax, 00000002
:004173FD 0F95C1 setne cl

【第二步】：Call 004172EB代码为：
:004172E8 56 push esi
:004172E9 8B742408 mov esi, dword ptr [esp+08]
:004172ED 57 push edi
:004172EE 6A0A push 0000000A
:004172F0 0FB706 movzx eax, word ptr [esi] / ①
:004172F3 99 cdq
:004172F4 59 pop ecx / ecx = 0x0A = 10
:004172F5 F7F9 idiv ecx
:004172F7 3DAB000000 cmp eax, 000000AB / ①÷10 是否等于AB，也就是看①是否为0x6AE=1710
:004172FC 7405 je 00417303 / 是，则正确，也就是说①必须为1710
:004172FE 6A01 push 00000001
:00417300 58 pop eax
:00417301 EB15 jmp 00417318
:00417303 668B7E06 mov di, word ptr [esi+06] / ④
:00417307 56 push esi
:00417308 E834FFFFFF call 00417241 / 此Call为：用①、②、③进行一系列运算，得到一个结果，假设为⑤
/ 最后结果返回到 [esi+06]
:0041730D 85C0 test eax, eax
:0041730F 7507 jne 00417318
:00417311 663B7E06 cmp di, word ptr [esi+06] / 看看④是否等于⑤？相等，则注册成功
:00417315 0F95C0 setne al
:00417318 5F pop edi
:00417319 5E pop esi
:0041731A C20400 ret 0004

【第三步】：Call 00417241代码为：
:00417241 56 push esi
:00417242 8B742408 mov esi, dword ptr [esp+08]
:00417246 668B4602 mov ax, word ptr [esi+02] / ax = ②
:0041724A 6683660600 and word ptr [esi+06], 0000
:0041724F 663D0F27 cmp ax, 270F
:00417253 0F8788000000 ja 004172E1
:00417259 668B4E04 mov cx, word ptr [esi+04] / cx = ③
:0041725D 6681F90F27 cmp cx, 270F
:00417262 777D ja 004172E1
:00417264 6685C0 test ax, ax
:00417267 7474 je 004172DD
:00417269 663DAE08 cmp ax, 08AE / 0x08AE = 2222
:0041726D 746E je 004172DD
:0041726F 663D2E16 cmp ax, 162E / 0x162E = 5678 ，第二个窗口中不能输入2222或5678
:00417273 7468 je 004172DD
:00417275 53 push ebx
:00417276 55 push ebp
:00417277 57 push edi
:00417278 6A0A push 0000000A
:0041727A 0FB7F9 movzx edi, cx / edi = ③
:0041727D 0FB70E movzx ecx, word ptr [esi] / ecx = ①
:00417280 0FB7C0 movzx eax, ax / eax = ②
:00417283 89442418 mov dword ptr [esp+18], eax
:00417287 8BC1 mov eax, ecx / eax = ③
:00417289 99 cdq
:0041728A 5B pop ebx
:0041728B F7FB idiv ebx / eax = ③÷10
:0041728D 6A64 push 00000064
:0041728F 5D pop ebp
:00417290 55 push ebp
:00417291 8BD8 mov ebx, eax / ebx = ③÷10
:00417293 8BC7 mov eax, edi
:00417295 99 cdq
:00417296 F7FD idiv ebp / eax = ③÷100
:00417298 8B542418 mov edx, dword ptr [esp+18] / edx = ②
:0041729C 03D3 add edx, ebx
:0041729E 03C2 add eax, edx
:004172A0 03C7 add eax, edi / eax = ②+③+③÷10+③÷100
:004172A2 5F pop edi
:004172A3 99 cdq
:004172A4 F7FF idiv edi / eax = (②+③+③÷10+③÷100)÷100的商
/ edx 为余数
:004172A6 8B442414 mov eax, dword ptr [esp+14]
:004172AA 55 push ebp
:004172AB 5B pop ebx
:004172AC 55 push ebp
:004172AD 8B3C954C7F4300 mov edi, dword ptr [4*edx+00437F4C] / 用余数查表，表可以用 d 00437F4C 查看

。。。。。。 下面的算法分析同前，不再一一列出 。。。。。。

:004172B4 99 cdq
:004172B5 6BFF64 imul edi, 00000064
:004172B8 F7FB idiv ebx
:004172BA 8BD8 mov ebx, eax
:004172BC 8BC1 mov eax, ecx
:004172BE 99 cdq
:004172BF F7FD idiv ebp
:004172C1 03CB add ecx, ebx
:004172C3 03C1 add eax, ecx
:004172C5 59 pop ecx
:004172C6 99 cdq
:004172C7 F7F9 idiv ecx
:004172C9 8B04954C7F4300 mov eax, dword ptr [4*edx+00437F4C]
:004172D0 03F8 add edi, eax
:004172D2 33C0 xor eax, eax
:004172D4 66897E06 mov word ptr [esi+06], di / 将用①、②、③的值算出的值赋给 [esi+06]
/ 此处得到的di就是⑤，在SoftICE环境下用?di
/ 得到的十进制的值就是你要输入的第4个窗口的数字号码
:004172D8 5F pop edi
:004172D9 5D pop ebp
:004172DA 5B pop ebx
:004172DB EB07 jmp 004172E4
:004172DD 6A02 push 00000002
:004172DF EB02 jmp 004172E3
:004172E1 6A01 push 00000001
:004172E3 58 pop eax
:004172E4 5E pop esi
:004172E5 C20400 ret 0004

【结果】
经过跟踪，得到注册码为：1710 8888 7777 5651

【后记】
写文章用的时间比跟踪、研究算法的时间要长的多得多。:(
这篇文章就是用这个软件写成，感觉这个软件真的不错。:)

2001年1月9日 by chn-boy

标 题:看看 (146字)
发信人:[最弱智]
时 间:2001-1-9 9:59:35

详细信息:

>①÷10 是否等于AB，也就是看①是否为0x6AE=1710
>是，则正确，也就是说①必须为1710

这位老兄真是可爱啊。1711整除10难道不等于171么？1712呢？
标 题:是，应该有10个，从1710~1719，呵呵，犯晕了。多谢指教！ (空)
发信人:chn-boy
时 间:2001-1-9 12:34:11
详细信息:


EMEDITOR V3.0

标 题:EMEDITOR V3.0破解过程~~~~~呵呵~~~~~我第一次写过程~~~~累死我了~~~~呵呵 (14千字)
发信人:真·伪装者
时 间:2001-1-11 3:58:38
详细信息:
破解EMEDITOR v3.0
小弟第一次写过程，有不对的地方大家指正~~~~呵呵~~
EMEDITOR 3.0是一个完全可以代替WINDOWS下NOTEBOOK的小玩意~~~~
这东西使用30天就需要注册，现将注册过程写一下
这个软件在我的主页有下载http://zop.yeah.net/download/crem.zip 660K左右
我使用的工具：TRW2000+W32DASM89+ULTRAEDIT
安装完EMEDITOR后运行并选说明中的关于，关于注册信息点那个输入序列号：
这时弹出一对话窗口，需要填一个分为四部分的序列号，我们设这四个部分为
X1，X2，X3，X4
我第一次填的是 X1=1234，X2=4321，X3=1324，X4=1423
运行TRW2000 下 BPX HMEMCPY（小弟暂时只会用这个断点~~~~呵呵~~~~~）
顺利拦到，我们PMODULE 程序蹦到417A01处，见下：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417A0A(C)
|
:004179EF 53 push ebx
:004179F0 8D86F2030000 lea eax, dword ptr [esi+000003F2]
:004179F6 53 push ebx
:004179F7 50 push eax
:004179F8 FF7508 push [ebp+08]

* Reference To: USER32.GetDlgItemInt, Ord:0103h
|
:004179FB FF1588434300 Call dword ptr [00434388]
:00417A01 668907 mov word ptr [edi], ax ----->就是蹦到这里了~~呵呵，看一眼EAX
:00417A04 46 inc esi | ，里面装的就是我们的X1，往下走……
:00417A05 47 inc edi |
:00417A06 47 inc edi |
:00417A07 83FE04 cmp esi, 00000004 | 这里比较ESI和4如果小于则往上蹦（就是
:00417A0A 7CE3 jl 004179EF | 上面那段代码~~~直到我们序列号的四个部分
:00417A0C 8D45F4 lea eax, dword ptr [ebp-0C] | 完全存进EBP-C中（不知道这么说合不合适~）
:00417A0F 50 push eax |
:00417A10 E8F5FEFFFF call 0041790A | 呵呵~~~~~一个CALL，看看底下，一个对比，如果
:00417A15 3BC3 cmp eax, ebx | 是，怎么怎么样，不是又怎么怎么样，很显然这是
:00417A17 5F pop edi -----> 关键CALL，我们按F8跟进去 HAVE A LOOK ~~~~~
****************************************************************************************************************
* Referenced by a CALL at Addresses:
|:00417A10 , :00417B90
|
:0041790A 56 push esi --->这段代码比较作用是
:0041790B 8B742408 mov esi, dword ptr [esp+08] 将我们输入的X1，即1234除以10后
:0041790F 57 push edi 和171比较，171哪来得？就是那个
:00417910 6A0A push 0000000A AB转换成十进制得到的，如果是呢
:00417912 0FB706 movzx eax, word ptr [esi] 就继续，不是的话~~~~嘿嘿嘿嘿~~
:00417915 99 cdq 你就等着出序列号错误吧~~~由于我
:00417916 59 pop ecx 们输入的是1234，不符合要求，所以
:00417917 F7F9 idiv ecx 这时我们对X1进行第一次修正，现在
:00417919 3DAB000000 cmp eax, 000000AB 新的X1=171x 其中“x”为任意数，
:0041791E 7405 je 00417925 我的是X1=1710，接着往下走~~~~~~
:00417920 6A01 push 00000001 走…………………………………………
:00417922 58 pop eax 走……………………………………
:00417923 EB15 jmp 0041793A ---->走………………………………

* Referenced by a (U)nconditional or (C)onditional Jump at Address: 走…………………………
|:0041791E(C)
|
:00417925 668B7E06 mov di, word ptr [esi+06] 走到此处，程序将我们的X4移到DI中
:00417929 56 push esi 走……………………
:0041792A E834FFFFFF call 00417863 走到此处又有一个CALL，不要着急，看看
:0041792F 85C0 test eax, eax 下面，呵呵~~~~又是一个关键CALL我们跟
:00417931 7507 jne 0041793A 进去瞧瞧~~~~~~~~
###################################################################################################################
* Referenced by a CALL at Address:
|:0041792A
|
:00417863 56 push esi ---->到目前ESI中存放的还是我们输入的序列号
:00417864 8B742408 mov esi, dword ptr [esp+08] 走………………………………………………
:00417868 668B4602 mov ax, word ptr [esi+02] 这行将我们的X2移入AX中
:0041786C 6683660600 and word ptr [esi+06], 0000
:00417871 663D0F27 cmp ax, 270F 比较X2和9999
:00417875 0F8788000000 ja 00417903 大于的话蹦到 417903，不过不大可能大于
:0041787B 668B4E04 mov cx, word ptr [esi+04] 这行将我们的X3移入CX中
:0041787F 6681F90F27 cmp cx, 270F 比较X2和9999
:00417884 777D ja 00417903 大于的话蹦到 417903，不过不大可能大于
:00417886 6685C0 test ax, ax
:00417889 7474 je 004178FF
:0041788B 663DAE08 cmp ax, 08AE 比较X2和2222，X2和5678，我们的X2=4321
:0041788F 746E je 004178FF 没有蹦~~后来发现蹦了就DIE了
:00417891 663D2E16 cmp ax, 162E
:00417895 7468 je 004178FF
:00417897 53 push ebx
:00417898 55 push ebp
:00417899 57 push edi
:0041789A 6A0A push 0000000A 下面会提到这个A
:0041789C 0FB7F9 movzx edi, cx 把X3放入EDI
:0041789F 0FB70E movzx ecx, word ptr [esi] 把X1放入ECX
:004178A2 0FB7C0 movzx eax, ax
:004178A5 89442418 mov dword ptr [esp+18], eax 把X2放入ESP+18中
:004178A9 8BC1 mov eax, ecx 把X1放入EAX中
:004178AB 99 cdq
:004178AC 5B pop ebx 把上面那个A放到EBX中
:004178AD F7FB idiv ebx 用X1/10 1710÷10=171整数放入EAX，余数放入EDX
:004178AF 6A64 push 00000064 下面会提到这个64
:004178B1 5D pop ebp
:004178B2 55 push ebp
:004178B3 8BD8 mov ebx, eax 把结果的整数放入EBX
:004178B5 8BC7 mov eax, edi 把X3放入EAX中
:004178B7 99 cdq
:004178B8 F7FD idiv ebp 用X3除以100（就是上面那个64）
:004178BA 8B542418 mov edx, dword ptr [esp+18] 把X2放入EDX中
:004178BE 03D3 add edx, ebx 把X2+（X1/10的整数）放入EDX
:004178C0 03C2 add eax, edx 把X2+（X1/10的整数）+（X3/100的整数）放入EAX
:004178C2 03C7 add eax, edi 用X2+（X1/10的整数）+（X3/100的整数）+X3放入
:004178C4 5F pop edi EAX中
:004178C5 99 cdq 用X2+（X1/10的整数）+（X3/100的整数）+X3除以
:004178C6 F7FF idiv edi 100，整数放入EAX，余数放入EDX
:004178C8 8B442414 mov eax, dword ptr [esp+14] 把X2放入EAX中
:004178CC 55 push ebp
:004178CD 5B pop ebx
:004178CE 55 push ebp
:004178CF 8B3C95288C4300 mov edi, dword ptr [4*edx+00438C28] 把刚才那个余数x4+438C28中的值放入EDI中
:004178D6 99 cdq 关于这个438C28文章最后有它的值
:004178D7 6BFF64 imul edi, 00000064 用EDIx100，得的结果放入EDI中我们这里是2300
:004178DA F7FB idiv ebx 把X2/100的整数放入EAX中，余数放入EDX中
:004178DC 8BD8 mov ebx, eax 把X2/100的整数放入EBX中
:004178DE 8BC1 mov eax, ecx 把X1放入EAX中
:004178E0 99 cdq 用X1/100，结果整数放入EAX中，余数放入EDX中
:004178E1 F7FD idiv ebp
:004178E3 03CB add ecx, ebx 把X1+（X2/100的整数）放入ECX中
:004178E5 03C1 add eax, ecx 把X1+（X2/100的整数）+（X1/100的整数）放入EAX
:004178E7 59 pop ecx 把100放入ECX中
:004178E8 99 cdq 用[X1+（X2/100的整数）+（X1/100的整数）]/100
:004178E9 F7F9 idiv ecx 结果整数放入EAX中，余数放入EDX中
:004178EB 8B0495288C4300 mov eax, dword ptr [4*edx+00438C28] 把（刚刚得到的余数x4+438C28）的值放入EAX中我们这里是69
:004178F2 03F8 add edi, eax EDI=EDI+EAX=2369，即把这两次的结果相加我们设它为X4`
:004178F4 33C0 xor eax, eax 清空EAX
:004178F6 66897E06 mov word ptr [esi+06], di 把ESI+6的值用X4`代替
:004178FA 5F pop edi 走…………………………………………………………
:004178FB 5D pop ebp 走……………………………………………………
:004178FC 5B pop ebx 走………………………………………………
:004178FD EB07 jmp 00417906 蹦…………………………………………

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004178FD(U)
|
:00417906 5E pop esi 走……………………………………
:00417907 C20400 ret 0004 回去喽…………………………

#######################################################################################################################
:00417933 663B7E06 cmp di, word ptr [esi+06] 呵呵~~~让我们来比较一下DI中是我们的X4，ESI+6的值
是我们的X4`
:00417937 0F95C0 setne al 如果不一样那么就把AL改为1，聪明的你一定想到了这个
X4`就是正确的序列号的最后一部分~~现在我们修正
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:X4=X4`=2369
|:00417923(U), :00417931(C)
|
:0041793A 5F pop edi
:0041793B 5E pop esi
:0041793C C20400 ret 0004 返回
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417923(U), :00417931(C)
|
:0041793A 5F pop edi
:0041793B 5E pop esi
:0041793C C20400 ret 0004 返回
********************************************************************************************************************
:00417A15 3BC3 cmp eax, ebx 这时的EBX本身是0，如果没出以外的话你的EAX
:00417A17 5F pop edi 现在也该是0，比较一下，一样呀~~~呵呵
:00417A18 742A je 00417A44 那就蹦到正确的地方去吧
:00417A1A 33C9 xor ecx, ecx
:00417A1C 83F802 cmp eax, 00000002
:00417A1F 0F95C1 setne cl
:00417A22 49 dec ecx
:00417A23 6A30 push 00000030
:00417A25 83E103 and ecx, 00000003
:00417A28 81C154040000 add ecx, 00000454
:00417A2E 51 push ecx
:00417A2F E8E3ACFFFF call 00412717 这是出错的 CALL

总结：
输入X1必须为171x，
X4={{[X2+（X1/10的整数）+（X3/100的整数）+X3]/100的余数}x4在下表中的位置的值}x100
+{{[X1+（X2/100的整数）+（X1/100的整数）]/100的余数}x4在下表中的位置的值}
如X1=1710,X2=4321,X3=1324
根据上式得X4=2369

附438C28表：
260000005B0000006200000036000000340000006600000013000000350000001900000054000000
3F000000440000004C000000380000005D0000003300000056000000610000004200000021000000
3E0000002D000000230000000E0000001E0000005F00000057000000120000001B00000017000000
22000000580000002C000000630000005C000000180000002700000041000000590000004D000000
150000005A000000530000000B000000050000001C000000100000002E0000004900000040000000
0D00000007000000500000003D00000032000000460000000A000000430000002B00000000000000
3B000000480000005E0000004E000000510000001F000000200000003A000000010000002A000000
45000000550000004A000000020000005200000027000000030000004B000000080000003C000000
0F0000001400000024000000250000002800000029000000160000001D0000001A00000011000000
2F000000390000000900000047000000060000004F00000004000000310000000C00000030000000

后记：
本人以前没写过破解过程，真没想到写过程这么费劲，我也是看着前辈们的教程入的门
在此小弟对以前写过程引导我们入门的前辈们说一声你们辛苦了~~~
另外，有人可能会问，文章中提到的三个工具好象只用到了一个，其实W32DASM和ULTRA
EDIT对破解这个软件确实没有多大作用，但是小弟要用它们进行复制粘贴呀~~~~呵呵
最后我还想问一个问题，EMEDITOR V3.0的说明文件中说可以注册不同的用户数量，小弟
一直没找到在哪~~~~~哪位大吓知道告诉小弟一声~~~~谢谢！

伪装者
破解乐园：http://zop.yeah.net
http://www.y6y6.net


EmEditor v3.x

 标 题:EmEditor v3.16破解过程 (9千字)
发信人:conanxu[BCG]
时 间:2001-7-22 13:01:17
详细信息:
:0041B09F 668907 mov word ptr [edi], ax
:0041B0A2 46 inc esi
:0041B0A3 47 inc edi
:0041B0A4 47 inc edi
:0041B0A5 83FE04 cmp esi, 00000004
:0041B0A8 7CE3 jl 0041B08D
:0041B0AA 8D45F4 lea eax, dword ptr [ebp-0C]
:0041B0AD 50 push eax
:0041B0AE E8F5FEFFFF call 0041AFA8 ------>跟进这个call
:0041B0B3 3BC3 cmp eax, ebx
:0041B0B5 5F pop edi
:0041B0B6 742A je 0041B0E2
:0041B0B8 33C9 xor ecx, ecx
:0041B0BA 83F802 cmp eax, 00000002
:0041B0BD 0F95C1 setne cl
:0041B0C0 49 dec ecx
:0041B0C1 6A30 push 00000030
:0041B0C3 83E103 and ecx, 00000003
:0041B0C6 81C154040000 add ecx, 00000454
:0041B0CC 51 push ecx
:0041B0CD E8DCA1FFFF call 004152AE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041B019(C)
|
:0041B0D2 6A02 push 00000002

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041B149(U)
|
:0041B0D4 FF7508 push [ebp+08]

* Reference To: USER32.EndDialog, Ord:00BBh
|
:0041B0D7 FF15C0834300 Call dword ptr [004383C0]
:0041B0DD E998000000 jmp 0041B17A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041B0B6(C)
|
:0041B0E2 C605742E440001 mov byte ptr [00442E74], 01
:0041B0E9 E82EFDFFFF call 0041AE1C
:0041B0EE 8BF0 mov esi, eax
:0041B0F0 3BF3 cmp esi, ebx
:0041B0F2 7509 jne 0041B0FD
:0041B0F4 6A30 push 00000030
:0041B0F6 6861040000 push 00000461
:0041B0FB EB45 jmp 0041B142

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041B0F2(C)
|
:0041B0FD 6A02 push 00000002

* Possible StringData Ref from Data Obj ->"EmEditor"
|
:0041B0FF 686CCE4300 push 0043CE6C
:0041B104 8D45D4 lea eax, dword ptr [ebp-2C]

* Possible StringData Ref from Data Obj ->"%s-%d"
|
:0041B107 6818D04300 push 0043D018
:0041B10C 50 push eax

----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------

* Referenced by a CALL at Addresses:
|:0041B0AE , :0041B22E
|
:0041AFA8 56 push esi
:0041AFA9 8B742408 mov esi, dword ptr [esp+08]
:0041AFAD 57 push edi
:0041AFAE 6A0A push 0000000A
:0041AFB0 0FB706 movzx eax, word ptr [esi]
:0041AFB3 99 cdq
:0041AFB4 59 pop ecx
:0041AFB5 F7F9 idiv ecx
:0041AFB7 3DAB000000 cmp eax, 000000AB ------>检查code1的前三位是否为171
:0041AFBC 7405 je 0041AFC3 ------>不跳就死
:0041AFBE 6A01 push 00000001
:0041AFC0 58 pop eax
:0041AFC1 EB15 jmp 0041AFD8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041AFBC(C)
|
:0041AFC3 668B7E06 mov di, word ptr [esi+06]
:0041AFC7 56 push esi
:0041AFC8 E813FFFFFF call 0041AEE0 ------>跟进这个call
:0041AFCD 85C0 test eax, eax
:0041AFCF 7507 jne 0041AFD8 ------>一跳就完了
:0041AFD1 663B7E06 cmp di, word ptr [esi+06] ------>esi+06为code4
:0041AFD5 0F95C0 setne al

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041AFC1(U), :0041AFCF(C)
|
:0041AFD8 5F pop edi
:0041AFD9 5E pop esi
:0041AFDA C20400 ret 0004

----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------

* Referenced by a CALL at Address:
|:0041AFC8
|
:0041AEE0 56 push esi
:0041AEE1 8B742408 mov esi, dword ptr [esp+08]
:0041AEE5 668B4602 mov ax, word ptr [esi+02]
:0041AEE9 6683660600 and word ptr [esi+06], 0000
:0041AEEE 663D0F27 cmp ax, 270F ------>检查code2是否为9999
:0041AEF2 0F87A9000000 ja 0041AFA1 ------>大于就跳
:0041AEF8 668B5604 mov dx, word ptr [esi+04]
:0041AEFC 6681FA0F27 cmp dx, 270F ------>检查code3是否为9999
:0041AF01 0F879A000000 ja 0041AFA1 ------>大于就跳
:0041AF07 6685C0 test ax, ax
:0041AF0A 0F848D000000 je 0041AF9D
:0041AF10 663DAE08 cmp ax, 08AE ------>检查code2是否为2222
:0041AF14 0F8483000000 je 0041AF9D ------>等于就跳
:0041AF1A 663D2E16 cmp ax, 162E ------>检查code2是否为5678
:0041AF1E 747D je 0041AF9D ------>等于就跳
:0041AF20 663D1625 cmp ax, 2516 ------>检查code2是否为9494
:0041AF24 7477 je 0041AF9D ------>等于就跳
:0041AF26 668B0E mov cx, word ptr [esi]
:0041AF29 6681F9AE06 cmp cx, 06AE ------>检查code1是否为1710
:0041AF2E 746D je 0041AF9D ------>等于就跳
:0041AF30 53 push ebx
:0041AF31 55 push ebp
:0041AF32 57 push edi
:0041AF33 6A64 push 00000064
:0041AF35 0FB7C0 movzx eax, ax
:0041AF38 0FB7FA movzx edi, dx
:0041AF3B 89442418 mov dword ptr [esp+18], eax
:0041AF3F 8BC7 mov eax, edi
:0041AF41 99 cdq
:0041AF42 5B pop ebx
:0041AF43 F7FB idiv ebx
:0041AF45 0FB7C9 movzx ecx, cx
:0041AF48 6A0A push 0000000A
:0041AF4A 5D pop ebp
:0041AF4B 6A64 push 00000064
:0041AF4D 8BD8 mov ebx, eax
:0041AF4F 8BC1 mov eax, ecx
:0041AF51 99 cdq
:0041AF52 F7FD idiv ebp
:0041AF54 8B542418 mov edx, dword ptr [esp+18]
:0041AF58 03D3 add edx, ebx
:0041AF5A 03C2 add eax, edx
:0041AF5C 03C7 add eax, edi
:0041AF5E 5F pop edi
:0041AF5F 99 cdq
:0041AF60 F7FF idiv edi
:0041AF62 8B442414 mov eax, dword ptr [esp+14]
:0041AF66 6A64 push 00000064
:0041AF68 5B pop ebx
:0041AF69 6A64 push 00000064
:0041AF6B 5D pop ebp
:0041AF6C 55 push ebp
:0041AF6D 8B3C9588CE4300 mov edi, dword ptr [4*edx+0043CE88]
:0041AF74 99 cdq
:0041AF75 6BFF64 imul edi, 00000064
:0041AF78 F7FB idiv ebx
:0041AF7A 8BD8 mov ebx, eax
:0041AF7C 8BC1 mov eax, ecx
:0041AF7E 99 cdq
:0041AF7F F7FD idiv ebp
:0041AF81 03CB add ecx, ebx
:0041AF83 03C1 add eax, ecx
:0041AF85 59 pop ecx
:0041AF86 99 cdq
:0041AF87 F7F9 idiv ecx
:0041AF89 8B049588CE4300 mov eax, dword ptr [4*edx+0043CE88]
:0041AF90 03F8 add edi, eax
:0041AF92 33C0 xor eax, eax
:0041AF94 66897E06 mov word ptr [esi+06], di
:0041AF98 5F pop edi
:0041AF99 5D pop ebp
:0041AF9A 5B pop ebx
:0041AF9B EB07 jmp 0041AFA4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041AF0A(C), :0041AF14(C), :0041AF1E(C), :0041AF24(C), :0041AF2E(C)
|
:0041AF9D 6A02 push 00000002
:0041AF9F EB02 jmp 0041AFA3

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041AEF2(C), :0041AF01(C)
|
:0041AFA1 6A01 push 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041AF9F(U)
|
:0041AFA3 58 pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041AF9B(U)
|
:0041AFA4 5E pop esi
:0041AFA5 C20400 ret 0004

conanxu[BCG]
conanxu@eastday.com
http://conanxu.51.net/

标 题:贴我写的3.0的破解过程~~~ (9千字)
发信人:伪装者[CCG]
时 间:2001-7-22 16:22:35
详细信息:

破解EMEDITOR v3.0
小弟第一次写过程，有不对的地方大家指正~~~~呵呵~~
EMEDITOR 3.0是一个完全可以代替WINDOWS下NOTEBOOK的小玩意~~~~
这东西使用30天就需要注册，现将注册过程写一下
这个软件在我的主页有下载http://zop.yeah.net/download/crem.zip 660K左右
我使用的工具：TRW2000+W32DASM89+ULTRAEDIT
安装完EMEDITOR后运行并选说明中的关于，关于注册信息点那个输入序列号：
这时弹出一对话窗口，需要填一个分为四部分的序列号，我们设这四个部分为
X1，X2，X3，X4
我第一次填的是 X1=1234，X2=4321，X3=1324，X4=1423
运行TRW2000 下 BPX HMEMCPY（小弟暂时只会用这个断点~~~~呵呵~~~~~）
顺利拦到，我们PMODULE 程序蹦到417A01处，见下：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417A0A(C)
|
:004179EF 53 push ebx
:004179F0 8D86F2030000 lea eax, dword ptr [esi+000003F2]
:004179F6 53 push ebx
:004179F7 50 push eax
:004179F8 FF7508 push [ebp+08]

* Reference To: USER32.GetDlgItemInt, Ord:0103h
|
:004179FB FF1588434300 Call dword ptr [00434388]
:00417A01 668907 mov word ptr [edi], ax ----->就是蹦到这里了~~呵呵，看一眼EAX
:00417A04 46 inc esi | ，里面装的就是我们的X1，往下走……
:00417A05 47 inc edi |
:00417A06 47 inc edi |
:00417A07 83FE04 cmp esi, 00000004 | 这里比较ESI和4如果小于则往上蹦（就是
:00417A0A 7CE3 jl 004179EF | 上面那段代码~~~直到我们序列号的四个部分
:00417A0C 8D45F4 lea eax, dword ptr [ebp-0C] | 完全存进EBP-C中（不知道这么说合不合适~）
:00417A0F 50 push eax |
:00417A10 E8F5FEFFFF call 0041790A | 呵呵~~~~~一个CALL，看看底下，一个对比，如果
:00417A15 3BC3 cmp eax, ebx | 是，怎么怎么样，不是又怎么怎么样，很显然这是
:00417A17 5F pop edi -----> 关键CALL，我们按F8跟进去 HAVE A LOOK ~~~~~
****************************************************************************************************************
* Referenced by a CALL at Addresses:
|:00417A10 , :00417B90
|
:0041790A 56 push esi --->这段代码比较作用是
:0041790B 8B742408 mov esi, dword ptr [esp+08] 将我们输入的X1，即1234除以10后
:0041790F 57 push edi 和171比较，171哪来得？就是那个
:00417910 6A0A push 0000000A AB转换成十进制得到的，如果是呢
:00417912 0FB706 movzx eax, word ptr [esi] 就继续，不是的话~~~~嘿嘿嘿嘿~~
:00417915 99 cdq 你就等着出序列号错误吧~~~由于我
:00417916 59 pop ecx 们输入的是1234，不符合要求，所以
:00417917 F7F9 idiv ecx 这时我们对X1进行第一次修正，现在
:00417919 3DAB000000 cmp eax, 000000AB 新的X1=171x 其中“x”为任意数，
:0041791E 7405 je 00417925 我的是X1=1710，接着往下走~~~~~~
:00417920 6A01 push 00000001 走…………………………………………
:00417922 58 pop eax 走……………………………………
:00417923 EB15 jmp 0041793A ---->走………………………………

* Referenced by a (U)nconditional or (C)onditional Jump at Address: 走…………………………
|:0041791E(C)
|
:00417925 668B7E06 mov di, word ptr [esi+06] 走到此处，程序将我们的X4移到DI中
:00417929 56 push esi 走……………………
:0041792A E834FFFFFF call 00417863 走到此处又有一个CALL，不要着急，看看
:0041792F 85C0 test eax, eax 下面，呵呵~~~~又是一个关键CALL我们跟
:00417931 7507 jne 0041793A 进去瞧瞧~~~~~~~~
###################################################################################################################
* Referenced by a CALL at Address:
|:0041792A
|
:00417863 56 push esi ---->到目前ESI中存放的还是我们输入的序列号
:00417864 8B742408 mov esi, dword ptr [esp+08] 走………………………………………………
:00417868 668B4602 mov ax, word ptr [esi+02] 这行将我们的X2移入AX中
:0041786C 6683660600 and word ptr [esi+06], 0000
:00417871 663D0F27 cmp ax, 270F 比较X2和9999
:00417875 0F8788000000 ja 00417903 大于的话蹦到 417903，不过不大可能大于
:0041787B 668B4E04 mov cx, word ptr [esi+04] 这行将我们的X3移入CX中
:0041787F 6681F90F27 cmp cx, 270F 比较X2和9999
:00417884 777D ja 00417903 大于的话蹦到 417903，不过不大可能大于
:00417886 6685C0 test ax, ax
:00417889 7474 je 004178FF
:0041788B 663DAE08 cmp ax, 08AE 比较X2和2222，X2和5678，我们的X2=4321
:0041788F 746E je 004178FF 没有蹦~~后来发现蹦了就DIE了
:00417891 663D2E16 cmp ax, 162E
:00417895 7468 je 004178FF
:00417897 53 push ebx
:00417898 55 push ebp
:00417899 57 push edi
:0041789A 6A0A push 0000000A 下面会提到这个A
:0041789C 0FB7F9 movzx edi, cx 把X3放入EDI
:0041789F 0FB70E movzx ecx, word ptr [esi] 把X1放入ECX
:004178A2 0FB7C0 movzx eax, ax
:004178A5 89442418 mov dword ptr [esp+18], eax 把X2放入ESP+18中
:004178A9 8BC1 mov eax, ecx 把X1放入EAX中
:004178AB 99 cdq
:004178AC 5B pop ebx 把上面那个A放到EBX中
:004178AD F7FB idiv ebx 用X1/10 1710÷10=171整数放入EAX，余数放入EDX
:004178AF 6A64 push 00000064 下面会提到这个64
:004178B1 5D pop ebp
:004178B2 55 push ebp
:004178B3 8BD8 mov ebx, eax 把结果的整数放入EBX
:004178B5 8BC7 mov eax, edi 把X3放入EAX中
:004178B7 99 cdq
:004178B8 F7FD idiv ebp 用X3除以100（就是上面那个64）
:004178BA 8B542418 mov edx, dword ptr [esp+18] 把X2放入EDX中
:004178BE 03D3 add edx, ebx 把X2+（X1/10的整数）放入EDX
:004178C0 03C2 add eax, edx 把X2+（X1/10的整数）+（X3/100的整数）放入EAX
:004178C2 03C7 add eax, edi 用X2+（X1/10的整数）+（X3/100的整数）+X3放入
:004178C4 5F pop edi EAX中
:004178C5 99 cdq 用X2+（X1/10的整数）+（X3/100的整数）+X3除以
:004178C6 F7FF idiv edi 100，整数放入EAX，余数放入EDX
:004178C8 8B442414 mov eax, dword ptr [esp+14] 把X2放入EAX中
:004178CC 55 push ebp
:004178CD 5B pop ebx
:004178CE 55 push ebp
:004178CF 8B3C95288C4300 mov edi, dword ptr [4*edx+00438C28] 把刚才那个余数x4+438C28中的值放入EDI中
:004178D6 99 cdq 关于这个438C28文章最后有它的值
:004178D7 6BFF64 imul edi, 00000064 用EDIx100，得的结果放入EDI中我们这里是2300
:004178DA F7FB idiv ebx 把X2/100的整数放入EAX中，余数放入EDX中
:004178DC 8BD8 mov ebx, eax 把X2/100的整数放入EBX中
:004178DE 8BC1 mov eax, ecx 把X1放入EAX中
:004178E0 99 cdq 用X1/100，结果整数放入EAX中，余数放入EDX中
:004178E1 F7FD idiv ebp
:004178E3 03CB add ecx, ebx 把X1+（X2/100的整数）放入ECX中
:004178E5 03C1 add eax, ecx 把X1+（X2/100的整数）+（X1/100的整数）放入EAX
:004178E7 59 pop ecx 把100放入ECX中
:004178E8 99 cdq 用[X1+（X2/100的整数）+（X1/100的整数）]/100
:004178E9 F7F9 idiv ecx 结果整数放入EAX中，余数放入EDX中
:004178EB 8B0495288C4300 mov eax, dword ptr [4*edx+00438C28] 把（刚刚得到的余数x4+438C28）的值放入EAX中我们这里是69
:004178F2 03F8 add edi, eax EDI=EDI+EAX=2369，即把这两次的结果相加我们设它为X4`
:004178F4 33C0 xor eax, eax 清空EAX
:004178F6 66897E06 mov word ptr [esi+06], di 把ESI+6的值用X4`代替
:004178FA 5F pop edi 走…………………………………………………………
:004178FB 5D pop ebp 走……………………………………………………
:004178FC 5B pop ebx 走………………………………………………
:004178FD EB07 jmp 00417906 蹦…………………………………………

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004178FD(U)
|
:00417906 5E pop esi 走……………………………………
:00417907 C20400 ret 0004 回去喽…………………………

#######################################################################################################################
:00417933 663B7E06 cmp di, word ptr [esi+06] 呵呵~~~让我们来比较一下DI中是我们的X4，ESI+6的值
是我们的X4`
:00417937 0F95C0 setne al 如果不一样那么就把AL改为1，聪明的你一定想到了这个
X4`就是正确的序列号的最后一部分~~现在我们修正
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:X4=X4`=2369
|:00417923(U), :00417931(C)
|
:0041793A 5F pop edi
:0041793B 5E pop esi
:0041793C C20400 ret 0004 返回
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417923(U), :00417931(C)
|
:0041793A 5F pop edi
:0041793B 5E pop esi
:0041793C C20400 ret 0004 返回
********************************************************************************************************************
:00417A15 3BC3 cmp eax, ebx 这时的EBX本身是0，如果没出以外的话你的EAX
:00417A17 5F pop edi 现在也该是0，比较一下，一样呀~~~呵呵
:00417A18 742A je 00417A44 那就蹦到正确的地方去吧
:00417A1A 33C9 xor ecx, ecx
:00417A1C 83F802 cmp eax, 00000002
:00417A1F 0F95C1 setne cl
:00417A22 49 dec ecx
:00417A23 6A30 push 00000030
:00417A25 83E103 and ecx, 00000003
:00417A28 81C154040000 add ecx, 00000454
:00417A2E 51 push ecx
:00417A2F E8E3ACFFFF call 00412717 这是出错的 CALL

总结：
输入X1必须为171x，
X4={{[X2+（X1/10的整数）+（X3/100的整数）+X3]/100的余数}x4在下表中的位置的值}x100
+{{[X1+（X2/100的整数）+（X1/100的整数）]/100的余数}x4在下表中的位置的值}
如X1=1710,X2=4321,X3=1324
根据上式得X4=2369

附438C28表：
260000005B0000006200000036000000340000006600000013000000350000001900000054000000
3F000000440000004C000000380000005D0000003300000056000000610000004200000021000000
3E0000002D000000230000000E0000001E0000005F00000057000000120000001B00000017000000
22000000580000002C000000630000005C000000180000002700000041000000590000004D000000
150000005A000000530000000B000000050000001C000000100000002E0000004900000040000000
0D00000007000000500000003D00000032000000460000000A000000430000002B00000000000000
3B000000480000005E0000004E000000510000001F000000200000003A000000010000002A000000
45000000550000004A000000020000005200000027000000030000004B000000080000003C000000
0F0000001400000024000000250000002800000029000000160000001D0000001A00000011000000
2F000000390000000900000047000000060000004F00000004000000310000000C00000030000000

后记：
本人以前没写过破解过程，真没想到写过程这么费劲，我也是看着前辈们的教程入的门
在此小弟对以前写过程引导我们入门的前辈们说一声你们辛苦了~~~
另外，有人可能会问，文章中提到的三个工具好象只用到了一个，其实W32DASM和ULTRA
EDIT对破解这个软件确实没有多大作用，但是小弟要用它们进行复制粘贴呀~~~~呵呵
最后我还想问一个问题，EMEDITOR V3.0的说明文件中说可以注册不同的用户数量，小弟
一直没找到在哪~~~~~哪位大吓知道告诉小弟一声~~~~谢谢！


ePublisher Gold v1.3

 标 题:ePublisher Gold v1.3 的注册码及注册机
发信人:chn-boy
时 间:2000-12-3 19:55:28
详细信息:
软件名称： ePublisher Gold v1.3 的注册码
此文目的： 如何获得该软件的注册码
调试工具： SoftICE4.05、W32dsm89.exe
调试平台： Win2K
编程工具： Turbo c 2.0

作者： chn-boy
写作日期： 2000-12-03

【正文】
由于这个软件的注册算法异常的复杂，所以具体的跟踪说明部分就不再给出了，值得提到的一点
就是怎么下中断。
先用W32dsm89分析该软件，使用Found Text，查找：You entered an incorrect registration
这个出错的字符串，你会发现：
:0045EB77 BA84EC4500 mov edx, 0045EC84 <-- 在该处下中断
:0045EB7C E83F50FAFF call 00403BC0
:0045EB81 8B952CFEFFFF mov edx, dword ptr [ebp+FFFFFE2C]
:0045EB87 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EB8D E8F06BFAFF call 00405782
:0045EB92 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EB98 E8116EFAFF call 004059AE
:0045EB9D E8DA3BFAFF call 0040277C
:0045EBA2 8B55FC mov edx, dword ptr [ebp-04]
:0045EBA5 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EBAB E84053FAFF call 00403EF0
:0045EBB0 E8486CFAFF call 004057FD
:0045EBB5 E8C23BFAFF call 0040277C
:0045EBBA 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EBC0 E85F6CFAFF call 00405824
:0045EBC5 E8B23BFAFF call 0040277C
:0045EBCA E8C1FBFFFF call 0045E790 <-- 注册码算法Call，关键
:0045EBCF 84C0 test al, al
:0045EBD1 745B je 0045EC2E <--如果al=0那么程序就报错了
————————————————————————————————————————————
/* 中间的这一部分是显示注册成功的代码段，这里省略，歉 */
————————————————————————————————————————————
* Possible StringData Ref from Code Obj ->"You entered an incorrect registration "
->"key. Please try again."
:0045EC2E B8B4EC4500 mov eax, 0045ECB4
:0045EC33 E820EDFEFF call 0044D958

上面的Call 0045e790为真正注册码演算比较子过程，里面的程序我看了，好复杂哦，跟的
我差点没有信心了，不过还是坚持过来了。。 ：）））） 就是这个Call，看去了我一个上午的
时间。。天啦，时间宝贵啊。。。嘿嘿。好了，闲话少说，言归正传：

【算法分析】
1）假设你输入的Virtual Code是：3219486678905858 （为何要是16位，后面给出说明）。
程序从第1个字符起把相邻的2个进行预处理合并成一个字符。如32两个字符，用
0x33<<4+0x32-0x30=0x32；下面一个是19两个字符，用0x31<<4 + 0x39 - 0x30 = 0x19，
那么处理完后，得到一个新的字符串：0x32,0x19,0x48,0x66,0x78,0x90,0x58,0x58 共八
个字符。

2）然后再将这八个字符进行一系列xor处理（好好好复杂哦，看的头都大了），重新得到一
个新的字符串，长度仍然是8个。新的字符串再与0xDB,0x35,0x25,0x0A,0x90,0xE8,0x3C,
0x9D 这个字符串分别xor，得到的新的字符串看看里面是不是包含了v:1.0 （0x76,0x3A,
0x31,0x2E,0x30）和m:g （,0x6D,0x3A,0x67）这两个子字符串。如果有，那么注册成功，
否则弹出注册错误的对话框。换句话说，如果我们可以让预先输入的Virtual Code在经过
一系列的运算以后，等于v:1.0m:g这个字符串的话，那么我们就能够注册成功。

3）经过一个上午的艰苦工作，我得到了一个字符串0x98,0xB1,0x41,0x06,0x82,0x3A,0xBF,0x29，
如果我们把输入的Virtual Code经过合并预处理之后（也就是我们第1步所得到的）能等于
这个字符串的话，那么我们就胜利了。。。哈，你们笑，我可是哭着得到这个黄金字符串
的。

4）先不管3721，手动做一个注册码出来再说，我做的是：987q4106821Z8o29 嘿嘿

5）算法明了，那么下面就要写注册机啦。。呵呵

【注册机】

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

unsigned char gold_str[] = {0x98,0xB1,0x41,0x06,0x82,0x3A,0xBF,0x29}; /* 黄金字符串 :) */
unsigned char code_str[] = "987q4106821Z8o29";
unsigned char ch1,ch2,ch3;
int k = 0, number = 1;

void main() {
printf("\nCopyRight by chn-boy ['y' to continue] : \n"); /* 先留个版权再说，哈哈 */
randomize();
do {
for(k=0;k<8;k++) {
ch1 = (gold_str[k]>>4) + 3; /* 3的意思就是0x30，详细请看算法分析 */
ch2 = gold_str[k] & 0x0F;
ch3 = (unsigned char)(random(6)+2); /* ch3为偶数位字符的高4bit的值 */
ch1 -= ch3; /* 此处ch1为奇数位字符的低4bit的值 */
ch2 += (ch3 << 4); /* 此处的ch2为随机得到的偶数位字符 */
ch3 = (unsigned char)(random(6)+2); /* 此处的ch3为奇数位字符随机的高4bit值 */
ch1 += (ch3 << 4);
code_str[k*2] = ch1;
code_str[k*2+1] = ch2;
}
printf("\n The %3dth Code is: %s\n", number, code_str);
number++;
}while(getch()=='y');
}


ePublisher Gold v1.4

标 题:ePublisher Gold v1.4 (9千字)
发信人:blowfish
时 间:2001-1-15 18:06:58
详细信息:
URL: search in http://www.google.com

首先找到判断注册码的地方，如下。文件Reg.dat显然是用来存放注册码的。
//---------------------------------------------------------------------------
* Possible StringData Ref from Code Obj ->"Reg.dat"
|
:0045EB77 BA84EC4500 mov edx, 0045EC84
:0045EB7C E83F50FAFF call 00403BC0
:0045EB81 8B952CFEFFFF mov edx, dword ptr [ebp+FFFFFE2C]
:0045EB87 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EB8D E8F06BFAFF call 00405782
:0045EB92 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EB98 E8116EFAFF call 004059AE
:0045EB9D E8DA3BFAFF call 0040277C
:0045EBA2 8B55FC mov edx, dword ptr [ebp-04]
:0045EBA5 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EBAB E84053FAFF call 00403EF0
:0045EBB0 E8486CFAFF call 004057FD
:0045EBB5 E8C23BFAFF call 0040277C
:0045EBBA 8D8530FEFFFF lea eax, dword ptr [ebp+FFFFFE30]
:0045EBC0 E85F6CFAFF call 00405824
:0045EBC5 E8B23BFAFF call 0040277C
:0045EBCA E8C1FBFFFF call 0045E790
:0045EBCF 84C0 test al, al
:0045EBD1 745B je 0045EC2E

* Possible StringData Ref from Code Obj ->"Thank you for registering "
|
:0045EBD3 BA8CEC4500 mov edx, 0045EC8C
:0045EBD8 8D8528FDFFFF lea eax, dword ptr [ebp+FFFFFD28]
:0045EBDE E8513DFAFF call 00402934
:0045EBE3 8D8528FCFFFF lea eax, dword ptr [ebp+FFFFFC28]
:0045EBE9 50 push eax

* Reference To: epgname.ShellExecuteA, Ord:0001h
|
:0045EBEA E829EBFFFF Call 0045D718
:0045EBEF 8D9528FCFFFF lea edx, dword ptr [ebp+FFFFFC28]
:0045EBF5 8D8528FDFFFF lea eax, dword ptr [ebp+FFFFFD28]
:0045EBFB E80C3DFAFF call 0040290C
:0045EC00 BAA8EC4500 mov edx, 0045ECA8
:0045EC05 8D8528FDFFFF lea eax, dword ptr [ebp+FFFFFD28]
:0045EC0B E8FC3CFAFF call 0040290C
:0045EC10 8D9528FDFFFF lea edx, dword ptr [ebp+FFFFFD28]
:0045EC16 8D852CFEFFFF lea eax, dword ptr [ebp+FFFFFE2C]
:0045EC1C E83B4FFAFF call 00403B5C
:0045EC21 8B852CFEFFFF mov eax, dword ptr [ebp+FFFFFE2C]
:0045EC27 E82CEDFEFF call 0044D958
:0045EC2C EB0A jmp 0045EC38

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045EBD1(C)
|

* Possible StringData Ref from Code Obj ->"You entered an incorrect registration "
->"key. Please try again."
|
:0045EC2E B8B4EC4500 mov eax, 0045ECB4
:0045EC33 E820EDFEFF call 0044D958
//-----------------------------------------------------------------------------------------------
跟进上面的call 0045E790（IDA告诉我们上述代码是TOrderForm的成员函数OkButtonClick( )的一部分）。这里
它两次调用LStrPos( )函数检查同一个字节串中是否同时包含字符串“v:1.0”和“m:g”，如果是的话则返回1，
表明注册码正确。
//------------------------------------------------------------------------------------------------
sub_45E790 proc near ; CODE XREF: _TOrderForm_OkButtonClick+166
; sub_45F098+1F ...

var_4 = dword ptr -4

push ebp
mov ebp, esp
push 0
push ebx
xor eax, eax
push ebp
push offset loc_45E7EA
push dword ptr fs:[eax]
mov fs:[eax], esp
lea eax, [ebp+var_4]
call sub_45E51C
mov edx, [ebp+var_4]
mov eax, offset _str_v_1_0.Text
call @System@@LStrPos$qqrv ; System __linkproc__ LStrPos(void)
test eax, eax
jle short loc_45E7CE
mov edx, [ebp+var_4]
mov eax, offset _str_m_g.Text
call @System@@LStrPos$qqrv ; System __linkproc__ LStrPos(void)
test eax, eax
jg short loc_45E7D2

loc_45E7CE:
xor ebx, ebx //返回0
jmp short loc_45E7D4
loc_45E7D2:
mov bl, 1 //返回1

loc_45E7D4:
xor eax, eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push offset loc_45E7F1

loc_45E7E1:
lea eax, [ebp+var_4]
call @System@@LStrClr$qqrr17System@AnsiString
retn

loc_45E7EA:
jmp @System@@HandleFinally$qqrv
loc_45E7F1:
mov eax, ebx
pop ebx
pop ecx
pop ebp
retn
sub_45E790 endp

align 4
_str_v_1_0 dd 0FFFFFFFFh ; _top ; DATA XREF: sub_45E790+1F
dd 5 ; Len
db 'v:1.0',0 ; Text
align 4
_str_m_g dd 0FFFFFFFFh ; _top ; DATA XREF: sub_45E790+30
dd 3 ; Len
db 'm:g',0 ; Text
//-----------------------------------------------------------------------------------------------
对上面所检查的那个字节串设一个“BPM xxxxxxxx W”断点，看一下该字节串是如何来的。最终会发现它是
根据我们输入的假注册码变换得来的。这说明我们的假注册码经过变换之后应包含字符串“v:1.0”和“m:g”。

下面要做的就是把这个变换搞清楚。经过跟踪，发现它先是把我们输入的注册码作为密文，用blowfish算法
对其进行解密，然后再将解密所得到的明文与一个固定的字节串（DB, 35, 25, 0A, 90, E8, 3C, 9D,...,
该串是blowfish算法产生的中间值）逐字节进行异或，异或的结果中应包含字符串“v:1.0”和“m:g”。
所以注册码应有很多个。

识别blowfish算法的一种方法就是靠它的那些常数表格，只要在内存中看到这些常数，基本上就可以确定
是blowfish算法（当然最终要分析算法本身才能确定）。例如blowfish的P-数组是18个32-bit的子密钥：
static const unsigned long P[16 + 2] =
{
0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
0x9216D5D9L, 0x8979FB1BL
};
其4个S-盒则包含共1024个32-bit的数。实际上该程序的反汇编列表中包含“Blowfish: Invalid key size - %d”、
“Blowfish: Not initialized”、“TDCP_blowfish”等含义明显的串，隐约也可以猜到。

识别出是blowfish算法之后，只需要知道下面几个东西就可以将其解开：
1、密钥。
2、使用的是加密算法还是解密算法。
3、算法的输入或输出值所要满足的条件。
因为数学家已经告诉了我们blowfish算法的加密和解密算法，我们并不需要去发明其逆算法（即使想破脑袋也想不出来的）。

如何找到第1个条件（即密钥）呢？因为该算法在初始化的时候要将P-数组和密钥进行循环异或，所以只要对最初的
P[0]（值为0x243F6A88L）设个BPM断点，就可以看见异或的地方，从而找到16字节的密钥：
Key = { 0x00, 0x37, 0x25, 0x5E, 0x76, 0x6B, 0x44, 0x30,0x7B, 0x5C, 0x7E, 0x73, 0x63, 0x26, 0x4D, 0x40};
//----------------------------------------------------------------------------------------------------
:0045C4AC 33FF xor edi, edi
:0045C4AE 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045C505(C)
|
:0045C4B0 8D4703 lea eax, dword ptr [edi+03]
:0045C4B3 99 cdq
:0045C4B4 F77DFC idiv [ebp-04]
:0045C4B7 8B45F8 mov eax, dword ptr [ebp-08]
:0045C4BA 33C9 xor ecx, ecx
:0045C4BC 8A0C10 mov cl, byte ptr [eax+edx] //密钥
:0045C4BF 8D4702 lea eax, dword ptr [edi+02]
:0045C4C2 99 cdq
:0045C4C3 F77DFC idiv [ebp-04]
:0045C4C6 8B45F8 mov eax, dword ptr [ebp-08]
:0045C4C9 0FB60410 movzx eax, byte ptr [eax+edx] //密钥
:0045C4CD C1E008 shl eax, 08
:0045C4D0 03C8 add ecx, eax
:0045C4D2 8D4701 lea eax, dword ptr [edi+01]
:0045C4D5 99 cdq
:0045C4D6 F77DFC idiv [ebp-04]
:0045C4D9 8B45F8 mov eax, dword ptr [ebp-08]
:0045C4DC 0FB60410 movzx eax, byte ptr [eax+edx] //密钥
:0045C4E0 C1E010 shl eax, 10
:0045C4E3 03C8 add ecx, eax
:0045C4E5 8B45F8 mov eax, dword ptr [ebp-08]
:0045C4E8 0FB60438 movzx eax, byte ptr [eax+edi] //密钥
:0045C4EC C1E018 shl eax, 18
:0045C4EF 03C8 add ecx, eax
:0045C4F1 318C9E50100000 xor dword ptr [esi+4*ebx+00001050], ecx //与P-数组异或
:0045C4F8 8D4704 lea eax, dword ptr [edi+04]
:0045C4FB 99 cdq
:0045C4FC F77DFC idiv [ebp-04]
:0045C4FF 8BFA mov edi, edx
:0045C501 43 inc ebx
:0045C502 83FB12 cmp ebx, 00000012 //P-数组有18个数
:0045C505 75A9 jne 0045C4B0
//--------------------------------------------------------------------------------------------
至于第2个条件，根本不用分析其算法，只需要自己写个程序把加密和解密算法都调用一下，并将输出和
该软件的算法输出对比一下就知道采用的是解密算法。

第3个条件比较简单，即blowfish算法的输入为假注册码，输出与一固定字节异或之后应包含“v:1.0”和“m:g”。

异或在如下的地方进行，在这里可以找到所需的固定字节串：
//--------------------------------------------------------------------------------------------
:0045B6CF 33F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045B6DF(C)
|
:0045B6D1 8A1C30 mov bl, byte ptr [eax+esi]
:0045B6D4 321C32 xor bl, byte ptr [edx+esi]
:0045B6D7 8B7DFC mov edi, dword ptr [ebp-04]
:0045B6DA 881C37 mov byte ptr [edi+esi], bl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045B724(C)
|
:0045B6DD 46 inc esi
:0045B6DE 49 dec ecx
:0045B6DF 75F0 jne 0045B6D1
//--------------------------------------------------------------------------------------------
有兴趣的自己写keymaker吧。


Exe Protect 1.0

 标 题:Exe Protect 1.0注册码 (1千字)
发信人:CrackerABC[BCG]
时 间:2001-5-8 15:48:27
详细信息:
Exe Protect 1.0注册码

Name: CrackerABC[BCG]
Code:$C34892C2

这是一个网友让我破解的，其实很简单，不到2分钟搞定。

下面是追踪过程：

1、Name：CrackerABC[BCG]
Code：12121212

2、启动TRW2000，然后使用搜索法

s 30:0 l ffffffff '12121212'
找到一个地址 *********
然后下 BPM 30:********

3、F5返回程序空间，点注册被拦截

4、下BD *

5、PMODULE后被拦截

6、然后一直按F10到下面的位置：

0167:00435788 CALL 0041B408
0167:0043578D MOV EDX,[EBP+FFFFFEEC]
0167:00435793 POP EAX //-------->D EDX 刚才输入的假注册码：12121212
0167:00435794 CALL 00403B98 //-------->D EAX 得到真注册码： $C34892C2
0167:00435799 JNZ NEAR 00435838
0167:0043579F LEA EDX,[EBP+FFFFFEEC]
0167:004357A5 MOV EAX,[EBX+01F8]

*************************************************

主页：http://crackerabc.longcity.net （[BCG]大本营）
http://sffs.533.net

软件破解，软件注册，破解教学，破解申请，注册机码。

请保留我的信息，谢谢！

**************************************************


EXE Protector v2.01a

标 题:EXE Protector v2.01a (1千字)
发信人:happyhackwang
时 间:2001-3-11 21:02:15
详细信息:
EXE Protector v2.01a crack by happyhackwang
软件名称:EXE Protector v2.01a
软件功能:给exe文件加密码
注册方式:name+serial
作者:Eyhab Hillail
作者主页:http://members.xoom.com/_The_Wizard
作者邮箱:_The_Wizard@geocities.com
破解者:happyhackwang
邮箱:happyhackwang@263.net
OICQ:4696993(不在线^^)
注册方式:get serial number
工具:softice,my head,ultraedit(to write this article)
特别感谢:Numega公司的softice!

进入程序,注册,填写
name:wanghl
serial:78787878

bpx __vbastrcomp
F8来到:
:6602486C 6801000300 push 00030001
:66024871 FF742408 push [esp+08]
:66024875 FF742410 push [esp+10]
:66024879 FF742418 push [esp+18]
:6602487D FF1574FE1066 call dword ptr [6610FE74] ;进去看

(在oleaut32.dll中)
:653C2E23 8B7D0C mov edi, dword ptr [ebp+0C] ;真正的serial
:653C2E26 8B7508 mov esi, dword ptr [ebp+08] ;我输入的serial
:653C2E29 8B4D10 mov ecx, dword ptr [ebp+10]
:653C2E2C 33C0 xor eax, eax
:653C2E2E F3 repz
:653C2E2F 66A7 cmpsw
:653C2E31 7405 je 653C2E38

name:wanghl
serial:2000-nsw-11814

注册以后在注册表中添加:
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\EXE Protector v2.01a\User Info]
"User Name"="wanghl"

也就是说你只要在注册表中这个主键下建立一个字符串"User Name",内容随你写,就注册啦!
真是愚昧的保护!

当你给一个应用程序.exe加密码,可以bpx hmemcpy
一直到
004045CA E879CEFFFF Call 00401448
004045CF 85C0 test eax, eax;change to xor eax,eax
004045D1 0F8585000000 jne 0040465C;so anything can pass!

当然也可以用oleaut32.dll中的VarBstrCmp中断,看真正的密码

*********************************世间本无事,庸人自扰耳************************************


eXeScope

 标 题:破解心得之eXeScope篇 (9千字)
发信人:时空幻影
时 间:2001-7-1 14:36:00
详细信息:
破解心得之eXeScope篇

作者：时空幻影
时间：2001年6月26日
使用工具：Fileinfo v2.43、W32DSM白金版汉化版、TRW2000 v1.22

由于这个软件没有加壳，因此破解相对容易一些，且注册算法也不复杂，很适合初学者破解。
先执行TRW2000，然后运行该软件，填好Your Name和ID后，按Ctrl+N激活TRW2000，然后键入"BPX HMEMCPY"，
按F5跳回程序，然后点OK就会被拦下，再键入"pmodule"，继续按F10。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A7BAA(C)
|
:004A7BBE 8D55F0 lea edx, dword ptr [ebp-10]
:004A7BC1 8B45FC mov eax, dword ptr [ebp-04]
:004A7BC4 8B80D0020000 mov eax, dword ptr [eax+000002D0]
:004A7BCA E885B7F8FF call 00433354
:004A7BCF 8B55F0 mov edx, dword ptr [ebp-10] <--经过几个RET以后来到这里
:004A7BD2 A1B8594B00 mov eax, dword ptr [004B59B8]
:004A7BD7 E830C0F5FF call 00403C0C
:004A7BDC 8D55EC lea edx, dword ptr [ebp-14]
:004A7BDF 8B45FC mov eax, dword ptr [ebp-04]
:004A7BE2 8B80D4020000 mov eax, dword ptr [eax+000002D4]
:004A7BE8 E867B7F8FF call 00433354
:004A7BED 8B55EC mov edx, dword ptr [ebp-14]
:004A7BF0 A134594B00 mov eax, dword ptr [004B5934]
:004A7BF5 E812C0F5FF call 00403C0C
:004A7BFA 8B1534594B00 mov edx, dword ptr [004B5934]
:004A7C00 8B12 mov edx, dword ptr [edx]
:004A7C02 A174574B00 mov eax, dword ptr [004B5774]
:004A7C07 8B00 mov eax, dword ptr [eax]
:004A7C09 E8DA8D0000 call 004B09E8 <--核心CALL，按F8进入
:004A7C0E 84C0 test al, al
:004A7C10 0F8498000000 je 004A7CAE <--一定不能跳转
:004A7C16 A1B8594B00 mov eax, dword ptr [004B59B8]
:004A7C1B 8B00 mov eax, dword ptr [eax]
:004A7C1D E816C2F5FF call 00403E38
:004A7C22 85C0 test eax, eax
:004A7C24 0F8E84000000 jle 004A7CAE <--一定不能跳转
:004A7C2A 8D55E4 lea edx, dword ptr [ebp-1C]
:004A7C2D A1C4594B00 mov eax, dword ptr [004B59C4]
:004A7C32 8B00 mov eax, dword ptr [eax]
:004A7C34 E82F9BFAFF call 00451768
:004A7C39 8B45E4 mov eax, dword ptr [ebp-1C]
:004A7C3C 8D4DE8 lea ecx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->".ini"
|
:004A7C3F BA0C7D4A00 mov edx, 004A7D0C
:004A7C44 E8F319F6FF call 0040963C
:004A7C49 8B4DE8 mov ecx, dword ptr [ebp-18]
:004A7C4C B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"XuG"
|
:004A7C4E A1906E4700 mov eax, dword ptr [00476E90]
:004A7C53 E8E0F2FCFF call 00476F38
:004A7C58 8945F8 mov dword ptr [ebp-08], eax
:004A7C5B A1B8594B00 mov eax, dword ptr [004B59B8]
:004A7C60 8B00 mov eax, dword ptr [eax]
:004A7C62 50 push eax

* Possible StringData Ref from Code Obj ->"Name"
|
:004A7C63 B91C7D4A00 mov ecx, 004A7D1C

* Possible StringData Ref from Code Obj ->"Reg"
|
:004A7C68 BA2C7D4A00 mov edx, 004A7D2C
:004A7C6D 8B45F8 mov eax, dword ptr [ebp-08]
:004A7C70 8B18 mov ebx, dword ptr [eax]
:004A7C72 FF5304 call [ebx+04]
:004A7C75 A134594B00 mov eax, dword ptr [004B5934]
:004A7C7A 8B00 mov eax, dword ptr [eax]
:004A7C7C 50 push eax

* Possible StringData Ref from Code Obj ->"Reg"
|
:004A7C7D BA2C7D4A00 mov edx, 004A7D2C
:004A7C82 B9387D4A00 mov ecx, 004A7D38
:004A7C87 8B45F8 mov eax, dword ptr [ebp-08]
:004A7C8A 8B18 mov ebx, dword ptr [eax]
:004A7C8C FF5304 call [ebx+04]
:004A7C8F 8B45F8 mov eax, dword ptr [ebp-08]
:004A7C92 E83DB2F5FF call 00402ED4
:004A7C97 A17C574B00 mov eax, dword ptr [004B577C]
:004A7C9C C60001 mov byte ptr [eax], 01
:004A7C9F 8B45FC mov eax, dword ptr [ebp-04]
:004A7CA2 C7803402000001000000 mov dword ptr [ebx+00000234], 00000001
:004A7CAC EB20 jmp 004A7CCE

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004A7C10(C), :004A7C24(C)
|
:004A7CAE 6A00 push 00000000
:004A7CB0 8D55E0 lea edx, dword ptr [ebp-20]

* Possible StringData Ref from Code Obj ->"Invalid ID or Name;搊榐ID傑偨偼柤慜偑柍岠偱偡" <--错误信息对话框
|
:004A7CB3 B8447D4A00 mov eax, 004A7D44
:004A7CB8 E8D79D0000 call 004B1A94
:004A7CBD 8B45E0 mov eax, dword ptr [ebp-20]
:004A7CC0 668B0D747D4A00 mov cx, word ptr [004A7D74]
:004A7CC7 B201 mov dl, 01
:004A7CC9 E88E01FBFF call 00457E5C

在上面的核心CALL按F8进入后会来到如下地方：
* Referenced by a CALL at Addresses:
|:004A7C09 , :004B088C
|
:004B09E8 55 push ebp
:004B09E9 8BEC mov ebp, esp
:004B09EB 83C4F0 add esp, FFFFFFF0
:004B09EE 8955F8 mov dword ptr [ebp-08], edx
:004B09F1 8945FC mov dword ptr [ebp-04], eax
:004B09F4 8B45F8 mov eax, dword ptr [ebp-08]
:004B09F7 E8F035F5FF call 00403FEC
:004B09FC 33C0 xor eax, eax
:004B09FE 55 push ebp
:004B09FF 689F0A4B00 push 004B0A9F
:004B0A04 64FF30 push dword ptr fs:[eax]
:004B0A07 648920 mov dword ptr fs:[eax], esp
:004B0A0A C645F700 mov [ebp-09], 00
:004B0A0E 8B45F8 mov eax, dword ptr [ebp-08]
:004B0A11 E82234F5FF call 00403E38 <--求ID长度
:004B0A16 83F80A cmp eax, 0000000A <--判断ID的长度是否等于10
:004B0A19 756E jne 004B0A89 <--不等的话跳转，一定不能跳转
:004B0A1B 8B55F8 mov edx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"A1910"
|
:004B0A1E B8B80A4B00 mov eax, 004B0AB8 <--[004B0AB8]为"A1910"
:004B0A23 E8FC36F5FF call 00404124 <--判断ID的前五个字符是否为"A1910"
:004B0A28 48 dec eax
:004B0A29 7410 je 004B0A3B
:004B0A2B 8B55F8 mov edx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"A1423"
|
:004B0A2E B8C80A4B00 mov eax, 004B0AC8 <--[004B0AC8]为"A1423"
:004B0A33 E8EC36F5FF call 00404124 <--判断ID的前五个字符是否为"A1423"
:004B0A38 48 dec eax
:004B0A39 754E jne 004B0A89 <--这个一定不能跳转

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B0A29(C)
|
:004B0A3B C745F002000000 mov [ebp-10], 00000002

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B0A65(C)
|
:004B0A42 8B45F8 mov eax, dword ptr [ebp-08]
:004B0A45 8B55F0 mov edx, dword ptr [ebp-10]
:004B0A48 8A4410FF mov al, byte ptr [eax+edx-01]
:004B0A4C 3C30 cmp al, 30
:004B0A4E 7239 jb 004B0A89
:004B0A50 8B45F8 mov eax, dword ptr [ebp-08]
:004B0A53 8B55F0 mov edx, dword ptr [ebp-10]
:004B0A56 8A4410FF mov al, byte ptr [eax+edx-01]
:004B0A5A 3C39 cmp al, 39
:004B0A5C 772B ja 004B0A89
:004B0A5E FF45F0 inc [ebp-10]
:004B0A61 837DF00B cmp dword ptr [ebp-10], 0000000B
:004B0A65 75DB jne 004B0A42
:004B0A67 8B45F8 mov eax, dword ptr [ebp-08]
:004B0A6A 0FB64008 movzx eax, byte ptr [eax+08] <--输入的ID的倒数第二个字符的ASCII码送入EAX
:004B0A6E 8B55F8 mov edx, dword ptr [ebp-08]
:004B0A71 0FB65209 movzx edx, byte ptr [edx+09] <--输入的ID的倒数最后一个字符的ASCII码送入EDX
:004B0A75 03C2 add eax, edx
:004B0A77 B90A000000 mov ecx, 0000000A
:004B0A7C 33D2 xor edx, edx
:004B0A7E F7F1 div ecx <--EAX除以10
:004B0A80 83FA04 cmp edx, 00000004 <--比较余数是否等于4
:004B0A83 7504 jne 004B0A89 <--不等于4的话则跳转，一定不能跳转
:004B0A85 C645F701 mov [ebp-09], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004B0A19(C), :004B0A39(C), :004B0A4E(C), :004B0A5C(C), :004B0A83(C)
|
:004B0A89 33C0 xor eax, eax
:004B0A8B 5A pop edx
:004B0A8C 59 pop ecx
:004B0A8D 59 pop ecx
:004B0A8E 648910 mov dword ptr fs:[eax], edx
:004B0A91 68A60A4B00 push 004B0AA6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B0AA4(U)
|
:004B0A96 8D45F8 lea eax, dword ptr [ebp-08]
:004B0A99 E81A31F5FF call 00403BB8
:004B0A9E C3 ret

现在我们知道了注册码的形式为A1910xxxxx或A1423xxxxx，其中第6、7、8个字符为任意字符，而第9、10个字符的ASCII
码的和的个位数为4就可以正确的注册了！！！


eXeScope ver6.00

标 题:eXeScpe是不是有时间限制?第一次破解成功,请大侠们指点 (5千字)
发信人:Dickie
时 间:2001-2-9 15:07:14
详细信息:
破解eXeScope ver6.00
目标软件:eXeScope ver6.00
软件作用:小巧强大的汉化(破解)工具，可以直接修改用 VC++ 及 DELPHI 编制的程序的资源，包括菜单、对话框、字串表等.软件提示不注册的话可用2星期 .
破解工具:TRW2000
1.粗追踪:
运行TRW2000 eXeScope,注册名:Dickie 注册码:78787878
Ctrl+N 唤出trw
bpx hmemcpy 设断
g
按eXeScope注册框的确定,程序被拦截!
bc * 取消断点
PMODULE 来到eXeScope上空
程序开始于004253b1,按8次f12后出现错误提示,程序结束于:0048088b
2.细追踪:
拦截后,按7次f12后来到0048079a
按f10走过3个CALL后来到这里

:004807D1 call 00488130 |调用后面有一个检查al是否为空,是就怎样,
:004807D6 test al, al |不是又怎样,比较可疑,先记下,
:004807D8 je 0048086B |果然跳了就会die

****************************************************************************************************************
:00488130 push ebp ||按f8进入CALL 00488130
:00488131 mov ebp, esp
:00488133 push ecx
:00488134 push ebx
:00488135 mov dword ptr [ebp-04], edx
:00488138 mov eax, dword ptr [ebp-04]
:0048813B call 00403D30
:00488140 xor eax, eax
:00488142 push ebp
:00488143 push 004881B2
:00488148 push dword ptr fs:[eax]
:0048814B mov dword ptr fs:[eax], esp
:0048814E xor ebx, ebx
:00488150 mov eax, dword ptr [ebp-04]
:00488153 call 00403B7C
:00488158 cmp eax, 0000000A |此刻eax里是你的注册码位数,和0A比较不是就跳(die),
:0048815B jne 0048819C |所以修正注册码为7878787878
:0048815D mov edx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"A1910"
|
:00488160 mov eax, 004881C8 |将A1910放进[eax]
:00488165 call 00403E08 |可疑,进去看看,不然就~~~~~
:0048816A dec eax
:0048816B je 0048817D
:0048816D mov edx, dword ptr [ebp-04]

###################################################################################################################
:00403E08 test eax, eax |进入CALL 00403E08
:00403E0A je 00403E4C
:00403E0C test edx, edx
:00403E0E je 00403E41
:00403E10 push ebx
:00403E11 push esi
:00403E12 push edi
:00403E13 mov esi, eax |此刻A1910放进[esi]
:00403E15 mov edi, edx |我的pw放进[edi]
:00403E17 mov ecx, dword ptr [edi-04] |将我注册码位数(就是A)放进ecx
:00403E1A push edi
:00403E1B mov edx, dword ptr [esi-04] |将A1910位数(就是5)放进edx
:00403E1E dec edx |
:00403E1F js 00403E3C |no jump
:00403E21 mov al, byte ptr [esi] |把A放入al
:00403E23 inc esi |并指向A1910里的第二位
:00403E24 sub ecx, edx |A-5=5放入ecx,看了后面就知道作计数器
:00403E26 jle 00403E3C |no jump

:00403E28 repnz scasb |在你的注册码前5位找有没有A
:00403E2A jne 00403E3C |没有就会跳(die)
:00403E2C mov ebx, ecx
:00403E2E push esi
:00403E2F push edi
:00403E30 mov ecx, edx
:00403E32 repz cmpsb |将你注册码的2,3,4,5位和1910比较
:00403E34 pop edi
:00403E35 pop esi
:00403E36 je 00403E44 |如果是就跳,于是再次修正注册码:A191078787
……
:00403E44 pop edx |蹦到了这里
:00403E45 mov eax, edi |此刻eax指向注册码中的第二位,edx指向第一位
:00403E47 sub eax, edx |相减得1,放在eax里
:00403E49 pop edi
:00403E4A pop esi
:00403E4B pop ebx
:00403E4C ret |返回CALL 00403E08 (到0048816a处)
###################################################################################################################
:0048816A dec eax |这里(eax)=0
:0048816B je 0048817D |跳~~~
……
:0048817D mov eax, dword ptr [ebp-04] <----|这一段是把你注册码9,10位的ASCⅡ值相加
:00488180 movzx eax, byte ptr [eax+08] |然后除以0A,所得余数和04比较,相同就
:00488184 mov edx, dword ptr [ebp-04] |将1放入BL,所以码值和为68比较合适
:00488187 movzx edx, byte ptr [edx+09] |也就是说注册码最后2位和为8
:0048818B add eax, edx |修正注册码:A191078708
:0048818D mov ecx, 0000000A |
:00488192 cdq |
:00488193 idiv ecx |
:00488195 cmp edx, 00000004 |
:00488198 jne 0048819C |
:0048819A mov bl, 01 <----|
……
:004881B9 mov eax, ebx |将那个BL放入AL
……
:004881BE ret |返回CALL 00488130 (就是本文开始说的地方)
****************************************************************************************************************
:004807D6 test al, al
:004807D8 je 0048086B |这里没有跳,就注册成功!
……
总结:
注册名:Dickie(可为任意)注册码:A1910***08(*为任意,末2位的和应为8)
注:注册码也适用eXeScope 6.10

最后要说的是写破解过程真的很累，看雪学苑那么多的教程都是前辈们辛苦整理的，向他们致敬！
Dickie.01.02.09


FAR

标 题:初学者请进，看far.exe的注册码！ (7千字)
发信人:南木
时 间:2001-4-24 21:58:24
详细信息:
想注册swish 2.0（特好的flash字体特效软件）,终因功力太浅，未能如愿，很痛苦！！！
发了几次帖子，向各个大虾们求助，没有人回应，更加痛苦！！！！！！！！！！！

特找来一个简单的软件（Far.exe,制作帮助文件），增强点信心。大虾们就此掉头，可下一个swish v2.0 一试身手！初学者，想看请继续。

:005311F0 50 push eax
:005311F1 8B4DF4 mov ecx, dword ptr [ebp-0C]
:005311F4 8B55F8 mov edx, dword ptr [ebp-08]
:005311F7 8B45FC mov eax, dword ptr [ebp-04]
:005311FA E82D17FAFF call 004D292C---------------------关键Call! 记为*2
:005311FF 8806 mov byte ptr [esi], al
:00531201 803E00 cmp byte ptr [esi], 00
:00531204 744D je 00531253 ------------------------跳就死！
:00531206 8B45F4 mov eax, dword ptr [ebp-0C]
:00531209 E82610FAFF call 004D2234
:0053120E 8B158C105700 mov edx, dword ptr [0057108C]
:00531214 52 push edx
:00531215 50 push eax
:00531216 8D45E8 lea eax, dword ptr [ebp-18]
:00531219 50 push eax
:0053121A 8B0D8CEA5600 mov ecx, dword ptr [0056EA8C]
:00531220 8B09 mov ecx, dword ptr [ecx]
:00531222 8B55F8 mov edx, dword ptr [ebp-08]
:00531225 8B45FC mov eax, dword ptr [ebp-04]
:00531228 E89F15FAFF call 004D27CC

* Possible StringData Ref from Data Obj ->"?M"
|
:0053122D A108E95600 mov eax, dword ptr [0056E908]
:00531232 8B158C105700 mov edx, dword ptr [0057108C]
:00531238 8B5490FC mov edx, dword ptr [eax+4*edx-04]
:0053123C 8D45E4 lea eax, dword ptr [ebp-1C]

* Possible StringData Ref from Data Obj ->" Registered OK."
|
:0053123F B908135300 mov ecx, 00531308
:00531244 E81F2EEDFF call 00404068
:00531249 8B45E4 mov eax, dword ptr [ebp-1C]
:0053124C E883B4F2FF call 0045C6D4
:00531251 EB0A jmp 0053125D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00531204(C)
|
* Possible StringData Ref from Data Obj ->"Invalid entry. Please enter the " -----------记为*1
->"correct codes."
|
:00531253 B820135300 mov eax, 00531320
:00531258 E877B4F2FF call 0045C6D4

追入关键Call:
:004D292C 55 push ebp
:004D292D 8BEC mov ebp, esp
:004D292F 83C4B8 add esp, FFFFFFB8
:004D2932 53 push ebx
:004D2933 56 push esi
:004D2934 33DB xor ebx, ebx
:004D2936 895DF0 mov dword ptr [ebp-10], ebx
:004D2939 894DF4 mov dword ptr [ebp-0C], ecx
:004D293C 8955F8 mov dword ptr [ebp-08], edx
:004D293F 8945FC mov dword ptr [ebp-04], eax
:004D2942 8B7508 mov esi, dword ptr [ebp+08]
:004D2945 8B45FC mov eax, dword ptr [ebp-04]
:004D2948 E88318F3FF call 004041D0
:004D294D 8B45F8 mov eax, dword ptr [ebp-08]
:004D2950 E87B18F3FF call 004041D0
:004D2955 8B45F4 mov eax, dword ptr [ebp-0C]
:004D2958 E87318F3FF call 004041D0
:004D295D 8B450C mov eax, dword ptr [ebp+0C]
:004D2960 E86B18F3FF call 004041D0
:004D2965 33C0 xor eax, eax
:004D2967 55 push ebp
:004D2968 68262A4D00 push 004D2A26
:004D296D 64FF30 push dword ptr fs:[eax]
:004D2970 648920 mov dword ptr fs:[eax], esp
:004D2973 8B45F4 mov eax, dword ptr [ebp-0C]
:004D2976 E8B9F8FFFF call 004D2234
:004D297B 8BD8 mov ebx, eax
:004D297D 8B45FC mov eax, dword ptr [ebp-04]
:004D2980 8945C8 mov dword ptr [ebp-38], eax
:004D2983 C645CC0B mov [ebp-34], 0B
:004D2987 8B45F8 mov eax, dword ptr [ebp-08]
:004D298A 8945D0 mov dword ptr [ebp-30], eax
:004D298D C645D40B mov [ebp-2C], 0B
:004D2991 8B45F4 mov eax, dword ptr [ebp-0C]
:004D2994 8945D8 mov dword ptr [ebp-28], eax
:004D2997 C645DC0B mov [ebp-24], 0B
:004D299B 8B450C mov eax, dword ptr [ebp+0C]
:004D299E 8945E0 mov dword ptr [ebp-20], eax
:004D29A1 C645E40B mov [ebp-1C], 0B
:004D29A5 8975E8 mov dword ptr [ebp-18], esi
:004D29A8 C645EC00 mov [ebp-14], 00
:004D29AC 8D55C8 lea edx, dword ptr [ebp-38]
:004D29AF B904000000 mov ecx, 00000004

* Possible StringData Ref from Data Obj ->"ValidateRegistrationInfo(%s,%s,%s,%s,%d)"
|
:004D29B4 B8402A4D00 mov eax, 004D2A40
:004D29B9 E87A86FBFF call 0048B038
:004D29BE 8B45F4 mov eax, dword ptr [ebp-0C]
:004D29C1 8945B8 mov dword ptr [ebp-48], eax
:004D29C4 C645BC0B mov [ebp-44], 0B
:004D29C8 895DC0 mov dword ptr [ebp-40], ebx
:004D29CB C645C400 mov [ebp-3C], 00
:004D29CF 8D55B8 lea edx, dword ptr [ebp-48]
:004D29D2 B901000000 mov ecx, 00000001

* Possible StringData Ref from Data Obj ->" GetUserNumberFromKey(%s) = %d"
|
:004D29D7 B8742A4D00 mov eax, 004D2A74
:004D29DC E85786FBFF call 0048B038
:004D29E1 53 push ebx
:004D29E2 8D45F0 lea eax, dword ptr [ebp-10]
:004D29E5 50 push eax
:004D29E6 8BCE mov ecx, esi
:004D29E8 8B55F8 mov edx, dword ptr [ebp-08]
:004D29EB 8B45FC mov eax, dword ptr [ebp-04]
:004D29EE E8A9F9FFFF call 004D239C
:004D29F3 8B55F4 mov edx, dword ptr [ebp-0C]
:004D29F6 8B45F0 mov eax, dword ptr [ebp-10] -----------------注意啊！！！！！
:004D29F9 E88E6FF3FF call 0040998C -----------------db eax 看注册码！！记为*3
:004D29FE 85C0 test eax, eax
:004D2A00 0F94C3 sete bl
:004D2A03 33C0 xor eax, eax
:004D2A05 5A pop edx
:004D2A06 59 pop ecx
:004D2A07 59 pop ecx
:004D2A08 648910 mov dword ptr fs:[eax], edx
:004D2A0B 682D2A4D00 push 004D2A2D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D2A2B(U)
|
:004D2A10 8D45F0 lea eax, dword ptr [ebp-10]
:004D2A13 BA04000000 mov edx, 00000004
:004D2A18 E8A313F3FF call 00403DC0
:004D2A1D 8D450C lea eax, dword ptr [ebp+0C]
:004D2A20 E87713F3FF call 00403D9C
:004D2A25 C3 ret

总结：

1.fi查看far.exe用upx压缩，脱壳后由727k 变为2.40M,(压缩的厉害）
2.w32asm反汇编，找“invalid entry”来到*1处，向上来到*2处，跟入:005311FA E82D17FAFF call 004D292C
来到*3处，db eax 看注册码。
3.注册文件为同目录下”注册码.id"文件。具体算法未搞清楚，但由
四部分组成：FAR22-*****-00000-*****.第二部分为你的e-mail地址的前5位，第四部分未弄明白。


Fast Email Searcher V1.0

 标 题:破解：Fast Email Searcher V1.0 (价值580元！) (2千字)
发信人:mazhenyu
时 间:2001-8-17 12:24:51
详细信息:
软件下载：http://www.ipaopao.com/software/

首先找到ppfes.exe的注册错误提示信息：“Registration Code ERR”
因为真假注册码比较以后才会出现这个提示

========

W32Dasm反汇编和TRW2000一起使用

* 用language查看，程序没有加壳
* 用W32Dasm反汇编，根据“串式参考”找到注册错误提示信息“Registration Code ERR”，双击

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461CB4(C)
|
:00461DBA 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"警告!"
|
:00461DBC B97C1E4600 mov ecx, 00461E7C

* Possible StringData Ref from Code Obj ->"Registration Code ERR!"
|
:00461DC1 BA841E4600 mov edx, 00461E84
:00461DC6 A16C7F4600 mov eax, dword ptr [00467F6C]
:00461DCB 8B00 mov eax, dword ptr [eax]
:00461DCD E8BE0BFEFF call 00442990

发现是从00461CB4跳转过来的，鼠标右键双击00461CB4

:00461C93 8B8598FDFFFF mov eax, dword ptr [ebp+FFFFFD98]
:00461C99 50 push eax
:00461C9A 8D9594FDFFFF lea edx, dword ptr [ebp+FFFFFD94]
:00461CA0 8B45FC mov eax, dword ptr [ebp-04]
:00461CA3 E830DBFFFF call 0045F7D8
:00461CA8 8B9594FDFFFF mov edx, dword ptr [ebp+FFFFFD94]
:00461CAE 58 pop eax

:00461CAF E8AC21FAFF call 00403E60

:00461CB4 0F8500010000 jne 00461DBA
:00461CBA 33D2 xor edx, edx
:00461CBC A1F89A4600 mov eax, dword ptr [00469AF8]
:00461CC1 E80EAAFDFF call 0043C6D4
:00461CC6 6890000000 push 00000090
:00461CCB 8D859FFDFFFF lea eax, dword ptr [ebp+FFFFFD9F]
:00461CD1 50 push eax

对照“风飘雪”的破解教程，发现可疑的关键Call在00461CAF

打开TRW2000

在ppfes.exe的注册栏中填入注册码“87654321”(注：“密钥”是自动生成的，我的为“bPfuFEVQUP1L2/==”)，但不点击“注册”

“Ctrl+N”激活TRW2000

在00461CAE处下断点：bpx 00461CAE，回车，然后按“F5”退出

点击ppfes.exe注册栏中的“注册”

程序被中断

按一下“F10”来到00461CAF

结果在00461CAF处找到真假注册码：
d eax=87654321
d edx=+tc48PbZ3Se/0HtI9ygoSy==

注意：这个24位的注册码是分两行出现的：
+tc48PbZ3Se/0HtI
9ygoSy==

用注册码“+tc48PbZ3Se/0HtI9ygoSy==”进行注册，注册成功！

太棒了！

马震宇
2001.8.16.


Fast Email Spider V1.06

 标 题:破解：Fast Email Spider V1.06 (价值580元！) (2千字)
发信人:mazhenyu
时 间:2001-8-17 13:00:46
详细信息:
软件下载：http://www.ipaopao.com/software/

首先找到fesweb.exe的注册错误提示信息：“Registration Code ERR”
因为真假注册码比较以后才会出现这个提示

========

W32Dasm反汇编和TRW2000一起使用

* 用language查看，程序没有加壳
* 用W32Dasm反汇编，根据“串式参考”找到注册错误提示信息“Registration Code ERR”，双击

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00465170(C)
|
:00465265 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"警告!"
|
:00465267 B908534600 mov ecx, 00465308

* Possible StringData Ref from Code Obj ->"Registration Code ERR!"
|
:0046526C BA10534600 mov edx, 00465310
:00465271 A188C14600 mov eax, dword ptr [0046C188]
:00465276 8B00 mov eax, dword ptr [eax]
:00465278 E8071BFEFF call 00446D84

发现是从00465170跳转过来的，鼠标右键双击00465170

:0046513E 8D9598FDFFFF lea edx, dword ptr [ebp+FFFFFD98]
:00465144 8B86D4020000 mov eax, dword ptr [esi+000002D4]
:0046514A E8053AFCFF call 00428B54
:0046514F 8B8598FDFFFF mov eax, dword ptr [ebp+FFFFFD98]
:00465155 50 push eax
:00465156 8D9594FDFFFF lea edx, dword ptr [ebp+FFFFFD94]
:0046515C 8B45FC mov eax, dword ptr [ebp-04]
:0046515F E8E0D7FFFF call 00462944
:00465164 8B9594FDFFFF mov edx, dword ptr [ebp+FFFFFD94]
:0046516A 58 pop eax

:0046516B E894ECF9FF call 00403E04

:00465170 0F85EF000000 jne 00465265
:00465176 6890000000 push 00000090
:0046517B 8D859FFDFFFF lea eax, dword ptr [ebp+FFFFFD9F]
:00465181 50 push eax

对照“风飘雪”的破解教程，发现可疑的关键Call在0046516B

打开TRW2000

在fesweb.exe的注册栏中填入注册码“87654321”(注：“密钥”是自动生成的，我的为“AAuDfXIQNJijeLw18aykhq==”)，但不点击“注册”

“Ctrl+N”激活TRW2000

在0046516A处下断点：bpx 0046516A，回车，然后按“F5”退出

点击fesweb.exe注册栏中的“注册”

程序被中断

按一下“F10”来到0046516B

结果在0046516B处找到真假注册码：
d eax=87654321
d edx=hW1Ti59tmyncjjGQbALXhvUlffxIO5n3

注意：这个32位的注册码是分两行出现的：
hW1Ti59tmyncjjGQ
bALXhvUlffxIO5n3

用注册码“hW1Ti59tmyncjjGQbALXhvUlffxIO5n3”进行注册，注册成功！

太棒了！

马震宇
2001.8.16.


File Protector 2000

 标 题:NYDoll[BCG]请进，愿对你有帮助。 (15千字)
发信人:8086[CCG]
时 间:2001-7-11 21:26:35
详细信息:
File Protector 2000的跟踪。

下载：http://gt.onlinedown.net/down/fp2000.zip （175K）
工具：SoftICE95，这里，请一定用它，为什么？看下去！
和我一样菜的FAN可以用这个软件来体会一下跋涉在汇编代码里的欢乐和痛苦！
此软件其实比较简单，收起暴破的大刀吧！GO GO GO！

name: Free User
Company: [CCG]
Product: 748748
输入完毕后，ctrl-d激活S-ICE，下bpx hmemcpy “X”回到程序，按register，S-ICE又出现了！
下指令bc * /屏障中断点
代码窗口的地址为XXXX：XXXX，这是在系统核心里，按F12，当出现XXXX：004XXXXX（或XXXX：005XXXXX，但这种情况很少）的地址时已大致来到了要跟踪的程序的核心里，这里是0187:5F40D247，又很少见，按F10，来到0187：0040C5ED且接下去的代码里看不见“RET”，说明已进入到了要跟踪的程序的核心里（如果下面几行的代码里有“RET”的指令，就继续按F12，直到看不见“RET”为止！当然，有时会“按飞”但可以不用“XX次F12减1”那样麻烦！）

* Reference To: MFC42.Ordinal:0F21, Ord:0F21h
|
:0040C621 E8285A0000 Call 0041204E
:0040C626 8D4C2418 lea ecx, dword ptr [esp+18]
:0040C62A 51 push ecx
:0040C62B 8D4C2410 lea ecx, dword ptr [esp+10]
:0040C62F E80C1C0000 call 0040E240
:0040C634 85C0 test eax, eax
:0040C636 751E jne 0040C656
:0040C638 50 push eax

* Possible StringData Ref from Data Obj ->"Error"
|
:0040C639 68D4724100 push 004172D4

* Possible StringData Ref from Data Obj ->"Registration failed !" /#$^*^%@#$%#%@@()

/很明显，40C636可跳过这里，那我们F8进入40C62F CALL 40E240！

:0040C62F E80C1C0000 call 0040E240 /进入

:0040E240 8B4C2404 mov ecx, dword ptr [esp+04]
:0040E244 83EC08 sub esp, 00000008
:0040E247 B02D mov al, 2D /初始化"al"="2d"="-" ，当代码窗口的光条来到这里时，请停下来，分析一下面的代码，40E24d那句的意图很明显，或者继续运行程序或者……！嘿嘿，下“D ECX”看见了什么？再下“D ECX+4”又看见什么？啊，我有点急了，我看见ECX+4是34（我们输入的748748的第5位数的HEX值），不要紧，用鼠标单击数据窗口的首行的首位“34”键入“2D”按“ESC”键光标回到S-ICE的输入指令的窗口，在轻按F10继续。
:0040E249 8A5104 mov dl, byte ptr [ecx+04] /取Product第5位到“dl”中，这时寄存器窗口：EAX=0000002D ，右下角还有DS：0065ECC8=2D（这就是我们刚才键入的“2D”呀！）S-ICE的这个显示有时会带来很有价值的东东，多多留意它，呵呵，知道为什么要用S-ICE吗？
:0040E24C 53 push ebx
:0040E24D 3AD0 cmp dl, al /Product第5位是“-”吗？是，肯定是，~~和和
:0040E24F 0F85AA020000 jne 0040E4FF /停下来，看看下一句在比较什么，啊，你已经在下“D ECX+7”了，并将数据窗口首行首位的“06”改成了“2D”，哈哈，真有你的。 注意大量出现的“jne 0040E4FF”，不能跳的，不信你就试试看：）
:0040E255 384107 cmp byte ptr [ecx+07], al /第8位是“-”吗？当然！
:0040E258 0F85A1020000 jne 0040E4FF /下D ECX+B 我又改！
:0040E25E 38410B cmp byte ptr [ecx+0B], al
:0040E261 0F8598020000 jne 0040E4FF /下D ECX+D 改，狂改！！！关键要理解这个“改”的前因后果，就这个软件而言，“改”可以找出全部的Product！“改”就一个字，我已说了多次 ^_^
:0040E267 38410D cmp byte ptr [ecx+0D], al
:0040E26A 0F858F020000 jne 0040E4FF
:0040E270 38411C cmp byte ptr [ecx+1C], al
:0040E273 0F8586020000 jne 0040E4FF /停下！！！下D ECX+F，将其改为（Hex）30~46之间。
:0040E279 8A410F mov al, byte ptr [ecx+0F] /取出Product的第16位到“al”
:0040E27C 3C30 cmp al, 30 /30=0
:0040E27E 0F8C7B020000 jl 0040E4FF /小于30就跳
:0040E284 3C46 cmp al, 46 /46=F
:0040E286 0F8F73020000 jg 0040E4FF /大于“F”就跳，此时Product的合法范围在（Hex）30~46之间。
:0040E28C 8A4110 mov al, byte ptr [ecx+10] 如
:0040E28F 3C30 cmp al, 30
:0040E291 0F8C68020000 jl 0040E4FF 法
:0040E297 3C46 cmp al, 46
:0040E299 0F8F60020000 jg 0040E4FF 炮
:0040E29F 8A4111 mov al, byte ptr [ecx+11]
:0040E2A2 3C30 cmp al, 30 制
:0040E2A4 0F8C55020000 jl 0040E4FF
:0040E2AA 3C46 cmp al, 46
:0040E2AC 0F8F4D020000 jg 0040E4FF
:0040E2B2 8A4112 mov al, byte ptr [ecx+12]
:0040E2B5 3C30 cmp al, 30
:0040E2B7 0F8C42020000 jl 0040E4FF
:0040E2BD 3C46 cmp al, 46
:0040E2BF 0F8F3A020000 jg 0040E4FF
:0040E2C5 8A4115 mov al, byte ptr [ecx+15]
:0040E2C8 3C30 cmp al, 30
:0040E2CA 0F8C2F020000 jl 0040E4FF
:0040E2D0 3C46 cmp al, 46
:0040E2D2 0F8F27020000 jg 0040E4FF
:0040E2D8 8A4116 mov al, byte ptr [ecx+16]
:0040E2DB 3C30 cmp al, 30
:0040E2DD 0F8C1C020000 jl 0040E4FF
:0040E2E3 3C46 cmp al, 46
:0040E2E5 0F8F14020000 jg 0040E4FF
:0040E2EB 8A4117 mov al, byte ptr [ecx+17]
:0040E2EE 3C30 cmp al, 30
:0040E2F0 0F8C09020000 jl 0040E4FF
:0040E2F6 3C46 cmp al, 46
:0040E2F8 0F8F01020000 jg 0040E4FF
:0040E2FE 8A4119 mov al, byte ptr [ecx+19]
:0040E301 3C30 cmp al, 30
:0040E303 0F8CF6010000 jl 0040E4FF
:0040E309 3C46 cmp al, 46
:0040E30B 0F8FEE010000 jg 0040E4FF /D ECX ，改为“46”
:0040E311 803946 cmp byte ptr [ecx], 46 /Product第1位46（F）
:0040E314 0F85E5010000 jne 0040E4FF /不等就跳 下D ECX+1 改为“50”
:0040E31A 80790150 cmp byte ptr [ecx+01], 50 /第2位50（P）
:0040E31E 0F85DB010000 jne 0040E4FF
:0040E324 80790231 cmp byte ptr [ecx+02], 31 /第3位31（1）
:0040E328 0F85D1010000 jne 0040E4FF
:0040E32E 80790338 cmp byte ptr [ecx+03], 38 /第4位38（8）
:0040E332 0F85C7010000 jne 0040E4FF
:0040E338 8A5105 mov dl, byte ptr [ecx+05] /算法，不管它。
:0040E33B 8A5908 mov bl, byte ptr [ecx+08]
:0040E33E 88542410 mov byte ptr [esp+10], dl
:0040E342 8A5117 mov dl, byte ptr [ecx+17]
:0040E345 02C2 add al, dl
:0040E347 8A5116 mov dl, byte ptr [ecx+16]
:0040E34A 02C2 add al, dl
:0040E34C 8A5115 mov dl, byte ptr [ecx+15]
:0040E34F 02C2 add al, dl
:0040E351 8A5112 mov dl, byte ptr [ecx+12]
:0040E354 02C2 add al, dl
:0040E356 8A5111 mov dl, byte ptr [ecx+11]
:0040E359 02C2 add al, dl
:0040E35B 8A5110 mov dl, byte ptr [ecx+10]
:0040E35E 02C2 add al, dl
:0040E360 8A510F mov dl, byte ptr [ecx+0F]
:0040E363 02C2 add al, dl
:0040E365 8A542410 mov dl, byte ptr [esp+10]
:0040E369 32C2 xor al, dl
:0040E36B 8A510C mov dl, byte ptr [ecx+0C]
:0040E36E 32C3 xor al, bl
:0040E370 32C2 xor al, dl
:0040E372 3423 xor al, 23
:0040E374 8AD0 mov dl, al
:0040E376 C0EA04 shr dl, 04
:0040E379 80C230 add dl, 30
:0040E37C 80FA39 cmp dl, 39
:0040E37F 88542404 mov byte ptr [esp+04], dl
:0040E383 7607 jbe 0040E38C
:0040E385 80C207 add dl, 07
:0040E388 88542404 mov byte ptr [esp+04], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E383(C)
|
:0040E38C 240F and al, 0F
:0040E38E 0430 add al, 30
:0040E390 3C39 cmp al, 39
:0040E392 88442408 mov byte ptr [esp+08], al
:0040E396 7606 jbe 0040E39E /停下来，分析一下下面的代码，我们又改！！！下D ESP+4 该ECX+13
:0040E398 0407 add al, 07
:0040E39A 88442408 mov byte ptr [esp+08], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E396(C)
|
:0040E39E 0FBE4113 movsx eax, byte ptr [ecx+13] /取Product第14位到EAX中
:0040E3A2 8B542404 mov edx, dword ptr [esp+04] /正确的Product！
:0040E3A6 81E2FF000000 and edx, 000000FF
:0040E3AC 3BC2 cmp eax, edx /？EDX ，和输入的Product第14位相等吗？
:0040E3AE 0F854B010000 jne 0040E4FF /停！D ESP+C 改ECX+14 以后的也如此这般就好罗！
:0040E3B4 8A5114 mov dl, byte ptr [ecx+14] /输入Product的第15位到DL中
:0040E3B7 56 push esi
:0040E3B8 8B74240C mov esi, dword ptr [esp+0C]
:0040E3BC 0FBEC2 movsx eax, dl /DL=>EAX
:0040E3BF 81E6FF000000 and esi, 000000FF /正确的Product到ESI中，
:0040E3C5 3BC6 cmp eax, esi /第15位正确与否！
:0040E3C7 5E pop esi
:0040E3C8 0F8531010000 jne 0040E4FF
:0040E3CE 8A410A mov al, byte ptr [ecx+0A]
:0040E3D1 0446 add al, 46
:0040E3D3 324109 xor al, byte ptr [ecx+09]
:0040E3D6 32C2 xor al, dl
:0040E3D8 8A5113 mov dl, byte ptr [ecx+13]
:0040E3DB 32C2 xor al, dl
:0040E3DD 32C3 xor al, bl
:0040E3DF 3441 xor al, 41
:0040E3E1 8AD0 mov dl, al
:0040E3E3 C0EA04 shr dl, 04
:0040E3E6 80C230 add dl, 30
:0040E3E9 80FA39 cmp dl, 39
:0040E3EC 88542404 mov byte ptr [esp+04], dl
:0040E3F0 7607 jbe 0040E3F9
:0040E3F2 80C207 add dl, 07
:0040E3F5 88542404 mov byte ptr [esp+04], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E3F0(C)
|
:0040E3F9 240F and al, 0F
:0040E3FB 0430 add al, 30
:0040E3FD 3C39 cmp al, 39
:0040E3FF 88442408 mov byte ptr [esp+08], al /停下，D ESP+04 改ECX+1A
:0040E403 7606 jbe 0040E40B
:0040E405 0407 add al, 07
:0040E407 88442408 mov byte ptr [esp+08], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E403(C)
|
:0040E40B 0FBE511A movsx edx, byte ptr [ecx+1A]
:0040E40F 8B442404 mov eax, dword ptr [esp+04]
:0040E413 25FF000000 and eax, 000000FF
:0040E418 3BD0 cmp edx, eax
:0040E41A 0F85DF000000 jne 0040E4FF
:0040E420 8A591B mov bl, byte ptr [ecx+1B]
:0040E423 8B442408 mov eax, dword ptr [esp+08]
:0040E427 0FBED3 movsx edx, bl
:0040E42A 25FF000000 and eax, 000000FF
:0040E42F 3BD0 cmp edx, eax
:0040E431 0F85C8000000 jne 0040E4FF
:0040E437 8A4106 mov al, byte ptr [ecx+06]
:0040E43A 8A5114 mov dl, byte ptr [ecx+14]
:0040E43D 32C2 xor al, dl
:0040E43F 8A5113 mov dl, byte ptr [ecx+13]
:0040E442 32C2 xor al, dl
:0040E444 8A542410 mov dl, byte ptr [esp+10]
:0040E448 32C2 xor al, dl
:0040E44A 34AB xor al, AB
:0040E44C 8AD0 mov dl, al
:0040E44E C0EA04 shr dl, 04
:0040E451 80C230 add dl, 30
:0040E454 80FA39 cmp dl, 39
:0040E457 88542404 mov byte ptr [esp+04], dl
:0040E45B 7607 jbe 0040E464
:0040E45D 80C207 add dl, 07
:0040E460 88542404 mov byte ptr [esp+04], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E45B(C)
|
:0040E464 240F and al, 0F
:0040E466 0430 add al, 30
:0040E468 3C39 cmp al, 39
:0040E46A 88442408 mov byte ptr [esp+08], al
:0040E46E 7606 jbe 0040E476
:0040E470 0407 add al, 07
:0040E472 88442408 mov byte ptr [esp+08], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address: 慢
|:0040E46E(C)
|
:0040E476 0FBE510E movsx edx, byte ptr [ecx+0E] 慢
:0040E47A 8B442404 mov eax, dword ptr [esp+04]
:0040E47E 25FF000000 and eax, 000000FF
:0040E483 3BD0 cmp edx, eax 改
:0040E485 7578 jne 0040E4FF
:0040E487 0FBE5118 movsx edx, byte ptr [ecx+18] .
:0040E48B 8B442408 mov eax, dword ptr [esp+08]
:0040E48F 25FF000000 and eax, 000000FF
:0040E494 3BD0 cmp edx, eax .
:0040E496 7567 jne 0040E4FF
:0040E498 8A411A mov al, byte ptr [ecx+1A]
:0040E49B 8A510C mov dl, byte ptr [ecx+0C] .
:0040E49E 32D8 xor bl, al
:0040E4A0 32DA xor bl, dl
:0040E4A2 80F363 xor bl, 63
:0040E4A5 8AD3 mov dl, bl
:0040E4A7 8AC2 mov al, dl
:0040E4A9 C0E804 shr al, 04
:0040E4AC 0430 add al, 30
:0040E4AE 3C39 cmp al, 39
:0040E4B0 88442404 mov byte ptr [esp+04], al
:0040E4B4 7606 jbe 0040E4BC
:0040E4B6 0407 add al, 07
:0040E4B8 88442404 mov byte ptr [esp+04], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E4B4(C)
|
:0040E4BC 80E20F and dl, 0F
:0040E4BF 80C230 add dl, 30
:0040E4C2 80FA39 cmp dl, 39
:0040E4C5 88542408 mov byte ptr [esp+08], dl
:0040E4C9 7607 jbe 0040E4D2
:0040E4CB 80C207 add dl, 07
:0040E4CE 88542408 mov byte ptr [esp+08], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E4C9(C)
|
:0040E4D2 0FBE511D movsx edx, byte ptr [ecx+1D]
:0040E4D6 8B442404 mov eax, dword ptr [esp+04]
:0040E4DA 25FF000000 and eax, 000000FF
:0040E4DF 3BD0 cmp edx, eax
:0040E4E1 751C jne 0040E4FF
:0040E4E3 0FBE491E movsx ecx, byte ptr [ecx+1E]
:0040E4E7 8B542408 mov edx, dword ptr [esp+08] /到这里才算完， D ecx，是？？？
:0040E4EB 33C0 xor eax, eax
:0040E4ED 81E2FF000000 and edx, 000000FF
:0040E4F3 5B pop ebx
:0040E4F4 3BCA cmp ecx, edx
:0040E4F6 0F94C0 sete al
:0040E4F9 83C408 add esp, 00000008
:0040E4FC C20400 ret 0004

我如此低劣的行文你竟看到了这里，真是辛苦你了 ^_^ 此软件并无“校验”
有问题ggd-qicq@163.net
8086[CCG] 20:38 2001-7-11


File Protector 2000 v2.02

 标 题:File Protector 2000 v2.02 Special Edition documentation (7千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-11 21:23:36
详细信息:
他的注册名注册码序列号信息放在注册表里HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Fileprot\Parameters
和
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\vftd
调用regqueryvalue 三次,为什么d *(esp+4)看不到键名,如何看呢,不会吧,还有最后一次调用的时候仿佛在系统代码里就跳出注册对话框,总找不到关键部分,哪位高手可以指点?

;Generate by Txt2Asm V1.0
esp_10 db 0 ;保存ecx+5
esp_04 db 0 ;保存高4位
esp_08 db 0 ;保存低4位
lea ecx, addr Serial
mov al, 2D
mov dl, byte ptr [ecx+4]
cmp dl, al
je @sn_07
mov byte ptr [ecx+4],al
@sn_07: cmp byte ptr [ecx+7],al
je @sn_0B:
mov byte ptr [ecx+7],al
@sn_0B: cmp byte ptr [ecx+0Bh],al
je @sn_0D
mov byte ptr [ecx+0Bh],al
@sn_0D: cmp byte ptr [ecx+0Dh],al
je @sn_1C
mov byte ptr [ecx+0dh],al
@sn_1C: cmp byte ptr [ecx+1Ch],al
je @sn_over
mov byte ptr [ecx+1ch],al

@sn_over:
mov al, byte ptr [ecx+0Fh] ;取Ecx+f，10，11，12，15，16，17，19 处字符
;必须在30～46之间取值
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+10h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+11h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+12h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+15h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+16h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+17h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
mov al, byte ptr [ecx+19h]
cmp al, 30
jl 0040E4FF
cmp al, 46
jg 0040E4FF
cmp byte ptr [ecx], 46 ;前4位必须为FP18-
jne 0040E4FF
cmp byte ptr [ecx+01], 50
jne 0040E4FF
cmp byte ptr [ecx+02], 31
jne 0040E4FF
cmp byte ptr [ecx+03], 38
jne 0040E4FF
mov dl, byte ptr [ecx+05] ;dl<-ecx+5
mov bl, byte ptr [ecx+08] ;bl<-ecx+8
mov byte ptr esp_10, dl ;save to esp_10
mov dl, byte ptr [ecx+17] ;al=ecx+19 add 17,16,15,12,11,10,F
add al, dl
mov dl, byte ptr [ecx+16]
add al, dl
mov dl, byte ptr [ecx+15]
add al, dl
mov dl, byte ptr [ecx+12]
add al, dl
mov dl, byte ptr [ecx+11]
add al, dl
mov dl, byte ptr [ecx+10]
add al, dl
mov dl, byte ptr [ecx+0F]
add al, dl
mov dl, byte ptr esp_10 ;dl=saved ecx+5 (al xor dl)
xor al, dl
mov dl, byte ptr [ecx+0C] ;刚才的运算结果al与5,0C,8,5位依次xor,再与23h xor
xor al, bl ;bl=ecx+8
xor al, dl
xor al, 23
mov dl, al ;校验结果存为al,dl
shr dl, 04 ;去掉低4位,将其转化为0~F的字符
add dl, 30
cmp dl, 39
mov byte ptr esp_04, dl ;存放去掉低4位的高四位结果
jbe RA_0E38C
add dl, 07
mov byte ptr esp_04, dl

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E383(C)
;|
RA_0E38C:
and al, 0F

;0040E38E:
add al, 30
cmp al, 39
mov byte ptr esp_08, al ;存放低四位转化为0~F字符
jbe RA_0E39E
add al, 07
mov byte ptr esp_08, al

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E396(C)
;|
RA_0E39E:
movsx eax, byte ptr [ecx+13h] ;取ecx+13 标志1***********

;0040E3A2:
mov edx, dword ptr esp_04 ;高4位转化为的0~F字符
and edx, 000000FF
cmp eax, edx
je @flg_cmp1
mov byte ptr [ecx+13h],dl

@flg_cmp1:
mov dl, byte ptr [ecx+14] ;ecx+14 标志2************
push esi
mov esi, dword ptr esp_0c ;因为push esi esp_0c=esp+8
movsx eax, dl
and esi, 000000FF
cmp eax, esi
pop esi
je @flg_cmp1:
PUSH EAX
MOV EAX,dword ptr esp_0c
mov byte ptr [ecx+14h],al
POP EAX
@flg_cmp2:
mov al, byte ptr [ecx+0A] ;(ECX+0A) +'-',XOR ECX+9 XOR ECX+14 XOR ECX+13
add al, 46
xor al, byte ptr [ecx+09]
xor al, dl
mov dl, byte ptr [ecx+13]
xor al, dl
xor al, bl ;XOR BL=ECX+8 与41h 异或得到结果
xor al, 41
mov dl, al
shr dl, 04 ;高位转化为0~f字符 ->esp_04
add dl, 30
cmp dl, 39
mov byte ptr esp_04, dl
jbe RA_0E3F9
add dl, 07
mov byte ptr esp_04, dl

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E3F0(C)
;|
RA_0E3F9:
and al, 0F

;0040E3FB:
add al, 30
cmp al, 39
mov byte ptr esp_08, al ;低位化为0~f字符 ->esp_08
jbe RA_0E40B
add al, 07
mov byte ptr [esp+08], al

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E403(C)
;|
RA_0E40B:
movsx edx, byte ptr [ecx+1A] ;ecx+1A 标志3******************

;0040E40F:
mov eax, dword ptr [esp+04] ;高位与ecx+1A 对比
and eax, 000000FF
cmp edx, eax
je @sn_flgcmp3
mov byte ptr [ecx+1A],al
@sn_flgcmp3:
mov bl, byte ptr [ecx+1B] ;ecx+1bh 标志4*************

mov eax, dword ptr esp_8

movsx edx, bl
and eax, 000000FF
cmp edx, eax
jne @sn_flgcmp3:
mov byte ptr [ecx+1B],al
@sn_flgcmp3:
mov al, byte ptr [ecx+06] ;ecx+06 xor ecx+14 xor 13 xor ecx+5
;与ABh数字异或得到结果
mov dl, byte ptr [ecx+14]
xor al, dl
mov dl, byte ptr [ecx+13]
xor al, dl
mov dl, byte ptr esp_10 ;esp_10=ecx+5
xor al, dl
xor al, AB
mov dl, al
shr dl, 04
add dl, 30
cmp dl, 39
mov byte ptr esp_04, dl ;高4位
jbe RA_0E464
add dl, 07
mov byte ptr esp_04, dl

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E45B(C)
;|
RA_0E464:
and al, 0F

;0040E466:
add al, 30
cmp al, 39
mov byte ptr esp_08, al ;低4位
jbe RA_0E476
add al, 07
mov byte ptr esp_08, al

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E46E(C)
;|
RA_0E476:
movsx edx, byte ptr [ecx+0E] ;ecx+0E 标志5******************

;0040E47A:
mov eax, dword ptr [esp+04]
and eax, 000000FF
cmp edx, eax
jne 0040E4FF
movsx edx, byte ptr [ecx+18] ;ecx+18 标志6********************
mov eax, dword ptr [esp+08]
and eax, 000000FF
cmp edx, eax
jne 0040E4FF
mov al, byte ptr [ecx+1A] ;1a,1c
mov dl, byte ptr [ecx+0C]
xor bl, al ;ecx+8 xor 1A xor 1C xor 数字63h最后结果
xor bl, dl
xor bl, 63
mov dl, bl
mov al, dl
shr al, 04 ;高四位
add al, 30
cmp al, 39
mov byte ptr [esp+04], al
jbe RA_0E4BC
add al, 07
mov byte ptr [esp+04], al

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E4B4(C)
;|
RA_0E4BC:
and dl, 0F ;低四位

;0040E4BF:
add dl, 30
cmp dl, 39
mov byte ptr [esp+08], dl
jbe RA_0E4D2
add dl, 07
mov byte ptr [esp+08], dl

;* Referenced by a (U)nconditional or (C)onditional Jump at Address
;|0040E4C9(C)
;|
RA_0E4D2:
movsx edx, byte ptr [ecx+1D] ;ecx+1D 标志7*************

;0040E4D6:
mov eax, dword ptr [esp+04]
and eax, 000000FF
cmp edx, eax
jne 0040E4FF
movsx ecx, byte ptr [ecx+1E] ;ecx+1E 标志8************
mov edx, dword ptr [esp+08]
xor eax, eax
and edx, 000000FF
pop ebx
cmp ecx, edx
sete al
add esp, 00000008
ret 0004

;* Referenced by a (U)nconditional or (C)onditional Jump at Addresses
;|0040E24F(C), 0040E258(C), 0040E261(C), 0040E26A(C), 0040E273(C)
;|0040E27E(C), 0040E286(C), 0040E291(C), 0040E299(C), 0040E2A4(C)
;|0040E2AC(C), 0040E2B7(C), 0040E2BF(C), 0040E2CA(C), 0040E2D2(C)
;|0040E2DD(C), 0040E2E5(C), 0040E2F0(C), 0040E2F8(C), 0040E303(C)
;|0040E30B(C), 0040E314(C), 0040E31E(C), 0040E328(C), 0040E332(C)
;|0040E3AE(C), 0040E3C8(C), 0040E41A(C), 0040E431(C), 0040E485(C)
;|0040E496(C), 0040E4E1(C)
;|
RA_0E4FF:
xor eax, eax

;0040E501:
ret 0004

nop

标 题:请近，我写破文很少，不要骂我哈。：） (7千字)
发信人:8086[CCG]
时 间:2001-7-10 17:21:49
详细信息:

File Protector 2000

name: Free User
Company: [CCG]
Product: 748748

:0040C62F E80C1C0000 call 0040E240 /进入

:0040E240 8B4C2404 mov ecx, dword ptr [esp+04]
:0040E244 83EC08 sub esp, 00000008
:0040E247 B02D mov al, 2D /初始化"al"="2d"="-"
:0040E249 8A5104 mov dl, byte ptr [ecx+04] /取Product第5位到“dl”中
:0040E24C 53 push ebx
:0040E24D 3AD0 cmp dl, al /Product第5位是“-”吗？
:0040E24F 0F85AA020000 jne 0040E4FF /出错！
:0040E255 384107 cmp byte ptr [ecx+07], al /第8位是“-”吗？
:0040E258 0F85A1020000 jne 0040E4FF
:0040E25E 38410B cmp byte ptr [ecx+0B], al /第12位是“-”吗？
:0040E261 0F8598020000 jne 0040E4FF
:0040E267 38410D cmp byte ptr [ecx+0D], al /第14位
:0040E26A 0F858F020000 jne 0040E4FF
:0040E270 38411C cmp byte ptr [ecx+1C], al /第29位
:0040E273 0F8586020000 jne 0040E4FF
:0040E279 8A410F mov al, byte ptr [ecx+0F] /取出Product的第16位到“al”
:0040E27C 3C30 cmp al, 30 /30=0
:0040E27E 0F8C7B020000 jl 0040E4FF /小于30就跳
:0040E284 3C46 cmp al, 46 /46=F
:0040E286 0F8F73020000 jg 0040E4FF /大于“F”就跳，此时Product的合法范围在（Hex）30~46之间。
:0040E28C 8A4110 mov al, byte ptr [ecx+10]
:0040E28F 3C30 cmp al, 30
:0040E291 0F8C68020000 jl 0040E4FF
:0040E297 3C46 cmp al, 46
:0040E299 0F8F60020000 jg 0040E4FF
:0040E29F 8A4111 mov al, byte ptr [ecx+11]
:0040E2A2 3C30 cmp al, 30
:0040E2A4 0F8C55020000 jl 0040E4FF
:0040E2AA 3C46 cmp al, 46
:0040E2AC 0F8F4D020000 jg 0040E4FF
:0040E2B2 8A4112 mov al, byte ptr [ecx+12]
:0040E2B5 3C30 cmp al, 30
:0040E2B7 0F8C42020000 jl 0040E4FF
:0040E2BD 3C46 cmp al, 46
:0040E2BF 0F8F3A020000 jg 0040E4FF
:0040E2C5 8A4115 mov al, byte ptr [ecx+15]
:0040E2C8 3C30 cmp al, 30
:0040E2CA 0F8C2F020000 jl 0040E4FF
:0040E2D0 3C46 cmp al, 46
:0040E2D2 0F8F27020000 jg 0040E4FF
:0040E2D8 8A4116 mov al, byte ptr [ecx+16]
:0040E2DB 3C30 cmp al, 30
:0040E2DD 0F8C1C020000 jl 0040E4FF
:0040E2E3 3C46 cmp al, 46
:0040E2E5 0F8F14020000 jg 0040E4FF
:0040E2EB 8A4117 mov al, byte ptr [ecx+17]
:0040E2EE 3C30 cmp al, 30
:0040E2F0 0F8C09020000 jl 0040E4FF
:0040E2F6 3C46 cmp al, 46
:0040E2F8 0F8F01020000 jg 0040E4FF
:0040E2FE 8A4119 mov al, byte ptr [ecx+19]
:0040E301 3C30 cmp al, 30
:0040E303 0F8CF6010000 jl 0040E4FF
:0040E309 3C46 cmp al, 46
:0040E30B 0F8FEE010000 jg 0040E4FF
:0040E311 803946 cmp byte ptr [ecx], 46 /Product第1位等于46（F）吗？
:0040E314 0F85E5010000 jne 0040E4FF /不等就跳
:0040E31A 80790150 cmp byte ptr [ecx+01], 50 /第2位50（P）
:0040E31E 0F85DB010000 jne 0040E4FF
:0040E324 80790231 cmp byte ptr [ecx+02], 31 /第3位31（1）
:0040E328 0F85D1010000 jne 0040E4FF
:0040E32E 80790338 cmp byte ptr [ecx+03], 38 /第4位38（8）
:0040E332 0F85C7010000 jne 0040E4FF
:0040E338 8A5105 mov dl, byte ptr [ecx+05] /算法，不想看！
:0040E33B 8A5908 mov bl, byte ptr [ecx+08]
:0040E33E 88542410 mov byte ptr [esp+10], dl
:0040E342 8A5117 mov dl, byte ptr [ecx+17]
:0040E345 02C2 add al, dl
:0040E347 8A5116 mov dl, byte ptr [ecx+16]
:0040E34A 02C2 add al, dl
:0040E34C 8A5115 mov dl, byte ptr [ecx+15]
:0040E34F 02C2 add al, dl
:0040E351 8A5112 mov dl, byte ptr [ecx+12]
:0040E354 02C2 add al, dl
:0040E356 8A5111 mov dl, byte ptr [ecx+11]
:0040E359 02C2 add al, dl
:0040E35B 8A5110 mov dl, byte ptr [ecx+10]
:0040E35E 02C2 add al, dl
:0040E360 8A510F mov dl, byte ptr [ecx+0F]
:0040E363 02C2 add al, dl
:0040E365 8A542410 mov dl, byte ptr [esp+10]
:0040E369 32C2 xor al, dl
:0040E36B 8A510C mov dl, byte ptr [ecx+0C]
:0040E36E 32C3 xor al, bl
:0040E370 32C2 xor al, dl
:0040E372 3423 xor al, 23
:0040E374 8AD0 mov dl, al
:0040E376 C0EA04 shr dl, 04
:0040E379 80C230 add dl, 30
:0040E37C 80FA39 cmp dl, 39
:0040E37F 88542404 mov byte ptr [esp+04], dl
:0040E383 7607 jbe 0040E38C
:0040E385 80C207 add dl, 07
:0040E388 88542404 mov byte ptr [esp+04], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E383(C)
|
:0040E38C 240F and al, 0F
:0040E38E 0430 add al, 30
:0040E390 3C39 cmp al, 39
:0040E392 88442408 mov byte ptr [esp+08], al
:0040E396 7606 jbe 0040E39E
:0040E398 0407 add al, 07
:0040E39A 88442408 mov byte ptr [esp+08], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E396(C)
|
:0040E39E 0FBE4113 movsx eax, byte ptr [ecx+13] /取Product第14位到EAX中
:0040E3A2 8B542404 mov edx, dword ptr [esp+04]
:0040E3A6 81E2FF000000 and edx, 000000FF /正确的Product！
:0040E3AC 3BC2 cmp eax, edx /？EDX ，和输入的Product第14位相等吗？
:0040E3AE 0F854B010000 jne 0040E4FF
:0040E3B4 8A5114 mov dl, byte ptr [ecx+14] /输入Product的第15位到DL中
:0040E3B7 56 push esi /弹出的是？？？
:0040E3B8 8B74240C mov esi, dword ptr [esp+0C]
:0040E3BC 0FBEC2 movsx eax, dl /DL=>EAX
:0040E3BF 81E6FF000000 and esi, 000000FF /正确的Product到ESI中，
:0040E3C5 3BC6 cmp eax, esi /第15位正确与否！
:0040E3C7 5E pop esi /压入的是？？？
:0040E3C8 0F8531010000 jne 0040E4FF /不能跳走！
.
.
.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E4C9(C)
|
:0040E4D2 0FBE511D movsx edx, byte ptr [ecx+1D]
:0040E4D6 8B442404 mov eax, dword ptr [esp+04]
:0040E4DA 25FF000000 and eax, 000000FF
:0040E4DF 3BD0 cmp edx, eax
:0040E4E1 751C jne 0040E4FF
:0040E4E3 0FBE491E movsx ecx, byte ptr [ecx+1E]
:0040E4E7 8B542408 mov edx, dword ptr [esp+08]
:0040E4EB 33C0 xor eax, eax
:0040E4ED 81E2FF000000 and edx, 000000FF
:0040E4F3 5B pop ebx
:0040E4F4 3BCA cmp ecx, edx /至此可找出全部的Product。输入后成功，也不知道还有没有校验。
:0040E4F6 0F94C0 sete al
:0040E4F9 83C408 add esp, 00000008
:0040E4FC C20400 ret 0004

8086[CCG] 17:16 2001-7-10


fileaxe v1.00

标 题:anti-homeMade(1): 文件斧头 fileaxe v1.00 (1千字)
发信人:6767
时 间:2001-5-19 20:30:34
详细信息:

文件斧头 fileaxe.exe v1.00
crack by 6767

工具：只用WDASM就能搞定
说明：文件切割器，是否好用不详，刚下载的
地址：ftp://211.100.8.153/download/99/10261_axefb.zip

比较恶，未注册版本更改浏览器默认页。
先脱壳，反编译，找出错信息：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00466AD3(C), :00466AE4(C)
|

* Possible StringData Ref from Code Obj ->"错误的序列号！"
|
:00466D48 B8E86D4600 mov eax, 00466DE8
:00466D4D E80255FEFF call 0044C254

向上找出错的跳转：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00466A8F(C)
|
:00466ACF 837DF800 cmp dword ptr [ebp-08], 00000000 ＜－这里判断注册码是否为空
:00466AD3 0F846F020000 je 00466D48
:00466AD9 8B45F8 mov eax, dword ptr [ebp-08]
:00466ADC 8B55F0 mov edx, dword ptr [ebp-10] ＜－正确注册码的位置
:00466ADF E8A0D2F9FF call 00403D84
:00466AE4 0F855E020000 jne 00466D48
:00466AEA 8D9504FEFFFF lea edx, dword ptr [ebp+FFFFFE04]
:00466AF0 33C0 xor eax, eax
:00466AF2 E8CDBDF9FF call 004028C4
:00466AF7 8B8504FEFFFF mov eax, dword ptr [ebp+FFFFFE04]
:00466AFD 8D55EC lea edx, dword ptr [ebp-14]
:00466B00 E8AB16FAFF call 004081B0
:00466B05 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]

* Possible StringData Ref from Code Obj ->"fileaxe.ini"
|
:00466B0B B9C46D4600 mov ecx, 00466DC4

你的注册码可以用SI跟出来，下网后再跟吧。

序 号:20063
标 题:anti-homeMade(2): 文件加密工具fedt V1.28 (2千字)
发信人:6767
时 间:2001-5-19 21:44:20
详细信息:

文件加密工具fedt V1.28
crack by 6767

工具：只用WDASM就能搞定
说明：文件加密工具，效果未知
地址：ftp://211.100.8.153/download/142/10284_fedtw128.exe

先用upx解压，反编译，找出错信息：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040955F(C)
|
:00409636 A154634900 mov eax, dword ptr [00496354]
:0040963B 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"错误信息！"
|
:0040963D B910E74800 mov ecx, 0048E710

* Possible StringData Ref from Data Obj ->"非法用户名或注册码！"
|
:00409642 BAFBE64800 mov edx, 0048E6FB
:00409647 8B00 mov eax, dword ptr [eax]
:00409649 E866D20600 call 004768B4

向上找出错的跳转：

:00409540 8D55EC lea edx, dword ptr [ebp-14] <-
:00409543 8D45F8 lea eax, dword ptr [ebp-08] <-
:00409546 E8C5D40600 call 00476A10
:0040954B 50 push eax ＜－出口值进栈
:0040954C FF4DD8 dec [ebp-28]
:0040954F 8D45EC lea eax, dword ptr [ebp-14]
:00409552 BA02000000 mov edx, 00000002
:00409557 E8E4D30600 call 00476940
:0040955C 59 pop ecx ＜－弹出FLAG
:0040955D 84C9 test cl, cl
:0040955F 0F84D1000000 je 00409636 ＜－为0则GAMEOVER

由于它根据你的机器生成一个与注册注册有关的ID号，正确的处理方法是暴掉　call 00476A10　的出口EAX值，使其等于1
* Referenced by a CALL at Addresses:
|:0040485B , :00409546
|
:00476A10 55 push ebp
:00476A11 8BEC mov ebp, esp
:00476A13 53 push ebx
:00476A14 8B00 mov eax, dword ptr [eax]
:00476A16 8B12 mov edx, dword ptr [edx]
:00476A18 E89F1EFFFF call 004688BC
:00476A1D 0F94C0 sete al ＜－共6字节空间，怎么改由你
:00476A20 83E001 and eax, 00000001 ＜－
:00476A23 5B pop ebx
:00476A24 5D pop ebp
:00476A25 C3 ret

可以作LOADER或内存补丁，解决大家面临的问题。

2分钟搞定，下面要怎样做取决于你自己，当然你也可以去注册:-）

标 题:注册机 (652字)
发信人:伪装者[BCG]
时 间:2001-5-19 23:07:41
详细信息:

 #include "stdio.h"
main()
{
char string[28],string1[8];
int i,d,e,j,f;
printf("  *******fedt 1.27********\nThis keygen is made by Pretender\nPlease
  input your name  : ");
gets(string);
printf("Please input your ID    : ");
gets(string1);
printf("Your Register code is  : ");
strcat(string,string1);
d=strlen(string);
string[d]=0;
for(i=0;i<8;i++)
{for(j=0;;j++)
{e=string[i];e+=i;e=e^i;
f=string[d-i];f+=i;f+=(i*i);f-=(j*j);f-=d;f=f&0xff;
e=e^f;
if(e>=48&&e<=57) break;}
printf("%d",e-48);}
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /


Fine Print 2000

 标 题:Fine Print 2000的破解思路 (10千字)
发信人:superboss
时 间:2000-9-26 10:18:23
详细信息:
Fine Print 2000的破解
版本:build 21
工具:TRW2000和Wdasm 8.93
目标说明:一个非常不错的缩印驱动程序,用该软件可以打印出袖珍的小本本,
它可以把四张纸的内容缩印到一张纸上面(最多八到一),而且NT版
还可以非常方便的打印双面装订的小册子.Enterprise Edition更
可以网络共享打印.
难度:中级?
下载地址:http://www.fineprint.com/fp400.exe
================================================================
事先申明，本人太懒，此篇教学只给出大概的思路，具体操作，大家一试便知!

在Name中输入:sUpErbOss
Serial中输入:1122334455(十个字节)
在输入Serial时，先输入112233445，按Ctrl-N切换到TRW2000下，设段BPX GETWINDOWTEXTA。
按F5键回到对话框，输入5。此时，会中断。
再按一次F5键，再次中断。按F12键回到程序模组，
* Reference To: USER32.GetWindowTextA, Ord:013Fh
|
:2106B999 FF15682E0921 Call dword ptr [21092E68]
:2106B99F 8B4D10 mov ecx, dword ptr [ebp+10]
:2106B9A2 6AFF push FFFFFFFF
:2106B9A4 E8B1B6FFFF call 2106705A
:2106B9A9 EB0B jmp 2106B9B6 <---此处,打"D ECX"会看到我们输入的注册码！

先"BD *",再打"BPM ECX"，按F5键中断，再按F12键返回：

* Referenced by a CALL at Address:
|:2103B2DB
|
:2103AFC2 55 push ebp8
:2103AFC3 8BEC mov ebp, esp
:2103AFC5 83EC10 sub esp, 00000010
:2103AFC8 894DF4 mov dword ptr [ebp-0C], ecx
:2103AFCB 8B4508 mov eax, dword ptr [ebp+08]
:2103AFCE 50 push eax
:2103AFCF E84C6E0100 call 21051E20
:2103AFD4 83C404 add esp, 00000004
:2103AFD7 83F80E cmp eax, 0000000E <---检查注册码的长度是否为14个字节!
:2103AFDA 7407 je 2103AFE3
:2103AFDC 33C0 xor eax, eax
:2103AFDE E9AE000000 jmp 2103B091

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103AFDA(C)
|
:2103AFE3 C745FC00000000 mov [ebp-04], 00000000
:2103AFEA EB09 jmp 2103AFF5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B080(U)
|
:2103AFEC 8B4DFC mov ecx, dword ptr [ebp-04]
:2103AFEF 83C101 add ecx, 00000001
:2103AFF2 894DFC mov dword ptr [ebp-04], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103AFEA(U)
|
:2103AFF5 837DFC03 cmp dword ptr [ebp-04], 00000003
:2103AFF9 0F8D86000000 jnl 2103B085
:2103AFFF C745F800000000 mov [ebp-08], 00000000
:2103B006 EB09 jmp 2103B011

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B060(U)
|
:2103B008 8B55F8 mov edx, dword ptr [ebp-08]
:2103B00B 83C201 add edx, 00000001
:2103B00E 8955F8 mov dword ptr [ebp-08], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B006(U)
|
:2103B011 837DF804 cmp dword ptr [ebp-08], 00000004 <----每四个字节为一组
:2103B015 7D4B jge 2103B062
:2103B017 8B4508 mov eax, dword ptr [ebp+08]
:2103B01A 8A08 mov cl, byte ptr [eax]
:2103B01C 884DF3 mov byte ptr [ebp-0D], cl
:2103B01F 8A55F3 mov dl, byte ptr [ebp-0D]
:2103B022 52 push edx
:2103B023 8B4508 mov eax, dword ptr [ebp+08]
:2103B026 83C001 add eax, 00000001
:2103B029 894508 mov dword ptr [ebp+08], eax
:2103B02C E8DF010000 call 2103B210 <--此Call将注册码进行转换！（必看)
:2103B031 83C404 add esp, 00000004
:2103B034 8B4DFC mov ecx, dword ptr [ebp-04]
:2103B037 8B55F4 mov edx, dword ptr [ebp-0C]
:2103B03A 8D0C8A lea ecx, dword ptr [edx+4*ecx]
:2103B03D 8B55F8 mov edx, dword ptr [ebp-08]
:2103B040 880411 mov byte ptr [ecx+edx], al
:2103B043 8B45FC mov eax, dword ptr [ebp-04]
:2103B046 8B4DF4 mov ecx, dword ptr [ebp-0C]
:2103B049 8D1481 lea edx, dword ptr [ecx+4*eax]
:2103B04C 8B45F8 mov eax, dword ptr [ebp-08]
:2103B04F 33C9 xor ecx, ecx
:2103B051 8A0C02 mov cl, byte ptr [edx+eax]
:2103B054 81F9FF000000 cmp ecx, 000000FF
:2103B05A 7504 jne 2103B060
:2103B05C 33C0 xor eax, eax
:2103B05E EB31 jmp 2103B091

注:2103B02C处的Call将注册码中的每个字符与程序中存储的密码表，进行位置转换。如输入的注册码中字符不在
密码表中，则注册失败！所以我们的注册码可改为:WS25-3344-THUX
密码表最好用笔先记下来，省得每次跟进去看!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B05A(C)
|
:2103B060 EBA6 jmp 2103B008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B015(C)
|
:2103B062 837DFC01 cmp dword ptr [ebp-04], 00000001
:2103B066 7F18 jg 2103B080
:2103B068 8B5508 mov edx, dword ptr [ebp+08]
:2103B06B 0FBE02 movsx eax, byte ptr [edx]
:2103B06E 8B4D08 mov ecx, dword ptr [ebp+08]
:2103B071 83C101 add ecx, 00000001
:2103B074 894D08 mov dword ptr [ebp+08], ecx
:2103B077 83F82D cmp eax, 0000002D <-----判断每组字符后的字符是否为'-'
:2103B07A 7404 je 2103B080
:2103B07C 33C0 xor eax, eax
:2103B07E EB11 jmp 2103B091

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:2103B066(C), :2103B07A(C)
|
:2103B080 E967FFFFFF jmp 2103AFEC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103AFF9(C)
|
:2103B085 8B550C mov edx, dword ptr [ebp+0C]
:2103B088 52 push edx
:2103B089 8B4DF4 mov ecx, dword ptr [ebp-0C]
:2103B08C E806000000 call 2103B097 <-----核心Call!

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:2103AFDE(U), :2103B05E(U), :2103B07E(U)8
|
:2103B091 8BE5 mov esp, ebp
:2103B093 5D pop ebp
:2103B094 C20800 ret 0008

* Referenced by a CALL at Addresses:
|:2103ADDC , :2103B08C
|
:2103B097 55 pus6h ebp
:2103B098 8BEC mov ebp, esp
:2103B09A 51 push ecx
:2103B09B 56 push esi
:2103B09C 894DFC mov dword ptr [ebp-04], ecx
:2103B09F 8B45FC mov eax, dword ptr [ebp-04]
:2103B0A2 83780C00 cmp dword ptr [eax+0C], 00000000
:2103B0A6 0F848E000000 je 2103B13A
:2103B0AC 8B4DFC mov ecx, dword ptr [ebp-04]
:2103B0AF 8B11 mov edx, dword ptr [ecx]
:2103B0B1 52 push edx
:2103B0B2 6A00 push 00000000
:2103B0B4 68F0FF0000 push 0000FFF0
:2103B0B9 8B45FC mov eax, dword ptr [ebp-04]
:2103B0BC 8B480C mov ecx, dword ptr [eax+0C]
:2103B0BF 51 push ecx

* Reference To: USER32.SendMessageA, Ord:01DAh
|
:2103B0C0 FF15A42E0921 Call dword ptr [21092EA4] <---注册码比对处1
:2103B0C6 85C0 test eax, eax <----EAX=1
:2103B0C8 7507 jne 2103B0D1
:2103B0CA 33C0 xor eax, eax
:2103B0CC E938010000 jmp 2103B209

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B0C8(C)
|
:2103B0D1 8B55FC mov edx, dword ptr [ebp-04]
:2103B0D4 8B4204 mov eax, dword ptr [edx+04]
:2103B0D7 50 push eax
:2103B0D8 6A00 push 00000000
:2103B0DA 68F1FF0000 push 0000FFF1
:2103B0DF 8B4DFC mov ecx, dword ptr [ebp-04]
:2103B0E2 8B510C mov edx, dword ptr [ecx+0C]
:2103B0E5 52 push edx

* Reference To: USER32.SendMessageA, Ord:01DAh
|
:2103B0E6 FF15A42E0921 Call dword ptr [21092EA4] <------注册码比对处2
:2103B0EC 85C0 test eax, eax <----EAX=1
:2103B0EE 7507 jne 2103B0F7
:2103B0F0 33C0 xor eax, eax
:2103B0F2 E912010000 jmp 2103B209

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B0EE(C)
|
:2103B0F7 8B45FC mov eax, dword ptr [ebp-04]
:2103B0FA 8B4808 mov ecx, dword ptr [eax+088]
:2103B0FD 51 push ecx
:2103B0FE 6A00 push 00000000
:2103B100 68F2FF0000 push 0000FFF2
:2103B105 8B55FC mov edx, dword ptr [ebp-04]
:2103B108 8B420C mov eax, dword ptr [edx+0C]
:2103B10B 50 push eax

* Reference To: USER32.SendMessageA, Ord:01DAh
|
:2103B10C FF15A42E0921 Call dword ptr [21092EA4] <------注册码比对处3
:2103B112 85C0 test eax, eax <----EAX=1
:2103B114 7507 jne 2103B11D
:2103B116 33C0 xor eax, eax
:2103B118 E9EC000000 jmp 2103B209

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:2103B114(C)
|
:2103B11D 8B4D08 mov ecx, dword ptr [ebp+08]
:2103B120 51 push ecx
:2103B121 6A00 push 00000000
:2103B123 68F3FF0000 push 0000FFF3
:2103B128 8B55FC mov edx, dword ptr [ebp-04]
:2103B12B 8B420C mov eax, dword ptr [edx+0C]
:2103B12E 50 push eax

* Reference To: USER32.SendMessageA, Ord:01DAh
|
:2103B12F FF15A42E0921 Call dword ptr [21092EA4] <------注册码比对处4
:2103B135 E9CF000000 jmp 2103B209 <-------EAX必须不等于0

大家也许觉得很奇怪，这四处注册码比对处怎么会在系统系统调用USER32.SendMessageA中。这个嘛，我也是
在无处可跟的情况下，进这几个Call的。发现里面有东东，进入后会有一处JMP EAX,可直接把光标带移到此处
按F7键,再按F8键进入跳转,继续往下走，进入USER32.CallWindowProc。咦？怎么又到了Fine Print的领空，
有戏!继续往下，就会找到我们要找的东东。四个USER32.SendMessageA的功能有所不同,有一个是查找注册
码中，每四个字符中有无相同的字符，结果是第二组必须有相同字符...

好了，大概的过程就是如此，如有什么纰漏，还望各位高手指正！


Flagimation1.02

 标 题:Flagimation1.02 破解（入门） (3千字)
发信人:2000yeah
时 间:2000-10-1 17:56:36
详细信息:
Flagimation1.02 破解（入门）

软件名称：Flagimation -->(14天试用且不能保存文件）

简 介：一个简单实用的GIF制作工具

作 者：2000yeah

级 别：卖菜的

日 期：2000年10月1日

工 具： W32dsm

目 的：学习暴力。有时候我们不一定非要找到注册码，按一定顺序去注册，只要把软件的限制取消掉就可以了。

最近一用TRW就死机，一用SOFTICE就头痛，看来需要换换工具了。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046E8B8(C)
|
:0046E8C4 6681A388230000FBFF and word ptr [ebx+00002388], FFFB
:0046E8CD 5B pop ebx
:0046E8CE C3 ret

:0046E8CF 90 nop
:0046E8D0 E8D7EFFFFF call 0046D8AC
:0046E8D5 C3 ret

:0046E8D6 8BC0 mov eax, eax
:0046E8D8 53 push ebx
:0046E8D9 8BD8 mov ebx, eax
:0046E8DB 8B833C020000 mov eax, dword ptr [ebx+0000023C]
:0046E8E1 E89A77FDFF call 00446080
:0046E8E6 84C0 test al, al
:0046E8E8 740F je 0046E8F9
:0046E8EA 8B834C020000 mov eax, dword ptr [ebx+0000024C]
:0046E8F0 E86FB2FFFF call 00469B64
:0046E8F5 84C0 test al, al
:0046E8F7 7409 je 0046E902 －－－－－－－－－把je 改为jne 就可以保存文件了

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046E8E8(C)
|
:0046E8F9 8BC3 mov eax, ebx
:0046E8FB E89CE9FFFF call 0046D29C
:0046E900 5B pop ebx
:0046E901 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046E8F7(C)
|

* Possible StringData Ref from Code Obj ->"You need to register to save transparent " 没有注册不能保存文件
->"GIF images."

..............
.............
...........

:0046A245 D1FA sar edx, 1
:0046A247 7903 jns 0046A24C --------------改jns为js 一跳就不能玩了
:0046A249 83D200 adc edx, 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A247(C)
|
:0046A24C A138AB4700 mov eax, dword ptr [0047AB38]
:0046A251 E84225FBFF call 0041C798
:0046A256 A138AB4700 mov eax, dword ptr [0047AB38]
:0046A25B 8B8000020000 mov eax, dword ptr [eax+00000200]
:0046A261 33D2 xor edx, edx
:0046A263 E8402AFBFF call 0041CCA8
:0046A268 A138AB4700 mov eax, dword ptr [0047AB38]
:0046A26D 8B80FC010000 mov eax, dword ptr [eax+000001FC]
:0046A273 33D2 xor edx, edx
:0046A275 E82E2AFBFF call 0041CCA8

* Possible StringData Ref from Code Obj ->"This software is shareware, and " －－－－－－－ 时间到了，不让你玩
->"may be reviewed for 14 days. Continued "
->"use requires that you register.To "
->"register please send "

－－－－－－－－－－－－－－初学破解，错误难免，请各位大侠指点，谢谢。－－－－－－2000.10.1－2000yeah－－－


Flash ActionScript Tool

 标 题:Flash ActionScript Tool 的注册码！ (22千字)
发信人:南木
时 间:2001-5-4 8:51:13
详细信息:
作者：南木

软件名称： Flash ActionScript Tool (FAST!), v1.0

软件功能：FAST! will aide you in creating, editing,
organizing and exchanging your ActionScripts easier &
faster. (flash的脚本编辑利器！！！)

软件限制：If you didn't register FAST! you'll be seeing a
nag-screen everytime you start the program. You also
won't be able to copy more then 5 lines to the
clipboard.
软件价格：Registering FAST! is $39.95 US Dollars.

下载地址：http://swifftools.com/stools/

使用工具：FI ，W32DASM，trw2000

步骤：1、用FI查看为delphi,未加壳,省事儿！
2、W32DASM反汇编查找“The serial number is invalid.”字样，找到后双击鼠标来到他的调用地址 向上查找关键比对的地方，如下：
**************************************************************
.
.
.
:004F13F0 55 push ebp
:004F13F1 8BEC mov ebp, esp
:004F13F3 33C9 xor ecx, ecx
:004F13F5 51 push ecx
:004F13F6 51 push ecx
:004F13F7 51 push ecx
:004F13F8 51 push ecx
:004F13F9 51 push ecx
:004F13FA 51 push ecx
:004F13FB 53 push ebx
:004F13FC 56 push esi
:004F13FD 8BD8 mov ebx, eax
:004F13FF 33C0 xor eax, eax
:004F1401 55 push ebp
:004F1402 6847154F00 push 004F1547
:004F1407 64FF30 push dword ptr fs:[eax]
:004F140A 648920 mov dword ptr fs:[eax], esp
:004F140D 8D55FC lea edx, dword ptr [ebp-04]
:004F1410 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:004F1416 E8CDB7F4FF call 0043CBE8
:004F141B 8B45FC mov eax, dword ptr [ebp-04]
:004F141E E89934F1FF call 004048BC
:004F1423 83F803 cmp eax, 00000003
:004F1426 0F8E00010000 jle 004F152C
:004F142C 8D55F8 lea edx, dword ptr [ebp-08]
:004F142F 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004F1435 E8AEB7F4FF call 0043CBE8
:004F143A 8B45F8 mov eax, dword ptr [ebp-08]
:004F143D E87A34F1FF call 004048BC
:004F1442 83F803 cmp eax, 00000003
:004F1445 0F8EE1000000 jle 004F152C
:004F144B 8D55F4 lea edx, dword ptr [ebp-0C]
:004F144E 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004F1454 E88FB7F4FF call 0043CBE8
:004F1459 8B45F4 mov eax, dword ptr [ebp-0C]
:004F145C 50 push eax
:004F145D 8D55F0 lea edx, dword ptr [ebp-10]
:004F1460 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:004F1466 E87DB7F4FF call 0043CBE8
:004F146B 8B55F0 mov edx, dword ptr [ebp-10]
:004F146E 8BC3 mov eax, ebx
:004F1470 59 pop ecx
:004F1471 E80AFCFFFF call 004F1080--------------->关键Call，追入！！
:004F1476 84C0 test al, al
:004F1478 0F8492000000 je 004F1510----------------->跳则死！！！
:004F147E 6A00 push 00000000
:004F1480 668B0D54154F00 mov cx, word ptr [004F1554]
:004F1487 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thank you for registering FAST!"
|
:004F1489 B860154F00 mov eax, 004F1560
:004F148E E8E9ADF7FF call 0046C27C
:004F1493 B201 mov dl, 01
:004F1495 A1EC3A4600 mov eax, dword ptr [00463AEC]
:004F149A E81128F7FF call 00463CB0
:004F149F 8BF0 mov esi, eax
:004F14A1 BA01000080 mov edx, 80000001
:004F14A6 8BC6 mov eax, esi
:004F14A8 E83329F7FF call 00463DE0
:004F14AD C6460C01 mov [esi+0C], 01
:004F14B1 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\Grooveware Multimedia\FAST!\Registrat"
->"ion"
|
:004F14B3 BA88154F00 mov edx, 004F1588
:004F14B8 8BC6 mov eax, esi
:004F14BA E8D52AF7FF call 00463F94
:004F14BF 8D55EC lea edx, dword ptr [ebp-14]
:004F14C2 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:004F14C8 E81BB7F4FF call 0043CBE8
:004F14CD 8B4DEC mov ecx, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Name"
|
:004F14D0 BAC4154F00 mov edx, 004F15C4
:004F14D5 8BC6 mov eax, esi
:004F14D7 E8982EF7FF call 00464374
:004F14DC 8D55E8 lea edx, dword ptr [ebp-18]
:004F14DF 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004F14E5 E8FEB6F4FF call 0043CBE8
:004F14EA 8B4DE8 mov ecx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"Serial"
|
:004F14ED BAD4154F00 mov edx, 004F15D4
:004F14F2 8BC6 mov eax, esi
:004F14F4 E87B2EF7FF call 00464374
:004F14F9 8BC6 mov eax, esi
:004F14FB E89428F7FF call 00463D94
:004F1500 8BC6 mov eax, esi
:004F1502 E81123F1FF call 00403818
:004F1507 8BC3 mov eax, ebx
:004F1509 E862C4F6FF call 0045D970
:004F150E EB1C jmp 004F152C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F1478(C)
|
:004F1510 6A00 push 00000000
:004F1512 668B0D54154F00 mov cx, word ptr [004F1554]
:004F1519 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"The serial number is invalid."
|
:004F151B B8E4154F00 mov eax, 004F15E4
:004F1520 E857ADF7FF call 0046C27C
:004F1525 8BC3 mov eax, ebx
:004F1527 E844C4F6FF call 0045D970

3、进入004F1080关键Call,看看！！！

********************************************************************************
* Referenced by a CALL at Addresses:
|:004F1471 , :004F61C7
|
:004F1080 55 push ebp
:004F1081 8BEC mov ebp, esp
:004F1083 6A00 push 00000000
:004F1085 6A00 push 00000000
:004F1087 6A00 push 00000000
:004F1089 6A00 push 00000000
:004F108B 6A00 push 00000000
:004F108D 6A00 push 00000000
:004F108F 6A00 push 00000000
:004F1091 53 push ebx
:004F1092 56 push esi
:004F1093 57 push edi
:004F1094 894DF8 mov dword ptr [ebp-08], ecx
:004F1097 8955FC mov dword ptr [ebp-04], edx
:004F109A 8B45FC mov eax, dword ptr [ebp-04]---->db eax 看注册名
:004F109D E8CE39F1FF call 00404A70
:004F10A2 8B45F8 mov eax, dword ptr [ebp-08]---->db eax看假注册码
:004F10A5 E8C639F1FF call 00404A70
:004F10AA 33C0 xor eax, eax *********************
:004F10AC 55 push ebp *
:004F10AD 68CD114F00 push 004F11CD *
:004F10B2 64FF30 push dword ptr fs:[eax] *
:004F10B5 648920 mov dword ptr fs:[eax], esp *
:004F10B8 33C0 xor eax, eax *
:004F10BA 55 push ebp *
:004F10BB 689E114F00 push 004F119E *
:004F10C0 64FF30 push dword ptr fs:[eax] *
:004F10C3 648920 mov dword ptr fs:[eax], esp *
:004F10C6 33C9 xor ecx, ecx *
:004F10C8 B201 mov dl, 01 *
*
* Possible StringData Ref from Code Obj ->"PKA" *
| *
:004F10CA A1D03C4800 mov eax, dword ptr [00483CD0] *
:004F10CF E85842F9FF call 0048532C *
:004F10D4 8BD8 mov ebx, eax *
:004F10D6 33D2 xor edx, edx *
:004F10D8 8BC3 mov eax, ebx *
:004F10DA E83D35F9FF call 0048461C *
:004F10DF 8D45F4 lea eax, dword ptr [ebp-0C] *
*
* Possible StringData Ref from Code Obj ->"23988732`0-1sjahh832" *
| *
:004F10E2 BAE8114F00 mov edx, 004F11E8 *
:004F10E7 E8C035F1FF call 004046AC *
:004F10EC 8B55F4 mov edx, dword ptr [ebp-0C] *
:004F10EF 8BC3 mov eax, ebx *
:004F10F1 E8CA30F9FF call 004841C0 *
:004F10F6 8D4DF0 lea ecx, dword ptr [ebp-10] *
:004F10F9 8B55FC mov edx, dword ptr [ebp-04] *
:004F10FC 8BC3 mov eax, ebx *
:004F10FE E80932F9FF call 0048430C *
*
* Possible StringData Ref from Code Obj ->"qpvltgmgd18712hge`178623" *
| *
:004F1103 BA08124F00 mov edx, 004F1208 *
:004F1108 8BC3 mov eax, ebx *
:004F110A E8B130F9FF call 004841C0 *
:004F110F 8D4DEC lea ecx, dword ptr [ebp-14] *
:004F1112 8B55F0 mov edx, dword ptr [ebp-10] *
:004F1115 8BC3 mov eax, ebx *
:004F1117 E8F031F9FF call 0048430C *
:004F111C C745E8FFFFEFFE mov [ebp-18], FEEFFFFF *
:004F1123 8B45EC mov eax, dword ptr [ebp-14] *
:004F1126 E89137F1FF call 004048BC *
:004F112B 85C0 test eax, eax *
:004F112D 7E3E jle 004F116D *
:004F112F 8D45EC lea eax, dword ptr [ebp-14] *
:004F1132 E85539F1FF call 00404A8C *
:004F1137 BA01000000 mov edx, 00000001 *
:004F113C 4A dec edx *
:004F113D 3B50FC cmp edx, dword ptr [eax-04] *
:004F1140 7205 jb 004F1147 *
:004F1142 E8D925F1FF call 00403720 计算注册码
*
* Referenced by a (U)nconditional or (C)onditional Jump at Address: *
|:004F1140(C) *
| *
:004F1147 42 inc edx *
:004F1148 8D4410FF lea eax, dword ptr [eax+edx-01] *
:004F114C 50 push eax *
:004F114D 8B45EC mov eax, dword ptr [ebp-14] *
:004F1150 E86737F1FF call 004048BC *
:004F1155 8BD0 mov edx, eax *
:004F1157 81FAFFFF0000 cmp edx, 0000FFFF *
:004F115D 7605 jbe 004F1164 *
:004F115F E8BC25F1FF call 00403720 *
*
* Referenced by a (U)nconditional or (C)onditional Jump at Address: *
|:004F115D(C) *
| *
:004F1164 8D4DE8 lea ecx, dword ptr [ebp-18] *
:004F1167 58 pop eax *
:004F1168 E883F8FFFF call 004F09F0 *
*
* Referenced by a (U)nconditional or (C)onditional Jump at Address: *
|:004F112D(C) *
| *
:004F116D 8B45E8 mov eax, dword ptr [ebp-18] *
:004F1170 33D2 xor edx, edx *
:004F1172 52 push edx *
:004F1173 50 push eax *
:004F1174 8D55E4 lea edx, dword ptr [ebp-1C] *
:004F1177 B820000000 mov eax, 00000020 *
:004F117C E83B95F1FF call 0040A6BC ***************
:004F1181 8B55E4 mov edx, dword ptr [ebp-1C]------>db edx 看真注册码
:004F1184 8B45F8 mov eax, dword ptr [ebp-08]------->db eda 看假注册码
:004F1187 E84038F1FF call 004049CC------>判断真假注册码是否相等
:004F118C 7504 jne 004F1192---------------->不相等则跳
:004F118E B301 mov bl, 01----------->相等，则置正确标志！！！
:004F1190 EB02 jmp 004F1194

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F118C(C)
|
:004F1192 33DB xor ebx, ebx-------------->置错误标志ebx=0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F1190(U)
|
:004F1194 33C0 xor eax, eax
:004F1196 5A pop edx
:004F1197 59 pop ecx
:004F1198 59 pop ecx
:004F1199 648910 mov dword ptr fs:[eax], edx
:004F119C EB0C jmp 004F11AA
:004F119E E97D2BF1FF jmp 00403D20
:004F11A3 33DB xor ebx, ebx
:004F11A5 E8D22EF1FF call 0040407C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F119C(U)
|
:004F11AA 33C0 xor eax, eax
:004F11AC 5A pop edx
:004F11AD 59 pop ecx
:004F11AE 59 pop ecx
:004F11AF 648910 mov dword ptr fs:[eax], edx
:004F11B2 68D4114F00 push 004F11D4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F11D2(U)
|
:004F11B7 8D45E4 lea eax, dword ptr [ebp-1C]
:004F11BA E85534F1FF call 00404614
:004F11BF 8D45EC lea eax, dword ptr [ebp-14]
:004F11C2 BA05000000 mov edx, 00000005
:004F11C7 E86C34F1FF call 00404638
:004F11CC C3 ret----------------------->跳到:004F11D4

:004F11CD E9022EF1FF jmp 00403FD4
:004F11D2 EBE3 jmp 004F11B7
:004F11D4 8BC3 mov eax, ebx--------------->给eax置正确标志
:004F11D6 5F pop edi
:004F11D7 5E pop esi
:004F11D8 5B


FlashGet(JetCar Ver0.77)

标 题:侠盗阿凡提FlashGet详细破解过程，跟这个软件加密方式不知象不象？ (4千字)
发信人:paulyoung
时 间:2001-4-23 22:48:14
详细信息:
《FlashGet(JetCar Ver0.77) 破解实录》
(转载希望保持完整)
软件：FlashGet(JetCar)
版本：0.77

前言：
JetCar是我用过最好的下载工具，最快可达到11K/秒(ISDN)，
它是通过把一个文件分成几个部分同时下载可以成倍的提高速度，
下载速度可以提高100%到500%。JetCar可以创建不限数目的类别，
每个类别指定单独的文件目录，不同的类别保存到不同的目录中去
，强大易用的管理功能包括支持拖拽，更名，添加描述，查找，文
件名重复时可自动重命名等等。而且可以在下载前管理软件。两种
版本均内建支持英语、简体中文、繁体中文、西班牙语、俄语、法
语、日语、乌克兰语、朝鲜语、葡萄牙语、丹麦语、德语、罗马尼
亚语、意大利语、瑞典语、斯洛文尼亚语、匈牙利语、希腊语和加
泰罗尼亚语。
中国人的骄傲，巨好的民族软件！！！
其实这个软件是完全免费的，根本没有破解的必要，但近来有
一些网友频频留言要我写一篇破解教程，唉！盛情难却，我唯有再
次操刀。
这个软件注册和不注册主要区别在：注册后“广告栏会自动移
除”－－仅仅是这样。但这个软件也是取用目前较流行的防破解手
法：即在输入完注册码后并不立即进行比对 (先把注册码存放在①
文件中②注册表中③内存中) ，而是在下一次软件启动的时候才作
比对，所以这也是一个很好的破解教材！
本软件是取用第二种手法，即把注册码存放在注册表中：
\HKEY_CURRENT_USER\SoftWare\JetCar\JetCar\General的RegName
和RegPass，所以我第一时间想到的方法就是用拦注册表的API函数
：bpx RegOpenKeyA或bpx RegQueryValueExA，想在它进行注册码
比对时再把其一网打尽...^_^。天啊，原来这个软件在启动的时候
有不下数十处地方是调用这两个函数的，这又给破解带来了一些麻
烦，因为我不可能一个一个地去筛选，这样做太笨了。所以我又想
到了破解利器W32DASM，因为它常常是SoftIce的好助手。费话小说，
开工吧！

破解工具：W32DASM 8.9X
SoftIce for Win9X 4.X

首先用W32DASM把JetCar反编译，然后查找字串：RegName(这个非常
关键)，一会就搜索到了：

* StringData ->"RegName"
|
:00410356 push 0049BC60

* StringData ->"General"
|
:0041035B push 0049B430
:00410360 mov ecx, esi ; 把你输入的大名写入
:00410362 call 00469650 ; \HKEY_CURRENT_USER\SoftWare\JetCar\JetCar\General的RegName
; 我怎么知道？因为我Crack过嘛！

:00410367 mov edx, dword ptr [esp+0000012C]
:0041036E mov ecx, esi
:00410370 push edx

* Possible StringData Ref from Data Obj ->"RegPass"
|
:00410371 push 0049BC58

* Possible StringData Ref from Data Obj ->"General"
|
:00410376 push 0049B430 ; 把你输入的注册码写入
:0041037B call 00469650 ; \HKEY_CURRENT_USER\SoftWare\JetCar\JetCar\General的RegPass
:00410380 push FFFFFFFF
:00410382 push 00000030

**** "Thank you for registering FlashGet. Please restart the progr"
|
:00410384 push 0000EF82
:00410389 call 004116D0 ; 就是那个提示的窗口(叫你重新启动)

既然上面的代码是把你输入的名字和注册码写入注册表中，那么它肯
定还有一段代码是把你的名字和注册码从注册表中读出来的，于是我
再次往下查找RegName，果然不出所料，这次又找到了：

* StringData ->"RegName"
|
:004104BF push 0049BC60
:004104C4 lea eax, dword ptr [esp+14]

* StringData ->"General"
|
:004104C8 push 0049B430
:004104CD mov esi, ecx
:004104CF push eax
:004104D0 call 00472783 ; 从注册表中读出你刚才输入的大名
:004104D5 push 0049FC40

* StringData ->"RegPass"
|
:004104DA push 0049BC58
:004104DF lea ecx, dword ptr [esp+10]

* StringData ->"General"
|
:004104E3 push 0049B430
:004104E8 push ecx
:004104E9 mov ecx, esi
:004104EB mov [esp+34], 00000000
:004104F3 call 00472783 ; 从注册表中读出你刚才输入的注册码
:004104F8 mov edx, dword ptr [esp+0C]

那么正确的注册码是什么？它们又是在哪里进行比对的？
哥们，先不要急，继续往下看吧！

:0041057B push ecx ; 你输入的大名
:0041057C push edx ; edx, 程序生成的
:0041057D mov ecx, esi
:0041057F call 00410620 ; 生成注册码的Call
; 有兴趣的朋友可以跟进去研究研究
:00410584 mov eax, dword ptr [esp+0C] ; 你输入的注册码
:00410588 mov ecx, dword ptr [esp+14] ; 正确的注册码 ^_^
:0041058C push eax
:0041058D push ecx
:0041058E call 00449F6E ; 注册码进行比对
:00410593 add esp, 00000008
:00410596 mov byte ptr [esp+28], bl
:0041059A test eax, eax ; 成功eax=0, 不成功eax=FFFFFFFF
:0041059C pop edi
:0041059D lea ecx, dword ptr [esp+10]
:004105A1 jne 004105DA ; 注册失败
; 也可直接把其改成9090 ^_^

现在大家应该一目了然嘛，如果还不明白，那我也没办法了！

再后整理：
1. 先运行 JetCar 0.77，然后在菜单上选“帮助->移掉广告横幅”，
用户名称：000ye，注册码：78787878，按“确认”键，最后退出JetCar。
2. 用SoftIce 的 Symbol Loader 载入JetCar (这个不用我教吧)
3. 按 F8
4. bpx 0041058C
5. F5
6. 程序中断，D ecx
7. 还不快快抄下来，正确的注册码是：05914NB7R3

浪费了大家的时间，真的不好意思！！！

000ye
2000.03.12


flashget0.95

标 题:广告广告，无处可逃（flashget0.95破解记录) (1千字)
发信人:duba.126.com
时 间:2001-2-18 16:27:06
详细信息:
广告广告，无处可逃（flashget0.95破解记录)
软件名称：网际快车FlashGet(JetCar)
日期：2001.2.16
最新版本：0.95
文件大小：1008KB
软件授权：免费软件
使用平台：Win9x/Me/NT/2000
下载http://software.wx88.net/down/fg095.zip

广告太烦人，国货当自强。最优秀的国产软件之一，别说你没听过。
软件在输入完注册码后并不立即进行比对 ,先把你输入的用户名
和注册码存放在注册表中 ，在下一次软件启动的时候才作比对。
注册码存放注册表位置
\HKEY_CURRENT_USER\SoftWare\JetCar\JetCar\General下
RegName=用户名
RegPass=注册码

(trw下可用bpx RegQueryValueExA设断，追注册码)
软件在启动时的比对为关键点
w32dasm反汇编,分析（略，可参考阿凡提文章）
0167:00415084 8B44240C MOV EAX,[ESP+0C] 注册表读出码
0167:00415088 8B4C2414 MOV ECX,[ESP+14] 根据注册表用户名算出码
0167:0041508C 50 PUSH EAX
0167:0041508D 51 PUSH ECX
0167:0041508E E8CBAB0500 CALL 0046FC5E 关键比较
0167:00415093 83C408 ADD ESP,BYTE +08
0167:00415096 885C2428 MOV [ESP+28],BL
0167:0041509A 85C0 TEST EAX,EAX
0167:0041509C 5F POP EDI
0167:0041509D 8D4C2410 LEA ECX,[ESP+10]
0167:004150A1 7537 JNZ 004150DA 出错跳(爆破 75==》74）
0167:004150A3 E88BE00600 CALL 00483133
0167:004150A8 8D4C2408 LEA ECX,[ESP+08]
0167:004150AC C644242400 MOV BYTE [ESP+24],00
快速破解：
1. 先运行 flashget0.95，然后在菜单上选“帮助->移掉广告横幅”，
用户名称：guodong，注册码：12345678，按“确认”键，然后退出。
2. 用trw2000 载入jetcar.exe
3. bpx 0041508C
4. go
5. d ecx 30617KB2M6
6. d eax 12345678
7. 整理
用户名 guodong
注册码 30617KB2M6
哪位大哥作个注册机吧

作者 风飘雪
主页 http://duba.126.com

标 题:FLASHGET注册机~~~~这可能是我补考之前写的最后一个注册机~呵呵~~~ (1千字)
发信人:真·伪装者
时 间:2001-2-18 20:23:41
详细信息:

 #include "stdio.h"
main()
{
static char string[81]={'x','x','x','x','x','x','x','x'};
char sp[8]={'h','y','t','z','l','h','y','t'};
unsigned long i,a=0,b=0;
char c;
loop:printf("*********FLASHGET V0.00~~0.95*********\nThis keygen is maked
    by Pretender\nPlease input your name\n");
gets(string);
printf("Your name is            ");
puts(string);
b=strlen(string);
if(b<6)
{printf("This keygen is BETA 0.001,Your user name must more than 5 chars!!\n");goto
    loop;}
printf("Your Register code is:  ");
for(i=0;i<8;i++)
{if(string[i]<0) string[i]+=128;
if(i<b||b<6)
string[i]=sp[i]^string[i];
else
string[i]=sp[i]^string[i-b+1];}
a=string[0]*123;
a=a+string[1]*4121212;
a=a+string[2]*25252335;
a=a+string[3]*541321;
a=a+string[4]*988908;
a=a+string[5]*1225252335;
a=a+string[6]*12412412;
a=a+string[7]*879878912;
for(i=0;i<10;i++)
{string[i]=a%10;a=a/10;}
printf("%c",string[9]+48);
printf("%c",string[8]+48);
printf("%c",string[7]+48);
printf("%c",string[6]+48);
printf("%c",string[5]+48);
printf("%c",string[7]+21+48);
printf("%c",string[6]+17+48);
printf("%c",string[2]+48);
printf("%c",string[2]+27+48);
printf("%c",string[0]+48);
printf("\nWelcome to WWW.CRACKNOW.COM\n");
}
有点缺陷~~~用户名必须大于5个字符~~~~补考之后想办法解决~~呵呵~~

标 题:我也贴一个注册机，用VB5编的 (1千字)
发信人:小　明
时 间:2001-2-19 20:53:42
详细信息:

 Dim x, y As Double
Dim a(7)
Private Sub Text1_Change()
yhm = Trim(Text1.Text)
l = Len(yhm)
l1 = l
If l > 0 Then
j = 1
For i = 0 To 7
If j <= l1 Then
b = Asc(Mid(yhm, j, 1))
j = j + 1
If b < 0 Then
b = b + 65536
a(i) = b \ 256
i = i + 1
If i <= 7 Then a(i) = b Mod 256: l =
    l + 1
Else
a(i) = b
End If
Else
a(i) = &H78
End If
Next
s = "hytzlhyt"
For i = 0 To 7
If i < l Or i < 5 Then
a(i) = (a(i) Xor Asc(Mid(s, i + 1, 1))) And 127
Else
a(i) = (a(i - 5) Xor Asc(Mid(s, i + 1, 1))) And
    127
End If
Next
x = a(0) * 123
x = x + a(1) * &H3EE27C
x = x + a(2) * &H18151EF
x = x + a(3) * &H84289
x = x + a(4) * &HF16EC
x = x + a(5) * &H4907DDEF
x = x + a(6) * &HBD65FC
x = x + a(7) * &H3471E300
Do While x >= 4294967296#
x = x - 4294967296#
Loop
zcm = Trim(Str(x))
zcm = "00000000" + zcm
l = Len(zcm)
Mid(zcm, l - 1, 1) = Chr(Asc(Mid(zcm, l - 2, 1)) + &H1B)
Mid(zcm, l - 3, 1) = Chr(Asc(Mid(zcm, l - 6, 1)) + &H11)
Mid(zcm, l - 4, 1) = Chr(Asc(Mid(zcm, l - 7, 1)) + &H15)
Text2.Text = Right(zcm, 10)
Else
Text2.Text = ""
End If
End Sub

标 题:CrackCode2000这样用! (388字)
发信人:RuFeng
时 间:2001-2-19 7:56:40
详细信息:

写一个这样的CRACKCODE.INI,采用Crackcode2000的增强模式(模式2),以下是我根据上面写的内容:
[Options]
CommandLine=jetcar.exe            程序的执行文件名
Mode=1
        取用模式1读取注册码
First_Break_Address=41508C          程式的中断地址
First_Break_Address_Code=50          中断程式处的1
      Byte代码
First_Break_Address_Code_Lenth=1 中断行代码的长度（单位：byte）
Save_Code_Address=ECX          存放注册码的内存地址的寄存器名


FlashSoft1.05

标 题:具体的破解过程来也！ (10千字)
发信人:conanxu[BCG]
时 间:2001-4-21 21:30:35
详细信息:
FlashSoft1.05破解方法

先用W32Dasm反汇编DfBox.exe，打开串式参考，找到了Msg_RegFalse和Msg_RegOk这个重要的信息,双击

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D2088 BA7C214D00 mov edx, 004D217C
:004D208D A1449A4D00 mov eax, dword ptr [004D9A44]
:004D2092 E8E187FFFF call 004CA878
:004D2097 8B45F0 mov eax, dword ptr [ebp-10]
:004D209A 33C9 xor ecx, ecx
:004D209C 33D2 xor edx, edx
:004D209E E85D64F8FF call 00458500
:004D20A3 8B55F8 mov edx, dword ptr [ebp-08]
:004D20A6 8B45FC mov eax, dword ptr [ebp-04]
:004D20A9 E8E679FFFF call 004C9A94 -->看来秘密在这里面
:004D20AE 84C0 test al, al
:004D20B0 743C je 004D20EE -->重要的信息
:004D20B2 8B55FC mov edx, dword ptr [ebp-04]
:004D20B5 A1409A4D00 mov eax, dword ptr [004D9A40]
:004D20BA E8F184FFFF call 004CA5B0
:004D20BF 8B55F8 mov edx, dword ptr [ebp-08]
:004D20C2 A1409A4D00 mov eax, dword ptr [004D9A40]
:004D20C7 E8A484FFFF call 004CA570
:004D20CC 8D45EC lea eax, dword ptr [ebp-14]
:004D20CF 50 push eax

* Possible StringData Ref from Code Obj ->"Msg_RegOk" -->就是刚才找到的
|
:004D20D0 B9AC214D00 mov ecx, 004D21AC

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D20D5 BA7C214D00 mov edx, 004D217C
:004D20DA A1449A4D00 mov eax, dword ptr [004D9A44]
:004D20DF E89487FFFF call 004CA878
:004D20E4 8B45EC mov eax, dword ptr [ebp-14]
:004D20E7 E8F860F8FF call 004581E4
:004D20EC EB42 jmp 004D2130

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D20B0(C)
|
:004D20EE 8D45E8 lea eax, dword ptr [ebp-18]
:004D20F1 50 push eax

* Possible StringData Ref from Code Obj ->"Msg_RegFalse" -->就是刚才找到的
|
:004D20F2 B9C0214D00 mov ecx, 004D21C0

---------------------------------------------------------------
---------------------------------------------------------------

* Referenced by a CALL at Addresses:
|:004D20A9 , :004D3AA3
|
:004C9A94 55 push ebp
:004C9A95 8BEC mov ebp, esp
:004C9A97 83C4F4 add esp, FFFFFFF4
:004C9A9A 53 push ebx
:004C9A9B 33C9 xor ecx, ecx
:004C9A9D 894DF4 mov dword ptr [ebp-0C], ecx
:004C9AA0 8955F8 mov dword ptr [ebp-08], edx
:004C9AA3 8945FC mov dword ptr [ebp-04], eax
:004C9AA6 8B45FC mov eax, dword ptr [ebp-04]
:004C9AA9 E876A7F3FF call 00404224
:004C9AAE 8B45F8 mov eax, dword ptr [ebp-08]
:004C9AB1 E86EA7F3FF call 00404224
:004C9AB6 33C0 xor eax, eax
:004C9AB8 55 push ebp
:004C9AB9 68FD9A4C00 push 004C9AFD
:004C9ABE 64FF30 push dword ptr fs:[eax]
:004C9AC1 648920 mov dword ptr fs:[eax], esp
:004C9AC4 8D55F4 lea edx, dword ptr [ebp-0C]
:004C9AC7 8B45FC mov eax, dword ptr [ebp-04]
:004C9ACA E83D000000 call 004C9B0C
:004C9ACF 8B45F4 mov eax, dword ptr [ebp-0C]
:004C9AD2 8B55F8 mov edx, dword ptr [ebp-08]
:004C9AD5 E8A6A6F3FF call 00404180
:004C9ADA 7504 jne 004C9AE0
:004C9ADC B301 mov bl, 01
:004C9ADE EB02 jmp 004C9AE2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C9ADA(C)
|
:004C9AE0 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C9ADE(U)
|
:004C9AE2 33C0 xor eax, eax
:004C9AE4 5A pop edx
:004C9AE5 59 pop ecx
:004C9AE6 59 pop ecx
:004C9AE7 648910 mov dword ptr fs:[eax], edx
:004C9AEA 68049B4C00 push 004C9B04

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C9B02(U)
|
:004C9AEF 8D45F4 lea eax, dword ptr [ebp-0C]
:004C9AF2 BA03000000 mov edx, 00000003
:004C9AF7 E818A3F3FF call 00403E14 -->这是个重要的Call，按F8进入
:004C9AFC C3 ret

---------------------------------------------------------------
---------------------------------------------------------------
* Referenced by a CALL at Addresses:
|:0040495F , :00405672 , :004059FB , :0040BA2B , :0040C0C4
|:0040C655 , :0040C98C , :0040CDF6 , :0040D2A1 , :0040D487
|:0040DD81 , :0040DF51 , :00413004 , :00413613 , :00413792
|:004138D9 , :00413A9D , :00415E43 , :00416A9E , :00416DAC
|:0041732A , :0041881C , :00418C5E , :0041BD77 , :0041E60F
|:0041F17A , :0041FC08 , :00429BAE , :0042CEC0 , :0042DB84
|:0042DF6F , :0043519B , :0043AB59 , :0043CAE0 , :0043F805
|:004417A7 , :004418F9 , :004447D4 , :00444C67 , :00444C74
|:004458A3 , :0044685F , :004493E0 , :00452051 , :004529B8
|:00457256 , :00457397 , :004576BB , :00457790 , :004580B5
|:004584E9 , :00460516 , :0046060E , :004606CA , :004607AC
|:0046084A , :0046092C , :004612E9 , :0046489B , :004689A0
|:00468C57 , :0046C54B , :004727D8 , :00472AAB , :00472C84
|:00472FAD , :0047326B , :004735D5 , :00473B67 , :0047A391
|:0047A8E3 , :0047A8F0 , :0047AD17 , :0047B779 , :0047BE5F
|:0047BF28 , :0047C007 , :0047C5F1 , :0047C97B , :0047CF4B
|:0047D396 , :0047D86E , :0047DB97 , :0047DCE8 , :0047E0D6
|:0047E0E3 , :0047EBF9 , :0047ED98 , :0047FC90 , :004809F1
|:00480DA9 , :004821BA , :00482E0A , :00483939 , :00483B91
|:00484442 , :00485731 , :00486F5E , :00489B30 , :0048A790
|:0048F409 , :0048FFCF , :004900E7 , :00490291 , :0049029E
|:00490F0C , :004912B7 , :00491CCC , :0049330D , :00493649
|:004939F7 , :00494E35 , :00495B72 , :004961F7 , :00496371
|:00496D09 , :0049769B , :004995B0 , :004995C5 , :004998D7
|:004998EC , :00499D04 , :0049A5AF , :0049AB70 , :0049AD01
|:0049B176 , :0049BA9E , :0049E7B1 , :004A00D9 , :004A1019
|:004A10C1 , :004A121C , :004A1468 , :004A15B8 , :004A19A6
|:004A1CD7 , :004A1E70 , :004A1FC3 , :004A26DB , :004A2BCF
|:004A2BDC , :004A2C82 , :004A2E2B , :004A2F8E , :004A46A9
|:004A6C68 , :004A7F61 , :004AD539 , :004AE410 , :004AF0C3
|:004AF6F8 , :004AFF8A , :004B1F87 , :004B20CF , :004B21E0
|:004B2316 , :004B276E , :004B277E , :004B2799 , :004B27A6
|:004B27B3 , :004B2CE2 , :004B2CF2 , :004B2D0D , :004B2D1A
|:004B2D27 , :004B2D34 , :004C6B0E , :004C708F , :004C7836
|:004C793B , :004C7A98 , :004C7C42 , :004C7D31 , :004C845D
|:004C864B , :004C8833 , :004C8B58 , :004C8B75 , :004C8E2A
|:004C912A , :004C94D9 , :004C94E6 , :004C9503 , :004C9879
|:004C9AF7 , :004C9C9F , :004C9D8B , :004CA7B0 , :004CA8FC
|:004CA9BA , :004CADB9 , :004CAED6 , :004CB0B9 , :004CB24D
|:004CB37E , :004CC0BB , :004CC0D6 , :004CC0F1 , :004CC117
|:004CC132 , :004CC158 , :004CC17E , :004CC1A4 , :004CC1CA
|:004CC1ED , :004CC20A , :004CC217 , :004CCAB2 , :004CCAE5
|:004CCB02 , :004CCB0F , :004CD00F , :004CD03F , :004CD064
|:004CD289 , :004CD497 , :004CD664 , :004CD7DF , :004CEAB1
|:004CEC08 , :004CED4B , :004CEE72 , :004CF043 , :004CF305
|:004CF538 , :004CF685 , :004CFADA , :004CFB59 , :004CFB66
|:004CFB73 , :004CFFA6 , :004D01E0 , :004D035D , :004D047F
|:004D06C6 , :004D0869 , :004D09FC , :004D0B90 , :004D0ED4
|:004D115B , :004D14BB , :004D1526 , :004D1533 , :004D17A1
|:004D1936 , :004D1EBB , :004D1ED9 , :004D2145 , :004D2262
|:004D232E , :004D2542 , :004D2557 , :004D2ADC , :004D2C5B
|:004D2D8B , :004D30F3 , :004D35A0 , :004D35E3 , :004D3603
|:004D3610 , :004D3B4F
|
:00403E14 53 push ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403D9A(C)
|
:00403E15 56 push esi
:00403E16 89C3 mov ebx, eax
:00403E18 89D6 mov esi, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403E3E(C)
|
:00403E1A 8B13 mov edx, dword ptr [ebx]
:00403E1C 85D2 test edx, edx -->看来注册码就在这
d edx就可以看到

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403DB0(C)
|
:00403E1E 741A je 00403E3A
:00403E20 C70300000000 mov dword ptr [ebx], 00000000
:00403E26 8B4AF8 mov ecx, dword ptr [edx-08]
:00403E29 49 dec ecx
:00403E2A 7C0E jl 00403E3A
:00403E2C F0 lock
:00403E2D FF4AF8 dec [edx-08]
:00403E30 7508 jne 00403E3A
:00403E32 8D42F8 lea eax, dword ptr [edx-08]
:00403E35 E8DEE9FFFF call 00402818

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00403E1E(C), :00403E2A(C), :00403E30(C)
|
:00403E3A 83C304 add ebx, 00000004
:00403E3D 4E dec esi
:00403E3E 75DA jne 00403E1A
:00403E40 5E pop esi
:00403E41 5B pop ebx
:00403E42 C3 ret

conanxu[BCG]
Email:conanxu@eastday.com


Flashsoft1.05

标 题:再贴：软件管理专家（Flashsoft） 1.05的破解（高手莫入） (3千字)
发信人:crack007
时 间:2001-4-22 13:34:17
详细信息:
软件管理专家（Flashsoft） 1.05的破解

作者：Crack007
主页：http://www.crack007.com ( ^-^ )
破解日期：2001-4-22
破解工具：TRW2000 1.22
难度：易

软件下载地址：http://www.newhua.com/FLASHSOFT.HTM

软件简介：　　软件管理专家是用来管理下载文件的，你只要选中一个软件，将它拖拽到FlashSoft的窗口中，填写一些备忘的信息，就把这个下载软件分门别类地放到文件盒中了，下次需要的话，不用去找，直接在软件中调用就ok了，是不是挺方便的？ 通过本软件你可以很方便的知道您下载了什么文件、大小、位置和下载地址以及软件功能等信息，如果您是软件收藏爱好者的话，本软件也可以作为一个您很好的软件收藏目录，象放书的书架一样，随取随用。 对于制作软件光盘来说，这可以很方便的做光盘软件目录。

软件注册费：25.00￥/每注册用户

1、启动TRW2000

2、运行Flashsoft

随便输入注册信息：

用户名:Crack007
注册码:787878

3. 按 CTRL+N 激活 TRW2000

输入如下 2 条命令

bpx hmemcpy 设置中断条件

4. 按F5键，回到 Flashsoft.exe 的注册窗口

按 " OK " 按钮 ,TRW2000 窗口被激活自动弹出

bc * 取消中断

pmodule 从系统内核中返回到 Flashsoft.exe

中断至以下代码：

:004372CB 89430C mov dword ptr [ebx+0C], eax

按F10键，单步跟踪至以下代码：

:004D209E E85D64F8FF call 00458500
:004D20A3 8B55F8 mov edx, dword ptr [ebp-08] -|
:004D20A6 8B45FC mov eax, dword ptr [ebp-04] |
:004D20A9 E8E679FFFF call 004C9A94 ←可疑CALL，按F8跟进。 |
:004D20AE 84C0 test al, al | 经典语句！
:004D20B0 743C je 004D20EE _|
:004D20B2 8B55FC mov edx, dword ptr [ebp-04]

跟进以后，有

* Referenced by a CALL at Addresses:
|:004D20A9 , :004D3AA3
|
:004C9A94 55 push ebp
:004C9A95 8BEC mov ebp, esp
:004C9A97 83C4F4 add esp, FFFFFFF4
:004C9A9A 53 push ebx
:004C9A9B 33C9 xor ecx, ecx
:004C9A9D 894DF4 mov dword ptr [ebp-0C], ecx
:004C9AA0 8955F8 mov dword ptr [ebp-08], edx
:004C9AA3 8945FC mov dword ptr [ebp-04], eax
:004C9AA6 8B45FC mov eax, dword ptr [ebp-04]
:004C9AA9 E876A7F3FF call 00404224
:004C9AAE 8B45F8 mov eax, dword ptr [ebp-08]
:004C9AB1 E86EA7F3FF call 00404224
:004C9AB6 33C0 xor eax, eax
:004C9AB8 55 push ebp
:004C9AB9 68FD9A4C00 push 004C9AFD
:004C9ABE 64FF30 push dword ptr fs:[eax]
:004C9AC1 648920 mov dword ptr fs:[eax], esp
:004C9AC4 8D55F4 lea edx, dword ptr [ebp-0C]
:004C9AC7 8B45FC mov eax, dword ptr [ebp-04]
:004C9ACA E83D000000 call 004C9B0C
:004C9ACF 8B45F4 mov eax, dword ptr [ebp-0C] ←过此处可下 d eax显示真的注册码
:004C9AD2 8B55F8 mov edx, dword ptr [ebp-08] ←过此处可下 d edx显示注册用户名
:004C9AD5 E8A6A6F3FF call 00404180
:004C9ADA 7504 jne 004C9AE0
:004C9ADC B301 mov bl, 01
:004C9ADE EB02 jmp 004C9AE2

整理一下：

用户名:Crack007
注册码:859158116

结束。

希望大侠们能贴出注册码的生成过程，THANKS！


flashsoft1.07

 标 题:flashsoft得简单破解 (6千字)
发信人:jsjyt
时 间:2001-5-26 9:35:04
详细信息:
软件名称：软件管理专家
整理日期：2001.5.17
最新版本：1.07
文件大小：1060KB
软件授权：免费软件
使用平台：Win9x/Me/NT/2000
发布公司：Home Page
软件简介：
    软件管理专家是用来管理下载文件的，你只要选中一个软件，将它拖拽到FlashSoft的窗口中，填写一些备忘的信息，就把这个下载软件分门别类地放到文件盒中了，下次需要的话，不用去找，直接在软件中调用就ok了，是不是挺方便的？ 通过本软件你可以很方便的知道您下载了什么文件、大小、位置和下载地址以及软件功能等信息，如果您是软件收藏爱好者的话，本软件也可以作为一个您很好的软件收藏目录，象放书的书架一样，随取随用。 对于制作软件光盘来说，这可以很方便的做光盘软件目录。
破解工具：trw2000
1.点击注册框。这个软件的注册比较特殊，呵呵，不过千篇一律，我试验了几个断点，呵呵，最好使的就是万能断点了，点击注册以前，ctrl+n呼出trw，设断，F5回到软件领空。点击确定。被栏
2.我不知道怎么回事，第一遍用pmodule没找到，可能是我眼花了，所以F12 19次，出现注册失败窗口
然后重新设断，F12 18次，F10单步跟踪。一直来到
* Possible StringData Ref from Code Obj ->"Msg_EnterUserName"
|
:004D87B7 B9BC884D00 mov ecx, 004D88BC

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D87BC BAD8884D00 mov edx, 004D88D8
:004D87C1 A180EA4D00 mov eax, dword ptr [004DEA80]
:004D87C6 E88186FFFF call 004D0E4C
:004D87CB 8B45F4 mov eax, dword ptr [ebp-0C]
:004D87CE 33C9 xor ecx, ecx
:004D87D0 33D2 xor edx, edx
:004D87D2 E81D08F8FF call 00458FF4
:004D87D7 8D45F8 lea eax, dword ptr [ebp-08]
:004D87DA 50 push eax
:004D87DB 8D45F0 lea eax, dword ptr [ebp-10]
:004D87DE 50 push eax

* Possible StringData Ref from Code Obj ->"Msg_EnterUserCode"
|
:004D87DF B9EC884D00 mov ecx, 004D88EC

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D87E4 BAD8884D00 mov edx, 004D88D8
:004D87E9 A180EA4D00 mov eax, dword ptr [004DEA80]
:004D87EE E85986FFFF call 004D0E4C
:004D87F3 8B45F0 mov eax, dword ptr [ebp-10]
:004D87F6 33C9 xor ecx, ecx
:004D87F8 33D2 xor edx, edx
:004D87FA E8F507F8FF call 00458FF4
:004D87FF 8B55F8 mov edx, dword ptr [ebp-08]
:004D8802 8B45FC mov eax, dword ptr [ebp-04]
:004D8805 E86E77FFFF call 004CFF78 还是F8进入这个了
:004D880A 84C0 test al, al
:004D880C 743C je 004D884A
:004D880E 8B55FC mov edx, dword ptr [ebp-04]
:004D8811 A17CEA4D00 mov eax, dword ptr [004DEA7C]
:004D8816 E8F982FFFF call 004D0B14
:004D881B 8B55F8 mov edx, dword ptr [ebp-08]
:004D881E A17CEA4D00 mov eax, dword ptr [004DEA7C]
:004D8823 E8AC82FFFF call 004D0AD4
:004D8828 8D45EC lea eax, dword ptr [ebp-14]
:004D882B 50 push eax

* Possible StringData Ref from Code Obj ->"Msg_RegOk"
|
:004D882C B908894D00 mov ecx, 004D8908

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D8831 BAD8884D00 mov edx, 004D88D8
:004D8836 A180EA4D00 mov eax, dword ptr [004DEA80]
:004D883B E80C86FFFF call 004D0E4C
:004D8840 8B45EC mov eax, dword ptr [ebp-14]
:004D8843 E89004F8FF call 00458CD8
:004D8848 EB42 jmp 004D888C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D880C(C)
|
:004D884A 8D45E8 lea eax, dword ptr [ebp-18]
:004D884D 50 push eax

* Possible StringData Ref from Code Obj ->"Msg_RegFalse"
|
:004D884E B91C894D00 mov ecx, 004D891C

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D8853 BAD8884D00 mov edx, 004D88D8
:004D8858 A180EA4D00 mov eax, dword ptr [004DEA80]
:004D885D E8EA85FFFF call 004D0E4C
:004D8862 8B45E8 mov eax, dword ptr [ebp-18]
:004D8865 E86E04F8FF call 00458CD8
:004D886A EB20 jmp 004D888C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D87A9(C)
|
:004D886C 8D45E4 lea eax, dword ptr [ebp-1C]
:004D886F 50 push eax

* Possible StringData Ref from Code Obj ->"Msg_RegED"
|
:004D8870 B934894D00 mov ecx, 004D8934

* Possible StringData Ref from Code Obj ->"Messages"
|
:004D8875 BAD8884D00 mov edx, 004D88D8
:004D887A A180EA4D00 mov eax, dword ptr [004DEA80]
:004D887F E8C885FFFF call 004D0E4C
:004D8884 8B45E4 mov eax, dword ptr [ebp-1C]
:004D8887 E84C04F8FF call 00458CD8
F8进入以后
* Referenced by a CALL at Addresses:
|:004D8805 , :004DA2EF 可以看出有两个注册码比对的地方，我们看004d8805这个
|
:004CFF78 55 push ebp
:004CFF79 8BEC mov ebp, esp
:004CFF7B 83C4F4 add esp, FFFFFFF4
:004CFF7E 53 push ebx
:004CFF7F 33C9 xor ecx, ecx
:004CFF81 894DF4 mov dword ptr [ebp-0C], ecx
:004CFF84 8955F8 mov dword ptr [ebp-08], edx 下d edx看到你输入的假的code
:004CFF87 8945FC mov dword ptr [ebp-04], eax 下d eax看到真的code
:004CFF8A 8B45FC mov eax, dword ptr [ebp-04] 我住好了册，本想再跟一次
:004CFF8D E8F242F3FF call 00404284 可是他说我是注册用户，小弟
:004CFF92 8B45F8 mov eax, dword ptr [ebp-08] 注册表的本事不是很好，不管了
:004CFF95 E8EA42F3FF call 00404284 用户名：123123
:004CFF9A 33C0 xor eax, eax 注册码：1567366784
:004CFF9C 55 push ebp
:004CFF9D 68E1FF4C00 push 004CFFE1
:004CFFA2 64FF30 push dword ptr fs:[eax]
:004CFFA5 648920 mov dword ptr fs:[eax], esp
:004CFFA8 8D55F4 lea edx, dword ptr [ebp-0C]
:004CFFAB 8B45FC mov eax, dword ptr [ebp-04]
:004CFFAE E83D000000 call 004CFFF0
:004CFFB3 8B45F4 mov eax, dword ptr [ebp-0C]
:004CFFB6 8B55F8 mov edx, dword ptr [ebp-08]
:004CFFB9 E82242F3FF call 004041E0
:004CFFBE 7504 jne 004CFFC4
:004CFFC0 B301 mov bl, 01
:004CFFC2 EB02 jmp 004CFFC6


FlashSoft1.07

 标 题:什么国产软件不许破解，我就破就破！！！------FlashSoft1.07破解方法 (2千字)
发信人:conanxu[BCG]
时 间:2001-5-19 19:29:10
详细信息:
FlashSoft1.07破解方法
什么国产软件不许破解，我就破就破！！！
软件下载：http://www.doshare.net/hanyusoft/download/flashsoft.zip
用Trw2000载入DfBox.exe点注册，输入用户名，注册码
Ctrl+N下断点bpx hmemcpy，确定，被劫下，F12按18次，F10按1次，到下面
0167:004D87FA CALL 00458FF4
0167:004D87FF MOV EDX,[EBP-08]
0167:004D8802 MOV EAX,[EBP-04]
0167:004D8805 CALL 004CFF78 --\ 这个call进去
0167:004D880A TEST AL,AL --->常用组合
0167:004D880C JZ 004D884A --/
0167:004D880E MOV EDX,[EBP-04]
0167:004D8811 MOV EAX,[004DEA7C]
0167:004D8816 CALL 004D0B14
0167:004D881B MOV EDX,[EBP-08]
0167:004D881E MOV EAX,[004DEA7C]
0167:004D8823 CALL 004D0AD4
0167:004D8828 LEA EAX,[EBP-14]
0167:004D882B PUSH EAX
0167:004D882C MOV ECX,004D8908
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
0167:004CFF78 PUSH EBP
0167:004CFF79 MOV EBP,ESP
0167:004CFF7B ADD ESP,BYTE -0C
0167:004CFF7E PUSH EBX
0167:004CFF7F XOR ECX,ECX
0167:004CFF81 MOV [EBP-0C],ECX
0167:004CFF84 MOV [EBP-08],EDX
0167:004CFF87 MOV [EBP-04],EAX
0167:004CFF8A MOV EAX,[EBP-04]
0167:004CFF8D CALL 00404284
0167:004CFF92 MOV EAX,[EBP-08]
0167:004CFF95 CALL 00404284
0167:004CFF9A XOR EAX,EAX
0167:004CFF9C PUSH EBP
0167:004CFF9D PUSH DWORD 004CFFE1
0167:004CFFA2 PUSH DWORD [FS:EAX]
0167:004CFFA5 MOV [FS:EAX],ESP
0167:004CFFA8 LEA EDX,[EBP-0C]
0167:004CFFAB MOV EAX,[EBP-04]
0167:004CFFAE CALL 004CFFF0
0167:004CFFB3 MOV EAX,[EBP-0C] -->eax就是你的正确注册码
0167:004CFFB6 MOV EDX,[EBP-08] -->edx就是你的错误注册码
0167:004CFFB9 CALL 004041E0
0167:004CFFBE JNZ 004CFFC4
0167:004CFFC0 MOV BL,01
0167:004CFFC2 JMP SHORT 004CFFC6
0167:004CFFC4 XOR EBX,EBX
0167:004CFFC6 XOR EAX,EAX
0167:004CFFC8 POP EDX
0167:004CFFC9 POP ECX
0167:004CFFCA POP ECX
0167:004CFFCB MOV [FS:EAX],EDX
0167:004CFFCE PUSH DWORD 004CFFE8

conanxu[BCG]
conanxu@eastday.com


FolderView 3.0

 标 题:FolderView注册部分的计算 (13千字)
发信人:robot
时 间:2001-5-27 6:02:26
详细信息:
控件名称：FolderView 3.0
软件授权：共享软件
下载地址：http://www.filelibrary.com:8080/cgi-bin/registered/download/New_Files/n/150/fldrvw30.zip
该站点虽然免费下载，但需要密码，因此需要先注册一下
http://www.ssware.com/fldrview/fldrvw30.zip 到该站点下载时，需要代理才能下载
控件简介：FolderView is an ActiveX control that behaves like the left pane of Windows Explorer, showing all the files and folders on the system. Some of its features include context menus for items, the ability to execute shell commands, and automatic updating.
目标程序：FldrView.ocx，81408 bytes
破解工具：W32Dasm白金版，IDA Pro 4.15，Caspr v1.012
说明：本人想用VB编一个程序，需要用到只取得文件夹名称的控件，而VB中的Dirlist控件只能显示当前驱动器的文件夹，必须结合DriveList控件，但这样用起来又太不方便了，然人感觉太别扭，于是上网搜索，奋战了3个多小时，终于找到这两个满意的，确实比微软的那个强，但都需要注册，既然没有条件进行注册，那么就只好Crack了^_^
这个控件同样适用于Delphi、VC，用FI查看，判别不出来(我的FI有点老)，估计是Aspack压缩，用Caspr v1.012成功去壳，再用FI查看，VC++6.0编的，这回可以用W32Dasm和IDA了，闲话少说，开始干，等等，忽然想到，W32Dasm对MFC函数支持不好，因此这回想用IDA试试，但用IDA反汇编后，还是出现了一个问题，输入注册码和显示注册是否成功部分并没有显示出来，而W32Dasm则很容易地显示出来了，以前没怎么用过IDA，不知道怎么把这段代码改成汇编格式，经过一段探索之后，终于解决，方法是跳到10006E99，从菜单中选择Edit-->Functions-->Create Function即可，下面为IDA反汇编的结果

.text:10006E99 sub_10006E99 proc near ; DATA XREF: .rdata:1000AB74
.text:10006E99 push esi
.text:10006E9A mov esi, ecx
.text:10006E9C push 1
.text:10006E9E call ?UpdateData@CWnd@@QAEHH@Z ; CWnd::UpdateData(int)
.text:10006EA3 mov eax, [esi+68h]
.text:10006EA6 cmp dword ptr [eax-8], 0
.text:10006EAA jz short loc_10006F17
.text:10006EAC mov ecx, [esi+64h]
.text:10006EAF cmp dword ptr [ecx-8], 0
.text:10006EB3 jz short loc_10006F17
.text:10006EB5 push eax
.text:10006EB6 push offset aUsername ; "Username"
.text:10006EBB call sub_10006917 ====> Username填入到注册表中
.text:10006EC0 push dword ptr [esi+64h]
.text:10006EC3 push offset aRegcode ; "Regcode"
.text:10006EC8 call sub_10006917 ====> Regcode填入到注册表中
.text:10006ECD mov ecx, [esi+60h]
.text:10006ED0 add esp, 10h
.text:10006ED3 push 1
.text:10006ED5 call ?SetModifiedFlag@COleControl@@QAEXH@Z ; COleControl::SetModifiedFlag(int)
.text:10006EDA mov eax, [esi+64h] ====> "Regcode"
.text:10006EDD mov ecx, [esi+68h] ====> "Username"
.text:10006EE0 push eax
.text:10006EE1 push ecx
.text:10006EE2 call sub_10006958 ====> 注册码的计算部分，见后面的分析
.text:10006EE7 pop ecx
.text:10006EE8 test eax, eax ====> eax为旗标
.text:10006EEA pop ecx
.text:10006EEB jz short loc_10006F09 ====> 等于0则注册码错误
.text:10006EED push 40h
.text:10006EEF push offset aRegistrationSu ; "Registration successful"
.text:10006EF4 push offset aThankYouForReg ; "Thank You for registering FolderView Ac"...
.text:10006EF9 mov ecx, esi
.text:10006EFB call ?MessageBoxA@CWnd@@QAEHPBD0I@Z ; CWnd::MessageBoxA(char const *,char const *,uint)
.text:10006F00 mov ecx, esi
.text:10006F02 call ?OnOK@CDialog@@MAEXXZ ; CDialog::OnOK(void)
.text:10006F07 pop esi
.text:10006F08 retn
.text:10006F09
.text:10006F09 loc_10006F09: ; CODE XREF: sub_10006E99+52j
.text:10006F09 push 10h
.text:10006F0B push offset aInvalidRegistr ; "Invalid registration code"
.text:10006F10 push offset aInvalidRegcode ; "Invalid Regcode. Please enter the corre"...
.text:10006F15 jmp short loc_10006F23
.text:10006F17
.text:10006F17 loc_10006F17: ; CODE XREF: sub_10006E99+11
.text:10006F17 ; sub_10006E99+1A
.text:10006F17 push 10h
.text:10006F19 push offset aEnterInformati ; "Enter information"
.text:10006F1E push offset aPleaseEnterThe ; "Please enter the username and registrat"...
.text:10006F23
.text:10006F23 loc_10006F23: ; CODE XREF: sub_10006E99+7C
.text:10006F23 mov ecx, esi
.text:10006F25 call ?MessageBoxA@CWnd@@QAEHPBD0I@Z ; CWnd::MessageBoxA(char const *,char const *,uint)
.text:10006F2A pop esi
.text:10006F2B retn

int __cdecl sub_10006958(int,int);
.text:10006958 sub_10006958 proc near ; CODE XREF: .text:10004249 .text:10004498
.text:10006958 ; 因为IDA没有将10006E99反编译出来，故这里代码参考没有列出来
.text:10006958 var_160 = qword ptr -160h
.text:10006958 var_158 = qword ptr -158h
.text:10006958 var_14C = byte ptr -14Ch
.text:10006958 var_20 = qword ptr -20h
.text:10006958 var_18 = qword ptr -18h
.text:10006958 var_10 = qword ptr -10h
.text:10006958 var_8 = qword ptr -8
.text:10006958 arg_0 = dword ptr 8 ====> "Username"
.text:10006958 arg_4 = dword ptr 0Ch ====> "Regcode"
.text:10006958
.text:10006958 push ebp
.text:10006959 mov ebp, esp
.text:1000695B sub esp, 14Ch
.text:10006961 fld ds:dbl_1000A900 ====> 双击此处可知dbl_1000A900=56
.text:10006967 push esi
.text:10006968 mov esi, [ebp+arg_0]
.text:1000696B fstp [ebp+var_18]
.text:1000696E fldz
.text:10006970 push esi
.text:10006971 fstp [ebp+var_10]
.text:10006974 call strlen ====> Username的长度
.text:10006979 pop ecx
.text:1000697A xor ecx, ecx
.text:1000697C test eax, eax
.text:1000697E jle short loc_100069B1
.text:10006980 movsx edx, byte ptr [esi]
.text:10006983 mov [ebp+arg_0], edx
.text:10006986 fild [ebp+arg_0] ====> st0=第1个Username字符

.text:10006989 movsx edx, byte ptr [ecx+esi] ====> 取1个Username字符
.text:1000698D mov [ebp+arg_0], edx
.text:10006990 inc ecx
.text:10006991 fild [ebp+arg_0]
.text:10006994 cmp ecx, eax
.text:10006996 fadd st, st(1) ====> st0=[ebp+arg_0]，st1=Username(1)
.text:10006998 fmul [ebp+var_18]
.text:1000699B fadd [ebp+var_10]
.text:1000699E fstp [ebp+var_10]
.text:100069A1 fld [ebp+var_18]
.text:100069A4 fadd ds:dbl_1000A8F8 ====> dbl_1000A8F8=2
.text:100069AA fstp [ebp+var_18]
.text:100069AD jl short loc_10006989

10006989-100069AD的计算过程：
for i=1 to strlen(Username);Code1=Code1+(Username(1)+Username(i))*(56+(i-1)*2);next

.text:100069AF fstp st
.text:100069B1 fld [ebp+var_10]
.text:100069B4 fadd ds:dbl_1000A8F0 ====> dbl_1000A8F0=3419821
.text:100069BA push offset aEqualizer ; "equalizer"
.text:100069BF fst [ebp+var_10] ====> 令RegCode1=Code1+3419821
.text:100069C2 fstp [ebp+var_8]
.text:100069C5 call strlen ====> "equalizer"的长度
.text:100069CA pop ecx
.text:100069CB xor ecx, ecx
.text:100069CD test eax, eax
.text:100069CF jle short loc_100069F0
.text:100069D1 movsx edx, byte ptr [esi]
.text:100069D4 push edi

.text:100069D5 movsx edi, byte ptr [ecx+offset aEqualizer] ; "equalizer"
.text:100069DC add edi, edx
.text:100069DE inc ecx
.text:100069DF mov [ebp+arg_0], edi
.text:100069E2 cmp ecx, eax
.text:100069E4 fild [ebp+arg_0]
.text:100069E7 fsubr [ebp+var_8]
.text:100069EA fstp [ebp+var_8]
.text:100069ED jl short loc_100069D5

100069D5-100069ED的计算过程：
for i=1 to strlen("equalizer");Code2=Code2+Username(1)+"equalizer"(i);next
RegCode2=RegCode1-Code2

.text:100069EF pop edi
.text:100069F0 fld [ebp+var_8]
.text:100069F3 fsub ds:dbl_1000A8F0
.text:100069F9 push esi
.text:100069FA fst [ebp+var_8]

100069D5-100069ED的计算过程：
RegCode2=RegCode2-3419821

.text:100069FD fadd [ebp+var_18]
.text:10006A00 fstp [ebp+var_20]
.text:10006A03 call strlen
.text:10006A08 pop ecx
.text:10006A09 xor ecx, ecx
.text:10006A0B test eax, eax
.text:10006A0D jle short loc_10006A37
.text:10006A0F fld [ebp+var_18]
.text:10006A12 fadd ds:dbl_1000A8E8 ====> dbl_1000A8E8=1
====> st0=(56+2*strlen(Username))+1
.text:10006A18 movsx edx, byte ptr [ecx+esi]
.text:10006A1C mov [ebp+arg_0], edx
.text:10006A1F inc ecx
.text:10006A20 fild [ebp+arg_0]
.text:10006A23 cmp ecx, eax
.text:10006A25 fmul st, st(1)
.text:10006A27 fadd [ebp+var_20]
.text:10006A2A fsub ds:dbl_1000A8E0 ====> dbl_1000A8E0=5
.text:10006A30 fstp [ebp+var_20]
.text:10006A33 jl short loc_10006A18

100069D5-100069ED的计算过程：
RegCode3=RegCode2+(56+2*strlen(Username))
for i=1 to strlen(Username);RegCode3=RegCode3+Username(i)*((56+2*strlen(Username))+1)-5;next

.text:10006A35 fstp st
.text:10006A37 fld [ebp+var_20]
.text:10006A3A push ecx
.text:10006A3B push ecx
.text:10006A3C fstp [esp+158h+var_158]
.text:10006A3F fld [ebp+var_8]
.text:10006A42 push ecx
.text:10006A43 push ecx
.text:10006A44 fstp [esp+160h+var_160]
.text:10006A47 fld [ebp+var_10]
.text:10006A4A call _ftol
.text:10006A4F push eax
.text:10006A50 lea eax, [ebp+var_14C]
.text:10006A56 push offset aX_0f_0f ; "%X-%.0f-%.0f" ====> 注册码格式("0XRegCode1-RegCode2-RegCode3")
.text:10006A5B push eax
.text:10006A5C call ds:sprintf
.text:10006A62 push [ebp+arg_4]
.text:10006A65 lea eax, [ebp+var_14C]
.text:10006A6B push eax
.text:10006A6C call strcmp ====> 注册码比较
.text:10006A71 add esp, 24h
.text:10006A74 neg eax
.text:10006A76 sbb eax, eax
.text:10006A78 pop esi
.text:10006A79 inc eax ====> 结果放到eax
.text:10006A7A leave
.text:10006A7B retn
.text:10006A7B sub_10006958 endp

参数值：
.rdata:1000A8E0 dbl_1000A8E0 dq 5.0 ; DATA XREF: sub_10006958+D2
.rdata:1000A8E8 dbl_1000A8E8 dq 1.0 ; DATA XREF: sub_10006958+BA
.rdata:1000A8F0 dbl_1000A8F0 dq 3.419821e6 ; DATA XREF: sub_10006958+5C
.rdata:1000A8F8 dbl_1000A8F8 dq 2.0 ; DATA XREF: sub_10006958+4C
.rdata:1000A900 dbl_1000A900 dq 5.6e1 ; DATA XREF: sub_10006958+9

总结：注册码由3部分组成：(分别为RegCode1、RegCode2、RegCode3)
RegCode1=3419821+求和((用户名的第1个字符+用户名各字符的ASCII值)*(56+2*用户名各字符的位置))
RegCode2=RegCode1-3419821-求和(用户名的第1个字符+"equalizer"各字符的ASCII值)+(56+2*用户名长度+1)
RegCode3=求和((RegCode2+56+2*用户名长度)+用户名各字符的ASCII值*(56+2*用户名长度+1)-5)
注册码的第1部分用16进制显示，第2、3部分用十进制显示，各部分之间用"-"连上
注册器已做成

后记：IDA和W32Dasm相比较，各有各的优点，W32Dasm比较简单，上手快，字符串参考窗非常实用，可以说就是专为Cracker定制，但对于MFC函数支持不足，并且有一些如本例子的参数(在rdata段)并不能显示出来，要想得出注册码的计算过程，需要结合SoftICE，要想修改程序代码进行暴破，还须结合HIEW、HexWorkshop、UE等；而IDA相对来说就难懂一些，但它支持MFC函数，这样程序读起来就要容易，另外，就向本程序那样，查看注册码的计算参数很容易，当然，它的功能不止这些。对于一个程序，要想破解它，应该结合具体情况来选择不同的反编译器，通常首先选择W32Dasm——容易、直观，而对于象由VC++等编译的程序以及注册部分有内部参数计算的，最好还是用IDA，以上是我的浅见，不当指出请予指出。
2001.05.26 15:00


FontTwister Version 1.1

标 题:初级！请各大侠指点一二！ (1千字)
发信人:南木
时 间:2001-3-30 13:28:15
详细信息:
FontTwister Version 1.1 一个很好的做字体特效的家伙！
http://www.neuber.com 1.35 Mb
有30天试用期！
用试用版作出的图片的正中有 Tial version 字样。:(

工具 ：
soft ice 4.05
w32dasm 8.93 黄金中文版
ultra edit 7.02

将判断注册码的几个关键的je改为jne 后，弹出注册成功对话框，（注册成功，要求推出程序重新启动）。重新启动后，仍然弹出information对话框，要求注册。奇怪，我不是已经注册了吗！:(
程序肯定将我的注册信息写入了注册表，程序启动时，
进行对比判断，假的注册信息当然通不过！（原来如此！）。于是想将call 出information对话框的call,nop掉！
用soft ice 设断bpx creagewindowexa 后，运行程序，
soft 拦下，F12,F12,F12,F12,F12,F12,F12,................唉，
我的手都酸了（足足按了700多次！！！），然而information对话框仍未露脸。:( (此法不行，惨啊！）
用soft ice 设断bpx regqueryvalueExa 后, 死机。更惨！！
用w32dasm反编译，查找” this is an unregistered“,哗啦
哗啦狂响后，报告未发现。（真是浪费表情！）
用ultra edit载入程序，查找” this is an unregistered“,哗啦哗啦狂响后，报告也未发现。（也是浪费表情！）
by the way:w32dasm中的“转到代码头”和“转到程序入口处”有什么区别？
求各位大哥出谋划策！！
在下洗耳恭听！！！

标 题:没壳。这个的注册码保护有点意思！ (944字)
发信人:blowfish
时 间:2001-3-30 20:50:56
详细信息:

串“Wrong code”和“Thank you”在程序中有多处，有几处事先加密过，所以有的串找不到明文，仔细跟一下可以看到它对这些串进行解码的过程。

用DeDe对其处理之后可以看到它在输入注册码之后的判断是分散的，第一处判断是在TSWUnlockForm.UnlockSpeedButtonMouseDown( )，第二处是在TSWUnlockForm.UnlockSpeedButtonClick( )中（这里面还检查是否为旧版本或更新版本的注册码），因为当你单击Unlock按钮时，该按钮的父窗口先收到WM_LBUTTONDOWN消息，再收到WM_LBUTTONCLICK消息。

启动时则是用Windows目录下的win.ini和user.da0来判断时间的，时间限制容易去除，用GetWindowsDirectoryA、GetLocalTime、FindFirstFileA都可以拦下来。

还有两个ini文件有鬼：ftwister.ini、fulltwister.ini，主要是下面几个值：
[Options]
Dreh=36980
RegTick=11576

[Program]
Date=36980
first=36980
OkAll=1
N=BLOWFISH
K=456789:;<33[d733A;>3NPa?3;:98

加在图片上的“trial”字样是个位图，用ExeScope可以对其进行处理。

还没找到可用的注册码，下面的这个是假的：
blowfish
12345678900Xa400>8;0KM^<0

标 题:我对它也进行了研究，但还没全搞定 (21千字)
发信人:robot
时 间:2001-3-30 21:19:13
详细信息:

FontTwister v1.1 forWin95/98/NT的破解
url: http://163.pchome.net/htmled/fntwster.zip

* Reference To: user32.GetDlgCtrlID, Ord:0000h
|
:004BD833 E8F098F4FF Call 00407128
:004BD838 50 push eax
:004BD839 8BC3 mov eax, ebx
:004BD83B E8809BF7FF call 004373C0
:004BD840 50 push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
|
:004BD841 E8F298F4FF Call 00407138
:004BD846 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B] ====> eax指向输入的注册码
:004BD84C E8C7B7F4FF call 00409018 ====> 计算注册码的长度
:004BD851 83F819 cmp eax, 00000019 ====> 长度是否大于等于19h，即25
:004BD854 7340 jnb 004BD896 ====> 是则转
:004BD856 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B] ====> eax指向输入的注册码
:004BD85C E8B7B7F4FF call 00409018 ====> 计算注册码的长度
:004BD861 83F801 cmp eax, 00000001 ====> 注册码是否为空
:004BD864 7623 jbe 004BD889 ====> 是则转
:004BD866 8D8516FCFFFF lea eax, dword ptr [ebp+FFFFFC16] ====> eax指向输入的注册名
:004BD86C E8A7B7F4FF call 00409018 ====> 计算注册码的长度
:004BD871 83F801 cmp eax, 00000001 ====> 注册码是否为空
:004BD874 7613 jbe 004BD889 ====> 是则转
:004BD876 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"FontTwister"
|
:004BD878 68ECDA4B00 push 004BDAEC ====> 显示错误信息
* Possible StringData Ref from Code Obj ->"Wrong name or registration code! Enter here your address exactly so how "
->"this is written in your registering documents. Pay attention to case sensitive."
|
:004BD87D 68F8DA4B00 push 004BDAF8
:004BD882 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004BD884 E87F9AF4FF Call 00407308

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD864(C), :004BD874(C)
|
:004BD889 33C0 xor eax, eax
:004BD88B 5A pop edx
:004BD88C 59 pop ecx
:004BD88D 59 pop ecx
:004BD88E 648910 mov dword ptr fs:[eax], edx
:004BD891 E927020000 jmp 004BDABD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD854(C)
|
:004BD896 55 push ebp
:004BD897 6A08 push 00000008 ====> 8入栈
:004BD899 B940000000 mov ecx, 00000040 ====> 40h即64入栈
:004BD89E BA0E000000 mov edx, 0000000E ====> 0Eh即14入栈
:004BD8A3 B80A000000 mov eax, 0000000A ====> 0Ah即10入栈，实际上是取注册码的第11-15个字符(因为包括第0位)
:004BD8A8 E82BFDFFFF call 004BD5D8 ====> 计算注册码并进行比较
:004BD8AD 59 pop ecx
:004BD8AE 84C0 test al, al ====> al做旗标
:004BD8B0 0F8407010000 je 004BD9BD ====> al=0则注册码错误
:004BD8B6 55 push ebp
:004BD8B7 6A09 push 00000009 ====> 9入栈
:004BD8B9 B930000000 mov ecx, 00000030 ====> 30h即48入栈
:004BD8BE BA13000000 mov edx, 00000013 ====> 13h即19入栈
:004BD8C3 B80F000000 mov eax, 0000000F ====> 0Fh即15入栈，实际上是取注册码的第16-20个字符(因为包括第0位)
:004BD8C8 E80BFDFFFF call 004BD5D8 ====> 计算注册码并进行比较
:004BD8CD 59 pop ecx
:004BD8CE 84C0 test al, al ====> al做旗标
:004BD8D0 0F84E7000000 je 004BD9BD ====> al=0则注册码错误
:004BD8D6 55 push ebp
:004BD8D7 6A0A push 0000000A ====> 0Ah即10入栈
:004BD8D9 B933000000 mov ecx, 00000033 ====> 30h即51入栈
:004BD8DE BA18000000 mov edx, 00000018 ====> 18h即24入栈
:004BD8E3 B814000000 mov eax, 00000014 ====> 14h即20入栈，实际上是取注册码的第21-25个字符(因为包括第0位)
:004BD8E8 E8EBFCFFFF call 004BD5D8 ====> 计算注册码并进行比较
:004BD8ED 59 pop ecx
:004BD8EE 84C0 test al, al ====> al做旗标
:004BD8F0 0F84C7000000 je 004BD9BD ====> al=0则注册码错误
:004BD8F6 6A01 push 00000001 ====> 3处比较正确则置正确标志
:004BD8F8 A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD8FD 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"OkAll"
|
:004BD8FF B99CDB4B00 mov ecx, 004BDB9C

* Possible StringData Ref from Code Obj ->"Program"
|
:004BD904 BAACDB4B00 mov edx, 004BDBAC
:004BD909 8B30 mov esi, dword ptr [eax]
:004BD90B FF560C call [esi+0C]
:004BD90E 8D9514FAFFFF lea edx, dword ptr [ebp+FFFFFA14]
:004BD914 8D8516FCFFFF lea eax, dword ptr [ebp+FFFFFC16]
:004BD91A E851B9F4FF call 00409270
:004BD91F 8B8514FAFFFF mov eax, dword ptr [ebp+FFFFFA14]
:004BD925 50 push eax
:004BD926 A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD92B 8B00 mov eax, dword ptr [eax]
:004BD92D B9BCDB4B00 mov ecx, 004BDBBC

* Possible StringData Ref from Code Obj ->"Program"
|
:004BD932 BAACDB4B00 mov edx, 004BDBAC
:004BD937 8B30 mov esi, dword ptr [eax]
:004BD939 FF5604 call [esi+04]
:004BD93C 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B]
:004BD942 E8D1B6F4FF call 00409018
:004BD947 8BD0 mov edx, eax
:004BD949 4A dec edx
:004BD94A 85D2 test edx, edx
:004BD94C 7C14 jl 004BD962
:004BD94E 42 inc edx
:004BD94F 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B] ====> eax指向注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD960(C)
|
:004BD955 33C9 xor ecx, ecx ====> ecx清0
:004BD957 8A08 mov cl, byte ptr [eax] ====> 取一个注册码字符
:004BD959 83C103 add ecx, 00000003 ====> 将该值+3
:004BD95C 8808 mov byte ptr [eax], cl ====> 再送回去
:004BD95E 40 inc eax ====> 准备取下一个
:004BD95F 4A dec edx ====> 是否取完
:004BD960 75F3 jne 004BD955 ====> 没有则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD94C(C)
|
:004BD962 8D9514FAFFFF lea edx, dword ptr [ebp+FFFFFA14]
:004BD968 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B]
:004BD96E E8FDB8F4FF call 00409270
:004BD973 8B8514FAFFFF mov eax, dword ptr [ebp+FFFFFA14]
:004BD979 50 push eax
:004BD97A A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD97F 8B00 mov eax, dword ptr [eax]
:004BD981 B9C8DB4B00 mov ecx, 004BDBC8

* Possible StringData Ref from Code Obj ->"Program"
|
:004BD986 BAACDB4B00 mov edx, 004BDBAC
:004BD98B 8B30 mov esi, dword ptr [eax]
:004BD98D FF5604 call [esi+04] ====> 存入到FTwister.ini中
:004BD990 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"FontTwister"
|
:004BD992 68ECDA4B00 push 004BDAEC

* Possible StringData Ref from Code Obj ->"Thank you very much for registering. FontTwister is now unlocked. Please restart "
->"the program to activate all changes."
|
:004BD997 68CCDB4B00 push 004BDBCC
:004BD99C 8BC3 mov eax, ebx
:004BD99E E81D9AF7FF call 004373C0
:004BD9A3 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004BD9A4 E85F99F4FF Call 00407308
:
:
:

计算注册码并比较的Call
* Referenced by a CALL at Addresses:
|:004BD8A8 , :004BD8C8 , :004BD8E8
|
:004BD5D8 55 push ebp
:004BD5D9 8BEC mov ebp, esp
:004BD5DB 83C4E0 add esp, FFFFFFE0
:004BD5DE 53 push ebx
:004BD5DF 56 push esi
:004BD5E0 57 push edi
:004BD5E1 33DB xor ebx, ebx
:004BD5E3 895DE4 mov dword ptr [ebp-1C], ebx
:004BD5E6 895DE0 mov dword ptr [ebp-20], ebx
:004BD5E9 894DF8 mov dword ptr [ebp-08], ecx
:004BD5EC 8BDA mov ebx, edx
:004BD5EE 8945FC mov dword ptr [ebp-04], eax
:004BD5F1 33C0 xor eax, eax
:004BD5F3 55 push ebp
:004BD5F4 6861D74B00 push 004BD761
:004BD5F9 64FF30 push dword ptr fs:[eax]
:004BD5FC 648920 mov dword ptr fs:[eax], esp
:004BD5FF C645F700 mov [ebp-09], 00
:004BD603 33C9 xor ecx, ecx
:004BD605 55 push ebp
:004BD606 683CD74B00 push 004BD73C
:004BD60B 64FF31 push dword ptr fs:[ecx]
:004BD60E 648921 mov dword ptr fs:[ecx], esp
:004BD611 8B450C mov eax, dword ptr [ebp+0C]
:004BD614 050BFEFFFF add eax, FFFFFE0B ====> 结果eax指向输入的注册码
:004BD619 E8FAB9F4FF call 00409018 ====> 计算注册码的长度
:004BD61E 83F819 cmp eax, 00000019 ====> 与25比较
:004BD621 730D jnb 004BD630 ====> 大于等于则转
:004BD623 33C0 xor eax, eax ====> eax清0并置标志和退出
:004BD625 5A pop edx
:004BD626 59 pop ecx
:004BD627 59 pop ecx
:004BD628 648910 mov dword ptr fs:[eax], edx
:004BD62B E916010000 jmp 004BD746

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD621(C)
|
:004BD630 33C0 xor eax, eax
:004BD632 8945EC mov dword ptr [ebp-14], eax
:004BD635 BA01000000 mov edx, 00000001 ====> edx设初值1
:004BD63A 33C0 xor eax, eax
:004BD63C 8945E8 mov dword ptr [ebp-18], eax
:004BD63F 8B45FC mov eax, dword ptr [ebp-04] ====> eax三次分别为0Ah, 0Fh, 14h
:004BD642 8BF3 mov esi, ebx ====> esi三次分别为0Eh, 13h, 18h
:004BD644 2BF0 sub esi, eax ====> 要取的注册码长度=4
:004BD646 7C26 jl 004BD66E
:004BD648 46 inc esi ====> 要取的注册码长度=5
:004BD649 8945F0 mov dword ptr [ebp-10], eax
:004BD64C 8B450C mov eax, dword ptr [ebp+0C]
:004BD64F 8B4DF0 mov ecx, dword ptr [ebp-10]
:004BD652 8D84080BFEFFFF lea eax, dword ptr [eax+ecx-000001F5] ====> 指向要取的注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD66C(C)
|
:004BD659 33C9 xor ecx, ecx ====> ecx清0
:004BD65B 8A08 mov cl, byte ptr [eax] ====> 取一个注册码字符
:004BD65D 83E930 sub ecx, 00000030 ====> 减去30h，即"0"
:004BD660 0FAFCA imul ecx, edx ====> ecx=ecx*edx
:004BD663 014DE8 add dword ptr [ebp-18], ecx ====> 加到[ebp-18]中
:004BD666 0FAF55F8 imul edx, dword ptr [ebp-08] ====> edx=edx*第2个入栈值，分别为40h, 30h, 33h
:004BD66A 40 inc eax ====> 准备取下个字符
:004BD66B 4E dec esi ====> 是否取完
:004BD66C 75EB jne 004BD659 ====> 不是则继续

4BD659-4BD66C这段的计算结果：
计算值=第1个数字+第2个数字*X+第3个数字*X^2+第4个数字*X^3+第5个数字*X^4
X三次分别为40h, 30h, 33h

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD646(C)
|
:004BD66E 8B450C mov eax, dword ptr [ebp+0C]
:004BD671 0516FCFFFF add eax, FFFFFC16 ====> eax指向输入的注册名
:004BD676 E89DB9F4FF call 00409018 ====> 计算注册名字的长度
:004BD67B 8BF0 mov esi, eax ====> 长度值放到esi中
:004BD67D 4E dec esi
:004BD67E 85F6 test esi, esi ====> 注册名是否为空
:004BD680 7C4B jl 004BD6CD ====> 是则转，当然是eax清0并返回了
:004BD682 46 inc esi
:004BD683 C745F000000000 mov [ebp-10], 00000000 ====> [ebp-10]置0
:004BD68A 8B450C mov eax, dword ptr [ebp+0C]
:004BD68D 8DB816FCFFFF lea edi, dword ptr [eax+FFFFFC16] ====> edi指向输入的注册名

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD6CB(C)
|
:004BD693 8A07 mov al, byte ptr [edi] ====> 取一个注册名字符
:004BD695 E81253F4FF call 004029AC ====> 如果是小写则转为大写
:004BD69A 8BD8 mov ebx, eax
:004BD69C 881F mov byte ptr [edi], bl ====> 再送回去
:004BD69E 80FB20 cmp bl, 20 ====> 字符是否为空格
:004BD6A1 7423 je 004BD6C6 ====> 是则转，取一个注册名字符
:004BD6A3 8B4D08 mov ecx, dword ptr [ebp+08] ====> [ebp+8]指向第1个入栈值，分别为08h, 09h, 0Ah
:004BD6A6 33C0 xor eax, eax
:004BD6A8 8AC3 mov al, bl ====> 将字符放到al中
:004BD6AA D3E0 shl eax, cl ====> eax=eax*2^第1个入栈值
:004BD6AC 0345EC add eax, dword ptr [ebp-14] ====> [ebp-14]的初值为0
:004BD6AF 8B55F0 mov edx, dword ptr [ebp-10] ====> [ebp-10]的初值为0
:004BD6B2 0FAF5508 imul edx, dword ptr [ebp+08] ====> edx=edx*第1个入栈值
:004BD6B6 33C9 xor ecx, ecx
:004BD6B8 8ACB mov cl, bl ====> 将字符放到cl中
:004BD6BA 0FAFD1 imul edx, ecx ====> edx=edx*ecx
:004BD6BD 0FAF55F8 imul edx, dword ptr [ebp-08] ====> edx=edx*第2个入栈值，分别为40h, 30h, 33h
:004BD6C1 03C2 add eax, edx ====> 加到eax中
:004BD6C3 8945EC mov dword ptr [ebp-14], eax ====> 放到[ebp-14]中
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD6A1(C)
|
:004BD6C6 FF45F0 inc [ebp-10] ====> [epb-10]加1
:004BD6C9 47 inc edi ====> 准备取下个字符
:004BD6CA 4E dec esi ====> 是否取完
:004BD6CB 75C6 jne 004BD693 ====> 不是则继续

4BD693-4BD6CB这段的计算结果：
计算值=计算值+第n个字符*2^Y+(n-1)*Y*第n个字符*X
X三次分别为40h, 30h, 33h, Y三次分别为08h, 09h, 0Ah

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD680(C)
|
:004BD6CD 8B45F8 mov eax, dword ptr [ebp-08] ====> edx=edx*第2个入栈值，分别为40h, 30h, 33h
:004BD6D0 F76DF8 imul [ebp-08]
:004BD6D3 F76DF8 imul [ebp-08]
:004BD6D6 F76DF8 imul [ebp-08]
:004BD6D9 F76DF8 imul [ebp-08] ====> 结果eax=eax^5
:004BD6DC 50 push eax ====> 入栈
:004BD6DD 8B45EC mov eax, dword ptr [ebp-14] ====> 取出由输入的名字计算的值
:004BD6E0 5A pop edx ====> 出栈，edx=第2个入栈值^5，分别为40h, 30h, 33h
:004BD6E1 8BCA mov ecx, edx ====> 放到ecx中
:004BD6E3 99 cdq ====> 清理edx
:004BD6E4 F7F9 idiv ecx ====> 相除
:004BD6E6 8BC2 mov eax, edx ====> 余数放到eax中

4BD6C0-4BD6E6这段的计算结果：
由输入的名字计算的值/第2个入栈值^5的余数

:004BD6E8 99 cdq ====> 清理edx
:004BD6E9 33C2 xor eax, edx ====> eax与0异或
:004BD6EB 2BC2 sub eax, edx ====> 相减
:004BD6ED 8945EC mov dword ptr [ebp-14], eax ====> 再放回去
:004BD6F0 8B45E8 mov eax, dword ptr [ebp-18] ====> 取出输入注册码的计算值
:004BD6F3 99 cdq ====> 清理edx
:004BD6F4 33C2 xor eax, edx ====> eax与0异或
:004BD6F6 2BC2 sub eax, edx ====> 相减
:004BD6F8 3B45EC cmp eax, dword ptr [ebp-14] ====> 比较两个结果是否相等
:004BD6FB 7535 jne 004BD732 ====> 不等，则错误
:004BD6FD 6A01 push 00000001 ====> 置正确标志
:004BD6FF 8D55E0 lea edx, dword ptr [ebp-20]
:004BD702 8B45FC mov eax, dword ptr [ebp-04]
:004BD705 E80EB2F4FF call 00408918
:004BD70A 8B4DE0 mov ecx, dword ptr [ebp-20]
:004BD70D 8D45E4 lea eax, dword ptr [ebp-1C]
:004BD710 BA7CD74B00 mov edx, 004BD77C
:004BD715 E83667F4FF call 00403E50
:004BD71A 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004BD71D A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD722 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"Options"
|
:004BD724 BA88D74B00 mov edx, 004BD788
:004BD729 8B18 mov ebx, dword ptr [eax]
:004BD72B FF530C call [ebx+0C]
:004BD72E C645F701 mov [ebp-09], 01 ====> 设正确标志

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD6FB(C)
|
:004BD732 33C0 xor eax, eax
:004BD734 5A pop edx
:004BD735 59 pop ecx
:004BD736 59 pop ecx
:004BD737 648910 mov dword ptr fs:[eax], edx
:004BD73A EB0A jmp 004BD746
:004BD73C E95F5CF4FF jmp 004033A0
:004BD741 E80A5FF4FF call 00403650

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD62B(U), :004BD73A(U)
|
:004BD746 33C0 xor eax, eax
:004BD748 5A pop edx
:004BD749 59 pop ecx
:004BD74A 59 pop ecx
:004BD74B 648910 mov dword ptr fs:[eax], edx
:004BD74E 6868D74B00 push 004BD768

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD766(U)
|
:004BD753 8D45E0 lea eax, dword ptr [ebp-20]
:004BD756 BA02000000 mov edx, 00000002
:004BD75B E84C64F4FF call 00403BAC
:004BD760 C3 ret
:004BD761 E9425EF4FF jmp 004035A8
:004BD766 EBEB jmp 004BD753
:004BD768 8A45F7 mov al, byte ptr [ebp-09] ====> 设标志
:004BD76B 5F pop edi
:004BD76C 5E pop esi
:004BD76D 5B pop ebx
:004BD76E 8BE5 mov esp, ebp
:004BD770 5D pop ebp
:004BD771 C20400 ret 0004

该软件最少要求25位注册码，其中11-25位根据前面的分析进行反推即可显示注册成功，但实际上并未注册成功，希望有兴趣的高手进行进一步地分析。在注册过程中，只要11-25位的注册码正确，就显示注册成功，并将注册码简单进行编码处理(各字符值+3)后写入到FTwister.ini中。由于我的编程水平有限，分别用tc2.0和basic做了两个11-25位注册码的反推程序，需要的话请跟贴或我找到后直接贴出来。

标 题:那分别是六十四进制数、四十八进制数、五十一进制数 (1千字)
发信人:blowfish
时 间:2001-3-30 22:20:06
详细信息:

:004BD899 B940000000 mov ecx, 00000040 //六十四进制数
:004BD89E BA0E000000 mov edx, 0000000E //视注册码的第A~E位为六十四进制数
:004BD8A3 B80A000000 mov eax, 0000000A
:004BD8A8 E82BFDFFFF call 004BD5D8
:004BD8AD 59 pop ecx
:004BD8AE 84C0 test al, al
:004BD8B0 0F8407010000 je 004BD9BD
:004BD8B6 55 push ebp
:004BD8B7 6A09 push 00000009
:004BD8B9 B930000000 mov ecx, 00000030 //四十八进制数
:004BD8BE BA13000000 mov edx, 00000013 //视注册码的第F~13位为四十八进制数
:004BD8C3 B80F000000 mov eax, 0000000F
:004BD8C8 E80BFDFFFF call 004BD5D8
:004BD8CD 59 pop ecx
:004BD8CE 84C0 test al, al
:004BD8D0 0F84E7000000 je 004BD9BD
:004BD8D6 55 push ebp
:004BD8D7 6A0A push 0000000A
:004BD8D9 B933000000 mov ecx, 00000033 //五十一进制数
:004BD8DE BA18000000 mov edx, 00000018 //视注册码的第14~18位为五十一进制数
:004BD8E3 B814000000 mov eax, 00000014
:004BD8E8 E8EBFCFFFF call 004BD5D8
:004BD8ED 59 pop ecx
:004BD8EE 84C0 test al, al
:004BD8F0 0F84C7000000 je 004BD9BD

BTW: 你刚贴的只是MouseDown( )，还应有MouseClick( )。

标 题:去水印的方法 (2千字)
发信人:blowfish
时 间:2001-3-30 22:14:17
详细信息:

下面的call 004C8D04就是用来调用DrawTextA( )来把“Trial Version”的水印加到图片上的。

１、第1处加水印的地方：

* Possible StringData Ref from Code Obj ->"%o&i瞫#r|e$v& l[ai}r#|T$" //Trial Version的密文
|
:004C9CE1 B8509F4C00 mov eax, 004C9F50
:004C9CE6 E89DE9FFFF call 004C8688 //对字符串进行解密
:004C9CEB A148D04D00 mov eax, dword ptr [004DD048]
:004C9CF0 8B00 mov eax, dword ptr [eax]
:004C9CF2 8B8064070000 mov eax, dword ptr [eax+00000764]
:004C9CF8 803800 cmp byte ptr [eax], 00
:004C9CFB 753E jne 004C9D3B
:004C9CFD A16CEF4D00 mov eax, dword ptr [004DEF6C]
:004C9D02 8B4078 mov eax, dword ptr [eax+78]

* Possible StringData Ref from Code Obj ->"Twister"
|
:004C9D05 BA749F4C00 mov edx, 004C9F74
:004C9D0A E805A2F3FF call 00403F14
:004C9D0F 742A je 004C9D3B
:004C9D11 55 push ebp
:004C9D12 8D4DBC lea ecx, dword ptr [ebp-44]
:004C9D15 8B55CC mov edx, dword ptr [ebp-34]
:004C9D18 8B45F8 mov eax, dword ptr [ebp-08]
:004C9D1B E8E4EFFFFF call 004C8D04 //加水印

2、第2处：

* Possible StringData Ref from Code Obj ->"漬鹢嗺i醩鹯觘搗 駆堨a坕苧矐T?
|
:004C9E07 B8889F4C00 mov eax, 004C9F88
:004C9E0C E843E9FFFF call 004C8754
:004C9E11 8B9558FFFFFF mov edx, dword ptr [ebp+FFFFFF58]
:004C9E17 8D4DBC lea ecx, dword ptr [ebp-44]
:004C9E1A 8B45F8 mov eax, dword ptr [ebp-08]
:004C9E1D E8E2EEFFFF call 004C8D04
:004C9E22 59 pop ecx
:004C9D20 59 pop ecx

总之用DrawTextA是可以全拦下来的。004C8D04处的函数没有入口参数，也没有占用资源，所以只要把其函数体整个改成一条ret指令即可去除水印（前面发的帖子说错了，水印不是用位图资源做的）。

标 题:ftwister.ini似乎是用来干扰的，fulltwister.ini好象才是真正存放注册信息的 (111字)
发信人:blowfish
时 间:2001-3-31 23:45:31
详细信息:

这作者还是比较狡猾的，不过去除了水印和时间限制之后，再把过期后Save和Save as处的限制去掉，就跟正式版没什么区别。

标 题:For Guo Dongxin (29千字)
发信人:WinDos2K
时 间:2001-4-17 7:54:24
详细信息:

FontTwister v1.1 forWin95/98/NT的破解
使用FontTwister你在几秒种之内就可以建立出色的字体。它的直观的表格式界面能够方便的让你增加斜面，浮雕，透明感，纹理，边缘和在你的字体上加上污点或使用它提供的12个内置的字体类型。你可以在字体建立的过程中随时预览并修改它。你可以将你的作品保存为以下几种类型的文件，包括.bmp, .emf, .jpg, 和.wmf。尽管它的界面看上去不那么出色，但FontTwister 仍是一个为网页，插图，多媒体文件和介绍建立自己的特色字体的实用工具。在你没注册之前，“试用版”这三个字将会出现在你所有输出的字体的中间 。
本人试了一下，制作按钮确实很好，值得破

* Reference To: user32.GetDlgCtrlID, Ord:0000h
|
:004BD833 E8F098F4FF Call 00407128
:004BD838 50 push eax
:004BD839 8BC3 mov eax, ebx
:004BD83B E8809BF7FF call 004373C0
:004BD840 50 push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
|
:004BD841 E8F298F4FF Call 00407138
:004BD846 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B] ====> eax指向输入的注册码
:004BD84C E8C7B7F4FF call 00409018 ====> 计算注册码的长度
:004BD851 83F819 cmp eax, 00000019 ====> 长度是否大于等于19h，即25
:004BD854 7340 jnb 004BD896 ====> 是则转
:004BD856 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B] ====> eax指向输入的注册码
:004BD85C E8B7B7F4FF call 00409018 ====> 计算注册码的长度
:004BD861 83F801 cmp eax, 00000001 ====> 注册码是否为空
:004BD864 7623 jbe 004BD889 ====> 是则转
:004BD866 8D8516FCFFFF lea eax, dword ptr [ebp+FFFFFC16] ====> eax指向输入的注册名
:004BD86C E8A7B7F4FF call 00409018 ====> 计算注册码的长度
:004BD871 83F801 cmp eax, 00000001 ====> 注册码是否为空
:004BD874 7613 jbe 004BD889 ====> 是则转
:004BD876 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"FontTwister"
|
:004BD878 68ECDA4B00 push 004BDAEC ====> 显示错误信息
* Possible StringData Ref from Code Obj ->"Wrong name or registration code! Enter here your address exactly so how "
->"this is written in your registering documents. Pay attention to case sensitive."
|
:004BD87D 68F8DA4B00 push 004BDAF8
:004BD882 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004BD884 E87F9AF4FF Call 00407308

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD864(C), :004BD874(C)
|
:004BD889 33C0 xor eax, eax
:004BD88B 5A pop edx
:004BD88C 59 pop ecx
:004BD88D 59 pop ecx
:004BD88E 648910 mov dword ptr fs:[eax], edx
:004BD891 E927020000 jmp 004BDABD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD854(C)
|
:004BD896 55 push ebp
:004BD897 6A08 push 00000008 ====> 8入栈
:004BD899 B940000000 mov ecx, 00000040 ====> 40h即64入栈
:004BD89E BA0E000000 mov edx, 0000000E ====> 0Eh即14入栈
:004BD8A3 B80A000000 mov eax, 0000000A ====> 0Ah即10入栈，实际上是取注册码的第11-15个字符(因为包括第0位)
:004BD8A8 E82BFDFFFF call 004BD5D8 ====> 计算注册码并进行比较
:004BD8AD 59 pop ecx
:004BD8AE 84C0 test al, al ====> al做旗标
:004BD8B0 0F8407010000 je 004BD9BD ====> al=0则注册码错误
:004BD8B6 55 push ebp
:004BD8B7 6A09 push 00000009 ====> 9入栈
:004BD8B9 B930000000 mov ecx, 00000030 ====> 30h即48入栈
:004BD8BE BA13000000 mov edx, 00000013 ====> 13h即19入栈
:004BD8C3 B80F000000 mov eax, 0000000F ====> 0Fh即15入栈，实际上是取注册码的第16-20个字符(因为包括第0位)
:004BD8C8 E80BFDFFFF call 004BD5D8 ====> 计算注册码并进行比较
:004BD8CD 59 pop ecx
:004BD8CE 84C0 test al, al ====> al做旗标
:004BD8D0 0F84E7000000 je 004BD9BD ====> al=0则注册码错误
:004BD8D6 55 push ebp
:004BD8D7 6A0A push 0000000A ====> 0Ah即10入栈
:004BD8D9 B933000000 mov ecx, 00000033 ====> 30h即51入栈
:004BD8DE BA18000000 mov edx, 00000018 ====> 18h即24入栈
:004BD8E3 B814000000 mov eax, 00000014 ====> 14h即20入栈，实际上是取注册码的第21-25个字符(因为包括第0位)
:004BD8E8 E8EBFCFFFF call 004BD5D8 ====> 计算注册码并进行比较
:004BD8ED 59 pop ecx
:004BD8EE 84C0 test al, al ====> al做旗标
:004BD8F0 0F84C7000000 je 004BD9BD ====> al=0则注册码错误
:004BD8F6 6A01 push 00000001 ====> 3处比较正确则置正确标志
:004BD8F8 A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD8FD 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"OkAll"
|
:004BD8FF B99CDB4B00 mov ecx, 004BDB9C

* Possible StringData Ref from Code Obj ->"Program"
|
:004BD904 BAACDB4B00 mov edx, 004BDBAC
:004BD909 8B30 mov esi, dword ptr [eax]
:004BD90B FF560C call [esi+0C]
:004BD90E 8D9514FAFFFF lea edx, dword ptr [ebp+FFFFFA14]
:004BD914 8D8516FCFFFF lea eax, dword ptr [ebp+FFFFFC16]
:004BD91A E851B9F4FF call 00409270
:004BD91F 8B8514FAFFFF mov eax, dword ptr [ebp+FFFFFA14]
:004BD925 50 push eax
:004BD926 A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD92B 8B00 mov eax, dword ptr [eax]
:004BD92D B9BCDB4B00 mov ecx, 004BDBBC

* Possible StringData Ref from Code Obj ->"Program"
|
:004BD932 BAACDB4B00 mov edx, 004BDBAC
:004BD937 8B30 mov esi, dword ptr [eax]
:004BD939 FF5604 call [esi+04]
:004BD93C 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B]
:004BD942 E8D1B6F4FF call 00409018
:004BD947 8BD0 mov edx, eax
:004BD949 4A dec edx
:004BD94A 85D2 test edx, edx
:004BD94C 7C14 jl 004BD962
:004BD94E 42 inc edx
:004BD94F 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B] ====> eax指向注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD960(C)
|
:004BD955 33C9 xor ecx, ecx ====> ecx清0
:004BD957 8A08 mov cl, byte ptr [eax] ====> 取一个注册码字符
:004BD959 83C103 add ecx, 00000003 ====> 将该值+3
:004BD95C 8808 mov byte ptr [eax], cl ====> 再送回去
:004BD95E 40 inc eax ====> 准备取下一个
:004BD95F 4A dec edx ====> 是否取完
:004BD960 75F3 jne 004BD955 ====> 没有则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD94C(C)
|
:004BD962 8D9514FAFFFF lea edx, dword ptr [ebp+FFFFFA14]
:004BD968 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B]
:004BD96E E8FDB8F4FF call 00409270
:004BD973 8B8514FAFFFF mov eax, dword ptr [ebp+FFFFFA14]
:004BD979 50 push eax
:004BD97A A150CD4D00 mov eax, dword ptr [004DCD50]
:004BD97F 8B00 mov eax, dword ptr [eax]
:004BD981 B9C8DB4B00 mov ecx, 004BDBC8

* Possible StringData Ref from Code Obj ->"Program"
|
:004BD986 BAACDB4B00 mov edx, 004BDBAC
:004BD98B 8B30 mov esi, dword ptr [eax]
:004BD98D FF5604 call [esi+04] ====> 存入到FTwister.ini中
:004BD990 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"FontTwister"
|
:004BD992 68ECDA4B00 push 004BDAEC

* Possible StringData Ref from Code Obj ->"Thank you very much for registering. FontTwister is now unlocked. Please restart "
->"the program to activate all changes."
|
:004BD997 68CCDB4B00 push 004BDBCC
:004BD99C 8BC3 mov eax, ebx
:004BD99E E81D9AF7FF call 004373C0
:004BD9A3 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004BD9A4 E85F99F4FF Call 00407308
:004BD9A9 8BC3 mov eax, ebx
:004BD9AB E8B8CFF8FF call 0044A968
:004BD9B0 33C0 xor eax, eax
:004BD9B2 5A pop edx
:004BD9B3 59 pop ecx
:004BD9B4 59 pop ecx
:004BD9B5 648910 mov dword ptr fs:[eax], edx
:004BD9B8 E900010000 jmp 004BDABD

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD8B0(C), :004BD8D0(C), :004BD8F0(C)
|
:004BD9BD BE25000000 mov esi, 00000025

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD9D3(C)
|
:004BD9C2 BA44DC4B00 mov edx, 004BDC44
:004BD9C7 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B]
:004BD9CD E87AB7F4FF call 0040914C
:004BD9D2 4E dec esi
:004BD9D3 75ED jne 004BD9C2
:004BD9D5 33F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDA7A(C)
|
:004BD9D7 68F5010000 push 000001F5
:004BD9DC 8D8516FCFFFF lea eax, dword ptr [ebp+FFFFFC16]
:004BD9E2 50 push eax
:004BD9E3 8B83E8020000 mov eax, dword ptr [ebx+000002E8]
:004BD9E9 E8D299F7FF call 004373C0
:004BD9EE 50 push eax

* Reference To: user32.GetDlgCtrlID, Ord:0000h
|
:004BD9EF E83497F4FF Call 00407128
:004BD9F4 50 push eax
:004BD9F5 8BC3 mov eax, ebx
:004BD9F7 E8C499F7FF call 004373C0
:004BD9FC 50 push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
|
:004BD9FD E83697F4FF Call 00407138
:004BDA02 68F5010000 push 000001F5
:004BDA07 8D851BFAFFFF lea eax, dword ptr [ebp+FFFFFA1B]
:004BDA0D 50 push eax
:004BDA0E 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:004BDA14 E8A799F7FF call 004373C0
:004BDA19 50 push eax

* Reference To: user32.GetDlgCtrlID, Ord:0000h
|
:004BDA1A E80997F4FF Call 00407128
:004BDA1F 50 push eax
:004BDA20 8BC3 mov eax, ebx
:004BDA22 E89999F7FF call 004373C0
:004BDA27 50 push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
|
:004BDA28 E80B97F4FF Call 00407138
:004BDA2D 8BC6 mov eax, esi
:004BDA2F F7AD10FCFFFF imul dword ptr [ebp+FFFFFC10]
:004BDA35 03C7 add eax, edi
:004BDA37 898510FAFFFF mov dword ptr [ebp+FFFFFA10], eax
:004BDA3D DB8510FAFFFF fild dword ptr [ebp+FFFFFA10]
:004BDA43 E8AC4FF4FF call 004029F4
:004BDA48 D80D48DC4B00 fmul dword ptr [004BDC48]
:004BDA4E E8CD4FF4FF call 00402A20
:004BDA53 85D2 test edx, edx
:004BDA55 7D07 jge 004BDA5E
:004BDA57 F7D8 neg eax
:004BDA59 83D200 adc edx, 00000000
:004BDA5C F7DA neg edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDA55(C)
|
:004BDA5E 03F8 add edi, eax
:004BDA60 89BD10FCFFFF mov dword ptr [ebp+FFFFFC10], edi
:004BDA66 8B8510FCFFFF mov eax, dword ptr [ebp+FFFFFC10]
:004BDA6C B964000000 mov ecx, 00000064
:004BDA71 99 cdq
:004BDA72 F7F9 idiv ecx
:004BDA74 8BFA mov edi, edx
:004BDA76 46 inc esi
:004BDA77 83FE65 cmp esi, 00000065
:004BDA7A 0F8557FFFFFF jne 004BD9D7
:004BDA80 8D850BFEFFFF lea eax, dword ptr [ebp+FFFFFE0B]
:004BDA86 E88DB5F4FF call 00409018
:004BDA8B 83F83A cmp eax, 0000003A
:004BDA8E 7319 jnb 004BDAA9
:004BDA90 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"FontTwister"
|
:004BDA92 68ECDA4B00 push 004BDAEC

* Possible StringData Ref from Code Obj ->"Wrong name or registration code! Enter here your address exactly so how "
->"this is written in your registering documents. Pay attention to case sensitive."
|
:004BDA97 68F8DA4B00 push 004BDAF8
:004BDA9C 8BC3 mov eax, ebx
:004BDA9E E81D99F7FF call 004373C0
:004BDAA3 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004BDAA4 E85F98F4FF Call 00407308

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDA8E(C)
|
:004BDAA9 33C0 xor eax, eax
:004BDAAB 5A pop edx
:004BDAAC 59 pop ecx
:004BDAAD 59 pop ecx
:004BDAAE 648910 mov dword ptr fs:[eax], edx
:004BDAB1 EB0A jmp 004BDABD
:004BDAB3 E9E858F4FF jmp 004033A0
:004BDAB8 E8935BF4FF call 00403650

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD891(U), :004BD9B8(U), :004BDAB1(U)
|
:004BDABD 33C0 xor eax, eax
:004BDABF 5A pop edx
:004BDAC0 59 pop ecx
:004BDAC1 59 pop ecx
:004BDAC2 648910 mov dword ptr fs:[eax], edx
:004BDAC5 68DDDA4B00 push 004BDADD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDADB(U)
|
:004BDACA 8D8514FAFFFF lea eax, dword ptr [ebp+FFFFFA14]
:004BDAD0 E8B360F4FF call 00403B88
:004BDAD5 C3 ret

:004BDAD6 E9CD5AF4FF jmp 004035A8
:004BDADB EBED jmp 004BDACA
:004BDADD 5F pop edi
:004BDADE 5E pop esi
:004BDADF 5B pop ebx
:004BDAE0 8BE5 mov esp, ebp
:004BDAE2 5D pop ebp
:004BDAE3 C20C00 ret 000C

计算注册码并比较的Call
* Referenced by a CALL at Addresses:
|:004BD8A8 , :004BD8C8 , :004BD8E8
|
:004BD5D8 55 push ebp
:004BD5D9 8BEC


fulldisk A32

标 题:fulldisk A32 破解过程！（简单） (1千字)
发信人:小球
时 间:2001-3-20 20:48:52
详细信息:
fulldisk A32 破解过程！（简单）
下载地址：URL http://nj.onlinedown.net/down/fuldsk43.zip
用途：察看本地磁盘使用情况
工具：softice for9x
在其注册框中输入名字：crack （任意）
注册码：12345678（任意8位）
ctrl+d 呼出ice，下断：

bpx hmemcpy

按f5回到注册处，回车。

按9次f12来到：

:0040774A 6A08 push 00000008 *用d ecx可看到12345678
:0040774C 8B45FC mov eax, dword ptr [ebp-04]
:0040774F 83C060 add eax, 00000060
:00407752 50 push eax
:00407753 8B4D08 mov ecx, dword ptr [ebp+08]
:00407756 51 push ecx
按f10到这：
:00407771 6A32 push 00000032 *可看到crack
:00407773 8B4DFC mov ecx, dword ptr [ebp-04]
:00407776 83C164 add ecx, 00000064
:00407779 51 push ecx *这里用d ecx看到一个地址00664610，再用d 00664610可看到crack按alt+向下键看到9E58777C（注意大小写）
:0040777A 8B5508 mov edx, dword ptr [ebp+08]
:0040777D 52 push edx

回到注册框输入crack 和9E5877C注册完毕！
也可到次查看：
:00406560 8D4DEC lea ecx, dword ptr [ebp-14] *假的注册码
:00406563 51 push ecx
:00406564 8D5588 lea edx, dword ptr [ebp-78] *真的注册码
:00406567 52 push edx *d edx 看到了？
:00406568 E823070000 call 00406C90
我的注册名crack
注册码9E5877C


Gifline

 标 题:Gifline破解实录 (4千字)
发信人:D-X-C
时 间:2001-8-5 8:42:38
详细信息:
Gifline破解实录

从华军软件园里拽下来一个将文本转成GIF的软件，写一下如何破解它的。

工具：TRW2000 1.22 W32DASM 8.93 REGMON95
适用对象：入门级
破解者：D-X-C E-MAIL：ZHIDA8721@SINA.COM
下载地址：http://www.newhua.com.cn/down/gifline.zip

开始干活了，先用W32DASM调入GIFLINE，查找字符串“is incorrect”，如下：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045C51D(C)
|
:0045C558 0FAF7DF0 imul edi, dword ptr [ebp-10]
:0045C55C 8D55E4 lea edx, dword ptr [ebp-1C]
:0045C55F 8BC7 mov eax, edi
:0045C561 E852A7FAFF call 00406CB8
:0045C566 8B4DE4 mov ecx, dword ptr [ebp-1C]
:0045C569 8D45E8 lea eax, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"dpd-" *后来发现这原来是注册码的前4位固定值
|
:0045C56C BACCC64500 mov edx, 0045C6CC
:0045C571 E8EA75FAFF call 00403B60
:0045C576 8B55E8 mov edx, dword ptr [ebp-18]
:0045C579 8B45F8 mov eax, dword ptr [ebp-08]
:0045C57C E8A376FAFF call 00403C24 *要害CALL，判断注册码
:0045C581 0F8580000000 jne 0045C607 *关键跳转，改成je就OK了
。。。。。。
。。。。。。 *省略的这部分后来总结出是注册成功后向注册表里建两个键值
。。。。。。
* Possible StringData Ref from Code Obj ->"Sorry, This Registration Code " /跳到这就没戏了
->"is incorrect. Please try again " /往前看，看哪可以跳过此处
->"by copying the code from your "
->"License documentation. If problems "
->"persist please contact us via: "
->"dinther@geocities.com"
|
:0045C607 B8FCC64500 mov eax, 0045C6FC
:0045C60C E847B1FDFF call 00437758

还是不过瘾，再破破注册码。用TRW2000载入，点REGISTER后，要求填入E-MAIL和REGISTRATION CODE，填：enjoy@haha (只要有个“@”就可以) 和 1234567890 （真正注册码的长度由你的E-MAIL算出，长度不固定）
下命令 bpx 0167:0045c57c （我的机器是这句，不知道你的，要不是，就自己追追）就是那句 call 00403c24
找到后按F8 追入
:00403C24 53 push ebx
:00403C25 56 push esi
:00403C26 57 push edi
:00403C27 89C6 mov esi, eax
:00403C29 89D7 mov edi, edx
:00403C2B 39D0 cmp eax, edx
:00403C2D 0F848F000000 je 00403CC2
:00403C33 85F6 test esi, esi
:00403C35 7468 je 00403C9F
:00403C37 85FF test edi, edi
:00403C39 746B je 00403CA6
:00403C3B 8B46FC mov eax, dword ptr [esi-04] *送入假注册码的长度 看到EAX=0000000A
:00403C3E 8B57FC mov edx, dword ptr [edi-04] *送入真注册码的长度 看到EDX=0000000B
:00403C41 29D0 sub eax, edx 你可以回过头来将假注册码改成11位，那个问，你咋知道是送注册码的长度？试的呗
。。。。。。
。。。。。。
。。。。。。
以下这一段就是判断注册码的，咋知道？这可是关键地方啦，因为执行完00403C4D这句，看到ECX=34333231，什么意思？就是1234的ASCII码的倒序！你怎么想到的？因为我先前用88888888当注册码，发现ECX=38383838，太显眼了！为什么又要用1234567890当注册码？不这样咋发现它是倒序存放的。
:00403C4D 8B0E mov ecx, dword ptr [esi] *假注册码的前4位，ECX=34333231
:00403C4F 8B1F mov ebx, dword ptr [edi] *真注册码的前4位，EBX=2D647064
即dpd- 的ASCII码的倒序
:00403C51 39D9 cmp ecx, ebx *第一次比较
:00403C53 7558 jnz 00403CAD *不能让它跳转，下指令 r fl z=1 改变零标志
:00403C55 4A dec edx
:00403C56 7415 je 00403C6D *判断是否检查完毕
:00403C58 8B4E04 mov ecx, dword ptr [esi+04] *假注册码接下来的4位，ECX=38373635
:00403C5B 8B5F04 mov ebx, dword ptr [edi+04] *真注册码接下来的4位，EBX=31343036
:00403C5E 39D9 cmp ecx, ebx *第二次比较
:00403C60 754B jnz 00403CAD *不能让它跳转，下指令 r fl z=1 改变零标志
:00403C62 83C608 add esi, 00000008
:00403C65 83C708 add edi, 00000008
:00403C68 4A dec edx
:00403C69 75E2 jne 00403C4D *由于真注册码的长度是11位，所以要跳回00403C4D那句再判断，我就不写了，应该能懂了吧。最后的注册码：dpd-6041164
:00403C6B EB06 jmp 00403C73

整理一下：E-MAIL：enjoy@haha CODE： dpd-6041164
该完了吧？还罗嗦什么？再说一句。前面不是说过注册成功后要往注册表里写东东吗？就是下面：
[HKEY_CURRENT_USER\Software\setenil]
"date"=hex:00,00,00,80,40,92,46,41
"name"= enjoy@haha
这个你用REGMON95可以监测到，其实就是date那句最重要，无论是什么样的注册码最终都得到这句。
好了，是不是说的很详细？给出了三种注册方式。初学者可以好好看看了。


Guitar Pro v3.0

 标 题:Guitar Pro v3.0 的破文 (11千字)
发信人:lancelot[CCG]
时 间:2001-9-8 23:08:48 1
详细信息:
下载：http://211.152.134.220/guitarpp/yu/GuitarPro300.zip

用 dede 找出“确定”按钮的地址 004CEC8C 用 trw2k 下断，
输入注册信息，用户名：LANCELOT[CCG] 注册码：12345-67890-434343
按确定到这里

=================================================================================================

004CEC8C 55 push ebp
004CEC8D 8BEC mov ebp, esp
004CEC8F 81C4E8FEFFFF add esp, $FFFFFEE8
004CEC95 53 push ebx
004CEC96 56 push esi
004CEC97 57 push edi
004CEC98 33C9 xor ecx, ecx
004CEC9A 898DECFEFFFF mov [ebp+$FFFFFEEC], ecx
004CECA0 898DE8FEFFFF mov [ebp+$FFFFFEE8], ecx
004CECA6 894DFC mov [ebp-$04], ecx
004CECA9 894DF8 mov [ebp-$08], ecx
004CECAC 894DF4 mov [ebp-$0C], ecx
004CECAF 894DF0 mov [ebp-$10], ecx
004CECB2 8BD8 mov ebx, eax
004CECB4 33C0 xor eax, eax
004CECB6 55 push ebp

* Possible String Reference to: '檑G?脎_^[嬪]?
|
004CECB7 68FCEE4C00 push $004CEEFC

***** TRY
|
004CECBC 64FF30 push dword ptr fs:[eax]
004CECBF 648920 mov fs:[eax], esp
004CECC2 8D55F8 lea edx, [ebp-$08]

* Reference to control TFLicence.Cle1 : TEdit
|
004CECC5 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: controls.TControl.GetText(TControl):System.String;<-------读取注册码的第1段
| 12345
004CECCB E81C74F6FF call 004360EC
004CECD0 FF75F8 push dword ptr [ebp-$08]
004CECD3 8D55F4 lea edx, [ebp-$0C]

* Reference to control TFLicence.Cle2 : TEdit
|
004CECD6 8B83EC020000 mov eax, [ebx+$02EC]

* Reference to: controls.TControl.GetText(TControl):System.String;<-------读取注册码的第2段
| 67890
004CECDC E80B74F6FF call 004360EC
004CECE1 FF75F4 push dword ptr [ebp-$0C]
004CECE4 8D55F0 lea edx, [ebp-$10]

* Reference to control TFLicence.Cle3 : TEdit
|
004CECE7 8B83F4020000 mov eax, [ebx+$02F4]

* Reference to: controls.TControl.GetText(TControl):System.String;<-------读取注册码的第3段
| 43434
004CECED E8FA73F6FF call 004360EC
004CECF2 FF75F0 push dword ptr [ebp-$10]
004CECF5 8D45FC lea eax, [ebp-$04]
004CECF8 BA03000000 mov edx, $00000003

* Reference to: system.@LStrCatN;<----------------------------------------连接在一起
| 123456789043434
004CECFD E8DA52F3FF call 00403FDC
004CED02 8B45FC mov eax, [ebp-$04]
004CED05 50 push eax
004CED06 8D55F8 lea edx, [ebp-$08]

* Reference to control TFLicence.Nom : TLabel
|
004CED09 8B83CC020000 mov eax, [ebx+$02CC]

* Reference to: controls.TControl.GetText(TControl):System.String;<--------读取用户名
|
004CED0F E8D873F6FF call 004360EC
004CED14 8B45F8 mov eax, [ebp-$08]
004CED17 B92C010000 mov ecx, $0000012C
004CED1C 5A pop edx

|
004CED1D E8EECC0800 call 0055BA10<-------------------------核心计算，跟进去

===============================================================================================

0055BA10 55 push ebp
0055BA11 8BEC mov ebp, esp
0055BA13 83C4EC add esp, -$14
0055BA16 53 push ebx
0055BA17 56 push esi
0055BA18 57 push edi
0055BA19 33DB xor ebx, ebx
0055BA1B 895DF0 mov [ebp-$10], ebx
0055BA1E 895DEC mov [ebp-$14], ebx
0055BA21 894DF4 mov [ebp-$0C], ecx
0055BA24 8955F8 mov [ebp-$08], edx
0055BA27 8945FC mov [ebp-$04], eax
0055BA2A 8B45FC mov eax, [ebp-$04]

* Reference to: system.@LStrAddRef;
|
0055BA2D E89E86EAFF call 004040D0
0055BA32 8B45F8 mov eax, [ebp-$08]

* Reference to: system.@LStrAddRef;
|
0055BA35 E89686EAFF call 004040D0
0055BA3A 33C0 xor eax, eax
0055BA3C 55 push ebp
0055BA3D 68D7BC5500 push $0055BCD7

***** TRY
|
0055BA42 64FF30 push dword ptr fs:[eax]
0055BA45 648920 mov fs:[eax], esp
0055BA48 33DB xor ebx, ebx
0055BA4A 837DFC00 cmp dword ptr [ebp-$04], +$00
0055BA4E 740D jz 0055BA5D
0055BA50 8B45F8 mov eax, [ebp-$08]

* Reference to: system.@LStrLen:Integer;
| or: system.@DynArrayLength;
| or: system.DynArraySize(Pointer):Integer;
|
0055BA53 E8C484EAFF call 00403F1C
0055BA58 83F80F cmp eax, +$0F
0055BA5B 7407 jz 0055BA64
0055BA5D 33DB xor ebx, ebx
0055BA5F E94B020000 jmp 0055BCAF
0055BA64 33FF xor edi, edi
0055BA66 8B45FC mov eax, [ebp-$04]

* Reference to: system.@LStrLen:Integer;
| or: system.@DynArrayLength;
| or: system.DynArraySize(Pointer):Integer;
|
0055BA69 E8AE84EAFF call 00403F1C
0055BA6E 8BF0 mov esi, eax
0055BA70 85F6 test esi, esi
0055BA72 7E21 jle 0055BA95
0055BA74 B901000000 mov ecx, $00000001
0055BA79 8B45FC mov eax, [ebp-$04]
0055BA7C 0FB64408FF movzx eax, byte ptr [eax+ecx-$01]<-------用户名的第一个字 L==0x4c
0055BA81 F7E9 imul ecx<-------------------------------乘上序号
0055BA83 03F8 add edi, eax<--------------------------和加上edi中的值
0055BA85 8BC7 mov eax, edi
0055BA87 BFE8030000 mov edi, $000003E8
0055BA8C 99 cdq
0055BA8D F7FF idiv edi<-------------------------------和除去 0x3e8
0055BA8F 8BFA mov edi, edx<--------------------------余数放到edi
0055BA91 41 inc ecx
0055BA92 4E dec esi
0055BA93 75E4 jnz 0055BA79<--------------------------循环计算，用户名的13个字母
0055BA95 85FF test edi, edi
0055BA97 7505 jnz 0055BA9E
0055BA99 BF01000000 mov edi, $00000001
0055BA9E 8B45F4 mov eax, [ebp-$0C]<---------------------0x12c
0055BAA1 2DDC000000 sub eax, $000000DC<---------------------0x12c-0xdc==0x50
0055BAA6 03C7 add eax, edi<---------------------------0x50+0x15==0x65
0055BAA8 40 inc eax<--------------------------------0x65+0x1==0x66
0055BAA9 B9E8030000 mov ecx, $000003E8
0055BAAE 99 cdq
0055BAAF F7F9 idiv ecx
0055BAB1 8BFA mov edi, edx<-------------------------- 0x66
0055BAB3 8D45F0 lea eax, [ebp-$10]
0055BAB6 8B55F8 mov edx, [ebp-$08]
0055BAB9 8A520A mov dl, byte ptr [edx+$0A]<--------------注册码的第11位

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
0055BABC E88383EAFF call 00403E44
0055BAC1 8B45F0 mov eax, [ebp-$10]
0055BAC4 50 push eax
0055BAC5 8D45EC lea eax, [ebp-$14]
0055BAC8 8B55F8 mov edx, [ebp-$08]
0055BACB 8A12 mov dl, byte ptr [edx]<--------------注册码的第1位

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
0055BACD E87283EAFF call 00403E44
0055BAD2 8B45EC mov eax, [ebp-$14]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
0055BAD5 E8CAD4EAFF call 00408FA4
0055BADA 8BF0 mov esi, eax
0055BADC 8D45EC lea eax, [ebp-$14]
0055BADF 8B55F8 mov edx, [ebp-$08]
0055BAE2 8A5201 mov dl, byte ptr [edx+$01]<--------------注册码的第2位

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
0055BAE5 E85A83EAFF call 00403E44
0055BAEA 8B45EC mov eax, [ebp-$14]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
0055BAED E8B2D4EAFF call 00408FA4
0055BAF2 03F0 add esi, eax<--------------注册码的第1，2位之和
0055BAF4 8BC6 mov eax, esi
0055BAF6 F7EF imul edi<-------------------乘上0x66
0055BAF8 B90A000000 mov ecx, $0000000A<--------除与 0xa
0055BAFD 99 cdq
0055BAFE F7F9 idiv ecx
0055BB00 8BC2 mov eax, edx<-------------余数放在eax
0055BB02 8D55EC lea edx, [ebp-$14]

* Reference to: sysutils.IntToStr(System.Integer):System.AnsiString;overload;
|
0055BB05 E836D4EAFF call 00408F40
0055BB0A 8B55EC mov edx, [ebp-$14]
0055BB0D 58 pop eax

* Reference to: system.@LStrCmp;<-------------------------------余数在与注册码的第10位比较
|
0055BB0E E81985EAFF call 0040402C
0055BB13 0F8596010000 jnz 0055BCAF<-------------不想等就完蛋了
下面循环计算略

=================================================================================================

总结一下：

1) 用户名：LANCELOT[CCG]==>0x4c,0x41,0x4e,0x43,0x45,0x4c,0x4f,0x54,0x5b,0x43,0x43,0x47,0x5d
2) (0x4c*0x1+0x0 ) % 0x3e8==0x4c
(0x41*0x2+0x4c ) % 0x3e8==0xce
(0x4e*0x3+0xce ) % 0x3e8==0x1b8
(0x43*0x4+0x1b8) % 0x3e8==0x2c4
(0x45*0x5+0x2c4) % 0x3e8==0x35
(0x4c*0x6+0x35 ) % 0x3e8==0x1fd
(0x4f*0x7+0x1fd) % 0x3e8==0x3e
(0x54*0x8+0x3e ) % 0x3e8==0x2de
(0x5b*0x9+0x2de) % 0x3e8==0x229
(0x43*0xa+0x229) % 0x3e8==0xdf
(0x43*0xb+0xdf ) % 0x3e8==0x3c0
(0x47*0xc+0x3c0) % 0x3e8==0x32c
(0x5d*0xd+0x32c) % 0x3e8==0x15<-------这个值如果为0，就用1代入
3) (0x12c-0xdc+0x15+0x1) % 0x3e8==0x66
4) 注册码：123456789043434
5) ((0x1+0x2)*0x66) % 0xa==0x6<----------注册码的第11位
((0x3+0x4)*0x66) % 0xa==0x4<----------注册码的第12位
((0x5+0x6)*0x66) % 0xa==0x2<----------注册码的第13位
((0x7+0x8)*0x66) % 0xa==0x0<----------注册码的第14位
((0x9+0x0)*0x66) % 0xa==0x8<----------注册码的第15位

所以：

用户名：LANCELOT[CCG] 注册码： 12345-67890-64208

Crack by lancelot[CCG][FCG] 2001.09.08


HAPPYEO电子琴 2.4

 标 题:用TRW 2000破解HAPPYEO电子琴 2.4 - 音频工具 (4千字)
发信人:X man
时 间:2001-8-20 8:46:07
详细信息:
用TRW 2000破解HAPPYEO电子琴 2.4 - 音频工具
作者:X man
等级：easy

授权方式： 共享软件
运行平台： Win9x/Me/NT/20000
官方主页： http://www.happyeo.com/
编辑评定：
功能简介： 　　一个用电脑的声卡和键盘来模拟电子琴的程序。主要功能特点：有两个独立的键盘，用左右手
分别演奏。可分别设置不同的音色、音区和效果。128种音色，复音数仅受声卡限制。12种效果！(包括自动双
音、自动和弦、双音色混合，甚至还有模拟弹拨乐器的音色）。有自动伴奏功能！12种自动伴奏风格，支持节
奏填充、节奏同步启动。可以录音，放音，暂停，快放，循环放音。放音的同时仍然可以正常演奏！同时支持
声卡和喇叭。即使使用喇叭，也有四种不同的“音色”。界面逼真，操作方便，同时支持鼠标和键盘。帮助详
尽。绿色软件，无需安装。

１.把《HAPPYEO电子琴》主程序happyeo.exe拷到文件内型检测fi目录下进行文件是否加壳检测，还好没有任何的
壳。
２.运行《HAPPYEO电子琴》，点右键选“注册”
马上弹出对话框，填入以下信息
用户名：lbcoolboy
地址：lbcoolboylbcoolboy
注册码：123456
（顺便说一下，《HAPPYEO电子琴》好想很为我们ＣＲＣＡＫＥＲ着想，还提示用户名、地址、注册码的限定
条件哟！^_^）
３。加载ＴＲＷ２Ｋ，按下热键“CTRL+N”
  ＢＰＸ　ＨＭＥＭＣＰＹ
  Ｇ
４。回到《HAPPYEO电子琴》点“确定”，马上被ＴＲＷ２Ｋ截下
  ＢＤ　＊
  ＰＭＯＤＵＬＥ
按下Ｆ１２七次（按八下就会出错对话框，说明按七下就到了接近计算注册码的地址），来到
016F:510986A6 ADD [EAX],AL
016F:510986A8 POP ES
016F:510986A9 ADD [EAX],AL
016F:510986AB ADD [EBP-75],DL
016F:510986AE IN AL,DX
016F:510986AF MOV ECX,06
016F:510986B4 PUSH BYTE +00
016F:510986B6 PUSH BYTE +00
016F:510986B8 DEC ECX
016F:510986B9 JNZ 510986B4
016F:510986BB PUSH EBX
016F:510986BC MOV EBX,EAX
016F:510986BE XOR EAX,EAX
016F:510986C0 PUSH EBP
016F:510986C1 PUSH DWORD 51098876
016F:510986C6 PUSH DWORD [FS:EAX]
016F:510986C9 MOV [FS:EAX],ESP
016F:510986CC LEA EDX,[EBP-04]
016F:510986CF MOV EAX,[EBX+02D0]
016F:510986D5 CALL 510312E0
016F:510986DA MOV EAX,[EBP-04]
016F:510986DD CALL 51003F28
016F:510986E2 CMP EAX,BYTE +04　　　／／用户名不的小于４个字符，否则出错
016F:510986E5 JL NEAR 5109883C
016F:510986EB LEA EDX,[EBP-08]
016F:510986EE MOV EAX,[EBX+02EC]
016F:510986F4 CALL 510312E0
016F:510986F9 MOV EAX,[EBP-08]
016F:510986FC CALL 51003F28
016F:51098701 CMP EAX,BYTE +0C　　　／／地址不得小于１２个字符，否则出错
016F:51098704 JL NEAR 5109883C
016F:5109870A LEA EDX,[EBP-0C]
016F:5109870D MOV EAX,[EBX+02D4]
016F:51098713 CALL 510312E0
016F:51098718 MOV EAX,[EBP-0C]
016F:5109871B CALL 51003F28
016F:51098720 CMP EAX,BYTE +06　　　／／注册码必须是６个字符，否则出错
016F:51098723 JNZ NEAR 5109883C
016F:51098729 LEA EDX,[EBP-10]
016F:5109872C MOV EAX,[EBX+02D4]
016F:51098732 CALL 510312E0
016F:51098737 MOV EAX,[EBP-10]
016F:5109873A PUSH EAX
016F:5109873B LEA EDX,[EBP-18]
016F:5109873E MOV EAX,[EBX+02EC]
016F:51098744 CALL 510312E0
016F:51098749 MOV EAX,[EBP-18]
016F:5109874C PUSH EAX
016F:5109874D LEA EDX,[EBP-1C]
016F:51098750 MOV EAX,[EBX+02D0]
016F:51098756 CALL 510312E0
016F:5109875B MOV EAX,[EBP-1C]
016F:5109875E LEA ECX,[EBP-14]
016F:51098761 POP EDX
016F:51098762 CALL 51097B40
016F:51098767 MOV EDX,[EBP-14]
016F:5109876A POP EAX　　　　　　　　　／／d eax得到OWXEEH
                                            ／／６个字符？难到是注册码？
                                            ／／没错，别怀疑！
016F:5109876B CALL 51004038　　　　　　／／很可疑，进去看看（注册码的比较）
016F:51098770 JNZ NEAR 51098826

进入 CALL 51004038
016F:51004038 PUSH EBX
016F:51004039 PUSH ESI
016F:5100403A PUSH EDI
016F:5100403B MOV ESI,EAX
016F:5100403D MOV EDI,EDX
016F:5100403F CMP EAX,EDX　　　　／／Ｄ　ＥＡＸ
                                      ／／Ｄ　ＥＤＸ分别得到真假注册码
／／比较真注册码和假注册码
016F:51004041 JZ NEAR 510040D6
..........
OK，现在就完成了《HAPPYEO电子琴》的破解
好吧，收工！对了我的注册码是：
NAME：lbcoolboy
地址：lbcoolboylbcoolboy
注册码：OWXEEH

******************************************************************
后记：
软件注册后在HKEY_CURRENT_USER\Software\HappyEO2.4下建立注册信息


HAPPYEO电子琴2.31

 标 题:HAPPYEO电子琴简单破解 (1千字)
发信人:jsjyt
时 间:2001-5-26 9:32:49
详细信息:
软件名称：HAPPYEO电子琴
整理日期：2001.5.21
最新版本：2.31
文件大小：1532KB
软件授权：共享软件
使用平台：Win9x/Me/NT/20000
发布公司：home page
软件简介：
    一个用电脑的声卡和键盘来模拟电子琴的程序。主要功能特点：有两个独立的键盘，用左右手分别演奏。可分别设置不同的音色、音区和效果。128种音色，复音数仅受声卡限制。12种效果！(包括自动双音、自动和弦、双音色混合，甚至还有模拟弹拨乐器的音色）。有自动伴奏功能！12种自动伴奏风格，支持节奏填充、节奏同步启动。可以录音，放音，暂停，快放，循环放音。放音的同时仍然可以正常演奏！同时支持声卡和喇叭。即使使用喇叭，也有四种不同的“音色”。界面逼真，操作方便，同时支持鼠标和键盘。帮助详尽。绿色软件，无需安装。2.0正式版主要功能特点：(New!)支持MIDI文件的输入和输出！(New!)支持MIDI键盘和带MIDI接口的电子琴！支持多指和弦！(New!)支持多音轨录音！(New!)同时支持GM、XG、GS标准。可以自由地编辑XG和GS里的近千种音色！有两个独立的键盘，用左右手分别演奏。可分别设置不同的音色、音区和效果。128种音色，复音数仅受声卡限制。11种效果!(包括自动双音、自动和弦、双音色混合，甚至还有模拟弹拨乐器的音色)。有自动伴奏功能！12种自动伴奏风格，支持节奏填充、节奏同步启动。可以录音，放音，快放，循环放音。可以“边放边弹”和“边放边录”！同时支持声卡和喇叭。即使使用喇叭，也有四种不同的“音色”。界面逼真，操作方便，同时支持鼠标和键盘。绿色软件，无需安装。

破解工具：trw2000
1.添注册名，地址，注册码。其中名字不能少于4个字符，地址不能少于12个字符注册码为6个字符
呵呵，我怎么知道的？因为我跟了一边，他告诉我的，呵呵
2.下断点hmemcpy，F5，bc * pmodule
3.F10单步跟踪，可以看出它把你输入的东东做一下变换，压入堆栈，最后的一个call是算码的call
看见最后一个call以后F8进入，F10一直到5109885e 下d edx看见注册码
我的注册信息：
name：yahoo
addr:hebeidaxuejisuanjikexuexueyuan(长吧）
code：3E5NCG
写个crackcode.ini
crackcode.ini
[Options]
CommandLine=happyeo.exe
Mode=2
First_Break_Address=5109885F
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=5100403F
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX


HEdit 2.0

标 题:HEdit 2.0 的注册破解过程 <<-------可能过时了高手末入 (8千字)
发信人:pcrocker
时 间:2001-2-23 12:15:23
详细信息:
HEdit 2.0 的注册破解过程
Hedit 2.0 by Yuri Software
cracck by PcRocker（本文不得用于任何商业用途，转载时请保持完整性）

功能： 文件编辑器
最新版本： 不详
下载地址： 不详

最近的破解没什么进展，主要是碰到的APP都是用上网注册的方式，很难找到注册码，头都大了 ：-（
无奈之下，只有挑软柿子捏了，大家不要笑我。

给程序打补丁当然少不了文件编辑器，如果你只为修改文件HEdit是相当好用的：优点是程序本身很小，不管文件有多大，打开的都非常快；缺点是执行一次以后，它会将自己作为所有的无程序关联文件的默认打开方式。
破解工具是SOFT-ICE，写手记的工具嘛当然是 W32DASM。

该APP的试用期到了之后，启动时出现过期的对话框，要求输入注册码，当注册信息错误时，就告诉你错啦（还好，一声不响的让人心里没底）。话不多说，开始。

在S—ICE中下 BPX MESSAGEBOXA，注册失败后按3次F12拦截如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405047(C)
|
:00405064 B801000000 mov eax, 00000001
:00405069 5E pop esi
:0040506A C3 ret

:0040506B 56 push esi <---- 这种“天外飞仙”的调用好象经常出现
:0040506C 57 push edi
:0040506D 8BF1 mov esi, ecx
:0040506F E808AE0200 call 0042FE7C
:00405074 8B7804 mov edi, dword ptr [eax+04]
:00405077 6A01 push 00000001
:00405079 8BCE mov ecx, esi
:0040507B E870890100 call 0041D9F0
:00405080 85C0 test eax, eax
:00405082 7435 je 004050B9
:00405084 FF7660 push [esi+60]
:00405087 FF765C push [esi+5C]
:0040508A 8BCF mov ecx, edi
:0040508C E82DEFFFFF call 00403FBE <---- 这个CALL是关键，看下面的分析
:00405091 85C0 test eax, eax <---- EAX=0 表示失败，比较少见
:00405093 7510 jne 004050A5 <---- 如果不跳，让你死的好看
:00405095 6AFF push FFFFFFFF
:00405097 6A00 push 00000000

* Possible Reference to Dialog: DialogID_0088
|

* Possible Reference to String Resource ID=00136: "The user name and/or registration number you entered are inc"
|
:00405099 6888000000 push 00000088
:0040509E E8BCFC0100 call 00424D5F <---- 显示出错的消息框
:004050A3 EB14 jmp 004050B9 <---- 你会停在这里

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405093(C)
|
:004050A5 FF7660 push [esi+60]
:004050A8 FF765C push [esi+5C]
:004050AB 8BCF mov ecx, edi
:004050AD E8CFEEFFFF call 00403F81
:004050B2 8BCE mov ecx, esi
:004050B4 E86A5A0100 call 0041AB23

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00405082(C), :004050A3(U)
|
:004050B9 5F pop edi
:004050BA 5E pop esi
:004050BB C3 ret

这里是计算与比较注册码的 call 403FBE:

* Referenced by a CALL at Addresses:
|:00403A3D , :00403CDE , :00403E07 , :0040508C
|
:00403FBE 55 push ebp
:00403FBF 8BEC mov ebp, esp
:00403FC1 81EC00010000 sub esp, 00000100
:00403FC7 6800010000 push 00000100
:00403FCC 8D8D00FFFFFF lea ecx, dword ptr [ebp+FFFFFF00]
:00403FD2 FF7508 push [ebp+08]
:00403FD5 51 push ecx
:00403FD6 E8054F0000 call 00408EE0 <---- 将注册姓名放在 [EBP-100]
:00403FDB 83C40C add esp, 0000000C <---- 到[EBP]的剩余字节以 00 填充
:00403FDE 8D8D00FFFFFF lea ecx, dword ptr [ebp+FFFFFF00]
:00403FE4 51 push ecx
:00403FE5 E856200100 call 00416040 <---- 将注册姓名转为大写，见下面
:00403FEA 83C404 add esp, 00000004
:00403FED B904000000 mov ecx, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404015(C)
|
:00403FF2 8BC1 mov eax, ecx
:00403FF4 41 inc ecx
:00403FF5 99 cdq <---- 相当于 MOV EDX，00
:00403FF6 33C2 xor eax, edx <----
:00403FF8 2BC2 sub eax, edx <----
:00403FFA 83E003 and eax, 00000003 <---- 这几个语句使EAX按顺序取0、1、2、3
:00403FFD 33C2 xor eax, edx <----
:00403FFF 2BC2 sub eax, edx <----
:00404001 8A940DFFFEFFFF mov dl, byte ptr [ebp+ecx-00000101] <---- 从第五个字节开始取一个字节
:00404008 30940500FFFFFF xor byte ptr [ebp+eax-00000100], dl <---- 与前四个字节中的一个取异或
:0040400F 81F900010000 cmp ecx, 00000100 <---- 注册姓名最长为255个字节
:00404015 7CDB jl 00403FF2
:00404017 8B8500FFFFFF mov eax, dword ptr [ebp+FFFFFF00] <---- 结果送EAX
:0040401D 85C0 test eax, eax
:0040401F 7D02 jge 00404023
:00404021 F7D8 neg eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040401F(C)
|
:00404023 39450C cmp dword ptr [ebp+0C], eax <---- 与输入的数字简单的比较
:00404026 7509 jne 00404031
:00404028 85C0 test eax, eax
:0040402A B801000000 mov eax, 00000001
:0040402F 7502 jne 00404033

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404026(C)
|
:00404031 33C0 xor eax, eax <---- EAX=0 就错了

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040402F(C)
|
:00404033 8BE5 mov esp, ebp
:00404035 5D pop ebp
:00404036 C20800 ret 0008

这个CALL是将小写字母转为大写，汇编很熟的就略过吧。

* Referenced by a CALL at Address:
|:00403FE5
|
:00416040 83EC04 sub esp, 00000004
:00416043 53 push ebx
:00416044 56 push esi
:00416045 57 push edi
:00416046 55 push ebp
:00416047 33ED xor ebp, ebp
:00416049 392D984C4400 cmp dword ptr [00444C98], ebp
:0041604F 752C jne 0041607D
:00416051 8B5C2418 mov ebx, dword ptr [esp+18]
:00416055 8BC3 mov eax, ebx
:00416057 803B00 cmp byte ptr [ebx], 00 <---- 注册姓名是否为空
:0041605A 7417 je 00416073

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00416071(C)
|
:0041605C 8A08 mov cl, byte ptr [eax]
:0041605E 80F961 cmp cl, 61 <---- 61 is 'a'
:00416061 7C0A jl 0041606D
:00416063 80F97A cmp cl, 7A <---- 7a is 'z'
:00416066 7F05 jg 0041606D
:00416068 80E920 sub cl, 20
:0041606B 8808 mov byte ptr [eax], cl

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00416061(C), :00416066(C)
|
:0041606D 40 inc eax
:0041606E 803800 cmp byte ptr [eax], 00
:00416071 75E9 jne 0041605C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041605A(C)
|
:00416073 8BC3 mov eax, ebx
:00416075 5D pop ebp
:00416076 5F pop edi
:00416077 5E pop esi
:00416078 5B pop ebx
:00416079 83C404 add esp, 00000004
:0041607C C3 ret

用我名字的注册码----name：pcrocker（与大小写无关）code：488048659
该APP的注册支持一个字节：如‘a’<-----> 65，也支持汉字：‘我爱你’<-----> 1364184822（谁的手机号*_*）

原理清楚后，写注册机就很容易，我这里WINDOWS下的编辑器只有VB，可惜我不愿用也不会用，哪位有兴趣就写出注册机。

感觉采用这种注册形式的APP比较憨厚，最容易CRACCK，不要破的太过分。

时间：2000-02-23

标 题:VBA写的注册机, 省得编译了。:) (1千字)
发信人:henryw
时 间:2001-2-23 20:56:27
详细信息:

先在Excel中录制一个宏，然后编辑它，用下面的程序覆盖原有的空宏。

A1里填上名字（用英文，我不会解决中文的问题 :( ）。
运行宏，A2中应该是注册码了。:)

我的编程水平很差，别笑话我。
-------------------- cut here -----------------------

Option Base 1
Sub 宏1()
'
Dim HAryNum(4) As Integer, HAryStr(4) As String
Dim OutCode As Long, InName As String, CurStrNum As String
Dim i As Integer, Dgt As Integer
Dim OCstr As String

InName = Range("A1").Value
InName = UCase(InName)

For i = 1 To 4
HAryNum(i) = Asc(Mid(InName, i, 1))
Next

For i = 5 To &H100
Dgt = ((i - 1) And 3) + 1
If i <= Len(InName) Then
CurStrNum = Asc(Mid(InName, i, 1))
Else
CurStrNum = &H0
End If

HAryNum(Dgt) = HAryNum(Dgt) Xor CurStrNum
Next

For i = 4 To 1 Step -1
HAryStr(i) = Hex(HAryNum(i))
If Len(HAryStr(i)) = 1 Then
HAryStr(i) = "0" & HAryStr(i)
End If
OCstr = OCstr + HAryStr(i)
Next

OutCode = "&H" + OCstr

Range("A2").Value = OutCode
'
End Sub

------------------ end ------------------


hellfire2000

标 题:hellfire2000破解过程及注册机的编写（上） (4千字)
发信人:夜月
时 间:2001-1-19 10:49:16
详细信息:
文章名称：hellfire2000破解过程及注册机的编写（上）
作者：夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的：帮助和我一样的广大初学者。
软件名称：hellfire2000

软件简介：很酷的屏幕保护软件。与流行的那些几张图片换来换去的屏保完全不同。它可以完全让你的桌面“燃烧”
起来，还有很逼真的背景音效。如果能再加上一点嗅觉的刺激的话，呵呵...你可能真的会以为你的宝贝
compute烧起来了呢！
保护分析：1.时间保护分析：
该软件把它的时间信息保存在：
[HKEY_CLASSES_ROOT\AppID\HCB1CD94CF]下，（埋得好怪呀！呵呵..）过期后，将该键删除，就可以
继续使用了。
2.注册保护分析：
在它的设置项里面就有三个输入框，分别是输入：user name,company,reg.key.用trw2000的万能中断
hmemcpy+pmodule很容易找到关键的比较处。它会先判断reg.key的长度是否为偶数，不是的话直接出
错。是的话，再继续判断是否为12位数字。不是的话，又是直接出错，而且它的这个判断和平常我们常
见的用ecx计数的判断不同（下面我会提到），只有过了这两关，才能到达计算注册码的核心代码处。
算出来的注册吗以两位一组的形式和你输入的reg.key比较，而且是数字比较，不是ascii码比较。用
d命令不能直接在内存窗口的右边看到注册码。它以整数的形式存放在左边。
注册成功后，注册信息保存在：
[HKEY_CURRENT_USER\SOFTWARE\FP SOFTWARE\HELLFIRE-2000\HELLFIRE\CONFIG]下的：
LicenseCompany
LicenseKEY
LicenseUSER
三个键中。删除后程序又可以重新注册。
3.程序自我保护分析：
我曾试图用暴力破解法改动一个字节使程序注册，（具体地点后面我会提到）但是第二次程序运行时，
提示我：可执行文件被修改。小弟功力不够，不能够破解这个“地雷”，那位大虾有兴趣帮小弟一把，
小弟感激不尽！
教程正文：
1.输入注册信息：
user name:luoyi
company: upc
reg.key: 654321
2.用trw2000跟踪，可找到如下代码：
:00405EAA C784249400000000000000 mov dword ptr [esp+00000094], 00000000
:00405EB5 E806FDFFFF call 00405BC0 <---------CALL1
:00405EBA 83C40C add esp, 0000000C
:00405EBD 85C0 test eax, eax
:00405EBF 0F84FD000000 je 00405FC2
:00405EC5 8D4C2410 lea ecx, dword ptr [esp+10]
:00405EC9 E8620B0000 call 00406A30 <---------CALL2
:00405ECE 85C0 test eax, eax
:00405ED0 0F84EC000000 je 00405FC2
:00405ED6 53 push ebx
可以看出：程序有两个子程序来判断注册码的正确与否。可是，就我跟踪的结果来看，好像只有
CALL1起了判断作用。好了，用F8跟入CALL1,继续跟踪，会看到如下代码：
:00405BE6 6800010000 push 00000100
:00405BEB 50 push eax
:00405BEC 51 push ecx
:00405BED E8DEFDFFFF call 004059D0 <----------CALL3
:00405BF2 83C40C add esp, 0000000C
:00405BF5 83F806 cmp eax, 00000006 <-----------reg.key的位数比较
:00405BF8 7417 je 00405C11
大家看到了吧，一般的长度比较，都是用ecx作计数器来进行的，可是这个程序有点不一样，它是把
长度的一半作为比较依据。（小弟在此耗时1个小时，才搞清楚eax是什么东东,5555...真丢人！）
OK！长度的地雷已经排除了，下面进入正式的注册码计算阶段：
:00405C6F 6A06 push 00000006
:00405C71 51 push ecx
:00405C72 E869FCFFFF call 004058E0 <---------关键算法所在处
:00405C77 83C40C add esp, 0000000C
:00405C7A 85C0 test eax, eax
:00405C7C 752B jne 00405CA9
大家千万不要被这个TEST EAX,EAX所迷惑，在这个关键算法的CALL里，出口的EAX总是为1。也就是
说，程序在此总是会往下面跳，跳到哪？呵呵....当然就是下面的这一段关键比较了：
:00405CA9 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405CBE(C)
|
:00405CAB 8A540408 mov dl, byte ptr [esp+eax+08] --------------------
:00405CAF 8A8C0408010000 mov cl, byte ptr [esp+eax+00000108]
:00405CB6 3AD1 cmp dl, cl <-----------看到注册码的比较了吗？
:00405CB8 75C4 jne 00405C7E
:00405CBA 40 inc eax
:00405CBB 83F806 cmp eax, 00000006 循环6次，正好比完12位数，只要有一个
:00405CBE 72EB jb 00405CAB 不对，就...嘿嘿....------------------
:00405CC0 8D4C2400 lea ecx, dword ptr [esp]
:00405CC4 C7842410020000FFFFFFFF mov dword ptr [esp+00000210], FFFFFFFF
:00405CCF E8F10A0100 call 004167C5
:00405CD4 8B8C2408020000 mov ecx, dword ptr [esp+00000208]
我在开始的时候说的改动一个字节注册，到了这时候，大家应该都明白了吧?就是把405CB8处的JNE
改成JE就OK了！可惜....呵呵...不过，这点困难还难不到我们，我们既然找到了关键算法的CALL
那我们能不能写出注册机呢？（其实，这个时候，在内存窗口已经可以看到注册码了）。
出于长度的原因，软件的算法分析及注册机的编写我就写到这篇文章的（下）中去了！

标 题:hellfire2000破解过程及注册机的编写（下） (6千字)
发信人:夜月
时 间:2001-1-19 10:49:58
详细信息:

文章名称：hellfire2000破解过程及注册机的编写（下）
作者：夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的：帮助和我一样的广大初学者。
软件名称: hellfire2000

软件简介：略

保护分析：略
教程正文
进入该软件注册算法的关键call中后，我们可以看到如下代码：
:00405916 8AC8 mov cl, al --------------------------------
:00405918 2455 and al, 55
:0040591A 80E1AA and cl, AA
:0040591D 2AC8 sub cl, al
:0040591F 8A442410 mov al, byte ptr [esp+10] 第一步 循环次数
:00405923 02C1 add al, cl 由名字和公司决定
:00405925 47 inc edi
:00405926 88442410 mov byte ptr [esp+10], al
:0040592A 8A0437 mov al, byte ptr [edi+esi]
:0040592D 84C0 test al, al
:0040592F 75E5 jne 00405916 ------------------------------

:00405931 83FF05 cmp edi, 00000005
:00405934 7D08 jge 0040593E
.............
.............
:0040593E 8B4C2410 mov ecx, dword ptr [esp+10]
:00405942 33D2 xor edx, edx
:00405944 81E1FF000000 and ecx, 000000FF
:0040594A 8954241C mov dword ptr [esp+1C], edx
:0040594E 2BCE sub ecx, esi
:00405950 894C2418 mov dword ptr [esp+18], ecx
:00405954 EB04 jmp 0040595A
.............
.............
:00405956 8B4C2418 mov ecx, dword ptr [esp+18] ----------------------

:0040595A 8BC2 mov eax, edx
:0040595C 99 cdq
:0040595D F7FB idiv ebx edx中保存了循环次数除以6的余数n
:0040595F 8D0431 lea eax, dword ptr [ecx+esi] <------eax=第一步的结果+n
:00405962 B90A000000 mov ecx, 0000000A
:00405967 8D3C2A lea edi, dword ptr [edx+ebp] edi=ebp+n
:0040596A 99 cdq
:0040596B F7F9 idiv ecx 第一步的结果除以a,
:0040596D 8A0E mov cl, byte ptr [esi]
:0040596F 8A07 mov al, byte ptr [edi]
:00405971 8A92C4FD4100 mov dl, byte ptr [edx+0041FDC4] <------查表（就是在注册机
:00405977 32D1 xor dl, cl 里的table[10]那张
:00405979 32C2 xor al, dl 表。
:0040597B 8B54241C mov edx, dword ptr [esp+1C]
:0040597F 8807 mov byte ptr [edi], al
:00405981 33C0 xor eax, eax
:00405983 85DB test ebx, ebx
:00405985 7E0C jle 00405993

:00405987 8A0E mov cl, byte ptr [esi]---------------------
:00405989 02CA add cl, dl
:0040598B 300C28 xor byte ptr [eax+ebp], cl 小二步 6次
:0040598E 40 inc eax
:0040598F 3BC3 cmp eax, ebx
:00405991 7CF4 jl 00405987--------------------------------

:00405993 8A4601 mov al, byte ptr [esi+01]
:00405996 42 inc edx
:00405997 46 inc esi 大二步 由名字和公司决定
:00405998 8954241C mov dword ptr [esp+1C], edx 保存edx值 循环次数
:0040599C 84C0 test al, al
:0040599E 75B6 jne 00405956 -----------------------------------------

:004059A0 33F6 xor esi, esi
:004059A2 85DB test ebx, ebx
:004059A4 7E1A jle 004059C0

:004059A6 8A042E mov al, byte ptr [esi+ebp]--------------------
:004059A9 8AD0 mov dl, al
:004059AB 80E2F3 and dl, F3
:004059AE C0E802 shr al, 02
:004059B1 C0E202 shl dl, 02
:004059B4 2433 and al, 33 第三步 6次
:004059B6 0AD0 or dl, al
:004059B8 88142E mov byte ptr [esi+ebp], dl
:004059BB 46 inc esi
:004059BC 3BF3 cmp esi, ebx
:004059BE 7CE6 jl 004059A6 ---------------------------------

:004059C0 5F pop edi
:004059C1 5E pop esi
:004059C2 5D pop ebp
:004059C3 B801000000 mov eax, 00000001
:004059C8 5B pop ebx
:004059C9 59 pop ecx
:004059CA C3 ret
注册机的编写实际上就是读懂汇编代码的问题，我把我的理解都写在代码旁边，希望对大家能有一些帮
助。下面我只是粗线条地分析一下注册码的产生过程，让大家在更短的时间内读懂上面的代码。
这段代码用到的数据是由user name,company组合而成的。在这里，我的是luoyiupc,(也就是把两个
字符串组合一下）。设这个字符串为name[]。
这一段代码由3个循环组成，其中，第二个循环还套了一个小循环。整个注册码的产生过程是这样的：
1.经过第一个循环，由name[]产生一个数N。其中要注意进借位的问题。
2.经过第二个循环，由name[]和N长生一个12位的整数。每两位做一个元素，组成数组code[6]。
3.经过第三个循环，由code[6]产生最终注册码。存放在ebp为首的地址空间里。
下面就是我用tc2.0编的注册机程序的源代码，由于不太熟悉c语言，编的程序效率肯定不太高。如有
哪位大虾能够指点一二，小弟感激不尽！另外需要说明的一点就是注册码不区分大小写，在我的程序里
输出用的都是小写字母，你把它们改称大写也能成功注册。
注册机的编写：
#include <string.h>
#include <stdio.h>
main(){
static char name[40];
char company[20];
int al,cl,dl,N=0,TEMP=0,i,j,index,high,low;
int code[6]={0};
int table[10]={1,2,3,0x1E,0,0x39,0x49,0x48,0x1B,0};
printf("Please input your name:");
gets(name);
printf("Please input your company:");
gets(company);
strcat(name,company);
for(i=0;(al=cl=name[i])!='\0';i++){
al&=0x55;cl&=0xAA;
TEMP=(cl>al)?(cl-al):(256+cl-al);
N=(N+TEMP)&0xFF;
}
for(i=0;(cl=name[i])!='\0';i++){
index=(N+i)%10;
dl=table[index];
al=code[i%6];
dl^=cl;
code[i%6]=al^dl;
cl+=i;
for(j=0;j<6;j++){
code[j]^=cl;
}
}
printf("Your registration code is:\n");
for(i=0;(al=dl=code[i])&&i<6;i++){
dl&=0xF3;dl<<=2;dl&=0xFF;
al>>=2;al&=0x33;al&=0xFF;
code[i]=(dl|al);
printf("%2x",code[i]);
}
}


HelpBuilder 1.00

标 题:是不是这个？http://www.irsys.com.cn:81/publish/hb1_00sc.exe (4千字)
发信人:blowfish
时 间:2001-4-24 10:08:19
详细信息:

HelpBuilder 1.00

启动时判断注册码（cover.pas）：

* Possible String Reference to: 'Software\Iridium Systems\HelpBuilde
| r\1.0\LicUser'
|
00101C2D BA601E1000 mov edx, $00101E60
00101C32 B802000080 mov eax, $80000002

|
00101C37 E81487F9FF call 0009A350
00101C3C 8D45BC lea eax, [ebp-$44]
00101C3F 8B55F8 mov edx, [ebp-$08]

|
00101C42 E87522F1FF call 00013EBC
00101C47 8B45BC mov eax, [ebp-$44]
00101C4A 8D4DC0 lea ecx, [ebp-$40]
00101C4D 8B55F8 mov edx, [ebp-$08]

|
00101C50 E85FFBFFFF call 001017B4
00101C55 59 pop ecx
00101C56 8B55C0 mov edx, [ebp-$40]
00101C59 58 pop eax

|
00101C5A E86523F1FF call 00013FC4 //注册码第一部分
00101C5F 0F8537010000 jnz 00101D9C
00101C65 8D55C4 lea edx, [ebp-$3C]
00101C68 8B45EC mov eax, [ebp-$14]

|
00101C6B E804FCFFFF call 00101874
00101C70 8B45C4 mov eax, [ebp-$3C]
00101C73 50 push eax
00101C74 55 push ebp
00101C75 8D4DBC lea ecx, [ebp-$44]

* Possible String Reference to: 'Software\Iridium Systems\HelpBuilde
| r\1.0\LicUser'
|
00101C78 BA601E1000 mov edx, $00101E60
00101C7D B802000080 mov eax, $80000002

|
00101C82 E8C986F9FF call 0009A350
00101C87 8B45BC mov eax, [ebp-$44]
00101C8A 8D4DC0 lea ecx, [ebp-$40]
00101C8D 8B55F0 mov edx, [ebp-$10]

|
00101C90 E81FFBFFFF call 001017B4
00101C95 59 pop ecx
00101C96 8B55C0 mov edx, [ebp-$40]
00101C99 58 pop eax

|
00101C9A E82523F1FF call 00013FC4 //注册码第2部分
00101C9F 0F85F7000000 jnz 00101D9C
00101CA5 8D55C4 lea edx, [ebp-$3C]
00101CA8 8B45E8 mov eax, [ebp-$18]

|
00101CAB E8C4FBFFFF call 00101874
00101CB0 8B45C4 mov eax, [ebp-$3C]
00101CB3 50 push eax
00101CB4 55 push ebp
00101CB5 8D4DC0 lea ecx, [ebp-$40]
00101CB8 8B55EC mov edx, [ebp-$14]
00101CBB 8B45F8 mov eax, [ebp-$08]

|
00101CBE E8F1FAFFFF call 001017B4
00101CC3 59 pop ecx
00101CC4 8B55C0 mov edx, [ebp-$40]
00101CC7 58 pop eax

|
00101CC8 E8F722F1FF call 00013FC4 //注册码第3部分
00101CCD 0F85C9000000 jnz 00101D9C
00101CD3 8D55C4 lea edx, [ebp-$3C]
00101CD6 8B45E4 mov eax, [ebp-$1C]

|
00101CD9 E896FBFFFF call 00101874
00101CDE 8B45C4 mov eax, [ebp-$3C]
00101CE1 50 push eax
00101CE2 55 push ebp
00101CE3 8D45BC lea eax, [ebp-$44]
00101CE6 8D55C8 lea edx, [ebp-$38]
00101CE9 B90C000000 mov ecx, $0000000C

|
00101CEE E85521F1FF call 00013E48
00101CF3 8B55BC mov edx, [ebp-$44]
00101CF6 8D4DC0 lea ecx, [ebp-$40]
00101CF9 8B45E8 mov eax, [ebp-$18]

|
00101CFC E8B3FAFFFF call 001017B4
00101D01 59 pop ecx
00101D02 8B55C0 mov edx, [ebp-$40]
00101D05 58 pop eax

|
00101D06 E8B922F1FF call 00013FC4 //注册码第4部分
00101D0B 0F858B000000 jnz 00101D9C

作者大概是从哪里找到一个免费的Hash库，计算注册码的时候派上用场了 ;-)
用UltraEdit打开exe文件可以看到大堆THash_xxxx，所以要写注册机的话还得把hash算法分析出来。要暴力改的话除了上面几个地方要改，还有其它的判断，如About.pas、main.pas。只要*.pas中有字符串“\1.0\SerialNumber”就有注册码判断。


Holiday Lights V5.0

标 题:我可是好长时间没有向这里发表文章，今天就来一个了。请大家指点。 (18千字)
发信人:程式猎人
时 间:2001-3-28 20:47:43
详细信息:
Holiday Lights V5.0
程式猎人
简介：Holiday Lights places strings of Christmas tree bulbs around the edges of your screen, with festive music playing in the background.

The bulbs appear on your desktop wallpaper or on top of all other windows, so you'll feel the holiday spirit while you work on other computer tasks. You can choose from many different bulbs and songs.
When your computer is idle, Holiday Lights can also display a screen saver showing falling snow or other animations behind the bulbs.
追踪：name:dahuilang
RN:01234567
好长时间没有追踪软件了，昨天没事可做就开始追踪这个软件，发现这个软件真的不是一般的软件，想要追出来它的注册码还得需要一点工夫。这个可是对初学者有一定的帮助，可以启发初学者的思维，可以了解如何注册这个软件。现在就开始破解它了。
这个软件是使用当注册码正确后按钮才可按的注册方式，所以在这里先输入RN:0123456后，设bpx hmemcpy，输入7后拦下如下：
|:0040AE41(C)
|
:0040ADD5 8D45C0 lea eax, dword ptr [ebp-40]
:0040ADD8 50 push eax
:0040ADD9 E8927F0000 call 00412D70
:0040ADDE 84C0 test al, al
:0040ADE0 59 pop ecx
:0040ADE1 754C jne 0040AE2F
:0040ADE3 8D45C0 lea eax, dword ptr [ebp-40]
:0040ADE6 50 push eax
:0040ADE7 E8C462FFFF call 004010B0
:0040ADEC 84C0 test al, al
:0040ADEE 59 pop ecx
:0040ADEF 753E jne 0040AE2F
:0040ADF1 8D45C0 lea eax, dword ptr [ebp-40]
:0040ADF4 50 push eax
:0040ADF5 E8F6FE0000 call 0041ACF0
:0040ADFA 84C0 test al, al
:0040ADFC 59 pop ecx
:0040ADFD 7530 jne 0040AE2F
:0040ADFF 8D45C0 lea eax, dword ptr [ebp-40]
:0040AE02 50 push eax
:0040AE03 E8E8750000 call 004123F0
:0040AE08 84C0 test al, al
:0040AE0A 59 pop ecx
:0040AE0B 7522 jne 0040AE2F
:0040AE0D 8D45C0 lea eax, dword ptr [ebp-40]
:0040AE10 50 push eax
:0040AE11 E8EA210000 call 0040D000
:0040AE16 84C0 test al, al
:0040AE18 59 pop ecx
:0040AE19 7514 jne 0040AE2F
:0040AE1B 8D45C0 lea eax, dword ptr [ebp-40]
:0040AE1E 50 push eax

* Reference To: USER32.TranslateMessage, Ord:0285h
|
:0040AE1F FF1510375400 Call dword ptr [00543710]
:0040AE25 8D45C0 lea eax, dword ptr [ebp-40]
:0040AE28 50 push eax

* Reference To: USER32.DispatchMessageA, Ord:0096h
|
:0040AE29 FF1514375400 Call dword ptr [00543714]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040ADD3(U), :0040ADE1(C), :0040ADEF(C), :0040ADFD(C), :0040AE0B(C)
|:0040AE19(C)
|
:0040AE2F 8D45C0 lea eax, dword ptr [ebp-40]
:0040AE32 6A00 push 00000000
:0040AE34 6A00 push 00000000
:0040AE36 6A00 push 00000000
:0040AE38 50 push eax

* Reference To: USER32.GetMessageA, Ord:012Ch
|
:0040AE39 FF1518375400 Call dword ptr [00543718]
:0040AE3F 85C0 test eax, eax
:0040AE41 7F92 jg 0040ADD5
:0040AE43 EB28 jmp 0040AE6D
大家看到上面有许多的比较地方，可是如果你要到达这里你将在这里一直在循环，无法从这里出来，所以在这里使用这个拦截将无法达到我们想要的结果，那么我们将如何对待它呢？
办法当然有了，可能不同的人会使用不同的办法，破解也需要机会的，我先考虑这个软件有可能会将注册的结果保存在注册表中，现在使用Regmon软件来监视软件对注册表有什么动作。经查找，终于发现这个监视软件的确是不负众望，查到了我想要得到的东西。如下：
HKEY_CURRENT_USER\Software\Tiger Technologies\Holiday Lights\serial number NTFF
HKEY_CURRENT_USER\Software\Tiger Technologies\Holiday Lights\user NTFF
现在打动打开注册表，查找是否有这两个键值，发现了没有？当然没有，因为Regmon软件已经提到此软件没有读到这两个值，所以我们就知道这点了。如果这个软件注册成功，那么它将注册信息写到这里，每次启动的时候会这里读取注册信息，如果成功就认为是注册用户，否则为试用用户。下面就是在注册表中创建这两个值了。如下
serial number:01234567
user:dahuilang
因为程序将读取注册表，所以我们使用TRW的load功能加载程序，后设bpx regqueryvalueexa（这个就是从Regmon中看到的程序读取注册表的函数）
你在第三次被拦下如下：
:0040EE00 55 push ebp
:0040EE01 89E5 mov ebp, esp
:0040EE03 53 push ebx
:0040EE04 56 push esi
:0040EE05 83EC08 sub esp, 00000008
:0040EE08 8B7508 mov esi, dword ptr [ebp+08]
:0040EE0B 8B5D0C mov ebx, dword ptr [ebp+0C]
:0040EE0E C60600 mov byte ptr [esi], 00
:0040EE11 C60300 mov byte ptr [ebx], 00
:0040EE14 8D4DF0 lea ecx, dword ptr [ebp-10]
:0040EE17 6801000080 push 80000001
:0040EE1C E80FFBFFFF call 0040E930
:0040EE21 8D4DF0 lea ecx, dword ptr [ebp-10]
:0040EE24 56 push esi
:0040EE25 6A40 push 00000040
:0040EE24 56 push esi
:0040EE25 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"User"
|
:0040EE27 685EB55300 push 0053B55E
:0040EE2C E85FF9FFFF call 0040E790
:0040EE31 8D4DF0 lea ecx, dword ptr [ebp-10] <-出来
:0040EE34 53 push ebx
:0040EE35 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Serial Number"
|
:0040EE37 6863B55300 push 0053B563
:0040EE3C E84FF9FFFF call 0040E790
:0040EE41 8D4DF0 lea ecx, dword ptr [ebp-10] <-出来
:0040EE44 E827F9FFFF call 0040E770
:0040EE49 803E00 cmp byte ptr [esi], 00
:0040EE4C 753A jne 0040EE88
:0040EE4E 803B00 cmp byte ptr [ebx], 00
:0040EE51 7535 jne 0040EE88
:0040EE53 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0040EE56 6802000080 push 80000002
:0040EE5B E8D0FAFFFF call 0040E930
:0040EE60 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0040EE63 56 push esi
:0040EE64 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"User"
|
:0040EE66 685EB55300 push 0053B55E
:0040EE6B E820F9FFFF call 0040E790
:0040EE70 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0040EE73 53 push ebx
:0040EE74 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Serial Number"
|
:0040EE76 6863B55300 push 0053B563
:0040EE7B E810F9FFFF call 0040E790
:0040EE80 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0040EE83 E8E8F8FFFF call 0040E770

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040EE4C(C), :0040EE51(C)
|
:0040EE88 8D65F8 lea esp, dword ptr [ebp-08]
:0040EE8B 5E pop esi
:0040EE8C 5B pop ebx
:0040EE8D 5D pop ebp
:0040EE8E C3 ret
上面是从W32dasm反汇编得到的结果，如果你使用TRW来动态追踪，一开始是看不到这些信息的，所以在上面将被拦下二次，分别读取user和serial number的值，现在程序可以追踪到了。我在内存中一看到有这两个值出现就知道离成功不远了。现在向下追踪。
:00412210 55 push ebp
:00412211 89E5 mov ebp, esp
:00412213 53 push ebx
:00412214 83EC58 sub esp, 00000058
:00412217 803D7967420000 cmp byte ptr [00426779], 00
:0041221E 750E jne 0041222E
:00412220 C6057867420000 mov byte ptr [00426778], 00
:00412227 C6057967420001 mov byte ptr [00426779], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041221E(C)
|
:0041222E 803D64D1530000 cmp byte ptr [0053D164], 00
:00412235 7555 jne 0041228C
:00412237 803D7867420000 cmp byte ptr [00426778], 00
:0041223E 754C jne 0041228C
:00412240 C6057867420001 mov byte ptr [00426778], 01
:00412247 8D55EC lea edx, dword ptr [ebp-14]
:0041224A 8D45AC lea eax, dword ptr [ebp-54]
:0041224D 52 push edx
:0041224E 50 push eax
:0041224F E8ACCBFFFF call 0040EE00 <-出来
:00412254 8B45A8 mov eax, dword ptr [ebp-58]
:00412257 59 pop ecx
:00412258 3345A8 xor eax, dword ptr [ebp-58]
:0041225B 59 pop ecx
:0041225C 8D4DEC lea ecx, dword ptr [ebp-14]
:0041225F 8945A8 mov dword ptr [ebp-58], eax
:00412262 8D45AC lea eax, dword ptr [ebp-54]
:00412265 51 push ecx
:00412266 50 push eax
:00412267 31DB xor ebx, ebx
:00412269 E8D2080000 call 00412B40 关键的比较函数，进入其中
:0041226E 85C0 test eax, eax
:00412270 59 pop ecx
:00412271 59 pop ecx
:00412272 7507 jne 0041227B
:00412274 C745A801000000 mov [ebp-58], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412272(C)
|
:0041227B 807DA800 cmp byte ptr [ebp-58], 00
:0041227F 7505 jne 00412286
:00412281 BB01000000 mov ebx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041227F(C)
|
:00412286 881D64D15300 mov byte ptr [0053D164], bl

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00412235(C), :0041223E(C)
|
:0041228C A064D15300 mov al, byte ptr [0053D164]
:00412291 8D65FC lea esp, dword ptr [ebp-04]
:00412294 5B pop ebx
:00412295 5D pop ebp
:00412296 C3 ret
call 0040EE00是调用读取注册表的函数，所以从上面的地方出来，到达下面的比较的地方，在这里你将得到关键的比较地方，进入其中

:00412B40 55 push ebp
:00412B41 31C0 xor eax, eax
:00412B43 89E5 mov ebp, esp
:00412B45 53 push ebx
:00412B46 56 push esi
:00412B47 57 push edi
:00412B48 83EC10 sub esp, 00000010
:00412B4B 8B7D0C mov edi, dword ptr [ebp+0C]
:00412B4E B9FFFFFFFF mov ecx, FFFFFFFF
:00412B53 8B7508 mov esi, dword ptr [ebp+08]
:00412B56 C745F000000000 mov [ebp-10], 00000000
:00412B5D F2 repnz
:00412B5E AE scasb
:00412B5F B8FEFFFFFF mov eax, FFFFFFFE
:00412B64 29C8 sub eax, ecx
:00412B66 3D0C000000 cmp eax, 0000000C
:00412B6B 0F850E010000 jne 00412C7F
:00412B71 31DB xor ebx, ebx
:00412B73 31D2 xor edx, edx
:00412B75 EB7B jmp 00412BF2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412C09(C)
|
:00412B77 0FBFCA movsx ecx, dx
:00412B7A 0FBE040E movsx eax, byte ptr [esi+ecx]
:00412B7E 2D41000000 sub eax, 00000041
:00412B83 3D35000000 cmp eax, 00000035
:00412B88 7767 ja 00412BF1
:00412B8A FF248568D25300 jmp dword ptr [4*eax+0053D268]
:00412B91 81C320A10700 add ebx, 0007A120
:00412B97 EB58 jmp 00412BF1
:00412B99 8D842000000000 lea eax, dword ptr [eax]
:00412BA0 81C3A0860100 add ebx, 000186A0
:00412BA6 EB49 jmp 00412BF1
:00412BA8 81C350C30000 add ebx, 0000C350
:00412BAE EB41 jmp 00412BF1
:00412BB0 81C310270000 add ebx, 00002710
:00412BB6 EB39 jmp 00412BF1
:00412BB8 81C388130000 add ebx, 00001388
:00412BBE EB31 jmp 00412BF1
:00412BC0 81C3E8030000 add ebx, 000003E8
:00412BC6 EB29 jmp 00412BF1
:00412BC8 81C3F4010000 add ebx, 000001F4
:00412BCE EB21 jmp 00412BF1
:00412BD0 83C364 add ebx, 00000064
:00412BD3 EB1C jmp 00412BF1
:00412BD5 83C332 add ebx, 00000032
:00412BD8 EB17 jmp 00412BF1
:00412BDA 8D8000000000 lea eax, dword ptr [eax+00000000]
:00412BE0 83C30A add ebx, 0000000A
:00412BE3 EB0C jmp 00412BF1
:00412BE5 83C305 add ebx, 00000005
:00412BE8 EB07 jmp 00412BF1
:00412BEA 8D8000000000 lea eax, dword ptr [eax+00000000]
:00412BF0 43 inc ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00412B88(C), :00412B97(U), :00412BA6(U), :00412BAE(U), :00412BB6(U)
|:00412BBE(U), :00412BC6(U), :00412BCE(U), :00412BD3(U), :00412BD8(U)
|:00412BE3(U), :00412BE8(U)
|
:00412BF1 42 inc edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412B75(U)
|
:00412BF2 B9FFFFFFFF mov ecx, FFFFFFFF
:00412BF7 89F7 mov edi, esi
:00412BF9 31C0 xor eax, eax
:00412BFB F2 repnz
:00412BFC AE scasb
:00412BFD 0FBFC2 movsx eax, dx
:00412C00 BFFEFFFFFF mov edi, FFFFFFFE
:00412C05 29CF sub edi, ecx
:00412C07 39F8 cmp eax, edi
:00412C09 0F8268FFFFFF jb 00412B77
:00412C0F 8B4D0C mov ecx, dword ptr [ebp+0C]
:00412C12 8A4109 mov al, byte ptr [ecx+09]
:00412C15 8945EC mov dword ptr [ebp-14], eax
:00412C18 89C8 mov eax, ecx
:00412C1A C6400900 mov [eax+09], 00
:00412C1E FF750C push [ebp+0C]
:00412C21 E84AC30000 call 0041EF70
:00412C26 89C7 mov edi, eax
:00412C28 59 pop ecx
:00412C29 8B450C mov eax, dword ptr [ebp+0C]
:00412C2C 8B4DEC mov ecx, dword ptr [ebp-14]
:00412C2F 884809 mov byte ptr [eax+09], cl
:00412C32 29DF sub edi, ebx
:00412C34 8B450C mov eax, dword ptr [ebp+0C]
:00412C37 0509000000 add eax, 00000009
:00412C3C 50 push eax
:00412C3D E82EC30000 call 0041EF70
:00412C42 81FFFFFFFF0E cmp edi, 0EFFFFFF
:00412C48 59 pop ecx
:00412C49 89C3 mov ebx, eax
:00412C4B 7432 je 00412C7F
:00412C4D FF750C push [ebp+0C]
:00412C50 56 push esi
:00412C51 E82AFAFFFF call 00412680
:00412C56 84C0 test al, al
:00412C58 59 pop ecx
:00412C59 59 pop ecx
:00412C5A 7423 je 00412C7F
:00412C5C B85F763708 mov eax, 0837765F
:00412C61 F7E7 mul edi
:00412C63 055F763708 add eax, 0837765F
:00412C68 89F8 mov eax, edi
:00412C6A 83D200 adc edx, 00000000
:00412C6D C1EA05 shr edx, 05
:00412C70 69D2E5030000 imul edx, 000003E5
:00412C76 29D0 sub eax, edx
:00412C78 39C3 cmp ebx, eax
:00412C7A 7503 jne 00412C7F
:00412C7C 897DF0 mov dword ptr [ebp-10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00412B6B(C), :00412C4B(C), :00412C5A(C), :00412C7A(C)
|
:00412C7F 8165F000004000 and dword ptr [ebp-10], 00400000
:00412C86 8B45F0 mov eax, dword ptr [ebp-10]
:00412C89 8D65F4 lea esp, dword ptr [ebp-0C]
:00412C8C 5F pop edi
:00412C8D 5E pop esi
:00412C8E 5B pop ebx
:00412C8F 5D pop ebp
:00412C90 C3 ret
这里就是比较的大本营了，如果你要得到这个软件的注册机，就应当仔细研究一下这个程序是如何生成注册码的，其实你就是想得到这个软件的注册码也要明白这个软件是如何生成注册码的过程。现在我简单的介绍一下是如何生成注册码的。
1 首先检查你输入的注册码是否为12位
2 将你的注册名每个字符－41后比较35(H)，如果大于就到达[4*eax+0053D268]其中eax就是计算后的值。如果小于就到达00412BF1这里，不参与计算。
3 计算后得到过度值ebx
4 将注册码的前9位值取出为edi（十六进位）
5 使用edi=edi-ebx得到第6步运算的edi值
6 下面是生成第二个比较值的过程，相信大家一定能够看懂
:00412C5C B85F763708 mov eax, 0837765F
:00412C61 F7E7 mul edi
:00412C63 055F763708 add eax, 0837765F
:00412C68 89F8 mov eax, edi
:00412C6A 83D200 adc edx, 00000000
:00412C6D C1EA05 shr edx, 05
:00412C70 69D2E5030000 imul edx, 000003E5
:00412C76 29D0 sub eax, edx
在这里将得到eax，同注册码的后三位比较，如果相等就在下面的地方不跳跃，但是不也不表明注册成功。如下
:00412C78 39C3 cmp ebx, eax
:00412C7A 7503 jne 00412C7F
:00412C7C 897DF0 mov dword ptr [ebp-10], edi
:00412C7F 8165F000004000 and dword ptr [ebp-10], 00400000
:00412C86 8B45F0 mov eax, dword ptr [ebp-10]
因为这里edi是最后的返回值，所以如果让其值为0，就一定要使edi AND 00400000不为0。那么查看AND表可以知道只要使edi中第三位值为4，5，6，7，C,D,E,F就可以了。因为我使用name:dahuilang得到的ebx=164F，那么只要使最后的edi的第三位为4就可以了。这个就可以得到前9位值为00400000＋164F＝0040164F(H)=004200015，通过上面的计算得到eax＝39A，所以最后三位就为922。现在我的注册码如下：
name:dahuilang
RN:004200015922
输入后注册成功。
破解成功。

欢迎访问我的主页：http://programhunter.myetang.com


HOSTMONITOR 1.31

 标 题:入门习作2：HOSTMONITOR 1.31 运行自校验及注册破解过程 (11千字)
发信人:crack123
时 间:2001-6-27 20:42:20
详细信息:
入门习作2：HOSTMONITOR 1.31 运行自校验及注册破解过程

程序名称：HOSTMONITOR 1.31
保护方式：注册码、运行时代码自校验

破解过程如下：
一、启动程序后，进入licence 的注册窗口
任意输入用户名及注册码，点击确定后出现“Sorry, but Name or Registration
number is wrong !”画面，
用pwdasm32反汇编主程序hostmonitor.exe后，查找上面的字符串，发现下列代码
段与注册有关：

:004CA33C 8B45E8 mov eax, dword ptr [ebp-18]
:004CA33F E86C81FFFF call 004C24B0 -->判断用户名是否在HACKER
:004CA344 84C0 test al, al 名单中
:004CA346 7441 je 004CA389 -->不是则跳转4CA389处验证
用户名及注册码有效性＊＊＊

（＊修改为 EB41 jmp 004ca389 *)

* Possible StringData Ref from Code Obj ->"Sorry, but your registration name "
->"("
|
:004CA348 68ECA54C00 push 004CA5EC
:004CA34D 8D55E0 lea edx, dword ptr [ebp-20]
:004CA350 8B06 mov eax, dword ptr [esi]
:004CA352 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA358 E84FF4F6FF call 004397AC
:004CA35D FF75E0 push [ebp-20]

* Possible StringData Ref from Code Obj ->") found in "black list".

"
|
:004CA360 6818A64C00 push 004CA618

* Possible StringData Ref from Code Obj ->"Should you have any questions, "
->"please don`t hesitate to let us "
->"know.
"
|
:004CA365 6840A64C00 push 004CA640

* Possible StringData Ref from Code Obj ->"E-Mail: line1@ks-soft.net; line2@ks-soft.net"
|
:004CA36A 6890A64C00 push 004CA690
:004CA36F 8D45E4 lea eax, dword ptr [ebp-1C]
:004CA372 BA05000000 mov edx, 00000005
:004CA377 E8EC9EF3FF call 00404268
:004CA37C 8B45E4 mov eax, dword ptr [ebp-1C]
:004CA37F E8FC69F9FF call 00460D80
:004CA384 E9F7010000 jmp 004CA580

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CA346(C)
|
:004CA389 8D55DC lea edx, dword ptr [ebp-24]
:004CA38C 8B06 mov eax, dword ptr [esi]
:004CA38E 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA394 E813F4F6FF call 004397AC -->计算字符串长度
:004CA399 837DDC00 cmp dword ptr [ebp-24], 00000000
:004CA39D 0F84C9010000 je 004CA56C -->用户名长度是否为0
（跳转则注册失败）
:004CA3A3 8D55D8 lea edx, dword ptr [ebp-28]
:004CA3A6 8B06 mov eax, dword ptr [esi]
:004CA3A8 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004CA3AE E8F9F3F6FF call 004397AC
:004CA3B3 837DD800 cmp dword ptr [ebp-28], 00000000
:004CA3B7 0F84AF010000 je 004CA56C -->注册码长度是否为0
（跳转则注册失败）
:004CA3BD 8D55D4 lea edx, dword ptr [ebp-2C]
:004CA3C0 8B06 mov eax, dword ptr [esi]
:004CA3C2 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA3C8 E8DFF3F6FF call 004397AC
:004CA3CD 8B45D4 mov eax, dword ptr [ebp-2C]
:004CA3D0 E8C7D6FFFF call 004C7A9C -->用户名转换为字串1
:004CA3D5 8BF8 mov edi, eax
:004CA3D7 8D55D0 lea edx, dword ptr [ebp-30]
:004CA3DA 8B06 mov eax, dword ptr [esi]
:004CA3DC 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004CA3E2 E8C5F3F6FF call 004397AC
:004CA3E7 8B45D0 mov eax, dword ptr [ebp-30]
:004CA3EA E8C9D7FFFF call 004C7BB8 -->注册码转换为字串2
:004CA3EF 663BF8 cmp di, ax
:004CA3F2 0F8574010000 jne 004CA56C -->注册码为字母或长度
为1,则跳转至注册失败
:004CA3F8 A1344E5400 mov eax, dword ptr [00544E34]
:004CA3FD BAFF010000 mov edx, 000001FF
:004CA402 E87DD6FFFF call 004C7A84 -->计算字串1累加和
:004CA407 8BF8 mov edi, eax
:004CA409 A1C44C5400 mov eax, dword ptr [00544CC4]
:004CA40E BAFF010000 mov edx, 000001FF
:004CA413 E86CD6FFFF call 004C7A84 -->计算字串2累加和
:004CA418 3BF8 cmp edi, eax
:004CA41A 0F854C010000 jne 004CA56C -->是否相等？ ＊＊＊
不相等，则跳转至注册失败；
相等，继续则注册OK！

(＊修改为 909090909090 nop(6个）＊）

:004CA420 8D55CC lea edx, dword ptr [ebp-34]
:004CA423 8B06 mov eax, dword ptr [esi]
:004CA425 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA42B E87CF3F6FF call 004397AC
:004CA430 8B55CC mov edx, dword ptr [ebp-34]
:004CA433 A16C505400 mov eax, dword ptr [0054506C]
:004CA438 E83F9BF3FF call 00403F7C
:004CA43D 8D55C8 lea edx, dword ptr [ebp-38]
:004CA440 8B06 mov eax, dword ptr [esi]
:004CA442 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004CA448 E85FF3F6FF call 004397AC
:004CA44D 8B55C8 mov edx, dword ptr [ebp-38]
:004CA450 A1244D5400 mov eax, dword ptr [00544D24]
:004CA455 E8229BF3FF call 00403F7C
:004CA45A 8BC3 mov eax, ebx
:004CA45C E89BF9FFFF call 004C9DFC

* Possible StringData Ref from Code Obj ->"Thank You for registering"
|
:004CA461 B8C8A64C00 mov eax, 004CA6C8
:004CA466 E81569F9FF call 00460D80
:004CA46B B201 mov dl, 01
:004CA46D A11CB84100 mov eax, dword ptr [0041B81C]
:004CA472 E81115F5FF call 0041B988
:004CA477 8BD8 mov ebx, eax
:004CA479 B101 mov cl, 01
.
.
.
.
(略） .
.
.
:004CA56A EB14 jmp 004CA580
* Possible StringData Ref from Code Obj ->"Sorry, but Name or Registration "
->"number is wrong !"
|
:004CA56C B8DCA74C00 mov eax, 004CA7DC
:004CA571 E80A68F9FF call 00460D80
:004CA576 A1E44B5400 mov eax, dword ptr [00544BE4]
:004CA57B 8B55FC mov edx, dword ptr [ebp-04]
:004CA57E 8910 mov dword ptr [eax], edx

从以上程序段可看出，只要用ULTRAEDIT等工具将＊＊＊处作相应修改即可任意注册。
（＊注册码不能为字母、注册码长度不能为1）

二、注册成功后，重新运行程序，出现启动画面，显示“self test"后，出现提示
“Program was corrupted !”画面，只有退出程序。

再在pwasm32反汇编文件中查找以上字符，相关程序如下：

:0053E19A 8B55E8 mov edx, dword ptr [ebp-18]
:0053E19D A1944C5400 mov eax, dword ptr [00544C94]
:0053E1A2 8B00 mov eax, dword ptr [eax]
:0053E1A4 8B80D0020000 mov eax, dword ptr [eax+000002D0]
:0053E1AA 8B8008020000 mov eax, dword ptr [eax+00000208]
:0053E1B0 8B08 mov ecx, dword ptr [eax]
:0053E1B2 FF5134 call [ecx+34] -->提示“self test"
:0053E1B5 E89A45F8FF call 004C2754 -->程序代码校验
:0053E1BA 8B15244C5400 mov edx, dword ptr [00544C24]
:0053E1C0 3B82B4000000 cmp eax, dword ptr [edx+000000B4]
:0053E1C6 740F je 0053E1D7 -->比较校验结果：＊＊＊
不符，则提示出错信息；
相符，则跳转程序正常初始化。

(＊修改为 EB0f jmp 0053e1d7 *)

* Possible StringData Ref from Code Obj ->"Program was corrupted !"
|
:0053E1C8 B81CEA5300 mov eax, 0053EA1C
:0053E1CD E8AE2BF2FF call 00460D80
:0053E1D2 E996070000 jmp 0053E96D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0053E1C6(C)
|
:0053E1D7 68E4E95300 push 0053E9E4
:0053E1DC E82FD4ECFF call 0040B610
:0053E1E1 83C4F8 add esp, FFFFFFF8
:0053E1E4 DD1C24 fstp qword ptr [esp]
:0053E1E7 9B wait
:0053E1E8 8D45DC lea eax, dword ptr [ebp-24]
:0053E1EB E834E0ECFF call 0040C224
:0053E1F0 FF75DC push [ebp-24]

* Possible StringData Ref from Code Obj ->"] App Init .."
| -->程序初始化
:0053E1F3 683CEA5300 push 0053EA3C
:0053E1F8 8D45E0 lea eax, dword ptr [ebp-20]
:0053E1FB BA03000000 mov edx, 00000003
:0053E200 E86360ECFF call 00404268

将上段程序＊＊＊处作相应修改，程序即可正常运行

三、发现程序启动时，在下列程序段进行注册比较：（查找4C7A84时发现）

:0053C7C6 8B45F4 mov eax, dword ptr [ebp-0C]
:0053C7C9 E8CEB2F8FF call 004C7A9C
:0053C7CE 8B45F0 mov eax, dword ptr [ebp-10]
:0053C7D1 E8E2B3F8FF call 004C7BB8
:0053C7D6 A1344E5400 mov eax, dword ptr [00544E34]
:0053C7DB BAFF010000 mov edx, 000001FF
:0053C7E0 E89FB2F8FF call 004C7A84 -->计算用户名字串1累加和
:0053C7E5 8BF0 mov esi, eax
:0053C7E7 A1C44C5400 mov eax, dword ptr [00544CC4]
:0053C7EC BAFF010000 mov edx, 000001FF
:0053C7F1 E88EB2F8FF call 004C7A84 -->计算注册码字串2累加和
:0053C7F6 3BF0 cmp esi, eax
:0053C7F8 751C jne 0053C816 -->比较是否相等？ ＊＊＊
不相等在license窗口显示
“Unregistration"
相等则在license窗口显示
注册信息。

(*修改为 9090 nop（2个） *)

:0053C7FA A16C505400 mov eax, dword ptr [0054506C]
:0053C7FF 8B55F4 mov edx, dword ptr [ebp-0C]
:0053C802 E87577ECFF call 00403F7C
:0053C807 A1244D5400 mov eax, dword ptr [00544D24]
:0053C80C 8B55F0 mov edx, dword ptr [ebp-10]
:0053C80F E86877ECFF call 00403F7C
:0053C814 EB2D jmp 0053C843

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0053C7F8(C)
|
:0053C816 A1344E5400 mov eax, dword ptr [00544E34]
:0053C81B 33C9 xor ecx, ecx
:0053C81D BA00020000 mov edx, 00000200
:0053C822 E89565ECFF call 00402DBC

从以上程序段可看出，只要将＊＊＊处作相应修改即可。

错误之处请指正，谢谢！！ <Crack123>

标 题:入门习作2：HOSTMONITOR 1.31 运行自校验及注册破解过程 (11千字)
发信人:crack123
时 间:2001-6-27 20:42:20
详细信息:

入门习作2：HOSTMONITOR 1.31 运行自校验及注册破解过程

程序名称：HOSTMONITOR 1.31
保护方式：注册码、运行时代码自校验

破解过程如下：
一、启动程序后，进入licence 的注册窗口
任意输入用户名及注册码，点击确定后出现“Sorry, but Name or Registration
number is wrong !”画面，
用pwdasm32反汇编主程序hostmonitor.exe后，查找上面的字符串，发现下列代码
段与注册有关：

:004CA33C 8B45E8 mov eax, dword ptr [ebp-18]
:004CA33F E86C81FFFF call 004C24B0 -->判断用户名是否在HACKER
:004CA344 84C0 test al, al 名单中
:004CA346 7441 je 004CA389 -->不是则跳转4CA389处验证
用户名及注册码有效性＊＊＊

（＊修改为 EB41 jmp 004ca389 *)

* Possible StringData Ref from Code Obj ->"Sorry, but your registration name "
->"("
|
:004CA348 68ECA54C00 push 004CA5EC
:004CA34D 8D55E0 lea edx, dword ptr [ebp-20]
:004CA350 8B06 mov eax, dword ptr [esi]
:004CA352 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA358 E84FF4F6FF call 004397AC
:004CA35D FF75E0 push [ebp-20]

* Possible StringData Ref from Code Obj ->") found in "black list".

"
|
:004CA360 6818A64C00 push 004CA618

* Possible StringData Ref from Code Obj ->"Should you have any questions, "
->"please don`t hesitate to let us "
->"know.
"
|
:004CA365 6840A64C00 push 004CA640

* Possible StringData Ref from Code Obj ->"E-Mail: line1@ks-soft.net; line2@ks-soft.net"
|
:004CA36A 6890A64C00 push 004CA690
:004CA36F 8D45E4 lea eax, dword ptr [ebp-1C]
:004CA372 BA05000000 mov edx, 00000005
:004CA377 E8EC9EF3FF call 00404268
:004CA37C 8B45E4 mov eax, dword ptr [ebp-1C]
:004CA37F E8FC69F9FF call 00460D80
:004CA384 E9F7010000 jmp 004CA580

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CA346(C)
|
:004CA389 8D55DC lea edx, dword ptr [ebp-24]
:004CA38C 8B06 mov eax, dword ptr [esi]
:004CA38E 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA394 E813F4F6FF call 004397AC -->计算字符串长度
:004CA399 837DDC00 cmp dword ptr [ebp-24], 00000000
:004CA39D 0F84C9010000 je 004CA56C -->用户名长度是否为0
（跳转则注册失败）
:004CA3A3 8D55D8 lea edx, dword ptr [ebp-28]
:004CA3A6 8B06 mov eax, dword ptr [esi]
:004CA3A8 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004CA3AE E8F9F3F6FF call 004397AC
:004CA3B3 837DD800 cmp dword ptr [ebp-28], 00000000
:004CA3B7 0F84AF010000 je 004CA56C -->注册码长度是否为0
（跳转则注册失败）
:004CA3BD 8D55D4 lea edx, dword ptr [ebp-2C]
:004CA3C0 8B06 mov eax, dword ptr [esi]
:004CA3C2 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA3C8 E8DFF3F6FF call 004397AC
:004CA3CD 8B45D4 mov eax, dword ptr [ebp-2C]
:004CA3D0 E8C7D6FFFF call 004C7A9C -->用户名转换为字串1
:004CA3D5 8BF8 mov edi, eax
:004CA3D7 8D55D0 lea edx, dword ptr [ebp-30]
:004CA3DA 8B06 mov eax, dword ptr [esi]
:004CA3DC 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004CA3E2 E8C5F3F6FF call 004397AC
:004CA3E7 8B45D0 mov eax, dword ptr [ebp-30]
:004CA3EA E8C9D7FFFF call 004C7BB8 -->注册码转换为字串2
:004CA3EF 663BF8 cmp di, ax
:004CA3F2 0F8574010000 jne 004CA56C -->注册码为字母或长度
为1,则跳转至注册失败
:004CA3F8 A1344E5400 mov eax, dword ptr [00544E34]
:004CA3FD BAFF010000 mov edx, 000001FF
:004CA402 E87DD6FFFF call 004C7A84 -->计算字串1累加和
:004CA407 8BF8 mov edi, eax
:004CA409 A1C44C5400 mov eax, dword ptr [00544CC4]
:004CA40E BAFF010000 mov edx, 000001FF
:004CA413 E86CD6FFFF call 004C7A84 -->计算字串2累加和
:004CA418 3BF8 cmp edi, eax
:004CA41A 0F854C010000 jne 004CA56C -->是否相等？ ＊＊＊
不相等，则跳转至注册失败；
相等，继续则注册OK！

(＊修改为 909090909090 nop(6个）＊）

:004CA420 8D55CC lea edx, dword ptr [ebp-34]
:004CA423 8B06 mov eax, dword ptr [esi]
:004CA425 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:004CA42B E87CF3F6FF call 004397AC
:004CA430 8B55CC mov edx, dword ptr [ebp-34]
:004CA433 A16C505400 mov eax, dword ptr [0054506C]
:004CA438 E83F9BF3FF call 00403F7C
:004CA43D 8D55C8 lea edx, dword ptr [ebp-38]
:004CA440 8B06 mov eax, dword ptr [esi]
:004CA442 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004CA448 E85FF3F6FF call 004397AC
:004CA44D 8B55C8 mov edx, dword ptr [ebp-38]
:004CA450 A1244D5400 mov eax, dword ptr [00544D24]
:004CA455 E8229BF3FF call 00403F7C
:004CA45A 8BC3 mov eax, ebx
:004CA45C E89BF9FFFF call 004C9DFC

* Possible StringData Ref from Code Obj ->"Thank You for registering"
|
:004CA461 B8C8A64C00 mov eax, 004CA6C8
:004CA466 E81569F9FF call 00460D80
:004CA46B B201 mov dl, 01
:004CA46D A11CB84100 mov eax, dword ptr [0041B81C]
:004CA472 E81115F5FF call 0041B988
:004CA477 8BD8 mov ebx, eax
:004CA479 B101 mov cl, 01
.
.
.
.
(略） .
.
.
:004CA56A EB14 jmp 004CA580
* Possible StringData Ref from Code Obj ->"Sorry, but Name or Registration "
->"number is wrong !"
|
:004CA56C B8DCA74C00 mov eax, 004CA7DC
:004CA571 E80A68F9FF call 00460D80
:004CA576 A1E44B5400 mov eax, dword ptr [00544BE4]
:004CA57B 8B55FC mov edx, dword ptr [ebp-04]
:004CA57E 8910 mov dword ptr [eax], edx

从以上程序段可看出，只要用ULTRAEDIT等工具将＊＊＊处作相应修改即可任意注册。
（＊注册码不能为字母、注册码长度不能为1）

二、注册成功后，重新运行程序，出现启动画面，显示“self test"后，出现提示
“Program was corrupted !”画面，只有退出程序。

再在pwasm32反汇编文件中查找以上字符，相关程序如下：

:0053E19A 8B55E8 mov edx, dword ptr [ebp-18]
:0053E19D A1944C5400 mov eax, dword ptr [00544C94]
:0053E1A2 8B00 mov eax, dword ptr [eax]
:0053E1A4 8B80D0020000 mov eax, dword ptr [eax+000002D0]
:0053E1AA 8B8008020000 mov eax, dword ptr [eax+00000208]
:0053E1B0 8B08 mov ecx, dword ptr [eax]
:0053E1B2 FF5134 call [ecx+34] -->提示“self test"
:0053E1B5 E89A45F8FF call 004C2754 -->程序代码校验
:0053E1BA 8B15244C5400 mov edx, dword ptr [00544C24]
:0053E1C0 3B82B4000000 cmp eax, dword ptr [edx+000000B4]
:0053E1C6 740F je 0053E1D7 -->比较校验结果：＊＊＊
不符，则提示出错信息；
相符，则跳转程序正常初始化。

(＊修改为 EB0f jmp 0053e1d7 *)

* Possible StringData Ref from Code Obj ->"Program was corrupted !"
|
:0053E1C8 B81CEA5300 mov eax, 0053EA1C
:0053E1CD E8AE2BF2FF call 00460D80
:0053E1D2 E996070000 jmp 0053E96D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0053E1C6(C)
|
:0053E1D7 68E4E95300 push 0053E9E4
:0053E1DC E82FD4ECFF call 0040B610
:0053E1E1 83C4F8 add esp, FFFFFFF8
:0053E1E4 DD1C24 fstp qword ptr [esp]
:0053E1E7 9B wait
:0053E1E8 8D45DC lea eax, dword ptr [ebp-24]
:0053E1EB E834E0ECFF call 0040C224
:0053E1F0 FF75DC push [ebp-24]

* Possible StringData Ref from Code Obj ->"] App Init .."
| -->程序初始化
:0053E1F3 683CEA5300 push 0053EA3C
:0053E1F8 8D45E0 lea eax, dword ptr [ebp-20]
:0053E1FB BA03000000 mov edx, 00000003
:0053E200 E86360ECFF call 00404268

将上段程序＊＊＊处作相应修改，程序即可正常运行

三、发现程序启动时，在下列程序段进行注册比较：（查找4C7A84时发现）

:0053C7C6 8B45F4 mov eax, dword ptr [ebp-0C]
:0053C7C9 E8CEB2F8FF call 004C7A9C
:0053C7CE 8B45F0 mov eax, dword ptr [ebp-10]
:0053C7D1 E8E2B3F8FF call 004C7BB8
:0053C7D6 A1344E5400 mov eax, dword ptr [00544E34]
:0053C7DB BAFF010000 mov edx, 000001FF
:0053C7E0 E89FB2F8FF call 004C7A84 -->计算用户名字串1累加和
:0053C7E5 8BF0 mov esi, eax
:0053C7E7 A1C44C5400 mov eax, dword ptr [00544CC4]
:0053C7EC BAFF010000 mov edx, 000001FF
:0053C7F1 E88EB2F8FF call 004C7A84 -->计算注册码字串2累加和
:0053C7F6 3BF0 cmp esi, eax
:0053C7F8 751C jne 0053C816 -->比较是否相等？ ＊＊＊
不相等在license窗口显示
“Unregistration"
相等则在license窗口显示
注册信息。

(*修改为 9090 nop（2个） *)

:0053C7FA A16C505400 mov eax, dword ptr [0054506C]
:0053C7FF 8B55F4 mov edx, dword ptr [ebp-0C]
:0053C802 E87577ECFF call 00403F7C
:0053C807 A1244D5400 mov eax, dword ptr [00544D24]
:0053C80C 8B55F0 mov edx, dword ptr [ebp-10]
:0053C80F E86877ECFF call 00403F7C
:0053C814 EB2D jmp 0053C843

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0053C7F8(C)
|
:0053C816 A1344E5400 mov eax, dword ptr [00544E34]
:0053C81B 33C9 xor ecx, ecx
:0053C81D BA00020000 mov edx, 00000200
:0053C822 E89565ECFF call 00402DBC

从以上程序段可看出，只要将＊＊＊处作相应修改即可。

错误之处请指正，谢谢！！ <Crack123>


HostSeek1.1

 标 题:HostSeek 中文版 简单破解 (2千字)
发信人:jsjyt
时 间:2001-5-26 9:33:35
详细信息:
软件名：HostSeek 中文版
软件作者：netseek
软件主页：http://go2.163.com/~netseek
软件类别：网络辅助
软件介绍：HostSeek 1.1 中文版可以在网上搜索网络主机的共享软件。搜索范围从0.0.0.0到 255.255.255.255都可以。搜索速度快。它会列出搜索到的IP地址，并且同时提供主机域名， 搜索时间，TTL和搜索成功率。对于局域网中查找有多少主机正常连在网上尤其好用。

下载地址：http://www.csdn.net/soft/openfile.asp?kind=4&id=10499

不用多说，拿出trw2000
填写注册码
注册名：yahoo（俺bbs的网名）
注册码：123
下断点hmemcpy
F5，点确定，被栏。
bc *
pmodule
来到hostseek的领空
F10单步跟踪
来到这里
* Reference To: USER32.wsprintfA, Ord:02ACh
|
:00405411 8B3D90C14000 mov edi, dword ptr [0040C190]
:00405417 C1FA04 sar edx, 04
:0040541A 0FBE4C0C2B movsx ecx, byte ptr [esp+ecx+2B]
:0040541F C1E105 shl ecx, 05
:00405422 51 push ecx
:00405423 52 push edx
:00405424 8D442448 lea eax, dword ptr [esp+48]

* Possible StringData Ref from Data Obj ->"%x%x-%x%x-%x%x-%x%x"注册码的形式可以看到了吧
|
:00405428 680CE74000 push 0040E70C
:0040542D 50 push eax 下d eax看见6de0-1350-7303-3981
:0040542E FFD7 call edi
:00405430 83C428 add esp, 00000028
:00405433 8D4C2428 lea ecx, dword ptr [esp+28]
:00405437 51 push ecx 下 d ecx看见7de0-1308-7903-3c81
呵呵，找到了，添进去，哦，注册失败，怎么回事？在跟一边，同样如此，怎么回事？
试着把小写的字母改成了大写的，呵呵，注册成功！
其实用W32DASM来反编译，比跟踪它更方便，而且这个东东没有加壳，我喜欢！
初学的朋友，爆破可能比较简单，
* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:00405469 FF158CC04000 Call dword ptr [0040C08C]
:0040546F 85C0 test eax, eax
:00405471 0F843A010000 jne 004055B1 只要把这里改成je就成了任意注册版了
:00405477 8D442440 lea eax, dword ptr [esp+40]
:0040547B 8D4C240C lea ecx, dword ptr [esp+0C]
:0040547F 50 push eax
:00405480 51 push ecx
:00405481 6A00 push 00000000
:00405483 6806000200 push 00020006
:00405488 6A00 push 00000000
:0040548A 6858054100 push 00410558
:0040548F 6A00 push 00000000


HTMLEncryptor1.1

标 题:网页加密器(HTMLEncryptor1.1)破解及注册机 (1千字)
发信人:8989
时 间:2001-4-22 10:47:06
详细信息:
网页加密器(HTMLEncryptor1.1)破解及注册机

国产,来自共享软件下载中心
软件名称：HTMLEncryptor 注册价格：120元/套
适用平台：WIN9x, NT, 2000 最新版本：v1.1
下载http://www.shareware.net.cn/dl.asp?id={21D437E7-694F-4953-A732-E687C04FFBB4}
软件作者：GoldStone Software Team. 作者主页：http://goldstone.51.net

1.获得注册码
姓名 1111 注册码 aFFa
姓名 123456 注册码 HIJKLM
姓名字符数大于等于4
bpx 453b52 do "d eax"

2.注册机(TC编译通过)

#include <stdio.h>

int main(void)
{ unsigned long b=0,d=0,f=0;
int counter=0,c=0,e=0;
unsigned char yourname[63];
clrscr();
printf("HTMLEncryptor 1.1\n");
printf("==================\n");
printf("Made by fpx[CCG]-2001\n");
printf("China Cracking Group\n");
printf("please enter your name:(no less than 4 chars)");
gets(yourname);
printf("your register number is: ");
for(counter=0;counter<strlen(yourname);counter++)
{ c=(counter+1)%3;
b=yourname[2];
switch(c)
{case 0:
break;
case 1:
b=b*b; break;
case 2:
b=b*b*b;
}
d=yourname[counter];
f=b+d;
e=f%75+47;
putch(e);
}
printf("\nbye");
return(0);
}


Hyper Maker 2000

 标 题:xiaolou请看：Hyper Maker 2000 (2千字)
发信人:1212 (blowfish)
时 间:2000-9-26 11:31:10
详细信息:
只是写注册机的一个提示：

001B:0052624A CALL 00403F70
001B:0052624F MOV EAX,[005328F4]
001B:00526254 CMP BYTE PTR [EAX],00
001B:00526257 JZ 00526286
001B:00526259 LEA EDX,[EBP-18]
001B:0052625C MOV EAX,[EBP-0C]
001B:0052625F CALL 00527788
001B:00526264 MOV EAX,[EBP-18] ；名字
001B:00526267 CALL 00403F24 ；strlen( )
001B:0052626C CMP EAX,03 ；不得小于3
001B:0052626F JL 00526370
001B:00526275 MOV EAX,[EBP-08] ；key
001B:00526278 CALL 00403F24 ；strlen( )
001B:0052627D CMP EAX,0C ；必须为12
001B:00526280 JNZ 00526370
001B:00526286 LEA EAX,[EBP-10]
001B:00526289 CALL 00403CA8
001B:0052628E MOV EBX,00000001
001B:00526293 LEA EAX,[EBP-18]
001B:00526296 MOV EDX,[EBP-0C]
001B:00526299 MOV DL,[EBX+EDX-01] ；Name[k]
001B:0052629D MOV ECX,[EBP-14]
001B:005262A0 MOV CL,[EBX+ECX-01] ；ID[k]
001B:005262A4 XOR DL,CL ；异或
001B:005262A6 CALL 00403E4C
001B:005262AB MOV EDX,[EBP-18]
001B:005262AE LEA EAX,[EBP-10]
001B:005262B1 CALL 00403F2C
001B:005262B6 INC EBX
001B:005262B7 CMP EBX,0D ；循环13次
001B:005262BA JNZ 00526293
001B:005262BC MOV EAX,[00532600]
001B:005262C1 MOV EDX,[EBP-08]
001B:005262C4 CALL 00403CFC
001B:005262C9 LEA EDX,[EBP-18]
001B:005262CC MOV EAX,[EBP-0C]
001B:005262CF CALL 00527788
001B:005262D4 MOV EDX,[EBP-18]
001B:005262D7 MOV EAX,[00532790]
001B:005262DC CALL 00403CFC
001B:005262E1 LEA EDX,[EBP-18]
001B:005262E4 MOV EAX,[EBP+08]
001B:005262E7 CALL 00527788
001B:005262EC MOV EDX,[EBP-18]
001B:005262EF MOV EAX,[00532504]
001B:005262F4 CALL 00403CFC
001B:005262F9 MOV EAX,[0053259C]
001B:005262FE MOV EAX,[EAX]
001B:00526300 MOV EDX,005263FC
001B:00526305 CALL 0050BBF0
001B:0052630A MOV EAX,[00532510]
001B:0052630F CMP BYTE PTR [EAX],00 ；注册版本？
001B:00526312 JZ 00526339

标 题:续 (3千字)
发信人:1212
时 间:2000-9-26 11:49:48
详细信息:

上面的那段代码是输入注册码之后进行的判断。启动时的判断在这里。基本上是在ID#后面添加“123”，再在Name后面添加一些空格，然后两者异或，最后得出注册码。

001B:005278A3 LEA EAX,[EBP-04]
001B:005278A6 PUSH EAX
001B:005278A7 LEA EDX,[EBP-18]
001B:005278AA MOV EAX,[00532790]
001B:005278AF MOV EAX,[EAX]
001B:005278B1 CALL 00527788
001B:005278B6 LEA EAX,[EBP-18]
001B:005278B9 MOV EDX,00527A9C
001B:005278BE CALL 00403F2C
001B:005278C3 MOV EAX,[EBP-18]
001B:005278C6 MOV ECX,0000000C
001B:005278CB MOV EDX,00000001
001B:005278D0 CALL 00404128
001B:005278D5 LEA EAX,[EBP-18]
001B:005278D8 PUSH EAX
001B:005278D9 MOV EAX,[00532744]
001B:005278DE MOV EAX,[EAX]
001B:005278E0 MOV ECX,00000009
001B:005278E5 MOV EDX,00000001
001B:005278EA CALL 00404128
001B:005278EF MOV EDX,[EBP-18]
001B:005278F2 LEA EAX,[EBP-0C]
001B:005278F5 MOV ECX,00527AB4
001B:005278FA CALL 00403F70
001B:005278FF MOV EAX,[EBP-04] ；Name
001B:00527902 CALL 00403F24 ；strlen( )
001B:00527907 CMP EAX,03
001B:0052790A JL 0052799D
001B:00527910 MOV EAX,[00532600]
001B:00527915 MOV EAX,[EAX] ；reg key
001B:00527917 CALL 00403F24 ；strlen( )
001B:0052791C CMP EAX,0C
001B:0052791F JNZ 0052799D
001B:00527921 LEA EAX,[EBP-08]
001B:00527924 CALL 00403CA8
001B:00527929 MOV ESI,00000001
001B:0052792E LEA EAX,[EBP-18]
001B:00527931 MOV EDX,[EBP-04]
001B:00527934 MOV DL,[ESI+EDX-01] ；Name[k]
001B:00527938 MOV ECX,[EBP-0C]
001B:0052793B MOV CL,[ESI+ECX-01] ；ID[k]
001B:0052793F XOR DL,CL
001B:00527941 CALL 00403E4C
001B:00527946 MOV EDX,[EBP-18]
001B:00527949 LEA EAX,[EBP-08]
001B:0052794C CALL 00403F2C
001B:00527951 INC ESI
001B:00527952 CMP ESI,0D ；循环次数
001B:00527955 JNZ 0052792E
001B:00527957 LEA EAX,[EBP-0218]
001B:0052795D MOV EDX,[EBP-08]
001B:00527960 MOV ECX,000000FF
001B:00527965 CALL 00403F00
001B:0052796A LEA EAX,[EBP-0218]
001B:00527970 LEA EDX,[EBP-0118]
001B:00527976 CALL 0049D564
001B:0052797B LEA EDX,[EBP-0118]
001B:00527981 LEA EAX,[EBP-18]
001B:00527984 CALL 00403EC8
001B:00527989 MOV EAX,[EBP-18] ；正确注册码
001B:0052798C MOV EDX,[00532600]
001B:00527992 MOV EDX,[EDX] ；错误注册码
001B:00527994 CALL 00404034 ；比较注册码
001B:00527999 JNZ 0052799D
001B:0052799B XOR EBX,EBX
001B:0052799D TEST BL,BL
001B:0052799F JZ 005279D5
001B:005279A1 MOV EAX,[0053261C]
001B:005279A6 CMP BYTE PTR [EAX],00
001B:005279A9 JZ 005279C5
001B:005279AB MOV EAX,[00532854]
001B:005279B0 CMP BYTE PTR [EAX],00
001B:005279B3 JZ 005279C5
001B:005279B5 MOV EAX,[005325D4]
001B:005279BA CMP WORD PTR [EAX],6358
001B:005279BF JNZ 005279C5
001B:005279C1 XOR EBX,EBX
001B:005279C3 JMP 005279C7
001B:005279C5 MOV BL,01
001B:005279C7 MOV EAX,EBX
001B:005279C9 XOR AL,01
001B:005279CB MOV EDX,[00532510]
001B:005279D1 MOV [EDX],AL ；注册与否的标志位
001B:005279D3 JMP 00527A03

http://www.bersoft.com/hmhtml/hypermaker2000.exe

标 题:多谢! 再问一声:程序启动时下何断点, createfilea, regqueryvalueexa? (空)
发信人:小楼
时 间:2000-9-26 12:10:55
详细信息:

标 题:只要你輸入的RegCode是12個字元,它就會將你的註冊資料寫入hypermaker.ini中,所以你應該知道如何下斷點了吧!... (151字)
发信人:C-pen
时 间:2000-9-26 12:47:05
详细信息:

标题: 只要你輸入的RegCode是12個字元,它就會將你的註冊資料寫入hypermaker.ini中,所以你應該知道如何下斷點了吧!那就是bpx GetprivateProfilestringA

内容:

标 题:注册机的写法 (2千字)
发信人:1212
时 间:2000-9-26 13:41:22
详细信息:

1、如果用户输入的名字少于3个字符则重新输入。
2、如果用户输入的名字少于12个字符则用空格凑齐12个字符。
3、用串"123"加在ID#的后面，凑成12个字符。
4、将第2步的12个字符和第3步的12个字符逐一异或，得到12个字节。
5、对于得到的12个字节中的每个字节，进行下面的转换。转换的结果就是注册码。
转换非常简单，就是12个字节逐一和一张表中的12个字节相加，如果和不是大写字母，就通过不断加0x19或减0x19的方法使其变成大写字母。
下面的12条MOV指令初始化该表格：

001B:0023A613 MOV DWORD PTR [EBP-0238],00000009
001B:0023A61D MOV DWORD PTR [EBP-0234],0000000D
001B:0023A627 MOV DWORD PTR [EBP-0230],00000007
001B:0023A631 MOV DWORD PTR [EBP-022C],00000002
001B:0023A63B MOV DWORD PTR [EBP-0228],0000000C
001B:0023A645 MOV DWORD PTR [EBP-0224],00000006
001B:0023A64F MOV DWORD PTR [EBP-0220],00000014
001B:0023A659 MOV DWORD PTR [EBP-021C],00000005
001B:0023A663 MOV DWORD PTR [EBP-0218],00000005
001B:0023A66D MOV DWORD PTR [EBP-0214],0000000B
001B:0023A677 MOV DWORD PTR [EBP-0210],00000012
001B:0023A681 MOV DWORD PTR [EBP-020C],0000000E

001B:0023A68B MOV EDI,00000001 ；循环控制变量初值
001B:0023A690 LEA ESI,[EBP-0238]
001B:0023A696 LEA EAX,[EBP-0340]
001B:0023A69C PUSH EAX
001B:0023A69D MOV ECX,00000001
001B:0023A6A2 MOV EDX,EDI
001B:0023A6A4 LEA EAX,[EBP-0107]
001B:0023A6AA CALL 00232620
001B:0023A6AF LEA EDX,[EBP-0340]
001B:0023A6B5 LEA EAX,[EBP-0240]
001B:0023A6BB CALL 002333B4
001B:0023A6C0 MOV EDX,[EBP-0240]
001B:0023A6C6 LEA EAX,[EBP-07]
001B:0023A6C9 CALL 00235764
001B:0023A6CE MOV AL,[EBP-07] ；异或得到的一个字节
001B:0023A6D1 XOR EBX,EBX
001B:0023A6D3 MOV BL,AL
001B:0023A6D5 ADD EBX,[ESI] ；和表格中的对应字节相加
001B:0023A6D7 CMP EBX,5A ；以下判断是否在‘A’-‘Z’之间
001B:0023A6DA JLE 0023A6E4
001B:0023A6DC SUB EBX,19
001B:0023A6DF CMP EBX,5A
001B:0023A6E2 JG 0023A6DC
001B:0023A6E4 CMP EBX,41
001B:0023A6E7 JGE 0023A6F1
001B:0023A6E9 ADD EBX,19
001B:0023A6EC CMP EBX,41
001B:0023A6EF JL 0023A6E9
001B:0023A6F1 LEA EAX,[EBP-0344]
001B:0023A6F7 MOV EDX,EBX
001B:0023A6F9 MOV [EAX+01],DL ；保存注册码的一个字符
001B:0023A6FC MOV BYTE PTR [EAX],01
001B:0023A6FF LEA EDX,[EBP-0344]
001B:0023A705 LEA EAX,[EBP-0207]
001B:0023A70B CALL 002326C0
001B:0023A710 INC EDI
001B:0023A711 ADD ESI,04
001B:0023A714 CMP EDI,0D ；循环12次，得到注册码的12个字符
001B:0023A717 JNZ 0023A696

标 题:浪费时间 (943字)
发信人:1212
时 间:2000-9-26 14:38:41
详细信息:

 #include <stdio.h>
#include <string.h>

void main(void)
{
char          Name[64];
char          ID[64];
unsigned long Table[12] = {9, 13, 7, 2, 12, 6, 20, 5, 5, 11, 18,
  14};
unsigned long Key[12];
int          k, len;

do
{
printf("Input your name(at least 3 chars):");
gets(Name);
len = strlen(Name);
} while(len < 3);

do
{
printf("Input your ID#(XXXX-XXXX):");
gets(ID);
} while( (strlen(ID) != 9) || (ID[4] != '-'));

for(k = len; k < 12; k++)
{
Name[k] = 0x20;
}

strcat(ID, "123");

printf("Your registration key is: ");

for(k = 0; k < 12; k++)
{
Key[k] = (Name[k] ^ ID[k]) & 0xFF;
Key[k] += Table[k];
while(Key[k] > 'Z') Key[k] -= ('Z' - 'A');
while(Key[k] < 'A') Key[k] += ('Z' - 'A');
putchar(Key[k]);
}

putchar('\n');
}


HyperCam Version 1.20.04

标 题:我的破解心得(5) (16千字)
发信人:chcw
时 间:2001-3-13 18:04:19
详细信息:
破解程序:
HyperCam Version 1.20.04(for Intel processors)

破解工具:
SoftIce 3.0 for Windows95(或更高版本)

破解者：
chcw

1. 用WinICE载入HyperCam.exe
2. 在HyperCam中选择License/Enter License Now,弹出HyperCam License对话框.
3. 按Ctrl-D,切换到SoftICE窗口,在SoftICE命令行设置断点 BPX MessageBoxA
4. 再按Ctrl-D,回到执行程序HyperCam.在Register和Key中随便填入注册码,如Register=chcw,Key=
9530109.并选择一种注册类型,如Sigle User - Number of Licensed 1，添完上述内容后,选择
'OK', 触发SoftICE。
5. SoftICE的光带停留在MessageBoxA函数的入口处:

USER32!MessageBoxA
015F:BFF541BA PUSH EBP

将光标移到MessageBoxA函数的返回处

015F:BFF541D RET 0010

并键入命令HERE,程序执行到光标所在处。（由于函数MessageBoxA要调用函数MessageBoxExA，
所以在上述执行过程中会出现一个对话框，直接选'OK'或'确定’即可）
6. 连续按F10键，回到MessageBoxA函数被调用处：

015F:00427881 CALL [USER32!MessageBoxA]
015F:00427887 POP EDI
015F:00427888 POP ESI
015F:00427889 RET 000C

这部分代码在程序HyperCam.exe中，但在程序调用MessageBoxA后，程序立即以子程序的方式返回，
综合在调用MessageBoxA前的代码，可以看出这是程序HyperCam中的一个子程序(入口地址为00427853),
其主要功能大致是显示一个信息框而已。因此，我们没有必要把注意力放在这里。继续按F10，跳出这
个子程序。返回到调用它的上一层程序。

015F:0040A03B CALL 00427853 (调用上述子程序00427853)

显然，既然CALL 00427853的功能是显示一个注册错误的信息框，那么在它被执行之前，一定有一些
函数或语句是用来判断注册正确与否，并根据判断结果来决定是显示错误信息，还是提示注册成功
（HyperCam在用户输入正确的注册码时，没有任何提示信息）。 从CALL 00427853语句向上找,在
015F:0040A020处有一条语句JMP 0040A040，跳转地址正好是CALL 00427853的下一条语句。由于这是
一条无条件跳转语句，我们继续往上找能使程序流程执行到这条跳转语句的条件跳转语句（这里的条
件，就是指注册码正确与否）。 在015F:0040A00D和015F:00409FF2处各有一条条件跳转语句，但它
们都不影响程序的主要流程。最后在015F:00409FD8处，有一个条件跳转:

015F:00409FD1 CALL 004092E0 ; 调用004092E0检查注册码的有效性
015F:00409FD6 TEST EAX, EAX ; 若返回值为0，则显示错误信息。
015F:00409FD8 JE 0040A022 ;

分析以上语句，不难看处，当调用函数004092E0的返回值为0时，将显示注册错误的对话框窗口。可
见，函数4092E0应该是HyperCam检查注册码是否正确的函数。键入命令BC *，清除原先的断点；并
在015F:00409FD1处双击鼠标，设置执行断点。
7. 按Ctrl D回到HyperCam中，仍使用原先的注册码，再次选择'OK'后。触发SoftICE，执行亮条停留在
断点015F:00409FD1 CALL 004092E0处，先按F10，Step Out过这个函数的调用。此时,EAX的值为0
并显示高亮，显然函数004092E0改动了EAX。在SoftICE的命令行下，键入r EAX=1,造成注册成功的假
象，再按Ctrl D，继续执行程序，返回到HyperCam。这时我们发现，提示用户输入注册信息的窗口
HyperCam License已经关闭。但在License页中显示的信息还是未注册, 这是怎么回事呢？
我们可以作这样一个假设，004092E0函数不仅通过返回值来表明注册信息正确与否，还通过传递
指针参数来返回注册信息。调用004092E0的函数再进一步将这些注册信息记录在磁盘上。由于我们在
上面程序的运行过程中没有填充这些信息，因而尽管程序的流程大致是正确的，但注册信息却没有被
保存下来。
8. 如果要用Patch方法来破解HyperCam,显然不能只修改015F:00409FD8处的条件判断，具体该如何破解，
我没有仔细研究。我主要分析了获取有效注册码的方法。
9. 继续上面的破解过程，在015F:00409FD1处设置有执行断点。按'OK'后，触发SofeICE，执行亮条停留
在断点处，按F8,进入函数004092E0中。
10.接下来按F10键，到达函数体中的两个子函数调用子函数调用015F:00409313 CALL 和0041F3AC,
015F:00931C CALL 0041F3BF该函数的大致作用 是判断时区和现在的时间，可能与注册方式中的临时
性注册有关，由于我们选择单用户按份数注册的方式。因而可以直接跳过(Step Out)这两个函数。继
续按F10键。
11.接下来进入两个循环：

015F:0040932E MOV EDX, DWORD PTR [ESI]
...
015F:00409348 CALL 0040EDB0 ; 字符串比较（stricmp）
015F:0040934D ADD ESP, 0000000C
015F:00409350 TEST EAX, EAX ;
015F:00409352 JE 004096B5 ; 若eax==0则跳转
015F:00409358 ADD ESI, 00000004 ; 指向下一个字符串
015F:0040935B CMP ESI, 00436EBC ; 字符串数组都比较完了吗？
015F:00409361 JB 0040932E ; 若未比较完，则继续比较。

在循环中不断调用子程序0040EDB0，该程序的功能相当于stricmp，它将用户输入的姓名和系统内
部的两个数组中的字符串进行比较。字符串数组如下：
char *s1[]={"hacker","ED!SON","tHATDUDE","super user","saltine","xygorf","Borin Thibault",
"Alexander Chen","-M-O-A-","^SaTaNa","Michael Jackon"}
char *s2[]={"abel", "Monkey", "jackkuo", "TRACY"}
写到这里，也许有人会猜想，这可能是程序在比较用户输入的姓名是否和系统保留的几个字符串相
同，若相同，则继续检验注册码的正确性，也就是说，这是系统留下的后门。当时我也这么想，那么剩
下的只有注册码了。于是，我按Ctrl D，回到HyperCam的注册窗口，将名字那一栏用上述数组中的某个
字符串填写(如"saltine"),再按Ctrl D,在命令行输入s ds:0 l ffffffff '9530109',找到了存放注册码
的内存地址0030:80527d70, 然后设置断点BPM 0030:80527d70，再键入X,运行程序。但是在拦截到对字符
串'9530109'的所有访问中，却没有发现可能是检验注册码的语句。看来我们原先的猜想是错误的。再次
分析上述的循环后发现。字符串数组s1、s2实际上是两个黑名单，当用户输入的注册名是数组中的某个
字符串时，系统立即认为注册失败，不再检查注册码。而只要你输入的注册名不是上面数组中的某个字符
串后，就可以跳过这两个循环，
12.继续按F10键，执行到下列语句处：

015F:00409395 PUSH ECX ; 将注册码地址压栈
015F:00409396 CALL 004098C0
015F:0040939B MOV EBX, EAX ; EBX <- EAX
015F:0040939D ADD ESP, 4
015F:004093A0 TEST EBX, EBX ; 返回值在EBX中
015F:004093A2 JZ 004096B5 ; 若EBX为0，则程序认为注册出错。

由于子程序004098C0的参数为注册码，而该函数返回值决定注册是否成功，因而有必要分析该子程序。按
F8，进入该程序：
...
015F:004098D6 CMP AL, 41 ;
015F:004098D8 JL 004098E6 ; 对注册码进行检查，
015F:004098DA MOV AL, [ECX] ; 将不在'A'-'Z'范围内的字符过滤掉。
015F:004098DC CMP AL, 5A
015F:004098DE JG 004098E6
...
015F:00409903 CMP ECX, 00000080
015F:0040990D JGE 004099A5 ; 检查注册码的长度(存放在ECX中)，
015F:00409913 CMP ECX, 03 ; 长度<=3或>=128的为非法。
015F:00409916 JLE 004099A5
...
015F:0040991C MOVSX EBP, BYTE PTR [ESP+16]
015F:00409921 SUB EBP, 00000041 ; 对注册码进行某种换算，
...
015F:0040992C MOV AL, BYTE PTR [ESP+EBX+14] ; 得到一个新的加密码SecretCode。
...
015F:00409947 CALL 00409A20
...
015F:00409967 INC EBX
015F:00409968 CMP EBX, ECX
015F:0040996A JL 0040992C
...
015F:0040996C MOVSX ESI, BYTE PTR [EDI+0043B77F] ; 将加密码分成前n-1个字符和
015F:0040997B MOV BYTE PTR [EDI+0043B77F], 00 ; 最后一个字符两部分，
015F:00409982 CALL 004099C0 ; 分别作某种运算，
...
015F:0040998C CMP ESI, EAX ; 比较其结果是否相同。
015F:0040998E SETNE CL ; 若不同，则注册为非法。
...
015F:00409992 AND ECX, 0043B780 ; 将加密码SecretCode（去掉最后一个字符）的地址返回。
015F:00409998 MOV EAX, ECX ;
子程序004098C0对注册码进行检查和判断，生成SecretCode，并将结果放在EAX返回。
13.从子程序004098C0返回后，继续按F10键，下面一部分程序将再次检查你的注册姓名是否在黑名单s2上（看
来作者对数组s2中的人恨之入骨）跳过这段程序。到015F:0040945B MOV EAX,[EBP+14]处。
14.接下来，程序将对用户输入的注册名进行处理：

015F:004094B9 LEA EDI, DWORD PTR [ESP+20] ; 用户输入的注册名所存放的地址
...
015F:004094C1 LEA EDX, DWORD PTR [ESP+00000120] ; 系统处理后得到的新串LName存放的地址
015F:004094C8 REPNZ SCASB
015F:004094CA NOT ECX ; 取得注册名的串长度
...
015F:004094DE REPZ MOVSD ; 将注册名复制到新串LName中
...
015F:004094F5 CMP ECX, 00000010 ; 检查用户输入的姓名是否小于16个字符，
015F:004094F8 JL 004094B9 ; 如果是，则将姓名串不断重复复制到
; LName处，直到超过16个字符为止。
由于我们输入的是"chcw", 因而系统处理后将得到串LName="CHCWCHCWCHCWCHCW"。
15.继续按F10，直到下列语句处：
015F:004096D2 MOV AL, [EBX] ; AL <- SecretCode[0]（EBX中存放的是SecretCode的地址）
015F:004096D4 MOV EBP, [ESP+00000238]
015F:004096DB CMP AL, 50 ; 若AL=='P'，则为第一种注册方式(Single User)
015F:004096DD JZ 00409769 ; 跳转到第一种注册方式的处理语句处。
015F:004096E3 CMP AL, 53 ; 若AL=='S'，则为第二种注册方式(Unlimited Site License)
015F:004096E5 JZ 0040974F ; 跳转到第二种注册方式的处理语句处。
015F:004096E7 CMP AL, 57 ; 若AL=='P'，则为第三种注册方式(Unlimited Word-Wide License)
015F:004096E9 JNZ 00409707 ; 若三种都不是，则注册出错。

015F:004096EB MOV EDI, DWORD PTR [ESP+0000023C]
015F:004096F2 CMP EDI, 00000003 ; 判断用户输入的注册方式是否为3
015F:004096F5 JNE 00409707 ; 若不是，则注册出错。
015F:004096F7 CMP BYTE PTR [EBX+01], 4F ; 判断SecretCode[1]是否为'O'
015F:004096FB JNE 00409707 ; 若不是，则注册出错。
015F:004096FD CMP BYTE PTR [EBX+02], 52 ; 判断SecretCode[1]是否为'R'
015F:00409701 JE 00409787 ; 若不是，则注册出错。
...
015F:00409707 LEA ECX, DWORD PTR [ESP+00000230] ; 注册出错处理
...
015F:0040974F MOV EDI, DWORD PTR [ESP+0000023C]
015F:00409756 CMP EDI, 00000002 ; 判断用户输入的注册方式是否为2
015F:00409759 JNE 00409707 ; 若不是，则注册出错。
015F:0040975B CMP BYTE PTR [EBX+01], 49 ; 判断SecretCode[1]是否为'I'
015F:0040975F JNE 00409707 ; 若不是，则注册出错。
015F:00409761 CMP BYTE PTR [EBX+02], 54 ; 判断SecretCode[1]是否为'T'
015F:00409765 JE 00409787
015F:00409767 JMP 00409707 ; 若不是，则注册出错。

015F:00409769 LEA EAX, DWORD PTR [EBX+01] ;取得SecretCode[1]的地址
015F:0040976C PUSH 00000002
015F:0040976E PUSH EAX ; 将SecretCode[1]的地址压栈
015F:0040976F CALL 00409A40 ; 根据字符SecretCode[1]和字符SecretCode[2](大写字符)
;计算注册的数目。由于采用的是26进制，因而最多可以表示26x26份拷贝。
015F:00409774 MOV EDI, DWORD PTR [ESP+00000244]
015F:0040977B ADD ESP, 00000008
015F:0040977E CMP EDI, 00000001 ; 判断用户输入的注册方式是否为2
015F:00409781 JNE 00409707 ; 若不是，则注册出错。

015F:00409783 CMP EBP, EAX ; 比较计算所得得注册数是否与用户输入的注册数相同
015F:00409785 JNE 00409707 ; 若不是，则注册出错。

从上面的程序段可以看出，该段程序的主要功能是对SecretCode进行检查，根据用户注册的方式不同，可
分为三种情况：
1. 第一种注册方式(Single User)，SecretCode的第一个字符必须是'P'，接下来的两个字符应为注册数目的
26进制值。
2. 第二种注册方式(Unlimited Site License)，该种情况下，SecretCode的头三个字符必须是'S'、'I'、'T'。
3. 第三种注册方式(Unlimited Word-Wide License)，该种情况下，SecretCode的头三个字符必须是'W'、'O'、
'R'。

16.在SecretCode的前三个字符与用户的注册方式完全相符后，继续按F10键，到下列语句处：

015F:004097AB PUSH 00436F68 ; 字符串"HCA"的地址压栈
015F:004097B0 PUSH EBX ; SecretCode[3]的地址压栈
015F:004097B1 CALL 0040ED70 ; 比较以SecretCode[3]为启始地址的字符串的前三个字符是否为'HCA'
015F:004097B6 ADD ESP, 0000000C
015F:004097B9 TEST EAX, EAX ; 若不是"HCA",则注册出错。
015F:004097BB JNE 00409707

该段程序检查SecretCode的第三到第六个字符是否为"HCA"(就是HyperCam的缩写)，如果不是，则注册出错。
17.通过上述检查后，继续按F10键，到以下语句处：
015F:004097C8 MOV DL, [EAX] ; DL <- LName[i]
015F:004097CA MOV BL, [ESI] ; BL <- Secret[6+j]
015F:004097CC MOV CL, DL
015F:004097CE CMP DL, BL ; 比较DL，BL是否相当。
015F:004097D0 JNZ 004097F0 ; 若不相等，则注册出错
015F:004097D2 TEST CL, CL ; 判断是否已经到达字符串的末尾
015F:004097D4 JZ 004097EC
...
015F:004097E2 ADD EAX, 02 ; i+=2
015F:004097E5 ADD ESI, 02 ; j+=2
015F:004097E8 TEST CL, CL ; 判断是否已经到达字符串的末尾
015F:004097EA JNZ 004097C8 ; 若不是，则循环。

这部分程序段将SecretCode（Secret在第14步处调用程序004098C0时产生）剩余的字符所组成的字符串与字符串LName进行比
较。若二者相同，则认为注册成功。
18.至此，我们已经分析完HyperCam的注册检验过程。在此过程中，程序不在内存中生成任何合法的注册码，而仅根据用户输入
的注册码产生一个SecretCode，并对此SecretCode进行后续的操作，这使得破解过程较为复杂。而且在整个注册检验过程中，
程序还多次检验用户输入的注册名是否是常用的Cracker名字，这使破解的复杂程度进一步增加。因此，我们有理由相信，
HyperCam程序在编写过程中，曾经有意识的加入了反Crack的代码。
19.下面我们要为HyperCam写一个注册码生成器，通过对HyperCam注册检验过程的分析，我们已经知道，该注册码生成器的输入
信息为：
1.用户注册的姓名Name。
2.用户注册的方式Register type。
3.对于以第一种注册方式(Single User)注册的用户，还需要输入注册的数目Copy Number.
根据输入的信息，可以生成中间代码SecretCode，它由三部分组成，分别对应于下列信息：
1.第一部分为3个字符，表示注册的方式代码，可以由输入2、3换算得到。
2.第二部分为固定的三个字符"HCA"。
3.第三部分为LName，可以由输入Name换算得到。
得到了SecretCode之后，我们可以进一步求取最终的注册码Register Code, 这是一个逆向的过程，由于SecretCode的每
个字符是通过Register Code的当前字符以及SecretCode的前一个字符生成的，因此，只要注册码的前面部分是正确的，
我们就可以采用穷举法变换Register Code当前的字符，并检验由此生成的SecretCode是否合法，从而能从左自右，试探
出全部合法的注册字符。由于每个字符只能取大写字符，因此全部的工作量只有26 X strlen(Register Code)。另外注册
码Register Code除了要求能正确生成SecretCode外，其自身还要满足一定的条件（在第12步中已经指出），这可以通过
对Register Code的最后一个字符进行检验来实现。

附:HyperCam的注册码生成器KeyMaker.C
---------------------- KeyMaker.C -----------------------------
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <ctype.h>
#include <process.h>

int shiftsum(char *result, int len)
{
int fact,i,x,sum=0;
char c;
fact=1;
if (len<fact) len=strlen(result);
if (len<=0) return sum;
for (i=0; i<len; i++) {
c=result[i];
x=c-'A';
x*=fact;
sum += x;
fact = 26*fact;
}
return sum;
}

char checksum(char *regcode)
{
int sum=0,val,i;
char c,tmp;

for (i=0;i<strlen(regcode);i++) {
c=regcode[i];
val=c-'A';
if (i & 1) val=val*2;
if (val>=26) val=val-25;
sum += val;
}

tmp=sum % 26;
return tmp;
}

int genregcode(char *regcode, char *result, int *tail)
{
char *table="EHIOTBVPSFRNWYQCJAGKUZXDML";
char tmpcode[27];
int i,j,x,y;
long len;
char c;

/* Filter characters that are not in 'A' to 'Z' */
for (i=0,j=0; regcode[i]!='\0'; i++)
if (isupper(regcode[i])) tmpcode[j++]=regcode[i];
tmpcode[j]='\0';

/* Test the len of the regcode */
len=strlen(tmpcode);
if ((len>=128) || (len<=3)) {
printf("error: cannot accept a regcode with mislen");
return NULL;
}

i=j=0;
y=tmpcode[2]-'A';
for (i=0;i<len;i++)
if (i!=2) {
c=tmpcode[i];
if (c<'A') return NULL;
if (tmpcode[j]>'Z') return NULL;
x=strchr(table, c)-table;
x=x-y;
x--;
if (x<0) x+=26;
result[j++]=x+'A';
y=c-'A';
}
result[j]='\0';

*tail=result[j-1]-'A';
result[j-1]='\0';

return checksum(result);
}

void main()
{
char regcode[27];
char secretcode[27],tmp[27];
int i,j,len;
char ch;
char LName[33],Name[33];
int rtype,copy;
int chksum,tail;
int again;

for (i=0;i<26;i++)
regcode[i]='A';
regcode[i]='\0';

printf("\n\tHyper Cam Cracker\n\tWritten By Mr. Chcw\n\n");

printf("\tPlease enter your name: ");
gets(Name);
strcpy(LName, Name);

if (strlen(Name) >= 32) {
printf("Error : User Name is too long\n");
exit(1);
}

if (strlen(Name)<16) {
while (strlen(LName)<16)
strcat(LName, Name);
LName[16]='\0';
}

do {
printf("\n\tPlease choose the license type:\n");
printf("\t1. Single User\n");
printf("\t2. Unlimited Site License\n");
printf("\t3. Unlimited World Wide License\n\t");
scanf("%d", &rtype);

again=0;

switch (rtype) {
case 1:
printf("\n\tPlease enter number of lincensed: ");
scanf("%d", &copy);

secretcode[0] = 'P';
secretcode[1] = 'A' + copy % 26;
secretcode[2] = 'A' + copy / 26;
break;
case 2:
strcpy(secretcode, "SIT");
break;
case 3:
strcpy(secretcode, "WOR");
break;
default:
printf("\tIncorrect option, please enter a number in 1-3");
again=1;
}
} while (again);

secretcode[3]='\0';
strcat(secretcode, "HCA"); // Add the HCA mark
strcat(secretcode, LName); // Add the LName String
l


HyperSnap-DX 4.01.11

标 题:HyperSnap-DX 4.01.11的不完全破解 (4千字)
发信人:kingtall
时 间:2001-4-14 13:07:31
详细信息:
软件：HyperSnap-DX 4.01.11
介绍：功能强大的抓图工具。
下载：http://newhua.infosail.com/down/HS4Setup.exe(2.12M)
保护方式：授权文件保护，未注册时每次启动会有一个提示注册的对话框，抓下来的图也总是带有软件公司的标志。
该版本的保护方式与以前版本的保护方式不同，由序列号方式改为授权文件方式，注册时要求输入授权文件的全部内容。这对小弟的破解工作倒没有什么影响，小弟偏爱暴力法破解（本人比较懒，懒得算注册号），且喜欢装入程序，从头单步运行，直到弹出注册对话框（当然加壳的程序除外）。

先把HprSnap.exe 拷到别的目录，作为备份。
启动trw2000,打开C:\Program Files\HyperSnap-DX 4\HprSnap.exe，装入，按F10。若按F10带过一个call时，弹出提示注册对话框，就关闭对话框，trw2000会自动弹出。实在不行的话，退出程序，trw2000也会自动弹出。用鼠标选中刚才的call，按F9设断点，g，程序会正常运行。关闭程序，重新装入，全速运行，在刚才的断点中断。按F8进入call内，按F10重复刚才的过程，用不了几次，就能找到关键部位。请看(本人用log2命令无法存盘，只好keyin了，哪位大哥知道log2的用法，不妨指点小弟一下):

42E279 8B837001000 mov eax,[ebx+170]; [ebx+170]=[4fdd30]=0
42e27f 85c0 test eax,eax
42e281 0f85d9000000 jnz near 42e360; (no jump)

这时如果敲入rfl z命令，g,哈哈，注册对话框没有出现。很明显4fdd30这个全局变量中放的就是注册标志,若为0，就是没有注册。现在，重新装入程序，bc,下bpm 167:4fdd30 w,g。来到下面这一段：

436fcd e85ec9feff call 423930
436fd2 83c404 add esp,4
436fd5 a330dd4f00 mov [4fdd30],eax; eax=0

是谁让我们的eax变成0的？一定是上面那个call了。bc，下bpx 42e279,g。退出hypersnap，从新装入，g。
trw在436fcd中断，按F8进入。废话少说，来到下面这一段：

423a6c 33c0 xor eax,eax ;原来在这里了。
423a6e 5b pop ebx
423a6f 8b4df4
...
423a7c c3 ret

记下代码(建议大家多抄几行，我的是e870f606005f5e33c0)，启动uedit，查找e870f606005f5e33c0，找到后将33c0改为9090。存盘，试一下。

居然弹出一个对话框，说程序被损坏了，怎么办呢？有了，ctrl+m呼出trw，下bpm lockmytask，g。按ok按钮，trw立即弹出。按几次F12，回到HprSnap的领空，看看上一行是什么？原来是call user32!messagebox。早知是这样，下bpx messagebox不久完了吗。现在怎么办呢？往上看看，有没有比较语句，能跳过messagebox，若找不到，就ret到上一层call中，找一找能不能跳过这个call。我ret了三四次，找到下面这一段：

42de41 e89a5cffff call 423ae0
42de46 85c0 test eax,eax
42de48 751d jnz 42de67;

把751d改为eb1d就行了，不再出程序被损坏的messagebox了，程序可以运行了，抓下的图片中没有公司标记了，行了吗？不行，程序现在动不动就出现非法操作，然后只能退出。下面是win98的提示信息。

HPRSNAP 在 00de:f5fa0f3d 的模块
<未知> 中导致无效页错误。
Registers:
EAX=0073fad4 CS=0167 EIP=f5fa0f3d EFLGS=00010246
EBX=0073fad4 SS=016f ESP=00640004 EBP=00640024
ECX=006400a8 DS=016f ESI=8174cedc FS=229f
EDX=bff768d5 ES=016f EDI=006400d0 GS=0000
Bytes at CS:EIP:

Stack dump:
bff768c9 006400d0 0073fad4 006400ec 006400a8 006401dc bff768d5 0073fad4 006400b8 bff882eb 006400d0 0073fad4 006400ec 006400a8 f5fa0f3d 00640294

我比较了一下，每次退出时的ip,寄存器都是一样的，于是有了一个办法。装入程序，下bp if (eax==73fad4)，因为每次出错时的eax都是73fad4。g。程序启动了，画面出来了，似乎一切正常。动一动鼠标，没动几下，出来一个蓝屏，trw说它不能中断。上帝啊，连trw都不能中断，我要绝望了。

还有一招，内存补丁。希望你备份的HprSnap.exe还在，把它考回来。我用的补丁是ppatcher 3.93，这可是ppatcher的作者thewd亲自email给我的。thewd挺负责任的，有信必回，你要是能对ppatcher提出什么意见或建议，他还会发给你一个最新版的ppatcher。扯远了。ppatcher.ppc的内容如下：

#Process Patcher Configuration File
Version=3.93

PatchAuthor=thewd
PatchContactInformation=thewd@hotmail.com

DisplayName=hprsnap.exe v4.01.11
Filename=hprsnap.exe
Filesize=1056768
Address=0x42de48:0x75:0xeB
Address=0x4337e6:0x75:0xeB
Address=0x4387e5:0x75:0xeB
Address=0x42e281:0x0f:0xe9
Address=0x42e282:0x85:0xda
Address=0x42e283:0xd9:0x00
Address=0x42e284:0x00:0x00
Address=0x42e285:0x00:0x00
Address=0x42e286:0x00:0x90
#End of Configuration File

这回行了吧。ppatcher.ppc所修改的地址跟我刚才说的不太一样，因为光修改423a6c处的xor eax,eax，还有一点问题。按菜单中的关于和注册两项时，还会出现非法操作。修改也很简单，只要下bpm 4fdd30，就很容易找到比较点了。

罗里罗唆说了半天，总结一下。
1. 4fdd30 是一个全局变量，存放的是注册标志，跟注册有关的判断都以它为依据。
2. 程序有自校验功能，但在42de48处可以跳过。
3. 程序还有暗桩，修改之后动不动就非法操作。本人功力不够找不到，只好用内存补丁。比较遗憾。请高手们赐教。

注:HyperSnapDx 3.53 和 3.63.01 的自校验方式与 4.01.11不同，修改文件后，再运行会提示有个文件找不到，而且用trw2000也无法装入。颇为奇怪。这里有3.63.01 的下在地址http://www.21hh.net/down/HySnapP.exe，那位有兴趣共同研究一下。3.63.01避注册框的比较点是45ae8b。

标 题:多谢bnbnf兄的提示，已经破解了HyperSnapDX 3.63.01，过程请看 (721字)
发信人:kingtall
时 间:2001-4-14 16:22:46
详细信息:

多谢bnbnf兄的提示，终于破解了HyperSnapDX 3.63.01。方法如下:
先打开资源管理器，找到C:\Program Files\HySnapDX目录，再运行trw2000,按ctrl+M 呼出trw2000，下bpx createfilea，然后g回到资源管理器，在管理器中运行hsdx.exe，trw会弹出两次。第一次不用管，g 。trw第二次弹出时按F12会回到hshelper!.text的天空。关键代码就在这里。请看
6308105b 50 push eax ；eax指向hsdx.exe
6308105c ff1538600863 call kernel32!createfilea
63081062 83f8ff cmp eax,-1
63081065 8945f8 mov [ebp-8],eax
63081068 0f84a1000000 jz 63081110 ；若已修改过hsdx.exe，这里就是no jump 。

单步执行到这里时，下rfl z，然后g 。程序界面终于出来了。具体修改过程就不说了。另外更正一下，上次提到3.63.01的关键点是错的，正确地址是416006 。

标 题:注册HyperSnap-DX ver. 3.63.01算法 (10千字)
发信人:zombieys
时 间:2001-4-16 16:22:48
详细信息:

注册HyperSnap-DX ver. 3.63.01算法

软件名称：HyperSnap-DX ver. 3.63.01
软件主页：http://www.hyperionics.com
主要功能：好像是抓图用的
主要目的：寻找自己的注册码
破解难度：中等难度(算码部分稍微复杂了一点)

不说废话了，直接进入正题。输入大名zombieys和注册码1212-1212-1212-1212-1212-1212(为什么不填78?我的内存里到处都是78，找不到啦，所以换换),下s 30:0 l ffffffff '1212',bpm搜到的地址。点注册，按几次f12和f10来到这里：

算NAME的CALL

:004096DB 55 push ebp
:004096DC 8BEC mov ebp, esp
:004096DE 81EC04010000 sub esp, 00000104
:004096E4 8B4D08 mov ecx, dword ptr [ebp+08]
:004096E7 33D2 xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409705(U)
|
:004096E9 8A01 mov al, byte ptr [ecx] //读取输入的注册码
:004096EB 84C0 test al, al //在A-Z之间才要
:004096ED 7418 je 00409707
:004096EF 3C41 cmp al, 41 //过滤掉-(2dhex)
:004096F1 7C0F jl 00409702
:004096F3 8A01 mov al, byte ptr [ecx]
:004096F5 3C5A cmp al, 5A
:004096F7 7F09 jg 00409702
:004096F9 888415FCFEFFFF mov byte ptr [ebp+edx-00000104], al //将过滤后掉-后的24个注册码->[ebp+edx-00000104]
:00409700 EB01 jmp 00409703

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004096F1(C), :004096F7(C)
|
:00409702 4A dec edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409700(U)
|
:00409703 41 inc ecx
:00409704 42 inc edx
:00409705 EBE2 jmp 004096E9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004096ED(C)
|
:00409707 80A415FCFEFFFF00 and byte ptr [ebp+edx-00000104], 00
:0040970F 53 push ebx
:00409710 56 push esi
:00409711 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]
:00409717 57 push edi
:00409718 50 push eax
:00409719 E812A20200 call 00433930
:0040971E 8BD0 mov edx, eax
:00409720 59 pop ecx
:00409721 81FA80000000 cmp edx, 00000080
:00409727 8955FC mov dword ptr [ebp-04], edx
:0040972A 0F8DC5000000 jnl 004097F5
:00409730 A170504800 mov eax, dword ptr [00485070]
:00409735 3BD0 cmp edx, eax
:00409737 0F8EB8000000 jle 004097F5
:0040973D 0FBEB405FBFEFFFF movsx esi, byte ptr [ebp+eax-00000105] //取注册码第5位
:00409745 83EE41 sub esi, 00000041 //让后-A(41HEX)->ESI
:00409748 33FF xor edi, edi
:0040974A 33C9 xor ecx, ecx
:0040974C 893578304900 mov dword ptr [00493078], esi
:00409752 85D2 test edx, edx
:00409754 894D08 mov dword ptr [ebp+08], ecx
:00409757 7E5D jle 004097B6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004097B4(C)
|
:00409759 80BC0DFCFEFFFF41 cmp byte ptr [ebp+ecx-00000104], 41 //注册码要在A-Z之间
:00409761 8D9C0DFCFEFFFF lea ebx, dword ptr [ebp+ecx-00000104]
:00409768 0F8C87000000 jl 004097F5
:0040976E 80BC3DFCFEFFFF5A cmp byte ptr [ebp+edi-00000104], 5A
:00409776 7F7D jg 004097F5
:00409778 8D50FF lea edx, dword ptr [eax-01]
:0040977B 3BCA cmp ecx, edx //是第5位的话不计算
:0040977D 7503 jne 00409782
:0040977F 4F dec edi
:00409780 EB2A jmp 004097AC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040977D(C)
|
:00409782 0FBE03 movsx eax, byte ptr [ebx] //取注册码
:00409785 50 push eax
:00409786 E8C5000000 call 00409850 //根据密码表算位数
:0040978B 2BC6 sub eax, esi //减去上个字母ASCII值与41的差->EAX
:0040978D 59 pop ecx
:0040978E 0FBE33 movsx esi, byte ptr [ebx] //当前字母ASCII值->ESI
:00409791 48 dec eax
:00409792 83EE41 sub esi, 00000041
:00409795 85C0 test eax, eax //小于0的话+1A
:00409797 7D03 jge 0040979C
:00409799 83C01A add eax, 0000001A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409797(C)
|
:0040979C 8B4D08 mov ecx, dword ptr [ebp+08]
:0040979F 0441 add al, 41 //AL+41->AL
:004097A1 88877C304900 mov byte ptr [edi+0049307C], al //把结果->[EDI+49307C]
:004097A7 A170504800 mov eax, dword ptr [00485070]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409780(U)
|
:004097AC 47 inc edi
:004097AD 41 inc ecx
:004097AE 3B4DFC cmp ecx, dword ptr [ebp-04]
:004097B1 894D08 mov dword ptr [ebp+08], ecx
:004097B4 7CA3 jl 00409759 //接着计算

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409757(C)
|
:004097B6 0FBEB77B304900 movsx esi, byte ptr [edi+0049307B]
:004097BD 83057830490041 add dword ptr [00493078], 00000041
:004097C4 80A77B30490000 and byte ptr [edi+0049307B], 00
:004097CB 8D877B304900 lea eax, dword ptr [edi+0049307B] //算得结果的最后一位->EAX
:004097D1 BF7C304900 mov edi, 0049307C
:004097D6 57 push edi
:004097D7 83EE41 sub esi, 00000041 //算得结果的最后一位ASCII值-41->ESI
:004097DA E81D000000 call 004097FC
:004097DF 3BF0 cmp esi, eax //算完后要和EAX值相同
:004097E1 59 pop ecx
:004097E2 7511 jne 004097F5 //不同就死了
:004097E4 0FBE057C304900 movsx eax, byte ptr [0049307C]
:004097EB 310578304900 xor dword ptr [00493078], eax
:004097F1 8BC7 mov eax, edi
:004097F3 EB02 jmp 004097F7

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040972A(C), :00409737(C), :00409768(C), :00409776(C), :004097E2(C)
|
:004097F5 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004097F3(U)
|
:004097F7 5F pop edi
:004097F8 5E pop esi
:004097F9 5B pop ebx
:004097FA C9 leave
:004097FB C3 ret
.
.
.
:004348F0 8B542404 mov edx, dword ptr [esp+04] //用你的名字算的数的地址->EDX
:004348F4 8B4C2408 mov ecx, dword ptr [esp+08] //用注册码算的名字的地址->ECX
:004348F8 F7C203000000 test edx, 00000003
:004348FE 753C jne 0043493C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043492C(C), :00434956(C), :00434972(U)
|
:00434900 8B02 mov eax, dword ptr [edx] //以下是计算相不相同
:00434902 3A01 cmp al, byte ptr [ecx]
:00434904 752E jne 00434934
:00434906 0AC0 or al, al
:00434908 7426 je 00434930
:0043490A 3A6101 cmp ah, byte ptr [ecx+01]
:0043490D 7525 jne 00434934
:0043490F 0AE4 or ah, ah
:00434911 741D je 00434930
:00434913 C1E810 shr eax, 10
:00434916 3A4102 cmp al, byte ptr [ecx+02]
:00434919 7519 jne 00434934
:0043491B 0AC0 or al, al
:0043491D 7411 je 00434930
:0043491F 3A6103 cmp ah, byte ptr [ecx+03]
:00434922 7510 jne 00434934
:00434924 83C104 add ecx, 00000004
:00434927 83C204 add edx, 00000004
:0043492A 0AE4 or ah, ah
:0043492C 75D2 jne 00434900
:0043492E 8BFF mov edi, edi //要都相同才行

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00434908(C), :00434911(C), :0043491D(C), :0043494E(C), :00434964(C)
|:0043496D(C)
|
:00434930 33C0 xor eax, eax
:00434932 C3 ret

计算方法：

第几位：1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A
密码表：X C F N A K S H I P Z U J L D O R G V Q T E W Y B M

ASCII ：514B4650574C444E465659484A494346 54 53 54 46 5A 42 54 45
与41差：10A 5 F 16B 3 D 5 15187 9 8 2 F 13 12 13 5 19 1 13
注册码：Q K F P W L D N F V Y H J I C F T S T F Z B T E

生成码：W O R D X C Z O M B I E Y S Z O M B I E Y S B
|___________|
|
无限制的世界范围授权 //前6位跟授权方式有关，也可能只有第5位有关是W才行

你的名字的生成码: Z O M B I E Y S Z O M B I E Y S B

计算公式：(注册码在密码表中的位置-1)-(上一位注册码ASCII值-41)-1+41=生成码
注：当生成码小于41时要+1A

当你输入NAME后你可以得到生成码的第7-22位，因为是无限制的世界范围授权所以前6位固定，而最后一位可以由从4097B6的计算确定所以很容易等到生成码，然后反推注册码。

这个玩艺确实不太好表达，自己跟踪一下就知道了。我的表达能力差,还可能有笔误，原谅我 哈哈.......

完活:)

这是我算的注册码：

名称：zombieys
授权类型：无限制的世界范围授权
代码：QKFP-WLDN-FVYH-JICF-TSTF-ZBTE

———————————————————————————————>
.-" "-. Cracked by zombieys >
/　　　　　　\ My oicq is 1789655 >
| | My hp is zombieys.yeah.net>
|, .-. .-. ,| My hp is zombieys.126.com >
|)(__/ \__)(| >
|/ /\ \| Thanks for your supports >
(@_@) (_ ^^ _) >
_ )\_______\__|IIIIII|__/_____ >
_)@8@8{}<________|-\IIIIII/-|____zombieys_____________________>


i-view32

标 题:i-view32注册码的破解手记 (778字)
发信人:长青
时 间:2001-2-3 23:33:42
详细信息:
i-view32注册码的破解手记

作者：李长青
地址：山东科技大学经管学院会计99-2
Email： sdsugar@263.net
今天乘胜追击，又破解了i-view32,虽然过程很简单，但希望大家和我这个初学者一块分享这份快乐（我脸皮真厚！）

步骤：
1、随便输入注册信息，我的是：
用户名：李长青 注册码：3434343434
2、启动TRW2000，ctrl+n载入内存,bpx hmemcpy万能中断，F5返回程序领域。
3、点击确定按钮，被TRW2000拦截到，BD *中断所有中断，F12共29次，然后F10到下面的
位置：
016F：00448C9A ADD ESP,BYTE +08 -------->D EDX。这里是正确的注册码
得到正确的注册码是：413969004
所以，
用户名：李长青
注册码：413969004
此外，还有另一组结果：
用户名：sugar
注册码：229176906

<---------完--------->


IAMixSetup: 1.34

标 题:IAMixSetup: 1.34 (701字)
发信人:1212
时 间:2001-1-24 11:37:18
详细信息:
Happy New Year!
IAMixSetup: 1.34
很专业的多媒体制作工具，内容非常丰富，既可用于录制（从CD或麦克风）声音，也可以用于MP3或RealAudio的制作，并且有多种混音频效果，是制作音效的好工具。

类型: 注册码
大致过程:

设断点:bpx hmemcpy
中断後,按几次F10,可找到存放输入的注册码的地址********.
设断点:bpx ********
第二次中断後,可找到计算注册码的过程(实际上是将输入的注册码转为十六进制)
可发现注册码形式为: mmmmmmm-nnnnnnn
软件判断注册码时分3步:
1.判断mmmmmmm和nnnnnnn转为十六进制後是否大于F4240(即十进制的1000000)
2.判断mmmmmmm转为十六进制後是否能除尽12794(即十进制的76148)
3.判断nnnnnnn转为十六进制後是否能除尽147BD(即十进制的83901)
若以上条件满足,呵呵..注册成功!
给一个注册码: 87570200-41950500


icnbat

 标 题:icnbat(图标打仗)破解实战 (12千字)
发信人:garfield cat
时 间:2000-9-12 15:13:46
详细信息:
非常好玩的游戏,图标打仗,闲来无事时玩玩吧.没注册时有时间限制,玩一小会儿不知什么时候就自动退出了,真讨厌.
此软件是日本人编的,台湾人汉化.
感谢JOJO
下载地址:http://hotop.on.net.cn/play/fun/ticnbat.zip
大小:180K

:00403FAC 8B4DF0 mov ecx, dword ptr [ebp-10]
:00403FAF E8DC000000 call 00404090 <==F10带过这句时,就出错误对话框了.
:00403FB4 85C0 test eax, eax
:00403FB6 740A je 00403FC2

进去看看……

:00404090 53 push ebx
:00404091 56 push esi
:00404092 57 push edi
:00404093 33F6 xor esi, esi
:00404095 8B7C2410 mov edi, dword ptr [esp+10]
:00404099 55 push ebp
:0040409A 8BCF mov ecx, edi
:0040409C 8B07 mov eax, dword ptr [edi] //将存放假密码的address放入EAX中
:0040409E 8B58F8 mov ebx, dword ptr [eax-08] //将假密码的字符个数放入EBX中
:004040A1 53 push ebx
:004040A2 E8A2320100 call 00417349
:004040A7 8BE8 mov ebp, eax
:004040A9 83FB0E cmp ebx, 0000000E //长度是否为14位
:004040AC 757E jne 0040412C
:004040AE 807D042D cmp byte ptr [ebp+04], 2D //第5位是否是 -
:004040B2 7578 jne 0040412C
:004040B4 807D092D cmp byte ptr [ebp+09], 2D //第10位是否是 -
:004040B8 7572 jne 0040412C //由此可见输入格式：xxxx-xxxx-xxxx
:004040BA C6450900 mov [ebp+09], 00 //把 - 消掉
:004040BE C6450400 mov [ebp+04], 00 //把 - 消掉
:004040C2 833DA470420001 cmp dword ptr [004270A4], 00000001
:004040C9 7E14 jle 004040DF //这句就跳了(起码我是这样)
:004040CB 0FBE450A movsx eax, byte ptr [ebp+0A]
:004040CF 6803010000 push 00000103
:004040D4 50 push eax
:004040D5 E8863A0000 call 00407B60
:004040DA 83C408 add esp, 00000008
:004040DD EB15 jmp 004040F4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004040C9(C)
|
:004040DF 0FBE4D0A movsx ecx, byte ptr [ebp+0A] //取第11位

* Possible StringData Ref from Data Obj ->" ((((( "
->" H"
|
:004040E3 8B15986E4200 mov edx, dword ptr [00426E98] //准备查表了([00426E98]=426ea2)
:004040E9 33C0 xor eax, eax
:004040EB 668B044A mov ax, word ptr [edx+2*ecx]
:004040EF 2503010000 and eax, 00000103 //作与运算

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004040DD(U)
|
:004040F4 85C0 test eax, eax //测试是否为零
:004040F6 7434 je 0040412C //不能跳啊!
:004040F8 55 push ebp
:004040F9 E8523A0000 call 00407B50 //测试第一组密码,换成16进制
:004040FE 83C404 add esp, 00000004
:00404101 85C0 test eax, eax
:00404103 7E27 jle 0040412C ***
:00404105 8D450B lea eax, dword ptr [ebp+0B]
:00404108 50 push eax
:00404109 E8423A0000 call 00407B50 //测试第三组密码,换成16进制(后三位)
:0040410E 83C404 add esp, 00000004
:00404111 85C0 test eax, eax
:00404113 7E17 jle 0040412C ***
:00404115 83C505 add ebp, 00000005
:00404118 55 push ebp
:00404119 E8323A0000 call 00407B50 //测试第组二密码,换成16进制
:0040411E 83C404 add esp, 00000004
:00404121 3B442418 cmp eax, dword ptr [esp+18] //测试第二组的16进制是否为EB9(3769)
:00404125 7505 jne 0040412C //关键的一跳
:00404127 BE01000000 mov esi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004040AC(C), :004040B2(C), :004040B8(C), :004040F6(C), :00404103(C)
|:00404113(C), :00404125(C)
|
:0040412C 53 push ebx
:0040412D 8BCF mov ecx, edi
:0040412F E86A320100 call 0041739E
:00404134 6AFF push FFFFFFFF
:00404136 83FE01 cmp esi, 00000001
:00404139 1BC0 sbb eax, eax
:0040413B 6A00 push 00000000
:0040413D 259C7F0000 and eax, 00007F9C
:00404142 83C06C add eax, 0000006C
:00404145 50 push eax
:00404146 E83D680100 call 0041A988
:0040414B 8BC6 mov eax, esi
:0040414D 5D pop ebp
:0040414E 5F pop edi
:0040414F 5E pop esi
:00404150 5B pop ebx
:00404151 C20800 ret 0008

测试一、二、三组密码CALL的关键处:

:00407AA0 53 push ebx
:00407AA1 56 push esi
:00407AA2 8B74240C mov esi, dword ptr [esp+0C]
:00407AA6 57 push edi
:00407AA7 55 push ebp
:00407AA8 BF01000000 mov edi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407ADE(U)
|
:00407AAD 393DA4704200 cmp dword ptr [004270A4], edi
:00407AB3 7E11 jle 00407AC6
:00407AB5 6A08 push 00000008
:00407AB7 33C0 xor eax, eax
:00407AB9 8A06 mov al, byte ptr [esi]
:00407ABB 50 push eax
:00407ABC E89F000000 call 00407B60
:00407AC1 83C408 add esp, 00000008
:00407AC4 EB13 jmp 00407AD9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407AB3(C)
|
:00407AC6 33D2 xor edx, edx

* Possible StringData Ref from Data Obj ->" ((((( "
->" H"
|
:00407AC8 8B0D986E4200 mov ecx, dword ptr [00426E98]
:00407ACE 8A16 mov dl, byte ptr [esi]
:00407AD0 33C0 xor eax, eax
:00407AD2 668B0451 mov ax, word ptr [ecx+2*edx] //ECX=426ea2
:00407AD6 83E008 and eax, 00000008 ***

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407AC4(U)
|
:00407AD9 85C0 test eax, eax
:00407ADB 7403 je 00407AE0
:00407ADD 46 inc esi
:00407ADE EBCD jmp 00407AAD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407ADB(C)
|
:00407AE0 33DB xor ebx, ebx
:00407AE2 8A1E mov bl, byte ptr [esi]
:00407AE4 46 inc esi
:00407AE5 8BFB mov edi, ebx
:00407AE7 83FB2D cmp ebx, 0000002D
:00407AEA 7405 je 00407AF1
:00407AEC 83FB2B cmp ebx, 0000002B
:00407AEF 7505 jne 00407AF6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407AEA(C)
|
:00407AF1 33DB xor ebx, ebx
:00407AF3 8A1E mov bl, byte ptr [esi]
:00407AF5 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407AEF(C)
|
:00407AF6 33ED xor ebp, ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407B2F(U)
|
:00407AF8 833DA470420001 cmp dword ptr [004270A4], 00000001
:00407AFF 7E0D jle 00407B0E
:00407B01 6A04 push 00000004
:00407B03 53 push ebx
:00407B04 E857000000 call 00407B60
:00407B09 83C408 add esp, 00000008
:00407B0C EB0F jmp 00407B1D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407AFF(C)
|

* Possible StringData Ref from Data Obj ->" ((((( "
->" H"
|
:00407B0E 8B0D986E4200 mov ecx, dword ptr [00426E98]
:00407B14 33C0 xor eax, eax
:00407B16 668B0459 mov ax, word ptr [ecx+2*ebx] //ECX=426ea2
:00407B1A 83E004 and eax, 00000004 ***

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407B0C(U)
|
:00407B1D 85C0 test eax, eax
:00407B1F 7410 je 00407B31
:00407B21 8D44AD00 lea eax, dword ptr [ebp+4*ebp] ********关键的计算
:00407B25 46 inc esi
:00407B26 8D6C43D0 lea ebp, dword ptr [ebx+2*eax-30]********关键的计算
:00407B2A 33DB xor ebx, ebx 循环后EBP为这组密码的16进制
:00407B2C 8A5EFF mov bl, byte ptr [esi-01]
:00407B2F EBC7 jmp 00407AF8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407B1F(C)
|
:00407B31 8BC5 mov eax, ebp
:00407B33 83FF2D cmp edi, 0000002D
:00407B36 7507 jne 00407B3F
:00407B38 F7D8 neg eax
:00407B3A 5D pop ebp
:00407B3B 5F pop edi
:00407B3C 5E pop esi
:00407B3D 5B pop ebx
:00407B3E C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407B36(C)
|
:00407B3F 5D pop ebp
:00407B40 5F pop edi
:00407B41 5E pop esi
:00407B42 5B pop ebx
:00407B43 C3 ret

表格：(查表所用到的)
426ea2 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00
426eb2 20 00 28 00 28 00 28 00 28 00 28 00 20 00 20 00
426ec2 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00
426ed2 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00
426ee2 48 00 10 00 10 00 10 00 10 00 10 00 10 00 10 00
426ef2 10 00 10 00 10 00 10 00 10 00 10 00 10 00 10 00
426f02 84 00 84 00 84 00 84 00 84 00 84 00 84 00 84 00
426f12 84 00 84 00 10 00 10 00 10 00 10 00 10 00 10 00
426f22 10 00 81 00 81 00 81 00 81 00 81 00 81 00 81 00
426f32 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00
426f42 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00
426f52 01 00 01 00 01 00 10 00 10 00 10 00 10 00 10 00
426f62 10 00 82 00 82 00 82 00 82 00 82 00 82 00 82 00
426f72 02 00 02 00 02 00 02 00 02 00 02 00 02 00 02 00
426f82 02 00 02 00 02 00 02 00 02 00 02 00 02 00 02 00
426f92 02 00 02 00 02 00 10 00 10 00 10 00 10 00 20 00

大家可以看出来了,和103H作与运算结果不为零的有81,01,82,02. 那么地址就是426f24,426f26,426f28,426f2a,426f2c,426f2e,426f30,426f32,426f34,426f36,426f38,426f3a,426f3c,
426f3e,426f40,426f42,426f44,426f46,426f48,426f4a,426f4c,426f4e,426f50,426f52,426f54,426f56,
426f64,426f66,426f68,426f6a,426f6c,426f6e,426f70,426f72,426f74,426f76,426f78,426f7a,426f7c,
426f7e,426f80,426f82,426f84,426f86,426f88,426f8a,426f8c,426f8e,426f90,426f92,426f94,426f96

x为地址:(x-426ea2)/2 可算出字符的16进制形式,得到可以输入A-Z a-z

和8H作与不为零的有48,28 地址为426ef2,426eb4,426eb6,426eb8,426eba,426ebc
算出得到28,09,0a,0b,0c,0d
和4H作与不为零的有84 地址为426f02,426f04,426f06,426f08,426f0a,426f0c,426f0e,426f10,426f12,426f14
算出得到可以输入的字符是0-9

算法总结:

XXXX-XXXX-XXXX
|||| |
\ / |
|| |
|| \
|| ------必须为A-Z a-z中的任意一个
||
||
这个必须为3769

第一组密码:第一位必须为阿拉伯数字,后面的随便
第二组密码:必须为3769
第三组密码:第一位必须为英文字母,第二位必须为阿拉伯数字,后面的随便

注册后在注册表中新建了一个主键:
HKEY_CURRENT_USER\Software\Masato\IcnBat

如有错误请各位指出,谢谢 . EMAIL:CL517@YEAH.NET

garfield cat


ICONSCAN 2.4

 标 题:《ICONSCAN 2.4》注册码破解 高手莫入！ (3千字)
发信人:RATARICE[BCG]
时 间:2001-5-6 22:24:08
详细信息:
《ICONSCAN 2.4》注册码破解
目标：ICONSCAN 2.4
这是一个用来抓取程式档案中小图示的程序，使用者可以将喜欢的程序图示存成档案，是一个非常好用 的小工具，抓出来的图可应用在网页上的制作，强烈推荐。
作者：RATARICE[BCG]（刚刚申请成功，做点小贡献）
工具：TRW2000 1.22 ，W32DSM89 ，ULTRAEDIT-32
过程：
一、 运行软件，点HELP--->REGISTER；
填上 name:RATARICE[BCG]
key:87654321 （当然是瞎填的！）
点“OK”，显示“invalid registration information.”记下它。
二、 运行W32DSM89，反汇编它。找到上面的话。
代码如下：

:0044E1C2 8B55F0 mov edx, dword ptr [ebp-10]
:0044E1C5 8BC6 mov eax, esi
:0044E1C7 E87407FDFF call 0041E940
:0044E1CC 8D55F0 lea edx, dword ptr [ebp-10]
:0044E1CF 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:0044E1D5 E83607FDFF call 0041E910
:0044E1DA 837DF000 cmp dword ptr [ebp-10], 00000000
:0044E1DE 7512 jne 0044E1F2 ------------------------>跳转。
:0044E1E0 E8BBFEFFFF call 0044E0A0 ----------------------->出错框，但上面跳转了。
:0044E1E5 33C0 xor eax, eax
:0044E1E7 898350010000 mov dword ptr [ebx+00000150], eax
:0044E1ED E905010000 jmp 0044E2F7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044E1DE(C)
|
:0044E1F2 8D55F0 lea edx, dword ptr [ebp-10]
:0044E1F5 8B83F0010000 mov eax, dword ptr [ebx+000001F0]
:0044E1FB E81007FDFF call 0041E910
:0044E200 8B45F0 mov eax, dword ptr [ebp-10]
:0044E203 50 push eax --------------------------->这里入栈，下面的call有
:0044E204 8D55E8 lea edx, dword ptr [ebp-18] 有问题。
:0044E207 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:0044E20D E8FE06FDFF call 0041E910 ---------------------->计算注册码。
:0044E212 8B55E8 mov edx, dword ptr [ebp-18] -------->打d edx 可看到真注册码。
:0044E215 58 pop eax ---------------------------->可疑的eax。向上找入栈。
:0044E216 E8655AFBFF call 00403C80
:0044E21B 0F85B6000000 jne 0044E2D7 ----------------------->跳则出错。不跳则成功，但
:0044E221 8D55F0 lea edx, dword ptr [ebp-10] 重新运行还要注册，向上找
:0044E224 8B83F4010000 mov eax, dword ptr [ebx+000001F4] 注册码。
:0044E22A E8E106FDFF call 0041E910
:0044E22F 8B45F0 mov eax, dword ptr [ebp-10]
:0044E232 50 push eax
.
.
.

.
.
.

:0044E2C2 668B0D90E34400 mov cx, word ptr [0044E390]
:0044E2C9 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Valid registration information.

Thank "
->"you for registering."
|
:0044E2CB B89CE34400 mov eax, 0044E39C
:0044E2D0 E8A7BEFEFF call 0043A17C
:0044E2D5 EB18 jmp 0044E2EF
小结：
一、 可以用TRW和W32DSM89联合起来分析，效果更佳。
二、 name:RATARICE[BCG]
key:IfE21649550726


IconToy 3.1

标 题:IconToy 3.1 注册码快速破解 (11千字)
发信人:Blowfish
时 间:2001-3-2 13:05:01
详细信息:
http://www.lighttek.com/

1、先用W32Dasm的string reference功能找到判断的地方：

:00485F9B A104E94800 mov eax, dword ptr [0048E904] //输入的假注册码
:00485FA0 E8B3FCFFFF call 00485C58 //判断注册码
:00485FA5 803D00E9480001 cmp byte ptr [0048E900], 01 //标志位
:00485FAC 0F85C4000000 jne 00486076 //为0则注册码错误
:00485FB2 8D55F8 lea edx, dword ptr [ebp-08]
:00485FB5 8B45FC mov eax, dword ptr [ebp-04]
:00485FB8 8B800C030000 mov eax, dword ptr [eax+0000030C]
:00485FBE E84955FAFF call 0042B50C
:00485FC3 8B55F8 mov edx, dword ptr [ebp-08]
:00485FC6 B808E94800 mov eax, 0048E908
:00485FCB E88CDBF7FF call 00403B5C
:00485FD0 B201 mov dl, 01
:00485FD2 A130E54500 mov eax, dword ptr [0045E530]
:00485FD7 E80087FDFF call 0045E6DC
:00485FDC 8BD8 mov ebx, eax
:00485FDE B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\software\lighttek\icontoy"
|
:00485FE0 BAB4604800 mov edx, 004860B4
:00485FE5 8BC3 mov eax, ebx
:00485FE7 E8E488FDFF call 0045E8D0
:00485FEC DB0504E94800 fild dword ptr [0048E904]
:00485FF2 D835D0604800 fdiv dword ptr [004860D0]
:00485FF8 E887CAF7FF call 00402A84
:00485FFD 52 push edx
:00485FFE 50 push eax
:00485FFF 8D45F4 lea eax, dword ptr [ebp-0C]
:00486002 E8AD24F8FF call 004084B4
:00486007 8B4DF4 mov ecx, dword ptr [ebp-0C]
:0048600A BADC604800 mov edx, 004860DC
:0048600F 8BC3 mov eax, ebx
:00486011 E8568AFDFF call 0045EA6C
:00486016 8B0D08E94800 mov ecx, dword ptr [0048E908]
:0048601C BAE8604800 mov edx, 004860E8
:00486021 8BC3 mov eax, ebx
:00486023 E8448AFDFF call 0045EA6C
:00486028 8BC3 mov eax, ebx
:0048602A E81587FDFF call 0045E744
:0048602F 8BC3 mov eax, ebx
:00486031 E802CFF7FF call 00402F38

* Possible StringData Ref from Code Obj ->"You are registered! Thank you."
|
:00486036 B8F4604800 mov eax, 004860F4
:0048603B E84080FCFF call 0044E080
:00486040 8D45F4 lea eax, dword ptr [ebp-0C]
:00486043 8B0D08E94800 mov ecx, dword ptr [0048E908]

* Possible StringData Ref from Code Obj ->"Registered for: "
|
:00486049 BA1C614800 mov edx, 0048611C
:0048604E E87DDDF7FF call 00403DD0
:00486053 8B55F4 mov edx, dword ptr [ebp-0C]
:00486056 A1FCE84800 mov eax, dword ptr [0048E8FC]
:0048605B 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00486061 E8D654FAFF call 0042B53C
:00486066 A180D24800 mov eax, dword ptr [0048D280]
:0048606B 8B00 mov eax, dword ptr [eax]
:0048606D B201 mov dl, 01
:0048606F 8B08 mov ecx, dword ptr [eax]
:00486071 FF5160 call [ecx+60]
:00486074 EB0A jmp 00486080

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00485FAC(C)
|

* Possible StringData Ref from Code Obj ->"Registration key error!"
|
:00486076 B838614800 mov eax, 00486138
:0048607B E80080FCFF call 0044E080

2、跟进call 00485C58，看见大堆hard-coded serial：

* Referenced by a CALL at Addresses:
|:00485FA0 , :00486233
|
:00485C58 55 push ebp
:00485C59 8BEC mov ebp, esp
:00485C5B 6A00 push 00000000
:00485C5D 33D2 xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00485BF0(C)
|
:00485C5F 55 push ebp
:00485C60 68CD5E4800 push 00485ECD
:00485C65 64FF32 push dword ptr fs:[edx]
:00485C68 648922 mov dword ptr fs:[edx], esp
:00485C6B 3D8CA6BA00 cmp eax, 00BAA68C
:00485C70 0F84B9010000 je 00485E2F
:00485C76 3D6A5A1300 cmp eax, 00135A6A
:00485C7B 0F84AE010000 je 00485E2F
:00485C81 3DE0621300 cmp eax, 001362E0
:00485C86 0F84A3010000 je 00485E2F
:00485C8C 3D76281300 cmp eax, 00132876
:00485C91 0F8498010000 je 00485E2F
:00485C97 3DAEED3100 cmp eax, 0031EDAE
:00485C9C 0F848D010000 je 00485E2F
:00485CA2 3DC6E93100 cmp eax, 0031E9C6
:00485CA7 0F8482010000 je 00485E2F
:00485CAD 3DA8D81200 cmp eax, 0012D8A8
:00485CB2 0F8477010000 je 00485E2F
:00485CB8 3D267F1300 cmp eax, 00137F26
:00485CBD 0F846C010000 je 00485E2F
:00485CC3 3DB6B7B800 cmp eax, 00B8B7B6
:00485CC8 0F8461010000 je 00485E2F
:00485CCE 3DAE7A1200 cmp eax, 00127AAE
:00485CD3 0F8456010000 je 00485E2F
:00485CD9 3DA2D21200 cmp eax, 0012D2A2
:00485CDE 0F844B010000 je 00485E2F
:00485CE4 3D2AFAB900 cmp eax, 00B9FA2A
:00485CE9 0F8440010000 je 00485E2F
:00485CEF 3D36F8B900 cmp eax, 00B9F836
:00485CF4 0F8435010000 je 00485E2F
:00485CFA 3D0810C100 cmp eax, 00C11008
:00485CFF 0F842A010000 je 00485E2F
:00485D05 3D8630BA00 cmp eax, 00BA3086
:00485D0A 0F841F010000 je 00485E2F
:00485D10 3D78DB5B04 cmp eax, 045BDB78
:00485D15 0F8414010000 je 00485E2F
:00485D1B 3DD8D81400 cmp eax, 0014D8D8
:00485D20 0F8409010000 je 00485E2F
:00485D26 3D0C541400 cmp eax, 0014540C
:00485D2B 0F84FE000000 je 00485E2F
:00485D31 3D1A431500 cmp eax, 0015431A
:00485D36 0F84F3000000 je 00485E2F
:00485D3C 3D2AF61400 cmp eax, 0014F62A
:00485D41 0F84E8000000 je 00485E2F
:00485D47 3D825C1400 cmp eax, 00145C82
:00485D4C 0F84DD000000 je 00485E2F
:00485D52 3D9CF0C900 cmp eax, 00C9F09C
:00485D57 0F84D2000000 je 00485E2F
:00485D5D 3D5081DC07 cmp eax, 07DC8150
:00485D62 0F84C7000000 je 00485E2F
:00485D68 3D246DCA00 cmp eax, 00CA6D24
:00485D6D 0F84BC000000 je 00485E2F
:00485D73 3D8CA6BA00 cmp eax, 00BAA68C
:00485D78 0F84B1000000 je 00485E2F
:00485D7E 3D4A232400 cmp eax, 0024234A
:00485D83 0F84A6000000 je 00485E2F
:00485D89 3DC02B2400 cmp eax, 00242BC0
:00485D8E 0F849B000000 je 00485E2F
:00485D94 3D56F12300 cmp eax, 0023F156
:00485D99 0F8490000000 je 00485E2F
:00485D9F 3D0E322400 cmp eax, 0024320E
:00485DA4 0F8485000000 je 00485E2F
:00485DAA 3D262E2400 cmp eax, 00242E26
:00485DAF 747E je 00485E2F
:00485DB1 3D88A12300 cmp eax, 0023A188
:00485DB6 7477 je 00485E2F
:00485DB8 3DA6CE2500 cmp eax, 0025CEA6
:00485DBD 7470 je 00485E2F
:00485DBF 3DB6D26F01 cmp eax, 016FD2B6
:00485DC4 7469 je 00485E2F
:00485DC6 3D2ECA2400 cmp eax, 0024CA2E
:00485DCB 7462 je 00485E2F
:00485DCD 3D22222500 cmp eax, 00252222
:00485DD2 745B je 00485E2F
:00485DD4 3D2A157101 cmp eax, 0171152A
:00485DD9 7454 je 00485E2F
:00485DDB 3D36137101 cmp eax, 01711336
:00485DE0 744D je 00485E2F
:00485DE2 3D88D38A02 cmp eax, 028AD388
:00485DE7 7446 je 00485E2F
:00485DE9 3D864B7101 cmp eax, 01714B86
:00485DEE 743F je 00485E2F
:00485DF0 3D382D7001 cmp eax, 01702D38
:00485DF5 7438 je 00485E2F
:00485DF7 3DB8A12500 cmp eax, 0025A1B8
:00485DFC 7431 je 00485E2F
:00485DFE 3DDCF52400 cmp eax, 0024F5DC
:00485E03 742A je 00485E2F
:00485E05 3DFA0B2600 cmp eax, 00260BFA
:00485E0A 7423 je 00485E2F
:00485E0C 3DAA452700 cmp eax, 002745AA
:00485E11 741C je 00485E2F
:00485E13 3D02AC2600 cmp eax, 0026AC02
:00485E18 7415 je 00485E2F
:00485E1A 3D9C0B8101 cmp eax, 01810B9C
:00485E1F 740E je 00485E2F
:00485E21 3DD0128B01 cmp eax, 018B12D0
:00485E26 7407 je 00485E2F
:00485E28 3D24888101 cmp eax, 01818824
:00485E2D 757C jne 00485EAB

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00485C70(C), :00485C7B(C), :00485C86(C), :00485C91(C), :00485C9C(C)
|:00485CA7(C), :00485CB2(C), :00485CBD(C), :00485CC8(C), :00485CD3(C)
|:00485CDE(C), :00485CE9(C), :00485CF4(C), :00485CFF(C), :00485D0A(C)
|:00485D15(C), :00485D20(C), :00485D2B(C), :00485D36(C), :00485D41(C)
|:00485D4C(C), :00485D57(C), :00485D62(C), :00485D6D(C), :00485D78(C)
|:00485D83(C), :00485D8E(C), :00485D99(C), :00485DA4(C), :00485DAF(C)
|:00485DB6(C), :00485DBD(C), :00485DC4(C), :00485DCB(C), :00485DD2(C)
|:00485DD9(C), :00485DE0(C), :00485DE7(C), :00485DEE(C), :00485DF5(C)
|:00485DFC(C), :00485E03(C), :00485E0A(C), :00485E11(C), :00485E18(C)
|:00485E1F(C), :00485E26(C)
|
:00485E2F C60500E9480001 mov byte ptr [0048E900], 01　　　　　//标志位
:00485E36 A1FCE84800 mov eax, dword ptr [0048E8FC]
:00485E3B 8B80D0020000 mov eax, dword ptr [eax+000002D0]
:00485E41 33D2 xor edx, edx
:00485E43 E818C0FCFF call 00451E60
:00485E48 A1FCE84800 mov eax, dword ptr [0048E8FC]
:00485E4D 8B90CC020000 mov edx, dword ptr [eax+000002CC]
:00485E53 A1FCE84800 mov eax, dword ptr [0048E8FC]
:00485E58 8B80C8020000 mov eax, dword ptr [eax+000002C8]
:00485E5E E8E5C6FCFF call 00452548
:00485E63 8D45FC lea eax, dword ptr [ebp-04]
:00485E66 8B0D08E94800 mov ecx, dword ptr [0048E908]

* Possible StringData Ref from Code Obj ->"Registered for: "
|
:00485E6C BAE05E4800 mov edx, 00485EE0
:00485E71 E85ADFF7FF call 00403DD0
:00485E76 8B55FC mov edx, dword ptr [ebp-04]
:00485E79 A1FCE84800 mov eax, dword ptr [0048E8FC]
:00485E7E 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00485E84 E8B356FAFF call 0042B53C
:00485E89 A180D24800 mov eax, dword ptr [0048D280]
:00485E8E 8B00 mov eax, dword ptr [eax]
:00485E90 8B80D8030000 mov eax, dword ptr [eax+000003D8]
:00485E96 33D2 xor edx, edx
:00485E98 E88755FAFF call 0042B424
:00485E9D A180D24800 mov eax, dword ptr [0048D280]
:00485EA2 8B00 mov eax, dword ptr [eax]
:00485EA4 33D2 xor edx, edx
:00485EA6 89500C mov dword ptr [eax+0C], edx
:00485EA9 EB0C jmp 00485EB7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00485E2D(C)
|
:00485EAB C60500E9480000 mov byte ptr [0048E900], 00 //标志位

三分钟搞定。新手不妨抓来玩玩

BF


Icontoy3.1

标 题:Icontoy3.1破解纪录（上） (5千字)
发信人:破！
时 间:2000-12-29 15:26:45
详细信息:
Icontoy3.1破解纪录(上)
大家好！我又回来了，这次给大家带来的教程是关于一个图标软件的，破解的过程中遇到了一点小挫折，当然，经过这次小挫折，自己又有了一点收获，所谓功力就是这样培养起来的，感觉也就是这样培养起来的吗！所以，对广大的初学者，我还是非常希望大家能自己多动手破破手头能找的到的软件，有些事情光看别人的教程是不能深刻理解的，自己动动手，效果就会好得多。好了，废话到此为止，READY？GO！
1.当然架起TRW2000，LOAD"ICONTOY.EXE",调出输入注册妈的窗口,随便输入一点信息.下面是我的输入,你完 全不必要和我的一样.
Registration name: luoyi
Registration code: 654321
2.CTRL+M切入TRW2000,干什么?下中断呀!先碰碰运气,就用"GETWINDOWTEXT"吧!在TRW2000的命令输入处输入
"G GETWINDOWTEXT"回车!好了,我们又回到程序界面中了.回车,马上,程序被"GETWINDOWTEXT"中断拦了下来.
接下来,就按照我上篇文章中说的,按F12了,看按多少次出现错误提示.按呀按呀,按呀按呀.呵呵....其实没
这么多,对这个程序来说,6次就走到头了--------"Registration key error"!
3.再来吧.重新填好信息,下好断点,拦住后,按6-1=5次F12,在TRW2000的代码窗口中,你能看到如下的代码:
015F:0044DFE8 E82FFAFFFF CALL 0044DA1C
015F:0044DFED 8945F4 MOV [EBP-0C],EAX <----------你停在这里!
015F:0044DFF0 33C0 XOR EAX,EAX
015F:0044DFF2 55 PUSH EBP
015F:0044DFF3 686CE04400 PUSH DWORD 0044E06C
015F:0044DFF8 64FF30 PUSH DWORD [FS:EAX]
...
...
015F:0044E015 E8425BFBFF CALL 00403B5C
015F:0044E01A 85DB TEST EBX,EBX
015F:0044E01C 7C0A JL 0044E028
015F:0044E01E 8BD3 MOV EDX,EBX
015F:0044E020 8B45F4 MOV EAX,[EBP-0C]
015F:0044E023 E8C8CCFDFF CALL 0042ACF0
015F:0044E028 85F6 TEST ESI,ESI
015F:0044E02A 7C0A JL 0044E036
015F:0044E02C 8BD6 MOV EDX,ESI
015F:0044E02E 8B45F4 MOV EAX,[EBP-0C]
015F:0044E031 E8DECCFDFF CALL 0042AD14
015F:0044E036 85F6 TEST ESI,ESI
015F:0044E038 7D0E JNL 0044E048
015F:0044E03A 85DB TEST EBX,EBX
015F:0044E03C 7D0A JNL 0044E048
015F:0044E03E B204 MOV DL,04
015F:0044E040 8B45F4 MOV EAX,[EBP-0C]
015F:0044E043 E8CC48FFFF CALL 00442914
015F:0044E048 8B45F4 MOV EAX,[EBP-0C]
015F:0044E04B 8B10 MOV EDX,[EAX]
015F:0044E04D FF92CC000000 CALL NEAR [EDX+CC] <--------这个CALL就是呼出错误时
... 的MESSAGEBOX的CALL!
...
015F:0044E066 E8CD4EFBFF CALL 00402F38
015F:0044E06B C3 RET
4.出错的地方找到了,下面就是往上看,看在哪儿可以有个有条件跳转(JZ/JNA/JA/JB..)可以绕过它的.可是..
很可惜,虽然上面有很多个TEST...,JZ/JNZ...可是分析来,分析去就是没有一个可以跳过出错的CALL的.怎
么办呢?我开始在这里也被困住了,(我也是名新手呀,经验非常不足,请各位大虾不要见笑.呵呵...)怎么才能
绕过去呢?想呀,想呀,想呀,想呀,终于想到了!我所在的子程序本身就是一个错误时执行的程序!我要绕过它,
只有到它的上层去找,在这里打转是转不出来的!想到了就干!F12几次(不要问我是多少次,出来一次,就往
上看看,看有没有有条件跳转可以跳过去的....)经过多次试验,我来到了下面这段代码:
015F:00485E8F A104E94800 MOV EAX,[0048E904]
015F:00485E94 E8BFFDFFFF CALL 00485C58 <--------明白了吧?这就是判断注册码正确
与否的CALL!
015F:00485E99 803D00E9480001 CMP BYTE [0048E900],01
015F:00485EA0 0F85C4000000 JNZ NEAR 00485F6A <--------注册码错误的时候就跳了!跳到-|
015F:00485EA6 8D55F8 LEA EDX,[EBP-08] |
........ <-----这中间都没有跳转语句, |
........ 就省略了. |
|
015F:00485F61 B201 MOV DL,01 |
015F:00485F63 8B08 MOV ECX,[EAX] |
015F:00485F65 FF5160 CALL NEAR [ECX+60] |
015F:00485F68 EB0A JMP SHORT 00485F74 <-----正确的时候就跳过出错的 |
MESSAGEBOX了! |
|
015F:00485F6A B82C604800 MOV EAX,0048602C <------这里来了!----------------------|
015F:00485F6F E80C81FCFF CALL 0044E080 <-------这就是困住我的那个CALL!
015F:00485F74 33C0 XOR EAX,EAX <-------我从这里出来了.
015F:00485F76 5A POP EDX
015F:00485F77 59 POP ECX
015F:00485F78 59 POP ECX
015F:00485F79 648910 MOV [FS:EAX],EDX
015F:00485F7C 68995F4800 PUSH DWORD 00485F99
015F:00485F81 8D45F4 LEA EAX,[EBP-0C]
015F:00485F84 E87FDBF7FF CALL 00403B08
015F:00485F89 8D45F8 LEA EAX,[EBP-08]
015F:00485F8C E877DBF7FF CALL 00403B08
015F:00485F91 C3 RET
怎么样?看明白我的注释了吧?好了,找到关键之处了!也算成功了一半吧?呵呵..先烤烤火,我的手都僵了,呵呵........
标 题:Icontoy3.1破解纪录(下) (7千字)
发信人:破！
时 间:2000-12-29 15:29:04
详细信息:
Icontoy3.1破解纪录(下)
接着来吧!看看如果注册码正确,有什么现象发生?
跳与不跳的比较语句是:
015F:00485E99 803D00E9480001 CMP BYTE [0048E900],01
015F:00485EA0 0F85C4000000 JNZ NEAR 00485F6A
哦!原来,只要0048E900处的值等于1就行了!那程序是在哪里让其值变化的呢?当然就是在判断注册码正确与否的的关键CALL里了!好,让我们进到判断注册码正确与否的的关键CALL里(用F8!),你就看到:
015F:00485C58 55 PUSH EBP
015F:00485C59 8BEC MOV EBP,ESP
015F:00485C5B 6A00 PUSH BYTE +00
015F:00485C5D 33D2 XOR EDX,EDX
015F:00485C5F 55 PUSH EBP
015F:00485C60 68C05D4800 PUSH DWORD 00485DC0
015F:00485C65 64FF32 PUSH DWORD [FS:EDX]
015F:00485C68 648922 MOV [FS:EDX],ESP
015F:00485C6B 3D7CACEB01 CMP EAX,01EBAC7C <---------------------------------------|
015F:00485C70 0F84B1000000 JZ NEAR 00485D27 这一大堆的CMP是什么意思呢? |
015F:00485C76 3D52821C00 CMP EAX,001C8252 D EAX,什么也没有. 555555 |
015F:00485C7B 0F84A6000000 JZ NEAR 00485D27 ? EAX呢?哈哈............. |
015F:00485C81 3D8C7E1900 CMP EAX,00197E8C DEC=654321!这不就是明摆的事 |
015F:00485C86 0F849B000000 JZ NEAR 00485D27 了吗? |
015F:00485C8C 3DBE431900 CMP EAX,001943BE 我笑!哈哈哈......... |
015F:00485C91 0F8490000000 JZ NEAR 00485D27 |
015F:00485C97 3D0A153B00 CMP EAX,003B150A 随便找一个CMP,"?" 吧!我选的是 |
015F:00485C9C 0F8485000000 JZ NEAR 00485D27 ? 1EBAC7C 结果为: |
015F:00485CA2 3D56193B00 CMP EAX,003B1956 DEC=32222332,呵呵... |
015F:00485CA7 747E JZ 00485D27 |
015F:00485CA9 3DF0183F00 CMP EAX,003F18F0 |
015F:00485CAE 7477 JZ 00485D27 |
015F:00485CB0 3D26E92B00 CMP EAX,002BE926 |
015F:00485CB5 7470 JZ 00485D27 |
015F:00485CB7 3D5636DF01 CMP EAX,01DF3656 |
015F:00485CBC 7469 JZ 00485D27 |
015F:00485CBE 3D3A362000 CMP EAX,0020363A |
015F:00485CC3 7462 JZ 00485D27 |
015F:00485CC5 3D823A4800 CMP EAX,00483A82 |
015F:00485CCA 745B JZ 00485D27 |
015F:00485CCC 3D027AE905 CMP EAX,05E97A02 |
015F:00485CD1 7454 JZ 00485D27 |
015F:00485CD3 3DC2579700 CMP EAX,009757C2 |
015F:00485CD8 744D JZ 00485D27 |
015F:00485CDA 3D12BF8500 CMP EAX,0085BF12 |
015F:00485CDF 7446 JZ 00485D27 |
015F:00485CE1 3D16C07200 CMP EAX,0072C016 |
015F:00485CE6 743F JZ 00485D27 |
015F:00485CE8 3DA8387800 CMP EAX,007838A8 |
015F:00485CED 7438 JZ 00485D27 |
015F:00485CEF 3DCA129800 CMP EAX,009812CA |
015F:00485CF4 7431 JZ 00485D27 |
015F:00485CF6 3D50A42F00 CMP EAX,002FA450 |
015F:00485CFB 742A JZ 00485D27 |
015F:00485CFD 3D8EC55000 CMP EAX,0050C58E |
015F:00485D02 7423 JZ 00485D27 |
015F:00485D04 3DD2229500 CMP EAX,009522D2 |
015F:00485D09 741C JZ 00485D27 |
015F:00485D0B 3DA6841D00 CMP EAX,001D84A6 |
015F:00485D10 7415 JZ 00485D27 |
015F:00485D12 3DD81DFB01 CMP EAX,01FB1DD8 |
015F:00485D17 740E JZ 00485D27 |
015F:00485D19 3DB473B500 CMP EAX,00B573B4 |
015F:00485D1E 7407 JZ 00485D27 |
015F:00485D20 3DBCE4AB00 CMP EAX,00ABE4BC <-----如果EAX还不正确的话,就..嘿嘿.... |
015F:00485D25 757C JNZ 00485DA3 <--------------------------------------|

015F:00485D27 C60500E9480001 MOV BYTE [0048E900],01 <-------这里就是注册成功的标志!

015F:00485D2E A1FCE84800 MOV EAX,[0048E8FC]
015F:00485D33 8B80D0020000 MOV EAX,[EAX+02D0]
015F:00485D39 33D2 XOR EDX,EDX
015F:00485D3B E820C1FCFF CALL 00451E60
015F:00485D40 A1FCE84800 MOV EAX,[0048E8FC]
015F:00485D45 8B90CC020000 MOV EDX,[EAX+02CC]
015F:00485D4B A1FCE84800 MOV EAX,[0048E8FC]
015F:00485D50 8B80C8020000 MOV EAX,[EAX+02C8]
015F:00485D56 E8EDC7FCFF CALL 00452548
015F:00485D5B 8D45FC LEA EAX,[EBP-04]
015F:00485D5E 8B0D08E94800 MOV ECX,[0048E908]
015F:00485D64 BAD45D4800 MOV EDX,00485DD4
015F:00485D69 E862E0F7FF CALL 00403DD0
015F:00485D6E 8B55FC MOV EDX,[EBP-04]
015F:00485D71 A1FCE84800 MOV EAX,[0048E8FC]
015F:00485D76 8B80E8020000 MOV EAX,[EAX+02E8]
015F:00485D7C E8BB57FAFF CALL 0042B53C
015F:00485D81 A180D24800 MOV EAX,[0048D280]
015F:00485D86 8B00 MOV EAX,[EAX]
015F:00485D88 8B80D8030000 MOV EAX,[EAX+03D8]
015F:00485D8E 33D2 XOR EDX,EDX
015F:00485D90 E88F56FAFF CALL 0042B424
015F:00485D95 A180D24800 MOV EAX,[0048D280]
015F:00485D9A 8B00 MOV EAX,[EAX]
015F:00485D9C 33D2 XOR EDX,EDX
015F:00485D9E 89500C MOV [EAX+0C],EDX
015F:00485DA1 EB07 JMP SHORT 00485DAA <--------正确的时候就跳过去了!

015F:00485DA3 C60500E9480000 MOV BYTE [0048E900],00 <--------呵呵..不用我多说了吧?
015F:00485DAA 33C0 XOR EAX,EAX
015F:00485DAC 5A POP EDX
015F:00485DAD 59 POP ECX
015F:00485DAE 59 POP ECX
015F:00485DAF 648910 MOV [FS:EAX],EDX
015F:00485DB2 68C75D4800 PUSH DWORD 00485DC7
015F:00485DB7 8D45FC LEA EAX,[EBP-04]
015F:00485DBA E849DDF7FF CALL 00403B08
015F:00485DBF C3 RET
呵呵...看到这里,注册这种小事对于你来说应该就是:A PIECE OF CAKE了吧?
另外再说两句,注册成功后,程序会在注册表中新建如下两个键,删掉后,程序又成为未注册版了(你又可以练习了,多好的事啊!呵呵....)
HKEY_CURRENT_USER\SOFTWARE\LIGHTTEK\ICONTOY\01 注册名
HKEY_CURRENT_USER\SOFTWARE\LIGHTTEK\ICONTOY\02 加密后的注册码(我才是这样的,因为它什么都不象)
完成!收工!好累呀.........如果这篇教程能给大家哪怕是一丁点的帮助的话,我也就非常高兴了!
请多指教!


Internet Maniac ver 1.2b

 标 题:Internet Maniac ver 1.2b 破解过程（适合初学者） (7千字)
发信人:程式猎人
时 间:2000-9-13 0:29:33
详细信息:
Internet Maniac ver 1.2b Released: Sept.15, 1999
简介：
追踪：name:dahuilang
RN:01234567
今天应网友的要求，破解这个软件。现在我也是很少再破解软件了。毕竟没有时间了，所以今天拿来这个软件破解时感觉它不是很难，破解以后发现它的确不难。破解过程如下：使用bpx hmemcpy后拦下来
* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:00405183 8B3DE8114100 mov edi, dword ptr [004111E8]
:00405189 8D442448 lea eax, dword ptr [esp+48]
:0040518D 6800010000 push 00000100
:00405192 50 push eax

* Possible Reference to Dialog: DialogID_007C, CONTROL_ID:044A, ""
|
:00405193 684A040000 push 0000044A
:00405198 56 push esi
:00405199 FFD7 call edi
:0040519B 8D4C2408 lea ecx, dword ptr [esp+08] <-从系统出来
:0040519F 6800010000 push 00000100
:004051A4 51 push ecx

* Possible Reference to Dialog: DialogID_007C, CONTROL_ID:0449, ""
|
:004051A5 6849040000 push 00000449
:004051AA 56 push esi
:004051AB FFD7 call edi
:004051AD 8D542448 lea edx, dword ptr [esp+48]
:004051B1 8D442408 lea eax, dword ptr [esp+08]
:004051B5 52 push edx
:004051B6 50 push eax
:004051B7 E8142E0000 call 00407FD0
:004051BC 83C408 add esp, 00000008
:004051BF 85C0 test eax, eax
:004051C1 744A je 0040520D

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:02E5h
|
:004051C3 8B3D28104100 mov edi, dword ptr [00411028]
:004051C9 8D4C2408 lea ecx, dword ptr [esp+08]
:004051CD 68A0004300 push 004300A0
:004051D2 51 push ecx

* Possible StringData Ref from Data Obj ->"User Name"
|
:004051D3 6824344100 push 00413424

* Possible StringData Ref from Data Obj ->"Internet Maniac"
|
:004051D8 6884314100 push 00413184
:004051DD FFD7 call edi
:004051DF 8D542448 lea edx, dword ptr [esp+48]
:004051E3 68A0004300 push 004300A0
:004051E8 52 push edx

* Possible StringData Ref from Data Obj ->"Registration Code"
|
:004051E9 6838344100 push 00413438

* Possible StringData Ref from Data Obj ->"Internet Maniac"
|
:004051EE 6884314100 push 00413184
:004051F3 FFD7 call edi
:004051F5 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"Registration Successful"
|
:004051F7 6804364100 push 00413604

* Possible StringData Ref from Data Obj ->"Thank you for registering Internet "
->"Maniac. Enjoy the program."
|
:004051FC 68C4354100 push 004135C4
:00405201 56 push esi

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:00405202 FF1554114100 Call dword ptr [00411154]
:00405208 6A01 push 00000001
:0040520A 56 push esi
:0040520B EB39 jmp 00405246

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004051C1(C)
|
:0040520D 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Failure!"
|
:0040520F 68B8354100 push 004135B8

* Possible StringData Ref from Data Obj ->"Incorrect registration code!"
|
:00405214 6898354100 push 00413598
:00405219 56 push esi

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:0040521A FF1554114100 Call dword ptr [00411154]
:00405220 5F pop edi
:00405221 B801000000 mov eax, 00000001
:00405226 5E pop esi
:00405227 81C480000000 add esp, 00000080
:0040522D C21000 ret 0010
大家可以先看一看上面的代码，你可以先看到从call edi出来，你可以发现这个edi值就为USER32.GetDlgItemTextA我想这个函数大家一定熟悉吧，就是得到你输入的name和RN，那么现在它应使用两次这样的函数，所以在它的下面就还有一个call，这就说明程序的确读取了两次数据。现在向下看你可以发现关键的比较地方，这个我在初学天地中介绍过的关键比较形式。大家不知道记住没有，如果记住的话，在这里就应用上了。因为下面是正确的信息和错误的信息，所以就进入call 00407FD0中。

:00407FD0 83EC20 sub esp, 00000020
:00407FD3 56 push esi
:00407FD4 8B742428 mov esi, dword ptr [esp+28]
:00407FD8 56 push esi name

* Reference To: KERNEL32.lstrlenA, Ord:0308h
|
:00407FD9 FF1560104100 Call dword ptr [00411060]
:00407FDF 83F804 cmp eax, 00000004
:00407FE2 7D07 jge 00407FEB
这里当然是比较你的name个数是否小于4，如果不是话，进行下面的比较。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407FE2(C)
|
:00407FEB 0FBE4601 movsx eax, byte ptr [esi+01]
:00407FEF 0FBE4E02 movsx ecx, byte ptr [esi+02]
:00407FF3 D1E0 shl eax, 1
:00407FF5 50 push eax
:00407FF6 0FBE4603 movsx eax, byte ptr [esi+03]
:00407FFA C1E102 shl ecx, 02
:00407FFD 51 push ecx
:00407FFE B90A000000 mov ecx, 0000000A
:00408003 99 cdq
:00408004 F7F9 idiv ecx
:00408006 B8A0C634FA mov eax, FA34C6A0
:0040800B 8BCA mov ecx, edx
:0040800D D3E0 shl eax, cl
:0040800F 8D4C240C lea ecx, dword ptr [esp+0C]
:00408013 50 push eax

* Possible StringData Ref from Data Obj ->"%010u-%d%d"
|
:00408014 68383B4100 push 00413B38
:00408019 51 push ecx

* Reference To: USER32.wsprintfA, Ord:02ACh
|
:0040801A FF1544114100 Call dword ptr [00411144]
:00408020 8B542440 mov edx, dword ptr [esp+40]
:00408024 83C414 add esp, 00000014
:00408027 8D442404 lea eax, dword ptr [esp+04]
:0040802B 52 push edx
:0040802C 50 push eax

* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:0040802D FF1544104100 Call dword ptr [00411044]
:00408033 F7D8 neg eax
:00408035 1BC0 sbb eax, eax
:00408037 5E pop esi
:00408038 40 inc eax
:00408039 83C420 add esp, 00000020
:0040803C C3 ret
在这里你可以 看到计算注册码的过程，如果这个程序你想制作注册机的话，分析一下上面的地方就可以了。注册码可以在
:0040802B 52 push edx
:0040802C 50 push eax
这里看到。我的注册码如下：

********************************
* name:dahuilang *
* RN:0442716160-416194 *
********************************


IPARMOR 3.51

 标 题:这个软件作者太狂妄了...... (3千字)
发信人:ly2001
时 间:2001-8-25 21:15:17
详细信息:
这个作者实在太目中无人了。

附：(原文件中ABOUT中的信息)

IPARMOR 3.51简体中文版
作者：罗建斌

破解本软件而引起的：
硬盘低级格式化，主板CMOS被擦写
经济损失,以及法律责任均由破解者负责

木马克星一共采用64处加密暗记，
就算你破解了注册页面在软件内部仍然藏有加密标示
(包括注册表加密，文件日期加密，文件公司加密，CMOS加密等，一共12种加密标示)
我有理由相信任何破解者，都不可能完全破解所有加密标示 (因为他们发现不了)
如果被木马克星发现是破解版本，将会失查杀功能并且在SYSTEM目录下生成200个内容
为保护正版软件，打击非法破解活动的随机DLL文件，
由此引发的用户资源耗尽，由用户负责...

关于作者：
美男子中的佼佼者
对计算机最有天赋的人之一
---------哈哈，从这分析得出，上面所说的多数是吹水

转入正题。闲来没事找个软件来练手。就找了这个木马克星.......
首先，先安装。软件弹出感谢选用框，接着再次弹出警告框：由于非法破解本软件而造成
的任何后果，由破解者负责。
----------哈哈，还来个先礼后兵。

注册方式：软件给一序列号，要求输入注册码。错误自动关闭程序。

首先，我利用TRW来跟踪，PMODULE后p了32次很快就OVER。没发现什么。看来作者
应该还是有下一些功夫的。
转用W32DSM中文版来分析。发现没有注册码不正确之类的字符。于是
双击注册成功.往上看看。

:0049F894 8B8024020000 mov eax, dword ptr [eax+00000224]
:0049F89A 2DD1080000 sub eax, 000008D1
:0049F89F E86493F6FF call 00408C08
:0049F8A4 8B55F8 mov edx, dword ptr [ebp-08]
:0049F8A7 58 pop eax
:0049F8A8 E8EF48F6FF call 0040419C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049F834(C)
|
:0049F8AD 757E jne 0049F92D

* Possible StringData Ref from Code Obj ->"注册成功!"
|
:0049F8AF B808FB4900 mov eax, 0049FB08
:0049F8B4 E8D702FBFF call 0044FB90

猜测：在注册成功上面应该有一比较注册码正误的判断。
再次启动TRW，在0049F894处设断。设断后，按F10至0049F8A4后下D EDX可看到到
一带负号的码(真码)。我的为-895896729.用PAGEUP上翻，可看到我输入的假码。

继续按F10 在 jne 0049F92D 这一行下命令 R FL Z 让程序继续执行下去。
过两行后便弹出注册成功框。

接着又来一框框：这个驱动器无法格式化。--------好彩。

按确定。程序自动关闭。重启后已为注册版。(哈 。作者真为我们着想)

注册后信息写入
注册表中的 HKEY_CURRENT_USER\Software\AngelSoft\iparmor中的“pass”键中
我的是-895896729.

哈哈，这个软件真是不堪一击，这么轻易就把它给干掉了。

★★★★★★★★★★★★★★

突发奇想：
对于那些将注册信息写入注册表的软件(特别是那些给出一个序列号来，只需填写
注册码的这一类软件)。是否可通过上述的方法(即利用TRW来执行注册成功的CALL)。让
软件自已弹出注册成功框后。将注册信息写入注册表的方法来达到破解的目的呢？

谁如果知道请告诉我一声。

★★★★★★★★★★★★★★
另外，我用EXESCOPY打开此文件(打算把软件的ABOUT内容COPY出来，但没找到。
只有一个一个字打，真累)。却在其位图中发现有一幅图画。有点像泰坦尼克号的中的
女主角。文件中是找不到的。猜想可能是作者所说的用来对付破解者的利器吧。

有错漏处，请大家指正。

----耗了我足足有2个半钟
2001-8-25


Irfanview

标 题:Irfanview破解手记 (668字)
发信人:孙锋
时 间:2001-2-2 23:40:58
详细信息:
Irfanview破解手记
作者：孙锋
Email：sffs@263.net
主页：http://sffs.6to23.com

这是一个图象浏览软件，支持图象格式很多，具体使用限制我没看，反正看到他是共享的就下了。
URL http://202.101.237.103/f/jwjjt/soft6/iview333.zip
工具：
softice 4.05

步骤：
1、首先随便输入我的注册信息：
Name：sunfeng
Code：1212121212
2、呼叫出softice，下bpx hmemcpy，F5返回程式领域，点ok。
3、softice拦截后，F12共27次，然后一直F10到下面位置（中间有一段很长的计算过程，
取决于你输入的注册码个数）：
0167：00448C9F JNZ 00448CB6 ；---------->下D EDX 得到注册码：339127600
0167：0044BCA1 MOVE ECX，[004CFFC4]
4、其他注册码：
孙锋--------375911902

<------完-------->

标 题:注册机0.0000000001版~~~~~~ (1千字)
发信人:真·伪装者
时 间:2001-2-3 7:37:04
详细信息:

 目前还不完善~只能以15以下位的字符做用户名，这个东西用了我好几个小时，它似乎诚心和我作对~分开来调试一点问题没有，和在一起死活不行~~~~（另外现在这个是我贴的第三遍了~~前两遍都没贴上来~~~不知道这次行不行~~~~~）~~~~~着东西目前很罗嗦~~下个版本争取改进~~~我实在是太困了~~~睡了~~~~~~~`
#include "stdio.h"
main()
{
char string[81];
long i,a=0,b=0,d=0;
unsigned c;
printf("This keygen is maked by Pretender\nPlease input your name
    ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
a+=c;
a=(a-260+332)*472;
printf("Your name is  ");
puts(string);
printf("Your Registration code is      ");
for(b=0;b<6;b++)
{string[b]=a%10;a=a/10;}
printf("%d",string[5]);
b=string[5]+48;
a=2809*b;
b=string[4]+48;
d=1855*b;
a=a-d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[4]);
printf("%d",string[3]);
b=string[3]+48;
a=3478*b;
b=string[2]+48;
d=5476*b;
a=a+d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[2]);
printf("%d",string[1]);
b=string[1]+48;
a=3627*b;
b=string[0]+48;
d=1521*b;
a=a-d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d\n",string[0]);
printf("Welcome to WWW.CRACKNOW.COM\n");}


IrfanView3.36

 标 题:申请加入BCG的破解文章之一 (6千字)
发信人:NYDoll
时 间:2001-5-6 11:45:46
详细信息:
IrfanView3.36破解手记

作者：娃娃(NYDoll)

软件简介：一个非常优秀的看图软件，即使是跟ACDSee相比也未见逊色多少，软件本是免费软件，即使不注册也没有任何限制，但为了支持作者的继续升级，还是请有能力的朋友注册吧:

破解工具：TRW2000 BW2000
____________________________________________________________________________________________________________________________________

我是在华军下载的汉化版，下载后软件是用ASPACK加国壳的，你不妨用BW2000+TRW2000脱掉他的壳，以方便反汇编，
然后填写注册信息: Your name: NYDoll Your Code:38383838 都可以随便填写，但也有一定的限制，请向下看:

设断点 BPX HMEMCPY
F5
按OK，立刻被拦下
BC *
PMODULE
来到这里：

XXX:432FFB MOV EDX,[004DEF54] 《----------TRW停在这里
XXX:433001 PUSH DWORD 0100
XXX:433006 ADD EDX,0100
XXX:43300C PUSH EDX
XXX:43300D PUSH DWORD 045C

按几下F10马上又回到系统领空，于是在次下命令PMODULE，回到程序代码段，应该停在：

XXX:0044B921 TEST EAX,EAX
XXX:0044B923 JZ NEAR 0045051D
XXX:0044B929 LEA EDI,[ESP+04F8]
XXX:0044B930 OR ECX,BYTE -01
XXX:0044B933 REPNE SCASB
XXX:0044B937 NOT ECX
XXX:0044B939 DEC ECX
XXX:0044B93A CMP ECX,BYTE +02 《---------- 注册名的字数必须大于2
XXX:0044B93D JC NEAR 0044B9CA
XXX:0044B943 LEA EDI,[ESP+04F8]
XXX:0044B94A OR ECX,BYTE -01
XXX:0044B94D REPNE SCASB
XXX:0044B94F NOT ECX
XXX:0044B951 DEC ECX
XXX:0044B952 CMP ECX.BYTE +55 《----------- 注册名的位数必须小于85
XXX:0044B955 JA 0044B9CA
XXX:0044B957 LEA EDI,[ESP+05F8]
XXX:0044B95E OR ECX.BYTE -01
XXX:0044B961 XOR EDX,EDX
XXX:0044B963 REPNE SCASB
XXX:0044B965 NOT ECX
XXX:0044B967 DEC ECX
XXX:0044B968 TEST ECX,ECX 《----------- 判断所输入的注册码位数是否为零
XXX:0044B96A JNG 0044B9AE
XXX:0044B96C MOV AL.[ESP+EDX+05F8] 《-------- 程序在这里开始进入一个循环， AL 分别是注册码的每一位
XXX:0044B973 CMP AL,30
XXX:0044B975 JL 0044B9EB
XXX:0044B977 CMP AL,39
XXX:0044B979 JNG 0044B980
XXX:0044B97B MOV EBX,01
XXX:0044B980 LEA EDI,[ESP+05F8] 《----- 看到我们输入的 Fuck Code
XXX:0044B987 OR ECX,BYTE -01
XXX:0044B98A XOR EAX,EAX
XXX:0044B98C INC EDX
XXX:0044B98D REPNE SCASB
XXX:0044B98F NOT ECX
XXX:0044B991 DEC ECX
XXX:0044B992 CMP EDX,ECX 《----- EDX 为循环次数，ECX为注册码字符个数 用这个对比语句判断循环是否完成
XXX:0044B994 JL 0044B96C 《----- 如果 循环次数小于注册码字符数说明循环没有完成 跳到0044B96C处继续判断注册
码是否符合标准
XXX:0044B996 TEST EBX,EBX
XXX:0044B998 JZ 0044B9AE 《---- 应该跳
XXX:0044B99A PUSH DWORD 0104
XXX:0044B99F PUSH DWORD 9CCB
XXX:0044B9A4 PUSH DWORD 9CCB
XXX:0044B9A9 JMP 004491A1
XXX:0044B9AE LEA EDX,[ESP+05F8]
XXX:0044B9B5 LEA EAX,[ESP+04F8]
XXX:0044B9BC PUSH EDX 《--------- 压入Fuck Code
XXX:0044B9BD PUSH EAX 《--------- 压入Name
XXX:0044B9BE Call 00432D00 《————— 关键Call 按F8进入
XXX:0044B9C3 ADD ESP,BYTE +08
XXX:0044B9C6 TEST EAX,EAX 《————— 注册标志 EAX值为0则注册失败 否则视为注册成功！
XXX:0044B9C8 JNZ 0044B9DE 《———— 为0则跳转到出错窗口

------------------------------------------------Call----------------------------------------------------------------
XXX:00432D00 MOV EAX,[ESP+08]
XXX:00432D04 SUB ESP,BYTE +14
XXX:00432D07 PUSH EBX
XXX:00432D08 PUSH EBP
XXX:00432D09 PUSH ESI
XXX:00432D0A PUSH EDI
XXX:00432D0B PUSH EAX
XXX:00432D0C XOR EBX,EBX
XXX:00432D0E CALL 004A6157
XXX:00432D13 MOV ESI,[ESP+2C]
XXX:00432D17 MOV EBP,EAX
XXX:00432D19 MOV EDI,ESI

... ... 继续按F10向下追:

XXX:00432D64 LEA EDX,[ESP+14]
XXX:00432D68 PUSH ESI
XXX:00432D69 LEA ESI,[EAX+ECX*2]
XXX:00432D6C SHL ESI,03
XXX:00432D6F PUSH ESI
XXX:00432D70 CALL 004B1244 《———— 如果你跟如入这个Call 你会得到一个中间数据 299248

接下来就是开始算注册码了 在这里就不详细列出了 有兴趣的Cracker们可以跟进研究研究 非常简单哦
一直按F10到：

XXX:000B2F75 ADD DL,30
XXX:000B2F78 MOV [ESP+11],DL
XXX:000B2F7C LEA EDX,[ESP+10]
XXX:000B2F80 PUSH EDX 《———— 嘣蹦蹦~嘣 终于胜利了 在这里下D EDX看到的就是真正的注册码了 229952408
XXX:000B2F81 CALL 004A6157
XXX:000B2F86 ADD ESP,BYTE +04
XXX:000B2F89 XOR ECX,ECX

终于搞定了 好累阿 这是我写的第一篇破解 是一个保护比较差的软件 没有办法 谁叫俺水平不济哩 只好捡软骨头吃了 呵呵
BYEBYE 如果有错误 希望各位前辈指出!!

______________________________________________ 娃娃（NYDoll） —————————————————————————
NYDoll@Etang.Com QQ: 15110296


IrfanView32

标 题:我的破解心得(1) (3千字)
发信人:chcw
时 间:2001-3-13 17:49:55
详细信息:
说明：这是我以前写的心得，贴在这里，请大家指正。

破解对象：
IrfanView32

破解工具：
W32Dasm 8.5(或更高版本)
Hacker View 5.6(或更高版本)

破解者：
chcw

IrfanView32是一个免费软件，程序作者没有花什么力气来对付Cracker,故较适合
初学Crack的人练习用。

1. 运行IrfanView32。
2. 选择About/Registration, 随便输一个name和code, 如
name=chcw, code=9530109。
3. 一般来说，你的注册码当然是错误的(除非你的运气特别好，刚好给你碰对了)
程序将显示一个消息框, 内容是"Incorrect registration!"。记下该信息后，
退出IrfanView32。
4. 运行W32Dasm, 将I_view32.exe反汇编。
5. 反汇编结束后，选择W32Dasm菜单Refs/String Data References, 从列表框中
找出字符串"Incorrect registration!", 选中后用鼠标双击，W32Dasm将把亮
条定位在反汇编代码中访问到该字符串的代码行上。
6. 关闭字符串列表对话框，我们来看一下亮条处的代码：
...
:0041A733 E8C868FEFF call 00401000
:0041A738 83C408 add esp, 00000008
:0041A73B 85C0 test eax, eax
:0041A73D 751B jne 0041A75A
...
* Possible StringData Ref from Data Obj ->"Incorrect registration !"
|
:0041A74F 68A0E24700 push 0047E2A0 <-亮条所在处
:0041A754 51 push ecx
:0041A755 E9FEFDFFFF jmp 0041A558

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A73D(C)

:0041A75A 8B354C754900 mov esi, dword ptr [0049754C]

从亮条所在处往上找，可以发现在0041A73B处有一条test eax,eax语句，它
后面的jne语句是eax为非零值时，跳转到0041A75A处，正好跳过了对字符串
"Incorrect registration !"的引用。而在test语句前有一个call 00401000调
用。因此，00401000很可能就是一个对注册码进行检查的函数，当注册码合法时
返回非零值，否则返回零，并显示错误信息。将亮条移到:0041A733 call 00401000
语句处，亮条呈亮绿色。按工具栏上的"Call"按钮进入该子程序。在子程序ret
语句前有下面几条语句：

:00401280 3BE8 cmp ebp, eax
...
:00401284 0F94C1 sete cl
...
:00401288 8BC1 mov eax, ecx
...
:0040128E C3 ret

可见，如果猜想正确，那么我们只需要将00401284处的sete cl语句改为
setne cl,就可以使注册成功。

7. 在W32Dasm中，将亮条移到00401284的jne语句处，此时在W32Dasm反汇编窗口
的状态行中将显示@Offset 00000684h in File:I_view32.exe, 记下这个偏移地
址。

8. 将I_view32.exe备份，运行Hiew I_view32.exe，按F4键(Mode)，选择Decode
模式，再按F5键(Goto), 输入偏移地址684，Hiew将定位到偏移684处：

.00401284 0F94C1 sete cl

9. 现在我们将这条语句改为setne cl，按F3键(Edit)，输入0F95(setne的机器码)
将原先的0F94(sete的机器码)覆盖，此时我们可以看到机器码右部的汇编代码也发生
了相应的变化。再按F9键(Update)，保存所作的修改，退出Hiew。

10. 运行I_view32.exe, 随便输入一个注册码(如Name="chcw",Code="9530109")选
择"OK"，程序显示"Register Successful",再到About/About IrfanView中，可以看
到原先的registered to You字样改成了registerd to chcw。注册成功了!
在修改过I_view32.exe之后，如果你输入了正确的注册码，程序反而会提示
"Incorrect registeration"。

11. 有人也许会想，能不能将调用检测函数00401000之后的语句0041A73D jne 0041A75A
改为je或jmps语句，从而达到相同的效果呢？回答是否定的。的确，很多软件都可以在
检测函数之外的跳转处Patch，而且这样做一般来说更为安全，但是IrfanView32却是例外。
IrfanView32相当狡猾，它在程序启动时、注册时和显示About IrfanView32对话框时都会
反复调用00401000函数检验注册的正确性。所以直接改动检测函数也许更为合理一些。
标 题:我的破解心得(2) (2千字)
发信人:chcw
时 间:2001-3-13 17:54:50
详细信息:
 破解对象：
IrfanView32
破解者：
chcw

在上一节中，我们已经知道，只要将执行程序I_view32.exe在Offset=0x685处
的字节从0x94改为0x95即可破解IrfanView32。在这一节，我们将介绍如何为
IrfanView32写一个Patcher，它在执行时自动完成上述的修改任务。

--------------------- Patcher.c -----------------------

#include <stdio.h>
#include <stdlib.h>

void main()
{
unsigned char patch=0x95;
long offset=0x00000685;
FILE *fp;

printf("Crack for IrfanView32\n");
printf("Written by Mr. Chcw\n");

if ((fp=fopen("I_view32.exe", "r+"))==NULL)
      {
printf("Error: Cannot find file I_view32.exe\n");
exit(1);
}

fseek(fp,offset,SEEK_SET);
fputc(patch,fp);

printf("Patch successful\n");
}

--------------------- End of Patcher.c ------------------

Patcher.c程序先将可执行文件I_view32.exe读入，然后通过偏移地址定位
到要Patch的地方，再用机器码0x95改写该处的字节，就完成了Patch过程。
当然，在实际应用中，待Patch的程序因版本的不同可能会产生Patch地址的
偏差或Patch代码的偏差，我们需要在Patch之前检查待Patch的程序的版本(如
根据程序的大小)和Patch处原机器码是否正确，以保证不会Patch错误。
下面是一个改进的Patcher1.c程序:

----------------------- Patcher1.c ------------------------

#include <stdio.h>
#include <io.h>
#include <stdlib.h>

void main()
{
const long filesize=614912;    //614,912
      bytes
const unsigned char oldcode=0x94;

unsigned char patchcode=0x95;
long offset=0x00000685;
FILE *fp;

printf("Crack for IrfanView32\n");
printf("Written by Mr. Chcw\n");

if ((fp=fopen("I_view32.exe", "r+"))==NULL) {
printf("Error: Cannot find file I_view32.exe\n");
exit(1);
}
else if (filelength(fileno(fp))!=filesize) {
printf("Error: Incorrect IrfanView32
      version, cannot patch it\n");
exit(2);
}

fseek(fp,offset,SEEK_SET);
if (fgetc(fp)!=oldcode) {
printf("Error: The file I_view32.exe
      is corrupted\n");
exit(3);
}

fseek(fp,offset,SEEK_SET);
fputc(patchcode,fp);
fclose(fp);

printf("Patch successful\n");
}

-------------------- End of Patcher1.c --------------------
标 题:我的破解心得(3) (3千字)
发信人:chcw
时 间:2001-3-13 17:56:30
详细信息:
破解对象：
IrfanView32

破解者：
chcw

在上两节中，我们介绍了通过修补IrfanView32程序来破解其注册检验的方法。
修补程序(或称Patch)是Crack中常用的一种方法，它的缺点也是显而易见的，主要
有以下几点：
1. 不少程序在运行时会检查自身的完整性(如Win Command32)，如果发现自身被
修改过，就会立即报错退出，Patch方法对这类程序就无计可施了（除非把程
序检查完整性的部分也给Patch掉）。
2. 有些程序在通过编译优化后，可能不只在一处调用Patch过的代码，因此Patch
此类程序一般要相当小心，对Patch点的选取是关键。如果Patch不好的化，在
程序运行时，可能会产生许多莫名其妙的错误。
3. 有些查毒程序（如MSAV)，在扫描硬盘上的程序文件时，同时会生成这些文件
的校验码，以备日后检查文件完整性用。因此，如果我们Patch了一个受查毒
程序校验和保护的程序，查毒程序可能会认为该程序被病毒感染。
4. Patch程序常以执行文件方式提供，容易传播病毒。
5. Patch程序对错误的执行文件版本进行Patch后，会导致无法预料的结果。

另一种常用的Crack方法是直接获取程序的合法注册码或是序列号，然后通过正常的
注册过程完成注册，这种方法可以避免对执行程序本身进行修改，因而不会有Patch方
法的那些问题；它的缺点是工作量较大，破解者往往需要理解整个注册检验函数的工作
机理。
还是以IrfanView32为例，在上一节中，我们已经知道:0041A733 call 00401000语
句很可能就是程序检验注册码的子程序，在这一节中，我们将分析子程序00401000，并
从中获取IrfanView32的注册码。

1. 用WinICE载入I_view32.exe。
2. 按Ctrl D，回到IrfanView32窗口。选择About/Registration，打开注册窗口。
3. 按Ctrl D, 回到WinICE窗口，键入命令BPX MessageBoxA，对消息框设置断点。再键入X
命令，回到注册窗口。
4. 在注册窗口中输入注册码Name=chcw,Code=9530109, 按OK命令键，触发我们刚才设置的
断点，进入WinICE窗口。
5. 用BC *命令清除原先的断点。然后键入命令BPX CS:0041A733，在调用00401000子程序的
语句处设置新的断点。键入X命令，回到IrfanView32窗口。
6. 再次输入注册码，按OK后，触发断点。执行亮带停留在0137:0041A733 call 00401000语
句处，检查该程序的调用，发现参数1为串"chcw"的地址，参数2为串"9530109"的地址，
这就进一步证实了00401000子程序是注册检验函数的猜想。
7. 按F8，进入该子程序调用。其中有不少子程序调用语句和循环，先不去管它们，不断按
F10，跳过(Step Out)这些语句，最后到达00401000子程序的返回语句附近:
:00401280 cmp ebp, eax
...
:00401284 sete cl
...
:00401288 mov eax, ecx
...
:0040128E ret
这几条语句是处理子程序00401000的返回值用的（大部分函数的返回值都放在eax中），
其效果相当于c语言中的return (%epb==%eax);在上两节中，我们知道，当子程序
00401000返回值eax不为零时，注册成功。因此，在对用户输入的姓名和注册码进行一定
的运算之后，只要满足%ebp==%eax，注册就算成功了。记下在语句cmp ebp, eax处的ebp
和eax的值，ebp=00916AFD, eax=10E1B31A。
8. 键入X命令后，回到IrfanView32窗口，再次输入注册码，进入子程序00401000, 设置断点
EPR cs:00401000 cs:00401280 R if ((ebp==00916AFD) || (eax==10E1B31A))
该断点是用来查找从cs:00401000到00401280的语句中，将ebp设置为00916AFD或将eax设
置为10E1B31A的第一条语句。键入X命令后，中断被触发，相继找到ebp=00916AFD是
:0040100E处 call 0045F770子程序调用的返回值。eax=10E1B31A是
:00401276处 call 0045F770子程序调用的返回值。在这两处分别设置一次性断点。发现
对子程序0045F770子程序的两次调用的参数分别为字符串"9530109"和"283226906"。既
然两次调用的函数都是0045F770，那么只要我们将原先的注册码"9530109"改为"283226906"
，调用后的返回值ebp和eax就是相等的，注册也就会成功。
因而得到IrfanView32的注册码为Name="chcw", Code="283226906"。

小结：
00401000是IrfanView32的注册检验函数，该函数首先将用户姓名("chcw")作某种转化后
得到数字代码("283226906")，然后将该代码和用户输入的注册码("9530109")分别通过函
数0045F770进行变换，最后通过比较两者的变换值是否相等来判断注册是否成功。奇怪的
是，IrfanView32在第二步中对数字代码和注册码进行变换时所用的函数都是0045F770。
我们知道，对于函数，当x1=x2时，必有f(x1)=f(x2)，所以无论函数0045F770作了何种变
换，我们只要使注册码和通过姓名计算出的数字代码相同，就可以确保注册的成功。
标 题:我的破解心得(4) (13千字)
发信人:chcw
时 间:2001-3-13 18:01:26
详细信息:
版权说明：本文作者为Chcw, 未经作者同意，不得转载此文。

破解程序:
IrfanView32

破解工具:
Extract 1.0
Sourcer 7.0
Visual C++ 5.0

在我的破解心得(3)中，我们采用手工调试的方法获得了Name="chcw"时对应的注册码
Code="283226906"。更进一步，我们希望能够编写一个注册码生成器，使得对应于不同的
用户姓名，可以生成相应的正确注册码。我们知道，不少程序的注册检验函数都可以表示
为以下的流程：
user_name = get_username() /* 获取用户输入的姓名 */
user_regcode = get_userregcode() /* 获取用户输入的注册码 */
regcode = compute_regcode(user_name) /* 对用户姓名做复杂的计算，得到一个合法的
注册码 */
if (!isequal(usr_regcode, regcode)) /* 将上述合法的注册码与用户输入的注册码比较，
register_error() 若不相同则认为注册非法 */
通常，如果我们要实现一个注册码生成器，必须了解整个注册检验过程中compute_regcode()
部分的工作机制，然后用编码实现与之相类似的效果。显然，这种方法费时费力，而且只对
当前所破解的软件有效，意义不大。
其实，我们完全可以不必了解compute_regcode()的内部机制，只需要直接将应用程序中
compute_regcode部分反汇编拷贝到注册码生成器中，然后重新编译即可。这种方法不仅减少
了编写注册机的工作量，而且由于这部分代码是源于应用程序的，因此一般不会出错。
仍以IrfanView32为例，在破解心得(3)中，我们已经知道函数00401000子程序是注册检验
函数，该函数在00401275处的ds:edx是指向合法注册码的一个指针。显然在从程序入口到
00401275处是生成注册码的部分。下面我们将把它反编译并加入到我们的注册机中：

1.IrfanView32的程序文件I_View32.exe很大，无法直接用Sourcer进行反汇编，因此需要先用
一个叫Extract的工具对它进行处理。Extract是"Undocumented Windows"一书所附带的一个
程序，其功能是将二进制程序的一部分截取出来。
由于我们所要返汇编的函数为00401000，用W32Dasm可以得到它在执行程序I_view32.exe
中的偏移地址为0x400，函数00401000同时还调用了0046C700等子函数，我们就大致取截取
长度为0x70000，使之能将函数00401000和0046C700同时包含进来。
输入命令 Extract I_view32.exe 0x400 0x70000 Tmp.bin 将生成一个二进制文件Tmp.bin。
2.用Sourcer打开Tmp.bin, 将反汇编的File Format设置为.asm文件，将编译的平台设置为
386 Protected，并在Analysis Option中打开Default to USE32选项。设置完所有参数后，
按'G'，反汇编Tmp.bin，生成Tmp.asm文件。
3.在Visual C++中建立一个工程，类型为Win32 Console Application，并在工程中添加一个KeyMaker.C
的源程序文件。
4.在KeyMaker.C文件中构造一个新函数makekey()，打开文件Tmp.asm，将函数00401000（以
start::为启始标志）中的语句复制到makekey()函数中，并加上__asm外套，如下所示：
__declspec(naked) void makekey()
{
__asm {
mov eax,dword ptr [esp+8] ; 函数00401000的第一条语句
...
retn ; 函数00401000的返回语句
}
}
其中__declspec(naked)是用来去除MakeKey()函数的标准堆栈框的。
5.在函数00401000中还调用了其他几个函数, 其中call sub_763就是对函数0045F770的调用，在破解心
得(3)中我们已经知道，在00401000函数中对0045F770函数的两处调用并没有什么意义。因此可以直接
将其该改为nop语句（这里必须保证堆栈的正确性）, 如下所示：
call sub_763 改为-> nop
... ...
call sub_999 call sub_999
... ...
call sub_763 改为-> nop

6.接下来，我们需要处理sub_999函数，在KeyMaker.C文件中构造一个新函数func1()，将函数sub_999的语
句复制到func1()内，并将makekey()中对sub_999的调用作相应的改动:
__declspec(naked) void func1()
{
__asm {
mov ecx,dword ptr [esp+0Ch] ; 函数sub_999的第一条语句
...
retn ; 函数sub_999的返回语句
}
}

__declspec(naked) void makekey()
{
__asm {
...
call func1() ; 函数MakeKey()中对函数sub_999的调用语句
...
}
}
7.同理也可以对func1()函数中进一步调用的其他函数作相应的处理。
8.到现在为止，我们已经将IrfanView32中的注册码生成部分复制到makekey()函数中了，接下来我们
需要考虑makekey()函数的环境处理，即正确的输入和输出。从上一节我们知道，makekey()函数的
输入参数是用户输入的注册码和注册名，因此在调用该函数之前，应该在栈中压入正确的参数：
char usrcode[32]="9530109";
char name[32]="chcw";

__asm {
lea eax,dword ptr usrcode
push eax ; 将用户输入的注册码字符串地址压栈
lea eax,dword ptr name
push eax ; 将用户输入的姓名字符串的地址压栈
call makekey() ; 调用函数makekey()
add esp, 8h
}
当然，在调用完makekey()之后，应当调整堆栈指针。
9.makekey()函数的输出应该是正确的注册码，在上文中，我们已经说过，在:00401275处执行push edx
语句时的ds:edx指向正确注册码的地址。由于这个注册码是在堆栈中生成的，在调用完函数makekey()
并退栈之后将不复存在, 因此为了使主程序能够得到完整的注册码，必须将其保存下来:
我们首先声明一个全局变量regcode, 用它来保存注册码的值：
char regcode[256];
然后，在00401275处的语句之后加上一端代码，将ds:edx所指的注册码复制到regcode中：
push edx ; 原字符串地址压栈
lea eax, dword ptr regcode
push eax ; 目标字符串regcode地址压栈
call strcpy ; 调用strcpy函数进行复制
add esp,8 ; 调整栈指针
通过这种方法，我们就成功的将00401000函数(makekey()函数)生成的临时注册码保存在regcode
中了。
9.最后，我们可以在调用00401000函数(makekey()函数)的主程序main()中加上一些输入输出语句，使程
序更为完善。

附：IrfanView32的注册码生成器KeyMaker.C

-------------------------- KeyMaker.C ----------------------------------
#include <string.h>
#include <stdio.h>

char regcode[256]="";

__declspec(naked) void func2()
{
__asm {
mov eax,dword ptr [esp+10h]
push ebx
push ebp
push esi
mov esi,dword ptr [esp+14h]
push edi
test eax,eax
jz short loc_9308 ; Jump if zero
mov edi,dword ptr [esp+14h]
mov byte ptr [esi],2Dh ; '-'
inc esi
neg edi
jmp short loc_9309
loc_9308:
mov edi,dword ptr [esp+14h]
loc_9309:
mov ebp,dword ptr [esp+1Ch]
mov ebx,esi
loc_9310:
mov eax,edi
xor edx,edx ; Zero register
div ebp ; ax,dx rem=dx:ax/reg
mov eax,edi
mov ecx,edx
xor edx,edx ; Zero register
div ebp ; ax,dx rem=dx:ax/reg
cmp ecx,9
mov edi,eax
jbe short loc_9311 ; Jump if below or =
add cl,57h ; 'W'
jmp short loc_9312
loc_9311:
add cl,30h ; '0'
loc_9312:
mov [esi],cl
inc esi
test edi,edi
ja loc_9310 ; Jump if above
mov byte ptr [esi],0
dec esi
loc_9313:
mov cl,[ebx]
mov al,[esi]
mov [esi],cl
mov [ebx],al
dec esi
inc ebx
cmp ebx,esi
jb loc_9313 ; Jump if below
pop edi
pop esi
pop ebp
pop ebx
retn
}
}

__declspec(naked) void func1()
{
__asm {
mov ecx,dword ptr [esp+0Ch]
mov edx,dword ptr [esp+4]
cmp ecx,0Ah
push esi
jnz short loc_9314 ; Jump if not zero
test edx,edx
jge short loc_9314 ; Jump if > or =
mov esi,dword ptr [esp+0Ch]
mov eax,1
push eax
push ecx
push esi
push edx
call func2
add esp,10h
mov eax,esi
pop esi
retn
loc_9314:
mov esi,dword ptr [esp+0Ch]
xor eax,eax ; Zero register
push eax
push ecx
push esi
push edx
call func2
add esp,10h
mov eax,esi
pop esi
retn
}
}

__declspec(naked) void makekey()
{
__asm {
mov eax,dword ptr [esp+8]
sub esp,14h
push ebx
push ebp
push esi
push edi
push eax
xor ebx,ebx ; Zero register
nop
mov esi,dword ptr [esp+2Ch]
mov ebp,eax
mov edi,esi
or ecx,0FFFFFFFFh
xor eax,eax ; Zero register
add esp,4
xor edx,edx ; Zero register
repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
not ecx
dec ecx
test ecx,ecx
jle short loc_4 ; Jump if < or =
loc_3:
movsx ecx,byte ptr [edx][esi] ; Mov w/sign extend
add ebx,ecx
mov edi,esi
or ecx,0FFFFFFFFh
xor eax,eax ; Zero register
inc edx
repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
not ecx
dec ecx
cmp edx,ecx
jl loc_3 ; Jump if <
loc_4:
mov eax,104h
push dword ptr 0Ah
sub eax,ebx
cdq ; dword to quad word
xor eax,edx
sub eax,edx
add eax,14Ch
mov edx,eax
shl edx,3 ; Shift w/zeros fill
sub edx,eax
lea ecx,[eax][edx*4] ; Load effective addr
lea edx,dword ptr [esp+14h] ; Load effective addr
push edx
lea esi,[eax][ecx*2] ; Load effective addr
shl esi,3 ; Shift w/zeros fill
push esi
call func1
add esp,0Ch
cmp esi,0F423Fh
ja loc_5 ; Jump if above
mov cl,byte ptr [esp+14h]
mov al,byte ptr [esp+15h]
mov dl,byte ptr [esp+13h]
mov byte ptr [esp+16h],cl
mov cl,byte ptr [esp+11h]
mov byte ptr [esp+18h],al
mov al,byte ptr [esp+12h]
mov byte ptr [esp+12h],cl
mov ecx,dword ptr [esp+18h]
mov byte ptr [esp+13h],al
and ecx,0FFh
mov byte ptr [esp+15h],dl
mov edx,dword ptr [esp+14h]
lea eax,[ecx][ecx*4] ; Load effective addr
and edx,0FFh
shl eax,3 ; Shift w/zeros fill
sub eax,ecx
mov ecx,edx
shl ecx,5 ; Shift w/zeros fill
sub ecx,edx
lea edx,[ecx][ecx*2] ; Load effective addr
sub eax,edx
cdq ; dword to quad word
mov ecx,eax
xor ecx,edx
sub ecx,edx
lea eax,[ecx][ecx*4] ; Load effective addr
shl eax,3 ; Shift w/zeros fill
sub eax,ecx
mov ecx,9
cdq ; dword to quad word
idiv ecx ; ax,dx rem=dx:ax/reg
mov eax,dword ptr [esp+13h]
and eax,0FFh
add edx,30h
mov byte ptr [esp+17h],dl
lea edx,[eax][eax*2] ; Load effective addr
shl edx,4 ; Shift w/zeros fill
sub edx,eax
mov eax,dword ptr [esp+15h]
and eax,0FFh
lea ecx,[eax][eax*8] ; Load effective addr
lea eax,[eax][ecx*4] ; Load effective addr
lea eax,[edx][eax*2] ; Load effective addr
cdq ; dword to quad word
xor eax,edx
sub eax,edx
lea ecx,[eax][eax*8] ; Load effective addr
lea eax,[eax][ecx*4] ; Load effective addr
mov ecx,9
shl eax,1 ; Shift w/zeros fill
cdq ; dword to quad word
idiv ecx ; ax,dx rem=dx:ax/reg
mov ecx,dword ptr [esp+10h]
and ecx,0FFh
lea eax,[ecx][ecx*2] ; Load effective addr
lea eax,[eax][eax*8] ; Load effective addr
shl eax,1 ; Shift w/zeros fill
sub eax,ecx
add edx,30h
mov byte ptr [esp+14h],dl
mov edx,dword ptr [esp+11h]
and edx,0FFh
mov ecx,edx
shl ecx,3 ; Shift w/zeros fill
sub ecx,edx
lea edx,[ecx][ecx*4] ; Load effective addr
sub eax,edx
cdq ; dword to quad word
mov ecx,eax
xor ecx,edx
sub ecx,edx
lea eax,[ecx][ecx*2] ; Load effective addr
lea eax,[eax][eax*8] ; Load effective addr
shl eax,1 ; Shift w/zeros fill
sub eax,ecx
jmp loc_6
loc_5:
mov al,byte ptr [esp+15h]
mov dl,byte ptr [esp+16h]
mov cl,byte ptr [esp+14h]
mov byte ptr [esp+16h],al
mov al,byte ptr [esp+11h]
mov byte ptr [esp+18h],dl
mov dl,byte ptr [esp+12h]
mov byte ptr [esp+15h],cl
mov ecx,dword ptr [esp+16h]
mov byte ptr [esp+12h],al
mov eax,dword ptr [esp+18h]
and ecx,0FFh
and eax,0FFh
mov byte ptr [esp+13h],dl
mov edx,ecx
lea eax,[eax][eax*8] ; Load effective addr
shl edx,6 ; Shift w/zeros fill
shl eax,2 ; Shift w/zeros fill
sub edx,ecx
mov ecx,9
sub eax,edx
cdq ; dword to quad word
xor eax,edx
sub eax,edx
lea eax,[eax][eax*8] ; Load effective addr
shl eax,2 ; Shift w/zeros fill
cdq ; dword to quad word
idiv ecx ; ax,dx rem=dx:ax/reg
mov eax,dword ptr [esp+13h]
and eax,0FFh
add edx,30h
mov byte ptr [esp+17h],dl
lea edx,[eax][eax*4] ; Load effective addr
shl edx,3 ; Shift w/zeros fill
sub edx,eax
mov eax,dword ptr [esp+14h]
and eax,0FFh
add eax,20h
mov ecx,eax
shl ecx,3 ; Shift w/zeros fill
sub ecx,eax
lea eax,[eax][ecx*4] ; Load effective addr
lea eax,[eax][eax*2] ; Load effective addr
lea eax,[eax][edx*2] ; Load effective addr
cdq ; dword to quad word
xor eax,edx
sub eax,edx
mov ecx,eax
shl ecx,3 ; Shift w/zeros fill
sub ecx,eax
lea eax,[eax][ecx*4] ; Load effective addr
mov ecx,9
lea eax,[eax][eax*2] ; Load effective addr
cdq ; dword to quad word
idiv ecx ; ax,dx rem=dx:ax/reg
mov eax,dword ptr [esp+10h]
and eax,0FFh
add dl,30h ; '0'
mov byte ptr [esp+14h],dl
mov edx,eax
shl edx,3 ; Shift w/zeros fill
sub edx,eax
lea eax,[eax][edx*4] ; Load effective addr
mov edx,dword ptr [esp+11h]
and edx,0FFh
mov ecx,edx
shl ecx,4 ; Shift w/zeros fill
add ecx,edx
shl eax,1 ; Shift w/zeros fill
lea ecx,[ecx][ecx*4] ; Load effective addr
sub eax,ecx
cdq ; dword to quad word
xor eax,edx
sub eax,edx
mov edx,eax
shl edx,3 ; Shift w/zeros fill
sub edx,eax
lea eax,[eax][edx*4] ; Load effective addr
shl eax,1 ; Shift w/zeros fill
loc_6:
cdq ; dword to quad word
mov ecx,9
mov byte ptr [esp+19h],0
idiv ecx ; ax,dx rem=dx:ax/reg
add edx,30h
mov byte ptr [esp+11h],dl
lea edx,dword ptr [esp+10h] ; Load effective addr
push edx

push edx
lea eax, dword ptr regcode
push eax
call strcpy
add esp,8

add esp,4
xor ecx,ecx ; Zero register
cmp ebp,eax
pop edi
pop esi
sete cl ; Set byte if equal
pop ebp
mov eax,edx
pop ebx
add esp,14h
retn
}
}

void main()
{
char usrcode[32]="9530109";
char name[32]="chcw";

printf("KeyMaker for IrfanView32\n");
printf("Written By Mr. Chcw\n");
printf("Please enter your name:");
gets(name);

__asm {
lea eax,dword ptr usrcode
push eax
lea eax,dword ptr name
push eax
call makekey
add esp, 8h
}

printf("The register code is: %s\n", regcode);
}
----------------------- End of File KeyMaker.C -------------------------


Iris 1.00 beta

 标 题:不错的软件，我来写过程。：） (2千字)
发信人:LL[CCG]
时 间:2001-5-13 22:24:34
详细信息:
Iris 1.00 beta破解过程
下载地址:ftp://ftp03.softhouse.com.cn/download1/42333iris100.exe
软件用途:网络监控.有点象NETXRAY.不过界面好很多.用来查IP很好用..........哈哈。.....
软件安装完毕后,第一次启动先选择一下要监控的网络组件,然后就弹出注册对话框.好,我们开始:
输入NAME:LL
COMPANY:CCG
SN:123456
点OK,出现对话框说再次运行时会检验是不是合法用户.估计软件是将注册信息放到一个地方等待启动时检验,让我们来找找..........有了,是在注册表里.而且检验一次不通过之后就把键值恢复到默认状态.这样就可以下断点了.再次启动软件,输入NAME:LL
COMPANY:BCG(CRACKERABC不会怪我吧 ??嘿嘿...)
SN:123456
退出软件,启动TRW2000,下断点BPX REGQUERYVALUE,BPX REGQUERYVALUEA,BPX REGQUERYVALUEEXBPX REGQUERYVALUEEXA,我懒得一个一个的试,就把取注册表键值的函数全用了.用LOAD启动软件,断下了,是REGQUERYVALUEEXA,这个时候是考验耐心的时候,用POMDULE返回程序领空,然后看看寄存器里是不是有你输入的注册信息,没有就F10几下,再看看......因为程序还要从注册表里读取一些设置,不知道哪个和我们的注册信息有关,只好用这个笨办法了,不知道有没有别的好方法.
在N次断下,N次F10之后终于找到了一个信息:BCG.好了,有门了.:)
:00425FFB 8D4C2414 lea ecx, dword ptr [esp+14] 这里看看.
然后再F10向下走:
:00425A8B 8B442414 mov eax, dword ptr [esp+14] 这里是我们输入的SN.
再向下:
:00426392 8D4C2408 lea ecx, dword ptr [esp+08] 这里有个数字302003513,快记下来.
向下:
:00425AF2 8B00 mov eax, dword ptr [eax] 这里也有个数字4877527321.
然后就到关键点了:
:0042D116 7468 je 0042D180 这个就是
:0042D118 8D8C240C020000 lea ecx, dword ptr [esp+0000020C]
:0042D11F E88C95FFFF call 004266B0 这个是注册窗
跟到这里就完事了,有用的信息就是上面的两个数字,试试吧.....好,成功了.
注册信息如下:NAME:LL ,COMPANY:CCG ,SN:6709389078
NAME:LL ,COMPANY:BCG ,SN:4877527321
一些废话:这个软件的过程比较象FLASHGET,但是用了好多MFC函数,流程比较乱..反正我没搞太清楚.所以代码贴的断断续续.但是地址应该没问题,初学者可以慢慢的尝试.开始破的时候想写注册机来得,但是看到那么多MFC函数就放弃了,知道没这个本事.好在注册码可以直接找到,谁有兴趣可以用CRACK CODE做一个.写过程真是难受,不过看到TOYE那么忙还在整理资料,回答问题我写着就甘心多了.....哈哈.....

标 题:贴个crackcode的ini先。 (155字)
发信人:真.hp
时 间:2001-5-14 13:01:55
详细信息:

[Options]
CommandLine=iris.exe
Mode=0
First_Break_Address=425AF7
First_Break_Address_Code=8A
First_Break_Address_Code_Lenth=2
Save_Code_Address=EAX

标 题:按用户名+公司名（以8位补齐）依次以八位进行计算，用到上面提到的那个1800长的表，经过上百次的异或，或，... (251字)
发信人:伪装者[BCG]
时 间:2001-5-15 1:36:59
详细信息:

标题: 按用户名+公司名（以8位补齐）依次以八位进行计算，用到上面提到的那个1800长的表，经过上百次的异或，或，与，将用户名转换成另一种形式的用户名+公司名，然后好象就简单了~比较难的是426e30到4270A7的那个CALL（我觉得太烦了），后面的就比较正常了~~

内容:


Ize 2.04 from Gadgetware

 标 题:再贴一篇，进阶篇，比上面那个难一些！！ (6千字)
发信人:TAE!
时 间:2001-7-19 11:20:48
详细信息:
原著：raZZia
翻译：TAE![CCG]
软件 2: Ize 2.04 from Gadgetware
Ize from Gadgetware 是一个聪明得小程序，它放了一双眼睛在你的屏幕上，
它会跟着你的鼠标得，它有输入姓名和注册码得注册功，对付这个软件得策略
仍然和上面一个相同:找出我们输入的数据在内存中的地址。

步骤 1: 运行 Ize。 选择注册并输入名字和注册码，我用的是：“razzia”
和“12345”

步骤 2: 进入 (CTRL-D) Softice 并且在 GetDlgItemTextA 上设置断点。

步骤 3: 离开 SoftIce 并且点击 OK。这将带你回到 Softice。你将回到函数
GetDlgItemTextA 中。按 F11 离开函数，你将看到以下代码：

mov esi, [esp + 0C]
push 00000064
push 0040C3A0 ;<--我们的姓名被存放到内存中的这个地方！
mov edi, [USER32!GetDlgItemTextA] ;<-- edi 载入一个地址 GetDlgItemTextA
push 00004EE9
push esi
call edi ;<-- 执行 GetDlgItemTextA
push 00000064 ;<-- (你应该在这里)
push 0040C210 ;<--我们输入的注册码将被放在这里
push 00004EEA
push esi
call edi ;<-- 再次执行 GetDlgItemTextA

我们看见在这个代码段中函数 GetDlgItemTextA 被呼叫了两次，第一次的Call已经
执行，用 ED 40C3A0 命令我们可以看到我们在内存中的名字。

我们跟着程序来读取输入的注册码把，键入 G 并且回车，现在，我们再一次回到函数
GetDlgItemTextA 中现在按F11离开这里，我们看看内存 40C210 中有啥，哦，是我们
输入的注册码！

现在我们知道我们输入的名字和注册码被放到哪里了，我们把这些记下来！

步骤 4: 好的, 下一步呢？我们已经知道了名字和假注册码被放在哪里了，我们需要
找出程序用这些数据干了什么，通常我们需要下断点来找出程序的那些地方读取了这
些数，可是在这里却不需要。
看看以下代码段:

push 0040C210 ;<--保存我们输入的注册码 (作为下面那个Call的参数)
call 00404490 ;<--这个CALL是干什么的呢？
add esp, 00000004
mov edi, eax ;<-- 保存 EAX (hmmmm)

我们进如Call看看它究竟做了什么，但那是不必的，依你经验来猜猜看这个Call是干什么
的？它计算假注册码放入了 EAX。我们继续按 F10直到我们通过了CAll并且看看 EAX 中
的内容，用 ？EAX 命令，在我这里它显示：00003039 0000012345 "09"。

知道了 EDI 是我们的注册码，那么我们继续：

push 0040C3A0 ;<-- 保存我们输入的名字 (作为下个Call的参数)
push 00409080 ;<-- 保存我们未知的内存地址 (作为下个Call的参数)
call 004043B0 ;<-- 执行我们未知的函数
add esp, 00000008
cmp edi, eax ;<--比较 EDI (我们输入的注册码) 和 EAX (未知）
jne 004018A1 ;<--如果不同就跳

我们看见那个CALL有两个入口参数。一个是我们输入名字的地址，另一个我们还不知道是什么，
但我们可以用ED 409080 找到它。我们看见文本‘Ize’。这个函数使用这两个参数计算正确的
注册码，如果你仅仅想破解它，那么你只需要在Call后面设置断点，然后查看EAX的值就可以了
它将显示出正确的注册码来，但我们想知道它是如何计算出注册码的，所以我们跟踪到函数内部
之后，我们将在那儿试着找到 EAX 的内容。

步骤 5: 一旦进入了有趣的函数你将发现一段相当长的执行过程。对我们来说是不需要的，不需
要列出完整的CALL清单，因为这对我们做注册码来说根本不需要。

但是一旦找出哪一部分是对我们计算注册码所必要的时候，你就应该一步步的跟踪它，并且仔细
的把它记下来！

在做了这些以后，我们发现函数的第一部分计算出一些“Key”，之后这些“key”被保存在内存
中并且带入了函数的第二部分。

函数的第二部分计算出正确的注册码，但这是基于“Key”和我们输入的名字的！

下面的代码是我们作出注册机所必要的：

(在跟踪下面代码之前不要忘了记录，使用到的寄存器是下面几个：EBX指向我们输入名字的第一
个字母，EDX 是 0，EBP 是 0，至于“key”我们说得简单些，它存放在内存地址 0040B828 中，
它最初的值是 0xA4CC )

:00404425 movsx byte ptr edi, [ebx + edx] ;<-- 把名字的第一个字母放入 EDI
:00404429 lea esi, [edx+01] ;<-- ESI 是字母所在的位数 "letter-number"
:0040442C call 00404470 ;<-- 一个Call
:00404431 imul edi, eax ;<-- EDI=EDI*EAX (EAX是上面那个CAll返回的一个值)
:00404434 call 00404470 ;<-- 又Call了
:00404439 mov edx, esi
:0040443B mov ecx, FFFFFFFF
:00404440 imul edi, eax ;<-- EDI=EDI*EAX (EAX是上面那个call返回的一个值)
:00404443 imul edi, esi ;<-- EDI=EDI*ESI (ESI 是字母所在的位数)
:00404446 add ebp, edi ;<-- EBP=EBP+EDI (注意 EBP 最后将是我们正确的注册码)
:00404448 mov edi, ebx ;<--这几行计算我们输入名字的长度
:0040444A sub eax, eax ;<--这几行计算我们输入名字的长度
:0040444C repnz ;<--这几行计算我们输入名字的长度
:0040444D scasb ;<--这几行计算我们输入名字的长度
:0040444E not ecx ;<--这几行计算我们输入名字的长度
:00404450 dec ecx ;<-- ECX 现在已经是我们名字的长度了
:00404451 cmp ecx, esi
:00404453 ja 00404425 ;<-- 如果不是最后一个字母，继续循环
:00404455 mov eax, ebp ;<-- 将 EBP 存入 EAX ！！！！
:00404457 pop ebp
:00404458 pop edi
:00404459 pop esi
:0040445A pop ebx
:0040445B ret

去看看那个CALL是干什么的！

:00404470 mov eax, [0040B828] ;<-- "key" 放入 EAX
:00404475 mul eax, eax, 015A4E35 ;<-- EAX=EAX * 15A4E35
:0040447B inc eax ;<-- EAX=EAX + 1
:0040447C mov [0040B828], eax ;<-- 用EAX中的值代替 "key"
:00404481 and eax, 7FFF0000 ;<-- EAX=EAX && 7FFF0000
:00404486 shr eax, 10 ;<-- EAX=EAX >>10
:00404489 ret

上面的循环代码对我们输入名字的所有字母进行了操作。每个字母计算出了一些值，所有的这些
值相加到 EBP 中，之后这个值放入了 EAX，并且函数返回 EAX，那就是我们要找的，我们要知道
的是 EAX 是如何得到这个值的！

步骤 6: 可以做注册机了，我们把上面那段计算注册码的代码翻译为 C 语言吧！
下面就是注册机代码： (注意：我是一个差劲的 C 程序员 :)

#include <stdio.h>
#include <string.h>
main() {
char Name[100];
int NameLength,Offset;
unsigned long Letter,DummyA;
unsigned long Key = 0xa4cc;
unsigned long Number = 0;
printf("Ize 2.04 crack by razzia\n");
printf("Enter your name: ");
gets(Name);
NameLength=strlen(Name);
for (Offset=0;Offset<NameLength;Offset=Offset+1) {
Letter=Name[Offset];
DummyA=Key;
DummyA=DummyA*0x15a4e35;
DummyA=DummyA+1;
Key=DummyA;
DummyA=DummyA & 0x7fff0000;
DummyA=DummyA >> 0x10;
Letter=Letter*DummyA;
DummyA=Key;
DummyA=DummyA*0x15a4e35;
DummyA=DummyA+1;
Key=DummyA;
DummyA=DummyA & 0x7fff0000;
DummyA=DummyA >> 0x10;
Letter=Letter*DummyA;
Letter=Letter*(Offset+1);
Number=Number+Letter;
}
printf("\nYour registration number is : %lu\n",Number);
}


Jammer1.95

标 题:注册你的Jammer1.95 (4千字)
发信人:zombieys
时 间:2001-4-11 14:30:47
详细信息:
注册你的Jammer1.95

软件名称：JAMMER 1.95
软件主页：http://www.Agnitum.com
主要功能：端口/注册表/进程监视器，能反馈扫描者的ip和isp
主要目的：寻找自己的注册码
破解难度：非常简单(适合初学者)

正规方法：选注册填自己的大名(长度大于等于8)，注册码1随便填，注册码2填78787878,进s-ice下s 30:0 l ffffffff '78787878',下bpm "搜到的地址",按f5返回,点注册被拦到，按几次f12知道进入jammer领空，再按几次f10到这里

:0041BE67 E8E8480000 Call 00420754
:0041BE6C 33C9 xor ecx, ecx
:0041BE6E 394DE0 cmp dword ptr [ebp-20], ecx
:0041BE71 0F8452010000 je 0041BFC9
:0041BE77 837DE408 cmp dword ptr [ebp-1C], 00000008 //用户名应大于等于8位
:0041BE7B 0F8C48010000 jl 0041BFC9
:0041BE81 83FF0A cmp edi, 0000000A //注册码应大于等于10位
:0041BE84 0F8C3F010000 jl 0041BFC9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041BEE0(C)
|
:0041BE8A 8B4664 mov eax, dword ptr [esi+64]
:0041BE8D 8D7901 lea edi, dword ptr [ecx+01]
:0041BE90 8A1408 mov dl, byte ptr [eax+ecx]
:0041BE93 2BC1 sub eax, ecx
:0041BE95 8855F3 mov byte ptr [ebp-0D], dl
:0041BE98 8B55E4 mov edx, dword ptr [ebp-1C]
:0041BE9B 8BCF mov ecx, edi
:0041BE9D 8A4410FF mov al, byte ptr [eax+edx-01]
:0041BEA1 0FAFCF imul ecx, edi
:0041BEA4 0FBED0 movsx edx, al
:0041BEA7 0355E0 add edx, dword ptr [ebp-20]
:0041BEAA 0FBE45F3 movsx eax, byte ptr [ebp-0D]
:0041BEAE 03D1 add edx, ecx
:0041BEB0 B9FF000000 mov ecx, 000000FF
:0041BEB5 03C2 add eax, edx
:0041BEB7 33D2 xor edx, edx
:0041BEB9 F7F1 div ecx
:0041BEBB 0FB6C2 movzx eax, dl
:0041BEBE 50 push eax
:0041BEBF 8D45EC lea eax, dword ptr [ebp-14]

* Possible StringData Ref from Data Obj ->"%0.2X"
|
:0041BEC2 68940B4300 push 00430B94
:0041BEC7 50 push eax

* Reference To: MFC42.Ordinal:0B02, Ord:0B02h
|
:0041BEC8 E8F94B0000 Call 00420AC6
:0041BECD 83C40C add esp, 0000000C
:0041BED0 8D45EC lea eax, dword ptr [ebp-14]
:0041BED3 8BCB mov ecx, ebx
:0041BED5 50 push eax

* Reference To: MFC42.Ordinal:03AB, Ord:03ABh
|
:0041BED6 E8F14E0000 Call 00420DCC
:0041BEDB 8BCF mov ecx, edi
:0041BEDD 83F905 cmp ecx, 00000005 //计算用户名生成串
:0041BEE0 7CA8 jl 0041BE8A //以上是写注册机要看的:)
:0041BEE2 FF7668 push [esi+68]
:0041BEE5 FF33 push dword ptr [ebx]

* Reference To: MSVCRT.strcmp, Ord:02B8h
|
:0041BEE7 E88E520000 Call 0042117A //比较注册码与用户名生成串
:0041BEEC 59 pop ecx
:0041BEED 85C0 test eax, eax //返回0注册成功
:0041BEEF 59 pop ecx
:0041BEF0 7407 je 0041BEF9 //跳则注册码正确
:0041BEF2 6A00 push 00000000
:0041BEF4 E9D1000000 jmp 0041BFCA //瞎填去死(作者语)

我们来看看它算出的注册码吧:)
0041BEE7 E88E520000 Call 0042117A
进入
42117a jmp [425918]
当走到
780047f2 mov eax,[edx] //下d edx可以看到你的注册码了luck^^
注意这是在MSVCRT!text+37D7的地盘，其余的均在JAMMER的领空

完活:)good luck

部分注册码:
zombieys
000001-EFEDDCDCE5

=ION=zombieys
000001-B2C7BEC8B9

=ION=mummy
000001-B8BBC6D4C4

———————————————————————————————>
      .-"　　　"-. Cracked by zombieys >
/　　　　　　\ My oicq is 1789655 >
|　　　　　　　| My hp is zombieys.yeah.net>
   |,　.-.　.-.　,| My hp is zombieys.126.com >
|)(__/　\__)(| >
|/　　/\　　\| Thanks for your supports >
(@_@) (_　　^^　　_) >
_ )\_______\__|IIIIII|__/_____ >
_)@8@8{}<________|-\IIIIII/-|____zombieys_____________________>


jetcar0.91

 标 题:jetcar0.91
发信人:sCYB
时 间:2000-11-30 17:51:22
详细信息:
***********************************
* jetcar0.91目前最新的版本： *
***********************************
这个东西的注册检验部分一直没变，注册信息放在注册表中，
每次启动时判断注册码是否正确。
在trw中
:bpx RegQueryValueExA do "d *(esp+8)"

当你看到程序在读name,和password时，就要用F10慢慢跟了，因为
已经离目标不远了^_^。
:004132F4 MOV EAX,[ESP+0C] //你输入的注册码
:004132F8 MOV ECX,[ESP+14]　　　//正确的注册码
:004132FC PUSH EAX
.......(注册码比较)..略

这个程序不能用W32Dasm来反汇编，给初手制造了一些麻烦，
所以POST此文。最后想问问大家知道它用什么手段来防w32dasm？

                        sCYB[CCG]
2000.11.30


JPEG Optimizer Version 3.00

标 题:我的破解心得(8) (2千字)
发信人:chcw
时 间:2001-3-13 18:09:21
详细信息:
破解程序：
JPEG Optimizer Version 3.00 For Windows

破解工具：
SoftICE 3.0 For Windows 95
Ultra Edit 5.0

破解者：
chcw

JPEG Optimizer的注册只需要输入一个注册码即可，采用这种注册方式的程序一般都比较容易破解。

1. 用SoftICE将JPEGOPT.EXE程序载入。
2. 选择Help/Register打开注册对话框，并输入注册码9530109。
3. 按Ctrl-D，进入SoftICE窗口中，由于程序通常要用hmemcpy函数将输入注册对话框的注册码复制到
程序自己的数据区中，因此我们就对hmemcpy设置断点：
BPX hmemcpy
4. 按Ctrl-D，回到Jpeg Optimizer的注册窗口中，按"OK"键，触发SoftICE，执行光带停留在函数
hmemcpy的启始处：
KERNEL!HMEMCPY
0117:9E30 PUSH BP
从此处开始连续按F10键，直到跳出系统模块，回到程序Jpeg Optimizer中：
0137:00431D86 CALL 0044B2AC
0137:00431D8B MOV WORD PTR[EBP-28], 0008
0137:00431D91 MOV WORD PTR[EBP-28], 0020
5. 键入BC *清除原先的断点。继续按F10，直到以下语句处：
0137:00431DB2 LEA EAX, DWORD PTR [EBP-08]
键入dd ds:eax，得到ds:eax指针所指的数据：
013F:006EF5F4 00C1859C xxxxxxxx xxxxxxxx xxxxxxxx
再键入db ds:00C1859C, 得到以下数据：
013F:00C1859C 39 35 33 30 31 30 39 xx xx xx xx xx xx xx xx xx 9530109
看来eax是指向注册码RegCode的双重指针，接下来的函数，很可能与注册码有关：
0137:00431DB5 CALL 004521FE
0137:00431DBA CMP EAX, 00000006
按F10，执行完0137:00431DB5 CALL 004521FE处的函数调用，发现EAX==7且呈高亮。回想我们输
入的注册码的长度刚好为7，而在执行完上述调用之后，立即有一句比较语句CMP EAX, 00000006。
看来函数004521FE的功能是取得注册码的长度，而程序要求的正确的注册码的长度应该为6。
6. 在0137:00431DBA处双击鼠标，设置断点。然后按Ctrl-D，回到Jpeg Optimizer的注册窗口，将注册
码改为六位数字530109，再按按"OK"键，触发SoftICE，连续按F10，到0137:00431DC8处：
0137:00431DBA CMP EAX, 00000006 <-触发SoftICE后亮条所在处
0137:00431DBD JNE 00431DD2
0137:00431DBF LEA EAX, DWORD PTR [EBP-04] ; eax是指向注册码RegCode的双重指针
0137:00431DC2 CALL 00405DA4 ; 取得RegCode的地址
0137:00431DC7 PUSH EAX ; eax是指向注册码RegCode的指针
0137:00431DC8 CALL 00432C4B <-按F10直到此处
0137:00431DCD POP ECX
0137:00431DCE TEST AL, AL ; 判断AL是否为0
0137:00431DD0 JNE 00431DD6 ; 若不为0，则跳转。
7. 注意到在执行0137:00431DC8处的调用CALL 00432C4B后，根据返回值的不同，程序将进行跳转，所以有必要
分析一下子函数0137:00431DC8。按F8，进入此函数，然后连续按F10键：
0137:00432C4B PUSH EBP ; 程序入口点
...
0137:00432C8A PUSH EAX ; 将RegCode[0]地址压栈
0137:00432C8B CALL 004787B8 ; 将RegCode[0]转换为大写，并放在EAX中返回
0137:00432C90 POP ECX
0137:00432C91 CMP EAX, 0000005A ; RegCode[0]=='Z'?
0137:00432C94 JNE 00432CDA ; 不是则跳转
.
.
.
0137:00432CC1 MOVSX ECX, BYTE PTR [EBP-03] ; 将RegCode[5]地址压栈
0137:00432CC5 CMP ECX, 00000031 ; RegCode[5]=='1'?
0137:00432CC8 JNE 00432CDA ; 不是则跳转
很显然，从0137:00432C91到0137:00432CC8的一段比较/跳转语句就是程序在比较注册码，将每个比较语句
中判断的16进制码收集起来是：
5A 49 31 37 38 31
用UltraEdit转换一下就得到注册码的ASCII值：
RegCode="ZI1781"


KanjiWeb 3.0 (汉字通)

标 题:初级~~初级~~~初初级~~~KanjiWeb 3.0 (汉字通)破解~~~~~~~~~ (8千字)
发信人:Sam.com
时 间:2001-3-11 0:31:30
详细信息:
初级~~初级~~~初初级

软件名称：KanjiWeb 3.0 (汉字通)--台湾出的多语言支持软件，任何Windows 无需汉字版本，均可读写简体中文、
繁体中文、日文。大小：1812KB 安装后也只有 2920KB(自带11种输入法)
下载地址： ftp.s2net.org.tw/pub/kanjiweb 这两个是官方网址，这软件到处都是，搜索一下吧，我不记得地址啦
Http://kanjiweb.com
注册形式：在Register菜单里有个REGISTERED NO:1242637882(我这里是这个数，每次安装都不同)，按Register鍵
程序要求输入Serial No。程序肯定要用到上边这个数来运算的，到底是如何呢？？？
破解原因：这个程序我一直都在用，因为我台电脑很低级(和我一样)MMX166而已，这个小软件就很合适我用啦，虽然
它的字库不够大，但也足够应付啦，另外它很稳定，我的电脑用其它类似的软件在某些时候一定会出错，用
这个就绝对没事。其实这个软件我一早就破掉啦，在网上找的时候看到别人留下的SN，抄下一用，错的!看
来这个RN是重点，这软件很容易破，看下面的代码就知道啦，所以我当时只花了几分钟就搞掂了，但却没有
把过程记下来，而且我想为这个简单的东西做个注册机，于是有了这篇文章。但为此我却要重新安装它，因 为我根本找不到它的已注册标志在哪，有谁找到请指点一二。

下面有两种方法可以注册成功：一是找到注册码；二是半暴力破解(不用真正改动程序本身，只用改一次内存里的代码就OK啦)，大家自己选择(我是完美主义追求者，尽量不用暴力)，好啦请先从39EC处看起，因为这里是我最先发现的要害(请跟着我的思路走因为我是从后面往前找的)。另外这个程序是16位的，有点落后的感觉，调试时很不习惯。

:0001.39B4 8D8626FE lea ax, [bp+FE26]
:0001.39B8 16 push ss
:0001.39B9 50 push ax
:0001.39BA FF76F6 push word ptr [bp-0A]
:0001.39BD 9AEE07093A call 0001.07EE<----此call是运算RN的地方，但~~~~~唉~调用了系统call
:0001.39C2 83C408 add sp, 0008
:0001.39C5 8DB626FE lea si, [bp+FE26]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.39D3(C)
|
:0001.39C9 803486 xor byte ptr [si], 86<---此处用86 xor 内存[si]里的数就得到真码啦
-------------------------------------------------------------------------------------------------
2.....此时我内存里的数是：B7 CC C9 C9 DF D0 C7 DF F4每位数与86相xor就得到了一个共9位的注册码，真码就放在[si]中替代了上面的这些数。我想这几个数一定是根据那个REGISTERED NO运算得来的，那如果找到了程序是如何运算那个RN的不就可以写出注册机啦吗？我用了个蠢办法来确定，我重新注册，当然是填入假注册码，因为我还不想它注册成功，然后中断，d刚才[si]的地方然后一直按F10，当经过39BD这个call后[si]就被写上以上的数据啦，但是当我跟进去的时候发现程序调用了call KERNEL.DOS3CALL这个call来运算以上数据的这个怎么跟呢，我在此就被阻了，这里请高手指点~~~~~~
-------------------------------------------------------------------------------------------------
:0001.39CC 46 inc si
:0001.39CD 8D862FFE lea ax, [bp+FE2F]
:0001.39D1 3BF0 cmp si, ax
:0001.39D3 72F4 jb 39C9
:0001.39D5 8DBE26FE lea di, [bp+FE26]
:0001.39D9 8D76B6 lea si, [bp-4A]
:0001.39DC 8CD1 mov cx, ss
:0001.39DE 8EC1 mov es, cx
:0001.39E0 B9FFFF mov cx, FFFF
:0001.39E3 33C0 xor ax, ax
:0001.39E5 F2 repnz
:0001.39E6 AE scasb
:0001.39E7 F7D1 not cx
:0001.39E9 2BF9 sub di, cx
:0001.39EB F3 repz
:0001.39EC A6 cmpsb <----比较注册码的地方，这条语句很明显吧!!
-------------------------------------------------------------------------------------------------
1......调试时一样是用bpx hmemcpy，bd，pmodule来到程序领空(这里不能直接设bpx 39EB，因为程序是16位的，16位的程序地址是这样的：前面部分是段地址，后面部分是偏移地址，而段地址不是固定的，所以要用bpx hmemcpy来做个桥梁才能找到程序的领空---我这样说对吗？？)，一直按F10想看它几时出错，谁知走到此处我就停下来啦，因为这条语句太刺眼啦，好啦马上d ds:si看到了我输入的67676767，再d ds:di就可以看到真的注册码1JOOYVAYb啦，试一试~~~~Ok啦~~~当然因为我想做个注册机，所以要研究那个真注册码是怎么来的啦:-)于是往上看39C9处有可疑哟~~~~~
-------------------------------------------------------------------------------------------------
:0001.39ED 7405 je 39F4
:0001.39EF 1BC0 sbb ax, ax
:0001.39F1 1DFFFF sbb ax, FFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.39ED(C)
|
:0001.39F4 0BC0 or ax, ax
:0001.39F6 7542 jne 3A3A <----看这个call如果它不跳的话下面会不会还有呢？？
-------------------------------------------------------------------------------------------------
4.....把它改成je 3A3A就不会跳啦，往下运行就注册成功了，但要退出程序再次进入才行，这时Register菜单就灰掉啦，程序作了标记，但我找不到!!!不过说真的我到现在都还不知道此软件如果不注册的话会有什么限制~~~~~呵呵~~~破了再说~~~~~~~
-------------------------------------------------------------------------------------------------
:0001.39F8 C646FBFF mov byte ptr [bp-05], FF
:0001.39FC 33F6 xor si, si
:0001.39FE 56 push si
:0001.39FF 66FF76FC push word ptr [bp-04]
:0001.3A03 FF76F6 push word ptr [bp-0A]
:0001.3A06 9A1A071B3A call 0001.071A
:0001.3A0B 83C408 add sp, 0008
:0001.3A0E 6A04 push 0004
:0001.3A10 8D46EE lea ax, [bp-12]
:0001.3A13 16 push ss
:0001.3A14 50 push ax
:0001.3A15 FF76F6 push word ptr [bp-0A]
:0001.3A18 9A66092D3A call 0001.0966
:0001.3A1D 83C408 add sp, 0008
:0001.3A20 6A01 push 0001
:0001.3A22 8D46FB lea ax, [bp-05]
:0001.3A25 16 push ss
:0001.3A26 50 push ax
:0001.3A27 FF76F6 push word ptr [bp-0A]
:0001.3A2A 9A6609413A call 0001.0966
:0001.3A2F 83C408 add sp, 0008
:0001.3A32 EB1F jmp 3A53 <----上面那个call如果不跳的话就只有这个啦，而且还是一定
会跳的，跳到了出错信息的后面去啦，上面的call就是要
害啦，往上去改掉它

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.3937(C)
|
:0001.3A34 8B76F8 mov si, [bp-08]
:0001.3A37 EB34 jmp 3A6D

:0001.3A39 90 nop

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.39F6(C) <------从此处跳过来的~~~往上找此行
|
:0001.3A3A BE0100 mov si, 0001
:0001.3A3D FF760E push word ptr [bp+0E]
:0001.3A40 68473A push SEG ADDR of Segment 0001

* Possible StringData Ref from Code Seg 001 ->"SORRY !! ERROR SERIAL NO"<----出错信息!!!
-------------------------------------------------------------------------------------------------
3.....其实现在此软件已破掉了，现在说说用W32dasm来破解吧，相对来说应该容易一点。上面这个出错信息可以在W32dasm里的数据串里找到，只有一个地方。要想程序避开此处就要往前找啦
-------------------------------------------------------------------------------------------------
|
:0001.3A43 68E45E push 5EE4
:0001.3A46 685D3A push SEG ADDR of Segment 0001

* Possible StringData Ref from Code Seg 001 ->"ERROR !!"
|
:0001.3A49 68DA5E push 5EDA
:0001.3A4C 6A00 push 0000
:0001.3A4E 9A04170000 call USER.MESSAGEBOX

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.3A32(U)
|
:0001.3A53 66FF76F2 push word ptr [bp-0E]
:0001.3A57 FF76F6 push word ptr [bp-0A]
:0001.3A5A 9ADC11683A call 0001.11DC
:0001.3A5F 83C406 add sp, 0006
:0001.3A62 FF76F6 push word ptr [bp-0A]
:0001.3A65 9AC6105D38 call 0001.10C6
:0001.3A6A 83C402 add sp, 0002

24:07 2001-3-10


KingCopy 2.5 Beta

 标 题:拷贝王KingCopy 2.5 Beta (简单) (6千字)
发信人:天要下雨
时 间:2001-7-4 21:39:35
详细信息:
拷贝王KingCopy 2.5 Beta (简单)

软件名称： KingCopy 2.5 Beta（879KB）
运行平台： Win9x/Me/NT/2000
软件简介： KingCopy是一款优越的应用于文件复制、备份、修复的实用工具。具有速度快、人工智能度高特点，结合到资源管理器的右键菜单，能大大地简化平常的文件复制操作。具有较高的文件读取及纠错能力，能读取软盘上损坏的文件，并能对损坏的文件进行修复，恢复重要的数据。具有的文件断点续拷。

这是一VB5程序，在winice.dat装载：EXP=c:\windows\system\msvbvm50.dll。

破解工具：SoftICE4.05
破解时间：2001.6.1

输入注册名：[CCG]
输入注册码：12324567890

bpx hmemcpy

..................
0167:00463BBA PUSH ECX
0167:00463BBB CALL [MSVBVM50!rtcTrimBstr]
0167:00463BC1 MOV EDX,EAX
0167:00463BC3 LEA ECX,[EBP-1C]
0167:00463BC6 CALL [MSVBVM50!__vbaStrMove]
0167:00463BCC LEA ECX,[EBP-24]
0167:00463BCF CALL [MSVBVM50!__vbaFreeStr]
0167:00463BD5 LEA ECX,[EBP-34]
0167:00463BD8 CALL [MSVBVM50!__vbaFreeObj]
0167:00463BDE MOV EDX,[EBP+08]
0167:00463BE1 MOV EBX,[ESI+00000304]
0167:00463BE7 PUSH EDX
0167:00463BE8 CALL EBX
0167:00463BEA PUSH EAX
0167:00463BEB LEA EAX,[EBP-34]
0167:00463BEE PUSH EAX
0167:00463BEF CALL [MSVBVM50!__vbaObjSet]
0167:00463BF5 MOV ESI,EAX
0167:00463BF7 LEA EDX,[EBP-24]
0167:00463BFA PUSH EDX
0167:00463BFB PUSH ESI
0167:00463BFC MOV ECX,[ESI]
0167:00463BFE CALL [ECX+000000A0]
0167:00463C04 TEST EAX,EAX
0167:00463C06 JGE 00463C1A
0167:00463C08 PUSH 000000A0
0167:00463C0D PUSH 004110A4
0167:00463C12 PUSH ESI
0167:00463C13 PUSH EAX
0167:00463C14 CALL [MSVBVM50!__vbaHresultCheckObj]
0167:00463C1A MOV EAX,[EBP-24]
0167:00463C1D PUSH EAX
0167:00463C1E CALL [MSVBVM50!rtcTrimBstr]
0167:00463C24 MOV EDX,EAX
0167:00463C26 LEA ECX,[EBP-20]
0167:00463C29 CALL [MSVBVM50!__vbaStrMove]
0167:00463C2F LEA ECX,[EBP-24]
0167:00463C32 CALL [MSVBVM50!__vbaFreeStr]
0167:00463C38 LEA ECX,[EBP-34]
0167:00463C3B CALL [MSVBVM50!__vbaFreeObj]
0167:00463C41 MOV ECX,[EBP-1C]
0167:00463C44 MOV ESI,[MSVBVM50!__vbaStrCmp]
0167:00463C4A PUSH ECX
0167:00463C4B PUSH 0040BDFC
0167:00463C50 CALL ESI 检测是否输入了注册名。
0167:00463C52 TEST EAX,EAX
0167:00463C54 JNZ 00463CEC
0167:00463C5A MOV EBX,[MSVBVM50!__vbaVarDup]
0167:00463C60 MOV ECX,80020004
0167:00463C65 MOV [EBP-70],ECX
0167:00463C68 MOV EAX,0000000A
0167:00463C6D MOV [EBP-60],ECX
0167:00463C70 MOV ESI,00000008
0167:00463C75 LEA EDX,[EBP-0098]
...................

...................
0167:00463CEC MOV ECX,[EBP-20]
0167:00463CEF PUSH ECX
0167:00463CF0 PUSH 0040BDFC
0167:00463CF5 CALL ESI 检测是否输入了注册码。
0167:00463CF7 TEST EAX,EAX
0167:00463CF9 JNZ 00463DCA
0167:00463CFF MOV EDI,[MSVBVM50!__vbaVarDup]
0167:00463D05 MOV ECX,80020004
0167:00463D0A MOV [EBP-70],ECX
0167:00463D0D MOV EAX,0000000A
0167:00463D12 MOV [EBP-60],ECX
.............

...............
EAX=00481B50 EBX=799BC350 ECX=006AEA20 EDX=0048001C ESI=798CF8F6
EDI=799BC358 EBP=006AEA34 ESP=006AE954 EIP=00463DD3 o d I s Z a P c
CS=0167 DS=016F SS=016F ES=016F FS=0F5F GS=0000
==================================================byte==============PROT========
016F:00481B50 4B 00 43 00 32 00 35 00-2D 00 37 00 44 00 34 00 K.C.2.5.-.7.D.4.
016F:00481B60 33 00 34 00 34 00 37 00-37 00 37 00 00 00 46 00 3.4.4.7.7.7...F.
016F:00481B70 2A 00 64 00 33 00 35 00-00 00 00 00 28 00 00 A0 *.d.3.5.....(...
016F:00481B80 90 A6 F4 7F F4 D4 48 00-04 00 00 00 20 00 00 00 .....H..... ...
==========================================================================ROT32

0167:00463DC5 JMP 0046446B
0167:00463DCA MOV ECX,[EBP-1C] <=D ECX,输入的注册名。 
0167:00463DCD PUSH ECX
0167:00463DCE CALL 0042F910 <=注册码运算核心
0167:00463DD3 MOV EDX,EAX <=D EAX,可以看到正确的注册码。
0167:00463DD5 LEA ECX,[EBP-24]
0167:00463DD8 CALL [MSVBVM50!__vbaStrMove]
0167:00463DDE MOV EDX,[EBP-20]
0167:00463DE1 PUSH EAX
0167:00463DE2 PUSH EDX
0167:00463DE3 CALL ESI
0167:00463DE5 MOV EBX,[MSVBVM50!__vbaFreeStr]
0167:00463DEB MOV ESI,EAX
0167:00463DED NEG ESI
0167:00463DEF SBB ESI,ESI
0167:00463DF1 LEA ECX,[EBP-24]
0167:00463DF4 INC ESI
0167:00463DF5 NEG ESI
0167:00463DF7 CALL EBX
0167:00463DF9 TEST SI,SI
0167:00463DFC JZ 004642E0
0167:00463E02 MOV EAX,[EBP-18] 
0167:00463E05 TEST EAX,EAX  
====================================KINGCOPY!.text+00062DC5====================

:pagein n xia1.txt

PAGEIN address Kingcopy

走到0167:00463DD3 就可以看见正确的注册码。

整理一下：

注册名：[CCG]
注册码：KC25-7D4344777

China Cracking Group
2001.06.20


KoolMoves V1.33

 标 题:献给初学者(高手也点评点评!!)KoolMoves V1.33的破解！！ (10千字)
发信人:gcehi
时 间:2000-9-16 13:38:42
详细信息:
献给出学者的KoolMoves V1.33(简单)
简介：和flash一样的动画软件(不错，比flash启动快多了)
下载地址:
现在我也是很少再破解软件了。毕竟没有时间了(学习要紧)，现在又想玩动画，所以拿来试手，哈哈
!!!!!(可恶的记事本，颜色都没有!)!!!!!!!
欢迎光临：http://www.luosz.cn.gs

破解过程如下：
添入：gce (随便添)
1234567890(要10位，后5位可以随便添，看完就知道了，会分解的!)
使用bpx hmemcpy后拦下来，用pmodule+F10或F12 22下来到
:0048D757 8D8DE0FDFFFF lea ecx, dword ptr [ebp+FFFFFDE0]
:0048D75D 51 push ecx
:0048D75E 8D4DEC lea ecx, dword ptr [ebp-14]
:0048D761 E846E70500 call 004EBEAC
:0048D766 C745FC00000000 mov [ebp-04], 00000000
:0048D76D 6800020000 push 00000200
:0048D772 8D95E0FDFFFF lea edx, dword ptr [ebp+FFFFFDE0]
:0048D778 52 push edx
:0048D779 8B8DBCFDFFFF mov ecx, dword ptr [ebp+FFFFFDBC]
:0048D77F 81C198000000 add ecx, 00000098
:0048D785 E851310600 call 004F08DB
:0048D78A 8D85E0FDFFFF lea eax, dword ptr [ebp+FFFFFDE0]
:0048D790 50 push eax
:0048D791 8D4DE8 lea ecx, dword ptr [ebp-18]
:0048D794 E813E70500 call 004EBEAC
:0048D799 C645FC01 mov [ebp-04], 01
:0048D79D E8DE60F8FF call 00413880
:0048D7A2 8985D8FDFFFF mov dword ptr [ebp+FFFFFDD8], eax
:0048D7A8 8D4DE4 lea ecx, dword ptr [ebp-1C]
:0048D7AB E8C046FAFF call 00431E70
:0048D7B0 C645FC02 mov [ebp-04], 02
:0048D7B4 8D4DE8 lea ecx, dword ptr [ebp-18]
:0048D7B7 51 push ecx
:0048D7B8 8D4DE4 lea ecx, dword ptr [ebp-1C]
:0048D7BB E88B040000 call 0048DC4B
:0048D7C0 8985DCFDFFFF mov dword ptr [ebp+FFFFFDDC], eax
:0048D7C6 83BDDCFDFFFF00 cmp dword ptr [ebp+FFFFFDDC], 00000000
:0048D7CD 0F8418010000 je 0048D8EB

:0048D8EB C745F000000000 mov [ebp-10], 00000000
:0048D8F2 8D45F0 lea eax, dword ptr [ebp-10]
:0048D8F5 50 push eax
:0048D8F6 8D4DE8 lea ecx, dword ptr [ebp-18]
:0048D8F9 51 push ecx
:0048D8FA 8D55EC lea edx, dword ptr [ebp-14]
:0048D8FD 52 push edx
:0048D8FE 8D4DE4 lea ecx, dword ptr [ebp-1C]
:0048D901 E890040000 call 0048DD96 ------------------可看出此call为比较注册码的地方
:0048D906 8945E0 mov dword ptr [ebp-20], eax (因为下面的跳到注册错误的地方 )
:0048D909 837DF000 cmp dword ptr [ebp-10], 00000000
:0048D90D 7537 jne 0048D946 ---------------------跳了就完蛋!!
:0048D90F 8B8DBCFDFFFF mov ecx, dword ptr [ebp+FFFFFDBC]
:0048D915 E86DF50500 call 004ECE87
:0048D91A C645FC01 mov [ebp-04], 01
:0048D91E 8D4DE4 lea ecx, dword ptr [ebp-1C]
:0048D921 E85A45FAFF call 00431E80
:0048D926 C645FC00 mov [ebp-04], 00
:0048D92A 8D4DE8 lea ecx, dword ptr [ebp-18]
:0048D92D E80CE50500 call 004EBE3E
:0048D932 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0048D939 8D4DEC lea ecx, dword ptr [ebp-14]
:0048D93C E8FDE40500 call 004EBE3E
:0048D941 E94D010000 jmp 0048DA93

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048D90D(C)
|
:0048D946 837DE000 cmp dword ptr [ebp-20], 00000000
:0048D94A 0F84DA000000 je 0048DA2A (jump) --------------跳了就完蛋了!!
:0048D950 8B85D8FDFFFF mov eax, dword ptr [ebp+FFFFFDD8]
:0048D956 C780D400000001000000 mov dword ptr [ebx+000000D4], 00000001
:0048D960 8D4DE8 lea ecx, dword ptr [ebp-18]
:0048D963 51 push ecx
:0048D964 8B8DD8FDFFFF mov ecx, dword ptr [ebp+FFFFFDD8]
:0048D96A 81C1E0000000 add ecx, 000000E0
:0048D970 E802E60500 call 004EBF77
:0048D975 8D55EC lea edx, dword ptr [ebp-14]
:0048D978 52 push edx
:0048D979 8B8DD8FDFFFF mov ecx, dword ptr [ebp+FFFFFDD8]
:0048D97F 81C1E4000000 add ecx, 000000E4
:0048D985 E8EDE50500 call 004EBF77

.................

* Possible StringData Ref from Data Obj ->"Thank you for registering."看见了吗?上面跳过了成功!!
| (大伙英文肯定比我好)
:0048DA00 68F45D5500 push 00555DF4
:0048DA05 E852C50600 call 004F9F5C
:0048DA0A C645FC05 mov [ebp-04], 05
:0048DA0E 8D8DC0FDFFFF lea ecx, dword ptr [ebp+FFFFFDC0]
:0048DA14 E832070000 call 0048E14B
:0048DA19 C645FC02 mov [ebp-04], 02
:0048DA1D 8D8DC8FDFFFF lea ecx, dword ptr [ebp+FFFFFDC8]
:0048DA23 E816E40500 call 004EBE3E
:0048DA28 EB37 jmp 0048DA61

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048D94A(C)
|
:0048DA2A 6A00 push 00000000
:0048DA2C 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Registration Key is not correct."错误信息(最可恶!)
|
:0048DA2E 68105E5500 push 00555E10
:0048DA33 E824C50600 call 004F9F5C
:0048DA38 C645FC01 mov [ebp-04], 01
:0048DA3C 8D4DE4 lea ecx, dword ptr [ebp-1C]
:0048DA3F E83C44FAFF call 00431E80

进入此call可见
:0048DD96 55 push ebp
:0048DD97 8BEC mov ebp, esp
:0048DD99 6AFF push FFFFFFFF
:0048DD9B 68955C5100 push 00515C95
:0048DDA0 64A100000000 mov eax, dword ptr fs:[00000000]
:0048DDA6 50 push eax
:0048DDA7 64892500000000 mov dword ptr fs:[00000000], esp
:0048DDAE 83EC24 sub esp, 00000024
:0048DDB1 894DD0 mov dword ptr [ebp-30], ecx
:0048DDB4 8B4510 mov eax, dword ptr [ebp+10]
:0048DDB7 C70001000000 mov dword ptr [eax], 00000001
:0048DDBD 8B4D0C mov ecx, dword ptr [ebp+0C]
:0048DDC0 51 push ecx
:0048DDC1 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DDC4 E8EADD0500 call 004EBBB3
:0048DDC9 C745FC00000000 mov [ebp-04], 00000000
:0048DDD0 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DDD3 E847890500 call 004E671F
:0048DDD8 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DDDB E87070F7FF call 00404E50
:0048DDE0 83F80A cmp eax, 0000000A-------------比较你输入的注册码是否为10位
:0048DDE3 741E je 0048DE03-----------------是就跳 (0A=10) :0048DDE5 C745EC00000000 mov [ebp-14], 00000000
:0048DDEC C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
----------------跳到关键的地方(睁大你的眼睛!!)--------------------
:0048DE03 6A00 push 00000000 *下面的数字都是相对ASCII值
:0048DE05 8D4DF0 lea ecx, dword ptr [ebp-10] (破解里常有，要记住哦)
:0048DE08 E83301F9FF call 0041DF40
:0048DE0D 0FBED0 movsx edx, al
:0048DE10 83FA36 cmp edx, 00000036------------------36=6
:0048DE13 7566 jne 0048DE7B
:0048DE15 6A01 push 00000001
:0048DE17 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DE1A E82101F9FF call 0041DF40
:0048DE1F 0FBEC0 movsx eax, al
:0048DE22 83F834 cmp eax, 00000034------------------34=4
:0048DE25 7554 jne 0048DE7B
:0048DE27 6A02 push 00000002
:0048DE29 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DE2C E80F01F9FF call 0041DF40
:0048DE31 0FBEC8 movsx ecx, al
:0048DE34 83F933 cmp ecx, 00000033------------------33=3
:0048DE37 7542 jne 0048DE7B
:0048DE39 6A03 push 00000003
:0048DE3B 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DE3E E8FD00F9FF call 0041DF40
:0048DE43 0FBED0 movsx edx, al
:0048DE46 83FA58 cmp edx, 00000058-------------------58=X (大写)
:0048DE49 7412 je 0048DE5D
:0048DE4B 6A03 push 00000003
:0048DE4D 8D4DF0 lea ecx, dword ptr [ebp-10]
:0048DE50 E8EB00F9FF call 0041DF40
:0048DE55 0FBEC0 movsx eax, al
:0048DE58 83F878 cmp eax, 00000078-------------------78=x (小写)
:0048DE5B 751E jne 0048DE7B

**注册码的前5位是固定的， 为643Xx ,后面嘛，你喜欢多迷信就多迷信了!! ^-^(谁能想出新的笑脸)**
欢迎光临：http://www.luosz.cn.gs


L0phtcrack v2.5

 标 题:出几道关于crack的题给大家做做怎么样？ (201字)
发信人:guest
时 间:2000-9-9 22:31:49
详细信息:
1、
目标：L0phtcrack v2.5
难度：中等偏下
位置：http://www.l0pht.com/l0phtcrack/
要求：说明跟踪过程中关键的步骤、关键的代码；写出注册机；对于同一个serial来说它有几个unlock code？

要不要来点难的？

标 题:破解过程如下。 (5千字)
发信人:xiA Qin
时 间:2000-9-10 7:51:56
详细信息:

目标：L0phtcrack v2.5
位置：http://www.l0pht.com/l0phtcrack/

作 者：xiA Qin
解密日前：2000年9月10日
解密工具：Trw2000 1.22

说 明：本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

输入注册信息：

机器码：11363ea34 #此是软件自动生成的。
注册码：1234567890 #任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
.................

015F:0040630B LEA ECX,[ESP+E0] //载入你输入的注册码的地址。
015F:00406312 PUSH ECX
015F:00406313 MOV ECX,EBX
015F:00406315 CALL 0044519A
015F:0040631A LEA EDX,[ESP+14]
015F:0040631E PUSH EDX
015F:0040631F PUSH BYTE +00
015F:00406321 MOV ECX,ESI
015F:00406323 CALL 00445491
015F:00406328 PUSH EAX
015F:00406329 CALL 00401447 //计算注册码的的子程序CALL
015F:0040632E ADD ESP,BYTE +08
015F:00406331 LEA EAX,[ESP+2C] //下指令d eax，就可以看见第一个正确注册码。
015F:00406335 PUSH EAX
015F:00406336 PUSH BYTE +00
015F:00406338 MOV ECX,EDI
015F:0040633A CALL 00445491
015F:0040633F PUSH EAX
015F:00406340 CALL 00401447 //计算注册码的的子程序CALL
015F:00406345 MOV EAX,[EBX]
015F:00406347 LEA ECX,[ESP+1C] //下指令d ecx，就可以看见第二个正确注册码。
015F:0040634B PUSH ECX
015F:0040634C PUSH EAX
015F:0040634D CALL 00426260 //比较注册码的子程序CALL
015F:00406352 ADD ESP,BYTE +10
015F:00406355 TEST EAX,EAX //用eax当注册旗标，EAX=1注册成功
015F:00406357 JZ 004063A2 //
015F:00406359 MOV EAX,[EBX]
015F:0040635B LEA EDX,[ESP+2C]
015F:0040635F PUSH EDX
015F:00406360 PUSH EAX
015F:00406361 CALL 00426260 //比较注册码的子程序CALL
015F:00406366 ADD ESP,BYTE +08
015F:00406369 TEST EAX,EAX //用eax当注册旗标，EAX=1注册成功
015F:0040636B JZ 004063A2
015F:0040636D PUSH BYTE +00
015F:0040636F PUSH BYTE +00
015F:00406371 PUSH DWORD 00483530
015F:00406376 CALL 0045666B //注册失败
015F:0040637B PUSH ESI
015F:0040637C LEA ECX,[ESP+E0]
015F:00406383 CALL 0044519A
015F:00406388 LEA ECX,[ESP+80]
015F:0040638F CALL 00443922
015F:00406394 CMP EAX,BYTE +01
015F:00406397 JZ NEAR 0040630B
015F:0040639D JMP 0040644B
015F:004063A2 OR ECX,BYTE -01
015F:004063A5 MOV DWORD [EBP+C0],00
015F:004063AF XOR EAX,EAX
015F:004063B1 MOV EDI,00483510
015F:004063B6 REPNE SCASB
015F:004063B8 NOT ECX

.............................

按F8进去0040634D CALL 00426260看看程序是如何比较注册码的。

015F:00426260 PUSH EBP
015F:00426261 MOV EBP,ESP
015F:00426263 PUSH EDI
015F:00426264 PUSH ESI
015F:00426265 PUSH EBX
015F:00426266 MOV ESI,[EBP+0C]
015F:00426269 MOV EDI,[EBP+08]
015F:0042626C LEA EAX,[0065D8B8]
015F:00426272 CMP DWORD [EAX+08],BYTE +00
015F:00426276 JNZ 004262B3
015F:00426278 MOV AL,FF
015F:0042627A MOV EDI,EDI
015F:0042627C OR AL,AL <<--|逐位比较真假注册码。
015F:0042627E JZ 004262AE |
015F:00426280 MOV AL,[ESI] |
015F:00426282 INC ESI |
015F:00426283 MOV AH,[EDI] |
015F:00426285 INC EDI　　　　　|
015F:00426286 CMP AH,AL |
015F:00426288 JZ 0042627C <<--|
015F:0042628A SUB AL,41
015F:0042628C CMP AL,1A
。 。 。 。
。 。 。 。
。 。 。 。
015F:00426321 CALL 0042048F
015F:00426326 ADD ESP,BYTE +04
015F:00426329 MOV EAX,EBX
015F:0042632B POP EBX
015F:0042632C POP ESI
015F:0042632D POP EDI
015F:0042632E LEAVE
015F:0042632F RET

==============================================
按F8进入00406329 CALL 00401447进行算法分析：

015F:00403EC0 SUB ESP,BYTE +0C
015F:00403EC3 MOV EAX,[ESP+10]
015F:00403EC7 PUSH BYTE +08
015F:00403EC9 INC EAX //EAX=EAX+1
015F:00403ECA PUSH EAX
015F:00403ECB LEA ECX,[ESP+08]
015F:00403ECF PUSH ECX
015F:00403ED0 CALL 0041BCC0
015F:00403ED5 LEA EDX,[ESP+1C]
015F:00403ED9 PUSH EDX
015F:00403EDA LEA EAX,[ESP+10]
015F:00403EDE PUSH DWORD 00483078
015F:00403EE3 PUSH EAX
015F:00403EE4 MOV BYTE [ESP+20],00
015F:00403EE9 CALL 0041BED1
015F:00403EEE MOV ECX,[ESP+28] //将[ESP+28]移入寄存器ECX。
015F:00403EF2 XOR ECX,34729803 //ecx=ecx xor 34729803。
015F:00403EF8 MOV EAX,ECX //将寄存器ECX的值移入寄存器eax.
015F:00403EFA SHL EAX,1B //eax逻辑左移27位
015F:00403EFD SHR ECX,05 //ecx逻辑右移5位
015F:00403F00 ADD EAX,ECX //EAX=EAX+ECX
015F:00403F02 MOV ECX,[ESP+2C]
015F:00403F06 XOR EAX,12426571 //eax=eax xor 12426571
015F:00403F0B PUSH EAX
015F:00403F0C PUSH DWORD 00483070
015F:00403F11 PUSH ECX
015F:00403F12 MOV [ESP+34],EAX
015F:00403F16 CALL 0041BE7F
015F:00403F1B XOR EAX,EAX
015F:00403F1D ADD ESP,BYTE +30
015F:00403F20 RET

算法总结：
1、将机器码11363ea34转换成1363ea34，也就是取后8位。
2、与34729803做异或运算。
3、逻辑左移27位相加逻辑右移5位
4、在与12426571做异或运算。

计算公式：
A xor 34729803=B
[(B shl 27)+(B SHR 5)] XOR 12426571=C

比如：我的计算机的机器码是11363ea34
取机器码的后8位,就是1363ea34

1363EA34 XOR 34729803=27117237

[(27117237 SHL 27)+(27117237 SHR 5)] XOR 12426571=[B8000000+1388B91] XOR 12426571=
B9388B91 XOR 12426571=AB7AEEE0

整理一下 （由于每台电脑的机器码不同，所以我的注册码，你可能不能使用）：

机器码：11363ea34
注册码：AB7AEEE0
524a3b72

注册信息在注册表中：
[HKEY_CURRENT_USER\Software\L0pht\L0phtCrack]
"Registration"="524a3b72"

标 题:这对你来说已经很简单了 (1千字)
发信人:1212
时 间:2000-9-11 9:00:29
详细信息:

只需要生成第一个unlock code即可，第二个unlock code实际上可以不必追究了。

long Serial, Unlock;

int len;
char SerialStr[64];
char UnlockStr[64];

len = GetDlgItemTextA(hDlg, IDC_SERIAL, SerialStr, sizeof(SerialStr));
if ( len != 9)
{
SetDlgItemTextA(hDlg, IDC_UNLOCK, "There must be 9 chars in your serial.");
return FALSE;
}

sscanf(SerialStr+1, "%08lx", &Serial);
_asm
{
pushad

MOV ECX,[Serial]
XOR ECX,0x34729803
MOV EAX,ECX
SHL EAX,0x1B
SHR ECX,0x05
ADD EAX,ECX
XOR EAX,0x12426571
mov [Unlock], eax

popad
}

sprintf(UnlockStr, "%08lx", Unlock);
SetDlgItemTextA(hDlg, IDC_UNLOCK, UnlockStr);


Leap2.7

标 题:贴个教学，初学者请进！ (11千字)
发信人:machoman[CCG]
时 间:2001-4-20 14:48:01
详细信息:
星期天在家无聊，很久没有动过软件了，就随便找了个LeapFTP的软件来实践一下Debug.(我菜，当然不敢找那
些厉害的软件下手。不然被搞的灰头土脸的就惨，一天都不会有好心情...扯远了还是回到程序中来)

Leap2.7程序下载地址：http://download.sohu.com/disk2/it/new/update/0212/lftp271.exe
作者:MachoMan[CCG]
注册名:[CCG] (China Cracking Group)
注册码:CCG1-CC2A-C1GD-UPVE
后附注册机
工具 ：
soft ice 4.05
dasm32
步骤:
我先在注册名处输入'CCG'
然后输入假注册码'31415926'(Sunbird 的老办法)
再用ice 中的bpx hmemcpy下断点。再用F12进入程序空间。然后用
bd hmemcpy 屏蔽掉这个断点
在ice下用 S 30:0 L ffffffff '31415926' 命令查找我的注册码的位置
30:80607e02 30 31 34 31 35 39 32 36-00 00 00 00 00 00 00 00 31415926.............
接下来要做的就是对这个内存位置下断点
bpm 30: 80607e02(不同机器是可能不同的)
然后你就会在下面的位置004875D2发现伪注册码被判断，就是关键所在了。

* Referenced by a CALL at Addresses:
|:0048721F , :00487D85
|
:004875AC 55 push ebp
:004875AD 8BEC mov ebp, esp
:004875AF 83C4F4 add esp, FFFFFFF4
:004875B2 53 push ebx
:004875B3 56 push esi
:004875B4 57 push edi
:004875B5 8955FC mov dword ptr [ebp-04], edx
:004875B8 8B45FC mov eax, dword ptr [ebp-04]
:004875BB E8F8CAF7FF call 004040B8
:004875C0 33C0 xor eax, eax
:004875C2 55 push ebp
:004875C3 6819774800 push 00487719
:004875C8 64FF30 push dword ptr fs:[eax]
:004875CB 648920 mov dword ptr fs:[eax], esp
:004875CE C645FB00 mov [ebp-05], 00
:004875D2 8B45FC mov eax, dword ptr [ebp-04]//你可以发现注册码在[ebp-04]的地方'31415926'
:004875D5 E82AC9F7FF call 00403F04//这个函数是判断注册码的个数
:004875DA 83F813 cmp eax, 00000013;注册码是0x13(16进制)=19个字符
:004875DD 0F8520010000 jne 00487703;不是就洗白
:004875E3 8B45FC mov eax, dword ptr [ebp-04]
:004875E6 8078042D cmp byte ptr [eax+04], 2D;第5个字符为0x2D对应ASCII '-'
:004875EA 0F8513010000 jne 00487703;不是就洗白
:004875F0 8B45FC mov eax, dword ptr [ebp-04]
:004875F3 8078092D cmp byte ptr [eax+09], 2D;第10个字符为0x2D对应ASCII '-'
:004875F7 0F8506010000 jne 00487703;不是就洗白
:004875FD 8B45FC mov eax, dword ptr [ebp-04]
:00487600 80780E2D cmp byte ptr [eax+0E], 2D;第15个字符为0x2D对应ASCII '-'
:00487604 0F85F9000000 jne 00487703;不是就洗白,要想注册就不能洗白！在这里可以知道注册码的
;结构该是'****-****-****-****'这样的结构*代表一个字符
:0048760A 33F6 xor esi, esi
:0048760C 33FF xor edi, edi
:0048760E 33C0 xor eax, eax
:00487610 8945F4 mov dword ptr [ebp-0C], eax
:00487613 BB01000000 mov ebx, 00000001
/******************************************************************************************/
//这下面从487618开始就是一个循环，它把你输入的注册码进行判断是否符合要求，其要求是第一组注册码
//的最后一个字符为数字，其余的3个为字符，第二组的倒数第2个为数字，其他三个为字符。第三组的倒数第
//3个为数字，其他三个为字符。如果符合其要求，则把前三组注册码分组求和，然后把这个3个和数，及3个
//和数的总和分别做一个这样的运算 (X+0x41)/0x1a+0x41--->最后一组的4个字符，可以知道注册码跟用户名
//无关

图示如下

****-****-****-****
sum1 sum2 sum3||||
||||____________________(sum1+sum2+sum3+0x41)/0x1a+0x41
|||
|||____________________(sum3+0x41)/0x1a+0x41
||
||_____________________ (sum2+0x41)/0x1a+0x41
|
|_______________________(sum1+0x41)/0x1a+0x41

/******************************************************************************************/
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048769E(C)
|
:00487618 8BC3 mov eax, ebx
:0048761A 2503000080 and eax, 80000003
:0048761F 7905 jns 00487626
:00487621 48 dec eax
:00487622 83C8FC or eax, FFFFFFFC
:00487625 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048761F(C)
|
:00487626 85C0 test eax, eax
:00487628 7516 jne 00487640
:0048762A 8B45FC mov eax, dword ptr [ebp-04]
:0048762D 8A4418FF mov al, byte ptr [eax+ebx-01]
:00487631 E84EFFFFFF call 00487584//这个调用作用是把你的注册码的一个字符进行识别。要求
//其必须其必须是一个数字，在'0'-'9'之间
//
:00487636 84C0 test al, al //判断返回值符合要求吗？如果不是，al是置0的
:00487638 0F84C5000000 je 00487703//判断返回值
:0048763E EB22 jmp 00487662//不能跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00487628(C)
|
:00487640 8BC3 mov eax, ebx
:00487642 B905000000 mov ecx, 00000005
:00487647 99 cdq
:00487648 F7F9 idiv ecx
:0048764A 85D2 test edx, edx
:0048764C 7414 je 00487662
:0048764E 8B45FC mov eax, dword ptr [ebp-04]
:00487651 8A4418FF mov al, byte ptr [eax+ebx-01]
:00487655 E83EFFFFFF call 00487598//这个调用的作用是把你的注册码的一个字符进行识别。要求
//其必须是字符，而且其必须在'A'-'Z'之间，你可以根据地址找到
:0048765A 84C0 test al, al//判断返回值
:0048765C 0F84A1000000 je 00487703//不能跳！

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048763E(U), :0048764C(C)
|
:00487662 8B45FC mov eax, dword ptr [ebp-04]
:00487665 8A4418FF mov al, byte ptr [eax+ebx-01]
:00487669 3C2D cmp al, 2D //判断是字符'-'吗？
:0048766B 742D je 0048769A//字符不参与计算，跳过循环
:0048766D 83FB05 cmp ebx, 00000005//
:00487670 7D0C jge 0048767E
:00487672 8B55FC mov edx, dword ptr [ebp-04]
:00487675 25FF000000 and eax, 000000FF
:0048767A 03F0 add esi, eax//esi 中放第一组注册码的和
:0048767C EB1C jmp 0048769A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00487670(C)
|
:0048767E 83FB0A cmp ebx, 0000000A
:00487681 7D0C jge 0048768F
:00487683 8B55FC mov edx, dword ptr [ebp-04]//[ebp-04]
:00487686 25FF000000 and eax, 000000FF
:0048768B 03F8 add edi, eax//edi第二组注册码的和
:0048768D EB0B jmp 0048769A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00487681(C)
|
:0048768F 8B55FC mov edx, dword ptr [ebp-04]
:00487692 25FF000000 and eax, 000000FF
:00487697 0145F4 add dword ptr [ebp-0C], eax//[ebp-0c]中放第三组注册码的和

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048766B(C), :0048767C(U), :0048768D(U)
|
:0048769A 43 inc ebx
:0048769B 83FB0F cmp ebx, 0000000F//循环完了吗？
:0048769E 0F8574FFFFFF jne 00487618//如果没完继续
:004876A4 8D0C37 lea ecx, dword ptr [edi+esi]//这下边的就是生成注册码的最后4个字符
:004876A7 034DF4 add ecx, dword ptr [ebp-0C]
:004876AA 8BC6 mov eax, esi
:004876AC BB1A000000 mov ebx, 0000001A
:004876B1 99 cdq
:004876B2 F7FB idiv ebx
:004876B4 83C241 add edx, 00000041
:004876B7 8B45FC mov eax, dword ptr [ebp-04]
:004876BA 3A500F cmp dl, byte ptr [eax+0F]
:004876BD 7544 jne 00487703
:004876BF 8BC7 mov eax, edi
:004876C1 BB1A000000 mov ebx, 0000001A
:004876C6 99 cdq
:004876C7 F7FB idiv ebx
:004876C9 83C241 add edx, 00000041
:004876CC 8B45FC mov eax, dword ptr [ebp-04]
:004876CF 3A5010 cmp dl, byte ptr [eax+10]
:004876D2 752F jne 00487703
:004876D4 8B45F4 mov eax, dword ptr [ebp-0C]
:004876D7 BB1A000000 mov ebx, 0000001A
:004876DC 99 cdq
:004876DD F7FB idiv ebx
:004876DF 83C241 add edx, 00000041
:004876E2 8B45FC mov eax, dword ptr [ebp-04]
:004876E5 3A5011 cmp dl, byte ptr [eax+11]
:004876E8 7519 jne 00487703
:004876EA 8BC1 mov eax, ecx
:004876EC B91A000000 mov ecx, 0000001A
:004876F1 99 cdq
:004876F2 F7F9 idiv ecx
:004876F4 83C241 add edx, 00000041
:004876F7 8B45FC mov eax, dword ptr [ebp-04]
:004876FA 3A5012 cmp dl, byte ptr [eax+12]
:004876FD 7504 jne 00487703
:004876FF C645FB01 mov [ebp-05], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004875DD(C), :004875EA(C), :004875F7(C), :00487604(C), :00487638(C)
|:0048765C(C), :004876BD(C), :004876D2(C), :004876E8(C), :004876FD(C)
|
:00487703 33C0 xor eax, eax
:00487705 5A pop edx
:00487706 59 pop ecx
:00487707 59 pop ecx
:00487708 648910 mov dword ptr fs:[eax], edx
:0048770B 6820774800 push 00487720

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048771E(U)
|
:00487710 8D45FC lea eax, dword ptr [ebp-04]
:00487713 E86CC5F7FF call 00403C84
:00487718 C3 ret
/*****************************************************************************************/
//判断数字(ASCII)调用
Referenced by a CALL at Address:
|:00487631
|
:00487584 8BD0 mov edx, eax
:00487586 80FA2F cmp dl, 2F
:00487589 7608 jbe 00487593
:0048758B 80FA3A cmp dl, 3A
:0048758E 7303 jnb 00487593
:00487590 B001 mov al, 01
:00487592 C3

/****************************************************************************************/

//字符判断调用
* Referenced by a CALL at Address:
|:00487655
|
:00487598 8BD0 mov edx, eax
:0048759A 80FA40 cmp dl, 40
:0048759D 7608 jbe 004875A7
:0048759F 80FA5B cmp dl, 5B
:004875A2 7303 jnb 004875A7
:004875A4 B001 mov al, 01
:004875A6 C3 ret

//转摘请保持完整 AllRight Reserved By: [CCG]

标 题:它的注册机 (1千字)
发信人:machoman[CCG]
时 间:2001-4-20 14:51:57
详细信息:

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
void main(void)
{ int i,j,temp,temp1;
char Char[13],Number[4],Sum[20],result[20];
printf("LeapFTP Version 2.7.1.560\n");
printf("China Cracking Group [CCG]\n");
printf("By: MachoMan[CCG]\n");
srand((unsigned )time(NULL));
for(i=0;i<12;i++)
{
temp=rand();
temp=temp%26;
Char[i]=temp+0x41;
}
for(i=0;i<3;i++)
{ temp=rand();
temp=temp%10;
Number[i]=temp+0x30;
}
strncpy(Sum,Char,3);
j=0;
for(i=0;i<3;i++)
{
strncpy(&Sum[3+j],&Number[i],1);
strncpy(&Sum[4+j],&Char[3+j],2);
j=j+3;
}
strcpy(&Sum[12],(LPSTR)"");
temp1=0;
for( i=0;i<3; i++)
{ temp=0;
for(j=0;j<4;j++)
temp=temp+(unsigned char )Sum[4*i+j];
temp1=temp+temp1;
Number[i]=0x41+temp%0x1a;

}
temp1=0x41+temp1%0x1a;
Number[i]=temp1;
strcat(Sum,Number);

for(i=0,j=0;i<19;i++)
{
if((i+1)%5==0&&i<19)
result[i]=0x2d;
else
result[i]=Sum[j++];
}
printf("%s",result);
}


LeapFTP 2.7.0.550

标 题:转载一篇破解教程（LeapFTP) (10千字)
发信人:duba.126.com
时 间:2001-3-29 12:30:58
详细信息:
凌晨2：30分，总算有空安定下来写这篇教程了。 以前破过不少杀毒、加密及注册软件，但还是第一次写教程，表达可能不是很好，多看几偏吧。OK
软件：LeapFTP.EXE (这是一个上传网页的程序)版本：2.7.0.550
程序在注册成功后会将其写入注册表的HKEY_CURRENT_USER\Software\LeapWare\Registry\LeapFTP 下面,
每次启动时都回读取判断. 这个程序有两种注册码,并且由两段不同的程序段进行判断.
第一种:将用户名运算后与注册码比较,注册码格式 XXXXXX-XXXXXXXXXX X为数字
列:ligang 214065-1079336565 (有效的注册码哦!)
第二种:用户名任意,通过注册码来做文章. 注册码格式 XXXY-XXYX-XYXX-ABCD X为字母,Y为数字,A为XXXY中
各位ASCII之和除以1AH的余数+41H所得的ASCII码字符,B为XXYX中各位ASCII之和除以1AH的余数+41H所得的
ASCII码字符,C为XYXX中各位ASCII之和除以1AH的余数+41H所得的ASCII码字符,D为前三节ASCII之和除以1AH的
余数+41H所得的ASCII码字符.(好烦!!!) 列：ABC9-AB9C-A3CC-VVQG (有效的注册码哦!)第一种:破解工具：TRW,HIEW
先进入程序的注册画面添写. ^N 进入TRW设BPX HMEMCPY 然后F5,点OK,被拦下,再F5,拦下后,BD 1 PMODULE
:004871C0 E803C8FAFF call 004339C8
:004871C5 8B55F4 mov edx, dword ptr [ebp-0C] ;按F10从几处RET返回后到次
:004871C8 8B4DFC mov ecx, dword ptr [ebp-04]
:004871CB 8BC3 mov eax, ebx
:004871CD E8BA010000 call 0048738C ;!!!!追进
:004871D2 84C0 test al, al ;若AL=0就完了,将其改1可成功,但从启任然
:004871D4 7462 je 00487238 ;为UNREGSETR;call 0048738C 的进入点
. .
:00487466 E8A9CBF7FF call 00404014 ;判断前六位
:0048746B 7548 jne 004874B5 ;决不能转 . .
. :004874AA E865CBF7FF call 00404014 ;判断后10位
:004874AF 7504 jne 004874B5 ;决不能转
:004874B1 B301 mov bl, 01 ;呵,呵,可爱的1
:004874B3 EB02 jmp 004874B7;程序判断比较部分
:00404014 53 push ebx
:00404015 56 push esi
:00404016 57 push edi
:00404017 89C6 mov esi, eax
:00404019 89D7 mov edi, edx
:0040401B 39D0 cmp eax, edx
:0040401D 0F848F000000 je 004040B2
:00404023 85F6 test esi, esi
:00404025 7468 je 0040408F
:00404027 85FF test edi, edi
:00404029 746B je 00404096
:0040402B 8B46FC mov eax, dword ptr [esi-04]
:0040402E 8B57FC mov edx, dword ptr [edi-04]
:00404031 29D0 sub eax, edx
:00404033 7702 ja 00404037
:00404035 01C2 add edx, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:00404033(C)
|:00404037 52 push edx
:00404038 C1EA02 shr edx, 02
:0040403B 7426 je 00404063
* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:00404059(C)
|
:0040403D 8B0E mov ecx, dword ptr [esi] ;下D ESI并将此处设断(因不是一次比较完)
:0040403F 8B1F mov ebx, dword ptr [edi] ;下D EDI 看见了甚麽???
:00404041 39D9 cmp ecx, ebx
:00404043 7558 jne 0040409D
:00404045 4A dec edx
:00404046 7415 je 0040405D
:00404048 8B4E04 mov ecx, dword ptr [esi+04]
:0040404B 8B5F04 mov ebx, dword ptr [edi+04]
:0040404E 39D9 cmp ecx, ebx
:00404050 754B jne 0040409D
:00404052 83C608 add esi, 00000008
:00404055 83C708 add edi, 00000008
:00404058 4A dec edx
:00404059 75E2 jne 0040403D
:0040405B EB06 jmp 00404063
* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:00404046(C)
|:0040405D 83C604 add esi, 00000004
:00404060 83C704 add edi, 00000004
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040403B(C), :0040405B(U)|:00404063 5A pop edx
:00404064 83E203 and edx, 00000003
:00404067 7422 je 0040408B
:00404069 8B0E mov ecx, dword ptr [esi]
:0040406B 8B1F mov ebx, dword ptr [edi]
:0040406D 38D9 cmp cl, bl
:0040406F 7541 jne 004040B2
:00404071 4A dec edx
:00404072 7417 je 0040408B
:00404074 38FD cmp ch, bh
:00404076 753A jne 004040B2
:00404078 4A dec edx
:00404079 7410 je 0040408B
:0040407B 81E30000FF00 and ebx, 00FF0000
:00404081 81E10000FF00 and ecx, 00FF0000
:00404087 39D9 cmp ecx, ebx
:00404089 7527 jne 004040B2
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404067(C), :00404072(C), :00404079(C)|
:0040408B 01C0 add eax, eax
:0040408D EB23 jmp 004040B2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:00404025(C)
|:0040408F 8B57FC mov edx, dword ptr [edi-04]
:00404092 29D0 sub eax, edx
:00404094 EB1C jmp 004040B2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:00404029(C)
|:00404096 8B46FC mov eax, dword ptr [esi-04]
:00404099 29D0 sub eax, edx
:0040409B EB15 jmp 004040B2
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404043(C), :00404050(C)|:0040409D 5A pop edx
:0040409E 38D9 cmp cl, bl
:004040A0 7510 jne 004040B2
:004040A2 38FD cmp ch, bh
:004040A4 750C jne 004040B2
:004040A6 C1E910 shr ecx, 10
:004040A9 C1EB10 shr ebx, 10
:004040AC 38D9 cmp cl, bl
:004040AE 7502 jne 004040B2
:004040B0 38FD cmp ch, bh
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040401D(C), :0040406F(C), :00404076(C), :00404089(C), :0040408D(U)
|:00404094(U), :0040409B(U), :004040A0(C), :004040A4(C), :004040AE(C)|
:004040B2 5F pop edi
:004040B3 5E pop esi
:004040B4 5B pop ebx:004040B5 C3 ret
;程序判断比较部分返回第二种::00487562 83F813 cmp eax, 00000013 ;比较是19字符个吗
:00487565 0F8520010000 jne 0048768B
:0048756B 8B45FC mov eax, dword ptr [ebp-04]
:0048756E 8078042D cmp byte ptr [eax+04], 2D ;判断有无"-"
:00487572 0F8513010000 jne 0048768B
:00487578 8B45FC mov eax, dword ptr [ebp-04]
:0048757B 8078092D cmp byte ptr [eax+09], 2D ;同上
:0048757F 0F8506010000 jne 0048768B
:00487585 8B45FC mov eax, dword ptr [ebp-04]
:00487588 80780E2D cmp byte ptr [eax+0E], 2D ;同上
:0048758C 0F85F9000000 jne 0048768B . .
:004875AE 85C0 test eax, eax
:004875B0 7516 jne 004875C8
:004875B2 8B45FC mov eax, dword ptr [ebp-04]
:004875B5 8A4418FF mov al, byte ptr [eax+ebx-01]
:004875AE 85C0 test eax, eax
:004875B0 7516 jne 004875C8
:004875B2 8B45FC mov eax, dword ptr [ebp-04]
:004875B5 8A4418FF mov al, byte ptr [eax+ebx-01]
:004875B9 E84EFFFFFF call 0048750C ;对字符的判断
:004875BE 84C0 test al, al
:004875C0 0F84C5000000 je 0048768B
:004875C6 EB22 jmp 004875EA . .
:004875D9 8A4418FF mov al, byte ptr [eax+ebx-01]
:004875DD E83EFFFFFF call 00487520 ;对数字的判断
:004875E2 84C0 test al, al
:004875E4 0F84A1000000 je 0048768B . .
:00487632 8BC6 mov eax, esi ; ESI中是第一节区ASCII之和
:00487634 BB1A000000 mov ebx, 0000001A
:00487639 99 cdq:0048763A F7FB idiv ebx
:0048763C 83C241 add edx, 00000041 ;余数+41H
:0048763F 8B45FC mov eax, dword ptr [ebp-04]
:00487642 3A500F cmp dl, byte ptr [eax+0F] ;比较 A
:00487645 7544 jne 0048768B
:00487647 8BC7 mov eax, edi ;EDI中是第二节区ASCII之和
:00487649 BB1A000000 mov ebx, 0000001A
:0048764E 99 cdq:0048764F F7FB idiv ebx
:00487651 83C241 add edx, 00000041
:00487654 8B45FC mov eax, dword ptr [ebp-04]
:00487657 3A5010 cmp dl, byte ptr [eax+10] ;比较 B
:0048765A 752F jne 0048768B
:0048765C 8B45F4 mov eax, dword ptr [ebp-0C] ;[EBP-0C]中是第三节区ASCII之和
:0048765F BB1A000000 mov ebx, 0000001A
:00487664 99 cdq:00487665 F7FB idiv ebx
:00487667 83C241 add edx, 00000041
:0048766A 8B45FC mov eax, dword ptr [ebp-04]
:0048766D 3A5011 cmp dl, byte ptr [eax+11] ;比较 C
:00487670 7519 jne 0048768B
:00487672 8BC1 mov eax, ecx ;ECX中是第一.二.三节区ASCII之和(前面以累加)
:00487674 B91A000000 mov ecx, 0000001A
:00487679 99 cdq:0048767A F7F9 idiv ecx
:0048767C 83C241 add edx, 00000041
:0048767F 8B45FC mov eax, dword ptr [ebp-04]
:00487682 3A5012 cmp dl, byte ptr [eax+12] ;比较 D
:00487685 7504 jne 0048768B
:00487687 C645FB01 mov [ebp-05], 01 ;呵,呵,就是它了;可以看出每一节区的字符顺序可任意
:0048768B 33C0 xor eax, eax
:0048768D 5A pop edx
:0048768E 59 pop ecx
:0048768F 59 pop ecx
:00487690 648910 mov dword ptr fs:[eax], edx
:00487693 68A8764800 push 004876A8
:00487698 8D45FC lea eax, dword ptr [ebp-04]
:0048769B E8E4C5F7FF call 00403C84
:004876A0 C3 ret可以看出第二种手工都可以算出注册码哎,我打字太慢了,现在8:00整了.


软件名称：LeapFTP2.7.0(FileVersion: 2.7.0.550) LeapFTP.EXE 966KB 下载地点：http://www.leapware.com 发 信 人: 井 风 时 间: 2000-12-08 破解工具：Trw20001.22 W32Dasm8.93 Hew Workshop3.0 前 言： 此软件功能很强，十分好用，是一个极好的FTP软件。很久没有升级，最近才升为2.7版本。 计算和验证注册码过程比较复杂，所以用修改代码法破解。 过 程: 只要用16进制编辑器将下5个跳转改成相对应的非跳转即可(JZ改成JNZ、JNZ改成JZ)。 1：004871A0 offset 865A0 2: 004871AE offset 865AE 3: 004871D4 offset 865D4 4: 00495844 offset 94C44 5: 0049571E offset 94B1E 小 结： 将这此跳转改过来之后就不会有任何功能限制，只是窗口的CAPTION中可能存在未注册字样。 如果你觉得难看可以去掉（很容易）。 后 记： 有疑问请与我联系：hz.cy@163.net


LyricsShow! for Winamp v1.2

 标 题:注册你的LyricsShow! for Winamp v1.2(zombieys) (1千字)
发信人:jsjyt
时 间:2001-6-2 21:19:27
详细信息:
首先我们做一个假的LyricsShow.lcs,sn就填78787878(每次都填这个,习惯了)启动
winamp,加载ls,然后打开winhex,用它的内存编辑功能在ls的main内存里寻找78787878,
记下地址是112e8e0。下一步要做的是在ls的地盘拦截对它的读取，这难不倒我:)。右击
ls主窗口点查看信息,在s-ice里下bpx lockmytask,然后点确定，按20次f12进入ls领空
，下bpm 112e8e0，好的unload ls and load it again,被拦到了，按几次f5发现它把7
8787878放到了112e8e0,成功了20%呵呵......，下面的我简单说了,运算太复杂了没看懂
:(,它把你的user,email,computername,sn.id做一系列的变态运算然后把结果放到固定
的位置等待判我的死刑-_-。
我经过若干minutes的努力找到了关键的判断点
47093d mov eax,[47a0c8] //把已换成4位16进值数的注册码地址->eax
47093d mov eax,[eax] //把假sn 78787878->eax
470944 xor eax,[ebp-40] //拿它与之前算好的数做异或,结果->eax
470947 xor eax,[ebp-30] //继续与之前算好的数做异或,结果->eax
47094a mov edx,[47a0c8] //把结果覆盖到原来存78787878的地址里
470950 mov [edx],eax
470952 mov eax,[47a0c8]
470957 mov eax,[eax] //把刚才的结果放到edx
470959 mov edx,[47a0f0]
47095f xor eax [edx] //拿它与edx地址的数做异或,结果->eax
470961 mov edx,[47a508]
470967 mov [edx],eax //把结果->edx所指向的地址里等待判断
.
.
.
46f929 mov eax,[47a508]
46f92e mov eax,[eax]
46f930 mov edx,[47a2f4]
46f936 cmp eax,[edx] //最后的比较了
46f938 mov eax,[47a134]
46f93d setz byte ptr [eax] //置1就成功了
46f940 mov eax,[47a134]
46f945 cmp byte ptr [eax],00 //是1么？
46f948 jz 46f986 //不是就去死吧:(
完活
core的都是神仙么，写出了这个玩艺的注册机，我倒~~~~~~~~~~~~
太佩服它们了^^
一个有效的key license
LyricsShow.lcs
[License]
User=zombieys
Email=zombieys@263.net
ComputerName=ZOMBIEYS
WaveDeviceName=OPL3-SA Playback (v3.3)
SN=78787878
ID=ION


LyricsShow! for Winamp v1.2

标 题:注册你的LyricsShow! for Winamp v1.2 (3千字)
发信人:zombieys
时 间:2001-4-14 17:53:36
详细信息:
注册你的LyricsShow! for Winamp v1.2

软件名称：歌词秀 - LyricsShow! for Winamp v1.2
软件主页：www.karaoker.com
主要功能：LyricsShow! for Winamp使你在Winamp播放CD、MP3、WMA、MIDI等歌曲时，能看着同步歌词方便地卡拉OK。
主要目的：寻找自己的注册码
破解难度：中等难度(关键在于寻找正确的判断点)

主判断程序是ls.mdl，upx压缩的而且可能加了保护(未知版本upx压的),可能是为了防止暴破(这个玩艺即使dump出来反汇编也得不到任何有用的信息,s呀-_-)。经过分析得知是类keyfile保护的一种保护(至少我这么叫它)，它把你的id,机器名e-mail,sn,id写在一个叫LyricsShow.lcs的文件里,在启动时判断你是否是合法注册用户。这种判断方式非常的流行,类似的有开寅软件工作室开发的<chm帮助编辑器>和OICQ图形留言系统3.5，这两个相对来说要简单多了，因为它们都有提示，而ls却变态得多了:(。
ok，介绍完了，let's go:)。
LyricsShow.lcs的格式是这样的，注册信息与机器名有关，先做一个假的骗骗它:)。

LyricsShow.lcs

[License]
User=zombieys
Email=zombieys@263.net
ComputerName=ZOMBIEYS
WaveDeviceName=OPL3-SA Playback (v3.3)
SN=78787878
ID=ION

首先我们做一个假的LyricsShow.lcs,sn就填78787878(每次都填这个,习惯了)启动winamp,加载ls,然后打开winhex,用它的内存编辑功能在ls的main内存里寻找78787878,记下地址是112e8e0。下一步要做的是在ls的地盘拦截对它的读取，这难不倒我:)。右击ls主窗口点查看信息,在s-ice里下bpx lockmytask,然后点确定，按20次f12进入ls领空，下bpm 112e8e0，好的unload ls and load it again,被拦到了，按几次f5发现它把78787878放到了112e8e0,成功了20%呵呵......，下面的我简单说了,运算太复杂了没看懂:(,它把你的user,email,computername,sn.id做一系列的变态运算然后把结果放到固定的位置等待判我的死刑-_-。
我经过若干minutes的努力找到了关键的判断点

47093d mov eax,[47a0c8] //把已换成4位16进值数的注册码地址->eax
47093d mov eax,[eax] //把假sn 78787878->eax
470944 xor eax,[ebp-40] //拿它与之前算好的数做异或,结果->eax
470947 xor eax,[ebp-30] //继续与之前算好的数做异或,结果->eax
47094a mov edx,[47a0c8] //把结果覆盖到原来存78787878的地址里
470950 mov [edx],eax
470952 mov eax,[47a0c8]
470957 mov eax,[eax] //把刚才的结果放到edx
470959 mov edx,[47a0f0]
47095f xor eax [edx] //拿它与edx地址的数做异或,结果->eax
470961 mov edx,[47a508]
470967 mov [edx],eax //把结果->edx所指向的地址里等待判断
.
.
.
46f929 mov eax,[47a508]
46f92e mov eax,[eax]
46f930 mov edx,[47a2f4]
46f936 cmp eax,[edx] //最后的比较了
46f938 mov eax,[47a134]
46f93d setz byte ptr [eax] //置1就成功了
46f940 mov eax,[47a134]
46f945 cmp byte ptr [eax],00 //是1么？
46f948 jz 46f986 //不是就去死吧:(

完活
core的都是神仙么，写出了这个玩艺的注册机，我倒~~~~~~~~~~~~
太佩服它们了^^

一个有效的key license

LyricsShow.lcs

[License]
User=zombieys
Email=zombieys@263.net
ComputerName=ZOMBIEYS
WaveDeviceName=OPL3-SA Playback (v3.3)
SN=78787878
ID=ION

———————————————————————————————>
.-" "-. Cracked by zombieys >
/　　　　　　\ My oicq is 1789655 >
| | My hp is zombieys.yeah.net>
|, .-. .-. ,| My hp is zombieys.126.com >
|)(__/ \__)(| >
|/ /\ \| Thanks for your supports >
(@_@) (_ ^^ _) >
_ )\_______\__|IIIIII|__/_____ >
_)@8@8{}<________|-\IIIIII/-|____zombieys_____________________>

这两个相对比较easy,我没留过程

开寅软件工作室开发的<chm帮助编辑器>，它把注册信息写在win.ini里

算key的call是47a114
这是我的注册信息:)
[AgeSet]
Pnum=0000000000
PWes=Seach
Pset=El@999999%sce

OICQ图形留言系统3.5

我的注册码
name:zombieys
code:3241380137

这是去掉在线验证004C00A0 jz 004C011D ->nop

标 题:一个有效的key license (132字)
发信人:zombieys
时 间:2001-4-14 18:02:43
详细信息:

[License]
User=zombieys
Email=zombieys@263.net
ComputerName=ZOMBIEYS
WaveDeviceName=OPL3-SA Playback (v3.3)
SN=BF4406E8
ID=ION


Macromedia Flash 3

 标 题:一次破解Macromedia Flash 3的奇怪经历
发信人:iam0k
时 间:2000-11-23 12:23:19
详细信息:
一次破解Macromedia Flash 3的奇怪经历

因为我的妹妹想学Flash，我只有Flash 5，而教程是For Flash 3的，学起来很不方便，于是我便下载了一个Flash 3，安装成功。但是当我启动时，出现烦人的NAG窗口，提示30天试用期，讨厌！我记得以前看过一篇破解Flash 3的方法，于是我就在自己的资料库里找啊找啊，但是最终也没有找到，于是我打算自己动手破解。
首先，按Buy Now按钮，填写信息如下：
First Name:Headlines Last Name:Infoboy
Company:Bisp
Address:Beijing China
City:Beijing State:Null Zip Code:100084
Country:China
Phone:N/A Fax:N/A
E-mail:Infoboy@chinaren.com
然后，按下一步。
接着，如果你不购买其它产品的话，按下一步。
然后，填写信用卡信息如下：
Card Number:66666666666666666666（必须20位）
Expiration (Month/Year)12/20/2000（应该可以改成别的）
Name on card:Infoboy（就是我啦！）
Payment Type选择Visa
按下一步。
填写一些意见和反馈，呵呵。。。我填的是：shit!!!~~~ 按下一步。
按下一步。
下面是选择通讯方式，我家里无法上网啦，所以选择Phone，按下一步。
接着提示输入Unlock Code，ctrl+d，具体的我就不说了，其实我也没心情仔细分析，大约找到两个好象是Code的东东，一个是0019849934，一个是XFVRCIKRKG，先试第一个，不对，再试第二个，正确！
接着要求输入注册码，呵呵。。。填上0019849934，正确，然后好象是提示打印什么，我没有理会，关闭，重新启动Flash 3。
接着又要求输入一些信息，我输入了：
First Name:Infoboy
Company:Bisp
Product Code:FLW30-03143-77238-80660（是5.0的）
提示输入错误！：（
我调试了一会，就不想调了，我突然想到上面提示的打印什么东西，于是我打算重装Flash 3，看看到底要打印什么。
重装之后，出现一个拷贝文件的对话框，完成之后，我重新启动Flash 3，打算从头再来一遍，谁知道竟然没有提示窗口了，真是奇怪，呵呵。。。

注：我是在家里遇到这种情况的，但是今天在公司再试时，发现不行了，当我输入XFVRCIKRKG时提示出错，我有没有安装Softice，而且我的操作系统是Windows 2000，所以后面的步骤是我回忆着写的。我想出错的原因可能有这么几种，一是前面的信息填错了，和昨天填的不一样，所以Unlock Code错了；也可能是Unlock Code在每台机器上都是不一样的，所以以前的注册码已经不适应了。另外，我的机器上同时安装了Flash 3和Flash 5，其中Flash 5已破解，但是并不在同一个目录里，不过我想大约也有些原因吧！


MAGICWIN RELEASE 1.2

 标 题:《MAGICWIN RELEASE 1.2》注册码破解 高手莫入！ (2千字)
发信人:RATARICE[BCG]
时 间:2001-5-7 17:57:04
详细信息:
《MAGICWIN RELEASE 1.2》注册码破解
目标：MAGICWIN
古老的内码转换工具，但因为本人一直在用它，而且尚未注册，所以就那 它练手了！
作者：RATARICE[BCG]
工具：TRW2000 1.22
过程：
一、 运行MAGICWIN，弹出注册框。（因为我的已经过期了！）
填上serial number:（已填好）
your name: RATARICE[BCG]
registration code: 987654321000 （比sn长，才行！后边会讲到）
二、 运行TRW
CTRL+N，下BPX HMEMCPY，CTRL+N
三、 点“OK”。被拦。下BD *，PMODULE，程序如下：
1B87:0411 CALL `USER!GETDLGITEMTEXT`
1B87:0416 PUSH SI --------------------------->我们在着。
1B87:0417 PUSH WORD CA
1B87:041A PUSH SS
.
.
.

.
.
.
1B87:0505 LEA AX,[BP+FEC8]
1B87:0509 PUSH AX
1B87:050A PUSH SS
1B87:050B LEA AX,[BP-38]
1B87:050E PUSH AX
1B87:050F PUSH SS
1B87:0510 LEA AX,[BP-1C]
1B87:0513 PUSH AX
1B87:0514 CALL 03AB ----------------->此处为关键。追进去。
1B87:0519 ADD SP,BYTE +0E
1B87:051C CMP AX,01 ---------------->比较AX的值，判断注册是否成功
1B87:051F JNZ 0579 ----------------->跳则出错。
1B87:0521 CALL 73

***************************************
CALL 03AB 中的代码如下：
2F6F:03AB PUSH BP ------------------->我们在着。
2F6F:03AC MOV BP,SP
2F6F:03AE SUB SP,86
2F6F:03B2 PUSH SI
2F6F:03B3 PUSH DI
2F6F:03B4 MOV WORD [BP-02],00
2F6F:03B9 PUSH DWORD [BP+06]
2F6F:03BD CALL `KERNEL!LSTRLEN` ----->取机器码的长度。
2F6F:03C2 PUSH AX
2F6F:03C3 PUSH DWORD [BP+0A]
2F6F:03C7 CALL `KERNEL!LSTRLEN` ----->取注册码的长度。
2F6F:03CC POP DX
2F6F:03CD CMP DX,AX ---------------->比较，如果大于则继续。
2F6F:03CF JNG 03F6

往下找，一直到：
48DF:04D4 LEA AX,[BP+FF7A]
48DF:04D8 MOV DX,DI
48DF:04DA ADD DX,AX
48DF:04DC PUSH SS
48DF:04DD PUSH DX
48DF:04DE CALL `USER!_WSPRINTF`
48DF:04E3 ADD SP,BYTE +0C
48DF:04E6 PUSH SS
48DF:04E7 LEA AX,[BP+FF7A]
48DF:04EB PUSH AX ------------------->打D AX，就可看到真注册码了。
48DF:04EC PUSH DWORD [BP+0A]
48DF:04F0 CALL `USER!LSTRCMP`
小结：
serial number: MGW40172-10
your name: RATARICE[BCG]
registration code: MGWEAFFGIPN988


MailScan V3.5.1.2

 标 题:破解MailScan V3.5.1.2 (5千字)
发信人:mazhenyu
时 间:2001-8-31 10:57:03
详细信息:
软件名称：MailScan 电子邮件地址过滤器
软件下载：
http://www.newhua.com.cn/down/mailscan.zip

现在已经有V4.00 Bata 2.3测试版，功能更加强大，软件下载：
http://heraldsoft.yeah.net
http://mailscan.yeah.net

这个软件可以从文本文件中过滤出电子邮件地址，这里所指的文本文件不仅仅指*.txt文件，还包括*.htm文件、*.html文件、*.csv、*.eml、*.mbx等文本格式的文件。它可以在这些文件中搜寻可能包含邮件地址的文本行，然后对这些内容进行处理，过滤掉重复的和非法的地址，然后按照服务器地址自动排序，你存盘后就得到了一个E-Mail地址表。然后，你就可以轻松使用这些地址来进行你的宣传活动了。

1. 用W32Dasm反汇编：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048899F(C)
|
:00488A02 A14CC24800 mov eax, dword ptr [0048C24C]
:00488A07 8B00 mov eax, dword ptr [eax]
:00488A09 8B10 mov edx, dword ptr [eax]
:00488A0B FF92D8000000 call dword ptr [edx+000000D8]
:00488A11 48 dec eax
:00488A12 0F85B6000000 jne 00488ACE
:00488A18 8D55FC lea edx, dword ptr [ebp-04]
:00488A1B A14CC24800 mov eax, dword ptr [0048C24C]
:00488A20 8B00 mov eax, dword ptr [eax]
:00488A22 8B80DC020000 mov eax, dword ptr [eax+000002DC]
:00488A28 E83B43FAFF call 0042CD68
:00488A2D 8D55F8 lea edx, dword ptr [ebp-08]
:00488A30 A14CC24800 mov eax, dword ptr [0048C24C]
:00488A35 8B00 mov eax, dword ptr [eax]
:00488A37 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:00488A3D E82643FAFF call 0042CD68
:00488A42 8B4DF8 mov ecx, dword ptr [ebp-08]
:00488A45 8B55FC mov edx, dword ptr [ebp-04]
:00488A48 8B834C030000 mov eax, dword ptr [ebx+0000034C]
:00488A4E E8DDACFFFF call 00483730 <======== 关键call，用F8追入
:00488A53 84C0 test al, al
:00488A55 745F je 00488AB6 <======== 关键跳转
:00488A57 6A00 push 00000000

* Reference To: user32.MessageBeep, Ord:0000h
|
:00488A59 E836F1F7FF Call 00407B94

* Possible StringData Ref from Code Obj ->"E-Mail地址捕捉器"
|
:00488A5E BA008B4800 mov edx, 00488B00
:00488A63 8BC3 mov eax, ebx
:00488A65 E82E43FAFF call 0042CD98
:00488A6A 33D2 xor edx, edx
:00488A6C 8B8310030000 mov eax, dword ptr [ebx+00000310]
:00488A72 8B08 mov ecx, dword ptr [eax]
:00488A74 FF515C call [ecx+5C]
:00488A77 8B834C030000 mov eax, dword ptr [ebx+0000034C]
:00488A7D E81AA9FFFF call 0048339C
:00488A82 B201 mov dl, 01
:00488A84 8B83FC020000 mov eax, dword ptr [ebx+000002FC]
:00488A8A 8B08 mov ecx, dword ptr [eax]
:00488A8C FF515C call [ecx+5C]
:00488A8F B201 mov dl, 01
:00488A91 8B8300030000 mov eax, dword ptr [ebx+00000300]
:00488A97 8B08 mov ecx, dword ptr [eax]
:00488A99 FF515C call [ecx+5C]
:00488A9C 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"注册成功"
|
:00488A9E B9148B4800 mov ecx, 00488B14

* Possible StringData Ref from Code Obj ->"祝贺你,你现在可以长期使用这个软件了.
作者感谢"
->"您对国产软件的尊重和支持."
|
:00488AA3 BA208B4800 mov edx, 00488B20
:00488AA8 A188C04800 mov eax, dword ptr [0048C088]
:00488AAD 8B00 mov eax, dword ptr [eax]
:00488AAF E8E421FCFF call 0044AC98
:00488AB4 EB18 jmp 00488ACE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488A55(C) <======== 从“关键跳转”跳过来
|
:00488AB6 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"警告"
|
:00488AB8 B9688B4800 mov ecx, 00488B68

* Possible StringData Ref from Code Obj ->"注册码不对!" <======== 注册错误信息
|
:00488ABD BA708B4800 mov edx, 00488B70
:00488AC2 A188C04800 mov eax, dword ptr [0048C088]
:00488AC7 8B00 mov eax, dword ptr [eax]
:00488AC9 E8CA21FCFF call 0044AC98

2. 用TRW2000在00488A4E处下断点并用F8追入：

0167:00483751 CALL 0040407C
0167:00483756 XOR EAX,EAX
0167:00483758 PUSH EBP
0167:00483759 PUSH DWORD 004837F6
0167:0048375E PUSH DWORD [FS:EAX]
0167:00483761 MOV [FS:EAX],ESP
0167:00483764 LEA ECX,[EBP-0C]
0167:00483767 MOV EDX,[EBP-04]
0167:0048376A MOV EAX,ESI
0167:0048376C CALL 00483820
0167:00483771 MOV EAX,[EBP-0C]
0167:00483774 MOV EDX,[EBP-08]
0167:00483777 CALL 00403FD8 <======== 关键call
0167:0048377C JNZ 004837D9
0167:0048377E MOV BL,01

在483777处找到：

d eax=1829191098
d edx=87654321

用户号：06901-OEM-0088401-20426
注册码：1829191098

换一台计算机安装：

用户号：26099-OEM-0044402-16090
注册码：-2120266114 (出现负数似乎是错的，但仍然注册成功)


MakeCDRom V4.21

 标 题:注册 MakeCDRom V4.21 (2千字)
发信人:6767[BCG]
时 间:2001-5-27 22:55:13
详细信息:
注册 MakeCDRom V4.21
by 6767 [BCG]

工具：SOFTICE
简介：CD制作
地址：http://bj.onlinedown.net/down/makecdrom.exe (1.7M)

这次注册属巧合，因为用到浮点指令，而我不懂，没想到竟成功，谁明白最好能讲一下，汇编书上也没见到。

到注册窗口，只要求输入注册码，这种通常要麻烦一些。输入：123654，到SI中，下Bpx hMemCpy，回来按确定。被拦到，按一次F5(不知为什么要读两次？)，Bd *关断点，再N次F12返回主线。到这里：

:00476095 8D45FC lea eax, dword ptr [ebp-04]
:00476098 E8DBDBF8FF call 00403C78 <- 返回处
:0047609D 8D45FC lea eax, dword ptr [ebp-04] <- 输入的注册码
:004760A0 50 push eax
:004760A1 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"Enter the code to register."
|
:004760A3 BA10624700 mov edx, 00476210

* Possible StringData Ref from Code Obj ->"Input registration code"
|
:004760A8 B834624700 mov eax, 00476234
:004760AD E8FEAFFDFF call 004510B0
:004760B2 837DFC00 cmp dword ptr [ebp-04], 00000000
:004760B6 0F841C010000 je 004761D8
:004760BC 8D55F8 lea edx, dword ptr [ebp-08]
:004760BF 8B45FC mov eax, dword ptr [ebp-04]
:004760C2 E8B1CBF8FF call 00402C78 <- 将注册码变为放到Eax中， Eax=0x1e306=123654
:004760C7 8BD0 mov edx, eax
:004760C9 8955F4 mov dword ptr [ebp-0C], edx

现在需要用 WF 命令打开浮点窗口

:004760CC DB45F4 fild dword ptr [ebp-0C]
st0=123654
:004760CF DB2D4C624700 fld tbyte ptr [0047624C]
st0=521702469
st1=123654
:004760D5 DED9 fcompp <- 这句是比较吧
:004760D7 DFE0 fstsw ax <- ？？
:004760D9 9E sahf <- ？？
:004760DA 0F85DE000000 jne 004761BE <- 跳走则失败

* Possible StringData Ref from Code Obj ->"makecdrom.ini"
|
:004760E0 B960624700 mov ecx, 00476260
:004760E5 B201 mov dl, 01

重新注册：521702469，成功!不过我还是不明白。

注册信息保存在WINDOW目录下的makecdrom.ini:
[Options]
regcode=521702469


Micro Bridge

标 题:Micro Bridge的KeyCode生成程序 (808字)
发信人:blowfish
时 间:2001-1-13 3:09:29
详细信息:

Micro Bridge 的免光盘注册程序
http://bridgeworld.myetang.com/soft/lang.zip[111K]
免光盘执行 Micro Bridge 的 Key Code 防护措施相当变态，在移动软件目录或重装该软件后所申请的(10$)Key Code 失效。

这个程序的KeyCode似乎跟机器无关，我没有那个软件，无法知道它是否还检查了KeyCode的低位。下面的程序生成的KeyCode可以通过它的lang.exe的检查：

#include <windows.h>
#include <stdio.h>

void main(void)
{
long KeyCode;
long Shift[ ] = { 0, 4, 8, 16, 20, 24, 28 };
long High;
int  i;

KeyCode = GetTickCount( ) & 0x03FFFFFFL;
High = 0;
for(i = 0; i <= 6; i++)
{
High ^= (KeyCode >> Shift[i]) &
      0x0F;
}
High += 0x10;
KeyCode |=  (High << 0x1A);
printf("Your key code is: %lu\n", KeyCode);
}

标 题:对KeyCode的判断 (12千字)
发信人:blowfish
时 间:2001-1-13 22:21:38
详细信息:

这个软件的主程序mb9.exe启动时从mb.ini中读入KeyCode，然后判断。显然KeyCode和Windows目录的属性有关。
判断完了之后设置标志DS:[4D08]和DS:[4CF1]，这两个标志是等价的，为1则可免CD运行。KeyCode的算法并不是很复杂。

352F:1F97 C606084D00 MOV BYTE PTR [4D08],00 //初始化标志
352F:1F9C 8B46B8 MOV AX,[BP-48] //KeyCode的低位
352F:1F9F 0B46BA OR AX,[BP-46] //KeyCode的高位
352F:1FA2 7503 JNZ 1FA7
352F:1FA4 E9D002 JMP 2277
352F:1FA7 C746C07930 MOV WORD PTR [BP-40],3079
352F:1FAC C746C22A0F MOV WORD PTR [BP-3E],0F2A
352F:1FB1 8DBEA4FE LEA DI,[BP+FEA4]
352F:1FB5 16 PUSH SS
352F:1FB6 57 PUSH DI
352F:1FB7 BFB82F MOV DI,2FB8
352F:1FBA 1E PUSH DS
352F:1FBB 57 PUSH DI
352F:1FBC 9A0F1A471A CALL 1A47:1A0F
352F:1FC1 BFD60A MOV DI,0AD6
352F:1FC4 0E PUSH CS
352F:1FC5 57 PUSH DI
352F:1FC6 9A8E1A471A CALL 1A47:1A8E
352F:1FCB 6A11 PUSH 11
352F:1FCD 8D7ED0 LEA DI,[BP-30]
352F:1FD0 16 PUSH SS
352F:1FD1 57 PUSH DI
352F:1FD2 9ABA0ACF42 CALL 42CF:0ABA
352F:1FD7 8B46E6 MOV AX,[BP-1A]
352F:1FDA 8B56E8 MOV DX,[BP-18]
352F:1FDD 8946A8 MOV [BP-58],AX
352F:1FE0 8956AA MOV [BP-56],DX
352F:1FE3 8D7ED0 LEA DI,[BP-30]
352F:1FE6 16 PUSH SS
352F:1FE7 57 PUSH DI
352F:1FE8 9A270BCF42 CALL 42CF:0B27
352F:1FED FF36FE4C PUSH WORD PTR [4CFE]
352F:1FF1 FF36FC4C PUSH WORD PTR [4CFC]
352F:1FF5 68FF00 PUSH 00FF
352F:1FF8 9A55016701 CALL KERNEL!GETWINDOWSDIRECTORY
352F:1FFD 8DBEA4FE LEA DI,[BP+FEA4]
352F:2001 16 PUSH SS
352F:2002 57 PUSH DI
352F:2003 FF36FE4C PUSH WORD PTR [4CFE]
352F:2007 FF36FC4C PUSH WORD PTR [4CFC]
352F:200B 9A150ECF42 CALL 42CF:0E15
352F:2010 BFD80A MOV DI,0AD8
352F:2013 0E PUSH CS
352F:2014 57 PUSH DI
352F:2015 9A8E1A471A CALL 1A47:1A8E
352F:201A 6A11 PUSH 11
352F:201C 8D7ED0 LEA DI,[BP-30]
352F:201F 16 PUSH SS
352F:2020 57 PUSH DI
352F:2021 9ABA0ACF42 CALL 42CF:0ABA
352F:2026 8B46E6 MOV AX,[BP-1A]
352F:2029 8B56E8 MOV DX,[BP-18]
352F:202C 8946A4 MOV [BP-5C],AX
352F:202F 8956A6 MOV [BP-5A],DX
352F:2032 8D7ED0 LEA DI,[BP-30]
352F:2035 16 PUSH SS
352F:2036 57 PUSH DI
352F:2037 9A270BCF42 CALL 42CF:0B27
352F:203C 8B46A8 MOV AX,[BP-58]
352F:203F 8B56AA MOV DX,[BP-56]
352F:2042 2B46A4 SUB AX,[BP-5C]
352F:2045 1B56A6 SBB DX,[BP-5A]
352F:2048 8BC8 MOV CX,AX
352F:204A 8BDA MOV BX,DX
352F:204C 8B46A8 MOV AX,[BP-58]
352F:204F 8B56AA MOV DX,[BP-56]
352F:2052 2B46A4 SUB AX,[BP-5C]
352F:2055 1B56A6 SBB DX,[BP-5A]
352F:2058 9AE618471A CALL 1A47:18E6
352F:205D B90400 MOV CX,0004
352F:2060 31DB XOR BX,BX
352F:2062 9AC919471A CALL 1A47:19C9
352F:2067 3346C0 XOR AX,[BP-40]
352F:206A 3356C2 XOR DX,[BP-3E]
352F:206D 8946C0 MOV [BP-40],AX
352F:2070 8956C2 MOV [BP-3E],DX
352F:2073 8B46C0 MOV AX,[BP-40]
352F:2076 8B56C2 MOV DX,[BP-3E]
352F:2079 25FFFF AND AX,FFFF
352F:207C 81E2FF03 AND DX,03FF
352F:2080 8946C0 MOV [BP-40],AX
352F:2083 8956C2 MOV [BP-3E],DX
352F:2086 8B46C0 MOV AX,[BP-40]
352F:2089 8B56C2 MOV DX,[BP-3E]
352F:208C 25FF0F AND AX,0FFF
352F:208F 81E20000 AND DX,0000
352F:2093 8946B4 MOV [BP-4C],AX
352F:2096 8956B6 MOV [BP-4A],DX
352F:2099 8B46C0 MOV AX,[BP-40]
352F:209C 8B56C2 MOV DX,[BP-3E]
352F:209F B90C00 MOV CX,000C
352F:20A2 31DB XOR BX,BX
352F:20A4 9AC919471A CALL 1A47:19C9
352F:20A9 25FF0F AND AX,0FFF
352F:20AC 81E20000 AND DX,0000
352F:20B0 8946B0 MOV [BP-50],AX
352F:20B3 8956B2 MOV [BP-4E],DX
352F:20B6 8B46B4 MOV AX,[BP-4C]
352F:20B9 8B56B6 MOV DX,[BP-4A]
352F:20BC 8B4EB0 MOV CX,[BP-50]
352F:20BF 8B5EB2 MOV BX,[BP-4E]
352F:20C2 9AE618471A CALL 1A47:18E6
352F:20C7 B90600 MOV CX,0006
352F:20CA 31DB XOR BX,BX
352F:20CC 9AEC19471A CALL 1A47:19EC
352F:20D1 8946AC MOV [BP-54],AX
352F:20D4 8956AE MOV [BP-52],DX
352F:20D7 8B46C0 MOV AX,[BP-40]
352F:20DA 8B56C2 MOV DX,[BP-3E]
352F:20DD B90200 MOV CX,0002
352F:20E0 31DB XOR BX,BX
352F:20E2 9AC919471A CALL 1A47:19C9
352F:20E7 25FF0F AND AX,0FFF
352F:20EA 81E20000 AND DX,0000
352F:20EE 050100 ADD AX,0001
352F:20F1 83D200 ADC DX,00
352F:20F4 8946B4 MOV [BP-4C],AX
352F:20F7 8956B6 MOV [BP-4A],DX
352F:20FA 8B46C0 MOV AX,[BP-40]
352F:20FD 8B56C2 MOV DX,[BP-3E]
352F:2100 B90E00 MOV CX,000E
352F:2103 31DB XOR BX,BX
352F:2105 9AC919471A CALL 1A47:19C9
352F:210A 25FF0F AND AX,0FFF
352F:210D 81E20000 AND DX,0000
352F:2111 050100 ADD AX,0001
352F:2114 83D200 ADC DX,00
352F:2117 8946B0 MOV [BP-50],AX
352F:211A 8956B2 MOV [BP-4E],DX
352F:211D 8B46B4 MOV AX,[BP-4C]
352F:2120 8B56B6 MOV DX,[BP-4A]
352F:2123 8B4EB0 MOV CX,[BP-50]
352F:2126 8B5EB2 MOV BX,[BP-4E]
352F:2129 9AE618471A CALL 1A47:18E6
352F:212E 3346AC XOR AX,[BP-54]
352F:2131 3356AE XOR DX,[BP-52]
352F:2134 8946BC MOV [BP-44],AX
352F:2137 8956BE MOV [BP-42],DX
352F:213A 8B46BC MOV AX,[BP-44]
352F:213D 8B56BE MOV DX,[BP-42]
352F:2140 25FFFF AND AX,FFFF
352F:2143 81E2FF03 AND DX,03FF
352F:2147 8946BC MOV [BP-44],AX
352F:214A 8956BE MOV [BP-42],DX
352F:214D 31C0 XOR AX,AX
352F:214F 8946C4 MOV [BP-3C],AX
352F:2152 8946C6 MOV [BP-3A],AX
352F:2155 8B46BC MOV AX,[BP-44]
352F:2158 8B56BE MOV DX,[BP-42]
352F:215B 250F00 AND AX,000F
352F:215E 81E20000 AND DX,0000
352F:2162 3346C4 XOR AX,[BP-3C]
352F:2165 3356C6 XOR DX,[BP-3A]
352F:2168 8946C4 MOV [BP-3C],AX
352F:216B 8956C6 MOV [BP-3A],DX
352F:216E 8B46BC MOV AX,[BP-44]
352F:2171 8B56BE MOV DX,[BP-42]
352F:2174 B90400 MOV CX,0004
352F:2177 31DB XOR BX,BX
352F:2179 9AC919471A CALL 1A47:19C9
352F:217E 250F00 AND AX,000F
352F:2181 81E20000 AND DX,0000
352F:2185 3346C4 XOR AX,[BP-3C]
352F:2188 3356C6 XOR DX,[BP-3A]
352F:218B 8946C4 MOV [BP-3C],AX
352F:218E 8956C6 MOV [BP-3A],DX
352F:2191 8B46BC MOV AX,[BP-44]
352F:2194 8B56BE MOV DX,[BP-42]
352F:2197 B90800 MOV CX,0008
352F:219A 31DB XOR BX,BX
352F:219C 9AC919471A CALL 1A47:19C9
352F:21A1 250F00 AND AX,000F
352F:21A4 81E20000 AND DX,0000
352F:21A8 3346C4 XOR AX,[BP-3C]
352F:21AB 3356C6 XOR DX,[BP-3A]
352F:21AE 8946C4 MOV [BP-3C],AX
352F:21B1 8956C6 MOV [BP-3A],DX
352F:21B4 8B46BC MOV AX,[BP-44]
352F:21B7 8B56BE MOV DX,[BP-42]
352F:21BA B91000 MOV CX,0010
352F:21BD 31DB XOR BX,BX
352F:21BF 9AC919471A CALL 1A47:19C9
352F:21C4 250F00 AND AX,000F
352F:21C7 81E20000 AND DX,0000
352F:21CB 3346C4 XOR AX,[BP-3C]
352F:21CE 3356C6 XOR DX,[BP-3A]
352F:21D1 8946C4 MOV [BP-3C],AX
352F:21D4 8956C6 MOV [BP-3A],DX
352F:21D7 8B46BC MOV AX,[BP-44]
352F:21DA 8B56BE MOV DX,[BP-42]
352F:21DD B91400 MOV CX,0014
352F:21E0 31DB XOR BX,BX
352F:21E2 9AC919471A CALL 1A47:19C9
352F:21E7 250F00 AND AX,000F
352F:21EA 81E20000 AND DX,0000
352F:21EE 3346C4 XOR AX,[BP-3C]
352F:21F1 3356C6 XOR DX,[BP-3A]
352F:21F4 8946C4 MOV [BP-3C],AX
352F:21F7 8956C6 MOV [BP-3A],DX
352F:21FA 8B46BC MOV AX,[BP-44]
352F:21FD 8B56BE MOV DX,[BP-42]
352F:2200 B91800 MOV CX,0018
352F:2203 31DB XOR BX,BX
352F:2205 9AC919471A CALL 1A47:19C9
352F:220A 250F00 AND AX,000F
352F:220D 81E20000 AND DX,0000
352F:2211 3346C4 XOR AX,[BP-3C]
352F:2214 3356C6 XOR DX,[BP-3A]
352F:2217 8946C4 MOV [BP-3C],AX
352F:221A 8956C6 MOV [BP-3A],DX
352F:221D 8B46BC MOV AX,[BP-44]
352F:2220 8B56BE MOV DX,[BP-42]
352F:2223 B91C00 MOV CX,001C
352F:2226 31DB XOR BX,BX
352F:2228 9AC919471A CALL 1A47:19C9
352F:222D 250F00 AND AX,000F
352F:2230 81E20000 AND DX,0000
352F:2234 3346C4 XOR AX,[BP-3C]
352F:2237 3356C6 XOR DX,[BP-3A]
352F:223A 8946C4 MOV [BP-3C],AX
352F:223D 8956C6 MOV [BP-3A],DX
352F:2240 8B46C4 MOV AX,[BP-3C]
352F:2243 8B56C6 MOV DX,[BP-3A]
352F:2246 051000 ADD AX,0010
352F:2249 83D200 ADC DX,00
352F:224C B91A00 MOV CX,001A
352F:224F 31DB XOR BX,BX
352F:2251 9AEC19471A CALL 1A47:19EC
352F:2256 0346BC ADD AX,[BP-44]
352F:2259 1356BE ADC DX,[BP-42]
352F:225C 8946BC MOV [BP-44],AX
352F:225F 8956BE MOV [BP-42],DX
352F:2262 8B46BC MOV AX,[BP-44]
352F:2265 8B56BE MOV DX,[BP-42]
352F:2268 3B56BA CMP DX,[BP-46] //比较KeyCode
352F:226B 750A JNZ 2277
352F:226D 3B46B8 CMP AX,[BP-48] //比较KeyCode
352F:2270 7505 JNZ 2277
352F:2272 C606084D01 MOV BYTE PTR [4D08],01 //good guy
352F:2277 803E960600 CMP BYTE PTR [0696],00
352F:227C 7407 JZ 2285
352F:227E 803E084D00 CMP BYTE PTR [4D08],00
352F:2283 7408 JZ 228D
352F:2285 C606F14C01 MOV BYTE PTR [4CF1],01 //good guy
352F:228A E95203 JMP 25DF


MiniPad 2000

标 题:TRW2000 Ver:1.23 破解 MiniPad 2000 (913字)
发信人:1212
时 间:2001-2-2 10:52:42
详细信息:
TRW2000 Ver:1.23 破解 MiniPad 2000

MiniPad 2000 下载： ftp://ftp2.download.com.cn/pub/new_tools/mp160c.exe&name=mp160c.exe

1.运行`TRW2000`

2.运行 MiniPad 2000
来到程序帮助中的注册窗口
随便输入注册名：你的名字 注册码注册码: 787878

3.按`CTRL+M`激活`TRW2000`输入如下命令:
BPX HMEMCPY 设置中断条件
F5 返回 MiniPad 2000

4.按`完成注册`后，程序被拦截。清除断点：BC *

5.按F12键`X`次（当然是弹出失败窗的前一次了），开始烦人动作：按F10跟踪一直到：
:
:
016F:00479A71 MOV EDX ,[EBP-14]
016F:00479A74 MOV EAX ,[EBP-04] (用D ESI可以看到你输入的注册码）
016F:00479A77 CALL 00403FB8 (用D ECX可以看到你的正确注册码）
016F:00479A7C JZ 00479A9C 不跳就死！！！

6.用笔记下吧！

7.用刚才记下来的注册码来注册一下试试吧。

作者:Lihaitao
信箱:lihaitao@pub.xaonline.com

标 题:注册机 (576字)
发信人:真·伪装者
时 间:2001-2-2 15:32:41
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[81];
unsigned long i,a=0,b=0;
unsigned c;
printf("This keygen is maked by Pretender\nPlease input your name
    ");
gets(string);
for(i=0;(c=string[i])!='\0';i++);
printf("Your name is ");
puts(string);
if(string[0]>127) string[0]+=256;
a=i+17+string[0];
if(a>=200) a-=200;
if(a>=100) a-=100;
printf("Your Register code is:      %d",a);
for(b=1;b<i;b++)
{a+=string[b];
if(a>=200) a-=200;
if(a>=100) a-=100;
printf("%d",a);}
printf("\n");
printf("Welcome to WWW.CRACKNOW.COM\n");}


MiniPad2000 1.5

 标 题:迷你记事本MiniPad2000 1.5破解手记 (2千字)
发信人:孙锋
时 间:2000-12-26 23:41:48
详细信息:
迷你记事本MiniPad2000 1.5破解手记
2000年12月23日下午
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email：sffs@263.net

今天是星期六了，眼看就要到圣诞节了，也快放假了，我觉得有点高兴，在上番外地网的时候
发现了下面的这个小软件-----MiniPad 1.5，可以代替Windwos98下的记事本了，功能还多多，关
于他的注册，作者是这么说的；
免费注册MiniPad 2000
谢谢朋友们对MiniPad 2000的支持！为了收集更多好的意见和建议，MiniPad 2000现开通了在线免费注册功能。用户只需向作者发一封E-mail，告知自己姓名和E-mail地址，正在使用哪一个版本的MiniPad 2000，以及是从哪个网站下载MiniPad 2000，最好能附上对MiniPad 2000的意见和建议，即可免费获得注册密码，并随时获取最新的软件升级快讯 :-)
注：E-mail的主题请标明“MiniPad 2000 用户注册”，以便分拣。
注册版与未注册版的区别：
* 注册版会在“关于”对话框中显示注册用户的姓名。在其它功能上，两者没有任何区别。
* 当MiniPad 2000有升级版本推出时，已注册的用户将于第一时间得到通知。

管他是不是免费的，先来学习学习练手吧，当然我还是先向作者发了一封email申请注册码了，
支持国产软件嘛，嘿嘿。
既然是免费注册，其注册算法肯定不很难，好了，自己先算个自己的吧。
还是用TRW2000来替我干活吧。
步骤：
1、启动MiniPad软件，进行注册：
姓名：sunfeng
注册码：1212121212
2、启动TRW2000，OK载入内存。
3、Ctrl+N呼出TRW2000，bpx hmemcpy 万能中断，F5返回程序界面，点击确定。
4、TRW2000拦截后，进入TRW2000的领空，BD *中断所有中断后，F12多次，当按下第15次时，提示注册错误，
所以我们下一步只要按14次就可以了。
5、退出TRW2000并重新载入，重复上面的步骤，但是这次只要按4次F12。
6、然后再按F10键，我统计了的次数是19次。来到下面这个位置：
0167:00470B97 CALL 00403F3C------------->D EAX 得到注册码。39566668697982
7、整理：
姓名：sunfeng
注册码：39566668697982
8、用得到的注册码注册。

9、其他用户的注册码都可以这么得到。但是您的机器的屏幕显示将和我的0167：不一样，请
注意。但是后面的地址和代码指令是一样的。
10、其他的注册码：

用户名： 注册码：
孙锋 24634676
徐新农 316775696635
中国用户 3947328293887542
番外地 678839906
新领网 31251854597
0 66
1 67
a 15
b 16
A 83
B 84
AB 8450
This is a FREE software. 252934498186133306232
1483528499101228474458595(太长了，放两行）
MiniPad 16162119898
有兴趣的朋友自己制作一个注册机吧。

<--------完--------->


mIRC v5.81

 标 题:mIRC v5.81版注册码算法分析和注册机编写
发信人:chn-boy
时 间:2000-12-11 13:04:35
详细信息:
mIRC v5.81版注册码算法分析和注册机编写

软件名称：mIRC v5.81
下载网址：http://soft.hn.cninfo.net/
调试工具：SoftICE 4.05
调试平台：Win2K、W32dsm89

作者：chn-boy
日期：2000-12-11

先用W32dsm89进行静态分析，查找字符串“”，然后上下察看，发现在地址0049D875处有点问题，记下这个地址。下回在mIRC领空时
下中断：bpx 0049D875，从新再进行注册，程序拦断在0049D875处：

:0049D861 E8D89B0800 Call 0052743E
:0049D866 68D33B5400 push 00543BD3
:0049D86B 68EC375400 push 005437EC
:0049D870 E850FBFFFF call 0049D3C5 <-- 注册码的计算Call，跟踪进去详细看看。程序运行到此，d *esp和d esp->4
你可以看到你输入的Name和Code。
:0049D875 85C0 test eax, eax <-- 第一次拦断在此，如果EAX=1，则注册成功
:0049D877 0F84B0000000 je 0049D92D
:0049D87D BED41F5300 mov esi, 00531FD4
:0049D882 BFEC375400 mov edi, 005437EC
:0049D887 33C0 xor eax, eax

将0049D870处的Call 0049D3C5代码取出片断如下：
:0049D41D 68044B5500 push 00554B04 <-- 你输入的Code
:0049D422 68004A5500 push 00554A00 <-- 你输入的Name
:0049D427 E8A6FEFFFF call 0049D2D2 <-- 将你输入的Code和Name分别进行运算，然后进行比较，如果相等，则EAX=1。
:0049D42C 85C0 test eax, eax
:0049D42E 7407 je 0049D437
:0049D430 B801000000 mov eax, 00000001 <-- 将 EAX 置 1，也是注册成功的标志
:0049D435 EB74 jmp 0049D4AB

将0049D427处的Call 0049D2D2代码取出片断如下：
:0049D2F3 6A2D push 0000002D <-- 字符'-'
:0049D2F5 56 push esi <-- Code字符串的offset
:0049D2F6 E841B00700 call 0051833C <-- 得出Code字符串中'-'的位置，值返回到EAX中
:0049D2FB 83C408 add esp, 00000008
:0049D2FE 8BD8 mov ebx, eax
:0049D300 85DB test ebx, ebx
:0049D302 7507 jne 0049D30B
:0049D304 33C0 xor eax, eax
:0049D306 E9B1000000 jmp 0049D3BC
:0049D30B C60300 mov byte ptr [ebx], 00 <-- 将Code字符串中的'-'字符置为0x00
:0049D30E 56 push esi <-- Code字符串的offset
:0049D30F E848440800 call 0052175C <-- 算出第一部分的值，比如：'781', 最后得到0x030D=781
<-- 将值返回到EAX中
:0049D314 59 pop ecx
:0049D315 8945FC mov dword ptr [ebp-04], eax
:0049D318 C6032D mov byte ptr [ebx], 2D <-- 将以前转换的'-'恢复
:0049D31B 43 inc ebx
:0049D31C 803B00 cmp byte ptr [ebx], 00 |
:0049D31F 7507 jne 0049D328 |看看第二部分是否存在，若否，则跳到注册不成功的地方
:0049D321 33C0 xor eax, eax |
:0049D323 E994000000 jmp 0049D3BC |

:0049D328 53 push ebx
:0049D329 E82E440800 call 0052175C <-- 得到第二部分的值
:0049D32E 59 pop ecx
:0049D32F 8945F8 mov dword ptr [ebp-08], eax
:0049D332 FF7508 push [ebp+08]
:0049D335 E8A2B00700 call 005183DC
:0049D33A 59 pop ecx
:0049D33B 8945F4 mov dword ptr [ebp-0C], eax
:0049D33E 33C0 xor eax, eax
:0049D340 33DB xor ebx, ebx
:0049D342 BA03000000 mov edx, 00000003
:0049D347 8B4D08 mov ecx, dword ptr [ebp+08] <-- 将Name字符串的长度值给ECX
:0049D34A 83C103 add ecx, 00000003 <-- Name从第3+1=4个字符开始处理
:0049D34D 3B55F4 cmp edx, dword ptr [ebp-0C]
:0049D350 7D1C jge 0049D36E <-- 如果Name长度少于等于3，则注册不成功

:0049D352 0FB631 movzx esi, byte ptr [ecx] |
:0049D355 0FAF3485341F5300 imul esi, dword ptr [4*eax+00531F34] |
:0049D35D 03DE add ebx, esi |
:0049D35F 40 inc eax |从Name的第4个字符开始，分别用值*对应
:0049D360 83F826 cmp eax, 00000026 (Name长度要少于0x29)|的一个固定字符串（算法分析中给出），
:0049D363 7E02 jle 0049D367 |并求和，将和总值给EBX，用d 0053F34你
:0049D365 33C0 xor eax, eax |可以看到这个固定的字符串。
:0049D367 42 inc edx |
:0049D368 41 inc ecx |
:0049D369 3B55F4 cmp edx, dword ptr [ebp-0C] |
:0049D36C 7CE4 jl 0049D352 |
:0049D36E 3B5DFC cmp ebx, dword ptr [ebp-04] <-- 比较EBX和前面算出的那个第一部分是否相等
:0049D371 7404 je 0049D377
:0049D373 33C0 xor eax, eax <-- 不等，则注册不成功
:0049D375 EB45 jmp 0049D3BC
:0049D377 33C0 xor eax, eax
:0049D379 33DB xor ebx, ebx
:0049D37B BA03000000 mov edx, 00000003
:0049D380 8B4D08 mov ecx, dword ptr [ebp+08]
:0049D383 83C103 add ecx, 00000003
:0049D386 3B55F4 cmp edx, dword ptr [ebp-0C]
:0049D389 7D23 jge 0049D3AE
:0049D38B 0FB631 movzx esi, byte ptr [ecx] |
:0049D38E 0FB679FF movzx edi, byte ptr [ecx-01] |
:0049D392 0FAFF7 imul esi, edi |
:0049D395 0FAF3485341F5300 imul esi, dword ptr [4*eax+00531F34] |
:0049D39D 03DE add ebx, esi |从Name的第4个字符开始，分别用值*前一个字符
:0049D39F 40 inc eax |得值*固定字符串对应值，求和后将值存放到EBX
:0049D3A0 83F826 cmp eax, 00000026 |
:0049D3A3 7E02 jle 0049D3A7 |
:0049D3A5 33C0 xor eax, eax |
:0049D3A7 42 inc edx |
:0049D3A8 41 inc ecx |
:0049D3A9 3B55F4 cmp edx, dword ptr [ebp-0C] |
:0049D3AC 7CDD jl 0049D38B |
:0049D3AE 3B5DF8 cmp ebx, dword ptr [ebp-08] <-- 比较EBX和前面算出的那个第二部分是否相等
:0049D3B1 7404 je 0049D3B7
:0049D3B3 33C0 xor eax, eax <-- 不等，则注册不成功
:0049D3B5 EB05 jmp 0049D3BC
:0049D3B7 B801000000 mov eax, 00000001 <-- 置EAX=1，注册成功的标志
:0049D3BC 5F pop edi
:0049D3BD 5E pop esi
:0049D3BE 5B pop ebx
:0049D3BF 8BE5 mov esp, ebp
:0049D3C1 5D pop ebp
:0049D3C2 C20800 ret 0008

【算法分析】
这个注册码算法很简单，形式就是：假定Name（简称N）和Code（简称C），令N'=Fn1(N), N''=Fn2(N), C'=Fc1(C), C''=Fc2(C)，
如果能让C'=N' && C''=N''那么注册成功。
根据前面分析，固定字符串为0B 06 11 0C 0C 0E 05 0C 10 0A 0B 06 0E 0E 04 0B 06 0E 0E 04 0B 09 0C 0B 0A 08 0A 0A ...
N'=Fn1(N)的定义为：从Name第4个字符开始，分别用值*这个固定的字符串，求出总和。
N''=Fn2(N)的定义为：从Name第4个字符开始，分别用值*前一个字符值*这个固定的字符串，求出总和。

下面关键问题是得到C', C''，由上面的分析可以知道C'=N'=Fn1(N)，C''=N''=Fn2(N)，那么：
C=Fc1逆(C') + '-' + Fc2逆(C'') = Fc1逆(Fn1(N)) + '-' + Fc2逆(Fn2(N))
这个C是很好根据N来得到的。

详细的注册机请看下文。

标 题:mIRC v5.81版注册机编写 （Turbo C 2.0）
发信人:chn-boy
时 间:2000-12-11 13:11:13
详细信息:

 mIRC v5.81版注册机编写

软件名称：mIRC v5.81
下载网址：http://soft.hn.cninfo.net/
编程工具：Turbo C 2.0

作者：chn-boy
日期：2000-12-11

#include <stdio.h>
#include <ctype.h>

unsigned char s_str[] = { 0x0B,0x06,0x11,0x0C,0x0C,0x0E,0x05,0x0C,0x10,
0x0A,0x0B,0x06,0x0E,0x0E,0x04,0x0B,0x06,0x0E,
0x0E,0x04,0x0B,0x09,0x0C,0x0B,0x0A,0x08,0x0A,
0x0A };
unsigned char *pstr,name_str[31],code_str[22],buffer_str[22];
unsigned long sum1,sum2;
int k = 3;

void main()
{
printf("\nPlease Enter your NAME: ");
scanf("%s",name_str);
if(strlen(name_str) > 3) {
pstr = name_str;
sum1 = 0;
sum2 = 0;
k = 3;
while(*(pstr+k) != '\0') {
sum1 += (unsigned long)(*(pstr+k))
  * (unsigned long)(s_str[k-3]);
sum2 += (unsigned long)(*(pstr+k))
  * (unsigned long)(*(pstr+k-1)) * (unsigned long)(s_str[k-3]);
k++;
}
ultoa(sum1, code_str, 10);
k = strlen(code_str);
code_str[k] = 0x2D;
code_str[k + 1] = '\0';

ultoa(sum2, buffer_str, 10);
strcat(code_str,buffer_str);

printf("\nYour Code is: %s", code_str);
} else {
printf("\nMust be 4 or more char......");
}
}

另外，为了Name可以输入汉字的需要，用VC++ 6.0编写了一个32位的Windows程序，大小20K，如果谁需要，可以和我联系。*_^


mirc v5.9

 标 题:破mirc v5.9心得，请各位大侠指点，谁能用C++builder做个注册机最好！ (9千字)
发信人:nanmu
时 间:2001-7-3 15:33:23
详细信息:
前言：经常在论坛上游荡，不知不觉也学到了一点东西。现在放假了，也就有时间亲自动手破解。现贴上一个请各位大侠指点指点。

作者：nanmu

软件名称： mirc v5.9

软件功能：

IRC是英文“Internet Relay Chat”的缩写，它是一种即时交谈工具，是目前全球最流行的聊天方式。它的特点是速度快，方便的自建和使用个人聊天室，同时开20多个小窗与人聊天不影响速度，强大的聊天室管理功能，是全球网友的网上聊天聚会的最佳选择。

软件限制：30 day trial period

下载地址:http://202.102.245.82/soft/soft1/mirc59t.exe

使用工具：W32DASM，trw2000

mirc v5.9的破解过程:

1、启动软件，点击“帮助”菜单中“注册”，任意输入注册名，注册码：弹出窗口："The registration name and number you have entered do not match"

2、反汇编软件,查找该字符串,来到:
...
:004AD06B E817EAF6FF call 0041BA87
:004AD070 50 push eax
:004AD071 6A00 push 00000000

* Possible Reference to String Resource ID=01913: "The registration name and number you have entered do not mat"
|
:004AD073 6879070000 push 00000779 <------停在这里.

3、向上查找,经过分析,来到
.....
* Referenced by a CALL at Addresses:
|:004ACBAB , :004ACC1D
|
:004ACA56 55 push ebp
:004ACA57 8BEC mov ebp, esp
:004ACA59 83C4F4 add esp, FFFFFFF4
:004ACA5C 53 push ebx <------输入的注册名
:004ACA5D 56 push esi <------输入的注册码
:004ACA5E 57 push edi
:004ACA5F 8B750C mov esi, dword ptr [ebp+0C]
:004ACA62 FF7508 push [ebp+08]
:004ACA65 E8CE750800 call 00534038 <------计算注册名长度
:004ACA6A 59 pop ecx
:004ACA6B 83F805 cmp eax, 00000005 <------注册名长度是否大于5
:004ACA6E 7307 jnb 004ACA77 <------大于5就跳,不跳死!
:004ACA70 33C0 xor eax, eax
:004ACA72 E9C9000000 jmp 004ACB40

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACA6E(C)
|
:004ACA77 6A2D push 0000002D <------压入"-"(连接符)
:004ACA79 56 push esi <------压入输入的注册码
:004ACA7A E819750800 call 00533F98 <------判断输入的注册码中"-"的位置,赋给eax
:004ACA7F 83C408 add esp, 00000008
:004ACA82 8BD8 mov ebx, eax
:004ACA84 85DB test ebx, ebx <------输入的注册码中是否有"-",没有ebx=0
:004ACA86 7507 jne 004ACA8F <------不跳就死!
:004ACA88 33C0 xor eax, eax
:004ACA8A E9B1000000 jmp 004ACB40

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACA86(C)
|
:004ACA8F C60300 mov byte ptr [ebx], 00
:004ACA92 56 push esi
:004ACA93 E8A40D0900 call 0053D83C <------计算输入注册码的前半部分,将其十六进制值
赋给eax
:004ACA98 59 pop ecx
:004ACA99 8945FC mov dword ptr [ebp-04], eax <------将输入注册码的前半部分赋给[ebp-04]
:004ACA9C C6032D mov byte ptr [ebx], 2D
:004ACA9F 43 inc ebx
:004ACAA0 803B00 cmp byte ptr [ebx], 00
:004ACAA3 7507 jne 004ACAAC
:004ACAA5 33C0 xor eax, eax
:004ACAA7 E994000000 jmp 004ACB40

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACAA3(C)
|
:004ACAAC 53 push ebx
:004ACAAD E88A0D0900 call 0053D83C <------计算输入注册码的后半部分,将其十六进制值
赋给eax
:004ACAB2 59 pop ecx
:004ACAB3 8945F8 mov dword ptr [ebp-08], eax
:004ACAB6 FF7508 push [ebp+08]
:004ACAB9 E87A750800 call 00534038
:004ACABE 59 pop ecx
:004ACABF 8945F4 mov dword ptr [ebp-0C], eax
:004ACAC2 33C0 xor eax, eax
:004ACAC4 33DB xor ebx, ebx
:004ACAC6 BA03000000 mov edx, 00000003
:004ACACB 8B4D08 mov ecx, dword ptr [ebp+08]
:004ACACE 83C103 add ecx, 00000003 <---定位于输入注册名的第3个字符
:004ACAD1 3B55F4 cmp edx, dword ptr [ebp-0C]
:004ACAD4 7D1C jge 004ACAF2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACAF0(C)
|
:004ACAD6 0FB631 movzx esi, byte ptr [ecx] <---[ecx] 中的第一个字符的十六进制值
赋给esi
:004ACAD9 0FAF3485B8035500 imul esi, dword ptr [4*eax+005503B8]<---将相乘结果赋给esi
005503B8中的值见最后.
:004ACAE1 03DE add ebx, esi <---将相加结果赋给ebx
:004ACAE3 40 inc eax <---将eax加1
:004ACAE4 83F826 cmp eax, 00000026
:004ACAE7 7E02 jle 004ACAEB <---你的注册名不会大于29位吧!!!
:004ACAE9 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACAE7(C)
|
:004ACAEB 42 inc edx
:004ACAEC 41 inc ecx
:004ACAED 3B55F4 cmp edx, dword ptr [ebp-0C] <---和注册名长度比较
:004ACAF0 7CE4 jl 004ACAD6 <---小于,继续计算

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACAD4(C)
|
:004ACAF2 3B5DFC cmp ebx, dword ptr [ebp-04] <--关键!!比较前半部分注册码
? ebx 得正确的前半部分注册码
:004ACAF5 7404 je 004ACAFB <---不等就死!
:004ACAF7 33C0 xor eax, eax
:004ACAF9 EB45 jmp 004ACB40

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACAF5(C)
|
:004ACAFB 33C0 xor eax, eax
:004ACAFD 33DB xor ebx, ebx
:004ACAFF BA03000000 mov edx, 00000003
:004ACB04 8B4D08 mov ecx, dword ptr [ebp+08]
:004ACB07 83C103 add ecx, 00000003 <---定位于输入注册名的第3个字符
:004ACB0A 3B55F4 cmp edx, dword ptr [ebp-0C]
:004ACB0D 7D23 jge 004ACB32

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACB30(C)
|
:004ACB0F 0FB631 movzx esi, byte ptr [ecx] <---[ecx] 中的第一个字符的十六进制值
赋给esi
:004ACB12 0FB679FF movzx edi, byte ptr [ecx-01] <---[ecx] 中的前一个字符(即第2个)的十六进制值
赋给edi
:004ACB16 0FAFF7 imul esi, edi <---将相乘结果赋给esi
:004ACB19 0FAF3485B8035500 imul esi, dword ptr [4*eax+005503B8] <---将相乘结果赋给esi
005503B8中的值见最后.
:004ACB21 03DE add ebx, esi <---将相加结果赋给ebx
:004ACB23 40 inc eax
:004ACB24 83F826 cmp eax, 00000026
:004ACB27 7E02 jle 004ACB2B <---你的注册名不会大于29位吧!!!
:004ACB29 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACB27(C)
|
:004ACB2B 42 inc edx
:004ACB2C 41 inc ecx
:004ACB2D 3B55F4 cmp edx, dword ptr [ebp-0C] <---和注册名长度比较
:004ACB30 7CDD jl 004ACB0F <---小于,继续计算
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACB0D(C)
|
:004ACB32 3B5DF8 cmp ebx, dword ptr [ebp-08] <--关键!!比较后半部分注册码
? ebx 得正确的后半部分注册码
:004ACB35 7404 je 004ACB3B <---不等就死!
:004ACB37 33C0 xor eax, eax
:004ACB39 EB05 jmp 004ACB40

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACB35(C)
|
:004ACB3B B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004ACA72(U), :004ACA8A(U), :004ACAA7(U), :004ACAF9(U), :004ACB39(U)
|
:004ACB40 5F pop edi
:004ACB41 5E pop esi
:004ACB42 5B pop ebx
:004ACB43 8BE5 mov esp, ebp
:004ACB45 5D pop ebp
:004ACB46 C20800 ret 0008

.....
*******************************************************************************
4、005503B8中的值好象是一个事先列好的表,其值依次取
0B 06 11 0C
0C 0E 05 0C
10 0A 0B 06
0E 0E 04 0B
06 0E 0E 04
0B 09 0C 0B
0A 08 0A 0A
10 08 04 06
0A 0C 10 08
0A 04 10
不知道我的理解对不对，还请各位大侠指点！

5、我的注册信息：
Name:nanmu@263.net
code:9277-812430

6、信息存放于：

HKEY_CURRENT_USER\Software\mIRC\License 9277-812430
HKEY_CURRENT_USER\Software\mIRC\UserName nanmu@263.net

HKEY_USERS\.DEFAULT\Software\mIRC\License 9277-812430
HKEY_USERS\.DEFAULT\Software\mIRC\UserName nanmu@263.net


Mouse Odometer v2.0

 标 题:Mouse Odometer v2.0破解（入门） (5千字)
发信人:2000yeah
时 间:2000-10-1 21:41:49
详细信息:
Mouse Odometer v2.0破解（入门）

软件名称：Mouse Odometer v2.0 -->(30天试用且鼠标到5英里后，要求注册）

简 介：一个非常好玩的软件，它能记录你每天鼠标在屏幕上的跑的公里数，呵呵

作 者：2000yeah

级 别：卖菜的

日 期：2000年10月1日

工 具： W32dsm

.................

:00423BCD 90 nop
:00423BCE 90 nop
:00423BCF 90 nop
:00423BD0 0400 add al, 00
:00423BD2 0000 add byte ptr [eax], al
:00423BD4 90 nop
:00423BD5 000C00 add byte ptr [eax+eax], cl
:00423BD8 94 xchg eax,esp
:00423BD9 3D42005452 cmp eax, 52540042
:00423BDE 65675F pop edi
:00423BE1 4E dec esi
:00423BE2 756D jne 00423C51
:00423BE4 202A and byte ptr [edx], ch
:00423BE6 0090558BEC83 add byte ptr [eax+83EC8B55], dl
:00423BEC C4D4 les edx, esp
:00423BEE 53 push ebx
:00423BEF 8BD8 mov ebx, eax
:00423BF1 B8F8734A00 mov eax, 004A73F8
:00423BF6 E8B5820700 call 0049BEB0
:00423BFB 66C745E40800 mov [ebp-1C], 0008
:00423C01 33D2 xor edx, edx
:00423C03 8955FC mov dword ptr [ebp-04], edx
:00423C06 8D55FC lea edx, dword ptr [ebp-04]
:00423C09 FF45F0 inc [ebp-10]
:00423C0C 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00423C12 E809210400 call 00465D20
:00423C17 8D4DFC lea ecx, dword ptr [ebp-04]
:00423C1A 51 push ecx

* Possible StringData Ref from Data Obj ->"277130a" ---------------“注册码”
|
:00423C1B BAF0724A00 mov edx, 004A72F0
:00423C20 8D45F8 lea eax, dword ptr [ebp-08]
:00423C23 E814840700 call 0049C03C
:00423C28 FF45F0 inc [ebp-10]
:00423C2B 8D55F8 lea edx, dword ptr [ebp-08]
:00423C2E 58 pop eax
:00423C2F E8F0850700 call 0049C224
:00423C34 50 push eax
:00423C35 FF4DF0 dec [ebp-10]
:00423C38 8D45F8 lea eax, dword ptr [ebp-08]
:00423C3B BA02000000 mov edx, 00000002
:00423C40 E8FB840700 call 0049C140
:00423C45 FF4DF0 dec [ebp-10]
:00423C48 8D45FC lea eax, dword ptr [ebp-04]
:00423C4B BA02000000 mov edx, 00000002
:00423C50 E8EB840700 call 0049C140
:00423C55 59 pop ecx
:00423C56 84C9 test cl, cl
:00423C58 7467 je 00423CC1 ----------------"一跳就死了”－－－－把je改为jne
:00423C5A A1B0AC4A00 mov eax, dword ptr [004AACB0]
:00423C5F 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Mouse Odometer"
|
:00423C61 B913734A00 mov ecx, 004A7313

* Possible StringData Ref from Data Obj ->"Thank you for registering!" －－－－－－“注册搞定”
|
:00423C66 BAF8724A00 mov edx, 004A72F8
:00423C6B 8B00 mov eax, dword ptr [eax]
:00423C6D E81E830700 call 0049BF90
:00423C72 E84159FEFF call 004095B8
* Reference To: MyTimer._Form2

............

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00423C8E(C)
|
:00423CAE 8BC3 mov eax, ebx
:00423CB0 E843840300 call 0045C0F8
:00423CB5 8B55D4 mov edx, dword ptr [ebp-2C]
:00423CB8 64891500000000 mov dword ptr fs:[00000000], edx
:00423CBF EB3F jmp 00423D00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00423C58(C)
|
:00423CC1 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00423CC7 8B10 mov edx, dword ptr [eax]
:00423CC9 FF5250 call [edx+50]
:00423CCC 3C01 cmp al, 01 －－－－－－－－－－1为注册
:00423CCE 7526 jne 00423CF6
:00423CD0 A1B0AC4A00 mov eax, dword ptr [004AACB0]
:00423CD5 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Mouse Odometer"
|
:00423CD7 B962734A00 mov ecx, 004A7362

* Possible StringData Ref from Data Obj ->"The registration code you entered " “死翘翘..."
->"is invalid, please try again."
|
:00423CDC BA22734A00 mov edx, 004A7322
:00423CE1 8B00 mov eax, dword ptr [eax]
:00423CE3 E8A8820700 call 0049BF90
:00423CE8 8B83C4020000 mov eax, dword ptr [ebx+000002C4]
:00423CEE 8B10 mov edx, dword ptr [eax]
:00423CF0 FF92B4000000 call dword ptr [edx+000000B4]

－－－－－－－－－－－－－－初学破解，错误难免，请各位大侠指点，谢谢。－－－－－－2000.10.1－2000yeah－－－

注册码：277130a


Mover98 V3.1

 标 题:Mover98 V3.1 暴力破解 + 注册码破解(有实时检验、自校验，还有一个非常捉弄人的地方，小心 :D） (8千字)
发信人:paulyoung
时 间:2001-5-7 4:01:07
详细信息:
Mover98 V3.1 暴力破解 + 注册码破解(有实时检验、自校验，还有一个非常捉弄人的地方，小心 :D）

作者：PaulYoung
时间：2001.05.06凌晨
软件简介：是一种搬移软件的工具，你可以利用它将已经安装的软件，从一个磁碟机（资料夹）整个搬动到另外一个磁碟机（资料夹）下，而且还可以正常的执行。连所有和该软件相关的资料夹、捷径、动态连结档等等，通通会一并的搬动。所以在软件搬移之后，不需要修改原来程序集或桌面上的程序捷径，一样还是可以开启软件。在使用方式上，Mover98提供一个精灵，你只要简单的回答几个问题，他就会帮你移动软件。你可以从程序集中选择要移动的软件，也可以直接到磁碟机中指定要搬动的软件资料夹。接下来，你只要指定储存软件的位置，Mover98就会把整个软件通通搬到新的位置下。还可以移动整个windows目录喔！但是Mover98在还没有注册之前，只能让你使用5次而已！
下载：http://www.yadown.com/longfei/patch/pmover9831-f.zip （汉化修改版）
破解工具：TRW 2000 V1.03,HIEW V6.55,W32DASM V8.93
______________________________________________________________________________________________________________

一、暴力篇
    Mover98 V3.1 注册方式采用实时校验方式，即只有用户名和注册码完全正确时，注册键才会被激活。不过我这回采用另外一种办法，巧妙地破解了它。
    首先反汇编它。在“串式参考”处找到"Thank you for registering Mover98. "（注册成功的信息），双击后往上看：

:0047B27F 53 push ebx
:0047B280 8BD8 mov ebx, eax
:0047B282 33C0 xor eax, eax
:0047B284 55 push ebp
:0047B285 681DB34700 push 0047B31D
:0047B28A 64FF30 push dword ptr fs:[eax]
:0047B28D 648920 mov dword ptr fs:[eax], esp
:0047B290 8D55FC lea edx, dword ptr [ebp-04]
:0047B293 8B83F8010000 mov eax, dword ptr [ebx+000001F8]
:0047B299 E8FE61FAFF call 0042149C
:0047B29E 8B45FC mov eax, dword ptr [ebp-04]
:0047B2A1 50 push eax
:0047B2A2 8D55F8 lea edx, dword ptr [ebp-08]
:0047B2A5 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:0047B2AB E8EC61FAFF call 0042149C
:0047B2B0 8B45F8 mov eax, dword ptr [ebp-08]
:0047B2B3 5A pop edx
:0047B2B4 E8BF42FEFF call 0045F578 //无疑，这一定是验证注册码的了，进入看看（按菜单中有CALL字样的小图标）
:0047B2B9 84C0 test al, al
:0047B2BB 7445 je 0047B302
:0047B2BD 6A00 push 00000000
:0047B2BF 668B0D2CB34700 mov cx, word ptr [0047B32C]
:0047B2C6 B203 mov dl, 03

* Possible StringData Ref from Code Obj ->"Thank you for registering Mover98. "
->"Happy moving ..."

**************************************************************************************************************

来到这里...这里肯定是验证注册码的关键了

* Referenced by a CALL at Addresses:
|:0045F6CA , :0047B2B4 , :0047B3A8 　　　　//哇噻，共有三处验证注册码耶！
|
:0045F578 55 push ebp
:0045F579 8BEC mov ebp, esp
:0045F57B 83C4F4 add esp, FFFFFFF4
:0045F57E 53 push ebx
:0045F57F 33C9 xor ecx, ecx
:0045F581 894DF4 mov dword ptr [ebp-0C], ecx
:0045F584 8955F8 mov dword ptr [ebp-08], edx
:0045F587 8945FC mov dword ptr [ebp-04], eax
:0045F58A 8B45FC mov eax, dword ptr [ebp-04]
:0045F58D E82248FAFF call 00403DB4
:0045F592 8B45F8 mov eax, dword ptr [ebp-08]
:0045F595 E81A48FAFF call 00403DB4
:0045F59A 33C0 xor eax, eax
:0045F59C 55 push ebp
:0045F59D 6808F64500 push 0045F608
:0045F5A2 64FF30 push dword ptr fs:[eax]
:0045F5A5 648920 mov dword ptr fs:[eax], esp
:0045F5A8 8B45FC mov eax, dword ptr [ebp-04]
:0045F5AB E85046FAFF call 00403C00
:0045F5B0 83F805 cmp eax, 00000005
:0045F5B3 7C11 jl 0045F5C6
:0045F5B5 8B55FC mov edx, dword ptr [ebp-04]
:0045F5B8 B820F64500 mov eax, 0045F620
:0045F5BD E8CA48FAFF call 00403E8C
:0045F5C2 85C0 test eax, eax
:0045F5C4 7504 jne 0045F5CA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045F5B3(C)
|
:0045F5C6 33DB xor ebx, ebx
:0045F5C8 EB23 jmp 0045F5ED

______________________________________________________________________________________________________________

现在，可以暴力修改了
:0045F6CA E8A9FEFFFF call 0045F578 //NOP 掉（＠Offset0005eacah)
:0047B2B4 E8BF42FEFF call 0045F578 //NOP 掉（＠Offset0007a6b4h)
:0047B3A8 E8CB41FEFF call 0045F578 //NOP 掉（＠Offset0007a7a8h)

另外，需要说明的是，英文原版是有自校验功能的，但这个汉化修改版已去除了自检验，所以不用理会。
之前曾有位大哥发贴说过一种办法，其实可以有两种办法：

//******************** Program Entry Point ********
.
.
.
:0047DC53 E80843FBFF call 00431F60
:0047DC58 84C0 test al, al
:0047DC5A EB05 jmp 0047DC61　　　//方法一：英文原版为 jne 0047DC61,改为jmp 0047DC61.
:0047DC5C E86F5BF8FF call 004037D0 //方法二：可以NOP掉此Call (@Offset 7d05c)

经过修改后，随便填一个用户名，注册名有无均可以注册成功了!!YEAH...
**************************************************************************************************************

二、注册码篇
    虽然暴力破解成功了，但我又心血来潮想解它的注册码，毕竟注册码方便得多啦。
    经检查发现，刚才胡乱填的注册信息存入在C:\WINDOWS\WIN.INI中，格式如下：
[Mover98]
Name=?????
ID=??????

    好，动手破了它！先填好假的用户名和注册码。
[Mover98]
Name=Paul Young （注意注意！！！用户名必须不少于5个字节并且必须包含1个空格以上，Why?Come on,let me tell you!）
ID=78787878

    上面我们已经分析过了，0045F6CA,0047B2B4,0047B3A8三处都是验证注册码的，但不知为什么，我只能在0045F6CA处设断，其余两个不行，不过不要紧，破解继续。
    由于该软件是在启动时读取WIN.INI的信息来判断你是否为注册用户的，当然是在上面这三处判断啦，所以先用TRW 2000 下bpx 0045f6ca,g,退出，运行Mover98,中断在:0045F6CA call 0045F578处（D EAX or D EDX 可以发现它你填的用户名和注册码),F8进入，F10单步跟踪...

:0045F578 55 push ebp
:0045F579 8BEC mov ebp, esp
:0045F57B 83C4F4 add esp, FFFFFFF4
:0045F57E 53 push ebx
:0045F57F 33C9 xor ecx, ecx
:0045F581 894DF4 mov dword ptr [ebp-0C], ecx
:0045F584 8955F8 mov dword ptr [ebp-08], edx
:0045F587 8945FC mov dword ptr [ebp-04], eax
:0045F58A 8B45FC mov eax, dword ptr [ebp-04]
:0045F58D E82248FAFF call 00403DB4
:0045F592 8B45F8 mov eax, dword ptr [ebp-08]
:0045F595 E81A48FAFF call 00403DB4
:0045F59A 33C0 xor eax, eax
:0045F59C 55 push ebp
:0045F59D 6808F64500 push 0045F608
:0045F5A2 64FF30 push dword ptr fs:[eax]
:0045F5A5 648920 mov dword ptr fs:[eax], esp
:0045F5A8 8B45FC mov eax, dword ptr [ebp-04]
:0045F5AB E85046FAFF call 00403C00 //验证用户名
:0045F5B0 83F805 cmp eax, 00000005　　//不能小于5位
:0045F5B3 7C11 jl 0045F5C6
:0045F5B5 8B55FC mov edx, dword ptr [ebp-04]
:0045F5B8 B820F64500 mov eax, 0045F620
:0045F5BD E8CA48FAFF call 00403E8C //D EDX =用户名,D EAX= (空格！！！）
:0045F5C2 85C0 test eax, eax
:0045F5C4 7504 jne 0045F5CA //用户名不包含空格则跳（没有空格时显示no jump,有空格则jump)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045F5B3(C)
|
:0045F5C6 33DB xor ebx, ebx　　　　　//没有空格跳到此玩完
:0045F5C8 EB23 jmp 0045F5ED

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045F5C4(C)
|
:0045F5CA 8B45FC mov eax, dword ptr [ebp-04]
:0045F5CD E85AFFFFFF call 0045F52C
:0045F5D2 8D55F4 lea edx, dword ptr [ebp-0C]
:0045F5D5 E81A81FAFF call 004076F4
:0045F5DA 8B45F4 mov eax, dword ptr [ebp-0C] //D EAX=真注册码（下面几处也可以）
:0045F5DD 8B55F8 mov edx, dword ptr [ebp-08]
:0045F5E0 E82B47FAFF call 00403D10
:0045F5E5 7504 jne 0045F5EB
:0045F5E7 B301 mov bl, 01
:0045F5E9 EB02 jmp 0045F5ED

    看来，做一名 Cracker 有时真需要比女孩子更细心才行呀！！！！！
______________________________________________________________________________________________________________

欢迎光临我的网络小屋

"Cracker 初体验"

http://paulyoung.yeah.net


Mp3 Tag Clinic 1.50

 标 题:注册 Mp3 Tag Clinic 1.50 (16千字)
发信人:6767[BCG]
时 间:2001-8-27 20:47:09
详细信息:
注册 Mp3 Tag Clinic 1.50
by Fpc[CCG]/6767[BCG] @2001/08

tools: si, frogice
level: 1.5

[Begin]

这是在BCG论坛上请求破解的，难度不大，但我是在放弃又拣起才给破掉的。破解真是费力不讨好 :(

基本上这个软件是不利于cracker的：频繁S机。S了十几次之后终于把它的注册机制找到，下面是过程。

以下简称MTC，由aspack压缩，用craspr脱壳会有一个函数找不到。算了，追出注册码是目标。

如果运气好，MTC运行后没S掉，会出现一个带注册按纽的‘关于’窗口。单击‘注册’到注册窗口，有两个输入框：上面的一个是根据硬件算出来的(实际上是计算机名和Windows的序列号)，下面的是要求你输入注册码。好了，输入：1236549870，^D到SI，设断点：bpx hmemcpy。回来，点确定，被拦到，Good!

按几次F12直到你见到下面的代码：

:004B24B6 8D55F4 lea edx, dword ptr [ebp-0C]
:004B24B9 8B83D4020000 mov eax, dword ptr [ebx+02D4]
:004B24BF E81833F8FF call 004357DC <- 这个是读取输入的注册码(Irc)
:004B24C4 8B55F4 mov edx, dword ptr [ebp-0C] <- 返回处在此
:004B24C7 B83C565700 mov eax, 0057563C
:004B24CC E8FB18F5FF call 00403DCC <- 复制到0x57563C处
:004B24D1 66837DFA01 cmp word ptr [ebp-06], 0001
:004B24D6 0F85D1020000 jne 004B27AD <- 不会跳
:004B24DC A1A4625700 mov eax, dword ptr [005762A4]
:004B24E1 C70005000000 mov dword ptr [eax], 00000005
:004B24E7 A13C565700 mov eax, dword ptr [0057563C]
:004B24EC E8071BF5FF call 00403FF8 <- 取Irc长度
:004B24F1 83F810 cmp eax, 00000010 <- 不能大于16
:004B24F4 7D11 jge 004B2507

:004B24F6 B83C565700 mov eax, 0057563C <- eax指向Irc
:004B24FB BA7CDE0000 mov edx, 0000DE7C <- 这个是常量
:004B2500 E813AFFAFF call 0045D418 <- **!!** 这个是核心了；若返回的eax值小于等于0或大于0x1fff则注册失败

:004B2505 8BF8 mov edi, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B24F4(C)
|
:004B2507 85FF test edi, edi <- 检查返回值
:004B2509 0F8E55020000 jle 004B2764 <- 这里不能去
:004B250F 81FF00200000 cmp edi, 00002000
:004B2515 0F8D49020000 jnl 004B2764

... ...(不重要了，省略)

在:004B2500 换F8，追进 call 0045D418，看MTC是如何计算注册码。

* Referenced by a CALL at Addresses:
|... ...
|
:0045D418 55 push ebp
:0045D419 8BEC mov ebp, esp
:0045D41B 83C4BC add esp, FFFFFFBC

... ...(初始化)

:0045D453 8D0568D44500 lea eax, dword ptr [0045D468]
:0045D459 83C00A add eax, 0000000A
:0045D45C 8905A8785700 mov dword ptr [005778A8], eax

:0045D462 EB04 jmp 0045D468 <- **向下跳走

:0045D464 5F pop edi
:0045D465 5E pop esi
:0045D466 5B pop ebx
:0045D467 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045D462(U)
|
:0045D468 837DFCFF cmp dword ptr [ebp-04], FFFFFFFF
:0045D46C 0F84D6010000 je 0045D648
:0045D472 E8159EFAFF call 0040728C
:0045D477 83C02D add eax, 0000002D
:0045D47A A384785700 mov dword ptr [00577884], eax
:0045D47F E8089EFAFF call 0040728C
:0045D484 3B0584785700 cmp eax, dword ptr [00577884]
:0045D48A 0F87B8010000 ja 0045D648 <- 这里不跳，不重要
:0045D490 33F6 xor esi, esi
:0045D492 E891FCFFFF call 0045D128 <- 这里会生成机器号(Hwn)，并以立即数的形式保存在eax中
<- 规则是：将在注册窗口看到的机器号的前8个字符(当然不包括‘-’)变为立即数
<- 比如：机器号=AC7D-680F-53，那么eax=0xAC7D680F

:0045D497 8945F8 mov dword ptr [ebp-08], eax <- 将Hwn保存下来，以后用到

:0045D49A A114625700 mov eax, dword ptr [00576214]
:0045D49F 8B55FC mov edx, dword ptr [ebp-04]
:0045D4A2 8910 mov dword ptr [eax], edx <- 保存常数0xDE7C
:0045D4A4 8D45E0 lea eax, dword ptr [ebp-20]
:0045D4A7 8B17 mov edx, dword ptr [edi]
:0045D4A9 E86269FAFF call 00403E10 <- 不重要

:0045D4AE 8D45E0 lea eax, dword ptr [ebp-20]
:0045D4B1 E85AEAFFFF call 0045BF10 <- 复制一份Irc，有一段代码是检查Irc中是否都为HEX字符

>>>>>>>>

:0045BF31 8B30 mov esi, dword ptr [eax]
:0045BF33 09F6 or esi, esi
:0045BF35 7436 je 0045BF6D
:0045BF37 8B4EFC mov ecx, dword ptr [esi-04]
:0045BF3A 89F7 mov edi, esi
:0045BF3C E32F jcxz 0045BF6D
:0045BF3E 89CB mov ebx, ecx
:0045BF40 FC cld

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045BF61(C)
|
:0045BF41 AC lodsb
:0045BF42 80F830 cmp al, 30
:0045BF45 7219 jb 0045BF60
:0045BF47 80F839 cmp al, 39
:0045BF4A 7613 jbe 0045BF5F
:0045BF4C 80F841 cmp al, 41
:0045BF4F 720F jb 0045BF60
:0045BF51 80F846 cmp al, 46
:0045BF54 7609 jbe 0045BF5F
:0045BF56 660FBAF0 btr ax, F0 <- 此处在内存里不是这样的
:0045BF5A 057303EBED add eax, EDEB0373

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045BF4A(C), :0045BF54(C)
|
:0045BF5F AA stosb

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045BF45(C), :0045BF4F(C)
|
:0045BF60 49 dec ecx
:0045BF61 75DE jne 0045BF41
:0045BF63 B020 mov al, 20

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045BF6B(U)
|
:0045BF65 39FE cmp esi, edi
:0045BF67 7404 je 0045BF6D
:0045BF69 AA stosb
:0045BF6A 4B dec ebx
:0045BF6B EBF8 jmp 0045BF65

<<<<<<<<

:0045D4B6 8BD8 mov ebx, eax
:0045D4B8 8D45E0 lea eax, dword ptr [ebp-20]
:0045D4BB 8BD3 mov edx, ebx
:0045D4BD E86A6EFAFF call 0040432C
:0045D4C2 83C8FF or eax, FFFFFFFF
:0045D4C5 E88E58FAFF call 00402D58

:0045D4CA 8945E4 mov dword ptr [ebp-1C], eax
:0045D4CD E85AF6FFFF call 0045CB2C <- 取Irc长度
:0045D4D2 DD5DE8 fstp qword ptr [ebp-18]
:0045D4D5 9B wait
:0045D4D6 83FB10 cmp ebx, 00000010 <- 是否小于16
:0045D4D9 0F8EB4000000 jle 0045D593 <- 小于是正常的，跳走

:0045D4DF 8D4DDC lea ecx, dword ptr [ebp-24]
:0045D4E2 8B07 mov eax, dword ptr [edi]

... ...

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045D4D9(C)
|
:0045D593 83FB0A cmp ebx, 0000000A <- Irc的长度也不能小于10，正确值其实就是10
:0045D596 7C76 jl 0045D60E

:0045D598 8B0F mov ecx, dword ptr [edi] <- Irc
:0045D59A 8B55FC mov edx, dword ptr [ebp-04] <- 常数0xDE7C
:0045D59D 8B45F8 mov eax, dword ptr [ebp-08] <- Hwn
:0045D5A0 E88BF3FFFF call 0045C930 <- 算法主要是在这里，一定得追进去
:0045D5A5 8BD8 mov ebx, eax
:0045D5A7 85DB test ebx, ebx
:0045D5A9 7E56 jle 0045D601 <- 通常的失败值会是0。怎么知道的？当然是试错

如剥洋葱，心都是在里面，:D 现在接触到算法的实质了，仔细看：

* Referenced by a CALL at Address:
|:0045D5A0
|
:0045C930 55 push ebp
:0045C931 8BEC mov ebp, esp
:0045C933 83C4D4 add esp, FFFFFFD4

... ...

:0045C964 8B45F4 mov eax, dword ptr [ebp-0C]
:0045C967 E88C76FAFF call 00403FF8
:0045C96C 83F80A cmp eax, 0000000A <- Irc长度不能小于10
:0045C96F 0F8CE1000000 jl 0045CA56 <- 看这个跳转的距离，大致看不太难

:0045C975 8D45EC lea eax, dword ptr [ebp-14]
:0045C978 8B55F4 mov edx, dword ptr [ebp-0C]
:0045C97B E89074FAFF call 00403E10
:0045C980 8D45EC lea eax, dword ptr [ebp-14]
:0045C983 E888F5FFFF call 0045BF10 <- 复制一份Irc
:0045C988 8BD0 mov edx, eax
:0045C98A 83FA0A cmp edx, 0000000A <- 这次是必须为10，因为在上面剔除了空格
:0045C98D 0F85C3000000 jne 0045CA56

:0045C993 8D45EC lea eax, dword ptr [ebp-14]
:0045C996 E89179FAFF call 0040432C

:0045C99B 8D4DD4 lea ecx, dword ptr [ebp-2C] <- 目标缓冲区
:0045C99E BA02000000 mov edx, 00000002 <- 2是参数
:0045C9A3 8B45EC mov eax, dword ptr [ebp-14] <- Irc
:0045C9A6 E8F5F5FFFF call 0045BFA0 <- 取最右的2 个字符到缓冲区

:0045C9AB 8B45D4 mov eax, dword ptr [ebp-2C]
:0045C9AE E829FAFFFF call 0045C3DC <- 将其变为立即数放到eax中

:0045C9B3 8BD8 mov ebx, eax <- 保存在ebx

:0045C9B5 8D45EC lea eax, dword ptr [ebp-14]
:0045C9B8 BA08000000 mov edx, 00000008
:0045C9BD E86A79FAFF call 0040432C <- 取前面的的8个字符

:0045C9C2 8B45EC mov eax, dword ptr [ebp-14] <- Irc的前8个字符
:0045C9C5 E8F6F4FFFF call 0045BEC0 <- 计算中间校验码，保存在al中

>>>>>>>>
* Referenced by a CALL at Addresses:
|... ...
|
:0045BEC0 53 push ebx
:0045BEC1 56 push esi
:0045BEC2 57 push edi
:0045BEC3 8BF8 mov edi, eax
:0045BEC5 33DB xor ebx, ebx
:0045BEC7 8BC7 mov eax, edi
:0045BEC9 E82A81FAFF call 00403FF8
:0045BECE 85C0 test eax, eax
:0045BED0 7438 je 0045BF0A

:0045BED2 0FB637 movzx esi, byte ptr [edi] <- 取得第一个字符
:0045BED5 8BC7 mov eax, edi
:0045BED7 E81C81FAFF call 00403FF8 <- 取长度，得到eax=8
:0045BEDC 8BD0 mov edx, eax
:0045BEDE 83EA02 sub edx, 00000002
:0045BEE1 7C22 jl 0045BF05 <- 不会跳
:0045BEE3 42 inc edx
:0045BEE4 B802000000 mov eax, 00000002

* Referenced by a Jump at Address:
|:0045BF03(C) <- 这个循环生成中间校验码到esi
|
:0045BEE9 A801 test al, 01 <- 对2取模
:0045BEEB 740C je 0045BEF9

:0045BEED 33C9 xor ecx, ecx
:0045BEEF 8A4C07FF mov cl, byte ptr [edi+eax-01] <- 取下一个字符
:0045BEF3 03C9 add ecx, ecx <- cl*=2
:0045BEF5 33F1 xor esi, ecx <- si^=cx
:0045BEF7 EB08 jmp 0045BF01

* Referenced by a Jump at Address:
|:0045BEEB(C)
|
:0045BEF9 33C9 xor ecx, ecx
:0045BEFB 8A4C07FF mov cl, byte ptr [edi+eax-01] <- 取下一个字符
:0045BEFF 33F1 xor esi, ecx <- si^cx

* Referenced by a Jump at Address:
|:0045BEF7(U)
|
:0045BF01 40 inc eax
:0045BF02 4A dec edx
:0045BF03 75E4 jne 0045BEE9 <- 未完继续

|
:0045BF05 8BDE mov ebx, esi <- bx=si
:0045BF07 80E3FF and bl, FF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045BED0(C)
|
:0045BF0A 8BC3 mov eax, ebx <- al=bl
:0045BF0C 5F pop edi
:0045BF0D 5E pop esi
:0045BF0E 5B pop ebx
:0045BF0F C3 ret

嘿嘿，这一段变成C就是：

cCRCCheck='\0';
for(i=0; i<8; i++)
cCRCCheck^=(i>1 && i%2==0) ? cIrc[i]*2 : cIrc[i];

<<<<<<<<

:0045C9CA E8C5F2FFFF call 0045BC94 <- 对上面Call产生的中间校验码作镜像翻转，说不明白，编小段程序就知道啦

>>>>>>>>

* Referenced by a CALL at Addresses:
|... ...
|
:0045BC94 D0E8 shr al, 1
:0045BC96 D0D4 rcl ah, 1
:0045BC98 D0E8 shr al, 1
:0045BC9A D0D4 rcl ah, 1
:0045BC9C D0E8 shr al, 1
:0045BC9E D0D4 rcl ah, 1
:0045BCA0 D0E8 shr al, 1
:0045BCA2 D0D4 rcl ah, 1
:0045BCA4 D0E8 shr al, 1
:0045BCA6 D0D4 rcl ah, 1
:0045BCA8 D0E8 shr al, 1
:0045BCAA D0D4 rcl ah, 1
:0045BCAC D0E8 shr al, 1
:0045BCAE D0D4 rcl ah, 1
:0045BCB0 D0E8 shr al, 1
:0045BCB2 D0D4 rcl ah, 1
:0045BCB4 86E0 xchg al, ah <- 校验码保存到al
:0045BCB6 C3 ret

<<<<<<<<

:0045C9CF 25FF000000 and eax, 000000FF
:0045C9D4 3BD8 cmp ebx, eax <- bl放的是Irc的最后两个，比较。因此最后两位是校验码

:0045C9D6 757E jne 0045CA56 <- 不是就去死

:0045C9D8 8B45EC mov eax, dword ptr [ebp-14]
:0045C9DB E8FCF9FFFF call 0045C3DC <- 将Irc变为立即数到eax

:0045C9E0 8945E8 mov dword ptr [ebp-18], eax <- 保存

:0045C9E3 8D45D8 lea eax, dword ptr [ebp-28] <- 缓冲区首址
:0045C9E6 50 push eax
:0045C9E7 E890A8FAFF call 0040727C <- GetSystemTime

:0045C9EC 8B35682C5700 mov esi, dword ptr [00572C68]
:0045C9F2 83E60F and esi, 0000000F
:0045C9F5 83FE00 cmp esi, 00000000 <- esi==5
:0045C9F8 7C54 jl 0045CA4E <- 不跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045CA4C(C)
|
:0045C9FA 0FB745D8 movzx eax, word ptr [ebp-28] <- 年
:0045C9FE C1E00A shl eax, 0A
:0045CA01 0FB755DA movzx edx, word ptr [ebp-26] <- 月
:0045CA05 0BC2 or eax, edx
:0045CA07 C1E008 shl eax, 08
:0045CA0A 0FB755DE movzx edx, word ptr [ebp-22] <- 日
:0045CA0E 0BC2 or eax, edx

比如 2001/08/27，则eax=0x1F44081B (0x1F44=2001*4)。时间参与运算是为增加得法的难度和随机性，也说明正确的注册码有许多

:0045CA10 8B55E8 mov edx, dword ptr [ebp-18] <- edx=Irc
:0045CA13 33D0 xor edx, eax <- edx^=eax (Date)
:0045CA15 3355FC xor edx, dword ptr [ebp-04] <- edx^=Hwn

:0045CA18 8B5DF8 mov ebx, dword ptr [ebp-08] <- ebx=0xDE7C
:0045CA1B F7D3 not ebx <- ebx=~ebx=0xFFFF2183
:0045CA1D 33DA xor ebx, edx <- ebx^=edx

:0045CA1F 8BD3 mov edx, ebx <- edx=ebx

:0045CA21 81E2FFFF0000 and edx, 0000FFFF
:0045CA27 C1EB12 shr ebx, 12
:0045CA2A B8FF1F0000 mov eax, 00001FFF <-

:0045CA2F 3BDA cmp ebx, edx <- 两个值不等则失败
:0045CA31 750D jne 0045CA40

:0045CA33 85D2 test edx, edx <- 这个值要大于0
:0045CA35 7E09 jle 0045CA40

:0045CA37 3BC2 cmp eax, edx <- 要小于0x1FFF
:0045CA39 7C05 jl 0045CA40

:0045CA3B 895DF0 mov dword ptr [ebp-10], ebx <- 保存结果
:0045CA3E EB0E jmp 0045CA4E

... ...(不重要了)

:0045CA83 8B45F0 mov eax, dword ptr [ebp-10] <-
:0045CA86 5E pop esi
:0045CA87 5B pop ebx
:0045CA88 8BE5 mo


Mp3 to All Convertor 1.22

 标 题:Mp3 to All Convertor 1.22的注册陷井 (28千字)
发信人:6767[BCG]
时 间:2001-8-17 2:17:26
详细信息:
Mp3 to All Convertor 1.22的注册陷井
by Fpc[CCG] & 6767 [BCG] @2001/08

tools: SI, icedump, wdasm, ti, fi, peditor, dede (几乎都是老外写的工具)

软件名称：Mp3 To All Converter
整理日期：2001.8.16
最新版本：1.22
文件大小：1707KB
软件授权：共享软件
使用平台：Win9x/Me/NT/2000
发布公司：Home page
软件简介：Mp3To All Converter可将MP3音乐转换成MP3、WMA、VQF格式的工具，且使用上相当简单快速、只需点选MP3音乐、利用鼠标右键快显功能即可。
下 载：http://gt.onlinedown.net/down/mp32all_inst.exe

作者(好象是国人)不知出于什么目的，这个版本的注册蛮有意思，可以说是设下个小圈套，记得以前的一个版本是cmp esi, eax比较了事，这个版本改掉了。是不是以后用keyfile保护有待观察。

[Begin]

下面的步骤中，脱壳不是必须的，只是为了静态分析使用。

1、安装后运行，出现注册窗口，有Name、Key和Code项，随便填入注册信息，注册，得到出错信息。用SI下bpx hmemcpy粗粗跟了一下，还是出错，不过知道了这是个delphi程序。静态分析看一下；

2、用fi检查发现是petite 2.1的壳，很旧的一个壳，完全可手动。但procdump没这个脚本，脱不了。用ti看一下入口点RVA：6B638，再用peditor看Size of Image：91000，记下来。

3、运行icedump，用Symble Loader载入主文件，停在入口处，用G指令：g 46B638直接到原始入口，下：/dump 400000 91000 d:abc.exe。这样得到脱壳文件；

4、运行peditor编辑这个文件，改入口为：6B638，再段编辑，选dumpfixer修复脱壳文件，保存后运行它，没有问题；

5、用dede载入这个abc.exe，在Procedures找到TRegForm，在右边双击BRegClick，这就是注册按纽的相关代码，在下面：

0046791C 55 push ebp

... ...

0046793D 8D55FC lea edx, [ebp-$04]

* Reference to control EName : N.A.
|
00467940 8B8308030000 mov eax, [ebx+$0308]

* Reference to: Controls.TControl.GetText()
|
00467946 E8DD21FCFF call 00429B28 <- 读Name的内容
|
0046794B E834F9FFFF call 00467284 <- 与dll相关，不用管
00467950 8BF0 mov esi, eax
00467952 89B314030000 mov [ebx+$0314], esi

00467958 8D952CFEFFFF lea edx, [ebp+$FFFFFE2C]

* Reference to control EKey : N.A.
|
0046795E 8B8310030000 mov eax, [ebx+$0310]

* Reference to: Controls.TControl.GetText()
|
00467964 E8BF21FCFF call 00429B28 <- 读Key
00467969 8B852CFEFFFF mov eax, [ebp+$FFFFFE2C]

* Reference to: System..DynArrayLength()
| or: System..LStrLen()
|
0046796F E8E4C3F9FF call 00403D58 <- 取Key的长度

00467974 50 push eax

00467975 8D9528FEFFFF lea edx, [ebp+$FFFFFE28]

* Reference to control EKey : N.A.
|
0046797B 8B8310030000 mov eax, [ebx+$0310]

* Reference to: Controls.TControl.GetText()
|
00467981 E8A221FCFF call 00429B28
00467986 8B8528FEFFFF mov eax, [ebp+$FFFFFE28]

* Reference to: System..LStrToPChar()
|
0046798C E88BC5F9FF call 00403F1C <- 什么也不作
00467991 50 push eax
00467992 56 push esi
00467993 8B06 mov eax, [esi]
00467995 FF5004 call dword ptr [eax+$04] <- 对dll函数的调用，不管它
|

打断，前面提到注册中的陷井就在下面这个call中，我们注意到它检查出口的eax是否为0，如果是0紧接着就是注册失败的信息。进入这个call(见之后的代码)，会发现它只是在处理dll中的函数(与注册无关)，但所有的出口前都有xor eax, eax。就是说eax的返回值一定为0，你的注册注定失败!! 我是第一见到这种情况的。

继续看：

00467998 E837FAFFFF call 004673D4
0046799D 8BF0 mov esi, eax
0046799F 85F6 test esi, esi
004679A1 753F jnz 004679E2 <- 不为0跳下去继续处理

004679A3 6A10 push $10 <- 为0就出错了

* Possible String Reference to: 'Error!'
|
004679A5 68487C4600 push $00467C48
004679AA 8D9524FEFFFF lea edx, [ebp+$FFFFFE24]
004679B0 A1D0D64600 mov eax, dword ptr [$46D6D0]

* Reference to: System.LoadResString(System.TResStringRec)
|
004679B5 E822DBF9FF call 004054DC
004679BA 8D8524FEFFFF lea eax, [ebp+$FFFFFE24]

* Possible String Reference to: ' Click OK to Exit.'
|
004679C0 BA587C4600 mov edx, $00467C58

* Reference to: System..LStrCat()
|
004679C5 E896C3F9FF call 00403D60
004679CA 8B8524FEFFFF mov eax, [ebp+$FFFFFE24]

* Reference to: System..LStrToPChar()
|
004679D0 E847C5F9FF call 00403F1C
004679D5 50 push eax
004679D6 6A00 push $00
|
004679D8 E813F2F9FF call 00406BF0
004679DD E9F8010000 jmp 00467BDA <- 之后直接跳走，准备返回了

004679E2 6A08 push $08 <- 向下的这一段不用管
004679E4 8D9520FEFFFF lea edx, [ebp+$FFFFFE20]

* Reference to control EName : N.A.
|
004679EA 8B8308030000 mov eax, [ebx+$0308]

* Reference to: Controls.TControl.GetText()
|
004679F0 E83321FCFF call 00429B28
004679F5 8B8520FEFFFF mov eax, [ebp+$FFFFFE20]

* Reference to: System..LStrToPChar()
|
004679FB E81CC5F9FF call 00403F1C
00467A00 50 push eax
00467A01 8D951CFEFFFF lea edx, [ebp+$FFFFFE1C]

* Reference to control EKey : N.A.
|
00467A07 8B8310030000 mov eax, [ebx+$0310]

* Reference to: Controls.TControl.GetText()
|
00467A0D E81621FCFF call 00429B28
00467A12 8B851CFEFFFF mov eax, [ebp+$FFFFFE1C]

* Reference to: System..LStrToPChar()
|
00467A18 E8FFC4F9FF call 00403F1C
00467A1D 50 push eax
00467A1E 56 push esi
00467A1F 8B06 mov eax, [esi]
00467A21 FF5004 call dword ptr [eax+$04]
00467A24 8BF0 mov esi, eax
00467A26 8D9518FEFFFF lea edx, [ebp+$FFFFFE18]

* Reference to control ECode : N.A.
|
00467A2C 8B83F0020000 mov eax, [ebx+$02F0]

* Reference to: Controls.TControl.GetText()
|
00467A32 E8F120FCFF call 00429B28
00467A37 8B8518FEFFFF mov eax, [ebp+$FFFFFE18]

* Reference to: System..LStrToPChar()
|
00467A3D E8DAC4F9FF call 00403F1C
00467A42 8BD0 mov edx, eax
00467A44 33C0 xor eax, eax
00467A46 8A0C06 mov cl, byte ptr [esi+eax]
00467A49 3A0C02 cmp cl, byte ptr [edx+eax]
00467A4C 744D jz 00467A9B
00467A4E 6A10 push $10
00467A50 8D9514FEFFFF lea edx, [ebp+$FFFFFE14]
00467A56 A1B8D84600 mov eax, dword ptr [$46D8B8]

* Reference to: System.LoadResString(System.TResStringRec)
|
00467A5B E87CDAF9FF call 004054DC
00467A60 8B8514FEFFFF mov eax, [ebp+$FFFFFE14]

* Reference to: System..LStrToPChar()
|
00467A66 E8B1C4F9FF call 00403F1C
00467A6B 50 push eax
00467A6C 8D9510FEFFFF lea edx, [ebp+$FFFFFE10]
00467A72 A1D0D64600 mov eax, dword ptr [$46D6D0]

* Reference to: System.LoadResString(System.TResStringRec)
|
00467A77 E860DAF9FF call 004054DC
00467A7C 8B8510FEFFFF mov eax, [ebp+$FFFFFE10]

* Reference to: System..LStrToPChar()
|
00467A82 E895C4F9FF call 00403F1C
00467A87 8BD0 mov edx, eax
00467A89 A12CD84600 mov eax, dword ptr [$46D82C]
00467A8E 8B00 mov eax, [eax]
00467A90 59 pop ecx

* Reference to: Forms.TApplication.MessageBox()
|
00467A91 E862FEFDFF call 004478F8
00467A96 E93F010000 jmp 00467BDA
00467A9B 40 inc eax
00467A9C 83F821 cmp eax, +$21
00467A9F 75A5 jnz 00467A46
00467AA1 6A00 push $00
00467AA3 8D950CFEFFFF lea edx, [ebp+$FFFFFE0C]
00467AA9 A134D64600 mov eax, dword ptr [$46D634]

* Reference to: System.LoadResString(System.TResStringRec)
|
00467AAE E829DAF9FF call 004054DC
00467AB3 8B850CFEFFFF mov eax, [ebp+$FFFFFE0C]

* Reference to: System..LStrToPChar()
|
00467AB9 E85EC4F9FF call 00403F1C
00467ABE 50 push eax
00467ABF 8D9508FEFFFF lea edx, [ebp+$FFFFFE08]
00467AC5 A1C4D84600 mov eax, dword ptr [$46D8C4]

* Reference to: System.LoadResString(System.TResStringRec)
|
00467ACA E80DDAF9FF call 004054DC
00467ACF 8B8508FEFFFF mov eax, [ebp+$FFFFFE08]

* Reference to: System..LStrToPChar()
|
00467AD5 E842C4F9FF call 00403F1C
00467ADA 8BD0 mov edx, eax
00467ADC A12CD84600 mov eax, dword ptr [$46D82C]
00467AE1 8B00 mov eax, [eax]
00467AE3 59 pop ecx

* Reference to: Forms.TApplication.MessageBox()
|
00467AE4 E80FFEFDFF call 004478F8
00467AE9 8B15F8D84600 mov edx, [$46D8F8]
00467AEF 8B12 mov edx, [edx]
00467AF1 8D8504FEFFFF lea eax, [ebp+$FFFFFE04]

* Possible String Reference to: '\reg.txt' <- 这个是什么显然值得怀疑
|
00467AF7 B9747C4600 mov ecx, $00467C74

* Reference to: System..LStrCat3()
|
00467AFC E8A3C2F9FF call 00403DA4
00467B01 8B9504FEFFFF mov edx, [ebp+$FFFFFE04]
00467B07 8D8530FEFFFF lea eax, [ebp+$FFFFFE30]
|
00467B0D E8FCDCF9FF call 0040580E
00467B12 8D8530FEFFFF lea eax, [ebp+$FFFFFE30]
|
00467B18 E845DFF9FF call 00405A62

* Reference to: System.._IOTest()
|
00467B1D E8A2ACF9FF call 004027C4 <- 向下的一段是写文件操作
00467B22 8D9500FEFFFF lea edx, [ebp+$FFFFFE00]

* Reference to control EName : N.A.
|
00467B28 8B8308030000 mov eax, [ebx+$0308]

* Reference to: Controls.TControl.GetText()
|
00467B2E E8F51FFCFF call 00429B28
00467B33 8B8500FEFFFF mov eax, [ebp+$FFFFFE00]

* Reference to: System..LStrToPChar()
|
00467B39 E8DEC3F9FF call 00403F1C
00467B3E 8BD0 mov edx, eax
00467B40 8D8530FEFFFF lea eax, [ebp+$FFFFFE30]
|
00467B46 E86DE0F9FF call 00405BB8

* Reference to: System..WriteLn()
|
00467B4B E8EBDFF9FF call 00405B3B

* Reference to: System.._IOTest()
|
00467B50 E86FACF9FF call 004027C4
00467B55 8D95FCFDFFFF lea edx, [ebp+$FFFFFDFC]

* Reference to control ECode : N.A.
|
00467B5B 8B83F0020000 mov eax, [ebx+$02F0]

* Reference to: Controls.TControl.GetText()
|
00467B61 E8C21FFCFF call 00429B28
00467B66 8B85FCFDFFFF mov eax, [ebp+$FFFFFDFC]

* Reference to: System..LStrToPChar()
|
00467B6C E8ABC3F9FF call 00403F1C
00467B71 8BD0 mov edx, eax
00467B73 8D8530FEFFFF lea eax, [ebp+$FFFFFE30]
|
00467B79 E83AE0F9FF call 00405BB8

* Reference to: System..WriteLn()
|
00467B7E E8B8DFF9FF call 00405B3B

* Reference to: System.._IOTest()
|
00467B83 E83CACF9FF call 004027C4
00467B88 8D95F8FDFFFF lea edx, [ebp+$FFFFFDF8]

* Reference to control EKey : N.A.
|
00467B8E 8B8310030000 mov eax, [ebx+$0310]

* Reference to: Controls.TControl.GetText()
|
00467B94 E88F1FFCFF call 00429B28
00467B99 8B85F8FDFFFF mov eax, [ebp+$FFFFFDF8]

* Reference to: System..LStrToPChar()
|
00467B9F E878C3F9FF call 00403F1C
00467BA4 8BD0 mov edx, eax
00467BA6 8D8530FEFFFF lea eax, [ebp+$FFFFFE30]
|
00467BAC E807E0F9FF call 00405BB8

* Reference to: System..WriteLn()
|
00467BB1 E885DFF9FF call 00405B3B

* Reference to: System.._IOTest()
|
00467BB6 E809ACF9FF call 004027C4
00467BBB 8D8530FEFFFF lea eax, [ebp+$FFFFFE30]

* Reference to: System..Close()
|
00467BC1 E8EADCF9FF call 004058B0

* Reference to: System.._IOTest()
|
00467BC6 E8F9ABF9FF call 004027C4
00467BCB A12CD84600 mov eax, dword ptr [$46D82C]
00467BD0 8B00 mov eax, [eax]
00467BD2 8B4038 mov eax, [eax+$38]

* Reference to: Forms.TCustomForm.Close()
|
00467BD5 E8AAC8FDFF call 00444484
00467BDA 33C0 xor eax, eax
00467BDC 5A pop edx
00467BDD 59 pop ecx
00467BDE 59 pop ecx
00467BDF 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '^[嬪]肊rror!'
|
00467BE2 68427C4600 push $00467C42
00467BE7 8D85F8FDFFFF lea eax, [ebp+$FFFFFDF8]
00467BED BA03000000 mov edx, $00000003

* Reference to: System..LStrArrayClr()
|
00467BF2 E805BFF9FF call 00403AFC
00467BF7 8D8504FEFFFF lea eax, [ebp+$FFFFFE04]
00467BFD BA05000000 mov edx, $00000005

* Reference to: System..LStrArrayClr()
|
00467C02 E8F5BEF9FF call 00403AFC
00467C07 8D8518FEFFFF lea eax, [ebp+$FFFFFE18]
00467C0D BA03000000 mov edx, $00000003

* Reference to: System..LStrArrayClr()
|
00467C12 E8E5BEF9FF call 00403AFC
00467C17 8D8524FEFFFF lea eax, [ebp+$FFFFFE24]

* Reference to: System..LStrClr(System.AnsiString)
|
00467C1D E8B6BEF9FF call 00403AD8
00467C22 8D8528FEFFFF lea eax, [ebp+$FFFFFE28]
00467C28 BA02000000 mov edx, $00000002

* Reference to: System..LStrArrayClr()
|
00467C2D E8CABEF9FF call 00403AFC
00467C32 8D45FC lea eax, [ebp-$04]

* Reference to: System..LStrClr(System.AnsiString)
|
00467C35 E89EBEF9FF call 00403AD8
00467C3A C3 ret

00467C3B E9ACB8F9FF jmp 004034EC
00467C40 EBA5 jmp 00467BE7

****** END
|
00467C42 5E pop esi
00467C43 5B pop ebx
00467C44 8BE5 mov esp, ebp
00467C46 5D pop ebp
00467C47 C3 ret <- 返回了

显然大家想知道在00467998处 call 004673D4里面的内容，贴出来，我不作解释，注意看xor eax, eax语句：

004673D4 55 push ebp
004673D5 8BEC mov ebp, esp
004673D7 33C9 xor ecx, ecx
004673D9 51 push ecx
004673DA 51 push ecx
004673DB 51 push ecx
004673DC 51 push ecx
004673DD 51 push ecx
004673DE 53 push ebx
004673DF 56 push esi
004673E0 57 push edi
004673E1 33C0 xor eax, eax
004673E3 55 push ebp

* Possible String Reference to: '闈岿�腚嬅_^[嬪]?
|
004673E4 684A754600 push $0046754A

***** TRY
|
004673E9 64FF30 push dword ptr fs:[eax]
004673EC 648920 mov fs:[eax], esp
004673EF 8D45FC lea eax, [ebp-$04]

* Possible String Reference to: '\Mp3Converter.dll'
|
004673F2 BA64754600 mov edx, $00467564

* Reference to: System..LStrLAsg()
|

标 题:注册Mp3 2 All Convertor 1.01 (7千字)
发信人:6767[BCG]
时 间:2001-8-17 14:37:58
详细信息:

注册Mp3 2 All Convertor 1.01
by Fpc[CCG] & 6767 [BCG]

tools: SI, Fi, bw2000, icedump, dede, peditor
d/l: sms.my5599.com/temp/Converter.rar

Peter兄，幸亏有追过1.22的经验，险些又上当，尾哥的注册机也不用写了。倒真想与作者认识一下，这个版本也是不能通过正常途径注册，它的注册标志在注册表中：
REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\TipsOfDialog]
"TipsForAllSkip"=dword:00000001 <- 为0已注册，为1未注册

[Begin]

1、脱壳。与上面的教程一样，不详述，注意Size of Image:90000，OEip:6A7B0；

2、用dede反掉它，找注册按纽事件代码，如下(无关处均省略)：

0046719C 55 push ebp
0046719D 8BEC mov ebp, esp

... ...

004671C1 33C0 xor eax, eax
004671C3 55 push ebp
004671C4 684B724600 push $0046724B

***** TRY
|
004671C9 64FF30 push dword ptr fs:[eax]
004671CC 648920 mov fs:[eax], esp
004671CF 8D55F8 lea edx, [ebp-$08]
004671D2 8B45FC mov eax, [ebp-$04]

* Reference to control TRegForm.EName : TEdit
|
004671D5 8B8008030000 mov eax, [eax+$0308]

|
004671DB E81828FCFF call 004299F8 <- 读取名字
004671E0 8B45F8 mov eax, [ebp-$08] <- 复制名字，效率好低
004671E3 8A00 mov al, byte ptr [eax]
004671E5 8803 mov [ebx], al
004671E7 8B45F8 mov eax, [ebp-$08]
004671EA 8A4001 mov al, byte ptr [eax+$01]

... ...

0046721D 8B45F8 mov eax, [ebp-$08]
00467220 8A4007 mov al, byte ptr [eax+$07]
00467223 884307 mov [ebx+$07], al
00467226 8D55F4 lea edx, [ebp-$0C]
00467229 8B45FC mov eax, [ebp-$04]

* Reference to control TRegForm.ECode : TEdit
|
0046722C 8B80F0020000 mov eax, [eax+$02F0]

|
00467232 E8C127FCFF call 004299F8 <- 读输入的注册码
00467237 8B45F4 mov eax, [ebp-$0C]

|
0046723A E8750DFAFF call 00407FB4 <- string->int/long
0046723F 8BD8 mov ebx, eax <- 保存结果到ebx
00467241 33C0 xor eax, eax
00467243 5A pop edx
00467244 59 pop ecx
00467245 59 pop ecx
00467246 648910 mov fs:[eax], edx
00467249 EB0C jmp 00467257

****** EXCEPT
|
0046724B E914C0F9FF jmp 00403264
00467250 33DB xor ebx, ebx

|
00467252 E869C3F9FF call 004035C0

****** END
|
00467257 6A00 push $00
00467259 6A00 push $00
0046725B 6893810000 push $00008193
00467260 8B45FC mov eax, [ebp-$04]

|
00467263 E86888FCFF call 0042FAD0
00467268 50 push eax

|
00467269 E8B2F8F9FF call 00406B20 <- 关键!! 这个call是SendMessage，是计算注册码的关键
<- 计算的代码段是从 00467093 到 4670F3
<- 全部为浮点指令，结果保存在 0046D8F4 处
<- 但不能注册，接着看

0046726E A1F4D84600 mov eax, dword ptr [$46D8F4] <- 真注册码到eax
00467273 33D2 xor edx, edx <- edx清0
00467275 52 push edx <- edx入栈
00467276 50 push eax <- eax入栈

00467277 8BC3 mov eax, ebx <- 假注册码到eax
00467279 99 cdq <- 看eax是否是一个负数
0046727A 3B542404 cmp edx, [esp+$04] <- 这个是注册失败的关键
<- 原因在于：真注册码是个负数(换用了几个名字，跟出来的)
<- 看下面的比较，若想成功要求你输入的注册码也得是负数
<- 但若如此，edx=-1，而[esp+4]是上面push edx的值，是0
<- 因此会直接跳走到失败处

<- 不知说明白没有

0046727E 7503 jnz 00467283 <- eax为负则跳到失败处

00467280 3B0424 cmp eax, [esp] <- 真假码比较
00467283 5A pop edx
00467284 58 pop eax
00467285 0F8595000000 jnz 00467320 <- 不一致也失败
0046728B 813DF4D84600E8030000 cmp dword ptr [$46D8F4], $003E8 <- 不清楚
00467295 0F8685000000 jbe 00467320

0046729B 6A10 push $10
0046729D 8D55F0 lea edx, [ebp-$10]
004672A0 A1F8C54600 mov eax, dword ptr [$46C5F8]

|
004672A5 E8F2E1F9FF call 0040549C
004672AA 8B45F0 mov eax, [ebp-$10]

|
004672AD E896CCF9FF call 00403F48
004672B2 50 push eax
004672B3 8D55EC lea edx, [ebp-$14]
004672B6 A188C84600 mov eax, dword ptr [$46C888]

|
004672BB E8DCE1F9FF call 0040549C
004672C0 8B45EC mov eax, [ebp-$14]

|
004672C3 E880CCF9FF call 00403F48
004672C8 8BD0 mov edx, eax
004672CA A1F0C74600 mov eax, dword ptr [$46C7F0]
004672CF 8B00 mov eax, [eax]
004672D1 59 pop ecx

|
004672D2 E86104FEFF call 00447738
004672D7 B201 mov dl, $01

* Reference to class TRegistry <- 这个是写注册表用的
|
004672D9 A1B4264500 mov eax, dword ptr [$4526B4]

|
004672DE E8D1B4FEFF call 004527B4
004672E3 8BD8 mov ebx, eax
004672E5 BA01000080 mov edx, $80000001
004672EA 8BC3 mov eax, ebx

|
004672EC E863B5FEFF call 00452854
004672F1 B101 mov cl, $01

* Possible String Reference to: '\Software\Microsoft\Windows\Current
| Version\Explorer\TipsOfDialog' <- 主键
|
004672F3 BAA0734600 mov edx, $004673A0
004672F8 8BC3 mov eax, ebx

|
004672FA E8B9B5FEFF call 004528B8
004672FF B901000000 mov ecx, $00000001

* Possible String Reference to: 'TipsForAllSkip' <- 键名
|
00467304 BAEC734600 mov edx, $004673EC
00467309 8BC3 mov eax, ebx

... ...

|
00467319 E8DABAF9FF call 00402DF8
0046731E EB3C jmp 0046735C

00467320 6A30 push $30
00467322 8D55E8 lea edx, [ebp-$18]
00467325 A1F8C54600 mov eax, dword ptr [$46C5F8]

.. ...

|
00467357 E8DC03FEFF call 00447738
0046735C 33C0 xor eax, eax
0046735E 5A pop edx
0046735F 59 pop ecx
00467360 59 pop ecx
00467361 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '_^[嬪]?
|
00467364 688E734600 push $0046738E

... ...

0046738C EBDB jmp 00467369

****** END
|
0046738E 5F pop edi
0046738F 5E pop esi
00467390 5B pop ebx
00467391 8BE5 mov esp, ebp
00467393 5D pop ebp
00467394 C3 ret

好了，关闭程序，我们看注册表中有些什么，找到相应键后，发现它的值为 0，改为1。再运行，Cool! Support button appears!

狡猾啊，一不小心就可能作无用功。

[End]


Mpeg TV player

 标 题:Cracking Mpeg TV player (4千字)
发信人:jsjyt
时 间:2001-6-22 19:24:39
详细信息:
Introduction
Mpeg TV player is a decent mpeg player for linux, which plays mpegs a lot better than xanim or ubc mpegplay do. It is available at www.mpegtv.com.

Tools Needed
dasm.pl - disassembler for Linux, which relies on objdump
You will need a C compiler to make the crack, but you probably already have that.

Cracking it
The first thing you need to do is disassemble the file "mtv" with dasm.pl
Cacophony:~/cracking/dasm.pl mtv mtv-listing
Now browse through the listing, I just type "less mtv-listing", but you can use whatever you like. Let's search for the string "UNREGISTERED" (in less, or vi, type "/UNREGIST"). You'll arrive at a "Possible reference to string: UNREGISTERED" part of the listing, and directly above that you'll see a "Referenced from jump at 0804cddc;". Go up to 0x0804cddc and you'll see this:

Referenced from call at 0804d1e0 ; 0804e646 ; 0805043e ;

0x0804cdcd subl $0x100,%esp
0x0804cdd3 movl 0x8074144,%ecx
0x0804cdd9 pushl %ebx
0x0804cdda testl %ecx,%ecx
0x0804cddc je 0x0804cdfe

This code simply moves the value of 0x8074144 into ecx, and if ecx is 0, jumps to the unregistered part. So if 0x8074144 was 1, we might be registered (if you look below this code a little bit you will see other things to worry about, but lets ignore them at first and see what happens). So now search for 0x8074144 in your editor, but dont stop until you find where 0x8074144 is being set to a value, not being used to set a register - basically whenever you see it in a movl arg1,arg2, we want to find it after the comma, as arg2, if that makes sense. We end up here:

0x08050258 pushl %ebp
0x08050259 call 0x08058bcc
0x0805025e movl %eax,0x8074144

You can tell right away the function at 0x08058bcc is a registration check, and sets eax to 0 and returns if you aren't registered, but makes eax = 1 if you are. So now go to 0x08058bcc in your listing. Looking through the code at 0x08058bcc, you'll see things like "reference to string: /home/tristan/mpeg/dec/challenge.c", which makes me thing maybe there are assert macros in the code for this program? Either way, it sure sounds like a registration function to me. Scroll down through this function (which is probably worth taking a look at if we were going to try to get a working serial number, which is better then a crack but oh well) until you get to the very end. You will see the usual pop's and ret, and right above that, a xorl eax,eax. XOR'ing a register by itself makes it zero, so we dont want that to happen. Write down the location this occurs at, 0x8058fe9, and now you can exit the listing. xor eax,eax takes two bytes, and we need to make eax = 1 (or greater). If we changed the code into a INC EAX and a NOP, that would guarentee eax is at least 1, and fit just perfectly. So now, in order to make the crack, we need to figure out the hex bytes to search for in the file "mtv". Run the command "objdump -d --show-raw-insn mtv | grep 8058fe". You'll see the bytes we need to change, and the bytes around it to give us a better string to search for in out hex editor. We are going to search for "83 c4 08 31 c0 5b 5e". In your hex editor (dont have one? go to freshmeat.net and get hexer, it has a vi like interface). Search for our string (in hexer, while in command mode type "/\x83\xc4\x08\x31\xc0\x5b\x5e". Notice you are at 00010fe0, just count the number of spaces over until you reach 31, then add that to 10fe0, thats the offset for the bytes we need to change (0x10fe9). Now we will make a small program in c for the crack, and we will be done (the bytes we need to change are 31 c0 into 40 90 (0x40 is the opcode for inc eax, 0x90 is the opcode for NOP). Attached the end of this document is the source for the crack, copy it to a file, save it (I named it mtv-crack.c), type "gcc -o mtv-crack mtv-crack.c", then run mtv-crack in the directory mtv is in.

I just wanted to add that GDB really doesn't compare to soft-ice, luckily its open source, anyone thought of adding features, like assembling code in memory to try cracks out without having to build a crack? I think thats something to look into, along with a decent hex editor for linux, although maybe I just need to look around a little bit more.

--------mtv-crack.c - cut here----------
/* Crack for MpegTV - www.mpegtv.com by vipvop@punkrocker.co.uk
compile - "gcc -o mtv-crack mtv-crack.c"
this is meant for the glibc version */
#include <stdio.h>

char *filen="mtv";

int crackit(long int location)
{
FILE *tocrack;
unsigned char x[2];

x[0]=0x40;
x[1]=0x90;
tocrack = fopen(filen, "r+");
if(!tocrack)
{
printf("Cant open %s\n",filen);
exit(-1);
}
fseek(tocrack,location,SEEK_SET);
fwrite(x,2,1,tocrack);
fseek(tocrack,0,SEEK_END);
fclose(tocrack);
return 0;
}
int main()
{
crackit(0x00010fe9);
}


mymahj 3.2

 标 题:破解MyMahj (5千字)
发信人:TAE!
时 间:2001-6-20 18:41:06
详细信息:
软件名称：mymahj 3。2
保护方式：注册码
破解人： TAE！[BCG] TAE![FCG]
破解方式：找出注册码
软件简介：一个找对子的麻将游戏。最近本人对麻将感兴趣，呵呵!
下载地址：http://home.nordnet.fr/~oplayez/

首先运行程序，出现要求注册的对话框。
输入Email地址，和注册码（当然是假的咯，呵呵）
Ctrl+N,设置断点hmemcpy.回到程序点注册.ok!又到了TRW

下命令pmodule,立刻回到了程序领空.就是这里:

* Reference To: USER32.GetDlgItemTextA, Ord:00EFh
|
:00405E91 E8CEDF0000 Call 00413E64
:00405E96 6A34 push 00000034 <======= 到了这里
:00405E98 68B8ED4500 push 0045EDB8

* Possible Reference to Dialog: DialogID_0393, CONTROL_ID:29D0, ""
|
:00405E9D 68D0290000 push 000029D0
:00405EA2 FF7508 push [ebp+08]

* Reference To: USER32.GetDlgItemTextA, Ord:00EFh
|
:00405EA5 E8BADF0000 Call 00413E64
:00405EAA E85A140000 call 00407309 ----
:00405EAF 803DBD2C470001 cmp byte ptr [00472CBD], 01 |很经典吧!
:00405EB6 7516 jne 00405ECE ----

进入00407309,在这里:

* Referenced by a CALL at Addresses:
|:00405EAA , :00413959 《＝＝＝这个是启动时判断注册码
|
:00407309 55 push ebp
:0040730A 89E5 mov ebp, esp
:0040730C 51 push ecx
:0040730D 53 push ebx
:0040730E 56 push esi
:0040730F 57 push edi
:00407310 31DB xor ebx, ebx
:00407312 C745FC01000000 mov [ebp-04], 00000001
:00407319 68B8ED4500 push 0045EDB8

* Reference To: CRTDLL.atol, Ord:01DEh
|
:0040731E E8D1CE0000 Call 004141F4 <==== 经过这个以后你的注册码就变成数值了
:00407323 59 pop ecx <==== 假注册码地址在ecx
:00407324 8945FC mov dword ptr [ebp-04], eax
:00407327 31F6 xor esi, esi
:00407329 46 inc esi
:0040732A 0FBE1D84ED4500 movsx ebx, byte ptr [0045ED84]
:00407331 EB34 jmp 00407367

下面就是运算核心的第一段!

:00407333 89F0 mov eax, esi
:00407335 B904000000 mov ecx, 00000004
:0040733A 99 cdq
:0040733B F7F9 idiv ecx
:0040733D 09D2 or edx, edx
:0040733F 7415 je 00407356
:00407341 0FBE3C3584ED4500 movsx edi, byte ptr [esi+0045ED84] \\EDI依次指向email的每个字符ascii码值
:00407349 C1E703 shl edi, 03 \\ascii码值乘3给edi
:0040734C 81EFA8000000 sub edi, 000000A8 \\再减A8给edi
:00407352 01FB add ebx, edi \\再加上edi,存入ebx
:00407354 EB10 jmp 00407366

:00407356 0FBE3C3584ED4500 movsx edi, byte ptr [esi+0045ED84]
:0040735E C1E702 shl edi, 02
:00407361 83EF54 sub edi, 00000054
:00407364 29FB sub ebx, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407354(U)
|
:00407366 46 inc esi <===== 计数器
:00407367 BF84ED4500 mov edi, 0045ED84 <===== 这是你输入的Email,地址放入edi
:0040736C 31C0 xor eax, eax <===== eax寄存器清空
:0040736E F9 stc \
:0040736F 19C9 sbb ecx, ecx \这里不太明白作用,请各位帮助
:00407371 F2 repnz /
:00407372 AE scasb /
:00407373 F7D9 neg ecx /
:00407375 8D41FE lea eax, dword ptr [ecx-02]
:00407378 39C6 cmp esi, eax <===== eax是你输入的email的字符个数，就是循环几次的关键
:0040737A 7CB7 jl 00407333 <===== 没有完就继续

下面是运算核心的第二段:

:0040737C 0FBE0589ED4500 movsx eax, byte ptr [0045ED89] \\取email的第5位ascii码参加运算!
:00407383 83E812 sub eax, 00000012 \\减12
:00407386 0FBE158AED4500 movsx edx, byte ptr [0045ED8A] \\取email的第7位ascii码参加运算
:0040738D 83EA12 sub edx, 00000012 \\减12
:00407390 01D0 add eax, edx \\eax+edx
:00407392 0FAFD8 imul ebx, eax \\ebx*eax(eax就是第一段运算核心得出的数值)
:00407395 3B5DFC cmp ebx, dword ptr [ebp-04] \\比较! 这里? ebx即可得到真正的注册码!
:00407398 750E jne 004073A8 \\如果不相等就完了!哈哈
:0040739A E80AFFFFFF call 004072A9
:0040739F C605BD2C470001 mov byte ptr [00472CBD], 01 \\看到这个01就是舒服!哈哈哈
:004073A6 EB07 jmp 004073AF
:004073A8 C605BD2C470000 mov byte ptr [00472CBD], 00 \\到了这里就。。。

谁来写个注册机？
这是我的注册码：Email:TAESUE@163.com
Sn: 318936
软件注册成功后会在目录下生成一个隐含文件Mymahj.key！

写个教程真的很麻烦!花了一个多小时,呼呼!
但是今天很高兴，因为我已经加入了BCG,FCG
非常感谢bnbnf(我兄弟^_^）、copyyour、xy2000[BCG]、小球[CCG]、幻影2001、鱼儿、娃娃等人的支持！(排名不分先后，哈哈哈）
文中有疏漏的地方还请各位指出。谢谢！！


Net Vampire v3.3

 标 题:[FCG]的作业---Net Vampire v3.3 的破文 (12千字)
发信人:lancelot[CCG]
时 间:2001-8-26 19:12:03
详细信息:
这个软件已经出来很久了(最新版v4.0 还没出来),keygen满天飞，不知以前有没有人写过它的破解，反正我没看到
既然要学 crack 就不想用别人的 keygen, 就把它当作加入[FCG]后的第一个作业吧。

首先用 filemonitor 得知软件运行时会调用 system 目录下的 advert.dll (估计是广告条)

用 W32Dasm 载入，选上 DLL Load Brk 的选项，然后一直 Run 到开始载入 advert.dll, 记下地址 00471605

* Reference To: kernel32.LoadLibraryA, Ord:0000h
|
:00471600 E86348F9FF Call 00405E68
:00471605 8B55FC mov edx, dword ptr [ebp-04]<-----------停在这里
:00471608 8982D8000000 mov dword ptr [edx+000000D8], eax
:0047160E 8B45FC mov eax, dword ptr [ebp-04]
:00471611 83B8D800000000 cmp dword ptr [eax+000000D8], 00000000
:00471618 7524 jne 0047163E
:0047161A 6A00 push 00000000
:0047161C 668B0DB8184700 mov cx, word ptr [004718B8]
:00471623 B201 mov dl, 01
=======================================================================================

往上看，哪里可以跳过这个 call，这里省略几个 jump, 来到这里

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049AF47(U)
|
:0049AF5D E87A0FFFFF call 0048BEDC<------------------估计是比较，跟进去
:0049AF62 A1A0C94A00 mov eax, dword ptr [004AC9A0]
:0049AF67 833800 cmp dword ptr [eax], 00000000
:0049AF6A 7521 jne 0049AF8D<--------------------这里一定要跳，否则就到刚才的地方了
:0049AF6C 8B45FC mov eax, dword ptr [ebp-04]
:0049AF6F 8B800C050000 mov eax, dword ptr [eax+0000050C]
:0049AF75 E89271FDFF call 0047210C
:0049AF7A 8B45FC mov eax, dword ptr [ebp-04]
:0049AF7D 8B800C050000 mov eax, dword ptr [eax+0000050C]
:0049AF83 E89C6CFDFF call 00471C24
:0049AF88 E980000000 jmp 0049B00D

==============================================================================================
记下地址 0049af5d, 取消断点，运行程序，输入用户名和注册码，关闭程序。

启用 trw2k , 下 bpx ****:0049af5d , 运行 Net Vampire v3.3 来到这里

* Referenced by a CALL at Address:
|:0049AF5D
|
:0048BEDC 55 push ebp
:0048BEDD 8BEC mov ebp, esp
:0048BEDF 6A00 push 00000000
:0048BEE1 6A00 push 00000000
:0048BEE3 6A00 push 00000000
:0048BEE5 53 push ebx
:0048BEE6 56 push esi
:0048BEE7 57 push edi
:0048BEE8 33C0 xor eax, eax
:0048BEEA 55 push ebp
:0048BEEB 68B7BF4800 push 0048BFB7
:0048BEF0 64FF30 push dword ptr fs:[eax]
:0048BEF3 648920 mov dword ptr fs:[eax], esp
:0048BEF6 33C0 xor eax, eax
:0048BEF8 55 push ebp
:0048BEF9 6860BF4800 push 0048BF60
:0048BEFE 64FF30 push dword ptr fs:[eax]
:0048BF01 648920 mov dword ptr fs:[eax], esp
:0048BF04 8D45FC lea eax, dword ptr [ebp-04]
:0048BF07 50 push eax
:0048BF08 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"vE9nT$Ma."<------------什么东西？
|
:0048BF0A BAD0BF4800 mov edx, 0048BFD0
:0048BF0F A164DA4A00 mov eax, dword ptr [004ADA64]<--假注册码
:0048BF14 E81B57FDFF call 00461634<-----------------核心计算，要跟进去(1)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048BEC7(C)
|
:0048BF19 8B45FC mov eax, dword ptr [ebp-04]<-----由假注册码算出的
:0048BF1C 50 push eax 用户名2
:0048BF1D 8D45F8 lea eax, dword ptr [ebp-08]
:0048BF20 50 push eax
:0048BF21 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->" "
|
:0048BF24 B9E4BF4800 mov ecx, 0048BFE4<---------------9个空格
:0048BF29 8B1560DA4A00 mov edx, dword ptr [004ADA60]<---输入的用户名，用户名1
:0048BF2F E8187EF7FF call 00403D4C
:0048BF34 8B45F4 mov eax, dword ptr [ebp-0C]
:0048BF37 B909000000 mov ecx, 00000009
:0048BF3C BA01000000 mov edx, 00000001
:0048BF41 E8BE7FF7FF call 00403F04
:0048BF46 8B55F8 mov edx, dword ptr [ebp-08]<---用户名1的前9位
:0048BF49 58 pop eax
:0048BF4A E8C17EF7FF call 00403E10<--------比较用户名1和用户名2
:0048BF4F 7405 je 0048BF56<-----------跳？一定要跳!(此处改jmp则爆破)
:0048BF51 E89EEDF7FF call 0040ACF4

================================================================================================
* Referenced by a CALL at Addresses:
|:00467EB2 , :00468192 , :00488EBF , :0048BB84 , :0048BBDF
|:0048BC16 , :0048BD4E , :0048BD8D , :0048BDCC , :0048BF14
|:004A2A4A , :004A2E42 , :004A52CA , :004A591E
|
:00461634 55 push ebp<--------------------------(1)
:00461635 8BEC mov ebp, esp
:00461637 83C4D8 add esp, FFFFFFD8
:0046163A 53 push ebx
:0046163B 33DB xor ebx, ebx
:0046163D 895DD8 mov dword ptr [ebp-28], ebx<---0
:00461640 884DF7 mov byte ptr [ebp-09], cl<-----0
:00461643 8955F8 mov dword ptr [ebp-08], edx<---"vE9nT$Ma."
:00461646 8945FC mov dword ptr [ebp-04], eax<---假注册码
:00461649 8B45FC mov eax, dword ptr [ebp-04]
:0046164C E86328FAFF call 00403EB4
:00461651 8B45F8 mov eax, dword ptr [ebp-08]
:00461654 E85B28FAFF call 00403EB4
:00461659 33C0 xor eax, eax
:0046165B 55 push ebp
:0046165C 6820184600 push 00461820
:00461661 64FF30 push dword ptr fs:[eax]
:00461664 648920 mov dword ptr fs:[eax], esp
:00461667 8B4508 mov eax, dword ptr [ebp+08]
:0046166A E81524FAFF call 00403A84
:0046166F 837DFC00 cmp dword ptr [ebp-04], 00000000
:00461673 0F8484010000 je 004617FD
:00461679 837DF800 cmp dword ptr [ebp-08], 00000000
:0046167D 0F847A010000 je 004617FD
:00461683 33C0 xor eax, eax
:00461685 8945F0 mov dword ptr [ebp-10], eax
:00461688 807DF700 cmp byte ptr [ebp-09], 00
:0046168C 0F84AD000000 je 0046173F<----------------------跳，核心(2)
================================================================================================

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046168C(C)
|
:0046173F 55 push ebp<---------------------------(2)
:00461740 8D45D8 lea eax, dword ptr [ebp-28]
:00461743 50 push eax
:00461744 B902000000 mov ecx, 00000002<--------------------取2位
:00461749 BA01000000 mov edx, 00000001<--------------------从第1位开始
:0046174E 8B45FC mov eax, dword ptr [ebp-04]<---假注册码
:00461751 E8AE27FAFF call 00403F04
:00461756 8B45D8 mov eax, dword ptr [ebp-28]<---第1、2位
:00461759 E85AFEFFFF call 004615B8
:0046175E 59 pop ecx
:0046175F 8945EC mov dword ptr [ebp-14], eax<---转换成16进制 (12=>0x12)
:00461762 C745E803000000 mov [ebp-18], 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004617F7(C)
|
:00461769 55 push ebp
:0046176A 8D45D8 lea eax, dword ptr [ebp-28]
:0046176D 50 push eax
:0046176E B902000000 mov ecx, 00000002<-------------取2位
:00461773 8B55E8 mov edx, dword ptr [ebp-18]<---3，从第3位开始
:00461776 8B45FC mov eax, dword ptr [ebp-04]<---假注册码
:00461779 E88627FAFF call 00403F04
:0046177E 8B45D8 mov eax, dword ptr [ebp-28]<---第3、4位
:00461781 E832FEFFFF call 004615B8
:00461786 59 pop ecx
:00461787 8945E4 mov dword ptr [ebp-1C], eax<---转换成16进制 (34=>0x34)
:0046178A 8B45F8 mov eax, dword ptr [ebp-08]<---"vE9nT$Ma."
:0046178D E86E25FAFF call 00403D00<-----------------"vE9nT$Ma."的长度9=>eax
:00461792 3B45F0 cmp eax, dword ptr [ebp-10]
:00461795 7E05 jle 0046179C
:00461797 FF45F0 inc [ebp-10]
:0046179A EB07 jmp 004617A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461795(C)
|
:0046179C C745F001000000 mov [ebp-10], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046179A(U)
|
:004617A3 8B45F8 mov eax, dword ptr [ebp-08]<---"vE9nT$Ma."
:004617A6 8B55F0 mov edx, dword ptr [ebp-10]<----1
:004617A9 0FB64410FF movzx eax, byte ptr [eax+edx-01]<--'v'的16进制=0x76
:004617AE 3345E4 xor eax, dword ptr [ebp-1C]<------与注册码的3、4位异或==(0x42)
:004617B1 8945E0 mov dword ptr [ebp-20], eax
:004617B4 8B45E0 mov eax, dword ptr [ebp-20]
:004617B7 3B45EC cmp eax, dword ptr [ebp-14]<------异或后的值与注册码的1、2位比较
:004617BA 7F07 jg 004617C3
:004617BC 8145E0FF000000 add dword ptr [ebp-20], 000000FF<---如果小于，则加0xff

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004617BA(C)
|
:004617C3 8B45EC mov eax, dword ptr [ebp-14]
:004617C6 2945E0 sub dword ptr [ebp-20], eax<-----然后减去注册码的1、2位 (0x12)
:004617C9 8D45D8 lea eax, dword ptr [ebp-28]<-----第3、4位 (0x34)
:004617CC 8B55E0 mov edx, dword ptr [ebp-20]<-----减完后的值 (0x30)
:004617CF E85424FAFF call 00403C28<-------------------???????????
:004617D4 8B55D8 mov edx, dword ptr [ebp-28]<-----减完后的值0x30
:004617D7 8B4508 mov eax, dword ptr [ebp+08]<-----0
:004617DA E82925FAFF call 00403D08<-------------------放入堆栈
:004617DF 8B4508 mov eax, dword ptr [ebp+08]<-----0x30
:004617E2 8B45E4 mov eax, dword ptr [ebp-1C]<-----第3、4位 (0x34)
:004617E5 8945EC mov dword ptr [ebp-14], eax<-----把第1、2位换成3、4位
:004617E8 8345E802 add dword ptr [ebp-18], 00000002<-----3+2=5
:004617EC 8B45FC mov eax, dword ptr [ebp-04]<-----假注册码
:004617EF E80C25FAFF call 00403D00<-------------------假注册码的长度0x14=>eax
:004617F4 3B45E8 cmp eax, dword ptr [ebp-18]<-----注册码长度与[ebp-18]比较
:004617F7 0F8F6CFFFFFF jg 00461769<---------------------小则跳，循环计算
=================================================================================================

总结一下：

每1位用户名需要2位注册码，9位的用户名就需要18位的注册码，再加最后两位(见下面），共需20位注册码
每2位注册妈组成一个单元，如下：

注册码：** ** ** ** ** ** ** ** ** **
单元： i0 i1 i2 i3 i4 i5 i6 i7 i8 i9

用户名：lancelot[CCG] 的前9位 lancelot[ 转换成16进制 0x6c 0x61 0x6e 0x63 0x65 0x6c 0x6f 0x74 0x5b
固定字符串：vE9nT$Ma. 转换成16进制-----------------> 0x76 0x45 0x39 0x6e 0x54 0x24 0x4d 0x61 0x2e

我们要使得：1) (0x76 XOR i1)-i0==0x6c--->l
2) (0x45 XOR i2)-i1==0x61--->a
3) (0x39 XOR i3)-i2==0x6e--->n
4) (0x6e XOR i4)-i3==0x63--->c
5) (0x54 XOR i5)-i4==0x65--->e
6) (0x24 XOR i6)-i5==0x6c--->l
7) (0x4d XOR i7)-i6==0x6f--->o
8) (0x61 XOR i8)-i7==0x74--->t
9) (0x2e XOR i9)-i8==0x5b--->[<---------现在知道为什么要再加2位了吧

因此可进行如下逆运算：先假设 i0==0x6e<---------可任意
1) (0x6c+i0) XOR 0x76==0xac=======>i1
2) 因为：0x61+i1==0x61+0xac==0x10d>0xff 所以: 0x10d-0xff==0xe, 0xe XOR 0x45==0x4b, 以下同
(0x61+i1-0xff) XOR 0x45==0x4b==>i2
3) (0x6e+i2) XOR 0x39==0x80=======>i3
4) (0x63+i3) XOR 0x6e==0x8d=======>i4
5) (0x65+i4) XOR 0x54==0xa6=======>i5
6) (0x6c+i5-0xff) XOR 0x24==0x37==>i6
7) (0x6f+i6) XOR 0x4d==0xeb=======>i7
8) (0x74+i7-0xff) XOR 0x61==0x01==>i8
9) (0x5b+i8) XOR 0x2e==0x72=======>i9

正确的注册码应该是：6e ac 4b 80 8d a6 37 eb 01 72
单元： i0 i1 i2 i3 i4 i5 i6 i7 i8 i9

Net Vampire v3.3 Crack by lancelot[CCG][FCG] 2001.08.26


NetAnts 1.22

 标 题:根据论坛精华我把网络蚂蚁1.22的广告条去除了,简单过程如下,高手勿进! (4千字)
发信人:floatsnow
时 间:2001-6-5 17:26:01
详细信息:
网络蚂蚁广告窗去除 NetAnts 1.22
下面程序调用CreateWindowExA函数创建网络蚂蚁所用到的窗口
* Reference To: USER32.SetMenu, Ord:0235h
|
:0041A807 FF15ECC34300 Call dword ptr [0043C3EC]
:0041A80D 57 push edi
:0041A80E E863DA0000 call 00428276
:0041A813 3BC3 cmp eax, ebx
:0041A815 59 pop ecx
:0041A816 A36C854400 mov dword ptr [0044856C], eax
:0041A81B 0F84A51E0000 je 0041C6C6
:0041A821 50 push eax
:0041A822 E8C9DB0000 call 004283F0 //创建 ToolBar
:0041A827 3BC3 cmp eax, ebx
:0041A829 59 pop ecx
:0041A82A A3B8854400 mov dword ptr [004485B8], eax
:0041A82F 0F84911E0000 je 0041C6C6
:0041A835 FF356C854400 push dword ptr [0044856C]
:0041A83B E810170100 call 0042BF50
:0041A840 3BC3 cmp eax, ebx
:0041A842 59 pop ecx
:0041A843 A398854400 mov dword ptr [00448598], eax
:0041A848 0F84781E0000 je 0041C6C6
:0041A84E 57 push edi
:0041A84F E8007AFEFF call 00402254 //创建 广告条
:0041A854 3BC3 cmp eax, ebx
:0041A856 59 pop ecx
:0041A857 A3B0854400 mov dword ptr [004485B0], eax //保存窗口句柄
:0041A85C 0F84641E0000 je 0041C6C6
:0041A862 57 push edi
:0041A863 E860CA0000 call 004272C8
:0041A868 3BC3 cmp eax, ebx
:0041A86A 59 pop ecx
:0041A86B A3C4864400 mov dword ptr [004486C4], eax
:0041A870 0F84501E0000 je 0041C6C6
:0041A876 57 push edi
:0041A877 E8FB18FFFF call 0040C177
:0041A87C 3BC3 cmp eax, ebx
:0041A87E 59 pop ecx
:0041A87F A384854400 mov dword ptr [00448584], eax
:0041A884 0F843C1E0000 je 0041C6C6
:0041A88A 57 push edi
:0041A88B E84CA2FFFF call 00414ADC //创建 SysListView32
:0041A890 3BC3 cmp eax, ebx
:0041A892 59 pop ecx
:0041A893 A390854400 mov dword ptr [00448590], eax
:0041A898 0F84281E0000 je 0041C6C6
:0041A89E 57 push edi
:0041A89F E84EBFFEFF call 004067F2
:0041A8A4 3BC3 cmp eax, ebx
:0041A8A6 59 pop ecx
:0041A8A7 A3A0854400 mov dword ptr [004485A0], eax
:0041A8AC 0F84141E0000 je 0041C6C6

关键在于41A84F处的Call,将41A84F到0041A862处的代码改成如下
改前:
:0041A84F E8007AFEFF call 00402254 //创建 广告条
:0041A854 3BC3 cmp eax, ebx
:0041A856 59 pop ecx
:0041A857 A3B0854400 mov dword ptr [004485B0], eax //保存窗口句柄
:0041A85C 0F84641E0000 je 0041C6C6
:0041A862 57 push edi
改后:
:0041A84F 31C0909090 xor eax,eax //清eax=0
:0041A854 3BC3 cmp eax, ebx
:0041A856 59 pop ecx
:0041A857 A3B0854400 mov dword ptr [004485B0], eax //保存窗口句柄
:0041A85C 90 nop
:0041A85D 90 nop
:0041A85E 90 nop
:0041A85F 90 nop
:0041A860 90 nop
:0041A861 90 nop
:0041A862 57 push edi
自此将不会再出现广告条,而是好大一面墙.下面将通过该SysListView32的高度去除这面墙
* Possible Reference to String Resource ID=00001: "Invalid retry delay"
|
:0041A659 6A01 push 00000001
:0041A65B 2B45F0 sub eax, dword ptr [ebp-10]
:0041A65E 6A42 push 00000042
:0041A660 50 push eax
:0041A661 FF75F4 push [ebp-0C]
:0041A664 FF75F0 push [ebp-10]
:0041A667 FF35B0854400 push dword ptr [004485B0]
:0041A66D FFD7 call edi
:0041A66F 8345F443 add dword ptr [ebp-0C], 00000043 //确定SysListView32位置
//00000043是墙的高度,也就是广告条的高度
:0041A673 391D80854400 cmp dword ptr [00448580], ebx
:0041A679 0F84F5000000 je 0041A774

* Possible Reference to String Resource ID=00005: "Invalid maximum speed"
|
:0041A67F 6A05 push 00000005
根据上面分析只要将0041a66F除的00000043改成00000000就可以了
改前: 0041A66F 8345F443 add dword ptr [ebp-0C], 00000043
改后: 0041A66F 8345F400 add dword ptr [ebp-0C], 00000000
到此网络蚂蚁1.22版去广告条成功.


NetTerm 4.2.c

标 题:NetTerm 4.2.c注册过程分析及注册机制作SBS (6千字)
发信人:yuky
时 间:2001-4-27 16:50:49
详细信息:
作者:Yuky
目标:NetTerm 4.2.c
下载:http://topsoft.163.com/software/download.php?id=3927
工具:trw2000注册版
时间:2001.4.26-2001.4.27
地点:广州

NetTerm是windows下的终端软件, 用起来还不错，只是它经常要你注册，我受不了它的殷切提醒，决定不让它打扰我。

先随便注册一下，它不像其它软件梆的一声弹出对话框上写“注册失败“，而是很温柔的在不宜觉察的状态条上显示“错误的码“。

好了，可以开工了。用户名：yxg，密码：78787878。在trw2000中下一个常用的中断“bpx hmemcpy“，点确定，被拦下，下“bd *"，关掉断点，下“pmodule“返回到NetTerm的领空。

:00430B48 8D85E8FEFFFF lea eax, dword ptr [ebp+FFFFFEE8]
:00430B4E 50 push eax ；eax->'78787878'
:00430B4F 8D85E8FDFFFF lea eax, dword ptr [ebp+FFFFFDE8]
:00430B55 50 push eax ；eax->'yxg'

.... .....

:0043096C 83BDFCFEFFFF08 cmp dword ptr [ebp+FFFFFEFC], 00000008 ;比较注册码长度是否为8
:00430973 0F8547000000 jne 004309C0

..... ....

:0043098E E867C60100 Call IsIlogo!DoRegistrator ;调用isilogo.dll的DoRegistrator函数，看来是注册核心

:00430993 8985F8FDFFFF mov dword ptr [ebp+FFFFFDF8], eax
:00430999 83BDF8FDFFFF00 cmp dword ptr [ebp+FFFFFDF8], 00000000
:004309A0 0F841A000000 je 004309C0

这个DoRegistrator很可疑，看一下堆栈，其中有字符串'yxg','78787878','a123456789cfikuq3A9S'的地址，还有一个整数4，可能是标志。那么这个函数一定是注册码的比对函数了，不敢迟疑，F8追进去。

经过几个比对及跳转到：

:4E2220 PUSH EAX ;EAX->'78787878'目标出现
:4E222A CALL ;这个函数将字符串'78787878'转换成HEX串78787878。
这个函数的算法：从注册码中取出一个字符，和字符串'a123456789cfikuq'比较，如果找到，返回在串中的位置，如：字符'a'返回0，字符'1'返回1，字符'c'返回0xa。如果没找到，返回0。

:4E2330 CALL 4E2357
看一下堆栈，有'yxg'，0x78787878的地址，看来有问题，追进去。发现这里是注册码算法的关键。
再看一下用户名：'yxg',Hex串为：79 78 67。注册码(已转换成Hex串)：78 78 78 78
循环开始
1.79 xor 78=01 78+79=F1
2.F1 xor 01=F0 78+F1=69
3.69 xor F0=99 78+69=E1
到这里后，把99放到78的位置上，现在注册码的位置上为：99 78 78 78
接下来对第二对注册码运算
4.E1 xor 78=99 78+E1=59
5.59 xor 99=C0 78+59=D1
6.D1 xor C0=11 78+D1=49
现在注册码的位置上为：99 11 78 78
再取下一对注册码78：
7.49 xor 78=31 78+49=C1
8.C1 xor 31=F0 78+C1=39
9.39 xor F0=C9 78+39=B1
现在注册码的位置上为：99 11 C9 78
再取下一对注册码78：
10.B1 xor 78=C9 78+B1=29
11.29 xor C9=E0 78+29=A1
12.A1 xor E0=41 78+A1=19
对注册码的处理完成，现在变为：99 11 C9 41

:1C002259 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:1C00225F 50 push eax
:1C002260 8D85FCFCFFFF lea eax, dword ptr [ebp+FFFFFCFC]
:1C002266 50 push eax
* Reference To: KERNEL32.lstrcmpA, Ord:0269h |
:1C002267 FF157061001C Call dword ptr [1C006170]
这个lstrcmpA函数一看就知是字符串比较函数，看它的堆栈，一个是处理过的注册码的地址，一个是"3A9S"的地址，还记得strcmp()函数吗，如果两个字符串相等，返回0。往下看：

:1C00226D 85C0 test eax, eax ;比较返回值是否是0
:1C00226F 0F850F000000 jne 1C002284 ；不是的话跳到1C002284，
:1C002275 B801000000 mov eax, 00000001
:1C00227A E90C000000 jmp 1C00228B
:1C00227F E907000000 jmp 1C00228B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1C00226F(C)
|
:1C002284 33C0 xor eax, eax ；不是0执行这里，使eax清零,
:1C002286 E900000000 jmp 1C00228B
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1C00219C(U), :1C0021C0(U), :1C00227A(U), :1C00227F(U), :1C002286(U)
|
:1C00228B 5F pop edi
:1C00228C 5E pop esi
:1C00228D 5B pop ebx
:1C00228E C9 leave
:1C00228F C21000 ret 0010

然后程序从dll返回到NetTerm，把eax的值带回来。如果不相同，经过xor eax,eax后，eax为0.
:00430993 8985F8FDFFFF mov dword ptr [ebp+FFFFFDF8], eax
:00430999 83BDF8FDFFFF00 cmp dword ptr [ebp+FFFFFDF8], 00000000
:004309A0 0F841A000000 je 004309C0

再往下走，过了几十行，按F4看到状态条上的“错误的码“。
好了，现在我们试试，将:1C00226D的test eax, eax改为dec eax;nop或xor eax,eax然后运行，仍是原来的用户名注册码，不过现在显示“验证成功！“，看来是找对地方了，我们已经分析了它的注册码比较过程，所以不仅仅要爆破，还要算出注册码。由它的注册码计算过程来看，算法很简单:

原注册码 xor <----异或因子1
|
|
中间结果 xor <----异或因子2
|
|
中间结果 xor <----异或因子3
|
|
结果 (一个字节）

上课时老师讲过如果A XOR B=C,那么C XOR A=B，所以我们只要知道最后的结果和每次的异或因子就能倒着推回来。看一下异或因子的产生过程，是用户名前两个字符的迭代过程，那么和第三个以后的无关，一会儿我们会验证它的正确性。从程序看，最后的比对结果为字符串"3A9S"。现在两者都有了，可以反推了。反推的结果拆开，作为索引找 'a123456789cfikuq'中的对应字符，最后输出就是正确的注册码了！编一个程序自动算注册码。

main()
{
char str[]="a123456789cfikuq";
char usrname[]="yxg";
char x[13];
char pass[]="3A9S";
int i,j,k;
x[0]=usrname[0];
x[1]=usrname[1]+usrname[0];
for(i=2;i<12;i++)
x[i]=usrname[1]+x[i-1];
for(i--,j=3;j>=0;j--)
  for(k=0;k<3;k++,i--)
   pass[j]^=x[i];
for(i=0;i<3;i++)
{
j=i*2;
k=(BYTE)pass[i]/0x10;
x[j]=str[k];
k=(BYTE)pass[i]%0x10;
x[j+1]=str[k];
}
x[j+2]=0;
printf("注册码是：%s",x);
}

算出用户：yxg对应的正确的注册码：k228886c。输入，点确定，显示“验证成功！“。
验证一下，把第三个字符从g改为1，现在用户名：yx1，注册码：k228886c，注册，又成功了。看来分析的没错。

现在我们已经可以来做注册机了！
随便输入个用户名，用程序算出的注册码不对。看来程序中还有对用户名的操作，仔仔细细又跟了一遍，发现注册码的循环次数和用户名的长度有关，于是用VC++写出注册机如下：(下载）

void CCnettermDlg::OnOK()
{
char str[]="a123456789cfikuq";
char pass[]="3A9S";
int i,j,k,c;
UpdateData();
k=m_usr.GetLength();
if(k==0)
return;
char *usrname=m_usr.GetBuffer(k+1);
char *x=new char[4*k+1];
x[0]=usrname[0];
x[1]=usrname[1]+usrname[0];
for(i=2;i<4*k;i++)
x[i]=usrname[1]+x[i-1];
for(i--,j=3;j>=0;j--)
for(c=0;c<k,c++,i--)
pass[j]^=x[i];
for(i=0;i<4;i++)
{
j=i*2;
k=(BYTE)pass[i]/0x10;
x[j]=str[k];
k=(BYTE)pass[i]%0x10;
x[j+1]=str[k];
}
x[j+2]=0;
m_str=x;
UpdateData(FALSE);
delete x;
m_usr.ReleaseBuffer();
}

到此对于NetTerm 4.2.c的破解完成！
题目中的SBS就是"Step by Step",希望我讲的清楚，大家听得明白！
这是我第一次做出注册机，以前曾想做VZPR的注册机，可惜太复杂没能写完。这次做出，不敢独享，拿出与大家共赏。


NewsReactor 1.0 Build 5009

 标 题:NewsReactor 1.0 Build 5009的注册机制分析 (16千字)
发信人:6767[BCG]
时 间:2001-8-7 20:22:34
详细信息:
NewsReactor 1.0 Build 5009的注册机制分析
by Fpc[CCG]&6767[BCG] @2001/08

tools: SI, wdasm, BcB 5.0

Homepage: http://www.daansystems.com
Features: NewsReactor is a tool to download binaries from usenet newsgroups.
NewsReactor scans, combines and downloads files from a selected newsgroup.
This program is shareware. You can register NewsReactor to get the full version.

这个软件的注册很有意思，分析加调试用了两天，巨爽，不是说软件，而是这个过程。本来要写crackme，现在不用了，嘿嘿。

1、它的未注册版在启动时会有一个几秒钟的Nag。单击按钮“Enter RegCode”，在打开的对话框中输入名字：LazyUser和注册码：123654；

2、^D切换到SoftIce，下命令：Bpx hMemcpy，按下F5返回到Windows；

3、单击“OK”，被拦下，因为有两个输入框，所以要按一次F5，还会被拦下；

4、按n次F12到程序领空，你会到下面(用wdasm的反汇编结果来表示)：

:0040C84C 8D4C2434 lea ecx, dword ptr [esp+34]

* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0040C850 E893D50000 Call 00419DE8
:0040C855 83F801 cmp eax, 00000001 <- 返回处
:0040C858 0F85F7010000 jne 0040CA55 <- eax=1表示有输入，所以不会跳
:0040C85E 8D8C2498000000 lea ecx, dword ptr [esp+00000098]
:0040C865 51 push ecx
:0040C866 8BCF mov ecx, edi

* Reference To: MFC42.Ordinal:035A, Ord:035Ah
|
:0040C868 E813D70000 Call 00419F80 <- 这几个call是按编号来的，不理
:0040C86D 8D942494000000 lea edx, dword ptr [esp+00000094]
:0040C874 8BCE mov ecx, esi
:0040C876 52 push edx

* Reference To: MFC42.Ordinal:035A, Ord:035Ah
|
:0040C877 E804D70000 Call 00419F80
:0040C87C 6A0A push 0000000A
:0040C87E 8BCE mov ecx, esi

* Reference To: MFC42.Ordinal:1ADA, Ord:1ADAh
|
:0040C880 E899DB0000 Call 0041A41E
:0040C885 6A0D push 0000000D
:0040C887 8BCE mov ecx, esi

* Reference To: MFC42.Ordinal:1ADA, Ord:1ADAh
|
:0040C889 E890DB0000 Call 0041A41E

:0040C88E 8B36 mov esi, dword ptr [esi] <- esi取得Irc(Inputed Reg Code)的地址
:0040C890 395EF8 cmp dword ptr [esi-08], ebx <- 判断Irc长度是否为0
<- 这种情况常见：[esi]处为某字串，那么[esi-8]处有可能就是该字串的长度
:0040C893 0F8471010000 je 0040CA0A <- 跳走就完蛋

:0040C899 A0106D4200 mov al, byte ptr [00426D10] <- 下面这一小段是对缓冲区清0
:0040C89E B93F000000 mov ecx, 0000003F
:0040C8A3 8884249C000000 mov byte ptr [esp+0000009C], al
:0040C8AA 33C0 xor eax, eax
:0040C8AC 8DBC249D000000 lea edi, dword ptr [esp+0000009D]
:0040C8B3 895C2410 mov dword ptr [esp+10], ebx
:0040C8B7 F3 repz
:0040C8B8 AB stosd
:0040C8B9 66AB stosw
:0040C8BB AA stosb

:0040C8BC 8BFE mov edi, esi <- 这一小段是经典的取字串长度代码
:0040C8BE 83C9FF or ecx, FFFFFFFF
:0040C8C1 33C0 xor eax, eax
:0040C8C3 895C2414 mov dword ptr [esp+14], ebx
:0040C8C7 F2 repnz
:0040C8C8 AE scasb
:0040C8C9 F7D1 not ecx <- ecx=Len+1

:0040C8CB 2BF9 sub edi, ecx <- 这一段是经典的字串拷贝程序
:0040C8CD 8D94249C010000 lea edx, dword ptr [esp+0000019C]
:0040C8D4 8BC1 mov eax, ecx
:0040C8D6 8BF7 mov esi, edi
:0040C8D8 8BFA mov edi, edx <- 目标地址
:0040C8DA 55 push ebp
:0040C8DB C1E902 shr ecx, 02
:0040C8DE F3 repz
:0040C8DF A5 movsd
:0040C8E0 8BC8 mov ecx, eax
:0040C8E2 8D542414 lea edx, dword ptr [esp+14]
:0040C8E6 83E103 and ecx, 00000003
:0040C8E9 8D8424A0010000 lea eax, dword ptr [esp+000001A0]
:0040C8F0 F3 repz
:0040C8F1 A4 movsb

:0040C8F2 8D4C2418 lea ecx, dword ptr [esp+18]
:0040C8F6 8DAC24A0010000 lea ebp, dword ptr [esp+000001A0]
:0040C8FD 51 push ecx <- 目标地址二
:0040C8FE 52 push edx <- 目标地址一

* Possible StringData Ref from Data Obj ->"%lu-%lu"
|
:0040C8FF 68C05E4200 push 00425EC0 <- 处理的方式
:0040C904 50 push eax <- 待处理字串的偏移址

* Reference To: MSVCRT.sscanf, Ord:02B5h
|
:0040C905 FF15FCD74100 Call dword ptr [0041D7FC] <- 对字串格式化处理

:0040C90B 83C410 add esp, 00000010
:0040C90E 85C0 test eax, eax <- eax为对几个部分进行了格式化，为0表失败或完成
:0040C910 0F8492000000 je 0040C9A8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C9A2(C)
|
:0040C916 8D4C242C lea ecx, dword ptr [esp+2C] <- 入口的push其实就是上面的格式化处理结果
:0040C91A 8D542414 lea edx, dword ptr [esp+14] <-
:0040C91E 51 push ecx
:0040C91F 8B4C2428 mov ecx, dword ptr [esp+28] <- 注册码将生成到这里
:0040C923 52 push edx
:0040C924 895C2434 mov dword ptr [esp+34], ebx
:0040C928 895C2438 mov dword ptr [esp+38], ebx
:0040C92C 895C243C mov dword ptr [esp+3C], ebx
:0040C930 E84B170000 call 0040E080 <- !!计算注册码的核心，下面有介绍

:0040C935 8D7C242C lea edi, dword ptr [esp+2C]
:0040C939 83C9FF or ecx, FFFFFFFF
:0040C93C 33C0 xor eax, eax
:0040C93E 8D9424A0000000 lea edx, dword ptr [esp+000000A0]
:0040C945 F2 repnz
:0040C946 AE scasb
:0040C947 F7D1 not ecx
:0040C949 2BF9 sub edi, ecx
:0040C94B 6A2D push 0000002D <-
:0040C94D 8BF7 mov esi, edi
:0040C94F 8BFA mov edi, edx
:0040C951 8BD1 mov edx, ecx
:0040C953 83C9FF or ecx, FFFFFFFF
:0040C956 F2 repnz
:0040C957 AE scasb
:0040C958 8BCA mov ecx, edx
:0040C95A 4F dec edi
:0040C95B C1E902 shr ecx, 02
:0040C95E F3 repz
:0040C95F A5 movsd
:0040C960 8BCA mov ecx, edx
:0040C962 55 push ebp
:0040C963 83E103 and ecx, 00000003
:0040C966 F3 repz
:0040C967 A4 movsb

* Reference To: MSVCRT.strchr, Ord:02B7h
|
:0040C968 8B35F4D74100 mov esi, dword ptr [0041D7F4]
:0040C96E FFD6 call esi <- 检查Irc中是否含有‘-’，不是必须的
:0040C970 83C408 add esp, 00000008
:0040C973 3BC3 cmp eax, ebx
:0040C975 7431 je 0040C9A8 <- 如果不含，则跳下去，准备比较了
<- 当只在Irc中输入一个数，比如：34553
<- 就会直接跳下去
:0040C977 40 inc eax <- 当Irc中含‘-’时，这一段被执行到
:0040C978 6A2D push 0000002D
:0040C97A 50 push eax
:0040C97B FFD6 call esi
:0040C97D 8BE8 mov ebp, eax <-
:0040C97F 83C408 add esp, 00000008
:0040C982 3BEB cmp ebp, ebx <- 经测试: ebp=ebx=0
:0040C984 7422 je 0040C9A8 <- 所以跳走, 进行比较

:0040C986 8D442418 lea eax, dword ptr [esp+18]
:0040C98A 8D4C2414 lea ecx, dword ptr [esp+14]
:0040C98E 50 push eax
:0040C98F 45 inc ebp
:0040C990 51 push ecx

* Possible StringData Ref from Data Obj ->"%lu-%lu"
|
:0040C991 68C05E4200 push 00425EC0
:0040C996 55 push ebp

* Reference To: MSVCRT.sscanf, Ord:02B5h
|
:0040C997 FF15FCD74100 Call dword ptr [0041D7FC]
:0040C99D 83C410 add esp, 00000010
:0040C9A0 85C0 test eax, eax
:0040C9A2 0F856EFFFFFF jne 0040C916 <-

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040C910(C), :0040C975(C), :0040C984(C)
|
:0040C9A8 8D9424A0000000 lea edx, dword ptr [esp+000000A0]
:0040C9AF 52 push edx

* Possible StringData Ref from Data Obj ->"Registered by: %s
"
|
:0040C9B0 68AC5E4200 push 00425EAC
:0040C9B5 E8869A0000 call 00416440
:0040C9BA 83C408 add esp, 00000008
:0040C9BD 8D8424A0000000 lea eax, dword ptr [esp+000000A0]
:0040C9C4 8D4C2420 lea ecx, dword ptr [esp+20]
:0040C9C8 50 push eax

* Reference To: MFC42.Ordinal:0219, Ord:0219h
|
:0040C9C9 E8D0D50000 Call 00419F9E <- 好象是字符串拷贝的调用

:0040C9CE 8B7C2428 mov edi, dword ptr [esp+28]
:0040C9D2 8B00 mov eax, dword ptr [eax]
:0040C9D4 8B0F mov ecx, dword ptr [edi]
:0040C9D6 50 push eax <- 假码
:0040C9D7 50 push ecx <- 真码

* Reference To: MSVCRT._mbscmp, Ord:0159h
|
:0040C9D8 FF15E8D74100 Call dword ptr [0041D7E8] <- 比较
<- 下面的不用管了，因为如果两者一致，就成功；不一致则失败

... ...

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C893(C)
|
:0040CA0A 53 push ebx
:0040CA0B 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"Registration code invalid!"
|
:0040CA0D 68EC5C4200 push 00425CEC
:0040CA12 EB3C jmp 0040CA50

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C9F8(C)
|

... ...

:0040CA48 53 push ebx
:0040CA49 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"Thank you for registering!
Please "
->"restart NewsReactor,"
|
:0040CA4B 68385D4200 push 00425D38

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CA12(U)
|

* Reference To: MFC42.Ordinal:04B0, Ord:04B0h
|
:0040CA50 E8F9D60000 Call 0041A14E

... ...

:0040CAAB C20400 ret 0004

下面我们来看它是如何计算注册码的：

* Referenced by a CALL at Addresses:
|:00404C2F , :0040C204 , :0040C930
|
:0040E080 83EC10 sub esp, 00000010

:0040E083 8B442414 mov eax, dword ptr [esp+14] <- 格式化处理后数字的位置

:0040E087 53 push ebx <- 保存寄存器
:0040E088 56 push esi
:0040E089 57 push edi

:0040E08A 8B10 mov edx, dword ptr [eax] <- edx取得数字，因为我输入的是：123654，所以edx=0x1E306
:0040E08C 8B4804 mov ecx, dword ptr [eax+04] <- 如果我们没有输入‘-’，只有一个数字，则ecx=0;
<- 若输入格式是"数字-数字", 则ecx=

:0040E08F C744240C36A60A02 mov [esp+0C], 020AA636 <- 一个数组的初始化
:0040E097 C7442410418D9514 mov [esp+10], 14958D41
:0040E09F C744241454D75700 mov [esp+14], 0057D754
:0040E0A7 C7442418C8BD3400 mov [esp+18], 0034BDC8

:0040E0AF B82037EFC6 mov eax, C6EF3720 <- eax初始化
:0040E0B4 BE20000000 mov esi, 00000020 <- 循环次数

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E0FC(C) <- 这个循环当然是关键了
| <- 这段代码极为精练, 肯定是直接用汇编写成的

:0040E0B9 8BFA mov edi, edx
:0040E0BB 8BDA mov ebx, edx
:0040E0BD C1EF05 shr edi, 05
:0040E0C0 C1E304 shl ebx, 04
:0040E0C3 33FB xor edi, ebx

:0040E0C5 8BD8 mov ebx, eax
:0040E0C7 C1EB0B shr ebx, 0B
:0040E0CA 83E303 and ebx, 00000003
:0040E0CD 03FA add edi, edx
:0040E0CF 8B5C9C0C mov ebx, dword ptr [esp+4*ebx+0C]

:0040E0D3 03D8 add ebx, eax
:0040E0D5 054786C861 add eax, 61C88647
:0040E0DA 33FB xor edi, ebx
:0040E0DC 2BCF sub ecx, edi <-

:0040E0DE 8BF9 mov edi, ecx
:0040E0E0 8BD9 mov ebx, ecx
:0040E0E2 C1EF05 shr edi, 05
:0040E0E5 C1E304 shl ebx, 04
:0040E0E8 33FB xor edi, ebx

:0040E0EA 8BD8 mov ebx, eax
:0040E0EC 83E303 and ebx, 00000003
:0040E0EF 03F9 add edi, ecx
:0040E0F1 8B5C9C0C mov ebx, dword ptr [esp+4*ebx+0C]
:0040E0F5 03D8 add ebx, eax
:0040E0F7 33FB xor edi, ebx
:0040E0F9 2BD7 sub edx, edi <-

:0040E0FB 4E dec esi
:0040E0FC 75BB jne 0040E0B9

:0040E0FE 8B442424 mov eax, dword ptr [esp+24] <- 准备存放处理结果
:0040E102 5F pop edi
:0040E103 5E pop esi
:0040E104 5B pop ebx
:0040E105 8910 mov dword ptr [eax], edx <- 结果的第一部分
:0040E107 894804 mov dword ptr [eax+04], ecx <- 结果的第二部分
:0040E10A 83C410 add esp, 00000010
:0040E10D C20800 ret 0008

对于这样的算法我们应该怎样分析呢？
一、将上面这段程序略微整理一下，从0X0开始穷举，检测结果是否全部为可显示字符，如果是，该数就是一个注册码；

二、写出逆算法，根据姓名生成注册码，难度大，有挑战性。

我想写逆算法，不但要在代码上实现，还得知道必要的参数。在上面这段程序中，出口值经测试可知eax=0，edx为注册码的第一部分，ecx为注册码的第二部分，就是说假设我们想以用户名“43214321”来注册，那么edx=0x31323334，ecx=0x31323334，以此作为条件来看应该输入什么样的注册码才能成功。

根据对上面程序的分析，经过长达几个小时的调试，终于证明如下的程序段可实现这个功能(注意：其中的数值以0x开头，视编译器的需要而定)：

很多参数直接搬过来就能用，注意代码的顺序和关键位置即可。

begin:
sub esp, 00000030
push ebx
push esi
push edi

mov [esp+0x0C], 0x020AA636
mov [esp+0x10], 0x14958D41
mov [esp+0x14], 0x0057D754
mov [esp+0x18], 0x0034BDC8

;初始化
xor eax, eax
mov ecx, 0x31323334
mov edx, 0x31323334
mov esi, 0x20

loop1:
mov edi, ecx
mov ebx, ecx
shr edi, 05
shl ebx, 04
xor edi, ebx
add edi, ecx

mov ebx, eax
and ebx, 0x3
mov ebx, dword ptr [esp+4*ebx+0x0C]
add ebx, eax

xor edi, ebx
add edx, edi <- 关键位置

sub eax, 0x61C88647 <- 关键位置

mov edi, edx
mov ebx, edx
shr edi, 05
shl ebx, 04
xor edi, ebx
add edi, edx

mov ebx, eax
shr ebx, 0x0B
and ebx, 0x3
mov ebx, dword ptr [esp+4*ebx+0x0C]
add ebx, eax

xor edi, ebx
add ecx, edi <- 关键位置

dec esi
jnz loop1

exit1:
pop edi
pop esi
pop ebx
add esp, 00000030

OK，经过这个循环，edx=705987235，ecx=970065253。好了重新注册，输入名字：43214321，注册码：705987235-970065253，Coolll! "Thank you for...."。

其实被这个逆算法折磨很长时间，一开始想偷懒，只输入一个数字怎样都不能成功，原因在于edx的值可知，而ecx相当于是随机的（就是未知的一个值），后来偶然想到‘-’的用处，才成功。

关于注册码：名字可以是为少于、等于8个的任意字符，若长度大于8则会失败；保存在同一目录下的NewsReactor.ini,

[Registration


Nokia 手机工具箱v1.1.9

标 题:Nktools(手机工具箱)注册码计算处，请高手指点~~~~ (15千字)
发信人:Sam.com
时 间:2001-3-6 18:26:44
详细信息:
请高手指点

软件名称：Nktools(手机工具箱) 繁体版 441KB
软件功能：Nokia 手机工具箱程序，v1.1.9，繁体中文未注册版。集合设
置中文电话簿，中文简讯，备忘录，开工控模式，修改待机、分
组图案，自定铃声，设置手机时间、闹铃时间，修改PIN1码为一
体的Nokia手机程序。 支持手机连接线、电脑红外线。支持手机
类型：3210、3310、5110、5130、6110、6138、6150、8210、
8250、8810、8850。未注册版有功能限制，如工程模式、开机画
面、铃声等不能使用，但可以用中文电本功能
注册形式：要求输入注册码，与手机的串号(IMEI)运算得出想应串号
(IMEI) ，注册不成功不会出现出错信息，它会将注册码存放在
软件目录的regcode.txt里，此类软件应该都是即时检测注册码
的，而且每个功能都会检测注册码，所以如果要暴力的话很多地
方要改，最好可以找到真注册码并写出注册机(具体是如何运算我
还搞不清楚)
下载地址：http://go.163.com/~nokiaz/software/NKToolSetup.exe

不知大家有谁是用诺基亚的手机，nokia只有3310和8250是可以用中文电话本的，但现在还有很多人都是用6110、6150、8210的，用了上面的软件就可以让这些手机都能用上中文电话本，而且还有很多其它功能，有兴趣的人试试吧，此软件要用红外线或者数据线。

此软件用upx 0.93压缩过，解压后反汇编，因为是繁体的所以我找不到有用的东西，但我找到个“autoregister”我设了中断后程序会自动中断，就算不作任何动作都会中断，所以我想程序是在即时检测注册码，但我跟下去却找不到关键地方(我只是个新手，功力0.5级)，以下的地方是我用trw200调试时找到的，我作了些注解，不知其它地方还有没有计算注册码的地方，在以下的过程中，我发现程序用我输入的假注册码和"060347221N”字符串作了运算，不知此字符串是不是程序将我的手机串号计算而来的，所以请大家帮验证一下，我只追到了程序的41A90C处到了后面我就晕掉了(我的汇编知识太菜了)，而且我也没追到“060347221N”是如何来的，所以请各位朋友帮个忙如果可以做个注册机出来就太好啦，实在不行也请帮忙在下面写一些注解吧!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A734(C)
|
:0041A739 C1FA02 sar edx, 02
:0041A73C 8955BC mov dword ptr [ebp-44], edx
:0041A73F 33C9 xor ecx, ecx
:0041A741 894DB0 mov dword ptr [ebp-50], ecx
:0041A744 8B45B0 mov eax, dword ptr [ebp-50]
:0041A747 3B45BC cmp eax, dword ptr [ebp-44]
:0041A74A 0F8DC1000000 jnl 0041A811

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A80B(C)
|
:0041A750 8B55C8 mov edx, dword ptr [ebp-38]
:0041A753 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A756 8A048A mov al, byte ptr [edx+4*ecx] <------假注册码首位数
:0041A759 04D0 add al, D0
:0041A75B 8B55C8 mov edx, dword ptr [ebp-38]
:0041A75E 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A761 8A548A01 mov dl, byte ptr [edx+4*ecx+01]<----假注册码第二位
:0041A765 80C2D0 add dl, D0
:0041A768 C1E206 shl edx, 06
:0041A76B 0AC2 or al, dl
:0041A76D 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A770 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A773 8B55C0 mov edx, dword ptr [ebp-40]
:0041A776 88040A mov byte ptr [edx+ecx], al <---结果写入此地址
:0041A779 8B45BC mov eax, dword ptr [ebp-44]
:0041A77C 85C0 test eax, eax
:0041A77E 7903 jns 0041A783
:0041A780 83C003 add eax, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A77E(C)
|
:0041A783 C1F802 sar eax, 02
:0041A786 8D0C40 lea ecx, dword ptr [eax+2*eax]
:0041A789 41 inc ecx
:0041A78A 83C104 add ecx, 00000004
:0041A78D 894D9C mov dword ptr [ebp-64], ecx
:0041A790 33C0 xor eax, eax
:0041A792 8945A0 mov dword ptr [ebp-60], eax
:0041A795 DF6D9C fild qword ptr [ebp-64] -----|此处何解
:0041A798 DC0524AA4100 fadd qword ptr [0041AA24] |是否浮点
:0041A79E DD5DA4 fstp qword ptr [ebp-5C] -----|运算？？
:0041A7A1 8B55C8 mov edx, dword ptr [ebp-38]
:0041A7A4 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7A7 33C0 xor eax, eax
:0041A7A9 8A448A01 mov al, byte ptr [edx+4*ecx+01]
:0041A7AD 83C0D0 add eax, FFFFFFD0
:0041A7B0 C1F802 sar eax, 02
:0041A7B3 8B55C8 mov edx, dword ptr [ebp-38]
:0041A7B6 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7B9 8A548A02 mov dl, byte ptr [edx+4*ecx+02]
:0041A7BD 80C2D0 add dl, D0
:0041A7C0 C1E204 shl edx, 04
:0041A7C3 0AC2 or al, dl
:0041A7C5 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7C8 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A7CB 8B55C0 mov edx, dword ptr [ebp-40]
:0041A7CE 88440A01 mov byte ptr [edx+ecx+01], al
:0041A7D2 8B45C8 mov eax, dword ptr [ebp-38]
:0041A7D5 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7D8 0FB6448802 movzx eax, byte ptr [eax+4*ecx+02]
:0041A7DD 83C0D0 add eax, FFFFFFD0
:0041A7E0 C1F804 sar eax, 04
:0041A7E3 8B55C8 mov edx, dword ptr [ebp-38]
:0041A7E6 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7E9 8A548A03 mov dl, byte ptr [edx+4*ecx+03]
:0041A7ED 80C2D0 add dl, D0
:0041A7F0 C1E202 shl edx, 02
:0041A7F3 0AC2 or al, dl
:0041A7F5 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7F8 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A7FB 8B55C0 mov edx, dword ptr [ebp-40]
:0041A7FE 88440A02 mov byte ptr [edx+ecx+02], al
:0041A802 FF45B0 inc [ebp-50]
:0041A805 8B45B0 mov eax, dword ptr [ebp-50]
:0041A808 3B45BC cmp eax, dword ptr [ebp-44]
:0041A80B 0F8C3FFFFFFF jl 0041A750

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A74A(C)
|
:0041A811 8B4DBC mov ecx, dword ptr [ebp-44]
:0041A814 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A817 894DBC mov dword ptr [ebp-44], ecx
:0041A81A 8B45B8 mov eax, dword ptr [ebp-48]
:0041A81D 0345BC add eax, dword ptr [ebp-44]
:0041A820 8945B4 mov dword ptr [ebp-4C], eax
:0041A823 8B55B4 mov edx, dword ptr [ebp-4C]
:0041A826 4A dec edx
:0041A827 8955B0 mov dword ptr [ebp-50], edx
:0041A82A 837DB000 cmp dword ptr [ebp-50], 00000000
:0041A82E 0F8CC4000000 jl 0041A8F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A8F2(C)
|
:0041A834 33C9 xor ecx, ecx
:0041A836 894DAC mov dword ptr [ebp-54], ecx
:0041A839 EB36 jmp 0041A871

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A878(C)
|
:0041A83B 8B45AC mov eax, dword ptr [ebp-54]
:0041A83E 0345B0 add eax, dword ptr [ebp-50]
:0041A841 99 cdq
:0041A842 F77DB8 idiv [ebp-48]
:0041A845 8B4DC4 mov ecx, dword ptr [ebp-3C]
:0041A848 8B45C0 mov eax, dword ptr [ebp-40]
:0041A84B 8B5DAC mov ebx, dword ptr [ebp-54]
:0041A84E 0FB6441801 movzx eax, byte ptr [eax+ebx+01]
:0041A853 0FAF45B0 imul eax, dword ptr [ebp-50]
:0041A857 8B5DC0 mov ebx, dword ptr [ebp-40]
:0041A85A 8B75AC mov esi, dword ptr [ebp-54]
:0041A85D 8A1C33 mov bl, byte ptr [ebx+esi]
:0041A860 2AD8 sub bl, al
:0041A862 2A1C11 sub bl, byte ptr [ecx+edx]
:0041A865 8B45C0 mov eax, dword ptr [ebp-40]
:0041A868 8B55AC mov edx, dword ptr [ebp-54]
:0041A86B 881C10 mov byte ptr [eax+edx], bl
:0041A86E FF45AC inc [ebp-54]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A839(U)
|
:0041A871 8B4DBC mov ecx, dword ptr [ebp-44]
:0041A874 49 dec ecx
:0041A875 3B4DAC cmp ecx, dword ptr [ebp-54]
:0041A878 7FC1 jg 0041A83B
:0041A87A 8B45BC mov eax, dword ptr [ebp-44]
:0041A87D 85C0 test eax, eax
:0041A87F 7903 jns 0041A884
:0041A881 83C003 add eax, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A87F(C)
|
:0041A884 C1F802 sar eax, 02
:0041A887 8D1440 lea edx, dword ptr [eax+2*eax]
:0041A88A 42 inc edx
:0041A88B 83C204 add edx, 00000004
:0041A88E 89559C mov dword ptr [ebp-64], edx
:0041A891 33C9 xor ecx, ecx
:0041A893 894DA0 mov dword ptr [ebp-60], ecx
:0041A896 DF6D9C fild qword ptr [ebp-64]
:0041A899 DC0524AA4100 fadd qword ptr [0041AA24]
:0041A89F DD5DA4 fstp qword ptr [ebp-5C]
:0041A8A2 8B45BC mov eax, dword ptr [ebp-44]
:0041A8A5 48 dec eax
:0041A8A6 8945AC mov dword ptr [ebp-54], eax
:0041A8A9 837DAC00 cmp dword ptr [ebp-54], 00000000
:0041A8AD 7E3C jle 0041A8EB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A8E9(C)
|
:0041A8AF 8B45AC mov eax, dword ptr [ebp-54]
:0041A8B2 0345B0 add eax, dword ptr [ebp-50]
:0041A8B5 99 cdq
:0041A8B6 F77DB8 idiv [ebp-48]
:0041A8B9 8B4DC4 mov ecx, dword ptr [ebp-3C]
:0041A8BC 8B45C0 mov eax, dword ptr [ebp-40]
:0041A8BF 8B5DAC mov ebx, dword ptr [ebp-54]
:0041A8C2 0FB64418FF movzx eax, byte ptr [eax+ebx-01]
:0041A8C7 0FAF45B0 imul eax, dword ptr [ebp-50]
:0041A8CB 8B5DC0 mov ebx, dword ptr [ebp-40]
:0041A8CE 8B75AC mov esi, dword ptr [ebp-54]
:0041A8D1 8A1C33 mov bl, byte ptr [ebx+esi]
:0041A8D4 2AD8 sub bl, al
:0041A8D6 2A1C11 sub bl, byte ptr [ecx+edx]
:0041A8D9 8B45C0 mov eax, dword ptr [ebp-40]
:0041A8DC 8B55AC mov edx, dword ptr [ebp-54]
:0041A8DF 881C10 mov byte ptr [eax+edx], bl
:0041A8E2 FF4DAC dec [ebp-54]
:0041A8E5 837DAC00 cmp dword ptr [ebp-54], 00000000
:0041A8E9 7FC4 jg 0041A8AF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A8AD(C)
|
:0041A8EB FF4DB0 dec [ebp-50]
:0041A8EE 837DB000 cmp dword ptr [ebp-50], 00000000
:0041A8F2 0F8D3CFFFFFF jnl 0041A834

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A82E(C)
|
:0041A8F8 6A04 push 00000004
:0041A8FA FF75C0 push [ebp-40]
:0041A8FD 8D4DB8 lea ecx, dword ptr [ebp-48]
:0041A900 51 push ecx
:0041A901 E812BF0800 call 004A6818 <-----此call将运算结果放到另一地址
:0041A906 83C40C add esp, 0000000C
:0041A909 8B45B8 mov eax, dword ptr [ebp-48]
:0041A90C 3B45BC cmp eax, dword ptr [ebp-44]<--此处和下面的比较不知是否
:0041A90F 7E08 jle 0041A919 是关键，我改动后没结果
:0041A911 8B55BC mov edx, dword ptr [ebp-44]
:0041A914 8955B8 mov dword ptr [ebp-48], edx
:0041A917 EB0B jmp 0041A924

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A90F(C)
|
:0041A919 837DB800 cmp dword ptr [ebp-48], 00000000
:0041A91D 7D05 jge 0041A924
:0041A91F 33C9 xor ecx, ecx
:0041A921 894DB8 mov dword ptr [ebp-48], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041A917(U), :0041A91D(C)
|
:0041A924 8B45C0 mov eax, dword ptr [ebp-40]
:0041A927 8B55B8 mov edx, dword ptr [ebp-48]
:0041A92A C644100400 mov [eax+edx+04], 00
:0041A92F 66C745DC2000 mov [ebp-24], 0020
:0041A935 DD45A4 fld qword ptr [ebp-5C]
:0041A938 DC0D1CAA4100 fmul qword ptr [0041AA1C]
:0041A93E DD5DA4 fstp qword ptr [ebp-5C]
:0041A941 66C745DC2C00 mov [ebp-24], 002C
:0041A947 8B55C0 mov edx, dword ptr [ebp-40]
:0041A94A 83C204 add edx, 00000004
:0041A94D 8D45F4 lea eax, dword ptr [ebp-0C]
:0041A950 E857900900 call 004B39AC
:0041A955 FF45E8 inc [ebp-18]
:0041A958 8D55F4 lea edx, dword ptr [ebp-0C]
:0041A95B 8B4508 mov eax, dword ptr [ebp+08]
:0041A95E E8C5910900 call 004B3B28
:0041A963 FF4DE8 dec [ebp-18]
:0041A966 8D45F4 lea eax, dword ptr [ebp-0C]
:0041A969 BA02000000 mov edx, 00000002
:0041A96E E885910900 call 004B3AF8
:0041A973 66C745DC0800 mov [ebp-24], 0008
:0041A979 EB3C jmp 0041A9B7
:0041A97B 66C745DC3800 mov [ebp-24], 0038
:0041A981 BA820C4C00 mov edx, 004C0C82
:0041A986 8D45F0 lea eax, dword ptr [ebp-10]
:0041A989 E81E900900 call 004B39AC
:0041A98E FF45E8 inc [ebp-18]
:0041A991 8D55F0 lea edx, dword ptr [ebp-10]
:0041A994 8B4508 mov eax, dword ptr [ebp+08]
:0041A997 E88C910900 call 004B3B28
:0041A99C FF4DE8 dec [ebp-18]
:0041A99F 8D45F0 lea eax, dword ptr [ebp-10]
:0041A9A2 BA02000000 mov edx, 00000002
:0041A9A7 E84C910900 call 004B3AF8
:0041A9AC 66C745DC2800 mov [ebp-24], 0028
:0041A9B2 E87F610900 call 004B0B36

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A979(U)
|
:0041A9B7 DD45A4 fld qword ptr [ebp-5C]
:0041A9BA DC052CAA4100 fadd qword ptr [0041AA2C]
:0041A9C0 DD5DA4 fstp qword ptr [ebp-5C]
:0041A9C3 FF75C0 push [ebp-40]
:0041A9C6 E835B20800 call 004A5C00
:0041A9CB 59 pop ecx
:0041A9CC FF75C8 push [ebp-38]
:0041A9CF E82CB20800 call 004A5C00
:0041A9D4 59 pop ecx
:0041A9D5 FF4DE8 dec [ebp-18]
:0041A9D8 8D45F8 lea eax, dword ptr [ebp-08]
:0041A9DB BA02000000 mov edx, 00000002
:0041A9E0 E813910900 call 004B3AF8
:0041A9E5 FF4DE8 dec [ebp-18]
:0041A9E8 8D450C lea eax, dword ptr [ebp+0C]
:0041A9EB BA02000000 mov edx, 00000002
:0041A9F0 E803910900 call 004B3AF8
:0041A9F5 8B4DCC mov ecx, dword ptr [ebp-34]
:0041A9F8 64890D00000000 mov dword ptr fs:[00000000], ecx
:0041A9FF 5F pop edi
:0041AA00 5E pop esi
:0041AA01 5B pop ebx
:0041AA02 8BE5 mov esp, ebp
:0041AA04 5D pop ebp
:0041AA05 C3 ret

标 题:补充详细注解~~~~新手参考~~~~~高手请指点~~~~~~~~多谢大家~~~~ (14千字)
发信人:Sam.com
时 间:2001-3-8 15:18:53
详细信息:

不好意思上次漏掉些重要的东西~~~~~这次补上~~~~~~可能写得太多太罗嗦啦~~~请不要见怪~~~因为这是我一边跟一边写的~~~所以很详细~~~~毕竟我是新手嘛~~~~很多不懂的都要作下记录~~~而且也想让一些新手看得懂~~~现丑啦~~我跟的部分是注册码运算的过程~~~~至于核心判断的地方我还没找到~~~应该在下面的好几个call当中~~~但我功力有限~~~~只能先去补习补习~~~~还请各位高手跟下去~~~~~~先多谢啦~~~~~~

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A734(C)
|
:0041A739 C1FA02 sar edx, 02
:0041A73C 8955BC mov dword ptr [ebp-44], edx
:0041A73F 33C9 xor ecx, ecx
:0041A741 894DB0 mov dword ptr [ebp-50], ecx
:0041A744 8B45B0 mov eax, dword ptr [ebp-50]
:0041A747 3B45BC cmp eax, dword ptr [ebp-44]
:0041A74A 0F8DC1000000 jnl 0041A811

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A80B(C)
|
:0041A750 8B55C8 mov edx, dword ptr [ebp-38]
:0041A753 8B4DB0 mov ecx, dword ptr [ebp-50] 假注册码首位数
:0041A756 8A048A mov al, byte ptr [edx+4*ecx] <----我用的是67676767
:0041A759 04D0 add al, D0 <----36=>6 :0041A75B 8B55C8 mov edx, dword ptr [ebp-38] <----注册码地址C74454=>edx
:0041A75E 8B4DB0 mov ecx, dword ptr [ebp-50] <----0=>ecx
:0041A761 8A548A01 mov dl, byte ptr [edx+4*ecx+01]<----假注册码第二位edx=C74437
:0041A765 80C2D0 add dl, D0 <----edx=C74407
:0041A768 C1E206 shl edx, 06 <----edx=31D101C0
:0041A76B 0AC2 or al, dl <----eax=000000C6
:0041A76D 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A770 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A773 8B55C0 mov edx, dword ptr [ebp-40]
:0041A776 88040A mov byte ptr [edx+ecx], al <----结果写入地址C8C604
:0041A779 8B45BC mov eax, dword ptr [ebp-44] <----eax=2
:0041A77C 85C0 test eax, eax
:0041A77E 7903 jns 0041A783 <----Jump!
:0041A780 83C003 add eax, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A77E(C)
|
:0041A783 C1F802 sar eax, 02
:0041A786 8D0C40 lea ecx, dword ptr [eax+2*eax] <----0
:0041A789 41 inc ecx
:0041A78A 83C104 add ecx, 00000004 <----5
:0041A78D 894D9C mov dword ptr [ebp-64], ecx <----地址74F928
:0041A790 33C0 xor eax, eax
:0041A792 8945A0 mov dword ptr [ebp-60], eax
:0041A795 DF6D9C fild qword ptr [ebp-64] -----|此处何解
:0041A798 DC0524AA4100 fadd qword ptr [0041AA24] |是否浮点<--46BACF74
:0041A79E DD5DA4 fstp qword ptr [ebp-5C] -----|运算？？<--E23C5905
:0041A7A1 8B55C8 mov edx, dword ptr [ebp-38]
:0041A7A4 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7A7 33C0 xor eax, eax
:0041A7A9 8A448A01 mov al, byte ptr [edx+4*ecx+01]<----注册码第二位7
:0041A7AD 83C0D0 add eax, FFFFFFD0 <----37=>6
:0041A7B0 C1F802 sar eax, 02 <----eax=1
:0041A7B3 8B55C8 mov edx, dword ptr [ebp-38]
:0041A7B6 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7B9 8A548A02 mov dl, byte ptr [edx+4*ecx+02]<----注册码第三位6
:0041A7BD 80C2D0 add dl, D0 <----edx=00C74406
:0041A7C0 C1E204 shl edx, 04 <----edx=0C744060
:0041A7C3 0AC2 or al, dl <----eax=61
:0041A7C5 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7C8 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A7CB 8B55C0 mov edx, dword ptr [ebp-40]
:0041A7CE 88440A01 mov byte ptr [edx+ecx+01], al <----地址C8C604
:0041A7D2 8B45C8 mov eax, dword ptr [ebp-38]
:0041A7D5 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7D8 0FB6448802 movzx eax, byte ptr [eax+4*ecx+02]<----注册码第三位6
:0041A7DD 83C0D0 add eax, FFFFFFD0 <----36=>6
:0041A7E0 C1F804 sar eax, 04 <----eax=0
:0041A7E3 8B55C8 mov edx, dword ptr [ebp-38]
:0041A7E6 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7E9 8A548A03 mov dl, byte ptr [edx+4*ecx+03]<----注册码第四位7
:0041A7ED 80C2D0 add dl, D0 <----edx=00C74407
:0041A7F0 C1E202 shl edx, 02 <----edx=31D101C
:0041A7F3 0AC2 or al, dl <----eax=1C
:0041A7F5 8B4DB0 mov ecx, dword ptr [ebp-50]
:0041A7F8 8D0C49 lea ecx, dword ptr [ecx+2*ecx]
:0041A7FB 8B55C0 mov edx, dword ptr [ebp-40]
:0041A7FE 88440A02 mov byte ptr [edx+ecx+02], al
:0041A802 FF45B0 inc [ebp-50]
:0041A805 8B45B0 mov eax, dword ptr [ebp-50] <----eax=1
:0041A808 3B45BC cmp eax, dword ptr [ebp-44] <----[ebp-44]=2
:0041A80B 0F8C3FFFFFFF jl 0041A750 <----小于2就跳了程序将我后四位注册
用同样方法运算最后得结果放在
地址C8C604中结果是:
C6 61 1C C6 61 1C---结果1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A74A(C)
|
:0041A811 8B4DBC mov ecx, dword ptr [ebp-44]
:0041A814 8D0C49 lea ecx, dword ptr [ecx+2*ecx] <----ecx=6
:0041A817 894DBC mov dword ptr [ebp-44], ecx
:0041A81A 8B45B8 mov eax, dword ptr [ebp-48] <----eax=A
:0041A81D 0345BC add eax, dword ptr [ebp-44] <----eax=10
:0041A820 8945B4 mov dword ptr [ebp-4C], eax
:0041A823 8B55B4 mov edx, dword ptr [ebp-4C]
:0041A826 4A dec edx
:0041A827 8955B0 mov dword ptr [ebp-50], edx
:0041A82A 837DB000 cmp dword ptr [ebp-50], 00000000 <--F cmp 0
:0041A82E 0F8CC4000000 jl 0041A8F8 <----小于0就跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A8F2(C)
|
:0041A834 33C9 xor ecx, ecx
:0041A836 894DAC mov dword ptr [ebp-54], ecx
:0041A839 EB36 jmp 0041A871 <----Jump!!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A878(C)
|
:0041A83B 8B45AC mov eax, dword ptr [ebp-54]<---eax=0
:0041A83E 0345B0 add eax, dword ptr [ebp-50]<---eax=F
:0041A841 99 cdq
:0041A842 F77DB8 idiv [ebp-48] <---F mod A=>edx=5
:0041A845 8B4DC4 mov ecx, dword ptr [ebp-3C]<---ecx=C7Bd50
d ecx->060347221N----字串1
:0041A848 8B45C0 mov eax, dword ptr [ebp-40]<---上面运算结果1的地址
:0041A84B 8B5DAC mov ebx, dword ptr [ebp-54]
:0041A84E 0FB6441801 movzx eax, byte ptr [eax+ebx+01]<---结果1的第二位61
:0041A853 0FAF45B0 imul eax, dword ptr [ebp-50] <---61*F=5AF
:0041A857 8B5DC0 mov ebx, dword ptr [ebp-40]
:0041A85A 8B75AC mov esi, dword ptr [ebp-54]
:0041A85D 8A1C33 mov bl, byte ptr [ebx+esi] <---结果1的第一位C6=>ebx=C8C6C6
:0041A860 2AD8 sub bl, al <---C6-AF=17
:0041A862 2A1C11 sub bl, byte ptr [ecx+edx] <---17-37=E0(bl减字串1的第6位)
:0041A865 8B45C0 mov eax, dword ptr [ebp-40]
:0041A868 8B55AC mov edx, dword ptr [ebp-54]
:0041A86B 881C10 mov byte ptr [eax+edx], bl <---将E0放入结果1的首地址中
:0041A86E FF45AC inc [ebp-54] <---加1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A839(U)
|
:0041A871 8B4DBC mov ecx, dword ptr [ebp-44]<----ecx=6
:0041A874 49 dec ecx
:0041A875 3B4DAC cmp ecx, dword ptr [ebp-54]<----5 cmp 0
:0041A878 7FC1 jg 0041A83B <----大于就跳，循环5次最后结果放在结
果1的地址里结果是:E0 8B 50 E6 6F
1C(最后一位仍有用)----结果2
:0041A87A 8B45BC mov eax, dword ptr [ebp-44]<----eax=6
:0041A87D 85C0 test eax, eax
:0041A87F 7903 jns 0041A884 <----Jump!!!
:0041A881 83C003 add eax, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A87F(C)
|
:0041A884 C1F802 sar eax, 02 <---eax=1
:0041A887 8D1440 lea edx, dword ptr [eax+2*eax]<---edx=3
:0041A88A 42 inc edx
:0041A88B 83C204 add edx, 00000004
:0041A88E 89559C mov dword ptr [ebp-64], edx <---edx=8
:0041A891 33C9 xor ecx, ecx
:0041A893 894DA0 mov dword ptr [ebp-60], ecx
:0041A896 DF6D9C fild qword ptr [ebp-64] <---这三个地址里的数是(我不懂结果):8
:0041A899 DC0524AA4100 fadd qword ptr [0041AA24] <---46BACF74
:0041A89F DD5DA4 fstp qword ptr [ebp-5C] <---A35D67BA
:0041A8A2 8B45BC mov eax, dword ptr [ebp-44]
:0041A8A5 48 dec eax
:0041A8A6 8945AC mov dword ptr [ebp-54], eax<---eax=5
:0041A8A9 837DAC00 cmp dword ptr [ebp-54], 00000000
:0041A8AD 7E3C jle 0041A8EB <---小于或等于就跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A8E9(C)
|
:0041A8AF 8B45AC mov eax, dword ptr [ebp-54] <---eax=5
:0041A8B2 0345B0 add eax, dword ptr [ebp-50] <---5+F=14
:0041A8B5 99 cdq
:0041A8B6 F77DB8 idiv [ebp-48] <---14/A=>edx=0
:0041A8B9 8B4DC4 mov ecx, dword ptr [ebp-3C] <---字串1首地址C7Bd50
:0041A8BC 8B45C0 mov eax, dword ptr [ebp-40]
:0041A8BF 8B5DAC mov ebx, dword ptr [ebp-54]
:0041A8C2 0FB64418FF movzx eax, byte ptr [eax+ebx-01]<---结果2第五位 eax=6F
:0041A8C7 0FAF45B0 imul eax, dword ptr [ebp-50] <---6F*F=681
:0041A8CB 8B5DC0 mov ebx, dword ptr [ebp-40]
:0041A8CE 8B75AC mov esi, dword ptr [ebp-54]
:0041A8D1 8A1C33 mov bl, byte ptr [ebx+esi] <---结果2最后一位ebx=C8C61C
:0041A8D4 2AD8 sub bl, al <---1C-81=9B
:0041A8D6 2A1C11 sub bl, byte ptr [ecx+edx] <---9B-30=6B(bl减字串1的第1位)
第二次是减字串1的最后一位第
三次是第9位第四次第8位第五次 第7位
:0041A8D9 8B45C0 mov eax, dword ptr [ebp-40]
:0041A8DC 8B55AC mov edx, dword ptr [ebp-54]
:0041A8DF 881C10 mov byte ptr [eax+edx], bl <---将结果放入结果1的地址最后一位里
:0041A8E2 FF4DAC dec [ebp-54]
:0041A8E5 837DAC00 cmp dword ptr [ebp-54], 00000000<---4
:0041A8E9 7FC4 jg 0041A8AF <---大于就跳

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A8AD(C)
|
:0041A8EB FF4DB0 dec [ebp-50] <---F-1
:0041A8EE 837DB000 cmp dword ptr [ebp-50], 00000000
:0041A8F2 0F8D3CFFFFFF jnl 0041A834 <---跳了，循环15次最后结果是:
AF EB 75 01 F6 EA---结果3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A82E(C)
|
:0041A8F8 6A04 push 00000004
:0041A8FA FF75C0 push [ebp-40]
:0041A8FD 8D4DB8 lea ecx, dword ptr [ebp-48]
:0041A900 51 push ecx
:0041A901 E812BF0800 call 004A6818 <-----此call将运算结果放到74F944里，但程序只取了 前四个字，以下的比较搞不懂
:0041A906 83C40C add esp, 0000000C
:0041A909 8B45B8 mov eax, dword ptr [ebp-48]<---01 75 EB AF(结果3)
:0041A90C 3B45BC cmp eax, dword ptr [ebp-44]<---00 00 00 06
:0041A90F 7E08 jle 0041A919 <--此处和下面的比较不知是否
是关键，我改动后没结果下面的几个 call可能才是关键，我有时间再跟下去
:0041A911 8B55BC mov edx, dword ptr [ebp-44]
:0041A914 8955B8 mov dword ptr [ebp-48], edx
:0041A917 EB0B jmp 0041A924

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A90F(C)
|
:0041A919 837DB800 cmp dword ptr [ebp-48], 00000000
:0041A91D 7D05 jge 0041A924
:0041A91F 33C9 xor ecx, ecx
:0041A921 894DB8 mov dword ptr [ebp-48], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041A917(U), :0041A91D(C)
|
:0041A924 8B45C0 mov eax, dword ptr [ebp-40]
:0041A927 8B55B8 mov edx, dword ptr [ebp-48]
:0041A92A C644100400 mov [eax+edx+04], 00
:0041A92F 66C745DC2000 mov [ebp-24], 0020
:0041A935 DD45A4 fld qword ptr [ebp-5C]
:0041A938 DC0D1CAA4100 fmul qword ptr [0041AA1C]
:0041A93E DD5DA4 fstp qword ptr [ebp-5C]
:0041A941 66C745DC2C00 mov [ebp-24], 002C
:0041A947 8B55C0 mov edx, dword ptr [ebp-40]
:0041A94A 83C204 add edx, 00000004
:0041A94D 8D45F4 lea eax, dword ptr [ebp-0C]
:0041A950 E857900900 call 004B39AC <---此call将结果3后两位数进行处理，不过
太复杂啦，搞不清楚~~~~~~


Numerology Star Reader

 标 题:计算占星软件Numerology Star Reader (version 15.0)注册码 (4千字)
发信人:小楼
时 间:2000-10-2 18:31:00
详细信息:
计算Numerology Star Reader (version 15.0)注册码

这是一个有趣的算命软件, 使用后感觉比平时看到的西方星命书都好, 只可惜是英文的。具体下载地址忘了，好象来自于http://www.esoftware.com.cn，当然你也可以从它老家http://www2.pitnet.net/numer/下载，约900K。

安装完成后发现不注册根本不能使用，所以只能跟作者玩玩智力游戏了。
用WDASM反汇编，看到
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401D52(C)
|
:00401EDB 6A09 push 00000009
:00401EDD 6830200000 push 00002030

* Possible StringData Ref from Data Obj ->"NUMEROLOGY STAR READER"
|
:00401EE2 68E4414000 push 004041E4

* Possible StringData Ref from Data Obj ->"Your Registration ID is not valid! "
->" "
|
:00401EE7 6854414000 push 00404154
:00401EEC 53 push ebx

* Reference To: USER32.MessageBoxExA, Ord:0196h
|
:00401EED FF15F8544000 Call dword ptr [004054F8]
:00401EF3 681C444000 push 0040441C

向上看:00401D52，
:00401D4B E810FFFFFF call 00401C60
:00401D50 85C0 test eax, eax <--eax=1, sucess!
:00401D52 0F8483010000 je 00401EDB
......
:00401DF2 6840200000 push 00002040

* Possible StringData Ref from Data Obj ->"NUMEROLOGY STAR READER"
|
:00401DF7 68E4414000 push 004041E4

* Possible StringData Ref from Data Obj ->"Your registration was completed "
->"successfully! "
|
:00401DFC 68B0414000 push 004041B0
:00401E01 6A00 push 00000000

* Reference To: USER32.MessageBoxExA, Ord:0196h
|
:00401E03 FF15F8544000 Call dword ptr [004054F8]

所以:00401D4B E810FFFFFF call 00401C60是关键。
输入注册码后，用TRW2000下BPX 401D4B，按下REGISTER键后被截。用F8进入看看：

:00401C69 8378F816 cmp dword ptr [eax-08], 00000016
<--22位注册码，别多一位！
:00401C6D 7533 jne 00401CA2
:00401C6F 8BCE mov ecx, esi
:00401C71 E86AFCFFFF call 004018E0 <--(1)
:00401C76 85C0 test eax, eax <--eax=1,sucess!
:00401C78 7428 je 00401CA2
:00401C7A 8BCE mov ecx, esi
:00401C7C E83FFDFFFF call 004019C0 <--2)
:00401C81 85C0 test eax, eax <--eax=1,sucess!
:00401C83 741D je 00401CA2
:00401C85 8BCE mov ecx, esi
:00401C87 E814FEFFFF call 00401AA0 <--(3)
:00401C8C 85C0 test eax, eax <--eax=1,sucess!
:00401C8E 7412 je 00401CA2
:00401C90 8BCE mov ecx, esi
:00401C92 E8E9FEFFFF call 00401B80 <--(4)
:00401C97 85C0 test eax, eax <--eax=1,sucess!
:00401C99 7407 je 00401CA2
:00401C9B B801000000 mov eax, 00000001
:00401CA0 5E pop esi
:00401CA1 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401C6D(C), :00401C78(C), :00401C83(C), :00401C8E(C), :00401C99(C)
|
:00401CA2 33C0 xor eax, eax <--die!!!
:00401CA4 5E pop esi
:00401CA5 C3 ret

上面4个CALL的比较相似，就讲第一个吧！看:00401C71 call 004018E0，用F8跟进，
......
......
:00401930 8B542414 mov edx, dword ptr [esp+14]
:00401934 8D0C8500000000 lea ecx, dword ptr [4*eax+00000000]
:0040193B 83C404 add esp, 00000004
:0040193E 8D4203 lea eax, dword ptr [edx+03]
:00401941 8D0440 lea eax, dword ptr [eax+2*eax]
:00401944 2BC1 sub eax, ecx
:00401946 83F815 cmp eax, 00000015
:00401949 7550 jne 0040199B
:0040194B 8BAD10010000 mov ebp, dword ptr [ebp+00000110]
:00401951 A08B344000 mov al, byte ptr [0040348B]
:00401956 8A4D00 mov cl, byte ptr [ebp+00]
:00401959 3AC8 cmp cl, al
:0040195B 753E jne 0040199B
:0040195D 8A5502 mov dl, byte ptr [ebp+02]
:00401960 A01D374000 mov al, byte ptr [0040371D]
:00401965 3AD0 cmp dl, al
:00401967 7532 jne 0040199B
:00401969 8A4504 mov al, byte ptr [ebp+04]
:0040196C 8A0D67364000 mov cl, byte ptr [00403667]
:00401972 3AC1 cmp al, cl
:00401974 7525 jne 0040199B
......
翻译一下就是：(第二位数字/4)-(第四位数字/3)=1（十进制〕
第一位= q, 第三位= h, 第五位= S

如此，得到注册码：q8h3S-Ey4%2-7G6zj-5U*1e__(最后两位随便〕

from: china crack group
2000.10.02
end.


OFFLINE EXPLORER 1.0

 标 题:《OFFLINE EXPLORER 1.0》的注册码破解 高手莫入！！ (2千字)
发信人:RATARICE[BCG]
时 间:2001-5-18 23:39:58
详细信息:
《 OFFLINE EXPLORER 1.0 》的注册码破解
目标：OFFLINE EXPLORER 1.0
一个新的且容易使用的离线浏览软件，速度比Teleport 快，且支持拖放。Offline Explorer把网站上网页整个拖回来是一件既方便又经济实惠的作法，特别是阅读网上的电子读物时更加重要。现在流行的Teleport最大只能有十个进程，而WebZIP功能虽强，但BUG多多，新兴离线浏览器Offline Explorer不但没有了十个进程的限制，而且界面优秀一级棒，功能多多。
作者：RATARICE[BCG]
工具：TRW2000 1.22
过程：
一、 运行软件，点help-->about offline explorer-->register.
填上registration user:RATARICE[BCG]
registration keys:87654321 （瞎填的！）
点“OK”，弹出错误框。
二、 软件的分析到此为止，启动TRW2000！
下bpx hmemcpy。
再点“OK”，被拦。
下bd *；pmodule；按7次F12（8次出错）。代码如下：
015F:004AA461 CALL 00433784
015F:004AA466 MOV EAX,[EBP-04]
015F:004AA469 PUSH EAX
015F:004AA46A LEA EDX,[EBP-08]
015F:004AA461 CALL 00433784
015F:004AA466 MOV EAX,[EBP-04]
015F:004AA469 PUSH EAX
015F:004AA46A LEA EDX,[EBP-08]
015F:004AA46D MOV EAX,[EBX+02E0]
015F:004AA473 CALL 00433784
015F:004AA478 MOV EDX,[EBP-08]
015F:004AA47B MOV EAX,[004BBA38]
015F:004AA480 MOV EAX,[EAX]
015F:004AA482 POP ECX
015F:004AA483 CALL 004B1C10 -------------->关键，F8进入。
015F:004AA488 TEST AL,AL
015F:004AA48A JZ 004AA4F6 -------------->跳则死，上面有问题。

********************************************************************
进入后，按F10一直到下面：
015F:004B1C75 MOV EAX,[EBP-08]
015F:004B1C78 CALL 00403FDC
015F:004B1C7D SETZ BL
015F:004B1C80 XOR EAX,EAX
015F:004B1C82 POP EDX
015F:004B1C83 POP ECX
015F:004B1C84 POP ECX
015F:004B1C85 MOV [FS:EAX],EDX
015F:004B1C88 PUSH DWORD 004B1CA2
015F:004B1C8D LEA EAX,[EBP-10]
015F:004B1C90 MOV EDX,04
015F:004B1C75 MOV EAX,[EBP-08]
015F:004B1C78 CALL 00403FDC
015F:004B1C7D SETZ BL
015F:004B1C80 XOR EAX,EAX
015F:004B1C82 POP EDX
015F:004B1C83 POP ECX
015F:004B1C84 POP ECX
015F:004B1C85 MOV [FS:EAX],EDX
015F:004B1C88 PUSH DWORD 004B1CA2
015F:004B1C8D LEA EAX,[EBP-10]
015F:004B1C90 MOV EDX,04
015F:004B1C95 CALL 00403C64 ------------------>此处有问题，按F8。
015F:004B1C9A RET

*********************************************************************
进入后看到：
015F:00403C62 MOV EAX,EAX
015F:00403C64 PUSH EBX
015F:00403C65 PUSH ESI
015F:00403C66 MOV EBX,EAX
015F:00403C68 MOV ESI,EDX
015F:00403C6A MOV EDX,[EBX]
015F:00403C6C TEST EDX,EDX ------------------->下d edx可看到真的注
015F:00403C6E JZ 00403C89 册码！
015F:00403C70 MOV DWORD [EBX],00

三、总结：
registration user:RATARICE[BCG]
registration keys:564363-515233443-JH


offline explorer v 1.9

 标 题:对offline explorer v 1.9的简单破解 (17千字)
发信人:linet
时 间:2001-8-22 16:51:29
详细信息:
软件下载：http://www.newhua.com/OfflineExplorer.htm
软件介绍：相当方便使用的离线浏览工具，可排定抓取时间、设定Proxy，也可选择抓取的项目及大小，可自设下载的存放位置、及存放的空间限制。它内置浏览程序、可直接浏览或是使用自己喜欢的浏览器来浏览、且更可直接以全浏览窗切换来作网上浏览，另它对于抓取的网站更有MAP的提供、可更清楚整个网站的连结及目录结构。
工具：W32DASM HIEW.EXE SICE
安装好程序后，把时间调前一个月，则出现注册提示，随便填个用户名、系列号，按“确定”出现"Sorry, registration information...... ",记下来。
用W32DASM反汇编，在串式参考中查到"Sorry, registration information "双击则来到下面。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004DDFEA(C)
|
:004DE0FE 6A10 push 00000010
:004DE100 8D4DD8 lea ecx, dword ptr [ebp-28]
:004DE103 8B06 mov eax, dword ptr [esi]
:004DE105 8B80F8040000 mov eax, dword ptr [eax+000004F8]
:004DE10B BA07000000 mov edx, 00000007
:004DE110 E8D3D7F9FF call 0047B8E8
:004DE115 FF75D8 push [ebp-28]
:004DE118 68DCE14D00 push 004DE1DC
:004DE11D 8B06 mov eax, dword ptr [esi]
:004DE11F 8B80F8040000 mov eax, dword ptr [eax+000004F8]
:004DE125 8B4040 mov eax, dword ptr [eax+40]
:004DE128 33D2 xor edx, edx
:004DE12A E809D2F9FF call 0047B338
:004DE12F 0FB7C0 movzx eax, ax
:004DE132 8D55D4 lea edx, dword ptr [ebp-2C]
:004DE135 E842B5F2FF call 0040967C
:004DE13A FF75D4 push [ebp-2C]
:004DE13D 68E8E14D00 push 004DE1E8
:004DE142 8B06 mov eax, dword ptr [esi]
:004DE144 8B80F8040000 mov eax, dword ptr [eax+000004F8]
:004DE14A 8B4040 mov eax, dword ptr [eax+40]
:004DE14D BA01000000 mov edx, 00000001
:004DE152 E8E1D1F9FF call 0047B338
:004DE157 0FB7C0 movzx eax, ax
:004DE15A 8D55D0 lea edx, dword ptr [ebp-30]
:004DE15D E81AB5F2FF call 0040967C
:004DE162 FF75D0 push [ebp-30]
:004DE165 68DCE14D00 push 004DE1DC
:004DE16A 8D4DCC lea ecx, dword ptr [ebp-34]
:004DE16D 8B06 mov eax, dword ptr [esi]
:004DE16F 8B80F8040000 mov eax, dword ptr [eax+000004F8]
:004DE175 BA09000000 mov edx, 00000009
:004DE17A E869D7F9FF call 0047B8E8
:004DE17F FF75CC push [ebp-34]
:004DE182 8D45DC lea eax, dword ptr [ebp-24]
:004DE185 BA07000000 mov edx, 00000007
:004DE18A E82160F2FF call 004041B0
:004DE18F 8B45DC mov eax, dword ptr [ebp-24]
:004DE192 E81D61F2FF call 004042B4
:004DE197 8BC8 mov ecx, eax

* Possible StringData Ref from Code Obj ->"Sorry, registration information "
->"is invalid."
|
:004DE199 BA08E24D00 mov edx, 004DE208 //我们停在这里
:004DE19E A1DC865200 mov eax, dword ptr [005286DC]
:004DE1A3 8B00 mov eax, dword ptr [eax]
:004DE1A5 E8BA58F7FF call 00453A64

往上看，原来是从4DDFDE处跳来，好的我们来到此处
:004DDFDB 8D4DF8 lea ecx, dword ptr [ebp-08]
:004DDFDE 8D55FC lea edx, dword ptr [ebp-04] *这几个语句有够经
:004DDFE1 8B06 mov eax, dword ptr [esi] *典的。
:004DDFE3 E810850200 call 005064F8 *关键，进去看看
:004DDFE8 84C0 test al, al *
:004DDFEA 0F840E010000 je 004DE0FE *若al=0,则失败。
:004DDFF0 8B06 mov eax, dword ptr [esi]
:004DDFF2 C680DC06000001 mov byte ptr [eax+000006DC], 01
:004DDFF9 8B06 mov eax, dword ptr [esi]
:004DDFFB 05E0060000 add eax, 000006E0

进入call 005064f8
* Referenced by a CALL at Addresses:
|:004DDFE3 , :0050C5E6 , :0050C609 经用SICE跟踪，几处CALL分别在注册、启动、时间变化时调用
|
:005064F8 55 push ebp
:005064F9 8BEC mov ebp, esp
:005064FB 6A00 push 00000000
:005064FD 6A00 push 00000000
:005064FF 6A00 push 00000000
:00506501 6A00 push 00000000
:00506503 53 push ebx
:00506504 56 push esi
:00506505 8BF1 mov esi, ecx
:00506507 8BDA mov ebx, edx
:00506509 33C0 xor eax, eax
:0050650B 55 push ebp
:0050650C 68136B5000 push 00506B13
:00506511 64FF30 push dword ptr fs:[eax]
:00506514 648920 mov dword ptr fs:[eax], esp
:00506517 C645FF00 mov [ebp-01], 00
:0050651B 8B16 mov edx, dword ptr [esi]

* Possible StringData Ref from Code Obj ->"dqma" //从这里开绐比较你的用户名、系列号是否在黑名单上，如在则玩完。 |
:0050651D B82C6B5000 mov eax, 00506B2C
:00506522 E8B5DEEFFF call 004043DC
:00506527 85C0 test eax, eax
:00506529 7E11 jle 0050653C
:0050652B 8BD6 mov edx, esi
:0050652D 8BC3 mov eax, ebx
:0050652F E87CF9FFFF call 00505EB0
:00506534 8845FF mov byte ptr [ebp-01], al
:00506537 E9BC050000 jmp 00506AF8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00506529(C)
|
:0050653C 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Henry Wiking"
|
:0050653E BA3C6B5000 mov edx, 00506B3C
:00506543 E8B8DCEFFF call 00404200
:00506548 0F84AA050000 je 00506AF8
:0050654E 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Harold Bishop"
|
:00506550 BA546B5000 mov edx, 00506B54
:00506555 E8A6DCEFFF call 00404200
:0050655A 0F8498050000 je 00506AF8
:00506560 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Roy Overstreet"
|
:00506562 BA6C6B5000 mov edx, 00506B6C
:00506567 E894DCEFFF call 00404200
:0050656C 0F8486050000 je 00506AF8
:00506572 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Menson inc."
|
:00506574 BA846B5000 mov edx, 00506B84
:00506579 E882DCEFFF call 00404200
:0050657E 0F8474050000 je 00506AF8
:00506584 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"James N. Hawkins"
|
:00506586 BA986B5000 mov edx, 00506B98
:0050658B E870DCEFFF call 00404200
:00506590 0F8462050000 je 00506AF8
:00506596 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"abdalsalam s"
|
:00506598 BAB46B5000 mov edx, 00506BB4
:0050659D E85EDCEFFF call 00404200
:005065A2 0F8450050000 je 00506AF8
:005065A8 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"tom jones"
|
:005065AA BACC6B5000 mov edx, 00506BCC
:005065AF E84CDCEFFF call 00404200
:005065B4 0F843E050000 je 00506AF8
:005065BA 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Craig Suharsono"
|
:005065BC BAE06B5000 mov edx, 00506BE0
:005065C1 E83ADCEFFF call 00404200
:005065C6 0F842C050000 je 00506AF8
:005065CC 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Hidehiro nakatsugawa"
|
:005065CE BAF86B5000 mov edx, 00506BF8
:005065D3 E828DCEFFF call 00404200
:005065D8 0F841A050000 je 00506AF8
:005065DE 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Mike's Pro Shop"
|
:005065E0 BA186C5000 mov edx, 00506C18
:005065E5 E816DCEFFF call 00404200
:005065EA 0F8408050000 je 00506AF8
:005065F0 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"li lu"
|
:005065F2 BA306C5000 mov edx, 00506C30
:005065F7 E804DCEFFF call 00404200
:005065FC 0F84F6040000 je 00506AF8
:00506602 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Global Disaster Sofware"
|
:00506604 BA406C5000 mov edx, 00506C40
:00506609 E8F2DBEFFF call 00404200
:0050660E 0F84E4040000 je 00506AF8
:00506614 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Ellis Wang"
|
:00506616 BA606C5000 mov edx, 00506C60
:0050661B E8E0DBEFFF call 00404200
:00506620 0F84D2040000 je 00506AF8
:00506626 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"frank stein"
|
:00506628 BA746C5000 mov edx, 00506C74
:0050662D E8CEDBEFFF call 00404200
:00506632 0F84C0040000 je 00506AF8
:00506638 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"none"
|
:0050663A BA886C5000 mov edx, 00506C88
:0050663F E8BCDBEFFF call 00404200
:00506644 0F84AE040000 je 00506AF8
:0050664A 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Peter Baudman"
|
:0050664C BA986C5000 mov edx, 00506C98
:00506651 E8AADBEFFF call 00404200
:00506656 0F849C040000 je 00506AF8
:0050665C 8B03 mov eax, dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Guadalupe Serrano Espinoza"
：
：
由于名单和系列号太多了，此处略过
:
:00506A02 FF33 push dword ptr [ebx]

* Possible StringData Ref from Code Obj ->"Single"
|
:00506A04 6858705000 push 00507058
:00506A09 8D45F8 lea eax, dword ptr [ebp-08]
:00506A0C BA03000000 mov edx, 00000003
:00506A11 E89AD7EFFF call 004041B0
:00506A16 BB01000000 mov ebx, 00000001
:00506A1B EB29 jmp 00506A46

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00506A4F(C)
|从这里开始对输入的用户名和系列号进行处理
:00506A1D 8B06 mov eax, dword ptr [esi]
:00506A1F 8A4418FF mov al, byte ptr [eax+ebx-01]
:00506A23 04D0 add al, D0
:00506A25 2C0A sub al, 0A
:00506A27 721C jb 00506A45
:00506A29 04F9 add al, F9
:00506A2B 2C1A sub al, 1A
:00506A2D 7216 jb 00506A45
:00506A2F 04FA add al, FA
:00506A31 2C1A sub al, 1A
:00506A33 7210 jb 00506A45
:00506A35 8BC6 mov eax, esi
:00506A37 B901000000 mov ecx, 00000001
:00506A3C 8BD3 mov edx, ebx
:00506A3E E8F5D8EFFF call 00404338
:00506A43 EB01 jmp 00506A46

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00506A27(C), :00506A2D(C), :00506A33(C)
|
:00506A45 43 inc ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00506A1B(U), :00506A43(U)
|
:00506A46 8B06 mov eax, dword ptr [esi]
:00506A48 E8A3D6EFFF call 004040F0
:00506A4D 3BD8 cmp ebx, eax
:00506A4F 7ECC jle 00506A1D
:00506A51 BAC163D306 mov edx, 06D363C1
:00506A56 8B45F8 mov eax, dword ptr [ebp-08]
:00506A59 E8227BF7FF call 0047E580
:00506A5E 8D55F4 lea edx, dword ptr [ebp-0C]
:00506A61 E83AF2FFFF call 00505CA0
:00506A66 BB01000000 mov ebx, 00000001
:00506A6B EB2B jmp 00506A98

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00506AA2(C)
|
:00506A6D 8B45F4 mov eax, dword ptr [ebp-0C]
:00506A70 8A4418FF mov al, byte ptr [eax+ebx-01]
:00506A74 04D0 add al, D0
:00506A76 2C0A sub al, 0A
:00506A78 721D jb 00506A97
:00506A7A 04F9 add al, F9
:00506A7C 2C1A sub al, 1A
:00506A7E 7217 jb 00506A97
:00506A80 04FA add al, FA
:00506A82 2C1A sub al, 1A
:00506A84 7211 jb 00506A97
:00506A86 8D45F4 lea eax, dword ptr [ebp-0C]
:00506A89 B901000000 mov ecx, 00000001
:00506A8E 8BD3 mov edx, ebx
:00506A90 E8A3D8EFFF call 00404338
:00506A95 EB01 jmp 00506A98

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00506A78(C), :00506A7E(C), :00506A84(C)
|
:00506A97 43 inc ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00506A6B(U), :00506A95(U)
|
:00506A98 8B45F4 mov eax, dword ptr [ebp-0C]
:00506A9B E850D6EFFF call 004040F0
:00506AA0 3BD8 cmp ebx, eax
:00506AA2 7EC9 jle 00506A6D
:00506AA4 8B06 mov eax, dword ptr [esi]
:00506AA6 8B55F4 mov edx, dword ptr [ebp-0C]
:00506AA9 E852D7EFFF call 00404200
:00506AAE 0F9445FF sete byte ptr [ebp-01]
:00506AB2 807DFF00 cmp byte ptr [ebp-01], 00
:00506AB6 7440 je 00506AF8
:00506AB8 C645FF00 mov [ebp-01], 00
:00506ABC BAC163D306 mov edx, 06D363C1
:00506AC1 8B45F8 mov eax, dword ptr [ebp-08]
:00506AC4 E8B77AF7FF call 0047E580
:00506AC9 8D55F0 lea edx, dword ptr [ebp-10]
:00506ACC E8CFF1FFFF call 00505CA0
:00506AD1 8B45F0 mov eax, dword ptr [ebp-10]
:00506AD4 E84FF9FFFF call 00506428
:00506AD9 83F8FF cmp eax, FFFFFFFF
:00506ADC 741A je 00506AF8
:00506ADE BB91080000 mov ebx, 00000891

* Possible StringData Ref from Data Obj ->"?"
|
:00506AE3 BA10525200 mov edx, 00525210

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00506AF6(C)
|
:00506AE8 3B02 cmp eax, dword ptr [edx]
:00506AEA 7506 jne 00506AF2
:00506AEC C645FF01 mov [ebp-01], 01
:00506AF0 EB06 jmp 00506AF8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00506AEA(C)
|
:00506AF2 83C204 add edx, 00000004
:00506AF5 4B dec ebx
:00506AF6 75F0 jne 00506AE8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00506537(U), :00506548(C), :0050655A(C), :0050656C(C), :0050657E(C)
|:00506590(C), :005065A2(C), :005065B4(C), :005065C6(C), :005065D8(C)
|:005065EA(C), :005065FC(C), :0050660E(C), :00506620(C), :00506632(C)
|:00506644(C), :00506656(C), :00506668(C), :0050667A(C), :0050668C(C)
|:0050669E(C), :005066B0(C), :005066C2(C), :005066D4(C), :005066E6(C)
|:005066F8(C), :0050670A(C), :0050671C(C), :0050672E(C), :00506740(C)
|:00506752(C), :00506764(C), :00506776(C), :00506788(C), :0050679A(C)
|:005067AC(C), :005067BE(C), :005067D0(C), :005067E2(C), :00506801(C)
|:00506816(C), :0050682B(C), :0050683E(C), :00506853(C), :00506868(C)
|:0050687D(C), :00506892(C), :005068A7(C), :005068BC(C), :005068D1(C)
|:005068E6(C), :005068FB(C), :00506910(C), :00506925(C), :0050693A(C)
|:0050694F(C), :00506964(C), :00506979(C), :0050698E(C), :005069A3(C)
|:005069B8(C), :005069CD(C), :005069E2(C), :005069F7(C), :00506AB6(C)
|:00506ADC(C), :00506AF0(U)
|
:00506AF8 33C0 xor eax, eax //失败的话，则eax=0
:00506AFA 5A pop edx
:00506AFB 59 pop ecx
:00506AFC 59 pop ecx
:00506AFD 648910 mov dword ptr fs:[eax], edx
:00506B00 681A6B5000 push 00506B1A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00506B18(U)
|
:00506B05 8D45F0 lea eax, dword ptr [ebp-10]
:00506B08 BA03000000 mov edx, 00000003
:00506B0D E882D3EFFF call 00403E94
:00506B12 C3 ret

程序的修改很简单：在call 005064f8开始处即：
:005064F8 55 push ebp
:005064F9 8BEC mov ebp, esp
:005064FB 6A00 push 00000000
:005064FD 6A00 push 00000000
直接改成2条语句：① 　mov eax,1
② retn
至此程序完全破解，无论你用什么名注册均成功，时间如何变化也不会过期了。此法对v1.9 pro 同样适用.
以上有不妥之处请各位一定要指出.

在此谢谢blowfish的提示。


Offline Explorer1.3

 标 题:破解Offline Explorer1.3实战录（简单） (1千字)
发信人:十三少
时 间:2000-9-4 15:21:37
详细信息:
软件下载：
ftp://ftp.bj.software.chinese.com/software/soft_offbrowse/poe13273sr3-f.exe
一、运行trw
二、填上注册信息：(先任意填）
name:yubing
code:78787878
三、ctrl-n进入trw中，下
:bpx hmemcpy
:g (返回）
按“确定”被中断，然后再用F12,到如下代码：
015F:004BF72A LEA EDX,[EBP-08]
015F:004BF72D MOV EAX,[EBX+02E8]
015F:004BF733 CALL 00433938
015F:004BF738 LEA ECX,[EBP-08]
015F:004BF73B LEA EDX,[EBP-04]
015F:004BF73E MOV EAX,[004E4C9C]
015F:004BF743 MOV EAX,[EAX]
015F:004BF745 CALL 004D1940 //注册比较部分，按F8追入
015F:004BF74A TEST AL,AL　　 //检测标志al
015F:004BF74C JZ 004BF7CC //跳则失败(NO JUMP)
015F:004BF74E MOV EAX,[004E4C9C]
015F:004BF753 MOV EAX,[EAX]
015F:004BF755 MOV BYTE [EAX+064C],01

四、如上所述，注册比较部分追入后，按F10到以下代码：
015F:004D1DD2 CALL 00403E70
015F:004D1DD7 CMP EBX,EAX
015F:004D1DD9 JNG 004D1DA7
015F:004D1DDB MOV EDX,06D363C1
015F:004D1DE0 MOV EAX,[EBP-04]
015F:004D1DE3 CALL 0047C580
015F:004D1DE8 LEA EDX,[EBP-08]
015F:004D1DEB CALL 004D1324
015F:004D1DF0 MOV EDX,[EBP-08] //d edx 正确的注册码
015F:004D1DF3 MOV EAX,[ESI]　　//d eax　你输入的注册码
015F:004D1DF5 CALL 00403F80　　 //两注册码的比较：）
015F:004D1DFA SETZ BL
015F:004D1DFD XOR EAX,EAX
015F:004D1DFF POP EDX
015F:004D1E00 POP ECX

当找到正确的注册码后，用笔抄下，就可以注册了。

    十三少
China Cracking Group
2000.09.04


OICQ 图形留言系统 v3.2

 标 题:OICQ 图形留言系统 v3.2注册码算法 不知有没有人贴过，呵呵！ (11千字)
发信人:TAE!
时 间:2001-6-23 13:46:27
详细信息:
软件名称：OICQ 图形留言系统 v3.2
保护方式：注册码
破解人：TAE！[BCG] TAE![FCG]
软件简介：一个ascii涂鸦工具，可以在QQ上使用！
下载地址：http://software.wx88.net/down/OICQ_setup.exe

前言：现在有许多cracker初学者总是指望在内存中找到注册码，本人以前也是如此，呵呵，但现在越来越难了，所以一定要掌握软件的算法，然后自己算注册码，这样对你的水平提高有很大好处的！这次应朋友所邀破解此软件！这个软件是在软件启动是判断注册码，现在很多软件都是如此了，呵呵广大Crack初学者一定要熟悉此类程序的跟踪方法！
它将输入的注册信息放在了注册表里，启动时读出信息，加以判断。

下断点Hmemcpy应该不难跟踪到这里：

:004B7C9C B201 mov dl, 01
:004B7C9E A134AE4900 mov eax, dword ptr [0049AE34]
:004B7CA3 E88C32FEFF call 0049AF34
:004B7CA8 8BD8 mov ebx, eax
:004B7CAA BA03000080 mov edx, 80000003
:004B7CAF 8BC3 mov eax, ebx
:004B7CB1 E81E33FEFF call 0049AFD4
:004B7CB6 6A40 push 00000040
:004B7CB8 68487D4B00 push 004B7D48

* Possible StringData Ref from Code Obj ->"需要重新启动OICQ图形留言系统检测注册名/码匹配?
->"敕瘢?
|
:004B7CBD 68507D4B00 push 004B7D50
:004B7CC2 8B45FC mov eax, dword ptr [ebp-04]
:004B7CC5 E816FDF7FF call 004379E0
:004B7CCA 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004B7CCB E810FBF4FF Call 004077E0
:004B7CD0 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->".DEFAULT\Software\ABCSoft\Oicqpic" \\原来将注册信息存在注册表里！
|
:004B7CD2 BA8C7D4B00 mov edx, 004B7D8C
:004B7CD7 8BC3 mov eax, ebx
:004B7CD9 E85E33FEFF call 0049B03C
:004B7CDE 8D55F4 lea edx, dword ptr [ebp-0C]
:004B7CE1 8B45FC mov eax, dword ptr [ebp-04]
:004B7CE4 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:004B7CEA E8C99BF7FF call 004318B8
:004B7CEF 8B4DF4 mov ecx, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"Name" \\姓名
|
:004B7CF2 BAB87D4B00 mov edx, 004B7DB8
:004B7CF7 8BC3 mov eax, ebx
:004B7CF9 E8BA36FEFF call 0049B3B8
:004B7CFE 8BCE mov ecx, esi

* Possible StringData Ref from Code Obj ->"Pass" \\注册码
|
:004B7D00 BAC87D4B00 mov edx, 004B7DC8
:004B7D05 8BC3 mov eax, ebx
:004B7D07 E85037FEFF call 0049B45C
:004B7D0C 8BC3 mov eax, ebx
:004B7D0E E8DDB1F4FF call 00402EF0
:004B7D13 A1DC364C00 mov eax, dword ptr [004C36DC]
:004B7D18 8B00 mov eax, dword ptr [eax]
:004B7D1A E89D7DF9FF call 0044FABC
:004B7D1F 33C0 xor eax, eax
:004B7D21 5A pop edx
:004B7D22 59 pop ecx
:004B7D23 59 pop ecx
:004B7D24 648910 mov dword ptr fs:[eax], edx
:004B7D27 68417D4B00 push 004B7D41

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B7D3F(U)
|
:004B7D2C 8D45F4 lea eax, dword ptr [ebp-0C]
:004B7D2F BA02000000 mov edx, 00000002
:004B7D34 E8A3BEF4FF call 00403BDC
:004B7D39 C3 ret

既然知道它将信息放入注册表，那就好办多了！程序是在启动时判断是否注册的，所以用w32dasm反编译程序，然后查找Name，第一次找到的就是上面那里，再搜索一次可以找到下面这一处：
这里就是从注册表读出注册信息，然后判断注册码是否正确，正确则不再显示“未注册”字样。

* Possible StringData Ref from Code Obj ->".DEFAULT\Software\ABCSoft\Oicqpic"
|
:004BAE43 BA44AF4B00 mov edx, 004BAF44
:004BAE48 8BC6 mov eax, esi
:004BAE4A E8ED01FEFF call 0049B03C \\这里判断注册表中是否有注册信息
:004BAE4F 84C0 test al, al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BADEA(C)
|
:004BAE51 744F je 004BAEA2
:004BAE53 8D4DFC lea ecx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"Name"
|
:004BAE56 BA70AF4B00 mov edx, 004BAF70
:004BAE5B 8BC6 mov eax, esi
:004BAE5D E88205FEFF call 0049B3E4
:004BAE62 8B55FC mov edx, dword ptr [ebp-04]
:004BAE65 8D8358040000 lea eax, dword ptr [ebx+00000458]
:004BAE6B E89C8DF4FF call 00403C0C

* Possible StringData Ref from Code Obj ->"Pass"
|
:004BAE70 BA80AF4B00 mov edx, 004BAF80
:004BAE75 8BC6 mov eax, esi
:004BAE77 E8F405FEFF call 0049B470
:004BAE7C 89832C040000 mov dword ptr [ebx+0000042C], eax
:004BAE82 8BC6 mov eax, esi
:004BAE84 E86780F4FF call 00402EF0
:004BAE89 8B8B2C040000 mov ecx, dword ptr [ebx+0000042C]
:004BAE8F 8B9358040000 mov edx, dword ptr [ebx+00000458]
:004BAE95 8BC3 mov eax, ebx
:004BAE97 E814010000 call 004BAFB0 \\这里是算码关键call，进去瞧瞧
:004BAE9C 888331040000 mov byte ptr [ebx+00000431], al \\要注意al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BAE51(C)
|
:004BAEA2 80BB3104000000 cmp byte ptr [ebx+00000431], 00 \\看，其实关键就是返回的al值！
:004BAEA9 743A je 004BAEE5 \\不跳就爽了！呵呵。
:004BAEAB A1B0494C00 mov eax, dword ptr [004C49B0]
:004BAEB0 8B80E0030000 mov eax, dword ptr [eax+000003E0]
:004BAEB6 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:004BAEBC BA03000000 mov edx, 00000003
:004BAEC1 E8F61EFAFF call 0045CDBC
:004BAEC6 50 push eax
:004BAEC7 8D45F8 lea eax, dword ptr [ebp-08]
:004BAECA 8B8B58040000 mov ecx, dword ptr [ebx+00000458]

* Possible StringData Ref from Code Obj ->"注册人:"
|
:004BAED0 BA90AF4B00 mov edx, 004BAF90
:004BAED5 E8AA8FF4FF call 00403E84
:004BAEDA 8B55F8 mov edx, dword ptr [ebp-08]
:004BAEDD 58 pop eax
:004BAEDE E8511EFAFF call 0045CD34
:004BAEE3 EB27 jmp 004BAF0C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BAEA9(C)
|
:004BAEE5 8D55F4 lea edx, dword ptr [ebp-0C]
:004BAEE8 A1B0494C00 mov eax, dword ptr [004C49B0]
:004BAEED E8C669F7FF call 004318B8
:004BAEF2 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->" (未注册版本)"
|
:004BAEF5 BAA0AF4B00 mov edx, 004BAFA0
:004BAEFA E8418FF4FF call 00403E40
:004BAEFF 8B55F4 mov edx, dword ptr [ebp-0C]
:004BAF02 A1B0494C00 mov eax, dword ptr [004C49B0]
:004BAF07 E8DC69F7FF call 004318E8

那我们就去那个关键call看看吧！

:004BAFB0 55 push ebp
:004BAFB1 8BEC mov ebp, esp
:004BAFB3 83C4EC add esp, FFFFFFEC
:004BAFB6 53 push ebx
:004BAFB7 56 push esi
:004BAFB8 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BAF53(C), :004BAF5C(C)
|
:004BAFBA 895DEC mov dword ptr [ebp-14], ebx
:004BAFBD 895DF4 mov dword ptr [ebp-0C], ebx
:004BAFC0 894DF8 mov dword ptr [ebp-08], ecx
:004BAFC3 8955FC mov dword ptr [ebp-04], edx
:004BAFC6 8B45FC mov eax, dword ptr [ebp-04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BAF50(C)
|
:004BAFC9 E81E90F4FF call 00403FEC
:004BAFCE 33C0 xor eax, eax
:004BAFD0 55 push ebp
:004BAFD1 686EB04B00 push 004BB06E
:004BAFD6 64FF30 push dword ptr fs:[eax]
:004BAFD9 648920 mov dword ptr fs:[eax], esp
:004BAFDC 33F6 xor esi, esi
:004BAFDE 8D45F4 lea eax, dword ptr [ebp-0C]
:004BAFE1 8B55FC mov edx, dword ptr [ebp-04]
:004BAFE4 E8678CF4FF call 00403C50
:004BAFE9 8B45F4 mov eax, dword ptr [ebp-0C]
:004BAFEC E8478EF4FF call 00403E38
:004BAFF1 85C0 test eax, eax
:004BAFF3 7E3D jle 004BB032
:004BAFF5 8945F0 mov dword ptr [ebp-10], eax
:004BAFF8 BB01000000 mov ebx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BB030(C)
|
:004BAFFD 8D45EC lea eax, dword ptr [ebp-14]
:004BB000 50 push eax
:004BB001 B901000000 mov ecx, 00000001
:004BB006 8BD3 mov edx, ebx
:004BB008 8B45F4 mov eax, dword ptr [ebp-0C]
:004BB00B E83090F4FF call 00404040
:004BB010 8B45EC mov eax, dword ptr [ebp-14]
:004BB013 E8E48FF4FF call 00403FFC
:004BB018 8A00 mov al, byte ptr [eax] \\依次取名字的字符
:004BB01A 33D2 xor edx, edx \\清空寄存器
:004BB01C 8AD0 mov dl, al \\将取出的字符ascii给dl
:004BB01E 8BCA mov ecx, edx \\再给ecx
:004BB020 0FAFCA imul ecx, edx \\ecx*edx，也就是将取出字符的ascii码开方！
:004BB023 8D4317 lea eax, dword ptr [ebx+17] \\ebx+17中依次是18、19。。。传给eax
:004BB026 F7EE imul esi \\乘esi，这里第一次esi是0,
:004BB028 03C8 add ecx, eax \\ecx+eax相加
:004BB02A 8BF1 mov esi, ecx \\保存运算结果到esi中
:004BB02C 43 inc ebx \\计数，循环多少次？名字的字符串个数！
:004BB02D FF4DF0 dec [ebp-10]
:004BB030 75CB jne 004BAFFD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BAFF3(C)
|
:004BB032 8B45F8 mov eax, dword ptr [ebp-08] \\这个是将输入的注册码Hex值给eax
:004BB035 2D4D050000 sub eax, 0000054D \\eax－0x54D传给eax
:004BB03A 3BF0 cmp esi, eax \\看结果是不是等于esi（上面运算出的值）
:004BB03C 7508 jne 004BB046 \\不能跳哟！
:004BB03E 85F6 test esi, esi
:004BB040 7404 je 004BB046
:004BB042 B301 mov bl, 01 \\看到这个了吧！哈哈哈哈！舒服呀！
:004BB044 EB02 jmp 004BB048

算法：
以姓名TAE！为例

A=0x54^2+0x18*0
B=0x41^2+0x19*A
C=0x45^2+0x20*B
D=0x21^2+0x21*C
SN=D+0x54D

得到注册码的简单方法：
到了 004BB032那一行，可以用下命令 ? esi+54D，即可得到正确注册码！！

一个可用的注册码：
Name：TAE！
Sn：126929743
下面这个ascii涂鸦就是用这个软件做的，呵呵！

.----.
_.'__ `.
.--(#)(##)---/#\
.' @ /###\
: , #####
`-..__.-' _.-\###/
`;_: `"'
.'"""""`.
/, JOE ,\
// COOL! \\
`-._______.-'
___`. | .'___
(______|______)

标 题:贴这个的注册机~~~~很早已前的的 (431字)
发信人:伪装者[CCG]
时 间:2001-6-23 14:31:03
详细信息:

 #include "stdio.h"
main()
{
char string[81];
unsigned long i,a=0,b=0;
unsigned c;
printf("******OICQ PIC 3.20********\nThis keygen is maked by Pretender\nPlease
  input your name\n");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{a=(24+i)*a;
if(c>127) c=256+c;
b=c*c;
a=a+b;
}
printf("Your name is ");
puts(string);
printf("Your Register code is %ld\n",a+0x54d);
printf("Welcome to WWW.CRACKNOW.COM\n");}


OicqSend Ver 2.01.903

 标 题:OicqSend (Oicq消息发布） Ver 2.01.903 破解 (1千字)
发信人:1212
时 间:2000-9-21 15:41:00
详细信息:
OicqSend (Oicq消息发布） Ver 2.01.903 破解实录

工具：trw2000

由于在某一天早上，本人的oicq受到了不知是谁的消息攻击，发现这个工具挺不错的，于是也载了一个下了，虽说这个工具是免费注册的，可是要发E，又不知何时有回音，（最主要的就是看着要注册不舒服，加上手痒而已，呵呵）就想到了破解它，好了，费话小说 Go

首先打开trw2000按下OK后，运行oicqsend，点注册的图标（一个大锁）写上自己的Q号，注册码先写456456456吧，Ctrl+N由trw2000接管，写进bpx hmemcpy回车后，输入G回到注册的画面，点击确定，TRW2000自动跳出来到了
0043491B MOV [EBX+0C],EAX 一直按F10执行
0043491E MOV EAX,[EBX]
00434920 CMP EAX;BYTE+0C
00434923 JNZ 00434940
00434925 MOV EDX,[EBX+08]
00434928 PUSH EDX
00434929 MOV ECX,[EBX+04]
0043492C MOV EDX,EAX
.
.
.
一直来到
004919BF MOV EAX,[00497FC4]
004919C4 MOV EAX,[EAX]
004919C6 CALL 00493084
004919CB LEA EDX,[EBP-14]
004919CE MOV EAX,[EBX+02DC]
004919D4 CALL 00430BFC
004919D9 MOV EAX,[EBP-14]
004919DC MOV EDX,[EBP-08]
004919DF CALL 00403FE4 <=可疑吧，按F8跟进
004919E4 JNZ NEAR 00491AAC <=不为零就跳转

来到 00403FE4 PUSH EBX
00403FE5 PUSH ESI
00403FE6 PUSH EDI
00403FE7 MOV ESI,EAX
00403FE9 MOV EDI,EDX
00403FEB CMP EAX,EDX <=关键时刻到了
我们来D EDX 吧，注册码出来了，赶快抄下，注册去吧。（总共用时12分钟）
.
.

2000年9月21日


OICQ图形留言系统

标 题:OICQ图形留言系统(1千字)
发信人:真·伪装者
时 间:2001-1-31 3:48:01
阅读次数:98
详细信息:
0167:004BACDE MOV EAX,[EBP-0C] EAX中是我的用户名
0167:004BACE1 CALL 00403E38
0167:004BACE6 MOV EDI,EAX
0167:004BACE8 TEST EDI,EDI
0167:004BACEA JNG 004BAD24
0167:004BACEC MOV EBX,01 这个1后来要用到
0167:004BACF1 LEA EAX,[EBP-10]
0167:004BACF4 PUSH EAX
0167:004BACF5 MOV ECX,01
0167:004BACFA MOV EDX,EBX
0167:004BACFC MOV EAX,[EBP-0C]
0167:004BACFF CALL 00404040
0167:004BAD04 MOV EAX,[EBP-10]
0167:004BAD07 CALL 00403FFC
0167:004BAD0C MOV AL,[EAX] 将用户名的第一个字符放入AL
0167:004BAD0E LEA EDX,[EBX+17] EDX=1+23=24
0167:004BAD11 IMUL EDX,ESI 此时ESI=0，EDX=0
0167:004BAD14 AND EAX,FF
0167:004BAD19 IMUL EAX,EAX,BYTE +17 AL乘以23（即第一个字符乘以23）
0167:004BAD1C ADD EDX,EAX EDX=EDX+EAX
0167:004BAD1E MOV ESI,EDX ESI=EDX
0167:004BAD20 INC EBX EBX+1
0167:004BAD21 DEC EDI EDI-1（EDI是用户名的长度）
0167:004BAD22 JNZ 004BACF1 不为零则跳（即还有用户名字符没有计算）
0167:004BAD24 CMP ESI,[EBP-08] ESI中是正确的注册码，EBP-8中是你输入的注册码
示例：用户名为123，注册码输入321
计算：真实注册码={[（49x23+24x0）x25+50x23]x26+51x23}=763623
注册机写起来不难~~~~~~~~~~~~~~

标 题:注册又一方法 (91字)
发信人:1212
时 间:2001-1-31 2:57:28
详细信息:

只要在HKEY_CURRENT_USER\Software\ABCSoft\Oicqpic新建字符串值Name和DOWRD值Pass即可完成注册


OSR DDK

 标 题:OSR DDK (8千字)
发信人:-=1212=-
时 间:2001-8-17 17:08:54
详细信息:
Name 1212
Company 1212
Code 9274-872EA9A7

http://www.driverdevelop.com/dlit.php?id=6

osrLicense.dll

100016F0 public ValidateSerialNum
100016F0 ValidateSerialNum proc near
100016F0
100016F0 var_10C = byte ptr -10Ch
100016F0 var_CC = byte ptr -0CCh
100016F0 var_8C = byte ptr -8Ch
100016F0 arg_0 = dword ptr 4
100016F0 arg_4 = dword ptr 8
100016F0 arg_8 = dword ptr 0Ch
100016F0
100016F0 sub esp, 10Ch
100016F6 push esi
100016F7 mov esi, [esp+110h+arg_0]
100016FE push edi
100016FF push esi
10001700 call GetOSRVersion
10001705 add esp, 4
10001708 cmp eax, 2
1000170B jz short loc_10001746
1000170D mov edi, esi
1000170F or ecx, 0FFFFFFFFh
10001712 xor eax, eax
10001714 repne scasb
10001716 not ecx
10001718 dec ecx
10001719 jnz short loc_10001729
1000171B pop edi
1000171C mov eax, 0FFFFFFFEh
10001721 pop esi
10001722 add esp, 10Ch
10001728 retn
10001729
10001729 loc_10001729: ; CODE XREF: ValidateSerialNum+29
10001729 mov edi, esi
1000172B or ecx, 0FFFFFFFFh
1000172E xor eax, eax
10001730 repne scasb
10001732 not ecx
10001734 dec ecx
10001735 cmp ecx, 0Dh
10001738 jz short loc_10001746
1000173A pop edi
1000173B or eax, 0FFFFFFFFh
1000173E pop esi
1000173F add esp, 10Ch
10001745 retn
10001746
10001746 loc_10001746: ; CODE XREF: ValidateSerialNum+1B
10001746 ; ValidateSerialNum+48
10001746 push esi
10001747 call GetOSRProduct
1000174C add esp, 4
1000174F test eax, eax
10001751 jnz short loc_10001761
10001753 pop edi
10001754 mov eax, 0FFFFFFFBh
10001759 pop esi
1000175A add esp, 10Ch
10001760 retn
10001761
10001761 loc_10001761: ; CODE XREF: ValidateSerialNum+61
10001761 push esi
10001762 call GetOSRVersion
10001767 add esp, 4
1000176A test eax, eax
1000176C jnz short loc_1000177C
1000176E pop edi
1000176F mov eax, 0FFFFFFFCh
10001774 pop esi
10001775 add esp, 10Ch
1000177B retn
1000177C
1000177C loc_1000177C: ; CODE XREF: ValidateSerialNum+7C
1000177C push esi
1000177D call GetOSRRelease
10001782 add esp, 4
10001785 cmp eax, 64h
10001788 jge short loc_10001798
1000178A pop edi
1000178B mov eax, 0FFFFFFFDh
10001790 pop esi
10001791 add esp, 10Ch
10001797 retn
10001798
10001798 loc_10001798: ; CODE XREF: ValidateSerialNum+98
10001798 mov edi, esi
1000179A or ecx, 0FFFFFFFFh
1000179D xor eax, eax
1000179F repne scasb
100017A1 not ecx
100017A3 dec ecx
100017A4 test ecx, ecx
100017A6 jle short loc_100017BD
100017A8 mov eax, ecx
100017AA add esi, 5
100017AD lea edi, [esp+114h+var_CC]
100017B1 shr ecx, 2
100017B4 repe movsd
100017B6 mov ecx, eax
100017B8 and ecx, 3
100017BB repe movsb
100017BD
100017BD loc_100017BD: ; CODE XREF: ValidateSerialNum+B6
100017BD mov edi, [esp+114h+arg_4]
100017C4 or ecx, 0FFFFFFFFh
100017C7 xor eax, eax
100017C9 lea edx, [esp+114h+var_8C]
100017D0 repne scasb
100017D2 not ecx
100017D4 sub edi, ecx
100017D6 push ebx
100017D7 mov eax, ecx
100017D9 mov esi, edi
100017DB mov edi, edx
100017DD lea edx, [esp+118h+var_8C]
100017E4 shr ecx, 2
100017E7 repe movsd
100017E9 mov ecx, eax
100017EB xor eax, eax
100017ED and ecx, 3
100017F0 push 6B64646Fh
100017F5 repe movsb
100017F7 mov edi, [esp+11Ch+arg_8]
100017FE or ecx, 0FFFFFFFFh
10001801 repne scasb
10001803 not ecx
10001805 sub edi, ecx
10001807 mov esi, edi
10001809 mov ebx, ecx
1000180B mov edi, edx
1000180D or ecx, 0FFFFFFFFh
10001810 repne scasb
10001812 mov ecx, ebx
10001814 dec edi
10001815 shr ecx, 2
10001818 repe movsd
1000181A mov ecx, ebx
1000181C and ecx, 3
1000181F repe movsb
10001821 lea edi, [esp+11Ch+var_8C]
10001828 or ecx, 0FFFFFFFFh
1000182B repne scasb
1000182D not ecx
1000182F dec ecx
10001830 lea eax, [esp+11Ch+var_8C]
10001837 push ecx
10001838 push eax
10001839 call sub_10001340
1000183E push eax
1000183F lea ecx, [esp+128h+var_10C]
10001843 push offset a08x ; "%08X"
10001848 push ecx
10001849 call ds:wsprintfA
1000184F add esp, 18h
10001852 lea esi, [esp+118h+var_CC]
10001856 lea eax, [esp+118h+var_10C]
1000185A
1000185A loc_1000185A: ; CODE XREF: ValidateSerialNum+18C
1000185A mov dl, [eax]
1000185C mov bl, [esi]
1000185E mov cl, dl
10001860 cmp dl, bl
10001862 jnz short loc_10001893
10001864 test cl, cl
10001866 jz short loc_1000187E
10001868 mov dl, [eax+1]
1000186B mov bl, [esi+1]
1000186E mov cl, dl
10001870 cmp dl, bl
10001872 jnz short loc_10001893
10001874 add eax, 2
10001877 add esi, 2
1000187A test cl, cl
1000187C jnz short loc_1000185A
1000187E
1000187E loc_1000187E: ; CODE XREF: ValidateSerialNum+176
1000187E xor eax, eax
10001880 xor ecx, ecx
10001882 test eax, eax
10001884 setz cl
10001887 pop ebx
10001888 pop edi
10001889 mov eax, ecx
1000188B pop esi
1000188C add esp, 10Ch
10001892 retn
10001893
10001893 loc_10001893: ; CODE XREF: ValidateSerialNum+172
10001893 ; ValidateSerialNum+182
10001893 sbb eax, eax
10001895 pop ebx
10001896 sbb eax, 0FFFFFFFFh
10001899 xor ecx, ecx
1000189B test eax, eax
1000189D setz cl
100018A0 pop edi
100018A1 mov eax, ecx
100018A3 pop esi
100018A4 add esp, 10Ch
100018AA retn
100018AA ValidateSerialNum endp


PageBuilder V3.0c1

标 题:经过4个小时的奋战，终于搞清了它的注册计算原理，给大家分享。准备写出注册机（只能用BRUCK攻击） (1千字)
发信人:pcrocker
时 间:2001-2-10 5:41:42
详细信息:

TafWeb出品的PageBuilder V3.0c1

TafWeb出品的PageBuilder V3.0c1 版本日期1999-08-26 下载地址：http://download.sina.com.cn/scgi/click.pl?s_id=884&href=1&ants=/pbldr_30.zip 用过的网页设计工具不多，这个PageBuilder也许是一个方便的面向文字的编辑工具。在试用版中，有60天的使用限制，网上的注册机我找到的最高版本是V3.0C。于是自己破解，好难：-（ 它的注册计算过程比较麻烦，没有明确的call+test+jz（jnz）的过程，而是对注册用户名作了处理（程序代码从0041DA8E到0041E011是注册变换过程），之后是几个取商、取余数的过程。

用file scanner查出这个page builder V3.0c1是用aspack压的，解压后本来准备暴破的，不甘心。于是费时4个多小时，终于搞清它的注册原理，如下（以下数字均为16进制）：
1、将输入的User名称各字符的ASCII相加，再加上固定值3*3+3=9（被乘数和后面加数的3是版本号），再加PageBuiler的ASCII字符值是288，得到的结果，设为AA；
2、取奇数位1、3、5、7，迭代B=(1)*2*5+(3); B=B*2*5+(5); BB=B*2*5+(7)，其中（i）表示为第i位的数值，其结果设为BB；
3、取偶数位8、6、4、2（注意顺序），同上面一样处理：C=(8)*2*5+(6); C=C*2*5+(4); CC=C*2*5+(2)，接下来是CC=CC-AA，其结果设为CC；
4、BB mod 7=0；
5、CC mod d=0；
6、int[BB/7]=int[CC/d] 且 >94;
7、大家看到第9 位没有用到，事实上第9位是校验位。我不是分析程序得到的，原因在于这个程序比较狡猾，计算后的值在内存地址中不固定，我是一遍遍试出来的 :-< 。将前8 位数值相加，将和的个位与十位再相加，如果是一位数则应当与第9位相等；如果出现前8 位类似是 777-777-77，和为56，5+6=11>9，则将该结果再处理1+1=2，即第9位应为2；
以上就是它的注册计算过程，整个过程跟下来好累，下面要作的就是写出注册机，手头只有TC2.0，还不错。

标 题:测试下来，上面的分析可能还有不正确的地方， (104字)
发信人:pcrocker
时 间:2001-2-10 7:04:57
详细信息:

第1步中的固定值可能不正确，有待核实。给出一个可用的注册码：
UserName: PcRocker
Number : 240-479-245

标 题:这里是注册程序（TC2.0) (1千字)
发信人:pcrocker
时 间:2001-2-10 8:45:27
详细信息:

 这里是注册程序：

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void main( void )
{
char  cName[ 50 ], *p = cName;
int    nUser = 0, nCodeOdd=0,nCodeEven=0,nTemp,i,nOutPut[10];
printf( "\n TafWeb Software----PageBuilder 3.0c1 (c) by PcRocker.\n\nEnter
    your name: " );

scanf("%s",&cName);

nTemp=0;
while( *p!=0 ) {
nUser+= (int) *p++;
nTemp++;
}
p--;
nUser-= (int) *p;     /* to adjust the sum
    of UserName */
nUser-= 30*nTemp;  /* also
                      */
nUser+=657;
      /* for page builder 3.0c1,it's a static value    */
printf("%x\n",nUser);
for(nCodeEven=nUser*2; nCodeEven<9999; nCodeEven++)
{
nTemp=nCodeEven-nUser;
nTemp/=13;
if( nTemp<148 )
continue;
else
{
nTemp*= 7;
break;
}
}

nCodeOdd=nTemp+(nCodeEven-nUser)%13;
nCodeOdd+=1036;      /* 7 and 148
      */
nCodeEven+=1924;    /* 13 and 148  */
printf("\nYour registration code is:\t");

for( i=0; i<4; i++)
{
nTemp=nCodeOdd%10;
nOutPut[6-2*i]=nTemp;
nCodeOdd-=nTemp;
nCodeOdd/=10;

nTemp=nCodeEven%10;
nOutPut[2*i+1]=nTemp;
nCodeEven-=nTemp;
nCodeEven/=10;
}

nTemp=0;
for( i=0; i<8; i++)
{
nTemp+=nOutPut[i];
printf("%d",nOutPut[i]);
if( i%3==2)
printf("-");
}
if(nTemp>9)
nTemp=nTemp%10+nTemp/10;
printf("%1d\n",nTemp);
getch();

}


Paraben's Mah-jong v2.2

 标 题:Paraben's Mah-jong v2.2的完解。。 (1千字)
发信人:mauiboy2001
时 间:2001-5-22 19:49:53
详细信息:
目标：Paraben's Mah-jong v2.2(2D,3D)
工具：softice，w32dsm89，hiew
作者：MAUIboy2001[BCG]

做完功课后闲的无聊，找了个游戏玩玩。这个游戏是找两个相同的麻将，和街机中的一样，不过还有3D效果的。以前没钱玩，现在可以大战200
回合了。嘻。

http://www3.zdnet.com.cn/downloads2/parajong.exe

打开Paraben's Mah-jong 2D，出现对话框。点注册，下bpx hmemcpy。

拦住，pressing F12 十下，出现错误。重新来过，F12九下：

:******** push 00002872
:******** push esi
:******** call edi
:******** mov ecx,0041ED70
:******** call 004047A0
:******** mov al,byte ptr [004322F5]
:******** push 00000040
:******** cmp al,01
:******** push 0041ED70
:******** jne 00401901 --跳则死
:******** push 00440B94
:******** jmp 00401906 --成功

只要把jne--》je就成功或cmp al，01--》cmp al，00

不过看事物不能光看表面，我们去它的内核看看吧。

用w32dsm89反汇编，查找call edi。
:004018DE call edi
.
:004018E5 call 004047A0

F8进入:
:004047A0 sub esp,00000008
.
.
.(拖动滚动条，往下查看)
.
.
:00404836 cmp ecx,eax --关键的cmp
:00404838 jne 00404850
.
.
:00404841 mov byte ptr [esi+00013585],01
.
.
:0040484F ret

:00404850 mov byte ptr [esi+00013585],00
.
.
:0040485 ret

在:00404836处，? ecx既为注册码。

将:00404850处C6868535010000-->C6868535010001.

搞定。NAME:MAUIboy2001 code:404819

如果你要爆破，请将Paraben's Mah-jong 2D和Paraben's Mah-jong 3D一起改。
因为注册成功后，将在其目录下生成Mahj.key的文件，打开文件时会检验，否则死机。

真是超easy，只用了15分钟。欢迎指教，qq:349471。


pcGhost

 标 题:我破了一个小软件，但它还是存在一些问题，想请高手帮忙分析一下？请进！！！ (4千字)
发信人:1212
时 间:2001-1-7 18:43:22
详细信息:
本软件运行后可记录鼠标和键盘(包括小键盘)的动作，同时可以定时、定项记录，并控制软件运行时间、启动热键和存储文件路径等多项功能，随时可以查阅记录，并可以通过互联网发送记录文件。
1 如何启动pcGhost
运行本软件后，程序将驻留内存，时刻记录着键盘和鼠标键的一举一动。第一次运行时，在1秒钟内连按Alt+F12键两次,弹出设置窗口，可设置本软件。每一项的功能都自带说明。把鼠标放在每个项目上，1秒钟后有使用提示出现。
2 如何关闭pcGhost
按热键，弹出pcGhost的窗口，点击<终止运行>按钮。
设置“限制运行的时间”，时间一到，程序自动从内存中退出。

注册版可以保存设置。

下载：http://www.cfan.com.cn/newsoft/download/system/systemsoft/pcGhost.zip

我用W32dasm反汇编后，找到：

:00477978 50 push eax
:00477979 33C9 xor ecx, ecx
:0047797B BA787A4700 mov edx, 00477A78
:00477980 B8887A4700 mov eax, 00477A88
:00477985 E8CE90FDFF call 00450A58
:0047798A 837DFC00 cmp dword ptr [ebp-04], 00000000

:0047798E 0F8499000000 je 00477A2D 不能跳呀！
909090909090
:00477994 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]
:0047799A 8B55FC mov edx, dword ptr [ebp-04]
:0047799D B9FF000000 mov ecx, 000000FF
:004779A2 E8C1C4F8FF call 00403E68
:004779A7 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]
:004779AD E8F2C4FFFF call 00473EA4
:004779B2 84C0 test al, al

:004779B4 7477 je 00477A2D 不能跳呀！
9090
:004779B6 B201 mov dl, 01
:004779B8 8B833C030000 mov eax, dword ptr [ebx+0000033C]
:004779BE E80955FBFF call 0042CECC
:004779C3 33D2 xor edx, edx
:004779C5 8B8314030000 mov eax, dword ptr [ebx+00000314]
:004779CB E8FC54FBFF call 0042CECC
:004779D0 B201 mov dl, 01
:004779D2 8B833C040000 mov eax, dword ptr [ebx+0000043C]
:004779D8 8B08 mov ecx, dword ptr [eax]
:004779DA FF515C call [ecx+5C]
:004779DD C605A9EA470001 mov byte ptr [0047EAA9], 01
:004779E4 68A07A4700 push 00477AA0
:004779E9 8D95E8FEFFFF lea edx, dword ptr [ebp+FFFFFEE8]
:004779EF 8B45FC mov eax, dword ptr [ebp-04]
:004779F2 E82942FEFF call 0045BC20
:004779F7 8B95E8FEFFFF mov edx, dword ptr [ebp+FFFFFEE8]
:004779FD 8D85ECFEFFFF lea eax, dword ptr [ebp+FFFFFEEC]
:00477A03 E8DCD5F8FF call 00404FE4
:00477A08 8D85ECFEFFFF lea eax, dword ptr [ebp+FFFFFEEC]
:00477A0E 50 push eax
:00477A0F B9B07A4700 mov ecx, 00477AB0
:00477A14 B202 mov dl, 02
:00477A16 8B8310030000 mov eax, dword ptr [ebx+00000310]
:00477A1C E85BCDFDFF call 0045477C
:00477A21 B8D07A4700 mov eax, 00477AD0
:00477A26 E8118DFDFF call 0045073C
:00477A2B EB0A jmp 00477A37 到此成功注册

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047798E(C), :004779B4(C)
|
:00477A2D B8F47A4700 mov eax, 00477AF4
:00477A32 E8058DFDFF call 0045073C 出错框

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00477A2B(U)
|
:00477A37 33C0 xor eax, eax
:00477A39 5A pop edx
:00477A3A 59 pop ecx
:00477A3B 59 pop ecx
:00477A3C 648910 mov dword ptr fs:[eax], edx
:00477A3F 686A7A4700 push 00477A6A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00477A68(U)
|
:00477A44 8D85E8FEFFFF lea eax, dword ptr [ebp+FFFFFEE8]
:00477A4A E8BDC1F8FF call 00403C0C
:00477A4F 8D85ECFEFFFF lea eax, dword ptr [ebp+FFFFFEEC]
:00477A55 E8E6DBF8FF call 00405640
:00477A5A 8D45FC lea eax, dword ptr [ebp-04]
:00477A5D E8AAC1F8FF call 00403C0C
:00477A62 C3 ret

在修改了
:0047798E 0F8499000000 je 00477A2D
909090909090
:004779B4 7477 je 00477A2D
9090
后，运行注册成功了，并可以保存设置信息，但是当软件重新启动后仍是未注册版本，删除了保存的设置信息，还需重注册。可能它还有一个注册检测点，但我不知怎么找，请高手帮忙分析一下，我该怎么去找？我一直被此种问题所困，请高手仔细的给讲解一下此种问题（在软件重新启动时，如何去找到它的注册检测点呢？）。谢谢！！！

我的信箱：lihaitao@xaonline.com
lihaitao@public.xa.sn.cn

标 题:暴力只要改一处，但注册码比较难找。 (233字)
发信人:1212
时 间:2001-1-7 20:03:35
详细信息:

:0047400D 8A45FF mov al, byte ptr [ebp-01]

关键在上一行，只要保证al=1就行了。

可以这样改。
0047400D: 83C811 or eax,011

这样就可完全成功了。但注册码我也找不到，哪位提示一下？

标 题:呵呵 (466字)
发信人:IceFish
时 间:2001-1-7 22:07:54
详细信息:

这个注册码的形式必须为xyyy-yyyyyy
第一个字符必须是a~z之间的字母，
由“－”前面算出一个数值，与
“－”后面的比较
如果相等的话则注册成功！
具体
015F:00473F9A MOV CL,[EAX]
015F:00473F9C ADD EBX,ECX
015F:00473F9E ADD EBX,000F1DA4
015F:00473FA4 INC EAX
015F:00473FA5 DEC EDX
015F:00473FA6 JNZ 00473F98

以上是pcghost3.4的注册算法
**依次取出数值与0xF1DA4累加求和。

还不明白的话请给我写信scyb@371.net

标 题:注册机如下：） (393字)
发信人:IceFish
时 间:2001-1-7 21:52:04
详细信息:

main()
{int i;
long int sum=0;
char name[15];
printf("\n\n\n * * * * Made By sCYB[CCG],Thank you for using * * * * \n");
printf("\nPlease Enter Your Name:(a-z)\n");
gets(name);
for (i=0;i<strlen(name);i++)
sum=sum+name[i]+990628;
printf("\nYour Serial is: \n");
printf("%s-%ld",name,sum);
printf("\n\n\n * * * * Made By sCYB[CCG],Thank you for using * * * * \n");

}


PE EXPLORER 1.2

 标 题:如何完美破解PE EXPLORER 1.2 (5千字)
发信人:大老
时 间:2001-6-13 9:13:58
详细信息:
如何完美破解PE EXPLORER 1.2

PE EXPLORER 1.2是个非常不错的CRACK辅助软件
破解人： 大老
注册方式：注册码
使用限制：30天试用

这是我第二次在发表破解过程写的不好的地方请大家多提意见。好咱们来破掉它.
第一步算出它的注册码！
:004C8945 314708 xor dword ptr [edi+08], eax
:004C8948 B837B43D49 mov eax, 493DB437
:004C894D 31470C xor dword ptr [edi+0C], eax
:004C8950 8B07 mov eax, dword ptr [edi]
:004C8952 334704 xor eax, dword ptr [edi+04]
:004C8955 8B5F08 mov ebx, dword ptr [edi+08]
:004C8958 335F0C xor ebx, dword ptr [edi+0C]
:004C895B 8945F8 mov dword ptr [ebp-08], eax
:004C895E 895DF4 mov dword ptr [ebp-0C], ebx
:004C8961 61 popad
:004C8962 A1E0584E00 mov eax, dword ptr [004E58E0]
:004C8967 E874B2F3FF call 00403BE0
:004C896C 83F810 cmp eax, 00000010 《——比较注册码是否是16位
:004C896F 0F8CD1010000 jl 004C8B46
:004C8975 8D45E8 lea eax, dword ptr [ebp-18]
:004C8978 50 push eax
:004C8979 B908000000 mov ecx, 00000008
:004C897E BA01000000 mov edx, 00000001
:004C8983 A1E0584E00 mov eax, dword ptr [004E58E0]
:004C8988 E857B4F3FF call 00403DE4
:004C898D 8D45E4 lea eax, dword ptr [ebp-1C]
:004C8990 50 push eax
:004C8991 B908000000 mov ecx, 00000008
:004C8996 BA09000000 mov edx, 00000009
:004C899B A1E0584E00 mov eax, dword ptr [004E58E0]
:004C89A0 E83FB4F3FF call 00403DE4
:004C89A5 8D4DBC lea ecx, dword ptr [ebp-44]
:004C89A8 BA08000000 mov edx, 00000008
:004C89AD 8B45F8 mov eax, dword ptr [ebp-08]
:004C89B0 E87BE6F3FF call 00407030
:004C89B5 8B55BC mov edx, dword ptr [ebp-44]
:004C89B8 8B45E8 mov eax, dword ptr [ebp-18]前8位的真假注册码
:004C89BB E830B3F3FF call 00403CF0 《—比较前八位注册码
:004C89C0 0F8560010000 jne 004C8B26
:004C89C6 8D4DBC lea ecx, dword ptr [ebp-44]
:004C89C9 BA08000000 mov edx, 00000008
:004C89CE 8B45F4 mov eax, dword ptr [ebp-0C]
:004C89D1 E85AE6F3FF call 00407030
:004C89D6 8B55BC mov edx, dword ptr [ebp-44]
:004C89D9 8B45E4 mov eax, dword ptr [ebp-1C]后8位的真假注册码
:004C89DC E80FB3F3FF call 00403CF0《—比较后八位注册码
:004C89E1 0F853F010000 jne 004C8B26
:004C89E7 B8CC584E00 mov eax, 004E58CC
:004C89EC 8B15DC584E00 mov edx, dword ptr [004E58DC]
:004C89F2 E8C1AFF3FF call 004039B8
:004C89F7 B8D0584E00 mov eax, 004E58D0
:004C89FC 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004C89FF 8B55E8 mov edx, dword ptr [ebp-18]
:004C8A02 E825B2F3FF call 00403C2C
:004C8A07 B201 mov dl, 01
我的注册码是dalao/9B2B793D1EE5C68E
第二步去掉时间限制！
这个软件很奇怪！当你输入正确的注册码后将在PE EXPLORER的目录中生成一pexdata.rdat文件但是还是有时间限制！我猜这个软件的注册有两方面一个是注册码一个是网上注册然后把注册标志写到某个地方！才能完全注册去掉时间限制！不过不要紧下面中只要改半个字节即可去掉时间限制！嘿嘿!
* Possible StringData Ref from Code Obj ->"trial version"
|
:004C9235 8B15E4584E00 mov edx, dword ptr [004E58E4]
:004C923B E878A7F3FF call 004039B8
:004C9240 B8D0584E00 mov eax, 004E58D0

* Possible StringData Ref from Code Obj ->"12345678FEDCBA98"
|
:004C9245 8B15E8584E00 mov edx, dword ptr [004E58E8]
:004C924B E868A7F3FF call 004039B8
:004C9250 E8D7A1F3FF call 0040342C
:004C9255 EB20 jmp 004C9277

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C9156(C)
|
:004C9257 B8CC584E00 mov eax, 004E58CC

* Possible StringData Ref from Code Obj ->"trial version"
|
:004C925C 8B15E4584E00 mov edx, dword ptr [004E58E4]
:004C9262 E851A7F3FF call 004039B8
:004C9267 B8D0584E00 mov eax, 004E58D0

* Possible StringData Ref from Code Obj ->"12345678FEDCBA98"
|
:004C926C 8B15E8584E00 mov edx, dword ptr [004E58E8]
:004C9272 E841A7F3FF call 004039B8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004C9146(C), :004C9217(U), :004C9255(U)
|
:004C9277 8B45F0 mov eax, dword ptr [ebp-10]
:004C927A 80782401 cmp byte ptr [eax+24], 01
:004C927E 7508 jne 004C9288
:004C9280 8B45F0 mov eax, dword ptr [ebp-10]
:004C9283 E854F6FFFF call 004C88DC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C927E(C)
|
:004C9288 E8ABDDFFFF call 004C7038
:004C928D 8B45F0 mov eax, dword ptr [ebp-10]
:004C9290 80B85402000000 cmp byte ptr [eax+00000254], 00 《——关键
:004C9297 0F85B2070000 jne 004C9A4F 《——改掉它85改成84即可
:004C929D 8B45F0 mov eax, dword ptr [ebp-10]
:004C92A0 8B9834020000 mov ebx, dword ptr [eax+00000234]
:004C92A6 83C305 add ebx, 00000005
:004C92A9 8D95CCFCFFFF lea edx, dword ptr [ebp+FFFFFCCC]
收工有啥错误的地方请大家多提批评！

大老
http://dalao2001.yeah.net
2001.6.13


PolyView v3.61

 标 题:连续好几个软件破不了，找了一个简单的增强一点信心，PolyView v3.61 (2千字)
发信人:lancelot
时 间:2001-8-11 19:20:08
详细信息:
下中断bpx getwindowtexta,拦下后F12两下到这里

* Reference To: USER32.GetWindowTextA, Ord:015Eh
|
:00521DEC FF1570C55400 Call dword ptr [0054C570]
:00521DF2 8D4518 lea eax, dword ptr [ebp+18]
:00521DF5 50 push eax

F12 35下，F10若干下，到下面
----------------------------------------------------------------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00476942(U)
|
:00476949 8986E4030000 mov dword ptr [esi+000003E4], eax
:0047694F 8D442478 lea eax, dword ptr [esp+78]
:00476953 50 push eax
:00476954 8BCF mov ecx, edi
:00476956 E8D42C0A00 call 0051962F
:0047695B 8B442474 mov eax, dword ptr [esp+74]<--假注册码
:0047695F 8B0F mov ecx, dword ptr [edi]<--用户名
:00476961 50 push eax
:00476962 51 push ecx
:00476963 8986E0030000 mov dword ptr [esi+000003E0], eax
:00476969 E84222FEFF call 00458BB0<---跟进去
----------------------------------------------------------------------
* Referenced by a CALL at Addresses:
|:004088EC , :00408D8B , :00409C7A , :0046CF67 , :00472BF8
|:004736D3 , :004742CF , :004768D5 , :00476969 , :004784CB
|:004790E4 , :004794E9 , :00479598 , :0049D999 , :0049DB51
|:004BD27B , :00532D51
|
:00458BB0 64A100000000 mov eax, dword ptr fs:[00000000]

* Possible Reference to Menu: MenuID_00FF
|
:00458BB6 6AFF push FFFFFFFF
:00458BB8 68B1265400 push 005426B1
:00458BBD 50 push eax
:00458BBE 64892500000000 mov dword ptr fs:[00000000], esp
:00458BC5 81EC24010000 sub esp, 00000124
:00458BCB 53 push ebx
:00458BCC 55 push ebp
:00458BCD 56 push esi
:00458BCE 57 push edi
:00458BCF 8BBC2444010000 mov edi, dword ptr [esp+00000144]
:00458BD6 6880DF5900 push 0059DF80
:00458BDB 57 push edi
:00458BDC E87F020000 call 00458E60<--计算核心
:00458BE1 8B9C2450010000 mov ebx, dword ptr [esp+00000150]
:00458BE8 83C408 add esp, 00000008
:00458BEB 3BC3 cmp eax, ebx<--| EAX为正确的注册码
:00458BED 0F84AD000000 je 00458CA0 | EBX为假注册码
| 俱为16进制形式

至此如果跳转则注册成功

crack by lancelot 2001.8.11


PolyView3.41

标 题:PolyView再破解---请指教 (5千字)
发信人:alang
时 间:2001-1-2 4:34:03
详细信息:
PolyView再破解
---------------------------------------------------------------------
软件名称：PolyView Version 3.41
软件简介：看图工具，具有简单的图像处理功能。
软件下载：http://www.polybytes.com

破解人:阿郎
级别:处女（大笨鸟）
本人初学,如有不正确之处,请来信告知!
---------------------------------------------------------------------
前两天破了个3.00 b5版,当时俺就说了版本有些老,用来学习就没关系啦.今日撒(上)网
拉下一个3.41版,应该是最新版本吧。何不再试试身手，它升我也升，飞刀就是这样炼成的
吗？Y! 废话少说。开工>>>>

使用工具:w32dsm、UltraEdit
首先还是老办法打开PolyView在注册处添入用户名贺密码，点击确定。这时跳
出提示窗，请记住提示语。
再打开w32dsam，装入PolyView，查找错误提示语，查找结果如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00460B73(C) //注意此处
|^^^^^^^^^^

* Possible Reference to String Resource ID=00141: "Unregistered"
|
:00460C08 688D000000 push 0000008D
:00460C0D 8BCF mov ecx, edi
:00460C0F E8655D0900 call 004F6979
:00460C14 53 push ebx
:00460C15 53 push ebx

* Possible StringData Ref from Data Obj ->"Registration unsuccessful. Please "
->"verify that you have entered the "
->"information exactly as shown on "
->"your registration letter."
//错误提示处
|
:00460C16 6870755600 push 00567570
:00460C1B 899E04030000 mov dword ptr [esi+00000304], ebx
:00460C21 E8C8E10900 call 004FEDEE

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
看到00460B73(C)处了吧,老办法跳到00460B73处:

:00460B49 898608030000 mov dword ptr [esi+00000308], eax
:00460B4F 8D442478 lea eax, dword ptr [esp+78]
:00460B53 50 push eax
:00460B54 8BCF mov ecx, edi
:00460B56 E841500900 call 004F5B9C
:00460B5B 8B442474 mov eax, dword ptr [esp+74]
:00460B5F 8B0F mov ecx, dword ptr [edi]
:00460B61 50 push eax
:00460B62 51 push ecx
:00460B63 898604030000 mov dword ptr [esi+00000304], eax
:00460B69 E82265FEFF call 00447090
:00460B6E 83C408 add esp, 00000008
:00460B71 85C0 test eax, eax
:00460B73 0F848F000000 je 00460C08 //修改
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00460B79 3BEB cmp ebp, ebx
:00460B7B 0F85A5000000 jne 00460C26
:00460B81 E835560900 call 004F61BB
:00460B86 3BC3 cmp eax, ebx
:00460B88 740B je 00460B95
:00460B8A 8B10 mov edx, dword ptr [eax]
:00460B8C 8BC8 mov ecx, eax
:00460B8E FF5274 call [edx+74]
:00460B91 8BF8 mov edi, eax
:00460B93 EB02 jmp 00460B97

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
在00460B73处修改同3.00版本一样,但要吸取上次教训,万万不可拔腿走人,下面才是关键:
进入00460B69处:

* Referenced by a CALL at Addresses:
|:00407ECA , :00408408 , :0040909A , :00457ECB , :0045D20F
|:0045DBC3 , :0045E7BF , :00460AD5 , :00460B69 , :004625EB
|:00463204 , :00463609 , :004636B8 , :00483AB9 , :00483C71
|:0049FD98 , :0050F201
|
:00447090 64A100000000 mov eax, dword ptr fs:[00000000]

* Possible Reference to Menu: MenuID_00FF
|

* Possible Reference to Dialog: DialogID_011C, CONTROL_ID:00FF, ""
|
:00447096 6AFF push FFFFFFFF
:00447098 6841DE5100 push 0051DE41
:0044709D 50 push eax
:0044709E 64892500000000 mov dword ptr fs:[00000000], esp
:004470A5 81EC24010000 sub esp, 00000124
:004470AB 53 push ebx
:004470AC 55 push ebp
:004470AD 56 push esi
:004470AE 57 push edi
:004470AF 8BBC2444010000 mov edi, dword ptr [esp+00000144]
:004470B6 68780B5700 push 00570B78
:004470BB 57 push edi
:004470BC E89F020000 call 00447360
:004470C1 8B9C2450010000 mov ebx, dword ptr [esp+00000150]
:004470C8 83C408 add esp, 00000008
:004470CB 3BC3 cmp eax, ebx
:004470CD 0F84AD000000 je 00447180 //改
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Possible StringData Ref from Data Obj ->"1$1AA"
|
:004470D3 68A8565600 push 005656A8
:004470D8 57 push edi
:004470D9 E882020000 call 00447360
:004470DE 83C408 add esp, 00000008
:004470E1 3BC3 cmp eax, ebx
:004470E3 0F8497000000 je 00447180 //改
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:004470E9 8D442418 lea eax, dword ptr [esp+18]
:004470ED 50 push eax
:004470EE E8EC6D0A00 call 004EDEDF
:004470F3 8B08 mov ecx, dword ptr [eax]
:004470F5 33F6 xor esi, esi
:004470F7 894C2424 mov dword ptr [esp+24], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

看到004470CD和004470E3两处了?着两处检测之后写入注册表(不知俺说的对不对,若是说
的不对请告诉案,谢谢!)所以一定要将 je 改成 jmp
这回退出试试,输入你的中文姓名、数字号，再看看关于项。如何？你的大名是不是在上面。
ok，收工>>>>

阿郎
langlirong@163.net
http://alang.shangdu.net


popfix1.07

 标 题:不知道谁能把它算法说一下? (17千字)
发信人:peterchen
时 间:2001-5-10 18:09:41
详细信息:
只会暴力破解它,不知道哪位能追出密码或把算码过程分析一下?
破解人:PeterChen
名称:popfix.zip
URL:http://software.wx88.net/down/popfix.zip
大小: 1023KB
完成时间:Tue May 08 20:32:55 2001
引用页:
注释:软件名称：Popfix
整理日期：2001.1.1
最新版本：1.07
文件大小：1023KB
软件授权：共享软件
使用平台：Win95/98/NT
发布公司：Home Page
软件简介：
    Popfix是一个可以用来清除wav声音文件爆音、杂音的工具，大多数抓好的音轨或录音储存成wav的声音文件大都会有爆音、杂音出现，如果你的音效卡好一点的话是可以听出来的。现在你可以在将wav声音文件转成MP3时先使用Popfix将爆音、杂音清除，而Popfix在处理将wav声音文件爆音、杂音清除时的速度亦相当快，经由Popfix将wav声音文件爆音、杂音清除后所转好的MP3声音品质可以提升不少。

:00409025 B91C824900 mov ecx, 0049821C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409023(U)
|
:0040902A 8BF9 mov edi, ecx
:0040902C 33C0 xor eax, eax
:0040902E 56 push esi
:0040902F 83C9FF or ecx, FFFFFFFF===>4294967295与ecx做或运算
:00409032 F2 repnz
:00409033 AE scasb
:00409034 F7D1 not ecx
:00409036 2BF9 sub edi, ecx---> edi=edi-ecx
:00409038 8DB578FEFFFF lea esi, dword ptr [ebp+FFFFFE78]
:0040903E 87F7 xchg edi, esi--->将edi与esi的值互换
:00409040 8BD1 mov edx, ecx
:00409042 8BC7 mov eax, edi
:00409044 C1E902 shr ecx, 02----->ecx的值逻辑右移两位
:00409047 8D45EC lea eax, dword ptr [ebp-14]
:0040904A F3 repz
:0040904B A5 movsd
:0040904C 8BCA mov ecx, edx
:0040904E BA02000000 mov edx, 00000002
:00409053 83E103 and ecx, 00000003--->ecx=ecx+3
:00409056 F3 repz
:00409057 A4 movsb
:00409058 5E pop esi
:00409059 FF4DB0 dec [ebp-50]
:0040905C E8A3AA0800 call 00493B04
:00409061 8D8578FEFFFF lea eax, dword ptr [ebp+FFFFFE78]
:00409067 E81C370700 call 0047C788
:0040906C 33FF xor edi, edi//----->异或，以前不明白现在查汇编手册！
:0040906E 8D9D78FEFFFF lea ebx, dword ptr [ebp+FFFFFE78] 现知道了当两个值相同就为0！
:00409074 EB18 jmp 0040908E 也就是我们常说的清零！

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040909D(C)
|
:00409076 0FBE03 movsx eax, byte ptr [ebx]\将ebx值输进eax
:00409079 83F831 cmp eax, 00000031 |eax值与31h=49d=字符1
:0040907C 7503 jne 00409081 /
:0040907E C60349 mov byte ptr [ebx], 49----? 是不是最后结果了?
算密码时要49h=73d=I
算要时是要十六进制值还是字串I?
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040907C(C)
|
:00409081 0FBE13 movsx edx, byte ptr [ebx]
:00409084 83FA30 cmp edx, 00000030 30h=48d=0
:00409087 7503 jne 0040908C
:00409089 C6034F mov byte ptr [ebx], 4F 4fh=79d=o

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409087(C)
|
:0040908C 47 inc edi edi=edi+1
:0040908D 43 inc ebx ebx=ebx+1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409074(U)
|
:0040908E 8D8D78FEFFFF lea ecx, dword ptr [ebp+FFFFFE78]
:00409094 51 push ecx
:00409095 E882BF0700 call 0048501C
:0040909A 59 pop ecx
:0040909B 3BF8 cmp edi, eax
:0040909D 7CD7 jl 00409076
:0040909F 8D8578FEFFFF lea eax, dword ptr [ebp+FFFFFE78]
:004090A5 8B5590 mov edx, dword ptr [ebp-70]
:004090A8 83C208 add edx, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004090CD(C)
|
:004090AB 8A08 mov cl, byte ptr [eax]
:004090AD 3A0A cmp cl, byte ptr [edx]
:004090AF 0F858F020000 jne 00409344//-------->(1) je->84
:004090B5 84C9 test cl, cl
:004090B7 7416 je 004090CF
:004090B9 8A4801 mov cl, byte ptr [eax+01]
:004090BC 3A4A01 cmp cl, byte ptr [edx+01]
:004090BF 0F857F020000 jne 00409344//-------->(2) je->84
:004090C5 83C002 add eax, 00000002 eax=eax+2h
:004090C8 83C202 add edx, 00000002 edx=edx+2h
:004090CB 84C9 test cl, cl
:004090CD 75DC jne 004090AB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004090B7(C)
|
:004090CF 0F856F020000 jne 00409344
:004090D5 6804010000 push 00000104
:004090DA 8D858CFEFFFF lea eax, dword ptr [ebp+FFFFFE8C]
:004090E0 50 push eax

* Reference To: KERNEL32.GetWindowsDirectoryA, Ord:0000h
|
:004090E1 E86AB10800 Call 00494250
:004090E6 8D9554FEFFFF lea edx, dword ptr [ebp+FFFFFE54]
:004090EC 52 push edx
:004090ED 8D8D8CFEFFFF lea ecx, dword ptr [ebp+FFFFFE8C]
:004090F3 51 push ecx
:004090F4 E85BD80700 call 00486954
:004090F9 66C745A42C00 mov [ebp-5C], 002C
:004090FF 83C408 add esp, 00000008

* Possible StringData Ref from Data Obj ->"Software\VKN Electronics\Popfix"
|
:00409102 BA1D824900 mov edx, 0049821D
:00409107 8D45E8 lea eax, dword ptr [ebp-18]
:0040910A E8F1A80800 call 00493A00
:0040910F FF45B0 inc [ebp-50]
:00409112 8B08 mov ecx, dword ptr [eax]
:00409114 B201 mov dl, 01
:00409116 A1CC644200 mov eax, dword ptr [004264CC]
:0040911B E884E30100 call 004274A4
:00409120 8BD8 mov ebx, eax
:00409122 FF4DB0 dec [ebp-50]
:00409125 8D45E8 lea eax, dword ptr [ebp-18]
:00409128 BA02000000 mov edx, 00000002
:0040912D E8D2A90800 call 00493B04
:00409132 33C9 xor ecx, ecx
:00409134 894DDC mov dword ptr [ebp-24], ecx
:00409137 8D55DC lea edx, dword ptr [ebp-24]
:0040913A FF45B0 inc [ebp-50]
:0040913D 8B86D0020000 mov eax, dword ptr [esi+000002D0]
:00409143 E804930400 call 0045244C
:00409148 8D4DDC lea ecx, dword ptr [ebp-24]
:0040914B 8B01 mov eax, dword ptr [ecx]
:0040914D 50 push eax

* Possible StringData Ref from Data Obj ->"First Name"
|
:0040914E BA4A824900 mov edx, 0049824A
:00409153 8D45E0 lea eax, dword ptr [ebp-20]
:00409156 E8A5A80800 call 00493A00
:0040915B FF45B0 inc [ebp-50]
:0040915E 8B10 mov edx, dword ptr [eax]
:00409160 8D45E4 lea eax, dword ptr [ebp-1C]
:00409163 52 push edx

* Possible StringData Ref from Data Obj ->"Registration"
|
:00409164 BA3D824900 mov edx, 0049823D
:00409169 66C745A43800 mov [ebp-5C], 0038
:0040916F E88CA80800 call 00493A00
:00409174 FF45B0 inc [ebp-50]
:00409177 8B10 mov edx, dword ptr [eax]
:00409179 8BC3 mov eax, ebx
:0040917B 59 pop ecx
:0040917C E83FE40100 call 004275C0
:00409181 FF4DB0 dec [ebp-50]
:00409184 8D45DC lea eax, dword ptr [ebp-24]
:00409187 BA02000000 mov edx, 00000002
:0040918C E873A90800 call 00493B04
:00409191 FF4DB0 dec [ebp-50]
:00409194 8D45E0 lea eax, dword ptr [ebp-20]
:00409197 BA02000000 mov edx, 00000002
:0040919C E863A90800 call 00493B04
:004091A1 FF4DB0 dec [ebp-50]
:004091A4 8D45E4 lea eax, dword ptr [ebp-1C]
:004091A7 BA02000000 mov edx, 00000002
:004091AC E853A90800 call 00493B04
:004091B1 33C9 xor ecx, ecx
:004091B3 894DD0 mov dword ptr [ebp-30], ecx
:004091B6 8D55D0 lea edx, dword ptr [ebp-30]
:004091B9 FF45B0 inc [ebp-50]
:004091BC 8B86D8020000 mov eax, dword ptr [esi+000002D8]
:004091C2 E885920400 call 0045244C
:004091C7 8D4DD0 lea ecx, dword ptr [ebp-30]
:004091CA 8B01 mov eax, dword ptr [ecx]
:004091CC 50 push eax

* Possible StringData Ref from Data Obj ->"Last Name"
|
:004091CD BA62824900 mov edx, 00498262
:004091D2 8D45D4 lea eax, dword ptr [ebp-2C]
:004091D5 E826A80800 call 00493A00
:004091DA FF45B0 inc [ebp-50]
:004091DD 8B10 mov edx, dword ptr [eax]
:004091DF 8D45D8 lea eax, dword ptr [ebp-28]
:004091E2 52 push edx

* Possible StringData Ref from Data Obj ->"Registration"
|
:004091E3 BA55824900 mov edx, 00498255
:004091E8 66C745A44400 mov [ebp-5C], 0044
:004091EE E80DA80800 call 00493A00
:004091F3 FF45B0 inc [ebp-50]
:004091F6 8B10 mov edx, dword ptr [eax]
:004091F8 8BC3 mov eax, ebx
:004091FA 59 pop ecx
:004091FB E8C0E30100 call 004275C0
:00409200 FF4DB0 dec [ebp-50]
:00409203 8D45D0 lea eax, dword ptr [ebp-30]
:00409206 BA02000000 mov edx, 00000002
:0040920B E8F4A80800 call 00493B04
:00409210 FF4DB0 dec [ebp-50]
:00409213 8D45D4 lea eax, dword ptr [ebp-2C]
:00409216 BA02000000 mov edx, 00000002
:0040921B E8E4A80800 call 00493B04
:00409220 FF4DB0 dec [ebp-50]
:00409223 8D45D8 lea eax, dword ptr [ebp-28]
:00409226 BA02000000 mov edx, 00000002
:0040922B E8D4A80800 call 00493B04
:00409230 8B4D90 mov ecx, dword ptr [ebp-70]
:00409233 8B4104 mov eax, dword ptr [ecx+04]
:00409236 038572FEFFFF add eax, dword ptr [ebp+FFFFFE72]
:0040923C 50 push eax

* Possible StringData Ref from Data Obj ->"Code"
|
:0040923D BA79824900 mov edx, 00498279
:00409242 8D45C8 lea eax, dword ptr [ebp-38]
:00409245 E8B6A70800 call 00493A00
:0040924A FF45B0 inc [ebp-50]
:0040924D 8B10 mov edx, dword ptr [eax]
:0040924F 8D45CC lea eax, dword ptr [ebp-34]
:00409252 52 push edx

* Possible StringData Ref from Data Obj ->"Registration"
|
:00409253 BA6C824900 mov edx, 0049826C
:00409258 66C745A45000 mov [ebp-5C], 0050
:0040925E E89DA70800 call 00493A00
:00409263 FF45B0 inc [ebp-50]
:00409266 8B10 mov edx, dword ptr [eax]
:00409268 8BC3 mov eax, ebx
:0040926A 59 pop ecx
:0040926B E800E50100 call 00427770
:00409270 FF4DB0 dec [ebp-50]
:00409273 8D45C8 lea eax, dword ptr [ebp-38]
:00409276 BA02000000 mov edx, 00000002
:0040927B E884A80800 call 00493B04
:00409280 FF4DB0 dec [ebp-50]
:00409283 8D45CC lea eax, dword ptr [ebp-34]
:00409286 BA02000000 mov edx, 00000002
:0040928B E874A80800 call 00493B04
:00409290 8B4D90 mov ecx, dword ptr [ebp-70]
:00409293 8B01 mov eax, dword ptr [ecx]
:00409295 038572FEFFFF add eax, dword ptr [ebp+FFFFFE72]
:0040929B 50 push eax

* Possible StringData Ref from Data Obj ->"Key"
|
:0040929C BA8B824900 mov edx, 0049828B
:004092A1 8D45C0 lea eax, dword ptr [ebp-40]
:004092A4 E857A70800 call 00493A00
:004092A9 FF45B0 inc [ebp-50]
:004092AC 8B10 mov edx, dword ptr [eax]
:004092AE 8D45C4 lea eax, dword ptr [ebp-3C]
:004092B1 52 push edx

* Possible StringData Ref from Data Obj ->"Registration"
|
:004092B2 BA7E824900 mov edx, 0049827E
:004092B7 66C745A45C00 mov [ebp-5C], 005C
:004092BD E83EA70800 call 00493A00
:004092C2 FF45B0 inc [ebp-50]
:004092C5 8B10 mov edx, dword ptr [eax]
:004092C7 8BC3 mov eax, ebx
:004092C9 59 pop ecx
:004092CA E8A1E40100 call 00427770
:004092CF FF4DB0 dec [ebp-50]
:004092D2 8D45C0 lea eax, dword ptr [ebp-40]
:004092D5 BA02000000 mov edx, 00000002
:004092DA E825A80800 call 00493B04
:004092DF FF4DB0 dec [ebp-50]
:004092E2 8D45C4 lea eax, dword ptr [ebp-3C]
:004092E5 BA02000000 mov edx, 00000002
:004092EA E815A80800 call 00493B04
:004092EF A16CF94900 mov eax, dword ptr [0049F96C]
:004092F4 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Popfix"
|
:004092F6 B9D4824900 mov ecx, 004982D4

* Possible StringData Ref from Data Obj ->"Your registration was successful.
Thank "
->"you for registering Popfix."
|
:004092FB BA8F824900 mov edx, 0049828F
:00409300 8B00 mov eax, dword ptr [eax]
:00409302 E84DA60800 call 00493954
:00409307 8BFB mov edi, ebx
:00409309 897DB8 mov dword ptr [ebp-48], edi
:0040930C 85FF test edi, edi
:0040930E 741E je 0040932E
:00409310 8B07 mov eax, dword ptr [edi]
:00409312 8945BC mov dword ptr [ebp-44], eax
:00409315 66C745A47400 mov [ebp-5C], 0074
:0040931B BA03000000 mov edx, 00000003
:00409320 8B45B8 mov eax, dword ptr [ebp-48]
:00409323 8B08 mov ecx, dword ptr [eax]
:00409325 FF51FC call [ecx-04]
:00409328 66C745A46800 mov [ebp-5C], 0068

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040930E(C)
|
:0040932E C7862C02000001000000 mov dword ptr [esi+0000022C], 00000001
:00409338 8B5594 mov edx, dword ptr [ebp-6C]
:0040933B 64891500000000 mov dword ptr fs:[00000000], edx
:00409342 EB22 jmp 00409366

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00408F79(C), :004090AF(C), :004090BF(C), :004090CF(C)
|
:00409344 A16CF94900 mov eax, dword ptr [0049F96C]
:00409349 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Popfix"
|
:0040934B B91A834900 mov ecx, 0049831A

* Possible StringData Ref from Data Obj ->"Sorry, that registration code "
->"is not valid.
Please try again."
|
:00409350 BADB824900 mov edx, 004982DB
:00409355 8B00

标 题:大概讲一下，不敢保证全对！还请高手指教！如果哪位可以写出注册机，希望贴出来，大家研究研究！ (4千字)
发信人:小球[CCG]
时 间:2001-5-11 14:59:31
详细信息:

大概讲一下，不敢保证全对！还请高手指教！如果哪位可以写出注册机，希望贴出来，大家研究研究！
首先输入如下信息：First name:abcd
Last name:efghi
Registeration code:1234567890(任意)

:00409659 8D8530FFFFFF lea eax, dword ptr [ebp+FFFFFF30]
:0040965F E824310700 call 0047C788 **小写转大写
:00409664 33F6 xor esi, esi
:00409666 8D9D30FFFFFF lea ebx, dword ptr [ebp+FFFFFF30]
:0040966C EB24 jmp 00409692

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004096A1(C)
|
:0040966E 0FBE03 movsx eax, byte ptr [ebx] ***这里是真正开始对你的信息进行计算！
:00409671 99 cdq
:00409672 52 push edx
:00409673 50 push eax
:00409674 8B45F8 mov eax, dword ptr [ebp-08]
:00409677 8B55FC mov edx, dword ptr [ebp-04]
:0040967A E8512B0800 call 0048C1D0 **这里就是了！按F8进入
:0040967F 8945F8 mov dword ptr [ebp-08], eax
:00409682 8955FC mov dword ptr [ebp-04], edx
:00409685 0FBE4301 movsx eax, byte ptr [ebx+01]
:00409689 99 cdq
:0040968A 0145F8 add dword ptr [ebp-08], eax
:0040968D 1155FC adc dword ptr [ebp-04], edx
:00409690 46 inc esi
:00409691 43 inc ebx
:00409692 8D8D30FFFFFF lea ecx, dword ptr [ebp+FFFFFF30]
:00409698 51 push ecx
:00409699 E87EB90700 call 0048501C **计算需要循环的次数，如果没有错的话应该是你first name+last name的长度。
:0040969E 59 pop ecx
:0040969F 3BF0 cmp esi, eax
:004096A1 7CCB jl 0040966E
计算开始：
* Referenced by a CALL at Addresses:
|:0040967A , :004889FC
:0048C1D0 52 push edx
:0048C1D1 50 push eax
:0048C1D2 8B442410 mov eax, dword ptr [esp+10]
:0048C1D6 F72424 mul dword ptr [esp]
:0048C1D9 8BC8 mov ecx, eax
:0048C1DB 8B442404 mov eax, dword ptr [esp+04]
:0048C1DF F764240C mul [esp+0C]
:0048C1E3 03C8 add ecx, eax
:0048C1E5 8B0424 mov eax, dword ptr [esp]
:0048C1E8 F764240C mul [esp+0C]
:0048C1EC 03D1 add edx, ecx
:0048C1EE 59 pop ecx
:0048C1EF 59 pop ecx
:0048C1F0 C20800 ret 0008

对其算法看了一下，也没太看懂，大概过程如下：
如果输入abcd，公式是X=((((a+a)*a+b)*b+c)*c+d)*d,然后对last name计算，这部分好像也是一个公式。
得初的数被24(十六进制)除，余数小于A的加上30，大于的加上F6。如下程序所示：
|:0048C992(C)
|
:0048C976 4B dec ebx
:0048C977 8A03 mov al, byte ptr [ebx]
:0048C979 3C0A cmp al, 0A **比较余数
:0048C97B 7D08 jge 0048C985
:0048C97D 83C030 add eax, 00000030 **变成数字
:0048C980 8806 mov byte ptr [esi], al **当然了这里就是存放注册码的位置了！呵呵....被发现了！
:0048C982 46 inc esi
:0048C983 EB08 jmp 0048C98D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048C97B(C)
|
:0048C985 02451C add al, byte ptr [ebp+1C]
:0048C988 04F6 add al, F6
:0048C98A 8806 mov byte ptr [esi], al
:0048C98C 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048C974(U), :0048C983(U)
|
:0048C98D 8D55BC lea edx, dword ptr [ebp-44]
:0048C990 3BDA cmp ebx, edx
:0048C992 75E2 jne 0048C976 **小循环

注意了！程序中有两处这样的程序段，一个是验证我们输入的注册信息是否正确的，一个就是下一次启动时对注册表中的信息进行确定的程序段！键值HKEY_CURRENT_USER\Software\VKN Electronics\Popfix\Registration
好了！谁来写个注册机？在49fdf4处可以看到注册码
我的注册信息：
First name: 小球[CCG]
Last name:china crack group
Registeration code:EIV55OQ5R4ZK


post NOW!

标 题:post NOW! 破解过程！有意思。 (1千字)
发信人:coolfly
时 间:2000-12-30 12:12:20
详细信息:
破解软件：Post NOW! 1.0 Beta 2 build 1219
软件URL：http://soft.km169.net/soft/wlgj/postnow1219.zip
软件大小：643218 bytes

说明：该软件是个论坛发表软件，其刚开始未注册画面特烦人，那就注册啦！
呼出TRW，运用'79'大法，二拦后在此停下=》
15F:0040A601 TEST EAX,EAX
...
15F:0040A61F CMP EAX,BYTE +0C
15F:0040A622 JNZ NEAR 40A830 =>如果输入注册码不等于12位则注册不成功！
重新输入12位的注册码'797979797979'
...
15F:0040A6A9 MOV ESI,06
15F:0040A6AE XOR EAX,EAX
15F:0040A6B0 MOV DL,[ESP+EAX+29]
15F:0040A6B4 MOV CL,[ESP+EAX+28]
15F:0040A6B8 MOV [ESP+EAX+28],DL
15F:0040A6BC MOV [ESP+EAX+29],CL
15F:0040A6C0 INC EAX
15F:0040A6C1 CMP EAX,BYTE +06
15F:0040A6C4 JL 0040A6B0
15F:0040A6C6 DEC ESI
15F:0040A6C7 JNZ 0040A6AE
...
此段循环程序很有意思，如果你不耐烦，可以将光标移到下一栏，按F9，F5后跳过。
15F:0040A6E4 MOV BL,[ESP+EAX+228]
15F:0040A6EB ADD DL,BL
15F:0040A6ED INC EAX
15F:0040A6EE CMP EAX,ECX
15F:0040A6F0 JL 0040A6E4 =>将coolfly的ASCII串累加到DL中
...（如果你要做注册机的话，这段程序是关键）我们这里略过！
15F:0040A76B JL 0040A70A
在此下命令：D ESP+328 ，看到注册码是：aecb8787948d
还不赶快拿笔抄下来，OK，退出程序，输入刚刚看到的注册码，按确定后：
得到的还是注册失败框，嗯？？这时就要看看上面提到的那段有意思的程式了。
对，上面程式的作用是将注册码的第七位移到第一位，所以我们要做的是：
aecb8787948d =》 ecb878a7948d （反推而得）
这也是这个程式比较有意思的地方哦。

[结论]
注册名：coolfly
注册码：ecb878a7948d

欢迎光临破解交流网: http://coolfly.126.com
破解花费10分钟，5分钟整理！
2000年12月30日 1:15


PSXVIDEO Ver1.12

标 题:注册PSXVIDEO Ver1.12详细算法 (14千字)
发信人:zombieys
时 间:2001-4-11 20:22:18
详细信息:
注册PSXVIDEO Ver1.12详细算法

软件名称：PSXVIDEO Ver1.12
软件下载：等我汉化完传到HTTP://ZOMBIEYS.126.COM去
主要功能：PSXVIDEO 是一个能将 PS 游戏 CD-ROM 上的动画档案转换成 PC 平台能播放的
AVI 档案的一个转档程式, 是由一位日本人 tany 先生所写, 目前为最新版v1.12
已经可以将大部分的 PS 游戏动画转出, 几乎没有转不出的动画

PSXVIDEO v1.07由tany先生於97/10/20完成 , 增加了 FF7 的检查选项,以及一
些细部的修正等.
主要目的：寻找合适的注册码
破解难度：非常简单(适合初学者)

正规方法：选注册填自己的大名，注册码填78787878,进s-ice下s 30:0 l ffffffff '78787878',下bpm "搜到的地址",按f5返回,点注册被拦到，按几次f12知道进入PSXVIDEO领空，再按几次f10到这里

* Possible Reference to Dialog: REGIST, CONTROL_ID:03F7, ""
|
:004099FA 68F7030000 push 000003F7
:004099FF 56 push esi
:00409A00 FFD7 call edi
:00409A02 8D4C240C lea ecx, dword ptr [esp+0C]
:00409A06 51 push ecx
:00409A07 E844B6FFFF call 00405050 //算KEY的CALL
:00409A0C 83C404 add esp, 00000004
:00409A0F 85C0 test eax, eax
:00409A11 740E je 00409A21 //跳下去就成功了
:00409A13 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"ERROR"
|
:00409A15 68E0514100 push 004151E0

* Possible StringData Ref from Data Obj ->"Password Error."
|
:00409A1A 689C664100 push 0041669C
:00409A1F EB18 jmp 00409A39 //骗子-_-(TANY语)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409A11(C)
|
:00409A21 C7056C9C450001000000 mov dword ptr [00459C6C], 00000001 //成功了，没被抓到^Q^
:00409A2B EB0F jmp 00409A3C

我们来看看它怎码算的KEY吧@_@，还好了很短，也很简单:)

:00405050 81EC08010000 sub esp, 00000108 //准备抓骗子(TANY语)
:00405056 53 push ebx
:00405057 55 push ebp
:00405058 56 push esi
:00405059 57 push edi
:0040505A 8BBC241C010000 mov edi, dword ptr [esp+0000011C] //取你输的注册码->EDI
:00405061 33D2 xor edx, edx //准备了:)
:00405063 BE1A000000 mov esi, 0000001A //做除数用
:00405068 BD1A000000 mov ebp, 0000001A //做除数用
:0040506D 0FBE4F04 movsx ecx, byte ptr [edi+04] //注册码第5位->ECX
:00405071 F7D1 not ecx //取反->ECX
:00405073 8A1F mov bl, byte ptr [edi] //注册码第1位->BL
:00405075 8D414F lea eax, dword ptr [ecx+4F] //(第5位取反结果+4F)的地址->EAX
:00405078 83F050 xor eax, 00000050 //拿它与50做异或->EAX
:0040507B F7F6 div esi //接着用EAX整除1A,余数在EDX
:0040507D 0FBEF3 movsx esi, bl //注册码第1位->ESI
:00405080 F7D6 not esi //取反->ESI
:00405082 8D4645 lea eax, dword ptr [esi+45] //(第1位取反结果+45)的地址->EAX
:00405085 83F053 xor eax, 00000053 //那它与53做异或->EAX
:00405088 80C241 add dl, 41 //余数变成1个大写字母?->DL
:0040508B 88542419 mov byte ptr [esp+19], dl //好了,这是真注册码的第2位->[ESP+19]
:0040508F 33D2 xor edx, edx //再来
:00405091 F7F5 div ebp //用EAX(上次整除的商)整除1A,余数放在EDX里
:00405093 8D4144 lea eax, dword ptr [ecx+44] //(第5位取反结果+44)地址->EAX
:00405096 83F058 xor eax, 00000058 //拿它与58做异或->EAX
:00405099 80C241 add dl, 41 //余数变成1个大写字母?->DL
:0040509C 8854241A mov byte ptr [esp+1A], dl //作为真注册码的第3位->[ESP+1A]
:004050A0 33D2 xor edx, edx //GOGOGO(TANY语) YUN~~(我)
:004050A2 F7F5 div ebp //用EAX整除1A,余数放EDX
:004050A4 8D4659 lea eax, dword ptr [esi+59] //(注册码第1位取反结果+59)的地址->EAX
:004050A7 83F056 xor eax, 00000056 //拿它与56做异或->EAX
:004050AA 80C241 add dl, 41 //余数变成1个大写字母?
:004050AD 8854241B mov byte ptr [esp+1B], dl //作为真注册码的第4位->[ESP+1B]
:004050B1 33D2 xor edx, edx //GOGOGO(TANY语) ......(我)
:004050B3 F7F5 div ebp //用EAX(上次整除的商)整除1A,余数放在EDX里
:004050B5 8D4156 lea eax, dword ptr [ecx+56] //(第5位取反结果+56)的地址->EAX
:004050B8 83F049 xor eax, 00000049 //拿它与49做异或->EAX
:004050BB 80C241 add dl, 41 //余数变成1个大写字母?
:004050BE 8854241D mov byte ptr [esp+1D], dl //作为真注册码的第6位->[ESP+1D]
:004050C2 33D2 xor edx, edx //晕死你(TANY语) -_-|(我)
:004050C4 F7F5 div ebp //用EAX(上次整除的商)整除1A,余数放在EDX里
:004050C6 8D4658 lea eax, dword ptr [esi+58] //(注册码第1位取反结果+58)的地址-EAX
:004050C9 83F044 xor eax, 00000044 //拿它与44做异或->EAX
:004050CC 80C241 add dl, 41 //余数变成1个大写字母?
:004050CF 8854241E mov byte ptr [esp+1E], dl //作为真注册码的第7位->[ESP+1E]
:004050D3 33D2 xor edx, edx //...... ......
:004050D5 F7F5 div ebp //用EAX整除1A,余数放EDX
:004050D7 8D4153 lea eax, dword ptr [ecx+53] //(第5位取反结果+53)的地址->EAX
:004050DA 8BCD mov ecx, ebp //1A->ECX
:004050DC 83F045 xor eax, 00000045 //EAX(商)与45做异或->EAX
:004050DF 80C241 add dl, 41 //余数变成1个大写字母?
:004050E2 8854241F mov byte ptr [esp+1F], dl //作为真注册码的第8位->[ESP+1F]
:004050E6 33D2 xor edx, edx //:) :(
:004050E8 F7F1 div ecx //用EAX整除1A,余数放EDX
:004050EA 8D4650 lea eax, dword ptr [esi+50] //(注册码第1位取反结果+50)的地址->EAX
:004050ED 8BF5 mov esi, ebp //1A->ESI
:004050EF 83F04F xor eax, 0000004F //EAX(商)与4F做异或->EAX
:004050F2 8BCA mov ecx, edx //余数->ECX
:004050F4 33D2 xor edx, edx //EDX清0
:004050F6 F7F6 div esi //EAX(商)整除1A,余数放EDX
:004050F8 80C141 add cl, 41 //真注册码的第9位->CL
:004050FB 80C241 add dl, 41 //真注册码的第10位->DL
:004050FE 80FB41 cmp bl, 41 //注册码第1位在A-Z之间?
:00405101 0F8CFD000000 jl 00405204
:00405107 80FB5A cmp bl, 5A
:0040510A 0F8FF4000000 jg 00405204
:00405110 8A5F01 mov bl, byte ptr [edi+01] //注册码第2位->BL且在A-Z之间?
:00405113 80FB41 cmp bl, 41
:00405116 0F8CE8000000 jl 00405204
:0040511C 80FB5A cmp bl, 5A
:0040511F 0F8FDF000000 jg 00405204
:00405125 8A4702 mov al, byte ptr [edi+02] //注册码第3位在A-Z之间?
:00405128 3C41 cmp al, 41
:0040512A 88442413 mov byte ptr [esp+13], al
:0040512E 0F8CD0000000 jl 00405204
:00405134 3C5A cmp al, 5A
:00405136 0F8FC8000000 jg 00405204
:0040513C 8A4703 mov al, byte ptr [edi+03] //注册码第4位在A-Z之间?
:0040513F 3C41 cmp al, 41
:00405141 88442417 mov byte ptr [esp+17], al
:00405145 0F8CB9000000 jl 00405204
:0040514B 3C5A cmp al, 5A
:0040514D 0F8FB1000000 jg 00405204
:00405153 8A4704 mov al, byte ptr [edi+04] //注册码第5位在A-Z之间?
:00405156 3C41 cmp al, 41
:00405158 0F8CA6000000 jl 00405204
:0040515E 3C5A cmp al, 5A
:00405160 0F8F9E000000 jg 00405204
:00405166 8A4705 mov al, byte ptr [edi+05] //注册码第6位在A-Z之间?
:00405169 3C41 cmp al, 41
:0040516B 88442415 mov byte ptr [esp+15], al
:0040516F 0F8C8F000000 jl 00405204
:00405175 3C5A cmp al, 5A
:00405177 0F8F87000000 jg 00405204
:0040517D 8A4706 mov al, byte ptr [edi+06] //注册码第7位在A-Z之间?
:00405180 3C41 cmp al, 41
:00405182 88442412 mov byte ptr [esp+12], al
:00405186 7C7C jl 00405204
:00405188 3C5A cmp al, 5A
:0040518A 7F78 jg 00405204
:0040518C 8A4707 mov al, byte ptr [edi+07] //注册码第8位在A-Z之间?
:0040518F 3C41 cmp al, 41
:00405191 88442414 mov byte ptr [esp+14], al
:00405195 7C6D jl 00405204
:00405197 3C5A cmp al, 5A
:00405199 7F69 jg 00405204
:0040519B 8A4708 mov al, byte ptr [edi+08] //注册码第9位在A-Z之间?
:0040519E 3C41 cmp al, 41
:004051A0 88442416 mov byte ptr [esp+16], al
:004051A4 7C5E jl 00405204
:004051A6 3C5A cmp al, 5A
:004051A8 7F5A jg 00405204
:004051AA 8A4709 mov al, byte ptr [edi+09] //注册码第10位->AL且在A-Z之间?
:004051AD 3C41 cmp al, 41
:004051AF 7C53 jl 00405204
:004051B1 3C5A cmp al, 5A
:004051B3 7F4F jg 00405204
:004051B5 3A5C2419 cmp bl, byte ptr [esp+19] //真假注册码第2位比较
:004051B9 7549 jne 00405204
:004051BB 8A5C2413 mov bl, byte ptr [esp+13] //假注册码第3位->[ESP+13]
:004051BF 3A5C241A cmp bl, byte ptr [esp+1A] //真假注册码第3位比较
:004051C3 753F jne 00405204
:004051C5 8A5C2417 mov bl, byte ptr [esp+17] //假注册码第4位->[ESP+17]
:004051C9 3A5C241B cmp bl, byte ptr [esp+1B] //真假注册码第3位比较
:004051CD 7535 jne 00405204
:004051CF 8A5C2415 mov bl, byte ptr [esp+15] //假注册码第6位->[ESP+15]
:004051D3 3A5C241D cmp bl, byte ptr [esp+1D] //真假注册码第6位比较
:004051D7 752B jne 00405204
:004051D9 8A5C2412 mov bl, byte ptr [esp+12] //假注册码第7位->[ESP+12]
:004051DD 3A5C241E cmp bl, byte ptr [esp+1E] //真假注册码第7位比较
:004051E1 7521 jne 00405204
:004051E3 8A5C2414 mov bl, byte ptr [esp+14] //假注册码第8位->[ESP+12]
:004051E7 3A5C241F cmp bl, byte ptr [esp+1F] //真假注册码第8位比较
:004051EB 7517 jne 00405204
:004051ED 384C2416 cmp byte ptr [esp+16], cl //真假注册码第9位比较
:004051F1 7511 jne 00405204
:004051F3 3AC2 cmp al, dl //真假注册码第10位比较
:004051F5 750D jne 00405204 //想混过去没门(TANY语)
:004051F7 33C0 xor eax, eax //oo混过来了:)
:004051F9 5F pop edi
:004051FA 5E pop esi
:004051FB 5D pop ebp
:004051FC 5B pop ebx
:004051FD 81C408010000 add esp, 00000108
:00405203 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00405101(C), :0040510A(C), :00405116(C), :0040511F(C), :0040512E(C)
|:00405136(C), :00405145(C), :0040514D(C), :00405158(C), :00405160(C)
|:0040516F(C), :00405177(C), :00405186(C), :0040518A(C), :00405195(C)
|:00405199(C), :004051A4(C), :004051A8(C), :004051AF(C), :004051B3(C)
|:004051B9(C), :004051C3(C), :004051CD(C), :004051D7(C), :004051E1(C)
|:004051EB(C), :004051F1(C), :004051F5(C)
|
:00405204 5F pop edi //晕~~~没混过来:(
:00405205 5E pop esi
:00405206 5D pop ebp
:00405207 83C8FF or eax, FFFFFFFF
:0040520A 5B pop ebx
:0040520B 81C408010000 add esp, 00000108
:00405211 C3 ret

完活-_-,这是我第一次也是最后一次写详细的了，完全是为了初学者，自己努力吧:)
这个玩艺破解用10分钟，写出来花几个小时，我晕~~~~~~

部分注册码：(用户名任意)
Name:ZOMBIE
Code:RNFKCCNNWW
Code:ALCKENLEUN

———————————————————————————————>
.-" "-. Cracked by zombieys >
/　　　　　　\ My oicq is 1789655 >
| | My hp is zombieys.yeah.net>
|, .-. .-. ,| My hp is zombieys.126.com >
|)(__/ \__)(| >
|/ /\ \| Thanks for your supports >
(@_@) (_ ^^ _) >
_ )\_______\__|IIIIII|__/_____ >
_)@8@8{}<________|-\IIIIII/-|____zombieys_____________________>


QQ图形留言器3.0

 标 题:破解QQ图形留言器3.0（不是OICQ图形留言系统)及注册机编写！！ (6千字)
发信人:TAE!
时 间:2001-7-15 17:31:12
详细信息:
目标软件：QQ图形留言器3.0（不是OICQ图形留言系统）
保护方式：注册码
破解方式：算码，做注册机
破解人 ：TAE! [CCG、BCG、FCG]

唉！现在的软件科隆、抄袭现象越来越严重了，怪不得中国的软件没多大发展，缺乏创意！
比方这个软件和OICQ图形留言系统极其相似，但是注册码算法比后者烦的多！

前面的基本步骤我就不重复了。关键的地方是。。。

下面就是程序算注册码的地方，很长的一段：

***************************************************************************
:00493169 0FB64C11FF movzx ecx, byte ptr [ecx+edx-01]
:0049316E 03D9 add ebx, ecx
:00493170 42 inc edx
:00493171 48 dec eax
:00493172 75F2 jne 00493166

*********上面是将姓名的每个字符相加再加上0x7BB。******************

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049315F(C)
|
:00493174 8BC3 mov eax, ebx
:00493176 B917180000 mov ecx, 00001817
:0049317B 99 cdq
:0049317C F7F9 idiv ecx
:0049317E 69C84A030000 imul ecx, eax, 0000034A
:00493184 81C12B020000 add ecx, 0000022B
:0049318A 8BC3 mov eax, ebx
:0049318C BB3E000000 mov ebx, 0000003E
:00493191 99 cdq
:00493192 F7FB idiv ebx
:00493194 03CA add ecx, edx
:00493196 8BD9 mov ebx, ecx
:00493198 8B45F8 mov eax, dword ptr [ebp-08]
:0049319B E8040EF7FF call 00403FA4
:004931A0 8B55F8 mov edx, dword ptr [ebp-08]
:004931A3 0FB64402FF movzx eax, byte ptr [edx+eax-01]
:004931A8 8B55F8 mov edx, dword ptr [ebp-08]
:004931AB 0FB612 movzx edx, byte ptr [edx]
:004931AE 03C2 add eax, edx
:004931B0 83C003 add eax, 00000003
:004931B3 8BD0 mov edx, eax
:004931B5 C1E003 shl eax, 03
:004931B8 2BC2 sub eax, edx
:004931BA B94F000000 mov ecx, 0000004F
:004931BF 33D2 xor edx, edx
:004931C1 F7F1 div ecx
:004931C3 8BF0 mov esi, eax
:004931C5 81C673020000 add esi, 00000273
:004931CB 8B45F8 mov eax, dword ptr [ebp-08]
:004931CE E8D10DF7FF call 00403FA4
:004931D3 6BC05D imul eax, 0000005D
:004931D6 B9B3000000 mov ecx, 000000B3
:004931DB 99 cdq
:004931DC F7F9 idiv ecx
:004931DE 8BF8 mov edi, eax
:004931E0 83C709 add edi, 00000009
:004931E3 8B45F8 mov eax, dword ptr [ebp-08]
:004931E6 E8B90DF7FF call 00403FA4
:004931EB 8BD0 mov edx, eax
:004931ED C1E007 shl eax, 07
:004931F0 2BC2 sub eax, edx
:004931F2 B931030000 mov ecx, 00000331
:004931F7 99 cdq
:004931F8 F7F9 idiv ecx
:004931FA 03FA add edi, edx
:004931FC 8D55E0 lea edx, dword ptr [ebp-20]
:004931FF 8BC3 mov eax, ebx
:00493201 E89A66F7FF call 004098A0
:00493206 FF75E0 push [ebp-20]
:00493209 8D55DC lea edx, dword ptr [ebp-24]
:0049320C 8BC6 mov eax, esi
:0049320E E88D66F7FF call 004098A0
:00493213 FF75DC push [ebp-24]
:00493216 8D55D8 lea edx, dword ptr [ebp-28]
:00493219 8BC7 mov eax, edi

***************************************************************************
*上面这段程序是分三段计算注册码，每段是3位，下面是将三段注册码连接起来形成*
*一个数，但这并没有完，最后还得减去0x00030512,就得到了正确的注册码了！ *
***************************************************************************

:0049321B E88066F7FF call 004098A0
:00493220 FF75D8 push [ebp-28]
:00493223 8D45E4 lea eax, dword ptr [ebp-1C]
:00493226 BA03000000 mov edx, 00000003
:0049322B E8340EF7FF call 00404064
:00493230 8B45E4 mov eax, dword ptr [ebp-1C]
:00493233 E89866F7FF call 004098D0
:00493238 8BD8 mov ebx, eax
:0049323A 81EB12050300 sub ebx, 00030512 //****最后的运算*****
:00493240 8D55F4 lea edx, dword ptr [ebp-0C]
:00493243 8BC3 mov eax, ebx
:00493245 E85666F7FF call 004098A0
:0049324A 8D55D4 lea edx, dword ptr [ebp-2C]
:0049324D 8B45F4 mov eax, dword ptr [ebp-0C]
:00493250 E89763F7FF call 004095EC
:00493255 8B45D4 mov eax, dword ptr [ebp-2C]
:00493258 50 push eax
:00493259 8D55D0 lea edx, dword ptr [ebp-30]
:0049325C 8B45EC mov eax, dword ptr [ebp-14]
:0049325F E88863F7FF call 004095EC
:00493264 8B55D0 mov edx, dword ptr [ebp-30]
:00493267 58 pop eax
:00493268 E8470EF7FF call 004040B4
:0049326D 7504 jne 00493273 //想办法让这里别跳喲！！
:0049326F C645FF01 mov [ebp-01], 01 //看到这个了吧？？
***************************************************************************

注册码算法：

姓名以 TAE！为例
==================================================================
前三位：
a="T"+"A"+"E"+"!"+0x7BB=0x8b6
b=a/0x1817*0x034A+0x22B
sn1=a%0x3e+b=615
==================================================================
中间三位：
"T"+"!"=0x75
sn2=((0x75+0x3)*8-0x78)/0x4f+0x273=637
==================================================================
最后三位：
姓名个数为4
c=4*0x5D/0xB3+0x9
d=(0x200-4)%0x331
sn3=c+d=519
==================================================================
将以上三组数连接得到615637519，用这个数减0x00030512即可得到注册码！
==================================================================

下面是这个软件的注册机：

#include<stdio.h>
#include<string.h>
#include<math.h>
void main()
{
char name[99];
int d=0,l=0,i=0,a=0,b=0,c=0;
long sn1=0,sn2=0,sn3=0;
long f=0,e=0,sn=0;
printf(" *********************\n *KeyGen by TAE![CCG]*\n *********************\n\n");
printf("Please input your name:");
gets(name);
l=strlen(name);
for (i=0;i<l;i++)
a+=name[i];
a+=0x7bb;
b=a/0x1817*0x034a+0x22b;
c=a%0x3e;
sn1=b+c;
sn2=((name[0]+name[l-1])*8-(name[0]+name[l-1]+3))/0x4F+0x0273;
d=l*0x5d/0xb3+0x09;
sn3=(l*0x80-l)%0x331+d;
e=sn1*1000000;
f=sn2*1000;
sn=(e+f+sn3)-197906;
printf("Your registration code:%ld\n",sn);
}

___________________ __ ______ ______ ______
/ / \_ ____/ / / / ____// ____// ____/
\_ _/ /\ \ __)_ / / / / / / / / __
| |/ __ / \ /_/ / /___ / /___ / /_/ /
|__/__/ \_______/(_) \____/ \____/ \____/


R Folder Guard 5.1STD

 标 题:R Folder Guard 5.1STD (11千字)
发信人:6767[BCG]
时 间:2001-7-2 14:08:00
详细信息:
R Folder Guard 5.1STD
by 6767 [BCG]

d/l: http://gt.onlinedown.net/down/fgstd.exe. (606k)
tools: SoftIce

它的注册检查好象不严格，所以两次莫名其妙的注册成功。好在还可以Unregister，有意思。

姓名不支持数字，长度应大于5，大小写无关。注册码长度不要小于10。

.....
* Reference To: USER32.GetDlgItem, Ord:0105h
|
:10019757 FF1588530210 Call dword ptr [10025388]
:1001975D 50 push eax

* Reference To: USER32.SetFocus, Ord:0233h
|
:1001975E FF1548530210 Call dword ptr [10025348]
:10019764 E94A010000 jmp 100198B3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10019751(C)
|
:10019769 8BCE mov ecx, esi
* Reference To: FGuard32.?IsOldRegInfo@ri2@@QAEHXZ
|
:1001976B E895140000 call 1001AC05 <- 检查黑名单
:10019770 85C0 test eax, eax <- 不在其上则eax=0
:10019772 741F je 10019793

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100197D9(C)
|
:10019774 685BABFFFF push FFFFAB5B

* Possible Reference to String Resource ID=00052: "&Unlock"
|
:10019779 6A34 push 00000034
:1001977B 57 push edi
* Reference To: FGuard32.?Msg@@YAHPAUHWND__@@IHZZ
|
:1001977C E8FB8EFFFF call 1001267C
:10019781 83C40C add esp, 0000000C
:10019784 83F806 cmp eax, 00000006
:10019787 75CA jne 10019753
:10019789 57 push edi
:1001978A 8BCE mov ecx, esi
* Reference To: FGuard32.?DoUpgradeThis@ri2@@QAEHPAUHWND__@@@Z
|
:1001978C E886160000 call 1001AE17
:10019791 EBC0 jmp 10019753

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10019772(C)
|
:10019793 8BCE mov ecx, esi
* Reference To: FGuard32.?iv1@ri2@@QAEHXZ
|
:10019795 E809120000 call 1001A9A3 <- (1)检查Code[1]到Code[4]
:1001979A 85C0 test eax, eax <- 正确则eax=1
:1001979C 7512 jne 100197B0
:1001979E 6861ABFFFF push FFFFAB61
:100197A3 6A30 push 00000030
:100197A5 57 push edi
* Reference To: FGuard32.?Msg@@YAHPAUHWND__@@IHZZ
|
:100197A6 E8D18EFFFF call 1001267C
:100197AB 83C40C add esp, 0000000C
:100197AE EBA3 jmp 10019753

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001979C(C)
|
:100197B0 8BCE mov ecx, esi
* Reference To: FGuard32.?iv2@ri2@@QAEHXZ
|
:100197B2 E806120000 call 1001A9BD <- (2)检查Code[7]、Code[8]
:100197B7 85C0 test eax, eax <- 正确则eax=1
<- 找到这些后我就注册了，好奇怪

:100197B9 7515 jne 100197D0
:100197BB 6863ABFFFF push FFFFAB63
:100197C0 6A30 push 00000030
:100197C2 57 push edi
* Reference To: FGuard32.?Msg@@YAHPAUHWND__@@IHZZ
|
:100197C3 E8B48EFFFF call 1001267C
:100197C8 83C40C add esp, 0000000C
:100197CB FF7518 push [ebp+18]
:100197CE EB86 jmp 10019756

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100197B9(C)
|
:100197D0 8BCE mov ecx, esi
* Reference To: FGuard32.?iu2@ri2@@QAEHXZ
|
:100197D2 E841140000 call 1001AC18
:100197D7 85C0 test eax, eax
:100197D9 7599 jne 10019774
:100197DB 685FABFFFF push FFFFAB5F

(1)
Exported fn(): ?iv1@ri2@@QAEHXZ - Ord:05EAh
:1001A9A3 8B4170 mov eax, dword ptr [ecx+70]
:1001A9A6 83C142 add ecx, 00000042
:1001A9A9 FF7040 push [eax+40]
:1001A9AC FF703C push [eax+3C]
:1001A9AF 8A4030 mov al, byte ptr [eax+30]
:1001A9B2 50 push eax
:1001A9B3 51 push ecx
* Reference To: FGuard32.?riivc2@@YAHPBDDHH@Z
|
:1001A9B4 E8E7F7FFFF call 1001A1A0 <- trace into
:1001A9B9 83C410 add esp, 00000010
:1001A9BC C3 ret

* Referenced by a CALL at Address:
|:1001A9B4
|

Exported fn(): ?riivc2@@YAHPBDDHH@Z - Ord:0612h
:1001A1A0 55 push ebp
:1001A1A1 8BEC mov ebp, esp
:1001A1A3 83EC20 sub esp, 00000020
:1001A1A6 8B4508 mov eax, dword ptr [ebp+08]
:1001A1A9 8A08 mov cl, byte ptr [eax] <-
:1001A1AB 3A4D0C cmp cl, byte ptr [ebp+0C] <- Code[1]
:1001A1AE 7404 je 1001A1B4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1001A1D6(C), :1001A1E9(C)
|
:1001A1B0 33C0 xor eax, eax <- unRegister Flag
:1001A1B2 C9 leave
:1001A1B3 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001A1AE(C)
|
:1001A1B4 8D4DE0 lea ecx, dword ptr [ebp-20]

* Possible Reference to String Resource ID=00032: "On empty password"
|
:1001A1B7 6A20 push 00000020
:1001A1B9 51 push ecx
:1001A1BA 6A00 push 00000000
:1001A1BC 6A00 push 00000000
:1001A1BE 50 push eax
:1001A1BF E832FFFFFF call 1001A0F6
:1001A1C4 FF7510 push [ebp+10]
:1001A1C7 8D45E3 lea eax, dword ptr [ebp-1D]
:1001A1CA 50 push eax
:1001A1CB E8CFFEFFFF call 1001A09F
:1001A1D0 83C41C add esp, 0000001C
:1001A1D3 3845E1 cmp byte ptr [ebp-1F], al <- Code[2]
:1001A1D6 75D8 jne 1001A1B0
:1001A1D8 FF7514 push [ebp+14]
:1001A1DB 8D45E3 lea eax, dword ptr [ebp-1D]
:1001A1DE 50 push eax
:1001A1DF E8BBFEFFFF call 1001A09F
:1001A1E4 3845E2 cmp byte ptr [ebp-1E], al
:1001A1E7 59 pop ecx
:1001A1E8 59 pop ecx
:1001A1E9 75C5 jne 1001A1B0
:1001A1EB 33C0 xor eax, eax
:1001A1ED 807DE339 cmp byte ptr [ebp-1D], 39 <- Code[3]
:1001A1F1 0F94C0 sete al
:1001A1F4 C9 leave
:1001A1F5 C3 ret

(2)
* Referenced by a CALL at Addresses:
|:100197B2 , :1001A9EC , :1001AC5E
|

Exported fn(): ?iv2@ri2@@QAEHXZ - Ord:05EBh
:1001A9BD 8B4170 mov eax, dword ptr [ecx+70]
:1001A9C0 FF7038 push [eax+38]
:1001A9C3 6A01 push 00000001
:1001A9C5 FF7034 push [eax+34]
:1001A9C8 8D4142 lea eax, dword ptr [ecx+42]
:1001A9CB 6A00 push 00000000
:1001A9CD 50 push eax
:1001A9CE 668B4140 mov ax, word ptr [ecx+40]
:1001A9D2 50 push eax
:1001A9D3 51 push ecx
* Reference To: FGuard32.?riivn2@@YAHPBDG0HHHH@Z
|
:1001A9D4 E81DF8FFFF call 1001A1F6 <- trace into it
:1001A9D9 83C41C add esp, 0000001C
:1001A9DC C3 ret

* Referenced by a CALL at Addresses:
|:1001A9D4 , :1001AA25
|

Exported fn(): ?riivn2@@YAHPBDG0HHHH@Z - Ord:0613h
:1001A1F6 55 push ebp
:1001A1F7 8BEC mov ebp, esp
:1001A1F9 83EC64 sub esp, 00000064
:1001A1FC 56 push esi
:1001A1FD 57 push edi
:1001A1FE 8D45DC lea eax, dword ptr [ebp-24]

* Possible StringData Ref from Data Obj ->"00"
|
:1001A201 BEC8B10310 mov esi, 1003B1C8
:1001A206 8D7DFC lea edi, dword ptr [ebp-04]
:1001A209 6A20 push 00000020
:1001A20B 50 push eax
:1001A20C 6A00 push 00000000
:1001A20E 66A5 movsw
:1001A210 6A00 push 00000000
:1001A212 FF7510 push [ebp+10]
:1001A215 A4 movsb
:1001A216 E8DBFEFFFF call 1001A0F6
:1001A21B 8A45E0 mov al, byte ptr [ebp-20]

* Possible Reference to String Resource ID=00064: "Cannot accept the registration information you have entered."
|
:1001A21E 6A40 push 00000040
:1001A220 8845FC mov byte ptr [ebp-04], al
:1001A223 8A45E1 mov al, byte ptr [ebp-1F]
:1001A226 8845FD mov byte ptr [ebp-03], al
:1001A229 8D459C lea eax, dword ptr [ebp-64]
:1001A22C 50 push eax
:1001A22D 8D45FC lea eax, dword ptr [ebp-04]
:1001A230 50 push eax
:1001A231 FF750C push [ebp+0C]
:1001A234 FF7508 push [ebp+08]
:1001A237 E8BAFEFFFF call 1001A0F6
:1001A23C FF7518 push [ebp+18]
:1001A23F 8D459C lea eax, dword ptr [ebp-64]
:1001A242 50 push eax
:1001A243 E857FEFFFF call 1001A09F
:1001A248 8B4D14 mov ecx, dword ptr [ebp+14]
:1001A24B 83C430 add esp, 00000030
:1001A24E 38440DE2 cmp byte ptr [ebp+ecx-1E], al <- Code[7]
:1001A252 5F pop edi
:1001A253 5E pop esi
:1001A254 7404 je 1001A25A
:1001A256 33C0 xor eax, eax
:1001A258 C9 leave
:1001A259 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001A254(C)
|
:1001A25A FF7520 push [ebp+20]
:1001A25D 8D459C lea eax, dword ptr [ebp-64]
:1001A260 50 push eax
:1001A261 E839FEFFFF call 1001A09F
:1001A266 8B551C mov edx, dword ptr [ebp+1C]
:1001A269 59 pop ecx
:1001A26A 59 pop ecx
:1001A26B 33C9 xor ecx, ecx
:1001A26D 384415E2 cmp byte ptr [ebp+edx-1E], al <- Code[8]
:1001A271 0F94C1 sete cl
:1001A274 8BC1 mov eax, ecx
:1001A276 C9 leave
:1001A277 C3 ret

注册信息保存在：
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\WinAbility\Folder Guard\Setup\1]
"Info"=.....


Read Book 1.2

标 题:2个菜鸟级软件 (1千字)
发信人:夜月
时 间:2001-3-26 12:50:36
详细信息:
Backup Magic 1.3.2
下断点:bpx 0044c519
015F:0044C514 MOV EAX,[EBP-04]
015F:0044C517 MOV EDX,ESI
015F:0044C519 CALL 00403E50
015F:0044C51E SETZ AL
015F:0044C521 MOV EBX,EAX
分别d eax,d edx就可以得到注册码了

Read Book 1.2
《论坛精华2》中，冰毒大虾说破这个程序费了不少力气，我觉得是它的方法不对，所以找关键比较的地方
很麻烦。其实用W32dasm反汇编后，察看字符串参考，很快就能看到：“您已经成功注册了”的字样，于是
比较地址就很好找了，代码是这样的：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409A6C(C)
.................
.................
* Possible StringData Ref from Data Obj ->"祝贺"
|
:00409ABF 6848D84500 push 0045D848

* Possible StringData Ref from Data Obj ->"您已经成功地注册了!"
|
:00409AC4 6834D84500 push 0045D834
:00409AC9 8BCE mov ecx, esi
:00409ACB E82FAD0200 call 004347FF
:00409AD0 EB38 jmp 00409B0A
马上转到409a6c处，关键比较就出来了：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409A84(C)
|
:00409A69 3975FC cmp dword ptr [ebp-04], esi
:00409A6C 741D je 00409A8B
:00409A6E 8B55EC mov edx, dword ptr [ebp-14]
？esi就可以得到正确的注册码。

看来入手的方法真的是很重要！


ReadBook v1.41

标 题:ReadBook v1.41注册码算法,供参考! (1千字)
发信人:floatsnow
时 间:2001-3-31 22:58:22
详细信息:
ReadBook1.1 注册算法
用户名: ABCD
ABCD 41 42 43 44
abcd 61 62 63 64
程序会把用户名转为小些!
内存情况
[EBP+FFFFFF44]: 61 62 63 64 00 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
调用函数将用户名变成小写.数字和特殊字符不变.在终止0后面补成20
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409992(C)
|
:00409A01 8D8544FFFFFF lea eax, dword ptr [ebp+FFFFFF44]
:00409A07 50 push eax
:00409A08 E829460200 call 0042E036
:00409A0D 8B8548FFFFFF mov eax, dword ptr [ebp+FFFFFF48] //eax=20202000
:00409A13 8B8D4CFFFFFF mov ecx, dword ptr [ebp+FFFFFF4C] //ecx=20202020
:00409A19 8BB544FFFFFF mov esi, dword ptr [ebp+FFFFFF44]//esi=64636261
:00409A1F 03C1 add eax, ecx
:00409A21 038550FFFFFF add eax, dword ptr [ebp+FFFFFF50] //[ebp+ffffff50]=20202020
:00409A27 69F631750000 imul esi, 00007531
:00409A2D 69C031750000 imul eax, 00007531
* Possible StringData Ref from Data Obj ->"BIN_OR_TEXT"
|
:00409A33 C704244CC34500 mov dword ptr [esp], 0045C34C
:00409A3A 68B5000000 push 000000B5
:00409A3F 53 push ebx
:00409A40 2BF0 sub esi, eax
//esi的值转化为十进制就是注册码
仅供参考,注册机很简单我不多写了.


readbook v1.41

标 题:文件阅读器readbook v1.41 c (9千字)
发信人:happyhackwang
时 间:2001-3-11 21:01:08
详细信息:
文件阅读器readbook v1.41 crack by happyhackwang
软件名称:文件阅读器readbook v1.41
软件功能:语音阅读文本
注册方式:name+serial
作者:余民
作者主页:http://ReadBook.126.com
作者邮箱:ReadBook@126.COM
破解者:happyhackwang
邮箱:happyhackwang@263.net
OICQ:4696993(不在线^^)
注册方式:Patch(谁想写注册机,自己写吧!算法见后)
工具:softice,w32dasm,my head,ultraedit(to write this article)
特别感谢:w32dasm作者,以及patch它的各位

反汇编以后,看到了注册失败的信息提示的字符串,向上看:
:0040A10F 3975FC cmp dword ptr [ebp-04], esi ;这是关键
:0040A112 741D je 0040A131
......
:0040A12C 3975FC cmp dword ptr [ebp-04], esi ;关键的比较
:0040A12F 7547 jne 0040A178 ;相等则注册,不等则失败

[ebp-4]里的数是怎么来的?
:0040A09E C745F412320000 mov [ebp-0C], 00003212 ;预定义的
:0040A0A5 C745E434120000 mov [ebp-1C], 00001234 ;
:0040A0AC C745E888880000 mov [ebp-18], 00008888 ;
:0040A0B3 C745F023230000 mov [ebp-10], 00002323 ;
:0040A0BA E878D20000 call 00417337
:0040A0BF 83C410 add esp, 00000010
:0040A0C2 85C0 test eax, eax
:0040A0C4 7524 jne 0040A0EA
:0040A0C6 8D45F0 lea eax, dword ptr [ebp-10] ;2323
:0040A0C9 50 push eax
:0040A0CA 8D45E8 lea eax, dword ptr [ebp-18] ;8888
:0040A0CD 50 push eax
:0040A0CE 8D45E4 lea eax, dword ptr [ebp-1C] ;1234
:0040A0D1 50 push eax
:0040A0D2 8D45F4 lea eax, dword ptr [ebp-0C] ;3212
:0040A0D5 50 push eax
* Possible StringData Ref from Data Obj ->"C:\"
:0040A0D6 6860374600 push 00463760

* Reference To: KERNEL32.GetDiskFreeSpaceA, Ord:0100h
|
:0040A0DB FF15F8114500 Call dword ptr [004511F8]
:0040A0E1 8B45F0 mov eax, dword ptr [ebp-10] ;总簇数
:0040A0E4 0FAF45F4 imul eax, dword ptr [ebp-0C] ;与每簇的扇区数乘
:0040A0E8 EB19 jmp 0040A103
......
:0040A103 F7D0 not eax
:0040A105 3145FC xor dword ptr [ebp-04], eax ;这里

看看GetDiskFreeSpace API的入口参数
?lpRootPathName 00463760
(根目录)

?lpSectorsPerCluster ebp-0C
(每簇的扇区数目的指针)

?lpBytesPerSector ebp-1C
(每个扇区字节数的指针)

?lpNumberOfFreeClusters ebp-18
(空闲的簇数的指针)

?lpTotalNumberOfClusters ebp-10
(总簇数的指针)

esi的数是怎么来的?
:0040A03F E8829B0200 call 00433BC6
:0040A044 8B8548FFFFFF mov eax, dword ptr [ebp+FFFFFF48] ;[72F8E8]@1
:0040A04A 8B8D4CFFFFFF mov ecx, dword ptr [ebp+FFFFFF4C] ;[72F8EC]@2
:0040A050 8BB544FFFFFF mov esi, dword ptr [ebp+FFFFFF44] ;[72F8E4]@3
:0040A056 03C1 add eax, ecx ;
:0040A058 038550FFFFFF add eax, dword ptr [ebp+FFFFFF50] ;[72F8F0]@4
:0040A05E 69F631750000 imul esi, 00007531 ;
:0040A064 69C031750000 imul eax, 00007531 ;

* Possible StringData Ref from Data Obj ->"BIN_OR_TEXT"
|
:0040A06A C704240C334600 mov dword ptr [esp], 0046330C
:0040A071 68B5000000 push 000000B5
:0040A076 53 push ebx
:0040A077 2BF0 sub esi, eax ;这里

[72F8E4]是存放名字字符串的地方
所以@1是偏移地址的第四个字节开始的4个字节
@2 八 4
@3 零 4
@4 十二 4

例如:名字输入 crack readbook
@1就是k re
@2就是adbo
@3就是crac
@4就是ok
名字字符不够长的补以空格(ASCII 20)

自我病毒监测功能的实现:打开RBBackup.DAT |
:00417F6A FF1564124500 Call dword ptr [00451264] ;FindCloseChangeNotification()
:00417F70 395DD4 cmp dword ptr [ebp-2C], ebx ;API函数
:00417F73 742D je 00417FA2
:00417F75 6A14 push 00000014

* Possible StringData Ref from Data Obj ->"这里是ReadBOOK的自我修复功能"
|
:00417F77 68B0594600 push 004659B0

* Possible StringData Ref from Data Obj ->" ReadBook察觉到自身有改变，如果不是文件损坏"
->"的就是让病毒感染了！
一般说来，硬盘很少损*"
->"担绻腞eadBook是安装在硬盘上的，那么
极大"
->"的可能是您的计算机中存在病毒。
"
->" 解决办法是使用杀毒软件对计算机进行检查。但*"
->"捎诩扑慊《久刻於*
有新的种类出现，请您一定要"
->"注意您的杀毒软件的版本（出版时间），确定
您使*"
->"玫氖亲钚掳姹镜模ㄉ倍救砑陌姹靖轮芷谝话闶羌"
->"甘欤*
ReadBOOK具有自我修复功*"
|
:00417F7C 6894574600 push 00465794
:00417F81 53 push ebx

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:00417F82 FF1530164500 Call dword ptr [00451630]
:00417F88 83F806 cmp eax, 00000006
:00417F8B 0F850D010000 jne 0041809E
:00417F91 E81AEFFFFF call 00416EB0
:00417F96 53 push ebx

* Reference To: USER32.PostQuitMessage, Ord:01E0h
|
:00417F97 FF15F0144500 Call dword ptr [004514F0]
:00417F9D E9FC000000 jmp 0041809E

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417EC6(C), :00417F73(C)
|
:00417FA2 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"这里是ReadBOOK的病毒监测功能"
|
:00417FA4 6874574600 push 00465774

* Possible StringData Ref from Data Obj ->" ReadBook察觉到自身有改变，如果不是文件损坏"
->"的就是让病毒感染了！
一般说来，硬盘很少损*"
->"担绻腞eadBook是安装在硬盘上的，那么
极大"
->"的可能是您的计算机中存在病毒。
"
->" 解决办法是使用杀毒软件对计算机进行检查。但*"
->"捎诩扑慊《久刻於*
有新的种类出现，请您一定要"
->"注意您的杀毒软件的版本（出版时间），确定
您使*"
->"玫氖亲钚掳姹镜模ㄉ倍救砑陌姹靖轮芷谝话闶羌"
->"甘欤*
由于ReadBOOK的损坏严重*"
|
:00417FA9 6888554600 push 00465588
:00417FAE 53 push ebx

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:00417FAF FF1530164500 Call dword ptr [00451630]
:00417FB5 E9E4000000 jmp 0041809E

如何绕过去呢?
向上看到,在这里设断点
:00417D96 E87AF5FFFF call 00417315 ;API GetPrivateProfileStringA
......
:00417DA7 E8E45A0100 call 0042D890
:00417DAC 83C418 add esp, 00000018
:00417DAF 85C0 test eax, eax
:00417DB1 0F84F9020000 je 004180B0

追进00417D96
:00417315 FF3580754B00 push dword ptr [004B7580] ;readbook.ini
:0041731B FF742414 push [esp+14] ;10
:0041731F FF742414 push [esp+14] ;03
:00417323 6850844600 push 00468450 ;
:00417328 FF742418 push [esp+18] ;verify
:0041732C FF742418 push [esp+18] ;file

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:013Ah
|
:00417330 FF1568134500 Call dword ptr [00451368]

GetPrivateProfileStringA的入口参数:
?lpAppName esp+18
初始化文件中section字符串
?lpKeyName esp+18
要得到的key的字符串
?lpDefault 00468450
缺省字符串
?lpReturnedString esp+14
接收缓冲区
?nSize esp+14
长度
?lpFileName 004B7580
初始化文件名

追进00417DA7
:0042D8B0 8A06 mov al, byte ptr [esi] ;预定义的字符串"No"
:0042D8B2 46 inc esi
:0042D8B3 8A27 mov ah, byte ptr [edi] ;ini中得到的字符串
:0042D8B5 47 inc edi
:0042D8B6 38C4 cmp ah, al
:0042D8B8 74F2 je 0042D8AC

在readbook.ini中添加
[File]
Verify=No
就可以绕过检验程序是否更改,当然也可以Patch
这在程序中 视图->配置->控制->防病毒校验 可以设置

总结:
Patch
00417DB1 0F84F9020000 je 004180B0 ;patch病毒自检
E9FA02000090 jmp 4180B0

0040A112 741D je 0040A131 ;patch注册失败
EB1D jmp 40A131

另外,readbook v1.42与1.41大同小异,不另行说明,Patch如下:
:0040A160 3975F8 cmp dword ptr [ebp-08], esi
:0040A163 741D je 0040A182(A163)
EB1DS

:00417E53 E818620100 call 0042E070
:00417E58 83C418 add esp, 00000018
:00417E5B 85C0 test eax, eax
:00417E5D 0F84F9020000 je 0041815C(17E5D)
E9FA02000090

*********************************世间本无事,庸人自扰耳************************************


ReadBOOK v1.43

标 题:ReadBOOK v1.43 中文阅读程序--注册破解全攻略 一 (13千字)
发信人:-1212-
时 间:2001-4-14 0:51:06
详细信息:
ReadBOOK v1.43 中文阅读程序--注册破解全攻略

作者：华仔
版权：China Cracking Group
时间：2001.04.14

由于本地上网包月制被取消，网费居高不下，太惨了，每周我只争取到
两小时的上网时间（没办法，都是Money惹的祸）。朋友推荐我用ReadBOOK v1.41
这个软件在平时多读点书，软件还不错，真正的绿色环保，不在除解
压目录之外的地方留下任何痕迹（我喜欢），再一看要注册（注册事小，
但有违Cracker的精神），毫不犹豫拉下了它的新版本ReadBOOK v1.43，
心想这下可大展身手了，不想运行一看差点把我气趴下，居然是什么
XXXXX专用版本，已不用注册了（如果你只是想使用这个软件，强烈建议
你按一下键盘上的Back Space键），主窗口中XXXXX标语太打眼，这怎
么行，我一定要注册它，仔细分析这个软件，发现它调用了oem.4rb这
个插件，删除它，我们又成为未注册版本了。

一、试运行：

进入注册窗口
用户名：华仔[CCG]
注册码：1974923
单击“填写完毕”按钮后，提示：“注册码错误,请重新填写注册码”。

二、注册分析：

1、注册码无法输入数字之外的任何字符，故猜测注册码可能是十进制数
（八进制数和二进制数也有可能，但这种情况很少见）。

2、确定后马上弹出注册错误窗口，说明它立即对你输入的注册码进行了
判断。设断时可从此下手。

三、实战：

用W32dsm89反汇编主程序，找关键字串“您已经成功地注册了”，来到以
下一大串代码中（分析时我用TRW2000）：

:00409FFC BF98444600 mov edi,00464498
*//读取ReadBook.ini文件中[File]段

:0040A001 68A0484600 push DWORD 004648A0
*//读取ReadBook.ini文件User项

:0040A006 57 push edi
:0040A007 E8A0D30000 call 004173AC
*//读取ReadBook.ini文件User项中的值并送给[ebp+FFFFFF44]
*//取姓名十六进制ASCII码，结束以00为标志，并用20补足128位。
*//BB AA D7 D0 5B 43 43 47 5D 00 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

:0040A00C 83C41C add esp, 1C
:0040A00F 389D44FFFFFF cmp byte ptr [ebp+FFFFFF44], bl
*//将[ebp+FFFFFF44]和BL作比较

:0040A015 756D jne 0040A084
*//[ebp+FFFFFF44]不为空则跳到校验代码
..
..
..
..
:0040A084 8D8544FFFFFF LEA EAX,[EBP+FFFFFF44]
:0040A08A 50 PUSH EAX
:0040A08B E8E6A30200 CALL 00434476
*//将大写字母转换为小写，其它类型字符不转换。
*//BB AA D7 D0 5B 63 63 67 5D 00 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

:0040A090 8B854CFFFFFF MOV EAX,[EBP+FFFFFF4C]
*//以姓名第12位开始向前依次取四位并送给EAX
*//2020005D

:0040A096 8B8D48FFFFFF MOV ECX,[EBP+FFFFFF48]
*//以姓名第8位开始向前依次取四位并送给ECX
*//6763635B

:0040A09C 8BB544FFFFFF MOV ESI,[EBP+FFFFFF44]
*//以姓名第4位开始向前依次取四位并送给ESI
*//D0D7AABB

:0040A0A2 03C8 ADD ECX,EAX
*//简单的加法运算：ECX=ECX+EAX=6763635B+2020005D=878363B8

:0040A0A4 038D50FFFFFF ADD ECX,[EBP+FFFFFF50]
*//取姓名第16位开始向前依次取四位与ECX相加，再将结果送给ECX
*//ECX=ECX+[EBP+FFFFFF50]=878363B8+20202020=A7A383D8

:0040A0AA 69F631750000 IMUL ESI,ESI,7531
*//带符号数乘法运算：ESI=ESI*7531=D0D7AABB*7531=8A4F24CB

:0040A0B0 69C931750000 IMUL ECX,ECX,7531
*//ECX=ECX*7531=A7A383D8*7531=D18DF458

:0040A0B6 C704240C434600 MOV DWORD [ESP],0046430C
:0040A0BD 68B5000000 PUSH DWORD B5
:0040A0C2 53 PUSH EBX
:0040A0C3 2BF1 SUB ESI,ECX
*//减法运算：ESI=ESI-ECX=8A4F24CB-D18DF458=B8C13073

:0040A0C5 FF1534224500 CALL `KERNEL32!FindResourceA`
*//函数说明：在模块中寻找资源

:0040A0CB 50 PUSH EAX
:0040A0CC 53 PUSH EBX
:0040A0CD FF153C224500 CALL `KERNEL32!LoadResource`
*//函数说明：返回资源句柄

:0040A0D3 6894484600 PUSH DWORD 00464894
*//读取ReadBook.ini文件

:0040A0D8 57 PUSH EDI
:0040A0D9 8945EC MOV [EBP-14],EAX
*//将EAX的值送给[EBP-14]

:0040A0DC E8EDD20000 CALL 004173CE
*//读取ReadBook.ini文件中Register的值并送给EAX

:0040A0E1 6880484600 PUSH DWORD 00464880
:0040A0E6 57 PUSH EDI
:0040A0E7 8945F8 MOV [EBP-08],EAX
*//将EAX的值送给[EBP-08]

:0040A0EA C745F012320000 MOV DWORD [EBP-10],3212
:0040A0F1 C745E434120000 MOV DWORD [EBP-1C],1234
:0040A0F8 C745E888880000 MOV DWORD [EBP-18],8888
:0040A0FF C745F423230000 MOV DWORD [EBP-0C],2323
:0040A106 E8C3D20000 CALL 004173CE
:0040A10B 83C410 ADD ESP,BYTE +10
:0040A10E 85C0 TEST EAX,EAX
:0040A110 7524 JNZ 0040A136
:0040A112 8D45F4 LEA EAX,[EBP-0C]
:0040A115 50 PUSH EAX
:0040A116 8D45E8 LEA EAX,[EBP-18]
:0040A119 50 PUSH EAX
:0040A11A 8D45E4 LEA EAX,[EBP-1C]
:0040A11D 50 PUSH EAX
:0040A11E 8D45F0 LEA EAX,[EBP-10]
:0040A121 50 PUSH EAX
:0040A122 6860474600 PUSH DWORD 00464760
*//取硬盘盘符C:

:0040A127 FF15F8214500 CALL `KERNEL32!GetDiskFreeSpaceA`
*//函数说明：获取磁盘剩余空间

:0040A12D 8B45F4 MOV EAX,[EBP-0C]
:0040A130 0FAF45F0 IMUL EAX,[EBP-10]
:0040A134 EB19 JMP SHORT 0040A14F
:0040A136 8D45C4 LEA EAX,[EBP-3C]
:0040A139 C745C420000000 MOV DWORD [EBP-3C],20
:0040A140 50 PUSH EAX
:0040A141 FF15F0214500 CALL `KERNEL32!GlobalMemoryStatus`
*//函数说明：检查内存状态

:0040A147 8B45D0 MOV EAX,[EBP-30]
:0040A14A 05CCEDFFFF ADD EAX,FFFFEDCC
:0040A14F F7D0 NOT EAX
:0040A151 3145F8 XOR [EBP-08],EAX
:0040A154 33C0 XOR EAX,EAX
*//EAX=0

:0040A156 A3FC644600 MOV [004664FC],EAX
*//将EAX的值送给[004664FC]

:0040A15B 3975F8 CMP [EBP-08],ESI
*//将[EBP-08]（假注册码的十六进制）和ESI（真注册码）比较

:0040A15E 741D JZ 0040A17D
*//如果相等则跳到注册成功窗口
*//暴破时此处改为JMP

:0040A160 8B55EC MOV EDX,[EBP-14]
*//将[EBP-14]的值送给EDX

:0040A163 8BC8 MOV ECX,EAX
*//将EAX的值送给ECX

:0040A165 83E17F AND ECX,BYTE +7F
*//逻辑与运算：ECX=ECX AND 7F

:0040A168 03348A ADD ESI,[EDX+ECX*4]
*//加法运算：ESI=ESI+[EDX+ECX*4]

:0040A16B 40 INC EAX
*//EAX=EAX+1

:0040A16C 3DFF0F0000 CMP EAX,0FFF
*//比较EAX是否等于FFF

:0040A171 A3FC644600 MOV [004664FC],EAX
*//将EAX送给[004664FC]

:0040A176 72E3 JC 0040A15B
*//EAX不等于FFF则跳

:0040A178 3975F8 CMP [EBP-08],ESI
*//将[EBP-08]（假注册码的十六进制）和ESI（真注册码）比较

:0040A17B 7547 JNZ 0040A1C4
*//不相等则跳到注册不成功窗口

:0040A17D 8B75FC MOV ESI,[EBP-04]
:0040A180 C705A4974B000100+MOV DWORD [004B97A4],01
:0040A18A FF761C PUSH DWORD [ESI+1C]
:0040A18D FF1598254500 CALL `USER32!GetMenu`
*//函数说明：返回指定窗口的菜单句柄

:0040A193 50 PUSH EAX
:0040A194 E881270300 CALL 0043C91A
:0040A199 53 PUSH EBX
:0040A19A 6850800000 PUSH DWORD 8050
:0040A19F FF7004 PUSH DWORD [EAX+04]
:0040A1A2 FF158C254500 CALL `USER32!RemoveMenu`
*//函数说明：删除菜单项和弹出式菜单

:0040A1A8 391DA8974B00 CMP [004B97A8],EBX
:0040A1AE 744C JZ 0040A1FC
:0040A1B0 53 PUSH EBX
:0040A1B1 6878484600 PUSH DWORD 00464878
**//祝贺

:0040A1B6 6864484600 PUSH DWORD 00464864
*//您已经成功地注册了!

:0040A1BB 8BCE MOV ECX,ESI
:0040A1BD E819000300 CALL 0043A1DB
:0040A1C2 EB38 JMP SHORT 0040A1FC

:0040A1C4 53 PUSH EBX
:0040A1C5 68A0484600 PUSH DWORD 004648A0
:0040A1CA 57 PUSH EDI
:0040A1CB 891DA4974B00 MOV [004B97A4],EBX
:0040A1D1 E88ED10000 CALL 00417364
:0040A1D6 53 PUSH EBX
:0040A1D7 6894484600 PUSH DWORD 00464894
:0040A1DC 57 PUSH EDI
:0040A1DD E882D10000 CALL 00417364
:0040A1E2 8B45FC MOV EAX,[EBP-04]
:0040A1E5 83C418 ADD ESP,BYTE +18
:0040A1E8 53 PUSH EBX
:0040A1E9 6853800000 PUSH DWORD 8053
:0040A1EE 6811010000 PUSH DWORD 0111
:0040A1F3 FF701C PUSH DWORD [EAX+1C]
:0040A1F6 FF1528264500 CALL `USER32!PostMessageA`
*//函数说明：将消息加入线索消息队列

:0040A1FC 891DA8974B00 MOV [004B97A8],EBX
:0040A202 5F POP EDI
:0040A203 5E POP ESI
:0040A204 5B POP EBX
:0040A205 C9 LEAVE
:0040A206 C3 RET

:0040A207 56 PUSH ESI
:0040A208 6A00 PUSH BYTE +00
:0040A20A 68C8484600 PUSH DWORD 004648C8
*//错了啦!

:0040A20F 8BF1 MOV ESI,ECX
:0040A211 68A8484600 PUSH DWORD 004648A8
*//注册码错误,请重新填写注册码!

:0040A216 E8C0FF0200 CALL 0043A1DB
:0040A21B 6A00 PUSH BYTE +00
:0040A21D 6850800000 PUSH DWORD 8050
:0040A222 6811010000 PUSH DWORD 0111
:0040A227 FF761C PUSH DWORD [ESI+1C]
:0040A22A FF1528264500 CALL `USER32!PostMessageA`
*//函数说明：将消息加入线索消息队列

:0040A230 5E POP ESI
:0040A231 C3 RET

四、结论：

1、取姓名十六进制ASCII码，结束以00为标志，并用20补足128位。如姓名中
有大写字母，先转换为小写字母再取。例如：

| 第1位 ==>BB
华-|
| 第2位 ==>AA

| 第3位 ==>D7
仔-|
| 第4位 ==>D0

第5位 [ ==> 5B
第6位 C ==> 43 ==> 63
第7位 C ==> 43 ==> 63
第8位 G ==> 47 ==> 67
第9位 ] ==> 5D
第10位 结束标致00
第11位 填充20
......
......
第128位 填充20

2、从第四位开始向前取四位，记为SN1，如：
SN1=D0D7AABB

3、从第十六位开始每四位为一组，顺序向前取三组，并求出这三组数之和，
记为SN2，如：
SN2=20202020+2020005D+6763635B=A7A383D8

3、将SN1减去SN2的差再乘以7531，记为SN，如：
SN=(SN1-SN2)*7531=(D0D7AABB+A7A383D8)*7531=B8C13073

4、取SN的十进制数，就是真正的注册码之一。
B8C13073 ==> 3099668595

所以完整的注册码：
姓 名：华仔[CCG]
注册码：3099668595

5、分析0040A160至0040A176代码段发现，注册码不只一个，还有FFF个。

①算法：
将0-FFF顺序取数并与7F逻辑与运算，将运算结果乘以4再加上EDX=4D5990，
得出密码表（我已提取出来供大家参考）偏移量，然后依次取4位（低位在
前、高位在后）最后再加上当前的SN值就得到了一个新的注册码。

②密码表如下：
0 1 2 3 4 5 6 7 8 9 A B C D E F
004D5990: 4D 44 07 48 36 6C 81 0B 4B 7C 5A 27 97 31 96 25 MD.H6l?K|Z'??
004D59A0: A6 32 C0 2C 40 05 44 67 E2 7E 7D 3E FD 6D 75 4F ??@.Dg鈤}>.muO
004D59B0: 50 6A 6B 6E CA 6C 8A 77 E2 13 86 5E 43 5F FA 3B Pjkn蔿妛?哵C_?
004D59C0: 3D 46 AE 4E 5C 66 3C 58 10 34 A9 37 52 25 E8 79 =F甆\f<X.4?R%鑩
004D59D0: A4 4E 68 17 E2 6C 19 0F B5 6A 8B 52 B8 26 15 54 h.鈒..礿婻?.T
004D59E0: 81 27 27 4F 2A 15 30 64 1E 4C C6 2C 26 3B ED 51 ?'O*.0d.L?&;鞶
004D59F0: 10 0F AF 3D 69 00 67 0A 1B 7C 68 25 F2 65 EF 07 ..?i.g..|h%騟?
004D5A00: 56 6C 7A 40 B7 5E F7 17 81 44 74 39 96 20 2F 38 Vlz@穅?丏t9?/8
004D5A10: 98 6D 32 6F 8E 01 ED 4E A8 3B 5F 10 2F 35 D2 42 榤2o?鞱?_./5褺
004D5A20: E2 36 39 10 4F 7E AB 35 EE 7A 94 58 FF 28 95 66 ?9.O~?顉擷.(昮
004D5A30: 82 20 22 5D BE 60 65 7F 32 65 F1 73 EC 36 46 51 ?"]綻e.2e駍?FQ
004D5A40: 8A 05 35 17 81 6D A4 44 5A 7D 48 74 FE 59 49 00 ?5.乵Z}Ht.YI.
004D5A50: 51 22 EF 6B A4 74 C6 0B CD 4C DF 67 E4 67 15 71 Q"飇?蚅遟鋑.q
004D5A60: F2 02 80 29 18 34 7C 21 FA 59 F0 75 70 3B B4 21 ?�).4|!鶼饀p;?
004D5A70: CB 01 4B 43 2F 4A 4B 41 CF 2E 2A 4B 17 6F 47 61 ?KC/JKA?*K.oGa
004D5A80: 00 56 69 26 21 38 0C 0E 42 6F 2E 56 72 27 80 70 .Vi&!8..Bo.Vr'�p
004D5A90: F6 31 26 5E 8B 74 6C 5A CC 7F 12 54 C0 6D 26 72 ?&^媡lZ?.T續&r
004D5AA0: D8 71 83 08 EB 0D 6D 41 E9 3B E1 2C 61 1A 94 2B 豵??mA??a.?
004D5AB0: 16 5A B2 1A 25 5D E3 0E 99 3C 19 20 5C 4F 3A 15 .Z?%]??. \O:.
004D5AC0: E1 65 9D 75 01 48 F7 77 E2 2E 2C 41 DA 02 1A 3B 醗漸.H鱳?,A?.;
004D5AD0: B0 25 60 4A AB 13 A7 23 4C 3A 01 44 A9 19 4C 6D ?`J??L:.D?Lm
004D5AE0: BD 2D CA 4E 31 47 44 03 63 77 70 19 BA 11 7B 40 ?蔔1GD.cwp.?{@
004D5AF0: 89 14 E0 41 09 1E F3 7A 39 76 C8 5B A4 3C 66 5E ?郃..髗9v萚?f^
004D5B00: 54 01 5A 40 88 0A 2D 5A E2 54 4D 0B 1E 0A 60 26 T.Z@?-Z釺M...`&
004D5B10: A6 4A 24 69 6C 48 3F 24 F5 65 B2 1A 88 62 D0 1D $ilH?$鮡?坆?
004D5B20: C9 24 DE 51 53 7F CA 28 12 67 A4 4B 63 11 B2 30 ?轖S.?.gc.?
004D5B30: 4C 60 5C 4B 41 75 44 6C 56 47 3F 5B D5 3F 14 42 L`\KAuDlVG?[?.B
004D5B40: 82 38 27 76 1E 51 75 60 E9 7D 96 7E 27 7F 9A 0C ?'v.Qu`閩杶'.?
004D5B50: 01 32 FA 26 36 6D FB 6C 71 70 2F 2F 46 63 FA 52 .2?6m鹟qp//Fc鶵
004D5B60: 23 09 46 1B B7 39 C7 47 9B 69 85 47 45 2D 81 60 #.F.?荊沬匞E-乣
004D5B70: 88 30 AE 7D 37 2F 9E 1D 99 1F 85 6F D8 05 8C 59 ?畗7/??卭?孻
004D5B80: 92 5F 8C 3A 2B 51 98 0A 9F 4A 11 59 DB 47 10 5C 抇?+Q?烰.Y跥.\

③例如：

姓 名：华仔[CCG]
注册码：3099668595 ==> B8C13073

注册码1 ==> [4D5990+0*4]=4D5990 ==> 4807444D+B8C13073=C874C0 ==> 13137088
注册码2 ==> [4D5990+1*4]=4D5994 ==> 0B816C36+C874C0=C49E0F6 ==> 206168310
注册码3 ==> [4D5990+2*4]=4D5998 ==> 275A7C4B+C49E0F6=33A45D41 ==> 866409793
注册码4 ==> [4D5990+3*4]=4D599C ==> 25963197+33A45D41=593A8ED8 ==> 1497009880
....
....
注册码FFF ==> [4D5990+7E*4]=4D5B88 ==> 59114A9F+C53475F9=1E45C098 ==> 507887768

标 题:ReadBOOK v1.43 中文阅读程序--注册破解全攻略 二 (5千字)
发信人:-1212-
时 间:2001-4-14 0:52:03
详细信息:

6、暴力破解时，当使用上述方法将0040A15E处改为EB1D后试运行提示：“ReadBook察
觉到自身有改变，如果不是文件损坏...”，没想到它还有CRC校验，好！我们再来
搞定它。
用W32dsm89反汇编主程序，找关键字串“ReadBook察觉到自身有改变”，很好，找
到一个。现在向上略过几个跳跃指令看到如下代码：

:00417F2D FF75F0 push [ebp-10]
:00417F30 FF75D8 push [ebp-28]
:00417F33 FF75E8 push [ebp-18]
:00417F36 E8BB060000 call 004185F6 ===》CRC校验代码
:00417F3B 83C40C add esp, 0000000C
:00417F3E 85C0 test eax, eax
:00417F40 0F8516010000 jne 0041805C ===》一定要跳，不跳就出错
:00417F46 53 push ebx
:00417F47 53 push ebx

将00417F40处改为90E916010000，重新运行就没有错误提示了。如果你认为现在就完
事收工，那你就错了，在每次点击“关于”菜单，程序将调用以下代码：

:00418799 B8F7FC4400 mov eax, 0044FCF7
:0041879E E80DD20000 call 004259B0
:004187A3 81ECA0010000 sub esp, 000001A0
:004187A9 53 push ebx
:004187AA 57 push edi
:004187AB 8BF9 mov edi, ecx
:004187AD 6A10 push 00000010

* Reference To: USER32.GetKeyState, Ord:0112h
*//函数说明：返回虚拟键的状态
|
:004187AF FF1558254500 Call dword ptr [00452558]
:004187B5 A880 test al, 80
*//触发条件al大于或等于80（十六进制80为十进制128）
*//具体是什么时候al会大于或等于80，我还不清楚，请哪位高手指点一二。

:004187B7 7420 je 004187D9
*//大于或等于80则跳
*//如al<80你就看不到下面这个精彩画面了。
*//如想看则NOP，但我对这些小恶作局深恶痛绝，我还是JMP算了。

:004187B9 FE05BC974B00 inc byte ptr [004B97BC]
*//[004B97BC]加1（每点击一次“关于ReadBook”菜单，在此处加1）

:004187BF 803DBC974B0002 cmp byte ptr [004B97BC], 02
*//将[004B97BC]的值和02比较

:004187C6 7E11 jle 004187D9
*//小于或等于02则跳

:004187C8 E818020000 call 004189E5
*//吓你一跳的地方（代码在下面）

:004187CD 8025BC974B0000 and byte ptr [004B97BC], 00
*//与运算：[004B97BC]=0（吓唬你后在此处将点击次数置0）

:004187D4 E9A6000000 jmp 0041887F

* Referenced by a CALL at Address:
|:004187C8
|
:004189E5 B80FFD4400 mov eax, 0044FD0F
:004189EA E8C1CF0000 call 004259B0
:004189EF 81ECD8000000 sub esp, 000000D8
:004189F5 6A00 push 00000000
:004189F7 8D8D1CFFFFFF lea ecx, dword ptr [ebp+FFFFFF1C]
:004189FD E863F6FEFF call 00408065
*//调用格式化对话框（代码在下面）

:00418A02 8365FC00 and dword ptr [ebp-04], 00000000
:00418A06 8D8D1CFFFFFF lea ecx, dword ptr [ebp+FFFFFF1C]
:00418A0C E88AF70100 call 0043819B
:00418A11 6A00 push 00000000

* Possible StringData Ref from Data Obj
*//嘻嘻

:00418A13 68806C4600 push 00466C80

* Possible StringData Ref from Data Obj
*//不要害怕,只是和你开个小玩笑。本软件不会破坏任...?

:00418A18 68486C4600 push 00466C48
:00418A1D 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BEh
*//函数说明：建立消息框窗体

:00418A1F FF1530264500 Call dword ptr [00452630]
:00418A25 834DFCFF or dword ptr [ebp-04], FFFFFFFF
:00418A29 8D8D1CFFFFFF lea ecx, dword ptr [ebp+FFFFFF1C]
:00418A2F E8B6F6FEFF call 004080EA
:00418A34 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00418A37 64890D00000000 mov dword ptr fs:[00000000], ecx
:00418A3E C9 leave
:00418A3F C3 ret

* Referenced by a CALL at Address:
|:004189FD
|
:00408065 B85FF34400 mov eax, 0044F35F
:0040806A E841D90100 call 004259B0
:0040806F 51 push ecx
:00408070 56 push esi
:00408071 57 push edi
:00408072 FF7508 push [ebp+08]
:00408075 8BF1 mov esi, ecx
:00408077 8975F0 mov dword ptr [ebp-10], esi

* Possible Reference to Dialog: DialogID_00C2
|
:0040807A 68C2000000 push 000000C2
*//对话框ID：194（十六进制C2为十进制194，你可用Exescope等资源编辑软件看一下
主程序资源对话框194是不是我们熟悉的windows格式化窗口）

:0040807F E862000300 call 004380E6
*//调出格式化窗口

:00408084 8365FC00 and dword ptr [ebp-04], 00000000
:00408088 8D7E5C lea edi, dword ptr [esi+5C]
:0040808B 8BCF mov ecx, edi
:0040808D E807060300 call 00438699
:00408092 C707747A4500 mov dword ptr [edi], 00457A74
:00408098 8DBE98000000 lea edi, dword ptr [esi+00000098]
:0040809E C645FC01 mov [ebp-04], 01
:004080A2 8BCF mov ecx, edi
:004080A4 E8F0050300 call 00438699
:004080A9 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004080AC C7078C764500 mov dword ptr [edi], 0045768C
:004080B2 83A6D400000000 and dword ptr [esi+000000D4], 00000000
:004080B9 C706A03D4500 mov dword ptr [esi], 00453DA0
:004080BF 8BC6 mov eax, esi
:004080C1 5F pop edi
:004080C2 5E pop esi
:004080C3 64890D00000000 mov dword ptr fs:[00000000], ecx
:004080CA C9 leave
:004080CB C20400 ret 0004
*//鼠标不停的向“开始”格式化按钮上移动


READBOOK141

标 题:破READBOOK141 (13千字)
发信人:zest
时 间:2001-2-20 18:52:50
详细信息:
破READBOOK141
程序：电脑报合订本2000配套光盘。

用W32DASM找Ref关键：0040A16A:您已经成功地注册了!
上看，知对比处0040A10F cmp dword ptr [ebp-04], esi重要。
姓 名：zest
注册码：12345678(hex=bc614e)
下bpx 0040a10f
?[ebp-04]=bc614e(dec=12345678)
?esi=8907821a(dec=2298970650)
填写2298970650 OK!
耗时3分钟。

===================================================================================
注：
-----------------------------------------------------------------------------------
1、填写姓名zest注册码12345678按OK后程序会在ReadBook.ini的[File]加上User和Register。
User=zest Register=-8625359（经变形处理），你可bpx 409FAE（程序下面第一行）中断，
suspend打开ReadBook.ini看看。
-----------------------------------------------------------------------------------
2、程序启动时会在ReadBook.ini的[File]找User和Register项，
找User用GetPrivateProfileStringA找Register用GetPrivateProfileIntA。
-----------------------------------------------------------------------------------
3、如发现在ReadBook.ini的[File]中无User项，在00409FC9处不跳，将在Favorites.ini中找
NowDay（记录最后运行日期），与今天日期相比，如不等，出注册提示框，如等，无提示。
程序退出后，写今天日期入NowDay。相当于每天只在第一次运行READBOOK时出现注册框。
-----------------------------------------------------------------------------------
4、0040A044～0040A077计算变换zest，取姓名的A个字符进行变换，不足A的用20代替，计算过
程见下面，我不写了，自己分析。
-----------------------------------------------------------------------------------
5、RegisterEncryptMode用来还原Register=-8625359。
如果ReadBook.ini的[File]无RegisterEncryptMode项，用GetDiskFreeSpaceA（C盘的）还原，
如有RegisterEncryptMode项，例如RegisterEncryptMode=1，则用GlobalMemoryStatus还原。
你可加上试试，注册码不变，但位于ReadBook.ini的[File]的Register值会变。
估计作者会改变RegisterEncryptMode的值来加密Register的值，但好像意义不大。
用GetDiskFreeSpaceA还原时返回值不知是什么，见0040A0E1～0040A0E4，是否是
total number of clusters on the disk和the number of sectors in a cluster on the disk
我的值是fff6和40，此外，进栈GetDiskFreeSpaceA的1234,8888等何用？请指教。
-----------------------------------------------------------------------------------
6、注册码有fff个，见0040A10F～0040A12F，运算查表计算。
-----------------------------------------------------------------------------------
7、注册码有误，会用WritePrivateProfileStringA删除临时加入ReadBook.ini/[File]的User
和Register项。
-----------------------------------------------------------------------------------
8、姓名：zest 部分注册码：2298970650 3507406439 65711848 316971046等
===================================================================================
* Possible StringData Ref from Data Obj ->"File"
|
:00409FAE BF98344600 mov edi, 00463498

* Possible StringData Ref from Data Obj ->"User"
|
:00409FB3 68A0384600 push 004638A0
:00409FB8 57 push edi
:00409FB9 E857D30000 call 00417315==>用GetPrivateProfileStringA找zest
:00409FBE 33DB xor ebx, ebx ==>清零ebx，eax=zest个数4
:00409FC0 83C41C add esp, 0000001C
:00409FC3 389D44FFFFFF cmp byte ptr [ebp+FFFFFF44], bl==>[ebp+FFFFFF44]=zest 7A 65 73 74
:00409FC9 756D jne 0040A038 ==>跳，不跳检查NowDay，略
......
......
......
:0040A038 8D8544FFFFFF lea eax, dword ptr [ebp+FFFFFF44]==>跳到此
:0040A03E 50 push eax ==>zest进栈
:0040A03F E8829B0200 call 00433BC6 big==>大写字母变小写
:0040A044 8B8548FFFFFF mov eax, dword ptr [ebp+FFFFFF48]==>20202000
:0040A04A 8B8D4CFFFFFF mov ecx, dword ptr [ebp+FFFFFF4C]==>20202020
:0040A050 8BB544FFFFFF mov esi, dword ptr [ebp+FFFFFF44]==>7473657A(zest)
:0040A056 03C1 add eax, ecx ==>得40404020
:0040A058 038550FFFFFF add eax, dword ptr [ebp+FFFFFF50]==>得60606040
:0040A05E 69F631750000 imul esi, 00007531 ==>得07772e5a
:0040A064 69C031750000 imul eax, 00007531 ==>得7e6fac40

* Possible StringData Ref from Data Obj ->"BIN_OR_TEXT"
|
:0040A06A C704240C334600 mov dword ptr [esp], 0046330C
:0040A071 68B5000000 push 000000B5
:0040A076 53 push ebx
:0040A077 2BF0 sub esi, eax ==>得8907821a 重要！

* Reference To: KERNEL32.FindResourceA, Ord:00A3h
|
:0040A079 FF1534124500 Call dword ptr [00451234]
:0040A07F 50 push eax
:0040A080 53 push ebx

* Reference To: KERNEL32.LoadResource, Ord:01C7h
|
:0040A081 FF153C124500 Call dword ptr [0045123C]

* Possible StringData Ref from Data Obj ->"Register"
|
:0040A087 6894384600 push 00463894
:0040A08C 57 push edi ==>d edi=file
:0040A08D 8945EC mov dword ptr [ebp-14], eax
:0040A090 E8A2D20000 call 00417337==>用GetPrivateProfileIntA取Register之值
==>eax=ff7c6331(dex=-8625359)

* Possible StringData Ref from Data Obj ->"RegisterEncryptMode"
|
:0040A095 6880384600 push 00463880==>开始变换
:0040A09A 57 push edi ==>d edi=file
:0040A09B 8945FC mov dword ptr [ebp-04], eax
:0040A09E C745F412320000 mov [ebp-0C], 00003212
:0040A0A5 C745E434120000 mov [ebp-1C], 00001234
:0040A0AC C745E888880000 mov [ebp-18], 00008888
:0040A0B3 C745F023230000 mov [ebp-10], 00002323
:0040A0BA E878D20000 call 00417337==>用GetPrivateProfileStringA找RegisterEncryptMode
:0040A0BF 83C410 add esp, 00000010
:0040A0C2 85C0 test eax, eax
:0040A0C4 7524 jne 0040A0EA ==>有值返回EAX跳，无，不跳
:0040A0C6 8D45F0 lea eax, dword ptr [ebp-10]==>00002323
:0040A0C9 50 push eax
:0040A0CA 8D45E8 lea eax, dword ptr [ebp-18]==>00008888
:0040A0CD 50 push eax
:0040A0CE 8D45E4 lea eax, dword ptr [ebp-1C]==>00001234
:0040A0D1 50 push eax
:0040A0D2 8D45F4 lea eax, dword ptr [ebp-0C]==>00003212
:0040A0D5 50 push eax

* Possible StringData Ref from Data Obj ->"C:\"
|
:0040A0D6 6860374600 push 00463760==>查C盘的

* Reference To: KERNEL32.GetDiskFreeSpaceA, Ord:0100h
|
:0040A0DB FF15F8114500 Call dword ptr [004511F8] ==>用GetDiskFreeSpaceA解密
:0040A0E1 8B45F0 mov eax, dword ptr [ebp-10] ==>fff6?
:0040A0E4 0FAF45F4 imul eax, dword ptr [ebp-0C]==>fff6×40?=3ffd80
:0040A0E8 EB19 jmp 0040A103

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A0C4(C)
|
:0040A0EA 8D45C4 lea eax, dword ptr [ebp-3C]
:0040A0ED C745C420000000 mov [ebp-3C], 00000020
:0040A0F4 50 push eax

* Reference To: KERNEL32.GlobalMemoryStatus, Ord:018Dh
|
:0040A0F5 FF15F0114500 Call dword ptr [004511F0]==>用GlobalMemoryStatus解密
:0040A0FB 8B45D0 mov eax, dword ptr [ebp-30]
:0040A0FE 05CCEDFFFF add eax, FFFFEDCC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A0E8(U)
|
:0040A103 F7D0 not eax ==>得ffc0027f
:0040A105 3145FC xor dword ptr [ebp-04], eax==>还原xor ff7c6331 ffc0027f
:0040A108 33C0 xor eax, eax ==>得bc614e(12345678)
:0040A10A A3FC544600 mov dword ptr [004654FC], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A12A(C)
|
:0040A10F 3975FC cmp dword ptr [ebp-04], esi ==>比较bc614e 8907821a
:0040A112 741D je 0040A131 ==>if the same jump good!
:0040A114 8B55EC mov edx, dword ptr [ebp-14] ==>表
:0040A117 8BC8 mov ecx, eax
:0040A119 83E17F and ecx, 0000007F ==>ecx<=7f
:0040A11C 03348A add esi, dword ptr [edx+4*ecx]==>+
:0040A11F 40 inc eax
:0040A120 3DFF0F0000 cmp eax, 00000FFF ==>比较fff次
:0040A125 A3FC544600 mov dword ptr [004654FC], eax
:0040A12A 72E3 jb 0040A10F
:0040A12C 3975FC cmp dword ptr [ebp-04], esi ==>最后比
:0040A12F 7547 jne 0040A178

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A112(C)
|
:0040A131 8B75F8 mov esi, dword ptr [ebp-08]
:0040A134 C705A8854B0001000000 mov dword ptr [004B85A8], 00000001
:0040A13E FF761C push [esi+1C]

* Reference To: USER32.GetMenu, Ord:011Ch
|
:0040A141 FF1598154500 Call dword ptr [00451598]
:0040A147 50 push eax
:0040A148 E81D1F0300 call 0043C06A
:0040A14D 53 push ebx

* Possible Ref to Menu: MenuID_0080, Item: "鑼(R)"
|
:0040A14E 6850800000 push 00008050
:0040A153 FF7004 push [eax+04]

* Reference To: USER32.RemoveMenu, Ord:0204h
|
:0040A156 FF158C154500 Call dword ptr [0045158C]
:0040A15C 391DAC854B00 cmp dword ptr [004B85AC], ebx
:0040A162 744C je 0040A1B0
:0040A164 53 push ebx

* Possible StringData Ref from Data Obj ->"祝贺"
|
:0040A165 6878384600 push 00463878

* Possible StringData Ref from Data Obj ->"您已经成功地注册了!"
|
:0040A16A 6864384600 push 00463864
:0040A16F 8BCE mov ecx, esi
:0040A171 E8B2F70200 call 00439928
:0040A176 EB38 jmp 0040A1B0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A12F(C)
|
:0040A178 53 push ebx

* Possible StringData Ref from Data Obj ->"User"
|
:0040A179 68A0384600 push 004638A0
:0040A17E 57 push edi
:0040A17F 891DA8854B00 mov dword ptr [004B85A8], ebx
:0040A185 E843D10000 call 004172CD==>注册不成功删除User项
:0040A18A 53 push ebx

* Possible StringData Ref from Data Obj ->"Register"
|
:0040A18B 6894384600 push 00463894
:0040A190 57 push edi
:0040A191 E837D10000 call 004172CD==>注册不成功删除Register项
:0040A196 8B45F8 mov eax, dword ptr [ebp-08]
:0040A199 83C418 add esp, 00000018
:0040A19C 53 push ebx

* Possible Ref to Menu: MenuID_0084, Item: "ID_VERIFY_RELEASE_ERROR"
|
:0040A19D 6853800000 push 00008053
:0040A1A2 6811010000 push 00000111
:0040A1A7 FF701C push [eax+1C]

* Reference To: USER32.PostMessageA, Ord:01DEh
|
:0040A1AA FF1528164500 Call dword ptr [00451628]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040A162(C), :0040A176(U)
|
:0040A1B0 891DAC854B00 mov dword ptr [004B85AC], ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00409FD1(C), :0040A000(C), :0040A00D(C), :0040A033(U)
|
:0040A1B6 5F pop edi
:0040A1B7 5E pop esi
:0040A1B8 5B pop ebx
:0040A1B9 C9 leave
:0040A1BA C3 ret

:0040A1BB 56 push esi
:0040A1BC 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"错了啦!"
|
:0040A1BE 68C8384600 push 004638C8
:0040A1C3 8BF1 mov esi, ecx

* Possible StringData Ref from Data Obj ->"注册码错误,请重新填写注册码!"
|
:0040A1C5 68A8384600 push 004638A8
:0040A1CA E859F70200 call 00439928
:0040A1CF 6A00 push 00000000

* Possible Ref to Menu: MenuID_0080, Item: "鑼(R)"
|
:0040A1D1 6850800000 push 00008050
:0040A1D6 6811010000 push 00000111
:0040A1DB FF761C push [esi+1C]

* Reference To: USER32.PostMessageA, Ord:01DEh
|
:0040A1DE FF1528164500 Call dword ptr [00451628]
:0040A1E4 5E pop esi
:0040A1E5 C3 ret

/\zest/\
2001.2.20


Recover4All v1.03

 标 题:Recover4All v1.03的破解探讨 (7千字)
发信人:superboss
时 间:2000-9-30 8:30:09
详细信息:
Recover4All v1.03的破解探讨
工具:TRW2000和Wdasm v8.93
目标说明:每个人一定都有曾不小心误删文件与目录的经验，通常要恢复误删文件有时是相当困难的，
不妨先试试 Recover 4 all 看看，它能将刚刚所删除的文件找出来，但必须在Win95/98
下所删除的文件，它才能找出并救回来.
难度：中级?
=======================================================
引子：这是一篇破解讨论性的文章，仅作为大家深入讨论的依据。

运行程序，输入Registration Name:sUpErbOss Registration Code:1122334455
按Ctrl-N切换到TRW2000下，打"BPX HMEMCPY"，点击“OK”按钮，被拦下,打"BD *"。
按几次F12键，回到Rec4All模组下，再一直按F10键，直到下面所指的重点(2)处：
:00411DE0 51 push ecx
:00411DE1 8BCD mov ecx, ebp
:00411DE3 E898A9FFFF call 0040C780
:00411DE8 50 push eax
:00411DE9 8D8C247C030000 lea ecx, dword ptr [esp+0000037C]
:00411DF0 C684243413000001 mov byte ptr [esp+00001334], 01
:00411DF8 E8B3220000 call 004140B0
:00411DFD 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:00411E04 C684243013000000 mov byte ptr [esp+00001330], 00
:00411E0C E8EF220000 call 00414100
:00411E11 8D83E8030000 lea eax, dword ptr [ebx+000003E8]
:00411E17 8D9424500B0000 lea edx, dword ptr [esp+00000B50]
:00411E1E 50 push eax
:00411E1F 52 push edx
:00411E20 8BCD mov ecx, ebp
:00411E22 E839B8FFFF call 0040D660
:00411E27 8DB340080000 lea esi, dword ptr [ebx+00000840]
:00411E2D 50 push eax
:00411E2E 8BCE mov ecx, esi
:00411E30 C684243413000002 mov byte ptr [esp+00001334], 02
:00411E38 E873220000 call 004140B0
:00411E3D 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:00411E44 C684243013000000 mov byte ptr [esp+00001330], 00
:00411E4C E8AF220000 call 00414100
:00411E51 81ECD8070000 sub esp, 000007D8
:00411E57 8BCC mov ecx, esp
:00411E59 89A424F4070000 mov dword ptr [esp+000007F4], esp
:00411E60 56 push esi
:00411E61 E82A220000 call 00414090
:00411E66 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:00411E6D E8FE200000 call 00413F70 <---重点(1)!!(比对升级码)
:00411E72 85C0 test eax, eax
:00411E74 0F858C000000 jne 00411F06
.
.
.
:00411F93 E8E8A7FFFF call 0040C780 <----此Call根据注册码经过变形算出一个数
:00411F98 50 push eax
:00411F99 8D8C247C030000 lea ecx, dword ptr [esp+0000037C]
:00411FA0 C684243413000003 mov byte ptr [esp+00001334], 03
:00411FA8 E803210000 call 004140B0
:00411FAD 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:00411FB4 C684243013000000 mov byte ptr [esp+00001330], 00
:00411FBC E83F210000 call 00414100
:00411FC1 8D83E8030000 lea eax, dword ptr [ebx+000003E8]
:00411FC7 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:00411FCE 50 push eax
:00411FCF 51 push ecx
:00411FD0 8BCD mov ecx, ebp
:00411FD2 E889B6FFFF call 0040D660 <----此Call根据Name经过变形算出一个数
:00411FD7 8DB340080000 lea esi, dword ptr [ebx+00000840]
:00411FDD 50 push eax
:00411FDE 8BCE mov ecx, esi
:00411FE0 C684243413000004 mov byte ptr [esp+00001334], 04
:00411FE8 E8C3200000 call 004140B0
:00411FED 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:00411FF4 C684243013000000 mov byte ptr [esp+00001330], 00
:00411FFC E8FF200000 call 00414100
:00412001 81ECD8070000 sub esp, 000007D8
:00412007 8BCC mov ecx, esp
:00412009 89A424F4070000 mov dword ptr [esp+000007F4], esp
:00412010 56 push esi
:00412011 E87A200000 call 00414090
:00412016 8D8C24500B0000 lea ecx, dword ptr [esp+00000B50]
:0041201D E84E1F0000 call 00413F70 <---重点(2)!!(比对注册码）
:00412022 85C0 test eax, eax <---注册成功的话，EAX=0
:00412024 7566 jne 0041208C

进入重点Call(2)后，按F10键，一直往下，来到核心Call，可别三心二意跑过站喽！按F8键吧!!
:00413FD2 50 push eax
:00413FD3 E848FAFFFF call 00413A20 <------核心Call哦!!
:00413FD8 8D4C2418 lea ecx, dword ptr [esp+18]
:00413FDC 8BF0 mov esi, eax <----注册码正确的话,ESI=EAX=0
:00413FDE C7442410FFFFFFFF mov [esp+10], FFFFFFFF
:00413FE6 E815010000 call 00414100
:00413FEB 8BC6 mov eax, esi <----EAX=ESI=0
:00413FED 8B4C2408 mov ecx, dword ptr [esp+08]
:00413FF1 64890D00000000 mov dword ptr fs:[00000000], ecx
:00413FF8 5F pop edi
:00413FF9 5E pop esi
:00413FFA 83C40C add esp, 0000000C
:00413FFD C2D807 ret 07D8

进入到核心Call后，按F10键往下走，就到站啦！
:00413A59 56 push esi
:00413A5A 8BCF mov ecx, edi
:00413A5C 8BE8 mov ebp, eax
:00413A5E E81DFCFFFF call 00413680 <----注意哦!!
:00413A63 3BC5 cmp eax, ebp <----变形后的注册码比对处
:00413A65 77CD ja 00413A34 ---->必须满足EAX=EBP<----
:00413A67 56 push esi
:00413A68 8BCB mov ecx, ebx
:00413A6A E811FCFFFF call 00413680 <----注意哦!!
:00413A6F 56 push esi
:00413A70 8BCF mov ecx, edi
:00413A72 8BE8 mov ebp, eax
:00413A74 E807FCFFFF call 00413680 <----注意哦!!
:00413A79 3BC5 cmp eax, ebp <---变形后的注册码比对处
:00413A7B 72C5 jb 00413A42 ---->必须满足EAX=EBP<----
:00413A7D 85F6 test esi, esi <---有两组变形码比对！
:00413A7F 75CF jne 00413A50

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00413A4E(C)
|
:00413A81 5F pop edi
:00413A82 5E pop esi
:00413A83 5D pop ebp
:00413A84 33C0 xor eax, eax <----EAX=0
:00413A86 5B pop ebx
:00413A87 C20400 ret 0004

====================================
:00413680 8B442404 mov eax, dword ptr [esp+04] <---Call 00413680的内容
:00413684 8B5108 mov edx, dword ptr [ecx+08]
:00413687 3BC2 cmp eax, edx
:00413689 7205 jb 00413690
:0041368B 33C0 xor eax, eax
:0041368D C20400 ret 0004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00413689(C)
|
:00413690 8B09 mov ecx, dword ptr [ecx]
:00413692 8B0481 mov eax, dword ptr [ecx+4*eax] <---打"D ECX+4*EAX"
:00413695 C20400 ret 0004

在00413692处，记下ECX+4*EAX所表示的地址。（注意：必须是在启动Rec4All，第一次点击"OK"按钮后，跟踪到此处时的地址值）
Why？因为每次重新按"OK"按钮跟踪Rec4All时，此处的地址是变动的，所以很难设置正确的断点。但每次启动Rec4All，
第一次点击"OK"按钮后，此处的地址值是相同的。
我研究了很长时间，也没把它的算法搞清楚，希望网上的各位高手，能给予指点，先谢过啦！


RegEditor V1.2

标 题:本人超级奉献!初学者如果看得明白就是入门直径! bye! (16千字)
发信人:peterchen
时 间:2001-4-9 3:31:55
详细信息:

软件名称： RegEditor V1.2
软件分类： DOWNME首页=>软件下载=>系统工具=>注册表管理
软件设计： A. Chabanenko.
软件主页： http://www.utils32.com/products.htm
联系邮件： nit@aip.mk.ua
授权方式： 共享软件
更新时间： 2001-04-05
操作系统： Windows 95/98/NT/2000
试用限制： 30天
购买金额： ＄20.00
软件大小： 451KB
星级评定： ★★★★★
图片预览： 点击这里查看软件图片
软件简介： RegEditor 是一个注册表编辑工具，它可以用于 Registry 4 (REGEDIT4)的文件格式对 Windows 95/98 的注册表进行修改。RegEditor 还支持多语种的系统。
http://www.downme.com/download/3864regeditr.zip

------------------------------------------------------------------------------------
这些过程是总结小弟这几年来的Cracker经验之谈!也是最完整一篇了!
破解密码篇：
谁说明破解没有直径？不过不叫直径而叫经验罢了？
只要你多看一些别人的经验有“拿来主义”总结分析
得到变成自己的新经验就是直径了：
以下就是证明：
旧方法：
F12---->17次
F8----->15次
结果:32次
常用法:
pmodule
F10----->72次
结果:72次
个人法:
pmodule
F12---->10次
F10---->8次
结果:18次
就能来到这个错误call!
0167:0047A64F CALL 00454F50
0167:0047A654 TEST AL,AL
0167:0047A656 JZ 0047A681
0167:0047A658 MOV EAX,[EBP-04]
0167:0047A65B CALL 004701DC//------->关键call!
0167:0047A660 TEST AL,AL
0167:0047A662 JZ 0047A677
0167:0047A664 MOV EAX,0047A6EC
0167:0047A669 CALL 00454F2C
0167:0047A66E MOV EAX,EBX
0167:0047A670 CALL 0044AF84
0167:0047A675 JMP SHORT 0047A681
0167:0047A677 MOV EAX,0047A710
0167:0047A67C CALL 00454F2C//--------->出来错误提示！
看到没有我个人方法多么的快？我一向破解也是采用这样的方法，
只要pmodule能用，把旧方法和常用法方法结合就是一种新方法也是新一种经验?
为什么还要用F12了，小弟没有什么编程的技术只是在学校学过Foxbase2.5！
ret是主要流程，也是主要的得的干骨！什么还不明白？
就用一颗树干，你从这里开始找就能快速的找到枝叶（分支流程）！
哪如何找到树干了？你把要用F12了记一下出现第一次提示的次数
-1再用F10就找到枝叶！小弟用此方法不到一分钟就把注册码破解出来！
----------------------------------------------------------------------
:004701DC 55 push ebp//------------->1
----------------------------------------------------------------------
EAX=00C0A168=78787878
----------------------------------------------------------------------
:00403ED8 53 push ebx
:00403ED9 56 push esi
:00403EDA 57 push edi
:00403EDB 89C6 mov esi, eax
:00403EDD 89D7 mov edi, edx
:00403EDF 39D0 cmp eax, edx//-------->2
----------------------------------------------------------------------
SN=EAX=61C8-064B-FE37
EDI=EDX=00C0A168=78787878
----------------------------------------------------------------------
:00403EE1 0F848F000000 je 00403F76
:00403EE7 85F6 test esi, esi
:00403EE9 7468 je 00403F53
:00403EEB 85FF test edi, edi
:00403EED 746B je 00403F5A
:00403EEF 8B46FC mov eax, dword ptr [esi-04]
:00403EF2 8B57FC mov edx, dword ptr [edi-04]
:00403EF5 29D0 sub eax, edx
:00403EF7 7702 ja 00403EFB
:00403EF9 01C2 add edx, eax
:004701DD 8BEC mov ebp, esp
:004701DF 83C4EC add esp, FFFFFFEC
:004701E2 33D2 xor edx, edx
:004701E4 8955F0 mov dword ptr [ebp-10], edx
:004701E7 8955EC mov dword ptr [ebp-14], edx
:004701EA 8945FC mov dword ptr [ebp-04], eax
:004701ED 8B45FC mov eax, dword ptr [ebp-04]
:004701F0 E8873DF9FF call 00403F7C
----------------------------------------------------------------------
:0047020E 8D55F0 lea edx, dword ptr [ebp-10]//----->3
ID=EAX=00CF4F8=6600-0183-F9FF
ss:[6DF364]=00C0F5B4=SN=61C8-064B-FE37
----------------------------------------------------------------------
:0047020E 8D55F0 lea edx, dword ptr [ebp-10]
:00470211 E8D2FBFFFF call 0046FDE8
:00470216 8B45F0 mov eax, dword ptr [ebp-10]//------>4
----------------------------------------------------------------------
ID=EDX=00CF4F8=6600-0183-F9FF
ss:[6DF364]=00C0F5B4=SN=61C8-064B-FE37
----------------------------------------------------------------------
:00470219 8B55FC mov edx, dword ptr [ebp-04]//------>5
----------------------------------------------------------------------
SN=EAX=61C8-064B-FE37
ss:[6DF370]=00C0A168=78787878
----------------------------------------------------------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004701A4(C)
|
:0047021C E8B73CF9FF call 00403ED8//----------->6
--------------------------------------------------------------------
EDX=00C0A168=78787878
EAX=00C0F5B4=SN=61C8-064B-FE37
---------------------------------------------------------------------
:00470221 0F9445FB sete byte ptr [ebp-05]
:00470225 807DFB00 cmp byte ptr [ebp-05], 00
:00470229 7469 je 00470294
:0047022B B201 mov dl, 01
:0047022D A1C0EE4600 mov eax, dword ptr [0046EEC0]
:00470232 E889EDFFFF call 0046EFC0
:00470237 8945F4 mov dword ptr [ebp-0C], eax
:0047023A 33C0 xor eax, eax
:0047023C 55 push ebp
:0047023D 688D024700 push 0047028D
:00470242 64FF30 push dword ptr fs:[eax]
:00470245 648920 mov dword ptr fs:[eax], esp
:00470248 BA02000080 mov edx, 80000002
:0047024D 8B45F4 mov eax, dword ptr [ebp-0C]
:00470250 E80BEEFFFF call 0046F060
:00470255 33C9 xor ecx, ecx
:00470257 BAD0024700 mov edx, 004702D0
:0047025C 8B45F4 mov eax, dword ptr [ebp-0C]
:0047025F E864EEFFFF call 0046F0C8
:00470264 84C0 test al, al
:00470266 740F je 00470277
:00470268 B920034700 mov ecx, 00470320
:0047026D 33D2 xor edx, edx
:0047026F 8B45F4 mov eax, dword ptr [ebp-0C]
:00470272 E845F4FFFF call 0046F6BC
:00470211 E8D2FBFFFF call 0046FDE8
:00470216 8B45F0 mov eax, dword ptr [ebp-10]
:00470219 8B55FC mov edx, dword ptr [ebp-04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004701A4(C)
|
:0047021C E8B73CF9FF call 00403ED8
:00470221 0F9445FB sete byte ptr [ebp-05]
:00470225 807DFB00 cmp byte ptr [ebp-05], 00
:00470229 7469 je 00470294
:0047022B B201 mov dl, 01
:0047022D A1C0EE4600 mov eax, dword ptr [0046EEC0]
:00470232 E889EDFFFF call 0046EFC0
:00470237 8945F4 mov dword ptr [ebp-0C], eax
:0047023A 33C0 xor eax, eax
:0047023C 55 push ebp
:0047023D 688D024700 push 0047028D
:00470242 64FF30 push dword ptr fs:[eax]
:00470245 648920 mov dword ptr fs:[eax], esp
:00470248 BA02000080 mov edx, 80000002
:0047024D 8B45F4 mov eax, dword ptr [ebp-0C]
:00470250 E80BEEFFFF call 0046F060
:00470255 33C9 xor ecx, ecx
:00470257 BAD0024700 mov edx, 004702D0
:0047025C 8B45F4 mov eax, dword ptr [ebp-0C]
:0047025F E864EEFFFF call 0046F0C8
:00470264 84C0 test al, al
:00470266 740F je 00470277
:00470268 B920034700 mov ecx, 00470320
:0047026D 33D2 xor edx, edx
:0047026F 8B45F4 mov eax, dword ptr [ebp-0C]
:00470272 E845F4FFFF call 0046F6BC
----------------------------------------------------------------------
crackcode2000注册机篇：
第一种：
[Options]
CommandLine=regeditor.exe
Mode=2
First_Break_Address=403EDF
First_Break_Address_Code=39
First_Break_Address_Code_Lenth=2
Save_Code_Address=edx

第二种：
[Options]
CommandLine=regeditor.exe
Mode=0
First_Break_Address=470219
First_Break_Address_Code=8B
First_Break_Address_Code_Lenth=2
Save_Code_Address=EAX

第三种：
[Options]
CommandLine=regeditor.exe
Mode=3
First_Break_Address=403EDF
First_Break_Address_Code=39
First_Break_Address_Code_Lenth=2
Save_Code_Address=edx
(以上It's very cool!Why?注册码错误也成功注册!不信你重启就成的注册版
不过就是用它注册所以文字都失踪不过也能注册!)
相信连我师傅也可能不知道有这么利害的功能？!哈。。。哈！

HKEY_LOCAL_MACHINE\
Software\CLASSES\
CLSID\
{A4E78360-03CA-11D4-9395-981897B1F059}\
Version\[(默认)FFFF]---->删除这个值又变回未注册版!
^^^^^
注册表暴力把它的变成FFFF就是注册版!
----------------------------------------------------------------------
暴力破解窗口篇：
0167:0047AA98 E87F54FFFF CALL 0046FF1C
0167:0047AA9D 84C0 TEST AL,AL
0167:0047AA9F 7553 JNZ 0047AAF4//----jz
0167:0047AAA1 8B0D04C24700 MOV ECX,[0047C204]
0167:0047AAA7 8B09 MOV ECX,[ECX]
0167:0047AAA9 B201 MOV DL,01
0167:0047AAAB A1BCA34700 MOV EAX,[0047A3BC]
0167:0047AAB0 E8EFC6FCFF CALL 004471A4
0167:0047AAB5 A358D94700 MOV [0047D958],EAX
0167:0047AABA 33C0 XOR EAX,EAX
0167:0047AABC 55 PUSH EBP
0167:0047AABD 68EDAA4700 PUSH DWORD 0047AAED
0167:0047AAC2 64FF30 PUSH DWORD [FS:EAX]
0167:0047AAC5 648920 MOV [FS:EAX],ESP
0167:0047AAC8 A158D94700 MOV EAX,[0047D958]
0167:0047AACD 8B10 MOV EDX,[EAX]
0167:0047AACF FF92D8000000 CALL NEAR [EDX+D8]//---->注册提示窗!
0167:0047AAD5 33C0 XOR EAX,EAX
但仍然在退出时出现没有未注册提示,这个提示非常难破解!
-----------------------------------------------------------------------
自动脱壳篇：
工具:fi(三个版) and fs [测壳工具],Procdump32162(脱壳工具)
-----------------------------------------------------------------------
测试结果：
UPX v0.94 (■PE) ObHu/Molnar UPX\
UPX v0.93 (■PE) Bl.Panther UPX fi
UPX v0.94 (■PE) ObHu/Molnar UPX/
pe/exe.packer UPX 0.82-1.01 (type 2)-----unpacker (fs)
用"pr"选upx一会就脱壳成功！
-----------------------------------------------------------------------
手动脱壳篇：
参考：
----------------------------------------------------------------------
chm帮助编辑器v2.6 注册码破解详谈之一*脱壳篇*
其实没这个必要,是应peterchen要求所写!
就先说说软件的脱壳吧!它用upx加壳.
第一种脱壳方法:trw+冲击波0.2
启动冲击波,点击Trace,然后运行要脱壳的软件,此时冲击波会显示一个数值(这里应该是00488C78),这
就是程序的入口.
trw载入文件,Ctrl+N,
g 00488C78
MakePe 或 pedump
脱壳成功!

第二种脱壳方法:只用trw.
用trw载入程序,选择加载,这时TRW弹出,按一次F10,程序来到这里:
:004BA000 60 pushad
:004BA001 E800000000 call 004BA006
一直按F10运行到上面这一行,注意这个call一定要进去,因为你再按一次F10的话,程序就运行了!
于是按F8进入:
* Referenced by a CALL at Address:
|:004BA001
|
:004BA006 83CDFF or ebp, FFFFFFFF
:004BA009 31DB xor ebx, ebx
:004BA00B 5E pop esi
:004BA00C 8DBEFA6FF4FF lea edi, dword ptr [esi+FFF46FFA]
:004BA012 57 push edi
:004BA013 668187F4830B000100 add word ptr [edi+000B83F4], 0001
:004BA01C 81C6B3010000 add esi, 000001B3
:004BA022 EB0A jmp 004BA02E

到了这里,再继续按F10跳转到 004BA02E,继续跟踪

:004BA02E 01DB add ebx, ebx
:004BA030 7507 jne 004BA039
:004BA032 8B1E mov ebx, dword ptr [esi]
:004BA034 83EEFC sub esi, FFFFFFFC
:004BA037 11DB adc ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA030(C)
|
:004BA039 72ED jb 004BA028
:004BA03B B801000000 mov eax, 00000001

在004BA039这一行程序将*向上*跳到004BA028,进行循环解压,而我们没有必要跟着它走,所以将光标
定位于004BA03B,按F7,这样就省去了许多步骤了,接着软件还会有很多类似于这里的地方,都可以用这
种方法跳过去.若是程序向下跳跃的时候,就不要多此一举了,让它跳就是了,还要注意的是按F7前,最好
先在跳转的地方设个断点,再bd掉,这样即使判断错误,也还有的救,be就可以了继续跟踪了.继续向下走:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BA04F(C), :004BA05A(C)
|
:004BA040 01DB add ebx, ebx
:004BA042 7507 jne 004BA04B \\这里会*向下*跳转,让它跳就是了.
:004BA044 8B1E mov ebx, dword ptr [esi]
:004BA046 83EEFC sub esi, FFFFFFFC
:004BA049 11DB adc ebx, ebx

这两种情况已经明白了吧!那我就省去一些了.
来到这里

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA177(C)
|
:004BA18A 240F and al, 0F
:004BA18C C1E010 shl eax, 10
:004BA18F 668B07 mov ax, word ptr [edi]
:004BA192 83C702 add edi, 00000002
:004BA195 EBE2 jmp 004BA179

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA173(C)
|
:004BA197 61 popad 运行到这里以后看看下面这个跳转
:004BA198 E9DBEAFCFF jmp 00488C78 //这里程序便完成来内存中的解工作,
将要跳到程序入口点00488C78
然后就来到了这里:
00488C78 PUSH EBP //在这里下MAKEPE命令(但我的TRW经常出错,Why)或是Pedump
00488C79 MOV EBP,ESP 但若你用了Pedump那脱壳后的文件将不能在其它操作系统和
其它机器上运行!
--------------------------------------------------------------------------
工具:trw2000,Bw2k02(冲击波)
惜助工具脱壳：
1.把"bw" copy 到你要脱壳的软件目录中
2.先启动它
3.再启动要脱壳的软件
使用法：
Track: 开始进行跟踪，然后运行要跟踪的程序.
找到入口点后，会在Enter point 显示.
Stop : 停止跟踪
Exit : 退出
我的epo是0047AA50
用trw2000，ctrl+n
g 47aa50
PEDUMP
为什么不用MAKEPE?我也与TAE!一样！
----------------------------------------------------------------------
0167:004A87FB ADD EBX,BYTE +04--------->F9
0167:004A87FE JMP SHORT 004A87E1//----->注意这里是环循？
0167:004A8800 CALL NEAR [ESI+000A96DC]--->来到这里就显示注册窗！
0167:004A8806 ADD EDI,BYTE +04-------->光标放在这里按F7!
为什么要这样做了？由于来到环循点不可能让跳回去要向下走才行，为了怕
判定之误所以要中断不然又要再来！这里就什么搞鬼？可逼非回去不可也就
是不给你脱壳！所以只要发现你跳下一行就让注册窗提早出来！这也是
程序流程的定律！不过你只要一下跳多一行就行了！
------------------------------------------------------------------------
0167:004A8832 ADD EDI,BYTE +02
0167:004A8835 JMP SHORT 004A8819
0167:004A8837 POPA//----------->非常明显的标志!
0167:004A8838 JMP 0047AA50
-----------------------------------------------------------------------
0167:0047AA50 PUSH EBP//----------->真正的入口点!不过要注意不要把光标
0167:0047AA51 MOV EBP,ESP 不然这个入口点变样!不是如此还有
0167:0047AA53 ADD ESP,BYTE -0C 汇编我不知道你有没有看台湾火大客
0167:0047AA56 MOV EAX,0047A7F8 加、脱壳教程，也许是加了壳所以有
0167:0047AA5B CALL 004065E0 这样的变化！
0167:0047AA60 MOV EAX,[0047C204]
0167:0047AA65 MOV EAX,[EAX]
0167:0047AA67 CALL 0044E138
0167:0047AA6C MOV EAX,[0047C204]
0167:0047AA71 MOV EAX,[EAX]
0167:0047AA73 ADD EAX,BYTE +40
0167:0047AA76 MOV EDX,0047AB10
0167:0047AA7B CALL 00403B9C
0167:0047AA80 MOV ECX,[0047C058]
0167:0047AA86 MOV EAX,[0047C204]
0167:0047AA8B MOV EAX,[EAX]
0167:0047AA8D MOV EDX,[00477330]
0167:0047AA93 CALL 0044E150
0167:0047AA98 CALL 0046FF1C
0167:0047AA9D 84C0 TEST AL,AL
0167:0047AA9F 7553 JNZ 0047AAF4//----jz
0167:0047AAA1 8B0D04C24700 MOV ECX,[0047C204]
0167:0047AAA7 8B09 MOV ECX,[ECX]
0167:0047AAA9 B201 MOV DL,01
0167:0047AAAB A1BCA34700 MOV EAX,[0047A3BC]
0167:0047AAB0 E8EFC6FCFF CALL 004471A4
0167:0047AAB5 A358D94700 MOV [0047D958],EAX
0167:0047AABA 33C0 XOR EAX,EAX
0167:0047AABC 55 PUSH EBP
0167:0047AABD 68EDAA4700 PUSH DWORD 0047AAED
0167:0047AAC2 64FF30 PUSH DWORD [FS:EAX]
0167:0047AAC5 648920 MOV [FS:EAX],ESP
0167:0047AAC8 A158D94700 MOV EAX,[0047D958]
0167:0047AACD 8B10 MOV EDX,[EAX]
0167:0047AACF FF92D8000000 CALL NEAR [EDX+D8]//---->注册提示窗!
0167:0047AAD5 33C0 XOR EAX,EAX
但仍然在退出时出现没有未注册提示,这个提示非常难破解!
-----------------------------------------------------------------------
自动脱壳篇：
工具:fi(三个版) and fs [测壳工具],Procdump32162(脱壳工具)
-----------------------------------------------------------------------
测试结果：
UPX v0.94 (■PE) ObHu/Molnar UPX\
UPX v0.93 (■PE) Bl.Panther UPX fi
UPX v0.94 (■PE) ObHu/Molnar UPX/
pe/exe.packer UPX 0.82-1.01 (type 2)-----unpacker (fs)
用"pr"选upx一会就脱壳成功！
-----------------------------------------------------------------------
手动脱壳篇：
参考：
----------------------------------------------------------------------
chm帮助编辑器v2.6 注册码破解详谈之一*脱壳篇*
其实没这个必要,是应peterchen要求所写!
就先说说软件的脱壳吧!它用upx加壳.
第一种脱壳方法:trw+冲击波0.2
启动冲击波,点击Trace,然后运行要脱壳的软件,此时冲击波会显示一个数值(这里应该是00488C78),这
就是程序的入口.
trw载入文件,Ctrl+N,
g 00488C78
MakePe 或 pedump
脱壳成功!

第二种脱壳方法:只用trw.
用trw载入程序,选择加载,这时TRW弹出,按一次F10,程序来到这里:
:004BA000 60 pushad
:004BA001 E800000000 call 004BA006
一直按F10运行到上面这一行,注意这个call一定要进去,因为你再按一次F10的话,程序就运行了!
于是按F8进入:
* Referenced by a CALL at Address:
|:004BA001
|
:004BA006 83CDFF or ebp, FFFFFFFF
:004BA009 31DB xor ebx, ebx
:004BA00B 5E pop esi
:004BA00C 8DBEFA6FF4FF lea edi, dword ptr [esi+FFF46FFA]
:004BA012 57 push edi
:004BA013 668187F4830B000100 add word ptr [edi+000B83F4], 0001
:004BA01C 81C6B3010000 add esi, 000001B3
:004BA022 EB0A jmp 004BA02E

到了这里,再继续按F10跳转到 004BA02E,继续跟踪

:004BA02E 01DB add ebx, ebx
:004BA030 7507 jne 004BA039
:004BA032 8B1E mov ebx, dword ptr [esi]
:004BA034 83EEFC sub esi, FFFFFFFC
:004BA037 11DB adc ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA030(C)
|
:004BA039 72ED jb 004BA028
:004BA03B B801000000 mov eax, 00000001

在004BA039这一行程序将*向上*跳到004BA028,进行循环解压,而我们没有必要跟着它走,所以将光标
定位于004BA03B,按F7,这样就省去了许多步骤了,接着软件还会有很多类似于这里的地方,都可以用这
种方法跳过去.若是程序向下跳跃的时候,就不要多此一举了,让它跳就是了,还要注意的是按F7前,最好
先在跳转的地方设个断点,再bd掉,这样即使判断错误,也还有的救,be就可以了继续跟踪了.继续向下走:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BA04F(C), :004BA05A(C)
|
:004BA040 01DB add ebx, ebx
:004BA042 7507 jne 004BA04B \\这里会*向下*跳转,让它跳就是了.
:004BA044 8B1E mov ebx, dword ptr [esi]
:004BA046 83EEFC sub esi, FFFFFFFC
:004BA049 11DB adc ebx, ebx

这两种情况已经明白了吧!那我就省去一些了.
来到这里

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA177(C)
|
:004BA18A 240F and al, 0F
:004BA18C C1E010 shl eax, 10
:004BA18F 668B07 mov ax, word ptr [edi]
:004BA192 83C702 add edi, 00000002
:004BA195 EBE2 jmp 004BA179

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA173(C)
|
:004BA197 61 popad 运行到这里以后看看下面这个跳转
:004BA198 E9DBEAFCFF jmp 00488C78 //这里程序便完成来内存中的解工作,
将要跳到程序入口点00488C78
然后就来到了这里:
00488C78 PUSH EBP //在这里下MAKEPE命令(但我的TRW经常出错,Why)或是Pedump
00488C79 MOV EBP,ESP 但若你用了Pedump那脱壳后的文件将不能在其它操作系统和
其它机器上运行!
--------------------------------------------------------------------------
工具:trw2000,Bw2k02(冲击波)
惜助工具脱壳：
1.把"bw" copy 到你要脱壳的软件目录中
2.先启动它
3.再启动要脱壳的软件
使用法：
Track: 开始进行跟踪，然后运行要跟踪的程序.
找到入口点后，会在Enter point 显示.
Stop : 停止跟踪
Exit : 退出
我的epo是0047AA50
用trw2000，ctrl+n
g 47aa50
PEDUMP
为什么不用MAKEPE?我也与TAE!一样！
----------------------------------------------------------------------
0167:004A87FB ADD EBX,BYTE +04--------->F9
0167:004A87FE JMP SHORT 004A87E1//----->注意这里是环循？
0167:004A8800 CALL NEAR [ESI+000A96DC]--->来到这里就显示注册窗！
0167:004A8806 ADD EDI,BYTE +04-------->光标放在这里按F7!
为什么要这样做了？由于来到环循点不可能让跳回去要向下走才行，为了怕
判定之误所以要中断不然又要再来！这里就什么搞鬼？可逼非回去不可也就
是不给你脱壳！所以只要发现你跳下一行就让注册窗提早出来！这也是
程序流程的定律！不过你只要一下跳多一行就行了！
------------------------------------------------------------------------
0167:004A8832 ADD EDI,BYTE +02
0167:004A8835 JMP SHORT 004A8819
0167:004A8837 POPA//----------->非常明显的标志!
0167:004A8838 JMP 0047AA50
-----------------------------------------------------------------------
0167:0047AA50 PUSH EBP//----------->真正的入口点!不过要注意不要把光标
0167:0047AA51 MOV EBP,ESP 不然这个入口点变样!不是如此还有
0167:0047AA53 ADD ESP,BYTE -0C 汇编我不知道你有没有看台湾火大客
0167:0047AA56 MOV EAX,0047A7F8 加、脱壳教程，也许是加了壳所以有
0167:0047AA5B CALL 004065E0 这样的变化！
0167:0047AA60 MOV EAX,[0047C204]
0167:0047AA65 MOV EAX,[EAX]
0167:0047AA67 CALL 0044E138
0167:0047AA6C MOV EAX,[0047C204]
0167:0047AA71 MOV EAX,[EAX]
0167:0047AA73 ADD EAX,BYTE +40
0167:0047AA76 MOV EDX,0047AB10
0167:0047AA7B CALL 00403B9C
0167:0047AA80 MOV ECX,[0047C058]
0167:0047AA86 MOV EAX,[0047C204]
0167:0047AA8B MOV EAX,[EAX]
0167:0047AA8D MOV EDX,[00477330]
0167:0047AA93 CALL 0044E150
0167:0047AA98 CALL 0046FF1C
0167:0047AA9D TEST AL,AL
0167:0047AA9F JNZ 0047AAF4
0167:0047AAA1 MOV ECX,[0047C204]
0167:0047AAA7 MOV ECX,[ECX]
0167:0047AAA9 MOV DL,01
0167:0047AAAB MOV EAX,[0047A3BC]
0167:0047AAB0 CALL 004471A4
0167:0047AAB5 MOV [0047D958],EAX
0167:0047AABA XOR EAX,EAX
0167:0047AABC PUSH EBP
0167:0047AABD PUSH DWORD 0047AAED
0167:0047AAC2 PUSH DWORD [FS:EAX]
0167:0047AAC5 MOV [FS:EAX],ESP
0167:0047AAC8 MOV EAX,[0047D958]
0167:0047AACD MOV EDX,[EAX]
0167:0047AACF CALL NEAR [EDX+D8]//------------------->注册提示窗口出来了！
------------------------------------------------------------------------------
真奇怪为什么用不了makepe?有谁成功过用过指导一些用法！Thanks!
是Delphi所编,当是脱壳后有dede反汇编比w32dsm89还要差?
w32dwm89出现乱码多,dede反译内容极少!
也许是小弟不会它吧？请会用它的朋友试一试反译一些此软件看一看
是小弟不会用还是软件本身不能反译?
dede2.5full!


register PC_Shield 1.0

 标 题:register PC_Shield 1.0 (3千字)
发信人:6767[BCG]
时 间:2001-7-22 12:09:02
详细信息:
PC_Shield 1.0
by 6767 [BCG]

d/l @csdn
tools:Trw2000

Functions: Pc system protection

the Tutors:

将其释放到某一目录下，运行(它的运行比较慢，耐心等)，没有注册窗；退出，再运行，打开注册窗，随便输入：LazyUser-12365498788(注意：其中的‘-’不要输)，先不要点确定。运行trw，下中断Bpx hmemcpy。回来，点确定，被拦下。按一次F5，仍被拦。下BD *阻断点，小心的跟踪到下面：

... ...
017F:0041030B INC DWORD [EBP-4C]
017F:0041030E LEA EDX,[EBP-2C]
017F:00410311 POP EAX
017F:00410312 CALL 0048A658 <- 检查是否有输入，不用管它
017F:00410317 TEST AL,AL
017F:00410319 SETNZ CL
017F:0041031C AND ECX,BYTE +01
017F:0041031F PUSH ECX

017F:00410320 DEC DWORD [EBP-4C]
017F:00410323 LEA EAX,[EBP-2C]
017F:00410326 MOV EDX,02
017F:0041032B CALL 0048A588
017F:00410330 DEC DWORD [EBP-4C]
017F:00410333 LEA EAX,[EBP-28]
017F:00410336 MOV EDX,02
017F:0041033B CALL 0048A588

017F:00410340 POP ECX
017F:00410341 TEST ECX,ECX
017F:00410343 JNZ 00410356 <- 这里不会跳

017F:00410345 PUSH DWORD [EBP-04]
017F:00410348 CALL 004104FC <- 这里可疑，追进去
017F:0041034D POP ECX
017F:0041034E TEST EAX,EAX
017F:00410350 JZ 00410356
017F:00410352 XOR EAX,EAX <- 置标志
017F:00410354 JMP SHORT 0041035B
017F:00410356 MOV EAX,01 <- 置标志
017F:0041035B PUSH EAX
... ...

追进那个call，小心的跟踪到下面：

... ...
017F:0041067D MOV ECX,004932B0
017F:00410682 LEA EDX,[EBP-0C] <- 放加密后的结果
017F:00410685 MOV EAX,[EBP-04] <- 对你输入的前一部分变换，看这个call的名字
017F:00410688 CALL `PCSHIELD!@Gost@GOSTEncryptStr$qqrx17System@AnsiStringr17System@AnsiStringpxui`

017F:0041068D LEA EDX,[EBP-08] <- 你输入的注册码的后一部分
017F:00410690 LEA EAX,[EBP-0C] <- 加密结果
017F:00410693 CALL 0048A658 <- 显然是比较啦
017F:00410698 TEST AL,AL <- 测试出口，下面不重要了
017F:0041069A JZ 004106EF
017F:0041069C MOV EAX,01
017F:004106A1 PUSH EAX
017F:004106A2 DEC DWORD [EBP-20]
017F:004106A5 LEA EAX,[EBP-0C]
017F:004106A8 MOV EDX,02
017F:004106AD CALL 0048A588
017F:004106B2 DEC DWORD [EBP-20]
017F:004106B5 LEA EAX,[EBP-08]
017F:004106B8 MOV EDX,02
017F:004106BD CALL 0048A588
017F:004106C2 DEC DWORD [EBP-20]
017F:004106C5 LEA EAX,[EBP-04]
017F:004106C8 MOV EDX,02
017F:004106CD CALL 0048A588
017F:004106D2 DEC DWORD [EBP-20]
017F:004106D5 LEA EAX,[EBP+08]
017F:004106D8 MOV EDX,02
017F:004106DD CALL 0048A588
017F:004106E2 POP EAX
017F:004106E3 MOV EDX,[EBP-3C]
017F:004106E6 MOV [FS:00],EDX
017F:004106ED JMP SHORT 0041073D
017F:004106EF XOR EAX,EAX
017F:004106F1 PUSH EAX
... ...

好了，一个可用的码是：LazyUser-ScHY2RIhBhd。这个好用，记着，如果你不想用这个软件，不要点应用，这样注册结果不会被保存，否则给你的系统保护上，不方便而且也不能继续注册了。


Registering Trojan Remover 4.2.1

标 题:Registering Trojan Remover 4.2.1 (14千字)
发信人:CoolBob[CCG]
时 间:2001-4-16 23:46:25
详细信息:
Registering Trojan Remover 4.2.1
1、下载地址：http://www.simplysup.com/tremover/
2、大小：1430Kb
3、破解工具: SoftICE 4.05,TRW2000,Win32dasm 8.93,Hiew 6.40
4、软件简介: 是一款查杀木马的相当流行的工具，这是最新版本。
主程序用ASPack压缩过，程序是用Dephi 3.0写成，主程序只有197K,脱壳后居然有1.08Mb。
用Win32dasm反汇编后看到了一组->"Temporary registration Code "
* Possible StringData Ref from Code Obj ->"419246"
* Possible StringData Ref from Code Obj ->"387192"
* Possible StringData Ref from Code Obj ->"388028"
* Possible StringData Ref from Code Obj ->"422199"
试了一下还是可以的，出现了这样的提示窗->"Temporary registration has been applied successfully. This registration will be valid for the next 72 hours."
只能用72个小时，我#%^&$#^，也太小气了。于是决定操刀解之而后快:)

5、破解过程: 运行程序输入 Username: CoolBob
Organisation: China Cracker Group
Serial Number: 26313818 (随机产生的)
Registration Key: 12345

一开始用TRW2000，发现上当。该程序注册验证时用到float运算。所以，换SoftICE上场，下BPX hmemcpy,F5跳出来后，点OK按钮被SoftICE拦截，12次F12来到这里---->

Copyright ?1999-2001 Simply Super Software
* Reference To: VCL30.Controls.TControl.GetText@23EDC2EF, Ord:0000h
|
:0044591A E811C2FBFF Call 00401B30
:0044591F 8B45F0 mov eax, dword ptr [ebp-10] <----Here we come
:00445922 50 push eax <----Save Serial Number
:00445923 8D55EC lea edx, dword ptr [ebp-14]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004458BF(C)
|
:00445926 8B45FC mov eax, dword ptr [ebp-04]
:00445929 8B80E8010000 mov eax, dword ptr [eax+000001E8]

* Reference To: VCL30.Controls.TControl.GetText@23EDC2EF, Ord:0000h
|
:0044592F E8FCC1FBFF Call 00401B30
:00445934 8B55EC mov edx, dword ptr [ebp-14] <----Get Name

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004458D4(C)
|
:00445937 A1B86B4C00 mov eax, dword ptr [004C6BB8]
:0044593C 8B00 mov eax, dword ptr [eax]
:0044593E 59 pop ecx
:0044593F E80C3B0700 call 004B9450
:00445944 8D55F0 lea edx, dword ptr [ebp-10]
:00445947 8B45FC mov eax, dword ptr [ebp-04]
:0044594A 8B8008020000 mov eax, dword ptr [eax+00000208]

* Reference To: VCL30.Controls.TControl.GetText@23EDC2EF, Ord:0000h
|
:00445950 E8DBC1FBFF Call 00401B30
:00445955 8B55F0 mov edx, dword ptr [ebp-10] <----Real Registration Key
:00445958 8B45F8 mov eax, dword ptr [ebp-08] <----12345

* Reference To: VCL30.System.@LStrCmp@51F89FF7, Ord:0000h
|
:0044595B E848B8FBFF Call 004011A8 <---Hmmm,What about this call?
:00445960 0F856B020000 jne 00445BD1 <---If jump,bad guy
:00445966 A19C6B4C00 mov eax, dword ptr [004C6B9C]
:0044596B C60001 mov byte ptr [eax], 01
:0044596E A1D46B4C00 mov eax, dword ptr [004C6BD4]
:00445973 C60000 mov byte ptr [eax], 00
:00445976 B201 mov dl, 01
:00445978 A11C8B4E00 mov eax, dword ptr [004E8B1C]

* Reference To: VCL30.Registry.TRegistry.Create@23EDC2EF, Ord:0000h
|
:0044597D E83EC6FBFF Call 00401FC0
:00445982 8945F4 mov dword ptr [ebp-0C], eax
:00445985 BA02000080 mov edx, 80000002
:0044598A 8B45F4 mov eax, dword ptr [ebp-0C]

* Reference To: VCL30.Registry.TRegistry.SetRootKey@23EDC2EF, Ord:0000h
|
:0044598D E83EC6FBFF Call 00401FD0
:00445992 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"SOFTWARE\Simply Super Software\Trojan "
->"Remover\User"
|
:00445994 BA385F4400 mov edx, 00445F38
:00445999 8B45F4 mov eax, dword ptr [ebp-0C]

* Reference To: VCL30.Registry.TRegistry.OpenKey@23EDC2EF, Ord:0000h
|
:0044599C E837C6FBFF Call 00401FD8
:004459A1 84C0 test al, al
:004459A3 0F84DC000000 je 00445A85
:004459A9 33C0 xor eax, eax
:004459AB 55 push ebp
:004459AC 685D5A4400 push 00445A5D
:004459B1 64FF30 push dword ptr fs:[eax]
:004459B4 648920 mov dword ptr fs:[eax], esp
:004459B7 8D55F0 lea edx, dword ptr [ebp-10]
:004459BA 8B45FC mov eax, dword ptr [ebp-04]
:004459BD 8B80E8010000 mov eax, dword ptr [eax+000001E8]
如果只是简单的找注册码，到这里应该结束了，但作为Cracker我们应该有一种一追到底的精神，就像追MM一样:)要追到她们感动为止，否则，不要轻易放弃。情圣守则第一条。 又扯远了^O^

让我们来分析一下注册码生成过程，
在这里的时候:00445922 50 push eax <----Save Serial Number
下BPR eax eax+7 r，按一下F5
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B943B(C)
|
:004B94A6 8B55FC mov edx, dword ptr [ebp-04]
:004B94A9 8A543AFF mov dl, byte ptr [edx+edi-01] <----Here we come

* Reference To: VCL30.System.@LStrFromChar@001FB870, Ord:0000h
|
:004B94AD E8B67CF4FF Call 00401168
:004B94B2 8B45E8 mov eax, dword ptr [ebp-18]

* Reference To: VCL30.SysUtils.StrToInt@0F6FDFF6, Ord:0000h <---StrToInt(Serial Number)
|
:004B94B5 E8EE80F4FF Call 004015A8
:004B94BA 83F802 cmp eax, 00000002 <---if SN[i]>=2 jump
:004B94BD 7D44 jge 004B9503
:004B94BF 8D45E8 lea eax, dword ptr [ebp-18]
:004B94C2 8B55FC mov edx, dword ptr [ebp-04]
:004B94C5 8A543AFF mov dl, byte ptr [edx+edi-01]

* Reference To: VCL30.System.@LStrFromChar@001FB870, Ord:0000h
|
:004B94C9 E89A7CF4FF Call 00401168
:004B94CE 8B45E8 mov eax, dword ptr [ebp-18]

* Reference To: VCL30.SysUtils.StrToInt@0F6FDFF6, Ord:0000h <----StrToInt(SN[i])
|
:004B94D1 E8D280F4FF Call 004015A8
:004B94D6 83C003 add eax, 00000003 <----SN[i]=SN[i]+3
:004B94D9 7105 jno 004B94E0

* Reference To: VCL30.System.@IntOver@51F89FF7, Ord:0000h
|
:004B94DB E8C07BF4FF Call 004010A0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B94D9(C)
|
:004B94E0 6BC051 imul eax, 00000051 <----SN[i]=SN[i]*0x51
:004B94E3 7105 jno 004B94EA

* Reference To: VCL30.System.@IntOver@51F89FF7, Ord:0000h
|
:004B94E5 E8B67BF4FF Call 004010A0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B94E3(C)
|
:004B94EA 8BF8 mov edi, eax
:004B94EC 8D55E8 lea edx, dword ptr [ebp-18]
:004B94EF 8BC7 mov eax, edi

* Reference To: VCL30.SysUtils.IntToStr@0F6FDFF6, Ord:0000h
|
:004B94F1 E8AA80F4FF Call 004015A0 <---IntToStr
:004B94F6 8B55E8 mov edx, dword ptr [ebp-18]
:004B94F9 8D45F8 lea eax, dword ptr [ebp-08]

* Reference To: VCL30.System.@LStrCat@51F89FF7, Ord:0000h
|
:004B94FC E88F7CF4FF Call 00401190 <---StrCat
:004B9501 EB38 jmp 004B953B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B94BD(C)
|
:004B9503 8D45E8 lea eax, dword ptr [ebp-18]
:004B9506 8B55FC mov edx, dword ptr [ebp-04]
:004B9509 8A543AFF mov dl, byte ptr [edx+edi-01]

* Reference To: VCL30.System.@LStrFromChar@001FB870, Ord:0000h
|
:004B950D E8567CF4FF Call 00401168
:004B9512 8B45E8 mov eax, dword ptr [ebp-18]

* Reference To: VCL30.SysUtils.StrToInt@0F6FDFF6, Ord:0000h
|
:004B9515 E88E80F4FF Call 004015A8
:004B951A 6BC02F imul eax, 0000002F <---eax=eax*2F
:004B951D 7105 jno 004B9524

* Reference To: VCL30.System.@IntOver@51F89FF7, Ord:0000h
|
:004B951F E87C7BF4FF Call 004010A0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B951D(C)
|
:004B9524 8BF8 mov edi, eax
:004B9526 8D55E8 lea edx, dword ptr [ebp-18]
:004B9529 8BC7 mov eax, edi

* Reference To: VCL30.SysUtils.IntToStr@0F6FDFF6, Ord:0000h
|
:004B952B E87080F4FF Call 004015A0 <----IntToStr
:004B9530 8B55E8 mov edx, dword ptr [ebp-18]
:004B9533 8D45F8 lea eax, dword ptr [ebp-08]

* Reference To: VCL30.System.@LStrCat@51F89FF7, Ord:0000h
|
:004B9536 E8557CF4FF Call 00401190 <-----String catenating

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B9501(U)
|
:004B953B 43 inc ebx
:004B953C 4E dec esi
:004B953D 0F855EFFFFFF jne 004B94A1 <---jump if SN[i]<>nil
上面的程序无非做了这些工作，把Serial Number的字符串中的每一个字符变成整数，
然后乘以2F，结果再转换为字符串，以便连结字符串。我的Serial Number=26313818，
按以上的规律则变成这样:
IntToStr(2*2F)+IntToStr(6*2F)+IntToStr(3*2F)+IntToStr((1+3)*0x51)+IntToStr(3*2F)+IntToStr(8*2F)+IntToStr((1+3)*0x51)+IntToStr(8*2F)=>"94282141324141376324376" <--Now we call this StrA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B9496(C)
|
:004B9543 8B45F8 mov eax, dword ptr [ebp-08] <---D eax, You'll Look StrA

* Reference To: VCL30.SysUtils.StrToFloat@044134E0, Ord:0000h
|
:004B9546 E86D81F4FF Call 004016B8 <---StrA convert To Float
:004B954B DB7DEE fstp tbyte ptr [ebp-12] <---Store at ebp-12
:004B954E 9B wait
:004B954F DB6DEE fld tbyte ptr [ebp-12] <---Load StrA
:004B9552 DB2DE4954B00 fld tbyte ptr [004B95E4] <---Load some Float value
:004B9558 DEC9 fmulp st(1), st(0) <---st(0)=st(1)*st(0)
:004B955A DB2DF0954B00 fld tbyte ptr [004B95F0] <---Load another value
:004B9560 DEE9 fsubp st(1), st(0) <---st(0)=st(1)-st(0)
:004B9562 DB7DEE fstp tbyte ptr [ebp-12] <---Save st(0)
:004B9565 9B wait
:004B9566 EB1A jmp 004B9582

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B9590(C)
|
:004B9568 8B45FC mov eax, dword ptr [ebp-04]

* Reference To: VCL30.SysUtils.StrToInt@0F6FDFF6, Ord:0000h
|
:004B956B E83880F4FF Call 004015A8
:004B9570 8945E4 mov dword ptr [ebp-1C], eax <---eax=Serial Number
:004B9573 DB45E4 fild dword ptr [ebp-1C] <---Load it
:004B9576 DB6DEE fld tbyte ptr [ebp-12] <---Load st(0)

* Reference To: VCL30.System.@FSafeDivideR@51F89FF7, Ord:0000h
|
:004B9579 E8EA7CF4FF Call 00401268 <---st(0)=st(1)/st(0)
:004B957E DB7DEE fstp tbyte ptr [ebp-12] <---Save *result*
:004B9581 9B wait

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B9566(U)
|
:004B9582 DB6DEE fld tbyte ptr [ebp-12] <---Load st(0)
:004B9585 DB2DFC954B00 fld tbyte ptr [004B95FC] <---Load value
:004B958B DED9 fcompp <---Compare

:004B958D DFE0 fstsw ax <---Store Status Word
:004B958F 9E sahf <---Store AH Register into FLAGS

:004B9590 72D6 jb 004B9568
:004B9592 668B45F6 mov ax, word ptr [ebp-0A]
:004B9596 50 push eax
:004B9597 FF75F2 push [ebp-0E]
:004B959A FF75EE push [ebp-12]
:004B959D 8B4508 mov eax, dword ptr [ebp+08]
:004B95A0 50 push eax
:004B95A1 33C9 xor ecx, ecx
:004B95A3 BA12000000 mov edx, 00000012
:004B95A8 B002 mov al, 02

* Reference To: VCL30.SysUtils.FloatToStrF@0DD792DD, Ord:0000h
|
:004B95AA E80181F4FF Call 004016B0
:004B95AF 33C0 xor eax, eax
:004B95B1 5A pop edx
:004B95B2 59 pop ecx
:004B95B3 59 pop ecx
:004B95B4 648910 mov dword ptr fs:[eax], edx
:004B95B7 68D9954B00 push 004B95D9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B95D7(U)
|
:004B95BC 8D45E8 lea eax, dword ptr [ebp-18]

* Reference To: VCL30.System.@LStrClr@40929B27, Ord:0000h
|
:004B95BF E87C7BF4FF Call 00401140
:004B95C4 8D45F8 lea eax, dword ptr [ebp-08]
:004B95C7 BA02000000 mov edx, 00000002

* Reference To: VCL30.System.@LStrArrayClr@51F89FF7, Ord:0000h
|
:004B95CC E8777BF4FF Call 00401148
:004B95D1 C3 ret

其实上面的:004B957E DB7DEE fstp tbyte ptr [ebp-12] <---Save *result*
中的结果就是正确的注册码了。

1、注册码与Username,Organisation无关，只与Serial Number有关。
2、注册过程：
procedure TForm1.Button3Click(Sender: TObject);

var I: Integer; MyString,StrA: String;

begin
MyString:=edit1.text;
i:=1;
while I <=Length(MyString) do
begin
if StrToInt(MyString[I])<2 then

StrA :=StrA+IntToStr((StrToInt(MyString[I])+3)*81)
else
StrA :=StrA+IntToStr(StrToInt(MyString[I])*47);
I := I + 1;
end;

edit2.text:=IntToStr(Round((StrToFloat(StrA)*0.1428571428571428571-480547639)/StrToInt(MyString)) );

end;

3、该程序注册后信息在注册表中如下:
REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Simply Super Software\Trojan Remover\User]
"Name"="CoolBob"
"Organisation"="China Cracker Group"
"Serial Number"=hex:00,00,00,a0,45,18,79,41
"Registration"=hex:f0,32,4c,04,7b,18,fd,42

-----------------------------------------------------------written by CoolBob[CCG] 2001.4.16


Roger's PostScript(RoPS)

 标 题:一个PostScript(RoPS)注册机分析。初学者看。 (21千字)
发信人:machoman[CCG]
时 间:2001-7-8 19:37:29
详细信息:
软件名称：Roger's PostScript(RoPS)
整理日期：2000.2.10最新版本：5.2c文件大小：282KB软件授权：共享软件使用平台：WinNT/2000/98Loadown address: http://www.newhua.com.cn/down/rops52c.exe CrackingBy: machoman[CCG] (China Cracking Group)
平台 :win2000/98
使用工具 :Softice 4.05 for NT /98,ida 4.04 或者 wdasm32 推荐汉化版
预定目标 :学习写简单的注册机。
难度等级 :入门级J
结果：
Name: [CCG]
Users: 1
Key: 4e802402618f

破解过程：
这个软件是一个读取PostScript格式的电子文档的软件，这种文档格式跟PDF文档格式一样都需要专门的软件才能打开，这个软件就是打开.ps后缀文档的一个小软件。它有30天的使用限制，如果过期会要求注册才能使用。我们的目标就是要知道其注册方法去找到注册码。以下的步骤就是达成这个目标所需要的步骤。你只要有耐心与兴趣跟我一起一步一步的做，就可以体会到破解的乐趣。当然我希望不是噩梦，要是也没办法，小弟破解水平不但低，而且表达能力更是不敢恭维，要是看不下去了千万要原谅小弟。只怪小弟才只读了正规的9年书^_^。我尽量力争写详细，只需要你具备一些很基础的汇编知识。
首先在注册框内输入名字比如我最先输入就是
Name : [CCG]
Users : 1
Key :31415926
这些输入是很重要的，你在用Softice 调试软件跟踪时需要时时参照这些值以观察其发生的变化，进而分析出注册算法正确的结果。当这里输入完成后你不要马上点OK,我想大家都可能没有个个摸大奖的手气。任意输入就搞定注册。这时就需要按住Ctrl+D调出强力调试工具，比如Softice 。你的画面切换到黑色的命令行界面，进来的目的就是要下断点让程序跑动起来后在注册前停下来，让我们能够看见其计算注册码的过程。断点的方式很多，对于windows的注册输入你一般可以使用
bpx GetWindowTextA
bpx GetDlgItemTextA
bpx hmemcpy
bpx LockMyTask
这些断点。
对于这个软件你可以使用
bpx GetDlgItemTextA下断就可以阻止住程序跑动的脚步。
完成这个后你再用Ctrl+D又回到了windows 界面中，现在你就可以拿出吃奶的力气按下OK键^_^。哈哈，发生了啥，程序被断下在softice 的黑头下了。你可以看见光标停止在User32!GetDlgItemTextA这里。我们现在是在user32.dll这个程序空间中的，只需按F12键就会
回到软件程序的空间见下面的星号部分。Mico$oft的windows操作系统就像其老板一样厚黑学学的好的很。脸皮是层一层的跟洋葱头一样。你要是在win98平台下用hmemcpy,lockmytask 这样的断点也可以断下，不过那样你把操作系统的脸皮扒的更干净，你就需要多用几下F12才能到下面的位置，不过你要小心别按过头哟，Cracker就是要胆大加心细的哟。你我要是跟老比尔一样脸厚说最少也是个小土老财了。我看我们也不要妄想了，没有发财的命。要不会干破解，还不早就去花天酒地泡妹妹去了。还受破解这个穷罪个啥哟，只想哪天兄弟们能够把破功提高到能跟[伪装者]大峡一样成为专业户就就好了，嘿嘿，我这辈子是不要想了。嘿嘿不废话了。到程序中来把光标停留在下面星号的位置,下边的汇编代码是用ida4.04 抓出来的，跟在Softice 下看见的情况有些微差别，比如外边传递过来的参数都用ebp+arg_**表示，而如果是内部变量就是ebp+var_***的方式表示。
PORT_1:
004361A9 push [ebp+arg_8]
004361AC push [ebp+arg_4]
004361AF push [ebp+arg_0]
004361B2 push dword ptr [ecx+1Ch]
004361B5 call ds:GetDlgItemTextA *****************;这里就是你F12回来的位置，程序在这里的作用是把你输入的用户名提供给判断程序
/*****打断解释一下：
这个函数在MSDN里是这样定义的
UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount);也就是说
其第三个参数lpString 也就是[ebp+arg_4]就是读出你对话框中的输入信息的,不你可以在这时在
Softice下记忆体显示命令
D ebp+0c（注：也就是ida 中004361ac push [ebp+arg_4]）
0023:0012f27c A0 F2 12 00 13 00 00 00-8C F7 12 00 60 51 44 00
##########
然后在在我的机器上显示数据的第一行是上边所示，这个东西是间接寻址的，你只需要再用一下D 命令显示上边记忆体中#号的数据的位置就可以看见如下了，注意记忆体中的数据是高字节在后底字节在前的
D 0012f2a0
0023:0012f2a0 5B 43 43 47 5D 00 50 00-D6 02 02 00 34 0E 81 00 [CCG].P…..4…
看看后边的字符显示不就是输入的注册名吗？这里的操作方式在Cracker程序时经常遇到。希望能学会多用D命令显示内存这样对你找到 有价值的东西
解释结束*******/
004361BB jmp short loc_4361CD
004361BD ; ---------------------------------------------------------------------------
004361BD
004361BD loc_4361BD: ; CODE XREF: sub_43619F+8 j
004361BD push [ebp+arg_8]
004361C0 mov edx, [eax]
004361C2 mov ecx, eax
004361C4 push [ebp+arg_4]
004361C7 push [ebp+arg_0]
004361CA call dword ptr [edx+78h]
004361CD
004361CD loc_4361CD: ; CODE XREF: sub_43619F+1C j
004361CD pop ebp
004361CE retn 0Ch
你现在在程序中的一个子程序中，当用F10一步一步走过到4361ce或者用F12直接retrun时就会回到下面的主程序判断部分
你可以用 softice 命令
BD * 清掉断点，然后用
F8 一步一步走。

PORT_2:
/***************************************************************************/
004045E4 lea eax, [ebp+var_28]；用户名的地址
004045E7 push 13h
004045E9 mov esi, 0D9h
004045EE push eax
004045EF mov edi, ecx
004045F1 push esi
004045F2 call sub_43619F;这里就是GetDlgItemText取name:[CCG]
；其地址放在[ebp_var_28]中
004045F7 lea eax, [ebp+var_3C];你的光标回来后停留在这个位置
004045FA push 13h
004045FC push eax
004045FD push 0DAh
00404602 mov ecx, edi
00404604 call sub_43619F;再次GetDlgItemText取user:1放进
； [Ebp+var_3c]这个位置
00404609 push 1
0040460B push 0
0040460D push 0DCh
00404612 mov ecx, edi
00404614 call sub_43616D；取你的测试注册码
00404619 push eax；测试注册码
0040461A lea eax, [ebp+var_14]
0040461D push offset aD ; "%d"
00404622 push eax
00404623 call ds:wsprintfA；格式转换
00404629 lea eax, [ebp+var_14];31415926 Key,用Sofeice D命令可见
0040462C push eax
0040462D lea eax, [ebp+var_3C];1 user
00404630 push eax
00404631 lea eax, [ebp+var_28];[CCG] Name
00404634 push eax
00404635 call sub_401940；注册码算法就在里边，嘿嘿，爆破手就
；在这里打住，要想吃鸡哪就需要跟进去
;Port3部分的汇编
0040463A add esp, 18h
0040463D cmp dword_44E168, 0；公德圆满的话，这里这个
；dword_44e168这个位置的数据为0，否则玩完
00404644 mov dword_453670, eax
00404649 mov [ebp+var_4], offset aThankYouForReg ; "Thank you for registering RoPS"
00404650 jz short loc_40465B ;
00404652 mov [ebp+var_4], offset aSorryThatKeySe ; "Sorry, that key / serial number doesn't"...
00404659 jmp short loc_404664
0040465B ; ---------------------------------------------------------------------------
0040465B
0040465B loc_40465B: ; CODE XREF: sub_4045DC+74 j
0040465B push 1
0040465D mov ecx, edi
0040465F call sub_431C31
00404664
00404664 loc_404664: ; CODE XREF: sub_4045DC+7D j
00404664 mov ecx, dword_45367C
0040466A push 0
0040466C push offset aRegisterRops ; "Register RoPS"
00404671 push [ebp+var_4]
00404674 call sub_434BE4
00404679 mov ecx, dword_45367C
0040467F call sub_402C27
00404684 lea eax, [ebp+var_28]
00404687 push 13h
00404689 push eax
0040468A push esi
0040468B mov ecx, edi
0040468D call sub_43619F
00404692 lea eax, [ebp+var_28]
00404695 mov esi, offset aRops_0 ; "rops"
0040469A push eax
0040469B push offset aReg ; "reg"
004046A0 push esi
004046A1 call sub_40154F
004046A6 lea eax, [ebp+var_3C]
004046A9 push eax
004046AA push offset aKey ; "key"
004046AF push esi
004046B0 call sub_40154F
004046B5 lea eax, [ebp+var_14]
004046B8 push eax
004046B9 push offset aUsers ; "users"
004046BE push esi
004046BF call sub_40154F
004046C4 add esp, 24h
004046C7 pop edi
004046C8 pop esi
004046C9 leave
004046CA retn
004046CA sub_4045DC endp
004046CA

PORT 3算法部分
00401940 ; &brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar; S U B R O U T I N E &brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;&brvbar;
00401940
00401940 ; Attributes: bp-based frame
00401940
00401940 sub_401940 proc near ; CODE XREF: sub_40176C+130 p
00401940 ; sub_4045DC+59 p
00401940
00401940 var_44 = byte ptr -44h
00401940 var_30 = byte ptr -30h
00401940 var_1C = byte ptr -1Ch
00401940 var_8 = dword ptr -8
00401940 var_4 = dword ptr -4
00401940 arg_0 = dword ptr 8
00401940 arg_4 = dword ptr 0Ch
00401940 arg_8 = dword ptr 10h
00401940
00401940 push ebp
00401941 mov ebp, esp
00401943 sub esp, 44h
00401946 and [ebp+var_8], 0
0040194A push ebx
0040194B mov ebx, [ebp+arg_0]；判断第一个参数[CCG]
； Name的长度
0040194E mov [ebp+var_4], 0Ch
00401955 push ebx
00401956 call _strlen；很明显的运行库函数
0040195B cmp eax, 9；名字为长度为9吗？
0040195E pop ecx
0040195F jnz short loc_401976；长度不为9跳走，下去继续新判断
00401961 push ebx；把名字做为参数
00401962 call sub_401AA6；长度为9的话继续进这个地方去判断
00401967 cmp eax, 3C9h；比较这个函数得到的结果为3C9h吗？
0040196C pop ecx
0040196D jnz short loc_401976；不是也跳走，下去继续新判断
0040196F xor eax, eax；设置标志，为合法。
00401971 jmp loc_401AA3；饿嘿嘿，要是你名字刚好9个而且和为
；3c9的话，你就是合法了哟
00401976 ; ---------------------------------------------------------------------------
00401976
00401976 loc_401976: ; CODE XREF: sub_401940+1F j
00401976 ; sub_401940+2D j
00401976 push ebx
00401977 call _strlen
0040197C cmp eax, 10h；你的名字长度为10h吗？也就是16个字符
0040197F pop ecx
00401980 jnz short loc_4019CF；不是的话，还是进入下边判断
00401982 push ebx；再次压入用户名，我的是[CCG],当然不会走到这
；里，如果名字为16个字符的话，才会压入
00401983 call sub_401AA6；名字计算求和
00401988 cmp eax, 630h；结果恰好为630h吗？
0040198D pop ecx
0040198E jnz short loc_4019CF；如果不是，还是继续跳要判断注册码
；的
00401990 push [ebp+arg_4]；
00401993 lea eax, [ebp+var_30]
00401996 push eax
00401997 call unknown_libname_1
0040199C lea eax, [ebp+var_30]
0040199F push 2Dh
004019A1 push eax
004019A2 call _strchr
004019A7 add esp, 10h
004019AA test eax, eax
004019AC jnz short loc_4019B6
004019AE or eax, 0FFFFFFFFh
004019B1 jmp loc_401AA3
004019B6 ; ---------------------------------------------------------------------------
004019B6
004019B6 loc_4019B6: ; CODE XREF: sub_401940+6C j
004019B6 and byte ptr [eax], 0
004019B9 inc eax
004019BA push eax
004019BB lea eax, [ebp+var_44]
004019BE push eax
004019BF call unknown_libname_1
004019C4 pop ecx
004019C5 lea eax, [ebp+var_44]
004019C8 pop ecx
004019C9 lea ebx, [ebp+var_30]
004019CC mov [ebp+arg_4], eax
004019CF
004019CF loc_4019CF: ; CODE XREF: sub_401940+40 j
004019CF ; sub_401940+4E j
004019CF push [ebp+arg_4]；你用D这个地址就可以知道是输入的
；User :1这个部分
004019D2 call __strlwr
004019D7 cmp byte ptr [ebx], 0
004019DA pop ecx
004019DB jnz short loc_4019E4
004019DD and byte ptr [ebx+1], 0
004019E1 mov byte ptr [ebx], 20h
004019E4
004019E4 loc_4019E4: ; CODE XREF: sub_401940+9B j
004019E4 push esi
004019E5 push edi
004019E6 push ebx
004019E7 call _strlen；求字符的长度。
004019EC pop ecx
004019ED mov esi, eax；字符长度送esi
004019EF push 11h
004019F1 mov ecx, esi;字符长度送ecx
004019F3 pop edi；edi=11h
004019F4 cmp esi, edi;比较字符长度等于11h就是17个吗？
004019F6 jge short loc_401A08；大于17个跳过去
//////////////////////////////////////////////////////////////////////////////////////////////////////////
004019F8
004019F8 loc_4019F8: ; CODE XREF: sub_401940+C6 j
004019F8 mov eax, ecx；这里是个循环，被除数为eax初始为用户名
；我这里name,[CCG]字符长度ecx=5,
004019FA cdq
004019FB idiv esi ；esi是11hó17
004019FD mov al, [edx+ebx];edx 中就是除法后的余数,作为一个变
；址寻址，在C中相当于一个指针，这
；里把这个以ebx为基地址的记忆体的
；数据取出，放在al中
00401A00 mov [ecx+ebx], al；然后把结果放在，用户名字符后边
00401A03 inc ecx
00401A04 cmp ecx, edi；已经附加到17个字符了吗？
00401A06 jl short loc_4019F8；没有继续循环
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/**********再次打断一下
在上边////////部分里的程序实际上是在你用户名不大于17个时，把你的用户名凑足17个，其方法是把你前边的用户名循环的加在后边凑足17个，比如我输入的[CCG]在这个循环结束时就会在记忆体中由最先的
“[CCG]”凑成” [CCG] [CCG] [CCG] [C”这样的17个字符
用C可以这样表示
int var,I;
char temp[18];
var=strlen(name);
for(var<17)
{
var=17/var+1;
for(I=0;I<var;I++)
strcat(temp,name);
}

***********打断结束/
00401A08
00401A08 loc_401A08: ; CODE XREF: sub_401940+B6 j
00401A08 push [ebp+arg_8]
00401A0B push [ebp+arg_8]；这下边就是高潮了，现在压的就是
;User 我的是1
00401A0E call _strlen;求长度
00401A13 pop ecx
00401A14 mov ecx, ebx;上边的17个字符串的位置送ec
00401A16 sub ecx, eax;减去User长度
00401A18 add ecx, edi;再加上11h这里就是把User从后边附加覆盖在
；字符串中
00401A1A push ecx
00401A1B call unknown_libname_1；
/********打断
程序经过这里后最终形成的输入字符串就是
” [CCG] [CCG] [CCG] [1”
把User 覆盖了最后一个字符，当你User有多个字符时，会向前覆盖，但是当你字符个数大于9时，只覆盖最后一个用0，表示。这些在Softice动态跟踪时可以很好的看清楚
结束******/
00401A20 or byte ptr [ebx], 1
00401A23 pop ecx
00401A24 pop ecx

///////////////////////////////////////////////////////////////////////（最关键处）
00401A25 mov eax, 1F4h ;这里就是最后的循环判断，要循环500次
;1F4hó500嘛，够多把
00401A2A
00401A2A loc_401A2A: ; CODE XREF: sub_401940+10F j
00401A2A mov ecx, [ebp+var_8] ；最初为0
00401A2D mov edx, [ebp+var_4]；最初为0xc
00401A30 mov dl, [edx+ebx];变址把字符[temp+0xc]取出就是把17个
；字符中的第13个字符取出
00401A33 lea esi, [ecx+ebx]；跟第一个相加
00401A36 add [esi], dl；跟第一个相加
00401A38 test ecx, ecx；比较ecx,为零吗？
00401A3A jnz short loc_401A3F
00401A3C mov [ebp+var_8], edi；为零，把17个字符指向变元，让下
；次循环时，改变指针位置
00401A3F
00401A3F loc_401A3F: ; CODE XREF: sub_401940+FA j
00401A3F cmp [ebp+var_4], 0；相加的字符位置为偏移0吗？
00401A43 jnz short loc_401A48；不是就跳
00401A45 mov [ebp+var_4], edi；为零的话，指向最后一个字符edi=11h
00401A48
00401A48 loc_401A48: ; CODE XREF: sub_401940+103 j
00401A48 dec [ebp+var_8];被加的变元指针位置减一
00401A4B dec [ebp+var_4]；加数指针也减一
00401A4E dec eax；循环变元减1，
00401A4F jnz short loc_401A2A还没有到500次循环，继续
///////////////////////////////////////////////////////////////////////
/********分析一下
程序在这/////////部分就是算法，它是这样处理的，在一个500次的循环中把字符串按一个规律两两相加，
” [CCG] [CCG] [CCG] [1”

用C表示就是
int var1=0xc;//第一次加数字符的相对位置
int var2=1;
for( int I=0;I<500;I++)
{var2--;//被加数的相对位置，循环一次减1
temp[var2]=temp[var2]+temp[var1]；//做加法
if(var2==0)
var2=0x11;//如果被加数为第一个字符，修改下次循环其指向最后一个字符
if (var1==0)
var1=0x11;//如果加数的位置为第一个字符，改变指针到最后一个字符
var1-- //循环减一
}
500次循环做完，得到的结果就是最后的注册码，就是取在数组中的前6个Byte对应的数字
*********/
00401A51 mov esi, offset a0123456789abcd ; "0123456789abcdef"
00401A56 lea edi, [ebp+var_1C]
00401A59 movsd
00401A5A movsd
00401A5B movsd
00401A5C and dword_44E168, 0
00401A63 movsd
00401A64 movsb
00401A65 mov esi, [ebp+arg_4]
00401A68 xor edi, edi
00401A6A
00401A6A loc_401A6A: ; CODE XREF: sub_401940+15A j
00401A6A movzx eax, byte ptr [edi+ebx]
00401A6E mov dl, [esi]
00401A70 mov ecx, eax
00401A72 shr ecx, 4
00401A75 cmp dl, [ebp+ecx+var_1C]
00401A79 jnz short loc_401A8B ;right can’t jump
00401A7B mov cl, [esi+1]
00401A7E and eax, 0Fh
00401A81 cmp cl, [ebp+eax+var_1C];比较你的Key跟计算结果相等吗？
00401A85 jnz short loc_401A8B;在这里正确都不跳，
；不然就置错误标志
00401A87 xor eax, eax；标志0是正确
00401A89 jmp short loc_401A8E; must to there
00401A8B ; ---------------------------------------------------------------------------
00401A8B
00401A8B loc_401A8B: ; CODE XREF: sub_401940+139 j
00401A8B ; sub_401940+145 j
00401A8B push 1; 要是在这里就错了
00401A8D pop eax
00401A8E
00401A8E loc_401A8E: ; CODE XREF: sub_401940+149 j
00401A8E or dword_44E168, eax
00401A94 inc edi
00401A95 inc esi
00401A96 inc esi
00401A97 cmp edi, 6；比较前6个byte的信息。
00401A9A jl short loc_401A6A；
00401A9C mov eax, dword_453670
00401AA1 pop edi
00401AA2 pop esi
00401AA3
00401AA3 loc_401AA3: ; CODE XREF: sub_401940+31 j
00401AA3 ; sub_401940+71 j
00401AA3 pop ebx
00401AA4 leave
00401AA5 retn
00401AA5 sub_401940 endp
00401AA5
程序将这些信息写入注册表的HLM\Software\Centipede\Rops\rops中，每次启动时判断。注册机付在后边。

（转贴请保持完整）
AllRight reserved :[CCG]
//VC 控制台下注册机
嘿嘿，小弟太菜。注册机中好多BVG,谢谢大哥指出。首先，数组变量的
分配因该在主程序外边，在里边定义会 在strcat(temp,name)时当名字
过长时，覆盖数据为啥会出现这样的情况小弟原因不明，希望哪个大哥指教;
第二，字符结尾要用0x00结束。不然会在后边显示一些怪字符.
第三，这个注册机不完美，还有些路没有去走，嘿嘿，哪个大哥把他补全。
只希望初学者去走做，对于高手这个东西也太简单了。大家一起学习。去走走看。
小弟献丑了。
include<windows.h>
char name[100],user[10],temp[18],covert[13]; //BUG修改定义成全局变量
int i,var,var1,var2;
BYTE lena,lenb;

main()
{

printf("[CCG] KeyGen\n");
printf("please input your name:\n");
scanf("%s",name);
getchar();
printf("please input user number:\n");
scanf("%s",user);
getchar();
var=strlen(name);
memset(temp,0x00,18);
if(var<17)
{
var=17/var+1;
for(i=0;i<var;i++)
strcat(temp,name);
}
else
strncpy(temp,name,17);

temp[17]=0x00;
var=strlen(user);
if(var>10)
temp[16]=0x30;
else
memcpy(&temp[17-var],user,var);
// printf("%s\n",temp);
var1=0xc;
var2=1;
for(i=0;i<500;i++)
{
var2--;
temp[var2]=temp[var2]+temp[var1];
if(var2==0)
var2=0x11;

if(var1==0)
var1=0x11;
var1--;
}
for(i=0;i<6;i++)
{
lena=(unsigned char)temp[i]/0x10;
lenb=(unsigned char)temp[i]&0xf;
if(lena<10)
covert[2*i]=lena+0x30;
else
covert[2*i]=lena+0x57;
if(lenb<10)
covert[2*i+1]=lenb+0x30;
else
covert[2*i+1]=lenb+0x57;

}
covert[12]=0x00; //BUG最后加上结尾不然会显示错误
printf(" key is:%s",covert);
}


roundclock 3.00 beta4

 标 题:急!急!!急!!!请问如何破roundclock 3.00 beta4 ?
发信人:guest
时 间:2000-12-9 3:03:46
详细信息:
急!急!!急!!!请问如何破roundclock 3.00 beta4 ?
下载网址：http://www.fkware.com 该软件非常不错：
RoundClock is not just another clock for Windows, it is a real round clock with
analog display. RoundClock is highly configurable and has extended alarm capabilities.
随便填上注册名与注册码，该软件把注册信息保存在：

HKEY_CURRENT_USER\Software\fkWare\Registrations\RoundClock
UserName="******"与RegCode="@@@@@@@"中。
用regqueryvalueexa设断后可在内存查到RegCode的值，bpm该值后，马上迷失
在茫茫汇编之中，无法找到关键对比处。用w32dsm893也无法找到关键的注册
出错对话“Sorry,but the name or the code you've......”下中断bpx messageboxa,
bpx getwindowtexta,bpx dialogboxparama,bpx getdlgitemtexta,bpx getmessagea
等等等等都不能拦截该窗，lockmytask,BMSG等收窗也无法跟踪下去，但用
exescope6.0能查得出该对话在Sting--1882--30102处，不知是如何做出来的？
最后找来找去，发现在执行roundclock前先下中断bpx findatoma(有谁知道findatoma是什么意思?)
再执行roundclock中断于该断点:

* Reference To: kernel32.FindAtomA, Ord:0000h
|
:004233E1 E8A212FEFF Call 00404688
:004233E6 6685C0 test ax, ax ***(ax=0改为1即可)
:004233E9 0F9545F7 setne byte ptr [ebp-09]
:004233ED 8B45FC mov eax, dword ptr [ebp-04]
:004233F0 C6407200 mov [eax+72], 00
:004233F4 807DF700 cmp byte ptr [ebp-09], 00
:004233F8 7516 jne 00423410

修改后，运行结束在屏幕上出现一个时钟的图标，对图标点鼠标右键，马上中断：

* Reference To: kernel32.FindAtomA, Ord:0000h
|
:004224BF E8C421FEFF Call 00404688
:004224C4 6685C0 test ax, ax ***(ax=0改为1即可)
:004224C7 0F9545E7 setne byte ptr [ebp-19]
:004224CB 807DFB00 cmp byte ptr [ebp-05], 00
:004224CF 744E je 0042251F

依上改过以后，移动鼠标到help处发现没了register now...与Enter registration code...两项，
点击About RoundClock...项，又中断：

* Reference To: kernel32.FindAtomA, Ord:0000h
|
:0040EEE2 E8A157FFFF Call 00404688
:0040EEE7 6685C0 test ax, ax ***(ax=0改为1即可)
:0040EEEA 0F95C0 setne al
:0040EEED 8B55FC mov edx, dword ptr [ebp-04]
:0040EEF0 888295000000 mov byte ptr [edx+00000095], al

改过后，按F5键运行，注册成功了！

按理说直接改程序很容易就能注册了，但改过后我的机子蓝屏！真是气人！
我用的是P100 40M EDO 用TRW2K122版(注册版)老不稳定，CTRL+N后硬盘狂读几分钟才能
进入TRW，有时还会SJ，但有TRW驻留内存后键盘就被锁死了，不能再输入NAME OR CODE,不
知是什么回事？还有为何TRW2K还没有新版本？LTT去干什么去了？

最后给大家一个正确的注册码以便跟踪:

UserName=Licensed User
RegCode=7307C46F982C27E9EF03

This little program has quite a bit of anti-cracker tricks in it.

1) It will halt your computer if SoftICE is running. SoftICE is
detected using CreateFileA on SICE and NTICE. This is a old
(standard) method of detecting SoftICE and is easily defeated
by watching that API call. Furthermore, to prevent simple hex
edits of these strings, the author encrypted them.
2) It will crash your computer if it detects that it has been
patched.
3) The registration checking is very lengthy and difficult to
pin down. This took the most time, after I discovered the
other 2 problems.

Protection: 5 of 10/Reg. Code, Anti-ICE, Anti-Patch/Registry

有谁能找到自己心目中的注册码？

标 题:有点新意
发信人:blowfish
时 间:2000-12-9 17:02:20
详细信息:

正如你先前所说的，如果FindAtomA( )返回的值不为0，则注册成功。

:0040F06D 80B89500000000 cmp byte ptr [eax+00000095], 00 //FindAtomA的返回值
:0040F074 744F je 0040F0C5

* Possible Reference to String Resource ID=30111: "This copy of $PROGNAME
is licensed to:"
|
:0040F076 B99F750000 mov ecx, 0000759F

.........................................................

* Possible Reference to Dialog: DialogID_7918, CONTROL_ID:791E, "Thank you for your registration!"
|
:0040F0AF C745BC1E790000 mov [ebp-44], 0000791E
:0040F0B6 8D55BC lea edx, dword ptr [ebp-44]
:0040F0B9 33C9 xor ecx, ecx
:0040F0BB 8B45FC mov eax, dword ptr [ebp-04]
:0040F0BE E8DD9EFFFF call 00408FA0
:0040F0C3 EB56 jmp 0040F11B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F074(C)
|

* Possible Reference to String Resource ID=30112: "This is an UNREGISTERED copy of $PROGNAME!"
|
:0040F0C5 B9A0750000 mov ecx, 000075A0

看一下传给FindAtomA( )的参数，发现它是在试图找一个值为“sdf”的atom。这说明如果注册码正确的话，它会在原子表中加入一个值为“sdf”的原子，以此作为标志。后面将会看到这一点。

1、启动时将RegCode加入到原子表中：

:004143B7 803D3C69420000 cmp byte ptr [0042693C], 00
:004143BE 7410 je 004143D0
:004143C0 683C694200 push 0042693C

* Reference To: kernel32.AddAtomA, Ord:0000h
|
:004143C5 E87E02FFFF Call 00404648
:004143CA 66A35E694200 mov word ptr [0042695E], ax

2、启动时将UserName加入到原子表中：

:0042402D 83787400 cmp dword ptr [eax+74], 00000000
:00424031 7428 je 0042405B
:00424033 8B45F4 mov eax, dword ptr [ebp-0C]
:00424036 8B4074 mov eax, dword ptr [eax+74]
:00424039 50 push eax

* Reference To: kernel32.AddAtomA, Ord:0000h
|
:0042403A E80906FEFF Call 00404648
:0042403F 8B1570564200 mov edx, dword ptr [00425670]
:00424045 668902 mov word ptr [edx], ax

3、从原子表中取出UserName：

:004228F3 A170564200 mov eax, dword ptr [00425670]
:004228F8 668B00 mov ax, word ptr [eax]
:004228FB 50 push eax

* Reference To: kernel32.GetAtomNameA, Ord:0000h
|
:004228FC E89F1DFEFF Call 004046A0

4、利用从原子表中取出的UserName来计算注册码。把下面的代码拷贝下来稍加修改就可写个注册机。久违了的TSecHash算法又在这里露面了 :)

* Referenced by a CALL at Address:
|:00422912
|
:00407FAC 55 push ebp
:00407FAD 8BEC mov ebp, esp
:00407FAF 81C418FFFFFF add esp, FFFFFF18
:00407FB5 894DF4 mov dword ptr [ebp-0C], ecx
:00407FB8 8955F8 mov dword ptr [ebp-08], edx
:00407FBB 8945FC mov dword ptr [ebp-04], eax
:00407FBE BAD4804000 mov edx, 004080D4
:00407FC3 8D856BFFFFFF lea eax, dword ptr [ebp+FFFFFF6B]
:00407FC9 E812CEFFFF call 00404DE0
:00407FCE 8D856BFFFFFF lea eax, dword ptr [ebp+FFFFFF6B]
:00407FD4 8B55FC mov edx, dword ptr [ebp-04]
:00407FD7 E860CEFFFF call 00404E3C
:00407FDC BAD8804000 mov edx, 004080D8
:00407FE1 8D856BFFFFFF lea eax, dword ptr [ebp+FFFFFF6B]
:00407FE7 E850CEFFFF call 00404E3C
:00407FEC 8D856BFFFFFF lea eax, dword ptr [ebp+FFFFFF6B]
:00407FF2 E821D2FFFF call 00405218
:00407FF7 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"TSecHash岪"
|
:00407FF9 A134784000 mov eax, dword ptr [00407834]
:00407FFE E87DA8FFFF call 00402880
:00408003 8945F0 mov dword ptr [ebp-10], eax
:00408006 8D8518FFFFFF lea eax, dword ptr [ebp+FFFFFF18]
:0040800C 50 push eax
:0040800D 8B45F8 mov eax, dword ptr [ebp-08]
:00408010 E837CFFFFF call 00404F4C
:00408015 8BC8 mov ecx, eax
:00408017 8B55F8 mov edx, dword ptr [ebp-08]
:0040801A 8B45F0 mov eax, dword ptr [ebp-10]
:0040801D E86AFCFFFF call 00407C8C
:00408022 8D8D43FFFFFF lea ecx, dword ptr [ebp+FFFFFF43]
:00408028 8D9518FFFFFF lea edx, dword ptr [ebp+FFFFFF18]
:0040802E 8B45F0 mov eax, dword ptr [ebp-10]
:00408031 E8CEFEFFFF call 00407F04
:00408036 8B45F0 mov eax, dword ptr [ebp-10]
:00408039 E8AAA8FFFF call 004028E8
:0040803E B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"TSecHash岪"
|
:00408040 A134784000 mov eax, dword ptr [00407834]
:00408045 E836A8FFFF call 00402880
:0040804A 8945F0 mov dword ptr [ebp-10], eax
:0040804D 8D852CFFFFFF lea eax, dword ptr [ebp+FFFFFF2C]
:00408053 50 push eax
:00408054 8D856BFFFFFF lea eax, dword ptr [ebp+FFFFFF6B]
:0040805A E8EDCEFFFF call 00404F4C
:0040805F 8BC8 mov ecx, eax
:00408061 8D956BFFFFFF lea edx, dword ptr [ebp+FFFFFF6B]
:00408067 8B45F0 mov eax, dword ptr [ebp-10]
:0040806A E81DFCFFFF call 00407C8C
:0040806F 8D8D57FFFFFF lea ecx, dword ptr [ebp+FFFFFF57]
:00408075 8D952CFFFFFF lea edx, dword ptr [ebp+FFFFFF2C]
:0040807B 8B45F0 mov eax, dword ptr [ebp-10]
:0040807E E881FEFFFF call 00407F04
:00408083 8B45F0 mov eax, dword ptr [ebp-10]
:00408086 E85DA8FFFF call 004028E8
:0040808B 33C0 xor eax, eax
:0040808D 8945EC mov dword ptr [ebp-14], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004080CE(C)
|
:00408090 8B45EC mov eax, dword ptr [ebp-14]
:00408093 0FB6840557FFFFFF movzx eax, byte ptr [ebp+eax-000000A9]
:0040809B 8B55EC mov edx, dword ptr [ebp-14]
:0040809E 03D2 add edx, edx
:004080A0 0FB6941557FFFFFF movzx edx, byte ptr [ebp+edx-000000A9]
:004080A8 03C2 add eax, edx
:004080AA 8B55EC mov edx, dword ptr [ebp-14]
:004080AD 03D2 add edx, edx
:004080AF 0FB6941543FFFFFF movzx edx, byte ptr [ebp+edx-000000BD]
:004080B7 03C2 add eax, edx
:004080B9 25FF000000 and eax, 000000FF
:004080BE 8B55F4 mov edx, dword ptr [ebp-0C]
:004080C1 8B4DEC mov ecx, dword ptr [ebp-14]
:004080C4 88040A mov byte ptr [edx+ecx], al //保存生成的注册码
:004080C7 FF45EC inc [ebp-14]
:004080CA 837DEC0A cmp dword ptr [ebp-14], 0000000A //注册码共20个字符（10个字节）
:004080CE 75C0 jne 00408090
:004080D0 8BE5 mov esp, ebp
:004080D2 5D pop ebp
:004080D3 C3 ret

5、从原子表中取出我们输入的假RegCode：

:00422778 8D4597 lea eax, dword ptr [ebp-69]
:0042277B 50 push eax
:0042277C A1A4564200 mov eax, dword ptr [004256A4]
:00422781 668B00 mov ax, word ptr [eax]
:00422784 50 push eax

* Reference To: kernel32.GetAtomNameA, Ord:0000h
|
:00422785 E8161FFEFF Call 004046A0

6、将假RegCode每两个字符转换成一个字节：

* Referenced by a CALL at Address:
|:004227DF
|
:004080DC 55 push ebp
:004080DD 8BEC mov ebp, esp
:004080DF 83C4EC add esp, FFFFFFEC
:004080E2 8955F8 mov dword ptr [ebp-08], edx
:004080E5 8945FC mov dword ptr [ebp-04], eax
:004080E8 33C0 xor eax, eax
:004080EA 8945F0 mov dword ptr [ebp-10], eax
:004080ED C645EF00 mov [ebp-11], 00
:004080F1 33C0 xor eax, eax
:004080F3 8945F4 mov dword ptr [ebp-0C], eax
:004080F6 8B45F8 mov eax, dword ptr [ebp-08]
:004080F9 33C9 xor ecx, ecx
|
:004080FB BA0A000000 mov edx, 0000000A //10字节
:00408100 E827A5FFFF call 0040262C
:00408105 C645ED01 mov [ebp-13], 01
:00408109 EB66 jmp 00408171

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040817C(C)
|
:0040810B 8B45F4 mov eax, dword ptr [ebp-0C]
:0040810E 8B55FC mov edx, dword ptr [ebp-04]
:00408111 803C022D cmp byte ptr [edx+eax], 2D
:00408115 7457 je 0040816E
:00408117 8B45F4 mov eax, dword ptr [ebp-0C]
:0040811A 8B55FC mov edx, dword ptr [ebp-04]
:0040811D 803C0239 cmp byte ptr [edx+eax], 39
:00408121 7710 ja 00408133
:00408123 8B45F4 mov eax, dword ptr [ebp-0C]
:00408126 8B55FC mov edx, dword ptr [ebp-04]
:00408129 8A0402 mov al, byte ptr [edx+eax]
:0040812C 2C30 sub al, 30
:0040812E 8845EE mov byte ptr [ebp-12], al
:00408131 EB10 jmp 00408143

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408121(C)
|
:00408133 8B45F4 mov eax, dword ptr [ebp-0C]
:00408136 8B55FC mov edx, dword ptr [ebp-04]
:00408139 8A0402 mov al, byte ptr [edx+eax]
:0040813C 2C41 sub al, 41
:0040813E 0408 add al, 08
:00408140 8845EE mov byte ptr [ebp-12], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408131(U)
|
:00408143 807DED00 cmp byte ptr [ebp-13], 00
:00408147 740C je 00408155
:00408149 8A45EE mov al, byte ptr [ebp-12]
:0040814C 8845EF mov byte ptr [ebp-11], al
:0040814F C645ED00 mov [ebp-13], 00
:00408153 EB19 jmp 0040816E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408147(C)
|
:00408155 8B45F8 mov eax, dword ptr [ebp-08]
:00408158 8B55F0 mov edx, dword ptr [ebp-10]
:0040815B 8A4DEE mov cl, byte ptr [ebp-12]
:0040815E C1E104 shl ecx, 04
:00408161 024DEF add cl, byte ptr [ebp-11]
:00408164 880C10 mov byte ptr [eax+edx], cl //保存转换结果
:00408167 FF45F0 inc [ebp-10]
:0040816A C645ED01 mov [ebp-13], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00408115(C), :00408153(U)
|
:0040816E FF45F4 inc [ebp-0C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408109(U)
|
:00408171 8B45FC mov eax, dword ptr [ebp-04]
:00408174 E8D3CDFFFF call 00404F4C
:00408179 3B45F4 cmp eax, dword ptr [ebp-0C]
:0040817C 778D ja 0040810B //循环
:0040817E 8BE5 mov esp, ebp
:00408180 5D pop ebp
:00408181 C3 ret

7、比较真假RegCode：

:004227E4 33C0 xor eax, eax
:004227E6 8945F0 mov dword ptr [ebp-10], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042280F(C)
|
:004227E9 8B45F0 mov eax, dword ptr [ebp-10]
:004227EC 8A4405C9 mov al, byte ptr [ebp+eax-37]
:004227F0 8B55F0 mov edx, dword ptr [ebp-10]
:004227F3 8B4DFC mov ecx, dword ptr [ebp-04]
:004227F6 3A441168 cmp al, byte ptr [ecx+edx+68] //比较一个字节
:004227FA 7506 jne 00422802
:004227FC C645DF01 mov [ebp-21], 01 //good guy
:00422800 EB06 jmp 00422808

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004227FA(C)
|
:00422802 C645DF00 mov [ebp-21], 00 //bad guy
:00422806 EB09 jmp 00422811

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422800(U)
|
:00422808 FF45F0 inc [ebp-10]
:0042280B 837DF00A cmp dword ptr [ebp-10], 0000000A //循环比较10个字节
:0042280F 75D8 jne 004227E9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422806(U)
|
:00422811 8B45FC mov eax, dword ptr [ebp-04]
:00422814 C6407300 mov [eax+73], 00
:00422818 8B45FC mov eax, dword ptr [ebp-04]
:0042281B C6407201 mov [eax+72], 01
:0042281F 807DDF00 cmp byte ptr [ebp-21], 00 //bag guy?
:00422823 740A je 0042282F

* Possible StringData Ref from Code Obj ->"sdf"
|
:00422825 686C284200 push 0042286C //注册与否的标志！

* Reference To: kernel32.AddAtomA, Ord:0000h
|
:0042282A E8191EFEFF Call 00404648

可见关键的断点是GetAtomNameA( )。

BF


s-spline2.03

标 题:s-spline2.03 (1千字)
发信人:1212
时 间:2001-4-14 21:47:52
详细信息:
想跟注册码的话简直要被它故意搞的无数个GetTickCount( )烦死不可！
它设了好几个标志来标明是否注册版。

1、决定启动时的splash screen是否显示unregistered
：
0177:0041B44E CMP [004D47E8],EBX
0177:0041B454 MOV BYTE PTR [EBP-04],05
0177:0041B458 JZ 0041B462
0177:0041B45A CMP [004D47F0],EBX
0177:0041B460 JNZ 0041B4E0
只有跳到0041B4E0才不会显示unregistered。

2、是否将save、save as菜单变灰。这DS:004D4804和DS:004A7F48的值只要不相等菜单就不会变灰，放大后的图像上也不会有unregistered水印，Help菜单中没有Register项，但打开文件或存盘的时候会非法操作（但产生的错误信息中写着是registered version），估计还有其它判断

0177:00417D92 MOV EAX,[EBP-38]
0177:00417D95 MOV EAX,[EAX+0000021C] //标志位DS:004D4804
0177:00417D9B CMP EAX,[004A7F48] //预置的值
0177:00417DA1 JNZ 00417DDB
0177:00417DA3 PUSH EBX
0177:00417DA4 PUSH 004C18CC //Menu_File_Save
0177:00417DA9 PUSH 00009C43
0177:00417DAE PUSH ESI
0177:00417DAF CALL 00417F08
0177:00417DB4 ADD ESP,0C
0177:00417DB7 MOV ECX,EAX
0177:00417DB9 CALL 00432A10
0177:00417DBE PUSH EBX
0177:00417DBF PUSH 004C18B8 //Menu_File_Save
0177:00417DC4 PUSH 00009C44
0177:00417DC9 PUSH ESI
0177:00417DCA CALL 00417F08

其它还有好几个标志，DS:004D4808中放的标志标明是否为DemoImage，是的话就不加水印。

标 题:v2.04的 (9千字)
发信人:blowfish
时 间:2001-4-16 13:01:20
详细信息:

输入注册码之后的判断：

0177:0040BB11 PUSH 004BF728 //DialogRegister::RegisterButton.OnClick( )
0177:0040BB16 CALL 0041EBB6
0177:0040BB1B LEA ECX,[EBP-01EC]
0177:0040BB21 CALL 0041C0CF
0177:0040BB26 AND DWORD PTR [EBP-04],00
0177:0040BB2A PUSH 0040118F
0177:0040BB2F PUSH 0041EB3F
0177:0040BB34 PUSH 03
0177:0040BB36 PUSH 18
0177:0040BB38 LEA EAX,[EBP-00F0]
0177:0040BB3E PUSH EAX
0177:0040BB3F CALL 0047E80A
0177:0040BB44 MOV ECX,[EBP-24]
0177:0040BB47 MOV BYTE PTR [EBP-04],01
0177:0040BB4B CALL 00427F9E
0177:0040BB50 MOV EBX,EAX
0177:0040BB52 CALL 0042FA11
0177:0040BB57 LEA EAX,[EBP-00A8]
0177:0040BB5D PUSH EAX
0177:0040BB5E LEA ECX,[EBX+000001E0]
0177:0040BB64 CALL 00428000 //GetWindowTextA( ), Name
0177:0040BB69 MOV ESI,004BF724
0177:0040BB6E PUSH ESI
0177:0040BB6F LEA ECX,[EBP-00A8]
0177:0040BB75 MOV BYTE PTR [EBP-04],02
0177:0040BB79 CALL 00420B42
0177:0040BB7E LEA EAX,[EBP-0090]
0177:0040BB84 PUSH EAX
0177:0040BB85 LEA ECX,[EBX+00000224]
0177:0040BB8B CALL 00428000 //GetWindowTextA( ), Company
0177:0040BB90 PUSH ESI
0177:0040BB91 LEA ECX,[EBP-0090]
0177:0040BB97 MOV BYTE PTR [EBP-04],03
0177:0040BB9B CALL 00420B42
0177:0040BBA0 MOV ECX,EBX
0177:0040BBA2 CALL 0040B9D9
0177:0040BBA7 LEA EAX,[EBP-01B8]
0177:0040BBAD LEA ECX,[EBX+0000019C]
0177:0040BBB3 PUSH EAX
0177:0040BBB4 CALL 00428000 //GetWindowTextA( ), Serial[1]
0177:0040BBB9 MOV ESI,EAX
0177:0040BBBB LEA EAX,[EBP-01A0]
0177:0040BBC1 PUSH EAX
0177:0040BBC2 LEA ECX,[EBX+00000158]
0177:0040BBC8 MOV BYTE PTR [EBP-04],04
0177:0040BBCC CALL 00428000 //GetWindowTextA( ), Serial[2]
0177:0040BBD1 MOV EDI,EAX
0177:0040BBD3 LEA EAX,[EBP-0170]
0177:0040BBD9 PUSH EAX
0177:0040BBDA LEA ECX,[EBX+00000114]
0177:0040BBE0 MOV BYTE PTR [EBP-04],05
0177:0040BBE4 CALL 00428000 //GetWindowTextA( ), Serial[3]
0177:0040BBE9 MOV [EBP-1C],EAX
0177:0040BBEC LEA EAX,[EBP-0158]
0177:0040BBF2 PUSH EAX
0177:0040BBF3 LEA ECX,[EBX+000000D0]
0177:0040BBF9 MOV BYTE PTR [EBP-04],06
0177:0040BBFD CALL 00428000 //GetWindowTextA( ), Serial[4]
0177:0040BC02 MOV [EBP-14],EAX
0177:0040BC05 LEA EAX,[EBP-0188]
0177:0040BC0B PUSH EAX
0177:0040BC0C LEA ECX,[EBX+0000008C]
0177:0040BC12 MOV BYTE PTR [EBP-04],07
0177:0040BC16 CALL 00428000 //GetWindowTextA( ), Serial[5]
........
0177:0040BE4E PUSH EAX
0177:0040BE4F MOV ECX,ESI
0177:0040BE51 CALL 00459A71 //第一处疯狂计算的地方，
0177:0040BE56 TEST AL,AL
0177:0040BE58 MOV [EBP-15],AL //返回值
0177:0040BE5B JNZ 0040BF1C
0177:0040BE61 LEA EAX,[EBP-40]
0177:0040BE64 PUSH EAX
0177:0040BE65 LEA ECX,[EBX+48]
0177:0040BE68 CALL 00428000 //GetWindowTextA
...........
0177:0040BF0F PUSH EAX
0177:0040BF10 MOV ECX,ESI
0177:0040BF12 CALL 00459A71 //第二处疯狂计算的地方
0177:0040BF17 MOV [EBP-15],AL //返回值
0177:0040BF1A JMP 0040BF1E
0177:0040BF1C XOR EDI,EDI
0177:0040BF1E LEA EAX,[EBP-60]
0177:0040BF21 PUSH EAX
0177:0040BF22 LEA ECX,[EBX+48]
0177:0040BF25 CALL 00428000
0177:0040BF2A PUSH 004BF704 //注册码的第一部分Serial[1]的黑名单“!AMOK”？
0177:0040BF2F MOV ECX,EAX
0177:0040BF31 MOV BYTE PTR [EBP-04],27
0177:0040BF35 CALL 0041FC03 //strcmp( )
0177:0040BF3A TEST AL,AL
0177:0040BF3C JNZ 0040BF84
0177:0040BF3E LEA EAX,[EBP-40]
0177:0040BF41 PUSH EAX
0177:0040BF42 LEA ECX,[EBX+0000019C]
0177:0040BF48 CALL 00428000 //GetWindowTextA( ), Serial[6]
0177:0040BF4D PUSH 004BF6FC //注册码的最后一部分的黑名单？（有不可显示字符）
0177:0040BF52 MOV ECX,EAX
0177:0040BF54 MOV BYTE PTR [EBP-04],28
0177:0040BF58 CALL 0041FC03 //strcmp( )，跟进去可看到CMPSB指令
0177:0040BF5D MOV [EBP-0D],AL //比较的结果。
0177:0040BF60 LEA ECX,[EBP-3C]
0177:0040BF63 MOV BYTE PTR [EBP-04],29
0177:0040BF67 CALL 0040117A
0177:0040BF6C LEA ECX,[EBP-40]
0177:0040BF6F MOV BYTE PTR [EBP-04],27
0177:0040BF73 CALL 0040117A
0177:0040BF78 CMP BYTE PTR [EBP-0D],00 //标志位
0177:0040BF7C JNZ 0040BF84
0177:0040BF7E AND BYTE PTR [EBP-0D],00
0177:0040BF82 JMP 0040BF88
0177:0040BF84 MOV BYTE PTR [EBP-0D],01

启动时联网检查新版本（BPM WININET!InternetOpenUrlA X DO "d *(esp+8)"）：
017F:00AF1870 68 74 74 70 3A 2F 2F 77-77 77 2E 73 68 6F 72 74 http://www.short
017F:00AF1880 63 75 74 2E 6E 6C 2F 63-67 69 2D 62 69 6E 2F 43 cut.nl/cgi-bin/C
017F:00AF1890 68 65 63 6B 2E 63 67 69-3F 75 70 64 61 74 65 25 heck.cgi?update%
017F:00AF18A0 32 30 73 2D 73 70 6C 69-6E 65 5F 32 5F 78 00 00 20s-spline_2_x..

启动时联网检查注册码，如果检查不通过又成为unregistered。这个检查是随机的，即并非每次启动都检查。
017F:00AF2C10 68 74 74 70 3A 2F 2F 77-77 77 2E 73 68 6F 72 74 http://www.short
017F:00AF2C20 63 75 74 2E 6E 6C 2F 63-67 69 2D 62 69 6E 2F 43 cut.nl/cgi-bin/C
017F:00AF2C30 68 65 63 6B 2E 63 67 69-3F 4A 56 43 36 35 4A 58 heck.cgi?JVC65JX
017F:00AF2C40 46 56 4F 56 57 36 4E 47-50 50 56 56 45 34 4B 48 FVOVW6NGPPVVE4KH
017F:00AF2C50 49 41 00 2E 6E 6C 2F 53-51 00 00 00 51 00 00 00 IA..nl/SQ...Q...

相关的代码：
0177:004159DD LEA ECX,[ESI+0000089C]
0177:004159E3 PUSH ECX
0177:004159E4 LEA EAX,[ESI+00000884]
0177:004159EA PUSH EAX
0177:004159EB LEA EAX,[ESI+0000086C]
0177:004159F1 PUSH EAX
0177:004159F2 MOV ECX,ESI
0177:004159F4 CALL 00413013 //联网检查有无新版本
0177:004159F9 TEST AL,AL
0177:004159FB JZ 00415A4B
0177:004159FD LEA EAX,[ESI+00000884]
0177:00415A03 PUSH EAX
0177:00415A04 LEA EAX,[EBP-30]
0177:00415A07 PUSH 004C065C //"update"
0177:00415A0C PUSH EAX
0177:00415A0D CALL 00402CF8
0177:00415A12 SUB ESP,0C
0177:00415A15 MOV ECX,ESP
0177:00415A17 MOV [EBP-10],ESP
0177:00415A1A PUSH 004C0650 //"available"
0177:00415A1F PUSH ECX
0177:00415A20 MOV ECX,EAX
0177:00415A22 MOV BYTE PTR [EBP-04],37
0177:00415A26 CALL 0041FFC9
0177:00415A2B MOV ECX,[EBP-14]
0177:00415A2E CALL 0041BADD
0177:00415A33 LEA ECX,[EBP-2C]
0177:00415A36 MOV BYTE PTR [EBP-04],38
0177:00415A3A CALL 0040117A
0177:00415A3F MOV BYTE PTR [EBP-04],24
0177:00415A43 LEA ECX,[EBP-30]
0177:00415A46 JMP 00415AEA
0177:00415A4B CMP BYTE PTR [ESI+000000D4],00 //标志位
0177:00415A52 PUSH FF
0177:00415A54 JZ 00415AA1
0177:00415A56 PUSH 0000E156
.......................
0177:00415A9F JMP 00415AEA
0177:00415AA1 PUSH 0000E15E
.......................
0177:00415AEA CALL 0040117A
0177:00415AEF MOV ECX,ESI
0177:00415AF1 CALL 004161C5 //本地检查注册码，并随机联网检查注册码
0177:00415AF6 FLD1
0177:00415AF8 FSTP REAL8 PTR [ESI+00000298]

在上面的0177:00415AF1处跟进去，看见本地判断注册码的地方：

0177:0041644C CALL [EAX+14] //判断注册码，里面是疯狂的计算
0177:0041644F MOV ECX,004D420C
0177:00416454 MOV [EBP-0D],AL //判断的结果
0177:00416457 CALL 0041E80A
0177:0041645C CMP BYTE PTR [EBP-0D],00 //注册码错误？
0177:00416460 JZ 004168BD
0177:00416466 MOV ECX,[EDI+00000208]
0177:0041646C CMP ECX,[004A5C78]
0177:00416472 LEA EAX,[EDI+00000208]
0177:00416478 JNZ 00416482

再在上面的0177:0041644C处跟进去，疯狂的计算就开始了。第一处比较注册码的地方如下：

0177:004629C8 MOV EAX,[EBP-0244]
0177:004629CE IMUL EAX,EAX,000343FD //这是VC runtime lib中的rand函数,产生伪随机序列
0177:004629D4 ADD EAX,00269EC3
0177:004629D9 MOV [EBP-0244],EAX
0177:004629DF MOV EAX,[EBP+FFFFF1A8]
0177:004629E5 ADD EAX,[EBP+FFFFF19C]
0177:004629EB PUSH EAX
0177:004629EC PUSH 00
0177:004629EE PUSH DWORD PTR [EBP-0244]
0177:004629F4 CALL 004791DC
0177:004629F9 ADD ESP,0C
0177:004629FC MOV [EBP+FFFFF198],EAX
0177:00462A02 MOV EAX,[EBP+FFFFF1B4]
0177:00462A08 SUB EAX,[EBP+FFFFF198]
0177:00462A0E SUB EAX,0A
0177:00462A11 CMP [EBP-0174],EAX
0177:00462A17 JGE 00462A7D
0177:00462A19 MOV EAX,[EBP-0174]
0177:00462A1F MOVSX EAX,BYTE PTR [EAX+EBP-0160]
0177:00462A27 MOV [EBP-0178],EAX
0177:00462A2D CMP DWORD PTR [EBP-0178],39
0177:00462A34 JLE 00462A47
0177:00462A36 MOV EAX,[EBP-0178]
0177:00462A3C SUB EAX,41
0177:00462A3F MOV [EBP-0178],EAX
0177:00462A45 JMP 00462A56
0177:00462A47 MOV EAX,[EBP-0178]
0177:00462A4D SUB EAX,30
0177:00462A50 MOV [EBP-0178],EAX
0177:00462A56 MOV EAX,[EBP-0178]
0177:00462A5C MOVSX EAX,BYTE PTR [EAX+EBP-34] //真注册码
0177:00462A61 MOV ECX,[EBP+10]
0177:00462A64 ADD ECX,[EBP-0174]
0177:00462A6A MOVSX ECX,BYTE PTR [ECX] //假注册码
0177:00462A6D CMP EAX,ECX //比较
0177:00462A6F JZ 00462A78
0177:00462A71 XOR AL,AL //bad guy
0177:00462A73 JMP 0046A910
0177:00462A78 JMP 004626A5

可见，只要AL中返回0、跳到0046A910处注册码就是错的。反汇编一下，看看有哪些地方是跳到0046A910去的，就可以直接找到比较的地方，免得在那些疯狂的计算中看得眼花。


Scanline Swiftsearch 2.0

 标 题:翻译一篇写注册机的教程！大侠就不要看了 (5千字)
发信人:TAE!
时 间:2001-7-18 22:01:09
详细信息:
原著：raZZia
翻译：TAE![CCG]
呵呵，今日闲来无事，碰巧最近对写注册机感兴趣所以翻译了一篇写注册机的教
程，较简单，不知有没有大侠翻过。有疏漏错误的地方还请各位更正！
工具!
你需要一个像softice那样的Windows下的调试软件，和一个Dos库C编译器

内容!
在这篇教程中我将告诉你如何做一个注册机，软件用的保护方式是很众所周知的
输入姓名和注册码的方式，在选择注册后，一个窗口弹了出来，那就是你要输入
名字和注册码的地方，这儿的对策就是在内存中找出输入的数据，在你继续之前
你必须确定你已经根据PWD的教程一设置了softice.dat文件

软件 1: Scanline Swiftsearch 2.0!
Swiftsearch 是一个很有用的小工具，你可以用它来在网络中搜索，我将一步步
的告诉你如何破解它！

步骤 1: 运行程序 :)

步骤 2: 选择菜单重的“注册”，你将发现一个可以输入姓名和注册码的窗口。

步骤 3: 进入softice (ctrl-d)

步骤 4: 我现在将设置一个像GetWindowText(a)和GetDlgItemText(a)这样的断点
来找到内存中我们刚刚输入的数据。能够被用于这个程序的函数仅仅是GetDlgItemTexta
(对与错还是你自己试试吧 :)所以，在SoftIce中输入 BPX GetDlgItemTexta
然后用 g 命令退出SoftIce。

步骤 5: 现在输入名字和注册码(我使用的是 razzia 和 12345)并且按 OK,这将带
你回到SoftIce，现在你已经在GetDlgItemTexta函数中了，按 F11离开函数。你应
该看到下面的代码：

lea eax, [ebp-2C] ;<--- 我们在找这个位置（？不理解）
push eax
push 00000404
push [ebp+08]
call [USER32!GetDlgItemTextA]
mov edi, eax ;<--- eax 已经指向字符串长度了，并且一会儿
就会被存储到 edi 中了。

我们看见 EAX 读入了一个内存地址并且作为函数GetDlgItemTextA的一个参数被
压进了堆栈中，而后函数GetDlgItemTextA准备开始执行了，我们来查看 EBP-2c
(用 ED EDP-2c)并且可以看见那儿有我们输入的名字，现在我们知道我们的名字
被存放在内存中的什么地方了，通常应该把这个地址记下来，但我们即将看到，
那是不必的。

那么,下一步做什么? 现在我们必须跟着程序来读取我们输入的注册码。输入 g 我
们再次返回softice的时候按F11，你将看到下面的代码:

push 0000000B
lea ecx, [ebp-18] ;<--所以, ebp-18 是存放输入的注册码的地方
push ecx
push 0000042A
push [ebp+08]
call [USER32!GetDlgItemTextA]
mov ebx, eax ;<--将字符长度保存在 EBX 中
test edi, edi ;<--还记得 EDI 是放我们输入名字长度的地方吗？
jne 00402FBF

我们看见我们输入得注册码被存放在 EBP-18 中了 ,不相信得话可以用ED EBP-18
查看一下。 通常这个地址也应该记下来，并且我们看见它检查我们的名字长度是
否是0，如果不是的话，程序将继续。

步骤 6: 那好，现在我们知道我们输入的数据被存放在哪里了。那么，下一步呢？
现在我们已经知道怎样做了，通常我们应该在内存中设置断点以便于知道程序哪些
地方读取了这里。但在这个步软件里仅仅需要按住F10，直到呢看见了以下代码：

cmp ebx, 0000000A ;<--记得 EBX 是放输入注册码长度的地方吗？
je 00402FDE

这两行很重要！它们检查了输入注册码的长度是否等于10。如果不是，那么程序就
已经认为注册码是错误的了。修改 EBX 或者在寄存器数据窗口修改标志位寄存器(FLAG)
以便让程序跳转.继续按F10知道呢到达下面的代码处。
(记住，这可能和你的地址不一样！)

:00402FDE xor esi, esi ;<-- 清空 ESI
:00402FE0 xor eax, eax ;<-- 清空 EAX
:00402FE2 test edi, edi
:00402FE4 jle 00402FF2
:00402FE6 movsx byte ptr ecx, [ebp + eax - 2C] ;<-- ECX 载入我们输入名字的一个字母.
:00402FEB add esi, ecx ;<-- 将字母加到 ESI
:00402FED inc eax ;<-- EAX 加1以便得到下一个字母
:00402FEE cmp eax, edi ;<-- 取完了吗？
:00402FF0 jl 00402FE6 ;<-- 如果没有，就去取下一个字母。

好的，我们看见程序将我们输入名字的所有字母加起来，那么 ESI 就是总和了，让
我们继续并且找出程序用那个值做什么！

:00402FF2 push 0000000A
:00402FF4 lea eax, [ebp-18] ;<-- 将输入注册码的地址放入 EAX
:00402FF7 push 00000000
:00402FF9 push eax ;<-- 压入 EAX (作为下面一个Call的参数)
:00402FFA call 00403870 ;<-- 好的，你认为这个Call是干什么的呢？:)
:00402FFF add esp, 0000000C
:00403002 cmp eax, esi ;<-- 嘿!
:00403004 je 00403020

我们进入CALL，它最终反回 ESI，并和 EAX 比较.嗯,让我们看看 EAX 是什么。‘? EAX’显示
00003039 0000012345 "09"

好极了！那是我们输入的注册码！ 那么ESI呢？我们知道，ESI中是我们输入名字
的所有字母总和！！

步骤 7: 现在我们知道程序是如何计算注册码的了，我们可以做注册机了！
但别忘了程序检查了注册码是不是10位！
一个简单的C程序将计算出这个软件的注册码:

#include <stdio.h>
#include <string.h>
main() {
char Name[100];
int NameLength,Offset;
long int Reg = 0, Dummy2 = 10;
int Dummy = 0;
int LengtDummy = 1;
int Lengt , Teller;
printf("Scanline SwiftSearch 2.0 crack by raZZia.\n");
printf("Enter your name: ");
gets(Name);
NameLength=strlen(Name);

/* 计算输入的名字字符的总和*/
/* 并保存到Reg中 */
for (Offset=0;Offset<NameLength;Offset=Offset+1) {
Reg=Reg+Name[Offset];
}

/* the while lus calculates the lenght of the figure in */
/* Reg and places it in Lengt */
while (Dummy != 1) {
if ( Reg < Dummy2 ) {
Lengt = LengtDummy ; Dummy =1;
}
else {
LengtDummy=LengtDummy + 1; Dummy2=Dummy2*10;
}
};

printf("\nYour registration number is : " );

/* 收先打印(10-Lengt)次0 */
Lengt=10-Lengt;
for (Teller=1;Teller<=Lengt;Teller=Teller+1) printf("0");
/* 打印注册码 */
printf("%lu\n",Reg);
}


SCS V.J

SCS V.J破解实录

用了几个星期来跟踪INSTSCS.EXE始终没有结果,突然想到在用ICE跟踪的时候,按F12键
时第11次就死机了,会不会......
于是我就在读完密盘以后按CTRL+D调入ICE,"大约在10%处
<S DS:0 L FFFFFFFF '9090'>
搜出在0E24:F79B处出现了我的密码，先碰碰运气再说,向下找可疑代码,
< 0805YYZIP >
这个0805会不会就是密码呢? 我们知道,SCS40.DAT的压缩是用YYZIP作的,"鬼才知道YYZIP
是什么压缩软件,不管它.这一定就是了,因为在解压缩这前一定会验证密码的.
重新运行INSTSCS.EXE 输入0805 直到安装完成,哈哈 ^_^ 成功了。原来这么简单，
大家都上当了。

由于心情不好，所以没有写出注册机，先把破解方法告诉大家，哪位高手，
有兴趣写一个吧！！！！

幻影侠
14:05 00-9-10


Search32V5.08

 标 题:Search32最新版V5.08注册算法笔记 (一） (10千字)
发信人:moonlite
时 间:2001-8-11 11:41:32
详细信息:
Search32最新版V5.08注册算法笔记 (一）

作者：moonlite
目标： Search32最新版V5.08
应用平台：Windows 9X
下载：http://www.anetsoft.com
大小：1100k
软件用途： Search32 号称是Windows下最快的32位搜索工具。它是离线的搜索引擎，可在本地硬盘里
包括Cache）中用关键字快速查找。

工具：TRW1.22，W32dasm, file info 2.45，teunlockv1, UltraEdit 。
保护： 每次启动都弹出注册窗，提示注册; 30 天试用期；tELock壳; 反调试。

前言： 记得是半年前了，它的v5.05版没有彻底搞定，不甘心啊!直到现在也没有看到v5.x版的破解资料，
还是再“反攻”一次！

过程实录：

[1] 启动 Search 32, 烦人的注册窗弹出。随便输入姓名和注册码，失败提示 "Entered password is invalid for..."。
[2] 试着启动TRW加载。很快消息窗弹出“Hmm...Debug yourself."这个壳还够厉害。
[3] 用teunlockv1脱掉它后，用w32dasm反汇编，查找"Entered password is invalid for...". 找到一处：

:0048720F 50 push eax
:00487210 8B00 mov eax, dword ptr [eax]
:00487212 FF5074 call [eax+74]<-------------------有问题的call; 如果返回的eax=0，就没戏唱了**
:00487215 8B1510124B00 mov edx, dword ptr [004B1210]
:0048721B 8902 mov dword ptr [edx], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004871D9(U)
|
:0048721D A110124B00 mov eax, dword ptr [004B1210]
:00487222 833800 cmp dword ptr [eax], 00000000
:00487225 750F jne 00487236

* Possible StringData Ref from Data Obj ->"Entered password is invalid for " <---------------出错信息
->"
the given registration number."
|
:00487227 B864744800 mov eax, 00487464
:0048722C E8CB86FBFF call 0043F8FC
:00487231 E9DE010000 jmp 00487414

很明显，:00487212 处的call有问题。

[3]再次启动 Search 32，在注册窗 输入姓名:
“moonlite&Group [FCG]” 和注册码“78787878121212129898989845454545”
为什么这么长字串呢？我试过，短了不行）。启动TRW， 按CTL+D 来到TRW的领空。
设断： bpx 487212，F5返回主程点击OK，被TRW拦住去路。
进入那个有问题的call:

:00487212 FF5074 call [eax+74]---->进入。。。

----------SRCH32_D! is Expired + 00DF——————
:10001E6F 90 nop
:10001E70 8B44240C mov eax, dword ptr [esp+0C]//<------光标在这！
:10001E74 8B4C2408 mov ecx, dword ptr [esp+08]//在此下d eax, d ecx 分别可以看到
//输入的假password 和ID;
:10001E78 56 push esi
:10001E79 50 push eax
:10001E7A 51 push ecx
* Reference To: SRCH32_D.?checkData@@YGHPAD0@Z
|
:10001E7B E880F4FFFF call 10001300//检查注册码的关键call, 进入==>
:10001E80 8BF0 mov esi, eax//返回的eax送 esi;
:10001E82 83FE01 cmp esi, 00000001
:10001E85 7515 jne 10001E9C//eax不是1，就跳走，那就失败！
:10001E87 8B542408 mov edx, dword ptr [esp+08]
:10001E8B 5E pop esi
:10001E8C 894224 mov dword ptr [edx+24], eax
:10001E8F C705146C011000000000 mov dword ptr [10016C14], 00000000//送成功标志！
:10001E99 C20C00 ret 000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E85(C)
|
:10001E9C 68D0070000 push 000007D0//sleep 7D0h 毫秒；

* Reference To: KERNEL32.Sleep, Ord:0296h
|
:10001EA1 FF1534200110 Call dword ptr [10012034]
:10001EA7 8BC6 mov eax, esi//将esi,即0的值还给eax;
:10001EA9 5E pop esi
:10001EAA C20C00 ret 000C
————————————

下面是注册码的算法--》

[4] 检查注册码的关键call:

* Referenced by a CALL at Address:
|:10001E7B
|

Exported fn(): ?checkData@@YGHPAD0@Z - Ord:0001h
:10001300 81ECDC020000 sub esp, 000002DC
:10001306 53 push ebx
:10001307 55 push ebp
:10001308 56 push esi
:10001309 57 push edi
:1000130A 8BBC24F0020000 mov edi, dword ptr [esp+000002F0]//----->指向输入的ID；
//我的是 “moonlite&Group [FCG]”;
:10001311 83C9FF or ecx, FFFFFFFF
:10001314 33C0 xor eax, eax
:10001316 33DB xor ebx, ebx
:10001318 F2 repnz
:10001319 AE scasb
:1000131A F7D1 not ecx
:1000131C 2BF9 sub edi, ecx
:1000131E 8D9424A8000000 lea edx, dword ptr [esp+000000A8]
:10001325 8BC1 mov eax, ecx

//以上是算ID的长度；//

:10001327 8BF7 mov esi, edi
:10001329 8BFA mov edi, edx
:1000132B 895C241C mov dword ptr [esp+1C], ebx
:1000132F C1E902 shr ecx, 02
:10001332 F3 repz
:10001333 A5 movsd

//ID字串从esi传送到edi 处；//

.............

:10001344 8D8C24A8000000 lea ecx, dword ptr [esp+000000A8]//----->指向输入的ID；
:1000134B 895C2414 mov dword ptr [esp+14], ebx
:1000134F 51 push ecx
:10001350 E881020100 call 100115D6// ;若ID是小写字母-->变成大写；若ID是大写字母或数字-->不变
:10001355 83C404 add esp, 00000004
:10001358 53 push ebx

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
|
:10001359 FF1530200110 Call dword ptr [10012030]

//这个call检查所用驱动器的类型（可查手册）;
//这里返回eax=3，即Fixed Drive;

:1000135F 3BC5 cmp eax, ebp//ebp=5; 5为CD-ROM；
:10001361 8B8424A8000000 mov eax, dword ptr [esp+000000A8]//----->指向输入的ID；
:10001368 750F jne 10001379//在此跳转！

.......................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001368(C)
|
:10001379 3C43 cmp al, 43//比较ID的第一个是不是字母“C”；
:1000137B 7509 jne 10001386//不是就跳走；
:1000137D 80FC44 cmp ah, 44//比较ID的第二个是不是字母“D”；
:10001380 0F842F040000 je 100017B5//如果ID的前二个字母是“CD”就失败！****

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000136C(C), :10001377(U), :1000137B(C)
|
:10001386 A1006C0110 mov eax, dword ptr [10016C00]
:1000138B 8D9424E8010000 lea edx, dword ptr [esp+000001E8]
:10001392 6804010000 push 00000104
:10001397 52 push edx
:10001398 50 push eax

* Reference To: KERNEL32.GetModuleFileNameA, Ord:0124h
|
:10001399 FF152C200110 Call dword ptr [1001202C]//获取一个已装载模板的完整路径名称;
//返回的EAX等于路径字符串的长度;
:1000139F 85C0 test eax, eax//非0表示成功;
:100013A1 0F840E040000 je 100017B5
:100013A7 8D8C24E8010000 lea ecx, dword ptr [esp+000001E8]//指向SRCH32_D.DLL所在路径;
:100013AE 6A5C push 0000005C
:100013B0 51 push ecx
:100013B1 E8CA980000 call 1000AC80//获取SRCH32_D.DLL字串的地址;
:100013B6 8BF0 mov esi, eax//SRCH32_D.DLL字串不存在，则eax=0;
:100013B8 83C408 add esp, 00000008
:100013BB 3BF3 cmp esi, ebx
:100013BD 0F84F2030000 je 100017B5//判断字串存在与否的跳转; ****
:100013C3 46 inc esi
:100013C4 56 push esi
:100013C5 89742428 mov dword ptr [esp+28], esi
:100013C9 E808020100 call 100115D6// 参考 :10001350的call;
:100013CE 8DBC24AC000000 lea edi, dword ptr [esp+000000AC]//指向输入的ID字符串;
:100013D5 83C9FF or ecx, FFFFFFFF
:100013D8 33C0 xor eax, eax
:100013DA 83C404 add esp, 00000004
:100013DD F2 repnz
:100013DE AE scasb
:100013DF F7D1 not ecx
:100013E1 49 dec ecx//算它的长度;
:100013E2 83F920 cmp ecx, 00000020//长度是否20h位？
:100013E5 732E jnb 10001415
:100013E7 8BFE mov edi, esi

.................

:10001404 8BCA mov ecx, edx
:10001406 4F dec edi
:10001407 C1E902 shr ecx, 02
:1000140A F3 repz
:1000140B A5 movsd
:1000140C 8BCA mov ecx, edx
:1000140E 83E103 and ecx, 00000003
:10001411 F3 repz
:10001412 A4 movsb//将“SRCH32_D.DLL”移动到ID字符串的后面，得新ID字串；
//即 “MOONLITE&GROUP [FCG]SRCH32_D.DLL”
:10001413 EB0B jmp 10001420

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013E5(C)
|
:10001415 8D840C9C000000 lea eax, dword ptr [esp+ecx+0000009C]
:1000141C 89442424 mov dword ptr [esp+24], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001413(U)
|
:10001420 8BB424F4020000 mov esi, dword ptr [esp+000002F4]//指向输入的注册码;
:10001427 83C9FF or ecx, FFFFFFFF
:1000142A 8BFE mov edi, esi
:1000142C 33C0 xor eax, eax
:1000142E F2 repnz
:1000142F AE scasb
:10001430 F7D1 not ecx
:10001432 49 dec ecx//计算所输入的出注册码的长度;
:10001433 8BD1 mov edx, ecx//送edx;
:10001435 83FA18 cmp edx, 00000018//18h=24位;
:10001438 89542418 mov dword ptr [esp+18], edx//将注册码的长度保存;
:1000143C 0F8273030000 jb 100017B5//注册码的长度小于24位，就完了; ****
:10001442 B907000000 mov ecx, 00000007//置循环次数;
:10001447 B84D4D4D4D mov eax, 4D4D4D4D
:1000144C 8D7C2448 lea edi, dword ptr [esp+48]
:10001450 F3 repz
:10001451 AB stosd
:10001452 66AB stosw
:10001454 AA stosb//到此，将4*7+2+1=31字节用“4D”填满:
:10001455 B81F000000 mov eax, 0000001F
:1000145A B14D mov cl, 4D

..........................

<待续>

标 题:Search32最新版V5.08注册算法笔记 (二) (15千字)
发信人:moonlite
时 间:2001-8-11 11:55:21
详细信息:

Search32最新版V5.08注册算法笔记 (二) （续上篇）++

........................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100014FB(C)
|
:10001475 0FBE0C33 movsx ecx, byte ptr [ebx+esi]将输入的注册码的第一个字符送ecx;
:10001479 51 push ecx
:1000147A E8D7970000 call 1000AC56//将注册码字符查表，0～9数字对应“84”,返回eax=4;
:1000147F 83C404 add esp, 00000004
:10001482 85C0 test eax, eax
:10001484 7512 jne 10001498

------------------------------------------------------------------------------------------------------------------------------

将输入的注册码按奇数和偶数位分两组，并按不同次序排列;

如果注册码的形式是：
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24

则分组后排列为：
奇数位组: a1 a3 a5 a7 a9 a11 a13 a15 a17 a 19 a21 a23

偶数位组: a24 a 20 a16 a12 a8 a4 a2 a6 a10 a14 a18 a20 （以a2为对称中心）
^
---------------------------------------------------------------------------------------------------------------------------------

:100014F8 43 inc ebx
:100014F9 3BD8 cmp ebx, eax
:100014FB 0F8274FFFFFF jb 10001475

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000146F(C)
|
:10001501 8D7C2448 lea edi, dword ptr [esp+48]//指向偶数位组地址: 0070f01c;
:10001505 83C9FF or ecx, FFFFFFFF
:10001508 33C0 xor eax, eax
:1000150A C6442C4800 mov [esp+ebp+48], 00
:1000150F F2 repnz
:10001510 AE scasb//计算偶数位组中（从70f01c开始）后半部分的长度;
:10001511 8B542420 mov edx, dword ptr [esp+20]
:10001515 F7D1 not ecx
:10001517 49 dec ecx
:10001518 C644142800 mov [esp+edx+28], 00
:1000151D 83E1FE and ecx, FFFFFFFE
:10001520 83F90A cmp ecx, 0000000A//该长度与“A”比较;
:10001523 0F828C020000 jb 100017B5//小于则失败; ****
:10001529 8D442448 lea eax, dword ptr [esp+48]//指向偶数位组地址: 0070f01c;
:1000152D 50 push eax
:1000152E E818970000 call 1000AC4B//偶数位组后半部分的计算, 结果送eax;
//比方这部分的ASI字符的形式是: 00000083450, 那么
//eax返回83450的HEX值; 假如该ASCII字符大于
//FFFFFFFFh=4294967295, 则返回的eax就不是此规律了;

:10001533 8B7C2428 mov edi, dword ptr [esp+28]
:10001537 8BD8 mov ebx, eax//eax送ebx保存;
:10001539 A1086C0110 mov eax, dword ptr [10016C08]//置数;
:1000153E 83C9FF or ecx, FFFFFFFF
:10001541 33D8 xor ebx, eax
:10001543 33C0 xor eax, eax

........................

:1000155D 8BCD mov ecx, ebp
:1000155F 4F dec edi
:10001560 C1E902 shr ecx, 02
:10001563 F3 repz
:10001564 A5 movsd
:10001565 8BCD mov ecx, ebp
:10001567 83E103 and ecx, 00000003
:1000156A F3 repz
:1000156B A4 movsb//将“SRCH32_D.DLL”移动并接到奇数位组的后面,得新奇数位组字串;

:1000156C 8DBC24A8000000 lea edi, dword ptr [esp+000000A8]//指向新ID字串;
:10001573 83C9FF or ecx, FFFFFFFF
:10001576 F2 repnz
:10001577 AE scasb
:10001578 F7D1 not ecx
:1000157A 49 dec ecx//得新ID字串的长度，我的是20h;
:1000157B 8D7C2428 lea edi, dword ptr [esp+28]//指向奇数位组字串;
:1000157F 8BD1 mov edx, ecx
:10001581 83C9FF or ecx, FFFFFFFF
:10001584 F2 repnz
:10001585 AE scasb
:10001586 F7D1 not ecx
:10001588 49 dec ecx//计算它的长度;
:10001589 83FA20 cmp edx, 00000020//新ID字串的长度与20h比较;
:1000158C 894C2418 mov dword ptr [esp+18], ecx
:10001590 0F821F020000 jb 100017B5//小于的话，命运就惨了！！****
:10001596 85D2 test edx, edx
:10001598 7617 jbe 100015B1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100015AF(C)
|
:1000159A 0FBE8C04A8000000 movsx ecx, byte ptr [esp+eax+000000A8]//新ID字串第一字节送ecx;
:100015A2 8B7C241C mov edi, dword ptr [esp+1C]
:100015A6 03F9 add edi, ecx//将它的HEX值按字节累加;
:100015A8 40 inc eax
:100015A9 3BC2 cmp eax, edx
:100015AB 897C241C mov dword ptr [esp+1C], edi//累加的结果保存起来。假定为十六进数为T;
:100015AF 72E9 jb 1000159A

........................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100015B6(C)
|
:100015D8 8BB424A8000000 mov esi, dword ptr [esp+000000A8]//指向新ID字串;
:100015DF B804000000 mov eax, 00000004//初始eax;

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:100015C0(C), :100015D6(U)
|
:100015E4 3BC2 cmp eax, edx
:100015E6 7310 jnb 100015F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100015F6(C)
|
:100015E8 8BAC04A8000000 mov ebp, dword ptr [esp+eax+000000A8]
:100015EF 83C004 add eax, 00000004
:100015F2 33F5 xor esi, ebp//将新ID字串的5～8位和1～4位做异或, 再将结果与9～12位异或;
//类推，直到完成, 结果存esi。 假定为十六进数为M;
:100015F4 3BC2 cmp eax, edx
:100015F6 72F0 jb 100015E8

......................................

<<<从:1000161E　到　:1000163A　是将奇数位组字串求异或，结果存ebp。 假定为十六进数为N;算法同上>>>

....................................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000162D(C)
|
:1000163C 8D542468 lea edx, dword ptr [esp+68]
:10001640 6A0A push 0000000A
:10001642 52 push edx
:10001643 8BC6 mov eax, esi
:10001645 33D2 xor edx, edx
:10001647 B9FFFFFF7F mov ecx, 7FFFFFFF
:1000164C F7F1 div ecx//新ID 字串异或值除ecx, 得余数edx;
:1000164E 33EB xor ebp, ebx//N与ebx异或，结果假定为数Y;
:10001650 52 push edx
:10001651 E8FFF60000 call 10010D55//将M转成10进制数－－假定为数A;
:10001656 8B5C2428 mov ebx, dword ptr [esp+28]//指向T;
:1000165A 8B3D086C0110 mov edi, dword ptr [10016C08]
:10001660 8D9424B4010000 lea edx, dword ptr [esp+000001B4]
:10001667 6A0A push 0000000A
:10001669 52 push edx
:1000166A 53 push ebx
:1000166B 33F7 xor esi, edi//M与edi异或，结果假定为数X;
:1000166D E8E3F60000 call 10010D55//将T的值转成10进制数－－假定为数B;
:10001672 8DBC2480000000 lea edi, dword ptr [esp+00000080]
:10001679 83C9FF or ecx, FFFFFFFF
:1000167C 33C0 xor eax, eax
:1000167E 83C418 add esp, 00000018
:10001681 F2 repnz
:10001682 AE scasb
:10001683 F7D1 not ecx
:10001685 49 dec ecx//计算数A的长度;
:10001686 8DBC24A8010000 lea edi, dword ptr [esp+000001A8]
:1000168D 894C2424 mov dword ptr [esp+24], ecx//数A的长度保存;
:10001691 83C9FF or ecx, FFFFFFFF
:10001694 F2 repnz
:10001695 AE scasb
:10001696 F7D1 not ecx
:10001698 49 dec ecx//计算数B的长度;
:10001699 8BC3 mov eax, ebx
:1000169B 894C2418 mov dword ptr [esp+18], ecx//B的长度保存;
:1000169F 33D2 xor edx, edx
:100016A1 B905000000 mov ecx, 00000005
:100016A6 F7F1 div ecx//将T除以5, 得余数edx;
:100016A8 85D2 test edx, edx
:100016AA 8954241C mov dword ptr [esp+1C], edx//将余数edx保存-->J;
:100016AE 7504 jne 100016B4//不等于0则跳走;
:100016B0 894C241C mov dword ptr [esp+1C], ecx//余数等于0则将5保存。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100016AE(C)
|
:100016B4 33DB xor ebx, ebx
:100016B6 33FF xor edi, edi
:100016B8 3BF5 cmp esi, ebp//X与Y比较;
:100016BA C644241400 mov [esp+14], 00
:100016BF 0F85F0000000 jne 100017B5//不相等就完了; ****

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001796(C), :1000179E(U)
|
:100016C5 8A443C68 mov al, byte ptr [esp+edi+68]//数A的第一个字节送al;
:100016C9 8A4C241C mov cl, byte ptr [esp+1C]//数J送cl;
:100016CD 02C1 add al, cl
:100016CF 0FBED0 movsx edx, al//相加的结果送edx--->K;
:100016D2 52 push edx
:100016D3 88442416 mov byte ptr [esp+16], al
:100016D7 E87A950000 call 1000AC56//al如果是数字，返回的eax=4;否则，eax=0;
:100016DC 83C404 add esp, 00000004
:100016DF 85C0 test eax, eax
:100016E1 7505 jne 100016E8
:100016E3 80442412F7 add byte ptr [esp+12], F7//如果K不是数字，K加F7-->P;

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100016E1(C)
|
:100016E8 8A442412 mov al, byte ptr [esp+12]//数P送al;
:100016EC 8A4C1C28 mov cl, byte ptr [esp+ebx+28]//指向奇数位组字串的第一个字节;
:100016F0 3AC1 cmp al, cl//两数比较;
:100016F2 0F85BD000000 jne 100017B5//不等就死了; ****
:100016F8 43 inc ebx
:100016F9 83FB0E cmp ebx, 0000000E
:100016FC 0F83A1000000 jnb 100017A3
:10001702 0FBE4C1C28 movsx ecx, byte ptr [esp+ebx+28]//指向奇数位组字串的第二个字节;
:10001707 51 push ecx
:10001708 E849950000 call 1000AC56
:1000170D 83C404 add esp, 00000004
:10001710 85C0 test eax, eax
:10001712 750A jne 1000171E
:10001714 43 inc ebx
:10001715 83FB0E cmp ebx, 0000000E
:10001718 0F8385000000 jnb 100017A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001712(C)
|
:1000171E 8B742424 mov esi, dword ptr [esp+24]//A的长度送esi;
:10001722 47 inc edi
:10001723 3BFE cmp edi, esi
:10001725 7202 jb 10001729
:10001727 33FF xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001725(C)
|
:10001729 8BC7 mov eax, edi
:1000172B 33D2 xor edx, edx
:1000172D F7742418 div [esp+18]//除以B的长度;
:10001731 8A4C3C68 mov cl, byte ptr [esp+edi+68]//数A的第二个字节送al;
:10001735 8A442414 mov al, byte ptr [esp+14]
:10001739 6A0A push 0000000A
:1000173B 8A9414AC010000 mov dl, byte ptr [esp+edx+000001AC]//数B的第二个字节送dl;
:10001742 32D1 xor dl, cl//上面两数异或;

:10001744 B90A000000 mov ecx, 0000000A
:10001749 02C2 add al, dl
:1000174B 88442418 mov byte ptr [esp+18], al//累加的结果送[esp+18];
:1000174F 8D442416 lea eax, dword ptr [esp+16]
:10001753 50 push eax
:10001754 8B44241C mov eax, dword ptr [esp+1C]//指向id 偶数第一位;
:10001758 25FF000000 and eax, 000000FF
:1000175D 99 cdq
:1000175E F7F9 idiv ecx//除以Ah=10（十进制），得余数edx;
:10001760 52 push edx
:10001761 E8EFF50000 call 10010D55// 将edx 做ascii 字符调整, 保存于 [esp+1E];
:10001766 8A54241E mov dl, byte ptr [esp+1E]//送dl;
:1000176A 8A441C34 mov al, byte ptr [esp+ebx+34]//指向奇数位组的偶数第一位;
:1000176E 83C40C add esp, 0000000C
:10001771 3AD0 cmp dl, al//比较，不等就失败;
:10001773 7540 jne 100017B5
:10001775 43 inc ebx
:10001776 83FB0E cmp ebx, 0000000E
:10001779 7328 jnb 100017A3
:1000177B 0FBE441C28 movsx eax, byte ptr [esp+ebx+28]
:10001780 50 push eax
:10001781 E8D0940000 call 1000AC56
:10001786 83C404 add esp, 00000004
:10001789 85C0 test eax, eax
:1000178B 7506 jne 10001793
:1000178D 43 inc ebx
:1000178E 83FB0E cmp ebx, 0000000E//循环14次;
:10001791 7310 jnb 100017A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000178B(C)
|
:10001793 47 inc edi
:10001794 3BFE cmp edi, esi
:10001796 0F8229FFFFFF jb 100016C5
:1000179C 33FF xor edi, edi
:1000179E E922FFFFFF jmp 100016C5

......//上面是循环的计算和判断//......

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:100016FC(C), :10001718(C), :10001779(C), :10001791(C)
|
:100017A3 5F pop edi/<---------------如果走到这里就成功了！
:100017A4 5E pop esi
:100017A5 5D pop ebp
:100017A6 B801000000 mov eax, 00000001
:100017AB 5B pop ebx
:100017AC 81C4DC020000 add esp, 000002DC
:100017B2 C20800 ret 0008

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001371(C), :10001380(C), :100013A1(C), :100013BD(C), :1000143C(C)
|:10001523(C), :10001590(C), :100016BF(C), :100016F2(C), :10001773(C)
|
:100017B5 5F pop edi//<---------------跳到这里就game over了！
:100017B6 5E pop esi
:100017B7 5D pop ebp
:100017B8 33C0 xor eax, eax
:100017BA 5B pop ebx
:100017BB 81C4DC020000 add esp, 000002DC
:100017C1 C20800 ret 0008

---------------------------------------

[5] 小花絮---->
1） RegName　和　Password　以加密的方式写在它的配置文件 Search32.ini中。
   2）KEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\TRTData
的 Data9 键值 是安装时间记录。

[6]　我的体会：
本来想算出它的注册码，实在太烦琐了。感谢您花时间从头看到尾！
虽然没有算出注册码，但是长了不少见识。只能盼望高手搞定它的注册机了。
愿与各位朋友交流。^_^
<完>

★☆ moonlite 于2001-8-6☆★

标 题:不好意思，更正两个打字错误：:10001350 若ID是大写字母或数字-->不变; :100016B0 余数等于0则将5保存。 (空)
时 间:2001-8-11 12:19:03
阅读次数:3
详细信息:


Security Administrator 7.1

 标 题:FCG的作业。呵呵 (5千字)
发信人:请多指点
时 间:2001-7-27 17:32:33
详细信息:
今天工作不太忙，继续我的作业。呵呵，不然FCG的老大说我作业通不过那可惨了！

连上华军软件园里，来到最近更新，发现目标：This is "Security Administrator 7.1"一个安全工具。呵呵

URL：http://jx163.onlinedown.net/down/secagent.zip
软件不大，只人八百多K

第一步：。。。。。。先得安装。呵呵。
第二步：运行软件。马上就跳出了要你注册的画面。得，注册就注册吧。写入注册码“456456456”，点“register”小弟E文不好，但直觉认为这个是注册的按钮。：）因为他离写注册码的地方最近。呵呵。
跳出出错的对话框。嘿嘿，有出错的对话框就成。呵呵。下面在SICE中下断点：bpx hmemcpy。
回到程序后，点那个“register”，马上被拦。老样子，按F12连按12下，来到了这里：

0167:004888B6 MOV EAX,[EBP-08] <---这里EAX是我们的假注册码
0167:004888B9 LEA EDX,[EBP-04]
0167:004888BC CALL 0046FF44
0167:004888C1 CMP DWORD [EBP-04],BYTE +00
0167:004888C5 JNZ 004888D4
0167:004888C7 LEA EAX,[EBP-04]
0167:004888CA MOV EDX,00488920
0167:004888CF CALL 00403D20
0167:004888D4 MOV EAX,[004B5AA4]
0167:004888D9 MOV EAX,[EAX]
0167:004888DB MOV EDX,[EBP-04]
0167:004888DE CALL 0049CEE8 <----此call一按F10就死了。没得玩了。得跟进去看看

0167:0049CEE8 PUSH EBP
0167:0049CEE9 MOV EBP,ESP
0167:0049CEEB PUSH ECX
0167:0049CEEC PUSH EBX
0167:0049CEED MOV [EBP-04],EDX
0167:0049CEF0 MOV EBX,EAX
0167:0049CEF2 MOV EAX,[EBP-04]
0167:0049CEF5 CALL 004040BC
0167:0049CEFA XOR EAX,EAX
0167:0049CEFC PUSH EBP
0167:0049CEFD PUSH DWORD 0049CF80
0167:0049CF02 PUSH DWORD [FS:EAX]
0167:0049CF05 MOV [FS:EAX],ESP
0167:0049CF08 MOV EDX,[EBP-04]
0167:0049CF0B MOV EAX,EBX
0167:0049CF0D CALL 00495F50
0167:0049CF12 TEST AL,AL <---这里看一下，啊呀，AL的值是0呀，改1得了
0167:0049CF14 JZ 0049CF52

结果那个AL一改为1就注册成功了，但在第二次启动之时。。。。。。。还是没注册的，得，又得花时间再看看。
就到那个改AL值上的那个call里去转转，说不定有收获呀。：）

0167:00495F50 PUSH EBP
0167:00495F51 MOV EBP,ESP
0167:00495F53 PUSH ECX
0167:00495F54 PUSH EBX
0167:00495F55 PUSH ESI
0167:00495F56 MOV [EBP-04],EDX
0167:00495F59 MOV ESI,EAX
0167:00495F5B MOV EAX,[EBP-04]
0167:00495F5E CALL 004040BC
0167:00495F63 XOR EAX,EAX
0167:00495F65 PUSH EBP
0167:00495F66 PUSH DWORD 004960BC
0167:00495F6B PUSH DWORD [FS:EAX]
0167:00495F6E MOV [FS:EAX],ESP
0167:00495F71 XOR EBX,EBX
0167:00495F73 MOV BYTE [004B6E18],00
0167:00495F7A MOV EAX,004B6E1C
0167:00495F7F CALL 00403C88
0167:00495F84 CMP DWORD [EBP-04],BYTE +00
0167:00495F88 JZ NEAR 004960A6
0167:00495F8E MOV EAX,[EBP-04]
0167:00495F91 CALL 00403F08
0167:00495F96 CMP EAX,BYTE +0C <--一直来到这里，一看原来注册码要大于12 得，跳出去重输吧。再继续下去

0167:00495F99 JZ 00495FA7
0167:00495F9B MOV EAX,[EBP-04]
0167:00495F9E CMP BYTE [EAX],38 <--把注册码的第一位与ASCII的38比，也就是与数字8比
0167:00495FA1 JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00495FA7 MOV EAX,[EBP-04]
0167:00495FAA CMP BYTE [EAX],38
0167:00495FAD JNZ NEAR 004960A6
0167:00495FB3 MOV EAX,[EBP-04]
0167:00495FB6 CMP BYTE [EAX+02],33 <--把注册码的第三位与ASCII的33比，也就是与数字3比
0167:00495FBA JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00495FC0 MOV EAX,[EBP-04]
0167:00495FC3 CMP BYTE [EAX+03],31 <--把注册码的第四位与ASCII的31比，也就是与数字1比
0167:00495FC7 JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00495FCD MOV EAX,[EBP-04]
0167:00495FD0 CMP BYTE [EAX+04],39 <--把注册码的第五位与ASCII的39比，也就是与数字9比
0167:00495FD4 JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00495FDA MOV EAX,[EBP-04]
0167:00495FDD CMP BYTE [EAX+08],30 <--把注册码的第九位与ASCII的30比，也就是与数字0比
0167:00495FE1 JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00495FE7 MOV EAX,[EBP-04]
0167:00495FEA CMP BYTE [EAX+09],35 <--把注册码的第十位与ASCII的35比，也就是与数字5比
0167:00495FEE JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00495FF4 MOV EAX,[EBP-04]
0167:00495FF7 CMP BYTE [EAX+0A],53 <--把注册码的第十一位与ASCII的53比，也就是与字母S比
0167:00495FFB JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:00496001 MOV EAX,[EBP-04]
0167:00496004 CMP BYTE [EAX+0B],45 <--把注册码的第十二位与ASCII的45比，也就是与字母E比
0167:00496008 JNZ NEAR 004960A6 <--不是就跳到死亡地带！！
0167:0049600E MOV EAX,004B6E1C
0167:00496013 MOV EDX,[EBP-04]
0167:00496016 CALL 00403CDC
0167:0049601B MOV BYTE [004B6E18],01
0167:00496022 MOV BL,01
0167:00496024 XOR EDX,EDX
0167:00496026 MOV EAX,[ESI+04F4]

记一下，注册码的这几位是：8?319???05SE，哎，那还有几位呢？？？我再找！一直翻了好几遍都找不到，没办法，只好先把这么位写上先：8031900005SE，一点注册，呵呵，成了，原来他只判断这几位就成了。其他的，你想怎么填都可以。呵呵。要暴破的话，将以上JNZ的跳转改成不跳就成了。还有，将那几位的ASCII码改成我们喜欢的数字也成。呵呵。因为这个软件也没有特殊的ID或用户名之类的东东，觉得可能是只有唯一的注册码。

不知小弟的过程有没有错，请各位大虾指点指点。

My oicq:8895546
My Email:plycy@8848.net


smadinst

标 题:大家请进！！！我破解了一个小游戏，但没有完全破解它，想请高手指点一下！！！ (507字)
发信人:1212
时 间:2001-1-1 0:12:12
详细信息:
我破解了一个小游戏（http://www.inhua.com/down/smadinst.exe），但没有完全破解它，想请高手指点一下！！！
我先用UNASPACK脱壳，用W32dasm反汇编和TRW2000调试后，我共修改了三处：

1、:00473C30 7432 je 00473C64
改 EB32
2、:00473D52 756A jne 00473DBE
改 9090
3、:00473D5A 7E62 jle 00473DBE
改 9090
以上的修改，只是使当时的注册显示成功，以后再开始仍是未注册版本，还要重新注册才行。这是为何？想请高手指点一下！！！

标 题:试试50255(名字任意)详细算法入内.... (1千字)
发信人:夜月
时 间:2001-1-1 9:59:13
详细信息:

我输入的信息是:
name:luoyi
number:654321 化成16进制就是下面总是出现的9fbf1了!
注:以下所有数字,未经特别说明,都为16进制!
015F:00473D0D MOV EAX,ESI eax=9fbf1
015F:00473D0F MOV ECX,2710 ecx=2710
015F:00473D14 CDQ
015F:00473D15 IDIV ECX eax/ecx 商----〉eax，余数 ----〉edx
015F:00473D17 MOV EDI,EDX 余数----〉edi
015F:00473D19 MOV ECX,EDI
015F:00473D1B XOR ECX,0C01
015F:00473D21 MOV EDX,00473ED4
015F:00473D26 MOV EAX,[004919E0]
015F:00473D2B CALL 0045E560
015F:00473D30 MOV EAX,[004919E0]
015F:00473D35 CALL 00402E2C
015F:00473D3A MOV EAX,EDI eax=第一次除法的余数
015F:00473D3C MOV ECX,33 ecx=33
015F:00473D41 CDQ
015F:00473D42 IDIV ECX eax/ecx
015F:00473D44 MOV ECX,EAX 第二次的商----〉ecx
015F:00473D46 MOV EAX,ESI eax=9fbf1
015F:00473D48 MOV EDI,2710 edi=2710
015F:00473D4D CDQ
015F:00473D4E IDIV EDI eax/edi eax中是第三次的商
015F:00473D50 CMP EAX,ECX 如果第二次的商等于第三次的商，就成功了！
015F:00473D52 JNZ 00473DBE
算法整理：
假设你输入的是A，则:
B=A/2710的余数. C=A/2710的商
D=B/33的商
C=D时注册吗为有效.

标 题:过程 (6千字)
发信人:lijing
时 间:2001-1-1 12:33:13
详细信息:

先对主程序脱壳，然后反编译，得到字符串“Thank you”地址为00473D7A，字符串“This is not a valid”地址为00473C32、00473DBE。相关代码如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00473C30(C)
|
:00473C64 8D55F8 lea edx, dword ptr [ebp-08]
:00473C67 8B8338020000 mov eax, dword ptr [ebx+00000238]
:00473C6D E8A2E5FAFF call 00422214
:00473C72 8B55F8 mov edx, dword ptr [ebp-08]
:00473C75 8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
:00473C7B B9FF000000 mov ecx, 000000FF
:00473C80 E8ABFFF8FF call 00403C30
:00473C85 8D95F8FEFFFF lea edx, dword ptr [ebp+FFFFFEF8]
:00473C8B B8E4194900 mov eax, 004919E4
:00473C90 B128 mov cl, 28
:00473C92 E8F5ECF8FF call 0040298C
:00473C97 B201 mov dl, 01
:00473C99 A1F4E04500 mov eax, dword ptr [0045E0F4]
:00473C9E E885A5FEFF call 0045E228
:00473CA3 A3E0194900 mov dword ptr [004919E0], eax
:00473CA8 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\Software\StarMadness"
|
:00473CAA BA683E4700 mov edx, 00473E68
:00473CAF A1E0194900 mov eax, dword ptr [004919E0]
:00473CB4 E867A6FEFF call 0045E320
:00473CB9 8D55F8 lea edx, dword ptr [ebp-08]
:00473CBC 8B8338020000 mov eax, dword ptr [ebx+00000238]
:00473CC2 E84DE5FAFF call 00422214
:00473CC7 8B4DF8 mov ecx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"UserName"
|
:00473CCA BA883E4700 mov edx, 00473E88
:00473CCF A1E0194900 mov eax, dword ptr [004919E0]
:00473CD4 E8E3A7FEFF call 0045E4BC
:00473CD9 8D55F8 lea edx, dword ptr [ebp-08]
:00473CDC 8B833C020000 mov eax, dword ptr [ebx+0000023C]
:00473CE2 E82DE5FAFF call 00422214
:00473CE7 8B4DF8 mov ecx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"SerialNumber"
|
:00473CEA BA9C3E4700 mov edx, 00473E9C
:00473CEF A1E0194900 mov eax, dword ptr [004919E0]
:00473CF4 E8C3A7FEFF call 0045E4BC

* Possible StringData Ref from Code Obj ->"1.28"
|
:00473CF9 B9B43E4700 mov ecx, 00473EB4

* Possible StringData Ref from Code Obj ->"Version"
|
:00473CFE BAC43E4700 mov edx, 00473EC4
:00473D03 A1E0194900 mov eax, dword ptr [004919E0]
:00473D08 E8AFA7FEFF call 0045E4BC
:00473D0D 8BC6 mov eax, esi
:00473D0F B910270000 mov ecx, 00002710
:00473D14 99 cdq
:00473D15 F7F9 idiv ecx
:00473D17 8BFA mov edi, edx
:00473D19 8BCF mov ecx, edi
:00473D1B 81F1010C0000 xor ecx, 00000C01

* Possible StringData Ref from Code Obj ->"BuildID"
|
:00473D21 BAD43E4700 mov edx, 00473ED4
:00473D26 A1E0194900 mov eax, dword ptr [004919E0]
:00473D2B E830A8FEFF call 0045E560
:00473D30 A1E0194900 mov eax, dword ptr [004919E0]
:00473D35 E8F2F0F8FF call 00402E2C
:00473D3A 8BC7 mov eax, edi
:00473D3C B933000000 mov ecx, 00000033
:00473D41 99 cdq
:00473D42 F7F9 idiv ecx
:00473D44 8BC8 mov ecx, eax
:00473D46 8BC6 mov eax, esi
:00473D48 BF10270000 mov edi, 00002710
:00473D4D 99 cdq
:00473D4E F7FF idiv edi
:00473D50 3BC1 cmp eax, ecx ; 比较，若不正确，跳到“This is not a valid”处
:00473D52 756A jne 00473DBE
:00473D54 81FE10270000 cmp esi, 00002710 ; 同上
:00473D5A 7E62 jle 00473DBE
:00473D5C C605D8C2470001 mov byte ptr [0047C2D8], 01
:00473D63 C605DC19490001 mov byte ptr [004919DC], 01

* Possible StringData Ref from Code Obj ->"JOIN GAME"
|
:00473D6A BAE43E4700 mov edx, 00473EE4
:00473D6F 8B835C030000 mov eax, dword ptr [ebx+0000035C]
:00473D75 E8DAE4FAFF call 00422254

* Possible StringData Ref from Code Obj ->"Thank you,"
|
:00473D7A BAF83E4700 mov edx, 00473EF8
:00473D7F 8B8374030000 mov eax, dword ptr [ebx+00000374]
:00473D85 E8CAE4FAFF call 00422254

* Possible StringData Ref from Code Obj ->"have a nice game!"
|
:00473D8A BA0C3F4700 mov edx, 00473F0C
:00473D8F 8B837C030000 mov eax, dword ptr [ebx+0000037C]
:00473D95 E8BAE4FAFF call 00422254
:00473D9A B201 mov dl, 01
:00473D9C 8B8370030000 mov eax, dword ptr [ebx+00000370]
:00473DA2 E835E3FAFF call 004220DC
:00473DA7 C605FCC2470001 mov byte ptr [0047C2FC], 01
:00473DAE C60500C347000C mov byte ptr [0047C300], 0C
:00473DB5 C605D8FE480014 mov byte ptr [0048FED8], 14
:00473DBC EB2F jmp 00473DED

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00473D52(C), :00473D5A(C)
|

* Possible StringData Ref from Code Obj ->"This is not a valid"
|
:00473DBE BA343E4700 mov edx, 00473E34
:00473DC3 8B8374030000 mov eax, dword ptr [ebx+00000374]
:00473DC9 E886E4FAFF call 00422254

* Possible StringData Ref from Code Obj ->"serial number!"
|
:00473DCE BA503E4700 mov edx, 00473E50
:00473DD3 8B837C030000 mov eax, dword ptr [ebx+0000037C]
:00473DD9 E876E4FAFF call 00422254
:00473DDE B201 mov dl, 01
:00473DE0 8B8370030000 mov eax, dword ptr [ebx+00000370]
:00473DE6 E8F1E2FAFF call 004220DC
:00473DEB EB1A jmp 00473E07

找到这段代码，就好分析了。
标 题:这只是软件注册时用的检测点，光改它，是不完全破解版，和我出的问题一样！ (空)
发信人:1212
时 间:2001-1-1 14:23:42
详细信息:

序 号:601
标 题:正常的检测点 (2千字)
发信人:lijing
时 间:2001-1-1 16:40:01
详细信息:

:0046F6A7 0FB638 movzx edi, byte ptr [eax] ; eax->用户名
:0046F6AA 0FAFFE imul edi, esi
:0046F6AD 03CF add ecx, edi
:0046F6AF 46 inc esi
:0046F6B0 40 inc eax
:0046F6B1 4A dec edx
:0046F6B2 75F3 jne 0046F6A7
; 上面这段代码将用户名进行累加：第1字符*1+第2字符*2+第3字符*3+......并存入ECX中。
:0046F6B4 8BC1 mov eax, ecx
:0046F6B6 B9E8030000 mov ecx, 000003E8
:0046F6BB 99 cdq
:0046F6BC F7F9 idiv ecx
:0046F6BE 8955C8 mov dword ptr [ebp-38], edx
:0046F6C1 DB45C8 fild dword ptr [ebp-38]
:0046F6C4 DB2D44FF4600 fld tbyte ptr [0046FF44]
:0046F6CA DEC9 fmulp st(1), st(0)
:0046F6CC D80550FF4600 fadd dword ptr [0046FF50]
:0046F6D2 DD5DF0 fstp qword ptr [ebp-10]
:0046F6D5 9B wait
:0046F6D6 A13C1A4900 mov eax, dword ptr [00491A3C]
:0046F6DB 35010C0000 xor eax, 00000C01
:0046F6E0 8945C8 mov dword ptr [ebp-38], eax
:0046F6E3 DB45C8 fild dword ptr [ebp-38]
:0046F6E6 DB2D54FF4600 fld tbyte ptr [0046FF54]
:0046F6EC DEC9 fmulp st(1), st(0)
:0046F6EE DD5DE8 fstp qword ptr [ebp-18]
:0046F6F1 9B wait
:0046F6F2 DD45E8 fld qword ptr [ebp-18]
:0046F6F5 E8CE31F9FF call 004028C8
:0046F6FA DD45F0 fld qword ptr [ebp-10]
:0046F6FD DC4DE8 fmul qword ptr [ebp-18]
:0046F700 DEE9 fsubp st(1), st(0)
:0046F702 DD5DF8 fstp qword ptr [ebp-08]
:0046F705 9B wait
:0046F706 DD45F8 fld qword ptr [ebp-08]
:0046F709 D9E1 fabs
:0046F70B DB2D44FF4600 fld tbyte ptr [0046FF44]
:0046F711 DED9 fcompp
:0046F713 DFE0 fstsw ax
:0046F715 9E sahf
:0046F716 7607 jbe 0046F71F ; 这里就是关键的检测点，不跳即可成功注册！
:0046F718 C605D8C2470001 mov byte ptr [0047C2D8], 01 ; 即将内存[0047C2D8]处置为1
; 上面这段代码有许多浮点运行指令，看不懂。哪位看得懂的，给解释一下。

:0046F71F B201 mov dl, 01
:0046F721 A1342C4400 mov eax, dword ptr [00442C34]
:0046F726 E8813EFDFF call 004435AC
:0046F72B A3580B4900 mov dword ptr [00490B58], eax
:0046F730 6A08 push 00000008
:0046F732 B9E0010000 mov ecx, 000001E0
:0046F737 BA80020000 mov edx, 00000280
:0046F73C A1580B4900 mov eax, dword ptr [00490B58]
:0046F741 E8D64DFDFF call 0044451C
:0046F746 B201 mov dl, 01

说明：0046F716 jbe 0046F71F处即为关键检测点，不跳即可成功注册。
标 题:正常的检测点的解释及注册码的反推 (4千字)
发信人:robot
时 间:2001-1-2 0:46:33
详细信息:
:0046F6A7 0FB638 movzx edi, byte ptr [eax] ; eax->用户名
:0046F6AA 0FAFFE imul edi, esi
:0046F6AD 03CF add ecx, edi
:0046F6AF 46 inc esi
:0046F6B0 40 inc eax
:0046F6B1 4A dec edx
:0046F6B2 75F3 jne 0046F6A7
; 上面这段代码将用户名进行累加：第1字符*1+第2字符*2+第3字符*3+......并存入ECX中。
:0046F6B4 8BC1 mov eax, ecx
:0046F6B6 B9E8030000 mov ecx, 000003E8 ====> 除以1000
:0046F6BB 99 cdq
:0046F6BC F7F9 idiv ecx
:0046F6BE 8955C8 mov dword ptr [ebp-38], edx ====> 余数存放此处
此时在SoftICE下用WF命令打开浮点寄存器
:0046F6C1 DB45C8 fild dword ptr [ebp-38] ====> ST0=余数值
:0046F6C4 DB2D44FF4600 fld tbyte ptr [0046FF44] ====> ST0=1E-3 ST1=余数值
:0046F6CA DEC9 fmulp st(1), st(0) ====> 将余数乘以1E-3
:0046F6CC D80550FF4600 fadd dword ptr [0046FF50] ====> 结果+1
:0046F6D2 DD5DF0 fstp qword ptr [ebp-10] ====> 存放到[ebp-10]处
:0046F6D5 9B wait
:0046F6D6 A13C1A4900 mov eax, dword ptr [00491A3C] ====> eax=BuildID
:0046F6DB 35010C0000 xor eax, 00000C01 ====> eax=序列号除以10000的余数
:0046F6E0 8945C8 mov dword ptr [ebp-38], eax ====> 存于此处
:0046F6E3 DB45C8 fild dword ptr [ebp-38] ====> ST0=余数值
:0046F6E6 DB2D54FF4600 fld tbyte ptr [0046FF54] ====> ST0=1E-4 ST1=余数值
:0046F6EC DEC9 fmulp st(1), st(0) ====> 余数乘以1E-4
:0046F6EE DD5DE8 fstp qword ptr [ebp-18] ====> 结果保存在[ebp-18]
:0046F6F1 9B wait
:0046F6F2 DD45E8 fld qword ptr [ebp-18] ====> ST0=[ebp-18]，即注册码的余数除以10000(或乘以1E-4)
:0046F6F5 E8CE31F9FF call 004028C8 ====> 余数的COS值
:0046F6FA DD45F0 fld qword ptr [ebp-10] ====> ST0=由用户名生成的余数的计算值
:0046F6FD DC4DE8 fmul qword ptr [ebp-18] ====> 乘以[ebp-18]
:0046F700 DEE9 fsubp st(1), st(0) ====> 余数的COS值-刚才的乘积值
:0046F702 DD5DF8 fstp qword ptr [ebp-08] ====> 结果保存在[ebp-8]
:0046F705 9B wait
:0046F706 DD45F8 fld qword ptr [ebp-08]
:0046F709 D9E1 fabs
:0046F70B DB2D44FF4600 fld tbyte ptr [0046FF44] ====> ST0=1E-3，ST1=[ebp-8]
:0046F711 DED9 fcompp ====> ST0与ST1比较
:0046F713 DFE0 fstsw ax
:0046F715 9E sahf
:0046F716 7607 jbe 0046F71F ====> 小于等于则转
; 这里就是关键的检测点，不跳即可成功注册！
:0046F718 C605D8C2470001 mov byte ptr [0047C2D8], 01 ; 即将内存[0047C2D8]处置为1
; 上面这段代码有许多浮点运行指令，看不懂。哪位看得懂的，给解释一下。

:0046F71F B201 mov dl, 01
:0046F721 A1342C4400 mov eax, dword ptr [00442C34]
:0046F726 E8813EFDFF call 004435AC
:0046F72B A3580B4900 mov dword ptr [00490B58], eax
:0046F730 6A08 push 00000008
:0046F732 B9E0010000 mov ecx, 000001E0
:0046F737 BA80020000 mov edx, 00000280
:0046F73C A1580B4900 mov eax, dword ptr [00490B58]
:0046F741 E8D64DFDFF call 0044451C
:0046F746 B201 mov dl, 01

说明：0046F716 jbe 0046F71F处即为关键检测点，不跳即可成功注册。

从上面可以看出，比较的过程如下：

将用户名进行累加：第1字符*1+第2字符*2+第3字符*3+，结果除以1000，取余数，再除以1000，再加上1
序列号/10000的余数再除以10000的COS值-序列号的余数/10000*由用户名生成的余数的计算值的绝对值小于1E-3
下面开始反推：
如果用户名为robot，则执行到46F6B4时ecx=0x676，余数为28E(即654)，654/1000+1=1.654
设序列号的余数值为x，则x*1.654=cos(x)，则x=0.5236，0.5236*10000=5236，5236 mod 51=102
因此，注册码为：1025236
重新整理：用户名：robot 注册码：1025236，注册后运行程序，已经变为注册版了，破解成功
注：上面的方程求解是用MathCad求出的


SMailserver2.5

标 题:SMailserver2.5注册码的破解手记 (1千字)
发信人:长青
时 间:2001-3-1 16:46:12
详细信息:
SMailserver2.5注册码的破解手记

作者：李长青
地址：山东科技大学经管学院会计99-2
Email： sdsugar@263.net
开学以后忙死了，整天为英语四级忙碌，忙来忙去却不见成效。因为我才刚开始学习，害怕生手，也怕朋友们忘了我，所以就下载了《邮件服务器-SMailServer2.5》练练手，我想哥早在心里骂我偷懒了。

步骤：
1、随便输入注册信息，我的是：
用户名：sugar
注册码：123456
2、启动TRW2000，CTR+N载入内存。bpx hmemcpy万能中断，F5返回程序领域。
3、点击确定按钮，被TRW2000拦截到，BD *中断所有中断，按F12到11次时，出现错误信息。
4、重新按照1、2步骤，到第三步用BD *中断时，按F1210次，然后按F10到：
016F:00409522 PUSH BYTE +0C 用D EAX 得到注册码：Phr9zmER6X6Q
所以，
用户名：sugar
注册码：3754575468
还有一组是：
用户名：李长青
注册码：W6x6OQyR6X6Q
由密码知道，最后五位数相同，不知对做注册机是否有用。希望大哥们教小弟一点注册机的知识。
我的主页：sugar2001.3322.net 正在修建中，希望各位朋友能帮忙。谢谢！！

<---------完--------->


软件名称：Small HTTP server 1.212 sethttp.exe 40.5KB 下载地点：http://www.computerinfo.com.cn 发 信 人: 井 风 时 间: 2001-02-23 破解工具：Trw20001.22 解题难度：[专 业] [学 士] [硕 士] [博 士] ******** 前 言： 很小巧的WEB服务器，占用资源很小，支持CGI 1.1、 SSI、PHP。 过 程: 1、注册窗口填入： 注册名称：abcdef 注册码：ABCD12345678； 2、用“井风跟踪”法找到出错的CALL，此程序为：00403C31 CALL 004027BB。 详细方法请阅读“井风”之WINZIP8.0破解教学篇； 3、分析代码： 代码段之一 0015F:00403C1C PUSH DWORD 83 015F:00403C21 PUSH DWORD [0040FB3C] 015F:00403C27 CALL 004048E4 015F:00403C2C PUSH DWORD 0040FC50 015F:00403C31 CALL 004027BB <---（过程2、）找出，执行此CALL则出错，追入此CALL 015F:00403C36 ADD ESP,BYTE +04 < 到代码段之二，由后向前分析 015F:00403C39 TEST EAX,EAX < 015F:00403C3B JZ 00403C57 代码段之二 015F:00402808 CMP EDX,EDX 015F:0040280A JZ 00402813 015F:0040280C MOV ESP,[004011AA] 015F:00402812 RET 015F:00402813 MOV [0040FB14],EDX 015F:00402819 CMP BYTE [EBP+FFFFF800],00 <===检查有否输入NAME 015F:00402820 JZ NEAR 00402978 <===NAME为空则出错 015F:00402826 PUSH BYTE +10 015F:00402828 LEA EBX,[EBP+FFFFF8F0] 015F:0040282E PUSH EBX 015F:0040282F PUSH BYTE +79 015F:00402831 PUSH DWORD [0040FB3C] 015F:00402837 CALL 004048E4 015F:0040283C PUSH EBX 015F:0040283D CALL 00401E0C 015F:00402842 MOV [EBP+FFFFF7FC],EAX 015F:00402848 ADD ESP,BYTE +04 015F:0040284B MOV EDI,[EBP+FFFFF7F8] 015F:00402851 MOV ESI,0040261D 015F:00402856 CLD 015F:00402857 LODSB 015F:00402858 SCASB 015F:00402859 JNZ 0040285F 015F:0040285B OR AL,AL 015F:0040285D JNZ 00402857 015F:0040285F MOV AL,[EDI-01] 015F:00402862 SUB AL,[ESI-01] 015F:00402865 MOVSX EAX,AL 015F:00402868 MOV EDX,EAX 015F:0040286A TEST EDX,EDX 015F:0040286C JNZ 00402899 015F:0040286E CMP DWORD [EBP+FFFFF7FC],BYTE +16 015F:00402875 JA 0040287E 015F:00402877 PUSH DWORD 00402633 015F:0040287C JMP SHORT 0040288C 015F:0040287E CMP DWORD [EBP+FFFFF7FC],BYTE +1C 015F:00402885 JNA 004028E2 015F:00402887 PUSH DWORD 0040264D 015F:0040288C PUSH BYTE +79 015F:0040288E PUSH DWORD [0040FB3C] 015F:00402894 CALL 00404918 015F:00402899 ADD BYTE [EBP+FFFFF8F1],CF <===将注册码的第二位加上CF 015F:004028A0 ADD BYTE [EBP+FFFFF8F3],CA <===将注册码的第四位加上CA 015F:004028A7 LEA EBX,[EBP+FFFFF800] 015F:004028AD LEA EAX,[EBP+FFFFF8F0] 015F:004028B3 PUSH EAX 015F:004028B4 CALL 00401E0C <===将变化过的注册码计算产生EAX值，记为[**] 015F:004028B9 MOV [EBP+FFFFF7FC],EAX <===形成[EBP+FFFFF7FC]的值 015F:004028BF ADD BYTE [EBP+FFFFF8F1],31 <===还原注册码第二位值 015F:004028C6 ADD BYTE [EBP+FFFFF8F3],36 <===还原注册码第四位值 015F:004028CD PUSH EBX 015F:004028CE CALL 00402DB1 015F:004028D3 ADD ESP,BYTE +08 015F:004028D6 CMP [EBP+FFFFF7FC],EAX <===比较两次计算的结果，[EBP+FFFFF7FC]为根据变化后 上面这行记为：[^-^] 的注册码计算结果，EAX根据注册名称计算结果。 下命令：D EAX 见E475CA=（14972362）十进制 015F:004028DC JNZ NEAR 00402978 <===不相等则跳转执行***，出错 015F:004028E2 MOV EAX,0040EE28 015F:004028E7 MOV EBX,EAX 015F:004028E9 SUB EBX,004092A8 015F:004028EF PUSH EBX 015F:004028F0 PUSH DWORD 53494745 015F:004028F5 PUSH DWORD 524E5528 015F:004028FA PUSH DWORD 004092A8 015F:004028FF CALL 00401E30 015F:00402904 MOV [EBP+FFFFF7E8],EAX 015F:0040290A ADD ESP,BYTE +10 015F:0040290D TEST EAX,EAX 015F:0040290F JZ 00402915 015F:00402911 MOV BYTE [EAX-01],00 015F:00402915 PUSH EBX 015F:00402916 PUSH DWORD 53494745 015F:0040291B PUSH DWORD 524E550A 015F:00402920 PUSH DWORD 004092A8 015F:00402925 CALL 00401E30 015F:0040292A MOV [EBP+FFFFF7E8],EAX 015F:00402930 ADD ESP,BYTE +10 015F:00402933 TEST EAX,EAX 015F:00402935 JZ 00402962 015F:00402937 MOV ECX,EAX 015F:00402939 INC ECX 015F:0040293A MOV EDI,ECX 015F:0040293C MOV ESI,0040267D 015F:00402941 CLD 015F:00402942 LODSB 015F:00402943 STOSB 015F:00402944 OR AL,AL 015F:00402946 JNZ 00402942 015F:00402948 MOV ECX,[EBP+FFFFF7E8] 015F:0040294E ADD ECX,BYTE +0F 015F:00402951 LEA EDX,[EBP+FFFFF800] 015F:00402957 MOV EDI,ECX 015F:00402959 MOV ESI,EDX 015F:0040295B CLD 015F:0040295C LODSB 015F:0040295D STOSB 015F:0040295E OR AL,AL 015F:00402960 JNZ 0040295C 015F:00402962 MOV EAX,[0040FC40] 015F:00402967 MOV [0040EE28],EAX 015F:0040296C MOV DWORD [0040EE2C],0FFFFFFF 015F:00402976 JMP SHORT 004029DB 015F:00402978 MOV DWORD [EBP+FFFFF7FC],00100000 015F:00402982 PUSH BYTE +14 015F:00402984 PUSH DWORD 0040268C 015F:00402989 PUSH DWORD 0040269E 015F:0040298E PUSH BYTE +00 015F:00402990 CALL 00404930 <===执行此行出错，记为[***]，向上分析 015F:00402995 CMP EAX,BYTE +07 015F:00402998 JNZ 004029DB 015F:0040299A CMP DWORD [EBP+FFFFF7FC],BYTE +00 015F:004029A1 JZ NEAR 00402C6D 015F:004029A7 MOV ESI,004027BB 代码段之三 015F:00401E0C PUSH EBP <===追入**CALL，来到此行 015F:00401E0D MOV EBP,ESP 015F:00401E0F PUSH EBX 015F:00401E10 MOV EBX,[EBP+08] 015F:00401E13 XOR ECX,ECX <===将ECX清零 015F:00401E15 JMP SHORT 00401E1E 015F:00401E17 LEA EAX,[ECX+ECX*4] < 这段程序实际上是将十进制数转成十六进制数， 015F:00401E1A LEA ECX,[EDX+EAX*2] <很经典的算法！ 015F:00401E1D INC EBX < 015F:00401E1E MOVSX EAX,BYTE [EBX] < 015F:00401E21 LEA EDX,[EAX-30] <---这句和B句的作用为检查最后一位，如不为数字则结束 015F:00401E24 CMP EDX,BYTE +09 <---记为[B] 015F:00401E27 JNA 00401E17 < 015F:00401E29 MOV EAX,ECX <===将得出结果传给EAX，以产生后面[EBP+FFFFF7FC]值 015F:00401E2B MOV EBX,[EBP-04] 015F:00401E2E LEAVE 015F:00401E2F RET · · · 小 结： 弄清楚了代码段之三的功能后，我们就知道如何得出注册码了。 因为经变化过的注册码的计算过程实际上是将一个十进制数转化为十六进制数。所以得出：变化过 的注册码的十六进制形式与[^-^]处根据注册名产生的EAX值相同，即E475CA=（14972362）。 现在已经知道了变化过的注册码应为14972362，由[**]前面几行代码可知道：变化过程只是将你输 入的注册码的第二、四位分别加上了CF、CA。所以只要将14972362中的4和7的ASCII值分别减去CF、CA （34-CF=65为e、37-CA=6D为m）即为正确注册码：1e9m2362 NAME：abcdef CODE：1e9m2362 后 记： 有疑问请与我联系：hz.cy@163.net


SmartCheck v6.03

标 题:crack Numega SmartCheck v6.03 (1千字)
发信人:happyhackwang
时 间:2001-3-11 20:59:56
详细信息:
crack Numega SmartCheck v6.03 build 1103 by happyhackwang

软件名称:Numega SmartCheck v6.03 build 1103
软件功能:VB调试工具(the greatest software)
注册方式:name+unlock code
作者:Numega Company
作者主页:www.numega.com
作者邮箱:Tech@numega.com
破解者:happyhackwang
邮箱:happyhackwang@263.net
OICQ:4696993(不在线^^)
注册方式:get unlock code
工具:softice,w32dasm(get the code in dll),my head,ultraedit(to write this article)
特别感谢:Numega公司

填入以下内容:
unlock code:7878
name:wanghl
company:www

bpx getwindowtext
中断返回后来到tl32v20.dll的领空(\windows\tl32v20.dll,一个TimeLock的动态连接库),可以看到:
:10003EEA E891170000 call 10005680 ;核心比较的调用,跟进去
:10003EEF 83C408 add esp, 00000008
:10003EF2 85C0 test eax, eax
:10003EF4 7553 jne 10003F49

追进来到这里:
:10005690 8B02 mov eax, dword ptr [edx] ;[edx]中是真正的unlock code
:10005692 3A01 cmp al, byte ptr [ecx] ;[ecx]是我自己输入的7878
:10005694 752E jne 100056C4

总结:
unlock code:0135749684180709
name:wanghl
company:www

******************************世间本无事,庸人自扰耳************************************


SMYNES1.2e

标 题:注册你的SMYNES1.2e (3千字)
发信人:zombieys
时 间:2001-4-17 3:18:18
详细信息:
注册你的SMYNES1.2e

软件名称：SMYNES1.2e
软件主页：http://smy.billyjr.com/
主要功能：出色的nes模拟器
主要目的：当然是注册它了(我选暴破，可以免cdkey运行)
破解难度：非常简单(适合初学者)

现在太晚了，我简单说一下，1.0-1.2均为keyfile保护，1.2e主文件用upx0.84压缩过。没注册的话除了一堆unregisered的提示外，在game中加上2个大demo,too不爽了,so crack it。
首先脱壳(由于改的地方比较多，所以还是脱出来的好，其实主要是想加上我的id,haha...)，我选择用PROCDUMP，一下子就搞定啦:),简单^^。
首次运行，晕~~~~，他告诉我过期了，我倒~~~~~~,-_-,反汇编吧，找到这句The date is expired, please download双击它，来到这里：

:004133EB 8B4C2408 mov ecx, dword ptr [esp+08]
:004133EF 85C9 test ecx, ecx
:004133F1 7430 je 00413423 ->跳下去才不过期:)
:004133F3 A128D35200 mov eax, dword ptr [0052D328]
:004133F8 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Warning"
|
:004133FA B9E7CF5000 mov ecx, 0050CFE7

* Possible StringData Ref from Data Obj ->"The date is expired, please download "
->"the newer version!!!"
|
:004133FF BAADCF5000 mov edx, 0050CFAD

剩下的真的偷懒了，这个比较简单，自己跟跟就知道了，我只把要改的代码贴上好了:),要改6处吧，不明白的话改完了，再反汇编看看就知道了;-)

1.去掉过期提示：

004133F1 je 00413423 ->jmp 413423

2.获得For non-commercial user权限

46c072 cmp eax,04 ->b003 mov al,03
->90 nop

3.强制进入keyfile验证

469f56 jne 469f8e ->jmp 469f8e

4.去掉旧版keyfile验证

46a10c je 46a110 ->jmp 46a110

5.重头戏，用zombieys大名注册，哈哈.....^^

把469f56及后面的代码改成这样：

469f58 c705203566007a6f6d62 mov dword ptr [663520],626d6f7a
c7052435660069657973 mov dword ptr [663524],73796569
c7052835660000000000 mov dword ptr [663528],00
33c0 xor eax,eax
81c4cc050000 add esp,5cc
5f pop edi
5e pop esi
5b pop ebx
c3 ret

6.让它跳过去才能用我的id注册

把46a191改成这样：

46a191 e9c2fdffff jmp 469f58

完活喽:)，睡觉去
good night

———————————————————————————————>
.-" "-. Cracked by zombieys >
/　　　　　　\ My oicq is 1789655 >
| | My hp is zombieys.yeah.net>
|, .-. .-. ,| My hp is zombieys.126.com >
|)(__/ \__)(| >
|/ /\ \| Thanks for your supports >
(@_@) (_ ^^ _) >
_ )\_______\__|IIIIII|__/_____ >
_)@8@8{}<________|-\IIIIII/-|____zombieys_____________________>

注：这篇文章是不完全的破解,根本没有接触到最核心的部分.没有解除5分钟限制和在game中加上2个大demo的限制。不过JOJO己完全破解了该软件，只是答应作者不公开。


SN Calculator v2.2

标 题:新手请进~~~~~SN Calculator v2.2(科学计算器)破解过程~~~~~ (4千字)
发信人:Sam.com
时 间:2001-3-8 0:29:06
详细信息:
初学者看看

软件名称：SN Calculator v2.2(功能强大的科学计算器，可惜是E文的)
注册方式：Name&Key
下载地址：http://61.134.4.193:8080/appsoftware/calculator/sncalc.exe
破解原因：我是一个新手~在论坛扮演了几次1212~也将看雪主页里的教程看了几次~跟着就是实践啦~于是先拿我手头上用着的一些软件来开刀啦~~虽然有的都已经有注册码啦~~现在我已破了Boxman 3.0~~~Win-eXpose-Registry for Windows 95(同regmon功能一样~~有程序防regmon的用它就行了)~~~Readbook 1.42和其它一些小软件(我正在破Nktools手机工具箱~~请高手们提点一下)~~这些都是看着教程去破的~~但我在破解过程中都有一些心得~~很想拿出来同大家分享~~也想高手指点一二~~~如果我有时间就将破解过程写出来吧~~~在破解时我最头痛的就是程序用我输入的注册码经过一大堆运算后再同内存里的数据比较~~~对于我这种新手来说很难找到比较的地方~~就算找到了也看不到真的注册码~~写注册机就更别说啦~~~所以我有了个蠢想法~~找一个功能强大的计算器来~~将注册码算一算~~于是上网就找了一大堆~~上面这个就是其一~~安装后一用~~呵呵~~E文~~~好难明~~删~~~~~但删之前当然是先搞它一下啦~~~哈哈~~进去一看~~~太简单啦~~~所以就写一写它咯~~~~~~~~~~~~~~~

开始：
Trw2000 -------|
Ctrl+N |
bpx hmemcpy |
输入Name:Sam Von & Key:67676767 |------看得懂吧？？？？？
Trw2000弹出 |
bd |
pmodule -------|

好啦我们来到SN Calculator的代码中啦~~~第一次调试当然是一真按F10啦~~因为这个软件不会有出错信息~~所以我没有用F12~~~一直按下去~~~没太多call的地方~~一路都是ret~~当程序来到00488F95的时候~~立即留意啦~~看看EAX的值等于7~~~呵呵~~~是我注册名“Sam Von"的个数~~~继续~~~00488FA2是我输入的假注册码的个数~~下面就是比较核心啦~~看我的注解吧~~~

:00488F8D 8B45FC mov eax, dword ptr [ebp-04]
:00488F90 E8C7ADF7FF call 00403D5C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488F25(C)
|
:00488F95 83F804 cmp eax, 00000004 <-----注册名要大于4
:00488F98 7C0D jl 00488FA7
:00488F9A 8B45F8 mov eax, dword ptr [ebp-08]
:00488F9D E8BAADF7FF call 00403D5C
:00488FA2 83F804 cmp eax, 00000004 <-----注册码要大于4
:00488FA5 7D0C jge 00488FB3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488F98(C)
|
:00488FA7 8BC3 mov eax, ebx
:00488FA9 E80A06FCFF call 004495B8
:00488FAE E9BB000000 jmp 0048906E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488FA5(C)
|
:00488FB3 8B45FC mov eax, dword ptr [ebp-04]<----注册名的首地址
:00488FB6 0FB64001 movzx eax, byte ptr [eax+01]<---注册名的第二个字符a
:00488FBA 8B55F8 mov edx, dword ptr [ebp-08]<----注册码的首地址
:00488FBD 0FB65202 movzx edx, byte ptr [edx+02]<---注册码的第三个字符6
:00488FC1 33C2 xor eax, edx <-------61 xor 36=57=>eax
:00488FC3 B90A000000 mov ecx, 0000000A
:00488FC8 99 cdq
:00488FC9 F7F9 idiv ecx <-------57除以A余数7放入edx
:00488FCB 83FA03 cmp edx, 00000003
:00488FCE 0F859A000000 jne 0048906E <-------不等于3就跳
:00488FD4 68E9030000 push 000003E9

* Reference To: kernel32.Sleep, Ord:0000h
|
:00488FD9 E862D9F7FF Call 00406940
:00488FDE 8B45FC mov eax, dword ptr [ebp-04]
:00488FE1 0FB64002 movzx eax, byte ptr [eax+02]<---注册名的第三个字符m
:00488FE5 8B55F8 mov edx, dword ptr [ebp-08]
:00488FE8 0FB65201 movzx edx, byte ptr [edx+01]<---注册码的第二个字符7
:00488FEC 33C2 xor eax, edx <-------6D xor 37=5A=>eax
:00488FEE B90A000000 mov ecx, 0000000A
:00488FF3 99 cdq
:00488FF4 F7F9 idiv ecx <-------5A除以A余数0放入edx
:00488FF6 83FA05 cmp edx, 00000005
:00488FF9 7573 jne 0048906E <-------不等于5就跳
:00488FFB 68E7030000 push 000003E7

好啦~~首先我将edx的值在比较前改为3和5~~~~程序运行下去就Say Ok啦~~~~~就是说程序只将我的注册名和注册码的第二三位运算比较~~~但两者都要4位以上~~~~那太简单啦嘛~~~还好程序的运算过程不复杂~~注册机都不用写啦~~就用它本身来算一算吧~~~计算器软件~~~~真搞笑~~~程序要求两个数相xor后的值除以A的余数为3和5~~~上面的是57和5A~~~我就改成53和55吧~~~分别和61和6D相xor得到8和2~~~就是说注册码的第二三位是82就行啦~~其它的位就补上任意数吧~~~呵呵~~~以上是我的蠢办法~~我是新手嘛~~~~~请高手指正啦~~~~多谢~~~~另外注册成功后要退出程序再进入~~不然在About里仍然是没注册的~~~

我写得不好~~~~~~大家多多包涵~~~~~~~~

标 题:想制作注册机的请进-》》》 (239字)
发信人:china 2000
时 间:2001-3-10 16:30:35
详细信息:

上面的分析基本正确：
先设姓名为NAME、注册码为CODE，姓名与注册码要求均大于4位。
NAME[2]的值 XOR CODE[3]的值 再除以0A 的余数要等于3
NAME[3]的值 XOR CODE[2]的值 再除以0A 的余数要等于5
注册码 *+CODE[2]+CODE[3]+****(*为任意数字，长度嘛任意)

标 题:怎么叫“基本正确”呢~~~~~请指正~~~~~~~~ (空)
发信人:Sam.com
时 间:2001-3-11 0:35:29
详细信息:

标 题:随意说说... (336字)
发信人:china 2000
时 间:2001-3-11 10:52:13
详细信息:

一些地方不够明确，例：
:00488FC9 F7F9 idiv ecx <-------57除以A余数7放入edx
（这是将EAX的值除以ECX的值，EAX等于商，EDX为余数）
:00488FCB 83FA03 cmp edx, 00000003
（比较余数是否为3）
是否这样说更能明白点，总得来说是不错的。但如果能写得更详细、更明白一点就是一篇好教材了。
再接再历...


SnagIt! v5.2.1

 标 题:SnagIt! v5.2.1. (一） (10千字)
发信人:arbiter
时 间:2001-6-24 3:28:24
详细信息:
; -----------------------------------------------------------
; author: arbiter
; target: SnagIt! v5.2.1
; tools: SoftIce v4.05 for win2k ( only )
; time: 2001-6-24 2:37
; -----------------------------------------------------------

not say more than is needed, we are go into particulars.

firstly, fire up your SoftIce, and set the break point on GetWindowTextA,
go back into the SnagIt's register dialogbox,fill in some information at will,
then click the 'ok' button,SoftIce'll pop up as it hook at the api we set
just now. out of the api by pushing F10 about times. you can easyly find the
address ( offset: 47b01a ), here is the snippet of code over the offset: 47b01a

Possible StringData Ref from Data Obj ->""
|
0047AFDE A168264F00 mov eax, dword ptr [004F2668]
0047AFE3 8944240C mov dword ptr [esp+0C], eax
0047AFE7 C744241C00000000 mov [esp+1C], 00000000
0047AFEF 89442408 mov dword ptr [esp+08], eax
0047AFF3 8D44240C lea eax, dword ptr [esp+0C]
0047AFF7 8BCE mov ecx, esi
0047AFF9 50 push eax
0047AFFA 68ED270000 push 000027ED
0047AFFF C644242401 mov [esp+24], 01
0047B004 E85F1C0200 call 0049CC68
0047B009 8D4C2408 lea ecx, dword ptr [esp+08]
0047B00D 51 push ecx
0047B00E 68EE270000 push 000027EE
0047B013 8BCE mov ecx, esi
0047B015 E84E1C0200 call 0049CC68
0047B01A 8B8E94000000 mov ecx, dword ptr [esi+00000094]
0047B020 8D542408 lea edx, dword ptr [esp+08]
0047B024 8D44240C lea eax, dword ptr [esp+0C]
0047B028 52 push edx
0047B029 50 push eax
0047B02A 56 push esi
0047B02B E800E5FFFF call 00479530 <--- @ main routine here! @
0047B030 8BD8 mov ebx, eax
0047B032 8B868C000000 mov eax, dword ptr [esi+0000008C]
0047B038 85C0 test eax, eax
0047B03A 0F85B7000000 jne 0047B0F7
0047B040 8B8E94000000 mov ecx, dword ptr [esi+00000094]
0047B046 53 push ebx
0047B047 E8D4E2FFFF call 00479320
0047B04C 85C0 test eax, eax
0047B04E 0F84A3000000 je 0047B0F7
.
.
.
before the call 47b02b, it pushed your 'userName', 'userCode', that you entered
for the inner checking routine. so we need go into the call. i ignore the slim length
check for the entered name. after that we are here: 47955c

0047955C 8B7C2418 mov edi, dword ptr [esp+18]
00479560 8BCF mov ecx, edi
00479562 E89CEB0100 call 00498103
00479567 8B07 mov eax, dword ptr [edi]
00479569 8B58F8 mov ebx, dword ptr [eax-08]
0047956C 83FB0E cmp ebx, 0000000E
0047956F 0F8CB9000000 jl 0047962E

Possible StringData Ref from Data Obj ->"0123456789ABCDEF-"
|
00479575 6844204F00 push 004F2044
0047957A 50 push eax
0047957B E840DD0000 call 004872C0
00479580 83C408 add esp, 00000008
00479583 3BC3 cmp eax, ebx
00479585 0F85A3000000 jne 0047962E

Possible StringData Ref from Data Obj ->""
|
0047958B 6864664F00 push 004F6664

Possible StringData Ref from Data Obj ->"-"
|
00479590 6840204F00 push 004F2040
00479595 8BCF mov ecx, edi
00479597 E853E40100 call 004979EF
0047959C 8B07 mov eax, dword ptr [edi]
0047959E 8B4D00 mov ecx, dword ptr [ebp+00]
004795A1 8B16 mov edx, dword ptr [esi]
004795A3 50 push eax
004795A4 51 push ecx
004795A5 8BCE mov ecx, esi
004795A7 FF520C call [edx+0C]
004795AA 8BD8 mov ebx, eax
004795AC 80FB01 cmp bl, 01
004795AF 7545 jne 004795F6

we'll be warned with the nag and kicked off from the code, if bl got
0 from above call. and that call is most important call for calculate
the real RegCode and use it to compare with our fake key. so you should
know how to do with your brute forcing way. whereas out purpose was to
find out the scheme that the SnagIt use to generate the real RegCode and
got one of certified informations by ourself. so go on. we're more and
more closer with our final goal from now on.
go into the most important call at address 4795a7 that mentioned above.
and you'll get a little confusion about the code below, and do not be
worry about that. i'll nevigate you throughout it.

0045A9B3 B824194C00 mov eax, 004C1924
0045A9B8 E8CFA60200 call 0048508C
0045A9BD 83EC58 sub esp, 00000058
0045A9C0 53 push ebx
0045A9C1 56 push esi
0045A9C2 57 push edi
0045A9C3 894DE4 mov dword ptr [ebp-1C], ecx
0045A9C6 FF750C push [ebp+0C]
0045A9C9 33DB xor ebx, ebx
0045A9CB 8D4D0C lea ecx, dword ptr [ebp+0C]
0045A9CE 895DEC mov dword ptr [ebp-14], ebx
0045A9D1 C745E001000000 mov [ebp-20], 00000001
0045A9D8 885DF2 mov byte ptr [ebp-0E], bl
0045A9DB C645F301 mov [ebp-0D], 01
0045A9DF E898530400 call 0049FD7C
0045A9E4 8B450C mov eax, dword ptr [ebp+0C]
0045A9E7 895DFC mov dword ptr [ebp-04], ebx
0045A9EA 8B40F8 mov eax, dword ptr [eax-08]
0045A9ED 83F80E cmp eax, 0000000E
0045A9F0 0F8C65010000 jl 0045AB5B

all of above code do some initializations and the call nearby are checking
if the entered key is illegal by counting the number of the every chars of the
key except for the non-hexadecimal number( legal char is between 0~F ). and
compare the result with 0Eh, game over if they are not equal. so do remember
the legal RegCode is composed with the hexadecimal number.

0045A9F6 6A02 push 00000002
0045A9F8 8D45E8 lea eax, dword ptr [ebp-18]
0045A9FB 6A0C push 0000000C
0045A9FD 50 push eax
0045A9FE 8D4D0C lea ecx, dword ptr [ebp+0C]

0045AA01 E86FD10300 call 00497B75 <--- get last two num.

0045AA06 8B00 mov eax, dword ptr [eax]

call at 497b75 fetched the last two numbers of the fake key and store it
for later use. exp: char num[2];

0045AA08 6A10 push 00000010
0045AA0A 53 push ebx
0045AA0B 50 push eax
0045AA0C E803B80200 call 00486214 <---

this call converted the number from ASCII to hexadecima.
exp: dword h_num = atoi( num );

0045AA11 83C40C add esp, 0000000C
0045AA14 8D4DE8 lea ecx, dword ptr [ebp-18]
0045AA17 8BF8 mov edi, eax
0045AA19 E8F0520400 call 0049FD0E

here move the h_num to di and compare it with 041h, if it shy, then
game over. add it with 0ffbf and check the al with 050h, that use to
switch the program from two flows. if the addition result less than 050h
it will involve the userName procedure, else it's simply to cope with.
i forgot commenting some code above, heihei, but it just the simple MD5
HASH digest for the userName. the whole routine mainly use the MD5 HASH
function two times to produce an 128 bit value, finaly picking up bytes
from the result and using it to look up the hex-table to yield the real
RegCode.i assume its name string3. the string1 is yielded by firstly MD5
HASH with the userName. string2 is made up with the string1 and last 6
number of the fake key, use the string2 to do the second MD5 HASH function
to yield the string3. later on i'll explain it in details.

标 题:SnagIt! v5.2.1. (二） (8千字)
发信人:arbiter
时 间:2001-6-24 3:29:32
详细信息:

0045AA1E 6683FF41 cmp di, 0041
0045AA22 0F8233010000 jb 0045AB5B
0045AA28 81C7BFFF0000 add edi, 0000FFBF
0045AA2E 6683FF50 cmp di, 0050
0045AA32 7260 jb 0045AA94
0045AA34 8B450C mov eax, dword ptr [ebp+0C]
0045AA37 8378F812 cmp dword ptr [eax-08], 00000012
0045AA3B 7C79 jl 0045AAB6
0045AA3D 8D4508 lea eax, dword ptr [ebp+08]
0045AA40 6A04 push 00000004
0045AA42 50 push eax
0045AA43 8D4D0C lea ecx, dword ptr [ebp+0C]
0045AA46 E8C0D10300 call 00497C0B
0045AA4B 8B00 mov eax, dword ptr [eax]
0045AA4D 6A10 push 00000010
0045AA4F 53 push ebx
0045AA50 50 push eax
0045AA51 E8BEB70200 call 00486214
0045AA56 83C40C add esp, 0000000C
0045AA59 8D4D08 lea ecx, dword ptr [ebp+08]
0045AA5C 8945EC mov dword ptr [ebp-14], eax
0045AA5F E8AA520400 call 0049FD0E
0045AA64 8B450C mov eax, dword ptr [ebp+0C]
0045AA67 8D4D0C lea ecx, dword ptr [ebp+0C]
0045AA6A 8B40F8 mov eax, dword ptr [eax-08]
0045AA6D 83C0FC add eax, FFFFFFFC
0045AA70 50 push eax
0045AA71 8D4508 lea eax, dword ptr [ebp+08]
0045AA74 50 push eax
0045AA75 E80DD20300 call 00497C87
0045AA7A 50 push eax
0045AA7B 8D4D0C lea ecx, dword ptr [ebp+0C]
0045AA7E C645FC01 mov [ebp-04], 01
0045AA82 E874530400 call 0049FDFB
0045AA87 8D4D08 lea ecx, dword ptr [ebp+08]
0045AA8A 885DFC mov byte ptr [ebp-04], bl
0045AA8D E87C520400 call 0049FD0E
0045AA92 EB22 jmp 0045AAB6

Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0045AA32(C)

0045AA94 FF7508 push [ebp+08]
0045AA97 E8E8D40200 call 00487F84
0045AA9C 8BF0 mov esi, eax
0045AA9E 59 pop ecx
0045AA9F 3BF3 cmp esi, ebx
0045AAA1 7413 je 0045AAB6
0045AAA3 8B4DE4 mov ecx, dword ptr [ebp-1C]
0045AAA6 56 push esi
0045AAA7 E814E20100 call 00478CC0

above call is calculating the MD5 HASH digest of the uppercase of the
input userName and get first two bytes of the digest and store it to a
memory locations for the later processing. this generate the string1.
the first two bytes.

0045AAAC 56 push esi
0045AAAD 8945EC mov dword ptr [ebp-14], eax
0045AAB0 E840C10200 call 00486BF5
0045AAB5 59 pop ecx

Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:0045AA3B(C), :0045AA92(U), :0045AAA1(C)

0045AAB6 6A0F push 0000000F
0045AAB8 8D45D0 lea eax, dword ptr [ebp-30]
0045AABB 53 push ebx
0045AABC 50 push eax
0045AABD E84EA90200 call 00485410
0045AAC2 83C40C add esp, 0000000C
0045AAC5 8D4D0C lea ecx, dword ptr [ebp+0C]
0045AAC8 6A0E push 0000000E
0045AACA 6A0E push 0000000E
0045AACC E821560400 call 004A00F2
0045AAD1 50 push eax
0045AAD2 8D45D0 lea eax, dword ptr [ebp-30]
0045AAD5 50 push eax
0045AAD6 E895A90200 call 00485470
0045AADB 83C40C add esp, 0000000C
0045AADE 8D4D0C lea ecx, dword ptr [ebp+0C]

Possible Reference to Dialog: DialogID_0098, CONTROL_ID:00FF, ""
|
0045AAE1 6AFF push FFFFFFFF
0045AAE3 E859560400 call 004A0141
0045AAE8 8D459C lea eax, dword ptr [ebp-64]
0045AAEB 50 push eax
0045AAEC E8EFF10100 call 00479CE0
0045AAF1 85C0 test eax, eax
0045AAF3 59 pop ecx
0045AAF4 7505 jne 0045AAFB

Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:0045AB0F(C), :0045AB25(C)

0045AAF6 885DF3 mov byte ptr [ebp-0D], bl
0045AAF9 EB67 jmp 0045AB62

Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0045AAF4(C)

0045AAFB 8D45E0 lea eax, dword ptr [ebp-20]
0045AAFE 6A02 push 00000002
0045AB00 50 push eax
0045AB01 8D459C lea eax, dword ptr [ebp-64]
0045AB04 50 push eax
0045AB05 E8E6F10100 call 00479CF0
0045AB0A 83C40C add esp, 0000000C
0045AB0D 85C0 test eax, eax
0045AB0F 74E5 je 0045AAF6
0045AB11 8D45EC lea eax, dword ptr [ebp-14]
0045AB14 6A02 push 00000002
0045AB16 50 push eax
0045AB17 8D459C lea eax, dword ptr [ebp-64]
0045AB1A 50 push eax

0045AB1B E8D0F10100 call 00479CF0 <--- commented below.

through out a long way we come here. the call above is the first step to
construct the string2. by default, the string2 is initialized with '01 00'
as the first two bytes. this call fetch another two bytes in the memory loc
which store the string1 or dword zero before by the checking of h_num. cat
it to string2 follow the '01 00', now it is look like '01 00 xx xx' which
xx xx is denoted string1.

标 题:SnagIt! v5.2.1. (三） (9千字)
发信人:arbiter
时 间:2001-6-24 3:30:24
详细信息:

0045AB20 83C40C add esp, 0000000C
0045AB23 85C0 test eax, eax
0045AB25 74CF je 0045AAF6
0045AB27 8D45D0 lea eax, dword ptr [ebp-30]
0045AB2A 50 push eax
0045AB2B 8D459C lea eax, dword ptr [ebp-64]
0045AB2E 50 push eax

0045AB2F E89CF20100 call 00479DD0

we must pay more attention on this callee, it work for finishing the
construction of the string2 and accomplish full key generation and key
check! just go into it!

00479DF3 8BD0 mov edx, eax
00479DF5 81E2FFFF0000 and edx, 0000FFFF
00479DFB 40 inc eax
00479DFC 884C1404 mov byte ptr [esp+edx+04], cl
00479E00 41 inc ecx
00479E01 6683F946 cmp cx, 0046
00479E05 76EC jbe 00479DF3

messy code to puzzle you!

00479E07 53 push ebx
00479E08 8B9C2488000000 mov ebx, dword ptr [esp+00000088]
00479E0F 56 push esi
00479E10 89442408 mov dword ptr [esp+08], eax
00479E14 57 push edi
00479E15 8D430C lea eax, dword ptr [ebx+0C]
00479E18 6A02 push 00000002
00479E1A 50 push eax
00479E1B E820FFFFFF call 00479D40
00479E20 8BB42494000000 mov esi, dword ptr [esp+00000094]
00479E27 8D4C2414 lea ecx, dword ptr [esp+14]

00479E2B 6A02 push 00000002
00479E2D 51 push ecx
00479E2E 56 push esi
00479E2F 89442420 mov dword ptr [esp+20], eax
00479E33 E8B8FEFFFF call 00479CF0

this piece of code take the last two chars and convert them to hexadecimal
format, and combine them to a byte. afterward,storing the result as a word into
the string2 series. now the string2 is look like '01 00 xx xx xl 00' which
xl denote to the hex-format of the last two bytes of the fake key.

00479E38 8D5308 lea edx, dword ptr [ebx+08]
00479E3B 6A04 push 00000004
00479E3D 52 push edx
00479E3E E8FDFEFFFF call 00479D40
00479E43 89442428 mov dword ptr [esp+28], eax
00479E47 8D442428 lea eax, dword ptr [esp+28]
00479E4B 6A02 push 00000002
00479E4D 50 push eax
00479E4E 56 push esi
00479E4F E89CFEFFFF call 00479CF0

the fronter functions of the above two calls is use to do the same work
'convert' and 'combine' with the reciprocal 3~6 chars. and the second call
stores the result two bytes into the string2. and here finish constructing
the string2. now it looks like this:

char *string = "01 00 xx xx xl 00 ab cd"; which ab and cd denote to the
result yield by the above two calls.

00479E54 8D4C2458 lea ecx, dword ptr [esp+58]
00479E58 51 push ecx
00479E59 E882000000 call 00479EE0

the call at 479ee0 initialize the four chaining variables of MD5 HASH according
with the standard MD5.

00479E5E 33D2 xor edx, edx
00479E60 8D7E02 lea edi, dword ptr [esi+02]
00479E63 668B16 mov dx, word ptr [esi]
00479E66 8D44245C lea eax, dword ptr [esp+5C]
00479E6A 52 push edx
00479E6B 57 push edi
00479E6C 50 push eax
00479E6D E89E000000 call 00479F10

the above call intent to hide the string2 by convey it from the origin
local memeory to another place. but i catch it! :)

00479E72 8D4C2468 lea ecx, dword ptr [esp+68]
00479E76 8D542458 lea edx, dword ptr [esp+58]
00479E7A 51 push ecx
00479E7B 52 push edx
00479E7C E84F010000 call 00479FD0

standard MD5 HASH digest! to processing the string2. the edx pointed to
the result address. here the string3 was yielded.

00479E81 B90C000000 mov ecx, 0000000C
00479E86 33C0 xor eax, eax
00479E88 F3 repz
00479E89 AB stosd
00479E8A 66AB stosw
00479E8C 83C440 add esp, 00000040
00479E8F 33FF xor edi, edi

Referenced by a (U)nconditional or (C)onditional Jump at Address:
:00479EC5(C)

00479E91 8BF7 mov esi, edi
00479E93 81E6FFFF0000 and esi, 0000FFFF
00479E99 8BC6 mov eax, esi
00479E9B D1E8 shr eax, 1
00479E9D 8A0C18 mov cl, byte ptr [eax+ebx]
00479EA0 51 push ecx
00479EA1 E80AFFFFFF call 00479DB0
00479EA6 8A543424 mov dl, byte ptr [esp+esi+24]
00479EAA 25FF000000 and eax, 000000FF
00479EAF 83E20F and edx, 0000000F
00479EB2 83C404 add esp, 00000004
00479EB5 0FBE4C1410 movsx ecx, byte ptr [esp+edx+10]
00479EBA 3BC8 cmp ecx, eax
00479EBC 7515 jne 00479ED3
00479EBE 83C702 add edi, 00000002
00479EC1 6683FF10 cmp di, 0010
00479EC5 72CA jb 00479E91

this paragraph is the core checking code, cl contained the first 8 fake
key that we entered before. and it picked out bytes from the string3 by each
iteration step 2,that's mean it selected the odd number chars of string3. 1,
3, 5, 7, 9 till 15. and move the byte just picked to the dl. and dl with 0fh,
looking up the hex table to yield the real RegCode. finally compary every yielded
RegCode with cl about 8 times, if any of check was not match then game over.
so here we can get the first 8 bytes of the real RegCode. and combine it with
the last 6 byte of the fake key which wo base on to calculate the first part of
the RegCode,we conclude our Regcode now!

below snippet is the outer range of the main routine related to the upper
code before the core checking routine... why i mention this? the SnagIt! has
a version check by checking the value of the last byte of the reg code, as the
above slim operations.

xor di, di
mov di, last_byte
add di, 0ffbfh
cmp di, 050h
ja @good
add di, 0ch
ja @good
call MessageBoxA, ...offset " your register key are \
out of time".
so do remeber that , never let the last number yielded from the convert and combine
operation with the entered last two chars less than 85d.
.
.
.

0045AB43 6683FF50 cmp di, 0050
0045AB47 7319 jnb 0045AB62
0045AB49 83C70C add edi, 0000000C
0045AB4C 6683FF50 cmp di, 0050
0045AB50 7310 jnb 0045AB62
0045AB52 885DF3 mov byte ptr [ebp-0D], bl
0045AB55 C645F20B mov [ebp-0E], 0B
0045AB59 EB07 jmp 0045AB62
.
.
.

here you are one of worked key set.

userName: arbiter
userCode: 963B851E7D508F

that all over the work. cause of my poor english, i just can do this essay
like this. i've try my best. so i beg your pardon for any errors and uncompat -
ibilities among this essay.
at the same time, despite some of the errors and shortages, i hope you would
learn somethings from it!

my greeting fly to all of the guys of the kanxue forum. and all the crackers
in china!

arbiter.


SolSuite v8.0

 标 题:SolSuite v8.0破解手记 (3千字)
发信人:波导终结者
时 间:2001-9-8 11:15:45
详细信息:
SolSuite v8.0含有二百九十多种单机扑克游戏，也有空当接龙（FREECALL)和纸牌（KLONDIKE),还有一些我比较喜欢的(忘了名字了），而且可以存档，无限UNDO，自动计时评分，还有高分榜，可以有多玩家，不同玩家可以有不同的存档和高分榜；此外可以把自己喜欢的游戏放在my favorite里，玩的时候可以直接选；选项里可以自定义纸牌风格，还有背景，指针等等。以前我的机器上安过5.0的汉化注册版，很不错，除了玩DXBall2，SolSuite也是休闲游戏不错的选择。（虽然它那么好，不过我还是不会花钱去注册的，哈哈哈哈）
1.启动TRW,再启动SolSuite，点注册，出现注册窗口，填入1346791346。（个人习惯）
2.CTRL+N，叫出TRW,下bpx hmemcpy，再g。回到SolSuite，点OK，被拦。
3.bc *，然后pmodule，来到下面的代码段
015F:0043A10B 89430C MOV [EBX+0C],EAX
015F:0043A10E 8B03 MOV EAX,[EBX]
015F:0043A110 83F80C CMP EAX,BYTE +0C
015F:0043A113 751B JNZ 0043A130
015F:0043A115 8B5308 MOV EDX,[EBX+08]
015F:0043A118 52 PUSH EDX
015F:0043A119 8B4B04 MOV ECX,[EBX+04]
015F:0043A11C 8BD0 MOV EDX,EAX
015F:0043A11E 8BC6 MOV EAX,ESI
015F:0043A120 E827BEFFFF CALL 00435F4C
015F:0043A125 EB09 JMP SHORT 0043A130
015F:0043A127 8BD3 MOV EDX,EBX
015F:0043A129 8BC6 MOV EAX,ESI
一直按F10往下跟，途中可以看到很多"注册码"，像2487021545，0103246300，4552447001等等，不过我想都是黑名单，我输过，都没用，还有一个输了会"非法操作"。还是跟下去，直到来到下面的代码段
015F:004A2CBD DEE9 FSUBP ST1
015F:004A2CBF 83C4F4 ADD ESP,BYTE -0C
015F:004A2CC2 DB3C24 FSTP TWORD [ESP]
015F:004A2CC5 9B WAIT
015F:004A2CC6 8D45C4 LEA EAX,[EBP-3C]
015F:004A2CC9 E8727CF6FF CALL 0040A940
015F:004A2CCE 8B55C4 MOV EDX,[EBP-3C]
015F:004A2CD1 58 POP EAX
015F:004A2CD2 E86114F6FF CALL 00404138 这里就是比较注册码了，跟进去！
015F:004A2CD7 745A JZ 004A2D33 不跳就会执行下面的call 005C1B78，所以只要改一下，让他跳，就注册成功
015F:004A2CD9 B802000000 MOV EAX,02
015F:004A2CDE E895EE1100 CALL 005C1B78 这里一call就完，所以上面的JZ要跳
015F:004A2CE3 8BC3 MOV EAX,EBX
只要把上面的JZ改成JMP SHORT就OK了
所以用十六进制编辑器打开SolSuite，找E86114F6FF745A
改----------EB--就行了，这样随便输一个都能注册成功。
不过还没有跟出注册码，如果已经注册了，运行SolSuite目录里的反安装程序，用手动，全删，再安装，启动后又是没注册的了
再跟一次，到call 00404138时，F8跟进，
015F:00404138 53 PUSH EBX 这里下d eax可以看到你输的假注册码，下d edx就看到注册码3208110309了
015F:00404139 56 PUSH ESI
015F:0040413A 57 PUSH EDI
015F:0040413B 89C6 MOV ESI,EAX
015F:0040413D 89D7 MOV EDI,EDX
015F:0040413F 39D0 CMP EAX,EDX
015F:00404141 0F848F000000 JZ NEAR 004041D6
015F:00404147 85F6 TEST ESI,ESI
015F:00404149 7468 JZ 004041B3
015F:0040414B 85FF TEST EDI,EDI
015F:0040414D 746B JZ 004041BA
015F:0040414F 8B46FC MOV EAX,[ESI-04]
015F:00404152 8B57FC MOV EDX,[EDI-04]
回到SolSuite，输入注册码，注册成功！
http://www.skycn.com/down1.php?id=1492&url=http://202.107.104.34/soft/down/solsuite.exe
请各位前辈们点评一下。


Sorbet V1.1

 标 题:又来敲CCG的大门了，Sorbet V1.1算法破解。电神魔鬼兄来看啊！ (7千字)
发信人:傲世男儿
时 间:2000-10-1 2:16:54
详细信息:
呵呵，我又来敲门了，真心希望SUN BIRD[CCG]及各位大客多多指教。
JMV　Sorbet 1.1
就这个软件本身来说，编写的比较有创意，可以直接将图形文件的图标改为该文件的缩略图。另外，其配置/注册文件写成sorbet.cpl而放在控制面板的里面，很有些与众不同。
下载： URL ftp://ftp.bj.software.chinese.com/software/soft_photosee/JMV%20Sorbet%20Installer.exe
工具： TRW2k 1.22 W32DSM 8.93

随意输入密码:78787878787878-->load trw2k-->bpx hmemcpy-->F5-->确定-->拦住-->F12多次-->来到Sorbet领空。

F10来到这个Call:
:66002745 FF5028 call [eax+28]
进入，很快就找到这里(下面比较注册码的前几位，非常简单)：

:6601045F 8A08 mov cl, byte ptr [eax] //eax中存放着注册码的位置，取第一个字节'7'
:66010461 8A15C1A40166 mov dl, byte ptr [6601A4C1]

//66014C1中存放的内容为： "R7UK9AY34QHE" ,这句取出'R'(Ox52)，所以我们把al中的内容改为52

:66010467 3ACA cmp cl, dl
:66010469 751A jne 66010485 //继续
:6601046B 8A5001 mov dl, byte ptr [eax+01] //注册码的第二个字节'8'
:6601046E 8A0DC4A40166 mov cl, byte ptr [6601A4C4] //应当为'K'，所以我们把cl中的内容改为'K'（0x4B）
:66010474 3AD1 cmp dl, cl
:66010476 750D jne 66010485 //继续
:66010478 50 push eax
:66010479 E862000000 call 660104E0 //进这Call看看
......

:660104E0 8B542404 mov edx, dword ptr [esp+04] //注册码地址给edx
.....
来到这里，这段多次在程序中出现，目的是为了过滤掉2D,20,5c,2f之类的无用符号：
:6601050E 8954241C mov dword ptr [esp+1C], edx
:66010512 8A02 mov al, byte ptr [edx]
:66010514 3C2D cmp al, 2D
:66010516 7410 je 66010528
:66010518 3C20 cmp al, 20
:6601051A 740C je 66010528
:6601051C 3C5C cmp al, 5C
:6601051E 7408 je 66010528
:66010520 3C2F cmp al, 2F
:66010522 7404 je 66010528
:66010524 3C5F cmp al, 5F
:66010526 7503 jne 6601052B
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:66010516(C), :6601051A(C), :6601051E(C), :66010522(C)
|
:66010528 42 inc edx
:66010529 EBE3 jmp 6601050E //如果等于那些无效字符，跳回去重新比较。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:66010526(C)
|
:6601052B 8A02 mov al, byte ptr [edx] //取出第3个字符（非无效字符）
:6601052D 8A0DBDA40166 mov cl, byte ptr [6601A4BD]
//66014BC后的内容是：56JWR7UK9AY34QHE
:66010533 42 inc edx
:66010534 3AC1 cmp al, cl //所以注册码中第3个字符为'6'
:66010536 8954241C mov dword ptr [esp+1C], edx
:6601053A 753C jne 66010578

又经过一段判别无效字符的程序，来到这里：

:66010559 8A02 mov al, byte ptr [edx] //取出第4个字符（非无效字符）
:6601055B 42 inc edx
:6601055C 33C9 xor ecx, ecx //ecx == 0
:6601055E 8954241C mov dword ptr [esp+1C], edx
:66010562 894C2410 mov dword ptr [esp+10], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:66010572(C)
|
:66010566 3A81BCA40166 cmp al, byte ptr [ecx+6601A4BC] //所以注册码中第4个字符为'5'
:6601056C 7414 je 66010582 //跳到下面
......

从这里开始注册码的计算变得复杂起来了，我也是分析了一下算法才得到注册码的：
:66010582 83F911 cmp ecx, 00000011
:66010585 894C2410 mov dword ptr [esp+10], ecx
:66010589 7DED jge 66010578 //不跳
:6601058B 83F905 cmp ecx, 00000005
:6601058E 77E8 ja 66010578 //不跳
:66010590 83F902 cmp ecx, 00000002

* Possible Reference to String Resource ID=00002: "will end in a few minutes"
|
:66010593 BF02000000 mov edi, 00000002 //注意：这里edi==2了，这在后面是个标志
:66010598 7602 jbe 6601059C //跳
:6601059A 8BF9 mov edi, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:66010598(C)
|
:6601059C 897C2414 mov dword ptr [esp+14], edi //注意：[esp+14]==2，这在后面也会用到
....
又经过一段判别无效字符的程序,来到这里

:660105BD 8A0A mov cl, byte ptr [edx] //取出第六个字符
:660105BF 42 inc edx
:660105C0 8954241C mov dword ptr [esp+1C], edx
:660105C4 33C0 xor eax, eax //eax -> 0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:660105D2(C)
|
:660105C6 3A88BCA40166 cmp cl, byte ptr [eax+6601A4BC] //-------------->
:660105CC 7410 je 660105DE //这个小循环的作用是在“56JWR7UK9AY34QHE”这个字符串中
:660105CE 40 inc eax //中查找和你输入的第5个字符相等的字符在这个字符串中的位置，
:660105CF 83F811 cmp eax, 00000011 //结果记录在eax中。相当于Delphi/BCB中的StrPos()
:660105D2 7CF2 jl 660105C6 //<---------------

如果找到，就跳来这里：
:660105DE 83F811 cmp eax, 00000011
:660105E1 7D95 jge 66010578
:660105E3 83F810 cmp eax, 00000010
:660105E6 7790 ja 66010578

:660105DE 83F811 cmp eax, 00000011 //------〉
:660105E1 7D95 jge 66010578 //如果同最后一个字符相同或是没找到，注册失败
:660105E3 83F810 cmp eax, 00000010
:660105E6 7790 ja 66010578 //<-----

又经过一段判别无效字符的程序,再找出第6，7个字符在“56JWR7UK9AY34QHE”这个串中的位置。分别记录在ebp,ebx之中，
当然，如果ebp<11||ebx<11，注册失败，同上面一样，下面也是如此。
。。。。
:66010688 33F6 xor esi, esi //esi-->0
:6601068A 85FF test edi, edi //然后这里检查edi的值了，记得吗，是2
:6601068C 765C jbe 660106EA
。。。。
又经过一段判别无效字符的程序,再找出第8个字符在“56JWR7UK9AY34QHE”这个串中的位置。记录在eax中，如果eax<11，执行下面一段程序。
.....
:660106DF 8B442414 mov eax, dword ptr [esp+14] //记得吗，上面也说过，[esp+14] = 2,
:660106E3 46 inc esi //这句话在一个循环体内，加两次后esi==eax==2
:660106E4 3BF0 cmp esi, eax
:660106E6 7306 jnb 660106EE //不跳。但从下一行开始循环，知道在此行跳出为止
:660106E8 EBA4 jmp 6601068E //跳，如此循环，直到自上面一行跳出。
。。。
又经过一段判别无效字符的程序,再找出第10个字符在“56JWR7UK9AY34QHE”这个串中的位置，记录在eax中，如果eax<11,执行下面一段程序。
:6601072C B910000000 mov ecx, 00000010 //-->
:66010731 2BCB sub ecx, ebx //检查EBX+EAX是否等于16,不等则注册失败。
:66010733 3BC1 cmp eax, ecx //其中EBX为第7个字符在“56JWR7UK9AY34QHE”这个串中的位置
:66010735 0F853DFEFFFF jne 66010578 //<---

到此为止，虽然注册码的检查还没有完，但其所有的检查方式都已经出现，罗嗦了这么多，也不想再说了，如果有哪位朋友还有什么问题或者什么不同的意见，欢迎交流。
公布一下找到的注册号：
Sorbet V1.1
sn: RK65KKKKKKKK

国庆快乐！
傲世男儿
2000/09/30


SPQuery v4.2 build 4237

标 题:SPQuery v4.2 build 4237 (22千字)
发信人:Blowfish
时 间:2001-3-12 17:46:37
详细信息:
SPQuery v4.2 build 4237

http://www.stbernard.com

如果你是WinNT/2K的系统管理员，这个工具是非常有用的。

用isDcc反编译setup.ins脚本，得到脚本源码。显然是调用sbssetup.dll来判断安装序列号的。关键的是下面这几个：

prototype SBSSETUP.VerifySN(string);
prototype SBSSETUP.GetModeCode(string);
prototype SBSSETUP.GetLicenseLevel(string);

判断序列号的部分如下（string7就是序列号）：

label18: //Ref: 001428

00143F:00B4: SBSSETUP.VerifySN(string7); //判断序列号
001447:0021: lNumber0 = LAST_RESULT;
00144F:0128: lNumber3 = lNumber0 < 0;
001461:0022: if (lNumber3 = 0) then
goto label19;
endif;
00146F:0112: StrLoadString("", "INVALID_SN", lString0);
001484:002A: MessageBox(lString0, -65535);
00148E:002C: goto label17;

label19: //Ref: 001461
001497:00B4: SBSSETUP.GetModeCode(string7); //这里
00149F:0021: lNumber2 = LAST_RESULT;
0014A7:0128: lNumber3 = lNumber2 < 0;
0014B9:0022: if (lNumber3 = 0) then
goto label20;
endif;
0014C7:0112: StrLoadString("", "INVALID_SN", lString0);
0014DC:002A: MessageBox(lString0, -65535);
0014E6:002C: goto label17;

label20: //Ref: 0014B9
0014EF:00B4: SBSSETUP.GetLicenseLevel(string7); //这里
0014F7:0021: lNumber1 = LAST_RESULT;
0014FF:0128: lNumber3 = lNumber1 < 0;
001511:0022: if (lNumber3 = 0) then
goto label21;
endif;
00151F:0112: StrLoadString("", "INVALID_SN", lString0);
001534:002A: MessageBox(lString0, -65535);
00153E:002C: goto label17;

label21: //Ref: 001511
001547:0128: lNumber3 = MODE = 0;
001559:0022: if (lNumber3 = 0) then
goto label26;
endif;
001567:0128: lNumber3 = lNumber2 > 1;
001579:0022: if (lNumber3 = 0) then
goto label24;
endif;
001587:0128: lNumber3 = lNumber1 = 0;
001599:0022: if (lNumber3 = 0) then
goto label22;
endif;
0015A7:0112: StrLoadString("", "LICENSE_EXPLANATION", lString0);
0015C5:0112: StrLoadString("", "LIVE_TRIAL_UNLIMITED", lString1);
0015E4:0104: SprintfBox(-65535, lString0, lString1);
0015F4:002C: goto label23;

label22: //Ref: 001599
0015FD:0112: StrLoadString("", "LICENSE_EXPLANATION", lString0);
00161B:0112: StrLoadString("", "LIVE_TRIAL_LIMITED", lString1);
001638:0104: SprintfBox(-65535, lString0, lString1, lNumber1, lNumber1);

label23: //Ref: 0015F4
001652:002C: goto label26;

label24: //Ref: 001579
00165B:0128: lNumber3 = lNumber1 = 0;
00166D:0022: if (lNumber3 = 0) then
goto label25;
endif;
00167B:0112: StrLoadString("", "LICENSE_EXPLANATION", lString0);
001699:0112: StrLoadString("", "MACHINE_UNLIMITED", lString1);
0016B5:0104: SprintfBox(-65535, lString0, lString1);
0016C5:002C: goto label26;

label25: //Ref: 00166D
0016CE:0112: StrLoadString("", "LICENSE_EXPLANATION", lString0);
0016EC:0112: StrLoadString("", "MACHINE_LIMITED", lString1);
001706:0104: SprintfBox(-65535, lString0, lString1, lNumber1, lNumber1);

察看文本文件value.shl，得到字符串宏定义如下：

INVALID_SN=Invalid Serial Number.
LIVE_TRIAL_LIMITED=You have installed a license allowing you to evaluate SPQuery on %d machines for 15 days. Once %d machines have been queried, any remaining machines will become inaccessible via SPQuery.
SERIAL_NUMBER=Serial Number:
MACHINE_UNLIMITED=You have installed a license allowing you to use SPQuery at one physical site.
LIVE_TRIAL_UNLIMITED=You have installed a license allowing you to evaluate SPQuery on any number of machines for 15 days.
MACHINE_LIMITED=You have installed a license allowing you to use SPQuery on %d machines. Once %d machines have been queried, any remaining machines will become inaccessible via SPQuery.
LICENSE_EXPLANATION=License Explanation

显然它有多种序列号，不同的序列号对应不同的license类型。最完美的当然是MACHINE_UNLIMITED，没有时间和机器数目的限制。
那就看看如何才能让程序流程走到MACHINE_UNLIMITED这里来。

lNumber0 = SBSSETUP.VerifySN(string7); //lNumber0 应大于等于0
lNumber2 = SBSSETUP.GetModeCode(string7); //lNumber2应大于等于0，且小于等于1
lNumber1 = SBSSETUP.GetLicenseLevel(string7); //lNumber1应等于0

得到上述条件之后启动SoftICE针对DLL中的函数设断点进行跟踪，使用其默认的序列号01-0184-4174-0909。
发现它是把注册码的后两部分4174和0909用同一个函数进行变换，分别得到0B26和5005，lNumber0就等于0B26的高两位即0B，
而lNumber2则等于0B26中的2，lNumber1则为5005的低三位即005。它还会取出0B26中的低位（即6），和5005的高位（即5）
凑成一个字节0x65，并将该字节与另外一个字节（此字节是根据注册码其它部分计算出来的）进行比较，比较的地方如下：

001B:01972307 CALL 01971FE0
001B:0197230C MOV DL,[ESP+32]
001B:01972310 MOV AL,[ESP+33]
001B:01972314 ADD ESP,20
001B:01972317 CMP DL,AL //比较
001B:01972319 JNZ 01972368

再结合上面得出的lNumber0，lNumber1，lNumber2所要满足的条件，就可以知道变换后的两个数所要满足的条件。
现在的问题就是根据变换后的数如何反推出变换前的数（即注册码的后两部分）来，从而写出keymaker。看一下变换函数，
该函数只是对一个16-bit整数的16个bit进行调换位置的操作，从而得到一个新的16-bit数，这个换位变换显然是可逆的。
假定变换前的整数的16个bit依次为15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0，则变换得到的新的整数16个bit依次为
15,11,7,3,14,10,6,2,13,9,5,1,12,8,4,0。即变换后的整数的第15 bit等于变换前的整数的第15 bit，变换后的整数的第14 bit
等于变换前的整数的第11 bit···依次类推。如下：

* Referenced by a CALL at Addresses:
|:10002200 , :1000220A
|
:10001D50 8B4C2404 mov ecx, dword ptr [esp+04]
:10001D54 83EC08 sub esp, 00000008
:10001D57 8D442400 lea eax, dword ptr [esp]
:10001D5B 53 push ebx
:10001D5C 55 push ebp
:10001D5D 56 push esi
:10001D5E 57 push edi
:10001D5F 50 push eax
:10001D60 51 push ecx
:10001D61 E84AFFFFFF call 10001CB0 //atol( )或sscanf( )
:10001D66 8B442418 mov eax, dword ptr [esp+18] //变换前的16-bit整数
:10001D6A 8BC8 mov ecx, eax
:10001D6C 81E10F000080 and ecx, 8000000F //ecx中存放该数的3～0 bit
:10001D72 7905 jns 10001D79
:10001D74 49 dec ecx
:10001D75 83C9F0 or ecx, FFFFFFF0
:10001D78 41 inc ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001D72(C)
|
:10001D79 99 cdq
:10001D7A 83E20F and edx, 0000000F
:10001D7D 03C2 add eax, edx
:10001D7F C1F804 sar eax, 04
:10001D82 8BF0 mov esi, eax
:10001D84 81E60F000080 and esi, 8000000F //esi中存放该数的7～4 bit
:10001D8A 7905 jns 10001D91
:10001D8C 4E dec esi
:10001D8D 83CEF0 or esi, FFFFFFF0
:10001D90 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001D8A(C)
|
:10001D91 99 cdq
:10001D92 83E20F and edx, 0000000F
:10001D95 03C2 add eax, edx
:10001D97 C1F804 sar eax, 04
:10001D9A 8BF8 mov edi, eax
:10001D9C 81E70F000080 and edi, 8000000F //edi中存放该数的11～8 bit
:10001DA2 7905 jns 10001DA9
:10001DA4 4F dec edi
:10001DA5 83CFF0 or edi, FFFFFFF0
:10001DA8 47 inc edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001DA2(C)
|
:10001DA9 99 cdq
:10001DAA 83E20F and edx, 0000000F
:10001DAD 03C2 add eax, edx
:10001DAF C1F804 sar eax, 04
:10001DB2 8BD8 mov ebx, eax
:10001DB4 81E30F000080 and ebx, 8000000F //ebx中存放该数的15～12 bit
:10001DBA 7905 jns 10001DC1
:10001DBC 4B dec ebx
:10001DBD 83CBF0 or ebx, FFFFFFF0
:10001DC0 43 inc ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001DBA(C)
|
:10001DC1 8BC3 mov eax, ebx
:10001DC3 99 cdq
:10001DC4 83E207 and edx, 00000007
:10001DC7 03C2 add eax, edx
:10001DC9 C1F803 sar eax, 03
:10001DCC 8BE8 mov ebp, eax
:10001DCE 81E501000080 and ebp, 80000001 //用掩码取出该数的第15 bit
:10001DD4 7905 jns 10001DDB
:10001DD6 4D dec ebp
:10001DD7 83CDFE or ebp, FFFFFFFE
:10001DDA 45 inc ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001DD4(C)
|
:10001DDB 8BC7 mov eax, edi
:10001DDD 99 cdq
:10001DDE 83E207 and edx, 00000007
:10001DE1 03C2 add eax, edx
:10001DE3 C1F803 sar eax, 03
:10001DE6 2501000080 and eax, 80000001 //用掩码取出该数的第11 bit
:10001DEB 7905 jns 10001DF2
:10001DED 48 dec eax
:10001DEE 83C8FE or eax, FFFFFFFE
:10001DF1 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001DEB(C)
|
:10001DF2 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001DF5 8BC6 mov eax, esi
:10001DF7 99 cdq
:10001DF8 83E207 and edx, 00000007
:10001DFB 03C2 add eax, edx
:10001DFD C1F803 sar eax, 03
:10001E00 2501000080 and eax, 80000001 //用掩码取出该数的第7 bit
:10001E05 7905 jns 10001E0C
:10001E07 48 dec eax
:10001E08 83C8FE or eax, FFFFFFFE
:10001E0B 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E05(C)
|
:10001E0C 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001E0F 8BC1 mov eax, ecx
:10001E11 99 cdq
:10001E12 83E207 and edx, 00000007
:10001E15 03C2 add eax, edx
:10001E17 C1F803 sar eax, 03
:10001E1A 2501000080 and eax, 80000001 //用掩码取出该数的第3 bit
:10001E1F 7905 jns 10001E26
:10001E21 48 dec eax
:10001E22 83C8FE or eax, FFFFFFFE
:10001E25 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E1F(C)
|
:10001E26 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001E29 8BC3 mov eax, ebx
:10001E2B 99 cdq
:10001E2C 83E203 and edx, 00000003
:10001E2F 03C2 add eax, edx
:10001E31 C1F802 sar eax, 02
:10001E34 2501000080 and eax, 80000001 //用掩码取出该数的第14 bit
:10001E39 7905 jns 10001E40
:10001E3B 48 dec eax
:10001E3C 83C8FE or eax, FFFFFFFE
:10001E3F 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E39(C)
|
:10001E40 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001E43 8BC7 mov eax, edi
:10001E45 99 cdq
:10001E46 83E203 and edx, 00000003
:10001E49 03C2 add eax, edx
:10001E4B C1F802 sar eax, 02
:10001E4E 2501000080 and eax, 80000001 //用掩码取出该数的第10 bit
:10001E53 7905 jns 10001E5A
:10001E55 48 dec eax
:10001E56 83C8FE or eax, FFFFFFFE
:10001E59 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E53(C)
|
:10001E5A 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001E5D 8BC6 mov eax, esi
:10001E5F 99 cdq
:10001E60 83E203 and edx, 00000003
:10001E63 03C2 add eax, edx
:10001E65 C1F802 sar eax, 02
:10001E68 2501000080 and eax, 80000001 //用掩码取出该数的第6 bit
:10001E6D 7905 jns 10001E74
:10001E6F 48 dec eax
:10001E70 83C8FE or eax, FFFFFFFE
:10001E73 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E6D(C)
|
:10001E74 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001E77 8BC1 mov eax, ecx
:10001E79 99 cdq
:10001E7A 83E203 and edx, 00000003
:10001E7D 03C2 add eax, edx
:10001E7F C1F802 sar eax, 02
:10001E82 2501000080 and eax, 80000001 //用掩码取出该数的第2 bit
:10001E87 7905 jns 10001E8E
:10001E89 48 dec eax
:10001E8A 83C8FE or eax, FFFFFFFE
:10001E8D 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E87(C)
|
:10001E8E 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001E91 8BC3 mov eax, ebx
:10001E93 99 cdq
:10001E94 2BC2 sub eax, edx
:10001E96 D1F8 sar eax, 1
:10001E98 2501000080 and eax, 80000001 //用掩码取出该数的第13 bit
:10001E9D 7905 jns 10001EA4
:10001E9F 48 dec eax
:10001EA0 83C8FE or eax, FFFFFFFE
:10001EA3 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E9D(C)
|
:10001EA4 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001EA7 8BC7 mov eax, edi
:10001EA9 99 cdq
:10001EAA 2BC2 sub eax, edx
:10001EAC D1F8 sar eax, 1
:10001EAE 2501000080 and eax, 80000001 //用掩码取出该数的第9 bit
:10001EB3 7905 jns 10001EBA
:10001EB5 48 dec eax
:10001EB6 83C8FE or eax, FFFFFFFE
:10001EB9 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001EB3(C)
|
:10001EBA 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001EBD 8BC6 mov eax, esi
:10001EBF 99 cdq
:10001EC0 2BC2 sub eax, edx
:10001EC2 D1F8 sar eax, 1
:10001EC4 2501000080 and eax, 80000001 //用掩码取出该数的第5 bit
:10001EC9 7905 jns 10001ED0
:10001ECB 48 dec eax
:10001ECC 83C8FE or eax, FFFFFFFE
:10001ECF 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001EC9(C)
|
:10001ED0 8D2C68 lea ebp, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001ED3 8BC1 mov eax, ecx
:10001ED5 99 cdq
:10001ED6 2BC2 sub eax, edx
:10001ED8 D1F8 sar eax, 1
:10001EDA 2501000080 and eax, 80000001 //用掩码取出该数的第1 bit
:10001EDF 7905 jns 10001EE6
:10001EE1 48 dec eax
:10001EE2 83C8FE or eax, FFFFFFFE
:10001EE5 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001EDF(C)
|
:10001EE6 81E301000080 and ebx, 80000001 //用掩码取出该数的第12 bit
:10001EEC 8D1468 lea edx, dword ptr [eax+2*ebp] //乘以2（二进制）再加上新的bit
:10001EEF 7905 jns 10001EF6
:10001EF1 4B dec ebx
:10001EF2 83CBFE or ebx, FFFFFFFE
:10001EF5 43 inc ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001EEF(C)
|
:10001EF6 81E701000080 and edi, 80000001 //用掩码取出该数的第8 bit
:10001EFC 8D0453 lea eax, dword ptr [ebx+2*edx] //乘以2（二进制）再加上新的bit
:10001EFF 7905 jns 10001F06
:10001F01 4F dec edi
:10001F02 83CFFE or edi, FFFFFFFE
:10001F05 47 inc edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001EFF(C)
|
:10001F06 81E601000080 and esi, 80000001 //用掩码取出该数的第4 bit
:10001F0C 8D1447 lea edx, dword ptr [edi+2*eax] //乘以2（二进制）再加上新的bit
:10001F0F 7905 jns 10001F16
:10001F11 4E dec esi
:10001F12 83CEFE or esi, FFFFFFFE
:10001F15 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001F0F(C)
|
:10001F16 81E101000080 and ecx, 80000001 //用掩码取出该数的第0 bit
:10001F1C 8D0456 lea eax, dword ptr [esi+2*edx] //乘以2（二进制）再加上新的bit
:10001F1F 7905 jns 10001F26
:10001F21 49 dec ecx
:10001F22 83C9FE or ecx, FFFFFFFE
:10001F25 41 inc ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001F1F(C)
|
:10001F26 8B5C2424 mov ebx, dword ptr [esp+24]
:10001F2A 8D0441 lea eax, dword ptr [ecx+2*eax] //乘以2（二进制）再加上新的bit
:10001F2D 6A10 push 00000010
:10001F2F 53 push ebx //ebx中存放变换后的整数
:10001F30 50 push eax
:10001F31 89442424 mov dword ptr [esp+24], eax
:10001F35 E812060000 call 1000254C //sprintf( )

上面的变换看似复杂，实际上可以简化为一个循环，其逆运算就是把各个bit调换回去，如下：

int a = 0x0B26; //变换后的
int b = 0; //变换前的
int index[] = {15,11,7,3,14,10,6,2,13,9,5,1,12,8,4,0};

for(int k = 0; k < 16; k++)
{
b <<= 1;
b |= (a >> index[k]) & 1;
}

这样就可以写出keymaker来，一个注册码是01-0184-4056-8888。注意VerifySN( )函数实际上应该返回0x0B，这点在安装时
不判断，但是其主程序在运行时会判断，若不等于0x0B则无法运行，主要是因为它用这个返回值来区分该公司的不同软件。

* Possible StringData Ref from Data Obj ->"CSPQueryApp::InitInstance - About "
->"to validate SN"
|
:00498348 689C305200 push 0052309C
:0049834D E8FE08F7FF call 00408C50
:00498352 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00498346(C)
|
:00498355 51 push ecx
:00498356 8BCC mov ecx, esp
:00498358 89642418 mov dword ptr [esp+18], esp
:0049835C 51 push ecx
:0049835D 8BCD mov ecx, ebp
:0049835F E88C270000 call 0049AAF0
:00498364 8BCD mov ecx, ebp
:00498366 E815280000 call 0049AB80
:0049836B 8BF0 mov esi, eax
:0049836D 3BF3 cmp esi, ebx
:0049836F 7423 je 00498394
:00498371 F6054078520002 test byte ptr [00527840], 02
:00498378 740D je 00498387

* Possible StringData Ref from Data Obj ->"CSPQueryApp::InitInstance - Invalid "
->"SN"
|
:0049837A 6874305200 push 00523074
:0049837F E8CC08F7FF call 00408C50
:00498384 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00498378(C)
|
:00498387 56 push esi
:00498388 8BCD mov ecx, ebp
:0049838A E8312B0000 call 0049AEC0
:0049838F E939060000 jmp 004989CD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049836F(C)
|
:00498394 8B8504020000 mov eax, dword ptr [ebp+00000204]
:0049839A 83F80A cmp eax, 0000000A
:0049839D 7511 jne 004983B0
:0049839F 53 push ebx
:004983A0 53 push ebx

* Possible StringData Ref from Data Obj ->"Domain license is detected for "
->"this current version of SPQuery. "
->" Please contact St. Bernard Software "
->"for a new license."
|
:004983A1 68FC2F5200 push 00522FFC

* Reference To: MFC42.Ordinal:04B0, Ord:04B0h
|
:004983A6 E849950400 Call 004E18F4
:004983AB E91D060000 jmp 004989CD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049839D(C)
|
:004983B0 83F80B cmp eax, 0000000B //VerifySN( )的返回值
:004983B3 740C je 004983C1
:004983B5 8BCD mov ecx, ebp
:004983B7 E8D42B0000 call 0049AF90 //出错MessageBox
:004983BC E90C060000 jmp 004989CD

BF


supercleaner 2.0 (1)

标 题:supercleaner 2.0 超酷的系统清洁工具破解过程！ (3千字)
发信人:小球
时 间:2001-3-23 22:42:45
详细信息:
supercleaner 2.0 超酷的系统清洁工具破解过程！
来到注册处输入用户名：crack （任意）
注册码：12346567890 （任意）

下断：
bpx hmemcpy
f5回到注册处，按ok
程序被断：
* Possible Reference to Dialog: DialogID_0065, CONTROL_ID:03FC, ""
|
:00409231 68FC030000 push 000003FC
:00409236 56 push esi
:00409237 FFD7 call edi
:00409239 8D842408010000 lea eax, dword ptr [esp+00000108] *假的注册码
:00409240 8D4C2408 lea ecx, dword ptr [esp+08] *假的用户名
:00409244 50 push eax *压入堆栈保存
:00409245 51 push ecx *压入堆栈保存
:00409246 E8F5060000 call 00409940 *一定是比较是否正确的子程序，f8进入
:0040924B 83C408 add esp, 00000008
:0040924E 84C0 test al, al
:00409250 7447 je 00409299
:00409252 8D942408010000 lea edx, dword ptr [esp+00000108]
:00409259 8D442408 lea eax, dword ptr [esp+08]
:0040925D 52 push edx
:0040925E 50 push eax

来到：
* Referenced by a CALL at Addresses:
|:00409246 , :004098BE
|
:00409940 81EC00010000 sub esp, 00000100
:00409946 A070A74100 mov al, byte ptr [0041A770]
:0040994B 53 push ebx
:0040994C 57 push edi
:0040994D 88442408 mov byte ptr [esp+08], al
:00409951 B93F000000 mov ecx, 0000003F
:00409956 33C0 xor eax, eax
:00409958 8D7C2409 lea edi, dword ptr [esp+09]
:0040995C 8B94240C010000 mov edx, dword ptr [esp+0000010C]
:00409963 F3 repz
:00409964 AB stosd
:00409965 66AB stosw
:00409967 8D4C2408 lea ecx, dword ptr [esp+08]
:0040996B 32DB xor bl, bl
:0040996D 51 push ecx
:0040996E 52 push edx
:0040996F AA stosb
:00409970 E8AB000000 call 00409A20 *这里是算码过程，进入
:00409975 8B8C2418010000 mov ecx, dword ptr [esp+00000118]*出来以后应该是正确的注册码了，用d eax看看？呵呵！
:0040997C 83C408 add esp, 00000008
:0040997F 8D442408 lea eax, dword ptr [esp+08]
:00409983 50 push eax
:00409984 51 push ecx

* Referenced by a CALL at Address:
|:00409970
|
:00409A20 81EC00010000 sub esp, 00000100
:00409A26 A070A74100 mov al, byte ptr [0041A770]
:00409A2B 53 push ebx
:00409A2C 55 push ebp
:00409A2D 56 push esi
:00409A2E 57 push edi
:00409A2F 88442410 mov byte ptr [esp+10], al
:00409A33 B93F000000 mov ecx, 0000003F
:00409A38 33C0 xor eax, eax
:00409A3A 8D7C2411 lea edi, dword ptr [esp+11]
:00409A3E F3 repz
:00409A3F AB stosd
:00409A40 66AB stosw
:00409A42 AA stosb
:00409A43 8BBC2414010000 mov edi, dword ptr [esp+00000114]
:00409A4A 57 push edi

我的用户名：crack
注册码：706-26832-576-7224

标 题:算法分析 (11千字)
发信人:2000yeah
时 间:2001-3-24 18:37:46
详细信息:

SuperCleaner V1.91
帮助用户清洗他们的计算机硬盘内不必要的文件的程序
类型：共享软件，注册费$20.00，试用30天 平台：Win 95/98/NT/2000

目的：找到注册码并分析算法
作者：2000yeah

:00408289 8D842408010000 lea eax, dword ptr [esp+00000108] ----fake code
:00408290 8D4C2408 lea ecx, dword ptr [esp+08] ----fake name
:00408294 50 push eax
:00408295 51 push ecx
:00408296 E8A5020000 call 00408540 -------------******** 进入
:0040829B 83C408 add esp, 00000008
:0040829E 85C0 test eax, eax
:004082A0 7447 je 004082E9
:004082A2 8D942408010000 lea edx, dword ptr [esp+00000108]
:004082A9 8D442408 lea eax, dword ptr [esp+08]
:004082AD 52 push edx
:004082AE 50 push eax

* Possible StringData Ref from Data Obj ->"Software\SuperCleaner\Registration" -----save reg code
|
:004082AF 6850714100 push 00417150
:004082B4 6801000080 push 80000001
:004082B9 E8D2020000 call 00408590

* Possible StringData Ref from Data Obj ->"Software\SuperCleaner\Registration" ----save name
|
:004082BE 6850714100 push 00417150
:004082C3 6801000080 push 80000001
:004082C8 E863010000 call 00408430
:004082CD 83C418 add esp, 00000018

* Referenced by a CALL at Addresses:
|:00408296 , :0040850E
|
:00408540 8B4C2404 mov ecx, dword ptr [esp+04]
:00408544 81EC00010000 sub esp, 00000100
:0040854A 8D442400 lea eax, dword ptr [esp]
:0040854E 56 push esi
:0040854F 50 push eax
:00408550 51 push ecx
:00408551 33F6 xor esi, esi
:00408553 E8B8000000 call 00408610 -------------进入此CALL
:00408558 8B842414010000 mov eax, dword ptr [esp+00000114]
:0040855F 83C408 add esp, 00000008
:00408562 8D542404 lea edx, dword ptr [esp+04]
:00408566 52 push edx －－－－－－－－－－－－'real code '
:00408567 50 push eax －－－－－－－－－－－－'fake code'

* Reference To: KERNEL32.lstrcmpA, Ord:0329h －－－－－－－－－－－
| 总比较
:00408568 FF15C0504100 Call dword ptr [004150C0]
:0040856E 85C0 test eax, eax －－－－－－－－－－－－

* Possible Reference to String Resource ID=00001: "Registered to: "
|
:00408570 B801000000 mov eax, 00000001
:00408575 7402 je 00408579
:00408577 8BC6 mov eax, esi

----------------------------------------------------00408553 : call 00408610内--------------------------------------
* Referenced by a CALL at Address:
|:00408553
|
:00408610 81EC00010000 sub esp, 00000100
:00408616 A09CA74100 mov al, byte ptr [0041A79C]
:0040861B 53 push ebx
:0040861C 55 push ebp
:0040861D 56 push esi
:0040861E 57 push edi
:0040861F 88442410 mov byte ptr [esp+10], al
:00408623 B93F000000 mov ecx, 0000003F
:00408628 33C0 xor eax, eax
:0040862A 8D7C2411 lea edi, dword ptr [esp+11]
:0040862E F3 repz
:0040862F AB stosd
:00408630 66AB stosw
:00408632 AA stosb
:00408633 8BBC2414010000 mov edi, dword ptr [esp+00000114]
:0040863A 57 push edi

* Reference To: KERNEL32.lstrlenA, Ord:0335h
|
:0040863B FF1578514100 Call dword ptr [00415178]
:00408641 8BF0 mov esi, eax
:00408643 33C9 xor ecx, ecx
:00408645 33C0 xor eax, eax
:00408647 85F6 test esi, esi
:00408649 7613 jbe 0040865E
:0040864B 8B1558794100 mov edx, dword ptr [00417958]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040865C(C)
|
:00408651 0FBE1C38 movsx ebx, byte ptr [eax+edi] ------------------依次将NAME运算
:00408655 03DA add ebx, edx 此时：EDX=26H
:00408657 03CB add ecx, ebx
:00408659 40 inc eax
:0040865A 3BC6 cmp eax, esi
:0040865C 72F3 jb 00408651-------------------------------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408649(C)
|
:0040865E 8B9C2418010000 mov ebx, dword ptr [esp+00000118]
:00408665 51 push ecx ------------------------------ ecx=23fh=575d

* Possible StringData Ref from Data Obj ->"%u-" －－－－－－－－－－格式
|
:00408666 6894774100 push 00417794
:0040866B 53 push ebx

* Reference To: USER32.wsprintfA, Ord:02B3h
|
:0040866C FF15F4514100 Call dword ptr [004151F4]
:00408672 83C40C add esp, 0000000C
:00408675 33C9 xor ecx, ecx
:00408677 33C0 xor eax, eax
:00408679 85F6 test esi, esi
:0040867B 7614 jbe 00408691
:0040867D 8B155C794100 mov edx, dword ptr [0041795C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040868F(C)
|
:00408683 0FBE2C38 movsx ebp, byte ptr [eax+edi]－－－－－－－－－依次将NAME运算
:00408687 0FAFEA imul ebp, edx 此时：EDX=34H
:0040868A 03CD add ecx, ebp
:0040868C 40 inc eax
:0040868D 3BC6 cmp eax, esi
:0040868F 72F2 jb 00408683－－－－－－－－－－－－－－－－－－－

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040867B(C)
|
:00408691 51 push ecx - -----------------------------------------ecx=55ech=21996d
:00408692 8D4C2414 lea ecx, dword ptr [esp+14]

* Possible StringData Ref from Data Obj ->"%u-" －－－－－－－－－－－－－－格式
|
:00408696 6894774100 push 00417794
:0040869B 51 push ecx

* Reference To: USER32.wsprintfA, Ord:02B3h
|
:0040869C FF15F4514100 Call dword ptr [004151F4]
:004086A2 83C40C add esp, 0000000C
:004086A5 8D542410 lea edx, dword ptr [esp+10]
:004086A9 52 push edx
:004086AA 53 push ebx

* Reference To: KERNEL32.lstrcatA, Ord:0326h
|
:004086AB FF15A0504100 Call dword ptr [004150A0]
:004086B1 33C9 xor ecx, ecx
:004086B3 33C0 xor eax, eax
:004086B5 85F6 test esi, esi
:004086B7 7613 jbe 004086CC
:004086B9 8B1560794100 mov edx, dword ptr [00417960]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004086CA(C)
|
:004086BF 0FBE2C38 movsx ebp, byte ptr [eax+edi] －－－－－－－－－－依次将NAME运算
:004086C3 03EA add ebp, edx 此时：EDX=CH
:004086C5 03CD add ecx, ebp
:004086C7 40 inc eax
:004086C8 3BC6 cmp eax, esi
:004086CA 72F3 jb 004086BF －－－－－－－－－－－－－－－－－－

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004086B7(C)
|
:004086CC 51 push ecx ---------------------------------------ecx=1d7h=471d
:004086CD 8D442414 lea eax, dword ptr [esp+14]

* Possible StringData Ref from Data Obj ->"%u-" －－－－－－－－－－－－格式
|
:004086D1 6894774100 push 00417794
:004086D6 50 push eax

* Reference To: USER32.wsprintfA, Ord:02B3h
|
:004086D7 FF15F4514100 Call dword ptr [004151F4] ----------将注册码合并在一起
:004086DD 83C40C add esp, 0000000C
:004086E0 8D4C2410 lea ecx, dword ptr [esp+10]
:004086E4 51 push ecx
:004086E5 53 push ebx －－－－－－－－ebx=575-21996-

* Reference To: KERNEL32.lstrcatA, Ord:0326h
|
:004086E6 FF15A0504100 Call dword ptr [004150A0]
:004086EC 33C9 xor ecx, ecx
:004086EE 33C0 xor eax, eax
:004086F0 85F6 test esi, esi
:004086F2 7614 jbe 00408708
:004086F4 8B1564794100 mov edx, dword ptr [00417964]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408706(C)
|
:004086FA 0FBE2C38 movsx ebp, byte ptr [eax+edi] －－－－－－－－－依次将NAME运算
:004086FE 0FAFEA imul ebp, edx 此时:EDX=EH
:00408701 03CD add ecx, ebp
:00408703 40 inc eax
:00408704 3BC6 cmp eax, esi
:00408706 72F2 jb 004086FA－－－－－－－－－－－－－－－－－－－

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004086F2(C)
|
:00408708 51 push ecx -------------------------------------ecx=1722h=5922d
:00408709 8D542414 lea edx, dword ptr [esp+14]

* Possible StringData Ref from Data Obj ->"%u" -------格式，最后一位
|
:0040870D 6890774100 push 00417790
:00408712 52 push edx

* Reference To: USER32.wsprintfA, Ord:02B3h
|
:00408713 FF15F4514100 Call dword ptr [004151F4]------------将注册码合并在一起
:00408719 83C40C add esp, 0000000C
:0040871C 8D442410 lea eax, dword ptr [esp+10]
:00408720 50 push eax
:00408721 53 push ebx －－－－－－－－－－－－－－－ebx=575-21996-471-

* Reference To: KERNEL32.lstrcatA, Ord:0326h
|
:00408722 FF15A0504100 Call dword ptr [004150A0] --------过了此CALL，就看到“全家福”了
:00408728 5F pop edi
:00408729 5E pop esi
:0040872A 5D pop ebp
:0040872B 5B pop ebx
:0040872C 81C400010000 add esp, 00000100
:00408732 C3 ret

算法概述：此注册码共分4段。每段EDX的值分别等于"26h" "34h" "ch" "eh"

:00408651 0FBE1C38 movsx ebx, byte ptr [eax+edi] ------------------依次将NAME运算
:00408655 03DA add ebx, edx 此时：EDX=26H //ebx=121+26
:00408657 03CB add ecx, ebx //ecx=ebx+ecx
:00408659 40 inc eax //eax=eax+1
:0040865A 3BC6 cmp eax, esi //if eax<esi
:0040865C 72F3 jb 00408651-------------------------------------依次循环

其他每段的循环雷同，不再一一说了。

name:yeah
code:575-21996-471-5922

注册信息添加在：
HKEY_CURRENT_USER\Software\SuperCleaner\Registration


SWF Browser v2.93

 标 题:SWF Browser v2.93的破解 (1千字)
发信人:mauiboy2001
时 间:2001-5-6 22:57:12
详细信息:
目标：SWF Browser v2.93
工具：softice，w32dsm89
作者：MAUIboy2001[BCG]

SWF Browser是Flash设计不可缺少的工具，很好的。华军有下载。此软件注册
后可把flash文件中的元件拆解出来。

用w32dsm89反汇编，查找字符串“the serial number is invalid”.往上看，
发现“thank you for registering.."

再看，发现是:004A34EC跳的.
那么:004A34E5的call是关键。

用softice载入，下bpx 4A34E5.拦到，F8进入：
:004A32F8 PUSH ebp
.
.(F10)
.
:004A33D6 MOV eax,dword ptr [ebp-08]
:004A33D9 call 00403E3C
:004A22DE jne 004A33E4 --跳则死
:004A33E0 mov bl,01
:004A33E2 jmp 004a33E6 --成功

千万不能将je-->jne,要不会弹出许多错误的烂对话
框。还把我的斗地主的注册文件删了，害我又重装了一遍。惨！

F8进入004A33D9:
:00403E3C push ebx
:00403E3D push esi
:00403E3E push edi
:00403E3F mov esi,eax --d eax(my code)
:00403E41 mov edi,edx --d edx(Serial number)
:00403E43 cmp eax,edx
:00403E45 je 00403EDA --je-->jne不能破。

搞定。name:MAUIboy2001 serial number:45C25B6E

如有人暴破请通知一声，mauiboy2001@china.com 请不要炸喔。


SWFBROWSER280

 标 题:SWFBROWSER280 注册码跟踪实例 (1千字)
发信人:幻影2001[BCG]
时 间:2001-6-29 16:57:23
详细信息:
软件名称:SWFBROWSER280
软件功能：FLASH 动画软件
使用工具：TRW2000
发信人　：幻影2001[BCG]
==================================================================
步骤如下：

运行待破解的程序，输入用户名称和假注册码。
CRTL+n 调出TRW2000 下HMEMCPY指令。点击注册按钮
程序中断在HMEMCPY函数调用处，此时下BD 1 暂停中断1
按F12 八次出现错误信息

------------------------------------------------------------------
重复以上步骤，按F12 七次得出如下代码

1.0167:004A34D4 MOV EAX,[EBX+02C8]
0167:004A34DA CALL 0042D6D8
0167:004A34DF MOV EDX,[EBP-08]
0167:004A34E2 MOV EAX,EBX
0167:004A34E4 POP ECX
0167:004A34E5 CALL 004A32F8 ==》此处可疑
0167:004A34EA TEST AL,AL
0167:004A34EC JZ NEAR 004A3584 ==》对比
0167:004A34F2 PUSH BYTE +00
------------------------------------------------------------------
2.0167:004A33C6 LEA EDX,[EBP-1C]
0167:004A33C9 MOV EAX,20
0167:004A33CE CALL 00408BEC
0167:004A33D3 MOV EDX,[EBP-1C]
0167:004A33D6 MOV EAX,[EBP-08]
0167:004A33D9 CALL 00403E3C ==》进入
0167:004A33DE JNZ 004A33E4
0167:004A33E0 MOV BL,01
0167:004A33E2 JMP SHORT 004A33E6
0167:004A33E4 XOR EBX,EBX
0167:004A33E6 XOR EAX,EAX
-----------------------------------------------------------------
3.0167:00403E3C PUSH EBX
0167:00403E3D PUSH ESI
0167:00403E3E PUSH EDI
0167:00403E3F MOV ESI,EAX ==》此处看到假注册码
0167:00403E41 MOV EDI,EDX ==》此处下D EDX 看到正确注册码
0167:00403E43 CMP EAX,EDX ==》对比真假注册码
0167:00403E45 JZ NEAR 00403EDA
0167:00403E4B TEST ESI,ESI
0167:00403E4D JZ 00403EB7
0167:00403E4F TEST EDI,EDI
0167:00403E51 JZ 00403EBE
0167:00403E53 MOV EAX,[ESI-04]

================================================================
以上为典型的注册码跟踪例子，希望大家不要见笑。


sygate 3.0

标 题:sygate 3.0注册方法文档 (12千字)
发信人:买草帽
时 间:2001-2-23 9:44:55
详细信息:
SyGate3.0破解文档

使用工具
Softice 3.0
w32dasm 8.93
破解者:买草帽
SyGate3.0是一个很好的代理服务软件，它把可以让用户用一台modem上网共享。这个软
件有31天的使用限制，也有使用次数的限制,几个并且它好象在注册表中写入了一个啥,
反正我重装不能使用，不爽,兄弟们几个在网上想用一个小猫同时在网上神游的感觉才没
几天就要结束了,可不行.得想想办法.看来得跟Sygate公司请个安了.因为这个软件的注册
必须在网上进行，先拨号上网再输入注册码,这个程序跟注册运算相关的,分别是Serial No
有两个输入文本框,还有一个是Registration文本框.我在它们中输入如下
Serial No: 18181818 41841888
Registration: 94189418
为啥这样输入,呵呵.我没钱钱去注册呀,他们要这样拨号验证.当然先去给Sygate公司道个
吉祥.(不是小弟舍不得注册的钱钱,不怕各位笑话,我连真的$都没摸过.哪有钱钱去注册嘛.
等二回我手头有$了一定.....恭喜发财!),先礼...而后在Softice的黑脸下面的断点
bpx hmemcpy
然后Ctrl+D切回,按注册按钮,断下了
就按F12回到程序空间.程序先把你输入的
东西转换为其相应的16进制表示的有点像BCD码的相应表示。然后再走一会可以看见如下代码:

:0040F1CE 50 push eax
:0040F1CF 57 push edi

* Reference To: SgSrvAd.SgSetLicense, Ord:001Fh
|
:0040F1D0 E883490000 Call 00413B58//这个调用就是调用接口函数在SgSrvAd.dll文件中,完成注册
//下面就要进去追注册了!我跳进这个dll去追注册码
:0040F1D5 8BF0 mov esi, eax
:0040F1D7 8B442424 mov eax, dword ptr [esp+24]
:0040F1DB 85C0 test eax, eax//返回eax=0就显示注册成功,
:0040F1DD 7479 je 0040F258
:0040F1DF 3D37FFFFFF cmp eax, FFFFFF37
:0040F1E4 7533 jne 0040F219

* Possible Reference to String Resource ID=02000: "SyGate Message"
|
:0040F1E6 68D0070000 push 000007D0
:0040F1EB 8D4C2414 lea ecx, dword ptr [esp+14]
:0040F1EF E83EC90100 call 0042BB32
*********************************************************************************************
下面就是在dll中的代码部分判断函数在SgSrvAd.dll中的函数SgSetLicense(),里的漫漫走没多久就可以走到
这里了,让我来一点一点的解读它.

* Referenced by a CALL at Addresses:
|:100056A5 , :10009C85
|
:10005630 53 push ebx
:10005631 8B5C240C mov ebx, dword ptr [esp+0C]
:10005635 57 push edi
:10005636 8B7C240C mov edi, dword ptr [esp+0C]
:1000563A 53 push ebx//第一部分输入的字符长度
:1000563B 57 push edi//这里是输入的serial No第一部分输入转换成相应16进制BCD码
:1000563C E86FFFFFFF call 100055B0//马上跟进望下边看，这个调用是验证第一部分输入的有效性和生成第二部分注册码的
:10005641 83C408 add esp, 00000008
:10005644 85C0 test eax, eax//回来后这个要为0才让你一路顺风哈
:10005646 753B jne 10005683
:10005648 837C241804 cmp dword ptr [esp+18], 00000004
:1000564D 752C jne 1000567B
:1000564F 8B442414 mov eax, dword ptr [esp+14]
:10005653 56 push esi//Registration部分输入的BCD码转换,94189418
:10005654 53 push ebx//第一部分输入的字符长度
:10005655 57 push edi//其内是16进制BCD表示的18181818
:10005656 8B30 mov esi, dword ptr [eax]
:10005658 E8B3FFFFFF call 10005610//这个也要跟进你先往下跳哈,遇到ret才回来(生成Registration部分注册码)
:1000565D 83C408 add esp, 00000008
:10005660 3BC6 cmp eax, esi//这两个要相等,才行哟,哪个为准?当然是eax中的,它才是真的哟!(esi中的94189418Sygate不收哈)
:10005662 5E pop esi
:10005663 7516 jne 1000567B//当然这里可不能跳的哈
:10005665 8B0F mov ecx, dword ptr [edi]//还有个机关哟...对18181818这段输入有一个很迷信的要求哈,Sygate公司制订的哈.
:10005667 BA00000040 mov edx, 40000000//第一部分第一个字符，一定不能大于4(看来Sygate确实有点忌讳的哈,输入第一个大于4的话它不高兴的哟)，也玩完！！！
:1000566C 81E1000000F0 and ecx, F0000000
:10005672 5F pop edi
:10005673 3BD1 cmp edx, ecx//大于4就是影响S标志
:10005675 5B pop ebx
:10005676 1BC0 sbb eax, eax//这条指令要被S标志影响
:10005678 F7D8 neg eax//第一个输入字符大于4,就米嘎了
:1000567A C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000564D(C), :10005663(C)
|
:1000567B 5F pop edi
:1000567C B802000000 mov eax, 00000002
:10005681 5B pop ebx
:10005682 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10005646(C)
|
:10005683 5F pop edi
:10005684 B801000000 mov eax, 00000001
:10005689 5B pop ebx
:1000568A C3 ret
/***************************************************************************/
第二部分生成代码区
* Referenced by a CALL at Address:
|:1000563C
|
:100055B0 837C240808 cmp dword ptr [esp+08], 00000008//第一部分必须为8个字符
:100055B5 7406 je 100055BD //不跳就玩完
:100055B7 B801000000 mov eax, 00000001//你不相信到了这里返回eax=1就要洗白
:100055BC C3 ret//知道了把,为啥输入'18181818',第一部分输入必须是8个字符才让你过哈

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100055B5(C)
|
:100055BD 56 push esi
:100055BE 8B742408 mov esi, dword ptr [esp+08]
:100055C2 57 push edi
:100055C3 8B06 mov eax, dword ptr [esi]//BCD码18181818注册码第一部分
:100055C5 50 push eax
:100055C6 E805FFFFFF call 100054D0//生成注册码第二部分，跟进哈
:100055CB 8BC8 mov ecx, eax//返回值给ecx
:100055CD 83C404 add esp, 00000004
:100055D0 8BD1 mov edx, ecx
:100055D2 C1E834 shr eax, 34
:100055D5 C1EA28 shr edx, 28
:100055D8 8D0440 lea eax, dword ptr [eax+2*eax]
:100055DB 8D1492 lea edx, dword ptr [edx+4*edx]
:100055DE 03C2 add eax, edx
:100055E0 8BD1 mov edx, ecx
:100055E2 C1EA1C shr edx, 1C
:100055E5 C1E90E shr ecx, 0E
:100055E8 8D3C92 lea edi, dword ptr [edx+4*edx]
:100055EB 8D147A lea edx, dword ptr [edx+2*edi]
:100055EE 5F pop edi
:100055EF 03C2 add eax, edx
:100055F1 03C1 add eax, ecx
:100055F3 8B4E04 mov ecx, dword ptr [esi+04]//'34343434'
:100055F6 25FFFF0F00 and eax, 000FFFFF//这个值就是第一部分生成的
//第二部分，一定要等于esi+04
:100055FB 81E1FFFF0F00 and ecx, 000FFFFF
:10005601 2BC1 sub eax, ecx
:10005603 5E pop esi
:10005604 C3 ret
/*************************************************************************/

* Referenced by a CALL at Address:
|:100055C6
|
//算法部分:文本的第二部分跟18181818相匹配的注册码就由这里运算得来,你可以把它当做一个黑箱.在这里外
//界输入只有一个18181818,(当然你也可以把它当做一头奶牛,吃的是18181818,挤出的就是......:),其实程序
//在这里做的也就是做的几个异或加上小学就会的四则混合运算拉,我懒!就不分析了哈,有数学兴趣的漫漫看.
:100054D0 8B4C2404 mov ecx, dword ptr [esp+04] \\ BCD 18181818
:100054D4 56 push esi
:100054D5 8BC1 mov eax, ecx
:100054D7 3543512400 xor eax, 00245143
:100054DC 0FAFC1 imul eax, ecx
:100054DF 0FAFC1 imul eax, ecx
:100054E2 8BD0 mov edx, eax
:100054E4 C1E20B shl edx, 0B
:100054E7 2BD0 sub edx, eax
:100054E9 8D1492 lea edx, dword ptr [edx+4*edx]
:100054EC 8D1490 lea edx, dword ptr [eax+4*edx]
:100054EF 8D1452 lea edx, dword ptr [edx+2*edx]
:100054F2 8DB450777A0600 lea esi, dword ptr [eax+2*edx+00067A77]
:100054F9 B865A62573 mov eax, 7325A665
:100054FE 0FAFF1 imul esi, ecx
:10005501 F7E1 mul ecx
:10005503 0FAFF1 imul esi, ecx
:10005506 81EE6E1A0000 sub esi, 00001A6E
:1000550C 0FAFF1 imul esi, ecx
:1000550F C1EA11 shr edx, 11
:10005512 8BC2 mov eax, edx
:10005514 C1E008 shl eax, 08
:10005517 03C2 add eax, edx
:10005519 8D0440 lea eax, dword ptr [eax+2*eax]
:1000551C 8D8406B1110000 lea eax, dword ptr [esi+eax+000011B1]\\第二部分挤出来的在eax中,
:10005523 5E pop esi
:10005524 C3 ret
/**************************************************************************/
/**************************************************************************/
//第三部分生成代码区
10005610 837C240808 cmp dword ptr [esp+08], 00000008//第二次判断你输入是字符数是8吗?
:10005615 7406 je 1000561D//这里要跳过去哈,不然.....
:10005617 B801000000 mov eax, 00000001
:1000561C C3 ret// 呵呵~看来Sygate公司跟我们一样,对这样的吉祥数值8也是喜欢哈.但你可不要把代码走到这一行哟!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10005615(C)
|
:1000561D 8B442404 mov eax, dword ptr [esp+04]
:10005621 8B08 mov ecx, dword ptr [eax]
:10005623 51 push ecx//根据第一部分生成
10005624 E807FFFFFF call 10005530//跟进就是生成Registration的算法了哈!
:10005629 83C404 add esp, 00000004
:1000562C C3 ret

/***************************************************************************/
//算法部分:文本的第三部分跟18181818相匹配的Registration注册码就由这里运算得来,你可以把它当做一个
//黑箱.在这里外界输入只有一个18181818,(当然你也可以还是把它当做一头奶牛,吃的是18181818,挤出的就是......:),

:10005530 8B4C2404 mov ecx, dword ptr [esp+04]
:10005534 56 push esi
:10005535 8BC1 mov eax, ecx//ecx=(BCD码)18181818
:10005537 3545099294 xor eax, 94920945
:1000553C 0FAFC1 imul eax, ecx
:1000553F 0FAFC1 imul eax, ecx
:10005542 0FAFC1 imul eax, ecx
:10005545 0FAFC1 imul eax, ecx
:10005548 8D14C500000000 lea edx, dword ptr [8*eax+00000000]
:1000554F 2BD0 sub edx, eax
:10005551 8D1490 lea edx, dword ptr [eax+4*edx]
:10005554 8DB4D061050000 lea esi, dword ptr [eax+8*edx+00000561]
:1000555B B8CF4D0FC2 mov eax, C20F4DCF
:10005560 F7E1 mul ecx
:10005562 0FAFF1 imul esi, ecx
:10005565 8BC1 mov eax, ecx
:10005567 2BC2 sub eax, edx
:10005569 D1E8 shr eax, 1
:1000556B 03C2 add eax, edx
:1000556D C1E811 shr eax, 11
:10005570 8BD0 mov edx, eax
:10005572 C1E204 shl edx, 04
:10005575 03D0 add edx, eax
:10005577 8D04D2 lea eax, dword ptr [edx+8*edx]
:1000557A 8D04C0 lea eax, dword ptr [eax+8*eax]
:1000557D 03F0 add esi, eax
:1000557F 0FAFF1 imul esi, ecx
:10005582 81EE1C82B302 sub esi, 02B3821C
:10005588 0FAFF1 imul esi, ecx
:1000558B C1E91E shr ecx, 1E
:1000558E 81F1FAFAFAFA xor ecx, FAFAFAFA
:10005594 8D0489 lea eax, dword ptr [ecx+4*ecx]
:10005597 8D0480 lea eax, dword ptr [eax+4*eax]
:1000559A 8D0480 lea eax, dword ptr [eax+4*eax]
:1000559D 8D1480 lea edx, dword ptr [eax+4*eax]
:100055A0 C1E204 shl edx, 04
:100055A3 2BD1 sub edx, ecx
:100055A5 8D8416E3140000 lea eax, dword ptr [esi+edx+000014E3]//挤出来第三部分的就是这个eax的拉!
:100055AC 5E pop esi
:100055AD C3 ret

后记:
这个软件已经是我很久跟的了,不过它确实很好,现在它的版本也升高了.我这人既笨又懒.新的4.0注册方法
好象是改了,好象不是通过调用dll实现的注册码验证的了.我也不敢去追了,在汇编代码森林里真的好可怕.还是
上街去打望的好,呜呜......

标 题:再贴上注册机把，小弟第一次贴注册机，写的丑，多多包含。 (4千字)
发信人:买草帽
时 间:2001-2-23 10:12:49
详细信息:

//很久前以写的了，哪时候还有班上，现在我又下岗了。真怀恋有工作的时光

#include<windows.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
char *point,*point1,charstr[100],covert[100],input_no[100],char1;
DWORD number,i,first,second,third,random;

void main(void)
{ printf("SyGate 3.0 proxy registry http://www.sygate.com \n");
printf("crack by:machoman\n");
printf("please input number \n");
scanf("%s",charstr);
getchar();
strcpy(input_no,charstr);
/*********************************************************************************/
//这部分C是把输入的转换成对应的类BCD表示，如果输入'18181818'把它转换为一个DWORD的0x18181818
number=lstrlen(input_no);
if(number<8)
{printf("the input number can 't lower 8 NULL\n");
return;
}
point=&char1;
random=rand();
for(i=0;i<8;i++)
{
point=&input_no[i];
if(((*point)<0x30)|(((*point)>0x39)&&((*point)<0x41))|(((*point)>0x5a)&&((*point)<0x61))|
((*point)>0x66)|(((*point)>0x46)&&((*point)<0x61))|(input_no[0]>0x34))
{printf("input must area in 0-9,A-F and first character must lower 4");
return;
}
if(*point>=0x30&&*point<=0x39)
{*point=*point-0x30;
first=first<<4;
first=first|(*point);

}
else
if((*point)>=0x41&&(*point)<=0x46)
{*point=*point-0x37;
first=first<<4;
first=first|(*point);

}
else
if((*point)>=0x61&&(*point)<=0x66)
{*point=*point-0x57;
first=first<<4;
first=first|(*point);
}
point1=point1+1;
}
/*********************************************************************************/
//这部分汇编代码就是在程序中粘贴过来的，我懒！不想写成C了
_asm{ push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
mov ecx, first//(BCD)18181818
mov eax, ecx
xor eax, 0x245143
imul eax, ecx
imul eax, ecx
mov edx, eax
shl edx, 0x0B
sub edx, eax
lea edx, dword ptr [edx+4*edx]
lea edx, dword ptr [eax+4*edx]
lea edx, dword ptr [edx+2*edx]
lea esi, dword ptr [eax+2*edx+0x67A77]
mov eax, 0x7325A665
imul esi, ecx
mul ecx
imul esi, ecx
sub esi, 0x00001A6E
imul esi, ecx
shr edx, 0x11
mov eax, edx
shl eax, 0x08
add eax, edx
lea eax, dword ptr [eax+2*eax]
lea eax, dword ptr [esi+eax+0x11B1]

mov ecx, eax
mov edx, ecx
shr eax, 0x34
shr edx, 0x28
lea eax, dword ptr [eax+2*eax]
lea edx, dword ptr [edx+4*edx]
add eax, edx
mov edx, ecx
shr edx, 0x1C
shr ecx, 0xE
lea edi, dword ptr [edx+4*edx]
lea edx, dword ptr [edx+2*edi]
add eax, edx
add eax, ecx
and eax, 0xFFFFF//这个值就是后半部分serial no:的低4位，高4位可为随机数
mov second,eax

mov ecx, first//(BCD)18181818
mov eax, ecx
xor eax, 0x94920945
imul eax, ecx
imul eax, ecx
imul eax, ecx
imul eax, ecx
lea edx, dword ptr [8*eax+00000000]
sub edx, eax
lea edx, dword ptr [eax+4*edx]
lea esi, dword ptr [eax+8*edx+0x0000561]
mov eax, 0xC20F4DCF
mul ecx
imul esi, ecx
mov eax, ecx
sub eax, edx
shr eax, 1
add eax, edx
shr eax, 0x11
mov edx, eax
shl edx, 04
add edx, eax
lea eax, dword ptr [edx+8*edx]
lea eax, dword ptr [eax+8*eax]
add esi, eax
imul esi, ecx
sub esi, 0x2B3821C
imul esi, ecx
shr ecx, 0x1E
xor ecx, 0xFAFAFAFA
lea eax, dword ptr [ecx+4*ecx]
lea eax, dword ptr [eax+4*eax]
lea eax, dword ptr [eax+4*eax]
lea edx, dword ptr [eax+4*eax]
shl edx, 04
sub edx, ecx
lea eax, dword ptr [esi+edx+0x0014E3]
mov third,eax//这里就是Registration:
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax

}
printf("output of registry key is:\n");
printf("Serial No:%x",first);
printf("-");
printf("%d0",random);
printf("%x\n",second);
printf("Registration:%x\n",third);

}


SyGate 4.0 build712

 标 题:让SyGate 4.0 build712自己告诉你注册码. (2千字)
发信人:CBIN
时 间:2001-5-3 20:34:19
详细信息:
w32dsm反编译sygate.exe，寻找"trial version expired"共找到5处。跟踪可知第二处为过期时弹出窗口的程序段。

* Referenced by a CALL at Addresses:
|:004270DB , :00428B02
|
:0041FD40 64A100000000 mov eax, dword ptr fs:[00000000]
:0041FD46 6AFF push FFFFFFFF
:0041FD48 68D1B54600 push 0046B5D1
:0041FD4D 50 push eax
:0041FD4E A13CC94800 mov eax, dword ptr [0048C93C]
:0041FD53 64892500000000 mov dword ptr fs:[00000000], esp
:0041FD5A 81ECDC000000 sub esp, 000000DC
:0041FD60 8B8063010000 mov eax, dword ptr [eax+00000163]
:0041FD66 56 push esi
:0041FD67 83E803 sub eax, 00000003
:0041FD6A 8BF1 mov esi, ecx
:0041FD6C 0F84FB010000 je 0041FF6D --------> **关键，跳则活，不跳就死翘翘。
:0041FD72 48 dec eax
:0041FD73 0F84D7010000 je 0041FF50
:0041FD79 A108DF4800 mov eax, dword ptr [0048DF08]
:0041FD7E 85C0 test eax, eax
:0041FD80 746E je 0041FDF0
:0041FD82 8B4E1C mov ecx, dword ptr [esi+1C]
:0041FD85 6A40 push 00000040

* Possible Reference to String Resource ID=02006: "This trial version has expired. Please visit www.sygate.com "
|
:0041FD87 68D6070000 push 000007D6

* Possible Reference to String Resource ID=02005: "Trial Version Expired"
|
:0041FD8C 68D5070000 push 000007D5
:0041FD91 51 push ecx

先改日期，使sygate过期。在trw中设断点bpx 41FD40,点load运行，f5运行sygate，trw栏下，在41fd67处吧al至为3，
f5运行程序发现程序不在过期。
那么，怎么让SyGate 4.0 build712自己告诉你注册码呢？只要按下面的步骤就可搞定：
1。让sygate过期，运行时弹出过期窗口让你注册，不管它，直接cancel掉。
2。用上面的改法运行一遍，在help-register license...中看到了什么？
以后在运行sygate也不会过期了，因为那时真的注册码呀。这个注册码可能是sygate的万能注册码，因为我在2台
不同配置的机器下以不同的用户名都得到了相同的注册码，不过也可能是根据windows的cdkey生成的因为2个机器
的win98都用1张盘装的，所以没法验证了。不过为什么会这样，我想大概是sygate的程序员偷懒造成的吧：）

附：
serial number:520D7FA0-9AD4E63
registration code:2E549118
首次运行需输trial key:
trial key:H1(或2)XXXXXX(6位任意数或字母)

不止为什么，sygate在我的机器上始终无法实现共享上网（未破前也一样），在别人的机器上可以，lan没问题，
望高手指教。

另，拜托高手帮忙搞定mmtools(multimedia tools一个delphi VCL控件)1.7版（）
老爸还急着要用呢。多谢！


System Mechanic 3.6b

 标 题:System Mechanic 3.6b（一个简单的对抗SOFT-ICE软件）注册码破解（初学者快快看哦） (3千字)
发信人:paulyoung
时 间:2001-5-14 23:46:54
详细信息:
System Mechanic 3.6b（一个简单的对抗SOFT-ICE软件）注册码破解（初学者快快看哦）

作者：PaulYoung
时间：2001.05.14
软件简介：多功能系统维护优化工具。《电脑报》有介绍。有30天时间限制。
DOWNLOAD:http://download.yesky.com/servlet/mydown.yeskydown?tag=7&objID=27018&se=1 (1457KB)
破解工具：FI V2.43A,CASPR V1012,HEXWORKSHOP V3.1B,SOFT-ICE V4.05
_________________________________________________________________________________________________

    各位，各位，小弟我, PaulYoung 又来献丑了。:D
今晚有空，又上网找软件来练手了（唉，难的我解不了，易的又浪费时间，高不成，低不就的，矛盾得很），终于找到了一个据说是什么“多功能系统维护优化工具”的System Mechanic 3.6b，《电脑报》说：“可惜不是免费软件”，嘻，我来帮大家把它变了免费软件吧。这是 Cracker 的天职哦！
    安装后，运行，我倒，眼前忽然一黑，停电了？？？！！！不是，灯火通明的，何来停电！！原来电脑重启了！让我想想，怎么这种现象那么熟悉？哦，是“美××卫士”，我以前解过了，也有这种现象。因为我运行了Soft-Ice or TRW等破解工具。
好吧，看看是不是这回事。再来。

    一、解决对抗Soft-Ice问题
    用FI侦测它原来是用ASpack v2.1加的壳，好办，用CASPR V1012干掉。
    用HEXWORKSHOP打开脱壳后的文件，查找"SICE"文本字符串，好，果然找到了，哈，下面还有一个"NTICE"，把这两个关键词替换为×××（反正不是SICE,NTICE就行了，最好字节数相等）。
    再运行修改后的程序，哈……不重启了。（我等Cracker，没有Soft-Ice可怎么过日子呀，但你没有安装它这些内容就免看了）。

    二、注册码破解
    找到"Enter Serial Number"，输入“11111-22222-3333333333”（因为它的三个框刚好能填满这些数字，请记住它的格式！）
    Ctrl+D,激活SOFT-ICE,下bpx hmemcpy,F5退出，点OK，还有……这些高手免看了。 :)
    按F12　15次出错，因此 BE * 重建断点，再F5　退出，点OK，按F12　14下，来到……

:00497AAB FF75F4 push [ebp-0C] //入口，F10跟踪……
:00497AAE 68B87C4900 push 00497CB8
:00497AB3 8D55F0 lea edx, dword ptr [ebp-10]
:00497AB6 8B8300020000 mov eax, dword ptr [ebx+00000200]
:00497ABC E86740FCFF call 0045BB28
:00497AC1 FF75F0 push [ebp-10]
:00497AC4 68B87C4900 push 00497CB8
:00497AC9 8D55EC lea edx, dword ptr [ebp-14]
:00497ACC 8B8304020000 mov eax, dword ptr [ebx+00000204]
:00497AD2 E85140FCFF call 0045BB28
:00497AD7 FF75EC push [ebp-14]
:00497ADA 8D45F8 lea eax, dword ptr [ebp-08]

* Possible Reference to String Resource ID=00005: "Cancel"
|
:00497ADD BA05000000 mov edx, 00000005
:00497AE2 E86DC4F6FF call 00403F54
:00497AE7 8B45F8 mov eax, dword ptr [ebp-08]
:00497AEA 8D55FC lea edx, dword ptr [ebp-04]
:00497AED E8D203F7FF call 00407EC4
:00497AF2 8D55E8 lea edx, dword ptr [ebp-18]
:00497AF5 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:00497AFB E898B9F8FF call 00423498
:00497B00 8B45E8 mov eax, dword ptr [ebp-18]
:00497B03 8B55FC mov edx, dword ptr [ebp-04]
:00497B06 E84D61FFFF call 0048DC58 // D EAX or D EDX,ALT+↓，均看到很多注册码模样的东西，其实只有最后一个是，为什么，因此只有它才符合XXXXX-XXXXX-XXXXXXXXXX（第1、2框有5个数字，第3框可填10个数字）
:00497B0B 84C0 test al, al
:00497B0D 740F je 00497B1E
:00497B0F E8F45CFFFF call 0048D808
:00497B14 E85BA7FFFF call 00492274
:00497B19 E95F010000 jmp 00497C7D

_________________________________________________________________________________________________

    （KAO，这么简单，看它简直浪费上网费！）谁骂我谁骂我，各位看官，别骂别骂，只因小弟“五一”搞了个网站，当然是 Cracker 的东东啦，老想搞宣传，可惜近来没找到什么太有特色而自己又能破解的软件，只好拿它来宣传了！！

    最后，当然是卖广告了。

欢迎光临　“Cracker 初体验”　http://paulyoung.yeah.net
_________________________________________________________________________________________________


system mechanic3.5

标 题:system mechanic3.5g破解注册手记 (927字)
发信人:孙锋
时 间:2001-2-1 23:53:52
详细信息:
system mechanic3.5g破解注册手记
作者：孙锋
Email：sffs@263.net
主页：http://sffs.6to23.com
1、启动trw2000
2、随便输入注册信息
  Name: 孙锋
  SrialNumaber: 1234567890
3、Ctrl+N
4、　下bpx hmemcpy
5、　F5返回程式空间
6、　点击OK
7、　拦截到bd * ，F12 14次
8、　F10 到第一个call
  0167:004a8a7e call 004228d0 ; F8 进入
  F10 到如下位置
  0167:004a8af0 move eax,[ebx+01e8] ; d eax ===18521-ST659-4717865626
  0167:004a8B30 move eax,[ebx+01e8] ; d eax ===17921-PR065-0877471786
  0167:004a8B70 move eax,[ebx+01e8] ; d eax ===19022-ND154-9666360675
9、　有注册表操作。
10、　得到3组注册码
  Name : sunfeng
  SrialNumber: 1234567890
  在0167:004a8aed move eax,[ebx+01e8] ; d eax ===65655-ST550-1786561405
   70706-ND055-6636066455
  0167:004a8B30 move eax,[ebx+01e8] ; d eax ===59595-PR014-7747175344

<------完--------->
相关信息:

  • system mechanic3.5g破解注册手记 (927字)(孙锋 2-1 23:53 阅读 24)
    • 我也破过,其中有一组注册码能用全部功能,其它两组没什么用. (空)(AIDS! 2-1 23:55 阅读 0)
    • 应该是sunfeng 65655-ST550-1786561405 这组吧。 (空)(孙锋 2-1 23:57 阅读 1)
      • 好像是! (空)(TAE! 2-1 23:58 阅读 0)


Tag&Rename 1.7

 标 题:【标题：Tag&Rename 1.7 文章二 ：此软件的注册码算法。（ 进来看看 8^) ）】
发信人:mcny@work
时 间:2000-11-14 14:31:20
详细信息:
【标题：Tag&Rename 1.7 文章二 ：此软件的注册码算法。（ 进来看看 8^) ）】
==========================================================================================
软件 ：Tag&Rename 1.7

软件简介 ：一个可以修改MP3 和 VQF 音乐文件中的TAG说明的程序。目前尚未支持MP3最新的ID3v2
但是，仍然是一个很好用的编辑工具。

下载处 ：软件主页: http://www.softpointer.com/tr.htm
==========================================================================================
本文作者 ：McNy@Work
日期 ：2000年11月11日 --> 2000年11月13日
Email ：mcny_work@yahoo.com
（邮件主题请以"WANTED:McNycn"开始，注意英文字母大小写，否则我将收不到喔！）

-------------------------
我写了一个注册码测试器(若你输入的S/N为正确的注册码,它会告诉你,否则只会显示你的"注册码
生成串")。 实在没多大用途,不过有兴趣的话,可以试看看。会一击即中也说不得! （请使用
下面地址下载。）

(不过，可以改编成穷举法算码器,不过不知道要算多久才有结果(日月可计吧!)。
想要源程序可与我联系)

<无法从浏览器直接下载!!需要使用Flashget,Netants,...等工具进行下载(但不支持断点续传)>
网址 : http://www.geocities.com/mcny_work (只有两个页面,正在建造中,施工缓慢)
下载地址: http://www.geocities.com/mcny_work/file/2000/tagren17_kt.zip
(使用方法:请看readme.txt)

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
终于将本文输完了（有点神经衰退了 8^) ）。看雪学院、论坛给我的帮助，实在是太多太多了！！
在此，感谢看雪与来访论坛的各位大侠。并以【 Tag&Rename 1.7 文章一】、【二】 献给大家。。。

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
【目录】
§＝＝＝＝＝＝＝＝§
§ 一、前言 §
§ 二、正文 §
§ 三、后记 §
§ 四、附录 §
§＝＝＝＝＝＝＝＝§

----------------------------------【一、前言】--------------------------------------------

下面代码是取自『Tag&Rename 1.7 文章一』的『第二部分』，有见过那篇文章的朋友或许会有印象。
本文的算法，是从代码 **(C3)** 处的call逐渐向上追踪所得。起始点是call内部深处所调用的
CompareStringA 。（注:直接bpx CompareStringA 并不能截住！因为实际上是调
用CompareStringA + 0D 的地址。 所以bpx应该是设在CompareStringA再加 0D 的地址。）

由于涉及算法的核心代码冗长（不少于600行）。经笔者整理以后，本文用C＋＋来演示。
（由于笔者编程水平实在有限，希望大家能够帮忙优化。。。，不胜感激。）

...
017F:0045655F MOV EAX,ESI
017F:00456561 CALL 00402F68
017F:00456566 LEA EDX,[EBP-04]
017F:00456569 LEA EAX,[EBP-18]
017F:0045656C CALL 00456460 ///由输入S/N，产生"注册码生成串"的
///主要调用。
017F:00456571 MOV DL,01
017F:00456573 MOV EAX,[00410060]
017F:0045657D MOV [EBP-08],EAX
017F:00456580 LEA EAX,[EBP-08]
017F:00456583 CALL 00456404
017F:00456588 MOV EDX,[EBP-04]
017F:0045658B MOV EAX,[EBP-08]
017F:0045658E MOV ECX,[EAX]
**(C3)** 017F:00456590 CALL NEAR [ECX+50] //比较"注册码生成串'和两百余个
//"正确的串"。
//若全部不匹配返回EAX=FFFFFFFF
//（内部会调用 Kernel32!CompareStringA）
017F:00456593 INC EAX
**(A3)** 017F:00456594 JZ 0456598 /// EAX=0 时跳转。我们改这里!!!
==> 017F:00456598 MOV BL,01 /// 若上一行不跳转，则注册码正确。
017F:0045659B CALL 00402F68
017F:004565A0 XOR EAX,EAX
....

----------------------------------【二、正文】--------------------------------------------

Tag&Rename 1.7 使用了一个不可逆的注册码算法。我们输入的注册码S/N,运用该算法产生一个
“注册码生成串”。再将我们的“注册码生成串”与程序中的“内部比较串”（实质上是编程时，事先
由正确的注册码所产生的“注册码生成串”）进行比较，若有其中一个“内部比较串”与之相同，则注
册成功！

（一）产生“注册码生成串”的步骤：< 我们输入S/N: 1234567890 >

1)读入用户输入的S/N （并去除 S/N 的空格前缀与后缀！） // eg: S/N = " SN-0001 45678-8890 "
a)S/N可以是任何的英文字母、数字、标点符号 // ==> S/N = "SN-0001 45678-8890"
b)S/N长度<=45

2)将S/N 放入char sn_area[0] 中,并以 0x80 作为串结束符。在 sn_area[0x38] 处放入(串长* 8 ) 。
（ 见 **(D1)** ）

3)调用不可逆算法，产生“注册码生成串”：
A)进行位操作.

B)进行'和'操作 //!!! 是这里造成本算法的不可逆!!! // 见**(D4)**

C)改变Ap4[0] （指向A[] ） , 重复A)到C)直到FOR 循环结束 // 见**(D3)**

D)将B[]与改变后的A[]相加（注意相加时的指针）,结果放入A[] // 见**(D5)**

E)人为地将A[]分成四组（每一组4个字节〕。逐个将每个小组变成字符串，将结果加入outputsn 串尾。
最后一组字符串必须加入outputsn两次。（最后产生一个近似四十个字符的字符串）

F) outputsn 就是我们求得的"注册码生成串",我们就是用它与程序内所有的"内部比较串'比较。

（二）为什么此算法不可逆？
A) 首先必须阐明: 整个算法中,只有两个主要变量: sn_area[] ,A[] 。
sn_area[] 的内容,在我们输入S/N 后便确定下来了(不会再改变) 。
只有 A[] 的内容,会在算法中不断的改变!!
（其余的常量都是TagRename 程序的内定值，不可擅自篡改！ 8^) ）

B)假设现在seed=63, 这是最后一个循环了。我们会进行以下操作. // 见 **(XX)** 处
但是，为了方便阐述，我们临时将几个变量名做了一点调整:

//这是正向过程的最后一个循环。
buf1= Ap3[0] | (~ Ap2[0]);
buf1= buf1 ^ Ap1[0];
buf2=buf1+Ap4_old[0]+sna[0]+mydef[seed]+Ap3[0]; // <=关键
Ap4_new[0]=buf2; // Ap4_new[0], Ap4_old[0] 皆指向A[]
// sna[0]包含我们所输入的S/N
可见,这一次循环中只有Ap4_new[0]被改变.

若我们要作一个逆过程(从一个'内部比较串"找其正确注册码),则必须从已知的
Ap4_new[0]求得原来的Ap4_old[0],好让程序不断的循环下去。逆过程如下：

//这是逆过程的第一个循环。
buf1= Ap3[0] | (~ Ap2[0]); //位操作不变。
buf1= buf1 ^ Ap1[0];
Ap4_old[0]=Ap4_new[0]-( buf1+sna[0]+mydef[seed]+Ap3[0] ); // <=关键

我们知道，这个逆过程中 Ap4_old[0] 是未知的。必须算出它的值，我们才
能继续算下去，一直到循环结束，得到正确的注册码。

然而，这里有一个矛盾！！因为 sna[0] 中存放的是我们输入的注册码（在逆过程中，
当然是指正确的注册码。 即：若此处的注册码与当初生成“内部比较串”时的注册码不同，
则必定不会得到我们所期望的结果！）。可是，我们并不知道正确的注册码是什么，
所以 sna[0]在逆过程中也应该是未知的！！

只有一个等式，却有两个未知数，当然无解啦！ （本想写个注册机，才花那么多时间去分析
代码，这回可真是 '偷鸡不着蚀把米' 8^( ）

（三）VC＋＋代码（局部）：〔想要源程序可与我联系〕
//++++++++++++++++++++++++Tag&Rename 1.7 算法(VC++)++++++++++++++++++++++++++++++++++++++++++++++++++
///Compile successful in VC++6.0
///假定 int 和 char 的长度都为 4 个字节

//我们输入的S/N串会放入sn_area[]中。
//假设我们输入的S/N 为 1234567890 ，则sn_area[]如下。
//注意：必需以0x80作为串的结束符！！ 而且 sn_area[0x38]处必需放入'串长x8'
//此列中 sn_area[0x38]=0x50
//我们人为的将它分成16个区(用十六进制数0-F表示) **(D1)**
char sn_area[64]={
0x31,0x32,0x33,0x34, 0x35,0x36,0x37,0x38, 0x39,0x30,0x80,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x50,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
};

//都是常数,用来选择sn_area的某一区
int sna_select[64]={ 0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
0x1,0x6,0xB,0x0,0x5,0xA,0xF,0x4,0x9,0xE,0x3,0x8,0xD,0x2,0x7,0xC,
0x5,0x8,0xB,0xE,0x1,0x4,0x7,0xA,0xD,0x0,0x3,0x6,0x9,0xC,0xF,0x2,
0x0,0x7,0xE,0x5,0xC,0x3,0xA,0x1,0x8,0xF,0x6,0xD,0x4,0xB,0x2,0x9 };

//都是常数,用来进行四则运算.
int mydef[64]= {0xD76AA478,0xE8C7B756,0x242070DB,0xC1BDCEEE,0xF57C0FAF,0x4787C62A,0xA8304613,0xFD469501,
0x698098D8,0x8B44F7AF,0xFFFF5BB1,0x895CD7BE,0x6B901122,0xFD987193,0xA679438E,0x49B40821,
0xF61E2562,0xC040B340,0x265E5A51,0xE9B6C7AA,0xD62F105D,0x02441453,0xD8A1E681,0xE7D3FBC8,
0x21E1CDE6,0xC33707D6,0xF4D50D87,0x455A14ED,0xA9E3E905,0xFCEFA3F8,0x676F02D9,0x8D2A4C8A,
0xFFFA3942,0x8771F681,0x6D9D6122,0xFDE5380C,0xA4BEEA44,0x4BDECFA9,0xF6BB4B60,0xBEBFBC70,
0x289B7EC6,0xEAA127FA,0xD4EF3085,0x04881D05,0xD9D4D039,0xE6DB99E5,0x1FA27CF8,0xC4AC5665,
0xF4292244,0x432AFF97,0xAB9423A7,0xFC93A039,0x655B59C3,0x8F0CCC92,0xFFEFF47D,0x85845DD1,
0x6FA87E4F,0xFE2CE6E0,0xA3014314,0x4E0811A1,0xF7537E82,0xBD3AF235,0x2AD7D2BB,0xEB86D391 };

//我们人为的将A[]、B[]各分成四组.(每4个字节一组) **(D2)**
//A[]和B[]的初始值都一样, 但是A[]会在循环 **(D1)** 中不断改变.
char A[16]={0x01,0x23,0x45,0x67, 0x89,0xAB,0xCD,0xEF, 0xFE,0xDC,0xBA,0x98, 0x76,0x54,0x32,0x10};
char B[16]={0x01,0x23,0x45,0x67, 0x89,0xAB,0xCD,0xEF, 0xFE,0xDC,0xBA,0x98, 0x76,0x54,0x32,0x10};

CString outputsn; //所求得的'注册码生成串'。

int p1,p2,p3,p4; //使用它们来指定要使用A[]的哪个部分。

__inline bool CTagRen17snDlg::checkfor1targ()
{
int i,buf1,seed;
int *Ap1,*Ap2,*Ap3,*Ap4,*sna; //

p1=0x08; //Initialize the Started A[n] order
p2=0x0c;
p3=0x04;
p4=0;

for (seed=0;seed<64;seed++) //seed=0 --> 63 **(D3)**
{
Ap1=(int*)&A[p1]; //注意：这里强制将char指针变成int指针，所以看到的数据会颠倒。
//举例，A[p1]的内容= 01 23 45 67
// Ap1[0] = 67 45 23 01
Ap2=(int*)&A[p2];
Ap3=(int*)&A[p3];
Ap4=(int*)&A[p4];
sna=(int*)&sn_area[sna_select[seed]*4]; //注意：这里也强制将char指针变成int指针。

//Here start
if(seed<16) //这里就不用多说了吧,都是一些位操作.
{
buf1= Ap3[0] & Ap1[0];
buf1= ((~Ap3[0])& Ap2[0]) | buf1;
}
else if(seed<32)
{
buf1= Ap2[0] & Ap3[0];
buf1= ((~Ap2[0])& Ap1[0]) | buf1;
}
else if (seed<48)
{
buf1= Ap3[0] ^ Ap1[0];
buf1= buf1 ^ Ap2[0];
}
else
{
buf1= Ap3[0] | (~ Ap2[0]); // **(XX)**
buf1= buf1 ^ Ap1[0];
}

buf1=buf1+Ap4[0]+sna[0]+mydef[seed]+Ap3[0]; //<=该死的东西!! **(D4)**

Ap4[0]=buf1; //整个for循环只改变A[]中的某一组

///改变p1,p2,p3,p4
if (p1==0) p1=0x0c;
else p1=p1-4;
if (p2==0) p2=0x0c;
else p2=p2-4;
if (p3==0) p3=0x0c;
else p3=p3-4;
if (p4==0) p4=0x0c;
else p4=p4-4;
}//for_end

///
int *pa,*pb;
for (i=0;i<4;i++) //Final Add
{
pa=(int*)&A[i*4]; //注意：这里也强制将char指针变成int指针。**(D5)**
pb=(int*)&B[i*4];
pa[0]=pa[0]+pb[0];
}

///将pa[]的内容（共十六字节，分成四字节一组）转换成字符串（四十个字符/或近四十个字符）。
char aaaa[50];
outputsn.Empty();
for (i=0;i<4;i++)
{
pa=(int*)&A[i*4];
_itoa(pa[0],aaaa,16); //注意：若pa[0]中的内容以0为前导，前导0不转换！
//举例：pa[0]=00A5D41E ，则aaaa='A5D41E'
outputsn=outputsn+aaaa;
}
outputsn=outputsn+aaaa; //A[]的最后一组要多加一次！！（这样便构成
// 四十个字符/或近四十个字符）
outputsn.MakeUpper();
m_disbox1.SetWindowText(outputsn);

//此时，outputsn=注册码生成串
//举例： 我们输入S/N="1234567890" ，则 outputsn='EA4DC7F7799A0A3742C7EB089D297F529D297F52'
// 若S/N="AF00-12345-0000-1234" , 则 outputsn='5D94F02772BF9C521E723D981E74F9391E74F939'
//
//下面省略。。。－－比较注册码生成串与所有的内部比较串（两百余个），若有其中一个内部比较串与
// 注册码生成串相同，则所输入的 S/N 正确。注册成功。

...
...

}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

----------------------------------【正文完】----------------------------------------------

----------------------------------【三、后记】--------------------------------------------

其实，并非只有 Tag&Rename 1.5/1.6/1.7 使用这个算法。SoftPointer 这个公司的另一个软件
Advanced Ra-Renamer v.1.1 （ 软件功能：修改Realplayer音乐文件(*.ra)的TAG ）也使用同一个算法，
是一摸一样的算法！！所不同的唯有“内部比较串”!!

另一个破解方法：我们只需要将众多内部比较串中的其中一个，改成我们自己的比较串，那么用
自己的SN 便能注册成功了！（然而，我怀疑会有几个人这样做。这毕竟有
点画蛇添足。既然要对程序本身作修改，改变跳转不是更加简单省事？？！）

----------------------------------【四、附录】--------------------------------------------
//（仅供参考）
//几个Tag&Rename1.5/1.6/1.7的内部比较串。1.7版本有两百余个比较串。（这里不按原顺序排列）
target_TAG[0] ="6BD7B460BF475A6B5415F1F97F19F2CD7F19F2CD"; //<=在程序的第一次比较，可以看到本串。
target_TAG[1] ="30FE82633BADBA6CFC08C0033DABE1E83DABE1E8";
target_TAG[2] ="E1E93D3A7BEF3F49B2A4AFC19A50F9B59A50F9B5";
target_TAG[3] ="603D7D9D717D8C9023A94720FC9345E0FC9345E0";
target_TAG[4] ="CD8816613549E28B2B12DB1D7B70DCF47B70DCF4";
target_TAG[5] ="458FC6FF176FAB84A09166ECA5D41EA5D41E"; //<=串长不一定是四十个字符！！
target_TAG[6] ="9298C14667EE91844C2E8AD8AA14FEF6AA14FEF6";
target_TAG[7] ="CEC148A772B83DE7C0E5F77EBA087B4EBA087B4";
target_TAG[8] ="A59469F69BBCF2E4276506C8E227368AE227368A";
target_TAG[9] ="EFF5E1F96337AAA215CA0F98E64DCE1DE64DCE1D";
target_TAG[10]="FA221E4FEC7662907D3BDE10A20B0074A20B0074";
target_TAG[11]="BFB419C3679775538D5B24282BD3FDA52BD3FDA5";
target_TAG[12]="A2F2A07D860EA1B2542236D87D317FE57D317FE5";
target_TAG[13]="9F5E527C3BA802D4AB41E6BD89F36EC189F36EC1";
target_TAG[14]="510718DA8965364AD3AFA44144D297044D2970";
target_TAG[15]="E296E8B3B6EC79FBBF686E98E8849A28E8849A2";

//几个RA-Renamer1.1 的内部比较串，约有 180 个比较串。
target_RA[0] ="728F0122AB2B16CBAF6BD4C7F3ACE41EF3ACE41E";
target_RA[1] ="5711D97055A3AA85DBB00844AC126969AC126969";
target_RA[2] ="D70BB2A0156DA6ED975853569B1741969B174196";

==========================================================================================
全文结束（有不对的地方，还望大家多多指正与包涵!）


Takagoraku v1.0

 标 题:Takagoraku v1.0 的破解，重新写了一边 (5千字)
发信人:lancelot
时 间:2001-8-14 23:36:40
详细信息:
一个小游戏，挺好玩的
下载 http://sd.onlinedown.net/down/takagoraku.exe

bpx getwindowtext 按 F10 一直到

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409034(C)
|
:00409019 8B45E4 mov eax, dword ptr [ebp-1C]
:0040901C 0FBE5405C0 movsx edx, byte ptr [ebp+eax-40]
:00409021 0155EC add dword ptr [ebp-14], edx<=累加用户名各字母的ASCII值
:00409024 FF45E4 inc [ebp-1C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409017(U)
|
:00409027 8D4DC0 lea ecx, dword ptr [ebp-40]
:0040902A 51 push ecx
:0040902B E8C0EB0200 call 00437BF0
:00409030 59 pop ecx
:00409031 3B45E4 cmp eax, dword ptr [ebp-1C]
:00409034 77E3 ja 00409019
:00409036 8B45E8 mov eax, dword ptr [ebp-18]<=注册码前6位的16进制值
:00409039 2B45EC sub eax, dword ptr [ebp-14]<=减去用户名的累加值
:0040903C 50 push eax<====================eax=0x69D55
:0040903D FF75F0 push [ebp-10]
:00409040 8B5508 mov edx, dword ptr [ebp+08]
:00409043 FF7219 push [edx+19]
:00409046 E8AC680000 call 0040F8F7<==============核心计算，跟进去

=====================================================================================
用户名：lancelot==>6C+61+6E+63+65+6C+6F+74=0x0352
注册码：434343=0x6A0A7
0x6A0A7-0x0352=0x69D55
=====================================================================================

* Referenced by a CALL at Addresses:
|:00408024 , :00409046 , :0040F40C
|
:0040F8F7 55 push ebp
:0040F8F8 8BEC mov ebp, esp
:0040F8FA 83C4F4 add esp, FFFFFFF4
:0040F8FD 8B4510 mov eax, dword ptr [ebp+10]<====eax=0x69D55
:0040F900 83C005 add eax, 00000005<==============eax=0x69D5A
:0040F903 6BC064 imul eax, 00000064<=============eax=0x02957728
:0040F906 0532FFFFFF add eax, FFFFFF32<==============eax=0x0295765A
:0040F90B B91B000000 mov ecx, 0000001B
:0040F910 99 cdq
:0040F911 F7F9 idiv ecx<=======================eax=0x187FA4
:0040F913 83C038 add eax, 00000038<==============eax=0x187FDC
:0040F916 8D04C0 lea eax, dword ptr [eax+8*eax]<=eax=0xDC7EBC
:0040F919 8945F4 mov dword ptr [ebp-0C], eax
:0040F91C DB45F4 fild dword ptr [ebp-0C]<========14450364
:0040F91F D95DFC fstp dword ptr [ebp-04]
:0040F922 8B450C mov eax, dword ptr [ebp+0C]<====eax=0x3B77A183
:0040F925 83C0FB add eax, FFFFFFFB<==============eax=0x3B77A17E
:0040F928 B964000000 mov ecx, 00000064
:0040F92D 99 cdq
:0040F92E F7F9 idiv ecx<=======================eax=0x983C7E
:0040F930 05CE000000 add eax, 000000CE<==============eax=0x983D4C
:0040F935 8D0440 lea eax, dword ptr [eax+2*eax]<=eax=0x1C8B7E4
:0040F938 8D04C0 lea eax, dword ptr [eax+8*eax]<=eax=0x100E7704
:0040F93B 83C0C8 add eax, FFFFFFC8<==============eax=0x100E76CC
:0040F93E B909000000 mov ecx, 00000009
:0040F943 99 cdq
:0040F944 F7F9 idiv ecx<=======================eax=0x1C8B7DD
:0040F946 8945F4 mov dword ptr [ebp-0C], eax
:0040F949 DB45F4 fild dword ptr [ebp-0C]<========29931485
:0040F94C D95DF8 fstp dword ptr [ebp-08]
:0040F94F D945F8 fld dword ptr [ebp-08]
:0040F952 D8257BF94000 fsub dword ptr [0040F97B]
:0040F958 D85DFC fcomp dword ptr [ebp-04]
:0040F95B DFE0 fstsw ax
:0040F95D 9E sahf
:0040F95E 7715 ja 0040F975
:0040F960 D945F8 fld dword ptr [ebp-08]
:0040F963 D8057BF94000 fadd dword ptr [0040F97B]
:0040F969 D85DFC fcomp dword ptr [ebp-04]
:0040F96C DFE0 fstsw ax
:0040F96E 9E sahf
:0040F96F 7204 jb 0040F975<===================不能跳
:0040F971 B001 mov al, 01
:0040F973 EB02 jmp 0040F977

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040F95E(C), :0040F96F(C)
|
:0040F975 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F973(U)
|
:0040F977 8BE5 mov esp, ebp
:0040F979 5D pop ebp
:0040F97A C3 ret

============================================================================================
程序将0x69D55和0x3B77A183分别进行一序列运算后的值相比较，
因此，我这样算：
0x3B77A183-5==0x3B77A17E
0x3B77A17E/0x64==0x983C7E
0x983C7E+0xCE==0x983D4C
0x983D4C*3==0x1C8B7E4
0x1C8B7E4*9==0x100E7704
0x100E7704-0x38==0x100E76CC
0x100E76CC/9==0x1C8B7DD<===========这是浮点运算前的值，我们略过浮点运算看行不行

0x1C8B7DD/9==0x32BF18<=============开始逆运算
0x32BF18-0x38==0x32BEE0
0x32BEE0*0x1B==0x55A21A0
0x55A21A0+0xCE==0x55A226E
0x55A226E/0x64==0xDB38B
0xDB38B-5==0xDB386
0xDB386+0x352==0xDB6D8==898776<=======bingo!!! 这就是注册码啦!!

感谢小楼和6767[BCG]的帮助,由于程序重新安装后仍然是已注册版本，所以无法验证浮点运算部分了。

Crack by lancelot 2001.08.14


Talisman 1.76

 标 题:找一个软柿子：注册Talisman 1.76 (6千字)
发信人:6767[BCG]
时 间:2001-8-16 1:42:22
详细信息:
注册Talisman
by Fpc[CCG] & 6767[BCG]

tools: Trw2000, Wdasm
level: 1/5

软件名称：Talisman
整理日期：2001.8.15
最新版本：1.76
文件大小：2278KB
软件授权：共享软件
使用平台：Win9x/Me/NT/2000
发布公司：Home Page
软件简介：这是一套可将Windows的桌面环境改变成宛如置身多媒体光碟环境的软件，内建以Themes为主轴，可加入按钮、图片等来当成捷径且可有如JAVA按钮的效果，也可用程序本身的Icon文件来使用，另可编辑图片的变化模式，让您的桌面环境更眩、更美。
下 载：http://gt.onlinedown.net/down/talisman.zip

你可试试这个小东东，使你的桌面变漂亮起来，注册很简单，下面是过程：

这一段代码是你按“register”后程序会作的。在左下角的开始项选“关于和注册”，输入你的信息，到Trw200中下bpx hmemcpy。回来，按注册，被中断。打命令Pmoudle，不过你还需要按几次F12才能返回到主线中来：

[Begin]

:0047AB28 55 push ebp
:0047AB29 8BEC mov ebp, esp

... ...

:0047AB45 8D55F4 lea edx, dword ptr [ebp-0C] <- 缓冲区了
:0047AB48 8B83E0020000 mov eax, dword ptr [ebx+000002E0] <- 这个是注册码的编辑框
:0047AB4E E84903FBFF call 0042AE9C <- 这个call是读取编辑框的内容，下面会几次用到

:0047AB53 837DF400 cmp dword ptr [ebp-0C], 00000000 <- 是否有输入
:0047AB57 0F8460010000 je 0047ACBD <- 没有就跳走。小经验：当你发现跳转比较远时，通常是跳向错误的地方；
<- 而且你可根据跳转距离的长短大致判断出程序代码的强度，这个就不会太强。
:0047AB5D 8D55F0 lea edx, dword ptr [ebp-10]
:0047AB60 8B83E4020000 mov eax, dword ptr [ebx+000002E4] <- 这个是名字
:0047AB66 E83103FBFF call 0042AE9C

:0047AB6B 837DF000 cmp dword ptr [ebp-10], 00000000 <- 是否输入名字
:0047AB6F 0F8448010000 je 0047ACBD

:0047AB75 8D55F4 lea edx, dword ptr [ebp-0C]
:0047AB78 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:0047AB7E E81903FBFF call 0042AE9C <- 保险起见，它又读了一次注册码

:0047AB83 8B45F4 mov eax, dword ptr [ebp-0C]
:0047AB86 E82DD5F8FF call 004080B8 <- 这个我没有跟进去，根据上下的代码判断，这个可能是将输入的String变为Int。
:0047AB8B 8945EC mov dword ptr [ebp-14], eax <- 果然是，输入的：123654，返回：eax=0x1E306。运气，否则要跟进去作苦工了。

:0047AB8E DB45EC fild dword ptr [ebp-14] <- 装整数到浮点寄存器st(0)，如果用softice看的清楚些
:0047AB91 E8D67DF8FF call 0040296C

>>>>>>>>
|
:0040296C 83EC08 sub esp, 00000008
:0040296F DF3C24 fistp qword ptr [esp] <- st(0)内容到[esp]
:00402972 9B wait
:00402973 58 pop eax <- 结果保存到eax
:00402974 5A pop edx <- 保持堆栈平衡，没别的用处
:00402975 C3 ret
<<<<<<<<

:0047AB96 8945FC mov dword ptr [ebp-04], eax <- 保存结果到这里

:0047AB99 8D55F8 lea edx, dword ptr [ebp-08]
:0047AB9C 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:0047ABA2 E8F502FBFF call 0042AE9C <- 读名字编辑框

:0047ABA7 33F6 xor esi, esi <- 使exi=0，下面有用到

:0047ABA9 8B45F8 mov eax, dword ptr [ebp-08]
:0047ABAC E80F91F8FF call 00403CC0 <- 上下文判断是取名字的长度，果然是(不是感觉敏锐，而是软件简单)

>>>>>>
|
:00403CC0 85C0 test eax, eax
:00403CC2 7403 je 00403CC7
:00403CC4 8B40FC mov eax, dword ptr [eax-04] <- 此处是字符串长度
|
:00403CC7 C3 ret
<<<<<<<

:0047ABB1 85C0 test eax, eax
:0047ABB3 7E13 jle 0047ABC8

:0047ABB5 BA01000000 mov edx, 00000001 <- edx=1，是个循环变量

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047ABC6(C) <- 这个小循环根据名字生成累加和
|
:0047ABBA 8B4DF8 mov ecx, dword ptr [ebp-08] <- ecx指向名字
:0047ABBD 0FB64C11FF movzx ecx, byte ptr [ecx+edx-01] <- 顺序取第i个字符
:0047ABC2 03F1 add esi, ecx <- 累加到esi
:0047ABC4 42 inc edx
:0047ABC5 48 dec eax
:0047ABC6 75F2 jne 0047ABBA <- 未完继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047ABB3(C)
|
:0047ABC8 8975EC mov dword ptr [ebp-14], esi <- 保存到这里
:0047ABCB DB45EC fild dword ptr [ebp-14] <- 还是装到st(0)
:0047ABCE E8997DF8FF call 0040296C <- 见上面
:0047ABD3 69C009030000 imul eax, 00000309 <- 累加和与0x309相乘
:0047ABD9 8BF0 mov esi, eax
:0047ABDB 3B75FC cmp esi, dword ptr [ebp-04] <- 与你输入的注册码比较，显然一致就成功，否则失败
:0047ABDE 0F85BF000000 jne 0047ACA3

:0047ABE4 B201 mov dl, 01

... ... 这段代码是保存注册码到注册表中，省略

:0047ACA1 EB1A jmp 0047ACBD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047ABDE(C)
|
:0047ACA3 B201 mov dl, 01
:0047ACA5 8B83FC020000 mov eax, dword ptr [ebx+000002FC]
:0047ACAB E80401FBFF call 0042ADB4
:0047ACB0 B201 mov dl, 01
:0047ACB2 8B8300030000 mov eax, dword ptr [ebx+00000300]
:0047ACB8 E80B01FDFF call 0044ADC8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047AB57(C), :0047AB6F(C), :0047ACA1(U)
|
:0047ACBD 33C0 xor eax, eax
:0047ACBF 5A pop edx
:0047ACC0 59 pop ecx
:0047ACC1 59 pop ecx
:0047ACC2 648910 mov dword ptr fs:[eax], edx
:0047ACC5 68EFAC4700 push 0047ACEF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047ACED(U)
|
:0047ACCA 8D45E8 lea eax, dword ptr [ebp-18]
:0047ACCD E8728DF8FF call 00403A44
:0047ACD2 8D45F0 lea eax, dword ptr [ebp-10]
:0047ACD5 BA02000000 mov edx, 00000002
:0047ACDA E8898DF8FF call 00403A68
:0047ACDF 8D45F8 lea eax, dword ptr [ebp-08]
:0047ACE2 E85D8DF8FF call 00403A44
:0047ACE7 C3 ret

:0047ACE8 E99387F8FF jmp 00403480
:0047ACED EBDB jmp 0047ACCA
:0047ACEF 5E pop esi
:0047ACF0 5B pop ebx
:0047ACF1 8BE5 mov esp, ebp
:0047ACF3 5D pop ebp
:0047ACF4 C3 ret <- 返回

注册机制：名字累加和 * 0x309，结果就是注册码。

作者可能是不指望用这个软件来赚钱，所以不作注册机。可用注册码：

Name:Fpc[CCG]
Code:520590

Name:6767[BCG]
Code:470862

注册表中位置：
REGEDIT4

[HKEY_CURRENT_USER\Software\Lighttek\Talisman]
"username"="YourName"
"usercode"=hex:EncryptData

标 题:贴它的注册机 (349字)
发信人:XF[BCG]
时 间:2001-8-16 9:36:04
详细信息:

 贴它的注册机

TC写的注册机，TCTURBOC 2.0下通过

main()
{int i;
long int sum=0;
char name[20];
printf("      Talisman 1.67 Keymaker\n  MakeBy: XF[BCG]
  http://bcggroup.longcity.net\n\n");
printf("Enter Your Name : ");
gets(name);
for (i=0;i<strlen(name);i++)
sum+=name;
printf("Your RegCode is : %ld\n\n",sum*0x309);
}


teleport pro 1.28

 标 题:《teleport pro 1.28》破解实录 ！！高手莫进！！ (5千字)
发信人:ratarice
时 间:2001-5-3 22:19:03
详细信息:
《teleport pro 1.28》破解实录
破解人：RATARICE
工具：W32DSM89，TRW1.22，ULTRAEDIT-32

一、运行teleport pro（下简称tp），点help-->register...
your:RATARICE
company:peNcil grOup
sn:87654321 （都是瞎填的）
点OK!记下“we're sorry!”
二、运行W32DSM89，找到上面的话!摘抄的程序在下！
:0040E3D5 E8F6D60000 call 0041BAD0
:0040E3DA 83C404 add esp, 00000004
:0040E3DD 3BC5 cmp eax, ebp
:0040E3DF 0F85B2000000 jne 0040E497
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------>909090909090
:0040E3E5 6AFF push FFFFFFFF
:0040E3E7 53 push ebx

* Possible Reference to String Resource ID=03022: "Thank you! Your copy of Teleport Pro is now registered. Al"
|
:0040E3E8 68CE0B0000 push 00000BCE
:0040E3ED E87C190500 call 0045FD6E
:0040E3F2 A18CA24800 mov eax, dword ptr [0048A28C]
:0040E3F7 8898A4020000 mov byte ptr [eax+000002A4], bl
:0040E3FD A18CA24800 mov eax, dword ptr [0048A28C]
:0040E402 8898A5020000 mov byte ptr [eax+000002A5], bl
:0040E408 391DC4114900 cmp dword ptr [004911C4], ebx
:0040E40E 740B je 0040E41B
:0040E410 A1C4114900 mov eax, dword ptr [004911C4]
:0040E415 8898520F0000 mov byte ptr [eax+00000F52], bl
.
.
.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E3DF(C)
^^^^^^^^
|
:0040E497 8B07 mov eax, dword ptr [edi]
:0040E499 8378F800 cmp dword ptr [eax-08], 00000000
:0040E49D 7513 jne 0040E4B2
:0040E49F 6A00 push 00000000
:0040E4A1 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"You must enter your username in "
->"the Name field, exactly as you "
->"spelled it when you registered, "
->"in order for the registration "
->"code to work."
|
:0040E4A3 688CB04800 push 0048B08C
:0040E4A8 E8A2180500 call 0045FD4F
:0040E4AD 5D pop ebp
:0040E4AE 5F pop edi
:0040E4AF 5E pop esi
:0040E4B0 5B pop ebx
:0040E4B1 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E49D(C)
^^^^^^^^
|
:0040E4B2 50 push eax
:0040E4B3 E818D60000 call 0041BAD0
:0040E4B8 83C404 add esp, 00000004
:0040E4BB 85C0 test eax, eax
:0040E4BD 7513 jne 0040E4D2
:0040E4BF 6A00 push 00000000
:0040E4C1 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"You haven't entered a valid username. "
->" Your username must be at least "
->"six letters long."
|
:0040E4C3 6834B04800 push 0048B034
:0040E4C8 E882180500 call 0045FD4F
:0040E4CD 5D pop ebp
:0040E4CE 5F pop edi
:0040E4CF 5E pop esi
:0040E4D0 5B pop ebx
:0040E4D1 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E4BD(C)
^^^^^^^^
|
:0040E4D2 6AFF push FFFFFFFF
:0040E4D4 6A00 push 00000000

* Possible Reference to String Resource ID=03023: "We're sorry! The registration number you entered appears to"
|
:0040E4D6 68CF0B0000 push 00000BCF
:0040E4DB E88E180500 call 0045FD6E
用ULTRAEDIT改完后，运行，提示“thank you...”，但下次运行时还需注册！
由于本人学艺不精，找不到标记点！又想将其注册为之己用，遂叫出TRW2000！
三、运行TRW2000，再运行TELEPORT，填好注册项目。
ctrl+N, bpx hmemcpy ,ctrl+N
点OK，弹出TRW，下bd *,pmodule,按3次F12（4次出错）。
按F10，下F9设断！程序如下：
015F:0040E397 FLD TWORD [EDX+01]
015F:0040E39A CALL 0045944B
015F:0040E39F PUSH BYTE +0A
015F:0040E3A1 MOV EAX,[ESI+DD]
015F:0040E3A7 PUSH EBX
015F:0040E3A8 PUSH EAX
015F:0040E3A9 CALL 00442800
015F:0040E3AE ADD ESP,BYTE +0C
015F:0040E3B1 MOV EBP,EAX
015F:0040E3B3 MOV EAX,[0048A28C]
015F:0040E3B8 CMP [EAX+02A4],BL
015F:0040E3BE JZ NEAR 0040E48B
015F:0040E3C4 TEST EBP,EBP
015F:0040E3C6 JZ NEAR 0040E48B
015F:0040E3CC LEA EDI,[ESI+D5]
015F:0040E3D2 MOV EAX,[EDI]
015F:0040E3D4 PUSH EAX
015F:0040E3D5 CALL 0041BAD0
015F:0040E3DA ADD ESP,BYTE +04
015F:0040E3DD CMP EAX,EBP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 下？eax 可看到真注册码
下？ebp 可看到假注册码
015F:0040E3DF JNZ NEAR 0040E497
015F:0040E3E5 PUSH BYTE -01
四、总结
1、 爆破法：将0F85B2000000——————————>909090909090 （但每次启动仍需注册）
2、 注册码：
本人的为：your: RATARICE
company: peNcil grOup
registration: 1156637346


Teleport pro 1.29.1590

 标 题:小妹无聊也来玩玩吧 (1千字)
发信人:crackawu
时 间:2001-7-1 2:15:27
详细信息:
作者：crackawu
对像：Teleport pro 1.29.1590
保护：注册码
工具: trw2000

乱输入
名称: mscrack
公司: msking
注册码: 789789

下断点 BPX HMEMCPY , F5 或 G 回到TELEPORT画面,确定,被中断后,, PMODULE 领空,按4下F12后会弹出错误对话框,所以只要按3次就可以.. 来到下面处

:00426905 8B87DD000000 mov eax, dword ptr [edi+000000DD] // d eax 可以看到自己输入的注册码 789789
:0042690B 33DB xor ebx, ebx
:0042690D 6A0A push 0000000A
:0042690F 53 push ebx
:00426910 50 push eax
:00426911 E85E690000 call 0042D274 // 此call把789789化成16进制C0D1D放入EAX中
:00426916 8B0DF8204800 mov ecx, dword ptr [004820F8]
:0042691C 83C40C add esp, 0000000C
:0042691F 8945E8 mov dword ptr [ebp-18], eax
:00426922 3899DB040000 cmp byte ptr [ecx+000004DB], bl
:00426928 0F8412020000 je 00426B40
:0042692E 3BC3 cmp eax, ebx

* Possible Reference to Dialog:
|
:00426930 BE00DA4700 mov esi, 0047DA00
:00426935 0F8406010000 je 00426A41
:0042693B FFB7D5000000 push dword ptr [edi+000000D5]
:00426941 E896090000 call 004272DC // 关键call , 上面已经把输入的注册码换算好,比较应该在这里面
:00426946 3945E8 cmp dword ptr [ebp-18], eax // [ebp-18] 里放的是 C0D1D , 那 eax 里的是什么呢 , 嘻嘻,,只 // 要把 eax 里的值换成10进制就可以注册成功

最后整理:

名称: mscrack
公司: msking
注册码: 764315353


TempClean 3.04

标 题:TempClean 3.04的破解 ---- http://crackerabc.longcity.net奉献 (2千字)
发信人:CrackerABC[BCG]
时 间:2001-4-17 14:41:48
详细信息:
TempClean 3.04的破解

作者：CrackerABC[BCG]
主页：http://crackerabc.longcity.net

软件下载URL http://software.wx88.net/down/tclean3.zip

随便输入注册信息：

Name：CrackerABC[BCG]
Code：3141592600

下面开始跟踪

1、启动TRW2000，然后下bpx hmemcpy中断，F5返回后点确定被拦截到TRW2000领域，下BD *中断所有断点。

2、pmodule，后开始按F10跟踪，下面是部分代码段：

.......
.......
0167:005636E6 LEA EDX,[EBP-08]
0167:005636E9 MOV EAX,[EBX+02DC]
0167:005636EF CALL 0052C054
0167:005636F4 MOV ECX,[EBP-08]
0167:005636F7 MOV EDX,[EBP-04]
0167:005636FA MOV EAX,EBX
0167:005636FC CALL 005637F4 ///－－－－关键比较F8跟进去！！否则必定失败！！
0167:00563701 TEST AL,AL
0167:00563703 JZ 0056371E
0167:00563872 MOV EAX,EBX
0167:00563874 CALL 00508350
0167:00563879 MOV EAX,[EBP-14]
0167:0056387C MOV ECX,03
0167:00563881 MOV EDX,01
0167:00563886 CALL 00503F60
0167:0056388B PUSH DWORD [EBP-10]
0167:0056388E LEA EAX,[EBP-1C]
0167:00563891 MOV EDX,[EBP-04]
0167:00563894 MOV DL,[EDX]
0167:00563896 CALL 00503C80
0167:0056389B MOV EAX,[EBP-1C]
0167:0056389E LEA EDX,[EBP-18]
0167:005638A1 CALL 005080AC
0167:005638A6 PUSH DWORD [EBP-18]
0167:005638A9 LEA EAX,[EBP-20]
0167:005638AC PUSH EAX
0167:005638AD LEA EDX,[EBP-24]
0167:005638B0 MOV EAX,EBX
0167:005638B2 CALL 00508350
0167:005638B7 MOV EAX,[EBP-24]
0167:005638BA MOV ECX,03
0167:005638BF MOV EDX,04
0167:005638C4 CALL 00503F60
0167:005638C9 PUSH DWORD [EBP-20]
0167:005638CC LEA EAX,[EBP-0C]
0167:005638CF MOV EDX,03
0167:005638D4 CALL 00503E18
0167:005638D9 LEA EAX,[EBP-0C]
0167:005638DC MOV ECX,[EBP-0C]
0167:005638DF MOV EDX,00563934
0167:005638E4 CALL 00503DA4
0167:005638E9 MOV EDX,[EBP-0C]
0167:005638EC MOV EAX,[EBP-08] ///--------->D EDX得到正确的注册码：TC3155C096
0167:005638EF CALL 00508124
0167:005638F4 TEST EAX,EAX

在跟进去以后在这个地方得到一个假注册码：
0167:00563850 MOV EDX,01
0167:00563855 MOV ECX,[EBP-04]
0167:00563858 MOVZX ECX,BYTE [ECX+EDX-01]
0167:0056385D ADD EBX,ECX
0167:0056385F INC EDX
0167:00563860 DEC EAX
0167:00563861 JNZ 00563855
0167:00563863 IMUL EAX,EBX,00126AC0
0167:00563869 MOV EBX,EAX
0167:0056386B LEA EAX,[EBP-10]
0167:0056386E PUSH EAX
0167:0056386F LEA EDX,[EBP-14]
0167:00563872 MOV EAX,EBX
0167:00563874 CALL 00508350
0167:00563879 MOV EAX,[EBP-14]
0167:0056387C MOV ECX,03 ///--------->D EAX得到假注册码：1550964160
0167:00563881 MOV EDX,01

继续跟踪，就到了上面的地方，可以拿到正确的注册码的。

可不要被他迷惑了哟。

3、整理注册成功。

注册信息位置：
[HKEY_LOCAL_MACHINE\Software\Alvilim\TempClean]
RegKey="TC3155C096"
RegName="CrackerABC[BCG]"

<-----完------->


Terminal Overdrive 2000

标 题:破Terminal Overdrive 2000 (TO2000) (7千字)
发信人:zest
时 间:2001-1-17 23:14:35
详细信息:
破Terminal Overdrive 2000 (TO2000)
如有雷同，纯属巧合！
忘了在哪下载，好像NEWHUA,YESKEY......
反正《电脑报》吹得响亮，大家可用搜索引擎查找。
TO2000.exe 933KB
难度：有点。
我用TRW2K1.03 demo不用1.23

我吹：
TO2000 is the worlds best internet accelerator and searching tool available. You will
also find that the TO2000 Connection Manager is unmatched in its ability to sustain the
fastest connections possible without the hassles associated with idle time outs.

此软件是用Delphi编写，用了很多第三方的控件。
分析注册表(regmon)后，得知注册信息保存在：

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\GMT
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\Tips
我的键值:
4u8h儎厗=kC>nqHDJEFGXHK枟槞MMMQOSRST￥ウZZZ^\`_`a氨渤f刀犯lnlqoorz|}媚牌|絸八掏嗡菲扔哉

两处的键值是完全一模一样的，这就相当于在其中的一处做了备份。
键值的内容是加密的，包括注册信息，难怪用W32DASM好像～～～～？$_*

Let's begin:

运行TO2000，对其任务栏图标点右键，点UNLOCK。
我的SERIAL NUMBER为627120875
NAME填上zest
COMPANY NAME不填
UNLOCK CODE填9876543210abcdef（一定要>=14位，我原取10位，浪费3天时间跟踪，你可试试，详见下）
点击OK，一点鸟叫都没有。
s 0 -1 '9876543210abcdef'
bpm 8068ac92（你的可能不同）
F5
bd
bpm es:0
F5
bd
到：

（在SHRLK21.DLL中）

0167:004F767D MOV AL,[EDX]
0167:004F767F CMP AL,61 ==>这里，小写字母变大写
0167:004F7681 JB 004F7689
0167:004F7683 CMP AL,7A
0167:004F7685 JA 004F7689
0167:004F7687 SUB AL,20
0167:004F7689 MOV [ESI],AL
0167:004F768B INC EDX
0167:004F768C INC ESI
0167:004F768D DEC EBX
0167:004F768E TEST EBX,EBX
0167:004F7690 JNZ 004F767D
0167:004F7692 POP EDI
0167:004F7693 POP ESI
0167:004F7694 POP EBX
0167:004F7695 RET ==>RET后,到：00534dfe

0167:00534DE5 E80EEDFBFF CALL 004F3AF8
0167:00534DEA 83F80E CMP EAX,0000000E ==>比较UNLOCK CODE位数>=14
0167:00534DED 0F8CEA000000 JL 00534EDD ==>跳bye!
0167:00534DF3 8D55E8 LEA EDX,[EBP-18]
0167:00534DF6 8B45FC MOV EAX,[EBP-04]
0167:00534DF9 E85E28FCFF CALL 004F765C ==>此CALL变大写
0167:00534DFE 8B55E8 MOV EDX,[EBP-18] ==>RET后到此
0167:00534E01 8D45FC LEA EAX,[EBP-04] ==>d edx=9876543210ABCDEF
0167:00534E04 E80BEBFBFF CALL 004F3914
0167:00534E09 8B45FC MOV EAX,[EBP-04]
0167:00534E0C 8A5801 MOV BL,[EAX+01] ==>取第二位8
0167:00534E0F 8B45FC MOV EAX,[EBP-04]
0167:00534E12 8A4004 MOV AL,[EAX+04] ==>取第五位5
0167:00534E15 8845EF MOV [EBP-11],AL
0167:00534E18 8B45FC MOV EAX,[EBP-04]
0167:00534E1B 8A4005 MOV AL,[EAX+05] ==>取第六位4
0167:00534E1E 8845EE MOV [EBP-12],AL
0167:00534E21 8D45FC LEA EAX,[EBP-04]
0167:00534E24 B901000000 MOV ECX,00000001
0167:00534E29 BA02000000 MOV EDX,00000002
0167:00534E2E E809EFFBFF CALL 004F3D3C
0167:00534E33 8D45FC LEA EAX,[EBP-04] ==>976543210ABCDEF
0167:00534E36 B901000000 MOV ECX,00000001
0167:00534E3B BA04000000 MOV EDX,00000004
0167:00534E40 E8F7EEFBFF CALL 004F3D3C
0167:00534E45 8D45FC LEA EAX,[EBP-04] ==>9763210ABCDEF
0167:00534E48 B901000000 MOV ECX,00000001
0167:00534E4D BA04000000 MOV EDX,00000004
0167:00534E52 E8E5EEFBFF CALL 004F3D3C
0167:00534E57 33C0 XOR EAX,EAX
0167:00534E59 8AC3 MOV AL,BL ==>8 （必须为A）
0167:00534E5B 83E841 SUB EAX,00000041
0167:00534E5E 6BC01A IMUL EAX,EAX,0000001A
0167:00534E61 33D2 XOR EDX,EDX
0167:00534E63 8A55EF MOV DL,[EBP-11] ==>5 （必须为A）
0167:00534E66 83EA41 SUB EDX,00000041
0167:00534E69 03C2 ADD EAX,EDX ==>+,必须为0,见下534ecc
0167:00534E6B 8B5508 MOV EDX,[EBP+08]
0167:00534E6E 8902 MOV [EDX],EAX ==>0存入77f918
0167:00534E70 33DB XOR EBX,EBX
0167:00534E72 8D55F0 LEA EDX,[EBP-10]
0167:00534E75 A174A85300 MOV EAX,[0053A874]
0167:00534E7A E8DD27FCFF CALL 004F765C
0167:00534E7F 8B45F0 MOV EAX,[EBP-10]
0167:00534E82 E871ECFBFF CALL 004F3AF8
0167:00534E87 85C0 TEST EAX,EAX
0167:00534E89 7E13 JLE 00534E9E
0167:00534E8B BA01000000 MOV EDX,00000001
0167:00534E90 8B4DF0 MOV ECX,[EBP-10] ==>A9B9C5
0167:00534E93 0FB64C11FF MOVZX ECX,Byte Ptr [ECX+1*EDX-01]
0167:00534E98 03D9 ADD EBX,ECX
0167:00534E9A 42 INC EDX
0167:00534E9B 48 DEC EAX
0167:00534E9C 75F2 JNZ 00534E90
0167:00534E9E 8D55E4 LEA EDX,[EBP-1C]
0167:00534EA1 8B45F8 MOV EAX,[EBP-08] ==>MY SERIAL NUMBER 627120875
0167:00534EA4 E8B327FCFF CALL 004F765C
0167:00534EA9 8B45E4 MOV EAX,[EBP-1C]
0167:00534EAC 8D4DE8 LEA ECX,[EBP-18]
0167:00534EAF 8BD3 MOV EDX,EBX
0167:00534EB1 E8BA070000 CALL 00535670 ==>计算
0167:00534EB6 8B55E8 MOV EDX,[EBP-18] ==>482949333C24 OK！
0167:00534EB9 8B45FC MOV EAX,[EBP-04] ==>9763210ABCDEF
0167:00534EBC E847EDFBFF CALL 004F3C08 ==>对比CALL，你可知MACU......
0167:00534EC1 7506 JNZ 00534EC9 ==>no!no!!
0167:00534EC3 8B45F4 MOV EAX,[EBP-0C]
0167:00534EC6 C60001 MOV Byte Ptr [EAX],01 ==>ok!!
0167:00534EC9 8B4508 MOV EAX,[EBP+08]
0167:00534ECC 833800 CMP DWord Ptr [EAX],00000000 ==>77f918之值必须为0,why?见下
0167:00534ECF 750C JNZ 00534EDD ==>&*^%$#@###ZZZzzz?
0167:00534ED1 807DEE43 CMP Byte Ptr [EBP-12],43 ==>第六位4必须为C
0167:00534ED5 7406 JZ 00534EDD ==>yes,jump!!!
0167:00534ED7 8B45F4 MOV EAX,[EBP-0C]
0167:00534EDA C60000 MOV Byte Ptr [EAX],00 ==>don't come here
0167:00534EDD 33C0 XOR EAX,EAX
0167:00534EDF 5A POP EDX
0167:00534EE0 59 POP ECX
0167:00534EE1 59 POP ECX
0167:00534EE2 648910 MOV FS:[EAX],EDX
0167:00534EE5 68144F5300 PUSH 00534F14
0167:00534EEA 8D45E4 LEA EAX,[EBP-1C]
0167:00534EED BA02000000 MOV EDX,00000002
0167:00534EF2 E8A9E9FBFF CALL 004F38A0
0167:00534EF7 8D45F0 LEA EAX,[EBP-10]
0167:00534EFA E87DE9FBFF CALL 004F387C
0167:00534EFF 8D45F8 LEA EAX,[EBP-08]
0167:00534F02 BA02000000 MOV EDX,00000002
0167:00534F07 E894E9FBFF CALL 004F38A0
0167:00534F0C C3 RET

bpm 77f918看看
F5

0167:00534C87 CMP DWord Ptr [EBP-14],00000000 ==>还有比较!所以必须为0!
0167:00534C8B JNZ 00534CA5 ==>don't jump!
0167:00534C8D MOV ECX,[EBP-0C]
0167:00534C90 MOV EDX,[EBP-08]
0167:00534C93 MOV EAX,[EBP-04]
0167:00534C96 CALL 00534FA8 ==>thank you......
0167:00534C9B CALL 00535258
0167:00534CA0 JMP 00534D2C
0167:00534CA5 CALL 00534F1C
0167:00534CAA TEST AL,AL
0167:00534CAC JNZ 00534CD9

所以my UNLOCK CODE：
9876543210abcdef
^ ^^
4a82ac949333c24 oooooook!!!!!!!!

TO2000======>TO2000 PRO 省MONEY $19.95 US。

附：用到SHRLK21.DLL的程序比较广，如CLEANTIDY，WEBZIP(SHRLK20.DLL)??等等


Terrapin FTP Browser 2.2

 标 题:菜鸟破解实录 之Terrapin FTP Browser (5千字)
发信人:xiA Qin
时 间:2000-9-9 21:28:21
详细信息:
菜鸟破解实录 之Terrapin FTP Browser

软件名称：Terrapin FTP Browser
软件版本：2.2
软件大小：1.4MB
软件简介：
如果你拥有自己的主页或是希望更迅速有效地浏览远程的FTP站点，Terrapin FTP Browser应该是你的理想选择，Terrapin FTP Browser的操作非常简单，和Windows的资源管理器一样可以任意拖拽文件，你还可以从Windows的资源管理器或桌面上直接将文件拖进Terrapin FTP Browser的窗口进行上传。它支持整个子目录的上传，这对于网站维护者来说是非常有用的。Terrapin FTP Browser还支持离线浏览并能够保存访问过的站点的目录与结构，而且当你再次访问一个站点时，它会将保存的信息与该站点的文件比较，如果某些文件发生了改变，它会用一个特殊的图标进行标识，以提醒你该文件已经更新。Terrapin FTP Browser的另一个不同寻常的功能是可以在两个远程电脑中进行传输，这对于软件站点的Webmaster来说是一个多么好的特性啊，因为用它可以轻松地将国外站点的软件拉到国内的服务器中，省去了下载、上传所耗费的时间与金钱。除了上述功能外，Terrapin FTP Browser同样也具有其他优秀的FTP软件的大多数功能。......

作 者：xiA Qin
解密日前：2000年9月5日
解密工具：Trw2000 1.22

说 明：本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

输入注册信息：
注册 码：11111-222222-33333

注：为了方便说明，分为2段。
第1段为：11111
第2段为：22222
第3段为：33333

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令

015F:00449561 LEA EAX,[EBP-4C]
015F:00449564 PUSH EAX
015F:00449565 CALL 0043E7D8 //有问题，按F8进入。
015F:0044956A ADD ESP,BYTE +04
015F:0044956D TEST EAX,EAX //用eax当旗标，eax=1注册成功。
015F:0044956F JNZ 004495AD
015F:00449571 PUSH BYTE +00
015F:00449573 PUSH BYTE +00
015F:00449575 PUSH DWORD 004D5653
015F:0044957A CALL 00499F40 //注册失败
015F:0044957F MOV DWORD [EBP-04],00
015F:00449586 LEA ECX,[EBP-4C]
015F:00449589 CALL 004A9BAC
015F:0044958E MOV DWORD [EBP-04],FFFFFFFF
015F:00449595 LEA ECX,[EBP-58]
015F:00449598 CALL 004A9BAC
015F:0044959D XOR EAX,EAX
015F:0044959F MOV ECX,[EBP-0C]
015F:004495A2 MOV [FS:00],ECX
015F:004495A9 MOV ESP,EBP
015F:004495AB POP EBP
015F:004495AC RET

...................
015F:0043E7DB PUSH BYTE -01
015F:0043E7DD PUSH DWORD 0043E9D5
015F:0043E7E2 MOV EAX,[FS:00]
015F:0043E7E8 PUSH EAX
015F:0043E7E9 MOV [FS:00],ESP
015F:0043E7F0 SUB ESP,BYTE +08
015F:0043E7F3 SUB ESP,BYTE +58
015F:0043E7F6 PUSH EBX
015F:0043E7F7 PUSH ESI
015F:0043E7F8 PUSH EDI
015F:0043E7F9 MOV EAX,[EBP+08]
015F:0043E7FC CMP DWORD [EAX+04],BYTE +0F //检查输入的注册码位数，15位。
015F:0043E800 JNZ 0043E87A //不相等，就跳。
015F:0043E802 MOV EBX,[004D337C]
015F:0043E808 PUSH DWORD [004D337C]
015F:0043E80E CALL 0047E428
015F:0043E813 ADD ESP,BYTE +04
015F:0043E816 TEST EAX,EAX
015F:0043E818 JZ NEAR 0043E89F
015F:0043E81E PUSH BYTE +05
015F:0043E820 LEA ECX,[EBP-6C]
015F:0043E823 PUSH ECX
015F:0043E824 MOV ECX,[EBP+08]
015F:0043E827 CALL 004B5758
. . . .
. . . .
. . . .

015F:0043E8A5 MOV ECX,[EBP+08]
015F:0043E8A8 CALL 004B5758
015F:0043E8AD MOV DWORD [EBP-04],02
015F:0043E8B4 PUSH EAX
015F:0043E8B5 LEA ECX,[EBP-3C]
015F:0043E8B8 CALL 004A9B34
015F:0043E8BD MOV DWORD [EBP-04],03
015F:0043E8C4 PUSH EAX
015F:0043E8C5 LEA EAX,[EBP-54]
015F:0043E8C8 PUSH EAX
015F:0043E8C9 CALL 0043E9DF //根据11111计算正确的注册码。按F8进入。
015F:0043E8CE MOV DWORD [EBP-04],04 都是浮点指令,我看不懂。
015F:0043E8D5 PUSH BYTE +09
015F:0043E8D7 LEA EAX,[EBP-30]
015F:0043E8DA PUSH EAX
015F:0043E8DB LEA ECX,[EBP-54] //正确的注册码 D EBP-54
015F:0043E8DE CALL 004B56EC
015F:0043E8E3 MOV DWORD [EBP-04],05
015F:0043E8EA MOV [EBP-18],EAX
015F:0043E8ED PUSH BYTE +09
015F:0043E8EF LEA ECX,[EBP-24]
015F:0043E8F2 PUSH ECX
015F:0043E8F3 MOV ECX,[EBP+08]
015F:0043E8F6 CALL 004B56EC
015F:0043E8FB MOV DWORD [EBP-04],06
015F:0043E902 PUSH DWORD [EAX]
015F:0043E904 MOV EAX,[EBP-18]
015F:0043E907 PUSH DWORD [EAX]
015F:0043E909 CALL 0047DFC8 //比较注册码CAll。
015F:0043E90E ADD ESP,BYTE +08
015F:0043E911 TEST EAX,EAX
015F:0043E913 JNZ 0043E924
015F:0043E915 PUSH BYTE +2D
015F:0043E917 LEA ECX,[EBP-54]
015F:0043E91A CALL 004AA044
015F:0043E91F CMP EAX,BYTE -01
015F:0043E922 JZ 0043E928
015F:0043E924 XOR EBX,EBX
015F:0043E926 JMP SHORT 0043E92D
015F:0043E928 MOV EBX,01
015F:0043E92D MOV DWORD [EBP-04],05
015F:0043E934 LEA ECX,[EBP-24]
015F:0043E937 CALL 004A9BAC
015F:0043E93C MOV DWORD [EBP-04],04
015F:0043E943 LEA ECX,[EBP-30]
015F:0043E946 CALL 004A9BAC
015F:0043E94B ADD ESP,BYTE +08
015F:0043E94E TEST EBX,EBX
015F:0043E950 JZ 0043E995
015F:0043E952 MOV DWORD [EBP-04],07
015F:0043E959 LEA ECX,[EBP-3C]
015F:0043E95C CALL 004A9BAC
015F:0043E961 MOV DWORD [EBP-04],08
015F:0043E968 LEA ECX,[EBP-48]
015F:0043E96B CALL 004A9BAC
015F:0043E970 MOV DWORD [EBP-04],FFFFFFFF
015F:0043E977 LEA ECX,[EBP-54]
015F:0043E97A CALL 004A9BAC
015F:0043E97F MOV EAX,01 <--将EAX赋值为1
015F:0043E984 MOV ECX,[EBP-0C]
015F:0043E987 MOV [FS:00],ECX
015F:0043E98E POP EDI
015F:0043E98F POP ESI
015F:0043E990 POP EBX
015F:0043E991 MOV ESP,EBP
015F:0043E993 POP EBP
015F:0043E994 RET

整理一下：
注册码：11111-1PAR3-23C89


The JPEG Wizard 1.40

标 题:The JPEG Wizard 1.40破解 (4千字)
发信人:bnbnf
时 间:2001-2-1 2:21:23
详细信息:

软件名称：The JPEG Wizard
整理日期：2000.8.1
最新版本：1.40
文件大小：2031KB
软件授权：共享软件
使用平台：Win95/98/NT
发布公司：Home Page
下载地址：http://newhua.centurytop.net/search.asp?Keyword=JPEG+Wizard
软件简介：
    一套所视即所得的图片压缩与编辑软件，可依个人喜好先将图片利用本身的编辑功能做对比和明亮度调整，增加文字到图片功能，再将图片在不牺牲影像品质状况下压缩减肥，同时也提供备份图片功能，支持的图形文件包括BMP，DIB，JPG，JIFKQP，PCX，PIC，PNG，TGA，TIF等等。
NAME：LINUX
CODE：12345678
1）按CTRL+D呼出SOFTICE后输入BPX HMEMCPY。按F5回到注册画面点OK，又拦住了
2）在SOFTICE中下BD*
3）按了大约13下F12后就跳出那个错误窗口了
4）重复1-2，这次按了12下F12来到这里
:004DDAE9 E8165BF4FF call 00423604
:004DDAEE 8B45F0 mov eax, dword ptr [ebp-10]----------------------------12下F12来到这里
:004DDAF1 8D55F4 lea edx, dword ptr [ebp-0C]
:004DDAF4 E81BA9F2FF call 00408414
:004DDAF9 FF75F4 push [ebp-0C]
:004DDAFC FF3520A35500 push dword ptr [0055A320]
:004DDB02 FF3524A35500 push dword ptr [0055A324]
:004DDB08 FF3528A35500 push dword ptr [0055A328]
:004DDB0E 8D45FC lea eax, dword ptr [ebp-04]
:004DDB11 BA04000000 mov edx, 00000004
:004DDB16 E8C964F2FF call 00403FE4
:004DDB1B 8B45FC mov eax, dword ptr [ebp-04]
:004DDB1E E885FEFFFF call 004DD9A8
:004DDB23 8D55F8 lea edx, dword ptr [ebp-08]
:004DDB26 A11CA35500 mov eax, dword ptr [0055A31C]
:004DDB2B E864AAF2FF call 00408594
:004DDB30 8D55F0 lea edx, dword ptr [ebp-10]
:004DDB33 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:004DDB39 E8C65AF4FF call 00423604
:004DDB3E 8B45F0 mov eax, dword ptr [ebp-10]
:004DDB41 8D55F4 lea edx, dword ptr [ebp-0C]
:004DDB44 E8CBA8F2FF call 00408414
:004DDB49 8B55F4 mov edx, dword ptr [ebp-0C]
:004DDB4C 8B45F8 mov eax, dword ptr [ebp-08]
:004DDB4F E8E064F2FF call 00404034-------------------------------------------这个CALL是比较的地方，按F8进去
:004DDB54 0F859B010000 jne 004DDCF5
:004DDB5A C60504A3550001 mov byte ptr [0055A304], 01
:004DDB61 BAF4FFFFFF mov edx, FFFFFFF4
:004DDB66 8B8324020000 mov eax, dword ptr [ebx+00000224]
:004DDB6C E8DF54F4FF call 00423050
:004DDB71 BA7E000000 mov edx, 0000007E
:004DDB76 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:004DDB7C E80F55F4FF call 00423090
:004DDB81 B201 mov dl, 01
:004DDB83 8B83E8010000 mov eax, dword ptr [ebx+000001E8]
:004DDB89 E8DEB2F5FF call 00438E6C
:004DDB8E B201 mov dl, 01
:004DDB90 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:004DDB96 E8D1B2F5FF call 00438E6C
:004DDB9B BA0F000080 mov edx, 8000000F
:004DDBA0 8B83E8010000 mov eax, dword ptr [ebx+000001E8]
:004DDBA6 E8AD5BF4FF call 00423758
:004DDBAB BA0F000080 mov edx, 8000000F
:004DDBB0 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:004DDBB6 E89D5BF4FF call 00423758
:004DDBBB 33C9 xor ecx, ecx
:004DDBBD B201 mov dl, 01

:00404034 53 push ebx----------------------------------从上面的CALL来到这里
:00404035 56 push esi
:00404036 57 push edi
:00404037 89C6 mov esi, eax 这些东西很典型，不用多说了吧
:00404039 89D7 mov edi, edx
:0040403B 39D0 cmp eax, edx--------------------------在这里下D看看两个寄存器里装着些什么
:0040403D 0F848F000000 je 004040D2
:00404043 85F6 test esi, esi
:00404045 7468 je 004040AF
:00404047 85FF test edi, edi
:00404049 746B je 004040B6
:0040404B 8B46FC mov eax, dword ptr [esi-04]
:0040404E 8B57FC mov edx, dword ptr [edi-04]
:00404051 29D0 sub eax, edx
:00404053 7702 ja 00404057
:00404055 01C2 add edx, eax

这个东西没什么好说的，初学者下载来玩玩


ThemeFreak 1.6

标 题:THEMEFREAK (4千字)
发信人:bnbnf
时 间:2001-3-31 10:20:33
详细信息:
软件名称：ThemeFreak
整理日期：2001.3.4
最新版本：1.6
文件大小：1755KB
软件授权：共享软件
使用平台：Win95/98/NT
发布公司：Home Page
下载地址：http://www.newhua.com/THEMEFREAK.HTM
软件简介：
    让你轻松制作布景主题的工具、使用真是简单顺手，完全一步一步的建立起自己喜欢的布景，从布景名称、屏幕保护、桌布、图示、声音、游标、背景配色、开关机LOGO等、只需先收集好、然后逐项的选用即可完成自己的作品，且可预设存放路径喔！

* Reference To: user32.CallWindowProcA, Ord:0000h
|
:00436946 E88902FDFF Call 00406BD4
:0043694B 89430C mov dword ptr [ebx+0C], eax-------------下PMODULE指令后来到这里。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004368EE(U), :0043692D(U)
|
:0043694E 8B03 mov eax, dword ptr [ebx]
:00436950 83F80C cmp eax, 0000000C
:00436953 751B jne 00436970-----------------这里有跳转
***********************************************************
在00436953处跳转后一直走，走过好几个RET后要注意了
***********************************************************
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004A1FED(C), :004A2016(C)
|
:004A205C 33C0 xor eax, eax
:004A205E 55 push ebp-------------------------从这里开始要注意了
:004A205F 6821224A00 push 004A2221
:004A2064 64FF30 push dword ptr fs:[eax]
:004A2067 648920 mov dword ptr fs:[eax], esp
:004A206A 8D55FC lea edx, dword ptr [ebp-04]
:004A206D 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004A2073 E8F40AF9FF call 00432B6C
:004A2078 8B45FC mov eax, dword ptr [ebp-04]
:004A207B E8601DF6FF call 00403DE0
:004A2080 83F808 cmp eax, 00000008----------------它会在这里比较你输入的注册是否等于8个字符
:004A2083 7D0F jge 004A2094---------------------大于等于的话就跳到004A2094处做下轮的比较，
:004A2085 B838224A00 mov eax, 004A2238 我输入的注册名linux是5个字符当然没戏唱了，
:004A208A E8AD5AFBFF call 00457B3C 所以要重新输入一遍。
:004A208F E95D010000 jmp 004A21F1

******************************************************************************

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A2083(C)
|
:004A2094 8D55F8 lea edx, dword ptr [ebp-08]----------条件合理的话来到这里
:004A2097 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004A209D E8CA0AF9FF call 00432B6C
:004A20A2 8B55F8 mov edx, dword ptr [ebp-08]
:004A20A5 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:004A20AB 83C024 add eax, 00000024
:004A20AE E8011BF6FF call 00403BB4
:004A20B3 8D55F4 lea edx, dword ptr [ebp-0C]
:004A20B6 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004A20BC E8AB0AF9FF call 00432B6C
:004A20C1 8B45F4 mov eax, dword ptr [ebp-0C]
:004A20C4 50 push eax
:004A20C5 8D55F0 lea edx, dword ptr [ebp-10]
:004A20C8 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:004A20CE E81191FEFF call 0048B1E4---------------------在这里算注册码，有兴趣进入算算它的注册算法
:004A20D3 8B55F0 mov edx, dword ptr [ebp-10]------结果出来了
:004A20D6 58 pop eax-------------------------保存，一会在下一个CALL比较
:004A20D7 E8141EF6FF call 00403EF0---------------------比较的CALL
:004A20DC 0F8505010000 jne 004A21E7----------------------注册码相等吗？
:004A20E2 B201 mov dl, 01------------------------****
:004A20E4 A158854600 mov eax, dword ptr [00468558]
:004A20E9 E86A65FCFF call 00468658
:004A20EE 8BF0 mov esi, eax
:004A20F0 BA02000080 mov edx, 80000002
:004A20F5 8BC6 mov eax, esi
:004A20F7 E8FC65FCFF call 004686F8
:004A20FC B101 mov cl, 01

****************************************************************************


ThemeFreak V1.6

标 题:ThemeFreak V1.6破解 (8千字)
发信人:1212
时 间:2001-3-7 7:33:46
详细信息:
软件名：ThemeFreak V1.6(桌面屏保）
下载：URL ftp://ftp.cq.ilike.myrice.com/soft/soft_desktool/TFreak.exe
限制：不注册只能用十天
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A2E25(C)
|
:004A2E94 33C0 xor eax, eax
:004A2E96 55 push ebp
:004A2E97 6859304A00 push 004A3059
:004A2E9C 64FF30 push dword ptr fs:[eax]
:004A2E9F 648920 mov dword ptr fs:[eax], esp
:004A2EA2 8D55FC lea edx, dword ptr [ebp-04]
:004A2EA5 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004A2EAB E878FFF8FF call 00432E28
:004A2EB0 8B45FC mov eax, dword ptr [ebp-04]
:004A2EB3 E80C10F6FF call 00403EC4
:004A2EB8 83F808 cmp eax, 00000008 <-----比较注册名与 8个字节
:004A2EBB 7D0F jge 004A2ECC <-----大于等于就跳，不跳就BYE-BYE

* Possible StringData Ref from Code Obj ->"Your registration name has a minimun "
->"of 8 characters. Please copy the "
->"Registration name and code exactly "
->"as they are in your registration "
->"email!"
|
:004A2EBD B870304A00 mov eax, 004A3070
:004A2EC2 E84156FBFF call 00458508
:004A2EC7 E95D010000 jmp 004A3029

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A2EBB(C)
|
:004A2ECC 8D55F8 lea edx, dword ptr [ebp-08]
:004A2ECF 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004A2ED5 E84EFFF8FF call 00432E28
:004A2EDA 8B55F8 mov edx, dword ptr [ebp-08]
:004A2EDD 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:004A2EE3 83C024 add eax, 00000024
:004A2EE6 E8AD0DF6FF call 00403C98
:004A2EEB 8D55F4 lea edx, dword ptr [ebp-0C]
:004A2EEE 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004A2EF4 E82FFFF8FF call 00432E28
:004A2EF9 8B45F4 mov eax, dword ptr [ebp-0C]
:004A2EFC 50 push eax
:004A2EFD 8D55F0 lea edx, dword ptr [ebp-10]
:004A2F00 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:004A2F06 E89D4AFEFF call 004879A8
:004A2F0B 8B55F0 mov edx, dword ptr [ebp-10]
:004A2F0E 58 pop eax
:004A2F0F E8C010F6FF call 00403FD4 <-------关键的CALL，进去看看
:004A2F14 0F8505010000 jne 004A301F <-------跳就BYE-BYE了，出现“Invalid Registration name and/or code! Please copy the Registration name and code exactly as they are in your registration email!”窗口
:004A2F1A B201 mov dl, 01
:004A2F1C A184844600 mov eax, dword ptr [00468484]
:004A2F21 E85E56FCFF call 00468584
:004A2F26 8BF0 mov esi, eax
:004A2F28 BA02000080 mov edx, 80000002
:004A2F2D 8BC6 mov eax, esi
:004A2F2F E8F056FCFF call 00468624
:004A2F34 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\Cwhere\ThemeFreak"
|
:004A2F36 BA0C314A00 mov edx, 004A310C
:004A2F3B 8BC6 mov eax, esi
:004A2F3D E84A57FCFF call 0046868C

* Possible StringData Ref from Code Obj ->"Data"
|
:004A2F42 BA30314A00 mov edx, 004A3130
:004A2F47 8BC6 mov eax, esi
:004A2F49 E8DA59FCFF call 00468928
:004A2F4E 8D55EC lea edx, dword ptr [ebp-14]
:004A2F51 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004A2F57 E8CCFEF8FF call 00432E28
:004A2F5C 8B4DEC mov ecx, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"RegName"
|
:004A2F5F BA40314A00 mov edx, 004A3140
:004A2F64 8BC6 mov eax, esi
:004A2F66 E8BD5AFCFF call 00468A28
:004A2F6B 8D55E8 lea edx, dword ptr [ebp-18]
:004A2F6E 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004A2F74 E8AFFEF8FF call 00432E28
:004A2F79 8B4DE8 mov ecx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"RegNum"
|
:004A2F7C BA50314A00 mov edx, 004A3150
:004A2F81 8BC6 mov eax, esi
:004A2F83 E8A05AFCFF call 00468A28
:004A2F88 8BC6 mov eax, esi
:004A2F8A E86556FCFF call 004685F4
:004A2F8F 8BC6 mov eax, esi
:004A2F91 E8E6FFF5FF call 00402F7C
:004A2F96 A1008B4B00 mov eax, dword ptr [004B8B00]
:004A2F9B 8B00 mov eax, dword ptr [eax]
:004A2F9D 8B80F0020000 mov eax, dword ptr [eax+000002F0]
:004A2FA3 33D2 xor edx, edx
:004A2FA5 E896FDF8FF call 00432D40
:004A2FAA 8D55E4 lea edx, dword ptr [ebp-1C]
:004A2FAD 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004A2FB3 E870FEF8FF call 00432E28
:004A2FB8 8B55E4 mov edx, dword ptr [ebp-1C]
:004A2FBB A1008B4B00 mov eax, dword ptr [004B8B00]
:004A2FC0 8B00 mov eax, dword ptr [eax]
:004A2FC2 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:004A2FC8 E88BFEF8FF call 00432E58
:004A2FCD A1008B4B00 mov eax, dword ptr [004B8B00]
:004A2FD2 8B00 mov eax, dword ptr [eax]
:004A2FD4 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:004A2FDA B201 mov dl, 01
:004A2FDC E85FFDF8FF call 00432D40
:004A2FE1 A1008B4B00 mov eax, dword ptr [004B8B00]
:004A2FE6 8B00 mov eax, dword ptr [eax]
:004A2FE8 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004A2FEE B201 mov dl, 01
:004A2FF0 E84BFDF8FF call 00432D40
:004A2FF5 A1D88B4B00 mov eax, dword ptr [004B8BD8]
:004A2FFA 8B00 mov eax, dword ptr [eax]
:004A2FFC 8B8014050000 mov eax, dword ptr [eax+00000514]
:004A3002 33D2 xor edx, edx
:004A3004 E8C705FAFF call 004435D0

* Possible StringData Ref from Code Obj ->"Thankyou for registering ThemeFreak!"
|
:004A3009 B860314A00 mov eax, 004A3160
:004A300E E8F554FBFF call 00458508
:004A3013 A170994B00 mov eax, dword ptr [004B9970]
:004A3018 E81BAEFAFF call 0044DE38
:004A301D EB0A jmp 004A3029

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A2F14(C) <----原来是从这儿来的
|

* Possible StringData Ref from Code Obj ->"Invalid Registration name and/or "
->"code! Please copy the Registration "
->"name and code exactly as they "
->"are in your registration email!"
**********************************略*********************************************
|
:004A301F B890314A00 mov eax, 004A3190
:004A3024 E8DF54FBFF call 00458508

:00403FD4 53 push ebx
:00403FD5 56 push esi
:00403FD6 57 push edi
:00403FD7 89C6 mov esi, eax <--------下D EAX 你输入的注册码
:00403FD9 89D7 mov edi, edx <--------下D EDX 真正的注册码
:00403FDB 39D0 cmp eax, edx
:00403FDD 0F848F000000 je 00404072
:00403FE3 85F6 test esi, esi
:00403FE5 7468 je 0040404F
:00403FE7 85FF test edi, edi
:00403FE9 746B je 00404056
:00403FEB 8B46FC mov eax, dword ptr [esi-04]
:00403FEE 8B57FC mov edx, dword ptr [edi-04]
:00403FF1 29D0 sub eax, edx
:00403FF3 7702 ja 00403FF7
:00403FF5 01C2 add edx, eax

注册名：调试软件
注册码：35405055

哇！写破解教学比破解软件累多了，呵呵！在此谨向广大为初学者不辞辛劳写破解教学的前辈致以崇高的敬意！


traceboy2.0

标 题:破traceboy2.0 高手勿看! (9千字)
发信人:zest
时 间:2001-1-29 14:14:03
详细信息:
破traceboy2.0 高手勿看!
ftp://ftp.eware.com.cn/pub/system/syssafe/traceboy20.zip
traceboy.exe 708KB
我吹：
运行本软件后，程序将驻留内存，时刻记录着键盘的一举一动，同时可以定时记
录，并控制软件运行时间、启动热键和存储文件路径以及保护软件运行等多项功
能，随时可以浏览记录，并可以通互联网过将记录文件发送给您。

电脑报2001年第3期上有介绍。
怎么我老跟电脑报过不去?
怎么跟PCGHOST一样?
作者俩是亲兄弟?
但它多一关联?
象木马病毒?
你病我毒!
我ZEST!
gogo!
go!

运行traceboy.exe后，在注册处填：
姓 名：zzzzzz
注册码：1234567890
RUN trw2k103
bpx hmemcpy
按确定后中断于hmemcpy
bd
pmodule
经过若干RET后到：cs:0048A6E4

:0048A6DF E81424FAFF call 0042CAF8 //取姓名
:0048A6E4 8B45F8 mov eax, dword ptr [ebp-08] //到这里
:0048A6E7 E87496F7FF call 00403D60
:0048A6EC 83F805 cmp eax, 00000005 //name number>5
:0048A6EF 0F8EEC030000 jle 0048AAE1 //jump bye!
:0048A6F5 8D55E0 lea edx, dword ptr [ebp-20]
:0048A6F8 8B87E0020000 mov eax, dword ptr [edi+000002E0]
:0048A6FE E8F523FAFF call 0042CAF8 //注册码不能空
:0048A703 837DE000 cmp dword ptr [ebp-20], 00000000
:0048A707 0F84D4030000 je 0048AAE1 //空 bye!
:0048A70D 33F6 xor esi, esi
:0048A70F 8D45E8 lea eax, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"MyNamesZEDLhYScbdQfuBHXtvpqriJACjkFUVTzwxPGngR"
->"WuKXR"
|
:0048A712 BA30AB4800 mov edx, 0048AB30
:0048A717 E85C94F7FF call 00403B78
:0048A71C 8D45F0 lea eax, dword ptr [ebp-10]
:0048A71F E8BC93F7FF call 00403AE0
:0048A724 8D45F4 lea eax, dword ptr [ebp-0C]
:0048A727 E8B493F7FF call 00403AE0
:0048A72C 8D55E4 lea edx, dword ptr [ebp-1C]
:0048A72F 8B87E0020000 mov eax, dword ptr [edi+000002E0]
:0048A735 E8BE23FAFF call 0042CAF8 //取注册码
:0048A73A 8B45E4 mov eax, dword ptr [ebp-1C] //1234567890
:0048A73D E81E96F7FF call 00403D60 //无聊的重复
:0048A742 8BD8 mov ebx, eax //code number=A
:0048A744 85DB test ebx, ebx
:0048A746 7E2B jle 0048A773
:0048A748 C745FC01000000 mov [ebp-04], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048A771(C)
|
:0048A74F 8B45E4 mov eax, dword ptr [ebp-1C] *//
:0048A752 8B55FC mov edx, dword ptr [ebp-04] *//
:0048A755 0FB64410FF movzx eax, byte ptr [eax+edx-01] *//
:0048A75A 8D55DC lea edx, dword ptr [ebp-24] *//
:0048A75D E8C6DBF7FF call 00408328 *//
:0048A762 8B55DC mov edx, dword ptr [ebp-24] *//变换后数值放入EDX
:0048A765 8D45F4 lea eax, dword ptr [ebp-0C] *//
:0048A768 E8FB95F7FF call 00403D68 *//整理成串。
:0048A76D FF45FC inc [ebp-04] *//
:0048A770 4B dec ebx *//
:0048A771 75DC jne 0048A74F *//

注：*//处很重要，是变换填入的注册码的，你可进入各CALL看看。
变换过程是这样的：取注册码的一个数值，找出其ASCII码值（十六进制），
变换为十进制。如:
1的ASCII值为31，31的十进制为49
A的ASCII值为41，31的十进制为65
a的ASCII值为61，31的十进制为97
等等等等......
然后整理成串49505152535455565748。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048A746(C)
|
:0048A773 686CAB4800 push 0048AB6C //f5
:0048A778 FF75F4 push [ebp-0C] //49505152535455565748
:0048A77B 6878AB4800 push 0048AB78 //k6
:0048A780 8D45F4 lea eax, dword ptr [ebp-0C]
:0048A783 BA03000000 mov edx, 00000003
:0048A788 E89396F7FF call 00403E20 //整理f549505152535455565748k6
:0048A78D 8B45F8 mov eax, dword ptr [ebp-08]//zzzzzz
:0048A790 E8CB95F7FF call 00403D60
:0048A795 85C0 test eax, eax
:0048A797 7E0F jle 0048A7A8
......
......
......
后面是zzzzzz变换的过程，好大的循环，有你看一阵子的。不写了，我累？我泪！
谁有空可写个注册机出来。还是别写了，支持一下国产软件吧！
......
......
......
:0048A9A9 686CAB4800 push 0048AB6C //f5
:0048A9AE FF75F0 push [ebp-10] //变换得78501145685539055114558850
:0048A9B1 6878AB4800 push 0048AB78 //k6
:0048A9B6 8D45F0 lea eax, dword ptr [ebp-10]
:0048A9B9 BA03000000 mov edx, 00000003
:0048A9BE E85D94F7FF call 00403E20 //整理f578501145685539055114558850k6
:0048A9C3 8B45F0 mov eax, dword ptr [ebp-10]//f578501145685539055114558850k6
:0048A9C6 8B55F4 mov edx, dword ptr [ebp-0C]//f549505152535455565748k6
:0048A9C9 E8A294F7FF call 00403E70 //对比CALL可进入看
:0048A9CE 0F8504010000 jne 0048AAD8 //jump bye!
:0048A9D4 8B87D0020000 mov eax, dword ptr [edi+000002D0]//后面的很多CALL变成
:0048A9DA B201 mov dl, 01 //三口肉！
:0048A9DC E82F20FAFF call 0042CA10 //注册成功！！
:0048A9E1 8B87D8020000 mov eax, dword ptr [edi+000002D8]
:0048A9E7 33D2 xor edx, edx
:0048A9E9 E82220FAFF call 0042CA10
:0048A9EE 8B87E0020000 mov eax, dword ptr [edi+000002E0]
:0048A9F4 33D2 xor edx, edx
:0048A9F6 E81520FAFF call 0042CA10
:0048A9FB 8B87E4020000 mov eax, dword ptr [edi+000002E4]
:0048AA01 33D2 xor edx, edx
:0048AA03 E80820FAFF call 0042CA10
:0048AA08 8B87E8020000 mov eax, dword ptr [edi+000002E8]
:0048AA0E 33D2 xor edx, edx
:0048AA10 E8FB1FFAFF call 0042CA10
:0048AA15 8B87D4020000 mov eax, dword ptr [edi+000002D4]
:0048AA1B 33D2 xor edx, edx
:0048AA1D E8EE1FFAFF call 0042CA10
:0048AA22 8B87DC020000 mov eax, dword ptr [edi+000002DC]
:0048AA28 33D2 xor edx, edx
:0048AA2A E8E11FFAFF call 0042CA10
:0048AA2F A150634900 mov eax, dword ptr [00496350]
:0048AA34 8B00 mov eax, dword ptr [eax]
:0048AA36 8B807C030000 mov eax, dword ptr [eax+0000037C]
:0048AA3C 33D2 xor edx, edx
:0048AA3E E8CD1FFAFF call 0042CA10
:0048AA43 A150634900 mov eax, dword ptr [00496350]
:0048AA48 8B00 mov eax, dword ptr [eax]
:0048AA4A 8B8078030000 mov eax, dword ptr [eax+00000378]
:0048AA50 B201 mov dl, 01
:0048AA52 E8B91FFAFF call 0042CA10
:0048AA57 B201 mov dl, 01
:0048AA59 A1BCEF4500 mov eax, dword ptr [0045EFBC]
:0048AA5E E85946FDFF call 0045F0BC
:0048AA63 8BD8 mov ebx, eax
:0048AA65 BA02000080 mov edx, 80000002
:0048AA6A 8BC3 mov eax, ebx
:0048AA6C E8EB46FDFF call 0045F15C
:0048AA71 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"\software\stonari\xpghostd"
|
:0048AA73 BA84AB4800 mov edx, 0048AB84
:0048AA78 8BC3 mov eax, ebx
:0048AA7A E84547FDFF call 0045F1C4
:0048AA7F 8D4D90 lea ecx, dword ptr [ebp-70]

* Possible StringData Ref from Code Obj ->"38309"
|
:0048AA82 BAA8AB4800 mov edx, 0048ABA8

* Possible StringData Ref from Code Obj ->"yesreg"
|
:0048AA87 B8B8AB4800 mov eax, 0048ABB8
:0048AA8C E8B3FAFFFF call 0048A544 //组合变换
:0048AA91 8B4D90 mov ecx, dword ptr [ebp-70] //变换后得73DF7DC306528A
//注：此值每次都变
* Possible StringData Ref from Code Obj ->"zecixy"
|
:0048AA94 BAC8AB4800 mov edx, 0048ABC8
:0048AA99 8BC3 mov eax, ebx
:0048AA9B E8C04AFDFF call 0045F560 //该值写入注册表
:0048AAA0 8BC3 mov eax, ebx
......
......

**小节**
姓名与注册码分别计算变化后对比。
关键对比：
:0048A9C3 8B45F0 mov eax, dword ptr [ebp-10] //f578501145685539055114558850k6
:0048A9C6 8B55F4 mov edx, dword ptr [ebp-0C] //f549505152535455565748k6
:0048A9C9 E8A294F7FF call 00403E70
:0048A9CE 0F8504010000 jne 0048AAD8
call马上到jne(je)是DELPHI编写通病，不不不，
是关键！对比处一般在上两行，
你也可进入此CALL看看即知。
其实此程序根本不用找注册码，只要用TRW调试到
0048A9CE处使其不跳它就乖乖注册了。
注册在H_L_M\software\stonari\xpghostd中
zecixy键值为73DF7DC306528A
你的值可能与我的不一样。

由上分析：
一个注册码：
f5 78 50 114 56 85 53 90 55 114 55 88 50 k6
N 2 r 8 U 5 Z 7 r 7 X 2
所以：
姓 名：zzzzzz
注册码：N2r8U5Z7r7X2

/\zest/\
2001.1


Traceboy2.1

标 题:杀掉跟踪者 (Traceboy2.1破解） (769字)
发信人:duba.126.com
时 间:2001-2-17 13:06:57
详细信息:
杀掉跟踪者 (Traceboy2.1破解）
软件名称：跟踪者(Traceboy) [国产]
软件授权：共享软件
注册费用：20元人民币
使用平台：Win95/98/NT/2000
版本V2.10 大小275KB 更新2001-02-16
url=ftp://ftp.bj.software.chinese.com/software/soft_systool/traceboy21.zip
软件简介：
    本软件运行后可记录键盘的动作，同时可以控制软件的自删除，
启动时口令、随Win9X一起启动及Win9X的系统秘密设置。启动时，
无任何反应,隐蔽性好；运行本软件后，程序将驻留内存，任务栏上无
本程序图标，安全性高；并随时可以查阅记录文件，且每隔5分钟检查一次是否上网，将记录文件发送给您。运行后按Ctrl+Alt+Space激活程序，初始口令为888。

用户名字母5个以上
关键比较0047CA13
关键跳转0047CA1E 0F85XX=〉0F84XX

用户名guodong
注册码e5E8k3C2H2v5
注册机留给masiqi大哥作吧

作者：风飘雪
主页http://duba.126.com

标 题:注册机代码（用VB5编的）： (1千字)
发信人:小　明
时 间:2001-2-18 17:18:48
详细信息:

Private Sub Command1_Click()
Shell "start http://dxpjj.3322.net/"
End Sub

Private Sub Text1_Change()
L = LenB(Text1.Text)
If L > 0 Then
For i = 1 To LenB(Text1.Text)
If AscB(MidB(Text1.Text, i, 1)) = 0 Then L = L - 1
Next
End If
If L > 5 Then
s = "MyNamesZEDLhYScbdQfuBHXtvpqriJACjkFUVTzwxPGngRWuKXR"
n = 0
For i = 1 To Len(Trim(Text1.Text))
x = Asc(Mid(Text1.Text, i, 1))
If x > 0 Then
n = n + x
Else
x = x + 65536
n = n + (x \ 256) + (x Mod 256)
End If
Next
n = n * &H57
n1 = Trim(Str(n))
x = Val(Mid(n1, Len(n1) - 1, 1) + Mid(n1, 2, 1))
If x > 0 Then
n2 = n * x
Else
n2 = n * &H43
End If
n2 = Trim(Str(n2))
m = ""
For i = 1 To Len(n2) - 1
x = Val(Mid(n2, i, 2))
If x > 49 Then
m = m + Mid(s, x - 49, 1)
ElseIf x = 0 Then
m = m + Mid(s, 51, 1)
Else
m = m + Mid(s, x, 1)
End If
m = m + Mid(n2, i + 1, 1)
Next
Text2.Text = m
Else
Text2.Text = ""
End If
End Sub


Transoft's Server All 1.02

标 题:初学者的东西：Transoft's Server All 1.02破解 (3千字)
发信人:Passion
时 间:2001-1-8 19:55:09
详细信息:
初学者的东西：Transoft's Server All 1.02破解
——Passion在新世纪的第一个破解

以前用过一个叫Transoft's Server All的服务器软件，华军下的，能将WINNT下的任意程序转换成NT的服务，也就是不需要登录就能自动运行。这号功能听起来不错，只是仍然要注册，于是忍不住又想练练手。——高手可别笑话我这个初学者。

说实话Transoft's Server All 1.02在高手眼里只不过是小菜，但我对付它却花了两个多小时，时间就花在寻找用我输入的用户名生成注册码的过程。开始原想分析出注册码计算的算法的，可似乎太复杂，跟了几百个语句后放弃了。早知道这样，不如在内存中寻找假注册码再设内存读写断点，那样八成更快些。

还是老手段，点菜单“Apply Registration Code”弹出注册框，要输入name、userkey和Email address，于是输入Passion/1212121212121212/passion@email.com.cn（不过后来这个Email地址根本就没用到）。下断bpx hmemcpy，断后回Server All领空，RET大概七层后来到此处：

:00478C95 E86276FAFF call 004202FC

//运行到这里，上边这个CALL是读取userkey的。

:00478C9A 8B45F8 mov eax, dword ptr [ebp-08]
:00478C9D 50 push eax
:00478C9E 8D55F4 lea edx, dword ptr [ebp-0C]
:00478CA1 8B45FC mov eax, dword ptr [ebp-04]
:00478CA4 8B80FC010000 mov eax, dword ptr [eax+000001FC]
:00478CAA E84D76FAFF call 004202FC
//这个CALL读取NAME

:00478CAF 8B45F4 mov eax, dword ptr [ebp-0C]
:00478CB2 5A pop edx

:00478CB3 E850FFFFFF call 00478C08

//这里肯定是生成注册码并判断的，判断结果在AL中。

:00478CB8 84C0 test al, al
:00478CBA 0F8474030000 je 00479034 //如果跳就完了。

我以前把这里的0F8474030000全用90来NOP掉也注册成功了，不过这里要找出注册码，因此在此处按F8进入：

:00478CB3 E850FFFFFF call 00478C08

进入后程序段变得很复杂，不过前边的逻辑还是稍微有些清楚，首先将输入的name按字符分开，按ASCII码进行迭代运算（许多乘法和浮点指令弄得我头晕脑胀的）。后来也不知怎么回事就出现了字符串“80219520”，幸亏觉得不对头，因为刚跟那么一点时间就出来注册码，那算法也太不成器了。再跟，又出来一个字符串“10027440”。——当然还得跟。
再跟下去，这两个字符串被作为参数参与了下一轮运算。并且运行到00466757处出现字符表，估计是计算出来的值通过查表的方式生成对应字符。
具体的流程复杂得很，注册码计算至少经过了三大步骤，迭代运算我也搞不清有多少次，因此代码没法贴出来。

:004666CB E810D6F9FF call 00403CE0
//此处D EAX可看到第一个中间结果——字符80219520

:00466757 E888D7F9FF call 00403EE4
//此处D EAX可看到字符表

:0046676A E871D5F9FF call 00403CE0
//此处D EAX可看到第二个中间结果——字符10027440

最后，在00466779上下D EAX，可看见最终的注册码。
——这个地方对于我来说真不容易找，几乎每一个CALL我都跟进去了。

:00466779 E87ED3F9FF call 00403AFC
//这里注册码是JNZVh，一般长度都在五六个左右。

所以我注册时用的就是：
Name：Passion
Userkey：JNZVh
Email Address：随便

填入自己的Name后在0167:00466779处中断时，来一个D EAX可看见与自己的注册名对应的、属于自己的注册码。（相信大家都喜欢得到这种结果吧？）
另外我怀疑这个程序是用DELPHI写的，因为凡是碰到取字符串长度的子程序，都是在EBP-04还是类似的其他地方取一个值到EAX里再RET回去，这是Pascal的风格，跟C的字符串遍历的方法不一样。

标 题:Passion的笑话 (824字)
发信人:Passion
时 间:2001-1-8 19:53:22
详细信息:

话说二十一世纪的某年某月某日，Passion偶然把系统时钟调后了一年，不料运行某软件时连续弹出过期提示共三百六十五次，Passion给气得七窍生烟，马上动手Crack。开始Win32 Dasm反汇编，却找不到执行入口点，Program entry point的菜单也是灰色，而且代码开始处的指令也不是通常的push ebp之类的。Passion于是心中发虚，“反汇编手段这么高？”
——用FileInfo等东西看，没有丝毫结果。Passion于是更发虚：“加壳手段也这么高？”
——用SoftIce Loader载入，开始倒是能执行，运行一段代码后，居然出现一个int 3，按F10便直接启动软件，跳过后又碰到一个REPZ MOVSB，执行便同样直接启动。Passion开始冒冷汗了：“反跟踪手段也太高了吧？”
——于是“两股战战，几欲先走。”

过了数日，Passion又想起这事，越想越不对劲，可百思不得其解。最后碰上了NORTON ANTIVIRUS……，NORTON老先生告诉他说：“……WIN95.CIH……”
——“砰！”
Passion当场晕倒。
……


Trojan Remover 4.3.0

 标 题:Trojan Remover 4.3.0破解手记 (8千字)
发信人:X man
时 间:2001-8-31 15:02:44
详细信息:
Trojan Remover 4.3.0破解手记

作者：X man or lb[BCG]
软件版本 4.3.0
使用平台 Win9x/Me/NT/2000
文件大小 1458KB
软件性质 共享软件
简单说明 是一个专门用来清除特洛伊木马和自动修复系统文件的工具。能够检查系统登录文件、扫描WIN.INI
、SYSTEM.INI和系统登录文件，且扫描完成后会产生Log信息文件，并帮你自动清除特洛伊木马和修复系统文
件。

注:安装该程序时就要求填入name、Organisation在这里我填的是：
name:lb[BCG]
Organisation:Beginner's Cracking Group

FIRST：
用FI检测RmvTrjan.exe，未发现加壳。GOOD！用W32DASM反编译它，却发现“String Data references”中没有
任何信息。奇怪难道是被FI骗了，于是用PROCDUMP来PE Editor它，终于找到了，是用ASPack加壳，好办脱掉它
就可以用W32DASM了。

当然，本文不是讨论如何脱壳的，所以告诉您一个简单的办法，用“Ding Boy的冲击波2000”找到切入点，再
用TRW2000的MAKEPE来搞定它！

NEXT：
用W32DASM反编译后，查找“Registration key is invalid ”来到

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043CDCF(C)
|
:0043D032 6A30 push 00000030
:0043D034 E83F44FCFF call 00401478
:0043D039 6A00 push 00000000
:0043D03B 668B0DD4D34300 mov cx, word ptr [0043D3D4]
:0043D042 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"Registration key is invalid - "
->"please ensure you have typed the "
->"Registration Key correctly. Most "
->"registration problems are caused "
->"because the Serial Number does "
->"not match that originally supplied "
->"by the user when registering. "
->"Check that the Serial Number displayed "
->"is identical to that shown in "
->"the registration email. If it "
->"is not, send email to support@simplysup.com "
->"giving your new Serial "
|
:0043D044 B8E0D34300 mov eax, 0043D3E0
:0043D049 E8EA4EFCFF call 00401F38
:0043D04E 83F804 cmp eax, 00000004
:0043D051 7523 jne 0043D076
:0043D053 8B45FC mov eax, dword ptr [ebp-04]
:0043D056 8B8008020000 mov eax, dword ptr [eax+00000208]
:0043D05C 33D2 xor edx, edx
:0043D05E E8D54AFCFF call 00401B38
:0043D063 8B45FC mov eax, dword ptr [ebp-04]
:0043D066 8B9008020000 mov edx, dword ptr [eax+00000208]
:0043D06C 8B45FC mov eax, dword ptr [ebp-04]
:0043D06F E8B44CFCFF call 00401D28
:0043D074 EB08 jmp 0043D07E

看到是有0043CDCF处跳来的，于是转到该处
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043CAE0(C)
|
:0043CD51 8D55F0 lea edx, dword ptr [ebp-10]
:0043CD54 8B45FC mov eax, dword ptr [ebp-04]
:0043CD57 8B8008020000 mov eax, dword ptr [eax+00000208]
:0043CD5D E8CE4DFCFF call 00401B30
:0043CD62 8B45F0 mov eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->"419246"
|
:0043CD65 BA50D24300 mov edx, 0043D250
:0043CD6A E83944FCFF call 004011A8
:0043CD6F 7464 je 0043CDD5
:0043CD71 8D55F0 lea edx, dword ptr [ebp-10]
:0043CD74 8B45FC mov eax, dword ptr [ebp-04]
:0043CD77 8B8008020000 mov eax, dword ptr [eax+00000208]
:0043CD7D E8AE4DFCFF call 00401B30
:0043CD82 8B45F0 mov eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->"387192"
|
:0043CD85 BA60D24300 mov edx, 0043D260
:0043CD8A E81944FCFF call 004011A8
:0043CD8F 7444 je 0043CDD5
:0043CD91 8D55F0 lea edx, dword ptr [ebp-10]
:0043CD94 8B45FC mov eax, dword ptr [ebp-04]
:0043CD97 8B8008020000 mov eax, dword ptr [eax+00000208]
:0043CD9D E88E4DFCFF call 00401B30
:0043CDA2 8B45F0 mov eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->"388028"
|
:0043CDA5 BA70D24300 mov edx, 0043D270
:0043CDAA E8F943FCFF call 004011A8
:0043CDAF 7424 je 0043CDD5
:0043CDB1 8D55F0 lea edx, dword ptr [ebp-10]
:0043CDB4 8B45FC mov eax, dword ptr [ebp-04]
:0043CDB7 8B8008020000 mov eax, dword ptr [eax+00000208]
:0043CDBD E86E4DFCFF call 00401B30
:0043CDC2 8B45F0 mov eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->"422199"
|
:0043CDC5 BA80D24300 mov edx, 0043D280
:0043CDCA E8D943FCFF call 004011A8
:0043CDCF 0F855D020000 jne 0043D032---------------------由这里跳到出错信息处，看到上面
的422199，可能它就是注册码，好，把它填进去后，
果然没有弹出错误的对话框。不过却说这是临时注
册码云云，呜呜~~~，居然是这么回事，好！把日期
往后调动后，再次运行该软件，又弹出错误的对话框（这样一开始有可以填如注册码），于是从此处向上看，
来到0043CD51处，发现这一切都是0043CAE0引来的。

NEXT：
转营，来到0043CAE0处

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043CA54(C)
|
:0043CAB7 A1ACDB4B00 mov eax, dword ptr [004BDBAC]
:0043CABC 8B00 mov eax, dword ptr [eax]
:0043CABE 59 pop ecx
:0043CABF E8C0420700 call 004B0D84
:0043CAC4 8D55F0 lea edx, dword ptr [ebp-10]
:0043CAC7 8B45FC mov eax, dword ptr [ebp-04]
:0043CACA 8B8008020000 mov eax, dword ptr [eax+00000208]
:0043CAD0 E85B50FCFF call 00401B30
:0043CAD5 8B55F0 mov edx, dword ptr [ebp-10]-----可疑哦！这里D EAX试试
:0043CAD8 8B45F8 mov eax, dword ptr [ebp-08]-----EAX：真的注册码
:0043CADB E8C846FCFF call 004011A8-------------------EDX：您输入的假注册码
:0043CAE0 0F856B020000 jne 0043CD51 ------------就是这儿开始引导我出错
:0043CAE6 A194DB4B00 mov eax, dword ptr [004BDB94]
:0043CAEB C60001 mov byte ptr [eax], 01
:0043CAEE A1C8DB4B00 mov eax, dword ptr [004BDBC8]
:0043CAF3 C60000 mov byte ptr [eax], 00
:0043CAF6 B201 mov dl, 01
:0043CAF8 A114FB4D00 mov eax, dword ptr [004DFB14]
:0043CAFD E8B654FCFF call 00401FB8
:0043CB02 8945F4 mov dword ptr [ebp-0C], eax
:0043CB05 BA02000080 mov edx, 80000002
:0043CB0A 8B45F4 mov eax, dword ptr [ebp-0C]
:0043CB0D E8B654FCFF call 00401FC8
:0043CB12 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"SOFTWARE\Simply Super Software\Trojan "
->"Remover\User"
|
:0043CB14 BAB8D04300 mov edx, 0043D0B8
:0043CB19 8B45F4 mov eax, dword ptr [ebp-0C]
:0043CB1C E8AF54FCFF call 00401FD0
:0043CB21 84C0 test al, al
:0043CB23 0F84DC000000 je 0043CC05
:0043CB29 33C0 xor eax, eax
:0043CB2B 55 push ebp
:0043CB2C 68DDCB4300 push 0043CBDD
:0043CB31 64FF30 push dword ptr fs:[eax]
:0043CB34 648920 mov dword ptr fs:[eax], esp
:0043CB37 8D55F0 lea edx, dword ptr [ebp-10]
:0043CB3A 8B45FC mov eax, dword ptr [ebp-04]
:0043CB3D 8B80E8010000 mov eax, dword ptr [eax+000001E8]
:0043CB43 E8E84FFCFF call 00401B30
:0043CB48 8B4DF0 mov ecx, dword ptr [ebp-10]
…………………………（省略一部分）

END：
好了，Trojan Remover就破解到这了，我的注册码是：
name:lb[BCG]
Organisation:Beginner's Cracking Group
Serial No:80208956
Reg No:67011387897120

该软件的注册信息放在HKEY_LOCAL_MACHINE\Software\Simply Super Software\Trojan Remover\User处

各位高手看了本文不要见笑，我是个Beginner。
X man or lb[BCG]
lbcool@elong.com
2001.8.30


TurboLaunch 4.04

 标 题:破解TurboLaunch 4.04 (5千字)
发信人:crazyedea
时 间:2001-6-6 21:39:21
详细信息:
软件名称：TurboLaunch 4.04
下载地址：http://www.download.com.cn/show.phtml?action=download&id=4507&lo=1&ftpurl=ftp://ftp.download.com.cn/pub/new_tools/tlsetup.exe&name=tlsetup.exe
软件简介：TurboLaunch是一个完全可以定制的工具软件导航器。你可以通过它点击一下即可运行你最长用的工具软件。使用方便，界面简单，支持分类管理！你再也不毕为程序太多找不到而发愁了！是每个Windows用户必不可少的工具。
破解难度：简单，适合我这样的菜菜鸟
破解人：Edea (QQ:3849036)

时间仓促，写的比较简单，请大家见谅。
该软件用upx压缩，脱之
载入TurboLaunch，点Enter My Registration Code，第一行Name填Edea，第二行Code填9876543210
打开Trw2000，下断点bpx hmemcpy，点ok，被拦下。
清除断点，下pmodule，然后按7下F12（按8下就失败了），再按几下F10，来到：

0177:00463A6D MOV EDX,[EBP-0C]
0177:00463A70 MOV EAX,005B7FE8
0177:00463A75 CALL 0040351C
0177:00463A7A LEA EDX,[EBP-0C]
0177:00463A7D MOV EAX,[0046CADC]
0177:00463A82 MOV EAX,[EAX+01C0]
0177:00463A88 CALL 00415780
0177:00463A8D MOV EDX,[EBP-0C]
0177:00463A90 MOV EAX,005B7FEC
0177:00463A95 CALL 0040351C
0177:00463A9A MOV ECX,[005B7FEC]
0177:00463AA0 MOV EDX,[005B7FE8]
0177:00463AA6 MOV EAX,EBX
0177:00463AA8 CALL 00461674 -------->关键Call，跟入
0177:00463AAD MOV [005B7FF0],AL
0177:00463AB2 CMP BYTE [005B7FF0],00
0177:00463AB9 JZ 00463AFB -------->跳则死
0177:00463ABB MOV EDX,00463BC4
0177:00463AC0 LEA EAX,[EBP-04]
0177:00463AC3 CALL 00403560

Call from 00463aa8
0177:00461674 PUSH EBP
0177:00461675 MOV EBP,ESP
0177:00461677 ADD ESP,BYTE -54
0177:0046167A PUSH EBX
0177:0046167B PUSH ESI
0177:0046167C PUSH EDI
0177:0046167D XOR EBX,EBX
0177:0046167F MOV [EBP-54],EBX
0177:00461682 MOV [EBP-0C],EBX
0177:00461685 MOV [EBP-08],ECX
0177:00461688 MOV [EBP-04],EDX
0177:0046168B MOV EAX,[EBP-04]
0177:0046168E CALL 004037F4
0177:00461693 MOV EAX,[EBP-08]
0177:00461696 CALL 004037F4
0177:0046169B XOR EAX,EAX
0177:0046169D PUSH EBP
0177:0046169E PUSH DWORD 00461818
0177:004616A3 PUSH DWORD [FS:EAX]
0177:004616A6 MOV [FS:EAX],ESP
0177:004616A9 MOV EAX,[EBP-04]
0177:004616AC CALL 00403640
0177:004616B1 TEST EAX,EAX
0177:004616B3 JZ 004616C1
0177:004616B5 MOV EAX,[EBP-08]
0177:004616B8 CALL 00403640
0177:004616BD TEST EAX,EAX
0177:004616BF JNZ 004616C8
0177:004616C1 XOR EBX,EBX
0177:004616C3 JMP 004617F5
0177:004616C8 LEA EAX,[EBP-4E]
0177:004616CB MOV EDX,[EBP-04]
0177:004616CE CALL 00406700
0177:004616D3 PUSH BYTE +00
0177:004616D5 MOV EAX,[EBP-04]
0177:004616D8 CALL 00403640
0177:004616DD MOV ECX,EAX
0177:004616DF LEA EAX,[EBP-4E]
0177:004616E2 MOV EDX,40
0177:004616E7 CALL 004446D4
0177:004616EC MOV [0046C030],EAX
0177:004616F1 LEA EAX,[EBP-0C]
0177:004616F4 CALL 004034CC
0177:004616F9 MOV EDI,01
0177:004616FE MOV EAX,[EBP-04]
0177:00461701 CALL 00403640
0177:00461706 PUSH EAX
0177:00461707 MOV EAX,EDI
0177:00461709 SUB EAX,BYTE +01
0177:0046170C JNO 00461713
0177:0046170E CALL 00402ADC
0177:00461713 POP EDX
0177:00461714 MOV ECX,EDX
0177:00461716 CDQ
0177:00461717 IDIV ECX
0177:00461719 ADD EDX,BYTE +01
0177:0046171C JNO 00461723
0177:0046171E CALL 00402ADC
0177:00461723 MOV EAX,[EBP-04]
0177:00461726 MOV AL,[EAX+EDX-01]
0177:0046172A MOV [EBP-0D],AL
0177:0046172D XOR EBX,EBX
0177:0046172F MOV ESI,13
0177:00461734 SUB ESI,EDI
0177:00461736 JNO 0046173D
0177:00461738 CALL 00402ADC
0177:0046173D TEST ESI,ESI
0177:0046173F JNG 0046176D
0177:00461741 MOV EAX,21
0177:00461746 CALL 004029E4
0177:0046174B MOV EBX,EAX
0177:0046174D ADD EBX,BYTE +01
0177:00461750 JNO 00461757
0177:00461752 CALL 00402ADC
0177:00461757 MOV AL,[EBP-0D]
0177:0046175A XOR AL,FF
0177:0046175C AND EAX,FF
0177:00461761 ADD EBX,EAX
0177:00461763 JNO 0046176A
0177:00461765 CALL 00402ADC
0177:0046176A DEC ESI
0177:0046176B JNZ 00461741
0177:0046176D CMP EBX,BYTE +21
0177:00461770 JNG 00461781
0177:00461772 SUB EBX,BYTE +21
0177:00461775 JNO 0046177C
0177:00461777 CALL 00402ADC
0177:0046177C CMP EBX,BYTE +21
0177:0046177F JG 00461772
0177:00461781 LEA EAX,[EBP-54]
0177:00461784 MOV EDX,00461830
0177:00461789 MOV DL,[EDX+EBX-01] ----->下D EDX可见一很长的
0177:0046178D CALL 004035DC 字符串，不要以为是
0177:00461792 MOV EDX,[EBP-54] 注册码哟
0177:00461795 LEA EAX,[EBP-0C]
0177:00461798 CALL 00403648
0177:0046179D MOV EAX,EDI
0177:0046179F MOV ECX,06
0177:004617A4 CDQ
0177:004617A5 IDIV ECX
0177:004617A7 TEST EDX,EDX
0177:004617A9 JNZ 004617BD
0177:004617AB CMP EDI,BYTE +12
0177:004617AE JNL 004617BD
0177:004617B0 LEA EAX,[EBP-0C]
0177:004617B3 MOV EDX,0046186C
0177:004617B8 CALL 00403648
0177:004617BD INC EDI
0177:004617BE CMP EDI,BYTE +13
0177:004617C1 JNZ NEAR 004616FE
0177:004617C7 MOV EAX,[EBP-0C]
0177:004617CA MOV EDX,[EBP-08] ---->下D EAX，看到什么了？
0177:004617CD CALL 00403750 不用怀疑了，就是它
0177:004617D2 SETZ BL
0177:004617D5 MOV EDI,19
0177:004617DA MOV ESI,0046BC40
0177:004617DF MOV EAX,[EBP-04]
0177:004617E2 MOV EDX,[ESI]
0177:004617E4 CALL 00403750
0177:004617E9 JNZ 004617EF
0177:004617EB XOR EBX,EBX

正确的注册码：
Name:Edea
Code:RLDN42-9JM93N-5623HP


TxEdit 4.6

 标 题:《TxEdit 4.6》的注册码破解 (11千字)
发信人:RATARICE[BCG]
时 间:2001-7-28 20:25:11
详细信息:
《TxEdit 4.6》的注册码破解
目标：TxEdit 4.6
一个简单易用的文本编译器，可同时编译多个文件，可进行文件查找及替换，支持最大10兆的文件，支 持拖放，可浏览Mac和UNIX的文本，可设置自己喜爱工具条，可预先设置9个最多2000字符的宏和9个常用 工具。
软件类别：共享软件(30天试用版)
注册费用：$20.00
运行环境：Win95/98/NT
软件大小：191 KB
下载网址：http://www.execpc.com/~sbd
作者：RATARICE[BCG]
工具：TRW2000 1.22
过程：
一、 运行软件，可以输入注册码（非常好！）
二、 瞎填上
User Name: RATARICE[BCG]
Organization: peNcil grOup
Registration: 999999999999
三、 启动TRW，下bpx hmemcpy。点“OK”，被拦，下pmodule，追到下面代码：

:004187A8 E8836A0000 call 0041F230 ----------------------->计算注册码
:004187AD 83C404 add esp, 00000004
:004187B0 8BE8 mov ebp, eax
:004187B2 56 push esi
:004187B3 E898430000 call 0041CB50
:004187B8 83C404 add esp, 00000004
:004187BB 3D92A71901 cmp eax, 0119A792
:004187C0 7518 jne 004187DA

* Possible StringData Ref from Data Obj ->"Gregory Braun"
|
:004187C2 686CB74200 push 0042B76C

* Reference To: KERNEL32.lstrcpyA, Ord:0296h
|
:004187C7 8B2DC4664400 mov ebp, dword ptr [004466C4]
:004187CD 56 push esi
:004187CE FFD5 call ebp

* Possible StringData Ref from Data Obj ->"Software Design"
|
:004187D0 6854B74200 push 0042B754
:004187D5 53 push ebx
:004187D6 FFD5 call ebp
:004187D8 EB07 jmp 004187E1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004187C0(C)
|
:004187DA 3D3CCE5F0D cmp eax, 0D5FCE3C
:004187DF 750C jne 004187ED

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004187D8(U)
|
:004187E1 53 push ebx
:004187E2 56 push esi
:004187E3 E838380000 call 0041C020
:004187E8 83C408 add esp, 00000008
:004187EB 8BE8 mov ebp, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004187DF(C)
|
:004187ED 53 push ebx
:004187EE 56 push esi
:004187EF E82C380000 call 0041C020 ------------------------------>计算name和organ
:004187F4 83C408 add esp, 00000008
:004187F7 3BC5 cmp eax, ebp ------------------------------->关键比较
:004187F9 741E je 00418819 -------------------------------->关键跳转
不跳则死！！！
四、 追入上面的两个CALL：

先追入004187a8，代码如下：

* Referenced by a CALL at Addresses:
|:004187A8 , :0041F2E5 , :004226D8 , :0042270B , :0042273D
|
:0041F230 53 push ebx
:0041F231 56 push esi
:0041F232 8B74240C mov esi, dword ptr [esp+0C]
:0041F236 57 push edi
:0041F237 55 push ebp
:0041F238 BF01000000 mov edi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F26E(U)
|
:0041F23D 393D9CE34200 cmp dword ptr [0042E39C], edi
:0041F243 7E11 jle 0041F256
:0041F245 6A08 push 00000008
:0041F247 33C0 xor eax, eax
:0041F249 8A06 mov al, byte ptr [esi]
:0041F24B 50 push eax
:0041F24C E89FE2FFFF call 0041D4F0
:0041F251 83C408 add esp, 00000008
:0041F254 EB13 jmp 0041F269

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F243(C)
|
:0041F256 33D2 xor edx, edx

* Possible StringData Ref from Data Obj ->" ((((( "
->" H剟剟剟剟剟亖亖亖"
->"倐倐倐"
->" "
|
:0041F258 8B0D90E14200 mov ecx, dword ptr [0042E190]
:0041F25E 8A16 mov dl, byte ptr [esi]
:0041F260 33C0 xor eax, eax
:0041F262 668B0451 mov ax, word ptr [ecx+2*edx]
:0041F266 83E008 and eax, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F254(U)
|
:0041F269 85C0 test eax, eax
:0041F26B 7403 je 0041F270
:0041F26D 46 inc esi
:0041F26E EBCD jmp 0041F23D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F26B(C)
|
:0041F270 33DB xor ebx, ebx
:0041F272 8A1E mov bl, byte ptr [esi]
:0041F274 46 inc esi
:0041F275 8BFB mov edi, ebx
:0041F277 83FB2D cmp ebx, 0000002D
:0041F27A 7405 je 0041F281
:0041F27C 83FB2B cmp ebx, 0000002B
:0041F27F 7505 jne 0041F286

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F27A(C)
|
:0041F281 33DB xor ebx, ebx
:0041F283 8A1E mov bl, byte ptr [esi]
:0041F285 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F27F(C)
|
:0041F286 33ED xor ebp, ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F2BF(U)
|
:0041F288 833D9CE3420001 cmp dword ptr [0042E39C], 00000001
:0041F28F 7E0D jle 0041F29E
:0041F291 6A04 push 00000004
:0041F293 53 push ebx
:0041F294 E857E2FFFF call 0041D4F0
:0041F299 83C408 add esp, 00000008
:0041F29C EB0F jmp 0041F2AD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F28F(C)
|

* Possible StringData Ref from Data Obj ->" ((((( "
->" H剟剟剟剟剟亖亖亖"
->"倐倐倐"
->" "
|
:0041F29E 8B0D90E14200 mov ecx, dword ptr [0042E190]
:0041F2A4 33C0 xor eax, eax
:0041F2A6 668B0459 mov ax, word ptr [ecx+2*ebx] ------------
:0041F2AA 83E004 and eax, 00000004 |

* Referenced by a (U)nconditional or (C)onditional Jump at Address: |关键计算
|:0041F29C(U)
| |
:0041F2AD 85C0 test eax, eax
:0041F2AF 7410 je 0041F2C1 |
:0041F2B1 8D44AD00 lea eax, dword ptr [ebp+4*ebp]
:0041F2B5 46 inc esi |
:0041F2B6 8D6C43D0 lea ebp, dword ptr [ebx+2*eax-30]
:0041F2BA 33DB xor ebx, ebx |
:0041F2BC 8A5EFF mov bl, byte ptr [esi-01]
:0041F2BF EBC7 jmp 0041F288 ----------------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F2AF(C)
|
:0041F2C1 8BC5 mov eax, ebp
:0041F2C3 83FF2D cmp edi, 0000002D
:0041F2C6 7507 jne 0041F2CF
:0041F2C8 F7D8 neg eax
:0041F2CA 5D pop ebp
:0041F2CB 5F pop edi
:0041F2CC 5E pop esi
:0041F2CD 5B pop ebx
:0041F2CE C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F2C6(C)
|
:0041F2CF 5D pop ebp
:0041F2D0 5F pop edi
:0041F2D1 5E pop esi
:0041F2D2 5B pop ebx
:0041F2D3 C3 ret

在追入004187EF，代码如下：

* Referenced by a CALL at Addresses:
|:00412652 , :00418629 , :004187E3 , :004187EF
|
:0041C020 8B442404 mov eax, dword ptr [esp+04]
:0041C024 56 push esi
:0041C025 8B35309B4200 mov esi, dword ptr [00429B30]
:0041C02B 50 push eax
:0041C02C 81CE78030000 or esi, 00000378
:0041C032 E8190B0000 call 0041CB50 ------------------------->计算名字
:0041C037 83C404 add esp, 00000004
:0041C03A 03F0 add esi, eax
:0041C03C 8B44240C mov eax, dword ptr [esp+0C]
:0041C040 50 push eax
:0041C041 E80A0B0000 call 0041CB50 ------------------------->计算组织
:0041C046 83C404 add esp, 00000004
:0041C049 03C6 add eax, esi
:0041C04B 5E pop esi
:0041C04C C3 ret

发现它调用同一个函数，代码如下：（都是关键计算）

* Referenced by a CALL at Addresses:
|:004187B3 , :0041C032 , :0041C041
|
:0041CB50 53 push ebx
:0041CB51 56 push esi
:0041CB52 8B74240C mov esi, dword ptr [esp+0C]
:0041CB56 57 push edi
:0041CB57 55 push ebp
:0041CB58 33FF xor edi, edi
:0041CB5A 56 push esi

* Reference To: KERNEL32.lstrlenA, Ord:029Ch
|
:0041CB5B FF15A8654400 Call dword ptr [004465A8]
:0041CB61 85F6 test esi, esi
:0041CB63 7432 je 0041CB97
:0041CB65 85C0 test eax, eax
:0041CB67 742E je 0041CB97
:0041CB69 B900000000 mov ecx, 00000000
:0041CB6E 7E27 jle 0041CB97

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041CB95(C)
|
:0041CB70 0FBE9C0854DB4200 movsx ebx, byte ptr [eax+ecx+0042DB54]
:0041CB78 0FBE2C0E movsx ebp, byte ptr [esi+ecx]
:0041CB7C 8D5101 lea edx, dword ptr [ecx+01]
:0041CB7F 0FAFDD imul ebx, ebp
:0041CB82 0FBE898CDB4200 movsx ecx, byte ptr [ecx+0042DB8C]
:0041CB89 0FAFD9 imul ebx, ecx
:0041CB8C 0FAFDA imul ebx, edx
:0041CB8F 03FB add edi, ebx
:0041CB91 8BCA mov ecx, edx
:0041CB93 3BC2 cmp eax, edx
:0041CB95 7FD9 jg 0041CB70

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041CB63(C), :0041CB67(C), :0041CB6E(C)
|
:0041CB97 8BC7 mov eax, edi
:0041CB99 5D pop ebp
:0041CB9A 5F pop edi
:0041CB9B 5E pop esi
:0041CB9C 5B pop ebx
:0041CB9D C3 ret

五、 由于本人能力有限，不能写出注册机，还请大客们指教呀！它好象有一个对照表。

总结：
User Name:RATARICE[BCG]
Organization:peNcil grOup
Registration:4105493258

标 题:贴这个的注册机~~~~ (908字)
发信人:伪装者[CCG]
时 间:2001-7-29 0:56:49
详细信息:

 #include "stdio.h"
main()
{
char na[81],org[81];
char tb1[]="#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtkpzSdtzoXqmb^Al@dv:s?x/";
char tb2[]="|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw";
int i,d,a=0;
long c,e=0;
printf("*********TxEdit 4.6*********\nThis keygen is made by Pretender\nPlease
  input your name        :  ");
gets(na);
printf("Please input your Organization :  ");
gets(org);
printf("Your Registation number is    :  ");
d=strlen(na);
for(i=0;i<d;i++)
{c=tb1[d+i];
c*=na[i];
c*=tb2[i];
c*=(i+1);
e+=c;
}
d=strlen(org);
for(i=0;i<d;i++)
{c=tb1[d+i];
c*=org[i];
c*=tb2[i];
c*=(i+1);
e+=c;
}
e+=0xedc0deed|0x378;
printf("%lu",e);
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}


软件名称：TypingMaster98(Version: 4.0) 执行文件：Tamster4.EXE 3,703KB 下载地点：http://www.TypingMaster.com 发 信 人: 井 风 时 间: 2000-12-11 破解工具：Trw20001.22 解题难度：[专业] [学士] [硕士] [博士] ****** 前 言： 一看名字你就知道这个软件是干什么用的。不同数量的使用者用不同的注册码。 过 程: 1、用“井风跟踪”法（网友把我推崇的跟踪方法称为“井风跟踪”法，我暂且也这样称之）， 很容易找到计算和验证注册码的地方。具体方法请仔细阅读Winzip8.0之教学(很经典教学篇)。 2、提示：00457B1B CALL ******* <--- 此行为呼叫计算注册码子程序 00457B32 CALL ******* <--- 此行为呼叫验证注册码子程序 小 结： License type: Single user license 100 licence (network) Owner Name: CCCC CCCC Magic Key: 00002-02094-86560 00002-01894-42601 后 记： 有疑问请与我联系：hz.cy@163.net


Uedit32 8.0

 标 题:最近很忙,刚写了一篇Uedit32 8.0破解过程(高手莫入)! (12千字)
发信人:floatsnow
时 间:2001-5-7 12:26:52
详细信息:
Uedit32 8.0 破解过程

工具:
Sice4.5 W32dasm
如见采用key文件保护方式,用bpx createfilea do " d esp->4 "下断点,看到打
开的是文件Uedit32.reg时下断点bpx readfile.跟踪度写的数据到下面程序。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00468D47(C)
|
:00468D57 E8AAAA0500 call 004C3806
:00468D5C 8B7004 mov esi, dword ptr [eax+04]
:00468D5F E8A2AA0500 call 004C3806
:00468D64 8B4004 mov eax, dword ptr [eax+04]
:00468D67 05E8030000 add eax, 000003E8 // eax指向输入的用户名
:00468D6C 50 push eax // 下断点bpx eax
:00468D6D E80E910200 call 00491E80
:00468D72 59 pop ecx
:00468D73 C68430E803000020 mov byte ptr [eax+esi+000003E8], 20

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00468CA2(C), :00468CFB(C)
|
:00468D7B 8D4DE4 lea ecx, dword ptr [ebp-1C]
:00468D7E 885DFC mov byte ptr [ebp-04], bl
:00468D81 E8942E0400 call 004ABC1A
:00468D86 834DFCFF or dword ptr [ebp-04], FFFFFFFF
:00468D8A 8D4D10 lea ecx, dword ptr [ebp+10]
:00468D8D E8391D0400 call 004AAACB
:00468D92 33C0 xor eax, eax
:00468D94 EB12 jmp 00468DA8

按F5运行拦到后按F12从函数中返回
* Possible Reference to String Resource ID=00006: "Load Macro"
|
:00413847 6A06 push 00000006
:00413849 8065BF00 and byte ptr [ebp-41], 00
:0041384D 80A547FFFFFF00 and byte ptr [ebp+FFFFFF47], 00
:00413854 59 pop ecx
:00413855 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70]
:0041385B 50 push eax
:0041385C 8DBD70FFFFFF lea edi, dword ptr [ebp+FFFFFF70]
:00413862 FF750C push [ebp+0C]
:00413865 C68537FFFFFF30 mov byte ptr [ebp+FFFFFF37], 30
:0041386C F3 repz
:0041386D A5 movsd
:0041386E 80658700 and byte ptr [ebp-79], 00
:00413872 C68577FFFFFF30 mov byte ptr [ebp+FFFFFF77], 30
:00413879 C6857CFFFFFF30 mov byte ptr [ebp+FFFFFF7C], 30
:00413880 C6458630 mov [ebp-7A], 30
:00413884 C6853CFFFFFF30 mov byte ptr [ebp+FFFFFF3C], 30
:0041388B C68546FFFFFF30 mov byte ptr [ebp+FFFFFF46], 30
:00413892 E8A9FD0700 call 00493640
:00413897 59 pop ecx // 返回到这里
:00413898 59 pop ecx
:00413899 5E pop esi
:0041389A 85C0 test eax, eax
:0041389C 7523 jne 004138C1 //一定不等，跳转
:0041389E 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70]
:004138A4 50 push eax
:004138A5 FF750C push [ebp+0C]
:004138A8 E893FD0700 call 00493640
:004138AD 59 pop ecx
:004138AE 85C0 test eax, eax
:004138B0 59 pop ecx
:004138B1 7554 jne 00413907
:004138B3 FF750C push [ebp+0C]
:004138B6 E8C5E50700 call 00491E80
:004138BB 83F80C cmp eax, 0000000C
:004138BE 59 pop ecx
:004138BF 7446 je 00413907

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041389C(C)
|
:004138C1 8D45B0 lea eax, dword ptr [ebp-50] //比较的值，不知是什么
:004138C4 50 push eax
:004138C5 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70] //输入的注册码
:004138CB 50 push eax
:004138CC E86FFD0700 call 00493640 //作比较
:004138D1 59 pop ecx
:004138D2 85C0 test eax, eax //eax=1，比较不等
:004138D4 59 pop ecx
:004138D5 7429 je 00413900 //步跳转
:004138D7 8D8530FFFFFF lea eax, dword ptr [ebp+FFFFFF30] //真正的注册码
:004138DD 50 push eax
:004138DE 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70] //输入的注册码
:004138E4 50 push eax
:004138E5 E856FD0700 call 00493640 //比较
:004138EA 59 pop ecx
:004138EB 85C0 test eax, eax //如果相等eax=0
:004138ED 59 pop ecx
:004138EE 7410 je 00413900 //跳转就OK了！
:004138F0 C705C04E500001000000 mov dword ptr [00504EC0], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00413659(C), :00413662(C), :0041367A(C)
|
:004138FA 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041390A(U)
|
:004138FC 5F pop edi
:004138FD 5B pop ebx
:004138FE C9 leave
:004138FF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004138D5(C), :004138EE(C)
|
:00413900 8325C04E500000 and dword ptr [00504EC0], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004138B1(C), :004138BF(C)
|
:00413907 6A01 push 00000001
:00413909 58 pop eax
:0041390A EBF0 jmp 004138FC

我的用户名和注册码是：
Ultra Edit8.0 Name: floatsnow Sn: M2V3R-Q0N1J-08Z8W-G9B30

程序退出时对注册码的其中三位进行比较，下断点bpx deletefilea拦住后
按F12返回主程序向上着跳转。程序如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00468EAB(C)
|
:00468EB4 66813DF88E5000D007 cmp word ptr [00508EF8], 07D0
:00468EBD 0F8656010000 jbe 00469019
:00468EC3 66833DFA8E500001 cmp word ptr [00508EFA], 0001
:00468ECB 0F8648010000 jbe 00469019
:00468ED1 68D84D5000 push 00504DD8
:00468ED6 8D4DE4 lea ecx, dword ptr [ebp-1C]
:00468ED9 E862190400 call 004AA840
:00468EDE FF75E4 push [ebp-1C]
:00468EE1 895DFC mov dword ptr [ebp-04], ebx
:00468EE4 E8978F0200 call 00491E80
:00468EE9 A1BC4E5000 mov eax, dword ptr [00504EBC]
:00468EEE FF35CC4D5000 push dword ptr [00504DCC]
:00468EF4 8945F0 mov dword ptr [ebp-10], eax
:00468EF7 E8848F0200 call 00491E80
:00468EFC 59 pop ecx
:00468EFD 83F80F cmp eax, 0000000F
:00468F00 59 pop ecx
:00468F01 0F8206010000 jb 0046900D
:00468F07 391D9C8E5000 cmp dword ptr [00508E9C], ebx
:00468F0D 0F85FA000000 jne 0046900D
:00468F13 391DA08E5000 cmp dword ptr [00508EA0], ebx
:00468F19 0F84EE000000 je 0046900D
:00468F1F 0FB645F0 movzx eax, byte ptr [ebp-10]

* Possible Reference to String Resource ID=00025: "Dos Command"
|
:00468F23 6A19 push 00000019
:00468F25 8B3DCC4D5000 mov edi, dword ptr [00504DCC]
:00468F2B 99 cdq
:00468F2C 59 pop ecx
:00468F2D F7F9 idiv ecx
:00468F2F 0FBE4716 movsx eax, byte ptr [edi+16] //取注册码最后一位
:00468F33 83C241 add edx, 00000041
:00468F36 3BC2 cmp eax, edx //和真正的值进行比较
:00468F38 7530 jne 00468F6A //不等就跳，删除文件
:00468F3A 0FB645F0 movzx eax, byte ptr [ebp-10]

* Possible Reference to String Resource ID=00009: "

This copy of UltraEdit-32 is licensed to :

"
|
:00468F3E 6A09 push 00000009
:00468F40 99 cdq
:00468F41 59 pop ecx
:00468F42 F7F9 idiv ecx
:00468F44 0FBE4707 movsx eax, byte ptr [edi+07] //取注册码第7位
:00468F48 83C230 add edx, 00000030
:00468F4B 3BC2 cmp eax, edx //比较
:00468F4D 751B jne 00468F6A //不等跳到删除文件
:00468F4F 0FB645F0 movzx eax, byte ptr [ebp-10]
:00468F53 8A4F0C mov cl, byte ptr [edi+0C] //取注册码第12位

* Possible Reference to String Resource ID=00013: "Mod: "
|
:00468F56 6A0D push 0000000D
:00468F58 99 cdq
:00468F59 5F pop edi
:00468F5A F7FF idiv edi
:00468F5C 0FBEC1 movsx eax, cl //注册码第12位给eax
:00468F5F 83C241 add edx, 00000041
:00468F62 3BC2 cmp eax, edx //比较
:00468F64 0F84A3000000 je 0046900D //不等继续执行，删除文件
//相等则跳转
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00468F38(C), :00468F4D(C)
|
:00468F6A 891DA08E5000 mov dword ptr [00508EA0], ebx
:00468F70 E891A80500 call 004C3806
:00468F75 8B4004 mov eax, dword ptr [eax+04]
:00468F78 8D4DF0 lea ecx, dword ptr [ebp-10]
:00468F7B FFB08C000000 push dword ptr [eax+0000008C]
:00468F81 E8B31B0400 call 004AAB39
:00468F86 8B45F0 mov eax, dword ptr [ebp-10]
:00468F89 8D4DF0 lea ecx, dword ptr [ebp-10]
:00468F8C C645FC01 mov [ebp-04], 01
:00468F90 8B40F8 mov eax, dword ptr [eax-08]
:00468F93 83C0FD add eax, FFFFFFFD
:00468F96 50 push eax
:00468F97 8D45E0 lea eax, dword ptr [ebp-20]
:00468F9A 50 push eax
:00468F9B E8309B0300 call 004A2AD0

* Possible StringData Ref from Data Obj ->"REG"
|
:00468FA0 68E0B24F00 push 004FB2E0
:00468FA5 50 push eax
:00468FA6 8D45DC lea eax, dword ptr [ebp-24]
:00468FA9 C645FC02 mov [ebp-04], 02
:00468FAD 50 push eax
:00468FAE E8611D0400 call 004AAD14
:00468FB3 50 push eax
:00468FB4 8D4DF0 lea ecx, dword ptr [ebp-10]
:00468FB7 C645FC03 mov [ebp-04], 03
:00468FBB E8F81B0400 call 004AABB8
:00468FC0 8D4DDC lea ecx, dword ptr [ebp-24]
:00468FC3 C645FC02 mov [ebp-04], 02
:00468FC7 E8FF1A0400 call 004AAACB
:00468FCC 8D4DE0 lea ecx, dword ptr [ebp-20]
:00468FCF C645FC01 mov [ebp-04], 01
:00468FD3 E8F31A0400 call 004AAACB

* Possible Reference to Dialog: DialogID_0080
|

* Possible Reference to Dialog: DialogID_006E, CONTROL_ID:0080, "Details for registration can be found in"
|

* Possible Reference to String Resource ID=00128: "Lines containing find string:"
|
:00468FD8 6880000000 push 00000080
:00468FDD FF75F0 push [ebp-10]

* Reference To: KERNEL32.SetFileAttributesA, Ord:0268h
|
:00468FE0 FF1544434D00 Call dword ptr [004D4344]
:00468FE6 FF75F0 push [ebp-10]

* Reference To: KERNEL32.DeleteFileA, Ord:0057h
// 调用deletefilea删除文件Uedit32.reg
:00468FE9 FF1520434D00 Call dword ptr [004D4320]
:00468FEF A1D48E5000 mov eax, dword ptr [00508ED4]
:00468FF4 8D4DF0 lea ecx, dword ptr [ebp-10]
:00468FF7 83C0D2 add eax, FFFFFFD2
:00468FFA 885DFC mov byte ptr [ebp-04], bl
:00468FFD A3E08E5000 mov dword ptr [00508EE0], eax
:00469002 899E820D0000 mov dword ptr [esi+00000D82], ebx
:00469008 E8BE1A0400 call 004AAACB

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00468F01(C), :00468F0D(C), :00468F19(C), :00468F64(C)
|
:0046900D 834DFCFF or dword ptr [ebp-04], FFFFFFFF
:00469011 8D4DE4 lea ecx, dword ptr [ebp-1C]
:00469014 E8B21A0400 call 004AAACB

破解完成,整理注册码为:
Ultra Edit8.0 Name: floatsnow Sn: M2V3R-Q0N1J-E8Z8W-G9B3A
千万不要用我的呀!!!!!!!


ultimate zip cracker6.2

 标 题:ultimate zip cracker6.2破解小结，菜鸟文章，高手勿看。 (1千字)
发信人:hying[CCG]
时 间:2000-10-7 15:08:47
详细信息:
先压缩一个文件，加上密码。当然不能很长，除非你的耐心很好，而且不能用“1234”等，不然会与系统里的内容相同，我用“aSdF”。当然我走了不少弯路，为了照顾面子就不说了。嘻……
用暴力破解，大概一分钟后，它会告诉你它已经找到密码，但就是不对你说（不说我也知道，不就是aSdF吗）。这时候按ctrl-N（什么？没反应？赶快运行trw2000），运行命令s 0,ffffffff 'aSdF' 会找到一个地址，我的机器上是462D44，下断点bpm 462d44，然后返回window，关掉那个框，按“开始”再计算，马上被拦下，是一些mov、jmp之类的指令，不管它，g，当然你得耐心一些，要g很多次，最后看到指令rep movsb，将“aSdF”移到地址xxxxxxxx（为什么全是x？因为我记不得了）,bc上面的断点，下bpm xxxxxxxx，g，马上停在下面的地方
0167:00412AFA MOV EBX,EAX
0167:00412AFC LEA EDI,[ESP+AC]
0167:00412B03 OR ECX,BYTE -01
0167:00412B06 XOR EAX,EAX
0167:00412B08 REPNE SCASB <-停在这儿
0167:00412B0A NOT ECX
0167:00412B0C DEC ECX
0167:00412B0D CMP ECX,BYTE +04
0167:00412B10 JNC 00412B80
0167:00412B12 LEA ECX,[ESP+AC]
0167:00412B19 LEA EDX,[ESP+1C]
各位应该看得出来，上面那一段的意思是先看一下密码有几位，再判断如果大于等于4位就跳，当然将那个JNC改为NOP就可以了。
当然，只改这一处只能解决3位密码的限制，智能破解、字典破解等还有问题，我偷懒就不说了，大家自己看一下吧，改动的是一些JMP指令，都离上面的地址不远。
疏漏之处，各位包涵。
hying[CCG]


UltraEdit-32 8.10.1.0

 标 题:UltraEdit-32 8.10.1.0的破解及注册机的生成 (15千字)
发信人:CoolBob[CCG]
时 间:2001-5-15 1:46:44
详细信息:
UltraEdit-32 8.10.1.0的破解及注册机的生成
1、这个软件的注册机网上早就有了，我写这篇教程主要是用来交流。希望起到抛砖引玉的功效^O^
2、下载：http://www.ultraedit.com/
3、破解必备工具：TRW2000或者SoftICE，W32Dasm，大脑:)
4、因为这个程序没有加壳，所以有1M多。未注册版好像有个时间限制，Hmmm我对去除时间限制不感兴趣，我要的是注册机。这个程序注册后会在主程序目录下生成一个与主程序同名的×.reg的文件。Ok，Let's go!
5、先在Help菜单下找到Register UltraEdit-32，点击会弹出一个对话框。填入你的大名，还有注册码。我用，CoolBob，12345－54321-67890-09876。为什么知道注册码是这个格式呢，因为我跟踪过。你也可以在内存中看到这个格式。这里就不罗嗦了。填好后，点击OK按钮。呼啦一下，那个目录下多出来一个文件，这个文件名跟主程序的名字一样，扩展名为reg。嘿嘿，这个时候可以猜想这个文件就是它的keyfile，程序启动的时候肯定会去检验的，下什么断点呢？试试Bpx readfile do "d esp-100",用Symbol Loader装载UltraEdit-32。按几次F5你会在SoftICE的数据窗口看到C:\Program Files\UltraEdit\UEDIT32.reg字样，这个时候就要小心跟踪了，F12跳出来。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00468949(C)
|
:00468925 8A8C3579FDFFFF mov cl, byte ptr [ebp+esi-00000287]
:0046892C 8A843578FDFFFF mov al, byte ptr [ebp+esi-00000288]
:00468933 FEC9 dec cl
:00468935 FEC8 dec al
:00468937 888C357CFEFFFF mov byte ptr [ebp+esi-00000184], cl
:0046893E 8884357DFEFFFF mov byte ptr [ebp+esi-00000183], al
:00468945 46 inc esi
:00468946 46 inc esi
:00468947 3BF7 cmp esi, edi
:00468949 7EDA jle 00468925
:0046894B 8D857CFEFFFF lea eax, dword ptr [ebp+FFFFFE7C]
在这里把UEDIT32.reg里的数据解码，现在下d eax呵呵，看到什么了？
接下来就简单了，bpr 上面的那段数据。再F5让SoftICE尽情狂奔，一步一步跟到这里
:004136AE 0FBE740DAF movsx esi, byte ptr [ebp+ecx-51]
:004136B3 0FBE7C0DB1 movsx edi, byte ptr [ebp+ecx-4F]
:004136B8 46 inc esi
:004136B9 0FAFF7 imul esi, edi
:004136BC 03F1 add esi, ecx
:004136BE 0175FC add dword ptr [ebp-04], esi
:004136C1 41 inc ecx
:004136C2 3BC8 cmp ecx, eax
:004136C4 7CE8 jl 004136AE
把你的名字经过一番运算，后保存在ebp－04这个地方，看看ebp-04上面来头，下Bpm ebp-04.接下来的运算还真变态，看看吧
:004136C6 33FF xor edi, edi
:004136C8 8955F8 mov dword ptr [ebp-08], edx
:004136CB 8D45B0 lea eax, dword ptr [ebp-50]
:004136CE 33C9 xor ecx, ecx
:004136D0 2945F8 sub dword ptr [ebp-08], eax
:004136D3 897D10 mov dword ptr [ebp+10], edi
:004136D6 891D8C3E5000 mov dword ptr [00503E8C], ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004137C9(C)
|
:004136DC 8B45F8 mov eax, dword ptr [ebp-08]
:004136DF 8D740DB0 lea esi, dword ptr [ebp+ecx-50]
:004136E3 03C6 add eax, esi
:004136E5 83F83C cmp eax, 0000003C
:004136E8 7D42 jge 0041372C
:004136EA 8BC1 mov eax, ecx

* Possible Reference to Dialog: DialogID_0604, CONTROL_ID:0004, "Replace All"
|

* Possible Reference to String Resource ID=00004: "*.MAC"
|
:004136EC 6A04 push 00000004//注意这些数字
:004136EE 99 cdq
:004136EF 5F pop edi
:004136F0 F7FF idiv edi
:004136F2 8BC1 mov eax, ecx

* Possible Reference to Dialog: DialogID_0605, CONTROL_ID:0020, ""
|

* Possible Reference to String Resource ID=00032: "

Any changes will be lost and the file deleted!"
|
:004136F4 6A20 push 00000020//注意这些数字
:004136F6 5B pop ebx

* Possible Reference to String Resource ID=00059: "Select File to Compare"
|
:004136F7 6A3B push 0000003B//注意这些数字
:004136F9 8BFA mov edi, edx
:004136FB 99 cdq
:004136FC F7FB idiv ebx
:004136FE 8BC2 mov eax, edx
:00413700 99 cdq
:00413701 2BC2 sub eax, edx
:00413703 8B14BD00A04F00 mov edx, dword ptr [4*edi+004FA000]//CRC
:0041370A D1F8 sar eax, 1
:0041370C 5F pop edi
:0041370D 0FB60402 movzx eax, byte ptr [edx+eax]//取一些数据来
:00413711 8AD1 mov dl, cl
:00413713 0255FC add dl, byte ptr [ebp-04]
:00413716 0FB6D2 movzx edx, dl
:00413719 33C2 xor eax, edx
:0041371B 99 cdq
:0041371C F7FF idiv edi
:0041371E 8B7D10 mov edi, dword ptr [ebp+10]
:00413721 8A4415B0 mov al, byte ptr [ebp+edx-50]
:00413725 02C1 add al, cl
:00413727 324601 xor al, byte ptr [esi+01]
:0041372A 8806 mov byte ptr [esi], al//保存al的值，后面有用

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004136E8(C)
|
:0041372C 83FF3C cmp edi, 0000003C
:0041372F 7D71 jge 004137A2
:00413731 8BC1 mov eax, ecx

* Possible Reference to String Resource ID=00005: "ULTRAEDT.MAC"
|
:00413733 6A05 push 00000005//注意这些数字，无非就是整除、求余
:00413735 99 cdq
:00413736 5B pop ebx
:00413737 F7FB idiv ebx
:00413739 8BDA mov ebx, edx
:0041373B 85DB test ebx, ebx//ebx=0,dl=esi%1a+0x41
:0041373D 895DF0 mov dword ptr [ebp-10], ebx
:00413740 740A je 0041374C
:00413742 83FB02 cmp ebx, 00000002//和ebx＝0一样的运算
:00413745 7405 je 0041374C
:00413747 83FB04 cmp ebx, 00000004//和ebx＝0一样的运算
:0041374A 751A jne 00413766

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00413740(C), :00413745(C)
|
:0041374C 0FB606 movzx eax, byte ptr [esi]

* Possible Reference to String Resource ID=00026: "Run Windows Program"
|
:0041374F 6A1A push 0000001A
:00413751 99 cdq
:00413752 5B pop ebx
:00413753 F7FB idiv ebx
:00413755 8B5DF0 mov ebx, dword ptr [ebp-10]
:00413758 80C241 add dl, 41
:0041375B 88943D30FFFFFF mov byte ptr [ebp+edi-000000D0], dl//这里存放注册码
:00413762 47 inc edi
:00413763 897D10 mov dword ptr [ebp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041374A(C)
|
:00413766 83FF3C cmp edi, 0000003C
:00413769 7D37 jge 004137A2
:0041376B 83FB01 cmp ebx, 00000001//ebx=1,3时，dl＝esi%0xa+0x30
:0041376E 7405 je 00413775
:00413770 83FB03 cmp ebx, 00000003
:00413773 7517 jne 0041378C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041376E(C)
|
:00413775 0FB606 movzx eax, byte ptr [esi]

* Possible Reference to String Resource ID=00010: "

Thank you for supporting Shareware."
|
:00413778 6A0A push 0000000A
:0041377A 99 cdq
:0041377B 5E pop esi
:0041377C F7FE idiv esi
:0041377E 80C230 add dl, 30
:00413781 88943D30FFFFFF mov byte ptr [ebp+edi-000000D0], dl//这里存放注册码
:00413788 47 inc edi
:00413789 897D10 mov dword ptr [ebp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00413773(C)
|
:0041378C 83FF3C cmp edi, 0000003C
:0041378F 7D11 jge 004137A2
:00413791 83FB04 cmp ebx, 00000004
:00413794 750C jne 004137A2
:00413796 C6843D30FFFFFF2D mov byte ptr [ebp+edi-000000D0], 2D//插入‘－’
:0041379E 47 inc edi
:0041379F 897D10 mov dword ptr [ebp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041372F(C), :00413769(C), :0041378F(C), :00413794(C)
|
:004137A2 85C9 test ecx, ecx
:004137A4 7E1F jle 004137C5
:004137A6 3B4DF4 cmp ecx, dword ptr [ebp-0C]//ebp-0C里保存的是name的位数
:004137A9 7D1A jge 004137C5
:004137AB 3B7DF4 cmp edi, dword ptr [ebp-0C]
:004137AE 7D15 jge 004137C5
:004137B0 8B4508 mov eax, dword ptr [ebp+08]
:004137B3 0FBE5401FF movsx edx, byte ptr [ecx+eax-01]//这里要注意
:004137B8 0FBE0407 movsx eax, byte ptr [edi+eax]//把你的名字再次运算
:004137BC 0FAFD0 imul edx, eax
:004137BF 01158C3E5000 add dword ptr [00503E8C], edx//保存在这里

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004137A4(C), :004137A9(C), :004137AE(C)
|
:004137C5 41 inc ecx
:004137C6 83F93C cmp ecx, 0000003C
:004137C9 0F8C0DFFFFFF jl 004136DC
很明显上面是一个嵌套循环，我第一次在这里找到了一个注册码，然后急忙bd*离开SoftICE；到程序中一注册关闭程序验证，没有提示框，并且help菜单的about里也显示注册成功，呵呵，这么快就搞定了？当我关掉程序后，发现那个UEDIT.reg被删除了，昏～，程序中肯定还有其他的地方比较注册码，并且调用Deletefilea等api来删掉文件，很好的突破口！用刚才的注册码再注册一次，跑到SoftICE里下，Bpx Deletefilea.然后关掉程序
Hmmm，又来到SoftICE里，F12跳出来，向上找找看，有没有运算比较跳跃的地方，这里很呛眼

:00468B64 A18C3E5000 mov eax, dword ptr [00503E8C]//这个00503E8C还记得吗？
:00468B69 FF35983D5000 push dword ptr [00503D98]
:00468B6F 8945F0 mov dword ptr [ebp-10], eax
:00468B72 E8F98E0200 call 00491A70
:00468B77 59 pop ecx
:00468B78 83F80F cmp eax, 0000000F
:00468B7B 59 pop ecx
:00468B7C 0F8206010000 jb 00468C88
:00468B82 391D6C7E5000 cmp dword ptr [00507E6C], ebx
:00468B88 0F85FA000000 jne 00468C88
:00468B8E 391D707E5000 cmp dword ptr [00507E70], ebx
:00468B94 0F84EE000000 je 00468C88
:00468B9A 0FB645F0 movzx eax, byte ptr [ebp-10]//取出的是上面第二次name运算值

* Possible Reference to String Resource ID=00025: "Dos Command"
|
:00468B9E 6A19 push 00000019//这里就很呛眼
:00468BA0 8B3D983D5000 mov edi, dword ptr [00503D98]
:00468BA6 99 cdq
:00468BA7 59 pop ecx
:00468BA8 F7F9 idiv ecx
:00468BAA 0FBE4716 movsx eax, byte ptr [edi+16]//我们输入注册码的第23位
:00468BAE 83C241 add edx, 00000041
:00468BB1 3BC2 cmp eax, edx
:00468BB3 7530 jne 00468BE5
:00468BB5 0FB645F0 movzx eax, byte ptr [ebp-10]

* Possible Reference to String Resource ID=00009: "

This copy of UltraEdit-32 is licensed to :

"
|
:00468BB9 6A09 push 00000009//还有
:00468BBB 99 cdq
:00468BBC 59 pop ecx
:00468BBD F7F9 idiv ecx
:00468BBF 0FBE4707 movsx eax, byte ptr [edi+07]//我们输入注册码的第8位
:00468BC3 83C230 add edx, 00000030
:00468BC6 3BC2 cmp eax, edx
:00468BC8 751B jne 00468BE5
:00468BCA 0FB645F0 movzx eax, byte ptr [ebp-10]
:00468BCE 8A4F0C mov cl, byte ptr [edi+0C]//我们输入注册码的第13位

* Possible Reference to String Resource ID=00013: "Mod: "
|
:00468BD1 6A0D push 0000000D//第三个
:00468BD3 99 cdq
:00468BD4 5F pop edi
:00468BD5 F7FF idiv edi
:00468BD7 0FBEC1 movsx eax, cl
:00468BDA 83C241 add edx, 00000041
:00468BDD 3BC2 cmp eax, edx
:00468BDF 0F84A3000000 je 00468C88
总算搞明白了，呵呵，就是把
:004137BF 01158C3E5000 add dword ptr [00503E8C], edx//保存在这里
这里保存的数值取出来经过三次运算：1、edi%0x19+0x41与byte ptr [edi+16]比较
2、eax%0x9+0x30与byte ptr [edi+07]比较
3、eax%0xD+0x41与byte ptr [edi+0C]比较
有一个不相等，嘿嘿，就把那个×.reg删掉！
到这里注册机应该不难做了:)
6、注册机
－－－－－－－－－－－－－－－－start here－－－－－－－－－－－－－－－－－－－－－－
#include <stdio.h>
main()
{ int i,n,nm=0;
int j=0;
int k=0;
int ebp_04=0;int ebp_08=0;
int esi;
char code[23];
char name[60];
unsigned char a0[]={0x2f,0,0xde,0,0x43,0,0xa5,0,0xd8,0,0xef,0,0x8e,0,0x66,0};
unsigned char a1[]={0x38,0,0x8f,0,0x65,0,0x5a,0,0xd3,0,0x1f,0,0x78,0,0x6f,0};
unsigned char a2[]={0,0x1f,0,0xcb,0,0x98,0,0xf3,0,0x10,0,0xf1,0,0xa5,0,0x2f};
unsigned char a3[]={0,0x73,0,0x34,0,0x77,0,0x33,0,0xfe,0,0xe0,0,0x73,0,0x78};
printf("UltraEdit-32 8.10.1.0 keymaker by CoolBob[CCG],written at 2001-5-15\n");
printf("\nyour name(at least 6 numbers and not exceed 60):");
scanf("%s",name);
n=strlen(name);
for (i=1,j=2;(i<n)&&(j<n);i++,j++){
if((i%5==4)&&(i>0)) j++;
ebp_08=ebp_08+name[i-1]*name[j];};
ebp_08=ebp_08&0x00ff;
for (i=0;i<n-1;i++) {
ebp_04=ebp_04+(name[i]+1)*name[i+2]+i;
};
ebp_04=ebp_04&0x00ff;
name[strlen(name)]=0;
for (i=strlen(name)+1;i<0x3c;i++){name[i]=i;};
for (i=0;i<20;i++){
if(i%4==0){
esi=(a0[i/2]^((i+ebp_04)&0x00ff))%0x3b;
esi=name[esi]+i;
esi=esi^name[i+1];
name[i]=esi;
if ((i%5==0)||(i%5==2)||(i%5==4)) esi=esi%0x1a+0x41;
else esi=esi%0xa+0x30;
};
if(i%4==1){
esi=(a1[i/2]^((i+ebp_04)&0x00ff))%0x3b;
esi=name[esi]+i;
esi=esi^name[i+1];
name[i]=esi;
if ((i%5==0)||(i%5==2)||(i%5==4)) esi=esi%0x1a+0x41;
else esi=esi%0xa+0x30;
};
if(i%4==2){
esi=(a2[i/2]^((i+ebp_04)&0x00ff))%0x3b;
esi=name[esi]+i;
esi=esi^name[i+1];
name[i]=esi;
if ((i%5==0)||(i%5==2)||(i%5==4)) esi=esi%0x1a+0x41;
else esi=esi%0xa+0x30;
};
if(i%4==3){
esi=(a3[i/2]^((i+ebp_04)&0x00ff))%0x3b;
esi=name[esi]+i;
esi=esi^name[i+1];
name[i]=esi;
if ((i%5==0)||(i%5==2)||(i%5==4)) esi=esi%0x1a+0x41;
else esi=esi%0xa+0x30;
};

if((i%5==0)&&(i>0)) {code[k++]='-';} code[k++]=esi;

};
code[22]=ebp_08%0x19+0x41;
code[7]=ebp_08%0x9+0x30;
code[12]=ebp_08%0xd+0x41;
code[23]=0;
printf("code is: %s",code);
printf("\nPress any key to exit!\n");
getch();
}

－－－－－－－－－－－－－－－－－end here－－－－－－－－－－－－－－－－－－－－－－－－－


unfoxall 2.1

 标 题:unfoxall 2.1
发信人:CrackerABC[BCG]
时 间:2001-5-27 17:24:20
详细信息:
标题: 用冲击波找到入口为4A50CC，然后用trw2000载入unfoxall，下断点bpx 4a50cc,F5后又被拦截，下pedump abc.exe，X退出，得到的abc.exe就是了。

内容:

标 题:这里是关键部分的代码段。 (8千字)
发信人:CrackerABC[BCG]
时 间:2001-5-27 17:20:56
详细信息:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048AAE4(C)
|
:0048AAF2 6A00 push 00000000
:0048AAF4 8D45F8 lea eax, dword ptr [ebp-08]
:0048AAF7 50 push eax

* Possible StringData Ref from Data Obj ->"UserName"
|
:0048AAF8 B9CCAD4800 mov ecx, 0048ADCC

* Possible StringData Ref from Data Obj ->"UserInfo"
|
:0048AAFD BAE0AD4800 mov edx, 0048ADE0
:0048AB02 8BC3 mov eax, ebx
:0048AB04 8B38 mov edi, dword ptr [eax]
:0048AB06 FF17 call dword ptr [edi]
:0048AB08 6A00 push 00000000
:0048AB0A 8D45F4 lea eax, dword ptr [ebp-0C]
:0048AB0D 50 push eax

* Possible StringData Ref from Data Obj ->"UserCompany"
|
:0048AB0E B9F4AD4800 mov ecx, 0048ADF4

* Possible StringData Ref from Data Obj ->"UserInfo"
|
:0048AB13 BAE0AD4800 mov edx, 0048ADE0
:0048AB18 8BC3 mov eax, ebx
:0048AB1A 8B38 mov edi, dword ptr [eax]
:0048AB1C FF17 call dword ptr [edi]
:0048AB1E 6A00 push 00000000
:0048AB20 8D45F0 lea eax, dword ptr [ebp-10]
:0048AB23 50 push eax

* Possible StringData Ref from Data Obj ->"UserEmail"
|
:0048AB24 B908AE4800 mov ecx, 0048AE08

* Possible StringData Ref from Data Obj ->"UserInfo"
|
:0048AB29 BAE0AD4800 mov edx, 0048ADE0
:0048AB2E 8BC3 mov eax, ebx
:0048AB30 8B38 mov edi, dword ptr [eax]
:0048AB32 FF17 call dword ptr [edi]
:0048AB34 6A00 push 00000000
:0048AB36 8D45EC lea eax, dword ptr [ebp-14]
:0048AB39 50 push eax

* Possible StringData Ref from Data Obj ->"UserKey"
|
:0048AB3A B91CAE4800 mov ecx, 0048AE1C

* Possible StringData Ref from Data Obj ->"UserInfo"
|
:0048AB3F BAE0AD4800 mov edx, 0048ADE0
:0048AB44 8BC3 mov eax, ebx
:0048AB46 8B38 mov edi, dword ptr [eax]
:0048AB48 FF17 call dword ptr [edi] //----->设断点的地方

* Possible StringData Ref from Data Obj ->"[Not Registered]"
|
:0048AB4A 682CAE4800 push 0048AE2C
:0048AB4F 8D45E8 lea eax, dword ptr [ebp-18]
:0048AB52 50 push eax

* Possible StringData Ref from Data Obj ->"SerialNumber"
|
:0048AB53 B948AE4800 mov ecx, 0048AE48

* Possible StringData Ref from Data Obj ->"UserInfo"
|
:0048AB58 BAE0AD4800 mov edx, 0048ADE0
:0048AB5D 8BC3 mov eax, ebx
:0048AB5F 8B38 mov edi, dword ptr [eax]
:0048AB61 FF17 call dword ptr [edi]
:0048AB63 8D55E4 lea edx, dword ptr [ebp-1C]
:0048AB66 8B45F8 mov eax, dword ptr [ebp-08]
:0048AB69 E822D8F7FF call 00408390
:0048AB6E FF75E4 push [ebp-1C]
:0048AB71 8D55E0 lea edx, dword ptr [ebp-20]
:0048AB74 8B45F4 mov eax, dword ptr [ebp-0C]
:0048AB77 E814D8F7FF call 00408390
:0048AB7C FF75E0 push [ebp-20]
:0048AB7F 8D55DC lea edx, dword ptr [ebp-24]
:0048AB82 8B45F0 mov eax, dword ptr [ebp-10]
:0048AB85 E806D8F7FF call 00408390
:0048AB8A FF75DC push [ebp-24]
:0048AB8D A184864A00 mov eax, dword ptr [004A8684]
:0048AB92 33D2 xor edx, edx
:0048AB94 52 push edx
:0048AB95 50 push eax
:0048AB96 8D45D4 lea eax, dword ptr [ebp-2C]
:0048AB99 E80AD9F7FF call 004084A8
:0048AB9E 8B45D4 mov eax, dword ptr [ebp-2C]
:0048ABA1 8D55D8 lea edx, dword ptr [ebp-28]
:0048ABA4 E8E7D7F7FF call 00408390
:0048ABA9 FF75D8 push [ebp-28]
:0048ABAC B8A8AA5400 mov eax, 0054AAA8
:0048ABB1 BA04000000 mov edx, 00000004
:0048ABB6 E80D93F7FF call 00403EC8
:0048ABBB B88CAA5400 mov eax, 0054AA8C
:0048ABC0 8B55E8 mov edx, dword ptr [ebp-18]
:0048ABC3 E81890F7FF call 00403BE0
:0048ABC8 A1A8AA5400 mov eax, dword ptr [0054AAA8]
:0048ABCD E83692F7FF call 00403E08
:0048ABD2 50 push eax
:0048ABD3 B8A8AA5400 mov eax, 0054AAA8
:0048ABD8 E8FB93F7FF call 00403FD8
:0048ABDD 5A pop edx
:0048ABDE E8F51DFEFF call 0046C9D8
:0048ABE3 35F4C5C2C4 xor eax, C4C2C5F4
:0048ABE8 33D2 xor edx, edx
:0048ABEA 52 push edx
:0048ABEB 50 push eax
:0048ABEC 8D55E4 lea edx, dword ptr [ebp-1C]
:0048ABEF B808000000 mov eax, 00000008
:0048ABF4 E81FD9F7FF call 00408518
:0048ABF9 8B55E4 mov edx, dword ptr [ebp-1C]
:0048ABFC B8A8AA5400 mov eax, 0054AAA8
:0048AC01 E8DA8FF7FF call 00403BE0
:0048AC06 B890AA5400 mov eax, 0054AA90
:0048AC0B 8B158CAA5400 mov edx, dword ptr [0054AA8C]
:0048AC11 E8CA8FF7FF call 00403BE0
:0048AC16 8B45EC mov eax, dword ptr [ebp-14]
:0048AC19 8B15A8AA5400 mov edx, dword ptr [0054AAA8]
:0048AC1F E8F492F7FF call 00403F18
:0048AC24 0F84A8000000 je 0048ACD2
:0048AC2A 33D2 xor edx, edx
:0048AC2C 8B86E4020000 mov eax, dword ptr [esi+000002E4]
:0048AC32 E8851FFBFF call 0043CBBC
:0048AC37 33D2 xor edx, edx
:0048AC39 8B86E8020000 mov eax, dword ptr [esi+000002E8]
:0048AC3F E8781FFBFF call 0043CBBC
:0048AC44 33D2 xor edx, edx
:0048AC46 8B86F0020000 mov eax, dword ptr [esi+000002F0]
:0048AC4C E86B1FFBFF call 0043CBBC
:0048AC51 33D2 xor edx, edx
:0048AC53 8B86F4020000 mov eax, dword ptr [esi+000002F4]
:0048AC59 E85E1FFBFF call 0043CBBC
:0048AC5E 33D2 xor edx, edx
:0048AC60 8B8644030000 mov eax, dword ptr [esi+00000344]
:0048AC66 E8511FFBFF call 0043CBBC
:0048AC6B 33D2 xor edx, edx
:0048AC6D 8B8648030000 mov eax, dword ptr [esi+00000348]
:0048AC73 E8441FFBFF call 0043CBBC
:0048AC78 33D2 xor edx, edx
:0048AC7A 8B8600030000 mov eax, dword ptr [esi+00000300]
:0048AC80 8B08 mov ecx, dword ptr [eax]
:0048AC82 FF5160 call [ecx+60]
:0048AC85 33D2 xor edx, edx
:0048AC87 8B8604030000 mov eax, dword ptr [esi+00000304]
:0048AC8D 8B08 mov ecx, dword ptr [eax]
:0048AC8F FF5160 call [ecx+60]
:0048AC92 33D2 xor edx, edx
:0048AC94 8B8608030000 mov eax, dword ptr [esi+00000308]
:0048AC9A 8B08 mov ecx, dword ptr [eax]
:0048AC9C FF5160 call [ecx+60]
:0048AC9F 33D2 xor edx, edx
:0048ACA1 8B860C030000 mov eax, dword ptr [esi+0000030C]
:0048ACA7 8B08 mov ecx, dword ptr [eax]
:0048ACA9 FF5160 call [ecx+60]
:0048ACAC 33D2 xor edx, edx
:0048ACAE 8B867C030000 mov eax, dword ptr [esi+0000037C]
:0048ACB4 8B08 mov ecx, dword ptr [eax]
:0048ACB6 FF5160 call [ecx+60]
:0048ACB9 33D2 xor edx, edx
:0048ACBB 8B8680030000 mov eax, dword ptr [esi+00000380]
:0048ACC1 8B08 mov ecx, dword ptr [eax]
:0048ACC3 FF5160 call [ecx+60]
:0048ACC6 8BC3 mov eax, ebx
:0048ACC8 E8CB82F7FF call 00402F98
:0048ACCD E9B1000000 jmp 0048AD83

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

标 题:UNFOXALL 2.1 注册码破解 (1千字)
发信人:norda
时 间:2001-5-27 17:04:51
详细信息:

UNFOXALL 2.1 注册码破解

破解者:NORDA

工具:TRW2000 1.23

过 程:

1、起动程序，命令按钮皆为灰色，不可用。点“帮助”中“关于UnFoxAll”菜单项，进入关于本
程序窗口，点“注册”按钮，填入姓名，公司,Email，点“生成注册文件”；

2、在UNFOXALL的目录中打开刚才生成的文件UNFOXALL.INI，填上SerialNumber=CYCYCYCY，关闭
并保存文件。按“注册UNFOXALL”，利用刚才生成的UNFOXALL.INI注册，关闭程序；

3、用TRW装载程序，设断点 BPX 48ab48

运行UNFOXALL

中断在此
016F:0048AB48 CALL NEAR [EDI]
016F:0048AB4A PUSH DWORD 0048AE2C
016F:0048AB4F LEA EAX,[EBP-18]
016F:0048AB52 PUSH EAX
016F:0048AB53 MOV ECX,0048AE48
016F:0048AB58 MOV EDX,0048ADE0
016F:0048AB5D MOV EAX,EBX
016F:0048AB5F MOV EDI,[EAX]
016F:0048AB61 CALL NEAR [EDI]
016F:0048AB63 LEA EDX,[EBP-1C]
016F:0048AB66 MOV EAX,[EBP-08]
016F:0048AB69 CALL 00408390
016F:0048AB6E PUSH DWORD [EBP-1C]
016F:0048AB71 LEA EDX,[EBP-20]

在设断点 BPX 403F41
G
中断大约二到三次以后,D ESI 可看见注册码
:00403F41 8B0E mov ecx, dword ptr [esi] <----- D ESI 注册码
:00403F43 8B1F mov ebx, dword ptr [edi] <----- D EDI 输入 CYCYCYCY
:00403F45 39D9 cmp ecx, ebx
:00403F47 7558 jne 00403FA1

后记:多谢CrackerABC[BCG]大哥转帖的贴子,使我从井风大哥的教学里学到很多.


URL Manager2.42

 标 题:刚才和几个老师去喝酒，太急了，现在连下载地址写上，完整些。 (8千字)
发信人:CrackerABC[BCG]
时 间:2001-5-8 20:45:18
详细信息:
URL Manager2.42破解过程

帮你分类管理你喜爱的网页位置。可以直接自HTML文件或是以逗号区隔资料的文件输入网页资料。同样也可输出成为HTML格式或是纯文本文件，以方便使用。

下载地址：URL http://www.soft999.com/download1/um2000si.zip

首先调快日期一年，出现过期提示对话，记下来，等会要用的。
然后用w32dsm反汇编，查找出错对话框中的字符串，找到下面的位置：

* Reference To: c5runx.Cla$Stack2DStack, Ord:01ACh
|
:00446AF5 FF150CD94D00 Call dword ptr [004DD90C]

* Reference To: c5runx.Cla$DPopLong, Ord:0074h
|
:00446AFB FF1578D64D00 Call dword ptr [004DD678]
:00446B01 89842434010000 mov dword ptr [esp+00000134], eax
:00446B08 83BC243401000000 cmp dword ptr [esp+00000134], 00000000
:00446B10 752C jne 00446B3E //----> 9090 nop nop(不能改为742C，不信你试试)
//----> 因为程序要产生文件，然后判断时间
* Reference To: c5runx.Cla$TODAY, Ord:01E2h
|
:00446B12 E801A9FBFF Call 00401418

* Reference To: c5runx.Cla$PushLong, Ord:0166h
|
:00446B17 FF1574D84D00 Call dword ptr [004DD874]

* Possible StringData Ref from Data Obj ->"ID"
|
:00446B1D B8B04F4C00 mov eax, 004C4FB0
:00446B22 BB02000000 mov ebx, 00000002

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00446B27 FF1584D84D00 Call dword ptr [004DD884]
:00446B2D E8BA010000 call 00446CEC

* Reference To: c5runx.Cla$TODAY, Ord:01E2h
|
:00446B32 E8E1A8FBFF Call 00401418
:00446B37 89842434010000 mov dword ptr [esp+00000134], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00446B10(C) //----------------->修改点
|

* Reference To: c5runx.Cla$TODAY, Ord:01E2h
|
:00446B3E E8D5A8FBFF Call 00401418
:00446B43 2B842434010000 sub eax, dword ptr [esp+00000134]
:00446B4A 83F81E cmp eax, 0000001E
:00446B4D 7E52 jle 00446BA1
:00446B4F B800000000 mov eax, 00000000
:00446B54 BB00000000 mov ebx, 00000000

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00446B59 FF1584D84D00 Call dword ptr [004DD884]
:00446B5F B800000000 mov eax, 00000000
:00446B64 BB00000000 mov ebx, 00000000

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00446B69 FF1584D84D00 Call dword ptr [004DD884]

* Possible StringData Ref from Data Obj ->"Shareware"
|
:00446B6F B8F04F4C00 mov eax, 004C4FF0
:00446B74 BB09000000 mov ebx, 00000009

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00446B79 FF1584D84D00 Call dword ptr [004DD884]

* Possible StringData Ref from Data Obj ->"Thank you for evaluating URL Manager "
->"2000. The 30-day evaluation period "
->"is now over. Please consult the "
->"help file for information on how "
->"to registered and purchase URL "
->"Manager 2000 today!" //---------->出错对话框
|
:00446B7F B8FC4F4C00 mov eax, 004C4FFC
:00446B84 BBBD000000 mov ebx, 000000BD

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00446B89 FF1584D84D00 Call dword ptr [004DD884]
:00446B8F 6A00 push 00000000
:00446B91 B000 mov al, 00
:00446B93 B301 mov bl, 01
:00446B95 B101 mov cl, 01
:00446B97 BA00000000 mov edx, 00000000

* Reference To: c5runx.Cla$MessageBox, Ord:012Eh

去掉共享版的字样
* Reference To: c5runx.Cla$comparestr, Ord:0041h
|
:0044465A FF1518D64D00 Call dword ptr [004DD618]
:00444660 83F800 cmp eax, 00000000
:00444663 0F84B3000000 je 0044471C //-------> 0F85B3000000 jne 0044471C
:00444669 B8007C0000 mov eax, 00007C00

* Reference To: c5runx.Cla$PushLong, Ord:0166h
|
:0044466E FF1574D84D00 Call dword ptr [004DD874]
:00444674 B810AF4900 mov eax, 0049AF10
:00444679 BB14000000 mov ebx, 00000014

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:0044467E FF1584D84D00 Call dword ptr [004DD884]

* Reference To: c5runx.Cla$StackCLIP, Ord:01B2h
|
:00444684 E81FCDFBFF Call 004013A8

* Possible StringData Ref from Data Obj ->" Version "
|
:00444689 B854374C00 mov eax, 004C3754
:0044468E BB09000000 mov ebx, 00000009

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00444693 FF1584D84D00 Call dword ptr [004DD884]

* Reference To: c5runx.Cla$StackConcat, Ord:01B6h
|
:00444699 FF1528D94D00 Call dword ptr [004DD928]
:0044469F 8B45FC mov eax, dword ptr [ebp-04]
:004446A2 8D40E8 lea eax, dword ptr [eax-18]
:004446A5 BB14000000 mov ebx, 00000014

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:004446AA FF1584D84D00 Call dword ptr [004DD884]

* Reference To: c5runx.Cla$StackConcat, Ord:01B6h
|
:004446B0 FF1528D94D00 Call dword ptr [004DD928]
:004446B6 B804000000 mov eax, 00000004
:004446BB BB00000000 mov ebx, 00000000
:004446C0 B900000000 mov ecx, 00000000

* Reference To: c5runx.Cla$SetPropS, Ord:019Fh
|
:004446C5 FF15F4D84D00 Call dword ptr [004DD8F4]
:004446CB B810AF4900 mov eax, 0049AF10
:004446D0 BB14000000 mov ebx, 00000014

* Possible StringData Ref from Data Obj ->"Shareware"
|
:004446D5 B960374C00 mov ecx, 004C3760
:004446DA BA09000000 mov edx, 00000009

* Reference To: c5runx.Cla$comparestr, Ord:0041h
|
:004446DF FF1518D64D00 Call dword ptr [004DD618]
:004446E5 83F800 cmp eax, 00000000
:004446E8 7479 je 00444763 //------->改不改无所谓
:004446EA B8007C0000 mov eax, 00007C00

* Reference To: c5runx.Cla$PushLong, Ord:0166h
|
:004446EF FF1574D84D00 Call dword ptr [004DD874]

* Possible StringData Ref from Data Obj ->"Address correspondence to:"
|
:004446F5 B86C374C00 mov eax, 004C376C
:004446FA BB1A000000 mov ebx, 0000001A

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:004446FF FF1584D84D00 Call dword ptr [004DD884]
:00444705 B809000000 mov eax, 00000009
:0044470A BB00000000 mov ebx, 00000000
:0044470F B900000000 mov ecx, 00000000

* Reference To: c5runx.Cla$SetPropS, Ord:019Fh
|
:00444714 FF15F4D84D00 Call dword ptr [004DD8F4]
:0044471A EB47 jmp 00444763

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00444663(C) ///------------------------->修改点
|
:0044471C B8007C0000 mov eax, 00007C00

* Reference To: c5runx.Cla$PushLong, Ord:0166h
|
:00444721 FF1574D84D00 Call dword ptr [004DD874]

* Possible StringData Ref from Data Obj ->"Shareware Version " //--->共享版字样，往上找跳点
|
:00444727 B888374C00 mov eax, 004C3788
:0044472C BB12000000 mov ebx, 00000012

* Reference To: c5runx.Cla$PushString, Ord:016Ch
|
:00444731 FF1584D84D00 Call dword ptr [004DD884]
:00444737 8B45FC mov eax, dword ptr [ebp-04]
:0044473A 8D40E8 lea eax, dword ptr [eax-18]
:0044473D BB14000000 mov ebx, 00000014

这样就成为不受限制的版本了，破解文件我放到主页，请下载。
*************************************************

主页：http://crackerabc.longcity.net （[BCG]大本营）
http://sffs.533.net

软件破解，软件注册，破解教学，破解申请，注册机码。

请保留我的信息，谢谢！

**************************************************


Vcd Cutter 4.03

标 题:Vcd Cutter 4.03 crack (7千字)
发信人:mr.wei
时 间:2001-3-21 17:54:58
详细信息:
Vcd Cutter 4.03 crack
支持众多文件格式(MPG,DAT,AVI,WAV,MOV,M1V,MPV),
能将MPG切割开来，以小文件形式保存起
来，能将AVI文件转换成MPG格式，能控制播放速度，
需要DirectX Media 5.x Runtime(DXM)。
保护方法：典型的国产软件，每台安装机器产生
一个唯一的hardcode，结合用户输入的name，
产生一个授权码。生成的注册文件cdplayer.dat
存放在\windows\system文件夹。
工具：TRW2000 V1.22
1、注册：注意姓名必须含有"."和"@"，即以邮件地址的形式出现，
否则无法正确注册
Name＝Mr.Wei@China.edu
Code=987654321
2、bpx hmemcpy
单击注册，弹出TR，因为有两个输入框，所以再次按F5退出TR，
很快又返回TR
pmodule
TR自动跟踪到程序入口点，
这点TR要比SI强，后者要按多次F12才能找到入口点
0167:0042D095 LEA EDX,[ESP+50] //程序执行到此处
0167:0042D099 LEA EAX,[ESP+10]
0167:0042D09D PUSH EDX
0167:0042D09E PUSH EAX
0167:0042D09F CALL 004208E0 //关键调用，F8跟入
0167:0042D0A4 ADD ESP,BYTE +08
0167:0042D0A7 TEST EAX,EAX
0167:0042D0A9 JZ NEAR 0042D132 //跳转到出错对话框
0167:0042D0AF MOV ECX,[0049B878]
0167:0042D0B5 PUSH ECX
0167:0042D0B6 CALL `GDI32!DeleteObject`
0167:0042D0BC MOV EDX,[0049B7D0]
0167:0042D0C2 PUSH BYTE +7B
0167:0042D0C4 PUSH EDX
0167:0042D0C5 CALL `USER32!LoadBitmapA`
0167:0042D0CB MOV [0049B878],EAX
0167:0042D0D0 LEA EAX,[ESP+50]
0167:0042D0D4 PUSH BYTE +01
0167:0042D0D6 LEA ECX,[ESP+14]
0167:0042D0DA PUSH EAX
0167:0042D0DB PUSH ECX
0167:0042D0DC CALL 00420340
0167:0042D0E1 ADD ESP,BYTE +0C
0167:0042D0E4 PUSH BYTE +01
0167:0042D0E6 PUSH ESI
0167:0042D0E7 CALL `USER32!EndDialog`
0167:0042D0ED MOV EDX,[00486C68]
0167:0042D0F3 PUSH EDX
0167:0042D0F4 CALL `USER32!SetActiveWindow`
0167:0042D0FA MOV ECX,[00486C68]
0167:0042D100 LEA EAX,[ESP+10]
0167:0042D104 PUSH BYTE +00
0167:0042D106 PUSH EAX
0167:0042D107 PUSH DWORD 0044BBFC
0167:0042D10C PUSH ECX
0167:0042D10D CALL EBX
0167:0042D10F MOV EDX,[00486C68]
0167:0042D115 PUSH BYTE +00
0167:0042D117 PUSH BYTE +00
0167:0042D119 PUSH EDX
0167:0042D11A CALL `USER32!InvalidateRect`
0167:0042D120 MOV EAX,01
0167:0042D125 POP EDI
0167:0042D126 POP ESI
0167:0042D127 POP EBP
0167:0042D128 POP EBX
0167:0042D129 ADD ESP,0380
0167:0042D12F RET 10
0167:0042D132 PUSH BYTE -01
0167:0042D134 CALL `USER32!MessageBeep`
0167:0042D13A MOV EAX,[00486C68]
0167:0042D13F PUSH BYTE +00
0167:0042D141 PUSH DWORD 0044BBF4
0167:0042D146 PUSH DWORD 0044BB70
0167:0042D14B PUSH EAX
0167:0042D14C CALL EBX //出错对话框
0167:0042D14E MOV EAX,01
0167:0042D153 POP EDI
0167:0042D154 POP ESI
0167:0042D155 POP EBP
0167:0042D156 POP EBX
0167:0042D157 ADD ESP,0380
0167:0042D15D RET 10
上述代码的分析应该自下而上：找到出错对话框，
向上查找何处跳转到此处，也就是何处可以跳过出错对话框的显示。
下面代码分析方法也是如此。
3、F8追入 0167:0042D09F CALL 004208E0
追踪时注意一般按F10，执行到 REPNE SCASB、 REP MOVSB 、
REP MOVSD 时改按F8，因为TR有个Bug，无法正确跟踪，而SI则可以，
不知刘涛涛在V1.23中改没改掉。
0167:004208E0 SUB ESP,0208
0167:004208E6 OR ECX,BYTE -01
0167:004208E9 XOR EAX,EAX
0167:004208EB LEA EDX,[ESP+08]
0167:004208EF PUSH EBX
0167:004208F0 PUSH ESI
0167:004208F1 PUSH EDI
0167:004208F2 MOV EDI,0044A470
0167:004208F7 REPNE SCASB
0167:004208F9 NOT ECX
0167:004208FB SUB EDI,ECX
0167:004208FD MOV EAX,ECX
0167:004208FF MOV ESI,EDI
0167:00420901 MOV EDI,EDX
0167:00420903 XOR EDX,EDX
0167:00420905 SHR ECX,02
0167:00420908 REP MOVSD
0167:0042090A MOV ECX,EAX
0167:0042090C XOR EAX,EAX
0167:0042090E AND ECX,BYTE +03
0167:00420911 REP MOVSB
0167:00420913 MOV ESI,[ESP+0218]
0167:0042091A OR ECX,BYTE -01
0167:0042091D MOV EDI,ESI
0167:0042091F REPNE SCASB
0167:00420921 NOT ECX
0167:00420923 DEC ECX
0167:00420924 JZ 0042094A
0167:00420926 MOV EBX,ESI
0167:00420928 LEA ECX,[ESP+14]
0167:0042092C SUB EBX,ECX
0167:0042092E LEA EAX,[ESP+EDX+14]
0167:00420932 MOV EDI,ESI
0167:00420934 INC EDX
0167:00420935 MOV CL,[EAX+EBX]
0167:00420938 XOR EAX,EAX
0167:0042093A MOV [ESP+EDX+13],CL
0167:0042093E OR ECX,BYTE -01
0167:00420941 REPNE SCASB
0167:00420943 NOT ECX
0167:00420945 DEC ECX
0167:00420946 CMP EDX,ECX
0167:00420948 JC 0042092E
0167:0042094A MOV BYTE [ESP+EDX+14],00
0167:0042094F PUSH BYTE +01
0167:00420951 PUSH DWORD 00459E80
0167:00420956 LEA EDX,[ESP+1C]
0167:0042095A PUSH BYTE +08
0167:0042095C PUSH EDX
0167:0042095D PUSH DWORD 0044A3F0
0167:00420962 CALL 00419420
0167:00420967 ADD ESP,BYTE +14
0167:0042096A LEA EAX,[ESP+14]
0167:0042096E LEA ECX,[ESP+0C]
0167:00420972 PUSH BYTE +04
0167:00420974 PUSH EAX
0167:00420975 PUSH ECX
0167:00420976 CALL `MSVCRT!memmove`
0167:0042097B ADD ESP,BYTE +0C
0167:0042097E LEA EDX,[ESP+18]
0167:00420982 LEA EAX,[ESP+10]
0167:00420986 PUSH BYTE +04
0167:00420988 PUSH EDX
0167:00420989 PUSH EAX
0167:0042098A CALL `MSVCRT!memmove`
0167:0042098F ADD ESP,BYTE +0C
0167:00420992 LEA ECX,[ESP+14]
0167:00420996 PUSH BYTE +00
0167:00420998 PUSH DWORD 00459E80
0167:0042099D PUSH BYTE +08
0167:0042099F PUSH ECX
0167:004209A0 PUSH DWORD 0044A3F0
0167:004209A5 CALL 00419420
0167:004209AA MOV EDX,[ESP+24]
0167:004209AE MOV EAX,[ESP+20]
0167:004209B2 ADD ESP,BYTE +14
0167:004209B5 LEA ECX,[ESP+0114]
0167:004209BC PUSH EDX
0167:004209BD PUSH EAX
0167:004209BE PUSH DWORD 0044A44C
0167:004209C3 PUSH ECX
0167:004209C4 CALL `USER32!wsprintfA`
0167:004209CA MOV ESI,[ESP+022C] //d esi显示输入的code
0167:004209D1 ADD ESP,BYTE +10
0167:004209D4 LEA EAX,[ESP+0114] //d eax显示真正的code
0167:004209DB MOV DL,[EAX]
0167:004209DD MOV BL,[ESI]
0167:004209DF MOV CL,DL
0167:004209E1 CMP DL,BL
0167:004209E3 JNZ 00420A14
0167:004209E5 TEST CL,CL
0167:004209E7 JZ 004209FF
0167:004209E9 MOV DL,[EAX+01]
0167:004209EC MOV BL,[ESI+01]
0167:004209EF MOV CL,DL
0167:004209F1 CMP DL,BL
0167:004209F3 JNZ 00420A14
0167:004209F5 ADD EAX,BYTE +02
0167:004209F8 ADD ESI,BYTE +02
0167:004209FB TEST CL,CL
0167:004209FD JNZ 004209DB
0167:004209FF XOR EAX,EAX
0167:00420A01 XOR ECX,ECX
0167:00420A03 TEST EAX,EAX
0167:00420A05 SETZ CL
0167:00420A08 MOV EAX,ECX
0167:00420A0A POP EDI
0167:00420A0B POP ESI
0167:00420A0C POP EBX
0167:00420A0D ADD ESP,0208
0167:00420A13 RET
4、所以最快速的破解方法是
bpx 167:4209d4
追踪到后 d eax 就看到自己到code了。
5、破解后vcdcutter截取文件时仍然有7秒种时间限制,
因为软件本身就是演示版本，软件作者
Jiao ShanWu 说为给您带来的不便而抱歉。
没办法，只能给Jiao ShanWu 寄50元，
才能得到正式版本。
Kao,Jiao ShanWu , I 服了you!.
(Mr.Wei,2001-3-22)


VCDCUT 4.03

 标 题:对VCDCUT 4.03的分析破解过程 (18千字)
发信人:javaj901
时 间:2001-8-8 11:24:00
详细信息:
对VCDCUT 4.03的分析破解过程
保护：注册码和别的未知手段
下载：http://www.seller-club.com/~vcdcut/vcd403.zip
功能：1.提供播放器，可以播放MPEG，VCD和其它媒体文件（诸如MPG，DAT，AVI，MOV，WAV）。
2.VCDCutter可以从MPG或VCD碟片截取媒体画面和MPG片段，所截MPG片段，可用系统流（MPG），视频流（M1V）或音频流（MP3）格式存储。
     3.可将截取的影片片段连接成大的MPG片段，也可以将大的MPG文件切割成多个小的等长的MPG片段。
     4.可以将MPG系统流分割成视频流和音频流（MPG→MP3/M1V）。并支持其逆操作，即把MPG视频流和音频流打包为MPG系统流（MP3＋M1V→MPG）。
     5.提供文件格式转换器：AVI→MPG、DAT→MPG/M1V/MP3。
     6.支持播放时截取画面，可以多种格式（BMP、JPG）存储。

下载了这个文件后，安装运行。提示为非注册版，然后输入注册码并跟踪，找到了一个注册码:be0034cc-0d849337.注册，提示注册成功，再运行
也没有提示未注册版。但是实际截取并合并时，提示是未注册版，且有做多2段VCD和每段最多7秒的限制。这样就有了下面的分析过程。

* Referenced by a CALL at Addresses:
|:0042637E , :004350FD
|
:00430540 A13CC14900 mov eax, dword ptr [0049C13C] '从这里开始处理把多段VCD合并成一个文件的过程
:00430545 81EC04020000 sub esp, 00000204
:0043054B 55 push ebp
:0043054C 33ED xor ebp, ebp
:0043054E 56 push esi
:0043054F 3BC5 cmp eax, ebp
:00430551 57 push edi
:00430552 0F84EB030000 je 00430943
:00430558 A1E4764800 mov eax, dword ptr [004876E4]
:0043055D 6A10 push 00000010

.
.
.
.
.
.
|
:0043058F E81CFEFFFF call 004303B0
:00430594 4E dec esi
:00430595 75F8 jne 0043058F
:00430597 8B0D3CC14900 mov ecx, dword ptr [0049C13C] ‘从这里开始的几行是计算VCD片断数是否超过2，超过则设为2
:0043059D 83F902 cmp ecx, 00000002
:004305A0 7E0B jle 004305AD
:004305A2 B902000000 mov ecx, 00000002
:004305A7 890D3CC14900 mov dword ptr [0049C13C], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004305A0(C)
|
:004305AD 3BCD cmp ecx, ebp
:004305AF 896C240C mov dword ptr [esp+0C], ebp
:004305B3 7E26 jle 004305DB
:004305B5 8BF1 mov esi, ecx
:004305B7 B8EC854800 mov eax, 004885EC
:004305BC 8974240C mov dword ptr [esp+0C], esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004305D9(C)
|
:004305C0 8B48FC mov ecx, dword ptr [eax-04] ’这里计算每一段VCD片断是否超过7秒，超过的话，置成7秒代表的值FA000
:004305C3 8B10 mov edx, dword ptr [eax]
:004305C5 81C100A00F00 add ecx, 000FA000
:004305CB 3BCA cmp ecx, edx
:004305CD 7C02 jl 004305D1
:004305CF 8BCA mov ecx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004305CD(C)
|
:004305D1 8908 mov dword ptr [eax], ecx
:004305D3 052C010000 add eax, 0000012C
:004305D8 4E dec esi
:004305D9 75E5 jne 004305C0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004305B3(C)
|

* Possible StringData Ref from Data Obj ->"Demo version can only cut 7 sec " '提示未注册版只能截取2段且每段不得超过7秒
->"for "
|
:004305DB 8B1584AC4400 mov edx, dword ptr [0044AC84]
:004305E1 53 push ebx
:004305E2 8D442414 lea eax, dword ptr [esp+14]
:004305E6 52 push edx
:004305E7 50 push eax

* Reference To: MSVCRT.sprintf, Ord:02B2h
|
:004305E8 E819AE0000 Call 0043B406
:004305ED 8B154C6B4800 mov edx, dword ptr [00486B4C]
:004305F3 83C408 add esp, 00000008
:004305F6 8D4C2414 lea ecx, dword ptr [esp+14]
:004305FA 55 push ebp

* Possible StringData Ref from Data Obj ->"Warning"
|
:004305FB 68787C4400 push 00447C78
:00430600 51 push ecx
:00430601 52 push edx

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:00430602 FF1514C34300 Call dword ptr [0043C314] '调用Messagebox,提示未注册版只能......
:00430608 8B3D3CC14900 mov edi, dword ptr [0049C13C]
:0043060E C705DC184A0001000000 mov dword ptr [004A18DC], 00000001
:00430618 BB39020000 mov ebx, 00000239

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043064C(C)
|
:0043061D 3BFD cmp edi, ebp
:0043061F 896C2410 mov dword ptr [esp+10], ebp
:00430623 7E26 jle 0043064B
:00430625 B8EC854800 mov eax, 004885EC
:0043062A 8BF7 mov esi, edi
:0043062C 897C2410 mov dword ptr [esp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00430649(C)
|
:00430630 8B48FC mov ecx, dword ptr [eax-04] ’这里再一次计算每一段VCD片断是否超过7秒,超过的话，置成7秒代表的值FA000
:00430633 8B10 mov edx, dword ptr [eax]
:00430635 81C100A00F00 add ecx, 000FA000
:0043063B 3BCA cmp ecx, edx
:0043063D 7C02 jl 00430641
:0043063F 8BCA mov ecx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043063D(C)
|
:00430641 8908 mov dword ptr [eax], ecx
:00430643 052C010000 add eax, 0000012C
:00430648 4E dec esi
:00430649 75E5 jne 00430630

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00430623(C)
|
:0043064B 4B dec ebx
:0043064C 75CF jne 0043061D
:0043064E A1CCC14900 mov eax, dword ptr [0049C1CC]
:00430653 5B pop ebx
:00430654 3BC5 cmp eax, ebp
:00430656 0F840C010000 je 00430768 '这里如果不跳走的话，到cs:430767这一段会把选择的几个片段分别做成文件
:0043065C 3BFD cmp edi, ebp
:0043065E 896C240C mov dword ptr [esp+0C], ebp
:00430662 0F8E18020000 jle 00430880

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00430727(C)
|
:00430668 E8B358FEFF call 00415F20
:0043066D 8B44240C mov eax, dword ptr [esp+0C]
:00430671 8D942410010000 lea edx, dword ptr [esp+00000110]
:00430678 8D0440 lea eax, dword ptr [eax+2*eax]
:0043067B 8D0480 lea eax, dword ptr [eax+4*eax]
:0043067E 8D0480 lea eax, dword ptr [eax+4*eax]
:00430681 8D0C8508864800 lea ecx, dword ptr [4*eax+00488608]
:00430688 51 push ecx
:00430689 52 push edx
:0043068A E8C1020000 call 00430950 '这里打开原始文件
:0043068F 8DBC2418010000 lea edi, dword ptr [esp+00000118]
:00430696 83C9FF or ecx, FFFFFFFF
:00430699 33C0 xor eax, eax
:0043069B 83C408 add esp, 00000008
:0043069E F2 repnz
:0043069F AE scasb
:004306A0 F7D1 not ecx
:004306A2 49 dec ecx
:004306A3 0F84E7000000 je 00430790
:004306A9 8D842410010000 lea eax, dword ptr [esp+00000110]

* Possible StringData Ref from Data Obj ->"wb"
|
:004306B0 6888F04300 push 0043F088
:004306B5 50 push eax

* Reference To: MSVCRT.fopen, Ord:0257h
|
:004306B6 E851AD0000 Call 0043B40C '创建要生成的文件
:004306BB 8BF0 mov esi, eax
:004306BD 83C408 add esp, 00000008
:004306C0 3BF5 cmp esi, ebp
:004306C2 746E je 00430732 '创建文件失败，跳到出错的处理
:004306C4 BF0C000000 mov edi, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004306CF(C)
|
:004306C9 E8E2FCFFFF call 004303B0
:004306CE 4F dec edi
:004306CF 75F8 jne 004306C9
:004306D1 8B44240C mov eax, dword ptr [esp+0C]
:004306D5 8B0D3CC14900 mov ecx, dword ptr [0049C13C]
:004306DB 8D54240C lea edx, dword ptr [esp+0C]
:004306DF 51 push ecx
:004306E0 8D0440 lea eax, dword ptr [eax+2*eax]
:004306E3 52 push edx
:004306E4 8D0480 lea eax, dword ptr [eax+4*eax]
:004306E7 8D0480 lea eax, dword ptr [eax+4*eax]
:004306EA C1E002 shl eax, 02
:004306ED 8B88EC854800 mov ecx, dword ptr [eax+004885EC]
:004306F3 8B90E8854800 mov edx, dword ptr [eax+004885E8]
:004306F9 51 push ecx '这里是处理后的代表秒数的数值，未注册时是FA000
:004306FA 8D8008864800 lea eax, dword ptr [eax+00488608]
:00430700 52 push edx
:00430701 50 push eax
:00430702 56 push esi
:00430703 E8584BFEFF call 00415260 '这里是把一段VCD片段截取过来，放到新文件里面。
:00430708 E83358FEFF call 00415F40
:0043070D 56 push esi

* Reference To: MSVCRT.fclose, Ord:024Ch
|
:0043070E E8EDAC0000 Call 0043B400
:00430713 8B442428 mov eax, dword ptr [esp+28]
:00430717 8B0D3CC14900 mov ecx, dword ptr [0049C13C]
:0043071D 83C41C add esp, 0000001C
:00430720 40 inc eax
:00430721 3BC1 cmp eax, ecx '这里判断是否所有的片断数都已经处理完
:00430723 8944240C mov dword ptr [esp+0C], eax
:00430727 0F8C3BFFFFFF jl 00430668 '没有处理完，继续处理
:0043072D E939010000 jmp 0043086B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004306C2(C)
|
:00430732 8D8C2410010000 lea ecx, dword ptr [esp+00000110] '打开文件失败的处理
:00430739 8D542410 lea edx, dword ptr [esp+10]
:0043073D 51 push ecx

* Possible StringData Ref from Data Obj ->"Can't create file: %s"
|
:0043073E 68B4BF4400 push 0044BFB4
:00430743 52 push edx
:00430744 892DDC184A00 mov dword ptr [004A18DC], ebp

* Reference To: MSVCRT.sprintf, Ord:02B2h
|
:0043074A E8B7AC0000 Call 0043B406
:0043074F 55 push ebp
:00430750 8D442420 lea eax, dword ptr [esp+20]
:00430754 55 push ebp
:00430755 50 push eax
:00430756 E8F550FFFF call 00425850
:0043075B 83C418 add esp, 00000018
:0043075E 5F pop edi
:0043075F 5E pop esi
:00430760 5D pop ebp
:00430761 81C404020000 add esp, 00000204
:00430767 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00430656(C)
|
:00430768 8D8C2410010000 lea ecx, dword ptr [esp+00000110] '从这里到这个call结束，是把选定的VCD片段合并成一个文件
'并做一些善后工作
:0043076F 6808864800 push 00488608
:00430774 51 push ecx
:00430775 E8D6010000 call 00430950 '这里打开原始文件
:0043077A 8DBC2418010000 lea edi, dword ptr [esp+00000118]
:00430781 83C9FF or ecx, FFFFFFFF
:00430784 33C0 xor eax, eax
:00430786 83C408 add esp, 00000008
:00430789 F2 repnz
:0043078A AE scasb
:0043078B F7D1 not ecx
:0043078D 49 dec ecx
:0043078E 7510 jne 004307A0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004306A3(C)
|
:00430790 5F pop edi
:00430791 892DDC184A00 mov dword ptr [004A18DC], ebp
:00430797 5E pop esi
:00430798 5D pop ebp
:00430799 81C404020000 add esp, 00000204
:0043079F C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043078E(C)
|
:004307A0 E87B57FEFF call 00415F20
:004307A5 8D942410010000 lea edx, dword ptr [esp+00000110]

* Possible StringData Ref from Data Obj ->"wb"
|
:004307AC 6888F04300 push 0043F088
:004307B1 52 push edx

* Reference To: MSVCRT.fopen, Ord:0257h
|
:004307B2 E855AC0000 Call 0043B40C '这里是创建一个新的文件
:004307B7 8BF0 mov esi, eax
:004307B9 83C408 add esp, 00000008
:004307BC 3BF5 cmp esi, ebp
:004307BE 7536 jne 004307F6
:004307C0 8D842410010000 lea eax, dword ptr [esp+00000110] '创建文件失败的话，显示出错信息
:004307C7 8D4C2410 lea ecx, dword ptr [esp+10]
:004307CB 50 push eax

* Possible StringData Ref from Data Obj ->"Can't create file: %s"
|
:004307CC 68B4BF4400 push 0044BFB4
:004307D1 51 push ecx
:004307D2 892DDC184A00 mov dword ptr [004A18DC], ebp

* Reference To: MSVCRT.sprintf, Ord:02B2h
|
:004307D8 E829AC0000 Call 0043B406
:004307DD 55 push ebp
:004307DE 8D542420 lea edx, dword ptr [esp+20]
:004307E2 55 push ebp
:004307E3 52 push edx
:004307E4 E86750FFFF call 00425850
:004307E9 83C418 add esp, 00000018
:004307EC 5F pop edi
:004307ED 5E pop esi
:004307EE 5D pop ebp
:004307EF 81C404020000 add esp, 00000204
:004307F5 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004307BE(C)
|
:004307F6 A13CC14900 mov eax, dword ptr [0049C13C] '[49c13c]放的是片段数
:004307FB 896C240C mov dword ptr [esp+0C], ebp
:004307FF 3BC5 cmp eax, ebp
:00430801 7E5A jle 0043085D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043085B(C)
|
:00430803 BF0C000000 mov edi, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043080E(C)
|
:00430808 E8A3FBFFFF call 004303B0
:0043080D 4F dec edi
:0043080E 75F8 jne 00430808
:00430810 8B44240C mov eax, dword ptr [esp+0C]
:00430814 8B0D3CC14900 mov ecx, dword ptr [0049C13C]
:0043081A 8D54240C lea edx, dword ptr [esp+0C]
:0043081E 51 push ecx
:0043081F 8D0440 lea eax, dword ptr [eax+2*eax]
:00430822 52 push edx
:00430823 8D0480 lea eax, dword ptr [eax+4*eax]
:00430826 8D0480 lea eax, dword ptr [eax+4*eax]
:00430829 C1E002 shl eax, 02
:0043082C 8B88EC854800 mov ecx, dword ptr [eax+004885EC]
:00430832 8B90E8854800 mov edx, dword ptr [eax+004885E8]
:00430838 51 push ecx '这里是处理后的代表秒数的数值，未注册时是FA000
:00430839 8D8008864800 lea eax, dword ptr [eax+00488608]

:0043083F 52 push edx
:00430840 50 push eax
:00430841 56 push esi
:00430842 E8194AFEFF call 00415260 '这里是把一段VCD片段截取过来，放到新文件里面。
:00430847 8B442424 mov eax, dword ptr [esp+24]
:0043084B 8B0D3CC14900 mov ecx, dword ptr [0049C13C]
:00430851 83C418 add esp, 00000018
:00430854 40 inc eax
:00430855 3BC1 cmp eax, ecx '这里判断是否所有的片断数都已经处理完
:00430857 8944240C mov dword ptr [esp+0C], eax
:0043085B 7CA6 jl 00430803 '没有处理完，继续处理

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00430801(C)
|
:0043085D E8DE56FEFF call 00415F40
:00430862 56 push esi
.
.
.
.
.
'上面的内容搞定后，以为万事大吉，但是去截取时，发现还是只能截取7秒，又进入415260里面，发现了下面的“暗桩”
* Referenced by a CALL at Address:
|:00415325
|
:004153C0 81EC04010000 sub esp, 00000104
:004153C6 53 push ebx
:004153C7 8B9C2414010000 mov ebx, dword ptr [esp+00000114]
:004153CE 55 push ebp
:004153CF 56 push esi
:004153D0 57 push edi
:004153D1 8BBC2424010000 mov edi, dword ptr [esp+00000124]
:004153D8 8DB300A00F00 lea esi, dword ptr [ebx+000FA000] ’这里ESI一般被赋值FA000，代表7秒
:004153DE 3BFE cmp edi, esi '在这里判断EDI的值是否大于FA000(7秒)
:004153E0 7C02 jl 004153E4 '小于则跳走
:004153E2 8BFE mov edi, esi '否则，把ESI（FA000）赋给EDI，
'在这里，我曾经把EDI的值给得比较大，ESI保持FA000，实际还是截取7秒
'所有推测ESI里面放的应该实际要截取的时间换算出来的值。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004153E0(C)
|
:004153E4 8B8C2428010000 mov ecx, dword ptr [esp+00000128]
:004153EB 8B84242C010000 mov eax, dword ptr [esp+0000012C]
:004153F2 50 push eax
:004153F3 8D442418 lea eax, dword ptr [esp+18]
:004153F7 8B11 mov edx, dword ptr [ecx]
:004153F9 42 inc edx
:004153FA 52 push edx

综上所述，用下面的方法改之:
cs:4305a7 909090909090
cs:5305cd 9090
cs:430602 909090909090
cs:43063d 9090
cs:4153e0 90908BF7

注册码在cs:41ffb2处，d eax 即可看到。 另外，它是去到\windows\system\cdplayer.dat找注册码的。 注册成功后，它会把注册码加密然后放到 \windows\system\cdplayer.dat里面,没有注册成功时也有这个文件，不过内容不对。

javaj901 做于2001,8,6
转载请保持完整


VoptME

标 题:关于 VoptME 我也说几句 －－ Sun Bird [CCG] (1千字)
发信人:1212
时 间:2001-4-16 23:30:58
详细信息:
哦？有这等事情？不过 SiraX 的注册机确实有些限制。可能当初我没太注意具体的限制条件。

你有我的注册码？我不记得我发布过呀？而且我记得我追踪出来的和他那个 Keygen 算出来的不一样呀（原因我后面会写到）？！

我看了楼上、楼下的帖子，确实 CCG 的 MM 成员制作了无限制的 Keygen（不知贴“据我所知……”的“1212”是哪位？怎么知道的？）。非常抱歉，由于特殊的一些原因，该 Keygen 不能发布:-(

还有贴“当然追得出来！”不知是哪位“1212”？他说得对，VoptME 的注册码是分为两部分分别判断的。第二部分是在“\Windows\System\ShrLk21.dll”中判断的（记得好象 TerminalOverdrive 也是采用的“ShrLk21.dll”保护）。还有，他关于“ShrLk21.dll”内含两种加密算法的说明也是正确的（幸好 VoptME 没有采用第二种加密算法）。呵呵，这位“1212”，不知我上面说的是否有误？看来咱俩的分析结果差不多呀^_^

VoptME v5.10 的注册码计算过程真的非常复杂！反正我是看不懂，只能追踪出注册码，Keygen 我想都不敢想:-(

还有我在追踪时发现注册码的某些位不唯一，而包括由 CCG 的 MM 成员制作的 Keygen 也只生成唯一的注册码（目的在于“版权保护”。呵呵，这也就是为什么我现在使用的注册码和任何一个 Keygen 算出来的都不一样的原因^_^）。

真的劝初学者还是不要拿这个软件做追踪注册码的练习了，太难了。

另外，由于一些特殊的原因，有些东东确实只在很少的圈内人中流传，拜托了解情况的朋友不要外传。如果条件许可了，这些东东的制作人自会将之发布。既然现在没有发布，必然是有其不方便之处。如果强行外泄，只会给制作人带来麻烦。我想谁也不希望制作人发生麻烦吧。

祝大家开心;-)

Sun Bird [CCG]
2001.04.16


webclaw

 标 题:破解webclaw——全凭眼力 (14千字)
发信人:下弦月
时 间:2001-5-21 18:56:20
详细信息:
破解webclaw——出学者全凭眼力

这个软件也不难，就是需要细心。下载地址我也不知道，哪位知道告诉我一下
它的注册码计算出来后在call中直接换算成16进制，RET前放在edx里，出来后
edx直接被填充，以后该数值也不完整出现。所以说，对出学者来说全凭眼力。
点击程序，选注册，填121212121，按bpx hmemcpy,enter,x退出点注册。
pmodule到领空，按f12一次就退出。最近的vb都怎么了？我一连遇上3个f12一次
就退出的，成潮流了！
原样再来，到这里，按f10往下

016F:004188D4 CMP EAX,EDI
016F:004188D6 JNL 004188F0
016F:004188D8 MOV ECX,[EBP+FFFFFE90]
016F:004188DE PUSH DWORD A0
016F:004188E3 PUSH DWORD 0040BFB4
016F:004188E8 PUSH ECX
016F:004188E9 PUSH EAX
016F:004188EA CALL `MSVBVM50!__vbaHresultCheckObj`
016F:004188F0 MOV EDX,[EBP+FFFFFF18]
016F:004188F6 PUSH EDX
016F:004188F7 CALL `MSVBVM50!rtcR8ValFromBstr`
016F:004188FD FSTP QWORD [EBP+FFFFFECC]
016F:00418903 LEA EDX,[EBP+FFFFFEC4]
016F:00418909 LEA ECX,[EBP+FFFFFF1C]
016F:0041890F MOV DWORD [EBP+FFFFFEC4],05
016F:00418919 CALL ESI
016F:0041891B LEA ECX,[EBP+FFFFFF18]
016F:00418921 CALL `MSVBVM50!__vbaFreeStr`
016F:00418927 LEA ECX,[EBP+FFFFFF14]
016F:0041892D CALL `MSVBVM50!__vbaFreeObj`
016F:00418933 MOV EAX,[EBP+FFFFFE80]
016F:00418939 PUSH EBX
016F:0041893A CALL NEAR [EAX+0318]
016F:00418940 LEA ECX,[EBP+FFFFFF14]
016F:00418946 PUSH EAX
016F:00418947 PUSH ECX
016F:00418948 CALL `MSVBVM50!__vbaObjSet`
016F:0041894E MOV EBX,EAX
016F:00418950 LEA EAX,[EBP+FFFFFF18]
016F:00418956 PUSH EAX
016F:00418957 PUSH EBX
016F:00418958 MOV EDX,[EBX]
016F:0041895A CALL NEAR [EDX+A0]
016F:00418960 CMP EAX,EDI
016F:00418962 JNL 00418976
016F:00418964 PUSH DWORD A0
016F:00418969 PUSH DWORD 0040BFB4
016F:0041896E PUSH EBX
016F:0041896F PUSH EAX
016F:00418970 CALL `MSVBVM50!__vbaHresultCheckObj`
016F:00418976 MOV ECX,[EBP+FFFFFF18]
016F:0041897C PUSH ECX
016F:0041897D CALL `MSVBVM50!rtcR8ValFromBstr`
016F:00418983 FSTP QWORD [EBP+FFFFFECC]
016F:00418989 LEA EDX,[EBP+FFFFFEC4]
016F:0041898F LEA ECX,[EBP-54]
016F:00418992 MOV DWORD [EBP+FFFFFEC4],05
016F:0041899C CALL ESI
016F:0041899E LEA ECX,[EBP+FFFFFF18]
016F:004189A4 CALL `MSVBVM50!__vbaFreeStr`
016F:004189AA LEA ECX,[EBP+FFFFFF14]
016F:004189B0 CALL `MSVBVM50!__vbaFreeObj`
016F:004189B6 LEA EDX,[EBP+FFFFFF1C]
016F:004189BC LEA EAX,[EBP+FFFFFF4C]
016F:004189C2 PUSH EDX
016F:004189C3 LEA ECX,[EBP+FFFFFF04]
016F:004189C9 PUSH EAX
016F:004189CA PUSH ECX
016F:004189CB CALL `MSVBVM50!__vbaVarAdd`
016F:004189D1 PUSH EAX
016F:004189D2 LEA EDX,[EBP+FFFFFF4C]
016F:004189D8 LEA EAX,[EBP+FFFFFEF4]
016F:004189DE PUSH EDX
016F:004189DF PUSH EAX
016F:004189E0 CALL `MSVBVM50!__vbaVarXor`
016F:004189E6 MOV EDX,EAX
016F:004189E8 LEA ECX,[EBP+FFFFFF2C]
016F:004189EE CALL ESI
016F:004189F0 LEA ECX,[EBP+FFFFFF04]
016F:004189F6 CALL `MSVBVM50!__vbaFreeVar`
就是这里！！call过后edx是新的，打？edx就是注册码。

016F:004189FC LEA ECX,[EBP-54]
016F:004189FF LEA EDX,[EBP+FFFFFF2C]
016F:00418A05 PUSH ECX
016F:00418A06 PUSH EDX
016F:00418A07 CALL `MSVBVM50!__vbaVarTstEq`
016F:00418A0D TEST AX,AX
016F:00418A10 MOV EAX,80020004
016F:00418A15 MOV ECX,0A
016F:00418A1A MOV [EBP+FFFFFEDC],EAX
016F:00418A20 MOV [EBP+FFFFFED4],ECX
016F:00418A26 MOV [EBP+FFFFFEEC],EAX
016F:00418A2C MOV [EBP+FFFFFEE4],ECX
016F:00418A32 JZ NEAR 00418EA9
016F:00418A38 MOV EBX,[00420334]
016F:00418A3E LEA EDX,[EBP+FFFFFEB4]
016F:00418A44 LEA ECX,[EBP+FFFFFEF4]
016F:00418A4A MOV DWORD [EBP+FFFFFEBC],0040CD40
016F:00418A54 MOV DWORD [EBP+FFFFFEB4],08
016F:00418A5E CALL EBX
016F:00418A60 LEA EDX,[EBP+FFFFFEC4]
016F:00418A66 LEA ECX,[EBP+FFFFFF04]
016F:00418A6C MOV DWORD [EBP+FFFFFECC],0040CD28
016F:00418A76 MOV DWORD [EBP+FFFFFEC4],08
016F:00418A80 CALL EBX
016F:00418A82 LEA EAX,[EBP+FFFFFED4]
016F:00418A88 LEA ECX,[EBP+FFFFFEE4]
016F:00418A8E PUSH EAX
016F:00418A8F LEA EDX,[EBP+FFFFFEF4]
016F:00418A95 PUSH ECX
016F:00418A96 PUSH EDX
016F:00418A97 LEA EAX,[EBP+FFFFFF04]
016F:00418A9D PUSH BYTE +40
016F:00418A9F PUSH EAX
016F:00418AA0 CALL `MSVBVM50!rtcMsgBox`
016F:00418AA6 LEA ECX,[EBP+FFFFFED4]
016F:00418AAC LEA EDX,[EBP+FFFFFEE4]
016F:00418AB2 PUSH ECX
016F:00418AB3 LEA EAX,[EBP+FFFFFEF4]
016F:00418AB9 PUSH EDX
016F:00418ABA LEA ECX,[EBP+FFFFFF04]
016F:00418AC0 PUSH EAX
016F:00418AC1 PUSH ECX
016F:00418AC2 PUSH BYTE +04
016F:00418AC4 CALL `MSVBVM50!__vbaFreeVarList`
016F:00418ACA ADD ESP,BYTE +14
016F:00418ACD LEA EDX,[EBP+FFFFFF2C]
016F:00418AD3 LEA EAX,[EBP+FFFFFF04]
016F:00418AD9 PUSH EDX
016F:00418ADA PUSH EAX
016F:00418ADB CALL `MSVBVM50!rtcVarStrFromVar`
016F:00418AE1 LEA ECX,[EBP+FFFFFF04]
016F:00418AE7 LEA EDX,[EBP+FFFFFF18]
016F:00418AED PUSH ECX
016F:00418AEE PUSH EDX
016F:00418AEF CALL `MSVBVM50!__vbaStrVarVal`
016F:00418AF5 PUSH EAX
016F:00418AF6 PUSH DWORD 0040C04C
016F:00418AFB PUSH DWORD 0040C040
016F:00418B00 PUSH DWORD 0040C000
016F:00418B05 CALL `MSVBVM50!rtcSaveSetting`
016F:00418B0B LEA ECX,[EBP+FFFFFF18]
016F:00418B11 CALL `MSVBVM50!__vbaFreeStr`
016F:00418B17 LEA ECX,[EBP+FFFFFF04]
016F:00418B1D CALL `MSVBVM50!__vbaFreeVar`
016F:00418B23 SUB ESP,BYTE +10
016F:00418B26 MOV ECX,08
016F:00418B2B MOV EDX,ESP
016F:00418B2D MOV [EBP+FFFFFEB4],ECX
016F:00418B33 MOV [EBP+FFFFFEC4],ECX
016F:00418B39 MOV EAX,0040CD64
016F:00418B3E MOV [EDX],ECX
016F:00418B40 MOV ECX,[EBP+FFFFFEB8]
016F:00418B46 MOV [EBP+FFFFFEBC],EAX
016F:00418B4C SUB ESP,BYTE +10
016F:00418B4F MOV [EDX+04],ECX
016F:00418B52 MOV ECX,ESP
016F:00418B54 MOV DWORD [EBP+FFFFFECC],0040C040
016F:00418B5E PUSH DWORD 0040C000
016F:00418B63 MOV [EDX+08],EAX
016F:00418B66 MOV EAX,[EBP+FFFFFEC0]
016F:00418B6C MOV [EDX+0C],EAX
016F:00418B6F MOV EDX,[EBP+FFFFFEC4]
016F:00418B75 MOV EAX,[EBP+FFFFFEC8]
016F:00418B7B MOV [ECX],EDX
016F:00418B7D MOV EDX,[EBP+FFFFFECC]
016F:00418B83 MOV [ECX+04],EAX
016F:00418B86 MOV EAX,[EBP+FFFFFED0]
016F:00418B8C MOV [ECX+08],EDX
016F:00418B8F MOV [ECX+0C],EAX
016F:00418B92 CALL `MSVBVM50!rtcDeleteSetting`
016F:00418B98 MOV EAX,0040CD7C
016F:00418B9D MOV ECX,08
016F:00418BA2 MOV [EBP+FFFFFEBC],EAX
016F:00418BA8 MOV [EBP+FFFFFEB4],ECX
016F:00418BAE SUB ESP,BYTE +10
016F:00418BB1 MOV [EBP+FFFFFEC4],ECX
016F:00418BB7 MOV EDX,ESP
016F:00418BB9 SUB ESP,BYTE +10
016F:00418BBC MOV DWORD [EBP+FFFFFECC],0040C040
016F:00418BC6 MOV [EDX],ECX
016F:00418BC8 MOV ECX,[EBP+FFFFFEB8]
016F:00418BCE MOV [EDX+04],ECX
016F:00418BD1 MOV ECX,ESP
016F:00418BD3 PUSH DWORD 0040C000
016F:00418BD8 MOV [EDX+08],EAX
016F:00418BDB MOV EAX,[EBP+FFFFFEC0]
016F:00418BE1 MOV [EDX+0C],EAX
016F:00418BE4 MOV EDX,[EBP+FFFFFEC4]
016F:00418BEA MOV EAX,[EBP+FFFFFEC8]
016F:00418BF0 MOV [ECX],EDX
016F:00418BF2 MOV EDX,[EBP+FFFFFECC]
016F:00418BF8 MOV [ECX+04],EAX
016F:00418BFB MOV EAX,[EBP+FFFFFED0]
016F:00418C01 MOV [ECX+08],EDX
016F:00418C04 MOV [ECX+0C],EAX
016F:00418C07 CALL `MSVBVM50!rtcDeleteSetting`
016F:00418C0D MOV ECX,[EBP+08]
016F:00418C10 MOV EDX,[EBP+FFFFFE80]
016F:00418C16 PUSH ECX
016F:00418C17 CALL NEAR [EDX+0324]
016F:00418C1D PUSH EAX
016F:00418C1E LEA EAX,[EBP+FFFFFF14]
016F:00418C24 PUSH EAX
016F:00418C25 CALL `MSVBVM50!__vbaObjSet`
016F:00418C2B MOV ECX,[EAX]
016F:00418C2D PUSH EDI
016F:00418C2E PUSH EAX
016F:00418C2F MOV [EBP+FFFFFE90],EAX
016F:00418C35 CALL NEAR [ECX+8C]
016F:00418C3B CMP EAX,EDI
016F:00418C3D JNL 00418C57
016F:00418C3F MOV EDX,[EBP+FFFFFE90]
016F:00418C45 PUSH DWORD 8C
016F:00418C4A PUSH DWORD 0040CA78
016F:00418C4F PUSH EDX
016F:00418C50 PUSH EAX
016F:00418C51 CALL `MSVBVM50!__vbaHresultCheckObj`
016F:00418C57 LEA ECX,[EBP+FFFFFF14]
016F:00418C5D CALL `MSVBVM50!__vbaFreeObj`
016F:00418C63 LEA EDX,[EBP+FFFFFEC4]
016F:00418C69 LEA ECX,[EBP-34]
016F:00418C6C MOV DWORD [EBP+FFFFFECC],0040C574
016F:00418C76 MOV DWORD [EBP+FFFFFEC4],08
016F:00418C80 CALL `MSVBVM50!__vbaVarCopy`
016F:00418C86 LEA EDX,[EBP+FFFFFEC4]
016F:00418C8C LEA ECX,[EBP+FFFFFF04]
016F:00418C92 MOV DWORD [EBP+FFFFFECC],0040CD94
016F:00418C9C MOV DWORD [EBP+FFFFFEC4],08
016F:00418CA6 CALL EBX
016F:00418CA8 LEA EAX,[EBP+FFFFFF04]
016F:00418CAE PUSH BYTE +10
016F:00418CB0 PUSH EAX
016F:00418CB1 CALL `MSVBVM50!rtcDir`
016F:00418CB7 LEA EDX,[EBP+FFFFFEF4]
016F:00418CBD LEA ECX,[EBP-64]
016F:00418CC0 MOV [EBP+FFFFFEFC],EAX
016F:00418CC6 MOV DWORD [EBP+FFFFFEF4],08
016F:00418CD0 CALL ESI
016F:00418CD2 LEA ECX,[EBP+FFFFFF04]
016F:00418CD8 CALL `MSVBVM50!__vbaFreeVar`
016F:00418CDE LEA EDX,[EBP+FFFFFEC4]
016F:00418CE4 LEA ECX,[EBP+FFFFFF04]
016F:00418CEA MOV DWORD [EBP+FFFFFECC],0040CDB0
016F:00418CF4 MOV DWORD [EBP+FFFFFEC4],08
016F:00418CFE CALL EBX
016F:00418D00 LEA ECX,[EBP+FFFFFF04]
016F:00418D06 LEA EDX,[EBP+FFFFFEF4]
016F:00418D0C PUSH ECX
016F:00418D0D PUSH EDX
016F:00418D0E CALL `MSVBVM50!rtcUpperCaseVar`
016F:00418D14 LEA EAX,[EBP-64]
016F:00418D17 LEA ECX,[EBP+FFFFFEF4]
016F:00418D1D PUSH EAX
016F:00418D1E PUSH ECX
016F:00418D1F CALL `MSVBVM50!__vbaVarTstEq`
016F:00418D25 MOV [EBP+FFFFFE90],EAX
016F:00418D2B LEA EDX,[EBP+FFFFFEF4]
016F:00418D31 LEA EAX,[EBP+FFFFFF04]
016F:00418D37 PUSH EDX
016F:00418D38 PUSH EAX
016F:00418D39 PUSH BYTE +02
016F:00418D3B CALL `MSVBVM50!__vbaFreeVarList`
016F:00418D41 ADD ESP,BYTE +0C
016F:00418D44 CMP [EBP+FFFFFE90],DI
016F:00418D4B JZ NEAR 00418F3B
016F:00418D51 LEA ECX,[EBP+FFFFFEC4]
016F:00418D57 LEA EDX,[EBP-64]
016F:00418D5A PUSH ECX
016F:00418D5B LEA EAX,[EBP+FFFFFF04]
016F:00418D61 PUSH EDX
016F:00418D62 PUSH EAX
016F:00418D63 MOV DWORD [EBP+FFFFFECC],0040BFC8
016F:00418D6D MOV DWORD [EBP+FFFFFEC4],08
016F:00418D77 CALL `MSVBVM50!__vbaVarAdd`
016F:00418D7D MOV EDX,EAX
016F:00418D7F LEA ECX,[EBP-34]
016F:00418D82 CALL ESI
016F:00418D84 LEA ECX,[EBP-34]
016F:00418D87 LEA EDX,[EBP+FFFFFEC4]
016F:00418D8D PUSH ECX
016F:00418D8E LEA EAX,[EBP+FFFFFF04]
016F:00418D94 PUSH EDX
016F:00418D95 PUSH EAX
016F:00418D96 MOV DWORD [EBP+FFFFFECC],0040CDDC
016F:00418DA0 MOV DWORD [EBP+FFFFFEC4],08
016F:00418DAA CALL `MSVBVM50!__vbaVarAdd`
016F:00418DB0 MOV EDX,EAX
016F:00418DB2 LEA ECX,[EBP+FFFFFF5C]
016F:00418DB8 CALL ESI
016F:00418DBA LEA ECX,[EBP+FFFFFF5C]
016F:00418DC0 PUSH BYTE +02
016F:00418DC2 PUSH ECX
016F:00418DC3 CALL `MSVBVM50!rtcDir`
016F:00418DC9 MOV [EBP+FFFFFF0C],EAX
016F:00418DCF LEA EDX,[EBP+FFFFFF04]
016F:00418DD5 LEA EAX,[EBP+FFFFFEF4]
016F:00418DDB PUSH EDX
016F:00418DDC PUSH EAX
016F:00418DDD MOV DWORD [EBP+FFFFFF04],08
016F:00418DE7 CALL `MSVBVM50!rtcUpperCaseVar`
016F:00418DED LEA EDX,[EBP+FFFFFEF4]
016F:00418DF3 LEA ECX,[EBP-24]
016F:00418DF6 CALL ESI
016F:00418DF8 LEA ECX,[EBP+FFFFFF04]
016F:00418DFE CALL `MSVBVM50!__vbaFreeVar`
016F:00418E04 LEA EDX,[EBP+FFFFFEC4]
016F:00418E0A LEA ECX,[EBP+FFFFFF04]
016F:00418E10 MOV DWORD [EBP+FFFFFECC],0040CE08
016F:00418E1A MOV DWORD [EBP+FFFFFEC4],08
016F:00418E24 CALL EBX
016F:00418E26 LEA ECX,[EBP+FFFFFF04]
016F:00418E2C LEA EDX,[EBP+FFFFFEF4]
016F:00418E32 PUSH ECX
016F:00418E33 PUSH EDX
016F:00418E34 CALL `MSVBVM50!rtcUpperCaseVar`
016F:00418E3A LEA EAX,[EBP-24]
016F:00418E3D LEA ECX,[EBP+FFFFFEF4]
016F:00418E43 PUSH EAX
016F:00418E44 PUSH ECX
016F:00418E45 CALL `MSVBVM50!__vbaVarTstEq`
016F:00418E4B MOV ESI,EAX
016F:00418E4D LEA EDX,[EBP+FFFFFEF4]
016F:00418E53 LEA EAX,[EBP+FFFFFF04]
016F:00418E59 PUSH EDX
016F:00418E5A PUSH EAX
016F:00418E5B PUSH BYTE +02
016F:00418E5D CALL `MSVBVM50!__vbaFreeVarList`
016F:00418E63 ADD ESP,BYTE +0C
016F:00418E66 CMP SI,DI
016F:00418E69 JZ NEAR 00418F3B
016F:00418E6F LEA ECX,[EBP+FFFFFF5C]
016F:00418E75 PUSH EDI
016F:00418E76 LEA EDX,[EBP+FFFFFF18]
016F:00418E7C PUSH ECX
016F:00418E7D PUSH EDX
016F:00418E7E CALL `MSVBVM50!__vbaStrVarVal`
016F:00418E84 PUSH EAX
016F:00418E85 CALL `MSVBVM50!rtcSetFileAttr`
016F:00418E8B LEA ECX,[EBP+FFFFFF18]
016F:00418E91 CALL `MSVBVM50!__vbaFreeStr`
016F:00418E97 LEA EAX,[EBP+FFFFFF5C]
016F:00418E9D PUSH EAX
016F:00418E9E CALL `MSVBVM50!rtcKillFiles`
016F:00418EA4 JMP 00418F3B
016F:00418EA9 MOV ESI,[00420334]
016F:00418EAF MOV EBX,08
016F:00418EB4 LEA EDX,[EBP+FFFFFEB4]
016F:00418EBA LEA ECX,[EBP+FFFFFEF4]
016F:00418EC0 MOV DWORD [EBP+FFFFFEBC],0040CE44
016F:00418ECA MOV [EBP+FFFFFEB4],EBX
016F:00418ED0 CALL ESI
016F:00418ED2 LEA EDX,[EBP+FFFFFEC4]
016F:00418ED8 LEA ECX,[EBP+FFFFFF04]
016F:00418EDE MOV DWORD [EBP+FFFFFECC],0040CE30
016F:00418EE8 MOV [EBP+FFFFFEC4],EBX
016F:00418EEE CALL ESI
016F:00418EF0 LEA ECX,[EBP+FFFFFED4]
016F:00418EF6 LEA EDX,[EBP+FFFFFEE4]
016F:00418EFC PUSH ECX
016F:00418EFD LEA EAX,[EBP+FFFFFEF4]
016F:00418F03 PUSH EDX
016F:00418F04 PUSH EAX
016F:00418F05 LEA ECX,[EBP+FFFFFF04]
016F:00418F0B PUSH BYTE +10
016F:00418F0D PUSH ECX

418f0e是个退出call，从4189e6到这里有这么长！

下弦月


webeasymail

 标 题:webeasymail的简单破解过程 (2千字)
发信人:jieao
时 间:2001-8-4 0:23:32
详细信息:
webeasymail的简单破解过程
:00415C96 B8FC260000 mov eax, 000026FC
:00415C9B E8E09B0300 call 0044F880
:00415CA0 55 push ebp
:00415CA1 56 push esi
:00415CA2 57 push edi
:00415CA3 894C240C mov dword ptr [esp+0C], ecx
:00415CA7 E894FDFFFF call 00415A40
:00415CAC 85C0 test eax, eax
:00415CAE 7518 jne 00415CC8 <-75改EB(在win98和winme就能运行)
:00415CB0 6A10 push 00000010

* Possible Reference to Dialog:
|
:00415CB2 6860324900 push 00493260

* Possible StringData Ref from Data Obj ->"您的操作系统不是WinNT或且Win2000"
|
:00415CB7 683C324900 push 0049323C
:00415CBC 50 push eax
____________________________________________________________________
:0040558D E831140600 call 004669C3
:00405592 A13C6C4900 mov eax, dword ptr [00496C3C]
:00405597 89442404 mov dword ptr [esp+04], eax
:0040559B C744241800000000 mov [esp+18], 00000000
:004055A3 8944240C mov dword ptr [esp+0C], eax
:004055A7 8B8D3C040000 mov ecx, dword ptr [ebp+0000043C]<-你的序列号
:004055AD 8D853C040000 lea eax, dword ptr [ebp+0000043C]<-序列号地址
:004055B3 C644241801 mov [esp+18], 01
:004055B8 8B51F8 mov edx, dword ptr [ecx-08]
:004055BB 85D2 test edx, edx
:004055BD 0F84D5010000 je 00405798
:004055C3 8B9538040000 mov edx, dword ptr [ebp+00000438]
:004055C9 8B4AF8 mov ecx, dword ptr [edx-08] <-你输入的注册码
:004055CC 85C9 test ecx, ecx
:004055CE 0F84C4010000 je 00405798
:004055D4 83F90A cmp ecx, 0000000A
:004055D7 0F8EBB010000 jle 00405798
:004055DD 50 push eax
:004055DE 8D4C2408 lea ecx, dword ptr [esp+08]
:004055E2 E866EB0500 call 0046414D
:004055E7 8D442404 lea eax, dword ptr [esp+04]
:004055EB 50 push eax
:004055EC E84F460200 call 00429C40
:004055F1 8B8538040000 mov eax, dword ptr [ebp+00000438]
:004055F7 8B4C2408 mov ecx, dword ptr [esp+08]
:004055FB 50 push eax
:004055FC 51 push ecx<-真正的注册码^_^(哇，kao32位耶太长了吧，呵呵)
:004055FD E88E180500 call 00456E90

注：成功注册后，在根目录下生成SN.INI
附：我的SN.INI 2<-代表无限用户(1<-代表250用户)
81721b50a99d1aa07d5bef07c6b095a0
我的特征码：2-00-90-D0-0D-17-9F

已修改和脱壳的主文件下载地址：http://crackbaby.y365.com/esyamail.zip

CRACKCODE2000做个注册机我想应该没问题 (不知道能否显示32位？)


软件名称：WebZIP 3.80(FileVersion:3.80.0.530) WebZIP.EXE 1,367KB 下载地点：http://www.spidersoft.com 发 信 人: 井风 时 间: 2000-10-20 所用工具：Trw20001.22 详细过程: 1 运行TRW2000程序 2 运行WEBZIP 3 粗跟踪 1 点HELP->register... 2 输入 User Namme:cy Serial No:cccc Reg Key: 88888888 (8个8) 3 Ctrl+N 呼出TRW，下断点：BPX HMEMCPY 按F5 返回 4 点OK，被拦截， 5 bc * ,清除所有断点 6 pmodule，直接到达WEBZIP领空，下代码： 015F:0042E6AD MOV [ESI + 0C],EAX <-被拦截于此行 015F:0042E6B0 CMP DWORD [ESI],0203 7 按F12，在67次后出现非法注册码错误对话框，点OK退出WEBZIP 4 细跟踪 1 同前，输入注册码，呼出TRW，设断点：BPX HMEMCPY 2 点OK，被拦截， 3 bc * ,清除所有断点 4 pmodule，直接到达WEBZIP领空，下代码： 015F:0042E6AD MOV [ESI + 0C],EAX <-被拦截于此行 015F:0042E6B0 CMP DWORD [ESI],0203 5 按F12，66次，来到此处 015F:00451C4F RET <-来到此行（如再按一次F12将出现错误框，说明计算或验证注册码就在此处不远） 015F00451C50 PUSH EDX 6 改按F10，即单步跟踪，当心，每走到一个CALL时应记下这个CALL的地址，大约23次时，到此处： 015F：004F48AC CALL 004E99B4 <---到此行， 如果执行此CALL，则出现错误框，说明计算或验证注册码就在这个CALL里，记录下此CALL前的地址（*） 您可试试，后可重新按上步骤开始到此处。 5 深入跟踪 1 点HELP-->register... 2 输入 User Namme:cy Serial No:cccc Reg Key: 88888888 (8个8) 3 Ctrl+N 呼出TRW，下断点：BPX 004F48AC 按F5 返回 4 点OK，被拦截， 5 BC * 清除所有断点 6 按F8 追入CALL到下行： 015F：004E99B4 PUSH EBP 7 按F10键，单步跟踪，22次,来到下面代码 015F：004E99F2 MOV EDX，[EBP-08] <---此处可疑 015F：004E99F5 MOV EAX，EBX 015F：004E99F7 CALL 004E9B94 <---(**) 015F：004E99FC SUB EAX，C8 8 下令：D EDX 值为：88888888， 莫非下面CALL是计算注册码码？ 追入 (**)行CALL试试看 9 执行到（**）行时，按F8追入，接下来按F10（单步），51次到下面代码： 015F：004E9C62 MOV EAX ，[EBP-04] <---经计算出的真注册码传送到EAX 015F：004E9C65 MOV EDX，EDI <---假注册码：88888888 10 按F10执行上二行代码 11 下令： D EAX 显示：48E4A814BE88 D EDX 显示：88888888 至此，找出注册码！ 小 结： User Name: cy Serial No: cccc Reg Key: 48E4A814BE88 后 记： 具体注册码并不唯一，但最后两位为88。有疑问请与我联系：hz.cy@163.net


WebZIP 3.80

软件名称：WebZIP 3.80(FileVersion:3.80.0.530)  WebZIP.EXE  1,367KB
下载地点：http://www.spidersoft.com
发 信 人: 井风
时    间: 2000-10-20
所用工具：Trw20001.22

详细过程:

1 运行TRW2000程序
2 运行WEBZIP
3 粗跟踪
1 点HELP->register...
2 输入 User Namme:cy Serial No:cccc Reg Key: 88888888 (8个8)
3 Ctrl+N 呼出TRW，下断点：BPX HMEMCPY 按F5 返回
4 点OK，被拦截，
5 bc * ,清除所有断点
6 pmodule，直接到达WEBZIP领空，下代码：
015F:0042E6AD MOV [ESI + 0C],EAX <-被拦截于此行
015F:0042E6B0 CMP DWORD [ESI],0203
7 按F12，在67次后出现非法注册码错误对话框，点OK退出WEBZIP

4 细跟踪
1 同前，输入注册码，呼出TRW，设断点：BPX HMEMCPY
2 点OK，被拦截，
3 bc * ,清除所有断点
4 pmodule，直接到达WEBZIP领空，下代码：
015F:0042E6AD MOV [ESI + 0C],EAX <-被拦截于此行
015F:0042E6B0 CMP DWORD [ESI],0203
5 按F12，66次，来到此处
015F:00451C4F RET <-来到此行（如再按一次F12将出现错误框，说明计算或验证注册码就在此处不远）
015F00451C50 PUSH EDX
6 改按F10，即单步跟踪，当心，每走到一个CALL时应记下这个CALL的地址，大约23次时，到此处：

015F：004F48AC CALL 004E99B4 <---到此行，

如果执行此CALL，则出现错误框，说明计算或验证注册码就在这个CALL里，记录下此CALL前的地址（*）
您可试试，后可重新按上步骤开始到此处。

5 深入跟踪
1 点HELP-->register...
2 输入 User Namme:cy Serial No:cccc Reg Key: 88888888 (8个8)
3 Ctrl+N 呼出TRW，下断点：BPX 004F48AC 按F5 返回
4 点OK，被拦截，
5 BC * 清除所有断点
6 按F8 追入CALL到下行：
015F：004E99B4 PUSH EBP
7 按F10键，单步跟踪，22次,来到下面代码
015F：004E99F2 MOV EDX，[EBP-08] <---此处可疑
015F：004E99F5 MOV EAX，EBX
015F：004E99F7 CALL 004E9B94 <---(**)
015F：004E99FC SUB EAX，C8
8 下令：D EDX
值为：88888888， 莫非下面CALL是计算注册码码？ 追入 (**)行CALL试试看

9 执行到（**）行时，按F8追入，接下来按F10（单步），51次到下面代码：

015F：004E9C62 MOV EAX ，[EBP-04] <---经计算出的真注册码传送到EAX
015F：004E9C65 MOV EDX，EDI <---假注册码：88888888

10 按F10执行上二行代码
11 下令：
D EAX 显示：48E4A814BE88
D EDX 显示：88888888

至此，找出注册码！

小 结：
User Name: cy
Serial No: cccc
Reg Key: 48E4A814BE88
后 记：
具体注册码并不唯一，但最后两位为88。有疑问请与我联系：hz.cy@163.net


win98屏保密码

 标 题:很长时间没有贴文章了，今天没有什么事情就写的关于破解win98屏保密码的文章，大家共享一下吗！
发信人:程式猎人
时 间:2000-11-8 21:58:55
详细信息:
Win98 的屏幕保护密码破解方法
程式猎人
今天没有什么事情，杂志制作完成后看一看从朋友借的光盘，从中看到了一个关于破解win98屏幕保护的密码，这里介绍如下：

屏幕保护密码
利用系统的屏幕保护功能可以防止他人在自己不在的情况下偷用自己的计算机，从而起到保护数据安全的作用。不过在不配合其它限制功能的情况下，系统的屏幕保护密码是非常脆弱的。我们在遗忘密码之后只需使用“复位”键强行启动计算机（某些设计不完善的屏幕保护程序甚至可以使用Ctrl＋Alt＋Del强行关闭，其操作就更简单了），然后右击桌面空白处并从弹出的快捷菜单中执行“属性”命令，打开“显示属性”设置框并单击“屏幕保护”选项卡，最后取消“密码保护”选项即可（取消该选项时无需确认密码）。另外，据说目前市面上还出现了一种专门用于破解屏幕保护密码的光盘。插入该光盘之后，它就会利用Windows 98的自动运行功能启动保存在光盘上的屏幕保护密码破解程序，对屏幕保护功能的密码进行分析、破译，最后再将密码显示在屏幕上或写到软盘上，这就更方便了（对不起，该功能只是道听途说，本人并没有亲眼见到这样的光盘）。

上面就是这个文章的作者提供的破解方法，但是我个人认为可以对win98的屏幕保护密码进行研究一下，这样就可以知道win98是使用什么文件来验证密码的。

现在先使用Regsnap来对注册表进行拍照，然后将屏幕保护密码设为有，这样就可以分析到win98是如何将屏保密码放在注册表的哪个地方了。这样分析后得到了这样的结果。
HKEY_USERS\.DEFAULT\Control Panel\desktop\ScreenSaveUsePassword=0x00000001(1)
这里就是win将密码项打开的选项，如果你将这个0x00000001(1)变为0x00000000(0)后就没有屏保密码了。也就是这个屏保密码不再起作用了。

这个对屏保密码的研究是最开始阶段，下一步是将研究win是使用哪个程序来验证屏保密码的。
这里依然还得借住工具来分析，先使用TRW2000来分析，将屏保启动，出现验证密码的地方，在这里先输入任意的密码后，设bpx hmemcpy后点击OK，被拦下来，它这时在系统中keneal中，按F12几次就可以到达下面显示为password!……字样的地方，这里就是我们想要得到的地方。
* Reference To: USER32.GetDlgItemTextA, Ord:00FDh
|
:78054201 FF15DC720578 Call dword ptr [780572DC]
:78054207 85FF test edi, edi <-出来
:78054209 751B jne 78054226
:7805420B 8D45FC lea eax, dword ptr [ebp-04]
:7805420E 8D8D78FFFFFF lea ecx, dword ptr [ebp+FFFFFF78]
:78054214 50 push eax
:78054215 51 push ecx

* Reference To: MPR.WNetVerifyPasswordA, Ord:004Eh
|
:78054216 E87F020000 Call 7805449A
:7805421B 85C0 test eax, eax
:7805421D 7440 je 7805425F
:7805421F B801000000 mov eax, 00000001
:78054224 EB79 jmp 7805429F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:78054209(C)
|
:78054226 8D8574FEFFFF lea eax, dword ptr [ebp+FFFFFE74]
:7805422C 8D8D78FFFFFF lea ecx, dword ptr [ebp+FFFFFF78]
:78054232 50 push eax
:78054233 51 push ecx

* Reference To: KERNEL32.lstrlenA, Ord:02E7h
|
:78054234 FF1558720578 Call dword ptr [78057258]
:7805423A 50 push eax
:7805423B 8D8D78FFFFFF lea ecx, dword ptr [ebp+FFFFFF78]
:78054241 51 push ecx
:78054242 E89A010000 call 780543E1
:78054247 57 push edi 加密后你输入的密码
:78054248 8D8D74FEFFFF lea ecx, dword ptr [ebp+FFFFFE74]
:7805424E 51 push ecx 加密后真正的密码

* Reference To: KERNEL32.lstrcmpiA, Ord:02DEh
|
:7805424F FF1554720578 Call dword ptr [78057254]
:78054255 83F801 cmp eax, 00000001
:78054258 1BC0 sbb eax, eax
:7805425A F7D8 neg eax
:7805425C 8945FC mov dword ptr [ebp-04], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:7805421D(C)
|
:7805425F 33FF xor edi, edi
:78054261 B801000000 mov eax, 00000001
:78054266 397DFC cmp dword ptr [ebp-04], edi
:78054269 7534 jne 7805429F ***关键跳跃的地方
上面就是程序比较屏保密码过程，上面是加密后再进行比较的过程，所以无法看到真正的密码，但是你可以在***处强行跳跃的就可以了。这样就可以回到win中了。

现在使用TRW就可以解决掉屏保密码了。但是还是不行的，我们得找到win使用哪个程序来调用验证密码的过程。

现在使用File monitor来查看win调用了什么程序。
经过监视，发现win调用c:\windows\system\password.cpl程序来验证密码的过程。其实也用到了其它程序，但是这个就是我们要找的程序。
使用W32DASM来反汇编这个程序，发现就是我们要找的程序，于是我将
:78054266 397DFC cmp dword ptr [ebp-04], edi
:78054269 7534 jne 7805429F ***关键跳跃的地方
这里改为
:78054266 397DFC cmp dword ptr [ebp-04], edi
:78054269 EB34 jmp 7805429F ***关键跳跃的地方
存盘，再进行屏保密码验证过程，你只要点击OK就可以了。win已经没有了屏保密码保护的功能。

好了，现在总结一下吧，如果你想打开屏保保护的密码，使用最后一种方法比较好，可以在另一台电脑中将password.cpl修改为上面的那样，重新启动电脑就可以将它拷贝到相应的目录下就可以了。这样进行win中就是开始还有密码保护也能点击OK回到win中来。

最后说的是希望大家来访问我的网站：http://programhunter.myrice.com/welcome1.htm

标 题:谢谢你提示，我又研究了一下win如何加密屏保密码的，它的加密过程如下：
发信人:程式猎人
时 间:2000-11-9 23:43:54
详细信息:

现在win98的屏保密码加密过程再研究一下了，win的屏保密码加密过程其实是一个很简单的过程，它的具体算法很简单的。如下：
:780510AF 0FB6442413 movzx eax, byte ptr [esp+13] 初始值为0，以后每次加1，就为得到下面的cl值，所以cl值只同位数值有关，不同密码有关。
:780510B4 40 inc eax
:780510B5 99 cdq
:780510B6 33C2 xor eax, edx
:780510B8 2BC2 sub eax, edx
:780510BA 25FF000000 and eax, 000000FF
:780510BF 33C2 xor eax, edx
:780510C1 2BC2 sub eax, edx
:780510C3 88442413 mov byte ptr [esp+13], al
:780510C7 0FB6C0 movzx eax, al
:780510CA 8D0C38 lea ecx, dword ptr [eax+edi]
:780510CD 8A19 mov bl, byte ptr [ecx]
:780510CF 0FB6442412 movzx eax, byte ptr [esp+12]
:780510D4 0FB6F3 movzx esi, bl
:780510D7 03C6 add eax, esi
:780510D9 99 cdq
:780510DA 33C2 xor eax, edx
:780510DC 2BC2 sub eax, edx
:780510DE 25FF000000 and eax, 000000FF
:780510E3 33C2 xor eax, edx
:780510E5 2BC2 sub eax, edx
:780510E7 88442412 mov byte ptr [esp+12], al
:780510EB 0FB6C0 movzx eax, al
:780510EE 8D1438 lea edx, dword ptr [eax+edi]
:780510F1 8A02 mov al, byte ptr [edx]
:780510F3 8801 mov byte ptr [ecx], al
:780510F5 881A mov byte ptr [edx], bl
:780510F7 0FB601 movzx eax, byte ptr [ecx]
:780510FA 03C6 add eax, esi
:780510FC 99 cdq
:780510FD 33C2 xor eax, edx
:780510FF 2BC2 sub eax, edx
:78051101 25FF000000 and eax, 000000FF
:78051106 33C2 xor eax, edx
:78051108 2BC2 sub eax, edx
:7805110A 8A0C07 mov cl, byte ptr [edi+eax]
:7805110D 8B442420 mov eax, dword ptr [esp+20]
:78051111 300C28 xor byte ptr [eax+ebp], cl
:78051114 45 inc ebp
:78051115 3B6C241C cmp ebp, dword ptr [esp+1C]
:78051119 7C94 jl 780510AF
win的加密过程是先使用从0开始将从780510AF开始计算一直到7805110A计算结束，得到cl值这个值不于正确的密码有关，所以它只同密码的位数有关的，具体关系如下：
位数： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ……
密文： 48 EE 76 1D 67 69 A1 1B 7A 8C 47 F8 54 95 97 5F ……
win的加密过程就是将上面的密文同你输入的密码进行xor运算，得到的加密密文后再同以前保存的密码比较，如果……。正在就不用说了。
win将密码的加密密文放在这里
HKEY_USERS\.DEFAULT\Control Panel\desktop\ScreenSave_Data
它当然是最后的密文了。你在这里可以得到十六位的密文。如果你设的密码为：????(这个是演示使用的），在这里你将得到如下的数据：
0000 37 38 44 46 34 34 32 45 78DF442E
0001 00
这里最后的00就是密码的结束标志，上面才是密文的。它将是你输入密码的两倍，这个很容易理解，现在大家就可以使用从位数得到的密文来对这个加密的密码进行解密处理。
具体操作为：屏保加密密码=屏保位数密文XOR屏保明文
屏保位数密文： 48 EE 76 1D
XOR 屏保明文：
= 屏保加密密码： 78 DF 44 2E
通过上面的反xor运算可以得到屏保密码的明文了。运算结果为：30 31 32 33，则明文就为：0123。这下屏保的密码破解过程就完全研究成功了。

现在可以很简单的制作出win98的屏保密码破解软件了。当然你得输入加密后的密文了。这样就可以得到明文了。具体制作过程很简单的，大家使用C就可以解决了


WinAmp Skin Maker

标 题:转载一篇什么时候?在trw2000 or sice中用"?"来看密码还有code分析! (3千字)
发信人:peterchen
时 间:2001-3-28 10:56:46
详细信息:
* 原信信区: CRACK.JY (黑客练兵场)
* 原发信者: Ken Lewis 6:652/3.2 (Sunday April 25 1999 01:03)
* 原收信者: [All]
* 原信主题: [CRACK!]
=============================================================================

. 今天LYX找到了一个小软件:WinAmp Skin Maker,就是做
WINAMP面板的东西.还顺手装上了S-ICE,说是想学学注册.我
拿来一看,原来这个东西的注册是那么简单.于是把注册的过
程写出来,算是给初学者的入门教材吧.

. 首先,保证机器上已经设置好了S-ICE,然后运行WinAmp
Skin Maker(一下简称WSM).找到注册的地方,填写用户名和注
册码,当然是随便填了.
. 用户名:DELVE 注册码:78787878 (又是这个!)
. 按CTRL-D激活S-ICE,输入
S 30:0 L FFFFFFFF '78787878' ;找刚才输入
的注册码
然后系统就会显示出下面的信息:
Pattern found at 0030:8381F66A (8381F66A) ;找到了
. 再输入
BPM 30:8381F66A ;在这个地方设断点
按CTRL-D切回WSM.
. 按"OK"按钮,S-ICE回截获中断,进入S-ICE的调试状态.
0137:9EEE REPZ MOVSD
0137:9EF2 POP ECX
.. .. .. ..
. 不要管这些,先输入BD *屏蔽刚才的中断,然后按F10一直
走,大概按60多下,出现下面的语句:
0157:00408BB5 LEA EAX,[ESP+08]
0157:00408BB9 PUSH EAX
0157:00408BBA CALL 00409520 <-(1)
0157:00408BBF ADD ESP,04
0157:00408BC2 MOV EDI,EAX
0157:00408BC4 LEA EAX,[ESP+28] <-(2)
0157:00408BC8 PUSH EAX
0157:00408BC9 CALL 004095A0 <-(3)
0157:00408BCE ADD ESP,04
. 把光标移到(1)处,按下F9设断点,因为这个地方很重要,一会
我们就讲为什么.然后按F10单步执行,当执行完(1)以后,我们看一
下EAX中的值:0058B12C.
. 继续按F10往下走,执行到(2)的地方,我们就可以看见S-ICE提
示我们[ESP+28]里面存储的就是我们输入的注册码:78787878!于是
我们分析下面的(3)的子程序就是对我们输入的注册码进行处理的
地方.所以,走到(3)处,按F8跟进去:
0157:004095A0 PUSH EBX
0157:004095A1 PUSH ESI
.. .. .. ..
0157:004095AA CALL [004102D8] <-(4)
0157:004095B0 LEA EDI,[EAX-01]
0157:004095B3 MOV ECX,00000001
0157:004095B8 TEST EAX,EAX
. 走到(4)处,按F10,会发现EAX的值变成了0008,这说明(4)的子
程序是检查输入的注册码的位数的.
0157:004095BA JLE 004095D1
0157:004095BC MOVSX EDX,BYTE PTR [EDI+ESI]
0157:004095C0 SUB EDX,30
0157:004095C3 DEC EDI
0157:004095C4 IMUL EDX,ECX <-(5)
0157:004095C7 ADD EBX,EDX
0157:004095C9 LEA ECX,[ECX*4+ECX]
0157:004095CC ADD ECX,ECX <-(6)
0157:004095CE DEC EAX
0157:004095CF JNZ 004095BC
0157:004095D1 MOV EAX,EBX
0157:004095D3 POP EDI
. 我们来分析一下(5)-(6)之间的程序做了什么.
EDX=EDX*ECX
EBX=EBX+EDX
ECX=ECX*5
ECX=ECX+ECX
简单写出来就是
EDX=EDX*ECX
EBX=EBX*EDX
ECX=ECX*10
. 也就是说EDX每次乘以10^n后累加到EBX中.而EDX是什么呢?
EDX是从[EDI+ESI]中取出来以后减去30H得到的.我们输入的78等
都是字符,他们的ASCII码是37H,38H,减去30H后正好是7,8!那么
最后EBX中保存的就是78787878的16进制数!后面的语句将EBX的
值保存到EAX作为返回值.
. 然后我们再往下走,出了这个子程序后,会看见下面的语句.
0157:00408C0A CMP EAX,EDI
0157:00408C0C JNZ 00408C42
. 这是比较EAX和EDI.EAX是刚才我们的注册码78787878的16进
制数04B23526H,那么EDI中呢?就是刚才(1)算出来的0058B12CH.
这两个进行比较,肯定EDI就是正确的注册码了.那么它的10进制是
什么呢?算一下.5812524!这个就是正确的注册码了.
. 这次就到这里,下次我们从(1)进去看看正确的注册码是怎么
算出来的,然后根据它写出注册器,记着来看! :)

... (\-----/) 肥牛 / Ken Lewis BP:191-2114152
... (( O O )) http://www.zb169.net/~kenlewis
... (o o) Email : kenlewis@126.com


WinAmp V2.11

标 题:WinAmp V2.11的注册机制分析(一)（初学者必读） (12千字)
发信人:Fpc
时 间:2001-4-8 14:40:28
详细信息:
WinAmp V2.11的注册机制分析(一)（初学者必读）
转载本文请注明出处，并保持文章的完整性。本文不得用于任何商业场合，仅供学习和参考。
作者： Fpc （感谢直接和间接提供帮助的所有朋友）
目的： 分析注册机制
工具： SI 4.05, Wdasm 8.93, Hedit 2.0

软件名称：WinAmp Ver 2.11
作 者: Nullsoft，Inc. Apr 13,1999
文件大小：612KB
编译器 ：VC++ 6.0
授权方式：共享软件
使用平台：Win95/98
软件简介：著名的MP3播放器

软件来源：不清楚
下载地址：请到各大专的下载网站自己查找。

首先引用 WinAmp (WA) 关于中的一段：“Winamp is shareware, and may be previewed for 14 days. Continued use of Winamp after 14 days requires that you register it. winamp will neither cease functioning nor warn you of the end of the 14 day trial period. It is your responsibility to register.”。说的很明白，也是说到做到。共享软件作成这样，都不忍心去CRAK，它也的确没有任何加密、干扰手段，真是不知该说些什么。所以本文仅限于CRAK教学之用。
这个程序我看了三天（“当兵的，你不看我了”,“我都看了三天了”），其中有二天是在跟踪。程序写的很规范，也没有加壳，所以需要的只是耐心。现在让我给各位分析一下*COUGH*

1、 在WA菜单中选择“Nullsoft Winamp....”，显示“About”对话框，选“Shareware”->“Enter Registration Info”进入注册页面。
2、 输入： Name = Fpc ，Reg# = 123456 。“OK”竟未被激活，应该是每输入一次就作一次判断。
3、 删除Reg#中的‘6’，^D到SI中，下 bpx hmemcpy（万能中断，也是我最常用的）；
4、 F5回来，在Reg#后加‘6’，立刻中断到SI中，下 BD *阻断，按F12 N次，发现始终在USER中，最后直接就返回到WA中，有点奇怪；
5、 还是删除‘6’，^D到SI中，下 be hmemcpy 激活中断；
6、 再F5回来，仍输入‘6’，立刻中断到SI中。这次按F5，一次，二次，三次，返回到WA中。猜想第一次不知做什么，第二次取 RegisterName（Rn），第三次是取InputedRegisterCode（Irc），OK；
7、 重复上面5、6两步，不过这次在SI中按一次F5，N次F12，正确的回到WA领空，地址是 00401F28，向下看 @00401F2E是一个外部的 CALL调用（其实是GetDlgItemInt），是取 Irc的。再向下是一个 Call+ Cmp+ Jmp的程序段，这个 CALL 4252D1就是计算注册码的核心。要问我是怎么知道的，就是：静态分析+动态分析+尝试+耐心。

上面简要介绍了 SI动态拦截方式，若用 WDASM静态分析需要查找“Licensed to”字符串，它不在 String资源中 :-( ，而是在 DATA中找到。分析的角度不同，得到的结果是类似的，我们当然要多了解和尝试。这个串会在 @00401DA5 处找到，再向上还是对关键 Call 4252D1的调用。根据这一调用返回的注册成功与否，程序用 wsprintfA打印不同的字串：“LICENSED TO:%s(%d)”或“UNREGISTERED SHAREWARE ......”，最后显示在About对话框中。整个这一段代码是在选择菜单的第一项时执行，向上翻页，记下的它的入口地址：401CCE。
关闭WA，打开SI的 Symbol Loader，调入WA，然后 Load，这时在SI设断：Bpx 401CCE。^D执行 WA。注意SI不会被激活，除非你选择了菜单的第一项，下面借助“程式”作分析，希望大家耐心看下去。

；程序段（1），在显示“About”时执行

* Referenced by a CALL at Addresses:
|:00401B9B , :00401CB1
|
:00401CCE 55 push ebp
:00401CCF 8BEC mov ebp, esp
:00401CD1 81EC00060000 sub esp, 00000600
:00401CD7 A050914400 mov al, byte ptr [00449150] <== 0->al
:00401CDC 53 push ebx
:00401CDD 56 push esi
:00401CDE 57 push edi
:00401CDF 888500FAFFFF mov byte ptr [ebp+FFFFFA00], al <== Ebp-600=6DC6F8-600
:00401CE5 B9FF000000 mov ecx, 000000FF
:00401CEA 33C0 xor eax, eax
:00401CEC 8DBD01FAFFFF lea edi, dword ptr [ebp+FFFFFA01] <== 准备将内存清0
:00401CF2 F3 repz
:00401CF3 AB stosd
:00401CF4 66AB stosw

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:013Ah
|
:00401CF6 8B3534E14300 mov esi, dword ptr [0043E134] <== 准备功能调用

* Possible StringData Ref from Data Obj ->"winamp.ini" <== 文件名
|
:00401CFC 687C214400 push 0044217C
:00401D01 AA stosb <== 到此将Ebp-600到Ebp-200清为0
:00401D02 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00] <== 缓冲区1 首址(句柄?)
:00401D08 6800020000 push 00000200 <== 缓冲区长度为200
:00401D0D BB50914400 mov ebx, 00449150
:00401D12 50 push eax

* Possible StringData Ref from Data Obj ->"RegisteredTo"
|
:00401D13 BF6C214400 mov edi, 0044216C <== 读内容
:00401D18 53 push ebx
:00401D19 57 push edi

* Possible StringData Ref from Data Obj ->"WinampRegInfo"
|
:00401D1A 685C214400 push 0044215C <== 小节名
:00401D1F FFD6 call esi

这个Call将注册信息（RI）读到 Ebp-200处，后面以0补足至 Ebp。当然，WA没有注册时，RI是不存在的，自己输入的方式是：
在WIN9X系统目录下，找“winamp.ini”文件并打开（什么，没有？不会自己生成一个！），添加[WinampRegInfo]小节，输入RI。我的“winamp.ini”相关内容如下：

[WinampRegInfo]
RegisteredTo=Fpc!!!123456

注意RI中，Fpc是Rn，123456是Irc，中间的“!!!”是必须的，在下面的分析中你会找到原因。

:00401D21 80BD00FEFFFF00 cmp byte ptr [ebp+FFFFFE00], 00 <== 检查RI是否为空
:00401D28 7524 jne 00401D4E <== 正确则向下跳
:00401D2A 68A0794500 push 004579A0
:00401D2F 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00401D35 6800020000 push 00000200
:00401D3A 50 push eax
:00401D3B 53 push ebx
:00401D3C 57 push edi
:00401D3D FF35E0594500 push dword ptr [004559E0]
:00401D43 FFD6 call esi <== 不用关心是在读什么
:00401D45 80BD00FEFFFF00 cmp byte ptr [ebp+FFFFFE00], 00
:00401D4C 7466 je 00401DB4 <== 这里千万不能去

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401D28(C)
|
:00401D4E 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]<== 缓冲区1 首址

* Possible StringData Ref from Data Obj ->"!!!"
|
:00401D54 6858214400 push 00442158 <== 准备检查RI中是否含有"!!!"
:00401D59 50 push eax
:00401D5A E8F1330300 call 00435150 <== 这个Call有意思，错误则eax=0，正确则eax指向RI的!!!123456，我这里返回值是6DC4FB
:00401D5F 59 pop ecx <== 对这个Call的分析见（二）
:00401D60 85C0 test eax, eax
:00401D62 59 pop ecx
:00401D63 744F je 00401DB4 <== Eax=0就去死
:00401D65 802000 and byte ptr [eax], 00 <== 使得Rn以'\0'结束
:00401D68 33F6 xor esi, esi
:00401D6A 83C003 add eax, 00000003 <== Eax指向Irc：123456

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401D84(U)
|
:00401D6D 8A08 mov cl, byte ptr [eax] <== 取一个字符
:00401D6F 80F930 cmp cl, 30 <== 数字为有效字符，非数字表示完成
:00401D72 7C12 jl 00401D86
:00401D74 80F939 cmp cl, 39
:00401D77 7F0D jg 00401D86
:00401D79 0FBEC9 movsx ecx, cl <== Ecx中无用位清0
:00401D7C 8D14B6 lea edx, dword ptr [esi+4*esi] <= Edx=5*Esi
:00401D7F 40 inc eax <== Edx的初始值为0，这三条指令将字符串变为数字
:00401D80 8D7451D0 lea esi, dword ptr [ecx+2*edx-30] <= 很有意思
:00401D84 EBE7 jmp 00401D6D

这一段以C来表示:

char Irc[6]="123456" /* 当然注册码不止6位 */
long Temp=0;
int i;

for( i=0; i<6; i++)
{
if( !isdigit( Irc[i] ) )
break;
Temp*=10;
Temp+=Irc[i]-'0';
}

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401D72(C), :00401D77(C)
|
:00401D86 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]<== Eax指向Rn
:00401D8C 50 push eax
:00401D8D E83F350200 call 004252D1 <== !! 关键Call，由Rn计算得出Rc，保存在Eax。具体分析请看（三）
:00401D92 3BC6 cmp eax, esi <== 比较Rc与Irc
:00401D94 59 pop ecx
:00401D95 751D jne 00401DB4 <== 不相等则GAME OVER，大家将此处NOP掉，看会发生什么有趣的事情
:00401D97 50 push eax
:00401D98 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00401D9E 50 push eax
:00401D9F 8D8500FAFFFF lea eax, dword ptr [ebp+FFFFFA00]

* Possible StringData Ref from Data Obj ->"----- LICENSED TO: %s (%d) -----"
|
:00401DA5 6834214400 push 00442134
:00401DAA 50 push eax

* Reference To: USER32.wsprintfA, Ord:02ACh
|
:00401DAB FF1568E34300 Call dword ptr [0043E368] <== 打印授权信息
:00401DB1 83C410 add esp, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401D4C(C), :00401D63(C), :00401D95(C)
|
:00401DB4 80BD00FAFFFF00 cmp byte ptr [ebp+FFFFFA00], 00
:00401DBB 5F pop edi
:00401DBC 5E pop esi
:00401DBD 5B pop ebx
:00401DBE 751C jne 00401DDC
:00401DC0 6A00 push 00000000
:00401DC2 6A00 push 00000000

* Possible Reference to String Resource ID=00018: "UNREGISTERED SHAREWARE VERSION - PLEASE REGISTER"
|
:00401DC4 6A12 push 00000012
:00401DC6 E8C5A10200 call 0042BF90
:00401DCB 50 push eax
:00401DCC 8D8500FAFFFF lea eax, dword ptr [ebp+FFFFFA00]
:00401DD2 50 push eax

* Reference To: USER32.wsprintfA, Ord:02ACh
|
:00401DD3 FF1568E34300 Call dword ptr [0043E368] <== 打印未授权信息
:00401DD9 83C414 add esp, 00000014 <== 向下很长一段与分析无关

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401DBE(C)
|
:00401DDC 8D8500FAFFFF lea eax, dword ptr [ebp+FFFFFA00]
:00401DE2 50 push eax

* Possible Reference to Dialog: DialogID_009C, CONTROL_ID:0483, "License"
|
:00401DE3 6883040000 push 00000483
:00401DE8 FF7508 push [ebp+08]

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
|
:00401DEB FF1534E34300 Call dword ptr [0043E334]
:00401DF1 C9 leave
:00401DF2 C3 ret

.........

* Possible StringData Ref from Data Obj ->"!!!"
|
:00401EAC 6858214400 push 00442158
:00401EB1 50 push eax
:00401EB2 E829330300 call 004351E0
:00401EB7 59 pop ecx
:00401EB8 8D8580FBFFFF lea eax, dword ptr [ebp+FFFFFB80]
:00401EBE 59 pop ecx
:00401EBF 57 push edi
:00401EC0 50 push eax
:00401EC1 E8FA330300 call 004352C0
:00401EC6 59 pop ecx
:00401EC7 8D840580FBFFFF lea eax, dword ptr [ebp+eax-00000480]
:00401ECE 50 push eax
:00401ECF 53 push ebx
:00401ED0 FF7508 push [ebp+08]
:00401ED3 FFD6 call esi
:00401ED5 8D8580FBFFFF lea eax, dword ptr [ebp+FFFFFB80]

* Possible StringData Ref from Data Obj ->"winamp.ini"
|
:00401EDB 687C214400 push 0044217C
:00401EE0 50 push eax

* Possible StringData Ref from Data Obj ->"RegisteredTo"
|
:00401EE1 686C214400 push 0044216C

* Possible StringData Ref from Data Obj ->"WinampRegInfo"
|
:00401EE6 685C214400 push 0044215C

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:02E5h
|
:00401EEB FF1530E14300 Call dword ptr [0043E130] <== 这一段会在点击“OK”时执行，向ini文件写RI

* Possible Reference to String Resource ID=00001: "You must first exit Winamp before uninstalling."
|
:00401EF1 6A01 push 00000001
:00401EF3 FF7508 push [ebp+08]

* Reference To: USER32.EndDialog, Ord:00B9h
|
:00401EF6 FF151CE44300 Call dword ptr [0043E41C]
:00401EFC 8B7D10 mov edi, dword ptr [ebp+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401E6C(C)
|

* Possible Reference to Dialog: DialogID_00BF, CONTROL_ID:048B, ""
|
:00401EFF B88B040000 mov eax, 0000048B
:00401F04 663BF8 cmp di, ax
:00401F07 7405 je 00401F0E
:00401F09 663BFB cmp di, bx
:00401F0C 7552 jne 00401F60

对关键 Call 004252D1的分析请见(三)
标 题:WinAmp V2.11的注册机制分析(二) (8千字)
发信人:Fpc
时 间:2001-4-8 14:41:31
详细信息:
WinAmp V2.11的注册机制分析(二)（初学者必读）
转载本文请注明出处，并保持文章的完整性。本文不得用于任何商业场合，仅供学习和参考。
作者： Fpc （感谢直接和间接提供帮助的所有朋友）
目的： 分析注册机制
工具： SI 4.05, Wdasm 8.93, Hedit 2.0

程序段（2），输入注册信息的每次输入时执行：根据Rn计算Rc，若Irc=Rc则激活“OK”表示可以将RI写入“winamp.ini”文件中

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401F07(C)
|
:00401F0E C1EF10 shr edi, 10
:00401F11 6681FF0003 cmp di, 0300
:00401F16 7548 jne 00401F60
:00401F18 8B7D08 mov edi, dword ptr [ebp+08]
:00401F1B 8D4D80 lea ecx, dword ptr [ebp-80]
:00401F1E 6880000000 push 00000080
:00401F23 51 push ecx
:00401F24 50 push eax
:00401F25 57 push edi
:00401F26 FFD6 call esi <== 读Name文本框，将取得的Rn保存在 Ebp-80处
:00401F28 6A00 push 00000000
:00401F2A 6A00 push 00000000
:00401F2C 53 push ebx
:00401F2D 57 push edi

* Reference To: USER32.GetDlgItemInt, Ord:0103h
|
:00401F2E FF152CE34300 Call dword ptr [0043E32C] <== 读Reg#文本框，返回值在 Eax中
:00401F34 8BF0 mov esi, eax
:00401F36 8D4580 lea eax, dword ptr [ebp-80]
:00401F39 50 push eax
:00401F3A E892330200 call 004252D1 <== !! 关键Call，由Rn计算得出Rc，保存在Eax。具体分析请看（三）
:00401F3F 3BC6 cmp eax, esi <== 比较Rc与Irc
:00401F41 59 pop ecx
:00401F42 750A jne 00401F4E
:00401F44 807D8000 cmp byte ptr [ebp-80], 00
:00401F48 7404 je 00401F4E

* Possible Reference to String Resource ID=00001: "You must first exit Winamp before uninstalling."
|
:00401F4A 6A01 push 00000001 <== “OK”为Enable
:00401F4C EB02 jmp 00401F50

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401F42(C), :00401F48(C)
|
:00401F4E 6A00 push 00000000 <== “OK”为Disable

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401F4C(U)
|

* Possible Reference to String Resource ID=00001: "You must first exit Winamp before uninstalling."
|
:00401F50 6A01 push 00000001
:00401F52 57 push edi

* Reference To: USER32.GetDlgItem, Ord:0102h
|
:00401F53 FF1574E34300 Call dword ptr [0043E374]
:00401F59 50 push eax

* Reference To: USER32.EnableWindow, Ord:00B7h
|
:00401F5A FF1530E34300 Call dword ptr [0043E330] <== 修改按钮状态

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401E43(C), :00401F0C(C), :00401F16(C)
|
:00401F60 33C0 xor eax, eax
:00401F62 5B pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401E36(U)
|
:00401F63 5F pop edi
:00401F64 5E pop esi
:00401F65 C9 leave
:00401F66 C21000 ret 0010

Call 435150 比较在RI中是否含有"!!!"

入口：Ecx指向"!!!"+'\0'
出口：错误则eax=0，正确则eax指向RI的!!!123456，

* Referenced by a CALL at Addresses:
| 有N处调用，我用了 Echo y|Format C:/u

:00435150 8B4C2408 mov ecx, dword ptr [esp+08] <== Ecx=442158，指向"!!!"+'\0'
:00435154 57 push edi
:00435155 53 push ebx
:00435156 56 push esi
:00435157 8A11 mov dl, byte ptr [ecx] <== Dl取得第一个'!'
:00435159 8B7C2410 mov edi, dword ptr [esp+10] <== Edi=Ebp-200=6DC4F8，即RI首址
:0043515D 84D2 test dl, dl
:0043515F 7469 je 004351CA <== Dl=0证明比较完成，跳下去准备返回（怎么可能?!）
:00435161 8A7101 mov dh, byte ptr [ecx+01] <== 第二个'!'到Dh
:00435164 84F6 test dh, dh
:00435166 744F je 004351B7

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004351A2(C), :004351B5(U)
|
:00435168 8BF7 mov esi, edi
:0043516A 8B4C2414 mov ecx, dword ptr [esp+14] <== Ecx=442158，指向"!!!"+'\0'
:0043516E 8A07 mov al, byte ptr [edi]
:00435170 46 inc esi
:00435171 38D0 cmp al, dl <== 看Al是否为'!'
:00435173 7415 je 0043518A
:00435175 84C0 test al, al
:00435177 740B je 00435184 <== Al为空则失败

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435182(C)
|
:00435179 8A06 mov al, byte ptr [esi]
:0043517B 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043518F(C)
|
:0043517C 38D0 cmp al, dl
:0043517E 740A je 0043518A <== 向下跳检查RI中是否含三个'!'
:00435180 84C0 test al, al
:00435182 75F5 jne 00435179 <== 直到Al取到'!'；若不跳则说明在遇到"!!!"之前，RI已经结束（RI中不含!!!）,失败

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435177(C)
|
:00435184 5E pop esi
:00435185 5B pop ebx
:00435186 5F pop edi
:00435187 33C0 xor eax, eax
:00435189 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00435173(C), :0043517E(C)
|
:0043518A 8A06 mov al, byte ptr [esi] <== 从RI中!之后再读一字节
:0043518C 46 inc esi
:0043518D 38F0 cmp al, dh
:0043518F 75EB jne 0043517C <== 若不等, 则在Rn中含'!'
:00435191 8D7EFF lea edi, dword ptr [esi-01]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004351B3(C)
|
:00435194 8A6102 mov ah, byte ptr [ecx+02]
:00435197 84E4 test ah, ah
:00435199 7428 je 004351C3
:0043519B 8A06 mov al, byte ptr [esi] <== 从Rn中取第三个'!'
:0043519D 83C602 add esi, 00000002
:004351A0 38E0 cmp al, ah
:004351A2 75C4 jne 00435168
:004351A4 8A4103 mov al, byte ptr [ecx+03] <== Al应取到0
:004351A7 84C0 test al, al
:004351A9 7418 je 004351C3 <== Al为空表示正常结束
:004351AB 8A66FF mov ah, byte ptr [esi-01]
:004351AE 83C102 add ecx, 00000002 <== 若正确，这里不会被执行
:004351B1 38E0 cmp al, ah
:004351B3 74DF je 00435194
:004351B5 EBB1 jmp 00435168

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435166(C)
|
:004351B7 33C0 xor eax, eax <== 跳到这里则RI形式错误
:004351B9 5E pop esi
:004351BA 5B pop ebx
:004351BB 5F pop edi
:004351BC 8AC2 mov al, dl
:004351BE E933210000 jmp 004372F6

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00435199(C), :004351A9(C)
|
:004351C3 8D47FF lea eax, dword ptr [edi-01] <== 正确的出口，我是这里返回的
:004351C6 5E pop esi
:004351C7 5B pop ebx
:004351C8 5F pop edi
:004351C9 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043515F(C)
|
:004351CA 8BC7 mov eax, edi <== 也是正确出口
:004351CC 5E pop esi
:004351CD 5B pop ebx
:004351CE 5F pop edi
:004351CF C3 ret

上面跳来跳去的有些乱(上跳下跳，左跳右跳，原来每个条件都不一般)，不知大家看懂没有，找源码跟一跟就明白啦！

对关键 Call 004252D1的分析请见(三)

标 题:WinAmp V2.11的注册机制分析(三) (15千字)
发信人:Fpc
时 间:2001-4-8 14:42:31
详细信息:

WinAmp V2.11的注册机制分析(三)（初学者必读）
转载本文请注明出处，并保持文章的完整性。本文不得用于任何商业场合，仅供学习和参考。
作者： Fpc （感谢直接和间接提供帮助的所有朋友）
目的： 分析注册机制
工具： SI 4.05, Wdasm 8.93, Hedit 2.0

下面是CALL 004252D1的核心程序，00401D8D是打开菜单“Nullsoft WinAmp...”（即“关于”）时的调用，第二次是输入注册信息时的调用，第三次我也不清楚。
这段程序负责由RegisterName(Rn)计算出RegisterCode(Rc)，放到Eax中。

* Referenced by a CALL at Addresses:
|:00401D8D , :00401F3A , :004254FE
|
:004252D1 55 push ebp
:004252D2 8BEC mov ebp, esp
:004252D4 81EC00010000 sub esp, 00000100
:004252DA 53 push ebx
:004252DB 56 push esi
:004252DC 57 push edi

:004252DD 6A3F push 0000003F
:004252DF 33DB xor ebx, ebx
:004252E1 59 pop ecx <== Ecx=3F
:004252E2 209D00FFFFFF and byte ptr [ebp+FFFFFF00], bl
:004252E8 33C0 xor eax, eax
:004252EA 8DBD01FFFFFF lea edi, dword ptr [ebp+FFFFFF01]
:004252F0 6800010000 push 00000100
:004252F5 F3 repz
:004252F6 AB stosd
:004252F7 FF7508 push [ebp+08]
:004252FA 66AB stosw
:004252FC AA stosb <== 从4252E2到此将 Ebp-100到Ebp处清0
:004252FD 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00425303 50 push eax
:00425304 E8E7010100 call 004354F0 <== 这次调用将Rn复制到Ebp-100，见分析。
:00425309 83C40C add esp, 0000000C
:0042530C 389D00FFFFFF cmp byte ptr [ebp+FFFFFF00], bl
:00425312 7428 je 0042533C
:00425314 8DB500FFFFFF lea esi, dword ptr [ebp+FFFFFF00]
:0042531A 33FF xor edi, edi
<== 至此，入口： Edi=Ebx=0
* Referenced by a (U)nconditional or (C)onditional Jump at Address: <== !! 这个循环计算中间结果，很关键
|:0042533A(C)
|
:0042531C 56 push esi
:0042531D E861000000 call 00425383 <== 从Esi开始取4字节，作运算，结果在Eax中。请看下面
:00425322 59 pop ecx
:00425323 8BCF mov ecx, edi <== 随着循环，Edi=0、2，4，6，8，A...
:00425325 83E10F and ecx, 0000000F
:00425328 D3E0 shl eax, cl <== 左移位
:0042532A 85C0 test eax, eax
:0042532C 7C04 jl 00425332 <== 是负数则向下跳
:0042532E 03D8 add ebx, eax <== 很少被执行到
:00425330 EB02 jmp 00425334 <== 循环次数为Rn长度

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042532C(C)
|
:00425332 2BD8 sub ebx, eax <== Ebx放累加结果

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00425330(U)
|
:00425334 47 inc edi
:00425335 47 inc edi <== Edi=Edi+2
:00425336 46 inc esi <== Esi取Rn的下一个字节
:00425337 803E00 cmp byte ptr [esi], 00 <== 检查是否结束
:0042533A 75E0 jne 0042531C <== 未完则继续，循环次数为Rn长度

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00425312(C)
|
:0042533C 8BC3 mov eax, ebx <== 中间结果送 Eax
:0042533E B940420F00 mov ecx, 000F4240 <== Ecx= 1,000,000(Dec)
:00425343 6BC025 imul eax, 00000025 <== Eax= Eax*37(Dec)
:00425346 99 cdq
:00425347 F7F9 idiv ecx
:00425349 8BCA mov ecx, edx <== 余数送Ecx保存，很重要（我跟到下面要返回的语句，向回找了半天才找到）
:0042534B 8BF2 mov esi, edx <== 余数送Esi，到 425352继续处理
:0042534D 6BC964 imul ecx, 00000064 <== Ecx=Ecx*100(Dec)
:00425350 33FF xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address: <== 到 425369的这个循环会被执行几次
|:00425369(U)
|
:00425352 85F6 test esi, esi <== Esi是否为0
:00425354 7415 je 0042536B <== 是则跳出这一循环
:00425356 8BC6 mov eax, esi <== Esi->Eax，作处理准备

:00425358 6A64 push 00000064
:0042535A 99 cdq
:0042535B 5B pop ebx
:0042535C F7FB idiv ebx <== 被100(Dec)除
:0042535E 8BC6 mov eax, esi
:00425360 53 push ebx
:00425361 5E pop esi
:00425362 03FA add edi, edx <== Edi放余数累加和
:00425364 99 cdq
:00425365 F7FE idiv esi
:00425367 8BF0 mov esi, eax <== 商被送到Esi
:00425369 EBE7 jmp 00425352

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00425354(C)
|
:0042536B 8D047F lea eax, dword ptr [edi+2*edi] <== Eax=Edi*3

|
:0042536E 6A04 push 00000004
:00425370 99 cdq
:00425371 5E pop esi
:00425372 F7FE idiv esi <== 再被4除

|
:00425374 6A64 push 00000064
:00425376 5E pop esi
:00425377 5F pop edi
:00425378 99 cdq
:00425379 F7FE idiv esi <== 再被100除
:0042537B 5E pop esi
:0042537C 5B pop ebx
:0042537D 8BC2 mov eax, edx <== 余数送 Eax
:0042537F 03C1 add eax, ecx <== Eax= Eax+Ecx (看42534D)，这是最终结果
:00425381 C9 leave
:00425382 C3 ret

* Referenced by a CALL at Address:
|:0042531D
|
:00425383 55 push ebp
:00425384 8BEC mov ebp, esp
:00425386 51 push ecx
:00425387 8065FC00 and byte ptr [ebp-04], 00
:0042538B 57 push edi
:0042538C 33C0 xor eax, eax
:0042538E 8D7DFD lea edi, dword ptr [ebp-03]
:00425391 66AB stosw
:00425393 6A04 push 00000004
:00425395 FF7508 push [ebp+08] <== 源字符串地址压栈
:00425398 AA stosb <== 从Ebp-04处建立了4字节的临时缓冲区

:00425399 8D45FC lea eax, dword ptr [ebp-04] <==
:0042539C 50 push eax <== 目标区地址压栈
:0042539D E84E010100 call 004354F0 <== 又一次对这个CALL的调用，不过这次是从Esi处取 4 字节到临时缓冲区，我在这里转的头晕，大家可以看一看。
:004253A2 0FB645FE movzx eax, byte ptr [ebp-02] <== 相当于 al=[Esi+2]，高位是0，下同
:004253A6 0FB64DFC movzx ecx, byte ptr [ebp-04] <== cl=[Esi]
:004253AA 0FB655FD movzx edx, byte ptr [ebp-03] <== dl=[Esi+1]
:004253AE 33C1 xor eax, ecx <== Al^=Cl
:004253B0 83C40C add esp, 0000000C
:004253B3 0FB64DFF movzx ecx, byte ptr [ebp-01] <== cl=[Esi+3]
:004253B7 F7D1 not ecx <== !Ecx
:004253B9 F7D0 not eax <== !Eax
:004253BB 33CA xor ecx, edx <== Cl^=Dl
:004253BD 5F pop edi
:004253BE 03C1 add eax, ecx <== Eax+=Ecx
:004253C0 C9 leave
:004253C1 C3 ret

call 004354F0，这个CALL是从源字符串区向目标缓冲区复制字串，长度由调用前的压栈决定；出口：将目标缓冲区地址送 Eax。
里面跳转太多，看不明白关系不大，它没有别的功能。

* Referenced by a CALL at Addresses:
|:00403EF8 , :00410333 , :00410517 , :00425304 , :0042539D
|:00425B3F , :00425BF1 , :004294AF , :0042951D , :00439DCA
|
:004354F0 8B4C240C mov ecx, dword ptr [esp+0C] <== 调用此Call前的倒数第三次Push，为100或4
:004354F4 57 push edi
:004354F5 85C9 test ecx, ecx
:004354F7 747A je 00435573 <== 两处调用都不跳
:004354F9 56 push esi
:004354FA 53 push ebx
:004354FB 8BD9 mov ebx, ecx <==
:004354FD 8B742414 mov esi, dword ptr [esp+14] <== !! Esi为源字串地址，注意 @42539D调用时，每次都有Esi=Esi+1

:00435501 F7C603000000 test esi, 00000003 <== Esi低字节是否为03
:00435507 8B7C2410 mov edi, dword ptr [esp+10] <== !! 调用此Call前的最后一次Push，均为Eax，是目标地址
:0043550B 7507 jne 00435514 <== 大多数情况下不会跳
:0043550D C1E902 shr ecx, 02
:00435510 756F jne 00435581 <== 会跳走
:00435512 EB21 jmp 00435535

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043550B(C), :00435527(C)
|
:00435514 8A06 mov al, byte ptr [esi]
:00435516 46 inc esi
:00435517 8807 mov byte ptr [edi], al
:00435519 47 inc edi
:0043551A 49 dec ecx
:0043551B 7425 je 00435542
:0043551D 84C0 test al, al
:0043551F 7429 je 0043554A

* Possible Reference to String Resource ID=00003: "Uninstall canceled."
|
:00435521 F7C603000000 test esi, 00000003
:00435527 75EB jne 00435514
:00435529 8BD9 mov ebx, ecx
:0043552B C1E902 shr ecx, 02
:0043552E 7551 jne 00435581

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043557F(C)
|
:00435530 83E303 and ebx, 00000003
:00435533 740D je 00435542

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00435512(U), :00435540(C)
|
:00435535 8A06 mov al, byte ptr [esi]
:00435537 46 inc esi
:00435538 8807 mov byte ptr [edi], al
:0043553A 47 inc edi
:0043553B 84C0 test al, al
:0043553D 742F je 0043556E
:0043553F 4B dec ebx
:00435540 75F3 jne 00435535

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043551B(C), :00435533(C)
|
:00435542 8B442410 mov eax, dword ptr [esp+10]
:00435546 5B pop ebx
:00435547 5E pop esi
:00435548 5F pop edi
:00435549 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043551F(C)
|

:0043554A F7C703000000 test edi, 00000003
:00435550 7412 je 00435564

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435562(C)
|
:00435552 8807 mov byte ptr [edi], al
:00435554 47 inc edi
:00435555 49 dec ecx
:00435556 0F848A000000 je 004355E6
:0043555C F7C703000000 test edi, 00000003
:00435562 75EE jne 00435552

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435550(C)
|
:00435564 8BD9 mov ebx, ecx
:00435566 C1E902 shr ecx, 02
:00435569 756C jne 004355D7

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043556F(C), :004355E4(C)
|
:0043556B 8807 mov byte ptr [edi], al
:0043556D 47 inc edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043553D(C)
|
:0043556E 4B dec ebx
:0043556F 75FA jne 0043556B
:00435571 5B pop ebx
:00435572 5E pop esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004354F7(C)
|
:00435573 8B442408 mov eax, dword ptr [esp+08]
:00435577 5F pop edi
:00435578 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00435599(C), :004355B1(C)
|
:00435579 8917 mov dword ptr [edi], edx
:0043557B 83C704 add edi, 00000004
:0043557E 49 dec ecx
:0043557F 74AF je 00435530 <== 处理完成则跳上去

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
<== 从这里到返回处是将字串从[Esi]处复制到[Edi]，长度与Ecx有关，不够则在[Edi]后面补0
|:00435510(C), :0043552E(C)
|
:00435581 BAFFFEFE7E mov edx, 7EFEFEFF <--
:00435586 8B06 mov eax, dword ptr [esi] <--
:00435588 03D0 add edx, eax
:0043558A 83F0FF xor eax, FFFFFFFF
:0043558D 33C2 xor eax, edx
:0043558F 8B16 mov edx, dword ptr [esi]
:00435591 83C604 add esi, 00000004
:00435594 A900010181 test eax, 81010100 <-- 检查 Eax取到的是否为0，手法很是怪异？！
:00435599 74DE je 00435579
:0043559B 84D2 test dl, dl
:0043559D 742C je 004355CB
:0043559F 84F6 test dh, dh
:004355A1 741E je 004355C1
:004355A3 F7C20000FF00 test edx, 00FF0000
:004355A9 740C je 004355B7
:004355AB F7C2000000FF test edx, FF000000
:004355B1 75C6 jne 00435579 <== 跳走表示edx取到的各字节均为非0
:004355B3 8917 mov dword ptr [edi], edx
:004355B5 EB18 jmp 004355CF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004355A9(C)
|
:004355B7 81E2FFFF0000 and edx, 0000FFFF
:004355BD 8917 mov dword ptr [edi], edx
:004355BF EB0E jmp 004355CF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004355A1(C)
|
:004355C1 81E2FF000000 and edx, 000000FF
:004355C7 8917 mov dword ptr [edi], edx
:004355C9 EB04 jmp 004355CF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043559D(C)
|
:004355CB 33D2 xor edx, edx
:004355CD 8917 mov dword ptr [edi], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004355B5(U), :004355BF(U), :004355C9(U)
|
:004355CF 83C704 add edi, 00000004
:004355D2 33C0 xor eax, eax
:004355D4 49 dec ecx
:004355D5 740A je 004355E1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435569(C)
|
:004355D7 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004355DF(C)
|
:004355D9 8907 mov dword ptr [edi], eax
:004355DB 83C704 add edi, 00000004
:004355DE 49 dec ecx
:004355DF 75F8 jne 004355D9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004355D5(C)
|
:004355E1 83E303 and ebx, 00000003
:004355E4 7585 jne 0043556B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00435556(C)
|
:004355E6 8B442410 mov eax, dword ptr [esp+10]
:004355EA 5B pop ebx
:004355EB 5E pop esi
:004355EC 5F pop edi
:004355ED C3 ret

标 题:注册机也贴上 (2千字)
发信人:Fpc
时 间:2001-4-8 14:44:17
详细信息:

注册机
转载本文请注明出处，并保持文章的完整性。本文不得用于任何商业场合，仅供学习和参考。
作者： Fpc （感谢直接和间接提供帮助的所有朋友）
工具： BC++ Builder 5.0(对ASM的兼容性非常不错，可惜我用的不熟)

写教程真是很累的一件事，想起众多前辈的妙文，就知道他们付出了什么。不过在这过程中是学到了一些，尤其是那些自己原来不太明白之处，要去想清楚，否则错误连连，走在街上肯定被痛扁。有意把这一篇写的很罗嗦，只是希望大家从中学到知识，如果再写，一定会是很简练。当然水平还是基础级的，需要的只是耐心！！
下面是注册机：

//---------------------------------------------------------------------------
// KeyGen for WinAmp 2.11 by Fpc
// edtName为输入注册姓名的文本框，edtCode为显示注册码的文本框（只读）

void __fastcall TForm1::edtNameChange(TObject *Sender)
{
char name[255], code[255] = " ";
int i;
long value = 0;
for(i=0;i<255;i++)
name[i]='\0x0';

if(edtName->Text.IsEmpty()){
edtCode->Text = "";
return;
}
strcpy(name, edtName->Text.c_str());

_asm
{
lea esi, name
xor edi, edi
xor ebx, ebx
loop1:
movzx eax, byte ptr [Esi+2]
movzx ecx, byte ptr [Esi]
movzx edx, byte ptr [Esi+1]
xor eax, ecx
movzx ecx, byte ptr [Esi+3]
not ecx
not eax
xor ecx, edx
add eax, ecx
mov ecx, edi
and ecx, 0x0000000F
shl eax, cl
test eax, eax
jl iflittle
add ebx, eax
jmp nextchar

iflittle:
sub ebx, eax

nextchar:
inc edi
inc edi
inc esi
cmp byte ptr [esi], 00
jne loop1 // the first loop

mov eax, ebx
mov ecx, 0x000F4240
imul eax, 0x00000025
cdq
idiv ecx
mov ecx, edx
mov esi, edx
imul ecx, 0x00000064
xor edi, edi

loop2:
test esi, esi
je over
mov eax, esi

push 0x00000064
cdq
pop ebx
idiv ebx
mov eax, esi
push ebx
pop esi
add edi, edx
cdq
idiv esi
mov esi, eax
jmp loop2 // the second loop

over:
lea eax, dword ptr [edi+2*edi]
push 0x00000004
cdq
pop esi
idiv esi
push 0x00000064
pop esi
cdq
idiv esi
mov eax, edx
add eax, ecx
mov value,eax
}
wsprintf(code, "%ld", value);
edtCode->Text = code;
}
//---------------------------------------------------------------------------
// 以上经编译通过，没有问题

Fpc @2001/03/26


winamp的皮肤制作软件skinner

标 题:winamp的皮肤制作软件skinner注册框之去除篇 （爆破难度：中等） (4千字)
发信人:小球
时 间:2001-3-18 11:19:07
详细信息:
winamp的皮肤制作软件skinner注册框之去除篇 （爆破难度：中等）

工具：softice for9x，w32dasm ver 8.93 ，hiew

首先用w32反汇编，在工具栏中找到strn ref按钮，找到出错的关键字：
"Wrong registration number!"
双击，它在程序中有两个地址。来到这里：
* Possible StringData Ref from Data Obj ->"Wrong registration number!"
|
:00406C2E 6894584200 push 00425894
:00406C33 56 push esi
向上查找....
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406BB4(C) *注意这里！！！
|
:00406C22 83F801 cmp eax, 00000001
:00406C25 751D jne 00406C44 *改这里为je
:00406C27 6A00 push 00000000
再双击来到这里：
* Possible StringData Ref from Data Obj ->"Wrong registration number!"
|
:0040B87A 6894584200 push 00425894
:0040B87F 56 push esi
还是向上查找：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040B83A(C)
|
:0040B86E 83F801 cmp eax, 00000001
:0040B871 751D jne 0040B890 *改为je
:0040B873 6A00 push 00000000
以上只是把出错信息跳过。
记得这里吧！
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406BB4(C) *找到这个跳转地址
|
:00406C22 83F801 cmp eax, 00000001
:00406C25 751D jne 00406C44
:00406C27 6A00 push 00000000

来到这：
* Reference To: USER32.DialogBoxParamA, Ord:008Eh
|
:00406BAB FF154C254300 Call dword ptr [0043254C]
:00406BB1 83F803 cmp eax, 00000003
:00406BB4 756C jne 00406C22 *改为je，当你按ok时就会变为This product is licensed to

那位问了：“能不能一直让它显示This product is licensed to 呢？”当然能。再在串式内容参考清单中，找到This product is licensed to，双击它发现也有两个地址，来到这里：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406AC9(C)
|
:00406AD7 A33C524200 mov dword ptr [0042523C], eax
:00406ADC 85C0 test eax, eax
:00406ADE 7440 je 00406B20 *这里改为jne
:00406AE0 8B742478 mov esi, dword ptr [esp+78]

* Possible StringData Ref from Data Obj ->" This product is licensed to "
|
:00406AE4 6850594200 push 00425950
再运行试试。
可是问题又出来了，当你按注册按钮时还是会弹出注册框，改掉它。运行程序来到注册处，
用ice下断bpx hmemcpy
按ok
程序被中断， bc*清除断点（以下同理），按f12来到这里：
:00406D81 FFD7 call edi *看到了吗？这就是调用注册框的call
:00406D83 8D442438 lea eax, dword ptr [esp+38] *程序会被中断到这里
:00406D87 6A29 push 00000029
:00406D89 50 push eax

向上查找吧...
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406D1B(C)
|
:00406D5B 668B442470 mov ax, word ptr [esp+70]
:00406D60 663D0100 cmp ax, 0001
:00406D64 0F8519010000 jne 00406E83 *改为je
再运行试试，怎么样？没有了吧？
还有一个问题是：当你要保存你做好的skin时，它还会弹出注册框。
来吧干掉它！
用ctrl＋d 呼出ice
用bpx sendmessage下断
程序被断，按f12 n次来到这里：（它的领空哦）
:0040B1B8 FFD7 call edi
:0040B1BA 83F801 cmp eax, 00000001
:0040B1BD 0F85CD060000 jne 0040B890
:0040B1C3 68027F0000 push 00007F02
:0040B1C8 6A00 push 00000000
一直按f10，按啊，按啊，按啊......直到出现注册框为止。应该是这里：
* Possible Reference to Dialog: DialogID_00F0
|
:0040B816 68F0000000 push 000000F0
:0040B81B 50 push eax
:0040B81C FFD7 call edi *这是那个出错框
:0040B81E 85C0 test eax, eax
:0040B820 746E je 0040B890
:0040B822 6A00 push 00000000
:0040B824 A170FB4200 mov eax, dword ptr [0042FB70]
:0040B829 68006D4000 push 00406D00
:0040B82E 56 push esi
向上查找，来到：
:0040B7F6 FF15C0254300 Call dword ptr [004325C0]
:0040B7FC 833D3C52420000 cmp dword ptr [0042523C], 00000000
:0040B803 0F8587000000 jne 0040B890 *改为je
好了，试试吧！如果没有错的话。应该成功了！

标 题:注册码 (129字)
发信人:夜月
时 间:2001-3-18 19:43:25
详细信息:

WINAMP SKIN MAKER
：00406DEB CMP EDI，EBX
？ EDI 十进制为真注册码！
？ EDI 十进制为你输入的注册码！


WinBoost2001 Standard Edion

 标 题:★破解WinBoost2001 Standard Edion实录 (3千字)
发信人:AirHolder
时 间:2001-7-31 21:24:12
详细信息:
软件简介：功能强大的系统工具，有着金属质感的操作界面。能帮你设定一百多种 Win95/98 隐藏设定，每个独立的选项都有至少十五种以上的参数可以设置：包括系统、开始选单、Explorer、桌面、Internet 及其它等等，让你的 Win95/98 有特别感觉，并将Win98性能和效率发挥到最大。
破解工具：TRW2000v1.22
难度级别: 简单

破解步骤：
1.用TRW2000载入WinBoost2001，F5返回后按Register.....按钮，弹出注册对话框。
在弹出的注册对话框中填写：
注册名：AirHolder
注册码：111111
2.Ctrl+M弹出TRW主界面，下断点bpx hmemcpy后，F5返回WinBoost2001，按OK确定，这时被TRW2000拦截到。
3.下指令bc *，pmodule到达程序代码区。
4.一直不停按F10，到达如下区域：
------
016F:004BF654 CALL 00403C2C
016F:004BF659 XOR EBX,EBX
016F:004BF65B LEA ECX,[EBP+FFFFFE90]
016F:004BF661 MOVSX EDX,BX
016F:004BF664 MOV EAX,[004C1E7C]
016F:004BF669 MOV EAX,[EAX]
016F:004BF66B MOV EAX,[EAX+48]
016F:004BF66E MOV EAX,[EAX+24]
016F:004BF671 MOV ESI,[EAX]
016F:004BF673 NEAR [ESI+0C]
016F:004BF676 MOV EDX,[EBP+FFFFFE90]
016F:004BF67C MOV EAX,[EBP-18]
016F:004BF67F CALL 00403D98
016F:004BF684 JNZ 004BF690
------
EBP+FFFFFE90有点可疑，在004BF67C处下指令：D EDX，看到一连串的数字与字母的混合序列，怀疑是正确的注册码，赶紧抄下来。不过此时下指令D，你会看到在连续的内存空间中存有很多个注册码(具体多少个我没数，至少30个以上)。奇怪了，怎么会有这么多个注册码?
先不管，随便抄一个，然后X退出TRW2000。
重新输入：
注册名：AirHolder
注册码：1X2K1-T562F-U087C-6R4U8
注册成功!!!

破解后记：
1.还是用TRW2000，到达步骤四后，看到
------
016F:004BF67F CALL 00403D98
016F:004BF684 JNZ 004BF690
------
正确的注册码存在EDX中，那接下来的CALL 00403D98语句应该是调用判断输入的注册码是否正确的子程序。到达JNZ 004BF690(如果不为0则跳转至004BF690)程序跳转至004BF690，那么改为JZ 004BF690会怎样呢?即改为不跳转至004BF690，返回程序你会发现弹出注册成功的消息框!!!刚才我们仅仅是改了内存中的程序，下次启动程序时会不会说你没注册呢?
2.我们发现第二次启动程序后，程序仍然是注册过的，这表明什么呢?说明该程序判断注册成功只判断一次。第一次注册成功的结果程序肯定保存在什么地方了，第二次启动后直接读取其中的信息。假若注册不成功则不会保存注册结果，第二次启动后也不会读取其中的信息。
于是用RegShot和FileMon查看该程序注册成功前后对系统的注册表和哪些文件进行了读写操作。发现WinBoost2001有大量的注册表和文件读写动作，经分析得到了如下更为简捷的注册方法：
在注册表里HKEY_LOCAL_MACHINE\Software\Magellass\WinBoost 2001下
新建一个字符串值Registered="True"。
找到Windows目录下的Win.ini，在其中加入如下信息：
[WB]
Owner=AirHolder(这里随便填吧，想填啥就填啥)
Registered=True

[Settings]
Min=1
3.暴力破解：
紧接着后记1，在016F:004BF684 JNZ 004BF690处看到机器码为75 0A C7 05 74 3A 4C 00，改为JZ 004BF690实际上是将机器码75改为74，退出TRW2000和WinBoost2001，用UltraEdit打开WinBoost2001，查找75 0A C7 05 74 3A 4C 00，结果???查了半天告诉我没有。肯定是加壳了，用FileInfo对其一验真身，发现原来其主程序wb2k1s.exe用了AsProtect的壳，怪不得直接找找不到了。用caspr对其脱壳，脱完壳后再按上述改完程序后存盘。好了，现在启动WinBoost2001，按Register.....按钮，无论你输入什么注册名和注册码，程序都告诉你注册成功!!!

文：AirHolder
2001.7.31.


WindowBlinds 2.0

 标 题:WindowBlinds 2.0 （入门）?????? (729字)
发信人:2000yeah
时 间:2000-10-2 0:58:48
详细信息:
WindowBlinds 2.0 （入门）

简介：巨星级桌面美化工具。2.0和1.x版本比，速度有了很大提高，占用资源比1.X版本要少很多

这个软件简直酷毙，没有用是你的损失。

作者：2000yeah

级别：卖菜的

日期：2000年10.2

地址：http://www.windowblinds.net

大小：1.37M

工具：SOFTICE (用W32dasm，这个软件，一反汇编就死，用FI探测，不行，程序错误）

-------------------------那位大侠能看看这个软件，为什么一反汇编就死？告诉小弟一声-------------------------

由于没有直接得到汇编代码，只能抄一点。

按F10到

00410E37:MOV [EDI+01],AL

用D EDI+01,就可以看到注册码

－－－－－－－－－－－－－－初学破解，错误难免，请各位大侠指点，谢谢。－－－－－－2000.10.2－2000yeah－－－

name:2000yeah

Serial:WB-653e4446

标 题:关于破解 WindowBlinds 2.0 的补充（精华所在） (745字)
发信人:2000yeah
时 间:2000-10-2 2:17:40
详细信息:

关于破解 WindowBlinds 2.0 的补充（精华所在）

上次写的匆忙没有把这段写上。

WindowBlinds 2.0这个软件狡猾透了，软件必须注册两次，才能得到真正的注册码。

假如第一次你注册的名字是：2000

序列号为：78987

来到这里

00402DFA MOV EAX,[ESI+5C]

下D EAX

你将看到的是“WB-ab831a3“

这个就是注册码？你错了，这个不是的。

退出，继续注册。

这次的名字是：20000 （上次的2000）

序列号：123456789

具体走到那里我忘了，然后下 D EAX

你看到的是”WB-4f3ed377"

这个”WB-4f3ed377"才是第一次用2000作为名字的真正注册码

如果想知道20000的，你等下一次注册，然后看看，就知道了。

－－－－－－－－－－－－－－初学破解，错误难免，请各位大侠指点，谢谢。－－－－－－2000.10.2－2000yeah－－－


windows help designed pro v 2.3.3.0

标 题:如何破解windows help designed pro v 2.3.3.0 (2千字)
发信人:wocy
时 间:2001-3-12 0:56:22
详细信息:
如何破解windows help designed pro v 2.3.3.0
-----------------------------
雪椰
2000,12,27am
Email:wocy@263.net
Http://wocy.yeah.net(有本例中的补丁）

------------------------------
1,查找UNREGISTERED
:00573A21 A180895B00 mov eax, dword ptr [005B8980] 《---1
:00573A26 803800 cmp byte ptr [eax], 00 〈---2
:00573A29 741A je 00573A45

* Possible StringData Ref from Code Obj ->"; *** UNREGISTERED ***"
|
:00573A2B BA08435700 mov edx, 00574308
:00573A30 8D8534FEFFFF lea eax, dword ptr [ebp+FFFFFE34]
:00573A36 E87509E9FF call 004043B0
:00573A3B E85B26E9FF call 0040609B
:00573A40 E8E7EDE8FF call 0040282C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
2，BPX 1
跟踪得知2处为取167：5b97fa 〈---------3
3，bpmw 3 w ;you will go to
|:004662CE(C)
|
:00466339 C60001 mov byte ptr [eax], 01 <-----------4
:0046633C 55 push ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address
4, 改4处为mov xx,0
运行有协议成功提示，但无法继续运行
5，bpmw 3 r; you will go to
:0046552C 8B45F4 mov eax, dword ptr [ebp-0C]
:0046552F 803800 cmp byte ptr [eax], 00 <-----------5
:00465532 0F8500010000 jne 00465638
:00465538 F605BE9A5B0004 test byte ptr [005B9ABE], 04
:0046553F 7543 jne 00465584
:00465541 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->"Windows Help Designer is licenced "
->"for Standard Edition
You should "
->"purchase additional license for "
->"the Professional Edition

Windows "
->"Help Designer home page at http://www.winhelp."
->"gr"
|
6,改5处为cmp xx,1
7,runing....
8,这个世界清净了

标 题:据我的经验，好象只要其目录下有WHDPRO.LIC（不管该文件内容如何），都会成为注册版 (空)
发信人:1212
时 间:2001-3-12 17:54:42
详细信息:


windows进程管理大师!V3.0.1

标 题:爆解windows进程管理大师!V3.0.1（高手莫入） (6千字)
发信人:396
时 间:2001-3-30 12:55:45
详细信息:

爆解windows进程管理大师!V3.0.1（高手莫入）
作者：396
软件下载：http://go2.163.com/~meatbird/ProcCH.zip
软件介绍：Windows下的进程和文件管理程序，可以查看所有在内存中运行的程序，以及它们所用到的链接库或其他文件，
并可以终止任意指定的进程，同时提供对指定的程序进行监控。和同步更新几个指定的文件的功能。
兼容Win98,Win95,WinNT,Win2000。3.0.1版兼容各语言平台
=====================================================================
用w32dasm黄金版打开Proc.exe，寻找字符串，发现“注册成功！”
见下面：
* Possible StringData Ref from Code Obj ->"恭喜您"
|
:0048D374 B934D44800 mov ecx, 0048D434

* Possible StringData Ref from Code Obj ->"注册成功!"
向上看：
:0048D331 E87238FAFF call 00430BA8
:0048D336 8B45F4 mov eax, dword ptr [ebp-0C]
:0048D339 8D55F8 lea edx, dword ptr [ebp-08]
:0048D33C E86744FFFF call 004817A8
:0048D341 8B55F8 mov edx, dword ptr [ebp-08]
:0048D344 58 pop eax
:0048D345 E8526BF7FF call 00403E9C
:0048D34A 754D jne 0048D399<-------------跳转则失败！（1）

* Possible StringData Ref from Code Obj ->"windows进程管理大师"
|
:0048D34C BA20D44800 mov edx, 0048D420
:0048D351 8BC3 mov eax, ebx
:0048D353 E88038FAFF call 00430BD8
:0048D358 33D2 xor edx, edx
:0048D35A 8B8378040000 mov eax, dword ptr [ebx+00000478]
:0048D360 8B08 mov ecx, dword ptr [eax]
改（1）jne 为nop,即754d 改为9090，存盘运行注册成功！但开始仍显示出现“欢迎使用《windows进程管理大师》！您有30天的试用期”对话框。
回到w32dasm黄金版寻找这个字符串，找到：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00486E3D(C)
.
.

* Possible StringData Ref from Code Obj ->"欢迎使用《windows进程管理大师》！您有30天的试?
->"用期?
在00486E3D调用了此，转到00486E3D：
|
:00486DFF BA3C764800 mov edx, 0048763C
:00486E04 A174194900 mov eax, dword ptr [00491974]
:00486E09 8B30 mov esi, dword ptr [eax]
:00486E0B FF5610 call [esi+10]
:00486E0E A28C084900 mov byte ptr [0049088C], al
:00486E13 8A158C084900 mov dl, byte ptr [0049088C]
:00486E19 8B83B8040000 mov eax, dword ptr [ebx+000004B8]
:00486E1F 8B08 mov ecx, dword ptr [eax]
:00486E21 FF91B8000000 call dword ptr [ecx+000000B8]
:00486E27 8D55D0 lea edx, dword ptr [ebp-30]
:00486E2A 8B45F8 mov eax, dword ptr [ebp-08]
:00486E2D E876A9FFFF call 004817A8
:00486E32 8B45D0 mov eax, dword ptr [ebp-30]
:00486E35 8B55F4 mov edx, dword ptr [ebp-0C]
:00486E38 E85FD0F7FF call 00403E9C
:00486E3D 0F85B8000000 jne 00486EFB〈-------------（2）

* Possible StringData Ref from Code Obj ->"windows进程管理大师"
标准的风飘雪说的经典比较组合：
move eax ?????
move edx ?????
call ?????
jne ?????
在此下断点可找到注册码。
在（2）修改0f85为0f84,存盘运行对话框消失，运行正常。
但把时间往后调一年，又出现有求注册，注册不成功，出现"错误的注册信息，请重试！"
回到w32dasm黄金版寻找这个字符串，找到：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048E193(C)
|
:0048E26C 6A00 push 00000000
:0048E26E 668B0D20E34800 mov cx, word ptr [0048E320]
:0048E275 B203 mov dl, 03

* Possible StringData Ref from Code Obj ->"错误的注册信息，请重试！"
在0048E193调用了此，转到0048E193：
:0048E13D 8D4000 lea eax, dword ptr [eax+00]
:0048E140 55 push ebp
:0048E141 8BEC mov ebp, esp
:0048E143 33C9 xor ecx, ecx
:0048E145 51 push ecx
:0048E146 51 push ecx
:0048E147 51 push ecx
:0048E148 51 push ecx
:0048E149 51 push ecx
:0048E14A 51 push ecx
:0048E14B 51 push ecx
:0048E14C 53 push ebx
:0048E14D 56 push esi
:0048E14E 57 push edi
:0048E14F 8BD8 mov ebx, eax
:0048E151 33C0 xor eax, eax
:0048E153 55 push ebp
:0048E154 68BEE24800 push 0048E2BE
:0048E159 64FF30 push dword ptr fs:[eax]
:0048E15C 648920 mov dword ptr fs:[eax], esp
:0048E15F 8D55F8 lea edx, dword ptr [ebp-08]
:0048E162 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:0048E168 E83B2AFAFF call 00430BA8
:0048E16D 8B45F8 mov eax, dword ptr [ebp-08]
:0048E170 8D55FC lea edx, dword ptr [ebp-04]
:0048E173 E83036FFFF call 004817A8
:0048E178 8B45FC mov eax, dword ptr [ebp-04]
:0048E17B 50 push eax
:0048E17C 8D55F4 lea edx, dword ptr [ebp-0C]
:0048E17F 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:0048E185 E81E2AFAFF call 00430BA8
:0048E18A 8B55F4 mov edx, dword ptr [ebp-0C]
:0048E18D 58 pop eax
:0048E18E E8095DF7FF call 00403E9C
:0048E193 0F85D3000000 jne 0048E26C<-------------（3）
:0048E199 8D55EC lea edx, dword ptr [ebp-14]
:0048E19C A1700B4900 mov eax, dword ptr [00490B70]
:0048E1A1 8B00 mov eax, dword ptr [eax]
:0048E1A3 E83812FCFF call 0044F3E0
:0048E1A8 8B45EC mov eax, dword ptr [ebp-14]
:0048E1AB 8D55F0 lea edx, dword ptr [ebp-10]
:0048E1AE E809A7F7FF call 004088BC
:0048E1B3 8D45F0 lea eax, dword ptr [ebp-10]
在（3）修改0f85为0f84,存盘运行对话框消失，运行正常。一切OK！收工！
=================================================================

396
junpo@fashida.com
主页：http://www.zmdinfo.net

标 题:windows进程管理大师v3.0.1注册算法分析(未完成,哪位大客能帮忙完成) (390字)
发信人:风飘雪[CCG]
时 间:2001-3-29 20:17:41
详细信息:

windows进程管理大师v3.0.1注册算法分析(未完成,哪位大客能帮忙完成)
来自 共享软件注册中心
http://www.shareware.net.cn/dl.asp?id={0CB8E23A-FD70-40F2-B57F-7B50E2CD6F05}

注册码=字母+数字
数字
逐个(姓名ascii码×10+8)=>求和=>转为十进制
字母
有时不出现,规则没找出来,不知哪位能帮忙完成

姓名 a 注册码 A1560 61×10+8=618 ==>1560
姓名 fpx[CCG] 注册码 CCG11776

标 题:大概是这样。 (1千字)
发信人:THK
时 间:2001-3-29 23:39:23
详细信息:

字母处理部分：

016F:00481760 PUSH EBX
016F:00481761 PUSH ESI
016F:00481762 MOV [EBP-01],AL //将字母放入
016F:00481765 MOV BYTE [EBP-03],02 //
016F:00481769 MOV BYTE [EBP-02],01 //变量初始化
016F:0048176D MOV CL,[EBP-01] //读出字母
016F:00481770 DEC ECX
016F:00481771 SUB CL,02
016F:00481774 JC 004817A0
016F:00481776 INC ECX
016F:00481777 MOV BL,02
016F:00481779 XOR EAX,EAX
016F:0048177B MOV AL,[EBP-01]
016F:0048177E XOR EDX,EDX
016F:00481780 MOV DL,BL
016F:00481782 MOV ESI,EDX
016F:00481784 XOR EDX,EDX
016F:00481786 DIV ESI
016F:00481788 TEST EDX,EDX
016F:0048178A JNZ 0048178F
016F:0048178C INC BYTE [EBP-03]
016F:0048178F CMP BYTE [EBP-03],02
016F:00481793 JNA 0048179B //关键跳转
016F:00481795 MOV BYTE [EBP-02],00 //当[ebp-02]为0,则该字母不被选中(也就是说不显示）
016F:00481799 JMP SHORT 004817A0
016F:0048179B INC EBX
016F:0048179C DEC CL
016F:0048179E JNZ 00481779
016F:004817A0 MOV AL,[EBP-02] //return [ebp-02]
016F:004817A3 POP ESI
016F:004817A4 POP EBX
016F:004817A5 POP ECX
016F:004817A6 POP EBP
016F:004817A7 RET

标 题:注册机 （其实底下有）规则是如果是如果字母是素数则字母出现 (542字)
发信人:伪装者[CCG]
时 间:2001-4-1 14:47:21
详细信息:

 #include "stdio.h"
void zs(a)
{int i;
for(i=2;i if(a%i==0) break;
if(i==a) printf("%c",a-32);
}
main()
{
char string[81];
long d=0;
int i,c;
printf("******* PROC ********\nThis keygen is maked by Pretender\nPlease input
    your name : ");
gets(string);
printf("Your name is : ");
puts(string);
printf("Your Register code is : ");
for(i=0;(c=string[i])!='\0';i++)
{if(c<0) c+=256;
zs(c);
c=c*16;
d=c+8+d;
}
d+=(string[0]-string[i-1])*16;
printf("%d\n",d);
printf("Welcome to WWW.CRACKNOW.COM\n");}>

标 题:伪哥的注册机程序有点小问题,现贴出修正版(TC2.0) (710字)
发信人:风飘雪[CCG]
时 间:2001-4-2 11:04:29
详细信息:

 伪哥的注册机程序有点小问题,现贴出修正版(TC2.0)

***处有改动(需考虑大小写),请伪哥指正

#include "stdio.h"
void zs(a)
{int i;
for(i=2;a;i++) if(a%i==0) break;
      ****
if(i==a) {if((i>=64)&&(i<=90)) printf("%c",a); ****
else printf("%c",a-32);}
          ****
}
main()
{
char string[81];
long d=0;
int i,c;
printf("******* PROC ********\nThis keygen is maked by Pretender\nPlease input
    your name : ");
gets(string);
printf("Your name is : ");
puts(string);
printf("Your Register code is : ");
for(i=0;(c=string[i])!='\0';i++)
{if(c<0) c+=256;
zs(c);
c=c*16;
d=c+8+d;
}
d+=(string[0]-string[i-1])*16;
printf("%d\n",d);
printf("Welcome to WWW.CRACKNOW.COM\n");
}


windows优化大师 v1.0.2.7

标 题:windows优化大师 v1.0.2.7 (10千字)
发信人:happyhackwang
时 间:2001-3-11 21:03:12
详细信息:
软件名称:windows优化大师 v1.0.2.7
注册方式:name+phone+serial+pre-serrial
软件功能:注册表修改软件
作者:鲁锦
作者主页:http://lamb.shangdu.net
作者邮箱:mailoflujin@163.net
破解者:happyhackwang
邮箱:happyhackwang@263.net
OICQ:4696993(不在线^^)
注册方式:Patch(谁想写注册机,自己写吧!算法见后)
工具:Trw,w32dasm,my head,ultraedit(to write this article),ProcDump

首先感谢刘涛涛,Ru Feng,DingBoy,看雪他们的为CRACK所做的贡献
首先要对这个程序进行脱壳,用ProcDump Dump(full)可以脱下来(trw中pnewsec->procdump,不要rebuild PE)
原来的文件大小为:413K
脱壳后的文件大小为:0.99M
它是用ASPack 1.083压缩的,也可以用ProcDump直接脱壳

下面是反汇编的结果,配合softice,可以很容易破解

:004B30B7 E8500EF5FF call 00403F0C
:004B30BC 741D je 004B30DB ;这个判断总是能够跳转,所以不用Patch
:004B30BE 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Windows优化大师"
|
:004B30C0 B988324B00 mov ecx, 004B3288

* Possible StringData Ref from Code Obj ->"错误！注册失败。"
|
:004B30C5 BA8C334B00 mov edx, 004B338C
......
:004B30EF E80C55F5FF call 00408600 ;关键的call
:004B30F4 8D907D590200 lea edx, dword ptr [eax+0002597D]
:004B30FA 8B0DD0CB4D00 mov ecx, dword ptr [004DCBD0]
:004B3100 0301 add eax, dword ptr [ecx]
:004B3102 33D0 xor edx, eax
:004B3104 8BC2 mov eax, edx
:004B3106 3BD8 cmp ebx, eax ;名字与注册码分别算出来的数相比较
:004B3108 741D je 004B3127 ;(b2708)change to jmp,Patch的地方
:004B310A 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Windows优化大师"
|
:004B310C B988324B00 mov ecx, 004B3288

* Possible StringData Ref from Code Obj ->"错误！注册失败。"
|
:004B3111 BA8C334B00 mov edx, 004B338C
......
* Possible StringData Ref from Code Obj ->"注册成功。感谢您使用国产软件---您忠实的朋友“?
->"辰酢?
|
:004B31DA BAD8334B00 mov edx, 004B33D8

Patch:
004B3104 8BC2 mov eax, edx
8BC3 mov eax,ebx

现在看一下注册码的算法
:004B30EF E80C55F5FF call 00408600 ;关键的计算语句,追进去
:004B30F4 8D907D590200 lea edx, dword ptr [eax+0002597D] ;出口参数eax是用你输
:004B30FA 8B0DD0CB4D00 mov ecx, dword ptr [004DCBD0] ;入的注册码计算出来
:004B3100 0301 add eax, dword ptr [ecx] ;[ecx]=FD9C 预定义的
:004B3102 33D0 xor edx, eax ;eax=eax && edx
:004B3104 8BC2 mov eax, edx ;出口ebx是真正注册码
:004B3106 3BD8 cmp ebx, eax ;的校验和,这里进行比较
:004B3108 741D je 004B3127

edx=eax+2597D;
eax+=FD9C;
eax=edx&&eax;

:00408622 E8A5A6FFFF call 00402CCC ;关键

追进来可以看到:
:00402CD6 31C0 xor eax, eax ;初始化累加器
:00402CD8 31DB xor ebx, ebx
......
:00402CDF 8A1E mov bl, byte ptr [esi] ;esi是你输入的注册码的位置
:00402CE1 46 inc esi
:00402CE2 80FB20 cmp bl, 20 ;空格
:00402CE5 74F8 je 00402CDF
:00402CE7 B500 mov ch, 00
:00402CE9 80FB2D cmp bl, 2D ;-
:00402CEC 7469 je 00402D57
:00402CEE 80FB2B cmp bl, 2B ;+
:00402CF1 7466 je 00402D59
:00402CF3 80FB24 cmp bl, 24 ;$
:00402CF6 7466 je 00402D5E
:00402CF8 80FB78 cmp bl, 78 ;x
:00402CFB 7461 je 00402D5E
:00402CFD 80FB58 cmp bl, 58 ;X
:00402D00 745C je 00402D5E
:00402D02 80FB30 cmp bl, 30 ;0
:00402D05 7513 jne 00402D1A
:00402D07 8A1E mov bl, byte ptr [esi]
:00402D09 46 inc esi
:00402D0A 80FB78 cmp bl, 78
:00402D0D 744F je 00402D5E
:00402D0F 80FB58 cmp bl, 58
:00402D12 744A je 00402D5E
:00402D14 84DB test bl, bl
:00402D16 7420 je 00402D38
:00402D18 EB04 jmp 00402D1E

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402D05(C), :00402D5C(U)
|
:00402D1A 84DB test bl, bl
:00402D1C 7434 je 00402D52

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402D18(U), :00402D36(C)
|
:00402D1E 80EB30 sub bl, 30 ;是数字的话进行变换
:00402D21 80FB09 cmp bl, 09 ;数字的ASCII码值在30~39之间,数字在0~9之间
:00402D24 772C ja 00402D52
:00402D26 39F8 cmp eax, edi ;eax累加和,初始化为0,edi初始化为CCCCCCC
:00402D28 7728 ja 00402D52
:00402D2A 8D0480 lea eax, dword ptr [eax+4*eax] ;eax=eax*5
:00402D2D 01C0 add eax, eax ;eax=eax*2
:00402D2F 01D8 add eax, ebx ;eax=eax+ebx
:00402D31 8A1E mov bl, byte ptr [esi] ;取下一个字符
:00402D33 46 inc esi
:00402D34 84DB test bl, bl
:00402D36 75E6 jne 00402D1E

注册码校验和的算法总结如下
int j =getlength(serial);
int x=0;
for (int i=0;i<j;i++)
{
char ch=serial[i];
_ebx=atoi(ch);
x*=10;
x+=_ebx;//_ebx is the number that you input
}
x+=FD9C;
_edx=x+2597D;
x=x&&_edx;
return x;

而ebx中的数是怎么算出来的?我们看看:

:004B3034 BE01000000 mov esi, 00000001 ;esi=1,字节偏移量

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3059(C)
|
:004B3039 8B45F8 mov eax, dword ptr [ebp-08] ;取得字符串的地址(字符串1)
:004B303C 0FB64430FF movzx eax, byte ptr [eax+esi-01] ;取每一个字符
:004B3041 F7EB imul ebx ;乘,ebx初始化为1
:004B3043 05770F0000 add eax, 00000F77 ;与
:004B3048 99 cdq ;edx清零
:004B3049 33C2 xor eax, edx ;eax与edx异或,此时edx=0,所以eax不变
:004B304B 2BC2 sub eax, edx ;eax=eax-edx,eax不变
:004B304D BB40420F00 mov ebx, 000F4240 ;ebx=F4240
:004B3052 99 cdq ;edx清零
:004B3053 F7FB idiv ebx ;除
:004B3055 8BDA mov ebx, edx ;ebx=edx
:004B3057 46 inc esi ;增量
:004B3058 49 dec ecx ;计数器
:004B3059 75DE jne 004B3039 ;循环
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3032(C)
|
:004B305B 8B45F4 mov eax, dword ptr [ebp-0C] ;eax是电话号码的偏移地址(字符串2)
:004B305E E8990DF5FF call 00403DFC ;取得这个字符串的长度
:004B3063 8BC8 mov ecx, eax
:004B3065 83E902 sub ecx, 00000002
:004B3068 7C2B jl 004B3095
:004B306A 41 inc ecx ;到这里ecx是真正字符串的长度减去1,做计数器
:004B306B BE02000000 mov esi, 00000002 ;

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3093(C)
|
:004B3070 8B45F4 mov eax, dword ptr [ebp-0C] ;eax是字符串的地址
:004B3073 0FB64430FF movzx eax, byte ptr [eax+esi-01] ;从第二个字符开始取
:004B3078 F7EB imul ebx ;乘
:004B307A 8B15D0CB4D00 mov edx, dword ptr [004DCBD0] ;
:004B3080 0302 add eax, dword ptr [edx] ;[edx]=FD9C,固定的,是预定义的
:004B3082 99 cdq ;edx清零
:004B3083 33C2 xor eax, edx ;
:004B3085 2BC2 sub eax, edx ;eax不变
:004B3087 BB40420F00 mov ebx, 000F4240 ;ebx=F4240
:004B308C 99 cdq ;edx清零
:004B308D F7FB idiv ebx ;除
:004B308F 8BDA mov ebx, edx ;ebx=edx
:004B3091 46 inc esi ;偏移增量
:004B3092 49 dec ecx ;计数器
:004B3093 75DB jne 004B3070 ;循环

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3068(C)
|
:004B3095 8D837D590200 lea eax, dword ptr [ebx+0002597D] ;eax=ebx+2597D
:004B309B 8B15D0CB4D00 mov edx, dword ptr [004DCBD0] ;
:004B30A1 031A add ebx, dword ptr [edx] ;[edx]依然是FD9C
:004B30A3 33C3 xor eax, ebx ;异或
:004B30A5 8BD8 mov ebx, eax ;ebx的数算出来了!

这里的字符串有区别:
字符串1是wanghlLamb1111111lily
~~~~~~ ~~~~~~~
名字 电话号码
字符串2是1111111lily
字符串1=名字+Lamb+电话号码+lily (Lamb,鲁锦的英文名,lily,可能是他的女朋友的名字)
字符串2=电话号码+lily

注:1:注册码必须是数字,不信你就可以试一试
2:注册申请码是由电话号码决定的,与其他的两项无关
3:在windows\system下面有个文件kernel32.ini,是这个软件建立的,是注册与否的标志!
这个文件一删除,就变成非注册版了,请看:

注册成功下面就是
* Possible StringData Ref from Code Obj ->"\System\Kernel32.ini"
|
:004B3143 BACC324B00 mov edx, 004B32CC
:004B3148 E8B70CF5FF call 00403E04
:004B314D 8B4DE8 mov ecx, dword ptr [ebp-18]
:004B3150 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"萇E"
|
:004B3152 A100494500 mov eax, dword ptr [00454900]
:004B3157 E84C18FAFF call 004549A8
:004B315C 8BF0 mov esi, eax
:004B315E 8D55E8 lea edx, dword ptr [ebp-18]
:004B3161 8BC3 mov eax, ebx
:004B3163 E8F453F5FF call 0040855C
:004B3168 8B45E8 mov eax, dword ptr [ebp-18]
:004B316B 50 push eax

* Possible StringData Ref from Code Obj ->"MaxFileCache"
|
:004B316C B9A8334B00 mov ecx, 004B33A8

* Possible StringData Ref from Code Obj ->"vcache"
......

********************************世间本无事,庸人自扰耳*************************************


WinHex 9.64

                   WinHex免注册版本的实现

WinHex是个很优秀的Edit Tool，它的版本升级很快，目前好象到9.64了吧。
前面我已介绍了9.5和9.62版的免注册版破解方法，对于初学者来说，大概
有点云里雾里，什么感觉了、运气了，有点玄虚。实际上，还是有章可循
的。这不，今天下载了个9.64版，用了不到二十分钟的时间就破了。
破解常备兵器：
屠龙刀：SoftIce for Win 4.95
依天剑：W32Dasm 8.93
玄铁剑：Hiew 6.40
碧血剑：UltraEdit 8.0
破WinHex只需屠龙刀和玄铁剑两把“粗笨”兵器足矣。

将9.64版本安装上以后，反复打开、关闭若干次后，出现了一个提示对话框，
大意是：这是一个共享软件，可以任意传播和使用，要想得到它的全部功能，
就掏钱注册吧。赶紧设断
    bpx lockmytask
按确定后被断，按几次F12回到WinHex代码区

    0163:0040CE61 Call user32.IsDlgButtonChecked
    0163:0040CE66 dec eax
    0163:0040CE67 sete byte ptr [0045A7F5]
    0163:0040CE6E mov eax, dword ptr [ebp+10]
    0163:0040CE71 push eax
    0163:0040CE72 mov eax, dword ptr [ebp+08]
    0163:0040CE75 push eax
    0163:0040CE76 Call user32.EndDialog
    0163:0040CE7B jmp 0040CE92   〈-返回此处

这是操作提示对话框的调用代码，没有有价值的线索，又按了N次F12(N是几没
有必要告诉你，自己一试便知)，再次回到WinHex代码区

    0163:00405018 push ebp
    0163:00405019 mov ebp, esp
    0163:0040501B push ebx
    0163:0040501C push 00000000
    0163:0040501E mov ebx, dword ptr [ebp+08]
    0163:00405021 push ebx
    0163:00405022 push ecx
    0163:00405023 push edx
    0163:00405024 push eax
    0163:00405025 Call user32.DialogBoxParamA
    0163:0040502A pop ebx   〈-返回此处
    0163:0040502B pop ebp
    0163:0040502C ret 0004

这是程序对对话框函数DialogBoxParamA的一个调用，快抓住狐狸的尾巴了。
慢慢追踪，按F12

    0163:0040CF23 mov byte ptr [0045A7AD], 01
    0163:0040CF2A cmp dword ptr [0045A8F0], 00000000
    0163:0040CF31 je 0040CF3B
    0163:0040CF33 mov ebx, dword ptr [0045A8F0]
    0163:0040CF39 jmp 0040CF41
    0163:0040CF3B mov ebx, dword ptr [0045500C]
    0163:0040CF41 push 0040CE04
    0163:0040CF46 mov ecx, dword ptr [0045B728]
    0163:0040CF4C mov edx, 000003E8
    0163:0040CF51 mov eax, ebx
    0163:0040CF53 call 00405018
    0163:0040CF58 mov byte ptr [0045A7AD], 00   〈-返回此处

因为上面的几个短跳均未跳过0040CF53，因此以上的几个内存地址应该不是存放
注册标志的地方。再按两次F12

*   0163:0044E739 cmp byte ptr [0045A7FB], 00
    0163:0044E740 jne 0044E75D
    0163:0044E742 mov eax, 00000004
    0163:0044E747 call 00402980
    0163:0044E74C dec eax
*   0163:0044E74D je 0044E75D
    0163:0044E74F cmp byte ptr [0045A7BF], 00
*   0163:0044E756 jne 0044E75D
    0163:0044E758 call 00432804
    0163:0044E75D mov eax, ebx   〈-返回此处
哈，有戏！在三个*出均可跳过0044E758(即调用对话框)。
[0045A7FB]和[0045A7FB]可疑，下断
    bpm 0045A7BF
重新运行WinHex，被断，将[0045A7BF]设为1，好象没什么作用，判断该处似乎
是决定共享版WinHex运行几次后弹出提示对话框的。PASS，再下断
    bpm 0045A7FB
事实上，从程序流程来看，是否跳过对话框，[0045A7FB]处的优先处理权要高于
[0045A7FB]。果然，重新运行WinHex，被断

**  0163:0043FA2D cmp byte ptr [0045A787], 00
    0163:0043FA34 setne al
    0163:0043FA37 mov edx, 0045A803
    0163:0043FA3C sub edx, 00000008
    0163:0043FA3F mov byte ptr [edx], al     ;EDX=0045A7FB
    0163:0043FA41 push 00000000   〈-此处被断

    d 0045A7FB
将[0045A7FB]改为1，按F5，程序在几处被断，都是来比较[0045A7FB]的值，啥
话也别说，接着按F5，来到主程序窗口。乌拉！已经成注册版本了。
再回过头分析上面的代码，发现[0045A7FB]的值由[0045A787]决定的，[0045A787]
不为0，就表示程序已注册过了。再下断
    bpm 0045A787
重新运行WinHex，程序只在**下一处被断，以前我还纳闷，什么地方给[0045A787]
赋值呢，现在想来，大概是这样的：

    BOOL registed;         /缺省值为FALSE
    ...
    注册模块
    {
        if  注册码正确
        {
            registed=TRUE;
        }
    }
    ...
    if registed            /这里对应**处
    {
       已注册版本；
    }
    else
    {
       未注册版本；
    }

这里，变量registed即对应内存单元[0045A787]，因为一直没有正确的注册，
所以registed=TRUE语句始终没有被执行。
找到了钥匙，开锁就是举手之劳。将**处改为
    cmp byte ptr [0045A787], 01
即可。**处的代码为803D87A7450000，调出Hiew，按F4进入DECODE模式，按F7
搜索803D87A7450000，找到后按F3，把后面的0000改为0001，按F9存盘，退出。
至此，你已得到了全部功能的WinHex9.64免注册版本，是不是感觉挺简单？

写这个破解文章比破解还累，用了我一个下午的时间。但想想看雪同志是那样
勤勤恳恳，辛辛苦苦地为大家整理破解教程，我还能说什么，只要大家高兴就
好。

南阳：woLONGwxd   2001-1-8


winhex9.9

 标 题:很对不起，因为出了两天差。动态找出winhex的注册码.请进...... (2千字)
发信人:玉川
时 间:2001-7-23 22:48:07
详细信息:
我以winhex9.9为例.请使用TRW,因为要用suspend.

启动winhex前，伪造user.txt。要留意伪造的user.txt的格式，User: ADDR1: ADDR2: 英文、中文可任意输入.但是，code1、code2的数必须是0-f且必须有32个.code1的第21到24位数，假设它为A(1)A(2)A(3)A(4),那么A(3)A(4)A(1)A(2)应小于0370,或者大于03A2.

打bpx 417dbd
启动winhex,打开内存修改，存盘.中断在下面:

:00417DBD B9BC060000 mov ecx, 000006BC
:00417DC2 8B1578ED4500 mov edx, dword ptr [0045ED78]
:00417DC8 E823D3FEFF call 004050F0
:00417DCD E826FEFFFF call 00417BF8 <---进入
:00417DD2 BAB8654600 mov edx, 004665B8
:00417DD7 8D442428 lea eax, dword ptr [esp+28]

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417DDB B910000000 mov ecx, 00000010

进入417dcd: call 417bf8中:

:00417D27 E8CCDCFEFF call 004059F8
:00417D2C 8BD8 mov ebx, eax
:00417D2E 6A00 push 00000000
:00417D30 BAB8654600 mov edx, 004665B8
:00417D35 8BC3 mov eax, ebx

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417D37 B910000000 mov ecx, 00000010
:00417D3C E8A3DDFEFF call 00405AE4 <----进入

* Possible Ref to Menu: MenuID_0001, Item: "Hex-Werte Strg+Shift+C"
|
:00417D41 BA2C000000 mov edx, 0000002C
:00417D46 8BC3 mov eax, ebx

进入417d3c:call 405ae4中:

:00405B2A 8B45FC mov eax, dword ptr [ebp-04]
:00405B2D E8AAFDFFFF call 004058DC
:00405B32 0FB7C8 movzx ecx, ax
:00405B35 C1E908 shr ecx, 08
:00405B38 24FF and al, FF
:00405B3A 32C8 xor cl, al
:00405B3C 8B45F8 mov eax, dword ptr [ebp-08]
:00405B3F 03C6 add eax, esi
:00405B41 3208 xor cl, byte ptr [eax] <---此处打bpx,每次停在这里，cl中的数据和下面的一组16个字节数据依次xor后，存入[eax]中，这个数一定要记下来，最后记下来的一组16个字节数即为code2.
既：cl xor 5b == ? ,将?存入[eax]中，同时记下?,这是code2的第一个数据,
第二次中断在这里，将cl与0e xor,结果存入[eax],并记下,此为code2的第二个数据,依此类推.一共中断16次，得到16个数据，既为code2。

<< 这一组16个字节数据如下:

5b 0e 44 2c 80 f2 0c d3 b4 ad 22 97 da ce 3f 6d >>

这样找到的注册码适用winhex9.74到9.92.

winhex的加密做的真的很好，连\\.\SICE字符串也加了密.

user.txt如下，它适合winhex9.74到9.92的任何版本:

User: yourname
Addr1: aaaa
Addr2: aa
Code1: 0123456789abcdef0123456789abcdef
Code2: 9b8be3627af62ab02fb7c4b793766410

User: 中国四川
Addr1: 看雪论坛
Addr2: 看雪学院
Code1: 88888888888888888888888888888888
Code2: 93e853c64441aeaf93c4b1c805b90ca9


winimage

 标 题:winimage完全破解 (8千字)
发信人:多情俏狐
时 间:2001-7-4 19:06:29
详细信息:
winimage完全破解
===================================================
Henan China peiyou

先运行注册，出现错误提示，怀疑是messageboxa中断.

随用trw2000输入peiyou 88888888 下bpx messageboxa 设断，中断于：

:00421F35 FF1588F94400 Call user!messageboxa

向上找:

注:以下代码出自w32dasm.

|:00402FAA , :00403BC7 , :00403C49 , :00405946 , :00409017
|:004090AD , :0040B82F , :0040BB65 , :00421F9E , :0042201C
|
:00421F16 55 push ebp
:00421F17 8BEC mov ebp, esp
:00421F19 51 push ecx
:00421F1A A1D0C34400 mov eax, dword ptr [0044C3D0]
:00421F1F 85C0 test eax, eax
:00421F21 7405 je 00421F28
^^^^^^^^^^^^跳到错误处
:00421F23 FFD0 call eax
:00421F25 8945FC mov dword ptr [ebp-04], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00421F21(C)
|
:00421F28 56 push esi
:00421F29 FF7514 push [ebp+14]
:00421F2C FF7510 push [ebp+10]
:00421F2F FF750C push [ebp+0C]
:00421F32 FF7508 push [ebp+08]

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:00421F35 FF1588F94400 Call dword ptr [0044F988]
^^^^^^^^^^^^^^^^^^^^^^^^^错误提示
:00421F3B 8BF0 mov esi, eax
:00421F3D A1D4C34400 mov eax, dword ptr [0044C3D4]
:00421F42 85C0 test eax, eax
:00421F44 7406 je 00421F4C
:00421F46 FF75FC push [ebp-04]
:00421F49 FFD0 call eax
:00421F4B 59 pop ecx

来到421f21处:
:00421F1F 85C0 test eax, eax
:00421F21 7405 je 00421F28
^^^^^^^^^^^^跳到错误处
改74 05 为90 90 吗？照死！再向上分析？
|:00402FAA , :00403BC7 , :00403C49 , :00405946 , :00409017
|:004090AD , :0040B82F , :0040BB65 , :00421F9E , :0042201C

我靠，你杀了我吧！！！

只好从注册成功信息如手。

用exescope找成功信息，看到了"你的注册码是正确的，$0A现在你是一个注册用户了，$感谢你的使用。"
用w32dsam找注册信息吧，慢！！！w32dsam找中文注册信息?乱码,我头疼
(国之悲衷,我真希望中国的cracker们能写出中文w32dsam,而不是汉化)
在信息前加入kissyou,你没记录改动？我倒！！

运行w32dsam查kissyou,找到kissyou+乱码,乱吧，反正就是你了，向上看：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004340B8(U)
^^^^^^^^^^^^^^来自4340b8

:004340E3 6800200000 push 00002000

* Possible Reference to String Resource ID=01069: "WinImage 鑼"
|
:004340E8 682D040000 push 0000042D
:004340ED 89150CD34400 mov dword ptr [0044D30C], edx
:004340F3 891564D44400 mov dword ptr [0044D464], edx

注册成功提示
* Possible Reference to String Resource ID=01066: "kissyou`勮?/cn?
?`/"
:004340F9 682A040000 push 0000042A

到4340B8看一下：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004340AC(C)
|
:004340B3 6A01 push 00000001
:004340B5 3BC2 cmp eax, edx
:004340B7 5E pop esi
:004340B8 7529 jnz 004340E3
^^^^^^^^^^^跳到注册成功处
:004340BA 6800200000 push 00002000
我等你很久了，75 29 改为EB 29.
重运行，随便输入注册，出现注册成功信息，我跳....不起来，怎么？
未注册信息仍未消除，重运行，讨厌的注册提示仍然存在，注册不成功!!!

我起不来了，拉我一把.

看来注册成功信息出现之前，作者已做了手脚。我很懒，总爱暴破，
但这次看来要玩一把了。

重新用trw2000载入调试,这次输入peiyou 88888888 用hmemcpy设断

中断于434066 mov EDI 004d06c 跟踪:

:00434066 BF6CD04400 mov edi, 0044D06C

* Possible Ref to Menu: WINIMAGMENU, Item: "U(D)..."
|
:0043406B 6A7F push 0000007F
:0043406D 57 push edi

* Possible Reference to Dialog: REGISTER, CONTROL_ID:0817, ""
|
:0043406E 6817080000 push 00000817
:00434073 FF7508 push [ebp+08]
:00434076 FFD6 call esi
:00434078 6840D44400 push 0044D440
:0043407D 57 push edi
:0043407E 53 push ebx
:0043407F E89C5C0000 call 00439D20
^^^^^^^^^^^^^^
:00434084 8B0D40D44400 mov ecx, dword ptr [0044D440]
:0043408A 83C40C add esp, 0000000C
:0043408D 33D2 xor edx, edx
:0043408F A334D24400 mov dword ptr [0044D234], eax
:00434094 3BC2 cmp eax, edx
:00434096 5F pop edi
:00434097 5B pop ebx
:00434098 7406 je 004340A0
:0043409A 890D04D44400 mov dword ptr [0044D404], ecx

到这里
:0043407F E89C5C0000 call 00439D20
^^^^^^^^^^^^^^它最有可能是密码处理,F8追进去.

:00439D83 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439D89 50 push eax
:00439D8A 8D8748190514 lea eax, dword ptr [edi+14051948]
:00439D90 50 push eax
:00439D91 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439D97 50 push eax
:00439D98 E836FFFFFF call 00439CD3 处理I
:00439D9D 59 pop ecx
:00439D9E 59 pop ecx
:00439D9F 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439DA0 E8D33A0000 Call 0043D878
:00439DA5 59 pop ecx
:00439DA6 85C0 test eax, eax
:00439DA8 59 pop ecx
:00439DA9 7478 je 00439E23
:00439DAB 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439DB1 50 push eax
:00439DB2 8D8754190617 lea eax, dword ptr [edi+17061954]
:00439DB8 50 push eax
:00439DB9 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439DBF 50 push eax
:00439DC0 E80EFFFFFF call 00439CD3 处理II
:00439DC5 59 pop ecx
:00439DC6 59 pop ecx
:00439DC7 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439DC8 E8AB3A0000 Call 0043D878
:00439DCD 59 pop ecx
:00439DCE 85C0 test eax, eax
:00439DD0 59 pop ecx
:00439DD1 7450 je 00439E23
:00439DD3 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439DD9 50 push eax
:00439DDA 8D8781190510 lea eax, dword ptr [edi+10051981]
:00439DE0 50 push eax
:00439DE1 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439DE7 50 push eax
:00439DE8 E8E6FEFFFF call 00439CD3 处理III
:00439DED 59 pop ecx
:00439DEE 59 pop ecx
:00439DEF 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439DF0 E8833A0000 Call 0043D878
:00439DF5 59 pop ecx
:00439DF6 85C0 test eax, eax
:00439DF8 59 pop ecx
:00439DF9 7455 je 00439E50
:00439DFB 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439E01 50 push eax
:00439E02 8D8795190104 lea eax, dword ptr [edi+04011995]
:00439E08 50 push eax
:00439E09 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439E0F 50 push eax
:00439E10 E8BEFEFFFF call 00439CD3
^^^^^^^^^^^^^
:00439E15 59 pop ecx
:00439E16 59 pop ecx
:00439E17 50 push eax

经过三次处理，到439f10我CALL处出现错框:

再次跟踪到:00439E0F 50 push eax处,下D eax
出现 105E9A34.
注册peiyou 105E9A34

注册成功，什么污七八糟的东西，全没了，成功注册。

另外,通过对注册表的分析发现它的注册信息存在于:

HKEY_CURRENT_USER\Software\WinImage

"WinImageUseRegistry"="TRUE" 是否过30天期

"CDImageSetting"="0"
"ConnectedFileOption"="1" 已使用的天数
"NameRegistered"="" 注册姓名
"CodeRegistered"="" 注册码
"ProMode"="TRUE" 运行于专业版，还是标准版模

如果不想破,把promode中的Ture 改为FAlSE即为专业版，但提醒注册照出.

为了那片放飞梦想的天空而努力!!!!!!!!!1


WinImage

 标 题:破解心得之WinImage篇 (15千字)
发信人:时空幻影
时 间:2001-7-1 14:32:35
详细信息:
破解心得之WinImage篇

作者：时空幻影
时间：2001年6月25日
使用工具：Fileinfo v2.43、W32DSM白金版汉化版、TRW2000 v1.22

软件名称：WinImage
发布公司：Gilles Vollant
最新版本：v5.0.5009
操作系统：Win9x/ME/NT4/2000
软件说明：
可制作、解压磁盘映像(iso bin等)

由于这个软件没有加壳，因此破解相对容易一些，且注册算法也不复杂，很适合初学者破解。
破解步骤：
1、先把执行文件用Fileinfo查看一下有没有加壳，结果没有；
2、用W32DSM反编译该执行文件，查找出错字符串，找出比对点，然后根据比对点找出核心CALL，记下该CALL的偏移地
址，如这个软件核心CALL的偏移地址为0043407F；
3、运行TRW2000，再运行该软件，填好Name和Registration Code后，按Ctrl+N激活TRW2000，然后键入"BPX HMEMCPY"
按F5跳回程序，然后点OK就会被拦下，再键入"pmodule"。
* Possible Reference to Dialog: REGISTER, CONTROL_ID:0816, ""
|
:0043405C 6816080000 push 00000816
:00434061 FF7508 push [ebp+08]
:00434064 FFD6 call esi
:00434066 BF6CD04400 mov edi, 0044D06C <--pmodule后到这里，D EAX可看到自己输入的Name

* Possible Ref to Menu: WINIMAGMENU, Item: "Create directory..."
|
:0043406B 6A7F push 0000007F
:0043406D 57 push edi

* Possible Reference to Dialog: REGISTER, CONTROL_ID:0817, ""
|
:0043406E 6817080000 push 00000817
:00434073 FF7508 push [ebp+08]
:00434076 FFD6 call esi
:00434078 6840D44400 push 0044D440 <--D EDI可看到输入的注册码
:0043407D 57 push edi
:0043407E 53 push ebx
:0043407F E89C5C0000 call 00439D20 <--核心CALL，按F8进入
:00434084 8B0D40D44400 mov ecx, dword ptr [0044D440]
:0043408A 83C40C add esp, 0000000C
:0043408D 33D2 xor edx, edx
:0043408F A334D24400 mov dword ptr [0044D234], eax
:00434094 3BC2 cmp eax, edx
:00434096 5F pop edi
:00434097 5B pop ebx
:00434098 7406 je 004340A0
:0043409A 890D04D44400 mov dword ptr [0044D404], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00434098(C)
|
:004340A0 391504D44400 cmp dword ptr [0044D404], edx
:004340A6 890D90D64400 mov dword ptr [0044D690], ecx
:004340AC 7505 jne 004340B3
:004340AE A390D64400 mov dword ptr [0044D690], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004340AC(C)
|
:004340B3 6A01 push 00000001
:004340B5 3BC2 cmp eax, edx
:004340B7 5E pop esi
:004340B8 7529 jne 004340E3 <--暴破的话把这个JNE改成JMP即可，即把75改成EB
:004340BA 6800200000 push 00002000

* Possible Reference to String Resource ID=01069: "WinImage Registration"
|
:004340BF 682D040000 push 0000042D
:004340C4 89350CD34400 mov dword ptr [0044D30C], esi
:004340CA 893564D44400 mov dword ptr [0044D464], esi
:004340D0 88156CD04400 mov byte ptr [0044D06C], dl
:004340D6 881568D44400 mov byte ptr [0044D468], dl

* Possible Reference to String Resource ID=01067: "Registering information is invalid" <--注册失败对话框
|
:004340DC 682B040000 push 0000042B
:004340E1 EB1B jmp 004340FE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004340B8(C)
|
:004340E3 6800200000 push 00002000

* Possible Reference to String Resource ID=01069: "WinImage Registration"
|
:004340E8 682D040000 push 0000042D
:004340ED 89150CD34400 mov dword ptr [0044D30C], edx
:004340F3 891564D44400 mov dword ptr [0044D464], edx

* Possible Reference to String Resource ID=01066: "Your registration code is valid.
You are now a registered us" <-- <--注册成功对话框
|
:004340F9 682A040000 push 0000042A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004340E1(U)
|
:004340FE FF7508 push [ebp+08]
:00434101 E84BDEFEFF call 00421F51
:00434106 83C410 add esp, 00000010
:00434109 56 push esi
:0043410A FF7508 push [ebp+08]

按F8后会进入如下地方：
* Referenced by a CALL at Addresses:
|:0043407F , :00439225
|
:00439D20 55 push ebp
:00439D21 8BEC mov ebp, esp
:00439D23 81EC00020000 sub esp, 00000200
:00439D29 56 push esi
:00439D2A 8B7510 mov esi, dword ptr [ebp+10]
:00439D2D 85F6 test esi, esi
:00439D2F 57 push edi
:00439D30 7403 je 00439D35
:00439D32 832600 and dword ptr [esi], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439D30(C)
|
:00439D35 FF750C push [ebp+0C]
:00439D38 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439D3E 50 push eax
:00439D3F E8E0FEFFFF call 00439C24
:00439D44 FF7508 push [ebp+08]
:00439D47 E804FFFFFF call 00439C50 <--核心CALL，按F8进入
:00439D4C 8BF8 mov edi, eax <--EDI和EAX中的内容均为第一个注册码
:00439D4E 83C40C add esp, 0000000C
:00439D51 81FF26DDDCB8 cmp edi, B8DCDD26
:00439D57 0F84FE000000 je 00439E5B <--这里一定不能跳转
:00439D5D 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439D63 50 push eax
:00439D64 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439D6A 57 push edi
:00439D6B 50 push eax
:00439D6C E862FFFFFF call 00439CD3
:00439D71 59 pop ecx <--按D EAX可以看到第一个正确的注册码
:00439D72 59 pop ecx
:00439D73 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439D74 E8FF3A0000 Call 0043D878
:00439D79 59 pop ecx
:00439D7A 85C0 test eax, eax
:00439D7C 59 pop ecx
:00439D7D 0F84A0000000 je 00439E23
:00439D83 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439D89 50 push eax
:00439D8A 8D8748190514 lea eax, dword ptr [edi+14051948]
:00439D90 50 push eax
:00439D91 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439D97 50 push eax
:00439D98 E836FFFFFF call 00439CD3
:00439D9D 59 pop ecx <--按D EAX可以看到第二个正确的注册码
:00439D9E 59 pop ecx
:00439D9F 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439DA0 E8D33A0000 Call 0043D878
:00439DA5 59 pop ecx
:00439DA6 85C0 test eax, eax
:00439DA8 59 pop ecx
:00439DA9 7478 je 00439E23
:00439DAB 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439DB1 50 push eax
:00439DB2 8D8754190617 lea eax, dword ptr [edi+17061954]
:00439DB8 50 push eax
:00439DB9 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439DBF 50 push eax
:00439DC0 E80EFFFFFF call 00439CD3
:00439DC5 59 pop ecx <--按D EAX可以看到第三个正确的注册码
:00439DC6 59 pop ecx
:00439DC7 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439DC8 E8AB3A0000 Call 0043D878
:00439DCD 59 pop ecx
:00439DCE 85C0 test eax, eax
:00439DD0 59 pop ecx
:00439DD1 7450 je 00439E23
:00439DD3 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439DD9 50 push eax
:00439DDA 8D8781190510 lea eax, dword ptr [edi+10051981]
:00439DE0 50 push eax
:00439DE1 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439DE7 50 push eax
:00439DE8 E8E6FEFFFF call 00439CD3
:00439DED 59 pop ecx <--按D EAX可以看到第四个正确的注册码
:00439DEE 59 pop ecx
:00439DEF 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439DF0 E8833A0000 Call 0043D878
:00439DF5 59 pop ecx
:00439DF6 85C0 test eax, eax
:00439DF8 59 pop ecx
:00439DF9 7455 je 00439E50
:00439DFB 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439E01 50 push eax
:00439E02 8D8795190104 lea eax, dword ptr [edi+04011995]
:00439E08 50 push eax
:00439E09 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439E0F 50 push eax
:00439E10 E8BEFEFFFF call 00439CD3
:00439E15 59 pop ecx <--按D EAX可以看到第五个正确的注册码
:00439E16 59 pop ecx
:00439E17 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439E18 E85B3A0000 Call 0043D878
:00439E1D 59 pop ecx
:00439E1E 85C0 test eax, eax
:00439E20 59 pop ecx
:00439E21 7505 jne 00439E28

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00439D7D(C), :00439DA9(C), :00439DD1(C)
|
:00439E23 6A01 push 00000001
:00439E25 58 pop eax
:00439E26 EB35 jmp 00439E5D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439E21(C)
|
:00439E28 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439E2E 81C797190602 add edi, 02061997
:00439E34 50 push eax
:00439E35 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439E3B 57 push edi
:00439E3C 50 push eax
:00439E3D E891FEFFFF call 00439CD3
:00439E42 59 pop ecx <--按D EAX可以看到第六个正确的注册码
:00439E43 59 pop ecx
:00439E44 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439E45 E82E3A0000 Call 0043D878
:00439E4A 59 pop ecx
:00439E4B 85C0 test eax, eax
:00439E4D 59 pop ecx
:00439E4E 750B jne 00439E5B <--这里也一定不能跳转

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439DF9(C)
|
:00439E50 6A01 push 00000001
:00439E52 85F6 test esi, esi
:00439E54 58 pop eax
:00439E55 7406 je 00439E5D
:00439E57 8906 mov dword ptr [esi], eax
:00439E59 EB02 jmp 00439E5D

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00439D57(C), :00439E4E(C)
|
:00439E5B 33C0 xor eax, eax <--如果跳到这里的话就OVER了

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00439E26(U), :00439E55(C), :00439E59(U)
|
:00439E5D 5F pop edi
:00439E5E 5E pop esi
:00439E5F C9 leave
:00439E60 C3 ret

上面的那个CALL进入后会来到如下地方：
* Referenced by a CALL at Addresses:
|:00433C57 , :00433C69 , :00439D47
|
:00439C50 55 push ebp
:00439C51 8BEC mov ebp, esp
:00439C53 81EC04010000 sub esp, 00000104
:00439C59 FF7508 push [ebp+08]
:00439C5C 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]
:00439C62 C745FC4C694700 mov [ebp-04], 0047694C <--赋初值到[EBP-04]
:00439C69 50 push eax
:00439C6A E8B5FFFFFF call 00439C24 <--把用户名复制到内存另一个区域，并把所有的小写转换成大写
:00439C6F 59 pop ecx
:00439C70 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]
:00439C76 59 pop ecx
:00439C77 50 push eax

* Reference To: KERNEL32.lstrlenA, Ord:0308h
|
:00439C78 FF15C8F84400 Call dword ptr [0044F8C8]
:00439C7E 33C9 xor ecx, ecx
:00439C80 894508 mov dword ptr [ebp+08], eax
:00439C83 85C0 test eax, eax
:00439C85 7E47 jle 00439CCE
:00439C87 53 push ebx
:00439C88 56 push esi
:00439C89 8DB5FCFEFFFF lea esi, dword ptr [ebp+FFFFFEFC]
:00439C8F 57 push edi
:00439C90 8B7D08 mov edi, dword ptr [ebp+08]
:00439C93 83EE03 sub esi, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439CC9(C)
|
:00439C96 8BC1 mov eax, ecx
:00439C98 6A0E push 0000000E
:00439C9A 99 cdq
:00439C9B 5B pop ebx
:00439C9C F7FB idiv ebx
:00439C9E 85D2 test edx, edx
:00439CA0 7503 jne 00439CA5
:00439CA2 6A27 push 00000027
:00439CA4 5F pop edi <--EDI置初始值0x27

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439CA0(C)
|
:00439CA5 0FB6540E03 movzx edx, byte ptr [esi+ecx+03] <--[ESI+03]中为用户名
:00439CAA 8D4103 lea eax, dword ptr [ecx+03]
:00439CAD 0FAFD7 imul edx, edi
:00439CB0 0155FC add dword ptr [ebp-04], edx
:00439CB3 6A0E push 0000000E
:00439CB5 99 cdq
:00439CB6 5B pop ebx
:00439CB7 F7FB idiv ebx <--EAX除以0xE
:00439CB9 85D2 test edx, edx <--判断余数是否为零
:00439CBB 7405 je 00439CC2 <--是的话则跳转
:00439CBD 8D3C7F lea edi, dword ptr [edi+2*edi]
:00439CC0 EB03 jmp 00439CC5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439CBB(C)
|
:00439CC2 6BFF07 imul edi, 00000007

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439CC0(U)
|
:00439CC5 41 inc ecx
:00439CC6 3B4D08 cmp ecx, dword ptr [ebp+08] <--比较ECX中的数是否大于[EBP+08](即用户名长度)
:00439CC9 7CCB jl 00439C96
:00439CCB 5F pop edi
:00439CCC 5E pop esi
:00439CCD 5B pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00439C85(C)
|
:00439CCE 8B45FC mov eax, dword ptr [ebp-04]
:00439CD1 C9 leave
:00439CD2 C3 ret


WinImage v5.00.5007

 标 题:《WinImage v5.00.5007 注册码破解》 (7千字)
发信人:BinC
时 间:2001-5-10 18:35:08
详细信息:
WinImage v5.00.5007 注册码破解（转载请保持完整，谢谢！）
作者：BinC
破解工具：Trw2000 或者 W32DASM（特别感谢这两款软件的作者^_^）

软件名称：WinImage
整理日期: 2001.05.10
最新版本：5.00.5007
软件授权：共享软件
使用平台：Win95/98/NT
软件下载：http://download.21cn.com/file/utility/cipan/wibt5007.zip
软件简介：
据说是最好的WIN下的映像文件处理工具，但我没试过，因为纯粹是拿来练手^_^

前言：早上6：30分到21CN下载了它，试用一下后7：00开始破解，7：15破解成功，然后上学，中途逃课来写这篇文章^_^

首先打开WinImage观察一下，发现注册方法是用注册码方式的，而且此软件有两种模式：Standard（一般）和Professional（专业）（这些可看Options/WinImage mode selection菜单），应该有两种模式的注册码。打开注册窗口，随便输入注册名和注册码。这里注册名用BinC，注册码用12345678

要注意的是，注册名最好不要多于8个字符（其实多于8个字符也没关系，下文会讲到）。而且此软件一个注册名有多达6个注册码，其中两个是专业模式的注册码，下文也会讲到。

启动TRW，然后设一断点。这里用的是拦载注册码文本框的WM_GETTEXT消息（当然，你可以用Hmemcpy、GETDLGITEMTEXTA等常用的，这里就不班门弄斧了）。回到注册窗口，单击OK，程序被拦。然后按F10来到以下代码（以下代码是从W32SASM 上COPY来的，在TRW中代码是一样的）：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043926E(C)
|
:00439273 FF750C push [ebp+0C]
:00439276 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:0043927C 50 push eax
:0043927D E8E0FEFFFF call 00439162 <-----注意此CALL
:00439282 FF7508 push [ebp+08]
:00439285 E804FFFFFF call 0043918E
:0043928A 8BF8 mov edi, eax
:0043928C 83C40C add esp, 0000000C
:0043928F 81FF26DDDCB8 cmp edi, B8DCDD26
:00439295 0F84FE000000 je 00439399
:0043929B 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:004392A1 50 push eax
:004392A2 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:004392A8 57 push edi
:004392A9 50 push eax
:004392AA E862FFFFFF call 00439211
~~~~~~~~~~~~~~此CALL过后下 d eax 可看到一般模式的注册码
:004392AF 59 pop ecx
:004392B0 59 pop ecx
:004392B1 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:004392B2 E8AD3A0000 Call 0043CD64
:004392B7 59 pop ecx
:004392B8 85C0 test eax, eax
:004392BA 59 pop ecx
:004392BB 0F84A0000000 je 00439361
:004392C1 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:004392C7 50 push eax
:004392C8 8D8748190514 lea eax, dword ptr [edi+14051948]
:004392CE 50 push eax
:004392CF 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:004392D5 50 push eax
:004392D6 E836FFFFFF call 00439211
~~~~~~~~~~~~~此CALL过后下 d eax 可看到一般模式的注册码
:004392DB 59 pop ecx
:004392DC 59 pop ecx
:004392DD 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:004392DE E8813A0000 Call 0043CD64
:004392E3 59 pop ecx
:004392E4 85C0 test eax, eax
:004392E6 59 pop ecx
:004392E7 7478 je 00439361
:004392E9 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:004392EF 50 push eax
:004392F0 8D8754190617 lea eax, dword ptr [edi+17061954]
:004392F6 50 push eax
:004392F7 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:004392FD 50 push eax
:004392FE E80EFFFFFF call 00439211
~~~~~~~~~~~~~此CALL过后下 d eax 可看到一般模式的注册码
:00439303 59 pop ecx
:00439304 59 pop ecx
:00439305 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439306 E8593A0000 Call 0043CD64
:0043930B 59 pop ecx
:0043930C 85C0 test eax, eax
:0043930E 59 pop ecx
:0043930F 7450 je 00439361
:00439311 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:00439317 50 push eax
:00439318 8D8781190510 lea eax, dword ptr [edi+10051981]
:0043931E 50 push eax
:0043931F 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439325 50 push eax
:00439326 E8E6FEFFFF call 00439211
~~~~~~~~~~~~~ 此CALL过后下 d eax 可看到专业模式的注册码
:0043932B 59 pop ecx
:0043932C 59 pop ecx
:0043932D 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:0043932E E8313A0000 Call 0043CD64
:00439333 59 pop ecx
:00439334 85C0 test eax, eax
:00439336 59 pop ecx
:00439337 7455 je 0043938E
:00439339 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:0043933F 50 push eax
:00439340 8D8795190104 lea eax, dword ptr [edi+04011995]
:00439346 50 push eax
:00439347 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:0043934D 50 push eax
:0043934E E8BEFEFFFF call 00439211
~~~~~~~~~~~~~此CALL过后下 d eax 可看到一般模式的注册码
:00439353 59 pop ecx
:00439354 59 pop ecx
:00439355 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
|
:00439356 E8093A0000 Call 0043CD64
:0043935B 59 pop ecx
:0043935C 85C0 test eax, eax
:0043935E 59 pop ecx
:0043935F 7505 jne 00439366

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004392BB(C), :004392E7(C), :0043930F(C)
|
:00439361 6A01 push 00000001
:00439363 58 pop eax
:00439364 EB35 jmp 0043939B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043935F(C)
|
:00439366 8D8500FFFFFF lea eax, dword ptr [ebp+FFFFFF00]
:0043936C 81C797190602 add edi, 02061997
:00439372 50 push eax
:00439373 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]
:00439379 57 push edi
:0043937A 50 push eax
:0043937B E891FEFFFF call 00439211
~~~~~~~~~~~~~此CALL过后下 d eax 可看到专业模式的注册码
:00439380 59 pop ecx
:00439381 59 pop ecx
:00439382 50 push eax

* Reference To: CRTDLL.strcmp, Ord:01CFh
.........
......

在0043927D的那个CALL（你可以按F8进去看一下）就是判断注册码个数是不是小于等于8，如果大于8就截取前8位，然后进行大写转换，再下来可能就是注册码计算了（这……实在不是我等未学过汇编的菜鸟所能理解的^_^）。

至此，破解结束！：）

后记：小弟刚学破解，也是第一次写破解文章，其中难免有错误之处，请各位高手斧正！还有一件事请各位帮帮忙：哪里有汇编的入门教程可以下载（没学过汇编，看那些注册码算法时如雾里看花）？谢谢！

BinC
10:18 10.05.2001


软件名称：WinImage4.0(FileVersion:4.00.4000) WinImage.EXE 320KB 下载地点：http://www.winimage.com/winimage.htm 发 信 人: 井 风 时 间: 2000-12-08 破解工具：Trw20001.22 前 言：此软件有专业模式和标准模式两组注册码，试用期为30天。 详细过程: 一、 运行TRW2000程序 二、 运行WinImage4.0 三、 粗跟踪 1 点[选项]-->[注册]...... 2 输入 姓名:CCCC 注册码: 88888888 (8个8) 3 Ctrl+N 呼出TRW，下断点：BPX getdlgitemtexta 按F5 返回 4 点[确定]，被拦截， 0137:BFF61654 RET 0C 0137:BFF61657 MOV CL,96 <------中断于此行 0137:BFF61659 PUSH EBP 0137:BFF6165A MOV EBP,ESP 0137:BFF6165C PUSH ECX 0137:BFF6165D SUB ESP,BYTE +3C 0137:BFF61660 PUSH WORD [EBP+08] 0137:BFF61664 PUSH DWORD [EBP+0C] 0137:BFF61667 CALL `KERNEL32!SMapLS_IP_EBP_16` 0137:BFF6166C PUSH EAX 0137:BFF6166D PUSH WORD [EBP+14] 0137:BFF61671 CALL NEAR [BFF61206] 5 bd * , 作废所有断点 6 pmodule，直接到达WinImage领空，如下代码： 0137:00429093 CALL ESI 0137:00429095 MOV EDI,0043C420 <------来到此行，标记为[A] 0137:0042909A PUSH BYTE +7F 0137:0042909C PUSH EDI 0137:0042909D PUSH DWORD 0817 7 按F12，在1次后出现非法注册码错误对话框，点[确定]退出 8 分析： 按1次后即出现非法注册码错误框，说明验证注册码就在这段代码中（F12 运行到遇到 RET, RETF,IRET指令时停下来）。接下来应找出具体哪个CALL产生错误框，并记录下大致跳转的过程。 以便可找出在哪个跳转位置可以跳过产生错误框的的CALL。进一步找出验证注册码、计算注册码 的位置。 四、 细跟踪 1 同前，输入注册码，呼出TRW，设断点：BPX 00429095 <--是上面A行 2 点[确定]，被拦截，代码如下[步聚7后面] 3 bc * ,清除所有断点 4 现在要找出产生误注册码框的的哪个CALL：按F10，即单步跟踪。一直按F10，33次，出现错误框。 5 从步聚1开始重来，做到步聚4时按F10（33-1）次，即找出了产生错误的CALL， 是下面代码后部的0137:00429131 CALL 0041D7F5 ，就是这条指令产生错误框。 6 着重分析如何跳过0137:00429131 CALL 0041D7F5 这条产生错误框指令。读者可从下面代码由后面向前 读，弄懂本人的分析过程。 7 现在已基本找出验证注册码的地方了004290AE CALL 0042CD8320这个CALL中验证注册码，所以要深 入跟踪进这个CALL。（深入跟踪步聚在代码后面） 0137:00429093 CALL ESI 0137:00429095 MOV EDI,0043C420 <------四中的1步中断于此，按F10 33次出现错误框。 0137:0042909A PUSH BYTE +7F 0137:0042909C PUSH EDI 0137:0042909D PUSH DWORD 0817 0137:004290A2 PUSH DWORD [EBP+08] 0137:004290A5 CALL ESI 0137:004290A7 PUSH DWORD 0043C800 0137:004290AC PUSH EDI 0137:004290AD PUSH EBX 0137:004290AE CALL 0042CD8320 <---可以确定此CALL为计算或验证注册码，为后面跳转产生 判断条件（置EAX寄存器为1），所要着重深入跟踪此CALL 0137:004290B3 MOV ECX,[0043C800] 0137:004290B9 XOR EDX,EDX 0137:004290BB ADD ESP,BYTE +0C 0137:004290BE CMP EAX,EDX 0137:004290C0 MOV [0043C5E8],EAX 0137:004290C5 JZ 004290CD <---错注册码此行跳 0137:004290C7 MOV [0043C7C4],ECX 0137:004290CD CMP [0043C7C4],EDX 0137:004290D3 MOV [0043CA54],ECX 0137:004290D9 JNZ 004290E0 <---错注册码此行跳 0137:004290DB MOV [0043CA54],EAX 0137:004290E0 PUSH BYTE +01 0137:004290E2 CMP EAX,EDX <---比较寄存器（即相减），产生后一跳转判断的条件 0137:004290E4 POP ESI 0137:004290E5 JNZ 00429113 <---此行如果不跳则到C行，继而到B行出错 0137:004290E7 PUSH DWORD 2000 0137:004290EC PUSH DWORD 042D 0137:004290F1 PUSH DWORD 042B 0137:004290F6 MOV [0043C6CC],ESI 0137:004290FC PUSH DWORD [EBP+08] 0137:004290FF MOV [0043C824],ESI 0137:00429105 MOV [0043C420],DL 0137:0042910B MOV [0043C828],DL 0137:00429111 JMP SHORT 00429131 <---如执行到此行则跳到B行，记着[C] 0137:00429113 PUSH DWORD 2000 0137:00429118 PUSH DWORD 042D 0137:0042911D PUSH DWORD 042A 0137:00429122 MOV [0043C6CC],EDX 0137:00429128 PUSH DWORD [EBP+08] 0137:0042912B MOV [0043C824],EDX 0137:00429131 CALL 0041D7F5 <---第1步按F10键32次来到此行，执行此出错误框，记着[B]行 0137:00429136 ADD ESP,BYTE +10 0137:00429139 PUSH ESI 0137:0042913A PUSH DWORD [EBP+08] 0137:0042913D CALL `USER32!EndDialog` 0137:00429143 MOV EAX,ESI 0137:00429145 JMP SHORT 00429180 0137:00429147 PUSH DWORD [EBP+08] 0137:0042914A CALL 0041D512 0137:0042914F CMP DWORD [0043C5E8],BYTE +00 四、 深入跟踪 1 追入此004290AE CALL 0042CD8320 此行的CALL，来到下面代码。 0137:0042CD83 PUSH EBP <---深入跟踪追入后来到此行 0137:0042CD84 MOV EBP,ESP 0137:0042CD86 SUB ESP,0200 0137:0042CD8C PUSH ESI . . . 0137:0042CDE0 JZ NEAR 0042CE86 0137:0042CDE6 LEA EAX,[EBP+FFFFFF00] 0137:0042CDEC PUSH EAX 0137:0042CDED LEA EAX,[EDI+14051948] 0137:0042CDF3 PUSH EAX 0137:0042CDF4 LEA EAX,[EBP+FFFFFE00] 0137:0042CDFA PUSH EAX 0137:0042CDFB CALL 0042CD36 <---此CALL计算注册码， 执行此行后D EAX 看见标准注册码:144E1ADC 0137:0042CE00 POP ECX 0137:0042CE01 POP ECX 0137:0042CE02 PUSH EAX 0137:0042CE03 CALL `CRTDLL!strcmp` 0137:0042CE08 POP ECX 0137:0042CE09 TEST EAX,EAX 0137:0042CE0B POP ECX 0137:0042CE0C JZ 0042CE86 0137:0042CE0E LEA EAX,[EBP+FFFFFF00] 0137:0042CE14 PUSH EAX 0137:0042CE15 LEA EAX,[EDI+17061954] 0137:0042CE1B PUSH EAX 0137:0042CE1C LEA EAX,[EBP+FFFFFE00] 0137:0042CE22 PUSH EAX 0137:0042CE23 CALL 0042CD36 <---此CALL计算另一注册码， 执行此行后D EAX 看见标准注册码:174F1AEB 0137:0042CE28 POP ECX 0137:0042CE29 POP ECX 0137:0042CE2A PUSH EAX 0137:0042CE2B CALL `CRTDLL!strcmp` 0137:0042CE30 POP ECX 0137:0042CE31 TEST EAX,EAX 0137:0042CE33 POP ECX 0137:0042CE34 JZ 0042CE86 0137:0042CE36 LEA EAX,[EBP+FFFFFF00] 0137:0042CE3C PUSH EAX 0137:0042CE3D LEA EAX,[EDI+10051981] 0137:0042CE43 PUSH EAX 0137:0042CE44 LEA EAX,[EBP+FFFFFE00] 0137:0042CE4A PUSH EAX 0137:0042CE4B CALL 0042CD36 <---此CALL计算注册码， 执行此行后D EAX 看见专业注册码:104E1815 0137:0042CE50 POP ECX 0137:0042CE51 POP ECX 0137:0042CE52 PUSH EAX . . . 0137:0042CEC0 POP EDI 0137:0042CEC1 POP ESI 0137:0042CEC2 LEAVE 0137:0042CEC3 RET <---------执行此行返回呼叫程序 至此，找出注册码！ 小 结： 此程序有三处计算注册码的子程序。有兴趣的读者可追入计算注册码的CALL，详细研究其 算法，写注册机。 姓名：CCCC 标准注册码：144E1ADC 或 174F1AEB 专业注册码：104E1815 后 记： 有疑问请与我联系：hz.cy@163.net


软件名称：WinImage5.0(FileVersion: 5.00.5000) 执行文件：Winimage.EXE 423KB 下载地点：http://www.winimage.com 发 信 人: 井 风 时 间: 2000-12-13 破解工具：Trw20001.22 解题难度：[专业] [学士] [硕士] [博士] ****** 前 言： 这个版本注册部分的算法与前一个版本(VER4.0)没有什么不同，注册码通用。 过 程: 1、用“井风跟踪”法（网友把我推崇的跟踪方法称为“井风跟踪”法，我暂且也这样称之）， 很容易找到计算和验证注册码的地方。具体方法请仔细阅读Winzip8.0之教学(很经典教学篇)。 2、提示： ****:0043477c 为计算注册码子程序的起始地址 当有******** CALL 0043477c <---则此行为呼叫计算注册码子程序，执行此CALL后用 D XXX 命令即可看见正确注册码。 3、例子： 00434869 CALL 0043477c <---这是之一，共有多处。 小 结： 有多处计算注册码的子程序。 姓名：1 注册码：4770C3 或 144CBA08 或 44BBA5B 或 174DBA17 后 记： 有疑问请与我联系：hz.cy@163.net


WinImp1.11

 标 题:一篇破解入门 (7千字)
发信人:custer
时 间:2000-9-4 8:56:19
详细信息:
软件WinImp1.11(主程序winimp32.exe 大小463,872字节)
该软件是类似winzip的压缩软件，支持的格式较多，压缩率也很高，并且软件本身有自交验功能。
本人是在该软件报警后，发现机器中有病毒的。

工具：trw2000-1.22
过程如下：
输入如下内容 name:1234 key1:12345678 key2:12345678

用BPX HMEMCPY下断点，拦截后BC *,PMODULE后进入下面程序

0167:00426013 PUSH EBX
0167:00426014 PUSH ECX
0167:00426015 PUSH EDX
0167:00426016 PUSH ESI
0167:00426017 PUSH EDI
0167:00426018 ENTER 24,00
0167:0042601C MOV ESI,EAX
0167:0042601E PUSH DWORD 0100
0167:00426023 PUSH DWORD 00453C60
0167:00426028 PUSH BYTE +65
0167:0042602A PUSH EAX
0167:0042602B XOR EBX,EBX
0167:0042602D CALL NEAR [CS:0043D7A0] <---- get name code
0167:00426034 MOV DWORD [EBP-04],00
0167:0042603B MOV EAX,00453C60
0167:00426040 JMP SHORT 00426046
0167:00426042 AND EBX,BYTE +03
0167:00426045 INC EAX
0167:00426046 CMP BYTE [EAX],00
0167:00426049 JZ 00426067
0167:0042604B CMP BYTE [EAX],20
0167:0042604E JZ 00426042
0167:00426050 CMP BYTE [EAX],2E
0167:00426053 JZ 00426042
0167:00426055 MOVZX EDI,BYTE [EAX]
0167:00426058 MOV EDX,EBX
0167:0042605A MOV CL,[EDI+00451110]
0167:00426060 INC EBX
0167:00426061 ADD [EDX+EBP-04],CL <---- move to [005cf740]
1234<->31323334
0167:00426065 JMP SHORT 00426042
0167:00426067 PUSH BYTE +0C
0167:00426069 LEA EAX,[EBP-24]
0167:0042606C PUSH EAX
0167:0042606D PUSH BYTE +66
0167:0042606F PUSH ESI
0167:00426070 MOV EBX,10
0167:00426075 CALL NEAR [CS:0043D7A0] <---- get key1 code
0167:0042607C LEA EAX,[EBP-24]
0167:0042607F XOR EDX,EDX
0167:00426081 CALL 00437454 <---- 对代码的检测，并送入[005cf738]
12345678<->78563412
0167:00426086 PUSH BYTE +0C
0167:00426088 MOV [EBP-0C],EAX
0167:0042608B LEA EAX,[EBP-24]
0167:0042608E PUSH EAX
0167:0042608F PUSH BYTE +67
0167:00426091 PUSH ESI
0167:00426092 MOV DWORD [EBP-08],00
0167:00426099 MOV EBX,10
0167:0042609E CALL NEAR [CS:0043D7A0] <---- get key2 code
0167:004260A5 LEA EAX,[EBP-24]
0167:004260A8 XOR EDX,EDX
0167:004260AA CALL 00437454 <---- 对代码的检测，并送入[005cf73c]
12345678<->78563412
0167:004260AF MOV EDX,[EBP-0C]
0167:004260B2 MOV [EBP-08],EAX
0167:004260B5 CMP EDX,01000000
0167:004260BB JC 004260D3
0167:004260BD CMP EAX,01000000
0167:004260C2 JC 004260D3
0167:004260C4 MOV EAX,EDX
0167:004260C6 MOV EDX,[EBP-08]
0167:004260C9 CALL 004262A7 <---- main proc
0167:004260CE CMP EAX,[EBP-04]
0167:004260D1 JZ 004260EB

进入main proc
0167:004262A7 PUSH EBX
0167:004262A8 PUSH ECX
0167:004262A9 PUSH ESI
0167:004262AA MOV ECX,EAX
0167:004262AC MOV EBX,EDX
0167:004262AE MOV EDX,[0044A764]
0167:004262B4 CALL 0042622D <-------1
0167:004262B9 MOV ESI,EAX
0167:004262BB MOV EDX,EBX
0167:004262BD MOV EBX,20
0167:004262C2 MOV EAX,ECX
0167:004262C4 XOR ECX,ECX
0167:004262C6 CALL 00436B7E <-------2
0167:004262CB XOR EAX,ESI <---- 这里是将key1的code进行一系列运算后的值(esi)
与key2的code(eax)异或，之后与name的code比较
这样可以简单的作出一个注册机

NAME XOR 199B0737(12345678<->KEY1)=KEY2
34333231(1234) XOR 199B0737=2DA83506

name:1234
key1:12345678
key2:2da83506

0167:004262CD POP ESI
0167:004262CE POP ECX
0167:004262CF POP EBX
0167:004262D0 RET

注意：key1,key2的长度是name的2倍。如果有兴趣，
可以进入上面的1，2中，分析一下，作出一个注册机。
--------------------------------------------------
1:
0167:0042622D PUSH EBX
0167:0042622E PUSH ECX
0167:0042622F PUSH ESI
0167:00426230 PUSH EDI
0167:00426231 ENTER 04,00
0167:00426235 PUSH EDX
0167:00426236 TEST BYTE [EBP-08],01
0167:0042623A JNZ 00426243
0167:0042623C MOV ECX,01
0167:00426241 JMP SHORT 00426245
0167:00426243 MOV ECX,EAX
0167:00426245 MOV DWORD [EBP-04],02
0167:0042624C MOV EDI,EAX
0167:0042624E JMP SHORT 00426259
0167:00426250 SHL DWORD [EBP-04],1
0167:00426253 CMP DWORD [EBP-04],BYTE +00
0167:00426257 JZ 0042629F
0167:00426259 MOV ESI,[0044A760]
0167:0042625F MOV EAX,EDI
0167:00426261 MOV EDX,EDI
0167:00426263 MUL EDX
0167:00426265 CMP ESI,EDX
0167:00426267 JA 00426273
0167:00426269 MOV EBX,EAX
0167:0042626B MOV EAX,EDX
0167:0042626D XOR EDX,EDX
0167:0042626F DIV ESI
0167:00426271 MOV EAX,EBX
0167:00426273 DIV ESI
0167:00426275 MOV ESI,[EBP-08]
0167:00426278 MOV EAX,EDX
0167:0042627A MOV EDI,EDX
0167:0042627C TEST [EBP-04],ESI
0167:0042627F JZ 00426250
0167:00426281 MOV ESI,[0044A760]
0167:00426287 MOV EDX,ECX
0167:00426289 MUL EDX
0167:0042628B CMP ESI,EDX
0167:0042628D JA 00426299
0167:0042628F MOV EBX,EAX
0167:00426291 MOV EAX,EDX
0167:00426293 XOR EDX,EDX
0167:00426295 DIV ESI
0167:00426297 MOV EAX,EBX
0167:00426299 DIV ESI
0167:0042629B MOV ECX,EDX
0167:0042629D JMP SHORT 00426250
0167:0042629F MOV EAX,ECX
0167:004262A1 LEAVE
0167:004262A2 POP EDI
0167:004262A3 POP ESI
0167:004262A4 POP ECX
0167:004262A5 POP EBX
0167:004262A6 RET
------------------------------------------------
2:
0167:00436B7E AND EBX,BYTE +3F
0167:00436B81 TEST BL,60
0167:00436B84 JNZ 00436B8E
0167:00436B86 MOV ECX,EBX
0167:00436B88 SHRD EAX,EDX,CL
0167:00436B8B SHR EDX,CL
0167:00436B8D RET
0167:00436B8E MOV ECX,EBX
0167:00436B90 MOV EAX,EDX
0167:00436B92 SUB ECX,BYTE +20
0167:00436B95 XOR EDX,EDX
0167:00436B97 SHR EAX,CL
0167:00436B99 RET
0167:00436B9A AND EBX,BYTE +3F
0167:00436B9D TEST BL,60
0167:00436BA0 JNZ 00436BAA
0167:00436BA2 MOV ECX,EBX
0167:00436BA4 SHRD EAX,EDX,CL
0167:00436BA7 SAR EDX,CL
0167:00436BA9 RET
0167:00436BAA MOV ECX,EBX
0167:00436BAC MOV EAX,EDX
0167:00436BAE SUB ECX,BYTE +20
0167:00436BB1 SAR EDX,1F
0167:00436BB4 SAR EAX,CL
0167:00436BB6 RET
0167:00436BB7 AND EBX,BYTE +3F
0167:00436BBA TEST BL,60
0167:00436BBD JNZ 00436BC7
0167:00436BBF MOV ECX,EBX
0167:00436BC1 SHLD EDX,EAX,CL
0167:00436BC4 SHL EAX,CL
0167:00436BC6 RET
0167:00436BC7 MOV ECX,EBX
0167:00436BC9 MOV EDX,EAX
0167:00436BCB SUB ECX,BYTE +20
0167:00436BCE XOR EAX,EAX
0167:00436BD0 SHL EDX,CL
0167:00436BD2 RET

custer 2000.9.3


winrar2.71

标 题:winrar2.71的破解和对暴破的一点想法 (4千字)
发信人:kingtall
时 间:2001-4-16 16:19:05
详细信息:
软件名称：winrar 2.71
软件说明: 著名的windows平台压缩工具
软件大小：589 KB
下载地址：ftp://zdftp.zdnet.com/pub/private/sWlIB/utilities/file_utilities/winrar.exe

我个人认为winrar比winzip好用，打开一个压缩包时，里面的目录结构一目了然；而且选extract to进行解压时，路径默认为压缩包的文件名，所以一般不用自己输入路径。保护方法为keyfile保护。2.71版有40天的时间限制，主窗体标题中有(evaluation copy)字样，about框中有40 days trial copy的字样，老是出现注册对话框要你注册。该版本的保护非常弱，破解非常简单，在此给出一种方法（肯定有更多的破解方法，但我的目的是能用就行，懒得想太多）。

用w32dasm调入winrar.exe，用search菜单中的find text项找evaluation copy，只找到一处，就是下面这一段

:0041BA0D E8820B0400 call 0045C594
:0041BA12 83C40C add esp, 0000000C
:0041BA15 803DCC6C460000 cmp byte ptr [00466CCC], 00 ；注意
:0041BA1C 752E jne 0041BA4C

* Possible Reference to String Resource ID=00873: "evaluation copy"
|
:0041BA1E 6869030000 push 00000369
:0041BA23 E894C6FEFF call 004080BC
:0041BA28 50 push eax

关闭w32dasm，打开trw2000，装入winrar.exe，下bpx 41ba15，g，trw很快弹出。看看[466ccc]的值是多少...答对了，是0。按F10到下一句，让我们输入rfl z跳过下面对SR id=873(十进制的369): "evaluation copy"的引用，然后g全速运行。程序界面出来了，怎么样，标题中的evaluation copy字样不见了吧。但about框中还是有40 days trial copy，注册框也还是经常跳出来。不要着急，回想刚才的程序，凭经验几乎可以断定[466ccc]这个全局变量中放的就是注册标志，0代表没有注册，非零代表注册。现在用trw重新装入winrar，bc清中断，然后下bpx 167:466ccc w，看看哪句话修改了[466ccc]的值，g吧。trw弹出时可以看到

426353 e8905d0100 call 43c0e8
426e58 a2cc6c4600 mov [466ccc],al
426e5d 53 push ebx

现在al=0，[466ccc]中已经是0了，把它改为1(下e 466ccc，敲1)。g，trw第二次弹出

41af44 e89f110200 call 43c0e8
41af49 a2cc6c4600 mov [466ccc],al

[466ccc]中又是0，再把它改回1。g，程序界面出来，怎么样，天下太平了吧，about框中的40 day trial copy也变成了register to。
这两段程序都调用了子程序43c0e8，然后把al赋给466ccc。al怎么变成0的呢？进去看看吧。用trw重新装入winrar，bc清中断，然后下bpx 167:43c0e8，g。trw弹出后按F10往下走，走不多远就看见:

43c11c e8ab030000 call 43c4cc
43c121 84c0 test al,al
43c123 7511 jnz 43c136 ; no jump
43c125 33c0 xor eax,eax ; eax清零了
43c127 8b55c8 mov edx,[ebp-38]
43c12a 64891500000000 mov [fs:00],edx
43c131 e950030000 jmp 43c486 ; 跳这么远，估计没戏了吧。

跟到43c486，果然pop几下就返回了。这下该怎么改就清楚了，只需要改两个字节，把43c125的33c0换成b001就行了(mov al,1)。

对于暴破的信心和偏爱来自这样一个假定：9x%的程序都是通过比较来判断使用者的合法性的，可以通过改变比较转移的方向或目的地址来暴破。另外有y%的程序是通过散转的方式确定转移的正确地址，未必不能破解。

下面是我个人对于暴破的一点经验：

1.首先使用程序，看看未注册的程序有哪些表现，如标题、about框中的未注册字样若有未注册字样，就用w32dasm找一找，若找到的语句上面有条件比较可以跳过未注册字样，那离成功就不远了。就像上面的例子。

2.若第一步不行，就看看弹出来的提示框、注册框。如果你能看出这个框是个messagebox，可以下bpx messageboxa。若是一个(非)模态对话框，可以下bpx createdialog，bpx dialogbox等等。不行就下bpx lockmytask，比较稳。然后关闭注册框，一般trw都会弹出(delphi编的程序除外)，按F12直到回到程序的天空，看看是那句话弹出的注册框(一般是messageboxa，或)，能不能跳过。若你能找到条件转移语句能跳过注册框，那就差不多了。

3.若还是中断不了，还有一招笨办法，就是用trw装入程序，按F10一步一步从头跟起(当然加壳的要先脱壳)。若带过一个call后弹除了注册框，那就记下位置，下次用F8进入call中再来，如disketer 1.0。经验多了以后就会知道什么编的程序大体是什么结构，怎样做可以提高跟踪效率...

4.不少程序是通过读取系统日期来判断是否过期的，所以下bpx getsystemtime 或bpx getlocaltime，也有可能找到比较的关键点。如Snagit 5.1.0。

5.若程序是用序列号注册的，那就可以与注册号破解相结合。看看程序是怎样判断你输入的注册号的合法性。能找到序列号或算出序列号当然好了，找不到也没关系。程序员都是很懒的(嘘！不要让他们听到)，这段程序通常也会放在程序的开头，判断用户的合法性，没注册的就弹出一个注册框给你看。所以这也经常帮助我们找到关键点，去掉开始的注册框，甚至把程序变成注册版。我就是这样破解the bat 1.51的。

6.还有一招，就是比较一下程序注册前和注册后，在某些关键点的运行有何差别，是跳呢还是不跳。条件是你有一个正确的注册码(废话，有了注册码还用破解吗？否，对于一个狂热的暴破分子来说，最重要的不是注册，而是破解)。当然也可以比较程序过期前后的差别。BugTrapper 3.0.97我就是这样破的，还有Ulead Photo Impact 6.0 trial。不过要小心，有不少程序一旦注册或过期，就很难恢复到原来的状态了。所以一定要看好你的注册表，备份好你的系统，要是有两台计算机供你使用，那就太幸福了。

写了这么多，好累，比破解还累。

标 题:WinRAR注册算法 (784字)
发信人:１２１２
时 间:2001-4-16 17:28:21
详细信息:

2.50及以前的版本使用的是winrar作者自己设计的一个变形算法，虽然强度一般，但是挺有创意（能写出keygen寥寥无几）。从2.60开始，winrar开始使用ecc（椭圆曲线密码）作为注册认证算法的数学基础，从密码学的角度上讲，winrar的ecc256（实际上不到256bits，只有241bits）大致相当于rsa2560（可怕）。

在winrar v2.8b2及以前的winrar中，作者使用的ecc库有一个严重的错误，就是在把keyfile中的ascii方式的hex转换成bin时，没有考虑到长度限制的问题。这样，就可以精心构造一个keyfile，把原有的栈值改变，从而达到注册winrar的目的。但是这种注册方法有一个缺点，就是如果你在rar压缩文件中加入了av信息，那么其它“正版”用户仍然会发现你的rar文件是坏的。

v2.8b3之后，作者修正了这个bug。

顺便说一句：

restorator v2.50 (这个比exescope强多了)
clonecd v2.x
winrar v2.6+

三个程序使用的是同一个曲线方程，幂值为272。


WinRescure 98 3.07

 标 题:破文三，高手莫入，非常简单 (2千字)
发信人:七味小路
时 间:2001-8-1 21:03:44
详细信息:
破解名称：WinRescure 98 3.07
软件说明：系统恢复，可以抢救当机前工作的记录。
工 具：TRW2000 1.23
软件限制：未注册版本运行时有10个数字倒记时，等的心烦。注册形式是填入固定的代码，没有用户名。
破解过程：用trw载入程序，……（此处省去N字），跑到这里：

....
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004681E5(C)
|
:00468254 8B00 mov eax, dword ptr [eax]
:00468256 33D2 xor edx, edx
:00468258 E85F47FCFF call 0042C9BC
:0046825D A120384800 mov eax, dword ptr [00483820]
:00468262 E8C160FCFF call 0042E328
:00468267 8D55F4 lea edx, dword ptr [ebp-0C]
:0046826A 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:00468270 E8BF82FBFF call 00420534
:00468275 837DF400 cmp dword ptr [ebp-0C], 00000000
:00468279 7462 je 004682DD
:0046827B 8D55F4 lea edx, dword ptr [ebp-0C]
:0046827E 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:00468284 E8AB82FBFF call 00420534
:00468289 8B55F4 mov edx, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"SvetCHRISTA" <===注册码 ^_^
|
:0046828C B870834600 mov eax, 00468370
:00468291 E81EBDF9FF call 00403FB4 <===下EDX见假的注册码，下EAX见真的注册码
:00468296 85C0 test eax, eax
:00468298 742D je 004682C7 <===比较注册码，不等就跳到失败处
:0046829A 33D2 xor edx, edx
:0046829C 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:004682A2 E8BD82FBFF call 00420564
:004682A7 A1A42A4800 mov eax, dword ptr [00482AA4]
:004682AC 8B00 mov eax, dword ptr [eax]
:004682AE 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:004682B4 C7400C64000000 mov [eax+0C], 00000064

* Possible StringData Ref from Code Obj ->"Registration Key Accepted <===注册成功信息

Thank "
->"you for registering."
|
:004682BB B884834600 mov eax, 00468384
:004682C0 E89751FDFF call 0043D45C
:004682C5 EB16 jmp 004682DD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00468298(C)
|

* Possible StringData Ref from Code Obj ->"WARNING - Incorrect Key Entered <===注册失败信息

WinRescue "
->"98 may be used without entering "
->"a Key

WinRescue 98 Terminating."

........

整理：注册码为SvetCHRISTA（注意大小写），或者修改85C0742D为85C0752D。


WinTopo Pro 2.11

标 题:注册码算法 (2千字)
发信人:lijing
时 间:2001-1-14 10:47:46
详细信息:
WinTopo Pro 2.11注册码计算方法

1、启动该软件，输入任意的注册码(16位)后，退出。此时注册信息会保存在软件安装目录的1814fd99.dat文件中。
2、启动该软件和TRW2000，下断点bpx 0040AD72，再打开"Help"菜单下的"License Wintopo Pro"选项，则会被中断。

:0040AD72 50 push eax
:0040AD73 E8A7050000 call 0040B31F ; 关键
:0040AD78 8B45F0 mov eax, dword ptr [ebp-10]
:0040AD7B 3B45EC cmp eax, dword ptr [ebp-14] ; 相等即可
:0040AD7E 7514 jne 0040AD94
:0040AD80 8B45E8 mov eax, dword ptr [ebp-18]
:0040AD83 3B45E4 cmp eax, dword ptr [ebp-1C] ; 相等即可
:0040AD86 750C jne 0040AD94

3、进入0040AD73 call 0040B31F调用，会看到对于注册码的变换过程。
其中有一张表格，由16个字符组成，对应数字0－F：
表格 G N P X W C D K R J F M B H T L
对应 0 1 2 3 4 5 6 7 8 9 A B C D E F
注册码就由这些字符组成。

4、执行完0040AD73 call 0040B31F的调用后，在内存[ebp-1c]处会保存计算结果。如：
18 3A 5C 7E D5 8F EF 0D-90 B2 D4 F6 57 03 D3 BF
^^^^^^^^^^^ *********** ^^^^^^^^^^^ ***********
(1) (2) (3) (4)
其中，(1)为[ebp-1c]处内容，由你输入的注册码算得，(2)为[ebp-18]处内容，为真正的注册码内容，(3)为[ebp-14]处内容，由你输入的注册码算得，(4)为[ebp-10]处内容，为真正的注册码内容。

5、只要(1)=(2)，(3)＝(4)即可注册成功。
记下(2)和(4)处的内容。

6、下面反推注册码。
(2)处内容为：D5 8F EF 0D 根据此数由左向右得出注册码以下几位：
注册码第1位=D 换算为H ; 由上面的表格得来
第8位=5 C
第3位=8 R
第A位=F L
第5位=E T
第C位=F L
第7位=0 G
第E位=D H
(4)处内容为：57 03 D3 BF
则注册码第9位=5 换算为C
第0位=7 K
第B位=0 G
第2位=3 X
第D位=D H
第4位=3 X
第F位=B M
第6位=F L

7、最后，得出真正的注册码为：KHXRXTLGCCLGLHHM
重新注册，成功。

由于本人水平所限，可能很多地方没说清楚，欢迎交流。


Winzip 8.0

 发信人:WINZIP8.0(FileVersion:13.0 32bit) Winzip32.EXE 1,393KB
发信人:井风
时 间:2000-11-21
详细信息:

软件名称：WINZIP8.0(FileVersion:13.0 32bit) Winzip32.EXE 1,393KB
下载地点：http://cycycycy.yeah.net (已经汉化，附注册码）
发 信 人: 井风
时 间: 2000-11-21
破解工具：Trw20001.22
难 度：易

前 言：
应几位网友的请求，本人特写下这篇文章。其目的不是单单为破解此软件，意义在于抛砖
引玉，让初学者理解破解的基本思路。本文具有一定的普遍性，过程讲解尽可能详细，即使是
未接触过破解的人也能按步聚找出注册码，掌握一套普遍适用的方法。本文欢迎转载，但务必
请保留原文完整性。

本人再次呼吁！每个能人志士积极行动起来，拿出自已的经验和技术，积极参与交流活动，
为提高我国计算机技术水平贡献一份力量。鸣谢！广大为网友提供技术和经验的高手、为大家
建设网站提供交流点的站长们。

详细过程:

一、 运行TRW2000程序
二、 运行Winzip8.0
三、 粗跟踪
1 点HELP-->about winzip...-->register...
2 输入 Namme:cccc Reg Key: 88888888 (8个8)
3 Ctrl+N 呼出TRW，下断点：BPX HMEMCPY 按F5 返回
4 点OK，被拦截，
5 bd * , 作废所有断点
6 pmodule，直接到达Winzip领空，下代码：

0137:00407F6D CALL `USER32!GetDlgItemTextA`
0137:00407F73 PUSH EDI <--来到此行，是WINZIP的代码，细跟踪可以直接中断到这行[A]
0137:00407F74 CALL 0043F89A
0137:00407F79 PUSH EDI
0137:00407F7A CALL 0043F8C3
0137:00407F7F POP ECX
0137:00407F80 MOV ESI,0048CDA4
0137:00407F85 POP ECX
0137:00407F86 PUSH BYTE +0B

7 按F12，在1次后出现非法注册码错误对话框，点OK退出
8 分析： 按1次后即出现非法注册码错误框，说明验证注册码就在这段代码中（F12 运行到遇到 RET,
RETF,IRET指令时停下来）。接下来应找出具体哪个CALL产生错误框，并记录下大致跳转的过程。
以便可找出在哪个跳转位置可以跳过产生错误框的的CALL。进一步找出验证注册码、计算注册码
的位置。

四、 细跟踪
1 同前，输入注册码，呼出TRW，设断点：BPX 004077F73 <--是上面[A]行
2 点OK，被拦截，代码如下面[步聚7后面]
3 bc * ,清除所有断点
4 现在要找出产生误注册码框的的哪个CALL：按F10，即单步跟踪。一直按F10，一直按，注意记下的次数，
直到出现错误框，假设使用次数为X次。
5 从步聚1开始重来，做到步聚4时按F10（X-1）次，即找出了产生错误的CALL，
是下面代码后部的0137:00408018 CALL 00430025，就是这条指令产生错误框。
6 着重分析如何跳过0137:00408018 CALL 00430025这条产生错误框指令。读者可从下面代码由后面向前
读，弄懂本人的分析过程。另也可以首先在离0137:00408018 CALL 00430025这条产生错误框指令不远
代码处开始，记录一份程序执行到0137:00408018 CALL 的跳转过程，这样便于直接找出那个重要的跳转
点，即如本程序中的00407FBC JZ 00408005。
7 现在已基本找出验证注册码的地方了0137:00407FB5 CALL 004079D5 这个CALL中验证注册码，所以要深
入跟踪进这个CALL。（深入跟踪步聚在代码后面）

0137:00407F6D CALL `USER32!GetDlgItemTextA`
0137:00407F73 PUSH EDI <--中断于此行，从这行起开始细跟踪，即按F10键。
0137:00407F74 CALL 0043F89A
0137:00407F79 PUSH EDI
0137:00407F7A CALL 0043F8C3
0137:00407F7F POP ECX
0137:00407F80 MOV ESI,0048CDA4
0137:00407F85 POP ECX
0137:00407F86 PUSH BYTE +0B
0137:00407F88 PUSH ESI
.
.
.
0137:00407F96 CALL 0043F89A
0137:00407F9B PUSH ESI
0137:00407F9C CALL 0043F8C3
0137:00407FA1 CMP BYTE [0048CD78],00
0137:00407FA8 POP ECX
0137:00407FA9 POP ECX
0137:00407FAA JZ 00408005
0137:00407FAC CMP BYTE [0048CDA4],00
0137:00407FB3 JZ 00408005

0137:00407FB5 CALL 004079D5 <--就是这个CALL中验证注册码，所以深入跟踪进入这个CALL

0137:00407FBA TEST EAX,EAX <--就是这个测试（TEST），至关重要，EAX的值由上面的CALL决定，
哪就是说上面这个CALL验证注册码，并相应置EAX的值，决定是
否跳转。应深入到这个CALL中，找出验证的地方。
0137:00407FBC JZ 00408005 <--这里如跳转则到00408005 CALL，接下去执行00408018 CALL，出错

0137:00407FBE PUSH EDI
0137:00407FBF MOV EDI,0047FFA4
0137:00407FC4 PUSH DWORD 0047DB24
0137:00407FC9 PUSH EDI
0137:00407FCA CALL 0043B5DA
0137:00407FCF PUSH ESI
0137:00407FD0 PUSH DWORD 0047E66C
0137:00407FD5 PUSH EDI
0137:00407FD6 CALL 0043B5DA
0137:00407FDB PUSH DWORD 0047FFC4
0137:00407FE0 PUSH BYTE +00
0137:00407FE2 PUSH BYTE +00
0137:00407FE4 PUSH DWORD 0047DB30
0137:00407FE9 CALL 0043B5C1
0137:00407FEE MOV EAX,[00487AF4]
0137:00407FF3 ADD ESP,BYTE +28
0137:00407FF6 TEST EAX,EAX
0137:00407FF8 JZ 00408001
0137:00407FFA PUSH EAX
0137:00407FFB CALL `GDI32!DeleteObject`
0137:00408001 PUSH BYTE +01
0137:00408003 JMP SHORT 00408035
0137:00408005 CALL 004082A6 <--上面00407FBC行跳到此行，如执行到此行，则会执行00408018 CALL
0137:0040800A PUSH DWORD 028E 说明上一跳转已判别出输入的是错误注册码。继续向分分析
0137:0040800F CALL 0043F5ED
0137:00408014 PUSH EAX
0137:00408015 PUSH EBX
0137:00408016 PUSH BYTE +3D
0137:00408018 CALL 00430025 <--执行此行CALL则出现错误框，须找出如何才能跳过此行
0137:0040801D ADD ESP,BYTE +10
0137:00408020 INC DWORD [00487AF8]

四、 深入跟踪
1 重复细跟踪步聚中的1-3步；
2 按F10，小心不要走过头呵，一直执行00407FB5 CALL 004079D5 这行；
3 按F8，追入此CALL，来到下面代码(代码在步聚4后面）；
4 按F10，边按边分析，值得怀凝地方可查看各寄存器的内容（用D EAX 、EDI等命令）你会找到下面的
代码，本程序就在这里计算和验证注册码。按F10键53次到达0137:00407A97 PUSH EAX（见代码），这
里就是…………。

0137:00407905 POP ESI <-- 追入上叙CALL后，来到此行
0137:00407906 POP EBP
0137:00407907 RET 04
0137:0040790A PUSH ESI
0137:0040790B MOV ESI,ECX
.
.
.
0137:00407A5E PUSH EAX
0137:00407A5F CALL 00467C10
0137:00407A64 PUSH DWORD C8
0137:00407A69 LEA EAX,[EBP+FFFFFDF8]
0137:00407A6F PUSH BYTE +00
0137:00407A71 PUSH EAX
0137:00407A72 CALL 00467C10
0137:00407A77 ADD ESP,BYTE +18
0137:00407A7A TEST ESI,ESI
0137:00407A7C JZ 00407A91
0137:00407A7E CALL 004082A6
0137:00407A83 AND DWORD [00489FDC],BYTE +00
0137:00407A8A XOR EAX,EAX
0137:00407A8C JMP 00407B42
0137:00407A91 LEA EAX,[EBP+FFFFFEC0]
0137:00407A97 PUSH EAX <--按F10键53次到这行
0137:00407A98 PUSH EDI <--执行此行后，下令D EDI，显示‘cccc’，即输入的注册名
0137:00407A99 CALL 00407B47 <--呼叫计算注册码子程序（新版本）
0137:00407A9E MOV ESI,0048CDA4 <--传送输入的注册码，执行此行后下令D ESI，显示‘8个8’
0137:00407AA3 LEA EAX,[EBP+FFFFFEC0]
0137:00407AA9 PUSH ESI <--将输入的假码‘8个8’压入堆栈，下令D ESI，显示‘8个8’
0137:00407AAA PUSH EAX <--计算出的注册码压入堆栈，下令D EAX 显示正确注册码：
02EC0252
0137:00407AAB CALL 004692D0 <--呼叫验证注册码子程序，看看输入的是否为新版本注册码。
0137:00407AB0 ADD ESP,BYTE +10
0137:00407AB3 NEG EAX
0137:00407AB5 SBB EAX,EAX
0137:00407AB7 INC EAX
0137:00407AB8 MOV [00489FDC],EAX
0137:00407ABD JNZ 00407B27 <--如输入的注册码正确，这里跳转，可返回呼叫程序，
可跳过00408018 CALL ，完成程序注册。
0137:00407ABF LEA EAX,[EBP+FFFFFEC0]
0137:00407AC5 PUSH EAX
0137:00407AC6 PUSH EDI <--执行此行后，下令D EDI，显示‘cccc’，即输入的注册名
0137:00407AC7 CALL 00407BE4 <--呼叫计算注册码子程序（老版本）
0137:00407ACC LEA EAX,[EBP+FFFFFEC0]
0137:00407AD2 PUSH ESI <--将输入的假码‘8个8’压入堆栈，下令D ESI，显示‘8个8’
0137:00407AD3 PUSH EAX <--计算出的注册码压入堆栈，下令D EAX 显示正确注册码：
07480594
0137:00407AD4 CALL 004692D0 <--呼叫验证注册码子程序，看看输入的是否为新版本注册码。
0137:00407AD9 ADD ESP,BYTE +10
0137:00407ADC NEG EAX
0137:00407ADE SBB EAX,EAX
0137:00407AE0 INC EAX
0137:00407AE1 MOV [00489FDC],EAX
0137:00407AE6 JNZ 00407B27
0137:00407AE8 LEA EAX,[EBP+FFFFFEC4]
0137:00407AEE PUSH BYTE +04
0137:00407AF0 PUSH EAX
0137:00407AF1 PUSH ESI
0137:00407AF2 CALL 004696C0
0137:00407AF7 ADD ESP,BYTE +0C
0137:00407AFA TEST EAX,EAX
0137:00407AFC JNZ 00407B20 (JUMP)
0137:00407AFE LEA EAX,[EBP+FFFFFEC0]
0137:00407B04 PUSH BYTE +04
0137:00407B06 PUSH EAX
0137:00407B07 PUSH DWORD 0048CDA8
0137:00407B0C CALL 004696C0
0137:00407B11 ADD ESP,BYTE +0C
0137:00407B14 TEST EAX,EAX
0137:00407B16 JNZ 00407B20
0137:00407B18 MOV [00489FDC],EBX
0137:00407B1E JMP SHORT 00407B27
0137:00407B20 AND DWORD [00489FDC],BYTE +00
0137:00407B27 PUSH DWORD 012C
0137:00407B2C LEA EAX,[EBP+FFFFFEC0]
0137:00407B32 PUSH BYTE +00
0137:00407B34 PUSH EAX
0137:00407B35 CALL 00467C10
0137:00407B3A MOV EAX,[00489FDC]
0137:00407B3F ADD ESP,BYTE +0C
0137:00407B42 POP EDI
0137:00407B43 POP ESI
0137:00407B44 POP EBX
0137:00407B45 LEAVE
0137:00407B46 RET <--执行此行返回呼叫程序

至此，找出注册码！

小 结：
此程序有两处计算和验证注册码的子程序。它可用新版本的注册码注册，亦可用前一版本的
注册码完成注册。
User Name: cccc
Reg Key: 02EC0252 或07480594 （新旧版本注册码皆可用）
后 记：
有疑问请与我联系：hz.cy@163.net


Winzip8.0

 标 题:初学者-Winzip8.0
发信人:liutong
时 间:2000-11-19 22:32:31
详细信息:
Winzip V8.0

输入
用户名: Liu Tong
注册码: 87654321
设断点bpx hmemcpy
点OK键,被中断后按F12键9次(第10次出错)
便按F10便用D命令找输入的注册码(如D ESI, D EDI....)
如找到注册码的地址****:********,设断点bpx ****:********
CTRL+D返回Winzip,再次被中断后注意找,下面的程序,若不是继续按CTRL+D

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004692F8(C), :00469318(C)
|
:004692EC 0AC0 or al, al
:004692EE 742E je 0046931E
:004692F0 8A06 mov al, byte ptr [esi]<----此处用D ESI命令可看到输入码
:004692F2 46 inc esi
:004692F3 8A27 mov ah, byte ptr [edi]<----此处用D EDI命令可看到注册码
:004692F5 47 inc edi
:004692F6 38C4 cmp ah, al
:004692F8 74F2 je 004692EC
:004692FA 2C41 sub al, 41
:004692FC 3C1A cmp al, 1A
:004692FE 1AC9 sbb cl, cl
:00469300 80E120 and cl, 20
:00469303 02C1 add al, cl
:00469305 0441 add al, 41
:00469307 86E0 xchg al, ah
:00469309 2C41 sub al, 41
:0046930B 3C1A cmp al, 1A
:0046930D 1AC9 sbb cl, cl
:0046930F 80E120 and cl, 20
:00469312 02C1 add al, cl
:00469314 0441 add al, 41
:00469316 38E0 cmp al, ah
:00469318 74D2 je 004692EC
:0046931A 1AC0 sbb al, al
:0046931C 1CFF sbb al, FF

下面是找注册码生成的过程:
通常,注册码是由用户名(或用户名加公司名)计算出来的.
因此,设断点bpx ********(********是用户名存储的地址)
会找到两段程序(软件的注册码是由两个4位码组合成的):
第一段程序生成后4位码:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407B6C(U)
|
:00407B5A 84D2 test dl, dl
:00407B5C 7410 je 00407B6E
:00407B5E 660FB6D2 movzx dx, dl
:00407B62 0FAFD7 imul edx, edi
:00407B65 03DA add ebx, edx
:00407B67 8A5601 mov dl, byte ptr [esi+01]
:00407B6A 47 inc edi
:00407B6B 46 inc esi
:00407B6C EBEC jmp 00407B5A

第二段程序生成前4位码:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407B97(U)
|
:00407B7C 84C9 test cl, cl
:00407B7E 7419 je 00407B99
:00407B80 660FB6C9 movzx cx, cl
:00407B84 6821100000 push 00001021
:00407B89 51 push ecx
:00407B8A 50 push eax
:00407B8B E829000000 call 00407BB9
:00407B90 8A4E01 mov cl, byte ptr [esi+01]
:00407B93 83C40C add esp, 0000000C
:00407B96 46 inc esi
:00407B97 EBE3 jmp 00407B7C
======================================================================
* Referenced by a CALL at Addresses:
|:00407B8B , :00407C75
|
:00407BB9 55 push ebp
:00407BBA 8BEC mov ebp, esp
:00407BBC 8B4508 mov eax, dword ptr [ebp+08]
:00407BBF 56 push esi
:00407BC0 33C9 xor ecx, ecx

* Possible Ref to Menu: RBUTTONMENU1, Item: "Delete..."
|

* Possible Reference to String Resource ID=00008: "Delete files from %s"
|
:00407BC2 6A08 push 00000008
:00407BC4 8A6D0C mov ch, byte ptr [ebp+0C]
:00407BC7 5A pop edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407BDF(C)
|
:00407BC8 8BF0 mov esi, eax
:00407BCA 33F1 xor esi, ecx
:00407BCC 66F7C60080 test si, 8000
:00407BD1 7407 je 00407BDA
:00407BD3 03C0 add eax, eax
:00407BD5 334510 xor eax, dword ptr [ebp+10]
:00407BD8 EB02 jmp 00407BDC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407BD1(C)
|
:00407BDA D1E0 shl eax, 1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407BD8(U)
|
:00407BDC D1E1 shl ecx, 1
:00407BDE 4A dec edx
:00407BDF 75E7 jne 00407BC8
:00407BE1 5E pop esi
:00407BE2 5D pop ebp
:00407BE3 C3 ret


Xara3d 4.0

 发信人:软件名称：Xara3d 4.0(Version: 4.0) x3d.EXE 1,140KB
时 间:2000-12-25
作 者:井 风
详细信息:

软件名称：Xara3d 4.0(Version: 4.0) x3d.EXE 1,140KB
下载地点：http://www.xara.com/xara3d/
发 信 人: 井 风
时 间: 2000-12-25
破解工具：Trw20001.22 Hew Workshop3.0
解题难度：[专 业] [学 士] [硕 士] [博 士]
********

前 言：
这是一个很好的制作3D字体图形的软件。有了它制作的网页会更加逊色。
此软件用 W32Dasm8.93不能反汇编，加密手法较高，注册过程复杂。由于最近很忙，
我今天暂不写出详细的破解过程，请广大网友见凉！春节后我会写出详细过程，供网友
参考。
程序破解补钉我已经写出，在破解文库可找到。如找不到与我联系。

过 程:

只要用16进制编辑器将下9个跳转改成相对应的非跳转即可。

跳转点 修改字节偏移 目的代码

1：0041F6C5 offset 1F6C6 字节改成84h
2: 0041F6D9 offset 1F6DA 字节改成85h
3: 0041F6F5 offset 1F6F6 字节改成85h
4: 0041F711 offset 1F712 字节改成85h
5: 0041F72D offset 1F72E 字节改成85h
6：0041F749 offset 1F74A 字节改成85h
7: 0041F765 offset 1F766 字节改成85h
8: 0041F781 offset 1F782 字节改成85h
9: 0041F811 offset 1F812 字节改成84h

小 结：
此软件利用机器的某一参数作为注册码源。
我的机器注册码：IBCTABR

后 记：
有疑问请与我联系：hz.cy@163.ne


XNETECH FTP Server 0.1.1.616

 标 题:破解XFtpSvr =====> 请进 (5千字)
发信人:Edea[BCG]
时 间:2001-7-1 12:49:53
详细信息:
软件名称：XNETECH FTP Server 0.1.1.616
软件简介：基于Windows95/98/NT/2000的FTP服务器；支持RFC-959标准中所有基本的FTP命令；支持多线程、断点续传等功能；不限制用户数，允许不同用户使用不同的路径；不同用户可以赋予不同的的权限;对用户的目录进行容量的限制；自动识别IP地址，并对不同的IP地址赋予不同的的权限；扩展FTP命令集，使用FTP客户端软件能管理FTP服务器；远程查看FTP服务器的当前状态；远程增加或删除用户的帐户；远程断开任何用户或IP地址的FTP连接；远程启动或停止FTP服务器的运行；远程查看用户的帐户; 允许匿名访问；简单而强大的图形介面,操作十分简单;无须进行安装设置即可运行;
下载地址(软件主页）：http://xnetech.363.net/
破解难度：very easy
破解人:Edea[BCG] (QQ:3849036)

首先，用FI检查，发现该软件用UPX加壳，用UPX -d脱之。
用Wdasm反汇编，在反汇编的同时，打开软件（嘿嘿，为了节约时间）。点Help/Register Info，填入：
UserName=Edea
Company=BCG
RegisterNO=9876543210
点OK，对话框消失，没任何反映（我晕~~~），经过N（N<=1）分钟的努力，我发现该软件把我填的注册信息放到了软件目录中得xftpsvr.ini里。
反汇编完成，又经过N（N<=2）分钟的努力，在反汇编出来的代码中，找到这么一段：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00499218(C)
|
:00499226 8B9324040000 mov edx, dword ptr [ebx+00000424]
:0049922C 8BC3 mov eax, ebx
:0049922E E8557CF9FF call 00430E88
:00499233 8B9328040000 mov edx, dword ptr [ebx+00000428]
:00499239 8BC3 mov eax, ebx
:0049923B E8287CF9FF call 00430E68
:00499240 8B932C040000 mov edx, dword ptr [ebx+0000042C]
:00499246 8BC3 mov eax, ebx
:00499248 E85F7CF9FF call 00430EAC
:0049924D 8B9330040000 mov edx, dword ptr [ebx+00000430]
:00499253 8BC3 mov eax, ebx
:00499255 E8727CF9FF call 00430ECC
:0049925A E825F3FDFF call 00478584 ----->关键CALL
:0049925F 84C0 test al, al
:00499261 7519 jne 0049927C ----->嘿嘿，关键跳转点
:00499263 A1C4624A00 mov eax, dword ptr [004A62C4]
:00499268 C70001000000 mov dword ptr [eax], 00000001

* Possible StringData Ref from Code Obj ->"XNETECH FTP SERVER - http://xnetech.363.net/ "
->"[UnRegister]"
|
:0049926E BAC0924900 mov edx, 004992C0
:00499273 8BC3 mov eax, ebx
:00499275 E82A84F9FF call 004316A4
:0049927A EB0C jmp 00499288

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00499261(C)
|

* Possible StringData Ref from Code Obj ->"XNETECH FTP Server - http://xnetech.363.net/"
|
:0049927C BA04934900 mov edx, 00499304
:00499281 8BC3 mov eax, ebx
:00499283 E81C84F9FF call 004316A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049927A(U)
|
:00499288 8BC3 mov eax, ebx
:0049928A 8B10 mov edx, dword ptr [eax]
:0049928C FF9280000000 call dword ptr [edx+00000080]
:00499292 8BC3 mov eax, ebx
:00499294 E82B040000 call 004996C4
:00499299 8BC3 mov eax, ebx
:0049929B E8C8020000 call 00499568
:004992A0 33C0 xor eax, eax
:004992A2 5A pop edx
:004992A3 59 pop ecx
:004992A4 59 pop ecx
:004992A5 648910 mov dword ptr fs:[eax], edx
:004992A8 68B5924900 push 004992B5

***********************************************************************************************

该软件在启动的时候会检查储存在xftpsvr.ini里的注册码，判断注册与否。
退出程序，打开TRW2000（我的最爱），下断点bpx 0049924D，然后再运行程序，被拦下：

************************************************************************************************

0177:0049924D MOV EDX,[EBX+0430]
0177:00499253 MOV EAX,EBX
0177:00499255 CALL 00430ECC
0177:0049925A CALL 00478584 ------>F8跟入
0177:0049925F TEST AL,AL
0177:00499261 JNZ 0049927C
0177:00499263 MOV EAX,[004A62C4]
0177:00499268 MOV DWORD [EAX],01
0177:0049926E MOV EDX,004992C0
0177:00499273 MOV EAX,EBX
0177:00499275 CALL 004316A4
0177:0049927A JMP SHORT 00499288
0177:0049927C MOV EDX,00499304
0177:00499281 MOV EAX,EBX

Call from 0049925A:
0177:00478584 PUSH EBP
0177:00478585 MOV EBP,ESP
0177:00478587 PUSH BYTE +00
0177:00478589 PUSH EBX
0177:0047858A XOR EAX,EAX
0177:0047858C PUSH EBP
0177:0047858D PUSH DWORD 004785DC
0177:00478592 PUSH DWORD [FS:EAX]
0177:00478595 MOV [FS:EAX],ESP
0177:00478598 LEA EAX,[EBP-04]
0177:0047859B PUSH EAX
0177:0047859C MOV CX,2710
0177:004785A0 MOV EDX,[004A7AFC] ----->"BCG"==>EDX
0177:004785A6 MOV EAX,[004A7AF8] ----->"Edea"==>EAX
0177:004785AB CALL 004785EC ----->算注册码的Call，如果要写注册机就跟入
0177:004785B0 MOV EAX,[EBP-04] ----->真注册码==>EAX
0177:004785B3 MOV EDX,[004A7B00] ----->假注册码==>EDX
0177:004785B9 CALL 00403FC8 ----->比较真假注册码
0177:004785BE JNZ 004785C4 ----->不相等吗？去死吧！
0177:004785C0 MOV BL,01
0177:004785C2 JMP SHORT 004785C6
0177:004785C4 XOR EBX,EBX
0177:004785C6 XOR EAX,EAX
0177:004785C8 POP EDX

我的注册码：
UserName=Edea
Company=BCG
RegisterNO=C86428289719A64C3ADEC11B45C91EEA

这个软件破解很简单，我的本意是想写一下这个软件的注册机，可惜功力不够，在程序中转晕了头。希望各位兄弟（特别是伪哥）能帮忙写出注册机，让小弟学习学习。

标 题:贴这个的注册机~~~~ (1千字)
发信人:伪装者[CCG]
时 间:2001-7-1 19:08:04
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[81],comp[81];
int i,a;
unsigned c,esi=10000,d;
static unsigned char tb1[32]={'#','$','H','&',')','&','H','&','%','H','|','+','_','%','B','R','$','B','*','!','2','%','G','&','%','G','@','%','G','@','g','2'};
static unsigned char tb2[32]={'%','$','^','F','&','G','F','V','(','(','Y','B','%','F','J','H','G','L','0','k','+','|','+','_',')','+','N','K','J','G','J','^'};
printf("*********Xftpsvr 0.1.2.620*********\nThis keygen is maked by Pretender\nPlease
  input your name    : ");
gets(string);
printf("Please input your Company : ");
gets(comp);
a=strlen(string);
printf("Your Register code is    : ");
for(i=0;(c=string[i])!='\0';i++)
{d=esi;d/=256;c^=d;esi+=c;esi*=0xce6d;esi+=0x58bf;
if(i!=a-1) tb1[i]=c;}
a=strlen(comp);
for(i=0;(c=comp[i])!='\0';i++)
{d=esi;d/=256;c^=d;esi+=c;esi*=0xce6d;esi+=0x58bf;
if(i!=a-1) tb2[i]=c;}
for(i=0;i<32;i++)
/*printf("%x,,,",tb1[i]);*/
{if(i!=31) c=tb2[30-i]^tb1[i];
else c=0^tb1[i];
c&=0xff;
d=esi;d/=256;c^=d;esi+=tb1[i];esi*=0xce6d;esi+=0x58bf;
if(c>0xf) {c/=16;printf("%X",c);}
else printf("%X",c);
}
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


Zero Popup 1.05

 标 题:Zero Popup 1.05 (2千字)
发信人:WinDos2K
时 间:2001-8-18 12:57:52
详细信息:
这是一个防止popup的小程式,在IE启动时自动运行,可防止一些网站上的广告窗弹出.
Windows 95/98/Me/NT/2000: Internet: World Wide Web: Browser Enhancements

Zero Popup 1.05
Author: Tooto Technologies, Inc. http://popupkiller2002.tripod.com/
Program Type: Shareware

下载地址如下,是ZeroPopup.msi方式,点击右键便可安装

http://fileforum.betanews.com/detail.php3?fid=997512878
http://popupkiller2002.tripod.com/download.htm

暴力破解如下:
:100012B5 E8155B0000 call 10006DCF <-------- 做一些运算
:100012BA 668985DCFEFFFF mov word ptr [ebp+FFFFFEDC], ax
:100012C1 8B95DCFEFFFF mov edx, dword ptr [ebp+FFFFFEDC]
:100012C7 81E2FFFF0000 and edx, 0000FFFF
:100012CD 83FA07 cmp edx, 00000007 <-------- 七天时间?
:100012D0 7C41 jl 10001313 <-------- 改为 EB41 永远小於七天
:100012D2 833D14D0011000 cmp dword ptr [1001D014], 00000000
:100012D9 7536 jne 10001311
:100012DB C70518D0011001000000 mov dword ptr [1001D018], 00000001
:100012E5 6A00 push 00000000
:100012E7 6800670010 push 10006700
:100012EC 6A00 push 00000000
:100012EE 68CD000000 push 000000CD

改了上面100012D0的7C41为EB41後,过了七天後都没有窗口弹出了.

跟踪这个程式在Win2000下有点难,下了几个断点GetDlgitemTexta,GetWindowText,lstrcpya,
lstrlena等都没反应.
它本身是dll形式出现(HTMLEdit.dll),是在IE启动时自动运行.没法在DLLMain下断,祗有下CreateFile
这断点,在多次中断後停在HTMLEdit.dll里,但离开输入窗口还选.反汇编後又看不到有DialogBox这
方面的断点.没辨法祗有放下键盘去洗澡了事!
不知过了多久,想起某人在论坛上问过关於Dialog的事,而且自己也告诉过他方法,就从资源档入手.
打开Restorator看看资源档,找到这窗口为0xCD,再在W32DASM里找一下,在100012EE推这ID入stack
向上便看到上面的机器码了.分析一下代码,把在100012D0的7C41改为EB41,重启IE,Bingo!! 七天後的
nag screen 没有了.
昨天把这改动在mIRC里告诉友人後,虽然解决了nag的问题,但好像有些事情还没完,再後看.
在下面的代码,经过分析後,结果如下

:10006B20 E852000000 call 10006B77
:10006B25 83C404 add esp, 00000004
:10006B28 8945F8 mov dword ptr [ebp-08], eax
:10006B2B 837DF800 cmp dword ptr [ebp-08], 00000000
:10006B2F 7504 jne 10006B35
:10006B31 32C0 xor al, al
:10006B33 EB3E jmp 10006B73

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006B2F(C)
|
:10006B35 8B45F8 mov eax, dword ptr [ebp-08] <------ 输入ID1
:10006B38 50 push eax
:10006B39 8B4DF4 mov ecx, dword ptr [ebp-0C] <------ 输入ID2
:10006B3C 51 push ecx
:10006B3D E8AE650000 call 1000D0F0

输入ID1为运算後的结果,是等於输入ID2,注册便可成功.
我会试造注册机,如等不来可用下面注册码

123456dill5k

WinDos2k
08.17.01


ZTZ-IE

 标 题:ZTZ-IE网络浏览器的破解与注册机,应付PETERCHEN用的 (8千字)
发信人:伪装者[CCG]
时 间:2001-8-11 10:48:35
详细信息:
ZTZ-IE网络浏览器的破解与注册机

（版本1.8）
软件说明：
    该软件是你快速打开、快速浏览网页的最佳浏览器软件，
该版本在原有功能基础上，添加了字体大小选项、设置为默
认浏览器等项功能，并添加了更多、更新的网址，使你访问
网页更加方便。进一步优化了源代码，稳定性进一步提高。
下载地址：http://202.99.189.4/ztz/ZTZ-IE.zip
使用工具：TRW2000
难度 ：0.5 (10为最难，0为最易)
CRACKER ：伪装者[BCG&&CCG]
目的 ：学习破解一周年纪念+应付PETERCHEN那家伙
过程如下：
1、下载（废话）
2、安装（还是废话）
3、启动ZTZ-IE（……）
4、输入用户名、注册码，
用户名：cracknow
注册码：121212
5、启动TRW2000、BPX HMEMCPY
6、按确定，被拦截
7、BC *PMODULE，到ZTZ-IE部分（也叫领空）
8、N次F12（N=7 OR N=8）F9
9、一路F10，直到0167：0046C034 CALL 0046BD9C这行，因为这个CALL就是关键
的计算注册码的CALL，F8跟进。为什么这么判断？有经验的看一眼下面有一个
CALL+JNZ，应该就是注册码比较的部分了，没经验的接着F10，等着出错，记
住位置然后下回在进来。
以下为计算注册码的部分，在这之前有判断用户名长度是否大于3的
在这之后就是计算注册码与输入的注册码的对比
0167:0046BDE4 MOV EBX,01 初始化EBX=1
0167:0046BDE9 MOV ECX,EBX ECX=EBX
0167:0046BDEB IMUL ECX,EBX ECX*=EBX
0167:0046BDEE MOV EAX,ECX EAX=ECX
0167:0046BDF0 IMUL EBX EAX*=EBX
0167:0046BDF2 LEA EDX,[EBX+14] EDX=EBX+0X14
0167:0046BDF5 MOV EDI,EDX EDI=EDX
0167:0046BDF7 CDQ
0167:0046BDF8 IDIV EDI EAX/=EDI，EDX=EAX%EDI
0167:0046BDFA MOV EDI,EDX EDI=EDX
0167:0046BDFC MOV EAX,ECX EAX=ECX
0167:0046BDFE LEA EDX,[EBX+0A] EDX+=EBX+0XA
0167:0046BE01 MOV ECX,EDX ECX=EDX
0167:0046BE03 CDQ
0167:0046BE04 IDIV ECX EAX/=ECX，EDX=EAX%ECX
0167:0046BE06 ADD EDI,EDX EDI+=EDX
0167:0046BE08 MOV EAX,EDI EAX=EDI
0167:0046BE0A MOV EDX,EBX EDX=EBX
0167:0046BE0C ADD EDX,EDX EDX+=EDX
0167:0046BE0E ADD EAX,EDX EAX+=EDX
0167:0046BE10 ADD EAX,BYTE +08 EAX+=8
0167:0046BE13 MOV EDX,[EBP-0C]
0167:0046BE16 MOVZX EDX,BYTE [EDX+EBX-01] EDX=STRING[i]
0167:0046BE1B ADD EAX,EDX EAX+=EDX
0167:0046BE1D CMP EAX,BYTE +7A -------------|
0167:0046BE20 JNG 0046BE2A |
0167:0046BE22 SUB EAX,BYTE +0A |
0167:0046BE25 CMP EAX,BYTE +7A |
0167:0046BE28 JG 0046BE22 |
0167:0046BE2A CMP EAX,BYTE +61 |------>比较EAX是否在'a'~'z'之间，大于每次减10
0167:0046BE2D JNL 0046BE37 | 小于每次加10直到EAX在'a'~'z'之间
0167:0046BE2F ADD EAX,BYTE +0A |
0167:0046BE32 CMP EAX,BYTE +61 |
0167:0046BE35 JL 0046BE2F --------------|
0167:0046BE37 MOV [EBP-15],AL
0167:0046BE3A LEA EAX,[EBP-1C]
0167:0046BE3D MOV DL,[EBP-15]
0167:0046BE40 CALL 00403D14
0167:0046BE45 MOV EDX,[EBP-1C]
0167:0046BE48 LEA EAX,[EBP-10]
0167:0046BE4B CALL 00403DF4
0167:0046BE50 INC EBX EBX++
0167:0046BE51 DEC ESI ESI--(ESI中为用户名长度)
0167:0046BE52 JNZ 0046BDE9
0167:0046BE54 MOV EAX,[EBP-10]
0167:0046BE57 CALL 00403DEC
0167:0046BE5C CMP EAX,BYTE +0A 比较生成注册码长度是否<10
0167:0046BE5F JNL NEAR 0046BEE9 >=则跳
0167:0046BE65 MOV EAX,[EBP-10]
0167:0046BE68 CALL 00403DEC 求用户名长度的CALL
0167:0046BE6D PUSH EAX
0167:0046BE6E MOV EAX,0A
0167:0046BE73 POP EDX
0167:0046BE74 SUB EAX,EDX 10-用户名长度
0167:0046BE76 MOV ESI,EAX
0167:0046BE78 TEST ESI,ESI
0167:0046BE7A JNG 0046BEE9
0167:0046BE7C MOV EBX,01 ------------------|
0167:0046BE81 MOV ECX,EBX |
0167:0046BE83 IMUL ECX,EBX |
0167:0046BE86 MOV EAX,ECX | 和上面的计算注册码的循环类似
0167:0046BE88 IMUL EBX | 作用是如果注册码不足10位补齐
0167:0046BE8A LEA EDX,[EBX+14] | 注册码
0167:0046BE8D MOV EDI,EDX |
0167:0046BE8F CDQ |
0167:0046BE90 IDIV EDI |
0167:0046BE92 MOV EDI,EDX |
0167:0046BE94 MOV EAX,ECX |
0167:0046BE96 LEA EDX,[EBX+0A] |
0167:0046BE99 MOV ECX,EDX |
0167:0046BE9B CDQ |
0167:0046BE9C IDIV ECX |
0167:0046BE9E ADD EDI,EDX |
0167:0046BEA0 MOV EAX,EDI |
0167:0046BEA2 MOV EDX,EBX |
0167:0046BEA4 ADD EDX,EDX |
0167:0046BEA6 ADD EAX,EDX |
0167:0046BEA8 INC EAX | ****这里和上面不一样EAX++
0167:0046BEA9 MOV EDX,[EBP-0C] |
0167:0046BEAC MOVZX EDX,BYTE [EDX+01] | EDX=STRING[1]*********
0167:0046BEB0 ADD EAX,EDX |
0167:0046BEB2 CMP EAX,BYTE +7A |
0167:0046BEB5 JNG 0046BEBF |
0167:0046BEB7 SUB EAX,BYTE +0A |
0167:0046BEBA CMP EAX,BYTE +7A |
0167:0046BEBD JG 0046BEB7 |
0167:0046BEBF CMP EAX,BYTE +61 |
0167:0046BEC2 JNL 0046BECC |
0167:0046BEC4 ADD EAX,BYTE +0A |
0167:0046BEC7 CMP EAX,BYTE +61 |
0167:0046BECA JL 0046BEC4 |
0167:0046BECC MOV [EBP-15],AL |
0167:0046BECF LEA EAX,[EBP-20] |
0167:0046BED2 MOV DL,[EBP-15] |
0167:0046BED5 CALL 00403D14 |
0167:0046BEDA MOV EDX,[EBP-20] |
0167:0046BEDD LEA EAX,[EBP-10] |
0167:0046BEE0 CALL 00403DF4 |
0167:0046BEE5 INC EBX |
0167:0046BEE6 DEC ESI | ESI=10-注册码长度
0167:0046BEE7 JNZ 0046BE81------------------|
0167:0046BEE9 MOV EAX,[EBP-10]----------------|
0167:0046BEEC CALL 00403DEC |
0167:0046BEF1 MOV ESI,EAX |
0167:0046BEF3 TEST ESI,ESI |
0167:0046BEF5 JNG 0046BF23 |
0167:0046BEF7 MOV EBX,01 |注册码倒续
0167:0046BEFC MOV EAX,[EBP-10] |
0167:0046BEFF CALL 00403DEC |
0167:0046BF04 SUB EAX,EBX |
0167:0046BF06 MOV EDX,[EBP-10] |
0167:0046BF09 MOV DL,[EDX+EAX] |
0167:0046BF0C LEA EAX,[EBP-24] |
0167:0046BF0F CALL 00403D14 |
0167:0046BF14 MOV EDX,[EBP-24] |
0167:0046BF17 LEA EAX,[EBP-14] |
0167:0046BF1A CALL 00403DF4 |
0167:0046BF1F INC EBX |
0167:0046BF20 DEC ESI |
0167:0046BF21 JNZ 0046BEFC--------------------|
0167:0046BF23 MOV EAX,[EBP-08]
0167:0046BF26 MOV EDX,[EBP-14]

到这里就差不多了，不过我认为这样生成的注册码实在是没什么意思，生成的注册码
大概也就是从'p'到'z'虽然有<0x61 +0xa但是一般只有输入大写字母或数字符号时才
出现，即使26个字母全出全了，这样的注册码算法也太过简单，建议作者在下个版本
中改进。

后面跟这个的注册机
#include "stdio.h"
main()
{ int c,d,i,eax,ebx,ecx,edx,edi;
unsigned char string[80];
start:printf("********ZTZ-IE 1.8*********\nThis keygen is made by Pretender\nPlease input your name : ");
gets(string);
d=strlen(string);
if(d<4) {printf("Your name must more than 3 letters!!!\n\n");goto start;}
c=string[1];
for(i=0;;i++)
{
ebx=i+1;
if(i>=d) ebx-=d;
ecx=ebx;ecx*=ebx;eax=ecx;eax*=ebx;edi=ebx+0x14;edi=eax%edi;
eax=ecx;edx=ebx+0xa;ecx=edx;edi+=eax%ecx;eax=edi;edx=ebx;
edx+=edx;eax+=edx;
if(i<d) eax+=8,eax+=string[i];
else {if(d>10) {if(i==d) break;}
if(d<=10) {if(i==10) break;}
eax+=1,eax+=c;}
while(eax>0x7a)
eax-=0xa;
while(eax<0x61)
eax+=0xa;
string[i]=eax;
}
printf("Your Register code is : ");
for(;i>=0;i--)
printf("%c",string[i-1]);
printf("\n ***************************** --- --- ---\n *Welcome to WWW.CRACKNOW.COM* / / / --\n ***************************** --- --- --/\n");
}


ZTZ-IE网络浏览器1.

 标 题:加入[BCG]的第一篇破解文章ZTZ-IE网络浏览器1.5破解!!也是本人第一次写破解文章! (4千字)
发信人:yangjunnan
时 间:2001-6-29 19:07:44
详细信息:
加入[BCG]的第一篇破解文章ZTZ-IE网络浏览器1.5破解
软件：ZTZ-IE网络浏览器1.5
功能：一个多窗口浏览器，类似MyIE，比MyIE的浏览速度快，但功能不如MyIE的多，有自己的特殊的功能
软件下地址：http://sd.onlinedown.net/down/ZTZ-IE.zip

破解使用工具：W32DASM 893黄金中文版,FI2.45,hiew640
1.使用FI检测此软件是否加壳，一看，此软件未加壳，是用DELPHI写的!
可以直接用w32dasm来反汇编

2.启动软件,点击帮助-》软件注册，在用户名和密码的框中随便输入
几个数字(但一定要大于等于4位数字，否则会出错的）
单击“确定”后，出现一“警告”的提示，“密码不正确”。
我们可以按确定，然后退出此浏览器

3打开W32DASM，加载ZTZ-IE浏览器的文件ZTZ-IE.exe,之后，按下 参考-》串式参考
然后查找上面看到的出错提示框：我们找到这一行"密码不正确"双击它

看到以下代码：
* Possible StringData Ref from Code Obj ->"警告"
|
:0046B69A B94CB74600 mov ecx, 0046B74C

* Possible StringData Ref from Code Obj ->"密码不正确！"
|
:0046B69F BA54B74600 mov edx, 0046B754
:0046B6A4 A15C514700 mov eax, dword ptr [0047515C]
:0046B6A9 8B00 mov eax, dword ptr [eax]
:0046B6AB E8E40BFEFF call 0044C294
:0046B6B0 A11C694700 mov eax, dword ptr [0047691C]
:0046B6B5 E8F6D7FDFF call 00448EB0

我们往上看，经过比较发现

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046B5DB(C)
|
:0046B616 8D55F8 lea edx, dword ptr [ebp-08]
:0046B619 8B86EC020000 mov eax, dword ptr [esi+000002EC]
:0046B61F E88C25FCFF call 0042DBB0
:0046B624 8B45F8 mov eax, dword ptr [ebp-08]
:0046B627 50 push eax
:0046B628 8D55F0 lea edx, dword ptr [ebp-10]
:0046B62B 8B86E0020000 mov eax, dword ptr [esi+000002E0]
:0046B631 E87A25FCFF call 0042DBB0
:0046B636 8B45F0 mov eax, dword ptr [ebp-10]
:0046B639 8D55F4 lea edx, dword ptr [ebp-0C]
:0046B63C E863FDFFFF call 0046B3A4
:0046B641 8B55F4 mov edx, dword ptr [ebp-0C]
:0046B644 58 pop eax
:0046B645 E84288F9FF call 00403E8C--> 这里CALL进去，比较注册码,在这用trw200下断点敲F8进入,得到的
用户名：yangjunnan 密码：vzztwruuyq

:0046B64A 7533 jne 0046B67F---->这里就是要改的地方，不相等则跳到，直接nop掉它即可
:0046B64C BA0B000000 mov edx, 0000000B

* Possible StringData Ref from Code Obj ->"Yire"
|
:0046B651 B824B74600 mov eax, 0046B724
:0046B656 E839250000 call 0046DB94
:0046B65B 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"祝贺你"
|
:0046B65D B92CB74600 mov ecx, 0046B72C

* Possible StringData Ref from Code Obj ->"密码正确，注册成功！"
|
:0046B662 BA34B74600 mov edx, 0046B734
:0046B667 A15C514700 mov eax, dword ptr [0047515C]
:0046B66C 8B00 mov eax, dword ptr [eax]
:0046B66E E8210CFEFF call 0044C294
:0046B673 A11C694700 mov eax, dword ptr [0047691C]
:0046B678 E833D8FDFF call 00448EB0
:0046B67D EB3B jmp 0046B6BA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046B64A(C)
|
:0046B67F A180524700 mov eax, dword ptr [00475280]
:0046B684 83381E cmp dword ptr [eax], 0000001E
:0046B687 7C0F jl 0046B698
:0046B689 BA01000000 mov edx, 00000001

* Possible StringData Ref from Code Obj ->"Yire"
|
:0046B68E B824B74600 mov eax, 0046B724
:0046B693 E8FC240000 call 0046DB94

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046B687(C)
|
:0046B698 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"警告"
|
:0046B69A B94CB74600 mov ecx, 0046B74C

* Possible StringData Ref from Code Obj ->"密码不正确！"
|
:0046B69F BA54B74600 mov edx, 0046B754
:0046B6A4 A15C514700 mov eax, dword ptr [0047515C]
:0046B6A9 8B00 mov eax, dword ptr [eax]
:0046B6AB E8E40BFEFF call 0044C294
:0046B6B0 A11C694700 mov eax, dword ptr [0047691C]
:0046B6B5 E8F6D7FDFF call 00448EB0

总结：
只要用hiew640，修改文件：
0046B64A 7533 ->9090 即可破解成功!!

用户名：yangjunnan 密码：vzztwruuyq

破解者：yangjunnan Email:nccqy@163.com OICQ:3597625


背单词2.0

标 题:轻松注册不知不觉背单词2.0 (586字)
发信人:Wrong
时 间:2001-1-1 10:59:57
详细信息:
在破解不知不觉背单词时，我总是找不到它的注册码（请恕在下水平实在有限），总是用TRW跳过注册检测直接注册。但是每次重做机子都必须用TRW跟踪，有点麻烦。后来无意居然发现，它居然判定你是否注册，是查看你windows\system\下面有没有Mkrnl57.dll（注意57前面是英文字母L,可别搞错)，好了，这下简单了，只有在windows\system下建一个零字节的文件Mkrnl57.dll,再注册，哈哈，你已经是注册用户了。我今天重装机子，马上试了一下，OK，连不知不觉都不用关闭就已经是注册用户了。

我知道这样类似的文件是否已经有人发表，但这是我自己发现的，可没有抄袭，我非常乐意交破解的朋友，看雪学院是我的师父，我很感谢他教会我破解软件.

标 题:代码端，注册码计算为单一的计算，如果花点时间，很容易看懂的，注册机也很容易得到 (4千字)
发信人:chn-boy
时 间:2001-1-1 13:18:05
详细信息:

第一处：下中断 —— bpx 4142bc do "t; do *eax" 在数据窗口里你看到的是你的用户号

:004142BC 8D45FC lea eax, dword ptr [ebp-04]
:004142BF E8B8E0FEFF call 0040237C
:004142C4 8945BC mov dword ptr [ebp-44], eax
:004142C7 33D2 xor edx, edx
:004142C9 8955B8 mov dword ptr [ebp-48], edx
:004142CC 33C9 xor ecx, ecx
:004142CE 894DB4 mov dword ptr [ebp-4C], ecx
:004142D1 EB10 jmp 004142E3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004142EF(C)
|
:004142D3 8B45BC mov eax, dword ptr [ebp-44]
:004142D6 8B55B4 mov edx, dword ptr [ebp-4C]
:004142D9 0FBE0C10 movsx ecx, byte ptr [eax+edx]
:004142DD 014DB8 add dword ptr [ebp-48], ecx
:004142E0 FF45B4 inc [ebp-4C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004142D1(U)
|
:004142E3 8D45FC lea eax, dword ptr [ebp-04]
:004142E6 E869990800 call 0049DC54
:004142EB 48 dec eax
:004142EC 3B45B4 cmp eax, dword ptr [ebp-4C]
:004142EF 7FE2 jg 004142D3
:004142F1 DB45B8 fild dword ptr [ebp-48]
:004142F4 83C4F8 add esp, FFFFFFF8
:004142F7 DD1C24 fstp qword ptr [esp]
:004142FA E81D2B0800 call 00496E1C
:004142FF 83C408 add esp, 00000008
:00414302 D805C4444100 fadd dword ptr [004144C4]
:00414308 D83DC4444100 fdivr dword ptr [004144C4]
:0041430E DD9D70FFFFFF fstp qword ptr [ebp+FFFFFF70]
:00414314 6800804C40 push 404C8000
:00414319 6A00 push 00000000
:0041431B E87C2F0800 call 0049729C
:00414320 83C408 add esp, 00000008
:00414323 DCBD70FFFFFF fdivr qword ptr [ebp+FFFFFF70]
:00414329 D95DB0 fstp dword ptr [ebp-50]
:0041432C 66C745D80800 mov [ebp-28], 0008
:00414332 D945B0 fld dword ptr [ebp-50]
:00414335 E8062D0800 call 00497040
:0041433A 898574FFFFFF mov dword ptr [ebp+FFFFFF74], eax
:00414340 DB8574FFFFFF fild dword ptr [ebp+FFFFFF74]
:00414346 D86DB0 fsubr dword ptr [ebp-50]
:00414349 DC0DC8444100 fmul qword ptr [004144C8]
:0041434F E8EC2C0800 call 00497040
:00414354 898570FFFFFF mov dword ptr [ebp+FFFFFF70], eax
:0041435A DB8570FFFFFF fild dword ptr [ebp+FFFFFF70]
:00414360 83C4F8 add esp, FFFFFFF8
:00414363 DD1C24 fstp qword ptr [esp]
:00414366 E8912C0800 call 00496FFC
:0041436B 83C408 add esp, 00000008
:0041436E E8CD2C0800 call 00497040
:00414373 8945AC mov dword ptr [ebp-54], eax
:00414376 8D45F4 lea eax, dword ptr [ebp-0C]
:00414379 E88AD4FEFF call 00401808
:0041437E 8BD0 mov edx, eax
:00414380 FF45E4 inc [ebp-1C]
:00414383 8B4DC4 mov ecx, dword ptr [ebp-3C]
:00414386 8B81C8030000 mov eax, dword ptr [ecx+000003C8]
:0041438C E83B010500 call 004644CC
:00414391 8D55F4 lea edx, dword ptr [ebp-0C]

第二处：下中断 —— bpx 414394 do "d *edx" 你输入的Virtual Code
:00414394 52 push edx
:00414395 66C745D82000 mov [ebp-28], 0020
:0041439B 8D45F8 lea eax, dword ptr [ebp-08]
:0041439E E865D4FEFF call 00401808
:004143A3 8BD0 mov edx, eax
:004143A5 FF45E4 inc [ebp-1C]
:004143A8 8B45AC mov eax, dword ptr [ebp-54]
:004143AB E8906B0700 call 0048AF40
:004143B0 8D45F8 lea eax, dword ptr [ebp-08]

第三处：下中断 —— bpx 4143b3 do "d *eax" 正确的注册码

:004143B3 5A pop edx
:004143B4 E8F7970800 call 0049DBB0
:004143B9 50 push eax
:004143BA FF4DE4 dec [ebp-1C]
:004143BD 8D45F4 lea eax, dword ptr [ebp-0C]
:004143C0 BA02000000 mov edx, 00000002
:004143C5 E802970800 call 0049DACC
:004143CA FF4DE4 dec [ebp-1C]
:004143CD 8D45F8 lea eax, dword ptr [ebp-08]
:004143D0 BA02000000 mov edx, 00000002
:004143D5 E8F2960800 call 0049DACC
:004143DA 59 pop ecx

第四处： 下中断 —— bpx 4143db 如果CL中的值为1，那么注册成功
:004143DB 84C9 test cl, cl
:004143DD 0F8482000000 je 00414465
:004143E3 6A32 push 00000032

标 题:bpx 4142bc do "t; do *eax; "的意思就是： (234字)
发信人:chn-boy
详细信息:

在4142bc处中断后，运行引号中的语句，这个句话"t; d *eax;"
等同于你在4142bc中断跳出时，手动输入两条命令t和d *eax

d *eax其实就是d [EAX]（只是不能这么写，[EAX]中的内容你可以用
d eax看到），而要写成d *eax，*符号跟C里面的指针类似。


冰盾IV

 标 题:破解冰盾IV (2千字)
发信人:TAE!
时 间:2001-6-23 1:04:36
详细信息:
软件名称：冰盾IV
破解人：TAE！[BCG] TAE[FCG]
保护方法：注册码
简介：一个安全工具！

前面步骤不在复述，应该不难跟踪至以下程序段。

:004036E0 56 push esi
:004036E1 57 push edi
:004036E2 8BF1 mov esi, ecx
:004036E4 6A01 push 00000001
:004036E6 E8456E0100 call 0041A530
:004036EB 8B4664 mov eax, dword ptr [esi+64]
:004036EE 50 push eax
:004036EF E839820000 call 0040B92D \\该call将你的注册申请码转换为数值型
:004036F4 8BF8 mov edi, eax \\保存到edi
:004036F6 8B4660 mov eax, dword ptr [esi+60]
:004036F9 50 push eax
:004036FA E82E820000 call 0040B92D \\将输入得注册码转换为数值型并放入eax
:004036FF 8B4E5C mov ecx, dword ptr [esi+5C]\\将一个数放入ecx
:00403702 33C7 xor eax, edi \\eax和edi异或
:00403704 83C408 add esp, 00000008
:00403707 3BC1 cmp eax, ecx \\比较异或后的数是不是等于ecx
:00403709 7523 jne 0040372E \\是就注册成功，否则就。。。
:0040370B 8BCE mov ecx, esi
:0040370D E83E000000 call 00403750
:00403712 85C0 test eax, eax
:00403714 7426 je 0040373C
:00403716 6A00 push 00000000
:00403718 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"恭喜您注册成功!"
|
:0040371A 6884F44200 push 0042F484
:0040371F E842BE0100 call 0041F566
:00403724 8BCE mov ecx, esi
:00403726 E84C950100 call 0041CC77
:0040372B 5F pop edi
:0040372C 5E pop esi
:0040372D C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403709(C)
|
:0040372E 6A00 push 00000000
:00403730 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册失败!"
|
:00403732 6878F44200 push 0042F478
:00403737 E82ABE0100 call 0041F566

本文是我破解完成以后写的，由于不知该软件将注册标记放入哪里，不能重复注册，所以有疏漏的地方请大家提出！


冰河2.2

 标 题:搞定冰河2.2(ducksun专版)的通用密码
发信人:zombieys
时 间:2000-12-22 22:00:45
详细信息:
首先祝各位元旦/圣诞节快乐:)。冰河是一个很有名的远程控制程序，作者：黄鑫。这种东西使用起来很方便，用它来搞免费账号很轻松啦^-^，不过大部分都被加了密码。可是好像所有的远程控制程序都有通用密码，sub-7等,冰河也有。
我们开始。bh2.0开始都用upx压缩过，我们需要的是它的服务器端程序G_Server.exe。先脱壳，接着用w32dsm反汇编它，在'裁判'-'串式数据参考'选择'口令有误，拒绝执行命令'并双击它，记下地址413d54。然后用冰河配置一下sever程序，不让它干太多事，执行sever程序G_Server.exe(对了，要先中冰河xixi,舍不得孩子，套不着狼呀)。在冰河中添加主机127.0.0.1并加一个密码,进s-ice，下bpx getsysteminfo,在命令控制台-口令类命令-系统信息及口令里点击系统信息，立刻被栏到(我为什么下bpx getsysteminfo,因为反汇编时看到有这个调用，我为什么知道这个命令是管系统信息的，因为它的意思就是么),按几下f12就来到G_Server的地盘，下bpx 413d54,按f5退出来。点127.0.0.1立刻被拦到，然后很轻松就的到了它的通用密码，竟然有22位呀，别问我密码，我不想当坏人，我只想讨论一下如何得到这个通用密码。至于谁拿通用密码干什么与我无关啦。再会！！！
标 题:回答问题喽 (142字)
发信人:zombieys
时 间:2001-1-4 20:40:10
详细信息:
保证winice.dat中有这句EXP=c:\windows\system\advapi32.dll才能下bpx getsysteminfo,仔细看教程！！！
sever程序是upx压缩的，先脱壳然后反汇编！！！


博奥彩票

 标 题:博奥彩票分析软件 (1千字)
发信人:tac
时 间:2000-12-27 20:06:33
详细信息:
先申明一点，这是我破的第一个软件，当真是辛苦，第一次就要打大老虎。关键地方还是要感谢TOYE兄。不过现在好多了。
破解过程：
先启动博奥软件，选择注册码方式，输入：78787878，然后运行TRW2000。
下bpx hmemcpy
g
返回到软件注册窗口，点击注册。被TRW拦截
按F12键14次，来到：
54e252 lea,edx,[ebp-4]
下DD EDX
在数据窗口看到：
xxx:54e252 xxxxxxxx xxxxxxxx xxxxxxxxxx xxxxxxxxxx
^^^^^^^^---正确注册码存放地址。
再下命令：D xxxxxxxx就可看到正确的注册码了。
PS：1、这个软件的注册码在不同的机器上不同，我的机器上是17位，另一台机器上是15位。或者说15位也可以注册成功。
2、在数据窗口有时会看见：xxxxxxxxxOEMxxxxxxx,这是该软件根据你的鸡操作系统的序列号生成的一个序列号，注册时在软件注册窗口也会出现该号。千万不要将你找来的注册码加在这串序列号之后输入（我吃了大苦头）
将之全部删去，然后输入你找到的注册码即可。
3、脱壳可使用unpetite，PRODUMP脱壳不正确，不过使用TRW方式，脱不脱壳无所谓。上文作者确实仔细，该软件在WINDOWS\SYSTEM\中添加两个文件：FDKEY.DLL,但是这两个文件是用于钥匙盘的注册方式（FloppyKEY)。对注册码方式无所谓。
4、如果每次跟踪时，内存中的注册码是不断改变的，说明跟踪不正确。
5、该软件有三个版本：RT00011.exe rtsetup.exe rt00012.exe表现在内存地址不同，上文中的地址中的是第二个，地址与我文中的一样，但是注册后：陆氏观台无法使用（程序问题？注册码问题？）。
再次感谢TOYE的无私帮助，我是看者你的教程成长起来的。


博奥彩票

标 题:博奥彩票分析系统千禧版破解实录 (1千字)
发信人:coolfly
时 间:2000-12-30 0:00:37
详细信息:
破解软件：博奥彩票分析系统千禧版
下载URL：http://www.boao.com.cn/lottery/download/rtsetup.exe
软件大小：3594531 byte

分析：该软件也是注册码保护。每次启动时调用：c:\program file\rotate\rotate.ini
文件中输入的注册码是否正确？

启动TRW，打开：帮助=》注册=》注册码，你会看见注册框里有随机码如下：
79879967780002577-
把它们删除掉，然后输入'79797979'，因为我们要使用79大法了。
下中断：bpx hmemcpy,被中断后，开始按F10 跟踪，一直按到此：
15F:54E266 CALL 66AF08
15F:54E26B POP ECX
15F:54E26C TEST CL,CL
15F:54E26E JZ 54E51E
当CL为0时，则跳走，也就是注册会失败。所以从此处抬头望青天，见到什么，对：
15F:54E24F LEA EAX,[EBP-40]
15F:54E252 LEA EDX,[EBP-04]
15F:54E255 CALL 66AFEC =>按F8键进入此CALL观摩！
============================
15F:66AFEC PUSH EBP
15F:66AFED MOV EBP,ESP
15F:66AFEF PUSH EBX
15F:66AFF0 MOV EAX,[EAX] =>用D命令可以看见什么，好熟悉，对是79797979
15F:66AFF2 MOV EDX,[EDX] =>用D命令可以看见真正的注册码了，
赶快用笔记下来吧：5484-8430-1111-578

OK，破解完工！耗时5分钟，1分钟整理！
2000年12月29日 19:54
coolfly
http://coolfly.126.com


卜算子_权谋个人彩票分析助理软件V6.00

 标 题:《卜算子_权谋个人彩票分析助理软件》V6.00的破解 (2千字)
发信人:李海涛
时 间:2001-5-13 16:06:44
详细信息:
《卜算子_权谋个人彩票分析助理软件》V6.00的破解

软件名称：《卜算子_权谋个人彩票分析助理软件》V6.00
软件来源： 新双龙工作室（www.lifeok.com）
下载地址： http://software.wx88.net/down/quanmou.zip
软件简介：《卜算子_权谋个人彩票分析助理软件》V6.00，是国内功能最强的一套彩票
软件，是为精通概率论的高级用户而量身打造的，为他们节约大量的计算和分析时间。
普通用户在不了解这些参数的情况下，完全可以依据其它功能和参数完成选号（当然，
作者不反对阁下参阅有关资料来加深对概率学的理解）。因此，不论是初学者或高级用
户，卜算子都能适合您的胃口。‘高可成，低可就’是我们永远追求的信仰！

【声明】

我写这篇文章是以技术交流为主，希望大家在转载时能保持文章的完整性。

作 者：李海涛
邮箱地址：lihaitao@pub.xaonline.com
破解日前：2001年5月13日
破解工具：1、Trw2000 1.23 注册版
2、W32Dasm 8.93 超级中文版

分 析：

* Possible StringData Ref from Code Obj ->"酦?檉??"
|
:0073039F 683CFF4200 push 0042FF3C
:007303A4 57 push edi
:007303A5 50 push eax

* Reference To: MSVBVM60.__vbaHresultCheckObj, Ord:0000h
|
:007303A6 FF1580104000 Call dword ptr [00401080]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00730398(C)
|
:007303AC 8B55D8 mov edx, dword ptr [ebp-28] D EDX 你输入的注册码。
:007303AF 8B4638 mov eax, dword ptr [esi+38] D EAX 真的注册码！快抄！！！
:007303B2 52 push edx
:007303B3 50 push eax

:
:
:

* Reference To: MSVBVM60.__vbaFreeObjList, Ord:0000h
|
:007303F3 FF155C104000 Call dword ptr [0040105C]
:007303F9 83C418 add esp, 00000018
:007303FC 663BFB cmp di, bx
:007303FF 0F84E5030000 je 007307EA 一跳就玩完！！！
改：909090909090 修改此处后，程序会将正确的注册码写入注册表（不就成了任意注册版了！！！）
[HKEY_USERS\.DEFAULT\Software\VB and VBA Program Settings\QMFT\Code]
"Key"="EricGO"
"Name"="注册"

:00730405 8B0E mov ecx, dword ptr [esi]
:00730407 56 push esi
:00730408 FF91B4020000 call dword ptr [ecx+000002B4]
:0073040E 3BC3 cmp eax, ebx
:00730410 DBE2 fclex
:00730412 7D12 jge 00730426
:00730414 68B4020000 push 000002B4

对了！注册表
[HKEY_USERS\.DEFAULT\Software\VB and VBA Program Settings\QMFT\Times]
"Times"="0"
是程序运行次数的标志。
完成时间

2001.5.13


财智家庭理财2001

 标 题:财智家庭理财2001,转贴以前的一贴，另外加点新的办法。 (8千字)
发信人:hsf
时 间:2001-5-11 21:11:59
详细信息:
这些是判断注册成功与否的关键代码：
===============================================================================
:00515AFF E854F8FFFF call 00515358 执行一个判断，返回al的值
:00515B04 84C0 test al, al ---->al=1 则正确，al=0 则错误
:00515B06 744F je 00515B57 ----->al=1则不跳，al=0 则跳到错误处理
:00515B08 A170A86000 mov eax, dword ptr [0060A870] |
:00515B0D 8B00 mov eax, dword ptr [eax] | 正
:00515B0F 8B55FC mov edx, dword ptr [ebp-04] |
:00515B12 E81183FAFF call 004BDE28 | 确
:00515B17 6A00 push 00000000 |
:00515B19 668B0DA45B5100 mov cx, word ptr [00515BA4] | 时
:00515B20 B202 mov dl, 02 |
:00515B22 B8B05B5100 mov eax, 00515BB0 | 的
:00515B27 E8B895F4FF call 0045F0E4 |
:00515B2C 8D832C030000 lea eax, dword ptr [ebx+0000032C] | 流
:00515B32 8B55FC mov edx, dword ptr [ebp-04] |
:00515B35 E8D6E4EEFF call 00404010 | 程
:00515B3A 8BC3 mov eax, ebx |
:00515B3C E823FCFFFF call 00515764 |
:00515B41 C783300300000F270000 mov dword ptr [ebx+00000330], 0000270F |
:00515B4B C7833402000001000000 mov dword ptr [ebx+00000234], 00000001 |
:00515B55 EB2A jmp 00515B81 |--->避开错误处理
跳到公共的结尾
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00515B06(C)
:00515B57 6A00 push 00000000 *
:00515B59 668B0DA45B5100 mov cx, word ptr [00515BA4] * 错
:00515B60 B201 mov dl, 01 *
:00515B62 B8CC5B5100 mov eax, 00515BCC * 误
:00515B67 E87895F4FF call 0045F0E4 *
:00515B6C 8B93F4020000 mov edx, dword ptr [ebx+000002F4] * 处
:00515B72 8BC3 mov eax, ebx *
:00515B74 E8FFBBF3FF call 00451778 * 理
:00515B79 33C0 xor eax, eax *
:00515B7B 898334020000 mov dword ptr [ebx+00000234], eax *
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00515AE8(C), :00515B55(U)
:00515B81 33C0 xor eax, eax >>>>>>公共的结尾部分
:00515B83 5A pop edx
:00515B84 59 pop ecx
:00515B85 59 pop ecx
:00515B86 648910 mov dword ptr fs:[eax], edx
/////////////////////// CALL 515358 START /////////////////////////////
* Referenced by a CALL at Addresses:
|:005157E0 , :00515AFF , :00515C24
:00515358 55 push ebp
:00515359 8BEC mov ebp, esp
:0051535B 6A00 push 00000000
:0051535D 6A00 push 00000000
:0051535F 6A00 push 00000000
:00515361 53 push ebx
:00515362 8945FC mov dword ptr [ebp-04], eax
:00515365 8B45FC mov eax, dword ptr [ebp-04]
:00515368 E883F0EEFF call 004043F0
:0051536D 33C0 xor eax, eax
:0051536F 55 push ebp
:00515370 68CD535100 push 005153CD
:00515375 64FF30 push dword ptr fs:[eax]
:00515378 648920 mov dword ptr fs:[eax], esp
:0051537B 8D45F4 lea eax, dword ptr [ebp-0C]
:0051537E E831FFFFFF call 005152B4
:00515383 8B45F4 mov eax, dword ptr [ebp-0C]
:00515386 8D55F8 lea edx, dword ptr [ebp-08]
:00515389 E846FFFFFF call 005152D4
:0051538E 8B45F8 mov eax, dword ptr [ebp-08]
:00515391 E8FAFCFFFF call 00515090 ----> 此处d eax 可看到 真正的注册码
:00515396 8BD8 mov ebx, eax ----> 结果eax=27897,并把结果存入ebx
:00515398 8B45FC mov eax, dword ptr [ebp-04]
:0051539B E8F0FCFFFF call 00515090 ----> 此处d eax 可看到 你输入的注册码
:005153A0 85C0 test eax, eax ---->错误时 eax=0, 正确时eax=27897
:005153A2 7504 jne 005153A8 --->错误时不跳，Eax＞0时跳走。
:005153A4 33DB xor ebx, ebx --->出错了!!! 将ebx清零!!!
:005153A6 EB0A jmp 005153B2 ---->跳到公共的结尾
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005153A2(C)
:005153A8 3BC3 cmp eax, ebx ---->eax与Ebx比较，相等则为正确
:005153AA 7504 jne 005153B0 ---->不相等就跳走。
:005153AC B301 mov bl, 01 ---->把ebx的低位置为01
:005153AE EB02 jmp 005153B2 ---->直接跳到公共的结尾5153b2，(ebx 不清零)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005153AA(C)
:005153B0 33DB xor ebx, ebx ----->出错了就来到这里将ebx清零!!!
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005153A6(U), :005153AE(U)
:005153B2 33C0 xor eax, eax
:005153B4 5A pop edx
:005153B5 59 pop ecx
:005153B6 59 pop ecx
:005153B7 648910 mov dword ptr fs:[eax], edx
:005153BA 68D4535100 push 005153D4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005153D2(U)
:005153BF 8D45F4 lea eax, dword ptr [ebp-0C]
:005153C2 BA03000000 mov edx, 00000003
:005153C7 E814ECEEFF call 00403FE0
:005153CC C3 ret
:005153CD E966E6EEFF jmp 00403A38
:005153D2 EBEB jmp 005153BF
:005153D4 8BC3 mov eax, ebx
:005153D6 5B pop ebx
:005153D7 8BE5 mov esp, ebp
:005153D9 5D pop ebp
:005153DA C3 ret ----------->回到00515B04，结束这个CALL
/////////////////////////////CALL 00515358 END /////////////////////
注意到CALL00515358里的流程为先用正确的注册码做运算，得到eax 的值，
并存入ebx 内。再用输入的注册码做运算，得到eax 的值，第一个判断 eax=0？？？
等于0 则为错误，出错后就把ebx 清零。第二个判断 eax=ebx？？？不等于则为
错误，出错后就把ebx 清零。相等则为正确，并把ebx 的低位置为01可见：005153A4
33DB xor ebx， ebx和：005153A6 EB0A jmp 005153B2这两句在正确时不用，可
以把它改为自己想要的语句。考虑到下一句语句就是比较 eax和ebx 的值：005153A8
3BC3 cmp eax， ebx所以把这两句改为：005153A4 33DB （改为8BC3） xor ebx，
ebx 改为 mov eax，ebx ——> 把Ebx 的值赋给eax ：005153A6 EB0A （改为9090）
即把jmp 005153B2改为 nop | ____\ 把这句给空掉
nop | / 如果第一个判断的结果为
正确，则走正确的流程，如果不正确，则把ebx 的值赋给eax.这样一来，不管第
一个判断的结果是否正确，流程都要到比较eax 和ebx 是否相等这一句。而且由
于ebx 的值赋给了eax ，这样eax 恒等于ebx ，第二个判断的结果总为正确。于
是无论你输入的注册码是否正确，程序都将判断它是正确的。结果就是注册成功！！！！
呵呵呵：- ）
分析完毕，做最后的工作，用ultraEdit 或winHex把MoneyHome.exe 打开，
查找十六进制串“85 C0 75 04 55 DB EB 0A 3B C3 75 04 ”改为：“85C0 75
04 8B C3 90 90 3B C3 75 04”
******************************************
还有一个更简单的办法。修改第二个CALL00515090 的入口参数。
你不是把错误的注册码放进去作运算吗？？？那我就把正确的注册码放进去作运算，行吧，这样，下面的代码都不必改了。只要把8B45FC改为8B45F8就成了。只要改一个字节就成了。
这是我在第二次看这个软件的破解进想到的。当初是想把这个照这个改
看能不能让程序算出正确的注册码写到注册表里，结果不能。但这样改比原来的改法要好一些，精炼一点嘛。
小功告成，打个KISS! hsF 05112001
******************************************

运行修改后的程序，天，直接进入了主界面，都
不显示注册窗口。点“帮助”——> “注册财智家庭理财”显示“你已经是注册
用户。”但“注册码：”一栏是空的，而且还有“稍后注册”的按钮。随便填入
一个注册码，按“完成注册”，提示“祝贺你！注册成功”。再点“帮助”——
> “注册财智家庭理财”显示“你已经是注册用户。”且“注册码：”一栏为你
刚输入的字符，而且“稍后注册”的按钮已消失。如不输入注册码而直接按“完
成注册”，也会提示“祝贺你！注册成功”。但注册窗口还是维持原样。
OK！大功告成，打个Kiss！！！ #@@^^#@@#^^……呵呵呵……：- ）


财智家庭理财2001

标 题:财智家庭理财2001注册方法 (8千字)
发信人:hsFang
时 间:2001-2-10 2:36:05
详细信息:
Crack MoneyHome 之笔记
我很喜欢财智家庭理财这个软件，在网上下了它的最新版v3.10 注册版，我
还以为是已注册版，没想到是要注册版，下载的几个注册机都不支持这个最新版。
一打开它，便跳出注册窗口，提示你“本软件是付费注册软件，注册费50元，免
费试用期45天，您还可使用XX天”，虽然可以按“稍后注册”进入主界面，但这
样多烦呀。而且，如果超过45天后，按“稍后注册”就会退出程序。其实这个软
件也够好心的啦，它还提示你如何延期使用：“可将您的计算机系统时间调整到
软件安装起的45日内”。不过，这是个财会软件哪，乱改时间怎么能用来记账？？？
左思右想，还是自己动手把它Crack 掉算了。拿着TRW2000 和W32DSM两把利刃，
还有UltraEdit 这把宝刀，花了两天的功夫（我第一次破解软件，当然是会比较
慢，不过也太慢了吧？？），终于完成了。现整理如下：
这些是判断注册成功与否的关键代码：
===============================================================================
:00515AFF E854F8FFFF call 00515358 执行一个判断，返回al的值
:00515B04 84C0 test al, al ---->al=1 则正确，al=0 则错误
:00515B06 744F je 00515B57 ----->al=1则不跳，al=0 则跳到错误处理
:00515B08 A170A86000 mov eax, dword ptr [0060A870] |
:00515B0D 8B00 mov eax, dword ptr [eax] | 正
:00515B0F 8B55FC mov edx, dword ptr [ebp-04] |
:00515B12 E81183FAFF call 004BDE28 | 确
:00515B17 6A00 push 00000000 |
:00515B19 668B0DA45B5100 mov cx, word ptr [00515BA4] | 时
:00515B20 B202 mov dl, 02 |
:00515B22 B8B05B5100 mov eax, 00515BB0 | 的
:00515B27 E8B895F4FF call 0045F0E4 |
:00515B2C 8D832C030000 lea eax, dword ptr [ebx+0000032C] | 流
:00515B32 8B55FC mov edx, dword ptr [ebp-04] |
:00515B35 E8D6E4EEFF call 00404010 | 程
:00515B3A 8BC3 mov eax, ebx |
:00515B3C E823FCFFFF call 00515764 |
:00515B41 C783300300000F270000 mov dword ptr [ebx+00000330], 0000270F |
:00515B4B C7833402000001000000 mov dword ptr [ebx+00000234], 00000001 |
:00515B55 EB2A jmp 00515B81 |--->避开错误处理
跳到公共的结尾
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00515B06(C)
:00515B57 6A00 push 00000000 *
:00515B59 668B0DA45B5100 mov cx, word ptr [00515BA4] * 错
:00515B60 B201 mov dl, 01 *
:00515B62 B8CC5B5100 mov eax, 00515BCC * 误
:00515B67 E87895F4FF call 0045F0E4 *
:00515B6C 8B93F4020000 mov edx, dword ptr [ebx+000002F4] * 处
:00515B72 8BC3 mov eax, ebx *
:00515B74 E8FFBBF3FF call 00451778 * 理
:00515B79 33C0 xor eax, eax *
:00515B7B 898334020000 mov dword ptr [ebx+00000234], eax *
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00515AE8(C), :00515B55(U)
:00515B81 33C0 xor eax, eax >>>>>>公共的结尾部分
:00515B83 5A pop edx
:00515B84 59 pop ecx
:00515B85 59 pop ecx
:00515B86 648910 mov dword ptr fs:[eax], edx
/////////////////////// CALL 515358 START /////////////////////////////
* Referenced by a CALL at Addresses:
|:005157E0 , :00515AFF , :00515C24
:00515358 55 push ebp
:00515359 8BEC mov ebp, esp
:0051535B 6A00 push 00000000
:0051535D 6A00 push 00000000
:0051535F 6A00 push 00000000
:00515361 53 push ebx
:00515362 8945FC mov dword ptr [ebp-04], eax
:00515365 8B45FC mov eax, dword ptr [ebp-04]
:00515368 E883F0EEFF call 004043F0
:0051536D 33C0 xor eax, eax
:0051536F 55 push ebp
:00515370 68CD535100 push 005153CD
:00515375 64FF30 push dword ptr fs:[eax]
:00515378 648920 mov dword ptr fs:[eax], esp
:0051537B 8D45F4 lea eax, dword ptr [ebp-0C]
:0051537E E831FFFFFF call 005152B4
:00515383 8B45F4 mov eax, dword ptr [ebp-0C]
:00515386 8D55F8 lea edx, dword ptr [ebp-08]
:00515389 E846FFFFFF call 005152D4
:0051538E 8B45F8 mov eax, dword ptr [ebp-08]
:00515391 E8FAFCFFFF call 00515090 ----> 此处d eax 可看到 真正的注册码
:00515396 8BD8 mov ebx, eax ----> 结果eax=27897,并把结果存入ebx
:00515398 8B45FC mov eax, dword ptr [ebp-04]
:0051539B E8F0FCFFFF call 00515090 ----> 此处d eax 可看到 你输入的注册码
:005153A0 85C0 test eax, eax ---->错误时 eax=0, 正确时eax=27897
:005153A2 7504 jne 005153A8 --->错误时不跳，Eax＞0时跳走。
:005153A4 33DB xor ebx, ebx --->出错了!!! 将ebx清零!!!
:005153A6 EB0A jmp 005153B2 ---->跳到公共的结尾
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005153A2(C)
:005153A8 3BC3 cmp eax, ebx ---->eax与Ebx比较，相等则为正确
:005153AA 7504 jne 005153B0 ---->不相等就跳走。
:005153AC B301 mov bl, 01 ---->把ebx的低位置为01
:005153AE EB02 jmp 005153B2 ---->直接跳到公共的结尾5153b2，(ebx 不清零)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005153AA(C)
:005153B0 33DB xor ebx, ebx ----->出错了就来到这里将ebx清零!!!
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005153A6(U), :005153AE(U)
:005153B2 33C0 xor eax, eax
:005153B4 5A pop edx
:005153B5 59 pop ecx
:005153B6 59 pop ecx
:005153B7 648910 mov dword ptr fs:[eax], edx
:005153BA 68D4535100 push 005153D4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005153D2(U)
:005153BF 8D45F4 lea eax, dword ptr [ebp-0C]
:005153C2 BA03000000 mov edx, 00000003
:005153C7 E814ECEEFF call 00403FE0
:005153CC C3 ret
:005153CD E966E6EEFF jmp 00403A38
:005153D2 EBEB jmp 005153BF
:005153D4 8BC3 mov eax, ebx
:005153D6 5B pop ebx
:005153D7 8BE5 mov esp, ebp
:005153D9 5D pop ebp
:005153DA C3 ret ----------->回到00515B04，结束这个CALL
/////////////////////////////CALL 00515358 END /////////////////////
注意到CALL00515358里的流程为先用正确的注册码做运算，得到eax 的值，
并存入ebx 内。再用输入的注册码做运算，得到eax 的值，第一个判断 eax=0？？？
等于0 则为错误，出错后就把ebx 清零。第二个判断 eax=ebx？？？不等于则为
错误，出错后就把ebx 清零。相等则为正确，并把ebx 的低位置为01可见：005153A4
33DB xor ebx， ebx和：005153A6 EB0A jmp 005153B2这两句在正确时不用，可
以把它改为自己想要的语句。考虑到下一句语句就是比较 eax和ebx 的值：005153A8
3BC3 cmp eax， ebx所以把这两句改为：005153A4 33DB （改为8BC3） xor ebx，
ebx 改为 mov eax，ebx ——> 把Ebx 的值赋给eax ：005153A6 EB0A （改为9090）
即把jmp 005153B2改为 nop | ____\ 把这句给空掉
nop | / 如果第一个判断的结果为
正确，则走正确的流程，如果不正确，则把ebx 的值赋给eax.这样一来，不管第
一个判断的结果是否正确，流程都要到比较eax 和ebx 是否相等这一句。而且由
于ebx 的值赋给了eax ，这样eax 恒等于ebx ，第二个判断的结果总为正确。于
是无论你输入的注册码是否正确，程序都将判断它是正确的。结果就是注册成功！！！！
呵呵呵：- ）
分析完毕，做最后的工作，用ultraEdit 或winHex把MoneyHome.exe 打开，
查找十六进制串“85 C0 75 04 55 DB EB 0A 3B C3 75 04 ”改为：“85C0 75
04 8B C3 90 90 3B C3 75 04”运行修改后的程序，天，直接进入了主界面，都
不显示注册窗口。点“帮助”——> “注册财智家庭理财”显示“你已经是注册
用户。”但“注册码：”一栏是空的，而且还有“稍后注册”的按钮。随便填入
一个注册码，按“完成注册”，提示“祝贺你！注册成功”。再点“帮助”——
> “注册财智家庭理财”显示“你已经是注册用户。”且“注册码：”一栏为你
刚输入的字符，而且“稍后注册”的按钮已消失。如不输入注册码而直接按“完
成注册”，也会提示“祝贺你！注册成功”。但注册窗口还是维持原样。
OK！大功告成，打个Kiss！！！ #@@^^#@@#^^……呵呵呵……：- ）
方恨少写于2001.1.31 凌晨4 点整


财智老板通正式板

 标 题:贴一篇破解过程,本想作为加入BCG的第三篇.但: (2千字)
发信人:ljh3146
时 间:2001-8-9 1:07:38
详细信息:
因为在QQ上曾和6767大哥讨论这个软件的CRACK,不能能算是独立完成的.只好重CRACK一个了.谢谢6767大哥,虽然我现在仍不很明白Bpm的作用(扑嗵,倒一片,不远处传来一个声音:我KAO,不懂BPM居然还CRACK) :).

软件名称:财智老板通正式板
所用工具:w32dasm
:TRW2000 1.22

第一步当然是用W32分析啦:
* Reference to : TDMTransFm.~PROC~00516E4C()
|
00517757 E8F0F6FFFF call 00516E4C 这个CALL肯定是重大怀疑对象啦,不要犹豫,跟进出.
0051775C 84C0 test al, al
0051775E 744F jz 005177AF 一跳就死(引一位大客的话:三筒就活:) )

* Reference to pointer to GlobalVar_0056AA58
|
00517760 A164935600 mov eax, dword ptr [$569364]
00517765 8B00 mov eax, [eax]
00517767 8B55FC mov edx, [ebp-$04]

|
0051776A E85D02FBFF call 004C79CC
0051776F 6A00 push $00
00517771 668B0DFC775100 mov cx, word ptr [$5177FC]
00517778 B202 mov dl, $02

* Possible String Reference to: ' 祝贺您,注册成功！请保存好您
| 的注册码，以便您以后需要重新安装软?
| 笔褂谩?
|
0051777A B808785100 mov eax, $00517808

|
0051777F E8A03FF4FF call 0045B724

* Reference to field TRegisterFm.OFFS_0330
|
00517784 8D8330030000 lea eax, [ebx+$0330]
0051778A 8B55FC mov edx, [ebp-$04]

|
0051778D E836C8EEFF call 00403FC8
00517792 8BC3 mov eax, ebx

|
00517794 E8CBFAFFFF call 00517264

* Reference to field TRegisterFm.OFFS_0334
|
00517799 C783340300000F270000 mov dword ptr [ebx+$0334], $0000270F

* Reference to field TRegisterFm.OFFS_0234
|
005177A3 C7833402000001000000 mov dword ptr [ebx+$0234], $00000001
005177AD EB2A jmp 005177D9
005177AF 6A00 push $00
005177B1 668B0DFC775100 mov cx, word ptr [$5177FC]
005177B8 B201 mov dl, $01

* Possible String Reference to: '对不起，注册失败,请校对注册码'
|
005177BA B864785100 mov eax, $00517864

|
005177BF E8603FF4FF call 0045B724

我按F10跟踪下去,按呀按.我都累了.来到这儿:咦,怎么回事,又到这儿了.
:005177BA B864785100 mov eax, 00517864
:005177BF E8603FF4FF call 0045B724 在这儿下D EDX 出现:123465(假注册码,用ALT+PageDoen向下看,不停按,出现11817081,记下它)
:005177C4 8B93F4020000 mov edx, dword ptr [ebx+000002F4]

注册成功!!!(高呼万岁三声)

整理:
机器码: 2406-0241
注册码: 11817081

说明:此过程仅作研究用,如有人用于商业用途,后果自负.

对了,6767大哥,关于BPM能详细介绍一下吗?
"(2001-08-09 00:12:57) WakeUpDeadMa
bpm是对数据读写作出反映"
不是太明白(不好意思地傻笑)


财智系列破解

 标 题:财智系列破解 (3千字)
发信人:jieao
时 间:2001-7-22 20:04:57
详细信息:
财智家庭理财2001注册版
:00515AF1 8B83F4020000 mov eax, dword ptr [ebx+000002F4]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00515AB5(C)
|
:00515AF7 E83C1DF2FF call 00437838
:00515AFC 8B45FC mov eax, dword ptr [ebp-04]
:00515AFF E854F8FFFF call 00515358 \ 进去看看
:00515B04 84C0 test al, al | 怎么样够经典吧
:00515B06 744F je 00515B57 /
:00515B08 A170A86000 mov eax, dword ptr [0060A870]
:00515B0D 8B00 mov eax, dword ptr [eax]
:00515B0F 8B55FC mov edx, dword ptr [ebp-04]
:00515B12 E8C99EFAFF call 004BF9E0
:00515B17 6A00 push 00000000
:00515B19 668B0DA45B5100 mov cx, word ptr [00515BA4]
:00515B20 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"祝贺您,注册成功！"
|
:00515B22 B8B05B5100 mov eax, 00515BB0
:00515B27 E8B895F4FF call 0045F0E4
:00515B2C 8D832C030000 lea eax, dword ptr [ebx+0000032C]
:00515B32 8B55FC mov edx, dword ptr [ebp-04]
:00515B35 E8D6E4EEFF call 00404010
:00515B3A 8BC3 mov eax, ebx
:00515B3C E823FCFFFF call 00515764
:00515B41 C783300300000F270000 mov dword ptr [ebx+00000330], 0000270F
:00515B4B C7833402000001000000 mov dword ptr [ebx+00000234], 00000001
:00515B55 EB2A jmp 00515B81

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00515B06(C)
|
:00515B57 6A00 push 00000000
:00515B59 668B0DA45B5100 mov cx, word ptr [00515BA4]
:00515B60 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"对不起，注册失败,请校对注册码"
|
:00515B62 B8CC5B5100 mov eax, 00515BCC
:00515B67 E87895F4FF call 0045F0E4
:00515B6C 8B93F4020000 mov edx, dword ptr [ebx+000002F4]
:00515B72 8BC3 mov eax, ebx
:00515B74 E8FFBBF3FF call 00451778
:00515B79 33C0 xor eax, eax
:00515B7B 898334020000 mov dword ptr [ebx+00000234], eax
_____________________________________________________________________
:00515358 55 push ebp
:00515359 8BEC mov ebp, esp
:0051535B 6A00 push 00000000
:0051535D 6A00 push 00000000
:0051535F 6A00 push 00000000
:00515361 53 push ebx
:00515362 8945FC mov dword ptr [ebp-04], eax〈---你输入的注册码
:00515365 8B45FC mov eax, dword ptr [ebp-04]
:00515368 E883F0EEFF call 004043F0
:0051536D 33C0 xor eax, eax
:0051536F 55 push ebp
:00515370 68CD535100 push 005153CD
:00515375 64FF30 push dword ptr fs:[eax]
:00515378 648920 mov dword ptr fs:[eax], esp
:0051537B 8D45F4 lea eax, dword ptr [ebp-0C]
:0051537E E831FFFFFF call 005152B4
:00515383 8B45F4 mov eax, dword ptr [ebp-0C]<----你的机器码
:00515386 8D55F8 lea edx, dword ptr [ebp-08]
:00515389 E846FFFFFF call 005152D4 <----算法
:0051538E 8B45F8 mov eax, dword ptr [ebp-08]<----你的注册码
:00515391 E8FAFCFFFF call 00515090
:00515396 8BD8 mov ebx, eax
:00515398 8B45FC mov eax, dword ptr [ebp-04]
:0051539B E8F0FCFFFF call 00515090
:005153A0 85C0 test eax, eax
:005153A2 7504 jne 005153A8
:005153A4 33DB xor ebx, ebx
:005153A6 EB0A jmp 005153B2

呵呵，财智系列注册方式都一样。我喜欢Delphi!


彩票快车

标 题:彩票快车破解手记(copyyour兄要的，来看看吧） (1千字)
发信人:孙锋
时 间:2001-3-25 20:15:09
详细信息:
彩票快车破解手记

作者：孙锋
主页：http://sffs.533.net

我今天在网上得到的copyyour（黑狐）老兄的一个问题，是关于“彩票快车”的破解，从学校回来后就在机器上跟踪起来了，但是我没想到作者在进行注册码的判断时加了好多的陷阱，本来我以为追到的数字就是注册码呢，谁知道，他还把得到的注册码的顺序又另排了一下，最后才给你正确的注册码。下面我写写追踪的过程，希望可以给copyyour兄一个答复。

这个软件是根据机器硬件生成注册号，然后算注册码，如果你注册成功了，除了修改lotteryrapido.ini外，还生成一个注册数据文件cpkcreg.dat文件，里面存的就是注册信息，因为我用的是bpx hmemcpy来跟踪的，所以跟踪的过程麻烦了些。

工具： TRW2000 1.23注册版

步骤：
1、执行“彩票快车”后选择“软件注册”，然后输入自己的用户名，电话，email后，点生成用户码，我使用的是默认，直接用生成用户码，得到的是11723152，然后填入注册码12344321（程序的注册码要求是8个数字，其他的不对）。
2、启动TRW2000，下BPX HMEMCPY，然后用F5返回程序空间，点注册被TRW2000拦截到。
3、按F12共计14次（因为按5次弹出注册失败的对话框），然后一直F10到下面的地址，这个时间和按键次数很长和多，直到：

0167：004A8C1A CALL 004086EB处，下 D EAX得到注册码，为11558461。
4、说明：在跟踪的过程中得到的35217864 和55111684都不是正确的注册码，只有在弹出对话框之前不远处，才得到正确的注册码，这也许就是程序的陷阱所在吧。
5、如果要直接得到注册码，可以直接下BPX 4A8C1A，然后直接D EAX即可。
6、收工。
7、黑狐兄可以把cpkcreg.dat和lotteryrapido.ini拷贝到别的机器上试试，看看能不能在别的机器上用。
下面是我的注册信息：

lotteryrapido.ini

[彩票快车]
姓名=孙锋
电话=0537-4457109
电子邮件=sffs@263.net
用户码=81149306
注册码=01265484
数据文件名=chutianfc.txt
启动每日一贴=0
第几贴=1
用户码=81149306

cpkcreg.dat

姓名:孙锋
电话:0537-4457109
电子邮件:sffs@263.net
用户码:81149306
注册码:01265484

<---------完---------->


彩票快车V1.07

标 题:国产软件每日一破(1) (彩票快车V1.07破解记录) (2千字)
发信人:风飘雪
时 间:2001-2-19 21:07:59
详细信息:
国产软件每日一破(1) (彩票快车V1.07破解记录)
软件名称：彩票快车V1.07 [国产]
来源 2001-02-19 海阔天空502k
软件授权：共享软件
注册费用：28元人民币
软件下载 ftp://ftp.bj.software.chinese.com/software/soft_others/cpkc.zip
软件简介：
    全国各地电脑福利电脑体育彩票最具实力的分析管理投注软件，及时快捷的数据更新！
适用于全国各省、市的各类电脑体育、福利彩票。电脑随机选号的范围可以自行指定。
用后感觉不错,推荐,祝中大奖.
程序不修改Windows注册表的任何内容,没有加壳.

[一]暴力破解
W32DASM金版=>串式参考"您的彩票快车已注册成功，希望多提宝贵意见。谢谢"=>
只有1处,找到后,向上找第一个跳转语句,即(2)处,此为关键跳转.(1)处为关键比较.
:004A8BE0 C1E003 shl eax, 03
:004A8BE3 2BC2 sub eax, edx
:004A8BE5 3BD8 cmp ebx, eax *********(1)关键比较
:004A8BE7 0F858B010000 jne 004A8D78 (2)关键跳转
^^=>84(爆破) ************
:004A8BED A1947C4B00 mov eax, dword ptr [004B7C94]
:004A8BF2 8B15EC794B00 mov edx, dword ptr [004B79EC]
:004A8BF8 8B12 mov edx, dword ptr [edx]
:004A8BFA E8B9AFF5FF call 00403BB8
:004A8BFF 6A01 push 00000001
* Possible StringData Ref from Code Obj ->"彩票快提示窗口" (丢掉车字,国产的"质量"!!!)
|
:004A8C01 B9608E4A00 mov ecx, 004A8E60
* Possible StringData Ref from Code Obj ->"您的彩票快车已注册成功，希望多提宝贵意见。谢谢"
->"！"
|
:004A8C06 BA708E4A00 mov edx, 004A8E70
:004A8C0B A1147C4B00 mov eax, dword ptr [004B7C14]
:004A8C10 8B00 mov eax, dword ptr [eax]

w32dasm中(2)处底部偏移地址为A7FE7,用ultraedit修改0F85..=>0F84..
改完后再启动,软件注册菜单消失.

[二]追注册码
1.软件注册菜单中填入姓名,电话,电子邮件后,点生成用户码,信息
存在当前目录下lotteryrapido.ini中,我的用户码是16131363
[彩票快车]
姓名=风飘雪
电话=68394831
电子邮件=gd1@yeah.net
用户码=16131363
注册码=
2.试填入注册码,发现注册码必须是8位(可用穷举法,haha!!)
输入11111111
3.启动trw2000,下中断
bpx 4a8be5
go 点注册,被拦
? eax
eax=77777777(在哪里,在哪里见过你,你的笑容这麽熟悉)
想起舒淇和天心MM的电影我爱777
? ebx
ebx=368098003
4.琢磨368098003÷7=52585429
5.填入52585429,点注册,ok,ok!!!

作者 风飘雪
主页 http://duba.126.com
e-mail gd1@yeah.net

标 题:彩票快车V1.07注册码算法分析： (3千字)
发信人:小　明
时 间:2001-2-20 18:16:00
详细信息:

016F:004A8A80 CALL 00403DE4 取name长度
016F:004A8A85 ADD EAX,BYTE +0B　　　加上0B
016F:004A8A88 MOV ECX,EAX
016F:004A8A8A SHL ECX,07
016F:004A8A8D SUB ECX,EAX　　　　　　*7F 设为L
016F:004A8A8F MOV EAX,[004B7CF0]
016F:004A8A94 MOV EAX,[EAX] 取用户码
016F:004A8A96 MOV EBX,7F
016F:004A8A9B CDQ
016F:004A8A9C IDIV EBX
016F:004A8A9E MOV EDX,EAX　　　　　　除以7F取余
016F:004A8AA0 SHL EAX,04
016F:004A8AA3 ADD EAX,EDX　　　　　　*11
016F:004A8AA5 XOR EAX,02EFB69C XOR 02EFB69C
016F:004A8AAA CDQ \
016F:004A8AAB XOR EAX,EDX > 取绝对值
016F:004A8AAD SUB EAX,EDX /
016F:004A8AAF ADD ECX,EAX 与L相加
016F:004A8AB1 MOV EAX,[004B7CF0]
016F:004A8AB6 MOV [EAX],ECX 放回用户码处，设为Y
016F:004A8AB8 MOV EDX,[004B7C08]
016F:004A8ABE MOV EDX,[EDX]
016F:004A8AC0 MOV EAX,[004B7AAC]
016F:004A8AC5 MOV ECX,004A8E40
016F:004A8ACA CALL 00403E30 将name与**&%#$@KLhd串起来
016F:004A8ACF MOV EAX,[004B7AAC]　　如：abc->abc**&%#$@KLhd　设为name'
016F:004A8AD4 MOV EAX,[EAX]
016F:004A8AD6 CALL 00403DE4 取name'的长度
016F:004A8ADB MOV ECX,EAX
016F:004A8ADD TEST ECX,ECX
016F:004A8ADF JNG 004A8B17
016F:004A8AE1 MOV EBX,01 循环变量
016F:004A8AE6 MOV EAX,[004B7AAC]　　－－循环头－－
016F:004A8AEB MOV EAX,[EAX]
016F:004A8AED MOVZX EAX,BYTE [EAX+EBX-01]　取name'的第EBX个字符
016F:004A8AF2 MOV EDX,[004B7CF0]
016F:004A8AF8 IMUL DWORD [EDX]　　　　与Y相乘
016F:004A8AFA ADD EAX,9F　　　　　　　加上9F
016F:004A8AFF CDQ
016F:004A8B00 XOR EAX,EDX
016F:004A8B02 SUB EAX,EDX　　　　　　取绝对值
016F:004A8B04 MOV EDI,05F5E100
016F:004A8B09 CDQ
016F:004A8B0A IDIV EDI　　　　　　　　除以05F5E100
016F:004A8B0C MOV EAX,[004B7CF0]
016F:004A8B11 MOV [EAX],EDX　　　　　放入Y
016F:004A8B13 INC EBX
016F:004A8B14 DEC ECX　　　　　　　　循环次数为name'的长度
016F:004A8B15 JNZ 004A8AE6　　　　　－－循环尾－－
016F:004A8B17 MOV EAX,[004B7CF0]
016F:004A8B1C ADD DWORD [EAX],016676E1　y+016676E1-->Y
016F:004A8B22 MOV EAX,[004B7AAC]
016F:004A8B27 PUSH EAX
016F:004A8B28 LEA EDX,[EBP-10]
016F:004A8B2B MOV EAX,[004B7CF0]
016F:004A8B30 MOV EAX,[EAX]
016F:004A8B32 CALL 00408684　　　　　　将Y变成10进制的字符串，设为Y'
016F:004A8B37 MOV EAX,[EBP-10]
016F:004A8B3A MOV ECX,08
016F:004A8B3F MOV EDX,01
016F:004A8B44 CALL 00403FEC　　　　　　取Y'的前8位，设为Y"
016F:004A8B49 LEA EAX,[EBP-04]
016F:004A8B4C MOV EDX,004A8E54　　　　这里有一串字符：35217864
016F:004A8B51 CALL 00403BFC
016F:004A8B56 MOV EAX,[004B7D30]
016F:004A8B5B CALL 00403B64
016F:004A8B60 MOV EBX,01　　　　　　　循环变量
016F:004A8B65 LEA EAX,[EBP-14]　　　　－－循环头－－
016F:004A8B68 MOV EDX,[EBP-04]
016F:004A8B6B MOVZX EDX,BYTE [EDX+EBX-01]
016F:004A8B70 MOV ECX,[004B7AAC]
016F:004A8B76 MOV ECX,[ECX]
016F:004A8B78 MOV DL,[ECX+EDX-31]　　　　　这个循环的作用是：
016F:004A8B7C CALL 00403D0C　　　　　　　　将Y"串作位置上的变换，
016F:004A8B81 MOV EDX,[EBP-14]　　　　　　如Y"=12345678，则变换为35217864
016F:004A8B84 MOV EAX,[004B7D30]　　　　　哈哈，变换后的串就是注册码了！
016F:004A8B89 CALL 00403DEC
016F:004A8B8E MOV EAX,[004B7D30]
016F:004A8B93 INC EBX
016F:004A8B94 CMP EBX,BYTE +09　　　　循环8次
016F:004A8B97 JNZ 004A8B65　　　　　　－－循环尾－－
016F:004A8B99 LEA EDX,[EBP-1C]
016F:004A8B9C MOV EAX,[ESI+02FC]

标 题:彩票飞车1.07注册机代码（VB）： (1千字)
发信人:小　明
时 间:2001-2-20 19:00:55
详细信息:

'《彩票飞车1.07》算号器，请用VB5以上编译
'说明：Text1为用户名（可用汉字），Text2为用户码，Text3为注册码
'作者：小明　2001.2.20
Dim x, y As Double
Private Sub Text1_Change()
Text2_Change
End Sub

Private Sub Text2_Change()
uname = Trim(Text1.Text)
l = Len(uname)
x = Val(Text2.Text)
If l > 0 And Len(Trim(Text2.Text)) = 8 And x > 0 Then
For i = 1 To l
If Asc(Mid(uname, i, 1)) < 0 Then l = l + 1
Next
x = (x \ 127) * 17 Xor &H2EFB69C
x = zh(x) + (l + 11) * 127
uname = uname + "**&%#$@KLhd"
For i = 1 To Len(uname)
a = Asc(Mid(uname, i, 1))
If a < 0 Then
a = a + 65536
x = js(x, a \ 256)
x = js(x, a Mod 256)
Else
x = js(x, a)
End If
Next
x = x + &H16676E1
zcm = Trim(Str(x))
zzcm = ""
For i = 1 To 8
zzcm = zzcm + Mid(zcm, Val(Mid("35217864", i, 1)), 1)
Next
Text3.Text = zzcm
Else
Text3.Text = ""
End If
End Sub

Function zh(y)
y = y - Int(y / 4294967296#) * 4294967296#
If y >= 2147483648# Then y = 4294967296# - y
zh = y
End Function

Function js(y, b)
y = zh(y * b + &H9F)
y = y - Int(y / &H5F5E100) * &H5F5E100
js = y
End Function


彩票快车黄金版

标 题:如何破解《彩票快车黄金版》注册码 (1千字)
发信人:CrackerABC[BCG]
时 间:2001-4-21 17:24:28
详细信息:
如何破解《彩票快车黄金版》注册码

作者：CrackerABC[BCG]
主页：http://crackerabc.longcity.net

随便输入任意注册信息：

姓名： CrackerABc[BCG]
电话：7654321
Email：crackerabc@antdowm.com
得到用户码为：18306001
注册码：31415926 （8位）

老方法：
bpx hmemcpy
F5
确定
bd *
pmodule

F10跟踪，在不远处下D 得到两组数字：

64352178
和
69506818

很奇怪的是使用任何一个都提示注册码错误。
但是你用字母顺序来取值再看看。

看好了：按6 4 3 5 2 1 7 8顺序取69506818中的所在序号的数字得到的是：80569618

填进去，哈哈！注册成功。

注册成功后得到两个注册文件：

lotteryrapido.ini

[彩票快车]
姓名=CrackerABc[BCG]
电话=7654321
电子邮件=crackerabc@antdown.com
用户码=18306001
注册码=80569618
数据文件名=chutianfc.txt
启动每日一贴=0
第几贴=1
用户码=81149306

cpkcreg.dat

姓名:CrackerABc[BCG]
电话:7654321
电子邮件:crackerabc@antdown.com
用户码:18306001
注册码:80569618

*************************************************

主页：http://crackerabc.longcity.net（[BCG]大本营）

软件破解，软件注册，破解教学，破解申请，注册机码。

请保留我的信息，谢谢！

**************************************************

标 题:彩票快车黄金版注册 (3千字)
发信人:小楼
时 间:2001-4-21 22:54:50
详细信息:

彩票快车黄金版

DEDE反编译,
FORMS\TRegWindow:
object BitBtn1: TBitBtn
Left = 378
Top = 84
Width = 111
Height = 28
Caption = '生成用户码'
Enabled = False
TabOrder = 2
OnClick = BitBtn1Click
Kind = bkHelp
end

object BitBtn3: TBitBtn
Left = 378
Top = 163
Width = 111
Height = 28
Caption = '注 册'
Enabled = False
TabOrder = 4
OnClick = BitBtn3Click
知道生成用户码与BitBtn1Click事件有关,
比较注册码与BitBtn3Click事件有关.

1.生成注册码
在procedures\regwindows: BitBtn1Click
***** TRY
|
004AADD8 64FF30 push dword ptr fs:[eax]
......
* Possible String Reference to: '&&^$%$$jfhj*F'
|
004AAE57 6830B04A00 push $004AB030
......
* Possible String Reference to: 'keosk%#2'
|
004AAE63 6848B04A00 push $004AB048

......
这样生成 姓名&&^$%$$jfhj*F电话号码keosk%#2信箱 字串,
在004AAEC6 A1C4FA4B00 mov eax, dword ptr [$4BFAC4]
至004AB018 C3 ret
间进行换算,不外乎imul, xor, sub, idiv等,循环次数与上述字串长度相关.

2.得到注册码
在procedures\regwindows: BitBtn3Click
***** TRY
|
004AB071 64FF30 push dword ptr fs:[eax]
......
* Reference to pointer to GlobalVar_004C1220
|
004AB1EE A104FA4B00 mov eax, dword ptr [$4BFA04]
004AB1F3 8B00 mov eax, [eax] <--d ecx,看到真,假注册码

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
004AB1F5 E8F6D4F5FF call 004086F0
004AB1FA 8BD0 mov edx, eax
004AB1FC C1E003 shl eax, $03
004AB1FF 2BC2 sub eax, edx
004AB201 3BD8 cmp ebx, eax
004AB203 0F858B010000 jnz 004AB394

* Reference to pointer to GlobalVar_004C976C
|
004AB209 A1BCFC4B00 mov eax, dword ptr [$4BFCBC]

* Reference to pointer to GlobalVar_004C1220
|
004AB20E 8B1504FA4B00 mov edx, [$4BFA04]
004AB214 8B12 mov edx, [edx]

* Reference to: system.@LStrAsg;
|
004AB216 E89D89F5FF call 00403BB8
004AB21B 6A01 push $01

* Possible String Reference to: '彩票快提示窗口'
|
004AB21D B984B44A00 mov ecx, $004AB484

* Possible String Reference to: '您的彩票快车已注册成功，希望多提宝贵意见?
004AB222 BA94B44A00 mov edx, $004AB494
......

3.不知道为何,注册后依旧不可使用"复式投注""胆拖投注", 软件不支持? 还有暗桩?
再看看,知道"复式投注""胆拖投注"按钮分别由Speedbutton21click与Speedbutton20click事件控制, 看看Speedbutton21click
004BD4A4 6A01 push $01

* Possible String Reference to: '彩票快车提示窗口'
|
004BD4A6 B9C0D44B00 mov ecx, $004BD4C0

* Possible String Reference to: ' 您在必选号码窗口指1-6个胆码，在
| 参照出号概率窗口指定N个拖码，本按钮
| 将从这些号码的所有胆拖组合中按给定
条件筛选出符合要求的号码组.....
004BD4AB BAD4D44B00 mov edx, $004BD4D4

* Reference to TApplication instance
|
004BD4B0 A134FC4B00 mov eax, dword ptr [$4BFC34]
004BD4B5 8B00 mov eax, [eax]

* Reference to: forms.TApplication.MessageBox(TApplication;System.PChar;System.PChar;System.Longint):System.Integer;
|
004BD4B7 E8F4EBF8FF call 0044C0B0
004BD4BC C3 ret
原来软件根本不存在上述功能, 嘿嘿!


彩票选号分析系统v5.0

标 题:破机器有问题，部分步骤没存上，重发，toye把上面的删除吧。不好意思。 (1千字)
发信人:CrackerABC[BCG]
时 间:2001-4-14 11:00:29
详细信息:
《彩票王》彩票选号分析系统v5.0 ---http://crackerabc.longcity.net奉献！

作者：CrackerABC[BCG]
主页：http://crackerabc.longcity.net

这个软件是采用VB6来编写的，但是还是可以用bpx hmemcpy来中断并取得注册码的。
在跟踪注册码的过程中比较麻烦，我只简单写写得到注册码的地方，过程简写。
使用工具：TRW20000

本软件针对机器代码来给出具体的注册号。其中必须填写部分选项：
我填写的选项为：
用户名：CrackerABC[BCG]
身份证：370101200101011011
电话：7654321
省份：山东
注册码：AAAAA-BBBBB-CCCCC-DDDDD
点确定后自动给出机器代码：6CAI8-9X2R1-3Q17H-1B#&-

步骤：

1、启动TRW2000，然后下bpx hmemcpy中断，F5返回后点确定被拦截到TRW2000领域，下BD *中断所有断点。

2、pmodule，后开始按F10跟踪，下面是部分代码段：

0167:006C52B0 PUSH EBX
0167:006C52B1 PUSH BYTE +0A
0167:006C52B3 PUSH BYTE +01
0167:006C52B5 PUSH BYTE +08
0167:006C52B7 LEA ECX,[EBP+FFFFFE78]
0167:006C52BD PUSH ECX
0167:006C52BE PUSH BYTE +04
0167:006C52C0 PUSH DWORD 0180
0167:006C52C5 CALL `MSVBVM60!__vbaRedim`
0167:006C52CB MOV EDX,[006FE060]
0167:006C52D1 MOV ECX,[006FE054]//D EDX看到的是假注册码AAAAA-BBBBB-CCCCC-DDDDD，但是如果你把光标移动到数据窗口，往上滚动几次，就看见真的注册码了！NBAG6-83969-2587R-1BE$O

0167:006C52D7 ADD ESP,BYTE +1C
0167:006C52DA CALL `MSVBVM60!__vbaStrCopy`
0167:006C52E0 MOV EDX,[ESI]
0167:006C52E2 PUSH ESI
0167:006C52E3 CALL NEAR [EDX+0330]
0167:006C52E9 PUSH EAX
0167:006C52EA LEA EAX,[EBP+FFFFFE38]
0167:006C52F0 PUSH EAX

如果你要认真的跟踪下去，就会是一个艰苦的旅程，因为注册码的取得是分两部分得到，并且在后半部分中还对注册码中的部分字符进行判断，我没仔细看，大概是这样的，因为我对彩票软件并不抱很好的态度，所以只要得到注册码就可以了。

3、注册，成功了！然后是删除卸载！注册表信息在：
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\彩票选号分析系统\初始化下面。

<-----完------>


超级光盘管理员1.

标 题:俺来写写“超级光盘管理员1.注册码的获取方法”的破解点吧。 (1021字)
发信人:CrackerABC[BCG]
时 间:2001-4-12 15:11:45
详细信息:
超级光盘管理员1.注册码的获取方法

下载地址：URL http://go.163.com/~cdmanager/cdm.zip

本软件可以使用通用的万能中断bpx hmemcpy来中断并得到注册码。
使用中要注意首先判断按F12的次数。下面开始。

1、首先载入vcdrom.exe，然后选择注册。随便输入注册码和其他信息了，我输入的是用户名：CrackerABC[BCG]邮件地址随便，注册码：31415926。
2、然后启动TRW2000（防止有些软件检测TRW2000）点确定，然后用热键
Ctrl+N 呼叫出trw2000，下断点bpx hmemcpy。
3、F5返回程序空间后点注册，被TRW2000拦截到。
4、在TRW2000窗口中下BD *终止断点。开始按F12，当按下第15次时，出现错误提示。
5、BC *清除断点然后X返回程序空间，重复1，2，3，4步，在4中，按F12的次数是15-1=14次（这就是一般程序按F12的次数的规则，出错前的为最后一次）这里呢就当然是14次了。
6、下面就开始按F10了，呵呵，有时候是几次，有时候是几十或者几百次啊，当然有时候要跟进一些CALL关键子程序中去的。这里呢只按F10几次就可以了。
7、按F10一直使光标到下面的地址：
0167：0049990F POP EAX ；------> 下D EDX 得到注册码：9910
8、呵呵，就这么简单。整理注册，一切都变的清净了。俺喜欢！！！

标 题:太新了!!CCG冷酷到底******超级光盘管理员1.5注册机*****(CCG发布) (753字)
发信人:8989
时 间:2001-4-12 14:21:02
详细信息:

太新了!!CCG冷酷到底******超级光盘管理员1.5注册机*****(CCG发布)
用户名 CCG 注册码 310

超级光盘管理员1.5注册

#include <stdio.h>
/*超级光盘管理员1.5注册机
下载 http://go.163.com/~cdmanager/cdm.zip
*/
int main(void)
{
const long a=0xa8;
int counter=0;
unsigned long zcm=0,b=0;
unsigned char yourname[63];
clrscr();
printf("CD manager1.5\n");
printf("==================\n");
printf("Made by [CCG]-2001\n");
printf("China Cracking Group\n");
printf("please enter your name:");
gets(yourname);
for(counter=0;counter<=strlen(yourname);counter++)
{
b=b+yourname[counter]*(counter+1);
}
zcm=b^a;
printf("your register number is:%ld\n",zcm);
printf("bye");
return(0);
}


超级兔仔注册表优化软件v2.2

 标 题:超级兔仔注册表优化软件v2.2破解
发信人:1212
时 间:2000-12-17 9:53:15
详细信息:
软件名称：超级兔仔注册表优化软件v2.2
破解工具：trw2000 v1.22注册版、w32dasm gold版、procdump 1.62、fileinfo 2.4
本人名言：授人以码，不若授人以法。
所用时间：3小时
破解人：唐寅
正文：
闲来无事，应朋友之要求，对超级兔仔注册表优化软件v2.2进行破解。
1.祭起FileInfo的大旗，看看regopt.exe是用什么包装的。原来是Upx v0.81。
2.启动Procdump，调入regopt.exe，用Upx项进行脱壳。文件另存为up_regopt.exe。
3.打开W32dasm，对up_regopt.exe进行反汇编，调看ref data，找到：RegName，RegCode，并从程序中看到在Hkey_local_machine/software/Supper Rabbit/MagicSet下和Hkey_local_machine/software/Supper Rabbit/RegTool下。
4.在上述两个地方均增加Regname、RegCode，值任意。
5.我们从退出时注册不成功的话，会弹出一个对话框提示，从它下手。
6、打开trw2000，loadup_regopt.exe，在按退出键之前下断点bpx rtcMsgBox，按“退出”，立刻被中断。得到一个地址，记下。打开w32dasm，goto你记下的地址。
7.我发现它是以内存的[ebx（或eax）+0000009c]处的dword值进行判断的。程序见下面的“程序退出时的比较”和“程序启动时的比较”。
8.按照这一地址设断：bpmd [ebx+0000009c] rw，发现程序第二次中断于“程序启动时的比较”处。如果将此处的值改为非0，则不会弹出about对话框了。
9.顺藤摸瓜，在w32dasm中查找“09c]”字符串，找到如下“判断注册码正确与否的程序”：
判断注册码正确与否的程序：
:004118CD FF15F0854200 call dword ptr [004285F0]
:004118D3 FF150C844200 call dword ptr [0042840C]
:004118D9 DC1D10134000 fcomp qword ptr [00401310] //比较注册码
:004118DF DFE0 fstsw ax
:004118E1 F6C440 test ah, 40
:004118E4 750C jne 004118F2 //正确则跳
:004118E6 C78514FEFFFF01000000 mov dword ptr [ebp+FFFFFE14], 00000001 //注册码不正确赋1
:004118F0 EB0A jmp 004118FC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004118E4(C)
|
:004118F2 C78514FEFFFF00000000 mov dword ptr [ebp+FFFFFE14], 00000000 //注册码正确时为0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004118F0(U)
|
:004118FC 8B55D8 mov edx, dword ptr [ebp-28]
:004118FF 52 push edx
:00411900 FF153C834200 call dword ptr [0042833C]
:00411906 33C9 xor ecx, ecx
:00411908 83F80A cmp eax, 0000000A //比较注册码是否10位
:0041190B 0F95C1 setne cl //注册码是10位则ecx为0
:0041190E 8B9514FEFFFF mov edx, dword ptr [ebp+FFFFFE14] //将注册码判断的结果取出
:00411914 0BD1 or edx, ecx //注册码正确时ecx==edx==0
:00411916 85D2 test edx, edx
:00411918 7514 jne 0041192E //不正确时跳
:0041191A C745FC1B000000 mov [ebp-04], 0000001B
:00411921 8B4508 mov eax, dword ptr [ebp+08]
:00411924 C7809C000000FFFFFFFF mov dword ptr [ebx+0000009C], FFFFFFFF //look,赋“-1”表示完全成功！哈哈。
程序启动时的比较：
:00413C83 83B89C00000000 cmp dword ptr [eax+0000009C], 00000000
:00413C8A 0F851E010000 jne 00413DAE //不为0则不弹出“about”对话框
程序退出时的比较：
:00414013 8B8B9C000000 mov ecx, dword ptr [ebx+0000009C]
:00414019 33C0 xor eax, eax //eax==0
:0041401B 3BC8 cmp ecx, eax //ecx=0的话弹出对话框
:0041401D 8945DC mov dword ptr [ebp-24], eax
:00414020 8945D8 mov dword ptr [ebp-28], eax
:00414023 8945D4 mov dword ptr [ebp-2C], eax
:00414026 8945D0 mov dword ptr [ebp-30], eax
:00414029 8945CC mov dword ptr [ebp-34], eax
:0041402C 8945C8 mov dword ptr [ebp-38], eax
:0041402F 8945C4 mov dword ptr [ebp-3C], eax
:00414032 8945C0 mov dword ptr [ebp-40], eax
:00414035 8945BC mov dword ptr [ebp-44], eax
:00414038 8945B8 mov dword ptr [ebp-48], eax
:0041403B 8945B4 mov dword ptr [ebp-4C], eax
:0041403E 8945A4 mov dword ptr [ebp-5C], eax
:00414041 894594 mov dword ptr [ebp-6C], eax
:00414044 894584 mov dword ptr [ebp-7C], eax
:00414047 898574FFFFFF mov dword ptr [ebp+FFFFFF74], eax
:0041404D 898564FFFFFF mov dword ptr [ebp+FFFFFF64], eax
:00414053 898544FFFFFF mov dword ptr [ebp+FFFFFF44], eax
:00414059 898540FFFFFF mov dword ptr [ebp+FFFFFF40], eax
:0041405F 89853CFFFFFF mov dword ptr [ebp+FFFFFF3C], eax
:00414065 898538FFFFFF mov dword ptr [ebp+FFFFFF38], eax
:0041406B 0F8556010000 jne 004141C7 //ecx不为0跳转
10.用“0000000000”一试发现注册成功。那就这样吧。
11.结论：

在注册表中/hkey_local_machine/software/Supper Rabbit/MagicSet和
/hkey_local_machine/software/Supper Rabbit/RegTool下增加字符串值：
"RegName"="你的名字"
"RegCode"="0000000000"
另外，请教高手 fcomp qword ptr [00401310]的具体使用情况，本人不甚清楚。

唐寅2000-12-17


超级小精灵 ver1.0

标 题:超级小精灵 ver1.0破解 (448字)
发信人:1212
时 间:2001-2-11 9:57:24
详细信息:
超级小精灵 ver1.0
下载地址：http://www.soft999.com/download2/superspirit.exe
今天无聊就下载了它，可一看要注册，就当练习很快就把它搞定了。由于我比较懒，过程就不写了，很简单，初学者可以用它来练手。

用户名：SuperSpirit
注册码：Rq0NJA0QJaDaDi

其实注册成功后，软件在注册表中把sos的值改为1就表示已注册成功，你正在使用的就已经是注册版了，哈哈sos搞定你没有商量。

愿意和每一位破解爱好者交流破解心得。（哈哈，我也是一个初学者，今天很高兴）

标 题:注册机~~~~~~呵呵~~~~~~~~~ (1千字)
发信人:真·伪装者
时 间:2001-2-11 11:34:00
详细信息:

 #include "stdio.h"
main()
{
char string[81],s[81];
static int f[14]={0x5a,0x73,0x30,0x34,0x48,0x6d,0x33,0x31,
0x4d,0x61,0x44,0x65,0x4f,0x6b
};
int i,a=0,b,d,e;
unsigned c;
loop: printf("******SuperSpirit V1.00******\nThis keygen is maked by Pretender\nPlease
    input your name        ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{
a=c&f[i];
s[i]=a;
}
d=i;e=i;
if(i<7) {printf("Your User name MUST more than 6 chars\n\n");goto loop;}
if(i>15) {printf("Your User name MUST less than 16 chars\n\n");goto loop;}
else for(d=i;d<=13;d++)
{a=string[e-2]&f[d];s[d]=a;
if(e==i) e=e+1;
else e=e-1;
}
s[14]=0x0;
printf("Your Registation number is    ");
for(i=0;i<14;i++)
{string[i]=s[i]-48;
if(string[i]<0) s[i]=s[i+1]-string[i]+2;
if(string[i]>74) s[i]=s[i+1]-string[i];
if(string[i]>=10&&string[i]<=16) s[i]=s[i]+10;
if(string[i]>=43&&string[i]<=48) s[i]=s[i]+20;
printf("%c",s[i]);}
printf("\nWelcome to WWW.CRACKNOW.COM\n");}

标 题:注册完成后，在注册表中有三个地方会写入。不如全加入即可... (128字)
发信人:china 2000
时 间:2001-2-12 9:03:43
详细信息:

REGEDIT4

[HKEY_LOCAL_MACHINE\System]
"xios"="1"

[HKEY_CURRENT_USER\Software\Microsoft\Windows]
"sos"="1"
"really"="0"


超级小精灵Ver 1.00

标 题:《超级小精灵》Ver 1.00共享版的注册分析 (15千字)
发信人:lihaitao
时 间:2001-2-10 15:43:44
详细信息:
《超级小精灵》Ver 1.00共享版的注册分析

软件简介：超级小精灵主要是一个时间处理器，它主要具有如下功能：1。整点报时，您可以选择声音提醒，也可以选用文字提醒。也可
两种方式都选用。2。定时提醒，可以按照 每天，每周，任何日期三种方式设置。提醒界面比较漂亮。 3。定时执行任务，
如指定时间播放音乐，运行程序，弹出文本信息等，可以指定执行任务时的状态，如最大化，最小化。
4。自带一个很酷的数字表，有了它，您赶快把WIN98带的表扔掉吧，这个表可以随心所欲地选择您喜爱的颜色，使用方法：在
主控制面板上点击 ‘显示时钟’选择框，即可弹出时钟，用右键点击表界面，还可弹出表的控制菜单，执行其中的选项即可。
5。保护WINDOWS系统。计划设置 ：对任何您指定的子目录进行加密，保护您的私人信息，没有密码是无法打开的。
作者地址：辽宁.鞍山钢铁学院计97.1班
作者姓名：钟四化
邮政编码：114002
电子信箱：zhongsihua@yeah.net
注册费用：人民币10元。（感觉此程序不错的，请向作者注册）
软件下载：http://newhua.infosail.com/down/superspirit.exe
注册分析：李海涛
分析工具：W32Dasm Ver:8.93版
TRW2000 Ver:1.23版
信箱地址：lihaitao@xaonline.com

一、先用WD32ASM8.93超级中文版进行反汇编，然后查找，会看到：

:00406150 6689442438 mov word ptr [esp+38], ax
:00406155 894C2414 mov dword ptr [esp+14], ecx
:00406159 0F84DF010000 je 0040633E 检验你输入的注册名和注册码是否符合要求
:0040615F 8B6B64 mov ebp, dword ptr [ebx+64]
:00406162 394DF8 cmp dword ptr [ebp-08], ecx
:00406165 0F84D3010000 je 0040633E 程序从这跳（或是从上面跳）！！！下去看看吧！！！
:0040616B 83FA06 cmp edx, 00000006
:0040616E 7F1A jg 0040618A 程序到这不跳！！！笨！！！
:00406170 51 push ecx

* Possible StringData Ref from Data Obj ->" 错误提示 "
|
:00406171 68C4474100 push 004147C4

* Possible StringData Ref from Data Obj ->" 用户名不合法 "
|
:00406176 68B0474100 push 004147B0
:0040617B 8BCB mov ecx, ebx

* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:0040617D E8F4690000 Call 0040CB76
:00406182 5F pop edi
:00406183 5E pop esi
:00406184 5D pop ebp
:00406185 5B pop ebx
:00406186 83C42C add esp, 0000002C
:00406189 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040616E(C)
|
:0040618A 33C0 xor eax, eax
:0040618C 8D7AFE lea edi, dword ptr [edx-02]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004061A6(C)
|
:0040618F 8A140E mov dl, byte ptr [esi+ecx]
:00406192 2254042C and dl, byte ptr [esp+eax+2C]
:00406196 3BCF cmp ecx, edi
:00406198 8854041C mov byte ptr [esp+eax+1C], dl
:0040619C 7E03 jle 004061A1
:0040619E 49 dec ecx
:0040619F EB01 jmp 004061A2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040619C(C)
|
:004061A1 41 inc ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040619F(U)
|
:004061A2 40 inc eax
:004061A3 83F80F cmp eax, 0000000F
:004061A6 7CE7 jl 0040618F
:004061A8 C644242A00 mov [esp+2A], 00
:004061AD 33D2 xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004061F7(C)
|
:004061AF 8A4C141C mov cl, byte ptr [esp+edx+1C]
:004061B3 0FBEC1 movsx eax, cl
:004061B6 83E830 sub eax, 00000030
:004061B9 790B jns 004061C6
:004061BB 8A4C141D mov cl, byte ptr [esp+edx+1D]
:004061BF 2AC8 sub cl, al
:004061C1 80C102 add cl, 02
:004061C4 EB29 jmp 004061EF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004061B9(C)
|
:004061C6 83F84A cmp eax, 0000004A
:004061C9 7E08 jle 004061D3
:004061CB 8A4C141D mov cl, byte ptr [esp+edx+1D]
:004061CF 2AC8 sub cl, al
:004061D1 EB1C jmp 004061EF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004061C9(C)
|
:004061D3 83F80A cmp eax, 0000000A
:004061D6 7C0A jl 004061E2
:004061D8 83F810 cmp eax, 00000010
:004061DB 7F05 jg 004061E2
:004061DD 80C10A add cl, 0A
:004061E0 EB0D jmp 004061EF

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004061D6(C), :004061DB(C)
|
:004061E2 83F82B cmp eax, 0000002B
:004061E5 7C0C jl 004061F3
:004061E7 83F830 cmp eax, 00000030
:004061EA 7F07 jg 004061F3
:004061EC 80C114 add cl, 14

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004061C4(U), :004061D1(U), :004061E0(U)
|
:004061EF 884C141C mov byte ptr [esp+edx+1C], cl

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004061E5(C), :004061EA(C)
|
:004061F3 42 inc edx
:004061F4 83FA0E cmp edx, 0000000E
:004061F7 7CB6 jl 004061AF
:004061F9 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406210(C)
|
:004061FB 0FBE1428 movsx edx, byte ptr [eax+ebp] D EAX+EBP=你输入的注册码
:004061FF 0FBE4C041C movsx ecx, byte ptr [esp+eax+1C] D ESP+EAX+1C=正确的注册码
:00406204 2BD1 sub edx, ecx 依次对比注册码
:00406206 0F850E010000 jne 0040631A 此处一跳，死！！！
改：909090909090 （暴力）
:0040620C 40 inc eax
:0040620D 83F80E cmp eax, 0000000E 对比14位注册码
:00406210 7CE9 jl 004061FB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040631D(C)
|

* Reference To: ADVAPI32.RegOpenKeyExA, Ord:0172h
|
:00406212 8B350CF04000 mov esi, dword ptr [0040F00C]
:00406218 8D542410 lea edx, dword ptr [esp+10]
:0040621C 52 push edx
:0040621D 6806000200 push 00020006
:00406222 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Software\Microsoft\Windows"
|
:00406224 6894474100 push 00414794
:00406229 6801000080 push 80000001
:0040622E FFD6 call esi
:00406230 85C0 test eax, eax
:00406232 7410 je 00406244
:00406234 6A00 push 00000000
:00406236 6A00 push 00000000

* Possible StringData Ref from Data Obj ->" 保存数据失败! "
|
:00406238 68EC404100 push 004140EC
:0040623D 8BCB mov ecx, ebx

* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:0040623F E832690000 Call 0040CB76

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406232(C)
|
:00406244 8D442418 lea eax, dword ptr [esp+18]
:00406248 50 push eax
:00406249 6806000200 push 00020006
:0040624E 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"System"
|
:00406250 688C474100 push 0041478C
:00406255 6802000080 push 80000002
:0040625A FFD6 call esi
:0040625C 85C0 test eax, eax
:0040625E 7410 je 00406270
:00406260 6A00 push 00000000
:00406262 6A00 push 00000000

* Possible StringData Ref from Data Obj ->" 保存数据失败! "
|
:00406264 68EC404100 push 004140EC
:00406269 8BCB mov ecx, ebx

* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:0040626B E806690000 Call 0040CB76

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040625E(C)
|
:00406270 6A02 push 00000002

* Reference To: MFC42.Ordinal:0337, Ord:0337h
|
:00406272 E805690000 Call 0040CB7C
:00406277 83C404 add esp, 00000004

* Reference To: ADVAPI32.RegSetValueExA, Ord:0186h
|
:0040627A 8B3D10F04000 mov edi, dword ptr [0040F010]
:00406280 8BF0 mov esi, eax
:00406282 6A02 push 00000002
:00406284 56 push esi
:00406285 C60631 mov byte ptr [esi], 31
:00406288 C6460100 mov [esi+01], 00
:0040628C 8B4C2418 mov ecx, dword ptr [esp+18]
:00406290 6A01 push 00000001
:00406292 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"sos"
|
:00406294 6888474100 push 00414788
:00406299 51 push ecx
:0040629A FFD7 call edi
:0040629C 85C0 test eax, eax
:0040629E 7508 jne 004062A8
:004062A0 C744241401000000 mov [esp+14], 00000001 开始写入注册表注册成功标记：[HKEY_CURRENT_USER\Software\Microsoft\Windows]
"sos"="1"

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040629E(C)
|
:004062A8 8B542418 mov edx, dword ptr [esp+18]
:004062AC 6A02 push 00000002
:004062AE 56 push esi
:004062AF 6A01 push 00000001
:004062B1 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"xios"
|
:004062B3 6880474100 push 00414780
:004062B8 52 push edx
:004062B9 FFD7 call edi
:004062BB 6A02 push 00000002
:004062BD 56 push esi
:004062BE 8BE8 mov ebp, eax
:004062C0 C60630 mov byte ptr [esi], 30
:004062C3 C6460100 mov [esi+01], 00
:004062C7 8B442418 mov eax, dword ptr [esp+18]
:004062CB 6A01 push 00000001
:004062CD 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"really"
|
:004062CF 6878474100 push 00414778
:004062D4 50 push eax
:004062D5 FFD7 call edi
:004062D7 85ED test ebp, ebp
:004062D9 7519 jne 004062F4
:004062DB 837C241401 cmp dword ptr [esp+14], 00000001
:004062E0 7512 jne 004062F4
:004062E2 55 push ebp

* Possible StringData Ref from Data Obj ->" 回音壁 "
|
:004062E3 686C474100 push 0041476C

* Possible StringData Ref from Data Obj ->" 注册成功，感谢您选用并且注册小精灵 " 这就不用说了吧！
|
:004062E8 6844474100 push 00414744
:004062ED 8BCB mov ecx, ebx

* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:004062EF E882680000 Call 0040CB76

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004062D9(C), :004062E0(C)
|
:004062F4 8B13 mov edx, dword ptr [ebx]
:004062F6 8BCB mov ecx, ebx
:004062F8 FF92CC000000 call dword ptr [edx+000000CC]
:004062FE 8B442410 mov eax, dword ptr [esp+10]

* Reference To: ADVAPI32.RegCloseKey, Ord:015Bh
|
:00406302 8B3508F04000 mov esi, dword ptr [0040F008]
:00406308 50 push eax
:00406309 FFD6 call esi
:0040630B 8B4C2418 mov ecx, dword ptr [esp+18]
:0040630F 51 push ecx
:00406310 FFD6 call esi
:00406312 5F pop edi
:00406313 5E pop esi
:00406314 5D pop ebp
:00406315 5B pop ebx
:00406316 83C42C add esp, 0000002C
:00406319 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406206(C) 不祥之跳，赶快上去拦住它！！！
***************
|
:0040631A 83F80E cmp eax, 0000000E
:0040631D 0F8DEFFEFFFF jnl 00406212
:00406323 6A00 push 00000000

* Possible StringData Ref from Data Obj ->" 错误提示 "
|
:00406325 6838474100 push 00414738

* Possible StringData Ref from Data Obj ->" 您输入了错误的注册码 "
|
:0040632A 681C474100 push 0041471C
:0040632F 8BCB mov ecx, ebx

* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:00406331 E840680000 Call 0040CB76
:00406336 5F pop edi
:00406337 5E pop esi
:00406338 5D pop ebp
:00406339 5B pop ebx
:0040633A 83C42C add esp, 0000002C
:0040633D C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00406159(C), :00406165(C)
****************************
|
:0040633E 51 push ecx 跳到这的是笨蛋！！！按要求输入。别生气呀！！！

* Possible StringData Ref from Data Obj ->" 错误提示 "
|
:0040633F 68C4474100 push 004147C4

* Possible StringData Ref from Data Obj ->" 错误，不能输入空行 "
|
:00406344 6804474100 push 00414704
:00406349 8BCB mov ecx, ebx

* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:0040634B E826680000 Call 0040CB76
:00406350 5F pop edi
:00406351 5E pop esi
:00406352 5D pop ebp
:00406353 5B pop ebx
:00406354 83C42C add esp, 0000002C
:00406357 C3 ret

总结：
注册的方法：
一、向作者注册。
二、注册名:LIHATIAO注册码:RA2zHD2rAAJEAK
三、修改注册表：[HKEY_CURRENT_USER\Software\Microsoft\Windows]
"sos"="1"
最后要说的是写破解过程真的很累，看雪学苑那么多的教程都是前辈们辛苦整理的，向他们致敬！

LIHAITAO

2001.2.10

标 题:试着说说吧^-^ (415字)
发信人:china 2000
时 间:2001-2-10 17:07:14
详细信息:

这个软件的注册过程不难：
先是注册名要大于6位！
将注册名与一个字符：Zs04Hm31MaDeOk
进行OR得到一个字符串。
再将得到的字符进行计算：
将第一位的16进数值-30
如10-30=E0
判断如果10大于30不跳，否则该值不变。
如果不跳：
再将第二位值如32取出
再用第二位值减上面的值 32-E0=52
再将此值加2 作为第二位值 52+2=54
循环将所有值计算完成（15位）
（到最后一位时如果小于30将会取出00进行相减）
最后得到的就是你的注册码！


炒股理财

标 题:炒股理财算法分析 (3千字)
发信人:THK
时 间:2001-3-31 20:41:58
详细信息:
炒股理财算法分析：

作者：THK
目的：学习找注册码
关于脱壳：用caspr1.012脱壳，去掉自检错误messagebox.
解除ANTI-W32DAASM功能（见http://001.com.cn/forum/toye/11626.html，方法与文中程序一的方法一模一样）
016F:0041CA86 XOR EDI,EDI
016F:0041CA88 PUSH BYTE +04
016F:0041CA8A LEA EAX,[EBP-74]
016F:0041CA8D PUSH EAX
016F:0041CA8E PUSH ESI
016F:0041CA8F CALL 0041C794 //将输入的假码变换，内容见下。
016F:0041CA94 ADD ESP,BYTE +0C
016F:0041CA97 INC EDI
016F:0041CA98 CMP EDI,BYTE +03
016F:0041CA9B JL 0041CA88 //循环3次
016F:0041CA9D XOR DWORD [EBP-74],81079516 //变换结果于81079516异或
016F:0041CAA4 MOV EDX,[EBP-74]
016F:0041CAA7 LEA EAX,[EBP-04]
016F:0041CAAA ADD [EBP-78],EDX
016F:0041CAAD CALL 0055C4F0
016F:0041CAB2 SUB [EBP-78],EAX
016F:0041CAB5 MOV EAX,ESI
016F:0041CAB7 CALL 0041C428 //由用户名和硬盘ID号生成一个数
016F:0041CABC SUB [EBP-78],EAX //减异或结果
016F:0041CABF CMP DWORD [EBP-78],BYTE +00 //为0吗
016F:0041CAC3 JNZ NEAR 0041CC89 //跳就死
016F:0041CAC9 MOV EDX,80000002 //下面还有一处比较和这里基本一样
-----------------------------------------------------------------------
在0041CA8F处按F8来到这里

016F:0041C794 PUSH EBP
016F:0041C795 MOV EBP,ESP
016F:0041C797 ADD ESP,FFFFFDFC
016F:0041C79D PUSH EBX
016F:0041C79E PUSH ESI
016F:0041C79F MOV ECX,[EBP+10]
016F:0041C7A2 XOR EAX,EAX
016F:0041C7A4 LEA ESI,[EBP+FFFFFDFC]
016F:0041C7AA MOV EDX,[EBP+0C]
016F:0041C7AD CMP ECX,EAX
016F:0041C7AF JNG 0041C7DD
016F:0041C7B1 MOV BL,[EDX]
016F:0041C7B3 MOV [EBP-01],BL
016F:0041C7B6 LEA EBX,[ECX-01]
016F:0041C7B9 CMP EAX,EBX
016F:0041C7BB JNZ 0041C7C7
016F:0041C7BD MOV EBX,[EBP+0C]
016F:0041C7C0 MOV BL,[EBX]
016F:0041C7C2 MOV [EBP-02],BL
016F:0041C7C5 JMP SHORT 0041C7CD
016F:0041C7C7 MOV BL,[EDX+01]
016F:0041C7CA MOV [EBP-02],BL
016F:0041C7CD SHL WORD [EBP-02],1 //运算核心
016F:0041C7D1 MOV BL,[EBP-01]
016F:0041C7D4 MOV [ESI],BL
016F:0041C7D6 INC EAX
016F:0041C7D7 INC ESI
016F:0041C7D8 INC EDX
016F:0041C7D9 CMP ECX,EAX
016F:0041C7DB JG 0041C7B1
016F:0041C7DD MOV BYTE [EBP+EAX+FFFFFDFC],00
016F:0041C7E5 XOR EAX,EAX
016F:0041C7E7 MOV EDX,[EBP+0C]
016F:0041C7EA MOV ESI,EDX
016F:0041C7EC LEA EDX,[EBP+FFFFFDFC]
016F:0041C7F2 CMP ECX,EAX
016F:0041C7F4 JNG 0041C801
016F:0041C7F6 MOV BL,[EDX]
016F:0041C7F8 MOV [ESI],BL
016F:0041C7FA INC EAX
016F:0041C7FB INC ESI
016F:0041C7FC INC EDX
016F:0041C7FD CMP ECX,EAX
016F:0041C7FF JG 0041C7F6
016F:0041C801 LEA EAX,[EBP+FFFFFDFC]
016F:0041C807 POP ESI
016F:0041C808 POP EBX
016F:0041C809 MOV ESP,EBP
016F:0041C80B POP EBP
--------------------------------------------------------------------
运算过程：
假码：12345678 //必须是8位

7856 5634 3412 1278
左移1位 f0 ac 68 24 //只取高8位
结果：2468acf0
f0ac ac68 6824 24f0
左移1位 e1 58 d0 49
结果 : 49d058e1
e158 58d0 d049 49e1
左移1位 c2 b1 a0 93
结果 : 93a0b1c2

***********************那位大客帮帮忙写出注册机**********************
这里先谢了！！！

标 题:试说炒股理财1.65注册码分析 (316字)
发信人:小楼
时 间:2001-4-11 22:33:03
详细信息:

对于炒股理财1.65版注册码
1. 注册码为8位, 0....9, a...f取值,(1)(2)(3)(4)(5)(6)(7)(8)
2. 取(1)(2)数字,shl 1, 如是(3)(4),... (7)(8) shl 1
这样三次得到一组数字(高端8位+低端8位)
3. 将低端8位数字与81079516异或(bpx cs:41f2b1)
4. 利用用户名及机器码(好象与硬盘序号相关)得到8位数字,如果二者相等,注册成功(bpx cs:41f200)


炒股理财1.65

标 题:炒股理财1.65破解方法 (8千字)
发信人:parrot
时 间:2001-4-13 8:59:18
详细信息:
            炒股理财1.65破解方法

    炒股理财1.63用的是ASPROTECT，而1.65用的却是ASPACK，只要我们找到了关键点说可以用内存补丁破解了。
  下面是我分析的结果，感兴趣的朋友可以看看。（希望那位－＝1212＝－不要再跟我过不去了。）

PART A 30天时间限制。
PART B 注册时的关键点。
   PART C 启动是的注册码。
   PART D 显示关于时的注册码校验。

＝＝＝＝＝＝＝＝＝＝< PART A >＝＝＝＝＝＝＝＝＝＝＝＝＝

0167:0040B117 8BC6 MOV EAX,ESI
0167:0040B119 E86AEEFFFF CALL 00409F88
0167:0040B11E 80BEB005000000 CMP BYTE PTR [ESI+000005B0],00 ;关键！当[ESI+5B0]=0时可以跳过未注册窗口。
0167:0040B125 0F85EA010000 JNZ 0040B315 ;这里改成JMP　0040b315
0167:0040B12B 837D841E CMP DWORD PTR [EBP-7C],1E ;30天的时间限制
0167:0040B12F 0F8EE0010000 JLE 0040B315
0167:0040B135 8B8694030000 MOV EAX,[ESI+00000394]
0167:0040B13B E8DCE00C00 CALL 004D921C
0167:0040B140 E823E61300 CALL 00549768
0167:0040B145 DD9D48FFFFFF FSTP REAL8 PTR [EBP-00B8]
0167:0040B14B DD8548FFFFFF FLD REAL8 PTR [EBP-00B8]
0167:0040B151 D82538B34000 FSUB REAL4 PTR [0040B338]
0167:0040B157 DD9D40FFFFFF FSTP REAL8 PTR [EBP-00C0]
0167:0040B15D 8B9540FFFFFF MOV EDX,[EBP-00C0]
0167:0040B163 8D8D38FFFFFF LEA ECX,[EBP-00C8]
0167:0040B169 899538FFFFFF MOV [EBP-00C8],EDX
0167:0040B16F 8D45D4 LEA EAX,[EBP-2C]
0167:0040B172 8B9544FFFFFF MOV EDX,[EBP-00BC]
0167:0040B178 89953CFFFFFF MOV [EBP-00C4],EDX
0167:0040B17E BAA3255600 MOV EDX,005625A3
0167:0040B183 DD01 FLD REAL8 PTR [ECX]
0167:0040B185 DD9D50FFFFFF FSTP REAL8 PTR [EBP-00B0]
0167:0040B18B 66C745A86800 MOV WORD PTR [EBP-58],0068 
0167:0040B191 E86E411500 CALL 0055F304  

＝＝＝＝＝＝＝＝＝＝＝<　PART　B　>＝＝＝＝＝＝＝＝＝＝＝＝

0167:0041F2BE 015588 ADD [EBP-78],EDX
0167:0041F2C1 E83E021400 CALL 0055F504
0167:0041F2C6 294588 SUB [EBP-78],EAX
0167:0041F2C9 8BC6 MOV EAX,ESI
0167:0041F2CB E8F0F8FFFF CALL 0041EBC0 ;注册时的关键，里面的算法。F8进入
0167:0041F2D0 294588 SUB [EBP-78],EAX ;算出的EAX值与[EBP－78]相减。
0167:0041F2D3 837D8800 CMP DWORD PTR [EBP-78],00 ;比较[EBP-78]是否为00
0167:0041F2D7 0F85C0010000 JNZ 0041F49D ;正确则会跳至41F49D,也就是注册成功窗口。
0167:0041F2DD BA02000080 MOV EDX,80000002
0167:0041F2E2 8BC3 MOV EAX,EBX
0167:0041F2E4 E887FF1300 CALL 0055F270
0167:0041F2E9 66C745A05000 MOV WORD PTR [EBP-60],0050
0167:0041F2EF BA42D95600 MOV EDX,0056D942
0167:0041F2F4 8D45DC LEA EAX,[EBP-24]
0167:0041F2F7 E808001400 CALL 0055F304
0167:0041F2FC FF45AC INC DWORD PTR [EBP-54]
0167:0041F2FF 8B10 MOV EDX,[EAX]
0167:0041F301 B101 MOV CL,01
0167:0041F303 8BC3 MOV EAX,EBX
＝＝＝＝＝＝＝＝<　PART C >==================

0167:00402498 8B9538FFFFFF MOV EDX,[EBP-00C8]
0167:0040249E 8D45FC LEA EAX,[EBP-04] 
0167:004024A1 019530FFFFFF ADD [EBP-00D0],EDX
0167:004024A7 E858D01500 CALL 0055F504
0167:004024AC 298530FFFFFF SUB [EBP-00D0],EAX
0167:004024B2 8B15F4A35700 MOV EDX,[0057A3F4]
0167:004024B8 8B02 MOV EAX,[EDX]
0167:004024BA E801C70100 CALL 0041EBC0 ;F8进入，里面有软件启动时的注册码算法。
0167:004024BF 298530FFFFFF SUB [EBP-00D0],EAX ;EAX与[EBP-00D0]相减。
0167:004024C5 0FB797AC050000 MOVZX EDX,WORD PTR [EDI+000005AC]
0167:004024CC 299530FFFFFF SUB [EBP-00D0],EDX ;EDX与[EBP-00D0]相减。
0167:004024D2 83BD30FFFFFF00 CMP DWORD PTR [EBP-00D0],00 ;关键，比较[EBP-00D0]是否为0
0167:004024D9 0F95C2 SETNZ DL ;设标志,正确时DL=0
0167:004024DC 83E201 AND EDX,01
0167:004024DF 8B8744030000 MOV EAX,[EDI+00000344]
0167:004024E5 E852B20E00 CALL 004ED73C
0167:004024EA 8BC3 MOV EAX,EBX
0167:004024EC E85B6B0E00 CALL 004E904C
0167:004024F1 83BD30FFFFFF00 CMP DWORD PTR [EBP-00D0],00
0167:004024F8 7507 JNZ 00402501
0167:004024FA C687B005000001 MOV BYTE PTR [EDI+000005B0],01
0167:00402501 66C746108C00 MOV WORD PTR [ESI+10],008C 
0167:00402507 BA87195600 MOV EDX,00561987  

＝＝＝＝＝＝＝＝＝< PART D >＝＝＝＝＝＝＝＝＝＝＝＝

0167:004203E0 E81FF11300 CALL 0055F504
0167:004203E5 294580 SUB [EBP-80],EAX 
0167:004203E8 8B15F4A35700 MOV EDX,[0057A3F4]
0167:004203EE 8B02 MOV EAX,[EDX]
0167:004203F0 E8CBE7FFFF CALL 0041EBC0 ;显示关于时的注册码校验算法与注册的是一样的。
0167:004203F5 294580 SUB [EBP-80],EAX
0167:004203F8 8BC7 MOV EAX,EDI
0167:004203FA E84D8C0C00 CALL 004E904C
0167:004203FF 837D8000 CMP DWORD PTR [EBP-80],00
0167:00420403 0F85B3000000 JNZ 004204BC ;不跳时显示注册成功，并显示注册人和名字。
0167:00420409 66C746105000 MOV WORD PTR [ESI+10],0050
0167:0042040F BA3DE65600 MOV EDX,0056E63D
0167:00420414 8D45E0 LEA EAX,[EBP-20]
0167:00420417 E8E8EE1300 CALL 0055F304
0167:0042041C FF461C INC DWORD PTR [ESI+1C]
0167:0042041F 8B10 MOV EDX,[EAX]
0167:00420421 8BC7 MOV EAX,EDI
0167:00420423 E8D48E0C00 CALL 004E92FC
0167:00420428 FF4E1C DEC DWORD PTR [ESI+1C]
0167:0042042B 8D45E0 LEA EAX,[EBP-20]
0167:0042042E BA02000000 MOV EDX,00000002
0167:00420433 E840EF1300 CALL 0055F378 
0167:00420438 66C746105C00 MOV WORD PTR [ESI+10],005C  

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

        欢迎光临我的网站: g f h . 6 to 23 .c o m

gfh
2001.4.13


大英自学辅导

 标 题:穷人帮穷人--大英自学辅导的破解过程和注册码---请进！ (1千字)
发信人:hsf
时 间:2001-4-28 16:43:48
详细信息:
昨晚看到这个贴子，就去下载了。可能晚上状态不好，呵呵呵，没搞定。中午起床后，操刀重来。
:bpx hmemcpy
ctrl+N
:bc
:pmodule
F12
game over!
连一次F12都不让我按，真变态！
只好换F10了，
跟到4087c3处，有jz 4087e2,不跳，执行call 4079e0,出错！
:r fl z=1 （不记得了，反正改成相反的就是了）
改变流程，结果是又返回等待你按“确定”。不能改！！！
那就跟进call 4079e0
跟哪跟，在407e4e到407e65处有一段很可疑，
具体的不记得了，写成文字形式是这样的
{
在address1取一个字符，放入register1
在address2取一个字符，放入register2
比较 reg1 和reg2
如果。。。就跳。。。（跳出这一段程序）
比较 reg1 和 3F
如果。。。就跳。。。
esi + 1
esi 与 0x11比较 （就是十进制的17）
如果小于0X11则 跳回407e4e
如果等于则跳到407f91
}
比较明显，esi中存放的是注册码的字符数，即长度。
查看address 处的string, 你猜是什么？
peisy.yeah.net 是作者的个人网页。不过只有14个字符。
ASCII码如下：
70 65 69 73 79 2e 79 65 61 68 2e 6e 65 74 00 02 00
^^^^^^^^
——————————————————这三位是为补满17位数
把address2处的
pesei1234567890pe （我正在喝百事可乐，就顺手把pesei写上去了）
改ASCII码为
70 65 69 73 79 2e 79 65 61 68 2e 6e 65 74 00 02 00
继续运行程序，一会儿就跳到别的领空了，（系统的领空），程序不见了。
呵呵呵，它结束了吧。
重新打开程序，直接出来了，没有要你注册才能进去的限制了。
这样我也没法再跟踪了。:-(
到另一台机器上，安装此软件，用
peisy.yeah.net***注册，成功。
后面三个*号代表 00 02 00 这三个ASCII码对应的字符。我是这样输入的，
Alt+000, Alt+002,Alt+000, 注意是加小键盘的数字键
我不知道要不要输后三位字符，因为这台机器上又已注册完毕，没法再试了。
不过，我想应该不输也行。因为我输入的时候看错了一个字符，我把02 看成0c了，
结果输入的时候输的是Alt+012 ( 0x0c=(012)10)
可是还是注册成功了。所以我猜想，只要输入前14位就可以了。
请要这个软件注册码的同学自己试试看吧。
好了，大功告成，打个Kiss!


登录奇兵3.01

 标 题:登录奇兵3.01破解手记 (1013字)
发信人:孙锋
时 间:2000-12-27 14:21:19
详细信息:
登录奇兵3.01破解手记
时间：2000年12月27日下午13:40
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
http://phy.qfnu.edu.cn/personal/~sffs/index.htm
工具
TRW2000

步骤：
1、启动登录奇兵3.01，选择注册项，随便输入注册信息
User Name: sunfeng
Register Key: 1212121212
2、载入TRW2000,Ctrl+N,呼叫出TRW2000,F5返回程序空间，点击确定。
3、被TRW2000拦截到，BD *万能中断，F12共计14次。
4、F10到下面位置：
0167:004A397A MOV EDX,[EBP+04]
0167:004A397D MOV EAX,EBX ;----------->D EDX，得到正确的注册码
;----------->PH34SERE8XSM
5、整理：
User Name: sunfeng
Register Key:PH34SERE8XSM

6、另外的注册码：
User Name----------------------------Register Key

孙锋--------------------------------PE7JN4RF3S71
番外地------------------------------PDTR43GJ26IG
我们没有钱所以我们用盗版------------PD94HYR149OG

7、完成注册。

<-----------完---------->


登陆奇兵3.0

 标 题:登陆奇兵3.0破解心得 (5千字)
发信人:小球[CCG]
时 间:2001-5-2 12:06:56
详细信息:
登陆奇兵3.0破解心得
下载地址：
http://software.tiandown.com/downsoft.asp?id=4013&locate=http://download2.tiandown.com/pub/software/internet/int-prom/addurl301.exe
这个软件的注册方法还是比较有趣的，也很简单，欢迎初学者试试！
他是有时间限制的，only 30 days。检查一下，加了壳，还好用caspr1012可以很容易的脱掉！来到注册处输入名字、注册码。
zzglf[CCG]
1234567890
下断bpx hmemcpy
pmodule
到这儿：
:00436688 E8FB11FDFF Call 00407888
:0043668D 89430C mov dword ptr [ebx+0C], eax **停到这儿
按F10向下走
:004A39F3 B9183C4A00 mov ecx, 004A3C18 **这里看到注册码
:004A39F8 5A pop edx
:004A39F9 E84EFDFFFF call 004A374C **F8进入
:004A39FE 84C0 test al, al
:004A3A00 0F8487010000 je 004A3B8D
* Referenced by a CALL at Address:
|:004A39F9
|
:004A374C 55 push ebp
:004A374D 8BEC mov ebp, esp
:004A374F 83C4EC add esp, FFFFFFEC
:004A3752 53 push ebx
:004A3753 56 push esi
:004A3754 33DB xor ebx, ebx
:004A3756 895DEC mov dword ptr [ebp-14], ebx
:004A3759 894DF4 mov dword ptr [ebp-0C], ecx
:004A375C 8955F8 mov dword ptr [ebp-08], edx
:004A375F 8945FC mov dword ptr [ebp-04], eax
:004A3762 8B45FC mov eax, dword ptr [ebp-04]
:004A3765 E8E209F6FF call 0040414C
:004A376A 8B45F8 mov eax, dword ptr [ebp-08]
:004A376D E8DA09F6FF call 0040414C
:004A3772 8B45F4 mov eax, dword ptr [ebp-0C]
:004A3775 E8D209F6FF call 0040414C
:004A377A 33C0 xor eax, eax
:004A377C 55 push ebp
:004A377D 6830384A00 push 004A3830
:004A3782 64FF30 push dword ptr fs:[eax]
:004A3785 648920 mov dword ptr fs:[eax], esp
:004A3788 C645F300 mov [ebp-0D], 00
:004A378C 8D4DEC lea ecx, dword ptr [ebp-14]
:004A378F 8B55F4 mov edx, dword ptr [ebp-0C]
:004A3792 8B45F8 mov eax, dword ptr [ebp-08]
:004A3795 E81EFEFFFF call 004A35B8

* Possible StringData Ref from Code Obj ->"5138"
|
:004A379A A14C6A5200 mov eax, dword ptr [00526A4C] **这里可以看到奇怪数字：9452
:004A379F 0FB600 movzx eax, byte ptr [eax]
:004A37A2 8B5DEC mov ebx, dword ptr [ebp-14]
:004A37A5 8A5C03CF mov bl, byte ptr [ebx+eax-31]
:004A37A9 8B75FC mov esi, dword ptr [ebp-04] **这里是真正的注册码：P3GR4IHZKF79
:004A37AC 3A5C06CF cmp bl, byte ptr [esi+eax-31] **比较
:004A37B0 755B jne 004A380D **不等就跳到出错处

* Possible StringData Ref from Code Obj ->"5138"
|
:004A37B2 A14C6A5200 mov eax, dword ptr [00526A4C]
:004A37B7 33D2 xor edx, edx
:004A37B9 8A5001 mov dl, byte ptr [eax+01]
:004A37BC 8B45EC mov eax, dword ptr [ebp-14]
:004A37BF 8A4410CF mov al, byte ptr [eax+edx-31]
:004A37C3 8B5DFC mov ebx, dword ptr [ebp-04]
:004A37C6 3A4413CF cmp al, byte ptr [ebx+edx-31]
:004A37CA 7541 jne 004A380D **不等就跳到出错处

* Possible StringData Ref from Code Obj ->"5138"
|
:004A37CC A14C6A5200 mov eax, dword ptr [00526A4C]
:004A37D1 33C9 xor ecx, ecx
:004A37D3 8A4802 mov cl, byte ptr [eax+02]
:004A37D6 8B45EC mov eax, dword ptr [ebp-14]
:004A37D9 8A4408CF mov al, byte ptr [eax+ecx-31]
:004A37DD 8B55FC mov edx, dword ptr [ebp-04]
:004A37E0 3A440ACF cmp al, byte ptr [edx+ecx-31]
:004A37E4 7527 jne 004A380D **不等就跳到出错处

* Possible StringData Ref from Code Obj ->"5138"
|
:004A37E6 A14C6A5200 mov eax, dword ptr [00526A4C]
:004A37EB 0FB64003 movzx eax, byte ptr [eax+03]
:004A37EF 8B55EC mov edx, dword ptr [ebp-14]
:004A37F2 8A4402CF mov al, byte ptr [edx+eax-31]

* Possible StringData Ref from Code Obj ->"5138"
|
:004A37F6 8B154C6A5200 mov edx, dword ptr [00526A4C]
:004A37FC 0FB65203 movzx edx, byte ptr [edx+03]
:004A3800 8B4DFC mov ecx, dword ptr [ebp-04]
:004A3803 3A4411CF cmp al, byte ptr [ecx+edx-31]
:004A3807 7504 jne 004A380D >**不等就跳到出错处
:004A3809 C645F301 mov [ebp-0D], 01 **注册标志置成1

那么那个奇怪的数字9452是什么意思呢？原来它不是将整个的真假注册码相比较，而是采用位置来比较，也就是9452的意思。即
zzglf[CCG]
*3*R4***K***
|
那个2
*3*R4***K***
|
那个4
*3*R4***K***
|
那个5
*3*R4***K***
|
那个9
呵呵...你试试。至于这个9452当然是由我填的用户名生成的，如果你输入zzglf那么生成的就是4756。你试试输入1试试....呵呵!
哦，对了，在你正确注册以后，他会在你的windows目录下生成一个winzips32.ini文件，来记录你的注册信息！我的如下：
[Registry]
Addurl=2711
RegisterDate=243
Username=zzglf[CCG]
id=hEfftoDEl
nextstep=3644
Control=01-4-28


电脑室网吧集中管理软件

 标 题:我写了！别打我！！！！ (7千字)
发信人:小球[CCG]
时 间:2001-6-22 15:23:21
详细信息:
电脑室网吧集中管理软件破解过程。
crack:小球[CCG]
前言：终于和CCG的大师哥罗降神联系上了，没有想到一上来就考验老弟！呵呵......还好..搞定！
peterchen发话了，多写过程！好吧，写个简单的。不费时间又可以应付工作！
开始吧！
首先了解一下他是怎么保护的，有壳？先不要管它，不脱壳一样可以追到注册码！最糟的是它的注册方式，嘿嘿...为了防止破解，它来个先注册后判断，很是流行的注册方式哦！不管了，死马当活马医！来到注册处，看到有机器码？不好办哦！一机一码？写个注册机？想的太远了，先看看你能不能读懂算法吧！输入你的注册码，机器码是六位的我就输入六位的，不行再改嘛？改完再犯嘛！千锤百炼嘛！
下断：bpx hmemcpy
点击“填好了”程序立刻被中断。
命令：bc*
命令：pomdule
来到程序的内存空间！
按几下F10来到：
:00438823 89430C mov dword ptr [ebx+0C], eax *****停在这儿！！！

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004387C6(U), :00438805(U)
|
:00438826 8B03 mov eax, dword ptr [ebx]
:00438828 83F80C cmp eax, 0000000C
:0043882B 751B jne 00438848
:0043882D 8B5308 mov edx, dword ptr [ebx+08]
:00438830 52 push edx
:00438831 8B4B04 mov ecx, dword ptr [ebx+04]
:00438834 8BD0 mov edx, eax
:00438836 8BC6 mov eax, esi
:00438838 E8AFBEFFFF call 004346EC
:0043883D EB09 jmp 00438848

一直按F10直到你看见有用的东东：
:004EBD3A 8B45D4 mov eax, dword ptr [ebp-2C] *****这里看到了你输入的注册码！！
:004EBD3D E85684F1FF call 00404198 *****注册码长度！
:004EBD42 48 dec eax
:004EBD43 0F8CD2010000 jl 004EBF1B
:004EBD49 8D45F4 lea eax, dword ptr [ebp-0C]
:004EBD4C E8C781F1FF call 00403F18
:004EBD51 B201 mov dl, 01
:004EBD53 A164E04700 mov eax, dword ptr [0047E064]
:004EBD58 E80724F9FF call 0047E164
:004EBD5D 8945F8 mov dword ptr [ebp-08], eax
:004EBD60 BA02000080 mov edx, 80000002
:004EBD65 8B45F8 mov eax, dword ptr [ebp-08]
:004EBD68 E89724F9FF call 0047E204
:004EBD6D B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"software\microsoft\jingzu"
|
:004EBD6F BA78BF4E00 mov edx, 004EBF78
:004EBD74 8B45F8 mov eax, dword ptr [ebp-08]
:004EBD77 E8EC24F9FF call 0047E268
:004EBD7C 84C0 test al, al
:004EBD7E 0F84DE000000 je 004EBE62
:004EBD84 8D55D0 lea edx, dword ptr [ebp-30]
:004EBD87 8B45FC mov eax, dword ptr [ebp-04]
:004EBD8A 8B8064040000 mov eax, dword ptr [eax+00000464]
:004EBD90 E8578DF4FF call 00434AEC
:004EBD95 8B55D0 mov edx, dword ptr [ebp-30] ***这里又看到了假的注册码，赶快下断：bpm 012**** （假的注册码地址）以免它溜掉！好了放心的按F10吧！也许你会突然的来到这儿：
:004D4F66 8B45F0 mov eax, dword ptr [ebp-10] ****eax里就是你的假的注册码的第一位！
:004D4F69 8B55F8 mov edx, dword ptr [ebp-08] ****edx里是什么？好像是个‘*’嗯！有问题。所以嘛，下一个CALL一定要进入！F8
:004D4F6C E837F3F2FF call 004042A8 ***就是这个！
:004D4F71 7505 jne 004D4F78
:004D4F73 895DF4 mov dword ptr [ebp-0C], ebx
:004D4F76 EB04 jmp 004D4F7C

由上面的call来的：
:004042A8 53 push ebx
:004042A9 56 push esi
:004042AA 57 push edi
:004042AB 89C6 mov esi, eax
:004042AD 89D7 mov edi, edx
:004042AF 39D0 cmp eax, edx ****看到了吗？它两个比较了！由此判断注册码的第一位可能是‘*’！
:004042B1 0F848F000000 je 00404346 ****这个嘛！经过反复的研究，没有什么关系，不要管他。因为如果你输入的第一位是‘*’的话，它也是不跳的！但是爆破的时候千万不要改动哦。因为它会被其他的CALL调用的！
:004042B7 85F6 test esi, esi
:004042B9 7468 je 00404323
:004042BB 85FF test edi, edi
:004042BD 746B je 0040432A
:004042BF 8B46FC mov eax, dword ptr [esi-04]
:004042C2 8B57FC mov edx, dword ptr [edi-04]
:004042C5 29D0 sub eax, edx
:004042C7 7702 ja 004042CB
:004042C9 01C2 add edx, eax
继续按F10，注意期间的变化，多用D命令。
:004EBDF2 55 push ebp
:004EBDF3 6818BE4E00 push 004EBE18
:004EBDF8 64FF30 push dword ptr fs:[eax]
:004EBDFB 648920 mov dword ptr fs:[eax], esp
:004EBDFE 8B45F4 mov eax, dword ptr [ebp-0C] ****例如这里就是有问题！你看看？好像没有第一位。对嘛？第一位刚才不是比较过了吗？呵呵.....就是吗！
:004EBE01 E8AAD2F1FF call 004090B0 ****这个CALL是把它转化成十六进制的形式！哦！你是怎么直到的？你用命令：‘？’看看不就知道了？
:004EBE06 8BD8 mov ebx, eax
:004EBE08 81F326750000 xor ebx, 00007526 ****异或了。什么是异或？我倒......
:004EBE0E 33C0 xor eax, eax ****注意结果存放在哪？
:004EBE10 5A pop edx
:004EBE11 59 pop ecx
:004EBE12 59 pop ecx
:004EBE13 648910 mov dword ptr fs:[eax], edx
:004EBE16 EB0C jmp 004EBE24
:004EBE18 E9DF78F1FF jmp 004036FC
:004EBE1D 33DB xor ebx, ebx
:004EBE1F E8347CF1FF call 00403A58
按F10继续--

:004D1000 8BF1 mov esi, ecx ****快看把结果取回来了！
:004D1002 8BDA mov ebx, edx
:004D1004 33C0 xor eax, eax
:004D1006 55 push ebp
:004D1007 680E124D00 push 004D120E
:004D100C 64FF30 push dword ptr fs:[eax]
:004D100F 648920 mov dword ptr fs:[eax], esp
:004D1012 33D2 xor edx, edx
:004D1014 55 push ebp
:004D1015 68E2114D00 push 004D11E2
:004D101A 64FF32 push dword ptr fs:[edx]
:004D101D 648922 mov dword ptr fs:[edx], esp
:004D1020 C645FF00 mov [ebp-01], 00
:004D1024 8BC6 mov eax, esi ****eax你就是！注意了！
:004D1026 3526750000 xor eax, 00007526 ****又来了！
:004D102B 3535F19303 xor eax, 0393F135 ****还来？
:004D1030 8B15D44E4F00 mov edx, dword ptr [004F4ED4] *****猜猜edx里面是什么？
:004D1036 3B02 cmp eax, dword ptr [edx] *****比较真假了！
:004D1038 740D je 004D1047
:004D103A 33C0 xor eax, eax
:004D103C 5A pop edx
:004D103D 59 pop ecx
:004D103E 59 pop ecx
:004D103F 648910 mov dword ptr fs:[eax], edx
:004D1042 E9AC010000 jmp 004D11F3

到次已经搞定了！继续跟下去也行，可以看到他是怎么存放你的注册信息的！放到你的C:\windows\system下面，文件名是SR***.dat（***是你的网上邻居的标示！）
至于算码嘛？很是简单！伪装者老兄哪去了！快来.....搞定他。
至于爆破嘛？很是简单！******老兄哪去了！快来.....搞定他。
爆破的修改点就是上面所说的，可是启动时的检测在哪？试试：4d125b？你是怎么知道的？呵呵.....不告诉你！

我的破解版下载：http://www.cn778.net

cracker：小球[CCG]
2001.6.22


电脑幽灵pcGhost4.0

标 题:电脑幽灵pcGhost4.0破解实录 (7千字)
发信人:风飘雪
时 间:2001-3-7 22:10:16
详细信息:
电脑幽灵pcGhost4.0破解实录

大小392k
http://www.sunhy.com/download/pcGhost.zip
pcGhost默认的热键为Alt+F12(1秒中连按两次),与traceboy类似
工具:Trw2000
注册码aaaa-bbbb形式,中间有个-,总长度大于12
前半部分相当于"用户名",后办部分相当于"注册码"
注册码填gdong-1234567 ctrl+n激活Trw2000
bpx hmemcpy
go
点确定,被拦
bc *
pmodule
停在 (1)处

0167:00430BEE E83168FDFF CALL `USER32!CallWindowProcA`
0167:00430BF3 89430C MOV [EBX+0C],EAX <====由此出来 (1)
0167:00430BF6 8B03 MOV EAX,[EBX]
0167:00430BF8 83F80C CMP EAX,BYTE +0C <====长度大于12
0167:00430BFB 751B JNZ 00430C18
0167:00430BFD 8B5308 MOV EDX,[EBX+08]
0167:00430C00 52 PUSH EDX
0167:00430C01 8B4B04 MOV ECX,[EBX+04]
0167:00430C04 8BD0 MOV EDX,EAX
0167:00430C06 8BC6 MOV EAX,ESI
0167:00430C08 E88FBEFFFF CALL 0042CA9C
0167:00430C0D EB09 JMP SHORT 00430C18
0167:00430C0F 8BD3 MOV EDX,EBX
0167:00430C11 8BC6 MOV EAX,ESI
0167:00430C13 E844D4FFFF CALL 0042E05C
0167:00430C18 5D POP EBP
0167:00430C19 5F POP EDI
0167:00430C1A 5E POP ESI
0167:00430C1B 5B POP EBX
0167:00430C1C C3 RET

按F10直到如下代码段
0167:00477033 8D45FC LEA EAX,[EBP-04]
0167:00477036 50 PUSH EAX ****
0167:00477037 33C9 XOR ECX,ECX
0167:00477039 BAF8714700 MOV EDX,004771F8
0167:0047703E B810724700 MOV EAX,00477210
0167:00477043 E8F898FDFF CALL 00450940
0167:00477048 837DFC00 CMP DWORD [EBP-04],BYTE +00
0167:0047704C 0F84D3000000 JZ NEAR 00477125
0167:00477052 8D85F8FEFFFF LEA EAX,[EBP+FFFFFEF8]
0167:00477058 8B55FC MOV EDX,[EBP-04]
0167:0047705B B9FF000000 MOV ECX,FF
0167:00477060 E8B7CDF8FF CALL 00403E1C
0167:00477065 8D85F8FEFFFF LEA EAX,[EBP+FFFFFEF8] ***
0167:0047706B E814C3FFFF CALL 00473384 ***==>F8追入
0167:00477070 84C0 TEST AL,AL ***
0167:00477072 0F84AD000000 JZ NEAR 00477125 ***
0167:00477078 B201 MOV DL,01

追进来到下面
0167:00473384 55 PUSH EBP
0167:00473385 8BEC MOV EBP,ESP
0167:00473387 81C4ECFCFFFF ADD ESP,FFFFFCEC
0167:0047338D 53 PUSH EBX
0167:0047338E 56 PUSH ESI
0167:0047338F 57 PUSH EDI
0167:00473390 33D2 XOR EDX,EDX
0167:00473392 8995F0FCFFFF MOV [EBP+FFFFFCF0],EDX
0167:00473398 8995ECFCFFFF MOV [EBP+FFFFFCEC],EDX
0167:0047339E 8995F8FCFFFF MOV [EBP+FFFFFCF8],EDX
0167:004733A4 8995F4FCFFFF MOV [EBP+FFFFFCF4],EDX
0167:004733AA 8BF0 MOV ESI,EAX
0167:004733AC 8DBDFFFEFFFF LEA EDI,[EBP+FFFFFEFF]
0167:004733B2 33C9 XOR ECX,ECX
0167:004733B4 8A0E MOV CL,[ESI]
0167:004733B6 41 INC ECX
0167:004733B7 F3A4 REP MOVSB
0167:004733B9 33C0 XOR EAX,EAX
0167:004733BB 55 PUSH EBP
0167:004733BC 68EC344700 PUSH DWORD 004734EC
0167:004733C1 64FF30 PUSH DWORD [FS:EAX]
0167:004733C4 648920 MOV [FS:EAX],ESP
0167:004733C7 C645FF00 MOV BYTE [EBP-01],00
0167:004733CB 8D85F4FCFFFF LEA EAX,[EBP+FFFFFCF4]
0167:004733D1 8D95FFFEFFFF LEA EDX,[EBP+FFFFFEFF]
0167:004733D7 E8080AF9FF CALL 00403DE4
0167:004733DC 8B85F4FCFFFF MOV EAX,[EBP+FFFFFCF4]
0167:004733E2 8D95F8FCFFFF LEA EDX,[EBP+FFFFFCF8]
0167:004733E8 E8EF58F9FF CALL 00408CDC
0167:004733ED 8B95F8FCFFFF MOV EDX,[EBP+FFFFFCF8]
0167:004733F3 8D85FFFEFFFF LEA EAX,[EBP+FFFFFEFF]
0167:004733F9 B9FF000000 MOV ECX,FF
0167:004733FE E8190AF9FF CALL 00403E1C
0167:00473403 33DB XOR EBX,EBX
0167:00473405 C685FFFDFFFF00 MOV BYTE [EBP+FFFFFDFF],00
0167:0047340C C685FFFCFFFF00 MOV BYTE [EBP+FFFFFCFF],00
0167:00473413 8D95FFFEFFFF LEA EDX,[EBP+FFFFFEFF]
0167:00473419 B800354700 MOV EAX,00473500
0167:0047341E E8A1F5F8FF CALL 004029C4 判断输入注册码是否aaaa-bbbb形式
0167:00473423 8BF0 MOV ESI,EAX
0167:00473425 85F6 TEST ESI,ESI
0167:00473427 0F8EA1000000 JNG NEAR 004734CE ===> 天堂之门
0167:0047342D 8D85FFFDFFFF LEA EAX,[EBP+FFFFFDFF]
0167:00473433 50 PUSH EAX
0167:00473434 8BCE MOV ECX,ESI
0167:00473436 49 DEC ECX
0167:00473437 BA01000000 MOV EDX,01
0167:0047343C 8D85FFFEFFFF LEA EAX,[EBP+FFFFFEFF]
0167:00473442 E8E1F3F8FF CALL 00402828
0167:00473447 8D85FFFCFFFF LEA EAX,[EBP+FFFFFCFF]
0167:0047344D 50 PUSH EAX
0167:0047344E 33C9 XOR ECX,ECX
0167:00473450 8A8DFFFEFFFF MOV CL,[EBP+FFFFFEFF]
0167:00473456 2BCE SUB ECX,ESI
0167:00473458 8D5601 LEA EDX,[ESI+01]
0167:0047345B 8D85FFFEFFFF LEA EAX,[EBP+FFFFFEFF]
0167:00473461 E8C2F3F8FF CALL 00402828
0167:00473466 33D2 XOR EDX,EDX
0167:00473468 8A95FFFDFFFF MOV DL,[EBP+FFFFFDFF]
0167:0047346E 85D2 TEST EDX,EDX
0167:00473470 7E16 JNG 00473488
0167:00473472 8D8500FEFFFF LEA EAX,[EBP+FFFFFE00]
0167:00473478 33C9 XOR ECX,ECX
0167:0047347A 8A08 MOV CL,[EAX]
0167:0047347C 03D9 ADD EBX,ECX
0167:0047347E 81C3A41D0F00 ADD EBX,000F1DA4
0167:00473484 40 INC EAX
0167:00473485 4A DEC EDX
0167:00473486 75F0 JNZ 00473478
0167:00473488 8D85F0FCFFFF LEA EAX,[EBP+FFFFFCF0]
0167:0047348E 8D95FFFCFFFF LEA EDX,[EBP+FFFFFCFF]
0167:00473494 E84B09F9FF CALL 00403DE4
0167:00473499 8B85F0FCFFFF MOV EAX,[EBP+FFFFFCF0]
0167:0047349F 50 PUSH EAX **
0167:004734A0 8D95ECFCFFFF LEA EDX,[EBP+FFFFFCEC]
0167:004734A6 8BC3 MOV EAX,EBX
0167:004734A8 E8AF59F9FF CALL 00408E5C
0167:004734AD 8B95ECFCFFFF MOV EDX,[EBP+FFFFFCEC]
0167:004734B3 58 POP EAX ★★
0167:004734B4 E8970AF9FF CALL 00403F50 判断bbbb与上面用aaaa算出的
注册码是否相等(eax装1234567,edx装真码)
0167:004734B9 0F94C0 SETZ AL
0167:004734BC 80BD00FFFFFF61 CMP BYTE [EBP+FFFFFF00],61
0167:004734C3 0F93C2 SETNC DL
0167:004734C6 22C2 AND AL,DL
0167:004734C8 7404 JZ 004734CE
0167:004734CA C645FF01 MOV BYTE [EBP-01],01
0167:004734CE 33C0 XOR EAX,EAX
0167:004734D0 5A POP EDX
0167:004734D1 59 POP ECX
0167:004734D2 59 POP ECX
0167:004734D3 648910 MOV [FS:EAX],EDX
0167:004734D6 68F3344700 PUSH DWORD 004734F3
0167:004734DB 8D85ECFCFFFF LEA EAX,[EBP+FFFFFCEC]
0167:004734E1 BA04000000 MOV EDX,04
0167:004734E6 E8F906F9FF CALL 00403BE4
0167:004734EB C3 RET

★★处 d edx
edx=4953667
总结:我的注册码为 gdong-4953667
详细可参考看雪论坛精华2相关文章

作者：风飘雪
主页 http://duba.126.com
e-mail gd1@yeah.net

标 题:这样讲对吗？ (441字)
发信人:1212
时 间:2001-3-7 22:31:58
详细信息:

0167:00430BEE E83168FDFF CALL `USER32!CallWindowProcA`
0167:00430BF3 89430C MOV [EBX+0C],EAX <====由此出来 (1)
0167:00430BF6 8B03 MOV EAX,[EBX]
0167:00430BF8 83F80C CMP EAX,BYTE +0C <====长度大于12 //说这里是比较长度，1212不敢苟同^_^
0167:00430BFB 751B JNZ 00430C18
0167:00430BFD 8B5308 MOV EDX,[EBX+08]
0167:00430C00 52 PUSH EDX


电脑字体秀

标 题:电脑字体秀破解过程 (1千字)
发信人:小球
时 间:2001-3-18 16:35:04
详细信息:
URL http://www.embird.com/setup.exe
电脑字体秀破解过程
工具soft ice for win9x
来到注册框，输入名字：crack，注册码：1234567890
ctrl+d
bpx hmemcpy
点ok
程序被中断，按f12，12下（13下出错）再按f10
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479773(C)
|
:0047973E A1141E4900 mov eax, dword ptr [00491E14]
:00479743 8B00 mov eax, dword ptr [eax]
:00479745 8A4418FF mov al, byte ptr [eax+ebx-01]
:00479749 2C30 sub al, 30 *小写转大写
:0047974B 7415 je 00479762
:0047974D 2C26 sub al, 26
:0047974F 7520 jne 00479771
:00479751 A1141E4900 mov eax, dword ptr [00491E14]
:00479756 E83DA9F8FF call 00404098
:0047975B C64418FF55 mov [eax+ebx-01], 55
:00479760 EB0F jmp 00479771

* Possible StringData Ref from Code Obj ->?
|
:00479859 B844994700 mov eax, 00479944
:0047985E E829CCFEFF call 0046648C
:00479863 8B45E4 mov eax, dword ptr [ebp-1C] *这里用d edx可看到注册码，（用alt+方向键查看）
:00479866 668B0D10994700 mov cx, word ptr [00479910]
:0047986D B201 mov dl, 01
:0047986F E8ECBAFDFF call 00455360 *出错了
:00479874 8B87D4020000 mov eax, dword ptr [edi+000002D4]
:0047987A 8B10 mov edx, dword ptr [eax]
:0047987C FF92B0000000 call dword ptr [edx+000000B0]

软件搞定了，可是需求的人哪里去了！


电子收藏家4.0

标 题:国产新软破解实录(二) -- 电子收藏家4.0 (1千字)
发信人:风飘雪
时 间:2001-2-27 17:23:07
详细信息:
国产新软破解实录(二) -- 电子收藏家4.0

下载地址http://www.esoftware.com.cn/oload.php?url=ftp://ftp.eware.com.cn/pub/fmanager/other/DC400Inst.zip
1.脱壳反汇编分析,找关键call

串式参考"Invalid Register Number",来到如下代码处
:00541F72 EB15 jmp 00541F89

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00541EC3(C)
|************
:00541F74 8D55DC lea edx, dword ptr [ebp-24]

* Possible StringData Ref from Code Obj -> |
:00541F77 B820205400 mov eax, 00542020
:00541F7C E81BD5FDFF call 0051F49C

****号处双击鼠标右键
:00541EB8 8B45F4 mov eax, dword ptr [ebp-0C]
:00541EBB 5A pop edx
:00541EBC E88F2FFEFF call 00524E50 关键call
:00541EC1 84C0 test al, al 注册标志
:00541EC3 0F84AB000000 je 00541F74 出错跳转(*******)

2.trw2000载入,下断bpx 541ebc

用户名guodong 注册码123456789
F8追入call 00524e50(关键call)
按F10一直到下面(光条停在524f24时止))
0167:00524F1F MOV EDX,[EBP-1C]
0167:00524F22 MOV EAX,ESI
0167:00524F24 CALL 00404338
d eax eax=123456789(假码)
d edx edx=008FCDC1CF4E6B962A03DD4338E1B04A
这么长串的数字，抄下来的吗？？？不,我这样做.
trw2000中复制顶部窗口内容到文件里。
D range(范围) > filename
然后粘贴。

3.整理
用户名 guodong
注册码 008FCDC1CF4E6B962A03DD4338E1B04A

作者：风飘雪
主页http://duba.126.com
e-mail gd1@yeah.net


电子邮件地址搜索器

 标 题:简单破解：电子邮件地址搜索器------->高手莫入 (4千字)
发信人:Edea[BCG]
时 间:2001-6-19 22:48:56
详细信息:
软件名称：电子邮件地址搜索器
软件简介：收集电子邮件地址的软件。通过本软件收集的电子邮件地址全部是有效的。
软件下载：http://www.csdn.net/cnshare/soft/7/7589.html
破解难度：极易（适合菜鸟练习）
破解者：Edea[BCG] QQ：3849036

先用Fi分析，发现该软件没有加壳，为Delphi编写。
用WDASM反汇编，在反汇编的同时打开软件（呵呵，主要是为了节约时间），填入注册码：9876543210，弹出“注册码错误”的对话框。
在反汇编出的代码中我们找到这样一段：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047DF33(C)
|
:0047DF87 8B55F0 mov edx, dword ptr [ebp-10]
:0047DF8A 8D45F8 lea eax, dword ptr [ebp-08]
:0047DF8D E8B25BF8FF call 00403B44
:0047DF92 8D55E8 lea edx, dword ptr [ebp-18]
:0047DF95 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:0047DF9B E8981CFBFF call 0042FC38
:0047DFA0 8B45E8 mov eax, dword ptr [ebp-18]
:0047DFA3 8D55EC lea edx, dword ptr [ebp-14]
:0047DFA6 E871A2F8FF call 0040821C
:0047DFAB 8B55EC mov edx, dword ptr [ebp-14]
:0047DFAE 8B45F8 mov eax, dword ptr [ebp-08]
:0047DFB1 E8865EF8FF call 00403E3C
:0047DFB6 7536 jne 0047DFEE ------〉这里一跳就死翘翘了

* Possible StringData Ref from Code Obj ->"注册成功"
|
:0047DFB8 B854E04700 mov eax, 0047E054
:0047DFBD E87699FDFF call 00457938
:0047DFC2 8B45F8 mov eax, dword ptr [ebp-08]
:0047DFC5 50 push eax
:0047DFC6 8D45E4 lea eax, dword ptr [ebp-1C]
:0047DFC9 E8FEA7FEFF call 004687CC
:0047DFCE 8B45E4 mov eax, dword ptr [ebp-1C]

* Possible StringData Ref from Code Obj ->"RegistNo"
|
:0047DFD1 B968E04700 mov ecx, 0047E068

* Possible StringData Ref from Code Obj ->"Regist"
|
:0047DFD6 BA7CE04700 mov edx, 0047E07C
:0047DFDB E8DCA4FEFF call 004684BC

* Possible StringData Ref from Code Obj ->"已经注册"
|
:0047DFE0 BA8CE04700 mov edx, 0047E08C
:0047DFE5 8BC3 mov eax, ebx
:0047DFE7 E87C1CFBFF call 0042FC68
:0047DFEC EB18 jmp 0047E006

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047DFB6(C)
|

* Possible StringData Ref from Code Obj ->"注册码错误！"
|
:0047DFEE B8A0E04700 mov eax, 0047E0A0
:0047DFF3 E84099FDFF call 00457938
:0047DFF8 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:0047DFFE 8B10 mov edx, dword ptr [eax]
:0047E000 FF92B0000000 call dword ptr [edx+000000B0]

*********************************************************************************************

好了，打开TRW2000，下断点bpx 0047DF87,再随便填入注册码9876543210，点注册，被拦下，我们来到：

0177:0047DF87 MOV EDX,[EBP-10] ------>在这里我们看到程序把“AXAMBGWH”放入EDX，很可疑
0177:0047DF8A LEA EAX,[EBP-08] （你的有可能不是AXAMBGWH）
0177:0047DF8D CALL 00403B44
0177:0047DF92 LEA EDX,[EBP-18]
0177:0047DF95 MOV EAX,[EBX+02DC]
0177:0047DF9B CALL 0042FC38
0177:0047DFA0 MOV EAX,[EBP-18] ------>9876543210 => EAX
0177:0047DFA3 LEA EDX,[EBP-14]
0177:0047DFA6 CALL 0040821C
0177:0047DFAB MOV EDX,[EBP-14] ------>9876543210 => EDX
0177:0047DFAE MOV EAX,[EBP-08] ------>AXAMBGWH => EAX
0177:0047DFB1 CALL 00403E3C ------>跟入
0177:0047DFB6 JNZ 0047DFEE ------>跳则死
0177:0047DFB8 MOV EAX,0047E054
0177:0047DFBD CALL 00457938
0177:0047DFC2 MOV EAX,[EBP-08]
0177:0047DFC5 PUSH EAX

Call from 0047DFB1:
0177:00403E39 LEA EAX,[EAX+00]
0177:00403E3C PUSH EBX
0177:00403E3D PUSH ESI
0177:00403E3E PUSH EDI
0177:00403E3F MOV ESI,EAX
0177:00403E41 MOV EDI,EDX
0177:00403E43 CMP EAX,EDX ------>在这里我们看到程序拿AXAMBGWH和我的假注册码比较，嘿嘿，剩下的就不用我说了吧
0177:00403E45 JZ NEAR 00403EDA
0177:00403E4B TEST ESI,ESI
0177:00403E4D JZ 00403EB7
0177:00403E4F TEST EDI,EDI
0177:00403E51 JZ 00403EBE
0177:00403E53 MOV EAX,[ESI-04]

我的注册码：AXAMBGWH
这个软件的注册码是根据本机安装号码算出来的，所以你的注册码十有八九与我的不同
注册成功后，软件所在目录下出现一个名为System.sch的文件，储存你的注册码。

呵呵，一个星期没破软件了，随便拉一个来练练手。


斗地主

 标 题:大家一齐来斗地主啊！！！！ (3千字)
发信人:juniority
时 间:2001-5-27 11:32:10
详细信息:
哈哈，师父您好！小弟把这篇该死的发不出的文章上传来了！以下是正文：
大家好！小弟和在座各位一样，热衷于玩破解，但小弟只是初步接触破解不久，略知一二，不值一提。在小弟花了一个多星期时间学习中，居然有所收获，在此献丑，还望各位大侠多多指教，小弟感激不尽！嘻嘻…
好了，废话说了一大堆，下面就正式开始啦！
破解对象：斗地主游戏
破解工具：当然是有名的soft ice 啦！
难度：超级easy

第一步：运行“斗地主”游戏；找到要注册的地方；由于是要求输入中名名字，就随便啦，我用的是“大头宇”；然后在注册码填写处输入任意数，如“12121212…”，其实写什么数字都无所谓啦，又不是真的注册码，最紧要好记！

第二步：输入注册码后，不要急着按确定哦！（不然会后悔的！:-) ）按ctrl+d 键叫出soft ice，设定断点，我喜欢用“bpx hmemcpy”，（其实也只会用这一句，嘻嘻。）

第三步：按f5键返回注册处，按下确定键。是不是又出现了soft ice的窗口？是的话那就恭喜了，soft ice成功地把它拦截下来了，这就成功了一半啦！（吹水的。）输入指令bd *，使这个断点失效；

第四步：接下来就easy了，不断地按f12键吧，直到出现错误信息为止。这一步是不是好轻松，不过要把按的次数记下来啊！一下也不能少。我是在按第60下时出现错误信息的。如果数错了数，那就证明了这个世界上还有比我更笨的人，哈哈哈！

第五步：返回soft ice，输入be * 使所有断点恢复，也就是说重复第一步的动作。不要觉得麻烦啊！已经成功了一半啦，加油啦！不过在这之前最好先输入bc * 清除所有断点，不然soft ice又会跑出来拦截。

第六步：重复到第四步，按f12键时，输入比上一次按的次数少一下，即按到出错前的一下。我是按到59下。来到以下代码区；接着按f10键单步跟踪进去：
:0045F3DD 8BC6 mov eax, esi
:0045F3DF E84439FAFF call 00402D28 --------看到一个call ，留意啦！
:0045F3E4 803DB028460000 cmp byte ptr [004628B0], 00 --------超！只是作比较，不是！
:0045F3EB 746A je 0045F457
:0045F3ED 8D55F8 lea edx, dword ptr [ebp-08]
:0045F3F0 A1A8284600 mov eax, dword ptr [004628A8]
:0045F3F5 E8A2F5FEFF call 0044E99C --------又一个call，小心小心！
:0045F3FA A1AC284600 mov eax, dword ptr [004628AC] --------又不是，这是操作数转移。
:0045F3FF 50 push eax
:0045F400 8D45FC lea eax, dword ptr [ebp-04]
:0045F403 50 push eax
:0045F404 8B0DA4284600 mov ecx, dword ptr [004628A4]
:0045F40A 8B55F8 mov edx, dword ptr [ebp-08]
:0045F40D A144294600 mov eax, dword ptr [00462944]
:0045F412 E805EEFEFF call 0044E21C --------又来！
:0045F417 8D4DF4 lea ecx, dword ptr [ebp-0C] --------他奶奶的！
:0045F41A 8B55F8 mov edx, dword ptr [ebp-08]
:0045F41D 8B45FC mov eax, dword ptr [ebp-04]
:0045F420 E883F6FEFF call 0044EAA8
:0045F425 8B55F4 mov edx, dword ptr [ebp-0C]
:0045F428 8D45FC lea eax, dword ptr [ebp-04]
:0045F42B E81845FAFF call 00403948
:0045F430 A1A8284600 mov eax, dword ptr [004628A8]
:0045F435 8B55FC mov edx, dword ptr [ebp-04]
:0045F438 E8FF47FAFF call 00403C3C --------哼哼！终于找到了！
:0045F43D 740C je 0045F44B
:0045F43F A154294600 mov eax, dword ptr [00462954]
:0045F444 E84F3DFDFF call 00433198
单步跟踪的目的是：找出有问题的call。一般的语句结构为“ call… je”当遇上一个call时，就跳到另一个地方执行特定的程序。ok，我们用d eax来看看，是不是看到了先前输入的假注册码“12121212…”？好了！我们成功了！用d edx查看，就得到了真的注册码：MK1H 1TW2 E21D E0M4
这个软件是我的处女作，它的破解即不难又不易，比较适合初学者来实习开刀。希望我这篇拙作能够给初学的朋友们一些启示吧！加油哦！我也会继续写一些笨拙的破解心得（大家不要扔鸡蛋哦！拜托）请各位指点的。
文：Juniority


斗地主1.0

 标 题:破解斗地主1。0 (932字)
发信人:十三少
时 间:2000-9-5 14:04:19
详细信息:
斗地主1。0版
*** 下载地址：http://www.newhua.com.cn/down/LandOwner.zip
*** 破解难度：太容易(下载了之后才知道)
*** 破解关键：运行trw后，运行“斗地主”，填入注册信息之后，下
:bpx hmemcpy
:g
之后，按F12十数次来到如下代码：
015F:0045E7A2 MOV EAX,[EAX] //d eax (你输入的注册码)
015F:0045E7A4 MOV EDX,[EBP-04] //d edx (正确的注册码)
015F:0045E7A7 CALL 00403C20 //注册码比较部分
015F:0045E7AC JZ 0045E7BA //不跳则game over
015F:0045E7AE MOV EAX,[0046096C]
015F:0045E7B3 CALL 0043317C
015F:0045E7B8 JMP SHORT 0045E7C6
015F:0045E7BA MOV EAX,[00460954]
015F:0045E7BF CALL 0043317C
拿笔抄下注册码，去注册吧!
note:这种保护太简单，注册码直接可在内存中
找出!它的破解没什么大不了的，只要有耐心，初学者就可以搞定:)
注册信息保存在注册表:
HKEY_CURRENT_USER/SoftWare/Littlegrass/LandOwner

十三少
China Cracking Group
2000.09.05


五子棋3.22

 标 题:最近有事不能来，特发布五子棋3.22，推箱子1.54，斗地主1.1的破解以供初学练手。 (1千字)
发信人:backboy
时 间:2000-9-6 1:08:41
详细信息:
最近有事，有一段时间不能上网，现发布如下三个软件破解，供初学们练手。
难度等级：一般
一。五子棋3.22
下载：http://www.3q1.com/zip/Five.zip
一个可用注册码：
name:backboy
code:cZTJC4
注意事项：假码要为6位，程序有判断。
程序比较核心代码如下：
0137:004759ff lea eax,[ebp-012e] d eax可见真注册码
0137:00475a05 lea edx,[ebp-00c9] d edx可见假注册码
0137:00475a0b mov bl,[eax]
0137:00475a0d cmp bl,[edx] 比较注册码第一位
0137:00475a0f jz 00475a1a
0137:00475a11 mov byte ptr[0047d348],00 不等，flag为0
0137:00475a18 jmp 00475a1f 跳出比较
0137:00475a1a inc edx 取假码下一位
0137:00475a1b inc eax 取真码下一位
0137:00475a1c dec ecx 计数器减一
0137:00475a1d jnz 00475a0b 未比完返回继续比较

二。推箱子1.54
下载：http://www.3q1.com/zip/Cargador.zip
一个可用的注册码：
name:backboy
code:e\VLE6
注意事项：假码要为6位
程序比较核心代码如下：比较方式与上相同
0137:0040177f lea eax,[ebp-012e] D EAX可见真注册码
0137:00401785 lea edx,[ebp-00c9]
0137:0040178b mov bl,[eax]
0137:0040178d cmp bl,[edx]
0137:0040178f jz 0040179a
0137:00401791 mov byte ptr[0047493c],00
0137:00401798 jmp 0040179f
0137:0040179a inc edx
0137:0040179b inc eax
0137:0040179c dec ecx
0137:0040179d jnz 0040178b

另一个斗地主论坛已发过贴子，未看到的话可在0137：00403c3d push edi处设断
d eax 可见假注册码
d edx 可见真注册码
程序下载地址同上。


斗地主v2.4

 标 题:斗地主v2.4密码的最简单破解——OllyDbg破解法 (1千字)
发信人:大唐飞侠
时 间:2001-8-2 7:41:41
详细信息:
斗地主v2.4密码的最简单破解——OllyDbg破解法

作者：大唐飞侠
时间：2001年8月1日

使用工具：OllyDbg
下载地址: http://home.t-online.de/home/Ollydbg/odbg104.zip

软件名称：斗地主 v2.4
下载地址: http://soft.nyinfo.ha.cn/down1.php?id=5910&url=http://61.177.64.99/
down/ddz1.zip

破解步骤：

1、运行OllyDbg，按F3加载DDZ.EXE，选择"Deebug" 并且点击"Run"或按F9运行DDZ.EXE，DDZ运
行了...... 怎么了斗地主界面不肯出来，不要骂我，是OllyDbg捣的鬼，点击OllyDbg界面，
按住Shift同时按几下F9就可以回到斗地主界面。

2、设置断点，回到Ollydbg 界面，通常Ollydbg界面有四个窗口，右击左上角那个窗口，选择
“Search for ->Name (label)” 出现软件所调用函数的窗口，因为DDZ是VB程序，向下拉动
滚动条找到VB函数__vbaStrComp 并选择它,按下F2左边变成红色，断点设置好了。

3、象往常一去注册吧，填
注册名：datangfx
注册码：7086708670
点击确定，程序马上被OllyDbg拦住了，停在地址 6602416C 这里，右下角窗口显示我的大名
UNICODE“datangfx”，好了这下有戏看了，按一下F9，显示我输入的注册码“7086708670”
再次按 F9，真的注册码出来了“0174109044”，哈哈。。。

整理注册信息
注册名：datangfx
注册码：0174109044

用OllyDbg破解，过程就是那么简单，不信你试一下。

转载时希望保持完整，谢谢！


多彩开机1.0

 标 题:教皇贤追多彩开机1.0的注册码，烦死了。 (3千字)
发信人:情狼[BCG]
时 间:2001-8-31 20:03:28
详细信息:
多彩开机1.0注册码破解
用户名：情狼[BCG]
注册码：78787878 (必须8位，因有长度检测)
TRW2000 下bpx hmemcpy
点注册，拦截，下pmodule到程序领空，到如下：
:004077C8 59 pop ecx
:004077C9 83F808 cmp eax, 00000008 //输入的注册码是否8位
:004077CC 7460 je 0040782E //不是8位就出错
:004077CE 66C745A45C00 mov [ebp-5C], 005C
:004077D4 BA010D4900 mov edx, 00490D01
:004077D9 8D45DC lea eax, dword ptr [ebp-24]

继续：
:004078B0 8A9558FFFFFF mov dl, byte ptr [ebp+FFFFFF58]
:004078B6 3A956CFFFFFF cmp dl, byte ptr [ebp+FFFFFF6C] //注册码第一位是否为D
:004078BC 746A je 00407928 //不是则出错
:004078BE 682C010000 push 0000012C

继续：
:0040795A 8A8D5FFFFFFF mov cl, byte ptr [ebp+FFFFFF5F]
:00407960 3A8D73FFFFFF cmp cl, byte ptr [ebp+FFFFFF73] //注册码第八位是否为E
:00407966 746A je 004079D2 //不是则出错
:00407968 682C010000 push 0000012C

继续：
:004079E1 83C231 add edx, 00000031
:004079E4 0FBE856DFFFFFF movsx eax, byte ptr [ebp+FFFFFF6D]
:004079EB 3BD0 cmp edx, eax //注册码第二位是否为3
:004079ED 746A je 00407A59 //不是则出错
:004079EF 682C010000 push 0000012C

继续：
:00407A68 83C230 add edx, 00000030
:00407A6B 0FBE856EFFFFFF movsx eax, byte ptr [ebp+FFFFFF6E]
:00407A72 3BD0 cmp edx, eax //注册码第三位是否为5
:00407A74 746A je 00407AE0 //不是则出错
:00407A76 682C010000 push 0000012C

继续：
:00407AE0 8A8D5BFFFFFF mov cl, byte ptr [ebp+FFFFFF5B]
:00407AE6 3A8D70FFFFFF cmp cl, byte ptr [ebp+FFFFFF70] //注册码第五位是否为\
:00407AEC 750E jne 00407AFC //不是则出错。
:00407AEE 8A855CFFFFFF mov al, byte ptr [ebp+FFFFFF5C]
:00407AF4 3A856FFFFFFF cmp al, byte ptr [ebp+FFFFFF6F] //注册码第四位是否为n
:00407AFA 746A je 00407B66 //不是则出错
:00407AFC 682C010000 push 0000012C

继续：
:00407B7E 83C230 add edx, 00000030
:00407B81 0FBE8571FFFFFF movsx eax, byte ptr [ebp+FFFFFF71]
:00407B88 3BD0 cmp edx, eax //注册码第6位是否为3
:00407B8A 746A je 00407BF6 //不是则出错
:00407B8C 682C010000 push 0000012C

继续：
:00407C15 83C230 add edx, 00000030
:00407C18 0FBE8572FFFFFF movsx eax, byte ptr [ebp+FFFFFF72]
:00407C1F 3BD0 cmp edx, eax //注册码第7位是否为1
:00407C21 746A je 00407C8D //不是则出错
:00407C23 682C010000 push 0000012C

整理：
用户名：情狼[BCG]
注册码：D35n\31E

收工


飞天餐饮娱乐管理系统

 标 题:《飞天餐饮娱乐管理系统》注册码算法分析以及暴力破解
发信人:chn-boy
时 间:2000-12-10 3:58:56
详细信息:
《飞天餐饮娱乐管理系统》的暴力破解法：

1）在004A2A48处
改：0F 85 8A 00 00 00 C7 05 74 2C 52 00 01 00 00 00
^^ ^^ ^^ ^^ ^^ ^^
为：90 90 90 90 90 90

2）在004A1B29处
改：74 04 33 C0 EB 0A 42 40 49 75 F1
^^
为：EB

然后，随便用你的姓名和足够长的Code注册，注册完以后关闭程序，重新运行你就可以看到结果了。

【算法代码分析】
此软件的注册码算法很复杂（真的不知道有没有弄懂的必要，呵呵）。
假设姓名为Name 简称 N 字符串；注册码为Code 简称 C 字符串；另外此算法还根据C得到了一个 KEY 简称 K 字符串。
令C' = Fc(C) —— 其中 Fc()为函数其意义为：将字符串 C 去掉 '-'后两两合并，例如：1234-56789012-3456 合
并成 12 34 56 78 90 12 34 56（16进制）共八个字节。又如：1a2b-3c4d5e6f-7g8h 合并成：1a 2b 3c 4d 5e 6f 7g 8h 。
这个函数是004A1AE3处的call 004A187C 。
:004A1AD0 55 push ebp
:004A1AD1 8BEC mov ebp, esp
:004A1AD3 83C4F0 add esp, FFFFFFF0
:004A1AD6 53 push ebx
:004A1AD7 56 push esi
:004A1AD8 57 push edi
:004A1AD9 8BD9 mov ebx, ecx
:004A1ADB 8BF8 mov edi, eax
:004A1ADD 8B7508 mov esi, dword ptr [ebp+08]
:004A1AE0 8D45F0 lea eax, dword ptr [ebp-10]
:004A1AE3 E894FDFFFF call 004A187C <-- Fc()函数，在这里下中断，用do "d eax; p;"可以看到C'字符串
:004A1AE8 85C0 test eax, eax
:004A1AEA 7504 jne 004A1AF0
:004A1AEC 33C0 xor eax, eax
:004A1AEE EB49 jmp 004A1B39

令K = Fk(C') = Fk(Fc(C)) —— 其中Fk()的定义如下面代码段：
:004A1AF0 8BC6 mov eax, esi
:004A1AF2 8D55F0 lea edx, dword ptr [ebp-10]
:004A1AF5 E806FDFFFF call 004A1800 <-- 这个Call是根据C'得到一个Key，简称K字符串
<-- 具体的定义为：将Fc(C)后面的4个字节的值分别*4+xxxx（xxxx表示0x0004, 0x0404, 0x0804, 0x0C04），将得到的值
从一个长度为1000H的表中查找出值进行加和xor运算，得到的值作为入口参数再进行运算，共循环0x10次。代码如：
:004A14A6 C645F7F0 mov [ebp-09], F0
:004A14AA 8D75F0 lea esi, dword ptr [ebp-10]
:004A14AD 331E xor ebx, dword ptr [esi]
:004A14AF 8D95ACEFFFFF lea edx, dword ptr [ebp+FFFFEFAC]
:004A14B5 8BC3 mov eax, ebx
:004A14B7 E8D4FEFFFF call 004A1390 <-- 运算在这个Call中运行
:004A14BC 33F8 xor edi, eax
:004A14BE 8BC3 mov eax, ebx
:004A14C0 8BDF mov ebx, edi
:004A14C2 8BF8 mov edi, eax
:004A14C4 83EE04 sub esi, 00000004
:004A14C7 FE45F7 inc [ebp-09]
:004A14CA 75E1 jne 004A14AD
<-- Call 004A1390的代码为：
:004A1390 56 push esi
:004A1391 57 push edi
:004A1392 81C404F0FFFF add esp, FFFFF004
:004A1398 50 push eax
:004A1399 83C4FC add esp, FFFFFFFC
:004A139C 8BF2 mov esi, edx
:004A139E 8D7C2404 lea edi, dword ptr [esp+04]
:004A13A2 B900040000 mov ecx, 00000400
:004A13A7 F3 repz
:004A13A8 A5 movsd
:004A13A9 890424 mov dword ptr [esp], eax
:004A13AC 8BC4 mov eax, esp
:004A13AE 33D2 xor edx, edx
:004A13B0 8A5003 mov dl, byte ptr [eax+03]
:004A13B3 8B549404 mov edx, dword ptr [esp+4*edx+04]
:004A13B7 33C9 xor ecx, ecx
:004A13B9 8A4802 mov cl, byte ptr [eax+02]
:004A13BC 03948C04040000 add edx, dword ptr [esp+4*ecx+00000404]
:004A13C3 33C9 xor ecx, ecx
:004A13C5 8A4801 mov cl, byte ptr [eax+01]
:004A13C8 33948C04080000 xor edx, dword ptr [esp+4*ecx+00000804]
:004A13CF 0FB600 movzx eax, byte ptr [eax]
:004A13D2 039484040C0000 add edx, dword ptr [esp+4*eax+00000C04]
:004A13D9 8BC2 mov eax, edx
:004A13DB 81C404100000 add esp, 00001004
:004A13E1 5F pop edi
:004A13E2 5E pop esi
:004A13E3 C3 ret
<--------------------------------------------------------------------------------------------

:004A1AFA 8903 mov dword ptr [ebx], eax
:004A1AFC 8B06 mov eax, dword ptr [esi]

下面的一个Call是计算另一个字符串的，假定为C''，共分三步走：第一步：计算出N'=Fn(N)；第二步：然后将N'的前3个字符
用K字符串的前三个字符代替，假定为N''=F3(K, N')=F3(Fk(C'), N')=F3(Fk(Fc(C)), Fn(N))；第三步：将得到的N''字符串按照
Fk()类似的方法通过一定量的Add和xor运算后(也是调用了Call 004A1390，只是不同的输入参数，哪怕是1bit的不同也会得到一个
完全不同的新字符串，痛苦)，得到C''，可以令C''=F(N'')，那么如果C'==C''，那么，一切就是OK。嘿嘿
:004A1AFE 50 push eax
:004A1AFF 8B0B mov ecx, dword ptr [ebx]
:004A1B01 8D45F8 lea eax, dword ptr [ebp-08]
:004A1B04 8BD7 mov edx, edi
:004A1B06 E845FBFFFF call 004A1650 <-- 这个Call是根据N和K字符串得到一个新的字符串C''=F0(N, K)
:004A1B0B 85C0 test eax, eax
:004A1B0D 7504 jne 004A1B13
:004A1B0F 33C0 xor eax, eax
:004A1B11 EB26 jmp 004A1B39
:004A1B13 8B0DC0F15100 mov ecx, dword ptr [0051F1C0]
:004A1B19 49 dec ecx
:004A1B1A 85C9 test ecx, ecx
:004A1B1C 7C16 jl 004A1B34
:004A1B1E 41 inc ecx
:004A1B1F 8D45F8 lea eax, dword ptr [ebp-08]
:004A1B22 8D55F0 lea edx, dword ptr [ebp-10]

:004A1B25 8A18 mov bl, byte ptr [eax] |
:004A1B27 3A1A cmp bl, byte ptr [edx] |
:004A1B29 EB04 jmp 004A1B2F |不用看就知道是在比较两个运算好的
:004A1B2B 33C0 xor eax, eax |新的字符串，其实就是我上面提到的
:004A1B2D EB0A jmp 004A1B39 |那个C' 和 C''。相等就是了
:004A1B2F 42 inc edx |
:004A1B30 40 inc eax |
:004A1B31 49 dec ecx |
:004A1B32 75F1 jne 004A1B25 |

:004A1B34 B801000000 mov eax, 00000001 <--关键就是要得到这个Eax=1；
:004A1B39 5F pop edi
:004A1B3A 5E pop esi
:004A1B3B 5B pop ebx
:004A1B3C 8BE5 mov esp, ebp
:004A1B3E 5D pop ebp
:004A1B3F C20400 ret 0004

最终你会得到一个表达式 C'==C'' 即 Fc(C)=F(N'')=F(F3(K, N'))=F(F3(Fk(Fc(C)), Fn(N)))，那么谁能告诉我如何根据这个表达式
用N求出C来？

标 题:关于上篇文章的一点更正：
发信人:chn-boy
时 间:2000-12-10 4:07:35
详细信息:

前面提到的：1a2b-3c4d5e6f-7g8h 合并成：1a 2b 3c 4d 5e 6f 7g 8h 其实应该是：1A 2B 3C 4D 5E 6F 7G 8H，

也就是说最后的转换都是数字和大写，如果你输入1a2B-3c4D5e6F-7g8H那么得到也是：1A 2B 3C 4D 5E 6F 7G 8H

标 题:前面的是单机普及版的暴力破解，网络注册版请看：
发信人:chn-boy
时 间:2000-12-10 4:24:35
详细信息:

《飞天餐饮娱乐管理系统》的暴力破解法：

1）在004A2B6B处
改：0F 86 9F 00 00 00 C7 05 74 2C 52 00 64 00 00 00
^^ ^^ ^^ ^^ ^^ ^^
为：90 90 90 90 90 90

2）在004A1B29处
改：74 04 33 C0 EB 0A 42 40 49 75 F1
^^
为：EB

然后，随便用你的姓名和足够长的Code注册，注册完以后关闭程序，重新运行你就可以看到结果了。

具体我没有仔细用过，不过好像网络版的功能全一些。。呵呵


沸点邮件群发系统v1.2标准版

 标 题:破解“沸点邮件群发系统v1.2标准版” (3千字)
发信人:mazhenyu
时 间:2001-8-17 11:25:53
详细信息:
软件下载：http://www.21swe.com/

首先找到mail.exe的注册错误提示信息：“您的注册名称或注册号不对，不能注册”
因为真假注册码比较以后才会出现这个提示

========

W32Dasm反汇编和TRW2000一起使用

* 用language查看，程序没有加壳
* 用W32Dasm反汇编，根据“串式参考”找到注册错误提示信息“您的注册名称或注册号不对，不能注册”，双击

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404D51(C)
|
:00404FEC A100C94D00 mov eax, dword ptr [004DC900]
:00404FF1 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"错误提示"
|
:00404FF3 B9E2534D00 mov ecx, 004D53E2

* Possible StringData Ref from Data Obj ->"您的注册名称或注册号不对，不能注册!"
|
:00404FF8 BABE534D00 mov edx, 004D53BE
:00404FFD 8B00 mov eax, dword ptr [eax]
:00404FFF E8C0870B00 call 004BD7C4

发现是从00404D51跳转过来的，鼠标右键双击00404D51

:00404D1E 8945C8 mov dword ptr [ebp-38], eax
:00404D21 8D55C8 lea edx, dword ptr [ebp-38]
:00404D24 FF461C inc [esi+1C]
:00404D27 8B83E8020000 mov eax, dword ptr [ebx+000002E8]
:00404D2D E8FE210700 call 00476F30
:00404D32 8D45C8 lea eax, dword ptr [ebp-38]
:00404D35 8D55FC lea edx, dword ptr [ebp-04]

:00404D38 E8F38C0B00 call 004BDA30

:00404D3D 50 push eax
:00404D3E FF4E1C dec [esi+1C]
:00404D41 8D45C8 lea eax, dword ptr [ebp-38]
:00404D44 BA02000000 mov edx, 00000002
:00404D49 E8128C0B00 call 004BD960
:00404D4E 59 pop ecx
:00404D4F 84C9 test cl, cl

:00404D51 0F8495020000 je 00404FEC

:00404D57 B201 mov dl, 01
:00404D59 A1F4A44400 mov eax, dword ptr [0044A4F4]
:00404D5E E8E9580400 call 0044A64C
:00404D63 8BF8 mov edi, eax
:00404D65 89BBF4020000 mov dword ptr [ebx+000002F4], edi
:00404D6B BA02000080 mov edx, 80000002
:00404D70 8BC7 mov eax, edi
:00404D72 E85D8A0B00 call 004BD7D4
:00404D77 66C746102C00 mov [esi+10], 002C

对照“风飘雪”的破解教程，发现可疑的关键Call在00404D38

打开TRW2000

在mail.exe中的注册栏中填入：用户名“mazhenyu”和注册号“87654321”，但不点击“立即注册”

“Ctrl+N”激活TRW2000

在00404D35处下断点：bpx 00404D35，回车，然后按“F5”退出

点击mail.exe注册栏中的“立即注册”

程序被中断

按一下“F10”来到00404D38，没有发现注册码，按“F8”进入Call以进一步追踪

0137:004BDA2F RET
0137:004BDA30 PUSH EBP
0137:004BDA31 MOV EBP,ESP
0137:004BDA33 PUSH EBX
0137:004BDA34 MOV EAX,[EAX]
0137:004BDA36 MOV EDX,[EDX]

0137:004BDA38 CALL 004ACE0C

0137:004BDA3D SETZ AL
0137:004BDA40 AND EAX,BYTE +01
0137:004BDA43 POP EBX
0137:004BDA44 POP EBP
0137:004BDA45 RET
0137:004BDA46 NOP
0137:004BDA47 NOP
0137:004BDA48 PUSH EBP
0137:004BDA2F RET
0137:004BDA30 PUSH EBP
0137:004BDA31 MOV EBP,ESP
0137:004BDA33 PUSH EBX
0137:004BDA34 MOV EAX,[EAX]
0137:004BDA36 MOV EDX,[EDX]
0137:004BDA38 CALL 004ACE0C
0137:004BDA3D SETZ AL
0137:004BDA40 AND EAX,BYTE +01
0137:004BDA43 POP EBX
0137:004BDA44 POP EBP
0137:004BDA45 RET
0137:004BDA46 NOP
0137:004BDA47 NOP
0137:004BDA48 PUSH EBP

按“F10”向下移动绿色光条，结果在004BDA38处找到真假注册码：
d eax=87654321
d edx=356088

将用户名“mazhenyu”和注册号“356088”进行注册，注册成功！

太棒了！

马震宇
2001.8.16.


伏羲服装鞋业购销存管理系统V3.02(Build0418)

标 题:伏羲服装鞋业购销存管理系统V3.02(Build0418) 注册码： (3千字)
发信人:CrackerABC[BCG]
时 间:2001-4-24 7:51:16
详细信息:
伏羲服装鞋业购销存管理系统V3.02(Build0418) 注册码：

伏羲服装鞋业购销存管理系统V3.0单机版

    标准价：3,880元，促销价：2,980元，网上价：2,380元。网上价为电子注册版，如需CD-ROM光盘版，另加100元特快专递费。

    用户可通过银行汇款将款项汇至以下帐户：
    开户行：中国工商银行广州市芳村支行
    户　名：广州市伏羲计算机系统工程有限公司
    帐　号：017-0249-0012676

    用户汇款后，将汇款底联连同用户单位名称传真至我公司020-87676820，我公司根据用户单位名称将产品ID传真或E-mail通知用户，用户注册后即成为合法用户，可获得我公司的技术支持。

注册方法不同，但是注册算法是一样的，这次启动后输入注册信息并无任何提示，只有你输入正确的注册号后，
才把注册的选项去掉，功能不再受限制。

具体跟踪方法同0405版本一样。

下bpx hmemcpy

F5返回后，点确定被拦截到TRW2000领域中，下BD *，然后pmodule

接着是F10的艰苦跟踪，大概几十下来到这个位置：

* Referenced by a CALL at Addresses:
|:005DEA0A , :00601864
|
:005DE5D0 55 push ebp
:005DE5D1 8BEC mov ebp, esp
:005DE5D3 83C4E4 add esp, FFFFFFE4
:005DE5D6 53 push ebx
:005DE5D7 33DB xor ebx, ebx
:005DE5D9 895DE8 mov dword ptr [ebp-18], ebx
:005DE5DC 894DF4 mov dword ptr [ebp-0C], ecx
:005DE5DF 8955F8 mov dword ptr [ebp-08], edx
:005DE5E2 8945FC mov dword ptr [ebp-04], eax
:005DE5E5 8B5D08 mov ebx, dword ptr [ebp+08]
:005DE5E8 8B45FC mov eax, dword ptr [ebp-04]
:005DE5EB E8345DE2FF call 00404324
:005DE5F0 8B45F8 mov eax, dword ptr [ebp-08]
:005DE5F3 E82C5DE2FF call 00404324
:005DE5F8 8B45F4 mov eax, dword ptr [ebp-0C]
:005DE5FB E8245DE2FF call 00404324
:005DE600 33C0 xor eax, eax
:005DE602 55 push ebp
:005DE603 6815E75D00 push 005DE715
:005DE608 64FF30 push dword ptr fs:[eax]
:005DE60B 648920 mov dword ptr fs:[eax], esp
:005DE60E C645F300 mov [ebp-0D], 00
:005DE612 8BC3 mov eax, ebx
:005DE614 E8D758E2FF call 00403EF0
:005DE619 837DFC00 cmp dword ptr [ebp-04], 00000000
:005DE61D 0F84CF000000 je 005DE6F2
:005DE623 837DF800 cmp dword ptr [ebp-08], 00000000
:005DE627 0F84C5000000 je 005DE6F2
:005DE62D B827000000 mov eax, 00000027
:005DE632 E8C941E2FF call 00402800
:005DE637 8945EC mov dword ptr [ebp-14], eax
:005DE63A 8D45E8 lea eax, dword ptr [ebp-18]
:005DE63D 50 push eax
:005DE63E 8D4DEC lea ecx, dword ptr [ebp-14]
:005DE641 8B55F4 mov edx, dword ptr [ebp-0C]
:005DE644 8B45F8 mov eax, dword ptr [ebp-08]
:005DE647 E894F7FFFF call 005DDDE0
:005DE64C 8B45FC mov eax, dword ptr [ebp-04]
:005DE64F 8B55E8 mov edx, dword ptr [ebp-18] //----D EDX得到技术支持码和注册码
:005DE652 E8295CE2FF call 00404280 //---D EDX 得到注册码。
:005DE657 7510 jne 005DE669
:005DE659 8BC3 mov eax, ebx
:005DE65B 8B55EC mov edx, dword ptr [ebp-14]
:005DE65E E8B15AE2FF call 00404114
:005DE663 C645F301 mov [ebp-0D], 01
:005DE667 EB7C jmp 005DE6E5

用户名：CrackerABC[BCG]
注册码：56238-53314-54999-64919-50083

用户名：潘世峰
注册码：21142-24154-22362-23732-16031

标 题:伏羲服装鞋业购销存3.01(0405)注册码 (565字)
发信人:CrackerABC[BCG]
时 间:2001-4-24 7:52:52
详细信息:

伏羲服装鞋业购销存3.01(0405)注册码

这个软件的跟踪比较麻烦。

首先可以下bpx hmemcpy，然后F5返回后点注册被拦截到trw2000中，下bd *
然后pmodule，下面是艰苦的跟踪。

一直跟踪到：
0167:00603B21 CALL ********* //-------->F8跟踪进去，非常的漫长的F10。
TEST AL,AL

一直到：

0167:00603764处下D EAX得到技术支持号码和注册码：

技术支持：00198793
注册码：67206-51065-65042-60186-30376

可以直接在：
0167:0060376A 处，下D EDX得到注册码：67206-51065-65042-60186-30376

整理：

用户名：CrackerABC[BCG]
注册码：67206-51065-65042-60186-30376

标 题:伏羲服装鞋业购销存管理系统V3.03(Build0423) 注册码： (2千字)
发信人:CrackerABC[BCG]
时 间:2001-4-24 8:11:31
详细信息:

伏羲服装鞋业购销存管理系统V3.02(Build0423) 注册码：

伏羲服装鞋业购销存管理系统V3.0单机版

    标准价：3,880元，促销价：2,980元，网上价：2,380元。网上价为电子注册版，如需CD-ROM光盘版，另加100元特快专递费。

    用户可通过银行汇款将款项汇至以下帐户：
    开户行：中国工商银行广州市芳村支行
    户　名：广州市伏羲计算机系统工程有限公司
    帐　号：017-0249-0012676

    用户汇款后，将汇款底联连同用户单位名称传真至我公司020-87676820，我公司根据用户单位名称将产品ID传真或E-mail通知用户，用户注册后即成为合法用户，可获得我公司的技术支持。

注册方法不同，但是注册算法是一样的，这次启动后输入注册信息并无任何提示，只有你输入正确的注册号后，
才把注册的选项去掉，功能不再受限制。

过程。

1、下bpx hmemcpy

2、F5返回后，点确定被拦截到TRW2000领域中，

0147:9E62 PUSH BP //---->我们在这里
0147:9E63 MOV BP,SP
0147:9E65 PUSH DS

3、下BD *，然后pmodule

4、接着是F10的艰苦跟踪，来到这个位置：

0167:005DEC08 MOV EDX,[EBP-18]
0167:005DEC0B MOV EAX,[EBP-08]
0167:005DEC0E CALL 005DE7D4 //------>典型的比较，F8跟进去。
0167:005DEC13 TEST AL,AL
0167:005DEC15 JZ NEAR 005DF268
0167:005DEC1B LEA EAX,[EBP-14]
0167:005DEC1E MOV ECX,[EBP-08]
0167:005DEC21 MOV EDX,[EBP-18]
...
... //-------->这中间是对输入的假注册码分5段存入比对
...

5、来到这个位置：

0167:005DE7D4 PUSH EBP //---->我们在这里
0167:005DE7D5 MOV EBP,ESP
0167:005DE7D7 ADD ESP,BYTE -1C
0167:005DE7DA PUSH EBX
0167:005DE7DB XOR EBX,EBX
0167:005DE7DD MOV [EBP-18],EBX
0167:005DE7E0 MOV [EBP-0C],ECX
0167:005DE7E3 MOV [EBP-08],EDX
0167:005DE7E6 MOV [EBP-04],EAX
0167:005DE7E9 MOV EBX,[EBP+08]
0167:005DE7EC MOV EAX,[EBP-04]
0167:005DE7EF CALL 00404324
0167:005DE7F4 MOV EAX,[EBP-08]
0167:005DE7F7 CALL 00404324
0167:005DE7FC MOV EAX,[EBP-0C]
0167:005DE7FF CALL 00404324 //----->版本号
0167:005DE804 XOR EAX,EAX
0167:005DE806 PUSH EBP
0167:005DE807 PUSH DWORD 005DE919
0167:005DE80C PUSH DWORD [FS:EAX]
0167:005DE80F MOV [FS:EAX],ESP
0167:005DE812 MOV BYTE [EBP-0D],00
0167:005DE816 MOV EAX,EBX
0167:005DE818 CALL 00403EF0
0167:005DE81D CMP DWORD [EBP-04],BYTE +00
0167:005DE821 JZ NEAR 005DE8F6
0167:005DE827 CMP DWORD [EBP-08],BYTE +00
0167:005DE82B JZ NEAR 005DE8F6
0167:005DE831 MOV EAX,27
0167:005DE836 CALL 00402800
0167:005DE83B MOV [EBP-14],EAX
0167:005DE83E LEA EAX,[EBP-18]
0167:005DE841 PUSH EAX
0167:005DE842 LEA ECX,[EBP-14]
0167:005DE845 MOV EDX,[EBP-0C]
0167:005DE848 MOV EAX,[EBP-08]
0167:005DE84B CALL 005DDFE4
0167:005DE850 MOV EAX,[EBP-04] //--->数据窗口自动出现技术支持代码和正确注册码
0167:005DE853 MOV EDX,[EBP-18] //--->D EDX 得到假注册码
0167:005DE856 CALL 00404280 //------->D EDX 得到正确的注册码以及形式。

用户名：CrackerABC[BCG]
注册码：73071-41361-63517-43840-46932


个人破解小结

标 题:两个月的破解回顾以及7个软件的破解！ (3千字)
发信人:破！
时 间:2000-12-28 9:36:25
详细信息:
小弟初学破解不久，（2个月左右），现在回头想象，觉得汇编语言真是太重要了，所以，在写这篇心得之前，我想向大家推荐一本书————南开大学的《80X86宏汇编语言设计》。这本书我觉得非常适合初学者。我以前是看清华的那本，可是。。。呵呵。。不知道是我比较笨还是什么别的缘故，死活没有入过汇编的门。前后学了三次，每次都是无功而返。直到后来，看了南开的这本书，才渐渐地觉得知道了一点汇编（当然，也是非常浅薄。。）。所以，想学破解又还没学过汇编的朋友，我强烈推荐你采用这本书作为你汇编的入门书刊！
下来就谈谈自己破解的经验了。这2个月中，给我帮助最大的有两件事：第一就是我在破editplus的时候，由于找不到注册码，所以只有采用暴力破解，可是不管我怎么改，就是不起作用，百般无奈之下，发了一封E-MAIL给看雪前辈，他很快地给我回了信，指出了我的错误，并且指点了我暴力破解的关键之处是找到核心的算法给予击破。这对于我这个初学者来说，无异于雪中送炭。第二件事就是城市猎人的《探索杂志》中的《初学天地》栏目，其中介绍的几个经典的比较形式相信每一个CRACKER都知道有多么的重要，真是谢谢他给我们总结出了如此经典的结论。可能有一些朋友没看过，我就写一个作为例子吧：
MOV EDX，[ ] <------------
MOV EAX，[ ] <------------
CALL XXXXXXXX
TEST EAX，EAX
JZ/JE/JNE/JNZ XXXXXXXX
在我上面两个打箭头的地方分别D一下，十有八九能看到注册码！
另外还有一个：
PUSH XXX <--------------
CALL XXXXXXXX
TEST EAX，EAX
JZ/JE/JNE/JNZ XXXXXXXX
在打箭头的地方D一下，有时候会有意想不到的收获哟！
我现在是拿着《软件》第11期汉化献礼那一期做软件的来源，说实在的，这一期《软件》真是物有所值，那么多经典的软件，还都有汉化包（虽然没有注册信息）。随机地从里面抽一个软件，架起TRW2000，下 G HMEMCPY，栏下来后
PMODULE，剩下的就看个人的功力了！我汇编学得不精，能看得出算法的也没几个，所以大部分破出来的软件都是能够直接看到注册码的。下面就是我这段时间以来破解的软件的一部分的关键之处，贴在这里，请各位大虾小虾，前辈后辈，高手低手都多多指教！（过程我都省略了，如果有要的朋友，可以E-MAIL给我：luoyi.ly@yeah.net或
luoyi.ly@263.net,真诚的希望能交几个搞破解的朋友！）
以下软件均出自《软件》11期汉化献礼：
1. Waterwall(一个墙纸自动更换软件）
：0046971e MOV EAX,[EBP-14] <--------------D EAX 真注册码！
: 00469721 MOV EDX,[EBP-8 ] <--------------D EDX 你输入的注册码！

2. HEX MINES （一个游戏）
：00401FB9 CALL LSTRCMP <--------------D ESI 真注册码！

3.B-PUZZLE ( 一个游戏）
：00403325 CALL LSTRCMP <--------------D ESI 真注册码！

4.WINAMP SKIN MAKER
：00406DEB CMP EDI，EBX
？ EDI 十进制为真注册码！
？ EDI 十进制为你输入的注册码！

5.PACK IT (一个自解压文件制作工具）
：00402903 CALL LSTRCMPA <--------------D EAX 真注册码！

6.PASSWORD KEEPER （密码保存软件）
：00412258 CMP EBX,EAX
? EBX 十进制为你输入的注册码！
？EAX 十进制为真注册码！

7.XFADER ( 一个才质制作工具）
：0046F552 MOV EAX，[EBP-18] <-----------D EAX 真注册码！
：0046F555 MOV EDX，[EBP- 8] <-----------D EDX 你输入的注册码！
：0046F558 CALL 00403CF4

就这么多了，大家也看到了，前面的那个经典的比较形式是多么的有用了吧？
这是小弟学习破解以来，写作的第一篇文章，希望能对朋友们有所帮助！
请多指教！


观察者1.6

 标 题:CHiNA CrACKiNG GrOUp (7千字)
发信人:娃娃[CCG]
时 间:2001-9-8 9:35:05
详细信息:

观察者1.6算法于注册机
By Nydoll[CCG]

这个东西其实很简单，但是也不是直接就可以找到算法 因为它的机器码计算以及注册码计算都是在打开
注册窗口时才开始的 在输入注册码后下断点都只能找到注册码而无法发现它的具体算法 所以我用的方法是先反
汇编解决，反汇编找到“您已是Observer (观察者)注册用户!” 向上翻就是它的注册算法了：

//上面省略一部分计算机器码的代码，因为这些代码可以不考虑在注册机里。

:004038F4 57 push edi //EDI中为经过计算的机器代码。
:004038F5 6831010000 push 00000131
:004038FA FF7508 push [ebp+08] |
:004038FD E8F6370000 Call 004070F8
:00403902 8A5DF8 mov bl, byte ptr [ebp-08] //取机器码倒数第7位
:00403905 3A5DF9 cmp bl, byte ptr [ebp-07] //取机器码倒数第6位
:00403908 7C0F jl 00403919 //对比两个数，用大数减去小数，差放到EDX中
:0040390A 0FBE5DF8 movsx ebx, byte ptr [ebp-08]
:0040390E 0FBE7DF9 movsx edi, byte ptr [ebp-07]
:00403912 29FB sub ebx, edi
:00403914 885DEC mov byte ptr [ebp-14], bl
:00403917 EB0D jmp 00403926
:00403919 0FBE5DF9 movsx ebx, byte ptr [ebp-07]
:0040391D 0FBE7DF8 movsx edi, byte ptr [ebp-08]
:00403921 29FB sub ebx, edi
:00403923 885DEC mov byte ptr [ebp-14], bl
:00403926 8A5DF6 mov bl, byte ptr [ebp-0A] //取机器码倒数第9位
:00403929 3A5DFB cmp bl, byte ptr [ebp-05] //取机器码倒数第4位
:0040392C 7C0F jl 0040393D //对比两个数，用大数减去小数，差放到EDX中
:0040392E 0FBE5DF6 movsx ebx, byte ptr [ebp-0A]
:00403932 0FBE7DFB movsx edi, byte ptr [ebp-05]
:00403936 29FB sub ebx, edi
:00403938 885DED mov byte ptr [ebp-13], bl
:0040393B EB0D jmp 0040394A
:0040393D 0FBE5DFB movsx ebx, byte ptr [ebp-05]
:00403941 0FBE7DF6 movsx edi, byte ptr [ebp-0A]
:00403945 29FB sub ebx, edi
:00403947 885DED mov byte ptr [ebp-13], bl
:0040394A 8A5DF7 mov bl, byte ptr [ebp-09] //取机器码倒数第8位
:0040394D 3A5DFA cmp bl, byte ptr [ebp-06] //取机器码倒数第5位
:00403950 7C0F jl 00403961 //对比两个数，用大数减去小数，差放到EDX中
:00403952 0FBE5DF7 movsx ebx, byte ptr [ebp-09]
:00403956 0FBE7DFA movsx edi, byte ptr [ebp-06]
:0040395A 29FB sub ebx, edi
:0040395C 885DEE mov byte ptr [ebp-12], bl
:0040395F EB0D jmp 0040396E
:00403961 0FBE5DFA movsx ebx, byte ptr [ebp-06]
:00403965 0FBE7DF7 movsx edi, byte ptr [ebp-09]
:00403969 29FB sub ebx, edi
:0040396B 885DEE mov byte ptr [ebp-12], bl
:0040396E 8A5DF5 mov bl, byte ptr [ebp-0B] //取机器码倒数第10位
:00403971 3A5DFC cmp bl, byte ptr [ebp-04] //取机器码倒数第3位
:00403974 7C0F jl 00403985 //对比两个数，用大数减去小数，差放到EDX中
:00403976 0FBE5DF5 movsx ebx, byte ptr [ebp-0B]
:0040397A 0FBE7DFC movsx edi, byte ptr [ebp-04]
:0040397E 29FB sub ebx, edi
:00403980 885DEF mov byte ptr [ebp-11], bl
:00403983 EB0D jmp 00403992
:00403985 0FBE5DFC movsx ebx, byte ptr [ebp-04]
:00403989 0FBE7DF5 movsx edi, byte ptr [ebp-0B]
:0040398D 29FB sub ebx, edi
:0040398F 885DEF mov byte ptr [ebp-11], bl

//上面一部分代码根据机器码产生了4个值，不知道过程我说明白没有，在此重新复述一遍：比如我的机器码是
//D0F0111E16，程序分别取他的第5位与第6位比较 第8位与第3位比较 第7位与第4位比较 第9位与第2位比较，
//然后用大数减去小数，值分别保存。所以通过我的机器码得到的4个数分别为：1，1，5，1。

//接下来是第二部分计算：

:00403992 0FBE7DEC movsx edi, byte ptr [ebp-14] //取计算完的第一个数 即1放入EDI
:00403996 83EF01 sub edi, 00000001 //EDI＝EDI－1
:00403999 81E7FF000000 and edi, 000000FF //结果与255进行按位与运算
:0040399F 57 push edi //保存运算结果

//省略一部分代码。

:004039E1 0FBE7DED movsx edi, byte ptr [ebp-13] //取上面计算的第二个值放入EDI
:004039E5 83EF02 sub edi, 00000002 //EDI＝EDI－2
:004039E8 81E7FF000000 and edi, 000000FF //结果与255进行按位与运算
:004039EE 57 push edi //保存运算结果

//省略一部分代码。

:00403A30 0FBE7DEE movsx edi, byte ptr [ebp-12] //取上面计算的第三个值放入EDI
:00403A34 83EF03 sub edi, 00000003 //EDI＝EDI－3
:00403A37 81E7FF000000 and edi, 000000FF //结果与255进行按位与运算
:00403A3D 57 push edi //保存运算结果

//省略一部分代码。

:00403A7F 0FBE7DEF movsx edi, byte ptr [ebp-11] //取上面计算的第四个值放入EDI
:00403A83 83EF04 sub edi, 00000004 //EDI＝EDI－4
:00403A86 81E7FF000000 and edi, 000000FF //结果与255进行按位与运算
:00403A8C 57 push edi //保存运算结果

//至此全部注册码计算结束，让我们再来回顾一下。第一部分计算我们已经得到了4个中间数据：1，1，5，1。
//在第二部分中程序作出了以下计算：（1－1）AND 255，（1－2）AND 255，（5－3）AND 255，
//（1－1）AND 255，同样得出4个结果，他们的16进制累计值就是真正的注册码，我的是00FF32FD ^_^
//ESAY！

* Possible StringData Ref from Data Obj ->"谢谢您试用 Observer (观察者)！" //验证成功时的信息。
|
:00403B04 68A5A94000 push 0040A9A5
:00403B09 6A00 push 00000000
:00403B0B 6880010000 push 00000180
:00403B10 FF75F0 push [ebp-10]

//下面是VB的注册机，写的又臭又长，请高手帮忙改改

Dim c_num As Integer
Dim a, b, c, e, d, f As Integer
c_num = Len(Trim(Text1.Text))
d = c_num - 5
a = Mid(Text1, d, 1)
d = c_num - 6
b = Mid(Text1, d, 1)
a = Asc(a)
b = Asc(b)
If a > b Then
a = a - b
Else
a = b - a
End If
a = (a - 1) And 255
a = Hex(a)
c_num = Len(a)
If c_num = 1 Then
a = a & "0"
End If
c_num = Len(Trim(Text1.Text))
d = c_num - 8
b = Mid(Text1.Text, d, 1)
d = c_num - 3
c = Mid(Text1, d, 1)
c = Asc(c)
b = Asc(b)
If c > b Then
b = c - b
Else
b = b - c
End If
b = (b - 2) And 255
b = Hex(b)
c_num = Len(b)
If c_num = 1 Then
b = b & "0"
End If
c_num = Len(Trim(Text1.Text))
d = c_num - 7
c = Mid(Text1.Text, d, 1)
d = c_num - 4
d = Mid(Text1, d, 1)
c = Asc(c)
d = Asc(d)
If c > d Then
c = c - d
Else
c = d - c
End If
c = (c - 3) And 255
c = Hex(c)
c_num = Len(c)
If c_num = 1 Then
c = c & "0"
End If
c_num = Len(Trim(Text1.Text))
d = c_num - 9
e = Mid(Text1.Text, d, 1)
f = c_num - 2
d = Mid(Text1, f, 1)
e = Asc(e)
d = Asc(d)
If e > d Then
d = e - d
Else
d = d - e
End If
d = (d - 4) And 255
d = Hex(d)
c_num = Len(d)
If c_num = 1 Then
d = d & "0"
End If
Text2.Text = a & b & c & d

//－－－－－－－－－－－－－－END－－－－－－－－－－－－－－－－－－－－－－－－－－－

本人现在正在学习VC和DEPHI请各位大客务必写出一个这两种语言的注册机，小弟感激不尽！

娃娃(NYDoll)
CHiNA CrACKiNG GrOUp


光盘伴侣2.0

 标 题:写光盘伴侣2.0不完全注册机（支持到5位以下的用户名），目的是介绍一个新DEBUG软件及一个delhpi控件 (4千字)
发信人:小楼
时 间:2001-6-27 22:56:51
详细信息:
光盘伴侣2.0不完全注册机

目的：
1.介绍一个debug软件Ollydbg1.03，因为它支持浮点寄存器显示，且不必开机就运行......；而trw2000不支持浮点寄存器显示，softice需要开机就运行。

2.delphi的一个控件KOL&MCK，你可以从http://kol.cjb.net下载，用它编写的delphi程序只有30K左右，大小是不用它编译的程序的十分之一；而且不必再害怕DEDE等基于Form的反编译软件。

注册码计算
:00408FF9 0FBE0F movsx ecx, byte ptr [edi]
:00408FFC 8BC1 mov eax, ecx
:00408FFE 99 cdq
:00408FFF 33C2 xor eax, edx
:00409001 2BC2 sub eax, edx
:00409003 85DB test ebx, ebx
:00409005 8BF0 mov esi, eax
:00409007 750E jne 00409017 //用户名大于1个字符就跳
:00409009 8975A8 mov dword ptr [ebp-58], esi//取用户名[1]ascii码
:0040900C DB45A8 fild dword ptr [ebp-58] //装入st0
:0040900F D845AC fadd dword ptr [ebp-54] //加dword ptr[ebp-54]指向的数
:00409012 D95DAC fstp dword ptr [ebp-54] //存入dword ptr [ebp-54]
:00409015 EB31 jmp 00409048

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409007(C)
|
:00409017 8975A8 mov dword ptr [ebp-58], esi //依次取用户名的2、3....字符ascii码，换算为十进制数
:0040901A DB45A8 fild dword ptr [ebp-58] //装入st0
:0040901D 83C4F4 add esp, FFFFFFF4
:00409020 DB3C24 fstp tbyte ptr [esp]
:00409023 895DA4 mov dword ptr [ebp-5C], ebx
:00409026 DB45A4 fild dword ptr [ebp-5C]
:00409029 83C4F4 add esp, FFFFFFF4
:0040902C DB3C24 fstp tbyte ptr [esp]
:0040902F E8FC820A00 call 004B1330 //计算用户名[i]的（i-1）次方
:00409034 D845AC fadd dword ptr [ebp-54] //累加
:00409037 895DA0 mov dword ptr [ebp-60], ebx
:0040903A DB45A0 fild dword ptr [ebp-60]
:0040903D DEE9 fsubp st(1), st(0) //减（i-1）
:0040903F D825CC914000 fsub dword ptr [004091CC] //减1
:00409045 D95DAC fstp dword ptr [ebp-54] //放入dword ptr [ebp-54]

:00409048 43 inc ebx
:00409049 47 inc edi

:0040904A 8B45B4 mov eax, dword ptr [ebp-4C]
:0040904D E8BEB60A00 call 004B4710
:00409052 3BC3 cmp eax, ebx
:00409054 77A3 ja 00408FF9 //i<=length(name)则跳回
.....
.....

但是存在一个问题，根据动态跟踪所得，若用户名>4位，则注册码有校正，我不知道是如何进行的？

注册机（用户名不超过4位）
（使用KOL&MCK控件，其中部分函数的写法依照此控件规定；delphi5.0编译通过，仅26K，哈哈）

main form中有editbox1，editbox2，button1

----------------cut here--------------------------------------
{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit Unit1;

interface

{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL {$IFNDEF KOL_MCK}, mirror, Classes,
mckCtrls, Controls {$ENDIF};
{$ELSE}
{$I uses.inc} mirror,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
mirror;
{$ENDIF}

type
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
PForm1 = ^TForm1;
TForm1 = object(TObj)
Form: PControl;
{$ELSE not_KOL_MCK}
TForm1 = class(TForm)
{$ENDIF KOL_MCK}
KOLProject1: TKOLProject;
KOLForm1: TKOLForm;
EditBox1: TKOLEditBox;
EditBox2: TKOLEditBox;
Button1: TKOLButton;
procedure Button1Click(Sender: PObj);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
len,a,b,i,t,code,sum:integer;
name:string;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}

procedure TForm1.Button1Click(Sender: PObj);
begin
len:=length(editbox1.text);
name:=editbox1.text;
if len=0 then editbox2.text:='input your name';
if len=1 then editbox2.text:=int2str(ord(name[1]))
else
if len>4 then editbox2.text:='this keygen only support name of 4 digits max！'
else
begin
i:=2; code:=0;
while i<=len do
begin
a:=ord(name[i]); b:=1; t:=2;
while t<= i do
begin
b:=b*a; t:=t+1;
end;
b:=b-i; code:=code+b;
i:=i+1;
end;
editbox2.text:=int2str(code+ord(name[1]));
end;
end;
end.

--------------------------end--------------------------------


光驱精灵.NET

 标 题:再贴一篇CDWizard(光驱精灵.NET),比较简单.主要是向各位讨教他的注册机的写法. (15千字)
发信人:crack007
时 间:2001-7-4 23:28:50
详细信息:
作者：Crack007[BCG]
主页：http://www.crack007.com ( ^-^ )
破解日期：2001-7-4
破解工具：TRW2000 1.23 W32dasm
难度：易

软件下载地址：http://www.csdn.net/soft/openfile.asp?kind=1&id=11092或http://yuxuguang.at.china.com/software/cnpu/CDWizard.zip （124K）

软件简介：　　光驱作为一种计算机常用外设是极其容易损坏的。对于普通光驱当读盘能力尚可，但是控制面板中的弹出键失灵时，若想使用光驱是一件很头疼的事。光驱精灵是解决这种难题的优秀软件之一。光驱精灵是一款小巧的光驱控制软件，光驱精灵.NET是其最新的版本。它能使用热键自由的控制光驱的打开和关闭，相对于同类软件，光驱精灵.NET短小精悍，功能强大，勿需任何动态链接库的支持，从内核真正的支持多光驱，并且支持虚拟光驱及特殊的刻录光驱等；它还拥有优化光驱、关机时检测光驱、隐藏光驱以及热键控制音量等功能，用户需要做的仅仅是简单的设置。

软件注册费：10.00￥/每注册用户

过程:

:00406FE0 6AFF push FFFFFFFF
:00406FE2 68D8454200 push 004245D8
:00406FE7 64A100000000 mov eax, dword ptr fs:[00000000]
:00406FED 50 push eax
:00406FEE 64892500000000 mov dword ptr fs:[00000000], esp
:00406FF5 81EC4C040000 sub esp, 0000044C
:00406FFB A128EB4200 mov eax, dword ptr [0042EB28]
:00407000 53 push ebx
:00407001 55 push ebp
:00407002 56 push esi
:00407003 57 push edi
:00407004 8BF1 mov esi, ecx
:00407006 89442410 mov dword ptr [esp+10], eax
:0040700A 6A01 push 00000001
:0040700C C784246804000000000000 mov dword ptr [esp+00000468], 00000000
:00407017 E8D7530100 call 0041C3F3
:0040701C 51 push ecx
:0040701D 8D6E5C lea ebp, dword ptr [esi+5C]
:00407020 8BCC mov ecx, esp
:00407022 89642418 mov dword ptr [esp+18], esp
:00407026 55 push ebp
:00407027 E8366F0100 call 0041DF62
:0040702C 8D4C2418 lea ecx, dword ptr [esp+18]
:00407030 51 push ecx
:00407031 8BCE mov ecx, esi
:00407033 E868020000 call 004072A0
:00407038 50 push eax
:00407039 8D4C2414 lea ecx, dword ptr [esp+14]
:0040703D C684246804000001 mov byte ptr [esp+00000468], 01
:00407045 E84C720100 call 0041E296
:0040704A 8D4C2414 lea ecx, dword ptr [esp+14]
:0040704E C684246404000000 mov byte ptr [esp+00000464], 00
:00407056 E892710100 call 0041E1ED
:0040705B 8B4500 mov eax, dword ptr [ebp+00]
:0040705E 6880014300 push 00430180
:00407063 50 push eax
:00407064 E840260000 call 004096A9
:00407069 83C408 add esp, 00000008
:0040706C 85C0 test eax, eax
:0040706E 7521 jne 00407091
:00407070 8B4660 mov eax, dword ptr [esi+60]
:00407073 6880014300 push 00430180
:00407078 50 push eax
:00407079 E82B260000 call 004096A9
:0040707E 83C408 add esp, 00000008
:00407081 85C0 test eax, eax
:00407083 750C jne 00407091

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004070DE(C)
|
:00407085 8BCE mov ecx, esi
:00407087 E8F12F0100 call 0041A07D
:0040708C E9E0010000 jmp 00407271

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040706E(C), :00407083(C)
|
:00407091 8B7E60 mov edi, dword ptr [esi+60] <-----可在这里设断.d edi 显示假的注册码
:00407094 8B442410 mov eax, dword ptr [esp+10] <-----d eax 显示正确注册码
:00407098 8D5E60 lea ebx, dword ptr [esi+60]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004070B9(C)
|
:0040709B 8A10 mov dl, byte ptr [eax]
:0040709D 8ACA mov cl, dl
:0040709F 3A17 cmp dl, byte ptr [edi]
:004070A1 751C jne 004070BF
:004070A3 84C9 test cl, cl
:004070A5 7414 je 004070BB
:004070A7 8A5001 mov dl, byte ptr [eax+01]
:004070AA 8ACA mov cl, dl
:004070AC 3A5701 cmp dl, byte ptr [edi+01]
:004070AF 750E jne 004070BF
:004070B1 83C002 add eax, 00000002
:004070B4 83C702 add edi, 00000002
:004070B7 84C9 test cl, cl
:004070B9 75E0 jne 0040709B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004070A5(C)
|
:004070BB 33C0 xor eax, eax 异或对eax清零
:004070BD EB05 jmp 004070C4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004070A1(C), :004070AF(C)
|
:004070BF 1BC0 sbb eax, eax eax清零
:004070C1 83D8FF sbb eax, FFFFFFFF 设置eax＝1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004070BD(U)
|
:004070C4 85C0 test eax, eax <------软件是否注册成功的标记
:004070C6 743E je 00407106 <------1 则死，0 则活
:004070C8 6A04 push 00000004

* Possible StringData Ref from Data Obj ->"警告"
|
:004070CA 68ECE24200 push 0042E2EC

* Possible StringData Ref from Data Obj ->"注册失败，重新注册吗？"
|
:004070CF 6870E54200 push 0042E570
:004070D4 8BCE mov ecx, esi
:004070D6 E8BC4B0100 call 0041BC97
:004070DB 83F806 cmp eax, 00000006
:004070DE 75A5 jne 00407085
:004070E0 6880014300 push 00430180
:004070E5 8BCD mov ecx, ebp
:004070E7 E8FA710100 call 0041E2E6
:004070EC 6880014300 push 00430180
:004070F1 8BCB mov ecx, ebx
:004070F3 E8EE710100 call 0041E2E6
:004070F8 6A00 push 00000000
:004070FA 8BCE mov ecx, esi
:004070FC E8F2520100 call 0041C3F3
:00407101 E96B010000 jmp 00407271

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004070C6(C)
|
:00407106 8D4C2418 lea ecx, dword ptr [esp+18]
:0040710A E80F790100 call 0041EA1E
:0040710F 8D4C2428 lea ecx, dword ptr [esp+28]
:00407113 C684246404000002 mov byte ptr [esp+00000464], 02
:0040711B E8D7740100 call 0041E5F7
:00407120 A128EB4200 mov eax, dword ptr [0042EB28]
:00407125 89442438 mov dword ptr [esp+38], eax
:00407129 6A00 push 00000000
:0040712B 8D4C243C lea ecx, dword ptr [esp+3C]
:0040712F C684246804000004 mov byte ptr [esp+00000468], 04
:00407137 C744242CFC814200 mov [esp+2C], 004281FC
:0040713F C744243400000000 mov [esp+34], 00000000
:00407147 C7442438FFFFFFFF mov [esp+38], FFFFFFFF
:0040714F E892710100 call 0041E2E6
:00407154 8B7D00 mov edi, dword ptr [ebp+00]
:00407157 8B13 mov edx, dword ptr [ebx]
:00407159 C684246404000005 mov byte ptr [esp+00000464], 05
:00407161 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407186(C)
|
:00407163 8A0C07 mov cl, byte ptr [edi+eax]
:00407166 80C112 add cl, 12
:00407169 884C043C mov byte ptr [esp+eax+3C], cl
:0040716D 8A0C02 mov cl, byte ptr [edx+eax]
:00407170 80C112 add cl, 12
:00407173 884C0448 mov byte ptr [esp+eax+48], cl
:00407177 8A4C0208 mov cl, byte ptr [edx+eax+08]
:0040717B 80C112 add cl, 12
:0040717E 884C0450 mov byte ptr [esp+eax+50], cl
:00407182 40 inc eax
:00407183 83F808 cmp eax, 00000008
:00407186 7CDB jl 00407163
:00407188 8D4C2428 lea ecx, dword ptr [esp+28]
:0040718C C644244400 mov [esp+44], 00
:00407191 51 push ecx
:00407192 6841800000 push 00008041

* Possible StringData Ref from Data Obj ->".\data.cwd"
|
:00407197 6824E54200 push 0042E524
:0040719C 8D4C2424 lea ecx, dword ptr [esp+24]
:004071A0 C644246400 mov [esp+64], 00
:004071A5 E886790100 call 0041EB30
:004071AA 85C0 test eax, eax
:004071AC 6A00 push 00000000
:004071AE 753C jne 004071EC
:004071B0 8D542460 lea edx, dword ptr [esp+60]
:004071B4 6800040000 push 00000400
:004071B9 52 push edx
:004071BA 8D4C2434 lea ecx, dword ptr [esp+34]
:004071BE E8D2740100 call 0041E695
:004071C3 6A00 push 00000000
:004071C5 8D442460 lea eax, dword ptr [esp+60]
:004071C9 6A00 push 00000000
:004071CB 50 push eax
:004071CC E87F980100 call 00420A50
:004071D1 8D4C2418 lea ecx, dword ptr [esp+18]
:004071D5 E8717B0100 call 0041ED4B
:004071DA C7442428FC814200 mov [esp+28], 004281FC
:004071E2 C684246404000006 mov byte ptr [esp+00000464], 06
:004071EA EB6B jmp 00407257

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004071AE(C)
|
:004071EC 6A10 push 00000010
:004071EE 8D4C2420 lea ecx, dword ptr [esp+20]
:004071F2 E8DB7A0100 call 0041ECD2
:004071F7 8D4C243C lea ecx, dword ptr [esp+3C]
:004071FB 6A08 push 00000008
:004071FD 51 push ecx
:004071FE 8D4C2420 lea ecx, dword ptr [esp+20]
:00407202 E8807A0100 call 0041EC87
:00407207 6A00 push 00000000
:00407209 6A28 push 00000028
:0040720B 8D4C2420 lea ecx, dword ptr [esp+20]
:0040720F E8BE7A0100 call 0041ECD2
:00407214 8D542448 lea edx, dword ptr [esp+48]
:00407218 6A10 push 00000010
:0040721A 52 push edx
:0040721B 8D4C2420 lea ecx, dword ptr [esp+20]
:0040721F E8637A0100 call 0041EC87
:00407224 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"恭喜"
|
:00407226 6868E54200 push 0042E568

* Possible StringData Ref from Data Obj ->"注册成功,请重新启动本程序"
|
:0040722B 684CE54200 push 0042E54C
:00407230 8BCE mov ecx, esi
:00407232 E8604A0100 call 0041BC97
:00407237 8D4C2418 lea ecx, dword ptr [esp+18]
:0040723B E80B7B0100 call 0041ED4B
:00407240 8BCE mov ecx, esi
:00407242 E8362E0100 call 0041A07D
:00407247 C7442428FC814200 mov [esp+28], 004281FC
:0040724F C684246404000007 mov byte ptr [esp+00000464], 07

跟一阵子之后，我觉得这好像是生成注册码的核心。主要是根据不同的名字（比如12121212）分别取每个字符跟dl、bl进行一些简单的运算，并把结果保存在al里，并根据不同的al值（应该是字符的ASCII码）的范围再进行一些运算。就可得到一个16位的注册码。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004073C8(C)
|
:00407351 8B07 mov eax, dword ptr [edi] <-----在这设断注意一下al、bl、dl、ecx、[esp+ecx+14]之间的关系，大家可以可清楚的看到注册码的生成。
:00407353 8A540C14 mov dl, byte ptr [esp+ecx+14]
:00407357 8A1C28 mov bl, byte ptr [eax+ebp]
:0040735A 8D3428 lea esi, dword ptr [eax+ebp]
:0040735D 8AC2 mov al, dl
:0040735F 02C3 add al, bl
:00407361 3C41 cmp al, 41
:00407363 88440C24 mov byte ptr [esp+ecx+24], al 生成第ecx+1位注册码（因为ecx初始值为0），不符合范围再进行调整。
^^^ ECX 的值是指现在取得是第几位字符
:00407367 7D06 jge 0040736F
:00407369 8AC2 mov al, dl
:0040736B 0441 add al, 41
:0040736D EB18 jmp 00407387

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407367(C)
|
:0040736F 3C5A cmp al, 5A
:00407371 7E0A jle 0040737D
:00407373 3C61 cmp al, 61
:00407375 7D06 jge 0040737D
:00407377 B05A mov al, 5A
:00407379 2AC2 sub al, dl
:0040737B EB0A jmp 00407387

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407371(C), :00407375(C)
|
:0040737D 3C7A cmp al, 7A
:0040737F 7E0A jle 0040738B
:00407381 8A440C1C mov al, byte ptr [esp+ecx+1C]
:00407385 0461 add al, 61

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040736D(U), :0040737B(U)
|
:00407387 88440C24 mov byte ptr [esp+ecx+24], al <-----生成第ecx+1位注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040737F(C)
|
:0040738B 8A06 mov al, byte ptr [esi]
:0040738D 8A5C0C1C mov bl, byte ptr [esp+ecx+1C]
:00407391 2AC3 sub al, bl
:00407393 3C41 cmp al, 41
:00407395 88440C2C mov byte ptr [esp+ecx+2C], al <-----生成第ecx+9位注册码，不符合范围再进行调整。
:00407399 7D0A jge 004073A5
:0040739B B05A mov al, 5A
:0040739D 2AC2 sub al, dl
:0040739F 88440C2C mov byte ptr [esp+ecx+2C], al <-----生成第ecx+9位注册码
:004073A3 EB1C jmp 004073C1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407399(C)
|
:004073A5 3C5A cmp al, 5A
:004073A7 7E09 jle 004073B2
:004073A9 3C61 cmp al, 61
:004073AB 7D05 jge 004073B2
:004073AD 80C261 add dl, 61
:004073B0 EB0B jmp 004073BD

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004073A7(C), :004073AB(C)
|
:004073B2 807C0C247A cmp byte ptr [esp+ecx+24], 7A
:004073B7 7E08 jle 004073C1
:004073B9 B27A mov dl, 7A
:004073BB 2AD3 sub dl, bl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004073B0(U)
|
:004073BD 88540C2C mov byte ptr [esp+ecx+2C], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004073A3(U), :004073B7(C)
|
:004073C1 41 inc ecx <-------ecx=ecx+1
:004073C2 83C704 add edi, 00000004 <-------改变edi的值用于下次计算
:004073C5 83F908 cmp ecx, 00000008 <-------供取八次（由此可知，注册名用八位以上的字符毫无意义，只取前八位。）
:004073C8 7C87 jl 00407351 <-------循环

整理一下：
Name: Crack007(Crack007[BCG]也可，不过没什么实际意义)
Code: DosHAedFWgpBZcdU

似乎是万事大吉了，但，但最初的edi等值是怎么来的，我一直没看出来。于是对写注册机而言以上变得毫无意义。大家帮帮忙指点一下吧。


汉字通

 标 题:汉字通破解手记 (19千字)
发信人:浪子沈七
时 间:2000-9-6 1:54:41
详细信息:
汉字通破解手记
软件下载:http://kanjiweb.com/anonftp/pub/kanjiweb.exe

***********
写一篇破解过程,错误不少,还望包涵,贻笑大方了.
***********

运行Multword.exe,按X,出现注册窗口,告诉你序列号,我这里是34936378,以此为例.
按register注册,输入注册码7878,ctrl+d到sice,下bpx hmemcpy,g回到程序.
按ok后,sice很听话的跳出来了.按f12到跳出错误窗口,记住按的次数.
然后重复来一下,现在按的次数比刚才少1.然后开始按f10.
现在一步步跟吧.
……以下略去若干行.

:0001.37BF 8D8658FE lea ax, [bp+FE58]
:0001.37C3 8CD2 mov dx, ss
:0001.37C5 52 push dx
………
:0001.37F7 9A907A8537 call 0001.7A90
:0001.37FC 83C40A add sp, 000A
:0001.37FF 23C0 and ax, ax
:0001.3801 7403 je 3806

:0001.3806 8D8630FE lea ax, [bp+FE30]
:0001.380A 8CD2 mov dx, ss
:0001.380C 52 push dx
………
:0001.3894 9ABA716038 call 0001.71BA
:0001.3899 83C408 add sp, 0008
:0001.389C 8A861EFE mov al , [bp+FE1E]
:0001.38A0 98 cbw
:0001.38A1 05FBFF add ax, FFFB
:0001.38A4 50 push ax
:0001.38A5 8D86BCFE lea ax, [bp+FEBC]
:0001.38A9 8CD2 mov dx, ss
:0001.38AB 52 push dx
:0001.38AC 50 push ax
:0001.38AD FF76E8 push word ptr [bp-18]
:0001.38B0 9A8E729738 call 0001.728E
:0001.38B5 83C408 add sp, 0008
:0001.38B8 C78638FE0000 mov word ptr [bp-01C8], 0000
:0001.38BE EB11 jmp 38D1

:0001.38C0 8B8638FE mov ax, [bp+FE38]
:0001.38C4 8D9EBCFE lea bx, [bp+FEBC]
:0001.38C8 03D8 add bx, ax
:0001.38CA 803786 xor byte ptr [bx], 86
:0001.38CD FF8638FE inc word ptr [bp+FE38]

:0001.38D1 83BE38FE09 cmp word ptr [bp+FE38], 0009
:0001.38D6 7CE8 jl 38C0

:0001.38D8 8D86BCFE lea ax, [bp+FEBC]
:0001.38DC 8CD2 mov dx, ss
:0001.38DE 52 push dx
:0001.38DF 50 push ax
:0001.38E0 8D863AFE lea ax, [bp+FE3A]
:0001.38E4 8CD2 mov dx, ss
:0001.38E6 52 push dx
:0001.38E7 50 push ax
:0001.38E8 9A7C77B338 call 0001.777C
:0001.38ED 83C408 add sp, 0008
:0001.38F0 23C0 and ax, ax
:0001.38F2 7403 je 38F7
:0001.38F4 E94D00 jmp 3944

:0001.3954 B8EC08 mov ax, 08EC
:0001.3957 8CDA mov dx, ds
:0001.3959 52 push dx
:0001.395A 50 push ax
:0001.395B 6A00 push 0000
:0001.395D 9AD7020000 call USER.MESSAGEBOX
到这里按f10后跳出错误窗口.
是什么让程序跳到这里的?能不能避开?
向上看看,哦.0001.38E8这里有点问题.如果38f2跳转会怎么样?
从38f7一路下来会有个0001.3942 EB1E jmp 3962,跳到3962就避开了会跳出错误窗口的395d了.
可以在38f0处下r ax 0或者38f2处下a命令,然后输入jnz 38f7或者jmp 38f7,
按g回到程序后,没有注册窗口,重新运行软件,register那里不可按了,注册成功.

***********
如果你要改软件注册的话到这里可以了.
可以用ultra edit/winhex/hiew等软件找83C40823C07403,改74为75或者eb.这样就做出了修改版.
如果要找注册码的继续向下看了:
***********

现在不可注册了.软件写了什么注册标记呢用?用fileopen/regopen等软件来看看软件运行,或者用w32dasm分析一下,注册标记是在Multfont.dll文件中.重新装一下软件.可以先复制一下Multfont.dll.
38f2在38E8 call 0001.777C后面,这777c里面是什么?会让38f2的ax为0(注册成功)或者1(注册失败)?
我们再来一遍,在38e8按f8进入这个call看看.

:0001.777C 55 push bp
:0001.777D 8BEC mov bp, sp
:0001.777F 8BD7 mov dx, di
:0001.7781 8BDE mov bx, si
:0001.7783 1E push ds
:0001.7784 C57606 lds si, [bp+06]
:0001.7787 C47E0A les di, [bp+0A]
:0001.778A 33C0 xor ax, ax
:0001.778C B9FFFF mov cx, FFFF
:0001.778F F2 repnz
:0001.7790 AE scasb
:0001.7791 F7D1 not cx
:0001.7793 2BF9 sub di, cx
:0001.7795 F3 repz
:0001.7796 A6 cmpsb
:0001.7797 7405 je 779E
:0001.7799 1BC0 sbb ax, ax
:0001.779B 83D8FF sbb ax, FFFF

:0001.779E 1F pop ds
:0001.779F 8BF3 mov si, bx
:0001.77A1 8BFA mov di, dx
:0001.77A3 5D pop bp
:0001.77A4 CB retf

按字节比较串指令,数据段由si寻址存储单元和di寻址存储单元比较.带有前缀repe,相等继续比较.比较后cx寄存器为0,两者相等,不为0,两者不相等.如两者不相等.7790带借位相减ax=0,779b相减ax=1.
在7796下d ds:si,看到输入的7878.
d es:di看到真正的注册码1CMPSU4Yb.

***********
如果你要注册码的话到这里可以了.
但注册码1CMPSU4Yb对应的序列号是34936378,别的机器并不能用.
如果要找别的机子也可以用方法继续向下看了:
***********

注册标记是放在Multfont.dll中,我们可以用winhex来比较一下注册后的和注册前的有什么不同.
在19140h处未注册版是0409d007.注册版是15026619.
15026619->19660215.熟悉吧.这是个日期.
可能是作者的生日,也可能是作者的MM的生日.我们就不用管它了.你可以写信给作者问问看.^-^
那0409d007->07d00904是什么?07d0转换成十进制数字是2000.09转换成十进制是09,04转换成十进制是04,
20000904?怎么这么熟悉?哦.这不就是昨天装软件的日期嘛.
这个软件有十五天的试用期,第一次使用的日期就放在这里.
现在我们用最开始未使用过的Multfont.dll复制注册文件.
运行软件注册窗口出现不同的序列号.
用ultra edit等软件来改Multfont.dll文件从19140h开始改为15026619.
重新运行软件,register不可按,注册成功.

***********
如果你要找别的机子也能用的注册方法到这里可以了.
如果要找注册算法继续向下看了:
***********

现在我们想找注册算法以做出注册器,7796处真正的注册码是从哪里来的?
0001.7787有个les di, [bp+0A],但我们还是不知道的.^-^
现在向上看看,再想想,我们这一路跟踪下来有什么值得怀疑的地方吗?

:0001.38C0 8B8638FE mov ax, [bp+FE38]
:0001.38C4 8D9EBCFE lea bx, [bp+FEBC]
:0001.38C8 03D8 add bx, ax
:0001.38CA 803786 xor byte ptr [bx], 86
:0001.38CD FF8638FE inc word ptr [bp+FE38]

:0001.38D1 83BE38FE09 cmp word ptr [bp+FE38], 0009
:0001.38D6 7CE8 jl 38C0

38d1这里没事比较[bp+fe39]和9的值做什么?吃饱了撑的?^-^当然不是了.
在这里的循环做什么呢?看38ca.目的是[bx]中值xor 86.
也就是[bp+FEBC]中开始9个字节xor 86.[bp+FEBC]是什么东东?
在38c4我们这里下d bx看看,是b7,c5,cb,d6,d5,d3,b2,df,e4.
这几个数依次xor 86后成了31,43,4d,50,53,55,34,59,62.
就是我们要找的注册码1CMPSU4Yb.
b7,c5,cb,d6,d5,d3,b2,df,e4,这几个数字又是从哪里来的呢?
往上找吧.0001.37F7 call 0001.7A90这里进去看看,
:0001.7A90 8CD8 mov ax, ds
:0001.7A92 90 nop
:0001.7A93 45 inc bp
:0001.7A94 55 push bp
:0001.7A95 8BEC mov bp, sp
:0001.7A97 1E push ds
:0001.7A98 8ED8 mov ds, ax
:0001.7A9A 1E push ds
:0001.7A9B C55606 lds dx, [bp+06]
:0001.7A9E 8B460A mov ax, [bp+0A]
:0001.7AA1 B43D mov ah, 3D
:0001.7AA3 2EF706B06A0100 test word ptr cs:[6AB0], 0001
:0001.7AAA 7407 je 7AB3
:0001.7AAC 9A767A0000 call KERNEL.DOS3CALL
dos3call?
这是做什么?哦.dos功能调用.
7aa1处ah=3d.功能号为3d的dos功能调用是打开一个文件.
ds:dx为文件名地址.所以我们在7aac这里下ds:dx看看,程序打开的是Multfont.dll文件.
再下来
3894 call 0001.71BA
进入后
……
:0001.71F7 8BD1 mov dx, cx
:0001.71F9 B80142 mov ax, 4201
:0001.71FC 2EF706B06A0100 test word ptr cs:[6AB0], 0001
:0001.7203 7407 je 720C
:0001.7205 9A446D0000 call KERNEL.DOS3CALL
71f9处ax=4201.ah=42.al=01
功能号为42的dos功能调用是移动文件指针.al为移动方式,al=0表示指针从文件开始位置移动.
在7205处看dx值为9145,这是移动字节数低有效16位,cx值为1,这是移动字节数高有效16位.
所以指针移动19145h字节.
Multfont.dll的19145h字节开始是什么?
b7,c5,cb,d6,d5,d3,b2,df,e4.
这就是我们找的数.
移动到这里要读吧.是的.然后程序在38B0处开始读这些数.
进入call 0001.728E
:0001.72DF B43F mov ah, 3F
:0001.72E1 2EF706B06A0100 test word ptr cs:[6AB0], 0001
:0001.72E8 7407 je 72F1
:0001.72EA 9A7C720000 call KERNEL.DOS3CALL
:0001.72EF EB02 jmp 72F3
功能号为3f的dos功能调用是读文件,
cx的值是读取的字节数,这里是19.
ds:dx是文件数据缓冲区地址.
我们看看是什么东东.哦.就是b7,c5,cb,d6,d5,d3,b2,df,e4，……19个字节数值.
但只有前面9个对我们有用.
现在我们可以来写注册器了.
读取Multfont.dll中从19145h开始9个字节,然后每一个xor 86.
结果就是注册码了.
啊.这就算注册器啊?
怎么不是,还很自动呢.不用输入序列号.:)
虽然这是非常正确的,但有些观众耐心听我的废话看到这里,本来想写个注册器让MM开心一下,没想到却是看到这样的注册器.唉,大家不要着急嘛.其实给MM用自动的多好.漂亮的女人是比较懒吧.:)

***********
如果你要找注册算法写出注册器的话到这里可以了.
如果要找完整的注册算法写出真正的注册器继续向下看了:
***********

这要找序列号和注册码的关系了.
我们来看看序列号是什么.34936378.
还记得38b0处程序读了19个字节吧.如果你比较未运行前和运行后的Multfont.dll也可以看到,
在1914fh开始4个字节是02,15,10,3a.
0215103a?我们拿出windows设计得最好最有用途的工具计算器来看看.^-^
0215103ah转换成十进制就是34936378.
现在思路进一步清楚了.
程序读取Multfont.dll文件中1914fh开始4个字节,转换成十六进制的数做为注册窗口中出现的序列号.
当输入的注册码xor 86后与19145h开始9个字节相等的话,注册成功.
Multfont.dll文件是什么时候开始写进这些与序列号注册码有关的数值的?
比较我们以前复制的未第一次运行和运行后的Multfont.dll文件,
未第一次运行前19140h开始是:
ff,ff,ff,ff,ff,31,43,4b,4e,52,53,32,54,54,00,00
00,00,00,00,00,00,00,00,00,41,4e,44,59,1e
其中19145h开始9个字节是1CKNRS2TT.
运行后19140h开始是:
04,09,d0,07,ff,b7,c5,cb,d6,d5,d3,b2,df,e4,00,02
15,16,3a,00,00,00,00,00,00,41,4e,44,59,1e
我们可以看出,程序运行第一次的时候,写进了第一次运行日期,写进了与序列号有关的数值,写进了与注册码有关的数值.这样来看,我们要找出序列号和注册码的关系是要在程序第一次运行的时候.
这就是关键所在了.
我们把未运行的Multfont.dll文件覆盖运行后文件,让程序以为是第一次运行.
这样,它会开始写进这些数值.
它什么时候写?用什么些?
我们想到了软件一直使用的dos功能调用call KERNEL.DOS3CALL.
写文件的功能号是40.
我们在softice中下bpx dos3call if ah==40,
运行软件后softice中断.
按f10到这里
:0001.7587 B440 mov ah, 40
:0001.7589 2EF706B06A0100 test word ptr cs:[6AB0], 0001
:0001.7590 7407 je 7599
:0001.7592 9A13750000 call KERNEL.DOS3CALL
下d dx,看到写进的是0409d007.ax=4,写进4个字节.
这个7587在:0001.041A call 0001.7406这个call里面.

:0001.041A 9A06740904 call 0001.7406
:0001.041F 83C408 add sp, 0008
:0001.0422 6A00 push 0000
:0001.0424 8B860EFF mov ax, [bp+FF0E]
:0001.0428 8B9610FF mov dx, [bp+FF10]
:0001.042C 050500 add ax, 0005
:0001.042F 83D200 adc dx, 0000
:0001.0432 52 push dx
:0001.0433 50 push ax
:0001.0434 FF7684 push word ptr [bp-7C]
:0001.0437 9ABA711D04 call 0001.71BA
:0001.043C 83C408 add sp, 0008
:0001.043F 6A09 push 0009
:0001.0441 8D86F2FE lea ax, [bp+FEF2]
:0001.0445 8CD2 mov dx, ss
:0001.0447 52 push dx
:0001.0448 50 push ax
:0001.0449 FF7684 push word ptr [bp-7C]
:0001.044C 9A8E723A04 call 0001.728E
:0001.0451 83C408 add sp, 0008
:0001.0454 8D86ECFE lea ax, [bp+FEEC]
:0001.0458 8CD2 mov dx, ss
:0001.045A 52 push dx
:0001.045B 50 push ax
:0001.045C 9A287B4F04 call 0001.7B28
:0001.0461 83C404 add sp, 0004
:0001.0464 8A86EFFE mov al , [bp+FEEF]
:0001.0468 25FF00 and ax, 00FF
:0001.046B B90A00 mov cx, 000A
:0001.046E 99 cwd
:0001.046F F7F9 idiv cx
:0001.0471 0086F3FE add [bp+FEF3], al
:0001.0475 8A86EFFE mov al , [bp+FEEF]
:0001.0479 25FF00 and ax, 00FF
:0001.047C B90A00 mov cx, 000A
:0001.047F 99 cwd
:0001.0480 F7F9 idiv cx
:0001.0482 0096F4FE add [bp+FEF4], dl
:0001.0486 8A86ECFE mov al , [bp+FEEC]
:0001.048A 25FF00 and ax, 00FF
:0001.048D B90A00 mov cx, 000A
:0001.0490 99 cwd
:0001.0491 F7F9 idiv cx
:0001.0493 0086F5FE add [bp+FEF5], al
:0001.0497 8A86ECFE mov al , [bp+FEEC]
:0001.049B 25FF00 and ax, 00FF
:0001.049E B90A00 mov cx, 000A
:0001.04A1 99 cwd
:0001.04A2 F7F9 idiv cx
:0001.04A4 0096F6FE add [bp+FEF6], dl
:0001.04A8 8A86EDFE mov al , [bp+FEED]
:0001.04AC 25FF00 and ax, 00FF
:0001.04AF B90A00 mov cx, 000A
:0001.04B2 99 cwd
:0001.04B3 F7F9 idiv cx
:0001.04B5 0086F7FE add [bp+FEF7], al
:0001.04B9 8A86EDFE mov al , [bp+FEED]
:0001.04BD 25FF00 and ax, 00FF
:0001.04C0 B90A00 mov cx, 000A
:0001.04C3 99 cwd
:0001.04C4 F7F9 idiv cx
:0001.04C6 0096F8FE add [bp+FEF8], dl
:0001.04CA 8A86EEFE mov al , [bp+FEEE]
:0001.04CE 25FF00 and ax, 00FF
:0001.04D1 B90A00 mov cx, 000A
:0001.04D4 99 cwd
:0001.04D5 F7F9 idiv cx
:0001.04D7 0086F9FE add [bp+FEF9], al
:0001.04DB 8A86EEFE mov al , [bp+FEEE]
:0001.04DF 25FF00 and ax, 00FF
:0001.04E2 B90A00 mov cx, 000A
:0001.04E5 99 cwd
:0001.04E6 F7F9 idiv cx
:0001.04E8 0096FAFE add [bp+FEFA], dl
先停一下,以免看多了头晕.
注意0464这里: mov al , [bp+FEEF]
引进了一个[bp+feef].
进入上面的045c call 0001.7B28可看到:
……
:0001.7B32 B42C mov ah, 2C
:0001.7B34 2EF706B06A0100 test word ptr cs:[6AB0], 0001
:0001.7B3B 7407 je 7B44
:0001.7B3D 9A047B0000 call KERNEL.DOS3CALL
功能号是2c的dos功能调用是读系统时间.
ch是小时数,cl是分钟数,dh是秒数,dl是百分之一秒数.
这个call不看也可以,看了就会明白序列号是怎么来的了.原来是读系统时间的结果.
为了解释方便,这里还是以02,15,16,3a为例.
(第一次运行软件时间是在15点16分钟58.02秒,啊,在softice作用下我的系统时间又改变了,这里不是早上2点15分哦,第一个和第四个变换一下,但是这与注册算法无关就是了,不必看.^-^)
0464处al为02,046f处al(02)除以cx(常量a),
0471处[bp+fef3]数值加上2/a商0,[bp+fef3]值为常量1CKNRS2TT(1没有算)中的'C'.'C'+0='C',
0475处al仍为02,0480处al(02)除以cx(常量a),
0482处[bp+FEF4]数值加上2/a余数2,[bp+fef4]值为常量1CKNRS2TT中的'K'.'C'+2='M',
接下来分别用15,16,3a除以a,商及余数加到常量1CKNRS2TT对应的数值中.
[bp+fef3]开始数值是CMPSU4Y\,加上前面的1,[bp+fef2]开始数值是1CMPSU4Y\,
这个和注册码有点象了.但还不是真正的注册码,继续往下看:
:0001.04EC 8A86F3FE mov al , [bp+FEF3]
:0001.04F0 98 cbw
:0001.04F1 3D5A00 cmp ax, 005A
:0001.04F4 7E05 jle 04FB
:0001.04F6 8086F3FE06 add byte ptr [bp+FEF3], 06
比较[bp+fef3]数值与5a大小,若小于就跳,继续比较下一个字节,如大于数值加6,以下同.
:0001.04FB 8A86F4FE mov al , [bp+FEF4]
:0001.04FF 98 cbw
:0001.0500 3D5A00 cmp ax, 005A
:0001.0503 7E05 jle 050A
:0001.0505 8086F4FE06 add byte ptr [bp+FEF4], 06
:0001.050A 8A86F5FE mov al , [bp+FEF5]
:0001.050E 98 cbw
:0001.050F 3D5A00 cmp ax, 005A
:0001.0512 7E05 jle 0519
:0001.0514 8086F5FE06 add byte ptr [bp+FEF5], 06
:0001.0519 8A86F6FE mov al , [bp+FEF6]
:0001.051D 98 cbw
:0001.051E 3D5A00 cmp ax, 005A
:0001.0521 7E05 jle 0528
:0001.0523 8086F6FE06 add byte ptr [bp+FEF6], 06
:0001.0528 8A86F7FE mov al , [bp+FEF7]
:0001.052C 98 cbw
:0001.052D 3D5A00 cmp ax, 005A
:0001.0530 7E05 jle 0537
:0001.0532 8086F7FE06 add byte ptr [bp+FEF7], 06
:0001.0537 8A86F8FE mov al , [bp+FEF8]
:0001.053B 98 cbw
:0001.053C 3D5A00 cmp ax, 005A
:0001.053F 7E05 jle 0546
:0001.0541 8086F8FE06 add byte ptr [bp+FEF8], 06
:0001.0546 8A86F8FE mov al , [bp+FEF8]
:0001.054A 98 cbw
:0001.054B 3D3900 cmp ax, 0039
:0001.054E 7E0F jle 055F
:0001.0550 8A86F8FE mov al , [bp+FEF8]
:0001.0554 98 cbw
:0001.0555 3D4100 cmp ax, 0041
:0001.0558 7D05 jge 055F
:0001.055A 8086F8FE07 add byte ptr [bp+FEF8], 07
这里比较奇怪点,如果[bp+FEF8]数值大于39同时小于41,加上7.
:0001.055F 8A86F9FE mov al , [bp+FEF9]
:0001.0563 98 cbw
:0001.0564 3D5A00 cmp ax, 005A
:0001.0567 7E05 jle 056E
:0001.0569 8086F9FE06 add byte ptr [bp+FEF9], 06
:0001.056E 8A86FAFE mov al , [bp+FEFA]
:0001.0572 98 cbw
:0001.0573 3D5A00 cmp ax, 005A
:0001.0576 7E05 jle 057D
:0001.0578 8086FAFE06 add byte ptr [bp+FEFA], 06
一路下来,我们的1CMPSU4Y\总算在这里加上了一次.'\'是5c,大于5a,'\'+6='b',
:0001.057D 6A00 push 0000
:0001.057F 8B860EFF mov ax, [bp+FF0E]
:0001.0583 8B9610FF mov dx, [bp+FF10]
:0001.0587 050500 add ax, 0005
:0001.058A 83D200 adc dx, 0000
:0001.058D 52 push dx
:0001.058E 50 push ax
:0001.058F FF7684 push word ptr [bp-7C]
:0001.0592 9ABA715F04 call 0001.71BA
:0001.0597 83C408 add sp, 0008
:0001.059A C786F0FE0000 mov word ptr [bp-0110], 0000
:0001.05A0 EB11 jmp 05B3

:0001.05A2 8B86F0FE mov ax, [bp+FEF0]
:0001.05A6 8D9EF2FE lea bx, [bp+FEF2]
:0001.05AA 03D8 add bx, ax
:0001.05AC 803786 xor byte ptr [bx], 86
:0001.05AF FF86F0FE inc word ptr [bp+FEF0]

:0001.05B3 83BEF0FE09 cmp word ptr [bp+FEF0], 0009
:0001.05B8 7CE8 jl 05A2

这个循环是把注册码1CMPSU4Yb xor 86,变成了b7,c5,cb,d6,d5,d3,b2,df,e4.
还记得38c0的循环吧.
下面应该开始写文件了吧.是的.
:0001.05C7 9A06749505 call 0001.7406
把与注册码相关的b7,c5,cb,d6,d5,d3,b2,df,e4.写入Multfont.dll文件.
:0001.05F9 9A0674E705 call 0001.7406
:0001.060E 9A0674FC05 call 0001.7406
:0001.0623 9A06741106 call 0001.7406
:0001.0638 9A06742606 call 0001.7406
分四次把与序列号相关也是与程序第一次运行时间相关的02,15,16,3a写入Multfont.dll文件.

现在整个完整算法都出来了.
啊.我要睡觉了.

2000年9月6日.


豪杰大眼睛共享版

 标 题:豪杰大眼睛共享版注册码破解 (1千字)
发信人:lancelot
时 间:2001-7-8 23:33:00
详细信息:
先调整系统时间，让软件过期，下断点 bpx getprivateprofilestringa, F12一下，
F10一下，到 :00416415

* Referenced by a CALL at Address:
|:004168FB
|
:004163F0 56 push esi

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:013Ah
|
:004163F1 8B358C314400 mov esi, dword ptr [0044318C]

* Possible StringData Ref from Data Obj ->"HeroSHOW.INI"
|
:004163F7 6890604400 push 00446090

* Possible Reference to Menu: MenuID_0080
|
:004163FC 6880000000 push 00000080
:00416401 681CB64400 push 0044B61C<---用户名
:00416406 6860AF4400 push 0044AF60

* Possible StringData Ref from Data Obj ->"USERNAME"
|
:0041640B 6854644400 push 00446454

* Possible StringData Ref from Data Obj ->"REGISTER"
|
:00416410 6848644400 push 00446448
:00416415 FFD6 call esi<---退出到这里

* Possible StringData Ref from Data Obj ->"HeroSHOW.INI"
|
:00416417 6890604400 push 00446090

* Possible Reference to Menu: MenuID_0080
|
:0041641C 6880000000 push 00000080
:00416421 6818C14400 push 0044C118<---假注册码
:00416426 6860AF4400 push 0044AF60

* Possible StringData Ref from Data Obj ->"KEY"
|
:0041642B 6844644400 push 00446444

* Possible StringData Ref from Data Obj ->"REGISTER"
|
:00416430 6848644400 push 00446448
:00416435 FFD6 call esi
:00416437 5E pop esi
:00416438 C3 ret<---退出到004168fb
=================================================================待续

标 题:续2 (1千字)
发信人:lancelot
时 间:2001-7-8 23:33:52
详细信息:

:004168FB E8F0FAFFFF call 004163F0<---到这里
:00416900 E8ABFAFFFF call 004163B0
:00416905 891D24C24400 mov dword ptr [0044C224], ebx

* Reference To: KERNEL32.GetACP, Ord:00B9h
|
:0041690B FF15A8314400 Call dword ptr [004431A8]
:00416911 8BF8 mov edi, eax
:00416913 8D9424E0010000 lea edx, dword ptr [esp+000001E0]
:0041691A 57 push edi
:0041691B 6888BB4400 push 0044BB88

* Possible StringData Ref from Data Obj ->"%sSHOW%d.DLL"
|
:00416920 68C0674400 push 004467C0
:00416925 52 push edx

* Reference To: USER32.wsprintfA, Ord:02ACh
|
:00416926 FF15A4344400 Call dword ptr [004434A4]
:0041692C 83C410 add esp, 00000010
:0041692F 8D8424E0010000 lea eax, dword ptr [esp+000001E0]
:00416936 50 push eax

* Reference To: KERNEL32.LoadLibraryA, Ord:01C2h
|
:00416937 FF152C324400 Call dword ptr [0044322C]
:0041693D 3BC3 cmp eax, ebx
:0041693F 740B je 0041694C
:00416941 893D24C24400 mov dword ptr [0044C224], edi
:00416947 A398C14400 mov dword ptr [0044C198], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041693F(C)
|
:0041694C 3BEB cmp ebp, ebx
:0041694E 7407 je 00416957
:00416950 E8BBFDFFFF call 00416710<---跟进去
:00416955 EB0A jmp 00416961

=====================================================================
待续

标 题:续3 (9千字)
发信人:lancelot
时 间:2001-7-8 23:34:51
详细信息:

* Referenced by a CALL at Address:
|:00416950
|
:00416710 55 push ebp
:00416711 8BEC mov ebp, esp
:00416713 6AFF push FFFFFFFF
:00416715 68B0354400 push 004435B0
:0041671A 6814934300 push 00439314
:0041671F 64A100000000 mov eax, dword ptr fs:[00000000]
:00416725 50 push eax
:00416726 64892500000000 mov dword ptr fs:[00000000], esp
:0041672D 83EC08 sub esp, 00000008
:00416730 53 push ebx
:00416731 56 push esi
:00416732 57 push edi
:00416733 8965E8 mov dword ptr [ebp-18], esp
:00416736 C745FC00000000 mov [ebp-04], 00000000
:0041673D 68B0B24400 push 0044B2B0

* Reference To: KRNLAPI.Ordinal:001B, Ord:001Bh
|
:00416742 E813260200 Call 00438D5A
:00416747 83C404 add esp, 00000004
:0041674A 85C0 test eax, eax
:0041674C 7419 je 00416767
:0041674E 6818C14400 push 0044C118
:00416753 681CB64400 push 0044B61C
:00416758 E8E3CDFEFF call 00403540<---跟进去，核心计算
:0041675D 83C408 add esp, 00000008
:00416760 A358C24400 mov dword ptr [0044C258], eax
:00416765 EB1F jmp 00416786

===================================================================

* Referenced by a CALL at Address:
|:00416758
|
:00403540 83EC20 sub esp, 00000020
:00403543 B908000000 mov ecx, 00000008
:00403548 33C0 xor eax, eax
:0040354A 53 push ebx
:0040354B 55 push ebp
:0040354C 8B6C2430 mov ebp, dword ptr [esp+30]
:00403550 56 push esi
:00403551 57 push edi
:00403552 8D7C2410 lea edi, dword ptr [esp+10]
:00403556 F3 repz
:00403557 AB stosd
:00403558 8BDD mov ebx, ebp
:0040355A 8D442410 lea eax, dword ptr [esp+10]
:0040355E 33F6 xor esi, esi
:00403560 2BD8 sub ebx, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403586(C)
|
:00403562 8D7C3410 lea edi, dword ptr [esp+esi+10]
:00403566 0FBE043B movsx eax, byte ptr [ebx+edi]<--注册码
:0040356A 83F841 cmp eax, 00000041 第一字
:0040356D 7C08 jl 00403577
:0040356F 83F85A cmp eax, 0000005A
:00403572 7F03 jg 00403577
:00403574 83C020 add eax, 00000020

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040356D(C), :00403572(C)
|
:00403577 50 push eax
:00403578 E863FFFFFF call 004034E0
:0040357D 83C404 add esp, 00000004
:00403580 46 inc esi
:00403581 83FE04 cmp esi, 00000004
:00403584 8807 mov byte ptr [edi], al
:00403586 7CDA jl 00403562
:00403588 8B442410 mov eax, dword ptr [esp+10]
:0040358C 8D4801 lea ecx, dword ptr [eax+01]
:0040358F 0FAFC8 imul ecx, eax
:00403592 894C2414 mov dword ptr [esp+14], ecx
:00403596 33F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004035B9(C)
|
:00403598 8A543414 mov dl, byte ptr [esp+esi+14]
:0040359C 52 push edx
:0040359D 56 push esi
:0040359E E81DFFFFFF call 004034C0
:004035A3 25FF000000 and eax, 000000FF
:004035A8 50 push eax
:004035A9 E832FFFFFF call 004034E0
:004035AE 83C40C add esp, 0000000C
:004035B1 88443414 mov byte ptr [esp+esi+14], al<--算出第5个字
:004035B5 46 inc esi
:004035B6 83FE04 cmp esi, 00000004<--循环算出6,7,8个字
:004035B9 7CDD jl 00403598
:004035BB 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004035E0(C)
|
:004035BD 0FBE442905 movsx eax, byte ptr [ecx+ebp+05]
:004035C2 83F841 cmp eax, 00000041
:004035C5 7C08 jl 004035CF
:004035C7 83F85A cmp eax, 0000005A
:004035CA 7F03 jg 004035CF
:004035CC 83C020 add eax, 00000020

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004035C5(C), :004035CA(C)
|
:004035CF 0FBE540C14 movsx edx, byte ptr [esp+ecx+14]
:004035D4 3BC2 cmp eax, edx<---与假注册码比较
:004035D6 0F85BA000000 jne 00403696
:004035DC 41 inc ecx
:004035DD 83F904 cmp ecx, 00000004
:004035E0 7CDB jl 004035BD
:004035E2 8B442414 mov eax, dword ptr [esp+14]
:004035E6 8B4C2410 mov ecx, dword ptr [esp+10]
:004035EA 8BD0 mov edx, eax
:004035EC 33D1 xor edx, ecx
:004035EE 42 inc edx
:004035EF 0FAFD1 imul edx, ecx
:004035F2 03D0 add edx, eax
:004035F4 33F6 xor esi, esi
:004035F6 89542418 mov dword ptr [esp+18], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403610(C)
|
:004035FA 0FBE443418 movsx eax, byte ptr [esp+esi+18]
:004035FF 50 push eax
:00403600 E8DBFEFFFF call 004034E0
:00403605 83C404 add esp, 00000004
:00403608 88443418 mov byte ptr [esp+esi+18], al
:0040360C 46 inc esi
:0040360D 83FE04 cmp esi, 00000004<--由5,6,7,8算出
:00403610 7CE8 jl 004035FA 9,10,11,12个字
:00403612 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403633(C)
|
:00403614 0FBE44290A movsx eax, byte ptr [ecx+ebp+0A]
:00403619 83F841 cmp eax, 00000041
:0040361C 7C08 jl 00403626
:0040361E 83F85A cmp eax, 0000005A
:00403621 7F03 jg 00403626
:00403623 83C020 add eax, 00000020

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040361C(C), :00403621(C)
|
:00403626 0FBE540C18 movsx edx, byte ptr [esp+ecx+18]
:0040362B 3BC2 cmp eax, edx<---与假注册码比较
:0040362D 7567 jne 00403696
:0040362F 41 inc ecx
:00403630 83F904 cmp ecx, 00000004
:00403633 7CDF jl 00403614
:00403635 8B4C2414 mov ecx, dword ptr [esp+14]
:00403639 8B442410 mov eax, dword ptr [esp+10]
:0040363D 0FAFC8 imul ecx, eax
:00403640 41 inc ecx
:00403641 0FAF4C2418 imul ecx, dword ptr [esp+18]
:00403646 03C8 add ecx, eax
:00403648 33F6 xor esi, esi
:0040364A 894C241C mov dword ptr [esp+1C], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403664(C)
|
:0040364E 0FBE54341C movsx edx, byte ptr [esp+esi+1C]
:00403653 52 push edx
:00403654 E887FEFFFF call 004034E0
:00403659 83C404 add esp, 00000004
:0040365C 8844341C mov byte ptr [esp+esi+1C], al
:00403660 46 inc esi
:00403661 83FE04 cmp esi, 00000004<--注册码的13,14,15,16个字
:00403664 7CE8 jl 0040364E
:00403666 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403687(C)
|
:00403668 0FBE44290F movsx eax, byte ptr [ecx+ebp+0F]
:0040366D 83F841 cmp eax, 00000041
:00403670 7C08 jl 0040367A
:00403672 83F85A cmp eax, 0000005A
:00403675 7F03 jg 0040367A
:00403677 83C020 add eax, 00000020

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00403670(C), :00403675(C)
|
:0040367A 0FBE540C1C movsx edx, byte ptr [esp+ecx+1C]
:0040367F 3BC2 cmp eax, edx<--与假注册码比较
:00403681 7513 jne 00403696
:00403683 41 inc ecx
:00403684 83F904 cmp ecx, 00000004
:00403687 7CDF jl 00403668
:00403689 5F pop edi
:0040368A 5E pop esi
:0040368B 5D pop ebp
:0040368C B801000000 mov eax, 00000001<--到这里就注册成功了
:00403691 5B pop ebx
:00403692 83C420 add esp, 00000020
:00403695 C3 ret

用户名：lancelot 注册码：4343-bz5x-15qq-m35q

crack by lancelot 2001.7.8

标 题:豪杰大眼睛共享版 7月2日最新版破解过程 (9千字)
发信人:copyyour
时 间:2001-7-6 23:04:48
详细信息:

软件名称：豪杰大眼睛共享版 7月2日最新版
软件下载地址：http://www.herosoft.com/down/down_file/bigeye.zip
软件作用：图片处理！！可以和acdess媲美
破解工具：几乎都用了
软件限制：30天限制

破解过程：
由于我实力不行，本来这个软件可以找到注册码的，唉，希望那位朋友指教！

我先用的trw2000，下断点createwindowex然后中断！这时候开始跟！先一直走了一偏，观察了他的判断过程，以后反汇编就注意getsystemtime这个函数的调用。具体如下的代码。

* Reference To: SthShell.Ordinal:0003, Ord:0003h
|
:00416977 E826240200 Call 00438DA2
:0041697C E86FB5FEFF call 00401EF0
:00416981 391D58C24400 cmp dword ptr [0044C258], ebx
:00416987 7505 jne 0041698E =====>>>>改为74
:00416989 E832FBFFFF call 004164C0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00416987(C)
|
:0041698E E8EDA0FFFF call 00410A80
:00416993 E8D8700100 call 0042DA70
:00416998 E8A3850000 call 0041EF40
:0041699D 8B0D1CC24400 mov ecx, dword ptr [0044C21C]
:004169A3 A118C24400 mov eax, dword ptr [0044C218]
:004169A8 0BC8 or ecx, eax
:004169AA 7413 je 004169BF ===================>>改为75
:004169AC A1A0644400 mov eax, dword ptr [004464A0]
:004169B1 33D2 xor edx, edx
:004169B3 83F808 cmp eax, 00000008
:004169B6 0F9FC2 setg dl
:004169B9 891550C24400 mov dword ptr [0044C250], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004169AA(C)
|

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:013Ah
|
:004169BF 8B3D8C314400 mov edi, dword ptr [0044318C]

* Possible StringData Ref from Data Obj ->"HeroSHOW.INI"
|
:004169C5 6890604400 push 00446090
:004169CA 8D8424E4000000 lea eax, dword ptr [esp+000000E4]
:004169D1 6800010000 push 00000100
:004169D6 50 push eax
:004169D7 6860AF4400 push 0044AF60

* Possible StringData Ref from Data Obj ->"OEMICON"
|
:004169DC 68E0624400 push 004462E0

* Possible StringData Ref from Data Obj ->"INSTALL" ===>>可能是判断安装的的时候的时间
|
:004169E1 68FC624400 push 004462FC
:004169E6 FFD7 call edi
:004169E8 85C0 test eax, eax
:004169EA 7453 je 00416A3F ===========>>改为75
:004169EC 6A50 push 00000050
:004169EE 53 push ebx
:004169EF 53 push ebx
:004169F0 8D8C24EC000000 lea ecx, dword ptr [esp+000000EC]
:004169F7 6A01 push 00000001
:004169F9 51 push ecx
:004169FA 53 push ebx

* Reference To: USER32.LoadImageA, Ord:01A0h
|
:004169FB FF15EC334400 Call dword ptr [004433EC]
:00416A01 8B159CC14400 mov edx, dword ptr [0044C19C]

* Reference To: USER32.LoadIconA, Ord:019Eh
|
:00416A07 8B1D30354400 mov ebx, dword ptr [00443530]
:00416A0D 6891000000 push 00000091
:00416A12 52 push edx
:00416A13 A3F4C14400 mov dword ptr [0044C1F4], eax
:00416A18 FFD3 call ebx
:00416A1A A3F8C14400 mov dword ptr [0044C1F8], eax
:00416A1F A19CC14400 mov eax, dword ptr [0044C19C]
:00416A24 688F000000 push 0000008F
:00416A29 50 push eax
:00416A2A FFD3 call ebx
:00416A2C 8B0DF4C14400 mov ecx, dword ptr [0044C1F4]
:00416A32 A3ECC14400 mov dword ptr [0044C1EC], eax
:00416A37 890DF0C14400 mov dword ptr [0044C1F0], ecx
:00416A3D EB51 jmp 00416A90

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004169EA(C)
|
:00416A3F 8B159CC14400 mov edx, dword ptr [0044C19C]

* Reference To: USER32.LoadIconA, Ord:019Eh
|
:00416A45 8B1D30354400 mov ebx, dword ptr [00443530]
:00416A4B 6892000000 push 00000092
:00416A50 52 push edx
:00416A51 FFD3 call ebx
:00416A53 A3F4C14400 mov dword ptr [0044C1F4], eax
:00416A58 A19CC14400 mov eax, dword ptr [0044C19C]
:00416A5D 6891000000 push 00000091
:00416A62 50 push eax
:00416A63 FFD3 call ebx
:00416A65 8B0D9CC14400 mov ecx, dword ptr [0044C19C]
:00416A6B 688F000000 push 0000008F
:00416A70 51 push ecx
:00416A71 A3F8C14400 mov dword ptr [0044C1F8], eax
:00416A76 FFD3 call ebx
:00416A78 8B159CC14400 mov edx, dword ptr [0044C19C]

* Possible Reference to Dialog: DialogID_0093
|
:00416A7E 6893000000 push 00000093
:00416A83 52 push edx
:00416A84 A3ECC14400 mov dword ptr [0044C1EC], eax
:00416A89 FFD3 call ebx
:00416A8B A3F0C14400 mov dword ptr [0044C1F0], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00416A3D(U)
|
:00416A90 A158C24400 mov eax, dword ptr [0044C258]
:00416A95 85C0 test eax, eax
:00416A97 7505 jne 00416A9E ===========>>>改为74
:00416A99 E8A2F9FFFF call 00416440

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00416A97(C)
|

* Possible Reference to Dialog:
|
:00416A9E 6890604400 push 00446090
:00416AA3 8D8424E4000000 lea eax, dword ptr [esp+000000E4]
:00416AAA 6800010000 push 00000100
:00416AAF 50 push eax
:00416AB0 6860AF4400 push 0044AF60

* Possible StringData Ref from Data Obj ->"OEM"
|
:00416AB5 6804634400 push 00446304

* Possible StringData Ref from Data Obj ->"INSTALL" ======>>和上面哪个一样？
|
:00416ABA 68FC624400 push 004462FC
:00416ABF FFD7 call edi
:00416AC1 56 push esi
:00416AC2 A328C24400 mov dword ptr [0044C228], eax
:00416AC7 E8E4020000 call 00416DB0
:00416ACC 56 push esi
:00416ACD E86EF1FFFF call 00415C40
:00416AD2 83C408 add esp, 00000008
:00416AD5 E896260000 call 00419170
:00416ADA FFD5 call ebp
:00416ADC 56 push esi
:00416ADD E8FE050000 call 004170E0
:00416AE2 6A00 push 00000000
:00416AE4 56 push esi
:00416AE5 E8C6450100 call 0042B0B0
:00416AEA 83C40C add esp, 0000000C

* Possible Reference to Menu: MenuID_0070
|

* Possible Reference to String Resource ID=00112: "BigEye"
|
:00416AED 6A70 push 00000070
:00416AEF 56 push esi

* Reference To: USER32.LoadAcceleratorsA, Ord:0196h
|
:00416AF0 FF1534354400 Call dword ptr [00443534]
:00416AF6 8B0DA0C14400 mov ecx, dword ptr [0044C1A0]
:00416AFC 6A00 push 00000000
:00416AFE 68D0070000 push 000007D0
:00416B03 6A02 push 00000002
:00416B05 51 push ecx
:00416B06 8BD8 mov ebx, eax

* Reference To: USER32.SetTimer, Ord:0252h
|
:00416B08 FF1520344400 Call dword ptr [00443420]
:00416B0E E8FD010000 call 00416D10
:00416B13 A160644400 mov eax, dword ptr [00446460]

* Reference To: USER32.ShowWindow, Ord:026Ah
|
:00416B18 8B35B8334400 mov esi, dword ptr [004433B8]
:00416B1E 85C0 test eax, eax
:00416B20 750B jne 00416B2D ==========>>改为74
:00416B22 8B15A8C14400 mov edx, dword ptr [0044C1A8]
:00416B28 6A00 push 00000000
:00416B2A 52 push edx
:00416B2B FFD6 call esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00416B20(C)
|
:00416B2D A164644400 mov eax, dword ptr [00446464]
:00416B32 85C0 test eax, eax
:00416B34 750A jne 00416B40 ===============>>改为74
:00416B36 A1ACC14400 mov eax, dword ptr [0044C1AC]
:00416B3B 6A00 push 00000000
:00416B3D 50 push eax
:00416B3E FFD6 call esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

完成了，这个软件我搞了30分钟，原因肯定是自己对createwindowex这个函数的运用不太熟悉，这下有了经验了，呵呵

在跟中的时候最好先完整的走一次，这样才能很好掌握这个程序的判断经过，呵呵

作为BCG和FCG的作业吧，实在没时间写了，马上要复习然后补考，唉

cracked by copyyour


红外遥控编码分析仪3.0

标 题:破解红外遥控编码分析仪3.0——上次问过的，现在终于破了。 (6千字)
发信人:Passion
时 间:2001-2-16 10:43:57
详细信息:
破解红外遥控编码分析仪3.0
Passion

前不久一同学使用红外遥控编码分析仪3.0，说是未注册版本仅仅可输出红外线接口数据3次（3次的确也太少了点），于是找我碰碰运气看能不能破。我瞧这软件说明，说要向作者付“一吨午饭”注册，天啊！要勒紧裤带少吃多少顿才能凑足这一吨？“民以食为天”，破吧！
这个东西加了壳，由于我脱壳经验不足，在这里耽搁了两天。Fileinfo查不出是什么壳，后来下了个GTW，说是ASPack 1.083，于是用PROCDUMP的unpack，脱出来的文件却不能运行，出什么EAccessVoilation。找个专门脱它的工具，照样非法操作。看来只有手工脱了。还好，我们有中国人值得骄傲的TRW2000。
找入口点找得我头晕，（此处省略不成功脱壳过程XXXX次）。后来终于碰上了一个段转换的RET，执行完RET后来到以下处：

A1BCA34800 mov eax, dword ptr [0048A3BC] ;这条居然是入口！不是PUSH EBP?
C1E002 shl eax, 02
A3C0A34800 mov dword ptr [0048A3C0], eax
57 push edi
51 push ecx

在MOV EAX, dword ptr [0048A3BC]处来个PEDUMP，嘿嘿，脱壳成功。

接着便是破注册的过程了。程序运行时会生成一个本机号，估计是把电脑的各种参数都计算出来凑成一块儿的。算法复杂得很。——先试试再说。运行程序IRVIEWER.EXE，啪地出来个窗口告诉你没注册，还把本机号多少多少多少告诉你。按确定后点菜单中的注册出现注册输入框。随便乱填后按确定，窗体先消失，然后告诉你错误。没的说，跟吧。下断 bpx hmemcpy，断后pmodule，清断点按F10跟踪，在IRVIEWER和COMCTL32.DLL和kernerl、user等之间跳了几次后终于来到以下处：

:00402A7A 8B0D50354900 mov ecx, dword ptr [00493550]
:00402A80 8B01 mov eax, dword ptr [ecx]
:00402A82 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00402A88 E80B210400 call 00444B98
:00402A8D 8D45FC lea eax, dword ptr [ebp-04]
:00402A90 E8DB360000 call 00406170
:00402A95 50 push eax
:00402A96 E8212F0000 call 004059BC ;这里验证注册码是否正确。
:00402A9B 59 pop ecx
:00402A9C 3B0548BD4900 cmp eax, dword ptr [0049BD48] ;正确标志
:00402AA2 0F95C2 setne dl ;对则DL为0，否则……
:00402AA5 83E201 and edx, 00000001 ;否则为1
:00402AA8 52 push edx
:00402AA9 FF4DD4 dec [ebp-2C]
:00402AAC 8D45FC lea eax, dword ptr [ebp-04]
:00402AAF BA02000000 mov edx, 00000002
:00402AB4 E8E3600800 call 00488B9C
:00402AB9 59 pop ecx
:00402ABA 84C9 test cl, cl
:00402ABC 7429 je 00402AE7 ;这里不跳则出错。
:00402ABE 6A00 push 00000000

但如果改00402ABC处的JE，居然无效。只有改00402AA2处了。把setne dl和AND EDX,00000001改成MOV EDX,0和NOP即可。
也就是把
0F 95 C2 83 E2 01 52
改为：
BA 00 00 00 00 90 ..

改掉脱壳后的EXE文件后再运行，选菜单中的注册，在注册框中乱填一气，按确定。……嗯？什么都没有？
那这样算不算注册成功？关闭程序再运行，仍然提示未注册。看来不行。
不过注意到一点，乱填一气的注册码在程序再度运行后在注册框中仍然存在，看来注册这一步应该是通过了，但程序启动的时候还有一步检验的过程，那儿通不过，就得每次运行程序都得注册一次了。
用FILEmonitor和regmonitor监视程序运行中注册表和文件的变化，终于从千头万绪中看到了C:\WINDOWS\IRVIEW.INI文件。注册框的检验通过后关闭程序时会把“正确”的注册码写入C:\WINDOWS\IRVIEW.INI文件。其内容为：

[Register]
SerialNum=0987654321

这样就需要跟踪程序开始读文件的部分。我于是就用TRW2000来LOAD它，下断Createfilea也好，下getprivateprofilestring也好，下getprivateprofileint也好，下readfile也好，下openfile和其ex也好，居然要么是什么都拦不住（这是什么原因还请各位指点），要么就是在弹出提示未注册框后中断。我几乎觉得山穷水尽了。后来仔细想想又找到了法子。——程序不是会把这个“正确”的注册码读进来吗？我就查它就行了。
在弹出注册框时按Ctrl+M切入TRW2000，s 0 ffffffff '0987654321'，真的找到一个地址47B490。
退出程序重新load，下bpm 47b490 w，后来中断几次，看看哪次47b490处会出现0987654321。
哈哈，这里！——这里中断已经离目标不远了。
（据REGMON分析，程序是先读许多注册表参数再读的IRVIEW.INI文件，也就是说很可能本机号的计算在注册码的读出之前处理，可以跳过许多麻烦的算法程序了。）

不多久来到此处：

:0040325B E80C270000 call 0040596C
:00403260 A348BD4900 mov dword ptr [0049BD48], eax
:00403265 B850BD4900 mov eax, 0049BD50
:0040326A E8012F0000 call 00406170
:0040326F 50 push eax
:00403270 E847270000 call 004059BC ;这里是验证过程
:00403275 59 pop ecx
:00403276 3B0548BD4900 cmp eax, dword ptr [0049BD48] ;这里是关键比对
:0040327C 0F849E000000 je 00403320 ;正确则跳，否则出错。
:00403282 66C7459C5000 mov [ebp-64], 0050
:00403288 8D45D0 lea eax, dword ptr [ebp-30]
:0040328B E8B02E0000 call 00406140
:00403290 8BD0 mov edx, eax
:00403292 FF45A8 inc [ebp-58]
:00403295 A148BD4900 mov eax, dword ptr [0049BD48]
:0040329A E89D2F0000 call 0040623C
:0040329F 8D55D0 lea edx, dword ptr [ebp-30]
:004032A2 52 push edx
:004032A3 8D45CC lea eax, dword ptr [ebp-34]
:004032A6 E8952E0000 call 00406140
:004032AB 50 push eax
:004032AC FF45A8 inc [ebp-58]

* Possible StringData Ref from Data Obj ->"该软件没有注册,请向作者注册.
注册号: "
|
:004032AF BA01A84800 mov edx, 0048A801
………… ;下边就省了。

很好。把je 00403320改成JMP 00403320就行。
也就是做以下修改：
0F 84 9E 00 00 00 66 C7
E9 9F 00 .. .. 90 .. ..

保存文件后运行，万事大吉！——实际上只改此处就行。

这个软件在华军上的软件分类中的“其他栏目”中有下载，不是列表中的第一个地址！那是错的，虽然也是一个IR.EXE，却是什么InternetRadio。 ^_^
这个东西如果用静态分析查找字串引用的方法来破可能还会简单得多，我没这样做，因为……还不熟，找注册码就更没本事了。嘿嘿！

后记：
本文在打字过程中完成50%左右时正待保存，却出来个保存错误，然后Uedit32被中止，我差点气晕，赶忙启动TRW2000，查找内存中的"IRVIEW.INI"，结果万幸，找到了我这可怜的半篇文章。但VMM模式下不可写盘，我于是下个BPX HMEMCPY，暂时退出，随便在那个程序的框中敲一字符，断时就脱离VMM模式了，来个w，好，总算没浪费力气。
——Passion写于情人节后两天。

标 题:红外遥控编码分析仪3.0 (985字)
发信人:111222
时 间:2001-2-20 17:29:34
详细信息:

取本机号，换成十六进制，然后从低位到高位每次取两位十六进制，
依次按一定算法(下面)变换成8位或9位二进制数，再把这些二进制数从高位
到低位排列(个数为8的倍数，不足的在后面随便补上0或1)，将排列后
的二进制写成十六进制数。再将十六进制数两位两位交换位置(1位与2位,
3位与4位,5位与6位,7位与8位,...)。这样就得到注册码。
算法:
如两位十六进制xy大于或等于74(十六进制),则(xy-74)换成二进制为所求8位
二进制。
例 d7-->01100011
(十六进制)d7-74=63 63(十六进制)=01100011(二进制)
如两位十六进制xy小于74(十六进制),则变换成9位二进制。xy除于2，余数为
第九位二进制数，商加上c6(十六进制)后再换成二进制为所求前8位二进制数。
例 11 --> 110011101
8 位+1 位
(十六进制)11=8*2+1 8+c6=ce ce(十六进制)=11001110(二进制)

比如:本机号53547479 --> 033111d7(十六进制)
d7 --> 01100011
11 --> 110011101
31 --> 110111101
03 --> 110001111
0110 0011 1100 1110 1110 1111 0111 0001 1110 0000 最后随便补5个0
6 3 c e e f 7 1 e 0
注册码 36ecfe170e

标 题:总补充说明 (6千字)
发信人:111222
时 间:2001-2-21 19:37:57
详细信息:

我知道了为什么 call 00401fa4会修改表格,经过分析，其实他修改表格是保存结果的，不会影响以后运算。请看下面分析：

0030:0049B85C 73 02 74 02 75 02 76 02-77 02 78 02 79 02 7A 02 s.t.u.v.w.x.y.z.
0030:0049B86C 7B 02 7C 02 7D 02 7E 02-7F 02 80 02 81 02 82 02 {.|.}.~..�.??
0030:0049B87C 83 02 84 02 85 02 86 02-87 02 88 02 89 02 8A 02 ????????
0030:0049B88C 8B 02 8C 02 8D 02 8E 02-8F 02 90 02 91 02 92 02 ????????
0030:0049B89C 93 02 94 02 95 02 96 02-97 02 98 02 99 02 9A 02 ????????
0030:0049B8AC 9B 02 9C 02 9D 02 9E 02-9F 02 A0 02 A1 02 A2 02 ????????
0030:0049B8BC A3 02 A4 02 A5 02 A6 02-A7 02 A8 02 A9 02 AA 02 ????????
0030:0049B8CC AB 02 AC 02 AD 02 AE 02-AF 02 B0 02 B1 02 B2 02 ????????
0030:0049B8DC B3 02 B4 02 B5 02 B6 02-B7 02 B8 02 B9 02 BA 02 ????????
0030:0049B8EC BB 02 BC 02 BD 02 BE 02-BF 02 C0 02 C1 02 C2 02 ????????
0030:0049B8FC C3 02 C4 02 C5 02 C6 02-C7 02 C8 02 C9 02 CA 02 ????????
0030:0049B90C CB 02 CC 02 CD 02 CE 02-CF 02 D0 02 D1 02 D2 02 ????????
0030:0049B91C D3 02 D4 02 D5 02 D6 02-D7 02 D8 02 D9 02 DA 02 ????????
0030:0049B92C DB 02 DC 02 DD 02 DE 02-DF 02 E0 02 E1 02 E2 02 ????????
0030:0049B93C E3 02 E4 02 E5 02 E6 02-E7 02 E8 02 E9 02 EA 02 ????????
0030:0049B94C EB 02 EC 02 ED 02 EE 02-EF 02 F0 02 F1 02 F2 02 ????????
0030:0049B95C F3 02 F4 02 F5 02 F6 02-F7 02 F8 02 F9 02 FA 02 ????????
0030:0049B96C FB 02 FC 02 FD 02 FE 02-FF 02 00 03 01 03 02 03 ????�.......
0030:0049B97C 03 03 04 03 05 03 06 03-07 03 08 03 09 03 0A 03 ................
0030:0049B98C 0B 03 0C 03 0D 03 0E 03-0F 03 10 03 11 03 12 03 ................
0030:0049B99C 13 03 14 03 15 03 16 03-17 03 18 03 19 03 1A 03 ................
0030:0049B9AC 1B 03 1C 03 1D 03 1E 03-1F 03 20 03 21 03 22 03 .......... .!.".
0030:0049B9BC 23 03 24 03 25 03 26 03-27 03 28 03 29 03 2A 03 #.$.%.&.'.(.).*.
0030:0049B9CC 2B 03 2C 03 2D 03 2E 03-2F 03 30 03 31 03 32 03 +.,.-.../.0.1.2.
0030:0049B9DC 33 03 34 03 35 03 36 03-37 03 38 03 39 03 3A 03 3.4.5.6.7.8.9.:.
0030:0049B9EC 3B 03 3C 03 3D 03 3E 03-3F 03 40 03 41 03 42 03 ;.<.=.>.?.@.A.B.
0030:0049B9FC 43 03 44 03 45 03 46 03-47 03 48 03 49 03 4A 03 C.D.E.F.G.H.I.J.
0030:0049BA0C 4B 03 4C 03 4D 03 4E 03-4F 03 50 03 51 03 52 03 K.L.M.N.O.P.Q.R.
0030:0049BA1C 53 03 54 03 55 03 56 03-57 03 58 03 59 03 5A 03 S.T.U.V.W.X.Y.Z.
0030:0049BA2C 5B 03 5C 03 5D 03 5E 03-5F 03 60 03 61 03 62 03 [.\.].^._.`.a.b.
0030:0049BA3C 63 03 64 03 65 03 66 03-67 03 68 03 69 03 6A 03 c.d.e.f.g.h.i.j.
0030:0049BA4C 6B 03 6C 03 6D 03 6E 03-6F 03 70 03 71 03 72 03 k.l.m.n.o.p.q.r.
0030:0049BA5C 73 03 74 03 75 03 76 03-77 03 78 03 79 03 7A 03 s.t.u.v.w.x.y.z.
0030:0049BA6C 7B 03 7C 03 7D 03 7E 03-7F 03 80 03 81 03 82 03 {.|.}.~..�.??
0030:0049BA7C 83 03 84 03 85 03 86 03-87 03 88 03 89 03 8A 03 ????????
0030:0049BA8C 8B 03 8C 03 8D 03 8E 03-8F 03 90 03 91 03 92 03 ????????
0030:0049BA9C 93 03 94 03 95 03 96 03-97 03 98 03 99 03 9A 03 ????????
0030:0049BAAC 9B 03 9C 03 9D 03 9E 03-9F 03 A0 03 A1 03 A2 03 ????????
0030:0049BABC A3 03 A4 03 A5 03 A6 03-A7 03 A8 03 A9 03 AA 03 ????????
0030:0049BACC AB 03 AC 03 00 00 02 00-04 00 06 00 08 00 0A 00 ??............
0030:0049BADC 0C 00 0E 00 10 00 12 00-14 00 16 00 18 00 1A 00 ................
0030:0049BAEC 1C 00 1E 00 20 00 22 00-24 00 26 00 28 00 2A 00 .... .".$.&.(.*.
0030:0049BAFC 2C 00 2E 00 30 00 32 00-34 00 36 00 38 00 3A 00 ,...0.2.4.6.8.:.
0030:0049BB0C 3C 00 3E 00 40 00 42 00-44 00 46 00 48 00 4A 00 <.>.@.B.D.F.H.J.
0030:0049BB1C 4C 00 4E 00 50 00 52 00-54 00 56 00 58 00 5A 00 L.N.P.R.T.V.X.Z.
0030:0049BB2C 5C 00 5E 00 60 00 62 00-64 00 66 00 68 00 6A 00 \.^.`.b.d.f.h.j.
0030:0049BB3C 6C 00 6E 00 70 00 72 00-74 00 76 00 78 00 7A 00 l.n.p.r.t.v.x.z.
0030:0049BB4C 7C 00 7E 00 80 00 82 00-84 00 86 00 88 00 8A 00 |.~.�.?????
0030:0049BB5C 8C 00 8E 00 90 00 92 00-94 00 96 00 98 00 9A 00 ????????
0030:0049BB6C 9C 00 9E 00 A0 00 A2 00-A4 00 A6 00 A8 00 AA 00 ????????
0030:0049BB7C AC 00 AE 00 B0 00 B2 00-B4 00 B6 00 B8 00 BA 00 ????????
0030:0049BB8C BC 00 BE 00 C0 00 C2 00-C4 00 C6 00 C8 00 CA 00 ????????
0030:0049BB9C CC 00 CE 00 D0 00 D2 00-D4 00 D6 00 D8 00 DA 00 ????????
0030:0049BBAC DC 00 DE 00 E0 00 E2 00-E4 00 E6 00 E8 00 EA 00 ????????
0030:0049BBBC EC 00 EE 00 F0 00 F2 00-F4 00 F6 00 F8 00 FA 00 ????????
0030:0049BBCC FC 00 FE 00 00 01 02 01-04 01 06 01 08 01 0A 01 ??............
0030:0049BBDC 0C 01 0E 01 10 01 12 01-14 01 16 01 18 01 1A 01 ................
0030:0049BBEC 1C 01 1E 01 20 01 22 01-24 01 26 01 28 01 2A 01 .... .".$.&.(.*.
0030:0049BBFC 2C 01 2E 01 30 01 32 01-34 01 36 01 38 01 3A 01 ,...0.2.4.6.8.:.
0030:0049BC0C 3C 01 3E 01 40 01 42 01-44 01 46 01 48 01 4A 01 <.>.@.B.D.F.H.J.
0030:0049BC1C 4C 01 4E 01 50 01 52 01-54 01 56 01 58 01 5A 01 L.N.P.R.T.V.X.Z.
0030:0049BC2C 5C 01 5E 01 60 01 62 01-64 01 66 01 68 01 6A 01 \.^.`.b.d.f.h.j.
0030:0049BC3C 6C 01 6E 01 70 01 72 01-74 01 76 01 78 01 7A 01 l.n.p.r.t.v.x.z.
0030:0049BC4C 7C 01 7E 01 80 01 82 01-84 01 86 01 88 01 8A 01 |.~.�.?????
0030:0049BC5C 8C 01 8E 01 90 01 92 01-94 01 96 01 98 01 9A 01 ????????
0030:0049BC6C 9C 01 9E 01 A0 01 A2 01-A4 01 A6 01 A8 01 AA 01 ????????
0030:0049BC7C AC 01 AE 01 B0 01 B2 01-B4 01 B6 01 B8 01 BA 01 ????????
0030:0049BC8C BC 01 BE 01 C0 01 C2 01-C4 01 C6 01 C8 01 CA 01 ????????
0030:0049BC9C CC 01 CE 01 D0 01 D2 01-D4 01 D6 01 D8 01 DA 01 ????????
0030:0049BCAC DC 01 DE 01 E0 01 E2 01-E4 01 E6 01 E8 01 EA 01 ????????
0030:0049BCBC EC 01 EE 01 F0 01 F2 01-F4 01 F6 01 F8 01 FA 01 ????????
0030:0049BCCC FC 01 FE 01 00 02 02 02-04 02 06 02 08 02 0A 02 ??............
0030:0049BCDC 0C 02 0E 02 10 02 12 02-14 02 16 02 18 02 1A 02 ................
0030:0049BCEC 1C 02 1E 02 20 02 22 02-24 02 26 02 28 02 2A 02 .... .".$.&.(.*.
0030:0049BCFC 2C 02 2E 02 30 02 32 02-34 02 36 02 38 02 3A 02 ,...0.2.4.6.8.:.
0030:0049BD0C 3C 02 3E 02 40 02 42 02-44 02 46 02 48 02 4A 02 <.>.@.B.D.F.H.J.
0030:0049BD1C 4C 02 4E 02 50 02 52 02-54 02 56 02 58 02 5A 02 L.N.P.R.T.V.X.Z.
0030:0049BD2C 5C 02 5E 02 60 02 62 02-64 02 66 02 68 02 6A 02 \.^.`.b.d.f.h.j.
0030:0049BD3C 6C 02 6E 02 70 02

从上面表格可看，查表是0-->0x273 1-->0x274 ... 0x139-->3ac (这里都是加上0x273),13a-->0 13b-->2 (直到表格完 右边=(左边-13a)*2 ) 。这是我看完整张表后总结的，好累啊！！！
经过几次查表后得到结果，（哈哈，经1212兄提醒，分析了call的表格变化规律是从139，138，137...分别与结果在表中的位置替换数据以达到保存计算结果的目的，而这些位置139...在计算过程是不会用到的）。真没想到居然用这种方法保存结果！！
最后就是取出结果与本机号比较，相同则ok。运算过程没有直接给出注册码，所以必须求逆过程，就是我上次所发表的那个，呵呵。


话费清单

 标 题:闲来无聊，写下话费清单精简版破解过程 (4千字)
发信人:conanxu[BCG]
时 间:2001-5-5 20:12:46
详细信息:
话费清单精简版破解过程
下载地址:http://www.inhua.com/down/dial4609.exe
一个免费注册的软件，给初学者看看吧-------我也是初学者
用Trw2000载入dialpad.exe，
在注册栏输入注册姓名:conanxu[BCG]注册号码:sanjer注册密码：121212
下断点bpx messageboxa点击"注册已确认！"，被截下
016F:004C0CAC MOV EAX,[EBP-04]
016F:004C0CAF CALL 00456F90
016F:004C0CB4 MOV EAX,[EBP-18]
016F:004C0CB7 MOV EDX,[EBP-0C]
016F:004C0CBA CALL 0040401C -->这个call很可以进去看看
016F:004C0CBF JZ 004C0CDC -->这个跳转可以带过下面的call
016F:004C0CC1 PUSH BYTE +00
016F:004C0CC3 PUSH DWORD 004C0DA0
016F:004C0CC8 PUSH DWORD 004C0DB0
016F:004C0CCD MOV EAX,EBX
016F:004C0CCF CALL 004377D4
016F:004C0CD4 PUSH EAX
016F:004C0CD5 CALL `USER32!MessageBoxA` -->停在了这里
016F:004C0CDA JMP SHORT 004C0D40
016F:004C0CDC MOV ECX,[EBP-04]
016F:004C0CDF MOV EDX,004C0E1C
016F:004C0CE4 MOV EAX,[EBP-10]
016F:004C0CE7 CALL 00451280
016F:004C0CEC MOV ECX,[EBP-08]
016F:004C0CEF MOV EDX,004C0E30
016F:004C0CF4 MOV EAX,[EBP-10]
016F:004C0CF7 CALL 00451280
016F:004C0CFC MOV ECX,[EBP-0C]
016F:004C0CFF MOV EDX,004C0E44
016F:004C0D04 MOV EAX,[EBP-10]
016F:004C0D07 CALL 00451280
016F:004C0D0C XOR EDX,EDX
016F:004C0D0E MOV EAX,[EBX+0B6C]
016F:004C0D14 MOV ECX,[EAX]
016F:004C0D16 CALL NEAR [ECX+5C]
016F:004C0D19 XOR EDX,EDX
016F:004C0D1B MOV EAX,[EBX+0B74]
016F:004C0D21 MOV ECX,[EAX]
016F:004C0D23 CALL NEAR [ECX+5C]
016F:004C0D26 XOR EDX,EDX
016F:004C0D28 MOV EAX,[EBX+0B70]
016F:004C0D2E MOV ECX,[EAX]
016F:004C0D30 CALL NEAR [ECX+5C]
016F:004C0D33 XOR EDX,EDX
016F:004C0D35 MOV EAX,[EBX+0B78]
016F:004C0D3B CALL 00431594

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

016F:00404019 LEA EAX,[EAX+00]
016F:0040401C PUSH EBX
016F:0040401D PUSH ESI
016F:0040401E PUSH EDI
016F:0040401F MOV ESI,EAX
016F:00404021 MOV EDI,EDX
016F:00404023 CMP EAX,EDX -->这里下d eax看到正确的注册码:84763g7ia
d edx看到错误的注册码:121212
016F:00404025 JZ NEAR 004040BA
016F:0040402B TEST ESI,ESI
016F:0040402D JZ 00404097
016F:0040402F TEST EDI,EDI
016F:00404031 JZ 0040409E
016F:00404033 MOV EAX,[ESI-04]
016F:00404036 MOV EDX,[EDI-04]
016F:00404039 SUB EAX,EDX
016F:0040403B JA 0040403F
016F:0040403D ADD EDX,EAX
016F:0040403F PUSH EDX
016F:00404040 SHR EDX,02
016F:00404043 JZ 0040406B
016F:00404045 MOV ECX,[ESI]
016F:00404047 MOV EBX,[EDI]
016F:00404049 CMP ECX,EBX
016F:0040404B JNZ 004040A5
016F:0040404D DEC EDX
016F:0040404E JZ 00404065
016F:00404050 MOV ECX,[ESI+04]
016F:00404053 MOV EBX,[EDI+04]
016F:00404056 CMP ECX,EBX
016F:00404058 JNZ 004040A5
016F:0040405A ADD ESI,BYTE +08
016F:0040405D ADD EDI,BYTE +08
016F:00404060 DEC EDX
016F:00404061 JNZ 00404045
016F:00404063 JMP SHORT 0040406B
016F:00404065 ADD ESI,BYTE +04
016F:00404068 ADD EDI,BYTE +04
016F:0040406B POP EDX
016F:0040406C AND EDX,BYTE +03
016F:0040406F JZ 00404093
016F:00404071 MOV ECX,[ESI]
016F:00404073 MOV EBX,[EDI]
016F:00404075 CMP CL,BL
016F:00404077 JNZ 004040BA
016F:00404079 DEC EDX
016F:0040407A JZ 00404093
016F:0040407C CMP CH,BH
016F:0040407E JNZ 004040BA
016F:00404080 DEC EDX
016F:00404081 JZ 00404093
016F:00404083 AND EBX,00FF0000
016F:00404089 AND ECX,00FF0000
016F:0040408F CMP ECX,EBX
016F:00404091 JNZ 004040BA
016F:00404093 ADD EAX,EAX
016F:00404095 JMP SHORT 004040BA
016F:00404097 MOV EDX,[EDI-04]
016F:0040409A SUB EAX,EDX
016F:0040409C JMP SHORT 004040BA
016F:0040409E MOV EAX,[ESI-04]
016F:004040A1 SUB EAX,EDX
016F:004040A3 JMP SHORT 004040BA
016F:004040A5 POP EDX
016F:004040A6 CMP CL,BL
016F:004040A8 JNZ 004040BA
016F:004040AA CMP CH,BH
016F:004040AC JNZ 004040BA
016F:004040AE SHR ECX,10
016F:004040B1 SHR EBX,10
016F:004040B4 CMP CL,BL
016F:004040B6 JNZ 004040BA
016F:004040B8 CMP CH,BH
016F:004040BA POP EDI
016F:004040BB POP ESI
016F:004040BC POP EBX
016F:004040BD NOP

conanxu[BCG]
Email:conanxu@eastday.com


环球商务信息发布系统2.0

 标 题:破解环球商务信息发布系统2.0中文版----------->高手莫入 (5千字)
发信人:Edea[BCG]
时 间:2001-6-10 21:18:33
详细信息:
软件名称：环球商务信息发布系统2.0中文版
下载地址：www.cnshare.com 4月8日更新
注册费用：480元（乖乖，够我吃两个月的饭了）
软件主页：http://www.tradeposter.com
软件简介：环球商务信息发布系统是一款功能强大的网络营销软件。它可在数分钟内将您的商务信息发布到全球数千个商贸网站及新闻组中。是您在互联网上推广产品与服务的最佳工具。一旦注册便可无限制使用并享受终生免费升级及技术支持服务。 2.00中文版具有以下特点： 1. 向国内外2000多家商贸BBS发送商务信息； 2. 向1000多个商贸新闻组群发广告信息。 3. 当前信息自动保存，并在下次运行时自动读入。 4. 简繁体中文信息自动转换。 5. 界面简洁直观，易于操作。 6. 详细发布报告的生成。
破解人：Edea （QQ:3849036）

先用Fi检测，发现主程序tradeposter被aspack V2.11压缩，用最新的caspr脱之。
先用WDASM分析，但小弟无能，没发现有价值的东西。
启动软件，弹出注册框，填入注册信息：
注册名称：Edea[BCG]
注册密码：9876543210
打开TRW2000，下断点bpx hmemcpy，点注册，被拦下。
BD，pmodule，然后按F12七次（八次就是失败了），按F10来到：

0177:0050F87A MOV EDX,[EBP-04] ----->把注册名称Edea[BCG]放入EDX
0177:0050F87D MOV EAX,00578A80
0177:0050F882 CALL 00403CBC
0177:0050F887 LEA EDX,[EBP-08]
0177:0050F88A MOV EAX,[EBX+02FC]
0177:0050F890 CALL 004312CC
0177:0050F895 MOV EDX,[EBP-08] ----->把填入的注册密码9876543210放入EDX
0177:0050F898 MOV EAX,00578A88
0177:0050F89D CALL 00403CBC
0177:0050F8A2 INC DWORD [EBX+030C]
0177:0050F8A8 CMP DWORD [EBX+030C],BYTE +03
0177:0050F8AF JNG 0050F8BD ----->这个地方跳
0177:0050F8B1 MOV DWORD [EBX+0234],02
0177:0050F8BB JMP SHORT 0050F917
0177:0050F8BD MOV EAX,EBX
0177:0050F8BF CALL 0050FD74 ----->关键CALL，跟入
0177:0050F8C4 TEST AL,AL
0177:0050F8C6 JZ 0050F8EF ----->测试AL的值，等着判你的死刑
0177:0050F8C8 MOV DWORD [00578AAC],01
0177:0050F8D2 MOV EAX,EBX
0177:0050F8D4 CALL 0050FB54
0177:0050F8D9 MOV EAX,[00578A94]
0177:0050F8DE CALL 004568CC
0177:0050F8E3 MOV DWORD [EBX+0234],01
0177:0050F8ED JMP SHORT 0050F917
0177:0050F8EF PUSH BYTE +10
0177:0050F8F1 MOV EAX,[0054D8A4]
0177:0050F8F6 MOV EAX,[EAX]
0177:0050F8F8 MOV ECX,[00578AA4]

******************************************************************************************

Call from 0050F8BF
0177:0050FD74 PUSH EBP
0177:0050FD75 MOV EBP,ESP
0177:0050FD77 XOR ECX,ECX
0177:0050FD79 PUSH ECX
0177:0050FD7A PUSH ECX
0177:0050FD7B PUSH ECX
0177:0050FD7C PUSH ECX
0177:0050FD7D PUSH ECX
0177:0050FD7E PUSH ECX
0177:0050FD7F PUSH EBX
0177:0050FD80 PUSH ESI
0177:0050FD81 XOR EAX,EAX
0177:0050FD83 PUSH EBP
0177:0050FD84 PUSH DWORD 0050FE4F
0177:0050FD89 PUSH DWORD [FS:EAX]
0177:0050FD8C MOV [FS:EAX],ESP
0177:0050FD8F XOR EBX,EBX
0177:0050FD91 LEA EAX,[EBP-0C]
0177:0050FD94 MOV ECX,[00578A8C] ----->把软件系列号1182（可能与你的不同）放入ECX
0177:0050FD9A MOV EDX,[00578A80] ----->把Edea[BCG]放入EDX
0177:0050FDA0 CALL 00403F34
0177:0050FDA5 MOV EAX,[EBP-0C]
0177:0050FDA8 CALL 00403EE8
0177:0050FDAD MOV ESI,EAX
0177:0050FDAF TEST ESI,ESI
0177:0050FDB1 JNG 0050FDEA
0177:0050FDB3 MOV DWORD [EBP-08],01
0177:0050FDBA LEA EAX,[EBP-10] /
0177:0050FDBD PUSH EAX /
0177:0050FDBE MOV ECX,01 /
0177:0050FDC3 MOV EDX,[EBP-08] /
0177:0050FDC6 MOV EAX,[00578A80] /
0177:0050FDCB CALL 004040F0 /
0177:0050FDD0 MOV EAX,[EBP-10] /
0177:0050FDD3 CALL 004040AC /这个循环读入Edea[BCG]1182
0177:0050FDD8 MOV AL,[EAX] /
0177:0050FDDA AND EAX,FF /
0177:0050FDDF ADD EBX,EAX /
0177:0050FDE1 ADD EBX,BYTE +09 /
0177:0050FDE4 INC DWORD [EBP-08] /
0177:0050FDE7 DEC ESI /
0177:0050FDE8 JNZ 0050FDBA /
0177:0050FDEA LEA EDX,[EBP-14]
0177:0050FDED MOV EAX,EBX
0177:0050FDEF CALL 00409AE0 ----->此CALL很重要，为算注册码的的CALL
0177:0050FDF4 MOV EDX,[EBP-14] ----->正确的注册码872放入EDX
0177:0050FDF7 MOV EAX,[00578A88] ----->错误的注册码9876543210放入EAX
0177:0050FDFC CALL 00403FF8 ----->比较
0177:0050FE01 JNZ 0050FE30 ----->不相等吗？去死吧！
0177:0050FE03 MOV BYTE [EBP-01],01
0177:0050FE07 MOV EAX,00578A7C
0177:0050FE0C MOV EDX,[00578A80]
0177:0050FE12 CALL 00403CBC
0177:0050FE17 LEA EDX,[EBP-18]
0177:0050FE1A MOV EAX,EBX
0177:0050FE1C CALL 00409AE0
0177:0050FE21 MOV EDX,[EBP-18]
0177:0050FE24 MOV EAX,00578A84
0177:0050FE29 CALL 00403CBC
0177:0050FE2E JMP SHORT 0050FE34
0177:0050FE30 MOV BYTE [EBP-01],00

我的注册码：
注册名称：Edea[BCG]
注册密码：872


极点词汇大突破1.2

 标 题:极点词汇大突破1.2版本破解手记 (2千字)
发信人:孙锋
时 间:2000-12-26 23:40:10
详细信息:
极点词汇大突破1.2版本破解手记
时间：2000年12月26日下午18:53
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
http://phy.qfnu.edu.cn/personal/~sffs/index.htm

今天看到有网友需要《极点词汇大突破1.2》的注册码，就来破解了。
由于电信局的家伙们把我的电话的163，169功能都封闭了，所以没有很多的钱
来上网（每小时6元，我现在生活费都是借的别人的了），也许以后来的机会少
了，请找我的朋友给我来信好了。依我原来的脾气早就把他妈的曲阜电信局黑了，
可惜现在没有毕业，我也就不再重操旧业了。没想到这个软件5M多，所以狠心就
下载了，谁让我喜欢这行呢。再说也是为了帮助“小惠”MM嘛。好了不发牢骚了，
开始我的工作吧。

工具：
TRW2000
步骤：
1、安装后启动极点词汇大突破软件。随便填入注册信息，我的是：
用户名：sunfeng
注册码：1212121212
2、启动TRW2000，ok载入内存。
3、Ctrl+N呼叫出TRW2000，然后bpx hmemcpy万能中断，F5返回程序领域，点击
确定，被TRW2000拦截到。
4、开始按F12共计8次（因为如果按9次，就出现注册码错误的对话框了）。
5、然后按F10几次到下面的地址：
0167:004946B0 CALL 00408750 ；---------->F8进入CALL领域
0167:004946B5 TEST EAX,EAX
0167:004946B7 JNZ NEAR 00494795 ;-------->跳了就玩完了。
6、F8进入CALL领域，然后继续按F10几次到下面的位置：
0167:00408752 MOV ESI,EAX ;------------->这里只正确的注册码 D EAX,得到注册码为：20509396
0167:00408754 MOV EDI EDX ;------------->我们输入的错误注册码
0167:00408756 OR EAX,EAX
7、X退出TRW2000，整理
用户名：sunfeng
注册码：20509396
8、正确注册，完成任务了。
9、其他注册码：

用户名--------------------------------------注册码

孙锋----------------------------------------7014111
孙 锋--------------------------------------24064081
新领网--------------------------------------26129896
小惠----------------------------------------6752733
自由用户------------------------------------62051985
番外地--------------------------------------22790436
我就爱盗版----------------------------------40973634
我们没有钱所以我们用盗版--------------------16376167

<-----------完---------->


极速火龙 CD压缩器

 标 题:极速火龙 CD压缩器 (1千字)
发信人:xiejialiang
时 间:2001-8-28 12:17:15
详细信息:
我所说的是极速火龙 CD压缩器的注册机，它的注册码生成过程是这样的：

0167:00476907 MOV EAX,[EBP-08]//读取用户名前面的4位字符
0167:0047690A MOV AL,[EAX]//获取ASCII码
0167:0047690C MOV [EBP-04],AL
0167:0047690F MOV EAX,[EBP-08]
0167:00476912 MOV AL,[EAX+01]
0167:00476915 MOV [EBP-03],AL
0167:00476918 MOV EAX,[EBP-08]
0167:0047691B MOV AL,[EAX+02]
0167:0047691E MOV [EBP-02],AL
0167:00476921 MOV EAX,[EBP-08]
0167:00476924 MOV AL,[EAX+03]
0167:00476927 MOV [EBP-01],AL
0167:0047692A LEA EDX,[EBP-0C]
0167:0047692D MOV EAX,[EBX+02EC]
0167:00476933 CALL 0042D598
0167:00476938 MOV EAX,[EBP-0C]
0167:0047693B CALL 00408704
0167:00476940 MOV EBX,EAX
0167:00476942 XOR EAX,EAX
0167:00476944 POP EDX
0167:00476945 POP ECX
0167:00476946 POP ECX
0167:00476947 MOV [FS:EAX],EDX
0167:0047694A JMP SHORT 00476958
0167:0047694C JMP 004032B0
0167:00476951 XOR EBX,EBX
0167:00476953 CALL 0040360C
0167:00476958 MOVSX EAX,BYTE [EBP-04]//将4个ASCII码相加
0167:0047695C MOVSX EDX,BYTE [EBP-03]
0167:00476960 ADD EAX,EDX
0167:00476962 MOVSX EDX,BYTE [EBP-02]
0167:00476966 ADD EAX,EDX
0167:00476968 MOVSX EDX,BYTE [EBP-01]
0167:0047696C ADD EAX,EDX
0167:0047696E IMUL EAX,EAX,00BC614E//将加后的和转换成16制数字，并且乘以BC614E,获取16制的数字
0167:00476974 MOV ECX,BB//将ECX赋值10制数字187
0167:00476979 CDQ//将EAX*BC614E的16制的数字转换成10制
0167:0047697A IDIV ECX//然后除以187
0167:0047697C CMP EBX,EAX//EAX就是正确的注册码。

上面的注册码生成过程，在您的帮助下，我还是没有办法用VB写出注册机，也许是我的水平太差了吧。上面的过程您可以写出注册机，无论是VB或者是VC，请告诉我正确的注册机该怎样写，谢谢了。

标 题:帖这个的注册机~~~~~~~ (580字)
发信人:伪装者[CCG]
时 间:2001-8-28 13:48:36
详细信息:

 #include "stdio.h"
main()
{
static char string[20];
int i;
long c,e=0;
start:printf("*********SpeedDragon 1.2*********\nThis keygen is made by Pretender\nPlease
  input your name : ");
gets(string);
for(i=0;i<4;i++)
{c=string[i];e+=c;}
e*=0xbc614e;
e/=0xbb;
if(e>1000) printf("Your Register code is  : %ld",e);
else {printf("You must change your username!\n");goto start;}
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}


局域网数据库快易通

标 题:局域网数据库快易通破解手记 (1千字)
发信人:孙锋
时 间:2001-2-2 2:45:17
详细信息:

局域网数据库快易通破解手记

作者：孙 锋
Emial：sffs@263.net
主页：http://sffs.6to23.com

该软件为共享软件，你可以下载、复制使用，安装后可以运行50次，之后 会提醒注册并终止使用，
你需要注册获得合法注册码，注册办法如下：

1、从邮局汇款到以下地址，请勿电汇。

山东威海鸣球毛纺织有限公司

黄泽 收

邮编：264200

2、邮寄金额：180元人民币，如需要收据寄190元；

3、请写清汇款人地址、姓名；

4、通知注册码的方法：接到汇款后我可以通过邮寄、电话、E_mail的方式通知您注册的方法，需要
哪一种方法请在附言中写清，如果有E_mail最好同时发个E_mail通知我。

主页：http://huangze.126.com

E_mail: hz008@yeah.net 或 hzwork@263.net

1、随便输入注册信息，
用户名：孙锋
通讯地址：曲阜师范大学142#
邮编：273165
电话：0537-4457109
电子邮件：sffs@263.net
注册码处：输入12121212，然后中断。
然后下中断bpx hmemcpy
F5返回程式，点“确定”
2、拦截后，F12共14次
3、bd * 中断断点
4、一直F10到下面地址：
0167:004C7D92 POP EAX ;--------->D EDX 得到正确注册码：86124124
5、整理重新注册。

<---------------完-------------->

标 题:注册算法 (113字)
发信人:真·伪装者
时 间:2001-2-2 5:30:05
详细信息:

注册码=（用户名的每个字符累加）+（通讯地址每个字符累加）-（电话号码各个字符累加）-（E-mail各个字符累加）+86121186

标 题:注册机 (962字)
发信人:真·伪装者
时 间:2001-2-2 6:31:24
详细信息:

#include "stdio.h"
main()
{
char string[81];
unsigned long i,a=0,b=0;
unsigned c;
printf("Please input your name ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c>127) c+=256;a+=c;}
printf("Your name is ");
puts(string);
printf("Please input your address ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c>127) c+=256;a+=c;}
printf("Your address is ");
puts(string);
printf("Please input your phone number ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c>127) c+=256;a-=c;}
printf("Your phone number is ");
puts(string);
printf("Please input your E-mail ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c>127) c+=256;a-=c;}
printf("Your E-mail is ");
puts(string);
printf("Your Register code is: %ld",a+86121186);
printf("\n");
printf("Welcome to WWW.CRACKNOW.COM\n");}
另外孙锋我前两个注册机的数据类型有问题，请改一下~~要不然输入中文得到的注册码就不对~~~

标 题:改一点就可以了 (113字)
发信人:真·伪装者
时 间:2001-2-2 12:06:01
阅读次数:12
详细信息:

数据类型变量全设成UNSIGNED，在读取后判断一下是不是中文
我的解决办法是添加if(c>127) c+=256;后来试了试没有什么问题


卡片专家1.0

标 题:开天辟地 copyyour第一篇破文（请大侠指教） (1千字)
发信人:copyyour
时 间:2001-4-2 18:56:07
详细信息:
被宰软件：卡片专家1.0
EZCard是制作各种卡片的专业软件，它让您以“所见即所得”的方式设计和打印各种格式的卡片。采用鼠标拖拽和右键菜单方式设置各种元件的位置和大小等属性，操作简单快捷。支持文本、直线、矩形、(椭)圆、图象、条型码等元件。

下载地址:http://mcat8.at.china.com/card.zip (不要用蚂蚁等多线程软件下载）

破解使用工具：trw2000

破解等级(莱鸟)

破解过程：

小弟copyyour在众多CCg和无党派大哥的帮助下，现在正在茁壮成长，为了自己能早日加入到CCG的大家庭中，小弟每日上网苦寻软件下手学习，在看过N次看雪教程后，今日到中国共享软件注册基地下载到这款价值50元的软件，解压后，只有一个文件card.exe

废话少说，开始动手，先当然是请出中国调试软件之王的trw2000,装入card.exe,按G后返回程序，在帮助中找到要输入注册码的地方，用户名输入sunfeng(为了感谢孙大哥对小弟的教导，所以。。。。）密码输入916610(这是小弟和女朋友的生日hehe)，在按ctrl+n,进入trw,下万能断点hmemcpy回车后按G返回程序，点击确定，被拦，按f1214次后（因为按f12，15次会跳出注册失败的框框）来到程序0043544e ref处，按f10数次，来到0052950b mov eax[ebx+02e4]在次出下d edx 看到注册码（好兴奋哟！！！哈哈哈）

整理后得到
sunfeng
3ABC95AC-DCBFEDAB

copyyour
3ABC95AC-CEAB36A4

小弟第一次写破文，不对之处，请各位前辈高人指出，小弟不胜感激！！！

copyyour@sina.com

cracked by copyyour

呵呵

2001.4.2


开心斗地主1.7S4

 标 题:开心斗地主1.7S4非法注册破解 (512字)
发信人:crack123
时 间:2001-6-16 12:28:35
详细信息:
采用用户名：/0 注册码：01 注册后重启，出现非法注册。

先用UPX将主程序脱壳后，用TRW2000调入主程序，（需加入msvbvm50.dll)
下bpx __vbaFileOpen拦截，返回TRW后跟踪即可。
我跟了两回，（详情略过）发现正式画面入口在167：004f942d处，
我直接将
167：004f7285 jz near 004f7578 (jump)
改为 jmp 004f942d
顺利完成。

另：也可用UPX脱壳后，直接用ultraedit 或 winhex等在主程序
里找 0f84ed020000 替换为 e9a3210000.
开心斗地主1.7S4 的注册文件在windows\system里：
oliver.dll和sysinfo.vxd

标 题:注册算法 (152字)
发信人:crack123
时 间:2001-6-16 18:38:44
详细信息:

开心斗地主1.7S(4)注册算法：
注册码为用户名的ASC码经过如下运算后获得ASC字符：
（每隔6位算法相同）
BIT1:+1
BIT2:+1
BIT3:+6
BIT4:+2
BIT5:+5
BIT6:-3


快速邮件地址搜索器3.0

标 题:快速邮件地址搜索器3.0 注册码破解！！！！----让我生气的软件，竟然过滤我！！！！等会连另一个破了！！！ (1千字)
发信人:CrackerABC[BCG]
时 间:2001-4-15 10:47:31
详细信息:
快速邮件地址搜索器3.0 注册码破解！！！！

KAO！真的对我过滤了，我重新用China ABC注册得到的注册码注册后就成了注册版了。

CrackerABc[BCG]
26f097-0b11cd-25f32c-b60225-c0c0d6-63cb9c-2f2988-166e00

China ABC
a60414-609383-079c08-c31627-86e833-d5ac48-61aa00-3fd8b4

下面是我的过程：

1、首先启动软件输入注册信息：
用户名：China ABC
注册码：1212121212

2、然后启动TRW2000并载入内存中，Ctrl+N呼叫出，下断点bpx hmemcpy
然后F5返回程序空间，点注册，被TRW2000拦截到，下BD *。

3、下pmodule，用F10跟踪到下面的位置：

0167:00411897 MOV ECX,ESP
0167:00411899 MOV [ESP+28],ESP
0167:0041189D PUSH EAX
0167:0041189E MOV BYTE [ESP+38],03
0167:004118A3 CALL 004334B4
0167:004118A8 MOV BYTE [ESP+34],01
0167:004118AD CALL 00410DD0
0167:004118B2 MOV ECX,[0046E574] //---下D EDX得到注册码。
0167:004118B8 ADD ESP,BYTE +0C
0167:004118BB MOV [ESP+10],ECX
0167:004118BF TEST EAX,EAX
0167:004118C1 PUSH BYTE +00
0167:004118C3 MOV BYTE [ESP+2C],04
0167:004118C8 PUSH BYTE +00
0167:004118CA JZ 004118D3
0167:004118CC PUSH DWORD 0046DF14
0167:004118D1 JMP SHORT 004118D8
0167:004118D3 PUSH DWORD 0046DEC4
0167:004118D8 CALL 00441299
0167:004118DD MOV ECX,EDI
0167:004118DF CALL 004395BC
0167:004118E4 LEA ECX,[ESP+10]
0167:004118E8 MOV BYTE [ESP+28],01
0167:004118ED CALL 0043373F
0167:004118F2 LEA ECX,[ESP+0C]
0167:004118F6 MOV BYTE [ESP+28],00
0167:004118FB CALL 0043373F
0167:00411900 LEA ECX,[ESP+08]
0167:00411904 MOV DWORD [ESP+28],FFFFFFFF
0167:0041190C CALL 0043373F
0167:00411911 MOV ECX,[ESP+20]
0167:00411915 POP EDI
0167:00411916 MOV [FS:00],ECX
0167:0041191D POP ESI
0167:0041191E ADD ESP,BYTE +24

用下面的China ABC注册码注册成功

CrackerABc[BCG]
26f097-0b11cd-25f32c-b60225-c0c0d6-63cb9c-2f2988-166e00

China ABC
a60414-609383-079c08-c31627-86e833-d5ac48-61aa00-3fd8b4


聊天圣手2.0

标 题:聊天圣手2.0 找注册码... (917字)
发信人:china 2000
时 间:2001-4-9 11:20:45
详细信息:
该程序使用了PECompact v1.40-3挂防DEBUG插件，脱壳倒也容易。只是找注册码找了半天：

系统信息：D96F>BPX040095
用户名：CHINA
注册码：VILCVKCHQ2269265
4A2F74->D EAX (防DEBUG)

0167:004A2F6B 90 NOP
0167:004A2F6C 55 PUSH EBP
0167:004A2F6D 8BEC MOV EBP,ESP
0167:004A2F6F 53 PUSH EBX
0167:004A2F70 8B00 MOV EAX,[EAX] <-正确的注册码
0167:004A2F72 8B12 MOV EDX,[EDX] <-你输入的注册码
0167:004A2F74 E81339FFFF CALL 0049688C <-注册比较
0167:004A2F79 0F94C0 SETZ AL
0167:004A2F7C 83E001 AND EAX,BYTE +01
0167:004A2F7F 5B POP EBX
0167:004A2F80 5D POP EBP
0167:004A2F81 C3 RET
0167:004A2F82 90 NOP
0167:004A2F83 90 NOP
0167:004A2F84 55 PUSH EBP
标 题:聊天圣手2.0暴力破解合找注册码方法 (4千字)
发信人:THK
时 间:2001-4-8 16:09:01
详细信息:
聊天圣手2.0暴力破解合找注册码方法：
作者：THK
目的：仅是爱好！！

通过跟踪，注意到00401F5D是关键跳转
:00401F0F FF4DE4 dec [ebp-1C]
:00401F12 8D45FC lea eax, dword ptr [ebp-04]
:00401F15 BA02000000 mov edx, 00000002
:00401F1A E87D0F0A00 call 004A2E9C
:00401F1F 8B93F4020000 mov edx, dword ptr [ebx+000002F4]
:00401F25 8B83F0020000 mov eax, dword ptr [ebx+000002F0]
:00401F2B E8F00B0700 call 00472B20
:00401F30 8B8BE0020000 mov ecx, dword ptr [ebx+000002E0]
:00401F36 BA02000000 mov edx, 00000002
:00401F3B 8B81F0010000 mov eax, dword ptr [ecx+000001F0]
:00401F41 E82E130700 call 00473274
:00401F46 8B5338 mov edx, dword ptr [ebx+38]
:00401F49 81C2ACFEFFFF add edx, FFFFFEAC
:00401F4F E8C0120700 call 00473214
:00401F54 53 push ebx
:00401F55 E8FA330000 call 00405354 //F8 追入
:00401F5A 59 pop ecx
:00401F5B 84C0 test al, al
:00401F5D 0F85AE000000 je 00402011 //关键跳转
:00401F63 C683F003000000 mov byte ptr [ebx+000003F0], 00
:00401F6A 66C745D81400 mov [ebp-28], 0014
:00401F70 33C0 xor eax, eax
:00401F72 8D55F8 lea edx, dword ptr [ebp-08]
:00401F75 8945F8 mov dword ptr [ebp-08], eax
:00401F78 8BC3 mov eax, ebx
:00401F7A FF45E4 inc [ebp-1C]
:00401F7D E842E70500 call 004606C4
:00401F82 8D4DF8 lea ecx, dword ptr [ebp-08]
:00401F85 51 push ecx

在00401F54处按F8来到这里：
:004057DB 8D4DA8 lea ecx, dword ptr [ebp-58]
:004057DE 51 push ecx
:004057DF E87BAD0900 call 004A055F
:004057E4 59 pop ecx
:004057E5 58 pop eax
:004057E6 EB78 jmp 00405860
:004057E8 66C745B87000 mov [ebp-48], 0070
:004057EE E8C2A60900 call 0049FEB5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405779(U)
|
:004057F3 8D55F8 lea edx, dword ptr [ebp-08] //D EDX 你输入的注册码
:004057F6 8D45FC lea eax, dword ptr [ebp-04] //D EAX 正确的注册码
:004057F9 E86ED70900 call 004A2F6C
:004057FE 84C0 test al, al
:00405800 7430 je 00405832 //跳就死,将此处NOP暴力破解
:00405802 B001 mov al, 01
:00405804 BA02000000 mov edx, 00000002
:00405809 50 push eax
:0040580A 8D45F8 lea eax, dword ptr [ebp-08]
:0040580D FF4DC4 dec [ebp-3C]
:00405810 E887D60900 call 004A2E9C
:00405815 FF4DC4 dec [ebp-3C]
:00405818 8D45FC lea eax, dword ptr [ebp-04]
:0040581B BA02000000 mov edx, 00000002
:00405820 E877D60900 call 004A2E9C
:00405825 58 pop eax
:00405826 8B55A8 mov edx, dword ptr [ebp-58]
:00405829 64891500000000 mov dword ptr fs:[00000000], edx
:00405830 EB2E jmp 00405860

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405800(C)
|
:00405832 33C0 xor eax, eax
:00405834 BA02000000 mov edx, 00000002
:00405839 50 push eax
:0040583A 8D45F8 lea eax, dword ptr [ebp-08]
:0040583D FF4DC4 dec [ebp-3C]
:00405840 E857D60900 call 004A2E9C
:00405845 FF4DC4 dec [ebp-3C]
:00405848 8D45FC lea eax, dword ptr [ebp-04]
:0040584B BA02000000 mov edx, 00000002
:00405850 E847D60900 call 004A2E9C
:00405855 58 pop eax
:00405856 8B55A8 mov edx, dword ptr [ebp-58]
:00405859 64891500000000 mov dword ptr fs:[00000000], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00405678(U), :004057E6(U), :00405830(U)
|
:00405860 5F pop edi
:00405861 5E pop esi
:00405862 5B pop ebx
:00405863 8BE5 mov esp, ebp
:00405865 5D pop ebp

我的注册码：
机器码：D37F02SC580016
用户名：fyb
注册码：KTUJIZBOV7235816


流光2001

 标 题:流光2001完全暴力破解 (3千字)
发信人:多情俏狐
时 间:2001-8-14 15:38:15
详细信息:
流光2001完全暴力破解
================================================
hehan china 多情俏狐
(转载请保持完整)

软件说明:小榕黑客软件系列产品中主打产品，能对pop3,ftp,http服务器及其它密码进行快速猜解。还兼有追捕和双向IP查询功能。

所用工具:trw2000,hedit和w32dasm

1.去除过期提示:

把日期向前改一年不过期，随怀疑是调用了getsystemtime函数

运行trw2000,用getsystime设断,程序在出现调查表之前中断:

* Reference To: MSVCRT.time, Ord:02D0h====>调用API函数getsystemtime
|
:00406149 FF15F0D64800 Call dword ptr [0048D6F0]
:0040614F 8B442410 mov eax, dword ptr [esp+10]
:00406153 83C404 add esp, 00000004
:00406156 3DB7F1C53A cmp eax, 3AC5F1B7
:0040615B 7E4C jle 004061A9=====>不跳就过期
所以改为跳 那74 改EB
:0040615D 6A00 push 00000000
:0040615F 8D4C2434 lea ecx, dword ptr [esp+34]
:00406163 E848950000 call 0040F6B0
:00406168 A148FB4A00 mov eax, dword ptr [004AFB48]
:0040616D 51 push ecx
:0040616E 85C0 test eax, eax
:00406170 C78424CC05000000000000 mov dword ptr [esp+000005CC], 00000000
:0040617B 8BCC mov ecx, esp
:0040617D 740B je 0040618A
:0040617F 8964240C mov dword ptr [esp+0C], esp

2.去除防暴破程序自检点:

启动后虽然没过期提示，但程序自动检测，暴破后照样出错退出:

用w32dasm反汇编后的串式参考正好可以打到出错提示：
(不过中文提示很多，很难找)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040695C(U)
|
:00406963 85C0 test eax, eax
:00406965 7439 je 004069A0====》offset 6965h
如果程序被修改就跳，说可能被病毒感染或者捆绑了恶意程序，然后程序非正常退出。
:00406967 A148FB4A00 mov eax, dword ptr [004AFB48]
:0040696C 51 push ecx
:0040696D 85C0 test eax, eax
:0040696F 8BCC mov ecx, esp
:00406971 740B je 0040697E
:00406973 89642424 mov dword ptr [esp+24], esp

* Possible StringData Ref from Data Obj ->"数字验证失败，可能被病毒感染或者捆绑了恶意程序"
->"。"
|
:00406977 6894404A00 push 004A4094
:0040697C EB09 jmp 00406987

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406971(C)
|
:0040697E 89642424 mov dword ptr [esp+24], esp

* Possible StringData Ref from Data Obj ->"Digit Authenticate Failed, Quit."
|
:00406982 6870404A00 push 004A4070

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040697C(U)
|

* Reference To: MFC42.Ordinal:0219, Ord:0219h

3.开始用户调查表的去除:

曾经尝试从成功消息和出错消息两处用动态和静态分析均步成功，随决定从开始一步步进行跟踪。

* Possible Reference to Dialog:
|
:00407E08 68D0434A00 push 004A43D0
:00407E0D 8D4C240C lea ecx, dword ptr [esp+0C]
:00407E11 C784242C08000000000000 mov dword ptr [esp+0000082C], 00000000
:00407E1C E88F730700 call 0047F1B0
:00407E21 85C0 test eax, eax
:00407E23 750A jne 00407E2F
:00407E25 8B06 mov eax, dword ptr [esi]
:00407E27 8BCE mov ecx, esi
:00407E29 FF90C0000000 call dword ptr [eax+000000C0]
^^^^^^^这才是那个令人讨厌的调查表
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407E23(C)
|跳到这里就一片晴空了
:00407E2F 8D4C2408 lea ecx, dword ptr [esp+08]
:00407E33 E828740700 call 0047F260
:00407E38 8BF8 mov edi, eax
====================================>

止此完全破解成功!!!!!

哈哈哈!!!!!!

2001-08-14


媒体2000V6.0-高级复唱机

标 题:媒体2000V6.0-高级复唱机破解？ (774字)
发信人:Dream_er
时 间:2001-2-18 22:02:03
详细信息:
简单破解：
1.修改注册表：用RegSnap比较运行mt2000.exe前后，发现注册表中如下键值发生变化，下次运行时将注册表的值改过来即可。
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\VideoOutType\
VideoOutVolue=0x00000024(36) <--还能运行9次（键值不能小于该值）
VideoOutVolue=ox00000024(36) （两个键值都改）

2.修改mt2000.exe，使之可运行次数不减少：
先用W32dasm反编译mt2000.exe,在"裁判"->"串式数据参考"中查找"您未能成功输入本版注册号，只能在一定期限内..."字样，双击之，来到反汇编代码处，向上走几步，看到"00410C09 2BF0 sub esi,eax"，这就是减少使用次数的代码。用HIEW将其改为"9090 nop nop"即可。

高级破解：求助！！！！！
3.修改mt2000.exe，使任意输入注册号都能注册成功。（用TRW2000跟踪半天，没能找到关键地方。）

4.跟踪到进行注册号比较的地方，直接找到注册号（也没成功！5555555）

标 题:《媒体2000V6.0》破解心得： (3千字)
发信人:小　明
时 间:2001-2-21 13:32:48
详细信息:

    一、流程分析
    先运行TRW2000 1.23注册版，再运行媒体2000，随便乱输注册码，确定，跳出窗口提示注册码错，按ctrl-N，下pmodule命令，返回出错窗口，点确定，立刻被拦，按2次F10来到40f41d处，往上看：
0167:0040F0D1 LEA ECX,[ESP+48]
0167:0040F0D5 MOV BYTE [ESP+052C],0A
0167:0040F0DD CALL 004593E8　　　　　　　　显示输入框
0167:0040F0E2 CMP EAX,BYTE +01　　　　　　按确定？
0167:0040F0E5 JNZ NEAR 0040F40E　　　　　　否
0167:0040F0EB LEA EAX,[ESP+A4]
0167:0040F0F2 LEA ECX,[ESP+14]
0167:0040F0F6 PUSH EAX
0167:0040F0F7 CALL 0045DD86
0167:0040F0FC MOV ECX,[ESP+14]
0167:0040F100 PUSH DWORD 004A7B48
0167:0040F105 PUSH ECX
0167:0040F106 CALL 0043319B
0167:0040F10B ADD ESP,BYTE +08
0167:0040F10E TEST EAX,EAX　　　　　　　　　注册码为空？
0167:0040F110 JZ 0040F15C　　　　　　　　　是
0167:0040F112 MOV EDX,[ESP+14]
0167:0040F116 MOV EAX,[EDX-08]　　　　　　　取注册码长度
0167:0040F119 CMP EAX,BYTE +0C
0167:0040F11C JL 0040F15C　　　　　　　　小于12则错
0167:0040F11E PUSH BYTE +04
0167:0040F120 LEA EAX,[ESP+14]
0167:0040F124 PUSH BYTE +08
0167:0040F126 PUSH EAX
0167:0040F127 LEA ECX,[ESP+20]
0167:0040F12B CALL 0044F1DB　　　　　　　　取注册码的第8－12位
0167:0040F130 MOV EAX,[EAX]
0167:0040F132 PUSH EAX
0167:0040F133 CALL 0043362C　　　　　　　　变成数值
0167:0040F138 ADD ESP,BYTE +04
0167:0040F13B LEA ECX,[ESP+10]
0167:0040F13F MOV ESI,EAX　　　　　　　　存入ESI
0167:0040F141 CALL 0045DC4D
0167:0040F146 CMP ESI,BYTE +64
0167:0040F149 JNL 0040F158　　　　　　　　小于64则错
0167:0040F14B PUSH BYTE +00
0167:0040F14D PUSH EBP
0167:0040F14E PUSH DWORD 004A1C9C
0167:0040F153 JMP 0040F416
0167:0040F158 CMP ESI,EDI　　　　　　　　等于识别码后4位？
0167:0040F15A JZ 0040F169　　　　　　　　等于
0167:0040F15C PUSH BYTE +00
0167:0040F15E PUSH EBP
0167:0040F15F PUSH DWORD 004A1C9C
0167:0040F164 JMP 0040F416　　　　　　　　出错
0167:0040F169 LEA ECX,[EDI+EDI*4]　　　　以下校验注册码的真假
0167:0040F16C LEA EDX,[EDI+EDI*8]
0167:0040F16F LEA EAX,[EDI+ECX*8]
0167:0040F172 LEA ESI,[EDI+EDX*2]
0167:0040F175 LEA ECX,[EAX+EAX*2]
.
.
.
0167:0040F300 LEA EAX,[ECX+EAX*4]
0167:0040F303 LEA EAX,[EAX+EAX*4]
0167:0040F306 LEA ECX,[EAX+EAX*4]
0167:0040F309 LEA EAX,[ESI+ECX*4]
0167:0040F30C LEA EAX,[EAX+EAX*4]
0167:0040F30F LEA EAX,[EAX+EAX*4]
0167:0040F312 LEA EDX,[EDX+EAX*4-1C]
0167:0040F316 MOV EAX,[ESP+44]
0167:0040F31A CMP EAX,EDX　　　　　　　　注册码为真？
0167:0040F31C JNZ NEAR 0040F3C1　　　　　否，出错

弄清以上流程，爆破就容易了。

    二、注册码的校验算法
    1、将输入的12位注册码分成2部分：前8位设为X，后4位设为Y（均为10进制，以下同）；
    2、将Y*123的前3位与Y*456的第2、3、4位串起来成为一个6位数，设为Z；
    3、计算X-Z，设为M；
    4、将M从高位到低位分成4个2位数，设为A、B、C、D；
    5、将A、B、C、D重新组合成新的8位数CBDA，计算CBDA-15111028，设为N；
    6、比较N与识别码的前8位，相等则输入的注册码为真，否则为假。

    三、注册码的生成算法
    1、将软件给出的12位识别码分成2部分：前8位设为X，后4位设为Y（均为10进制，以下同）；
    2、将Y*123的前3位与Y*456的第2、3、4位串起来成为一个6位数，设为Z；
    3、计算X+15111028，设为M；
    4、将M从高位到低位分成4个2位数，设为A、B、C、D；
    5、将A、B、C、D重新组合成新的8位数DBAC，计算DBAC+Z，设为N；
    6、将N与识别码的后4位串起来，形成注册码。

    四、注册成功标志
    注册成功标志放在注册表的HKEY_USERS\.Default\RemoteAccess\Identf\Licn处。

标 题:媒体2000V6.0注册机（VB）： (631字)
发信人:小　明
时 间:2001-2-21 0:05:43
详细信息:

 '《媒体2000V6.0》算号器，请用VB5以上编译
'说明：Text1为机器识别号（12位数字），Text2为注册码（自动算出）
'作者：小明　2001.2.20
Private Sub Text1_Change()
s = Trim(Text1.Text)
If Len(s) = 12 Then
x = Val(Left(s, 8))
y = Val(Right(s, 4))
z = Val(Left(Trim(Str(y * 123)), 3) + Mid(Trim(Str(y * 456)),
    2, 3))
x = x + 28
a = x Mod 100
x = x \ 100 + 10
d = x Mod 100
x = x \ 100 + 11
b = x Mod 100
x = x \ 100 + 15
c = x Mod 100
z = a * 1000000 + b * 10000 + c * 100 + d + z
Text2.Text = Trim(Str(z)) + Right(s, 4)
Else
Text2.Text = ""
End If
End Sub


美萍安全卫士8.2

 标 题:目标：美萍安全卫士8.2标准版追踪记录 (2千字)
发信人:13s
时 间:2001-7-26 22:00:15
详细信息:
目标：美萍安全卫士8.2标准版

这个东西用ASPACK加过壳，刚开始玩的时候，由于机子运行了trw，没想到
它未经本人同意，竟然将俺的机子关了。TMD，可恶!!俺倒要看看是你凭
啥关俺的爱机：)

一、除去防跟踪程序的部分：

用wasm32反脱壳后的程序，发现它是调用ExitWindowsEx来关闭计算机的!

********************关机代码1**************************
:004A03D3 E814E9FCFF call 0046ECEC
:004A03D8 84C0 test al, al
:004A03DA 7409 je 004A03E5 //可以跳过关机
:004A03DC 6A00 push 00000000
:004A03DE 6A05 push 00000005

* Reference To: USER32.ExitWindowsEx, Ord:0000h
|
:004A03E0 E8BB5FF6FF Call 004063A0　//关机!

********************关机代码2**************************
:004A0805 E8864AF6FF call 00405290
:004A080A E8751FF6FF call 00402784
:004A080F E8D8E4FCFF call 0046ECEC
:004A0814 84C0 test al, al
:004A0816 7409 je 004A0821 //可以跳过关机
:004A0818 6A00 push 00000000
:004A081A 6A05 push 00000005

* Reference To: USER32.ExitWindowsEx, Ord:0000h
|
:004A081C E87F5BF6FF Call 004063A0 //要关机!

改过以上两处，就不会再轻易关掉我的爱机了^_^。。
其实，它防的不止trw一个哟，，ICE、REGMON ect..，你可以进入CALL 0046ECEC看看嘛!

二、找出注册码。
我是用这个方法，发现它将注册信息写在注册表里的。
输入一个注册码。用regshot查看注册后的注册表是否变化，嘿嘿。。有了以下变化。
**Original contents Maybe deleted or modified**
H.L.K\Software\Mpsoft\Smenu\Reg\RegNum: 0x00792EC6

**Keys&Values Modified | Added in the 2ndShot**
H.L.K\Software\Mpsoft\Smenu\Reg\RegNum: 0x075ADB50

原来它是将注册信息写在H.L.K\Software\Mpsoft\Smenu\Reg\RegNum这儿，
于是在trw中设bpx regqueryvalueEXA do "d *(Esp+8)",,看到程序读RegNum时，要小心点跟了，
这离正确的注册码已经不远了^_^。
贴如下代码：
015F:00474447 MOV EAX,[004A7C14]
015F:0047444C MOV EAX,[EAX] //? EAX (你的本机软件序列号)
015F:0047444E CALL 00473910 //生成正确的注册,想做注册机可不要错过!
015F:00474453 MOV EBX,EAX //正确注册号放入EBX中
015F:00474455 MOV EAX,004744FC
015F:0047445A CALL 00473B3C
015F:0047445F CMP EBX,EAX //注册码比较
015F:00474461 JNZ 0047446D

注册算法没有时间看，应该不是很难，有兴趣的同志可以做个注册机呀!

十三少[CCG]
2001.07.27


美萍安全卫士v6.9

 标 题:美萍安全卫士v6.9标准版（天意II+W32dasm）破解实战！ (3千字)
发信人:wind[CCG]
时 间:2000-9-9 13:12:28
详细信息:
美萍安全卫士v6.9标准版（天意II+W32dasm）破解实战！

如果，你愿意先写一篇用天意II破解注册码的程序，那就要记住：Alt+z这个热键了！
现在破解下断点，必须借助与s命令！无法对api下断！我这里只是给出天意II几个
命令的使用情况！

1、我们首先需要脱壳来静态分析其代码，然后用天意II来判断是否正确！
现在天意II增加了s功能，没有对api函数下断点的能力（期待后续版本）
所以，只能先采取静态分析！

2、脱壳：这部分可以用天意II+PE editor v1.6来完成脱壳！用天意II载入程序
很快来到如下：（以下的程序代码是由天意II的wirte功能生成的）
015F:00517000 60 PUSHAD
015F:00517001 E800000000 CALL 00517006 --->下suspend，然后用pe editor来脱壳！
015F:00517006 5D POP EBP
015F:00517007 81ED3ED94300 SUB EBP,0043D93E
015F:0051700D B838D94300 MOV EAX,0043D938
015F:00517012 03C5 ADD EAX,EBP
015F:00517014 2B850BDE4300 SUB EAX,[EBP+00043DE0B]
015F:0051701A 898517DE4300 MOV [EBP+00043DE17],EAX
015F:00517020 80BD01DE430000 CMP [EBP+00043DE01],00
015F:00517027 7515 JNE 0051703E
015F:00517029 FE8501DE4300 INC [EBP+00043DE01]
015F:0051702F E81D000000 CALL 00517051
015F:00517034 E879020000 CALL 005172B2
015F:00517039 E812030000 CALL 00517350
015F:0051703E 8B8503DE4300 MOV EAX,[EBP+00043DE03]
015F:00517044 038517DE4300 ADD EAX,[EBP+00043DE17]
015F:0051704A 8944241C MOV [ESP+1C],EAX
015F:0051704E 61 POPAD
3、经过分析，发现还是用unaspack脱壳比较好！所以，后来还是使用了unaspack
来脱壳，等以后天意有了自己的脱壳命令我们在完全使用天意来脱壳！以上这
部分，只是试用一下Rufeng兄所说的write功能，的确十分方便！无需任何参数！

4、用W32dasm反汇编smenu.exe来静态分析，经过分析，终于发现了美萍计算注册码
和比对注册码的地方！看一下如下程序段：
:0046E2C9 B870E34600 mov eax, 0046E370
:0046E2CE E895F6FFFF call 0046D968
:0046E2D3 3BD8 cmp ebx, eax -->我们在这里用天意下断点，发现ebx中的值转换成
10进制数，就是我们需要的正确注册码，这里我们
Rufeng兄的另一款作品Crackcode2000写一个注册机
:0046E2D5 750A jne 0046E2E1 -->要改破解版就该这里！把它nop掉!
:0046E2D7 B801000000 mov eax, 00000001
:0046E2DC E983000000 jmp 0046E364

在这里之所以，让大家采用天意II来分析，是以为目前唯一没有被美萍防的就是天意II了！
过两天我会写一篇用天意II破解一些注册码的例子！其实大家应该知道天意II的热键Alt+Z!
现在的天意II是多么的漂亮啊，比起soft-ice可要好看多了，但是对显卡的要求也比较高！
目前的天意II还没有下如：bpx hmemcpy之类的功能（无法对api下断点），所以破解一些
注册码程序还是可以的，因为可以借助于天意II的s功能！
wind[CCG]
http://biggow.8u8.com


美萍电脑安全卫士V7.52

标 题:美萍电脑安全卫士(V7.52标准版)终极破解（注册法 & 暴力破解法） (1千字)
发信人:paulyoung
时 间:2001-2-24 20:55:02
详细信息:
美萍电脑安全卫士(V7.52标准版)终极破解（注册法 & 暴力破解法）

作者：PaulYoung
时间：二○○一年二月二十三日凌晨

    首先感谢《看雪论坛》几名知名不知名的朋友提供技术指导，参考WIND[CCG]美萍电脑安全卫士 V5.2的破解法。（论坛精华2）
    美萍电脑安全卫士可以防TRW、SOFTICE等多种常用破解软件，一旦检测到相关关键词，即时关机没商量，惨……惨……惨……所以，破解前必须先干掉它的反破解。
    先用unaspack或其它工具脱掉Aspack的壳，再用UEDIT或HEXWORKSHOP等编辑工具查找TRW、WINICE...你会在那里同时发现有多种常用的破解软件的关键词，只要把那些关键词替换成任意一个词即可，如TRW换成TRR即可，其它同样道理。
    好了，现在用W32DASM反汇编脱壳后的文件。
    关键比较在下面，具体跟踪过程我懒得写了。（别扔鸡蛋！！！）

* Possible StringData Ref from Code Obj ->"RegNum"
|
:0046EE99 B840EF4600 mov eax, 0046EF40
:0046EE9E E895F6FFFF call 0046E538
:0046EEA3 3BD8 cmp ebx, eax
:0046EEA5 750A jne 0046EEB1
:0046EEA7 B801000000 mov eax, 00000001
:0046EEAC E983000000 jmp 0046EF34

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046EEA5(C)
|
:0046EEB1 33C0 xor eax, eax
:0046EEB3 5B pop ebx
:0046EEB4 C3 ret

    用trw2000 下bpx 0046eea3，再运行美萍安全卫士，立即被拦截，下 ? ebx ,看到的DEC值（十进制）就是你的注册码。
    或将:0046EEA5 750A jne 0046EEB1中的jne改为je，那填什么注册码都行了！


密码管理软件

标 题:密码管理软件。 (2千字)
发信人:小球
时 间:2001-3-12 23:23:39
详细信息:

密码管理软件破解。
运行软件，来到注册处，填上注册信息。（当然了随便了）
用ice下断：
bpx hmemcpy
按ok
被拦截.....
按几下f12来到该程序段，再按f10停在这里：
:0041D539 6888130000 push 00001388
:0041D53E 8B5508 mov edx, dword ptr [ebp+08]
:0041D541 52 push edx
:0041D542 E8990EFFFF call 0040E3E0 *不要按了，这里是出错框！
啊！对了，一路上你会碰到，几段代码：
:0041D49E E85D640000 call 00423900 *这里算码！
:0041D4A3 83C404 add esp, 00000004
:0041D4A6 8985FCFEFFFF mov dword ptr [ebp+FFFFFEFC], eax
:0041D4AC 81BDFCFEFFFF92A71901 cmp dword ptr [ebp+FFFFFEFC], 0119A792 *对输入的注册码经过复杂计算后比较
:0041D4B6 753C jne 0041D4F4

:0041D519 8B450C mov eax, dword ptr [ebp+0C]
:0041D51C 83C032 add eax, 00000032
:0041D51F 50 push eax
:0041D520 8B4D0C mov ecx, dword ptr [ebp+0C]
:0041D523 51 push ecx
:0041D524 E897870000 call 00425CC0
:0041D529 83C408 add esp, 00000008
:0041D52C 3985F8FEFFFF cmp dword ptr [ebp+FFFFFEF8], eax *这里也是哦！
:0041D532 7418 je 0041D54C
:0041D534 68CFEA0000 push 0000EACF

:0041D4F4 81BDFCFEFFFF3CCE5F0D cmp dword ptr [ebp+FFFFFEFC], 0D5FCE3C *这里也是哦！
:0041D4FE 7519 jne 0041D519

标 题:算码过程 (822字)
发信人:china 2000
时 间:2001-3-14 10:44:34
详细信息:

关键：
:0041D524 E897870000 call 00425CC0 //*这里计算注册码！
:0041D529 83C408 add esp, 00000008
:0041D52C 3985F8FEFFFF cmp dword ptr [ebp+FFFFFEF8], eax //*比较注册码
:0041D532 7418 je 0041D54C //*相等就OK了
用到的两个表：
FORM1='|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw'
FORM2='#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtKpzSdtzoXqmb^Al@dv:s?x/'
做注册机要注意用中文时ASC会大于80H，会变成负数的情况。
初始值为：180150264
流程：
取姓名
大于0吗
循环开始
code2=0
I 为从 1 到 姓名长度
code1=取表FORM1[I]*NAME[I]
code2=code2+取表FORM2[I+姓名长度]*code1
I 不等于姓名长度再循环

将公司名也如此处理，再将两个值再加，再加上初始值就是注册码

^-^上午刚做好注册机，为防有心人不会提供。

标 题:如何实现自动注册！ (513字)
发信人:china 2000
时 间:2001-3-15 9:30:44
详细信息:

:0041D52C 3985F8FEFFFF cmp dword ptr [ebp+FFFFFEF8], eax //*比较注册码
在这里将其改为：
8985F8FEFFFF MOV dword ptr [ebp+FFFFFEF8], eax //*将注册码写到内存
再将下面的JZ改为JMPS，也就是74 -》EB
如此改两个字节就OK了，就是你无论输入任何注册码程序都能将正确的注册码写入注册表中。再次启动就可了。
正确的注册码写入注册表中后，无论如何启动当然还是注册版本。
只有将注册表中的值删除后才能再次注册，当然，按上面改了后注册时程序
自己就会将正确的注册码写到内存。再次启动后就是注册版了。


敏思硬盘卫士 2.2

 标 题:新手破解：敏思硬盘卫士 2.2 (1千字)
发信人:极光飞羽
时 间:2001-7-25 18:45:38
详细信息:
该软件无壳，无暗桩，无crc,属典型的“三无产品”，最适合我等新手练手了，呵呵~~~~~!!!
1、运行trw 2000和程序，并填入假注册码：7878748
2、ctrl+N
3、bpx hmemcpy
4、g or F5
5、回到程序点确定
6、成功拦截
7、bc *
8、pmodule
9、按F12七下后再按F10来到如下代码：
...
:004A4144 8B45FC mov eax, [ebp-04] <---Fuck sn:7878748
:004A4147 50 push eax
:004A4148 8D55F4 lea edx, [ebp-0C]
:004A414B 8B8304030000 mov eax, [ebx+00000304]
:004A4151 E8FAD6F8FF call 00431850
:004A4156 8B45F4 mov eax, [ebp-0C] <---存放的机器码
:004A4159 8D4DF8 lea ecx, [ebp-08]
:004A415C 66BA0D00 mov dx, 000D
:004A4160 E8A3F8FFFF call 004A3A08
:004A4165 8B55F8 mov edx, [ebp-08] <---Real sn
:004A4168 58 pop eax
:004A4169 E83EFEF5FF call 00403FAC <---比较真假注册码的call
:004A416E 7423 je 004A4193

在上面代码三个注释处下D命令可分别看到
Fuck sn: 7878748
machine sn: 873934337758
Real sn: 2981003264

我在用crackcode 2000做注册机时碰到一个问题，就是不知道什么时候该用0，1，2等不同模式。特向各位大侠求教。各位大侠一定要帮帮我！！！

标 题:贴它的注册机！ (474字)
发信人:TAE!
时 间:2001-7-28 23:29:21
详细信息:

#include<stdio.h>
#include<string.h>
main()
{
char sn[99];
long code,b,i,j,l,p,a;
printf(" *********************\n *KeyGen by TAE![CCG]*\n *********************\n\n");
printf("Please input your sn :");
gets(sn);
l=strlen(sn);
for (i=0;i<l;i++)
{if (sn[i]>=0x61&& sn[i]<=0x7a) sn[i]-=20;
if (i%2!=0) sn[i]+=0x0D;else sn[i]+=0x1A;}
b=sn[0]+1;
code=b*0x1e61;
for (j=1;j<l;j++)
{p=j+1;
a=sn[j]+p;
code*=a;}
printf("Your registration code:%ld",code);
}


敏思硬盘卫士1.0

 标 题:敏思硬盘卫士1.0 (网络版客户端)的注册分析(简单级) (7千字)
发信人:6767[BCG]
时 间:2001-8-21 13:38:02
详细信息:
敏思硬盘卫士1.0 (网络版客户端)的注册分析(简单级)
by Fpc[CCG] & 6767[BCG] @2001/08

tools: sI, WdaSm
level: 1/5

主要功能：硬盘保护，访问限制，个人空间，文档中心，病毒防范，远程管理
作者主页：http://www.globalmediastar.com/

有人要这个，所以追一下了。因为是一机一号，没办法，只有作出注册机或破解版，好在这个简单，能作注册机。

:004A6866 8B45F4 mov eax, dword ptr [ebp-0C] <- 硬件号
:004A6869 8D4DF8 lea ecx, dword ptr [ebp-08] <- 注册码存放位置
:004A686C 66BA1300 mov dx, 0013 <- 参与运算
:004A6870 E8A3F8FFFF call 004A6118 <- 生成注册码

:004A6875 8B55F8 mov edx, dword ptr [ebp-08] <- 真码
:004A6878 58 pop eax <- 假码
:004A6879 E836D7F5FF call 00403FB4 <- 比较了
:004A687E 7423 je 004A68A3

:004A6880 6A30 push 00000030

* Possible StringData Ref from Code Obj ->" 敏思硬盘卫士"
|
:004A6882 6814694A00 push 004A6914

* Possible StringData Ref from Code Obj ->"输入的注册码无效，请重新输入。"
|
:004A6887 6824694A00 push 004A6924
:004A688C 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:004A688E E85509F6FF Call 004071E8

显然在:004A6870 call 004A6118是关键追进去看它是怎么算的：

* Referenced by a CALL at Addresses:
|:004A66B4 , :004A6870 , :004CF984 , :004CFFA4 , :004D04B4
|:004D07C0 , :004D0B98 , :004D0DBC , :004D108F , :004D17C0
|:004D2728
|
:004A6118 55 push ebp
:004A6119 8BEC mov ebp, esp

... ...

:004A6125 8BDA mov ebx, edx <- ebx=0x13
:004A6127 8945FC mov dword ptr [ebp-04], eax

... ...

:004A6140 8D55F4 lea edx, dword ptr [ebp-0C] <- 存放的位置
:004A6143 8B45FC mov eax, dword ptr [ebp-04] <- 硬件号
:004A6146 E88524F6FF call 004085D0 <- 硬件号中的字母小写转大写，请看

>>>>>>

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408604(C)
|
:004085F1 8A02 mov al, byte ptr [edx]
:004085F3 3C61 cmp al, 61
:004085F5 7206 jb 004085FD
:004085F7 3C7A cmp al, 7A
:004085F9 7702 ja 004085FD
:004085FB 2C20 sub al, 20 <- 这一句

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004085F5(C), :004085F9(C)
|
:004085FD 8806 mov byte ptr [esi], al
:004085FF 42 inc edx
:00408600 46 inc esi
:00408601 4B dec ebx
:00408602 85DB test ebx, ebx
:00408604 75EB jne 004085F1

<<<<<<

:004A614B 8B45F4 mov eax, dword ptr [ebp-0C] <- 硬件号(已转换为大写)
:004A614E 8D4DF8 lea ecx, dword ptr [ebp-08]
:004A6151 0FB7D3 movzx edx, bx

:004A6154 E8037AFEFF call 0048DB5C <- 这个的作用是将硬件号的各位置加上一个数
<- 规则是：奇数位置加0x14，偶数位置加0x13

>>>>>>

* Referenced by a CALL at Addresses:
|:0048E5BF , :004A6154 , :004C40F3 , :004C410D , :004C4127
|
:0048DB5C 55 push ebp
:0048DB5D 8BEC mov ebp, esp
:0048DB5F 83C4EC add esp, FFFFFFEC
:0048DB62 53 push ebx
:0048DB63 56 push esi
:0048DB64 57 push edi
:0048DB65 33DB xor ebx, ebx
:0048DB67 895DEC mov dword ptr [ebp-14], ebx
:0048DB6A 894DF4 mov dword ptr [ebp-0C], ecx
:0048DB6D 8955F8 mov dword ptr [ebp-08], edx <- [ebp-8]=0x13
:0048DB70 8945FC mov dword ptr [ebp-04], eax

... ...

:0048DB91 8B45F8 mov eax, dword ptr [ebp-08]
:0048DB94 40 inc eax
:0048DB95 8945F0 mov dword ptr [ebp-10], eax <- [ebp-10]=0x14

... ...

:0048DBA6 BE01000000 mov esi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048DBDB(C)
|
:0048DBAB 8B45FC mov eax, dword ptr [ebp-04]
:0048DBAE 33DB xor ebx, ebx
:0048DBB0 8A5C30FF mov bl, byte ptr [eax+esi-01]
:0048DBB4 F7C601000000 test esi, 00000001 <- 相当于对2取模
:0048DBBA 7505 jne 0048DBC1 <- 在奇数位置上则向下跳

:0048DBBC 035DF8 add ebx, dword ptr [ebp-08] <- bl+=0x13
:0048DBBF EB03 jmp 0048DBC4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048DBBA(C)
|
:0048DBC1 035DF0 add ebx, dword ptr [ebp-10] <- bl+=0x14

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048DBBF(U)
|
:0048DBC4 8D45EC lea eax, dword ptr [ebp-14]
:0048DBC7 8BD3 mov edx, ebx
:0048DBC9 E8FE61F7FF call 00403DCC <- 这两个Call只是在内存中拷贝
:0048DBCE 8B55EC mov edx, dword ptr [ebp-14]
:0048DBD1 8B45F4 mov eax, dword ptr [ebp-0C]
:0048DBD4 E8E3A9F7FF call 004085BC
:0048DBD9 46 inc esi
:0048DBDA 4F dec edi
:0048DBDB 75CE jne 0048DBAB <- 未完成则处理下一字符

... ...

:0048DC08 C3 ret

<<<<<<

:004A6159 8BD6 mov edx, esi
:004A615B 8B45F8 mov eax, dword ptr [ebp-08]
:004A615E E889010000 call 004A62EC <- 这个是对字符串的运算，求出一个和，再打印成无符号数，就是注册码

>>>>>>

:004A6317 BB611E0000 mov ebx, 00001E61 <- 初始化：ebx=7777

... ...

:004A632A B801000000 mov eax, 00000001 <- i=1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A6340(C)
|
:004A632F 8B4DFC mov ecx, dword ptr [ebp-04]
:004A6332 0FB64C01FF movzx ecx, byte ptr [ecx+eax-01] <- ecx=Code[i]
:004A6337 03C8 add ecx, eax <- ecx+=i (这里i从一开始)
:004A6339 0FAFCB imul ecx, ebx <- ecx*=ebx
:004A633C 8BD9 mov ebx, ecx <- ebx=ecx
:004A633E 40 inc eax <- i++
:004A633F 4A dec edx
:004A6340 75ED jne 004A632F <- 未处理完则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A6328(C)
|
:004A6342 8B45F8 mov eax, dword ptr [ebp-08] <- 打印的目标地址
:004A6345 50 push eax
:004A6346 895DF0 mov dword ptr [ebp-10], ebx <- 保存结果
:004A6349 C645F400 mov [ebp-0C], 00
:004A634D 8D55F0 lea edx, dword ptr [ebp-10]
:004A6350 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"%.10u" <- 很明确
|
:004A6352 B888634A00 mov eax, 004A6388
:004A6357 E85036F6FF call 004099AC <- 打印字符串

<<<<<<

... ...

:004A6189 5D pop ebp
:004A618A C3 ret <- 注册码生成完毕，则返回

注册信息在：
REGEDIT4

[HKEY_CURRENT_USER\Software\MediaStar\HddGuard]
"RegCode"="Your SN is here"

结束。


魔法转换

 标 题:魔法转换 (2千字)
发信人:jsjyt
时 间:2001-5-26 9:36:28
详细信息:
软件名称：魔法转换
整理日期：2001.4.1
最新版本：1.5 build 0401
文件大小：528KB
软件授权：共享软件
使用平台：Win9x/NT/2000
发布公司：Home Page
软件简介：
    是一个图像转换工具。它支持的图像格式有BMP，GIF，JPG，ICO等等。能将它支持的格式图像转换或批量转换为BMP，GIF，JPG格式。它之所以魔法，就是它能将图像转换为HTM，TXT，RTF格式，而且支持彩色转换和单色转换，还分为多种模式转换，比如缩小一倍。如果转换出ASCII字符不满意，还可以设置字符方案，在选项里你可以调入一幅图像来扫描字符，直到满意为止。又能导入方案和导出方案。
1.脱aspack壳.用w32反编译
2.* Possible StringData Ref from Code Obj ->"已注册！授权给："
|
:004B265E 6854284B00 push 004B2854
:004B2663 FF75FC push [ebp-04]

* Possible StringData Ref from Code Obj ->" 注册码："
|
:004B2666 6870284B00 push 004B2870
:004B266B FF75F4 push [ebp-0C]
:004B266E 8D45F0 lea eax, dword ptr [ebp-10]
:004B2671 BA04000000 mov edx, 00000004
:004B2676 E83516F5FF call 00403CB0
:004B267B 8B55F0 mov edx, dword ptr [ebp-10]
:004B267E 8B83F0010000 mov eax, dword ptr [ebx+000001F0]
:004B2684 E883FFF6FF call 0042260C
:004B2689 E9E5000000 jmp 004B2773
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B264F(C)
|
:004B268E 8D45F0 lea eax, dword ptr [ebp-10]
:004B2691 E81A550000 call 004B7BB0
:004B2696 8B45F0 mov eax, dword ptr [ebp-10]
:004B2699 E8524FF5FF call 004075F0
:004B269E 83F81E cmp eax, 0000001E
:004B26A1 7E15 jle 004B26B8

* Possible StringData Ref from Code Obj ->"这是共享软件！你已经用了30天，如果觉得满意，请"
->"注册！"

向上看
* Possible StringData Ref from Code Obj ->"magct"
|
:004B262E BAF0274B00 mov edx, 004B27F0 在这里设断
:004B2633 A1384F4C00 mov eax, dword ptr [004C4F38] d eax看见正确的注册码
:004B2638 E8F3BAFBFF call 0046E130
:004B263D 46 inc esi
:004B263E 0F85BF000000 jne 004B2703
:004B2644 8B45F8 mov eax, dword ptr [ebp-08]
:004B2647 8B55F4 mov edx, dword ptr [ebp-0C]
:004B264A E8B116F5FF call 00403D00
:004B264F 753D jne 004B268E
:004B2651 33D2 xor edx, edx
:004B2653 8B83E8010000 mov eax, dword ptr [ebx+000001E8]
:004B2659 E816FFF6FF call 00422574


魔法转换1.5

标 题:大魔头,哪里跑,看剑(魔法转换1.5破解记录，新鲜出炉) (3千字)
发信人:风飘雪[CCG]
时 间:2001-4-1 12:26:59
详细信息:
大魔头,哪里跑,看剑(魔法转换1.5破解记录，新鲜出炉)

软件名称：魔法转换
整理日期：2001.4.1
最新版本：1.5 build 0401
文件大小：528KB
软件授权：共享软件
使用平台：Win9x/NT/2000
发布公司：Home Page
软件简介：
    是一个图像转换工具。它支持的图像格式有BMP，GIF，JPG，ICO等等。能将它支持的格式图像转换或批量转换为BMP，GIF，JPG格式。它之所以魔法，就是它能将图像转换为HTM，TXT，RTF格式，而且支持彩色转换和单色转换，还分为多种模式转换，比如缩小一倍。如果转换出ASCII字符不满意，还可以设置字符方案，在选项里你可以调入一幅图像来扫描字符，直到满意为止。又能导入方案和导出方案。
http://xt.onlinedown.net/down/mc0401.exe
不直接比对，较讨厌
1.脱aspack壳,w32dasm黄金版反汇编
* Possible StringData Ref from Code Obj ->"magct"
|
:004B262E BAF0274B00 mov edx, 004B27F0 -------(1)
:004B2633 A1384F4C00 mov eax, dword ptr [004C4F38]
:004B2638 E8F3BAFBFF call 0046E130
:004B263D 46 inc esi
:004B263E 0F85BF000000 jne 004B2703 ------------(2)
:004B2644 8B45F8 mov eax, dword ptr [ebp-08] *
:004B2647 8B55F4 mov edx, dword ptr [ebp-0C] *(3)
:004B264A E8B116F5FF call 00403D00 **
:004B264F 753D jne 004B268E　　　　　　　　＊
:004B2651 33D2 xor edx, edx
:004B2653 8B83E8010000 mov eax, dword ptr [ebx+000001E8]
:004B2659 E816FFF6FF call 00422574

* Possible StringData Ref from Code Obj ->"已注册！授权给："
|
:004B265E 6854284B00 push 004B2854
:004B2663 FF75FC push [ebp-04]

* Possible StringData Ref from Code Obj ->" 注册码："
|
:004B2666 6870284B00 push 004B2870
:004B266B FF75F4 push [ebp-0C]
:004B266E 8D45F0 lea eax, dword ptr [ebp-10]
:004B2671 BA04000000 mov edx, 00000004
:004B2676 E83516F5FF call 00403CB0
:004B267B 8B55F0 mov edx, dword ptr [ebp-10]
:004B267E 8B83F0010000 mov eax, dword ptr [ebx+000001F0]
:004B2684 E883FFF6FF call 0042260C
:004B2689 E9E5000000 jmp 004B2773

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B264F(C)
|
:004B268E 8D45F0 lea eax, dword ptr [ebp-10]
:004B2691 E81A550000 call 004B7BB0
:004B2696 8B45F0 mov eax, dword ptr [ebp-10]
:004B2699 E8524FF5FF call 004075F0
:004B269E 83F81E cmp eax, 0000001E
:004B26A1 7E15 jle 004B26B8

* Possible StringData Ref from Code Obj ->"这是共享软件！你已经用了30天，如果觉得满意，请"
->"注册！"
|
:004B26A3 BA84284B00 mov edx, 004B2884

2.填入用户名，注册码后退出，时间后调一年
trw2000载入
bpx 4b262e (1)
r fl z (2) 使不跳
d eax (3)
３．注册码保存处
win.ini
[magct]
name=guodong
code=670E75156F1C64236F2A6E316738

风飘雪　http://duba.126.com　gd1@yeah.net
标 题:贴这个的注册机！ (538字)
发信人:伪装者[CCG]
时 间:2001-4-1 16:28:57
详细信息:
 #include "stdio.h"
main()
{
char string[81];
int i,c,a,d;
printf("*******MAGCT 1.5********\nThis keygen is maked by Pretender\nPlease
    input your name : ");
gets(string);
printf("Your name is          : ");
puts(string);
printf("Your Register code is  : ");
d=a=strlen(string);
for(i=0;(c=string[i])!='\0';i++)
{d+=a;
if(c<0) c+=256;
printf("%X",c);
if(d<16) printf("0%X",d);
else printf("%X",d);
if((i+1)%10==0) printf("\n
              ");
}

printf("\nWelcome to WWW.CRACKNOW.COM\n");}


魔法转换2.0 beta 1

 标 题:处女作，希望给各位初学者一些帮助^_^ 魔法转换2.0 beta 1 破解 (7千字)
发信人:[pow]
时 间:2001-8-7 19:36:32
详细信息:
魔法转换2.0 beta 1

注册后会在win.ini上写下注册码，以用于每次启动效验：
[magct]
name=pow
code=109F804632

……………………………………………………………………………………………
用typ3看它用了什么壳，发现其使用了Aspack加壳，用unAspack脱之～

脱壳后用w32dsm89反编译，查找字符串，发现又3条表明注册成功。由于注册码错误后没有提示，只好蒙着来啦。一条是“，恭喜你成功注册！”一条是“我自豪，我已经注册！”另一条是“以注册！”从字面上看第一条可能性最大（可惜pow开始没看到，绕了个大圈子）由于pow的马虎，所以把其他两条的功能也给了解了～第二条是注册后显示在“注册”窗口上的，第三条是注册后显示在“关于”菜单上的，可以通过下断点验证。

双击“，恭喜你成功注册！”这个字符串，显示如下内容：

:00561245 837DFC00 cmp dword ptr [ebp-04], 00000000 《－－－判断是否有用户明
:00561249 7518 jne 00561263
:0056124B 6A30 push 00000030
:0056124D 68B8135600 push 005613B8

* Possible StringData Ref from Code Obj ->"请输入姓名！"
|
:00561252 68C0135600 push 005613C0
:00561257 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:00561259 E80269EAFF Call 00407B60
:0056125E E908010000 jmp 0056136B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00561249(C)
|
:00561263 8D55F8 lea edx, dword ptr [ebp-08]
:00561266 8B83E8020000 mov eax, dword ptr [ebx+000002E8]
:0056126C E8FB78EDFF call 00438B6C
:00561271 8B45F8 mov eax, dword ptr [ebp-08]
:00561274 50 push eax 《－－－假码！
:00561275 8D55F0 lea edx, dword ptr [ebp-10]
:00561278 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:0056127E E8E978EDFF call 00438B6C
:00561283 8B45F0 mov eax, dword ptr [ebp-10]
:00561286 8D55F4 lea edx, dword ptr [ebp-0C]
:00561289 E84E4CFFFF call 00555EDC
:0056128E 8B55F4 mov edx, dword ptr [ebp-0C] 《－－－真码！
:00561291 58 pop eax
:00561292 E8052FEAFF call 0040419C 《－－－对比真假码的call，关键！
:00561297 0F85CE000000 jne 0056136B 《－－－一条就死！
:0056129D 8D45EC lea eax, dword ptr [ebp-14]
:005612A0 E8EF48FFFF call 00555B94
:005612A5 8D45EC lea eax, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"\win.ini" 《－－－隐约感到注册码会放到win.ini中
|
:005612A8 BAD8135600 mov edx, 005613D8
:005612AD E8E22DEAFF call 00404094
:005612B2 8B4DEC mov ecx, dword ptr [ebp-14]
:005612B5 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->" <G"
|
:005612B7 A19C344700 mov eax, dword ptr [0047349C]
:005612BC E82B23F1FF call 004735EC
:005612C1 A3E4675700 mov dword ptr [005767E4], eax
:005612C6 8D55E8 lea edx, dword ptr [ebp-18]
:005612C9 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:005612CF E89878EDFF call 00438B6C
:005612D4 8B45E8 mov eax, dword ptr [ebp-18]
:005612D7 50 push eax

* Possible StringData Ref from Code Obj ->"name"
|
:005612D8 B9EC135600 mov ecx, 005613EC

* Possible StringData Ref from Code Obj ->"magct"
|
:005612DD BAFC135600 mov edx, 005613FC
:005612E2 A1E4675700 mov eax, dword ptr [005767E4]
:005612E7 8B30 mov esi, dword ptr [eax]
:005612E9 FF5604 call [esi+04]
:005612EC 8D55E4 lea edx, dword ptr [ebp-1C]
:005612EF 8B83E8020000 mov eax, dword ptr [ebx+000002E8]
:005612F5 E87278EDFF call 00438B6C
:005612FA 8B45E4 mov eax, dword ptr [ebp-1C]
:005612FD 50 push eax

* Possible StringData Ref from Code Obj ->"code"
|
:005612FE B90C145600 mov ecx, 0056140C

* Possible StringData Ref from Code Obj ->"magct"
|
:00561303 BAFC135600 mov edx, 005613FC
:00561308 A1E4675700 mov eax, dword ptr [005767E4]
:0056130D 8B30 mov esi, dword ptr [eax]
:0056130F FF5604 call [esi+04]
:00561312 A1E4675700 mov eax, dword ptr [005767E4]
:00561317 E8781DEAFF call 00403094

* Possible StringData Ref from Code Obj ->"关闭"
|
:0056131C BA1C145600 mov edx, 0056141C
:00561321 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:00561327 E87078EDFF call 00438B9C
:0056132C 33D2 xor edx, edx
:0056132E 8B83F0020000 mov eax, dword ptr [ebx+000002F0]
:00561334 8B08 mov ecx, dword ptr [eax]
:00561336 FF515C call [ecx+5C]
:00561339 6A40 push 00000040

* Possible StringData Ref from Code Obj ->"魔法转换"
|
:0056133B 6824145600 push 00561424
:00561340 8D55E0 lea edx, dword ptr [ebp-20]
:00561343 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:00561349 E81E78EDFF call 00438B6C
:0056134E 8D45E0 lea eax, dword ptr [ebp-20]

* Possible StringData Ref from Code Obj ->"，恭喜你成功注册！"
|
:00561351 BA38145600 mov edx, 00561438 《－－－双击后停在这里
:00561356 E8392DEAFF call 00404094
:0056135B 8B45E0 mov eax, dword ptr [ebp-20]
:0056135E E8ED2EEAFF call 00404250
:00561363 50 push eax
:00561364 6A00 push 00000000

双击后看到注册成功的call，于是向上看，发现:00561297处如果跳转就会跳过注册成功窗口，ok问题就在它，在看看上面，非常经典的判断排列！ok！静态分析基本结束，开始动手拦截吧！

进入trw2000，下断点bpx 00561245，为什么要在这里下断点？一是可以验证关于用户名的猜测，二是可以步步为营，不会落掉什么重要的启示。一步一步的执行，到00561249处如果你有兴趣可以试试r fl z，你可以看到果然上面这个那个比较是看有无注册码的^_^，在往下走，到00561274处下d eax可以看到你输入的假注册码，在往下走，到0056128e就是把真的注册码放到edx中了，下d edx即可看到真的注册码。到00561291你又可以看到假码了。00561292这个call是关键，下面条与不条都要看它的，跟进后可以看到真假注册码的对比（又一次可以看到真码），把注册码抄下来就可以收工了^_^

可以看到在005612A8上面的那句，pow第一感觉就是它把注册码放到win.ini中，然后每次启动都对比。这个软件给我的感觉是代码效率太低，很慢（166mmx，64m）。虽然我很讨厌这样的做法，但我还是很同情作者，他也真是不容易，做个软件比破解要难多了……

以上是pow的第一篇像样的破解记录（以前也有，不过都是写给自己看的，估计新手看不懂，老鸟不屑看），今天遇到了这个曾经让我为难的软件（不久前噢，也就2个月，pow很菜的^_^），有了“灭其而后快”的意思，但想到我的这点小伎俩都是从这个论坛或各位大哥前辈的教程上学来的，觉得自己也有义务把这个传统延续下去，于是就有了这篇文章，pow希望能给各位初学者一点帮助，也是对所有有助于我的各位大哥的回报！


木马克星3.13

标 题:关于木马克星3.13注册出现问题的讨论! (2千字)
发信人:qhj
时 间:2001-3-3 11:10:54
详细信息:

标题：关于木马克星3.13注册出现问题的讨论!
作者：《绝密档案》
时间：2001.3.3
问题：为何输入的注册码与注册表里显示的注册码不相同？且注册后提示：
“这个驱动器无法格式化” 是否注册码有问题？请高手指教!

比较两下注册码：

在内存里的注册码
=====================

一、用W32DASM反汇编iparmor后的文件。

:004962E7 8D55F8 lea edx, dword ptr [ebp-08]
:004962EA 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004962F0 8B8024020000 mov eax, dword ptr [eax+00000224]
:004962F6 2DD1080000 sub eax, 000008D1
:004962FB E80829F7FF call 00408C08
:00496300 8B55F8 mov edx, dword ptr [ebp-08]
:00496303 58 pop eax
:00496304 E893DEF6FF call 0040419C >>>在此设断点

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496290(C)
|
:00496309 757E jne 00496389

* Possible StringData Ref from Code Obj ->"注册成功!"
|
:0049630B B864654900 mov eax, 00496564
:00496310 E8B397FBFF call 0044FAC8
:00496315 E8CAFEFFFF call 004961E4
:0049631A A180EE4B00 mov eax, dword ptr [004BEE80]
:0049631F 8B80D4020000 mov eax, dword ptr [eax+000002D4]

* Possible StringData Ref from Code Obj ->"已经注册!"

*******************************************
于是运行TRW，在此 00496304 设断点， 步骤如下：

bpx 00496304 >>此时，运行iparmor ，输入888888888假的注册码， 立即被拦截!
D EAX 假的注册码
D EDX 真的注册码! 抄下!!

我的硬件码：235546f8
我的注册码：1595726332

*******************************

在注册表里的注册码
===========================

二、运行 REGEDIT 进入注册文件：

在[HKEY_LOCAL_MACHINE] 栏下，查找文件：iparmor内容：

可见以下内容：

REGEDIT4
[HKEY_USERS\.DEFAULT\Software\AngelSoft\iparmor]
"deta"="100" ####记录运行次数
"pass"="1595728954" #####存放正确的注册码!!!!!

注意：与我刚才输入的注册码不一样：

刚才输入为： 1595726332
在注册表的为：1595728954

以上两个均能注册成功!

但注册后均提示：“这个驱动器无法格式化”
难道想把我硬盘格式化吗？不知何解？请高手指点？
==========================================

标 题:不对！你们再仔细分析一下程序，有真有假的注册码，两假一真。你们找到的是假注册码。 (234字)
发信人:china 2000
时 间:2001-3-3 13:23:34
详细信息:

都不对！你们再仔细分析一下程序，有真有假的注册码，两假一真。你们找到的是假注册码。
我也不知道程序是否真的要格式化硬盘，因为程序并没有相应的代码。
可能是作者想吓吓破解的人，但为何提示后又将真正的注册码写入注册表呢？真是搞不懂？&^%$&^

标 题:呵呵，找宝呀;-> (2千字)
发信人:1212
时 间:2001-3-3 13:46:40
详细信息:

object Form7: TForm7
Left = 286
Top = 328
Width = 416
Height = 226
Caption = 'Form7'
Color = clBtnFace
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = '宋体'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 12
object GroupBox1: TGroupBox
Left = 0
Top = 0
Width = 408
Height = 199
Align = alClient
Caption = 'Register:'
Color = clSilver
ParentColor = False
TabOrder = 0
object Label3: TLabel
Left = 257
Top = 48
Width = 36
Height = 12
Caption = '注册码'
end
object Label2: TLabel
Left = 68
Top = 140
Width = 48
Height = 12
Caption = '序列号：'
Font.Charset = GB2312_CHARSET
Font.Color = clBlack
Font.Height = -12
Font.Name = '宋体'
Font.Style = []
ParentFont = False
end
object SpeedButton1: TSpeedButton
Left = 244
Top = 120
Width = 65
Height = 22
Caption = '注册'
Flat = True
Font.Charset = GB2312_CHARSET
Font.Color = clGreen
Font.Height = -12
Font.Name = '宋体'
Font.Style = []
ParentFont = False
OnClick = SpeedButton1Click
end
object Edit1: TEdit
Left = 236
Top = 84
Width = 89
Height = 20
TabOrder = 0
end
end
object Memo1: TMemo
Left = 16
Top = 20
Width = 201
Height = 113
Color = 4194368
Font.Charset = ANSI_CHARSET
Font.Color = clAqua
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
Lines.Strings = (
'注册：'
' 注册费用一共20元，'
''
' 银行注册：'
' 可以到当地交通银行，存入'
'601428 4062 4327308 太平洋卡(持'
'卡人：罗建斌），把存入时间，以及'
'业务所号码软件序列号发送到'
'k2d@china.com 既可！'
''
' 也可以到这里：'
'http://www.shareware.net.cn/share'
'ware_view.asp?id=%7B62749643-14'
'48-4292-8AD3-A57751952876%7D'
'')
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
end
object tIceLock1: tIceLock
IceString1 = 'IceLock v1.0'
IceString2 = 'IceLock !!!!!'
IceSeed1 = 15714969
IceSeed2 = 13277695
ProgramKey1 = -776272270
ProgramKey2 = 434910358
KeyFile = 'REGISTER.KEY'
TrialDays = 60
DemoLicense = False
Left = 112
Top = 172
end
object DiskInfo2000X1: TDiskInfo2000X
Left = 84
Top = 172
end
object StringCrypt2000X1: TStringCrypt2000X
Left = 340
Top = 40
end
end
标 题:关于它的破解很容易，用w32dsam找“已经注册”，往上看，有JNE判断， (157字)
发信人:松鼠鱼
时 间:2001-3-3 15:07:59
详细信息:
暴力破解改之既可。其上有一CALL，进入，有CMP比较语句，D E?X(忘了）可看到正确注册码！

标 题:木马克星CRACKCODE注册机脚本！ (418字)
发信人:洋白菜
时 间:2001-3-3 18:53:54
详细信息:

我从新看了一下找到了3个密码，其中一个输入后不会提示格式化硬盘，所以我想这个恐怕就是真正的了！现在用Rufeng写的CRACKCODE作了一个注册机，大家看看找到的注册码是不是正确的！这个是针对最新版本的！

[Options]
CommandLine=iparmor.exe
Mode=2
First_Break_Address=496468
First_Break_Address_Code=8B
First_Break_Address_Code_Lenth=3
Second_Break_Address=4041A3
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDI

标 题:我认为最狗屎的软件《木马克星3.13》 (29千字)
发信人:1212
时 间:2001-3-4 15:04:05
详细信息:

我认为最狗屎的软件《木马克星3.13》

作者:华仔

这个软件很臭屁！！！！！！！！！！！！！！
加密还很一般！！！！！！！！！！！！！！！

如果破解不完全将导致格式化所有物理驱动器。但无“主板cmos被擦写”
等等象作者说的那样。

又因该软件是利用机器代码（不同的机器只有唯一的一个）来计算注册码
（其实获取正确的注册码也很容易，只是考虑到作者今后如果一旦使用其
它验证方法，后果不可想向）因此使用暴力破解方法。我已去除其格式化
驱动器代码，经本人多次试用无任何不良效果，请放心使用。

以下是引用原软件作者百分之百的狗屎介绍:

'iparmor '
'作者：罗建斌'
'保留所有版权！'
''
'本软件鼓励在互连网中免费传播'
'但如果以光盘或者软盘为媒体'
'必须得到作者同意。'
''
'破解本软件而引起的：'
'硬盘低级格式化，'
'主板cmos被擦写'
'经济损失'
'以及法律责任'
'均由破解者负责。'
''
' 木马克星一共采用64处加 密暗记，'
'就算你破解了注册页面，'
'在软件内部仍然藏有加密标示'
'（包括：注 册表加密，文件日期加密，'
'文件公司加密，cmos加密等，'
'一共12种加密措施 ），'
'我有理由相信任何破解者，'
'都不可能完全破解所有加密标示（'
'因为他们 发现不了）'
'如果被木马克星发现是破解版本，'
'将会丧失查杀功能，'
'并且在 system目录下生成200'
'个内容为保护正版软件，'
'打击非法破解活动的随机dll 文件。'
'由此因发的用户资源耗尽，'
'由用户负责！'
'所有注册用户终身免费享受 升级，'
'所有木马克星均可以注册！ '
''
'关于作者：'
'美男子中的佼佼者，'
'对计算机最有天赋的人之一'
''
'技术支持:'
'iparmor@luosoft.com'

现贴上该代码：

这是判断是否为正式注册码的代码如果不正确，将执行format操作：

:004962B8 55 push ebp
:004962B9 8BEC mov ebp, esp
:004962BB 33C9 xor ecx, ecx
:004962BD 51 push ecx
:004962BE 51 push ecx
:004962BF 51 push ecx
:004962C0 51 push ecx
:004962C1 51 push ecx
:004962C2 51 push ecx
:004962C3 51 push ecx
:004962C4 53 push ebx
:004962C5 8BD8 mov ebx, eax
:004962C7 33C0 xor eax, eax
:004962C9 55 push ebp
:004962CA 684D654900 push 0049654D
:004962CF 64FF30 push dword ptr fs:[eax]
:004962D2 648920 mov dword ptr fs:[eax], esp
:004962D5 8D55FC lea edx, dword ptr [ebp-04]
:004962D8 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004962DE E8F96EF9FF call 0042D1DC
:004962E3 8B45FC mov eax, dword ptr [ebp-04]
:004962E6 50 push eax
:004962E7 8D55F8 lea edx, dword ptr [ebp-08]
:004962EA 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004962F0 8B8024020000 mov eax, dword ptr [eax+00000224]
:004962F6 2DD1080000 sub eax, 000008D1
:004962FB E80829F7FF call 00408C08
:00496300 8B55F8 mov edx, dword ptr [ebp-08]
:00496303 58 pop eax
:00496304 E893DEF6FF call 0040419C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496290(C)
|
:00496309 757E jne 00496389============》在这里必须跳过

* Possible StringData Ref from Code Obj ->"注册成功!"
|
:0049630B B864654900 mov eax, 00496564
:00496310 E8B397FBFF call 0044FAC8
:00496315 E8CAFEFFFF call 004961E4
:0049631A A180EE4B00 mov eax, dword ptr [004BEE80]
:0049631F 8B80D4020000 mov eax, dword ptr [eax+000002D4]

* Possible StringData Ref from Code Obj ->"已经注册!"
|
:00496325 BA78654900 mov edx, 00496578
:0049632A E8DD6EF9FF call 0042D20C
:0049632F 33D2 xor edx, edx
:00496331 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:00496337 E8B86DF9FF call 0042D0F4
:0049633C 33D2 xor edx, edx
:0049633E 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:00496344 E8AB6DF9FF call 0042D0F4
:00496349 33D2 xor edx, edx
:0049634B 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:00496351 E89E6DF9FF call 0042D0F4

* Possible StringData Ref from Code Obj ->"已注册"
|
:00496356 BA8C654900 mov edx, 0049658C
:0049635B 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:00496361 E8A66EF9FF call 0042D20C
:00496366 A14CDF4B00 mov eax, dword ptr [004BDF4C]
:0049636B 8B00 mov eax, dword ptr [eax]
:0049636D 8B805C030000 mov eax, dword ptr [eax+0000035C]

* Possible StringData Ref from Code Obj ->" "
|
:00496373 BA9C654900 mov edx, 0049659C
:00496378 E88F6EF9FF call 0042D20C
:0049637D B263 mov dl, 63
:0049637F A188EE4B00 mov eax, dword ptr [004BEE88]
:00496384 E83327FFFF call 00488ABC============》在这里调用格式化代码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496309(C)
|
:00496389 8D55F4 lea edx, dword ptr [ebp-0C]
:0049638C 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:00496392 E8456EF9FF call 0042D1DC
:00496397 8B45F4 mov eax, dword ptr [ebp-0C]
:0049639A 50 push eax
:0049639B 8D55F0 lea edx, dword ptr [ebp-10]
:0049639E 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:004963A4 8B8024020000 mov eax, dword ptr [eax+00000224]
:004963AA 2DE9040000 sub eax, 000004E9
:004963AF E85428F7FF call 00408C08
:004963B4 8B55F0 mov edx, dword ptr [ebp-10]
:004963B7 58 pop eax
:004963B8 E8DFDDF6FF call 0040419C
:004963BD 757E jne 0049643D============》在这里必须跳过

* Possible StringData Ref from Code Obj ->"注册成功!"
|
:004963BF B864654900 mov eax, 00496564
:004963C4 E8FF96FBFF call 0044FAC8
:004963C9 E816FEFFFF call 004961E4
:004963CE A180EE4B00 mov eax, dword ptr [004BEE80]
:004963D3 8B80D4020000 mov eax, dword ptr [eax+000002D4]

* Possible StringData Ref from Code Obj ->"已经注册!"
|
:004963D9 BA78654900 mov edx, 00496578
:004963DE E8296EF9FF call 0042D20C
:004963E3 33D2 xor edx, edx
:004963E5 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:004963EB E8046DF9FF call 0042D0F4
:004963F0 33D2 xor edx, edx
:004963F2 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004963F8 E8F76CF9FF call 0042D0F4
:004963FD 33D2 xor edx, edx
:004963FF 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:00496405 E8EA6CF9FF call 0042D0F4

* Possible StringData Ref from Code Obj ->"已注册"
|
:0049640A BA8C654900 mov edx, 0049658C
:0049640F 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:00496415 E8F26DF9FF call 0042D20C
:0049641A A14CDF4B00 mov eax, dword ptr [004BDF4C]
:0049641F 8B00 mov eax, dword ptr [eax]
:00496421 8B805C030000 mov eax, dword ptr [eax+0000035C]

* Possible StringData Ref from Code Obj ->" "
|
:00496427 BA9C654900 mov edx, 0049659C
:0049642C E8DB6DF9FF call 0042D20C
:00496431 B263 mov dl, 63
:00496433 A188EE4B00 mov eax, dword ptr [004BEE88]
:00496438 E87F26FFFF call 00488ABC============》在这里调用格式化代码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004963BD(C)
|
:0049643D 8D55EC lea edx, dword ptr [ebp-14]
:00496440 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:00496446 E8916DF9FF call 0042D1DC
:0049644B 8B45EC mov eax, dword ptr [ebp-14]
:0049644E 50 push eax
:0049644F 8D55E8 lea edx, dword ptr [ebp-18]
:00496452 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:00496458 8B8024020000 mov eax, dword ptr [eax+00000224]
:0049645E 056D010000 add eax, 0000016D
:00496463 E8A027F7FF call 00408C08
:00496468 8B55E8 mov edx, dword ptr [ebp-18]
:0049646B 58 pop eax
:0049646C E82BDDF6FF call 0040419C
:00496471 7574 jne 004964E7

* Possible StringData Ref from Code Obj ->"注册成功!"
|
:00496473 B864654900 mov eax, 00496564
:00496478 E84B96FBFF call 0044FAC8
:0049647D E862FDFFFF call 004961E4
:00496482 A180EE4B00 mov eax, dword ptr [004BEE80]
:00496487 8B80D4020000 mov eax, dword ptr [eax+000002D4]

* Possible StringData Ref from Code Obj ->"已经注册!"
|
:0049648D BA78654900 mov edx, 00496578
:00496492 E8756DF9FF call 0042D20C
:00496497 33D2 xor edx, edx
:00496499 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:0049649F E8506CF9FF call 0042D0F4
:004964A4 33D2 xor edx, edx
:004964A6 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004964AC E8436CF9FF call 0042D0F4
:004964B1 33D2 xor edx, edx
:004964B3 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:004964B9 E8366CF9FF call 0042D0F4

* Possible StringData Ref from Code Obj ->"已注册"
|
:004964BE BA8C654900 mov edx, 0049658C
:004964C3 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:004964C9 E83E6DF9FF call 0042D20C
:004964CE A14CDF4B00 mov eax, dword ptr [004BDF4C]
:004964D3 8B00 mov eax, dword ptr [eax]
:004964D5 8B805C030000 mov eax, dword ptr [eax+0000035C]

* Possible StringData Ref from Code Obj ->" "
|
:004964DB BA9C654900 mov edx, 0049659C
:004964E0 E8276DF9FF call 0042D20C
:004964E5 EB20 jmp 00496507

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496471(C)
|
:004964E7 8D55E4 lea edx, dword ptr [ebp-1C]
:004964EA 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:004964F0 E8E76CF9FF call 0042D1DC
:004964F5 837DE400 cmp dword ptr [ebp-1C], 00000000
:004964F9 740C je 00496507
:004964FB A14CDF4B00 mov eax, dword ptr [004BDF4C]
:00496500 8B00 mov eax, dword ptr [eax]
:00496502 E8951EFBFF call 0044839C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004964E5(U), :004964F9(C)
|
:00496507 33C0 xor eax, eax
:00496509 5A pop edx
:0049650A 59 pop ecx
:0049650B 59 pop ecx
:0049650C 648910 mov dword ptr fs:[eax], edx
:0049650F 6854654900 push 00496554

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496552(U)
|
:00496514 8D45E4 lea eax, dword ptr [ebp-1C]
:00496517 E8F0D8F6FF call 00403E0C
:0049651C 8D45E8 lea eax, dword ptr [ebp-18]
:0049651F E8E8D8F6FF call 00403E0C
:00496524 8D45EC lea eax, dword ptr [ebp-14]
:00496527 E8E0D8F6FF call 00403E0C
:0049652C 8D45F0 lea eax, dword ptr [ebp-10]
:0049652F E8D8D8F6FF call 00403E0C
:00496534 8D45F4 lea eax, dword ptr [ebp-0C]
:00496537 E8D0D8F6FF call 00403E0C
:0049653C 8D45F8 lea eax, dword ptr [ebp-08]
:0049653F E8C8D8F6FF call 00403E0C
:00496544 8D45FC lea eax, dword ptr [ebp-04]
:00496547 E8C0D8F6FF call 00403E0C
:0049654C C3 ret

这是判断是否为已注册的代码:

:00495DD5 53 push ebx
:00495DD6 56 push esi
:00495DD7 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00495D72(C)
|
:00495DD9 898DE0FEFFFF mov dword ptr [ebp+FFFFFEE0], ecx
:00495DDF 898DE4FEFFFF mov dword ptr [ebp+FFFFFEE4], ecx
:00495DE5 898DE8FEFFFF mov dword ptr [ebp+FFFFFEE8], ecx
:00495DEB 898DECFEFFFF mov dword ptr [ebp+FFFFFEEC], ecx
:00495DF1 898DF0FEFFFF mov dword ptr [ebp+FFFFFEF0], ecx
:00495DF7 894DF4 mov dword ptr [ebp-0C], ecx
:00495DFA 894DFC mov dword ptr [ebp-04], ecx
:00495DFD 894DF8 mov dword ptr [ebp-08], ecx
:00495E00 8BD8 mov ebx, eax
:00495E02 33C0 xor eax, eax
:00495E04 55 push ebp
:00495E05 688B604900 push 0049608B
:00495E0A 64FF30 push dword ptr fs:[eax]
:00495E0D 648920 mov dword ptr fs:[eax], esp
:00495E10 C60584EE4B0000 mov byte ptr [004BEE84], 00
:00495E17 8B83EC020000 mov eax, dword ptr [ebx+000002EC]
:00495E1D 8B4844 mov ecx, dword ptr [eax+44]
:00495E20 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"序列号:"
|
:00495E23 BAA0604900 mov edx, 004960A0
:00495E28 E8ABE2F6FF call 004040D8
:00495E2D 8B55F4 mov edx, dword ptr [ebp-0C]
:00495E30 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:00495E36 E8D173F9FF call 0042D20C
:00495E3B 8D8DF0FEFFFF lea ecx, dword ptr [ebp+FFFFFEF0]
:00495E41 A180EE4B00 mov eax, dword ptr [004BEE80]
:00495E46 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00495E4C 8B5044 mov edx, dword ptr [eax+44]
:00495E4F A180EE4B00 mov eax, dword ptr [004BEE80]
:00495E54 8B80F0020000 mov eax, dword ptr [eax+000002F0]
:00495E5A E8712BFFFF call 004889D0
:00495E5F 8B95F0FEFFFF mov edx, dword ptr [ebp+FFFFFEF0]
:00495E65 8D85F4FEFFFF lea eax, dword ptr [ebp+FFFFFEF4]
:00495E6B B9FF000000 mov ecx, 000000FF
:00495E70 E8F3E1F6FF call 00404068
:00495E75 8D95F4FEFFFF lea edx, dword ptr [ebp+FFFFFEF4]
:00495E7B A180EE4B00 mov eax, dword ptr [004BEE80]
:00495E80 8B80D0020000 mov eax, dword ptr [eax+000002D0]
:00495E86 E8B918FFFF call 00487744
:00495E8B B201 mov dl, 01
:00495E8D A1B00C4500 mov eax, dword ptr [00450CB0]
:00495E92 E885AFFBFF call 00450E1C
:00495E97 8BF0 mov esi, eax
:00495E99 BA03000080 mov edx, 80000003
:00495E9E 8BC6 mov eax, esi
:00495EA0 E853B0FBFF call 00450EF8
:00495EA5 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->".DEFAULT\Software\AngelSoft\iparmor"
|
:00495EA7 BAB0604900 mov edx, 004960B0
:00495EAC 8BC6 mov eax, esi
:00495EAE E889B1FBFF call 0045103C
:00495EB3 8D4DFC lea ecx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"pass"
|
:00495EB6 BADC604900 mov edx, 004960DC
:00495EBB 8BC6 mov eax, esi
:00495EBD E892B4FBFF call 00451354
:00495EC2 8D95ECFEFFFF lea edx, dword ptr [ebp+FFFFFEEC]
:00495EC8 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:00495ECE 8B8024020000 mov eax, dword ptr [eax+00000224]
:00495ED4 056D010000 add eax, 0000016D
:00495ED9 E82A2DF7FF call 00408C08
:00495EDE 8B95ECFEFFFF mov edx, dword ptr [ebp+FFFFFEEC]
:00495EE4 8B45FC mov eax, dword ptr [ebp-04]
:00495EE7 E8B0E2F6FF call 0040419C
:00495EEC 757F jne 00495F6D============》在这里不能跳
:00495EEE C60584EE4B0001 mov byte ptr [004BEE84], 01
:00495EF5 33D2 xor edx, edx
:00495EF7 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:00495EFD E8F271F9FF call 0042D0F4
:00495F02 33D2 xor edx, edx
:00495F04 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:00495F0A E8E571F9FF call 0042D0F4
:00495F0F 33D2 xor edx, edx
:00495F11 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:00495F17 E8D871F9FF call 0042D0F4

* Possible StringData Ref from Code Obj ->"已经注册"
|
:00495F1C BAEC604900 mov edx, 004960EC
:00495F21 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:00495F27 E8E072F9FF call 0042D20C
:00495F2C 8D95E8FEFFFF lea edx, dword ptr [ebp+FFFFFEE8]
:00495F32 8B83D0020000 mov eax, dword ptr [ebx+000002D0]
:00495F38 8B8024020000 mov eax, dword ptr [eax+00000224]
:00495F3E 056D010000 add eax, 0000016D
:00495F43 E8C02CF7FF call 00408C08
:00495F48 8B95E8FEFFFF mov edx, dword ptr [ebp+FFFFFEE8]
:00495F4E 8B45FC mov eax, dword ptr [ebp-04]
:00495F51 E846E2F6FF call 0040419C
:00495F56 0F8404010000 je 00496060
:00495F5C B263 mov dl, 63
:00495F5E A188EE4B00 mov eax, dword ptr [004BEE88]
:00495F63 E8542BFFFF call 00488ABC
:00495F68 E9F3000000 jmp 00496060

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00495EEC(C)
|
:00495F6D 803D84EE4B0001 cmp byte ptr [004BEE84], 01
:00495F74 750C jne 00495F82
:00495F76 B263 mov dl, 63
:00495F78 A188EE4B00 mov eax, dword ptr [004BEE88]
:00495F7D E83A2BFFFF call 00488ABC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00495F74(C)
|
:00495F82 8D4DF8 lea ecx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"deta"
|
:00495F85 BA00614900 mov edx, 00496100
:00495F8A 8BC6 mov eax, esi
:00495F8C E8C3B3FBFF call 00451354
:00495F91 837DF800 cmp dword ptr [ebp-08], 00000000
:00495F95 7521 jne 00495FB8
:00495F97 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"100"
|
:00495F9A BA10614900 mov edx, 00496110
:00495F9F E800DFF6FF call 00403EA4

* Possible StringData Ref from Code Obj ->"非常感谢你使用iparmor,iparmor保证为你构造安全?
->"耐缁肪?"
|
:00495FA4 B81C614900 mov eax, 0049611C
:00495FA9 E81A9BFBFF call 0044FAC8

* Possible StringData Ref from Code Obj ->"由于非法破解本软件而造成的任何后果，由破解者负"
->"责"
|
:00495FAE B860614900 mov eax, 00496160
:00495FB3 E8109BFBFF call 0044FAC8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00495F95(C)
|
:00495FB8 8B45F8 mov eax, dword ptr [ebp-08]
:00495FBB E8282DF7FF call 00408CE8
:00495FC0 85C0 test eax, eax
:00495FC2 7E6F jle 00496033
:00495FC4 8B45F8 mov eax, dword ptr [ebp-08]
:00495FC7 E81C2DF7FF call 00408CE8
:00495FCC 83F865 cmp eax, 00000065
:00495FCF 7D62 jge 00496033
:00495FD1 8B45F8 mov eax, dword ptr [ebp-08]
:00495FD4 E80F2DF7FF call 00408CE8
:00495FD9 48 dec eax
:00495FDA 8D95E4FEFFFF lea edx, dword ptr [ebp+FFFFFEE4]
:00495FE0 E8232CF7FF call 00408C08
:00495FE5 8B8DE4FEFFFF mov ecx, dword ptr [ebp+FFFFFEE4]

* Possible StringData Ref from Code Obj ->"deta"
|
:00495FEB BA00614900 mov edx, 00496100
:00495FF0 8BC6 mov eax, esi
:00495FF2 E831B3FBFF call 00451328
:00495FF7 C60584EE4B0001 mov byte ptr [004BEE84], 01

* Possible StringData Ref from Code Obj ->"你还可以使用 "
|
:00495FFE 689C614900 push 0049619C
:00496003 FF75F8 push [ebp-08]

* Possible StringData Ref from Code Obj ->" 次."
|
:00496006 68B4614900 push 004961B4
:0049600B 8D85E0FEFFFF lea eax, dword ptr [ebp+FFFFFEE0]
:00496011 BA03000000 mov edx, 00000003
:00496016 E831E1F6FF call 0040414C
:0049601B 8B95E0FEFFFF mov edx, dword ptr [ebp+FFFFFEE0]
:00496021 A180EE4B00 mov eax, dword ptr [004BEE80]
:00496026 8B80D4020000 mov eax, dword ptr [eax+000002D4]
:0049602C E8DB71F9FF call 0042D20C
:00496031 EB26 jmp 00496059

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495FC2(C), :00495FCF(C)
|

* Possible StringData Ref from Code Obj ->"对不起，免费时间已到，请注册。"
|
:00496033 B8C4614900 mov eax, 004961C4
:00496038 E88B9AFBFF call 0044FAC8
:0049603D C60584EE4B0000 mov byte ptr [004BEE84], 00
:00496044 803D84EE4B0001 cmp byte ptr [004BEE84], 01
:0049604B 750C jne 00496059
:0049604D B263 mov dl, 63
:0049604F A188EE4B00 mov eax, dword ptr [004BEE88]
:00496054 E8632AFFFF call 00488ABC

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00496031(U), :0049604B(C)
|
:00496059 8BC6 mov eax, esi
:0049605B E844D0F6FF call 004030A4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00495F56(C), :00495F68(U)
|
:00496060 33C0 xor eax, eax
:00496062 5A pop edx
:00496063 59 pop ecx
:00496064 59 pop ecx
:00496065 648910 mov dword ptr fs:[eax], edx
:00496068 6892604900 push 00496092

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496090(U)
|
:0049606D 8D85E0FEFFFF lea eax, dword ptr [ebp+FFFFFEE0]
:00496073 BA05000000 mov edx, 00000005
:00496078 E8B3DDF6FF call 00403E30
:0049607D 8D45F4 lea eax, dword ptr [ebp-0C]
:00496080 BA03000000 mov edx, 00000003
:00496085 E8A6DDF6FF call 00403E30
:0049608A C3 ret

下面是格式化驱动器代码：

* Referenced by a CALL at Address:
|:00488BB7
|

* Reference To: shell32.SHFormatDrive, Ord:0000h
|
:00488AB4 FF25D8094C00 Jmp dword ptr [004C09D8]
:00488ABA 8BC0 mov eax, eax

* Referenced by a CALL at Addresses:
|:00495F63 , :00495F7D , :00496054 , :00496384 , :00496438
|
:00488ABC 55 push ebp=======》这里我强行让它返回C3
:00488ABD 8BEC mov ebp, esp
:00488ABF 6A00 push 00000000
:00488AC1 6A00 push 00000000
:00488AC3 6A00 push 00000000
:00488AC5 53 push ebx
:00488AC6 8855FF mov byte ptr [ebp-01], dl
:00488AC9 33D2 xor edx, edx
:00488ACB 55 push ebp
:00488ACC 68D78B4800 push 00488BD7
:00488AD1 64FF32 push dword ptr fs:[edx]
:00488AD4 648922 mov dword ptr fs:[edx], esp
:00488AD7 8A55FF mov dl, byte ptr [ebp-01]
:00488ADA E8BD010000 call 00488C9C
:00488ADF 8BD8 mov ebx, eax
:00488AE1 80FB02 cmp bl, 02
:00488AE4 0F84B1000000 je 00488B9B
:00488AEA 80FB03 cmp bl, 03
:00488AED 0F84A8000000 je 00488B9B
:00488AF3 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"Cannot format a "
|
:00488AF6 BAEC8B4800 mov edx, 00488BEC
:00488AFB E8A4B3F7FF call 00403EA4
:00488B00 33C0 xor eax, eax
:00488B02 8AC3 mov al, bl
:00488B04 83F806 cmp eax, 00000006
:00488B07 776C ja 00488B75
:00488B09 FF2485108B4800 jmp dword ptr [4*eax+00488B10]

:00488B10 2C8B4800 DWORD 00488B2C
:00488B14 3B8B4800 DWORD 00488B3B
:00488B18 758B4800 DWORD 00488B75
:00488B1C 758B4800 DWORD 00488B75
:00488B20 4A8B4800 DWORD 00488B4A
:00488B24 598B4800 DWORD 00488B59
:00488B28 688B4800 DWORD 00488B68

:00488B2C 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"Cannot determine drive type"
|
:00488B2F BA088C4800 mov edx, 00488C08
:00488B34 E86BB3F7FF call 00403EA4
:00488B39 EB3A jmp 00488B75
:00488B3B 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"Specified drive does not exist"
|
:00488B3E BA2C8C4800 mov edx, 00488C2C
:00488B43 E85CB3F7FF call 00403EA4
:00488B48 EB2B jmp 00488B75
:00488B4A 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"Network Drive"
|
:00488B4D BA548C4800 mov edx, 00488C54
:00488B52 E83DB5F7FF call 00404094
:00488B57 EB1C jmp 00488B75
:00488B59 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"CD-ROM Drive"
|
:00488B5C BA6C8C4800 mov edx, 00488C6C
:00488B61 E82EB5F7FF call 00404094
:00488B66 EB0D jmp 00488B75
:00488B68 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"RAM Drive"
|
:00488B6B BA848C4800 mov edx, 00488C84
:00488B70 E81FB5F7FF call 00404094

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00488B07(C), :00488B39(U), :00488B48(U), :00488B57(U), :00488B66(U)
|
:00488B75 8D45F4 lea eax, dword ptr [ebp-0C]
:00488B78 B9988C4800 mov ecx, 00488C98
:00488B7D 8B55F8 mov edx, dword ptr [ebp-08]
:00488B80 E853B5F7FF call 004040D8
:00488B85 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00488B88 B201 mov dl, 01
:00488B8A A12C7C4000 mov eax, dword ptr [00407C2C]
:00488B8F E8EC32F8FF call 0040BE80
:00488B94 E8A3ACF7FF call 0040383C
:00488B99 EB21 jmp 00488BBC

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00488AE4(C), :00488AED(C)
|
:00488B9B 33C0 xor eax, eax
:00488B9D 8A45FF mov al, byte ptr [ebp-01]
:00488BA0 6683E841 sub ax, 0041
:00488BA4 6A00 push 00000000

* Possible Reference to String Resource ID=65535: "Invalid numeric input"
|
:00488BA6 68FFFF0000 push 0000FFFF
:00488BAB 50 push eax
:00488BAC A114DE4B00 mov eax, dword ptr [004BDE14]
:00488BB1 8B00 mov eax, dword ptr [eax]
:00488BB3 8B4024 mov eax, dword ptr [eax+24]
:00488BB6 50 push eax

* Reference To: shell32.SHFormatDrive, Ord:0000h
|
:00488BB7 E8F8FEFFFF Call 00488AB4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488B99(U)
|
:00488BBC 33C0 xor eax, eax
:00488BBE 5A pop edx
:00488BBF 59 pop ecx
:00488BC0 59 pop ecx
:00488BC1 648910 mov dword ptr fs:[eax], edx
:00488BC4 68DE8B4800 push 00488BDE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488BDC(U)
|
:00488BC9 8D45F4 lea eax, dword ptr [ebp-0C]
:00488BCC BA02000000 mov edx, 00000002
:00488BD1 E85AB2F7FF call 00403E30
:00488BD6 C3 ret

标 题:原来是调用这个shell32.SHFormatDrive来格式化硬盘，这是低级格式化吗？放屁！ (112字)
发信人:1212
时 间:2001-3-4 15:30:48
详细信息:

懂不懂什么叫低级格式化！
在Win2K下，只有具有管理员权限的用户才能格式化硬盘，普通用户调用这个SHELL API肯定失败！


南极星2.23

 标 题:注册你的南极星2.23 (1千字)
发信人:电神魔鬼
时 间:2000-9-18 23:54:23
详细信息:
查找过程很简单：
首先进入南极星，点register,下bpm lockmytask，点ok,被拦到，按f12直到回到njcom的领空，往回倒到cmp byte ptr [06f4],00 ，[06f4]为1时，表示已注册。关掉南极星，在s-ice中下bp hmemcpy，启动njcom,被拦到，按f12直到njcom领空，下bpm ds:06f4,按f5被拦到：

cs:3bfc 32c0 ->b001 xor al,al ->mov al,01
cs:3bfe a2f506 mov [06f5],al
cs:3c01 a2f406 mov [06f4],al
好相应找到32c0改为b001,但并不这么简单。用ws32dasm反汇编，把对应的地址改成如下的就搞定了:)

0001.428 ff7408 push word ptr [si+08]
0001.42b e95701 jmp 0585
.
.
.
0001.585 1e push ds
0001.585 84c9 test cl,cl
0001.588 751a jne 05a4
0001.58a 8e5eb8 mov ds,[bp-48]
0001.58d 3ec706fc3bb001 mov word ptr ds:[3cfc],01b0 在这注册
0001.594 3ec70607479090 mov word ptr ds:[4707],9090 在这跳出死循环
0001.59b 3ec7060c47eb1e mov word ptr ds:[470c],1eeb 在这跳出死循环
0001.5a2 90 nop
0001.5a3 90 nop
0001.5a4 1f pop ds
0001.5a5 ff76b8 push word ptr [bp-48]
0001.5a8 e983fe jmp 042e

用winhex整理一下

查找：7408ff76b86a01
改成：7408e957016a01

查找：c8000000c9ca020000436f707972696768742028632920313939332054616c204e65766f2e00
改成：1e84c9751a8e5eb83ec706fc3bb0013ec706074790903ec7060c47eb1e90901fff76b8e983fe

接着在C:\WINDOWS\NJCOM.INI加上以下语句

[NJCOM Registration]
User_Name=你的名字
Company_Name=你的公司
Serial_Number=随便

完活
应该没什么问题了，有问题的话告诉我

cracked by 电神魔鬼
oicq:1789655
thanks for your supports

标 题:my god 还是有一个讨厌的bug,商业软件是不好整:( (空)
发信人:电神魔鬼
时 间:2000-9-19 2:38:05
详细信息:

标 题:问题基本搞定，可以删掉njcom了。iceworld写出来分享呀:) (267字)
发信人:电神魔鬼
时 间:2000-9-19 22:33:45
详细信息:

做完后，可正常使用，但不要向后调系统时钟，会过期的。解决方法是：打开c:\windows\njcom.ini
把对应的设置改成如下的，daysintalled=369时，njcom就会无条件过期的，改完之后别忘了把njcom.ini加只读属性。
[Usage]
DaysInstalled=0
LastUsage=11099
可以无限使用了hahahaha......


欧阳邮址搜索星3.0

标 题:欧阳邮址搜索星3.0破解手记（半分钟，w32dasm） (762字)
发信人:duba.126.com
时 间:2001-2-19 11:42:03
详细信息:
欧阳邮址搜索星3.0破解手记（半分钟，w32dasm）
欧阳邮址搜索星 版本3.0 大小416k
注册码4080389140803891
下载ftp://ftp.eware.com.cn/pub/network/email/oymailscan30.exe
它能从指定的邮件服务器，通过常见用户名词典和穷举的方法校验邮件地址是否存在，
并将搜索到的邮件地址保存为一个文本文件列表，便于采用群发软件发送信息。软件采用
多线程技术，速度极快，可以中断当前搜索，并保存搜索进程，以便下次继续搜索。
此软件加密太差，破解只需半分钟，国内加密最差软件，注册码唯一固定。
没加壳。
w32dasm金版载入--》串式参考--》“4080389140803891”可疑--》搞定

附：
欧阳邮址搜索星 版本2.0 大小561k
注册码4080310240803102
下载ftp://ftp.bj.software.chinese.com/software/soft_mail/oymailsearch20.exe

作者：风飘雪
主页http://duba.126.com
e-mail gd1@yeah.net


漂叶网吧管理系统4.0

标 题:《漂叶网吧管理系统4.0》破解心得： (9千字)
发信人:小　明
时 间:2001-1-14 23:35:28
详细信息:
软件名称：漂叶网吧管理系统
版　　本：4.0
下载地址：http://go4.163.com/~piaoyes/
破解工具：softice for win95
破解过程：（第一次写心得，乱遭遭的，各位别笑）
运行该软件，注册，随便输入网吧名称：abcd及注册码：123456，按^D激活softice，下中断bpx hmemcpy，按F5返回，点注册，立即被中断，再bc *，按12次F12和几次F10后，来到这里：
016F:00517733 MOV EAX,[EBP+FFFFFDF8]
016F:00517739 LEA EDX,[EBP+FFFFFDFC]
016F:0051773F CALL 004096D4
016F:00517744 MOV EAX,[EBP+FFFFFDFC]
016F:0051774A MOV ECX,09
016F:0051774F MOV EDX,0A
016F:00517754 CALL 00404134
016F:00517759 LEA EAX,[EBP-28]
016F:0051775C PUSH EAX
016F:0051775D LEA EDX,[EBP+FFFFFDF0]
016F:00517763 MOV EAX,[EBP-04]
016F:00517766 MOV EAX,[EAX+0314]
016F:0051776C CALL 00433E30
016F:00517771 MOV EAX,[EBP+FFFFFDF0]
016F:00517777 LEA EDX,[EBP+FFFFFDF4]
016F:0051777D CALL 004096D4
016F:00517782 MOV EAX,[EBP+FFFFFDF4]
016F:00517788 MOV ECX,08
016F:0051778D MOV EDX,01
016F:00517792 CALL 00404134
016F:00517797 LEA EDX,[EBP-08]
016F:0051779A MOV EAX,[EBP-34]
016F:0051779D CALL 00402C88
016F:005177A2 CMP DWORD [EBP-08],BYTE +00　　；检查注册码的格式是否合格
016F:005177A6 JZ 005177C2　　　　　　　　　；是则跳过去

016F:005177A8 PUSH BYTE +00
016F:005177AA MOV CX,[00517E68]
016F:005177B1 XOR EDX,EDX
016F:005177B3 MOV EAX,00517E74
016F:005177B8 CALL 00457674　　　　　　　　　；显示错误信息
016F:005177BD JMP 00517D86
结果由于输入的注册码格式不合而跳不过去，经分析它要求的格式是这样的：XXXXXXXX-XXXXXXXXX（其中的X为数字），于是重新输入注册码：12345678-987654321便可跳过这步，来到
016F:005177C2 MOV EAX,[EBP-34]
016F:005177C5 CALL 00409984
016F:005177CA MOV EBX,EAX
016F:005177CC MOV EAX,EBX
016F:005177CE MOV ECX,B5
016F:005177D3 CDQ
016F:005177D4 IDIV ECX
016F:005177D6 IMUL EAX,EAX,C4
016F:005177DC XOR EAX,025DAFF2
016F:005177E1 CDQ
016F:005177E2 XOR EAX,EDX
016F:005177E4 SUB EAX,EDX
016F:005177E6 ADD EAX,08392AF4
016F:005177EB MOV EBX,EAX
016F:005177ED LEA EAX,[EBP-0C]
016F:005177F0 PUSH EAX
016F:005177F1 LEA EDX,[EBP+FFFFFDEC]
016F:005177F7 MOV EAX,EBX
016F:005177F9 CALL 00409954
016F:005177FE MOV EAX,[EBP+FFFFFDEC]
016F:00517804 MOV ECX,08
016F:00517809 MOV EDX,01
016F:0051780E CALL 00404134
016F:00517813 LEA EAX,[EBP-10]
016F:00517816 MOV EDX,00517E94
016F:0051781B CALL 00403D44
016F:00517820 LEA EAX,[EBP-14]
016F:00517823 CALL 00403CAC
016F:00517828 MOV EBX,01
016F:0051782D LEA EAX,[EBP+FFFFFDE8]
016F:00517833 MOV EDX,[EBP-10]
016F:00517836 MOVZX EDX,BYTE [EDX+EBX-01]
016F:0051783B SUB EDX,BYTE +31
016F:0051783E MOV ECX,[EBP-0C]
016F:00517841 MOV DL,[ECX+EDX]
016F:00517844 CALL 00403E54
016F:00517849 MOV EDX,[EBP+FFFFFDE8]
016F:0051784F LEA EAX,[EBP-14]
016F:00517852 CALL 00403F34
016F:00517857 INC EBX
016F:00517858 CMP EBX,BYTE +09
016F:0051785B JNZ 0051782D
016F:0051785D MOV EAX,[EBP-14]
016F:00517860 MOV EDX,[EBP-28]
016F:00517863 CALL 0040403C　　　　　　　；在此处下中断，这个CALL是检查注册码的前8位与后9位之间的某种联系。
中断后，下命令d eax可见到“97641521”的字样，d edx则见到的是假注册码的前8位（即“12345678”），显然，如果注册码的前8位不是“97641521”的话，下一句就跳不过去而出错。
016F:00517868 JZ 00517884
016F:0051786A PUSH BYTE +00
016F:0051786C MOV CX,[00517E68]
016F:00517873 XOR EDX,EDX
016F:00517875 MOV EAX,00517EA8
016F:0051787A CALL 00457674　　　　　　　　；显示错误信息
016F:0051787F JMP 00517D86
重新输入注册码：97641521-987654321，则可来到
016F:00517884 LEA EDX,[EBP+FFFFFDE4]
016F:0051788A MOV EAX,[EBP-04]
016F:0051788D MOV EAX,[EAX+0304]
016F:00517893 CALL 00433E30
016F:00517898 MOV EAX,[EBP+FFFFFDE4]
016F:0051789E LEA EDX,[EBP-18]
016F:005178A1 CALL 004096D4
016F:005178A6 LEA EAX,[EBP-1C]
016F:005178A9 MOV EDX,00517EC8
016F:005178AE CALL 00403D44
016F:005178B3 MOV EAX,[00522408]
016F:005178B8 PUSH EAX
016F:005178B9 LEA EDX,[EBP+FFFFFDDC]
016F:005178BF MOV EAX,[EBP-04]
016F:005178C2 MOV EAX,[EAX+0314]
016F:005178C8 CALL 00433E30
016F:005178CD MOV EAX,[EBP+FFFFFDDC]
016F:005178D3 LEA EDX,[EBP+FFFFFDE0]
016F:005178D9 CALL 004096D4
016F:005178DE MOV EAX,[EBP+FFFFFDE0]
016F:005178E4 MOV ECX,03
016F:005178E9 MOV EDX,0A
016F:005178EE CALL 00404134
016F:005178F3 MOV ESI,01
016F:005178F8 MOV EDI,005556B5
016F:005178FD MOV EAX,[EBP-18]
016F:00517900 CALL 00403F2C
016F:00517905 MOV ECX,EAX
016F:00517907 TEST ECX,ECX
016F:00517909 JNG 00517932
016F:0051790B MOV EBX,01
016F:00517910 MOV EAX,[EBP-18]
016F:00517913 MOVZX EAX,BYTE [EAX+EBX-01]
016F:00517918 IMUL ESI
016F:0051791A ADD EAX,0F48
016F:0051791F CDQ
016F:00517920 XOR EAX,EDX
016F:00517922 SUB EAX,EDX
016F:00517924 MOV ESI,000F4240
016F:00517929 CDQ
016F:0051792A IDIV ESI
016F:0051792C MOV ESI,EDX
016F:0051792E INC EBX
016F:0051792F DEC ECX
016F:00517930 JNZ 00517910
016F:00517932 MOV EAX,[EBP-1C]
016F:00517935 CALL 00403F2C
016F:0051793A MOV ECX,EAX
016F:0051793C SUB ECX,BYTE +02
016F:0051793F JL 00517969
016F:00517941 INC ECX
016F:00517942 MOV EBX,02
016F:00517947 MOV EAX,[EBP-1C]
016F:0051794A MOVZX EAX,BYTE [EAX+EBX-01]
016F:0051794F IMUL ESI
016F:00517951 ADD EAX,0F83
016F:00517956 CDQ
016F:00517957 XOR EAX,EDX
016F:00517959 SUB EAX,EDX
016F:0051795B MOV ESI,000F4240
016F:00517960 CDQ
016F:00517961 IDIV ESI
016F:00517963 MOV ESI,EDX
016F:00517965 INC EBX
016F:00517966 DEC ECX
016F:00517967 JNZ 00517947
016F:00517969 MOV EAX,[EBP-18]
016F:0051796C CALL 00403F2C
016F:00517971 MOV EBX,EAX
016F:00517973 MOV EAX,[EBP-1C]
016F:00517976 CALL 00403F2C
016F:0051797B ADD EBX,EAX
016F:0051797D MOV EAX,EBX
016F:0051797F ADD EDI,ESI
016F:00517981 IMUL EDI
016F:00517983 CDQ
016F:00517984 XOR EAX,EDX
016F:00517986 SUB EAX,EDX
016F:00517988 ADD EAX,00A35B08
016F:0051798D MOV ESI,EAX
016F:0051798F LEA EAX,[EBP+FFFFFDD8]
016F:00517995 PUSH EAX
016F:00517996 LEA EDX,[EBP+FFFFFDD4]
016F:0051799C MOV EAX,ESI
016F:0051799E CALL 00409954
016F:005179A3 MOV EAX,[EBP+FFFFFDD4]
016F:005179A9 MOV ECX,06
016F:005179AE MOV EDX,01
016F:005179B3 CALL 00404134
016F:005179B8 MOV ECX,[EBP+FFFFFDD8]
016F:005179BE MOV EDX,[00522408]
016F:005179C4 MOV EDX,[EDX]
016F:005179C6 LEA EAX,[EBP-2C]
016F:005179C9 CALL 00403F78
016F:005179CE LEA EAX,[EBP+FFFFFDCC]
016F:005179D4 PUSH EAX
016F:005179D5 LEA EDX,[EBP+FFFFFDC8]
016F:005179DB MOV EAX,ESI
016F:005179DD CALL 00409954
016F:005179E2 MOV EAX,[EBP+FFFFFDC8]
016F:005179E8 MOV ECX,06
016F:005179ED MOV EDX,01
016F:005179F2 CALL 00404134
016F:005179F7 MOV ECX,[EBP+FFFFFDCC]
016F:005179FD MOV EDX,[00522408]
016F:00517A03 MOV EDX,[EDX]
016F:00517A05 LEA EAX,[EBP+FFFFFDD0]
016F:00517A0B CALL 00403F78
016F:00517A10 MOV EAX,[EBP+FFFFFDD0]
016F:00517A16 CALL 00409984
016F:00517A1B MOV ESI,EAX
016F:00517A1D MOV EAX,ESI
016F:00517A1F MOV ECX,B5
016F:00517A24 CDQ
016F:00517A25 IDIV ECX
016F:00517A27 IMUL EAX,EAX,C4
016F:00517A2D XOR EAX,025DAFF2
016F:00517A32 CDQ
016F:00517A33 XOR EAX,EDX
016F:00517A35 SUB EAX,EDX
016F:00517A37 ADD EAX,08392AF4
016F:00517A3C MOV ESI,EAX
016F:00517A3E LEA EAX,[EBP-18]
016F:00517A41 PUSH EAX
016F:00517A42 LEA EDX,[EBP+FFFFFDC4]
016F:00517A48 MOV EAX,ESI
016F:00517A4A CALL 00409954
016F:00517A4F MOV EAX,[EBP+FFFFFDC4]
016F:00517A55 MOV ECX,08
016F:00517A5A MOV EDX,01
016F:00517A5F CALL 00404134
016F:00517A64 LEA EAX,[EBP-1C]
016F:00517A67 MOV EDX,00517E94
016F:00517A6C CALL 00403D44
016F:00517A71 LEA EAX,[EBP-24]
016F:00517A74 CALL 00403CAC
016F:00517A79 MOV EBX,01
016F:00517A7E LEA EAX,[EBP+FFFFFDC0]
016F:00517A84 MOV EDX,[EBP-1C]
016F:00517A87 MOVZX EDX,BYTE [EDX+EBX-01]
016F:00517A8C SUB EDX,BYTE +31
016F:00517A8F MOV ECX,[EBP-18]
016F:00517A92 MOV DL,[ECX+EDX]
016F:00517A95 CALL 00403E54
016F:00517A9A MOV EDX,[EBP+FFFFFDC0]
016F:00517AA0 LEA EAX,[EBP-24]
016F:00517AA3 CALL 00403F34
016F:00517AA8 INC EBX
016F:00517AA9 CMP EBX,BYTE +09
016F:00517AAC JNZ 00517A7E
016F:00517AAE PUSH DWORD [EBP-24]
016F:00517AB1 PUSH DWORD 00517EDC
016F:00517AB6 PUSH DWORD [EBP-2C]
016F:00517AB9 LEA EAX,[EBP-20]
016F:00517ABC MOV EDX,03
016F:00517AC1 CALL 00403FEC
016F:00517AC6 LEA EAX,[EBP+FFFFFDBC]
016F:00517ACC PUSH EAX
016F:00517ACD LEA EDX,[EBP+FFFFFDB4]
016F:00517AD3 MOV EAX,[EBP-04]
016F:00517AD6 MOV EAX,[EAX+0314]
016F:00517ADC CALL 00433E30
016F:00517AE1 MOV EAX,[EBP+FFFFFDB4]
016F:00517AE7 LEA EDX,[EBP+FFFFFDB8]
016F:00517AED CALL 004096D4
016F:00517AF2 MOV EAX,[EBP+FFFFFDB8]
016F:00517AF8 MOV ECX,12
016F:00517AFD MOV EDX,01
016F:00517B02 CALL 00404134
016F:00517B07 MOV EDX,[EBP+FFFFFDBC]
016F:00517B0D MOV EAX,[EBP-20]
016F:00517B10 CALL 0040403C　　　　　　　　；在此处下中断，再d eax即可见到真的注册码，至此破解完毕。


平安全息万年历1.0.4

 标 题:平安全息万年历1.0.4算法分析
发信人:chn-boy
时 间:2000-12-2 9:27:39
详细信息:
平安全息万年历（1.0.4）的注册码算法

声明：供交流用，Money多多的朋友请向作者注册——支持国产软件嘛。（嘻嘻）

软件名称： 平安全息万年历 1.0.4
下载地址： http://www.newhua.com.cn
软件说明： 该软件可快捷地查阅公历、农历、干支（四柱）、生肖、五行、九星、黑黄道、
建、宿、星期、大小月、每日物候、24节气，公、农历节日，值日吉星、神
煞及方位、时辰，日、时宜、忌，人、事、时之间的“合、冲、刑、害”关系，
查询中国历代纪元，邮政编码，国内外长话区号，古代趣味解梦、杂占。有自
动闹钟功能，正点起闹、定时叫闹。可打印择吉日历。是天文、地理、历史、
建筑、《易》学、中医、理学、民俗、人文、古文明研究者的利器，也是广泛
农、工、商、学、医人士的最佳司时工具。
程序关联： msvbvm50.dll
目标： 研究注册码算法，并用C写出注册机
调试工具： softice4.05、IceDump6.016
作者： chn-boy
写作日期： 2000-12-2

该程序VB编写，调用MSVBVM50.DLL。首先运行该软件，在注册窗口中
填写好你的Virtual Code，如我填写的为：
Name： 66745923 &szlig; 由软件自动给出，不用填写
Code： 32194876
CTRL+D启用SoftICE4.05，下中断bpx hmemcpy，F5
回到windows，点注册，程序被SoftICE拦截。Bd * ，然后就是按F12数下，
当到MSVBVM50领空时，用命令：

s 30:0 l -1 56,57,8B,7C,24,10,8B,74,24,0C,8B,4C,24,14,33,C0,F3,66,A7

来查找VB50的核心字符串比较代码段（其实也可以下中断bpx __vbastrcomp）
在找到的地址处下中断：bpx 30:xxxxxxxx，按F5就可以让程序中断至该处，然
后就是繁琐的跟踪，一大堆来回跳转的指令（想想现在头都发麻），详细的代码
这里不再给出，告诉大家两个比较有用的中断点：
1）bpx 76380632 do “d ebx->8” &szlig; 该中断为最后注册码比较处，ebx->8
处存放的是Virtual Code通过计算得到
的字符串，edx->8处存放的是Name
通过计算得到的字符串，如果两个字符
串相等，则注册成功。

2）bpx 7628bcd do “d ebp->8” &szlig;该中断点其实就是bpx rtcmidbstr的外延
rtcmidbstr函数的功能就是用以从一个Table表中得到一个数据，入口参数为：
esp+4为Table表的地址偏移，esp+8为从距表多大偏移处得到数据，ecx中存放
的是获得数据的字节数。

整个软件的算法是这样的：根据软件的编号（如我的是66745923）通过一
种算法，从表1中查出对应的值构成一个字符串；然后再根据你输入的Code通
过另一种算法，从表2中查出对应的值构成另一个字符串。最终比较两个字符串
是否相等，若是，则注册成功（嘿嘿，我的我已经知道了：8*2*7*6*，其中*代
表任意阿拉伯数字）

下面我来说说它的算法：
1）第一个字符串：取出Name中奇数位四个数字6 7 5 2，逐一查表，合并得到
第一个字符串。80 7F C4 6B 66 59 6A 70
2）第二个字符串：将Name中偶数位和Code中奇数位取出，合并在一起，根据
我所填写的，Name 取出 6 4 9 3 （66745923），Code中取
出3 1 4 7 （32194876），然后合写成 63 41 94 37，注意中
间的间隔，每两位都是一个10进制数，分别*2-1，比如第
一个10进制数63，63*2-1=125=0x7D。那么前面的那个函
数rtcmidbstr的*(esp+8)=0x7D，也就是说从表的第125个字
节处取出ecx个字符，然后把四组合并起来，得到第二个字
符串。

由上述可知，对于Code中偶数位的数字可以任意填写。爽吧？！

算法明了，下面的关键是Table表的问题了。 ：）

表1 —— 用来算Name 的字符串的：（此表我已经预处理了，为了编程方便）
A2 9E —— 0 FA 89 —— 1 6A 70 —— 2
28 72 —— 3 1F 65 —— 4 66 59 —— 5
80 7F —— 6 C4 6B —— 7 C1 5F —— 8
2E 9B —— 9

表2，共198个字节

C4 6B FA 89 28 72 A2 9E-2E 9B 6A 70 C1 5F FA 89 .k..(r....jp._..
C4 6B C1 5F A2 9E 80 7F-C4 6B 80 7F 80 7F C4 6B .k._....k...k
FA 89 2E 9B 28 72 28 72-66 59 28 72 C1 5F 28 72 ....(r(rfY(r._(r
FA 89 1F 65 6A 70 2E 9B-C4 6B A2 9E 28 72 FA 89 ...ejp...k..(r..
A2 9E C1 5F 1F 65 6A 70-6A 70 80 7F C1 5F 2E 9B ..._.ejpjp.._..
28 72 C4 6B 66 59 C4 6B-80 7F 1F 65 28 72 C4 6B (r.kfY.k..e(r.k
6A 70 FA 89 A2 9E 66 59-2E 9B FA 89 C4 6B FA 89 jp....fY.....k..
80 7F C4 6B C1 5F 28 72-C4 6B 6A 70 C1 5F 1F 65 ..k._(r.kjp._.e
2E 9B 66 59 66 59 80 7F-80 7F C4 6B 2E 9B FA 89 ..fYfY...k....
C4 6B 80 7F 66 59 A2 9E-1F 65 28 72 66 59 FA 89 .k.fY...e(rfY..
2E 9B 6A 70 6A 70 A2 9E-2E 9B 6A 70 66 59 C4 6B ..jpjp....jpfY.k
A2 9E 1F 65 28 72 66 59-C1 5F FA 89 C1 5F FA 89 ...e(rfY._..._..
66 59 66 59 FA 89

要得到注册码，那么我们就需要根据Name得到字符串进行逆运算，从而得到Code的
四个奇数位的数字是什么？大家可以想想看。。其实也是蛮简单的。。
注册机随后附上。

*_^ *_^ *_^

详细信息:

平安全息万年历1.0.4注册机

下面的是根据前述算法做出注册机，我试了一下，好用 :)
如果要源程序，可以和我联系。Tialon@126.com

#include <stdio.h>
#include <ctype.h>
#define STR_LEN 8

unsigned char Table1[] = { 0xA2,0x9E,0xFA,0x89,0x6A,0x70,0x28,0x72,0x1F,
0x65,0x66,0x59,0x80,0x7F,0xC4,0x6B,0xC1,0x5F,
0x2E,0x9B };

unsigned char Table2[] = { 0xC4,0x6B,0xFA,0x89,0x28,0x72,0xA2,0x9E,0x2E,
0x9B,0x6A,0x70,0xC1,0x5F,0xFA,0x89,0xC4,0x6B,
0xC1,0x5F,0xA2,0x9E,0x80,0x7F,0xC4,0x6B,0x80,
0x7F,0x80,0x7F,0xC4,0x6B,0xFA,0x89,0x2E,0x9B,
0x28,0x72,0x28,0x72,0x66,0x59,0x28,0x72,0xC1,
0x5F,0x28,0x72,0xFA,0x89,0x1F,0x65,0x6A,0x70,
0x2E,0x9B,0xC4,0x6B,0xA2,0x9E,0x28,0x72,0xFA,
0x89,0xA2,0x9E,0xC1,0x5F,0x1F,0x65,0x6A,0x70,
0x6A,0x70,0x80,0x7F,0xC1,0x5F,0x2E,0x9B,0x28,
0x72,0xC4,0x6B,0x66,0x59,0xC4,0x6B,0x80,0x7F,
0x1F,0x65,0x28,0x72,0xC4,0x6B,0x6A,0x70,0xFA,
0x89,0xA2,0x9E,0x66,0x59,0x2E,0x9B,0xFA,0x89,
0xC4,0x6B,0xFA,0x89,0x80,0x7F,0xC4,0x6B,0xC1,
0x5F,0x28,0x72,0xC4,0x6B,0x6A,0x70,0xC1,0x5F,
0x1F,0x65,0x2E,0x9B,0x66,0x59,0x66,0x59,0x80,
0x7F,0x80,0x7F,0xC4,0x6B,0x2E,0x9B,0xFA,0x89,
0xC4,0x6B,0x80,0x7F,0x66,0x59,0xA2,0x9E,0x1F,
0x65,0x28,0x72,0x66,0x59,0xFA,0x89,0x2E,0x9B,
0x6A,0x70,0x6A,0x70,0xA2,0x9E,0x2E,0x9B,0x6A,
0x70,0x66,0x59,0xC4,0x6B,0xA2,0x9E,0x1F,0x65,
0x28,0x72,0x66,0x59,0xC1,0x5F,0xFA,0x89,0xC1,
0x5F,0xFA,0x89,0x66,0x59,0x66,0x59,0xFA,0x89,
'\0' };

unsigned char buf_str[] = "**";
unsigned char Number_str[STR_LEN+1];
unsigned char Code_str[] = "0*0*0*0*";
char *pstr,*pt;
int pos=0,k=0;

void main() {
printf("\nPlease Enter Number of your SoftWare: ");
scanf("%s",Number_str);
if(strlen(Number_str)>=STR_LEN){
pstr = Number_str;
pt = Table2;
while(k<STR_LEN){
buf_str[0] = Table1[(*(pstr+k)-0x30)*2];
buf_str[1] = Table1[(*(pstr+k)-0x30)*2+1];
pos = (*(pstr+k+1)-0x30)*10*2;
Code_str[k] = ((int)strstr(pt+pos,buf_str)-(int)pt-pos)/2+1+0x30;
k += 2;
}
printf("\nYour Code is: %s [ * -- any digital ]",Code_str);
}else {
printf("Enter Number error.");
}
}


棋隐

 标 题:《棋隐》的注册算法 (19千字)
发信人:ratarice
时 间:2001-8-26 19:43:17
详细信息:
《棋隐》的注册算法

作者：ratarice

工具：TRW2000、W32DSM89

废话少说，过程如下：

* Possible Reference to Dialog: DialogID_00FB, CONTROL_ID:03F7, ""
|
:00401EFF 68F7030000 push 000003F7
:00401F04 8BCF mov ecx, edi
:00401F06 E86F990300 call 0043B87A
:00401F0B 8D4C2418 lea ecx, dword ptr [esp+18]
:00401F0F 51 push ecx

* Possible StringData Ref from Data Obj ->"p"
|
:00401F10 6838364700 push 00473638
:00401F15 E866150100 call 00413480 ------------------->关键，要进入！
:00401F1A 6A00 push 00000000
:00401F1C 8BD8 mov ebx, eax -------------------->将eax的值给ebx
:00401F1E E81A430200 call 0042623D
:00401F23 6A00 push 00000000
:00401F25 8D7005 lea esi, dword ptr [eax+05]
:00401F28 E810430200 call 0042623D
:00401F2D 83C410 add esp, 00000010
:00401F30 3BF0 cmp esi, eax
:00401F32 7E0E jle 00401F42

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401F40(C)
|
:00401F34 6A00 push 00000000
:00401F36 E802430200 call 0042623D
:00401F3B 83C404 add esp, 00000004
:00401F3E 3BF0 cmp esi, eax
:00401F40 7FF2 jg 00401F34

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401F32(C)
|
:00401F42 8B542414 mov edx, dword ptr [esp+14]
:00401F46 52 push edx
:00401F47 FFD5 call ebp
:00401F49 A198454900 mov eax, dword ptr [00494598]
:00401F4E 89442410 mov dword ptr [esp+10], eax
:00401F52 85DB test ebx, ebx ------------------------->关键比较，其实是比较
:00401F54 C744246000000000 mov [esp+60], 00000000 eax
:00401F5C 7407 je 00401F65 --------------------------->关键跳转，不跳成功！

* Possible Reference to String Resource ID=00131: "Register was successful. Enjoy the game."
|
:00401F5E 6883000000 push 00000083
:00401F63 EB05 jmp 00401F6A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401F5C(C)
|

* Possible Reference to String Resource ID=00132: "Invalid serial number. Please input correct serial number."
|
:00401F65 6884000000 push 00000084

***************************************************************************

* Referenced by a CALL at Addresses:
|:00401F15 , :00413A35
|
:00413480 8B542408 mov edx, dword ptr [esp+08] ---->将假注册码地址给edx
:00413484 83EC2C sub esp, 0000002C
:00413487 83C9FF or ecx, FFFFFFFF
:0041348A 33C0 xor eax, eax
:0041348C 56 push esi
:0041348D 57 push edi
:0041348E 8BFA mov edi, edx
:00413490 33F6 xor esi, esi
:00413492 F2 repnz
:00413493 AE scasb
:00413494 F7D1 not ecx
:00413496 49 dec ecx ----------------------->计算注册码的长度
:00413497 83F913 cmp ecx, 00000013 ------------->注册码要19位
:0041349A 7555 jne 004134F1
:0041349C 8B02 mov eax, dword ptr [edx] ------
:0041349E 8B4A05 mov ecx, dword ptr [edx+05] |
:004134A1 89442408 mov dword ptr [esp+08], eax | 将注册码的第5、10、15位去掉
:004134A5 8B420A mov eax, dword ptr [edx+0A] | 构成新注册码，并将它的地址给
:004134A8 894C240C mov dword ptr [esp+0C], ecx | edx
:004134AC 8B4A0F mov ecx, dword ptr [edx+0F] |
:004134AF 89442410 mov dword ptr [esp+10], eax |
:004134B3 8D542408 lea edx, dword ptr [esp+08] |
:004134B7 8D44241C lea eax, dword ptr [esp+1C] |
:004134BB 52 push edx |
:004134BC 50 push eax |
:004134BD 894C241C mov dword ptr [esp+1C], ecx |
:004134C1 C644242000 mov [esp+20], 00 --------------
:004134C6 E8C5FEFFFF call 00413390 ----------------->又是关键！
:004134CB 83C408 add esp, 00000008
:004134CE 85C0 test eax, eax
:004134D0 741F je 004134F1
:004134D2 8D4C2422 lea ecx, dword ptr [esp+22]
:004134D6 51 push ecx
:004134D7 E8C82E0100 call 004263A4
:004134DC 8B54243C mov edx, dword ptr [esp+3C]
:004134E0 83C404 add esp, 00000004
:004134E3 3DA0860100 cmp eax, 000186A0
:004134E8 8902 mov dword ptr [edx], eax
:004134EA B801000000 mov eax, 00000001
:004134EF 7D02 jge 004134F3

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041349A(C), :004134D0(C)
|
:004134F1 8BC6 mov eax, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004134EF(C)
|
:004134F3 5F pop edi
:004134F4 5E pop esi
:004134F5 83C42C add esp, 0000002C
:004134F8 C3 ret

*****************************************************************************

* Referenced by a CALL at Address:
|:004134C6
|
:00413390 8B4C2408 mov ecx, dword ptr [esp+08]
:00413394 83EC28 sub esp, 00000028
:00413397 33C0 xor eax, eax
:00413399 81E96C394700 sub ecx, 0047396C
:0041339F 53 push ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004133B6(C)
|
:004133A0 0FBE906C394700 movsx edx, byte ptr [eax+0047396C] -----
:004133A7 8A9C016C394700 mov bl, byte ptr [ecx+eax+0047396C] | 按照作者定的顺序
:004133AE 40 inc eax | 排序：
:004133AF 83F810 cmp eax, 00000010 | 2837A9F061BD4C5E
:004133B2 885C1404 mov byte ptr [esp+edx+04], bl |
:004133B6 7CE8 jl 004133A0 ----------------------------
:004133B8 55 push ebp
:004133B9 56 push esi
:004133BA 8D44240C lea eax, dword ptr [esp+0C]
:004133BE 57 push edi
:004133BF 8D4C2424 lea ecx, dword ptr [esp+24]
:004133C3 50 push eax
:004133C4 51 push ecx
:004133C5 C644242800 mov [esp+28], 00
:004133CA E821FFFFFF call 004132F0 -------------------------->又是关键，还要追入！
:004133CF 8B7C2444 mov edi, dword ptr [esp+44]
:004133D3 8D6C242C lea ebp, dword ptr [esp+2C]
:004133D7 83C408 add esp, 00000008
:004133DA 2BEF sub ebp, edi
:004133DC 8D7701 lea esi, dword ptr [edi+01]
:004133DF BB0B000000 mov ebx, 0000000B ---------------------->ebx=B
:004133E4 89742440 mov dword ptr [esp+40], esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041341B(C)
|
:004133E8 0FBE042E movsx eax, byte ptr [esi+ebp] ---------->先符号扩展,再将注册码 的第二位传送给eax
:004133EC 83F85A cmp eax, 0000005A ---------------------->比较eax和5A
:004133EF 7F17 jg 00413408 ---------------------------->大于就跳
:004133F1 B95A000000 mov ecx, 0000005A ---------------------->小于就ecx=5A
:004133F6 2BC8 sub ecx, eax --------------------------->ecx=ecx-eax
:004133F8 B856555555 mov eax, 55555556 ---------------------->eax=55555556
:004133FD F7E9 imul ecx ------------------------------->eax=eax*ecx
:004133FF 8BC2 mov eax, edx --------------------------->eax=edx
:00413401 C1EA1F shr edx, 1F ---------------------------->edx逻辑右移1F
:00413404 03C2 add eax, edx --------------------------->eax=eax+edx
:00413406 EB0D jmp 00413415 --------------------------->跳走

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004133EF(C)
|
:00413408 83F865 cmp eax, 00000065 ---------------------->比较eax和65
:0041340B 7C08 jl 00413415 ---------------------------->小于就跳走
:0041340D 83C09B add eax, FFFFFF9B ---------------------->否则eax=eax+FFFFFF9B
:00413410 99 cdq ------------------------------------>双字扩展(把EAX中的字的 符号扩展到EDX中去)
:00413411 2BC2 sub eax, edx --------------------------->eax=eax-edx
:00413413 D1F8 sar eax, 1 ----------------------------->eax算术右移1

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00413406(U), :0041340B(C)
|
:00413415 0430 add al, 30 ----------------------------->al=al+30
:00413417 8806 mov byte ptr [esi], al ----------------->al给[esi]
:00413419 46 inc esi -------------------------------->esi加一
:0041341A 4B dec ebx -------------------------------->ebx减一
:0041341B 75CB jne 004133E8 --------------------------->循环；即得新注册码
:0041341D 8A5C2424 mov bl, byte ptr [esp+24]
:00413421 C6470C00 mov [edi+0C], 00
:00413425 881F mov byte ptr [edi], bl ----------------->将注册码的第一位补到新 注册码的前面
:00413427 33C0 xor eax, eax ---------------------------
:00413429 B901000000 mov ecx, 00000001 |
| 将新注册码累乘
* Referenced by a (U)nconditional or (C)onditional Jump at Address: | 值给eax
|:0041343B(C) |
| |
:0041342E 0FBE1439 movsx edx, byte ptr [ecx+edi] |
:00413432 0FAFC1 imul eax, ecx |
:00413435 03C2 add eax, edx |
:00413437 41 inc ecx |
:00413438 83F90C cmp ecx, 0000000C |
:0041343B 7CF1 jl 0041342E ----------------------------
:0041343D 5F pop edi
:0041343E 5E pop esi
:0041343F 85C0 test eax, eax -------------------------->检查eax
:00413441 5D pop ebp
:00413442 7D02 jge 00413446 --------------------------->eax大于等于43446就跳
:00413444 F7D8 neg eax -------------------------------->？？？

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00413442(C)
|
:00413446 99 cdq ------------------------------------>双字扩展
:00413447 B91A000000 mov ecx, 0000001A ---------------------->ecx=1A
:0041344C F7F9 idiv ecx ------------------------------->eax=eax/ecx
:0041344E 0FBEC3 movsx eax, bl -------------------------->先符号扩展,再把bl给al
:00413451 5B pop ebx
:00413452 83C241 add edx, 00000041 ---------------------->edx=edx+41
:00413455 3BC2 cmp eax, edx --------------------------->比较eax和edx
:00413457 7512 jne 0041346B --------------------------->不相等就完蛋
:00413459 8B4C2430 mov ecx, dword ptr [esp+30] ------------>将新注册码的第一位地址 给ecx
:0041345D 803932 cmp byte ptr [ecx], 32 ----------------->比较ecx和32
:00413460 7509 jne 0041346B --------------------------->不相等就完蛋
:00413462 B801000000 mov eax, 00000001
:00413467 83C428 add esp, 00000028
:0041346A C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00413457(C), :00413460(C)
|
:0041346B 33C0 xor eax, eax
:0041346D 83C428 add esp, 00000028
:00413470 C3 ret

***********************************************************************************

* Referenced by a CALL at Addresses:
|:0040808A , :004133CA
|
:004132F0 56 push esi
:004132F1 8B74240C mov esi, dword ptr [esp+0C]
:004132F5 57 push edi
:004132F6 8BFE mov edi, esi
:004132F8 83C9FF or ecx, FFFFFFFF
:004132FB 33C0 xor eax, eax
:004132FD F2 repnz
:004132FE AE scasb
:004132FF F7D1 not ecx
:00413301 49 dec ecx
:00413302 F6C103 test cl, 03
:00413305 7403 je 0041330A
:00413307 5F pop edi
:00413308 5E pop esi
:00413309 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00413305(C)
|
:0041330A 8A06 mov al, byte ptr [esi] ------------->依次取注册码到al
:0041330C 84C0 test al, al ------------------------>检查是否是零
:0041330E 7467 je 00413377 ------------------------>是就完蛋！
:00413310 8B7C240C mov edi, dword ptr [esp+0C]
:00413314 53 push ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041336A(C)
|
:00413315 50 push eax
:00413316 46 inc esi
:00413317 E894FFFFFF call 004132B0 ----------------------->也需要追入！（是换算）
:0041331C 8AD8 mov bl, al -------------------------->al给bl
:0041331E 8A06 mov al, byte ptr [esi] -------------->下一个注册码给al
:00413320 50 push eax
:00413321 46 inc esi ----------------------------->esi加一
:00413322 E889FFFFFF call 004132B0 ----------------------->换算
:00413327 8AC8 mov cl, al -------------------------->al给cl
:00413329 240F and al, 0F -------------------------->al and 0f
:0041332B C0F904 sar cl, 04 -------------------------->cl算术右移4
:0041332E C0E302 shl bl, 02 -------------------------->bl逻辑左移2
:00413331 02CB add cl, bl -------------------------->cl=cl+bl
:00413333 8AD8 mov bl, al -------------------------->al给bl
:00413335 880F mov byte ptr [edi], cl -------------->cl给[edi]
:00413337 8A06 mov al, byte ptr [esi] -------------->取下一个注册码给al
:00413339 47 inc edi ----------------------------->edi加一
:0041333A 50 push eax
:0041333B 46 inc esi ----------------------------->esi加一
:0041333C E86FFFFFFF call 004132B0 ----------------------->换算
:00413341 8AD0 mov dl, al -------------------------->al给dl
:00413343 2403 and al, 03 -------------------------->al and 3
:00413345 C0FA02 sar dl, 02 -------------------------->dl算术右移2
:00413348 C0E304 shl bl, 04 -------------------------->bl逻辑左移4
:0041334B 02D3 add dl, bl -------------------------->dl=dl+bl
:0041334D 8AD8 mov bl, al -------------------------->bl给al
:0041334F 8817 mov byte ptr [edi], dl -------------->dl给[edi]
:00413351 8A06 mov al, byte ptr [esi] -------------->取下一个注册码给al
:00413353 47 inc edi ----------------------------->edi加一
:00413354 50 push eax
:00413355 46 inc esi ----------------------------->esi加一
:00413356 E855FFFFFF call 004132B0 ----------------------->换算
:0041335B C0E306 shl bl, 06 -------------------------->bl逻辑左移6
:0041335E 02C3 add al, bl -------------------------->al=al+bl
:00413360 83C410 add esp, 00000010
:00413363 8807 mov byte ptr [edi], al -------------->al给edi
:00413365 8A06 mov al, byte ptr [esi] -------------->取下一个注册码给al
:00413367 47 inc edi ----------------------------->edi加一
:00413368 84C0 test al, al ------------------------->检查是否取完
:0041336A 75A9 jne 00413315 ------------------------>没有取完，循环！
:0041336C 5B pop ebx
:0041336D 8807 mov byte ptr [edi], al -------------->将最后一个给[edi]
:0041336F 5F pop edi
:00413370 B801000000 mov eax, 00000001
:00413375 5E pop esi
:00413376 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041330E(C)
|
:00413377 8B7C240C mov edi, dword ptr [esp+0C]
:0041337B B801000000 mov eax, 00000001
:00413380 C60700 mov byte ptr [edi], 00
:00413383 5F pop edi
:00413384 5E pop esi
:00413385 C3 ret

************************************************************************

这个CALL作用是：如果注册码在41和5A之间，则注册码减41；
如果注册码在61和71之间，则注册码减47；
如果注册码在30和39之间，则注册码加4。

* Referenced by a CALL at Addresses:
|:00413317 , :00413322 , :0041333C , :00413356
|
:004132B0 8A442404 mov al, byte ptr [esp+04]
:004132B4 3C41 cmp al, 41
:004132B6 7C08 jl 004132C0
:004132B8 3C5A cmp al, 5A
:004132BA 7F04 jg 004132C0
:004132BC 83E841 sub eax, 00000041
:004132BF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004132B6(C), :004132BA(C)
|
:004132C0 3C61 cmp al, 61
:004132C2 7C08 jl 004132CC
:004132C4 3C7A cmp al, 7A
:004132C6 7F04 jg 004132CC
:004132C8 83E847 sub eax, 00000047
:004132CB C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004132C2(C), :004132C6(C)
|
:004132CC 3C30 cmp al, 30
:004132CE 7C08 jl 004132D8
:004132D0 3C39 cmp al, 39
:004132D2 7F04 jg 004132D8
:004132D4 83C004 add eax, 00000004
:004132D7 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004132CE(C), :004132D2(C)
|
:004132D8 3C2B cmp al, 2B
:004132DA 0F95C0 setne al
:004132DD 83C03E add eax, 0000003E
:004132E0 C3 ret

由于本人的能力有限，做不出它的注册机，还请高人指点！！！！！

标 题:真过分啦!居然断网半天,害的我-----算法都有人贴了,555~~~ (1千字)
发信人:jackyspy [CCG]
时 间:2001-8-26 23:22:54
详细信息:

我算了一个
Name: jackyspy [CCG]
Serial: lZll-V2nT-VGlW-ZZWV
写了一个注册机, 算法有人贴了, 我就不再说了.
/*
软件名称: 棋隐(Chinese Chess Learner)
在VC 6.0下通过编译
*/

#include <stdio.h>
#include <windows.h>

BYTE anti_convert(BYTE c)
{
c-=0x30;
if(c<=0xD)
c=c*2+0x65;
else if(c<=0x1E)
c=0x5A-(BYTE)((c<<24)/0x555555+0.5);
return c;
}

BYTE convert2char(BYTE c)
{
if(c<26)
c+='A';
else if(c<52)
c+='G';
else if(c<62)
c-=4;
else if(c==62)
c='+';
else
c='*';
return c;
}

void main()
{
BYTE result[]="@2NAME748748",serial[]="0000000000000000";
// 其中result中的数值可以改变, 但是一定要遵循下面的规则:
// 要求字符为'0'-'N'之间或者0x8B-0x94之间, 第二个数为2,后六位必须是数字
// 而且要大于1000000(0x186A0)
BYTE ResortRef[]={2,8,3,7,0x0A,9,0x0F,0,6,1,0x0B,0x0D,4,0x0C,5,0x0E,0};
int i,temp;
for(i=1,temp=0;i<12;i++)
temp=temp*i+result[i];
temp=temp>=0?temp:-temp;
temp%=0x1A;temp+=0x41;
result[0]=(BYTE)temp;
for(i=1;i<12;i++)
result[i]=anti_convert(result[i]);
for(i=0;i<4;i++)
{
serial[i*4]=(result[i*3]&0xFC)>>2;
serial[i*4+1]=((result[i*3+1]&0xF0)>>4)+((result[i*3]&3)<<4);
serial[i*4+2]=((result[i*3+1]&0x0F)<<2)+((result[i*3+2]&0xC0)>>6);
serial[i*4+3]=result[i*3+2]&0x3F;
}
for(i=0;i<16;i++)
serial[i]=convert2char(serial[i]);
for(i=0;i<16;i++)
{
putchar(serial[ResortRef[i]]);
if(i%4==3)
putchar('-');
}
}


软件名称：起名正宗 (Version: 1.3) Qmzz.EXE 1,029KB 下载地点：http://www.gregorybraun.com 发 信 人: 井 风 时 间: 2000-12-25 破解工具：Trw20001.22 解题难度：[专 业] [学 士] [硕 士] [博 士] ******** 前 言： 此软件加密水平还算不错，使用用户名和本机某个参数作为计算源。程序有一处陷井， 因此，有些地方要引起注意。 过 程: 1、注册窗口填入：姓名 cccc 注册码 123456789； 2、用“井风跟踪”法找到出错的CALL，详细过程参见WINZIP8.0破解教学篇； 3、分析代码： :004A6A66 8B8304030000 mov eax, dword ptr [ebx+00000304] :004A6A6C E80FB3F8FF call 00431D80 :004A6A71 8B45F0 mov eax, dword ptr [ebp-10] :004A6A74 8D55F4 lea edx, dword ptr [ebp-0C] :004A6A77 E88426F6FF call 00409100 :004A6A7C 837DF400 cmp dword ptr [ebp-0C], 00000000 <---比较有否输入用户名 :004A6A80 7525 jne 004A6AA7 :004A6A82 6A00 push 00000000 :004A6A84 668B0D746B4A00 mov cx, word ptr [004A6B74] :004A6A8B B202 mov dl, 02 . . . :004A6AD4 8B8B14030000 mov ecx, dword ptr [ebx+00000314] :004A6ADA 8B9318030000 mov edx, dword ptr [ebx+00000318] :004A6AE0 8B830C030000 mov eax, dword ptr [ebx+0000030C] :004A6AE6 E859F7FFFF call 004A6244 <---深入跟踪此CALL :004A6AEB 84C0 test al, al :004A6AED 7420 je 004A6B0F <---跳则执行[A] :004A6AEF 6A00 push 00000000 :004A6AF1 668B0D746B4A00 mov cx, word ptr [004A6B74] :004A6AF8 B202 mov dl, 02 :004A6AFA B8AC6B4A00 mov eax, 004A6BAC :004A6AFF E8C80BFBFF call 004576CC :004A6B04 B201 mov dl, 01 :004A6B06 8BC3 mov eax, ebx :004A6B08 E8CFFCFFFF call 004A67DC :004A6B0D EB15 jmp 004A6B24 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004A6AED(C) | :004A6B0F 6A00 push 00000000 :004A6B11 668B0D746B4A00 mov cx, word ptr [004A6B74] :004A6B18 33D2 xor edx, edx :004A6B1A B8C86B4A00 mov eax, 004A6BC8 :004A6B1F E8A80BFBFF call 004576CC <---执行此行出错，记为[A] * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:004A6AA5(U), :004A6B0D(U) | :004A6B24 33C0 xor eax, eax :004A6B26 5A pop edx :004A6B27 59 pop ecx :004A6B28 59 pop ecx :004A6B29 648910 mov dword ptr fs:[eax], edx :004A6B2C 686E6B4A00 push 004A6B6E 以下为追入004A6B1F call 004576CC 代码： :004A6244 55 push ebp :004A6245 8BEC mov ebp, esp :004A6247 81C460FDFFFF add esp, FFFFFD60 :004A624D 53 push ebx :004A624E 56 push esi :004A624F 57 push edi :004A6250 33DB xor ebx, ebx :004A6252 899D60FEFFFF mov dword ptr [ebp+FFFFFE60], ebx :004A6258 895DF8 mov dword ptr [ebp-08], ebx :004A625B 894DFC mov dword ptr [ebp-04], ecx :004A625E 8BDA mov ebx, edx :004A6260 8BF8 mov edi, eax :004A6262 8B4508 mov eax, dword ptr [ebp+08] :004A6265 E816DEF5FF call 00404080 :004A626A 33C0 xor eax, eax :004A626C 55 push ebp :004A626D 68ED634A00 push 004A63ED :004A6272 64FF30 push dword ptr fs:[eax] :004A6275 648920 mov dword ptr fs:[eax], esp :004A6278 8D9560FEFFFF lea edx, dword ptr [ebp+FFFFFE60] :004A627E 8B4508 mov eax, dword ptr [ebp+08] :004A6281 E87A2EF6FF call 00409100 :004A6286 83BD60FEFFFF00 cmp dword ptr [ebp+FFFFFE60], 00000000 :004A628D 7507 jne 004A6296 :004A628F 33DB xor ebx, ebx :004A6291 E92E010000 jmp 004A63C4 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004A628D(C) | :004A6296 8B4D08 mov ecx, dword ptr [ebp+08] :004A6299 8BD3 mov edx, ebx :004A629B 8BC7 mov eax, edi :004A629D E872FAFFFF call 004A5D14 :004A62A2 8BF0 mov esi, eax :004A62A4 3B75FC cmp esi, dword ptr [ebp-04] <---此处可见正确注册码 ? esi 显示：HEW C117DB6EE 注意是无符号数16进制，需转为10进制 转化为10进制=3246241518 :004A62A7 0F8515010000 jne 004A63C2 <---正确注册码此处不跳 :004A62AD E8F243F6FF call 0040A6A4 :004A62B2 DD5DB0 fstp qword ptr [ebp-50] :004A62B5 9B wait :004A62B6 E8E943F6FF call 0040A6A4 :004A62BB DD5DB8 fstp qword ptr [ebp-48] :004A62BE 9B wait :004A62BF C645C001 mov [ebp-40], 01 :004A62C3 C645C100 mov [ebp-3F], 00 . . . 小 结： 验证注册码方法是比较两个寄存器中无符号数值，所以要将寄存器中的十六进制数转化为 十进制数（用98系统附件中的科学型计算器就很方便）。 注册成功后生成文件 _!!19925._Si，里面放的就是你的注册码，它的位置在机器的windows 目录下。 我的注册码： 机器码 3245818142 3245818142 用 户 abcd cccc 注册码 3246232782 3246241518 后 记： 有疑问请与我联系：hz.cy@163.net


商务奇兵

标 题:一个简单的破解，供初学者参考！望高手多加指点！ (1千字)
发信人:10
时 间:2001-3-26 13:51:50
详细信息:
学破解才三个月，功力尚浅，每看完一篇教程就想一试身手，结果总是一无所成，甚是惭愧！但我对破解的爱好却是初忠不改。昨天，一同事COPY了一个软件，有时间限制，要注册才行，就让我给他破一下，可我到现在还没有真正搞定过一个软件。为了不太丢面子，只有硬着头皮上了。（唉！甚是惭愧）
软件名称：商务奇兵
下载地址不清楚（同事COPY来的），有兴趣的朋友可以自已找！
运行TRW2000
点击注册，输入姓名和注册码：
NAME：WCH
KEY：78787878
CTRL+N，下断点：
BPX HMEMCPY
F5回到软件注册界面，点注册。成功拦住，按F12十四下（十五下就出错了），再按F10至以下代码：
*
0177:004C3B66 MOV EAX,[EBP+FFFFFEF4]
0177:004C3B6C MOV ECX,004C3D90
0177:004C3B71 POP EDX
0177:004C3B72 CALL 004C38C4 有问题？？
0177:004C3B77 TEST AL,AL
0177:004C3B79 JZ NEAR 004CB006
*
*
*
0177:004C3D06 MOV EAX,004C3E60
0177:004C3D0B CALL 00455170 出错误框
________________________________________________________-
运行004C3D0B时弹出错误框，不难看出004C3B72的CALL有问题，等什么？追进。
按F10至以下代码：
*
004C3912 MOV EAX [004D9188] ***** 输入的NAME
004C3917 MOVZX EAX，BYTE[EAX]
004C391A MOV EBX，[EBP-14] **** 正确的注册码
004C391D MOV BL [EBX+EAX-31]
004C3921 MOV ESI [EBP-04] **** 输入的注册码
004C3923 CMP BL ESI
004C3928 JNZ 004C3985
*
*
在004C391A处下
D EBX
可得正确注册码：PD3K0DOG35UP
重新回到软件注册：
NAME：WCH
KEY：PD3K0DOG35UP
注册成功！哈哈！总算保住了一点面子！
共用时：50分钟。

以上内容仅供初学者参考！还望高手多指点！

10
2001.3.26 整理


商务奇兵2.0

 标 题:商务奇兵2.0破解手记 (901字)
发信人:孙锋
时 间:2000-12-27 14:20:43
详细信息:
商务奇兵2.0破解手记
时间：2000年12月27日下午13:20
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
http://phy.qfnu.edu.cn/personal/~sffs/index.htm
工具
TRW2000

步骤：
1、启动商务奇兵2.0，选择注册项，随便输入注册信息
User Name: sunfeng
Register Key: 1212121212
2、载入TRW2000,Ctrl+N,呼叫出TRW2000,F5返回程序空间，点击OK。
3、被TRW2000拦截到，BD *万能中断，F12共计14次。
4、F10到下面位置：
0167:004C3AF2 MOV EDX,[EBP+04]
0167:004C3AF5 MOV EAX,EBX ;----------->D EDX，得到正确的注册码
;----------->PH34PXO5VXVJ
5、整理：
User Name: sunfeng
Register Key:PH34PXO5VXVJ

6、另外的注册码：
User Name----------------------------Register Key

孙锋--------------------------------PEAUB4O43T30

7、完成注册。

<-----------完---------->


商务邮件专家2.0

标 题:商务邮件专家2.0破解手记 (509字)
发信人:孙锋
时 间:2001-2-2 17:39:09
详细信息:
商务邮件专家破解手记

作者：孙 锋
Email： sffs@263.net
主页：http://sffs.6to23.com

工具：

SoftIce 4.05

步骤：

1、随便输入注册码：1212121212。
2、Ctrl+D调出SoftIce，下bpx hmemcpy。
3、F5返回程式，点确定，被SoftIce拦截到。
4、F12共12次，然后一直F10到下面的位置：
0167:004BF3BD MOV EDX,[EDX+00000D3C]
0167:004BF3CC CALL 004042E8 ;---------->D EDX 得到正确注册码：+6T)L_0n
0167:004BF3C8 JNZ 004BF446
5、整理重新注册，成功升级为正式版。

<---------完-------->


深入地心(Game)

序 号:10500
标 题:我的破解心得(9) (4千字)
发信人:chcw
时 间:2001-3-13 18:10:44
详细信息:
破解程序：
深入地心(Game)

破解工具：
SoftICE 3.0 For Windows 95
W32Dasm 8.5

破解者：
chcw

在安装完深入地心之后，执行其主程序Emb.exe，得到错误提示“你并未正确安装本游戏”。下
面我们将分析并解决该错误。

1. 用SoftICE载入EMB.EXE。
2. 因为在运行时会有一个错误提示，我们就对它设置断点：
BPX MESSAGEBOXA
3. 按Ctrl-D，程序开始运行，触发SoftICE，光带停留在MessageBoxA函数的入口处:

USER32!MessageBoxA
0137:BFF541BA PUSH EBP

将光标移到MessageBoxA函数的返回处

0137:BFF541D RET 0010

并键入命令HERE,程序执行到光标所在处。
4. 按F10，回到调用MessageBoxA函数的上层语句处：
0137:00470B29 CALL USER32!MessageBoxA
从该语句处向上找，发现在:00470B0F有一处函数调用，其函数的返回值决定了是否显示错误的
提示。
0137:00470B0F CALL 00402F5E <-函数调用
0137:00470B14 ADD ESP, 00000004
0137:00470B17 TEST EAX, EAX ;若EAX非零，则不显示错误信息。
0137:00470B19 JNE 00470B36
5. 键入BC *，清除原先的断点。再将鼠标移到:00470B17 TEST EAX, EAX处双击，设置执行断
点。
6. 按Ctrl-D回到执行程序，此时程序显示完错误信息，并正常退出。在SoftICE中选择Module/Load
再次载入程序。
7. 程序开始运行后 ，SoftICE将被触发，刚才设置的断点被激活了：
0137:00470B17 TEST EAX, EAX ; <-激活的断点处
键入r eax=1，将eax的值强行设置为1。然后键入X，继续运行程序。此时程序不再显示错误信息，
而是开始显示主界面。但在选择New Game后，程序继续执行时会出错并退出。看来，很可能函数
00402F5E读取了某些主程序运行时所必须的数据，我们需要进一步分析函数00402F5E
8. 用W32Dasm对执行程序EMB.EXE进行反汇编，并在Search/Find Text中输入"call 00402F5E"，查找
调用函数00402F5E的语句，亮条将停留在以下语句处：
:00470B0F E84A24F9FF call 00402F5E
在工具栏上选择"Call"，文本调用(Text Call)该函数。亮条将停留在函数00402F5E的入口处：
:00402F5E 55 push ebp
9. 从:00402F5E处往下看，可以知道该函数的大致功能。函数的第一部分是调用wsprintfA()函数：
wsprintfA(OneString, "Software\TGL\INSTALL\%s", AnotherString) ，
形成一个型如"Software\TGL\INSTALL\AnotherString"的串OneString以备后用（OneString和
    AnotherString是参数，为叙述方便，这里我们指定它们的名字）：

* Possible StringData Ref from Data Obj ->"Software\TGL\INSTALL\%s"
|
:00402F6B 6868304800 push 00483068
:00402F70 8D8DFCFEFFFF lea ecx, dword ptr [ebp+FFFFFEFC]
:00402F76 51 push ecx
|
* Reference To: USER32.wsprintfA, Ord:0264h
:00402F77 FF1544865B00 Call dword ptr [005B8644]

  程序的第二部分是从注册表中打开上述串OneString对应的键，并从中取出某一串值：

:00402F95 6801000080 push 80000001

* Reference To: ADVAPI32.RegOpenKeyExA, Ord:012Eh
|
:00402F9A FF15FC835B00 Call dword ptr [005B83FC]
...
* Possible StringData Ref from Data Obj ->"GameDirectory"
|
:00402FB9 6880304800 push 00483080
:00402FBE 8B95F8FEFFFF mov edx, dword ptr [ebp+FFFFFEF8]
:00402FC4 52 push edx

* Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
|
:00402FC5 FF1500845B00 Call dword ptr [005B8400]
...
  从串名"GameDirectory"我们可以猜到，该串中存放的串值是游戏的目录。查Win32 SDK可
  以知道这个键是在HKEY_CURRENT_USER下。
      根据上述分析，我们可以猜想到，在正版的游戏正常安装后，会生成主键
HKEY_CURRENT_USER\Software\TGL\INSTALL\AnotherString
  并在该主键下生成一个串，该串的名字为"GameDirectory"，值为游戏文件所在的目录。我
  们只要在注册表中手工键入上述的主键和串，就应该能使程序正常启动。
10.但是在串\Software\TGL\INSTALL\AnotherString中尚有子串AnotherString的值是未知的。
在工具栏上选择"Ret"，返回到调用函数00402F5E的语句处：
:00470B0A 68849E4800 push 00489E84
:00470B0F E84A24F9FF call 00402F5E
  从压栈的参数中我们可以获取串AnotherString的地址为00489E84。
11.选择HexData/Hex Display of Data Object/Segments，并找到00489E84处的数据：
:00489E80 xx xx xx xx B2 60 A4 4A RH...`.J
:00489E88 A6 61 A4 DF 00 xx xx xx .a......
    这些数据看起来好象是一些乱码，仔细分析一下，就可以发现它们都是中文的内码(BIG5)，
解读后得到字符串AnotherString="深入地心"。
12.现在我们可以修改注册表了。执行REGEDIT，打开注册表，创建键
HKEY_CURRENT_USER\Software\TGL\INSTALL\深入地心，（注意这里必须用BIG5输入），并
在此主键中加入串GameDirectory=.\

附：修改注册表的文件EMB.REG
------------------------ EMB.REG ----------------------------
REGEDIT4

//Regist Embrace(Add a key to the register table)
//Written By Mr. CHCW

[HKEY_CURRENT_USER\Software\TGL]

[HKEY_CURRENT_USER\Software\TGL\INSTALL]

[HKEY_CURRENT_USER\Software\TGL\INSTALL\瞏み]
"GameDirectory"=".\\"

--------------------- End of File EMB.REG -------------------


神奇注册

 标 题:VERY EASY级看“神奇注册”表注册码（大侠们不要骂我，哈哈） (664字)
发信人:Ajax
时 间:2001-9-8 18:24:13
详细信息:
神奇注册表　我这里只有0.5，在0.6以后行得通否没试过
用户名:Ajax
注册码:0228
---------------------------------------------------
注册信息存放在WINDOWS目录下Mgreg.ini里，删除变成未注册版
VC++编译，没有加壳
其实以上这些没必要管它啦，只要照下面去做就OK了：）
---------------------------------------------------
用Ollydbg打开神奇注册表执行文件，按F9运行，出现注册对话框填入用户名Ajax，注册码随便，按“立即注册”，此时理所当然的弹出了无效注册码的警告，预料中的，呵呵，别理他，回到Ollydbg按下F12使程序暂停，哈哈，感谢程序作者，在EDX里还给大家保留着真正的注册码，别告诉我右面窗口里那么大的几个数字你看不到：）
重新填入注册码，注册成功！
我爽～～～～～～～～～～～


神奇注册表0.6

 标 题:神奇注册表0.6破解 (11千字)
发信人:jieao
时 间:2001-7-27 16:44:02
详细信息:
神奇注册表0.6破解

:0041105D 8B3DA0454400 mov edi, dword ptr [004445A0]
:00411063 8D45B0 lea eax, dword ptr [ebp-50]
:00411066 50 push eax
:00411067 FFD7 call edi
:00411069 FFB6D4000000 push dword ptr [esi+000000D4]
:0041106F 8D45D8 lea eax, dword ptr [ebp-28]
:00411072 50 push eax
:00411073 FFD7 call edi
:00411075 83C410 add esp, 00000010
:00411078 8D45D8 lea eax, dword ptr [ebp-28]
:0041107B 8BCE mov ecx, esi
:0041107D 50 push eax
:0041107E 8D45B0 lea eax, dword ptr [ebp-50]
:00411081 50 push eax
:00411082 E86B000000 call 004110F2<-关键，进去看看
:00411087 83F801 cmp eax, 00000001<-比较
:0041108A 754F jne 004110DB<-跳就死拉
:0041108C 53 push ebx
:0041108D 6A40 push 00000040

* Possible Reference to Dialog:
|
:0041108F 6804754500 push 00457504

* Possible StringData Ref from Data Obj ->"感谢您注册本软件！"
|
:00411094 68F0744500 push 004574F0
:00411099 8BCE mov ecx, esi
:0041109B E885F00100 call 00430125
________________________________________________
:004110F2 55 push ebp
:004110F3 8BEC mov ebp, esp
:004110F5 81EC80000000 sub esp, 00000080
:004110FB 804D9FFF or byte ptr [ebp-61], FF
:004110FF 8065A000 and byte ptr [ebp-60], 00
:00411103 56 push esi
:00411104 C6458048 mov [ebp-80], 48 <-48,ee,76....装入
:00411108 C64581EE mov [ebp-7F], EE
:0041110C C6458276 mov [ebp-7E], 76
:00411110 C645831D mov [ebp-7D], 1D
:00411114 C6458467 mov [ebp-7C], 67
:00411118 C6458569 mov [ebp-7B], 69
:0041111C C64586A1 mov [ebp-7A], A1
:00411120 C645871B mov [ebp-79], 1B
:00411124 C645887A mov [ebp-78], 7A
:00411128 C645898C mov [ebp-77], 8C
:0041112C C6458A47 mov [ebp-76], 47
:00411130 C6458BF8 mov [ebp-75], F8
:00411134 C6458C54 mov [ebp-74], 54
:00411138 C6458D95 mov [ebp-73], 95
:0041113C C6458E97 mov [ebp-72], 97
:00411140 C6458F5F mov [ebp-71], 5F
:00411144 C6459078 mov [ebp-70], 78
:00411148 C64591D9 mov [ebp-6F], D9
:0041114C C64592DA mov [ebp-6E], DA
:00411150 C645936C mov [ebp-6D], 6C
:00411154 C6459459 mov [ebp-6C], 59
:00411158 C64595D7 mov [ebp-6B], D7
:0041115C C645966B mov [ebp-6A], 6B
:00411160 C6459735 mov [ebp-69], 35
:00411164 C64598C5 mov [ebp-68], C5
:00411168 C6459977 mov [ebp-67], 77
:0041116C C6459A85 mov [ebp-66], 85
:00411170 C6459B18 mov [ebp-65], 18
:00411174 C6459C2A mov [ebp-64], 2A
:00411178 C6459D0E mov [ebp-63], 0E
:0041117C C6459E52 mov [ebp-62], 52
:00411180 C645A1E3 mov [ebp-5F], E3
:00411184 C645A21B mov [ebp-5E], 1B
:00411188 C645A371 mov [ebp-5D], 71
:0041118C C645A48D mov [ebp-5C], 8D
:00411190 C645A534 mov [ebp-5B], 34
:00411194 C645A663 mov [ebp-5A], 63
:00411198 C645A7EB mov [ebp-59], EB
:0041119C C645A891 mov [ebp-58], 91
:004111A0 C645A9C3 mov [ebp-57], C3
:004111A4 C645AA24 mov [ebp-56], 24
:004111A8 C645AB0F mov [ebp-55], 0F
:004111AC C645ACB7 mov [ebp-54], B7
:004111B0 C645ADC2 mov [ebp-53], C2
:004111B4 C645AEF8 mov [ebp-52], F8
:004111B8 C645AFE3 mov [ebp-51], E3
:004111BC C645B0B6 mov [ebp-50], B6
:004111C0 C645B154 mov [ebp-4F], 54
:004111C4 C645B24C mov [ebp-4E], 4C
:004111C8 C645B335 mov [ebp-4D], 35
:004111CC C645B454 mov [ebp-4C], 54
:004111D0 C645B5D7 mov [ebp-4B], D7
:004111D4 C645B6C9 mov [ebp-4A], C9
:004111D8 C645B749 mov [ebp-49], 49
:004111DC C645B828 mov [ebp-48], 28
:004111E0 C645B9A3 mov [ebp-47], A3
:004111E4 C645BA85 mov [ebp-46], 85
:004111E8 C645BB11 mov [ebp-45], 11
:004111EC C645BC0B mov [ebp-44], 0B
:004111F0 C645BD2C mov [ebp-43], 2C
:004111F4 C645BE68 mov [ebp-42], 68
:004111F8 C645BFFB mov [ebp-41], FB
:004111FC C645C0EE mov [ebp-40], EE
:00411200 C645C17D mov [ebp-3F], 7D
:00411204 C645C2F6 mov [ebp-3E], F6
:00411208 C645C36C mov [ebp-3D], 6C
:0041120C C645C4E3 mov [ebp-3C], E3
:00411210 C645C59C mov [ebp-3B], 9C
:00411214 C645C62D mov [ebp-3A], 2D
:00411218 C645C7E4 mov [ebp-39], E4
:0041121C C645C872 mov [ebp-38], 72
:00411220 C645C9C3 mov [ebp-37], C3
:00411224 C645CABB mov [ebp-36], BB
:00411228 C645CB85 mov [ebp-35], 85
:0041122C C645CC1A mov [ebp-34], 1A
:00411230 C645CD12 mov [ebp-33], 12
:00411234 C645CE3C mov [ebp-32], 3C
:00411238 C645CF32 mov [ebp-31], 32
:0041123C 8B7508 mov esi, dword ptr [ebp+08]
:0041123F C645D0E3 mov [ebp-30], E3
:00411243 56 push esi
:00411244 C645D16B mov [ebp-2F], 6B
:00411248 C645D24F mov [ebp-2E], 4F
:0041124C C645D34D mov [ebp-2D], 4D
:00411250 C645D4F4 mov [ebp-2C], F4
:00411254 C645D5A9 mov [ebp-2B], A9
:00411258 C645D624 mov [ebp-2A], 24
:0041125C C645D7C8 mov [ebp-29], C8
:00411260 C645D8FA mov [ebp-28], FA
:00411264 C645D978 mov [ebp-27], 78
:00411268 C645DAAD mov [ebp-26], AD
:0041126C C645DB23 mov [ebp-25], 23
:00411270 C645DCA1 mov [ebp-24], A1
:00411274 C645DDE4 mov [ebp-23], E4
:00411278 C645DE6D mov [ebp-22], 6D
:0041127C C645DF9A mov [ebp-21], 9A
:00411280 C645E004 mov [ebp-20], 04
:00411284 C645E1CE mov [ebp-1F], CE
:00411288 C645E22B mov [ebp-1E], 2B
:0041128C C645E3C5 mov [ebp-1D], C5
:00411290 C645E4B6 mov [ebp-1C], B6
:00411294 C645E5C5 mov [ebp-1B], C5
:00411298 C645E6EF mov [ebp-1A], EF
:0041129C C645E793 mov [ebp-19], 93
:004112A0 C645E85C mov [ebp-18], 5C
:004112A4 C645E9A8 mov [ebp-17], A8
:004112A8 C645EA85 mov [ebp-16], 85
:004112AC C645EB2B mov [ebp-15], 2B
:004112B0 C645EC41 mov [ebp-14], 41
:004112B4 C645ED37 mov [ebp-13], 37
:004112B8 C645EE72 mov [ebp-12], 72
:004112BC C645EFFA mov [ebp-11], FA
:004112C0 C645F057 mov [ebp-10], 57
:004112C4 C645F145 mov [ebp-0F], 45
:004112C8 C645F241 mov [ebp-0E], 41
:004112CC C645F3A1 mov [ebp-0D], A1
:004112D0 C645F420 mov [ebp-0C], 20
:004112D4 C645F54F mov [ebp-0B], 4F
:004112D8 C645F680 mov [ebp-0A], 80
:004112DC C645F7B3 mov [ebp-09], B3
:004112E0 C645F8D5 mov [ebp-08], D5
:004112E4 C645F923 mov [ebp-07], 23
:004112E8 C645FA02 mov [ebp-06], 02
:004112EC C645FB64 mov [ebp-05], 64
:004112F0 C645FC3F mov [ebp-04], 3F
:004112F4 C645FD6C mov [ebp-03], 6C
:004112F8 C645FEF1 mov [ebp-02], F1
:004112FC C645FF0F mov [ebp-01], 0F
:00411300 E8DBCA0000 call 0041DDE0
:00411305 85C0 test eax, eax
:00411307 59 pop ecx
:00411308 7E48 jle 00411352
:0041130A 57 push edi
:0041130B 8D7D80 lea edi, dword ptr [ebp-80]
:0041130E 8BCE mov ecx, esi
:00411310 2BFE sub edi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041134F(C)
|
:00411312 8A11 mov dl, byte ptr [ecx]<-依次取注册名
:00411314 84D2 test dl, dl
:00411316 7D04 jge 0041131C
:00411318 F6DA neg dl
:0041131A 8811 mov byte ptr [ecx], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411316(C)
|
:0041131C 8A140F mov dl, byte ptr [edi+ecx]<-<-依次取48,ee,76.
:0041131F 3211 xor dl, byte ptr [ecx]<-与注册名的ASC码XOR
:00411321 80FA30 cmp dl, 30<-比较
:00411324 8811 mov byte ptr [ecx], dl
:00411326 7D0F jge 00411337 <-大于或等于就跳
:00411328 0FBED2 movsx edx, dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411335(U)
|
:0041132B 83FA30 cmp edx, 00000030<-比较
:0041132E 7D07 jge 00411337<-大于或等于就跳
:00411330 83C203 add edx, 00000003<-加3
:00411333 8811 mov byte ptr [ecx], dl
:00411335 EBF4 jmp 0041132B<-循环

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00411326(C), :0041132E(C)
|
:00411337 8A11 mov dl, byte ptr [ecx]
:00411339 80FA39 cmp dl, 39<-比较
:0041133C 7E0F jle 0041134D<-小于或等于就跳
:0041133E 0FBED2 movsx edx, dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041134B(U)
|
:00411341 83FA39 cmp edx, 00000039<-比较
:00411344 7E07 jle 0041134D<-小于或等于就跳
:00411346 83EA03 sub edx, 00000003<-减3
:00411349 8811 mov byte ptr [ecx], dl
:0041134B EBF4 jmp 00411341<-循环，

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041133C(C), :00411344(C)
|
:0041134D 41 inc ecx
:0041134E 48 dec eax<-EAX减一（EAX注册名长度）
:0041134F 75C1 jne 00411312<-循环（到注册名取完）
:00411351 5F pop edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411308(C)
|
:00411352 FF750C push [ebp+0C]
:00411355 56 push esi <-真正的注册码(D ESI)
:00411356 E815C10000 call 0041D470
:0041135B F7D8 neg eax
:0041135D 59 pop ecx
:0041135E 1BC0 sbb eax, eax
:00411360 59 pop ecx
:00411361 40 inc eax
:00411362 5E pop esi
:00411363 C9 leave
:00411364 C20800 ret 0008

总结：依次取注册名于48,ee,76..XOR,其结果通过加3或减3，使之界于30~39之间（0~9）
NAME:jieao[CCG]
CODE:1217220771

标 题:贴个注册机 (2千字)
发信人:6767[BCG]
时 间:2001-7-27 19:38:40
详细信息:

 //---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::sbExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Image1DblClick(TObject *Sender)
{
Application->MessageBoxA("Http://********", "Welcome", NULL);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::sbCopyClick(TObject *Sender)
{
if(edtCode->Text.IsEmpty())
return;
// copy to clipboard
Clipboard()->SetTextBuf(edtCode->Text.c_str());
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::sbComputeClick(TObject *Sender)
{
char cMixer[31]={0x48,0xEE,0x76,0x1D,0x67,0x69,0xA1,0x1B
,0x7A,0x8C,0x47,0xF8,0x54,0x95,0x97,0x5F
,0x78,0xD9,0xDA,0x6C,0x59,0xD7,0x6B,0x35
,0xC5,0x77,0x85,0x18,0x2A,0x0E,0x52};
char *pName;        //point to edtName->Text
int i, nLen;        //Counter, Length of Name
nLen=edtName->Text.Length();

// check if name leagle
if(nLen==0)
return;
if(nLen<4)
{
Application->MessageBoxA("ah!!Name should be at
  least 4 characters.", "Dennied", NULL);
return;
}
if(nLen>31)
{
Application->MessageBoxA("Don't u think your Name
  is too long?", "Dennied", NULL);
return;
}

pName=edtName->Text.c_str();
// generate RegCode here
for(i=0; i<nLen; i++)
{
cMixer[i]^=*(pName+i);
while(cMixer[i]<0x30)
cMixer[i]+=3;
while(cMixer[i]>0x39)
cMixer[i]-=3;
}
cMixer[i]='\0';
// show it now
edtCode->Text=cMixer;
// select name for another input
edtName->SelectAll();
}
//---------------------------------------------------------------------------


鼠标增强工具MouseStar 2.1

 标 题:申请加入BCG破文第一篇：鼠标增强工具MouseStar 2.1破解过程。请老大多多指教。 (7千字)
发信人:皇贤
时 间:2001-7-27 21:46:09
详细信息:
鼠标增强工具MouseStar 2.1破解过程：
CRACKTOOLS：regshot、trw2000 1.23、W32DASM中文版、Ultraedit 8.10a、language 2000 V4.5
1、习惯性动作：安装前用REGSHOT搞一下。
2、习惯性动作：用language 2000 V4.5查文件是否加壳，所幸，没。
3、习惯性动作：用W32DASM反汇编一下，看是否有线索（即注册失败与成功的提示字符串）
所幸找到三处“感谢注册”，如下：

:0047E3A2 8D55F8 lea edx, dword ptr [ebp-08]
:0047E3A5 E88A9BF8FF call 00407F34
:0047E3AA 837DF800 cmp dword ptr [ebp-08], 00000000
:0047E3AE 0F84C1000000 je 0047E475
:0047E3B4 8D55FC lea edx, dword ptr [ebp-04]
:0047E3B7 A1284B4800 mov eax, dword ptr [00484B28]
:0047E3BC 8B00 mov eax, dword ptr [eax]
:0047E3BE E861340000 call 00481824
:0047E3C3 8D55F0 lea edx, dword ptr [ebp-10]
:0047E3C6 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:0047E3CC E8E7E6FAFF call 0042CAB8
:0047E3D1 8B45F0 mov eax, dword ptr [ebp-10] //直觉感到这里是取我们输入的注册码
:0047E3D4 8B55FC mov edx, dword ptr [ebp-04] //则这里就有可能是真正的注册码。
:0047E3D7 E8545AF8FF call 00403E30
:0047E3DC 0F8593000000 jne 0047E475

* Possible StringData Ref from Code Obj ->"感谢注册"
|
:0047E3E2 BAB4E44700 mov edx, 0047E4B4
:0047E3E7 8B83D4020000 mov eax, dword ptr [ebx+000002D4]

马上用TRW2000来验证一下，运行mousestar.exe，输入注册码78787878，调出TRW2000，BPX 0047E3D1，F5，
点注册，⊙_⊙，没拦下？倒，看来直觉是失误了，呵。
不怕再看下面：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00481107(C), :0048113B(U)
|
:00481153 8BC3 mov eax, ebx
:00481155 E80E030000 call 00481468
:0048115A 80BBBB04000000 cmp byte ptr [ebx+000004BB], 00
:00481161 7456 je 004811B9

* Possible StringData Ref from Code Obj ->"感谢注册"
|
:00481163 BAC4124800 mov edx, 004812C4

还有：
:004818EC 0300 add eax, dword ptr [eax]
:004818EE 0000 add byte ptr [eax], al
:004818F0 312E xor dword ptr [esi], ebp
:004818F2 3000 xor byte ptr [eax], al
:004818F4 55 push ebp
:004818F5 8BEC mov ebp, esp
:004818F7 33C9 xor ecx, ecx
:004818F9 51 push ecx
:004818FA 51 push ecx
:004818FB 51 push ecx
:004818FC 51 push ecx
:004818FD 53 push ebx
:004818FE 8BD8 mov ebx, eax
:00481900 33C0 xor eax, eax
:00481902 55 push ebp
:00481903 68FC194800 push 004819FC
:00481908 64FF30 push dword ptr fs:[eax]
:0048190B 648920 mov dword ptr fs:[eax], esp
:0048190E 8D55F4 lea edx, dword ptr [ebp-0C]
:00481911 8B83A4030000 mov eax, dword ptr [ebx+000003A4]
:00481917 E89CB1FAFF call 0042CAB8
:0048191C 8B45F4 mov eax, dword ptr [ebp-0C]
:0048191F 8D55F8 lea edx, dword ptr [ebp-08]
:00481922 E80D66F8FF call 00407F34
:00481927 837DF800 cmp dword ptr [ebp-08], 00000000
:0048192B 0F84A3000000 je 004819D4
:00481931 8D55FC lea edx, dword ptr [ebp-04]
:00481934 8BC3 mov eax, ebx
:00481936 E8E9FEFFFF call 00481824
:0048193B 8D55F0 lea edx, dword ptr [ebp-10]
:0048193E 8B83A4030000 mov eax, dword ptr [ebx+000003A4]
:00481944 E86FB1FAFF call 0042CAB8
:00481949 8B45F0 mov eax, dword ptr [ebp-10] //这里也象上面一样哟
:0048194C 8B55FC mov edx, dword ptr [ebp-04] //也下个断点试试。
:0048194F E8DC24F8FF call 00403E30 //真假对比。
:00481954 757E jne 004819D4 //暴破改这里为NOP NOP

* Possible StringData Ref from Code Obj ->"感谢注册"
|
:00481956 BA101A4800 mov edx, 00481A10
:0048195B 8B83A4030000 mov eax, dword ptr [ebx+000003A4]

退出MouseStar，重复上次的操作，下BPX 00481949，F5，注册，YES！拦到了。

F10两次，走到0048194F上，
D EAX, 显示78787878，有门，D EDX，显示336b9f6b，明码显示？！就是它？！

抄下。BC *

重新运行MouseStar，用336b9f6b注册，出现“感谢注册”，成功。

退出MouseStar，第二次运行REGSHOT并对比：

**Original contents Maybe deleted or modified**
NONE!

**Keys&Values Modified | Added in the 2ndShot**
H.U\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021492-0000-0000-C000-000000000046}
H.U\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021492-0000-0000-C000-000000000046}\Enum
H.U\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021492-0000-0000-C000-000000000046}\Enum\Implementing: 1C 00 00 00 01 00 00 00 D1 07 07 00 05 00 1B 00 0A 00 35 00 39 00 8C 00 02 00 00 00 21 BF 5C 0E 5F D1 D0 11 83 01 00 AA 00 5B 43 83 81 45 E0 01 EE 4E D0 11 BF E9 00 AA 00 5B 43 83
H.U\.DEFAULT\Software\Microsoft\Windows\ShellNoRoam\MUICache\@browselc.dll,-13138: "链接(&L)"
H.U\.DEFAULT\Software\Microsoft\Windows\ShellNoRoam\MUICache\@browselc.dll,-13137: "地址(&A)"
H.U\.DEFAULT\Software\MouseStar 1.0
H.U\.DEFAULT\Software\MouseStar 1.0\Key: "336b9f6b" //呵呵，注册码在这

即然知道了比较的CALL，也就看进看看吧。先删除H.U\.DEFAULT\Software\MouseStar 1.0\Key: "336b9f6b"
让它还原成未注册版。

用W32DASM打开MouseStar.exe

进:0048194F E8DC24F8FF call 00403E30

:00403E30 53 push ebx
:00403E31 56 push esi
:00403E32 57 push edi
:00403E33 89C6 mov esi, eax
:00403E35 89D7 mov edi, edx
:00403E37 39D0 cmp eax, edx //就是这里了。
:00403E39 0F848F000000 je 00403ECE
:00403E3F 85F6 test esi, esi
:00403E41 7468 je 00403EAB
:00403E43 85FF test edi, edi
:00403E45 746B je 00403EB2
:00403E47 8B46FC mov eax, dword ptr [esi-04]
:00403E4A 8B57FC mov edx, dword ptr [edi-04]
:00403E4D 29D0 sub eax, edx
:00403E4F 7702 ja 00403E53
:00403E51 01C2 add edx, eax

好，用CRACKCODE2000做个注册机
CRACKCODE.INI内容为：
[Options]
CommandLine=mousestar.exe
Mode=2 //程序运行到00481949赋值后回0040E30对比，所以用增强模式
First_Break_Address=48194F //调用的CALL的偏移地址
First_Break_Address_Code=E8 //此CALL的第一个字节
First_Break_Address_Code_Lenth=5 //此调用语句共5个字节
Second_Break_Address=403E37 //真假码对比处的偏移地址
Second_Break_Address_Code=39 //语句的第一个字节
Second_Break_Address_Code_Lenth=2 //共有2个字节
Save_Code_Address=EDX //放真注册码的地方

测试，成功。

再试一下暴破，将:00481954处的757E改为9090，成功。
并自动写注册表H.U\.DEFAULT\Software\MouseStar 1.0\Key: "336b9f6b"

皇贤 2001.7.27


腾博条形码生产-管理系统

 标 题:腾博条形码生产-管理系统破解过程，看完后大家不准扔鞋^_^ (2千字)
发信人:xy2000[BCG]
时 间:2001-6-26 13:26:47
详细信息:
作者：xy2000[BCG]
腾博条形码生产者-管理系统

下载地址：http://www.csdn.net/soft/openfile.asp?kind=1&id=11414
工具：W32DSM（大老专版），TRW2000

* Possible StringData Ref from Data Obj ->"注册号："
|
:0040B263 BACA7E5000 mov edx, 00507ECA
:0040B268 8D45CC lea eax, dword ptr [ebp-34]
:0040B26B E880600E00 call 004F12F0
:0040B270 FF461C inc [esi+1C]

* Possible StringData Ref from Data Obj ->"请输入注册号"
|
:0040B273 BABD7E5000 mov edx, 00507EBD
:0040B278 8B08 mov ecx, dword ptr [eax]
:0040B27A 8D45D0 lea eax, dword ptr [ebp-30]
:0040B27D 51 push ecx
:0040B27E 66C746107400 mov [esi+10], 0074
:0040B284 E867600E00 call 004F12F0
:0040B289 FF461C inc [esi+1C]
:0040B28C 8B00 mov eax, dword ptr [eax]
:0040B28E 8D4DFC lea ecx, dword ptr [ebp-04]
:0040B291 5A pop edx
:0040B292 E8C5D30900 call 004A865C
:0040B297 50 push eax
:0040B298 FF4E1C dec [esi+1C]
:0040B29B 8D45CC lea eax, dword ptr [ebp-34]
:0040B29E BA02000000 mov edx, 00000002
:0040B2A3 E8A8610E00 call 004F1450
:0040B2A8 FF4E1C dec [esi+1C]
:0040B2AB 8D45D0 lea eax, dword ptr [ebp-30]
:0040B2AE BA02000000 mov edx, 00000002
:0040B2B3 E898610E00 call 004F1450
:0040B2B8 59 pop ecx
:0040B2B9 84C9 test cl, cl
:0040B2BB 0F845CFFFFFF je 0040B21D
:0040B2C1 66C746108000 mov [esi+10], 0080

* Possible StringData Ref from Data Obj ->"Tb1765431Xm" 大家看看这是什么，注册码是明文，哈哈
|
:0040B2C7 BAD37E5000 mov edx, 00507ED3
:0040B2CC 8D45C8 lea eax, dword ptr [ebp-38] 这里下d edx 也可看到注册码
:0040B2CF E81C600E00 call 004F12F0
:0040B2D4 FF461C inc [esi+1C]
:0040B2D7 8D55C8 lea edx, dword ptr [ebp-38]
:0040B2DA 8D45FC lea eax, dword ptr [ebp-04]
:0040B2DD E852620E00 call 004F1534
:0040B2E2 50 push eax
:0040B2E3 FF4E1C dec [esi+1C]
:0040B2E6 8D45C8 lea eax, dword ptr [ebp-38]
:0040B2E9 BA02000000 mov edx, 00000002
:0040B2EE E85D610E00 call 004F1450
:0040B2F3 59 pop ecx
:0040B2F4 84C9 test cl, cl
:0040B2F6 741D je 0040B315
:0040B2F8 A1BC2F5100 mov eax, dword ptr [00512FBC]
:0040B2FD 6A00 push 00000000


体育彩票随机号码产生器 v3.3

标 题:用r fl z使体育彩票随机号码产生器 v3.3 自动注册。 (1千字)
发信人:THK
时 间:2001-3-25 21:27:28
详细信息:
工具：trw1.22
目的：耍一伙
load
注册码：31415926 （听SB的没错^_^)
Ctrl-N
bpx hmemcpy
g
:0041E9BB FF15C0324200 Call dword ptr [004232C0]
:0041E9C1 50 push eax

* Reference To: MSVBVM50.__vbaBoolVarNull, Ord:0000h
|
:0041E9C2 FF1588324200 Call dword ptr [00423288]
:0041E9C8 6685C0 test ax, ax
:0041E9CB B804000280 mov eax, 80020004
:0041E9D0 B90A000000 mov ecx, 0000000A
:0041E9D5 8985D8FEFFFF mov dword ptr [ebp+FFFFFED8], eax
:0041E9DB 898DD0FEFFFF mov dword ptr [ebp+FFFFFED0], ecx
:0041E9E1 8985E8FEFFFF mov dword ptr [ebp+FFFFFEE8], eax
:0041E9E7 898DE0FEFFFF mov dword ptr [ebp+FFFFFEE0], ecx
:0041E9ED 0F842C070000 je 0041F11F -------在此下r fl z
:0041E9F3 BF08000000 mov edi, 00000008
:0041E9F8 8D9590FEFFFF lea edx, dword ptr [ebp+FFFFFE90]
:0041E9FE 8D8DF0FEFFFF lea ecx, dword ptr [ebp+FFFFFEF0]

* Possible StringData Ref from Code Obj ->"鑜孮xcknx �鲖蛻癳袕L坉ko忲N0"
|
:0041EA04 C78598FEFFFF4C964000 mov dword ptr [ebp+FFFFFE98], 0040964C
:0041EA0E 89BD90FEFFFF mov dword ptr [ebp+FFFFFE90], edi

不但能自动注册成功，而且会在当前目录下建立registed.txt文件，内容如下：
体育彩票随机号码产生器 v3.3 注册成功
机器码为： 537921887 注册码为： 537933795


天网防火墙个人版2.0.2.98

标 题:天网防火墙个人版2.0.2.98(beta)的破解，参考TAE!的破解。 (5千字)
发信人:zest
时 间:2001-2-10 14:04:48
详细信息:
天网防火墙个人版2.0.2.98(beta)的破解，参考TAE!的破解。
程序：电脑报合订本2000配套光盘。
目标：找出注册码。
工具：TRW2K&W32DASM
如有雷同，纯属巧合。
================================================================================
1、首先：
* Possible StringData Ref from Data Obj ->" 注册成功！ 谢谢您的注册。"
|
:0040AFBE BA11004D00 mov edx, 004D0011
:0040AFC3 8D45DC lea eax, dword ptr [ebp-24]
:0040AFC6 E821DF0B00 call 004C8EEC
:0040AFCB FF461C inc [esi+1C]
:0040AFCE 8B00 mov eax, dword ptr [eax]
:0040AFD0 E8A7930500 call 0046437C
:0040AFD5 FF4E1C dec [esi+1C]
:0040AFD8 8D45DC lea eax, dword ptr [ebp-24]
:0040AFDB BA02000000 mov edx, 00000002
:0040AFE0 E823E00B00 call 004C9008
:0040AFE5 8BC3 mov eax, ebx
:0040AFE7 E898E80400 call 00459884
:0040AFEC EB2D jmp 0040B01B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AE92(C)==>注意！看看！
|
:0040AFEE 66C746103800 mov [esi+10], 0038

* Possible StringData Ref from Data Obj ->"密码和用户名不对，请注意检查大小写。"
|
:0040AFF4 BA2C004D00 mov edx, 004D002C
=================================================================================
2、往上看看这里：
:0040AE51 E8C6AEFFFF call 00405D1C==>此CALL重要！进入！
* Reference To: snfw._frmMain
|
:0040AE56 8B15D8864D00 mov edx, dword ptr [004D86D8]
:0040AE5C 8B12 mov edx, dword ptr [edx]
:0040AE5E 888205030000 mov byte ptr [edx+00000305], al==>注意
:0040AE64 FF4E1C dec [esi+1C]
:0040AE67 8D45F8 lea eax, dword ptr [ebp-08]
:0040AE6A BA02000000 mov edx, 00000002
:0040AE6F E894E10B00 call 004C9008
:0040AE74 FF4E1C dec [esi+1C]
:0040AE77 8D45FC lea eax, dword ptr [ebp-04]
:0040AE7A BA02000000 mov edx, 00000002
:0040AE7F E884E10B00 call 004C9008
:0040AE84 A1D8864D00 mov eax, dword ptr [004D86D8]
:0040AE89 8B38 mov edi, dword ptr [eax]
:0040AE8B 80BF0503000000 cmp byte ptr [edi+00000305], 00==>注意
:0040AE92 0F8456010000 je 0040AFEE==>注意！

=================================================================================
3、进入call 00405D1C看看：
* Referenced by a CALL at Addresses:
|:004060B8 , :0040AE51 ==>可返回004060B8看看是TAE!关键处。
|
:00405D1C 55 push ebp
:00405D1D 8BEC mov ebp, esp
:00405D1F 81C474FFFFFF add esp, FFFFFF74
:00405D25 B81CDA4C00 mov eax, 004CDA1C
......
......
......
......
:00405EB5 8D45EC lea eax, dword ptr [ebp-14]
:00405EB8 5A pop edx
:00405EB9 E82E320C00 call 004C90EC==>关键CALL进入！
:00405EBE 50 push eax
:00405EBF FF4E1C dec [esi+1C]
:00405EC2 8D45E8 lea eax, dword ptr [ebp-18]
:00405EC5 BA02000000 mov edx, 00000002
:00405ECA E839310C00 call 004C9008
:00405ECF FF4E1C dec [esi+1C]
:00405ED2 8D45EC lea eax, dword ptr [ebp-14]
:00405ED5 BA02000000 mov edx, 00000002
:00405EDA E829310C00 call 004C9008
:00405EDF FF4E1C dec [esi+1C]
:00405EE2 8D45F0 lea eax, dword ptr [ebp-10]
:00405EE5 BA02000000 mov edx, 00000002
:00405EEA E819310C00 call 004C9008
:00405EEF FF4E1C dec [esi+1C]
:00405EF2 8D45F4 lea eax, dword ptr [ebp-0C]
:00405EF5 BA02000000 mov edx, 00000002
:00405EFA E809310C00 call 004C9008
:00405EFF FF4E1C dec [esi+1C]
:00405F02 8D45F8 lea eax, dword ptr [ebp-08]
:00405F05 BA02000000 mov edx, 00000002
:00405F0A E8F9300C00 call 004C9008
:00405F0F FF4E1C dec [esi+1C]
:00405F12 8D45FC lea eax, dword ptr [ebp-04]
:00405F15 BA02000000 mov edx, 00000002
:00405F1A E8E9300C00 call 004C9008
:00405F1F 58 pop eax
:00405F20 8B0E mov ecx, dword ptr [esi]
:00405F22 64890D00000000 mov dword ptr fs:[00000000], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DFE(U)
|
:00405F29 5E pop esi
:00405F2A 5B pop ebx
:00405F2B 8BE5 mov esp, ebp
:00405F2D 5D pop ebp
:00405F2E C3 ret
==========================================================================
4、进入call 004C90EC看看：
* Referenced by a CALL at Addresses:
|:00405B00 , :00405B3E , :00405EB9 , :004064B3 , :00407F5B
|:00408059 , :004083C5
|
:004C90EC 55 push ebp
:004C90ED 8BEC mov ebp, esp
:004C90EF 53 push ebx
:004C90F0 8B00 mov eax, dword ptr [eax]==>看看这里cool code
:004C90F2 8B12 mov edx, dword ptr [edx]==>看看这里your bad code
:004C90F4 E8E7E8FDFF call 004A79E0 ==>看看里面
:004C90F9 0F94C0 sete al ==>看看
:004C90FC 83E001 and eax, 00000001 ==>看
:004C90FF 5B pop ebx
:004C9100 5D pop ebp
:004C9101 C3 ret
===========================================================================
5、结论：
UserName=zest
RegisterKey=9ED4
===========================================================================

/\zest/\
2001.2


天音怒放2.15

 序 号:17977
标 题:天音怒放2.15注册码跟踪过程 (3千字)
发信人:CrackerABC[BCG]
时 间:2001-5-6 14:22:03
详细信息:
天音怒放2.15注册码跟踪过程

姓名：CrackerABC[BCG]
注册码：612-4972-13

下面是过程：

首先随便输入任意注册码：12121212

启动TRW2000，然后使用搜索法

s 30:0 l ffffffff '12121212'
找到一个地址 *********
然后下 BPM 30:********

F5返回程序空间，点注册被拦截
下BD *
PMODULE
被拦截到这里：

0167:004382BE CALL `USER32!CallWindowProcA`
0167:004382C3 MOV [EBX+0C],EAX
0167:004382C6 MOV EAX,[EBX]
0167:004382C8 CMP EAX,BYTE +0C
0167:004382CB JNZ 004382E8

然后一直小心的F10到下面位置：

0167:004AA146 LEA EDX,[EBP-08]
0167:004AA149 MOV EAX,[EBX+02E8]
0167:004AA14F CALL 0043451C
0167:004AA154 MOV EAX,[EBP-08]
0167:004AA157 POP EDX
0167:004AA158 CALL 004BA774 //----->典型比对，F8跟进去
0167:004AA15D TEST AL,AL
0167:004AA15F JZ 004AA16B
0167:004AA161 MOV DWORD [EBX+0234],01
0167:004BA7AD MOV DL,01
0167:004BA7AF MOV EAX,[004B9A9C]
0167:004BA7B4 CALL 004BF380
0167:004BA7B9 MOV EBX,EAX
0167:004BA7BB CMP BYTE [EBX+10],00
0167:004BA7BF JZ 004BA83B

F8跟进来以后F10 到下面位置：

0167:004BA7AA MOV ECX,[EBP-04]
0167:004BA7AD MOV DL,01
0167:004BA7AF MOV EAX,[004B9A9C]
0167:004BA7B4 CALL 004BF380
0167:004BA7B9 MOV EBX,EAX //--------> D EAX 得到注册码，是后面的那个。注意格式是 ***-****-**
0167:004BA7BB CMP BYTE [EBX+10],00
0167:004BA7BF JZ 004BA83B
0167:004BA7C1 MOV EAX,[004C3360]
0167:004BA7C6 MOV EAX,[EAX]
0167:004BA7C8 MOV EDX,[EAX+049C]
0167:004BA7CE LEA EAX,[EBP-10]
0167:004BA7D1 MOV ECX,004BA88C
0167:004BA7D6 CALL 00404004
0167:004BA7DB MOV ECX,[EBP-10]
0167:004BA7DE MOV DL,01
0167:004BA7E0 MOV EAX,[00472E94]
0167:004BA7E5 CALL 00472F3C
0167:004BA7EA MOV ESI,EAX
0167:004BA7EC MOV EAX,[EBP-04]
0167:004BA7EF PUSH EAX
0167:004BA7F0 MOV ECX,004BA89C
0167:004BA7F5 MOV EDX,004BA8B0
0167:004BA7FA MOV EAX,ESI
0167:004BA7FC MOV EDI,[EAX]
0167:004BA7FE CALL NEAR [EDI+04]
0167:004BA801 MOV EAX,[EBP-08]
0167:004BA804 PUSH EAX
0167:004BA805 MOV ECX,004BA8C0
0167:004BA80A MOV EDX,004BA8B0
0167:004BA80F MOV EAX,ESI
0167:004BA811 MOV EDI,[EAX]
0167:004BA813 CALL NEAR [EDI+04]
0167:004BA816 MOV EAX,ESI
0167:004BA818 CALL 00402FD0
0167:004BA81D MOV EAX,004BA8D4
0167:004BA822 CALL 0045A750
0167:004BA827 MOV EAX,[004C3360]
0167:004BA82C MOV EAX,[EAX]
0167:004BA82E MOV BYTE [EAX+049A],01
0167:004BA835 MOV BYTE [EBP-09],01
0167:004BA839 JMP SHORT 004BA849
0167:004BA83B MOV BYTE [EBP-09],00
0167:004BA83F MOV EAX,004BA8F4
0167:004BA844 CALL 0045A750 //------>出错了，注册不正确。
0167:004BA849 MOV EAX,EBX
0167:004BA84B CALL 00402FD0

*************************************************

主页：http://crackerabc.longcity.net （[BCG]大本营）

软件破解，软件注册，破解教学，破解申请，注册机码。

请保留我的信息，谢谢！

**************************************************

标 题:从新贴注册机，原来那个注册机有我的一个眼误~~~呵呵~~所以用户名超过11位的都不能正确注册 (1千字)
发信人:伪装者[CCG]
时 间:2001-5-6 16:22:54
详细信息:

 #include "stdio.h"
main()
{
char string[81];
long pw[12]={0x185a5411,0x2afc4281,0x28a912b5,0x0f732f09,
0x119fe5f2,0x0bb026fd,0x120abb66,0x0ac01ff5,
0x29a9f2f0,0x3541c352,0x353a745c,0x388a8742/*原来的注册机就错在这！原来是0x288a8742这是因为我不小心看错了，呵呵~~）*/};
long d,e=0;
int i,c;
printf("******TYPLAYER 2.15********\nThis keygen is made by Pretender\nPlease
  input your name : ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c<0) c+=256;
if(c>96&&c<123) c-=32;
d=pw[(i+1)%12]*c;
e+=d;
}
printf("Your name is          : ");
puts(string);
e=(0x7fffffff-e)*0xd3;
if(e>0)
{d=e;d/=10;
if(d<100000000) d=d*10+8;
if(d<10000000) d=d*100+45;
if(d<1000000) d=d*1000+738;
if(d<100000) d=d*10000+7338;
if(d<10000) d=d*100000+83690;
if(d<1000) d=d*1000000+309678;
if(d<100) d=d*10000000+2467309;
if(d<10) d=d*100000000+13247685;}
if(e<0)
{d=-e;
if(d<100000000) d=d*10+8;
if(d<10000000) d=d*100+45;
if(d<1000000) d=d*1000+738;
if(d<100000) d=d*10000+7338;
if(d<10000) d=d*100000+83690;
if(d<1000) d=d*1000000+309678;
if(d<100) d=d*10000000+2467309;
if(d<10) d=d*100000000+13247685;}
for(i=0;i<9;i++)
{string[i]=d%10;
d=d/10;}
printf("Your Register code is  : ");
for(i=0;i<9;i++)
{printf("%d",string[8-i]);
if(i==2||i==6) printf("-");}
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


通用电脑语音系统

 标 题:通用电脑语音系统（V－2000版）注册码分析
发信人:chn-boy
时 间:2000-12-2 23:10:26
详细信息:
软件名称： 通用电脑语音系统（V-2000版）
下载地址： http://www.newhua.com.cn
此文目的： 如何获得该软件的注册码
调试工具： SoftICE4.05、W32dsm89.exe
调试平台： Win2K

作者： chn-boy
写作日期： 2000-12-02

运行程序，进入软件注册对话框，输入Virtual Code，我输入的是：
软件编号： 573445893. <-- 此编号为程序固有，不能改动。
输入注册码：32194866
CTRL+D启用SoftICE4.05，下中断bpx MessageBoxExA，当出错对话框弹出时，
程序会被拦断，bc *去掉MessageBoxExA中断，按F12回到程序领空，接下来就
是我们艰苦的破解历程。
往上察看程序代码，看看有没有可疑的跳转？如果有，那么在该处下中断
后重新再来一次注册。这是一般常识了。。：）（啊，谁又拿臭鸡蛋扔我？）。
我仔细看了一下，好像没有什么可疑的跳转处，那么我们就按F12回到上一级
Call（为什么？因为在这个Call里出现的错误对话框嘛），再往上看看有没有
可疑之处？就这样一路按F12，忽然发现指标不再进入程序领空，一通狂按F12
后，程序就退回到Windows了，是不是出错了？嘿嘿，不要急嘛，其实程序并没
有完全退出来，SoftICE仍然纪录着信息，只不过在一个Call中循回运行罢了，
再次点击注册，在密码框中输入32194866，然后点击注册，看看，哈，SoftICE
出来了（so beautiful）。F12进入程序领空，在进入领空处下个中断，以后会
用到，得到的程序代码段为：

:00405511 C745FC00000000 mov [ebp-04], 00000000
:00405518 8D4D8C lea ecx, dword ptr [ebp-74]
:0040551B E840F30000 Call 00414860
:00405520 8D45EC lea eax, dword ptr [ebp-14] <-- 进入领空处

:00405523 50 push eax <-- 断点下在该处，此时要是
<-- d *eax，你可以看到你输
<-- 入的Virtual Code

:00405524 8D4DF0 lea ecx, dword ptr [ebp-10]
:00405527 E80EF50000 Call 00414A3A
:0040552C C645FC01 mov [ebp-04], 01
:00405530 8D8D28FEFFFF lea ecx, dword ptr [ebp+FFFFFE28]
:00405536 51 push ecx
:00405537 8B8D14FEFFFF mov ecx, dword ptr [ebp+FFFFFE14]

:0040553D E807FEFFFF call 00405349 <-- 这个Call里面就是
<-- 注册码的算法，我
<-- 将在下面给出分析

:00405542 898510FEFFFF mov dword ptr [ebp+FFFFFE10], eax
:00405548 8B9510FEFFFF mov edx, dword ptr [ebp+FFFFFE10]
:0040554E 89950CFEFFFF mov dword ptr [ebp+FFFFFE0C], edx
:00405554 C645FC02 mov [ebp-04], 02
:00405558 8B850CFEFFFF mov eax, dword ptr [ebp+FFFFFE0C]
:0040555E 50 push eax
:0040555F 8D4DF0 lea ecx, dword ptr [ebp-10]
:00405562 51 push ecx

:00405563 E8380E0000 call 004063A0 <-- 当程序运行到此处时，
<-- d *ecx，你可以看到
<-- 你输入的Virtual Code
<-- d *eax，你就能看到
<-- 正确的密码了。:)

:00405568 25FF000000 and eax, 000000FF
:0040556D 85C0 test eax, eax
:0040556F 755C jne 004055CD
:00405571 8D9520FEFFFF lea edx, dword ptr [ebp+FFFFFE20]
:00405577 52 push edx

【算法分析】
整个算法是这样：先将你的软件编号（比如我的是573445893.）中每个字符值
*1000，和累加，再加上100000（0x186A0）。得到的值取补——C语言的实现就是
name_number = ~name_number + 1; 取补后的值减去0x00D9C8FD，得到的name_number
是个负数，我的是：-14898765（0xFF1CA9B3），并将其转换成字符串'-14898765'。
然后将第0个字符和第3个字符交换，第2个字符和第5个字符交换，得到一个新的字符
串'818-94765'，这就是正确的注册码。
算法的实现参看前面所写的注册机。


通用文档微机管理系统 V1.0

 标 题:加入FCG的见面破文，初学者可以看 小球 peterchen 伪装者等等不许看！！ (4千字)
发信人:copyyour[FCG]
时 间:2001-6-22 23:47:11
详细信息:
下手软件：
通用文档微机管理系统 V1.0 单机版

下载地址：http://www.skycn.com/down1.php?id=5811&url=http://202.107.104.34/soft/down/xhonghuisetupV1.0.exe

软件用途：
年终岁首，文书归档立卷工作是办公室一项十分头痛的事，传统的手工抄写文件级目录不仅劳动量大，而且难以规范统一，更重要的是即使立卷工作完成了，但查档并不轻松，为此我们严格依照最新的档案管理国家标准，开发了这套软件，立足档案室工作实际，解决基层档案工作具体问题，做到打印卷内目录整洁美观，查找档案既快又准，为促进档案管理的规范化和正规化打好基础。

破解原因：
为了加入FCG,成为“三冠王”

使用工具：soft-ice,ursoft w32dasm (kanker赠送版，反编译中文效果奇好！！) hiew 640注册版

破解过程：

首先启动软件，观察软件的注册方式，发现这个软件采用的一机一码的方式,首先看见了机器码（准备暑假学习，机器码的产生方式和学习注册机的制作了）在注册码的位置填写copyyour,这个任意写，ctrl+d凋出soft-ice
下断点hmemcpy 按f12一共12次，地13次时会出错，好，我们现在通过反编译来看看代码：

如下：

:005FF1A1 8D55F4 lea edx, dword ptr [ebp-0C] ======>>>>进入后光标在这里
:005FF1A4 8B87DC020000 mov eax, dword ptr [edi+000002DC]
:005FF1AA E8E5A1E3FF call 00439394
:005FF1AF 8B45F4 mov eax, dword ptr [ebp-0C]
:005FF1B2 8D55F8 lea edx, dword ptr [ebp-08]
:005FF1B5 E8C2ACE0FF call 00409E7C
:005FF1BA 8B45F8 mov eax, dword ptr [ebp-08] ===========此处是错误的注册码
:005FF1BD 8B55FC mov edx, dword ptr [ebp-04]
:005FF1C0 E8E350E0FF call 004042A8 ===========此处edx发现正确注册码 没能进入次call观察，注册码的算法应该在这个call里面 初学者可按f8跟入
:005FF1C5 7419 je 005FF1E0 ===========千万不能让它跳

* Possible StringData Ref from Code Obj ->"注册失败"
|
:005FF1C7 B8D0F25F00 mov eax, 005FF2D0
:005FF1CC E85355E6FF call 00464724
:005FF1D1 8B87DC020000 mov eax, dword ptr [edi+000002DC]
:005FF1D7 33D2 xor edx, edx
:005FF1D9 E8E6A1E3FF call 004393C4
:005FF1DE EB52 jmp 005FF232

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005FF1C5(C)
|
:005FF1E0 B201 mov dl, 01
:005FF1E2 A1DCEC4F00 mov eax, dword ptr [004FECDC]
:005FF1E7 E85CFCEFFF call 004FEE48
:005FF1EC 8BD8 mov ebx, eax
:005FF1EE BA02000080 mov edx, 80000002
:005FF1F3 8BC3 mov eax, ebx
:005FF1F5 E82AFDEFFF call 004FEF24
:005FF1FA B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\Microsoft\Windows\CurrentVersion\Gene"
->"ral document" =========== 从这里我们很轻松的就知道注册成功后 会写入注册表的哪个键值 从下面得知是 将在gc_id中发生变化，由于我开始没有注意，所以没能发现是什么变化
|
:005FF1FC BA6CF25F00 mov edx, 005FF26C
:005FF201 8BC3 mov eax, ebx
:005FF203 E860FEEFFF call 004FF068
:005FF208 84C0 test al, al
:005FF20A 7426 je 005FF232
:005FF20C 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"gc_id"
|
:005FF20E BAB0F25F00 mov edx, 005FF2B0
:005FF213 8BC3 mov eax, ebx
:005FF215 E8FE03F0FF call 004FF618
:005FF21A 8BC3 mov eax, ebx
:005FF21C E8D3FCEFFF call 004FEEF4
:005FF221 8BC3 mov eax, ebx
:005FF223 E8C83EE0FF call 004030F0

好了，你要爆破的话就用hiew修改:005FF1C5 7419 je 005FF1E0
74改75

想要得到注册码的话就在:005FF1C0 E8E350E0FF call 004042A8
下d edx将看到注册码

破解完成后，采用CodeFusion中文版制作补丁，这样会使补丁文件很小

补丁将在我朋友老虫网站发布 http://bugbug.6to23.com

另外这篇教程是破解后三小时写的，全凭记忆，可能会有出错的地方，请指正，谢谢

此篇文章版权为CCG BCG FCG 共同拥有

cracker by copyyour

标 题:贴这个2.1的注册机 (1千字)
发信人:伪装者[CCG]
时 间:2001-6-23 14:40:58
详细信息:

 #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <dos.h>

long sturn(char a[80])
{
int i,j,l;
long d,s=0;
l=strlen(a);
for(i=0;i<l;i++)
{if(a[i]>47&&a[i]<58) d=a[i]-48;
if(a[i]>64&&a[i]<71) d=a[i]-55;
if(a[i]>96&&a[i]<103) d=a[i]-87;
for(j=l-i;j>1;j--)
d*=16;
s+=d;}
return s;

}

main(void)
{
long sn;
char cc[4];
char serial_no[10];
union REGS r;
struct SREGS s;
unsigned sno1, sno2;
struct date today;
getdate(&today);
cc[0]=(today.da_mon/10)%10+65;
cc[1]=(today.da_mon/1)%10+66;
cc[2]=(today.da_mon/10)%10+67;
cc[3]=(today.da_mon/1)%10+68;
r.x.ax = 0x6900;
r.h.bl = 3; /* A:=1, B:=2, C:=3 etc. */
segread(&s);
intdosx(&r, &r, &s);
if (r.x.cflag)
*serial_no = "";
else
{
sno2 = *((unsigned far *)MK_FP(s.ds, r.x.dx+2));
sno1 = *((unsigned far *)MK_FP(s.ds, r.x.dx+4));
sprintf(serial_no, "%04X%04X", sno1, sno2);
}
/*printf("The Serial Number of Login Disk [C] is %s\n", serial_no );*/
sn=sturn(serial_no);
sprintf(serial_no,"%ld",sn);
/*printf("%s\n",serial_no);*/

printf(" ******FJWDGL 2.1********\n This keygen is made by Pretender\n ");
printf("Your Register code is:  ");
for(sn=0;sn<strlen(serial_no);sn++)
printf("%c",serial_no[sn]+17);
printf("%c",cc[0]);
printf("%c",cc[1]);printf("%c",cc[2]);printf("%c",cc[3]+1);
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


推箱子 202（275）

 标 题:《推箱子 202（275）破解》 ====>我们可以继续玩了，哈！ (5千字)
发信人:yuppc
时 间:2001-6-23 20:21:12
详细信息:
《推箱子 202（275）破解》 ====>我们可以继续玩了，哈！

破解人：yuppc
破解时间：2001.6.22
感谢：1212、THK

破解目的：为加入CCG而奋斗！！

1>初步分析:多次实验确实发现只要改动程序任何一点,启动时程序会自动关机,用execope检测其程序的内部结构,发现它是用Delphi编写,这下好办了.

2>结论:一定是函数的调用,并最后确定它调用了"ExitWindowsEx"函数.（幸好不是逻辑炸弹）^>^

3>用w32asm黄金版反汇编其主程序Cargador.exe,

4>到文件尾部,查找字符"exitwindow"

从文件尾开始查找：（个人习惯:-)）
* Referenced by a CALL at Addresses:
|:00404817 , :00404820 , :00404D63 , :00404D6C =====>四个调用处，记住
|

* Reference To: USER32.ExitWindowsEx, Ord:0000h
|
:00480EA2 FF25BCCA4A00 Jmp dword ptr [004ACABC]====>关机函数ExitwindowsEx的调用点

5>好了开始查找调用windows关机函数(按上面调用地址,共有四处):

:0040480E 3A4DBF cmp cl, byte ptr [ebp-41] ====>检测文件是否被改动
:00404811 7417 je 0040482A =======>关键跳(否,则调动下面函数)
:00404813 6A00 push 00000000
:00404815 6A02 push 00000002

* Reference To: USER32.ExitWindowsEx, Ord:0000h======>关闭windows函数调用(1)
|
:00404817 E886C60700 Call 00480EA2
:0040481C 6A00 push 00000000
:0040481E 6A00 push 00000000

* Reference To: USER32.ExitWindowsEx, Ord:0000h=======>关闭windows函数调用(2)
|
:00404820 E87DC60700 Call 00480EA2
:00404825 E984010000 jmp 004049AE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404811(C)
|
:0040482A A17CCD4900 mov eax, dword ptr [0049CD7C] =====>破解正确入口

6>查找第三、第四调用地址：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404D42(C)
|
:00404D4A 803DCA51490000 cmp byte ptr [004951CA], 00
:00404D51 741E je 00404D71 =======>关键跳
:00404D53 813DCC514900B0040000 cmp dword ptr [004951CC], 000004B0
:00404D5D 7E12 jle 00404D71 =======>关键跳
:00404D5F 6A00 push 00000000
:00404D61 6A02 push 00000002

* Reference To: USER32.ExitWindowsEx, Ord:0000h ======>关闭windows函数调用(3)
|
:00404D63 E83AC10700 Call 00480EA2
:00404D68 6A00 push 00000000
:00404D6A 6A00 push 00000000

* Reference To: USER32.ExitWindowsEx, Ord:0000h =======>关闭windows函数调用(4)
|
:00404D6C E831C10700 Call 00480EA2

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404D51(C), :00404D5D(C)
|
:00404D71 8D55AC lea edx, dword ptr [ebp-54] =======>破解正确入口

7>第二大步:查找程序启动检测注册源码段:

|:00402035(C)
|
:00401FF5 8B45FC mov eax, dword ptr [ebp-04] -----------------------------^-----------------------
:00401FF8 8A8405C5FEFFFF mov al, byte ptr [ebp+eax-0000013B] | |
:00401FFF 8B55FC mov edx, dword ptr [ebp-04] |
:00402002 3A84152AFFFFFF cmp al, byte ptr [ebp+edx-000000D6] ====>注册码单码比较 |
:00402009 7423 je 0040202E =======>关键跳(对,则跳) |
:0040200B C60564D1490000 mov byte ptr [0049D164], 00 |
:00402012 C605CED2490000 mov byte ptr [0049D2CE], 00 |
:00402019 A160D14900 mov eax, dword ptr [0049D160] 循环检测段
:0040201E 8B80E8020000 mov eax, dword ptr [eax+000002E8] |
:00402024 33D2 xor edx, edx |
:00402026 89500C mov dword ptr [eax+0C], edx |
:00402029 E91D030000 jmp 0040234B |
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:00402009(C) |
| |
:0040202E FF45FC inc [ebp-04] ====>循环增位 |
:00402031 837DFC07 cmp dword ptr [ebp-04], 00000007====>循环条件判断 |
:00402035 75BE jne 00401FF5 ======>循环跳(主要是循环比较注册码用,当[ebp-4]的值等于7时便继续运行)

8>分析完成,开始动手改动:
打开Hex shop找到"关键跳",将它们全部改成Jmp(明白了吗) :-)

9>测试结果:一个bug--->最高分记录停止 ====>那位高手继续
其他一切正常！！！！


推箱子1.6

标 题:新版推箱子1.6(2千字)
发信人:THK
时 间:2001-4-15 16:55:03
详细信息:
:00403199 EB6F jmp 0040320A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402CBD(C) //要注册成功，只有从00402CBD跳来
|

* Possible StringData Ref from Code Obj ->"恭喜你已经成功注册！"
|
:0040319B B888324000 mov eax, 00403288
:004031A0 E827310300 call 004362CC
:004031A5 8D85D0FDFFFF lea eax, dword ptr [ebp+FFFFFDD0]

----------------------------------------------------------
:00402C96 E83D6B0600 call 004697D8
:00402C9B FF45F8 inc [ebp-08]
:00402C9E 817DF801020000 cmp dword ptr [ebp-08], 00000201
:00402CA5 75DB jne 00402C82
:00402CA7 B8E0A14800 mov eax, 0048A1E0
:00402CAC E80B970600 call 0046C3BC
:00402CB1 E8226B0600 call 004697D8
:00402CB6 803DDCA1480000 cmp byte ptr [0048A1DC], 00//要跳，这0048A1DC不能为0，所以下bpm 48a1dc
:00402CBD 0F85D8040000 jne 0040319B
:00402CC3 B832000000 mov eax, 00000032
:00402CC8 E8ABE90500 call 00461678
:00402CCD 8945F4 mov dword ptr [ebp-0C], eax
:00402CD0 6A32 push 00000032
:00402CD2 8B45F4 mov eax, dword ptr [ebp-0C]
:00402CD5 50 push eax
----------------------------------------------------------
:00401DB3 C685CCFEFFFF00 mov byte ptr [ebp+FFFFFECC], 00
:00401DBA C605DCA1480001 mov byte ptr [0048A1DC], 01 //先置1
:00401DC1 C745FC01000000 mov [ebp-04], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401DF8(C)
|
:00401DC8 8B45FC mov eax, dword ptr [ebp-04]
:00401DCB 8A8405C5FEFFFF mov al, byte ptr [ebp+eax-0000013B] //取一个字符到al
:00401DD2 8B55FC mov edx, dword ptr [ebp-04]
:00401DD5 3A84152AFFFFFF cmp al, byte ptr [ebp+edx-000000D6] //比较
:00401DDC 7413 je 00401DF1 //必须跳
:00401DDE C605DCA1480000 mov byte ptr [0048A1DC], 00//清零
:00401DE5 C60546A3480000 mov byte ptr [0048A346], 00
:00401DEC E9B2020000 jmp 004020A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401DDC(C)
|
:00401DF1 FF45FC inc [ebp-04]
:00401DF4 837DFC07 cmp dword ptr [ebp-04], 00000007
:00401DF8 75CE jne 00401DC8


推箱子2.32

标 题:推箱子2.32 (135字)
时 间:2001-9-7 8:17:05
详细信息:

www.3q1.com

如果程序发现你改了它，会重启你的Windows的：

00404811 7417 －> EB17
00404F9D 741E －> EB1E

Keyfile: \system\syscagd.dat 保护

标 题:1-15关过关文档 (2千字)
发信人:★morning★
时 间:2001-9-7 20:08:25
详细信息:

1 97
LLDDDDLDDRRULDLURULLLDLUUDRRRRUUUURRDLULDDDDLDDRRULDLURULLLDLUDURRRRUUUURRDDLULDDDLDDRRULDLURULLL

2 55
LDLLDDLDDRRURRDRUDULLLDUDLLUURUURRDDUULLDDLDDRRURRLLDRR

3 149
DRRRRUULUURRRURDDDUULLLLDDRULURRURDDDUULLLDDLLURRDRULURRRURDDULLLDDDDLUULURDRULURRURDDULLLDDDDLLLUURUULLDRRRRDRULURRRURDLLLLDDLLLDDRULURRRDRUULURRURD

4 82
DRDRRRLLLULDDLLDDRRUUUULURRRLDDLDDDLLURDRUUUULURRDDRRRDDLLUDRRUULLLULDDLDDRUUUULUR

5 237
DRRURURRDDLURULDLUDLDLLURRRURRDDLUUDRDRRRULLDULDLURULDLLLUUDDRRRRRRRLUUULULLLULLDDDDUUUURRDRRRDRDDDDLLULLLDLLURRRLRRDRUUDLLRRRRUUULULLLLULDDDDUUURRRRRDRDDDLLLLLDLLURRRLLUUUURRRRRDRDDDDLLLULLLUUUUURRDRRRURDDDDUUULLLLLLDDDDDRURRDRRRRULLDLU

6 71
RRRLLLDDDUDDUUUUDDRRDRRRLUDLLURRRLLLLLLRUURRRDULLLDDRRRRLURLDLLLLRDRRRR

7 74
DLLLUUDDDUUULLLDDDDRRRLRUURRRUULLLRRRDDLURULDDLLDDLLLUURRRLLDLDRULUUURDLDR

8 118
LLLDDLLURLURUURRRRDDDUUULLLLDDRRRLLLUURRRRDDRDLULDULLLDDRULURRRLLLUURRRRDDRDLULLLLLLURDRRRRRUULLLLDUDLDRRRRLLLUURRRRDD

9 66
DURRRRRRRRDDDLLLULLLRRRRDRRDDLLLLLUULURDRRRLLLDDRRRRRUUUUULLLDDRDL

10 330
RUDLLULUUURRRRRUURRDRDDRDDUULUULULLDDDLULLLLDDDRDRRURRRRLLLLDLLULUUURRRRRUURRDRDDLLRRUULULLDDLLLLLDDDRDRRURRRRUDLLLLDLLULUUURRRRRUURRDRDDLRUULULLDDLLLLLDDDRDRRURUUDDLDLLULUUUURDRRRLLLLDDDRUULURRRLLLDDDRDRRURRRRUURRDULLDDLLLULLRDDLLUUULURRLLDDRRRRDRRRUURRDDLLLLLULLLDDRRURULLRDDLLUUULURDDRRRDRRRRRDDLLUDRRUULLLLLULLLDDRRUDLLUURRDRU

11 84
UUUURURRRDDRDLDRRLUULLLDDDRDRRRRUULLLUUURDRUDLLDLULDDURRUUUULLLDDLDDDDRRUUURURULLULD

12 176
URRRRDDRRUULDDRRUDRRRRRRUULLLLLLLDDLLLLUULLDDRRRRRLLLLRUULLRDLDURRDRRRRRLLLLLUULLDDRRRRURRDLURRURRRRRRDDLLLLLLLRRRUDRRRRUULLDULLLLRRDLLLLRRRRURRDLLLLLRRRRURRRDLLLLLLRRRRRDLLLLL

13 285
ULLLUUULULLDLLDDDRRRRRRRRRRRURDLDRRLLULLLLLLLLLLLULLDRRRRRRRRRRRRRDRULURRDLLLLLLLLLRUUULULLDDDUULLDDDRRRRRRRRRRRRRLLLLLLLLUUULULLRUULDDDDDUULLDDDRRRRRRRRRRRDRULURDLLLLLLLUUULLULDDDDRRRRDDLLLLUDRRRRUULUUULLLLLDDDRRRRRRRRRRRURDLDRLULLLLLLUUULLUUURDDLLDDDDRRRUUULLULDDDUULLDDDRRRRRRRRRRRR

14 37
RDLLLULLUURRDDRDRRULLLUURDDUULLLDRURD

15 79
DRRDDUULRDRRULLULLDDUURRDDUULLDDRLUURRDLRRDLDDLLURURUULRDDLDLLURRRUULLDURRDRRDL

小弟出不上什么力,写个攻略吧,呵呵

标 题:怎样在内存中找到它的注册码： (2千字)
发信人:6767[BCG]
时 间:2001-9-7 16:05:23
详细信息:

怎样在内存中找到它的注册码：
by Fpc[CCG]/6767[BCG]

一切的计算来自于这个call中：

Exported fn(): Regist::RegTwoWar(void()) - Ord:0018h
:00401600 55 push ebp
:00401601 8BEC mov ebp, esp
:00401603 81C4BCFCFFFF add esp, FFFFFCBC
:00401609 33C0 xor eax, eax
... ...

更正一点：lijing是对的，Msimgsiz.cfg(在windows文件夹下)是keyfile。

经过努力，找到注册码的计算方法，先看下面这一段：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401E15(C)
|
:00401DF9 8B45FC mov eax, dword ptr [ebp-04]
:00401DFC 8A80270D4B00 mov al, byte ptr [eax+004B0D27] <- keyfile的一部分内容
:00401E02 2C64 sub al, 64 <- al-=0x64
:00401E04 8B55FC mov edx, dword ptr [ebp-04]
:00401E07 8884152AFFFFFF mov byte ptr [ebp+edx-000000D6], al <- 保存，下面比较时用到
:00401E0E FF45FC inc [ebp-04]
:00401E11 837DFC07 cmp dword ptr [ebp-04], 00000007 <- 7个字节(其实用到6个)
:00401E15 75E2 jne 00401DF9
:00401E17 C6458F0E mov [ebp-71], 0E

那么先怎么作呢？用symble Loader载入，下：bpx 401dfc do "d eax+4b0d27"。拦下后记下数据窗口中显示的前6个字节。

bd *关断点，下：bpx 401ff8 do "d eax+ebp-13b"，因为：

:00401FEE C745FC01000000 mov [ebp-04], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402035(C)
|
:00401FF5 8B45FC mov eax, dword ptr [ebp-04]
:00401FF8 8A8405C5FEFFFF mov al, byte ptr [ebp+eax-0000013B] <- 从keyfile生成的一个字串
:00401FFF 8B55FC mov edx, dword ptr [ebp-04]
:00402002 3A84152AFFFFFF cmp al, byte ptr [ebp+edx-000000D6] <- 上面的字串，比较
:00402009 7423 je 0040202E <- 一致则继续比较

:0040200B C605C40B4B0000 mov byte ptr [004B0BC4], 00 <- 否则标志置0
:00402012 C6052E0D4B0000 mov byte ptr [004B0D2E], 00
:00402019 A1C00B4B00 mov eax, dword ptr [004B0BC0]
:0040201E 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00402024 33D2 xor edx, edx
:00402026 89500C mov dword ptr [eax+0C], edx
:00402029 E91D030000 jmp 0040234B <- 跳下去，返回，byebye crackerz

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402009(C)
|
:0040202E FF45FC inc [ebp-04]
:00402031 837DFC07 cmp dword ptr [ebp-04], 00000007
:00402035 75BE jne 00401FF5 <- 比较下一字节
:00402037 803DC40B4B0000 cmp byte ptr [004B0BC4], 00

拦下后，把数据窗口的前六个字节分别都加上 0x64，记下结果。Bd *关断点。F5让程序运行，退出。

用ultraedit打开Msimgsiz.cfg，到文件偏移0x220处，你会发现此处与你第一次记下的六个字节相同，把他们改为上面加0x64所得到和，存盘，退出。

运行目标，关于对话框的注册项消失，target beaten!!

BTW: 还没有玩到15关，聪明人请快测试。

标 题:我知道在哪里输入注册码了！ (46字)
发信人:pzero
时 间:2001-9-7 17:30:58
详细信息:

在About对话框里，只不过是Visible = False，嘿嘿 ,可以用eXeScope调出来，不过得先把重启代码干掉！


万能五笔

 标 题:万能五笔的破解 (6千字)
发信人:CoolBob[CCG]
时 间:2001-7-9 16:44:04
详细信息:
万能五笔的破解:
下载：http://www.tt98.net.cn/wnwb.htm
输入注册信息并下断点后来这里:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048CB8D(C)
|
:0048CB74 8B15346D4900 mov edx, dword ptr [00496D34]
:0048CB7A 0FBFC1 movsx eax, cx
:0048CB7D 8A1402 mov dl, byte ptr [edx+eax]
:0048CB80 80FA3F cmp dl, 3F
:0048CB83 7406 je 0048CB8B
:0048CB85 3854041C cmp byte ptr [esp+eax+1C], dl//在这里比较注册码前四个字符是不是"tt98"
:0048CB89 7504 jne 0048CB8F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048CBEE(C)
|
:0048CBCF A1BC6C4900 mov eax, dword ptr [00496CBC]
:0048CBD4 0FBFFE movsx edi, si
:0048CBD7 8A0438 mov al, byte ptr [eax+edi]
:0048CBDA 3C3F cmp al, 3F
:0048CBDC 740B je 0048CBE9
:0048CBDE 0FBFD9 movsx ebx, cx
:0048CBE1 03DF add ebx, edi
:0048CBE3 38441C1C cmp byte ptr [esp+ebx+1C], al//在这里比较注册码后四个字符是不是"0615"
:0048CBE7 7507 jne 0048CBF0

:0048CC76 668B3D2E6D4900 mov di, word ptr [00496D2E]
:0048CC7D 8B15B06C4900 mov edx, dword ptr [00496CB0]//6364
:0048CC83 66C1EF08 shr di, 08
:0048CC87 668B0D2E6D4900 mov cx, word ptr [00496D2E]
:0048CC8E 6681E1FF00 and cx, 00FF
:0048CC93 E8F8FAFFFF call 0048C790//关键计算被调用２次
:0048CC98 03F0 add esi, eax
:0048CC9A 6685FF test di, di
:0048CC9D 750A jne 0048CCA9
:0048CC9F 8B15B46C4900 mov edx, dword ptr [00496CB4]
:0048CCA5 8BCF mov ecx, edi
:0048CCA7 EB0B jmp 0048CCB4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048CC9D(C)
|
:0048CCA9 668BCF mov cx, di
:0048CCAC 8B15B46C4900 mov edx, dword ptr [00496CB4]
:0048CCB2 6641 inc cx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048CCA7(U)
|
:0048CCB4 E8D7FAFFFF call 0048C790//再计算一次
:0048CCB9 8BC8 mov ecx, eax
:0048CCBB 85C9 test ecx, ecx
:0048CCBD 7507 jne 0048CCC6
:0048CCBF BDFBFFFFFF mov ebp, FFFFFFFB
:0048CCC4 EB36 jmp 0048CCFC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048CCBD(C)
|
:0048CCC6 8BC6 mov eax, esi
:0048CCC8 99 cdq
:0048CCC9 F7F9 idiv ecx
:0048CCCB 8BEA mov ebp, edx
:0048CCCD EB2D jmp 0048CCFC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048CC74(C)
|
:0048CCCF 66833D286D490002 cmp word ptr [00496D28], 0002
:0048CCD7 7523 jne 0048CCFC
:0048CCD9 668B152E6D4900 mov dx, word ptr [00496D2E]
:0048CCE0 A1B46C4900 mov eax, dword ptr [00496CB4]
:0048CCE5 50 push eax
:0048CCE6 8B0DB06C4900 mov ecx, dword ptr [00496CB0]
:0048CCEC 51 push ecx
:0048CCED 8B0DC46A4900 mov ecx, dword ptr [00496AC4]
:0048CCF3 E828FBFFFF call 0048C820
:0048CCF8 8BE8 mov ebp, eax//? eax正确的数字
:0048CCFA 2BEE sub ebp, esi//? esi假数字

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048CCC4(U), :0048CCCD(U), :0048CCD7(C)
|
:0048CCFC 85ED test ebp, ebp
:0048CCFE 7429 je 0048CD29//if jump good boy:>

核心计算一共被调用２次，看看
:0048C790 53 push ebx
:0048C791 56 push esi
:0048C792 668BD9 mov bx, cx
:0048C795 57 push edi
:0048C796 55 push ebp
:0048C797 8BF2 mov esi, edx
:0048C799 85F6 test esi, esi
:0048C79B 7475 je 0048C812
:0048C79D 803E00 cmp byte ptr [esi], 00
:0048C7A0 7470 je 0048C812
:0048C7A2 8BFE mov edi, esi
:0048C7A4 B9FFFFFFFF mov ecx, FFFFFFFF
:0048C7A9 2BC0 sub eax, eax
:0048C7AB F2 repnz
:0048C7AC AE scasb
:0048C7AD F7D1 not ecx
:0048C7AF 49 dec ecx//strlen(name)
:0048C7B0 6685DB test bx, bx
:0048C7B3 7444 je 0048C7F9
:0048C7B5 6683FB01 cmp bx, 0001
:0048C7B9 743E je 0048C7F9
:0048C7BB 0FB7FB movzx edi, bx
:0048C7BE 8BC7 mov eax, edi//eax=0x63
:0048C7C0 99 cdq
:0048C7C1 F7F9 idiv ecx
:0048C7C3 0FBE0416 movsx eax, byte ptr [esi+edx]
:0048C7C7 0FAFC2 imul eax, edx
:0048C7CA 0FAFC7 imul eax, edi
:0048C7CD 03C1 add eax, ecx
:0048C7CF 33D2 xor edx, edx
:0048C7D1 85C9 test ecx, ecx
:0048C7D3 7E19 jle 0048C7EE
:0048C7D5 8BD9 mov ebx, ecx
:0048C7D7 2BDF sub ebx, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048C7EC(C)
|
:0048C7D9 0FBE3C16 movsx edi, byte ptr [esi+edx]
:0048C7DD 8BEB mov ebp, ebx
:0048C7DF 2BEA sub ebp, edx
:0048C7E1 42 inc edx
:0048C7E2 83C56F add ebp, 0000006F
:0048C7E5 0FAFFD imul edi, ebp
:0048C7E8 03C7 add eax, edi
:0048C7EA 3BCA cmp ecx, edx
:0048C7EC 7FEB jg 0048C7D9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048C7D3(C)
|
:0048C7EE 85C0 test eax, eax
:0048C7F0 7D25 jge 0048C817
:0048C7F2 F7D8 neg eax
:0048C7F4 5D pop ebp
:0048C7F5 5F pop edi
:0048C7F6 5E pop esi
:0048C7F7 5B pop ebx
:0048C7F8 C3 ret
注册机如下：
#include<stdio.h>
main()
{char name[60];long n,EAX,ESI,EDI,i;
printf("your name:");
gets(name);
n=0X63%strlen(name);
EAX=name[n]*n*0X63+strlen(name);
i=0;
do {
EDI=(strlen(name)-0X63+0X6f-i)*name[i++];
EAX=EAX+EDI;
}while (i<strlen(name));
if (EAX<0) EAX=~EAX;
ESI=EAX;
n=0X65%strlen(name);
EAX=name[n]*n*0X65+strlen(name);
i=0;
do {
EDI=(strlen(name)-0X65+0X6f-i)*name[i++];
EAX=EAX+EDI;
}while (i<strlen(name));
if (EAX<0) EAX=~EAX;
EAX=ESI+EAX+0X13311;
printf("Regcode is:%ld\n",EAX);
printf("press any key to exit!"\n);
getch();
}


万能五笔

 标 题:万能五笔 (1千字)
发信人:WinDos2K
时 间:2001-5-26 2:54:52
详细信息:
这个软件十分好用，这文件是从它产生的。

重要点是下面的0048CCFA
:0048CCF3 E828FBFFFF call 0048C820
:0048CCF8 8BE8 mov ebp, eax
:0048CCFA 2BEE sub ebp, esi <------
:0048CCFC 85ED test ebp, ebp
:0048CCFE 7429 je 0048CD29

这 call 0048C820 返回名字的计算值，再跟esi比较，相等等于OK!

:0048CC65 E8064E0000 call 00491A70
:0048CC6A 66833D286D490001 cmp word ptr [00496D28], 0001
:0048CC72 8BF0 mov esi, eax <-------
:0048CC74 7559 jne 0048CCCF

这 call 00491A70 返回ID的计算值,送到esi。

ID 是--> tt98xx...x0615

xx...x = xn....x3,x2,x1,x0 是ID的计算值
计算方法：返回名字的计算值=(xn*A^n)+(x5*186A0)+(x4*2710)+(x3*3E8)+(x2*64)+(x1*A)+(x0*1)

如果名字的计算值=2BFC3
2BFC3 - 1*186A0 = 13923 --->x5=1
13923 - 8*2710 = A3 --->x4=8
A3 - 0*3E8 = A3 --->x3=0
A3 - 1*64 = 3F --->x2=1
3F - 6*A = 3 --->x1=6
3 - 3*1 = 0 --->x0=3

ID tt981801630615


万能五笔2000a+

 标 题:万能五笔2000a+破解《作者：BanhouseMaster》 (3千字)
发信人:Banhouse
时 间:2000-9-12 0:52:21
详细信息:
万能五笔2000a+破解
通过将近1个小时的Track，最后要整理一下，写出以上内容。

首先，准备Soft-Ice For Windows 的任何一个版本或Trw2000 1.22注册版（注意：Soft-Ice和Trw2000的命令语法是一样的）
至于这是我的Trw2000.ini和Winice.dat的设定，希望能帮你一点忙。

接着用Loder32.exe或Trw2000.exe来打开wnb.exe，然后按Load键装载wnb.exe。在万能五笔的输入界面上按Mouse的右键，接
着选择“关于/注册”，接着又会出现有关万能五笔的信息，系统会多余地问：“你要注册吗？”，当然要啦！选择“注册”，紧
跟着，输入“用户名”如：Banhouse和“注册码”如:8877665544332211（一定要等于16个字符！为什么我知道？因为跟踪过嘛！
等下我会交待的。） ，Ctrl-D 或 Ctrl-N 呼出 Soft-Ice或Trw2000。

好了真正的工件开始啦！

1.键入 bpx getdlgitemtexta 然后按回车键。

2.按《F5》功能键返回万能五笔的注册界面，然后按OK键。

3.这时候万能五笔被拦截！此是在User32.dll的领空，按一次《F12》和一次《F5》，系统就返回到Wnb!.Text+9d15，这就是万能
五笔的领空

4. 0177:0040AD36 XOR EAX,EAX
XXXX:XXXXXX38 REPNE SCASB
XXXX:XXXXXX3A NOT ECX
XXXX:XXXXXX3C DEC ECX
XXXX:XXXXXX3D CMP ECX,BYTE+4 ;比较输入的用户名字符个数
XXXX:XXXXXX40 JNC 0040AD86 ;是否大于4个字符，大于则转到 0040AD86
.<一直按F10>
.
.
0177:0040AD8D XOR EAX,EAX
XXXX:XXXXXXXX REPNE SCASB
XXXX:XXXXXX3A NOT ECX
XXXX:XXXXXX3C DEC ECX
XXXX:XXXXXX3D CMP ECX,BYTE+10 ;比较输入的注册码字符个数
XXXX:XXXXXX40 JZ 0040ADC7 ;是否等于16个字符，大于则转到 0040ADC7
.<一直按F10>
.
.
XXXX:XXXXADC7 LEA EAX,[ESP+2C] ;EAX存放你所输入的注册码
XXXX:XXXXXXXX PUSH DWORD 0042F860 ;用命令D 0042f860 可以看见万能码的信息码
XXXX:XXXXXXXX LEA ECX,[ESP+44] ;ECX存放你所输入的用户名
XXXX:XXXXXXXX PUSH EAX
XXXX:XXXXXXXX PUSH ECX
XXXX:XXXXXXXX CALL 00401220 ;如果这个Call没有用F8追入的话……
XXXX:XXXXXXXX ADD ESP,BYTE+0C ;
XXXX:XXXXXXXX TEST EAX,EAX ;
XXXX:XXXXXXXX MOV EAX,[0042F290] ;
XXXX:XXXXXXXX JZ NEAR 0040AE88 ;则这个JZ就会转到 0040AE88 ，也就话注册失败了……所以……
XXXX:XXXXXXXX

5. <F8追入 CALL 00401220>来到
0177:00401220 SUB ESP,BYTE+14
XXXX:XXXX1223 PUSH EBX
XXXX:XXXX1224 PUSH EBP
XXXX:XXXX1225 MOV EBP,[ESP+20]
XXXX:XXXX1229 PUSH ESI
XXXX:XXXX122A EDI
.<一直按F10>
.
.
XXXX:XXXX12AC LEA EAX,[ESP+10]
XXXX:XXXX12B0 PUSH EAX
XXXX:XXXX12B1 PUSH EDX
XXXX:XXXX12B2 PUSH EBP
XXXX:XXXX12B3 CALL 004011A0 ;追了一个晚上就是为了找你！可恨的“Call 004011AD”一定是你把我输入的
XXXX:XXXX12B8 ADD ESP,BYTE+0C ;注册码8877665544332211通过复杂的加工后转换成 4649-394904-0318 的！
XXXX:XXXX12BB LEA ESI,[ESP+10] ;来到这里用命令D ESI,则可看见真正的注册码啦！

万能五笔的注册码是：4649-394904-0318

Cracker : BanhouseMaster
E-Mail : banhouse@21cn.com
Phone : 13613070052


万能五笔2001

 标 题:万能五笔2001的跟踪 (1千字)
发信人:WinDos2K
时 间:2001-6-15 0:32:58
详细信息:
I think Delete those keys may work for you !!
In Registry :

{0IvsUrCYRA}
SystemAppIDs

Under System/System32 :

access.ctl

or just delete the keys in registry,Try it out yourself !!

万能五笔2001的跟踪

这万能五笔(万能码)从2000a+改版到2001时,注册方法都改了.
我下载的好像没有加壳,故不知为甚麽会有人问脱壳的问题!?
这程式有200次计算器指示,我想是否在200次内都不能破解,这
程式便会自动毁灭,至於那个动手破解的人.............!

在那里下载,用甚麽工具我想不用说了.
本想写详尽一点,但找不到还原的地方,包涵一下!!
先下bpx getdlgitemtexta 程式会断在下面
:0048D350 FFD3 call ebx
用F10跟了一下,提示错误在下面这个call里跳出
:0048D3A0 E8DBF4FFFF call 0048C880
跟入0048C880後还是F8一步一步走,到下面
:0048CB85 3854041C cmp byte ptr [esp+eax+1C], dl
这里是测式前四个字符是否tt98,而测式後四个字符是否0615在下面
:0048CBE3 38441C1C cmp byte ptr [esp+ebx+1C], al

重要点是下面的0048CCFA
:0048CCF3 E828FBFFFF call 0048C820
:0048CCF8 8BE8 mov ebp, eax
:0048CCFA 2BEE sub ebp, esi <------
:0048CCFC 85ED test ebp, ebp
:0048CCFE 7429 je 0048CD29

这 call 0048C820 返回名字的计算值，再跟esi比较，相等等于OK!

:0048CC65 E8064E0000 call 00491A70
:0048CC6A 66833D286D490001 cmp word ptr [00496D28], 0001
:0048CC72 8BF0 mov esi, eax <-------
:0048CC74 7559 jne 0048CCCF

这 call 00491A70 返回ID的计算值,送到esi。

ID 是--> tt98xx...x0615

xx...x = xn....x3,x2,x1,x0 是ID的计算值
计算方法：返回名字的计算值=(xn*A^n)+(x5*186A0)+(x4*2710)+(x3*3E8)+(x2*64)+(x1*A)+(x0*1)

如果名字的计算值=2BFC3
2BFC3 - 1*186A0 = 13923 --->x5=1
13923 - 8*2710 = A3 --->x4=8
A3 - 0*3E8 = A3 --->x3=0
A3 - 1*64 = 3F --->x2=1
3F - 6*A = 3 --->x1=6
3 - 3*1 = 0 --->x0=3

ID tt981801630615


网吧管理专家9.5

标 题:网吧管理专家9.5破解手记 (6千字)
发信人:gfh[CCG]
时 间:2001-1-26 9:31:06
详细信息:
                网吧管理专家9.5破解手记

[声明]

我写文章的目的是为了交流技术，希望大家在转载时能保持文章的完整性。

[前言]

   前几天，有个朋友问我<<网吧管理专家9.5>>是如何破解的，这个软件我早就破解了，
用的是暴破（不好意思）。听有些高手说它用是的RSA加密算法，我数学不好，算法就更
      不用提了，所以只能....。我个人认为，破解就是想办法将它的限制CANCEL掉，不管什
      么方法。当然了破解的最高境界是写注册机，不过我编程不好，以前用汇编写过一个注册
      机，差点把我累死，所以这次我就偷个懒了。
好了，不说费话了。Let's begin.

  主要是分析OCTODLL.DLL文件。

PART A：用户名的长度判断。
PART B：注册时的关鍵点。
PART C：软件启动时的关鍵点。（如果强行注册，软件启动时会提示注册码被破坏了。）

==================< Part A >=======================
0167:004E76D9 E8F6E7FDFF CALL 004C5ED4
0167:004E76DE 8B45EC MOV EAX,[EBP-14] ;这里是我们输入的用户名。
0167:004E76E1 E80EC5FBFF CALL 004A3BF4 ;计算用户名的长度。
0167:004E76E6 83F804 CMP EAX,04 ;比较长度是否大于并等于4。
                                                           ;（经分析用户名长度必须＞＝4）
0167:004E76E9 7D2E JGE 004E7719
0167:004E76EB 6A10 PUSH 10
0167:004E76ED B9007A4E00 MOV ECX,004E7A00
0167:004E76F2 BA087A4E00 MOV EDX,004E7A08
0167:004E76F7 A1D8BC4E00 MOV EAX,[004EBCD8]
0167:004E76FC 8B00 MOV EAX,[EAX]
0167:004E76FE E8DDA3FFFF CALL 004E1AE0
0167:004E7703 8B45FC MOV EAX,[EBP-04]
0167:004E7706 8B80CC020000 MOV EAX,[EAX+000002CC]
0167:004E770C 8B10 MOV EDX,[EAX]
0167:004E770E FF92B4000000 CALL [EDX+000000B4]

==================< Part B >=======================
0167:004E7465 E8B2FDFFFF CALL 004E721C
0167:004E746A 83E802 SUB EAX,02
0167:004E746D 8945E0 MOV [EBP-20],EAX
0167:004E7470 C165DC02 SHL DWORD PTR [EBP-24],02
0167:004E7474 8D4DDC LEA ECX,[EBP-24]
0167:004E7477 8B01 MOV EAX,[ECX]
0167:004E7479 8B5104 MOV EDX,[ECX+04]
0167:004E747C 0FACD002 SHRD EAX,EDX,02
0167:004E7480 C1FA02 SAR EDX,02
0167:004E7483 8901 MOV [ECX],EAX
0167:004E7485 895104 MOV [ECX+04],EDX
0167:004E7488 8B45DC MOV EAX,[EBP-24]
0167:004E748B 3B45E4 CMP EAX,[EBP-1C] ;这里是关鍵，EAX是算出来的值，[EBP-1C]是正确的值。
0167:004E748E 7404 JZ 004E7494 ;正确转入4E7494，我们要改这里为JMP　004E7494
0167:004E7490 33DB XOR EBX,EBX ;这里赋EBX＝0，如果你经常Crack，你会发觉这里我可以
                                                               ;算是个标志，用在后面的TEST中作判断。
0167:004E7492 EB11 JMP 004E74A5
0167:004E7494 668B45E0 MOV AX,[EBP-20]
0167:004E7498 6625FFFF AND AX,FFFF
0167:004E749C 8B55F8 MOV EDX,[EBP-08]
0167:004E749F 668902 MOV [EDX],AX

==================< Part C >=======================
0167:004E8437 8901 MOV [ECX],EAX
0167:004E8439 895104 MOV [ECX+04],EDX
0167:004E843C 8B45DC MOV EAX,[EBP-24]
0167:004E843F 3B45E4 CMP EAX,[EBP-1C] ;这里是我们重新启动软件时的比较，也是用算法算出来的。
0167:004E8442 7404 JZ 004E8448 ;我们也要改一下，改成JMP　004E8448
0167:004E8444 33DB XOR EBX,EBX ;不正确时，赋EBX＝0，返回后用在TEST指令中。
0167:004E8446 EB11 JMP 004E8459
0167:004E8448 668B45E0 MOV AX,[EBP-20]
0167:004E844C 6625FFFF AND AX,FFFF
0167:004E8450 8B55F8 MOV EDX,[EBP-08]
0167:004E8453 668902 MOV [EDX],AX
0167:004E8456 83CBFF OR EBX,-01
0167:004E8459 33C0 XOR EAX,EAX
0167:004E845B 5A POP EDX
0167:004E845C 59 POP ECX
0167:004E845D 59 POP ECX
0167:004E845E 648910 MOV FS:[EAX],EDX
0167:004E8461 687E844E00 PUSH 004E847E
0167:004E8466 8D45EC LEA EAX,[EBP-14]
0167:004E8469 E80AB5FBFF CALL 004A3978

   今天合肥下了场大雪，看着窗外雪花纷飞，这次真的是雪舞庐州了。既然说到了我的网站，就随便说几句
  吧，我是个学生，今年大二，学习比较紧张，所以网页上的很多版块没有时间及时更新，如果哪位朋友有意
  帮我管理几个链接，本人将不甚感激，有意者请与我联系，我的QQ：17525661　Email:purewom@yeah.net

gfh[CCG]
2001.1.25（正月初二）


网络传神2.02(build 0310)

标 题:初学者心得--网络传神2.02(build 0310) (6千字)
发信人:-1212-
时 间:2001-4-8 1:05:54
详细信息:
初学者心得--网络传神2.02(build 0310)

作者：华仔
版权：China Cracking Group
时间：2001.04.07

这几天网站有点不稳定，我还以为是我的FTP软件有问题，一时兴起把它给抓了下来，试用
后感觉还可以，就算不注册也没有任何限制，但窗口标题有一个“未注册”字样，作为一
个CRACKER来说简直是一种耻辱，杀心顿起，搞定它。（注：白菜乐园有它的破解版本，在
这里我们只是简单的了解一下破解这类程序如何从多方面入手，如果你是老CRACKER请止步。

）

一、试运行：

进入注册画面
用户名：华仔[CCG]
识别码：855F3B3B3358CFC2A3B-7A5746F65067575673
注册码：1974923
单击确定后，该软件让重新启动后验证注册码。

二、注册分析：

1、在输入用户名获取识别码时出现一个好现象：
-7A5746F65067575673始终未曾改变（我猜可能是机器码），而前面的数字（暂且叫它
用户码）855F3B3B3358CFC2A3B一直在改变（这说明真正的注册码不是唯一的）。

2、对于重新启动后验证注册码，这类软件很多，它把这些注册信息写入注册表或某个文件
在启动软件时再读出并校验。这给我们设置断点和查找关键点提供了方法。经过观察，
它是将注册信息写入注册表中：

[HKEY_CURRENT_USER\Software\Kuaiftp]
"Path"="D:\\net_tool\\kuaiftp2000"
"VER"="202"
"BUILD"="0310"
"Name"="华仔[CCG]"
"SBM"="855F3B3B3358CFC2A3B-7A5746F65067575673"
"ZCM"="1974923"

另外软件使用次数标记在这里：

[HKEY_CURRENT_USER\Software\Microsoft\data63]
"DATA63"="9E2E2E2E2"（不是吧，我已使用了7777次？:)）

3、这么长的识别码，注册码也一定很长，我倒有点想打退堂鼓了，但没办法，到这一步只有
“茅厕里划船：奋（粪）勇前进”了。让大家见笑了，本人数学一向不好，看到这么多数
字，就犯头痛，老毛病。还好，我记得不知是那位学士说过，不管是暴破也好、找注册码
也好，弄清算法也好，都叫：CRACK，这样心理才稍有点平衡感。但上面三种方法我这次
都用到了。

三、实战：

1、用W32dsm89反汇编后找关键字“ZCM”（问：没什么要找这个，答：因为软件启动后要
读取这个注册表键来判断是否是真正的注册码）,好运气，我们找到两个，一个是在注
册窗口中输入注册信息后，用来读写注册表的，而另一个就是我们要用到的下面这个。

2、用TRW2000载入，设断bpx 00529E0D，g继续运行，程序被拦下，下bc *清除断点：

* Possible StringData Ref from Code Obj ->"ZCM"
|
:00529E0D BAD4A05200 mov edx, 0052A0D4
:00529E12 8B45F8 mov eax, dword ptr [ebp-08]
:00529E15 E8FE7CF7FF call 004A1B18
:00529E1A 8D45F4 lea eax, dword ptr [ebp-0C]
:00529E1D 8B55F0 mov edx, dword ptr [ebp-10]
:00529E20 E85BA0EDFF call 00403E80
:00529E25 8B55F4 mov edx, dword ptr [ebp-0C]
:00529E28 B8E0A05200 mov eax, 0052A0E0
:00529E2D E822A5EDFF call 00404354
:00529E32 8BD8 mov ebx, eax
:00529E34 8B45F4 mov eax, dword ptr [ebp-0C]
:00529E37 E82CA2EDFF call 00404068
:00529E3C 8BC8 mov ecx, eax
:00529E3E 2BCB sub ecx, ebx
:00529E40 41 inc ecx
:00529E41 8D45F4 lea eax, dword ptr [ebp-0C]
:00529E44 8BD3 mov edx, ebx
:00529E46 E865A4EDFF call 004042B0
:00529E4B 8D45E8 lea eax, dword ptr [ebp-18]
:00529E4E 8B55F4 mov edx, dword ptr [ebp-0C]
:00529E51 E82AA0EDFF call 00403E80
:00529E56 8D45F4 lea eax, dword ptr [ebp-0C]
:00529E59 8B55F0 mov edx, dword ptr [ebp-10]
:00529E5C E81FA0EDFF call 00403E80
:00529E61 8D45F4 lea eax, dword ptr [ebp-0C]
:00529E64 8BCB mov ecx, ebx
:00529E66 BA01000000 mov edx, 00000001
:00529E6B E840A4EDFF call 004042B0
:00529E70 8D45E4 lea eax, dword ptr [ebp-1C]
:00529E73 8B55F4 mov edx, dword ptr [ebp-0C]
:00529E76 E805A0EDFF call 00403E80
:00529E7B 8D55E0 lea edx, dword ptr [ebp-20]
:00529E7E 8B45E8 mov eax, dword ptr [ebp-18] ====>> 我们输入的假

注册码
:00529E81 E8CAD4FDFF call 00507350 ====>> 在这里干了一

场革命，我不想
:00529E86 8B55E0 mov edx, dword ptr [ebp-20] 看下去，太让

人心烦了。
:00529E89 8B45EC mov eax, dword ptr [ebp-14] ====>> 我们的用户名
:00529E8C E8E7A2EDFF call 00404178
:00529E91 751F jne 00529EB2 ====>> 用户码运算结

果不正确才跳，
:00529E93 8D45DC lea eax, dword ptr [ebp-24] 暴破时改为NOP

经分析00507350处代码发现（又是循环，又是取位，又是取反....，搞得我头都大了），注册

码
的第一部份和用户码相同（这么简单的问题？？？），好了，继续执行到下面的代码。

:00529E96 E85DD1FDFF call 00506FF8 ====>> 未完成的革命

又在这里继续
:00529E9B 8B55DC mov edx, dword ptr [ebp-24] ====>> EDX才是我们需

要的注册码第二
部分（通过机

器码运算得到）
:00529E9E 8B45E4 mov eax, dword ptr [ebp-1C] ====>> 我们的机器码
:00529EA1 E8D2A2EDFF call 00404178
:00529EA6 750A jne 00529EB2 ====>> 机器码运算结果不正确才要跳，

暴破时改为NOP
:00529EA8 8B45FC mov eax, dword ptr [ebp-04]
:00529EAB C6804104000001 mov byte ptr [eax+00000441], 01 ====>> 看到这里

了吗，
运行到这

里就成功了。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00529E91(C), :00529EA6(C)
|
:00529EB2 33C0 xor eax, eax
:00529EB4 5A pop edx
:00529EB5 59 pop ecx
:00529EB6 59 pop ecx

四、结果：

在识别码中任意取一个用户码作为注册码的第一部份
中间有“-”
注册码第二部份在这里取：“:00529E9B 8B55DC mov edx, dword ptr [ebp-24]”

用户名：华仔[CCG]
识别码：855F3B3B3358CFC2A3B-7A5746F65067575673
注册码：2B554141495EC5D8A9B-7A2C4712443505E212

用户名：华仔[CCG]

识别码：3A544040485DC4D7A8B-7A5746F65067575673
注册码：855F3B3B3358CFC2A3B-7A2C4712443505E212

识别码：58524E3E365BC2D5A6B-7A5746F65067575673
注册码：3A544040485DC4D7A8B-7A2C4712443505E212

识别码：2B554141495EC5D8A9B-7A5746F65067575673
注册码：3A544040485DC4D7A8B-7A2C4712443505E212


文件斧头1.0

 标 题:我来贴他的破解。国产软件怎么啦？破就破呗，没什么大不了的。我就不信他的win98或者是VC++使用正版的。哼... (2千字)
发信人:crack007
时 间:2001-5-19 1:24:39
详细信息:
标题: 我来贴他的破解。国产软件怎么啦？破就破呗，没什么大不了的。我就不信他的win98或者是VC++使用正版的。哼，五十步笑百步而已！

内容:
我来贴他的破解。国产软件怎么啦？破就破呗，没什么大不了的。我就不信他的win98或者是VC++使用正版的。哼，五十步笑百步而已！

破解手记之四

作者：Crack007
主页：http://www.crack007.com ( ^-^ )
破解日期：2001-5-18
破解工具：TRW2000 1.22 W32dASM 8.93 Procdump v1.62
难度：☆

软件下载地址：ftp://211.100.8.153/download/99/10261_axefb.zip

软件简介：　　这个软件可以方便快捷的将一个大文件分割成若干份小文件。分割的文件大小可以任意指定（以KB为单位，大于0 kb）。还可以指定生成“还原批处理文件”，可以直接执行这个reset.bat文件,将分割的文件自动还原。当然，您也可以通过“文件斧头”还原。

先用Fi.exe侦测出该程序是用 Aspack1.07b 加的壳，所以先用Procdump进行脱壳。

然后启动TRW2000，随便输入注册信息：

用户名:Crack007
注册码:78787878

下Bpx hmemcpy ,被拦截后用Pmodule来到程序核心

不停地按F10，来到此处：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00466A8F(C)
|
:00466ACF 837DF800 cmp dword ptr [ebp-08], 00000000
:00466AD3 0F846F020000 je 00466D48
:00466AD9 8B45F8 mov eax, dword ptr [ebp-08] <----过此处下 d edx 可显示正确注册码
:00466ADC 8B55F0 mov edx, dword ptr [ebp-10] <----显示输入的注册码：
:00466ADF E8A0D2F9FF call 00403D84
:00466AE4 0F855E020000 jne 00466D48 <---经过W32dasm反汇编后可以看到此处将跳转到 GameOver 处。
:00466AEA 8D9504FEFFFF lea edx, dword ptr [ebp+FFFFFE04]
:00466AF0 33C0 xor eax, eax
:00466AF2 E8CDBDF9FF call 004028C4
:00466AF7 8B8504FEFFFF mov eax, dword ptr [ebp+FFFFFE04]
:00466AFD 8D55EC lea edx, dword ptr [ebp-14]
:00466B00 E8AB16FAFF call 004081B0
:00466B05 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]

|

* Possible StringData Ref from Code Obj ->"错误的序列号！"
|
:00466D48 B8E86D4600 mov eax, 00466DE8
:00466D4D E80255FEFF call 0044C254 <----呼叫出错误注册码的对话框

整理一下：
Name: Crack007
Code: 12385513832171413

标 题:文件斧头1.0注册机,简单 (555字)
发信人:8989
时 间:2001-5-18 21:06:57
详细信息:

文件斧头1.0注册机,简单
http://zangqi.home.chinaren.com
==============CUT Begin==============

#include "stdio.h"
main()
{
char string[81];
int d=0,c;
int i,e;
clrscr();
printf("******File-Axe1.0 文件斧头********\n风飘雪[CCG]制作\n");
printf("http://fpxfpx.yeah.net\nPlease input your name:");
gets(string);
d=strlen(string);
printf("Your name is ");
puts(string);
printf("Your Register code is ");

for(i=0;(c=string[i])!='\0';i++)
{e=(7*d+c)/(i+1);
printf("%d",e);
}
return(0);
}

============CUT End===================

标 题:呵呵~~我也做了这个的注册机~~~呵呵~~又让老哥领先了~~~ (528字)
发信人:伪装者[BCG]
时 间:2001-5-19 0:09:33
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[80];
int i,c,d,e;
printf(" ******FILE-AXE********\nThis keygen is maked by Pretender\nPlease input
  your name :  ");
gets(string);
d=strlen(string)*7;
printf("Your Register code is  :  ");
for(i=0;(c=string[i])!='\0';i++)
{e=c+d;
e/=(1+i);
printf("%d",e);
}

printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


文件管理器

标 题:文件管理理破解（内有下载地址），好象也没有来这个论坛了 (1千字)
发信人:1212
时 间:2001-4-1 14:26:40
详细信息:
刚下载了文件管理器http://www.soft999.com/download1/flashsoft.zip

软 件 功 能

将硬盘上的软件分类整理，可以存储软件的大小、下载地点、软件介绍、备注等详细信息。
支持按软件名的模糊查询功能。
将软件相关信息分类输出成HTML文件。
支持导入一个目录下的文件。
支持拖拽、可以从子资源浏览器中拖拽文件。
多种语言支持(中文、英文)。
流行的Skins技术。

这个软件破解过程挺简单的，过程就免了，初学者也能轻松搞定
给一个有较的注册码：

用户名：已注册
注册码：776369580

不知道作者会不会找我麻烦，注册费用￥25.00啊

最近看了一些破解站，都把文件批量设置器V2.2a作为新软件，其实我在2000初就看到这个软件了，那时我才开始学破解软件，费了很大劲才把它给
破解了，现在想想当初的学习劲头真足啊，眼睛都追成了熊猫（红红的。。）通过破解它，自己的水平也提高了不少（自我感觉良好）。
其实这个软件的破解也不能，只要具备一点汇编知识就能搞定，软件的注册过程满有意思的。我认识是学习破解的一个好教材，建议初哥们都去试一试。
给一点提示吧！注册的注册码是24位数，分为8组，每组三位数。前四组好象是根据你的用户名和公司名算出来的，具体也记不得了，毕竟是一年多前的事了，后四组有的是通过加减算出来的，好象第七组必须是100，好了不多说了，自己去体会吧。相信你也会有所提高的。

下载地址：http://www.esoftware.com.cn/oload.php?url=http://ftp.enet.com.cn/pub/fmanager/other/fo22a.exe

哎！现在的国产共享软件好象越来越少了，不知大家有没有同感，最后祝大家愚人节快乐。

2001.4.01

标 题:这个的注册机（前两天我贴过一次） (417字)
发信人:伪装者[CCG]
时 间:2001-4-1 14:50:33
详细信息:

 #include "stdio.h"
main()
{
char string[81];
long d=1;
int i,c;
printf("******FLASHSOFT 1.0********\nThis keygen is maked by Pretender\nPlease
    input your name\n");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c<0) c+=256;
d*=c;
}
d=d>0?d:-d;
printf("Your name is          ");
puts(string);
printf("Your Register code is %ld\n",d+100);
printf("Welcome to WWW.CRACKNOW.COM\n");}


文件密使2.0

 标 题:文件密使2.0暴力破解及注册机的编写—好久没写过东西了。 (11千字)
发信人:KanKer
时 间:2001-7-10 22:41:45
详细信息:
文件密使2.0暴力破解及注册机

说明：如何保护信息的安全使之不被窃取，而造成损失，密码是有效而且可行的办法。文件密使就是在这种理念下产生的一个对计算机信息进行加密的工具。
下载：http://www.esoftware.com.cn/oload.php?url=http://ftp.eware.com.cn/pub/fmanager/encrypt/jiamiV2.0.exe

一、暴力破解法

很简单，只用wdasm893即可，用那个可以反编译汉字的版本。
查找“文件密使2.0 - ”，可找到2处，该字串是显示在窗体的标题栏的。其中一处是启动时判断有没有注册后显示的；一处是注册成功后显示的。
下面是启动时判断注册成功后显示处：
* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:004080DE E8D5290100 Call 0041AAB8
:004080E3 8BCD mov ecx, ebp
:004080E5 E8069F0000 call 00411FF0 **进去便是判断注册的程序**
:004080EA 33C9 xor ecx, ecx
:004080EC 3BC1 cmp eax, ecx
:004080EE 7454 je 00408144 **该处便是跳到显示未注册处代码**
**只要讲该处的代码NOP掉就可以了**
:004080F0 B801000000 mov eax, 00000001
:004080F5 57 push edi
:004080F6 894668 mov dword ptr [esi+68], eax
:004080F9 898630130000 mov dword ptr [esi+00001330], eax
:004080FF 8986E4280000 mov dword ptr [esi+000028E4], eax
:00408105 8D442418 lea eax, dword ptr [esp+18]

* Possible StringData Ref from Data Obj ->"文件密使2.0 - "
|
:00408109 681C854200 push 0042851C
:0040810E 50 push eax

* Reference To: MFC42.Ordinal:039E, Ord:039Eh
|
:0040810F E8722B0100 Call 0041AC86
:00408114 8B00 mov eax, dword ptr [eax]
:00408116 8BCE mov ecx, esi
:00408118 50 push eax
:00408119 C78424C001000004000000 mov dword ptr [esp+000001C0], 00000004

若有人想来个完美的暴破，也可以到下处：
* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:00415CB5 E8FE4D0000 Call 0041AAB8
:00415CBA 8D8E50160000 lea ecx, dword ptr [esi+00001650]
:00415CC0 E82BC3FFFF call 00411FF0
:00415CC5 85C0 test eax, eax
:00415CC7 752E jne 00415CF7 **将此处跳过即可任意注册**
**其实只是在注册表内填了个注册名罢了8-)**
:00415CC9 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"warning"
|
:00415CCB 6890814200 push 00428190

* Possible StringData Ref from Data Obj ->"注册码错误，请重新输入"
|
:00415CD0 68008F4200 push 00428F00
:00415CD5 8BCB mov ecx, ebx

总结一下：
1、:004080EE 7454 ---->9090
2、:00415CC7 752E ---->eb2e

二、注册机的编写
此处便是:004080E5处 call 00411FF0里面的内容，该处的内容在启动和注册时都要用到。
是判断的核心。
:00411FF0 6AFF push FFFFFFFF
:00411FF2 6878E04100 push 0041E078
:00411FF7 64A100000000 mov eax, dword ptr fs:[00000000]
:00411FFD 50 push eax
:00411FFE 64892500000000 mov dword ptr fs:[00000000], esp
:00412005 83EC24 sub esp, 00000024
:00412008 55 push ebp
:00412009 56 push esi
:0041200A 57 push edi
:0041200B 8B7C2440 mov edi, dword ptr [esp+40]
:0041200F 33ED xor ebp, ebp
:00412011 896C240C mov dword ptr [esp+0C], ebp
:00412015 8B77F8 mov esi, dword ptr [edi-08] **注册名长度**
:00412018 85F6 test esi, esi
:0041201A 7527 jne 00412043
:0041201C 8D4C2440 lea ecx, dword ptr [esp+40]
:00412020 C7442438FFFFFFFF mov [esp+38], FFFFFFFF

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:00412028 E895890000 Call 0041A9C2
:0041202D 5F pop edi
:0041202E 5E pop esi
:0041202F 33C0 xor eax, eax
:00412031 5D pop ebp
:00412032 8B4C2424 mov ecx, dword ptr [esp+24]
:00412036 64890D00000000 mov dword ptr fs:[00000000], ecx
:0041203D 83C430 add esp, 00000030
:00412040 C20800 ret 0008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041201A(C)
|
:00412043 83FE20 cmp esi, 00000020 **长度与32比较**
:00412046 7E05 jle 0041204D
:00412048 BE20000000 mov esi, 00000020

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412046(C)
|
:0041204D 33C0 xor eax, eax
:0041204F 85F6 test esi, esi
:00412051 7E14 jle 00412067
:00412053 8D4C2410 lea ecx, dword ptr [esp+10]
:00412057 2BF9 sub edi, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412065(C)
|
:00412059 8D540410 lea edx, dword ptr [esp+eax+10]
:0041205D 40 inc eax
:0041205E 3BC6 cmp eax, esi
:00412060 8A0C17 mov cl, byte ptr [edi+edx]
:00412063 880A mov byte ptr [edx], cl **将名字放入[edx]处**
:00412065 7CF2 jl 00412059

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412051(C)
|
:00412067 83FE20 cmp esi, 00000020
:0041206A 53 push ebx
:0041206B 8BCE mov ecx, esi
:0041206D 7D30 jge 0041209F
:0041206F 8D7C2414 lea edi, dword ptr [esp+14]
:00412073 8D6C2414 lea ebp, dword ptr [esp+14]
:00412077 4F dec edi
:00412078 2BEF sub ebp, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412099(C)
|
:0041207A 8A1C0F mov bl, byte ptr [edi+ecx] **取名字最后一位**
:0041207D 8D340F lea esi, dword ptr [edi+ecx]
:00412080 8BC3 mov eax, ebx
:00412082 25FF000000 and eax, 000000FF
:00412087 99 cdq
:00412088 F7F9 idiv ecx
:0041208A 8BD0 mov edx, eax
:0041208C 8AC3 mov al, bl
:0041208E F6E9 imul cl
:00412090 02D0 add dl, al
:00412092 41 inc ecx
:00412093 83F920 cmp ecx, 00000020
:00412096 88142E mov byte ptr [esi+ebp], dl
:00412099 7CDF jl 0041207A

此处以上为取名字最后一位，做运算，再用运算结果重复运算，每运算一次生成一个数写入到名字后面的内存中，生成一张表，加上名字共32个字节。

:0041209B 8B6C2410 mov ebp, dword ptr [esp+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041206D(C)
|
:0041209F 33FF xor edi, edi
:004120A1 33F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004120D6(C)
|
:004120A3 8BC6 mov eax, esi
:004120A5 33C9 xor ecx, ecx
:004120A7 99 cdq
:004120A8 83E203 and edx, 00000003
:004120AB C6443C1000 mov [esp+edi+10], 00
:004120B0 03C2 add eax, edx
:004120B2 C1F802 sar eax, 02
:004120B5 8D440414 lea eax, dword ptr [esp+eax+14]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004120CA(C)
|
:004120B9 8A1408 mov dl, byte ptr [eax+ecx]**依次取刚才生成
:004120BC 8A5C3C10 mov bl, byte ptr [esp+edi+10] 的表的各字节**
:004120C0 32DA xor bl, dl **俩俩异或**
:004120C2 41 inc ecx
:004120C3 83F908 cmp ecx, 00000008
:004120C6 885C3C10 mov byte ptr [esp+edi+10], bl
:004120CA 7CED jl 004120B9
:004120CC 83C620 add esi, 00000020
:004120CF 47 inc edi
:004120D0 81FE80000000 cmp esi, 00000080
:004120D6 7CCB jl 004120A3

此前一小段是将该内存表的各字节8个一组，依次异或，共生成4个数，依次填到名字前的四个字节中。将该四个数倒过来（即离名字最近的一位为高位），转为10进制即是注册码。

:004120D8 B803000000 mov eax, 00000003
:004120DD 5B pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004120EE(C)
|
:004120DE 33C9 xor ecx, ecx
:004120E0 8A4C040C mov cl, byte ptr [esp+eax+0C]
:004120E4 03E9 add ebp, ecx
:004120E6 85C0 test eax, eax
:004120E8 7406 je 004120F0
:004120EA C1E508 shl ebp, 08
:004120ED 48 dec eax
:004120EE 79EE jns 004120DE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004120E8(C)
|
:004120F0 8B542444 mov edx, dword ptr [esp+44]
:004120F4 8D4C2440 lea ecx, dword ptr [esp+40]
:004120F8 2BEA sub ebp, edx
:004120FA C7442438FFFFFFFF mov [esp+38], FFFFFFFF
:00412102 F7DD neg ebp
:00412104 1BED sbb ebp, ebp
:00412106 45 inc ebp
:00412107 8BF5 mov esi, ebp

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:00412109 E8B4880000 Call 0041A9C2
:0041210E 8B4C2430 mov ecx, dword ptr [esp+30]
:00412112 8BC6 mov eax, esi
:00412114 5F pop edi
:00412115 5E pop esi
:00412116 5D pop ebp
:00412117 64890D00000000 mov dword ptr fs:[00000000], ecx
:0041211E 83C430 add esp, 00000030
:00412121 C20800 ret 0008

上面主要是讨论了名字长度不大于32位的时候，若大于则只取前32位，便用该32位做表，以后过程与小于32位的相同。

下面是注册机，用TC2写的，我的C很烂，所以估计很难看懂8-）。
main()
{int i,k,num1,num2,num3,a[32];long num4,b[4];
char name[32];
printf("Jiami v2.0 Keymaker by KanKer.\n");
printf("\n*********************************\n");
printf("\nWelcome to visit my homepage:\nhttp://kanker.ccoo.com.");
printf("\n\n**********************************\n");
printf("\nPlease input your name(length<=32):");
gets(name);
i=strlen(name);
if (i<0x20)
{num4=name[i-1];
for(k=i;k<0x20;k++)
{num1=num4;
num1=num1&0xff;
num2=num1/k;
num3=(num1*k)%0x100;
num4=num2+num3;
a[k]=num4%0x100;
}
}
for(k=0;k<i;k++)
a[k]=name[k];

/**************************/

num4=1;
for(i=0;i<4;i++)
{
num3=0;
for(k=8*i;k<8*i+8;k++)
{num1=num3;
num2=a[k];
num3=num2^num1;
}
b[i]=num3*num4;
num4=num4*0x100;
}
num4=0;
for(i=3;i>=0;i--)
num4=num4+b[i];
printf("Your regcode is: %ld",num4);}

但用此注册机注出来有很多是负数，这在程序注册时是输不进去的，大概是原程序本身的问题吧？所以只能找个能注出正数的名字来注册了，呵呵。

Cracked by KanKer
http://kanker.ccoo.com


文件密使2.1

 标 题:文件密使2.1破解及注册算法，请伪哥帮忙些个机！ (4千字)
发信人:TAE!
时 间:2001-7-18 18:15:26
详细信息:
目标软件：文件密使2.1
破解人 ：TAE![CCG BCG FCG]
保护方法：注册码
下载地址：http://newhua.infosail.com/down/jiami.exe

前面的步骤不再敷述，下面是重点！
跟踪到这里：
:00415C85 E80E4E0000 Call 0041AA98
:00415C8A 8D8E50160000 lea ecx, dword ptr [esi+00001650]
:00415C90 E82BC3FFFF call 00411FC0 \\进入
:00415C95 85C0 test eax, eax
:00415C97 752E jne 00415CC7
:00415C99 6A40 push 00000040

* Possible Reference to Dialog:
|
:00415C9B 6890814200 push 00428190

* Possible StringData Ref from Data Obj ->"注册码错误，请重新输入"
|
:00415CA0 68288F4200 push 00428F28
:00415CA5 8BCB mov ecx, ebx

下面是第一段：
:0041204A 8A1C0F mov bl, byte ptr [edi+ecx]
:0041204D 8D340F lea esi, dword ptr [edi+ecx]
:00412050 8BC3 mov eax, ebx
:00412052 25FF000000 and eax, 000000FF
:00412057 99 cdq
:00412058 F7F9 idiv ecx
:0041205A 8BD0 mov edx, eax
:0041205C 8AC3 mov al, bl
:0041205E F6E9 imul cl
:00412060 02D0 add dl, al
:00412062 41 inc ecx
:00412063 83F920 cmp ecx, 00000020
:00412066 88142E mov byte ptr [esi+ebp], dl
:00412069 7CDF jl 0041204A
这段程序是算第一个数据串依次放入了esi+ebp，待会说说它的算法！下面会用到。

:0041206B 8B6C2410 mov ebp, dword ptr [esp+10]
:0041206F 33FF xor edi, edi
:00412071 33F6 xor esi, esi
:00412073 8BC6 mov eax, esi
:00412075 33C9 xor ecx, ecx
:00412077 99 cdq
:00412078 83E203 and edx, 00000003
:0041207B C6443C1000 mov [esp+edi+10], 00
:00412080 03C2 add eax, edx
:00412082 C1F802 sar eax, 02
:00412085 8D440414 lea eax, dword ptr [esp+eax+14]

再看下面这里：
又一个循环！
:00412089 8A1408 mov dl, byte ptr [eax+ecx]
:0041208C 8A5C3C10 mov bl, byte ptr [esp+edi+10]
:00412090 32DA xor bl, dl
:00412092 41 inc ecx
:00412093 83F908 cmp ecx, 00000008
:00412096 885C3C10 mov byte ptr [esp+edi+10], bl
:0041209A 7CED jl 00412089 \\内层的小循环
将上面得到的数据和用户名连接进行计算！

:0041209C 83C620 add esi, 00000020 \\大循环每循环一次esi＋20
:0041209F 47 inc edi
:004120A0 81FE80000000 cmp esi, 00000080 \\也就是循环4次喽！
:004120A6 7CCB jl 00412073 \\外面一层大循环！
经过以上四次大循环可以得到四个数值！
:004120AE 33C9 xor ecx, ecx
:004120B0 8A4C040C mov cl, byte ptr [esp+eax+0C]
:004120B4 03E9 add ebp, ecx
:004120B6 85C0 test eax, eax
:004120B8 7406 je 004120C0
:004120BA C1E508 shl ebp, 08
:004120BD 48 dec eax
:004120BE 79EE jns 004120AE
这里试讲算出的四个数值连接起来放入ebp，于是这个ebp中数的10进制值就是正确的注册码了！
:004120C0 8B542444 mov edx, dword ptr [esp+44]
:004120C4 8D4C2440 lea ecx, dword ptr [esp+40]
:004120C8 2BEA sub ebp, edx
:004120CA C7442438FFFFFFFF mov [esp+38], FFFFFFFF
:004120D2 F7DD neg ebp
:004120D4 1BED sbb ebp, ebp
:004120D6 45 inc ebp
:004120D7 8BF5 mov esi, ebp

注册算法：
姓名以“1234”为例,有4个字符，用名字的最后一个字符
0x34/4=0xD
0x34*4=0xD0
0xD0+0xD=0xDD//数据串中的第一个数
然后就是用
0xDD/5=0x2C
0xDD*5=0xFF51
0x51＋0x2C＝0x7D//数据串中的第二个数
算出20个数后，将名字和这20个数连接起来形成"31323334DD7D020E7105322AFBD282EE20F0E0AC871"
0x31^0=0x31
0x31^0x32=03
03^0x33=30
做8次这样的操作以后得到一个数0xA8
外面的大循环做4次，于是得到四个数0xA8、0xE0、0x3E、0x00，将四个数反相连接起来得到3EE0A8，
这就是注册码的16进制数，那么将它换算成十进制就是正确的注册码了！
一个可用的注册码！
用户名：TAE![CCG]
注册码：45677

我的注册机已经写了一大半了，可是有些实现为程序的细节不太清楚，所以请伪装者大哥给写个注册机，
好让我学协！多谢了！！

标 题:贴这个的注册机~~~~哎~~~ (885字)
发信人:伪装者[CCG]
时 间:2001-7-19 1:05:39
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[32];
int i,d;
unsigned long n;
static g[4];
unsigned char c,e;
printf("*********JiaMi 2.1*********\nThis keygen is made by Pretender\nPlease
  input your name : ");
gets(string);
printf("Your Register code is  : ");
d=strlen(string);
for(i=d-1;i<32;i++)
{c=string[i];
e=c;
e/=(i+1);
c*=(i+1);
c&=0xff;
c+=e;
c&=0xff;
string[i+1]=c;
}
for(i=0;i<8;i++)
{c=string[i];
g[0]^=c;}
for(i=8;i<16;i++)
{c=string[i];
g[1]^=c;}
for(i=16;i<24;i++)
{c=string[i];
g[2]^=c;}
for(i=24;i<32;i++)
{c=string[i];
g[3]^=c;}
n=g[3];
n=n<<8;
n+=g[2];
n=n<<8;
n+=g[1];
n=n<<8;
n+=g[0];
printf("%lu",n);
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}

标 题:汇编注册机,写个玩玩, (3千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-20 6:56:03
详细信息:

编译后3K,哪位懒得编译QQ发给你
;*********************************MASM 6.0 Compile

cls
c:\masm32\bin\ml /c /coff /Cp cr_wm.asm
rc /v cr_wm.rc
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib cr_wm.obj cr_wm.res

;***********************************
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib

_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
Serial db 4 dup(0)
Username db 36 dup(0)
Currentpos dd 0
szBuf1 db 100 dup(0)
szBuf2 db "%u",0

MsgMesaage1 db "Must input Username in order to generate Reg Code! ",0
MsgCap db "By (C)hume,2001",0
MsgMesaage2 db "The Username can't exceed 32 byetes! ",0

.data?
hInstance HANDLE ?
.const
DLG_MAIN equ 1000
IDC_UN equ 1001
IDC_REG equ 1002
ID_GEN equ 1003
ID_EXIT equ 1004
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL

_ProcDlg proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,\
SWP_NOMOVE or SWP_NOSIZE or SWP_DRAWFRAME
.elseif eax == WM_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==ID_GEN
invoke GetDlgItem,hWnd,IDC_UN
invoke SetFocus,eax
invoke RtlZeroMemory,addr Username,33
invoke RtlZeroMemory,addr szBuf1,100
invoke GetDlgItemText,hWnd,IDC_UN,addr Username,32
.if eax>32
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION

.elseif eax!=0
call Cal
mov eax,dword ptr Serial
invoke wsprintf,addr szBuf1,addr szBuf2,eax
invoke SetDlgItemText,hWnd,IDC_REG,addr szBuf1
invoke GetDlgItem,hWnd,IDC_REG
invoke SetFocus,eax

.else
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION
.endif

.elseif ax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif

.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlg ENDP

Cal proc
pusha

mov al,0
mov ecx,-1
LEA EDI,Username
repnz scasb
NOT ecx
dec ecx
LEA EDI,Username
dec edi

Fill_Rest:
mov bl, byte ptr [edi+ecx]
lea esi,[edi+ecx]
mov eax, ebx
and eax, 0FFh
cdq
idiv ecx
mov edx, eax
mov al, bl
imul cl
add dl, al
inc ecx
cmp ecx, 20h
mov byte ptr [esi+1], dl
jl Fill_Rest
lea ebp,Serial
xor esi, esi
xor edi,edi
mov eax, esi

Calsn: mov eax,esi
xor ecx, ecx
cdq
mov byte ptr [ebp+edi], 0
sar eax, 2

Xor_Every_8bit:
add ecx,eax
mov dl, byte ptr [ebp+ecx+4] ;取每8位第一个字节
and ecx,7
mov bl, byte ptr [ebp+edi]
xor bl, dl
inc ecx
cmp ecx, 8
mov byte ptr [ebp+edi], bl
jl Xor_Every_8bit
add esi, 20h
inc edi
cmp esi, 80h
jl Calsn

popa
ret
Cal endp
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end all
end start
;**********************************
#include <c:\masm32\include\resource.h>

#define DLG_MAIN 1000
#define IDC_UN 1001
#define IDC_REG 1002
#define ID_GEN 1003
#define ID_EXIT 1004

DLG_MAIN DIALOG 31, 56, 262, 52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "文件密使.V2.1 Keygen by Hume.E-mail:humewen@263.net"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "GENERATE", ID_GEN, 191, 6, 50, 14
PUSHBUTTON "EXIT", ID_EXIT, 191, 26, 50, 14
EDITTEXT IDC_UN, 43, 10, 128, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_REG, 43, 29, 128, 13, ES_READONLY | WS_BORDER | WS_TABSTOP
LTEXT "注册名:", -1, 8, 12, 26, 10
LTEXT "注册码:", -1, 8, 30, 25, 9
}


我的代码宝典

 标 题:暑假第一篇！说句心里话，放假就是比上学爽！（废话！） (12千字)
发信人:crack007
时 间:2001-6-30 14:16:15
详细信息:
这个暑假我想学一下C和VC，别人的经验不可少，所以就找了这么个软件，用着的确不错，推荐注册！（有人云：你注册了吗？你看你看，这是谁问的，怎么这么没水平，我当然是………，嘿嘿，不告诉你！~-~）

闲话少说，以下是这个软件的基本资料和跟踪过程。

软件名：《我的代码宝典》(原《程序员宝典》)
简介 ：
iCodeRepository是专门为程序员设计的源代码管理工具，另外附带了几个实用的小工具。 iCodeRepository的新特点: 改正了1.1版riched20.dll不支持中文查找引起的错误，改正了知识切换时滚动条定位错误。 VC VB Delphi语法关键字显示以及可调整的显示方式使你可以更方便的阅读源程序。 htm txt转换为VC VB Delphi语法关键字高亮显示的htm文件，使你的主页中的源程序更容易阅读。 强有力的搜索功能使你能够快速找到符合你需要的源程序。 书签功能可以保存你需要的知识条目。 导入文件和目录功能使你可以快速的填充你的知识库。 导入时可以对*.htm *.rtf文件进行特殊处理，从中提取出文本信息。 支持UNICODE。 Mini Spy++可以快速查看窗口属性。 取色器可以拾取你想要的颜色。

下载地址：http://www.csdn.net/soft/openfile.asp?kind=1&id=10964 （2057K）

作者：Crack007[BCG]
主页：http://www.crack007.com ( ^-^ )
工具：TRW2000 1.23 W32dasm893 Regmon Unaspack
日期：2001－06－30
这个软件跟FlashGet差不多，都是注册时先把注册码写进注册表([HKEY_CURRENT_USER\Software\iCodeRepository\iCodeRepository\Register]
"User"="Crack007[BCG]"
"strSN"="78787878"，可以用Regmon跟踪到。修改strSN的键值可以重复注册)，然后再重新启动软件时进行比对，但我用Bpx RegQueryValue进行拦截时虽能拦得到，但却毫无头绪。只好用W32dasm反汇编以下看看有什么感兴趣的东西。这个软件采用Aspack1.83进行压缩，用Unaspack可以非常轻松的脱去。脱去之后查子串“strSN”,乖乖，一查不得了竟然有十几个！看来得另外换个法子。执行程序，看看帮助里面的“关于”选项，很好，有个“未注册”字样，而且还是高亮的红色，再查！
这次很爽，只查到了两个。

输入注册名Crack007[BCG]和注册码78787878之后，下Bpx 4011d8 和Bpx 6165d3。但我估计事实上可以在14处下类似的断点（当然这是在Crack后得知的啦。^-^）。

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－这是在“关于”项的比较部分
点击“关于”可被Bpx 4011d8拦截
* Possible StringData Ref from Data Obj ->"User" －－－
| ｜
:0040116E 6854904300 push 00439054 ｜
:00401173 8D442418 lea eax, dword ptr [esp+18] ｜
｜
* Possible StringData Ref from Data Obj ->"Register" ｜
| ｜
:00401177 6848904300 push 00439048 ｜
:0040117C 50 push eax ｜
:0040117D 8BCF mov ecx, edi ｜
｜
* Reference To: MFC42.Ordinal:0DC2, Ord:0DC2h ｜
| ｜这部分是干什么的
:0040117F E896500200 Call 0042621A ｜我就不用说了吧。:D
:00401184 6870B94300 push 0043B970 ｜
｜
* Possible StringData Ref from Data Obj ->"strSN" ｜
| ｜
:00401189 6840904300 push 00439040 ｜
:0040118E 8D4C241C lea ecx, dword ptr [esp+1C] ｜
｜
* Possible StringData Ref from Data Obj ->"Register" ｜
| ｜
:00401192 6848904300 push 00439048 ｜
:00401197 51 push ecx ｜
:00401198 8BCF mov ecx, edi ｜
:0040119A C744243800000000 mov [esp+38], 00000000 ｜
－－－
* Reference To: MFC42.Ordinal:0DC2, Ord:0DC2h
|
:004011A2 E873500200 Call 0042621A
:004011A7 51 push ecx
:004011A8 8D542418 lea edx, dword ptr [esp+18]
:004011AC B301 mov bl, 01
:004011AE 8BCC mov ecx, esp
:004011B0 8964241C mov dword ptr [esp+1C], esp
:004011B4 52 push edx
:004011B5 885C2430 mov byte ptr [esp+30], bl

* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:004011B9 E856500200 Call 00426214
:004011BE 51 push ecx
:004011BF 8D442418 lea eax, dword ptr [esp+18]
:004011C3 8BCC mov ecx, esp
:004011C5 89642424 mov dword ptr [esp+24], esp
:004011C9 50 push eax
:004011CA C644243402 mov [esp+34], 02

* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:004011CF E840500200 Call 00426214
:004011D4 885C2430 mov byte ptr [esp+30], bl
:004011D8 E823840000 call 00409600 <-----关键Call,需要跟进
:004011DD 83C408 add esp, 00000008
:004011E0 84C0 test al, al
:004011E2 7441 je 00401225 <-----是不是很眼熟？^o^
:004011E4 8D4C2410 lea ecx, dword ptr [esp+10]
:004011E8 8D542418 lea edx, dword ptr [esp+18]
:004011EC 51 push ecx

* Possible StringData Ref from Data Obj ->"这个软件注册给: "
|
:004011ED 682C904300 push 0043902C
:004011F2 52 push edx

* Reference To: MFC42.Ordinal:039E, Ord:039Eh
|
:004011F3 E816500200 Call 0042620E
:004011F8 8B00 mov eax, dword ptr [eax]
:004011FA 8BCE mov ecx, esi
:004011FC 50 push eax
:004011FD 6844040000 push 00000444
:00401202 C644243003 mov [esp+30], 03

* Reference To: MFC42.Ordinal:1741, Ord:1741h
|
:00401207 E8FC4F0200 Call 00426208
:0040120C 8D4C2418 lea ecx, dword ptr [esp+18]
:00401210 885C2428 mov byte ptr [esp+28], bl

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:00401214 E8E94F0200 Call 00426202
:00401219 6A00 push 00000000
:0040121B 8D4E60 lea ecx, dword ptr [esi+60]

* Reference To: MFC42.Ordinal:1847, Ord:1847h
|
:0040121E E8D94F0200 Call 004261FC
:00401223 EB11 jmp 00401236

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011E2(C)
|

* Possible StringData Ref from Data Obj ->"[未注册]"
|
:00401225 6820904300 push 00439020
:0040122A 6844040000 push 00000444
:0040122F 8BCE mov ecx, esi

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－这是程序启动时进行比较的部分
将被px 6165d3拦截
* Possible StringData Ref from Data Obj ->"User"
|
:0041656D 6854904300 push 00439054
:00416572 8D542418 lea edx, dword ptr [esp+18]

* Possible StringData Ref from Data Obj ->"Register"
|
:00416576 6848904300 push 00439048
:0041657B 52 push edx
:0041657C 8BCF mov ecx, edi

* Reference To: MFC42.Ordinal:0DC2, Ord:0DC2h
|
:0041657E E897FC0000 Call 0042621A
:00416583 6870B94300 push 0043B970

* Possible StringData Ref from Data Obj ->"strSN"
|
:00416588 6840904300 push 00439040
:0041658D 8D442434 lea eax, dword ptr [esp+34]

* Possible StringData Ref from Data Obj ->"Register"
|
:00416591 6848904300 push 00439048
:00416596 50 push eax
:00416597 8BCF mov ecx, edi
:00416599 895C2434 mov dword ptr [esp+34], ebx

* Reference To: MFC42.Ordinal:0DC2, Ord:0DC2h
|
:0041659D E878FC0000 Call 0042621A
:004165A2 51 push ecx
:004165A3 8D542430 lea edx, dword ptr [esp+30]
:004165A7 8BCC mov ecx, esp
:004165A9 89642418 mov dword ptr [esp+18], esp
:004165AD 52 push edx
:004165AE C644242C01 mov [esp+2C], 01

* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:004165B3 E85CFC0000 Call 00426214
:004165B8 51 push ecx
:004165B9 8D442418 lea eax, dword ptr [esp+18]
:004165BD 8BCC mov ecx, esp
:004165BF 89642420 mov dword ptr [esp+20], esp
:004165C3 50 push eax
:004165C4 C644243002 mov [esp+30], 02

* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:004165C9 E846FC0000 Call 00426214
:004165CE C644242C01 mov [esp+2C], 01
:004165D3 E82830FFFF call 00409600 <----同上
:004165D8 83C408 add esp, 00000008
:004165DB 3AC3 cmp al, bl
:004165DD 7407 je 004165E6 <----若为 0 则 Over !

* Possible StringData Ref from Data Obj ->"iCodeRepository -《我的代码宝典》"
|
:004165DF 68C0A84300 push 0043A8C0
:004165E4 EB05 jmp 004165EB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004165DD(C)
|

* Possible StringData Ref from Data Obj ->"iCodeRepository -《我的代码宝典》(未注册)"
|
:004165E6 6894A84300 push 0043A894

* Referenced by a CALL at Addresses: *
|:004011D8 , :004014DE , :0040182A , :00404F1B , :0040DC6C * 这么多地址都调用这个
|:0040E93D , :0040F313 , :004165D3 , :00419CA1 , :0041BAFB * Call，真变态！
|:00420683 , :00420C5D , :004244DC , :00425C2C *
|
:00409600 6AFF push FFFFFFFF
:00409602 6880834200 push 00428380
:00409607 64A100000000 mov eax, dword ptr fs:[00000000]
:0040960D 50 push eax
:0040960E 64892500000000 mov dword ptr fs:[00000000], esp
:00409615 51 push ecx
:00409616 53 push ebx
:00409617 51 push ecx
:00409618 8D44241C lea eax, dword ptr [esp+1C]
:0040961C 8BCC mov ecx, esp
:0040961E 89642408 mov dword ptr [esp+08], esp
:00409622 50 push eax
:00409623 C744241801000000 mov [esp+18], 00000001

* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:0040962B E8E4CB0100 Call 00426214
:00409630 8D4C2408 lea ecx, dword ptr [esp+08]
:00409634 51 push ecx
:00409635 E8B6FDFFFF call 004093F0
:0040963A 8B542424 mov edx, dword ptr [esp+24] <----此处可见输入的注册码
:0040963E 8B00 mov eax, dword ptr [eax] <----EAX里保存有正确的注册码
:00409640 52 push edx
:00409641 50 push eax

* Reference To: MSVCRT._mbscmp, Ord:0159h
^^^^^^^^^^^^^^说实话，我看见SCMP心里就爽，嘿嘿…
|
:00409642 FF1554D84200 Call dword ptr [0042D854]
:00409648 83C410 add esp, 00000010
:0040964B 8D4C2404 lea ecx, dword ptr [esp+04]
:0040964F 85C0 test eax, eax
:00409651 0F94C3 sete bl

整理一下：
Name: Crack007[BCG]
Code: 470737592182

OK,我闪先！

伪哥,该你出场了.^o^


五子棋99 V2.0

标 题:一篇破解教程-----面向初学者 (15千字)
发信人:Fpc
时 间:2001-4-1 11:44:22
详细信息:
一篇破解教程-----面向初学者（转载请保持完整，且不得用于商业用途）
作者: Fpc
工具：Trw2000，W32dasm 8.93

软件名称：五子棋99 Ver 2.0
作 者: 华东计算技术研究所 蒋祥刚
文件大小：497KB
授权方式：共享软件
使用平台：Win95/98

软件简介：一个五子棋游戏软件，与常见的同类软件差不多，棋力不强

软件来源：《网页设计素材2000》(3CD)中的游戏目录
下载地址：暂时不可用，大家耐心等

见到需要输入注册名和注册码的软件就忍不住去按 ^D，可能是破解综合症吧 ~_~。在同事的机器上发现了一个五子棋的游戏，玩了几局，居然要注册。简直是*#*@&&，也不看看棋力有多差，都不忍心去破。想一想，权当是一个CrackMe，开始吧。
多说两句，大多数五子棋软件的棋力都不行，都是乱走棋，只要你看过一两本棋谱，对付它们不成问题。记得在学校时接触过一个“五子棋大师 二”，体积很大，但棋力非常强。其实优秀的棋类软件应该是算法和棋谱管理的结合体。象棋的“将族3”就很厉害，我连“小猪头”都对付不了，自己也是太笨：-）

用TRW2000（感谢LTT和ZNH，我决定注册，不知注册费是多少￥）载入FIVE，在“关于”中要求输入注册码。这是一个典型的“注册名”加“注册码”注册形式。在姓名中输入“Fpc”，注册码中输入“494949”（在下面的分析中你会看到，正好满足了6位注册码的条件）。
^N到TRW，下bpx hmemcpy（万能中断）；^N返回，单击“注册”，立刻到TRW中，按一次^N（因为有两个输入的文本框），还会回到TRW中；
下BD *，按几次F12，你会返回到下面，见分析：

:0045E884 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:0045E88A E81DC6FCFF call 0042AEAC <==== 这次调用取得 注册名
:0045E88F 8B45FC mov eax, dword ptr [ebp-04]
:0045E892 50 push eax

* Possible StringData Ref from Code Obj ->"Name"
|
:0045E893 B92CE94500 mov ecx, 0045E92C

* Possible StringData Ref from Code Obj ->"Register"
|
:0045E898 BA3CE94500 mov edx, 0045E93C
:0045E89D A1649A4600 mov eax, dword ptr [00469A64]
:0045E8A2 8B18 mov ebx, dword ptr [eax]
:0045E8A4 FF5304 call [ebx+04] <==== 写入 ini 文件
:0045E8A7 8D55FC lea edx, dword ptr [ebp-04]
:0045E8AA A15C9A4600 mov eax, dword ptr [00469A5C]
:0045E8AF 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:0045E8B5 E8F2C5FCFF call 0042AEAC <==== 取得输入的注册码
:0045E8BA 8B45FC mov eax, dword ptr [ebp-04] 《=== 你会返回到这里
:0045E8BD 50 push eax

* Possible StringData Ref from Code Obj ->"RegNo"
|
:0045E8BE B950E94500 mov ecx, 0045E950

* Possible StringData Ref from Code Obj ->"Register"
|
:0045E8C3 BA3CE94500 mov edx, 0045E93C
:0045E8C8 A1649A4600 mov eax, dword ptr [00469A64]
:0045E8CD 8B18 mov ebx, dword ptr [eax]
:0045E8CF FF5304 call [ebx+04] <==== 写入 ini 文件
:0045E8D2 E855FDFFFF call 0045E62C <==== Call+Cmp+Jmp 的注册码判断模式非常常见
:0045E8D7 803D609A460000 cmp byte ptr [00469A60], 00 <==== [469A60]是个标志，如果不为0，则注册成功
:0045E8DE 750C jne 0045E8EC

* Possible StringData Ref from Code Obj ->"名字和注册号不匹配！" <==== 可惜在 TRW 和 W32dasm 的正文中都无法看到汉字 :-(
|
:0045E8E0 B860E94500 mov eax, 0045E960
:0045E8E5 E876CAFEFF call 0044B360 <==== 调用MessageBoxA
:0045E8EA EB14 jmp 0045E900

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E8DE(C)
|

* Possible StringData Ref from Code Obj ->"恭喜你已经成功注册！"
|
:0045E8EC B88CE94500 mov eax, 0045E98C
:0045E8F1 E86ACAFEFF call 0044B360 <==== 同样调用MessageBoxA
:0045E8F6 A15C9A4600 mov eax, dword ptr [00469A5C]
:0045E8FB E85C51FEFF call 00443A5C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E8EA(U)
|
:0045E900 33C0 xor eax, eax
:0045E902 5A pop edx
:0045E903 59 pop ecx
:0045E904 59 pop ecx
:0045E905 648910 mov dword ptr fs:[eax], edx
:0045E908 681DE94500 push 0045E91D <==== 这里我想不明白是如何产生的，这种调用（跳转）在W32dasm中不会给出提示
<==== 这个push 和之后的 ret 会越过下面的两个 jmp
* Referenced by a (U)nconditional or (C)onditional Jump at Address: <==== 跳到45E91D去执行，明白其中道理的请告诉我
|:0045E91B(U)
|
:0045E90D 8D45FC lea eax, dword ptr [ebp-04]
:0045E910 E8AB4FFAFF call 004038C0
:0045E915 C3 ret

:0045E916 E9E149FAFF jmp 004032FC
:0045E91B EBF0 jmp 0045E90D
:0045E91D 5B pop ebx <====
:0045E91E 59 pop ecx
:0045E91F 5D pop ebp
:0045E920 C3 ret

很明显，:0045E8D2 处的调用的 call 0045E62C 是判断注册码的关键。下bpx 45E8D2，^N返回到FIVE中，用原来的信息再注册。这次会直接中断到 45E8D2，按F8追进这个call:

* Referenced by a CALL at Addresses:
|:0045E8D2 , :0045E9DA
|
:0045E62C 55 push ebp
:0045E62D 8BEC mov ebp, esp
:0045E62F 81C4CCFDFFFF add esp, FFFFFDCC
:0045E635 53 push ebx
:0045E636 56 push esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E5D0(C)
|
:0045E637 57 push edi
:0045E638 33C0 xor eax, eax
:0045E63A 8985CCFDFFFF mov dword ptr [ebp+FFFFFDCC], eax
:0045E640 33C0 xor eax, eax
:0045E642 55 push ebp
:0045E643 68A0E74500 push 0045E7A0
:0045E648 64FF30 push dword ptr fs:[eax]
:0045E64B 648920 mov dword ptr fs:[eax], esp
:0045E64E 6A00 push 00000000
:0045E650 8D85CCFDFFFF lea eax, dword ptr [ebp+FFFFFDCC]
:0045E656 50 push eax

* Possible StringData Ref from Code Obj ->"Name"
|
:0045E657 B9B8E74500 mov ecx, 0045E7B8

* Possible StringData Ref from Code Obj ->"register"
|
:0045E65C BAC8E74500 mov edx, 0045E7C8
:0045E661 A1649A4600 mov eax, dword ptr [00469A64]
:0045E666 8B18 mov ebx, dword ptr [eax]
:0045E668 FF13 call dword ptr [ebx] <==== 从ini文件中取得注册名
:0045E66A 8B95CCFDFFFF mov edx, dword ptr [ebp+FFFFFDCC] \
:0045E670 8D85D0FDFFFF lea eax, dword ptr [ebp+FFFFFDD0] |
:0045E676 B9FF000000 mov ecx, 000000FF |
:0045E67B E89854FAFF call 00403B18 |
:0045E680 8D95D0FDFFFF lea edx, dword ptr [ebp+FFFFFDD0] |
:0045E686 8D459B lea eax, dword ptr [ebp-65] \ 将注册名信息存放到 ebp-64到ebp处，ebp-65是注册名长度
/
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:0045E622(C) |
| |
:0045E689 B164 mov cl, 64 |
:0045E68B E8F041FAFF call 00402880 /
:0045E690 6A00 push 00000000
:0045E692 8D85CCFDFFFF lea eax, dword ptr [ebp+FFFFFDCC]
:0045E698 50 push eax

* Possible StringData Ref from Code Obj ->"RegNo"
|
:0045E699 B9DCE74500 mov ecx, 0045E7DC

* Possible StringData Ref from Code Obj ->"register"
|
:0045E69E BAC8E74500 mov edx, 0045E7C8
:0045E6A3 A1649A4600 mov eax, dword ptr [00469A64]
:0045E6A8 8B18 mov ebx, dword ptr [eax]
:0045E6AA FF13 call dword ptr [ebx] <==== 从ini文件中取得注册码
:0045E6AC 8B95CCFDFFFF mov edx, dword ptr [ebp+FFFFFDCC] \
:0045E6B2 8D85D0FDFFFF lea eax, dword ptr [ebp+FFFFFDD0] |
:0045E6B8 B9FF000000 mov ecx, 000000FF |
:0045E6BD E85654FAFF call 00403B18 \ 将注册名信息存放到 ebp-c9到ebp-66处，ebp-ca是注册名长度
:0045E6C2 8D95D0FDFFFF lea edx, dword ptr [ebp+FFFFFDD0] /
:0045E6C8 8D8536FFFFFF lea eax, dword ptr [ebp+FFFFFF36] |
:0045E6CE B164 mov cl, 64 |
:0045E6D0 E8AB41FAFF call 00402880 /
:0045E6D5 8A459B mov al, byte ptr [ebp-65]
:0045E6D8 84C0 test al, al <==== 检查注册名长度是否为0
:0045E6DA 7409 je 0045E6E5
:0045E6DC 80BD36FFFFFF06 cmp byte ptr [ebp+FFFFFF36], 06 <==== 检查注册码长度是否为6
:0045E6E3 740C je 0045E6F1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E6DA(C)
|
:0045E6E5 C605609A460000 mov byte ptr [00469A60], 00 <==== 错误则置标志为0
:0045E6EC E996000000 jmp 0045E787 <==== 跳到下面，返回

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E6E3(C)
|
:0045E6F1 8BF0 mov esi, eax
:0045E6F3 81E6FF000000 and esi, 000000FF
:0045E6F9 85F6 test esi, esi
:0045E6FB 7C21 jl 0045E71E
:0045E6FD 46 inc esi <==== esi为注册名长度加1
:0045E6FE 8D4D9B lea ecx, dword ptr [ebp-65] <==== ecx指向 注册名长度字节+注册名
:0045E701 8D9DD1FEFFFF lea ebx, dword ptr [ebp+FFFFFED1] <==== ebx指向欲生成的注册码地址

* Referenced by a (U)nconditional or (C)onditional Jump at Address: <==== 下面这个循环生成注册码，设为 注册码A
|:0045E71C(C)
|
:0045E707 33C0 xor eax, eax
:0045E709 8A01 mov al, byte ptr [ecx]
:0045E70B BF0A000000 mov edi, 0000000A <==== 除数为a，即为 10（十进制）
:0045E710 33D2 xor edx, edx
:0045E712 F7F7 div edi <==== 相除后，edx中为余数
:0045E714 80C230 add dl, 30 <==== 变为 ASCII 码
:0045E717 8813 mov byte ptr [ebx], dl <==== 按先后顺序存放于 [ebx]
:0045E719 43 inc ebx
:0045E71A 41 inc ecx
:0045E71B 4E dec esi
:0045E71C 75E9 jne 0045E707 <==== 未完则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E6FB(C)
|
:0045E71E 8A459B mov al, byte ptr [ebp-65]
:0045E721 3C06 cmp al, 06 <==== 注册名长度超过6字节则不需要再处理
:0045E723 732F jnb 0045E754
:0045E725 33C9 xor ecx, ecx
:0045E727 8AC8 mov cl, al
:0045E729 41 inc ecx
:0045E72A 83F906 cmp ecx, 00000006 <==== 多此一举！！
:0045E72D 7F25 jg 0045E754
:0045E72F 8D9C0DD0FEFFFF lea ebx, dword ptr [ebp+ecx-00000130] <==== 从 注册码A 的最后一个数开始补足7位

* Referenced by a (U)nconditional or (C)onditional Jump at Address: <==== 下面这个循环将生成的注册码A 补足为7位
|:0045E752(C)
|
:0045E736 33C0 xor eax, eax
:0045E738 8A03 mov al, byte ptr [ebx] <==== 取得[ebx]处的数字
:0045E73A 40 inc eax <==== 加一
:0045E73B 83E830 sub eax, 00000030
:0045E73E BE0A000000 mov esi, 0000000A
:0045E743 33D2 xor edx, edx
:0045E745 F7F6 div esi <==== 相除，取模到edx
:0045E747 80C230 add dl, 30 <==== 变为 ASCII 码
:0045E74A 885301 mov byte ptr [ebx+01], dl <==== 存放到[ebx+1]处
:0045E74D 41 inc ecx
:0045E74E 43 inc ebx
:0045E74F 83F907 cmp ecx, 00000007 <==== 不足7位则继续
:0045E752 75E2 jne 0045E736

可以分析出，注册码支持所有可打印字符和汉字；将 注册码A 补足为7位的规律是：将最后一位数加一作为下一位数，如果9加一则变为0，依次处理。例如：
注册码A=285，则补足为 2856789； 注册码A=3619，则补足为 3619012。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045E723(C), :0045E72D(C)
|
:0045E754 C685D8FEFFFF00 mov byte ptr [ebp+FFFFFED8], 00 <==== 很粗暴的在第八个字节处置0，之后的数字被舍弃
:0045E75B C605609A460001 mov byte ptr [00469A60], 01 <==== 预置注册标志为1（成功）
:0045E762 B906000000 mov ecx, 00000006 <==== 比较的字节数
:0045E767 8D85D2FEFFFF lea eax, dword ptr [ebp+FFFFFED2] <==== 算出的注册码，注意第一位被舍弃
:0045E76D 8D9537FFFFFF lea edx, dword ptr [ebp+FFFFFF37] <==== 你输入的注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E785(C)
|
:0045E773 8A18 mov bl, byte ptr [eax]
:0045E775 3A1A cmp bl, byte ptr [edx]
:0045E777 7409 je 0045E782
:0045E779 C605609A460000 mov byte ptr [00469A60], 00 <==== 比较失败则置标志为0
:0045E780 EB05 jmp 0045E787

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E777(C)
|
:0045E782 42 inc edx
:0045E783 40 inc eax
:0045E784 49 dec ecx
:0045E785 75EC jne 0045E773 <==== 不到6位则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045E6EC(U), :0045E780(U)
|
:0045E787 33C0 xor eax, eax
:0045E789 5A pop edx
:0045E78A 59 pop ecx
:0045E78B 59 pop ecx
:0045E78C 648910 mov dword ptr fs:[eax], edx
:0045E78F 68A7E74500 push 0045E7A7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045E7A5(U)
|
:0045E794 8D85CCFDFFFF lea eax, dword ptr [ebp+FFFFFDCC]
:0045E79A E82151FAFF call 004038C0
:0045E79F C3 ret

:0045E7A0 E9574BFAFF jmp 004032FC
:0045E7A5 EBED jmp 0045E794
:0045E7A7 5F pop edi
:0045E7A8 5E pop esi
:0045E7A9 5B pop ebx
:0045E7AA 8BE5 mov esp, ebp
:0045E7AC 5D pop ebp
:0045E7AD C3 ret <==== 返回

上面的判断过程用C表示：

int Success;

Registration()
{
int LenName, LenCode;
char UserName[100], RegCode[100], InputRegCode[6];
int i;

GetInfo( &UserName, LenName); /* 取得注册信息 */
GetInfo( &InputRegCode, LenCode); /* */

if ( LenName==0 || LenCode!=6 )
{
Success=0;
return;
}

RegCode[0]= LenName%10;
for( i=0; i<LenName; i++)
RegCode[i+1]= UserName[i]%10;

if ( LenName<6 )
for( i=0; i<6-LenName; i++)
RegCode[i+LenName+1]= (RegCode[i+lenName]+1)%10;

RegCode[7]='\0';
Success=1;
if (!strcmp( &RegCode, &InputRegCode))
Success=0;
return;
}

这基本上就是注册机，但没有必要。FIVE的注册形式比较简单，也未采取保护措施，容易分析，只要当作一个CrackMe就好。
破解完成加上这篇教程，一看时钟，ONLY 9：30，还作点什么的呢？这时有人满嘴酒气的冲进来，莫名其妙的问我是不是黑客，真是“好事不出门，坏事***”：大众根本就不懂HAKKER，CRAKKER是什么含义，也不能解释，真是扫兴。这时抬头看墙上的时钟，CALL 11：30！明天早晨又起不来了。“我单知道，TRW和SI会停系统时钟的，可怜我家的机器阿毛.......”（台下口号声此起彼伏：打倒唐僧），只有谢幕了。

@20001/03/21


喜悦加密器 v1.0

 标 题:注册 喜悦加密器 v1.0 [真是简单!] (2千字)
发信人:6767[BCG]
时 间:2001-7-27 13:57:21
详细信息:
注册 喜悦加密器 v1.0
by Fpc[CCG]

tools:softice

d/l:csdn download

它的注册算法设计的太糟了。

00446168 8D9528FEFFFF lea edx, [ebp+$FFFFFE28]

* Reference to control TForm3.Edit1 : TEdit
|
0044616E 8B83E4020000 mov eax, [ebx+$02E4]

|
00446174 E8D3E0FDFF call 0042424C <- 读取名字
00446179 8B8528FEFFFF mov eax, [ebp+$FFFFFE28]
0044617F 0FB64438FF movzx eax, byte ptr [eax+edi-$01] <- 顺序取字符
00446184 0145FC add [ebp-$04], eax <- 累加
00446187 47 inc edi
00446188 4E dec esi
00446189 75DD jnz 00446168
0044618B 8D9524FEFFFF lea edx, [ebp+$FFFFFE24]

* Reference to control TForm3.Edit2 : TEdit
|
00446191 8B83E8020000 mov eax, [ebx+$02E8]

|
00446197 E8B0E0FDFF call 0042424C <- 读取注册码
0044619C 8B8524FEFFFF mov eax, [ebp+$FFFFFE24]

|
004461A2 E88D1DFCFF call 00407F34 <- string to int

004461A7 8B55FC mov edx, [ebp-$04] <- 累加和到edx
004461AA 81F240E20100 xor edx, $0001E240 <- 异或
004461B0 3BC2 cmp eax, edx <- 比较
004461B2 7507 jnz 004461BB <- 不正确到下面仍有机会
004461B4 C6055098440001 mov byte ptr [$449850], $01
004461BB 8D9520FEFFFF lea edx, [ebp+$FFFFFE20]

* Reference to control TForm3.Edit2 : TEdit
|
004461C1 8B83E8020000 mov eax, [ebx+$02E8]

|
004461C7 E880E0FDFF call 0042424C
004461CC 8B8520FEFFFF mov eax, [ebp+$FFFFFE20]

* Possible String Reference to: '5764804' <- 作者留的万能注册码。
|
004461D2 BAE0624400 mov edx, $004462E0

|
004461D7 E8B8DAFBFF call 00403C94
004461DC 7507 jnz 004461E5
004461DE C6055098440001 mov byte ptr [$449850], $01
004461E5 803D5098440000 cmp byte ptr [$449850], $00
004461EC 751A jnz 00446208
004461EE 33D2 xor edx, edx

需要在以后的版本中加强。

整理一下：
Name:Fpc[CCG]
Code:123102


系统机械师SysMechanic 3.6d

 标 题:系统机械师SysMechanic 3.6d的破解 (13千字)
发信人:大波罗
时 间:2001-8-27 19:50:47
详细信息:
系统机械师SysMechanic 3.6d的破解
该软件是一款不错的系统工具，功能齐全，安装包只有1M多，可谓麻雀虽小却五脏具全。华军软件圆有下载。开始动手：
1． 启动SICE，运行软件，用户名：wdfdiablo 注册码：11111-11111-1111111111，CTRL+D，停电？看来SICE的名气太大了，不得不防它，换TRW2000上吧。
2． 下bpx hmemcpy,点注册，拦断后bd *后按F12键16下，来到此处：
:0049730F FF75F4 push [ebp-0C]
:00497312 681C754900 push 0049751C
:00497317 8D55F0 lea edx, dword ptr [ebp-10]
:0049731A 8B8300020000 mov eax, dword ptr [ebx+00000200]
:00497320 E80348FCFF call 0045BB28
:00497325 FF75F0 push [ebp-10]
:00497328 681C754900 push 0049751C
:0049732D 8D55EC lea edx, dword ptr [ebp-14]
:00497330 8B8304020000 mov eax, dword ptr [ebx+00000204]
:00497336 E8ED47FCFF call 0045BB28
:0049733B FF75EC push [ebp-14]
:0049733E 8D45F8 lea eax, dword ptr [ebp-08]

* Possible Reference to String Resource ID=00005: "謭"
|
:00497341 BA05000000 mov edx, 00000005
:00497346 E809CCF6FF call 00403F54
:0049734B 8B45F8 mov eax, dword ptr [ebp-08]
:0049734E 8D55FC lea edx, dword ptr [ebp-04]
:00497351 E86E0BF7FF call 00407EC4
:00497356 8D55E8 lea edx, dword ptr [ebp-18]
:00497359 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:0049735F E834C1F8FF call 00423498
:00497364 8B45E8 mov eax, dword ptr [ebp-18]
:00497367 8B55FC mov edx, dword ptr [ebp-04]
:0049736A E80971FFFF call 0048E478 ----------------此为算注册码的CALL，F8进入
:0049736F 84C0 test al, al
:00497371 740F je 00497382
:00497373 E8B06CFFFF call 0048E028
:00497378 E85BA7FFFF call 00491AD8
:0049737D E95F010000 jmp 004974E1
进入0049736A的CALL后：
* Referenced by a CALL at Addresses:
|:0048F225 , :0049736A
|
:0048E478 55 push ebp
:0048E479 8BEC mov ebp, esp
:0048E47B 33C9 xor ecx, ecx
:0048E47D 51 push ecx
:0048E47E 51 push ecx
:0048E47F 51 push ecx
:0048E480 51 push ecx
:0048E481 51 push ecx
:0048E482 53 push ebx
:0048E483 8955F8 mov dword ptr [ebp-08], edx
:0048E486 8945FC mov dword ptr [ebp-04], eax
:0048E489 8B45FC mov eax, dword ptr [ebp-04]
:0048E48C E8B75BF7FF call 00404048
:0048E491 8B45F8 mov eax, dword ptr [ebp-08]
:0048E494 E8AF5BF7FF call 00404048
:0048E499 33C0 xor eax, eax
:0048E49B 55 push ebp
:0048E49C 683DE64800 push 0048E63D
:0048E4A1 64FF30 push dword ptr fs:[eax]
:0048E4A4 648920 mov dword ptr fs:[eax], esp
:0048E4A7 8D55EC lea edx, dword ptr [ebp-14]
:0048E4AA 8B45FC mov eax, dword ptr [ebp-04]
:0048E4AD E8129AF7FF call 00407EC4
:0048E4B2 8B55EC mov edx, dword ptr [ebp-14]
:0048E4B5 8D45FC lea eax, dword ptr [ebp-04]
:0048E4B8 E8F357F7FF call 00403CB0
:0048E4BD 8D55EC lea edx, dword ptr [ebp-14]
:0048E4C0 8B45F8 mov eax, dword ptr [ebp-08]
:0048E4C3 E8FC99F7FF call 00407EC4
:0048E4C8 8B55EC mov edx, dword ptr [ebp-14]
:0048E4CB 8D45F8 lea eax, dword ptr [ebp-08]
:0048E4CE E8DD57F7FF call 00403CB0
:0048E4D3 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"?A"
|
:0048E4D5 A1B8EE4000 mov eax, dword ptr [0040EEB8]
:0048E4DA E8494BF7FF call 00403028
:0048E4DF 8BD8 mov ebx, eax

* Possible StringData Ref from Code Obj ->"BXCELL@USA.NET"
|
:0048E4E1 BA54E64800 mov edx, 0048E654
:0048E4E6 8BC3 mov eax, ebx
:0048E4E8 8B08 mov ecx, dword ptr [eax]
:0048E4EA FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"RAYBIEZ"
|
:0048E4ED BA6CE64800 mov edx, 0048E66C
:0048E4F2 8BC3 mov eax, ebx
:0048E4F4 8B08 mov ecx, dword ptr [eax]
:0048E4F6 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"REANIMATOR"
|
:0048E4F9 BA7CE64800 mov edx, 0048E67C
:0048E4FE 8BC3 mov eax, ebx
:0048E500 8B08 mov ecx, dword ptr [eax]
:0048E502 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"CHIESARA2000"
|
:0048E505 BA90E64800 mov edx, 0048E690
:0048E50A 8BC3 mov eax, ebx
:0048E50C 8B08 mov ecx, dword ptr [eax]
:0048E50E FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"DITRICHNEUMAN@"
|
:0048E511 BAA8E64800 mov edx, 0048E6A8
:0048E516 8BC3 mov eax, ebx
:0048E518 8B08 mov ecx, dword ptr [eax]
:0048E51A FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"NAKLIMANUS"
|
:0048E51D BAC0E64800 mov edx, 0048E6C0
:0048E522 8BC3 mov eax, ebx
:0048E524 8B08 mov ecx, dword ptr [eax]
:0048E526 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"ALHASAN1999"
|
:0048E529 BAD4E64800 mov edx, 0048E6D4
:0048E52E 8BC3 mov eax, ebx
:0048E530 8B08 mov ecx, dword ptr [eax]
:0048E532 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"LILJOELUNA"
|
:0048E535 BAE8E64800 mov edx, 0048E6E8
:0048E53A 8BC3 mov eax, ebx
:0048E53C 8B08 mov ecx, dword ptr [eax]
:0048E53E FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"COKEBOTTLE"
|
:0048E541 BAFCE64800 mov edx, 0048E6FC
:0048E546 8BC3 mov eax, ebx
:0048E548 8B08 mov ecx, dword ptr [eax]
:0048E54A FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"[EVC]"
|
:0048E54D BA10E74800 mov edx, 0048E710
:0048E552 8BC3 mov eax, ebx
:0048E554 8B08 mov ecx, dword ptr [eax]
:0048E556 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"[TMG]"
|
:0048E559 BA20E74800 mov edx, 0048E720
:0048E55E 8BC3 mov eax, ebx
:0048E560 8B08 mov ecx, dword ptr [eax]
:0048E562 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"[DSI]"
|
:0048E565 BA30E74800 mov edx, 0048E730
:0048E56A 8BC3 mov eax, ebx
:0048E56C 8B08 mov ecx, dword ptr [eax]
:0048E56E FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"[TEX]"
|
:0048E571 BA40E74800 mov edx, 0048E740
:0048E576 8BC3 mov eax, ebx
:0048E578 8B08 mov ecx, dword ptr [eax]
:0048E57A FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"C909"
|
:0048E57D BA50E74800 mov edx, 0048E750
:0048E582 8BC3 mov eax, ebx
:0048E584 8B08 mov ecx, dword ptr [eax]
:0048E586 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"ORBITALKID"
|
:0048E589 BA60E74800 mov edx, 0048E760
:0048E58E 8BC3 mov eax, ebx
:0048E590 8B08 mov ecx, dword ptr [eax]
:0048E592 FF5134 call [ecx+34]

* Possible StringData Ref from Code Obj ->"MEBFATSTEMP"
|
:0048E595 BA74E74800 mov edx, 0048E774
:0048E59A 8BC3 mov eax, ebx
:0048E59C 8B08 mov ecx, dword ptr [eax]
:0048E59E FF5134 call [ecx+34]
:0048E5A1 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->";C0KE2000;LIDONG;ZOBEL/PC99!;MARGE@EUDORAMAIL."
->"COM;ZHANGFAN;DAVY-BLIZZARD99;KING;(TEPEX);YAME"
->"EN@PIMAIL.COM.PK;SYS;PINKY AND "
->"THE BRAIN;POTSMOKE;BOBA FETT;WILLIAM;CZY;NAMEL"
->"ESS ONE;HOHO99_DZ@YAHOO.FR;ABRAHAM "
->"LINCOLN;LARRYGO98@YAHOO.COM;WINDOWSIGNS@NOCHAR"
->"GE.ZZN.COM;NELSON01@HOTMAIL.COM;NERDHACKER;NIT"
->"GRILL@YAHOO.COM;WQER@HOTMAIL.COM;ICARUS;SYSTEM"
->";ANAHARAMY@AOL.COM-3;MP001-231411184785-1;BE_S"
->A@U --------------------此处估计是设计者的邮箱
|
:0048E5A4 BA88E74800 mov edx, 0048E788
:0048E5A9 E80257F7FF call 00403CB0
:0048E5AE 8D45F0 lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->";81708-ND059-4019484694;"
|
:0048E5B1 BA50F04800 mov edx, 0048F050
:0048E5B6 E8F556F7FF call 00403CB0
:0048E5BB 8B55FC mov edx, dword ptr [ebp-04]
:0048E5BE 8BC3 mov eax, ebx
:0048E5C0 8B08 mov ecx, dword ptr [eax]
:0048E5C2 FF5150 call [ecx+50]
:0048E5C5 40 inc eax
:0048E5C6 7556 jne 0048E61E
:0048E5C8 6874F04800 push 0048F074
:0048E5CD FF75FC push [ebp-04]
:0048E5D0 6874F04800 push 0048F074
:0048E5D5 8D45EC lea eax, dword ptr [ebp-14]

* Possible Reference to String Resource ID=00003: "M?>"
|
:0048E5D8 BA03000000 mov edx, 00000003
:0048E5DD E87259F7FF call 00403F54
:0048E5E2 8B45EC mov eax, dword ptr [ebp-14]
:0048E5E5 8B55F4 mov edx, dword ptr [ebp-0C]
:0048E5E8 E88F5BF7FF call 0040417C
:0048E5ED 85C0 test eax, eax
:0048E5EF 752D jne 0048E61E
:0048E5F1 6874F04800 push 0048F074
:0048E5F6 FF75F8 push [ebp-08]
:0048E5F9 6874F04800 push 0048F074
:0048E5FE 8D45EC lea eax, dword ptr [ebp-14]

* Possible Reference to String Resource ID=00003: "M?>"
|
:0048E601 BA03000000 mov edx, 00000003
:0048E606 E84959F7FF call 00403F54
:0048E60B 8B45EC mov eax, dword ptr [ebp-14] ------------D EAX，可见假注册码
:0048E60E 8B55F0 mov edx, dword ptr [ebp-10] -------------D EDX，可见真注册码
:0048E611 E8665BF7FF call 0040417C
:0048E616 85C0 test eax, eax
:0048E618 7504 jne 0048E61E
:0048E61A 33C0 xor eax, eax -------------不等于就将EAX清0
:0048E61C EB02 jmp 0048E620

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048E5C6(C), :0048E5EF(C), :0048E618(C)
|
:0048E61E B001 mov al, 01 -------------已注册标志

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048E61C(U)
|
:0048E620 8BD8 mov ebx, eax
:0048E622 33C0 xor eax, eax
:0048E624 5A pop edx
:0048E625 59 pop ecx
:0048E626 59 pop ecx
:0048E627 648910 mov dword ptr fs:[eax], edx
:0048E62A 6844E64800 push 0048E644

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048E642(U)
|
:0048E62F 8D45EC lea eax, dword ptr [ebp-14]

* Possible Reference to String Resource ID=00005: "謭"
|
:0048E632 BA05000000 mov edx, 00000005
:0048E637 E80056F7FF call 00403C3C
:0048E63C C3 ret
整理一下：用户名：wdfdiablo 注册码：81708-ND059-4019484694，（可以用crackcode2000来做注册机）因功力不够写不出注册机，那位大哥帮忙写一下吧？


侠客系统修改器 V1.21

 标 题:侠客系统修改器 V1.21 注册机 (2千字)
发信人:AirHolder
时 间:2001-9-1 16:37:01
详细信息:
 近日小弟朋友装机，弄了个侠客系统修改器来装上，功能强大，未注册版也没什么使用限制，就是老会蹦出个对话框提醒注册，下面是其注册码生成过程：

#include "stdio.h"
#include "conio.h"
main()
{ int i,j,n,flag;
unsigned char ansq[16];
unsigned char ansr[16];
unsigned char name[16];
char table[]="0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
textcolor(GREEN);
cprintf("*****************************************************************");
printf("\n");
cprintf("    SysSet V1.21 KeyMaker By AirHolder,Written At
  2001-8-20    ");
printf("\n");
cprintf("*****************************************************************");
printf("\n\nEnter Your Name Here(At Least 3 Chars But Don't Exceed 16!):");
gets(name);
n=strlen(name);
printf("Your Reg Code Is:");
if (n%2==0)
for(i=0;i<n;i=i+2)
{ ansr[i]=name[i]%0x24;
ansq[i]=name[i]/0x24;
ansr[i+1]=name[i+1]%0x24;
ansq[i+1]=name[i+1]/0x24;
if (ansr[i]>0x9) ansr[i]=ansr[i]+0x57;
else ansr[i]=ansr[i]+0x30;
if (ansq[i]>0x9) ansq[i]=ansq[i]+0x57;
else ansq[i]=ansq[i]+0x30;
if (ansr[i+1]>0x9) ansr[i+1]=ansr[i+1]+0x57;
else ansr[i+1]=ansr[i+1]+0x30;
if (ansq[i+1]>0x9) ansq[i+1]=ansq[i+1]+0x57;
else ansq[i+1]=ansq[i+1]+0x30;
for(j=0;j<72;j++)
{  if (ansq[i]==table[j])
{  flag=j;  break;  }}
ansq[i]=table[0x24-flag+0x23];
printf("%c%c%c%c",ansr[i],ansq[i+1],ansq[i],ansr[i+1]);
  }
else {
for(i=0;i<n-1;i=i+2)
{ ansr[i]=name[i]%0x24;
ansq[i]=name[i]/0x24;
ansr[i+1]=name[i+1]%0x24;
ansq[i+1]=name[i+1]/0x24;
if (ansr[i]>0x9) ansr[i]=ansr[i]+0x57;
else ansr[i]=ansr[i]+0x30;
if (ansq[i]>0x9) ansq[i]=ansq[i]+0x57;
else ansq[i]=ansq[i]+0x30;
if (ansr[i+1]>0x9) ansr[i+1]=ansr[i+1]+0x57;
else ansr[i+1]=ansr[i+1]+0x30;
if (ansq[i+1]>0x9) ansq[i+1]=ansq[i+1]+0x57;
else ansq[i+1]=ansq[i+1]+0x30;
for(j=0;j<72;j++)
{  if (ansq[i]==table[j])
{  flag=j;  break;  }}
ansq[i]=table[0x24-flag+0x23];
printf("%c%c%c%c",ansr[i],ansq[i+1],ansq[i],ansr[i+1]);
  }
ansr[n-1]=name[n-1]%0x24;
ansq[n-1]=name[n-1]/0x24;
if (ansr[n-1]>0x9) ansr[n-1]=ansr[n-1]+0x57;
else ansr[n-1]=ansr[n-1]+0x30;
if (ansq[n-1]>0x9) ansq[n-1]=ansq[n-1]+0x57;
else ansq[n-1]=ansq[n-1]+0x30;
printf("%c%c",ansr[n-1],ansq[n-1]);  }

printf("\nPress Any Key To Exit!\n");
printf("\n\t\t\t  Cracked By ");
textcolor(YELLOW);
cprintf("AirHolder");
printf("\n\t\tAny Problem Please Email Me:");
textcolor(BROWN);
cprintf("airholder@263.net");
printf("\n\t\t\tWish You A Good Luck!!! ^_^\n");
getch();
}

AirHolder
2001.9.1.


象棋大战

 标 题:追flax没有进展,破超级个简单的象棋大战增强一下信心... (6千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-20 6:58:50
详细信息:
下载:www.newhua.com 7月17日更新中.

追flax无功而返,疲劳无聊郁闷受挫,华军软件DOWN一个象棋大战游戏,想大战他几盘,不料居然出现
注册窗口,我CG子弟可是人人可侮之辈?拿出合金装备(trw,w32dasm),出征!

结果是:

:0040720E FFD6 call esi ;//getdlgitemtexta,username and serail
:00407210 8D7C2440 lea edi, dword ptr [esp+40]
:00407214 83C9FF or ecx, FFFFFFFF
:00407217 33C0 xor eax, eax
:00407219 F2 repnz
:0040721A AE scasb
:0040721B F7D1 not ecx ;//计算user长度
:0040721D 49 dec ecx
:0040721E 0F84E5010000 je 00407409
:00407224 8D7C2420 lea edi, dword ptr [esp+20]
:00407228 83C9FF or ecx, FFFFFFFF
:0040722B F2 repnz
:0040722C AE scasb
:0040722D F7D1 not ecx
:0040722F 49 dec ecx
:00407230 0F84D3010000 je 00407409
:00407236 8D7C2420 lea edi, dword ptr [esp+20]
:0040723A 83C9FF or ecx, FFFFFFFF
:0040723D F2 repnz
:0040723E AE scasb
:0040723F F7D1 not ecx
:00407241 49 dec ecx ;//计算serial长度,必须等于9
:00407242 83F909 cmp ecx, 00000009
:00407245 0F85A9010000 jne 004073F4
:0040724B 8A442420 mov al, byte ptr [esp+20]
:0040724F 3C4D cmp al, 4D ;//第一位为?4D,41,4F ->"MAO"之一
:00407251 740C je 0040725F
:00407253 3C41 cmp al, 41
:00407255 7408 je 0040725F
:00407257 3C4F cmp al, 4F
:00407259 0F8595010000 jne 004073F4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407251(C), :00407255(C)
|
:0040725F 8A442421 mov al, byte ptr [esp+21]

:00407263 3C57 cmp al, 57 ;//第二位为?57,45,4e,47 ->"WENG"之一
:00407265 7410 je 00407277
:00407267 3C45 cmp al, 45
:00407269 740C je 00407277
:0040726B 3C4E cmp al, 4E
:0040726D 7408 je 00407277
:0040726F 3C47 cmp al, 47
:00407271 0F857D010000 jne 004073F4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407265(C), :00407269(C), :0040726D(C)
|
:00407277 0FBE442422 movsx eax, byte ptr [esp+22]
:0040727C 99 cdq
:0040727D B911000000 mov ecx, 00000011 ;//第三位 %0x11==0
:00407282 F7F9 idiv ecx
:00407284 85D2 test edx, edx
:00407286 0F8568010000 jne 004073F4
:0040728C 8A442423 mov al, byte ptr [esp+23]
:00407290 3C4A cmp al, 4A ;//第四位为?4A,49,41,4E->"JIAN"之一
:00407292 7410 je 004072A4
:00407294 3C49 cmp al, 49
:00407296 740C je 004072A4
:00407298 3C41 cmp al, 41
:0040729A 7408 je 004072A4
:0040729C 3C4E cmp al, 4E
:0040729E 0F8550010000 jne 004073F4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407292(C), :00407296(C), :0040729A(C)
|
:004072A4 8A442424 mov al, byte ptr [esp+24]
:004072A8 3C58 cmp al, 58
:004072AA 740C je 004072B8 ;//第五位为?58,49,55 ->"XIU"之一
:004072AC 3C49 cmp al, 49
:004072AE 7408 je 004072B8
:004072B0 3C55 cmp al, 55
:004072B2 0F853C010000 jne 004073F4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004072AA(C), :004072AE(C)
|
:004072B8 0FBE442425 movsx eax, byte ptr [esp+25]
:004072BD 99 cdq
:004072BE B903000000 mov ecx, 00000003 ;//第六位 %3==0
:004072C3 F7F9 idiv ecx
:004072C5 85D2 test edx, edx
:004072C7 0F8527010000 jne 004073F4
:004072CD 8A442426 mov al, byte ptr [esp+26]
:004072D1 3C51 cmp al, 51 ;//第七位为?51,49, ->"QI"之一
:004072D3 7408 je 004072DD
:004072D5 3C49 cmp al, 49
:004072D7 0F8517010000 jne 004073F4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004072D3(C)
|
:004072DD 8A442427 mov al, byte ptr [esp+27]
:004072E1 3C59 cmp al, 59
:004072E3 740C je 004072F1 ;//第八位59,55,4e "YUN"之一
:004072E5 3C55 cmp al, 55
:004072E7 7408 je 004072F1
:004072E9 3C4E cmp al, 4E
:004072EB 0F8503010000 jne 004073F4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004072E3(C), :004072E7(C)
|
:004072F1 0FBE442428 movsx eax, byte ptr [esp+28]
:004072F6 99 cdq
:004072F7 B90D000000 mov ecx, 0000000D ;//第9位 %0xd==0
:004072FC F7F9 idiv ecx
:004072FE 85D2 test edx, edx
:00407300 0F85EE000000 jne 004073F4
:00407306 8D4C2410 lea ecx, dword ptr [esp+10]
:0040730A E8F6960000 call 00410A05

* Possible StringData Ref from Data Obj ->"chess.mjq"

嘿嘿,连起来我们看到什么?"MAO WENG JIAN XIU QI YUN",回头再看看readme 毛建琦,翁秀云 是作者和他的女友的名字,好浪漫啊,不过注册程序简单了点,如果再来电加密,岂不更有意思?

一个可用的注册码:MW3JX0QY4,注册机,还值得写吗?

程序很糟糕,特别是在高级模式下会向90老头一样缓慢思考,喝杯茶回来还没想出来呢,比起将族III来,差远
了!不过到也可以看到电脑活活受罪正如自己在将族里一样很是开心...

虽然程序注册被破掉,想来作者和他的女友也可以幸福的微笑了.

如果我有GF,我拿什么献给她呢?

孤独的冷雨飘心[BCG]

2001.7.19


新纪元财务、进销存一体化软件

标 题:新纪元财务、进销存一体化软件 (4千字)
发信人:幻影2001
时 间:2001-4-21 18:01:38
详细信息:
新纪元财务、进销存一体化软件

下载地址：http://www.shareware.net.cn/dl.asp?id={AA5CFB89-2BCB-4474-9C43-3FE0CB156308}
使用工具：HIEW、W32DASM、language

操作步骤：
一、运行language打开xsj.exe显示格式为DELPHI语言
二、用W32DASM反汇编xsj.exe
相关如下：

:512538F2 0F850B010000 jne 51253A03 ==>00252cf2h
909090909090 ==>修改（注：不让此行跳到出错地址 ）

:512538F8 8B8680030000 mov eax, dword ptr [esi+00000380]
:512538FE 33D2 xor edx, edx
:51253900 E8EB2DDFFF call 510466F0
:51253905 BA02000080 mov edx, 80000002
:5125390A A1B4102651 mov eax, dword ptr [512610B4]
:5125390F E8BC9EE3FF call 5108D7D0
:51253914 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\SoftWare\Microsoft_98"
|
:51253916 BACC3A2551 mov edx, 51253ACC
:5125391B A1B4102651 mov eax, dword ptr [512610B4]
:51253920 E8EF9FE3FF call 5108D914
:51253925 8B45F4 mov eax, dword ptr [ebp-0C]
:51253928 E8C361DBFF call 51009AF0
:5125392D 8BC8 mov ecx, eax
:5125392F 81C100040000 add ecx, 00000400
:51253935 BAC03A2551 mov edx, 51253AC0
:5125393A A1B4102651 mov eax, dword ptr [512610B4]
:5125393F E8C4A5E3FF call 5108DF08
:51253944 A1B4102651 mov eax, dword ptr [512610B4]
:51253949 E8529EE3FF call 5108D7A0
:5125394E 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"注册完成!

序列号："
|
:51253950 68EC3A2551 push 51253AEC
:51253955 8D95A4FEFFFF lea edx, dword ptr [ebp+FFFFFEA4]
:5125395B A154EB2551 mov eax, dword ptr [5125EB54]
:51253960 8B00 mov eax, dword ptr [eax]
:51253962 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:51253968 E8B325DEFF call 51035F20
:5125396D 8B85A4FEFFFF mov eax, dword ptr [ebp+FFFFFEA4]
:51253973 8D95A8FEFFFF lea edx, dword ptr [ebp+FFFFFEA8]
:51253979 E84E5EDBFF call 510097CC
:5125397E FFB5A8FEFFFF push dword ptr [ebp+FFFFFEA8]

* Possible StringData Ref from Code Obj ->"

"
|
:51253984 680C3B2551 push 51253B0C

* Possible StringData Ref from Code Obj ->"注册码："
|
:51253989 681C3B2551 push 51253B1C
:5125398E 8D959CFEFFFF lea edx, dword ptr [ebp+FFFFFE9C]
:51253994 A154EB2551 mov eax, dword ptr [5125EB54]
:51253999 8B00 mov eax, dword ptr [eax]
:5125399B 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:512539A1 E87A25DEFF call 51035F20
:512539A6 8B859CFEFFFF mov eax, dword ptr [ebp+FFFFFE9C]
:512539AC 8D95A0FEFFFF lea edx, dword ptr [ebp+FFFFFEA0]
:512539B2 E8155EDBFF call 510097CC
:512539B7 FFB5A0FEFFFF push dword ptr [ebp+FFFFFEA0]

* Possible StringData Ref from Code Obj ->"

"
|
:512539BD 680C3B2551 push 51253B0C

* Possible StringData Ref from Code Obj ->"退出本软件重新进入后,您将成为正式用户!"
|
:512539C2 68303B2551 push 51253B30
:512539C7 8D85ACFEFFFF lea eax, dword ptr [ebp+FFFFFEAC]
:512539CD BA07000000 mov edx, 00000007
:512539D2 E85D06DBFF call 51004034
:512539D7 8B85ACFEFFFF mov eax, dword ptr [ebp+FFFFFEAC]
:512539DD E85607DBFF call 51004138
:512539E2 8BD0 mov edx, eax

* Possible StringData Ref from Code Obj ->"祝贺!"
|
:512539E4 B9583B2551 mov ecx, 51253B58
:512539E9 A138EE2551 mov eax, dword ptr [5125EE38]
:512539EE 8B00 mov eax, dword ptr [eax]
:512539F0 E84712E0FF call 51054C3C
:512539F5 A138EE2551 mov eax, dword ptr [5125EE38]
:512539FA 8B00 mov eax, dword ptr [eax]
:512539FC E89711E0FF call 51054B98
:51253A01 EB18 jmp 51253A1B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:512538F2(C)
|
:51253A03 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"警告!"
|
:51253A05 B9603B2551 mov ecx, 51253B60

* Possible StringData Ref from Code Obj ->"注册号不正确!"
|
:51253A0A BA683B2551 mov edx, 51253B68

三、用HIEW查找0f850b010000修改为909090909090
成功，输入任意号码注册完成。~~~~

标 题:新纪元出纳专用软件 (4千字)
发信人:幻影2001
时 间:2001-4-21 18:09:29
详细信息:

新纪元出纳专用软件

下载地址：http://www.shareware.net.cn/dl.asp?id={45B78F75-5253-470E-B67D-02D1924E2E6E}

使用工具：HIEW、language、W32DASM

具体步骤和上面那个差不多就不多说了

:004F3899 E85607F1FF call 00403FF4
:004F389E 0F850B010000 jne 004F39AF ==>修改为909090909090
:004F38A4 8B86B0030000 mov eax, dword ptr [esi+000003B0]
:004F38AA 33D2 xor edx, edx
:004F38AC E8DF12F5FF call 00444B90
:004F38B1 BA02000080 mov edx, 80000002
:004F38B6 A1A0924F00 mov eax, dword ptr [004F92A0]
:004F38BB E858BDF8FF call 0047F618
:004F38C0 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\SoftWare\Microsoft_98"
|
:004F38C2 BA783A4F00 mov edx, 004F3A78
:004F38C7 A1A0924F00 mov eax, dword ptr [004F92A0]
:004F38CC E8ABBDF8FF call 0047F67C
:004F38D1 8B45F4 mov eax, dword ptr [ebp-0C]
:004F38D4 E8635DF1FF call 0040963C
:004F38D9 8BC8 mov ecx, eax
:004F38DB 81C100040000 add ecx, 00000400
:004F38E1 BA6C3A4F00 mov edx, 004F3A6C
:004F38E6 A1A0924F00 mov eax, dword ptr [004F92A0]
:004F38EB E800BFF8FF call 0047F7F0
:004F38F0 A1A0924F00 mov eax, dword ptr [004F92A0]
:004F38F5 E8EEBCF8FF call 0047F5E8
:004F38FA 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"注册完成!

序列号："
|
:004F38FC 68983A4F00 push 004F3A98
:004F3901 8D95A4FEFFFF lea edx, dword ptr [ebp+FFFFFEA4]
:004F3907 A1DC784F00 mov eax, dword ptr [004F78DC]
:004F390C 8B00 mov eax, dword ptr [eax]
:004F390E 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:004F3914 E8970CF4FF call 004345B0
:004F3919 8B85A4FEFFFF mov eax, dword ptr [ebp+FFFFFEA4]
:004F391F 8D95A8FEFFFF lea edx, dword ptr [ebp+FFFFFEA8]
:004F3925 E8225AF1FF call 0040934C
:004F392A FFB5A8FEFFFF push dword ptr [ebp+FFFFFEA8]

* Possible StringData Ref from Code Obj ->"

"
|
:004F3930 68B83A4F00 push 004F3AB8

* Possible StringData Ref from Code Obj ->"注册码："
|
:004F3935 68C83A4F00 push 004F3AC8
:004F393A 8D959CFEFFFF lea edx, dword ptr [ebp+FFFFFE9C]
:004F3940 A1DC784F00 mov eax, dword ptr [004F78DC]
:004F3945 8B00 mov eax, dword ptr [eax]
:004F3947 8B80E0020000 mov eax, dword ptr [eax+000002E0]
:004F394D E85E0CF4FF call 004345B0
:004F3952 8B859CFEFFFF mov eax, dword ptr [ebp+FFFFFE9C]
:004F3958 8D95A0FEFFFF lea edx, dword ptr [ebp+FFFFFEA0]
:004F395E E8E959F1FF call 0040934C
:004F3963 FFB5A0FEFFFF push dword ptr [ebp+FFFFFEA0]

* Possible StringData Ref from Code Obj ->"

"
|
:004F3969 68B83A4F00 push 004F3AB8

* Possible StringData Ref from Code Obj ->"退出本软件重新进入后,您将成为正式用户!"
|
:004F396E 68DC3A4F00 push 004F3ADC
:004F3973 8D85ACFEFFFF lea eax, dword ptr [ebp+FFFFFEAC]
:004F3979 BA07000000 mov edx, 00000007
:004F397E E82106F1FF call 00403FA4
:004F3983 8B85ACFEFFFF mov eax, dword ptr [ebp+FFFFFEAC]
:004F3989 E81A07F1FF call 004040A8
:004F398E 8BD0 mov edx, eax

* Possible StringData Ref from Code Obj ->"祝贺!"
|
:004F3990 B9043B4F00 mov ecx, 004F3B04
:004F3995 A15C7B4F00 mov eax, dword ptr [004F7B5C]
:004F399A 8B00 mov eax, dword ptr [eax]
:004F399C E83BF7F5FF call 004530DC
:004F39A1 A15C7B4F00 mov eax, dword ptr [004F7B5C]
:004F39A6 8B00 mov eax, dword ptr [eax]
:004F39A8 E88BF6F5FF call 00453038
:004F39AD EB18 jmp 004F39C7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F389E(C)
|
:004F39AF 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"警告!"
|
:004F39B1 B90C3B4F00 mov ecx, 004F3B0C

* Possible StringData Ref from Code Obj ->"注册号不正确!"
|
:004F39B6 BA143B4F00 mov edx, 004F3B14
:004F39BB A15C7B4F00 mov eax, dword ptr [004F7B5C]
:004F39C0 8B00 mov eax, dword ptr [eax]
:004F39C2 E815F7F5FF call 004530DC

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004F356D(C), :004F39AD(U)
|
:004F39C7 33C0 xor eax, eax

标 题:再破新纪元系列软件——出纳专用软件（注册码破解） (1千字)
发信人:ratarice
时 间:2001-4-22 0:54:09
详细信息:

再破新纪元系列软件——出纳专用软件（注册码破解）
由于本人在这方面是个菜鸟！刚得幻影2001的帮助才得以破了这个软件！先献丑如下：
用TRW2000还是老办法：
一、先填注册码：87654321 （软件的用户名它已经填好了，不能动）
二、ctrl+N 下 bpx hmemcpy
三、ctrl+N 点“注册”
四、被拦。
bd *
pmodule
按8次F12后，弹出“注册失败”
五、重复1--4，只按7次F12，再按一次F10。看到如下代码：
015F:004F387F MOV EAX,[EBP+FFFFFEB0]
015F:004F3885 LEA EDX,[EBP+FFFFFEB4]
015F:004F388B CALL 0040934C
015F:004F3890 MOV EDX,[EBP+FFFFFEB4] <-------------F10,d edx 显示87654321
015F:004F3896 MOV EAX,[EBP-0C] <-------------F10,d eax 显示8454953（真注册码）
015F:004F3899 CALL 00403FF4 <-------------比较注册码的真假！
015F:004F389E JNZ NEAR 004F39AF ******跳转******
.
.
.
015F:004F39AF PUSH BYTE +00
015F:004F39B1 MOV ECX,004F3B0C
015F:004F39B6 MOV EDX,004F3B14
015F:004F39BB MOV EAX,[004F7B5C]
015F:004F39C0 MOV EAX,[EAX]
015F:004F39C2 CALL 004530DC ******出错******
是不是很简单！本人自识学艺肤浅，望众高手不要取笑！
我会再接再厉的！

标 题:贴这个的注册机~~`漏网只鱼呀~~~差点把它忘了~~~~~ (666字)
发信人:伪装者[CCG]
时 间:2001-4-22 23:09:39
详细信息:

 #include "stdio.h"
main()
{
char string[8];
int i,c;
printf(" ******NEWXSJ********\nThis keygen is made by Pretender\nPlease input
    your ID :  ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c==70||c==102) string[i]=0;
else if(c<70&&c>64) string[i]-=64;
else if(c<102&&c>96) string[i]-=96;
else string[i]-=48;
}
printf("Your Register code is:  85");
for(i=0;i<4;i++)
printf("%d",(string[i]+string[7-i])%10);
printf("%d",(string[0]+string[1]+string[2]+string[3]+string[4]+string[5]+string[6]+string[7])%10);
printf("\n ********************\n *Welcome to WWW.CRACKNOW.COM*\n ***************\n");}


虚幻立体制作1.0

 标 题:《虚幻立体制作1.0》破解注册方法手记 (326字)
发信人:孙锋
详细信息:
《虚幻立体制作1.0》破解注册方法手记

《虚幻立体制作1.0》
  启动trw2000
  1234567890
  Ctrl + N
  bpx hmecpy
  F5
  确定
  bd *
  F12 12次
  遇到call F8进入，F10到0167:0040c3ee movzx bx,[esi] ;d esi得到注册码08155。
·欢迎访问狐狸风的主页：http://djx.qfnu.edu.cn/djx/sffs/index.htm
---------------

标 题:CDBox Labeler Pro 1.1破解注册 (678字)
发信人:孙锋
时 间:2000-12-26 23:48:15
详细信息:

CDBox Labeler Pro 1.1破解注册

  破解日期：２０００年１１月２日２２:20,用时２分钟。
  启动trw2000
  输入ＮＡＭＥ　　　sunfeng
  ＣＯＤＥ　　　1234567890
  CTRL+N
  bpx hmemcpy
  F5
  ok
  bd *
  F12 共计１８次
  F10 到第一个call语句
  Ｆ８进入
  Ｆ１０到如下内存地址：
  0167:005313BB MOV EDX [EBP-14]
  0167:005313BE CALL 00403FE4 ; D EDX ---> GPS-421496-688648
  同样可以得到：
  sinling　－－－－GPS-425068-694484
  有一个有趣的结果，我在输入了我自己的中文名字“孙锋”以后，得到的注册码是：GPS-0-0,我不知道用别的中文名字会是什么注册结果，如果你有兴趣的话，自己去试试吧。

·欢迎访问枫的主页：http://djx.qfnu.edu.cn/djx/sffs/

标 题:winpatch 1.2破解注册方法手记　　　 (463字)
发信人:孙锋
时 间:2000-12-26 23:47:38
详细信息:

winpatch 1.2破解注册方法手记

winpatch 1.2
  启动trw2000
  name:sunfeng
  code:1234567890
  orgniazation:fengsun
  bpx hmemcpy
  f5
  ok
  F12 24次。第一个call进入，F10到
  内存地址：0167:00413212 push edx; d edx 即可。
  name:sunfeng
  code:L&D-0611713883190
  orgniazation:fengsun
  新领网孙锋
  L&D-06118
  新领网
  孙 锋
  L&D-061126
  新领网
·欢迎访问狐狸风的主页：http://djx.qfnu.edu.cn/djx/sffs/index.htm

标 题:winiamge 5.00.5.0000破解 (617字)
发信人:孙锋
时 间:2000-12-26 23:47:05
详细信息:

标 题：winiamge 5.00.5.0000破解

启动trw2000
  sunfeng
  1234567890
  Ctrl+N
  bpx hmemcpy
  F5
  bd *
  F12 10 次
  F10到第二个call F8进入
  移动光标
  分别在以下几个地方出现注册码；
  0167:0043481a pop ecx; ------->先d eax---> 76BFCC
  0167:00434846 pop ecx; ------->自动出现1478A914
  0167:0043486E pop ecx; ------->自动177CA920
  0167:00434896 pop ecx; ------->自动76BFCC
  0167:004348BE pop ecx; ------->自动477A961
  0167:004348EB pop ecx; ------->自动27CA963
  另外：
  孙锋
  4CA268
  14518883
  1752888F
  105188EC
  44D8C00
  2528C02
---------------

标 题:system aechanic3.0c破解注册手记 (789字)
发信人:孙锋
时 间:2000-12-26 23:46:32
详细信息:

标 题：system aechanic3.0c破解注册手记

启动trw2000
  Name: 孙锋
  SrialNumaber: 1234567890
  Ctrl+N
  bpx hmemcpy
  F5
  OK
  bd *
  F12 14次
  F10 到第一个call
  0167:004a8a7e call 004228d0 ; F8 进入
  F10 到如下位置
  0167:004a8af0 move eax,[ebx+01e8] ; d eax ===18521-ST659-4717865626
  0167:004a8B30 move eax,[ebx+01e8] ; d eax ===17921-PR065-0877471786
  0167:004a8B70 move eax,[ebx+01e8] ; d eax ===19022-ND154-9666360675
  有注册表操作。
  得到3组注册码
  Name : sunfeng
  SrialNumber: 1234567890
  在0167:004a8aed move eax,[ebx+01e8] ; d eax ===65655-ST550-1786561405
  70706-ND055-6636066455
  0167:004a8B30 move eax,[ebx+01e8] ; d eax ===59595-PR014-7747175344
·欢迎访问狐狸风的主页：http://djx.qfnu.edu.cn/djx/sffs/index.htm

标 题:winblinds1.2破解方法手记　　　 (421字)
发信人:孙锋
时 间:2000-12-26 23:45:58
详细信息:

标 题：winblinds1.2破解方法手记

启动trw2000
  填写用户名：sunfeng
  序列号： 1234567890
  ctrl+N
  s 30:0 l ffffffff '1234567890'
  得到地址为：8c4250
  bpm 30:8c4250
  f10数次到地址：0167:0040395D MOV BL [ESI]；D ESI----> WB-98cb078b
  另外： 孙锋----WB-111c5a275
  申靖----WB-61a5b97a
  亓小涛----WB-c4dab228
·欢迎访问狐狸风的主页：http://djx.qfnu.edu.cn/djx/sffs/
---------------


虚拟光驱2000 V5.1 网络版

 标 题:虚拟光驱2000 V5.1 网络版21天评估版序列号的计算部分(半年多以前做的) (16千字)
发信人:robot
时 间:2001-5-7 23:42:13
详细信息:
软件名称：Virtual Drive 2000 网络版
整理日期：2000.8.12
最新版本：5.1c
文件大小：4824KB
软件授权：共享软件
使用平台：Win95/98
发布公司：http://www.farstone.com/
下载地址：http://www.newhua.com.cn/down/virtdnet.zip
软件简介：一个非常不错WIN95/98下的CD-ROM模拟程序，可以把CD-ROM复制为硬盘的一个文件，这个版本连CD音轨、保护都可以模拟，最多模拟出二十部光驱。此版为多语言版，包括：中文版、英文版、和日文版，安装时会自动检测操作系统的语言版本并自动安装。
破解工具：W32Dasm，exescope 6.0
说明：这是我将近一年前破解的软件，当时由于工作需要，想找一个网络版的虚拟光驱，找是找到了，但为评估版，上网搜索也没有找到关于网络版的完整破解，于是只好自力更生。在破解过程中，我还发现了在番外地里介绍的修改setup.sys后试用版变正式版的过程，而且还发现，如果使用该网络版的是中国的用户，则需要软件狗，我全给他解了。这个软件的全部破解过程很长，有50多K，这里仅介绍注册码的计算过程。另外，网络版与单机版的序列号计算过程基本一样，其中，网络版的序列号为15位，而单机版为11位，就差在最后4位数字，最后的4位数字表示的是允许使用的用户数。
这个软件可以自动判别操作系统的类型，根据操作系统的类型自动选择用繁体、简体、日语、法语、德语及英语来显示安装界面，虽然这给用户的使用上简便了，但用pwdasm反汇编时，却出现了很多一些看不懂的字符串——因为缺省是显示繁体中文，虽然不影响程序流程，但这给破解造成了麻烦，为了更好地破解这个软件，我对该软件做一下处理，让w32dasm能够识别字符串，方法是用exescope对程序进行处理，将繁体中文和简体中文均改为英文字符显示，嘿嘿，本来用作汉化的常用工具，反其道而行之，可以称为反汉化，反汉化的相应字符串提示不用担心，软件公司已经给做好了，用exescope改好后，用w32dasm进行反汇编，竟取得了很好的效果，这回，w32dasm将字符全部显示出来了，当然是英文的，现在我们开始破解吧。
目标程序：SerSetup.exe，大小331776 Bytes
运行SerSetup.exe，安装程序要求输入公司名称和序列号等，下面为序列号的计算部分的流程

* Referenced by a CALL at Address:
|:00401F5C
|
:00402890 64A100000000 mov eax, dword ptr fs:[00000000]
:00402896 6AFF push FFFFFFFF
:00402898 68F8834100 push 004183F8
:0040289D 50 push eax
:0040289E 64892500000000 mov dword ptr fs:[00000000], esp
:004028A5 81EC00010000 sub esp, 00000100
:004028AB 53 push ebx
:004028AC 55 push ebp
:004028AD 56 push esi
:004028AE 57 push edi
:004028AF 8BD9 mov ebx, ecx
:004028B1 8BBC2420010000 mov edi, dword ptr [esp+00000120] ====> 指向注册码
:004028B8 83CDFF or ebp, FFFFFFFF
:004028BB 8BCD mov ecx, ebp
:004028BD 33C0 xor eax, eax
:004028BF F2 repnz
:004028C0 AE scasb ====> 检测注册码的字符串长度
:004028C1 F7D1 not ecx
:004028C3 2BF9 sub edi, ecx
:004028C5 8D542410 lea edx, dword ptr [esp+10]
:004028C9 8BC1 mov eax, ecx
:004028CB 8BF7 mov esi, edi
:004028CD 8BFA mov edi, edx
:004028CF C1E902 shr ecx, 02
:004028D2 F3 repz
:004028D3 A5 movsd ====> 将注册码中的字符串送入[esp+10]，为后面计算做准备
:004028D4 8BC8 mov ecx, eax
:004028D6 33C0 xor eax, eax
:004028D8 83E103 and ecx, 00000003
:004028DB F3 repz
:004028DC A4 movsb
:004028DD 8D7C2410 lea edi, dword ptr [esp+10]
:004028E1 8BCD mov ecx, ebp
:004028E3 F2 repnz
:004028E4 AE scasb ====> 再次检测新的字符串长度
:004028E5 F7D1 not ecx
:004028E7 49 dec ecx
:004028E8 83F90F cmp ecx, 0000000F ====> 字符串长度是否为15个
:004028EB 7515 jne 00402902 ====> 不是，则序列号错误
:004028ED 8D4C2410 lea ecx, dword ptr [esp+10]
:004028F1 8844241B mov byte ptr [esp+1B], al ====> [esp+1B]处置0，对注册码进行截取到11位，为后面的计算做准备
:004028F5 51 push ecx
:004028F6 E8B5EFFFFF call 004018B0 ====> 关键的CALL
:004028FB 83C404 add esp, 00000004
:004028FE 85C0 test eax, eax ====> EAX作为旗标
:00402900 751A jne 0040291C ====> 如果EAX=0则序列号错误

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004028EB(C), :0040294D(C), :00402953(C)
|
:00402902 8D8C2420010000 lea ecx, dword ptr [esp+00000120]
:00402909 89AC2418010000 mov dword ptr [esp+00000118], ebp
:00402910 E81EDB0000 call 00410433
:00402915 33C0 xor eax, eax ====> 失败旗标
:00402917 E9B1000000 jmp 004029CD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402900(C)
|
:0040291C 8BBC2420010000 mov edi, dword ptr [esp+00000120] ====> 指向原始的字符串
:00402923 8BCD mov ecx, ebp
:00402925 33C0 xor eax, eax
:00402927 8D542410 lea edx, dword ptr [esp+10] ====> 指向刚才合成的字符串
:0040292B F2 repnz
:0040292C AE scasb
:0040292D F7D1 not ecx
:0040292F 2BF9 sub edi, ecx
:00402931 8BC1 mov eax, ecx
:00402933 8BF7 mov esi, edi
:00402935 8BFA mov edi, edx
:00402937 B230 mov dl, 30
:00402939 C1E902 shr ecx, 02
:0040293C F3 repz
:0040293D A5 movsd ====> 向[ESP+10]处复制"0"
:0040293E 8BC8 mov ecx, eax
:00402940 83E103 and ecx, 00000003
:00402943 F3 repz
:00402944 A4 movsb
:00402945 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040295F(C)
|
:00402947 8A440C1B mov al, byte ptr [esp+ecx+1B] ====> 将最后的4个数字分别置入al中
:0040294B 3C39 cmp al, 39 ====> 是否大于"9"
:0040294D 7FB3 jg 00402902 ====> 大于则完蛋
:0040294F 38540C10 cmp byte ptr [esp+ecx+10], dl ====> 注册码的第1加ecx位字符是否小于"0"
:00402953 7CAD jl 00402902 ====> 小于则完蛋
:00402955 2AC2 sub al, dl ====> 将最后的4个数字的ascii取"0"改为相应的机器码
:00402957 88440C1B mov byte ptr [esp+ecx+1B], al ====> 结果送回[esp+ecx+1B]中
:0040295B 41 inc ecx ====> +1
:0040295C 83F904 cmp ecx, 00000004 ====> 是否转换了4个
:0040295F 7CE6 jl 00402947 ====> 不是则继续
:00402961 0FBE4C241B movsx ecx, byte ptr [esp+1B] \
:00402966 0FBE44241E movsx eax, byte ptr [esp+1E] \ ====> 将刚才的结果分别送入这四个中
:0040296B 0FBE7C241C movsx edi, byte ptr [esp+1C] /
:00402970 0FBE74241D movsx esi, byte ptr [esp+1D] /
:00402975 03C1 add eax, ecx ====> 累加起来
:00402977 BD0A000000 mov ebp, 0000000A
:0040297C 03C7 add eax, edi
:0040297E 03C6 add eax, esi
:00402980 99 cdq ====> mod 0Ah
:00402981 F7FD idiv ebp
:00402983 85D2 test edx, edx ====> 余数是否为0
:00402985 741B je 004029A2 ====> 是，则走，否则等死吧
:00402987 8D8C2420010000 lea ecx, dword ptr [esp+00000120]
:0040298E C7842418010000FFFFFFFF mov dword ptr [esp+00000118], FFFFFFFF
:00402999 E895DA0000 call 00410433
:0040299E 33C0 xor eax, eax ====> 置失败标志
:004029A0 EB2B jmp 004029CD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402985(C)
|
:004029A2 8D0C89 lea ecx, dword ptr [ecx+4*ecx] ====> 第12位数字乘以5
:004029A5 C7842418010000FFFFFFFF mov dword ptr [esp+00000118], FFFFFFFF ====> 这也应该是与setup.sys某个特殊标志
:004029B0 8D044F lea eax, dword ptr [edi+2*ecx] ====> 再乘以2加上第13位数字
:004029B3 8D8C2420010000 lea ecx, dword ptr [esp+00000120]
:004029BA 8D1480 lea edx, dword ptr [eax+4*eax] ====> 再乘以5
:004029BD 8D0456 lea eax, dword ptr [esi+2*edx] ====> 再乘以2加上第14位数字
:004029C0 894360 mov dword ptr [ebx+60], eax ====> 结果放到[ebx+60]中，应该也是在setup.sys中，经试验发现，最后4位数字表示授权使用的人数
:004029C3 E86BDA0000 call 00410433
:004029C8 B801000000 mov eax, 00000001 ====> 置成功标志

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402917(U), :004029A0(U)
|
:004029CD 8B8C2410010000 mov ecx, dword ptr [esp+00000110]
:004029D4 5F pop edi
:004029D5 5E pop esi
:004029D6 5D pop ebp
:004029D7 5B pop ebx
:004029D8 64890D00000000 mov dword ptr fs:[00000000], ecx
:004029DF 81C40C010000 add esp, 0000010C
:004029E5 C20400 ret 0004

* Referenced by a CALL at Address:
|:004028F6
|
:004018B0 81EC00010000 sub esp, 00000100
:004018B6 83C9FF or ecx, FFFFFFFF
:004018B9 33C0 xor eax, eax
:004018BB 53 push ebx
:004018BC 8B9C2408010000 mov ebx, dword ptr [esp+00000108]
:004018C3 55 push ebp
:004018C4 56 push esi
:004018C5 57 push edi
:004018C6 8BFB mov edi, ebx ====> [esp+00000108]指向输入的注册码
:004018C8 F2 repnz ====> 检测注册码的字符串长度
:004018C9 AE scasb
:004018CA F7D1 not ecx
:004018CC 49 dec ecx
:004018CD 8BFB mov edi, ebx
:004018CF 8BD1 mov edx, ecx ====> edx为字符串长度
:004018D1 83C9FF or ecx, FFFFFFFF
:004018D4 F2 repnz
:004018D5 AE scasb
:004018D6 F7D1 not ecx
:004018D8 2BF9 sub edi, ecx
:004018DA 8D6C2410 lea ebp, dword ptr [esp+10]
:004018DE 8BC1 mov eax, ecx
:004018E0 8BF7 mov esi, edi
:004018E2 8BFD mov edi, ebp
:004018E4 C1E902 shr ecx, 02
:004018E7 F3 repz
:004018E8 A5 movsd
:004018E9 8BC8 mov ecx, eax
:004018EB 83E103 and ecx, 00000003
:004018EE 83FA0B cmp edx, 0000000B ====> 比较字符串长度是否为11
:004018F1 F3 repz
:004018F2 A4 movsb
:004018F3 0F85A5000000 jne 0040199E ====> 不相等，那么就等死吧
:004018F9 B803000000 mov eax, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401922(C)
|
:004018FE 8A0C18 mov cl, byte ptr [eax+ebx] \
:00401901 80F939 cmp cl, 39 \
:00401904 0F8794000000 ja 0040199E |
:0040190A 80F930 cmp cl, 30 |
:0040190D 0F828B000000 jb 0040199E |
:00401913 8A4C0410 mov cl, byte ptr [esp+eax+10] | ====> 是否为数字，如果是，则转换为机器码数字，否则完蛋
:00401917 80C1D0 add cl, D0 |
:0040191A 884C0410 mov byte ptr [esp+eax+10], cl |
:0040191E 40 inc eax |
:0040191F 83F80B cmp eax, 0000000B /
:00401922 7CDA jl 004018FE /
:00401924 8B4C2418 mov ecx, dword ptr [esp+18] ====> 第9位数字置入ecx
:00401928 81E1FF000000 and ecx, 000000FF
:0040192E 41 inc ecx ====> +1
:0040192F 8BC1 mov eax, ecx
:00401931 C1E005 shl eax, 05 ====> 乘以32
:00401934 2BC1 sub eax, ecx ====> 减去原数，相当于乘以31
:00401936 8B4C241A mov ecx, dword ptr [esp+1A] ====> 第11位数字置入ecx
:0040193A 81E1FF000000 and ecx, 000000FF
:00401940 8BD1 mov edx, ecx
:00401942 C1E204 shl edx, 04 ====> 乘以16
:00401945 03D1 add edx, ecx ====> 加上原数，相当于乘以17
:00401947 8B4C2419 mov ecx, dword ptr [esp+19] ====> 第10位数字置入ecx
:0040194B 81E1FF000000 and ecx, 000000FF
:00401951 03C2 add eax, edx ====> 加入到eax中
:00401953 8D1449 lea edx, dword ptr [ecx+2*ecx]
:00401956 C1E203 shl edx, 03
:00401959 2BD1 sub edx, ecx ====> 乘以7
:0040195B B963000000 mov ecx, 00000063
:00401960 03C2 add eax, edx ====> 加入到eax中，这样我们可以算出，eax的值=([esp+18]+1)*31+[esp+1A]*17+[esp+19]*7
:00401962 99 cdq
:00401963 F7F9 idiv ecx ====> mod 63h，十进制为99
:00401965 8B442413 mov eax, dword ptr [esp+13] ====> 将第4位数字置入eax中
:00401969 8B4C2414 mov ecx, dword ptr [esp+14] ====> 将第5位数字置入ecx中
:0040196D 25FF000000 and eax, 000000FF
:00401972 81E1FF000000 and ecx, 000000FF
:00401978 8D0480 lea eax, dword ptr [eax+4*eax] ====> 第4位数字乘以5
:0040197B 8D0441 lea eax, dword ptr [ecx+2*eax] ====> 得到的结果乘以2再加上第5位数字的值
:0040197E 3BC2 cmp eax, edx ====> 余数是否等于eax的值
:00401980 751C jne 0040199E ====> 不等，注册码错误
:00401982 8A442412 mov al, byte ptr [esp+12]
:00401986 3C58 cmp al, 58 ====> 序列号中的第3个字母是否为X
:00401988 7404 je 0040198E
:0040198A 3C78 cmp al, 78 ====> 或者x
:0040198C 7510 jne 0040199E ====> 二者都不等，去死吧

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401988(C)
|
:0040198E 5F pop edi
:0040198F 5E pop esi
:00401990 5D pop ebp
:00401991 B802000000 mov eax, 00000002
:00401996 5B pop ebx
:00401997 81C400010000 add esp, 00000100
:0040199D C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004018F3(C), :00401904(C), :0040190D(C), :00401980(C), :0040198C(C)
|
:0040199E 5F pop edi
:0040199F 5E pop esi
:004019A0 5D pop ebp
:004019A1 33C0 xor eax, eax
:004019A3 5B pop ebx
:004019A4 81C400010000 add esp, 00000100
:004019AA C3 ret

从上面的程序中，我们可以知道网络版注册码的情况：
1. 注册码必须为15位(单机版前11位)，第3个字符必须为x或X，从第4位开始，必须全是数字
2. 第1、2个字符必须大于等于"0"(即ascii中的30)
3. ((第9位数字+1)*31+第10位*7+第11位*17) mod 63h=第4位乘以10+第5位数字
4. 最后4位数字相加应等于10或者0，其中，前3个数字表示授权使用的人数
根据上面的结果我们可以给出一个注册码：FSX310000009993(网上常见的) 或 FSX000000045555，其他的自己去造吧


雅信2.5

标 题:尽力抢救win98，苦心分析我的破解入门5闻世了！ (7千字)
发信人:peterchen
时 间:2001-2-26 17:56:53
详细信息:
http://brucez.coolbi.com/soft/YaxinCat25.rar
大客们我上载的雅典最新缩小版！只有1.25mb，功能当然不全了！
不过可以注册！我小弟试破解怀疑bpx 004c724e，下面有一个call
可能是关键！原来我离功能只差这么一步！都是win98不好！
破解入门5
gave bye 雅信2.5!
作者:PeterChen
一定要解决问题才对,不是为了要注册码!
这是本人破解过程出分析的最详细了!
破解步骤有两种:
第一种原始方法:
1. bpx hmemcpy
2. F12 14次
3. F10 26次
第二种:
1.bpx hmemcpy
2. pmodule
3. F10 40几次有多!
想不到原始的方法比新方法还要快!
还有一种方法等一会儿再说!
好不好容易才来到这里?
.........................................................................
:004C71E4 8D4DEC lea ecx, dword ptr [ebp-14] //->d eax=ID
:004C71E7 A1C4E84F00 mov eax, dword ptr [004FE8C4]
:004C71EC 8B00 mov eax, dword ptr [eax]
:004C71EE 8BD3 mov edx, ebx
:004C71F0 E88BFEFFFF call 004C7080
:004C71F5 8B45EC mov eax, dword ptr [ebp-14]
:004C71F8 50 push eax //->才是真出现注册码的地方!
:004C71F9 8D55E4 lea edx, dword ptr [ebp-1C]
:004C71FC 8B86D8020000 mov eax, dword ptr [esi+000002D8]
:004C7202 E89DB5F6FF call 004327A4
:004C7207 8B45E4 mov eax, dword ptr [ebp-1C]
:004C720A 8D55E8 lea edx, dword ptr [ebp-18]//->d eax=假注册码
:004C720D E81627F4FF call 00409928
:004C7212 8B55E8 mov edx, dword ptr [ebp-18]
:004C7215 58 pop eax
:004C7216 E8A9CEF3FF call 004040C4
:004C721B 7517 jne 004C7234
:004C721D 8D55E0 lea edx, dword ptr [ebp-20]
:004C7220 8BC3 mov eax, ebx
:004C7222 E8E929F4FF call 00409C10
:004C7227 8B45E0 mov eax, dword ptr [ebp-20]
:004C722A 8D55F8 lea edx, dword ptr [ebp-08]
:004C722D E8F626F4FF call 00409928
:004C7232 EB06 jmp 004C723A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C721B(C)
|
:004C7234 43 inc ebx
:004C7235 83FB0A cmp ebx, 0000000A
:004C7238 75AA jne 004C71E4 //->循环9次?
..................................................................
为什么？老是才这里来来回回了?
开始分析一下:
004C7238 75AA jne 004C71E4->:004C71E4 8D4DEC lea ecx, dword ptr [ebp-14]
看到了吗？jne 004c71e4 见鬼去为啥这样了? 究竟要反复多少次了? 不继的按F10不要怕手软啊?
***********************************************************************************
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C7232(U)
|
:004C723A 8B45F8 mov eax, dword ptr [ebp-08] //-> F10第9次来到这里!

* Possible StringData Ref from Code Obj ->"100"
|
:004C723D BAD4734C00 mov edx, 004C73D4
:004C7242 E87DCEF3FF call 004040C4
:004C7247 750F jne 004C7258

* Possible StringData Ref from Code Obj ->"您输入的授权号不正确，请检查输入（要确保提供给"
->"本公司的序列号正确）！"
|
:004C7249 B8E0734C00 mov eax, 004C73E0
:004C724E E82D2DF9FF call 00459F80//->game over!
:004C7253 E9F6000000 jmp 004C734E

为什么这样的了?再分析一下!
:004C7238 75AA jne 004C71E4 (jump)第8次还有黄色"jump"
第9次就变成 (not jump)
这里一定有问题?
:004C71E4 8D4DEC lea ecx, dword ptr [ebp-14] //->d eax=ID
:004C71E7 A1C4E84F00 mov eax, dword ptr [004FE8C4]
:004C71EC 8B00 mov eax, dword ptr [eax]
:004C71EE 8BD3 mov edx, ebx
:004C71F0 E88BFEFFFF call 004C7080
:004C71F5 8B45EC mov eax, dword ptr [ebp-14]
:004C71F8 50 push eax //->才是真出现注册码的地方!
为使初学者容易明白,一次把它们说出来!
假设有一个数值123,把[ebp-14]中123送到ecx中.再把[004FE8C4]中123转到eax中然后把[eax]
的123再转到eax中!mov eax, dword ptr [ebp-14]同理!
123是假设不是相等的! 最后输入123! push eax 是输入在破解中有push跟寄存器多数是注册码或假码!
D eax 出现数码不是我的假码是不是注册码? 试一试! 果然是个人版注册成功!
注册码在这里到了哪为什么要循环了? 再分析一下,
:004C71E4 8D4DEC lea ecx, dword ptr [ebp-14] //->d eax=ID
:004C71F8 50 push eax //->才是真出现注册码的地方!
:004C720A 8D55E8 lea edx, dword ptr [ebp-18]//->d eax=假注册码
现在知道了注册原理了?
:004C71E4 8D4DEC lea ecx, dword ptr [ebp-14] //->d eax=ID
:004C71E7 A1C4E84F00 mov eax, dword ptr [004FE8C4]
:004C71EC 8B00 mov eax, dword ptr [eax]
:004C71EE 8BD3 mov edx, ebx
:004C71F0 E88BFEFFFF call 004C7080
:004C71F5 8B45EC mov eax, dword ptr [ebp-14]
:004C71F8 50 push eax //->才是真出现注册码的地方!
:004C720A 8D55E8 lea edx, dword ptr [ebp-18]//->d eax=假注册码
把id直接换算后输出真注册码才与你输入的注册码进行比较!
:004C71F8 50 push eax //->才是真出现注册码的地方!
为什么我这么破解定这里才是注册码了?
这里不但有eax=注册码 edx=假码!现在我明白为什么在破解过程中要看寄存器变化了?
就如:
:004C71E7 A1C4E84F00 mov eax, dword ptr [004FE8C4] ss:[ ]=?
eax=?
:004C71EC 8B00 mov eax, dword ptr [eax]
当然我们看到上面有ss:[ ]=?在下面eax发光d一下就是"?"了ds:[ ]也同理!
为什么要这样看了? 因为这个看能知道两句汇编是否有相同的寄存器值?(寄存器发光才要看)
而出现相等的值多数是id 假注册码或正注册码!
还有:004C71F8 50 push eax //->才是真出现注册码的地方!
Ds:[79ee48]=01cbe4ec 与 Stack Prot 32 窗口的
:0079ee48 >01cbe4ec相等! 原来这个窗口也有一点用?
我发现在真注册码时才有相等的值!
到上技巧对找到关键才有用?
:004C71F8 50 push eax (9次来出这里注册码都不同)
昨晚有一位大客说在:004C7216 E8A9CEF3FF call 004040C4
在这里下d eax就找到注册码! 已经我多次试验在:004C71F8 50 push eax
"eax="的值都发生变化来到大客所说时它的是相等的,所以真正计算出注册码是push eax才对!
说一下最快的方法就是借助W32dsm89反译后找到出现错误窗的call!
:004C724E E82D2DF9FF call 00459F80向上分析!
:004C7247 750F jne 004C7258
:004C7238 75AA jne 004C71E4
为什么找不到跳不过些call汇编了? 好分析一下两个跳过的命!一个是向下跳,另一个是向上跳!
程序执行有须序的都是从上到下才对! 所以第一个执行是jne 004C71E4->004C71E4 8D4DEC
分析一个就知道有循环了? 就要着重分析最后就能kill it!这样是不是更快了,但是要有一定的汇编
功力才行! 如何要暴力就要分析一个不些的! 这个软件比较奇怪以前暴力不跳多数在不远的地方而且
这个了看来要暴力比破解注册码才要麻烦了! 不过试暴力过但是没有成功过? 它不要其它的破解一样
的错误提示,而是能告诉你哪里有修改过? 看来应该是本身有监察功能吧？也许不能暴力或者我暴力
功力不足!
最后发现这个软件不是想像中的很简单!
你再破解时eax的值ds:[]、ss:[]都变化也id、假注册码、code所出现的地方也变了！
就算好像游戏一样用动态方式！
最后整理：
我的ID:1572546
sn: 19003697
21261621
18577266
15892912
13208557
10524203
78398485
51554940
24711394
9个注册码？
其中有鬼？
123分别是个版、专业版、网络版
456分别是个未注册版、专未注册业版、网络未注册版
789分别又是是个版、专业版、网络版
在注册表找到:
REGEDIT4

[HKEY_CURRENT_USER\yaxincat20cec]

[HKEY_CURRENT_USER\yaxincat20cec\addins]
"func1"=""
"func2"=""
"func3"=""
"func4"=""
"func5"=""
"func6"=""
"func7"=""
"func8"=""
"func9"=""
就是这看到有9个注册码!
删除又能注册了!
有一点不明白id是如何出现的了，要想修改一个这样就有自己的
id了可惜不在注册表和*.ini中请如何改它的id了？

标 题:贴我的注册机，另外有一个问题~~~~ (873字)
发信人:伪装者[CCG]
时 间:2001-2-26 1:23:44
详细信息:

 注册机如下，问题往后看
#include "stdio.h"
main()
{
char string[81];
long real[81];
long i;
printf("******YaXin CAT 2.5********\nThis keygen is maked by Pretender\nPlease
    input your ID  ");
gets(string);
if(string[7]==57) {string[7]=48;string[6]=string[6]+1;}
else string[7]+=1;
real[0]=(string[7]-48)*268435456;
real[1]=(string[0]-48)*16777216;
real[2]=(string[6]-48)*1048576;
real[3]=(string[1]-48)*65536;
real[4]=(string[5]-48)*4096;
real[5]=(string[2]-48)*256;
real[6]=(string[4]-48)*16;
real[7]=string[3]-48;
printf("Your Register code is ");
i=real[0]+real[1]+real[2]+real[3]+real[4]+real[5]+real[6]+real[7];
if(i>99999999) i/=100;
else if(i>9999999) i/=10;
printf("%ld\n",i);
printf("Welcome to WWW.CRACKNOW.COM\n");}
问题~我认为这个东西每个ID有10个注册码
虽然我全都可以找到，但是我不知道它们的作用都是什么~`
谁能告诉我？
标 题:未注册，个人版未注册，个人版已注册，专业版未注册,专业版已注册........ (空)
发信人:henryw
时 间:2001-2-26 8:10:40
详细信息:


易经八卦彩票占卜程序.V6.3

标 题:易经八卦彩票占卜程序.V6.3暴力及注册码破解,by冷雨飘心[BCG]出品 (5千字)
发信人:冷雨飘心
时 间:2001-4-23 19:02:38
详细信息:
易经八卦彩票占卜程序.V6.3暴力及注册码破解

作　　者：冷雨飘心 humewen@263.net
破解时间：2001-4-23
破解工具：TRW2000 V1.23 Hiew V6.40 W32dasm黄金版
下载地址: http://member.netease.com/~tr/
说 明:彩票软件,比昨天那个丁氏软件强点,至少用了八卦占卜,还算有创意,另外至少还可以写出注册程序,价格也便宜

一、暴力破解方法:
W32dasm可见:
:004067E1 8B8310030000 mov eax, dword ptr [ebx+00000310]
:004067E7 E860B1FFFF call 0040194C
:004067EC 84C0 test al, al
:004067EE 7428 je 00406818 <------------------------------不让它跳即可！
^^^^改为9090
:004067F0 A158525100 mov eax, dword ptr [00515258]
:004067F5 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"提示"
|
:004067F7 B918AA5000 mov ecx, 0050AA18

* Possible StringData Ref from Data Obj ->"恭喜！
注册成功！"
|
:004067FC BA06AA5000 mov edx, 0050AA06
:00406801 8B00 mov eax, dword ptr [eax]
:00406803 E830F60F00 call 00505E38
:00406808 8BC3 mov eax, ebx
:0040680A E831000000 call 00406840
:0040680F 8BC3 mov eax, ebx
:00406811 E8AE010000 call 004069C4
:00406816 EB18 jmp 00406830

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004067EE(C)
|
:00406818 A158525100 mov eax, dword ptr [00515258]
:0040681D 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"错误"
|
:0040681F B947AA5000 mov ecx, 0050AA47

* Possible StringData Ref from Data Obj ->"对不起，用户名和注册码不匹配。
注册失败！"
|
:00406824 BA1DAA5000 mov edx, 0050AA1D
:00406829 8B00 mov eax, dword ptr [eax]
:0040682B E808F60F00 call 00505E38
但修改后，每次运行都要注册一次,很烦,估计还有陷阱,每次启动时还要检查,故祭出trw2000动态跟踪,发现实际上是调用yijing.dll进行注册码计算追踪过程
:004019FB FFD3 call ebx//调用yijing.dll
//的wackywooky函数
:004019FD 85C0 test eax, eax
:004019FF 0F95C0 setne al//置标志
:00401A02 83E001 and eax, 00000001
:00401A05 8BD8 mov ebx, eax
//因此:
4019ff setnz al=>setz al
hiew 0fff:0f95c0-->0f94c0
注册码随便输,只要不是正确的,即可,(正确的概率象中5,000,000$$$嘿嘿)

二、注册码查找
在:004019FB FFD3 call ebx处追入
GO,to here:

0167:013012AF CALL 01302738
0167:013012B4 POP ECX
0167:013012B5 CMP ESI,EAX
0167:013012B7 JZ 013012C0
//比较用户名和序列号的个数若相等,则进一步比较,否则
跳走,你就什么也看不到了!退出填入相同个数的用户名和密码
我的是用户名:812153
s:545454
以下是注册码生成全过程,由于没有时间,所以不写注册机,go on
0167:013012B9 XOR EAX,EAX
0167:013012BB JMP 0130138A
0167:013012C0 PUSH EBX
0167:013012C1 CALL 01302738
0167:013012C6 POP ECX
0167:013012C7 MOV [EBP-08],EAX
0167:013012CA MOV EDX,[EBP-08]
0167:013012CD INC EDX
0167:013012CE PUSH EDX
0167:013012CF CALL 013015C8
0167:013012D4 POP ECX
0167:013012D5 MOV [EBP-04],EAX
0167:013012D8 MOV EAX,[EBP+0C]
0167:013012DB MOV ECX,[EBP-04]
0167:013012DE MOV EDI,EAX
0167:013012E0 XOR EAX,EAX
0167:013012E2 MOV ESI,ECX
0167:013012E4 OR ECX,BYTE -01
0167:013012E7 REPNE SCASB
0167:013012E9 NOT ECX
0167:013012EB SUB EDI,ECX
0167:013012ED MOV EDX,ECX
0167:013012EF XCHG ESI,EDI
0167:013012F1 SHR ECX,02
0167:013012F4 MOV EAX,EDI
0167:013012F6 REP MOVSD
0167:013012F8 MOV ECX,EDX
0167:013012FA AND ECX,BYTE +03
0167:013012FD REP MOVSB
0167:013012FF MOV EAX,[EBP-04]
0167:01301302 XOR ECX,ECX
0167:01301304 MOV EDX,EAX
0167:01301306 MOV EAX,EBX
0167:01301308 MOV [EBP-14],EDX
0167:0130130B MOV [EBP-10],EAX
0167:0130130E MOV EDX,[EBP-08]
0167:01301311 CMP ECX,EDX
0167:01301313 JNL 01301360 //开始注意了
0167:01301315 MOV EAX,[EBP-10]
0167:01301318 LEA EDI,[ECX+01]
0167:0130131B MOV BL,[EAX]
0167:0130131D MOVSX ESI,BL
0167:01301320 MOV EAX,ESI
0167:01301322 MOV EBX,4B
0167:01301327 IMUL ESI
0167:01301329 IMUL ESI
0167:0130132B LEA EDX,[ECX+01]
0167:0130132E IMUL EDX,EDI
0167:01301331 SUB EAX,EDX
0167:01301333 LEA EDX,[ECX+01]
0167:01301336 IMUL EDX,ESI
0167:01301339 SUB EAX,EDX
0167:0130133B INC ECX
0167:0130133C MOV [EBP-0C],EAX
0167:0130133F MOV EAX,[EBP-0C]
0167:01301342 CDQ
0167:01301343 XOR EAX,EDX
0167:01301345 SUB EAX,EDX
0167:01301347 CDQ
0167:01301348 IDIV EBX
0167:0130134A MOV EAX,EDX
0167:0130134C MOV EDX,[EBP-14]
0167:0130134F ADD AL,30
0167:01301351 MOV [EDX],AL
0167:01301353 INC DWORD [EBP-14]
0167:01301356 INC DWORD [EBP-10]
0167:01301359 MOV EAX,[EBP-08]
0167:0130135C CMP ECX,EAX //
0167:0130135E JL 01301315 //比较循环是否结束循环,计算
0167:01301360 MOV EAX,[EBP-04]
0167:01301363 MOV EDX,[EBP+0C]
0167:01301366 MOV CL,[EAX]----//[EAX],指向注册码
//d eax ----->kFYn<9,很奇怪,但就是他!
0167:01301368 CMP CL,[EDX]
0167:0130136A JNZ 01301388
可以bpx 01301368 do "d eax"取得注册码,不用写注册机,注意如果一次注册成功,下次将无法注册,是因为在注册表里作了手脚:查找yijing,你发现什么,不要犹豫,删之!(用户名和密码要相同长度)
推荐注册码: 用户名:1
序列号:z

附诗两句,聊表心情:
抽刀断水水更流，举杯销愁愁更愁。
人生在世不称意，明朝散发弄扁舟。


易经八卦彩票占卜程序.V6.3

 标 题:续未完成破解，写出它的注册机，3k。。。 (8千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-9 23:37:48
详细信息:
易经八卦彩票占卜程序.V6.3以前只是追出注册码，这个例子演示了如何利用源反编译代码写注册机，虽然很简单，但是大家看看吧，这个也算交作业了吧，该睡觉了。。。

注册机：
;cr_yj.asm******************************
.386
.model flat,stdcall
option casemap:none
include hd.h
_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
User db 80 dup(0)
Serial db 80 dup(0)
Count dd 0
adsn dd 0
MsgMesaage1 db "Must input Usernmae in oder to generate Reg Code! ",0
MsgCap db "By (C)hume,July,2001",0

.data?
hInstance HANDLE ?
.const
DLG_MAIN equ 1000
IDC_UN equ 1001
IDC_REG equ 1002
ID_GEN equ 1003
ID_EXIT equ 1004
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL

_ProcDlg proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==ID_GEN
invoke RtlZeroMemory,addr User,80
invoke RtlZeroMemory,addr Serial,80
invoke GetDlgItemText,hWnd,IDC_UN,addr User,80
.if eax!=NULL
mov Count,eax
call Cal
invoke SetDlgItemText,hWnd,IDC_REG,addr Serial

.else
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION

.endif

.elseif ax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif

.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlg ENDP

Cal PROC uses eax ebx
xor edx,edx
mov ecx,0
lea ebx,Serial
mov adsn,ebx

lopcal: LEA EDI,[ECX+01]
lea eax,User
add eax,ecx
MOV BL,[EAX]
MOVSX ESI,BL
MOV EAX,ESI
MOV EBX,4Bh
IMUL ESI
IMUL ESI
LEA EDX,[ECX+01]
IMUL EDX,EDI
SUB EAX,EDX
LEA EDX,[ECX+01]
IMUL EDX,ESI
SUB EAX,EDX
INC ECX
CDQ
XOR EAX,EDX
SUB EAX,EDX
CDQ
IDIV EBX
MOV EAX,EDX
ADD AL,30h
mov ebx,adsn
add ebx,ecx
dec ebx
MOV [ebx],AL
inc ebx
inc eax
CMP ECX,Count ;//
JL lopcal ;//比较循环是否结束循环,计算
ToEit: ret
Cal endp
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end all
end start
;cr_yj.rc******************************
#include <c:\masm32\include\resource.h>

#define DLG_MAIN 1000
#define IDC_UN 1001
#define IDC_REG 1002
#define ID_GEN 1003
#define ID_EXIT 1004

DLG_MAIN DIALOG 64, 53, 204, 52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "易经八卦彩票占卜程序.V6.3 Asm Keygen by Hume"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "GENERATE", ID_GEN, 148, 6, 50, 14
PUSHBUTTON "EXIT", ID_EXIT, 148, 24, 50, 14
EDITTEXT IDC_UN, 52, 10, 78, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_REG, 52, 29, 78, 13, WS_BORDER | WS_TABSTOP
LTEXT "USERNAME:", -1, 8, 12, 40, 10
LTEXT "REG CODE:", -1, 8, 30, 41, 9
}

附件：
易经八卦彩票占卜程序.V6.3暴力及注册码破解

作　　者：冷雨飘心 humewen@263.net
破解时间：2001-4-23
破解工具：TRW2000 V1.23 Hiew V6.40 W32dasm黄金版
下载地址: http://member.netease.com/~tr/
说 明:彩票软件,比昨天那个丁氏软件强点,至少用了八卦占卜,还算有创意,另外至少
还可以写出注册程序,价格也便宜

一、暴力破解方法:
W32dasm可见:
:004067E1 8B8310030000 mov eax, dword ptr [ebx+00000310]
:004067E7 E860B1FFFF call 0040194C
:004067EC 84C0 test al, al
:004067EE 7428 je 00406818
<------------------------------不让它跳即可！
^^^^改为9090
:004067F0 A158525100 mov eax, dword ptr [00515258]
:004067F5 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"提示"
|
:004067F7 B918AA5000 mov ecx, 0050AA18

* Possible StringData Ref from Data Obj ->"恭喜！
注册成功！"
|
:004067FC BA06AA5000 mov edx, 0050AA06
:00406801 8B00 mov eax, dword ptr [eax]
:00406803 E830F60F00 call 00505E38
:00406808 8BC3 mov eax, ebx
:0040680A E831000000 call 00406840
:0040680F 8BC3 mov eax, ebx
:00406811 E8AE010000 call 004069C4
:00406816 EB18 jmp 00406830

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004067EE(C)
|
:00406818 A158525100 mov eax, dword ptr [00515258]
:0040681D 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"错误"
|
:0040681F B947AA5000 mov ecx, 0050AA47

* Possible StringData Ref from Data Obj ->"对不起，用户名和注册码不匹配。
注册失败！"
|
:00406824 BA1DAA5000 mov edx, 0050AA1D
:00406829 8B00 mov eax, dword ptr [eax]
:0040682B E808F60F00 call 00505E38
但修改后，每次运行都要注册一次,很烦,估计还有陷阱,每次启动时还要检查,故祭出
trw2000动态跟踪,发现实际上是调用yijing.dll进行注册码计算追踪过程
:004019FB FFD3 call ebx//调用yijing.dll
//的wackywooky函数
:004019FD 85C0 test eax, eax
:004019FF 0F95C0 setne al//置标志
:00401A02 83E001 and eax, 00000001
:00401A05 8BD8 mov ebx, eax
//因此:
4019ff setnz al=>setz al
hiew 0fff:0f95c0-->0f94c0
注册码随便输,只要不是正确的,即可,(正确的概率象中5,000,000嘿嘿)

二、注册码查找
在:004019FB FFD3 call ebx处追入
GO,to here:

0167:013012AF CALL 01302738
0167:013012B4 POP ECX
0167:013012B5 CMP ESI,EAX
0167:013012B7 JZ 013012C0
//比较用户名和序列号的个数若相等,则进一步比较,否则
跳走,你就什么也看不到了!退出填入相同个数的用户名和密码
我的是用户名:812153
以下是注册码生成全过程,由于没有时间,所以不写注册机,go on
0167:013012B9 XOR EAX,EAX
0167:013012BB JMP 0130138A
0167:013012C0 PUSH EBX
0167:013012C1 CALL 01302738
0167:013012C6 POP ECX
0167:013012C7 MOV [EBP-08],EAX
0167:013012CA MOV EDX,[EBP-08]
0167:013012CD INC EDX
0167:013012CE PUSH EDX
0167:013012CF CALL 013015C8
0167:013012D4 POP ECX
0167:013012D5 MOV [EBP-04],EAX
0167:013012D8 MOV EAX,[EBP+0C]
0167:013012DB MOV ECX,[EBP-04]
0167:013012DE MOV EDI,EAX
0167:013012E0 XOR EAX,EAX
0167:013012E2 MOV ESI,ECX
0167:013012E4 OR ECX,BYTE -01
0167:013012E7 REPNE SCASB
0167:013012E9 NOT ECX
0167:013012EB SUB EDI,ECX
0167:013012ED MOV EDX,ECX
0167:013012EF XCHG ESI,EDI
0167:013012F1 SHR ECX,02
0167:013012F4 MOV EAX,EDI
0167:013012F6 REP MOVSD
0167:013012F8 MOV ECX,EDX
0167:013012FA AND ECX,BYTE +03
0167:013012FD REP MOVSB
0167:013012FF MOV EAX,[EBP-04]
0167:01301302 XOR ECX,ECX
0167:01301304 MOV EDX,EAX
0167:01301306 MOV EAX,EBX
0167:01301308 MOV [EBP-14],EDX
0167:0130130B MOV [EBP-10],EAX
0167:0130130E MOV EDX,[EBP-08]
0167:01301311 CMP ECX,EDX
0167:01301313 JNL 01301360 //开始注意了
0167:01301315 MOV EAX,[EBP-10]
0167:01301318 LEA EDI,[ECX+01]
0167:0130131B MOV BL,[EAX]
0167:0130131D MOVSX ESI,BL
0167:01301320 MOV EAX,ESI
0167:01301322 MOV EBX,4B
0167:01301327 IMUL ESI
0167:01301329 IMUL ESI
0167:0130132B LEA EDX,[ECX+01]
0167:0130132E IMUL EDX,EDI
0167:01301331 SUB EAX,EDX
0167:01301333 LEA EDX,[ECX+01]
0167:01301336 IMUL EDX,ESI
0167:01301339 SUB EAX,EDX
0167:0130133B INC ECX
0167:0130133C MOV [EBP-0C],EAX
0167:0130133F MOV EAX,[EBP-0C]
0167:01301342 CDQ
0167:01301343 XOR EAX,EDX
0167:01301345 SUB EAX,EDX
0167:01301347 CDQ
0167:01301348 IDIV EBX
0167:0130134A MOV EAX,EDX
0167:0130134C MOV EDX,[EBP-14]
0167:0130134F ADD AL,30
0167:01301351 MOV [EDX],AL
0167:01301353 INC DWORD [EBP-14]
0167:01301356 INC DWORD [EBP-10]
0167:01301359 MOV EAX,[EBP-08]
0167:0130135C CMP ECX,EAX //
0167:0130135E JL 01301315 //比较循环是否结束循环,计算
0167:01301360 MOV EAX,[EBP-04]
0167:01301363 MOV EDX,[EBP+0C]
0167:01301366 MOV CL,[EAX]----//[EAX],指向注册码
//d eax ----->kFYn<9,很奇怪,但就是他!
0167:01301368 CMP CL,[EDX]
0167:0130136A JNZ 01301388
可以bpx 01301368 do "d eax"取得注册码,不用写注册机,注意如果一次注册成功,下次
将无法注册,是因为在注册表里作了手脚:查找yijing,你发现什么,不要犹豫,删之!
(用户名和密码要相同长度)
推荐注册码:用户名:1
序列号:z

标 题:今天补上，小球兄满意否，给点鼓励，我可是菜鸟，不要让菜鸟哭泣。。。 (6千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-10 9:23:36
详细信息:

昨天晚上没有详细写出，今天补上，希望对初学者有所帮助
第一步：注册算法分析，关键部分如下：
0167:01301313 JNL 01301360 ****-> 开始注意了，以下为注册码计算部分
0167:01301315 MOV EAX,[EBP-10]****->顺序取取注册名每个字母
0167:01301318 LEA EDI,[ECX+01]****->初始化EDI，1，以后顺序加1，设为n（n=1,2...)
0167:0130131B MOV BL,[EAX]
0167:0130131D MOVSX ESI,BL
0167:01301320 MOV EAX,ESI ****->ESI=EDI=取出注册名 设为X
0167:01301322 MOV EBX,4B
0167:01301327 IMUL ESI
0167:01301329 IMUL ESI ****->X三次方
0167:0130132B LEA EDX,[ECX+01]
0167:0130132E IMUL EDX,EDI
0167:01301331 SUB EAX,EDX
0167:01301333 LEA EDX,[ECX+01] ****->减n平方
0167:01301336 IMUL EDX,ESI
0167:01301339 SUB EAX,EDX ****->减n*X
0167:0130133B INC ECX
0167:0130133C MOV [EBP-0C],EAX
0167:0130133F MOV EAX,[EBP-0C]
0167:01301342 CDQ
0167:01301343 XOR EAX,EDX ****-> 与0 XOR
0167:01301345 SUB EAX,EDX
0167:01301347 CDQ
0167:01301348 IDIV EBX
0167:0130134A MOV EAX,EDX ****->除0x4b，取余送eax
0167:0130134C MOV EDX,[EBP-14]
0167:0130134F ADD AL,30 ****->加0x30
0167:01301351 MOV [EDX],AL ****->保存
0167:01301353 INC DWORD [EBP-14]
0167:01301356 INC DWORD [EBP-10]
0167:01301359 MOV EAX,[EBP-08]
0167:0130135C CMP ECX,EAX
0167:0130135E JL 01301315 ****->循环处理每一个字母

第二步：构造GUI接口，以后写注册机可以用它作为模板
;cr_yj.rc******************************
#include <c:\masm32\include\resource.h>

#define DLG_MAIN 1000
#define IDC_UN 1001
#define IDC_REG 1002
#define ID_GEN 1003
#define ID_EXIT 1004

DLG_MAIN DIALOG 64, 53, 204, 52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "易经八卦彩票占卜程序.V6.3 Asm Keygen by Hume"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "GENERATE", ID_GEN, 148, 6, 50, 14
PUSHBUTTON "EXIT", ID_EXIT, 148, 24, 50, 14
EDITTEXT IDC_UN, 52, 10, 78, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_REG, 52, 29, 78, 13, WS_BORDER | WS_TABSTOP
LTEXT "USERNAME:", -1, 8, 12, 40, 10
LTEXT "REG CODE:", -1, 8, 30, 41, 9
}
;hd.h****************************************head include files
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\comctl32.inc
include c:\masm32\include\comdlg32.inc
include c:\masm32\include\shell32.inc

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
includelib c:\masm32\lib\comctl32.lib
includelib c:\masm32\lib\comdlg32.lib
includelib c:\masm32\lib\shell32.lib
;cr_yj.asm******************************
.386
.model flat,stdcall
option casemap:none
include hd.h
_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
User db 80 dup(0)
Serial db 80 dup(0)
Count dd 0
adsn dd 0
MsgMesaage1 db "Must input Usernmae in oder to generate Reg Code! ",0
MsgCap db "By (C)hume,July,2001",0

.data?
hInstance HANDLE ?
.const
DLG_MAIN equ 1000
IDC_UN equ 1001
IDC_REG equ 1002
ID_GEN equ 1003
ID_EXIT equ 1004
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL

_ProcDlg proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==ID_GEN ;generate按钮按下时的处理
invoke RtlZeroMemory,addr User,80
invoke RtlZeroMemory,addr Serial,80
invoke GetDlgItemText,hWnd,IDC_UN,addr User,80
.if eax!=NULL
mov Count,eax
call Cal ;注册码生成子程序
invoke SetDlgItemText,hWnd,IDC_REG,addr Serial

.else
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION ;错误处理
.endif

.elseif ax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif

.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlg ENDP

第三步：拷贝这部分代码，去掉前面的地址,构造Cal子程序：
稍微修改一下这部分代码，使之能够从数据部分取数，计算注册码，小写代码为改动部分

Cal PROC uses eax ebx
xor edx,edx
mov ecx,0
lea ebx,Serial
mov adsn,ebx

lopcal: LEA EDI,[ECX+01]
lea eax,User
add eax,ecx
MOV BL,[EAX]
MOVSX ESI,BL
MOV EAX,ESI
MOV EBX,4Bh
IMUL ESI
IMUL ESI
LEA EDX,[ECX+01]
IMUL EDX,EDI
SUB EAX,EDX
LEA EDX,[ECX+01]
IMUL EDX,ESI
SUB EAX,EDX
INC ECX
CDQ
XOR EAX,EDX
SUB EAX,EDX
CDQ
IDIV EBX
MOV EAX,EDX
ADD AL,30h
mov ebx,adsn
add ebx,ecx
dec ebx
MOV [ebx],AL
inc ebx
inc eax
CMP ECX,Count
JL lopcal ;//比较循环是否结束循环,计算
ToEit: ret
Cal endp
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end all
end start
第四步：编译，我用MASM32 V6编译，如果环境不同路径需要作部分修改
;mk.bat
cls
c:\masm32\bin\ml /c /coff /Cp yj.asm
rc /v yj.rc
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib yj.obj yj.res

第五步：享受成果，编译文件只有3k，没有进行压缩处理，执行速速飞快，win界面，dos界面总使人感觉与时代脱节，注册机在本人机器上运行正常，不知程序是否有BUG？调试真是比破解还累啊
第六步：总结
本人实在菜鸟一个，告诉菜鸟们一个秘诀，拿简单的开刀，使自己也变成老鸟！

付诗几句：
人生得意须尽欢，莫使金樽空对月！
仰天大笑出门去，我辈岂是蓬蒿人！

Hume，10/7,2001

标 题:再贴它的TC注册机，不过编译后居然11k (510字)
发信人:冷雨飘心[BCG]
时 间:2001-7-10 11:51:27
详细信息:

#include <stdio.h>
#include <string.h>
main()
{
char name[80];
register int i;
long int tmp;
printf("****************************************\n");
printf("*YiJIng Lottery Program Key_Gen by hume*\n");
printf("****************************************\n");
printf("Please input your register name:");
gets(name);
printf("\nYour register Code Is:");
for (i=0;i<strlen(name);i++ )
{tmp=name[i];
tmp=((tmp*tmp*tmp-(i+1)*(i+1)-(i+1)*tmp)%0x4b+0x30);
printf("%c",(char)tmp);
}

}


易经八卦占卜

 标 题:易经八卦占卜(1千字)
发信人:xiejialiang
时 间:2001-9-1 10:42:45
详细信息:
下面的是易经八卦占卜程序的注册码生成过程，请告诉我详细的解释好吗？

可能的话写个注册机。

下载地址：http://www.csdn.net/soft/openfile.asp?kind=1&id=13032

0167:00401BCD MOV ECX,[EBP-38]
0167:00401BD0 MOV EAX,[EBP-40]
0167:00401BD3 MOV DL,[ECX+EAX]
0167:00401BD6 MOV [EBP-45],DL
0167:00401BD9 MOVSX ECX,BYTE [EBP-45]
0167:00401BDD MOVSX EAX,BYTE [EBP-45]
0167:00401BE1 IMUL ECX,EAX
0167:00401BE4 MOVSX EDX,BYTE [EBP-45]
0167:00401BE8 IMUL ECX,EDX
0167:00401BEB MOV EAX,[EBP-40]
0167:00401BEE INC EAX
0167:00401BEF MOV EDX,[EBP-40]
0167:00401BF2 INC EDX
0167:00401BF3 IMUL EDX
0167:00401BF5 SUB ECX,EAX
0167:00401BF7 MOV EAX,[EBP-40]
0167:00401BFA INC EAX
0167:00401BFB MOVSX EDX,BYTE [EBP-45]
0167:00401BFF IMUL EDX
0167:00401C01 SUB ECX,EAX
0167:00401C03 PUSH ECX
0167:00401C04 CALL 00401CCC
0167:00401C09 POP ECX
0167:00401C0A MOV ECX,4B
0167:00401C0F CDQ
0167:00401C10 IDIV ECX
0167:00401C12 ADD DL,30
0167:00401C15 MOV [EBP-46],DL
0167:00401C18 MOV EAX,[EBP-38]
0167:00401C1B MOV EDX,[EBP-40]
0167:00401C1E MOV CL,[EBP-46]
0167:00401C21 MOV [EAX+EDX],CL
0167:00401C24 INC DWORD [EBP-40]
0167:00401C27 MOV EAX,[EBP-40]
0167:00401C2A MOV EDX,[EBP-44]
0167:00401C2D CMP EAX,EDX

标 题:这里: (464字)
发信人:冷雨飘心[BCG]
时 间:2001-9-1 13:18:50
详细信息:

0167:00401C0A MOV ECX,4B
0167:00401C0F CDQ ;al=eax=result
;calculated before

0167:00401C10 IDIV ECX ;divide by 4Bh,and get the
;remainder in dl then add it with
0167:00401C12 ADD DL,30 ;30h to convert it to ASCII

Strongly recommend you study the basic knowledge carefully,
Cracking is in fact a challenge to one,think and study more,then you will get more

标 题:这是我写的6.3的注册机,就你提供的用户名和密码看来算法没有变化,这个是用汇编写的,可能好理解一点 (3千字)
发信人:冷雨飘心[BCG]
时 间:2001-9-1 12:38:40
详细信息:

自己编译一下罢,如果要编译后的版本,可qq发给你(在线时),BCG内部也有
这个算法很简单,只不过演示了如何用汇编来写注册机,大部分是模板,cal是算法部分,写其它注册机时可少加改动即可重用大部分代码,界面设计是简单的对话框,虽然简单,优点是速度快(体现不出来),体积小3.0k(未压缩
),当然我不提倡用汇编写注册机,这只不过是我的业余爱好而已.
;===================make.bat compiled with MASM32
cls
c:\masm32\bin\ml /c /coff /Cp cr_yj.asm
rc /v cr_yj.rc
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib cr_yj.obj cr_yj.res
;===================cr_yj.rc
#include <c:\masm32\include\resource.h>

#define DLG_MAIN 1000
#define IDC_UN 1001
#define IDC_REG 1002
#define ID_GEN 1003
#define ID_EXIT 1004

DLG_MAIN DIALOG 54, 53, 244, 52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "易经八卦彩票占卜程序.V6.3/7.0 Keygen by Hume/BCG"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "GENERATE", ID_GEN, 181, 6, 50, 14
PUSHBUTTON "EXIT", ID_EXIT, 181, 24, 50, 14
CONTROL "Hume", IDC_UN, "EDIT", WS_BORDER | WS_TABSTOP, 62, 10, 98, 12
EDITTEXT IDC_REG, 62, 29, 109, 13, ES_READONLY | WS_BORDER | WS_TABSTOP
LTEXT "USERNAME:", -1, 18, 12, 40, 10
LTEXT "REG CODE:", -1, 18, 30, 41, 9
}

;===================cr_yj.asm
.386
.model flat,stdcall
option casemap:none
include hd.h
_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
User db 80 dup(0)
Serial db 80 dup(0)
Count dd 0
adsn dd 0
MsgMesaage1 db "Must input Username in order to generate Reg Code! ",0
MsgCap db "By (C)hume,July,2001",0

.data?
hInstance HANDLE ?
.const
DLG_MAIN equ 1000
IDC_UN equ 1001
IDC_REG equ 1002
ID_GEN equ 1003
ID_EXIT equ 1004
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL

_ProcDlg proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,\
SWP_NOMOVE or SWP_NOSIZE or SWP_DRAWFRAME

.elseif eax == WM_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==ID_GEN
invoke RtlZeroMemory,addr User,80
invoke RtlZeroMemory,addr Serial,80
invoke GetDlgItemText,hWnd,IDC_UN,addr User,80
.if eax!=NULL
mov Count,eax
call Cal
invoke SetDlgItemText,hWnd,IDC_REG,addr Serial

.else
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION

.endif

.elseif ax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif

.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlg ENDP

Cal PROC uses eax ebx
xor edx,edx
mov ecx,0
lea ebx,Serial
mov adsn,ebx

lopcal: LEA EDI,[ECX+01]
lea eax,User
add eax,ecx
MOV BL,[EAX]
MOVSX ESI,BL
MOV EAX,ESI
MOV EBX,4Bh
IMUL ESI
IMUL ESI
LEA EDX,[ECX+01]
IMUL EDX,EDI
SUB EAX,EDX
LEA EDX,[ECX+01]
IMUL EDX,ESI
SUB EAX,EDX
INC ECX
CDQ
XOR EAX,EDX
SUB EAX,EDX
CDQ
IDIV EBX
MOV EAX,EDX
ADD AL,30h
mov ebx,adsn
add ebx,ecx
dec ebx
MOV [ebx],AL
inc ebx
inc eax
CMP ECX,Count
JL lopcal ;//比较循环是否结束循环,计算
ToEit: ret
Cal endp
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end all
end start

标 题:这是6.3的tc Keygen供参考 (510字)
发信人:冷雨飘心[BCG]
时 间:2001-9-1 12:48:54
详细信息:

#include <stdio.h>
#include <string.h>
main()
{
char name[80];
register int i;
long int tmp;
printf("****************************************\n");
printf("*YiJIng Lottery Program Key_Gen by hume*\n");
printf("****************************************\n");
printf("Please input your register name:");
gets(name);
printf("\nYour register Code Is:");
for (i=0;i<strlen(name);i++ )
{tmp=name[i];
tmp=((tmp*tmp*tmp-(i+1)*(i+1)-(i+1)*tmp)%0x4b+0x30);
printf("%c",(char)tmp);
}

}


易经八卦占卜程序7.0

 标 题:破文一篇：易经八卦占卜程序7.0的破解（高手莫入） (8千字)
发信人:AirHolder
时 间:2001-8-31 21:38:00
详细信息:
★易经八卦占卜程序7.0的破解★

共享软件，注册费用RMB18（什么，就这破软件也要注册费18元，我倒！），未注册版无法打印占卜的内容，也无法根据公历日期换算到农历日期。

废话少说，先随便乱填一气，蹦出对话框“对不起，用户名和注册码不匹配。注册失败！”。
用W32Dasm反汇编后，查找该字符串，向上看去，来到

:0040905E E8E589FFFF call 00401A48 <--关键Call，要跟进
:00409063 84C0 test al, al <--al为标志寄存器
:00409065 742A je 00409091 <--跳，则去死
:00409067 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"提示"
|
:00409069 B9B0585200 mov ecx, 005258B0

* Possible StringData Ref from Data Obj ->"恭喜！
注册成功！"
|
:0040906E BA9E585200 mov edx, 0052589E
:00409073 A104075300 mov eax, dword ptr [00530704]
:00409078 8B00 mov eax, dword ptr [eax]
:0040907A E8196C1100 call 0051FC98
:0040907F 8B45D0 mov eax, dword ptr [ebp-30]
:00409082 E831000000 call 004090B8
:00409087 8B45D0 mov eax, dword ptr [ebp-30]
:0040908A E8CD010000 call 0040925C
:0040908F EB18 jmp 004090A9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409065(C)
|
:00409091 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"错误"
|
:00409093 B9DF585200 mov ecx, 005258DF

* Possible StringData Ref from Data Obj ->"对不起，用户名和注册码不匹配。
注册失败！"
|
:00409098 BAB5585200 mov edx, 005258B5
:0040909D A104075300 mov eax, dword ptr [00530704]
:004090A2 8B00 mov eax, dword ptr [eax]
:004090A4 E8EF6B1100 call 0051FC98

-------------------------------------------------------------------------------------
* Referenced by a CALL at Addresses:
|:004040C2 , :0040905E
|
:00401A48 55 push ebp
:00401A49 8BEC mov ebp, esp
:00401A4B 83C4B8 add esp, FFFFFFB8
:00401A4E 53 push ebx
:00401A4F 8955F8 mov dword ptr [ebp-08], edx
:00401A52 8945FC mov dword ptr [ebp-04], eax
:00401A55 B8682E5200 mov eax, 00522E68
:00401A5A E8B5431100 call 00515E14
:00401A5F C745E802000000 mov [ebp-18], 00000002
:00401A66 8D55FC lea edx, dword ptr [ebp-04]
:00401A69 8D45FC lea eax, dword ptr [ebp-04]
:00401A6C E813E31100 call 0051FD84
:00401A71 FF45E8 inc [ebp-18]
:00401A74 66C745DC0800 mov [ebp-24], 0008
:00401A7A 8D55F8 lea edx, dword ptr [ebp-08]
:00401A7D 8D45F8 lea eax, dword ptr [ebp-08]
:00401A80 E8FFE21100 call 0051FD84

.......................................省略一大段......................................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401B03(C)
|
:00401B38 8D45FC lea eax, dword ptr [ebp-04]
:00401B3B E868010000 call 00401CA8 <--eax返回用户名的长度
:00401B40 8BD8 mov ebx, eax <--ebx=eax
:00401B42 8D45F8 lea eax, dword ptr [ebp-08]
:00401B45 E85E010000 call 00401CA8 <--eax返回序列号的长度
:00401B4A 3BD8 cmp ebx, eax <--比较二者是否相等
:00401B4C 7433 je 00401B81 <--不相等，则去死
:00401B4E 33C0 xor eax, eax
:00401B50 50 push eax
:00401B51 FF4DE8 dec [ebp-18]
:00401B54 8D45F8 lea eax, dword ptr [ebp-08]
:00401B57 BA02000000 mov edx, 00000002
:00401B5C E84BE31100 call 0051FEAC
:00401B61 FF4DE8 dec [ebp-18]
:00401B64 8D45FC lea eax, dword ptr [ebp-04]
:00401B67 BA02000000 mov edx, 00000002
:00401B6C E83BE31100 call 0051FEAC
:00401B71 58 pop eax
:00401B72 8B55CC mov edx, dword ptr [ebp-34]
:00401B75 64891500000000 mov dword ptr fs:[00000000], edx
:00401B7C E920010000 jmp 00401CA1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401B4C(C)
|
:00401B81 8D45F8 lea eax, dword ptr [ebp-08]
:00401B84 E81F010000 call 00401CA8
:00401B89 8945BC mov dword ptr [ebp-44], eax
:00401B8C 8B55BC mov edx, dword ptr [ebp-44]
:00401B8F 42 inc edx
:00401B90 52 push edx
:00401B91 E816341100 call 00514FAC
:00401B96 59 pop ecx
:00401B97 8945C8 mov dword ptr [ebp-38], eax
:00401B9A 8B4DBC mov ecx, dword ptr [ebp-44]
:00401B9D 41 inc ecx
:00401B9E 51 push ecx
:00401B9F E808341100 call 00514FAC
:00401BA4 59 pop ecx
:00401BA5 8945C4 mov dword ptr [ebp-3C], eax
:00401BA8 8B55FC mov edx, dword ptr [ebp-04]
:00401BAB 8B45C8 mov eax, dword ptr [ebp-38]
:00401BAE E8A5771000 call 00509358
:00401BB3 8B55F8 mov edx, dword ptr [ebp-08]
:00401BB6 8B45C4 mov eax, dword ptr [ebp-3C]
:00401BB9 E89A771000 call 00509358
:00401BBE 33C9 xor ecx, ecx
:00401BC0 894DC0 mov dword ptr [ebp-40], ecx
:00401BC3 8B45C0 mov eax, dword ptr [ebp-40]
:00401BC6 8B55BC mov edx, dword ptr [ebp-44]
:00401BC9 3BC2 cmp eax, edx
:00401BCB 7D64 jge 00401C31

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C2F(C)
|
:00401BCD 8B4DC8 mov ecx, dword ptr [ebp-38] <--开始循环
:00401BD0 8B45C0 mov eax, dword ptr [ebp-40]
:00401BD3 8A1401 mov dl, byte ptr [ecx+eax]
:00401BD6 8855BB mov byte ptr [ebp-45], dl
:00401BD9 0FBE4DBB movsx ecx, byte ptr [ebp-45]
:00401BDD 0FBE45BB movsx eax, byte ptr [ebp-45]
:00401BE1 0FAFC8 imul ecx, eax
:00401BE4 0FBE55BB movsx edx, byte ptr [ebp-45]
:00401BE8 0FAFCA imul ecx, edx
:00401BEB 8B45C0 mov eax, dword ptr [ebp-40]
:00401BEE 40 inc eax
:00401BEF 8B55C0 mov edx, dword ptr [ebp-40]
:00401BF2 42 inc edx
:00401BF3 F7EA imul edx
:00401BF5 2BC8 sub ecx, eax
:00401BF7 8B45C0 mov eax, dword ptr [ebp-40]
:00401BFA 40 inc eax
:00401BFB 0FBE55BB movsx edx, byte ptr [ebp-45]
:00401BFF F7EA imul edx
:00401C01 2BC8 sub ecx, eax
:00401C03 51 push ecx
:00401C04 E8C3000000 call 00401CCC
:00401C09 59 pop ecx
:00401C0A B94B000000 mov ecx, 0000004B
:00401C0F 99 cdq
:00401C10 F7F9 idiv ecx
:00401C12 80C230 add dl, 30
:00401C15 8855BA mov byte ptr [ebp-46], dl <--dl为正确的注册码
:00401C18 8B45C8 mov eax, dword ptr [ebp-38]
:00401C1B 8B55C0 mov edx, dword ptr [ebp-40]
:00401C1E 8A4DBA mov cl, byte ptr [ebp-46] <--cl=dl
:00401C21 880C10 mov byte ptr [eax+edx], cl <--相应注册码存入用户名的地址中
:00401C24 FF45C0 inc [ebp-40]
:00401C27 8B45C0 mov eax, dword ptr [ebp-40]
:00401C2A 8B55BC mov edx, dword ptr [ebp-44]
:00401C2D 3BC2 cmp eax, edx
:00401C2F 7C9C jl 00401BCD <--返回循环开始处

AirHolder
2001.8.31.


音乐贺卡厂4.04

 标 题:破解音乐贺卡厂4.04,注册码也可用于4.10,高手勿进 (1千字)
发信人:DickieX
时 间:2001-8-14 23:47:02
详细信息:
破解音乐贺卡厂4.04
目标软件:音乐贺卡厂4.04 (ecardiy)
软件作用:傻瓜式多媒体贺卡制作工具,最后生成exe文件.
注册费用:18元
破解工具:TRW2000
1.我首先用FI发现它是用PECompact v.1.40-5加的壳,用ProcDump32脱了她,嘿嘿~~~~但是它好像有效验,一运行就有出错提示,而且反编译后也找不到字符串,只好跟踪了!
2.运行TRW2000,ecardiy,
软件序列号:1661197668 注册名:DickieX 注册码:78787878
Ctrl+N 唤出trw
bpx hmemcpy 设断
g
按注册框的确定,程序被拦截!
bc * 取消断点
PMODULE 来到ecardiy上空,发现这是用VB编的!
程序开始于:00432365.一次F12后出现错误提示,还是F10一步一步来!
……
0043243B CALL MSVBVM60!__vbaVarTsLt //检查注册名不能少于4个字符
……
0043251F CALL MSVBVM60!__vbaVarTsGt //检查注册名不能多于30个字符
……
004328D2 CALL MSVBVM60!__vbaStrCmp //此时d eax看见78787878,d ecx看见正确的ECD114888282!
……
00432946 CALL MSVBVM60!rtcMsgBox //上面注册码不对,这里给出出错提示
……
3.总结:
软件序列号:1661197668
注册名:DickieX 或 注册名:HeXi
注册码:ECD114888282 注册码:ECD841268010
注册成功后在程序所在目录下生成一个reguser.mcm文件,里面是注册名和注册码,删除后可重新注册.我不怎么懂VB,所以没有去推它的算法!
Dickie.01.08.14


音乐贺卡厂4.10

 标 题:音乐贺卡厂4.10破解过程 (6千字)
发信人:jieao
时 间:2001-8-11 13:33:17
详细信息:
音乐贺卡厂4.10破解过程

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00433373(C)
|
:00433387 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C]<-你输入的假码,我们把它改成[ebp-50]（真正的注册码的内存地址），嘿嘿，让它变成真的和真的比，不就....
:0043338D 8B4DB0 mov ecx, dword ptr [ebp-50]<-真正的注册码
:00433390 50 push eax
:00433391 51 push ecx

* Reference To: MSVBVM60.__vbaStrCmp, Ord:0000h
|
:00433392 FF1510114000 Call dword ptr [00401110]
:00433398 8BD8 mov ebx, eax
:0043339A 8D8D7CFFFFFF lea ecx, dword ptr [ebp+FFFFFF7C]
:004333A0 F7DB neg ebx
:004333A2 1BDB sbb ebx, ebx
:004333A4 F7DB neg ebx
:004333A6 F7DB neg ebx

* Reference To: MSVBVM60.__vbaFreeStr, Ord:0000h
|
:004333A8 FF159C124000 Call dword ptr [0040129C]
:004333AE 8D8D70FFFFFF lea ecx, dword ptr [ebp+FFFFFF70]
_____________________________________________________________________________
* Possible StringData Ref from Code Obj ->"\\reguser.mcm"
|
:004334DE 6804664100 push 00416604<-进栈

* Reference To: MSVBVM60.__vbaStrCat, Ord:0000h
|
:004334E3 FF155C104000 Call dword ptr [0040105C]<-生成reguser.mcm文件
:004334E9 8D9560FFFFFF lea edx, dword ptr [ebp+FFFFFF60]
:004334EF 8D4D80 lea ecx, dword ptr [ebp-80]
:004334F2 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax
:004334F8 C78560FFFFFF08000000 mov dword ptr [ebp+FFFFFF60], 00000008
:00433502 FFD7 call edi
:00433504 6A00 push 00000000
:00433506 8D9560FFFFFF lea edx, dword ptr [ebp+FFFFFF60]
_____________________________________________________________________________
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004335AF(C)
|
:004335C3 83EC10 sub esp, 00000010
:004335C6 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C]<-将你的注册名送入eax,准备写如reguser.mcm
:004335CC 8BD4 mov edx, esp
:004335CE B908000000 mov ecx, 00000008
:004335D3 898D60FFFFFF mov dword ptr [ebp+FFFFFF60], ecx
:004335D9 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax
:004335DF 890A mov dword ptr [edx], ecx
:004335E1 8B8D64FFFFFF mov ecx, dword ptr [ebp+FFFFFF64]
:004335E7 6A01 push 00000001

* Possible StringData Ref from Code Obj ->"WWriteLine"
|
:004335E9 6840664100 push 00416640
:004335EE 894A04 mov dword ptr [edx+04], ecx
:004335F1 8D4D90 lea ecx, dword ptr [ebp-70]
:004335F4 51 push ecx
:004335F5 C7857CFFFFFF00000000 mov dword ptr [ebp+FFFFFF7C], 00000000
:004335FF 894208 mov dword ptr [edx+08], eax
:00433602 8B856CFFFFFF mov eax, dword ptr [ebp+FFFFFF6C]
:00433608 89420C mov dword ptr [edx+0C], eax

* Reference To: MSVBVM60.__vbaObjVar, Ord:0000h
|
:0043360B FF151C114000 Call dword ptr [0040111C]
:00433611 50 push eax

* Reference To: MSVBVM60.__vbaLateMemCall, Ord:0000h
|
:00433612 FF1514124000 Call dword ptr [00401214]
:00433618 83C41C add esp, 0000001C
:0043361B 8D8D70FFFFFF lea ecx, dword ptr [ebp+FFFFFF70]

* Reference To: MSVBVM60.__vbaFreeObj, Ord:0000h
|
:00433621 FF1598124000 Call dword ptr [00401298]
:00433627 8D8D60FFFFFF lea ecx, dword ptr [ebp+FFFFFF60]

* Reference To: MSVBVM60.__vbaFreeVar, Ord:0000h
|
:0043362D FF151C104000 Call dword ptr [0040101C]
:00433633 8B17 mov edx, dword ptr [edi]
:00433635 57 push edi
:00433636 FF9204030000 call dword ptr [edx+00000304]
:0043363C 50 push eax
:0043363D 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70]
:00433643 50 push eax
:00433644 FFD3 call ebx
:00433646 8BF0 mov esi, eax
:00433648 8D957CFFFFFF lea edx, dword ptr [ebp+FFFFFF7C]
:0043364E 52 push edx
:0043364F 56 push esi
:00433650 8B0E mov ecx, dword ptr [esi]
:00433652 FF91A0000000 call dword ptr [ecx+000000A0]
:00433658 85C0 test eax, eax
:0043365A DBE2 fclex
:0043365C 7D12 jge 00433670
:0043365E 68A0000000 push 000000A0

* Possible StringData Ref from Code Obj ->"酦?檉??"
|
:00433663 68DC644100 push 004164DC
:00433668 56 push esi
:00433669 50 push eax

* Reference To: MSVBVM60.__vbaHresultCheckObj, Ord:0000h
|
:0043366A FF156C104000 Call dword ptr [0040106C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043365C(C)
|
:00433670 83EC10 sub esp, 00000010
:00433673 8B857CFFFFFF mov eax, dword ptr [ebp+FFFFFF7C]<-将你的注册码（你输入的假码）送入eax,准备写如reguser.mcm。我们把它改成[ebp-50](真正注册码的内存地址）
:00433679 8BD4 mov edx, esp
:0043367B B908000000 mov ecx, 00000008
:00433680 898D60FFFFFF mov dword ptr [ebp+FFFFFF60], ecx
:00433686 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax
:0043368C 890A mov dword ptr [edx], ecx
:0043368E 8B8D64FFFFFF mov ecx, dword ptr [ebp+FFFFFF64]
:00433694 6A01 push 00000001

* Possible StringData Ref from Code Obj ->"WWriteLine"
|
:00433696 6840664100 push 00416640
:0043369B 894A04 mov dword ptr [edx+04], ecx
:0043369E 8D4D90 lea ecx, dword ptr [ebp-70]
:004336A1 51 push ecx
:004336A2 C7857CFFFFFF00000000 mov dword ptr [ebp+FFFFFF7C], 00000000
:004336AC 894208 mov dword ptr [edx+08], eax
:004336AF 8B856CFFFFFF mov eax, dword ptr [ebp+FFFFFF6C]
:004336B5 89420C mov dword ptr [edx+0C], eax
总结：由于这程序有CRC校验，所以我们用内存补丁（我懒^_^)
附上RPP文件：
O=cr-ecardiy.exe:
F=ecardiy.exe:
p=433387/8b,85,7c,ff,ff,ff/8b,45,b0,90,90,90:
p=433673/8b,85,7c,ff,ff,ff/8b,45,b0,90,90,90:
$

jieao[CCG] 2001.8.11

标 题:<音乐贺卡工场4.10>注册。 (71字)
发信人:CrackerABC[BCG]
时 间:2001-8-10 21:15:06
详细信息:

bpx 433390 do "d ecx"
这可是为了给外面的老婆做贺卡的时候跟的，很简单。

标 题:简单说说注册算法 (1千字)
发信人:小楼
时 间:2001-8-11 14:23:55
详细信息:

//code with delphi5
var
name,machine,code,a,d,e:string;
len,halflen,i,b,f:integer;

//reg generate
begin
name:=editbox1.text;
len:=length(name);
machine:=editbox2.text+editbox2.text;
i:=1;
code:='ECD';
if len<4 then editbox3.text:='用户名至少为4位，且不能为中文。'
else
begin
if len/2<>round(len/2) then
begin
while i<=len do
begin
a:=int2str(ord(name[i]) xor ord(machine[i+2]));
code:=code+a;
i:=i+1;
end;
if length(code)>=12 then editbox3.text:=code[1]+code[2]+code[3]+code[4]+code[5]+code[6]+code[7]+code[8]+code[9]+code[10]+code[11]+code[12]
else
begin
e:=''; i:=1;
while i<=(length(code)-3) do
begin
d:=code[i+3];
e:=e+d;
i:=i+1;
end;
e:=e+e;
e:=e+e;
code:='ECD'+e;
editbox3.text:=code[1]+code[2]+code[3]+code[4]+code[5]+code[6]+code[7]+code[8]+code[9]+code[10]+code[11]+code[12];
end;
end;

if len/2=round(len/2) then
begin
.......//以下省略，抱歉，答应作者的，不能无信
end;
end;

end.


音乐无限V2.2

标 题:音乐无限V2.2(又名:音画时尚（ICE Player）)破解实录(与卫视中文台无关) (1千字)
发信人:风飘雪[CCG]
时 间:2001-4-5 16:33:48
详细信息:
音乐无限V2.2(又名:音画时尚（ICE Player）)破解实录(与卫视中文台无关)

http://61.128.193.188:8080/cgi-bin/dl.pl?url=ftp://ftp.bj.software.chinese.com/software/soft_mediatools/playerstyle220.zip
VB程序,破解极为简单,我只花了一分钟,敲注册码却花了n分钟
bpx hmemcpy
0167:0046B90C MOV EAX,[EBP-34]
0167:0046B90F PUSH EAX
0167:0046B910 MOV ECX,[EBP-38]
0167:0046B913 PUSH ECX
0167:0046B914 CALL `MSVBVM60!__vbaStrCmp` (1)
0167:0046B91A MOV ESI,EAX
经典比较句式 at (1) d eax // d ecx
内存窗口如下
0030:004D3730 54 00 44 00 39 00 38 00-63 00 2D 00 6B 00 69 00 T.D.9.8.c.-.k.i.
0030:004D3740 63 00 6A 00 2D 00 51 00-36 00 35 00 64 00 2D 00 c.j.-.Q.6.5.d.-.
0030:004D3750 32 00 34 00 32 00 39 00-43 00 2D 00 32 00 30 00 2.4.2.9.C.-.2.0.
0030:004D3760 39 00 36 00 00 00 35 00-35 00 00 00 44 00 00 A0 9.6...5.5...D..?
0030:004D3770 34 00 00 00 73 00 75 00-63 00 65 00 2D 00 57 00 4...s.u.c.e.-.W.
0030:004D3780 4D 00 43 00 5A 00 2D 00-4C 00 44 00 63 00 6F 00 M.C.Z.-.L.D.c.o.
0030:004D3790 2D 00 73 00 6C 00 79 00-79 00 2D 00 69 00 63 00 -.s.l.y.y.-.i.c.
0030:004D37A0 65 00 32 00 32 00 30 00-00 00 00 00 00 00 00 00 e.2.2.0.........

注册码 TD98c-kicj-Q65d-2429C-2096 suce-WMCZ-LDco-slyy-ice220

风去自由,飘过处踏雪无痕
gd1@yeah.net http://duba.126.com


赢家股票盘后分析1.2

 标 题:赢家股票盘后分析1.2 (8千字)
发信人:6767[BCG]
时 间:2001-7-7 17:51:48
详细信息:
赢家股票盘后分析1.2
by 6767 [BCG]

工具：SoftIce，IceDump(隐藏SI)，RegMon，Wdasm
d/l：
简述：用江恩(上世纪初的一位投资大师)理论对股票趋势作分析。

用RegMon监视它的运行发现对这两个键有读写操作：
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\excel\"Gc_id"
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\excel\"sex"

其中"Gc_id"每次运行会加5，到100时你就要注册了；"sex"存放机器码。

这里面很有意思：当你直接改Gc_id的值，使它大于100，重新运行时要求注册。如果sex的值是正确的机器码，你若注册成功，那就是真的成功了；如果sex的值不是正确的机器码(比如人为改动)，注册成功后你可以运行，当你退出程序后，你会发现Gc_id的值比sex值大10101，再次运行，提示不正确注册码。这时，Gc_id的值变为100，sex的值变为与机器码相关的一个数。再次运行，出现注册窗口，窗口的标题就是你的机器码，记下这个数值。

注册过程：安装后运行一次，改变Gc_id的值，使它大于100。再运行，到注册窗口了。随便填入些信息，在SI中下断点Bpx hmemcpy。中断下来后跟踪，N次F12到下面

* Possible StringData Ref from Code Obj ->"非注册软件序列号："
|
:0050373E 68343F5000 push 00503F34
:00503743 FFB3AC040000 push dword ptr [ebx+000004AC]

* Possible StringData Ref from Code Obj ->",请输入注册码："
|
:00503749 68503F5000 push 00503F50
:0050374E 8D45A0 lea eax, dword ptr [ebp-60]
:00503751 BA03000000 mov edx, 00000003
:00503756 E80D09F0FF call 00404068
:0050375B 8B45A0 mov eax, dword ptr [ebp-60]
:0050375E 8D4DF0 lea ecx, dword ptr [ebp-10]
:00503761 BA683F5000 mov edx, 00503F68
:00503766 E8B940F5FF call 00457824
:0050376B 84C0 test al, al <- 返回处
:0050376D 0F840B010000 je 0050387E <- 不会跳
:00503773 8BC3 mov eax, ebx
:00503775 E8921A0000 call 0050520C
:0050377A 3C01 cmp al, 01
:0050377C 750C jne 0050378A
:0050377E A1C0905000 mov eax, dword ptr [005090C0]
:00503783 8B00 mov eax, dword ptr [eax]
:00503785 E806DAF4FF call 00451190

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050377C(C)
|
:0050378A 6A00 push 00000000
:0050378C 6800E1F505 push 05F5E100 <- 0x5f5e100=100,000,000
:00503791 8B45F8 mov eax, dword ptr [ebp-08] <- eax=机器号码，显示在标题中
:00503794 03C0 add eax, eax <- eax*=2
:00503796 8945A4 mov dword ptr [ebp-5C], eax
:00503799 DB45A4 fild dword ptr [ebp-5C] <-
:0050379C DB2D6C3F5000 fld tbyte ptr [00503F6C] <- 3.14152696
:005037A2 DEC9 fmulp st(1), st(0) <- st(0)*=st(1)
:005037A4 D835783F5000 fdiv dword ptr [00503F78] <- st(0)/=360
:005037AA E80DF3EFFF call 00402ABC <- st(0)=sin(st(0))
>>>>>>>>>>>>>>
|
:00402ABC D9FE fsin <-
:00402ABE DFE0 fstsw ax
:00402AC0 9E sahf
:00402AC1 7A01 jpe 00402AC4
:00402AC3 C3 ret

:00402AC4 DDD8 fstp st(0)
:00402AC6 D9EE fldz
:00402AC8 C3 ret

<<<<<<<<<<<<<<<<

:005037AF DB2D7C3F5000 fld tbyte ptr [00503F7C] <- st(0)=1.01
:005037B5 DEC1 faddp st(1), st(0) <- st(0)+=st(1)
:005037B7 6945F883000000 imul eax, dword ptr [ebp-08], 00000083<- eax=机器号码*131
:005037BE 89459C mov dword ptr [ebp-64], eax
:005037C1 DB459C fild dword ptr [ebp-64]
:005037C4 DEC9 fmulp st(1), st(0) <- st(0)*=st(1)
:005037C6 E81DF3EFFF call 00402AE8 <- eax=st(0)
>>>>>>>>>>>>>>>
|
:00402AE8 83EC08 sub esp, 00000008
:00402AEB DF3C24 fistp qword ptr [esp]
:00402AEE 9B wait
:00402AEF 58 pop eax
:00402AF0 5A pop edx
:00402AF1 C3 ret

<<<<<<<<<<<<<

:005037CB E8CD39F0FF call 0040719D <- eax%=100,000,000

:005037D0 52 push edx
:005037D1 50 push eax
:005037D2 8D45EC lea eax, dword ptr [ebp-14]
:005037D5 E80260F0FF call 004097DC <- 将eax值存放于[ebp-14]
:005037DA 8B45EC mov eax, dword ptr [ebp-14] <- 正确的注册码
:005037DD 8B55F0 mov edx, dword ptr [ebp-10] <- 输入的注册码
:005037E0 E8D308F0FF call 004040B8 <- 比较
:005037E5 7563 jne 0050384A <- 相同则不跳走
:005037E7 8BC3 mov eax, ebx
:005037E9 E81E1A0000 call 0050520C
:005037EE 3C01 cmp al, 01
:005037F0 750C jne 005037FE
:005037F2 A1C0905000 mov eax, dword ptr [005090C0]
:005037F7 8B00 mov eax, dword ptr [eax]

......

:00503841 8BC6 mov eax, esi
:00503843 E818F8EFFF call 00403060
:00503848 EB7D jmp 005038C7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005037E5(C)
|
:0050384A 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"警告框"
|
:0050384C B9883F5000 mov ecx, 00503F88

* Possible StringData Ref from Code Obj ->"软件未注册!请与作者联系!"
|
:00503851 BA903F5000 mov edx, 00503F90
:00503856 A1C0905000 mov eax, dword ptr [005090C0]
:0050385B 8B00 mov eax, dword ptr [eax]
:0050385D E8D2D9F4FF call 00451234
:00503862 8BC6 mov eax, esi
:00503864 E8B729F6FF call 00466220
:00503869 8BC6 mov eax, esi
:0050386B E8F0F7EFFF call 00403060
:00503870 A1C0905000 mov eax, dword ptr [005090C0]
:00503875 8B00 mov eax, dword ptr [eax]
:00503877 E814D9F4FF call 00451190
:0050387C EB49 jmp 005038C7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050376D(C)
|
:0050387E 8BC3 mov eax, ebx
:00503880 E887190000 call 0050520C
:00503885 3C01 cmp al, 01
:00503887 750C jne 00503895
:00503889 A1C0905000 mov eax, dword ptr [005090C0]
:0050388E 8B00 mov eax, dword ptr [eax]
:00503890 E8FBD8F4FF call 00451190

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00503887(C)
|
:00503895 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"警告框"
|
:00503897 B9883F5000 mov ecx, 00503F88

* Possible StringData Ref from Code Obj ->"请与作者联系，使用注册软件!"
|
:0050389C BAAC3F5000 mov edx, 00503FAC
:005038A1 A1C0905000 mov eax, dword ptr [005090C0]
:005038A6 8B00 mov eax, dword ptr [eax]
:005038A8 E887D9F4FF call 00451234
:005038AD 8BC6 mov eax, esi
:005038AF E86C29F6FF call 00466220
:005038B4 8BC6 mov eax, esi
:005038B6 E8A5F7EFFF call 00403060
:005038BB A1C0905000 mov eax, dword ptr [005090C0]
:005038C0 8B00 mov eax, dword ptr [eax]
:005038C2 E8C9D8F4FF call 00451190

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00503708(C), :00503848(U), :0050387C(U)
|
:005038C7 8B45F8 mov eax, dword ptr [ebp-08]
:005038CA B91D57CA00 mov ecx, 00CA571D
:005038CF 99 cdq
:005038D0 F7F9 idiv ecx
:005038D2 3BFA cmp edi, edx
:005038D4 0F8528030000 jne 00503C02
:005038DA 8BC3 mov eax, ebx

在005037DD处“d eax”，看到的是你的注册码，记下来，bc *清断点。重新运行，输入正确的注册码，注册成功。

不知为什么，对程序中的某个地址下Bpx拦不住(TRW能但没办法看到浮点寄存器)。

标 题:太笨了，改进四舍五入 (491字)
发信人:6767[BCG]
时 间:2001-7-7 18:09:19
详细信息:

#include <stdio.h>
#include <math.h>

main()
{
unsigned long aa;
double bb;
printf("--Stk 1.20--by FarProcCall\n\nPlease input your Code\t:");
scanf("%lu",&aa);
bb=aa;
bb*=2;
bb*=3.14152696;
bb/=360;
bb=sin(bb);
bb+=1.01;

aa*=131;
bb*=aa;
aa=bb;

bb-=aa;
if (bb>0.499999)
aa++;

aa%=100000000;
printf("\nYou RegistrationCode is\t:%lu \n\n",aa);
getch();
}


邮件巡捕 v1.62

标 题:浅谈用“搜索大法”来索取内存注册码 (4千字)
发信人:qhj
时 间:2001-3-23 19:53:44
详细信息:
浅谈用“搜索大法”来索取内存注册码
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

作者：《绝密档案》
主页：http://hongjian.126.com
破解工具：SOFIC4.5版本！

破解原理：
   根据注册码的真假相近邻的特性，采取搜索假注册码来找真的注册码的方法！
由于部分程序的真假注册码验证方法如下：
call XXXXX ##### 调用子程序来验证真假注册码
CMP　xxx,xxxx　　 ###### 比较真假注册码
jn 跳或不跳 #### 真就怎么样，假就怎么样,跳或不跳

  当你按F10键单步跟踪到此后，（一到出现出错信息为止－即或按F12直到出错为止），
这时，程序已经对你所输入的注册码进行了验证！并发出出错信息！
所以，此时内存中就存在真假两个注册码！此时，内存中就存在真假两个注册码！
所以你就可以使用搜索大法！！

具体步骤如下：以“邮件巡捕”为例子：

软件介绍：邮件搜索
特点：注册码符号其特！！令人费解！

用搜索“S7878”大法取“邮件巡捕 v1.62”注册码
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

破解步骤：

一）运行TRW，导入“财会软件”，输入
用户名：绝密档案E－mail:http://hongjian.126.com
注册码：787878－78787878－78787878
二）＾＋D　返回SOF状态！
三）设置断点：bpx hmemcpy 后，按F5返回“邮件巡捕 ”，再按确定键！立即被TRW拦截成功
四）BD　＊临时中断！
五）按F12键 37次后，因第38次出错，且出错后并不能立即被SOF拦截，故需键F12共37次！
再按F10到这里：

0167:0041C731 POP ESI
0167:0041C732 RET
0167:0041C733 MOV EAX,ECX
0167:0041C735 PUSH BYTE +01
0167:0041C737 POP ECX
0167:0041C738 XOR EDX,EDX
0167:0041C73A MOV [EAX+04],ECX
0167:0041C73D MOV [EAX+08],EDX
0167:0041C740 MOV [EAX+0C],EDX
0167:0041C743 MOV [EAX+10],EDX
0167:0041C746 MOV [EAX+14],ECX

六）使用"7878"大法　即 S 30:0 LFFFFFFFF '78787878' 进行第一次搜索！
    在“78787878”（共出现三次）的地方并没有注册码出现，正常！因为程序到目前为止，
    还没有对真假两个注册码进行验证，所以，此时搜索只能找到假的，真的还没有出现！
      （很多朋友说不能搜索，我想大概就是这个原因吧）

七）于是，使用F10键单步跟踪！！直至出错窗口！按确定后程序立即又被SOFTICE拦截，
    这时你就可以使用搜索大法去搜索！

此时，使用搜索大法发现：
787878
787878
787878
emailspidereasy.exe
Y[MQ6(GAYTa[*)I{FkIP@+@　　　＃＃＃假的注册码
hongjian
>XUrGyXQhttp://hongjian.126.com
.hYLd$`Q>XUrGyXQ|T"9`C*V　　　＃＃＃＃真的注册码

或者你也可以边查看CALL xxx ,cmp xxx,xxx jz xxx ,
边搜索，直到出现真的为止！

    注意，记下出错当前系统的CALL　XXXX　＃＃＃这个CALL　XXX　导致出错！
*****************

第二次跟踪：(一般情况下并需要）

  注意，此时，程序不要退出，但是，你必须重新输入相关的注册信息，否则，
否则，以后你所搜索的东西还上一次的内容！只有当第一次不能搜索，才使用第二次，
主要是进入出错的CALLXXX　　里面搜索！
（本例并不需要，大多数也不需要）

八）按确定后，BE　＊　恢复断点！再键F5键返回程序，再确定！又被拦截成功！
九）BD　＊　中断后，再按F12　37次，再次来到这里：

0167:0041C731 POP ESI
0167:0041C732 RET
0167:0041C733 MOV EAX,ECX
0167:0041C735 PUSH BYTE +01
0167:0041C737 POP ECX
0167:0041C738 XOR EDX,EDX
0167:0041C73A MOV [EAX+04],ECX
0167:0041C73D MOV [EAX+08],EDX
0167:0041C740 MOV [EAX+0C],EDX
0167:0041C743 MOV [EAX+10],EDX
0167:0041C746 MOV [EAX+14],ECX

十）再次使用搜索“S7878”大法，这时，在787878下面出现：邮件搜索的EXE文件名，
用户名，用户电子信箱...你注册时的信息！这时，

      要注意：在用户EMAIL信息前头有一此信息，之前有一串奇怪的符号；
之后也有一些奇怪的符号，且包含电子信箱前面的信息，它就真的注册码，抄下吧！

如：
787878
787878
787878
emailspidereasy.exe
Y[MQ6(GAYTa[*)I{FkIP@+@　　　＃＃＃假的注册码
hongjian
>XUrGyXQhttp://hongjian.126.com
.hYLd$`Q>XUrGyXQ|T"9`C*V　　　＃＃＃＃真的注册码

总结：

    1）使用搜索“S7878”大法，使其程序第一次运行进行注册码验证，根据真假注册码相近邻的特性，
在第一次程序进行验证后，内存中就已经存在真假两个注册码了！当第二使用搜索S7878大法时，
在内存中便出现真的注册码了！

    2）另，在填写注册码时，最好使用系统不常出现的字符作为注册码！方便准确搜索！
如：asasasasasa opopopopopo uiuiuiuiuiuiui 等！不要使用12345678或　11111111等，
因为这些字符在WIN系统中到处都是！它会影响你的搜索准确性！

本人用此办法破解了：神奇注册表、轻松试卷、万能五笔、DBTOOLS数据专家等

注意：

      此方法，只适用于一些简单的注册码加密法！
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

这种方法也有其局限性：

1)真的注册码必须在内存中以文本形式出现，不能以十六进制形式出现！
  2）VB程序此方法失效！
3）一些复杂的注册码验证法。如：逐个验证注册码此方法失效！

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

作者：《绝密档案》
主页：http://hongjian.126.com

  欢迎各位大侠多多指导！

标 题:邮件巡捕 V1.62 两步曲破解法！（献给 QHJ－我的朋友） (9千字)
发信人:paulyoung
时 间:2001-3-23 20:44:26
详细信息:

邮件巡捕 V1.62 两步曲破解法！（献给 QHJ－我的朋友）

DOWNLOAD FROM: http://www.crackbest.com/chcrack/crack/CrEmailSpiderEasy162C.zip
软件简介：定向邮件地址收集专家。从任一网址或搜索引擎开始搜索提取邮件地址。演示版限制，搜索结果不能保存。
破解工具：TRW2000 V1.03 and W32DASM V8.93

PaulYoung 热力奉献。
★E-mail:paulyoung@yeah.net★
★ 2001.3.23 ★

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

☆　　一、首选用W32DASM反汇编邮件巡捕 V1.62。在“串式字符串参考”找到“注册失败”。如下所示：

* Possible StringData Ref from Data Obj ->"注册成功! "
|
:0040991C 682C154300 push 0043152C
:00409921 E867860100 call 00421F8D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409916(C)
|
:00409926 833D08B1430001 cmp dword ptr [0043B108], 00000001
:0040992D 750E jne 0040993D
:0040992F 6A00 push 00000000
:00409931 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Thanks for Register! Good Luck "
->"Everyday!"
|
:00409933 6800154300 push 00431500
:00409938 E850860100 call 00421F8D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040992D(C)
|
:0040993D 8B5500 mov edx, dword ptr [ebp+00]
:00409940 8BCD mov ecx, ebp
:00409942 FF92C4000000 call dword ptr [edx+000000C4] *********
:00409948 EB78 jmp 004099C2 *********

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040990D(C)
|
:0040994A BE01000000 mov esi, 00000001
:0040994F 3BC6 cmp eax, esi
:00409951 753A jne 0040998D
:00409953 A108B14300 mov eax, dword ptr [0043B108]
:00409958 85C0 test eax, eax
:0040995A 750E jne 0040996A
:0040995C 6A00 push 00000000
:0040995E 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册成功! "
|
:00409960 682C154300 push 0043152C
:00409965 E823860100 call 00421F8D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040995A(C)
|
:0040996A 393508B14300 cmp dword ptr [0043B108], esi
:00409970 750E jne 00409980
:00409972 6A00 push 00000000
:00409974 6A00 push 00000000

* Possible StringData Ref from Data Obj ->" Thanks for Register!
The Max "
->"Urls Spidered Every Time limit "
->"to 200000!
Good Luck Everyday!"
|
:00409976 68A0144300 push 004314A0
:0040997B E80D860100 call 00421F8D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409970(C)
|
:00409980 8B4500 mov eax, dword ptr [ebp+00]
:00409983 8BCD mov ecx, ebp
:00409985 FF90C4000000 call dword ptr [eax+000000C4] ***********
:0040998B EB35 jmp 004099C2 ***********

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409951(C)
|

* Possible Reference to Dialog: DialogID_0064
|

* Possible Reference to Dialog: DialogID_7801, CONTROL_ID:0064, ""
|
:0040998D 6A64 push 00000064

* Reference To: KERNEL32.Sleep, Ord:0296h
|
:0040998F FF1590814200 Call dword ptr [00428190]
:00409995 A108B14300 mov eax, dword ptr [0043B108]
:0040999A 85C0 test eax, eax //eax=1，即成功，否则就跳
:0040999C 750E jne 004099AC //可以在0040998F处设断，在此下 r fl z　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　z　使其不出现“注册失败”提示，继续 比较，也可以不改，确定“注册失败”继续比较。
:0040999E 6A00 push 00000000
:004099A0 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册失败! "
|
:004099A2 6894144300 push 00431494
:004099A7 E8E1850100 call 00421F8D ***********

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040999C(C)
|
:004099AC 393508B14300 cmp dword ptr [0043B108], esi ***********
:004099B2 750E jne 004099C2 ***********
:004099B4 6A00 push 00000000
:004099B6 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Please Check your Register Code "
->"
Or Contact us to Register!"
|
:004099B8 6858144300 push 00431458
:004099BD E8CB850100 call 00421F8D

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

（以下是重点）

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00409948(U), :0040998B(U), :004099B2(C)
|
:004099C2 6A00 push 00000000
:004099C4 8BCD mov ecx, ebp
:004099C6 E8965B0100 call 0041F561
:004099CB 8BCD mov ecx, ebp
:004099CD E8B03E0100 call 0041D882
:004099D2 8D4C2414 lea ecx, dword ptr [esp+14]
:004099D6 C68424C000000005 mov byte ptr [esp+000000C0], 05
:004099DE E8C7100100 call 0041AAAA
:004099E3 8D4C2420 lea ecx, dword ptr [esp+20] ********* （装有效地址，下同）
:004099E7 C68424C000000004 mov byte ptr [esp+000000C0], 04
:004099EF E8B6100100 call 0041AAAA
:004099F4 8D4C241C lea ecx, dword ptr [esp+1C] *********
:004099F8 C68424C000000003 mov byte ptr [esp+000000C0], 03
:00409A00 E8A5100100 call 0041AAAA
:00409A05 8D4C2410 lea ecx, dword ptr [esp+10] **********
:00409A09 C68424C000000002 mov byte ptr [esp+000000C0], 02
:00409A11 E894100100 call 0041AAAA
:00409A16 8D4C2418 lea ecx, dword ptr [esp+18] **********
:00409A1A C68424C000000001 mov byte ptr [esp+000000C0], 01
:00409A22 E883100100 call 0041AAAA
:00409A27 8D4C2424 lea ecx, dword ptr [esp+24]
:00409A2B C68424C000000000 mov byte ptr [esp+000000C0], 00
:00409A33 E872100100 call 0041AAAA
:00409A38 8D8C2494000000 lea ecx, dword ptr [esp+00000094]
:00409A3F C78424C00000001D000000 mov dword ptr [esp+000000C0], 0000001D
:00409A4A E85B100100 call 0041AAAA
:00409A4F 8D8C2490000000 lea ecx, dword ptr [esp+00000090]
:00409A56 C68424C00000001C mov byte ptr [esp+000000C0], 1C
:00409A5E E847100100 call 0041AAAA
:00409A63 8D8C248C000000 lea ecx, dword ptr [esp+0000008C]
:00409A6A C68424C00000001B mov byte ptr [esp+000000C0], 1B
:00409A72 E833100100 call 0041AAAA
:00409A77 8D8C2488000000 lea ecx, dword ptr [esp+00000088]
:00409A7E C68424C00000001A mov byte ptr [esp+000000C0], 1A
:00409A86 E81F100100 call 0041AAAA
:00409A8B 8D8C2484000000 lea ecx, dword ptr [esp+00000084]
:00409A92 C68424C000000019 mov byte ptr [esp+000000C0], 19
:00409A9A E80B100100 call 0041AAAA
:00409A9F 8D8C2480000000 lea ecx, dword ptr [esp+00000080]
:00409AA6 C68424C000000018 mov byte ptr [esp+000000C0], 18
:00409AAE E8F70F0100 call 0041AAAA
:00409AB3 8D4C247C lea ecx, dword ptr [esp+7C]
:00409AB7 C68424C000000017 mov byte ptr [esp+000000C0], 17
:00409ABF E8E60F0100 call 0041AAAA
:00409AC4 8D4C2478 lea ecx, dword ptr [esp+78]
:00409AC8 C68424C000000016 mov byte ptr [esp+000000C0], 16
:00409AD0 E8D50F0100 call 0041AAAA
:00409AD5 C68424C000000015 mov byte ptr [esp+000000C0], 15

☆　　二、在TRW2000　下bpx 004099E3，d ecx 再用ALT+↓拖动可看到假的序列号和真的序列号，下面的lea ecx,×××也可 d ecx 看到。不过会看到两个类似的序列号，其中一个是真的，共有连在一起的24个古怪字符。

:004099E7 C68424C000000004 mov byte ptr [esp+000000C0], 04
:004099EF E8B6100100 call 0041AAAA
:004099F4 8D4C241C lea ecx, dword ptr [esp+1C] *********　此处也可设断点
:004099F8 C68424C000000003 mov byte ptr [esp+000000C0], 03
:00409A00 E8A5100100 call 0041AAAA
:00409A05 8D4C2410 lea ecx, dword ptr [esp+10] **********　同上
:00409A09 C68424C000000002 mov byte ptr [esp+000000C0], 02
:00409A11 E894100100 call 0041AAAA
:00409A16 8D4C2418 lea ecx, dword ptr [esp+18] **********　同上
.
.
.
（注：**********为重点）

如我的注册码为：

用户名：PaulYoung
邮件地址：paulyoung@yeah.net
注册码：|],upRX]b9#P@239|!`Q<qYW

在注册框的三个框内分别依次填入
|],upRX]
b9#P@239
|!`Q<qYW

注册成功！！！！！！

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

仅以此文献给广大破解爱好者以及 QHJ 兄，须知“长江后浪推前浪，一代新人胜旧人”，不要老是讥笑我！！！！

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

常到看雪破解论坛走一走，不会解来也会“偷”！

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


有声有色4.0

 标 题:我来说一下方法好了<<注册你的有声有色4.0>> (1千字)
发信人:zombieys
时 间:2001-4-29 13:19:05
详细信息:
注册你的有声有色4.0

方法：执行有声有色，点注册，把该填的都填上,注册码填12121212，下s 30:0 l ffffffff '12121212',bpm搜到的地址，按f12/f10,跟到如下：

543b4a mov edx,dword ptr [567d60] //在这看到序列号,比如格式12/34/56,输入的序列号应该是214365
543b4f mov edx,dword ptr [567d64]

543c4a mov edx,dword ptr [edx+2c] //在这可以看到注册码

*一个有效的注册码

序列号：303000(这个每台机器不一样，不知道怎么算的，可能跟机器名有关吧)
用户名：zombieys
注册码：208332-238370310-6470173

*MFC42ENS.dll(用Norton Registry Tracker监视系统变化发现MFC42ENS.dll控制过期)

安装之后最好立即备份这个玩艺，这个是注册后的内容

M鰃鬼\k詤]~&*??6B

*MusRea.ini

这个是注册后的内容,比原来多了不少东西

[System]
yancai=0
luilai=2
sesese=1
bias=clBlack
biae=clActiveCaption
offbiafont=宋体,9,0000,clWhite
tisfont=宋体,9,1000,clBlack
tishintcolor=$008CFFFF
tisshadowcolor=clBlack
zmbh=0
startautorun=0
gbcb=1
bakhtmls=1

[Register]
MySerial=303000
Username=zombieys
Serial=208332-238370310-6470173

注意：在搞它时要记得备份MFC42ENS.dll,否则有可能无法使用哦

———————————————————————————————>
.-" "-. Cracked by zombieys >
/　　　　　　\ My oicq is 1789655 >
| | My hp is zombieys.yeah.net>
|, .-. .-. ,| My hp is zombieys.126.com >
|)(__/ \__)(| >
|/ /\ \| Thanks for your supports >
(@_@) (_ ^^ _) >
_ )\_______\__|IIIIII|__/_____ >
_)@8@8{}<________|-\IIIIII/-|____zombieys_____________________>

标 题:序列号和机器的bios日期有关。Win98在注册表[HKEY_LOCAL_MACHINE\Enum\Root\*PNP0C01\0000]下"BIOSDate"中。 (空)
发信人:lijing
时 间:2001-4-29 17:11:03
详细信息:

标 题:补充:我的bios 08/14/97 序列号输894071 规律:41/63/25 123456 (空)
发信人:8989
时 间:2001-4-29 18:45:37
详细信息:


有声有色4.0

 标 题:有声有色4.0注册算法 一 (11千字)
发信人:华仔[CCG]
时 间:2001-5-1 0:55:42
详细信息:
有声有色4.0注册算法

作者：华仔
组织：China Cracking Group
时间：2001.05.01

我的上网时间几乎为0，这篇文章还是在朋友家发出来的（朋友让我搞定这个软件，回报
就是获得(30 mod 20) or (60 xor 57)分钟的上网时间）

一、实战：

1、进入注册窗口，输入如下信息
序列号：1974923
用户名：华仔[CCG]
注册码：1974923

2、载入TRW2000，下“bpx hmemcpy”设断，再下“g”运行程序，单击“确定”，程序马
上被拦下。下“pmodule”、再按59次F10 来到005439F1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00543952(C)
|
:005439F1 33C0 xor eax, eax
:005439F3 55 push ebp
:005439F4 685C3E5400 push 00543E5C
:005439F9 64FF30 push dword ptr fs:[eax]
:005439FC 648920 mov dword ptr fs:[eax], esp
:005439FF B8807D5600 mov eax, 00567D80
:00543A04 BA14405400 mov edx, 00544014
:00543A09 E81E04ECFF call 00403E2C
:00543A0E 68687D5600 push 00567D68
:00543A13 8D55DC lea edx, dword ptr [ebp-24]
:00543A16 8B45FC mov eax, dword ptr [ebp-04]
:00543A19 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00543A1F E87C2EEFFF call 004368A0
:00543A24 8B45DC mov eax, dword ptr [ebp-24]
*//取输入的序列号：1974923

* Possible Reference to String Resource ID=00001: "Today"
|
:00543A27 B901000000 mov ecx, 00000001
*//第一位：1

:00543A2C BA04000000 mov edx, 00000004
*//取第四位：4

:00543A31 E82A08ECFF call 00404260
:00543A36 686C7D5600 push 00567D6C
:00543A3B 8D55D8 lea edx, dword ptr [ebp-28]
:00543A3E 8B45FC mov eax, dword ptr [ebp-04]
:00543A41 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00543A47 E8542EEFFF call 004368A0
:00543A4C 8B45D8 mov eax, dword ptr [ebp-28]
*//取输入的序列号：1974923

* Possible Reference to String Resource ID=00001: "Today"
|
:00543A4F B901000000 mov ecx, 00000001
*//第一位：1

* Possible Reference to String Resource ID=00001: "Today"
|
:00543A54 BA01000000 mov edx, 00000001
*//取第一位：1

:00543A59 E80208ECFF call 00404260
:00543A5E 68707D5600 push 00567D70
:00543A63 8D55D4 lea edx, dword ptr [ebp-2C]
:00543A66 8B45FC mov eax, dword ptr [ebp-04]
:00543A69 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00543A6F E82C2EEFFF call 004368A0
:00543A74 8B45D4 mov eax, dword ptr [ebp-2C]
*//取输入的序列号：1974923

* Possible Reference to String Resource ID=00001: "Today"
|
:00543A77 B901000000 mov ecx, 00000001
*//第一位：1

:00543A7C BA06000000 mov edx, 00000006
*//取第六位：2

:00543A81 E8DA07ECFF call 00404260
:00543A86 68747D5600 push 00567D74
:00543A8B 8D55D0 lea edx, dword ptr [ebp-30]
:00543A8E 8B45FC mov eax, dword ptr [ebp-04]
:00543A91 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00543A97 E8042EEFFF call 004368A0
:00543A9C 8B45D0 mov eax, dword ptr [ebp-30]
*//取输入的序列号：1974923

* Possible Reference to String Resource ID=00001: "Today"
|
:00543A9F B901000000 mov ecx, 00000001
*//第一位：1

:00543AA4 BA03000000 mov edx, 00000003
*//取第三位：7

:00543AA9 E8B207ECFF call 00404260
:00543AAE 68787D5600 push 00567D78
:00543AB3 8D55CC lea edx, dword ptr [ebp-34]
:00543AB6 8B45FC mov eax, dword ptr [ebp-04]
:00543AB9 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00543ABF E8DC2DEFFF call 004368A0
:00543AC4 8B45CC mov eax, dword ptr [ebp-34]
*//取输入的序列号：1974923

* Possible Reference to String Resource ID=00001: "Today"
|
:00543AC7 B901000000 mov ecx, 00000001
*//第一位：1

:00543ACC BA02000000 mov edx, 00000002
*//取第二位：9

:00543AD1 E88A07ECFF call 00404260
:00543AD6 687C7D5600 push 00567D7C
:00543ADB 8D55C8 lea edx, dword ptr [ebp-38]
:00543ADE 8B45FC mov eax, dword ptr [ebp-04]
:00543AE1 8B80EC020000 mov eax, dword ptr [eax+000002EC]
:00543AE7 E8B42DEFFF call 004368A0
:00543AEC 8B45C8 mov eax, dword ptr [ebp-38]
*//取输入的序列号：1974923

* Possible Reference to String Resource ID=00001: "Today"
|
:00543AEF B901000000 mov ecx, 00000001
*//第一位：1

:00543AF4 BA05000000 mov edx, 00000005
*//取第五位：9

:00543AF9 E86207ECFF call 00404260
:00543AFE FF35687D5600 push dword ptr [00567D68]
:00543B04 FF356C7D5600 push dword ptr [00567D6C]
:00543B0A FF35807D5600 push dword ptr [00567D80]
:00543B10 FF35707D5600 push dword ptr [00567D70]
:00543B16 FF35747D5600 push dword ptr [00567D74]
:00543B1C FF35807D5600 push dword ptr [00567D80]
:00543B22 FF35787D5600 push dword ptr [00567D78]
:00543B28 FF357C7D5600 push dword ptr [00567D7C]
:00543B2E B8647D5600 mov eax, 00567D64
:00543B33 BA08000000 mov edx, 00000008
:00543B38 E8DB05ECFF call 00404118
:00543B3D 33C0 xor eax, eax
:00543B3F 5A pop edx
:00543B40 59 pop ecx
:00543B41 59 pop ecx
:00543B42 648910 mov dword ptr fs:[eax], edx
:00543B45 68663E5400 push 00543E66

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00543E61(U)
|
:00543B4A A1647D5600 mov eax, dword ptr [00567D64]
*//EAX=41/27/99

:00543B4F 8B15607D5600 mov edx, dword ptr [00567D60]
*//取主板BIOS数据日期：11/06/00 ==> EDX

:00543B55 E80E06ECFF call 00404168
:00543B5A 0F848F000000 je 00543BEF
*//EAX=EDX才跳。

:00543B60 33C0 xor eax, eax
:00543B62 55 push ebp
:00543B63 68E83B5400 push 00543BE8
:00543B68 64FF30 push dword ptr fs:[eax]
:00543B6B 648920 mov dword ptr fs:[eax], esp
:00543B6E 6A30 push 00000030

* Possible StringData Ref from Code Obj ->"注册软件"
|
:00543B70 68C43E5400 push 00543EC4

* Possible StringData Ref from Code Obj ->"序列号、用户名或注册码错误，请重新输入！"
|
:00543B75 68D03E5400 push 00543ED0
:00543B7A 8B45FC mov eax, dword ptr [ebp-04]
:00543B7D E8C28FEFFF call 0043CB44
:00543B82 50 push eax

.........
.........
.........

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00543B5A(C)
|
:00543BEF 8B4DFC mov ecx, dword ptr [ebp-04]
:00543BF2 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"?A"
|
:00543BF4 A174EF4800 mov eax, dword ptr [0048EF74]
:00543BF9 E81A74EDFF call 0041B018
:00543BFE A3547D5600 mov dword ptr [00567D54], eax
:00543C03 BA0D3E0000 mov edx, 00003E0D
*//EDX=3E0D（下面要用到）

:00543C08 A1547D5600 mov eax, dword ptr [00567D54]
:00543C0D E846B5F4FF call 0048F158
:00543C12 8D55C4 lea edx, dword ptr [ebp-3C]
:00543C15 8B45FC mov eax, dword ptr [ebp-04]
:00543C18 8B80E4020000 mov eax, dword ptr [eax+000002E4]
:00543C1E E87D2CEFFF call 004368A0
:00543C23 8B55C4 mov edx, dword ptr [ebp-3C]
*//取用户名：华仔[CCG]

:00543C26 A1547D5600 mov eax, dword ptr [00567D54]
:00543C2B E8B0B4F4FF call 0048F0E0
*//计算注册码的CALL，代码在下面。（标记为①）

:00543C30 8D55C0 lea edx, dword ptr [ebp-40]
:00543C33 8B45FC mov eax, dword ptr [ebp-04]
:00543C36 8B80E8020000 mov eax, dword ptr [eax+000002E8]
:00543C3C E85F2CEFFF call 004368A0
:00543C41 8B45C0 mov eax, dword ptr [ebp-40]
*//取注册码：1974923

:00543C44 8B15547D5600 mov edx, dword ptr [00567D54]
:00543C4A 8B522C mov edx, dword ptr [edx+2C]
*//程序说注册码应该是这个：267507-365370885-11145564

:00543C4D E81605ECFF call 00404168
:00543C52 7549 jne 00543C9D
*//不等就跳到错误窗口

.........
.........
.........

①计算注册码的CALL：
* Referenced by a CALL at Addresses:
|:00543C2B , :0054A5F1
|
:0048F0E0 55 push ebp
:0048F0E1 8BEC mov ebp, esp
:0048F0E3 83C4F8 add esp, FFFFFFF8
:0048F0E6 53 push ebx
:0048F0E7 33C9 xor ecx, ecx
:0048F0E9 894DF8 mov dword ptr [ebp-08], ecx
:0048F0EC 8955FC mov dword ptr [ebp-04], edx
:0048F0EF 8BD8 mov ebx, eax
:0048F0F1 8B45FC mov eax, dword ptr [ebp-04]
:0048F0F4 E81351F7FF call 0040420C
:0048F0F9 33C0 xor eax, eax
:0048F0FB 55 push ebp
:0048F0FC 6849F14800 push 0048F149
:0048F101 64FF30 push dword ptr fs:[eax]
:0048F104 648920 mov dword ptr fs:[eax], esp
:0048F107 8D4324 lea eax, dword ptr [ebx+24]
:0048F10A 8B55FC mov edx, dword ptr [ebp-04]
:0048F10D E81A4DF7FF call 00403E2C
:0048F112 8D45F8 lea eax, dword ptr [ebp-08]
:0048F115 50 push eax
:0048F116 8B4B24 mov ecx, dword ptr [ebx+24]
*//取输入的用户名：华仔[CCG]

:0048F119 8B5328 mov edx, dword ptr [ebx+28]
:0048F11C 8BC3 mov eax, ebx
:0048F11E E891000000 call 0048F1B4
*//计算注册码的CALL，代码在下面。（标记为②）

:0048F123 8B55F8 mov edx, dword ptr [ebp-08]
*//将计算后正确的注册码送给EDX

:0048F126 8D432C lea eax, dword ptr [ebx+2C]
:0048F129 E8FE4CF7FF call 00403E2C
:0048F12E 33C0 xor eax, eax
:0048F130 5A pop edx
:0048F131 59 pop ecx
:0048F132 59 pop ecx
:0048F133 648910 mov dword ptr fs:[eax], edx
:0048F136 6850F14800 push 0048F150

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048F14E(U)
|
:0048F13B 8D45F8 lea eax, dword ptr [ebp-08]
:0048F13E BA02000000 mov edx, 00000002
:0048F143 E8B44CF7FF call 00403DFC
:0048F148 C3 ret

标 题:有声有色4.0注册算法 二 (7千字)
发信人:华仔[CCG]
时 间:2001-5-1 0:56:21
详细信息:

②计算注册码的CALL：
* Referenced by a CALL at Addresses:
|:0048F11E , :0048F17F , :0048F32F
|
:0048F1B4 55 push ebp
:0048F1B5 8BEC mov ebp, esp
:0048F1B7 6A00 push 00000000
:0048F1B9 6A00 push 00000000
:0048F1BB 6A00 push 00000000
:0048F1BD 6A00 push 00000000
:0048F1BF 6A00 push 00000000
:0048F1C1 53 push ebx
:0048F1C2 56 push esi
:0048F1C3 894DFC mov dword ptr [ebp-04], ecx
:0048F1C6 8BF2 mov esi, edx
*//ESI=EDX=3E0D（下面要用到）

:0048F1C8 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名：华仔[CCG]

:0048F1CB E83C50F7FF call 0040420C
:0048F1D0 33C0 xor eax, eax
:0048F1D2 55 push ebp
:0048F1D3 68B2F24800 push 0048F2B2
:0048F1D8 64FF30 push dword ptr fs:[eax]
:0048F1DB 648920 mov dword ptr fs:[eax], esp
:0048F1DE 8D45F8 lea eax, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"Error"
|
:0048F1E1 BACCF24800 mov edx, 0048F2CC
:0048F1E6 E8854CF7FF call 00403E70
:0048F1EB 85F6 test esi, esi
:0048F1ED 0F8499000000 je 0048F28C
:0048F1F3 837DFC00 cmp dword ptr [ebp-04], 00000000
:0048F1F7 0F848F000000 je 0048F28C
*//如果没有输入用户名，那就免谈。

:0048F1FD 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名：华仔[CCG]

:0048F200 E8534EF7FF call 00404058
*//取用户名位数并送给EAX：EAX=9

:0048F205 8BD8 mov ebx, eax
*//EBX=EAX=9

:0048F207 0FAFDE imul ebx, esi
*//带符号数乘法：EBX=EBX*ESI=9*3E0D=22E75（ESI的值前面有说明）

:0048F20A 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名：华仔[CCG]

:0048F20D 0FB600 movzx eax, byte ptr [eax]
*//取用户名第一位ASCII码并送给EAX：EAX=BB

:0048F210 69C09A020000 imul eax, 0000029A
*//带符号数乘法：EAX=EAX*29A=BB*29A=1E67E

:0048F216 03D8 add ebx, eax
*//EBX=EBX+EAX=22E75+1E67E=414F3
*//414F3转换为十进制数：267507

:0048F218 8D55F4 lea edx, dword ptr [ebp-0C]
:0048F21B 8BC3 mov eax, ebx
*//EAX=EBX=414F3

:0048F21D E8C6A0F7FF call 004092E8
:0048F222 8B55F4 mov edx, dword ptr [ebp-0C]
:0048F225 8D45F8 lea eax, dword ptr [ebp-08]
:0048F228 B9DCF24800 mov ecx, 0048F2DC
*//ECX=2D（2D是“-”的ASCII码）

:0048F22D E8724EF7FF call 004040A4
:0048F232 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名：华仔[CCG]

:0048F235 0FB600 movzx eax, byte ptr [eax]
*//取用户名第一位ASCII码并送给EAX：EAX=BB

:0048F238 F7EE imul esi
*//带符号数乘法：EAX=EAX*ESI=BB*3E0D=2D537F

:0048F23A 6BD87B imul ebx, eax, 0000007B
*//带符号数乘法：EBX=EAX*7B=2D537F*7B=15C71E05
*//15C71E05转换为十进制数：365370885

:0048F23D FF75F8 push [ebp-08]
:0048F240 8D55F0 lea edx, dword ptr [ebp-10]
:0048F243 8BC3 mov eax, ebx
:0048F245 E89EA0F7FF call 004092E8
:0048F24A FF75F0 push [ebp-10]
:0048F24D 68DCF24800 push 0048F2DC
*//2D是“-”的ASCII码

:0048F252 8D45F8 lea eax, dword ptr [ebp-08]
:0048F255 BA03000000 mov edx, 00000003
:0048F25A E8B94EF7FF call 00404118
:0048F25F 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名：华仔[CCG]

:0048F262 E8F14DF7FF call 00404058
*//取用户名位数并送给EAX：EAX=9

:0048F267 8B55FC mov edx, dword ptr [ebp-04]
*//取输入的用户名：华仔[CCG]

:0048F26A 0FB612 movzx edx, byte ptr [edx]
*//取用户名第一位ASCII码并送给EDX：EDX=BB

:0048F26D F7EA imul edx
*//带符号数乘法：EAX=EAX*EDX=9*BB=693

:0048F26F 69D8D5190000 imul ebx, eax, 000019D5
*//带符号数乘法：EBX=EAX*19D5=693*19D5=A9D34F

:0048F275 03DE add ebx, esi
*//EBX=EBX+ESI=A9D34F+3E0D=AA115C
*//AA115C转换为十进制数：11145564

:0048F277 8D55EC lea edx, dword ptr [ebp-14]
:0048F27A 8BC3 mov eax, ebx
:0048F27C E867A0F7FF call 004092E8
:0048F281 8B55EC mov edx, dword ptr [ebp-14]
:0048F284 8D45F8 lea eax, dword ptr [ebp-08]
:0048F287 E8D44DF7FF call 00404060

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048F1ED(C), :0048F1F7(C)
|
:0048F28C 8B4508 mov eax, dword ptr [ebp+08]
:0048F28F 8B55F8 mov edx, dword ptr [ebp-08]
*//将完整的注册码：267507-365370885-11145564 送给EDX

:0048F292 E8954BF7FF call 00403E2C
:0048F297 33C0 xor eax, eax
:0048F299 5A pop edx
:0048F29A 59 pop ecx
:0048F29B 59 pop ecx
:0048F29C 648910 mov dword ptr fs:[eax], edx
:0048F29F 68B9F24800 push 0048F2B9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048F2B7(U)
|
:0048F2A4 8D45EC lea eax, dword ptr [ebp-14]
:0048F2A7 BA05000000 mov edx, 00000005
:0048F2AC E84B4BF7FF call 00403DFC
:0048F2B1 C3 ret

二、注册算法：

1、序列号：（假设为“1974923”）
取你输入的序列号，只取6位，超过6位其后的位数忽略不计，如：
1974923 ==> 197492
为便于大家看清楚，我先将这个序列号依次赋值给SN1...SN6：
SN1=1
SN2=9
SN3=7
SN4=4
SN5=9
SN6=2
依次变换取位后：SN4 SN1 SN6 SN3 SN2 SN5
4 1 2 7 9 9
变换取位后所得数：412799
每两位为一组中间用/隔开：41/27/99
再和你的主板BIOS数据日期比较，不等于就错了。
如果你不知道你的主板BIOS数据日期的话可以查看注册表键：
WIN9X系统：
[HKEY_LOCAL_MACHINE\Enum\Root\*PNP0C01\0000]
"BIOSDate"="11/06/00"（我的是2000年11月06日）
WIN2000系统：
[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System]
"SystemBiosDate"="11/06/00"

这个数据只在安装操作系统时生成，以后如果升级BIOS这个日期是不会变的，
所以如果你不介意的话也可以用我的序列号、用户名和注册码:)!

由以上反推序列号：
主板BIOS数据日期 ==> 11/06/00 ==> 110600 ==> 106100
当BIOS数据日期为2011年11月11日时，你就偷着笑了，6个1就可以搞定序列号。

2、注册码：（假设为“华仔[CCG]”）
注册码形式为：REG1-REG2-REG3
计算REG1：
REG1=用户名位数*3E0D+用户名第一位ASCII码*29A，（注意：一个汉字占两位）如：
REG1=9*3E0D+BB*29A=414F3 ==> 转换为十进制数为：267507
计算REG2：
REG2=用户名第一位ASCII码*3E0D*7B，如：
REG2=BB*3E0D*7B=15C71E05 ==> 转换为十进制数为：365370885
计算REG3：
REG3=用户名位数*用户名第一位ASCII码*19D5+3E0D，如：
REG3=9*BB*19D5+3E0D=AA115C ==> 转换为十进制数为：11145564

三、结果：

1、完整的注册信息：

序列号：106100
用户名：华仔[CCG]
注册码：267507-365370885-11145564

2、注册成功后程序将注册信息写入MusRea.ini：
[Register]
MySerial=106100
Username=华仔[CCG]
Serial=267507-365370885-11145564

3、程序记录使用次数在windows\system\mfc42ens.dll中，并且注册表中也有暗桩，
只要发现mfc42ens.dll与注册表中的记录不一致，你就到期了。还有，如果注册表中
有使用记录，而没有找到mfc42ens.dll这个文件，那么你就不能再成功启动软件了。


有声有色7.0

 标 题:转载文章!有声有色7.0正式版破解实录（取注册码） (2千字)
发信人:大老
时 间:2001-7-20 1:21:43
详细信息:
                有声有色7.0正式版破解实录（取注册码）
                ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第一部分：取序列号；　　　第二部分：取注册码
=======================================

  由监视注册表可知，这个软件读取本机的BiOS初始时间，经过转换作序列号！！
如:123456 转换为21/43/65 等，故如把本机的boos时间改为0000000或111111等，
即任意可作序列号！具体在：以下：
[HKEY_LOCAL_MACHINE\Enum\Root\*PNP0C01\0000]
"BIOSVersion"="Award Modular BIOS v6.00PG"
"BIOSDate"="10/13/99"
            ********
  记住这个格式：
-----------------------------------------------------------
一、用TRW导入ConteZone.exe，设置断点：bpx hmemcopy
输入序列号：12345678　用户名：hongjian 注册码：7878787878
然后按确定，立即被栏截，按bd * 临时中断，再按F12　共6次（7次就出错）。
然后再按F10 来到以下地方：

=======================
016F:00FFA5E0 16 00 00 00 01 00 00 00-06 00 00 00 31 32 33 34 ............1234
016F:00FFA5F0 35 36 00 67 1A 00 00 00-01 00 00 00 08 00 00 00 56.g............
016F:00FFA600 34 31 2F 36 33 2F 32 35-00 4F 46 54 74 94 57 00 41/63/25.OFTt擶.
.................
0167:0055315E MOV EAX,[00585E34]
0167:00553163 MOV EDX,[00585E30]
0167:00553169 CALL 00404168 ////d eax 见右边由假序列号123456

//// d eax 见右边由假序列号123456　转换成的日期格式：　41/63/25
//// d edx 见本机的BIOS真正的日期：10/13/99
//// ==========================================================
////　 如何把真正的日期转换成真正的序列号呢？？（关键）
////　详细分析：123456　－> 41/63/25
//// 4－第四位，1－第一位，6－第六位，3－第三位，2－第二位，5－第5位
////　由此：我们把：10/13/99　转换成：091391
////　方法2：
////　我们干脆把本机器的BIOS时间改成00/00/00 或11/11/11 等，那么任意：
////　000000或111111　或222222　都可成为序列号？？？？！！！
////==================================================================

0167:0055316E JZ NEAR 00553203 //////这里一定要跳，否则玩完！
//// r fl z 临时改动！让它跳！
0167:00553174 XOR EAX,EAX
.........
继续....

016F:00FFA9B4 34373531 2D323137 3838312D 35353737 1574712--1887755
016F:00FFA9C4 2D343439 30393635 00373931 0000001E 944-5690197.....
016F:00FFA9D4 00000001 0000000C 38373837 38373837 ........78787878
-----------------
0167:0055323A MOV EAX,[00585E24]
0167:0055323F CALL 0048DB80 ///调入用户名
0167:00553244 LEA EDX,[EBP-40]
0167:00553247 MOV EAX,[EBP-04]
0167:0055324A MOV EAX,[EAX+02E8]
0167:00553250 CALL 00436868
0167:00553255 MOV EAX,[EBP-40]
0167:00553258 MOV EDX,[00585E24]
0167:0055325E MOV EDX,[EDX+2C]
0167:00553261 CALL 00404168 ////调入注册码：
///d eax =假的注册码　　d edx =真的注册码
0167:00553266 JNZ 005532B1
0167:00553268 LEA EDX,[EBP-44]
0167:0055326B MOV EAX,[EBP-04]
0167:0055326E MOV EAX,[EAX+02EC]
*****************************************************************

《绝密档案》
http://hongjian.126.com


至嘉DB Tools V2.1

 标 题:破解至嘉DB Tools V2.1 (5千字)
发信人:Z-H
时 间:2000-9-11 22:24:11
详细信息:
破解至嘉DB Tools V2.1
关键是DBTools.dll,以下是此文件的几个重要的反编译段落:

起动时判断注册是否成功：
:10001188 90 nop
:10001189 90 nop
:1000118A 90 nop
:1000118B 90 nop
:1000118C 90 nop
:1000118D 90 nop
:1000118E 90 nop
:1000118F 90 nop

Exported fn(): FirstStartRegistryCode - Ord:0004h
:10001190 83EC24 sub esp, 00000024
:10001193 8D4C2400 lea ecx, dword ptr [esp]
:10001197 E8B4050000 call 10001750
:1000119C 8D4C2400 lea ecx, dword ptr [esp]
:100011A0 E82B070000 call 100018D0
:100011A5 83F801 cmp eax, 00000001
:100011A8 7520 jne 100011CA -------->>>>>eb20
:100011AA 56 push esi
:100011AB 68F8C90110 push 1001C9F8
:100011B0 E8722D0000 call 10003F27
:100011B5 83C404 add esp, 00000004
:100011B8 8D4C2404 lea ecx, dword ptr [esp+04]
:100011BC 8BF0 mov esi, eax
:100011BE E8BD050000 call 10001780
:100011C3 8BC6 mov eax, esi
:100011C5 5E pop esi
:100011C6 83C424 add esp, 00000024
:100011C9 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100011A8(C)
|
:100011CA 83F8FF cmp eax, FFFFFFFF
:100011CD 7510 jne 100011DF
:100011CF 8D4C2400 lea ecx, dword ptr [esp]
:100011D3 E8A8050000 call 10001780
:100011D8 83C8FF or eax, FFFFFFFF
:100011DB 83C424 add esp, 00000024
:100011DE C3 ret

注册：

* Possible Reference to Dialog: DialogID_2710, CONTROL_ID:2711, ""
|
:1000149B 6811270000 push 00002711
:100014A0 8BCE mov ecx, esi
:100014A2 E8FA010100 call 100116A1
:100014A7 8BC8 mov ecx, eax
:100014A9 E884020100 call 10011732
:100014AE 8DBC2488000000 lea edi, dword ptr [esp+00000088]
:100014B5 83C9FF or ecx, FFFFFFFF
:100014B8 33C0 xor eax, eax
:100014BA F2 repnz
:100014BB AE scasb
:100014BC F7D1 not ecx
:100014BE 49 dec ecx
:100014BF 83F906 cmp ecx, 00000006 ----->>判断姓名是否为6个以上字符
:100014C2 7D23 jge 100014E7 ---大于或等于就跳转

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100014C2(C)
|
:100014E7 8D7C2438 lea edi, dword ptr [esp+38]
:100014EB 83C9FF or ecx, FFFFFFFF
:100014EE 33C0 xor eax, eax
:100014F0 F2 repnz
:100014F1 AE scasb
:100014F2 F7D1 not ecx
:100014F4 49 dec ecx
:100014F5 83F910 cmp ecx, 00000010 ------->>>>判断注册码是否为16个字符
:100014F8 7423 je 1000151D ----->>>等于就跳转
:100014FA 50 push eax
:100014FB 50 push eax
:100014FC 68F8B00110 push 1001B0F8
:10001501 E8CD250100 call 10013AD3
:10001506 5F pop edi
:10001507 5E pop esi
:10001508 8B8C2480020000 mov ecx, dword ptr [esp+00000280]
:1000150F 64890D00000000 mov dword ptr fs:[00000000], ecx
:10001516 81C48C020000 add esp, 0000028C
:1000151C C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100014F8(C)
|
:1000151D 8D4C2414 lea ecx, dword ptr [esp+14]
:10001521 E82A020000 call 10001750
:10001526 8D842488000000 lea eax, dword ptr [esp+00000088]
:1000152D 8D4C2418 lea ecx, dword ptr [esp+18]
:10001531 50 push eax

* Possible StringData Ref from Data Obj ->"%s"
|
:10001532 68A0B00110 push 1001B0A0
:10001537 51 push ecx
:10001538 C784249C02000000000000 mov dword ptr [esp+0000029C], 00000000
:10001543 E8CE280000 call 10003E16
:10001548 8D542444 lea edx, dword ptr [esp+44]
:1000154C 8D442432 lea eax, dword ptr [esp+32]
:10001550 52 push edx

* Possible StringData Ref from Data Obj ->"%s"
|
:10001551 68A0B00110 push 1001B0A0
:10001556 50 push eax
:10001557 E8BA280000 call 10003E16
:1000155C 83C418 add esp, 00000018
:1000155F 8D4C2414 lea ecx, dword ptr [esp+14]
:10001563 E808050000 call 10001A70 ----->>>效验注册是否正确
:10001568 83F8FF cmp eax, FFFFFFFF
:1000156B 7539 jne 100015A6 ----->>>正确才跳
:1000156D 6A00 push 00000000
:1000156F 6A00 push 00000000
:10001571 68E8B00110 push 1001B0E8
:10001576 E858250100 call 10013AD3
:1000157B 8D4C2414 lea ecx, dword ptr [esp+14]
:1000157F C7842490020000FFFFFFFF mov dword ptr [esp+00000290], FFFFFFFF
:1000158A E8F1010000 call 10001780
:1000158F 5F pop edi
:10001590 5E pop esi
:10001591 8B8C2480020000 mov ecx, dword ptr [esp+00000280]
:10001598 64890D00000000 mov dword ptr fs:[00000000], ecx
:1000159F 81C48C020000 add esp, 0000028C
:100015A5 C3 ret


智能五笔 v5.0

标 题:智能五笔 v5.0版的破解文章， (4千字)
发信人:jance
时 间:2001-4-20 17:08:54
详细信息:
智能五笔注册器(适用于5.0及以前版本)

    这是我做的最后一个关于智能五笔的破解！之后我不会接受对智能五笔的破解
请求，请大家能谅解！

你可以通过以后两种方法注册智能五笔：

一.自动注册法
1.拷贝本程序到智能五笔的安装目录下
2.运行本程序，按“注册码”按钮这时本程序将
自动产生注册文件，同时把注册码显示在编辑框里。

二.手动输入信息码
1.把本程序拷贝到一个空的目录下，运行！
2.打开记事本，把输入法切换到智能五笔5.0下，右击智能五笔输入区
在弹出的菜单里选择“用户注册”，然后再选择“注册信息表”！
3.你可以在这个文件的底部看到一些注册信息内容，如我的电脑上是：

YTY567RQPN4DUSZUV19; NIJKL6TUVQRSFE234SA
CABC1H1J5IJK45682IR; 79RTYSEF6HIY7WXYB12
JUVCPCPN2OQRSCUPWEK; E14HOM89T73G5WMMOJK
NOPQIKTUVWXYZ1NK5I0

4.以上是原始的注册信息内容，以下我把需要的内容打'*'，你要把这些内容复制
到注册器的信息码框里

YTY567RQPN4DUSZUV19; NIJKL6TUVQRSFE234SA
CABC1H1J5IJK45682IR; 79RTYSEF6HIY7WXYB12
JUVCPCPN2OQRSCUPWEK; E14HOM89T73G5WMMOJK
** **
NOPQIKTUVWXYZ1NK5I0
**
如我的就是PCOMIK,总共6个字符，然后按注册码按钮，这时本程序将自动产生注册
文件chenyhzc.chu，拷贝到智能五笔的安装目录下，覆盖原来的就可以！

备注：一般你总是用第一种方法，第二种方法只有当第一种方法注册不成功时才用！
一般在4.5和5.0上，第一种方法总是可以的！其它版本我没测试过！本注册器可以
用在智能五笔5.0及以前的版本，对于以后的版本我想陈虎先生一定会在程序中增加
检查注册码的位数，很可能会使原来的注册码失效！

另：
最近在开发一个文本编辑器，在功能及性能上除了要向流行的文本编辑器看齐
外，我还想在源程序编辑方面有所突破！等过段时间推出Beta版，如果大家有什么
意思，请给我来信，同时如果你觉得这个程序还可以的话，请帮我推广一下!

jance
2000.12.23
http://jance.on.net.cn
    http://jance.363.net
jancelin@263.net

附：

;******************智能五笔的注册码验证片断******************************
;
;注册码为8个字节，第1~4字节到目前的5.0版还没校验，所以你可以取些合适的字符
;如：0~9大写的A~Z等等。相信陈虎先生在我公布注册器后会检查第1~4字节。接下来
;的3个字节由注册提取的6个信息码而得。最后一个字节的值由前7个字节的经过一种
;运算得到！
;jance 2000-12-23
;

0167:10005473 MOV ECX,[1001F7F4]
0167:10005479 MOV EDX,[1001E4F0]
0167:1000547F CMP ECX,EDX
0167:10005481 JZ 1000548C
0167:10005483 MOV DL,[EAX+0B]
0167:10005486 MOV [1001F932],DL
0167:1000548C PUSH EAX
0167:1000548D CALL 10004DA0 ;验证第8字节
0167:10005492 MOV BL,AL ;AL为0，则为正确，并保存结果到BL，以下的验证过程同此
0167:10005494 MOV EAX,[1001FA14]
0167:10005499 ADD ESP,BYTE +04
0167:1000549C CMP EAX,C8 ;测试输入汉字的个数，如果大于C8即200个，则验证注册码
0167:100054A1 JNG 10005518
0167:100054A3 MOV EAX,[1001E43C]
0167:100054A8 MOV ECX,[1001E48C]
0167:100054AE ADD EAX,ECX
0167:100054B0 PUSH EAX
0167:100054B1 PUSH EBP
0167:100054B2 CALL 10004F40
0167:100054B7 ADD ESP,BYTE +04
0167:100054BA PUSH EAX
0167:100054BB PUSH BYTE +05
0167:100054BD CALL 10004EA0 ;验证第5字节
0167:100054C2 MOV EDX,[1001E48C]
0167:100054C8 ADD BL,AL ;保存结果
0167:100054CA MOV EAX,[1001E43C]
0167:100054CF ADD ESP,BYTE +0C
0167:100054D2 ADD EAX,EDX
0167:100054D4 PUSH EAX
0167:100054D5 PUSH BYTE +01
0167:100054D7 CALL 10004F40
0167:100054DC ADD ESP,BYTE +04
0167:100054DF PUSH EAX
0167:100054E0 PUSH BYTE +06
0167:100054E2 CALL 10004EA0 ;验证第6字节
0167:100054E7 MOV ECX,[1001E48C]
0167:100054ED MOV EDX,[1001E43C]
0167:100054F3 ADD ESP,BYTE +0C
0167:100054F6 ADD EDX,ECX
0167:100054F8 ADD BL,AL ;保存结果
0167:100054FA PUSH EDX
0167:100054FB PUSH BYTE +02
0167:100054FD CALL 10004F40
0167:10005502 ADD ESP,BYTE +04
0167:10005505 PUSH EAX
0167:10005506 PUSH BYTE +07
0167:10005508 CALL 10004EA0 ;验证第7字节
0167:1000550D ADD ESP,BYTE +0C
0167:10005510 ADD BL,AL ;保存结果
0167:10005512 MOV [ESP+13],BL ;保存结果到[ESP+13],程序在以后会检查这个值，
;如果为0，则不会显示注册提示框


智能五笔 v5.04

 标 题:转帖：智能五笔5.04注册方法 (1千字)
发信人:crackerabc
时 间:2001-6-24 14:52:36
详细信息:
智能五笔好用，这点相信大家没有异议。不过，智能五笔真是太~~~~~~贵了，而且它的注册条件也十分苛刻。这不就是逼着大家到处找破解吗？？下面的方法是
小弟无意中发现的，供大家参考。但不能保证一定行，不过小弟的智能五笔运行到现在也还没有出现问题。
1.先把智能五笔5.03的注册器解压到一个新文件夹(只要是空的都可以)。假设这个文件夹的名字为‘A’。打开智能五笔文件夹(chenhu2)，找到那个带有注册信息的文本文件(CHENHU4)并把它复制到A文件夹里。

2.打开注册器，点击注册码，这时就会出现你的注册码并出现一个名为chenyhzc.chu的文件。用记事本打开这个文件看看，你会发现里面的号码和注册器里显现的注
册码是一样的。但我发现，这个文件对智能五笔5.04的注册没有效果。原因就是这个文件里的号码，号码是正确的，但实际上在注册进去后是会发生变化的。比如说，在注册器中我的注册码显示为‘022197GJ’，但注册进去后却变成了‘.2297JG’。再用记事本打开chenhu2文件夹里的chenyhzc.chu文件看看，发现里的号码也是‘.2297JG’。比较一下就不难发现原注册码中‘0’变成了‘.’，‘1’消失了。这就说明，在A文件夹的那个chenyhzc.chu文件不是真正的注册文件，对解决智能五笔注册是没有作用的。

3.现在要做的不是把A文件夹里的chenyhzc.chu这个文件复制到chenhu2文件夹中，而是打开智能五笔的用户注册，在注册框中输入你在注册器里看到的那个注册码，然后确定。再次打开智能五笔的用户注册框看看，你就会发现你刚才输入进去的注册码发生了改变。现在，智能五笔5.04的注册就大功告成了。

以上的方法是小弟无意中发现的，而小弟用的是5.04版，不知道该方法对5.03有没有用，也不知道适不适合大家，只是供大家参考参考。还有，以上提及的注册码改变，在一般情况下，只要你注册器里显现的注册码是正确的话就都会发生改变。

joe


中华压缩 6.01

 标 题:《中华压缩 6.01》注册码破解及注册机 (14千字)
发信人:ratarice
时 间:2001-8-19 22:48:44
详细信息:
《中华压缩 6.01》注册码破解及注册机

小弟最近在学做注册机，所以看到论坛上有位大哥贴出它的注册码，并且说它very easy!所以小弟就想试试看了！如果这位大哥觉得我做的有不妥的地方，请呼我（QQ：15319522），小弟一定赔罪！

作者：RATARICE

工具：FI、BW2000、TRW2000 1.23、W32DSM89、TC 2.0

过程：
一、 用FI检查软件，发现是用ASPack v2.001加的壳。再用prodump和caspr脱壳无果好，想起大哥们的教诲， 于是用BW2000找到它的入口是：4FD8A4。好了，启动TRW，下BPX 4FD8A4，PDUMP。OK！
二、 经过本人的一通折腾才找到注册的代码，如下：

:004F3D27 90 nop
:004F3D28 55 push ebp
:004F3D29 8BEC mov ebp, esp
:004F3D2B 33C9 xor ecx, ecx
:004F3D2D 51 push ecx
:004F3D2E 51 push ecx
:004F3D2F 51 push ecx
:004F3D30 51 push ecx
:004F3D31 53 push ebx
:004F3D32 8BD8 mov ebx, eax
:004F3D34 33C0 xor eax, eax
:004F3D36 55 push ebp
:004F3D37 68203E4F00 push 004F3E20
:004F3D3C 64FF30 push dword ptr fs:[eax]
:004F3D3F 648920 mov dword ptr fs:[eax], esp
:004F3D42 8D55F8 lea edx, dword ptr [ebp-08]
:004F3D45 8B83E4020000 mov eax, dword ptr [ebx+000002E4]
:004F3D4B E840F2F3FF call 00432F90
:004F3D50 8B45F8 mov eax, dword ptr [ebp-08]
:004F3D53 50 push eax
:004F3D54 8D55F0 lea edx, dword ptr [ebp-10]
:004F3D57 8B83E0020000 mov eax, dword ptr [ebx+000002E0]
:004F3D5D E82EF2F3FF call 00432F90
:004F3D62 8B55F0 mov edx, dword ptr [ebp-10]
:004F3D65 8D4DF4 lea ecx, dword ptr [ebp-0C]
:004F3D68 8BC3 mov eax, ebx
:004F3D6A E8C9010000 call 004F3F38 ------------------->计算注册码，要追进去！
:004F3D6F 8B55F4 mov edx, dword ptr [ebp-0C]
:004F3D72 58 pop eax
:004F3D73 E8A403F1FF call 0040411C
:004F3D78 7576 jne 004F3DF0 -------------------->很明显，跳就完蛋了！
:004F3D7A B201 mov dl, 01 将这里nop掉，就可爆破！
:004F3D7C A174654700 mov eax, dword ptr [00476574]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3D12(C)
|
:004F3D81 E8EE28F8FF call 00476674
:004F3D86 8945FC mov dword ptr [ebp-04], eax
:004F3D89 33C0 xor eax, eax
:004F3D8B 55 push ebp
:004F3D8C 68E93D4F00 push 004F3DE9
:004F3D91 64FF30 push dword ptr fs:[eax]
:004F3D94 648920 mov dword ptr fs:[eax], esp
:004F3D97 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\XDZHAN\ChinaZip"
|
:004F3D99 BA343E4F00 mov edx, 004F3E34
:004F3D9E 8B45FC mov eax, dword ptr [ebp-04]
:004F3DA1 E8B22AF8FF call 00476858

* Possible StringData Ref from Code Obj ->"Real Programmers Use Pascal!"
|
:004F3DA6 B9583E4F00 mov ecx, 004F3E58

* Possible StringData Ref from Code Obj ->"Key"
|
:004F3DAB BA803E4F00 mov edx, 004F3E80
:004F3DB0 8B45FC mov eax, dword ptr [ebp-04]
:004F3DB3 E8E42EF8FF call 00476C9C

* Possible StringData Ref from Code Obj ->"软件注册成功,谢谢您的支持!"
|
:004F3DB8 B88C3E4F00 mov eax, 004F3E8C
:004F3DBD E8E243F6FF call 004581A4
:004F3DC2 A16C005000 mov eax, dword ptr [0050006C]
:004F3DC7 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"中华压缩(ChinaZip)—注册版"
|
:004F3DC9 BAB03E4F00 mov edx, 004F3EB0
:004F3DCE E8EDF1F3FF call 00432FC0
:004F3DD3 33C0 xor eax, eax
:004F3DD5 5A pop edx
:004F3DD6 59 pop ecx
:004F3DD7 59 pop ecx
:004F3DD8 648910 mov dword ptr fs:[eax], edx
:004F3DDB 68FA3D4F00 push 004F3DFA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3DEE(U)
|
:004F3DE0 8B45FC mov eax, dword ptr [ebp-04]
:004F3DE3 E8DCF2F0FF call 004030C4
:004F3DE8 C3 ret

:004F3DE9 E936FAF0FF jmp 00403824
:004F3DEE EBF0 jmp 004F3DE0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3D78(C)
|

* Possible StringData Ref from Code Obj ->"注册码不正确,无法注册!"
|
:004F3DF0 B8D43E4F00 mov eax, 004F3ED4
:004F3DF5 E8AA43F6FF call 004581A4
:004F3DFA 33C0 xor eax, eax
:004F3DFC 5A pop edx
:004F3DFD 59 pop ecx
:004F3DFE 59 pop ecx
:004F3DFF 648910 mov dword ptr fs:[eax], edx
:004F3E02 68273E4F00 push 004F3E27

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3E25(U)
|
:004F3E07 8D45F0 lea eax, dword ptr [ebp-10]
:004F3E0A E87DFFF0FF call 00403D8C
:004F3E0F 8D45F4 lea eax, dword ptr [ebp-0C]
:004F3E12 E875FFF0FF call 00403D8C
:004F3E17 8D45F8 lea eax, dword ptr [ebp-08]
:004F3E1A E86DFFF0FF call 00403D8C
:004F3E1F C3 ret

:004F3E20 E9FFF9F0FF jmp 00403824
:004F3E25 EBE0 jmp 004F3E07
:004F3E27 5B pop ebx
:004F3E28 8BE5 mov esp, ebp
:004F3E2A 5D pop ebp
:004F3E2B C3 ret

************************追入CALL 004F3F38*************************

* Referenced by a CALL at Address:
|:004F3D6A
|
:004F3F38 55 push ebp
:004F3F39 8BEC mov ebp, esp
:004F3F3B 6A00 push 00000000
:004F3F3D 6A00 push 00000000
:004F3F3F 6A00 push 00000000
:004F3F41 6A00 push 00000000
:004F3F43 6A00 push 00000000
:004F3F45 6A00 push 00000000
:004F3F47 6A00 push 00000000
:004F3F49 53 push ebx
:004F3F4A 56 push esi
:004F3F4B 57 push edi
:004F3F4C 894DF8 mov dword ptr [ebp-08], ecx
:004F3F4F 8955FC mov dword ptr [ebp-04], edx
:004F3F52 8B45FC mov eax, dword ptr [ebp-04]
:004F3F55 E86602F1FF call 004041C0
:004F3F5A 33C0 xor eax, eax
:004F3F5C 55 push ebp
:004F3F5D 6823404F00 push 004F4023
:004F3F62 64FF30 push dword ptr fs:[eax]
:004F3F65 648920 mov dword ptr fs:[eax], esp
:004F3F68 33F6 xor esi, esi
:004F3F6A 8D45F4 lea eax, dword ptr [ebp-0C]
:004F3F6D 8B55FC mov edx, dword ptr [ebp-04]
:004F3F70 E8AFFEF0FF call 00403E24
:004F3F75 8B45F4 mov eax, dword ptr [ebp-0C]
:004F3F78 E88F00F1FF call 0040400C -------------------->计算名字的长度
:004F3F7D 8BF8 mov edi, eax
:004F3F7F 85FF test edi, edi -------------------->检查长度是否等于0
:004F3F81 7E5A jle 004F3FDD --------------------->等于就完蛋了！
:004F3F83 BB01000000 mov ebx, 00000001

~~~~~~~~~~~~~~~~~~~~~~~~~~~~开始计算~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3FDB(C)
|
:004F3F88 8B45F4 mov eax, dword ptr [ebp-0C] ------>将名字的地址给EAX
:004F3F8B 8A4418FF mov al, byte ptr [eax+ebx-01] ---->依次取出一个名字的代码
:004F3F8F E858FFFFFF call 004F3EEC -------------------->计算该代码是不是质数
:004F3F94 84C0 test al, al ---------------------->是则al=1，反之al=0
:004F3F96 7425 je 004F3FBD ---------------------->不是质数就跳转
:004F3F98 8D45E8 lea eax, dword ptr [ebp-18]-------
:004F3F9B 8B55F4 mov edx, dword ptr [ebp-0C] |
:004F3F9E 8A541AFF mov dl, byte ptr [edx+ebx-01] |
:004F3FA2 E88DFFF0FF call 00403F34 | 如果是质数，将该代码转化
:004F3FA7 8B45E8 mov eax, dword ptr [ebp-18] | 成大写，若本来就是大写则
:004F3FAA 8D55EC lea edx, dword ptr [ebp-14] | 不变
:004F3FAD E8FA48F1FF call 004088AC |
:004F3FB2 8B55EC mov edx, dword ptr [ebp-14] |
:004F3FB5 8D45F0 lea eax, dword ptr [ebp-10] |
:004F3FB8 E85700F1FF call 00404014 --------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3F96(C)
|
:004F3FBD 83FB01 cmp ebx, 00000001 ---------------->看取的是不是第一个代码
:004F3FC0 740A je 004F3FCC ---------------------->是就跳
:004F3FC2 8B45F4 mov eax, dword ptr [ebp-0C] ------>将名字的地址给EAX
:004F3FC5 0FB64418FE movzx eax, byte ptr [eax+ebx-02] ->去前一个代码
:004F3FCA EB06 jmp 004F3FD2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3FC0(C)
|
:004F3FCC 8B45F4 mov eax, dword ptr [ebp-0C] ------| 若是第一个
:004F3FCF 0FB600 movzx eax, byte ptr [eax]---------| 则直接取得

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3FCA(U)
|
:004F3FD2 8DB486A8000000 lea esi, dword ptr [esi+4*eax+000000A8] ->将代码乘4加A8再
:004F3FD9 43 inc ebx 加ESI
:004F3FDA 4F dec edi
:004F3FDB 75AB jne 004F3F88 ---------------------------->循环直到把名字都
取完

~~~~~~~~~~~~~~~~~~~~~~~~~~~到这结束计算~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3F81(C)
|
:004F3FDD 8D55E4 lea edx, dword ptr [ebp-1C]
:004F3FE0 8BC6 mov eax, esi
:004F3FE2 E8894CF1FF call 00408C70 -------------------->将ESI中的数转为十进制(2)
:004F3FE7 8B4DE4 mov ecx, dword ptr [ebp-1C] ------>转化的结果
:004F3FEA 8D45F4 lea eax, dword ptr [ebp-0C]
:004F3FED 8B55F0 mov edx, dword ptr [ebp-10] ------>名字中为质数的大写排列(1)
:004F3FF0 E86300F1FF call 00404058 -------------------->将（1）+（2）= 真注册码
:004F3FF5 8B45F8 mov eax, dword ptr [ebp-08] ------>假注册码
:004F3FF8 8B55F4 mov edx, dword ptr [ebp-0C] ------>真注册码
:004F3FFB E8E0FDF0FF call 00403DE0
:004F4000 33C0 xor eax, eax
:004F4002 5A pop edx
:004F4003 59 pop ecx
:004F4004 59 pop ecx
:004F4005 648910 mov dword ptr fs:[eax], edx
:004F4008 682A404F00 push 004F402A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4028(U)
|
:004F400D 8D45E4 lea eax, dword ptr [ebp-1C]
:004F4010 BA05000000 mov edx, 00000005
:004F4015 E896FDF0FF call 00403DB0
:004F401A 8D45FC lea eax, dword ptr [ebp-04]
:004F401D E86AFDF0FF call 00403D8C
:004F4022 C3 ret

:004F4023 E9FCF7F0FF jmp 00403824
:004F4028 EBE3 jmp 004F400D
:004F402A 5F pop edi
:004F402B 5E pop esi
:004F402C 5B pop ebx
:004F402D 8BE5 mov esp, ebp
:004F402F 5D pop ebp
:004F4030 C3 ret

:004F4031 8D4000 lea eax, dword ptr [eax+00]
:004F4034 55 push ebp
:004F4035 8BEC mov ebp, esp
:004F4037 33C0 xor eax, eax
:004F4039 55 push ebp
:004F403A 6859404F00 push 004F4059
:004F403F 64FF30 push dword ptr fs:[eax]
:004F4042 648920 mov dword ptr fs:[eax], esp
:004F4045 FF0518855200 inc dword ptr [00528518]
:004F404B 33C0 xor eax, eax
:004F404D 5A pop edx
:004F404E 59 pop ecx
:004F404F 59 pop ecx
:004F4050 648910 mov dword ptr fs:[eax], edx
:004F4053 6860404F00 push 004F4060

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F405E(U)
|
:004F4058 C3 ret
:004F4059 E9C6F7F0FF jmp 00403824
:004F405E EBF8 jmp 004F4058
:004F4060 5D pop ebp
:004F4061 C3 ret

:004F4062 8BC0 mov eax, eax
:004F4064 832D1885520001 sub dword ptr [00528518], 00000001
:004F406B C3 ret

三、既然已经了解了它的算法就做它的注册机吧！由于C是自学的，所以底子不是很好，有什么不对的地方还 请大哥们多指教了！！！

main()
{char a[30];
int i,b,c,esi=0,eax;
clrscr();
printf("********************The Chinazip 6.01 crack by RATARICE");
printf("********************\n\n");
printf("Please input your register name : \n");
gets(a);
printf("\n");
printf("You register code is : \n");
c=strlen(a);
for(i=0;i<c;i++)
{
for (b=2;b {if(a[i]%b==0) goto end;
else b++;}
if(a[i]<=122&&a[i]>=97) printf("%c",a[i]-32);
else printf("%c",a[i]);
end:;
}
i=0;
eax=a[0];
esi=eax*4+168;
for(i=1;i<c;i++)
{eax=a[i-1];
esi=esi+eax*4+168;
}
printf("%d\n",esi);
}

另外、当注册成功后，它在注册表里的
[HKEY_CURRENT_USER\Software\XDZHAN\ChinaZip]
填了这个："Key"="Real Programmers Use Pascal!"

总算好了，大功告成！！！


竹影棋友

 标 题:"竹影棋友"围棋程序注册鸡 (2千字)
发信人:bpx
时 间:2001-5-19 22:50:31
详细信息:
 四月初在即将离开我的上一家公司--东大阿尔派深圳分公司的时候新来一位同事嚷着要和我下围棋. 找来找去发现只有用"竹影棋友围棋程序"可在局域网下棋.
  当时在"盗亦有道"上下载了破解版, 在软件中也可以看到"dyyd"字样. 可是当下到250手时, 软件弹出"共享版, 只能下250手, 然后中断连接".
  让我一盘大优的棋没有下完. 如此"有道":(

只得祭起wdasm8.93, (顺便解决了wdam不能正确显示种文字串的一个小bug) 结合SoftIce发现了竹影棋友的注册算法. 考虑到这程序有2年没有更新,
  为此贴出其注册机的完整程序. 这也正是当时我离开论坛时答应要做的

#include <windows.h>
#include <tchar.h>

#include "resource.h"

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL,
  DlgProc, (LPARAM)hInstance);
return 0;
}

BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL) {
EndDialog(hWnd, 0);
return TRUE;
}
}

return FALSE;
}

void CalcKey(HWND);
BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HICON hIcon;
HMENU hSysMenu;

switch (msg)
{
case WM_INITDIALOG:
hIcon = LoadIcon((HINSTANCE)lParam, MAKEINTRESOURCE(MAINICON));
SendMessage(hWnd, WM_SETICON, TRUE, (LPARAM)hIcon);
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);

SendMessage(GetDlgItem(hWnd, IDC_EDIT1),
  EM_LIMITTEXT, 8, 0L);
SendMessage(GetDlgItem(hWnd, IDC_EDIT2),
  EM_LIMITTEXT, 8, 0L);

hSysMenu = GetSystemMenu(hWnd, FALSE);
if (hSysMenu != NULL) {
AppendMenu(hSysMenu,
  MF_SEPARATOR, NULL, NULL);
AppendMenu(hSysMenu,
  MF_STRING, IDM_ABOUT, TEXT("关于..."));
}
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL) {
EndDialog(hWnd, 0);
return TRUE;
}
else if (LOWORD(wParam) == IDOK) {
CalcKey(hWnd);
return TRUE;
}
break;

case WM_SYSCOMMAND:
if (LOWORD(wParam) == IDM_ABOUT) {
DialogBoxParam(GetModuleHandle(NULL),
  MAKEINTRESOURCE(IDD_ABOUT), NULL, AboutDlgProc, 0);
return TRUE;
}
}

return FALSE;
}

void CalcKey(HWND hWnd)
{
TCHAR Buf[9];
TCHAR* StopString;

GetDlgItemText(hWnd, IDC_EDIT1, Buf, sizeof(Buf));
if (_tcslen(Buf) != 8) {
MessageBox(hWnd, TEXT("标识号应为8位数字"), TEXT("竹影棋友注册机"),
  MB_OK | MB_ICONEXCLAMATION);
SetFocus(GetDlgItem(hWnd, IDC_EDIT1));
return;
}

int ID = _tcstoul(Buf, &StopString, 16);

int key;
*((BYTE *)&key + 0) = *((BYTE*)&ID + 2) * *((BYTE*)&ID
  + 1) % 0xff;
*((BYTE *)&key + 1) = *((BYTE*)&ID + 3) * *((BYTE*)&ID
  + 0) % 0xfc;
*((BYTE *)&key + 2) = *((BYTE*)&ID + 1) * *((BYTE*)&ID
  + 3) % 0xfe;
*((BYTE *)&key + 3) = *((BYTE*)&ID + 0) * *((BYTE*)&ID
  + 2) % 0xfd;

wsprintf(Buf, "%08x", key);
SetDlgItemText(hWnd, IDC_EDIT2, Buf);
}


注册亮点压缩

 标 题:注册亮点压缩实录 (6千字)
发信人:67
时 间:2001-6-12 7:27:17
详细信息:
注册亮点压缩实录
by 6767 [BCG] @2001/06

工具：SoftIce, IceDump 6.023, RegMon, FrogIce
下载：http://sd.onlinedown.net/down/nbz20c.exe

受朋友之托，写这个，呵呵。其实机器上有winzip、rar，还有wincommand自带解压，压缩软件在我机器上没有市场。

它加了壳，UPX的，在这个例子中是否脱壳不重要，但有必要给象我一样的初学者讲一下：手动脱UPX的壳很容易。

1、先运行frogice，这个应养成习惯；再运行IceDump 6.023；用Symble Loader载入bzip.exe。差点忘了需要先用PE编辑功能记下它的Size of Image:1FF000、Image of Base:400000。

程序入口在这里：

017F:005FB370 60 PUSHAD <- 停在这

017F:005FB371 BE30605600 MOV ESI,00566030

017F:005FB376 8DBED0AFE9FF LEA EDI,[ESI+FFE9AFD0]

017F:005FB37C 57 PUSH EDI

017F:005FB37D 83CDFF OR EBP,-01

017F:005FB380 EB10 JMP 005FB392

017F:005FB382 90 NOP

017F:005FB383 90 NOP

017F:005FB384 90 NOP

017F:005FB385 90 NOP

2、看官们记住了，这就是被UPX压过的特征，脱壳很简单：按Ctrl+PageDown(不要告诉我你找不到)向下翻页，直到这里：

017F:005FB4CE 8903 MOV [EBX],EAX

017F:005FB4D0 83C304 ADD EBX,04

017F:005FB4D3 EBD8 JMP 005FB4AD

017F:005FB4D5 FF9654DC1F00 CALL [ESI+001FDC54]

017F:005FB4DB 61 POPAD <- 恢复现场

017F:005FB4DC E91F5BE0FF JMP 00401000 <- 跳向 Original Entry Point

017F:005FB4E1 0000 ADD [EAX],AL

017F:005FB4E3 00FC ADD AH,BH

017F:005FB4E5 B45F MOV AH,5F

017F:005FB4E7 00B0B55F0024 ADD [EAX+24005FB5],DH
下面是一些 00

3、你只要下：g 5FB4DC，按一次F5，再按一次F10就到了OEP，可以脱壳了。

017F:00401000 EB10 JMP 00401012 <- 这里就是OEP了(不知它为什么还跳，不管它)

017F:00401002 66623A BOUND DI,[EDX]

017F:00401005 43 INC EBX

017F:00401006 2B2B SUB EBP,[EBX]

017F:00401008 48 DEC EAX

017F:00401009 4F DEC EDI

017F:0040100A 4F DEC EDI

017F:0040100B 4B DEC EBX

017F:0040100C 90 NOP

4、在401000处下：/dump 400000 1ff000 bz_unpck.exe就能得到脱壳后的文件，不过还不能用。用PE Edit功能打开它，将每一section的psize改为与vsize值相等，offset改为与RVA相等，保存后就可用了(不过这次没法子用WDASM，DAMN!)。

我们是想找出注册码，消灭这个大BUG是吧？继续。

5、用RegMon得知它在这里保存注册信息：
REGEDIT4

[HKEY_CURRENT_USER\Software\NSC\BrilliantZIP\Registered]
"a1"="6767"
"a2"="73E26-3789B-3ABC2-2DCE7"
"a3"="80D2A-43A38-D5D17-A56C4"
"a4"="BCG"

分别为破解者姓名、机器码、注册码、破解组织名。好了，有线索就有办法。

6、下BPX RegQueryValueExA DO "d esp->8" ，然后不停的按F5，直到看到a1出现，继续按F5，看到a3时下bd *阻断，之后小心的按几次人F12返回程序主线(BORLAND编译器的特征很明显)，到这里：

017F:0049CB25 8BC6 MOV EAX,ESI

017F:0049CB27 E898FFFFFF CALL 0049CAC4

017F:0049CB2C 8BD8 MOV EBX,EAX

017F:0049CB2E 85DB TEST EBX,EBX

017F:0049CB30 7E4F JLE 0049CB81

017F:0049CB32 8BC7 MOV EAX,EDI

017F:0049CB34 8BCB MOV ECX,EBX

017F:0049CB36 33D2 XOR EDX,EDX

017F:0049CB38 E8A3C50600 CALL 005090E0

017F:0049CB3D 53 PUSH EBX

再向下不远：

017F:0049CB55 803C2401 CMP BYTE PTR [ESP],01

017F:0049CB59 7406 JZ 0049CB61

017F:0049CB5B 803C2402 CMP BYTE PTR [ESP],02

017F:0049CB5F 7517 JNZ 0049CB78

017F:0049CB61 8B07 MOV EAX,[EDI] <- eax为输入注册码的偏移址
<- 记下这地址并下BPM

017F:0049CB63 E8D4C80600 CALL 0050943C

017F:0049CB68 E867430600 CALL 00500ED4

017F:0049CB6D 8BD0 MOV EDX,EAX

017F:0049CB6F 8BC7 MOV EAX,EDI

017F:0049CB71 E836CA0600 CALL 005095AC

7、设好bpm后，按F5继续运行，第一次中断是取长度的，再按一次F5，到这里：

-----KERNEL32!CompareStringA?---------------------------------------PROT32-

017F:BFFA20F7 8A01 MOV AL,[ECX]

017F:BFFA20F9 648F02 POP DWORD PTR FS:[EDX]

017F:BFFA20FC 83C404 ADD ESP,04

017F:BFFA20FF E96485FDFF JMP BFF7A668

017F:BFFA2104 57 PUSH EDI

017F:BFFA2105 6A23 PUSH 23

017F:BFFA2107 2BD2 SUB EDX,EDX

017F:BFFA2109 68CB21FABF PUSH BFFA21CB

017F:BFFA210E 64FF32 PUSH DWORD PTR FS:[EDX]

017F:BFFA2111 648922 MOV FS:[EDX],ESP

--------------------------------------------------------------------------------

MSR LastBranchFromIp=00536E46

MSR LastBranchToIp=BFFA20E0

:/screendump d:bz07.htm

8、看到那个绿字KERNEL32!CompareStringA了？我是第一次见到这个函数，那么你猜猜它是什么意思呢？按几次F12返回到程序里：

017F:0050032A 8BC3 MOV EAX,EBX

017F:0050032C E80B910000 CALL 0050943C

017F:00500331 50 PUSH EAX <- 这里是大家都想看到的

017F:00500332 6A01 PUSH 01

017F:00500334 6800040000 PUSH 00000400

017F:00500339 E8086B0300 CALL KERNEL32!CompareStringA

017F:0050033E 83E802 SUB EAX,02

017F:00500341 5E POP ESI

017F:00500342 5B POP EBX

017F:00500343 C3 RET

好了，大侠重新来过吧，载入后进行上述6的跟踪历程，见到目标a3后下bpx 500332 do "d eax"，记下数据窗里显示的那些样子怪怪的，再用它来注册就可以了。

收工。

补记：icedump真是好东东，可以截图。想看我截的图just feel free to ask me for it.


专业扫雷 1.2

标 题:专业扫雷 1.2破解过程 (4千字)
发信人:hurrah
时 间:2001-2-17 9:42:05
详细信息:

进入注册界面，输入hurrah 5346534
si:bpx getdlgItemTextA
001B:00404FF9 PUSH EBX
001B:00404FFA CALL USER32!GetDlgItemTextA ；读注册信息
001B:00404FFF PUSH 0041EE18 ；注册码
001B:00405004 PUSH 0041EDC8 ;名字
001B:00405009 CALL 00405657 ;比较
001B:0040500E ADD ESP,08
001B:00405011 MOV [0041EE22],AL
于是进入 001B:00405009 CALL

001B:00405657 PUSH EBP
001B:00405658 MOV EBP,ESP
001B:0040565A ADD ESP,-1C
001B:0040565D PUSH EBX
001B:0040565E PUSH ESI
001B:0040565F PUSH EDI
001B:00405660 MOV EBX,[EBP+0C] ;EBX=CODE
001B:00405663 MOV ECX,[EBP+08] ;ECX=NAME
001B:00405666 XOR EAX,EAX
001B:00405668 MOVSX EDX,BYTE PTR [EAX+EBX]
001B:0040566C ADD EDX,-30
001B:0040566F MOV [EAX*4+EBP-1C],EDX
001B:00405673 CMP DWORD PTR [EAX*4+EBP-1C],00 ;CODE为数字?
001B:00405678 JL 00405681
001B:0040567A CMP DWORD PTR [EAX*4+EBP-1C],09
001B:0040567F JLE 004056A4 ;是,跳转
001B:00405681 PUSH 0041C42D
001B:00405686 PUSH ECX
001B:00405687 CALL 00414780
001B:0040568C ADD ESP,08
001B:0040568F PUSH 0041C435
001B:00405694 PUSH EBX
001B:00405695 CALL 00414780
001B:0040569A ADD ESP,08
001B:0040569D XOR EAX,EAX
001B:0040569F JMP 00405749
001B:004056A4 INC EAX
001B:004056A5 CMP EAX,07 ;取满code 前7个数？
001B:004056A8 JL 00405668 ;否，跳转
001B:004056AA IMUL EAX,[EBP-0C],000003E8 ;code5*1000=5000
001B:004056B1 IMUL EDX,[EBP-14],64 ;code3*100=400
001B:004056B5 ADD EAX,EDX
001B:004056B7 MOV EDX,[EBP-04]
001B:004056BA ADD EDX,EDX
001B:004056BC LEA EDX,[EDX*4+EDX] ;code7*10
001B:004056BF ADD EAX,EDX ;
001B:004056C1 ADD EAX,[EBP-1C] ;eax+code1=1545h
001B:004056C4 IMUL ESI,EAX,0D ;eax*0dh
001B:004056C7 MOV EAX,ESI
001B:004056C9 MOV ESI,000000C5
001B:004056CE CDQ
001B:004056CF IDIV ESI ;eax/c5h
001B:004056D1 MOV ESI,EDX ;esi=余数3eh
001B:004056D3 XOR EDI,EDI
001B:004056D5 XOR EAX,EAX
001B:004056D7 CMP BYTE PTR [EAX+ECX],00 ;name+eax<>''?
001B:004056DB JZ 004056E9 ;是，跳转
001B:004056DD MOVSX EDX,BYTE PTR [EAX+ECX]
001B:004056E1 ADD EDI,EDX ;edi='h'+'u'+'r'+'r'+'a'+'h'=28ah
001B:004056E3 INC EAX
001B:004056E4 CMP EAX,50 ;name最长=50
001B:004056E7 JL 004056D7
001B:004056E9 MOV EAX,ESI ;余数3eh
001B:004056EB PUSH ECX
001B:004056EC MOV ECX,0000000A
001B:004056F1 CDQ
001B:004056F2 IDIV ECX ;3eh/0ah=06h
001B:004056F4 POP ECX
001B:004056F5 ADD EAX,EDI
001B:004056F7 MOV EDI,00000064
001B:004056FC CDQ
001B:004056FD IDIV EDI ;eax/64=06h
001B:004056FF MOV EDI,EDX ;余数38h
001B:00405701 MOV EAX,ESI
001B:00405703 MOV ESI,0000000A
001B:00405708 CDQ
001B:00405709 IDIV ESI ;eax/0ah=06h
001B:0040570B MOV EAX,EDI
001B:0040570D ADD EAX,EAX
001B:0040570F LEA EAX,[EAX*4+EAX] ;eax*10=230h
001B:00405712 ADD EDX,EAX
001B:00405714 MOV ESI,EDX ;esi=230h+余数=232h
--------------------(1)
001B:00405716 IMUL EAX,[EBP-10],64 ;code4*64h
001B:0040571A MOV EDX,[EBP-18]
001B:0040571D ADD EDX,EDX
001B:0040571F LEA EDX,[EDX*4+EDX] ;code2*10=1eh
001B:00405722 ADD EAX,EDX ;276h
001B:00405724 ADD EAX,[EBP-08] ;+code6=279h
001B:00405727 CMP EAX,ESI ;279h=232h?
001B:00405729 JZ 00405749 ;是，注册成功，跳转!
001B:0040572B PUSH 0041C43D
001B:00405730 PUSH ECX
001B:00405731 CALL 00414780
001B:00405736 ADD ESP,08
001B:00405739 PUSH 0041C445
001B:0040573E PUSH EBX
001B:0040573F CALL 00414780
001B:00405744 ADD ESP,08
001B:00405747 XOR EAX,EAX
001B:00405749 POP EDI
001B:0040574A POP ESI
001B:0040574B POP EBX
001B:0040574C MOV ESP,EBP
001B:0040574E POP EBP
001B:0040574F RET

所以直接改001B:00405729 JZ为JNZ 即可！
或计算：
(1)处为232h，code4*100+code2*10+code6=232h (562d) 可取code4、2、6=562， 总结: code=5645524 name='hurrah'

注册完后程序在Windows目录下填写profmine.ine及修改注册表。


赝画鉴赏家 1.0

 标 题:我是非常喜欢国产软件的，再贴一篇给大家壮壮胆。反正没人知道我是谁，大不了再换个ID罢了。^-^ (2千字)
发信人:crack007
时 间:2001-5-19 17:49:48
详细信息:
游戏名称：赝画鉴赏家 1.0

特色说明：

1、找出两幅图不同处的桌面游戏，可随时暂停、退出，系统资源占用少；
2、可选在不同图库中游戏，图库可随时扩充（更多图库请关注软件主页更新）；
3、图中不同处并非每次都在同一地方，游戏更富挑战性。
4、画面精简明快，操作简单。

下载地址：
http://go2.163.com/~huangj99/download/yhjsj10.zip

作者：Crack007
主页：http://www.crack007.com ( ^-^ )
破解日期：2001-5-19
破解工具：SmartCheck6.03 RegMon95 Fi.exe

用Fi.exe侦测出该软件是用VB 5.0编写的，于是马上祭出VB克星—SmartCheck。

填写完各个选项

用户名称： Crack007
E-mail: ceo@xiaodao.com
校验密码： 59317513329 <----可从“我要注册”处获得
注册密码： 78787878

然后通过SmartCheck运行之。

这个软件启动时会先从注册表里读出注册数据（可以用RegMon95监视所得）：

REGEDIT4

[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\yhjsj\register]
"user"="Crack007"
"email"="ceo@xiaodao.com"
"testpass"="59317513329"

所以我们可以在软件启动时就可以得到注册码。

在一大串 Asc returns Integer:XX
Left
Right
之后来到一个这样的滚动条处：
Val returns double 3.17513e+008 [displayed as single-precision floating point]
^^^^^^^^^^^^ (不同的机器可能会不同)

(为什么会注意到这儿？因为后面有个这样的语句：Form_nozhuce(Form)created )
^^^^^^^ 未注册？^-^

选择Show All Events 展开此滚动条，找 __vbasrtcmp、__vbafreestr、SysFreeString这样的语句。

功夫不负有心人，终于在这一条下的第九行，也就是第四个SysFreeString处找到了正确的注册码：Crack007-18733286411

当然我们也可在点击确定之后再找注册码。

这个注册码的另一个存放地点在 regnow_Click ----> Val returns double 3.17513e+008 [displayed as single-precision floating point] ----> 第五个SysFreeString处。

注册完成后程序会把注册密码写入注册表：

REGEDIT4

[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\yhjsj\register]
"user"="Crack007"
"email"="ceo@xiaodao.com"
"testpass"="59317513329"
"regpass"="Crack007-18733286411" <----删除此件就可重复注册

整理一下：

用户名称： Crack007
E-mail: ceo@xiaodao.com
校验密码： 59317513329
注册密码： Crack007-18733286411

收工，继续完成我们的“胃”业去！ ^-^


鹦鹉螺网络助手

标 题:鹦鹉螺网络助手破解 (5千字)
发信人:uhlan
时 间:2001-1-19 17:32:05
详细信息:
软件介绍：
软件名叫鹦鹉螺网络助手，大小为708KB。可在下列网址download.
http://newhua.infosail.com/down/netranger170c.exe

鹦鹉螺网络助手是一个集成了用于TCP/IP协议的多种网络工具的应用软件。她基于Windows Socket2.0版
本，功能包括：Ping；Host lookup(主机查询)；Finger(帐号查询)；同步本地主机时钟的Time(网络时钟)； WhoIs(域名查询)；TraceRoute(路由跟踪)；ISPPinger（以一定时间间隔持续ping同一台主机）；QoD服务； 增强的快速拨号；支持多帐号的电邮检查等等。其他特性包括多功能的托盘图标，在线检查软件升级，获 得本机IP地址，将主机查询结果存入本地HOSTS文件等等。本软件适用于安装了TCP/IP协议的Windows 9x操作系统(包括Windows 95，97，98和Windows ME)。本软件需要有Microsoft Winsock 2.0或更高版本才 能正常工作。Windows 98及以上版本在安装时即已带有，而Windows 95用户可以从微软公司的网站下载有
关的升级包，也可以从鹦鹉螺工作室的主页下载一个拷贝

我用的工具：softICE 4.05.可在下列网址download
http://mud.sz.jsinfo.net/per/aaron/files/debuggers/win/si405w9x.zip

知识要求： 1。具备基本的汇编知识。
2。懂得 softICE 的基本操作。

所用方法： 1.找注册失败点。
2。找关键跳跃点。
3。找关键CALL.
4。找出注册码。

I。找注册失败点。

运行软件NautiNW，注册软件。

1. 输入名字和注册码:

用户名：uhlan
注册码：78787878 (从 Error_Free 大哥处学来的，他可是我的启蒙老师哦！^^）

2.按 Ctrl-D 进入 softICE.

3.设断 BPX HMEMCPY 按 F5 返回 NautiNW.

4.按回车即被拦截, 不停地按F12，当按了21下时出现了注册失败的窗口。

5。按确定后，按F5 回到 NautiNW，按前面的步骤再来一次。

6。不停地按F12，不过这次是按了20下，就停住。按 F6, 再用 F9设一个断点。

7。不停地按F10，按到一定时候，会看到

0177:00417AC2 CALL 00437436

8。 当我们再按一次时，失败的窗口就跳出来了。于是，这个CALL就是我们要找的失败点了。

II.找关键跳跃点。

9。再重新注册一次。按回车即被拦截. 由于刚才用 F9设了一个断点，现在就直接来到这里。

10。按 F10， 直到看到下列语句。

....

0177:00417A54 TEST EAX,EAX （EAX=0)
0177:00417A56 JZ 00417AB4 （一跳就失败）

...

11.在 JZ 00417AB4 处 打入 rfl+z

12.再按F10，这时程序就不再跳跃了。

13.按F5退出softICE，这时就会出现注册成功的画面。

（从这里我们可以推测到，EAX 是一个标志位，当EAX=0时，表明输入注册码不正确，当 EAX 不等于 0时，表明输入注册码正确。所以，下一步，我们要找的就是那个CALL
负责在EAX设标志）。

III.找关键CALL

14. 再重新注册一次。按回车即被拦截.

15. 按 F10， 直到

....

0177:00417A4F CALL 00417C20

....

0177:00417A54 TEST EAX,EAX （EAX=0)
0177:00417A56 JZ 00417AB4 （一跳就失败）

...

过了那个CALL后，我们可以看到 EAX已经被清零了。于是，可以
十分肯定地说，CALL 00417C20 就是我们要找的关键 CALL.

注册码的对比就在那个 CALL 里面。

IV. 找出注册码。

16。在 0177:00417A4F CALL 00417C20 按F9设断。再注册一次，

17。 在 0177:00417A4F CALL 00417C20 被拦截后，按F8进入这个CALL.

19. 不停地按F10，并留意 EAX的变化，看什么时候变0.

20. 终于，在这里，

.....

0177:00417CE3 XOR EAX,EAX

.....

（ 程序运行到这里把 EAX 清零后，就会跳出这个CALL，回到主程序，然后，就是对比EAX的值，再着

失败窗口就出现了。

我们可以想到，程序肯定有一个地方对比注册码，然后再决定来不来到这里来吧 EAX 清零。）

21。再注册一次。

22。在 0177:00417A4F CALL 00417C20 被拦截后，按F8进入这个CALL

23，不停地按F10，不过这次是看那里的 JUMP 会跳过前面清零的步骤。

24。皇天不负苦心人！，终于，我们可以在这里找到线索。

.....
0177:00417C87 CALL 004232A0
0177:00417C8C ADD ESP,0C
0177:00417C8F MOV BYTE PTR [ESP+20],00
0177:00417C94 TEST EAX,EAX (检验标志位， EAX=1 则失败。 EAX=0 则成功 ）
0177:00417C96 LEA ECX,[ESP+28]
0177:00417C9A JNZ 00417CC9 (跳则失败，不跳则成功）
....

(从这里，可以推断， EAX在这里变成另一个标志位的寄存器，而 CALL 004232A0 是设置这个新标志的关键CALL)

25. 于是，再重新注册一次。

26。 来到 0177:00417C87 CALL 004232A0 时，按 F8 进入。

27。 以下是我抄下来的 CALL 004232A0 内的程序。

PUSH EBP
MOV EBP,ESP
PUSH EDI
PUSH ESI
PUSH EBX
MOV ECX,[EBP+10]
JECXZ 004232D1
MOV EBX,ECX
MOV EDI,[EBP+08]
MOV ESI,EDI
XOR EAX,EAX
REPNZ SCASB
NEG ECX
ADD ECX,EBX
MOV EDI,ESI
MOV ESI,[EBP+0C]
REPZ CMPSB
MOV AL,[ESI-01] (下 d esi-01 的命令， 就可看到 78787878, 正是我们输入的号码）
XOR ECX,ECX
CMP AL,[EDI-01] （下 d edi-01 的命令， 就可看到 xxxxxxxx, 正是要找的注册码，还不快抄下？）
JA 004232CF
JZ 004232D1 （ 不 jump 就失败）
DEC ECX
DEC ECX
NOT ECX
MOV EAX,ECX （ 将 EAX 的标志设为1)
POP EBX
POP ESI
POP EDI
LEAVE
RET

28. 用找到的注册码再重新注册。这次是真的成功了！！^^


鹦鹉螺网络助手 2.22

 标 题:anti-homeMade(4)：鹦鹉螺网络助手2.22 (4千字)
发信人:6767
时 间:2001-5-25 23:00:57
详细信息:
anti-homeMade(4)：鹦鹉螺网络助手2.22
by 6767

工具：SOFTICE，WD32ASM(用于写过程)
下载地址：http://jx163.onlinedown.net/down/netranger222c.zip
开发者自己是怎么说的：
鹦鹉螺网络助手是什么?
鹦鹉螺网络助手是一个功能强大，方便易用的专业网络工具箱，既适合网络新手，也适合有经验的用户使用。鹦鹉螺网络助手提供给你上网冲浪、检查网络故障，获取帐号、主机和域名等等互联网或企业内部网上的网络信息所需要的各种常用工具。

不管那么多，在注册窗口，名字：6767，注册码：123654。在SI中下Bpx windowtexta，拦到。跟跟跟，到这里(当然失败上N次才找到)：

.....
:00422B75 C644243002 mov [esp+30], 02
:00422B7A E879EF0100 call 00441AF8
:00422B7F 8BCE mov ecx, esi
:00422B81 C644242C01 mov [esp+2C], 01
:00422B86 E875FEFFFF call 00422A00 <- 怀疑核心在这里，果然是，看下面分析
:00422B8B 8B4C2430 mov ecx, dword ptr [esp+30] <- 在这里D一下会有收获
:00422B8F 6A0A push 0000000A
:00422B91 8D542410 lea edx, dword ptr [esp+10] <- 在这里D一下会有收获
:00422B95 51 push ecx
:00422B96 52 push edx
:00422B97 E8E4C40000 call 0042F080 <- 大哥
:00422B9C 83C40C add esp, 0000000C
:00422B9F C644242000 mov [esp+20], 00
:00422BA4 85C0 test eax, eax <- 看起来
:00422BA6 8D4C2428 lea ecx, dword ptr [esp+28]
:00422BAA 752D jne 00422BD9 <- 好面熟
......

跟入核心CALL不久会到这里：

......
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422A8E(C)
|
:00422AA3 33C9 xor ecx, ecx <- ECX=0，循环变量

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422AEB(C)
|
:00422AA5 33F6 xor esi, esi
:00422AA7 85FF test edi, edi <- DI放姓名长度
:00422AA9 7E3D jle 00422AE8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422AE6(C)
|
:00422AAB 83F90A cmp ecx, 0000000A <- 大于等于10则循环完成
:00422AAE 7D3D jge 00422AED
:00422AB0 85C9 test ecx, ecx <-
:00422AB2 7E07 jle 00422ABB <- 仅在第一次循环时跳走
:00422AB4 0FBE4429FF movsx eax, byte ptr [ecx+ebp-01] <- 取生成的注册码的上一字母
:00422AB9 EB14 jmp 00422ACF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422AB2(C)
|
:00422ABB 0FBE543418 movsx edx, byte ptr [esp+esi+18] <- 取名字的第一个字符
:00422AC0 0FBEC3 movsx eax, bl <- 与版本有关的一个值，0X6A
:00422AC3 8BD9 mov ebx, ecx <- EBX=0
:00422AC5 03DA add ebx, edx
:00422AC7 8B542414 mov edx, dword ptr [esp+14] <- 在EDX中放入累加和
:00422ACB 03C3 add eax, ebx
:00422ACD 03C2 add eax, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422AB9(U)
|
:00422ACF 33D2 xor edx, edx <- EDX=0
:00422AD1 BB1A000000 mov ebx, 0000001A <- 0X1A=26
:00422AD6 F7F3 div ebx
:00422AD8 8A5C2413 mov bl, byte ptr [esp+13] <- [ESP+13]='j'=0X6A，固定值
:00422ADC 83C261 add edx, 00000061 <- EDX变为小写字符
:00422ADF 46 inc esi
:00422AE0 881429 mov byte ptr [ecx+ebp], dl <- 保存生成的注册码
:00422AE3 41 inc ecx
:00422AE4 3BF7 cmp esi, edi <- 循环次数是否到名字长度
:00422AE6 7CC3 jl 00422AAB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422AA9(C)
|
:00422AE8 83F90A cmp ecx, 0000000A
:00422AEB 7CB8 jl 00422AA5 <- 若循环未到10次，继续循环

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00422AAE(C)
|
:00422AED 8D4C2434 lea ecx, dword ptr [esp+34]
:00422AF1 C6450A00 mov [ebp+0A], 00 <- 注册码长度变为10
:00422AF5 E889F20100 call 00441D83 <- 下面不重要了
:00422AFA 8D4C2438 lea ecx, dword ptr [esp+38]
:00422AFE C744242CFFFFFFFF mov [esp+2C], FFFFFFFF
:00422B06 E878F20100 call 00441D83
:00422B0B 8B4C2424 mov ecx, dword ptr [esp+24]
:00422B0F 5F pop edi
:00422B10 5E pop esi
:00422B11 5D pop ebp

过程到这里，觉得好用就想办法注册吧。


鹦鹉螺网络助手1.68

 标 题:鹦鹉螺网络助手 1.68 预览2破解手记 (1千字)
发信人:孙锋
时 间:2000-12-26 23:40:59
详细信息:
鹦鹉螺网络助手 1.68 预览2破解手记

时间：2000年12月24日下午13：40
作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
对此软件，作者如此说“鹦鹉螺网络助手是一个功能强大，方便易用的专业网络工具集。
她基于Windows Socket2.0，提供了在互联网和企业内部网络上广泛使用的多种工具，包括：
- Ping
- TraceRoute(路由跟踪)
- Host lookup(主机查询)
- Finger(帐号查询)
- 同步本地主机时钟的Time(网络时钟)
- WhoIs(域名查询)
- 端口扫描
- IP地址扫描
- QoD服务
- 增强的快速拨号
- 支持多帐号的电邮检查
其他特性包括多功能的托盘图标，在线检查软件升级，获得本机IP地址，将主机
查询结果存入本地HOSTS文件等等。”

注册费用是20元。我哪有这么多的钱来注册这么多的软件啊，看来只有自己帮自己了。

步骤：
1、随便输入注册信息，我的是：
用户名：sunfeng
注册码：1212121212
2、启动TRW2000，OK载入内存。bpx hmemcpy万能中断，F5返回程序领域。
3、点击确定按钮，被TRW2000拦截到，BD *中断所有中断，F12共12次，然后F10到下面的
位置：
0167：00416847 CALL 00416A20 ；----->此处用F8跟踪进入CALL内部
4、F8进入CALL内部，然后一直F10到下面的位置：
0167：00416A58 PUSH ECX ；-------->D ECX。这里的是输入的任意的注册码
0167：00416A86 PUCH EDX ；-------->D EDX。这里是正确的注册码
得到正确的注册码是：pibungzsle
5、整理：
用户名：sunfeng
注册码：pibungzsle
6、另外注册码：
用户名：孙锋
注册码：Sfyrkdwpib
7、其他注册码：

用户名------------注册码-----

灰松鼠------------Lyrkdwpibu
番外地------------Wjcvohatmf
自由用户----------Kxqjcvohat
我就喜欢盗版------[ngzslexqj

<---------完--------->


鹦鹉螺网络助手1.70

标 题:鹦鹉螺网络助手1.70破解 (11千字)
发信人:bnbnf
时 间:2001-2-1 1:44:11
详细信息:
网络工具|IP工具 本站首页

软件名称：鹦鹉螺网络助手 Nautilus NetKit
整理日期：2001.1.8
最新版本：1.70
文件大小：708KB
软件授权：共享软件
使用平台：Win9x
发布公司：Home Page
下载地址：http://newhua.centurytop.net/search.asp?keyword=%F0%D0%F0%C4%C2%DD%CD%F8%C2%E7%D6%FA%CA%D6&Submit=%CB%D1%CB%F7
软件简介：
- 全线程化的电邮助手!现在重新实现的电邮助手再也不会发生阻塞主窗口操作的情况。同时通过使用可调整的线程数大幅提高了检查邮件的速度。例如你可以把线程数设成与电邮账
号数相同，这就意味着在检查电邮时，对应每一个账号都将有一个线程同时独立地进行检查。这样可以成十倍地提高速度。
- 全新设计的端口扫描!多线程化：现在你可以使用最多达一百个线程来高速同步地进行端口地扫描。线程数可以该工具页中设置。可随意扩充的列表文件：现在你可以随意创建自己的端口列表文件（扩展名为".pts")，或使用系统提供的多个缺省端口列表文件。新版的网络助手附带了三个列表文件：常用端口.pts 列出了各种电脑系统中最常用的服务端口代理端口.pts 列出了常用的代理服务端口木马端口.pts 列出了相当完整的现有各种木马程序使用的服务端口.
- IP地址扫描!IP扫描工具可以用来对当前在该工具页中列出的所有IP地址进行循环的ping工作，并显示其平均响应时间或当前状态（激活或未启动）。　同时IP地址扫描工具支持IP地址列表文件以方便使用。IP地址列表文件使用扩展名".ips"。你可以将当前列表中的所有IP地址存入文件，也可以从一个列表文件中读出所有记录并加入当前IP地址列表。
1)在注册名上填上：LINUX
注册号填上：12345678
2）CTRL+D呼出SIOFTICE下BPX HMEMCPY后按F5回到注册窗口点确定后拦住了
3）在SIOTICE中下BD*按大约是十三下F12左右就跳出一个注册错误的窗口来
4）重复1-2的方法再来一次，这次就按少一下F12后来到这里，因为计算注册码的地方在上面
* Possible Reference to String Resource ID=00001: ""
|
:0041A72C 6A01 push 00000001
:0041A72E E8FDFB0100 call 0043A330
:0041A733 8B4660 mov eax, dword ptr [esi+60]----------------------------来到这里
:0041A736 8D7E60 lea edi, dword ptr [esi+60]
:0041A739 8B40F8 mov eax, dword ptr [eax-08]-------------------------在EAX中看到我的名字
:0041A73C 85C0 test eax, eax
:0041A73E 7524 jne 0041A764
:0041A740 6A30 push 00000030

* Possible StringData Ref from Data Obj ->
|
:0041A742 6868534600 push 00465368

* Possible StringData Ref from Data Obj ->
|
:0041A747 68387D4600 push 00467D38
:0041A74C 8BCE mov ecx, esi
:0041A74E E8ADF20100 call 00439A00
:0041A753 8B4C2418 mov ecx, dword ptr [esp+18]
:0041A757 64890D00000000 mov dword ptr fs:[00000000], ecx
:0041A75E 5F pop edi
:0041A75F 5E pop esi
:0041A760 83C41C add esp, 0000001C
:0041A763 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A73E(C)
|
:0041A764 8D4C240C lea ecx, dword ptr [esp+0C]
:0041A768 E803010000 call 0041A870
:0041A76D 8B0D2C844600 mov ecx, dword ptr [0046842C]
:0041A773 C744242000000000 mov [esp+20], 00000000
:0041A77B 894C2408 mov dword ptr [esp+08], ecx

* Possible Reference to String Resource ID=00115: "1.75"
|
:0041A77F 6A73 push 00000073
:0041A781 8D4C240C lea ecx, dword ptr [esp+0C]
:0041A785 C644242401 mov [esp+24], 01
:0041A78A E8A5160200 call 0043BE34
:0041A78F 8B4664 mov eax, dword ptr [esi+64]
:0041A792 8D542408 lea edx, dword ptr [esp+08]
:0041A796 50 push eax------------------------------------在这里看到假CODE
:0041A797 51 push ecx
:0041A798 8BCC mov ecx, esp
:0041A79A 89642418 mov dword ptr [esp+18], esp
:0041A79E 52 push edx
:0041A79F E8600F0200 call 0043B704
:0041A7A4 51 push ecx
:0041A7A5 C644242C02 mov [esp+2C], 02
:0041A7AA 8BCC mov ecx, esp
:0041A7AC 89642420 mov dword ptr [esp+20], esp
:0041A7B0 57 push edi
:0041A7B1 E84E0F0200 call 0043B704
:0041A7B6 8D4C2418 lea ecx, dword ptr [esp+18]
:0041A7BA C644242C01 mov [esp+2C], 01
:0041A7BF E8CC010000 call 0041A990--------------------------------------这里看起来好像是算注册码的地方，按F8进去看看
:0041A7C4 85C0 test eax, eax
:0041A7C6 745C je 0041A824
:0041A7C8 8B3F mov edi, dword ptr [edi]
:0041A7CA E8C9D40200 call 00447C98
:0041A7CF 8B4004 mov eax, dword ptr [eax+04]
:0041A7D2 57 push edi

* Possible StringData Ref from Data Obj ->"UserName"
|
:0041A7D3 680C6A4600 push 00466A0C

* Possible StringData Ref from Data Obj ->"General"
|
:0041A7D8 68046A4600 push 00466A04
:0041A7DD 8BC8 mov ecx, eax
:0041A7DF E87D680200 call 00441061
:0041A7E4 8B7E64 mov edi, dword ptr [esi+64]
:0041A7E7 E8ACD40200 call 00447C98
:0041A7EC 8B4004 mov eax, dword ptr [eax+04]
:0041A7EF 57 push edi

* Possible StringData Ref from Data Obj ->"SerialCode"
|
:0041A7F0 68F8694600 push 004669F8

* Possible StringData Ref from Data Obj ->"General"
|
:0041A7F5 68046A4600 push 00466A04
:0041A7FA 8BC8 mov ecx, eax
:0041A7FC E860680200 call 00441061
:0041A801 6A40 push 00000040

* Possible StringData Ref from Data Obj ->
|
:0041A803 6868534600 push 00465368

* Possible StringData Ref from Data Obj ->"
|
:0041A808 68147D4600 push 00467D14
:0041A80D 8BCE mov ecx, esi
:0041A80F E8ECF10100 call 00439A00
:0041A814 8BCE mov ecx, esi

* Possible Ref to Menu: MenuID_0066, Item: ""
|

* Possible Reference to String Resource ID=00001: ""
|
:0041A816 C7465C01000000 mov [esi+5C], 00000001
:0041A81D E80D1F0200 call 0043C72F
:0041A822 EB13 jmp 0041A837

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A7C6(C)
|

* Possible Ref to Menu: MenuID_0066, Item: "s嶲堠K(A)"
|

* Possible Reference to String Resource ID=00016: "s?
|
:0041A824 6A10 push 00000010

* Possible StringData Ref from Data Obj ->
|
:0041A826 6868534600 push 00465368

* Possible StringData Ref from Data Obj ->
|
:0041A82B 68007D4600 push 00467D00
:0041A830 8BCE mov ecx, esi
:0041A832 E8C9F10100 call 00439A00----------------------------------走过这个CALL的话就玩完

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A822(U)
|
:0041A837 8D4C2408 lea ecx, dword ptr [esp+08]
:0041A83B C644242000 mov [esp+20], 00
:0041A840 E84A110200 call 0043B98F
:0041A845 8D4C240C lea ecx, dword ptr [esp+0C]
:0041A849 C7442420FFFFFFFF mov [esp+20], FFFFFFFF
:0041A851 E84A000000 call 0041A8A0
:0041A856 8B4C2418 mov ecx, dword ptr [esp+18]
:0041A85A 5F pop edi
:0041A85B 64890D00000000 mov dword ptr fs:[00000000], ecx
:0041A862 5E pop esi
:0041A863 83C41C add esp, 0000001C
:0041A866 C3 ret

:0041A867 90 nop
:0041A868 90 nop
:0041A869 90 nop
:0041A86A 90 nop
:0041A86B 90 nop
:0041A86C 90 nop
:0041A86D 90 nop
:0041A86E 90 nop
:0041A86F 90 nop

* Referenced by a CALL at Addresses:
|:0040DB2C , :0041A7BF
|
:0041A990 6AFF push FFFFFFFF-------------------------------------按F8后来到这里
:0041A992 6848EB4400 push 0044EB48
:0041A997 64A100000000 mov eax, dword ptr fs:[00000000]
:0041A99D 50 push eax
:0041A99E 64892500000000 mov dword ptr fs:[00000000], esp
:0041A9A5 83EC14 sub esp, 00000014
:0041A9A8 56 push esi
:0041A9A9 8BF1 mov esi, ecx
:0041A9AB 8D44240C lea eax, dword ptr [esp+0C]
:0041A9AF 8D54242C lea edx, dword ptr [esp+2C]
:0041A9B3 50 push eax
:0041A9B4 51 push ecx
:0041A9B5 8BCC mov ecx, esp
:0041A9B7 8964240C mov dword ptr [esp+0C], esp
:0041A9BB 52 push edx

* Possible Ref to Menu: MenuID_0066, Item: ""
|

* Possible Reference to String Resource ID=00001: ""
|
:0041A9BC C744242C01000000 mov [esp+2C], 00000001
:0041A9C4 E83B0D0200 call 0043B704
:0041A9C9 51 push ecx
:0041A9CA 8D442434 lea eax, dword ptr [esp+34]
:0041A9CE 8BCC mov ecx, esp
:0041A9D0 89642414 mov dword ptr [esp+14], esp
:0041A9D4 50 push eax
:0041A9D5 C644243002 mov [esp+30], 02
:0041A9DA E8250D0200 call 0043B704
:0041A9DF 8BCE mov ecx, esi
:0041A9E1 C644242C01 mov [esp+2C], 01
:0041A9E6 E8C5FEFFFF call 0041A8B0
:0041A9EB 8B4C2430 mov ecx, dword ptr [esp+30]
:0041A9EF 6A0A push 0000000A
:0041A9F1 8D542410 lea edx, dword ptr [esp+10]--------------------------------真CODE
:0041A9F5 51 push ecx-----------------------------------假CODE
:0041A9F6 52 push edx----------------------------------------也是刚才看到的真CODE
:0041A9F7 E834B60000 call 00426030
:0041A9FC 83C40C add esp, 0000000C
:0041A9FF C644242000 mov [esp+20], 00
:0041AA04 85C0 test eax, eax
:0041AA06 8D4C2428 lea ecx, dword ptr [esp+28]
:0041AA0A 752D jne 0041AA39
:0041AA0C E87E0F0200 call 0043B98F
:0041AA11 8D4C242C lea ecx, dword ptr [esp+2C]
:0041AA15 C7442420FFFFFFFF mov [esp+20], FFFFFFFF
:0041AA1D E86D0F0200 call 0043B98F

OK啦！我没有仔细去分析注册的地方，因为今天我高中时的同学聚会，喝多了两杯，现在的头还在痛呢，所以嗅到注册码就算了，这是一个不错的软件（我可不是作者的枪手哟!）真的很不错。但请不要用这个软件嗅人家的端口！后果自负！！！

标 题:算法说明~~~~~~~~~呵呵~~~~~~~~ (2千字)
发信人:真·伪装者
时 间:2001-2-1 3:45:10
详细信息:

0167:0041A908 MOVSX ECX,BYTE [ESP+EAX+14] 将你的用户名第一个字符放入ECX
0167:0041A90D ADD ESI,ECX ESI=ESI+ECX（第一次时ESI=0）
0167:0041A90F INC EAX EAX=EAX+1
0167:0041A910 CMP EAX,EDI 比较EAX，EDI（EDI中是你用户名的长度
0167:0041A912 JL 0041A908 EAX<EDI时往上跳，
0167:0041A914 MOV [ESP+10],ESI 以上几行的作用是将你的用户名累加
0167:0041A918 XOR ECX,ECX 清空ECX
0167:0041A91A XOR ESI,ESI 清空ESI
0167:0041A91C TEST EDI,EDI
0167:0041A91E JNG 0041A953
0167:0041A920 CMP ECX,BYTE +0A 比较ECX是否小于10
0167:0041A923 JNL 0041A958 ***这边是第一次的*** |***这边是以后的***
0167:0041A925 TEST ECX,ECX 由于第一次ECX=0所以 |以后ECX不为0
0167:0041A927 JNG 0041A930 直接跳止41A930 |所以这不跳
0167:0041A929 MOVSX EAX,BYTE [ECX+EBP-01] |将上次计算的结果放入EAX中
0167:0041A92E JMP SHORT 0041A93F |直接蹦到41A93F
0167:0041A930 MOVSX EDX,BYTE [ESP+ESI+14] 取你的用户名的第一个字符放入EDX中 |XXXXXXXXXXXXXXXXXXXXXXX
0167:0041A935 MOV EAX,[ESP+10] ESP+10中存放的是你用户名累加后的结果 |XXXXXXXXXXXXXXXXXXXXXXX
0167:0041A939 ADD EDX,ECX EDX=EDX+ECX |XXXXXXXXXXXXXXXXXXXXXXX
0167:0041A93B LEA EAX,[EDX+EAX+68] EAX=用户名累加后的结果+第一个字符+104 |XXXXXXXXXXXXXXXXXXXXXXX
0167:0041A93F CDQ |以后同左边
0167:0041A940 MOV EBX,1A EAX÷26 整数部分放入EAX
0167:0041A945 IDIV EBX 余数放入EDX
0167:0041A947 ADD EDX,BYTE +61 EDX+97
0167:0041A94A INC ESI ESI+1
0167:0041A94B MOV [ECX+EBP],DL 将DL放入ECX+EBP的值中
0167:0041A94E INC ECX ECX+1
0167:0041A94F CMP ESI,EDI 比较ESI，EDI（EDI是你用户名的长度）

示例：用户名masiqi用户名累加得644，累加结果+第一个字符（即“m”）+104=857
859÷26整数为32，余25，余数+97=122 查ASCII表得“z”
第二次122÷26 余18，余数+97=115 查ASCII表得“s”
第3次115÷26 余11，余数+97=108 查ASCII表得“l”
第4次108÷26 余4，余数+97=101 查ASCII表得“e”
第5次101÷26 余23，余数+97=120 查ASCII表得“x”
第6次120÷26 余16，余数+97=113 查ASCII表得“q”
第7次113÷26 余9，余数+97=106 查ASCII表得“j”
第8次106÷26 余2，余数+97=99 查ASCII表得“c”
第9次99÷26 余21，余数+97=118 查ASCII表得“v”
第10次118÷26 余14，余数+97=111 查ASCII表得“o”


鹦鹉螺网络助手1.75

标 题:鹦鹉螺网络助手 1.75 破解手记 (1千字)
发信人:孙锋
时 间:2001-1-30 18:19:57
详细信息:
鹦鹉螺网络助手 1.75 破解手记

作者：孙 锋
地址：山东省曲阜师范大学电教系97级142#
Email： sffs@263.net
最新的版本是：1.75，下载地址：http://netkit.top263.net.破解方法和以前的一样，下面是破解过程：

步骤：
1、随便输入注册信息，我的是：
用户名：sunfeng
注册码：1212121212
2、启动TRW2000，OK载入内存。bpx hmemcpy万能中断，F5返回程序领域。
3、点击确定按钮，被TRW2000拦截到，BD *中断所有中断，F12共12次，然后F10到下面的
位置：
0167：0041A7BF CALL 0041A990 ；----->此处用F8跟踪进入CALL内部
4、F8进入CALL内部，然后一直F10到下面的位置：
0167：0041A9F6 PUCH EDX ；-------->D EDX。这里是正确的注册码
得到正确的注册码是：pibungzsle
5、整理：
用户名：sunfeng
注册码：pibungzsle
6、另外注册码：
用户名：孙锋
注册码：Sfyrkdwpib
7、其他注册码：

用户名------------注册码-----

灰松鼠------------Lyrkdwpibu
番外地------------Wjcvohatmf
自由用户----------Kxqjcvohat
我就喜欢盗版------[ngzslexqj

<---------完--------->


ajpegcompr

标 题:谁来试试这个软件。。。。 (296字)
发信人:1212
时 间:2001-1-15 13:57:55
详细信息:
http://software.wx88.net/down/ajpegcompr.exe

JPEG图片压缩软件，没注册让压了之后不让你存！！！

选'HELP-->PURCHASE A LICENSE-->TELEPHONE',他会打开网页，关掉它，再重复一次，就可以输入注册码了！

我更改之后它显示注册成功，一存盘它又出来叫我注册，不知道它在其它的什么地方还有检测，请高人出手！

标 题:解了！它是用Delphi写的，用DEDE反它，改个地方就行了！ (4千字)
发信人:1122
时 间:2001-1-17 16:51:53
详细信息:

Dede是个好东东！

现在已可以存盘了，但是在About里还是没注册！

问题是现在想注册也注册不了！输入注册码的窗口根本出不来！我靠。

0049F84C 55 push ebp
0049F84D 8BEC mov ebp, esp
0049F84F 6A00 push $00
0049F851 6A00 push $00
0049F853 53 push ebx
0049F854 56 push esi
0049F855 8BD8 mov ebx, eax
0049F857 33C0 xor eax, eax
0049F859 55 push ebp

* Possible String Reference to: '開;?腓^[YY]脥@'
|
0049F85A 681CF94900 push $0049F91C

***** TRY
|
0049F85F 64FF30 push dword ptr fs:[eax]
0049F862 648920 mov fs:[eax], esp

* Reference to field TMainForm.OFFS_07A4
|
0049F865 80BBA407000000 cmp byte ptr [ebx+$07A4], $00
0049F86C 0F8483000000 jz 0049F8F5
0049F872 8BC3 mov eax, ebx

* Reference to: Forms.TCustomForm.GetActiveMDIChild()
|
0049F874 E8F769FAFF call 00446270

* Possible reference to class TImageForm
|
0049F879 8B1578874900 mov edx, [$498778]

* Reference to: System..AsClass()
|
0049F87F E8D836F6FF call 00402F5C
0049F884 8BF0 mov esi, eax
0049F886 8D55FC lea edx, [ebp-$04]

* Reference to control TMainForm.FileCloseAction : TWindowClose
|
0049F889 8B8644030000 mov eax, [esi+$0344]

* Reference to: Sysutils.ExtractFileName(System.AnsiString)
|
0049F88F E8248EF6FF call 004086B8
0049F894 8B55FC mov edx, [ebp-$04]

* Reference to control TMainForm.SaveDialog : TSavePictureDialog
|
0049F897 8B83E0040000 mov eax, [ebx+$04E0]
0049F89D 83C06C add eax, +$6C

* Reference to: System..LStrAsg()
|
0049F8A0 E8F341F6FF call 00403A98

* Reference to control TMainForm.SaveDialog : TSavePictureDialog
|
0049F8A5 8B83E0040000 mov eax, [ebx+$04E0]
0049F8AB 8B10 mov edx, [eax]

* Reference to method TSavePictureDialog.Execute()
|
0049F8AD FF523C call dword ptr [edx+$3C]
0049F8B0 84C0 test al, al
0049F8B2 744A jz 0049F8FE 《《《这里就去购买了，所以不能去！
0049F8B4 8D55F8 lea edx, [ebp-$08]

* Reference to control TMainForm.SaveDialog : TSavePictureDialog
|
0049F8B7 8B83E0040000 mov eax, [ebx+$04E0]

* Reference to: Dialogs.TOpenDialog.GetFileName()
|
0049F8BD E84617FBFF call 00451008
0049F8C2 8B55F8 mov edx, [ebp-$08]
0049F8C5 33C9 xor ecx, ecx
0049F8C7 8BC6 mov eax, esi
|
0049F8C9 E83A9AFFFF call 00499308
0049F8CE 8D55F8 lea edx, [ebp-$08]

* Reference to control TMainForm.SaveDialog : TSavePictureDialog
|
0049F8D1 8BB3E0040000 mov esi, [ebx+$04E0]
0049F8D7 8BC6 mov eax, esi

* Reference to: Dialogs.TOpenDialog.GetFileName()
|
0049F8D9 E82A17FBFF call 00451008
0049F8DE 8B45F8 mov eax, [ebp-$08]
0049F8E1 8D55FC lea edx, [ebp-$04]

* Reference to: Sysutils.ExtractFilePath(System.AnsiString)
|
0049F8E4 E89B8DF6FF call 00408684
0049F8E9 8B55FC mov edx, [ebp-$04]
0049F8EC 8BC6 mov eax, esi

* Reference to: Dialogs.TOpenDialog.SetInitialDir(System.AnsiString)
|
0049F8EE E87D17FBFF call 00451070
0049F8F3 EB09 jmp 0049F8FE
0049F8F5 33D2 xor edx, edx
0049F8F7 8BC3 mov eax, ebx

* Reference to : TMainForm.HelpPurchaseItemClick()-->模仿单机购买项！
|
0049F8F9 E8E2130000 call 004A0CE0
0049F8FE 33C0 xor eax, eax
0049F900 5A pop edx
0049F901 59 pop ecx
0049F902 59 pop ecx
0049F903 648910 mov fs:[eax], edx

现在功能已没限制了，但也不要你输入注册码了！
可是在ABOUT里还是显示“Unauthorized”，不知怎么回事？

标 题:稍有不同的破解 (6千字)
发信人:henryw
时 间:2001-1-18 9:19:53
详细信息:

看了1212兄写的破解提示，很有启发，也试用dede反汇编了一把，
想法和1212兄稍有不同。

procedure TMainForm.FileSaveActionExecute(Sender: TObject);{?}
begin
{
0049F7DC 53 push ebx
0049F7DD 56 push esi
0049F7DE 8BF2 mov esi, edx
0049F7E0 8BD8 mov ebx, eax
0049F7E2 8BC6 mov eax, esi
0049F7E4 8B1578874900 mov edx, [$498778]
0049F7EA E85537F6FF call 00402F44
0049F7EF 84C0 test al, al
0049F7F1 740F jz 0049F802
0049F7F3 8BC6 mov eax, esi
0049F7F5 8B1578874900 mov edx, [$498778]
0049F7FB E85C37F6FF call 00402F5C
0049F800 EB12 jmp 0049F814
0049F802 8BC3 mov eax, ebx
0049F804 E8676AFAFF call 00446270
0049F809 8B1578874900 mov edx, [$498778]
0049F80F E84837F6FF call 00402F5C
0049F814 80BBA407000000 cmp byte ptr [ebx+$07A4], $00
0049F81B 7420 jz 0049F83D <----------- 此地不能去，要9090--------
0049F81D 80B87403000000 cmp byte ptr [eax+$0374], $00
0049F824 740B jz 0049F831
0049F826 33C9 xor ecx, ecx
0049F828 33D2 xor edx, edx
0049F82A E8D99AFFFF call 00499308
0049F82F EB15 jmp 0049F846
0049F831 8BD3 mov edx, ebx
0049F833 8BC3 mov eax, ebx

* Reference to : TMainForm.FileSaveAsActionExecute
|
0049F835 E812000000 call 0049F84C
0049F83A 5E pop esi
0049F83B 5B pop ebx
0049F83C C3 ret

0049F83D 33D2 xor edx, edx
0049F83F 8BC3 mov eax, ebx

* Reference to : TMainForm.HelpPurchaseItemClick
|
0049F841 E89A140000 call 004A0CE0
0049F846 5E pop esi
0049F847 5B pop ebx
0049F848 C3 ret

}
end ;

procedure TMainForm.FileSaveAsActionExecute(Sender: TObject);{?}
begin
{
0049F84C 55 push ebp
0049F84D 8BEC mov ebp, esp
0049F84F 6A00 push $00
0049F851 6A00 push $00
0049F853 53 push ebx
0049F854 56 push esi
0049F855 8BD8 mov ebx, eax
0049F857 33C0 xor eax, eax
0049F859 55 push ebp

* Possible String Reference to: "開;?腓^[YY]脥@"
|
0049F85A 681CF94900 push $0049F91C

***** TRY
|
0049F85F 64FF30 push dword ptr fs:[eax]
0049F862 648920 mov fs:[eax], esp
0049F865 80BBA407000000 cmp byte ptr [ebx+$07A4], $00
0049F86C 0F8483000000 jz 0049F8F5 <------------改成0F85---------------
0049F872 8BC3 mov eax, ebx
0049F874 E8F769FAFF call 00446270
0049F879 8B1578874900 mov edx, [$498778]
0049F87F E8D836F6FF call 00402F5C
0049F884 8BF0 mov esi, eax
0049F886 8D55FC lea edx, [ebp-$04]
0049F889 8B8644030000 mov eax, [esi+$0344]
0049F88F E8248EF6FF call 004086B8
0049F894 8B55FC mov edx, [ebp-$04]
0049F897 8B83E0040000 mov eax, [ebx+$04E0]
0049F89D 83C06C add eax, +$6C
0049F8A0 E8F341F6FF call 00403A98
0049F8A5 8B83E0040000 mov eax, [ebx+$04E0]
0049F8AB 8B10 mov edx, [eax]
0049F8AD FF523C call dword ptr [edx+$3C]
0049F8B0 84C0 test al, al
0049F8B2 744A jz 0049F8FE
0049F8B4 8D55F8 lea edx, [ebp-$08]
0049F8B7 8B83E0040000 mov eax, [ebx+$04E0]
0049F8BD E84617FBFF call 00451008
0049F8C2 8B55F8 mov edx, [ebp-$08]
0049F8C5 33C9 xor ecx, ecx
0049F8C7 8BC6 mov eax, esi
0049F8C9 E83A9AFFFF call 00499308
0049F8CE 8D55F8 lea edx, [ebp-$08]
0049F8D1 8BB3E0040000 mov esi, [ebx+$04E0]
0049F8D7 8BC6 mov eax, esi
0049F8D9 E82A17FBFF call 00451008
0049F8DE 8B45F8 mov eax, [ebp-$08]
0049F8E1 8D55FC lea edx, [ebp-$04]
0049F8E4 E89B8DF6FF call 00408684
0049F8E9 8B55FC mov edx, [ebp-$04]
0049F8EC 8BC6 mov eax, esi
0049F8EE E87D17FBFF call 00451070
0049F8F3 EB09 jmp 0049F8FE
0049F8F5 33D2 xor edx, edx
0049F8F7 8BC3 mov eax, ebx

* Reference to : TMainForm.HelpPurchaseItemClick
|
0049F8F9 E8E2130000 call 004A0CE0
0049F8FE 33C0 xor eax, eax
0049F900 5A pop edx
0049F901 59 pop ecx
0049F902 59 pop ecx
0049F903 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: "^[YY]脥@"
|
0049F906 6823F94900 push $0049F923
0049F90B 8D45F8 lea eax, [ebp-$08]
0049F90E E83141F6FF call 00403A44
0049F913 8D45FC lea eax, [ebp-$04]
0049F916 E82941F6FF call 00403A44
0049F91B C3 ret

0049F91C E95F3BF6FF jmp 00403480
0049F921 EBE8 jmp 0049F90B

****** END
|
0049F923 5E pop esi
0049F924 5B pop ebx
0049F925 59 pop ecx
0049F926 59 pop ecx
0049F927 5D pop ebp
0049F928 C3 ret

}
end ;

如此一来，并没有影响注册的对话框，不过，相信输入正确的注册号以后，估计那个OF85还需要改成0F84。
BTW: 1212兄，假如在49F8B2处改动成9090，注册对话框似乎依旧会跳出，恐怕和下面一条49F8F3有关？

标 题:哈哈。。。。我是1122，不是1212！ (1千字)
发信人:1122
时 间:2001-1-18 11:24:50
详细信息:

其实我在实际改的时候并不是如我上篇写的那样只改jz就行了！我只是为少打几个字才说了一下重点！其实你可以在下面这个Call dword ptr[edx+83c]进去，看看到为什么AL会等于1，最后我发出现出来对话框其实决定于
我认为你能让注册窗口跳出来强行跳转的结果，没有挖出它的根！

* Reference to method TSavePictureDialog.Execute()
|
0049F8AD FF523C call dword ptr [edx+$3C]
0049F8B0 84C0 test al, al
0049F8B2 744A jz 0049F8FE 《《《这里就去购买了，所以不能去！
0049F8B4 8D55F8 lea edx, [ebp-$08]

其实你可以在上面这个Call dword ptr[edx+83c]进去，看看到为什么AL会等于1，最后我发出现出来对话框其实决定于:

0049F814 80BBA407000000 cmp byte ptr [ebx+$07A4], $00

你也可以锁定ebx+07a4，看它什么时候变成1。
[ebx+$07a4],[ebx+$07a5]两个地址处的内容非常重要，你跟进了上面我说的那个CALL!

[ebx+07a4]决定是否功能限制，如是为“1”，它会把[ebx+07a5]置0，否则以上两个值就相反.

而[ebx+07a5]决定是否出来填写注册码的对话框，所以如果你能让[ebx+07a4]=1，[ebx+07a5]=0应该就是注册版了！

最后我的改法如下：

1.找:0F8C65010000E871F1FFFF
改:909090909090----------

2.找:0F9C4F010000C645FF01
改:909090909090--------

3.找:7D04C645FF008B45F0
改:EB----------------

它们的具体offset我没记下来！你应该可以找得到，看看这几个地方的代码你就会明白了。

以上是我的观点，敬请指正！呵呵。。。。。。

热烈欢迎继续讨论！


Ativa Pro v3.18

 标 题:用DeDe破解------Ativa Pro v3.18 的破文 (8千字)
发信人:lancelot[CCG]
时 间:2001-8-29 23:15:52
详细信息:
1)用DeDe载入 Ativa pro v3.18
2)在Procedures一栏中找到 Unit Name: KeyRegister Class Name: TfmKeyRegister
单击它，右栏中会出现很多 Event(记得选上右栏上方的 Events)
3)在 Event 一栏中找到 btnOKClick(就是你输完注册码后点击的OK按钮)
用鼠标右键点击，选 Disassemble,重这里开始反汇编。就可以看到......
===============================================================================

004E6400 55 push ebp
004E6401 8BEC mov ebp, esp
004E6403 81C410FFFFFF add esp, $FFFFFF10
004E6409 53 push ebx
004E640A 56 push esi
004E640B 57 push edi
004E640C 33C9 xor ecx, ecx
004E640E 898D10FFFFFF mov [ebp+$FFFFFF10], ecx
004E6414 898D14FFFFFF mov [ebp+$FFFFFF14], ecx
004E641A 898D18FFFFFF mov [ebp+$FFFFFF18], ecx
004E6420 898D1CFFFFFF mov [ebp+$FFFFFF1C], ecx
004E6426 898D28FFFFFF mov [ebp+$FFFFFF28], ecx
004E642C 898D24FFFFFF mov [ebp+$FFFFFF24], ecx
004E6432 898D20FFFFFF mov [ebp+$FFFFFF20], ecx
004E6438 894DFC mov [ebp-$04], ecx
004E643B 894DF8 mov [ebp-$08], ecx
004E643E 8BF0 mov esi, eax
004E6440 33C0 xor eax, eax
004E6442 55 push ebp

* Possible String Reference to: '轺伛�胨_^[嬪]?
|
004E6443 686C664E00 push $004E666C

***** TRY
|
004E6448 64FF30 push dword ptr fs:[eax]
004E644B 648920 mov fs:[eax], esp
004E644E 8D9528FFFFFF lea edx, [ebp+$FFFFFF28]

* Reference to control TfmKeyRegister.editReg1 : TEdit<-------------读取第1个注册码输入框
|
004E6454 8B86E8020000 mov eax, [esi+$02E8]

|
004E645A E81547F5FF call 0043AB74
004E645F FFB528FFFFFF push dword ptr [ebp+$FFFFFF28]
004E6465 6884664E00 push $004E6684
004E646A 8D9524FFFFFF lea edx, [ebp+$FFFFFF24]

* Reference to control TfmKeyRegister.editReg2 : TEdit<-------------读取第2个注册码输入框
|
004E6470 8B86EC020000 mov eax, [esi+$02EC]

|
004E6476 E8F946F5FF call 0043AB74
004E647B FFB524FFFFFF push dword ptr [ebp+$FFFFFF24]
004E6481 6884664E00 push $004E6684
004E6486 8D9520FFFFFF lea edx, [ebp+$FFFFFF20]

* Reference to control TfmKeyRegister.editReg3 : TEdit<-------------读取第3个注册码输入框
|
004E648C 8B86F0020000 mov eax, [esi+$02F0]

|
004E6492 E8DD46F5FF call 0043AB74
004E6497 FFB520FFFFFF push dword ptr [ebp+$FFFFFF20]
004E649D 8D45FC lea eax, [ebp-$04]
004E64A0 BA05000000 mov edx, $00000005

* Reference to: system.@LStrCatN;<---------------------------------把它们连接在一起
|
004E64A5 E84AE4F1FF call 004048F4
004E64AA B201 mov dl, $01

* Reference to class TssLicenseReg
|
004E64AC A104504E00 mov eax, dword ptr [$4E5004]

|
004E64B1 E8BEEBFFFF call 004E5074
004E64B6 8BF8 mov edi, eax
004E64B8 56 push esi
004E64B9 57 push edi

* Possible String Reference to: 'DT2{6%;7+*mAeLV6~uIG{hC88mUGFf)y,%Q
| |P/qT 8KY |m.{=-t\m^=3@,Ic(d#52=;)'
|
004E64BA BE88664E00 mov esi, $004E6688
004E64BF 8DBD2FFFFFFF lea edi, [ebp+$FFFFFF2F]
004E64C5 B911000000 mov ecx, $00000011
004E64CA F3 rep
004E64CB A5 movsd
004E64CC A4 movsb
004E64CD 5F pop edi
004E64CE 5E pop esi
004E64CF 8D851CFFFFFF lea eax, [ebp+$FFFFFF1C]
004E64D5 8D952FFFFFFF lea edx, [ebp+$FFFFFF2F]

* Reference to: system.@LStrFromString(String;ShortString);
| or: system.@WStrFromString(WideString;ShortString);
|
004E64DB E8F8E2F1FF call 004047D8
004E64E0 8B951CFFFFFF mov edx, [ebp+$FFFFFF1C]
004E64E6 8D4DF8 lea ecx, [ebp-$08]
004E64E9 8BC7 mov eax, edi

|
004E64EB E8E4ECFFFF call 004E51D4
004E64F0 8B55FC mov edx, [ebp-$04]
004E64F3 8BC7 mov eax, edi

|
004E64F5 E86AEDFFFF call 004E5264<--------------核心，双击这个Call跟进去
004E64FA 8BD8 mov ebx, eax
004E64FC 8BC7 mov eax, edi

* Reference to: system.TObject.Free(TObject);
|
004E64FE E8A9D2F1FF call 004037AC
004E6503 84DB test bl, bl
004E6505 0F8588000000 jnz 004E6593<--------------这里一定要跳，(用TRW跟过)
===========================================================================================
004E5264 55 push ebp
004E5265 8BEC mov ebp, esp
004E5267 6A00 push $00
004E5269 6A00 push $00
004E526B 6A00 push $00
004E526D 53 push ebx
004E526E 56 push esi
004E526F 57 push edi
004E5270 8955FC mov [ebp-$04], edx
004E5273 8BF0 mov esi, eax
004E5275 8B45FC mov eax, [ebp-$04]

* Reference to: system.@LStrAddRef;
|
004E5278 E86BF7F1FF call 004049E8
004E527D 33C0 xor eax, eax
004E527F 55 push ebp

* Possible String Reference to: '閰祚�腚嬅_^[嬪]脣繳嬱兡鳶V3蹓]鴭駢U
| 鼖貗E荟?3繳hbSN'
|
004E5280 68DE524E00 push $004E52DE

***** TRY
|
004E5285 64FF30 push dword ptr fs:[eax]
004E5288 648920 mov fs:[eax], esp
004E528B 33DB xor ebx, ebx
004E528D BF11270000 mov edi, $00002711
004E5292 8D55F8 lea edx, [ebp-$08]
004E5295 8BC7 mov eax, edi

|
004E5297 E82449F2FF call 00409BC0
004E529C 8D4DF4 lea ecx, [ebp-$0C]
004E529F 8B55F8 mov edx, [ebp-$08]
004E52A2 8BC6 mov eax, esi

|
004E52A4 E847000000 call 004E52F0
004E52A9 8B45F4 mov eax, [ebp-$0C]<--------真注册码
004E52AC 8B55FC mov edx, [ebp-$04]<--------假注册码

* Reference to: system.@LStrCmp;<---------------------------------这个一看就知道在干嘛，向上看
|
004E52AF E890F6F1FF call 00404944
004E52B4 7504 jnz 004E52BA
004E52B6 B301 mov bl, $01
004E52B8 EB09 jmp 004E52C3
004E52BA 47 inc edi
004E52BB 81FFE12E0000 cmp edi, $00002EE1
004E52C1 75CF jnz 004E5292
004E52C3 33C0 xor eax, eax
004E52C5 5A pop edx
004E52C6 59 pop ecx
004E52C7 59 pop ecx
004E52C8 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '嬅_^[嬪]脣繳嬱兡鳶V3蹓]鴭駢U鼖貗E
| 荟?3繳hbSN'
|
004E52CB 68E5524E00 push $004E52E5
004E52D0 8D45F4 lea eax, [ebp-$0C]
004E52D3 BA03000000 mov edx, $00000003

* Reference to: system.@LStrArrayClr;
|
004E52D8 E8D3F2F1FF call 004045B0
004E52DD C3 ret

004E52DE E985ECF1FF jmp 00403F68
004E52E3 EBEB jmp 004E52D0

****** END
|
004E52E5 8BC3 mov eax, ebx
004E52E7 5F pop edi
004E52E8 5E pop esi
004E52E9 5B pop ebx
004E52EA 8BE5 mov esp, ebp
004E52EC 5D pop ebp
004E52ED C3 ret
==============================================================================================
4)启用TRW 设断在 004E52A9，运行 Ativa Pro v3.18, 拦下, 下 d eax
就可以看到注册码为：DJEO-J2AD-JFBG (不同的电脑各不相同)

Crack by lancelot[CCG][FCG] 2001.08.29


DUN Meter 2.

 标 题:目标--dephi(1), SoftSol Ativa DUN Meter 2.3
发信人:小楼
时 间:2000-12-3 12:16:17
详细信息:
目标--dephi
SoftSol Ativa DUN Meter 2.3

类似于VB，dephi也是一种面向对象的编程语言。同时因为它的一些特性，所以关于dephi编译的程序破解也有一些可以取巧之处。关于dephi的逆向工程国外已经有人专文进行了探讨，而在国内还鲜有人提及。在此仅就使用DEDE2.42－－一个dephi反编译工具进行介绍。
目标：SoftSol Ativa DUN Meter 2.3 一个网络下载数据测量工具。

首先用DEDE2.42反编译ativa.exe。
1、在Form面板中找到一个ClassName叫TfmKeyRegister，单击后就可以见到“注册”窗体中各个对象的属性及相互关系。
......
object btnOK: TButton <--注册按钮
Left = 230 <--
Top = 292 |
Width = 75 |按钮的大小尺寸
Height = 23 <--
Caption = '&OK' <--按钮的名字
TabOrder = 0
OnClick = btnOKClick <--按下按钮后击发的事件
end
......
object editReg1: TEdit <--
Left = 80 |
Top = 237 |
Width = 90 |注册码填入框1
Height = 21 |
MaxLength = 6 |
TabOrder = 2 |
end <--
object editReg2: TEdit <--
Left = 188 |
Top = 237 |
Width = 90 |注册码填入框2
Height = 21 |
MaxLength = 6 |
TabOrder = 3 |
end <--
object editReg3: TEdit <--
Left = 297 |
Top = 237 |
Width = 90 |注册码填入框3
Height = 21 |
MaxLength = 6 |
TabOrder = 4 |
end <--

2、在Procedures面板中可以看到一个UnitName，名为KeyRegister，双击名为btnOKClick的事件，
......
* Reference to control TfmKeyRegister.editReg1 : TEdit
|
004835C6 8B86E8020000 mov eax, [esi+$02E8]

* Reference to: Controls.TControl.GetText() <--取注册框1的内容
|
004835CC E8178FFBFF call 0043C4E8
004835D1 8B45FC mov eax, [ebp-$04]

* Possible String Reference to: '560616'
|
004835D4 BA00374800 mov edx, $00483700

* Reference to: System..LStrCmp()
|
004835D9 E8D208F8FF call 00403EB0 <-- ＝560616 ?
004835DE 7402 jz 004835E2
004835E0 33DB xor ebx, ebx
004835E2 8D55F8 lea edx, [ebp-$08]

* Reference to control TfmKeyRegister.editReg2 : TEdit
|
004835E5 8B86EC020000 mov eax, [esi+$02EC]

* Reference to: Controls.TControl.GetText() <--取注册框2的内容
|
004835EB E8F88EFBFF call 0043C4E8
004835F0 8B45F8 mov eax, [ebp-$08]

* Possible String Reference to: '201839'
|
004835F3 BA10374800 mov edx, $00483710

* Reference to: System..LStrCmp()
|
004835F8 E8B308F8FF call 00403EB0
004835FD 7402 jz 00483601 <-- ＝ 201839 ?
004835FF 33DB xor ebx, ebx
00483601 8D55F4 lea edx, [ebp-$0C]

* Reference to control TfmKeyRegister.editReg3 : TEdit
|
00483604 8B86F0020000 mov eax, [esi+$02F0]

* Reference to: Controls.TControl.GetText() <--取注册框3的内容
|
0048360A E8D98EFBFF call 0043C4E8
0048360F 8B45F4 mov eax, [ebp-$0C]

* Reference to: System..DynArrayLength()
| or: System..LStrLen() <--得到注册框3字窜长度
|
00483612 E88907F8FF call 00403DA0
00483617 83F806 cmp eax, +$06
0048361A 7D02 jnl 0048361E >=6, OK!
0048361C 33DB xor ebx, ebx
0048361E 84DB test bl, bl
00483620 7530 jnz 00483652
00483622 6A00 push $00
00483624 668B0D18374800 mov cx, word ptr [$483718]
0048362B B201 mov dl, $01

* Possible String Reference to: 'The Code you have entered is invali
| d. Please try again.'
|
0048362D B824374800 mov eax, $00483724
......
00483652 8D55F0 lea edx, [ebp-$10]
......
* Possible String Reference to: 'Congratulations and thankyou. You
| have successfully registered Ativa
| DUN Meter.'
|
004836B6 B868374800 mov eax, $00483768

END


FAQGenie

标 题:破解FAQGenie (4千字)
发信人:henryw
时 间:2001-4-10 13:28:30
详细信息:
破解FAQGenie

[软件简介]
FAQGenie是一个专门用来作FAQ网页的软件。不注册30天限制。
在www.inhua.com有下载。

[破解工具]
DeDe 2.50
trw2000
W32Dasm

[破解经过]
简单的发现：
(1) FI报告是Delphi程序。
(2) 启动软件，没有发现输入注册码的地方，只告诉你，NOT LICENSED（没有注册）。

用DeDe处理一下，看到下面的东东：

procedure TfrmMain.LogoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
{
00491158 55 push ebp
00491159 8BEC mov ebp, esp
0049115B 53 push ebx
0049115C 8BD8 mov ebx, eax
0049115E 80F901 cmp cl, $01
00491161 7523 jnz 00491186
00491163 803D505A490000 cmp byte ptr [$495A50], $00
0049116A 741A jz 00491186
0049116C B201 mov dl, $01

* Reference to control TfrmMain.edtRegCode : TEdit
|
0049116E 8B83E8020000 mov eax, [ebx+$02E8]

* Reference to: controls.TControl.SetVisible(TControl;System.Boolean);
|
00491174 E843CEF9FF call 0042DFBC
00491179 B201 mov dl, $01

* Reference to control TfrmMain.lblRegCode : TLabel
|
0049117B 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: controls.TControl.SetVisible(TControl;System.Boolean);
|
00491181 E836CEF9FF call 0042DFBC
00491186 5B pop ebx
00491187 5D pop ebp
00491188 C20C ret $0C

}
end ;

这是什么？我猜是鼠标对logo进行操作后，便出现可以输入注册码的东东了。
开始试验，经过数分钟的乱试，发现只要先对滚动字符的地方双击，然后用鼠标右键点击logo，
注册码输入的地方就显示出来了。

如何拦住输入的注册码呢？用hmemcpy试了一下，没成功。

正在苦恼之际，看了一下W32Dasm里面的stringlist，发现有几处关于RegCode的地方。这是其中一处。

* Referenced by a CALL at Addresses:
|:0048A371 , :0048A3B8 , :0048A57B , :0048CFF8 , :0048DDBD
|:0048E632 , :00490158 , :00490AD4 , :004911D9
|
:00490B78 55 push ebp
:00490B79 8BEC mov ebp, esp
:00490B7B 6A00 push 00000000
:00490B7D 6A00 push 00000000
:00490B7F 53 push ebx
:00490B80 56 push esi
:00490B81 33C0 xor eax, eax
:00490B83 55 push ebp
:00490B84 681D0C4900 push 00490C1D
:00490B89 64FF30 push dword ptr fs:[eax]
:00490B8C 648920 mov dword ptr fs:[eax], esp
:00490B8F 33DB xor ebx, ebx
:00490B91 C705485A49008DECA200 mov dword ptr [00495A48], 00A2EC8D
:00490B9B 8D45FC lea eax, dword ptr [ebp-04]
:00490B9E 50 push eax
:00490B9F 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"RegCode"
|
:00490BA1 BA340C4900 mov edx, 00490C34

* Possible StringData Ref from Code Obj ->"Software\Virdi Software\FAQGenie"
|
:00490BA6 B8440C4900 mov eax, 00490C44
:00490BAB E8F04BFFFF call 004857A0
:00490BB0 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"TBase64SV勔t兡痂叮?嬟嬸3覌畦仩?艶嬈勠t?
->"颍?d?"
| <------ 注册码变成base64编码后放入注册表里面去?
:00490BB2 A1808C4800 mov eax, dword ptr [00488C80]
:00490BB7 E81881FFFF call 00488CD4
:00490BBC 8BF0 mov esi, eax
:00490BBE 8D4DF8 lea ecx, dword ptr [ebp-08]
:00490BC1 8B55FC mov edx, dword ptr [ebp-04]
:00490BC4 8BC6 mov eax, esi
:00490BC6 E86584FFFF call 00489030
:00490BCB 8BC6 mov eax, esi
:00490BCD E8CE21F7FF call 00402DA0
:00490BD2 33D2 xor edx, edx
:00490BD4 8B45F8 mov eax, dword ptr [ebp-08]
:00490BD7 E86C73F7FF call 00407F48
:00490BDC A34C5A4900 mov dword ptr [00495A4C], eax <------ ? eax可以看见假注册码
:00490BE1 A1485A4900 mov eax, dword ptr [00495A48]
:00490BE6 3B054C5A4900 cmp eax, dword ptr [00495A4C] <------ ? eax就是真注册码了。假的和真的作比较。
:00490BEC 7514 jne 00490C02
:00490BEE A1105A4900 mov eax, dword ptr [00495A10]
:00490BF3 8B8048040000 mov eax, dword ptr [eax+00000448]
:00490BF9 B201 mov dl, 01
:00490BFB E8BCD3F9FF call 0042DFBC
:00490C00 B301 mov bl, 01

输入注册码后，需要退出程序然后重新进入，就会发现是注册版了。


FastBrowser 3.4

标 题:去除FastBrowser 3.4(Normal version)广告条的“可能” 方法 (1千字)
发信人:小楼
时 间:2001-4-21 10:27:31
详细信息:
去除Fast Browser 3.4 (Normal version)广告条

因为我使用169帐户，此软件不显示广告条,我只是根据广告条位置来大致完成修改工作。
总是习惯用file info查看程序，结果是FastBrowser.exe由DEPHI编写，thank god! DEPHI的应用可能使我的工作更简单。

用EXESCOPE打开FastBrowser.exe
resource\RCData\TFastBrowserForm下看到
object AdPanel: TPanel <--广告条？
Left = 326 <-
Top = 25 |
Width = 464 | 位置、形状
Height = 60 <-
Align = alRight
BevelOuter = bvNone
ParentColor = True
TabOrder = 1
object NewBevel2: TNewBevel
Left = 4
Top = -1
Width = 472
Height = 61
Style = deSunken
Visible = False
end
object FlexActive1: TFlexActive
Left = 0
Top = 0
Width = 468
Height = 60
TabOrder = 0
ControlData = {
000300005F30000034060000000000050800000066006200660076000C000000
31003100310031003100310000000000000200000001000000000101}
end
end
将上述内容全部删除后保存，广告条没有了，但我不知道实际效果如何？


Gypsee Pro 1.6

标 题:请问如何拦截Gypsee Pro 1.6？用bpx hmemcpy拦不住。 (381字)
发信人:2323
时 间:2001-3-19 10:06:42
详细信息:
软件名称：Gypsee Pro
整理日期：2001.3.18
最新版本：1.6
文件大小：1351KB
软件授权：免费软件
使用平台：Win9x/Me/NT/2000
发布公司：Home Page
软件简介：建立内含音乐的动画 GIF，该软件能使用 MIDI/WAV 文件给动画 GIF 文件插入背景音乐或音效，该软件支持 GIF 文件优化，还可将其转化为可执行文件。

下载：http://www.newhua.com/Gypsee.htm
或 http://www.onlinedown.net/Gypsee.htm

标 题:用UPX解压 (7千字)
发信人:blowfish
时 间:2001-3-19 12:20:57
详细信息:

存放注册码的文件：GYPSEE.KEY
注册标志：DS:[004F39AC]，为0则已注册。
没仔细看注册码。

:004EDCA0 803DAC394F0000 cmp byte ptr [004F39AC], 00
:004EDCA7 0F849A010000 je 004EDE47
:004EDCAD 8D55D8 lea edx, dword ptr [ebp-28]
:004EDCB0 A16C3D4F00 mov eax, dword ptr [004F3D6C]
:004EDCB5 8B00 mov eax, dword ptr [eax]
:004EDCB7 E890BFF4FF call 00439C4C
:004EDCBC 8B45D8 mov eax, dword ptr [ebp-28]
:004EDCBF 8D55DC lea edx, dword ptr [ebp-24]
:004EDCC2 E871B0F1FF call 00408D38
:004EDCC7 8D45DC lea eax, dword ptr [ebp-24]

* Possible StringData Ref from Code Obj ->"\GYPSEE.KEY"
|
:004EDCCA BA4CE04E00 mov edx, 004EE04C
:004EDCCF E86463F1FF call 00404038
:004EDCD4 8B45DC mov eax, dword ptr [ebp-24]
:004EDCD7 E86CADF1FF call 00408A48
:004EDCDC 84C0 test al, al
:004EDCDE 0F8425010000 je 004EDE09
:004EDCE4 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"l2A"
|
:004EDCE6 A1ECF84000 mov eax, dword ptr [0040F8EC]
:004EDCEB E86853F1FF call 00403058
:004EDCF0 8BF0 mov esi, eax
:004EDCF2 8D55D0 lea edx, dword ptr [ebp-30]
:004EDCF5 A16C3D4F00 mov eax, dword ptr [004F3D6C]
:004EDCFA 8B00 mov eax, dword ptr [eax]
:004EDCFC E84BBFF4FF call 00439C4C
:004EDD01 8B45D0 mov eax, dword ptr [ebp-30]
:004EDD04 8D55D4 lea edx, dword ptr [ebp-2C]
:004EDD07 E82CB0F1FF call 00408D38
:004EDD0C 8D45D4 lea eax, dword ptr [ebp-2C]

* Possible StringData Ref from Code Obj ->"\GYPSEE.KEY"
|
:004EDD0F BA4CE04E00 mov edx, 004EE04C
:004EDD14 E81F63F1FF call 00404038
:004EDD19 8B55D4 mov edx, dword ptr [ebp-2C]
:004EDD1C 8BC6 mov eax, esi
:004EDD1E E8CD54F2FF call 004131F0
:004EDD23 8BC6 mov eax, esi
:004EDD25 E88E50F2FF call 00412DB8
:004EDD2A 8BD0 mov edx, eax
:004EDD2C 83EA04 sub edx, 00000004
:004EDD2F 33C9 xor ecx, ecx
:004EDD31 8BC6 mov eax, esi
:004EDD33 8B38 mov edi, dword ptr [eax]
:004EDD35 FF570C call [edi+0C]
:004EDD38 8D55F8 lea edx, dword ptr [ebp-08]
:004EDD3B B904000000 mov ecx, 00000004
:004EDD40 8BC6 mov eax, esi
:004EDD42 8B38 mov edi, dword ptr [eax]
:004EDD44 FF5704 call [edi+04]
:004EDD47 FF45F8 inc [ebp-08]
:004EDD4A 8BC6 mov eax, esi
:004EDD4C E86750F2FF call 00412DB8
:004EDD51 8BD0 mov edx, eax
:004EDD53 83EA05 sub edx, 00000005
:004EDD56 33C9 xor ecx, ecx
:004EDD58 8BC6 mov eax, esi
:004EDD5A 8B38 mov edi, dword ptr [eax]
:004EDD5C FF570C call [edi+0C]
:004EDD5F 66C745FE0000 mov [ebp-02], 0000
:004EDD65 66C745FC0000 mov [ebp-04], 0000
:004EDD6B 8D55FC lea edx, dword ptr [ebp-04]
:004EDD6E B901000000 mov ecx, 00000001
:004EDD73 8BC6 mov eax, esi
:004EDD75 8B38 mov edi, dword ptr [eax]
:004EDD77 FF5704 call [edi+04]
:004EDD7A 33C9 xor ecx, ecx
:004EDD7C 33D2 xor edx, edx
:004EDD7E 8BC6 mov eax, esi
:004EDD80 8B38 mov edi, dword ptr [eax]
:004EDD82 FF570C call [edi+0C]
:004EDD85 33C0 xor eax, eax
:004EDD87 8945F4 mov dword ptr [ebp-0C], eax
:004EDD8A 8BC6 mov eax, esi
:004EDD8C E82750F2FF call 00412DB8
:004EDD91 6683E805 sub ax, 0005
:004EDD95 6685C0 test ax, ax
:004EDD98 764E jbe 004EDDE8
:004EDD9A 668945EE mov word ptr [ebp-12], ax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDDE6(C)
|
:004EDD9E 8D55FE lea edx, dword ptr [ebp-02]
:004EDDA1 B901000000 mov ecx, 00000001
:004EDDA6 8BC6 mov eax, esi
:004EDDA8 8B38 mov edi, dword ptr [eax]
:004EDDAA FF5704 call [edi+04]
:004EDDAD 8BC6 mov eax, esi
:004EDDAF E8E84FF2FF call 00412D9C
:004EDDB4 8BD0 mov edx, eax
:004EDDB6 4A dec edx
:004EDDB7 33C9 xor ecx, ecx
:004EDDB9 8BC6 mov eax, esi
:004EDDBB 8B38 mov edi, dword ptr [eax]
:004EDDBD FF570C call [edi+0C]
:004EDDC0 0FB745FE movzx eax, word ptr [ebp-02]
:004EDDC4 0145F4 add dword ptr [ebp-0C], eax
:004EDDC7 668B45FC mov ax, word ptr [ebp-04]
:004EDDCB 663145FE xor word ptr [ebp-02], ax
:004EDDCF 8D55FE lea edx, dword ptr [ebp-02]
:004EDDD2 B901000000 mov ecx, 00000001
:004EDDD7 8BC6 mov eax, esi
:004EDDD9 8B38 mov edi, dword ptr [eax]
:004EDDDB FF5708 call [edi+08]
:004EDDDE 66FF45FC inc [ebp-04]
:004EDDE2 66FF4DEE dec [ebp-12]
:004EDDE6 75B6 jne 004EDD9E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDD98(C)
|
:004EDDE8 8B45F4 mov eax, dword ptr [ebp-0C]
:004EDDEB 3B45F8 cmp eax, dword ptr [ebp-08]
:004EDDEE 7409 je 004EDDF9
:004EDDF0 C605AC394F0001 mov byte ptr [004F39AC], 01
:004EDDF7 EB07 jmp 004EDE00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDDEE(C)
|
:004EDDF9 C605AC394F0000 mov byte ptr [004F39AC], 00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDDF7(U)
|
:004EDE00 8BC6 mov eax, esi
:004EDE02 E88152F1FF call 00403088
:004EDE07 EB07 jmp 004EDE10

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDCDE(C)
|
:004EDE09 C605AC394F0001 mov byte ptr [004F39AC], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDE07(U)
|
:004EDE10 803DAC394F0000 cmp byte ptr [004F39AC], 00
:004EDE17 741F je 004EDE38
:004EDE19 8D45CC lea eax, dword ptr [ebp-34]

* Possible StringData Ref from Code Obj ->" UNREGISTERED"
|
:004EDE1C B960E04E00 mov ecx, 004EE060

* Possible StringData Ref from Code Obj ->"Gypsee PRO 1.6"
|
:004EDE21 8B15A8394F00 mov edx, dword ptr [004F39A8]
:004EDE27 E85062F1FF call 0040407C
:004EDE2C 8B55CC mov edx, dword ptr [ebp-34]
:004EDE2F 8BC3 mov eax, ebx
:004EDE31 E81A94F5FF call 00447250
:004EDE36 EB1C jmp 004EDE54

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EDE17(C)
|

* Possible StringData Ref from Code Obj ->"Gypsee PRO 1.6"
|
:004EDE38 8B15A8394F00 mov edx, dword ptr [004F39A8]
:004EDE3E 8BC3 mov eax, ebx
:004EDE40 E80B94F5FF call 00447250
:004EDE45 EB0D jmp 004EDE54

标 题:用DeDe则更爽 (8千字)
发信人:blowfish
时 间:2001-3-19 12:40:31
详细信息:

这里应该是在比较注册码：
004EDDE8 8B45F4 mov eax, [ebp-$0C]
004EDDEB 3B45F8 cmp eax, [ebp-$08]
004EDDEE 7409 jz 004EDDF9
有兴趣的用SoftICE跟一下 ;)

//--------------------------------------------------------------------------
004EDCA0 803DAC394F0000 cmp byte ptr [$4F39AC], $00
004EDCA7 0F849A010000 jz 004EDE47
004EDCAD 8D55D8 lea edx, [ebp-$28]

* Possible reference to TApplication instance
|
004EDCB0 A16C3D4F00 mov eax, dword ptr [$4F3D6C]
004EDCB5 8B00 mov eax, [eax]

* Reference to: Forms.TApplication.GetExeName()
|
004EDCB7 E890BFF4FF call 00439C4C
004EDCBC 8B45D8 mov eax, [ebp-$28]
004EDCBF 8D55DC lea edx, [ebp-$24]

* Reference to: Sysutils.ExtractFileDir(System.AnsiString)
|
004EDCC2 E871B0F1FF call 00408D38
004EDCC7 8D45DC lea eax, [ebp-$24]

* Possible String Reference to: '\GYPSEE.KEY'
|
004EDCCA BA4CE04E00 mov edx, $004EE04C

* Reference to: System..LStrCat()
|
004EDCCF E86463F1FF call 00404038
004EDCD4 8B45DC mov eax, [ebp-$24]

* Reference to: Sysutils.FileExists(System.AnsiString)
|
004EDCD7 E86CADF1FF call 00408A48
004EDCDC 84C0 test al, al
004EDCDE 0F8425010000 jz 004EDE09
004EDCE4 B201 mov dl, $01

* Possible reference to class TMemoryStream
|
004EDCE6 A1ECF84000 mov eax, dword ptr [$40F8EC]

* Reference to: System.TObject.Create()
|
004EDCEB E86853F1FF call 00403058
004EDCF0 8BF0 mov esi, eax
004EDCF2 8D55D0 lea edx, [ebp-$30]

* Possible reference to TApplication instance
|
004EDCF5 A16C3D4F00 mov eax, dword ptr [$4F3D6C]
004EDCFA 8B00 mov eax, [eax]

* Reference to: Forms.TApplication.GetExeName()
|
004EDCFC E84BBFF4FF call 00439C4C
004EDD01 8B45D0 mov eax, [ebp-$30]
004EDD04 8D55D4 lea edx, [ebp-$2C]

* Reference to: Sysutils.ExtractFileDir(System.AnsiString)
|
004EDD07 E82CB0F1FF call 00408D38
004EDD0C 8D45D4 lea eax, [ebp-$2C]

* Possible String Reference to: '\GYPSEE.KEY'
|
004EDD0F BA4CE04E00 mov edx, $004EE04C

* Reference to: System..LStrCat()
|
004EDD14 E81F63F1FF call 00404038
004EDD19 8B55D4 mov edx, [ebp-$2C]
004EDD1C 8BC6 mov eax, esi

* Reference to: Classes.TMemoryStream.LoadFromFile(System.AnsiString)
|
004EDD1E E8CD54F2FF call 004131F0
004EDD23 8BC6 mov eax, esi

* Reference to: Classes.TStream.GetSize()
|
004EDD25 E88E50F2FF call 00412DB8
004EDD2A 8BD0 mov edx, eax
004EDD2C 83EA04 sub edx, +$04
004EDD2F 33C9 xor ecx, ecx
004EDD31 8BC6 mov eax, esi
004EDD33 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Seek(Longint,Word)
|
004EDD35 FF570C call dword ptr [edi+$0C]
004EDD38 8D55F8 lea edx, [ebp-$08]
004EDD3B B904000000 mov ecx, $00000004
004EDD40 8BC6 mov eax, esi
004EDD42 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Read(Pointer,Longint)
|
004EDD44 FF5704 call dword ptr [edi+$04]
004EDD47 FF45F8 inc dword ptr [ebp-$08]
004EDD4A 8BC6 mov eax, esi

* Reference to: Classes.TStream.GetSize()
|
004EDD4C E86750F2FF call 00412DB8
004EDD51 8BD0 mov edx, eax
004EDD53 83EA05 sub edx, +$05
004EDD56 33C9 xor ecx, ecx
004EDD58 8BC6 mov eax, esi
004EDD5A 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Seek(Longint,Word)
|
004EDD5C FF570C call dword ptr [edi+$0C]
004EDD5F 66C745FE0000 mov word ptr [ebp-$02], $0000
004EDD65 66C745FC0000 mov word ptr [ebp-$04], $0000
004EDD6B 8D55FC lea edx, [ebp-$04]
004EDD6E B901000000 mov ecx, $00000001
004EDD73 8BC6 mov eax, esi
004EDD75 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Read(Pointer,Longint)
|
004EDD77 FF5704 call dword ptr [edi+$04]
004EDD7A 33C9 xor ecx, ecx
004EDD7C 33D2 xor edx, edx
004EDD7E 8BC6 mov eax, esi
004EDD80 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Seek(Longint,Word)
|
004EDD82 FF570C call dword ptr [edi+$0C]
004EDD85 33C0 xor eax, eax
004EDD87 8945F4 mov [ebp-$0C], eax
004EDD8A 8BC6 mov eax, esi

* Reference to: Classes.TStream.GetSize()
|
004EDD8C E82750F2FF call 00412DB8
004EDD91 6683E805 sub ax, +$05
004EDD95 6685C0 test ax, ax
004EDD98 764E jbe 004EDDE8
004EDD9A 668945EE mov [ebp-$12], ax
004EDD9E 8D55FE lea edx, [ebp-$02]
004EDDA1 B901000000 mov ecx, $00000001
004EDDA6 8BC6 mov eax, esi
004EDDA8 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Read(Pointer,Longint)
|
004EDDAA FF5704 call dword ptr [edi+$04]
004EDDAD 8BC6 mov eax, esi

* Reference to: Classes.TStream.GetPosition()
|
004EDDAF E8E84FF2FF call 00412D9C
004EDDB4 8BD0 mov edx, eax
004EDDB6 4A dec edx
004EDDB7 33C9 xor ecx, ecx
004EDDB9 8BC6 mov eax, esi
004EDDBB 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Seek(Longint,Word)
|
004EDDBD FF570C call dword ptr [edi+$0C]
004EDDC0 0FB745FE movzx eax, word ptr [ebp-$02]
004EDDC4 0145F4 add [ebp-$0C], eax
004EDDC7 668B45FC mov ax, word ptr [ebp-$04]
004EDDCB 663145FE xor [ebp-$02], ax
004EDDCF 8D55FE lea edx, [ebp-$02]
004EDDD2 B901000000 mov ecx, $00000001
004EDDD7 8BC6 mov eax, esi
004EDDD9 8B38 mov edi, [eax]

* Reference to method TMemoryStream.Write(Pointer,Longint)
|
004EDDDB FF5708 call dword ptr [edi+$08]
004EDDDE 66FF45FC inc word ptr [ebp-$04]
004EDDE2 66FF4DEE dec word ptr [ebp-$12]
004EDDE6 75B6 jnz 004EDD9E
004EDDE8 8B45F4 mov eax, [ebp-$0C]
004EDDEB 3B45F8 cmp eax, [ebp-$08]
004EDDEE 7409 jz 004EDDF9
004EDDF0 C605AC394F0001 mov byte ptr [$4F39AC], $01
004EDDF7 EB07 jmp 004EDE00
004EDDF9 C605AC394F0000 mov byte ptr [$4F39AC], $00
004EDE00 8BC6 mov eax, esi

* Reference to: System.TObject.Free()
|
004EDE02 E88152F1FF call 00403088
004EDE07 EB07 jmp 004EDE10
004EDE09 C605AC394F0001 mov byte ptr [$4F39AC], $01
004EDE10 803DAC394F0000 cmp byte ptr [$4F39AC], $00
004EDE17 741F jz 004EDE38
004EDE19 8D45CC lea eax, [ebp-$34]

* Possible String Reference to: ' UNREGISTERED'
|
004EDE1C B960E04E00 mov ecx, $004EE060
004EDE21 8B15A8394F00 mov edx, [$4F39A8]

* Reference to: System..LStrCat3()
|
004EDE27 E85062F1FF call 0040407C
004EDE2C 8B55CC mov edx, [ebp-$34]
004EDE2F 8BC3 mov eax, ebx

* Reference to: Controls.TControl.SetText(System.AnsiString)
|
004EDE31 E81A94F5FF call 00447250
004EDE36 EB1C jmp 004EDE54
004EDE38 8B15A8394F00 mov edx, [$4F39A8]
004EDE3E 8BC3 mov eax, ebx

* Reference to: Controls.TControl.SetText(System.AnsiString)
|
004EDE40 E80B94F5FF call 00447250
004EDE45 EB0D jmp 004EDE54

标 题:每输入一个字符就判断一下 (5千字)
发信人:blowfish
时 间:2001-3-19 13:22:48
详细信息:

输入注册码时的判断在TEdit的OnChange( )中。启动时的判断只是对keyfile进行校验。

Registered User
1257167423

//-------------------------------------------------------------
procedure TfmRegistration.Edit2Change(Sender: TObject);
begin
{
004BCAA0 55 push ebp
004BCAA1 8BEC mov ebp, esp
004BCAA3 33C9 xor ecx, ecx
004BCAA5 51 push ecx
004BCAA6 51 push ecx
004BCAA7 51 push ecx
004BCAA8 51 push ecx
004BCAA9 51 push ecx
004BCAAA 53 push ebx
004BCAAB 8BD8 mov ebx, eax
004BCAAD 33C0 xor eax, eax
004BCAAF 55 push ebp
004BCAB0 688ACB4B00 push $004BCB8A

***** TRY
|
004BCAB5 64FF30 push dword ptr fs:[eax]
004BCAB8 648920 mov fs:[eax], esp
004BCABB 8D55FC lea edx, [ebp-$04]

* Reference to control TfmRegistration.Edit2 : TEdit
|
004BCABE 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: Controls.TControl.GetText()
|
004BCAC4 E857A7F8FF call 00447220
004BCAC9 8B45FC mov eax, [ebp-$04]

* Reference to: System..DynArrayLength()
| or: System..LStrLen()
|
004BCACC E85F75F4FF call 00404030
004BCAD1 83F80A cmp eax, +$0A //注册码长度
004BCAD4 0F858D000000 jnz 004BCB67
004BCADA 8D55F8 lea edx, [ebp-$08]

* Reference to control TfmRegistration.Edit2 : TEdit
|
004BCADD 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: Controls.TControl.GetText()
|
004BCAE3 E838A7F8FF call 00447220
004BCAE8 8B45F8 mov eax, [ebp-$08]
004BCAEB 8B1504664F00 mov edx, [$4F6604]

* Reference to: System..LStrCmp()
|
004BCAF1 E84A76F4FF call 00404140 //比较注册码
004BCAF6 756F jnz 004BCB67
004BCAF8 8D45F4 lea eax, [ebp-$0C]
004BCAFB 50 push eax
004BCAFC 8D55F0 lea edx, [ebp-$10]

* Reference to control TfmRegistration.Edit2 : TEdit
|
004BCAFF 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: Controls.TControl.GetText()
|
004BCB05 E816A7F8FF call 00447220
004BCB0A 8B45F0 mov eax, [ebp-$10]
004BCB0D B905000000 mov ecx, $00000005
004BCB12 BA05000000 mov edx, $00000005

* Reference to: System..LStrCopy()
|
004BCB17 E81C77F4FF call 00404238
004BCB1C 8B45F4 mov eax, [ebp-$0C]
004BCB1F 50 push eax
004BCB20 8D45EC lea eax, [ebp-$14]
004BCB23 50 push eax
004BCB24 B905000000 mov ecx, $00000005
004BCB29 BA05000000 mov edx, $00000005
004BCB2E A104664F00 mov eax, dword ptr [$4F6604]

* Reference to: System..LStrCopy()
|
004BCB33 E80077F4FF call 00404238
004BCB38 8B55EC mov edx, [ebp-$14]
004BCB3B 58 pop eax

* Reference to: System..LStrCmp()
|
004BCB3C E8FF75F4FF call 00404140 //比较注册码中间的5位
004BCB41 7524 jnz 004BCB67

* Reference to control TfmRegistration.BitBtn1 : TBitBtn
|
004BCB43 8B83D0020000 mov eax, [ebx+$02D0]

* Reference to field TBitBtn.OFFS_010C
|
004BCB49 89980C010000 mov [eax+$010C], ebx

* Reference to field TBitBtn.OFFS_0108
|
004BCB4F C7800801000064C74B00 mov dword ptr [eax+$0108], $004BC764

* Reference to field TfmRegistration.OFFS_02EC
|
004BCB59 C683EC02000001 mov byte ptr [ebx+$02EC], $01

* Reference to field TfmRegistration.OFFS_02ED
|
004BCB60 C683ED02000001 mov byte ptr [ebx+$02ED], $01
004BCB67 33C0 xor eax, eax
004BCB69 5A pop edx
004BCB6A 59 pop ecx
004BCB6B 59 pop ecx
004BCB6C 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '[嬪]脣繳嬱3繳h伤K'
|
004BCB6F 6891CB4B00 push $004BCB91
004BCB74 8D45EC lea eax, [ebp-$14]

* Reference to: System..LStrClr(System.AnsiString)
|
004BCB77 E83472F4FF call 00403DB0
004BCB7C 8D45F0 lea eax, [ebp-$10]
004BCB7F BA04000000 mov edx, $00000004

* Reference to: System..LStrArrayClr()
|
004BCB84 E84B72F4FF call 00403DD4
004BCB89 C3 ret

004BCB8A E9196CF4FF jmp 004037A8
004BCB8F EBE3 jmp 004BCB74

****** END
|
004BCB91 5B pop ebx
004BCB92 8BE5 mov esp, ebp
004BCB94 5D pop ebp
004BCB95 C3 ret


SoftSol Ativa DUN Meter 2.3

 标 题:目标--dephi(1), SoftSol Ativa DUN Meter 2.3
发信人:小楼
时 间:2000-12-3 12:16:17
详细信息:
目标--dephi
SoftSol Ativa DUN Meter 2.3

类似于VB，dephi也是一种面向对象的编程语言。同时因为它的一些特性，所以关于dephi编译的程序破解也有一些可以取巧之处。关于dephi的逆向工程国外已经有人专文进行了探讨，而在国内还鲜有人提及。在此仅就使用DEDE2.42－－一个dephi反编译工具进行介绍。
目标：SoftSol Ativa DUN Meter 2.3 一个网络下载数据测量工具。

首先用DEDE2.42反编译ativa.exe。
1、在Form面板中找到一个ClassName叫TfmKeyRegister，单击后就可以见到“注册”窗体中各个对象的属性及相互关系。
......
object btnOK: TButton <--注册按钮
Left = 230 <--
Top = 292 |
Width = 75 |按钮的大小尺寸
Height = 23 <--
Caption = '&OK' <--按钮的名字
TabOrder = 0
OnClick = btnOKClick <--按下按钮后击发的事件
end
......
object editReg1: TEdit <--
Left = 80 |
Top = 237 |
Width = 90 |注册码填入框1
Height = 21 |
MaxLength = 6 |
TabOrder = 2 |
end <--
object editReg2: TEdit <--
Left = 188 |
Top = 237 |
Width = 90 |注册码填入框2
Height = 21 |
MaxLength = 6 |
TabOrder = 3 |
end <--
object editReg3: TEdit <--
Left = 297 |
Top = 237 |
Width = 90 |注册码填入框3
Height = 21 |
MaxLength = 6 |
TabOrder = 4 |
end <--

2、在Procedures面板中可以看到一个UnitName，名为KeyRegister，双击名为btnOKClick的事件，
......
* Reference to control TfmKeyRegister.editReg1 : TEdit
|
004835C6 8B86E8020000 mov eax, [esi+$02E8]

* Reference to: Controls.TControl.GetText() <--取注册框1的内容
|
004835CC E8178FFBFF call 0043C4E8
004835D1 8B45FC mov eax, [ebp-$04]

* Possible String Reference to: '560616'
|
004835D4 BA00374800 mov edx, $00483700

* Reference to: System..LStrCmp()
|
004835D9 E8D208F8FF call 00403EB0 <-- ＝560616 ?
004835DE 7402 jz 004835E2
004835E0 33DB xor ebx, ebx
004835E2 8D55F8 lea edx, [ebp-$08]

* Reference to control TfmKeyRegister.editReg2 : TEdit
|
004835E5 8B86EC020000 mov eax, [esi+$02EC]

* Reference to: Controls.TControl.GetText() <--取注册框2的内容
|
004835EB E8F88EFBFF call 0043C4E8
004835F0 8B45F8 mov eax, [ebp-$08]

* Possible String Reference to: '201839'
|
004835F3 BA10374800 mov edx, $00483710

* Reference to: System..LStrCmp()
|
004835F8 E8B308F8FF call 00403EB0
004835FD 7402 jz 00483601 <-- ＝ 201839 ?
004835FF 33DB xor ebx, ebx
00483601 8D55F4 lea edx, [ebp-$0C]

* Reference to control TfmKeyRegister.editReg3 : TEdit
|
00483604 8B86F0020000 mov eax, [esi+$02F0]

* Reference to: Controls.TControl.GetText() <--取注册框3的内容
|
0048360A E8D98EFBFF call 0043C4E8
0048360F 8B45F4 mov eax, [ebp-$0C]

* Reference to: System..DynArrayLength()
| or: System..LStrLen() <--得到注册框3字窜长度
|
00483612 E88907F8FF call 00403DA0
00483617 83F806 cmp eax, +$06
0048361A 7D02 jnl 0048361E >=6, OK!
0048361C 33DB xor ebx, ebx
0048361E 84DB test bl, bl
00483620 7530 jnz 00483652
00483622 6A00 push $00
00483624 668B0D18374800 mov cx, word ptr [$483718]
0048362B B201 mov dl, $01

* Possible String Reference to: 'The Code you have entered is invali
| d. Please try again.'
|
0048362D B824374800 mov eax, $00483724
......
00483652 8D55F0 lea edx, [ebp-$10]
......
* Possible String Reference to: 'Congratulations and thankyou. You
| have successfully registered Ativa
| DUN Meter.'
|
004836B6 B868374800 mov eax, $00483768

END


股海点金2.1

标 题:爆破 股海点金2.1 (1千字)
发信人:小楼
时 间:2001-4-17 1:52:08
详细信息:
爆破 股海点金2.1

这是软件提供股票买卖中涉及的资金及股票的管理功能，可以实时读入多种行情软件的股价数据。
要破它主要是无聊，也是从gfh[CCG]那要来的题目。

限制：
1. 30天限用，到期必须注册。
2. 若输入错误注册码，软件无提示，进入主界面约3秒后自动退出，同时在安装目录下生成EzStkMan.ini文件，再运行即自动退出；删除EzStkMan.ini文件，又可输入注册码。

工具：
trw1.23 registered
hiew
topo
wdasm
procdump1.62
exescope

首先用FI.exe查壳，提示为UPX0.93版压缩，用对应UPX解压不能，故手工脱壳：
bpx loadlibrarya do "d eax" 2次
见到有kerenel.dll字样后F12返回，F6 pagedown就发现
cs:005f051B JMP 005F4535 <--OEP!
在TRW中suspend，用procdump得到解压文件，
OEP修正为005F4535-00400000=001F4535

再用FI.exe检查，提示为DEPHI编程，可惜用DEDE反编译失败。

思考：dephi中设置时间多为object:timer，软件自动退出可能与此有关。

用EXESCOPE打开DUMP.exe，在RC数据\TMAINFORM中查找“TIMER”，见到5个，
如：object Timer3: TTimer
Enabled = False
Interval = 3000
OnTimer = Timer3Timer
Left = 217
Top = 204
end

注意Interval = 3000，3000为设置的时间，单位为毫秒，经过一番试验，得知object Timer3: TTimer正控制程序自动退出，将TIMER3的时间Interval =变为0，时间限制即去除。在HIEW中找到相对应的代码位置是cs:005DCB7F，将此的
B8 0B
改为 00 00 就可以任意注册而不退出，也意味着注册成功。

可是我讨厌解压后的大文件，所以更愿意用SMC来解决。
1 用TOPO为主程序EzStkMan.exe加50BYTES，入口变为005F4508。
2 CS:005F4509 E927000000 JMP 005F4535 <--原入口
3 CS:005F051B JMP 0058CBD4 <--OEP
变为 E9F03F0000 JMP 005F4510 <--PATCH CODE
4 CS:005F4510 C7057FCB5D000000074F MOV DWORD [005DCB7F],4F070000
005F451A E9B586F0FF JMP 0058CBD4 <--RETURN
ok!


金庸群侠传外挂程序

 标 题:金庸群侠传外挂程序的破解思路(网上验证)，小球[CCG]请进： (7千字)
发信人:6767[BCG]
时 间:2001-7-22 9:32:14
详细信息:
金庸群侠外挂程序
by 6767 [BCG]

用dede和si配合容易搞定，具体跳转该怎样修改可能要在测试后才能确定，下面是我的改法：

资源段有下列信息：
object TabSheet1: TTabSheet
Caption = '登录注册'
OnShow = TabSheet1Show <- 这个看看
。。。。。。

object WebBrowser1: TWebBrowser
Left = 0
Top = 0
Width = 307
Height = 284
TabStop = False
Align = alClient
TabOrder = 0
OnTitleChange = WebBrowser1TitleChange <- 这个也看看
。。。。。

先是TabSheet1Show中的代码：
....
0045395B 64FF30 push dword ptr fs:[eax]
0045395E 648920 mov fs:[eax], esp

* Possible String Reference to: '金庸外挂I之《神行太保》, <- 改变标题，激活WebBrowser1TitleChange调用 衿?..'
|
00453961 BA003A4500 mov edx, $00453A00

* Possible reference to Form1
|
00453966 A1F0684500 mov eax, dword ptr [$4568F0]

* Reference to: Controls.TControl.SetText(System.AnsiString) <-
|
0045396B E8A037FDFF call 00427110
00453970 8D45EC lea eax, [ebp-$14]
00453973 33D2 xor edx, edx
.....

那么我们来看WebBrowser1TitleChange都作了些什么：

00453A6C 55 push ebp
00453A6D 8BEC mov ebp, esp
00453A6F 83C4F4 add esp, -$0C
00453A72 53 push ebx
00453A73 56 push esi
00453A74 33DB xor ebx, ebx
00453A76 895DF4 mov [ebp-$0C], ebx
00453A79 8BF1 mov esi, ecx
00453A7B 8BD8 mov ebx, eax
00453A7D 33C0 xor eax, eax
00453A7F 55 push ebp

* Possible String Reference to: '镽�腽^[嬪]?
|
00453A80 68793B4500 push $00453B79

***** TRY
|
00453A85 64FF30 push dword ptr fs:[eax]
00453A88 648920 mov fs:[eax], esp

* Possible String Reference to: 'xxxxxxxx'
|
00453A8B BA903B4500 mov edx, $00453B90 <- 觉得标题难受就把这里改掉

* Possible reference to Form1
|
00453A90 A1F0684500 mov eax, dword ptr [$4568F0]

* Reference to: Controls.TControl.SetText(System.AnsiString) <- 设窗口标题
|
00453A95 E87636FDFF call 00427110
00453A9A 8BC6 mov eax, esi <- 接受前一函数的返回值
00453A9C BAA03B4500 mov edx, $00453BA0

* Reference to: System..WStrCmp()
|
00453AA1 E83A06FBFF call 004040E0 <- 比较了
00453AA6 7507 jnz 00453AAF <- 不跳就完蛋，改掉
<- 改成jmp 453b0b运行没问题，不知能否正确接收到数据
00453AA8 8BC3 mov eax, ebx

* Reference to: Forms.TCustomForm.Close()
|
00453AAA E871C7FEFF call 00440220
00453AAF 8BC6 mov eax, esi
00453AB1 BAB83B4500 mov edx, $00453BB8

* Reference to: System..WStrCmp()
|
00453AB6 E82506FBFF call 004040E0
00453ABB 7516 jnz 00453AD3 <- 未注册在这里会跳走
00453ABD 8D45F4 lea eax, [ebp-$0C]
00453AC0 8BD6 mov edx, esi

* Reference to: System..LStrFromWStr(System.AnsiString; System.WideString)
|
00453AC2 E88D00FBFF call 00403B54
00453AC7 8B45F4 mov eax, [ebp-$0C]

* Reference to: Sysutils.StrToFloat(System.AnsiString)
|
00453ACA E8054FFBFF call 004089D4
00453ACF DD5DF8 fstp qword ptr [ebp-$08]
00453AD2 9B wait
00453AD3 DD45F8 fld qword ptr [ebp-$08]
00453AD6 83C4F4 add esp, -$0C
00453AD9 DB3C24 fstp tbyte ptr [esp]
00453ADC 9B wait
00453ADD 8D45F4 lea eax, [ebp-$0C]

* Reference to: Sysutils.FloatToStr(Extended)
|
00453AE0 E8BF4EFBFF call 004089A4
00453AE5 8B45F4 mov eax, [ebp-$0C]

* Possible String Reference to: '9412.11'
|
00453AE8 BAD03B4500 mov edx, $00453BD0

* Reference to: System..LStrCmp()
|
00453AED E8AA01FBFF call 00403C9C
00453AF2 756F jnz 00453B63 <- 跳下去也没戏了
00453AF4 8D45F4 lea eax, [ebp-$0C]
00453AF7 8BD6 mov edx, esi

* Reference to: System..LStrFromWStr(System.AnsiString; System.WideString)
|
00453AF9 E85600FBFF call 00403B54
00453AFE 8B45F4 mov eax, [ebp-$0C]

* Reference to: Sysutils.StrToFloat(System.AnsiString)
|
00453B01 E8CE4EFBFF call 004089D4

* Reference to: System..ROUND()
|
00453B06 E835EEFAFF call 00402940

* Reference to field TForm1.OFFS_031C
|
00453B0B 89831C030000 mov [ebx+$031C], eax <- 正常程序从这里或稍上处开始
00453B11 B201 mov dl, $01

* Reference to control TForm1.TabSheet2 : TTabSheet <-
|
00453B13 8B83D4020000 mov eax, [ebx+$02D4]

* Reference to: Controls.TControl.SetVisible(bool) <- 显示地图内容，下略
|
00453B19 E8B234FDFF call 00426FD0
00453B1E B201 mov dl, $01

* Reference to control TForm1.TabSheet2 : TTabSheet
|
00453B20 8B83D4020000 mov eax, [ebx+$02D4]

* Reference to: Comctrls.TTabSheet.SetTabVisible(bool)
|
00453B26 E84DBAFFFF call 0044F578
00453B2B B201 mov dl, $01

* Reference to control TForm1.TabSheet2 : TTabSheet
|
00453B2D 8B83D4020000 mov eax, [ebx+$02D4]
00453B33 8B08 mov ecx, [eax]
00453B35 FF5160 call dword ptr [ecx+$60]
00453B38 33D2 xor edx, edx

* Reference to control TForm1.TabSheet1 : TTabSheet
|
00453B3A 8B83C8020000 mov eax, [ebx+$02C8]

* Reference to: Controls.TControl.SetVisible(bool)
|
00453B40 E88B34FDFF call 00426FD0
00453B45 33D2 xor edx, edx

* Reference to control TForm1.TabSheet1 : TTabSheet
|
00453B47 8B83C8020000 mov eax, [ebx+$02C8]

* Reference to: Comctrls.TTabSheet.SetTabVisible(bool)
|
00453B4D E826BAFFFF call 0044F578

* Reference to control TForm1.TabSheet2 : TTabSheet
|
00453B52 8B93D4020000 mov edx, [ebx+$02D4]

* Reference to control TForm1.PageControl1 : TPageControl
|
00453B58 8B83C4020000 mov eax, [ebx+$02C4]

* Reference to: Comctrls.TPageControl.SetActivePage(Comctrls.TTabSheet)
|
00453B5E E8D5C0FFFF call 0044FC38
00453B63 33C0 xor eax, eax
00453B65 5A pop edx
00453B66 59 pop ecx
00453B67 59 pop ecx
00453B68 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '^[嬪]?
|
00453B6B 68803B4500 push $00453B80
00453B70 8D45F4 lea eax, [ebp-$0C]

* Reference to: System..LStrClr(System.AnsiString)
|
00453B73 E898FDFAFF call 00403910
00453B78 C3 ret

00453B79 E952F8FAFF jmp 004033D0
00453B7E EBF0 jmp 00453B70

****** END
|
00453B80 5E pop esi
00453B81 5B pop ebx
00453B82 8BE5 mov esp, ebp
00453B84 5D pop ebp
00453B85 C3 ret

关键的跳转处都列出来了，至于怎样改需要测试。

那个记录地址的文本文件是需要的，否则这个东东没用。


批量文件设置器 V2.2a

标 题:批量文件设置器 V2.2a (18千字)
发信人:floatsnow
时 间:2001-3-22 23:18:01
详细信息:
标题: 刚刚写完破解过程请大家指教!写错了应该是Caspr1.010,请问如何知道是用什么版本的Aspack加的壳,我只能检测到是Aspack加的壳,但不知道是什么版本的!

内容:
软件名称: 批量文件设置器 V2.2a
文件大小: 1228KB
下载地址: http://www.cnvnet.com/download/d/fo22a.exe
调试工具：SoftICE 4.05 Caspr1.1 DeDe fi
调试平台：Win98、W32dsm89
软件简介：
在WINDOWS的使用中，经常要用到对批量的文件进行属性更改，例如从盘复制过来的文件，要去了只读属性；又有时要对某些文件，如自写的程序，某些特殊用途的文件等的创建日期进行设置，以保持文档与文件的时间一致性；又有时要将某些文件按要求一一改名，而且方法、要求奇特，数量巨大。所有的这些，《批量文件设置器》均能帮你一一搞定。

该软件用Delphi5编写，执行文件有Aspack加密（版本不清楚），用Caspr1.1版本可直接脱壳。脱壳后用DeDe反编译可找到注册窗体，注册部分代码如下：

procedure TFormReg.BtnOKClick(Sender: TObject);
begin

004AA8A0 55 push ebp
004AA8A1 8BEC mov ebp, esp
004AA8A3 B90D000000 mov ecx, $0000000D
004AA8A8 6A00 push $00
004AA8AA 6A00 push $00
004AA8AC 49 dec ecx
004AA8AD 75F9 jnz 004AA8A8
004AA8AF 51 push ecx
004AA8B0 53 push ebx
004AA8B1 56 push esi
004AA8B2 57 push edi
004AA8B3 8945FC mov [ebp-$04], eax
004AA8B6 8D7DE6 lea edi, [ebp-$1A]
004AA8B9 33C0 xor eax, eax
004AA8BB 55 push ebp

* Possible String Reference to: '閴婖?腚_^[嬪]门课募柚闷?
|
004AA8BC 68D2AC4A00 push $004AACD2

***** TRY
|
004AA8C1 64FF30 push dword ptr fs:[eax]
004AA8C4 648920 mov fs:[eax], esp
004AA8C7 8D55E0 lea edx, [ebp-$20]

* Reference to FormReg
|
004AA8CA 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AA8CD 8B80DC020000 mov eax, [eax+$02DC]

|
004AA8D3 E81483F8FF call 00432BEC
004AA8D8 8B45E0 mov eax, [ebp-$20]

|
004AA8DB E80897F5FF call 00403FE8
004AA8E0 83F802 cmp eax, +$02
004AA8E3 7C1E jl 004AA903
004AA8E5 8D55DC lea edx, [ebp-$24]

* Reference to FormReg
|
004AA8E8 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AA8EB 8B80E0020000 mov eax, [eax+$02E0]

|
004AA8F1 E8F682F8FF call 00432BEC
004AA8F6 8B45DC mov eax, [ebp-$24]

|
004AA8F9 E8EA96F5FF call 00403FE8
004AA8FE 83F802 cmp eax, +$02
004AA901 7D1F jnl 004AA922
004AA903 6A10 push $10

* Possible String Reference to: '批量文件设置器'
|
004AA905 68E0AC4A00 push $004AACE0

* Possible String Reference to: '用户名或公司名，请不短于两位（一个?
| 鹤郑?
|
004AA90A 68F0AC4A00 push $004AACF0

* Reference to FormReg
|
004AA90F 8B45FC mov eax, [ebp-$04]

|
004AA912 E8E9E4F8FF call 00438E00
004AA917 50 push eax

* Reference to: user32.MessageBoxA()
|
004AA918 E8B7CAF5FF call 004073D4
004AA91D E995030000 jmp 004AACB7
004AA922 B301 mov bl, $01
004AA924 8BF7 mov esi, edi
004AA926 8D45D8 lea eax, [ebp-$28]
004AA929 50 push eax
004AA92A 8D55D4 lea edx, [ebp-$2C]

* Reference to FormReg
|
004AA92D 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditCode : TEdit
|
004AA930 8B80E8020000 mov eax, [eax+$02E8]

|
004AA936 E8B182F8FF call 00432BEC
004AA93B 8B45D4 mov eax, [ebp-$2C]
004AA93E 33D2 xor edx, edx
004AA940 8AD3 mov dl, bl
004AA942 8D1452 lea edx, [edx+edx*2]
004AA945 83EA02 sub edx, +$02
004AA948 B903000000 mov ecx, $00000003

|
004AA94D E89E98F5FF call 004041F0
004AA952 8B45D8 mov eax, [ebp-$28]
004AA955 33D2 xor edx, edx

| 依次取得3位注册码
004AA957 E814E2F5FF call 00408B70 //将取得的3位注册码转换成数值
004AA95C 668906 mov [esi], ax //讲转换结果存于esi所指内存
004AA95F 43 inc ebx
004AA960 83C602 add esi, +$02
004AA963 80FB09 cmp bl, $09 //是否取得8次
004AA966 75BE jnz 004AA926 //未到这跳转
004AA968 33F6 xor esi, esi //esi清0
004AA96A 8D55D0 lea edx, [ebp-$30]

* Reference to FormReg
|
004AA96D 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AA970 8B80DC020000 mov eax, [eax+$02DC]

|
004AA976 E87182F8FF call 00432BEC
004AA97B 8B45D0 mov eax, [ebp-$30]

|
004AA97E E86596F5FF call 00403FE8 //取得用户名长度
004AA983 84C0 test al, al
004AA985 765F jbe 004AA9E6
004AA987 8845F7 mov [ebp-$09], al //存于[ebp-$09]
004AA98A B301 mov bl, $01
004AA98C 8D55CC lea edx, [ebp-$34]

* Reference to FormReg
|
004AA98F 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AA992 8B80DC020000 mov eax, [eax+$02DC]

|
004AA998 E84F82F8FF call 00432BEC
004AA99D 8B45CC mov eax, [ebp-$34]
004AA9A0 33D2 xor edx, edx
004AA9A2 8AD3 mov dl, bl
004AA9A4 0FB64410FF movzx eax, byte ptr [eax+edx-$01] //依次取得用户名
004AA9A9 B914000000 mov ecx, $00000014
004AA9AE 33D2 xor edx, edx
004AA9B0 F7F1 div ecx
004AA9B2 50 push eax //保留商
004AA9B3 8D55C8 lea edx, [ebp-$38]

* Reference to FormReg
|
004AA9B6 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AA9B9 8B80DC020000 mov eax, [eax+$02DC]

|
004AA9BF E82882F8FF call 00432BEC
004AA9C4 8B45C8 mov eax, [ebp-$38]
004AA9C7 33D2 xor edx, edx
004AA9C9 8AD3 mov dl, bl
004AA9CB 0FB64410FF movzx eax, byte ptr [eax+edx-$01] //取相同用户名
004AA9D0 B90D000000 mov ecx, $0000000D
004AA9D5 33D2 xor edx, edx
004AA9D7 F7F1 div ecx //保留余数在edx中
004AA9D9 58 pop eax //弹出保留的商
004AA9DA 6603C2 add ax, dx //余数+商
004AA9DD 6603F0 add si, ax //加到si
004AA9E0 43 inc ebx
004AA9E1 FE4DF7 dec byte ptr [ebp-$09] //用户名是否读完
004AA9E4 75A6 jnz 004AA98C //否，继续累加
004AA9E6 6683FE6F cmp si, +$6F //累加值是否大于$6f
004AA9EA 7604 jbe 004AA9F0 //小于则跳过
004AA9EC 66BE6F00 mov si, $006F //大于则 si=$6f
004AA9F0 8D55C4 lea edx, [ebp-$3C] //si将和第五组注册码比较
//下面程序不影响si的值
* Reference to FormReg
|
004AA9F3 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AA9F6 8B80DC020000 mov eax, [eax+$02DC]

|
004AA9FC E8EB81F8FF call 00432BEC
004AAA01 8B45C4 mov eax, [ebp-$3C]
004AAA04 33DB xor ebx, ebx

* Reference to field TEdit.OFFS_0001
|
004AAA06 8A5801 mov bl, byte ptr [eax+$01] //取第二位用户名
004AAA09 8D55C0 lea edx, [ebp-$40]

* Reference to FormReg
|
004AAA0C 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AAA0F 8B80E0020000 mov eax, [eax+$02E0]

|
004AAA15 E8D281F8FF call 00432BEC
004AAA1A 8B45C0 mov eax, [ebp-$40]
004AAA1D 0FB64001 movzx eax, byte ptr [eax+$01] /取第二位公司名
004AAA21 03D8 add ebx, eax //相加
004AAA23 0FB707 movzx eax, word ptr [edi] //取头三位注册码的值
004AAA26 3BD8 cmp ebx, eax //是否相等
004AAA28 0F8502010000 jnz 004AAB30 //不等就完了
004AAA2E 8D55BC lea edx, [ebp-$44]

* Reference to FormReg
|
004AAA31 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AAA34 8B80DC020000 mov eax, [eax+$02DC]

|
004AAA3A E8AD81F8FF call 00432BEC
004AAA3F 8B45BC mov eax, [ebp-$44]
004AAA42 33DB xor ebx, ebx
004AAA44 8A18 mov bl, byte ptr [eax] //取第一位用户名
004AAA46 8D55B8 lea edx, [ebp-$48]

* Reference to FormReg
|
004AAA49 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AAA4C 8B80E0020000 mov eax, [eax+$02E0]

|
004AAA52 E89581F8FF call 00432BEC
004AAA57 8B45B8 mov eax, [ebp-$48]
004AAA5A 0FB600 movzx eax, byte ptr [eax] //取第一位公司名
004AAA5D 03D8 add ebx, eax //相加
004AAA5F 0FB74702 movzx eax, word ptr [edi+$02] //取下面三位注册码的值
004AAA63 3BD8 cmp ebx, eax //比脚
004AAA65 0F85C5000000 jnz 004AAB30 //同上
004AAA6B 8D55B4 lea edx, [ebp-$4C]

* Reference to FormReg
|
004AAA6E 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AAA71 8B80DC020000 mov eax, [eax+$02DC]

|
004AAA77 E87081F8FF call 00432BEC
004AAA7C 8B45B4 mov eax, [ebp-$4C]
004AAA7F 33DB xor ebx, ebx
004AAA81 8A18 mov bl, byte ptr [eax] //取第一位用户名
004AAA83 8D55B0 lea edx, [ebp-$50]

* Reference to FormReg
|
004AAA86 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AAA89 8B80DC020000 mov eax, [eax+$02DC]

|
004AAA8F E85881F8FF call 00432BEC
004AAA94 8B45B0 mov eax, [ebp-$50]
004AAA97 0FB64001 movzx eax, byte ptr [eax+$01] //取第二位用户名
004AAA9B 03D8 add ebx, eax //相加
004AAA9D 0FB74704 movzx eax, word ptr [edi+$04] //和下一组注册码比较
004AAAA1 3BD8 cmp ebx, eax
004AAAA3 0F8587000000 jnz 004AAB30
004AAAA9 8D55AC lea edx, [ebp-$54]

* Reference to FormReg
|
004AAAAC 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AAAAF 8B80E0020000 mov eax, [eax+$02E0]

|
004AAAB5 E83281F8FF call 00432BEC
004AAABA 8B45AC mov eax, [ebp-$54]
004AAABD 33DB xor ebx, ebx
004AAABF 8A18 mov bl, byte ptr [eax] //取第一位公司名
004AAAC1 8D55A8 lea edx, [ebp-$58]

* Reference to FormReg
|
004AAAC4 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AAAC7 8B80E0020000 mov eax, [eax+$02E0]

|
004AAACD E81A81F8FF call 00432BEC
004AAAD2 8B45A8 mov eax, [ebp-$58]
004AAAD5 0FB64001 movzx eax, byte ptr [eax+$01] //取第二位公司名
004AAAD9 03D8 add ebx, eax
004AAADB 0FB74706 movzx eax, word ptr [edi+$06]
004AAADF 3BD8 cmp ebx, eax
004AAAE1 754D jnz 004AAB30 //这里同上
004AAAE3 0FB707 movzx eax, word ptr [edi] //edi指向转换过的注册码
004AAAE6 0FB75702 movzx edx, word ptr [edi+$02]
004AAAEA 03C2 add eax, edx
004AAAEC 0FB75704 movzx edx, word ptr [edi+$04]
004AAAF0 03C2 add eax, edx
004AAAF2 0FB75706 movzx edx, word ptr [edi+$06]
004AAAF6 03C2 add eax, edx //前四组相加
004AAAF8 0FB75708 movzx edx, word ptr [edi+$08]
004AAAFC 0FB74F0A movzx ecx, word ptr [edi+$0A]
004AAB00 03D1 add edx, ecx
004AAB02 0FB74F0C movzx ecx, word ptr [edi+$0C]
004AAB06 03D1 add edx, ecx
004AAB08 0FB74F0E movzx ecx, word ptr [edi+$0E]
004AAB0C 03D1 add edx, ecx //后四组相加
004AAB0E 3BC2 cmp eax, edx
004AAB10 751E jnz 004AAB30
004AAB12 663B7708 cmp si, word ptr [edi+$08] //比较si和第5组是否相等
004AAB16 7518 jnz 004AAB30
004AAB18 0FB74708 movzx eax, word ptr [edi+$08] //取第五组
004AAB1C 0FB717 movzx edx, word ptr [edi] //取第四组
004AAB1F 03C2 add eax, edx //相加
004AAB21 0FB7570A movzx edx, word ptr [edi+$0A] //取第七组
004AAB25 3BC2 cmp eax, edx //四组+五组 是否等于 七组
004AAB27 7507 jnz 004AAB30
004AAB29 66837F0C64 cmp word ptr [edi+$0C], +$64 //第六组应等于$64
004AAB2E 743B jz 004AAB6B //跳转就OK了！
004AAB30 6A10 push $10

* Possible String Reference to: '批量文件设置器'
|
004AAB32 68E0AC4A00 push $004AACE0

* Possible String Reference to: '您的注册码不正确。如果该注册码是从?
| 髡吣抢锏玫降模胗胱髡吡怠?
|
004AAB37 681CAD4A00 push $004AAD1C

* Reference to FormReg
|
004AAB3C 8B45FC mov eax, [ebp-$04]

|
004AAB3F E8BCE2F8FF call 00438E00
004AAB44 50 push eax

* Reference to: user32.MessageBoxA()
|
004AAB45 E88AC8F5FF call 004073D4
004AAB4A 803D58C94C0003 cmp byte ptr [$4CC958], $03
004AAB51 730B jnb 004AAB5E
004AAB53 FE0558C94C00 inc byte ptr [$4CC958]
004AAB59 E959010000 jmp 004AACB7

* Reference to FormReg
|
004AAB5E 8B45FC mov eax, [ebp-$04]

|
004AAB61 E84635FAFF call 0044E0AC
004AAB66 E94C010000 jmp 004AACB7
004AAB6B 6A40 push $40

* Possible String Reference to: '批量文件设置器'
|
004AAB6D 68E0AC4A00 push $004AACE0

* Possible String Reference to: '感谢您！您已经成功地注册了！'
|
004AAB72 6860AD4A00 push $004AAD60

* Reference to FormReg
|
004AAB77 8B45FC mov eax, [ebp-$04]

|
004AAB7A E881E2F8FF call 00438E00
004AAB7F 50 push eax

* Reference to: user32.MessageBoxA()
|
004AAB80 E84FC8F5FF call 004073D4

* Reference to TMainForm instance
|
004AAB85 A1B0B14C00 mov eax, dword ptr [$4CB1B0]
004AAB8A 8B00 mov eax, [eax]

* Possible String Reference to: '批量文件设置器'
|
004AAB8C BA88AD4A00 mov edx, $004AAD88

|
004AAB91 E88680F8FF call 00432C1C

* Reference to TMainForm instance
|
004AAB96 A1B0B14C00 mov eax, dword ptr [$4CB1B0]
004AAB9B 8B00 mov eax, [eax]

* Reference to control TMainForm.MenuReg : TMenuItem
|
004AAB9D 8B80F0030000 mov eax, [eax+$03F0]
004AABA3 33D2 xor edx, edx

|
004AABA5 E8728DF9FF call 0044391C
004AABAA 8D55A4 lea edx, [ebp-$5C]

* Reference to FormReg
|
004AABAD 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AABB0 8B80DC020000 mov eax, [eax+$02DC]

|
004AABB6 E83180F8FF call 00432BEC
004AABBB 8B55A4 mov edx, [ebp-$5C]

* Reference to TAboutBox instance
|
004AABBE A1BCB14C00 mov eax, dword ptr [$4CB1BC]
004AABC3 8B00 mov eax, [eax]

* Reference to control TAboutBox.LabelUser : TLabel
|
004AABC5 8B80E0020000 mov eax, [eax+$02E0]

|
004AABCB E84C80F8FF call 00432C1C
004AABD0 8D55A0 lea edx, [ebp-$60]

* Reference to FormReg
|
004AABD3 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AABD6 8B80E0020000 mov eax, [eax+$02E0]

|
004AABDC E80B80F8FF call 00432BEC
004AABE1 8B55A0 mov edx, [ebp-$60]

* Reference to TAboutBox instance
|
004AABE4 A1BCB14C00 mov eax, dword ptr [$4CB1BC]
004AABE9 8B00 mov eax, [eax]

* Reference to control TAboutBox.LabelComp : TLabel
|
004AABEB 8B80E4020000 mov eax, [eax+$02E4]

|
004AABF1 E82680F8FF call 00432C1C
004AABF6 8B0DCCB04C00 mov ecx, [$4CB0CC]
004AABFC 8B09 mov ecx, [ecx]
004AABFE B201 mov dl, $01

* Reference to class TIniFile
|
004AAC00 A1846A4700 mov eax, dword ptr [$476A84]

|
004AAC05 E822BFFCFF call 00476B2C
004AAC0A 8945F8 mov [ebp-$08], eax
004AAC0D 33C0 xor eax, eax
004AAC0F 55 push ebp
004AAC10 68A8AC4A00 push $004AACA8

***** TRY
|
004AAC15 64FF30 push dword ptr fs:[eax]
004AAC18 648920 mov fs:[eax], esp
004AAC1B 8D559C lea edx, [ebp-$64]

* Reference to FormReg
|
004AAC1E 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditUser : TEdit
|
004AAC21 8B80DC020000 mov eax, [eax+$02DC]

|
004AAC27 E8C07FF8FF call 00432BEC
004AAC2C 8B459C mov eax, [ebp-$64]
004AAC2F 50 push eax

* Possible String Reference to: 'RegUserName'
|
004AAC30 B9A0AD4A00 mov ecx, $004AADA0

* Possible String Reference to: 'RegData'
|
004AAC35 BAB4AD4A00 mov edx, $004AADB4
004AAC3A 8B45F8 mov eax, [ebp-$08]
004AAC3D 8B18 mov ebx, [eax]

* Possible reference to virtual method TIniFile.OFFS_04
|
004AAC3F FF5304 call dword ptr [ebx+$04]
004AAC42 8D5598 lea edx, [ebp-$68]

* Reference to FormReg
|
004AAC45 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditComp : TEdit
|
004AAC48 8B80E0020000 mov eax, [eax+$02E0]

|
004AAC4E E8997FF8FF call 00432BEC
004AAC53 8B4598 mov eax, [ebp-$68]
004AAC56 50 push eax

* Possible String Reference to: 'RegCompant'
|
004AAC57 B9C4AD4A00 mov ecx, $004AADC4

* Possible String Reference to: 'RegData'
|
004AAC5C BAB4AD4A00 mov edx, $004AADB4
004AAC61 8B45F8 mov eax, [ebp-$08]
004AAC64 8B18 mov ebx, [eax]

* Possible reference to virtual method TIniFile.OFFS_04
|
004AAC66 FF5304 call dword ptr [ebx+$04]
004AAC69 8D5594 lea edx, [ebp-$6C]

* Reference to FormReg
|
004AAC6C 8B45FC mov eax, [ebp-$04]

* Reference to control TFormReg.EditCode : TEdit
|
004AAC6F 8B80E8020000 mov eax, [eax+$02E8]

|
004AAC75 E8727FF8FF call 00432BEC
004AAC7A 8B4594 mov eax, [ebp-$6C]
004AAC7D 50 push eax

* Possible String Reference to: 'RegCode'
|
004AAC7E B9D8AD4A00 mov ecx, $004AADD8

* Possible String Reference to: 'RegData'
|
004AAC83 BAB4AD4A00 mov edx, $004AADB4
004AAC88 8B45F8 mov eax, [ebp-$08]
004AAC8B 8B18 mov ebx, [eax]

* Possible reference to virtual method TIniFile.OFFS_04
|
004AAC8D FF5304 call dword ptr [ebx+$04]
004AAC90 33C0 xor eax, eax
004AAC92 5A pop edx
004AAC93 59 pop ecx
004AAC94 59 pop ecx
004AAC95 648910 mov fs:[eax], edx

****** FINALLY
|
004AAC98 68AFAC4A00 push $004AACAF
004AAC9D B201 mov dl, $01
004AAC9F 8B45F8 mov eax, [ebp-$08]
004AACA2 8B08 mov ecx, [eax]

* Possible reference to virtual method TIniFile.OFFS_04
|
004AACA4 FF51FC call dword ptr [ecx-$04]
004AACA7 C3 ret

004AACA8 E9B38AF5FF jmp 00403760
004AACAD EBEE jmp 004AAC9D

****** END
|
* Reference to FormReg
|
004AACAF 8B45FC mov eax, [ebp-$04]

|
004AACB2 E8F533FAFF call 0044E0AC
004AACB7 33C0 xor eax, eax
004AACB9 5A pop edx
004AACBA 59 pop ecx
004AACBB 59 pop ecx
004AACBC 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '_^[嬪]门课募柚闷?
|
004AACBF 68D9AC4A00 p


评语编辑室 v5.0

 标 题:评语编辑室 v5.0 delphi注册机 (1千字)
发信人:小楼
时 间:2001-6-12 17:30:07
详细信息:
{评语编辑室 v5.0 注册机,delhpi5.0编译通过；
以下为key.pas代码，你需要自己构造key.frm文件}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;{其中输入用户名}
Edit2: TEdit;{其中输入待注册码}
Edit3: TEdit;{显示生成的注册码}
Label1: TLabel;
Label2: TLabel;
Button1: TButton;{caption:='GetCode'}
Button2: TButton;{caption:='exit'}
Label3: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a:string;
sum,i,b,len:integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
if length(edit1.text)<6 then edit1.text:='用户名至少6个字符！'
else
begin
i:=1; sum:=0;
a:=edit1.text + edit2.text;
len:=length(a);
while i<=len do
begin
b:=ord(a[i])*i;
sum:=b+sum;
i:=i+1;
end;
sum:=sum*$2A1F3+$1DACA0F;
edit3.text:=inttostr(sum);
sum:=0;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

end.

标 题:呵呵~~~~~这个的TC的注册机~~~~~~~ (778字)
发信人:伪装者[CCG]
时 间:2001-6-12 19:31:32
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[81];
char sn[10];
long d=0;
int i,c;
end:printf("******pyEDITOR 5.0********\nThis keygen is made by Pretender\nPlease
  input your name  : ");
gets(string);
d=strlen(string);
if(d<6) {printf("Sorry,your username must longer than 5 letters!\n"); goto
  end;}
printf("Please input your ID    : ");
gets(sn);
strcat(string,sn);
d=0;
for(i=0;(c=string[i])!='\0';i++)
{c*=(i+1);d+=c;}
d*=0x2a1f3;d+=0x1daca0f;
/*printf("Your name is            : ");
puts(string);*/
printf("Your Register code is  : %ld\n",d);
printf(" *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


网际飞鹰之极速FTP1.0

 标 题:dede有大用----如何用dede解“网际飞鹰之极速FTP1.0” (4千字)
发信人:小楼
时 间:2001-7-7 12:15:42
详细信息:
DEDE的作用
----网际飞鹰之极速FTP1.0 keygen

主程序为NetEagle.exe。据说用language知道这个程序是delphi编译的，但fileinfo不能识别。用dede2.5可以反编译。

dede反编译成功后，在Forms栏，有如下：
Classes Info Offset
-----------------------------
TAboutForm 000d81dc
TChangeDirForm 000da4b0
..... ......
..... ......
TInputSerialForm 000ea244
...... ......

很明显，TInputSerialForm窗口与处理注册码有关，鼠标点击，显示这个窗口的细节。由运行NetEagle.exe知道，注册窗有edit1（用户名），edit2（序列号），button1（注册），button2（取消）等组件，所以在TInputSerialForm窗口中找“button1（注册）”，发现
object FlatButton1: TFlatButton
Left = 72
Top = 80
Width = 73
Height = 25
Caption = '注 册(&R)'
TabOrder = 2
OnClick = FlatButton1Click <--“注册”按钮按下后的事件。
end

然后，回到dede的Procedures栏，这包括了Forms栏所有窗口的事件代码。
Unit Name Class Name
--------------------------------------
AboutFrm TAboutForm
...... ......
...... ......
InputSerialFrm TInputSerialForm
...... ......

鼠标左键点击InputSerialFrm，展示此窗口内包含的所有事件。其中有
Event RVA Hint
------------------------------------------
FlatButton1Click 004a1b7c 0017
FlatButton2Click 004a1b84 0017
...... ......
...... ......

鼠标双击FlatButton1Click，显示事件的反编译代码：
......
004A1BBD E83A000000 call 004A1BFC <--关键
004A1BC2 84C0 test al, al
004A1BC4 740E jz 004A1BD4
......

鼠标双击004A1BBD E83A000000 call 004A1BFC进入：
* Possible String Reference to: 'NE-' <-------
| |
004A1C7F BA341E4A00 mov edx, $004A1E34 |
|
* Reference to: system.@LStrCmp; |
| |
004A1C84 E85723F6FF call 00403FE0 <--注册码起始部分为“NE-”
004A1C89 750F jnz 004A1C9A
004A1C8B 8B45EC mov eax, [ebp-$14]

* Possible String Reference to: '-EWD' <--------
| |
004A1C8E BA401E4A00 mov edx, $004A1E40 |
|
* Reference to: system.@LStrCmp; |
| |
004A1C93 E84823F6FF call 00403FE0 <--注册码结束部分为“-EWD”
004A1C98 740D jz 004A1CA7
004A1C9A 8B45FC mov eax, [ebp-$04]
004A1C9D E8A6010000 call 004A1E48
004A1CA2 E92B010000 jmp 004A1DD2
......
......
......
004A1CFF 81FB00E1F505 cmp ebx, $05F5E100 <--注册码数字部分必须在
004A1D05 7C08 jl 004A1D0F | 100000000至
004A1D07 81FBFFC99A3B cmp ebx, $3B9AC9FF | 999999999之间
004A1D0D 7E0D jle 004A1D1C <--
004A1D0F 8B45FC mov eax, [ebp-$04]
004A1D12 E831010000 call 004A1E48
004A1D17 E9B6000000 jmp 004A1DD2
004A1D1C 8BC3 mov eax, ebx
004A1D1E B94D000000 mov ecx, $0000004D
004A1D23 99 cdq
004A1D24 F7F9 idiv ecx <--注册码除以77
004A1D26 05C0169430 add eax, +$309416C0<--商+815011520
004A1D2B B94D000000 mov ecx, $0000004D
004A1D30 99 cdq
004A1D31 F7F9 idiv ecx <--和除以77
004A1D33 85D2 test edx, edx
004A1D35 0F858B000000 jnz 004A1DC6 <--余数为0，注册码数字正确。

随后就是写注册机了，用穷举办法，我用delphi5.0及控件KOL&MCK0.82编译。注册机界面中有editbox1（输入用户名），editbox2（注册码），button1（生成注册码），button2（退出）等组件。

keygen.pas中：

var code:integer;

procedure TForm1.Button1Click(Sender: PObj);
begin
if length(editbox1.text)=0 then editbox2.text:='请输入用户名！'
else begin
Randomize;
code:=random(800000000)+100000000;
while (((code div 77)+$309416c0) mod 77)<>0 do
begin
code:=code+1;
end;
editbox2.text:='NE-'+int2str(code)+'-EWD';
end;
end;

procedure TForm1.Button2Click(Sender: PObj);
begin
form.close;
end;
end.

谁说dede没用？dede有大用！

标 题:贴这个网际飞鹰的TC注册机 (430字)
发信人:TAE!
时 间:2001-7-8 9:47:07
详细信息:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main()
{
long i,c;
char name[81];
randomize();
printf(" *********************\n *KeyGen by TAE![CCG]*\n *********************\n\n");
printf("Please input your name:");
gets(name);
f: c=rand()*100000;
if (c>999999999 || c<100000000)goto f;
{while ((c/0x4d+0x309416c0)%0x4d!=0)
c++;}
printf("Your code is:NE-%ld-EWD",c);
}

标 题:ASM KEY_GEN,也来凑热闹，顺便练练手 (3千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-8 22:01:38
详细信息:

练练手，很久没用汇编写东西了。
另外，都Win时代了注册机是不是该换换皮肤了，老是dos界面总使人觉得与时代脱节。。。
如何写随机数生成代码？有没有对应Api？这里没有随机部分，望高手指教。。。
汇编写注册有时最方便不过，如果算法较复杂，就可分析出入口和出口，然后将反汇编代码修改一下粘贴过来，加上GUI部分就可以了，最大的优点是速度快，体积小，win32汇编编程几乎与C一样方便，只可惜，时间太有限了，人的生命太短暂了......

COMPILE:
cls
ml /c /coff /Cp wf.asm
rc /v wf.rc
link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib wf.obj wf.res

wf.asm****************************************
.386
.model flat,stdcall
option casemap:none
include hd.h
_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
CurrentEbx dd 99999999
flg_found dd 0
MsgMesaage1 db "All possible Keys have been passed,restart the program! ",0
MsgCap db "By (C)hume,July,2001",0
szBuf1 db 20 dup(0)
szBuf2 db "NE-%d-EWD",0

.data?
hInstance HANDLE ?
.const
DLG_MAIN equ 1000
GEN equ 1001
XIT equ 1002
EDIT_COD equ 1003
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL

_ProcDlg proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==GEN
mov ebx,CurrentEbx

lopcal: inc ebx
cmp ebx, 5F5E100h ;<--注册码数字部分必须在
jl New_over ; | 100000000至
cmp ebx, 3B9AC9FFh ; | 999999999之间
jge New_over ;<--

call Cal
cmp flg_found,1
jnz lopcal
mov CurrentEbx,ebx
invoke RtlZeroMemory,addr szBuf1,20
invoke wsprintf,addr szBuf1,addr szBuf2,ebx
invoke SetDlgItemText,hWnd,EDIT_COD,addr szBuf1

.elseif ax==XIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif

.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
New_over:
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION
ret

_ProcDlg ENDP

Cal PROC uses eax ebx
mov eax, ebx
mov ecx, 4Dh
cdq
idiv ecx ;<--注册码除以77
add eax, 309416C0h ;<--商+815011520
mov ecx, 4Dh
cdq
idiv ecx ;<--和除以77
test edx, edx
jnz ToEit

Found:
mov flg_found,1

ToEit: ret
Cal endp
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end all
end start

wf.rc***************************************
#include <c:\masm32\include\resource.h>
#define DLG_MAIN 1000
#define GEN 1001
#define XIT 1002
#define EDIT_COD 1003
DLG_MAIN DIALOG 62, 39, 200, 45
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "网际飞鹰之极速FTP1.0 keygen By Hume"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "Generate", GEN, 148, 6, 50, 14
PUSHBUTTON "EXIT", XIT, 148, 24, 50, 14
LTEXT "USERNAME:Random", -1, 7, 6, 76, 8
LTEXT "REGCODE:", -1, 7, 21, 38, 8
EDITTEXT EDIT_COD, 47, 20, 72, 11, WS_BORDER | WS_TABSTOP
}

hd.h**************************
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\comctl32.inc
include c:\masm32\include\comdlg32.inc
include c:\masm32\include\shell32.inc

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
includelib c:\masm32\lib\comctl32.lib
includelib c:\masm32\lib\comdlg32.lib
includelib c:\masm32\lib\shell32.lib


隐藏目录的加密光盘

标 题:隐藏目录的加密光盘(1)－－－－兼谈DeDe的使用 (14千字)
发信人:mr.wei
时 间:2001-3-26 6:32:53
详细信息:
隐藏目录的加密光盘

现在有很多光盘都加了密，从光盘属性得知共有640M的文件,
但是直接查看光盘只有几十个小文件,
合计不到40M,剩余的600M文件隐藏到什么地方去了?

这些使用隐藏目录方式加密的光盘，必须使用“冷雨浏览器”，而且必须输入密码.
如果密码正确,就会自动打开一个资源管理器窗口,显示光盘上隐藏的文件夹。

一直没有留意过这一类光盘,因为据我所知这类光盘的内容相当多都不太正经.
而我对此不感兴趣.

刚刚买了张Delphi专辑光盘,就属于这类隐藏目录的加密光盘.
不知是何原因,连Delphi都加密!

封皮上写明运行序列号为"658888",打开光盘,输入序列号,提示"密码错误".
Kao!做D版的越来越没有敬业精神了,连这个小问题也出错.

用GetType检测Setup.exe得知程序是用Delphi编写的.
那就用Delphi的专用反编译软件DeDe破解吧!

1.启动DeDe,打开setup.exe后,单击Process开始反编译

2.DeDe弹出对话框,提示"如果目标全部加载完毕,请单击确定"

3.单击确定,很快DeDe说"转储完毕",再次单击"确定"

4.单击子例程(Procedures)按钮,得知程序有两个窗体(单元,Unit)

5.查了下,知道setup1是接受口令输入的窗体

6.在左侧的列表窗口选择setup2窗体,右侧的列表窗口出现与该窗体相关的子例程.

7.双击右侧列表窗口内的B_OKClick事件子例程.
这表示显示在程序中输入口令后,单击确定按钮后执行的代码

00442D98 55 push ebp
00442D99 8BEC mov ebp, esp
00442D9B 33C9 xor ecx, ecx
00442D9D 51 push ecx
00442D9E 51 push ecx
00442D9F 51 push ecx
00442DA0 51 push ecx
00442DA1 51 push ecx
00442DA2 53 push ebx
00442DA3 8BD8 mov ebx, eax
00442DA5 33C0 xor eax, eax
00442DA7 55 push ebp
00442DA8 68B92F4400 push $00442FB9

***** TRY
|
00442DAD 64FF30 push dword ptr fs:[eax]
00442DB0 648920 mov fs:[eax], esp
00442DB3 8D55F8 lea edx, [ebp-$08]

* Reference to control TForm2.Edit_Password : TEdit
|
00442DB6 8B83D4020000 mov eax, [ebx+$02D4]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
00442DBC E89B06FEFF call 0042345C
00442DC1 8B45F8 mov eax, [ebp-$08]
00442DC4 8D55FC lea edx, [ebp-$04]

* Reference to: sysutils.Trim(System.AnsiString):System.AnsiString;
|
00442DC7 E80C49FCFF call 004076D8
00442DCC 837DFC00 cmp dword ptr [ebp-$04], +$00
00442DD0 750F jnz 00442DE1

* Possible String Reference to: '请输入序列号'
|
00442DD2 B8D02F4400 mov eax, $00442FD0

* Reference to: dialogs.ShowMessage(System.AnsiString);
|
00442DD7 E800FAFFFF call 004427DC
00442DDC E9AD010000 jmp 00442F8E
00442DE1 8B45FC mov eax, [ebp-$04] <==== 输入的假密码

* Possible String Reference to: '238888' <=======密码? Yes!
|
00442DE4 BAE82F4400 mov edx, $00442FE8

* Reference to: system.@LStrCmp;
|
00442DE9 E81A0EFCFF call 00403C08 <====调用system单元的字符串比较函数
00442DEE 0F85B8000000 jnz 00442EAC <====不相等则跳转
00442DF4 6A00 push $00
00442DF6 8D45F4 lea eax, [ebp-$0C]
00442DF9 8A1569584400 mov dl, byte ptr [$445869]

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
00442DFF E81C0CFCFF call 00403A20
00442E04 8D45F4 lea eax, [ebp-$0C]

* Possible String Reference to: ':\Program Files\Accessories\200001' <===生成Key文件
|
00442E07 BAF82F4400 mov edx, $00442FF8

* Reference to: system.@LStrCat;
|
00442E0C E8EF0CFCFF call 00403B00
00442E11 8B45F4 mov eax, [ebp-$0C]

* Reference to: system.@LStrToPChar;
|
00442E14 E8A30EFCFF call 00403CBC
00442E19 50 push eax
00442E1A 8D55EC lea edx, [ebp-$14]

* Reference to TApplication instance
|
00442E1D A1944C4400 mov eax, dword ptr [$444C94]
00442E22 8B00 mov eax, [eax]

* Reference to: forms.TApplication.GetExeName(TApplication):System.AnsiString;
|
00442E24 E8F3C6FFFF call 0043F51C
00442E29 8B45EC mov eax, [ebp-$14]
00442E2C 8A10 mov dl, byte ptr [eax]
00442E2E 8D45F0 lea eax, [ebp-$10]

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
00442E31 E8EA0BFCFF call 00403A20
00442E36 8D45F0 lea eax, [ebp-$10]

* Possible String Reference to: ':\browse\aaa\200001' <=== 隐藏的Key文件
|
00442E39 BA24304400 mov edx, $00443024

* Reference to: system.@LStrCat;
|
00442E3E E8BD0CFCFF call 00403B00
00442E43 8B45F0 mov eax, [ebp-$10]

* Reference to: system.@LStrToPChar;
|
00442E46 E8710EFCFF call 00403CBC
00442E4B 50 push eax

* Reference to: kernel32.CopyFileA()
|
00442E4C E8AB2EFCFF call 00405CFC
00442E51 6A01 push $01
00442E53 6A00 push $00
00442E55 6A00 push $00
00442E57 8D55F0 lea edx, [ebp-$10]

* Reference to TApplication instance
|
00442E5A A1944C4400 mov eax, dword ptr [$444C94]
00442E5F 8B00 mov eax, [eax]

* Reference to: forms.TApplication.GetExeName(TApplication):System.AnsiString;
|
00442E61 E8B6C6FFFF call 0043F51C
00442E66 8B45F0 mov eax, [ebp-$10]
00442E69 8A10 mov dl, byte ptr [eax]
00442E6B 8D45F4 lea eax, [ebp-$0C]

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
00442E6E E8AD0BFCFF call 00403A20
00442E73 8D45F4 lea eax, [ebp-$0C]

* Possible String Reference to: ':\browse\aaa\hcssee.exe' <=== 看隐藏文件夹的主程序
|
00442E76 BA40304400 mov edx, $00443040

* Reference to: system.@LStrCat;
|
00442E7B E8800CFCFF call 00403B00
00442E80 8B45F4 mov eax, [ebp-$0C]

* Reference to: system.@LStrToPChar;
|
00442E83 E8340EFCFF call 00403CBC
00442E88 50 push eax

* Possible String Reference to: 'Open'
|
00442E89 6858304400 push $00443058
00442E8E 8BC3 mov eax, ebx

* Reference to: controls.TWinControl.GetHandle(TWinControl):Windows.HWND;
|
00442E90 E82363FEFF call 004291B8
00442E95 50 push eax

* Reference to: shell32.ShellExecuteA()
|
00442E96 E859D3FFFF call 004401F4

* Reference to TApplication instance
|
00442E9B A1944C4400 mov eax, dword ptr [$444C94]
00442EA0 8B00 mov eax, [eax]

* Reference to: forms.TApplication.Terminate(TApplication);
|
00442EA2 E861C2FFFF call 0043F108
00442EA7 E9E2000000 jmp 00442F8E
00442EAC 8B45FC mov eax, [ebp-$04]

* Possible String Reference to: '3456'
|
00442EAF BA68304400 mov edx, $00443068

* Reference to: system.@LStrCmp;
|
00442EB4 E84F0DFCFF call 00403C08
00442EB9 7558 jnz 00442F13
00442EBB 6A01 push $01
00442EBD 6A00 push $00
00442EBF 6A00 push $00
00442EC1 8D55F0 lea edx, [ebp-$10]

* Reference to TApplication instance
|
00442EC4 A1944C4400 mov eax, dword ptr [$444C94]
00442EC9 8B00 mov eax, [eax]

* Reference to: forms.TApplication.GetExeName(TApplication):System.AnsiString;
|
00442ECB E84CC6FFFF call 0043F51C
00442ED0 8B45F0 mov eax, [ebp-$10]
00442ED3 8A10 mov dl, byte ptr [eax]
00442ED5 8D45F4 lea eax, [ebp-$0C]

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
00442ED8 E8430BFCFF call 00403A20
00442EDD 8D45F4 lea eax, [ebp-$0C]

* Possible String Reference to: ':\browse\setup.exe'
|
00442EE0 BA78304400 mov edx, $00443078

* Reference to: system.@LStrCat;
|
00442EE5 E8160CFCFF call 00403B00
00442EEA 8B45F4 mov eax, [ebp-$0C]

* Reference to: system.@LStrToPChar;
|
00442EED E8CA0DFCFF call 00403CBC
00442EF2 50 push eax

* Possible String Reference to: 'Open'
|
00442EF3 6858304400 push $00443058
00442EF8 8BC3 mov eax, ebx

* Reference to: controls.TWinControl.GetHandle(TWinControl):Windows.HWND;
|
00442EFA E8B962FEFF call 004291B8
00442EFF 50 push eax

* Reference to: shell32.ShellExecuteA()
|
00442F00 E8EFD2FFFF call 004401F4

* Reference to TApplication instance
|
00442F05 A1944C4400 mov eax, dword ptr [$444C94]
00442F0A 8B00 mov eax, [eax]

* Reference to: forms.TApplication.Terminate(TApplication);
|
00442F0C E8F7C1FFFF call 0043F108
00442F11 EB7B jmp 00442F8E
00442F13 FF0564584400 inc dword ptr [$445864] <==单击Ok的次数
00442F19 833D6458440001 cmp dword ptr [$445864], +$01 <=== 是第2次输入密码吗?
00442F20 750C jnz 00442F2E <========== 是则跳转

* Possible String Reference to: '该序列号无效，请查看输入的是否与CD
| 封套上的序列号一致！'
|
00442F22 B894304400 mov eax, $00443094

* Reference to: dialogs.ShowMessage(System.AnsiString);
|
00442F27 E8B0F8FFFF call 004427DC <==== 提示"密码错!"
00442F2C EB60 jmp 00442F8E

* Possible String Reference to: '欢迎使用图片浏览器的测试版！'
|
00442F2E B8D4304400 mov eax, $004430D4

* Reference to: dialogs.ShowMessage(System.AnsiString);
|
00442F33 E8A4F8FFFF call 004427DC <==== 执行冷雨浏览器
00442F38 6A01 push $01
00442F3A 6A00 push $00
00442F3C 6A00 push $00
00442F3E 8D55F0 lea edx, [ebp-$10]

* Reference to TApplication instance
|
00442F41 A1944C4400 mov eax, dword ptr [$444C94]
00442F46 8B00 mov eax, [eax]

* Reference to: forms.TApplication.GetExeName(TApplication):System.AnsiString;
|
00442F48 E8CFC5FFFF call 0043F51C
00442F4D 8B45F0 mov eax, [ebp-$10]
00442F50 8A10 mov dl, byte ptr [eax]
00442F52 8D45F4 lea eax, [ebp-$0C]

* Reference to: system.@LStrFromChar(String;Char);
| or: system.@LStrFromWChar(String;WideChar);
| or: system.@WStrFromChar(WideString;Char);
| or: system.@WStrFromWChar(WideString;WideChar);
|
00442F55 E8C60AFCFF call 00403A20
00442F5A 8D45F4 lea eax, [ebp-$0C]

* Possible String Reference to: ':\browse\setup.exe'
|
00442F5D BA78304400 mov edx, $00443078

* Reference to: system.@LStrCat;
|
00442F62 E8990BFCFF call 00403B00
00442F67 8B45F4 mov eax, [ebp-$0C]

* Reference to: system.@LStrToPChar;
|
00442F6A E84D0DFCFF call 00403CBC
00442F6F 50 push eax

* Possible String Reference to: 'Open'
|
00442F70 6858304400 push $00443058
00442F75 8BC3 mov eax, ebx

* Reference to: controls.TWinControl.GetHandle(TWinControl):Windows.HWND;
|
00442F77 E83C62FEFF call 004291B8
00442F7C 50 push eax

* Reference to: shell32.ShellExecuteA()
|
00442F7D E872D2FFFF call 004401F4

* Reference to TApplication instance
|
00442F82 A1944C4400 mov eax, dword ptr [$444C94]
00442F87 8B00 mov eax, [eax]

* Reference to: forms.TApplication.Terminate(TApplication);
|
00442F89 E87AC1FFFF call 0043F108
00442F8E 33C0 xor eax, eax
00442F90 5A pop edx
00442F91 59 pop ecx
00442F92 59 pop ecx
00442F93 648910 mov fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '[嬪]?
|
00442F96 68C02F4400 push $00442FC0
00442F9B 8D45EC lea eax, [ebp-$14]
00442F9E BA03000000 mov edx, $00000003

* Reference to: system.@LStrArrayClr;
|
00442FA3 E8F808FCFF call 004038A0
00442FA8 8D45F8 lea eax, [ebp-$08]

* Reference to: system.@LStrClr(String);
|
00442FAB E8CC08FCFF call 0040387C
00442FB0 8D45FC lea eax, [ebp-$04]

* Reference to: system.@LStrClr(String);
|
00442FB3 E8C408FCFF call 0040387C
00442FB8 C3 ret

00442FB9 E97E03FCFF jmp 0040333C
00442FBE EBDB jmp 00442F9B

****** END
|
00442FC0 5B pop ebx
00442FC1 8BE5 mov esp, ebp
00442FC3 5D pop ebp
00442FC4 C3 ret

8.看明白了吗?
(摇头)我-------还是--------------不懂!
我倒!!!!!!!!!!
上面的程序用pascal表示如下:

write('输入序列号: ');
readln(str_inputed_sn);
if string_compare(str_inputed_sn,'238888') then
display_hidden_files()
else
begin
int_compare_counter:=int_compare_counter+1;
if (int_compare_counter>=2) or string_compare(str_inputed_sn,'3456') then
display_CoolRain_browser();
end;

9.小结:
本例的真正序列号是: 238888

10.做这张光盘的JS真是TMD,封皮上写着Delphi 5正式版,里面却是trial版本.


远程控制程式

标 题:这个软件的加密简直就是摆设，而且软件也没有加壳，作者说注册要500元，估计是和大家开玩笑。 (2千字)
发信人:anony
时 间:2001-5-21 18:19:06
详细信息:

远程控制程式，http://hbsafe.yeah.net 可控制鼠标、键盘、屏幕、硬盘、可远程提取密码、。。。

dede就是好用，反编译一下，什么都看见了。
call 00426E28
call 00407DD4
这两个call可以不用理会，why?，看看下面，已经写得很清楚了^_^

00462FC1 64FF30 push dword ptr fs:[eax]
00462FC4 648920 mov fs:[eax], esp
00462FC7 8D55F4 lea edx, [ebp-$0C]

* Reference to control Edit1 : TEdit
|
00462FCA 8B83EC020000 mov eax, [ebx+$02EC]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
00462FD0 E8533EFCFF call 00426E28
00462FD5 8B45F4 mov eax, [ebp-$0C]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
00462FD8 E8F74DFAFF call 00407DD4
00462FDD 8BF0 mov esi, eax 把第1个框内的数值放入esi
00462FDF 8D55F0 lea edx, [ebp-$10]

* Reference to control Edit2 : TEdit
|
00462FE2 8B83F0020000 mov eax, [ebx+$02F0]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
00462FE8 E83B3EFCFF call 00426E28
00462FED 8B45F0 mov eax, [ebp-$10]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
00462FF0 E8DF4DFAFF call 00407DD4
00462FF5 03F0 add esi, eax 把第2个框内的数值加入esi
00462FF7 8D55EC lea edx, [ebp-$14]

* Reference to control Edit3 : TEdit
|
00462FFA 8B83F4020000 mov eax, [ebx+$02F4]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
00463000 E8233EFCFF call 00426E28
00463005 8B45EC mov eax, [ebp-$14]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
00463008 E8C74DFAFF call 00407DD4
0046300D 8BF8 mov edi, eax 把第3个框内的数值放入edi
0046300F 8D55E8 lea edx, [ebp-$18]

* Reference to control Edit4 : TEdit
|
00463012 8B8300030000 mov eax, [ebx+$0300]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
00463018 E80B3EFCFF call 00426E28
0046301D 8B45E8 mov eax, [ebp-$18]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
00463020 E8AF4DFAFF call 00407DD4
00463025 0FAFF8 imul edi, eax 第3个框的数值和第4个框的数值相乘
00463028 03F7 add esi, edi 加上第1、2框内数值之和
0046302A 81FED0070000 cmp esi, $000007D0 比较是否等于十进制的2000
00463030 0F85C7000000 jnz 004630FD 等于则通过

最简单的注册码就是 2000 0 0 0

软件注册后会在windows\system下生成一个6个字节大小的文件sysdat.dat
内容为
0x02 0x6Fh 0x6B 0x00 0x00 0x00


ADSubstract v2.10

标 题:egis发布了adsubstract pro 2.1注册器，带源码的。 (2千字)
发信人:1212
时 间:2001-2-2 21:40:45
详细信息:
 /*

ADSubstract v2.10 Keymaker by Egis/CORE
Compile: cl /o2 adsk.c md5dgst.c

*/

#include <stdio.h>
#include <stdlib.h>

#include "md5.h"

typedef    unsigned char    BYTE;
typedef    unsigned int    WORD;
typedef    unsigned long    DWORD;
typedef unsigned _int64 QWORD;

BYTE    base[] = { "0123456789abcdefghijklmnopqrstuvwxyz" };

QWORD tobase( BYTE m )
{
BYTE    i;

for( i = 0; i < 36; i++ )
if( base[ i ] == m )
return i;
return 0;
}

QWORD t64( BYTE *t )
{
QWORD  q;
BYTE    p[ 100 ], *b = p;

q = 0;
memset( p, 0, 100 );
strcpy( p, t );
strlwr( p );
while( *b ) {
q *= 32;
q += tobase( *b );
b++;
}

return q;
}

void p64( QWORD key )
{
BYTE    s[ 20 ], *p = s, m;

memset( s, 0, 20 );
while( key ) {
*p = base[ key % 32L ];
key /= 32L;
p++;
}
p = s;
while( *p ) {
if( *p == '1' ) *p = 'w';
if( *p == 'b' ) *p = 'x';
if( *p == 'o' ) *p = 'z';
p++;
}
strrev( s );
strupr( s );
printf( s );
}

void main( void )
{
MD5_CTX    c;
BYTE        md[ MD5_DIGEST_LENGTH ];
int        i;
DWORD      magic[ 10 ] = { 0x5733a0c3, 0x155cf8be,
    0xffc55d8d, 0x11cf424, 0x7117d5b1, 0x4baf5541, 0x83179f31, 0x20f3f593 };
BYTE        pad[ 10 ];
QWORD      k1, k2;
QWORD      k;
char        key[ 10 ] = { "EGIS" };

printf( "\n ._______/\\__________/\\_______/\\___________.\n"
" /    _____\\_  ___
    \\_____  \\    _____/\n"
"/    \\      \\
      _\\    /  /  /__    __\\___\n"
"\\____________/__________\\___\\____  \\________/\n"
"+-ds-----------+ C.O.R.E..2.K +- \\_/ -------+\n\n"
"ADSubstract Pro v2.10 Keymaker by Egis/CORE.\n"
    );

while( 1 ) {

srand( time( NULL ) );
for( i = 4; i < 8; i++ )
key[ i ] = base[ rand() % 32 ];

k1 = t64( key );
pad[ 0 ] = ( BYTE )( ( k1 & 0xff00 ) >> 8
    );
pad[ 1 ] = ( BYTE )( ( k1 & 0xff0000 ) >>
    16 );
pad[ 2 ] = ( BYTE )( ( k1 & 0xff000000 ) >>
    24 );
pad[ 3 ] = ( BYTE )( ( k1 & 0xff00000000 )
    >> 32 );
pad[ 4 ] = ( BYTE )( k1 & 0xff );

if( pad[ 4 ] > 18 )
break;
}

printf( "\nYour registration code: " );

p64( k1 );

MD5_Init( &c );
MD5_Update( &c, ( BYTE* ) magic, 32 );
MD5_Update( &c, pad, 5 );
MD5_Update( &c, ( BYTE* ) magic, 32 );
MD5_Final( md, &c );

k2 = md[ 0 ];
k2 <<= 8;
k2 += md[ 1 ];
k2 <<= 8;
k2 += md[ 2 ];
k2 <<= 8;
k2 += md[ 3 ];
k2 <<= 8;
k2 += md[ 4 ];

p64( k2 );
printf( "\n" );

}


CmailServer3.2

 标 题:CmailServer3.2注册机改进版。序列号应是12位16进制数字（0--9，a--f）。 (1千字)
发信人:WenXinJY
时 间:2001-7-25 19:05:56
详细信息:
CMailServer Ver 3.2

主要功能
1、支持通用邮件客户端软件 Outlook Express、Foxmail 等收发邮件。
2、支持 Web 页面收发邮件。
3、支持 Internet 收发邮件。
4、支持用户通过 Web 浏览器申请邮箱、修改邮箱密码、修改用户信息等资料。
5、支持管理员新建、删除、禁用用户邮箱和设置用户邮箱大小。
6、支持管理员同时向多个用户发送邮件。
7、支持管理员生成 HTML 和 INI 格式的用户邮箱信息报表。
8、支持作为 NT 服务运行。

未注册限制：
1、只支持10个用户
2、能享受免费升级服务。
3、能获得免费的技术支持服务。

下载地址： http://microserver.top263.net/cmailserver/cmailserver32cr2.exe

注册机：
#include "stdio.h"
/* Key Generator for CMailServer Ver 3.2 */
/* tcc -mt -lt crk-ccp */
main()
{
char *str1="microserver1";
char *str2="cmailserver3";
char setup[13];
char rn[13];
char sn[13];
int i=0;
int temp;
L1:
puts("\ --= CMailServer Ver 3.2 注册机 Programmed by
西风瘦马=--\r\n请输入您的特征码(共12位)：");
gets(setup);
if(strlen(setup)-12)goto L1;
L2:
puts("请输入您的序列号(共12位16进制数字)：");
gets(rn);
if(strlen(rn)-12)goto L2;
for(i=0;i<12;i++)
{
temp=(str1[i]+str2[i]+setup[i]+rn[i])%0x3e;
sn[i]=temp>=0x1a?(temp>=0x34?temp-4:temp+0x27):(temp+0x61);
}
sn[i]=0;
printf("\n您的注册码是: %s\n多谢使用本程序！\n",sn);
getch();
}
北京遥志软件注册算法都是一样的，只是参与运算的字符串不一样而已。哈哈哈……

--------------------------------------------------------------------------------


Deep Finesse

标 题:桥牌软件Deep Finesse的注册机 (1千字)
发信人:blowfish
时 间:2001-1-13 1:51:13
详细信息:

1.Deep Finesse 1.6 [双明手问题分析程序]

http://www.deepfinesse.com/releases/DF-Installer-26-Nov-99.exe[526K]

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
char          SerialString[16];
char          UnlockString[16];
unsigned long Serial, Unlock;
int          k;

printf("Enter your serial number(xxx-xxx-xxx): ");
gets(SerialString);

if ((strlen(SerialString) != 11) || (SerialString[3] !=
    '-') || (SerialString[7] != '-'))
{
printf("Wrong serial number.\n");
return;
}

for(k = 3; k <= 5; k++)
{
SerialString[k] = SerialString[k+1];
}

for(k = 6; k <= 8; k++)
{
SerialString[k] = SerialString[k+2];
}

SerialString[9] = '\0';
Serial = atol(SerialString);

__asm
{
MOV
      EAX,[Serial]
XOR
      EDX,EDX
IMUL
      EAX,EAX,0x0004535FL
ADD
      EAX,0x466F9629L
MOV
      ECX,0x3B9ACA00L
DIV
      ECX
CMP
      EDX,0x05F5E100L
JAE
      _next_
ADD
      EDX,0x05F5E100L
_next_:
MOV
      [Unlock], EDX
}

sprintf(UnlockString, "%09lu", Unlock);
printf("Your unlock code is: ");
for(k = 0; k <= 2; k++)
{
putchar(UnlockString[k]);
}
putchar('-');
for(k = 3; k <= 5; k++)
{
putchar(UnlockString[k]);
}
putchar('-');
for(k = 6; k <= 8; k++)
{
putchar(UnlockString[k]);
}
putchar('\n');
}

标 题:我来凑热闹 (1千字)
发信人:henryw
时 间:2001-1-22 14:17:11
详细信息:

对BLOWFISH大侠真是佩服得五体投地, 我也来凑个热闹.

下载了李尔说的桥牌软件DEEP FINESSE，俺也是破解爱好者兼桥牌爱好者，
所以试着想解掉df，结果试了一大圈，发现可以这么干。

在Resourse Explorer里面将main.mbd提到外面，
以下是原文件中的一段：
<check>
handler set dodemo=$param
logo hide
serialNo hide
serialNoBox hide
serialNoTxt hide
mbedlet call getserial
handler if ($result = ok) <------ok 就注册了。
mbedlet set registered=yes
mbedlet doDeal "Last Hand.txt 1"
handler else
handler if ($dodemo = yes)
mbedlet doDeal Demo1
handler else
mbedlet hideBigLogo
register.child.serialNo set value=$result
mbedlet cleanup
mbedlet buttons hide
mbedlet statusHide
pipe hide
me above
me show
handler endif
handler endif
</check>
<unlock>
mbedlet call regvalida#$register.child.unlockCode.value
handler if ($result = ok) <------- ok 就注册了。
register approved
handler else
register.child.errorText show
handler endif
</unlock>
修改成:
<check>
handler set dodemo=$param
logo hide
serialNo hide
serialNoBox hide
serialNoTxt hide
mbedlet call getserial
handler if ($result = ok) 〈------OK 变成没有注册了。!@#$%
handler if ($dodemo = yes)
mbedlet doDeal Demo1
handler else
mbedlet hideBigLogo
register.child.serialNo set value=$result
mbedlet cleanup
mbedlet buttons hide
mbedlet statusHide
pipe hide
me above
me show
handler endif
handler else
mbedlet set registered=yes
mbedlet doDeal "Last Hand.txt 1"
handler endif
</check>
<unlock>
mbedlet call regvalida#$register.child.unlockCode.value
handler if ($result = ok) 〈------- OK变成没有注册了。!@#$%
register.child.errorText show
handler else
register approved
handler endif
</unlock>

把Deep Finesse.exe中的相应部分替换掉，似乎就可以破解了。

标 题:破解过程 (2千字)
发信人:henryw
时 间:2001-1-22 22:14:39
详细信息:

其实不好意思写出整个的破解过程，因为与blowfish相比，这种方法实在是比较可笑。不过既然1212兄想看，就不怕1212兄笑话，写出来献丑了。

拿来软件，首先用Dasm反汇编了一下，查看deadlist，发现有个地方比较奇怪，就是有个串叫作"regvalida"，想当然地认为这里应该是检测注册码的地方。于是动用trw2000，既然用hmemcpy拦不住，就干脆利用dasm里的地址拦截，可是跟进402D25这个call去后发现它不过是将自己输入的注册码前面加上"regvalida"，然后自己和"regvalida"进行比较，没什么意思，但是追进下面的Call里去时便进入了mbed.dll去了，然后就可以看见诸如$result=ok，not-ok，endif等等东东，非常象拿script写的，有点看vbscript的感觉。猜了几个地方跳转都是错的。无奈，只得重头再来。

这次想到启动后主画面中右上角有not registered字样，在Deep Finesse.exe里面找了一下，发现果然有，不是图片贴上去的。看看它的周围，净是些<>这样的符号，看起来象xml文件似的，一开始没太注意，当用resource explorer打开Deep Finesse.exe时发现rcdata里面有很多.mbd文件，每个文件的结构都很像xml，于是export了这几个文件，文本编辑器里赫然显示程序的流程，联想到刚才的追踪和认为象script的感觉，看来程序只是调用这些mbd文件里的function名称，而每个function的具体代码可能放在mbed.dll里面。

Search "not registered"，发现在main.mbd里面，找到位置后，想想判断是否注册的过程应该在上面一些的地方，果然如此，<check><unlock>这些字样在用trw2000追踪的时候看到过。这里的代码应该很透明了，
<check>
handler set dodemo=$param
logo hide
serialNo hide
serialNoBox hide
serialNoTxt hide
mbedlet call getserial
handler if ($result = ok)
mbedlet set registered=yes <---- registered应该是全局变量，
check通过就设为yes
mbedlet doDeal "Last Hand.txt 1"
handler else
handler if ($dodemo = yes)
mbedlet doDeal Demo1
handler else
mbedlet hideBigLogo
register.child.serialNo set value=$result
mbedlet cleanup
mbedlet buttons hide
mbedlet statusHide
pipe hide
me above
me show
handler endif
handler endif
</check>
<unlock>
mbedlet call regvalida#$register.child.unlockCode.value
handler if ($result = ok)
register approved
handler else
register.child.errorText show
handler endif
</unlock>
<approved>
mbedlet set cursor=arrow
mbedlet set registered=yes <------ 这里也是。
thankYouScore play
</approved>

加上有些编程知识，把代码换了位置，反正保证文件长度不变就可以了。利用winhex或者ultraedit这类二进制东东，找到原来main.mbd这些代码在exe文件里的位置，将修改过的main.mbd内容覆盖进去。然后运行Deep Finesse.exe，看来像是注册了。

象Deep Finesse这种用类似于script的东东（或许C++的高手们知道此类方法的准确名称）的软件，我还是头一次看见，真是大长见识。

破解完后，感觉有点怪怪的，有一种能够气死谁的感觉。J

标 题:另外一篇破解过程 (6千字)
发信人:KaXo
时 间:2001-1-23 5:35:28
详细信息:

Software: Deep.Finesse.v1.6
URL: http://www.deepfinesse.com/
Cracker: Hambo/CORE
Author: Hambo/CORE
Coder: Hambo/CORE
Date: 2001-1-22 22:48

Note:
I have not written tutorial for a long time. recently i have a long time holiday.
and this is easy to crack, so do it. HAHA

1) Use "Load Exports" of Softice's Symbol Loader To Load df_main.dll.
2) Enter "1234567890" as Unlock Code, and ctrl-d enter softice, bpx df_main!mbedEntryPoint
3) Back To Program, and click Unlock button.
4) Get Break in Softice

df_main!mbedEntryPoint
001B:01AC6580 MOV DWORD PTR [01ADFFF8],00000001
001B:01AC658A CALL 01AC1270
001B:01AC658F MOV EAX,[01CDAEF0]
001B:01AC6594 MOV ECX,EAX
001B:01AC6596 INC EAX
001B:01AC6597 TEST ECX,ECX
001B:01AC6599 MOV [01CDAEF0],EAX
001B:01AC659E JNZ 01AC65A5
001B:01AC65A0 CALL 01AC3010
001B:01AC65A5 MOV EDX,[01AD4060]
001B:01AC65AB PUSH EBX
001B:01AC65AC XOR EBX,EBX
001B:01AC65AE PUSH ESI
001B:01AC65AF MOV EAX,[EDX+0000071C]
001B:01AC65B5 MOV ESI,[ESP+0C] <-- a point to "regvalida1234567890"
"regvalida" is a mask of entrypoint it need looking for.
and following code is looking for that entrypoint.
001B:01AC65B9 CMP EAX,EBX
001B:01AC65BB PUSH EDI
001B:01AC65BC JZ 01AC65F2
001B:01AC65BE PUSH 09
001B:01AC65C0 PUSH 01AD4F78
001B:01AC65C5 PUSH ESI
001B:01AC65C6 CALL 01AD16B0
001B:01AC65CB ADD ESP,0C
001B:01AC65CE TEST EAX,EAX
001B:01AC65D0 JZ 01AC65F2
001B:01AC65D2 MOV EAX,[01AD4060]
001B:01AC65D7 MOV ECX,[EAX+0000071C]
001B:01AC65DD PUSH ECX
001B:01AC65DE CALL 01AC5630
001B:01AC65E3 MOV EDX,[01AD4060]
001B:01AC65E9 ADD ESP,04
001B:01AC65EC MOV [EDX+0000071C],EBX
001B:01AC65F2 PUSH 09
001B:01AC65F4 PUSH 01AD4F78
001B:01AC65F9 PUSH ESI
001B:01AC65FA CALL 01AD16B0
001B:01AC65FF ADD ESP,0C
001B:01AC6602 TEST EAX,EAX
001B:01AC6604 JNZ 01AC6631

..........................

001B:01AC6DE7 PUSH 09
001B:01AC6DE9 PUSH 01AD4DB8 <-- a point to "regvalida"
001B:01AC6DEE PUSH ESI <-- a point to "regvalida1234567890"
001B:01AC6DEF CALL 01AD16B0 <-- compare string with first 9 chars
001B:01AC6DF4 ADD ESP,0C
001B:01AC6DF7 TEST EAX,EAX
001B:01AC6DF9 JNZ 01AC6E37
001B:01AC6DFB ADD ESI,09 <-- a point to "1234567890" that you enter.
001B:01AC6DFE PUSH ESI
001B:01AC6DFF CALL 01AC9780 <-- generate real unlock code with serial number, and compare with unlock code that you enter
001B:01AC6E04 ADD ESP,04
001B:01AC6E07 TEST EAX,EAX
001B:01AC6E09 JZ 01AC6E21
001B:01AC6E0B PUSH 01AD4DB4
001B:01AC6E10 CALL 01AC1230
001B:01AC6E15 ADD ESP,04
001B:01AC6E18 CALL 01AC1270
001B:01AC6E1D POP EDI
001B:01AC6E1E POP ESI
001B:01AC6E1F POP EBX
001B:01AC6E20 RET

5) Enter CALL(01AC9780)
001B:01AC9780 PUSH ECX
001B:01AC9781 PUSH ESI
001B:01AC9782 MOV ESI,[ESP+0C]
001B:01AC9786 PUSH EDI
001B:01AC9787 XOR EDI,EDI
001B:01AC9789 MOV AL,[ESI]
001B:01AC978B MOV DWORD PTR [ESP+08],00000000
001B:01AC9793 TEST AL,AL
001B:01AC9795 JZ 01AC9821
====== Begin of Convert String of unlock Code To Int ======
001B:01AC979B MOVSX EAX,BYTE PTR [ESI]
001B:01AC979E PUSH EAX
001B:01AC979F CALL 01ACA6C4
001B:01AC97A4 ADD ESP,04
001B:01AC97A7 TEST EAX,EAX
001B:01AC97A9 JZ 01AC97C3
001B:01AC97AB MOV EAX,[ESP+08]
001B:01AC97AF INC EDI
001B:01AC97B0 MOVSX EDX,BYTE PTR [ESI]
001B:01AC97B3 LEA ECX,[EAX*4+EAX]
001B:01AC97B6 CMP EDI,09
001B:01AC97B9 LEA EAX,[ECX*2+EDX-30]
001B:01AC97BD MOV [ESP+08],EAX
001B:01AC97C1 JZ 01AC97D0
001B:01AC97C3 MOV AL,[ESI+01]
001B:01AC97C6 INC ESI
001B:01AC97C7 TEST AL,AL
001B:01AC97C9 JNZ 01AC979B
====== End of Convert String of unlock Code To Int ======
001B:01AC97CB CMP EDI,09
001B:01AC97CE JNZ 01AC9821
001B:01AC97D0 MOV ECX,[ESP+08] <-- Unlock Code That You Enter
001B:01AC97D4 PUSH ECX
001B:01AC97D5 CALL 01AC93D0 <-- Generate Real Unlock Code, and Compare with Unlock Code Taht You Ender.
====== Begin Call 01AC93D0 ======
001B:01AC93D0 MOV EAX,[01CDAFF8] <-- Serial Number
001B:01AC93D5 XOR EDX,EDX
001B:01AC93D7 IMUL EAX,EAX,0004535F SN * 0x4535f
001B:01AC93DD ADD EAX,466F9629 + 0x466F9629
001B:01AC93E2 MOV ECX,3B9ACA00
001B:01AC93E7 DIV ECX % 0x3B9ACA00
001B:01AC93E9 CMP EDX,05F5E100
001B:01AC93EF JAE 01AC93F7 >= 0x05F5E100 then jump
001B:01AC93F1 ADD EDX,05F5E100 Else + 0x05F5E100
001B:01AC93F7 MOV ECX,[ESP+04] <-- Unlock Code That You Enter
001B:01AC93FB XOR EAX,EAX
001B:01AC93FD CMP EDX,ECX <-- EDX = Real Unlock Code
001B:01AC93FF SETZ AL
001B:01AC9402 RET
====== End Call 01AC93D0 ======
001B:01AC97DA ADD ESP,04
001B:01AC97DD TEST EAX,EAX
001B:01AC97DF JZ 01AC9821
001B:01AC97E1 MOV EDX,[ESP+08]
001B:01AC97E5 MOV EAX,[01CDAFFC]
001B:01AC97EA ADD EDX,3DFA81B8
001B:01AC97F0 PUSH 04
001B:01AC97F2 MOV [ESP+0C],EDX
001B:01AC97F6 LEA EDX,[ESP+0C]
001B:01AC97FA PUSH EDX
001B:01AC97FB PUSH 04
001B:01AC97FD PUSH 00
001B:01AC97FF PUSH 01AD562C <-- A Point To "ident"
001B:01AC9804 PUSH EAX
001B:01AC9805 CALL [01AD3010] <-- RegSetValueExA(Store Unlock Code Into Windows Registry)
001B:01AC980B MOV ECX,[01CDAFFC]
001B:01AC9811 PUSH ECX
001B:01AC9812 CALL [01AD300C] <-- RegCloseKey
001B:01AC9818 POP EDI
001B:01AC9819 MOV EAX,00000001
001B:01AC981E POP ESI
001B:01AC981F POP ECX
001B:01AC9820 RET
001B:01AC9821 POP EDI
001B:01AC9822 XOR EAX,EAX
001B:01AC9824 POP ESI
001B:01AC9825 POP ECX
001B:01AC9826 RET


foxmail3.11(build0108)

目标软件: foxmail3.11(build0108)

破解目的: 取消帐户口令保护

使用软件: TRW2000

破解者&资料整理：火翼

过程：

使用TRW2000调用foxmail.exe 任意选一个有密码的帐户双击后弹出密码框任意输入几个字符（别按确定）

按ctrl+N 进入TRW2000界面 bpx hmemcpy 设断点 ctrl+N返回foxmail

按确定被TRW2000截住 输入 bc * 清除断点 pmodule 返回foxmail主程序段

一直按 F10 直到看到

016f:004f809a mov eax,[ebp-0c]

016f:004f809d mov edx,[esi+28]

016f:004f80a0 call 00403e34

016f:004f80a5 jnz 004f80b6

在执行到 call 那句时

d eax 为输入的密码

d edx 为正确密码

可判断出 call一句为判断密码的调用

试着把调用后的 jnz 004f80b6改为

nop nop 结果通过检验

整理:

d 016f:004f80a5

记下75 0f b2 01 8b c6 e8

退出foxmail

使用任意十六进制文件编辑工具打开foxmail.exe

查找 75 0f b2 01 8b c6 e8

改为 90 90 b3 01 8b c6 e8

保存

至此破解完成。


FoxMAIL口令

标 题:再狡猾的狐狸也逃不过猎人的眼睛(手把手教你破FoxMAIL口令) (1千字)
发信人:风飘雪
时 间:2001-2-28 20:41:32
详细信息:
再狡猾的狐狸也逃不过猎人的眼睛(手把手教你破FoxMAIL口令)

版本 Foxmail3.11正式版 Build0108
下载 http://www.esoftware.com.cn/oload.php?url=ftp://ftp.eware.com.cn/pub/network/email/fm311ch0108.exe
引子:办公室新分配来一小妹,漂亮绝顶,凤中极品.从此人迹罕至的办公室车水马龙,人丁兴旺.无不想讨美女一笑,小弟当然也不例外,极力搜索情报.只因此MM用Foxmail收信,且加了
访问口令.经不起所诱,只得拿此优秀国软开刀,多有得罪,小龙哥不要骂我哦!

方法一 推荐使用
启动FOXMAIL,新建一帐户,加访问口令abc369def(够复杂吧,字母数字都有)
点击带有锁标志的此帐户,随便输入12345678,不要点确定
启动trw2000,ctrl-n激活,下万能中断(小小虾,只知道此中断)
bpx hmemcpy
go
点确定,被断
bc *
pmodule
按7下 F12,3下 F10,来到***(其他版本好象也是^_^)

0167:00511A11 8B45F4 MOV EAX,[EBP-0C]
0167:00511A14 8B5628 MOV EDX,[ESI+28]
0167:00511A17 E81824EFFF CALL 00403E34 *****

d eax eax=12345678
d edx edx=abc369def
看看表,两分钟,小龙兄弟真照顾咱初学者.
方法二
删除C:\Program Files\Foxmail\mail\zhangsan(某人)\Account.stg
此法不推荐(原因,自己试试吧:-))

作者 风飘雪
主页 http://duba.126.com
邮件 gd1@yeah.net


HappyIcon 2.53

标 题:HappyIcon注册机TC源码 (1千字)
发信人:风飘雪[CCG]
时 间:2001-4-8 7:46:37
详细信息:
HappyIcon注册机TC源码

最新版本V2.53,可将图形或相片转为Icon文件
http://happyicon.free.fr/happyicone.zip

#include <stdio.h>
int main(void)
{
const long a=0x13579ace;
int counter=0,i=0,j=0,k=0;
unsigned long zcm=0;
unsigned long b=0;
unsigned long c=0xffffffff;
unsigned char yourname[30];
unsigned char firstname[30];
unsigned char name0[10]={'H','a','p','p','y','I','c','o','n','\0'};
unsigned char name[64];
clrscr();
printf("HappyIcon----keygen by guodong\n");
printf("http://duba.126.com\n");
printf("***************************\n");
printf("please enter your name:");
gets(yourname);
printf("please enter your first name:");
gets(firstname);
for(i=0;firstname[i]!='\0';++i)
name[i]=firstname[i];
for(j=0;name0[j]!='\0';++j)
name[j+i]=name0[j];
for(k=0;yourname[k]!='\0';++k)
name[k+j+i]=yourname[k];
name[i+j+k]='\0';
for(counter=0;counter<=strlen(name)-1;counter++)
{
b=name[counter]^c;
c=b^a;
}
zcm=c^0x2468bdf0;
printf("your register number is: %lu\n",zcm);
printf("bye");
return(0);
}


Irfan View 32 v3.0

标 题:egis的irfanview注册器源码,很早以前就有了。 (7千字)
发信人:1212
时 间:2001-2-3 15:25:57
详细信息:
; #########################################################################
;
; Irfan View 32 v3.0 Keymaker
; Coded by Egis/CORE.
;
; Only for educational purpose. I don't want to see anyone release a
; new keymaker for Irfan View future versions based on this source.
;
; Compiler: MASM v6.13
;
; #########################################################################

.386
.model flat, stdcall
option casemap : none

; #########################################################################

include d:\masm32\include\windows.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib

; #########################################################################

IDD_REGDIALOG equ 101
IDC_GETBUTTON equ 1000
IDC_NAMEEDIT equ 1002
IDC_CODEEDIT equ 1003

;=============
; Local macros
;=============

szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM

;=================
; Local prototypes
;=================
RegWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
GetRegNum PROTO :DWORD

; It is hard to declare wsprintf in WINDOWS.INC
; for it demands variable parameters
EXTRN wsprintfA: PROC

;=================
; Local prototypes
;=================

.data

DlgName db "REGDLG",0
szFormat db "%lu", 0
hInstance dd 0
szName db 40 dup (0)
szReg db 20 dup (0)

; #########################################################################

.code

start:

invoke GetModuleHandle, NULL
mov hInstance, eax

; Call the dialog box stored in resource file
invoke DialogBoxParam, hInstance, ADDR DlgName, 0, ADDR RegWndProc, 0
invoke ExitProcess, eax

; #########################################################################

RegWndProc proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD
LOCAL hWnd

.if uMsg == WM_SHOWWINDOW
invoke GetDlgItem, hWin, IDC_NAMEEDIT
invoke SetFocus, eax
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWin, 0
.elseif uMsg == WM_COMMAND
jmp WMCOMMAND
.endif
jmp return

WMCOMMAND:
mov eax, wParam
cmp ax, IDC_GETBUTTON
jnz return
invoke GetRegNum, hWin
mov eax,1
ret
return:
mov eax,0
ret
RegWndProc endp

; #########################################################################

GetRegNum proc hDlg: DWORD

pusha

invoke GetDlgItemTextA, hDlg, IDC_NAMEEDIT, ADDR szName, 40

lea esi, szName
cmp byte ptr [esi], 0
jnz @1

szText szErrName, "Invalid registration name.", 0
szText szErr, "Error", 0
invoke MessageBoxA, 0, ADDR szErrName, ADDR szErr, MB_OK

@1:
xor eax, eax
xor ecx, ecx
@2:
lodsb
test al, al
jz @3
add ecx, eax
jmp @2
@3:
mov ebx, 260
sub ebx, ecx
cmp ebx, 7fffffffh
jb @4
neg ebx
@4:
add ebx, 332
imul ebx, 472

; Cannot use INVOKE macro here :(
push ebx
push offset szFormat
push offset szReg
call wsprintfA
; And you must reset stack pointer yourself
add esp, 4*3

cmp ebx, 1000000
jge @5

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov cl, byte ptr [4+szReg]
mov al, byte ptr [5+szReg]
mov dl, byte ptr [3+szReg]
mov 6+szReg, cl
mov cl,byte ptr [1+szReg]
mov 8+szReg, al
mov al,byte ptr [2+szReg]
mov 2+szReg, cl
mov cl,byte ptr [8+szReg]
mov 3+szReg, al
mov 5+szReg, dl
mov dl,byte ptr [4+szReg]
lea eax, [ecx+ecx*4]
and edx, 0ffh
shl eax, 3
sub eax, ecx
mov ecx, edx
shl ecx, 5
sub ecx, edx
lea edx, [ecx+ecx*2]
sub eax, edx
cdq
mov ecx, eax
xor ecx, edx
sub ecx, edx
lea eax, [ecx+ecx*4]
shl eax, 3
sub eax, ecx
mov ecx, 9
cdq
idiv ecx
mov al, byte ptr [3+szReg]
and eax, 0ffh
add edx, 30h
mov szReg+7, dl
lea edx, [eax+eax*2]
shl edx, 4
sub edx, eax
mov al, byte ptr [5+szReg]
and eax, 0ffh
lea ecx, [eax+eax*8]
lea eax, [eax+ecx*4]
lea eax, [edx+eax*2]
cdq
xor eax, edx
sub eax, edx
lea ecx, [eax+eax*8]
lea eax, [eax+ecx*4]
mov ecx, 9
shl eax, 1
cdq
idiv ecx
mov cl, byte ptr [szReg]
and ecx, 0ffh
lea eax, [ecx+ecx*2]
lea eax, [eax+eax*8]
shl eax, 1
sub eax, ecx
add edx, 30h
mov szReg+4, dl
mov dl, byte ptr [1+szReg]
and edx, 0ffh
mov ecx, edx
shl ecx, 3
sub ecx, edx
lea edx, [ecx+ecx*4]
sub eax, edx
cdq
mov ecx, eax
xor ecx, edx
sub ecx, edx
lea eax, [ecx+ecx*2]
lea eax, [eax+eax*8]
shl eax, 1
sub eax, ecx
cdq
mov ecx, 9
idiv ecx
add dl,30h
mov szReg+1, dl
mov szReg+9, 0
jmp @print

@5:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov al, byte ptr [5+szReg]
mov dl, byte ptr [6+szReg]
mov cl, byte ptr [4+szReg]
mov szReg+6, al
mov al, byte ptr [1+szReg]
mov szReg+8, dl
mov dl, byte ptr [2+szReg]
mov szReg+5, cl
mov cl, byte ptr [6+szReg]
mov szReg+2, al
mov al, byte ptr [8+szReg]
mov szReg+3, dl
mov edx, ecx
lea eax, [eax+eax*8]
shl edx, 6
shl eax, 2
sub edx, ecx
mov ecx, 9
sub eax, edx
cdq
xor eax, edx
sub eax, edx
lea eax, [eax+eax*8]
shl eax, 2
cdq
idiv ecx
mov al, byte ptr [3+szReg]
and eax, 0ffh
add edx, 30h
mov szReg+7,dl
lea edx, [eax+eax*4]
shl edx, 3
sub edx, eax
mov al, byte ptr [4+szReg]
and eax, 0ffh
add eax, 20h
mov ecx, eax
shl ecx, 3
sub ecx, eax
lea eax, [eax+ecx*4]
lea eax, [eax+eax*2]
lea eax, [eax+edx*2]
cdq
xor eax, edx
sub eax, edx
mov ecx, eax
shl ecx, 3
sub ecx, eax
lea eax, [eax+ecx*4]
mov ecx, 9
lea eax, [eax+eax*2]
cdq
idiv ecx
mov al, byte ptr [szReg]
and eax, 0ffh
add dl, 30h
mov szReg+4, dl
mov edx, eax
shl edx, 3
sub edx, eax
lea eax, [eax+edx*4]
mov dl, byte ptr [1+szReg]
and edx, 0ffh
mov ecx, edx
shl ecx, 4
add ecx, edx
shl eax, 1
lea ecx, [ecx+ecx*4]
sub eax, ecx
cdq
xor eax, edx
sub eax, edx
mov edx, eax
shl edx, 3
sub edx, eax
lea eax, [eax+edx*4]
shl eax, 1
cdq
mov ecx, 9
idiv ecx
add dl, 30h
mov szReg+1, dl
mov szReg+9, 0

@print:
invoke SetDlgItemTextA, hDlg, IDC_CODEEDIT, ADDR szReg

popa

ret

GetRegNum endp

; #########################################################################

end start

; #########################################################################

标 题:赶紧学习一下~~~顺便贴上我的~~~~~呵呵~~~~~~ (1千字)
发信人:真·伪装者
时 间:2001-2-3 15:31:14
详细信息:

 #include "stdio.h"
main()
{
char string[81];
long i,a=0,b=0,d=0;
unsigned c;
printf("This keygen is maked by Pretender\nPlease input your name
    ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
a+=c;
a=(a-260+332)*472;
printf("Your name is  ");
puts(string);
if(a<1000000)
{for(b=0;b<6;b++)
{string[b]=a%10;a=a/10;}
printf("%d",string[5]);
b=string[5]+48;
a=2809*b;
b=string[4]+48;
d=1855*b;
a=a-d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[4]);
printf("%d",string[3]);
b=string[3]+48;
a=3478*b;
b=string[2]+48;
d=5476*b;
a=a+d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[2]);
printf("%d",string[1]);
b=string[1]+48;
a=3627*b;
b=string[0]+48;
d=1521*b;
a=a-d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[0]);}
else
{for(b=0;b<7;b++)
{string[b]=a%10;a=a/10;}
printf("%d",string[6]);
b=string[6]+48;
a=3364*b;
b=string[5]+48;
d=4930*b;
a=a-d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[5]);
printf("%d",string[4]);
b=string[2]+48+50;
a=7569*b;
b=string[4]+48;
d=6786*b;
a=a+d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[2]);
printf("%d",string[1]);
b=string[1]+48;
a=2268*b;
b=string[0]+48;
d=1296*b;
a=a-d;
if(a<0) a=-a;
a=a%9;
printf("%ld",a);
printf("%d",string[0]);};
}

标 题:好！ (4千字)
发信人:真·伪装者
时 间:2001-2-3 15:34:21
详细信息:

这段是程序本身的计算注册码过程
什么时候我要是也能编这样的注册机就好了~~~~~
cmp ebx, 1000000
jge @5
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov cl, byte ptr [4+szReg]
mov al, byte ptr [5+szReg]
mov dl, byte ptr [3+szReg]
mov 6+szReg, cl
mov cl,byte ptr [1+szReg]
mov 8+szReg, al
mov al,byte ptr [2+szReg]
mov 2+szReg, cl
mov cl,byte ptr [8+szReg]
mov 3+szReg, al
mov 5+szReg, dl
mov dl,byte ptr [4+szReg]
lea eax, [ecx+ecx*4]
and edx, 0ffh
shl eax, 3
sub eax, ecx
mov ecx, edx
shl ecx, 5
sub ecx, edx
lea edx, [ecx+ecx*2]
sub eax, edx
cdq
mov ecx, eax
xor ecx, edx
sub ecx, edx
lea eax, [ecx+ecx*4]
shl eax, 3
sub eax, ecx
mov ecx, 9
cdq
idiv ecx
mov al, byte ptr [3+szReg]
and eax, 0ffh
add edx, 30h
mov szReg+7, dl
lea edx, [eax+eax*2]
shl edx, 4
sub edx, eax
mov al, byte ptr [5+szReg]
and eax, 0ffh
lea ecx, [eax+eax*8]
lea eax, [eax+ecx*4]
lea eax, [edx+eax*2]
cdq
xor eax, edx
sub eax, edx
lea ecx, [eax+eax*8]
lea eax, [eax+ecx*4]
mov ecx, 9
shl eax, 1
cdq
idiv ecx
mov cl, byte ptr [szReg]
and ecx, 0ffh
lea eax, [ecx+ecx*2]
lea eax, [eax+eax*8]
shl eax, 1
sub eax, ecx
add edx, 30h
mov szReg+4, dl
mov dl, byte ptr [1+szReg]
and edx, 0ffh
mov ecx, edx
shl ecx, 3
sub ecx, edx
lea edx, [ecx+ecx*4]
sub eax, edx
cdq
mov ecx, eax
xor ecx, edx
sub ecx, edx
lea eax, [ecx+ecx*2]
lea eax, [eax+eax*8]
shl eax, 1
sub eax, ecx
cdq
mov ecx, 9
idiv ecx
add dl,30h
mov szReg+1, dl
mov szReg+9, 0
jmp @print

@5:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov al, byte ptr [5+szReg]
mov dl, byte ptr [6+szReg]
mov cl, byte ptr [4+szReg]
mov szReg+6, al
mov al, byte ptr [1+szReg]
mov szReg+8, dl
mov dl, byte ptr [2+szReg]
mov szReg+5, cl
mov cl, byte ptr [6+szReg]
mov szReg+2, al
mov al, byte ptr [8+szReg]
mov szReg+3, dl
mov edx, ecx
lea eax, [eax+eax*8]
shl edx, 6
shl eax, 2
sub edx, ecx
mov ecx, 9
sub eax, edx
cdq
xor eax, edx
sub eax, edx
lea eax, [eax+eax*8]
shl eax, 2
cdq
idiv ecx
mov al, byte ptr [3+szReg]
and eax, 0ffh
add edx, 30h
mov szReg+7,dl
lea edx, [eax+eax*4]
shl edx, 3
sub edx, eax
mov al, byte ptr [4+szReg]
and eax, 0ffh
add eax, 20h
mov ecx, eax
shl ecx, 3
sub ecx, eax
lea eax, [eax+ecx*4]
lea eax, [eax+eax*2]
lea eax, [eax+edx*2]
cdq
xor eax, edx
sub eax, edx
mov ecx, eax
shl ecx, 3
sub ecx, eax
lea eax, [eax+ecx*4]
mov ecx, 9
lea eax, [eax+eax*2]
cdq
idiv ecx
mov al, byte ptr [szReg]
and eax, 0ffh
add dl, 30h
mov szReg+4, dl
mov edx, eax
shl edx, 3
sub edx, eax
lea eax, [eax+edx*4]
mov dl, byte ptr [1+szReg]
and edx, 0ffh
mov ecx, edx
shl ecx, 4
add ecx, edx
shl eax, 1
lea ecx, [ecx+ecx*4]
sub eax, ecx
cdq
xor eax, edx
sub eax, edx
mov edx, eax
shl edx, 3
sub edx, eax
lea eax, [eax+edx*4]
shl eax, 1
cdq
mov ecx, 9
idiv ecx
add dl, 30h
mov szReg+1, dl
mov szReg+9, 0


MagicWin 98 1.30f

 标 题:先将MagicWin 98 1.30f的注册机贴上来。。等我解决了前面那个问题，再贴跟踪过程部分。
发信人:chn-boy
时 间:2000-11-13 17:45:38
详细信息:

 MagicWin 98 1.30f 注册机：

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define BUF_LEN 30
#define HEAD_SIZE 3
/* 前三个字符不作处理，Serial Number的长度要大于这个值 */
#define MOV_SIZE 4
/* 对Serial Number处理时，间隔4个字节相互替换 */
void int2str(int n, char *pt);
/* 好久没用TC20了，所以不知道怎么将Int型的值转换成字符串 */

main () {
char S_N[BUF_LEN];      /* Serial Number 存放的数组 */
char User_Name[BUF_LEN]; /* 用户名存放的数组 */
char *pstr, ch;
unsigned int sum = 0;

pstr = S_N;

printf("Please Enter your Serials Number: ");
scanf("%s",S_N);

if (strlen(S_N) > HEAD_SIZE) {
printf("\nPlease Enter your Name: ");
scanf("%s",User_Name);
if ((sum = strlen(User_Name)) > 0) {
pstr = User_Name;      /* 将用户名字符的ASCII */
sum += pstr;          /* 值累加，并加上用户名
  */
while (*pstr++ != '\0') /* 长度。
      */
sum += *pstr;

int2str(sum, User_Name); /* 求出这个Int对应的字符串 */

pstr = S_N + HEAD_SIZE;
while (strlen(pstr) > MOV_SIZE) { /* 每隔4个字符xchg */
ch = *pstr;
*pstr = *(pstr + MOV_SIZE);
*(pstr + MOV_SIZE) = ch;
pstr++;
}
while (*pstr != '\0' && *(pstr + 1) != '\0') {
ch = *pstr;
*pstr = *(pstr+1);
/* 将最后不大于4长度的字符循环左移一位
  */

*(pstr+1) = ch;
pstr++;
}
pstr = S_N + HEAD_SIZE;
sum = HEAD_SIZE;
while (*pstr != '\0') {/* 从第四个字符起将转换了得  */
*pstr += sum;  /* 字符串依次加上0x10 + 在
  */
*pstr += 0x10;  /* 字符串中该字符的位置。注：*/
pstr++;        /* 第一个字符的位置为0，以此
  */
sum++;          /*
  类推                    */
}

strcat(S_N, User_Name); /* 将User_Name字符串（转变后的） */
/* 接到S_N字符串的后面，此时的  */
/* S_N字符串就是正确的Code了    */
printf ("\nThe MagicWin 98 1.30f software Code is: %s \n",S_N);
}
else {
printf ("Name can't be NULL.");
}
}
else {
printf ("Serials Number Must be %d char or more.\n",HEAD_SIZE+1);
}
}

void int2str(int n, char *pt) {
int k = 0;
ldiv_t lx;
lx.quot = n;
while (lx.quot != 0) {
lx = ldiv(lx.quot, 10L);
*(pt+k) = lx.rem + 0x30;
k++;
}
*(pt+k) = '\0';
strrev(pt);
}


OICQ图形留言系统

标 题::OICQ图形留言系统 OICQ PIC 3.20(430字)
发信人:伪装者[CCG]
时 间:2001-2-23 22:59:55
详细信息:

提示：下BPX REGQUERYVALUEEXA 可找到注册码

 #include "stdio.h"
main()
{
char string[81];
unsigned long i,a=0,b=0;
unsigned c;
printf("******OICQ PIC 3.20********\nThis keygen is maked by Pretender\nPlease
    input your name\n");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{a=(24+i)*a;
if(c>127) c=256+c;
b=c*c;
a=a+b;
}
printf("Your name is ");
puts(string);
printf("Your Register code is %ld\n",a+0x54d);
printf("Welcome to WWW.CRACKNOW.COM\n");}


PBackhomev 1.02

 标 题:回家（PBackhome)v 1.02版注册机 (1千字)
发信人:小楼
时 间:2001-6-3 14:44:46
详细信息:
 //回家（PBackhome)v 1.02版注册机
//delphi5.0编译
//注册码计算：
//取计算机用户名（转为大写字母）作为机器码，机器码字符长度不足15位,
//则在机器码后依次加上PolarBearSoftware，凑足15位字符
//分别取每个字符的ASCII码，转为10进制数值，加1，累积求和sum1
//若机器码字符长度<15位，sum1*64*机器码字符长度＝注册码
//否则sum1*64*15=注册码

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a,b,d,e,h,i,len1,len2:longint;
c:String;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
len1 := length(edit1.text);    //len=机器码长度
name := edit1.text;          //name=机器码
b := 0;
e := 0;
for i := 1 to len1 do
begin
a := ord(name[i])  + 1; //取机器码每个字符ascii码，转为10进制数
b := a + b;
  //累计求和
end;

len2 := 15 - len1;
if len2 <= 0 then edit2.text := inttostr(b*64*15);
if len2 > 0 then
begin
c := 'PolarBearSoftware';
for h := 1 to len2 do
begin
d := ord(c[h]) + 1;
e := d + e;
end;
edit2.text := inttostr((b+e)*64*len1);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.


pcGhost4.0

标 题:电脑幽灵pcGhost4.0注册机(TC编译通过) (742字)
发信人:8989
时 间:2001-4-24 16:41:21
详细信息:
电脑幽灵pcGhost4.0注册机(TC编译通过)
下载 华军,海阔天空
根据以前版本作的,新版应该能用
电脑幽灵pcGhost4.0 注册码 gdong-4953667
破解看以前的帖子
电脑幽灵pcGhost4.0注册机(TC编译通过)
#include <stdio.h>

int main(void)
{
const long a=0xf1da4;
int counter=0;
unsigned long b=0;
unsigned char yourname[63];
clrscr();
printf("pcGhost 4.0\n");
printf("==================\n");
printf("Made by fpx[CCG]-2001\n");
printf("China Cracking Group\n");
printf("please enter your name:");
gets(yourname);
printf("Your register number is :");
for(counter=0;counter<strlen(yourname);counter++)
{
b+=yourname[counter]+a;
putch(yourname[counter]);
}
printf("-%ld\n",b);
printf("bye");
return(0);
}


Screen logger manager v1.

 标 题:继续破解Screen logger manager v1.01,注册机如下: (11千字)
发信人:冷雨飘心[BCG]
时 间:2001-7-14 20:12:59
详细信息:
Screen logger manager v1.01和Fileprot基本一样,不过没有在vxd中的校验部分,注册机算法部分没有按照他的计算过程重写,二十在fileprot的基础上少加改动,可能存在不"兼容",不过我试了几个,还好用,不知有没有不能用的,不过我觉得因该都能用的,作者主页上http://www.mikkotech.com/共有三个作品,除了被破掉的fileprot和Screen logger manager, 还有一个keykey2000,也差不多,做人不能太绝!所以就不破他了,不过初学者可以用来练习写注册机...

编译好的注册机下载:
http://ia2k.myetang.com/hack/crkslm.exe

源码:
;********************hd.h
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\comctl32.inc
include c:\masm32\include\comdlg32.inc
include c:\masm32\include\shell32.inc

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
includelib c:\masm32\lib\comctl32.lib
includelib c:\masm32\lib\comdlg32.lib
includelib c:\masm32\lib\shell32.lib

;****************crkslm.rc
#include <c:\masm32\include\resource.h>
#define ID_GEN 1003
#define ID_EXIT 1002
#define IDC_OUT 1001
#define DLG_MAIN 1000
DLG_MAIN DIALOG 37, 61, 282, 59
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Screen Logger Manager V1.01 Keygen(in ASM), By Hume..."
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "Generate", ID_GEN, 209, 14, 50, 14
PUSHBUTTON "Exit", ID_EXIT, 209, 36, 50, 14
LTEXT "NAME:", -1, 15, 8, 36, 8
LTEXT "COMPANY:", -1, 15, 25, 39, 8
LTEXT "PRODUCT ID:", -1, 15, 43, 49, 10
CONTROL "Hume Wen", -1, "EDIT", ES_MULTILINE | WS_BORDER | WS_TABSTOP, 67, 6, 48, 13
CONTROL "BCG", -1, "EDIT", ES_MULTILINE | WS_BORDER | WS_TABSTOP, 67, 23, 71, 13
EDITTEXT IDC_OUT, 67, 42, 130, 12, ES_READONLY | WS_BORDER | WS_TABSTOP
}

;****************crkslm.asm
.386
.model flat,stdcall
option casemap:none
include hd.h
_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
rand proto :DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
esp_10 db 0 ;保存ecx+5
esp_04 db 0 ;保存高4位
esp_08 db 0 ;保存低4位
flg db 0
rand_init db 0
rand_out db 0
Serial db 32 dup(0)

.data?
hInstance HANDLE ?
.const
ID_GEN equ 1003
ID_EXIT equ 1002
IDC_OUT equ 1001
DLG_MAIN equ 1000
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL

_ProcDlg proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==ID_GEN
invoke RtlZeroMemory,addr Serial,32
call Cal
invoke SetDlgItemText,hWnd,IDC_OUT,addr Serial

.elseif ax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif

.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlg ENDP

include cal.asm

end start

;********************cal.asm
Cal proc
PUSHAD

lea ecx, Serial
mov byte ptr [ecx],'S'
mov byte ptr [ecx+1],'L'
mov byte ptr [ecx+2],'1'
mov byte ptr [ecx+3],'0'
mov al, 2Dh
mov byte ptr [ecx+4],al
mov byte ptr [ecx+7],al
mov byte ptr [ecx+0bh],al
mov byte ptr [ecx+0Dh],al
mov byte ptr [ecx+1ch],al

GenerateAgain:
mov al,flg
.if al!=30h
mov al,30h
.else
mov al,31h
.endif
mov flg,al
mov byte ptr [ecx+0ch],al
.if al==0
mov eax,3930h ;ah=0,al=39
.endif
mov eax,4630h
call randomize

invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+0fh],bl

invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+10h],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+11h],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+12h],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+15h],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+16h],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+17h],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+19h],bl

mov eax,3930h
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+5],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+6],bl

mov eax,3930h
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+8],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+9],bl
invoke rand,eax
mov bl,rand_out
mov byte ptr [ecx+0Ah],bl

;*****************The following is the first verifying part:
mov dl, byte ptr [ecx+05] ;dl<-ecx+5
mov bl, byte ptr [ecx+08] ;bl<-ecx+8
mov byte ptr esp_10, dl ;save to esp_10
mov al, byte ptr [ecx+19h] ;//add the instruction to complete the following
mov dl, byte ptr [ecx+17h] ;al=ecx+19 add 17,16,15,12,11,10,F
add al, dl
mov dl, byte ptr [ecx+16h]
add al, dl
mov dl, byte ptr [ecx+15h]
add al, dl
mov dl, byte ptr [ecx+12h]
add al, dl
mov dl, byte ptr [ecx+11h]
add al, dl
mov dl, byte ptr [ecx+10h]
add al, dl
mov dl, byte ptr [ecx+0Fh]
add al, dl
mov dl, byte ptr esp_10 ;dl=saved ecx+5 (al xor dl)
xor al, dl
mov dl, byte ptr [ecx+0Ch] ;刚才的运算结果al与5,0C,8,5位依次xor,再与23h xor
xor al, bl ;bl=ecx+8
xor al, dl
xor al, 23h
mov dl, al ;校验结果存为al,dl
shr dl, 4 ;去掉低4位,将其转化为0~F的字符
add dl, 30h
cmp dl, 39h
mov byte ptr esp_04, dl ;存放去掉低4位的高四位结果
jbe RA_0E38C
add dl, 7
mov byte ptr esp_04, dl
RA_0E38C:
and al, 0Fh
add al, 30h
cmp al, 39h
mov byte ptr esp_08, al ;存放低四位转化为0~F字符
jbe RA_0E39E
add al, 7
mov byte ptr esp_08, al

RA_0E39E:
mov byte ptr [ecx+14h],al ;取ecx+13 标志1***********
mov al,esp_04
mov byte ptr [ecx+14],al ;ecx+14 标志2************

;*********************process 1A,1B flag
mov al, byte ptr [ecx+0Ah] ;(ECX+0A) +'F',XOR ECX+9 XOR ECX+14 XOR ECX+13
add al, 46h
xor al, byte ptr [ecx+09]
xor al, dl
mov dl, byte ptr [ecx+13h]
xor al, dl
xor al, bl ;XOR BL=ECX+8 与41h 异或得到结果
xor al, 41h
mov dl, al
shr dl, 4 ;高位转化为0~f字符 ->esp_04
add dl, 30h
cmp dl, 39h
mov byte ptr esp_04, dl
jbe RA_0E3F9
add dl, 7
mov byte ptr esp_04, dl
RA_0E3F9:
and al, 0Fh
add al, 30h
cmp al, 39h
mov byte ptr esp_08, al ;低位化为0~f字符 ->esp_08
jbe RA_0E40B
add al, 7
mov byte ptr esp_08, al
RA_0E40B:
mov byte ptr [ecx+1Bh],al ;ecx+1Bh 标志4*************
mov al, esp_04
mov byte ptr [ecx+1Ah],al ;ecx+1A 标志3******************

;*********************the following are 0E and 18h offset processing

mov al, byte ptr [ecx+6] ;ecx+06 xor ecx+14 xor 13 xor ecx+5
;与ABh数字异或得到结果
mov dl, byte ptr [ecx+14h]
xor al, dl
mov dl, byte ptr [ecx+13h]
xor al, dl
mov dl, byte ptr esp_10 ;esp_10=ecx+5
xor al, dl
xor al, 0ABh
mov dl, al
shr dl, 4
add dl, 30h
cmp dl, 39h
mov byte ptr esp_04, dl ;高4位
jbe RA_0E464
add dl, 7
mov byte ptr esp_04, dl
RA_0E464:
and al, 0Fh
add al, 30h
cmp al, 39h
mov byte ptr esp_08, al ;低4位
jbe RA_0E476
add al, 7
mov byte ptr esp_08, al
RA_0E476:
mov byte ptr [ecx+18h],al ;ecx+18 标志5******************
mov al, esp_04
mov byte ptr [ecx+0Eh],al ;ecx+0E 标志6********************

;*************************************************1D,1E flag
mov al, byte ptr [ecx+1Ah] ;1A,0c
mov dl, byte ptr [ecx+0Ch]
mov bl, byte ptr [ecx+8]
xor bl, al ;ecx+8 xor 1A xor 0C xor 数字63h最后结果
xor bl, dl
xor bl, 63h
mov dl, bl
mov al, dl
shr al, 4 ;高四位
add al, 30h
cmp al, 39h
mov byte ptr esp_04, al
jbe RA_0E4BC
add al, 7
mov byte ptr esp_04, al
RA_0E4BC:
and dl, 0Fh ;低四位
add dl, 30h
cmp dl, 39h
mov byte ptr esp_08, dl
jbe RA_0E4D2
add dl, 7
mov byte ptr esp_08, dl
RA_0E4D2:
mov byte ptr [ecx+1Eh],dl ;ecx+1D 标志7*************
mov al,esp_04
mov byte ptr [ecx+1Dh],al ;ecx+1E 标志8************

;**************************************************************
;****************************************************************partII,修正
lea ebx,Serial ;//add the interface
mov al, byte ptr [ebx+0Fh]
add al, byte ptr [ebx+10h]
add al, byte ptr [ebx+11h]
add al, byte ptr [ebx+12h]
add al, byte ptr [ebx+15h]
add al, byte ptr [ebx+16h]
add al, byte ptr [ebx+17h]
add al, byte ptr [ebx+19h]
xor al, byte ptr [ebx]
;add them ->al与0x46,ebx+5,0C,8,5位依次xor,再与0x58,0x3D xor
xor al, byte ptr [ebx+5]
xor al, byte ptr [ebx+8]
xor al, byte ptr [ebx+0Ch]
xor al, 58h
xor al, 3Dh
mov ah, al
shr al, 4
add al, 30h
cmp al, 39h
jbe RA_01BF2 ;convert high and low part to ascII
add al, 7
RA_01BF2:
and ah, 0Fh
add ah, 30h
cmp ah, 39h
jbe RA_01C00
add ah, 7
RA_01C00:
mov byte ptr [ebx+13h], al ;ebx+13==high
mov byte ptr [ebx+14h], ah ;ebx+14==low

;+++++++++++++++++++++++++++++++++++++++++++++++++++++
mov al, byte ptr [ebx]
add al, byte ptr [ebx+0Ah] ;'F' xor ebx+01,2,3,8,9,13,14 xor 0x18->al
xor al, byte ptr [ebx+01h]
xor al, byte ptr [ebx+02h]
xor al, byte ptr [ebx+03h]
xor al, byte ptr [ebx+08h]
xor al, byte ptr [ebx+09h]
xor al, byte ptr [ebx+13h]
xor al, byte ptr [ebx+14h]
xor al, 18h
mov ah, al
shr al, 04h
add al, 30h
cmp al, 39h
jbe RA_01C2F
add al, 07h
RA_01C2F:
and ah, 0Fh
add ah, 30h
cmp ah, 39h
jbe RA_01C3D
add ah, 07h
RA_01C3D:
mov byte ptr [ebx+1Ah], al ;ebx+1A==high
mov byte ptr [ebx+1Bh], ah ;ebx+1B==low part
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mov al, byte ptr [ebx+13h]
xor al, byte ptr [ebx+14h]
xor al, byte ptr [ebx+05h]
xor al, byte ptr [ebx+06h] ;ebx+13,14,5,6 xor 0xAB->al
xor al, 0ABh
mov ah, al
shr al, 04h
add al, 30h
cmp al, 39h
jbe RA_01C5E
add al, 07h
RA_01C5E:
and ah, 0Fh
add ah, 30h
cmp ah, 39h
jbe RA_01C6C
add ah, 07h
RA_01C6C:
mov byte ptr [ebx+0Eh], al ;ebx+0E==high
mov byte ptr [ebx+18h], ah ;ebx+18==Low
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mov al, byte ptr [ebx+1Ah] ;ebx+1A,1B,0C xor 0x 63
xor al, byte ptr [ebx+1Bh]
xor al, byte ptr [ebx+0Ch]
xor al, 63h
mov ah, al
shr al, 04h
add al, 30h
cmp al, 39h
jbe RA_01C8A
add al,7
RA_01C8A:
and ah, 0Fh
add ah, 30h
cmp ah, 39h
jbe RA_01C98
add ah,7
RA_01C98:
mov byte ptr [ebx+1Dh], al ;ebx+1D==high
mov byte ptr [ebx+1Eh], ah ;ebx+1E==Low
;+++++++++++++++++++++++++++++++++++++++++++++++++++ over!!!!!!!!!!!!!!
POPAD
Cal endp

randomize proc
pushad
mov ebx,[esp+10h]
mov rand_init,bl
popad
ret
randomize endp

rand proc range
LOCAL @stime:SYSTEMTIME
pushad
invoke GetSystemTime,addr @stime
mov eax,range
.if ah==al
mov bl,al
jmp rand_exit
.endif
mov bx,@stime.wMilliseconds
mov ecx,1000
randlop:dec ecx
jnz next
mov bl,38h
jmp rand_exit
next:
add bh,bl
add bl,rand_init
add bl,2
cmp bl,al
jb randlop
cmp bl,ah
ja randlop

rand_exit:
add rand_init,3
mov rand_out,bl
popad
ret
rand endp


Teleport Pro 1.29.1590

 标 题:贴Teleport Pro 1.29.1590的注册机 (720字)
发信人:伪装者[CCG]
时 间:2001-7-1 23:19:15
详细信息:
 #include "stdio.h"
main()
{
unsigned char string[81];
int d,i;
unsigned long c,e=0x5dfee4a4;
start:printf("*********Teleport Pro 1.29.1590*********\nThis keygen is maked
  by Pretender\nPlease input your name : ");
gets(string);
d=strlen(string)-4;
if(d<2) {printf("Your username must be at least six lettres long!!!\n");goto
  start;}
for(i=0;i<d;i++)
{
c=string[i+3];
c<<=8;
c+=string[i+2];
c<<=8;
c+=string[i+1];
c<<=8;
c+=string[i];
e^=c;
}
printf("Your Register code is  : ");
printf("%ld",e);
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}


UNFOXALL 2.1注册机

 标 题:UNFOXALL 2.1的注册机~~~呵呵~~ (2千字)
发信人:伪装者[BCG]
时 间:2001-5-31 18:54:39
详细信息:
 #include "stdio.h"
#include "process.h"
#define ROTATE(a,n)  (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
main()
{unsigned tab[18]={0xd4,0xa5,0xc4,0xdc,0xd0,0xc5,0xcf,0xa2,0xc4,0xc2,0xc5,0xf4,0xd2,0xe5,0xd6,0xdc,0xbb,0xd4};
    /*"豫能信息穆鹏义周辉";*/
static unsigned char string[110],al,bl,company[30],email[25],nu[8];
char ren[]="copy unfoxall.in1 unfoxall.ini/y";
char ren1[]="del unfoxall.in1";
int i,c,h;
long d,eax,edi,ebx,t;
char s[81];
FILE *fp=fopen("unfoxall.ini","r+t");
FILE *fo=fopen("unfoxall.in1","w");
if(fp==0) {printf("YOU MUST USE THIS KEYGEN WITH YOUR 'unfoxall.ini'!!!\n");fclose(fp);fclose(fo);
  goto end;}
fgets(s,80,fp);fputs(s,fo);
fgets(s,80,fp);fputs(s,fo);
if(s[4]!='N')
{fgets(s,80,fp);fputs(s,fo);}
d=strlen(s);
for(i=9;i<d-1;i++)
string[i-9]=s[i];
/*puts(string);h=strlen(string);
printf("\n%d,,,,\n",h);*/
fgets(s,80,fp);fputs(s,fo);
d=strlen(s);
for(i=12;i<d-1;i++)
company[i-12]=s[i];
/*puts(company);*/
fgets(s,80,fp);fputs(s,fo);
d=strlen(s);
for(i=10;i<d-1;i++)
email[i-10]=s[i];
fgets(s,80,fp);fputs(s,fo);
d=strlen(s);
for(i=8;i<d-1;i++)
nu[i-8]=s[i];
fclose(fp);printf("******UNFOXALL 2.1********\nThis keygen is made by
  Pretender\nFINDING....\nYour User Name is      :  ");
puts(string);
printf("Your Company name is  :  ");
puts(company);
strcat(string,company);/*h=strlen(string);
printf("\n%d\n",h);*/
printf("Your E-MAIL address is :  ");
puts(email);
strcat(string,email);/*h=strlen(string);
printf("\n%d\n",h);*/
printf("Your User Key is      :  ");
puts(nu);
strcat(string,nu);
h=strlen(string);
/*printf("\n%d\n",h);
puts(string);*/
for(i=0;i<18;i++)
string[h+i]=tab[i];
al=bl=eax=edi=ebx=t=0;
for(i=0;i<h+18;i++)
{c=string[i];
if(i<4) eax*=128;
eax*=2;
edi=edi^eax;
al=c;
eax=eax^al;
t=ebx;ebx=edi;edi=t;
bl=ebx&0xff;
bl=bl^al;
/*printf("%x\n",bl);*/
ebx=ebx&0xffffff00;
ebx+=bl;
t=ebx;ebx=edi;edi=t;
eax=edi;
}
/*printf("%d",i);*/
/*puts(string);*/
edi=edi^0xc5f4d2e5;
/*printf("%lx\n",edi);*/
edi=ROTATE(edi,3);
/*printf("%lx\n",edi);*/
edi=~edi;
printf("Your Register code is  :  %lX\n",edi);
sprintf(s,"SerialNumber=%lX",edi);
fputs(s,fo);
fclose(fo);
system(ren);system(ren1);
end:printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


UNFOXALL2.0注册机

 标 题:UNFOXALL2。0曾强版注册机 (2千字)
发信人:伪装者[BCG]
时 间:2001-5-31 18:54:08
详细信息:
 #include "stdio.h"
#include "process.h"
#define ROTATE(a,n)  (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
main()
{unsigned tab[18]={0xd4,0xa5,0xc4,0xdc,0xd0,0xc5,0xcf,0xa2,0xc4,0xc2,0xc5,0xf4,0xd2,0xe5,0xd6,0xdc,0xbb,0xd4};
    /*"豫能信息穆鹏义周辉";*/
static unsigned char string[110],al,bl,company[30],email[25],nu[8];
char ren[]="copy unfoxall.in1 unfoxall.ini/y";
char ren1[]="del unfoxall.in1";
int i,c,h;
long d,eax,edi,ebx,t;
char s[81];
FILE *fp=fopen("unfoxall.ini","r+t");
FILE *fo=fopen("unfoxall.in1","w");
if(fp==0) {printf("YOU MUST USE THIS KEYGEN WITH YOUR 'unfoxall.ini'!!!\n");fclose(fp);fclose(fo);
  goto end;}
fgets(s,80,fp);fputs(s,fo);
fgets(s,80,fp);fputs(s,fo);
if(s[4]!='N')
{fgets(s,80,fp);fputs(s,fo);}
d=strlen(s);
for(i=9;i<d-1;i++)
string[i-9]=s[i];
strcat(string," ");
/*puts(string);h=strlen(string);
printf("\n%d,,,,\n",h);*/
fgets(s,80,fp);fputs(s,fo);
d=strlen(s);
for(i=12;i<d-1;i++)
company[i-12]=s[i];
/*puts(company);*/
/* fgets(s,80,fp);fputs(s,fo);
d=strlen(s);
for(i=10;i<d-1;i++)
email[i-10]=s[i];*/
fgets(s,80,fp);fputs(s,fo);
d=strlen(s);
for(i=8;i<d-1;i++)
nu[i-8]=s[i];
fclose(fp);printf("******UNFOXALL 2.1********\nThis keygen is made by
  Pretender\nFINDING....\nYour User Name is      :  ");
puts(string);
printf("Your Company name is  :  ");
puts(company);
strcat(string,company);/*h=strlen(string);
printf("\n%d\n",h);*/
/*printf("Your E-MAIL address is :  ");
puts(email);
strcat(string,email);h=strlen(string);
printf("\n%d\n",h);*/
printf("Your User Key is      :  ");
puts(nu);
strcat(string,nu);
h=strlen(string);
/*printf("\n%d\n",h);
puts(string);*/
/*for(i=0;i<18;i++)
string[h+i]=tab[i];*/
al=bl=eax=edi=ebx=t=0;
for(i=0;i<h;i++)
{c=string[i];
if(i<4) eax*=128;
eax*=2;
edi=edi^eax;
al=c;
eax=eax^al;
t=ebx;ebx=edi;edi=t;
bl=ebx&0xff;
bl=bl^al;
/*printf("%x\n",bl);*/
ebx=ebx&0xffffff00;
ebx+=bl;
t=ebx;ebx=edi;edi=t;
eax=edi;
}
/*printf("%d",i);*/
/*puts(string);*/
/*printf("%lx\n",edi);*/
edi=edi^0x43218765;
/*printf("%lx\n",edi);*/
/*edi=ROTATE(edi,3);*/
/*printf("%lx\n",edi);*/
/*edi=~edi;*/
printf("Your Register code is  :  %lX\n",edi);
/*puts(string);*/
sprintf(s,"SerialNumber=%lX",edi);
fputs(s,fo);
fclose(fo);
system(ren);system(ren1);
end:printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


WingGroov0.9E_E

标 题:谁能破解WingGroov0.9E_E(一个优秀的软波表）下载地址： (41字)
发信人:1212
详细信息:
http://www.cc.rim.or.jp/~hiroki/english

标 题:注册 (2千字)
发信人:blowfish
时 间:2001-1-27 0:55:11
详细信息:

注册机为（与用户名无关）：

#include <stdio.h>
#include <string.h>

char UserID[16];
char Password[16];
int k;
char sum;
unsigned long ID;

void main(void)
{
//以下未检查输入是否合法
printf("Enter your user ID(3个字母后跟5个数字):");
gets(UserID);
strupr(UserID);

ID = 0;
sum = 0;
for(k = 0; k < 8; k++)
{
sum += UserID[k];
UserID[k] -= '0';
if (UserID[k] > 9)
{
UserID[k] -= 'A'-'0';
}
UserID[k] &= 0x0F;
ID <<= 4;
ID |= UserID[k];
}

ID ^= 0x19670109L; //作者生日？
__asm
{
push eax
push ecx
mov eax, [ID]
mov cl, [sum]
and cl, 0x1F
rol eax, cl //环型移位。虽然用C语句也可以实现
mov [ID], eax
pop ecx
pop eax
}

//以下是显示一个二十六进制数
printf("Your password is: ");
for(k = 0; k < 7; k++)
{
Password[k] = (ID % 26L) + 'A';
ID /= 26L;
}
putchar('Z');
for(k--; k >= 0; k--)
{
putchar(Password[k]);
}
}

把下面对应的代码分析清楚就ok：

1697:01BC PUSH ESI
1697:01BE LES BX,[1248]
1697:01C2 MOV AX,ES
1697:01C4 OR AX,BX
1697:01C6 JZ 0227
1697:01C8 MOV CX,0007
1697:01CB XOR ESI,ESI
1697:01CE MOV EAX,0000001A
1697:01D4 MUL ESI
1697:01D7 XCHG EAX,ESI
1697:01D9 MOV AL,ES:[BX]
1697:01DC SUB AL,41
1697:01DE MOVZX EAX,AL
1697:01E2 ADD ESI,EAX
1697:01E5 INC BX
1697:01E6 LOOP 01CE
1697:01E8 PUSH ESI

1697:01EA LES BX,[124C]
1697:01EE MOV CX,0008
1697:01F1 XOR ESI,ESI
1697:01F4 XOR DL,DL
1697:01F6 MOV AL,ES:[BX]
1697:01F9 ADD DL,AL
1697:01FB SUB AL,30
1697:01FD CMP AL,09
1697:01FF JBE 0205
1697:0201 SUB AL,11
1697:0203 AND AL,0F
1697:0205 SHL ESI,04
1697:0209 XOR AH,AH
1697:020B OR SI,AX
1697:020D INC BX
1697:020E LOOP 01F6

1697:0210 POP EAX
1697:0212 MOV CL,DL
1697:0214 AND CL,1F
1697:0217 ROR EAX,CL
1697:021A XOR EAX,19670109
1697:0220 SUB EAX,ESI
1697:0223 MOV [124C],EAX
1697:0227 XOR EAX,EAX
1697:022A MOV [1248],EAX
1697:022E POP ESI
1697:0230 RETF


winzip

标 题:winzip注册机 (1千字)
发信人:8989
时 间:2001-4-12 23:07:29
详细信息:
大家都知道,Winzip的注册码计算方法从来没改过,
这样做一个注册机就满有用的了,我稍微跟了一下,
发现并不是很复杂,只要看懂,你也可以写一个,
如果你愿意就练习一下吧!
从这里开始Ctrl+C

/**********************************************/
#include "stdio.h"

void main(void)
{
char str1[40],*pch=str1;
int c1=0,d1=0,eax=0,c2=0,ecx=0,n2=0,esi=0;
        printf("RegWinZip (for v6.x--v8.x), Write by BetterWang!\n");
        printf("Enter Your Name(1--39 letters):");

        scanf("%s",str1);
        while((*pch)!='\0'){
        d1+=(*pch)*c1;pch++;c1++;};
        pch=str1;
        while (*pch!='\0')
        {
                ecx=(*pch)*0x100;
                for(c2=0;c2<8;c2++){
                        esi=ecx;
                        esi^=eax;
                        if(esi&0x8000){
                                eax<<=1;
                                eax^=0x1021;
                                }
                        else{eax<<=1;}
                        ecx<<=1;}
                c1++;pch++;
        }

        n2=eax+0x63;
        n2&=0xffff;
        printf("Try This Code: ");
        printf("%04X",n2);
        printf("%04X",d1);
}

/******************************************************************/


WinZIP.Self.Extractor.v2.2

标 题:WinZIP.Self.Extractor.v2.2.Final.W9xNT2K.Incl.Keymaker.Source.Code-CORE (1千字)
发信人:1212
详细信息:
 //
// WinZIP Self-Extractor v2.2 Final Keymaker
// Coded by [eGIS!/CORE].
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;

void main( void )
{
char    name[ 50 ], *p = name;
WORD    k1 = 0, k2 = 0, k, i;

printf( "\n ._______/\\__________/\\_______/\\___________.\n"
" /    _____\\_  ___
    \\_____  \\    _____/\n"
"/    \\      \\
      _\\    /  /  /__    __\\___\n"
"\\____________/__________\\___\\____  \\________/\n"
"+-ds-----------+ C.O.R.E..2.K +- \\_/ -------+\n\n"
"WinZIP Self-Extractor v2.2 Final Keymaker (c)
    by Egis/CORE.\n\nEnter your name: " );

gets( name );
strlwr( name );

i = 1;
while( *p ) {
if( !isalpha( *p ) ) {
p++;
continue;
}
k1 += ( i++ ) * ( WORD ) *( p++ );
}

p = name;
while( *p ) {
if( !isalpha( *p ) ) {
p++;
continue;
}
k = *p;
k <<= 8;
for( i = 0; i < 8; i++ ) {
if( ( k ^ k2 ) & 0x8000 ) {
k2 <<= 1;
k2 &= 0xffff;
k2 ^= 0x1021;
} else {
k2 <<= 1;
k2 &= 0xffff;
}
k <<= 1;
k &= 0xffff;
}
p++;
}

sprintf( name, "%03u", k1 );
sprintf( name + 3, "%03u", k2 + 0x9dd );
*( name + 6 ) = '\0';

printf( "\nYour registration code: %s\n", name );

}


代码算法

标 题:请问各位高手这个程序能不能写注册器出来？还是要用穷举法来算注册码？ (802字)
发信人:foxtest
时 间:2001-3-29 17:34:01
详细信息:
ID=任意数字（如:12345678）
ZSHNUM=001110101001100001110110010101000011001000010000
BHD = ''
DO WHILE ID / 2 <> 0
BMOD = IIF(MOD(ID,2) = 0,'0','1')
BHD = BMOD + BHD
ID = INT(ID / 2)
ENDDO

If len('&bhd')<48
BHD=replicate('0',48-len('&bhd'))+BHD
ENDIF

NBHD = ''

DO WHILE ZCH / 2 <> 0
BMOD = IIF(MOD(ZCH,2) = 0,'0','1')
NBHD = BMOD + NBHD
ZCH = INT(ZCH / 2)
ENDDO

If len('&nbhd')<48
NBHD=replicate('0',48-len('&nbhd'))+NBHD
ENDIF

YHNUM = ''

FOR BI = 1 TO 20
IF SUBSTR(BHD,BI,1) = SUBSTR(NBHD,BI,1)
YHNUM = YHNUM + '0'
ELSE
YHNUM = YHNUM + '1'
ENDIF
ENDFOR

FOR BI = 21 TO 48
IF SUBSTR(BHD,BI,1) = SUBSTR(NBHD,BI,1)
YHNUM = YHNUM + '1'
ELSE
YHNUM = YHNUM + '0'
ENDIF
ENDFOR

IF YHNUM == ZSHNUM
OK!
ELSE
Error!

标 题:这好象不是很复杂呀 (1千字)
发信人:blowfish
时 间:2001-3-29 17:43:50
详细信息:

下面这段是把ID转换成48-bit的二进制串
//----------------------------------------------------------
ID=任意数字（如:12345678）
BHD = ''
DO WHILE ID / 2 <> 0
BMOD = IIF(MOD(ID,2) = 0,'0','1')
BHD = BMOD + BHD
ID = INT(ID / 2)
ENDDO

If len('&bhd')<48
BHD=replicate('0',48-len('&bhd'))+BHD
ENDIF
//-----------------------------------------------------------

下面这段和上面的类似，是把ZCH（注册号）转换成48-bit的二进制串

//-----------------------------------------------------------
NBHD = ''

DO WHILE ZCH / 2 <> 0
BMOD = IIF(MOD(ZCH,2) = 0,'0','1')
NBHD = BMOD + NBHD
ZCH = INT(ZCH / 2)
ENDDO

If len('&nbhd')<48
NBHD=replicate('0',48-len('&nbhd'))+NBHD
ENDIF
//---------------------------------------------------------
下面这段是把ID的二进制串和ZCH的二进制串分成两段来逐位比较，每位比较的结果都记录在YHNUM中
//---------------------------------------------------------
YHNUM = ''

FOR BI = 1 TO 20
IF SUBSTR(BHD,BI,1) = SUBSTR(NBHD,BI,1)
YHNUM = YHNUM + '0'
ELSE
YHNUM = YHNUM + '1'
ENDIF
ENDFOR

FOR BI = 21 TO 48
IF SUBSTR(BHD,BI,1) = SUBSTR(NBHD,BI,1)
YHNUM = YHNUM + '1'
ELSE
YHNUM = YHNUM + '0'
ENDIF
ENDFOR
//------------------------------------------------------

将比较的结果YHNUM和常数串ZSHNUM进行比较
//------------------------------------------------------
ZSHNUM=001110101001100001110110010101000011001000010000
IF YHNUM == ZSHNUM
OK!
ELSE
Error!

标 题:大概： (409字)
发信人:１２１２
时 间:2001-3-29 17:45:49
详细信息:

(1) 把ID转换成2进制数放到BHD中
(2) 把ZCH转换成2进制数放到NBHD中
(3) BHD的前20位如果和NBHD的对应位相同，YHNUM添加一个0，否则添加1
(4) BHD的21~48位如果和NBHD的对应位相同，YHNUM添加一个1，否则添加0

(3)相当于BHD前20位和NBHD进行异或
(4)相当于BHD21~48位和NBHD进行与或(对XOR取补)

也就是说如果ZCH已知，那么ID算法为：

1~20位：ZSHNUM ^ ZCH
21~48位：~(ZSHNUM ^ ZCH)

然后转换成10进制。

原文没给出ZCH。


东胜算码机

 标 题:东胜算码机 (4千字)
发信人:stkman
时 间:2001-8-19 10:45:26
详细信息:

 #include <stdio.h>
#include <conio.h>
unsigned long f0bfb(unsigned long a,unsigned long b);
unsigned long f1345(unsigned long a);
unsigned long f115a(unsigned long a);
unsigned long f1011(unsigned long a);
unsigned long f0f28(unsigned long a,unsigned long * b,unsigned long * c);
unsigned long f1256(unsigned long a);
unsigned long f0d8a(unsigned long b);
unsigned long cacu(unsigned long a,unsigned long b);
unsigned long u1011(unsigned long a);

main()
{
unsigned long a,b,d;
char  str[10];
printf("东胜算码机  by  STKMAN \n");
printf("Please Input Cardid:");
scanf("%lx",&a);
printf("Please Input End Date:");
scanf("%lx",&d);
d=((((d>>0x10)-0x2000))<<9) |
((((d & 0xf000)>>0xc)*0xa+((d & 0x0f00)>>0x8))<<5)
  |
((((d & 0xf0)>>4)*0xa)+(d & 0xf));
b=0x3838;
printf("Password is %lX !\n",cacu(a,d));
printf("Super Password is %lX ! \n",cacu(a,b));

}
unsigned long cacu(unsigned long a,unsigned long b)
{
unsigned long x,y,z,m;
int i;
char str[10];
x=f1256(f115a(a) ^ f1345(f115a(f0d8a(b))));
x=((x / 0x10000) ^ x) & 0xffff;
x= x ^ 0x3838;

x=f0f28(0,&b,&x);
x=x ^ f1345(a);
z=f1345(a ^ 0xffffffff);
y=(f1345(f115a(a)) % 0x138)+0x38;
for(i=0;i<y;i++)
x=u1011(x);
m=z^x;
return(m);
}
unsigned long u1011(unsigned long a)
{
unsigned long x,y,z,n;
int m;
x= a & 0x0f;
y=x;
z=0;m=4;
while(m<0x20)
{
y=y | (((unsigned long) 1) <<m);
z=z | (((unsigned long) 1) <<m);
n=(y+(y<<4)+(y<<5)+(y<<6)+(y<<8)+(y<<9)
+(y<<0x0a)+(y<<0x0c)+(y<<0x0e)) &
  z;

if((a & (((unsigned long)1)<<m))  ==0)
{
x=(x^(x&(((unsigned long)1)<<m))) | (n^(((unsigned
  long)1)<<m));
y=y^(((unsigned long)1)<<m);
}
else
x=(x^(x&(((unsigned long)1)<<m))) | (n&(((unsigned
  long)1)<<m));
m++;
}
x=x+0x3838;
return(x);
}
unsigned long f0bfb(unsigned long a,unsigned long b)
{
unsigned long c,x,y,z,m;
int i;
x=b ^ f1345(a ^0xffffffff);
y=(f1345(f115a(a)) % 0x138)+0x38;
for(i=0;i<y;i++)
x=f1011(x);
x=x ^ f1345(a);
f0f28(x,&y,&x);
z=f1256(f115a(a) ^ f1345(f115a(f0d8a(y))));
z=((z / 0x10000) ^ z) & 0xffff;
b= x ^ z;
if(b==0x3838)
return(y);
else
return(0x4949);
}
unsigned long f1345(unsigned long a)
{
unsigned char x[4]={0,0,0,0},p[4]={0x69,0x94,0x93,0x70};
unsigned char q,m,y,n;
unsigned long r;
int z,i,j;

for(z=0;z<4;z++)
{
x[z]=(unsigned char)(a >> (0x18-z*8));
p[3-z]=p[3-z] ^ x[z];
}
p[0]=p[0]^0x5a;
if(p[0]==0) p[0]=0x5a;
for(z=(p[0] & 0xf) + 0x20;z>0;z--)
{
q=0;
for(i=0;i<4;i++)
{
n=0;
y=x[i] & p[i];
for(j=0;j<8;j++)
n=n ^ ((y>>j) & 0x1);
q=q^n;
}

for(i=3;i>=0;i--)
{
m=0;
if(x[i] & 0x80) m=1;
x[i]=(x[i]<<1) | q;
q=m;
}
}
r=0;
for(i=0;i<4;i++)
r=r+((unsigned long)(x[i])<<(0x18-i*8));
return(r);
}

unsigned long f115a(unsigned long a)
{
unsigned long x,y;

x=((a>>1) & 0x55555555) | ((a<<1) & 0xaaaaaaaa);
x=((x>>2) & 0x33333333) | ((x<<2) & 0xcccccccc);
x=((x>>4) & 0x0f0f0f0f) | ((x<<4) & 0xf0f0f0f0);
x=((x>>8) & 0x00ff00ff) | ((x<<8) & 0xff00ff00);
x=(x>>0x10) | (x<<0x10);
return(x);
}
unsigned long f1011(unsigned long a)
{
unsigned long x,y,z,n;
int m;

x=a-0x3838;
y=x & 0xf;
z=0;m=4;
while(m<0x20)
{
y=y | (((unsigned long)1)<<m);
z=z | (((unsigned long)1)<<m);
n=(y+(y<<4)+(y<<5)+(y<<6)+(y<<8)+(y<<9)
+(y<<0x0a)+(y<<0x0c)+(y<<0x0e)) &
  z;
if((x & z)!=n)
y=y ^ (((unsigned long )1)<<m);
m++;
}
return(y);
}
unsigned long f0f28(unsigned long a,unsigned long * b,unsigned long * c)
{
char x;

if(a!=0)
{
*b=0;*c=0;
x=0;
while(x<0x10)
{
*c= (*c) | (((a>>(x<<1)) & 1)  <<
  x);
*b= (*b) | (((a>>((x<<1)+1)) & 1) << x);
x++;
}
}
else
{
x=0;
while(x<0x10)
{
a=a+  (((*c >> x) & 1) << (x<<1));
a=a+  (((*b >> x) & 1) << ((x<<1)+1));
x++;
}
}
return(a);
}
unsigned long f0d8a(unsigned long b)
{
unsigned  long x,y;

y=(((b>>9)/0x64)<<8) | ((((b>>9)%0x64)/0x0a) <<4) | (((b>>9)%0x0a)
  & 0x0f);
x=(y+0x2000) << 0x10;
y=(b>>5) & 0xf;
if(y>0x0a)  y=y+6;
x=x | (y<<8);
y=b & 0x1f;
x=x | ((y/0x0a)<<4) | (y%0x0a);
return(x);
}
unsigned long f1256(unsigned long a)
{
unsigned long x,y,z,m,n;
int i;

x=a ^ 0xffffffff;y=0;i=0;
while(i<0x78)
{
z=x;m=0;
while(m<0x20)
{
/*  n=z;  */
if(z & 1)
if((m%3)==0)
y=y ^ 1;
z=z>>1;
m++;
}
x=x+x;
m=y & 1;
y=m;
x=x | m;
i++;
}
return(x);
}


度量衡1.0

标 题:度量衡1.0注册机（相当简单~~~~~~） (184字)
发信人:真·伪装者
时 间:2001-2-3 17:09:57
详细信息:
main()
{ long a,b=0x012d1062,c;
printf("Please input your number ");
scanf("%lx",&a);
c=a&b;
printf("Your registation code is %lx\nWelcome to WWW.CRACKNOW.COM\n",c);}


虹狗破解工具

 标 题:贴彩虹狗破解工具的注册机 (727字)
发信人:伪装者[CCG]
时 间:2001-7-1 0:43:25
详细信息:
 #include "stdio.h"
main()
{
char e[8],d[8];
long i,c,esi=0x5816,t,a;
printf("******TEST********\nThis keygen is made by Pretender\nPlease input your
  ID  :  ");
gets(e);
for(i=0;i<4;i++)
d[i]=e[i+4],d[i+4]=e[i];
printf("Your Register code is :  ");
for(i=0;(c=d[i])!='\0';i++)
{if(c>='0'&&c<='9') d[i]-=48;
if(c>='A'&&c<='F') d[i]-=55;
if(c>='a'&&c<='f') d[i]-=87;}
for(i=0;i<4;i++)
{c=d[2*i]*16+d[2*i+1];
t=esi/256;
t=t^c;
printf("%02X",t);
esi=(esi+t)*0xf3f;
esi+=0x8f30;
esi&=0xffff;
}
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");}


简易电子琴

标 题:简易电子琴注册机（好象有问题） (432字)
发信人:伪装者[CCG]
时 间:2001-4-8 11:10:45
详细信息:
 #include "stdio.h"
main()
{
char string[81];
long d=0;
int i,c,e;
printf("******FLASHSOFT 1.0********\nThis keygen is maked by Pretender\nPlease
    input your name\n");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{e=((i+1)*i+1)*i;
printf("%d",e);
d+=c*c+39475020+e;
}
printf("Your name is          ");
puts(string);
printf("Your Register code is %lX\n",d);
printf("Welcome to WWW.CRACKNOW.COM\n");}

标 题:简易电子琴4.0注册机(TC)(完全版) (588字)
发信人:风飘雪[CCG]
时 间:2001-4-8 19:01:41
详细信息:

简易电子琴4.0注册机(TC)

作者主页mitchzh.yeah.net
#include "stdio.h"
main()
{
char string[81];
long d=0;
int i,e;
long c,f=0,g=54404,y;
printf("******EasyOrgan4.0********\nThis keygen is maked by guodong\n");
printf("http://duba.126.com\nPlease input your name:");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{e=((i+1)*i+1)*i;
d+=c*c+39475020+e;
y=g*i+f;
f=c*c*c+39622454+y;
g+=616;
}
printf("Your name is ");
puts(string);
printf("Your Register code is %lX-%lX\n",d,f);
return(0);}

风去自由,飘过处踏雪无痕
gd1@yeah.net http://duba.126.com


密码截取网络版1.0

 标 题:密码截取网络版1.0注册机(VB写的) (345字)
发信人:8989
时 间:2001-4-28 18:21:18
详细信息:
密码截取网络版1.0注册机(VB)
用户名GUODONG 注册码1301
http://gaoasp.cn99.com

Dim myname As String
Dim zcm As Integer
Private Sub Text1_Change()
zcm = 0
myname = Text1.Text + "whm_w"
For i = 1 To Len(myname)
zcm = zcm + Asc(Mid$(myname, i))
Next i
Text2.Text = zcm
End Sub

http://duba.126.com 每日更新,希望各位朋友多多捧场


神奇注册表

标 题:神奇注册表注册机 (810字)
发信人:真·伪装者
时 间:2001-2-4 5:15:52
详细信息:
 #include "stdio.h"
main()
{
char string[81];
static int f[32]={0x48,0xee,0x76,0x1d,0x67,0x69,0xa1,0x1b,
0x7a,0x8c,0x47,0xf8,0x54,0x95,0x97,0x5f,
0x78,0xd9,0xda,0x6c,0x59,0xd7,0x6b,0x35,
0xc5,0x77,0x85,0x18,0x2a,0x0e,0x52,0xff};
int i,a=0;
unsigned c;
printf("This keygen is maked by Pretender\nPlease input your name
        ");
gets(string);
printf("Your Registation number is    ");
for(i=0;(c=string[i])!='\0';i++)
{if(c>127) c=-c;
a=c^f[i];if(a>127) a=a-256;
while(a>57) {a-=3;continue;}
while(a<48) {a+=3;continue;}
printf("%d",a-48);
}
printf("\nWelcome to WWW.CRACKNOW.COM");}
目前只能以32个以下字符数（16个以下汉字也可以）作用户名~~~~（我懒得抄F[]那张表~只抄了32个~~呵呵~~~~~不过我想够用了！）
没天理！为什么我每次都要贴3遍才能成功？！！？！？！？


天音怒放的注册机

标 题:天音怒放的注册机 (1千字)
发信人:伪装者[CCG]
时 间:2001-4-8 11:09:33
详细信息:
 #include "stdio.h"
main()
{
char string[81];
long pw[12]={0x185a5411,0x2afc4281,0x28a912b5,0x0f732f09,
0x119fe5f2,0x0bb026fd,0x120abb66,0x0ac01ff5,
0x29a9f2f0,0x3541c352,0x353a745c,0x288a8742};
long d,e=0;
int i,c;
printf("******TYPLAYER 2.13B********\nThis keygen is maked by Pretender\nPlease
    input your name : ");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{if(c<0) c+=256;
if(c>96&&c<123) c-=32;
d=pw[(i+1)%12]*c;
e+=d;
}
printf("Your name is          : ");
puts(string);
e=(0x7fffffff-e)*0xd3;
d=e=e>0?e:-e;
/*if(d<100000000) d=d*10+8;
if(d<10000000) d=d*100+45;
if(d<1000000) d=d*1000+738;
if(d<100000) d=d*10000+7338;
if(d<10000) d=d*100000+83690;
if(d<1000) d=d*1000000+309678;
if(d<100) d=d*10000000+2467309;
if(d<10) d=d*100000000+13247685;*/

for(i=0;i<9;i++)
{string[i]=d%10;
d=d/10;}
printf("Your Register code is  : ");
for(i=0;i<9;i++)
{printf("%d",string[8-i]);
if(i==2||i==6) printf("-");}
printf("\nWelcome to WWW.CRACKNOW.COM\n");}
有点问题，就是第一步算出的数是否大于9位，如果小于这个注册机不合适
但我试了10几个用户名都没有出现小于10位的~所以~~~嘿嘿~~


硬盘清道夫 1.00

 标 题:《硬盘清道夫》的注册机 一个极其简单的软件！ (649字)
发信人:RATARICE[BCG]
时 间:2001-8-17 20:59:51
详细信息:
《硬盘清道夫》的注册机

作者：RATARICE[BCG]

好高兴呀！终于做出了第一个注册机，虽然是极其简单的算法，但必定是我的第一次呀！希望大哥们不要笑话！

在这里要非常感谢破解勇大哥的鼎立支持！！！

#include "stdio.h"
#include "string.h"
main()
{char name[100];
int nl,sit,a,b,c,d,i;
clrscr();
printf("************** FDISK CLEANER 1.00 crack by RATARICE[BCG]");
printf("**************\n\n\n");
printf("Please input you register name :\n");
gets(name);
nl=strlen(name);
a=nl*107;
printf("\n");
printf("The register code is :\n");
for (i=0;i<nl;i++)
{b=0;
b=a+name[i];
d=i+1;
c=b/d;
printf("%d",c);
}
}


ACiD_BuRN2的crackme

标 题:blowfish大虾，请问能否解决掉此pcode的NAG？ (5千字)
发信人:zest
时 间:2001-4-26 1:35:29
详细信息:
blowfish大虾，请问能否解决掉此pcode的NAG？
见《论坛精华II》中：“ACiD_BuRN2的crackme”
http://go6.163.com/~ddxia/crackme/ACiD_BuRN2.zip
我去除了其anti-smartcheck功能如下：

用exdec反编译之：
Proc: 42c318
42C148: f5 LitI4: 0x4e 78 (...N)
42C14D: 04 FLdRfVar local_0098
42C150: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C155: 04 FLdRfVar local_0098
42C158: f5 LitI4: 0x55 85 (...U)
42C15D: 04 FLdRfVar local_00A8
42C160: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C165: 04 FLdRfVar local_00A8
42C168: Lead0/ef ConcatVar
42C16C: f5 LitI4: 0x4d 77 (...M)
42C171: 04 FLdRfVar local_00C8
42C174: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C179: 04 FLdRfVar local_00C8
42C17C: Lead0/ef ConcatVar
42C180: f5 LitI4: 0x45 69 (...E)
42C185: 04 FLdRfVar local_00E8
42C188: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C18D: 04 FLdRfVar local_00E8
42C190: Lead0/ef ConcatVar
42C194: f5 LitI4: 0x47 71 (...G)
42C199: 04 FLdRfVar local_0108
42C19C: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C1A1: 04 FLdRfVar local_0108
42C1A4: Lead0/ef ConcatVar
42C1A8: f5 LitI4: 0x41 65 (...A)
42C1AD: 04 FLdRfVar local_0128
42C1B0: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C1B5: 04 FLdRfVar local_0128
42C1B8: Lead0/ef ConcatVar
42C1BC: 3a LitVarStr: ( local_0148 )
42C1C1: Lead0/ef ConcatVar
42C1C5: f5 LitI4: 0x53 83 (...S)
42C1CA: 04 FLdRfVar local_0168
42C1CD: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C1D2: 04 FLdRfVar local_0168
42C1D5: Lead0/ef ConcatVar
42C1D9: f5 LitI4: 0x4d 77 (...M)
42C1DE: 04 FLdRfVar local_0188
42C1E1: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C1E6: 04 FLdRfVar local_0188
42C1E9: Lead0/ef ConcatVar
42C1ED: f5 LitI4: 0x41 65 (...A)
42C1F2: 04 FLdRfVar local_01A8
42C1F5: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C1FA: 04 FLdRfVar local_01A8
42C1FD: Lead0/ef ConcatVar
42C201: f5 LitI4: 0x52 82 (...R)
42C206: 04 FLdRfVar local_01C8
42C209: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C20E: 04 FLdRfVar local_01C8
42C211: Lead0/ef ConcatVar
42C215: f5 LitI4: 0x54 84 (...T)
42C21A: 04 FLdRfVar local_01E8
42C21D: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C222: 04 FLdRfVar local_01E8
42C225: Lead0/ef ConcatVar
42C229: f5 LitI4: 0x43 67 (...C)
42C22E: 04 FLdRfVar local_0208
42C231: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C236: 04 FLdRfVar local_0208
42C239: Lead0/ef ConcatVar
42C23D: f5 LitI4: 0x48 72 (...H)
42C242: 04 FLdRfVar local_0228
42C245: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C24A: 04 FLdRfVar local_0228
42C24D: Lead0/ef ConcatVar
42C251: f5 LitI4: 0x45 69 (...E)
42C256: 04 FLdRfVar local_0248
42C259: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C25E: 04 FLdRfVar local_0248
42C261: Lead0/ef ConcatVar
42C265: f5 LitI4: 0x43 67 (...C)
42C26A: 04 FLdRfVar local_0268
42C26D: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C272: 04 FLdRfVar local_0268
42C275: Lead0/ef ConcatVar
42C279: f5 LitI4: 0x4b 75 (...K)
42C27E: 04 FLdRfVar local_0288
42C281: 0a ImpAdCallFPR4: _rtcVarBstrFromAnsi
42C286: 04 FLdRfVar local_0288
42C289: Lead0/ef ConcatVar
42C28D: 60 CStrVarTmp
42C28E: 31 FStStr local_0088
42C291: 36 FFreeVar
42C2D4: 4b OnErrorGoto
42C2D7: 27 LitVar_Missing
42C2DA: 04 FLdRfVar local_0088
42C2DD: 4d CVarRef: ( local_0148 ) 4008
42C2E2: 0a ImpAdCallFPR4: _rtcAppActivate
42C2E7: 35 FFree1Var local_0098
42C2EA: 63 LitVar_TRUE
42C2ED: 1b LitStr: %{F4}
42C2F0: 0a ImpAdCallFPR4: _rtcSendKeys
42C2F5: 35 FFree1Var local_0098
42C2F8: 63 LitVar_TRUE
42C2FB: 1b LitStr: %{Y}
42C2FE: 0a ImpAdCallFPR4: _rtcSendKeys
42C303: 35 FFree1Var local_0098
42C306: 63 LitVar_TRUE
42C309: 1b LitStr: %{J}
42C30C: 0a ImpAdCallFPR4: _rtcSendKeys
42C311: 35 FFree1Var local_0098
42C314: 1e Branch: 42c2d7
42C317: 13 ExitProcHresult

上述功能检测此crackme是否用smartcheck加载，如加载则用alt+F4关闭。
我用hiew找42C148把f5改为13即ExitProcHresult可去除其anti-smartcheck功能。
用smartcheck比较容易跟踪出注册码，也可看看冰毒大虾的文章。
但此NAG不知如何KILL，用exdec找不到任何线索，smartcheck跟踪也&*^%&#$^
我去除不了，求助于大虾！

标 题:最TUUUUUUUUUUUUUUUUU的办法！ (1千字)
发信人:zest
时 间:2001-4-26 22:45:07
详细信息:

===============================================================================
一、去除ACiD_BuRN2's crackme的NAG时间延迟
用bpx settimer跟踪：

修改crackme
Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

00041056 01 00 42 00 24 00 FF 01 1F 00 00 00 02 06 00 54 ..B.$.�........T
00041072 69 6D 65 72 31 00 0B 03 A0 0F 00 00 07 F0 00 00 imer1...?...?.
~~~~~
00041088 00 08 78 00 00 00 FF 02 02 04 00 00 06 00 00 00 ..x...�.........
00041104 54 CD 40 00 07 00 00 00 B0 CC 40 00 07 00 00 00 T虭.....疤@.....
00041120 64 CC 40 00 07 00 00 00 20 CC 40 00 56 42 35 21 d藹..... 藹.VB5!
00041136 8C 0E 76 62 35 66 72 2E 64 6C 6C 00 00 00 00 00 ?vb5fr.dll.....

0FA0为4秒延迟，可改为0001体会一下瞬时感，如改为0000则NAG不消失。
===============================================================================
二、去除ACiD_BuRN2's crackme的NAG显示
用bpx showwindow跟踪：

位于msvbvm50.dll中
0167:782785C6 56 PUSH ESI
0167:782785C7 57 PUSH EDI
0167:782785C8 8B74240C MOV ESI,[ESP+0C]
0167:782785CC FF742410 PUSH DWORD [ESP+10]---->置0后NAG消失
0167:782785D0 FF7634 PUSH DWORD [ESI+34]
0167:782785D3 FF15E4142578 CALL `USER32!ShowWindow`
0167:782785D9 8BF8 MOV EDI,EAX
0167:782785DB 8B442410 MOV EAX,[ESP+10]

但不知道修改程序何处，可作patch!?
===============================================================================

ZEST

标 题:哈哈，不谋而合！ (208字)
发信人:blowfish
时 间:2001-4-26 23:30:09
详细信息:

偶也是用SetTimer( )，也是找到000FA0，而且这个值在文件中只出现过一次。改成1还是能看见窗口一闪。
总的来说这pcode还是完全解释型的，微软就是不公布这pcode指令的资料。

哈哈，搞了半天，也快12点了，回家睡觉去罗！


aLoNg-crackme

标 题:初学者问题:一个crackme,必须输入正确的序列号,提交按钮才有效,请大家指点一下思路 (空)
发信人:1212
时 间:2001-2-24 21:26:26
详细信息:

http://go3.163.com/~gfcrack/crackme/aLoNg3x.1.zip

标 题:有意思！ (907字)
发信人:1212
时 间:2001-2-24 23:44:38
详细信息:

看看IDA反汇编的结果：
//---------------------------------------------------------
dd offset sub_442C78
aCodicechange db 12,'CodiceChange'
db 0Eh, 0

dd offset sub_442D64
aOkclick db 7,'OkClick'
db 11h, 0

dd offset sub_442E04
aNomechange db 10,'NomeChange'
db 14h, 0

dd offset sub_442EA8
aCancellaclick db 13,'CancellaClick'
db 11h, 0
//------------------------------------------------------------
上述是控件及其回调函数的地址，即：

函数名 函数入口地址 函数的意义
CodiceChange( ) 442C78 当你修改了注册码时要调用此函数
OkClick( ) 442D64 当你点击OK按钮时要调用此函数
NomeChange( ) 442E04 当你修改了名字时要调用此函数
CancellaClick( ) 442EA8　　　　　当你点击Cancel按钮时要调用此函数

在上面4个函数地址处设断点，然后稍微跟一下，你就会看到它是如何判断注册码的了，但跟你的操作顺序有点关系 :)

BF
标 题:没啥技巧，Delphi/C++ Builder中VCL控件的事件处理就是这样的 (226字)
发信人:1212
时 间:2001-2-25 13:24:09
详细信息:

你每输入一位注册码它都要判断一次，所以一定是处理了TEdit的OnChange( )，找到这个函数就有眉目了。

这不算zen吧

最好有个工具能把Borland的编译器生成的EXE文件中的无用的字符串去掉，这样能够增加破解的难度，就象Unix上的strip一样。

BF

标 题:感谢1212！！！ (1千字)
发信人:THK
时 间:2001-2-25 13:57:19
详细信息:
当我遇到实时比较的程序时总感到无处下手。
首先感谢楼上的1212大侠。
闲话不说，let's go!
bpx 442c78
g

016F:00442A93 MOV ECX,[EBP-04] //这里开始由用户名生成一个数A
016F:00442A96 MOVZX ECX,BYTE [ECX+EAX-01]
016F:00442A9B MOV ESI,[EBP-04]
016F:00442A9E MOVZX ESI,BYTE [ESI+EAX]
016F:00442AA2 IMUL ECX,ESI
016F:00442AA5 IMUL ECX,EAX
016F:00442AA8 ADD EBX,ECX
016F:00442AAA INC EAX
016F:00442AAB DEC EDX
016F:00442AAC JNZ 00442A93 //不跳，完成用户名处理
016F:00442AAE MOV EAX,[EBP-08]
016F:00442AB1 CALL 00407670 //这里由注册码生成一个数B
016F:00442AB6 SUB EBX,EAX //A-B
016F:00442AB8 CMP EBX,029A //A-B=29a
016F:00442ABE JNZ 00442AC4 //跳就死
016F:00442AC0 MOV BL,01
----------------------------------------------------------
//注册码的处理部分
016F:004029AA SUB BL,30
016F:004029AD CMP BL,09
016F:004029B0 JA 004029DE
016F:004029B2 CMP EAX,EDI
016F:004029B4 JA 004029DE
016F:004029B6 LEA EAX,[EAX+EAX*4] //eax=eax+eax*4
016F:004029B9 ADD EAX,EAX
016F:004029BB ADD EAX,EBX
016F:004029BD MOV BL,[ESI]
016F:004029BF INC ESI
016F:004029C0 TEST BL,BL
016F:004029C2 JNZ 004029AA
------------------------------------------------------------
还有一点
016F:00442A5A XOR EAX,EAX
016F:00442A5C PUSH EBP
016F:00442A5D PUSH DWORD 00442AE5
016F:00442A62 PUSH DWORD [FS:EAX]
016F:00442A65 MOV [FS:EAX],ESP
016F:00442A68 MOV EAX,[EBP-04]
016F:00442A6B CALL 00403A34
016F:00442A70 CMP EAX,BYTE +05 //用户名是否大于5位
016F:00442A73 JNG 00442AC8 //少于则死
016F:00442A75 MOV EAX,[EBP-04]

整理：
name :THK123
sn: 49763
THK


CrackMe 01

 标 题:一个CrackMe的破解以及注册机的制作 (4千字)
发信人:NYDoll
时 间:2001-8-16 20:51:26
详细信息:
一个CrackMe的破解以及注册机的制作

自从研究CCG的CrackMe之后 便开始对CrackMe这个东西很感兴趣，所以跑到DDXia前辈的主页上逛了一圈准备借鉴
一下别人的优秀思想，完善一下自己正在酝酿中的CrackMe，太难的破不了，太简单的又没有意思，找了一个中等难度的东西Down了下来，回来一看，正好适合写偏教程给初学者讲讲 ^_^ 说不定以后FCG的考试也要用CrackMe了呢

这个东西的注册方法很普遍 就是Name/SN的格式 先进入注册窗口 输入姓名：NYDoll 注册码：38383838 运行TRW下断点BPX HMEMCPY 然后回到程序点击注册按钮，被TRW栏下，清除断点BC * 输入PMODULE到程序领空 然后要按一阵F10之后来到这里：

:004479A6 837DF400 cmp dword ptr [ebp-0C], 00000000
:004479AA 0F8428020000 je 00447BD8
:004479B0 8BB338030000 mov esi, dword ptr [ebx+00000338]
:004479B6 807E0500 cmp byte ptr [esi+05], 00
:004479BA 0F8420010000 je 00447AE0

//省略一部分代码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004479BA(C)
|
:00447AE0 33F6 xor esi, esi
:00447AE2 8D55F4 lea edx, dword ptr [ebp-0C]
:00447AE5 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:00447AEB E868BDFDFF call 00423858
:00447AF0 8B45F4 mov eax, dword ptr [ebp-0C]
:00447AF3 E83CBFFBFF call 00403A34
:00447AF8 85C0 test eax, eax
:00447AFA 7E4B jle 00447B47
:00447AFC 8D55F4 lea edx, dword ptr [ebp-0C]
:00447AFF 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:00447B05 E84EBDFDFF call 00423858
:00447B0A 8B45F4 mov eax, dword ptr [ebp-0C] //载入用户名
:00447B0D E822BFFBFF call 00403A34
:00447B12 8BF8 mov edi, eax //得到用户名的字符数
:00447B14 85FF test edi, edi //比较用户名是否为空
:00447B16 7C2F jl 00447B47 //跳走就死翘翘了 ：（
:00447B18 47 inc edi
:00447B19 C745F800000000 mov [ebp-08], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447B45(C)
|
:00447B20 8D55F4 lea edx, dword ptr [ebp-0C]
:00447B23 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:00447B29 E82ABDFDFF call 00423858
:00447B2E 8B45F4 mov eax, dword ptr [ebp-0C] //载入用户名
:00447B31 8B55F8 mov edx, dword ptr [ebp-08] //记录循环次数
:00447B34 0FB64410FF movzx eax, byte ptr [eax+edx-01] //将用户名的第一位以ASCII码形式存到EAX，第一次循环值为零。
:00447B39 03F0 add esi, eax //与上一次循环后得到的累加值相加
:00447B3B 03B314030000 add esi, dword ptr [ebx+00000314] //当前字符的十进制值加上11111
:00447B41 FF45F8 inc [ebp-08]
:00447B44 4F dec edi //计数器
:00447B45 75D9 jne 00447B20 //用户名全部计算完毕则跳走

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00447AFA(C), :00447B16(C)
|
:00447B47 8D55FC lea edx, dword ptr [ebp-04]
:00447B4A 8BC6 mov eax, esi //将累加值压入EAX寄存器
:00447B4C E857FBFBFF call 004076A8
:00447B51 FFB30C030000 push dword ptr [ebx+0000030C]
:00447B57 FF75FC push [ebp-04]
:00447B5A FFB310030000 push dword ptr [ebx+00000310]
:00447B60 8D45FC lea eax, dword ptr [ebp-04]
:00447B63 BA03000000 mov edx, 00000003
:00447B68 E887BFFBFF call 00403AF4
:00447B6D 8D55F4 lea edx, dword ptr [ebp-0C]
:00447B70 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:00447B76 E8DDBCFDFF call 00423858
:00447B7B 8B55F4 mov edx, dword ptr [ebp-0C] //EDX中为我输入的注册码
:00447B7E 8B45FC mov eax, dword ptr [ebp-04] //EAX中为刚才循环完后的累加值
:00447B81 E8BEBFFBFF call 00403B44
:00447B86 7528 jne 00447BB0 //如果不相等就死了 ：（

//到此为止，整个CrackMe的算法已经完全弄明白了，为了使大家加深印象我再综合的复诉一边：
//举例说明NYDoll是如何产生出正确的注册码78339的
//（1）依次去NYDoll中的字符，并将它以ASCII码的形式保存
//（2）ASCII码的值加上11111，再保存起来
//（3）若用户名没有取完则循环，第二次ASCII码值加上11111的结果和第一次的累加值相加
//（4）若第一次循环，则累加值为11111
//即注册过程的中间数据为：11111+(78+11111)+(89+11111)+(68+11111)+(111+11111)+(108+11111)+(108+11111)
//结果等于78339即为正确的注册码了

By 娃娃(NYDoll)
今天太困了 明天贴注册机！ Bye For Now

标 题:加上一个VB的注册机 (5千字)
发信人:NYDoll
时 间:2001-8-17 10:23:26
详细信息:

一个CrackMe的破解以及注册机的制作

自从研究CCG的CrackMe之后 便开始对CrackMe这个东西很感兴趣，所以跑到DDXia前辈的主页上逛了一圈准备借鉴
一下别人的优秀思想，完善一下自己正在酝酿中的CrackMe，太难的破不了，太简单的又没有意思，找了一个中等难度的东西Down了下来，回来一看，正好适合写偏教程给初学者讲讲 ^_^ 说不定以后FCG的考试也要用CrackMe了呢

这个东西的注册方法很普遍 就是Name/SN的格式 先进入注册窗口 输入姓名：NYDoll 注册码：38383838 运行TRW下断点BPX HMEMCPY 然后回到程序点击注册按钮，被TRW栏下，清除断点BC * 输入PMODULE到程序领空 然后要按一阵F10之后来到这里：

:004479A6 837DF400 cmp dword ptr [ebp-0C], 00000000
:004479AA 0F8428020000 je 00447BD8
:004479B0 8BB338030000 mov esi, dword ptr [ebx+00000338]
:004479B6 807E0500 cmp byte ptr [esi+05], 00
:004479BA 0F8420010000 je 00447AE0

//省略一部分代码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004479BA(C)
|
:00447AE0 33F6 xor esi, esi
:00447AE2 8D55F4 lea edx, dword ptr [ebp-0C]
:00447AE5 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:00447AEB E868BDFDFF call 00423858
:00447AF0 8B45F4 mov eax, dword ptr [ebp-0C]
:00447AF3 E83CBFFBFF call 00403A34
:00447AF8 85C0 test eax, eax
:00447AFA 7E4B jle 00447B47
:00447AFC 8D55F4 lea edx, dword ptr [ebp-0C]
:00447AFF 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:00447B05 E84EBDFDFF call 00423858
:00447B0A 8B45F4 mov eax, dword ptr [ebp-0C] //载入用户名
:00447B0D E822BFFBFF call 00403A34
:00447B12 8BF8 mov edi, eax //得到用户名的字符数
:00447B14 85FF test edi, edi //比较用户名是否为空
:00447B16 7C2F jl 00447B47 //跳走就死翘翘了 ：（
:00447B18 47 inc edi
:00447B19 C745F800000000 mov [ebp-08], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447B45(C)
|
:00447B20 8D55F4 lea edx, dword ptr [ebp-0C]
:00447B23 8B83D4020000 mov eax, dword ptr [ebx+000002D4]
:00447B29 E82ABDFDFF call 00423858
:00447B2E 8B45F4 mov eax, dword ptr [ebp-0C] //载入用户名
:00447B31 8B55F8 mov edx, dword ptr [ebp-08] //记录循环次数
:00447B34 0FB64410FF movzx eax, byte ptr [eax+edx-01] //将用户名的第一位以ASCII码形式存到EAX，第一次循环值为零。
:00447B39 03F0 add esi, eax //与上一次循环后得到的累加值相加
:00447B3B 03B314030000 add esi, dword ptr [ebx+00000314] //当前字符的十进制值加上11111
:00447B41 FF45F8 inc [ebp-08]
:00447B44 4F dec edi //计数器
:00447B45 75D9 jne 00447B20 //用户名全部计算完毕则跳走

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00447AFA(C), :00447B16(C)
|
:00447B47 8D55FC lea edx, dword ptr [ebp-04]
:00447B4A 8BC6 mov eax, esi //将累加值压入EAX寄存器
:00447B4C E857FBFBFF call 004076A8
:00447B51 FFB30C030000 push dword ptr [ebx+0000030C]
:00447B57 FF75FC push [ebp-04]
:00447B5A FFB310030000 push dword ptr [ebx+00000310]
:00447B60 8D45FC lea eax, dword ptr [ebp-04]
:00447B63 BA03000000 mov edx, 00000003
:00447B68 E887BFFBFF call 00403AF4
:00447B6D 8D55F4 lea edx, dword ptr [ebp-0C]
:00447B70 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:00447B76 E8DDBCFDFF call 00423858
:00447B7B 8B55F4 mov edx, dword ptr [ebp-0C] //EDX中为我输入的注册码
:00447B7E 8B45FC mov eax, dword ptr [ebp-04] //EAX中为刚才循环完后的累加值
:00447B81 E8BEBFFBFF call 00403B44
:00447B86 7528 jne 00447BB0 //如果不相等就死了 ：（

//到此为止，整个CrackMe的算法已经完全弄明白了，为了使大家加深印象我再综合的复诉一边：
//举例说明NYDoll是如何产生出正确的注册码78339的
//（1）依次去NYDoll中的字符，并将它以ASCII码的形式保存
//（2）ASCII码的值加上11111，再保存起来
//（3）若用户名没有取完则循环，第二次ASCII码值加上11111的结果和第一次的累加值相加
//（4）若第一次循环，则累加值为11111
//即注册过程的中间数据为：11111+(78+11111)+(89+11111)+(68+11111)+(111+11111)+(108+11111)+(108+11111)
//结果等于78339即为正确的注册码了

接下来我们来看看要如何编写一个注册机，TC没有图形界面

Private Sub Text1_Change()
Dim c_num, aa, i As Integer '定义变量
Dim a, b, c, d, e '定义变量
c_num = Len(Trim(Text1.Text)) 'c_num指注册名的字符个数
If c_num = 0 Then '若用户名一栏为空则提示
MsgBox ("Enter Your Name First!") '提示信息
Else
For i = 1 To c_num '若填写完毕则开始循环运算
a = Mid(Text1, i, 1) 'a指现在取的一个字符
c = Asc(a) '将用户名依次转换为ASCII码形式
If i = 1 Then
d = c + 11111 + 11111 '第一次循环累计值为11111
Else
d = c + 11111 '用户名的每位的ASCII码值加上11111
End If
e = e + d '将累加值存入变量 E 中
Next i
Text2.Text = e '循环完成后 E中存放的就是真正的注册码了
End If
End Sub

标 题:这个太简单了！ (542字)
发信人:伪装者[CCG]
时 间:2001-8-17 12:17:32
详细信息:

 #include "stdio.h"
main()
{
unsigned char string[98];
int d,i;
unsigned long c,e=11111,f=0;
printf("*********CrackMe 1.0*********\nThis keygen is made by Pretender\nPlease
  input your name : ");
gets(string);
printf("Your Register code is  : ");
d=strlen(string);
for(i=0;i<d;i++)
{c=string[i];
f+=c;
}
f+=(d+1)*e;
printf("%ld",f);
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}


CrackMe v.x01e Cmos

标 题:CrackMe v.x01e Cmos 方式注册码算法。 (4千字)
发信人:lijing
时 间:2001-3-14 17:35:45
详细信息:

<div align="left">CrackMe v.x01e Cmos 方式 http://wocy.top263.net/crackme/crackmex01e.zip
div> 这个CrackMe比较容易破解，主要困难是把注册结果存入CMOS中，可能一些人不熟悉。
以下是该CrackMe的注册码算法，错误之处，请指正。

一、注册时，注册码写入CMOS中
:00401660 55 push ebp
:00401661 56 push esi
:00401662 57 push edi
:00401663 8BE9 mov ebp, ecx
:00401665 6A01 push 00000001
:00401667 E82BC60000 call 0040DC97
:0040166C 8BB510010000 mov esi, dword ptr [ebp+00000110] ; esi-->注册码
:00401672 32C9 xor cl, cl
:00401674 33C0 xor eax, eax
:00401676 8B7EF8 mov edi, dword ptr [esi-08]
:00401679 85FF test edi, edi
:0040167B 7E0C jle 00401689

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401687(C)
|
:0040167D 8A1406 mov dl, byte ptr [esi+eax] \
:00401680 02D0 add dl, al \
:00401682 02CA add cl, dl | 注册码计算
:00401684 40 inc eax /
:00401685 3BC7 cmp eax, edi /
:00401687 7CF4 jl 0040167D /

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040167B(C)
|
:00401689 B03F mov al, 3F
:0040168B 6A00 push 00000000
:0040168D E670 out 70, al ; 设置CMOS写入地址
:0040168F 0FBEC1 movsx eax, cl
:00401692 99 cdq
:00401693 B97F000000 mov ecx, 0000007F

* Possible StringData Ref from Data Obj ->"Waring..."
|
:00401698 68F8804100 push 004180F8
:0040169D F7F9 idiv ecx

* Possible StringData Ref from Data Obj ->"Please Restart the Porogram to "
->"Check your regist code."
|
:0040169F 68C0804100 push 004180C0
:004016A4 8BCD mov ecx, ebp
:004016A6 8AC2 mov al, dl
:004016A8 E671 out 71, al ; 写入CMOS中
:004016AA E88CBE0000 call 0040D53B
:004016AF 5F pop edi
:004016B0 5E pop esi
:004016B1 5D pop ebp
:004016B2 C3 ret

二、软件启动时判断：
* Reference To: USER32.SendMessageA, Ord:0214h
|
:0040145F 8B3D7C334100 mov edi, dword ptr [0041337C]
:00401465 50 push eax
:00401466 6A01 push 00000001
:00401468 6880000000 push 00000080
:0040146D 51 push ecx
:0040146E FFD7 call edi
:00401470 8B9614010000 mov edx, dword ptr [esi+00000114]
:00401476 8B461C mov eax, dword ptr [esi+1C]
:00401479 52 push edx
:0040147A 6A00 push 00000000
:0040147C 6880000000 push 00000080
:00401481 50 push eax
:00401482 FFD7 call edi
:00401484 B03F mov al, 3F
:00401486 E670 out 70, al ; 设置CMOS读取地址
:00401488 E471 in al, 71 ; 读取CMOS值，并存入AL中
:0040148A 0FBEC0 movsx eax, al
:0040148D 83F851 cmp eax, 00000051 ; 这里相等即可
:00401490 752D jne 004014BF
:00401492 6A00 push 00000000
:00401494 8D8ED4000000 lea ecx, dword ptr [esi+000000D4]
:0040149A E872D20000 call 0040E711
:0040149F 6A00 push 00000000
:004014A1 8D8E98000000 lea ecx, dword ptr [esi+00000098]
:004014A7 E865D20000 call 0040E711
:004014AC 83C65C add esi, 0000005C

* Possible StringData Ref from Data Obj ->"REGISTED,Email to wocy@263.net"
|
:004014AF 68A0804100 push 004180A0
:004014B4 8BCE mov ecx, esi
:004014B6 E8E0D10000 call 0040E69B
:004014BB 6A01 push 00000001
:004014BD EB2B jmp 004014EA

注册码算法：注册码第1位+0+注册码第2位+1+注册码第3位+2+注册码第4位+3+......+注册码第n位+(n-1)==0x51H

lijing, 2001.3.14
标 题:附上：Crackmex01e 关键原程式（VC60)。 (1千字)
发信人:wocy
时 间:2001-3-15 0:28:24
详细信息:
 此程式是根据注册号得一个效验值，存入cmos 得0x3f处，在启动程式得时候判断这个效验值，为81d,即可。下面是关键原代码
cmoscoolv1  Cmos信息比较程式 htpp://wocy.top263.net/soft/cmoscoolv1.zip

//////crate the verify code and save it when press the bottom ok
void CCrackmex01eDlg::Onok() //Press the buttom ok the do here
{
// TODO: Add your control notification handler code here
char ch;
char s;
UpdateData(TRUE);
int i;
for(i=0,s=0;i<m_code.GetLength ();i++)  //the
      var m_code is your input regist code.
{
ch=m_code.GetAt(i);
      //get the no.x char  to ch
s+=ch;
                  //the s is the verify code
s+=i;
}
s%=127;
                  //save the low 7 bit
_outp(0x70,0x3f);
        //save v.code to cmos
_outp(0x71,s);
MessageBox("Please Restart the Porogram to Check your
      regist code.","Waring...");  //show the dialog waring.
}

////////verify the saved code and to do the next work when begin open the
      program.

int i;
_outp(0x70,0x3f);          //read
      the saved verify code
i=_inp(0x71);
if(i==81)
        //==81 then ...else ....
{
m_ok.ShowWindow(0);
        //unshow the ok bottom
m_edit.ShowWindow (0);
      //unshow the edit bottom
m_reg.SetWindowText("REGISTED,Email
      to wocy@263.net");
m_reg.ShowWindow(1);
          //show the text about me.
}
else
      //Un.....
{
m_ok.ShowWindow(1);
m_edit.ShowWindow (1);
m_reg.SetWindowText("REGISTED,Email
      to wocy@263.net");
m_reg.ShowWindow(0);
}

good luck.


CrackMe1.0

 标 题:第二个CrackMe的破解 (6千字)
发信人:NYDoll
时 间:2001-8-17 16:39:21
详细信息:
CrackMe1.0的破解
Wrote By NYDoll

自从研究CCG的CrackMe之后 便开始对CrackMe这个东西很感兴趣，所以自己也想作出一个来，所以上网下载了一些，回来
研究想借鉴一下经验，我们来看看这个CrackMe，比较典型BC编写的，有它特定的结构，试试你就知道了，比较适合初学者破解，即使你写不出注册机，找出注册吗是应该一点问题都没有的，然后慢慢就可以看懂算法，到时候写注册机的容易了。^_^ 罗嗦了好多，我们还是回来看看程序：

我用的断点是BPX HMEMCPY，算得上是一个万能断点了，一般的程序用这个断点都可以拦下来。
来到这里，我们开始步步观察算法：

* Reference To: USER32.GetDlgItem, Ord:0000h
|
:004010B6 E8E79B0000 Call 0040ACA2
:004010BB 8BF0 mov esi, eax
:004010BD 8D8548FFFFFF lea eax, dword ptr [ebp+FFFFFF48]
:004010C3 50 push eax //用户名入栈
:004010C4 E867050000 call 00401630
:004010C9 59 pop ecx
:004010CA 8945D8 mov dword ptr [ebp-28], eax //将用户名压入地址[EBP-28]
:004010CD 8D95E4FEFFFF lea edx, dword ptr [ebp+FFFFFEE4]
:004010D3 52 push edx //注册码入栈
:004010D4 E857050000 call 00401630
:004010D9 59 pop ecx
:004010DA 68EAB04000 push 0040B0EA
:004010DF E84C050000 call 00401630
:004010E4 59 pop ecx
:004010E5 680EB14000 push 0040B10E
:004010EA E841050000 call 00401630
:004010EF 59 pop ecx
:004010F0 837DD803 cmp dword ptr [ebp-28], 00000003 //对比用户名位数是否小于3
:004010F4 7E7B jle 00401171 //小于或者等于则跳转到：00401171
:004010F6 90 nop
:004010F7 90 nop
:004010F8 90 nop
:004010F9 90 nop
:004010FA 33C9 xor ecx, ecx //ECX寄存器清零
:004010FC 33D2 xor edx, edx //EDX寄存器清零
:004010FE 33DB xor ebx, ebx //EBX寄存器清零
:00401100 33C0 xor eax, eax //EAX寄存器清零
:00401102 837DD832 cmp dword ptr [ebp-28], 00000032 //对比用户名位数是否小于50
:00401106 7D69 jge 00401171 //大于或者等于则跳转到：00401171
:00401108 90 nop
:00401109 90 nop
:0040110A 90 nop
:0040110B 90 nop

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040111C(C)
|
:0040110C 0FBE840D48FFFFFF movsx eax, byte ptr [ebp+ecx-000000B8] //依次取用户名的每一位放入EAX
:00401114 41 inc ecx //ECX寄存器加一
:00401115 33C1 xor eax, ecx //将EAX和ECX寄存器的值进行异或运算后放入EAX寄存器
:00401117 03D8 add ebx, eax //EBX存放每次循环后EAX值的累加结果
:00401119 3B4DD8 cmp ecx, dword ptr [ebp-28] //检测用户名的字符是否取完
:0040111C 75EE jne 0040110C //取完则跳出循环
:0040111E 6BC006 imul eax, 00000006 //将用户名最后一位字符与ECX寄存器的值异或后的结果乘以6，然后将结果保存到EAX中。
:00401121 C1E307 shl ebx, 07 //EBX寄存器的值逻辑左移7，结果存放到EDX寄存器中
:00401124 03C3 add eax, ebx //将EAX寄存器和EBX寄存器中的值相加。
:00401126 8945C8 mov dword ptr [ebp-38], eax //将结果压入地址[EBP-38]中
:00401129 FF75C8 push [ebp-38] //压入结果

* Possible StringData Ref from Data Obj ->"%lX"
|
:0040112C 6838B44000 push 0040B438 //---\
:00401131 8D8D80FEFFFF lea ecx, dword ptr [ebp+FFFFFE80] // \
:00401137 51 push ecx // \
:00401138 E8873D0000 call 00404EC4 // \
:0040113D 83C40C add esp, 0000000C // > 将上面的计算结果转换成16进制，它的十六进制值就是真正的注册码。
:00401140 8D8580FEFFFF lea eax, dword ptr [ebp+FFFFFE80] // /
:00401146 50 push eax // /
:00401147 8D95E4FEFFFF lea edx, dword ptr [ebp+FFFFFEE4] // /
:0040114D 52 push edx //---/

* Reference To: KERNEL32.lstrcmpA, Ord:0000h
|
:0040114E E8339C0000 Call 0040AD86 //对比真假注册码
:00401153 85C0 test eax, eax
:00401155 750D jne 00401164 //若对比失败，则跳转。

* Possible StringData Ref from Data Obj ->"恭喜您! 如果您能编写出这个CrackMe的KeyGen, "
->"请写一个教程给我 ;). " //注册成功信息！
->" "
|
:00401157 683CB44000 push 0040B43C
:0040115C 56 push esi

* Reference To: USER32.SetWindowTextA, Ord:0000h
|
:0040115D E8289B0000 Call 0040AC8A
:00401162 EB18 jmp 0040117C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401155(C)
|

* Possible StringData Ref from Data Obj ->"这个注册码是无效的!! 请再试一遍... "
->": <尚未注册> " //注册失败信息！
|
:00401164 6890B44000 push 0040B490
:00401169 56 push esi

* Reference To: USER32.SetWindowTextA, Ord:0000h
|
:0040116A E81B9B0000 Call 0040AC8A
:0040116F EB0B jmp 0040117C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004010F4(C), :00401106(C)
|

* Possible StringData Ref from Data Obj ->"用户名必须为 4个字符以上 50个字符一下 "
->"!! " //注册名或者注册码位数不符时的提示信息
|
:00401171 68C9B44000 push 0040B4C9
:00401176 56 push esi

* Reference To: USER32.SetWindowTextA, Ord:0000h
|
:00401177 E80E9B0000 Call 0040AC8A

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401162(U), :0040116F(U)
|
:0040117C 5F pop edi
:0040117D 5E pop esi
:0040117E 5B pop ebx
:0040117F 8BE5 mov esp, ebp
:00401181 5D pop ebp
:00401182 C3 ret

//接下来我们来总结一下算法，举例如用户名为NYDoll，CrackMe依次取出用户名的每一位字符，转换成十进制，然后
//与当前字符的位数进行异或运算，然后将每次异或运算后的值累加到EBX寄存器中，NYDoll的累加结果为559，然后
//将累加结果逻辑左移7位，将其结果保存到EBX中。我的结果为71552
//将注册名的最后一位与注册名的位数进行异或运算，其值乘以6，然后将结果保存到EAX寄存器中，即l与6进行异或运算
//然后再乘以6，结果为636。
//将71552与636的和72188的16进制值119FC入栈，即119FC为NYDoll相对应的注册码。

标 题:第二个CrackMe的注册机 感谢TAE大哥的帮助！ (354字)
发信人:NYDoll
时 间:2001-8-17 19:18:34
详细信息:

main()
{
long a,i,c,d,h=0,f,sn;
char name[50];
printf(" *********************\n *KeyGen by TAE![CCG]*\n *********************\n\n");
printf("Please input your name:");
gets(name);
printf("Your registration code:");
d=strlen(name);
for (i=0;i<d;i++)
{c=name[i]^(i+1);
h+=c;}
a=name[i-1];
a^=i;
f=a*6;
h=h<<7;
sn=f+h;
printf("%lX",sn);}


duelist crackme 1

 标 题:duelist crackme 1 破解 (5千字)
发信人:丁丁虾
时 间:2000-10-16 19:50:47
详细信息:
duelist crackme 1 破解 (希望转载的时候保持完整）

作者 丁丁虾 ddxia/[CCG]
目标 duelist crackme 1
目标URL http:\\go.163.com\~ddxia\crackme\DueList\Due-cm1.zip
工具 SoftIce4.01 for NT
乐趣 可以直接修改程序代码,得到序列号(懒人方法)^_^

首先看看它的readme.txt(建议在Crack Crackme前，读一读，会有些帮助的)，是 Duelist写的第一个纯ASM的Crackme。
运行，会发现它需要一个序列号，别忙下中断，看看是那一种出错信息，随便填下123，然后按check按钮，会弹出一个出错对话框！然后按OK返回主程序。
对症下药啦！:)
Ctrl+D 激活SICE
BPX MESSAGEBOXA
Ctrl+D 返回程序。
再按check按钮，就会拦截下来，跟着按F11跳出MESSAGEBOXA的系统代码(有点象TRW的Pmoudle)，光带会停在001B:00401193
001B:0040117D 6800200000 PUSH 00002000
001B:00401182 6801204000 PUSH 00402001
001B:00401187 6863204000 PUSH 00402063
001B:0040118C 6A00 PUSH 00
001B:0040118E E85C010000 CALL USER32!MessageBoxA
001B:00401193 E95CFFFFFF JMP 004010F4
^^^^^^^^^^^^^^^^^^^^^^^^^^^---->光标会停在此处
有了结果，于是我们很想去知道原因是为什么？对吗？所以我们要回顾一下历史，（是啊！在代码的历史中，永远都不会过期，可以追寻，可以重新来过，也可以重头来过，但在现实中，历史永远是历史，现在的我们只能是回忆、留恋，如果想在你的历史长河里留下精彩瞬间，请把握好今天吧！！）

简单注册方式：得到代码------》进行变化-----》然后进行比较----》对否？
我们可以看到如下的代码：
001B:004010FB 6A24 PUSH 24
001B:004010FD 68F7204000 PUSH 004020F7
^^^^^^^^^^^^^^^^^^^^^^^^----->GetDlgItemTextA是存放你输入注册码的地方
001B:00401102 6A01 PUSH 01
001B:00401104 FF7508 PUSH DWORD PTR [EBP+08]
001B:00401107 E855020000 CALL USER32!GetDlgItemTextA
^^^^^^^^^^^^^^^^^^^^^^^^----->得到注册码
001B:0040110C 33C0 XOR EAX,EAX
001B:0040110E 80B8F720400000 CMP BYTE PTR [EAX+004020F7],00
^^^^^^^^^^^^^^^^^^^^^^^^----->比较是否输入？
001B:00401115 7418 JZ 0040112F
001B:00401117 80B0F720400043 XOR BYTE PTR [EAX+004020F7],43
001B:0040111E 80B0F72040001E XOR BYTE PTR [EAX+004020F7],1E
001B:00401125 80B0F720400055 XOR BYTE PTR [EAX+004020F7],55
^^^^^^^^^^^^^^^^^^^^^^^^----->进行注册码变化
001B:0040112C 40 INC EAX
001B:0040112D E2DF LOOP 0040110E
001B:0040112F 83F800 CMP EAX,00
001B:00401132 7518 JNZ 0040114C
^^^^^^^^^^^^^^^^^^^^^^^^----->转化完没有？？
001B:00401134 6800200000 PUSH 00002000
001B:00401139 6801204000 PUSH 00402001
001B:0040113E 689D204000 PUSH 0040209D
001B:00401143 6A00 PUSH 00
001B:00401145 E8A5010000 CALL USER32!MessageBoxA
001B:0040114A EBA8 JMP 004010F4

001B:0040114C 6A24 PUSH 24
001B:0040114E 68D3204000 PUSH 004020D3
001B:00401153 68F7204000 PUSH 004020F7
001B:00401158 E864000000 CALL 004011C1
^^^^^^^^^^^^^^^^^^^^^^^^----->进行比较的子程序
001B:0040115D 83F800 CMP EAX,00
^^^^^^^^^^^^^^^^^^^^^^^^----->是否正确？？
001B:00401160 741B JZ 0040117D (JUMP )
001B:00401162 6800200000 PUSH 00002000
001B:00401167 6801204000 PUSH 00402001
001B:0040116C 6817204000 PUSH 00402017
001B:00401171 6A00 PUSH 00
001B:00401173 E877010000 CALL USER32!MessageBoxA

我们可以注意到两个地址
一个是 004020D3 -----存放着进过变化的注册码
另一个是004020F7 -----用输入的注册码
:d 4020d3 4020f5
0023:004020D3 7B 61 65 78 64 6D 26 6B-7A 69 6B 63 65 6D 26 3C {aexdm&kzikcem&<
0023:004020E3 26 66 6D 7F 6A 61 6D 7B-26 6A 71 26 6C 7D 6D 64 &fmjam{&jq&l}md
0023:004020F3 61 7B 7C 00 31 32 33 00-00 00 00 00 00 00 00 00 a{|.123.........

程序进行变化的代码仅仅是XOR，一种非常简单加密方法，有BUG呵呵~~~~，于是用SICE修改代码为如下：
001B:0040110E 80B8D320400000 CMP BYTE PTR [EAX+004020D3],00
001B:00401115 7418 JZ 0040112F
001B:00401117 80B0D320400043 XOR BYTE PTR [EAX+004020D3],43
001B:0040111E 80B0D32040001E XOR BYTE PTR [EAX+004020D3],1E
001B:00401125 80B0D320400055 XOR BYTE PTR [EAX+004020D3],55
仅仅是把这四句中的004020F7换为004020D3，即修改F7为D3，然后让程序再运行一遍，呵呵~~程序会自动显示正确注册码！赶紧抄下来！
0023:004020D3 73 69 6D 70 6C 65 2E 63-72 61 63 6B 6D 65 2E 34 simple.crackme.4
0023:004020E3 2E 6E 65 77 62 69 65 73-2E 62 79 2E 64 75 65 6C .newbies.by.duel
0023:004020F3 69 73 74 00 31 32 33 00-00 00 00 00 00 00 00 00 ist.123.........
退出程序，重新运行，输入simple.crackme.4.newbies.by.dueist，OK 收工 :D

总结：在Crack中，可以发挥自己的主观能动性(哗！上青少年修养课啊！我倒.........) 发挥想象力，不需要居伲于哪一种方法，尽管去发挥。Crack的精华之处在于不断的探索和创新！

时间：2000.10.16 19:45
提议：该回家，爱护一下自己的胃了 :)


duelist crackme 2

 标 题:duelist crackme 2 破解(上) (6千字)
发信人:丁丁虾
时 间:2000-10-17 15:08:09
详细信息:
duelist crackme 2 破解(上) (希望转载的时候保持完整）

作者 丁丁虾 ddxia/[CCG]
目标 duelist crackme 2
目标URL http:\\go.163.com\~ddxia\crackme\DueList\Due-cm2.zip
工具 SoftIce4.01 for NT WinHex winapi.hlp

我们读一下它的readme.txt，就知道这是一道解keyfile类型crackme。

keyfile类型解决方法：
1、得到文件名
2、通过分析代码来获得文件内容！

首先运行它，看看有什么出错消息---->>"你的使用期限到了，请拷贝keyfile到

该目录下！"。它要读取文件一定用CreateFileA这个API函数。于是在目标程序运行前下

中断
bpx CreateFileA
被拦截下来，按F11回到程序代码中
001B:0040105C 6A00 PUSH 00
001B:0040105E 686F214000 PUSH 0040216F
001B:00401063 6A03 PUSH 03
001B:00401065 6A00 PUSH 00
001B:00401067 6A03 PUSH 03
001B:00401069 68000000C0 PUSH C0000000
001B:0040106E 6879204000 PUSH 00402079
001B:00401073 E80B020000 CALL KERNEL32!CreateFileA
001B:00401078 83F8FF CMP EAX,-01
^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果打开文件失败，eax=-01
001B:0040107B 751D JNZ 0040109A
001B:0040107D 6A00 PUSH 00
001B:0040107F 6801204000 PUSH 00402001
001B:00401084 6817204000 PUSH 00402017
001B:00401089 6A00 PUSH 00
001B:0040108B E8D7020000 CALL USER32!MessageBoxA
^^^^^^^^^^^^^^^^^^^^^^^^^^------>出错信息
001B:00401090 E824020000 CALL KERNEL32!ExitProcess

让我们看一下调用CreateFileA API的参数含义。

HANDLE CreateFile(

LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, //读写模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性指针
DWORD dwCreationDistribution, // 创建标志
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 文件属性的复制句柄
);

其中我们最关心的是 LPCTSTR lpFileName这个参数。需要注意的是在API

的调用中ASM和高级语言是有区别的，最先出现的参数，ASM中最后PUSH。然后我们

就看出是以下这行代码是文件名指针
PUSH 00402079
d 402079
看到什么？？-----due-cm2.dat----->>>keyfile的名字
到目前我们就完成了第一步！

接着我们进行下面一步进行挖掘文件的内容，好象有的点观看挖掘老山汉墓的

感觉 呵呵~~~~~~
在目录下建一个文件名字为due-cm2.dat，再跟踪看一看是怎样的情形。
001B:00401073 E80B020000 CALL KERNEL32!CreateFileA
001B:00401078 83F8FF CMP EAX,-01
^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果打开文件失败，eax=-01
001B:0040107B 751D JNZ 0040109A
^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果成功，就跳到40109A

然后看一看40109A的代码
001B:0040109A 6A00 PUSH 00 //数据结构指针
001B:0040109C 6873214000 PUSH 00402173 //实际读取的字节数
001B:004010A1 6A46 PUSH 46 //需要读取的字节数
001B:004010A3 681A214000 PUSH 0040211A //存放内容的文件指针
001B:004010A8 50 PUSH EAX //文件的句柄
001B:004010A9 E82F020000 CALL KERNEL32!ReadFile
^^^^^^^^^^^^^^^^^^^^^^^^^^------>返回参数为非零，就成功
ReadFile API中需要注意的三个参数：402173 46 40211A

001B:004010AE 85C0 TEST EAX,EAX
001B:004010B0 7502 JNZ 004010B4
001B:004010B2 EB43 JMP 004010F7
^^^^^^^^^^^^^^^^^^^^^^^^^^------>出错跳远
001B:004010B4 33DB XOR EBX,EBX
001B:004010B6 33F6 XOR ESI,ESI
001B:004010B8 833D7321400012 CMP DWORD PTR [00402173],12
^^^^^^^^^^^^^^^^^^^^^^^^^^------>文件的字节数是否大于12，

注意12是十六进制=18，小于18个字节就出错！
001B:004010BF 7C36 JL 004010F7
001B:004010C1 8A831A214000 MOV AL,[EBX+0040211A]
^^^^^^^^^^^^^^^^^^^^^^^^^^------>取每一个字节进行比较
001B:004010C7 3C00 CMP AL,00
001B:004010C9 7408 JZ 004010D3
001B:004010CB 3C01 CMP AL,01
001B:004010CD 7501 JNZ 004010D0
001B:004010CF 46 INC ESI
^^^^^^^^^^^^^^^^^^^^^^^^^^------>ESI是累计01的个数
001B:004010D0 43 INC EBX
^^^^^^^^^^^^^^^^^^^^^^^^^^------>文件偏移指针
001B:004010D1 EBEE JMP 004010C1
001B:004010D3 83FE02 CMP ESI,02
^^^^^^^^^^^^^^^^^^^^^^^^^^------>01的个数要大于等于2
001B:004010D6 7C1F JL 004010F7
001B:004010D8 33F6 XOR ESI,ESI
001B:004010DA 33DB XOR EBX,EBX
001B:004010DC 8A831A214000 MOV AL,[EBX+0040211A]
001B:004010E2 3C00 CMP AL,00
001B:004010E4 7409 JZ 004010EF
^^^^^^^^^^^^^^^^^^^^^^^^^^------>判断是否到文件尾部
001B:004010E6 3C01 CMP AL,01
001B:004010E8 7405 JZ 004010EF
001B:004010EA 03F0 ADD ESI,EAX
^^^^^^^^^^^^^^^^^^^^^^^^^^------>当不等于01和00的时候进行

累加
001B:004010EC 43 INC EBX
001B:004010ED EBED JMP 004010DC
001B:004010EF 81FED5010000 CMP ESI,000001D5
^^^^^^^^^^^^^^^^^^^^^^^^^^------>当累加到1D5时，就跳转，

否则出错！！！
001B:004010F5 741D JZ 00401114

001B:004010F7 6A00 PUSH 00
001B:004010F9 6801204000 PUSH 00402001
001B:004010FE 6886204000 PUSH 00402086
001B:00401103 6A00 PUSH 00
001B:00401105 E85D020000 CALL USER32!MessageBoxA
^^^^^^^^^^^^^^^^^^^^^^^^^^------>错误信息。
001B:0040110A E8AA010000 CALL KERNEL32!ExitProcess
到这里我们中场休息10分钟，看看目前战果如何？^_^
1、文件的长度至少18个字节。
2、文件中01的字节至少有2个。
3、文件中再遇到01字节前，至少累加和为1D5。
aa+aa+81=1d5 (十六进制数字顺便取)
文件内容至少是这样 AA AA 81 01 01 00 00......凑够18个字节就行了

下课了，3点俺要上班了，下回接着讲啊！呵呵~~~~~~~~~~~~
啊哦！！迟到了，没有关系，领导不在！！呵呵~~~~~~~~~~~~
时间：2000.10.17 15:02:33

标 题:duelist crackme 2 破解(下) (3千字)
发信人:丁丁虾
时 间:2000-10-17 18:48:55
详细信息:

duelist crackme 2 破解(下) (希望转载的时候保持完整)

作者 丁丁虾 ddxia/[CCG]
E_mail ddxia@263.net (如果Crackme教学文章中有错，请来信:))
Web http://go18.163.com/~ddxia
目标 duelist crackme 2
目标URL http:\\go.163.com\~ddxia\crackme\DueList\Due-cm2.zip
工具 SoftIce4.01 for NT WinHex winapi.hlp

经过一下午的苦活，终于有时间写下辑了 呵呵~~~~~
001B:00401114 33F6 XOR ESI,ESI
001B:00401116 43 INC EBX
^^^^^^^^^^^^^^^^^^^^^^^^^^----->>ebx值是指向碰到第一个01时的指针
001B:00401117 8A831A214000 MOV AL,[EBX+0040211A]
001B:0040111D 3C00 CMP AL,00
001B:0040111F 7418 JZ 00401139
^^^^^^^^^^^^^^^^^^^^^^^^^^------>判断是否到文件尾部
001B:00401121 3C01 CMP AL,01
001B:00401123 7414 JZ 00401139
^^^^^^^^^^^^^^^^^^^^^^^^^^------>由于上回已经知道01有两个，这里假设两个01为连在一起，所以要跳
001B:00401125 83FE0F CMP ESI,0F
001B:00401128 730F JAE 00401139
001B:0040112A 32861A214000 XOR AL,[ESI+0040211A]
001B:00401130 898660214000 MOV [ESI+00402160],EAX
001B:00401136 46 INC ESI
001B:00401137 EBDD JMP 00401116

001B:00401139 43 INC EBX
^^^^^^^^^^^^^^^^^^^^^^^^^^------>移动指向字节的指针
下面这一段代码基本和上回说的代码相同。
001B:0040113A 33F6 XOR ESI,ESI
001B:0040113C 8A831A214000 MOV AL,[EBX+0040211A]
001B:00401142 3C00 CMP AL,00
001B:00401144 7409 JZ 0040114F
001B:00401146 3C01 CMP AL,01
001B:00401148 74F2 JZ 0040113C
001B:0040114A 03F0 ADD ESI,EAX
001B:0040114C 43 INC EBX
001B:0040114D EBED JMP 0040113C
001B:0040114F 81FEB2010000 CMP ESI,000001B2
^^^^^^^^^^^^^^^^^^^^^^^^^^------>剩余的累加和为1B2
001B:00401155 75A0 JNZ 004010F7
001B:00401157 6A00 PUSH 00
001B:00401159 68C9114000 PUSH 004011C9
001B:0040115E 6A00 PUSH 00
001B:00401160 6A05 PUSH 05
001B:00401162 FF3577214000 PUSH DWORD PTR [00402177]
001B:00401168 E842020000 CALL USER32!DialogBoxParamA
001B:0040116D EB53 JMP 004011C2
AA+AA+5E=1B2
于是可以得到一个文件的内容为
AA AA 81 01 01 AA AA 5E 00..............至少要有18个字节！这样就OK了
本想收工了。后来把程序又看了一遍，发现还有一个地方不是很明白。
001B:00401125 83FE0F CMP ESI,0F
001B:00401128 730F JAE 00401139
001B:0040112A 32861A214000 XOR AL,[ESI+0040211A]
001B:00401130 898660214000 MOV [ESI+00402160],EAX
001B:00401136 46 INC ESI
001B:00401137 EBDD JMP 00401116
大家如果有时间可以进一步研究这段程序，你发现好好玩的哦！^_^
给点提示：
AA AA 81 01 ........中间...........01 AA AA 5E 00..............至少要有18个字节
|--->>允许有 小于16个字节的存在。将会显示在对话框中
如果大于16个字节，会死循环^_^

时间：2000.10.17 18:33:33

标 题:这段程序是计算用户名的 (700字)
发信人:真.hp
时 间:2000-10-18 15:18:51
详细信息:

这段程序是计算用户名的

:00401125 83FE0F cmp esi, 0000000F ;用户名<=15个字节
:00401128 730F jnb 00401139
:0040112A 32861A214000 xor al, byte ptr [esi+0040211A] ;把第1个01后，第2个01前的第1个字节与
:00401130 898660214000 mov dword ptr [esi+00402160], eax ;keyfile的第1个字节xor。
:00401136 46 inc esi ;再把第1个01后，第2个01前的第2个字节
:00401137 EBDD jmp 00401116 ;与keyfile的第2个字节xor，以此类推得出用户名。

AA AA 81 01 CE CE F9 68 AF E1 BA 2B E8 01 AA AA 5E 00

FF D6 01 9B B2 79 F2 D3 56 B1 90 11 01 FF B3 00 00 00

这是两个不同的keyfile，但用户名均为：ddxia/CCG


duelist crackme 3

 标 题:由于昨晚朋友过生日，今天睡过头了！：） 才迟迟贴出《duelist crackme 3 破解》 (4千字)
发信人:丁丁虾
时 间:2000-10-19 15:39:01
详细信息:

duelist crackme 3 破解 (希望转载的时候保持完整)

作者 丁丁虾 ddxia/[CCG]
E_mail ddxia@263.net (如果Crackme教学文章中有错，请来信:))
Web http://go18.163.com/~ddxia
目标 duelist crackme 3
目标URL http:\\go.163.com\~ddxia\crackme\DueList\Due-cm3.zip
工具 SoftIce4.01 for NT ExeScope winapi.hlp

这个Crackme就做得比较COOL，不信，你运行起来看一看，有两行18个CheckBox，
你要Crack it ，必须要选中其中的几个CheckBox，你可以试一试说不定，好运气，一试就对了！
呵呵~~~ 。在主界面中还有一句话说你一定要使用资源编辑器。（这句话也是让我百思不得其解N
分钟，随着深入代码，然后就会慢慢的明白了，也非常有趣）

bpx messagebox
F11 回到程序代码中
在SoftIce中截下如下代码（来！我们"烟酒" "烟酒" "烟酒"）
:u 401117 L9a
001B:00401117 33F6 XOR ESI,ESI
001B:00401119 33D2 XOR EDX,EDX
001B:0040111B 89355E214000 MOV [0040215E],ESI
001B:00401121 893562214000 MOV [00402162],ESI
001B:00401127 0FBE8EFE204000 MOVSX ECX,BYTE PTR [ESI+004020FE]
^^^^^^^^^^^^^^^^---->4020FE中存放着CheckBox的ID号
001B:0040112E 83F94D CMP ECX,4D
^^^^^^^^^^^^^^^^---->判断是否到最后一个CheckBox
001B:00401131 742F JZ 00401162
001B:00401133 890D5E214000 MOV [0040215E],ECX
001B:00401139 51 PUSH ECX
001B:0040113A FF7508 PUSH DWORD PTR [EBP+08]
001B:0040113D E8D0010000 CALL USER32!IsDlgButtonChecked
^^^^^^^^^^^^^^^^---->判断CheckBox是否被选中
ECX中存放CheckBox的ID号
001B:00401142 46 INC ESI
001B:00401143 83F800 CMP EAX,00
001B:00401146 74DF JZ 00401127
^^^^^^^^^^^^^^^^---->如果没有被选中就跳到401127
检查下一个CheckBox
001B:00401148 A15E214000 MOV EAX,[0040215E]
^^^^^^^^^^^^^^^^---->把当前的ID号放入EAX
001B:0040114D 0FBE8EFE204000 MOVSX ECX,BYTE PTR [ESI+004020FE]
^^^^^^^^^^^^^^^^---->把下一个的ID号放入EAX
001B:00401154 0FAFC1 IMUL EAX,ECX
001B:00401157 0FAFC6 IMUL EAX,ESI
001B:0040115A 010562214000 ADD [00402162],EAX
^^^^^^^^^^^^^^^^^^^^^^^^---->>在00402162进行累加
001B:00401160 EBC5 JMP 00401127
001B:00401162 A162214000 MOV EAX,[00402162]
001B:00401167 6BC04D IMUL EAX,EAX,4D
^^^^^^^^^^^^^^^^^^^^^^^--->累加的值乘于4D放入EAX
001B:0040116A 3D6654F300 CMP EAX,00F35466
001B:0040116F 7520 JNZ 00401191
^^^^^^^^^^^^^^^^^^^^^^^--->比较EAX的最后的值是否
为00F35466
001B:00401171 6800200000 PUSH 00002000
001B:00401176 6801204000 PUSH 00402001
001B:0040117B 6817204000 PUSH 00402017
001B:00401180 6A00 PUSH 00
001B:00401182 E855010000 CALL USER32!MessageBoxA
001B:00401187 B801000000 MOV EAX,00000001
001B:0040118C E969FFFFFF JMP 004010FA
001B:00401191 6800200000 PUSH 00002000
001B:00401196 6801204000 PUSH 00402001
001B:0040119B 6868204000 PUSH 00402068
001B:004011A0 6A00 PUSH 00
001B:004011A2 E835010000 CALL USER32!MessageBoxA
001B:004011A7 B800000000 MOV EAX,00000000
001B:004011AC E949FFFFFF JMP 004010FA
相信各位已经把上面的算法弄清了吧！接下来我们来凑数00F35466！

1、我们先把4020FE的数据给弄到手。
:d 4020fe 40210e
0023:004020FE 16 49 5E 15 27 26 21 25-1D 59 53 37 31 48 5D 0C .I^.'&!%.YS71H].
0023:0040210E 61 52 4D 00 00 00 00 00-00 00 00 00 00 00 00 00 aRM.............
0023:0040211E 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0023:0040212E 03 40 00 00 AB 10 40 00-00 00 00 00 00 00 00 00 .@....@.........
0023:0040213E 00 00 40 00 8E 1A 73 00-08 00 01 00 00 00 00 00 ..@...s.........
0023:0040214E 00 00 00 00 00 00 00 00-00 00 00 00 00 00 40 00 ..............@.
0023:0040215E 5E 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ^...............
0023:0040216E 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

2、计算出正确的ID号。
缺一段程序！！不知道那位大虾愿意赐教 :)

你得到了ID号后，并没有大功告成哦！！^_^这些ID号的排列，并不是按界面那样
进行排列的！这时就会明白为什么要用资源编辑器，查看那些CheckBox的ID号，再进行正确
的选择，这样就可以说收工了！（其实在readme.txt中有提示:)）

时间：2000.10.18 13:46

标 题:R!SC's Solution to Duelist's Crackme #3 (14千字)
发信人:丁丁虾
时 间:2000-10-21 12:21:42
详细信息:

R!SC's Solution to Duelist's Crackme #3 -- http://csir.cjb.net -- risc@notme.com :)

Difficulty level : 5/10 (probably the toughest crack i have done)

Tools Needed : Symantec Resource Workshop 1.0
: W32Dasm
: Hex WorkShop
: Tasm
: Softice
: Efnet :) (optional)

First off (well, after running the crackme, and trying a few random combinations), i loaded
due-cm3.exe into W32Dasm, scrolling through the code, i soon found this bit...

the important code...ESI points to button check order array thingy

:00401127 0FBE8EFE204000 movsx ecx, byte ptr [esi+004020FE]
:0040112E 83F94D cmp ecx, 0000004D <-- 4D is like a NULL terminator, also used
:00401131 742F je 00401162 - for the last bit of maths
:00401133 890D5E214000 mov dword ptr [0040215E], ecx <-- save the current button iD
:00401139 51 push ecx <-- button iD
:0040113A FF7508 push [ebp+08] <-- dialog box handle

* Reference To: USER32.IsDlgButtonChecked, Ord:0000h
|
:0040113D E8D0010000 Call 00401312
:00401142 46 inc esi <-- Counter, points to next button,
:00401143 83F800 cmp eax, 00000000 - and used in the maths
:00401146 74DF je 00401127 <-- Loop until one is found checked...
:00401148 A15E214000 mov eax, dword ptr [0040215E] <-- Our checked box iD
:0040114D 0FBE8EFE204000 movsx ecx, byte ptr [esi+004020FE] <-- Next button iD
:00401154 0FAFC1 imul eax, ecx <-- Multiply next button iD with current one
:00401157 0FAFC6 imul eax, esi <-- Multiply count with answer
:0040115A 010562214000 add dword ptr [00402162], eax <-- Add it to our magic number
:00401160 EBC5 jmp 00401127

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401131(C)
|
:00401162 A162214000 mov eax, dword ptr [00402162] <-- Our final magic number..
:00401167 6BC04D imul eax, 0000004D
:0040116A 3D6654F300 cmp eax, 00F35466 <-- Magic number we have to get...

So, from this, we know we can bpx IsDlgButtonChecked, to make softice break at the routine
which does the checking. After returning from USER32.IsDlgButtonChecked, if eax is NULL, the
button wasnt checked, and it loops back to get the next iD, if eax != 0, the button is
checked, and it does some maths on it

MAGIC NUMBER = MAGIC NUMBER + (Current box iD * Next box iD * Button counter)

After the last button, it puts our MAGIC NUMBER into eax, multiplys it by 4D, then compares
it against the predifined number we have to get, F35466.. for the sake of it, to save some
maths, F35466 / 4D = 328FE (the number i finally use to figure out the correct order of ticks)

At the start of the routine, it loads ESI with the check order of the buttons, displaying the
memory at [esi+004020FE] (when ESI==0) we get this information

---button iD check order---

004020FE 16 49 5E 15 27 26 21 25 1D 59 53 37 31 48 5D 0C 61 52 4D
ESI== 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 --
my id 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 (9*2)

This means bugger all to us, because we dont know which number represents which check box on
the screen. We have to use a resource editor, to look at the dialog box resources, and find out
which box uses which iD..

I used Symantec Resource Editor 1.0, availble from http:\\protools.cjb.net (couldnt get BRW to
load the exe) . So load due-cm3.exe into your resource editor, and click to edit the dialog...
After clicking on each button, starting from the top left, converting the iD into hex, then
writing them down, i got this information from it..

Buttons on screen
61 49 5E 16 25 26 21 59 53 ; top row of check boxes

15 37 31 48 5D 0C 52 27 1D ; bottom row of check boxes 10-18

Okay, with all this information, we know what button gets checked when, and we still cant figure
out the correct order (can you do the maths in your head?)

My theory, to write a brute forcer, which will go through every possible combination you can
have, do the maths on them, and compare the result with 328FE (the correct MAGIC NUMBER / 4D)

90 minutes of coding later (i am real bad at this :) i got a result!!

Picture this in your head, 18 boxes, can be checked or unchecked, 0 or 1, imagine a binary
value, using 18 bits, to represent these boxes, we test each bit in the binary value, if its
0 it represents an unchecked box, if its 1, it represents a tick ;) we use a 1 bit binary value,
scrolling this to the left, bit by bit, and increase a counter, so we know which bit we are
checking (bit 0 through to 17), test a with b, if the bit is set, do the maths..

(see the comments i added to the source for the brute forcer..)

theory behind R!SC's Matrix Brute Forcer (r)

we have 18 check boxes, can be either 'checked' or 'unchecked' (1 or 0)
apparantly, the amount of diff combo's is square of 18, 324???
so where i come up with 262,144 :)

we also have a way of testing single 'bits' in a value, by using 'TEST dest, src'
i use a 18bit binary value (well, 32bit binary value, but only use the TEST on the first
18 bits of it...) (i'll refer to this as my MAGIC NUMBER)

i start the MAGIC NUMBER with the first bit set, (01h) then do the maths, check the result,
if it doesnt find the correct answer, we increase the MAGIC NUMBER by 1, and check again....

examples of the MAGIC NUMBER, and how it represents the matrix of check boxes....

000000000000000001 = 01h = box 1 checked, 2-18 unckecked, simulate the maths, check the results
000000000000000010 = 02h = box 2 checked, 1,3-18 unchecked
000000000000000011 = 03h = box 1,2 checked, 3-18 unckecked
000000000000000100 = 04h = box 3 checked, 1,2,4-18 unchecked
000000000000000101
000000000000000110
000000000000000111 = 07h = box 1-3 checked, 4-18 unchecked...
000000000000001000
000000000000001001

101000110101000110 = 028d46h = box 2,3,7,9,11,12,16,18 checked
box 1,4,5,6,8,10,13,14,15,17 unchecked
111111111111111111 = 03ffffh = box 1-18 checked...

to find out if a bit is set or not, i use another 18bit (32bit :) value, with only one bit
set in it (i'll call this X)

TEST MAGIC NUMBER, X ; see if bit 'X' is set in the magic number
JNZ CHECKED ; if bit 'X' is not '0' jump to calculation routine

which will check bit X in the MAGIC NUMBER, and alter the ZERO flag accordingly
i.e, bit X is 0, zero flag is set, bit X is 1, zero flag is cleared...

X gets shifted to the left by 1 bit, the counter increased, check the counter, if its equal
to 18, we have checked every bit in the MAGIC NUMBER, and have to loop back to check our result
erm... still with me??

examples of X

000000000000000001 = bit 1 set = 01h, counter = 0
000000000000000010 = bit 2 set = 02h, counter = 1
000000000000000100 = bit 3 set = 04h, counter = 2
000000000000001000 = bit 4 set = 08h, counter = 3
000000000000010000 = bit 5 set = 10h, counter = 4
000000000000100000 = bit 6 set = 20h, counter = 5
000000000001000000 = bit 7 set = 40h, counter = 6
..................
001000000000000000 = bit 16 set = 08000h, counter = 15
010000000000000000 = bit 17 set = 10000h, counter = 16
100000000000000000 = bit 18 set = 20000h, counter = 17
bit gets shifted one more time, counter increased to 18,
counter gets checked, weve done, so loop back and check the answer...

okay, go study the source code
...
...
heh, you back already? try changing this line

:0040116A 3D6654F300 cmp eax, 00F35466

to read

:0040116A 3D6E8BC000 cmp eax, 00C08B6E ; file offset 76A

and figure out the correct sequence :)

(CHANGE ALREADY MADE IN 28026-DUE-CM3.EXE)
(SOLUTION IN TEST.ZIP)

R!SC 31st May 1999
=========================================================
; R!SC 191198
; asm stylee!!!

; <_risc> well, your a good bloke.. thx for the second opinion (can i have it in writing please..)
; <josephCo> haha
; <_risc> got it..
; <_risc> <josephCo> the total combinations are 2^18
; <_risc> <josephCo> which is 262144
; * josephCo writes "it's 2^18 possible combinations"
; * josephCo writes "which is 262144"
; <josephCo> :)
; <josephCo> there you go

; theory behind R!SC's Matrix Brute Forcer (r)

; we have 18 check boxes, can be either 'checked' or 'unchecked' (1 or 0)
; (apparantly, the amount of diff combo's is square of 18, 324??? so where i come up with 262,144 :)

; we also have a way of testing single 'bits' in a value, by using 'TEST dest, src'
; i use a 18bit binary value (well, 32bit binary value, but only use the TEST on the first
; 18 bits of it...) (i'll refer to this as my MAGIC NUMBER)

; i start the MAGIC NUMBER with the first bit set, (01h) then do the maths, check the result,
; if it doesnt find the correct answer, we increase the MAGIC NUMBER by 1, and check again....

; examples of the MAGIC NUMBER, and how it represents the matrix of check boxes....

; 000000000000000001 = 01h = box 1 checked, 2-18 unckecked, simulate the maths, check the results
; 000000000000000010 = 02h = box 2 checked, 1,3-18 unchecked
; 000000000000000011 = 03h = box 1,2 checked, 3-18 unckecked
; 000000000000000100 = 04h = box 3 checked, 1,2,4-18 unchecked
; 000000000000000101
; 000000000000000110
; 000000000000000111 = 07h = box 1-3 checked, 4-18 unchecked...
; 000000000000001000
; 000000000000001001

; 101000110101000110 = 028d46h = box 2,3,7,9,11,12,16,18 checked
; box 1,4,5,6,8,10,13,14,15,17 unchecked
; 111111111111111111 = 03ffffh = box 1-18 checked...

; to find out if a bit is set or not, i use another 18bit (32bit :) value, with only one bit
; set in it (i'll call this X)

; TEST MAGIC NUMBER, X ; see if bit 'X' is set in the magic number
; JNZ CHECKED ; if bit 'X' is not '0' jump to calculation routine

; which will check bit X in the MAGIC NUMBER, and alter the ZERO flag accordingly
; i.e, bit X is 0, zero flag is set, bit X is 1, zero flag is cleared...

; X gets shifted to the left by 1 bit, the counter increased, check the counter, if its equal
; to 18, we have checked every bit in the MAGIC NUMBER, and have to loop back to check our result
; erm... still with me??

; examples of X

; 000000000000000001 = bit 1 set = 01h, counter = 0
; 000000000000000010 = bit 2 set = 02h, counter = 1
; 000000000000000100 = bit 3 set = 04h, counter = 2
; 000000000000001000 = bit 4 set = 08h, counter = 3
; 000000000000010000 = bit 5 set = 10h, counter = 4
; 000000000000100000 = bit 6 set = 20h, counter = 5
; 000000000001000000 = bit 7 set = 40h, counter = 6
; ..................
; 001000000000000000 = bit 16 set = 08000h, counter = 15
; 010000000000000000 = bit 17 set = 10000h, counter = 16
; 100000000000000000 = bit 18 set = 20000h, counter = 17
; bit gets shifted one more time, counter increased to 18,
; counter gets checked, weve done, so loop back and check the answer...

; R!SC's Matrix Brute Forcer for duelist's cm#3

; compile to a com file, tasm boo, tlink /t boo
; bpint 03 in sice.
; run the com..
; it breaks when it has found the pattern (about 1 second :)
; eax==duelist's magic number, ebx==my magic number...

; magic number it created is : 647E -- 110010001111110 in binary
; which means bit pattern : 0111111000100110000000 (yeah, reversed...)
; which means each bit thats a 1 is a checked box.. or something
; 0 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 0 0
;db 16h,49h,5Eh,15h,27h,26h,21h,25h,1Dh,59h,53h,37h,31h,48h,5Dh,0Ch,61h,52h,4Dh

; boxes 2,3,6,7,9,10,13,14,17 checked...

; buttons on screen
; id 61 49 5e 16 25 26 21 59 53
;bit was 0 1 1 0 0 1 1 0 1
; id 15 37 31 48 5d 0c 52 27 1d
; 1 0 0 1 1 0 0 1 0

.MODEL TINY
.CODE
.386

ORG 100h

start:
lea si, data
xor ecx,ecx
xor edx,edx
xor eax,eax
xor ebx,ebx

mov ebx, 01 ; we gonna inc ebx, which will add 1 bit to it each time
; 040000h=all 18 bits set, cant go no futher
jmp tryme@ ; try bit 1, before entering the loop which goes through all the other
; possible combinations
nextbits:
lea si, data ; data is the button iD array, in the mixed up order...
mov eax, dword ptr [temp] ; get our calculated number
cmp eax, 328feh ; and check it..
je gotit@@
xor eax,eax
mov dword ptr [temp], eax ; it wasnt right, so we reset it to 0 :)
inc ebx ; our 18bit value, inc ebx will make it go through every possible combination
cmp ebx, 040000h ; check if we have reached our limit.
je shit_fuck_damn ; shit fuck damn.. means that we have checked all possible
; combinations and not found our answer, we never want to jump here

tryme@:
mov eax, 01 ; gonna be our single bit , for checking which bit is set in EBX
xor edx,edx ; our iD counter
inc edx
loopy@:
test ebx, eax ; TEST MAGIC NUMBER, X
jnz callit ; JNZ CHECKED
still:
shl eax, 1 ; shift our bit to the left :)
inc edx ; increase the iD counter
inc si ; point data to next iD
cmp edx, 19 ; see if we have checked all 18 bits
je nextbits ; je next bit pattern, i.e. inc EBX
jmp loopy@ ; loop until finished

callit: ; bit X in EBX==1
pushad
call @1 ; do maths
popad
jmp still
@1:

mov al, byte ptr [si] ; current iD
mov cl, byte ptr [si+1] ; next iD
movsx eax, al ; clear rest of register
movsx ecx, cl ; " "
imul eax, ecx ; EAX==Current box iD * Next box iD
imul eax, edx ; EAX*=Button counter
add dword ptr [temp],eax ; MAGIC NUMBER = MAGIC NUMBER + EAX
ret
shit_fuck_damn:
mov eax, dword ptr [temp] ; bad news, either my code is wrong, or???
int 03
gotit@@:
mov eax, dword ptr [temp] ; temp==duelist's magic number
int 03 ; so EBX==our bit pattern
mov ax, 4C00h
int 21h

;_______________________________________________________________

temp dd 0

data db 16h,49h,5Eh,15h,27h,26h,21h,25h,1Dh,59h,53h,37h,31h,48h,5Dh,0Ch,61h,52h,4Dh

end start;


duelist crackme 4

 标 题:今天工作太忙了！好不容易才可以上来5分钟---》duelist crackme 4 破解(上) (7千字)
发信人:丁丁虾
时 间:2000-10-20 18:04:15
详细信息:
duelist crackme 4 破解 (希望转载的时候保持完整)

作者 丁丁虾 ddxia/[CCG]
E_mail ddxia@263.net (如果Crackme教学文章中有错，请来信:))
Web http://go18.163.com/~ddxia
目标 duelist crackme 4
目标URL http://go18.163.com/~ddxia/crackme/DueList/Due-cm4.zip
工具 SoftIce4.01 for NT winapi.hlp

据readme.txt说，用秘密表的形式来进行加密，解起来有些困难。同时要做一个KEYGEN
这次不用BPX MESSAGEBOXA 换一下口味！:)
因为这次Crackme是要输入USER/CODE，一定要经过变化才进行比较，所以在Crackme得到
假的USER/CODE时，把它断下来。
bpx getwindowtexta ------啊哦！！没有用！
bpx getdlgitem ------与DLG操作有都断下来。
结果按下check后，就给断下来了，F11 然后再按F12 返回Crackme的代码空间
用SICE截下如下代码，COME ON BABY！！分析代码哦！！非常的有趣的活哦！:)

:u 401127 L13d
001B:00401127 6A00 PUSH 00
001B:00401129 6A00 PUSH 00
001B:0040112B 6A0E PUSH 0E
001B:0040112D 6A03 PUSH 03
001B:0040112F FF7508 PUSH DWORD PTR [EBP+08]
001B:00401132 E841020000 CALL USER32!SendDlgItemMessageA

SendDlgItemMessage这个API调用了四次，来我们看一看它到底有什么用？

LONG SendDlgItemMessage(

HWND hDlg, // 对话框的句柄
int nIDDlgItem, // 控件的ID号
UINT Msg, // 传送的消息
WPARAM wParam, // 第一个消息参数
LPARAM lParam // 第二个消息参数
);
从程序中我们可以知道当UINT Msg=E 时 是取输入字符的个数
当UINT Msg=D 时 是取输入字符的内容
001B:00401137 A3AF214000 MOV [004021AF],EAX
^^^^^^^^^^^^^^^^^^^^^^^^---->取输入USER的个数
001B:0040113C 83F800 CMP EAX,00
001B:0040113F 0F84D5000000 JZ 0040121A
001B:00401145 83F808 CMP EAX,08
001B:00401148 0F8FCC000000 JG 0040121A
^^^^^^^^^^^^^^^^^^^^^^^----->检查输入个数是否
大于0小于8
001B:0040114E 8BF0 MOV ESI,EAX
^^^^^^^^^^^^^^^^^^^^^^^----->注意这个
001B:00401150 6A00 PUSH 00
001B:00401152 6A00 PUSH 00
001B:00401154 6A0E PUSH 0E
001B:00401156 6A04 PUSH 04
001B:00401158 FF7508 PUSH DWORD PTR [EBP+08]
001B:0040115B E818020000 CALL USER32!SendDlgItemMessageA
001B:00401160 83F800 CMP EAX,00
001B:00401163 0F84B1000000 JZ 0040121A
001B:00401169 3BF0 CMP ESI,EAX
001B:0040116B 0F85A9000000 JNZ 0040121A
^^^^^^^^^^^^^^^^^^^^^^^------>比较user/code
输入的个数是否相等
相等就继续
001B:00401171 6860214000 PUSH 00402160
001B:00401176 6A08 PUSH 08
001B:00401178 6A0D PUSH 0D
001B:0040117A 6A03 PUSH 03
001B:0040117C FF7508 PUSH DWORD PTR [EBP+08]
001B:0040117F E8F4010000 CALL USER32!SendDlgItemMessageA
^^^^^^^^^^^^^^^^^^^^^^^^----->取的USER 放入402160
001B:00401184 6879214000 PUSH 00402179
001B:00401189 6A10 PUSH 10
001B:0040118B 6A0D PUSH 0D
001B:0040118D 6A04 PUSH 04
001B:0040118F FF7508 PUSH DWORD PTR [EBP+08]
001B:00401192 E8E1010000 CALL USER32!SendDlgItemMessageA
^^^^^^^^^^^^^^^^^^^^^^^^----->取的CODE 放入402160
001B:00401197 B9FFFFFFFF MOV ECX,FFFFFFFF
001B:0040119C 41 INC ECX
001B:0040119D 0FBE8160214000 MOVSX EAX,BYTE PTR [ECX+00402160]
001B:004011A4 83F800 CMP EAX,00
001B:004011A7 7432 JZ 004011DB
001B:004011A9 BEFFFFFFFF MOV ESI,FFFFFFFF
001B:004011AE 83F841 CMP EAX,41
^^^^^^^^^^^^^^^^^^^^^^^^----->41=‘A’
001B:004011B1 7C67 JL 0040121A
001B:004011B3 83F87A CMP EAX,7A
^^^^^^^^^^^^^^^^^^^^^^^^----->7A=‘z’
001B:004011B6 7762 JA 0040121A
001B:004011B8 83F85A CMP EAX,5A
^^^^^^^^^^^^^^^^^^^^^^^^----->41=‘Z’
001B:004011BB 7C03 JL 004011C0
^^^^^^^^^^^^^^^^^^^^^^^^----->这几句代码是判断
USER是否输入了字符
001B:004011BD 83E820 SUB EAX,20
^^^^^^^^^^^^^^^^^^^^^^^^----->全部转化为大写
001B:004011C0 46 INC ESI
001B:004011C1 0FBE9617204000 MOVSX EDX,BYTE PTR [ESI+00402017]
^^^^^^^^^^^^^^^^^^^^^^^^----->在402017表相对应的
位置
001B:004011C8 3BC2 CMP EAX,EDX
001B:004011CA 75F4 JNZ 004011C0
^^^^^^^^^^^^^^^^^^^^^^^^----->表中找到后在去另一
40203C表去寻找对应
的值。
001B:004011CC 0FBE863C204000 MOVSX EAX,BYTE PTR [ESI+0040203C]
001B:004011D3 898194214000 MOV [ECX+00402194],EAX
001B:004011D9 EBC1 JMP 0040119C
:d 402017
0023:00402017 41 31 4C 53 4B 32 44 4A-46 34 48 47 50 33 51 57 A1LSK2DJF4HGP3QW
0023:00402027 4F 35 45 49 52 36 55 54-59 5A 38 4D 58 4E 37 43 O5EIR6UTYZ8MXN7C
0023:00402037 42 56 39 00 BV9.

:d 40203c
0023:0040203C 53 55 37 43 53 4A 4B 46-30 39 4E 43 53 44 4F 39 SU7CSJKF09NCSDO9
0023:0040204C 53 44 46 30 39 53 44 52-4C 56 4B 37 38 30 39 53 SDF09SDRLVK7809S
0023:0040205C 34 4E 46 00 4NF.

001B:004011DB FF35AF214000 PUSH DWORD PTR [004021AF]
001B:004011E1 6894214000 PUSH 00402194
001B:004011E6 6879214000 PUSH 00402179
001B:004011EB E854000000 CALL 00401244
^^^^^^^^^^^^^^^^^^^^^^----->比较子程序
转换后的值与CODE相比较

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
比较程序代码：（虽然简单，但是有漏洞哦！:) 呵呵~~~ ）
当USER为一个字母的时候，CODE可以为任意字符 :)
可以试一下 user:a /code:= 是可以的！！
想一想，关键就在这个JCXZ 00401260的判断
不知道是作者故意的，还是BUG，自己去想吧 呵呵~~~~~~
:u 401244 L20
001B:00401244 C8000000 ENTER 0000,00
001B:00401248 B801000000 MOV EAX,00000001
001B:0040124D 8B7D08 MOV EDI,[EBP+08]
001B:00401250 8B750C MOV ESI,[EBP+0C]
001B:00401253 8B4D10 MOV ECX,[EBP+10]
001B:00401256 F3A6 REPZ CMPSB
001B:00401258 67E305 JCXZ 00401260
001B:0040125B B800000000 MOV EAX,00000000
001B:00401260 C9 LEAVE
001B:00401261 C20C00 RET 000C
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

001B:004011F0 83F801 CMP EAX,01
001B:004011F3 0F84DEFEFFFF JZ 004010D7
001B:004011F9 EB1F JMP 0040121A
001B:004011FB 837D1001 CMP DWORD PTR [EBP+10],01
001B:004011FF 0F8422FFFFFF JZ 00401127
001B:00401205 837D1002 CMP DWORD PTR [EBP+10],02
001B:00401209 752F JNZ 0040123A
001B:0040120B E8B4000000 CALL KERNEL32!ExitProcess
001B:00401210 B801000000 MOV EAX,00000001
001B:00401215 E9FFFEFFFF JMP 00401119
001B:0040121A 6800200000 PUSH 00002000
001B:0040121F 6801204000 PUSH 00402001
001B:00401224 68AE204000 PUSH 004020AE
001B:00401229 6A00 PUSH 00
001B:0040122B E836010000 CALL USER32!MessageBoxA
001B:00401230 B800000000 MOV EAX,00000000
001B:00401235 E9DFFEFFFF JMP 00401119
001B:0040123A B800000000 MOV EAX,00000000
001B:0040123F E9D5FEFFFF JMP 00401119

时间：2000.10.19 20:99

标 题:duelist crackme 4 破解 （下） (3千字)
发信人:丁丁虾
时 间:2000-10-21 9:58:21
详细信息:

duelist crackme 4 破解 （下） (希望转载的时候保持完整)

作者 丁丁虾 ddxia/[CCG]
E_mail ddxia@263.net (如果Crackme教学文章中有错，请来信:))
Web http://go18.163.com/~ddxia
目标 duelist crackme 4
目标URL http://go18.163.com/~ddxia/crackme/DueList/Due-cm4.zip
工具 SoftIce4.01 for NT TOPO V1.2 Hiew winapi.hlp

下一步，如果按Crackme的要求是让我们写一个KEYGEN，俺天性就是懒懒懒.......于是
想出个馊主意，把增加代码把这个Crackme本身变成一个KEYGEN，孙悟空七十二变 呵呵~~~~~~~~

步骤如下：
1、先用TOPO软件定位我们加入代码的位置
2、用HIEW来修改程序。

用TOPO V1.2来玩一玩！首先在SCAN选项中选取 EXEC ONLY，是扫描代码段中有没有空
余的地方，增加我们要加入的代码。OPEN文件 due-cm4.exe 发现有285个字节可以利用。找个吉
利的数88，好！利用88个字节进行修改程序，程序定位在内存中位置为4014e3 物理位置为AE3。

我们想达到的目的是当程序判断我们的CODE是错误的时候，让程序本身跳出一个对话框
来告诉大家正确的CODE ：）
首先，我们确定那里是合适加入代码的地方？？很关键哦！我们找啊找，找到一个好
朋友 呵呵~~~~~

比较程序代码：
:u 401244 L20
001B:00401244 C8000000 ENTER 0000,00
001B:00401248 B801000000 MOV EAX,00000001
001B:0040124D 8B7D08 MOV EDI,[EBP+08]
001B:00401250 8B750C MOV ESI,[EBP+0C]
001B:00401253 8B4D10 MOV ECX,[EBP+10]
001B:00401256 F3A6 REPZ CMPSB
001B:00401258 67E305 JCXZ 00401260
001B:0040125B B800000000 MOV EAX,00000000
^^^^^^^^^^^^^^^^^^^^^^^^---->修改这句代码，
jmp 4014e3
而且非常的巧，代码长度一样
001B:00401260 C9 LEAVE
001B:00401261 C20C00 RET 000C

ok let's go goo! 运行HIEW（真是一个酷B的软件），打开due-cm4.exe.
按F4可以改变显示模式，选择DECODE。找到上面的代码
按F3可以修改代码，按F2为切换到ASM模式。输入 JMP 0AE3（注意了这里的跳转地址为
物理地址）
按F9存盘哦！
按F5 可以GOTO 输入AE3！！
在AE3处输入
内存地址 物理地址 代码
4014E3 AE3 mov esi,[ebp][0000C]
4014E6 AE6 push 0
4014E8 AE8 push 4014FF
4014ED AED push esi
4014EE AEE push 0
4014F0 AF0 call 966
4014F5 AF5 mov eax,0
4014FA AFA jmp 860
存盘
按F4切换到HEX模式下，输入
4014FF AFF Correct Code: (Edit by ddxia) 00
^^^-->注意在HEX方式下输入
赶紧去试一试:)
哎哟！差点忘了，再把以下这段消息
Your registration info is invalid... Note that most.....
改为：请输入小于等于8个字符的USER名(不能包括数字)CODE的长度要和USER的一样 00

终于修改完了，好累啊！懒人经常走弯路。

啊！小子，没有完呢？想丢笔去HAPPY 呵呵~~~~~
我们来弄明白这为什么要这样改？？？
内存地址 物理地址 代码
4014E3 AE3 mov esi,[ebp][0000C] ；把正确的CODE放入ESI
4014E6 AE6 push 0
4014E8 AE8 push 4014FF
4014ED AED push esi
4014EE AEE push 0
4014F0 AF0 call 966 ； CALL MESSAGEBOX
4014F5 AF5 mov eax,0 ； 恢复被我们修改的代码
4014FA AFA jmp 860 ； 跳回LEAVE的位置

看看WINAPI.HLP中的MESSAGEBOXa，需要什么参数

int MessageBox(

HWND hWnd, // 窗口句柄 0------>缺省
LPCTSTR lpText, // 内容的地址 ESI---->CODE
LPCTSTR lpCaption, // 标题的地址 4014FF->我们加进的一串字符
UINT uType // 对话框的类型 0------>普通类型，只有一个OK按钮
);

然后我们研究一下为什么是CALL 966 ？？这个嘛！呵呵~~~~ Let's see
40122b call 401366 ---->当按F3 它就会变成call 966知道为什么了吧 :)
401366 jmp messageboxa

再来看一看 jmp 860 860又什么东东？:) 这个卖个关子了 呵呵！！
（提示：按F5 输入860，回车，你就明白了 哈哈~~）

终于写完了，怎么还没有人CALL我的，看来今天晚没有时间去HAPPY了，要整理整理我的
站点了 （遭到投诉了 呵呵~~~~~）
时间：2000.10.19 22:05

标 题:俺基础太差！:)现在补上KEYGEN！有累赘的地方请指教 呵呵~~~~ (970字)
发信人:丁丁虾
时 间:2000-10-22 16:46:57
详细信息:

 #include <iostream.h>
#include <string.h>
#include <stdio.h>
void main(void)
{
int len,i,n;

char user[30],*upstr;
char table1[]="A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9";
char table2[]="SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF";
char code[10];
cout<<"=========================\n";
cout<<"KeyGen for due-cm4.\n";
cout<<"Coded by ddxia[CCG].\n";
cout<<"http://go18.163.com/~ddxia\n";
cout<<"=========================\n\n";

for(;;) {
cout<<"Your name:(Lenth should less than 9 ,only character)\n"
  ;
gets(user);
len=strlen(user);
if ((len>1)&(len<=8)) {
upstr=strupr(user);
for(i=0;i<len;i++,upstr++) {
if (((char)*upstr>='A')&((char)*upstr<='Z')){
for(n=0;n<strlen(table1);n++)
if((char)*upstr==table1[n]){
code[i]=table2[n];
break;
}
}
else goto error;

}
break;
}
error:
cout<<"Your name is invalid!\n\n";

}
cout<<"Your Correct Code:";
code[len]=NULL;
cout<<code<<"\n\n";
}


fireworx.12破解教程

标 题:crackme破解教程(续) (高手莫入) (2千字)
发信人:风飘雪
时 间:2001-3-17 14:24:13
详细信息:
crackme破解教程(续)(高手莫入)
又贴4篇,有一点点难度,破出则功力大涨
------------------(1)-----------------------------
fireworx.12破解教程(编号:80)(a little difficult)无出错提示
http://go3.163.com/~gfcrack/crackme/fireworx.12.zip
输入guodong duba 7654321
bpx hmemcpy
g
点鼠标,被拦
bc*
pmodule
按F10直到下面
0167:004554AC MOV EAX,[EBP-1C] ***
0167:004554AF MOV EDX,[EBP-14] ***
0167:004554B2 CALL 00403B74 ***
0167:004554B7 JNZ 004554DA ***
0167:004554B9 PUSH BYTE +00
0167:004554BB LEA EDX,[EBP-1C]
d edx (edx=5971622)
d eax (eax=7654321)
整理 guodong duba 5971622
-----------------(2)---------------------------
cabeca破解教程(初级)(编号:21)
http://go3.163.com/~gfcrack/crackme/Cabeca.zip
依次输入 guodong 111111 222222
ctrl+n激活trw2000
bpx hmemcpy
go
点Try,被拦
bc *
pmodule
不停按F10,直到下面42d4a5处
0167:0042D4A1 MOV EDX,[EBP-04] *
0167:0042D4A4 POP EAX *
0167:0042D4A5 CALL 004038D0 ****
0167:0042D4AA JNZ 0042D4E5 * =>出错(1)
0167:0042D4AC LEA EDX,[EBP-10]
0167:0042D4AF MOV EAX,[0042F718]
0167:0042D4B4 CALL 00406550
0167:0042D4B9 MOV EAX,[EBP-10]
0167:0042D4BC PUSH EAX
0167:0042D4BD LEA EDX,[EBP-04]
0167:0042D4C0 MOV EAX,[EBX+01EC]
0167:0042D4C6 CALL 00419DE0
0167:0042D4CB MOV EDX,[EBP-04] *
0167:0042D4CE POP EAX *
0167:0042D4CF CALL 004038D0 ****
0167:0042D4D4 JNZ 0042D4E5 *=>出错(2)
0167:0042D4D6 MOV EAX,0042D5E8

42d4a5处 d eax eax=27692
d edx edx=111111
按F9
重新输入guodong 27692 222222
点Try,被拦
按F10,直到下面42d4cf处
d eax eax=15895
d edx edx=222222
总结 guodong 27692 15895
------------------(3)-----------------------------
fireworx.6破解教程(easy)(编号:75)
http://go3.163.com/~gfcrack/crackme/fireworx.6.zip
输入guodong 7654321
ctrl+n激活trw2000
bpx hmemcpy
g
点确定,被拦
bc*
pmodule
不停按F10,直到下面(1)处

0167:004417F8 CALL 004416F8
0167:004417FD MOV EDX,[EBP-08] **
0167:00441800 POP EAX **
0167:00441801 CALL 00403B44 ***(1)
0167:00441806 JNZ 00441822 **
(1) d edx真码(71A1-01CC-4EB2-38C5)
d eax假码(7654321)
整理 guodong 71A1-01CC-4EB2-38C5
--------------------(4)----------------------------
DueList.4破解教程(编号:49)(a little difficult)
http://go3.163.com/~gfcrack/crackme/DueList.4.zip
破解:风飘雪
运行trw2000,输入姓名: guodong 注册码: 7654321
bpx hmemcpy
go 被拦
bc*
pmodule
此时,光条停在401184行
s 401189,ffffff '7654321'
得 402179
这时,向上看,内存窗口看到7654321
下一行 CDSKS0C(倒数第二位是零)
总结: 姓名: guodong 注册码: CDSKS0C

风飘雪
http://duba.126.com
gd1@yeah.net


KEYGENNING4NEWBIES #7

 标 题:KEYGENNING4NEWBIES #7破解过程+注册机 (6千字)
发信人:伪装者[CCG]
时 间:2001-8-21 6:22:43
详细信息:
KEYGENNING4NEWBIES #7破解过程+注册机

前两天TAE!让我看看KEYGENNING4BEWBIES 的#3,那个东西很简单,做了它的注册机
后来看雪给了我一个代理服务器地址,使我能够到国外的一些破解站转转,于是我找
到了这个NUMBER 7

KEYGENNING4NEWBIES有7个KEYGENME(其中第二个有问题),这些KEYGENME的
作用就是让初学者练习写KEYGEN,其中有的是比较简单的(如#1,#3)
这次我要写的KEYGENME #7用了MD5算法(相应的资料可以在http://www.rsa.com找到)
下载地址:http://www.leelouonline.com/users/bofh/k4n/k4n7.zip
使用工具:TRW2000
难度 :5(10为最难，0为最易)
CRACKER ：伪装者[BCG&&CCG]
目的 ：学习破解一周年纪念
目标 : 做出这个的注册机,并且使初学者看完之后能有所收获
过程如下:
运行KEYGENNING4NEWBIES #7(以下简称"#7")
输入用户名,注册码
用户名:cracknow
注册码:121212
启动TRW2000
BPX HMEMCPY
按"OK"键,被拦截
一次PMODULE后来到0167:00401B8A这里
BC *并用F9在这里下新的断点
0167:00401B8A CMP EAX,BYTE +10 -------------->输入的注册码的位数和16比较
0167:00401B8D JNZ 00401BA8 不是16就跳(呵呵~~想起一位大客的口诀
0167:00401B8F PUSH BYTE +64 "一条就死,九筒便和"不过如果这样的话
0167:00401B91 PUSH DWORD 0040603C 就不能叫KEYGEN ME了~~)所以从新输入注
0167:00401B96 PUSH DWORD 03E8 册码,新注册码为:1212121212121212
0167:00401B9B PUSH ESI
0167:00401B9C CALL EDI
0167:00401B9E CALL 00401D90------------------>将输入的注册码转成十六进制
0167:00401BA3 CALL 00401C70------------------>关键的CALL 了,一定要进去!
0167:00401BA8 POP EDI
0167:00401BA9 XOR EAX,EAX
0167:00401BAB POP ESI
0167:00401BAC RET 10

***********************************************
0167:00401CAF LEA EAX,[EBP-78]-------------->进入之后不是到这里,但上面的我觉得
0167:00401CB2 PUSH EAX 都不重要,所以没有U下来
0167:00401CB3 CALL 00401A10 将用户名进行进行标准的MD5转换(不重要
0167:00401CB8 ADD ESP,BYTE +08 不用跟,跟也看不明白~~呵呵~~~)
0167:00401CBB MOV EBX,[EBP-14]-------------->从这里开始你必须要集中精力了，因为如
0167:00401CBE MOV [EBP-04],EBX　　 | 果你要做这个的注册机，那么底下的每一
0167:00401CC1 XOR EBX,[EBP-0C]　　　　　　| 行你都要明白是做什么用的！
0167:00401CC4 MOV [00406CE4],EBX | 我们设用户名经过MD5转换后的结果为S
0167:00401CCA MOV EBX,[EBP-10] |　S[0]~~S[3]分别表示S的4个部分，这些
0167:00401CCD MOV [EBP-18],EBX |　行的作用就是使[ebp-4]=[ebp-14]=s[0]
0167:00401CD0 MOV EBX,[EBP-0C] | [ebp-10]=[ebp-18]=s[1],[ebp-c]=[ebp-
0167:00401CD3 MOV [EBP-1C],EBX | 1c]=s[2],[ebp-8]=[ebp-20]=s[3],另外
0167:00401CD6 MOV EBX,[EBP-08] |　再设一个N,N=S[0]^S[2];
0167:00401CD9 MOV [EBP-20],EBX-------------
0167:00401CDC MOV EBX,[004060A0]----->注册码的前8个和后8个分别放入ebp-80,ebp-7c
0167:00401CE2 MOV [EBP-7C],EBX | 这时你会发现如果注册码用1212121212121212这
0167:00401CE5 MOV EBX,[004060A4] | 样前后相同的数回造成不方便观察，所以退出，将
0167:00401CEB MOV [EBP-80],EBX------->注册码改成1212121234343434 继续
0167:00401CEE MOV ECX,[EBP-7C]------------->从这里开始是关键中的关键!!!!!!
0167:00401CF1 SHL ECX,04 | 最好用笔抄下来慢慢分析
0167:00401CF4 ADD ECX,[EBP-1C] | 这些行将输入的注册码和字符串s做
0167:00401CF7 MOV EDX,[EBP-7C] | 运算，最后的结果分别和0x6779656b
0167:00401CFA ADD EDX,[00406CE4] | 0x656d6e65比较(呵呵~~就是keygenme)
0167:00401D00 XOR ECX,EDX |
0167:00401D02 MOV EAX,[EBP-7C] |
0167:00401D05 SHR EAX,05 |
0167:00401D08 ADD EAX,[EBP-20] |
0167:00401D0B XOR ECX,EAX |
0167:00401D0D MOV EDX,[EBP-80] |
0167:00401D10 SUB EDX,ECX |
0167:00401D12 MOV [EBP-80],EDX | ********注意这里!!!********
0167:00401D15 MOV EAX,[EBP-80] |
0167:00401D18 SHL EAX,04 |
0167:00401D1B ADD EAX,[EBP-04] |
0167:00401D1E MOV ECX,[EBP-80] |
0167:00401D21 ADD ECX,[00406CE4] |
0167:00401D27 XOR EAX,ECX |
0167:00401D29 MOV EDX,[EBP-80] |
0167:00401D2C SHR EDX,05 |
0167:00401D2F ADD EDX,[EBP-18] |
0167:00401D32 XOR EAX,EDX |
0167:00401D34 MOV ECX,[EBP-7C] |
0167:00401D37 SUB ECX,EAX |
0167:00401D39 MOV [EBP-7C],ECX------------->
0167:00401D3C CMP DWORD [EBP-7C],6779656B-->跳就死！
0167:00401D43 JNZ 00401D69 |
0167:00401D45 CMP DWORD [EBP-80],656D6E65 |
0167:00401D4b　JNZ 00401D69----------------->跳就死！
现在开始对那个"关键中的关键"分析
比较的是[ebp-7c]与0x6779656B,[ebp-80]与0x656D6E65,所以如果注册码正确那么这两处在比较的时候
就分别应该为0x6779656B,0x656D6E65，看看上面的这行0167:00401D12 MOV [EBP-80],EDX
将edx放入[ebp-80]中，那么这个EDX就应该等于0x656D6E65，并且这行0167:00401D12以后的[ebp-80]
都要等于0x656D6E65!利用这点我们可以反推出401D34行中的ecx，它就是正确的注册码的第二部分，
然后再利用这个反推出401D0D中的edx，这个就是正确注册码的第一部分
得到结果
用户名：cracknow
注册码：f7afdc2f25d32e18

注册机如下(VC)

#include <stdio.h>
#include <stdlib.h>
#include "md5lib.h"
void main()
{unsigned long s[4],k[2],ea,eb,ec,ed,n,sn1,sn2;
char *text;
int i,j;
int tmp[16],d[2];
printf("*********KEYGENME #7*********\nThis keygen is made by Pretender\nPlease input your name : ");
k[0]=0x656d6e65;k[1]=0x6779656b;
gets(text);
text=MDString(text); //用户名做MD5
for(i=0;i<16;i++) //将结果分为s[0]~s[3]
{d[0]=text[i*2];d[1]=text[i*2+1]; //四个部分
for(j=0;j<2;j++)
{if(d[j]>47&&d[j]<58) d[j]=d[j]-48;
if(d[j]>64&&d[j]<71) d[j]=d[j]-55;
if(d[j]>96&&d[j]<103) d[j]=d[j]-87;
}
tmp[i]=d[0]*16+d[1];
if(i%4==3)
s[i/4]=tmp[i]*65536*256+tmp[i-1]*65536+tmp[i-2]*256+tmp[i-3];
}

n=s[0]^s[2];
//printf("%lx\n",n);　　　　　　　　　　　　　　　　　　　　　　　　//反推的过程
ea=k[0];
ea<<=4;
ea+=s[0];
ec=k[0];
ec+=n;
//printf("%lx",ea);
ea^=ec;
ed=k[0];
ed>>=5;
ed+=s[1];
ea^=ed;
ec=ea+k[1];
sn2=ec;
ec<<=4;
ec+=s[2];
ed=sn2;
ed+=n;
ec^=ed;
ea=sn2;
//printf("%lx",ea);
ea/=32;
ea+=s[3];
ec^=ea;
ed=ec+k[0];
printf("Your Register code is : %08lx%08lx",ed,sn2);　　　　　　//输出结果
printf("\n ***************************** --- --- ---\n *Welcome to WWW.CRACKNOW.COM* / / / --\n ***************************** --- --- --/\n");

}


keygenning4newbies keygenme #3

 标 题:keygenning4newbies keygenme #3 注册算法,虽然说是初学者的crackme,可是 (9千字)
发信人:TAE!
时 间:2001-8-18 23:30:20
详细信息:
keygenning4newbies keygenme #3 注册算法,虽然说是初学者的crackme,可是
也不简单哟~~~

我输入的名字是:TAE!
注册码:78787878
下面是检查注册码个数的地方，和普通的检测方法不一样，瞧瞧：

:004011F5 6BC003 imul eax, 00000003 ;eax是假注册码的个数
:004011F8 C1E002 shl eax, 02 ;右移两位
:004011FB 05CD000000 add eax, 000000CD ;加上0xCD
:00401200 8945FC mov dword ptr [ebp-04], eax ;保存
:00401203 817DFCA5010000 cmp dword ptr [ebp-04], 000001A5;和0x1A5比较
:0040120A 0F85BC000000 jne 004012CC ;不同就跳走了
:00401210 33C0 xor eax, eax ;清零
:00401212 8A4594 mov al, byte ptr [ebp-6C] ;依次取注册码字符
:00401215 84C0 test al, al ;是最后一个字符吗？
:00401217 7413 je 0040122C ;是就跳走了！准备计算
:00401219 8D4D94 lea ecx, dword ptr [ebp-6C] ;指向注册码

根据上面的算法,可以得到这样一个方程式:
(个数*3*2^2)+0xCD=0x1A5 (注："2^2"指的是2的平方!)
既然知道了这个，求“个数”应该就非常简单了吧?用Windows的计算器简单的算一下,
0x1A5-0xCD=0xD8,用0xD8/2^2=0x36,最后用0x36/3=0x12,换算成10进制,那么就是18,
所以,根据上面的算法可以知道注册码必须是18个字符！那么输入787878787878787878

继续跟踪来到下面，这里是检查注册码中是否有小于0的Ascii码的字符。有的话程序就
判断注册码是错的！

:0040121C 3C30 cmp al, 30 ;小于零吗？
:0040121E 0F82C6000000 jb 004012EA ;小于就跳走了！完蛋！
:00401224 8A4101 mov al, byte ptr [ecx+01] ;否则就将下一个字符给al
:00401227 41 inc ecx ;指向下一个字符
:00401228 84C0 test al, al ;是空吗
:0040122A 75F0 jne 0040121C ;没有结束就跳，形成循环

出了上面那个循环,我们便来到了下面:

:0040122C E8CFFDFFFF call 00401000 ;这里面会将eax,ebx,ecx,edx清零
:00401231 8D852CFFFFFF lea eax, dword ptr [ebp+FFFFFF2C];指向用户名
:00401237 50 push eax ;将用户名压入堆栈
:00401238 E843FEFFFF call 00401080 ;里面会对用户名进行操作

给初学者介绍一点经验,如果你发现程序先将用户名压入堆栈,后面紧跟着一个Call,那
你就得非常注意了,除了计算个数,那么很可能就是计算注册码了!所以我们一定得进去
看看到底发生了什么!

:00401080 55 push ebp
:00401081 8BEC mov ebp, esp
:00401083 51 push ecx
:00401084 53 push ebx
:00401085 56 push esi
:00401086 57 push edi

* Possible StringData Ref from Data Obj ->"eheh" //注意这个哟
|
:00401087 6880504000 push 00405080
:0040108C 6A00 push 00000000
:0040108E E8ADFFFFFF call 00401040 ;将上面的字符Ascii反相放入eax
:00401093 83C408 add esp, 00000008
:00401096 8BD8 mov ebx, eax ;再放到ebx中去
:00401098 E863FFFFFF call 00401000

* Possible StringData Ref from Data Obj ->" is a whore." //什么?妓女??
|
:0040109D BF70504000 mov edi, 00405070
:004010A2 83C9FF or ecx, FFFFFFFF
:004010A5 33C0 xor eax, eax
:004010A7 F2 repnz

.......

:004010CC 8B4508 mov eax, dword ptr [ebp+08]
:004010CF 50 push eax ;到了这里,用户名就和"is a whore"给串连了!
:004010D0 56 push esi ;妈的,竟然说咱是妓女!
:004010D1 E86AFFFFFF call 00401040 ;每次取串连后的四个字符
:004010D6 8B8E30504000 mov ecx, dword ptr [esi+00405030] ;将"12"放入ecx
:004010DC 83C408 add esp, 00000008
:004010DF 33CF xor ecx, edi ;异或结果放入ecx
:004010E1 03C1 add eax, ecx ;用四个字符的十六进制加上ecx
:004010E3 8945FC mov dword ptr [ebp-04], eax;保存
:004010E6 C145FC07 rol dword ptr [ebp-04], 07 ;带进位的左移七位
:004010EA 8B45FC mov eax, dword ptr [ebp-04];结果放入eax
:004010ED 83C604 add esi, 00000004
:004010F0 33D8 xor ebx, eax ;异或(ebx是"eheh"的十六进制)
:004010F2 47 inc edi
:004010F3 83FE40 cmp esi, 00000040 ;哇!做六十四次!!
:004010F6 7CD4 jl 004010CC ;跳转形成循环!
:004010F8 5F pop edi
:004010F9 8BC3 mov eax, ebx
:004010FB 5E pop esi
:004010FC 5B pop ebx
:004010FD 8BE5 mov esp, ebp
:004010FF 5D pop ebp
:00401100 C3 ret

上面算出一个结果在eax和ebx中
好啦,终于可以回去了!

:0040123D 8945FC mov dword ptr [ebp-04], eax ;保存
:00401240 E8BBFDFFFF call 00401000 ;这里面会将eax,ebx,ecx,edx清零
:00401245 8D8D2CFFFFFF lea ecx, dword ptr [ebp+FFFFFF2C];"TAE! is a whore"字符串
:0040124B 56 push esi
:0040124C 51 push ecx
:0040124D E8BEFDFFFF call 00401010
:00401252 83C40C add esp, 0000000C
:00401255 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401284(C)
|
:00401257 8B45FC mov eax, dword ptr [ebp-04] ;记得这个吗?就是上面计算出的值啦!
:0040125A 33D2 xor edx, edx ;清零
:0040125C BE1A000000 mov esi, 0000001A ;0x1A放入esi
:00401261 F7F6 div esi ;用上面的值除以0x1A
:00401263 8A941510FFFFFF mov dl, byte ptr [ebp+edx-000000F0] ;查一张由26个大写字母组成的表
:0040126A 88540DC8 mov byte ptr [ebp+ecx-38], dl ;保存
:0040126E 8B45FC mov eax, dword ptr [ebp-04] ;取值放入eax
:00401271 C1E003 shl eax, 03 ;将它乘以8
:00401274 BA45230100 mov edx, 00012345 ;0x12345放入edx
:00401279 F7E8 imul eax ;乘以eax
:0040127B 03C2 add eax, edx ;和0x12345相加
:0040127D 8945FC mov dword ptr [ebp-04], eax ;又保存喽!
:00401280 41 inc ecx ;计数器
:00401281 83F912 cmp ecx, 00000012 ;结束了吗?
:00401284 72D1 jb 00401257 ;没有就跳转
:00401286 E875FDFFFF call 00401000
:0040128B 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012A2(C)
|
:0040128D 8A4C0594 mov cl, byte ptr [ebp+eax-6C] ;输入的注册码
:00401291 8A5405C8 mov dl, byte ptr [ebp+eax-38] ;查表得到的字母
:00401295 80E930 sub cl, 30 ;Ascii减0x30
:00401298 32D1 xor dl, cl ;和查表后的字母异或
:0040129A 885405C8 mov byte ptr [ebp+eax-38], dl ;保存
:0040129E 40 inc eax ;计数器
:0040129F 83F812 cmp eax, 00000012 ;结束了?
:004012A2 72E9 jb 0040128D ;未结束就跳!
:004012A4 E857FDFFFF call 00401000
:004012A9 8D55C8 lea edx, dword ptr [ebp-38]
:004012AC 52 push edx
:004012AD E85EFEFFFF call 00401110 ;这里面是最后的运算!
:004012B2 E849FDFFFF call 00401000
:004012B7 8D45C8 lea eax, dword ptr [ebp-38]

进入call 00401110

:00401110 8B4C2404 mov ecx, dword ptr [esp+04]
:00401114 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401122(C)
|
:00401116 8A1408 mov dl, byte ptr [eax+ecx] ;上面结果的一个数
:00401119 32D0 xor dl,al ;和位数异或(从零开始)
:0040111B 881408 mov byte ptr [eax+ecx], dl ;保存!
:0040111E 40 inc eax
:0040111F 83F812 cmp eax, 00000012 ;又是这么多的循环
:00401122 72F2 jb 00401116 ;循环
:00401124 C3 ret

回去喽!
下面就是最后的比较了!呼,好累!

* Possible StringData Ref from Data Obj ->"KEYGENNING4NEWBIES"
|
:004012BA 6814514000 push 00405114 ;这个是"KEYGENNING4NEWBIES"
:004012BF 50 push eax ;这个是最后运算出的结果
:004012C0 E86BFEFFFF call 00401130 ;比较是否相同
:004012C5 83C40C add esp, 0000000C
:004012C8 85C0 test eax, eax
:004012CA 753C jne 00401308

所以咱们的注册码经过运算后一定要和"KEYGENNING4NEWBIES"这个字符串相同,
好了,算法已经清楚了,谁来写个注册机?伪装者大侠?这个够级别吧?试试呀!也好让咱这些
向往搞注册机的朋友学习学习;)

标 题:帖这个的注册机，嵌入了一点汇编（没有办法的）不知道这个在TC下能否成功，在VC下这个是可以的 (1千字)
发信人:伪装者[CCG]
时 间:2001-8-19 11:56:39
详细信息:

 #include "stdio.h"
#include "string.h"
#define ROTATE(a,n)  (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
void main()
{FILE *p=fopen("sn.txt","wt");
unsigned char string[80];
int i,d,c;
int tb1[16]={0x12,0x5c,0x34,0x22,0xab,0x9d,0x54,0x00,0xdd,0x84,0xae,0x66,0x31,0x78,0x73,0xcf};
unsigned tb2[18];
char key[18]="KEYGENNING4NEWBIES";
unsigned long f=0,e=0x68656865;
printf("*********KEYGENME #3*********\nThis keygen is made by Pretender\nPlease
  input your name : ");
gets(string);
fputs("Name : ",p);
fputs(string,p);
fputc('\015',p);
fputc('\012',p);
fputs("SN  : ",p);
printf("Your Register code is  : ");
strcat(string," is a whore.");
d=strlen(string);
if(d%4!=0)
{for(i=d;i<d+4-d%4;i++)
string[i]='\0';
d=i;}
for(i=0;i<16;i++)
{if(i*4<d)
f=string[i*4]+string[i*4+1]*256+string[i*4+2]*65536+string[i*4+3]*256*65536;
else f=0;
c=tb1[i]^i;
f+=c;
f=ROTATE(f,7);
e^=f;}
for(i=0;i<18;i++)
{
tb2[i]=e%26;
tb2[i]+=65;
__asm {mov eax,e
shl eax,3
mov edx,0x12345
imul eax
add eax,edx
mov e,eax
}
}
for(i=0;i<18;i++)
{c=key[i];
tb2[i]^=i;
c^=tb2[i];
c+=0x30;
printf("%c",c);
fputc(c,p);
}
printf("\nYou can get the code in sn.txt");
printf("\n *****************************      ---
  ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /
      /      / --\n *****************************
      ---    ---    --/\n");
}


login

标 题:某一login.zip软件注册 (12千字)
发信人:CoolBob[CCG]
时 间:2001-4-20 18:37:26
详细信息:

输入14个数字后,下bpx hmemcpy,f12 12次,来到这里
:004494C0 8B45E4 mov eax, dword ptr [ebp-1C] <--bpm eax r
:004494C3 8D55E8 lea edx, dword ptr [ebp-18]
:004494C6 E81DE2FBFF call 004076E8
按f10继续,回在这里停下
:00407705 807C1FFF20 cmp byte ptr [edi+ebx-01], 20 <--是否空格
:0040770A 76F4 jbe 00407700
继续走在这个地方移动数据到内存的另一个地方
:004027BF F3 repz
:004027C0 A5 movsd
:004027C1 89C1 mov ecx, eax
:004027C3 83E103 and ecx, 00000003
:004027C6 F3 repz
:004027C7 A4 movsb
:004027C8 5F pop edi
:004027C9 5E pop esi
:004027CA C3 ret

:00449528 FF75D8 push [ebp-28]
:0044952B 8B45FC mov eax, dword ptr [ebp-04]
:0044952E 0554030000 add eax, 00000354
:00449533 BA04000000 mov edx, 00000004
:00449538 E8DFA5FBFF call 00403B1C <---f8 跟进

:00445CA9 885C38FF mov byte ptr [eax+edi-01], bl
:00445CAD 8B45F0 mov eax, dword ptr [ebp-10]
:00445CB0 8A4438FF mov al, byte ptr [eax+edi-01]
:00445CB4 3C30 cmp al, 30 //是否在0~9之间
:00445CB6 7207 jb 00445CBF
:00445CB8 8B55F0 mov edx, dword ptr [ebp-10]
:00445CBB 3C39 cmp al, 39
:00445CBD 760D jbe 00445CCC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445CB6(C)
|
:00445CBF 8B45F8 mov eax, dword ptr [ebp-08]
:00445CC2 E819DBFBFF call 004037E0
:00445CC7 E9ED030000 jmp 004460B9

----------------------
:00445D33 80FB30 cmp bl, 30
:00445D36 0F85B8010000 jne 00445EF4
:00445D3C 8D45F0 lea eax, dword ptr [ebp-10]
:00445D3F 8B55F4 mov edx, dword ptr [ebp-0C]
:00445D42 E831DBFBFF call 00403878
:00445D47 8D45F0 lea eax, dword ptr [ebp-10]
:00445D4A E8DDDEFBFF call 00403C2C
:00445D4F 8B55F4 mov edx, dword ptr [ebp-0C]
:00445D52 8A12 mov dl, byte ptr [edx] //[edx]存放Regcode[1..12]
:00445D54 885007 mov byte ptr [eax+07], dl //eax[7]=regcode[1]
:00445D57 8D45F0 lea eax, dword ptr [ebp-10]
:00445D5A E8CDDEFBFF call 00403C2C
:00445D5F 8B55F4 mov edx, dword ptr [ebp-0C]
:00445D62 8A5201 mov dl, byte ptr [edx+01]
:00445D65 88500B mov byte ptr [eax+0B], dl //eax[11]=regcode[2]
:00445D68 8D45F0 lea eax, dword ptr [ebp-10]
:00445D6B E8BCDEFBFF call 00403C2C
:00445D70 8B55F4 mov edx, dword ptr [ebp-0C]
:00445D73 8A5202 mov dl, byte ptr [edx+02]
:00445D76 8810 mov byte ptr [eax], dl //eax[1]=regcode[3]
:00445D78 8D45F0 lea eax, dword ptr [ebp-10]
:00445D7B E8ACDEFBFF call 00403C2C
:00445D80 8B55F4 mov edx, dword ptr [ebp-0C]
:00445D83 8A5203 mov dl, byte ptr [edx+03]
:00445D86 88500A mov byte ptr [eax+0A], dl //eax[10]=regcode[4]
:00445D89 8D45F0 lea eax, dword ptr [ebp-10]
:00445D8C E89BDEFBFF call 00403C2C
:00445D91 8B55F4 mov edx, dword ptr [ebp-0C]
:00445D94 8A5204 mov dl, byte ptr [edx+04]
:00445D97 885009 mov byte ptr [eax+09], dl //eax[9]=regcode[5]
:00445D9A 8D45F0 lea eax, dword ptr [ebp-10]
:00445D9D E88ADEFBFF call 00403C2C
:00445DA2 8B55F4 mov edx, dword ptr [ebp-0C]
:00445DA5 8A5205 mov dl, byte ptr [edx+05]
:00445DA8 885003 mov byte ptr [eax+03], dl //eax[4]=regcode[6]
:00445DAB 8D45F0 lea eax, dword ptr [ebp-10]
:00445DAE E879DEFBFF call 00403C2C
:00445DB3 8B55F4 mov edx, dword ptr [ebp-0C]
:00445DB6 8A5206 mov dl, byte ptr [edx+06]
:00445DB9 885005 mov byte ptr [eax+05], dl //eax[5]=regcode[7]
:00445DBC 8D45F0 lea eax, dword ptr [ebp-10]
:00445DBF E868DEFBFF call 00403C2C
:00445DC4 8B55F4 mov edx, dword ptr [ebp-0C]
:00445DC7 8A5207 mov dl, byte ptr [edx+07]
:00445DCA 885002 mov byte ptr [eax+02], dl //eax[2]=regcode[8]
:00445DCD 8D45F0 lea eax, dword ptr [ebp-10]
:00445DD0 E857DEFBFF call 00403C2C
:00445DD5 8B55F4 mov edx, dword ptr [ebp-0C]
:00445DD8 8A5208 mov dl, byte ptr [edx+08]
:00445DDB 885004 mov byte ptr [eax+04], dl //eax[4]=regcode[9]
:00445DDE 8D45F0 lea eax, dword ptr [ebp-10]
:00445DE1 E846DEFBFF call 00403C2C
:00445DE6 8B55F4 mov edx, dword ptr [ebp-0C]
:00445DE9 8A5209 mov dl, byte ptr [edx+09]
:00445DEC 885001 mov byte ptr [eax+01], dl //eax[1]=regcode[10]
:00445DEF 8D45F0 lea eax, dword ptr [ebp-10]
:00445DF2 E835DEFBFF call 00403C2C
:00445DF7 8B55F4 mov edx, dword ptr [ebp-0C]
:00445DFA 8A520A mov dl, byte ptr [edx+0A]
:00445DFD 885006 mov byte ptr [eax+06], dl //eax[6]=regcode[11]
:00445E00 8D45F0 lea eax, dword ptr [ebp-10]
:00445E03 E824DEFBFF call 00403C2C
:00445E08 8B55F4 mov edx, dword ptr [ebp-0C]
:00445E0B 8A520B mov dl, byte ptr [edx+0B]
:00445E0E 885008 mov byte ptr [eax+08], dl //eax[8]=regcode[12]
:00445E11 8D45F4 lea eax, dword ptr [ebp-0C]
:00445E14 8B55F0 mov edx, dword ptr [ebp-10]
:00445E17 E85CDAFBFF call 00403878
:00445E1C 8B75E8 mov esi, dword ptr [ebp-18]
:00445E1F 85F6 test esi, esi
:00445E21 7E7D jle 00445EA0
:00445E23 BF01000000 mov edi, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445E9E(C)
|
:00445E28 8B45F4 mov eax, dword ptr [ebp-0C]
:00445E2B 0FB64438FF movzx eax, byte ptr [eax+edi-01]
:00445E30 BB39000000 mov ebx, 00000039
:00445E35 2BD8 sub ebx, eax
:00445E37 83C330 add ebx, 00000030
:00445E3A 80FB37 cmp bl, 37
:00445E3D 7722 ja 00445E61
:00445E3F 33C0 xor eax, eax //计算第2步
:00445E41 8AC3 mov al, bl //详细请看
:00445E43 8BD7 mov edx, edi //下面的
:00445E45 D1FA sar edx, 1 //注释
:00445E47 7903 jns 00445E4C //
:00445E49 83D200 adc edx, 00000000 //

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445E47(C)
|
:00445E4C 42 inc edx //
:00445E4D 33C2 xor eax, edx //
:00445E4F 8945EC mov dword ptr [ebp-14], eax
:00445E52 8D45F4 lea eax, dword ptr [ebp-0C]
:00445E55 E8D2DDFBFF call 00403C2C
:00445E5A 8B55EC mov edx, dword ptr [ebp-14]
:00445E5D 885438FF mov byte ptr [eax+edi-01], dl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445E3D(C)
|
:00445E61 80FB38 cmp bl, 38
:00445E64 750D jne 00445E73
:00445E66 8D45F4 lea eax, dword ptr [ebp-0C]
:00445E69 E8BEDDFBFF call 00403C2C
:00445E6E C64438FF39 mov [eax+edi-01], 39

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445E64(C)
|
:00445E73 80FB39 cmp bl, 39
:00445E76 750D jne 00445E85
:00445E78 8D45F4 lea eax, dword ptr [ebp-0C]
:00445E7B E8ACDDFBFF call 00403C2C
:00445E80 C64438FF38 mov [eax+edi-01], 38

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445E76(C)
|
:00445E85 8B45F4 mov eax, dword ptr [ebp-0C]
:00445E88 807C38FF27 cmp byte ptr [eax+edi-01], 27
:00445E8D 750D jne 00445E9C
:00445E8F 8D45F4 lea eax, dword ptr [ebp-0C]
:00445E92 E895DDFBFF call 00403C2C
:00445E97 C64438FF24 mov [eax+edi-01], 24

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445E8D(C)
|
:00445E9C 47 inc edi
:00445E9D 4E dec esi
:00445E9E 7588 jne 00445E28

:00449595 8B45FC mov eax, dword ptr [ebp-04]
:00449598 8B804C030000 mov eax, dword ptr [eax+0000034C]
:0044959E 8B55FC mov edx, dword ptr [ebp-04]
:004495A1 8B9250030000 mov edx, dword ptr [edx+00000350]
:004495A7 E8C0A5FBFF call 00403B6C
:004495AC 0F85B3040000 jne 00449A65 //if jump badguy

:004495FD E86AA5FBFF call 00403B6C
:00449602 0F855C010000 jne 00449764 //if jump invalid register

* Possible StringData Ref from Code Obj ->"正式注册成功"
|
:0044973B B8589C4400 mov eax, 00449C58
:00449740 E8EBAEFFFF call 00444630
:00449745 33C0 xor eax, eax
:00449747 5A pop edx
:00449748 59 pop ecx
:00449749 59 pop ecx

* Possible StringData Ref from Code Obj ->"非法注册成功"
|
:004499DE B8949C4400 mov eax, 00449C94
:004499E3 E848ACFFFF call 00444630
:004499E8 33C0 xor eax, eax
:004499EA 5A pop edx
:004499EB 59 pop ecx
:004499EC 59 pop ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004495AC(C)
|

* Possible StringData Ref from Code Obj ->"注册失败,请输入正确的注册号"
|
:00449A65 B8C49C4400 mov eax, 00449CC4
:00449A6A E8C1ABFFFF call 00444630

上面的代码无非就是对我们输入的Regcode进行一系列的变换
由GetText()取得,LstrCat()连结,Trim()去掉首位0后,剩下来的13位数中,取12位用来变换,过程如下
比如我输入的Regcode=02-6448-2915-8742
|| |||| |||| |||
1、 || |||| |||| |||
不要 <----|| |||| |||| |||
存到第 8位上<----| |||| |||| |||
12 <-------|||| |||| |||
1 <--------||| |||| |||
11 <---------|| |||| |||
10 <----------| |||| |||
4 <------------|||| |||
6 <-------------||| |||
3 <--------------|| |||
5 <---------------| |||
2 <-----------------|||
7 <------------------||
9 <-------------------|
结果变成4812-5972-4846

2、把上面得到的12位数按如下规律再一次转换
先取第一个数，这里是4，和0、1比较，是1变成9，是0变成8，都不是的话
变成这样：0x39-0x34^(i/2)+1 <------i是4在上面字符串中的位置
……………………
结果变成4394-7462-0734
3、倒序。将上面得到的字符倒序排列变成4370-2647-4934
4、在首位加一个0。变成0-4370-2647-4934
5、和你的机器号比较，嘿嘿，不一样，就没戏了。一样的话继续下一步
6、取你的Regcod的2个数和最后一个数比较，如果相等则正式注册成功。否则会出现非法注册成功。

注册机如下
*************************************start here*************************************************
#include <stdio.h>
main()
{char a[13],regcode[14]; int i=1; char t,temp;
clrscr();
printf("Keymaker by CoolBob/China cracker group\n\n");
printf("Machine code: ");
scanf("%s",a);
for(i=12;i>6;i--)
{t=a[i];
a[i]=a[12-i+1];
a[12-i+1]=t;
};
for(i=1;i<13;i++){if(a[i]==0x39) a[i]=0x31;
else if(a[i]==0x38) a[i]=0x30;
else
{temp=(a[i])^((i/2)+1);
a[i]=0x39+0x30-temp;}};
regcode[0]='0';
regcode[1]=a[8];
regcode[2]=a[12];
regcode[3]=a[1];
regcode[4]=a[11];
regcode[5]=a[10];
regcode[6]=a[4];
regcode[7]=a[6];
regcode[8]=a[3];
regcode[9]=a[5];
regcode[10]=a[2];
regcode[11]=a[7];
regcode[12]=a[9];
regcode[13]=regcode[1];
regcode[14]=0;
printf("Regcode is: %s\n\n\n",regcode);
printf("Press any key to exit!\n");
getch();
}
************************************************End here****************************************

written by CoolBob[CCG]/2001.4.20


pusi Crackme 1.0

 标 题:周末灌水篇 (11千字)
发信人:丁丁虾
时 间:2000-10-28 12:19:2
详细信息:
pusi Crackme 1.0 破解 (希望转载的时候保持完整)

【作者】 丁丁虾 ddxia/[CCG]
【E_mail】 ddxia@263.net (如果Crackme教学文章中有错，请来信:))
【Web】 http://go18.163.com/~ddxia
【目标】 pusi Crackme 1.0
【目标URL】 http://go18.163.com/~ddxia/crackme/pusicrackme1.0.zip
【工具】 W32dasm

很久都没有背诗啦！觉的有点对不起泱泱大国五千的文化，也没有这么可怕啦！只是
感到有些惭愧.......呵呵~~~~~~......人总是很矛盾的.......

【年代】：北宋
【作者】：晏几道
【作品】：醉落魄

满街斜月，垂鞭自唱阳关彻。
断尽柔肠思归切，
都为人人，不许多时别。

南桥昨夜风吹雪，
短长亭下征尘歇。
归时定有梅堪折。
欲把离愁，细捻花枝说

这个Crackme界面很简单，就是要求填写一个CODE，然后就检查它是否正确。所以破解
的工具，就是选择W32DASM就可以了。

1、分析代码
:00401099 6A0A push 0000000A
:0040109B 6844304000 push 00403044 ----》存放我们输入CODE的地址
:004010A0 68B80B0000 push 00000BB8
:004010A5 FF3554304000 push dword ptr [00403054]
* Reference To: USER32.GetDlgItemTextA, Ord:0102h
|
:004010AB E8D2000000 Call 00401182 ----》调用 GetDlgItemTextA
:004010B0 E814000000 call 004010C9 ----》进行比较判断

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401097(C)
|
:004010B5 EB09 jmp 004010C0
:004010C9 56 push esi
:004010CA 57 push edi
:004010CB 51 push ecx
:004010CC 33F6 xor esi, esi
:004010CE 33FF xor edi, edi
:004010D0 B908000000 mov ecx, 00000008 ----》只对前8个CODE进行操作
:004010D5 BE44304000 mov esi, 00403044 ----》存放fake code地址
:004010DA 803632 xor byte ptr [esi], 32
:004010DD 46 inc esi
:004010DE E2FA loop 004010DA ----》循环8次 CODE XOR 32
:004010E0 BE44304000 mov esi, 00403044 ----》XOR后的结果地址
:004010E5 B904000000 mov ecx, 00000004 ----》循环4次
:004010EA 8A06 mov al, byte ptr [esi] --》取第1个CODE
:004010EC 8A5E01 mov bl, byte ptr [esi+01]-》取第2个CODE
:004010EF 32C3 xor al, bl ----》进行XOR
:004010F1 88874C304000 mov byte ptr [edi+0040304C], al -》将结果存放到0040304C
:004010F7 83C602 add esi, 00000002 ----》跳到第3个CODE
:004010FA 47 inc edi ----》结果指针加1
:004010FB E2ED loop 004010EA
:004010FD BE4C304000 mov esi, 0040304C ----》上面计算出4位结果
:00401102 8A06 mov al, byte ptr [esi] --》取出第1位
:00401104 8A5E01 mov bl, byte ptr [esi+01]-》取出第2位
:00401107 32C3 xor al, bl ----》第1位XOR第2位
:00401109 8A5E02 mov bl, byte ptr [esi+02]-》取出第3位
:0040110C 8A4E03 mov cl, byte ptr [esi+03]-》取出第4位
:0040110F 32D9 xor bl, cl ----》第3位XOR第4位
:00401111 32C3 xor al, bl ----》1^2结果XOR3^4结果
:00401113 B908000000 mov ecx, 00000008 ----》循环8次
:00401118 BE44304000 mov esi, 00403044 ----》经过XOR32的结果
:0040111D 3006 xor byte ptr [esi], al --》(经过XOR32的结果)XOR(1^2结果XOR3^4结果)
:0040111F 46 inc esi
:00401120 E2FB loop 0040111D
:00401122 B908000000 mov ecx, 00000008
:00401127 BE44304000 mov esi, 00403044 ----》经过变化的结果地址

* Possible StringData Ref from Data Obj ->"qYyBELGood Work Cracker"
|
:0040112C BF08304000 mov edi, 00403008 ----》进行比较的字节地址
[403008] 71 18 59 1B 79 42 45 4C

:00401131 8A06 mov al, byte ptr [esi]
:00401133 3A07 cmp al, byte ptr [edi]
:00401135 751D jne 00401154 ----》如果不相等就GAME OVER
:00401137 46 inc esi
:00401138 47 inc edi
:00401139 E2F6 loop 00401131
:0040113B 6A40 push 00000040 ----》成功的对话框

* Possible StringData Ref from Data Obj ->"Crackme 1.0"
|
:0040113D 6835304000 push 00403035
:00401142 6810304000 push 00403010
:00401147 FF3554304000 push dword ptr [00403054]

* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:0040114D E83C000000 Call 0040118E
:00401152 EB17 jmp 0040116B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401135(C)
|
:00401154 6A30 push 00000030 -----》失败的对话框

* Possible StringData Ref from Data Obj ->"Crackme 1.0"
|
:00401156 6835304000 push 00403035

* Possible StringData Ref from Data Obj ->"Bad Serial, Sorry!"
|
:0040115B 6822304000 push 00403022
:00401160 FF3554304000 push dword ptr [00403054]

* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:00401166 E823000000 Call 0040118E

2、AcTion
Crack的第一大大招，乾坤大挪移，
:00401133 3A07 cmp al, byte ptr [edi]
:00401135 751D jne 00401154 ----》如果不相等就GAME OVER
^^^^^^^^^^^^---》修改为nop nop (9090)

太简单了！！！收工 （众人倒.........口吐白沫.........:)
呵呵~~~~~~~~

想一想我们如何通过编程，计算出正确的结果。开始的时候，我也懵了，不知道
如何下手，虽然上面的分析头头是道，但编写KeyGen是第二次哦！！（若有什么不正确的地
方，请告诉我:）
左看右看，上想下思，终于找到一个突破口。呵呵~~~~~ 在哪里呢？？？？

:00401113 B908000000 mov ecx, 00000008 ----》循环8次
:00401118 BE44304000 mov esi, 00403044 ----》经过XOR32的结果
:0040111D 3006 xor byte ptr [esi], al --》(经过XOR32的结果)XOR(1^2结果XOR3^4结果)
:0040111F 46 inc esi
:00401120 E2FB loop 0040111D
xor byte ptr [esi], al----》就是这句啦！al 的值，如果按上面，用数学公式
逆推的化，我肯定要晕，想想当年数学能过就OK了 呵呵~~~~~ 想不到，如今确要用上。读书
的时候，什么都多学一点，今天看来并不坏 :)
COME ON！我们可以采用穷尽法，al （0x00--> 0xFF)也就是255次，不多不多:)
于是第一次就写出下面这个程序，目的就是让最后要比较的结果XOR al XOR 0x32，循环255
次，并把结果显示出来，筛一筛，看一看，合法的字符有没有 :)
#include <stdio.h>

unsigned char Table[8] = { 0x71,0x18,0x59,0x1B,0x79,0x42,0x45,0x4C};
unsigned char Code[8];

void main(void)
{
unsigned char i=0x00;
int n;
do
{
for(n=0;n<8;n++)
Code[n]=Table[n]^i^0x32 ;
printf("Code output: %s\n",Code);
i++;
} while(i < 0xFF);
}

呵呵~~~~ 看了几分钟结果，有点运气，找到了正确的CODE：Z3r0Ring ---》因为它
太眼熟了（外国的一位有名的CRACK大师） ：）

收工！！（被众人群殴.........鼻青脸肿.....成了虾总......晕倒.......)

既然我们能计算出正确的CODE，何不按照程序的计算方法，编程成程序，再按分析
代码的情况，计算一番。于是就有了以下的程序 呵呵~~~~~

#include <stdio.h>

unsigned char Table[8] = { 0x71,0x18,0x59,0x1B,0x79,0x42,0x45,0x4C};
unsigned char Code[12];
unsigned char Temp[9];
void main(void)
{
unsigned char i=0x00;
unsigned char x;
int n;
Temp[8]=NULL;
do
{
for(n=0;n<8;n++) {
Code[n]=Table[n]^i^0x32 ; //穷尽法计算出CODE
Temp[n]=Code[n]; //临时存放
}
//+++++++++++++++++++++++++++++++++++++++++++++++++
//:004010D0 mov ecx, 00000008 ----》只对前8个CODE进行操作
//:004010D5 mov esi, 00403044 ----》存放fake code地址
//:004010DA xor byte ptr [esi], 32
//:004010DD inc esi
//:004010DE loop 004010DA ----》循环8次 CODE XOR 32
//+++++++++++++++++++++++++++++++++++++++++++++++++
for(n=0;n<8;n++)
Code[n]=Code[n]^0x32;

//+++++++++++++++++++++++++++++++++++++++++++++++++
//:004010EA mov al, byte ptr [esi] --》取第1个CODE
//:004010EC mov bl, byte ptr [esi+01]-》取第2个CODE
//:004010EF xor al, bl ----》进行XOR
//:004010F1 mov byte ptr [edi+0040304C], al -》将结果存放到0040304C
//:004010F7 add esi, 00000002 ----》跳到第3个CODE
//:004010FA inc edi ----》结果指针加1
//:004010FB loop 004010EA
//+++++++++++++++++++++++++++++++++++++++++++++++++
for(n=0;n<4;n++)
Code[8+n]=Code[n*2]^Code[n*2+1];

//+++++++++++++++++++++++++++++++++++++++++++++++++
//:004010FD mov esi, 0040304C ----》上面计算出4位结果
//:00401102 mov al, byte ptr [esi] --》取出第1位
//:00401104 mov bl, byte ptr [esi+01]-》取出第2位
//:00401107 xor al, bl ----》第1位XOR第2位
//:00401109 mov bl, byte ptr [esi+02]-》取出第3位
//:0040110C mov cl, byte ptr [esi+03]-》取出第4位
//:0040110F xor bl, cl ----》第3位XOR第4位
//:00401111 xor al, bl ----》1^2结果XOR3^4结果
//+++++++++++++++++++++++++++++++++++++++++++++++++
x=(Code[8]^Code[9])^(Code[10]^Code[11]);

Code[8]=NULL;

//+++++++++++++++++++++++++++++++++++++++++++++++++
//:00401113 mov ecx, 00000008 ----》循环8次
//:00401118 mov esi, 00403044 ----》经过XOR32的结果
//:0040111D xor byte ptr [esi], al --》(经过XOR32的结果)XOR(1^2结果XOR3^4结果)
//:0040111F inc esi
//:00401120 loop 0040111D
//:00401122 mov ecx, 00000008
//:00401127 mov esi, 00403044 ----》经过变化的结果地址
//
//* Possible StringData Ref from Data Obj ->"qYyBELGood Work Cracker"
// |
//:0040112C mov edi, 00403008 ----》进行比较的字节地址
// [403008] 71 18 59 1B 79 42 45 4C
//
//:00401131 mov al, byte ptr [esi]
//:00401133 cmp al, byte ptr [edi]
//:00401135 jne 00401154 ----》如果不相等就GAME OVER
//:00401137 inc esi
//:00401138 inc edi
//:00401139 loop 00401131
//+++++++++++++++++++++++++++++++++++++++++++++++++
for(n=0;n<8;n++){
if (Table[n] != (Code[n]^x)) break;
if (n==7) printf("Code output: %s\n",Temp);
}
i++;
} while(i < 0xFF);
}

3总结：穷尽法在写注册机中可是经常用的。关键是如何寻找到穷尽什么东东，然后
再反过来证明，直至得到最后的结果。

收工可以啦吧 ！！！ 呵呵~~~~~~ （啊没有时间啦！我要出去玩了:))

时间：2000.10.27 23:29


rackMe v.a01

标 题:Crackme rackMe v.a01 简易 注册号(5千字)
发信人:peterchen
时 间:2001-3-14 22:46:32
详细信息:
rackMe v.a01 简易 注册号
http://wocy.top263.net/crackme/crackmea01.zip
这个crackme很早就有人cracks可是一时之间又找不出他的破解文章:
好自己试一试:
我在win2000也很早就暴力成功!
String Resource ID=00101: "s?CrakeMe(&A)..."
"Registed. Good job."
"Unregister"

* Reference To: MSVCRT._mbscmp, Ord:0159h
|
:0040165B FF15B0214000 Call dword ptr [004021B0]
:00401661 83C408 add esp, 00000008
:00401664 85C0 test eax, eax
:00401666 750D jne 00401675//->je(暴力ok!)

* Possible StringData Ref from Data Obj ->"Registed. Good job."
|
:00401668 682C304000 push 0040302C
:0040166D 8D4E68 lea ecx, dword ptr [esi+68]

* Reference To: MFC42.Ordinal:035C, Ord:035Ch
|
:00401670 E853020000 Call 004018C8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401666(C)
|
:00401675 6A00 push 00000000
:00401677 8BCE mov ecx, esi

* Reference To: MFC42.Ordinal:18BE, Ord:18BEh
|
:00401679 E85C020000 Call 004018DA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040163D(C)
|
:0040167E 8D4C2404 lea ecx, dword ptr [esp+04]
:00401682 C7442410FFFFFFFF mov [esp+10], FFFFFFFF

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:0040168A E861010000 Call 004017F0
:0040168F 8B4C2408 mov ecx, dword ptr [esp+08]
:00401693 5E pop esi
:00401694 64890D00000000 mov dword ptr fs:[00000000], ecx
:0040169B 83C410 add esp, 00000010
:0040169E C3 ret

:0040169F 90 nop
:004016A0 56 push esi
:004016A1 8BF1 mov esi, ecx
:004016A3 680C314000 push 0040310C
:004016A8 8D4E60 lea ecx, dword ptr [esi+60]

* Reference To: MFC42.Ordinal:035C, Ord:035Ch
|
:004016AB E818020000 Call 004018C8
:004016B0 680C314000 push 0040310C
:004016B5 8D4E64 lea ecx, dword ptr [esi+64]

* Reference To: MFC42.Ordinal:035C, Ord:035Ch
|
:004016B8 E80B020000 Call 004018C8

* Possible StringData Ref from Data Obj ->"Unregister"
|
:004016BD 6820304000 push 00403020
:004016C2 8D4E68 lea ecx, dword ptr [esi+68]

从汇编可知它是先跳过正确窗再运行错误窗,所以我很早就想破解它应该从中正确窗
入手比较好!
:0040165B FF15B0214000 Call dword ptr [004021B0]
看过几篇教程在关键call也能找到注册码,我想注册码可能放在这儿?
进入win98后用trw2000
bpx 40165b
d eax or d ecx 果然注册码出来了!(不会吧？一分钟都不用?)
好试一下用trw2000直接破解:
输入name和code
bpx hmemcpy
x
bd *
0167:00401342 CALL `MFC42!ord_00000942`
拦截到:
0167:00401347 LEA ECX,[ESI+64] //->d ecx=name
ds:[63fd65]=006542f0
d 006542f0=code
0167:0040134A PUSH ECX
0167:0040134B PUSH DWORD 03E9
0167:00401350 PUSH EDI
0167:00401351 CALL `MFC42!ord_00000942`
0167:00401356 ADD ESI,BYTE +68
0167:00401359 PUSH ESI
0167:0040135A PUSH DWORD 03EB
0167:0040135F PUSH EDI
0167:00401360 CALL `MFC42!ord_00000942`
0167:00401365 POP EDI
0167:00401366 POP ESI
离目标不远?
不久来到这里:
0167:0040162E CALL `MFC42!ord_000018BE`
0167:00401633 MOV ECX,[ESI+60] d ecx=name
0167:00401636 LEA EAX,[ESI+60] d eax=name
0167:00401639 CMP DWORD [ECX-08],BYTE +04 code位数为4
0167:0040163D JL 0040167E 呵呵这里就是比较code是否小于4位如果是就
跳走就没戏了?
0167:0040163F PUSH EAX
0167:00401640 LEA ECX,[ESP+08]
0167:00401644 CALL `MFC42!ord_0000035A`
0167:00401649 LEA ECX,[ESP+04]
0167:0040164D CALL `MFC42!ord_0000106B`
0167:00401652 MOV EAX,[ESI+64] \
0167:00401655 MOV EDX,[ESP+04] \real code!(good!)
0167:00401659 PUSH EAX /
0167:0040165A PUSH EDX /
0167:0040165B CALL `MSVCRT!_mbscmp`/
0167:00401661 ADD ESP,BYTE +08
0167:00401664 TEST EAX,EAX
0167:00401666 JNZ 00401675
0167:00401668 PUSH DWORD 0040302C
0167:0040166D LEA ECX,[ESI+68]
........................................
0167:0040165B CALL `MSVCRT!_mbscmp`
到这儿eax=00654340 ecx=00654340
还有stack prot32 x
0063f908 ->00654340
看到没有再一次证明stack prot32 x窗口在找注册码时还是一些用?
1212
这个CALL `MSVCRT!_mbscmp就对应strcmp( )函数啊

PeterCheN:
name:peterchen
code:nehcretep
name与code为什么哪么相似了?
name:chen
code:nehc
name:chens
code:snech
总结算法:
chen 1234
nehc 4321

chens 12345
snehc 54321
原来是这样把name位数倒还来排就是read code!真容易?!
用trw2000来破解到算码也不用三分钟!呵呵!初学者试一试?


TEXme v1.0

 标 题:在转贴一个，谁的？JOJO的！！！ (6千字)
发信人:8086[CCG]
时 间:2001-7-25 19:16:15
详细信息:
漫谈CrackMe之三
试谈TEXme v1.0的破解

大家好，又见面了。不知大家看了上篇文章是否对KEY文件认证有些心得。今天我们看看
另一种风格的CRACKME软件。这次我们分析的是TEX99的TEXme v1.0版本。等级2级。虽然2
级，但加密去着实不弱。软件可以到下面地址下载。

此CRCAKME属于循环运算，在程序被展开后就开始循环计算NAME和SERIAL，等你添入正
确的NAME和SERIAL显示"YES! You found your serial!!"循环停止，否则显示
"Your serial is not valid."。这可以从下面的分析中看到。

我们先来看看破解的思路，先用W32反编译程序。查找有关的字串，这里就不再累述过程。
然后向上找可疑跳转，确定断点后用ICE动态分析，最终找到正确的SERIAL。

首先用W32载入texme.exe，老步骤，打开“REFS”查找字符串"YES! You found your serial!!",找到了双击。看到以下程序：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012B6(C) ；这里有情况，说明这里是由004012B6处跳转来的。
|

* Possible StringData Ref from Data Obj ->"YES! You found your serial!!"
|
:004012CE 687F304000 push 0040307F
:004012D3 FF357C314000 push dword ptr [0040317C]

* Reference To: USER32.SetWindowTextA, Ord:0221h
|
:004012D9 E850020000 Call 0040152E
:004012DE 33C0 xor eax, eax
:004012E0 C9 leave
:004012E1 C21000 ret 0010

查找004012B6，看到以下程序：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012A6(C) ；这里同上，说明这里是由004012A6处跳转来的。
|
:004012AE A267314000 mov byte ptr [00403167], al
:004012B3 83F810 cmp eax, 00000010 ；在这里。
:004012B6 7416 je 004012CE ；不跳就失败了。

* Possible StringData Ref from Data Obj ->"Your serial is not valid."
|
:004012B8 6865304000 push 00403065
:004012BD FF357C314000 push dword ptr [0040317C]

* Reference To: USER32.SetWindowTextA, Ord:0221h
|
:004012C3 E866020000 Call 0040152E
:004012C8 33C0 xor eax, eax
:004012CA C9 leave
:004012CB C21000 ret 0010

我们修改004012B6处"je"成"jnz"。程序被暴力破解。可是CRACKME是不准打补丁的。
我们只好继续分析了。查找"004012A6"，找到，看到以下程序：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401274(C) ；我们先不向上看了。
|
:0040128D 3D13010000 cmp eax, 00000113 ；这里断一下试一试
:00401292 7550 jne 004012E4
:00401294 E8BA010000 call 00401453 ；Call里是什么呢？
:00401299 0FBE0566314000 movsx eax, byte ptr [00403166]
:004012A0 3A0567314000 cmp al, byte ptr [00403167]
:004012A6 7506 jne 004012AE
:004012A8 33C0 xor eax, eax
:004012AA C9 leave
:004012AB C21000 ret 0010

用ICE中的Symbol Loader载入程序，运行，中断在程序入口处。BPX 40128D，然后
F5，程序被中断，F5又中断，程序已经进入循环。证明我们还是没有找错。BD *，F5。添
入NAME和SERIAL，Ctrl+D，BE *，F5，程序被中断。待程序运行到00401294处F8进入，
看到以下程序：

:00401453 55 push ebp
:00401454 8BEC mov ebp, esp
:00401456 83C4FC add esp, -4
:00401459 8925A0314000 mov dword ptr [004031A0], esp
:0040145F 8D2552314000 lea esp, dword ptr [00403152]
:00401465 0FBE0566314000 movsx eax, byte ptr [00403166]
:0040146C 03E0 add esp, eax
:0040146E C3 ret ；关键是RET后到哪里。

RET后程序到这里：

:00401361 8D3D8C314000 lea edi, dword ptr [0040318C]
:00401367 0FBE0568314000 movsx eax, byte ptr [00403168]
:0040136E 03F8 add edi, eax
:00401370 FE0568314000 inc byte ptr [00403168]
:00401376 A188314000 mov eax, dword ptr [00403188]
:0040137B 8B25A0314000 mov esp, dword ptr [004031A0]
:00401381 40 inc eax ；加1
:00401382 FF0588314000 inc dword ptr [00403188] ；迷惑项
:00401388 3307 xor eax, dword ptr [edi]
:0040138A A388314000 mov dword ptr [00403188], eax
:0040138F 803D6831400010 cmp byte ptr [00403168], 10
:00401396 7507 jne 0040139F
:00401398 80056631400004 add byte ptr [00403166], 04
:0040139F C9 leave
:004013A0 C3 ret ；出去还会回来的。呵呵。

这段是程序的关键所在，如果你看得懂，程序就破解一半了。基本是这样的，D 40318C
你可以看到你输入的NAME，过401376程序段后 ? EAX后可以看到你输入的SERIAL，而
403168则是一个计数器，它的值到16后就跳转出循环。程序在循环中这样取NAME的字符
ASCII码，不足16位以ASCII码"00"补齐。比如我的NAME：jojo[CCG]，先取"j"的ASCII
值与你的SERIAL值加1后相异或，也就是00401382程序段。然后把结果送到403188中再把
"o"的ASCII值与上次相异或的结果加1后再相异或。结果再送到403188中，一直循环16次，
然后出循环。

出循环会到哪里呢？中断程序段0040128D，按F5，观察EAX的值，会有2次"111"，2次
"138"后，出现"113"，这时单步走没有多久可以看到以下程序：

:0040149C A188314000 mov eax, dword ptr [00403188]
:004014A1 0578241109 add eax, 09112478
:004014A6 85C0 test eax, eax
:004014A8 7509 jne 004014B3 ；如果不跳就万事大吉了

我们来算个算术题：0-09112478=F6EEDB88，就是说我们刚才异或半天的值等于
F6EEDB88就不会跳转，这样就使以下程序：

:004012AE A267314000 mov byte ptr [00403167], al
:004012B3 83F810 cmp eax, 00000010 ；在这里。
:004012B6 7416 je 004012CE ；不跳就失败了。

成功跳转，注册成功！

这样我们依此反推就可以得到正确的SERIAL。如果大家嫌太麻烦就自己做一个注册机吧。

好了，今天就到这里吧！休息、休息一下！！！对，差一点忘了，我的

NAME:jojo[CCG] SERIAL:3635081415

谨以此文献给我们可爱的CCG，希望它蒸蒸日上！

jojo [CCG]
2000.5.9

#################################
# 欢迎光临【密界寻综】JOJO的家 #
# #
# jojocrack@371.net #
# http://jojohome.126.com #
# http://grwy.sqinfo.ha.cn/jojo #
#################################


Andrénalin.33

标 题:这里！请进 (1千字)
发信人:小球[CCG]
时 间:2001-4-9 22:14:35
详细信息:
今天有空，就研究研究peterchen给我的crackme：Andrénalin.33
程序也很有趣，key形式的。看来是固定的，但是好像也不是很容易，一定不是明文的！要有心理准备哦！
好了我们开始吧！
输入key：abc
下断bpx hmemcpy
程序被断：15次F12将要出错，所以14下就够了
到这儿：
:00401000 07 pop es
:00401001 0008 add byte ptr [eax], cl
:00401003 00DC add ah, bl
:00401005 214000 and dword ptr [eax+00], eax

:00401008 17224000 DWORD 00402217
:0040100C E3214000 DWORD 004021E3
按F10继续
:00401FAA FF1508414000 Call dword ptr [00404108] *这里取到你的码
:00401FB0 66050A00 add ax, 000A
:00401FB4 0F80B0020000 jo 0040226A
:00401FBA 0FBFD0 movsx edx, ax
:00401FBD 52 push edx
按F10让它算吧！
* Possible StringData Ref from Code Obj ->"kkXy^rO|*yXo*m\kMuOn*+"
|
:00402036 C7855CFFFFFF8C1A4000 mov dword ptr [ebp+FFFFFF5C], 00401A8C
:00402040 C78554FFFFFF08800000 mov dword ptr [ebp+FFFFFF54], 00008008
上面的00401a8c里面放的的是的注册码，只不过是密文的！你只要把它的十六进制减去A就是真正的注册码了！
呵呵....也挺简单的！
注册码是aNThEr oNe cRaCkEd !
你试试.....


Cruehead.3

标 题:一个CrackMe的破解 *KeyFIle保护* (教你如何获得 KeyFile) (5千字)
发信人:TAE!
时 间:2001-2-6 18:18:15
详细信息:
最近一直在研究KeyFIle保护的软件破解,就到CCG的主页上下载了一个CrackMe,试着破了一下,请看:
由于笔者没有时间复查,所以如有错误的地方请大家支出!
这个crackme在咖菲猫的家(CCG)的主页有下载.
下载地址:http://go3.163.com/~gfcrack/crackme/Cruehead.3.zip

一个CrackMe的破解 *KeyFIle保护* (教你如何获得 KeyFile)

1/2破解人:TAE! 另外1/2破解人:XXX!!!

用FileMon检测出此CrackMe会读取crackme3.key这个文件,所以我们手动建立它,然后打开
这个文件,输入 1234567890abcd 这些字符.运行trw设置断点BPX CreateFilea.然后运
行程序,被中断,按F5,F12各一次.便来到了这儿:

* Possible StringData Ref from Data Obj ->"CRACKME3.KEY"
|
:00401028 68D7204000 push 004020D7

* Reference To: KERNEL32.CreateFileA, Ord:0000h
|
:0040102D E876040000 Call 004014A8
:00401032 83F8FF cmp eax, FFFFFFFF <---我们到了这里,
:00401035 750C jne 00401043 // 检测crackme3.key这个文件
是否存在.存在就跳走.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401035(C)
|
:00401043 A3F5204000 mov dword ptr [004020F5], eax
:00401048 B812000000 mov eax, 00000012
:0040104D BB08204000 mov ebx, 00402008
:00401052 6A00 push 00000000
:00401054 68A0214000 push 004021A0
:00401059 50 push eax
:0040105A 53 push ebx
:0040105B FF35F5204000 push dword ptr [004020F5]

* Reference To: KERNEL32.ReadFile, Ord:0000h
|
:00401061 E830040000 Call 00401496 //读取文件的字节数
:00401066 833DA021400012 cmp dword ptr [004021A0], 00000012 //比较字节数是不是12
:0040106D 75C8 jne 00401037 //小于12就跳走!完了

所以 Key 文件的大小应该为18个字节.
我们在Crackme3.key文件中输入18个字符,我是这样输的:1234567890abcdefgh
继续来到这里:

:0040106F 6808204000 push 00402008
:00401074 E898020000 call 00401311 *//对你输入的字符编码
:00401079 8135F920400078563412 xor dword ptr [004020F9], 12345678 注册成功后,编码后的
:00401083 83C404 add esp, 00000004 字符就是你的大名了!
:00401086 6808204000 push 00402008
:0040108B E8AC020000 call 0040133C
:00401090 83C404 add esp, 00000004
:00401093 3B05F9204000 cmp eax, dword ptr [004020F9] //
:00401099 0F94C0 sete al
:0040109C 50 push eax
:0040109D 84C0 test al, al
:0040109F 7496 je 00401037

进入*那个Call看看吧!在这里,*****运算核心*****

:00401311 33C9 xor ecx, ecx //清空寄存器ecx
:00401313 33C0 xor eax, eax //清空寄存器eax
:00401315 8B742404 mov esi, dword ptr [esp+04] //Keyfile中的字符串给esi
:00401319 B341 mov bl, 41 //将A这个字符传给bl
:0040131B 8A06 mov al, byte ptr [esi] //KeyFile中第一个字符给al,就是我们输入的1
:0040131D 32C3 xor al, bl //异或al,bl传给al
:0040131F 8806 mov byte ptr [esi], al //al给esi
:00401321 46 inc esi //指向下一个esi中的字符
:00401322 FEC3 inc bl //bl加1
:00401324 0105F9204000 add dword ptr [004020F9], eax //异或后的每个ascii码的值相加给004020F9*(这个值很重要设为X)
:0040132A 3C00 cmp al, 00
:0040132C 7407 je 00401335
:0040132E FEC1 inc cl
:00401330 80FB4F cmp bl, 4F
:00401333 75E6 jne 0040131B //循环

从这里可以知道程序取keyfile中的字符串进行编码(第一个字符和A异或,第二个字符于B异或……,然后将结果保存在Esi中)
但Keyfile中的最后四个字符不参加运算,而是作为判断是否为真正keyfile的关键字符！)
(注意:若我们Keyfile文件中第一个字符为A那么破解后无法显示你的大名)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040132C(C)
|
:00401335 890D49214000 mov dword ptr [00402149], ecx
:0040133B C3 ret

运算完成后,我们便来到这里:*************(这也是我有疑问的地方,请各位帮忙!!!)*************

:00401079 8135F920400078563412 xor dword ptr [004020F9], 12345678 //X和12345678异或的值(设为Y)
:00401083 83C404 add esp, 00000004
:00401086 6808204000 push 00402008
:0040108B E8AC020000 call 0040133C //取出keyfile最后四位字符
:00401090 83C404 add esp, 00000004
:00401093 3B05F9204000 cmp eax, dword ptr [004020F9] //最后四位字符十六进制是否为X
:00401099 0F94C0 sete al
:0040109C 50 push eax
:0040109D 84C0 test al, al
:0040109F 7496 je 00401037 //不能跳!

所以要让我们keyfile的最后四位字符的十六进制的值=Y
异或后的结果的第1位开始到第14位就是你的姓名了!!!

这样,应该不难写出注册机了吧? 可惜我不懂编程;(

请教高手们:
如何在文本文件中输入那些很奇怪的字符?如:Keyfile文件的最后四位一定要为十六进制的:12345678
那么这个12的ascii字符怎么输入呢?是否需要编程来获得?请高人指点,小弟谢了!!!!!!!
TAE!
2001年2月5日


Button Studio 1.41

标 题:请看小弟KeyFile保护的破解 (7千字)
发信人:TAE!
时 间:2001-2-1 19:04:18
详细信息:
暴力破解第三回 Button Studio 1.41
目标软件:Button Studio 1.41
保护方式:KeyFile
破解方法:暴力破解(怎么每次都是爆破,你有暴力倾向呀!@#@&^&$#)
破 解 人:TAE!
软件介绍:一个制造各种漂亮按钮的工具,特点是小巧,易用,做出的按钮很漂亮.
下载地址:www.interkodex.com

首先声明本人心理健康,乐观向上,绝对没有暴力倾向,只是由于学艺不精,只有爆破了:)
这个软件没有让你输入注册码的地方,我想可能是KeyFile保护的.所以就运行Filemon
再运行Button Studio发现它读取buttonstudio.rg这个文件.猜想这个文件应该是KeyFile.
建立buttonstudio.rg文件.运行软件,奇怪,没反应,不能运行!!我猜对了,肯定是程序运行
时,检查KeyFile,但我建立的文件肯定不是真正的KeyFile(费话!)所以程序发现了,就不让运行
了.
运行TRW 1.23(BTW:为什么有时候CTRL+N不能呼叫?)设置断点 bpx CreateFileA,运行
程序,被中断,这时下D EAX查看,按F5运行程序,又被中断一定记住要查看EAX的值,就这样按
了大约6次F5,这时程序已经开始读取buttonstudio.rg文件了,下Pmodule,回到Button Studio
的程序段.
* Reference To: kernel32.CreateFileA, Ord:0000h
|
:0040636B E8B0AEFFFF Call 00401220

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406395(U)
|
:00406370 83F8FF cmp eax, FFFFFFFF //回到这里.
:00406373 7429 je 0040639E
:00406375 8903 mov dword ptr [ebx], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004063AF(U)
|
:00406377 5F pop edi
:00406378 5E pop esi
:00406379 5B pop ebx
:0040637A C3 ret

稍后便会运行到这里:
* Possible StringData Ref from Code Obj ->"buttonstudio.rg"
|
:004B3196 684C344B00 push 004B344C
:004B319B 8D852CFDFFFF lea eax, dword ptr [ebp+FFFFFD2C]
:004B31A1 BA03000000 mov edx, 00000003
:004B31A6 E8590FF5FF call 00404104
:004B31AB 8B952CFDFFFF mov edx, dword ptr [ebp+FFFFFD2C]
:004B31B1 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54]
:004B31B7 E8F22CF5FF call 00405EAE
:004B31BC BA01000000 mov edx, 00000001
:004B31C1 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54]
:004B31C7 E80532F5FF call 004063D1
:004B31CC 6A00 push 00000000
:004B31CE 8D55F0 lea edx, dword ptr [ebp-10]
:004B31D1 B901000000 mov ecx, 00000001
:004B31D6 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54]
:004B31DC E86F2DF5FF call 00405F50
:004B31E1 B8FF000000 mov eax, 000000FF
:004B31E6 2B45F0 sub eax, dword ptr [ebp-10]
:004B31E9 8945EC mov dword ptr [ebp-14], eax
:004B31EC 8B75EC mov esi, dword ptr [ebp-14]
:004B31EF 85F6 test esi, esi
:004B31F1 7E49 jle 004B323C
:004B31F3 C745FC01000000 mov [ebp-04], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B323A(C)
|
:004B31FA 6A00 push 00000000 //
:004B31FC 8D55F0 lea edx, dword ptr [ebp-10] .
:004B31FF B901000000 mov ecx, 00000001 .
:004B3204 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54] .
:004B320A E8412DF5FF call 00405F50 .
:004B320F B8FF000000 mov eax, 000000FF .
:004B3214 2B45F0 sub eax, dword ptr [ebp-10] .这里是个循环,好像是读取文件中
:004B3217 8945F0 mov dword ptr [ebp-10], eax .的Ascii,并且运算编码,懒得看了.
:004B321A 8D8520FDFFFF lea eax, dword ptr [ebp+FFFFFD20] .
:004B3220 8B55F0 mov edx, dword ptr [ebp-10] .
:004B3223 E8440DF5FF call 00403F6C .
:004B3228 8B9520FDFFFF mov edx, dword ptr [ebp+FFFFFD20] .
:004B322E 8D45F8 lea eax, dword ptr [ebp-08] .
:004B3231 E8160EF5FF call 0040404C .
:004B3236 FF45FC inc [ebp-04] .
:004B3239 4E dec esi .
:004B323A 75BE jne 004B31FA //

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B31F1(C)
|
:004B323C 8B75EC mov esi, dword ptr [ebp-14] //将光标定位在这里,按F7,继续向下运行
:004B323F 85F6 test esi, esi
:004B3241 7E40 jle 004B3283
:004B3243 C745FC01000000 mov [ebp-04], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3281(C)
|
:004B324A 6A00 push 00000000
:004B324C 8D55F0 lea edx, dword ptr [ebp-10]
:004B324F B901000000 mov ecx, 00000001
:004B3254 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54]
:004B325A E8F12CF5FF call 00405F50
:004B325F 8B45F8 mov eax, dword ptr [ebp-08]
:004B3262 8B55FC mov edx, dword ptr [ebp-04]
:004B3265 8A4410FF mov al, byte ptr [eax+edx-01]
:004B3269 34FF xor al, FF
:004B326B 25FF000000 and eax, 000000FF
:004B3270 0345FC add eax, dword ptr [ebp-04]
:004B3273 3B45F0 cmp eax, dword ptr [ebp-10] //到这里停一停,比较!可惜经过编码
:004B3276 7405 je 004B327D //在这里一定要跳,下面还有一处
:004B3278 E88B09F5FF call 00403C08 //运行到这里程序便退出了

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3276(C)
|
:004B327D FF45FC inc [ebp-04]
:004B3280 4E dec esi
:004B3281 75C7 jne 004B324A //又上去了.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B3241(C)
|
:004B3283 6A00 push 00000000
:004B3285 8D55F0 lea edx, dword ptr [ebp-10]
:004B3288 B901000000 mov ecx, 00000001
:004B328D 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54]
:004B3293 E8B82CF5FF call 00405F50
:004B3298 8B45F8 mov eax, dword ptr [ebp-08]
:004B329B E8A40DF5FF call 00404044
:004B32A0 3B45F0 cmp eax, dword ptr [ebp-10] //又是比较
:004B32A3 7405 je 004B32AA //一定要跳!
:004B32A5 E85E09F5FF call 00403C08 //进去就完了!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B32A3(C)
|
:004B32AA 8D8554FDFFFF lea eax, dword ptr [ebp+FFFFFD54]
:004B32B0 E8632DF5FF call 00406018
:004B32B5 B8849C4D00 mov eax, 004D9C84
:004B32BA 8B55F8 mov edx, dword ptr [ebp-08]
:004B32BD E8560BF5FF call 00403E18
:004B32C2 33C0 xor eax, eax
:004B32C4 A3809C4D00 mov dword ptr [004D9C80], eax

将上面的两个跳转改为 Jmp,试运行,没有Nag了,看看About,那个讨厌的Not registered变成了
Registered to:(乱码),因为建立KeyFile中的Ascii不对,所以这里显示的是乱码.无论如何破解都
成功了!
这里真是个很好的地方,能和各位学到不少东西,可惜马上就要开学,我今年中专三年级,要毕业了,
以后就没那么多时间搞Crack了,好苦啊!唉!还有这个月的电话费……,反正免不了挨妈妈一顿骂.


HIEW6.70

 标 题:破解 HIEW6.70 完全版软件的读 Hiew.key 文件的功能。<=高手不要进入。 (3千字)
发信人:4
时 间:2001-7-2 22:47:52
详细信息:
破解 HIEW6.70 完全版软件的读 Hiew.key 文件的功能。
破解人：4
日期：七月一日
写得太差了，请不要扔石头。啊！那个高手扔得的蕃茄？又一个土豆？啊，有人扔石头了！救命啊...

今天收到一个朋友寄来的HIEW6.70 完全版软件。不过我不想使用他的 Hiew.key文件，
但是如果没有这个文件, HIEW32.EXE 就会提醒你去注册。
还是破解一下这个软件吧。
使用fileinfo检查到HIEW32.EXE是用ASPACK211加密。
使用ASPR脱壳它的壳吧。
用w32dasm打开HIEW32，反编译后，按String Data References 键。
看这里 HIEW.KEY ，按两下这个英文单词来这里：

办法一
* Possible StringData Ref from Data Obj ->"HIEW.KEY"
|
:00403573 689C264300 push 0043269C
:00403578 50 push eax
:00403579 51 push ecx
:0040357A E811FDFFFF call 00403290
:0040357F 83C40C add esp, 0000000C
:00403582 50 push eax
:00403583 E888010000 call 00403710
:00403588 83C408 add esp, 00000008
:0040358B 85C0 test eax, eax
:0040358D 743C je 004035CB 《= 如果eax=0,就跳
:0040358F 68402B4400 push 00442B40
:00403594 E8E7020000 call 00403880
:00403599 83C404 add esp, 00000004
:0040359C 85C0 test eax, eax
:0040359E 742B je 004035CB 《= 如果eax=0,就跳
:004035A0 57 push edi
:004035A1 56 push esi
:004035A2 6A65 push 00000065
:004035A4 C7054C0B440001020000 mov dword ptr [00440B4C], 00000201
:004035AE E87DE6FFFF call 00401C30
:004035B3 B919000000 mov ecx, 00000019
:004035B8 BE582B4400 mov esi, 00442B58
:004035BD 8BF8 mov edi, eax
:004035BF 83C404 add esp, 00000004
:004035C2 A3480B4400 mov dword ptr [00440B48], eax
:004035C7 F3 repz
:004035C8 A5 movsd
:004035C9 5E pop esi
:004035CA 5F pop edi

容易啦，修改两个je 004035CB=》nop
nop
或者
在w32dasm查出”:0040358D 743C je 004035CB“ 的offset address等于298Dh,
利用Hiew, Hex Workshop, Winhex等，修改743C=>9090
然后
找出”:0040359E 742B je 004035CB“ 的offset address是299Eh,
修改742B=>9090

办法二
用w32dasm打开HIEW32，反编译后，按String Data References 键。
找那个要你注册的信息Unregistered version, please registeryour copy，按两下来这里：

* Referenced by a CALL at Addresses:
|:0040119E , :004011E0
|
:004036E0 A14C0B4400 mov eax, dword ptr [00440B4C]
:004036E5 85C0 test eax, eax
:004036E7 751B jne 00403704 《=一定要跳，修改jne为jmp
:004036E9 6A00 push 00000000
:004036EB E8C0590200 call 004290B0
:004036F0 83C404 add esp, 00000004
:004036F3 A807 test al, 07
:004036F5 750D jne 00403704

* Possible StringData Ref from Data Obj ->"Unregistered version, please register "
->"your copy !"
|
:004036F7 68D4264300 push 004326D4
:004036FC E8EF060200 call 00423DF0
:00403701 83C404 add esp, 00000004

在w32dasm查出”jne 00403704" 的offset address: 2AE7
利用Hiew, Hex Workshop, Winhex等，修改751B=>EB1B

办法一要比办法二要好一点儿啦。
用办法一，按Ctrl+Alt,就可以看到注册窗口。
用办法二，就看到不同信息窗口，但是办法二仅要修改一处地方。


vfp&exe1.70

 标 题:vfp&exe1.70注册码计算 (2千字)
发信人:小楼
时 间:2001-6-4 0:23:30
详细信息:
vfp&exe1.72C注册码计算

据其帮助文件，知道注册方式为keyfile保护。keyfile应在文件安装目录下。
所以用filemon监视，知道keyfile为vfp&exe.bin，伪造它。
经过一番艰苦跟踪后终于知道关键点

:0045640F E8B4150000 call 004579C8

F8进入，比对关键
......
:004579E5 8A27 mov ah, byte ptr [edi] <--依次取密码字串“好
孩子8好孩子8...”
ascii码对应为BA C3
BA A2 D7 D3 38....
:004579E7 8A03 mov al, byte ptr [ebx] <--依次取vfp&exe.bin字串ascii码
:004579E9 80F800 cmp al, 00
:004579EC 7406 je 004579F4
:004579EE 38E0 cmp al, ah
:004579F0 7402 je 004579F4
:004579F2 30E0 xor al, ah <--两者异或
:004579F4 8806 mov byte ptr [esi], al <--值存入ptr[ebx]
:004579F6 43 inc ebx
:004579F7 46 inc esi
:004579F8 47 inc edi
:004579F9 80FC38 cmp ah, 38
:004579FC 7502 jne 00457A00
:004579FE 89D7 mov edi, edx
:00457A00 E2E3 loop 004579E5 <--循环
......

由动态跟踪知道，
1.当xor后dword ptr [006EFBF4]==机器码，则注册成功。
2.mov al, byte ptr [ebx] <--ebx初值为006EF8B0
6EFBF4-6EF8B0+1==837(BCD),
所以VFP&EXE.bin文件第837～844字符对应计算后的机器码。此时的密码字顺序为“A2 D7 D3 38 BA C3 BA A2....”，由XOR原理知道：a ＝ (a xor b) xor b
所以演算如下（我的机器码为1DDD0D4E）：

机器码 对应ASCII码 密码ascii码 vfp&exe.bin字符位置 hex值
1 31 A2 第837位 93
D 44 D7 第838位 93
D 44 D3 第839位 97
D 44 38 第840位 7C
0 30 BA 第841位 8A
D 44 C3 第842位 87
4 34 BA 第843位 8E
E 45 A2 第844位 E7

这样只要你构建一个vfp&exe.bin文件，其字符第837～844位依次填入上述HEX值，你就拥有注册版了。

不知谁能写出一个可以自动生成vfp&exe.bin文件的注册机来，请一定将源代码提供，最好是DELPHI编译的。


Window Commander 4.52

标 题:Window Commander极其好用，请参照破解 (4千字)
发信人:Fpc
时 间:2001-4-4 20:25:58
详细信息:
tKC在他的破解教程中几乎每次都提到WINDOW COMMANDER，而我是属于一形成习惯就难改的那类，最近上网在华军顺手当下来。一使用，效果还真不错“这腰不酸了，腿不疼了，胃也不抽筋了”，在此郑重向大家推荐（如果你没有用过）。
WINDOW COMMANDER的最新版本是4.52。它采用KEYFILE形式注册，需要在它的目录下有一个1024 BYTES的 WINCMD.KEY，注册算法很复杂，（至少我还看不明白）。

在此郑重声明：《论坛精华II》中有一篇C-pen写的WINDOW COMMAND 4.51版的破解文章。这篇文章极其有用，我的破解就是完全参照完成的，只是地址不同，简单的写一下过程。
它是用ASPACK压的，用TRW2000 LOAD，下 PNEWSEC，再下MAKEPE脱壳；
运行出现CRC CHECK的消息框，下 BPX MESSAGEBOXA，拦到：

:004EAC4D 8D85E4FDFFFF lea eax, dword ptr [ebp+FFFFFDE4]
:004EAC53 E87CF0F1FF call 00409CD4
:004EAC58 50 push eax
:004EAC59 8B45FC mov eax, dword ptr [ebp-04]
:004EAC5C E8576EF3FF call 00421AB8
:004EAC61 50 push eax

* Reference To: USER32.MessageBoxA, Ord:0000h 《==
|
:004EAC62 E8E1ADF1FF Call 00405A48
:004EAC67 6A00 push 00000000

* Possible Reference to String Resource ID=61536: "Grid index out of range"
|
:004EAC69 6860F00000 push 0000F060
:004EAC6E 6812010000 push 00000112
:004EAC73 8B45FC mov eax, dword ptr [ebp-04]

静态分析，向上找：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004EA8B4(C)
|
:004EA8EC 83E809 sub eax, 00000009
:004EA8EF 0F8438060000 je 004EAF2D
:004EA8F5 48 dec eax
:004EA8F6 0F84E4060000 je 004EAFE0
:004EA8FC 48 dec eax
:004EA8FD 0F8485060000 je 004EAF88
:004EA903 2D36050000 sub eax, 00000536
:004EA908 90 nop
:004EA909 90 nop
:004EA90A 90 nop
:004EA90B 90 nop
:004EA90C 90 nop
:004EA90D 90 nop
:004EA90E E962070000 jmp 004EB075

（跳转已NOP掉）

作出WINCMD.KEY文件，再下 BPX CREATEFILEA，拦WINCMD.KEY的读取，跟到以下两处：
:004D902A 8D8560FAFFFF lea eax, dword ptr [ebp+FFFFFA60]
:004D9030 8D9570FEFFFF lea edx, dword ptr [ebp+FFFFFE70]

* Possible Reference to String Resource ID=00016: "Specify file type"
|
:004D9036 B910000000 mov ecx, 00000010
:004D903B E8E499F2FF call 00402A24
:004D9040 0F84AE000000 je 004D90F4
:004D9046 33DB xor ebx, ebx

和：

:004D9445 8D8560FAFFFF lea eax, dword ptr [ebp+FFFFFA60]
:004D944B 8D9560FEFFFF lea edx, dword ptr [ebp+FFFFFE60]

* Possible Reference to String Resource ID=00016: "Specify file type"
|
:004D9451 B910000000 mov ecx, 00000010
:004D9456 E8C995F2FF call 00402A24
:004D945B 7402 je 004D945F
:004D945D 33DB xor ebx, ebx

这两处比较[EAX]和[EDX]处内容是否一致，若成功会跳走。我是这样改的：
将EAX赋值分别改为

lea eax, dword ptr [ebp+FFFFFE70]
。。。。
lea eax, dword ptr [ebp+FFFFFE60]

这样就可以了。
C-pen提到的暗桩同样存在，就是每执行一项什么功能，WINCOMMANDER会退出，怎么设断呢？
关键点在这里：它的‘关于’是一个消息框，好了 BE MESSAGEBOXA，点‘关于’，拦下后，一个跳转会到这里

:004F3BA1 A198525400 mov eax, dword ptr [00545298]
:004F3BA6 2DB9230000 sub eax, 000023B9
〈==改为 XOR EAX，EAX
CMP EAX，EAX
NOP

:004F3BAB 740A je 004F3BB7

* Possible Reference to String Resource ID=00001: "Enter file types (e.g. *.doc;*.txt)"
|
:004F3BAD B801000000 mov eax, 00000001
:004F3BB2 E84509F1FF call 004044FC

问题解决了，当然，我不清楚KEYFILE的计算注册名是乱码，哪位兄台有兴趣可以追一追。

仅以此文献给C-pen


Windows Commander 4.51

 标 题:注册你的Windows Commander 4.51 (6千字)
发信人:电神魔鬼
时 间:2000-9-11 15:53:23
详细信息:
注册你的Windows Commander 4.51

最近忙得要命，好久没来看学论坛灌水了，今天要淹他一下^-^。感谢JOHNSON也就是c-pen的帮助，有空到大陆来玩呀。再有谢谢各位cracker的支持。

现在进入正题，如何注册你的wincmd451? 你可以去download一个注册机，叫wc451_kg.exe，到处都是。我用wincmd，只用它的比较功能。作为一个cracker,用别人crack过的东西，尤其是注册机，非常的不爽，还是自己来吧。先进行准备工作：wincmd是aspack压过的，解压缩吧，咦? unas1091竟然不管用，看来还是偷不得懒:(。拿trw2000 ver1.22脱壳，用trw载入wincmd32.exe,下PNEWSEC再下MakePE即可，wincmd目录下会生成一个叫NEWPE.EXE的文件，这就是脱壳后的wincmd32.exe，把NEWPE.EXE改名为wincmd32.exe。好了，看看wincmd脱壳后还能怎么折腾:)。仔细分析了一下，它的注册机制同wincmd4.0一样，根本没有变化，hehe....，这下好办了。
准备工作完成，开始正式crack，一共需要改8处。wincmd是keyfile保护的那种软件，没有keyfile一样改。先用trw2000载入wincmd32.exe，点load,停下来后下bpx readfile，按f5执行，被拦到，下bd *,按f12直到wincmd的领空。当走到如下1.所示的4ce105时停下来，记下这个数，按f5，接着退出trw2000，换乘sooftice。我为什么换成softice，原因很简单，因为我不会用trw:(。按ctrl+d进入softice下bpx hmemcpy,按f5返回，执行wincmd32.exe,被拦到，按8此f12，进入wincmd的领空，下bpx 4ce105,按f5又被拦到，按f10来到如1.所示的程序:

1.
017f:004ce105 e8fe53f3ff call 00403508
017f:004ce10a 83b80c00000000 cmp dword ptr [eax+0c],00
017f:004ce111 7521 ->9090 jnz 004ce134 ->nop
017f:004ce113 8d85e2feffff lea eax,[ebp-011e]

wincmd是靠比较内存判断是否注册的，所用的寄存器是ebx,需要保持为1,走到4ce111,跳下去的话,会清掉ebx,所以不能让他跳。按f10继续，接着他会比较你的keyfile是否为128字节，若是的话，提示这是旧版，让你更新。不管他，按f10走到如2.所示的程序：

2.
017f:004ce32a b966000000 mov ecx,0066
017f:004ce32f babca42000 mov edx,0020a4bc
017f:004ce334 e84ffbffff call 004cde88
017f:004ce339 33c9 xor ecx,ecx
017f:004ce33b b201 mov dl,01

4cde88这个call有问题，跟进去如A.所示程序，把它改为B.所示的程序。其中b5e7c9f1c4a7b9ed20是我注册的名字，你可以改成别的名字，其余的部分按B.所示的改。

004cde88->004cdf00

A. |B.
017f:004cde88 55 push ebp |017f:004cde88 0517000000 add eax,00000017
017f:004cde89 8bec mov ebp,esp |017f:004cde8d c60000 mov byte ptr [eax],00
017f:004cde8b 83c4f8 add esp,-08 |017f:004cde90 0503000000 add eax,00000003
017f:004cde8e 53 push ebx |017f:004cde95 c600b5 mov byte ptr [eax],b5
017f:004cde8f 56 push esi |017f:004cde98 40 inc eax
017f:004cde90 57 push edi |017f:004cde99 c600e7 mov byte ptr [eax],e7
017f:004cde91 8bf9 mov edi,ecx |017f:004cde9c 40 inc eax
017f:004cde93 8945fc mov [ebp-04],eax |017f:004cde9d c600c9 mov byte ptr [eax],c9
. |017f:004cdea0 40 inc eax
. |017f:004cdea1 c600f1 mov byte ptr [eax],f1
. |017f:004cdea4 40 inc eax
. |017f:004cdea5 c600c4 mov byte ptr [eax],c4
. |017f:004cdea8 40 inc eax
. |017f:004cdea9 c600a7 mov byte ptr [eax],a7
. |017f:004cdeac 40 inc eax
. |017f:004cdead c600b9 mov byte ptr [eax],b9
. |017f:004cdeb0 40 inc eax
. |017f:004cdeb1 c600ed mov byte ptr [eax],ed
. |017f:004cdeb4 40 inc eax
017f:004cdef6 ff4df8 dec dword ptr [ebp-08] |017f:004cdeb5 c60020 mov byte ptr [eax],20
017f:004cdef9 75a8 jnz 004cdea3 |017f:004cdeb8 40 inc eax
017f:004cdefb 5f pop edi |.
017f:004cdefc 5e pop esi |.
017f:004cdefe 59 pop ecx |.
017f:004cdeff 59 pop ecx |017f:004cdefd c60000 mov byte ptr [eax],00
017f:004cdf00 5d pop ebp |017f:004cdf00 90 nop
017f:004cdf01 c3 ret |017f:004cdf01 c3 ret

接着按F10来到如3.所示的程序，强制他跳过去，不跳的话会清掉ebx的。

3.
017f:004ce38f e87846f3ff call 00402a0c
017f:004ce394 0f84ae000000 ->e9af000000 jz 004ce448 ->jmp 004ce448

继续跟到如4.所示的程序，按列出的方法改。

4.
017f:004ce5c6 8d8558f8ffff lea eax,[ebp+fffff858]
017f:004ce5cc e8a786f3ff ->90 call 00406c78 ->nop
->33c9 ->xor ecx,ecx
->8808 ->mov bytes ptr [eax],cl
017f:004ce5d1 ba30e94c00 mov edx,004ce930
017f:004ce5d6 8d8558f8ffff lea eax,[ebp+fffff858]

当跟到5.所示的地方，这是最后一个跳转了，强制它跳。

5.
017f:004ce7aa e85d42f3ff call 00402a0c
017f:004ce7af 7402 ->eb02 jz 004ce7b3 ->jmp 004ce7b3
017f:004ce7b1 33db xor ebx,ebx

接下来，按几次f10到如6.所示的程序，按我列出的方法改。

6.
017f:00532d13 a1b0e65300 mov eax,[0053e6b0]
017f:00532d18 e8f340eeff ->eb00 call 00416e10 ->jmp 00532d1a
->eb00 ->jmp 00532d1c
->90 ->nop
017f:00532d1d a1b0e65300 mov eax,[0053e6b0]
017f:00532d22 e86dadeeff call 0041da94

再按几下f10就进入wincmd了，好了，用我的名字注册的。别忙还没完呢，wincmd还没把你折腾够呢，你晃动几下鼠标，wincmd就会冒出一个框框，告诉你感染virus一类的东西。这时按ctrl+d进入softice,下bpx lockmytask,按f5返回，点确定，被拦到，下bd *,按几次f12进入wincmd的地盘，往回倒到如7.所示的地方，将jg 004df5b0改为jmp 004df5b0，这是试出来的。

7.
017f:004df56d e83e76f2ff call 00406bb0
017f:004df572 8b4302 mov eax,dword ptr [ebx+04]
017f:004df575 83f808 cmp eax,08
017f:004df578 7f36 ->9090 jg 004df5b0 ->jmp 004df5b0
017f:004df57a 0f8444060000 je 004dfbc4

不忙还没完呢，当你点help,在点about时，会弹出一个注册信息框，你再点确定时，wincmd会自动退出。所以你在点确定之前进入softice,下bpx lockmytask,按几次f12到如8.所示的地方，把je 004e8578改为jmp 004e8578才能继续使用它。

8.
017f:004e8562 a148405300 mov eax,dword ptr[00534048]
017f:004e8567 2db9230000 sub eax,00000023b9
017f:004e856c 740a ->eb0a je 004e8578 ->jmp 004e8578
017f:004e8573 e86cbff1ff call 004044e4

完活:)

最后就是用winhex以来的东西把wincmd改为注册版了，机器码我都列出来了。

说明：wincmd4.0--4.51之间的所有版本都可以这么改，只是对应的地址不一样。

cracked by 电神魔鬼
my oicq is 1789655
thanks for your supports

我贴出的改免注册版的Winhex Ver9.52有一点问题，竟然没人告诉我，真是太~!@#$%^&(.......
我更正一下
winhex ver9.52

免注册

*[45759d]

017f:00450041 jnz 00450064 ->nop
017f:00450062 jz 00450068 ->jmp 00450068
017f:0043e26a jz 43e277 ->jmp 43e277
017f:0043e31b jl 0043e372 ->nop
017f:0043e36b jz 0043e37d ->jmp 0043e37d

7521B85C524500
9090B85C524500

3B027404
3B02eb04

740bb8b0754500
eb0bb8b0754500

7C55A13C764500
9090A13C764500

741083F954
eb1083F954

改的方法不唯一，主要是让[45759d]永远置一就行。


Windows Commander 4.52

标 题:注册你的Windows Commander 4.52(6千字)
发信人:zombieys
时 间:2001-3-22 19:12:57
详细信息:
注册你的Windows Commander 4.52

wincmd4.52发布有一段时间了，我一直忙的要命，没空去搞(实际是陪朋友们去打sc,如果不打的话，即时战略就会变成即时真人快打，-_-所以~~~~~明白~~~?嘿嘿我的sc水平倒是大有长进哦^^)，今天花了几个小时搞定它;-)。

现在进入正题，如何注册你的wincmd452? 先进行准备工作：wincmd是aspack压过的，拿trw2000 ver1.23脱壳吧。用trw载入wincmd32.exe,下PNEWSEC，晕~~~~~没反应~~~~~，看来还是偷不得懒呀^Q^。用冲击波找到wincmd的入口点543530,用trw载入wincmd32.exe，下g 543530，下suspend，用PROCDUMP找到wincmd进程，右击之，选dump(full)即可,这样脱壳不完全，能改主程序就行，将就用了^^。好了，看看wincmd脱壳后还能怎么折腾:)。大致分析了一下，它的注册机制同wincmd4.0-4.51一样，根本没有变化，hehe....，这下好办了;-)。

准备工作完成，开始正式crack，一共需要改8处。wincmd是keyfile保护的那种软件，没有keyfile一样改。先用trw2000载入wincmd32.exe，点load,停下来后下bpx readfile，按f5执行，被拦到，下bd *,按f12直到wincmd的领空。当走到4d6b1c call 4d8cd0时停下来，记下这个地址，按f5，接着退出trw2000，换乘softice。我为什么换成softice，原因很简单，调试的话用s-ice是最舒服的了，脱壳的话用trw或天意是最方便的，所以choose s-ice没商量。由于不是完全脱壳，不能用s-ice的loader装载，所以~~~按ctrl+d进入softice下bpx hmemcpy,按f5返回，执行wincmd32.exe,被拦到，按数次f12，进入wincmd的领空，下bpx 4d6b1c,按f5又被拦到，按f8接着按f10来到如1.所示的程序:

1.
4d8db1 e86aa7f2ff call 403520
4d8db6 83b80c00000000 cmp dword ptr [eax+0c],00
4d8dbd 7521 ->9090 jnz 4d8de0 ->nop
4d8dbf 8d85e2feffff lea eax,[ebp-011e]

wincmd是靠比较内存判断是否注册的，所用的寄存器是ebx,需要保持为1,走到4d8de0,跳下去的话,会清掉ebx,所以不能让他跳。按f10继续，接着他会比较你的keyfile是否为128字节，若是的话，提示这是旧版，让你更新。不管他，按f10走到如2.所示的程序：

2.
4d8fd6 b966000000 mov eax,00000066
4d8fdb babca42000 mov edx,0020a4bc
4d8fe0 e84ffbffff call 4d8b34
4d8fe5 33c9 xor ecx,ecx
4d8fe7 b201 mov dl,01

4d8b34这个call有问题，跟进去如A.所示程序，把它改为B.所示的程序。其中b5e7c9f1c4a7b9ed20或7a6f6d6269657973是我注册的名字，你可以改成别的名字，其余的部分按B.所示的改。

004cde88->004cdf00

A. |B.
017f:004d8b34 55 push ebp |017f:004d8b34 0517000000 add eax,00000017
017f:004d8b35 8bec mov ebp,esp |017f:004d8b39 c60000 mov byte ptr [eax],00
017f:004d8b37 83c4f8 add esp,-08 |017f:004d8b3c 0503000000 add eax,00000003
017f:004d8b3a 53 push ebx |017f:004d8b43 c600b5 mov byte ptr [eax],b5
017f:004d8b3b 56 push esi |017f:004d8b46 40 inc eax
017f:004d8b3c 57 push edi |017f:004d8b47 c600e7 mov byte ptr [eax],e7
017f:004d8b3d 8bf9 mov edi,ecx |017f:004d8b4a 40 inc eax
017f:004d8b3f 8945fc mov [ebp-04],eax |017f:004d8b4b c600c9 mov byte ptr [eax],c9
. |017f:004d8b4e 40 inc eax
. |017f:004d8b4f c600f1 mov byte ptr [eax],f1
. |017f:004d8b52 40 inc eax
. |017f:004d8b53 c600c4 mov byte ptr [eax],c4
. |017f:004d8b56 40 inc eax
. |017f:004d8b57 c600a7 mov byte ptr [eax],a7
. |017f:004d8b5a 40 inc eax
. |017f:004d8b5b c600b9 mov byte ptr [eax],b9
. |017f:004d8b5e 40 inc eax
. |017f:004d8b5f c600ed mov byte ptr [eax],ed
. |017f:004d8b62 40 inc eax
017f:004d8ba2 ff4df8 dec dword ptr [ebp-08] |017f:004d8b63 c60020 mov byte ptr [eax],20
017f:004d8ba5 75a8 jnz 004d8b4f |017f:004d8b66 40 inc eax
017f:004d8ba7 5f pop edi |.
017f:004d8ba8 5e pop esi |.
017f:004d8ba9 5b pop ebx |.
017f:004d8baa 59 pop ecx |.
017f:004d8bab 59 pop ecx |017f:004d8ba9 c60000 mov byte ptr [eax],00
017f:004d8bac 5d pop ebp |017f:004d8bac 90 nop
017f:004d8bad c3 ret |017f:004d8bad c3 ret

接着按F10来到如3.所示的程序，强制他跳过去，不跳的话会清掉ebx的。

3.
017f:004d903b e8e499f2ff call 00402a24
017f:004d9040 0f84ae000000 ->e9af000000 jz 004d90f4 ->jmp 004d90f4
017f:004d9046 33db xor ebx,ebx
017f:004d9048 33d2 xor edx,edx
继续跟到如4.所示的程序，按列出的方法改。

4.
017f:004d91ff 8d8558f8ffff lea eax,[ebp+fffff858]
017f:004d9205 8bd6 mov edx,esi
017f:004d9207 e81cdaf2ff ->90 call 00406c28 ->nop
->33c9 ->xor ecx,ecx
->8808 ->mov bytes ptr [eax],cl
017f:004d920c bad0954d00 mov edx,004ce930
017f:004d9211 8d8558f8ffff lea eax,[ebp+fffff858]

当跟到5.所示的地方，这是最后一个跳转了，强制它跳。

5.
017f:004d9456 e8c995f2ff call 00402a24
017f:004d945b 7402 ->eb02 jz 004d945f ->jmp 004d945f
017f:004d945d 33db xor ebx,ebx

接下来，按几次f10到如6.所示的程序，按我列出的方法改。

6.
017f:00543893 a1c4f65400 mov eax,[0054f6c4]
017f:00543898 e88342edff ->eb00 call 00417b20 ->jmp 0054389a
->eb00 ->jmp 0054389c
->90 ->nop
017f:0054389d a1b0e65300 mov eax,[0054f6c4]
017f:005438a2 e86dadeeff call 0041e834

再按几下f10就进入wincmd了，好了，用我的名字注册的。别忙还没完呢，wincmd还没把你折腾够呢，你晃动几下鼠标，wincmd就会冒出一个框框，告诉你感染virus一类的东西。这时按ctrl+d进入softice,下bpx lockmytask,按f5返回，点确定，被拦到，下bd *,按几次f12进入wincmd的地盘，往回倒到如7.所示的地方，将JG 4EA8EC改为nop，这是试出来的。

7.
4EA8A9 E87AC3F1FF CALL 406C28
4EA8AE 8B4304 MOV EAX,[EBX+04]
4EA8B1 83F808 CMP EAX,08
4EA8B4 7F36->9090 JG 4EA8EC ->NOP
4EA8B6 0F8456060000 JZ 4EAF12

不忙还没完呢，当你点help,在点about时，会弹出一个注册信息框，你再点确定时，wincmd会自动退出。所以你在点确定之前进入softice,下bpx lockmytask,按几次f12到如8.所示的地方，把JZ 4F3BB7改为JMP 4F3BB7才能继续使用它。

8.
4F3BA1 A198525400 MOV EAX,[545298]
4F3BA6 2DB9230000 SUB EAX,0023B9
4F3BAB 740A->EB0A JZ 4F3BB7 ->JMP 4F3BB7

完活:)
很麻烦吧@_@

最后就是用winhex以来的东西把wincmd改为注册版了，机器码我都列出来了。

说明：wincmd4.0--4.52之间的所有版本都可以这么改，只是对应的地址不一样。

cracked by zombieys
homepage http://zombieys.126.com
my oicq is 1789655
thanks for your supports


windows Commander 4.52

标 题:暴力破解windows Commander 4.52 (5千字)
发信人:mjing
时 间:2001-2-19 16:28:20
详细信息:
破解 Windows Commander 4.52

看了精华论坛II(感谢看雪及各位大侠的精彩文章)中
JOHNSON(C-Pen)大侠破解wincmd4.5的文章，手有些发痒，
于是就下载了WinCmd4.52版练习练习。

所用工具：Trw2000 1.22(注册版)，UltraEdit 8.0

一、脱壳

用FileInfo 2.43检测是用ASPACK2.1加的壳，但
用UnAsPack1.0.9.1自动脱壳无效，(Why???，I don't know.),
按照JOHNSON大侠的方法，用Trw2K载入WinCMD32.exe下命令

pnewsec<Enter>

耐心地等一会儿，等trw2K跳出后，下命令

makepe<Enter>

这样，就在WinCmd的目录下生成了一个newpe.exe文件，它
就是脱壳后的文件。

二、去除CRC检验

程序发现自身被修改后，会提示有病毒，然后退出。
用MessageBoxa断点拦截后，找不到跳转点，这是和4.5版
不同之处，和4.0版倒是一样(不知作者是出于什么心理)。
估计一下，从程序启动完成到弹出有病毒提示大约为5秒钟，
因此，重新载入，下断点

bpx settimer<Enter>

运行程序，拦下后，用pmodule命令返回，可以看到以下代码，
如果没有看到，可以继续运行，重复上面动作，一定能找到：

015F:004EF70C MOV EBX,EAX
015F:004EF70E CMP BYTE [EBX+051F],00
015F:004EF715 JNZ 004EF737 ;关键的跳转，改成JMP就没问题了
015F:004EF717 MOV BYTE [EBX+051F],01
015F:004EF71E PUSH BYTE +00
015F:004EF720 PUSH DWORD 1388 ;1388即十进制的5000，即5000毫秒
015F:004EF725 PUSH DWORD 0541
015F:004EF72A MOV EAX,EBX
015F:004EF72C CALL 00421AB8
015F:004EF731 PUSH EAX
015F:004EF732 CALL `USER32!SetTimer`

如此改了之后，程序还会不定时的自动退出。还有陷井，问题是它没有提示，
如何找到它呢，猜想不是使用的时钟，大概是在执行具体功能时检测的，
试一下，删除一个文件，结果自动退出，OK，有办法了，载入后，下断点

bpx messageboxa

全速运行，找一个没有的文件删除，被拦下后，用pmodule(这个命令太COOL了)
返回，F10步步跟踪，看到了如下代码：
015F:004F3BA0 JMP NEAR [ECX+00545298]
015F:004F3BA6 SUB EAX,23B9
015F:004F3BAB JZ 004F3BB7 ;关键的跳转，改成JMP就OK
015F:004F3BAD MOV EAX,01
015F:004F3BB2 CALL 004044FC ;此CALL将退出程序
015F:004F3BB7 CALL 0044CD54
015F:004F3BBC XOR EAX,EAX
015F:004F3BBE POP EDX
015F:004F3BBF POP ECX
015F:004F3BC0 POP ECX

三、去除NAG，反复看了johnson大侠的文章XX遍，还好找到了，
可让我省了很多很多的力气要先假造wincmd.key文件
用createfilea断点拦截，拦下后，d eax 看一下内存中的数据，
有Wincmd.key字眼就找到了，
015F:004D944B LEA EDX,[EBP+FFFFFE60]
015F:004D9451 MOV ECX,10
015F:004D9456 CALL 00402A24
015F:004D945B JZ 004D945F ;此处此处可改成JMP，

其实不跳也行，跳了会显示乱码，

015F:004D945D XOR EBX,EBX ；EBX为注册标志，盯住它，没错
015F:004D945F MOV EAX,[EBP+FFFFFEFC]
015F:004D9465 CALL 00402CBC
015F:004D946A MOV EAX,[EBP+FFFFFEF8]
015F:004D9470 CALL 00402CBC
015F:004D9475 MOV EAX,[EBP+FFFFFEF4]
015F:004D947B CALL 00402CBC
015F:004D9480 MOV [0054F6CC],BL
015F:004D9486 MOV EAX,[0054F6C8]
015F:004D948B NEG EAX
015F:004D948D IMUL EAX,EAX,BYTE +25
015F:004D9490 MOV [0054F6C8],EAX

将注册标志存入内存处为：

015F:004D9451 MOV ECX,10
015F:004D9456 CALL 00402A24 ；再次比较KEY文件
015F:004D945B JZ 004D945F
015F:004D945D XOR EBX,EBX ；EBX被清则表示未注册
015F:004D945F MOV EAX,[EBP+FFFFFEFC]
015F:004D9465 CALL 00402CBC
015F:004D946A MOV EAX,[EBP+FFFFFEF8]
015F:004D9470 CALL 00402CBC
015F:004D9475 MOV EAX,[EBP+FFFFFEF4]
015F:004D947B CALL 00402CBC
015F:004D9480 MOV [0054F6CC],BL ;存入注册标志此处不管有无KEY文件都会走到
015F:004D9486 MOV EAX,[0054F6C8]
015F:004D948B NEG EAX
015F:004D948D IMUL EAX,EAX,BYTE +25

因此，我们不必假造KEY文件，只要让上面的BL值为1不就行了么？
我找了下处

015F:004D8DBD JNZ 004D8DE0
015F:004D8DBF LEA EAX,[EBP+FFFFFEE2]
015F:004D8DC5 PUSH EAX
015F:004D8DC6 LEA EDX,[EBP+FFFFFA70]
015F:004D8DCC MOV CX,0400
015F:004D8DD0 MOV EAX,ESI
015F:004D8DD2 CALL 0043CF10
015F:004D8DD7 MOV EAX,ESI
015F:004D8DD9 CALL 0043CEA0
015F:004D8DDE JMP SHORT 004D8DEB
015F:004D8DE0 XOR EBX,EBX
015F:004D8DE2 MOV WORD [EBP+FFFFFEE2],00
015F:004D8DEB CMP WORD [EBP+FFFFFEE2],80
015F:004D8DF4 SETZ [0054F6CD]
015F:004D8DFB MOV BYTE [EBP+FFFFFEE1],01
015F:004D8E02 TEST BL,BL ；在此行上动手脚 改成 mov bl,01
015F:004D8E04 JZ NEAR 004D90F4 ；在此行上动手脚 改成 jmp 004d90f4，再补一个NOP
015F:004D8E0A LEA EAX,[EBP+FFFFF608]
015F:004D8E10 PUSH EAX
015F:004D8E11 CALL `KERNEL32!GetTimeZoneInformation`
015F:004D8E16 INC EAX
015F:004D8E17 JZ 004D8E35

另外再把015F:004D945D处改成2个NOP
当然具体改法很多，自己决定吧!

这样，运行程序没有NAG了，但标题栏显示为Not Registered ，不管它了，
当然也可改掉，不过我很懒啦，反正已经达到目的了，至此为止!
通过分析，可以知道，第一次比较KEY文件为判断是否注册，
第二次比较KEY文件为判断是否要出NAG。

这篇破文总算是写完了，花了我很长时间，虽然没有什么新意，但也很累。
看了网上那么多大侠的文章，我也把自己的一点体会写出来，算占一点回报吧。

如有遗漏可来E-mail联系，没有时间作全面充分的测试(现在的软件陷井多多)

再见吧!各位好运!!!!!

written by mjing E-mail：mjing@wx88.net 2001-2-19


WINDOWS优化大师 v3.53

标 题:我也发个帖子，凑凑热闹：WINDOWS优化大师 v3.53“暗门”的解决过程 (7千字)
发信人:时空幻影
时 间:2001-4-10 11:17:05
详细信息:
WINDOWS优化大师 v3.53“暗门”的解决过程（时空幻影于2001年4月6日）
最近许多人用在我写的注册机时，遇到这样一个问题：用生成的注册码输入后，该软件提示已注册，但是在退出该软件，然后再运行时又变成未注册的了。
我先用CASPR（脱壳工具）脱掉该软件的壳，然后在用W32DASM进行反汇编，查看可疑字符串，果然看到了“未注册”（因为在该软件运行后有“未注册”字样，所以我是从最后往前翻看到的，结果绕了一个圈子，如果从前面往后翻的话，我会解决的更快）。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00524167(U), :00524173(U)
|
:00524185 8B4584 mov eax, dword ptr [ebp-7C]
:00524188 E8DFEDEDFF call 00402F6C
:0052418D 8B4580 mov eax, dword ptr [ebp-80]
:00524190 E8D7EDEDFF call 00402F6C
:00524195 8B45FC mov eax, dword ptr [ebp-04]
:00524198 E8933FFFFF call 00518130 <--把W32DASM的光棒移到该位置，点击工具栏的"Call"
:0052419D 85C0 test eax, eax
:0052419F 0F85A6000000 jne 0052424B <--当EAX为0时注册成功，为1时则变为未注册
:005241A5 8B45FC mov eax, dword ptr [ebp-04]
:005241A8 8B80D0070000 mov eax, dword ptr [eax+000007D0]

* Possible StringData Ref from Code Obj ->"Windows优化大师 V3.53 (已注册)"
|
:005241AE BAE06F5200 mov edx, 00526FE0
:005241B3 E808D6F0FF call 004317C0
:005241B8 B201 mov dl, 01
:005241BA A1246B4500 mov eax, dword ptr [00456B24]
:005241BF E8602AF3FF call 00456C24
:005241C4 898514FFFFFF mov dword ptr [ebp+FFFFFF14], eax
:005241CA BA02000080 mov edx, 80000002
:005241CF 8B8514FFFFFF mov eax, dword ptr [ebp+FFFFFF14]
:005241D5 E8EA2AF3FF call 00456CC4
:005241DA 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"Software\Wom"
|
:005241DC BA98575200 mov edx, 00525798
:005241E1 8B8514FFFFFF mov eax, dword ptr [ebp+FFFFFF14]
:005241E7 E81C2CF3FF call 00456E08
:005241EC 84C0 test al, al
:005241EE 742F je 0052421F

* Possible StringData Ref from Code Obj ->"Masters"
|
:005241F0 BA08705200 mov edx, 00527008
:005241F5 8B8514FFFFFF mov eax, dword ptr [ebp+FFFFFF14]
:005241FB E8B833F3FF call 004575B8
:00524200 84C0 test al, al
:00524202 7410 je 00524214

* Possible StringData Ref from Code Obj ->"Masters"
|
:00524204 BA08705200 mov edx, 00527008
:00524209 8B8514FFFFFF mov eax, dword ptr [ebp+FFFFFF14]
:0052420F E8902EF3FF call 004570A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00524202(C)
|
:00524214 8B8514FFFFFF mov eax, dword ptr [ebp+FFFFFF14]
:0052421A E8752AF3FF call 00456C94

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005241EE(C)
|
:0052421F 8B8514FFFFFF mov eax, dword ptr [ebp+FFFFFF14]
:00524225 E842EDEDFF call 00402F6C
:0052422A 8B45FC mov eax, dword ptr [ebp-04]
:0052422D 8B8060040000 mov eax, dword ptr [eax+00000460]
:00524233 33D2 xor edx, edx
:00524235 E86ED4F0FF call 004316A8
:0052423A B8283F5500 mov eax, 00553F28

* Possible StringData Ref from Code Obj ->"未注册"
|
:0052423F BA18705200 mov edx, 00527018 <--双击“未注册”后来到这，然后往上翻，看看
:00524244 E8C3FAEDFF call 00403D0C 有没有与之相关的跳转语句
:00524249 EB5F jmp 005242AA

//-----------------------------------------------------------------------------------------------

:00518130 55 push ebp <--点了"Call"以后来到这，然后往下翻
:00518131 8BEC mov ebp, esp
:00518133 81C48CFEFFFF add esp, FFFFFE8C
:00518139 53 push ebx
:0051813A 56 push esi
:0051813B 33D2 xor edx, edx

//-----------------------------------------------------------------------------------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00518370(C), :0051837C(C)
|
:005183A9 8B95A0FEFFFF mov edx, dword ptr [ebp+FFFFFEA0]

* Possible StringData Ref from Code Obj ->"cr-wom" <--看着有点眼熟
|
:005183AF B8B8865100 mov eax, 005186B8
:005183B4 E86BBEEEFF call 00404224 <--判断当前目录下是否有含"cr-wom"的文件名
:005183B9 85C0 test eax, eax
:005183BB 742B je 005183E8 <--EAX为1的话就GAME OVER了
:005183BD 8B45FC mov eax, dword ptr [ebp-04]
:005183C0 8B80D0070000 mov eax, dword ptr [eax+000007D0]

* Possible StringData Ref from Code Obj ->"Windows优化大师 V3.53 (未注册)"
|
:005183C6 BA48865100 mov edx, 00518648
:005183CB E8F093F1FF call 004317C0
:005183D0 8BC6 mov eax, esi
:005183D2 E8BDE8F3FF call 00456C94
:005183D7 8BC6 mov eax, esi
:005183D9 E88EABEEFF call 00402F6C
:005183DE BB01000000 mov ebx, 00000001
:005183E3 E9CA010000 jmp 005185B2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005183BB(C)
|

* Possible StringData Ref from Code Obj ->"Windowsyhds.exe" <--看着更加眼熟了
|
:005183E8 B8C8865100 mov eax, 005186C8
:005183ED E8460DEFFF call 00409138 <--判断判断当前目录下是否有含"Windowsyhds.exe"
:005183F2 84C0 test al, al 的文件名
:005183F4 751C jne 00518412 <--al为1的话就GAME OVER了

* Possible StringData Ref from Code Obj ->"fwd.txt"
|
:005183F6 B8E0865100 mov eax, 005186E0
:005183FB E8380DEFFF call 00409138 <--判断判断当前目录下是否有含"fwd.txt"的文件名
:00518400 84C0 test al, al
:00518402 750E jne 00518412 <--al为1的话就GAME OVER了

* Possible StringData Ref from Code Obj ->"wom29a_k.exe"
|
:00518404 B8F0865100 mov eax, 005186F0
:00518409 E82A0DEFFF call 00409138 <--判断判断当前目录下是否有含"wom29a_k.exe"的文
:0051840E 84C0 test al, al 件名
:00518410 742B je 0051843D <--al为1的话就GAME OVER了

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005183F4(C), :00518402(C)
|
:00518412 8B45FC mov eax, dword ptr [ebp-04]
:00518415 8B80D0070000 mov eax, dword ptr [eax+000007D0]

* Possible StringData Ref from Code Obj ->"Windows优化大师 V3.53 (未注册)"
|
:0051841B BA48865100 mov edx, 00518648
:00518420 E89B93F1FF call 004317C0
:00518425 8BC6 mov eax, esi
:00518427 E868E8F3FF call 00456C94
:0051842C 8BC6 mov eax, esi
:0051842E E839ABEEFF call 00402F6C
:00518433 BB01000000 mov ebx, 00000001
:00518438 E975010000 jmp 005185B2

综上所述，我们可以得出一个结论：那就是只要该软件目录下有包含"cr-wom"字符串的注册机文件名或者是以下三种文件名"Windowsyhds.exe"、"fwd.txt"、"wom29a_k.exe"的一种就变成未注册的了，解决的办法就是把注册机移到其他的目录下，或者把注册机改名即可。


WinHex9.9 sr-3

 标 题:WinHex9.9 sr-3 ，我跟踪了好久的结果~~ (15千字)
发信人:ydmis
时 间:2001-7-2 16:03:01
详细信息:
用user.txt使winhex认为已注册……
:004585C0 803C2400 cmp byte ptr [esp], 00
:004585C4 7412 je 004585D8
:004585C6 8B4610 mov eax, dword ptr [esi+10]
:004585C9 B201 mov dl, 01
:004585CB E85C43FBFF call 0040C92C
:004585D0 84C0 test al, al <-从提示是否更新文件的提示框中出来
:004585D2 0F84DF000000 je 004586B7

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004585B5(C), :004585BE(C), :004585C4(C)
|
:004585D8 DF6E14 fild qword ptr [esi+14]
:004585DB D81DC4864500 fcomp dword ptr [004586C4]
:004585E1 DFE0 fstsw ax
:004585E3 9E sahf
:004585E4 760D jbe 004585F3
:004585E6 803DE352460000 cmp byte ptr [004652E3], 00
:004585ED 0F84C4000000 je 004586B7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004585E4(C)
|

* Possible Reference to Menu: MenuID_0002
|
:004585F3 6A02 push 00000002
:004585F5 668B864C210000 mov ax, word ptr [esi+0000214C]
:004585FC E8CB55FBFF call 0040DBCC <-这个是生成TMP文件的CALL
:00458601 8BD0 mov edx, eax
:00458603 8B4E10 mov ecx, dword ptr [esi+10]
:00458606 8D4608 lea eax, dword ptr [esi+08]
:00458609 E80E05FCFF call 00418B1C <-这个是写入文件的CALL
:0045860E 84C0 test al, al
:00458610 0F84A1000000 je 004586B7
:00458616 807E3A03 cmp byte ptr [esi+3A], 03
:0045861A 750D jne 00458629
:0045861C A0364B4600 mov al, byte ptr [00464B36]
:00458621 888671210000 mov byte ptr [esi+00002171], al
:00458627 EB26 jmp 0045864F

------------------------------------------------------------------------
下面是写文件的CALL内……
:00418B1C 55 push ebp
:00418B1D 8BEC mov ebp, esp
:00418B1F 51 push ecx
:00418B20 53 push ebx
:00418B21 56 push esi
:00418B22 57 push edi
:00418B23 8BF1 mov esi, ecx
:00418B25 8955FC mov dword ptr [ebp-04], edx
:00418B28 8BF8 mov edi, eax
:00418B2A 807F3203 cmp byte ptr [edi+32], 03 <--这个是当未注册时，文件小于250K的就在就进入，否则跳……
:00418B2E 752D jne 00418B5D
:00418B30 8D471C lea eax, dword ptr [edi+1C]
:00418B33 50 push eax
:00418B34 8A4D08 mov cl, byte ptr [ebp+08]
:00418B37 8BD6 mov edx, esi
:00418B39 8B45FC mov eax, dword ptr [ebp-04]
:00418B3C E85BF4FFFF call 00417F9C <--这个是写入文件小于250K的CALL，大老兄可能是用这个CALL作写入文件的
:00418B41 84C0 test al, al
:00418B43 0F94C3 sete bl
:00418B46 834F2020 or dword ptr [edi+20], 00000020
:00418B4A 8B4720 mov eax, dword ptr [edi+20]
:00418B4D 83C820 or eax, 00000020
:00418B50 50 push eax
:00418B51 684C564600 push 0046564C

* Reference To: kernel32.SetFileAttributesA, Ord:0000h
|
:00418B56 E869BEFEFF Call 004049C4
:00418B5B EB7D jmp 00418BDA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418B2E(C)
|
:00418B5D 33DB xor ebx, ebx
:00418B5F 56 push esi
:00418B60 8B4708 mov eax, dword ptr [edi+08]
:00418B63 50 push eax

* Reference To: kernel32.lstrcmpiA, Ord:0000h
|
:00418B64 E82BBFFEFF Call 00404A94
:00418B69 85C0 test eax, eax
:00418B6B 7413 je 00418B80
:00418B6D 6A00 push 00000000
:00418B6F 8B4708 mov eax, dword ptr [edi+08]
:00418B72 8A4D08 mov cl, byte ptr [ebp+08]
:00418B75 8BD6 mov edx, esi
:00418B77 E820F4FFFF call 00417F9C <-作另存为写入的CALL，
:00418B7C 84C0 test al, al
:00418B7E 755A jne 00418BDA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418B6B(C)
|
:00418B80 807F3300 cmp byte ptr [edi+33], 00
:00418B84 742C je 00418BB2
:00418B86 E8A5F1FFFF call 00417D30 <-这个CALL是判断注册码是否正确的CALL，所有判断是否注册正确都会进入417D30的！
:00418B8B 84C0 test al, al
:00418B8D 744B je 00418BDA
:00418B8F B9C05A4600 mov ecx, 00465AC0
:00418B94 8BD6 mov edx, esi
:00418B96 8B45FC mov eax, dword ptr [ebp-04]
:00418B99 E876E9FFFF call 00417514 <-这个我想是当上面的CALL判断正确后，这段程序是作写入文件的CALL，但现在一进入会出错！
:00418B9E 85C0 test eax, eax
:00418BA0 740C je 00418BAE
:00418BA2 BAC05A4600 mov edx, 00465AC0
:00418BA7 E85C15FFFF call 0040A108
:00418BAC EB2C jmp 00418BDA

---------------------------------------------------------------
下面是判断注册码是否正确的CALL内的程序
:00417D30 53 push ebx
:00417D31 56 push esi
:00417D32 81C408F9FFFF add esp, FFFFF908
:00417D38 33DB xor ebx, ebx
:00417D3A A178ED4500 mov eax, dword ptr [0045ED78]
:00417D3F 05BC060000 add eax, 000006BC
:00417D44 48 dec eax
:00417D45 A3EC534600 mov dword ptr [004653EC], eax
:00417D4A 803DB465460000 cmp byte ptr [004665B4], 00 <-判断这个标记是否已经执行过下面的程序
:00417D51 7407 je 00417D5A
:00417D53 B301 mov bl, 01
:00417D55 E9DF010000 jmp 00417F39

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417D51(C)
|

* Possible Ref to Menu: MenuID_0001, Item: " "
|
:00417D5A 6A1C push 0000001C
:00417D5C 8D442410 lea eax, dword ptr [esp+10]
:00417D60 50 push eax
:00417D61 6800004000 push 00400000

* Reference To: kernel32.VirtualQuery, Ord:0000h
|
:00417D66 E8B9CCFEFF Call 00404A24
:00417D6B 54 push esp

* Possible Ref to Menu: MenuID_0001, Item: "Position markieren Strg+I"
|
:00417D6C 6A40 push 00000040
:00417D6E 8B442420 mov eax, dword ptr [esp+20]
:00417D72 50 push eax
:00417D73 8B442418 mov eax, dword ptr [esp+18]
:00417D77 50 push eax

* Reference To: kernel32.VirtualProtect, Ord:0000h
|
:00417D78 E897CCFEFF Call 00404A14
:00417D7D 85C0 test eax, eax
:00417D7F 0F8497010000 je 00417F1C
:00417D85 8D442439 lea eax, dword ptr [esp+39]
:00417D89 B9BC060000 mov ecx, 000006BC
:00417D8E 8B1578ED4500 mov edx, dword ptr [0045ED78]
:00417D94 E857D3FEFF call 004050F0
:00417D99 E826FEFFFF call 00417BC4
:00417D9E BAB8654600 mov edx, 004665B8
:00417DA3 8D442428 lea eax, dword ptr [esp+28]

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417DA7 B910000000 mov ecx, 00000010
:00417DAC E83FD3FEFF call 004050F0
:00417DB1 6A00 push 00000000
:00417DB3 8D4C242C lea ecx, dword ptr [esp+2C]
:00417DB7 BA08574000 mov edx, 00405708
:00417DBC 33C0 xor eax, eax
:00417DBE E835DCFEFF call 004059F8
:00417DC3 8BF0 mov esi, eax
:00417DC5 6A00 push 00000000
:00417DC7 8D54243D lea edx, dword ptr [esp+3D]
:00417DCB B9BC060000 mov ecx, 000006BC
:00417DD0 8BC6 mov eax, esi
:00417DD2 E80DDDFEFF call 00405AE4 <-这个CALL是得到将注册信息转为程序的CALL

* Possible Ref to Menu: MenuID_0001, Item: "Hex-Werte Strg+Shift+C"
|
:00417DD7 BA2C000000 mov edx, 0000002C
:00417DDC 8BC6 mov eax, esi
:00417DDE E8B1A7FEFF call 00402594
:00417DE3 8D442428 lea eax, dword ptr [esp+28]

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417DE7 BA10000000 mov edx, 00000010
:00417DEC E807D3FEFF call 004050F8
:00417DF1 B8B8654600 mov eax, 004665B8

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417DF6 BA10000000 mov edx, 00000010
:00417DFB E8F8D2FEFF call 004050F8
:00417E00 8D442408 lea eax, dword ptr [esp+08]
:00417E04 50 push eax
:00417E05 68BC060000 push 000006BC
:00417E0A 8D442441 lea eax, dword ptr [esp+41]
:00417E0E 50 push eax
:00417E0F A178ED4500 mov eax, dword ptr [0045ED78]
:00417E14 50 push eax

* Reference To: kernel32.GetCurrentProcess, Ord:0000h
|
:00417E15 E822CAFEFF Call 0040483C
:00417E1A 50 push eax

* Reference To: kernel32.WriteProcessMemory, Ord:0000h
|
:00417E1B E82CCCFEFF Call 00404A4C <-这个是将注册信息转为程序，再将其写入自身的程序中……这段程序可能是作写入文件的程序
:00417E20 85C0 test eax, eax
:00417E22 0F84F4000000 je 00417F1C
:00417E28 817C2408BC060000 cmp dword ptr [esp+08], 000006BC
:00417E30 0F85E6000000 jne 00417F1C

* Possible Ref to Menu: MenuID_0001, Item: "einf黦en... Strg+V"
|
:00417E36 6A20 push 00000020
:00417E38 68B8514600 push 004651B8
:00417E3D 8D442441 lea eax, dword ptr [esp+41]
:00417E41 50 push eax

* Reference To: kernel32.lstrcpynA, Ord:0000h
|
:00417E42 E855CCFEFF Call 00404A9C
:00417E47 8D442428 lea eax, dword ptr [esp+28]

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417E4B BA10000000 mov edx, 00000010
:00417E50 E8A3D2FEFF call 004050F8

* Possible StringData Ref from Data Obj ->"Offset"
|
:00417E55 BAE4E14500 mov edx, 0045E1E4
:00417E5A 8D442428 lea eax, dword ptr [esp+28]
:00417E5E E899D3FEFF call 004051FC
:00417E63 6A00 push 00000000
:00417E65 8D4C242C lea ecx, dword ptr [esp+2C]
:00417E69 BA08574000 mov edx, 00405708
:00417E6E 33C0 xor eax, eax
:00417E70 E883DBFEFF call 004059F8
:00417E75 8BF0 mov esi, eax
:00417E77 6A00 push 00000000
:00417E79 8D54243D lea edx, dword ptr [esp+3D]

* Possible Ref to Menu: MenuID_0001, Item: "einf黦en... Strg+V"
|
:00417E7D B920000000 mov ecx, 00000020
:00417E82 8BC6 mov eax, esi
:00417E84 E85BDCFEFF call 00405AE4

* Possible Ref to Menu: MenuID_0001, Item: "Hex-Werte Strg+Shift+C"
|
:00417E89 BA2C000000 mov edx, 0000002C
:00417E8E 8BC6 mov eax, esi
:00417E90 E8FFA6FEFF call 00402594
:00417E95 8D442428 lea eax, dword ptr [esp+28]

* Possible Ref to Menu: MenuID_0001, Item: "Sicherung laden..."
|
:00417E99 BA10000000 mov edx, 00000010
:00417E9E E855D2FEFF call 004050F8
:00417EA3 8D442408 lea eax, dword ptr [esp+08]
:00417EA7 50 push eax

* Possible Ref to Menu: MenuID_0001, Item: "einf黦en... Strg+V"
|
:00417EA8 6A20 push 00000020
:00417EAA 8D442441 lea eax, dword ptr [esp+41]
:00417EAE 50 push eax
:00417EAF A178ED4500 mov eax, dword ptr [0045ED78]
:00417EB4 05A0010000 add eax, 000001A0
:00417EB9 50 push eax

* Reference To: kernel32.GetCurrentProcess, Ord:0000h
|
:00417EBA E87DC9FEFF Call 0040483C
:00417EBF 50 push eax

* Reference To: kernel32.WriteProcessMemory, Ord:0000h
|
:00417EC0 E887CBFEFF Call 00404A4C <-这段写入自身的程序可能是作写入内存的程序
:00417EC5 8D442439 lea eax, dword ptr [esp+39]
:00417EC9 BABC060000 mov edx, 000006BC
:00417ECE E825D2FEFF call 004050F8
:00417ED3 8D442404 lea eax, dword ptr [esp+04]
:00417ED7 50 push eax
:00417ED8 8B442404 mov eax, dword ptr [esp+04]
:00417EDC 50 push eax
:00417EDD 8B442420 mov eax, dword ptr [esp+20]
:00417EE1 50 push eax
:00417EE2 8B442418 mov eax, dword ptr [esp+18]
:00417EE6 50 push eax

* Reference To: kernel32.VirtualProtect, Ord:0000h
|
:00417EE7 E828CBFEFF Call 00404A14
:00417EEC 8B442418 mov eax, dword ptr [esp+18]
:00417EF0 50 push eax
:00417EF1 8B442410 mov eax, dword ptr [esp+10]
:00417EF5 50 push eax

* Reference To: kernel32.GetCurrentProcess, Ord:0000h
|
:00417EF6 E841C9FEFF Call 0040483C
:00417EFB 50 push eax

* Reference To: kernel32.FlushInstructionCache, Ord:0000h
|
:00417EFC E81BC9FEFF Call 0040481C
:00417F01 C605B465460001 mov byte ptr [004665B4], 01 <-给个标记表明已经更改过自身的程序
:00417F08 A178ED4500 mov eax, dword ptr [0045ED78]
:00417F0D 05BC060000 add eax, 000006BC
:00417F12 48 dec eax
:00417F13 803800 cmp byte ptr [eax], 00
:00417F16 7504 jne 00417F1C
:00417F18 B301 mov bl, 01
:00417F1A EB1D jmp 00417F39

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417D7F(C), :00417E22(C), :00417E30(C), :00417F16(C)
|

* Possible StringData Ref from Data Obj ->"f4"
|
:00417F1C B8E0EB4500 mov eax, 0045EBE0
:00417F21 E8665CFFFF call 0040DB8C
:00417F26 B8C05A4600 mov eax, 00465AC0
:00417F2B E86059FFFF call 0040D890 <-查找user.txt文件是否存在
:00417F30 84C0 test al, al
:00417F32 7405 je 00417F39
:00417F34 E8BF18FFFF call 004097F8 <-提示出错信息“Invalid file: user.txt”

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00417D55(U), :00417F1A(U), :00417F32(C)
|
:00417F39 8BC3 mov eax, ebx
:00417F3B 81C4F8060000 add esp, 000006F8
:00417F41 5E pop esi
:00417F42 5B pop ebx
:00417F43 C3 ret


欧阳电子商务信使 V6.0

 标 题:一个简单的keyfile保护的破解 (3千字)
发信人:copyyour[CCG]
时 间:2001-6-15 15:07:07
详细信息:
欧阳电子商务信使 (oymailman) V6.0
http://www.skycn.com/down1.php?id=5158&url=http://202.107.104.34/soft/down/oymailman.exe

通过网络向目标客户发送商业资讯电邮或电子杂志，可明送邮件也支持BCC高速暗送和多线程发送，收件人看不到别人的邮件地址。支持附件发送，列表发送中断后可保存断点以便续发。目标客户列表电邮数量不受限制，采用高速发送每小时可发送电邮达100000封。邮件信体支持文本文件和网页两种格式。只需填入您的网站或网页地址，软件自动完成超文本编码发送，让您的网站访问量以几何数字增长。您可以选择中文或西文字符编码，以满足不同的国内外客户阅读需要。一款不可多得的邮件高速群发软体。

这个软件好象应该是keyfile保护的。我把在破解这个软件的过程详细的写出来了，希望出学者能看看，其实也很简单的，我搞了3天是因为自己经验不够，呵呵，下次不会了，

工具：soft-ice 4.05 自己用的话就这一个工具就够了，如果要发布就还需要 w32dasm以及hiew 还有就是脱壳的unpack呵呵， 我手动不会，只好自动了

开启软件，点击电子注册，输入copyyour（自己喜欢）然后唤出soft-ice 就是ctrl+d 然后下断点bpx hmemcpy(最常用的。我也只知道这一个:-( ) 然后就要辛苦的按F12了，一共是58次（59次的时候会出现出错框）这是好来到下面这些地方，我慢慢地给大家说说，（等等，先喝一口百事可乐，不干喝可口可乐了:-( )

:004B4299 3C01 cmp al, 01 =====>按58次f12后来到这里，按F10向下跟踪
:004B429B 0F8528010000 jne 004B43C9
:004B42A1 8B45FC mov eax, dword ptr [ebp-04]
:004B42A4 BA30444B00 mov edx, 004B4430 ========这里打 d eax 将会看见我输入的copyyour
:004B42A9 E8B6FDF4FF call 00404064 ========注意这里★ 软件给出一个假的注册码 oymailmanxxxxxx，你用假注册码输入后会跳出“请联系代理商，购买正版软件” 下 d edx 还将看到软件要检查 目录下面是否有oymailman.key这个文件 关键哟！！
:004B42AE 0F8500010000 jne 004B43B4 =======没有oymialman.key 就跳到后面的call也是弹出“请联系代理商，购买正版软件” 值得注意的是，软件每次启动都会进行检查，如果你没有这个key 即使你改了跳，都会出现“请联系代理商，购买正版软件”而且软件不能启动！！
:004B42B4 8D55F4 lea edx, dword ptr [ebp-0C]
:004B42B7 A1E8854B00 mov eax, dword ptr [004B85E8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B4243(C)
|
:004B42BC 8B00 mov eax, dword ptr [eax]
:004B42BE E86994F9FF call 0044D72C
:004B42C3 8B45F4 mov eax, dword ptr [ebp-0C]
:004B42C6 8D55F8 lea edx, dword ptr [ebp-08]
:004B42C9 E8C651F5FF call 00409494
:004B42CE 8B55F8 mov edx, dword ptr [ebp-08]
:004B42D1 B8889B4B00 mov eax, 004B9B88
:004B42D6 B954444B00 mov ecx, 004B4454
:004B42DB E8C0FCF4FF call 00403FA0
:004B42E0 A1889B4B00 mov eax, dword ptr [004B9B88]
:004B42E5 E80251F5FF call 004093EC
:004B42EA 84C0 test al, al
:004B42EC 0F849C000000 je 004B438E =======比较是否是正确的注册码 可能在上面的一个call里面进行计算，我没有追了
:004B42F2 6A00 push 00000000
:004B42F4 668B0D64444B00 mov cx, word ptr [004B4464]
:004B42FB B202 mov dl, 02
:004B42FD B870444B00 mov eax, 004B4470
:004B4302 E8EDE4F9FF call 004527F4 ======正确注册！！！！

好了，代码分析到此结束，我们开始给这个软件动手术了！

首先要制作一个oymailman.key 怎样制作？？我很苯的，是在dos下面用一个文本文件改的 唉 c:\rename 1.txt oymailman.key 就这样了

然后放到 软件目录里面去了，再次重复刚才的分析过程

:004B42AE 0F8500010000 jne 004B43B4 在这里执行 r fl z 呵呵，这是kanker 大哥教我的 好象对jnz jz 等等都有很好的疗效！！

这样改了以后就一直f10 或者直接g出来，注册成功了！！哈哈再次启动软件 ，软件的注册栏就变成灰色的了
哈哈，

这就是一个简单的keyfile保护吗？
我也不清楚，呵呵。谢谢你的观看，这个软件的其他系列同理可解 要听copyyour的下次破程（破解过程）请给我一点掌声！呵呵，谢谢你！

cracked by copyyour[CCG]
cracked by copyyour[BCG]
好想进入[FCG]不知道有什么条件？


Audio Converter 3.0

标 题:Audio Converter 3.0 破解要点(1千字)
发信人:lijing
时 间:2001-1-7 12:27:25
详细信息:

1、该软件在输入注册码时只是检查注册码的格式：注册码26位，其中第6位为"-"，其它位不检测。输入的注册码存入注册表[HKEY_USERS\.DEFAULT\Software\Dennisre.com\Audio Converter\Settings]
"LicenseeInfo"中。

2、反编译主程序，查找字符串"LicenseeInfo"的位置，我找到的是00405EEB。
下断点bpx 00405EEB，并重新启动audconv.exe，会被trw2000拦载。走不远，会来到：
:0040633F 8D4C2408 lea ecx, dword ptr [esp+08] ; ecx指向假的注册码
:00406343 8D542404 lea edx, dword ptr [esp+04]
:00406347 51 push ecx
:00406348 52 push edx
:00406349 8D4C2408 lea ecx, dword ptr [esp+08]
:0040634D E81EFAFFFF call 00405D70 ; 这里是关键，打F8进入！
:00406352 85C0 test eax, eax
:00406354 7507 jne 0040635D
:00406356 81C438030000 add esp, 00000338
:0040635C C3 ret

3、进入call 00405D70后，走不远会来到：
:00405E60 E87BFDFFFF call 00405BE0 ; 计算核心，你可以看一看。
:00405E65 3B442414 cmp eax, dword ptr [esp+14] ; 比较1
:00405E69 754C jne 00405EB7
:00405E6B 3B542418 cmp edx, dword ptr [esp+18] ; 比较2
:00405E6F 7546 jne 00405EB7
:00405E71 8D442424 lea eax, dword ptr [esp+24]
:00405E75 50 push eax

只要上面两处比较相等，即可注册成功。

4、修改方法：用UltraEdit打开audconv.exe。
查找：3B442414754C3B5424187546
改为：--------74----------74--

即可成为任意注册版。

标 题:这里。 (739字)
发信人:lijing
时 间:2001-1-7 14:52:02
详细信息:

:0040264B 83F905 cmp ecx, 00000005
:0040264E 7508 jne 00402658
:00402650 807DD92D cmp byte ptr [ebp-27], 2D ; 是这里
:00402654 7411 je 00402667
:00402656 EB0C jmp 00402664
:00402658 8A440DD4 mov al, byte ptr [ebp+ecx-2C]
:0040265C 3C30 cmp al, 30
:0040265E 7C04 jl 00402664
:00402660 3C39 cmp al, 39
:00402662 7E03 jle 00402667
:00402664 895DF8 mov dword ptr [ebp-08], ebx
:00402667 41 inc ecx
:00402668 83F91A cmp ecx, 0000001A
:0040266B 7CDE jl 0040264B

标 题:PeterChen兄请看:Audio Converter v3.0beta的License破解 (11千字)
发信人:superboss
时 间:2001-1-9 18:27:24
详细信息:

Audio Converter 的破解
版本:3.0beta
工具:TRW2000和Wdasm 8.93
目标说明:一个可以将声音文件或 CD音轨转换为 WAV、MP3 或 WMA 格式的工具
下载地址:http://www.cnvnet.com/download/d/audc30b.exe
难度：中级?
===========================================================================
运行程序，输入User Name:sUpErbOss Company Name:Super Co. Number of Licenses:1
Registration Key:11223-44556677889900197678，点击“完成”按钮。
这时，程序会再注册表中生成一个名为"LicenseeInfo"的键值，里面保存有刚才输入的注册信息。
程序启动时，会读取这个键，来判断注册是否成功!
用TRW2000加载Audio Converter，进入程序起始处后，打BPX REGQUERYVALUEEXA，会中断好几次!
按几次F12键，回到Audio Converter模组下，直到下面所指的重点处：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406336(C)
|
:0040633F 8D4C2408 lea ecx, dword ptr [esp+08]
:00406343 8D542404 lea edx, dword ptr [esp+04]
:00406347 51 push ecx
:00406348 52 push edx
:00406349 8D4C2408 lea ecx, dword ptr [esp+08]
:0040634D E81EFAFFFF call 00405D70 <----关键
:00406352 85C0 test eax, eax <--eax=1,则注册成功!
:00406354 7507 jne 0040635D
:00406356 81C438030000 add esp, 00000338
:0040635C C3 ret
==============================================================
* Referenced by a CALL at Addresses:
|:00401157 , :0040634D
|
:00405D70 83EC64 sub esp, 00000064
:00405D73 8B442468 mov eax, dword ptr [esp+68]
:00405D77 53 push ebx

* Reference To: KERNEL32.lstrlenA, Ord:0335h
|
:00405D78 8B1D88D04100 mov ebx, dword ptr [0041D088]
:00405D7E 55 push ebp
:00405D7F 56 push esi
:00405D80 8B742478 mov esi, dword ptr [esp+78]
:00405D84 57 push edi
:00405D85 8BF9 mov edi, ecx
:00405D87 56 push esi
:00405D88 C70000000000 mov dword ptr [eax], 00000000

* Possible Reference to String Resource ID=00002: "(Unknown)"
|
:00405D8E C744243802000000 mov [esp+38], 00000002

* Possible Reference to String Resource ID=00042: "Normalization"
|
:00405D96 C744243C2A000000 mov [esp+3C], 0000002A
:00405D9E C74424400A000000 mov [esp+40], 0000000A

* Possible Reference to String Resource ID=00014: "Output File"
|
:00405DA6 C74424440E000000 mov [esp+44], 0000000E
:00405DAE C74424483A000000 mov [esp+48], 0000003A

* Possible Reference to String Resource ID=00022: "Value"
|
:00405DB6 C744244C16000000 mov [esp+4C], 00000016
:00405DBE C744245032000000 mov [esp+50], 00000032

* Possible Reference to String Resource ID=00030: "Unable to get the audio CD."
|
:00405DC6 C74424541E000000 mov [esp+54], 0000001E

* Possible Reference to String Resource ID=00034: "The output format of the selected items has no output settin"
|
:00405DCE C744245822000000 mov [esp+58], 00000022

* Possible Reference to String Resource ID=00038: "Audio CD"
|
:00405DD6 C744245C26000000 mov [esp+5C], 00000026
:00405DDE C744246006000000 mov [esp+60], 00000006
:00405DE6 C74424642E000000 mov [esp+64], 0000002E

* Possible Reference to String Resource ID=00026: "Unlicensed.

For evaluation purposes only, the fully funct"
|
:00405DEE C74424681A000000 mov [esp+68], 0000001A
:00405DF6 C744246C36000000 mov [esp+6C], 00000036

* Possible Reference to String Resource ID=00018: "A drive to play audio cds has not been found on your system."
|
:00405DFE C744247012000000 mov [esp+70], 00000012
:00405E06 C74424743E000000 mov [esp+74], 0000003E
:00405E0E FFD3 call ebx
:00405E10 83F805 cmp eax, 00000005 <----比对第六位上是否为"-"
:00405E13 0F859E000000 jne 00405EB7
:00405E19 8D6E06 lea ebp, dword ptr [esi+06]
:00405E1C 55 push ebp
:00405E1D FFD3 call ebx
:00405E1F 83F814 cmp eax, 00000014 <---比对"-"后的字符数是否为20
:00405E22 0F858F000000 jne 00405EB7
:00405E28 56 push esi
:00405E29 E88CE40000 call 004142BA
:00405E2E 55 push ebp
:00405E2F 8BD8 mov ebx, eax
:00405E31 E88FE40000 call 004142C5
:00405E36 83C408 add esp, 00000008
:00405E39 8D4C2434 lea ecx, dword ptr [esp+34]
:00405E3D 89542418 mov dword ptr [esp+18], edx
:00405E41 8D542414 lea edx, dword ptr [esp+14]
:00405E45 51 push ecx
:00405E46 53 push ebx
:00405E47 52 push edx
:00405E48 8BCF mov ecx, edi
:00405E4A 89442420 mov dword ptr [esp+20], eax
:00405E4E E87DFEFFFF call 00405CD0
:00405E53 83C61C add esi, 0000001C
:00405E56 6814030000 push 00000314
:00405E5B 56 push esi
:00405E5C 8BCF mov ecx, edi
:00405E5E 8BD8 mov ebx, eax <----bx的值
:00405E60 E87BFDFFFF call 00405BE0 <----算注册码！！关键Call！
:00405E65 3B442414 cmp eax, dword ptr [esp+14] <---核心比对处(1)
:00405E69 754C jne 00405EB7
:00405E6B 3B542418 cmp edx, dword ptr [esp+18] <---核心比对处(2)
:00405E6F 7546 jne 00405EB7
:00405E71 8D442424 lea eax, dword ptr [esp+24]
:00405E75 50 push eax

* Reference To: KERNEL32.GetSystemTime, Ord:0174h
|
:00405E76 FF1574D04100 Call dword ptr [0041D074]
:00405E7C 8D4C241C lea ecx, dword ptr [esp+1C]
:00405E80 8D542424 lea edx, dword ptr [esp+24]
:00405E84 51 push ecx
:00405E85 52 push edx

* Reference To: KERNEL32.SystemTimeToFileTime, Ord:02C8h
|
:00405E86 FF15A8D04100 Call dword ptr [0041D0A8]
:00405E8C 8D442412 lea eax, dword ptr [esp+12]
:00405E90 8D4C247C lea ecx, dword ptr [esp+7C]
:00405E94 50 push eax
:00405E95 8D542420 lea edx, dword ptr [esp+20]
:00405E99 51 push ecx
:00405E9A 52 push edx

* Reference To: KERNEL32.FileTimeToDosDateTime, Ord:0097h
|
:00405E9B FF15B0D04100 Call dword ptr [0041D0B0]
:00405EA1 6685DB test bx, bx <----必须满足bx=0
:00405EA4 741D je 00405EC3
:00405EA6 663B5C247C cmp bx, word ptr [esp+7C] <---或满足bx≥(esp+75)所指向的值
:00405EAB 7316 jnb 00405EC3

==============================================================
* Referenced by a CALL at Address:
|:00405E60
|
:00405BE0 83EC08 sub esp, 00000008
:00405BE3 8B4C2410 mov ecx, dword ptr [esp+10]
:00405BE7 53 push ebx
:00405BE8 8BC1 mov eax, ecx
:00405BEA 55 push ebp
:00405BEB 56 push esi
:00405BEC 8B742418 mov esi, dword ptr [esp+18]
:00405BF0 C1E803 shr eax, 03
:00405BF3 57 push edi
:00405BF4 33ED xor ebp, ebp
:00405BF6 33D2 xor edx, edx
:00405BF8 8BF8 mov edi, eax
:00405BFA 48 dec eax
:00405BFB 89542414 mov dword ptr [esp+14], edx
:00405BFF 85FF test edi, edi
:00405C01 7414 je 00405C17
:00405C03 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405C11(C)
|
:00405C04 8B3E mov edi, dword ptr [esi]
:00405C06 83C608 add esi, 00000008
:00405C09 33EF xor ebp, edi <---注意ebp的值---
:00405C0B 8B7EFC mov edi, dword ptr [esi-04] |--->根据这两个值对注册表相应的位置的值进行更改!
:00405C0E 33D7 xor edx, edi <---注意edx的值---
:00405C10 48 dec eax
:00405C11 75F1 jne 00405C04
:00405C13 89542414 mov dword ptr [esp+14], edx
=============================================================
下面附上导出的正确的License:

REGEDIT4

[HKEY_CURRENT_USER\Software\DennisRe\Audio Converter 3.0\Settings]
"LicenseeInfo"=hex:31,31,32,32,33,00,34,34,35,35,36,36,37,37,38,38,39,39,30,30,\
31,39,37,36,37,38,00,00,41,75,64,69,6f,20,43,6f,6e,76,65,72,74,65,72,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,73,55,70,45,72,42,6f,\
73,73,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,53,75,70,65,72,20,43,6f,2e,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,14,6e,5f,6b,0e,83,1e,66,01,00,00,00,00,00,00,00
| | | | | | | |
----------------------
改动后的数据(原来均为00)


Matcom 4.0 for BC

标 题:我的破解心得(11) (9千字)
发信人:chcw
时 间:2001-3-13 18:12:04
详细信息:
破解程序：
Matcom 4.0 for BC

破解工具：
SoftICE 3.0 For Windows 95
W32DASM 8.5

破解者：
chcw

Matcom的评估版有时间限制，下面我们将破解掉Matcom的这个功能限制。

1. 在时间限制过了之后，运行Matcom，程序提示"error, MIDEVA, License expired",记下这个错误信息。
2. 用W32Dasm反汇编Mideva.exe，在Refs/String Data References中查找在上一步中记下的错误信息：
"License expired"。
3. 用鼠标双击该字符串，并关掉SDR窗口。此时，亮条停留在00429367处：

* Possible StringData Ref from Data Obj -> "License expired"
|
:00429367 B8116C5000 mov eax, 00506C11 <-亮条所在处

4. 从亮条所在处向上找，可以发现在地址:00429315处有一条跳转语句，这是一个跳转表：
:00429315 FF24851C934200 jmp dword ptr [4*eax+0042931C] <-0042931C是一个跳转地址表
eax==5时，跳转到:00429367处执行

继续向上找，可以发现这是一个子程序：
* Referenced by a CALL at Addresses:
|:00416913 , :00429E72
|
:0042930A 55 push ebp
在入口处可以找到调用该子程序的语句为:00416913，:00429E72。看来，在Matcom的程序
中，可能有多处对时间的期限进行检查。
5. 选择Goto/Goto Location，键入地址00416913，按"OK"后，亮条将停留在地址00416913处：
:00416913 E8F2290100 call 0042930A
从该语句处向上找，可以发现在执行该语句前有一个条件跳转：
:004168F1 E83F320100 call 00429B35
...
:004168FF 83BD74ECFFFF00 cmp dword ptr [ebp+FFFFEC74], 00000000
:00416906 7E1C jle 00416924
而函数00429B35很可能与判断时间是否过期有关。
6. 选择Goto/Goto Location，键入地址00429E72，按"OK"后，亮条将停留在地址00429E72处：
:00429E67 FFB150020000 push dword ptr [ecx+00000250] <- 输入错误码
:00429E6D 6890CA5100 push 0051CA90
:00429E72 E893F4FFFF call 0042930A
从该语句处向上找，可以发现在执行该语句前调用了函数00429605
:00429D4E E8B2F8FFFF call 00429605
7. 按下工具栏上的Call按钮，分别对函数00429B35和函数00429605执行文本跳转，观测它们
的可能流程，发现这两个函数都调用了同一个子函数004961D0，由此我们猜想，子函数
004961D0可能是一个检测时间的子函数。
8. 选择Goto/Goto Location，键入地址004961D0，按"OK"后，亮条将停留在地址004961D0处：
* Referenced by a CALL at Addresses:
|:00429655 , :00429B4B
|
:004961D0 55 push ebp
该函数中有一个函数调用KERNEL32.GetLocalTime()读取系统的时间，这证明了我们先前的
猜想。我们可以直接在函数004961D0中进行修改，以实现解除时间限制的目的。但这里我采
用了另一种破解方法。
9. 用SoftICE载入Mideva.exe程序，在函数004961D0处设置断点：
BPX 004961D0
10. 键入'X'命令，程序开始执行，显示完展示画面后，触发SoftICE:
0137:00496208 CALL 00495EA0
键入BC *, 清除原先的断点。按F10, 执行完该程序调用。
11. 继续按F10键，直到0137:00429670处：
0137:00429670 CALL 00429567 <- 调用函数00429567
0137:00429675 ADD ESP, 00000008
0137:00429678 TEST EAX, EAX
0137:0042967A JE 00429A8F
程序调用该函数后，根据其返回值的不同，进行条件跳转。因此有必要对它进行分析。
12. 按F8, 进入该函数：

0137:0042957F CALL 0042949E ; 获取Windows目录
...
0137:00429591 CALL 004831E4 ; 将Windows目录复制到另一缓冲区内。
...
0137:00429599 PUSH 004FF6E8 ; 字符串 "MT_LIC.TXT"
0137:0042959E PUSH [EBP+0C]
0137:004295A1 CALL 00483108 ; 生成MT_LIC.TXT文件的全路径
0137:004295A6 ADD ESP, 00000008
0137:004295A9 PUSH [EBP+0C]
0137:004295AC CALL 0042A5B4 ; 打开MT_LIC.TXT文件

该函数有四处函数调用，连续按F10，执行完这些调用，同时观察调用前的参数和调用后
的返回值。我们可以大致了解到该函数的作用是打开一个在Windows目录下名为MT_LIC.TXT
的文件。
键入BC *, 清除所有断点。按Ctrl-D，执行完原应用程序，退出SoftICE。
13. 文件名"MT_LIC.TXT"很容易使人联想起License, 这很可能是Matcom For BC的注册信息文件。
到Windows目录下，发现并没有mt_lic.txt这个文件，但却有一个mt_eval.txt文件，其内容是：
16/3/1999-17/4/1999-116897682,正是我们填入的Evaluation注册码。由此，我们可
猜想,Matcom For BC程序共有下面两种注册方式:
1.评估注册(Evaluation), 评估注册信息记录在mt_eval.txt文件中，该种注册方式有一
定的时间期限。
2.完全注册，完全注册信息记录在mt_lic.txt文件中，该种注册方式为全功能注册，没有
任何使用上的限制。
Matcom For BC程序的注册流程为:
是 是
Windows目录下有mt_lic.txt吗?----->mt_lic.txt合法吗?---->完全注册成功
| |
| 否 |
| |
否 | 注册失败(显示Corrupt License File)
|
| 是 是
Windows目录下有mt_eval.txt吗?----->mt_eval.txt合法吗?----->评估使用
| |
| 否 |
否 | |
| 若时间格式错误，则显示Wrong Date Format。
| 若超过了评估时间期限，则显示License expired。
提示用户输入评估密码

看来，我们只需构造出正确的mt_lic.txt文件，即可实现完全注册。
14. 用Notepad在Windows目录下创建mt_lic.txt文件，并输入文件的内容为"CHCW9530109"(文件
内容随意，不过最好长一些)。
15. 再次用SoftICE载入Mideva.exe程序，在0137:00429670处设置断点：
BPX 0137:00429670
键入'X'命令，程序执行，触发SoftICE:
0137:00429670 CALL 00429567
键入BC *, 清除原先的断点。按F10, 执行完该调用。在上面我们已经说过，函数00429567的
作用是打开文件mt_lic.txt。在打开文件之后，程序势必要读取文件中的数据。连续按F10键，
到00429691处有一个函数调用:
0137:00429691 CALL 0040BA24
按F10, 执行完该调用。键入：s ds:0 l ffffffff 'CHCW9530109' ，发现文件mt_lic.txt中
的数据"CHCW9530109"已经被读入内存中地址013F:00D17CB4中。
16. 对地址013F:00D17CB4设置断点：
BPM 013F:00D17CB4
17. 键入"X",程序继续执行，触发SoftICE:
0137:00430E49 MOVSX EDX, BYTE PTR [EAX] <-- 触发断点处
0137:00430E4C CMP EDX, 0000000A
...
0137:00430E6C MOV BYTE PTR [ECX], DL <-- 存放至内存地址DS:ECX处
...
0137:00430E9E JL 00430E60 <-- 循环处理所有字符
0137:00430EA0 MOV EAX, DWORD PTR [EBP+0C]
这部分程序的作用将读入内存中的字符串逐个进行处理（去掉\n\r等字符）后，存放到内存
013F:0100AE04处。
18. 键入BC *, 清除原先的断点，并将光标移到0137:00430EA0处，键入"HERE"。跳出上述处理程序，
然后就对目标内存区域再设置断点：
BPM 013F:0100AE04
18. 键入"X",程序继续执行，触发SoftICE:
0137:0048321C MOV EDX, DWORD PTR [EAX] <-- 触发断点处
0137:0048321E ADD EAX, 00000004
这部分程序的作用只是获取字符串"CHCW9530109"的长度。
19. 再键入"X",程序继续执行，又会触发SoftICE:
0137:00429278 PUSH EBP <-- 函数入口点
...
0137:004292DB MOV EDX, DWORD PTR [EBP+10]
0137:004292DE MOV DWORD PTR [EDX], EAX
0137:004292E0 JMP 004292E7
...
0137:00429300 MOV EDX, DWORD PTR [EBP+10]
0137:00429303 AND DWORD PTR [EDX], FFFFFFFF <-- 返回值存放在DS:EDX处
0137:00429306 POP ECX
0137:00429307 POP ECX
0137:00429308 POP EBP
0137:00429309 RET
函数00429278的参数是字符串"CHCW9530109"和串的长度，在对字符串进行某种计算后，返回一
个数值。由于这里计算的方法比较古怪，又看不出它的用意，比较可疑。键入BC *, 清除原先断
点后，我们再对存放返回值的内存区域设置断点：
BPM 013F:0100AE04
20. 再键入"X",程序继续执行，又会触发SoftICE:
0137:00429995 MOV EDX, DWORD PTR [EBP-40] <-- 触发断点处, 该语句将19步中的返回值放入EDX中。
0137:00429998 SUB EDX, DWORD PTR [EBP-44]
0137:0042999B MOV DWORD PTR [EBP-74], EDX
0137:0042999E MOV [EBP-2C], 0014
0137:004299A4 FILD DWORD PTR [EBP-74]
0137:004299A7 FADD DWORD PTR [00429B2D] ;一系列浮点操作
...
0137:004299FE FSTSW AX
0137:00429A00 SAHF
0137:00429A01 JE 00429A32
...
0137:00429A28 MOV DWORD PTR [EBX+00000250], 00000002 ;置错误码为2
0137:00429A32 MOV ECX, DWORD PTR [EBP+08]
在上面的程序段中，我们发现在0137:00429A01处有一句条件跳转je 00429A32，而在跳转的目的地址
处有一条置错误码的语句(在第4步中，我们已经知道，在跳转表中错误码为2是"Corrupted license file")。
看来，在je之前的浮点指令段十分关键。
键入"WF"命令，打开浮点栈窗口。调试浮点指令段，可以知道其大致的操作是：
比较 (X+1) ^ 2 和 (X-1) ^ 2 是否相等（其中X是第19步中的返回值）。
21. 经过简单的运算，即可解出方程(X+1) ^ 2 = (X-1) ^ 2的根是X=0。因此，注册成功的条件之一是字
符串"CHCW9530109"在第19步运算后得到的最后返回值是0。采用我的破解心得(4)中的方法可将第19步
中的子函数00429278截取出来。
分析该子程序（设为f(x)）后，我发现它似乎使用了一个所谓的"不可逆加密"的方法, 即已知
f(x)=0, 却无法解得x的值。唯一的方法是穷举，其复杂度是35^n，是不可解问题。我使用产生式算
法，运算了若干个小时后，以失败告终。
22. 在遗憾之余，我发现Matcom For BC计算评估密码时也会调用函数00429278，参数为
字符串"16/3/1999-17/4/1999-116897682"和长度19, 而参数串的前19个字符恰好为使用期限:
"16/3/1999-17/4/1999"，调用函数后得到的返回值的十进制则恰为116897682。
由上可知，MatCom For BC中评估密码的加密方法是：密码的前一部分为使用期限，以使用期限字符
串为参数，通过函数00429278计算出密码后一部分的数值，组合后即为合法的评估密码。这样，虽然我
们无法实现MatCom For BC的完全注册，但是我们可以根据评估加密方法，随意的改动使用期限。
23. 这样，我就结束了对Matcom For BC的破解。对该程序的注册加密方法，我还是比较满意的，因为它针对
两种不同的注册效果，采用同一种加密方法提供了两种不同难度的加密。而在我的破解心得(5)中所述及
的HyperCam，却对Single User/Unlimited Site License/Unlimited Word-Wide License采用了几
乎完全相同的加密方法，使人破解起来感到索然无味。

附：函数00429278，为简化起见，我已将其改写为C代码。若有网友能用较低的复杂度由返回值反解得该函数
的输入参数，请写信告知与我，谢谢。

--------------------- Function f00429278() -----------------------

unsigned long f00429278(unsigned char *regcode,int len)
{
unsigned char c;
unsigned long extc, result;
result=0xBEEFBEEF;
while (len--) {
c=*regcode;
if (isalpha(c) || isdigit(c)) {
extc=toupper(c);
extc+=256;
if ((long)extc<=1) continue;
do {
if ((result ^ extc) & 1)
result = (result >>1) ^ 0x4C11DB7;
else
result >>=1;
} while ((extc >>= 1) > 1);
}
regcode++;
}
return result;
}
---------------------End of Function f00429278()-----------------------


Tornado2

 标 题:Tornado2之Licence暴力破解 (15千字)
发信人:1212
时 间:2000-10-22 13:33:48
详细信息:
Tornado2之Licence暴力破解

Tornado2是VxWorks开发调试工具,试用期为一个月.
超过试用期需要Licence支持,一个Licence需要$6000~$2000.买了软件,还要花钱,真是!@#$%^&*.

破解如下,希望对大家有用. :)

1.跟踪:
Tornado2的Licence程序主要运行在 ...\\host\\x86-win32\\bin\\tgtsvr.exe(...为Tornado2安装目录)

经过痛苦的跟踪过程,发现008B5236处为判断鉴权是否成功(该地址是在NT4.0+SP5.0中,可能系统
不一样,地址会不一样).跟踪过程就不写了吧.大家都是高手,我的跟踪过程写出来,大家会笑话的.
在跟踪过程中,我犯了很多愚蠢的错误,甚至死了很多次.后来发现都是可以避免的.

008B5236前有一系列CALL,是进行计算的.我曾跟进去,但发现是可能一个DLL.该公司用一个DLL进行运
算,我是不能通过算法破解了,只好暴力破解.

写破解代码可能对大家有一些作用,我将详细介绍.

2.破解思路:
该程序是通过加壳的,壳比较奇怪,我孤陋寡闻,没有见过.
我的想法是,我也可以在程序中加外壳,先获得控制修改代码,在原来壳结束时,作跳转到我的修改代码.
原来程序入口是00426DF5,原来壳的结束位置是00426F33.
1)将程序的入口地址改为00400300
mov ebx,426F33h
mov dword ptr [ebx],0FD93C8E9h
add ebx,4
mov byte ptr [ebx],0FFh
jmp 00426DF5
//以上为将00426F33改为jmp 1111.
1111.为自己代码地址
push ebx
mov ebx,426F33h
mov dword ptr [ebx],535BD0FFh
add ebx,4
mov byte ptr [ebx],81h
//以上为将00426F33改为
{
00426F33 FF D0 call eax
00426F35 5B pop ebx
00426F36 53 push ebx
00426F37 81 EB 2E 0D 00 00 sub ebx,0D2Eh
}
mov ebx,eax
add ebx,0E10Ah
mov dword ptr [ebx],7DEBC033h
//以上将程序改成鉴权成功
{
008B5236 33 C0 xor eax, eax
008B5238 EB 7D jmp 008B52B5
}
sub ebx, 0B7h//ebx=008B517F
mov word ptr [ebx],xxxx
//以上将程序改成98下跳到NT代码中执行
{
008B517F jmp 008B51C5
}
pop ebx
jmp 00426F33

外壳程序详细说明:
1)改变程序的入口地址到自己代码,在自己代码地方写跳转代码.该跳转代码将00426F33处程序改成jmp xxxx.
在该项操作中,需要取硬盘序列号,与jmp xxxx的机器码做xor运算.
取硬盘序列号使用LoadLibrary,GetProcAddress和GetVolumeInformationA.
其中LoadLibrary和GetProcAddress的函数地址需要查原来程序地址.
LoadLibrary = 00426FD0
GetProcAddress = 00426FCA
CALL xxxx = E8 + 偏移(4位)
2)在上面的jmp xxxx的xxxx地方处写代码,改变程序的运行路径.
需要有如下几个具体操作:
(1)将00426F33处还原
(2)改程序为98下也到NT代码中执行
(3)该程序为鉴权成功
3)需要的固定数据:
'KERNEL32.DLL', 0 //13 BYTES,LoadLibraryA用
'GetVolumeInformationA', 0 //22 BYTES,GetProcAddress用
'C:\', 0 //4 BYTES, GetVolumeInformationA用
总共0x27 = 39个BYTE
因此数据从400300开始,代码从00400330开始.

外壳程序实现:
1)将几个固定数据写进文件中:Raw Address = 0x300
00400300 'KERNEL32.DLL', 0
0040030D 'GetVolumeInformationA', 0
00400323 'C:\', 0
00400327 4 BYTE 数据
0040032B 0

2)写跳转代码,将00426F33处程序改成jmp xxxx, Raw Address = 0x330
00400330
00400330 55 push ebp
00400331 8B EC mov ebp,esp
00400333 83 EC 30 sub esp,70h ;实际使用0x22 BYTE
00400336 68 00 03 40 00 push 400300h ;'KERNEL32.DLL'
0040033B E8 90 6C 02 00 call 426FD0h;LoadLibraryA
00400341 68 0D 03 40 00 push 40030Dh ;'GetVolumeInformationA'
00400346 50 push eax ;hModule
00400347 E8 7F 6C 02 00 call 426FCAh;GetProcAddress
0040034B 6A 0A push 0Ah ;sizeof(lpFileSystemNameBuffer)
0040034D 8D 5D D8 lea ebx,[ebp-28h]
00400350 53 push ebx
00400351 8D 5D D0 lea ebx,[ebp-30h]
00400354 53 push ebx
00400355 8D 5D E4 lea ebx,[ebp-1Ch]
00400358 53 push ebx
00400359 8D 5D E8 lea ebx,[ebp-18h]
0040035C 53 push ebx
0040035D 6A 0C push 0Ch
0040035F 8D 5D F0 lea ebx,[ebp-10h]
00400362 53 push ebx
00400363 68 23 03 40 00 push 400323
00400368 FF D0 call eax
0040036A 8B 45 E8 mov eax,dword ptr [ebp-18h];VolumeSerialNumber
0040036D BB 27 03 40 00 mov ebx,400327h
00400372 33 03 xor eax,dword ptr [ebx]
00400374 BB 33 6F 42 00 mov ebx,426F33h
00400379 89 03 mov dword ptr [ebx],eax
0040037B 83 C3 04 add ebx,4
0040037E C6 03 FF mov byte ptr [ebx],0FFh;原来是E9 54 94 FD FF jmp 0040038D
00400381 83 C4 70 add esp,70h
00400384 8B E5 mov esp,ebp
00400386 5D pop ebp
00400387 E9 69 6A 02 00 jmp 00426DF5;跳转代码完成
0040038C
0040038C 53 push ebx
0040038D BB 33 6F 42 00 mov ebx,426F33h
00400392 C7 03 FF D0 5B 53 mov dword ptr [ebx],535BD0FFh
00400398 83 C3 04 add ebx,4
0040039B C6 03 81 mov byte ptr [ebx],81h
0040039E 8B D8 mov ebx,eax
004003A0 81 C3 0A E1 00 00 add ebx,0E10Ah
004003A6 C7 03 33 C0 EB 7D mov dword ptr [ebx],7DEBC033h
004003AC 81 EB B7 00 00 00 sub ebx,0B7h
004003B2 66 C7 03 EB 44 mov word ptr [ebx],44EBh
004003B7 5B pop ebx
004003B8 E9 76 6B 02 00 jmp 00426F33
004003BD

实验数据:
VolumeSerialNumber = 0x283a1709
E9 54 94 FD ^ VolumeSerialNumber = 0xd5ae43e0

其中的GetVolumeInformationA和变化数据,不是必须的.在写这一段代码时,不能将他放到原来的代码块中,
我曾经放过,但程序运行死了.可能有其他检查,但程序死的时候,堆栈已经被破坏了,我无法定位,不知哪位
能指点?

3.C代码
#include <windows.h>
#include <shlobj.h>
#include "resource.h"

#define OPEN_ERROR -1
#define READ_ERROR -2
#define WRITE_ERROR -3
#define FILE_ERROR -4
#define NO_KEY -5

int WriteCrack(HANDLE hFile)
{
DWORD dwWrited;
//1.写入口
SetFilePointer(hFile, 0xf0, 0, FILE_BEGIN);
DWORD dwEntry = 0x330;
WriteFile(hFile, &dwEntry, 4, &dwWrited, NULL);

//2.写固定数据
LPTSTR tt = MAKEINTRESOURCE(IDR_CRACKDATA1);
HRSRC hRsrc = FindResource(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDR_CRACKDATA1), "CRACKDATA");
HGLOBAL hGlobal = LoadResource(GetModuleHandle(NULL), hRsrc);
LPVOID lpData = LockResource(hGlobal);
SetFilePointer(hFile, 0x300, 0, FILE_BEGIN);
WriteFile(hFile, lpData, 0xc0, &dwWrited, NULL);

//3.写变化数据
DWORD dwChangeData = 0xfd9454e9;//E9 54 94 FD
BYTE lpRootPathName[4] = "c:\\"; //取C盘的序列号
BYTE lpVolumeNameBuffer[12];//磁盘卷标
DWORD nVolumeNameSize = 12;
DWORD VolumeSerialNumber;//磁盘序列号
DWORD MaximumComponentLength;
BYTE lpFileSystemNameBuffer[10];
DWORD nFileSystemNameSize=10;
DWORD FileSystemFlags;
GetVolumeInformation((char*)&lpRootPathName[0],
(char*)&lpVolumeNameBuffer[0], nVolumeNameSize,
&VolumeSerialNumber, &MaximumComponentLength,
&FileSystemFlags,
(char*)&lpFileSystemNameBuffer[0], nFileSystemNameSize);
dwChangeData ^= VolumeSerialNumber;
SetFilePointer(hFile, 0x327, 0, FILE_BEGIN);
WriteFile(hFile, &dwChangeData, 4, &dwWrited, NULL);
return 1;
}

int WriteCrackData(char* szFileName)
{
HANDLE hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Please quit TornadoII program!\r\n"
"Ensure not any program lock TornadoII resource!", "Warnning", MB_OK | MB_ICONHAND);
return OPEN_ERROR;
}
//读数据,判断该文件是否可写
SetFilePointer(hFile, 0xf0, 0, FILE_BEGIN);
DWORD dwEntry;
DWORD dwReaded;
if(ReadFile(hFile, &dwEntry, 4, &dwReaded, NULL) == FALSE)
{
MessageBox(NULL, "Please quit TornadoII program!\r\n"
"Ensure not any program lock TornadoII resource!", "Warnning", MB_OK | MB_ICONHAND);
CloseHandle(hFile);
return READ_ERROR;
}
if(dwEntry != 0x330)//自己写的入口
{
if(dwEntry != 0x26df5)//原本的程序入口
{
if(MessageBox(NULL, "TornadoII maybe infected by virus!\r\nRun the patch maybe destroy TornadoII!\r\n"
"If you want continue,press OK,CANCEL to quit!\r\nDo you want continue?", "Warnning", MB_OKCANCEL | MB_ICONHAND)
== IDCANCEL)
CloseHandle(hFile);
return FILE_ERROR;
}
}
WriteCrack(hFile);
CloseHandle(hFile);
return TRUE;
}

int WriteBack()
{
HKEY hKey;
if(RegOpenKey(HKEY_CURRENT_USER, "TNT TornadoII Patch1", &hKey)
!= ERROR_SUCCESS)
return NO_KEY;

char szFileName[255];
memset(szFileName, 0, sizeof(char) * 255);
long length = 255;
DWORD FileAttribute = 0;
BYTE FileTime[255];
memset(FileTime, 0, sizeof(BYTE) * 255);
DWORD dwLength;

if(RegQueryValue(hKey, "Path", szFileName, &length)
!= ERROR_SUCCESS)
{
RegCloseKey(hKey);
return NO_KEY;
}
dwLength = 4;
DWORD type;
if(RegQueryValueEx(hKey, "Attribute", 0, &type, (BYTE*)&FileAttribute, &dwLength)
!= ERROR_SUCCESS)
{
RegCloseKey(hKey);
return NO_KEY;
}
dwLength = 255;
if(RegQueryValueEx(hKey, "Time", 0, &type, FileTime, &dwLength)
!= ERROR_SUCCESS)
{
RegCloseKey(hKey);
return NO_KEY;
}
FILETIME* temp = (FILETIME*)FileTime;
FILETIME CreateTime;
CreateTime = *temp;
temp ++;
FILETIME LastAccessTime;
LastAccessTime = *temp;
temp ++;
FILETIME LastWriteTime;
LastWriteTime = *temp;

HANDLE hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Please quit TornadoII program!\r\n"
"Ensure not any program lock TornadoII resource!", "Warnning", MB_OK | MB_ICONHAND);
return OPEN_ERROR;
}
//读数据,判断该文件是否可写
SetFilePointer(hFile, 0xf0, 0, FILE_BEGIN);
DWORD dwEntry;
DWORD dwReaded;
if(ReadFile(hFile, &dwEntry, 4, &dwReaded, NULL) == FALSE)
{
MessageBox(NULL, "Please quit TornadoII program!\r\n"
"Ensure not any program lock TornadoII resource!", "Warnning", MB_OK | MB_ICONHAND);
return READ_ERROR;
}
if(dwEntry != 0x330)//自己写的入口
{
CloseHandle(hFile);
return FILE_ERROR;
}
DWORD dwWrited;
//1.写入口
SetFilePointer(hFile, 0xf0, 0, FILE_BEGIN);
dwEntry = 0x26df5;
WriteFile(hFile, &dwEntry, 4, &dwWrited, NULL);

//2.数据
BYTE buffer[0xc0];
memset(buffer, 0, sizeof(BYTE) * 0xc0);
SetFilePointer(hFile, 0x300, 0, FILE_BEGIN);
WriteFile(hFile, buffer, 0xc0, &dwWrited, NULL);

SetFileTime(hFile, &CreateTime, &LastAccessTime, &LastWriteTime);
CloseHandle(hFile);
RegDeleteKey(hKey, "Path");
RegCloseKey(hKey);
RegDeleteKey(HKEY_CURRENT_USER, "TNT TornadoII Patch1");
SetFileAttributes(szFileName, FileAttribute);

return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
{

if(WriteBack() == TRUE)
return TRUE;
BROWSEINFO bi;
ITEMIDLIST* pidl;
char path[255];
memset(path, 0, sizeof(char) * 255);
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.lpszTitle = "Please choose the path of TornadoII installed";
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
pidl = SHBrowseForFolder(&bi);
SHGetPathFromIDList(pidl, path);

char szFileName[255];
int length = strlen(path);

if(length == 0)
return FALSE;

int temp;
char* szName = "\\host\\x86-win32\\bin\\tgtsvr.exe";
memset(szFileName, 0, sizeof(szFileName));
memcpy(szFileName, path, length);
temp = length;
length = strlen(szName);
memcpy(&szFileName[temp], szName, length);

HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Please quit TornadoII program!\r\n"
"Ensure not any program lock TornadoII resource!", "Warnning", MB_OK | MB_ICONHAND);
return FALSE;
}

BY_HANDLE_FILE_INFORMATION FileInfo;
GetFileInformationByHandle(hFile, &FileInfo);
CloseHandle(hFile);

DWORD FileAttribute = FileInfo.dwFileAttributes;
BYTE FileTime[255];
memset(FileTime, 0, sizeof(BYTE) * 255);
length = 0;
memcpy(&FileTime[length], &FileInfo.ftCreationTime, sizeof(FILETIME));
length += sizeof(FILETIME);
memcpy(&FileTime[length], &FileInfo.ftLastAccessTime, sizeof(FILETIME));
length += sizeof(FILETIME);
memcpy(&FileTime[length], &FileInfo.ftLastWriteTime, sizeof(FILETIME));
length += sizeof(FILETIME);
DWORD newAttribute = FileAttribute & 0xfffffffe;
SetFileAttributes(szFileName, newAttribute);

if(WriteCrackData(szFileName) == TRUE)
{
HKEY hKey;
RegCreateKey(HKEY_CURRENT_USER, "TNT TornadoII Patch1", &hKey);
RegSetValue(hKey, "Path",
REG_SZ, szFileName, strlen(szFileName));
RegSetValueEx(hKey, "Attribute", 0, REG_DWORD, (BYTE*)&FileAttribute, 4);
RegSetValueEx(hKey, "Time", 0, REG_BINARY, FileTime, length);
if(MessageBox(NULL, "TornadoII Patch1 is OK!\r\nYou can run me again when registered,\r\n"
"or press yes when you registed.\r\nHave you run TornadoII to register?", "OK!", MB_YESNO) == IDYES)
{
WriteBack();
}
}

return TRUE;
}

其中的IDR_CRACKDATA1为:
00000000 4B 45 52 4E 45 4C 33 32 2E 44 4C 4C 00 47 65 74 //KERNEL32.DLL Ge
00000010 56 6F 6C 75 6D 65 49 6E 66 6F 72 6D 61 74 69 6F //VolumeInformati
00000020 6E 41 00 43 3A 5C 00 00 00 00 00 00 00 00 00 00 //nA C:\
00000030 55 8B EC 83 EC 30 68 00 03 40 00 E8 90 6C 02 00
00000040 68 0D 03 40 00 50 E8 7F 6C 02 00 6A 0A 8D 5D D8
00000050 53 8D 5D D0 53 8D 5D E4 53 8D 5D E8 53 6A 0C 8D
00000060 5D F0 53 68 23 03 40 00 FF D0 8B 45 E8 BB 27 03
00000070 40 00 33 03 BB 33 6F 42 00 89 03 83 C3 04 C6 03
00000080 FF 83 C4 70 8B E5 5D E9 69 6A 02 00 53 BB 33 6F
00000090 42 00 C7 03 FF D0 5B 53 83 C3 04 C6 03 81 8B D8
000000a0 81 C3 0A E1 00 00 C7 03 33 C0 EB 7D 81 EB B7 00
000000b0 00 00 66 C7 03 EB 44 5B E9 76 6B 02 00 00 00 00

后记:
今年7月底破解该软件,原来想买给xx公司.不过后来失败了.这也是加GeVolumeInformatinA的原因.
前两天看到贵论坛上一篇文章,深有感触.破解应该是一个业余爱好吧,
希望能和大家交个朋友.

运行该Patch程序注意:
1.保证您已经安装好TornadoII,且TornadoII的应用程序没有运行.
2.运行程序patch.
3.选择TornadoII的安装路径.
4.将出现如图patch1OK.jpg所示,此时patch1已经成功,这时
patch.exe可以按否关闭,或者不关闭,直接运行TornadoII进行注
册.
注意:现在一定不能马上按"是"按钮.如果您按下,那么只好从第
二步重新来.
5.注册TornadoII将出现如register.jpg所示,此时您可以输入
任意的26个数字或字母,可以数字和字母混合.注册成功后,将
TornadoII的应用程序退出.
6.如果刚才您没有关闭patch.exe,现在直接按patch1OK.jpg所示的
"是"按钮,TornadoII将完全破解.如果您刚才将patch.exe推出了,
现在需要重新运行他.这一步成功的标志是patch2OK.jpg所示.
注意:如果您的操作系统是98/95,在第5步时将出现如98.jpg所示(98.jpg不能贴上来,见谅),
此时实际已经注册成功.您需要关闭TornadoII的注册程序,按照
第六步的指示做.如果您的操作系统是98/95,而且已经过期了,该
Patch无能为力.只好重装系统和TII了.:(

标 题:关于这个Tornado2的秘密！！！ (419字)
发信人:1212
时 间:2000-10-22 16:37:59
详细信息:

哈哈，这个昂贵的商业软件的保护说穿了实在是不值得一提！
它是用Crypkey加壳的（www.crypkey.com)，而Crypkey Instant的通用注册机早被Duelist/CORE写出来了，在Keygen Studio上可以得到，用的RSA算法。
至于脱壳，更是简单得不得了，写个ProcDump的script自动把tgtsvr.exe脱壳即可（壳调用cryp*.dll判断时间），得到的exe的import table未做任何手脚，可以在各种版本的32-bit windows上运行！

所有用Crypkey加壳的大软件如法炮制！

blowfish


XceedZIP v4.1

标 题:XceedZIP v4.1的License破解(概略） (12千字)
发信人:superboss
时 间:2001-1-26 15:20:30
详细信息:
目标程序:Xceed ZIP Library
版本:4.1
破解工具:Wdasm和TRW2000
下载地址:
难度:中级?
==================================================================

关键在于注册表里有一个License键值,注册后,VB需要License键值,而Delphi需要XzCreateXceedZipA
函数中引用License参数！主要破解代码段如下：

Exported fn(): XzCreateXceedZipA - Ord:0008h
:67682841 55 push ebp
:67682842 8BEC mov ebp, esp
:67682844 51 push ecx
:67682845 51 push ecx
:67682846 8365FC00 and dword ptr [ebp-04], 00000000
:6768284A 8D45FC lea eax, dword ptr [ebp-04]
:6768284D 50 push eax
:6768284E E8AB020000 call 67682AFE
:67682853 85C0 test eax, eax
:67682855 7C73 jl 676828CA
:67682857 8B45FC mov eax, dword ptr [ebp-04]
:6768285A 85C0 test eax, eax
:6768285C 746C je 676828CA
:6768285E 8B08 mov ecx, dword ptr [eax]
:67682860 57 push edi
:67682861 50 push eax
:67682862 FF5104 call [ecx+04]
:67682865 8B45FC mov eax, dword ptr [ebp-04]
:67682868 6AFF push FFFFFFFF
:6768286A FF7508 push [ebp+08]
:6768286D 8980F4150000 mov dword ptr [eax+000015F4], eax
:67682873 C780F815000001000000 mov dword ptr [ebx+000015F8], 00000001
:6768287D 834DF8FF or dword ptr [ebp-08], FFFFFFFF
:67682881 E83B87FFFF call 6767AFC1
:67682886 59 pop ecx
:67682887 8BF8 mov edi, eax
:67682889 59 pop ecx
:6768288A 57 push edi

* Reference To: OLEAUT32.SysStringLen, Ord:0007h
|
:6768288B FF154CA26967 Call dword ptr [6769A24C]
:67682891 85C0 test eax, eax
:67682893 751C jne 676828B1

:6768A6AD 56 push esi
:6768A6AE 8B742410 mov esi, dword ptr [esp+10]
:6768A6B2 85F6 test esi, esi
:6768A6B4 7507 jne 6768A6BD
:6768A6B6 B803400080 mov eax, 80004003
:6768A6BB EB13 jmp 6768A6D0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:6768A6B4(C)
|
:6768A6BD FF74240C push [esp+0C]
:6768A6C1 E879BC0000 call 6769633F
:6768A6C6 F6D8 neg al
:6768A6C8 1BC0 sbb eax, eax
:6768A6CA 59 pop ecx
:6768A6CB 668906 mov word ptr [esi], ax
:6768A6CE 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:6768A6BB(U)
|
:6768A6D0 5E pop esi
:6768A6D1 C20C00 ret 000C

* Referenced by a CALL at Address:
|:6768A6C1
|
:6769633F 56 push esi
:67696340 BE10306A67 mov esi, 676A3010
:67696345 8BCE mov ecx, esi
:67696347 E8D0030000 call 6769671C
:6769634C 84C0 test al, al
:6769634E 7526 jne 67696376
:67696350 8D442408 lea eax, dword ptr [esp+08]
:67696354 6A01 push 00000001
:67696356 50 push eax
:67696357 E8AD010000 call 67696509
:6769635C 59 pop ecx
:6769635D 84C0 test al, al
:6769635F 59 pop ecx
:67696360 7514 jne 67696376
:67696362 8D442408 lea eax, dword ptr [esp+08]
:67696366 6A01 push 00000001
:67696368 50 push eax
:67696369 E810020000 call 6769657E
:6769636E 59 pop ecx
:6769636F 84C0 test al, al
:67696371 59 pop ecx
:67696372 7502 jne 67696376
:67696374 5E pop esi
:67696375 C3 ret

* Referenced by a CALL at Addresses:
|:67682898 , :67682922 , :6768299F , :67682A16 , :6769562B
|:676956E5 , :67696369 , :676967B9 , :67696830
|
:6769657E 55 push ebp
:6769657F 8BEC mov ebp, esp
:67696581 51 push ecx
:67696582 51 push ecx
:67696583 8B4508 mov eax, dword ptr [ebp+08]
:67696586 53 push ebx
:67696587 33DB xor ebx, ebx
:67696589 56 push esi

* Reference To: OLEAUT32.SysFreeString, Ord:0006h
|
:6769658A 8B3558A26967 mov esi, dword ptr [6769A258]
:67696590 3BC3 cmp eax, ebx
:67696592 895DFC mov dword ptr [ebp-04], ebx
:67696595 7413 je 676965AA
:67696597 57 push edi
:67696598 8B38 mov edi, dword ptr [eax]
:6769659A 53 push ebx
:6769659B FFD6 call esi
:6769659D 57 push edi

* Reference To: OLEAUT32.SysAllocString, Ord:0002h
|
:6769659E FF1550A26967 Call dword ptr [6769A250]
:676965A4 8945FC mov dword ptr [ebp-04], eax
:676965A7 5F pop edi
:676965A8 EB0E jmp 676965B8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:67696595(C)
|
:676965AA 8D45FC lea eax, dword ptr [ebp-04]
:676965AD 50 push eax
:676965AE E8A8FEFFFF call 6769645B
:676965B3 84C0 test al, al
:676965B5 59 pop ecx
:676965B6 742D je 676965E5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:676965A8(U)
|
:676965B8 8D45F8 lea eax, dword ptr [ebp-08]
:676965BB 50 push eax
:676965BC 8D450B lea eax, dword ptr [ebp+0B]
:676965BF 50 push eax
:676965C0 8D45FC lea eax, dword ptr [ebp-04]
:676965C3 50 push eax
:676965C4 E87C000000 call 67696645
:676965C9 83C40C add esp, 0000000C
:676965CC 84C0 test al, al
:676965CE 7415 je 676965E5
:676965D0 385D0C cmp byte ptr [ebp+0C], bl
:676965D3 740D je 676965E2
:676965D5 FF75F8 push [ebp-08]
:676965D8 B910306A67 mov ecx, 676A3010
:676965DD E89B010000 call 6769677D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:676965D3(C)
|
:676965E2 8A5D0B mov bl, byte ptr [ebp+0B]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:676965B6(C), :676965CE(C)
|
:676965E5 FF75FC push [ebp-04]
:676965E8 FFD6 call esi
:676965EA 8AC3 mov al, bl
:676965EC 5E pop esi
:676965ED 5B pop ebx
:676965EE C9 leave
:676965EF C3 ret

* Referenced by a CALL at Addresses:
|:6769654F , :676965C4
|
:67696645 55 push ebp
:67696646 8BEC mov ebp, esp
:67696648 83EC10 sub esp, 00000010
:6769664B 53 push ebx
:6769664C 56 push esi
:6769664D 8B7508 mov esi, dword ptr [ebp+08]
:67696650 33DB xor ebx, ebx
:67696652 57 push edi
:67696653 8B06 mov eax, dword ptr [esi]
:67696655 3BC3 cmp eax, ebx
:67696657 0F84A0000000 je 676966FD
:6769665D 50 push eax

* Reference To: OLEAUT32.SysStringLen, Ord:0007h
|
:6769665E FF154CA26967 Call dword ptr [6769A24C]
:67696664 83F820 cmp eax, 00000020 <---比对License串的长度是否为32字节
:67696667 0F8590000000 jne 676966FD
:6769666D 33C0 xor eax, eax
:6769666F 8D7DF4 lea edi, dword ptr [ebp-0C]
:67696672 895DF0 mov dword ptr [ebp-10], ebx
:67696675 AB stosd
:67696676 AB stosd
:67696677 AB stosd
:67696678 8B06 mov eax, dword ptr [esi]
:6769667A 3BC3 cmp eax, ebx
:6769667C 894508 mov dword ptr [ebp+08], eax
:6769667F 7504 jne 67696685
:67696681 33F6 xor esi, esi
:67696683 EB2C jmp 676966B1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:6769667F(C)
|
:67696685 50 push eax

* Reference To: KERNEL32.lstrlenW, Ord:0309h
|
:67696686 FF15A8A16967 Call dword ptr [6769A1A8]
:6769668C 8D7C0002 lea edi, dword ptr [eax+eax+02]
:67696690 8BC7 mov eax, edi
:67696692 83C003 add eax, 00000003
:67696695 24FC and al, FC
:67696697 E8D42F0000 call 67699670
:6769669C 8BF4 mov esi, esp
:6769669E 53 push ebx
:6769669F 53 push ebx
:676966A0 57 push edi
:676966A1 56 push esi
:676966A2 6AFF push FFFFFFFF
:676966A4 FF7508 push [ebp+08]
:676966A7 881E mov byte ptr [esi], bl
:676966A9 53 push ebx
:676966AA 53 push ebx

* Reference To: KERNEL32.WideCharToMultiByte, Ord:02D2h
|
:676966AB FF15B4A16967 Call dword ptr [6769A1B4]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:67696683(U)
|
:676966B1 8D45F0 lea eax, dword ptr [ebp-10]
:676966B4 50 push eax
:676966B5 56 push esi

* Possible StringData Ref from Data Obj ->"Xceed Software Inc."
|
:676966B6 68002C6A67 push 676A2C00
:676966BB E830FFFFFF call 676965F0
:676966C0 0FB775F6 movzx esi, word ptr [ebp-0A]-----
:676966C4 8A4DFB mov cl, byte ptr [ebp-05] |
:676966C7 0375F0 add esi, dword ptr [ebp-10] |
:676966CA 0FB745F4 movzx eax, word ptr [ebp-0C] |
:676966CE 0FB6D1 movzx edx, cl |
:676966D1 03F2 add esi, edx |计算
:676966D3 33D2 xor edx, edx |
:676966D5 03C6 add eax, esi |
:676966D7 BEFF000000 mov esi, 000000FF |
:676966DC F7F6 div esi <---------------------|
:676966DE 83C40C add esp, 0000000C
:676966E1 3A55FF cmp dl, byte ptr [ebp-01] <----关键
:676966E4 7517 jne 676966FD
:676966E6 8B450C mov eax, dword ptr [ebp+0C]
:676966E9 F6C101 test cl, 01
:676966EC 7413 je 67696701
:676966EE 53 push ebx
:676966EF C60001 mov byte ptr [eax], 01
:676966F2 E88CFCFFFF call 67696383
:676966F7 3945F0 cmp dword ptr [ebp-10], eax
:676966FA 59 pop ecx
:676966FB 7408 je 67696705

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:67696657(C), :67696667(C), :676966E4(C)
|
:676966FD 32C0 xor al, al
:676966FF EB13 jmp 67696714

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:676966EC(C)
|
:67696701 8818 mov byte ptr [eax], bl
:67696703 EB03 jmp 67696708

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:676966FB(C)
|
:67696705 8A4DFB mov cl, byte ptr [ebp-05]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:67696703(U)
|
:67696708 8B4510 mov eax, dword ptr [ebp+10]
:6769670B D0E9 shr cl, 1
:6769670D 80E101 and cl, 01
:67696710 8808 mov byte ptr [eax], cl
:67696712 B001 mov al, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:676966FF(U)
|
:67696714 8D65E4 lea esp, dword ptr [ebp-1C]
:67696717 5F pop edi
:67696718 5E pop esi
:67696719 5B pop ebx
:6769671A C9 leave
:6769671B C3 ret


AB Email Searcher1.6

 标 题:用DEDE破nag窗口 (4千字)
发信人:8989
时 间:2001-8-22 19:37:04
详细信息:
用DEDE破nag窗口

破解人：风飘雪
http://fpx.yeah.net gd1@yeah.net
目的：加入BCG,学习破nag
试验品：AB Email Searcher1.6(国产）
住址：华军
工具：dede,w32dasm,trw,ultraedit,caspr,language

1.caspr脱aspack壳
2.dede反汇编 窗体菜单发现TForm1为主窗口，TForm2为nag窗口;
程序菜单 Unit2 TForm2的FormCreate为11
在Unit1 TForm1的FormCreate发现11，进入TForm1.FormCreate,查找第一次出现TForm2的地方
* Reference to field TForm1.OFFS_03E9
|
00477025 8A83E9030000 mov al, byte ptr [ebx+$03E9]
0047702B 84C0 test al, al
0047702D 84C0 test al, al
0047702F 7540 jnz 00477071======上面的第一个跳转 方法1： jnz=>jmp 一条（跳）就胡，一饼（EB）伺候
00477031 8BCB mov ecx, ebx
00477033 B201 mov dl, $01

* Reference to class TForm2 =========================第一次出现TForm2
|
00477035 A1B4454700 mov eax, dword ptr [$4745B4]

|
0047703A E875D8FCFF call 004448B4
0047703F 8BF0 mov esi, eax
00477041 8D55EC lea edx, [ebp-$14]
00477044 8BC3 mov eax, ebx

|
00477046 E8611E0000 call 00478EAC
0047704B 8B55EC mov edx, [ebp-$14]

* Reference to control TForm2.Edit1 : TEdit
|
0047704E 8B86E8020000 mov eax, [esi+$02E8]

|
00477054 E86B62FBFF call 0042D2C4
00477059 8BC6 mov eax, esi
0047705B 8B10 mov edx, [eax]

* Possible reference to virtual method TForm2.OFFS_00D8
|
0047705D FF92D8000000 call dword ptr [edx+$00D8]====此call呼叫nag窗口 方法2 ：nop掉此call 九筒（90）就胡

* Reference to field TForm1.OFFS_03E8
|
00477063 C683E803000001 mov byte ptr [ebx+$03E8], $01
0047706A 8BC6 mov eax, esi

|
0047706C E8FFBCF8FF call 00402D70

2.去掉功能限制
w32dasm反汇编,发现多处blowfish字样，好像是一种算法，还是这里一个人的名字，好怕怕呀！

串式参考"保存结果，仅限于注册用户使用" 有两处
（1）
:00477107 FF524C call [edx+4C]
:0047710A 84C0 test al, al
:0047710C 7415 je 00477123==========一条（跳）就死，九筒（90）就胡
:0047710E 8B8398030000 mov eax, dword ptr [ebx+00000398]
:00477114 83C070 add eax, 00000070

* Possible StringData Ref from Code Obj ->"保存结果"
|
:00477117 BA24724700 mov edx, 00477224
:0047711C E8EFC9F8FF call 00403B10
:00477121 EB13 jmp 00477136

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047710C(C)===================================================双击鼠标右键
|
:00477123 8B8398030000 mov eax, dword ptr [ebx+00000398]
:00477129 83C070 add eax, 00000070

* Possible StringData Ref from Code Obj ->"保存结果，仅限于注册用户使用"
|
:0047712C BA38724700 mov edx, 00477238
:00477131 E8DAC9F8FF call 00403B10
（2）
:00478130 FF524C call [edx+4C]
:00478133 84C0 test al, al
:00478135 7415 je 0047814C======================一条（跳）就死，九筒（90）就胡
:00478137 8B8698030000 mov eax, dword ptr [esi+00000398]
:0047813D 83C070 add eax, 00000070

* Possible StringData Ref from Code Obj ->"保存结果"
|
:00478140 BAF8814700 mov edx, 004781F8
:00478145 E8C6B9F8FF call 00403B10
:0047814A EB13 jmp 0047815F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478135(C)=======================================================双击鼠标右键
|
:0047814C 8B8698030000 mov eax, dword ptr [esi+00000398]
:00478152 83C070 add eax, 00000070

* Possible StringData Ref from Code Obj ->"保存结果，仅限于注册用户使用"
|
:00478155 BA0C824700 mov edx, 0047820C
:0047815A E8B1B9F8FF call 00403B10

2001.8.22


Add Remove Plus! 2000 v2.0

标 题:Add Remove Plus! 2000 v2.0破解手记 附:Windows 优化大师 3.3的破解方法 (4千字)
发信人:TAE!
时 间:2001-2-2 14:11:08
详细信息:
Add Remove Plus! 2000 v2.0破解手记 附:Windows 优化大师 3.3的破解方法
目标软件:Add Remove Plus! 2000 v2.0
破 解 人:TAE!
保护机制:Nag窗口
破解方法:暴力破解
下载地址:http://www.aurelitec.com/

先运行程序,出现了一个类似Vbox的Nag,着实吓了我一跳.心想:一个几百K的软件
也用Vbox封装?
用FileInfo检测发现是一个delphi程序,顿时松了口气.
用Trw加载程序.

:0046B440 55 push ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046B3F9(C)
|
:0046B441 8BEC mov ebp, esp
:0046B443 83C4F4 add esp, FFFFFFF4
:0046B446 B818B24600 mov eax, 0046B218
:0046B44B E8A8ADF9FF call 004061F8

* Possible StringData Ref from Code Obj ->"INSTALL.DA2"
|
:0046B450 B9B8B44600 mov ecx, 0046B4B8

* Possible StringData Ref from Code Obj ->"INSTALL.DA1"
|
:0046B455 BACCB44600 mov edx, 0046B4CC

* Possible StringData Ref from Code Obj ->"INSTALL.DA0"
|
:0046B45A B8E0B44600 mov eax, 0046B4E0
:0046B45F E83C90FFFF call 004644A0 //这句运行后便出现Nag
:0046B464 84C0 test al, al //选择 "Try"后回到了这里
:0046B466 7441 je 0046B4A9 //此时不跳转;若选了Quit,这里便会跳走
:0046B468 A160D04600 mov eax, dword ptr [0046D060]
:0046B46D 8B00 mov eax, dword ptr [eax]
:0046B46F E81409FEFF call 0044BD88
:0046B474 A160D04600 mov eax, dword ptr [0046D060]
:0046B479 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"Add/Remove Plus! 2000"

既然知道了产生Nag的call,那我就用 tKC常用的Return大法来超度它!
进入那个产生Nag的call,便到了这里:
* Referenced by a CALL at Address:
|:0046B45F
|
:004644A0 55 push ebp //就在这一行做做手脚吧
:004644A1 8BEC mov ebp, esp
:004644A3 83C4E0 add esp, FFFFFFE0
:004644A6 53 push ebx
:004644A7 56 push esi
:004644A8 57 push edi
:004644A9 33DB xor ebx, ebx
:004644AB 895DF0 mov dword ptr [ebp-10], ebx
:004644AE 895DF8 mov dword ptr [ebp-08], ebx
:004644B1 8BD8 mov ebx, eax
:004644B3 33C0 xor eax, eax
:004644B5 55 push ebp
:004644B6 68EA464600 push 004646EA
:004644BB 64FF30 push dword ptr fs:[eax]
:004644BE 648920 mov dword ptr fs:[eax], esp
:004644C1 C645FF00 mov [ebp-01], 00
:004644C5 33C0 xor eax, eax
:004644C7 55 push ebp
:004644C8 68AF464600 push 004646AF
:004644CD 64FF30 push dword ptr fs:[eax]
:004644D0 648920 mov dword ptr fs:[eax], esp
:004644D3 8D55F0 lea edx, dword ptr [ebp-10]
:004644D6 33C0 xor eax, eax
:004644D8 E8C7E3F9FF call 004028A4
:004644DD 8B45F0 mov eax, dword ptr [ebp-10]

在004644A0这行,将55改为C3即Ret
这样程序运行到这里后,就会立即返回调用它的地方,也就是0046B464,程序就不会出现Nag了.
然后再将 0046B466 处的 7441
改为: 9090
程序已经被破解啦!
其实 tKC 的这种Ret大法非常适合于以下这种情况:
有许多地方调用这个call.
比如: 00000000:Call 11111111
00000001:test al,1

11111111:push
XXXXXXXX: ...
可以改为:
00000000:Call 11111111
00000001:test al,1

11111111:mov al,1
XXXXXXXX:ret
这样所有调用这里的地方,返回的al值都是1了!cool吧?
当然这儿可以充分发挥你的想象力,让我们改的更好!
已经3点多了,该睡了!

Windows 优化大师 3.3的破解方法
Aspack 2.11加的壳,先脱壳,都会吧?
然后...

查找:83f8147407bb01000000
改为: EB

查找:83f8147423bba1860100
改为: EB

成为随意注册版!


Amem

 标 题:谁能破解?看雪兄,1212兄......
发信人:coolcalf
时 间:2000-11-19 15:47:15
详细信息:
http://go1.163.com:80/~sl0925/amem4b.exe

一个记录并重放鼠标操作的软件: 机器人 .
但启动时有一个窗口.必须按一下(继续试用)按钮,挺烦的.
我尝试将它破解.但发现程序始终在转圈.难度挺大,请求高手指点.
能不能写篇教程出来.

标 题:关键在CALL 0040BE10中
发信人:blowfish
时 间:2000-11-21 17:27:22
详细信息:

CALL 0040BE10等价于函数IsEvaluationVersion( )，返回TRUE则为试用版本。该函数如下：

* Referenced by a CALL at Addresses:
|:0040BC5A , :0040D183 , :00415486 , :004156A9 , :00415839
|:00415BDB , :004196A8 , :004202D7
|
:0040BE10 B801000000 mov eax, 00000001
:0040BE15 C3 ret

这个函数共被8个地方调用，在调用该函数的各个地方设一下断点，跟一下就清楚该函数的作用了。

第一处：启动时是否判断日期并显示Nag

:0040BC5A E8B1010000 call 0040BE10 //这里
:0040BC5F 85C0 test eax, eax
:0040BC61 0F84C4000000 je 0040BD2B
:0040BC67 6A00 push 00000000
:0040BC69 8D4C2418 lea ecx, dword ptr [esp+18]
:0040BC6D E8DEF5FFFF call 0040B250
:0040BC72 8D4C2414 lea ecx, dword ptr [esp+14]
:0040BC76 C78424F400000002000000 mov dword ptr [esp+000000F4], 00000002
:0040BC81 E8D3770200 call 00433459 //显示Nag
:0040BC86 83F802 cmp eax, 00000002
:0040BC89 7521 jne 0040BCAC

第二处：是否显示“购买”菜单

:0040D183 E888ECFFFF call 0040BE10
:0040D188 85C0 test eax, eax
:0040D18A 7521 jne 0040D1AD
:0040D18C 8B561C mov edx, dword ptr [esi+1C]
:0040D18F 52 push edx

* Reference To: USER32.GetMenu, Ord:011Ch
|
:0040D190 FF15A0444400 Call dword ptr [004444A0]
:0040D196 50 push eax
:0040D197 E8CDAA0200 call 00437C69
:0040D19C 8B4004 mov eax, dword ptr [eax+04]
:0040D19F 6A00 push 00000000

* Possible Ref to Menu: MenuID_00A0, Item: "Ordering/Registering EZ Macros"
|
:0040D1A1 6806800000 push 00008006
:0040D1A6 50 push eax

* Reference To: USER32.DeleteMenu, Ord:0087h
|
:0040D1A7 FF1598444400 Call dword ptr [00444498]

第三处：是否显示Nag

:00415486 E88569FFFF call 0040BE10
:0041548B 85C0 test eax, eax
:0041548D 0F843C010000 je 004155CF
:00415532 E829810000 call 0041D660
......................................
* Possible StringData Ref from Data Obj ->"EZ Macros"
|
:00415537 6830424500 push 00454230
:0041553C 8D8C24E8000000 lea ecx, dword ptr [esp+000000E8]
:00415543 C684240802000034 mov byte ptr [esp+00000208], 34
:0041554B C78424EC00000001000000 mov dword ptr [esp+000000EC], 00000001
:00415556 E8291A0200 call 00436F84

* Possible StringData Ref from Data Obj ->"Thank you for trying EZ Macros. "
->" This window will not appear in "
->"the full verion of EZ Macros and "
->"your macro can run uninterrupted "
->"for as long as you like. Please "
->"consider ordering EZ Macros. "
->"You can buy EZ Macros and upgrade "
->"right now by going to http://www.ezmacros.com."
|
:0041555B 68B85E4500 push 00455EB8

其余省略。

可见，只要把mov eax, 00000001改为mov eax, 0 就行了。try!


EditPlus 2.10a

标 题:除editplus 2.10a的NAG(供初学者参考) (2千字)
发信人:mjing
时 间:2001-2-16 14:05:54
详细信息:
如何去除EditPlus 2.10a的NAG

本文仅供初学者参考，因为本人也是初学者。

用ExeScope可以发现，NAG不是以窗口资源的形式存在的，因此用DASM反汇编查找窗口ID来找出产生NAG的地方的方法是无用的，以前2.00版倒是可以的，只是先去壳，好像是petite加的壳吧。

既然DASM派不上用场，那只好用调试工具硬追，关键是找到开窗的API函数，
可以注意到editplus的NAG是一个非模式窗口(非模式窗口这个概念大家应该明白吧，有些windows下编程能力的人都应该知道，它是相对于模式窗口而言的，不必关闭此窗口就可以做继续动用程序的其它功能，如文本编辑器中的“查找字符对话框”等等)，经过几次试探，找到一个可用的断点，
bpx createdialogindirectparama

所需工具，trw200或soft-ice,一个十六进制编辑器(我用的是Ultra Edit 8.0)

1、用trw2000载入editplus.exe，下断点，bpx createdialogindirectparama,
2、将被拦下四次，第四次拦下时，下命令，pmodule返回，看到如下代码

015F:004A9653 MOV EAX,[EAX+1C]
015F:004A9656 PUSH EBX
015F:004A9657 PUSH DWORD 004A9224
015F:004A965C PUSH EAX
015F:004A965D PUSH DWORD [EBP+08]
015F:004A9660 PUSH DWORD [EBP+10]
015F:004A9663 CALL `USER32!CreateDialogIndirectParamA` ;跳出NAG
015F:004A9669 LEA ECX,[EBP-1C] ;我们停在这里
015F:004A966C MOV [EBP-18],EAX
015F:004A966F MOV [EBP-04],BL
015F:004A9672 CALL 004AA836
015F:004A9677 JMP SHORT 004A9696
015F:004A9679 MOV ECX,[EBP-2C]
015F:004A967C CALL 004AC642
015F:004A9681 MOV EAX,[EBP-24]
015F:004A9684 OR DWORD [EAX+2C],BYTE -01

3、返回到调用此NAG的地方，返回好几个ret，还要被它吓住哦!
来到这儿

015F:0042D7ED CALL 0042F570
015F:0042D7F2 JMP 0042D9DD
015F:0042D7F7 CMP EAX,BYTE +6B
015F:0042D7FA JNZ 0042D813 ;此处一定要跳，改成JMP就可以了
015F:0042D7FC PUSH EAX
015F:0042D7FD MOV EAX,[ESI+1C]
015F:0042D800 PUSH EAX
015F:0042D801 CALL `USER32!KillTimer`
015F:0042D807 MOV ECX,ESI
015F:0042D809 CALL 0042D210 ;这个CALL弹出NAG
015F:0042D80E JMP 0042D9DD
015F:0042D813 CMP EAX,BYTE +6D
015F:0042D816 JNZ 0042D88F
015F:0042D818 MOV ECX,[ESI+1C]
015F:0042D81B PUSH EAX
015F:0042D81C PUSH ECX

4、总结：在editplus.exe中，用十六进制编辑器进行修改

Find:83 F8 6B 75 17 50 8B 46 1C
^^
EB

是不是很容易:)
by mjing,2000/2/16,
E-mail:mjing@wx88.net


FPE 2001 Demo

 标 题:《FPE 2001 Demo 的延时修改》====>函数调用的重要性 (4千字)
发信人:yuppc
时 间:2001-7-31 22:49:49
详细信息:
《FPE 2001 Demo 的延时修改》====>函数调用的重要性

破解作者:yuppc[FCG、BCG]
破解时间:2001年7月31日
破解难度:易
注:(转载希望保持完整,文章归BCG、FCG所有)

软件概述:
1>最老牌的国产游戏修改器,也是最好的("我一直用他"),它的演示完全免费的,所以我们在这只谈"修改"!
2>新版本比2000版增加了很多的功能呀(自动机器人\网络修改\....),一级棒!
3>可以反编译
4>下载地址:
http://www.esoftware.com.cn/oload.php?url=http://ftp.eware.com.cn/pub/game/gatools/fpe2001trial.zip
5>真是最好的游戏修改软件!!

修改目的:为加入CCG奋斗!!

破解工具:
1>w32dasm黄金版 ===>静态反汇编
2>hiew ===>16位编辑器

"修改"开始:
1>首先要了解WINDOWS个应用程序是要对WINDOWS系统函数的调用来实现某些功能的(对CRACKER来说用动态下断就是对函数调用的拦截);
2>在FPE2001和以前的版本一样喜欢炫耀自己(启动时不停的闪烁各个功能页,结尾是也是要停一会),这是如何实现的呢---->调用函数(Sleep,SleepEx等函数）；
3>安装软件,并运行;
4>观察:开始运行时闪烁9次,关闭时闪烁一次并发现一个"关于"中关键词"EXIT……";
5>开始用W32dasm反汇编,查找关键词"EXIT"(先解决关闭时的闪烁),代码如下:(注意函数的调用)
:
:
:00406513 803F00 cmp byte ptr [edi], 00 ====>关键比较
:00406516 0F84ED020000 je 00406809 ========>关键跳(应该跳过SLEEP函数的调用)
:0040651C 8B93D0020000 mov edx, dword ptr [ebx+000002D0]
:00406522 807A4000 cmp byte ptr [edx+40], 00
:00406526 7413 je 0040653B ====>此处无用(因为要跳过EXIT)
:00406528 33D2 xor edx, edx
:0040652A 8BC3 mov eax, ebx
:0040652C E853170000 call 00407C84
:00406531 68D0070000 push 000007D0

* Reference To: KERNEL32.Sleep, Ord:0000h =======>Sleep函数调用
|
:00406536 E84D8C0900 Call 0049F188

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406526(C)
|
:0040653B 8B9354020000 mov edx, dword ptr [ebx+00000254]
:00406541 8B83C8010000 mov eax, dword ptr [ebx+000001C8]
:00406547 E87A180800 call 00487DC6
:0040654C 66C746100800 mov [esi+10], 0008

* Possible StringData Ref from Data Obj ->"Exiting...." ====>查找标志(停到这)
|
:00406552 BA01454A00 mov edx, 004A4501
:00406557 8D45F8 lea eax, dword ptr [ebp-08]
:0040655A E8499A0200 call 0042FFA8
:
:
:
6>修改软件启动时的9次闪烁,查找关键词"Sleep"(函数名查找),应该找到连续有9个SLEEP函数调用的程序段,代码如下:
:
:
:004025A5 8BD8 mov ebx, eax
:004025A7 33D2 xor edx, edx
:004025A9 8BC3 mov eax, ebx
:004025AB E878EF0000 call 00411528 ===>设定标志位的CALL
:004025B0 80BB3025000000 cmp byte ptr [ebx+00002530], 00 ====>标志位比较
:004025B7 0F85E2000000 jne 0040269F =======>关键跳(不跳则闪烁9次)
:004025BD C6833025000001 mov byte ptr [ebx+00002530], 01
:004025C4 6A64 push 00000064

* Reference To: KERNEL32.Sleep, Ord:0000h=======>Sleep函数调用
|
:004025C6 E8BDCB0900 Call 0049F188
:004025CB 8B93D0010000 mov edx, dword ptr [ebx+000001D0]
:004025D1 8B83C8010000 mov eax, dword ptr [ebx+000001C8]
:004025D7 E8EA570800 call 00487DC6
:004025DC 6A64 push 00000064
:
: ===================>中间有7个Sleep(总共有9个Sleep,知道吗?)
:
:0040267F E842570800 call 00487DC6
:00402684 68B0040000 push 000004B0

* Reference To: KERNEL32.Sleep, Ord:0000h=======>Sleep函数调用
|
:00402689 E8FACA0900 Call 0049F188
:0040268E 8B93CC010000 mov edx, dword ptr [ebx+000001CC]
:00402694 8B83C8010000 mov eax, dword ptr [ebx+000001C8]
:0040269A E827570800 call 00487DC6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004025B7(C) ===========>跳跃地址(向上看)
|
:0040269F 5B pop ebx ====>启动的地址(最好直接跳到此)
:004026A0 C3 ret
:
:
7>动手改动(你的最爱),启动HIEW,改动地址00406516和004025B7,将他们全改为jmp就行了(位数不够的加nop) :D

8>试试吧,舒服多了吧.(所以用静态汇编时应注意程序对关键函数的调用)

9>看雪主站上有关于Windows函数的调用,掌握了函数将事半功倍!!

10>收工,睡觉了!

-----------------------------------------------
FCG ------->Http://WWW.CN778.NET
BCG ------->http://crackerabc.longcity.net/


LogoManager 1.18

标 题:LogoManager 1.18破解手记 (1千字)
发信人:hurrah
时 间:2001-2-18 19:55:17
详细信息:
软件：LogoManager 1.18
http://homepage.dtn.ntl.com/wmdb/lm118.exe (460KB)
简介：Nokia手机画面编辑软件，有NAG窗口，不注册则延时5秒进入。
破解：
（1）
用File Scaner查出它用Upx压缩，则用ProcDump->Unpack脱壳成功。
（2）
用Trw2000 Load，bpx messageboxa
* Reference To: USER32.::D, Ord:0000h
|
:00408FB9 FF1520644300 Call dword ptr [00436420]
:00408FBF 85C0 test eax, eax
:00408FC1 7512 jne 00408FD5
:00408FC3 6898714400 push 00447198
:00408FC8 FFD5 call ebp
:00408FCA 6898714400 push 00447198

* Reference To: USER32.::D, Ord:0023h
|
:00408FCF FF1524644300 Call dword ptr [00436424] ；该行显示NAG
但修改00408FCF：以上语句没用。Stop here!
（3）
换一种方法，从NAG窗口显示以后入手。
运行Logomanager.exe，出现NAG窗口后,
：hwnd
找到NAG窗口"Register Later"按钮的句柄07D0
：bmsg 07D0 wm_destroy
F5
点"Register Later"按钮后中断，终于找到关键的地址：
:0040BDFF 6A00 push 00000000
:0040BE01 744F je 0040BE52 ；改成JNE
:0040BE03 8B4624 mov eax, dword ptr [esi+24]
:0040BE06 8B0D30754400 mov ecx, dword ptr [00447530]
:0040BE0C 68E09B4000 push 00409BE0
:0040BE11 50 push eax

* Possible Reference to Dialog: DialogID_00A1
|
:0040BE12 68A1000000 push 000000A1
:0040BE17 51 push ecx
:0040BE18 E8F3A00100 call 00425F10 ；该行显示NAG
:0040BE1D 83C418 add esp, 00000018
:0040BE20 48 dec eax

将:0040BE01 改成JNE后，NAG窗口消失！OK!
最后，用UltraEdit Search 'Unregistered' 改为'Registered'。

hurrah@china.com
hurrah.go.163.com


MusiCard3.50（音乐贺卡厂）

 标 题:申请加入BCG的破解文章之二 (3千字)
发信人:NYDoll
时 间:2001-5-6 13:34:39
详细信息:
破解MusiCard3.50（音乐贺卡厂）手记

作者：娃娃（NYDoll）

软件简介： 就软件本身来说 是一个非常不错的制作贺卡的软件 可以以最快的速度制作成一张比较精美的贺卡 而且生成的是可执行文件 但我觉得这个软件其实是一个国外大型软件的分解在加上汉化推出来的作品 而且并不值得花费10元注册 这是我个人的一点愚见 但是未注册的软件生成的贺卡 在最后都带有 一个广告窗 未免有伤大雅 所以我只好破解了

破解工具：Hiew6.55注册版 W32Dasm8.93（这是Robot兄送我的修正版 感觉很好 在此对Robot兄表示感谢） FileInfo2.4 UnAspack1.0.9.1

----------------------------------------------------------------------

软件可以在华军下载，安装后发现主目录下有这些文件：

Exe.uxe 制作贺卡的模板文件，将扩展名改为EXE可以看到贺卡成品的图标
logo.gif 贺卡制成后的广告条图片，您可以把它换成其它图片，以便于制作成一个更个性化的贺卡
Makecard.mcd 这个是制作贺卡的主运行文件，将扩展名改为EXE后，可以直接运行
Musicard.exe 音乐贺卡厂的运行文件，但并不是主文件，只是起到一个连接的作用，使Makecard.mcd和Viewcard.mcd可以同时运行
setup.exe 音乐贺卡厂的设置文件，用VB编写。
Viewcard.mcd 音乐贺卡厂近期版本才有的贺卡图片以及音乐预览程序，将扩展名改为EXE后可以直接运行

用Fi检测发现 文件大多用Aspack加壳，可以手动脱壳，但为了节省时间，我们用UnAspack1.0.9.1这个工具脱壳，先制成一张贺卡，如果你已经将Exe.uxe脱壳
则做成的贺卡不会加壳，否则你还需要用UnAspack再次脱壳，用Robot兄送给我的W32Dasm反汇编贺卡程序。

这里要介绍一种方法破解软件的Nag窗口，这种方法在网上好像比较少见。将所制成的贺卡程序反汇编后，按Ctrl+L载入程序，不用加参数：

W32Dasm应该停在 ：00407156 PUSH EBP 处，这里是程序的入口点，然后点击运行或按F9

待贺卡一步一步展示到广告窗口时，回到W32Dasm，点击步进，可以看到这个时候W32Dasm停在：004041C2 Call 贺卡文件名.40498B
这里就是Nag窗口的调用Call，然后按终止按钮，强制终止程序，可以发现又回到了W32Dasm的反汇编代码窗口，这是W32Dasm正好停在广告窗口的调用处

:004041A4 833D382C410001 cmp dword ptr [00412C38], 00000001
:004041AB 7515 jne 004041C2
:004041AD 57 push edi
:004041AE 68C1114000 push 004011C1
:004041B3 57 push edi

* Possible Reference to Dialog: DialogID_0065
|
:004041B4 6A65 push 00000065
:004041B6 FF35D8284100 push dword ptr [004128D8]

* Reference To: USER32.DialogBoxParamA, Ord:0093h
|
:004041BC FF1524E24000 Call dword ptr [0040E224]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004041AB(C)
|
:004041C2 E8C4070000 call 0040498B 《----- W32Dasm应该停在这里，这就是Nag窗口的调用Call，想上找，发现:004041AB可以跳过此Call，于是用Hiew6.55将:004041AB处的Jne改为Je，再次运行没有了Nag窗口
:004041C7 E8BB040000 call 00404687
:004041CC 57 push edi

在上面我们得知Exe.uxe是程序的模板文件，于是用Hiew打开这个文件，在相同的为止将Jne命令改为Je即可取出Nag窗口，此方法适合目前所有版本的Musicard！

----------------------- 娃娃（NYDoll） ———— E-Mail：NYDoll@Etang.com ————— QQ：15110296 ————————————————


RegHance v1.1

标 题:RegHance v1.1破解实录 (5千字)
发信人:midi
时 间:2001-3-26 21:19:06
详细信息:
前言：考试在即。还是忍不住写了出来。写这篇实录花了一下午，这下考试悬了。。。

破解者: midi
级别：初级
目标: RegHance v1.1
下载: http://www.lavasoft.de/binary/awbin/regh.exe (632k)
工具： TRW2000 v1.22, W32Dasm, Hex WorkShop, UnPECompact 1.31, eXeScope,etc
作者对软件的描述:

The standard registry editor that comes with windows, lacks functionality.
Reghance was designed to give you more overview and control, making it easy
to navigate and walk through your registry.

保护：a).开始弹出" About” nag窗口，须按“close this window" 才能回到主程序；
b).About 窗口中有"This tool is a shareware...";
c).退出程序时，弹出"About"的nag窗口，须等三、四秒才能关闭退出;
d).About 窗口的image中有"unregistered"字样.

过程实录：

1）。记得SunBird大哥常说凡事都要info一下。果不出所料，主程序RegHance.exe是用PECompact加的壳。UnPECompact 1.31脱之。。。

2）。

对a)====)

运行脱壳后的主程序，看到那个"About”nag窗口停在那里，此时启动TRW。对付这类nag窗口， 我懒得去考虑下什么断点，因为可能的断点太多了。我常常采用一种最傻、但却最有效的方法"左右手配合"--就是右手在点击那个“close this window" 钮的同时，左手CTL+D （我觉得按CTL+D比较舒服）激活TRW。（为此法我练了整整一个月的时间，多亏我有弹六弦琴的功底，哈哈。。）。TRW做起这活来真是爽极了！！

——KERNEL32！CancelWaitableTimer+011F__________

0177:BFF99A75 685C002A00 PUSH DWORD 002A005C
0177:BFF99A7A E85579FDFF CALL `KERNEL32!ord_00000001`
0177:BFF99A7F 3DC0000000 CMP EAX,C0
0177:BFF99A84 8BF0 MOV ESI,EAX<------光棒在这！
0177:BFF99A86 7505 JNZ BFF99A8D
0177:BFF99A88 E8FDB7FEFF CALL BFF8528A
0177:BFF99A8D 8BC6 MOV EAX,ESI
0177:BFF99A8F 5E POP ES

pmodule返回主程：

0177:0044D044 E84F66FBFF CALL 00403698
0177:0044D049 807DFB00 CMP BYTE [EBP-05],00
0177:0044D04D 7405 JZ 0044D054
0177:0044D04F E8E0A3FBFF CALL `USER32!WaitMessage`
0177:0044D054 33C0 XOR EAX,EAX<----光棒在这里！
0177:0044D056 5A POP EDX
0177:0044D057 59 POP ECX
0177:0044D058 59 POP ECX
0177:0044D059 648910 MOV [FS:EAX],EDX
0177:0044D05C 6876D04400 PUSH DWORD 0044D076
0177:0044D061 8D45F0 LEA EAX,[EBP-10]
0177:0044D064 BA02000000 MOV EDX,02
0177:0044D069 E80E6BFBFF CALL 00403B7C

开始一次一次按F12+F10，目的是到底看看哪个call出这个nag窗口来。
需要用笔记下可疑的call或判断的地址的，（？具体哪个地址可疑要凭感觉了）并按F9设断。退出并重新运行主程，在nag窗口弹出以前会被TRW拦住去路。试着将判断语句改向或将可疑的call nop 掉。。。一次次尝试。。终于眼前一亮：

:004948A9 8BC3 mov eax, ebx
:004948AB E8342CFBFF call 004474E4
:004948B0 8BC3 mov eax, ebx
:004948B2 8B10 mov edx, dword ptr [eax]
:004948B4 FF92D8000000 call dword ptr [edx+000000D8]===>This will bring up the start nag screen, JUST nop it!
:004948BA 8BC3 mov eax, ebx
:004948BC E8CFE5F6FF call 00402E90
:004948C1 6850494900 push 00494950
:004948C6 E88953F7FF call 00409C54
:004948CB 83C4F8 add esp, FFFFFFF8
:004948CE DD1C24 fstp qword ptr [esp]
:004948D1 9B wait

至此，第一步完成！

对 b)----)

用W32Dasm反汇编脱壳后的主程序，奇怪的是竟然没有SDR，只有Data Hex 和 Imp Fn.幸运的是在Hex Workshop中能查到"This tool is a shareware". 会有两处，其中一处后面有"Thank you for your licensing reghance!"
记下它的offset:9A550,并在W32Dasm中找到相应的offset的地址：0049B150, Search 它后来到：

:0049B0E5 A1F0D64900 mov eax, dword ptr [0049D6F0]
:0049B0EA 83381A cmp dword ptr [eax], 0000001A
:0049B0ED 7512 jne 0049B101===(if license jmp)
:0049B0EF BA50B14900 mov edx, 0049B150======"This tool is shareware..."
:0049B0F4 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:0049B0FA E8A537F9FF call 0042E8A4
:0049B0FF EB10 jmp 0049B111

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049B0ED(C)
|
:0049B101 BA84B14900 mov edx, 0049B184
:0049B106 8B83DC020000 mov eax, dword ptr [ebx+000002DC]
:0049B10C E89337F9FF call 0042E8A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049B0FF(U)
|
:0049B111 80BBF402000000 cmp byte ptr [ebx+000002F4], 00
:0049B118 742A je 0049B144
:0049B11A BAB8B14900 mov edx, 0049B1B8====WAIT 3 秒
:0049B11F 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:0049B125 E87A37F9FF call 0042E8A4
:0049B12A B201 mov dl, 01
:0049B12C 8B83E8020000 mov eax, dword ptr [ebx+000002E8]
:0049B132 E8ED56FBFF call 00450824
:0049B137 33D2 xor edx, edx
:0049B139 8B83D8020000 mov eax, dword ptr [ebx+000002D8]

只须在:0049B0ED处打补丁就可去掉About窗口中的“This tool is shareware..."

对c)---)

方法和a)一样。点一下关闭程序，等delay窗口稳定下来后，运用"左右手配合"法。最后会来到：

......

:004464EA 8BC0 mov eax, eax
:004464EC 53 push ebx
:004464ED 6683B87A02000000 cmp word ptr [eax+0000027A], 0000
:004464F5 7412 je 00446509==if license, jmp and exit windows
:004464F7 8BCA mov ecx, edx
:004464F9 8BD8 mov ebx, eax
:004464FB 8BD0 mov edx, eax
:004464FD 8B837C020000 mov eax, dword ptr [ebx+0000027C]
:00446503 FF9378020000 call dword ptr [ebx+00000278] ==refer to the nag shareware reminder

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004464F5(C)
|
:00446509 5B pop ebx
:0044650A C3 ret

可以看到只须将:004464F5改改流向或将:00446503的call给nop掉，讨厌的退出nag就没了！

d)---)

最后一项我就不写了，看一看前面的帖子就行了！（在此，midi向SunBird大哥致敬！--有机会小弟请客！^_^）

3）**总结**我的补丁是：

:004948B4 FF92D8000000-->909090909090;
:0049B0ED 7512-->EB12;
:004464F5 7412-->EB12

后语：这是我应peterchen兄的要求写的第一篇破解实录。各位大虾莫见笑，多多指教！！
还望大家将破解的tip贴出来共同交流。。。
我的email: bestwishes66@ h o t m a i l . c o m


RegSnap 2.6

标 题:RegSnap 2.6破解过程 (610字)
发信人:hurrah
时 间:2001-2-17 9:39:41
详细信息:
-----------------------先从NAG窗口入手
用W32dsm89反汇编，
Find Text :"This software has not been registered"
从4045CD往上，"* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040456E(C) "
说明NAG窗口由40456E调用，
从40456E往上，"* Referenced by a CALL at Addresses:
|:0040148F , :004058BD , :00411FE7 "
这表明了在这个软件中共有三次识别软件是否注册的过程 . 因此我们在 CRACK 时 , 要注意在这三个地方进行 , 少了其中一个都不成功 .
将:004058BD E89EECFFFF call 00404560
等三处改为90 90 90 90 90 nop
这样就NAG窗口就变为"Stand version"
OK


TRW2000 1.23

标 题:trw2000123注册提示框的去除，只改一字节。 (2千字)
发信人:zest
时 间:2001-1-14 13:39:17
详细信息:
trw2000123注册提示框的去除，只改一字节。

trw2000123好像无时间限制。

更改具体原因见toye《论坛精华2》。

:0003725A 6A06 push 00000006
:0003725C 33D2 xor edx, edx
:0003725E 59 pop ecx
:0003725F F7F1 div ecx
:00037261 85D2 test edx, edx
^^ ^^^^^^^^^^^^^
C9 test ecx, ecx
:00037263 0F8516010000 jne 0003737F

trw2k的bug好像越来越多，越来越不稳定了。

现又多一软件ClipYES!，大家可去其主页看看。

为何LTT的信箱老进不去？谁能把我下列的一些问题转告？通知到LTT。

以便trw2k更好，更稳定。

三口肉！！！

三口肉！！！

没钱上网难啊！！

some problem
******************************************************************
ClipYES!:

由于很多人编辑文本文件时喜欢点击鼠标右键进行复制，粘贴工作，当使用
ClipYES复制了多个text record，能否增加鼠标右键功能，当点击鼠标右键，
移动鼠标到粘贴（p）处时，产生下级菜单，分别为刚复制的text record，
这样方便选择，还可增加一些智能处理能力，如常用的text record会自动
上移等，几乎所有的Windows clipboard tools都无此项功能。
*******************************************************************

*******************************************************************
TRW20001.23:

TRW2000真的很好，短小精干，我一直喜爱，但她仍然存在一些问题：

1、当TRW2000所在的目录字符大于8个时，如：c:\trw2000123，按热键时存在
plug-ins装载失败的现象！

2、一直困扰我的问题：先运行TRW2000后（1.22,1.23版本），按CTRL＋N硬盘
狂闪好一阵子才能出现调试界面，有时还死机。但CTRL+M没这样的问题。1.03
1.13的TRW也没CTRL+N上述问题!! 我的PC: 赛扬2 667 EP-3VCA2+ 128M PC133
RIVA128/ZX 20G迈拓 COM1接口老鼠 WIN98，我以前的P100也存在这样的问题，
上上个星期才把PC升级的，还是有这个问题，痛苦!不知道是不是软件的问题?
是否我的TRW2000.INI没配好？但在AMDK6-2 350上TRW的新老版本却从没发现
这个问题，显示卡是同一型号，TRW 的说明上写 If you press Ctrl-N and
nothing happens, try pressingany key or moving the mouse. to see if
anything happens。但没用。后找到一个折衷办法，RUN TRW1.03版,CTRL＋N
后退出,再RUN TRW1.22版，CTRL＋N无上述怪现象发生,总之,还是老版本稳定!

3、新版TRW设断如BPX HMEMCPY后，BL看会是BPX #0147:00009E62，断点多后
会糊涂，能否象老版本(1.03)那样仍然显示BPX HMEMCPY，或两种同时显示？

4、1.23版CTRL＋M（N）后出现调试界面，再按热键却不能回去，只能F5。

5、调试界面显示JUMP时，能否在旁边加上↑↓，如SOFTICE一样方便观察？

6、鼠标右键能否多加功能？
*******************************************************************


Winzip6.0

标 题:winzip6.0去窗小记 (1千字)
发信人:kobe
时 间:2001-1-24 23:08:00
详细信息:
winzip6.0去窗小记

------cracked by kobe

winzip6.0这个软件是老早就破解了的，注册机制很简单，想了解的朋友请翻阅看雪的教程或其他的CRACK站点，我就不再重新破解它，并写破解过程了！破解之后它总是show出一个窗口大意是：该版本较旧，请下载更新的版本，云云。。

当初想破解完全一点，可没那份心，今天心情不好，SO，看见哪个窗口，烦，于是

就屏蔽掉show窗口的call就ok了！这次的破解很简单，只用soft-ice和hexworkshop就完成了，入门级别，给初学者看吧。

断点用bpx createwindowex，别的什么bpx messagebox，bpx createwindow..拦不下！

拦下后bc掉断点，按5下F12就game over了！于是从4下f12后开始追了！按F10一路

step下去，按呀按。。。。又GAMEOVER了，，，噫，刚才CALL的地址忘看了，好在带过之后也能别单步STEP拦下，看上面的地址:0257:00438c30 call XXXXXXXXX;(code on看机器码:e8cb9efcff)

yeah!!!!!下次再重新执行，动态改为5个NOP，果然成功了！

于是后面的是就发生了，用hexworkshop找e8cb9efcff改为9090909090，存盘.

至此那个讨厌的窗口就不会出现了！很EASY，才化了5分钟就kill掉它了！

--------------------------------------------------------------------------------

欢迎转载请不要改动信息(C)kobe工作室

http://kobesworld.yeah.net

warmwaters@21cn.com


ZIP PASSWORD FINDER

 标 题:一个关于NaG的问题？？？ (301字)
发信人:NYDoll
时 间:2001-4-28 15:01:04
详细信息:
最近在华军下载了一个ZIP PASSWORD FINDER,是一个破解WinZIP密码的软件，虽然是免费软件不用注册，但每次运行都会出现一个讨厌的广告窗口，经过脱壳后，在TRW2000下我已经找到了关键Call，但改成NOP后马上就非法操作，而且也没有发现可以跳过此Call的地方，请各位大侠赐教!!!!

娃娃(NYDoll)

标 题:一个不完满的解决方法 (150字)
发信人:小楼
时 间:2001-4-28 16:58:56
详细信息:

ZIP Password Finder v 1

用CASPR脱壳后, EXESCOPE打开脱壳的EXE文件,在RCDATA\taboutform下,找object Timer1: TTimer, 将Interval = 100000改为1, 勉强解决.


BrickShooter 2.

标 题:BrickShooter 2.1破解心得（新手看看吧） (18千字)
发信人:mjing
时 间:2001-3-9 10:23:12
详细信息:
BrickShooter 2.1破解心得（新手看看吧）

这个软件是一个打砖块的小游戏，我个人感觉还不错，

在海阔天空处下载，Unregistered 版本 有30天的

时间限制，每局30分钟的限制，不能存盘，退出时还

有NAG，就拿它练习练习吧。

工具：CASPR 1.00,Soft-ice 4.01,UltraEdit 8.0

Exescope 6.00,icedump,FileInfo

用FileInfo查看是用Asprotect 1.00加的壳，但是

我试着手工脱壳总是不能成功（哪位高手能指点一

下？），Import Table总是不能正确还原，看来我

要好好学习一下PE文件结构了。还好最近出了个CAS，

太棒了，对我这样的菜鸟来说真是一个福音:)

下面正式开始工作：

1、打开一个DOS窗口，下命令

    caspr bshoot.exe bs.exe

这样把壳给脱了。

2、用ice载入bs.exe　F5　运行，单击“SAVE”按钮，

    它会弹出一个框，说“You are unable.....”

    ctrl-D切入sice,下断点

    bpx destroywindow

F5运行，返回BShooter,单击确定，被sice拦下，

bc *　清除断点，F11返回到BS中，下命令

s 30:0 l ffffffff 'You are unable'

找到如下地址：

0030:0045B9B8 59 6F 75 20 61 72 65 20-75 6E 61 62 6C 65 20 74 You are unable t
0030:0045B9C8 6F 20 6C 6F 61 64 20 6F-72 20 73 61 76 65 20 67 o load or save g
0030:0045B9D8 61 6D 65 20 62 65 63 61-75 73 65 20 79 6F 75 72 ame because your
0030:0045B9E8 20 63 6F 70 79 20 6F 66-20 42 72 69 63 6B 53 68 copy of BrickSh
0030:0045B9F8 6F 6F 74 65 72 20 69 73-20 55 4E 52 45 47 49 53 ooter is UNREGIS
0030:0045BA08 54 45 52 45 44 2E 0D 43-6C 69 63 6B 20 74 68 65 TERED..Click the
0030:0045BA18 20 52 65 67 69 73 74 65-72 20 6C 61 62 65 6C 20 Register label 
0030:0045BA28 66 6F 72 20 6D 6F 72 65-20 69 6E 66 6F 72 6D 61 for more informa

3、设断　　bpm 0045b9b8

F5运行，单击“SAVE”按钮，被sice拦下，按F12一层层地返回到BS中，

如一直按F10，最终会在几个ret处跳来跳去，那窗口总是不出现，

没关系，按F12二下,窗口弹出了，单击确定后又被sice拦下，

到达下面的地方：

015F:00449F6F CALL 004400D0
015F:00449F74 MOV EAX,[EBP-0C] 
015F:00449F77 MOV EDX,[EAX]
015F:00449F79 CALL [EDX+000000CC]
015F:00449F7F MOV [EBP-08],EAX
015F:00449F82 XOR EAX,EAX
015F:00449F84 POP EDX
015F:00449F85 POP ECX
015F:00449F86 POP ECX
015F:00449F87 MOV FS:[EAX],EDX
015F:00449F8A PUSH 00449F9F
015F:00449F8F MOV EAX,[EBP-0C]
015F:00449F92 CALL 00402E54
015F:00449F97 RET
015F:00449F98 JMP 004034AC
015F:00449F9D JMP 00449F8F
015F:00449F9F MOV EAX,[EBP-08]
015F:00449FA2 POP ESI
015F:00449FA3 POP EBX
015F:00449FA4 MOV ESP,EBP
015F:00449FA6 POP EBP
015F:00449FA7 RET 0010
015F:00449FAA MOV EAX,EAX
015F:00449FAC OR ECX,-01
015F:00449FAF OR EDX,-01
015F:00449FB2 CALL 00449FB8
015F:00449FB7 RET
015F:00449FB8 PUSH 00
015F:00449FBA PUSH EDX
015F:00449FBB PUSH ECX
015F:00449FBC MOV DL,04
015F:00449FBE MOV CX,[00449FCC]
015F:00449FC5 CALL 00449ED4
015F:00449FCA RET

返回几个CALL之后，就可到达下面的关键之处

015F:0045B153 MOV EDI,[00461FD4]
015F:0045B159 ADD EDI,00000100 
015F:0045B15F MOV EAX,EDI
015F:0045B161 ADD EAX,32
015F:0045B164 PUSH EAX
015F:0045B165 PUSH EBX
015F:0045B166 PUSH ESI
015F:0045B167 MOV ECX,[00461FD8]
015F:0045B16D ADD ECX,000001EF
015F:0045B173 ADD ECX,23
015F:0045B176 ADD ECX,09
015F:0045B179 MOV EDX,EDI
015F:0045B17B MOV EAX,[00461FD8]
015F:0045B180 ADD EAX,000001E5
015F:0045B185 ADD EAX,09
015F:0045B188 CALL 00458BC8
015F:0045B18D TEST AL,AL
015F:0045B18F JZ 0045B1C6
015F:0045B191 CMP BYTE PTR [0046208C],00 ;看见这个比较了吧
015F:0045B198 JNZ 0045B1B4 ;这个跳转是关键
015F:0045B19A PUSH 00
015F:0045B19C MOV CX,[0045B9AC]
015F:0045B1A3 MOV DL,02
015F:0045B1A5 MOV EAX,0045B9B8
015F:0045B1AA CALL 00449EB4
015F:0045B1AF JMP 0045B9A0
015F:0045B1B4 MOV EAX,[EBP-04]
015F:0045B1B7 MOV EAX,[EAX+00000318]
015F:0045B1BD MOV ECX,ESI
015F:0045B1BF MOV EDX,EBX
015F:0045B1C1 MOV EDI,[EAX]
015F:0045B1C3 CALL [EDI+3C]
015F:0045B1C6 MOV EDI,[00461FD4]
015F:0045B1CC ADD EDI,00000155
015F:0045B1D2 MOV EAX,EDI
015F:0045B1D4 ADD EAX,30
015F:0045B1D7 PUSH EAX
015F:0045B1D8 PUSH EBX 
015F:0045B1D9 PUSH ESI  

    显然，[0046208C]处存放的是注册标志，

4、清除以前所有断点，重新设断

bpm 0046208c

重新载入，在如下处拦下：

015F:00458B94 INVALID
015F:00458B96 INVALID
015F:00458B98 ADD AL,00
015F:00458B9A ADD [EAX],AL
015F:00458B9C INSD
015F:00458B9E IMUL ESP,[EAX+EAX+00],05C60000
015F:00458BA6 MOV [EAX],FS
015F:00458BA8 INC ESI
015F:00458BA9 ADD [EAX],AL
015F:00458BAB JMP 00458BB1 ;在这儿被拦下，
015F:00458BAD JMP 00458BB4
015F:00458BAF MOV [ECX+000007E9],ECX
015F:00458BB5 ADD [ESI+53F23D5B],AL
015F:00458BBB MOV ECX,EB04EB5A
015F:00458BC0 ADD EAX,C3C39999
015F:00458BC5 LEA EAX,[EAX+00]
015F:00458BC8 PUSH EBP
015F:00458BC9 MOV EBP,ESP
015F:00458BCB PUSH ESI
015F:00458BCC PUSH EDI
015F:00458BCD MOV EDI,[EBP+08]
015F:00458BD0 MOV ESI,[EBP+0C]
015F:00458BD3 CMP EAX,ESI
015F:00458BD5 JG 00458BE4
015F:00458BD7 CMP ECX,ESI
015F:00458BD9 JL 00458BE4
015F:00458BDB CMP EDX,EDI
015F:00458BDD JG 00458BE4
015F:00458BDF CMP EDI,[EBP+10]
015F:00458BE2 JLE 00458BE8
015F:00458BE4 XOR EAX,EAX
015F:00458BE6 JMP 00458BEA
015F:00458BE8 MOV AL,01
015F:00458BEA POP EDI
015F:00458BEB POP ESI
015F:00458BEC POP EBP
015F:00458BED RET 000C

00458bab处的上一条指令应该是写注册标志的指令，

但是上面的指令已经“花”了，没关系，F5运行，

同样，在相同地方被拦下，按f10一步一步返回到

上一层,如下

015F:00458F09 MOV EBP,ESP
015F:00458F0B PUSH 00
015F:00458F0D PUSH 00
015F:00458F0F PUSH EBX
015F:00458F10 PUSH ESI
015F:00458F11 PUSH EDI
015F:00458F12 MOV EBX,EAX
015F:00458F14 XOR EAX,EAX
015F:00458F16 PUSH EBP
015F:00458F17 PUSH 00459227
015F:00458F1C PUSH DWORD PTR FS:[EAX]
015F:00458F1F MOV FS:[EAX],ESP
015F:00458F22 CALL 00458BA4 ;就是这个CALL
015F:00458F27 MOV EAX,[0045FEBC]
015F:00458F2C MOV EAX,[EAX]
015F:00458F2E MOV EAX,[EAX+000002D0]
015F:00458F34 MOV EDX,[EBX+00000360]
015F:00458F3A CALL 004495F0
015F:00458F3F MOV ECX,00459240
015F:00458F44 MOV DL,01
015F:00458F46 MOV EAX,[0044C404]
015F:00458F4B CALL 0044C4AC
015F:00458F50 MOV ESI,EAX
015F:00458F52 PUSH 01
015F:00458F54 MOV ECX,00459254
015F:00458F59 MOV EDX,00459264
015F:00458F5E MOV EAX,ESI
015F:00458F60 MOV EDI,[EAX]
015F:00458F62 CALL [EDI+10]
015F:00458F65 MOV EDX,EAX
015F:00458F67 MOV EAX,[0045FEBC]
015F:00458F6C MOV EAX,[EAX]
015F:00458F6E MOV EAX,[EAX+000002C4]
015F:00458F74 MOV ECX,[EAX]
015F:00458F76 CALL [ECX+000000BC]
015F:00458F7C PUSH 01
015F:00458F7E MOV ECX,00459274
015F:00458F83 MOV EDX,00459264 
015F:00458F88 MOV EAX,ESI  

在015F:00458F22处设断，并清除以前断点，

重新载入，运行被拦下后，按F8进入该CALL

015F:00458BA4 MOV BYTE PTR [0046208C],00 ；就是这个指令
015F:00458BAB JMP 00458BB1 
015F:00458BAD JMP 00458BB4
015F:00458BAF MOV [ECX+000007E9],ECX
015F:00458BB5 ADD [ESI+53F23D5B],AL
015F:00458BBB MOV ECX,EB04EB5A
015F:00458BC0 ADD EAX,C3C39999
015F:00458BC5 LEA EAX,[EAX+00]
015F:00458BC8 PUSH EBP
015F:00458BC9 MOV EBP,ESP
015F:00458BCB PUSH ESI
015F:00458BCC PUSH EDI
015F:00458BCD MOV EDI,[EBP+08]
015F:00458BD0 MOV ESI,[EBP+0C]
015F:00458BD3 CMP EAX,ESI

这回看到了“花”指令的真面目了吧，下code on 看一下机器码

015F:00458BA4 C6058C20460000 MOV BYTE PTR [0046208C],00
015F:00458BAB EB04 JMP 00458BB1 
015F:00458BAD EB05 JMP 00458BB4
015F:00458BAF 8989E9070000 MOV [ECX+000007E9],ECX
015F:00458BB5 00865B3DF253 ADD [ESI+53F23D5B],AL
015F:00458BBB B95AEB04EB MOV ECX,EB04EB5A
015F:00458BC0 059999C3C3 ADD EAX,C3C39999
015F:00458BC5 8D4000 LEA EAX,[EAX+00]
015F:00458BC8 55 PUSH EBP
015F:00458BC9 8BEC MOV EBP,ESP
015F:00458BCB 56 PUSH ESI
015F:00458BCC 57 PUSH EDI
015F:00458BCD 8B7D08 MOV EDI,[EBP+08]
015F:00458BD0 8B750C MOV ESI,[EBP+0C]
015F:00458BD3 3BC6 CMP EAX,ESI
015F:00458BD5 7F0D JG 00458BE4
015F:00458BD7 3BCE CMP ECX,ESI


EasyRecovery 5.0

 标 题:EasyRecovery 5.0 5个文件限制的破解全攻略（拯救被误除文件的朋友们^_^!） (4千字)
发信人:小牧童
时 间:2000-9-20 23:14:27
详细信息:
EasyRecovery 5.0 5个文件限制的破解全攻略。
破解者：小牧童
Url: http://www.newhua.com.cn/down/ERPERFRE.exe
简介：这是一个非常好的反删除软件，实际使用功能强于Recover 4 all等其它反删除软件，正好一个朋友的计算机不小删除了很重的数据，请我帮忙恢复，于是到华军的软件园下载了几个反删除软件，其它几个软件都找不到他删除了的目录，唯有这个东东能找到被删除的目录和文件，但每执行一次操作只能保存5个被删除的文件，而且有超过5个以上的文件时有时不能保存10K以上的文件(保存为0字)，由于在朋友的大硬盘上执行一次反删除操作要20多分钟，要想破解实在受不了。

破解步骤：
1． 找来Pqmagic对我的硬盘进行分区，分出一个15M小区，目的使其运行时间尽可能变短。
2． 用W32DASM对其进行静态反汇编查找关键代码。
根据出错信息找不到关键点，出现出错信息5个文件早已存完了，关键点在出错信息之前。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A6DC(C)
|
:0041A81D 8B0D38865200 mov ecx, dword ptr [00528638]
:0041A823 85C9 test ecx, ecx
:0041A825 0F84F0FEFFFF je 0041A71B
:0041A82B 8B01 mov eax, dword ptr [ecx]

* Possible StringData Ref from Data Obj ->"Data Recovery Limited to five "
->"files." ／／这里是限制提示。
|
:0041A82D 68C4B35100 push 0051B3C4
:0041A832 E9E1FEFFFF jmp 0041A718

＊＊＊这段代码从0041A6DC而来，往上去看看。

* Referenced by a CALL at Address:
|:00417FAB
|
:0041A6D0 8A442404 mov al, byte ptr [esp+04]
:0041A6D4 81ECD8010000 sub esp, 000001D8
:0041A6DA 84C0 test al, al
:0041A6DC 0F853B010000 jne 0041A81D
:0041A6E2 8B0D34865200 mov ecx, dword ptr [00528634]
:0041A6E8 85C9 test ecx, ecx
:0041A6EA 7407 je 0041A6F3
:0041A6EC 6A64 push 00000064
:0041A6EE E8AD920000 call 004239A0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A6EA(C)
|
:0041A6F3 8B0D38865200 mov ecx, dword ptr [00528638]
:0041A6F9 85C9 test ecx, ecx
:0041A6FB 740A je 0041A707
:0041A6FD 8B11 mov edx, dword ptr [ecx]

* Possible StringData Ref from Data Obj ->"EasyRecovery has successfully "
->"copied your files. You will find "
->"the data stored on the destination "
->"you specified."
|
:0041A6FF 6840B55100 push 0051B540

这里竟有一段"EasyRecovery has successfully "的提示。更改上面的几处跳转语句仍不能解决问题，看来关键点仍在这之前。这段代码是由00417FAB调用的，再看看00417FAB处的语句:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417F6B(C)
|
:00417F81 8B0DC87C5200 mov ecx, dword ptr [00527CC8]
:00417F87 68C8745200 push 005274C8
:00417F8C 53 push ebx
:00417F8D 51 push ecx
:00417F8E 8B0D3C7F5200 mov ecx, dword ptr [00527F3C]
:00417F94 E817F6FFFF call 004175B0
:00417F99 68D0070000 push 000007D0

* Reference To: KERNEL32.Sleep, Ord:0296h
|
:00417F9E FF1588524B00 Call dword ptr [004B5288]
:00417FA4 8A15FC805200 mov dl, byte ptr [005280FC]
:00417FAA 52 push edx
:00417FAB E820270000 call 0041A6D0 //这里就是调用上面的提示代码
:00417FB0 A078AA5100 mov al, byte ptr [0051AA78]
:00417FB5 83C404 add esp, 00000004
:00417FB8 3AC3 cmp al, bl
:00417FBA 881DFD805200 mov byte ptr [005280FD], bl
:00417FC0 891DA47F5200 mov dword ptr [00527FA4], ebx

为了验证自已的判断，我将00417FAB处的代码“E820270000“改为“9090909090“（空操作）果真在提示之前5个文件已存完。真正的比较应还在这个CALL之前。于是在00417F94处设断点。拦到后用F8进去。再下BPX WRITEFILE然后一直按Ｆ10看哪个ＣＡＬＬ调用是写文件的。不想却发现了下面的代码。
:00417BC1 A1306C5200 mov eax, dword ptr [00526C30]
:00417BC6 83C408 add esp, 00000008
:00417BC9 40 inc eax
:00417BCA 83F805 cmp eax, 00000005 ／／哈哈！职业最敏感的地方
:00417BCD A3306C5200 mov dword ptr [00526C30], eax
:00417BD2 7207 jb 00417BDB //这里改为JMP 破解完毕。
:00417BD4 C605FC80520001 mov byte ptr [005280FC], 01 ／／５个文件之后这里是设标志了。

经此破解后10K限制也解除了。

３．修改：查83 f8 05 a3 30 6c 52 00 72 07 将72改为EB

谨以此文拯救被误除文件的朋友们。


PwlTool

标 题:PwlTool的功能限制的破解---DDXia[CCG] (8千字)
发信人:1212
时 间:2001-3-10 20:06:26
详细信息:
PwlTool的功能限制的破解 （转载希望保持完整）

【作者】丁丁虾 又名：DDXia [CCG]
【级别】神出鬼没、快乐的菜鸟一只 ^)^

【目标 URL】soft4you.com
【使用工具】SoftICE FOR NT/REGMONITER/Caspr101

【序言】

呵呵~~~~（一阵阵的傻笑），好久好久没有来这CRACK江湖荡一荡了！！昨天碰到SB老大，
居然说我玩失踪 ：）真是的！不过是隔了一个世纪没有见到而已啦！！呵呵！！原因还是
工作比较忙，压的我透不过气，出差的事情时常发生！！（人在江湖，身不由己），最近还
比较稳定，不经常出差，所以偷点时间来补习补习CRACK。忙里偷闲，过一刻轻松时间，如果
忙过头了，就是工作狂。做的开心，也就活的开心。就象写CRACK破文一样，心情好，就口水
特别多，资源共享，好文大家分享！！说到"资源共享"，不得不多说两句，就想起这个世纪
第一次上QQ时，就碰到TOYE兄（他的第二句话就是你的文章已经发表了，哇！！！不可能吧！
我何得何能！！原来是这样：
URL：http://go2.163.com/~toye/temp.htm
===============================================================================
先有满舟，后有《黑客防线》，如今的商家为了争夺市场份额，增加发行量，使HACK、CRACK
技术堂而皇之的发表，高举"矛与盾"的大旗，在那面旗的背后，隐藏着卑鄙的金钱交易，说来说去就是一个利---利益驱动。
更可恶、更卑鄙、更下流的是他们从网上把别人的辛勤成果下载下来，当成自己的成果来发
表，简直无耻、龌龊之极。总会有一天会遭到报应的！
===============================================================================

今天我们拿RELPW来部分剖析，一个同事传了个破PWL文件的软件过来，他说那是个DEMO只能破4位
密码,而且没有输入注册码地方，he's a programmer。以为程序中只编写了ONLY 4位代码，
刚开始我也这样认为，后来有事没事的就"白"了它几眼，还真能"白"出东东来！不信！！
用EXESCOPE 来"白"(先脱壳），重大发现：

在RC资源中的TFREPWL

object NumberMin: TSpinEdit
Left = 220
Top = 1
Width = 40
Height = 22
Hint =
'Maximum password length for SearchPassword and SearchPasswordFas' +
't buttons'
AutoSize = False
MaxLength = 2
MaxValue = 12***************注意
MinValue = 1
ParentShowHint = False
ShowHint = True
TabOrder = 0
Value = 1
OnChange = NumberMinChange
end
object NumberMax: TSpinEdit
Left = 292
Top = 1
Width = 41
Height = 22
Hint =
'Maximum password length for SearchPassword and SearchPasswordFas' +
't buttons'
AutoSize = False
MaxLength = 2
MaxValue = 14***************注意
MinValue = 1
ParentShowHint = False
ShowHint = True
TabOrder = 1
Value = 2
OnChange = NumberMaxChange
end
end

看到上面的TIPS 太兴奋了！！原来作者在玩猫捉老鼠游戏，4位以上的破解代码居然也编
写其中！！：） 哈哈~~~~~~ 看来有机会，不能错过这个大好时光。Let‘S GO 。然后，用
exescop修改Value的值，使它大于4。修改和运行了几次，都发现没有成功,本来以为简简单
单，就可以收工啦！！看来只是走了万里长征的第一小步。唉！！！早知这么困难就不拿它
来做讲解了！（哦！！原来这小子是这样的人，终于认识啦！日久见人心啊！什么什么！！
我可没有说要收工啊！！我要求平反！！！：）你们两个别吵了，有又重大发现，看为什么
每次它关闭后和启动时的NumberMinValue和NumberMaxValue都相等。那说明什么？？？程序
退出时候，一定是把这两个值保存了下来，在它再次启动的时候使用。会存在哪？？？第一
时间的反应当然是在注册表啦！！赶紧启动REGMONITOR（这玩意确实是个好东东），得到如
下的收获：

43 repwl1.exe CloseKey HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes SUCCESS Key: 0xE1FD7100
44 repwl1.exe CreateKey HKCU\Software\Soft4You\Repwl SUCCESS Key: 0xE1EFB880
45 repwl1.exe SetValue HKCU\Software\Soft4You\Repwl\Run SUCCESS "G:\temp\pwltoold\repwl1.exe"
46 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\CharSet SUCCESS "1234567890"
47 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\CharSet SUCCESS "1234567890"
48 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\CharSet SUCCESS "1234567890"
49 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\CharSet SUCCESS "1234567890"
50 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\CharSet SUCCESS "1234567890"
51 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\CharSet SUCCESS "1234567890"
52 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\NumberMinValue SUCCESS 0x4
53 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\NumberMaxValue SUCCESS 0x4
54 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\NumberMinValue SUCCESS 0x4
55 repwl1.exe QueryValue HKCU\Software\Soft4You\Repwl\NumberMaxValue SUCCESS 0x4

呵呵~~~~ 终于看见庐山真面目。那就修改注册表中值，那应该总算没有问题！！再次运行程序，
我倒~~~~~~~ （看来是不行的，想不用SOFTICE都不行，放下屠刀，立地成佛是比较难的事情啦！）

做事情要三思而后行，就是要如何能一次就抓中重点，再仔细"瞧"一"瞧"，如果要拦截读注册表
NumberMinValue值的操作。当然下QueryValue的断点，那当然可以啦！！但实际上有更好方法，
下SetValue的断点，中断后，然后再下QueryValue的断点，那是更好的！！：）（想起一段广告
词"没有最好的，只有更好的"，人一直努力地做更好的，不断的突破自我，总有一天会最好）

bpx RegSetValueA
中断后，先屏蔽----BD
再下中断：
bpx RegQueryValueEXA--------注意它的结尾是EXA 如果你是BPX RegQueryValueA肯定就拦不到

拦截过程就不详细讲解啦！ 主要看一下代码：

:0047A6D9 50 push eax**********d eax -----"NumberMinValue"
:0047A6DA 8B4604 mov eax, dword ptr [esi+04]
:0047A6DD 50 push eax

* Reference To: advapi32.RegQueryValueExA, Ord:0000h
|
:0047A6DE E8C9C2F8FF Call 004069AC
:0047A6E3 85C0 test eax, eax
:0047A6E5 0F94C3 sete bl
:0047A6E8 8B0424 mov eax, dword ptr [esp]******获取的MIN值
:0047A6EB E86CFDFFFF call 0047A45C ****************加工一下MIN值
:0047A6F0 884500 mov byte ptr [ebp+00], al*****加工完后的产品出口 ：）
:0047A6F3 8BC3 mov eax, ebx
:0047A6F5 5A pop edx
:0047A6F6 5D pop ebp
:0047A6F7 5F pop edi
:0047A6F8 5E pop esi
:0047A6F9 5B pop ebx

来来来 看一看产品加工的过程：（都挺简单的，自己看啦）
（丁丁虾抚了抚胸，好怕怕，幸好这样简单，很久没有CRACK，害怕遇到太难的问题，这样
会失去信心！！呵呵~~~~~）
* Referenced by a CALL at Addresses:
|:0047A6EB , :0047A8D2
|
:0047A45C 83F801 cmp eax, 00000001 ********
:0047A45F 7503 jne 0047A464
:0047A461 B001 mov al, 01
:0047A463 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A45F(C)
|
:0047A464 83F802 cmp eax, 00000002 ********
:0047A467 7504 jne 0047A46D
:0047A469 B002 mov al, 02
:0047A46B EB14 jmp 0047A481

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A467(C)
|
:0047A46D 83F804 cmp eax, 00000004 ********
:0047A470 7504 jne 0047A476
:0047A472 B003 mov al, 03
:0047A474 EB0B jmp 0047A481

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A470(C)
|
:0047A476 83F803 cmp eax, 00000003 ********
:0047A479 7504 jne 0047A47F
:0047A47B B004 mov al, 04
:0047A47D EB02 jmp 0047A481

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047A479(C)
|
:0047A47F 33C0 xor eax, eax ********

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047A46B(U), :0047A474(U), :0047A47D(U)
|
:0047A481 C3 ret

发现有两个地方（0047A6EB和0047A8D2）调用这段程序。简单的处理方法就是把
:0047A45C 83F801 cmp eax, 00000001 ********909090
:0047A45F 7503 jne 0047A464 ********9090
:0047A461 B001 mov al, 01 ********9090

嘻嘻~~~~~ 终于可以收工了！！！这个程序中还有其他的限制，有时间再研究啦（毕竟还
是比较懒的！呵呵~~~~~）

【后记】
全篇破文，所列举出的代码难度是非常的简单。其目的不是让你去破解这程序，而
是让你养成一种仔细观察，详细分析遇到的情况，能灵活运用已知的知识，关键是能突破自我
创造新的思路、思维。其实呢！！思路、思维的灵活应用不仅仅可以使用在CRACK上，在生活
中一样的适用。

说到这想起和Aispark（主页：purewom.yeah.net）聊的一个生活中的CRACK笑话：

(2001-03-01 14:00:20) Aispark
呵呵，有一次我和我的GF去吃火锅，我问服务员，这边的桌子有没有时间限制。

(2001-03-01 13:56:28) DDXia
是不是 三个小时的使用期限 呵呵~~~~
原来现实中也需要CRACK ：D

(2001-03-01 14:02:44) Aispark
是的，可惜没地方输注册码，要输的话也只有MONEY了。

(2001-03-01 13:58:02) DDXia
注册码----有啊有啊！！刷卡--卡号嘛 ：）

完成时间
2001.3.9 23:36:01


Resource Grabber v2.68c

标 题:Resource Grabber v2.68c 功能限制去除 (2千字)
发信人:Blowfish
时 间:2001-3-2 14:33:43
详细信息:
http://www.newhua.com/RESOURCEGRABBER.HTM

试用版有文件数目限制，即每个目录下只能提取一定数目的资源出来。
反汇编后查找"Demo limit"，找到好多处，每一处对应一种资源格式。如下。把004E402F处的jle改为jmp就ok了，总共大概要改20处左右。其它的受限制的功能在试用版中没有。

:004E4012 8B154CBD5000 mov edx, dword ptr [0050BD4C]
:004E4018 0302 add eax, dword ptr [edx]
:004E401A 3B0518D35000 cmp eax, dword ptr [0050D318]
:004E4020 7FDB jg 004E3FFD
:004E4022 A1CCB95000 mov eax, dword ptr [0050B9CC]
:004E4027 8B00 mov eax, dword ptr [eax]
:004E4029 3B0518D35000 cmp eax, dword ptr [0050D318]
:004E402F 7E39 jle 004E406A
:004E4031 A178BC5000 mov eax, dword ptr [0050BC78]
:004E4036 FF00 inc dword ptr [eax]

* Possible StringData Ref from Code Obj ->"skipped ""
|
:004E4038 6868704E00 push 004E7068
:004E403D 8D55A8 lea edx, dword ptr [ebp-58]
:004E4040 8B45F8 mov eax, dword ptr [ebp-08]
:004E4043 8B08 mov ecx, dword ptr [eax]
:004E4045 FF5134 call [ecx+34]
:004E4048 FF75A8 push [ebp-58]

* Possible StringData Ref from Code Obj ->"": Demo limit .."
|
:004E404B 687C704E00 push 004E707C
:004E4050 8D45AC lea eax, dword ptr [ebp-54]
:004E4053 BA03000000 mov edx, 00000003
:004E4058 E8EF00F2FF call 0040414C
:004E405D 8B55AC mov edx, dword ptr [ebp-54]
:004E4060 8B45FC mov eax, dword ptr [ebp-04]
:004E4063 E864520000 call 004E92CC
:004E4068 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E402F(U)
|
:004E406A B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"怓A"
|
:004E406C A190094100 mov eax, dword ptr [00410990]
:004E4071 E8FEEFF1FF call 00403074
:004E4076 8BF0 mov esi, eax
:004E4078 8BD6 mov edx, esi
:004E407A 8B45F8 mov eax, dword ptr [ebp-08]
:004E407D 8B08 mov ecx, dword ptr [eax]
:004E407F FF514C call [ecx+4C]
:004E4082 84DB test bl, bl
:004E4084 744D je 004E40D3

* Possible StringData Ref from Code Obj ->"writing "
|
:004E4086 6898704E00 push 004E7098

BF


流光2001

标 题:去掉流光2001 Gold Edition (Preview 1 Build 2262 Patch 2) 中文版 For Win98/ME部分功能限制 (701字)
发信人:zombieys
时 间:2001-4-5 20:01:12
详细信息:
去掉流光2001 Gold Edition (Preview 1 Build 2262 Patch 2) 中文版 For Win98/ME部分功能限制

查找方法：用w32dsm反汇编，查找出错信息所对应的地址，用s-ice loader加载后，稍加调试即可。

1.免注册
407e53 75(cc)0a->eb0a jnz 407e5f ->jmp 407e5f

2.去时限(现在改成只有上线验证一种方式了)
46cafe 6aff ->c3 push ffffffff ->ret

3,去ip限制
45cf8d 746d ->eb6d jz 45cffc ->jmp 45cffc

4.去文件代码自校验
406992 7416 ->eb16 jz 4069aa ->jmp 4069aa

4069c1 740b ->eb0b jz 4069ce ->jmp 4069ce

修改方法：用peditor的flc功能转换virtual address为offset,然后用winhex搞定。完活:)

cracked by zombieys
my oicq is 1789655
my hp is zombieys.126.com
thanks for your supports


Alligator v1.3: Build 304

标 题:Alligator v1.3: Build 304 广告条的去除过程 (5千字)
发信人:CoolBob[CCG]
时 间:2001-4-15 2:40:21
详细信息:
Alligator v1.3: Build 304 广告条的去除过程
1、下载地址：http://www.nearsoftware.com/alligator/download/
2、大小：505Kb
3、破解工具：SoftICE 4.05,TRW2000,Win32dasm 8.93,Hiew 6.40
4、软件简介：是一个相当不错的下载工具，完全用API写成，可执行文件用PECompact v1.22 fast 压缩过。
----------------------------------------------------------
破解过程：1、用TRW2000装载程序，在下MakePE c:\a.exe，脱壳很简单
2、用Win32dasm打开a.exe,在StrRef中找到一些出错消息，比如
"Ad Location Creation Error"，很显然这个Ad就是广告的意思，双击鼠标跳到这里
* Possible StringData Ref from Code Obj ->"Ad Location Creation Error"
|
:00401BD6 68E4584200 push 004258E4
:00401BDB 51 push ecx
:00401BDC 6A00 push 00000000
向上翻翻，会发现有个地方调用这段代码
* Referenced by a CALL at Address:
|:0040192E
|
在:0040192E里代码如下：
* Referenced by a CALL at Address:
|:00401E43
|
:00401920 8B442408 mov eax, dword ptr [esp+08]
:00401924 56 push esi
:00401925 8BF1 mov esi, ecx
:00401927 8B4C2408 mov ecx, dword ptr [esp+08]
:0040192B 56 push esi
:0040192C 50 push eax
:0040192D 51 push ecx
:0040192E E84D020000 call 00401B80 <------就是这里
:00401933 83C40C add esp, 0000000C
:00401936 33D2 xor edx, edx
:00401938 83F8FF cmp eax, FFFFFFFF
:0040193B 894614 mov dword ptr [esi+14], eax
:0040193E 0F95C2 setne dl
:00401941 4A dec edx
:00401942 5E pop esi
:00401943 8BC2 mov eax, edx
:00401945 C20800 ret 0008
这时候又发现:00401E43 也调用这段代码。干脆一不做二不休，找到

:00401E43 E8D8FAFFFF call 00401920 <1> 把这个NOP掉，同样可以找到
:0040BF06 E8755EFFFF call 00401D80 <2>
:0040CAAB E8E04BFFFF call 00401690 <3>
再把下面两个也NOP掉。现在运行程序看看，好家伙广告条没有了，但留下了一堵墙:(，还有在原来广告条的地方点一下鼠标会打开浏览器进入她的主页，还有右边的那个讨厌的按钮(Remove Banner)，都是一个德行。估计都是调用 ShellExecute或WinExec，本来应该下断点的。但我在这里偷了个懒，因为在反汇编的文本中可以发现与"http://www.nearsoftware.com/alligator"有关的字符串所以直接按F3查找就可以来到这里:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C8E2(C)
|
:0040D319 6A01 push 00000001
:0040D31B 53 push ebx
:0040D31C 53 push ebx

* Possible StringData Ref from Code Obj ->"http://www.nearsoftware.com/alligator/registra"
->"tion/"
|
:0040D31D 6864584200 push 00425864

发现是从这里跳过来的|:0040C8E2(C)，看看
:0040C8D6 81FFEA030000 cmp edi, 000003EA <---右边按钮的ID
:0040C8DC 0F8F510A0000 jg 0040D333
:0040C8E2 0F84310A0000 je 0040D319 <----NOP <4>
这段代码的意思就是如果按下那个Remove Banner的按钮就跳到打开浏览器处。所以我把:0040C8E2处又NOP掉了，这个按钮的作用也就被Disabled了。
再按F3查找，来到这里:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040189E(C)
|
:004018C0 6A09 push 00000009
:004018C2 6A00 push 00000000
:004018C4 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"http://www.nearsoftware.com/" <------来到这里
|
:004018C6 6898584200 push 00425898

* Possible StringData Ref from Code Obj ->"open"
|
:004018CB 685C584200 push 0042585C
:004018D0 6A00 push 00000000

* Reference To: SHELL32.ShellExecuteA, Ord:0000h
|
:004018D2 FF151C324200 Call dword ptr [0042321C]
------------------------------------------------------------------------------------
:0040189C 85C0 test eax, eax
:0040189E 7520 jne 004018C0 <------NOP <5>
:004018A0 8B4614 mov eax, dword ptr [esi+14]
:004018A3 85C0 test eax, eax
:004018A5 7431 je 004018D8
向上翻找到是从|:0040189E(C)跳过来的，把他也NOP掉。
3、整理一下，
:00401E43 E8D8FAFFFF call 00401920 <1> 把这几个call NOP掉
:0040BF06 E8755EFFFF call 00401D80 <2>
:0040CAAB E8E04BFFFF call 00401690 <3>
:0040C8E2 0F84310A0000 je 0040D319 <----NOP <4>
:0040189E 7520 jne 004018C0 <----NOP <5>
再来运行一下程序，广告条没有了，按钮也Disabled了，现在唯一不爽的就是一堵墙在那里:(
后记: 这个程序的广告函数是C:\Windows\tsad.dll,小弟不知道能不能跳过它，还请高手赐教。这个程序完全采用API来实现，果然精练小巧，一个CreateDialogParam就搞定了实在佩服Peter sokolow。那堵墙我也没办法搞定:(。小弟最近在研究32位的asm编程，有兴趣的可以和小弟一起研究，我的Oicq:1618778 E-mail:coolbob@21cn.com

------------------------------------------------------------written by CoolBob[CCG] 2001.4.15


BuddyPhone v2.07

 标 题:BuddyPhone v2.07 广告条去除 (3千字)
发信人:liangs
时 间:2000-10-19 23:39:29
详细信息:
BuddyPhone v2.07 广告条去除

Write By liangs

使用工具：Trw2000; W32Dasm; UltraEdit

BuddyPhone 到了2.07版就没地方输入注册号码了，让人讨厌的广告条
就真没办法去除了吗？其实也不是，昨天研究了一下，发现虽然不能
输入注册号码，但要去除其广告条其实也不难。

首先运行Trw2000,用它将BuddyPhone载入
下 bpx readfile，再 G
程序会在调用 readfile 功能时中断
BD * 屏蔽掉所有中断
下 PMODULE 回到程序中来
按 F12 6次，这时我们看到程序主框架已经出来了，当然，广告条也出来了，
F10返回程序上一层调用，这时，我们停在00404709处，下bpx 00404709,
重新运行程序，中断后 F8跟入。

* Possible StringData Ref from Data Obj ->"key"
|
:004077F7 68B8874700 push 004787B8
:004077FC 8D4DC8 lea ecx, dword ptr [ebp-38]

* Possible StringData Ref from Data Obj ->"license"
|
:004077FF 68C8874700 push 004787C8
:00407804 51 push ecx
:00407805 8BC8 mov ecx, eax
:00407807 E8C4EC0400 call 004564D0
:0040780C 8D4DB0 lea ecx, dword ptr [ebp-50]
:0040780F C645FC02 mov [ebp-04], 02
:00407813 E81E120400 call 00448A36
:00407818 8D4DB4 lea ecx, dword ptr [ebp-4C]
:0040781B E816120400 call 00448A36
:00407820 6A2D push 0000002D
:00407822 8D4DC8 lea ecx, dword ptr [ebp-38]
:00407825 895DD8 mov dword ptr [ebp-28], ebx
:00407828 E8CE110400 call 004489FB
:0040782D 8BF8 mov edi, eax
:0040782F 83FFFF cmp edi, FFFFFFFF
:00407832 0F84F4000000 je 0040792C
一路按F10，到达这里，这是我们碰到的第一个跳转，
如果跳到0040792C处，广告条就不可避免的会出现。

:00407838 8B55B0 mov edx, dword ptr [ebp-50]
:0040783B 395AF8 cmp dword ptr [edx-08], ebx
:0040783E 0F84E8000000 je 0040792C
同上面00407832处一样，不能让它跳。

:00407844 8B45B4 mov eax, dword ptr [ebp-4C]
:00407847 3958F8 cmp dword ptr [eax-08], ebx
:0040784A 0F84DC000000 je 0040792C
又是一个同样地址的跳转，不能让它跳。

......部分代码略

:00407901 E800B20200 call 00432B06
:00407906 83C408 add esp, 00000008
:00407909 3BF8 cmp edi, eax
:0040790B 7507 jne 00407914
此处同样不能跳，不然广告条就会出现，你试试看就知道了。

:0040790D C745D801000000 mov [ebp-28], 00000001
走到这里知道了吧，上面忙活半天就是为了将[ebp-28]置1，作为已注册标志!!!
而敌人就是想方设法要让你跳过这条语句！

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040790B(C)
|
:00407914 8D4DAC lea ecx, dword ptr [ebp-54]
:00407917 C645FC03 mov [ebp-04], 03
:0040791B E8140C0400 call 00448534
:00407920 8D4DD0 lea ecx, dword ptr [ebp-30]
:00407923 C645FC02 mov [ebp-04], 02
:00407927 E8080C0400 call 00448534

现在该知道怎么改了吧
(1) 地址 00407832 将 0F84F4000000 改为909090909090
(2) 地址 0040783E 将 0F84E8000000 改为909090909090
(3) 地址 0040784A 将 0F84DC000000 改为909090909090
(4) 地址 0040790B 将 7507 改为9090

重新运行程序，哈哈，广告条没有了。

标 题:原来License Key是隐藏的呀，不如试试把Key追出来，写个注册机！ (1千字)
发信人:1212
时 间:2000-10-20 9:33:08
详细信息:

下面的代码显然是判断注册码的：
* Possible StringData Ref from Data Obj ->"key"
|
:004077F7 68B8874700 push 004787B8
:004077FC 8D4DC8 lea ecx, dword ptr [ebp-38]

* Possible StringData Ref from Data Obj ->"license"
|
:004077FF 68C8874700 push 004787C8
:00407804 51 push ecx
:00407805 8BC8 mov ecx, eax
:00407807 E8C4EC0400 call 004564D0
:0040780C 8D4DB0 lea ecx, dword ptr [ebp-50]
:0040780F C645FC02 mov [ebp-04], 02
:00407813 E81E120400 call 00448A36
:00407818 8D4DB4 lea ecx, dword ptr [ebp-4C]
:0040781B E816120400 call 00448A36
:00407820 6A2D push 0000002D //横杠字符"-"，注册码很可能分成几部分
:00407822 8D4DC8 lea ecx, dword ptr [ebp-38]
:00407825 895DD8 mov dword ptr [ebp-28], ebx
:00407828 E8CE110400 call 004489FB //判断，跟进去看看
:0040782D 8BF8 mov edi, eax
:0040782F 83FFFF cmp edi, FFFFFFFF
:00407832 0F84F4000000 je 0040792C


FlashGet(JetCar)0.94

 标 题:flashget0.96去除广告条方法 (3千字)
发信人:kingtall
时 间:2001-6-15 23:34:48
详细信息:
软件名称：网际快车FlashGet(JetCar) 国际版
整理日期：2001.6.14
最新版本：0.96
文件大小：1401KB
软件授权：免费软件
使用平台：Win9x/Me/NT/2000
URL ：http://sd.onlinedown.net/down/fgf096.zip

安装后先运行一下，把语言设为english，发现help菜单中有Remove Banner...项。
运行w32dasm，找字符串remove banner，没找到。
再找字符串remove，找到这一段。
* Reference To: USER32.DeleteMenu, Ord:0087h <==(2) 哈，用的是deletemenu，你想到了什么？
|
:0044C2BC 8B3D20064B00 mov edi, dword ptr [004B0620]
:0044C2C2 6A00 push 00000000

* Possible Reference to String Resource ID=32846: "Register to remove the banner"
<==(1) w32dasm会找到这里
|
:0044C2C4 684E800000 push 0000804E
:0044C2C9 50 push eax
:0044C2CA FFD7 call edi
:0044C2CC 85C0 test eax, eax
:0044C2CE 740D je 0044C2DD
:0044C2D0 8B4E04 mov ecx, dword ptr [esi+04]
:0044C2D3 6800040000 push 00000400
:0044C2D8 6A01 push 00000001
:0044C2DA 51 push ecx
:0044C2DB FFD7 call edi <==(3)这句话去掉菜单中的remove banner...项

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0044C28F(C), :0044C2B7(C), :0044C2CE(C) <==(4)程序中有3处比较，可能会跳过(3) call edi
用trw设断点，会发现程序会由44c28f直接过来,
现在goto code location 44c28f
|
:0044C2DD 8B4C241C mov ecx, dword ptr [esp+1C]
:0044C2E1 5F pop edi
:0044C2E2 5E pop esi
:0044C2E3 5D pop ebp
:0044C2E4 5B pop ebx
:0044C2E5 64890D00000000 mov dword ptr fs:[00000000], ecx
:0044C2EC 83C418 add esp, 00000018
:0044C2EF C3 ret
----------------------------------------------------------------------------------------------
:0044C288 E893A6FCFF call 00416920
:0044C28D 85C0 test eax, eax <==(5)如果eax=0就跳到44c2dd。让我们看416920
:0044C28F 744C je 0044C2DD

----------------------------------------------------------------------------------------------
* Referenced by a CALL at Addresses:
|:0044A5DF , :0044A80D , :0044C288 , :0044FC5C , :0044FE4E
|

:00416920 8B815C020000 mov eax, dword ptr [ecx+0000025C] <==(7)[ecx+025C]=[4da334]，
下bpm 4da334,再看看，
会有更简单的改法，
只需改2个字节。

:00416926 C3 ret <==(6)有没有搞错，这个call如此简单，倒有5次
引用，就是它，懒的再看了。
把8b815c020000改为b80100000090
广告条没有了。收工。

2000.6.15


netants1.0-1.24

 标 题:netants1.0-1.24一直不变的去广告方法 (2千字)
发信人:zombieys
时 间:2001-7-3 15:24:51
详细信息:
netants1.0-1.24一直不变的去广告方法
*1.23去广告

* Possible Reference to String Resource ID=00001: "Invalid retry delay"
|
:0041BE36 6A01 push 00000001
:0041BE38 2B45F0 sub eax, dword ptr [ebp-10]
:0041BE3B 6A42 push 00000042 //push 0
:0041BE3D 50 push eax
:0041BE3E FF75F4 push [ebp-0C]
:0041BE41 FF75F0 push [ebp-10]
:0041BE44 FF35A8AB4400 push dword ptr [0044ABA8]
:0041BE4A FFD7 call edi
:0041BE4C 8345F443 add dword ptr [ebp-0C], 00000043 //nop
:0041BE50 391D78AB4400 cmp dword ptr [0044AB78], ebx
:0041BE56 0F84F5000000 je 0041BF51

*1.24去广告

* Possible Reference to String Resource ID=00001: "Invalid retry delay"
|
:0041C531 6A01 push 00000001
:0041C533 2B45F0 sub eax, dword ptr [ebp-10]
:0041C536 6A42 push 00000042 //push 0
:0041C538 50 push eax
:0041C539 FF75F4 push [ebp-0C]
:0041C53C FF75F0 push [ebp-10]
:0041C53F FF3588E94400 push dword ptr [0044E988]
:0041C545 FFD7 call edi
:0041C547 8345F443 add dword ptr [ebp-0C], 00000043 //nop
:0041C54B 391D58E94400 cmp dword ptr [0044E958], ebx
:0041C551 0F84F5000000 je 0041C64C

*清后门(先用optout0.999999把垃圾清掉 http://grc.com/optout.htm作者不再更新它了,我放在zombieys.126.com了)

1.23
40223e call 40bc19 ->nop
4024ee jne 4024fd ->jmp 4024fd
40261c jne 40262b ->jmp 40262b
40261a cmp eax,esi ->mov al,1

1.24
402544 call 402322 ->nop
4025eb jnz 4025fa ->jmp 4025fa
402719 jnz 402728 ->jmp 402728
402717 cmp eax,esi ->mov al,01

改这些的主要目的是把缺少文件的提示去掉

*其他补丁:
  1、FTP站点无法登录的补丁程序: fix_defaultpassword.reg
  2、去掉窗口背景图的补丁程序: nowindowbk.reg
  3、去掉程序开启Splash的补丁程序: netants_nosplash.reg

1.fix_defaultpassword.reg
REGEDIT4

[HKEY_CURRENT_USER\Software\NetAnts\Configure]
"DefaultPassword"=""

2.nowindowbk.reg
REGEDIT4

[HKEY_CURRENT_USER\Software\NetAnts\Layout]
"NoWindowBK"=dword:00000001

3.netants_nosplash.reg
REGEDIT4

[HKEY_CURRENT_USER\Software\NetAnts\Layout]
"NoSplash"="1"

这是我的全部家当了，全套下载去zombieys.cn.hongnet.com/cnetants.rar

zombieys[CCG]
2001.7.3


NetAntsv1.23

标 题:NetAnts（网络蚂蚁） v1.23　广告条破解法 (2千字)
发信人:paulyoung
时 间:2001-4-24 2:18:14
详细信息:
NetAnts（网络蚂蚁） v1.23　广告条破解法

作　　者：PaulYoung
破解时间：2001.4.24 凌晨02:20
破解工具：TRW 2000 V1.03,W32DASM V8.93,HIEW V6.55
软件下载：http://download.yesky.com/servlet/mydown.yeskydown?tag=7&objID=18831&se=1
_________________________________________________________________________________________________

    刚刚看完C-pen大侠关于破解软件广告条的教学，很受启发，刚好手头上有一个NetAnts v1.23，拿来试试手。

    1.Ctrl+N 激活TRW 2000,下 bpx movewindow（函数功能：该函数改变指定窗口的位置和尺寸。对于顶层窗口，位置和尺寸是相对于屏幕的左上角的：对于子窗口，位置和尺寸是相对于父窗口客户区的左上角坐标的。）；
    2.F5 退出，运行NetAnts，立即被拦截；
    3.每当NetAnts被TRW 2000 拦截，按F5，共按23或24、25次，下PMODULE，来到下面（这可是我试过×次的失败，测试出来的，因为那时NetAnts的广告窗口刚好若隐若现。如果未到，可以继续按F5，再下PMODULE，直到看到下面代码为止）：

:0041BE44 FF35A8AB4400 push dword ptr [0044ABA8] //0044ABA8就是广告条的Flag
:0041BE4A FFD7 call edi //[USER32!MoveWindow]
:0041BE4C 8345F443 add dword ptr [ebp-0C], 00000043 //光标停在这里
:0041BE50 391D78AB4400 cmp dword ptr [0044AB78], ebx
:0041BE56 0F84F5000000 je 0041BF51

    4.根据C-pen的教学分析，可以知道，0044ABA8就是广告条的Flag，这段代码是用来设定广告窗口大小的。
    5.用W32DASM反汇编NetAnts（好耶，没加壳），查找0044ABA8，第1次找到上面这段代码，第2次找到下面这段代码……

:0041C030 57 push edi
:0041C031 E86265FEFF call 00402598 //调用函数的Call
:0041C036 3BC3 cmp eax, ebx
:0041C038 59 pop ecx
:0041C039 A3A8AB4400 mov dword ptr [0044ABA8], eax //程序会将窗口的ID放入0044ABA8　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　供程序应用
:0041C03E 0F843C1F0000 je 0041DF80
:0041C044 57 push edi

    6.好了，开始修改，具体如下（我是用HIEW修改的）：

①
:0041BE4C 8345F443 add dword ptr [ebp-0C], 00000043 //00000043是用来设定广告窗口 大小的，因此我们把00000043 　 改为00000000，即在HIEW中把 　 8345F443改为8345F400即可
②
:0041C030 57 push edi //改为XOR　EAX,EAX 即33C0
:0041C031 E86265FEFF call 00402598　　　//NOP
:0041C036 3BC3 cmp eax, ebx //NOP
:0041C038 59 pop ecx //NOP
:0041C039 A3A8AB4400 mov dword ptr [0044ABA8], eax //小心，这个要保留！
:0041C03E 0F843C1F0000 je 0041DF80 //NOP

    最后，运行一下你的作品，哇噻耶！！那只大蚂蚁不再戴着大墨镜向你推销广告了！！！
    YEAH……

THE EDN

标 题:可以这么改 (1千字)
发信人:zombieys
时 间:2001-4-24 4:31:24
详细信息:

netants1.0-1.23一直不变的修改方法:

1.去广告

* Possible Reference to String Resource ID=00001: "Invalid retry delay"
|
:0041BE36 6A01 push 00000001
:0041BE38 2B45F0 sub eax, dword ptr [ebp-10]
:0041BE3B 6A42 push 00000042 //push 0
:0041BE3D 50 push eax
:0041BE3E FF75F4 push [ebp-0C]
:0041BE41 FF75F0 push [ebp-10]
:0041BE44 FF35A8AB4400 push dword ptr [0044ABA8]
:0041BE4A FFD7 call edi
:0041BE4C 8345F443 add dword ptr [ebp-0C], 00000043 //nop
:0041BE50 391D78AB4400 cmp dword ptr [0044AB78], ebx
:0041BE56 0F84F5000000 je 0041BF51

2.清后门(先用optout0.999999把垃圾清掉 http://grc.com/optout.htm作者不再更新它了)

40223e call 40bc19 ->nop
4024ee jne 4024fd ->jmp 4024fd
40261c jne 40262b ->jmp 40262b
40261a cmp eax,esi ->mov al,1

改这些的主要目的是把缺少文件的提示去掉

by zombieys


OICQ 820

 标 题:为OICQ 820添加显示IP地址和端口号的功能 (转贴） (17千字)
发信人:D.Boy
时 间:2000-10-19 13:32:19
详细信息:
别申明：本文所述的内容仅供研究交流之用，如用作非法用途或修改不当，一切后果自负！
注意：只适合OICQ 0820版本

我们的目标是去掉广告显示，并且在广告的位置上显示目标对象的IP地址和端口号。我们应该怎么下手呢，好的，慢慢跟我来！

经过对Oicq目录结构的分析，发现目录AD和广告有关。其一是广告的英文简写就是AD，其二是其中的图片文件就是我们在广告中看到的。 试着删除该目录之后，呵呵，广告消逝了。但是下次进入Oicq之后，程序会自动新建这个目录，并且重新下载广告文件。既然程序读取不到广告文件广告就会消失，那么就人 工让它读不到咯。用Soft-ice把断点设置在CreateFileA上，这个API调用一般是用来打开一个文件或者设备的。在Sice截到断点后，查看是即将打开的那些文件，从而判断是 否是我们要修改的地方。具体修改方法详见“打开广告文件的程序段”。

广告是去掉了，但是在广告区域上点击鼠标，浏览器仍然会打开广告链接，看来我们还需要对程序作更完善的修改。好了，既然点击广告会出现 浏览器，那一定是运行了一个程序。一般打开运行浏览器程序的有两种方法，一是调用COM接口，二是调用普通的运行程序的API函数。第一种方法技术难度较高，一般程序很 少采用。所以直接用Sice把断点设置在几个和运行程序有关的API函数上，比如ShellExecuteA，WinExec等等。好了，程序在ShellExecuteA处中断，也就是只要避过这个API函 数就行咯。呵呵，顺着程序往上找合适的修改位置，会发现USER32.PtInRect函数的调用，经过分析，发现它是用作判断鼠标点击是否在特定区域内的。搞定，只要使它判断总 是在区域外，就不会执行到ShellExecuteA那儿去了。发送消息窗口和回复窗口的广告点击的程序在不同的位置，也就说在两个地方，这两个地方都要修改，原理也都是一样。 具体修改方法详见“发送消息窗口点击广告的程序段”和“回复消息窗口点击广告的程序段”。（我们为了实现在点击鼠标后出现IP地址和端口号，在发送消息窗口添加了一 个有关显示的程序入口，我将在后面讲解）。

这下广告真的是去除了，既不能看到，也不能点进去了。呵呵，开始我们的下一步目标，显示IP地址和端口号！！！

过去要想知道Oicq上朋友的IP地址只有借助民间的一些小工具程序或者采用包监听程序，后者专业要求比较高，而且辨别率低，也不方便。一些 小程序的确很管用，但是毕竟没有把这个功能直接做到Oicq程序上方便和可靠，利用Oicq内部的很多数据和结构能获得很多我们平常不容易获得的信息。但是毕竟只有二进制 汇编代码，没有源程序，程序的分析难度和工作量可想而知。经过令人难以想象多次数的死机和重起，以及极其艰辛的设置断点跟踪调试分析工作……（以下省略5201314字） ，终于粗略的获得了我们感兴趣的数据结构指针以及它相关调用的位置。这段时间是我最郁闷的时候，想起那段毫无人性的工作，就像已经过上幸福生活的老同志回忆起49年 以前悲惨生活般的胆战心惊且心有余悸……（以下省略520字）。还好我挺过来了，终于在0042513D处找到了需要的指针地址。只要利用这个指针就能获得目标对象的IP地址 以及端口号。我们需要做的就是把这些信息显示在以前的广告位置。

又是一项艰巨的任务放在我的面前，还好我有坚定的信念、丰富的临床经验以及对成功喜悦的企盼，还有对聊天MM住址的渴望，我一定会珍惜， 不能像周星星一样期望再来一次……（再次省略若干，以免挨鸡蛋）。

言归正传，既然获得了关键的数据指针，那可以说我们已经成功了90％了，接下来的就是显示出来而已。但这也需要反复的试验和修改。让我们 好好来回味一下这一过程：

首先，要实现新的功能毫无疑问需要添加代码和数据，以及执行一定的API函数，所以需要找到适当的方法添加代码到原程序之中。完美的方法就 是作一个外壳添加程序，在原程序中添加所需要的段（数据段，程序段），以及添加Import表表项，以用于新的API函数的地址定位，还要修改PE文件头中的各项相关信息，这 就是病毒的做法。这无疑非常的复杂和繁琐，有兴趣的同学可以参见我以前的文章“关于95下可执行文件的加密研究”。其实我们的要添加的程序量并不大，充其量也就零零星 星的几百个字节，而且用到的API函数也不多。所以我们采取了手动修改添加的方法，但也需要必要的条件和方法。看我以下的分析和方法：

PE可执行文件的逻辑结构是段，比如代码段“.text”、数据段“.data”、资源段“.rscs”等等。这些段大小都是按文件对齐，也就是说段大小 至少会按10h对齐，一般是1000h（4096字节），这由文件头中指定（链接的时候确定）。但是代码也好数据也好，不可能做到长度刚好是对齐的。也就是说，段的大小是大于段 中代码或数据实际大小的。他们之间的差值就是该段冗余的空间，这个空间被称为“空隙”。有一些简单的PE文件减肥软件就是使用去掉“空隙”的方法来减肥的。这个“空隙”可 以被我们用来放置代码、数据以及堆栈。我常用的分析PE文件文件头的工具软件是Borland以前在C++系列软件中带的“Tdump.exe”。让我们看看实际分析的结果：

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000D0637 00001000 000D1000 00001000 60000020 [CER]
02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]
03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]
04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]

以上是用Tdump看到的Oicq.exe的段信息（它的Oject就是我们所说的段）。我们肯定是首选.text段进行观察（.text是代码段，Flag为CER，意思就是包 含代码、可执行、可读的意思（Contains code, Execute,Readable））。可以看到，.text段代码实际长度D0637h，物理长度D1000h，文件偏移位置为1000h处。OK，这个段有 D1000h－D0637h=C9Ch的“空隙”。这个长度完全可以满足我们的需要了，而且代码数据堆栈都可以放在这个区域内。众所周知，要作为数据段使用，段的属性（Flags）需要可写。 好了，只需要改写“.text”的属性即可，可写属性的值是80000000h，然后加上原来的60000020h后，就是C0000020h了，也就是变成了CERW属性（具体修改方法详见“代码段段属 性修改”）。看看我们更改后的用Tdump分析的结果。

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000D0637 00001000 000D1000 00001000 C0000020 [CRW]
02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]
03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]
04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]

好了，找到了放置代码数据和堆栈的地方，也就是其实偏移1000h+D0637h 的地方。为了对齐边界，我们采用D1640h这个值（文件偏移）。用Tdump 查看代码段基址（Code Base）和PE文件映象基址(Image Base)，分别是1000h和400000h，可以算出我们的程序在装入后的实际地址，400000h+1000h+D0640h=4D1640h。也就是 说我们的代码在被系统装入后在内存4D1640h处，这在以后程序跳转处用到。

添加代码的工作已经做好，现在关键的问题就是编制具体的代码，以用于IP地址和端口号的保存和显示。

首先是对对象数据中IP地址和端口信息的保存，我们在获得该数据指针后（程序00425157处），更改程序使程序直接跳转到我们的保存程序中 （4D1640h）。该数据的指针首址放在EAX，由于该段程序有些寄存器的值都有用，堆栈也不能乱压。所以我们首先修改了栈指针，使所有的堆栈活动都在我们的“空隙”中进行 （堆栈顶端4D1900h）。然后保存几个寄存器的值（压栈）。IP地址和端口号分别在该数据结构＋214h和+218h的地方（也就是EAX＋214h和EAX+218h）。IP地址是一个字符串指针 ，端口是个32位整数。我们要做的就是把他们都转换成字符串，保存在自己的地盘中。我们巧妙的用了一个wsprintfA函数把字符串和端口号输出到一个地址上（随便在我们的 “空隙”中找个空闲的地址，我用的是4D1700h，4D1720h中放的是格式化字符串“％s：％d”）。实际这段程序翻译成C语言就是printf(“%s:%d”，char *ip,int port)，这样 我们就把字符串形式的数据保存在了数据区里。值得注意的是，由于我们修改了原程序中的有用的代码用于跳转程序，所以在我们的程序中就需要加上（cmp dword ptr [eax+000001DC], ecx）这句代码，退出我们的程序之前恢复栈指针和各寄存器，用一条无条件跳转指令转回到原程序继续执行。

细心的同学可能注意到我们没有显式的调用wsprintfA函数，但是我们实际上是调用了。在显示IP的那段附加程序中调用SetWindowTextA的调用也 是这样。这是怎么回事呢？我们知道所有API函数的调用前都需要重定位，这个过程发生在系统装入这个PE程序的时候。系统按照PE文件中Import表的内容对API函数在程序中的 地址进行填写。我们没有修改Import表，所以，如果直接写上汇编代码，系统是不会为它定位的。由于Import表比较复杂，更改它是个非常繁琐的事情。所以我们采用变通的方 法，既然系统为用到的API函数地址都作了重定位，所以API函数的地址信息也就存在了。

具体的做法如下：
找到原程序中有调用wsprintfA的地方：
:0049CE30 FF1560274D00 Call USER32.wsprintfA
:0049CE36 83C410 add esp, 00000010
:0049CE39 EB1A jmp 0049CE55

实际的汇编代码应该是Call dword ptr [004D2760]，我们就知道了wsprintfA的地址是放在004D2760中。所以，我们只要间接的获得这个调用的地址 ，这个地址就是指向wsprintfA实际地址的二重指针。这样我们就可以直接Call这个地址了。在“显示IP地址和串口的附加程序”中所用到的SetWindowTextA也是用这种方法调用的 。（具体修改方法详见“弹出发送消息窗口之前的对象数据调用的程序段”和“保存IP地址和端口的附加程序”）

在把IP地址和端口保存为了字符串形式在4D1700h之后，今后只需要在需要的时候显示出来就行了。

前面我们提到了需要在点击广告后显示IP地址。所以，我们在点击广告的程序段中间添加了跳转到我们显示程序的入口（4D1680h）。显示程序的原 理很简单，使用SetWindowTextA函数把保存在4D1700h的字符串显示在以前广告的窗口中。在显示之前，判断一下如果没有IP地址的情况，如果是只有一个冒号，说明没有IP地址， 就简单的写上一个“0”。调用SetWindowTextA函数的方法在前面已经提到。需要注意还有两个重要的问题：

我们从什么地方获得SetWindowTextA函数需要的一个参数――广告窗口句柄呢？我特意在“发送消息窗口点击广告的程序段”中写出了在点击广告 时有一个Call USER32.GetWindowRect调用的代码，这个函数同样需要窗口句柄。[ESI+160h]就是USER32.GetWindowRect需要的广告窗口句柄，我们就可以利用这个句柄调用 SetWindowTextA，使字符串显示在广告窗口上。

还有就是由于原来的广告窗口是用于图片的显示，所以不能用来显示字符。它的窗口样式中有个SS_ETCHEDFRAME的值。我们需要去掉它并加上用 于垂直居中和水平居中的两个样式SS_CENTER和SS_CENTERIMAGE。一般静态对话框中的窗口元素（控件）都是静态的保存在资源段中，而不是程序动态生成的。所以我们不需要 改程序，只需要改掉资源段中的值就可以了。具体改法详见“消息发送对话框中广告窗口样式的更改”。

程序基本上改完了，终于可以享受我们辛苦改动的结果了，不料Oicq 820版有检查文件是否被修改过这一手。同样，阻止我们通向成功道路上的任 何障碍只能无情的被我们消灭，这个提示文件已被修改的对话框也只能被我们搞调。幸好搞它非常的简单，把断点设置在MessageBoxA上，等蹦出断点后，查找前面的代码，找到 判断是否弹出对话框的代码并且无情的干掉，详见“弹出文件修改警告框的程序段”。

大功告成！学到不少东西吧！这么多代码自己慢慢用UltraEdit查找修改吧，知道敲错一个的后果吗？呵呵，不是死机就是重起。考虑到一些初级 DIY用户的需求，我把修改好的EXE文件用专业的Patch软件“CodeFusion”作成了一个18K的Patch执行文件。需要的朋友额可以到我主页上去下载。(应腾讯公司要求，已撤掉该补丁程序，非常抱歉)。

好了，课程结束。如果有时间的话，还可以对Oicq作很多的改造。但无疑这个任务是非常艰巨而复杂的，但是只要你有必胜的信心以及充沛的精力 ，并且敢于接受这种毫无人性任务的挑战，还有视一切PPMM为粪土的高尚眼光和能忍受对自己无情虐待的勇气，你会成功的！（￥……＃％％……※＃！￥＃％啊啊啊啊～～～ ～～～～呃～～，被前排学生暴扁）。

～～～～下课咯～～～～

打开广告文件的程序段 更改以前：
:0042AF5B FF152C244D00
:0042AF61 8BF8
:0042AF63 83FFFF
:0042AF66 897D08
:0042AF69 0F84EB000000
:0042AF6F 8D45F4
:0042AF72 50
:0042AF73 57

Call KERNEL32.CreateFileA
mov edi, eax
cmp edi, FFFFFFFF
mov dword ptr [ebp+08], edi
je 0042B05A
lea eax, dword ptr [ebp-0C]
push eax
push edi

；打开广告文件
；返回文件句柄
；判断是不是无效句柄（打开失败）
；保存
；无效就转

更改以后：
:0042AF5B FF152C244D00
:0042AF61 8BF8
:0042AF63 83FFFF
:0042AF66 897D08
:0042AF69 E9CE000000

Call KERNEL32.CreateFileA
mov edi, eax
cmp edi, FFFFFFFF
mov dword ptr [ebp+08], edi
jmp 0042B03C

；打开广告文件
；返回文件句柄
；判断是不是无效句柄（打开失败）
；保存
；不管打开成功与否都转

手工更改方法:
文件偏移： 2AF69h
查找16进制代码： 89 7D 08 0F 84 EB 00 00 00
更改为： E9 EC 01

弹出文件修改警告框的程序段

更改以前：
:00443B56 33FF
:00443B58 397DDC
:00443B5B 755C

xor edi, edi
cmp dword ptr [ebp-24], edi
jne 00443BB9

；是否修改过原文件，是就弹出警告对话控
；不是转

更改以后：
:00443B56 33FF
:00443B58 397DDC
:00443B5B EB5C

xor edi, edi
cmp dword ptr [ebp-24], edi
jmp 00443BB9

；不管是不是都转
手工更改方法:
文件偏移： 43B5Bh
查找16进制代码： 39 7D DC 75 5C
更改为： EB

发送消息窗口点击广告的程序段

更改以前：
:00432B4E 50
:00432B4F FFB660010000
:00432B55 FF1578274D00
:00432B5B 8D45DC
:00432B5E 8BCE
:00432B60 50
:00432B61 E8A6110700
:00432B66 FF7510
:00432B69 8D45DC
:00432B6C FF750C
:00432B6F 50
:00432B70 FF15B8274D00
:00432B76 85C0
:00432B78 0F84FF000000
:00432B7E 6A10
:00432B80 FF157C274D00
:00432B86 33DB
:00432B88 663BC3
:00432B8B 7D0F
:00432B8D C705D874510001000000
:00432B97 E9E8000000

push eax
push dword ptr [esi+00000160]
Call USER32.GetWindowRect
lea eax, dword ptr [ebp-24]
mov ecx, esi
push eax
call 004A3D0C
push [ebp+10]
lea eax, dword ptr [ebp-24]
push [ebp+0C]
push eax
Call USER32.PtInRect
test eax, eax
je 00432C7D
push 00000010
Call USER32.GetKeyState
xor ebx, ebx
cmp ax, bx
jge 00432B9C
mov dword ptr [005174D8], 00000001
jmp 00432C84

;esi+160是窗口句柄

；判断是否在广告区域内点击

；是

更改以后：
:00432B70 FF15B8274D00
:00432B76 85C0
:00432B78 0F84FF000000
:00432B7E 6A10
:00432B80 FF157C274D00
:00432B86 E9F5EA0900
:00432B8B 7D0F
:00432B8D C705D874510001000000
:00432B97 E9E8000000

Call USER32.PtInRect
test eax, eax
je 00432C7D
push 00000010
Call USER32.GetKeyState
jmp 004D1680
jge 00432B9C
mov dword ptr [005174D8], 00000001
jmp 00432C84

；判断是否在广告区域内点击

；是就跳到我们的显示程序当中

手工更改方法:
文件偏移： 32B86h
查找16进制代码： 33 DB 66 3B C3 7D 0F C7
更改为： E9 F5 EA 09 00

回复消息窗口点击广告的程序段

更改以前：
:0046221C FF15B8274D00
:00462222 85C0
:00462224 0F84D8000000 Call USER32.PtInRect
test eax, eax
je 00462302 ；判断是否在广告区域内点击

；不是就转

更改以后：

:0046221C FF15B8274D00
:00462222 85C0
:00462224 E9D9000000
Call USER32.PtInRect
test eax, eax
jmp 00462302
；判断是否在广告区域内点击

；不管是不是都转

手工更改方法:
文件偏移： 62224h
查找16进制代码： 0F 84 D8 00 00 00 8B 46 56
更改为： E9 D9 00 00 00 90

弹出发送消息窗口之前的对象数据调用的程序段

更改以前：
:0042513D 56
:0042513E 8BF1
:00425140 FFB6F4000000
:00425146 FFB6B0000000
:0042514C E879810300
:00425151 33C9
:00425153 3BC1
:00425155 7431
:00425157 3988DC010000
:0042515D 7508
:0042515F 8988E8010000
:00425165 EB0A push esi
mov esi, ecx
push dword ptr [esi+000000F4]
push dword ptr [esi+000000B0]
call 0045D2CA
xor ecx, ecx
cmp eax, ecx
je 00425188
cmp dword ptr [eax+000001DC], ecx
jne 00425167
mov dword ptr [eax+000001E8], ecx
jmp 00425171

；获得对象的数据结构首址

；是否成功，非零就成功
；失败转

更改以后：

:0042513D 56
:0042513E 8BF1
:00425140 FFB6F4000000
:00425146 FFB6B0000000
:0042514C E879810300
:00425151 33C9
:00425153 3BC1
:00425155 7431
:00425157 E9E4C40A00
:0042515C 90
push esi
mov esi, ecx
push dword ptr [esi+000000F4]
push dword ptr [esi+000000B0]
call 0045D2CA
xor ecx, ecx
cmp eax, ecx
je 00425188
jmp 004D1640
nop

；获得对象的数据结构首址

；是否成功，非零就成功
；失败转
；跳到我们的保存IP地址和端口的程序中
；加一个空操作对齐

手工更改方法:
文件偏移： 25157h
查找16进制代码： 39 88 DC 01 00 00 75 08
更改为： E9 E4 C4 0A 00 90

保存IP地址和端口的附加程序

添加代码：
:004D1640 8BDC
:004D1642 BC00194D00
:004D1647 50
:004D1648 51
:004D1649 52
:004D164A 56
:004D164B FFB018020000
:004D1651 FFB014020000
:004D1657 6820174D00
:004D165C 6800174D00
:004D1661 8B3532CE4900
:004D1667 FF16
:004D1669 83C410
:004D166C 5E
:004D166D 5A
:004D166E 59
:004D166F 58
:004D1670 3988DC010000
:004D1676 8BE3
:004D1678 E9E03AF5FF
:004D167D 90
:004D167E 90
:004D167F 90 mov ebx, esp
mov esp, 004D1900
push eax
push ecx
push edx
push esi
push dword ptr [eax+00000218]
push dword ptr [eax+00000214]
push 004D1720
push 004D1700
mov esi, dword ptr [0049CE32]
call dword ptr [esi]
add esp, 00000010
pop esi
pop edx
pop ecx
pop eax
cmp dword ptr [eax+000001DC], ecx
mov esp, ebx
jmp 0042515D
nop
nop
nop ；保存原程序的栈指针
；设置新的栈指针到无用的内存区域
；保存原程序几个有用寄存器

；对象端口的地址
；IP地址的字符串指针
；指向“%s:%d”，这是printf的模式字符
；输出到的地方
；其他地方调用wsprintfA的地址
；esi为已经重定位好了的wsprintfA的地址
；恢复栈指针
；恢复有用的寄存器值

；原程序00425157处被改掉的有用代码
；恢复为以前的栈指针
；跳转到原程序

手工更改方法:
文件偏移： D1640h
添加16进制代码： 8B DC BC 00 19 4D 00 50 51 52 56 FF B0 18 02 00
00 FF B0 14 02 00 00 68
00 8B 35 32 CE 49 00 FF
39 88 DC 01 00 00 8B E3 20 17 4D 00 68 00 17 4D
16 83 C4 10 5E 5A 59 58
E9 E0 3A F5 FF 90 90 90

显示IP地址和端口的附加程序

添加代码：

:004D1680 803D00174D003A
:004D1687 7509
:004D1689 66C70500174D003000
:004D1692 6800174D00
:004D1697 FFB660010000
:004D169D A1E8714A00
:004D16A2 FF10
:004D16A4 E9D415F6FF
:004D16A9 90
:004D16AA 90
:004D16AB 90
:004D16AC 90
:004D16AD 90
:004D16AE 90
:004D16AF 90

cmp byte ptr [004D1700], 3A
jne 004D1692
mov word ptr [004D1700], 0030
push 004D1700
push dword ptr [esi+00000160]
mov eax, dword ptr [004A71E8]
call dword ptr [eax]
jmp 00432C7D
nop
nop
nop
nop
nop
nop
nop ；判断字符内存区第一个字符是不是冒号，是就说明没有IP地址
；不是转到显示程序
；在字符内存区写上一个“0”
；字符内存区首址
；广告窗口的窗口句柄
；其他地方调用SetWindowTextA的地址
；eax为已经重定位好了的SetWindowTextA的地址
；跳到广告点击程序之后
；无用的空操作，只是为了对齐好看

wsprintf所用到的模式字符串:
:004D1720 25733A2564 "%s:%d"
手工更改方法:
文件偏移： D1680h
添加16进制代码： 80 3D 00 17 4D 00 3A 75 09 66 C7 05 00 17 4D 00
30 00 68 00 17 4D 00 FF
4A 00 FF 10 E9 D4 15 F6 B6 60 01 00 00 A1 E8 71
FF 90 90 90 90 90 90 90
文件偏移为： D1720h
添加16进制代码 25 73 3A 25 64

消息发送对话框中广告窗口样式的更改

更改样式字：
更改以前的窗口样式(style)是50000012h WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_ETCHEDFRAME
更改以后的窗口样式(style)是50000201h WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_CENTER|SS_CENTERIMAGE
手工更改方法:
文件偏移： 141EFCh
查找16进制代码： 12 00 00 50
02 01 00 50

代码段段属性修改

更改属性字：
更改以前的代码段属性为60000020h CER（包含代码，可执行，可读）
更改以后的代码段属性为C0000020h CRW（包含代码，可执行，可读写）
手工更改方法:
文件偏移： 21Ch
查找16进制代码：
20 00 00 60
20 00 00 C0

作者：邹丹
电邮：tpo@sina.com
主页：http://www.zoudan.com


OICQ 99c Bulid 0820

 标 题:OICQ 99c Bulid 0820消息框的广告窗口除去方法两则： (1千字)
发信人:toye
时 间:2000-9-23 23:10:08
详细信息:
OICQ 99c Bulid 0820消息框的广告窗口除去

昨天的OICQ,经常受它人的广告攻击（利用低版本的OICQ漏洞发广告信息），所以今天升级了OICQ最新版本。可是其信息窗口的广告更是烦人，只好把其广告去除。

方法一、暴力修改OICQ主文件（不推荐，操作太烦，只供探讨交流，积累经验）

我以前破解过Netcaptor 5.04广告版本，利用这个经验很快找到了入口点，先观察OICQ的安装目录，在DAT目录里发现了ad.gif文件（和Netcaptor 5.04非常相似），这个是默认的显示的广告条图案。

现在用W32DASM反汇编OICQ,查找字符：ad.gif，找到两处，经试验发现只有第一处有效：

:00432E5D 885E6D mov byte ptr [esi+6D], bl
:00432E60 385E6C cmp byte ptr [esi+6C], bl
:00432E63 7543 jne 00432EA8 //如不跳转则读取目录AD内的图像文件，
否则则读取隐藏目录DAT下的ad.gif. 我们可改为nop不让其跳转

* Possible StringData Ref from Data Obj ->"dat\ad.gif" //关键！！！OICQ就是在这里去dat目录读取广告图案的
|
:00432E65 680C0E5100 push 00510E0C//把文件名ad.gif入栈，在此我们改成：push 00000000
:00432E6A 8D45F0 lea eax, dword ptr [ebp-10]
:00432E6D 68DC745100 push 005174DC
:00432E72 50 push eax
:00432E73 E842DA0600 call 004A08BA
:00432E78 8B08 mov ecx, dword ptr [eax

但用HIEW改OICQ.EXE文件后，启动后出现警告：文件己修改

这时crack这个广告窗口即可：
0167:00443B56 33FF XOR EDI,EDI
0167:00443B58 397DDC CMP [EBP-24],EDI
0167:00443B5B 755C JNZ 00443BB9 //此处改为跳转即可

方法二、删除OICQ目录相关文件（推荐，操作简单）

1、删了OICQ的AD目录，但每次OICQ一登陆服务器后就会自动建立，因此你删了后，建一只读同名文件就行了（设为只读属性）。
2.再删了默认的图标ad.gif，在隐藏目录DAT里。


Oicq广告条

 标 题:去除oicq广告条的一个简单方法. (416字)
发信人:leemanzhuo
时 间:2000-10-20 12:28:38
详细信息:
用execope等资源编辑工具打开oicq.exe,再把显示广告条的对应控件移到不可见的地方(不知为什么不能删除),保存.
运行oicq会提示文件被改变,只要反汇编oicq,查找对应提示语句,再改判断文件有没有改变的跳转语句

:00443E18 33FF xor edi, edi
:00443E1A 397DDC cmp dword ptr [ebp-24], edi
:00443E1D 755C jne 00443E7B ------>下面是提示,只要改为jmp就行了,75改为EB.
修改完成.


regetrj

 标 题:FCG的作业,regetjr去除广告条 (7千字)
发信人:BlueBoy[CCG]
时 间:2001-9-6 21:56:25
详细信息:
目标：regetrj
组织：CCG,FCG
作者: BlueBoy
软件说明：用于下载,FCG的Test,去除它的广告条
工具：soft-ice,wasm,UltraEdit

打开system\cd_clint.dll反汇编，导入函数发现只有一处调用GDI32.CreateCompatibleDC
* Referenced by a CALL at Address:
|:10012860

:10012356 56 push esi
:10012357 8BF1 mov esi, ecx
:10012359 FF760C push [esi+0C]

* Reference To: USER32.GetDC, Ord:00FDh
|
:1001235C FF15DC820310 Call dword ptr [100382DC]
:10012362 50 push eax
:10012363 898654010000 mov dword ptr [esi+00000154], eax

* Reference To: GDI32.CreateCompatibleDC, Ord:002Ah《-----此处调用
|
:10012369 FF1540800310 Call dword ptr [10038040]
:1001236F 8B0E mov ecx, dword ptr [esi]
:10012371 898658010000 mov dword ptr [esi+00000158], eax
:10012377 85C9 test ecx, ecx
:10012379 7422 je 1001239D
:1001237B E893050000 call 10012913
:10012380 85C0 test eax, eax
:10012382 894614 mov dword ptr [esi+14], eax
:10012385 743B je 100123C2
:10012387 8B0E mov ecx, dword ptr [esi]
:10012389 E8270B0000 call 10012EB5
:1001238E 663D0100 cmp ax, 0001
:10012392 0F9FC0 setg al
:10012395 88868E010000 mov byte ptr [esi+0000018E], al
:1001239B EB07 jmp 100123A4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012379(C)
|
:1001239D 80A68E01000000 and byte ptr [esi+0000018E], 00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001239B(U)
|
:100123A4 80BE8E01000000 cmp byte ptr [esi+0000018E], 00
:100123AB 752E jne 100123DB
:100123AD 8B0E mov ecx, dword ptr [esi]
:100123AF 85C9 test ecx, ecx
:100123B1 7413 je 100123C6
:100123B3 8D4618 lea eax, dword ptr [esi+18]
:100123B6 6A00 push 00000000
:100123B8 50 push eax
:100123B9 E85D060000 call 10012A1B
:100123BE 84C0 test al, al
:100123C0 7504 jne 100123C6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012385(C)
|
:100123C2 32C0 xor al, al
:100123C4 5E pop esi
:100123C5 C3 ret
向上看在程序是由10012860这里调用，所以在此子程序的第一句下断点，并动态改变为
ret 发现程序的广告条没有了，但是在鼠标点击的时候仍能连接到该程序的站点，从
编程的角度来讲该区域为一个窗口所以用Createwindowex下断点，重新运行程序发现共
有四处调用在第四处向上找
:10011D76 FF15A8820310 Call dword ptr [100382A8]
:10011D7C 6685C0 test ax, ax
:10011D7F 0F84E6000000 je 10011E6B
:10011D85 33C0 xor eax, eax
:10011D87 81CB00000040 or ebx, 40000000
:10011D8D 50 push eax 〈---这写push应该是传递给createwindowex
:10011D8E 50 push eax 参数
:10011D8F 50 push eax
:10011D90 FF7604 push [esi+04]
:10011D93 FFB694060000 push dword ptr [esi+00000694]
:10011D99 FFB690060000 push dword ptr [esi+00000690]
:10011D9F FFB68C060000 push dword ptr [esi+0000068C]
:10011DA5 FFB688060000 push dword ptr [esi+00000688]
:10011DAB 53 push ebx
:10011DAC 6818540410 push 10045418
:10011DB1 57 push edi
:10011DB2 6A24 push 00000024

* Reference To: USER32.CreateWindowExA, Ord:0059h
|
:10011DB4 FF15B0820310 Call dword ptr [100382B0]〈—第四次调用
:10011DBA 33FF xor edi, edi
:10011DBC 894608 mov dword ptr [esi+08], eax
:10011DBF 3BC7 cmp eax, edi
:10011DC1 0F84A4000000 je 10011E6B
:10011DC7 8B4E18 mov ecx, dword ptr [esi+18]
:10011DCA F7C100000010 test ecx, 10000000
:10011DD0 7406 je 10011DD8
:10011DD2 83C904 or ecx, 00000004
:10011DD5 894E18 mov dword ptr [esi+18], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10011DD0(C)
|
:10011DD8 8B4E18 mov ecx, dword ptr [esi+18]
:10011DDB 83E104 and ecx, 00000004
:10011DDE FEC9 dec cl
:10011DE0 F6D9 neg cl
:10011DE2 1AC9 sbb cl, cl
:10011DE4 FEC1 inc cl
:10011DE6 888EA40A0000 mov byte ptr [esi+00000AA4], cl
:10011DEC 7519 jne 10011E07
:10011DEE 8D8E90060000 lea ecx, dword ptr [esi+00000690]
:10011DF4 51 push ecx
:10011DF5 8D4E20 lea ecx, dword ptr [esi+20]
:10011DF8 FF7610 push [esi+10]
:10011DFB FFB660060000 push dword ptr [esi+00000660]
:10011E01 50 push eax
:10011E02 E83AB40000 call 1001D241

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10011DEC(C)
|
:10011E07 57 push edi
:10011E08 6A64 push 00000064
:10011E0A 6A01 push 00000001
:10011E0C FF7608 push [esi+08]

* Reference To: USER32.SetTimer, Ord:0252h
|
:10011E0F FF15AC820310 Call dword ptr [100382AC]〈-此处调用Settimer
:10011E15 F6461808 test [esi+18], 08
:10011E19 8986E4050000 mov dword ptr [esi+000005E4], eax
:10011E1F 7514 jne 10011E35
:10011E21 6A05 push 00000005
:10011E23 FF7608 push [esi+08]

* Reference To: USER32.ShowWindow, Ord:026Ah
|
:10011E26 FF159C820310 Call dword ptr [1003829C]<--此处调用showwindow
:10011E2C FF7608 push [esi+08]

* Reference To: USER32.UpdateWindow, Ord:0291h
|
:10011E2F FF15A4820310 Call dword ptr [100382A4]<--此处调用updatewindow

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10011E1F(C)
|
:10011E35 F6461908 test [esi+19], 08
:10011E39 7530 jne 10011E6B

* Reference To: USER32.GetMessageA, Ord:012Ah
|
:10011E3B 8B35A0820310 mov esi, dword ptr [100382A0]<--此处将sendmessage
的地址传递给esi;
:10011E41 57 push edi
:10011E42 57 push edi
:10011E43 8D45E4 lea eax, dword ptr [ebp-1C]
:10011E46 57 push edi
:10011E47 50 push eax
所以将:10011DB4 FF15B0820310 Call dword ptr [100382B0] nop掉就可以了，或者
将:10011D8D 50 push eax 改为跳转语句跳到:10011E3B这里就行了。
修改之后广告条消息，而且点击之后也没有反应，成功了！！！（不过我没有测试该软件是否好用）

由于小弟的水平有限，难免出现错误，希望各位多多指教！！！

标 题:hehe (711字)
发信人:jsjyt
时 间:2001-9-6 22:49:45
详细信息:

下断点bpx messageboxa
:00429365 FF1504044600 call dword ptr [00460404]这里就是messageboxa的call
:0042936B 57 push edi
:0042936C E8AE720100 call 0044061F
:00429371 55 push ebp
:00429372 8BEC mov ebp, esp
:00429374 837D1C00 cmp dword ptr [ebp+1C], 00000000这里会有两次循环
:00429378 753F jne 004293B9
:0042937A 837D0C05 cmp dword ptr [ebp+0C], 00000005只要改动下面的跳转
:0042937E 7425 jne 004293A5 －－>> 广告条就可以消失
在我看来这是最简单的去除办法，当然我们还可以修改cd_clint.dll这个文件。通过修改它，可以达到修改regetjr.exe相同的效果

标 题:对了，还有 (3千字)
发信人:jsjyt
时 间:2001-9-7 0:25:05
详细信息:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042E081(C)
|
:0042E0D0 8B4650 mov eax, dword ptr [esi+50]
:0042E0D3 8B3D38034600 mov edi, dword ptr [00460338]
:0042E0D9 33DB xor ebx, ebx
:0042E0DB 3BC3 cmp eax, ebx
:0042E0DD 0F8485000000 je 0042E168
:0042E0E3 399EC0000000 cmp dword ptr [esi+000000C0], ebx
:0042E0E9 747D je 0042E168
:0042E0EB 8B08 mov ecx, dword ptr [eax]
:0042E0ED 8D55F0 lea edx, dword ptr [ebp-10]
:0042E0F0 52 push edx
:0042E0F1 FF7660 push [esi+60]
:0042E0F4 53 push ebx
:0042E0F5 50 push eax
:0042E0F6 FF91DC000000 call dword ptr [ecx+000000DC]
:0042E0FC 8B4650 mov eax, dword ptr [esi+50]
:0042E0FF 8D55F4 lea edx, dword ptr [ebp-0C]
:0042E102 52 push edx
:0042E103 FF7660 push [esi+60]
:0042E106 8B08 mov ecx, dword ptr [eax]
:0042E108 53 push ebx
:0042E109 50 push eax
:0042E10A FF91E0000000 call dword ptr [ecx+000000E0]
:0042E110 8B4650 mov eax, dword ptr [esi+50]
:0042E113 8D55F8 lea edx, dword ptr [ebp-08]
:0042E116 52 push edx
:0042E117 50 push eax
:0042E118 8B08 mov ecx, dword ptr [eax]
:0042E11A FF91C0000000 call dword ptr [ecx+000000C0]
:0042E120 8B4650 mov eax, dword ptr [esi+50]
:0042E123 8D55FC lea edx, dword ptr [ebp-04]
:0042E126 52 push edx
:0042E127 50 push eax
:0042E128 8B08 mov ecx, dword ptr [eax]
:0042E12A FF91C8000000 call dword ptr [ecx+000000C8]
:0042E130 6A01 push 00000001
:0042E132 FF75FC push [ebp-04]
:0042E135 FF75F8 push [ebp-08]
:0042E138 FF75F4 push [ebp-0C]
:0042E13B FF75F0 push [ebp-10]
:0042E13E FFB6C0000000 push dword ptr [esi+000000C0]===>高度起始位置设置值(“C0”修改为“00”后任务条框将上移到广告框的地方)
:0042E144 FFD7 call edi ======>下面任务条设置的CALL MOVEWINDOW
:0042E146 395D0C cmp dword ptr [ebp+0C], ebx这里还要修改成0C－》00
:0042E149 751D jne 0042E168 或者改动跳转，如果只修改一处，就会很不好看
可以试着最大化一下：）
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
:0042E1C7 FF75F0 push [ebp-10]
:0042E1CA FFB6B8110000 push dword ptr [esi+000011B8]===>>重点
:0042E1D0 FFD7 call edi ======>加入广告的调用CALL MOVEWINDOW
==================================================
:00429E63 FF91C8000000 call dword ptr [ecx+000000C8]
:00429E69 6A01 push 00000001
:00429E6B FF7510 push [ebp+10]
:00429E6E FF75FC push [ebp-04]
:00429E71 FF75F8 push [ebp-08]
:00429E74 FF75F4 push [ebp-0C]
:00429E77 FFB6B8110000 push dword ptr [esi+000011B8]===>>重点
:00429E7D FFD7 call edi ===>换SKIN时的广告加入CALL MOVEWINDOW
启动时没有广告了，但是换皮肤的时候又会出现广告框。谁解决阿？


W32DASM v8.93的小小改动

标 题:首先把他的asproect的壳脱壳，然后用资源修改器就可了。或参考TiANWEi的一文 (6千字)
发信人:1212
时 间:2001-2-4 12:59:23
阅读次数:39
详细信息:
对W32DASM v8.93的小小改动
作者：TiANWEi
仅以此篇献给喜用W32dasm的Cai Jie兄

W32dasm是个很好的反汇编工具,不用多说,
但它有个好臭屁的毛病,就是每次启动都要
在它的背景上贴上那个深绿色的图片,告诉
你这是W32DASM的XXX版本,是怎么怎么样的.
(我用的8.93正式版)
那么我们来搞掉它吧!

用SICE的SYMLOADER装上USER32.DLL,
KERNEL32.DLL,GDI32.DLL,然后
:bpx bitblt
因为这个是标准的WINDOWS用来显示BITMAP的
函数,一直没变过.
程序会在启动过程中被SICE拦截好多次,最后
注意有一次用F5带过后就会显示出来那幅图片,
那么可以从头来,到那时用F12来带.
会发现程序停在此处:

* Reference To: GDI32.BitBlt, Ord:0000h
|
:00478B34 E805620300 Call 004AED3E
:00478B39 FF75E0 push [ebp-20] ;***此处***
:00478B3C FF75E4 push [ebp-1C]

原始的想法可能是改成让BITBLT不显示图片,将此CALL
略过,但仔细往上看代码,会发现有更好的办法:
(以下是用W32DASM反汇编自己的结果)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A54(U)
|
:00478A58 52 push edx
:00478A59 53 push ebx
:00478A5A E8CAF20200 call 004A7D29
:00478A5F 83C414 add esp, 00000014
:00478A62 8BD8 mov ebx, eax
:00478A64 895B77 mov dword ptr [ebx+77], ebx
:00478A67 8B8350126F00 mov eax, dword ptr [ebx+006F1250]
:00478A6D 85C0 test eax, eax ;***注意!!***
:00478A6F 0F85DF000000 jne 00478B54 ;************
:00478A75 C745C84D010000 mov [ebp-38], 0000014D
:00478A7C FF75C8 push [ebp-38]
:00478A7F FF730C push [ebx+0C]

* Reference To: USER32.LoadBitmapA, Ord:0000h
|
:00478A82 E83D670300 Call 004AF1C4
:00478A87 8945DC mov dword ptr [ebp-24], eax
:00478A8A FF37 push dword ptr [edi]

* Reference To: GDI32.CreateCompatibleDC, Ord:0000h
|
:00478A8C E883620300 Call 004AED14
:00478A91 8945E4 mov dword ptr [ebp-1C], eax
:00478A94 8D8DD8FCFFFF lea ecx, dword ptr [ebp+FFFFFCD8]
:00478A9A 51 push ecx
:00478A9B FFB38C116F00 push dword ptr [ebx+006F118C]
:00478AA1 E8C59E0100 call 0049296B
:00478AA6 83C408 add esp, 00000008
:00478AA9 56 push esi
:00478AAA 57 push edi
:00478AAB 8DB5D8FCFFFF lea esi, dword ptr [ebp+FFFFFCD8]
:00478AB1 8DBDC8FCFFFF lea edi, dword ptr [ebp+FFFFFCC8]
:00478AB7 B904000000 mov ecx, 00000004
:00478ABC F3 repz
:00478ABD A5 movsd
:00478ABE 5F pop edi
:00478ABF 5E pop esi
:00478AC0 56 push esi
:00478AC1 57 push edi
:00478AC2 8DB5C8FCFFFF lea esi, dword ptr [ebp+FFFFFCC8]
:00478AC8 8DBDE8FCFFFF lea edi, dword ptr [ebp+FFFFFCE8]
:00478ACE B904000000 mov ecx, 00000004
:00478AD3 F3 repz
:00478AD4 A5 movsd
:00478AD5 5F pop edi
:00478AD6 5E pop esi
:00478AD7 FF75DC push [ebp-24]
:00478ADA FF75E4 push [ebp-1C]

* Reference To: GDI32.SelectObject, Ord:0000h
|
:00478ADD E8F2620300 Call 004AEDD4
:00478AE2 8945E0 mov dword ptr [ebp-20], eax
:00478AE5 8B85F0FCFFFF mov eax, dword ptr [ebp+FFFFFCF0]
:00478AEB 8B95E8FCFFFF mov edx, dword ptr [ebp+FFFFFCE8]
:00478AF1 2BC2 sub eax, edx
:00478AF3 05C0FEFFFF add eax, FFFFFEC0
:00478AF8 D1F8 sar eax, 1
:00478AFA 7903 jns 00478AFF
:00478AFC 83D000 adc eax, 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AFA(C)
|
:00478AFF 8B95F4FCFFFF mov edx, dword ptr [ebp+FFFFFCF4]
:00478B05 8B8DECFCFFFF mov ecx, dword ptr [ebp+FFFFFCEC]
:00478B0B 2BD1 sub edx, ecx
:00478B0D 81C210FFFFFF add edx, FFFFFF10
:00478B13 D1FA sar edx, 1
:00478B15 7903 jns 00478B1A
:00478B17 83D200 adc edx, 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478B15(C)
|
:00478B1A 682000CC00 push 00CC0020
:00478B1F 6A00 push 00000000
:00478B21 6A00 push 00000000
:00478B23 FF75E4 push [ebp-1C]
:00478B26 68F0000000 push 000000F0
:00478B2B 6840010000 push 00000140
:00478B30 52 push edx
:00478B31 50 push eax
:00478B32 FF37 push dword ptr [edi]

* Reference To: GDI32.BitBlt, Ord:0000h
|
:00478B34 E805620300 Call 004AED3E
:00478B39 FF75E0 push [ebp-20]
:00478B3C FF75E4 push [ebp-1C]

* Reference To: GDI32.SelectObject, Ord:0000h
|
:00478B3F E890620300 Call 004AEDD4
:00478B44 FF75DC push [ebp-24]

* Reference To: GDI32.DeleteObject, Ord:0000h
|
:00478B47 E878630300 Call 004AEEC4
:00478B4C FF75E4 push [ebp-1C]

* Reference To: GDI32.DeleteDC, Ord:0000h
|
:00478B4F E89A630300 Call 004AEEEE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A6F(C)
|
:00478B54 85DB test ebx, ebx
:00478B56 0F84050A0000 je 00479561
:00478B5C 8B8393000000 mov eax, dword ptr [ebx+00000093]
:00478B62 8B4008 mov eax, dword ptr [eax+08]
:00478B65 8945C4 mov dword ptr [ebp-3C], eax
:00478B68 8B9397000000 mov edx, dword ptr [ebx+00000097]
:00478B6E 85D2 test edx, edx
:00478B70 0F840B020000 je 00478D81

以上的代码是windows程序标准的显示一个BITMAP的过程,
先LOAD,再SELECT,再BITBLT,最后RELEASE
在这之前会有一个判断,注意我加*号的地方,这个判断实际
上是看你现在是否正在显示程序原代码,如果W32DASM已经反
汇编了一个程序,背景不可能再显示BITMAP了.
所以,将下面的那个JNE 改为 JMP 就行了!
自己会改吧,很容易的!
改过后,啊,天空一片纯净,就象<<大话西游>>中齐天大圣将
那个爱唠叨的唐僧一棍子打死过后,世界顿时安静下来了...


音乐贺卡厂2000Ver2.60

 标 题:音乐贺卡厂2000Ver2.60破解 (1千字)
发信人:小楼
时 间:2000-9-14 21:31:52
详细信息:
音乐贺卡厂2000Ver2.60破解

网上可以得到免费的广告版, 用它制作的贺卡是一个EXE程序, 但在结束时有广告条出现, 我们的目的就是要将其去掉.

用fileinfo发现主程序Musicard.exe用aspack2001压缩, 故用unaspack1.091解压. 反汇编后没有发现有值得注意的地方. 后来看到安装目录下有个exe.uxe文件, 其实也是一个可执行程序, 同样是aspack2001压缩, 解压后用exescope5.0发现里面有那个nag窗口--dialog 101.

再回到主程序Musicard.exe, 用wdasm查找其调用exe.uxe的地方, 共2处, 分别设断, 并试图将之NOP掉, 都失败, 并备告知程序组件不完整. 经过思考, 认为exe.uxe可能是制作贺卡程序的母版, 故目标应该是它.

将exe.uxe反汇编后, 选择DIALOG REF. 中dailog:dialogID:0065, 被带到
:004041A4 833D382C410001 cmp dword ptr [00412C38], 00000001
:004041AB 7515 jnz 004041C2
:004041AD 57 push edi
:004041AE 68C1114000 push 004011C1
:004041B3 57 push edi

* Possible Reference to Dialog: DialogID_0065 <--stop here!!!
|
:004041B4 6A65 push 00000065
:004041B6 FF35D8284100 push dword ptr [004128D8]

所以是将:004041AB 7515 jnz 004041C2
改为: :004041AB EB15 jmp 004041C2
保存后再用UPX压缩一下, job done.


飓风邮箱清理器

 标 题:去除程序中广告条的一种方法。 (957字)
发信人:真.hp
时 间:2000-9-11 1:42:09
详细信息:
去除程序中广告条的一种方法。
飓风邮箱清理器 版本 1.0
http://www.renliang.com/software/emailcleaner.exe 大小697k

安装EmailCleaner后，运行MailCleaner.exe，发现此程序有广告条，
该怎样把它去除呢。先把MailCleaner.exe和MailCleaner.enu复制一
份，接着反安装EmailCleaner。这时再运行MailCleaner.exe，会提示
“Couldn't load advert.dll”，这个程序没有加壳，用exescope之
类的程序打开MailCleaner.exe，展开资源下的RC DATA部分，这里有
一个TMAINFORM，选中它在右边即显示出主窗体各个部件的信息，其中
有一段：
object AdImage1: TAdImage
Left = 0
Top = 27
Width = 468
Height = 60
Cursor = crHandPoint
AutoLoad = True
Options = []
ProgramID = 539
BandwidthThrottle = 2147483647
MinimumAdDisplayTime = 0
NetworkIsUp = False
Size = ADS468x60
end
这就是窗口上所显示的广告条，我们把这一段删除，然后保存，
现在运行MailCleaner.exe，怎么样，窗体上的广告条没了吧^_^
这个方法适用于Delphi和C++Bulid设计的程序。


ACDSEE 3.0

标 题:爆笑破解之-----ACDSEE 3.0 (4千字)
发信人:夜月
时 间:2001-3-18 19:04:20
详细信息:
[题好文一半] 如何破解 ACDSEE 3.0
[始作文者] 夜月
[oicq，e-mail，宿舍电话，一个都不能少]
36606500
luoyi.ly@yeah.net
(0546)7391075
[人最重要的是找准自己的位置] 菜鸟
[工欲善其事，必先利其器]
trw2000 1.22
[人为刀俎，我为鱼肉]
ACDSEE 3.0
[天下文章一大抄]
嗯？错了，错了，
[文章本天成，妙手偶得之]
嘿嘿.....这才像“破解四大才子”之一的夜月的风格吗....
“你说什么”？
“破解四大才子”呀！
于是，美好的事物被撕裂给大家看到了.....

一堆CRACKER冲了过来，拿着夜月从来没见过的SICE把夜月分成了
60%的脂肪，30%的蛋白质，10%的“不明存在物”，简称UEO（Unknown Exit Object）....

从此，“破解四大才子”老大的板凳一直空闲,据说以前上面座着一个很帅的小伙......

ACDSEE是干什么用的，相信各位不用我再说了吧。以前2.4版的时候，可以用序列号的方式注册，于是，
注册码就满天飞。后来，出了3.0版，不能再用注册码注册了，可是后来，又出了个“零售版”，真是......
不知道软件的作者看到他的软件如此流行，作何感想？小弟今天下午闲着无事，就来砍砍它的时间限制，写成此文，献给大家，希望能博得大家一笑。

时间限制的破解，肯定是暴力破解。
ACDSEE的保护方式，肯定是ASPACK之流。
对付ASPACK，肯定是TRW2000的绝招：LOAD+PNEWSEC+MAKEPE
大功告成！看到NEWPE.EXE了吗？
高兴乎？兴奋乎？奋起直追时间限制乎？

问：偷懒一派的一个典型特点是什么？
答：碰到软件先看《论坛精华》。有1就看1，有2就看2，将来有3了，自然就看3。
再问：偷懒一派的另一个典型特点是什么？
再答：看时容易做时难，跟踪无力破解残。 未到核心力已尽，退出TR泪不干。

由于《论坛精华2》中的文章是E文的，固有下面一段：
最近比较烦，比较烦，比较烦。 总觉得E文有一点难看。
我想我还是不习惯，从方方正正到大洋彼岸。
最近比较烦，比较烦，比较烦。 总觉得方法有一些弊端。
我问自己说怎么办？ 脑袋说： 基本上，这个很难。
麻烦，我很麻烦； 麻烦，我很麻烦；
我冥思苦想。

作家说：没有做不成的文章。
军人说：没有打不赢的战役。
CRACKER们说：没有破不了的软件。
毛主席总结说：世上无难事，只要肯登攀。

夜月连忙附和：PATCH不难打，只要有跳转。PC烧成灰，CODE不难追。
我追---------------

于是有了（别人）追出来的时间断点：GETSYSTEMTIME的出场。

断点一找对，事半功也倍。断点找不到，直接一傻冒。

作者可能以为：ASPACK的保护，体贴又周到。
于是在时间的判断上就........

我一直追，感觉不算融洽。
在代码丛林中，也渐渐感到心在变化。
都是追到深处才由它，看不看懂都算了吧。
破解从来都是稀里糊涂的生涯。
不要再为了它挣扎，不要再为它左牵右挂。
算了吧，都随它！

追出来的代码如下：
015F:004984DE CALL `KERNEL32!GetSystemTime`
015F:004984E4 LEA ECX,[ESP+18]
015F:004984E8 LEA EDX,[ESP+20]
015F:004984EC PUSH ECX
015F:004984ED PUSH EDX
015F:004984EE CALL `KERNEL32!SystemTimeToFileTime`
015F:004984F4 LEA EAX,[ESP+18]
015F:004984F8 PUSH ESI
015F:004984F9 PUSH EAX
015F:004984FA CALL `KERNEL32!CompareFileTime`
015F:00498500 INC EAX
015F:00498501 POP ESI
015F:00498502 NEG EAX
015F:00498504 SBB EAX,EAX
015F:00498506 NEG EAX
015F:00498508 DEC EAX
015F:00498509 ADD ESP,BYTE +7C
015F:0049850C RET 04
乱七八糟，气煞我也。一个跳转都没有，让我如何PATCH？
代码若是不懂时，何不换条道路？
还记得鲁迅的话吗？
破解时本没有路，F（N）（N=5，7，9，12。。。。）按的多了，代码中就有了路。
于是F12过去后.........

是你给我一片天，是你给了我一片天，就算全世界代码我都不懂，走到你的身旁就看到春天。

小女孩问：春天是什么样子的？
夜月很自豪地U+>（重定向符）了一下，
告诉小女孩：春天就是这个样子的：
015F:004982BA PUSH EAX
015F:004982BB CALL 004983E0
015F:004982C0 TEST EAX,EAX 改为:inc eax
015F:004982C2 JNZ NEAR 004983CD 改为:jmp 4983cd
015F:004982C8 MOV CL,[004E8A30]
015F:004982CE PUSH EDI

论坛的大客看过来，看过来，看过来，菜鸟的世界很精彩，请不要装作不理不睬。
破解菜鸟的悲哀， 说出来, 谁明白, 求求你发篇教程过来，教教我，让我乐开怀。
我左看右看，上看下看，原来每个程序都不简单。
我左看右看，上看下看，程序们的判断可真奇怪。
嘿！真奇怪........

看到这一句了么？
015F:004982C0 TEST EAX,EAX
当我在这里，把EAX无中生有地由0改成1之后，
当至尊宝在观音面前手舞足蹈，叽叽喳喳之后，
说了一句让我记忆犹新的经典：
整个世界清静了...........
是的,
整个世界清静了。

[狗尾叙貂]
曾经有一个珍贵的注册码摆在我的面前，但是我没有珍惜，
直到看到看雪的教学才追悔莫及。
如果上天能再给我一次机会，
我会对那个注册码说：我要你！
如果要给注册期加上一个限制的话，
我希望是--------一万年！

远处传来刘德华的歌声：
注册一万年，注册经得起考验。
穿越了判断的防线，出现成功的地面！

标 题:将ACDSee V3.1 Build 921试用版变为注册版 (5千字)
发信人:liangs
时 间:2001-3-18 23:34:33
详细信息:

将ACDSee V3.1 Build 921试用版变为注册版

by liangs 2001/3/18

说明：软件可从《电脑报2000年合订本》配套光盘中获得。

前两天买了套《电脑报2000年合订本》，装了一下这个软件觉得还不错，比原来
的2.4版功能强劲了不少。它的限制主要是时间限制，破掉它的时间限制很简单，但
程序启动后标题栏显示的Trial Version让人看到很不舒服，我们试着拿掉它看看。

(1)首先来搞定时间问题。过期后弹出 Trial Period Expired 的提示框，用W32Dasm
反汇编后，我们查找Expired的字样，我们可以找到如下的地址：

* Reference To: InTouchClient.?TrialPeriod_GetDaysLeft@InTouchClient@@QAEHXZ, Ord:005Dh
|
:00404596 FF1564824D00 Call dword ptr [004D8264]
:0040459C 85C0 test eax, eax
:0040459E 7F16 jg 004045B6

* Reference To: InTouchClient.?g_itc@@3VInTouchClient@@A, Ord:0069h
|
:004045A0 8B0D30824D00 mov ecx, dword ptr [004D8230]
:004045A6 6A00 push 00000000

* Reference To: InTouchClient.?TrialMode_ShowExpiredBox@InTouchClient@@QAEHPAUHWND__@@@Z,
Ord:005Bh
|
:004045A8 FF155C824D00 Call dword ptr [004D825C]
:004045AE 85C0 test eax, eax
:004045B0 7521 jne 004045D3
:004045B2 83C408 add esp, 00000008
:004045B5 C3 ret

上面的 TrialMode_ShowExpiredBox 字样已经很能说明问题了，其它地方也能找到Expired
的字样，但是一看就知道不是，当然如果你看不出来的话，你就下bpx 00xxxxxx试试就知道了，
根本就不会在那儿中断下来。

很明显只要将0040459E处的jg 004045B6改为Jmp 004045B6就可以搞定时间问题了。

(2)接着要搞定的是标题栏显示的Trial Version字样。我们查找Trial Version的字样，我们可
以找到如下两处地址：

第一处地址：

:004172D0 B900434F00 mov ecx, 004F4300
:004172D5 E816320000 call 0041A4F0
:004172DA 85C0 test eax, eax
:004172DC 7529 jne 00417307
:004172DE 8D8C2414010000 lea ecx, dword ptr [esp+00000114]
:004172E5 6A50 push 00000050
:004172E7 51 push ecx

* Reference To: KERNEL32.lstrlenA, Ord:0335h
|
:004172E8 FF1550834D00 Call dword ptr [004D8350]
:004172EE 8D940418010000 lea edx, dword ptr [esp+eax+00000118]
:004172F5 A124434F00 mov eax, dword ptr [004F4324]
:004172FA 52 push edx

* Possible Reference to String Resource ID=00195: " Trial Version"
^^^^^^^^^^^^^^^^^
|
:004172FB 68C3000000 push 000000C3
:00417300 50 push eax

------------------------------------------------------------------------
第二处地址：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00465A0E(U)
|
:00465A36 B900434F00 mov ecx, 004F4300
:00465A3B E8B04AFBFF call 0041A4F0
:00465A40 85C0 test eax, eax
:00465A42 7520 jne 00465A64
:00465A44 8D442408 lea eax, dword ptr [esp+08]
:00465A48 6A50 push 00000050
:00465A4A 50 push eax
:00465A4B FFD6 call esi
:00465A4D 8B1524434F00 mov edx, dword ptr [004F4324]
:00465A53 8D4C040C lea ecx, dword ptr [esp+eax+0C]
:00465A57 51 push ecx

* Possible Reference to String Resource ID=00195: " Trial Version"
^^^^^^^^^^^^^^^^^
|
:00465A58 68C3000000 push 000000C3
:00465A5D 52 push edx

你注意看一下就可以发现，在判断是否是"Trial Version"的时候，在前面共同都
调用了call 0041A4F0来判断eax的值，如果eax到时候为0就铁定是" Trial Version"
我们进call 0041A4F0的里面去看看：

* Referenced by a CALL at Addresses:
|:004044F2 , :0040468F , :0040488B , :004049FE , :004087DC
|:004088D3 , :00412A6F , :004172D5 , :0041837B , :00418499
|:0043D2B6 , :0043D3AB , :0043D4B9 , :0043D5A5 , :0043D6E6
|:0045A549 , :00465A3B
|
:0041A4F0 33C0 xor eax, eax
:0041A4F2 C3 ret
:0041A4F3 90 nop
:0041A4F4 90 nop
:0041A4F5 90 nop
:0041A4F6 90 nop
:0041A4F7 90 nop

我们发现这里只有两行代码就是使eax为0,而且还有很多地方要调用这个Call,如果这里
eax返回的是1的话，我们的目的就完成了，好在0041A4F3后面有好几个nop可以给我们用。
将上面代码简单修改如下就可以了:

:0041A4F0 33C0 xor eax, eax
:0041A4F2 40 inc eax
:0041A4F3 c3 ret

现在再重新启动ACDSee看看，是不是已经变成注册版了，还有一点不尽入人意的地方就是
打开About ACDSee...菜单时，里面的"The software is license to:"和"license number:"
还是空的，要让它在这显示你的名字也很简单，用RegMon检测软件对注册表的读写，我们
可以找到如下的地方，写个注册文件运行一下就可以了，至此ACDSee V3.1就彻底搞定了。:->

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\ACD Systems\ACDInTouch]
"UserName"="liangs"
"CompanyName"="ZTE"
"UserEMail"="liangs@wx88.net"

[HKEY_LOCAL_MACHINE\Software\ACD Systems\ACDSee]
"LicenseNumber"="ZTE389"

[HKEY_CURRENT_USER\Software\ACD Systems\ACDInTouch]
"UserName"="liangs"

标 题:另外关于ACDInTouch的弹出窗口，下 bpx destroywindow 5秒就能搞定。 (空)
发信人:liangs
时 间:2001-3-18 23:47:02
详细信息:


ACDsee Trial Version 3.1 Build 921

标 题:破解90天试用期 (2千字)
发信人:wangliqiang
时 间:2001-4-3 22:38:18
详细信息:
Topic：破解90天试用期
Software:ACDsee Trial Version 3.1 Build 921 (5.69MB)
《电脑报2000年合订本配套光盘》有赠
Tools：W32dasm89 和Hiew32
Author:看雪学苑学员wangliqiang
Date:2001-4-3

准备工作：
安装ACDsee Trial Version 3.1 Build 921，改系统日期为2002年（超过安装日期90天的任意时间），
运行ACDsee.exe,出现过期提示框，程序不能运行。
破解过程：
1. 用W32dasm89载入ACDsee.exe
2. 单击Find Text, 查找目标填入TrialPeriod_GetDaysLeft(汉语意思是：试用期_剩余天数），
按确定，找到下面的文字：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404558(C)
|

* Reference To: InTouchClient.?TrialPeriod_GetDaysLeft@InTouchClient@@QAEHXZ, Ord:005Dh
|
:00404596 FF1564824D00 Call dword ptr [004D8264]
:0040459C 85C0 test eax, eax
:0040459E 7416 jg 004045B6 <---- 把此处jg 改为je>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Reference To: InTouchClient.?g_itc@@3VInTouchClient@@A, Ord:0069h
|
:004045A0 8B0D30824D00 mov ecx, dword ptr [004D8230]
:004045A6 6A00 push 00000000

* Reference To: InTouchClient.?TrialMode_ShowExpiredBox@InTouchClient@@QAEHPAUHWND__@@@Z, Ord:005Bh
|
:004045A8 FF155C824D00 Call dword ptr [004D825C]
:004045AE 85C0 test eax, eax
:004045B0 7521 jne 004045D3
:004045B2 83C408 add esp, 00000008
:004045B5 C3 ret

用Hiew32把上面有^标记处jg 改为je。运行ACDsee.exe，不再出现过期提示框，所有功能正常。
欣喜若狅、大功告成。

注：以上破解适用于软件安装90天后。

当软件安装不足90天而把系统日期恢复当前正确日期时，会出现过期提示框，请大家告诉我解决的办法。

Postscript:
动态破解工具TRW2000使用中遇到的难题
自2001/3/27在《看雪破解论坛》发表用《W32dasm和Hiew32去除ScreensaverShot的Nag》以来，我一直在想，
我能不能学着用动态破解工具TRW2000来提高自己的破解水平。于是，我从网上下载了一个TRW20001.22全解密
汉化版,参考了看雪网站破解教学栏目的相关资料，然后，试着运行TRW2000,奇怪的是每次都死机，百思不得
其解。我的电脑是联想同禧PentiumIII 800,键盘和鼠标都是USB接口，原因在此吗？狠一狠心，我又重新买
了PS/2键盘和鼠标,安装后运行TRW2000，一切正常，困扰我多时的问题终于得到了解决。


Acdsee3.1

 标 题:Acdsee3.1完全注册版(不知有重没有？) (316字)
发信人:明月清风小酒
时 间:2000-10-24 23:31:01
详细信息:
Acdsee3.1Build815版
来源：《电脑报配套光盘2000-3》（上M的软件还是买光盘吧，毕竟老婆每月从电信缴费回来连续三天泡菜伺候的滋味不太好受。）

安装后选试用，用满90天就有提示。

先用UnAspack脱壳，再搜索90 90 33 c0 c3 90 90 ,有两处，将后一处改为90 90 b0 01 c3 90 90即可。启动软件，它要我给它返回信息，还是永不吧。

标 题:详细点 (3千字)
发信人:明月清风小酒
时 间:2000-10-25 7:14:25
详细信息:

使用工具：
Fileinfo
UnAspack
procdump162
W32dasm
Trw2000
UltraEdit

Acdsee 3.1 Build815安装时选试用，用满90天就会出现购买提示。这个版本与前些版本不同，它没有输入注册码的地方。于是决定对它进行反汇编。
软件是用Aspack压缩过的，用UnAspack将其脱壳，再将脱壳过的文件用procdump162的PE Editor载入，修改Sections中的Characteristics值，由C0000040改为E0000020,才能使用
W32dasm反汇编。
反汇编出来后，查看String Data References,内容还真多,找到"Trial Version"，发现有两处。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004171ED(U)
|
:00417200 B9E8424F00 mov ecx, 004F42E8
:00417205 E8361D0800 call 00498F40
:0041720A 85C0 test eax, eax
:0041720C 7529 jne 00417237
:0041720E 8D8C2414010000 lea ecx, dword ptr [esp+00000114]
:00417215 6A50 push 00000050
:00417217 51 push ecx

* Reference To: KERNEL32.lstrlenA, Ord:0335h
|
:00417218 FF1540834D00 Call dword ptr [004D8340]
:0041721E 8D940418010000 lea edx, dword ptr [esp+eax+00000118]
:00417225 A10C434F00 mov eax, dword ptr [004F430C]
:0041722A 52 push edx

* Possible Reference to String Resource ID=00195: " Trial Version"
|
:0041722B 68C3000000 push 000000C3
:00417230 50 push eax

和

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004659EE(U)
|
:00465A16 B9E8424F00 mov ecx, 004F42E8
:00465A1B E820350300 call 00498F40
:00465A20 85C0 test eax, eax
:00465A22 7520 jne 00465A44
:00465A24 8D442408 lea eax, dword ptr [esp+08]
:00465A28 6A50 push 00000050
:00465A2A 50 push eax
:00465A2B FFD6 call esi
:00465A2D 8B150C434F00 mov edx, dword ptr [004F430C]
:00465A33 8D4C040C lea ecx, dword ptr [esp+eax+0C]
:00465A37 51 push ecx

* Possible Reference to String Resource ID=00195: " Trial Version"
|
:00465A38 68C3000000 push 000000C3
:00465A3D 52 push edx

发现两处有共同特点，都是call 00498f40后,若eax不为0就可跳过，再看00498f40处:
* Referenced by a CALL at Addresses:
|:00404502 , :0040469F , :0040489B , :00404A0E , :0040873C
|:00408833 , :004129AF , :00417205 , :004182AB , :004183C9
|:0043D206 , :0043D2FB , :0043D409 , :0043D4F5 , :0043D636
|:0045A529 , :00465A1B
|
:00498F40 33c0 xor eax,eax
:00498F42 C3 ret

:00498F43 90 nop
:00498F44 90 nop
:00498F45 90 nop
:00498F46 90 nop
:00498F47 90 nop
:00498F48 90 nop
:00498F49 90 nop
:00498F4A 90 nop
:00498F4B 90 nop
:00498F4C 90 nop
:00498F4D 90 nop
:00498F4E 90 nop
:00498F4F 90 nop

* Referenced by a CALL at Addresses:
|:004990C1 , :00499169 , :0049925A , :00499368
|
:00498F50 81ECA4000000 sub esp, 000000A4
:00498F56 56 push esi
:00498F57 57 push edi
:00498F58 8BBC24B0000000 mov edi, dword ptr [esp+000000B0]

共有17处调用它，而它仅仅是将eax值置0，就直接跳到"Trial Version"去了，试着将
:00498F40 33c0 xor eax,eax
:00498F42 C3 ret
改为
:00498F40 B001 mov al, 01
:00498F42 C3 ret

用UltraEdit打开Acdsee.exe,搜索90 90 33 c0 c3 90 90 ,有两处，将后一处改为
90 90 b0 01 c3 90 90(我不想搜索太长，那一串90太多，我担心数错。）


Add/Remove Plus! 2001

标 题:破解 Add/Remove Plus! 2001 的 30 天时间限制（初学者快看） (1千字)
发信人:paulyoung
时 间:2001-4-22 15:17:15
详细信息:
破解 Add/Remove Plus! 2001 的 30 天时间限制（初学者快看）

作　　者：PaulYoung
破解时间：2001-4-21
软件简介：是一个可以帮助你管理控制台中的新增/移除程序，除了可代替反安装软件外还会连同软件的清单移除，另外也可以清除以无效的软件清单，其它功能还包含可以编辑新增/移除程序里的软件清单，如改名、更换软件所在目录或加入新的软件清单、支持拖曳释放功能，只需将软件的反安装程序捷径拖曳到新的软件清单释放即可完成新软件清单等。
下　　载：http://61.128.193.188:8080/cgi-bin/dl.pl?url=ftp://61.128.193.188/soft/soft_install/arp2001t.exe
限　　制：30天试用，过期软件不能试用。网上注册。
破解工具：RegMon （看雪学苑的破解工具处有下载）
难　　度：超易

*************************************************************************************************

    一、先将系统时间改为比安装时间推前或推迟30天以上。如我把它改为2001-05-22。
    二、运行RegMon，确定“捕捉事件”已运行(Ctrl+E)。
    三、运行 Add/Remove Plus! 2001 ，显示"Trial Expired"（试用期满），"Try"键屏蔽。
    四、在RegMon处停止捕捉事件。再看看捕捉到什么……呵…………看到下面两处注册表键值：

…………HKCU\Software\WindowsConfig\1052 SUCCESS "2001-05-22 9:30:13" （当前时间）
…………HKCU\Software\WindowsConfig\1051 SUCCESS "2001-04-21 20:09:22"　 （安装时间）

    当前时间比安装时间超过30天，则"Trial Expired"。
    明白了吗？用鼠标双击HKCU\Software\WindowsConfig\1052，就会自动运行WINDOWS的REGEDIT，并跳到该处键值，再双击1052，修改"2001-05-22 9:30:13"为比安装时间不大于30天，或干脆删除"WindowsConfig"的键值。运行 Add/Remove Plus! 2001 ，哈………哈………又从第1天开始算起了。

    当然，这是很傻冒的解法，谁有更彻底的破解方法，请告知，我太懒了，不想再解下去了。

************************************* THE END**************************


Add/Remove Plus! 2001

标 题:Add/Remove Plus! 2001过期提示的去除.By冷雨飘心[BCG] (2千字)
发信人:冷雨飘心
时 间:2001-4-22 19:29:09
详细信息:
文章名称: Add/Remove Plus! 2001过期提示的去除
作　　者：冷雨飘心
破解时间：2001-4-22

破解工具：TRW2000 V1.23 Hiew V6.40 W32dasm黄金版

几点说明:本人正在学习汇编语言,希望来信交流,E-M:humewen@263.net.今天偶然加入了BCG,(我还不清楚是一个什么样的组织,但愿不会象法轮功...那我可就惨了),没有作品出手,收到CRACKER ABC首领的训斥,面壁思过,决定拿Add/Remove Plus! 2001 小试牛刀.以后还希望各位高手多多指导!

软件简介：(摘自paulyoung/*)是一个可以帮助你管理控制台中的新增/移除程序，除了可代替反安装软件外还会连同软件的清单移除，另外也可以清除以无效的软件清单，其它功能还包含可以编辑新增/移除程序里的软件清单，如改名、更换软件所在目录或加入新的软件清单、支持拖曳释放功能，只需将软件的反安装程序捷径拖曳到新的软件清单释放即可完成新软件清单等。
下　　载：http://61.128.193.188:8080/cgi-bin/dl.pl?url=ftp://61.128.193.188/soft/soft_install/arp2001t.exe
限　　制：30天试用，过期软件不能试用。网上注册。(摘抄结束*/懒得打字,这里向paulyoung致谢)

最后再罗嗦几句,以下就是用trw的u >命令抓取,很好用,有人问过这个问题,一般要指定路径--(悟空!太罗嗦了...stop.)
****************************************************************************
说干就干,开始!
从网上down一个下来,安装,启动,出现启动画面,try之,正常,调系统时间后一个月.启动,try也不行了,没办法,把系统时间调回来还是不行,气死老夫!
改注册表,一个月改一次,太烦琐了,另外还一直有讨厌的启动画面!
拿出利器trw2000,试bpx EnableMenuItem,中断检查eax,为0,关键不在这!
---只好Load之,从头分析
:u 0167:0046C4B9 l 2000 d:\crk.txt
0167:0046C4B9 MOV EBP,ESP //程序入口点
0167:0046C4BB ADD ESP,BYTE -0C
0167:0046C4BE MOV EAX,0046C288
0167:0046C4C3 CALL 004061F8 //初始化
0167:0046C4C8 MOV ECX,0046C530
0167:0046C4CD MOV EDX,0046C544
0167:0046C4D2 MOV EAX,0046C558
0167:0046C4D7 CALL 0046BEE4 //here跳出试用画面 -F8追入

0167:0046C4DC TEST AL,AL
0167:0046C4DE JZ 0046C521//game over选择quit的退出处理 ==>hiew @6b8de:7441 nop之!
0167:0046C4E0 MOV EAX,[0046E0A8]
0167:0046C4E5 MOV EAX,[EAX]
0167:0046C4E7 CALL 0044BDC4
**********************************************
-F8追入0167:0046C4D7 CALL 0046BEE4
哇塞这么多
call XXXXX
...
call XXXXX
...
call XXXXX
call XXXXX
call XXXXX
call XXXXX
...
我KAO,f10 go,until here
0167:0046C0AB 8B45F4 MOV EAX,[EBP-0C]
0167:0046C0AE 8B10 MOV EDX,[EAX]
0167:0046C0B0 FF92CC000000 CALL NEAR [EDX+CC]
//嘿嘿,就是他了=>hiew @6b4b0:6个nop
0167:0046C0B6 48 DEC EAX
0167:0046C0B7 0F9445FF SETZ [EBP-01]
0167:0046C0BB A118F94600 MOV EAX,[0046F918]
0167:0046C0C0 3B05E0DD4600 CMP EAX,[0046DDE0]
0167:0046C0C6 7E04 JNG 0046C0CC
0167:0046C0C8 C645FF00 MOV BYTE [EBP-01],00
0167:0046C0CC 33C0 XOR EAX,EAX

再启动嘿嘿,干脆利落的出现了正常界面!第一篇破文,终于诞生了,由于有学业繁忙在身,只能偶尔来这里看看,希望各位指导!


Araxis Merge 2001 Professional Evaluation v6.0

 标 题:Araxis Merge 2001 Professional Evaluation v6.0 时间限制去除 (7千字)
发信人:liangs
时 间:2001-6-6 21:43:55
详细信息:
Araxis Merge 2001 Professional Evaluation v6.0 时间限制去除
by liangs

(1)去除Nag和30天限制

根据Nag的标题"Welcome to Araxis Merge"我们在W32Dasm中可以查到那
个窗口的ID是DialogID_0FA8，再查DialogID_0FA8在程序中出现的地方，
可找到如下代码处：

:00469A79 3BF3 cmp esi, ebx
:00469A7B 8B55F0 mov edx, dword ptr [ebp-10]
:00469A7E 8B45EC mov eax, dword ptr [ebp-14]
:00469A81 8990000E0000 mov dword ptr [eax+00000E00], edx
:00469A87 7C05 jl 00469A8E //改为EB05
:00469A89 83FE1E cmp esi, 0000001E
//判断时间是否大于30天
:00469A8C 7E05 jle 00469A93

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00469A77(U), :00469A87(C)
|
:00469A8E BE1E000000 mov esi, 0000001E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00469A8C(C)
|
:00469A93 395D08 cmp dword ptr [ebp+08], ebx
:00469A96 747D je 00469B15 //改为EB7D
:00469A98 53 push ebx

* Possible Reference to Dialog: DialogID_0FA8 //Nag过期窗口提示

★★★ 一定要跳过这个Nag，上面的两个修改都是为了要Jump过它

:00469A99 68A80F0000 push 00000FA8
:00469A9E 8D8D04FFFFFF lea ecx, dword ptr [ebp+FFFFFF04]
:00469AA4 E81D270700 call 004DC1C6
:00469AA9 B91E000000 mov ecx, 0000001E
:00469AAE 2BCE sub ecx, esi
:00469AB0 898D60FFFFFF mov dword ptr [ebp+FFFFFF60], ecx
:00469AB6 8D8D64FFFFFF lea ecx, dword ptr [ebp+FFFFFF64]
:00469ABC C645FC03 mov [ebp-04], 03
:00469AC0 E8FB5F0000 call 0046FAC0
:00469AC5 A140E95300 mov eax, dword ptr [0053E940]
:00469ACA 8945A0 mov dword ptr [ebp-60], eax
:00469ACD 8945A4 mov dword ptr [ebp-5C], eax
:00469AD0 68AC355400 push 005435AC
:00469AD5 8D4DA0 lea ecx, dword ptr [ebp-60]
:00469AD8 C645FC06 mov [ebp-04], 06
:00469ADC C78504FFFFFF34AD5000 mov dword ptr [ebp+FFFFFF04], 0050AD34
:00469AE6 E80E1E0700 call 004DB8F9
:00469AEB 68AC355400 push 005435AC
:00469AF0 8D4DA4 lea ecx, dword ptr [ebp-5C]
:00469AF3 E8011E0700 call 004DB8F9
:00469AF8 8D8D04FFFFFF lea ecx, dword ptr [ebp+FFFFFF04]
:00469AFE C645FC07 mov [ebp-04], 07
:00469B02 E895270700 call 004DC29C
:00469B07 8D8D04FFFFFF lea ecx, dword ptr [ebp+FFFFFF04]
:00469B0D 885DFC mov byte ptr [ebp-04], bl
:00469B10 E89B29FBFF call 0041C4B0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00469A96(C)
|
:00469B15 83FE1E cmp esi, 0000001E
:00469B18 8D4DA8 lea ecx, dword ptr [ebp-58]
:00469B1B 0F9CC3 setl bl
:00469B1E C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:00469B25 E8E676FAFF call 00411210
:00469B2A 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00469B2D 5F pop edi
:00469B2E 5E pop esi
:00469B2F 8AC3 mov al, bl
★★★ 这个很重要，一定要使al为1
下面我们将会看到这点
:00469B31 64890D00000000 mov dword ptr fs:[00000000], ecx
:00469B38 5B pop ebx
:00469B39 8BE5 mov esp, ebp
:00469B3B 5D pop ebp
:00469B3C C20400 ret 0004
这里将返回到00412ABC的调用
:00469B3F 90 nop

-----------------------------------------------------------
为使00469B3C处返回时，al=1我们可以修改上面代码如下:
:00469B2F 8AC3 mov al, bl //改为 xor eax,eax
33c0
:00469B31 64890D00000000 mov dword ptr fs:[00000000], ecx
:00469B38 5B pop ebx
:00469B39 8BE5 mov esp, ebp
:00469B3B 5D pop ebp
插入语句 40 inc eax //这里使al=1
:00469B3C C20400 ret 0004
:00469B3F 90 nop //这个nop将被占用

------------------------------------------------------------
下面代码为上面子程序的返回后的处理，程序会继续处理时间判断：

* Reference To: KERNEL32.GetLocalTime, Ord:011Bh
|
:00412A87 FF151C645000 Call dword ptr [0050641C]
:00412A8D 8B45E0 mov eax, dword ptr [ebp-20]
:00412A90 663DD007 cmp ax, 07D0
:00412A94 722E jb 00412AC4
:00412A96 663DD207 cmp ax, 07D2
:00412A9A 7728 ja 00412AC4
:00412A9C 7513 jne 00412AB1
:00412A9E 668B45E2 mov ax, word ptr [ebp-1E]
:00412AA2 663D0300 cmp ax, 0003
:00412AA6 771C ja 00412AC4
:00412AA8 7507 jne 00412AB1
:00412AAA 66837DE61E cmp word ptr [ebp-1A], 001E
:00412AAF 7713 ja 00412AC4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00412A9C(C), :00412AA8(C)
|
:00412AB1 53 push ebx
:00412AB2 B960365400 mov ecx, 00543660
:00412AB7 E8446E0500 call 00469900

:00412ABC 84C0 test al, al
★★★ 从上面的00469B3C处的RET返回到此，如果al=0，将跳往过期的处理，
几个F12后程序将退出，所以一定要在前面的call 00469900中将al置为1

:00412ABE 0F85A7000000 jne 00412B6B
上面al为1后，这里就会跳往正确的地方

(2)去除2002年3月31号的限制
这个程序的作者有点变态，他在程序中调用GetLocalTime有几十次之多,
而且每次调用后都作了判断，判断如果时间过期后都要跳忘不同的过期
处理，比如上面00412A87处开始的一段GetLocalTime的处理要按如下方
法处理：

* Reference To: KERNEL32.GetLocalTime, Ord:011Bh
|
:00412A87 FF151C645000 Call dword ptr [0050641C]
:00412A8D 8B45E0 mov eax, dword ptr [ebp-20]

:00412A90 663DD007 cmp ax, 07D0 //改为9090
07D0也就是2000年
:00412A94 722E jb 00412AC4 //改为9090
如果时间小于2000年则跳往00412AC4

:00412A96 663DD207 cmp ax, 07D2 //改为9090
07D2也就是2002年
:00412A9A 7728 ja 00412AC4 //改为9090
如果时间大于2002年则跳往00412AC4

:00412A9C 7513 jne 00412AB1 //改为EB13
//这里一定要跳，下面就要跳往过期处理

:00412A9E 668B45E2 mov ax, word ptr [ebp-1E]
:00412AA2 663D0300 cmp ax, 0003
:00412AA6 771C ja 00412AC4 //这里跳往过期处理

:00412AA8 7507 jne 00412AB1
:00412AAA 66837DE61E cmp word ptr [ebp-1A], 001E
:00412AAF 7713 ja 00412AC4

如果不怕麻烦的话，就处理每个GetLocalTime后的代码，共有几十处，
我用的一种投机的方法就简单了这个问题。

我们已经知道07D2也就是2002年，用UltraEdit打开Merge.exe，查找替换
文件中所有的07D2为0BB8（也就是3000年），当然你也可以改为N千年也
是可以的 :-)，重新运行程序Nag、30天限制、及2002年3月限制都没有了，
这种方法并没有处理时间小于2000年的问题，当然现在已经2001年了，不
会有人会把机器时间改为2000年以前吧，如果要解决掉这个小于2000年的
问题，须按上面我写的修改每个GetLocelTime返回后的代码的方法就可搞
定，这就需要耐心了。


Banylon

标 题:翻译：TORN@DO's Cracking Tutorial for (4千字)
发信人:bood
时 间:2001-2-10 18:59:48
详细信息:

TORN@DO's Cracking Tutorial for
Babylon Translator 3.50

你需要的工具：WinIce和一个十六进制编辑器。我的意见是用Hacker's View。如果你没有这些工具，你可以到一些破解软件的网站去下载。

Banylon是一个免费软件，但是它在使用过一段时间后仍然会过期（试用期？）。你可以到它的网站下载新版本继续试用（骗取访问量？）。而象你和我一样的人不想一直去升级。你应当明白我为什么破解一个有时间限制的免费软件，这是我见过的第一个有时间限制的免费软件。我想你已经读过《Cracker's Notes》，所以我们现在可以开始了。不过不要问我要那个Notes，自己到破解网站去找！

Step 1
安装Babylon并且看一下“关于”窗口。你会看见“You've x Days left ...”的消息，然后退出。将你的系统日期向前推至少101天。再次启动时你会看到过期的窗口。从我的其他教程你会发现我总是会看一下入口函数和出口函数，因为这将节省我很多时间。
ADAVPI32.RegCloseKey
ADAVPI32.RegOpenKeyExA
ADAVPI32.RegQueryValueExA

这些是很重要的函数。但是我们知道它们不能检查日期。它们只能存储程序设置。我们再看一下CAPTLIB.DLL
IsBabylonPastExpiryDate
Kernel32.GetLocalTime
Kernel32.GetSystemTime

看见这个“IsBabylonPastExpiryDate”了?知道这意味着什么吗？对了！ 把CAPTLIB.DLL拷到C:\，在WINICE.DAT中加入：

EXP="C:\CAPTLIB.DLL"

使winice加载CAPTLIB.DLL。重启动你的计算机，不要忘了加载WinIce！

Step 2
让我们开始吧！Ctrl+D调出winice，在函数IsBabylonPastExpiryDate处设置断点(BPX IsBabylonPastExpiryDate)。如果出现错误，那么你肯定忘了改变winice.dat了，或者你没有重启动你的计算机。运行Babylon，你会在函数被调用的地方回到WinIce中。按F10跳过此函数，哦，过期窗口！我们再在MessageBoxA设断点。按F11回到呼叫此函数的程序。现在你会看到这些代码：
0137:00AA141B FF75E8 PUSH DWORD PTR [EBP-18]
0137:00AA141E E8BFC60000 CALL ADAVPI32!RegCloseKey
0137:00AA1423 85DB TEST EBX, EBX
0137:00AA1425 7431 JZ 00AA1458
...
0137:00AA1442 BD95C4FDFFFF LEA EDX, [EBP-023C]
0137:00AA1448 52 PUSH EDX
0137:00AA1449 E9C4C60000 CALL USER32!GetFocus
0137:00AA144E 50 PUSH EAX
0137:00AA144F E8A6C60000 CALL USER32!MessageBoxA
0137:00AA1454 33C0 XOR EAX,EAX
0137:00AA1456 EB04 JMP 00AA145C
0137:00AA1458 0FBF45F2 MOVSX EAX,WORD PTR [EBP-0E]

现在你会发现程序比较了某个值，如果没有时间剩下，那么就会出现过期对话框。所以我们先破解这里。将JZ 00AA1458改为JMP 00AA1458。你可以实验一下，如果ZF被置位或者没有会发生什么情况。重新运行Babylon，还看的见那个窗口吗？当然看不见了！在下一步，我们将要除掉IsBabylonPastExpired中的数据检查，退出吧。

Step 3
你已经知道，IsBabylonPastExpired是CAPTLIB.DLL的一个输出函数。当一个程序有一个出口时，这个口往往被用到。所以我们在IsBabylonPastExpiryDate处设了一个断点。运行程序，将会回到winice。按F10直到你看见这样的代码：

0137:00AA11F0 E851C80000 CALL KERNEL32!GetSystemTime

现在你知道时间就是在这里检查的。当你按F10的时候，看一下esi，你会发现esi突然改变了！用“? VALUE”你会看见在第一次运行程序后你新设置的时间。往下翻，你会看见这样的代码：

0137:00AA12B9 7D0A JGE 00AA12C5
0137:00AA12BB BB01000000 MOV EAX,00000001
0137:00AA12C0 E956010000 JMP 00AA141B

这个JGE的意思是：如果日期已经到过期时间或以后，那么禁止你“试用”Babylon...如果不是，那么程序仍然可用（JMP 00AA141）。所以你可以改变esi的值来看看是不是这样，或者你可以输入“A”然后NOP回车NOP回车，回车（是两个！）。然后Babylon会完全可用！

Step 4

现在你已经知道MessageBox出现的地方和日期检查的地方。你可以用一个简单的JZ或者JMP跳过MessageBox；用JMP 00AA141B替代JGE 00AA12C5或者NOP掉这个JGE 00AA12C5。最后用FC比较CAPTLIB.OLD和CAPTLIB.DLL，并在PATCH.TXT储存两者的不同之处（FC /B CAPTLIB.OLD CAPTLIB.DLL > PATCH.TXT）。现在编一下你的pacth并编译。把CAPTLIB.DLL改名为CAPTLIB.CRK，CAPTLIB.OLD改名为CAPTLIB.DLL。执行你的pacth。比较CAPTLIB.DLL和CAPTLIB.CRK直到两者完全相同。好好享受这个翻译工具吧，哦，别忘了删除C:\CAPTLIB.DLL和WINICE.DAT的EXP="C:\CAPTLIB.DLL一行。


ClipMate V5.3.03

标 题:新版《剪切板工具》 ClipMate V5.3.03破解 (3千字)
发信人:Jmy
时 间:2001-4-6 22:02:51
详细信息:
《剪切板工具》 ClipMate V5.3.03 破解
软件介绍：
非常出色的 Windows 剪贴板增强程序，自动保存你从多个程序中剪切/复制的对象，你可以以后把这些对象粘贴到任何应用程中。

下载地址：http://www.soft999.com/download1/clipmate5303.exe

目的：学习破解技术
保护类型：用户名和注册码
期限：试用期30天
破解工具：TRW2000
难易程度：易（呵呵，象我这样的初哥也能搞定）

软件安装好后，运行它，找到注册的地方，哈哈，按贯列还是在用户名和注册码栏中输入78787878按确定，嘿嘿，这回可就没有象在HappyEO电子琴2.05版中那样便宜了，显示无效的注册码。

没办法在用户栏中输入Jmy 注册码输入78787878

起动TRW2000按Ctrl+N,下命令bpx hmemcpy,按F5返回，再按确定，被TRW2000拦到，bc * (当然bd *)也是可以的。

下命令pmodule哈哈来到大侠们所说的程序领空，如今终于领会了，哈哈，我最喜欢TRW2000的这个命令，一有空就把它P到程序领空。

接着按F12，好象是7次吧，我不喜欢记这鬼东西，反正是出错的前一次，紧接着按F10慢慢追，看每一句大概是什么意思，把学到的汇编知识用到上面，这样会提高快一点，呵呵，这是我的一点愚见，这样慢慢F10我们会来到如下：

0167:00551196 MOV EDX,00551514
0167:0055119B LEA EAX,[EBP+FFFFFE50]
0167:005511A1 MOV ECX,01
0167:005511A6 CALL 0040A270 //看到这句可凝，按F8追进
0167:005511AB TEST EAX,EAX

提示：在按F8这前，最好先按F9（bpx)一下，再按F8追进，这样的好处是如果判断错误，就可以继续从0167：005511A6这一句继续往下追，经常看到有些和我一样的初哥问“我怎么知道那一个是关键的Call”，大侠们常会告诉你凭感觉。嘿嘿，大侠们也真是小气，只差一句：“不告诉你，就是不告诉你，让你也尝尝酸甜苦辣！！！”

按我的愚见，大侠们说的不是没有道理，所谓的凭感觉，也就是你要基本上懂得一些汇编指令，最好是精通（这一步我也还没有达到），然后粗略运行调试一下软件，明白软件的大致流程，如在什么地方进行循环，比较，判断，存取，赋初值。。。等等，有的软件还会给Flag赋值为0或1，以判断是否注册成功，明白了这些再加上一定数量的破解，才会有感觉，我就是这样的，对了，我所说的一定数量是指不同类型的软件，而不是指同一类型的软件，破解同一类型的软件100，不如破解不同类型的软件2个，呵呵，有点夸张吧。好了，我们继续接着上面的破解往下走。

在上面按F8 Call进后，按F10往下走最终来到如下：
0167:00551293 LEA EDX,[EBP+FFFFFE50]
0167:00551299 MOV EAX,ESI
0167:0055129B CALL 0040A11C
0167:005512A0 MOV EAX,ESI
0167:005512A2 CALL 0040A0B4
0167:005512A7 CMP EAX,BYTE +0D //在这里判断注册码是否是13位
0167:005512AA JNZ NEAR 0055146C

这里有两种方法对它进行处理：1.就是先F9一下，退出程序，输入假的13位注册码再进来。2.当你来到0167：005512AA JNZ这一句，下命令r fl z来改变它的跳转方向。

0167:005512B0 LEA EAX,[EBP-0E] //在这里D eax 我们就可以看到正确的注册码了G014786654188
0167:005512B3 CALL 0040A0B4
0167:005512B8 CMP EAX,BYTE +0D
0167:005512BB JNZ NEAR 0055146C
0167:005512C1 MOV AL,[ESI+03]
0167:005512C4 CMP AL,[EBP-0B]

再往下走，就是用假注册码和真注册码进行比较判断，你自己去追追看吧，我就不往下写了，哎，想不到写一篇破文还这么累。

退出TRW2000，输入Jmy G014786654188按确定，呵呵，注册成功！

软件注册成功后把注册信息写入到注册表中，如下：

REGEDIT4

[HKEY_CURRENT_USER\Software\Thornsoft\ClipMate5\Registration]
"Name"="Jmy"
"RegistrationNumber"="G014786654188"
"FirstTime"="0"

OK，收工今天就到这里，以上是我的一些破解体会和愚见，写出来和广大破解爱好者交流，共同提高，这篇文章是在网上联网写的，由于时间紧迫，其中难免有错误和不对的地方，请各位大侠，大哥，大姐来信指正。

转载请保持完整。

email:jmyemail@163.com

Jmy 2001.4.6


CuteFTP V4.0

 发信人:小球[CCG]
时 间:2001-5-3 16:04:54
详细信息:
如何来破解有时间限制的软件呢？当然，方法有很多了。如果可以算到它的注册码，那是最理想的了。如果没有注册窗口或是算法非常复杂呢？那么采用爆破的方法就是最佳的途径。爆破，也就是通过修改程序本身来解除某种限制，也是很多初学者可以很容易掌握的方法！
下面我们举个例子来具体说明一下：
CuteFTP V4.0上传软件，据说很是好用。很多网站都推崇它来上传主页！软件下载地址： http://www.ty.sx.cn/software/down/cute4b10.exe
安装完毕后，有30天的使用限制。30天一过，就会有讨厌的提示框。我们来除掉它。你可以找到注册框。但是它是在线注册的，那就只有爆破了！(除非你向他注册)
首先备份一下，然后检查一下是否有壳的保护，幸好它没有！
然后呢？当然是调一下时钟，使它过期。你运行试试，是不是有提示框弹出。调出ice或是trw2000，我用ice。
下断bpx getsystemtime
回到程序，再运行它，程序会被中断，再按30几下F12来到它的领空：
:004AEE69 FF1548525000 Call dword ptr [00505248]
:004AEE6F 668B45EA mov ax, word ptr [ebp-16] **停在这里
:004AEE73 663B05B2345400 cmp ax, word ptr [005434B2]
:004AEE7A 753B jne 004AEEB7
:004AEE7C 668B45E8 mov ax, word ptr [ebp-18]
:004AEE80 663B05B0345400 cmp ax, word ptr [005434B0]
:004AEE87 752E jne 004AEEB7
:004AEE89 668B45E6 mov ax, word ptr [ebp-1A]
:004AEE8D 663B05AE345400 cmp ax, word ptr [005434AE]
:004AEE94 7521 jne 004AEEB7
:004AEE96 668B45E2 mov ax, word ptr [ebp-1E]
:004AEE9A 663B05AA345400 cmp ax, word ptr [005434AA]
:004AEEA1 7514 jne 004AEEB7
:004AEEA3 668B45E0 mov ax, word ptr [ebp-20]
:004AEEA7 663B05A8345400 cmp ax, word ptr [005434A8]
:004AEEAE 7507 jne 004AEEB7
:004AEEB0 A1A0345400 mov eax, dword ptr [005434A0]
:004AEEB5 EB45 jmp 004AEEFC
上面是程序在取一些关于时间的信息。如果你仔细查找的话，也许会找到蛛丝马迹。
下面你只要按住F10让它继续执行下去，等待它出错。ok，出错了是吗？把它关掉。你又会马上回到ice中：
:0043ACD5 E8ACC10800 call 004C6E86
:0043ACDA 8D4C2454 lea ecx, dword ptr [esp+54]
:0043ACDE E89C7C0800 call 004C297F ***这就是那个出错框的调用
:0043ACE3 8D8C24B0000000 lea ecx, dword ptr [esp+000000B0] ***如果没有错的话，你应该是停到这儿。
现在按ctrl+向上键找到可以跳过此地的跳转！
:0043AC6C FF1548505000 Call dword ptr [00505048]
:0043AC72 8B8668060000 mov eax, dword ptr [esi+00000668]
:0043AC78 C7866008000001000000 mov dword ptr [esi+00000860], 00000001
:0043AC82 3BC3 cmp eax, ebx
:0043AC84 0F849C020000 je 0043AF26 *****这里可以哦！把它改为jne，我用hiew比较方便。
:0043AC8A 53 push ebx
:0043AC8B 8D4C2458 lea ecx, dword ptr [esp+58]
:0043AC8F E8ACE00600 call 004A8D40
:0043AC94 8B442418 mov eax, dword ptr [esp+18]
:0043AC98 8B4C2424 mov ecx, dword ptr [esp+24]
:0043AC9C 50 push eax
:0043AC9D 51 push ecx
你再运行一下试试？什么？出错了？提示程序被破坏或是被病毒感染？呵呵..这是作者下的圈套。他在程序中加了自校验，发现程序被改后马上报错！没有关系，我们把它也跳过去！呵呵...毒辣..
在W32Dsam中查找出错的标志，比如：consistency。找到了，在这儿：

:0043A65D FF1500565000 Call dword ptr [00505600]
:0043A663 C7833C06000001000000 mov dword ptr [ebx+0000063C], 00000001
:0043A66D E88ED90400 call 00488000
:0043A672 85C0 test eax, eax
:0043A674 7567 jne 0043A6DD *当然是改这里咯！改为je。
:0043A676 8D4DEC lea ecx, dword ptr [ebp-14]

* Possible Reference to String Resource ID=00426: "CuteFTP consistency check failed. This means that you are pr"
|
:0043A679 68AA010000 push 000001AA
:0043A67E 51 push ecx
:0043A67F E85CAAFEFF call 004250E0 ****这里是哦！
:0043A684 83C408 add esp, 00000008
:0043A687 8B00 mov eax, dword ptr [eax]
:0043A689 6A00 push 00000000
运行看看！是不是正常了呢？虽然显示未注册，但是讨厌的的提示框却没有了！呵呵...到此完毕，收工！

欢迎到访我们的网站：http:\\freecracker.myetang.com


CuteFTP V4.0

标 题:CuteFTP V4.0的时间限制解除！ (4千字)
发信人:小球[CCG]
时 间:2001-4-15 16:07:05
详细信息:
如何来破解有时间限制的软件呢？当然，方法有很多了。如果可以算到它的注册码，那是最理想的了。如果没有注册窗口或是算法非常复杂呢？那么采用爆破的方法就是最佳的途径。爆破，也就是通过修改程序本身来解除某种限制，也是很多初学者可以很容易掌握的方法！
下面我们举个例子来具体说明一下：
CuteFTP V4.0上传软件，据说很是好用。很多网站都推崇它来上传主页！软件下载地址： http://www.ty.sx.cn/software/down/cute4b10.exe
安装完毕后，有30天的使用限制。30天一过，就会有讨厌的提示框。我们来除掉它。你可以找到注册框。但是它是在线注册的，那就只有爆破了！(除非你向他注册)
首先备份一下，然后检查一下是否有壳的保护，幸好它没有！
然后呢？当然是调一下时钟，使它过期。你运行试试，是不是有提示框弹出。调出ice或是trw2000，我用ice。
下断bpx getsystemtime
回到程序，再运行它，程序会被中断，再按30几下F12来到它的领空：
:004AEE69 FF1548525000 Call dword ptr [00505248]
:004AEE6F 668B45EA mov ax, word ptr [ebp-16] **停在这里
:004AEE73 663B05B2345400 cmp ax, word ptr [005434B2]
:004AEE7A 753B jne 004AEEB7
:004AEE7C 668B45E8 mov ax, word ptr [ebp-18]
:004AEE80 663B05B0345400 cmp ax, word ptr [005434B0]
:004AEE87 752E jne 004AEEB7
:004AEE89 668B45E6 mov ax, word ptr [ebp-1A]
:004AEE8D 663B05AE345400 cmp ax, word ptr [005434AE]
:004AEE94 7521 jne 004AEEB7
:004AEE96 668B45E2 mov ax, word ptr [ebp-1E]
:004AEE9A 663B05AA345400 cmp ax, word ptr [005434AA]
:004AEEA1 7514 jne 004AEEB7
:004AEEA3 668B45E0 mov ax, word ptr [ebp-20]
:004AEEA7 663B05A8345400 cmp ax, word ptr [005434A8]
:004AEEAE 7507 jne 004AEEB7
:004AEEB0 A1A0345400 mov eax, dword ptr [005434A0]
:004AEEB5 EB45 jmp 004AEEFC
上面是程序在取一些关于时间的信息。如果你仔细查找的话，也许会找到蛛丝马迹。
下面你只要按住F10让它继续执行下去，等待它出错。ok，出错了是吗？把它关掉。你又会马上回到ice中：
:0043ACD5 E8ACC10800 call 004C6E86
:0043ACDA 8D4C2454 lea ecx, dword ptr [esp+54]
:0043ACDE E89C7C0800 call 004C297F ***这就是那个出错框的调用
:0043ACE3 8D8C24B0000000 lea ecx, dword ptr [esp+000000B0] ***如果没有错的话，你应该是停到这儿。
现在按ctrl+向上键找到可以跳过此地的跳转！
:0043AC6C FF1548505000 Call dword ptr [00505048]
:0043AC72 8B8668060000 mov eax, dword ptr [esi+00000668]
:0043AC78 C7866008000001000000 mov dword ptr [esi+00000860], 00000001
:0043AC82 3BC3 cmp eax, ebx
:0043AC84 0F849C020000 je 0043AF26 *****这里可以哦！把它改为jne，我用hiew比较方便。
:0043AC8A 53 push ebx
:0043AC8B 8D4C2458 lea ecx, dword ptr [esp+58]
:0043AC8F E8ACE00600 call 004A8D40
:0043AC94 8B442418 mov eax, dword ptr [esp+18]
:0043AC98 8B4C2424 mov ecx, dword ptr [esp+24]
:0043AC9C 50 push eax
:0043AC9D 51 push ecx
你再运行一下试试？什么？出错了？提示程序被破坏或是被病毒感染？呵呵..这是作者下的圈套。他在程序中加了自校验，发现程序被改后马上报错！没有关系，我们把它也跳过去！呵呵...毒辣..
在W32Dsam中查找出错的标志，比如：consistency。找到了，在这儿：

:0043A65D FF1500565000 Call dword ptr [00505600]
:0043A663 C7833C06000001000000 mov dword ptr [ebx+0000063C], 00000001
:0043A66D E88ED90400 call 00488000
:0043A672 85C0 test eax, eax
:0043A674 7567 jne 0043A6DD *当然是改这里咯！改为je。
:0043A676 8D4DEC lea ecx, dword ptr [ebp-14]

* Possible Reference to String Resource ID=00426: "CuteFTP consistency check failed. This means that you are pr"
|
:0043A679 68AA010000 push 000001AA
:0043A67E 51 push ecx
:0043A67F E85CAAFEFF call 004250E0 ****这里是哦！
:0043A684 83C408 add esp, 00000008
:0043A687 8B00 mov eax, dword ptr [eax]
:0043A689 6A00 push 00000000
运行看看！是不是正常了呢？虽然显示未注册，但是讨厌的的提示框却没有了！呵呵...到此完毕，收工！

欢迎到访我们的网站：http:\\freecracker.myetang.com


cuteftp4.2 full

 标 题:如何破解cuteftp4.2 full.
发信人:wocy
时 间:2000-12-21 19:16:14
详细信息:
如何破解cuteftp4.2 full
-----------------------------
雪椰
2000,12,21pm
wocy@263.net
wocy.top263.net
-------------------------------

今天破了这个版本，靠些运气，说给大家听听。
我一直用的是2832版，结果昨天说到期了，气死我我了，于是开始。（因为破4.2full跟这有点联系）

1，2832
我看到在about框中有UNREGISTERED VERSION，在strref中找到，来到地址

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401060(C)
|
:00401083 8D8C2480000000 lea ecx, dword ptr [esp+00000080]

* Possible Reference to String Resource ID=00293: "UNREGISTERED VERSION"
|
:0040108A 6825010000 push 00000125
:0040108F 51 push ecx
:00401090 E81B6C0000 call 00407CB0
:00401095 83C408 add esp, 00000008
:00401098 50 push eax
:00401099 8BCF mov ecx, edi

而
:00401056 52 push edx
:00401057 8BC8 mov ecx, eax
:00401059 E8021D0100 call 00412D60
:0040105E 85C0 test eax, eax
:00401060 7421 je 00401083
:00401062 8D44240C lea eax, dword ptr [esp+0C]
:00401066 8BCF mov ecx, edi
看一下00412D60
* Referenced by a CALL at Addresses:
|:00401059 , :00414749 , :004310A8(请注意：此调用是运行开始时看是否注册）
|

* Possible Reference to String Resource ID=00255: "No entry for the current site found. Do you wish to create o"
|
:00412D60 6AFF push FFFFFFFF
:00412D62 688BD24600 push 0046D28B
:00412D67 64A100000000 mov eax, dword ptr fs:[00000000]
:00412D6D 50 push eax
:00412D6E 64892500000000 mov dword ptr fs:[00000000], esp
:00412D75 81EC40060000 sub esp, 00000640
:00412D7B 55 push ebp
:00412D7C 56 push esi
。。。。
:00412FF4 5E pop esi
:00412FF5 5D pop ebp
:00412FF6 64890D00000000 mov dword ptr fs:[00000000], ecx
:00412FFD 81C44C060000 add esp, 0000064C
:00413003 C20400 ret 0004

可能此函数是判断注册否的

把412d60 改为
mov eax,1
ret 004

执行，2832 creak成功。

2，402beta
找到这个版本后，按耐不住，继续破解。
我想他跟2832应该差不多，
但是找不到UNREGISTERED VERSION字串。怎么办，如何找到这个函数。风回路转，继续查看2832的程式，在开始调用的
:004310A8(请注意：此调用是运行开始时看是否注册）
而程序的入口点是43c00f
离的挺近的，
经过比较，发现
* Referenced by a CALL at Addresses:
|:0040132C , :0042FB58 , :004340EB , :0043AF8B , :0043F1FB
|:004432C2 , :00444E5D , :004542F1 , :00472611 , :004774AE
|:004779DE , :0048484A , :00485466 , :0048A3DD , :0048B859
|
:004890A0 64A100000000 mov eax, dword ptr fs:[00000000]

* Possible Reference to String Resource ID=00255: "No entry for the current site found. Do you wish to create o"
|
:004890A6 6AFF push FFFFFFFF
:004890A8 68CBF54F00 push 004FF5CB
:004890AD 50 push eax
:004890AE 64892500000000 mov dword ptr fs:[00000000], esp
:004890B5 81ECF0030000 sub esp, 000003F0
:004890BB 8D442408 lea eax, dword ptr [esp+08]
:004890BF 6A00 push 00000000
:004890C1 50 push eax
。。。
:004890E2 C3 ret

有可能是
改为mov eax,1
ret
运行，说效验失败。
"CuteFTP consistency check failed. This means that you are pr"
继续，查找字串
来到
:0043B23F E8DCDF0400 call 00489220
:0043B244 85C0 test eax, eax
:0043B246 7567 jne 0043B2AF
:0043B248 8D55EC lea edx, dword ptr [ebp-14]

* Possible Reference to String Resource ID=00426: "CuteFTP consistency check failed. This means that you are pr"
|
:0043B24B 68AA010000 push 000001AA
:0043B250 52 push edx

把
:0043B246 7567 jne 0043B2AF 改为je

再运行，成功。

3，4.2full

懒得动脑子了，用上法
找到
(call)48f900 改为
mov eax,1
ret

(check point)48f900 jne xxx 改为
je xxx

ok
这个世界清静了。

标 题:发现了问题。
发信人:wocy
时 间:2000-12-22 2:18:35
详细信息:

经过试用，发现在做成批处理时会出错，地址在
48fbd1
47fbfa
请高手指点

标 题:搞定，修正部分...
发信人:wocy
时 间:2000-12-22 23:13:48
详细信息:

........
有可能是
改为mov eax,1
ret
运行，说效验失败。
|-------------------------------------------------------------------------------------------------------------------->
"CuteFTP consistency check failed. This means that you are pr"
继续，查找字串
来到
:0043B23F E8DCDF0400 call 00489220
:0043B244 85C0 test eax, eax
:0043B246 7567 jne 0043B2AF
:0043B248 8D55EC lea edx, dword ptr [ebp-14] >

* Possible Reference to String Resource ID=00426: "CuteFTP consistency check failed. This means that you are pr"
|
:0043B24B 68AA010000 push 000001AA
:0043B250 52 push edx

把
:0043B246 7567 jne 0043B2AF 改为je
|-------------------------------------------------------------------------------------------------------------------->
注：上面括住部分为待修正部分

在:0043B23F E8DCDF0400 call 00489220
的函数被调用2次，把这两个效验点 屏蔽掉后，表面正常，但运行不稳定，在进行批量操作时常非法操作，
于是怀疑是在此函数中有陷阱，用内存补丁程序只做第一个补丁，则运行成功

|-------------------------------------------------------------------------------------------------------------------->

再运行，成功。

3，4.2full

懒得动脑子了，用上法
找到
(call)48f900 改为
mov eax,1
ret

ok
这个世界清静了。


Idyle Tasks Manager 98

 标 题:《爆破Idyle Tasks Manager 98》糊理糊涂版 (795字)
发信人:ratarice
时 间:2001-5-4 18:04:22
详细信息:
《爆破Idyle Tasks Manager 98》糊理糊涂版
目标：Idyle Tasks Manager 98 V1.0 for Windows 95/98
该软件不仅是一个系统信息工具，而且可以监视当前正在运行的所有程序并强行中断以释放内存。
工具：TRW2000 V1.22 & W32DSM89 & ULTRAEDIT-32
作者：RATARICE
简录：
一、运行程序，发现其是20天试用，注册吧！却发现它要发E-MAIL才行！那怎么办？
二、将时间向后调一个月，再运行程序，提示“the version has expired...”
确定后，又弹出两个提示框，程序结束。记下上面的话了吗？
三、用W32DSM89反汇编它，找到上面的话。
四、省略无数次尝试... ...
五、改来改去，无果。只好找出TRW2000。
运行trw, ctrl+N 下 bpx getsystemtime ctrl+N；
运行程序。被拦。下pmodule，按几次F10就弹出错误提示。
五、省略无数次尝试... ...
六、盛怒之下，决定将弹出错误的call Nop掉。
七、改好后，运行竟然成功！

标 题:我来个明明白白版！；） (2千字)
发信人:LL[CCG]
时 间:2001-5-4 23:52:48
详细信息:

Tasks Manager98 1.12破解过程。
下载地址：http://www.newhua.com.cn/down/taskmanager98.zip
工具：TRW20001。22和一个16进制编辑工具。
首先安装完软件（废话），然后把系统日期跳后1年。运行后出现到期提示。好了，开始：
运行TRW2000，用MESSAGEBOXA下断，再次运行，断到这里：
* Reference To: user32.MessageBoxA, Ord:0000h
:0048488F E83421F8FF Call 004069C8------------我们在这回到程序领空
:00484894 33C0 xor eax, eax
:00484896 5A pop edx
:00484897 59 pop ecx
:00484898 59 pop ecx
:00484899 648910 mov dword ptr fs:[eax], edx
:0048489C 68B6484800 push 004848B6
:004848A1 8D45F8 lea eax, dword ptr [ebp-08]
:004848A4 BA02000000 mov edx, 00000002
:004848A9 E822F2F7FF call 00403AD0
:004848AE C3 ret
向上看有没有跳转语句。。。。。没有，好按F10出来这个CALL。
:004923F7 E84C24FFFF call 00484848-------------这个就是出错

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492396(U)
|
:004923FC 8B0DC04E4900 mov ecx, dword ptr [00494EC0]--我们在这里。
:00492402 8B09 mov ecx, dword ptr [ecx]
:00492404 B201 mov dl, 01
:00492406 A178754800 mov eax, dword ptr [00487578]
:0049240B E874ACF9FF call 0042D084
这回再向上找跳转语句。。。。。有了：
:0049234F 7347 jnb 00492398
改了试试。。。。。没用。。。没关系，我们再向上走。。。。。
:00492335 0F8653010000 jbe 0049248E
改这个试试。。。。好了，没有时间提示了。
还没有完，软件还是老出注册提示，我们也来把它搞掉。
先想想，软件注册了就没有时间提示了，那是不是判断注册的语句在判断时间的语句之前呢？？
再向上，就是这里：
:004922FC 740D je 0049230B -------这个是第一个
:004922FE 80BBF805000000 cmp byte ptr [ebx+000005F8], 00
:00492305 0F8510020000 jne 0049251B -------这个是第二个，完全跳出注册的窗体。
改掉之后。。。。。。就是个没有麻烦的软件了。哈哈。。。。。（家里人喊到：大半夜的不睡觉笑什么 ！！！！！！！！）
我是在TRW2000下动态调试通过。

LL
China Cracking Group
2001.5.4


image optimizer v3.0

 标 题:image optimizer v3.0之暴力破解 (6千字)
发信人:KanKer
时 间:2000-10-12 11:59:59
详细信息:
image optimizer v3.0之暴力破解

软件下载：http://www.xxtt.freeserve.co.uk/xatio.exe
软件说明：该软件是一个图像批处理软件，可成批的压缩图像文件、转换格式，以及简单的编辑图像。
限制说明：日期限制，过期后功能限制和NAG限制。
工具：trw2K122,十六进制编辑软件随意。

解法一：
运行软件看关于，会发现“You are on day 1 of your 30 day evaluation”。据此
可以推断程序肯定是把日期写入一个地方，是什么呢？无非一个是KEYFILE，一个是注册表。先
看注册表吧（^-^，总是要从简单的入手嘛）。打开注册表，查找optimizer，你会在下面找到：
HKEY_CURRENT_USER\Software\xat.com\xat.com Image optimizer\Application
OK，把xat.com干掉，运行程序看看，又出现第一次运行的画面了，也就是说你又获得了30
天的试用时间。至此时间限制破掉，但这样每过30天便要删一次注册表，太烦了吧。那就来看第
二种解法吧。

解法二：
用trw2k122 load optimizer.exe,下断点getsystemtime，F5，中断后，pmodule,你
将来到：
* Reference To: KERNEL32.GetSystemTime, Ord:015Dh
|
:004A64A0 FF15FC214E00 Call dword ptr [004E21FC]
:004A64A6 668B45EA mov ax, word ptr [ebp-16] **中断于此**
:004A64AA 663B056AE95400 cmp ax, word ptr [0054E96A]
:004A64B1 753B jne 004A64EE
:004A64B3 668B45E8 mov ax, word ptr [ebp-18]
:004A64B7 663B0568E95400 cmp ax, word ptr [0054E968]
:004A64BE 752E jne 004A64EE
:004A64C0 668B45E6 mov ax, word ptr [ebp-1A]
:004A64C4 663B0566E95400 cmp ax, word ptr [0054E966]
:004A64CB 7521 jne 004A64EE
:004A64CD 668B45E2 mov ax, word ptr [ebp-1E]
:004A64D1 663B0562E95400 cmp ax, word ptr [0054E962]
:004A64D8 7514 jne 004A64EE
:004A64DA 668B45E0 mov ax, word ptr [ebp-20]
:004A64DE 663B0560E95400 cmp ax, word ptr [0054E960]
:004A64E5 7507 jne 004A64EE
:004A64E7 A158E95400 mov eax, dword ptr [0054E958]
:004A64EC EB45 jmp 004A6533

按F12两次，按F10，你将来到以下地方：
:0041A38E 6AFF push FFFFFFFF
:0041A390 E87B050000 call 0041A910
:0041A395 83C404 add esp, 00000004
:0041A398 8D54243C lea edx, dword ptr [esp+3C]
:0041A39C 8BCF mov ecx, edi
:0041A39E 50 push eax
:0041A39F 8D442420 lea eax, dword ptr [esp+20]
:0041A3A3 52 push edx
:0041A3A4 50 push eax
:0041A3A5 E85E960B00 call 004D3A08
:0041A3AA 50 push eax
:0041A3AB E860050000 call 0041A910
:0041A3B0 83C404 add esp, 00000004
:0041A3B3 8D8C2490010000 lea ecx, dword ptr [esp+00000190]
:0041A3BA 8BF0 mov esi, eax
:0041A3BC 51 push ecx
:0041A3BD E86BD50900 call 004B792D
:0041A3C2 8B10 mov edx, dword ptr [eax] **中断于此**
:0041A3C4 51 push ecx
:0041A3C5 8BC4 mov eax, esp
:0041A3C7 8954241C mov dword ptr [esp+1C], edx
:0041A3CB 89A42494010000 mov dword ptr [esp+00000194], esp
:0041A3D2 8D4C241C lea ecx, dword ptr [esp+1C]
:0041A3D6 8930 mov dword ptr [eax], esi
:0041A3D8 8D842494010000 lea eax, dword ptr [esp+00000194]
:0041A3DF 50 push eax
:0041A3E0 E8BB0A0000 call 0041AEA0
:0041A3E5 8B08 mov ecx, dword ptr [eax]
:0041A3E7 B807452EC2 mov eax, C22E4507
:0041A3EC F7E9 imul ecx
:0041A3EE 03D1 add edx, ecx
:0041A3F0 C1FA10 sar edx, 10
:0041A3F3 8BCA mov ecx, edx
:0041A3F5 C1E91F shr ecx, 1F
:0041A3F8 03D1 add edx, ecx
:0041A3FA 83FA1E cmp edx, 0000001E **此处EDX存放已过的天数，
将其与30比较**
:0041A3FD 891588B15200 mov dword ptr [0052B188], edx
:0041A403 7D0E jge 0041A413 **大于等于则跳到NAG屏，并禁用
部分功能**
:0041A405 3BD5 cmp edx, ebp
:0041A407 C70590B15200F35E43AB mov dword ptr [0052B190], AB435EF3
:0041A411 7D0A jge 0041A41D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A403(C)
|
:0041A413 C70590B15200C35A42A3 mov dword ptr [0052B190], A3425AC3

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041A289(U), :0041A33B(U), :0041A389(U), :0041A411(C)
|
:0041A41D 33C0 xor eax, eax

因该软件为可注册版本，所以推测一下，它是否判断为非注册版本后，方进行时间判断的呢？
下面进行验证一下。向上翻动CODE窗，找离41a3bd最近的一个跳跃点。
:0041A340 83EC08 sub esp, 00000008
:0041A343 8D84249C010000 lea eax, dword ptr [esp+0000019C]
:0041A34A 8BCC mov ecx, esp
:0041A34C 89642420 mov dword ptr [esp+20], esp
:0041A350 50 push eax
:0041A351 E82AE5FFFF call 00418880
:0041A356 8D8C2490010000 lea ecx, dword ptr [esp+00000190]
:0041A35D E8FEE3FFFF call 00418760
:0041A362 3BC5 cmp eax, ebp
:0041A364 7528 jne 0041A38E **程序从此处跳到判断日期代码
中，在此设断**
:0041A366 39AC24DC010000 cmp dword ptr [esp+000001DC], ebp
:0041A36D 7410 je 0041A37F
:0041A36F 55 push ebp
:0041A370 8D8C24E4000000 lea ecx, dword ptr [esp+000000E4]
:0041A377 6A30 push 00000030
:0041A379 51 push ecx
:0041A37A E874B60A00 call 004C59F3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A36D(C)
|
:0041A37F C70590B152006DE15404 mov dword ptr [0052B190], 0454E16D
:0041A389 E98F000000 jmp 0041A41D

可以发现程序是从0041A364跳过来的，设断后重新LOAD，中断后下指令：
r eip eip+2（我之所以不用r fl z指令，是为以后JMP做准备，若为判断标志寄存器的
话，就不能直接跳过了。）
F5
将发现程序正常运行，看关于，wosai！！！"This is the full registered
version of image optimizer."且输入注册码的菜单也没了^-^，由此可见0041A364是一个
判断是否注册的标志点。
抄下代码：
8D8C2490010000 E8FEE3FFFF 3BC5 7528
改为-> -------------- ---------- ---- eb--

后记：
大凡“有时间限制 && 可输入注册码”的软件，大体思路都是如此，下断getsystemtime
|| getlocaltime 找到判断时间的代码区，然后向上找进入此区域的跳跃点，大概便可找到关
键点。若"实在没有 || 找不到便JMP"，让其成为永不过期的试用版便是。

<Cracked by KanKer>

标 题:对不起大家，纠正一处错误：7528应改为9090 (887字)
发信人:KanKer
时 间:2000-10-12 13:19:20
详细信息:

下处有个错误，其实大家看我上面写的应该知道该怎么改了。

抄下代码：
8D8C2490010000 E8FEE3FFFF 3BC5 7528
改为->-------------- ---------- ---- 9090

这篇文章我写了一个上午，昏头了，导致如此低级的错误。Sorry,sorry.
话说现在看起来是那么的简单，但我昨晚却花了一晚上，连晚饭都没顾上吃*&^%$，为什么？走了很多弯路。
刚开始我先是过期拦NAG，结果在里面转了老长时间，NAG是过去了，可因为该软件还包含了个Professial demo，且集成在一起，结果在改后激活，当时还没意识到，以为还是功能限制便去激活菜单，恢复功能。。。，WASAI!!!直忙到晚上11点，草纸也有一堆了。实在是没精力了。还是走老路吧。下断getsystemtime，却没想到却是如此简单，当看了一下注册说明后。我才明白那个P是demo的，我&^%$#,我的时间呀，唉。
结论：在破解以前一定要先看看软件的注册或试用说明。这是我用生命总结出的教训。
希望能对您有所帮助.^-^

<Writed by KanKer>


JRun Studio 3.0

标 题:I've got it!有兴趣的看过来！ (3千字)
发信人:hurrah
时 间:2001-2-17 9:29:26
详细信息:
JRun Studio 3.0 是编辑、调试JSP程序的优秀软件，但有30天使用限期！
win98下很简单，但Win2000下我也想到了办法！哈哈。。。

------------NAG window和时间限制（脱壳）只能用于WIN98，在NT下见第二部分-----------
(1).用W32Dasm Load jrs3.exe死机！原来它用Aspack2.001加壳，但Unaspack
后不能用。只能手动去壳。

(2)Blast Wave 2000 v0.2 知入口为0077C2B0.
(3)用Trw2000 Load，
bpx 0077C2B0
0077C361 je ----- ;jump 下面出现Flash窗口
0077C380 je 0077C3D2 ;若在30天内，jump 跳0077C3D2处jrs3正常运行
0077C39E call --- ;否则弹出注册窗口,退出
0077C3D2 ----- ;jrs3运行

(4)再用Trw2000 Load，
bpx 0077C2B0
pedump d:\a.exe
makepe d:\b.exe ;无效！
suspend

(5)用ProcDump,Dump All >b.exe
PE Editor 观察a.exe 入口地址为0037C2B0
于是将b.exe入口地址改为0037C2B0

(6)用HView Search (3)的Decode码，将其改为jne ??? jne ???
也可以在（4）时修改内存后Dump All.
OK!

----------------------WIN2000下手动脱壳-----------------------

⑴ 用上述方法softice 4.05和prodump在WIN2000下
a
jmp eip
ProcDump:Dump All >b.exe 后不知如何改PE,Stop here.

㈡ 只能编写Patch程序,用HView反汇编原压缩程序jrstudio3.exe：
?009664ED: 89856F2E4400 mov [ebp][000442E6F],eax ;
?009664F3: 61 popad ;
* 009664F4: 75?? jne 0009664FE ;改为 jne 0009664F6
?009664F6: mov eax,?? ;改为 C60580C3770073 mov b,[00077C380],073
?009664FD: mov esp,?? ;改为 90 nop
?009664FE: 6800000000 push 00
00966503: C3 retn
上述为ASPACK在内存中解压缩的最后一段，
00966503： retn ;到jrs3.exe的程序入口0077C2B0
注意到009664F6-009664FE这一段没有用到（可用SI 下断点，不会中断），因此可用这个空间写Patch程序。
也可以用UltraEdit 看jrs3.exe程序开头有无可利用的空间，如ASPACK版本信息处写Patch程序。

㈢ 任务是:解压缩时,把
0077C380: 74??? je 0077C3D2 ;若在30天内，跳0077C3D2处jrs3正常运行
改为0077C380: 75??? jne 0077C3D2， ;若不在30天内，也跳0077C3D2处正常运行
因而在HVIEW改009664F6:mov byte [0077C380],75 ; (即在内存中把[0077C380]处je改为jne)
009664FD:nop
009664FE: ;以下不改动，进入jrs3.exe的程序入口
?00966503:
㈣ 在WIN2000下修改时间过期，运行修改过的jrstudio3.exe,OK！
出现FLASH窗口（...30 days period has expired!)后，可以正常运行了！！！哈哈！
再把时间改在期限内，运行修改过的jrstudio3.exe，出现Flash(You have 25 days left to run...)
下面却弹出注册窗口，点NO后程序退出！！！我倒！
仔细想想，原来在期限内
0077C380: jne 0077C3D2 ;No jump!在30天内，不跳到0077C3D2处正常运行

㈤ 曾设法改
0077C380: jmp 0077C3D2 ，但009664F6-009664FE这一段装不下jmp语句！
想了好多方法都不行，灵机一动，用SI 看0077C380:时FLAGS标志，Z标志确实随时间过期与否变，
但C 标志不变！都为 0，既只要改为：0077C380: 73??? jnc 0077C3D2
于是用HVIEW改
?009664F6: C60580C3770073 mov b,[00077C380],073 ;让它把内存0077C380处改为73?? jnc 0077C3D2
?009664FD: 90 nop
这下不管时间是否过期，在win98和win2000下都能用了！:-)

如有人要Patch 程序,mail to me!
hurrah@wx88.net
http://hurrah@go.163.com


Minicom 3.6

标 题:一个典型的时间限制软件的破解 (4千字)
发信人:uhlan
时 间:2001-1-29 8:21:30
详细信息:
明天就开学了，开学后就会忙得要命，再也没有时间来学习破解技术了。
所以这可能是我近期最后一篇文章了。

软件名：Minicom 3.6

软件简介：对于家里有两台电脑的朋友来说，这是个挺有用的软件。
它可以用来控制网络上另一台电脑的一切活动。包括运行软件，更
改系统配置，关机，等等。由于它有实时屏幕抓图的功能，所以一
切操作都象在自己这台电脑上进行一样。

下载地址：
http://dccnet.tucows.com/files2/mc30day.exe

所用的工具：
1.softICE 4.05.可在下列网址download
http://mud.sz.jsinfo.net/per/aaron/files/debuggers/win/si405w9x.zip

2.HIEW 6.01
下载地址： http://go2.163.com/%7Etoye/tools/hiew640reg.zip

破解思路：

本软件的破解思路和步骤完全来自看雪教材。如果你对这类软件
的破解原理还不了解，请看完这篇文章再看下去。
http://www.kanxue.com/lesson1404.htm

费话少说，让我们开始吧！

I. 找出对比关键。

1. 用 SoftICE 的 Symbol Loader 载入 mincom.exe

2. 被拦下来后，下 bpx getlocaltime

3. 按 F5, 然后，就会被 SoftICE 再次拦下来。

4. 下 wc 取消显示指令栏。

5. 然后就是狂按 F10 啦。一直到跳出SoftICE为止。

6. 回到 SoftICE 的 Symbol Loader ，选 File---> Save SoftICE History As...
吧刚才我们所看到的东西都保存为log1.txt。

7. 把系统时间调后三个月。

8. 再用 SoftICE 的 Symbol Loader 载入 mincom.exe.

9. 用前面相同的步骤取得另外一个文件，取名为 log2.txt.

10. 用写字板打开这两个文件。看从那里开始，这两个文件开始不同。

我把这两个文件的相同部分帖在下面了。

Break due to BPX KERNEL32!GetLocalTime (ET=98.36 milliseconds)
KERNEL32!GetLocalTime
0177:BFF77256 PUSH BFFA2168
0177:BFF7725B PUSH DWORD PTR FS:[EDX]
0177:BFF7725E MOV FS:[EDX],ESP
0177:BFF77261 MOV ECX,[ESP+0C]
0177:BFF77265 ADD BYTE PTR [ECX],00
0177:BFF77268 ADD BYTE PTR [ECX+0F],00
0177:BFF7726C POP DWORD PTR FS:[EDX]
0177:BFF7726F ADD ESP,04
0177:BFF77272 JMP BFF76A58 (JUMP )
0177:BFF76A58 PUSH EBP
0177:BFF76A59 MOV EBP,ESP
0177:BFF76A5B PUSH EDI
0177:BFF76A5C PUSH EBX
0177:BFF76A5D PUSH DWORD PTR [BFFCAE10]
0177:BFF76A63 CALL KERNEL32!ORD_0061
0177:BFF76A68 MOV EDI,[EBP+08]
0177:BFF76A6B MOV ECX,00000004
0177:BFF76A70 SUB EAX,EAX
0177:BFF76A72 REPZ STOSD
0177:BFF76A74 MOV EDI,[EBP+08]
0177:BFF76A77 MOV AH,2A
0177:BFF76A79 CALL BFF712B9
0177:BFF76A7E MOV [EDI+02],DH
0177:BFF76A81 MOV [EDI+06],DL
0177:BFF76A84 MOV [EDI],CX
0177:BFF76A87 SUB AH,AH
0177:BFF76A89 MOV [EDI+04],AX
0177:BFF76A8D MOV AH,2C
0177:BFF76A8F CALL BFF712B9
0177:BFF76A94 MOV [EDI+08],CH
0177:BFF76A97 MOV [EDI+0A],CL
0177:BFF76A9A MOV [EDI+0C],DH
0177:BFF76A9D SUB DH,DH
0177:BFF76A9F IMUL DX,DX,0A
0177:BFF76AA3 MOV [EDI+0E],DX
0177:BFF76AA7 PUSH DWORD PTR [BFFCAE10]
0177:BFF76AAD CALL KERNEL32!ORD_0062
0177:BFF76AB2 POP EBX
0177:BFF76AB3 POP EDI
0177:BFF76AB4 LEAVE
0177:BFF76AB5 RET 0004
0177:00401FF1 MOV ECX,[EBP+08]
0177:00401FF4 MOV DL,[EBP-0A]
0177:00401FF7 MOV [ECX],DL
0177:00401FF9 MOV EAX,[EBP+08]
0177:00401FFC MOV CL,[EBP-0E]
0177:00401FFF MOV [EAX+01],CL
0177:00402002 MOV EDX,[EBP+08]
0177:00402005 MOV DWORD PTR [EDX+04],00000000
0177:0040200C MOV EAX,[EBP-10]
0177:0040200F AND EAX,0000FFFF
0177:00402014 MOV ECX,[EBP+08]
0177:00402017 MOV [ECX+04],EAX
0177:0040201A MOV ESP,EBP
0177:0040201C POP EBP
0177:0040201D RET 0004
0177:00402B31 MOV ECX,[EBP-04]
0177:00402B34 PUSH ECX
0177:00402B35 MOV EDX,[EBP-08]
0177:00402B38 PUSH EDX
0177:00402B39 MOV ECX,[EBP-0C]
0177:00402B3C CALL 00402A66
0177:00402B41 MOV ESP,EBP
0177:00402B43 POP EBP
0177:00402B44 RET
0177:004322B1 MOV [EBP-18],EAX ---> 提取今天日期
0177:004322B4 MOV EAX,[EBP-0128] ---> 提取安装日期
0177:004322BA ADD EAX,1E ---> 安装日期加30
0177:004322BD CMP [EBP-18],EAX ---> 比较，看过期没有。
0177:004322C0 JA 004322D1 ---> 大于则跳。跳则过期。

从这两个文件我们可以发现从
0177:004322C0 JA 004322D1
处，两个文件的流程开始不同。所以，这个jump 就是对比的关键。

II. 修改文件。

11. 用 Hiew 载入 minicom.exe

12. 按 F4 选择 Decode

13. 按 F5 , 输入偏址： 000322C0 然后回车。

14. 按 F3, 将 77 改为 74.

15. 修改好后，F9存盘（按回车后到下一行，再按ESC让对话框消失，然后按F9）。

感谢看雪大哥给我的提示，使我的 bpx getsystemtime 能拦截。:)


NoteTab Pro Trial 4.83

 标 题:破除NoteTab Pro Trial 4.83的时间限制
发信人:chn-boy
时 间:2000-11-13 4:02:10
详细信息:
整段程序中有两部分判断时间限制的地方..

1) 一开始运行的地方: 这个用softICE的symbol loader装载后, 几下
F10就可以看到效果了...

改: 75 1A E8 97 72 FC FF 84 C0 74 11 A1
^^
EB

( 哈, 总算启动了..大功告成....心里哪个美啊! )

( 可是, 但可是...可但是呢.................. )

2) 继续吧, 上面改完的 NoteTab Pro Trial 用不了程序中的功能...

又是可爱的NAG窗口出来了~!@#$%^&*( 这是我的最爱,不过也是我最
讨厌的, 好矛盾 ). :(((((((((

CTRL + D 进 SoftICE
hwnd notetab, 找到对话框的Hwnd(xxx), 然后...
bmsg xxx wm_destroy;X; 回车
在Windows下点击哪个最最频繁、最最普通的“确定”
拦断, F12吧, 没有TRW2000里的 pmodule (嘿嘿, 什么时候
我们的softICE老大把这个命令加上去啊???)..一级一级往上
找, 在可疑处下断点[F9], 剩下的不说啦!(自己保留? 有什么
好保留的嘛? 这么简单容易的东西.. 呵呵)

改: 7F 14 83 3D E0 1C 55 00 00
^^ ^^
EB 18

好了, 说完了 ..... 总算写了一点破解方面的东西...
( 谁在笑? 不要笑啦,... 我是新手, 还没入门啦. 给留点面子嘛..
还笑??? 我要扔臭鸡蛋啦..... 话还没落音.... 只见一堆臭烘烘
东西砸了过来... 快跑啊... 哈哈哈哈哈哈哈哈哈哈哈 )


Paragon CD Emulator1.02.007

标 题:暴力破解Paragon CD Emulator时间及功能限制 (7千字)
发信人:henryw
时 间:2001-3-24 11:51:44
详细信息:
暴力破解Paragon CD Emulator时间及功能限制

[下载]
已经很长时间了，估计应该在www.inhua.com下载，手里的版本为1.02.007

[破解工具]
WDasm
IDA Pro
Trw2000
Regmonitor
Filemonitor

[破解过程]

通过使用软件来收集信息发现：

1. 软件启动的时候会跳出对话框，提示还有多少天的使用期。
2. 超过30天的试用期会提示过期了。程序调用一些功能时候也显示过期了，拒绝调用。
3. Regmonitor发现程序找不到user和registration两个注册表的值。
4. Add Image功能因为是Trial Version受到限制。

现在就可以开始动手术了。

使用WDasm和IDA Pro进行反汇编，查看区别。

首先，cdman.exe经过反汇编，在WDasm的Import里面，看到了对cdshell的函数的调用。看来程序还有一个cdshell.dll，
所以除了反汇编cdman.exe以外，还需要反汇编cdshell.dll。

浪费了许多时间后发现，程序的Trial Version和Full Version的版本号是不同的，因此似乎无法打开注册对话框来输入
注册码，虽然使用ResHack可以看见注册对话框。所以无法对上述3的信息进行进一步操作。

IDA里面甚至看到了license的文件名，cde.lic。不过，这个东东是为网络版应用的，个人版看来只需破解时间限制即可。

由于所有的提示信息都可以在cdshell.dll的反汇编文件中找到，所以，它成了主要目标。

既然是时间限制，很容易想到GetSystemTimeA；自从IDA配备了三个查找Import,Export以及String Reference的plugin
以后，查找的事情变得很简单了。经过考虑，加上trw2000在这里的跟踪，注意力集中到了下面地方：
.........
.........
:1001C3C9 6800AB0410 push 1004AB00 <-------- IDA里告诉我们，这里是放入FlagEx
:1001C3CE 68B8A90410 push 1004A9B8 <-------- 这里是注册表的路径
:1001C3D3 E868160000 call 1001DA40
.........
.........
:1001C41A E811170000 call 1001DB30
:1001C41F 3BC3 cmp eax, ebx
:1001C421 7456 je 1001C479 <-------- 这里不能跳，否则过期了。
:1001C423 8B54240C mov edx, dword ptr [esp+0C]
:1001C427 51 push ecx
:1001C428 8BC4 mov eax, esp
:1001C42A 895E20 mov dword ptr [esi+20], ebx
:1001C42D 8D4C241C lea ecx, dword ptr [esp+1C]

* Possible Reference to String Resource ID=00001: "Create CD Image File"
|
:1001C431 BB01000000 mov ebx, 00000001
:1001C436 8910 mov dword ptr [eax], edx
:1001C438 8D442414 lea eax, dword ptr [esp+14]
:1001C43C 50 push eax
:1001C43D E8BE160000 call 1001DB00
:1001C442 8B08 mov ecx, dword ptr [eax]
:1001C444 B807452EC2 mov eax, C22E4507
:1001C449 F7E9 imul ecx
:1001C44B 03D1 add edx, ecx
:1001C44D 8BC3 mov eax, ebx
:1001C44F C1FA10 sar edx, 10
:1001C452 8BCA mov ecx, edx
:1001C454 C1E91F shr ecx, 1F
:1001C457 03D1 add edx, ecx <-------- edx显示还有多少天。
:1001C459 895624 mov dword ptr [esi+24], edx <------- 这里修改edx为1D（29天），程序会认为仍在使用期内
:1001C45C 5F pop edi
:1001C45D 5E pop esi
:1001C45E 5B pop ebx
:1001C45F 83C408 add esp, 00000008
:1001C462 C3 ret

经过以上修改，发现程序没有进行其他的过期检测。第一步成功。

第二步来解它的NagScreen，就是提醒还有多少天的对话框。依旧在cdshell.dll里面：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006EFD(C)
|
:10006F08 8B442430 mov eax, dword ptr [esp+30]
:10006F0C 85C0 test eax, eax
:10006F0E 0F84B6000000 je 10006FCA <---------- 跳去显示NagScreen，因为下面可见“cdshell.cdMessageBox”
:10006F14 8D4C2408 lea ecx, dword ptr [esp+08]
:10006F18 E8EB2B0300 call 10039B08
:10006F1D 8D4C2404 lea ecx, dword ptr [esp+04]
:10006F21 C744244000000000 mov [esp+40], 00000000
:10006F29 E8DA2B0300 call 10039B08
..............
..............
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006F0E(C)
|

* Possible Reference to String Resource ID=00048: "%s/s; %.3f kHz; %i Bits; %s"
|
:10006FCA 6A30 push 00000030

* Possible Reference to String Resource ID=00062: "You work with the trial version of the program.
This version"
|
:10006FCC 6A3E push 0000003E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006F03(U)
|

* Possible Reference to String Resource ID=00140: "Paragon CD Emulator Manager"
|
:10006FCE 688C000000 push 0000008C
* Reference To: cdshell.cdMessageBox
|
:10006FD3 E888FEFFFF call 10006E60
:10006FD8 83C40C add esp, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006EF1(C)
|
:10006FDB 8B4C2438 mov ecx, dword ptr [esp+38]
:10006FDF 8BC6 mov eax, esi
:10006FE1 64890D00000000 mov dword ptr fs:[00000000], ecx
:10006FE8 5E pop esi
:10006FE9 83C440 add esp, 00000040
:10006FEC C3 ret

所以干脆让10006F0E跳到10006EF1来，结果，程序启动时候以及以后的NagScreen都不见了。

＝＝＝＝＝＝＝此为 cdshell.dll反汇编的东东＝＝＝＝＝＝＝＝＝＝
Exported fn(): cdTrialInfo - Ord:0027h
:10007750 6A43 push 00000043

* Possible Reference to String Resource ID=00070: "

This function is unavailable in the trial version.
You can"
|
:10007752 6A46 push 00000046
* Reference To: cdshell.cdRestrictionInfo
|
:10007754 E8D7FDFFFF call 10007530
:10007759 83C408 add esp, 00000008
:1000775C C3 ret
＝＝＝＝＝＝＝此为 cdman.exe反汇编的东东＝＝＝＝＝＝＝＝＝＝
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040A00F(C), :0040A018(C)
|
:0040A028 E8B39AFFFF call 00403AE0
:0040A02D 85C0 test eax, eax
:0040A02F 741F je 0040A050 <-------------- 需要跳转。
:0040A031 8B8500010000 mov eax, dword ptr [ebp+00000100]
:0040A037 85C0 test eax, eax
:0040A039 7515 jne 0040A050
:0040A03B 8B8504010000 mov eax, dword ptr [ebp+00000104]
:0040A041 85C0 test eax, eax
:0040A043 750B jne 0040A050

* Reference To: cdshell.cdTrialInfo, Ord:0026h <-------------- 要跳过这里
|
:0040A045 FF15D4CE4500 Call dword ptr [0045CED4]
:0040A04B E9C9040000 jmp 0040A519

总结一下需要修改的地方：
[cdshell.dll]
1. 1001C421 7456 ---> 9090

2. 1001C457 03D1 add edx, ecx <---- 改成mov byte ptr [esi+24], 1D，由于
1001C459 895624 mov dword ptr [esi+24], edx <---- 原来6个字节，改后成5个，要添一个90

3. 10006F0E 0F84B6000000 je 10006FCA ---> jmp 10006EF1

[cdman.exe]
1. 0040A02F 741F je 0040A050 ---> jmp 0040A050

于是，破解完成了。:)

不过，希望有高手能讲解一下它的时间是如何运算的。


PECompact1.48

 标 题:交作业了!!!!!!PECompact1.48破解过程 (6千字)
发信人:conanxu[BCG]
时 间:2001-6-26 20:48:36
详细信息:
pecompact1.48破解过程
用trw2000载入下bpx 41a000后用suspend打开peditor---tasks---dump(full)
再把入口点改为41a000,脱壳完成
用W32Dasm打开pecompact.exe
* Possible StringData Ref from Code Obj ->"About PECompact"
|
:00404DA7 688ACA4000 push 0040CA8A
:00404DAC FF7508 push [ebp+08]
:00404DAF E852500000 call 00409E06
:00404DB4 A1F0E14000 mov eax, dword ptr [0040E1F0]
:00404DB9 83F800 cmp eax, 00000000
:00404DBC 7F23 jg 00404DE1------>>改为jmp 00404DE1

* Possible StringData Ref from Code Obj ->"YOUR TRIAL PERIOD HAS ENDED!"
|
:00404DBE 68E4EF4000 push 0040EFE4
:00404DC3 6870040000 push 00000470
:00404DC8 FF7508 push [ebp+08]
:00404DCB E848500000 call 00409E18

* Possible StringData Ref from Code Obj ->"Exit"
|
:00404DD0 6801F04000 push 0040F001
:00404DD5 6A01 push 00000001
:00404DD7 FF7508 push [ebp+08]
:00404DDA E839500000 call 00409E18
:00404DDF EB25 jmp 00404E06

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404DBC(C)
|
:00404DE1 50 push eax

* Possible StringData Ref from Code Obj ->"You have %d days remaining of "
->"your trial."
|
:00404DE2 68BAEF4000 push 0040EFBA
:00404DE7 6856EF4000 push 0040EF56
:00404DEC E863500000 call 00409E54
:00404DF1 83C40C add esp, 0000000C
:00404DF4 6856EF4000 push 0040EF56
:00404DF9 6870040000 push 00000470
:00404DFE FF7508 push [ebp+08]
:00404E01 E812500000 call 00409E18

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404DDF(U)
|

* Possible StringData Ref from Code Obj ->"
Licensed for 14-day evaluation. "
->"Registration is required for continued "
->"use."
|
:00404E06 6839DA4000 push 0040DA39
:00404E0B 680C040000 push 0000040C
:00404E10 FF7508 push [ebp+08]
:00404E13 E800500000 call 00409E18

* Possible StringData Ref from Code Obj ->"PECompact v1.48, ?999-2001 by "
->"Jeremy Collake"
|
:00404E18 680BDA4000 push 0040DA0B
:00404E1D 6853040000 push 00000453
:00404E22 FF7508 push [ebp+08]
:00404E25 E8EE4F0000 call 00409E18

* Possible StringData Ref from Code Obj ->"Unregistered!"
|
:00404E2A 689ACA4000 push 0040CA9A
:00404E2F 6834040000 push 00000434
:00404E34 FF7508 push [ebp+08]
:00404E37 E8DC4F0000 call 00409E18
:00404E3C 33C0 xor eax, eax
:00404E3E 5E pop esi
:00404E3F 5F pop edi
:00404E40 5B pop ebx
:00404E41 C9 leave
:00404E42 C21000 ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404D6F(C)
|
:00404E45 837D0C10 cmp dword ptr [ebp+0C], 00000010
:00404E49 7443 je 00404E8E
:00404E4B 817D0C11010000 cmp dword ptr [ebp+0C], 00000111
:00404E52 7531 jne 00404E85
:00404E54 837D1001 cmp dword ptr [ebp+10], 00000001
:00404E58 7434 je 00404E8E
:00404E5A 817D1010040000 cmp dword ptr [ebp+10], 00000410
:00404E61 7522 jne 00404E85
:00404E63 6A00 push 00000000
:00404E65 6A00 push 00000000
:00404E67 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"http://www.collakesoftware.com"
|
:00404E69 68A7D84000 push 0040D8A7
:00404E6E 6A00 push 00000000
:00404E70 FF3563E14000 push dword ptr [0040E163]
:00404E76 E863500000 call 00409EDE
:00404E7B 33C0 xor eax, eax
:00404E7D 40 inc eax
:00404E7E 5E pop esi
:00404E7F 5F pop edi
:00404E80 5B pop ebx
:00404E81 C9 leave
:00404E82 C21000 ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404E52(C), :00404E61(C)
|
:00404E85 33C0 xor eax, eax
:00404E87 5E pop esi
:00404E88 5F pop edi
:00404E89 5B pop ebx
:00404E8A C9 leave
:00404E8B C21000 ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404E49(C), :00404E58(C)
|
:00404E8E 833DF0E1400000 cmp dword ptr [0040E1F0], 00000000
:00404E95 7F07 jg 00404E9E------>>改为jmp 00404E9E
:00404E97 6A00 push 00000000
:00404E99 E8544E0000 call 00409CF2

时间破解完成,但在压缩时会跳出About窗口,干掉他!!!!

* Possible Ref to Menu: MenuID_0066, Item: "About"
|
:00401093 68429C0000 push 00009C42
:00401098 FF3563E14000 push dword ptr [0040E163]
:0040109E E8E2520000 call 00406385------>>改为5个nop
:004010A3 E87D160000 call 00402725
:004010A8 6A42 push 00000042
:004010AA E8B7160000 call 00402766
:004010AF 6838DC4000 push 0040DC38
:004010B4 E82A1E0000 call 00402EE3
:004010B9 C7055CF54000A6F04000 mov dword ptr [0040F55C], 0040F0A6
:004010C3 6896DA4000 push 0040DA96
:004010C8 FF355CF54000 push dword ptr [0040F55C]
:004010CE E8F8530000 call 004064CB
:004010D3 A3F9F54000 mov dword ptr [0040F5F9], eax
:004010D8 6A00 push 00000000
:004010DA 684F040000 push 0000044F
:004010DF FF3563E14000 push dword ptr [0040E163]
:004010E5 E82E8D0000 call 00409E18

破解到此完成!!!!
交作业了!!!!!
conanxu[BCG]
conanxu@eastday.com


pecompact1.50

 标 题:pecompact1.50破解过程 （加入BCG的第一篇） (8千字)
发信人:大老
时 间:2001-6-28 16:10:08
详细信息:
pecompact1.50破解过程 （加入BCG的第一篇）

工具：TRW2000 W32DASM大老专版
破解人：大老
软件下载：www.exetools
第一步：先脱壳！
用trw2000载入下PNEWSEC后用PEDUMP 生成DUMP1.EXE用peditor--REBUILDER--文件
脱壳完成
第二部：破解天数限制！
用W32Dasm打开pecompact.exe
:00404D61 C8000000 enter 0000, 00
:00404D65 53 push ebx
:00404D66 57 push edi
:00404D67 56 push esi
:00404D68 817D0C10010000 cmp dword ptr [ebp+0C], 00000110
:00404D6F 0F8533010000 jne 00404EA8
:00404D75 6880000000 push 00000080
:00404D7A FF3560E14000 push dword ptr [0040E160]
:00404D80 E825510000 call 00409EAA
:00404D85 50 push eax
:00404D86 50 push eax
:00404D87 6A00 push 00000000
:00404D89 6880000000 push 00000080
:00404D8E FF7508 push [ebp+08]
:00404D91 E8EA500000 call 00409E80
:00404D96 58 pop eax
:00404D97 50 push eax
:00404D98 6A01 push 00000001
:00404D9A 6880000000 push 00000080
:00404D9F FF7508 push [ebp+08]
:00404DA2 E8D9500000 call 00409E80

* Possible StringData Ref from Code Obj ->"About PECompact"
|
:00404DA7 688ACA4000 push 0040CA8A
:00404DAC FF7508 push [ebp+08]
:00404DAF E8AE500000 call 00409E62
:00404DB4 6819F84000 push 0040F819
:00404DB9 E8B64E0000 call 00409C74
:00404DBE A119F84000 mov eax, dword ptr [0040F819]
:00404DC3 8B0D1DF84000 mov ecx, dword ptr [0040F81D]
:00404DC9 51 push ecx
:00404DCA 50 push eax

* Possible StringData Ref from Code Obj ->"JCALG1 version: %d.%d"
|
:00404DCB 68EAF74000 push 0040F7EA
:00404DD0 686AF74000 push 0040F76A
:00404DD5 E8D6500000 call 00409EB0
:00404DDA 83C410 add esp, 00000010
:00404DDD 686AF74000 push 0040F76A
:00404DE2 6872040000 push 00000472
:00404DE7 FF7508 push [ebp+08]
:00404DEA E885500000 call 00409E74
:00404DEF 6A32 push 00000032
:00404DF1 6A01 push 00000001

* Possible StringData Ref from Code Obj ->"PECompact version: %d.%d"
|
:00404DF3 6800F84000 push 0040F800
:00404DF8 686AF74000 push 0040F76A
:00404DFD E8AE500000 call 00409EB0
:00404E02 83C410 add esp, 00000010
:00404E05 686AF74000 push 0040F76A
:00404E0A 6873040000 push 00000473
:00404E0F FF7508 push [ebp+08]
:00404E12 E85D500000 call 00409E74
:00404E17 A1F1E14000 mov eax, dword ptr [0040E1F1]=》这个地址[可疑]
:00404E1C 83F800 cmp eax, 00000000 ====>注意如果EAX=0试用结束
:00404E1F 7F23 jg 00404E44 ===〉一般改法改成JMP即可！

* Possible StringData Ref from Code Obj ->"YOUR TRIAL PERIOD HAS ENDED!"
|
:00404E21 68E5EF4000 push 0040EFE5
:00404E26 6870040000 push 00000470
:00404E2B FF7508 push [ebp+08]
:00404E2E E841500000 call 00409E74

* Possible StringData Ref from Code Obj ->"Exit"
|
:00404E33 6802F04000 push 0040F002
:00404E38 6A01 push 00000001
:00404E3A FF7508 push [ebp+08]
:00404E3D E832500000 call 00409E74
:00404E42 EB25 jmp 00404E69
:00404E44 50 push eax

* Possible StringData Ref from Code Obj ->"You have %d days remaining of "
->"your trial."
|
:00404E45 68BBEF4000 push 0040EFBB
:00404E4A 6857EF4000 push 0040EF57
:00404E4F E85C500000 call 00409EB0
:00404E54 83C40C add esp, 0000000C
:00404E57 6857EF4000 push 0040EF57
:00404E5C 6870040000 push 00000470
:00404E61 FF7508 push [ebp+08]
:00404E64 E80B500000 call 00409E74

* Possible StringData Ref from Code Obj ->"
Licensed for 14-day evaluation. "
->"Registration is required for continued "
->"use."
|
:00404E69 6839DA4000 push 0040DA39
:00404E6E 680C040000 push 0000040C
:00404E73 FF7508 push [ebp+08]
:00404E76 E8F94F0000 call 00409E74

* Possible StringData Ref from Code Obj ->"PECompact v1.50, ?999-2001 by "
->"Jeremy Collake"
|
:00404E7B 680BDA4000 push 0040DA0B
:00404E80 6853040000 push 00000453
:00404E85 FF7508 push [ebp+08]
:00404E88 E8E74F0000 call 00409E74

* Possible StringData Ref from Code Obj ->"Unregistered!"
|
:00404E8D 689ACA4000 push 0040CA9A
:00404E92 6834040000 push 00000434
:00404E97 FF7508 push [ebp+08]
:00404E9A E8D54F0000 call 00409E74
:00404E9F 33C0 xor eax, eax
:00404EA1 5E pop esi
:00404EA2 5F pop edi
:00404EA3 5B pop ebx
:00404EA4 C9 leave
:00404EA5 C21000 ret 0010

:00404EA8 837D0C10 cmp dword ptr [ebp+0C], 00000010
:00404EAC 7443 je 00404EF1
:00404EAE 817D0C11010000 cmp dword ptr [ebp+0C], 00000111
:00404EB5 7531 jne 00404EE8
:00404EB7 837D1001 cmp dword ptr [ebp+10], 00000001
:00404EBB 7434 je 00404EF1
:00404EBD 817D1010040000 cmp dword ptr [ebp+10], 00000410
:00404EC4 7522 jne 00404EE8
:00404EC6 6A00 push 00000000
:00404EC8 6A00 push 00000000
:00404ECA 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"http://www.collakesoftware.com"
|
:00404ECC 68A7D84000 push 0040D8A7
:00404ED1 6A00 push 00000000
:00404ED3 FF3564E14000 push dword ptr [0040E164]
:00404ED9 E85C500000 call 00409F3A
:00404EDE 33C0 xor eax, eax
:00404EE0 40 inc eax
:00404EE1 5E pop esi
:00404EE2 5F pop edi
:00404EE3 5B pop ebx
:00404EE4 C9 leave
:00404EE5 C21000 ret 0010
============================================================================
大家看到了！注意[0040E1F1]这个内存地址！咱们要做的就是找出往这个地址写天数的
那部分程序！OK!GOGO
:00404E17 mov eax, dword ptr [0040E1F1]=》还可使用的天数！
:00404E1C cmp eax, 00000000 ====>注意如果EAX=0试用结束
下断点！BPX 40E1F1 W 重新启动程序！
=============================================================================
拦截后！的关键核心部分！
:00404FCF 2BD0 sub edx, eax
:00404FD1 8B4B04 mov ecx, dword ptr [ebx+04]
:00404FD4 81F9000B0000 cmp ecx, 00000B00
:00404FDA 720A jb 00404FE6
:00404FDC 771F ja 00404FFD
:00404FDE 81FA0080C851 cmp edx, 51C88000
:00404FE4 7317 jnb 00404FFD
:00404FE6 33D2 xor edx, edx
:00404FE8 8BC1 mov eax, ecx
:00404FEA B98C000000 mov ecx, 0000008C
:00404FEF F7F1 div ecx
:00404FF1 8BC8 mov ecx, eax 以用天数
:00404FF3 B80E000000 mov eax, 0000000E 试用14天！
:00404FF8 2BC1 sub eax, ecx 还能用几天！
:00404FFA 8945F0 mov dword ptr [ebp-10], eax
:00404FFD 8B45F0 mov eax, dword ptr [ebp-10]
:00405000 C9 leave
:00405001 C3 ret
===============================================================
关键核心部分找到了改的话就好改了嘿嘿！
把这句的:00404FF8 2BC1 sub eax, ecx
(2BC1改成C390)
天数限制修改完成！

大老2001-6-28 14:42完成


PixWizard ver 1.24

 标 题:PixWizard ver 1.24破解方法，这个版本可能比较老了，但是值得大家研究啊！不信
发信人:程式猎人
时 间:2000-11-27 20:26:13
详细信息:
PixWizard ver 1.24
程式猎人
简介：支持相当多图形文件格式及容易使用的秀图软件，除了秀图外，还可做影像处
理，转换，屏幕撷取等，支持OS/2的BMP，Windows的BMP，EMF，GIF，IFF，
JPEG，MAC，MSP，PCD，PCX，PIC，PICT，PNG，PPM，Targa，TIFF，WMF，WPG等
格式的秀图和图形文件转换。
追踪：这个软件是time bomb类型的软件，所以将它的时间限制删除就可以了。
使用W32来反汇编这个软件后查找字符串，如下：
|:004074C3(C)
|

* Possible StringData Ref from Data Obj ->"days"
|
:004074CC 68F8E54700 push 0047E5F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074CA(U)
|
:004074D1 8D4C2414 lea ecx, dword ptr [esp+14]

* Reference To: MFC42.Ordinal:03AD, Ord:03ADh
|
:004074D5 E8E0390200 Call 0042AEBA

* Possible StringData Ref from Data Obj ->" left in your evaluation period."
|
:004074DA 68D4E54700 push 0047E5D4
:004074DF 8D4C2414 lea ecx, dword ptr [esp+14]

* Reference To: MFC42.Ordinal:03AD, Ord:03ADh
|
:004074E3 E8D2390200 Call 0042AEBA
:004074E8 EB0E jmp 004074F8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407484(C), :00407489(C)
|

* Possible StringData Ref from Data Obj ->"Your evaluation period has expired."
|
:004074EA 68B0E54700 push 0047E5B0
:004074EF 8D4C2414 lea ecx, dword ptr [esp+14]

* Reference To: MFC42.Ordinal:035C, Ord:035Ch
|
:004074F3 E8DA390200 Call 0042AED2
在这上面可以看到程序在试用期内和过期的字符串，所以向上查找从何处跳跃到这里来的。
* Reference To: MFC42.Ordinal:0B02, Ord:0B02h
|
:00407474 E8353A0200 Call 0042AEAE
:00407479 8B86FC000000 mov eax, dword ptr [esi+000000FC]
:0040747F 83C40C add esp, 0000000C
:00407482 3BC5 cmp eax, ebp
:00407484 7E64 jle 004074EA
:00407486 83F81E cmp eax, 0000001E
:00407489 7F5F jg 004074EA
从这里跳跃向上面的地方，现在知道了，只要将这里修改一下就可以破解这个软件的时间炸弹了。
现在大家同一样认为这样做破解就算完成了，可是如果你按照上面去做的话，会得到什么的结果呢？我修改完后再运行程序，程序就无论如何也不再出现窗口了。
我想程序很有可能是有CRC验证过程，我们再追踪，看一看程序到底是在哪里使用了CRC验证过程。
:0041F32C E8E5C50000 Call 0042B916
:0041F331 8D9424B4010000 lea edx, dword ptr [esp+000001B4]
:0041F338 6804010000 push 00000104
:0041F33D 52 push edx
:0041F33E 8D8C24BC010000 lea ecx, dword ptr [esp+000001BC]
:0041F345 E8360A0000 call 0041FD80
:0041F34A 3B442418 cmp eax, dword ptr [esp+18]
:0041F34E 743A je 0041F38A
:0041F350 8D8C249C000000 lea ecx, dword ptr [esp+0000009C]
:0041F357 C684246408000004 mov byte ptr [esp+00000864], 04
:0041F35F E8AB540200 call 0044480F
:0041F364 8D8C248C000000 lea ecx, dword ptr [esp+0000008C]
:0041F36B 889C2464080000 mov byte ptr [esp+00000864], bl

* Reference To: MFC42.Ordinal:0299, Ord:0299h
|
:0041F372 E899C50000 Call 0042B910
:0041F377 8D4C2410 lea ecx, dword ptr [esp+10]
:0041F37B C684246408000001 mov byte ptr [esp+00000864], 01

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:0041F383 E81ABB0000 Call 0042AEA2
:0041F388 EB40 jmp 0041F3CA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041F34E(C)
|

* Possible StringData Ref from Data Obj ->"Shareware Version"
|
:0041F38A 68308B4A00 push 004A8B30
:0041F38F 8D8C24B8010000 lea ecx, dword ptr [esp+000001B8]
:0041F396 E825EFFFFF call 0041E2C0
:0041F39B 8BF0 mov esi, eax
:0041F39D 889C2464080000 mov byte ptr [esp+00000864], bl
:0041F3A4 85F6 test esi, esi
:0041F3A6 8D8C248C000000 lea ecx, dword ptr [esp+0000008C]
:0041F3AD 7423 je 0041F3D2
:0041F3AF E87C090000 call 0041FD30
:0041F3B4 8D4C2410 lea ecx, dword ptr [esp+10]
:0041F3B8 C684246408000001 mov byte ptr [esp+00000864], 01

* Reference To: MFC42.Ordinal:0320, Ord:0320h
|
:0041F3C0 E8DDBA0000 Call 0042AEA2
:0041F3C5 83FE01 cmp esi, 00000001
:0041F3C8 741E je 0041F3E8
经过追踪，发现在上面的比较地方是关键的跳跃，这里如果改掉后，就可以运行了。
现在将时间调后一年，再运行程序，大家想一想如何，程序出现程序窗口，也出现了提示窗口，但是就是当你点击contune后，程序自动退出，所以说这个程序还有验证地方，没有办法，再追踪。在比较时间的地方向下追踪，因为程序在哪里可以被拦下来，所以就向下追踪：
:00407547 50 push eax
:00407548 8D4C2458 lea ecx, dword ptr [esp+58]
:0040754C FF5264 call [edx+64]
:0040754F 8B86FC000000 mov eax, dword ptr [esi+000000FC]
:00407555 3BC5 cmp eax, ebp
:00407557 7E0F jle 00407568
:00407559 83F81E cmp eax, 0000001E
:0040755C 7F0A jg 00407568
:0040755E C7860C01000001000000 mov dword ptr [esi+0000010C], 00000001
来到这里，大家发现吧，程序在这里又是一个验证时间的地方，不用多说，改掉它，这回程序再运行，可以了，在提示窗口中提示你已经是-345天了。
现在可以说这个软件是破解成功了。


Private Pictures 2.

 标 题:好久没在这里发贴了，再来一篇《暴破 Private Pictures 2.0 之时间限制及过期提示框》 (1千字)
发信人:paulyoung
时 间:2001-7-1 22:46:19
详细信息:

暴破 Private Pictures 2.0 之时间限制及过期提示框

作 者：PaulYoung
破解时间：2001.06.30
软件简介：图像加密工具。可以用密码保护你的图像文件，例如保护你的个人图片收集。可以使用程序自带的图片浏览器查看受密码保护的图像，而无需运行其他的图象浏览器；还可以将受保护的文件转换为其他的图象格式。图象加密支持JPG, PNG, BMP, GIF, TGA, TIFF, PCX 和保护 PPC文件。该软件是共享软件，当前版本提供30天的试用期。过期后完全不能使用，只有注册提示框，要网上注册。
URL:ftp://ftp02.softhouse.com.cn/download1/14700ppt2.zip
破解工具：FileInfo,ProcDump 1.5,Hiew,W32DASM,SOFT-ICE

************************************************************************************************

1、用FI侦察，得知其用Petite 1.3加的壳，可用ProcDump 1.5脱壳（1.62反倒不支持了）。
2、Ctrl+D 激活SOFT-ICE，下　bpx getsystemtime （因为该软件通过读取系统时间来判断是否过期的）
3、运行Private Pictures，中断后下 bd * 中断所有断点，按　F12　6下出现注册提示框，be 重来，按5下，F10　单步跟踪，直到……

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00426A15(C)
|
:00426A63 8D8C24C4010000 lea ecx, dword ptr [esp+000001C4]
:00426A6A E8991B0800 call 004A8608 //弹出注册提示框，9090909090 NOP 掉它
:00426A6F 83BC24F40400001E cmp dword ptr [esp+000004F4], 0000001E //比较是否大于30天
:00426A77 7E40 jle 00426AB9 //改为 JMP 即7E40改为EB40
:00426A79 8D4C242C lea ecx, dword ptr [esp+2C]

运行一下，爽不爽，没有了注册提示框，也没有了时间限制。没办法，这类要网上注册的软件只能暴破！


Quick View Plus 5.0

 标 题:《Quick View Plus 5.0》30天试用版的破解 (5千字)
发信人:RATARICE[BCG]
时 间:2001-7-24 10:56:48
详细信息:
《Quick View Plus 5.0》30天试用版的破解
目标：QVP
综合评价：★★★★★
这个软件支持查看超过200种应用程序所创建的文件和文档,包括字处理、数据库、电子表格、图形等等 。你可以直接用它查看Office 97文件以及HTML文档。是一个功能强，运行快，操作简单，与Windows无 缝衔接的文件查看器。该评测版不支持win31，不过正式版支持。
作者：RATARICE[BCG]
工具：TRW2000 1.22、ULTRAEDIT-32
过程：
一、 运行软件，没有找到输入注册码的地方，所以要爆破。而且没有功能限制。
二、 将时间向后调30天，再运行，有出错框。
三、 启动TRW，下bpx getsystemtime。再运行，被拦。pmodule后，看到下面代码：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040173D(C), :00401759(C)
|
:0040176D 83FE01 cmp esi, 00000001
:00401770 7523 jne 00401795
:00401772 68C0B44000 push 0040B4C0

* Reference To: KERNEL32.InitializeCriticalSection, Ord:0179h
|
:00401777 FF15E0D14000 Call dword ptr [0040D1E0]
:0040177D 68C0B44000 push 0040B4C0

* Reference To: QVP.QVPManager, Ord:0009h
|
:00401782 E8690C0000 Call 004023F0 ---------------------------->有问题，要进入！！
:00401787 83C404 add esp, 00000004 ------------------------>我们停在这！
:0040178A 68C0B44000 push 0040B4C0

* Reference To: KERNEL32.DeleteCriticalSection, Ord:004Ch
|
:0040178F FF15B0D14000 Call dword ptr [0040D1B0]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004016D1(C), :004016FC(C), :00401770(C)
|
:00401795 5F pop edi
:00401796 33C0 xor eax, eax
:00401798 5E pop esi
:00401799 81C448040000 add esp, 00000448
:0040179F C21000 ret 0010

进入后来到QVP.DLL的领域：

Exported fn(): QVPManager - Ord:000Ah
:20805A40 55 push ebp
:20805A41 8BEC mov ebp, esp
:20805A43 6AFF push FFFFFFFF
:20805A45 68108B8120 push 20818B10
:20805A4A 64A100000000 mov eax, dword ptr fs:[00000000]
:20805A50 50 push eax
:20805A51 64892500000000 mov dword ptr fs:[00000000], esp
:20805A58 51 push ecx
:20805A59 81EC48070000 sub esp, 00000748
:20805A5F 53 push ebx
:20805A60 56 push esi
:20805A61 57 push edi
:20805A62 8965F0 mov dword ptr [ebp-10], esp
:20805A65 6A01 push 00000001
* Reference To: QVP.QVPTrialWareStart
|
:20805A67 E8D4FCFFFF call 20805740 --------------------------->在这出错，要进入！
:20805A6C 83C404 add esp, 00000004
:20805A6F 85C0 test eax, eax
:20805A71 0F84DD060000 je 20806154
:20805A77 8B4508 mov eax, dword ptr [ebp+08]
:20805A7A A388FA8120 mov dword ptr [2081FA88], eax
:20805A7F E84C240000 call 20807ED0
:20805A84 8BF0 mov esi, eax
:20805A86 A1A4F58120 mov eax, dword ptr [2081F5A4]
:20805A8B 33FF xor edi, edi

进入上面的CALL，一直追到这：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:208058C1(C), :208058C9(U), :208058E3(U), :208058E9(U), :20805904(C)
|:20805908(U)
|
:20805910 837C241002 cmp dword ptr [esp+10], 00000002 --------------->重点比较！
:20805915 7507 jne 2080591E ----------------------------------->关键跳转！
:20805917 8BF5 mov esi, ebp 将它nop掉！
:20805919 E9DE000000 jmp 208059FC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:20805915(C)
|
:2080591E 8B84243C010000 mov eax, dword ptr [esp+0000013C]
:20805925 892D94FA8120 mov dword ptr [2081FA94], ebp
:2080592B 85C0 test eax, eax
:2080592D 0F8495000000 je 208059C8
:20805933 80FB68 cmp bl, 68
:20805936 751E jne 20805956
:20805938 8B15ACF58120 mov edx, dword ptr [2081F5AC]
:2080593E 56 push esi
:2080593F 6880538020 push 20805380
:20805944 6A00 push 00000000
:20805946 68D1100000 push 000010D1
:2080594B 52 push edx

* Reference To: USER32.DialogBoxParamA, Ord:008Eh
|
:2080594C FF1564288220 Call dword ptr [20822864] ---------------------->这是根源！
:20805952 8BF0 mov esi, eax 想办法跳过它
:20805954 EB7D jmp 208059D3 我们向上找！

四、 启动ULTRAEDIT-32，打开QVP.DLL找到7507改为9090！OK！

另外、这个软件比较差劲 20805910 处它要检查两次，第一次过去，就可以启动了；但不能打开任何文件，只有第二次也过去，才能正常使用！


Regsnap

标 题:Regsnap时间限制解除之一头雾水 (2千字)
发信人:henryw
时 间:2001-2-2 22:57:21
详细信息:
今日回到北京，又拿起了regsnap进行研究，记得有大侠说其注册算法极为复杂，对我这种菜鸟来说就干脆采取暴力法好了。

经Dasm反汇编，发现其对本身文件进行校验，有改动会拒绝执行，由于winme上使用softice太麻烦，用trw2000来代替，所以不知道这个东东是不是对softice有检测。

查看文件头的时候，发现pe标志前有一段乱码，不知是校验文件完整性还是用来探测softice的。不知哪位大侠给解释一下。

改了很长时间，由于我的水平很菜，那个起始splashscreen非常讨厌，一直无法搞掉。几乎准备放弃了，最后努力一次吧。使用pe-editor看看文件，没有找到.idata，只找到.data，猜想大概差不多吧，算了算importtable的地址，决定用trw2000来看看。load进去以后就一直d那个输入表的地址，看看何时它从??变成有内容了。果然，在一个call后，内容出现了，干脆pedump一下（什么逻辑嘛，这时候就pedump了）......

奇怪的事情终于发生了，首先并没有指望那个dump出来的程序可以运行，而它就能运行！而且那个splashscreen没了！好像也不再做CRC校验了！难道前面说的pe标志前的乱码就是干这些事情用的？这是怎么搞的嘛，乱七八糟的，高手给讲讲呀。接下来用reshacker找到第二个要求购买的dialog，回到调用它的地方，
:00406D3F FF1518784100 Call dword ptr [00417818]
:00406D45 6A00 push 00000000
:00406D47 8D8D28FFFFFF lea ecx, dword ptr [ebp+FFFFFF28]
:00406D4D E8CEBD0000 call 00412B20 <------------就是这个dialog调用
:00406D52 B30E mov bl, 0E
:00406D54 8D8D28FFFFFF lea ecx, dword ptr [ebp+FFFFFF28]
:00406D5A 885DFC mov byte ptr [ebp-04], bl

* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:00406D5D E856D20000 Call 00413FB8
:00406D62 83F801 cmp eax, 00000001
:00406D65 7449 je 00406DB0 <------------这里成EB
:00406D67 8D4D88 lea ecx, dword ptr [ebp-78]
:00406D6A C645FC0F mov [ebp-04], 0F

这样当过期的时候按下quit还是可以进入主程序。接下来就是去掉这个dialog的问题了，用hedit打开主程序，寻找t r y，中间的空格其实是0x00，找到后前面的FF FF 80改为FF FF 90，好了，虽然提示没有注册，但是没有使用时间限制了。

最后声明一点，由于我过早将时间调过30天试用期，所以在30天内是否可以正常运行我不清楚，不过应该可以吧。


Serv-U 3.0 beta build 13

标 题:serv-u 3.0 beta破解 (2千字)
发信人:tomasyzz
时 间:2001-4-20 18:40:37
详细信息:
软件名称：Serv-U 3.0 beta build 13

从看雪上下了几部教程看了两天，有点手痒。正好我用的FTP服务器软件
serv-u 3.0 beta build 13 过期了。到网上转了一圈没找到破解
版，得了，就拿它开刀吧。
Serv-U 有两个可执行文件，ServUAdmin.exe 和ServUDaemon.exe，如果
日期超过2001.3.15,执行ServUAdmin.exe就会弹出个破框说过期了。通常
的做法是记下出错信息，将ServUAdmin.exe用W32dasm8.93反汇编后用出错
信息去定位。如果你这样做，你就陷入万劫不复的深渊了（just like me，
极度郁闷），虽然可去掉破框，但当从客户端FTP时，却永远上不去，郁闷吧？
实际上，真正要下刀子的是ServUDaemon.exe，它启动后，会产生一个后
台服务进程。但它无论运行是否正常，都不产生任何信息。反汇编后，去
字符串引用中看一看，会发现'This trial version of Serv-U'，是它，一定是它。

:004714D1 895338 mov dword ptr [ebx+38], edx
:004714D4 E9F1000000 jmp 004715CA
:004714D9 68A0000000 push 000000A0
:004714DE 8D8DE8FDFFFF lea ecx, dword ptr [ebp+FFFFFDE8]
:004714E4 51 push ecx

* Possible Reference to String Resource ID=02075: "This trial version of Serv-U is out-of-date! All domains are"
|
:004714E5 681B080000 push 0000081B
:004714EA FF7320 push [ebx+20]
哈，只要到004714D4就可跳过，向前看一下，没有cmp,jnz,jz等，用
softice跟一下吧。分别设断点为004714D1和004714D4，结果程序可以
执行到004714D4，却到不了004714D1，说明前面有间接跳转到004714D1
和004714D4之间某一处，向前PgUp几次，

:00471397 FF7338 push [ebx+38]
:0047139A E875AAFEFF call 0045BE14
:0047139F 59 pop ecx
:004713A0 8BF0 mov esi, eax
:004713A2 8BC6 mov eax, esi
:004713A4 83C003 add eax, 00000003
:004713A7 83F805 cmp eax, 00000005
:004713AA 0F871A020000 ja 004715CA
:004713B0 FF2485B7134700 jmp dword ptr [4*eax+004713B7]<-----就是它了

:004713B7 D9144700 DWORD 004714D9
:004713BB 1F154700 DWORD 0047151F
:004713BF 8D154700 DWORD 0047158D
:004713C3 CA154700 DWORD 004715CA
:004713C7 D4134700 DWORD 004713D4
:004713CB 96144700 DWORD 00471496

将jmp dword ptr [4*eax+004713B7]改为
jmp 00471D43
nop
nop
保存，搞定。


The Cleaner

 标 题:暴破The Cleaner （时间限制） (3千字)
发信人:幻影2001[BCG]
时 间:2001-5-8 11:45:20
详细信息:
软件名称：The Cleaner
整理日期：2001.5.8
最新版本：3.2 Build 3213 Database 3217
文件大小：1825KB
软件授权：共享软件
使用平台：Win9x/Me/NT/2000
发布公司：Home Page
软件简介：
    一个专门检测和清除侵入您系统中的特洛伊木马的专业程序, 内置3093个木马标识。可在线升级版本和病毒数据库, 操作简单, 功能强大! 查杀的各类特洛伊木马种类最多，几乎所有较出名的这里都有，如 Netspy、BO、Netbus、 Girlfriend、Happy99、BackDoor 以及它们的一些不同版本。还有很多种我们大多数网友听都没听过，有了它我们可以将电脑“清洁”得干干净净，放心大胆地上网。将毒数据库cleaner.cdb复制到The Cleaner的安装目录下，就可以完成升级了。
下载地址：http://www.inhua.com/down/cleaner3.exe
汉化补丁下载：http://software.wx88.net/down/TheCleaner3213-HB-SPH.exe

使用工具：FI 2.40 、W32DASM、pdump32、HIEW
以上工具均可在看雪老师的破解工具中找到
步骤如下：
1、FI 查看为UPX压缩，用PDUMP32打开cleaner.exe
(1)选择unpack
出现对话框后先择里面的UPX点OK按钮、打开cleaner.exe
等待软件完全运行后点击PDUMP32的确定按钮
这时程序自动完成脱壳工作，出现提示框后，键入test.exe保存；
到此脱壳完成 ^_^ 用FI查看test.exe为DELPHI格式，嘻嘻DELPHI真 的不错
2、用W32DASM打开test.exe反汇编，成功后在串式参考中查找“你的 30 天评估时间已到期了！”（没办法英文太菜了）找到如下内容：
=======================================================================
:00496947 763C jbe 00496985 ====>改为9090
~~~~
NOP NOP
:00496949 8D45FC lea eax, dword ptr [ebp-04]
:0049694C 50 push eax
:0049694D 8D55F8 lea edx, dword ptr [ebp-08]
:00496950 8BB3EC010000 mov esi, dword ptr [ebx+000001EC]
:00496956 8BC6 mov eax, esi
:00496958 E877A6F8FF call 00420FD4
:0049695D 8B45F8 mov eax, dword ptr [ebp-08]
:00496960 33D2 xor edx, edx
:00496962 8A9314020000 mov dl, byte ptr [ebx+00000214]
:00496968 8955F0 mov dword ptr [ebp-10], edx
:0049696B C645F400 mov [ebp-0C], 00
:0049696F 8D55F0 lea edx, dword ptr [ebp-10]
:00496972 33C9 xor ecx, ecx
:00496974 E8771FF7FF call 004088F0
:00496979 8B55FC mov edx, dword ptr [ebp-04]
:0049697C 8BC6 mov eax, esi
:0049697E E881A6F8FF call 00421004
:00496983 EB10 jmp 00496995

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00496947(C)
|

* Possible StringData Ref from Data Obj ->" 你的 30 天评估时间已到期了！ "
->" "
|
:00496985 BA306A4900 mov edx, 00496A30
:0049698A 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:00496990 E86FA6F8FF call 00421004

***************向上查找可又跳过的地址:00496947 763C jbe 00496985 =======================================================================
下面的你看着改吧，我就不多说了
:004AB3BE E879500000 call 004B043C
:004AB3C3 84C0 test al, al
:004AB3C5 754C jne 004AB413
:004AB3C7 8B45FC mov eax, dword ptr [ebp-04]
:004AB3CA 056CB35101 add eax, 0151B36C

* Possible StringData Ref from Data Obj ->"***未注册的共享软件***"
|
:004AB3CF BA54BB4A00 mov edx, 004ABB54
:004AB3D4 E83B87F5FF call 00403B14
:004AB3D9 8B0D18504B00 mov ecx, dword ptr [004B5018]
:004AB3DF A1D84F4B00 mov eax, dword ptr [004B4FD8]
:004AB3E4 8B00 mov eax, dword ptr [eax]
=======================================================================

用TRW2000也可以非常方便的找到注册码，但由于找不到注册算法写不出注册机，就算了。如果谁能够找到，请指导一下。我会很虚心的求教的

^_^

标 题:一点补充。 (172字)
发信人:mauiboy2001
时 间:2001-5-8 19:24:48
详细信息:

除了把:004AB3C5 754C jne 004AB413 改外，还可加上004633C0 JE

004933D9改为JNE。再输入任意19位注册码都有效。

--MAUIboy2001[BCG]


ThumbNailer 6.6.1.1

标 题:ThumbNailer (2千字)
发信人:bnbnf
时 间:2001-2-2 1:23:16
详细信息:
软件名称：ThumbNailer
整理日期：2001.1.29
最新版本：6.6.1.1
文件大小：1324KB
软件授权：共享软件
使用平台：Win9x/Me/NT/2000
发布公司：Home Page

软件简介：
    能够为一个满是图形的目录建立图片的缩略图，并建立一个HTML连接这些图片，支持JPG、BMP、PNG、PCX、TGA、AVI frame-extraction、GIF(non-LZW output)、TIFF(non LZW)、WMF(read-only)等格式。

下载地址：http://www.newhua.com/THUMBNAILER.HTM
破解工具：HIEW，W32DASM
这个软件没有输入注册码的地方,在左下解看到30 DAYS LEFT IN TRIAL用是我将时间跳到2002年后,再次运行它,看到YOUR 30-DAY TRAL PERIOD HAS RUN OUT.的提示,这就是入口点
用W32DASM反汇编后找到这句后

* Possible StringData Ref from Data Obj ->"Your %d-day trial period has run "-----------------破解它的入口点,向上找
->"out.
Visit http://www.smalleranimals.com "
->"to register this application."
|
:00475BC2 68300A5900 push 00590A30
:00475BC7 8D55EC lea edx, dword ptr [ebp-14]
:00475BCA 52 push edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475B65(C)----------------------------------------------------------找到这个就行了
|
:00475B76 6A01 push 00000001
:00475B78 8B4DDC mov ecx, dword ptr [ebp-24]
:00475B7B E817FDFFFF call 00475897
:00475B80 B930F55900 mov ecx, 0059F530
:00475B85 E89FFB0100 call 00495729
:00475B8A 8B0D34F55900 mov ecx, dword ptr [0059F534]

00075B65
:00475B56 83EC18 sub esp, 00000018
:00475B59 894DDC mov dword ptr [ebp-24], ecx
:00475B5C 33C0 xor eax, eax
:00475B5E A04CF55900 mov al, byte ptr [0059F54C]
:00475B63 85C0 test eax, eax
:00475B65 740F je 00475B76-------------------这个JE就是鬼啦!将JE改为JNE怎么样!也就是说将74改为75就成功了
:00475B67 B930F55900 mov ecx, 0059F530


ThumNailer v7.0

 标 题:破解ThumNailer v7.0 (3千字)
发信人:D-X-C
时 间:2001-8-7 16:24:39
详细信息:
破解ThumNailer v7.0
为什么要写这个稿子呢？实际上这个文件还有一点我实在是没有耐心再破。把我破的过程写下来让其他人做个参考，如果你破了，请别忘了E-mail给我一份。
破解：D-X-C cracked at 2001/8/7
工具：TRW2000 1.22 W32DSAM8.93 UtraEdit 8.0
E-MAIL：ZHIDA8721@SINA.COM
原版下载地址：http://www.smalleranimals.com/thumb.htm

详细的破解过程我不写了，反正追出来挺不容易的，你试一试看吧。主要的代码都COPY在下面了。另外这个软件还有一个限制，就是自己定义的PROFILE不能存盘，我懒的再破了。为什么不破注册码？因为这个东东的注册是要你发E-MAIL到他的站点，他在给你一个包含注册信息的文件，才能动手注册，估计破起来一定很麻烦。虽然有一个限制没破，但完全不耽误使用了。

1. 破解时间限制

:0047885D 33C0 xor eax, eax
:0047885F A024245A00 mov al, byte ptr [005A2424]
:00478864 85C0 test eax, eax
:00478866 740F je 00478877 关键性跳转，改成9090就可以了
:00478868 B908245A00 mov ecx, 005A2408
:0047886D E880AA0100 call 004932F2
:00478872 E929010000 jmp 004789A0

:00478877 6A01 push 0000000

<省略>

* Possible StringData Ref from Data Obj ->"Your %d-day trial period has run "
->"out.
Visit http://www.smalleranimals.com "
->"to register this application."
|
:004788C3 68D4485900 push 005948D4
:004788C8 8D55EC lea edx, dword ptr [ebp-14]
:004788CB 52 push edx

<省略>

* Possible StringData Ref from Data Obj ->"You have %d days left in your "
->"trial period.
Visit http://www.smalleranimals."
->"com to register this application."
|
:
0047893E 683C495900 push 0059493C
:00478943 8D4DE8 lea ecx, dword ptr [ebp-18]
:00478946 51 push ecx
:00478947 E8D03F0A00 call 0051C91C

<省略>

* Possible StringData Ref from Data Obj ->"%d days left in trial"
|
:0047896F 68AC495900 push 005949AC
:00478974 8B4DDC mov ecx, dword ptr [ebp-24]
:00478977 51 push ecx
:00478978 E823A30000 call 00482CA0

<省略>

* Possible StringData Ref from Data Obj ->"%s, %d days left"
|
:0047898E 68C4495900 push 005949C4
:00478993 68A8245A00 push 005A24A8
:00478998 E879A6FFFF call 00473016
:0047899D 83C410 add esp, 00000010

:004789A0 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004789A3 64890D00000000 mov dword ptr fs:[00000000], ecx
:004789AA 8BE5 mov esp, ebp
:004789AC 5D pop ebp
:004789AD C3 ret

2．破解文件个数限制

:0047B02B 8B95C8F6FFFF mov edx, dword ptr [ebp+FFFFF6C8] 该地址现在存放的是目录中的实际文件数
:0047B031 3B157C385900 cmp edx, dword ptr [0059387C] 该地址现在存放的是100，即最大可操作文件数
:0047B037 7D0E jge 0047B047 将这三句做些修改即可。主要是让[0059387C]等于[ebp+FFFFF6C8]，我不写答案了，免得写不好让高手笑话，你自己想去吧，不管怎么说我是修改成功了
:0047B039 8B85C8F6FFFF mov eax, dword ptr [ebp+FFFFF6C8]
:0047B03F 89855CC0FFFF mov dword ptr [ebp+FFFFC05C], eax
:0047B045 EB0C jmp 0047B053

3．砍掉当文件数超过100时操作完后出现的警告框

:00527140 FF75F4 push [ebp-0C]

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:00527143 FF1588245400 Call dword ptr [00542488] 将FF1588245400 改成909090909090
:00527149 85F6 test esi, esi


Turbo Note+ V4.4

 标 题:Turbo Note+ 破解手记 (4千字)
发信人:囚童
时 间:2001-5-13 17:22:27
详细信息:
解除Turbo Note+ 时间限制
课题: 解除Turbo Note+ V4.4时间限制
工具: TRW 2000
TYP
Ultra Editer 32
下载：http://turbopress.com/tnplus44.exe

关键字: 破解 解压缩

TurboNote+是一个方便的"即时帖"软件,可以工作在Win95/98, WinNT 和 Win2000环境下.它可以即时在自己或通过IP地址向其他人的屏幕上贴上一个可定义尺寸和颜色的"留言条",也可以按预定的时间启动备忘提示功能.
通过"留言条",可以方便地启动可执行程序、互联网址、E-mail地址,也可以把它们作为附件发送给指定的IP地址.它可以隐藏,也可以再现,甚至关机后信息也不会丢失.使用十分方便.

TurboNote V4.4是有30天的时间限制.过期后会随时出现延时的注册窗口,程序仍能使用.

TurboNote+是一个被压缩了的可执行软件,用一般的方法无法修改.

以下是破解其时间限制的方法:

先在DOS环境下键入:C:>MYPATH\TYP TBNOTE.EXE

屏幕出现对运行环境和文件的分析结果,观察最后一行,TurboNote+的压缩外壳是SHRINKER V3.3.

解压缩（脱壳）:

启动TRW2000,点击OK使其最小化.右击TRW图标,选择TRnewTCB(截获新线程).

双击TurboNote+图标,TurboNote+被TRW截获.

下指令:BPX GETModuleFileNameA,按F5,TurboNote+再次被TRW截获.

按F12、F10各一次,程序回到TurboNote+域:

0167:0049944B JMP SHORT 00499450 ;光标停在这里
0167:0049944D MOV ESI,[EBP+08]
0167:00499450 CALL 00498000
0167:00499455 PUSH DWORD [EBP+10]
0167:00499458 PUSH DWORD [EBP+0C]
0167:0049945B PUSH ESI
0167:0049945C CALL 00499467 ;追到这里,按F8追进去

按F10追到CS:49945C,按F8追进去,再按F10一直追到:

0167:004994BF CMP WORD [00496E84],BYTE +00
0167:004994C6 JZ 004994E7
0167:004994C8 MOV EAX,[00496E84]
0167:004994CD ADD EAX,[00496F98]
0167:004994D3 MOV [EBP-20],EAX
0167:004994D6 PUSH WORD [EBP+10]
0167:004994D9 PUSH WORD [EBP+0C]
0167:004994DC PUSH WORD [EBP+08]
0167:004994DF CALL NEAR [EBP-20] ;追到这里,按F8追进去
0167:004994E2 MOV [EBP-1C],EAX
0167:004994E5 JMP SHORT 004994EE

追到CS:4994DF,按F8追进去:

XXXX:XXXXXXXX BD ??
XXXX:0045B8F3 BD ??
XXXX:XXXXXXXX BD ??
.......

当前代码页不可见.但光标停留在地址CS:0045B8F3,这是解压缩后的程序入口.

下指令: MAKEPE

TRW在当前目录下生成被还原了的程序.程序名为NEWPE.EXE.

按F5,TRW退出,回到WINDOWS环境下.在屏幕右下脚生成一个TurboNote+图标.

右击TurboNote+图标,出现TurboNote+主菜单,点击"Exit",退出.

在资源管理器中双击NEWPE.EXE,在屏幕右下脚生成一个TurboNote+图标.

点击该图标,可运行且功能齐全,解压缩成功.

破解时间限制:

按Ctrl+N,进入TRW环境.

下指令: BPX GetLocalTime

按F5,TRW退出,回到WINDOWS环境下.

右击TurboNote+图标,TurboNote+被TRW截获.

按F12、F10各一次,程序回到TurboNote+域:

0167:0040BD3B CALL KERNEL32!GetLocalTime
0167:0040BD41 MOV CL,[ESP+06]; 光标停在这里
0167:0040BD45 MOV DL,[ESP+02]
0167:0040BD49 MOV AX,[ESP+00]
0167:0040BD4E MOV [ESP+90],CL
0167:0040BD55 MOV CX,[ESP+08]
0167:0040BD5A MOV [ESP+91],DL
0167:0040BD61 MOV DX,[ESP+0A]
0167:0040BD66 MOV [ESP+92],AX
0167:0040BD6E MOV AX,[ESP+0C]
0167:0040BD73 MOV [ESP+94],CX
0167:0040BD7B MOV CL,[00477178]
0167:0040BD81 MOV [ESP+96],DX
0167:0040BD89 MOV DL,[00477179]
0167:0040BD8F MOV [ESP+98],AX
0167:0040BD97 MOV AX,[0047717A]
0167:0040BD9D MOV [ESP+10],CL
0167:0040BDA1 MOV CX,[0047717C]
0167:0040BDA8 MOV [ESP+11],DL
0167:0040BDAC MOV DX,[0047717E]
0167:0040BDB3 MOV [ESP+12],AX
0167:0040BDB8 MOV AX,[00477180]
0167:0040BDBE MOV [ESP+14],CX
0167:0040BDC3 PUSH BYTE +01
0167:0040BDC5 LEA ECX,[ESP+14]
0167:0040BDC9 MOV [ESP+1A],DX
0167:0040BDCE MOV [ESP+1C],AX
0167:0040BDD3 CALL 0042D040
0167:0040BDD8 LEA ECX,[ESP+10] ;TurboNote+安装日期
0167:0040BDDC PUSH ECX
0167:0040BDDD LEA ECX,[ESP+94] ;当前日期
0167:0040BDE4 CALL 0042D220 ;分析比较
0167:0040BDE9 TEST EAX,EAX
0167:0040BDEB JNZ NEAR 40BEDE ;EAX≠0,成功跳转
0167:0040BDf1 ;EAX=0,向下打出延时的注册窗口

向下看0040BDD8处的两句,[ESP+10]是TurboNote+安装日期,[ESP+94]是当前日期,在下面的子调用中进行比较,
根据比较结果决定是否调用延时的注册窗口.

若始终用同一个日期,例如TurboNote+安装日期,进行比较,则比较的结果就一定是真,将不再显示延时的注册窗
口.

下指令: code on

抄下0040BDDD处的代码:

8D 8C 24 94 00 00 00
-- -- -- 10 -- -- --

用Ultra Editer 32按上面显示的方法修改TurboNote+,--意为保留.

存盘。

如果能找到SHRINKER V3.3(谁有呢?),还可以将修改过的TurboNote+重新处理成压缩形态.

TurboNote+有注册码,没有去破解,有谁破出来了,请与我联系.


udioconverterV31B

 标 题:audioconverterV31B (6千字)
发信人:habby
时 间:2001-9-1 22:53:01
详细信息:
说明:本文仅供研究用;这个软件很不错,希望有经济实力的同志还是支持一下软件作者吧! ^_^

1.去掉版权提示窗口
* Reference To: audconv.CreateLicenseManager, Ord:0019h
|
:00408317 FF1520044200 Call dword ptr [00420420]
:0040831D 83C41C add esp, 0000001C
:00408320 85C0 test eax, eax
:00408322 0F8C12010000 jl 0040843A
:00408328 8B4DFC mov ecx, dword ptr [ebp-04]
:0040832B 8B01 mov eax, dword ptr [ecx]
:0040832D FF501C call [eax+1C] ;<--此call执行后,eax=0
:00408330 85C0 test eax, eax ; 程序将跳到408386
:00408332 7452 je 00408386
:00408334 8B4DFC mov ecx, dword ptr [ebp-04]
:00408337 33FF xor edi, edi
:00408339 57 push edi
:0040833A 8B01 mov eax, dword ptr [ecx]
:0040833C FF10 call dword ptr [eax]
:0040833E 3D05400080 cmp eax, 80004005
:00408343 740A je 0040834F
:00408345 3BC7 cmp eax, edi
:00408347 0F85ED000000 jne 0040843A
:0040834D EB39 jmp 00408388

.
.
.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408332(C)
|
:00408386 33FF xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040834D(U)
|
:00408388 57 push edi

* Reference To: audconv.ShowEULA, Ord:002Dh
|
:00408389 FF1524044200 Call dword ptr [00420424]
:0040838F 85C0 test eax, eax
:00408391 59 pop ecx
:00408392 0F8CA2000000 jl 0040843A
:00408398 8B4DFC mov ecx, dword ptr [ebp-04]
:0040839B 57 push edi
:0040839C 8B01 mov eax, dword ptr [ecx]
:0040839E FF5014 call [eax+14] ;<--呼叫协议窗口
:004083A1 85C0 test eax, eax ;<--按Agree按钮,eax=0;
; 按Cancel按钮,eax=1
:004083A3 0F8591000000 jne 0040843A ;<--eax=1,则跳到40843a
; 一跳到40843a,就game over了
:004083A9 833DE462420001 cmp dword ptr [004262E4], 00000001
:004083B0 7E62 jle 00408414 ;<--从此处,跳到408414
; 408414是主程序开始的地方

.
.
.

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004083B0(C), :004083DC(C)
|
:00408414 FF7514 push [ebp+14]
:00408417 8D8DB8FEFFFF lea ecx, dword ptr [ebp+FFFFFEB8]
:0040841D FF7510 push [ebp+10]
:00408420 E894170000 call 00409BB9
:00408425 8945F8 mov dword ptr [ebp-08], eax

经过动态跟踪,发现:从00408388到00408414,ecx和edx的值有变化(edx=0),而408417的指令将ecx的值覆盖.
所以,只要在00408388处,改指令为:
mov edx,0
jmp 408414
即可.

因此,在audconv.exe文件中的00008388处,找到57 FF 15 24 04 42 00 85 C0 59 ,
^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
将其改成 BA 00 00 00 00 E9 82 00 00 00

2.去掉版权提示窗口后,如果过期,关闭时还有提示窗口出现,下面将去掉该提示窗口
* Reference To: audconv.CreateLicenseManager, Ord:0019h
|
:0040C029 FF1520044200 Call dword ptr [00420420]
:0040C02F 85C0 test eax, eax
:0040C031 59 pop ecx
:0040C032 7C13 jl 0040C047 ;<--若在此处跳转,则过期提示窗口不会出现
:0040C034 8B4DFC mov ecx, dword ptr [ebp-04]
:0040C037 FF7604 push [esi+04]
:0040C03A 8B01 mov eax, dword ptr [ecx]
:0040C03C FF5018 call [eax+18] ;<--出现过期提示窗口
:0040C03F 8B4DFC mov ecx, dword ptr [ebp-04]
:0040C042 8B01 mov eax, dword ptr [ecx]
:0040C044 FF5020 call [eax+20]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C032(C)
|
:0040C047 8B4514 mov eax, dword ptr [ebp+14]
:0040C04A 5E pop esi
:0040C04B 832000 and dword ptr [eax], 00000000
:0040C04E 33C0 xor eax, eax
:0040C050 C9 leave
:0040C051 C21000 ret 0010

所以,在audconv.exe文件的0000C032处,将7C改为7D.

3.在转换文件时,还弹出评估版提示窗口,程序用的是audconv.dll中的代码.
代码如下:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004485(U)
|
:10004489 8B4DFC mov ecx, dword ptr [ebp-04]
:1000448C 8B01 mov eax, dword ptr [ecx]
:1000448E FF5010 call [eax+10]
:10004491 85C0 test eax, eax
:10004493 0F8540030000 jne 100047D9
:10004499 8B45E0 mov eax, dword ptr [ebp-20]

* Possible Reference to String Resource ID=00010: "MPEG Layer-1 Audio Files (.mp1)"
|
:1000449C 6A0A push 0000000A
:1000449E 33D2 xor edx, edx
:100044A0 59 pop ecx
:100044A1 F7F1 div ecx
:100044A3 85D2 test edx, edx
:100044A5 751B jne 100044C2
:100044A7 8B4DFC mov ecx, dword ptr [ebp-04]
:100044AA 6A40 push 00000040 ;<--由这里跳到100044c2,
; 评估版提示窗口就不会出现
* Possible StringData Ref from Data Obj ->"Audio Converter"
|
:100044AC 6800530810 push 10085300

* Possible StringData Ref from Data Obj ->"This is an evaluation version "
->"of Audio Converter."
|
:100044B1 681C5E0810 push 10085E1C
:100044B6 8B01 mov eax, dword ptr [ecx]
:100044B8 FF5024 call [eax+24]
:100044BB 50 push eax

* Reference To: USER32.MessageBoxA, Ord:01C3h
|
:100044BC FF15E0430710 Call dword ptr [100743E0] ;<--call评估版提示窗口

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100044A5(C)
|
:100044C2 8B47FC mov eax, dword ptr [edi-04]

因此,将audconv.dll中的从44aa开始的代码改为e9 13 00 00 00 90 90,即可.

另:metadata窗口的限制没有解除,特别是comments的限制,还望高手指教!

标 题:解决鼠标右键问题 (1千字)
发信人:habby
时 间:2001-9-4 1:07:53
详细信息:

4.去掉用鼠标右键菜单转换文件时的版权提示窗口
用鼠标右键菜单转换文件时,调用的是acshext.dll(每次重启后,程序运行时的image base都有所改变,而w32dsm中的image base为10000000,所以下断点时要注意.):
* Reference To: audconv.CreateLicenseManager, Ord:0019h
|
:1000586A FF15BCF20010 Call dword ptr [1000F2BC]
:10005870 85C0 test eax, eax
:10005872 59 pop ecx
:10005873 7C4B jl 100058C0
:10005875 8B4DEC mov ecx, dword ptr [ebp-14]
:10005878 8B01 mov eax, dword ptr [ecx]
:1000587A FF501C call [eax+1C]
:1000587D 85C0 test eax, eax
:1000587F 7418 je 10005899 ;<--跳转到10005899

........

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000587F(C)
|
:10005899 8B4DEC mov ecx, dword ptr [ebp-14]
:1000589C FF7308 push [ebx+08]
:1000589F 8B01 mov eax, dword ptr [ecx]
:100058A1 FF5014 call [eax+14] ;<--呼叫协议窗口
:100058A4 85C0 test eax, eax ;<--按Agree按钮,eax=0;
; 按Cancel按钮,eax=1
:100058A6 740A je 100058B2 ;<--eax=0,则跳到100058B2,
; 否则,就game over

所以,将1000587F改为je 100058B2,即
:1000587F 7418 =>7431

5.去掉用鼠标右键菜单转换文件时的过期提示窗口
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10005BB2(C), :10005BC1(C)
|
:10005C0B 8B4DEC mov ecx, dword ptr [ebp-14]
:10005C0E 3BCE cmp ecx, esi
:10005C10 7410 je 10005C22
:10005C12 8B01 mov eax, dword ptr [ecx]
:10005C14 FF7308 push [ebx+08]
:10005C17 FF5018 call [eax+18] ;<--调出过期提示窗口

所以,将10005C10的je 10005C22改为jmps 10005C22,即
:10005C10 7410 =>eb10

标 题:去掉Metadata窗口的comments和User defined URL link标签中AudConv自动添加的内容 (2千字)
发信人:habby
时 间:2001-9-4 11:04:03
详细信息:

6.去掉Metadata窗口的comments和User defined URL link标签中AudConv自动添加的内容
在audconv.dll中,
:10014232 E851E2FFFF call 10012488
:10014237 8B4DFC mov ecx, dword ptr [ebp-04]
:1001423A 83C40C add esp, 0000000C
:1001423D 85C9 test ecx, ecx
:1001423F 742B je 1001426C ;<--跳转
:10014241 8B01 mov eax, dword ptr [ecx]

* Possible StringData Ref from Data Obj ->"Audio Converter Home Page"
|
:10014243 68F48B0810 push 10088BF4
:10014248 FF5030 call [eax+30]
:1001424B 8B4DFC mov ecx, dword ptr [ebp-04]

* Possible StringData Ref from Data Obj ->"http://www.audconv.com"
|
:1001424E 68C48B0810 push 10088BC4

.........

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001423F(C)
|
:1001426C 8D45F8 lea eax, dword ptr [ebp-08]
:1001426F 50 push eax
:10014270 6870470710 push 10074770
:10014275 6A03 push 00000003
* Reference To: audconv.MetadataCreateFrame
|
:10014277 E80CE2FFFF call 10012488
:1001427C 8B4DF8 mov ecx, dword ptr [ebp-08]
:1001427F 83C40C add esp, 0000000C
:10014282 85C9 test ecx, ecx
:10014284 742B je 100142B1 ;<--跳转
:10014286 8B01 mov eax, dword ptr [ecx]

* Possible StringData Ref from Data Obj ->"Audio Converter"
|
:10014288 68A48B0810 push 10088BA4
:1001428D FF5030 call [eax+30]
:10014290 8B4DF8 mov ecx, dword ptr [ebp-08]

* Possible StringData Ref from Data Obj ->"This audio file has been encoded "
->"by an evaluation version of Audio "
->"Converter for evaluation purposes "
->"only."
|
:10014293 68188A0810 push 10088A18

所以,在audconv.dll中,
:1001423F 742B =>EB2B
:10014284 742B =>EB2B

标 题:最后一篇,解除Comments窗口的限制和恢复User defined URL link窗口的功能 (4千字)
发信人:habby
时 间:2001-9-5 17:20:55
详细信息:

7. 解除Comments窗口的限制和恢复User defined URL link窗口的功能
代码在Audconv.dll中
1> 解除Comments窗口的限制
这里是用DialogBoxParamA来显示每个tag的对话框的
:10013757 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"VWh"
|
:10013759 68A2970010 push 100097A2
:1001375E FF742410 push [esp+10]
:10013762 68D2000000 push 000000D2 ;<--第一个tag(Comments)的资源号
:10013767 50 push eax

* Reference To: USER32.DialogBoxParamA, Ord:0095h
|
:10013768 FF157C430710 Call dword ptr [1007437C]

要激活窗口,就要跟进10013768的call USER32.DialogBoxParamA. 你会发现有下面一段代码：
* Reference To: USER32.SetWindowTextA, Ord:0263h
|
:1000FB3D FF1590430710 Call dword ptr [10074390]

* Reference To: USER32.SendDlgItemMessageA, Ord:0213h
|
:1000FB43 8B2D84440710 mov ebp, dword ptr [10074484]
:1000FB49 53 push ebx
:1000FB4A 6A01 push 00000001
:1000FB4C 68CF000000 push 000000CF
:1000FB51 68F0030000 push 000003F0 ;<--Description下面的Edit的ID号
:1000FB56 FF36 push dword ptr [esi]
:1000FB58 FFD5 call ebp

* Reference To: USER32.GetDlgItem, Ord:0105h
|
:1000FB5A 8B1DB4430710 mov ebx, dword ptr [100743B4]
:1000FB60 680B040000 push 0000040B ;<--Language下面的ComboBox的ID号
:1000FB65 FF36 push dword ptr [esi]
:1000FB67 FFD3 call ebx
:1000FB69 6A00 push 00000000 ;<--改为01才能激活ComboBox
:1000FB6B 50 push eax

* Reference To: USER32.EnableWindow, Ord:00B9h
|
:1000FB6C FF152C440710 Call dword ptr [1007442C]
:1000FB72 6A00 push 00000000
:1000FB74 6A01 push 00000001
:1000FB76 68CF000000 push 000000CF
:1000FB7B 68E9030000 push 000003E9 ;<--Text下面的Edit的ID号
:1000FB80 FF36 push dword ptr [esi]
:1000FB82 FFD5 call ebp
:1000FB84 680D040000 push 0000040D ;<--右下角的Static的ID号
:1000FB89 FF36 push dword ptr [esi]
:1000FB8B FFD3 call ebx
:1000FB8D 6A05 push 00000005
:1000FB8F 50 push eax

* Reference To: USER32.ShowWindow, Ord:026Fh
|
:1000FB90 FF1590440710 Call dword ptr [10074490]
:1000FB96 68ED030000 push 000003ED ;<--未知控件ID号
:1000FB9B FF36 push dword ptr [esi]
:1000FB9D FFD3 call ebx
:1000FB9F 6A00 push 00000000
:1000FBA1 50 push eax

* Reference To: USER32.EnableWindow, Ord:00B9h
|
:1000FBA2 FF152C440710 Call dword ptr [1007442C]
:1000FBA8 8B8740080000 mov eax, dword ptr [edi+00000840]
:1000FBAE 8DAF3C080000 lea ebp, dword ptr [edi+0000083C]
:1000FBB4 85C0 test eax, eax
:1000FBB6 7505 jne 1000FBBD
:1000FBB8 B820500710 mov eax, 10075020

所以,将Audconv.dll中的
:1000FB4C 68CF000000 =>68FF000000 (激活Description下面的Edit)
:1000FB69 6A00 =>6A01 (激活Language下面的ComboBox)
:1000FB76 68CF000000 =>68FF000000 (激活Text下面的Edit)
:1000FB84 680D040000 =>EB10909090 (除去右下角的Static)
(:1000FB9F 6A00 =>6A01)

2> 恢复User defined URL link窗口的功能
在Audconv.dll的10013DBD比较EAX是否为4A,是,则弹出"This frame can only be edited in the licensed version."对话框.
:10013DB8 E813D00000 call 10020DD0
:10013DBD 83F84A cmp eax, 0000004A
:10013DC0 7430 je 10013DF2 ;<--一跳就没戏了
:10013DC2 8D4604 lea eax, dword ptr [esi+04]
....
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10013DC0(C)
|
:10013DF2 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"Audio Converter"
|
:10013DF4 6800530810 push 10085300

* Possible StringData Ref from Data Obj ->"This frame can only be edited "
->"in the licensed version."
|
:10013DF9 68E0890810 push 100889E0
:10013DFE FF742414 push [esp+14]

* Reference To: USER32.MessageBoxA, Ord:01C3h
|
:10013E02 FF15E0430710 Call dword ptr [100743E0]

所以,将Audconv.dll中的
:10013DC0 7430 =>9090

呵呵...打完收工啰! 应该是没问题了.

另:在Metadata窗口中点击Save按钮(特别是连续几次"打开Metadata窗口、Save"的时候),有时候会清空所有Tag! 不知道你们有没有碰到这种情况.


WaveSurround 3.2 Demo

 标 题:砍掉WaveSurround 3.2 Demo版的过期毛病 (1千字)
发信人:Passion
时 间:2001-9-6 23:27:29
详细信息:
砍掉WaveSurround 3.2 Demo版的过期毛病
Passion
2001.9.x

WaveSurround 3.2是毛毛虫推荐的一个WINAMP环绕立体声插件，其Demo版本的时间限制形式比其老版本来说有了点变化，变成只允许使用14天，无NAG窗口。
安装的时候用一下Regmon，得知其安装的时间信息保存在
HKLM/SoftWare/Wave Arts/WaveSurround for Winamp/Expiration处，启动时检测系统时间，超过14天就过期，不过不留暗桩，时间调回来又能运行。
反反winamp的plugins目录下的dsp_wa3d.dll，查GetLocalTime字串，就一个。追到其上层是：

1000BDE7 Call 1000C930

于是就看这儿附近。

* Possible Indirect StringData Ref from Data Obj ->"Software/Wave Arts/WaveSurround "
->"for Winamp"
|
:1000BDE2 68B8D00110 push 1001D0B8
:1000BDE7 E8440B0000 call 1000C930
:1000BDEC 83C404 add esp, 00000004
:1000BDEF 83F804 cmp eax, 00000004
:1000BDF2 0F84C1000000 je 1000BEB9 //跳到正确处。
:1000BDF8 83F801 cmp eax, 00000001
:1000BDFB 754D jne 1000BE4A

…………

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000BDF2(C)

//1001E708是个比较重要的全局变量，为0时大概报错，1才正常。

:1000BEB9 C70508E7011001000000 mov dword ptr [1001E708], 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000BC4D(C)
|
:1000BEC3 33C0 xor eax, eax
:1000BEC5 81C480020000 add esp, 00000280
:1000BECB C3 ret

于是只有用暴力改字节了。
1000BDF2处：
0F 84 C1 00 00 00 ->
E9 C2 00 00 00 90
也就是je 1000BEB9变成jmp 1000BEB9 去掉过期限制。
要完美的话查找“Demostration Version”，全改成了空格“20”，哈，不仅内容是正式版，连形式也是了。


WavesurroundDEMO

标 题:jsjyt兄看看这里。 (4千字)
发信人:Passion
时 间:2001-4-22 23:56:37
详细信息:
WavesurroundDEMO程序我一直都没怎么看，抱歉。——你说的过期判断不知怎么回事，DSP_WA3D.DLL里面找不到getsytstemtime或者getlocaltime等类似的时间函数，我也搞不清它是怎样判断时间过期的。倒是那个NAG窗口很吸引人，本来还不知怎么入手的，后来找了个resource hacker可以修改资源的那种工具，把winamp的plug-in目录下的那个dsp_wa3d.dll的NAG对话框资源给删除就万事大吉了，好笑不好笑？
不过这不是正儿八经的方法。你寄给我的那个patch中对DSSP_WA3D.DLL进行了两处改动，一个是去掉DEMO的nag，一个是解除时间过期。改的地方分别是：

去NAG窗口（其实就是跳过MESSAGEBOXA）：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002041(C)
|
:100020AA 6A05 push 00000005
:100020AC 8B15C8940110 mov edx, dword ptr [100194C8]
:100020B2 52 push edx

* Reference To: USER32.ShowWindow, Ord:022Dh
|
:100020B3 FF1528D40110 Call dword ptr [1001D428]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100020A8(U)
|
:100020B9 C705C094011001000000 mov dword ptr [100194C0], 00000001
:100020C3 6A00 push 00000000

//这里把6A00改成EB18，也就是 jmp 100020DD

:100020C5 6835100010 push 10001035
:100020CA 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"DLGNag"
|
:100020CC 6898530110 push 10015398
:100020D1 A1CC940110 mov eax, dword ptr [100194CC]
:100020D6 50 push eax

* Reference To: USER32.DialogBoxParamA, Ord:008Eh
|
:100020D7 FF1510D40110 Call dword ptr [1001D410]
:100020DD 33C0 xor eax, eax //到这里。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001B68(U)
|
:100020DF 8BE5 mov esp, ebp
:100020E1 5D pop ebp
:100020E2 C3 ret

_____________________________________________________________________

时间过期：

* Reference To: KERNEL32.SetCurrentDirectoryA, Ord:020Ch
|
:10001C67 FF1574D30110 Call dword ptr [1001D374]
:10001C6D E8B2310000 call 10004E24
:10001C72 D905BC940110 fld dword ptr [100194BC]
:10001C78 D81D08400110 fcomp dword ptr [10014008]
:10001C7E DFE0 fstsw ax
:10001C80 F6C401 test ah, 01
:10001C83 7514 jne 10001C99 //改成JMP了。
:10001C85 6A00 push 00000000

至于这种浮点指令和时间判断有什么关系，就不清楚了。你所说的下文部分只是根据过期标志而作出的界面修改部分，光改它们只会引起界面的变化，内在功能即限制还是不变。

＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃
Reference To: USER32.DrawTextA, Ord:00AAh
>

>:1000319A FF156CD40110 Call dword ptr [1001D46C]
>
>:100031A0 D905BC940110 fld dword ptr [100194BC]
>
>:100031A6 D81D08400110 fcomp dword ptr [10014008]
>
>:100031AC DFE0 fstsw ax
>
>:100031AE F6C401 test ah, 01
>
>:100031B1 0F85BB000000 jne 10003272这里改成je
>
>:100031B7 68FF000000 push 000000FF
>
>:100031BC 8B55B4 mov edx, dword ptr [ebp-4C]
>
>:100031BF 52 push edx
>
>* Reference To: USER32.GetDlgItem, Ord:00F3h
>
> |
>
>:1000420F FF1554D40110 Call dword ptr [1001D454]
>
>:10004215 A308940110 mov dword ptr [10019408], eax
>
>:1000421A D905BC940110 fld dword ptr [100194BC]
>
>:10004220 D81D08400110 fcomp dword ptr [10014008]
>
>:10004226 DFE0 fstsw ax
>
>:10004228 F6C401 test ah, 01
>
>:1000422B 7575 jne 100042A2这里改成je
>
>:1000422D 6A00 push 00000000
>
>:1000422F A1D8930110 mov eax, dword ptr [100193D8]
>
>:10004234 50 push eax
>
>
>
>* Reference To: USER32.DrawTextA, Ord:00AAh
>
> |
>
>:1000319A FF156CD40110 Call dword ptr [1001D46C]
>
>:100031A0 D905BC940110 fld dword ptr [100194BC]
>
>:100031A6 D81D08400110 fcomp dword ptr [10014008]
>
>:100031AC DFE0 fstsw ax
>
>:100031AE F6C401 test ah, 01
>
>:100031B1 0F85BB000000 jne 10003272这里改成je
>
>:100031B7 68FF000000 push 000000FF
>
>:100031BC 8B55B4 mov edx, dword ptr [ebp-4C]
>
>:100031BF 52 push edx
>
>
>
>好了就这默多。
>
＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃

标 题:嗯，有点问题 (659字)
发信人:jsjyt
时 间:2001-4-23 0:19:29
详细信息:

当时我觉得任何表面现象表明可以用了，所以觉得他已经被解决了，再后来我也就没看过他，有点东西可能忘了，我觉得应该是解决了，最好的方法是在一台耳机很次的机器上听一听，我再看看，不过我想暂时想不出什么解决他内在功能限制的方法了，对了，我给你的那个好像不太好，我有改动了几个地方，请到fcg.longcity.net看看，因为在注册表中有记录时间的param一项，这一项是纪录软件使用时间的。我首先改动了它的这一项，把它改过期了，在时间过了以后可以接着试用，在一个就是它的on/off，我把他改动了，给你的patch是不行的，或者吧param中读注册表中的项目以及要调用的call，nop掉，不过这样只能听几个小时，然后param就会计数到头，提示过期，重启winamp以后,param清零，好了就这么多了，多谢大哥指教，多谢。

标 题:另一途径——不许增加。 (1千字)
发信人:Passion
时 间:2001-4-23 23:30:54
详细信息:

它的过期限制不是什么试用30天之类的，而是记录运行总时间并限制它不能超过一小时。所以在什么GETSYSTEMTIME、GETLOCALTIME、GETFILETIME等函数上下断点都对其无效（因为它根本就没用到），何况它自身是被WINAMP定时频繁调用的，WINAMP会把时间信息作为参数传递给它，因此它内部也不用什么GETTICKCOUNT之类的函数。——这种插件分析起来的难点就是难以找到时间递增代码，时间的比较代码倒是好几处，查出错信息就能找到，只是数量多（其实也不多，才四五个吧），难免挂一漏万，还是跳过时间递增代码比较保险。
倒霉的就是这种判断运算等全是浮点指令，不懂就只有猜，耽搁了不少时间。另外WINAMP在关闭时会通过这个插件把已经运行的时间秒数写入注册表，而且其值是浮点四字节格式，名称又是什么PARAM，很容易迷惑人。其实了解它的限制原理后，用BPM断点就能很快找到这段代码：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002860(C)
|
:1000286A D905BC940110 fld dword ptr [100194BC]
:10002870 D81D08400110 fcomp dword ptr [10014008]

//[10014008]处是浮点数3600，也就是一小时。

:10002876 DFE0 fstsw ax
:10002878 F6C401 test ah, 01
:1000287B 7508 jne 10002885

//把这句话修改成JNE 10002897，也就是把7508改成751A。

:1000287D 8B4510 mov eax, dword ptr [ebp+10]
:10002880 E934050000 jmp 10002DB9

就是下面这里增加时间计数：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000287B(C)
|
:10002885 DB4510 fild dword ptr [ebp+10]
:10002888 DA751C ffidiv dword ptr [ebp+1C]
:1000288B D805BC940110 fadd dword ptr [100194BC]
:10002891 D915BC940110 fst dword ptr [100194BC] //增加的时间计数写回[100194BC]
:10002897 D81D08400110 fcomp dword ptr [10014008] //让其直接跳到此处，也就是不增加时间计数了。
:1000289D DFE0 fstsw ax
:1000289F F6C401 test ah, 01
:100028A2 7515 jne 100028B9

至于NAG窗口，DEMO字串等的消除，我也懒得去跟了。——DEMO字串消除也就查找字串换成空格就行。


Windows Lotto Pro 2000 V5.39

标 题:Windows Lotto Pro 2000 V5.39之暴力破解 (10千字)
发信人:KanKer
时 间:2001-4-2 14:27:50
详细信息:
Windows Lotto Pro 2000 V5.39之暴力破解

下载地址：ftp://datasol.intnet.net/pub/lotpro32.exe
软件说明：好像是国外的一个彩票软件，限制是时间限制和NAG屏，以及功能限制。
本次破解只讨论破解前两个限制，功能限制不在讨论之列。本软件用shrink
加壳。
工具：trw2k,bw2k02,wdasm893,ultraedit

过程：

1、脱壳
先执行bw2k02，点track，运行lotpro32.exe，发现入口值为6301f4（感谢D.boy给我们
做出如此好的工具）。用TRW载入程式，设断bpx 6301f4，运行后，在此处中断，下指令pedump
（感谢刘涛涛和朱南灏作出如此棒的工具），至此脱壳成功，运行无误。

2、用wdasm893反编译，不要指望能完全反完，不过一部分亦足矣。
查看字串框，发现下面一段"Thank you for continuing to use "，呵呵，这不正是NAG屏上的话么？双点该串，来到调用空间。上下翻动看看，还有几个相似的。于是可以断定此处为判断时间限制的关键之处。下面是该段程序：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624C05(C)
|
:00624C7B 80EB01 sub bl, 01
:00624C7E 721D jb 00624C9D **不能跳**
:00624C80 0F8496000000 je 00624D1C **不能跳**

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624C11(C)
|
:00624C86 80EB02 sub bl, 02
:00624C89 0F84A3000000 je 00624D32 **不能跳**
:00624C8F 80EB03 sub bl, 03
:00624C92 0F84B0000000 je 00624D48 **不能跳**
:00624C98 E9BF000000 jmp 00624D5C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624C7E(C)
|
:00624C9D 8B87A4030000 mov eax, dword ptr [edi+000003A4]
:00624CA3 E800E5E8FF call 004B31A8
:00624CA8 83F80F cmp eax, 0000000F
:00624CAB 7534 jne 00624CE1

* Possible StringData Ref from Code Obj ->"Thank you for your interest in "
->"Windows Lotto Pro 2000. You have "
->"been granted a license to use "
->"this program for evaluation. Your "
->"evaluation period will expire "
->"in "
|
:00624CAD 68444E6200 push 00624E44
:00624CB2 8B87A4030000 mov eax, dword ptr [edi+000003A4]
:00624CB8 E8EBE4E8FF call 004B31A8
:00624CBD 8D55F4 lea edx, dword ptr [ebp-0C]
:00624CC0 E8075ADEFF call 0040A6CC
:00624CC5 FF75F4 push [ebp-0C]

* Possible StringData Ref from Code Obj ->" days. "
|
:00624CC8 68F04E6200 push 00624EF0

* Possible StringData Ref from Code Obj ->"Click on the Register Now button "
->"below for registration benefits "
->"and information on how to register."
|
:00624CCD 68004F6200 push 00624F00
:00624CD2 8D45FC lea eax, dword ptr [ebp-04]
:00624CD5 BA04000000 mov edx, 00000004
:00624CDA E80DF5DDFF call 004041EC
:00624CDF EB32 jmp 00624D13

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624CAB(C)
|

* Possible StringData Ref from Code Obj ->"Thank you for continuing to use "
->"Windows Lotto Pro 2000. You have "
->"been granted a license to use "
->"this program for evaluation. Your "
->"evaluation period will expire "
->"in "
|
:00624CE1 68704F6200 push 00624F70
:00624CE6 8B87A4030000 mov eax, dword ptr [edi+000003A4]
:00624CEC E8B7E4E8FF call 004B31A8
:00624CF1 8D55F0 lea edx, dword ptr [ebp-10]
:00624CF4 E8D359DEFF call 0040A6CC
:00624CF9 FF75F0 push [ebp-10]

* Possible StringData Ref from Code Obj ->" days. "
|
:00624CFC 68F04E6200 push 00624EF0

* Possible StringData Ref from Code Obj ->"Click on the Register Now button "
->"below for registration benefits "
->"and information on how to register."
|
:00624D01 68004F6200 push 00624F00
:00624D06 8D45FC lea eax, dword ptr [ebp-04]
:00624D09 BA04000000 mov edx, 00000004
:00624D0E E8D9F4DDFF call 004041EC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624CDF(U)
|
:00624D13 C687680E000000 mov byte ptr [edi+00000E68], 00
:00624D1A EB40 jmp 00624D5C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624C80(C)
|
:00624D1C 8D45FC lea eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"The evaluation period for Windows "
->"Lotto Pro 2000 has expired. Click "
->"on the Register Now button below "
->"for registration benefits and "
->"information on how to register."
|
:00624D1F BA1C506200 mov edx, 0062501C
:00624D24 E81BF2DDFF call 00403F44
:00624D29 C687680E000001 mov byte ptr [edi+00000E68], 01
:00624D30 EB2A jmp 00624D5C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624C89(C)
|
:00624D32 8D45FC lea eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"The evaluation period for Windows "
->"Lotto Pro 2000 has expired. Click "
->"on the Register Now button below "
->"for registration benefits and "
->"information on how register."
|
:00624D35 BAC8506200 mov edx, 006250C8
:00624D3A E805F2DDFF call 00403F44
:00624D3F C687680E000001 mov byte ptr [edi+00000E68], 01
:00624D46 EB14 jmp 00624D5C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00624C92(C)
|
:00624D48 8D45FC lea eax, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"The evaluation period for Windows "
->"Lotto Pro 2000 has expired. Click "
->"on the Register Now button below "
->"for registration benefits and "
->"information on how to register."
|
:00624D4B BA1C506200 mov edx, 0062501C
:00624D50 E8EFF1DDFF call 00403F44
:00624D55 C687680E000001 mov byte ptr [edi+00000E68], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00624C98(U), :00624D1A(U), :00624D30(U), :00624D46(U)
|
:00624D5C 8B0DBC456300 mov ecx, dword ptr [006345BC]
:00624D62 8B09 mov ecx, dword ptr [ecx]
:00624D64 B201 mov dl, 01

把上面标志不能跳的地方NOP掉，该程式的时间限制便去掉了。
随便说一句，在字串框内也有关于功能限制的语句，看一下其跳转应该也可以改掉的，

3、NAG屏的破除，这里用的是SMC的技巧。
因为虽然已经脱壳，但里面还是有很多花指令的，跳来跳去的很烦，且很难定位到哪一个CALL是显NAG屏，也很难找到其跳转处，只是在shink段内打转。于是便想到用SMC去掉它。
（1）先用TRW追NAG屏，经过一层层的追踪，将会发现455c84处一过会显NAG屏。
:00455C84 E83BFEFFFF call 00455AC4
追进去，里面很简单：
:00455AC4 53 push ebx
:00455AC5 8BD8 mov ebx, eax
:00455AC7 B201 mov dl, 01
:00455AC9 8BC3 mov eax, ebx
:00455ACB E824CEFFFF call 004528F4 **若执行CALL，则NAG屏出现，所以应暂时跳过**
:00455AD0 8BC3 mov eax, ebx
:00455AD2 E8DD3FFEFF call 00439AB4 **此CALL一定要执行，否则程式窗口不全**
:00455AD7 5B pop ebx
:00455AD8 C3 ret

但程序跳出来后，会陷入循环检测中（因要求试用要点按钮的，NAG屏虽未出现但程式认为已以有了）。下面是循环检测段：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00455CF9(C)
|
:00455CB9 8B03 mov eax, dword ptr [ebx]
:00455CBB E8042F0000 call 00458BC4
:00455CC0 8B03 mov eax, dword ptr [ebx]
:00455CC2 80B88C00000000 cmp byte ptr [eax+0000008C], 00
:00455CC9 740F je 00455CDA
:00455CCB 8B45FC mov eax, dword ptr [ebp-04]
:00455CCE C7803402000002000000 mov dword ptr [ebx+00000234], 00000002
:00455CD8 EB14 jmp 00455CEE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00455CC9(C)
|
:00455CDA 8B45FC mov eax, dword ptr [ebp-04]
:00455CDD 83B83402000000 cmp dword ptr [eax+00000234], 00000000
:00455CE4 7408 je 00455CEE
:00455CE6 8B45FC mov eax, dword ptr [ebp-04]
:00455CE9 E826FDFFFF call 00455A14

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00455CD8(U), :00455CE4(C)
|
:00455CEE 8B45FC mov eax, dword ptr [ebp-04]
:00455CF1 8B8034020000 mov eax, dword ptr [eax+00000234]
:00455CF7 85C0 test eax, eax
:00455CF9 74BE je 00455CB9 **暂时将此处NOP掉即可**
:00455CFB 8945F8 mov [ebp-08],eax

经测试可知，只要将455cf9处的跳转NOP掉即可进入主程式。但此处不能永久改变，否则程式里面的许多窗体将不能显示了（因此处是公共CALL，给窗体一个关闭信号）。
至此打补丁的地方都找到了。

（2）先用topo给程式增加一段可写空间，应该增加一段新的（大小可设为50），而不要在存在的空间里面写，因为shrink好像还要用到。

1）:00455ACB E824CEFFFF call 004528F4 改为e930753700 jmp 7cd000（跳到补丁处）
恢复455acb原先的值，以使以后的程式正常执行。
7cd000: nop
7cd001:c705cb5a4500e824ceff mov dword[455acb],ffce24e8
7cd00b:c605cf5a4500ff mov byte[455acf],ff
7cd012:e9bb8ac8ff jmp 455ad2

2):00455CF9 74BE je 00455CB9 改为e919733700 jmp 7cd017（跳到补丁处）
恢复455cf9处的代码，以使以后的程式正常执行。
7cd017:c705f95c450074be8945 mov dword[455cf9],4589be74
7cd021:c605fd5c4500f8 mov byte[455cfd],f8
7cd028:e9ce8cc8ff jmp 455cfb

OK,至此程序的两个限制完全除掉。

该篇破的虽说有点难看，但里面提到bw2k02与TRW配合脱壳的方法、wdasm893破解的方法、smc方法相信对初学者还是有一定借鉴价值的。

注：该程式可完全用smc方法破掉，只是稍复杂一些罢了。

===========<完>==============

<Cracked by KanKer>


WinRar 2.71

 标 题:WinRar 2.71 for windows的破解（暴力） (1千字)
发信人:wang beng
时 间:2000-10-11 11:28:10
详细信息:
**********************************************************************************
* Winrar 2.71 for windows一个解压缩软件 ，非常好用。 *
* 没有注册输入的地方，只能用40天，过后不断提示过期，标题栏上也提示 *
* evaluation copy,估计用keyfile注册。开始 用bpx createfilea ;bpx openfile *
* 均不能断下来。在please registion窗口上用bpx lockmytask断下后，可以发现与 *
* 28h比较，可以去掉提示窗口。但标题栏上的提示不能去掉。最后用bpx findfirstfilea *
* 终于可以断下，发现在找rarreg.*文件，就建了一个rarreg.txt文件，断下后，按几下 *
* F12，来到下面： *
**********************************************************************************

0167:0043C365 PUSH EAX
0167:0043C366 LEA EDX,[EDI+0300]
0167:0043C36C PUSH EDX
0167:0043C36D PUSH EBX
0167:0043C36E CALL 0043750C
0167:0043C373 MOV EBX,EAX
0167:0043C375 CMP EBX,[EDI+0600] -------->此处eax=ebx=0ffffffffh
0167:0043C37B JZ 0043C39B 改为jnz 0043c39b,F5,第二次还会断下。
0167:0043C37D XOR EAX,EAX
0167:0043C37F LEA EDX,[EBP-18]
0167:0043C382 PUSH EAX
0167:0043C383 PUSH BYTE +02
0167:0043C385 PUSH EDX
0167:0043C386 CALL 0043BF40
0167:0043C38B POP EAX
0167:0043C38C MOV EDX,[EBP-38]
0167:0043C38F MOV [FS:00],EDX
0167:0043C396 JMP 0043C486
0167:0043C39B CMP BYTE [EBP+08],00------>跳到此处，第一次[ebp+08]=0,第二次为1，
0167:0043C39F JZ NEAR 0043C46D 在这里改为jmp 0043c46d

改后，标题栏上没有了evaluation copy字样，也不再出现please registion窗口，about中出现了registe to 但没有名字。
在winrar 中找74 1E 33 C0 8D (JZ 0043C39B) 0F 84 C8 00 00 00 8D (JZ 0043C46D)
改75 -- -- -- -- (JNZ 0043C39B) E9 C9 00 -- -- 90 -- (JMP 0043C46D)

***************(2000/10/10/23:14)*************************
另外不知道谁能破解这个软件的注册（keyfile).请高手贴上来，让我们学习学习。先谢了。


WinRAR 2.71

标 题:WinRAR 2.71的初级破解 (4千字)
发信人:henryw
时 间:2001-2-16 21:28:04
详细信息:
WinRAR 2.71的初级破解

前两天装上WinRAR 2.71，为的是解开下载的Revirgin。发现只能用40天，那个NagDialog始终在提醒我注册。

此段时间一直在向hying兄学习脱壳的技术，看看以前破解WinRAR教程似乎不太难，想着来练练吧。

Dasm反汇编了一把，发现和以前教程里写的不同，晕倒......醒来过后只好自己开刀了。

首先发现[466CCC]这个地方很可疑，于是用trw2000下bpm 466CCC试验了一下，看到只要[466CCC]=01，
启动后WinRAR就没有了evaluation copy字样。看看About框，也有了Registered to字样。
(当然，只要用Add Files to archive就会发现NagDialog由弹了出来，然后又成了evaluation copy了。)

既然如此，就看看何时[466CCC]被程序变成了00。检查到了几处，还好不多。

经过分析，发现43C0E8往下的这个Call很有问题，它在检查rarreg.key文件，看来首先对准这里没错。

检查调用它的三个Call，以下是其中一个调用：
* Reference To: USER32.FlashWindow, Ord:0000h
|
:00418373 E81F9B0400 Call 00461E97
:00418378 6A01 push 00000001
:0041837A E8693D0200 call 0043C0E8
:0041837F A2CC6C4600 mov byte ptr [00466CCC], al <------------ al=00
:00418384 6A00 push 00000000
:00418386 8B0D24B94600 mov ecx, dword ptr [0046B924]
:0041838C 51 push ecx

那么如何将al变成01呢？从43C0E8往下走可疑看到

:0043C10C BE25814600 mov esi, 00468125
:0043C111 A5 movsd
:0043C112 A5 movsd
:0043C113 A4 movsb
:0043C114 5F pop edi
:0043C115 8D95BCFBFFFF lea edx, dword ptr [ebp+FFFFFBBC]
:0043C11B 52 push edx
:0043C11C E8AB030000 call 0043C4CC <--------- 检查rarreg.key是否存在
:0043C121 84C0 test al, al
:0043C123 7511 jne 0043C136 <--------- 有的话就跳了
:0043C125 33C0 xor eax, eax
:0043C127 8B55C8 mov edx, dword ptr [ebp-38]
:0043C12A 64891500000000 mov dword ptr fs:[00000000], edx
:0043C131 E950030000 jmp 0043C486 <---------- 这里直接就走到函数结束去了。

好吧好吧，既然我从来没有试过SMC，这次来这里试试看吧。
(大虾可不要笑话哦，焉用牛刀哉! 俺学习嘛。)

首先在文件的offset 0xF52找到了一堆的00(应该在哪里找？大虾可否指点？)，
赶紧写个patchcode在这里(详细请看toye兄主页的SMC教程)，在TRW2000里找到位置为401952。
我的想法是这样的，将43C131处先跳向401952，在这里mov eax, 01, 然后再跳回43C486，就可以了。

说干就干，立刻把43C131处的代码改为jmp 00401952，(E91C58FCFF)
以下就是在401952下汇编的代码
mov eax, 01 (B801000000) 可能改为mov al,01就可以了，不过地方宽裕嘛......
jmp 43C486 (E923AB0300)
注意记下机械码哦。

当然，只改这里是不行的，看看跳NagDialog的地方吧：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011B2(C)
|
:00401506 833DC0CC460000 cmp dword ptr [0046CCC0], 00000000
:0040150D 7546 jne 00401555
:0040150F 803D7430460000 cmp byte ptr [00463074], 00 <----- 这里干脆改为mov byte ptr [00463074], 01
:00401516 753D jne 00401555
:00401518 803DCC6C460000 cmp byte ptr [00466CCC], 00
:0040151F 7534 jne 00401555
:00401521 A1A8F54600 mov eax, dword ptr [0046F5A8]
:00401526 83F828 cmp eax, 00000028 <-------- 40天
:00401529 7F04 jg 0040152F <------ 这里显然不能让跳去。
:0040152B 85C0 test eax, eax
:0040152D 7D26 jge 00401555

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401529(C)
|
:0040152F C6057430460001 mov byte ptr [00463074], 01
:00401536 6A00 push 00000000
:00401538 68A8BA4000 push 0040BAA8
:0040153D 8B1524B94600 mov edx, dword ptr [0046B924]
:00401543 52 push edx

* Possible StringData Ref from Data Obj ->"REMINDER" <--------- NagDialog。
|
:00401544 68E73B4600 push 00463BE7
:00401549 8B0D20CC4600 mov ecx, dword ptr [0046CC20]
:0040154F 51 push ecx
======================================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040EE78(C)
|
:0040EEBC 803DCC6C460000 cmp byte ptr [00466CCC], 00
:0040EEC3 7410 je 0040EED5
:0040EEC5 803D9096470000 cmp byte ptr [00479690], 00
:0040EECC 7507 jne 0040EED5
:0040EECE C605CC6C460000 mov byte ptr [00466CCC], 00 <------ 怎么能让它放进00呢，改成mov byte ptr [00466CCC], 01

不足的是About对话框里没有俺的名字。(当然，对WinRAR没怎么用，不知道是否改彻底了。)

标 题:要显示名字只要建立一个rarreg.123(任意扩展名)，里面第二三行名字和公司。这个软件关键是几个功能限制，我... (149字)
发信人:傲世男儿
时 间:2001-2-16 23:03:24
详细信息:

标题: 要显示名字只要建立一个rarreg.123(任意扩展名)，里面第二三行名字和公司。这个软件关键是几个功能限制，我还没看到一篇功能完全破解的教程。

内容:


WinRAR 2.80 beta 4

标 题:。先在这里贴上俺的破解方法。各位请扔砖头。 (2千字)
发信人:henryw
时 间:2001-2-17 22:43:49
详细信息:

暴力破解WinRAR4.80b4。不知对否。

TRW2000下bpm 473B04，看看改成01后会如何。

* Reference To: KERNEL32.GetLocalTime, Ord:0000h
|
:0042B713 E81CC80300 Call 00467F34
:0042B718 33C0 xor eax, eax
:0042B71A E8D9A0FEFF call 004157F8 <------- 进去看看。
:0042B71F A2043B4700 mov byte ptr [00473B04], al <----- 需要al=01，否则没有注册。
:0042B724 33C0 xor eax, eax
:0042B726 E9230D0000 jmp 0042C44E

* Referenced by a CALL at Addresses:
|:0042B71A , :00433D68 , :004346FB
|
:004157F8 55 push ebp
.
.
.
* Possible StringData Ref from Data Obj ->"rarreg.*"
|
:0041581C B82D9B4600 mov eax, 00469B2D
:00415821 E8683DFFFF call 0040958E
:00415826 84C0 test al, al
:00415828 7511 jne 0041583B
:0041582A 33C0 xor eax, eax <--------- 改为 mov al, 01 (33C0改为B001)
:0041582C 8B55A4 mov edx, dword ptr [ebp-5C]
:0041582F 64891500000000 mov dword ptr fs:[00000000], edx
:00415836 E970040000 jmp 00415CAB
.
.
.
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00415836(U), :0041588C(U), :00415985(U), :004159CC(U), :00415B20(U)
|:00415BAF(U), :00415C16(U), :00415C8A(U)
|
:00415CAB 5F pop edi
:00415CAC 5E pop esi
:00415CAD 5B pop ebx
:00415CAE 8BE5 mov esp, ebp
:00415CB0 5D pop ebp
:00415CB1 C3 ret

还有一处，否则运行某些功能时还是会变为40 days trial copy的：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004248A3(C)
|
:004248CB 803D043B470000 cmp byte ptr [00473B04], 00
:004248D2 7410 je 004248E4
:004248D4 803D0035470000 cmp byte ptr [00473500], 00
:004248DB 7507 jne 004248E4
:004248DD C605043B470000 mov byte ptr [00473B04], 00 <---- 需将01放入。

应该可以了。如若不行，请诸位告知，谢谢。

标 题:请看：WinRAR 2.80 beta 4 破解手记 (8千字)
发信人:pcrocker
时 间:2001-2-17 22:51:16
详细信息:

WinRAR 2.80 beta 4 破解手记 （转载时请保持完整）
作者：Pcrocker

IP Tools最新版本： 不详
文件大小： 622KB
软件授权： 共享软件
使用平台： Win9X

软件简介：
压缩工具，就不需要说了吧

http://www.jswz.com/jstn/download/openfile.asp?softID=1930&downurl=http://61.132.97.140/soft2/wrar28b4.exe
在别处也能找得到。

没有注意看坛子里以前的文章，有可能这一板WINRAR被解过。如果有的话，我的思路可能有所不同，下面是流程：

这个软件是evaluation版本，它的注册比较麻烦，没有注册窗口：-（，好象它的40天时间限制不存在（在我的机器上如此），不知为什么？未注册版本会有一定的功能限制，具体也没耐心找。
那么只能别的角度入手，从什么角度呢？
用w32dsm反汇编，找经常出现的消息框，我 KAO！不是一个单独的CALL，太多了。找发现的两个功能限制的相关string： Log errors to file、Put authenticity vetification，也没有找到，不过在浏览string资源倒发现了另一个好东东：Thank you for support。这通常是在注册成功时才会出现的，关键点就在此处。

下面是此处代码：

:00433D88 B830734700 mov eax, 00477330
:00433D8D E87E920000 call 0043D010
:00433D92 EB0F jmp 00433DA3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00433D86(C)
|
:00433D94 BA6DB84600 mov edx, 0046B86D
:00433D99 B830734700 mov eax, 00477330
:00433D9E E879800000 call 0043BE1C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00433D92(U)

:00433DA3 803D043B470000 cmp byte ptr [00473B04], 00 <----此处有点可疑
:00433DAA 0F84DC000000 je 00433E8C <----这里跳走就死定了
:00433DB0 6A30 push 00000030

* Possible Reference to String Resource ID=00872: "Correct registration"
|
:00433DB2 B868030000 mov eax, 00000368
:00433DB7 E8A468FEFF call 0041A660
:00433DBC 50 push eax

* Possible Reference to String Resource ID=00871: "Thank you for support" <----我想亲亲你
|
:00433DBD B867030000 mov eax, 00000367
:00433DC2 E89968FEFF call 0041A660
:00433DC7 50 push eax
:00433DC8 FF351C734700 push dword ptr [0047731C]

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:00433DCE E8F7460300 Call 004684CA
:00433DD3 E9B4000000 jmp 00433E8C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00433C66(C), :00433CE5(C), :00433D06(C)
|
:00433DD8 6A00 push 00000000
:00433DDA 6A00 push 00000000

。。。。

* Reference To: SHELL32.DragFinish, Ord:0000h
|
:00433E87 E8A4430300 Call 00468230

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00433C50(U), :00433CD9(U), :00433DAA(C), :00433DD3(U), :00433DF9(C)
|
:00433E8C 81C400100000 add esp, 00001000
:00433E92 5D pop ebp
:00433E93 5F pop edi
:00433E94 5E pop esi
:00433E95 5B pop ebx
:00433E96 C3 ret

:00433E97 90 nop

下面需要老大SICE出场----同志们冲呀，我掩护。。
先运行WINRAR，^D到SICE，下bpx 473b04，不成功，原来是在系统里面。那么^D返回WINRAR，随便打开一个有输入的对话框，^D再回到SICE，下bpx hmemcpy，这样做的目的只是为取得程序的段址。^D再返回WINRAR，输入一个字符，立刻到ICE的空间中，下bd 0阻断，再下bpm 473b04（比较关键）。^D再返回WINRAR，发现伴随着操作这个中断会不停出现，不过都是读出数据，还是得找出写数据的位置。下面关闭WINRAR，再打开，立刻跳到ICE的窗口中，代码如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042B6CD(C), :0042B6DF(C)
|
:0042B6FC 53 push ebx
:0042B6FD 56 push esi

* Reference To: USER32.SetMenu, Ord:0000h
|
:0042B6FE E851CE0300 Call 00468554
:0042B703 56 push esi

* Reference To: USER32.DrawMenuBar, Ord:0000h
|
:0042B704 E829CC0300 Call 00468332
:0042B709 E832980000 call 00434F40
:0042B70E 68C8BB4700 push 0047BBC8

* Reference To: KERNEL32.GetLocalTime, Ord:0000h
|
:0042B713 E81CC80300 Call 00467F34
:0042B718 33C0 xor eax, eax
:0042B71A E8D9A0FEFF call 004157F8 <----这个CALL得追进
:0042B71F A2043B4700 mov byte ptr [00473B04], al <----你会停在这里
:0042B724 33C0 xor eax, eax
:0042B726 E9230D0000 jmp 0042C44E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042B636(C)
|
:0042B72B 83EF02 sub edi, 00000002
:0042B72E 7405 je 0042B735
:0042B730 4F dec edi
:0042B731 740E je 0042B741
:0042B733 EB16 jmp 0042B74B

|
:0042C44E 5F pop edi
:0042C44F 5E pop esi
:0042C450 5B pop ebx
:0042C451 8BE5 mov esp, ebp
:0042C453 5D pop ebp
:0042C454 C21000 ret 0010

:0042C457 90 nop

在上面的代码中，显然需要让CALL 4157F8返回的AL为非0，令AL=1即可。

bd *阻断先，下bpx 42b718，^D返回WINRAR，退出。再次运行，在ICE中F8追进那个CALL 4157F8：

* Referenced by a CALL at Addresses:
|:0042B71A , :00433D68 , :004346FB
|
:004157F8 55 push ebp
:004157F9 8BEC mov ebp, esp
:004157FB 81C408F3FFFF add esp, FFFFF308
:00415801 53 push ebx
:00415802 56 push esi
:00415803 57 push edi
:00415804 8845A3 mov byte ptr [ebp-5D], al
:00415807 BE00354700 mov esi, 00473500
:0041580C B854A94600 mov eax, 0046A954
:00415811 E8767B0400 call 0045D38C
:00415816 8D9588FBFFFF lea edx, dword ptr [ebp+FFFFFB88]

* Possible StringData Ref from Data Obj ->"rarreg.*"
|
:0041581C B82D9B4600 mov eax, 00469B2D
:00415821 E8683DFFFF call 0040958E
:00415826 84C0 test al, al
:00415828 7511 jne 0041583B <----不知道跳到下面去是否重要.
:0041582A 33C0 xor eax, eax
:0041582C 8B55A4 mov edx, dword ptr [ebp-5C]
:0041582F 64891500000000 mov dword ptr fs:[00000000], edx
:00415836 E970040000 jmp 00415CAB <----会在这里跳走

。。。。。。。。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00415836(U), :0041588C(U), :00415985(U), :004159CC(U), :00415B20(U)
|:00415BAF(U), :00415C16(U), :00415C8A(U)
|
:00415CAB 5F pop edi
:00415CAC 5E pop esi
:00415CAD 5B pop ebx
:00415CAE 8BE5 mov esp, ebp
:00415CB0 5D pop ebp
:00415CB1 C3 ret

:00415CB2 90 nop
:00415CB3 90 nop

看到了么，两个nop，我又一次发现WINRAR的可爱之处，inc al的代码是fe c0，正好是两个字母的空间。没说的，将:00415CB1处改为inc al，接下来当然是ret。
bc *清断，^D返回WINRAR，About中的 evaluation不见了，而成了register to，初战胜利。
退出WINRAR，用文件编辑器找字串：
5B 8B E5 5D C3 90 90 08 0C 00
替换为：
-- -- -- -- FE C0 C3 -- -- --

收工。

咦。。有暗桩，在ADD。。的对话框中，那个Put authenticity vetification依然选不了，于是再跟踪[00473B04]处的写入，这次是：

:004248CB 803D043B470000 cmp byte ptr [00473B04], 00
:004248D2 7410 je 004248E4 <----看到这里了吗?
:004248D4 803D0035470000 cmp byte ptr [00473500], 00
:004248DB 7507 jne 004248E4
:004248DD C605043B470000 mov byte ptr [00473B04], 00 <----显然需要nop掉

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004248D2(C), :004248DB(C)
|
:004248E4 C60520C2470001 mov byte ptr [0047C220], 01
:004248EB 803D15C2470000 cmp byte ptr [0047C215], 00
:004248F2 740E je 00424902
:004248F4 33C9 xor ecx, ecx

这回编辑文件查找所有的：
C6 05 04 3B 47 00 00
替换为：
90 90 90 90 90 90 90
还好只有一处。

我不知道还有没有类似于mov byte ptr [00473B04], al或cl之类的指令，如果测试中发现问题再解决吧。

这是我第一次利用注册成功的信息来暴力破解，经验值也该加2了吧 ^_^

我发现还是破解比写手记要容易些....


zoom1.0

标 题:谁能搞定此程序==>zoom(内详)，我吃方便面N天了! (6千字)
发信人:zest
时 间:2001-4-8 15:21:29
详细信息:
谁能搞定此程序==>zoom(内详)，我吃方便面N天了!
地址：http://www.peakstars.com/IMAGES/Zoom10.zip 573KB
简介：屏幕放大镜，有点创意。
Magnify any portion of your screen.
Capture or continously grab screen areas.
Finally be able to measure screen distances.
Register Zoom：(Price: $9.99 plus shipping).
保护：20 days trial。
问题：一、程序安装好后再安装会有警告。希望大家在第一次安装时
用监测程序看看它在哪里作了手脚。
二、把日期来回乱改会有问题，反正我的有问题。ERD恢复以前的注册信息无效。
不知程序在哪里作了手脚？
检查日期有几处？
三、在20天有效期内改程序可达到注册目的，但有效期过后改程序放大镜乱屏！
四、最好能找到注册码!

:0044E84D E87A52FBFF call 00403ACC
:0044E852 83F806 cmp eax, 00000006---->注册码为6位
:0044E855 0F85BA020000 jne 0044EB15
:0044E85B C745F4FFFFFFFF mov [ebp-0C], FFFFFFFF
:0044E862 A18C8F4600 mov eax, dword ptr [00468F8C]
:0044E867 8945E4 mov dword ptr [ebp-1C], eax
:0044E86A 33C0 xor eax, eax
:0044E86C 55 push ebp
:0044E86D 680EEB4400 push 0044EB0E
:0044E872 64FF30 push dword ptr fs:[eax]
:0044E875 648920 mov dword ptr fs:[eax], esp
:0044E878 B8288E4600 mov eax, 00468E28
:0044E87D 8B55F8 mov edx, dword ptr [ebp-08]
:0044E880 E81F50FBFF call 004038A4
:0044E885 33C0 xor eax, eax
:0044E887 55 push ebp
:0044E888 68C7EA4400 push 0044EAC7
:0044E88D 64FF30 push dword ptr fs:[eax]
:0044E890 648920 mov dword ptr fs:[eax], esp
:0044E893 8B15408F4600 mov edx, dword ptr [00468F40]
:0044E899 A1288E4600 mov eax, dword ptr [00468E28]
:0044E89E FF15048E4600 call dword ptr [00468E04]
:0044E8A4 8BD8 mov ebx, eax
:0044E8A6 891DF88D4600 mov dword ptr [00468DF8], ebx
:0044E8AC A13C8E4600 mov eax, dword ptr [00468E3C]
:0044E8B1 89581C mov dword ptr [eax+1C], ebx
:0044E8B4 B8808D4600 mov eax, 00468D80
:0044E8B9 E876EBFFFF call 0044D434
:0044E8BE 833D308E460002 cmp dword ptr [00468E30], 00000002---->关键对比
:0044E8C5 7425 je 0044E8EC
:0044E8C7 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"Zoom"
|
:0044E8C9 A130D34500 mov eax, dword ptr [0045D330]
:0044E8CE E8BD53FBFF call 00403C90
:0044E8D3 50 push eax

* Possible StringData Ref from Code Obj ->"Incorrect Key"
|
:0044E8D4 6854EB4400 push 0044EB54
:0044E8D9 8B45FC mov eax, dword ptr [ebp-04]
:0044E8DC 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:0044E8DD E87672FBFF Call 00405B58
:0044E8E2 33C0 xor eax, eax
:0044E8E4 8945F4 mov dword ptr [ebp-0C], eax
:0044E8E7 E9D1010000 jmp 0044EABD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044E8C5(C)
|
:0044E8EC 85F6 test esi, esi
:0044E8EE 740F je 0044E8FF
:0044E8F0 A1F88D4600 mov eax, dword ptr [00468DF8]
:0044E8F5 E896FCFFFF call 0044E590
:0044E8FA E9BE010000 jmp 0044EABD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044E8EE(C)
|
:0044E8FF B201 mov dl, 01

* Possible StringData Ref from Code Obj ->",罖"
|
:0044E901 A19CAA4000 mov eax, dword ptr [0040AA9C]
:0044E906 E83544FBFF call 00402D40
:0044E90B 8945EC mov dword ptr [ebp-14], eax
:0044E90E 33C0 xor eax, eax
:0044E910 8945E8 mov dword ptr [ebp-18], eax

* Possible StringData Ref from Data Obj ->"愅D"
|
:0044E913 C745E038D34500 mov [ebp-20], 0045D338

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044EA73(C)
|
:0044E91A 8B45E0 mov eax, dword ptr [ebp-20]
:0044E91D 8B00 mov eax, dword ptr [eax]
:0044E91F E8A851FBFF call 00403ACC
:0044E924 85C0 test eax, eax
:0044E926 0F8E3C010000 jle 0044EA68

......
......

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0044E926(C), :0044EA59(C)
|
:0044EA68 FF45E8 inc [ebp-18]
:0044EA6B 8345E004 add dword ptr [ebp-20], 00000004
:0044EA6F 837DE80B cmp dword ptr [ebp-18], 0000000B
:0044EA73 0F85A1FEFFFF jne 0044E91A
:0044EA79 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"Zoom"
|
:0044EA7B A130D34500 mov eax, dword ptr [0045D330]
:0044EA80 E80B52FBFF call 00403C90
:0044EA85 50 push eax
:0044EA86 FF3530D34500 push dword ptr [0045D330]

* Possible StringData Ref from Code Obj ->" successfully registered !"
|
:0044EA8C 6858EC4400 push 0044EC58
:0044EA91 6894EB4400 push 0044EB94
:0044EA96 8D45AC lea eax, dword ptr [ebp-54]
:0044EA99 BA03000000 mov edx, 00000003
:0044EA9E E8E950FBFF call 00403B8C
:0044EAA3 8B45AC mov eax, dword ptr [ebp-54]
:0044EAA6 E8E551FBFF call 00403C90
:0044EAAB 50 push eax
:0044EAAC 8B45FC mov eax, dword ptr [ebp-04]
:0044EAAF 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:0044EAB0 E8A370FBFF Call 00405B58

-=zest=-

标 题:破zoom1.0！谢谢blowfish大侠援助！但程序安装时间存放在什么地方？ (2千字)
发信人:zest
时 间:2001-4-9 12:28:37
详细信息:

破zoom1.0！谢谢blowfish大侠援助！
================================================================
一、日期限制的问题：

0167:004078D0 E863DBFFFF CALL `KERNEL32!GetLocalTime`
0167:004078D5 668B4C240E MOV CX,[ESP+0E]---->置日期
0167:004078DA 668B54240A MOV DX,[ESP+0A]---->置月份
0167:004078DF 668B442408 MOV AX,[ESP+08]---->置年份
~~ ~~~~~~~~~~~~~~~~~~~~
改0A MOV AX,[ESP+0A]====>改置月份，其它可试试
0167:004078E4 E86BFFFFFF CALL 00407854
0167:004078E9 DD1C24 FSTP QWORD [ESP]
0167:004078EC 9B WAIT
0167:004078ED DD0424 FLD QWORD [ESP]
0167:004078F0 83C418 ADD ESP,BYTE +18
0167:004078F3 C3 RET
----------------------------------------------------------------
0167:00453813 E8201CFBFF CALL `KERNEL32!GetLocalTime`
0167:00453818 668B4DDA MOV CX,[EBP-26]---->置日期
0167:0045381C 668B55D6 MOV DX,[EBP-2A]---->置月份
0167:00453820 668B45D4 MOV AX,[EBP-2C]---->置年份
~~ ~~~~~~~~~~~~~~~~~~~~
改D6 MOV AX,[ESP-2A]====>改置月份，其它可试试
0167:00453824 E82B40FBFF CALL 00407854
0167:00453829 DD5DF4 FSTP QWORD [EBP-0C]
0167:0045382C 9B WAIT
0167:0045382D 8D45E4 LEA EAX,[EBP-1C]
0167:00453830 BA48394500 MOV EDX,00453948
0167:00453835 E8AE00FBFF CALL 004038E8
0167:0045383A 6804010000 PUSH DWORD 0104
0167:0045383F 8D85CFFEFFFF LEA EAX,[EBP+FFFFFECF]
0167:00453845 50 PUSH EAX
================================================================
为什么这样改，我也是雾水一头，试出来的。
这的确是一个学破解的好软件。
日期的保护都做得那么好，
注册码的寻找就可想而知了。
跟踪了一下，计算都颇复杂。
================================================================
二、想显示注册成功，可改：

0167:00454E7A 83B8B000000002 CMP DWORD [EAX+B0],BYTE +02---->即[00468E30]见上篇
0167:00454E81 0F85A8000000 JNZ NEAR 00454F2F
~~ ~~~~~~~~~~~~~~~~~~~~~~
改84 JZ NEAR 00454F2F
0167:00454E87 33D2 XOR EDX,EDX
0167:00454E89 8B83F4010000 MOV EAX,[EBX+01F4]
0167:00454E8F E85C6DFCFF CALL 0041BBF0
0167:00454E94 33D2 XOR EDX,EDX
0167:00454E96 8B832C020000 MOV EAX,[EBX+022C]
0167:00454E9C E84F6DFCFF CALL 0041BBF0
0167:00454EA1 B201 MOV DL,01
0167:00454EA3 8B83F0010000 MOV EAX,[EBX+01F0]
================================================================

※我至今无法知道程序安装时间存放在什么地方。
哪位知道了请一定贴出来噢！
谢谢！

-=zest=- 2001.4

标 题:看它把GetLocalTime的返回值跟哪个内存单元进行比较，对那个内存单元设BPM W断点，就知道时间存在哪里了 (空)
发信人:blowfish
时 间:2001-4-9 12:43:13
详细信息:

标 题:好小子，把安装时间记录在主程序文件的偏移4C2D4H处，占一个dword (49字)
发信人:blowfish
时 间:2001-4-9 13:00:30
详细信息:

在这个dword的前后左右就是用来算注册码的一些表格。


冰雨音画 ICE Player v1.80T

标 题:爆破《冰雨音画 ICE Player v1.80T》（VB） (2千字)
发信人:小　明
时 间:2001-2-22 23:33:01
详细信息:
软件名称：冰雨音画 ICE Player v1.80T
下载地址：ftp://ftp.cq.ilike.myrice.com/soft/soft_mediatools/ZMHC.zip
破解工具：TRW2000 1.23注册版
破解过程：先运行该软件8次，直至出现试用到期的画面，退出程序，运行TRW，再运行该软件，按ctrl-N，点确定，被拦，往上看－－＞
016F:00455A0C 68605F4200 PUSH DWORD 00425F60　　　　　　　d 42560会发现“lidez”字样
016F:00455A11 68485F4200 PUSH DWORD 00425F48　　　　　　　“zhouhbone”
016F:00455A16 68305F4200 PUSH DWORD 00425F30　　　　　　　“zhangyanc”
016F:00455A1B FF1578114000 CALL `MSVBVM60!rtcGetSetting`　　读注册表HKEY_CURRENT_USER\Software\VB and VBA Program Settings\zhangyanc\zhouhbone下lidez的值，即运行次数
016F:00455A21 8BD0 MOV EDX,EAX
016F:00455A23 8D4DBC LEA ECX,[EBP-44]
016F:00455A26 FF15AC114000 CALL `MSVBVM60!__vbaStrMove`
016F:00455A2C 50 PUSH EAX
016F:00455A2D FF150C114000 CALL `MSVBVM60!__vbaI2Str`　　　变成数值
016F:00455A33 8B4D08 MOV ECX,[EBP+08]
016F:00455A36 668981A4000000 MOV [ECX+A4],AX　　　　　　　　存入[ECX+A4]
016F:00455A3D 8D4DBC LEA ECX,[EBP-44]
016F:00455A40 FF15D4114000 CALL `MSVBVM60!__vbaFreeStr`
016F:00455A46 C745FC07000000 MOV DWORD [EBP-04],07
016F:00455A4D 8B5508 MOV EDX,[EBP+08]
016F:00455A50 668B82A4000000 MOV AX,[EDX+A4]　　　　　　　　再取出来
016F:00455A57 66050100 ADD AX,01　　　　　　　　　　　加1
016F:00455A5B 0F80C1280000 JO NEAR 00458322
016F:00455A61 8B4D08 MOV ECX,[EBP+08]
016F:00455A64 668981A4000000 MOV [ECX+A4],AX
016F:00455A6B C745FC08000000 MOV DWORD [EBP-04],08
016F:00455A72 8B5508 MOV EDX,[EBP+08]
016F:00455A75 668B82A4000000 MOV AX,[EDX+A4]
016F:00455A7C 50 PUSH EAX
016F:00455A7D FF1504104000 CALL `MSVBVM60!__vbaStrI2`
016F:00455A83 8BD0 MOV EDX,EAX
016F:00455A85 8D4DBC LEA ECX,[EBP-44]
016F:00455A88 FF15AC114000 CALL `MSVBVM60!__vbaStrMove`
016F:00455A8E 50 PUSH EAX
016F:00455A8F 68605F4200 PUSH DWORD 00425F60
016F:00455A94 68485F4200 PUSH DWORD 00425F48
016F:00455A99 68305F4200 PUSH DWORD 00425F30
016F:00455A9E FF1508104000 CALL `MSVBVM60!rtcSaveSetting`　　写回注册表
知道怎么爆破了吧？只要把455a57改为XOR EAX,EAX　NOP　NOP就好了，也就是查找66050100，改为31 C0 90 90即可。


超级解霸2000

标 题:超级解霸2000(全功能限时版)破解文档 (5千字)
发信人:wocy
时 间:2001-3-26 23:17:52
详细信息:
超级解霸2000(全功能限时版)破解文档
-----------------------------------
雪椰
2001.3.26am
Email:wocy@263.net
Http://wocy.yeah.net
-----------------------------------
该版本是新电脑2000.7提供的限次限时版
时限为一个月内30次。效验方式有
1，系统目录中sthvcd.ini中，berun=x项，x---->使用次数>30则盗版提示
2，注册表中H.K_SOFTWARE_MICROSOFT_WINDOWS_CURRENTVERSION_SETUP的runtime项<=1则盗版提示
3，当前日期距安装一个月则盗版提示

破解目标：
1，无上述3项限制
2，改时间提示时的-豪杰超级解霸-字符

工具：
w32dasm,soft_ice,hiew,apatch
------------------------------------
sthsvcd.exe
------------------------------------
1,soft_ice->bpx getsystemtime 破第3项限制
going....

:00414981 50 push eax

* Reference To: KERNEL32.GetSystemTime, Ord:01C6h ---------->
|
:00414982 FF15A4064A00 Call dword ptr [004A06A4]
:00414988 8B4C2468 mov ecx, dword ptr [esp+68]
:0041498C 33C0 xor eax, eax
:0041498E 668B44246A mov ax, word ptr [esp+6A]
:00414993 81E1FFFF0000 and ecx, 0000FFFF
:00414999 C1E104 shl ecx, 04
:0041499C 8B1580874200 mov edx, dword ptr [00428780]
:004149A2 0BC8 or ecx, eax
:004149A4 33C0 xor eax, eax
:004149A6 C1E108 shl ecx, 08
:004149A9 668B44246E mov ax, word ptr [esp+6E]
:004149AE 0BC8 or ecx, eax
:004149B0 3BCA cmp ecx, edx ----------->(a)
:004149B2 7622 jbe 004149D6
:004149B4 E807B3FFFF call 0040FCC0

if you modify (a) to ...

cmp ecx,ecx
jz 4149d6

then ok

2,w32dasm->string find (berun) 破no.1限制
going...

* Possible StringData Ref from Data Obj ->"BERUN"
|
:0041493D 68C48C4200 push 00428CC4

* Possible StringData Ref from Data Obj ->"SETTING"
|
:00414942 6810674200 push 00426710

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:033Bh
|
:00414947 FF1568064A00 Call dword ptr [004A0668]
:0041494D 83FB1E cmp ebx, 0000001E ----------->(b)
:00414950 7E22 jle 00414974
:00414952 E869B3FFFF call 0040FCC0

if you modify (b) to...
cmp ecx,ecx
nop
jz 414974

then ok
3,这两项挺近的，所以查看附近代码，find... 破no.2
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041497B(C), :004149B2(C)
|
:004149D6 E875B3FFFF call 0040FD50
:004149DB 85C0 test eax, eax ------------>(c)
:004149DD 7522 jne 00414A01

if you modify (c) to...
cmp ecx,ecx
jz 414a01

then ok
4，改显示字符，
该字符在资源中找不到，所以
soft-ice->
s 0 l ffffffff ba c0 bd dc b3 ac (豪杰超)
:find at....(467b48)
bpm 467b48 w
g
重启程式.break and trace out at....(d)
:00414A1A 6A50 push 00000050
:00414A1C 68487B4600 push 00467B48
:00414A21 A1BC874200 mov eax, dword ptr [004287BC]

* Possible Reference to String Resource ID=50058: "HeroSDVD 2000"
|
:00414A26 688AC30000 push 0000C38A
:00414A2B 50 push eax

* Reference To: USER32.LoadStringA, Ord:01A9h
|
:00414A2C FF15D4084A00 Call dword ptr [004A08D4] --------->(d)
:00414A32 68D0664200 push 004266D0

实验发现在(d)执行完后467b48处为显示的字符----〉豪杰超级解霸，此字符从何来，不知道，懒的查了，决定编段程式修改467b48处的字符，
经过上面的破解，有3处空间可用
414952-414973 (用作主程式)
4149b4-4149d5 (用作存放我的字符串)
4149df-414a00 (no use)

modify 1:
:00414A2C E921FFFFFF jmp 00414952 //run my main prog
:00414A31 90 nop
modify 2:
:00414952 FF15D4084A00 Call dword ptr [004A08D4] //first run the old func
:00414958 56 push esi
:00414959 57 push edi
:0041495A BEB4494100 mov esi, 004149B4 //your char address
:0041495F BF487B4600 mov edi, 00467B48 //the dest address
:00414964 FC cld
:00414965 B922000000 mov ecx, 00000022 //char number
:0041496A F3 repz
:0041496B A4 movsb
:0041496C 5F pop edi
:0041496D 5E pop esi
:0041496E 90 nop
:0041496F E9BE000000 jmp 00414A32 //ret
modify 3:
4149b4:" Crack:wocy wocy@263.net",00,00 //the new char, 00 at end

---------------------------------------------
mmxado.exe
差不多
----------------------------------------------
5,use apatch to patch.
my .aps file here.
--------------------------------------------------------
^TITLE^
Crack:Wocy
^MESSAGE^
MAKED OF APATCH
^PRINT^"Cracking the sth2000,(2001,3,25)\n\n"
^PRINT^"Check the mmxado.exe....\n"
^FILE^ "mmxado.exe"
^SIZE^ 5f000
^GOTO^ e2eb
^WRITE^ 90 90
^GOTO^ e33a
^WRITE^ 90 90
^GOTO^ e341
^WRITE^ 3b c9 74
^PRINT^ "Done!\n"

^PRINT^"Check the sthsvcd.exe\n"
^FILE^ "sthsvcd.exe"
^SIZE" 9ca00
^GOTO^ 13d4d
^WRITE^ 3b c9 90 74
^GOTO^ 13db1
^WRITE^ c9 74
^GOTO^ 13ddb
^WRITE^ 3b c9 74
^GOTO^ 13d52
^WRITE^ ff 15 d4 08 4a 00 56 57 be b4 49 41 00 bf 48 7b 46 00 fc b9 22 00 00 00 f3 a4 5f 5e 90 e9 be 00 00 00
^GOTO^ 13e2c
^WRITE^ e9 21 ff ff ff 90
^GOTO^ 13db4
^WRITE^ 20 20 20 20 20 20 20 20 43 72 61 63 6b 3a d1 a9 d2 ac 20 77 6f 63 79 40 32 36 33 2e 6e 65 74 00 00
^PRINT^ "Done!\n"
^PRINT^"\nThanks.\n"
^PRINT^"Email:wocy@263.net\n"
^PRINT^"Http://wocy.yeah.net\n"

^END^

----------------------------------------------
6,the world clearing


超级解霸2000

                    超级解霸2000试用版的破解

    平常也不怎么看VCD，但买了电脑报2000年合订本，配套光盘里有超级解霸
2000试用版，就随手安装了，顺便练练手。
    工具：WinIce4.05、W32DASM、Hiew6.4和一只笔、纸若干。
    试用版在使用30次后会弹出过期报错窗口，运行次数记录在WINDOWS文件夹
下的STHSVCD.INI配置文件里，BERUN=运行次数。可以想象，每次启动STHSVCD，
它都先要读取BERUN项，和30比较，小于的话，则该项加1，写入STHSVCD.INI并
转入主程序执行，否则报错。那么可以下断GetPrivateProfileStringA或者下断
WritePrivateProfileStringA，考虑到STHSVCD启动时要设置多项参数，可能多
次调用GetPrivateProfileStringA可能多次被调用，不易追踪，最好利用
WritePrivateProfileStringA设断。
    bpx   writeprivateprofilestringa,
运行STHSVCD.EXE，果然...
按F12

    00414767 	push 00426724 	->"STHVCD.INI"
    0041476C 	push eax
    0041476D 	push 00428C9C 	->"BERUN"
    00414772 	push 00426710 	->"SETTING"
    00414777 	call dword ptr [004A0670]  调用WritePrivateProfileStringA
    0041477D 	cmp ebx, 0000001E  <-中断返回此处，1E即30
    00414780 	jle 004147A4    不超过30次，则跳转，否则
    00414782 	call 0040FAF0   弹出过期报错窗口
向上看

    00414732    push 00426724 	->"STHVCD.INI"
    00414737    push 00000001
    00414739    push 00428C9C 	->"BERUN"
    0041473E    push 00426710 	->"SETTING"
    00414743    Call dword ptr [004A06F8]  调用GetPrivateProfileIntA
    00414749    lea ebx,[eax+1]   将已使用次数加1，送入EBX
    0041474C    lea eax, dword ptr [esp+78]

Crack方案有两个：
1、jle 004147A4 改为 jmp 004147A4；
2、取消EBX加1的操作，lea ebx,[eax+1]改为三个NOP。
   具体修改过程就不用我再一一罗嗦了吧。
   慢着，别以为万事大吉，还有一个陷阱呢！STHSVCD还在HKEY_LOCAL_MACHINE\
Software\Microsoft\Windows\CurrentVersion\Setup处设置键值RunTime，保存剩
余的运行次数，每次运行STHSVCD，RunTime减1，当RunTime为0时，报错。根据已
有的破解成果表明，将此值改为FFFFFFFF后，再运行STHSVCD该值将保持不变。确
实这里挺难追，用DialogBoxParamA、RegQueryValueExA等均未成功。最后只有请
出“依天宝剑”——W32DASM，虽然反汇编时报错，但不睬它，继续，发现和读取
注册表有关的也就一个RegQueryValueExA，查找RegQueryValueExA字符串，在程序
中发现一处调用。

    0040FBF9    call dword ptr [004A0590]  调用RegQueryValueExA
    0040FBFF    test eax, eax
    0040FC01    je 0040FC28  返回值为0则跳转，出错

试着把je 0040FC28屏蔽(改为两个NOP，或者INC EAX，DEC EAX)，OK！无论怎么
运行STHSVCD，RunTime将保持0x63即99不变，永远也不会过期了。
    用同样的手段修改音频解霸。
    好了，今天就说到这儿，还是让我们举起双手拥护正版吧！

南阳wxd   2001-1-5
E-mail:wxd125@163.net
Oicq:21331694

                              再谈《超级解霸2000试用版的破解》

—*** 这是对《超级解霸2000试用版的破解》的修正版，介绍的较详细，很适合新手入门提高观摩 ***—

    前面我写了《超级解霸2000试用版的破解》，觉得已经成功了，但后来在解“虚拟光驱2000”时，把
日期向后调了一个月，无意中运行超级解霸，讨厌的过期报错窗口又跳了出来，我靠！还有一个陷阱！！
    于是又用W32asm详细分析了原代码，果然是三道关卡，嘿嘿，国产软件确也费尽心机。运行试用版，
先后要通过“BERUN”30次运行次数的检查、30天运行期限的检查和注册表64次运行次数的检查。你可以
用“串数据参考”查找串 "The Time is over !Please Get one Gold Version !"找到过期报错窗口代码，
如下：
———————————————————突破口————————————————————————
* Referenced by a CALL at Addresses:
|:00414782   , :004147E4   , :0041480F
|
:0040FAF0 81ECD4000000            sub esp, 000000D4
:0040FAF6 8D442454                lea eax, dword ptr [esp+54]
:0040FAFA 53                      push ebx
:0040FAFB 56                      push esi
:0040FAFC 8B0D9C874200            mov ecx, dword ptr [0042879C]

* Possible Reference to Dialog: DialogID_0080
                                  |
:0040FB02 6880000000              push 00000080

* Reference To: USER32.LoadStringA, Ord:01A9h
                                  |
:0040FB07 8B35D8084A00            mov esi, dword ptr [004A08D8]
:0040FB0D C744240CD2040000        mov [esp+0C], 000004D2
:0040FB15 50                      push eax

* Possible Reference to String Resource ID=50061: "The Time is over !
Please Get one Gold
Version !"
                                  |
:0040FB16 688DC30000              push 0000C38D
:0040FB1B 51                      push ecx
:0040FB1C FFD6                    call esi
———————————————————突破口————————————————————————

    可以看到有三处00414782、004147E4、0041480F调用了这段代码，那么一切都昭然若解了。且看我沿
着程序流程娓娓道来：

———————————————————突破防线———————————————————————
:004146E8 8D442478                lea eax, dword ptr [esp+78] ；指定返回项字串的缓冲区

* Possible StringData Ref from Data Obj ->"STHVCD.INI" ；初始化文件的名字
                                  |
:004146EC 6824674200              push 00426724

* Possible Reference to Dialog: DialogID_0080
                                  |
:004146F1 6880000000              push 00000080 ；缓冲区的最大字符数量
:004146F6 50                      push eax ；指定返回项字串的缓冲区
:004146F7 68D0664200              push 004266D0 ；指定的项没有找到时返回的默认值，此处为NULL

* Possible StringData Ref from Data Obj ->"SOURCEPATH"
                                  |
:004146FC 68A48C4200              push 00428CA4 ；欲获取的项名

* Possible StringData Ref from Data Obj ->"INSTALL" ；欲在其中查找项的小节名称
                                  |
:00414701 68D0694200              push 004269D0

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:019Fh
                                  |
:00414706 FF1564064A00            Call dword ptr [004A0664]
:0041470C 85C0                    test eax, eax
:0041470E 7422                    je 00414732 ；复制到缓冲区的字节数量为0，即STHVCD.INI无该项
:00414710 0FBE442478              movsx eax, byte ptr [esp+78] ；复制缓冲区的第一个字节到EAX
:00414715 83F861                  cmp eax, 00000061 ；和“A”比较
:00414718 7C05                    jl 0041471F
:0041471A 83F87A                  cmp eax, 0000007A ；和“Z”比较
:0041471D 7E0D                    jle 0041472C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414718(C)                                                ；猜测：如果从光盘安装解霸2000，
|                                                            ；SOURCEPATH的第一个字符被设置为
:0041471F 8A44247B                mov al, byte ptr [esp+7B]  ；小写字母，并且如果第四个字符为
:00414723 84C0                    test al, al                ；NULL(即根目录)时，如e: \，则跳
:00414725 B801000000              mov eax, 00000001          ；过BERUN值的检查，到日期检测处。
:0041472A 7402                    je 0041472E                ；如果从光盘安装，第一个字符被设
                                                             ；置为大写，需检查BERUN值
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041471D(C)
|
:0041472C 33C0                    xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041472A(C)
|
:0041472E 85C0                    test eax, eax
:00414730 7572                    jne 004147A4 ；跳到到日期检测处————————————1.1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041470E(C)
|

* Possible StringData Ref from Data Obj ->"STHVCD.INI"
                                  |
:00414732 6824674200              push 00426724
:00414737 6A01                    push 00000001

* Possible StringData Ref from Data Obj ->"BERUN"
                                  |
:00414739 689C8C4200              push 00428C9C

* Possible StringData Ref from Data Obj ->"SETTING"
                                  |
:0041473E 6810674200              push 00426710

* Reference To: KERNEL32.GetPrivateProfileIntA, Ord:0199h
                                  |
:00414743 FF15F8064A00            Call dword ptr [004A06F8]
:00414749 8D5801                  lea ebx, dword ptr [eax+01] ；将已使用次数加1，送入EBX
:0041474C 8D442478                lea eax, dword ptr [esp+78]
:00414750 53                      push ebx

* Possible StringData Ref from Data Obj ->"%d"
                                  |
:00414751 68F8664200              push 004266F8
:00414756 50                      push eax

* Reference To: USER32.wsprintfA, Ord:029Fh
                                  |
:00414757 FF15E4084A00            Call dword ptr [004A08E4]
:0041475D 8D842484000000          lea eax, dword ptr [esp+00000084]
:00414764 83C40C                  add esp, 0000000C

* Possible StringData Ref from Data Obj ->"STHVCD.INI"
                                  |
:00414767 6824674200              push 00426724
:0041476C 50                      push eax

* Possible StringData Ref from Data Obj ->"BERUN"
                                  |
:0041476D 689C8C4200              push 00428C9C

* Possible StringData Ref from Data Obj ->"SETTING"
                                  |
:00414772 6810674200              push 00426710

* Reference To: KERNEL32.WritePrivateProfileStringA, Ord:033Bh
                                  |
:00414777 FF1570064A00            Call dword ptr [004A0670]
:0041477D 83FB1E                  cmp ebx, 0000001E
:00414780 7E22                    jle 004147A4 ；不超过30次，则跳转到日期检测处—————1.2
:00414782 E869B3FFFF              call 0040FAF0 ；否则弹出过期报错窗口
:00414787 A19C874200              mov eax, dword ptr [0042879C]
:0041478C 8B0D98874200            mov ecx, dword ptr [00428798]
:00414792 3BC1                    cmp eax, ecx
:00414794 7407                    je 0041479D
:00414796 50                      push eax

* Reference To: KERNEL32.FreeLibrary, Ord:0133h
                                  |
:00414797 FF15F0064A00            Call dword ptr [004A06F0]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414794(C)
|
:0041479D 33C0                    xor eax, eax
:0041479F E972070000              jmp 00414F16

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00414730(C), :00414780(C)
|
:004147A4 A160874200              mov eax, dword ptr [00428760] ；猜测：如果是正版安装，则变
:004147A9 85C0                    test eax, eax                 ；量[00428760]=0，跳转到注册
:004147AB 7459                    je 00414806 —————————————————————2.1
:004147AD 8D442468                lea eax, dword ptr [esp+68]   ；表检查处；否则[00428760]存
:004147B1 50                      push eax                      ；放有效期限信息

* Reference To: KERNEL32.GetSystemTime, Ord:01C6h
                                  |
:004147B2 FF15AC064A00            Call dword ptr [004A06AC]
:004147B8 8B4C2468                mov ecx, dword ptr [esp+68] ；当前日期，以下代码为日期格式
:004147BC 33C0                    xor eax, eax
:004147BE 668B44246A              mov ax, word ptr [esp+6A]
:004147C3 81E1FFFF0000            and ecx, 0000FFFF
:004147C9 C1E104                  shl ecx, 04
:004147CC 8B1560874200            mov edx, dword ptr [00428760]
:004147D2 0BC8                    or ecx, eax
:004147D4 33C0                    xor eax, eax
:004147D6 C1E108                  shl ecx, 08
:004147D9 668B44246E              mov ax, word ptr [esp+6E]
:004147DE 0BC8                    or ecx, eax
:004147E0 3BCA                    cmp ecx, edx ；和有效期限比较，
:004147E2 7622                    jbe 00414806 ；未过期，跳到注册表RunTime键值的检查处——2.2
:004147E4 E807B3FFFF              call 0040FAF0 ；弹出过期报错窗口
:004147E9 A19C874200              mov eax, dword ptr [0042879C]
:004147EE 8B0D98874200            mov ecx, dword ptr [00428798]
:004147F4 3BC1                    cmp eax, ecx
:004147F6 7407                    je 004147FF
:004147F8 50                      push eax

* Reference To: KERNEL32.FreeLibrary, Ord:0133h
                                  |
:004147F9 FF15F0064A00            Call dword ptr [004A06F0]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004147F6(C)
|
:004147FF 33C0                    xor eax, eax
:00414801 E910070000              jmp 00414F16

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004147AB(C), :004147E2(C)
|
:00414806 E875B3FFFF              call 0040FB80 ；返回KEY_LOCAL_MACHINE\Software\Microsoft
:0041480B 85C0                    test eax, eax ；\Windows\CurrentVersion\Setup键值RunTime
:0041480D 7522                    jne 00414831 ；RunTime不为0，祝贺你能看VCD了！！————3
:0041480F E8DCB2FFFF              call 0040FAF0 ；弹出过期报错窗口
:00414814 8B0D9C874200            mov ecx, dword ptr [0042879C]
:0041481A A198874200              mov eax, dword ptr [00428798]
:0041481F 3BC8                    cmp ecx, eax
:00414821 7407                    je 0041482A
:00414823 51                      push ecx

* Reference To: KERNEL32.FreeLibrary, Ord:0133h
                                  |
:00414824 FF15F0064A00            Call dword ptr [004A06F0]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414821(C)
|
:0041482A 33C0                    xor eax, eax
:0041482C E9E5060000              jmp 00414F16

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041480D(C)
|
:00414831 33DB                    xor ebx, ebx ；精彩世界由此进入......
———————————————————突破防线———————————————————————

—————————————————对注册表的相关操作————————————————————
* Referenced by a CALL at Address:
|:00414806
|
:0040FB80 83EC10                  sub esp, 00000010
:0040FB83 8D442404                lea eax, dword ptr [esp+04]
:0040FB87 53                      push ebx
:0040FB88 56                      push esi
:0040FB89 50                      push eax
:0040FB8A 681F000200              push 0002001F
:0040FB8F 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"SOFTWARE\Microsoft\Windows\CurrentVersion\Setu"
                                        ->"p"
                                  |
:0040FB91 689C7F4200              push 00427F9C
:0040FB96 6802000080              push 80000002

* Reference To: ADVAPI32.RegOpenKeyExA, Ord:00EFh
                                  |
:0040FB9B FF1598054A00            Call dword ptr [004A0598]
:0040FBA1 85C0                    test eax, eax
:0040FBA3 7424                    je 0040FBC9 ；成功打开键，则跳，否则创建键
:0040FBA5 8D44240C                lea eax, dword ptr [esp+0C]
:0040FBA9 50                      push eax

* Possible StringData Ref from Data Obj ->"SOFTWARE\Microsoft\Windows\CurrentVersion\Setu"
                                        ->"p"
                                  |
:0040FBAA 689C7F4200              push 00427F9C
:0040FBAF 6802000080              push 80000002

* Reference To: ADVAPI32.RegCreateKeyA, Ord:00DBh
                                  |
:0040FBB4 FF1594054A00            Call dword ptr [004A0594]
:0040FBBA 85C0                    test eax, eax
:0040FBBC 740B                    je 0040FBC9 ；成功创建键，则跳，否则EAX=FFFFFFFF，返回
:0040FBBE B8FFFFFFFF              mov eax, FFFFFFFF
:0040FBC3 5E                      pop esi
:0040FBC4 5B                      pop ebx
:0040FBC5 83C410                  add esp, 00000010
:0040FBC8 C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040FBA3(C), :0040FBBC(C)
|
:0040FBC9 BE04000000              mov esi, 00000004
:0040FBCE 8D442410                lea eax, dword ptr [esp+10]
:0040FBD2 8D4C2408                lea ecx, dword ptr [esp+08]
:0040FBD6 50                      push eax
:0040FBD7 8D542418                lea edx, dword ptr [esp+18]
:0040FBDB 51                      push ecx
:0040FBDC 8B442414                mov eax, dword ptr [esp+14]
:0040FBE0 52                      push edx
:0040FBE1 8974241C                mov dword ptr [esp+1C], esi
:0040FBE5 6A00                    push 00000000
:0040FBE7 89742424                mov dword ptr [esp+24], esi
:0040FBEB 68947F4200              push 00427F94
:0040FBF0 C744241C00000000        mov [esp+1C], 00000000
:0040FBF8 50                      push eax

* Reference To: ADVAPI32.RegQueryValueExA, Ord:00F7h
                                  |
:0040FBF9 FF1590054A00            Call dword ptr [004A0590]
:0040FBFF 85C0                    test eax, eax ；在这里我曾失误过，改为无条件跳转
:0040FC01 7425                    je 0040FC28 ；成功读取键值，则跳，否则设置键值RunTime=64
:0040FC03 8D442408                lea eax, dword ptr [esp+08]
:0040FC07 56                      push esi
:0040FC08 8B4C2410                mov ecx, dword ptr [esp+10]
:0040FC0C 50                      push eax
:0040FC0D C744241064000000        mov [esp+10], 00000064
:0040FC15 56                      push esi
:0040FC16 6A00                    push 00000000
:0040FC18 68947F4200              push 00427F94

* Reference To: ADVAPI32.RegSetValueExA, Ord:0103h
                                  |
:0040FC1D 8B359C054A00            mov esi, dword ptr [004A059C]
:0040FC23 51                      push ecx
:0040FC24 FFD6                    call esi
:0040FC26 EB06                    jmp 0040FC2E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FC01(C)
|

* Reference To: ADVAPI32.RegSetValueExA, Ord:0103h
                                  |
:0040FC28 8B359C054A00            mov esi, dword ptr [004A059C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FC26(U)
|
:0040FC2E 8B442408                mov eax, dword ptr [esp+08] ；RunTime键值->eax
:0040FC32 85C0                    test eax, eax
:0040FC34 7421                    je 0040FC57 ；为0则跳，表示已到期了
:0040FC36 83F8FF                  cmp eax, FFFFFFFF ；为FFFFFFFF则跳，为什么RunTime=FFFFFFFF
:0040FC39 741C                    je 0040FC57       ；永不过期，明白了吧！！
:0040FC3B 48                      dec eax ；RunTime键值减1
:0040FC3C 6A04                    push 00000004
:0040FC3E 8D4C240C                lea ecx, dword ptr [esp+0C]
:0040FC42 8B542410                mov edx, dword ptr [esp+10]
:0040FC46 8944240C                mov dword ptr [esp+0C], eax
:0040FC4A 51                      push ecx
:0040FC4B 6A04                    push 00000004
:0040FC4D 6A00                    push 00000000
:0040FC4F 68947F4200              push 00427F94
:0040FC54 52                      push edx
:0040FC55 FFD6                    call esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040FC34(C), :0040FC39(C)
|
:0040FC57 8B44240C                mov eax, dword ptr [esp+0C]
:0040FC5B 50                      push eax

* Reference To: ADVAPI32.RegCloseKey, Ord:00D8h
                                  |
:0040FC5C FF15A0054A00            Call dword ptr [004A05A0]
:0040FC62 8B442408                mov eax, dword ptr [esp+08] ；RunTime键值->eax
:0040FC66 5E                      pop esi
:0040FC67 5B                      pop ebx
:0040FC68 83C410                  add esp, 00000010
:0040FC6B C3                      ret
—————————————————对注册表的相关操作————————————————————

    诸位，明白了么？什么，还没有？！#^$~&那就再好好看看看雪的教程吧！怎样打补丁就不用我多说了，
在1.1或1.2、2.1或2.2、3处改为无条件跳转就Ok。

--### 严正声名 ###--
    以上内容只能用于经验交流领域，严禁商业用途，请维护正版利益！
    版权所有，请保障文章的完整性！

woLONGwxd   2001-1-20
E-mail:wxdny@263.net


超级解霸2000

标 题:《超级解霸2000》试用版的使用限制解除 (276字)
发信人:夜月
时 间:2001-1-19 10:51:51
详细信息:
《超级解霸2000》试用版的使用限制解除：
梁肇新的《超级解霸2000》试用版只能使用100次，他将安装信息存放在两个地方：
1.注册表中：
[HKEY-LOCAL-MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\SETUP]
RUNTIME的值
2.ini文件中：
C:\WINDOWS\STHVCD.INI
[SETTING]
BERUN=
标 题:上次写的还是有点问题 (337字)
发信人:夜月
时 间:2001-9-2 8:41:19
详细信息:
上次写的还是有点问题,我自己在使用的过程中发现:上面两处只是校验使用次数的,程序在别的地方还有
校验时间的代码.不过,如果你把我上篇文章里面提到的两个地方的值恢复到安装时的状态的话,如果还不
能使用,则请把系统时间往前调一点应该就可以使用了(我自己一直在用这个试用版,按这种方法改没问题
的),如果嫌每次用的时候改时间麻烦,可以用AnyDay或者类似软件!


超级解霸2000 限时

 标 题:《超级解霸2000 限时作废试用版》的破解方法 (3千字)
发信人:RATARICE[BCG]
时 间:2001-6-15 23:49:37
详细信息:
《超级解霸2000 限时作废试用版》的破解方法
作者：RATARICE[BCG]
目标：超级解霸2000 限时作废试用版
关于它我就不多说什么了。
工具：TRW2000 1.22、ULTRAEDIT-32
过程：
一、 大家都知道超级解霸5.5可以通过该注册表的RUNTIME项，使它多运行几次，解霸2000也可以这样做。但 那不是学破解的风格。所以我写了它的破解方法。
二、 启动TRW2000，动态跟踪它，到下面：

015F:00414947 CALL `KERNEL32!WritePrivateProfileStringA` 比较你这次共用了几次，
015F:0041494D CMP EBX,BYTE +1E ---------------------------->大于30就出错
015F:00414950 JNG 00414974 -------------------------------->所以这里要跳
015F:00414952 CALL 0040FCC0
015F:00414957 MOV ECX,[004287BC]
015F:0041495D MOV EAX,[004287B8]
015F:00414962 CMP ECX,EAX
015F:00414964 JZ 0041496D
015F:00414966 PUSH ECX
015F:00414967 CALL `KERNEL32!FreeLibrary`
015F:0041496D XOR EAX,EAX
015F:0041496F JMP 004150EF
015F:00414974 MOV EAX,[00428780]
015F:00414979 TEST EAX,EAX
015F:0041497B JZ 004149D6
015F:0041497D LEA EAX,[ESP+68]
015F:00414981 PUSH EAX
015F:00414982 CALL `KERNEL32!GetSystemTime`
015F:00414988 MOV ECX,[ESP+68]
015F:0041498C XOR EAX,EAX
015F:0041498E MOV AX,[ESP+6A]
015F:00414993 AND ECX,FFFF
015F:00414999 SHL ECX,04
015F:0041499C MOV EDX,[00428780]
015F:004149A2 OR ECX,EAX
015F:004149A4 XOR EAX,EAX
015F:004149A6 SHL ECX,08
015F:004149A9 MOV AX,[ESP+6E]
015F:004149AE OR ECX,EAX
015F:004149B0 CMP ECX,EDX
015F:004149B2 JNA 004149D6
015F:004149B4 CALL 0040FCC0
015F:004149B9 MOV ECX,[004287BC]
015F:004149BF MOV EAX,[004287B8]
015F:004149C4 CMP ECX,EAX
015F:004149C6 JZ 004149CF
015F:004149C8 PUSH ECX
015F:004149C9 CALL `KERNEL32!FreeLibrary`
015F:004149CF XOR EAX,EAX
015F:004149D1 JMP 004150EF
015F:004149D6 CALL 0040FD50 -------------------------------->进入
015F:004149DB TEST EAX,EAX --------------------------------->比较是否成功
015F:004149DD JNZ 00414A01 -------------------------------->成功就跳
015F:004149DF CALL 0040FCC0 -------------------------------->出错信息

进入CALL 0040FD50 代码如下：

015F:0040FD57 PUSH EBX
015F:0040FD58 PUSH ESI
015F:0040FD59 PUSH EAX
015F:0040FD5A PUSH DWORD 0002001F
015F:0040FD5F PUSH BYTE +00
015F:0040FD61 PUSH DWORD 00427FBC
015F:0040FD66 PUSH DWORD 80000002
015F:0040FD6B CALL `ADVAPI32!RegOpenKeyExA`
015F:0040FD71 TEST EAX,EAX
015F:0040FD73 JZ 0040FD99 ------------------------------>不要跳
015F:0040FD75 LEA EAX,[ESP+0C]
015F:0040FD79 PUSH EAX
015F:0040FD7A PUSH DWORD 00427FBC
015F:0040FD7F PUSH DWORD 80000002
015F:0040FD84 CALL `ADVAPI32!RegCreateKeyA`
015F:0040FD8A TEST EAX,EAX
015F:0040FD8C JZ 0040FD99 ------------------------------>不要跳
015F:0040FD8E MOV EAX,FFFFFFFF
015F:0040FD93 POP ESI
015F:0040FD94 POP EBX
015F:0040FD95 ADD ESP,BYTE +10
015F:0040FD98 RET

三、 关掉TRW2000和解霸2000，启动ULTRAEDIT-32
找到 7E 22 E8 69 B3 FF FF 8B
^^ ^^---------------------->改为 EB 22
找到 74 24 8D 44 24 0C 50 68
^^ ^^---------------------->改为 90 90
找到 74 0B B8 FF FF FF FF 5E
^^ ^^---------------------->改为 90 90

0K！不论RUNTIME的值是几，就算是零！也可以安然享用超级解霸2000带来的快感了！


俄罗斯方块

 标 题:巨好的俄罗斯方块时间限制破解 (1千字)
发信人:小球[CCG]
时 间:2001-5-4 18:51:26
详细信息:
巨好的俄罗斯方块时间限制破解
软件下载地址：URL http://www.downme.com/download/10655rotoblox.zip
该软件有14天的限制，而且被加了壳，可是用fi查不到是什么壳！呵呵...还好用caspr1012可以脱掉，可是脱掉后却变成了-1天了而且无法运行了！呵呵..挺有趣的。破解方法也很有意思！请看：
用ice或是trw载入脱壳后的文件，load它。
一直按F10找它的出错框。
:00408161 FF15D8314100 call dword ptr [004131D8] **这里提示出错框
:00408167 391DD85B4100 cmp dword ptr [00415BD8], ebx **比较
:0040816D 7F0B jg 0040817A **还有剩余天数的话就正常运行注意跳转地址是0040817A
:0040816F 5F pop edi
:00408170 5E pop esi
:00408171 33C0 xor eax, eax
:00408173 5B pop ebx
:00408174 8BE5 mov esp, ebp
:00408176 5D pop ebp
:00408177 C21000 ret 0010
重新load它，来到他的上面：
:00408148 85C0 test eax, eax **测试提示框
:0040814A 7508 je 00408154 **这里要跳的，用r fl z（爆破时改为jne）
:0040814C 381D31984100 cmp byte ptr [00419831], bl
:00408152 7426 jne 0040817A **注意跳转地址是0040817A。当然要跳了。用r fl z（爆破时改为je）
基本上搞定，可是有意识的事来了。在你选择play玩时，游戏框里出现unregsitered version字样。这可如何是好？反编译它也找不到。用winhex试试吧！查找unregsitered version，果真找到，找到后又怎么办。干脆全改成00吧？呵呵....不行哦！不信？你试试！那就全改成20吧！呵呵....play试试。搞定！收工！


分析家V4.0

标 题:解除分析家V4.0试用版时间限制 (2千字)
发信人:KINGSUN
时 间:2001-4-15 13:12:36
详细信息:
首先用SOFT-ICE的SYMBOL LOADER加载SUPERSTK.EXE，发现无法加载，程序入口不对。
本人水平幼稚园一年级，不懂修改程序入口，用TPY查看没有加壳，试在SOFT-ICE平台上
运行没问题，看来还有点点希望，就搞搞吧！

1.改系统时间=2001-06-01；（五一节就过期，六一节可要关心小朋友哦！）
2.BPX GETSYSTEMTIME；
3.运行SUPERSTK.EXEV4.0，中断成功；
4.按F5键3次，第4次就出现过期提示，小心哦！
5.按F12键1次，停在下面程序段；
:00495053 FF15F4224E00 Call dword ptr[004E22F4]----[GETSYSTEMTIME]
:00495059 668B45EA mov ax, word ptr [ebp-16]
:0049505D 663B05D2FB5100 cmp ax, word ptr [0051FBD2]
:00495064 753B jne 004950A1
:00495066 668B45E8 mov ax, word ptr [ebp-18]
:0049506A 663B05D0FB5100 cmp ax, word ptr [0051FBD0]
:00495071 752E jne 004950A1
:00495073 668B45E6 mov ax, word ptr [ebp-1A]---[当前DAY]
:00495077 663B05CEFB5100 cmp ax, word ptr [0051FBCE]
:0049507E 7521 jne 004950A1
:00495080 668B45E2 mov ax, word ptr [ebp-1E]---[当前MONTH]
:00495084 663B05CAFB5100 cmp ax, word ptr [0051FBCA]
:0049508B 7514 jne 004950A1
:0049508D 668B45E0 mov ax, word ptr [ebp-20]----[当前YEAR]
:00495091 663B05C8FB5100 cmp ax, word ptr [0051FBC8]
:00495098 7507 jne 004950A1
:0049509A A1C0FB5100 mov eax, dword ptr [0051FBC0]
:0049509F EB45 jmp 004950E6
6.慢慢来吧，再按F12键1次，停在下面程序段
:00483E63 E8D4110100 call 0049503C
:00483E68 3D008CED3A cmp eax, 3AED8C00 --比较点
:00483E6D 59 pop ecx
:00483E6E 7E11 jle 00483E81---NO JUMP就出现时间过期提示
:00483E70 53 push ebx
:00483E71 53 push ebx

* Possible StringData Ref from Data Obj ->"测试版已经过期，请与深圳汇天奇联系升级!"-----在W32DASM中这段中文可是乱码，COPY到记事本中就一清二楚，哇噻！ |
:00483E72 68089B5100 push 00519B08
:00483E77 E8D4320300 call 004B7150----时间过期提示
:00483E7C E9E0050000 jmp 00484461
7.一切都清楚了， 除错方法改JLE 00483E81 为 EB 00483E81；
机器码：3D008CED3A597E11
------------EB--
希望大家从中得到一些启发，有谁愿意做成补丁放到网上，给大家方便方便！？

KINGSUN

2001-4-15


金山毒霸

 标 题:金山毒霸试用版完全破解 (5千字)
发信人:多情俏狐
时 间:2001-7-16 17:58:41
详细信息:
金山毒霸试用版完全破解
===============================================================================
Henan China Peiyou

破解对象:金山毒霸2001-06-16试用版

下载地址:ftp://202.102.249.209/files/ftproot/3/iDuba_trial616.EXE

所用工具:1. w32dasm 8.93 超级增强版(感谢中国的cracker们的修改)
2. fi 2.40
3.unaspack211(其它版本好象不行,这个软件比较牛，win9x界面绝酷解压软件竟然只有8K)
http://mud.sz.jsinfo.net/per/aaron/files/unpackers/win/unaspack211c.zip
4.trw2000 1.22

用exescope查看，提示已压缩，用Fi查看不能识别所加壳的类型。

只好用trw2000跟踪，加载F10执行，看到什么了-----Kav9x!aspack

不会吧!!!这真是歪打正着，随决定向解压缩，再跟踪。

用aspack1.09解压，提示未压缩，我Kao,明明压缩了，装什么蒜!

到网上找了个unaspack211解压缩成功.

用w32dasm超级增强版，串式参考（右二)按钮，找到出错信息，按如下修改，成功破解:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C7704(C)
|
:004C7711 E80AF6FFFF call 004C6D20
:004C7716 84C0 test al, al
:004C7718 0F85B5000000 jne 004C77D3==============================>跳转I
应改 0F 85 B5 00 0000 改为 E9 B6 00 00 00 90
:004C771E A134D34C00 mov eax, dword ptr [004CD334]
:004C7723 8B00 mov eax, dword ptr [eax]
:004C7725 8B5024 mov edx, dword ptr [eax+24]
* Possible StringData Ref from Code Obj ->"序列号不正确，请重新安装金山毒霸！"
|
:004C7728 B8C07E4C00 mov eax, 004C7EC0
:004C772D E87AA8FBFF call 00481FAC
:004C7732 E8DDBFF3FF call 00403714
:004C7737 E916060000 jmp 004C7D52

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C76EF(C)
|
:004C773C A184F94C00 mov eax, dword ptr [004CF984]

* Possible StringData Ref from Code Obj ->"SHAREVERSION"
|
:004C7741 BAEC7E4C00 mov edx, 004C7EEC
:004C7746 E889C8F3FF call 00403FD4
:004C774B 7409 je 004C7756
:004C774D 833D84F94C0000 cmp dword ptr [004CF984], 00000000
:004C7754 7527 jne 004C777D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C774B(C)
|
:004C7756 E8319DFBFF call 0048148C
:004C775B 84C0 test al, al
:004C775D 7574 jne 004C77D3==============================>跳转II
:004C775F A134D34C00 mov eax, dword ptr [004CD334]
:004C7764 8B00 mov eax, dword ptr [eax]
:004C7766 8B5024 mov edx, dword ptr [eax+24]

* Possible StringData Ref from Code Obj ->"试用版已过期！"
|
:004C7769 B8FC7E4C00 mov eax, 004C7EFC
:004C776E E839A8FBFF call 00481FAC
:004C7773 E89CBFF3FF call 00403714
:004C7778 E9D5050000 jmp 004C7D52

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C7754(C)===================================>如果没有这个调用4c7795处的跳转就不用改了。
|
:004C777D A184F94C00 mov eax, dword ptr [004CF984]

* Possible StringData Ref from Code Obj ->"NETEASE"
|
:004C7782 BA147F4C00 mov edx, 004C7F14
:004C7787 E848C8F3FF call 00403FD4
:004C778C 7527 jne 004C77B5===============>改为 jmp 004C77D3
:004C778E E8F99CFBFF call 0048148C

应这样改:75 27 E8 F9 9C FB FF改为 E9 42 00 00 00 90 90

为了学会这种改法，我可费了好大劲。

:004C7793 84C0 test al, al
:004C7795 753C jne 004C77D3==============================>跳转III
:004C7797 A134D34C00 mov eax, dword ptr [004CD334]
:004C779C 8B00 mov eax, dword ptr [eax]
:004C779E 8B5024 mov edx, dword ptr [eax+24]

* Possible StringData Ref from Code Obj ->"网易专用版已过期！"
|
:004C77A1 B81C7F4C00 mov eax, 004C7F1C
:004C77A6 E801A8FBFF call 00481FAC
:004C77AB E864BFF3FF call 00403714
:004C77B0 E99D050000 jmp 004C7D52

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C778C(C)
|
:004C77B5 A134D34C00 mov eax, dword ptr [004CD334]
:004C77BA 8B00 mov eax, dword ptr [eax]
:004C77BC 8B5024 mov edx, dword ptr [eax+24]

* Possible StringData Ref from Code Obj ->"不可识别的版本！"
|
:004C77BF B8307F4C00 mov eax, 004C7F30
:004C77C4 E8E3A7FBFF call 00481FAC
:004C77C9 E846BFF3FF call 00403714
:004C77CE E97F050000 jmp 004C7D52

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004C770B(C), :004C7718(C), :004C775D(C), :004C7795(C)
|正常执行程序:
:004C77D3 B201 mov dl, 01

以上三处跳转的75改为EB即可，其实只改跳转2即可去除过期提示，但我怕在什么条件下又来个NAG,所以一不做二不休，干脆改完全算了，省得日后麻烦。

如果想压缩，可以再用aspack或upx等一些优秀压缩软件再压一下。


流光2001

详细信息:
解除流光2001的时间限制
版本：流光2001 Preview 1 For Win98
下载：小榕软件 http://www.netxeyes.com/
=========================================
(1)用w32dsm打开软件，找到过期提示处：
--------------------------
* Possible StringData Ref from Data Obj
->"【流光 2001】已经到期，请到http://www.netXeyes"
->".com下载新版本。"
--------------------------
(2)向上查到：
--------------------------
:004061F9 FF15F0D64800 Call dword ptr [0048D6F0]
:004061FF 8B442410 mov eax, dword ptr [esp+10]
:00406203 83C404 add esp, 00000004
:00406206 3DA1209D3A cmp eax, 3A9D20A1
:0040620B 7E4C jle 00406259 //修改
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:0040620D 6A00 push 00000000
:0040620F 8D4C2434 lea ecx, dword ptr [esp+34]
---------------------------
(3)启动软件,什么?跳出窗口提示:"数字验证失败，可能被病毒感染或者捆绑
了恶意程序"
没关系,找到提示处,查到检测点:
---------------------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406A0C(U)
|
:00406A13 85C0 test eax, eax
:00406A15 7439 je 00406A50 //修改
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:00406A17 A148FB4A00 mov eax, dword ptr [004AFB48]
:00406A1C 51 push ecx
:00406A1D 85C0 test eax, eax
:00406A1F 8BCC mov ecx, esp
:00406A21 740B je 00406A2E
:00406A23 89642424 mov dword ptr [esp+24], esp
------------------------------
这回再进入,ok

欢迎光临《阿郎居》
langlirong@163.net
http://alang.shangdu.net

05-02-2001


拼音之星千禧世纪版

标 题:解《拼音之星千禧世纪版》试用时间过期问题，难度：0.01级，高手勿看。 (2千字)
发信人:zest
时 间:2001-1-17 23:29:15
详细信息:
解《拼音之星千禧世纪版》试用时间过期问题，难度：0.01级，高手勿看。
忘记在哪里下载了，好像是知名网站如newhua等。
Taizi32.exe为326KB
此版本好像无拼音之星2000好用。
希望大家都能看懂！
Let's begin
怎么？没过期？调到3000年看看？3000年哪，朋友啊朋友，你可曾想起了我？

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040FB5B(U), :0040FCAF(C), :0040FCBE(C), :0040FE3D(U), :0040FE42(U)
|:0040FE47(U), :0040FE4C(U), :0040FE51(U), :0040FE56(U)
|
:0040FD23 83BD9CFEFFFF01 cmp dword ptr [ebp+FFFFFE9C], 00000001
:0040FD2A 751B jne 0040FD47
^^
改EB即可！
:0040FD2C 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"拼音之星千禧版试用时间已过"
|
:0040FD2E 68B40E4300 push 00430EB4

* Possible StringData Ref from Data Obj ->"感谢使用拼音之星汉字输入系统。
请与以下地址联?
->"倒郝蛘桨?电子邮购88圆
汇款地址:北京市西三环"
->"中路中塔园5号楼3门503, 王娟
邮编100036, "
->"电子邮件tanyj@sarft.gov.cn,电话010-68464333"
|
:0040FD33 68D00E4300 push 00430ED0
:0040FD38 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0195h
|
:0040FD3A FF15ECA44800 Call dword ptr [0048A4EC] ===>bye!!
:0040FD40 33C0 xor eax, eax
:0040FD42 E914010000 jmp 0040FE5B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FD2A(C)
|
:0040FD47 8B4514 mov eax, dword ptr [ebp+14]

附：去除启动时不太难看的图位BITMAP===>拼音之星千禧世纪版的显示。
:00415CFD 6A00 push 00000000
:00415CFF 6A00 push 00000000
:00415D01 8B4D98 mov ecx, dword ptr [ebp-68]
:00415D04 51 push ecx

* Reference To: GDI32.BitBlt, Ord:000Ah
|
:00415D05 FF15F4A24800 Call dword ptr [0048A2F4]
^^^^^^^^^^^^
改909090909090
:00415D0B 8B559C mov edx, dword ptr [ebp-64]
:00415D0E 52 push edx
:00415D0F 8B45F8 mov eax, dword ptr [ebp-08]
:00415D12 50 push eax

/\zest/\


破流光2001

 标 题:完全暴破流光2001(补充了上网后还出错误提示的BUG) (5千字)
发信人:多情俏狐
时 间:2001-8-29 23:16:52
详细信息:
流光2001完全暴力破解
================================================
hehan china 多情俏狐
(转载请保持完整)

软件说明:小榕黑客软件系列产品中主打产品，能对pop3,ftp,http服务器及其它密码进行快速猜解。还兼有追捕和双向IP查询功能。

所用工具:trw2000,hedit和w32dasm

软件版本号:Build 2262GE (Preview 1 Patch 1)Expired 2001.03.31

过期日期为:2001年3月31日

1.去除过期提示:

把日期向前改一年不过期，随怀疑是调用了getsystemtime函数

运行trw2000,用getsystime设断,程序在出现调查表之前中断:

* Reference To: MSVCRT.time, Ord:02D0h====>调用API函数getsystemtime
|
:00406149 FF15F0D64800 Call dword ptr [0048D6F0]
:0040614F 8B442410 mov eax, dword ptr [esp+10]
:00406153 83C404 add esp, 00000004
:00406156 3DB7F1C53A cmp eax, 3AC5F1B7
:0040615B 7E4C jle 004061A9=====>不跳就过期
所以改为跳 那74 改EB
:0040615D 6A00 push 00000000
:0040615F 8D4C2434 lea ecx, dword ptr [esp+34]
:00406163 E848950000 call 0040F6B0
:00406168 A148FB4A00 mov eax, dword ptr [004AFB48]
:0040616D 51 push ecx
:0040616E 85C0 test eax, eax
:00406170 C78424CC05000000000000 mov dword ptr [esp+000005CC], 00000000
:0040617B 8BCC mov ecx, esp
:0040617D 740B je 0040618A
:0040617F 8964240C mov dword ptr [esp+0C], esp

2.去除防暴破程序自检点:

启动后虽然没过期提示，但程序自动检测，暴破后照样出错退出:

用w32dasm反汇编后的串式参考正好可以找到出错提示：
(不过中文提示很多，很难找)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040695C(U)
|
:00406963 85C0 test eax, eax
:00406965 7439 =>修改不跳 je 004069A0====》offset 6965h
如果程序被修改就不跳，说可能被病毒感染或者捆绑了恶意程序，然后程序非正常退出。
74 改 EB 就行了
:00406967 A148FB4A00 mov eax, dword ptr [004AFB48]
:0040696C 51 push ecx
:0040696D 85C0 test eax, eax
:0040696F 8BCC mov ecx, esp
:00406971 740B je 0040697E
:00406973 89642424 mov dword ptr [esp+24], esp

* Possible StringData Ref from Data Obj ->"数字验证失败，可能被病毒感染或者捆绑了恶意程序"
->"。"
|
:00406977 6894404A00 push 004A4094
:0040697C EB09 jmp 00406987

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406971(C)
|
:0040697E 89642424 mov dword ptr [esp+24], esp

* Possible StringData Ref from Data Obj ->"Digit Authenticate Failed, Quit."
|
:00406982 6870404A00 push 004A4070

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040697C(U)
|

* Reference To: MFC42.Ordinal:0219, Ord:0219h

3.开始用户调查表的去除:

曾经尝试从成功消息和出错消息两处用动态和静态分析均步成功，随决定从开始一步步进行跟踪。

* Possible Reference to Dialog:
|
:00407E08 68D0434A00 push 004A43D0
:00407E0D 8D4C240C lea ecx, dword ptr [esp+0C]
:00407E11 C784242C08000000000000 mov dword ptr [esp+0000082C], 00000000
:00407E1C E88F730700 call 0047F1B0
:00407E21 85C0 test eax, eax
:00407E23 750A jne 00407E2F==>改掉就跳过了
75 改为 EB
:00407E25 8B06 mov eax, dword ptr [esi]
:00407E27 8BCE mov ecx, esi
:00407E29 FF90C0000000 call dword ptr [eax+000000C0]
^^^^^^^这才是那个令人讨厌的调查表
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407E23(C)
|跳到这里就一片晴空了
:00407E2F 8D4C2408 lea ecx, dword ptr [esp+08]
:00407E33 E828740700 call 0047F260
:00407E38 8BF8 mov edi, eax
====================================>

止此完全破解成功!!!!!

哈哈哈!!!!!!

打住，别笑!!!!

一运行正常，但一拨上号后使用即出现过期提示，并且是随机的

我晕~~~~~~~，太可怕了，真不愧为中国知名的安全专家

小榕大哥，看来我们只能再来一局了!

搜索出错字符串?不行!改成英文(用exescope),再搜还是找不到.

想尽一切办法，用动静两种方式进行跟踪，仍无效，期间也中断过但离我想要的调用太远.

看到它主界面上的一个单词

Expired(过期)
用它打一下，谢天谢地，打到了，3处，其中一处是主界面提示，在另外两处用trw200进行疯狂跟踪，反复用 r fl z 试跳

最后终于找到了可爱的错框和绕过它的方法:

* Possible StringData Ref from Data Obj ->"www.sina.com.cn"
|
:0046C889 68502A4C00 push 004C2A50
:0046C88E C705F431B70001000000 mov dword ptr [00B731F4], 00000001
:0046C898 E863000000 call 0046C900
:0046C89D 83C404 add esp, 00000004
:0046C8A0 85C0 test eax, eax
:0046C8A2 7520 jne 0046C8C4==>不跳就到期
75 改 EB 就可以了
:0046C8A4 50 push eax
:0046C8A5 50 push eax
:0046C8A6 A17495AB00 mov eax, dword ptr [00AB9574]
:0046C8AB 686B040000 push 0000046B
:0046C8B0 50 push eax

* Reference To: USER32.SendMessageA, Ord:0214h
|到这里就出现了到期框:
:0046C8B1 FF1514D84800 Call dword ptr [0048D814]
:0046C8B7 C705F431B70000000000 mov dword ptr [00B731F4], 00000000
:0046C8C1 33C0 xor eax, eax
:0046C8C3 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046C8A2(C)

* Possible StringData Ref from Data Obj ->"www.yahoo.com"
|
:0046C8C4 68402A4C00 push 004C2A40
嘻嘻~~，小弟暂胜一招，小榕大哥承让了。

现在可以用了，不知还有什么陷阱......相信不会有恶意陷阱

总结:作者通过判断时间、自我验证、在线注册和上网后随机判断几种加密方法，对软件进行综合加密。

2001-08-27


时间限制二

 标 题:转贴：破解时间限制的老文章（二） (2千字)
发信人:1212
时 间:2000-10-23 16:50:15
详细信息:

注：GetTickCount( )的破解

X-win Pro 4.3的demon版有31分钟的时间限制.
在运行到第30分钟的时候,弹出一个对话框,告诉你只能再用1分钟.到第31分钟的
时候,又弹出一个对话框,告诉你已经没时间了,要你重新运行它.它已经销毁了它
所启动的所有窗口.
我的破解方法如下:
用softice symbol loader加载xserver.exe,按F5运行.等连上UNIX主机后,
用bpx messageboxa设置断点,然后出去玩半个小时(我是去逛书店了).
等30分钟过后,就发现进入了softice.按F11从MessageBoxA函数返回.
再按几下F10,经过一条ret指令后,就可以看见如下的程序段:
0041228D: CALL CS:[KERNEL32!GetTickCount]
MOV ECX,[0050D184]
MOV EBX,EAX
TEST ECX,ECX
JZ 004122D3
004122A0: CMP EAX,ECX
JLE 004122D3
MOV EDX,0000EA60 ;60000毫秒=1分钟
MOV EBX,[0050D17C]
MOV EAX,[0050D174]
MOV [0050D184],ESI
CALL [0050D178] ;显示"只剩1分钟了"
CALL CS:[KERNEL32!GetTickCount] ;取时间
ADD EAX,0000EA60 ;加上1分钟(60000毫秒)
MOV [0050D188],EAX ;保存起来
JMP 004122F8
004122D3: CMP EBX,[0050D188]
JLE 004122F8
MOV EBX,[0050D17C]
MOV EAX,[0050D174]
XOR EDX,EDX ;0分钟
CALL [0050D178] ;显示"剩下0分钟"
MOV DWORD PTR [0050D18C],00000001
004122F8: MOV EAX,ESI
POP ESI
POP EDX
POP ECX
POP EBX
RET
通过用softice改变程序执行流程,对上面的程序段进行分析,知道程序是这么
作的:
程序不断用GetTickCount( )得到系统时间(系统启动以来所经过的毫秒数),
和预定的值比较,看有没有到30分钟.到了30分钟的时候,先显示对话框,告诉你
只能再用1分钟了.然后用GetTickCount( )得到系统时间,将其加上60000,
也就是加上1分钟,保存在一个变量中.此后不断将GetTickCount( )返回的数和这
个变量比较,如果大于这个变量,就说明过了31分钟,就弹出个对话框,告诉你剩下
0分钟,然后销毁窗口.
如果让GetTickCount( )返回固定值,不就可以骗过它了吗?由于GetTickCount
返回值在EAX寄存器中,所以只需要把CALL CS:[KERNEL32!GetTickCount]这条
指令改为
MOV EAX,00000001
NOP
NOP
为了保险起见,我把上面的两条CALL CS:[KERNEL32!GetTickCount]都改了.
find: 2E FF 15 4C 71 52 00 8B 0D
replace: B8 01 00 00 00 90 90 -- --

find: 2E FF 15 4C 71 52 00 05 60 EA
replace: B8 01 00 00 00 90 90 -- -- --
由于30分钟时间很长,我只检验过一次,不知道还有什么bug.
当然也可以把30分钟改短点儿.


时间限制一

 标 题:转贴：破解时间限制的老文章（一） (2千字)
发信人:1212
时 间:2000-10-23 16:49:28
详细信息:

注：SetTimer( )、KillTimer( )、WM_TIMER的破解 (

X-Win32是个Win95下的X-server程序.
在http://www.starnet.com或tucows的mirror站点可以找到它.

其4.0.1版的演示版只允许你每次运行两个小时,之后必须重新运行它.
这个软件在安装时要输入注册码,不过这时候不一定要你输入正确的注册码.

我的破解方法如下:

1.用SoftIce加载其主程序XWin32.exe
2.用bpx messageboxa设置断点,按F5运行.
3.过一会就会激活SoftIce,按一下F11返回调用MessageBoxA的地方,可以看到:
00421A18: CALL [USER32!SetTimer]
MOV EAX,[004938FC]
TEST EAX,EAX
00421A25: JNZ 00421A63
MOV EDX,[0049BB20]
LEA ECX,[ESP+00]
PUSH 00000100
PUSH ECX
PUSH 09
PUSH EDX
00421A3A: MOV DWORD PTR [004938FC],00000078 ;120分钟,即2小时
CALL [USER32!LoadStringA]
MOV ECX,[0049BA60]
PUSH 40
LEA EAX,[ESP+04]
PUSH 004A2D1C
PUSH EAX
PUSH ECX
CALL [USER32!MessageBoxA] ;显示"demon version"
00421A63: ADD ESP,00000100 ;亮条停在此行
RET
4. 稍加分析,就可以知道上面的程序段的作用.程序先把DS:[004938FC]中的值
取出来,判断它是否为0,为零则显示对话框,不为零就跳过对话框.我们还可以
看到它在显示对话框之前把DS:[004938FC]赋值为78H,即10进制的120.如果120
表示120分钟的话,那不正好为两小时吗 ? 如果确实是在这个地方设置两小时
限制的话,那么程序在以后肯定会来读写DS:[004938FC],所以用bpm 004938FC
设置个新断点.
5. 按F5继续执行,过了一会儿又进入了SoftIce !
这次看仔细了:
00421A7F: MOV EAX,[004938FC]
DEC EAX ;亮条停在此行
MOV [004938FC],EAX
00421A8A: JZ 00421AC9 ;剩下0分钟,中止进程
CMP EAX,0F ;剩下15分钟吗 ?
JNZ 00421AE4 ;不是,继续运行
MOV ECX,[0049BB20] ;显示"只剩15分钟"
.
.
程序显然是在作递减工作,把那个计数器减到零的时候,也就是到了两小时的
时候,就中止进程.在只剩下15分钟的时候它会显示个对话框,告诉你"只剩
15分钟好用了".
6. 我的破解方法是,把CS:00421A25处的JNZ 00421A63改为JMP 00421A63就行了.
这样不仅跳过了对话框,而且计数器DS:[004938FC]的初值为0,以后程序对它
进行减一操作的话,它就会变成-1,即FFFFFFFF分钟,这可是个天文数字,所以
你也根本不用担心程序会中止啦.
find: 75 3C 8B 15 20
replace: EB -- -- -- --
以上只是一种破解方法而已,也可以把减一指令改为NOP.能找到注册码当然最好.

Netguy,1998.9.20


天网2.43

 标 题:天网2.43过期提示框的驱除 (6千字)
发信人:crack007
时 间:2001-8-15 16:54:29
详细信息:
天网2.43过期提示框的驱除

作者：Crack007[BCG]
主页：http://www.crack007.com ( ^-^ )
破解日期：2001-8-15
破解工具：TRW2000 1.23 W32dasm DeDe2.5汉化版

从今天上午开始我的天网开始出现过期提示。按确定后使用完全正常。但老是这样很烦人，于是我就想把它给干掉。

这个软件用Wasam查不出任何有用的东西。用fi查出该软件是用Delphi编写的，于是调起DeDe这个专门对付Delphi软件的天兵天将。几里呱啦打开处理之后在窗体部分搜到三个可疑选项：TfrmRegister、TfrmMessage、TfrmMessageDlg，其他窗体的作用可根据其英语含义基本排除。在TfrmRegister窗体中我们可看到“单击这里免费获取注册号”、“确定”、“取消”等字样，很明显只是我们第一次装天网防火墙要求我们注册的部分。我们可以在 00412525处将7449改为9090即可爆破成功。由于以前有人讲过怎样追出它的注册码，所以就不再在此赘述。于是排除TfrmRegister窗体。

让我们再看TfrmMessageDlg窗体。我们可以看到“天网防火墙提示信息”这个提示软件过期的标题，但我们再向上看，发现它有“确定”、“取消”两个按钮，跟软件提示过期窗口只有一个确定按钮不大相同。于是我们再看TfrmMessage窗体，发现它只有“天网防火墙提示信息”标题和“确定”这个按钮，而没有“取消”这个按钮，到此我们可以基本确定，这就是过期提示窗，软件提示过期的猫腻就在这个TfrmMessage窗体中。

让我们单击DeDe的“程序”选项可以看到有三个事件：FormCreate、FormDestory和btbYesClick。由于其英文含义很明白，所以我们就将重点放到了这个FormCreate上。DeDe显示它的偏移量为00412c04,所以我们就调出Trw2000，下bpx 412c04。重新运行天网防火墙程序，结果被拦截在412c04这个地方。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412BB7(C) <------------在这可知，是由412BB7跳转而来。于是让我们到412BB7处
|
:00412BBE 894DD0 mov dword ptr [ebp-30], ecx
:00412BC1 8855D7 mov byte ptr [ebp-29], dl
:00412BC4 8945FC mov dword ptr [ebp-04], eax
:00412BC7 B8A4C55100 mov eax, 0051C5A4
:00412BCC E8DF190E00 call 004F45B0
:00412BD1 66C745E80800 mov [ebp-18], 0008
:00412BD7 8B4DD0 mov ecx, dword ptr [ebp-30]
:00412BDA 33D2 xor edx, edx
:00412BDC 8B45FC mov eax, dword ptr [ebp-04]
:00412BDF E8DCF0FEFF call 00401CC0
:00412BE4 8345F40F add dword ptr [ebp-0C], 0000000F
:00412BE8 8B55D8 mov edx, dword ptr [ebp-28]
:00412BEB 64891500000000 mov dword ptr fs:[00000000], edx
:00412BF2 8B45FC mov eax, dword ptr [ebp-04]
:00412BF5 807DD700 cmp byte ptr [ebp-29], 00
:00412BF9 7405 je 00412C00
:00412BFB E805FD0F00 call 00512905

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412BF9(C)
|
:00412C00 8BE5 mov esp, ebp
:00412C02 5D pop ebp
:00412C03 C3 ret

:00412C04 55 push ebp <------在此被拦截，让我们向上看，看看是怎么来到这个地方的。
:00412C05 8BEC mov ebp, esp
:00412C07 83C4D0 add esp, FFFFFFD0
:00412C0A 8955D0 mov dword ptr [ebp-30], edx
:00412C0D 8945D4 mov dword ptr [ebp-2C], eax
:00412C10 B8C8C55100 mov eax, 0051C5C8
:00412C15 E896190E00 call 004F45B0
:00412C1A 6A30 push 00000030
:00412C1C E853090E00 call 004F3574
:00412C21 59 pop ecx
:00412C22 8945FC mov dword ptr [ebp-04], eax
:00412C25 85C0 test eax, eax
:00412C27 741C je 00412C45
:00412C29 66C745E81400 mov [ebp-18], 0014
:00412C2F 8B55D4 mov edx, dword ptr [ebp-2C]
:00412C32 8B45FC mov eax, dword ptr [ebp-04]
:00412C35 E89AC4FFFF call 0040F0D4
:00412C3A 66C745E80800 mov [ebp-18], 0008
:00412C40 8B55FC mov edx, dword ptr [ebp-04]
:00412C43 EB03 jmp 00412C48

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
* Referenced by a CALL at Address:
|:00403071 <-----哦，原来就从这里来的。让我们再看。
|
:00412BAC 55 push ebp
:00412BAD 8BEC mov ebp, esp
:00412BAF 83C4D0 add esp, FFFFFFD0
:00412BB2 8855F8 mov byte ptr [ebp-08], dl
:00412BB5 84D2 test dl, dl
:00412BB7 7E05 jle 00412BBE <-----在此跳到上面的地方
:00412BB9 E83AFD0F00 call 005128F8

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
:0040306C A1F0C55100 mov eax, dword ptr [0051C5F0]
:00403071 E836FB0000 call 00412BAC <-----弄了半天是这个Call。让我们继续执行程序。
:00403076 8945C0 mov dword ptr [ebp-40], eax
:00403079 66C745DC1400 mov [ebp-24], 0014
:0040307F 66C745DC2000 mov [ebp-24], 0020
:00403085 8D55FC lea edx, dword ptr [ebp-04]
:00403088 8D45F8 lea eax, dword ptr [ebp-08]
:0040308B E84CED1000 call 00511DDC
:00403090 FF45E8 inc [ebp-18]
:00403093 8B10 mov edx, dword ptr [eax]
:00403095 8B4DC0 mov ecx, dword ptr [ebp-40]
:00403098 8B81DC020000 mov eax, dword ptr [ecx+000002DC]
:0040309E E855170B00 call 004B47F8
:004030A3 FF4DE8 dec [ebp-18]
:004030A6 8D45F8 lea eax, dword ptr [ebp-08]
:004030A9 BA02000000 mov edx, 00000002
:004030AE E851EE1000 call 00511F04
:004030B3 8B45C0 mov eax, dword ptr [ebp-40]
:004030B6 8B10 mov edx, dword ptr [eax]
:004030B8 FF92D8000000 call dword ptr [edx+000000D8] <-----来到这里，提示框弹出。
:004030BE 66C745DC0800 mov [ebp-24], 0008
:004030C4 8B4DC0 mov ecx, dword ptr [ebp-40]
:004030C7 894DF0 mov dword ptr [ebp-10], ecx

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

既然004030B8处的Call是过期提示框，我们就把它给Nop掉。改FF92D8000000为909090909090即可。

修改后，运行程序，无提示框弹出，运行正常，爆破成功！

破解补丁我已做好，在我的主页http://www.crack007.com(即将开通) http://crack007.longcity.net(已经开通)可以下载

The End


虚拟光驱2000

标 题:“光驱”修理手记
发信人:woLONGwxd
时 间: 2001-1-17
详细信息:

“光驱”修理手记

前奏......

“没搞错吧！这不是硬件DIY，这是看雪学苑，众多CRACKER交流心得的乐园，去！”
“哎，别。我这修理的是虚拟光驱，评估版解除21天的限制，......”
“呀，失敬，失敬，欢迎，热烈欢迎”

对，今天就拿虚拟光驱2000开刀。从网上下载了一个最新版本，安装时提醒这是评估版，只允许使用21天。重启后运行mgr.exe，弹出版本信息对话框，确认后弹出虚拟光驱画面，稍候片刻，进入虚拟光驱总管窗口。
关闭mgr.exe，修改系统日期到一个月之后，运行mgr.exe，弹出过期对话框，确认后弹出订购对话框，确认后程序退出。呼出Softice，下断
bpx messageboxa
运行mgr.exe被断，按几次F12回程序代码区

:00409ED4 8D1439 lea edx, dword ptr [ecx+edi]
:00409ED7 3BC2 cmp eax, edx
:00409ED9 0F8696000000 jbe 00409f75
:00409EDA 8B3DE4304200 mov edi,[Kernel32!WriteProfileStringA]
:00409EE5 68F4334300 push 004333F4 ->"1"
:00409EEA 6888354300 push 00433588 ->"iDvdis
:00409EEF 6880354300 push 00433580 ->"intl"
:00409EF4 FFD7 call edi
:00409EF6 687C354300 push 0043357C ->"0"
:00409EFB 6870354300 push 00433570 ->"iMediaxDev"
:00409F00 6880354300 push 00433580 ->"intl"
:00409F05 FFD7 call edi
:00409F07 6AFF push FFFFFFFF
:00409F09 6A10 push 00000010
:00409F0B 686D1B0000 push 00001B6D
:00409F10 E839500100 call 0041EF4E <-弹出过期对话框
:00409F15 E856E8FFFF call 00408770 <-返回此处，弹出订购对话框
分析这段代码，若在:00409ED9处不跳，则往win.ini里intl小节iDvdis项和iMediaxDev项分别写入1和0，弹出过期对话框和订购对话框，退出运行。因此，在:00409ED9处必须要跳。eax, edx的值一时也弄不清是怎么算得的，
向上看，还有十几个短跳，头都大了~！休息，休息一会儿。仔细观察，前面还有两个ret，对应
:00409C05 jz 00409C6E
和
:00409E72 jz 00409ED4
一定要跳，另外除了:00409E57 jz 00409FFFF，其它跳转似乎都不影响程序执行到:00409ED9处。而试着从:00409E57处跳到:00409FFFF处执行，好象也没什么问题。不管那么多了，把jz 00409C6E、jz 00409ED4和jbe 00409f75都改为无条件跳转即可解除日期限制”。

下一步要去掉讨厌的版本信息和虚拟光驱画面了，向下看
:0040A084 3BC6 cmp eax, esi
:0040A086 743A je 0040A0C2 <-跳过版本信息对话框
:0040A088 8B3DE0304200 mov edi, dword ptr [004230E0] ^KERNEL32.GetProfileIntA
:0040A08E 6A00 push 00000000
:0040A090 6888354300 push 00433588 ->"iDvdis"
:0040A095 6880354300 push 00433580 ->"intl"
:0040A09A FFD7 call edi
:0040A09C 6A00 push 00000000
:0040A09E 6870354300 push 00433570 ->"iMediaxDev"
:0040A0A3 6880354300 push 00433580 ->"intl"
:0040A0A8 8BF0 mov esi, eax
:0040A0AA FFD7 call edi
:0040A0AC 85F6 test esi, esi
:0040A0AE 7547 jne 0040A0F7 <-iDvdis不等于0则跳，过期
:0040A0B0 83F801 cmp eax, 00000001
:0040A0B3 7542 jne 0040A0F7 <iMediaxDev不等于1则跳，过期
:0040A0B5 6AFF push FFFFFFFF
:0040A0B7 56 push esi
:0040A0B8 68C8010000 push 000001C8
:0040A0BD E88C4E0100 call 0041EF4E <-版本信息对话框
:0040A0C2 3975E4 cmp dword ptr [ebp-1C], esi
:0040A0C5 7471 je 0040A138 <-跳过虚拟光驱画面
由上可知，将je 0040A0C2和je 0040A138改为无条件跳转即可，或者直接把
je 0040A0C2改为jmp 0040A138。
以上修改可用hiew.exe或winhex.exe等工具，不再叙述。
更进一步，还可以打造自己的品牌，利用exescope等资源修改工具，可以隐藏“订购”菜单项，修改“关于”对话框内容为正版字样，...
需要注意的是，光驱2000过期后将拒绝重装，这是只需把win.ini里的iDvdis改为0就行了。

--### 严正声名 ###--
以上内容只能用于经验交流领域，严禁商业用途，维护正版利益！
版权所有，请保障文章的完整性！

woLONGwxd 2001-1-17
E-mail:wxdny@263.net


英语全文朗读软件

 标 题:英语全文朗读软件---破解 (1千字)
发信人:2000yeah
时 间:2000-10-4 10:56:23
详细信息:
英语全文朗读软件---破解

( 这个软件没有注册的地方，是一个试用版本,仅能朗读一分钟。）

简介：

这是中国第一个全文朗读英文的软件。本软件使用了全球最先进的TTS技术，
可以打开并全文朗读任意英语文本，实现了每一个英文单词到整句乃至全文准确
朗读，语音质量连贯、流畅，接近真人朗读，并且速度可调整（中速、快速、慢
速），音量大小可调，还可以象录音机那样暂停，是锻炼英语听力的极佳工具。
    要使本软件正确朗读，你必需安装TTS引擎。TTS引擎可在《金山词霸2000》
光盘中找到，也可以到微软的站点下载。如果你安装了《金山词霸2000》，便可
以用本软件全文朗读英语文本了。
    使用本软件非常简单，不用多费口水。这是试用版，只能朗读一分半钟左右，
如你需长期使用，请与作者联系购买正式版本。呵，差点忙了告诉你：上下键可
以调整音量大小。我这小东东是制作超级媒体播放器的“副产品”。还是一个小
巧的纯绿色软件。

作者：2000yeah

级别：卖菜的

日期：2000年10.3

地址：http://smplayer.myrice.com

工具：TRW2000(中途死机好几次，我的硬盘都会扫描坏了）

bpx settimer(用此中断）

为什么不用SOFTICE? 呵呵，我懒得动手按F12。

抱歉，没有用W32DASM反汇编只是用TRW2000查到了跳跃点。

...............

0050F2E6: JNZ NEAT 00510186

................

－－－－－－－ 0F 85 9A 0E 00 00 －－－－－－－－
－－－－－－－ 74 85 9A 0E 00 00 ----------------

限制取消。

－－－－－－－－－－－－－－初学破解，错误难免，请各位大侠指点，谢谢。－－－－－－2000.10.3－2000yeah－－－


df3 v1.00.

标 题:如何破解df3 v1.00.17 CD Protect (3千字)
发信人:wocy
时 间:2000-12-28 1:12:07
详细信息:
如何破解df3 v1.00.17 CD Protect
-----------------------------
雪椰
2000,12,25am
Email:wocy@263.net
Http://wocy.yeah.net(有本例中的补丁）
-------------------------------------
头一阵玩大地勇士，虚拟了个光盘。近两天硬盘资源紧张，（0.5G呢），破了她...

难度：简易
工具：w32dasm,Hview

------------
前言:这个游戏是不放cd时不能玩Single和Novaworld.想是对single&nova做了特殊动作。

1，w32dasm find the string "single",you will come to:

* Possible StringData Ref from Data Obj ->"but_mm_SinglePlayer"
|
:00443B71 6850165000 push 00501650
:00443B76 7545 jne 00443BBD
:00443B78 E88364FFFF call 0043A000
:00443B7D 83C404 add esp, 00000004
:00443B80 3BC6 cmp eax, esi
:00443B82 7407 je 00443B8B
:00443B84 C7405404000000 mov [eax+54], 00000004 《=====注意这点 1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00443B82(C)
|

* Possible StringData Ref from Data Obj ->"but_mm_NovaWorld"
|
:00443B8B 683C165000 push 0050163C
:00443B90 E86B64FFFF call 0043A000
:00443B95 83C404 add esp, 00000004
:00443B98 3BC6 cmp eax, esi
:00443B9A 7407 je 00443BA3
:00443B9C C7405404000000 mov [eax+54], 00000004 《=====注意这点 2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00443B9A(C)
|

* Possible StringData Ref from Data Obj ->"but_mm_Update"
|
:00443BA3 682C165000 push 0050162C
:00443BA8 E85364FFFF call 0043A000
:00443BAD 83C404 add esp, 00000004
:00443BB0 3BC6 cmp eax, esi
:00443BB2 7440 je 00443BF4
:00443BB4 C7405404000000 mov [eax+54], 00000004 《=====注意这点 3
:00443BBB EB37 jmp 00443BF4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00443B76(C)
|
:00443BBD E83E64FFFF call 0043A000
:00443BC2 83C404 add esp, 00000004
:00443BC5 3BC6 cmp eax, esi
:00443BC7 7403 je 00443BCC
:00443BC9 897854 mov dword ptr [eax+54], edi 《=====注意这点 4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00443BC7(C)
|

* Possible StringData Ref from Data Obj ->"but_mm_NovaWorld"
|
:00443BCC 683C165000 push 0050163C
:00443BD1 E82A64FFFF call 0043A000
:00443BD6 83C404 add esp, 00000004
:00443BD9 3BC6 cmp eax, esi
:00443BDB 7403 je 00443BE0
:00443BDD 897854 mov dword ptr [eax+54], edi 《=====注意这点 5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00443BDB(C)
|

* Possible StringData Ref from Data Obj ->"but_mm_Update"
|
:00443BE0 682C165000 push 0050162C
:00443BE5 E81664FFFF call 0043A000
:00443BEA 83C404 add esp, 00000004
:00443BED 3BC6 cmp eax, esi
:00443BEF 7403 je 00443BF4
:00443BF1 897854 mov dword ptr [eax+54], edi 《=====注意这点 6

你会发现1,2,3 与 4,5,6是多么的相近，把1,2,3 改成 4,5,6的样子，（不足部分用 nop 填充）

2，改吧
3，成功
4，做补丁吧
5，这个世界清净了......


GTA2

标 题:GTA2 光碟保护 暴力破解. (549字)
发信人:arbiter
时 间:2000-12-28 22:55:59
详细信息:
安装完游戏,光碟先不要拿出.
bpx GetDriveTypeA
执行程序,弹出sice. 返回到gta2区域,向上的一个cmp XXX
就是第一个检测点. 第一步完成.

到游戏主界面,如果没有光碟,此时执行start game,就会
来到第二个陷阱. security fail.

所以执行前 bpx ReadFile,按F10执行程序,会找到第二个检
测点,很简单啦.

无壳,无反跟踪,西西，我只会做最简单的啦.

关键是开始我被迷惑了，因为我下第一个断点时,没有放光碟,
这个程序上来直接读一下光碟上的东西,此时检测,如果读错误
就跳走了,所以不会断到GetDriveTypeA出.

完了. 算个开始吧.

向各位兄弟学习!


kai's super goo 1.5

 标 题:解决kai's super goo 1.5读光盘的问题
发信人:chn-boy
时 间:2000-12-5 22:21:55
详细信息:
解决kai's super goo 1.5读光盘的问题

软件名称：kai's super goo 1.5 （35M ——〉天啦，我就是2M的专线网络蚂蚁下载也用了7分24秒）
下载地址：http://www.iszero.com/php3-bin/redirect.php?ID=0&GET=/tuxing/zhizuo/Kaigoo.zip
软件说明：
调试工具：SoftICE4.05、W32dsm89
目的：解决kai's super goo 1.5读光盘的问题

作者：chn-boy
调试日期：2000-12-05

其实这个软件调试工作很简单，没有必要写的这么详细，只是为了写作规范化，所以我还是把它当作那么一回事情来
写。首先在SoftICE下下断点 bpx GetWindowTextA，F5回到Windows，在那个输入名字对话框里随便输入一些字符，运行。
SoftICE会自动弹出（我一直都说：so beautiful），下命令bd *，按F12一直到superGoo领空，到了领空，第一件事情就
是在进入领空处的地方下一个断点——bpx xxxxxxxx，以被后用。然后就是F10，一路跟踪，直到弹出出错对话框为止，
如下面的程序片断：

:00401EC4 85C0 test eax, eax <-- 2）第二个步骤尝试是改这个。。
:00401EC6 0F8532010000 jne 00401FFE

:00401ECC 8D8C2454020000 lea ecx, dword ptr [esp+00000254]
:00401ED3 E818650800 call 004883F0
:00401ED8 85C0 test eax, eax <-- 根据下面的那个出错对话框，首先怀疑这个地方有问题
<-- 1）第一个步骤尝试是改这个。。
:00401EDA 0F8493000000 je 00401F73

:00401EE0 FFD3 call ebx
:00401EE2 6A06 push 00000006

* Possible StringData Ref from Data Obj ->"custom errors_"
|
:00401EE4 686C104900 push 0049106C
:00401EE9 8D8C245C010000 lea ecx, dword ptr [esp+0000015C]
:00401EF0 68FF000000 push 000000FF
:00401EF5 51 push ecx
:00401EF6 E8A5620600 call 004681A0
:00401EFB 83C410 add esp, 00000010
:00401EFE 6A00 push 00000000
:00401F00 8D942458010000 lea edx, dword ptr [esp+00000158]
:00401F07 52 push edx
:00401F08 8BCE mov ecx, esi
:00401F0A FFD5 call ebp <-- 程序在这个Call中弹出出错对话框，由于上面部分的程序
<-- 来看，先改尝试改变前面1）和2）跳转，如果不行的话，
<-- 就要跟到这个Call中再慢慢研究了。。这是 3）第三个步骤

:00401F0C 6A05 push 00000005

* Possible StringData Ref from Data Obj ->"custom errors_"
|
:00401F0E 686C104900 push 0049106C
:00401F13 8D44245C lea eax, dword ptr [esp+5C]
:00401F17 68FF000000 push 000000FF
:00401F1C 50 push eax
:00401F1D E87E620600 call 004681A0

********* 中间的这个部分省略 **********

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401EDA(C)
|
:00401F73 8B7C2444 mov edi, dword ptr [esp+44] <--程序的正确入口
:00401F77 83C9FF or ecx, FFFFFFFF
:00401F7A 33C0 xor eax, eax
:00401F7C F2 repnz
:00401F7D AE scasb

根据上下文，bd *以后，首先在1）处下个断点，F5回到Windows，重新来一次，程序会中断在1）处，改掉1）后面的那个跳
转，发现成功了。那么这个地方就是关键了，记下这个地方的Code码：85 c0 0f 84 93 00 00 00 ff d3 6a 06。用Hex Workshop
进行修改。

用Hex WorkShop（当然啦，你也可以用HView什么之类的，我是因为看雪斑竹在破解工具栏中那个Hex WorkShop的介绍才一直
使用它的。。呵呵，因为我一直都在向看雪斑竹学习、一直在向他看齐 :b ）打开SuperGoo.exe，查找前面说的那个字符串，然
后有两种修改方法：

1）改后面的那个 je 00401F73 为 jmp 00401F73
2）改 test eax, eax 为 xor eax, eax <-- 也就是把 85 改成 33 就可以了

我用的是第2中方法，嘿嘿（为什么？哎，因为改动少吗，只需改一个字节就可以了。。。哈哈哈哈）

【最后整理】

改：85 c0 0f 84 93 00 00 00 ff d3 6a 06
^^
33

你便可以用任何字符进去了，而且运行第一次后，下次运行不再需要输入东东了，可以直接进去了。。 *_^


NOX

标 题:NOX免光盘版制作手记 (2千字)
发信人:gdong
时 间:2001-1-4 17:16:55
详细信息:
NOX免光盘版制作手记

作者：风飘雪
主页http://duba.126.com

NOX乃 WESTWOOD公司大作，暗黑类游戏，运行需读光盘。不插盘显示
"NOX CD Missing",用w32dasm反汇编NOX.exe用串式参考string data ref
找不到该语句，一筹莫展时突然看见
"CDFailText"
"CDFailTitle"
"CDFS"
双击"CDFailText"，得到
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004134A4(C) -------------由此跳来（**）
|
:004134AB 68A0364100 push 004136A0
:004134B0 68C0364100 push 004136C0
:004134B5 6A23 push 00000023
:004134B7 68C8000000 push 000000C8

* Possible StringData Ref from Data Obj ->"C:\Nox\src\common\System\gamedisk.c"
|
:004134BC 68C86A5700 push 00576AC8
:004134C1 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"CDFailText" ————————****
|
:004134C3 68EC6A5700 push 00576AEC
:004134C8 E833BDFFFF call 0040F200
:004134CD 83C410 add esp, 00000010
:004134D0 50 push eax
:004134D1 68C7000000 push 000000C7

* Possible StringData Ref from Data Obj ->"C:\Nox\src\common\System\gamedisk.c"
|
:004134D6 68F86A5700 push 00576AF8
:004134DB 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"CDFailTitle" ————————****
|
:004134DD 681C6B5700 push 00576B1C
:004134E2 EB60 jmp 00413544

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00413489(C)
|
:004134E4 83F801 cmp eax, 00000001 ---此处为关键，到此可跳过检测CD
:004134E7 0F8581000000 jne 0041356E

向上看，找跳转语句绕过CD检测段
:0041347D E80EEA0000 call 00421E90
:00413482 85C0 test eax, eax
:00413484 A3CC105F00 mov dword ptr [005F10CC], eax
:00413489 7559 jne 004134E4 =====改此jne=>jmp
:0041348B E870020000 call 00413700
:00413490 E85B6C0300 call 0044A0F0
:00413495 6800080000 push 00000800
:0041349A E80174FFFF call 0040A8A0
:0041349F 83C404 add esp, 00000004
:004134A2 85C0 test eax, eax
:004134A4 7405 je 004134AB =============（**）
:004134A6 E835020000 call 004136E0
UltraEedit搜寻A3CC105F007559=》A3CC105F00EB59
收工，真的想来罐红牛！
有空来主页逛逛，提点儿意见，
并向toye,sunfeng,fwd,wocy问好
2001.1.4下午


傲世三国

标 题:也谈《傲世三国》的暴力破解法 (11千字)
发信人:bwkpjq
时 间:2001-1-10 21:37:45
详细信息:
也谈《傲世三国》的暴力破解法

前几天在论坛中看到了一位网友写的关于《傲世三国》的破解手记，正好之前我也刚刚把这个游戏买回家，马不停蹄地把它破了，趁今天有空把破解过程写出来，请各位大虾指点。
安装完游戏，取出光盘，然后执行，会跳出一个提示框，如有光盘，按确定，如无，则只能按取消。将EXE文件反汇编，查找GetDriveTypea,来到如下代码：

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
|
:0048663B FF1524226100 Call dword ptr [00612224]
:00486641 83F805 cmp eax, 00000005
:00486644 0F850C020000 jne 00486856 ----注意这条指令！
:0048664A 8A442414 mov al, byte ptr [esp+14]
:0048664E 84C0 test al, al
:00486650 7525 jne 00486677
:00486652 8D7C2410 lea edi, dword ptr [esp+10]
:00486656 83C9FF or ecx, FFFFFFFF
:00486659 33C0 xor eax, eax
:0048665B 8D542414 lea edx, dword ptr [esp+14]
:0048665F F2 repnz
:00486660 AE scasb
:00486661 F7D1 not ecx
:00486663 2BF9 sub edi, ecx
:00486665 8BC1 mov eax, ecx
:00486667 8BF7 mov esi, edi
:00486669 8BFA mov edi, edx
:0048666B C1E902 shr ecx, 02
:0048666E F3 repz
:0048666F A5 movsd
:00486670 8BC8 mov ecx, eax
:00486672 83E103 and ecx, 00000003
:00486675 F3 repz
:00486676 A4 movsb

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00486650(C)
|
:00486677 8D7C2410 lea edi, dword ptr [esp+10]
:0048667B 83C9FF or ecx, FFFFFFFF
:0048667E 33C0 xor eax, eax
:00486680 8D542418 lea edx, dword ptr [esp+18]
:00486684 F2 repnz
:00486685 AE scasb
:00486686 F7D1 not ecx
:00486688 2BF9 sub edi, ecx
:0048668A 8BC1 mov eax, ecx
:0048668C 8BF7 mov esi, edi
:0048668E 8BFA mov edi, edx
:00486690 8D542418 lea edx, dword ptr [esp+18]
:00486694 C1E902 shr ecx, 02
:00486697 F3 repz
:00486698 A5 movsd
:00486699 8BC8 mov ecx, eax
:0048669B 33C0 xor eax, eax
:0048669D 83E103 and ecx, 00000003
:004866A0 F3 repz
:004866A1 A4 movsb

* Possible StringData Ref from Data Obj ->"\autorun.inf"
|
:004866A2 BF28F86300 mov edi, 0063F828
:004866A7 83C9FF or ecx, FFFFFFFF
:004866AA F2 repnz
:004866AB AE scasb
:004866AC F7D1 not ecx
:004866AE 2BF9 sub edi, ecx
:004866B0 8BF7 mov esi, edi
:004866B2 8BFA mov edi, edx
:004866B4 8BD1 mov edx, ecx
:004866B6 83C9FF or ecx, FFFFFFFF
:004866B9 F2 repnz
:004866BA AE scasb
:004866BB 8BCA mov ecx, edx
:004866BD 4F dec edi
:004866BE C1E902 shr ecx, 02
:004866C1 F3 repz
:004866C2 A5 movsd
:004866C3 8BCA mov ecx, edx
:004866C5 8D442418 lea eax, dword ptr [esp+18]
:004866C9 83E103 and ecx, 00000003
:004866CC 50 push eax
:004866CD F3 repz
:004866CE A4 movsb
:004866CF 8D8C2420010000 lea ecx, dword ptr [esp+00000120]
:004866D6 6804010000 push 00000104
:004866DB 51 push ecx

* Possible StringData Ref from Data Obj ->"NODISK"
|
:004866DC 6820F86300 push 0063F820

* Possible StringData Ref from Data Obj ->"ObjectKey"
|
:004866E1 6814F86300 push 0063F814

* Possible StringData Ref from Data Obj ->"UI"
|
:004866E6 6810F86300 push 0063F810
:004866EB FFD5 call ebp

* Possible StringData Ref from Data Obj ->"SOFTWARE\Object Software (Beijng) "
->"Co., Ltd."
|
:004866ED BEE4F76300 mov esi, 0063F7E4
:004866F2 8D84241C010000 lea eax, dword ptr [esp+0000011C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00486717(C)
|
:004866F9 8A10 mov dl, byte ptr [eax]
:004866FB 8ACA mov cl, dl
:004866FD 3A16 cmp dl, byte ptr [esi]
:004866FF 751C jne 0048671D
:00486701 84C9 test cl, cl
:00486703 7414 je 00486719
:00486705 8A5001 mov dl, byte ptr [eax+01]
:00486708 8ACA mov cl, dl
:0048670A 3A5601 cmp dl, byte ptr [esi+01]
:0048670D 750E jne 0048671D
:0048670F 83C002 add eax, 00000002
:00486712 83C602 add esi, 00000002
:00486715 84C9 test cl, cl
:00486717 75E0 jne 004866F9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00486703(C)
|
:00486719 33C0 xor eax, eax
:0048671B EB05 jmp 00486722

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004866FF(C), :0048670D(C)
|
:0048671D 1BC0 sbb eax, eax
:0048671F 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048671B(U)
|
:00486722 85C0 test eax, eax
:00486724 0F852C010000 jne 00486856
:0048672A 8D442418 lea eax, dword ptr [esp+18]
:0048672E 8D8C241C010000 lea ecx, dword ptr [esp+0000011C]
:00486735 50 push eax
:00486736 6804010000 push 00000104
:0048673B 51 push ecx

* Possible StringData Ref from Data Obj ->"NODISK"
|
:0048673C 6820F86300 push 0063F820

* Possible StringData Ref from Data Obj ->"BtnNum"
|
:00486741 68DCF76300 push 0063F7DC

* Possible StringData Ref from Data Obj ->"UI"
|
:00486746 6810F86300 push 0063F810
:0048674B FFD5 call ebp

* Possible StringData Ref from Data Obj ->"11"
|
:0048674D BED8F76300 mov esi, 0063F7D8
:00486752 8D84241C010000 lea eax, dword ptr [esp+0000011C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00486777(C)
|
:00486759 8A10 mov dl, byte ptr [eax]
:0048675B 8ACA mov cl, dl
:0048675D 3A16 cmp dl, byte ptr [esi]
:0048675F 751C jne 0048677D
:00486761 84C9 test cl, cl
:00486763 7414 je 00486779
:00486765 8A5001 mov dl, byte ptr [eax+01]
:00486768 8ACA mov cl, dl
:0048676A 3A5601 cmp dl, byte ptr [esi+01]
:0048676D 750E jne 0048677D
:0048676F 83C002 add eax, 00000002
:00486772 83C602 add esi, 00000002
:00486775 84C9 test cl, cl
:00486777 75E0 jne 00486759

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00486763(C)
|
:00486779 33C0 xor eax, eax
:0048677B EB05 jmp 00486782

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048675F(C), :0048676D(C)
|
:0048677D 1BC0 sbb eax, eax
:0048677F 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048677B(U)
|
:00486782 85C0 test eax, eax
:00486784 0F85CC000000 jne 00486856
:0048678A 83C9FF or ecx, FFFFFFFF
:0048678D 8D7C2410 lea edi, dword ptr [esp+10]
:00486791 F2 repnz
:00486792 AE scasb
:00486793 F7D1 not ecx
:00486795 2BF9 sub edi, ecx
:00486797 8D542418 lea edx, dword ptr [esp+18]
:0048679B 8BC1 mov eax, ecx
:0048679D 8BF7 mov esi, edi
:0048679F C1E902 shr ecx, 02
:004867A2 8BFA mov edi, edx
:004867A4 8D542418 lea edx, dword ptr [esp+18]
:004867A8 F3 repz
:004867A9 A5 movsd
:004867AA 8BC8 mov ecx, eax
:004867AC 33C0 xor eax, eax
:004867AE 83E103 and ecx, 00000003

* Possible StringData Ref from Data Obj ->"rb"
|
:004867B1 6878F46300 push 0063F478
:004867B6 F3 repz
:004867B7 A4 movsb
:004867B8 83C9FF or ecx, FFFFFFFF

* Possible StringData Ref from Data Obj ->"\\"
|
:004867BB BFD4F76300 mov edi, 0063F7D4
:004867C0 F2 repnz
:004867C1 AE scasb
:004867C2 F7D1 not ecx
:004867C4 2BF9 sub edi, ecx
:004867C6 8BF7 mov esi, edi
:004867C8 8BFA mov edi, edx
:004867CA 8BD1 mov edx, ecx
:004867CC 83C9FF or ecx, FFFFFFFF
:004867CF F2 repnz
:004867D0 AE scasb
:004867D1 8BCA mov ecx, edx
:004867D3 4F dec edi
:004867D4 C1E902 shr ecx, 02
:004867D7 F3 repz
:004867D8 A5 movsd
:004867D9 8BCA mov ecx, edx
:004867DB A184358800 mov eax, dword ptr [00883584]
:004867E0 83E103 and ecx, 00000003
:004867E3 8D54241C lea edx, dword ptr [esp+1C]
:004867E7 F3 repz
:004867E8 A4 movsb
:004867E9 8B3C85E0156400 mov edi, dword ptr [4*eax+006415E0]
:004867F0 83C9FF or ecx, FFFFFFFF
:004867F3 33C0 xor eax, eax
:004867F5 F2 repnz
:004867F6 AE scasb
:004867F7 F7D1 not ecx
:004867F9 2BF9 sub edi, ecx
:004867FB 8BF7 mov esi, edi
:004867FD 8BFA mov edi, edx
:004867FF 8BD1 mov edx, ecx
:00486801 83C9FF or ecx, FFFFFFFF
:00486804 F2 repnz
:00486805 AE scasb
:00486806 8BCA mov ecx, edx
:00486808 4F dec edi
:00486809 C1E902 shr ecx, 02
:0048680C F3 repz
:0048680D A5 movsd
:0048680E 8BCA mov ecx, edx
:00486810 8D54241C lea edx, dword ptr [esp+1C]
:00486814 83E103 and ecx, 00000003
:00486817 F3 repz
:00486818 A4 movsb

* Possible StringData Ref from Data Obj ->"\readme.txt"
|
:00486819 BFC8F76300 mov edi, 0063F7C8
:0048681E 83C9FF or ecx, FFFFFFFF
:00486821 F2 repnz
:00486822 AE scasb
:00486823 F7D1 not ecx
:00486825 2BF9 sub edi, ecx
:00486827 8BF7 mov esi, edi
:00486829 8BFA mov edi, edx
:0048682B 8BD1 mov edx, ecx
:0048682D 83C9FF or ecx, FFFFFFFF
:00486830 F2 repnz
:00486831 AE scasb
:00486832 8BCA mov ecx, edx
:00486834 4F dec edi
:00486835 C1E902 shr ecx, 02
:00486838 F3 repz
:00486839 A5 movsd
:0048683A 8BCA mov ecx, edx
:0048683C 8D44241C lea eax, dword ptr [esp+1C]
:00486840 83E103 and ecx, 00000003
:00486843 50 push eax
:00486844 F3 repz
:00486845 A4 movsb
:00486846 E822901600 call 005EF86D
:0048684B 83C408 add esp, 00000008
:0048684E 85C0 test eax, eax
:00486850 0F8588000000 jne 004868DE ----注意这里！

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00486644(C), :00486724(C), :00486784(C)
|
:00486856 8A442410 mov al, byte ptr [esp+10]
:0048685A FEC0 inc al
:0048685C 3C5A cmp al, 5A
:0048685E 88442410 mov byte ptr [esp+10], al
:00486862 0F8ECEFDFFFF jle 00486636
:00486868 8B83C40A0000 mov eax, dword ptr [ebx+00000AC4]
:0048686E 85C0 test eax, eax
:00486870 0F8505010000 jne 0048697B
:00486876 8A442414 mov al, byte ptr [esp+14]
:0048687A 84C0 test al, al
:0048687C 0F84D0000000 je 00486952
:00486882 8D7C2414 lea edi, dword ptr [esp+14]
:00486886 83C9FF or ecx, FFFFFFFF
:00486889 33C0 xor eax, eax
:0048688B 8D93C4090000 lea edx, dword ptr [ebx+000009C4]
:00486891 F2 repnz
:00486892 AE scasb
:00486893 F7D1 not ecx
:00486895 2BF9 sub edi, ecx
:00486897 8BC1 mov eax, ecx
:00486899 8BF7 mov esi, edi
:0048689B 8BFA mov edi, edx
:0048689D C1E902 shr ecx, 02
:004868A0 F3 repz
:004868A1 A5 movsd
:004868A2 8BC8 mov ecx, eax
:004868A4 33C0 xor eax, eax
:004868A6 83E103 and ecx, 00000003
:004868A9 F3 repz
:004868AA A4 movsb

* Possible StringData Ref from Data Obj ->"\\"
|
:004868AB BFD4F76300 mov edi, 0063F7D4
:004868B0 83C9FF or ecx, FFFFFFFF
:004868B3 F2 repnz
:004868B4 AE scasb
:004868B5 F7D1 not ecx
:004868B7 2BF9 sub edi, ecx
:004868B9 8BF7 mov esi, edi
:004868BB 8BD9 mov ebx, ecx
:004868BD 8BFA mov edi, edx
:004868BF 83C9FF or ecx, FFFFFFFF
:004868C2 F2 repnz
:004868C3 AE scasb
:004868C4 8BCB mov ecx, ebx
:004868C6 4F dec edi
:004868C7 C1E902 shr ecx, 02
:004868CA F3 repz
:004868CB A5 movsd
:004868CC 8BCB mov ecx, ebx
:004868CE 83E10
.
.
.
:004868DE:----------
:--------:mov eax,00000001 置光驱检测正确标志！
：-------：ret (这里我已记不清楚，希望能看懂）

通过分析，只要程序能走到004868DE就能通过CD检测，好，用TRW载入游戏，下BPX getdrivetypea,便会来到上述代码，发现cs:00486644 0F850C020000 jne 00486856要跳转，一跳就完了，改！不让它跳，没用，反正走不到cs:004868DE，搞不好还要死机。睁大眼睛再看，004868DE是由cs:00486850跳过来的，如能走到这儿也行，想来想去，再看看 00486644:jne 00486856这条指令，反正要跳，就索性让它跳到00486850,这不就可以了，于是把0F850C020000改为0F8506020000,
OK,程序很老实地走到了mov eax,00000001这条指令，通过了光驱检测，别急，按F10再往下走，没几行便会来到一个Call,F10一带过这个CALL，就会跳出一个很恐怖的提示框：程序执行了非法操作，必须立即关闭，怎么办？祭出杀手锏，把它
NOP掉，行了，下面再没有陷阱了，我试着玩了一下，没出现问题。其实我知道，这样改是很危险的，容易死机，不过这个游戏可以。
去除游戏的CD保护有多种方法，我这属于蛮干！主要是想和大家交流一下，欢迎赐教！
bwkpjq
E-Mail:bwkpjq@pub.sz.jsinfo.net


 哈！哈！哈！我等了两年的大富翁五终于出来了，可是又是要用光盘才能玩，没办法啦！只好把它彻底破解，以免每次玩的时候都要放光盘。 (让小弟来发挥一下自己的文采吧！） 首先运行TRW2000 <-----唔好话我知你无啊！ 按 CTRL+N 在对话框中输入：bpx getdrivetypea 按F5回到程序，按确定，这时会被Trw2000拦截到。 再按pmodule <-------直到程序入口处麻！ 你看到以下代码： :00411C00 83C40C add esp, 0000000C :00411C03 8D4C2418 lea ecx, dword ptr [esp+18] :00411C07 51 push ecx :00411C08 FFD3 call ebx :00411C0A 83F805 cmp eax, 00000005 <-----比较EAX是否等于5如果不相等就跳。 :00411C0D 7534 jne 00411C43 <----这个很重要的，万不能让它跳啊！否刚要放光盘的了。(记住与其将这里改为jz 411c43 倒不如将其改为：jnz 411c56 那么下面的代码就不用改了) :00411C0F 6A00 push 00000000 :00411C11 6A00 push 00000000 :00411C13 6A00 push 00000000 :00411C15 6A00 push 00000000 :00411C17 6A00 push 00000000 :00411C19 8D54247C lea edx, dword ptr [esp+7C] :00411C1D 6880000000 push 00000080 :00411C22 8D442430 lea eax, dword ptr [esp+30] :00411C26 52 push edx :00411C27 50 push eax :00411C28 FFD5 call ebp :00411C2A 83F801 cmp eax, 00000001 :00411C2D 7514 jne 00411C43 <------不要让它跳到。否则GMAE OVER！ :00411C2F 8B4C2410 mov ecx, dword ptr [esp+10] :00411C33 8D542468 lea edx, dword ptr [esp+68] :00411C37 51 push ecx :00411C38 52 push edx * Reference To: KERNEL32.lstrcmpA, Ord:02FCh | :00411C39 FF15FC104F00 Call dword ptr [004F10FC] :00411C3F 85C0 test eax, eax :00411C41 7413 je 00411C56 <----这个一定要使它跳。 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00411BEE(C), :00411C0D(C), :00411C2D(C) | :00411C43 46 inc esi <----如果跳到这里再改就难了。 :00411C44 83FE1A cmp esi, 0000001A :00411C47 7296 jb 00411BDF :00411C49 5F pop edi :00411C4A 5E pop esi :00411C4B 5D pop ebp :00411C4C 33C0 xor eax, eax :00411C4E 5B pop ebx :00411C4F 81C4D8000000 add esp, 000000D8 :00411C55 C3 ret * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00411C41(C) | :00411C56 8D4641 lea eax, dword ptr [esi+41] 《---如果程式来到这里就放心了一半。但还有下文哦！^_^ :00411C59 5F pop edi :00411C5A 5E pop esi :00411C5B 5D pop ebp :00411C5C 5B pop ebx :00411C5D 81C4D8000000 add esp, 000000D8 :00411C63 C3 ret 《-----回到主程式到按F10 一直到,以下代码： :00411E0F 0F84F7000000 je 00411F0C <---这个嘛!只要将其改为je 411e79就能成功进入游戏了。 最后总结一下啦！只要将411c0d jnz 411c43 改为：jnz 411c56 411e0f jz 411f0c 改为: jz 411e79 或者 用HIEW6.40将大富翁五的执行文件打开找: f8057346a00 改为：f80575476a00 85c00f84f7000000 改为：85c00f8464000000 2001年7月20写 富强工作室 E-MAIL:lfq168@163.com 主页:lfq668.yeah.net


大航海时代3：新世纪

标 题:《大航海时代3：新世纪》的不完全破解 (4千字)
发信人:bwkpjq
时 间:2001-1-16 22:24:02
详细信息:
大航海时代3：新世纪破解手记

这是一款新上市的大航海系列游戏，昨天买回家后，花了十分钟就搞定了。这个游戏挺简单的，不放光盘会跳出“请将游戏光盘插入光碟机”的提示，将EXE文件反汇编后，找到这句话，便会来到如下代码：

第一处：
:0040361A E821730800 call 0048A940
:00403621 7513 jne 00403636
* Possible StringData Ref from Data Obj ->"叫р⒉笴栏盒盒诀"

第二处：
:00403657 83C408 add esp, 00000008
:0040365A 83F8FF cmp eax, FFFFFFFF
:0040365D 7513 jne 00403672

* Possible StringData Ref from Data Obj ->"叫р⒉笴栏盒盒诀"
->"絋粄"
|
:0040365F 6894E35100 push 0051E394
:00403664 6A00 push 00000000
:00403666 6A00 push 00000000
:00403668 E813B20200 call 0042E880
:0040366D 83C40C add esp, 0000000C

第三处：

:00435D35 E8064C0500 call 0048A940
:00435D3A 85C0 test eax, eax
:00435D3C 751E jne 00435D5C

* Possible StringData Ref from Data Obj ->"叫р⒉笴栏盒盒诀"
->"絋粄"
|
:00435D3E 6894E35100 push 0051E394
:00435D43 6A00 push 00000000
:00435D45 6A00 push 00000000

第四处：
:004413C9 83C404 add esp, 00000004
:004413CC 8BF0 mov esi, eax
:004413CE 85F6 test esi, esi
:004413D0 7525 jne 004413F7

* Possible StringData Ref from Data Obj ->"叫р⒉笴栏盒盒诀
?
->"锞堋yいゎ挡笴栏"
|
:004413D2 6850AB5200 push 0052AB50

第五处：
:00445B11 E88ABD0600 call 004B18A0
:00445B16 85C0 test eax, eax
:00445B18 7513 jne 00445B2D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445AED(C)
|

* Possible StringData Ref from Data Obj ->"叫р⒉笴栏盒盒诀"
->"絋粄龄"
|
:00445B1A 680C2B5300 push 00532B0C
:00445B1F 6A00 push 00000000
:00445B21 6A00 push 00000000

第六处：
* Reference To: KeRNeL32.GetDriveTypeA, Ord:0000h
|
:004BA533 FF1548846000 Call dword ptr [00608448]
:004BA539 83F802 cmp eax, 00000002
:004BA53C 7416 je 004BA554
:004BA53E 83F803 cmp eax, 00000003
:004BA541 7415 je 004BA558
:004BA543 83F805 cmp eax, 00000005
:004BA546 7205 jb 004BA54D
:004BA548 83F806 cmp eax, 00000006
:004BA54B 760B jbe 004BA558

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA546(C)
|
:004BA54D B8FFFFFFFF mov eax, FFFFFFFF
:004BA552 EB09 jmp 004BA55D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA53C(C)
|
:004BA554 33C0 xor eax, eax
:004BA556 EB05 jmp 004BA55D

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BA541(C), :004BA54B(C)
|
:004BA558 B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BA552(U), :004BA556(U)
|
:004BA55D 5F pop edi
:004BA55E 5E pop esi
:004BA55F 8BE5 mov esp, ebp
:004BA561 5D pop ebp
:004BA562 C3 ret

看到了吗，共有5处地方会出现提示，而且每个提示上面都是一条跳转命令，把所有的jne改为je即可。
下面第六处是CD检测，不过这里改不改都没有关系。这样一来，游戏可以免光盘运行，只是没有音乐，也看不到动画片，破地不完全。
bwkpjq
E-Mail:bwkpjq@yeah.net
http://go.163.com/~bwkpjq

标 题:乱码的注释部分是BIG5码 (空)
发信人:1212
时 间:2001-1-17 8:58:42
详细信息:


古龙群侠传

 标 题:破古龙群侠传的简单过程 (6千字)
发信人:copyyour
时 间:2001-8-21 21:10:13
详细信息:
古龙群侠传光盘版变硬盘版的方法

昨天偶换了一个大大大硬盘!呵呵
所以要把以前没玩过的游戏补回来,今天去买了一张古龙群侠传,两张光盘那种
安装的时候看见上面写着,完美硬盘版,心想,偶的光驱可以不受罪啦!正在暗暗高兴,安装完毕了
马上启动,冬!!!!请放入游戏光盘!!倒!!!!!!!5555~~~~~~

骗子!55~唉,真想拿去换成硬盘版的,太远了,所以放弃了这个让我更累的想法,呵呵
偶是crack(别人说的)偶要自己想办法!哼

拿出偶那些已经有蜘蛛网的工具:w32adsm 还有UltraEdit-32810b注册版,trw2000(TAE!兄弟汉化版),冲击波2000(不知道是不是注册版,可能是免费使用的),起子,榔头,等等破解必备工具,准备开工!

首先发现gulong.exe文件加了壳的,由于玩游戏心切,所以也没看是什么壳,直接用冲击波看入口,再用trw脱,这里要注意的是,trw有两个命令可以脱壳,一个是ma什么的,一个是pe什么的,呵呵,用ma什么的脱壳后可以在其他平台下使用,而用pe什么的就不能.这个是偶出错多次最后经过坏球兄弟说的,呵呵

脱壳完成后,用w32adsm反,完了以后看IMPORTS点击后找GetDriveTypeA 这个可是获取光驱类型的重要函数哟,
找到后双击来到以下代码处:

* Possible StringData Ref from Data Obj ->"C:\" =========>>哇!首先检查c:\,呵呵看见这个就知道crack不会很难哟.
|
:0042DCB1 BFE05B4500 mov edi, 00455BE0
:0042DCB6 83C9FF or ecx, FFFFFFFF
:0042DCB9 33C0 xor eax, eax

* Reference To: KERNEL32.GetDriveTypeA, Ord:0000h
|
:0042DCBB 8B2DDCA14400 mov ebp, dword ptr [0044A1DC]
:0042DCC1 F2 repnz
:0042DCC2 AE scasb
:0042DCC3 F7D1 not ecx
:0042DCC5 2BF9 sub edi, ecx
:0042DCC7 8BC1 mov eax, ecx
:0042DCC9 8BF7 mov esi, edi
:0042DCCB BFCC6B5500 mov edi, 00556BCC
:0042DCD0 C1E902 shr ecx, 02
:0042DCD3 F3 repz
:0042DCD4 A5 movsd
:0042DCD5 8BC8 mov ecx, eax
:0042DCD7 83E103 and ecx, 00000003
:0042DCDA F3 repz
:0042DCDB A4 movsb

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042DDA9(C)
|
:0042DCDC BB43000000 mov ebx, 00000043

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042DD8A(C)
|
:0042DCE1 68CC6B5500 push 00556BCC
:0042DCE6 881DCC6B5500 mov byte ptr [00556BCC], bl
:0042DCEC FFD5 call ebp
:0042DCEE 83F805 cmp eax, 00000005 ===>>>>>这是什么!!!!!!!没破过光盘的兄弟一定要牢记哟,5代表是光驱,3代表是硬盘,呵呵,还用我说什么吗?
:0042DCF1 0F858F000000 jne 0042DD86 =======>>是不等于5就跳走哟
:0042DCF7 BFCC6B5500 mov edi, 00556BCC
:0042DCFC 83C9FF or ecx, FFFFFFFF
:0042DCFF 33C0 xor eax, eax
:0042DD01 8D542410 lea edx, dword ptr [esp+10]
:0042DD05 F2 repnz
:0042DD06 AE scasb
:0042DD07 F7D1 not ecx
:0042DD09 2BF9 sub edi, ecx

* Possible StringData Ref from Data Obj ->"rb"
|
:0042DD0B 6844444500 push 00454444
:0042DD10 8BC1 mov eax, ecx
:0042DD12 8BF7 mov esi, edi
:0042DD14 8BFA mov edi, edx
:0042DD16 8D542414 lea edx, dword ptr [esp+14]
:0042DD1A C1E902 shr ecx, 02
:0042DD1D F3 repz
:0042DD1E A5 movsd
:0042DD1F 8BC8 mov ecx, eax
:0042DD21 33C0 xor eax, eax
:0042DD23 83E103 and ecx, 00000003
:0042DD26 F3 repz
:0042DD27 A4 movsb

* Possible StringData Ref from Data Obj ->"Disk3.PAK" ==========>>我发现光盘2上面有这个文件,而且上面也检查了c:\所以...嘿嘿 把这个文件拷贝到c:\去吧
|
:0042DD28 BFC05B4500 mov edi, 00455BC0
:0042DD2D 83C9FF or ecx, FFFFFFFF
:0042DD30 F2 repnz
:0042DD31 AE scasb
:0042DD32 F7D1 not ecx
:0042DD34 2BF9 sub edi, ecx
:0042DD36 8BF7 mov esi, edi
:0042DD38 8BFA mov edi, edx
:0042DD3A 8BD1 mov edx, ecx
:0042DD3C 83C9FF or ecx, FFFFFFFF
:0042DD3F F2 repnz
:0042DD40 AE scasb
:0042DD41 8BCA mov ecx, edx
:0042DD43 4F dec edi
:0042DD44 C1E902 shr ecx, 02
:0042DD47 F3 repz
:0042DD48 A5 movsd
:0042DD49 8BCA mov ecx, edx
:0042DD4B 8D442414 lea eax, dword ptr [esp+14]
:0042DD4F 83E103 and ecx, 00000003
:0042DD52 50 push eax
:0042DD53 F3 repz
:0042DD54 A4 movsb
:0042DD55 E8F1280000 call 0043064B
:0042DD5A 8BF0 mov esi, eax
:0042DD5C 83C408 add esp, 00000008
:0042DD5F 85F6 test esi, esi
:0042DD61 7423 je 0042DD86 ===>>跳到出错的地方!
:0042DD63 56 push esi
:0042DD64 E8A1390100 call 0044170A
:0042DD69 50 push eax
:0042DD6A E811390100 call 00441680
:0042DD6F 56 push esi
:0042DD70 8BF8 mov edi, eax
:0042DD72 E8ED260000 call 00430464
:0042DD77 83C40C add esp, 0000000C
:0042DD7A 81FFC0C1C006 cmp edi, 06C0C1C0
:0042DD80 0F840CFFFFFF je 0042DC92

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042DCF1(C), :0042DD61(C)
|
:0042DD86 43 inc ebx
:0042DD87 83FB5A cmp ebx, 0000005A
:0042DD8A 0F8C51FFFFFF jl 0042DCE1
:0042DD90 8B0DB0C44C00 mov ecx, dword ptr [004CC4B0]
:0042DD96 6A01 push 00000001
:0042DD98 51 push ecx

* Possible StringData Ref from Data Obj ->"请插入游戏碟！"
|
:0042DD99 68B05B4500 push 00455BB0
:0042DD9E 6A00 push 00000000

ok 知道怎样做了吗?两种方法,一种是改5为3 另外一种是改85为84

初学crack的朋友一定要记得:
:0042DCEE 83F805 cmp eax, 00000005 ===>>>>>这是什么!!!!!!!没破过光盘的兄弟一定要牢记哟,5代表是光驱,3代表是硬盘,呵呵,还用我说什么吗?
:0042DCF1 0F858F000000 jne 0042DD86

这里的分析哟,如果你还没搞定,就请用起子,榔头来搞,这样又方便有快速的,嘿嘿

BTW:硬盘变大了,以后我将继续写一些光盘版变硬盘版的方法,请大家支持,呵呵

cracked by copyyour[CCG]
2001.8.21


剑侠情缘2

 标 题:剑侠情缘2 (7千字)
发信人:Z-H
时 间:2000-9-16 22:48:28
详细信息:
读取光盘信息的软件，此类软件多为游戏软件，一般要调用"GetDriveTypeA（判断一个驱动器的类型）"以及"GetVolumeInformationA（返回卷标信息）等相关API函数，所以只要反编译成功后有针对性的分析这些函数所在位置的代码，并细心注意关键跳跃指令，往往起到事半功倍的效果。有时这些函数可能出现多个，也许单独出现，也许混合出现，但80%以上都是对光盘进行校验。这类游戏软件有：星际争霸、生化危机2、地狱火、等等。

实例：剑侠情缘2

运行 W32dsm89 打开游戏主执行程序文件，反编译成功后，单击“Imports”查看程序调用的相关函数，找到“KERNEL32.GetDriveTypeA”后双击将其打开，我们可看到如下代码：

:00409610 83EC48 sub esp, 00000048
:00409613 8D442408 lea eax, dword ptr [esp+08]
:00409617 53 push ebx
:00409618 56 push esi
:00409619 57 push edi

* Possible StringData Ref from Data Obj ->"C:" “从盘符"C:"开始
| 后的所有有效盘
:0040961A 684C804300 push 0043804C 符，结果存入EAX
:0040961F 50 push eax 中。”

* Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:00409620 FF15E0304300 Call dword ptr [004330E0]

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h “API函数标志，判断一个驱动器的类型”
~~~~~~~~~~~~~~~~~~~~~~
|
:00409626 8B3D70304300 mov edi, dword ptr [00433070]
:0040962C 33F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409648(C)
|
:0040962E 8D4C2414 lea ecx, dword ptr [esp+14]
:00409632 51 push ecx
:00409633 FFD7 call edi
:00409635 83F805 cmp eax, 00000005 “返回的值如等于5，则为CD-Rom驱动器”
:00409638 7410 je 0040964A 相等则跳转。“关键的一跳”
:0040963A 8A542414 mov dl, byte ptr [esp+14]
:0040963E FEC2 inc dl
:00409640 46 inc esi “下一个盘符”
:00409641 83FE18 cmp esi, 00000018 “我们将对24个英文字母（盘符）清扫一遍”
:00409644 88542414 mov byte ptr [esp+14], dl
:00409648 7CE4 jl 0040962E "再试一次吧，可能这个家伙的硬盘分区
太多了。"
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409638(C)
|

* Reference To: KERNEL32.SetErrorMode, Ord:0264h “API函数标志，设置出错模式”
|
:0040964A 8B3574304300 mov esi, dword ptr [00433074]
:00409650 6A01 push 00000001
:00409652 FFD6 call esi
:00409654 8BF8 mov edi, eax
:00409656 6A00 push 00000000
:00409658 8D542410 lea edx, dword ptr [esp+10]
:0040965C 6A00 push 00000000
:0040965E 8D442418 lea eax, dword ptr [esp+18]
:00409662 52 push edx
:00409663 50 push eax
:00409664 6A00 push 00000000
:00409666 8D4C2448 lea ecx, dword ptr [esp+48]
:0040966A 6A20 push 00000020
:0040966C 8D54242C lea edx, dword ptr [esp+2C]
:00409670 51 push ecx
:00409671 52 push edx

* Reference To: KERNEL32.GetVolumeInformationA, Ord:0177h “API函数标志，返回卷标信息”
|
:00409672 FF1578304300 Call dword ptr [00433078]
:00409678 57 push edi
:00409679 8BD8 mov ebx, eax
:0040967B FFD6 call esi
:0040967D 5F pop edi
:0040967E 5E pop esi
:0040967F 85DB test ebx, ebx “同志，你错了，连光盘都不在
:00409681 5B pop ebx 驱动器中，还有卷标吗？请插
:00409682 741D je 004096A1 入游戏光盘。”“关键的一跳”
:00409684 8D442428 lea eax, dword ptr [esp+28]

* Possible StringData Ref from Data Obj ->"JXQY2CD2"
|
:00409688 6840804300 push 00438040
:0040968D 50 push eax

* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:0040968E FF1580304300 Call dword ptr [00433080]
:00409694 85C0 test eax, eax “与运算”
:00409696 7509 jne 004096A1 “不相等则跳跃，请插入游戏光盘”“关键的一跳”
:00409698 B801000000 mov eax, 00000001 “完全正确，卷标为"JXQY2CD2"
:0040969D 83C448 add esp, 00000048 的光盘已在光盘驱动器中，谢
:004096A0 C3 ret 谢合作。”

单击“Imports”，找到“KERNEL32.GetDriveTypeA”后再双击将其打开，看一下是否还有相关代码，如果W32dsm89窗口中的光条还停留在原来的位置，说明该程序中只调用了一次这个函数，如不只一次出现则可能在多个地方都有判断。（可多试几次看一下有几个地方）现在我们又第二次看到如下代码：

:0040DC80 53 push ebx
:0040DC81 56 push esi
:0040DC82 8B74240C mov esi, dword ptr [esp+0C]
:0040DC86 57 push edi

* Possible StringData Ref from Data Obj ->"C:" “从盘符"C:"开始
| 后的所有有效盘
:0040DC87 684C804300 push 0043804C 符，结果存入EAX
:0040DC8C 56 push esi 中。”

* Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:0040DC8D FF15E0304300 Call dword ptr [004330E0]

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h “API函数标志，判断一个驱动器的类型”
~~~~~~~~~~~~~~~~~~~~~~
|
:0040DC93 8B1D70304300 mov ebx, dword ptr [00433070]
:0040DC99 33FF xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DCAD(C)
|
:0040DC9B 56 push esi
:0040DC9C FFD3 call ebx
:0040DC9E 83F805 cmp eax, 00000005 “返回的值如等于5，则为CD-Rom驱动器”
:0040DCA1 740C je 0040DCAF 相等则跳转。“关键的一跳”
:0040DCA3 8A16 mov dl, byte ptr [esi]
:0040DCA5 FEC2 inc dl
:0040DCA7 47 inc edi “下一个盘符”
:0040DCA8 83FF18 cmp edi, 00000018
:0040DCAB 8816 mov byte ptr [esi], dl
:0040DCAD 7CEC jl 0040DC9B “再试一次”

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DCA1(C)
|
:0040DCAF 8B5C2414 mov ebx, dword ptr [esp+14]
:0040DCB3 803B5C cmp byte ptr [ebx], 5C
:0040DCB6 750C jne 0040DCC4 不相等则跳转，不跳就完了。“关键的一跳”
:0040DCB8 53 push ebx
:0040DCB9 56 push esi

* Reference To: KERNEL32.lstrcatA, Ord:02F9h
|
:0040DCBA FF1530304300 Call dword ptr [00433030]
:0040DCC0 5F pop edi
:0040DCC1 5E pop esi
:0040DCC2 5B pop ebx
:0040DCC3 C3 ret

好了，让这个游戏不读光盘的方法有很多，如“cmp eax, 00000005”改为“cmp eax, 00000003”再跳过卷标检查，或直接修改关键跳转指令，任你发挥。

费话，还有某些游戏软件需要读光盘上的某个文件，可利用W32dsm89的“String Data References”命令查找该文件名称字串在W32dsm89代码窗口中的位置，并分析关键代码，修改时去掉该文件检查的CALL或强行跳过即可。这类游戏如：

风云之天下会 ---- 要跳过“winc.dat”
笑傲江湖 -------- 要跳过“resource.dat”、“Opening.avi”

初学之作烦请前辈高手多多指点


凯撒大帝III/幻世录/天子传奇

标 题:关于几个简单游戏的CD保护破解。 (3千字)
发信人:bwkpjq
时 间:2001-1-5 20:03:04
详细信息:
凯撒大帝III的硬盘版制作法
凯撒大帝III是一款不错的经营站略游戏，虽然在模拟经营方面不及模拟城市
3000，游戏中的战斗也没有什么惊心动魄的场面，不过总体来说还过得去。
我对TRW的使用一直不顺，还是老办法，就像我破《幻世录》一样，用W32dsm将游戏的exe文件进行反汇编，可以找到
--------
0049E8CA JZ 0049E87B
0049E8A9 CALL ESI （user32!messageboxA)------这条指令一执行，就会跳出《请放入光盘》的提示。
往上走走，看有什么地方可以跳过它，找到：
0049E873 JNE 0049E8D6 用TRW载入，将其动态的改为：JE 0049E8D6
OK！游戏正常进行！
于是用UltraEdit打开EXE文件，找到：83 C4 08 85 C0 75 61
改为：83 C4 08 85 C0 74 61
存盘，OK！
有什么问题请来信与我交流！
bwkpjq
E-Mail:bwkpjq@yeah.net
幻世录的硬盘版制作法

幻世录是一款比较出色的RPG游戏，我第一次迷上电脑游戏就是为了它，美丽的2D画面，绚丽的魔法场景，深深地吸引了我。
言归正传，这是我第一次破解游戏，按照网上学来的三脚帽功夫，用TRW载入游戏后，却迷失了方向，种种办法都用不上，那个急哟！
我不甘心，想起游戏如果不放入光盘，会跳出那个可恶的CD-ROM NOT FOUND！于是据此为线索，用W32dsm载入exe文件进行反汇编，找到——
00433F21 837C240400 cmp dword ptr[esp+04],00000000
00433F26 7512 jne 00433F3A
----过了这儿就会跳出可恶的CD-ROM NOT FOUND！
试着改了之后，居然不行！于是接着再搞，无意中发现下面还有一处：
00433F90 83F8FF cmp eax,FFFFFFFF
00433F93 751B jne 00433FB0
----一过这儿又会跳出那个可恶的--
用TRW载入游戏后，设BPX GetDriveTypeA,直接转到上述两个地方，将jne动态的改为je后试运行，OK！搞定！
退出TRW立刻用UltraEdit进行修改，
将 83 7C 24 04 00 75 12
改为 83 7C 24 04 00 74 12,
将 83 F8 FF 75 1B
改为 83 F8 00 74 1B
存盘，OK！
有遗漏之处请来信于我交流！
BWKPJQ
E-Mail:bwkpjq@yeah.net
2000.12.06
《天子传奇》硬盘版制作手记
此游戏有两张光盘，第一张为安装盘，第二张为游戏盘，惯例第二盘上是动画，声音等文件，如要脱离光盘运行，必须把动画，声音文件复制到游戏安装目录下。之后取出光盘，执行游戏，会跳出“please insert disk"的提示，用P32Wdsm反汇编游戏的EXE文件，找到“please insert disk"字样，然后向上分析，发现程序执行到CS:0040DD86后就会跳出“please insert disk"的提示，看看有什么地方可以跳过它，
找到：cs:0040DD4D cmp byte ptr[ebp+20],00
cs:0040DD51 jne 0040DD95 -------------------这里不跳就完！。
找到：cs:0040DD7D cmp byte ptr[edx+32],00
cs:0040DD81 je 0040DD95--------------------这里不跳就完。
分析得出，只要跳到cs:0040DD95就OK了！
用UltraEdit打开EXE文件，找到：80 7D 20 00 74 42
改为：80 7D 20 00 75 42
找到：80 7A 32 00 75 12
改为：80 7A 32 00 74 12
存盘，搞定！
如有什么问题，欢迎来信交流！
Bwkpjq
E-Mail:bwkpjq@yeah.net
另附《春秋英雄传》硬盘版制作法：
只需用UltraEdit在 .exe文件中找到：83 F8 FF 75 29
改为：83 F8 00 75 29即可！


雷霆战将

 标 题:《雷霆战将》检查cd代码，有用看看。 (6千字)
发信人:slgx
时 间:2001-8-27 1:47:09
详细信息:
刚买的《雷霆战将》就被一无耻之徒顺手牵羊。痛感交友不当之后写下此文，望后来者以儆效尤。

首先用w32dasm反汇编之RogueSpear.exe。
在查找“cd”“nocd”“GetVolumeInformationA”“GetLogicalDriveStringsA”
之类的子串，我们来到下面的代码：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C27D(C)
|
:0040C1EC 5F pop edi
:0040C1ED 5E pop esi
:0040C1EE 5D pop ebp
:0040C1EF B001 mov al, 01
:0040C1F1 5B pop ebx
:0040C1F2 81C410060000 add esp, 00000610
:0040C1F8 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C1EA(C)
|
:0040C1F9 8D94241C020000 lea edx, dword ptr [esp+0000021C]
:0040C200 52 push edx
:0040C201 6800040000 push 00000400

* Reference To: KERNEL32.GetLogicalDriveStringsA, Ord:011Eh－－－－－取当前路径。
|
:0040C206 FF15A8507600 Call dword ptr [007650A8]
:0040C20C 8BD8 mov ebx, eax
:0040C20E 85DB test ebx, ebx
:0040C210 750A jne 0040C21C－－－－－－－如果是完全安装，ok。

* Possible StringData Ref from Data Obj ->"GAME: Could not get drives installed "
->"in the system"
|
:0040C212 6884517B00 push 007B5184
:0040C217 E986000000 jmp 0040C2A2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C210(C)
|
:0040C21C 33F6 xor esi, esi
:0040C21E 85DB test ebx, ebx
:0040C220 7E7B jle 0040C29D－－－－－－－－cd都不装，就别想玩游戏。

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h－－－－－－－检查单前盘是否是cd。
|
:0040C222 8B2DAC507600 mov ebp, dword ptr [007650AC]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C29B(C)
|
:0040C228 8DBC341C020000 lea edi, dword ptr [esp+esi+0000021C]
:0040C22F 57 push edi
:0040C230 FFD5 call ebp
:0040C232 83F805 cmp eax, 00000005
:0040C235 754C jne 0040C283－－－－－－－－不是光驱，game over。
:0040C237 8D84241C010000 lea eax, dword ptr [esp+0000011C]
:0040C23E 6800010000 push 00000100
:0040C243 8D4C241C lea ecx, dword ptr [esp+1C]
:0040C247 50 push eax
:0040C248 8D54241C lea edx, dword ptr [esp+1C]
:0040C24C 51 push ecx
:0040C24D 8D44241C lea eax, dword ptr [esp+1C]
:0040C251 52 push edx
:0040C252 50 push eax
:0040C253 8D4C2430 lea ecx, dword ptr [esp+30]
:0040C257 6800010000 push 00000100
:0040C25C 51 push ecx
:0040C25D 57 push edi

* Reference To: KERNEL32.GetVolumeInformationA, Ord:0177h－－－－－－检查卷标。
|
:0040C25E FF15B0507600 Call dword ptr [007650B0]
:0040C264 83F801 cmp eax, 00000001
:0040C267 751A jne 0040C283－－－－－－不成功，让你死的难看。
:0040C269 8D54241C lea edx, dword ptr [esp+1C]

* Possible StringData Ref from Data Obj ->"ROGUESPR"－－－－－光盘卷标。
|
:0040C26D 6878517B00 push 007B5178
:0040C272 52 push edx
:0040C273 E898112900 call 0069D410
:0040C278 83C408 add esp, 00000008
:0040C27B 85C0 test eax, eax
:0040C27D 0F8469FFFFFF je 0040C1EC－－－－－ok，检查完毕退出CALL。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040C235(C), :0040C267(C)
|
:0040C283 803F00 cmp byte ptr [edi], 00－－－－是否读卷标失败。
:0040C286 7410 je 0040C298

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C296(C)
|
:0040C288 3BF3 cmp esi, ebx－－－－－是否再读几次。
:0040C28A 7D0C jge 0040C298
:0040C28C 8A84341D020000 mov al, byte ptr [esp+esi+0000021D]
:0040C293 46 inc esi
:0040C294 84C0 test al, al
:0040C296 75F0 jne 0040C288－－－－－循环。

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040C286(C), :0040C28A(C)
|
:0040C298 46 inc esi
:0040C299 3BF3 cmp esi, ebx
:0040C29B 7C8B jl 0040C228－－－－－－再给你几次机会。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C220(C)
|

* Possible StringData Ref from Data Obj ->"GAME: Could not find CD"－－－－－－game over。
|
:0040C29D 6860517B00 push 007B5160

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C217(U)
|
:0040C2A2 B914468100 mov ecx, 00814614
:0040C2A7 E878EC2800 call 0069AF24
:0040C2AC 6850174000 push 00401750
:0040C2B1 6A0A push 0000000A
:0040C2B3 8BC8 mov ecx, eax
:0040C2B5 E823EB2800 call 0069ADDD
:0040C2BA 8BC8 mov ecx, eax
:0040C2BC E86F54FFFF call 00401730
:0040C2C1 B908468100 mov ecx, 00814608
:0040C2C6 E8C5240200 call 0042E790
:0040C2CB 5F pop edi
:0040C2CC 5E pop esi
:0040C2CD 5D pop ebp
:0040C2CE 32C0 xor al, al
:0040C2D0 5B pop ebx
:0040C2D1 81C410060000 add esp, 00000610
:0040C2D7 C3 ret－－－－－－－－－－－－－－退出CALL。

:0040C2D8 90 nop
:0040C2D9 90 nop
:0040C2DA 90 nop
:0040C2DB 90 nop
:0040C2DC 90 nop
:0040C2DD 90 nop
:0040C2DE 90 nop
:0040C2DF 90 nop

自己看者办，要乎乎了。
Zzzzzzzzzz。。。。。


盟军敢死队

 标 题:正版“盟军敢死队”密匙光盘加密破解实录 (7千字)
发信人:liangs
时 间:2000-10-19 23:40:20
详细信息:
正版“盟军敢死队”密匙光盘加密破解实录

Write By liangs

声明：本文不是叫你怎么去盗版，而仅仅是作为一种Crack技术交流。
使用工具：Trw2000; W32Dasm; UltraEdit

好久没写点什么了，只因为最近家里刚刚添了个小Baby,忙的要死。
就把前不久刚刚破解的盟军敢死队光盘加密的记录整理了一下，
权且充当一篇文章吧。

在看这篇文章之前，建议大家先好好看看看雪兄整理的“论坛精华2”
中关于CD-CHECK的两篇译文，对大家会有很大的帮助，那里面介绍的
光盘加密方式很有通用性。

先用资源管理器查看原光盘，发现光盘容量居然有3.05GB！
其中光盘根目录下的Bbvn.afp，Btbw.afp，Etao.afp，Tbtp.afp
等四个文件个个都有680MB以上，不用说可能又是SafeDisk之类的光盘
加密方式。

对付上述光盘加密方式，我们通常都从盘上的那几个680MB以上的文件
入手，这里是Tbtp.afp，Bbvn.afp，Btbw.afp，Etao.afp等四个文件。

首先运行Comandos.exe，再运行Trw2000，下bpx GetDriveTypeA指令，
回到游戏中，选择游戏菜单中New Game下的Single Player选项。

* Reference To: KERNEL32.GetDriveTypeA, Ord:00CEh
|
:00494A01 8B3514266600 mov esi, dword ptr [00662614]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00494A8C(C)
|
:00494A07 8D44240C lea eax, dword ptr [esp+0C]
:00494A0B 885C240C mov byte ptr [esp+0C], bl
:00494A0F 50 push eax
:00494A10 FFD6 call esi
GetDriveTypeA指令返回时我们停在这。

:00494A12 83F805 cmp eax, 00000005
这条指令是不是很眼熟啊！

:00494A15 7570 jne 00494A87
如果没放光盘，将跳走。

* Possible StringData Ref from Data Obj ->"rb"
|
:00494A17 68900F5F00 push 005F0F90
:00494A1C 881D10266000 mov byte ptr [00602610], bl

* Possible StringData Ref from Data Obj ->"d:\TBTP.AFP"

大家注意了，看见上面的"d:\TBTP.AFP"没有，下面的判断就是关于它的。
|
:00494A22 6810266000 push 00602610
:00494A27 881D20266000 mov byte ptr [00602620], bl
:00494A2D 881D30266000 mov byte ptr [00602630], bl
:00494A33 881D40266000 mov byte ptr [00602640], bl
:00494A39 E8D2A81300 call 005CF310
检查光盘是否有“TBTP.AFP”这个文件
:00494A3E 83C408 add esp, 00000008
:00494A41 8BF8 mov edi, eax
:00494A43 85FF test edi, edi
:00494A45 750A jne 00494A51
如果光盘有“TBTP.AFP”这个文件，就跳到下一个地址继续检查

:00494A47 C744241000000000 mov [esp+10], 00000000
:00494A4F EB2E jmp 00494A7F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00494A45(C)
|
:00494A51 6A00 push 00000000
:00494A53 6800A08329 push 2983A000
保存偏移地址“2983A000”

:00494A58 57 push edi
:00494A59 E8C2AD1300 call 005CF820
指针指向文件中的偏移地址

:00494A5E 83C40C add esp, 0000000C
:00494A61 57 push edi
:00494A62 E879AD1300 call 005CF7E0
取偏移地址处的文件数据

:00494A67 83C404 add esp, 00000004
:00494A6A 33C9 xor ecx, ecx
:00494A6C 83F829 cmp eax, 00000029
文件偏移地址“2983A000”处的值是否等于“00000029”

:00494A6F 0F94C1 sete cl
:00494A72 894C2410 mov dword ptr [esp+10], ecx
:00494A76 57 push edi
:00494A77 E8F4A71300 call 005CF270
:00494A7C 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00494A4F(U)
|
:00494A7F 8B442410 mov eax, dword ptr [esp+10]
:00494A83 85C0 test eax, eax
:00494A85 7514 jne 00494A9B
如果检查条件满足，就跳走。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00494A15(C)
|
:00494A87 FEC3 inc bl
:00494A89 80FB5A cmp bl, 5A
:00494A8C 0F8E75FFFFFF jle 00494A07
:00494A92 33C0 xor eax, eax
EAX标志清0，表示没有放光盘

:00494A94 5F pop edi
:00494A95 5E pop esi
:00494A96 5B pop ebx
:00494A97 83C408 add esp, 00000008
:00494A9A C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00494A85(C)
|
:00494A9B B801000000 mov eax, 00000001
EAX标志置1，表示放入了光盘，并通过了“TBTP.AFP”文件的检查。

:00494AA0 5F pop edi
:00494AA1 5E pop esi
:00494AA2 5B pop ebx
:00494AA3 83C408 add esp, 00000008
:00494AA6 C3 ret

-------------------------------------------------------------------

从上面的ret返回后，我们来到0044CB04处，

* Referenced by a CALL at Addresses:
|:00447E9C , :00448015
|
:0044CAF0 83EC0C sub esp, 0000000C
:0044CAF3 A1980A5F00 mov eax, dword ptr [005F0A98]
:0044CAF8 85C0 test eax, eax
:0044CAFA 90 nop
:0044CAFB 53 push ebx
:0044CAFC 56 push esi
:0044CAFD 7413 je 0044CB12

:0044CAFF E8EC7E0400 call 004949F0
这就是上面的光盘及“TBTP.AFP”文件检查判断

:0044CB04 85C0 test eax, eax
:0044CB06 740A je 0044CB12
跳就完蛋了！

:0044CB08 C705980A5F0000000000 mov dword ptr [005F0A98], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0044CAFD(C), :0044CB06(C)

下面是光盘上那几个*.AFP文件的判别，与上面“TBTP.AFP”文件的
分析一样。

......部分相同代码略

* Possible StringData Ref from Data Obj ->"rb"
|
:0044CB59 68900F5F00 push 005F0F90

* Possible StringData Ref from Data Obj ->"d:\BBVN.AFP"
对“BBVN.AFP”文件的检查
|
:0044CB5E 6820266000 push 00602620
:0044CB63 E8A8271800 call 005CF310
:0044CB68 83C408 add esp, 00000008
:0044CB6B 8BF0 mov esi, eax
:0044CB6D 85F6 test esi, esi
:0044CB6F 750A jne 0044CB7B
:0044CB71 C744241000000000 mov [esp+10], 00000000
:0044CB79 EB2E jmp 0044CBA9

......部分相同代码略

按F12返回更上一级Call,来到如下地址：

:00448015 E8D64A0000 call 0044CAF0
上面所有的判断都在这个Call里面
:0044801A 85C0 test eax, eax
:0044801C 7418 je 00448036

我们的目的就是要使，eax=1，使je 00448036不跳转，
因此，只要将0044801C处的je 00448036改为NOP就可以了。

重新运行游戏，New Game下的Single Player选项已经可以玩了，
不再需要光盘。不要以为这样就已经破解完了，如果你再试试Load Game，
就会发现还要提示插入光盘，说明还没破解干净。

在按下Load Game菜单前再下bpx GetDriveTypeA指令
中断后，我们还是会回到上面的00494A12处，
按F12返回上一级调用，来到0044CB06处
再按F12返回更上一级调用，来到00447EA3处
只要再将00447EA3的跳转都改成NOP就可以了，至此，“盟军敢死队”
密匙光盘加密就完全破解完了。


奇迹时代

标 题:<奇迹时代>一个类似于英雄无敌三的游戏,它的光盘校验不是主程序"AoW.exe" (7千字)
发信人:华 仔
时 间:2001-1-13 20:23:01
详细信息:
<奇迹时代>
一个类似于英雄无敌三的游戏,它的光盘校验不是主程序"AoW.exe"
而是"AoWEPACK.dpl"实际上是一个DLL文件,AoW.exe里同样有校验
但只是虚设,我开始就在它里面转圈子,这一点让我耽误了好几分钟
时间。

以下是AoWEPACK.dpl中无聊的光盘校验代码:

* Referenced by a CALL at Address:
|:557063ED
|

Exported fn(): AoWReg.AoWCDInserted@82678C4D - Ord:0004h
:55706374 53 push ebx
:55706375 56 push esi
:55706376 57 push edi
:55706377 51 push ecx
:55706378 33DB xor ebx, ebx
:5570637A 33F6 xor esi, esi

* Reference To: kernel32.GetLogicalDrives, Ord:0000h
|
:5570637C E803B1FFFF Call 55701484
:55706381 8BF8 mov edi, eax
:55706383 EB24 jmp 557063A9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:557063B0(C)
|
:55706385 8BCE mov ecx, esi
:55706387 B801000000 mov eax, 00000001
:5570638C D3E0 shl eax, cl
:5570638E 85F8 test eax, edi
:55706390 7416 je 557063A8
:55706392 8BC6 mov eax, esi
:55706394 0461 add al, 61
:55706396 880424 mov byte ptr [esp], al
:55706399 8A0424 mov al, byte ptr [esp]
* Reference To: AoWEPACK.AoWReg.ValidAoWCD@BF94463D
|
:5570639C E8D3FEFFFF call 55706274 -->检查光盘的CALL,想省事的话
:557063A1 84C0 test al, al -->改为B801000000(MOV EAX,00000001)
:557063A3 7403 je 557063A8
:557063A5 8A1C24 mov bl, byte ptr [esp]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:55706390(C), :557063A3(C)
|
:557063A8 46 inc esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:55706383(U)
|
:557063A9 84DB test bl, bl
:557063AB 7505 jne 557063B2
:557063AD 83FE1A cmp esi, 0000001A
:557063B0 75D3 jne 55706385

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:557063AB(C)
|
:557063B2 8BC3 mov eax, ebx
:557063B4 5A pop edx
:557063B5 5F pop edi
:557063B6 5E pop esi
:557063B7 5B pop ebx
:557063B8 C3 ret

call 55706274 的内容:

* Referenced by a CALL at Address:
|:5570639C
|

Exported fn(): AoWReg.ValidAoWCD@BF94463D - Ord:0005h
:55706274 55 push ebp
:55706275 8BEC mov ebp, esp
:55706277 6A00 push 00000000
:55706279 6A00 push 00000000
:5570627B 6A00 push 00000000
:5570627D 53 push ebx
:5570627E 8845FF mov byte ptr [ebp-01], al
:55706281 33C0 xor eax, eax
:55706283 55 push ebp
:55706284 682E637055 push 5570632E
:55706289 64FF30 push dword ptr fs:[eax]
:5570628C 648920 mov dword ptr fs:[eax], esp
:5570628F 8D45F4 lea eax, dword ptr [ebp-0C]
:55706292 8A55FF mov dl, byte ptr [ebp-01]

* Reference To: VCL30.System.@LStrFromChar@001FB870, Ord:0000h
|
:55706295 E8C6AEFFFF Call 55701160
:5570629A 8B55F4 mov edx, dword ptr [ebp-0C]
:5570629D 8D45F8 lea eax, dword ptr [ebp-08]
:557062A0 B944637055 mov ecx, 55706344

* Reference To: VCL30.System.@LStrCat3@51F89FF7, Ord:0000h
|
:557062A5 E8E6AEFFFF Call 55701190
:557062AA 8B45F8 mov eax, dword ptr [ebp-08]

* Reference To: VCL30.System.@LStrToPChar@51F89FF7, Ord:0000h
|
:557062AD E8FEAEFFFF Call 557011B0
:557062B2 50 push eax

* Reference To: kernel32.GetDriveTypeA, Ord:0000h
|
:557062B3 E8BCB1FFFF Call 55701474
:557062B8 83F805 cmp eax, 00000005
:557062BB 7554 jne 55706311
:557062BD 8D45F4 lea eax, dword ptr [ebp-0C]
:557062C0 8A55FF mov dl, byte ptr [ebp-01]

* Reference To: VCL30.System.@LStrFromChar@001FB870, Ord:0000h
|
:557062C3 E898AEFFFF Call 55701160
:557062C8 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->":\AoWSetup.exe" -->读取光盘中根目录下
| -->的AoWSetup.exe文件
:557062CB BA50637055 mov edx, 55706350

* Reference To: VCL30.System.@LStrCat@51F89FF7, Ord:0000h
|
:557062D0 E8B3AEFFFF Call 55701188

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:55706261(C)
|
:557062D5 8B45F4 mov eax, dword ptr [ebp-0C]

* Reference To: VCL30.SysUtils.FileExists@3C9BDBFB, Ord:0000h
|
:557062D8 E8C7B2FFFF Call 557015A4
:557062DD 8BD8 mov ebx, eax
:557062DF 84DB test bl, bl
:557062E1 7424 je 55706307
:557062E3 8D45F4 lea eax, dword ptr [ebp-0C]
:557062E6 8A55FF mov dl, byte ptr [ebp-01]

* Reference To: VCL30.System.@LStrFromChar@001FB870, Ord:0000h
|
:557062E9 E872AEFFFF Call 55701160
:557062EE 8D45F4 lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->":\setup.exe"-->再读SETUP.EXE文件
|
:557062F1 BA68637O55 mov edx, 55706368

* Reference To: VCL30.System.@LStrCat@51F89FF7, Ord:0000h
|
:557062F6 E88DAEFFFF Call 55701188
:557062FB 8B45F4 mov eax, dword ptr [ebp-0C]

* Reference To: VCL30.SysUtils.FileExists@3C9BDBFB, Ord:0000h
|
:557062FE E8A1B2FFFF Call 557015A4
:55706303 84C0 test al, al
:55706305 7504 jne 5570630B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:557062E1(C)
|
:55706307 33C0 xor eax, eax
:55706309 EB02 jmp 5570630D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:55706305(C)
|
:5570630B B001 mov al, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:55706309(U)
|
:5570630D 8BD8 mov ebx, eax
:5570630F EB02 jmp 55706313

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:557062BB(C)
|
:55706311 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:5570630F(U)
|
:55706313 33C0 xor eax, eax
:55706315 5A pop edx
:55706316 59 pop ecx
:55706317 59 pop ecx
:55706318 648910 mov dword ptr fs:[eax], edx
:5570631B 6835637055 push 55706335

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:55706333(U)
|
:55706320 8D45F4 lea eax, dword ptr [ebp-0C]
:55706323 BA02000000 mov edx, 00000002

* Reference To: VCL30.System.@LStrArrayClr@51F89FF7, Ord:0000h
|
:55706328 E81BAEFFFF Call 55701148
:5570632D C3 ret


 破解 三国群英2 这个游戏我解了很久的了，只不过没有写出来罢了。（这个太容易解了） 首先运行TRW2000 按 CTRL+N 输入：bpx getdrivetypea :00453A97 8945F8 mov dword ptr [ebp-08], eax <---这些不用管它了，直追到:4302f2 :00453A9A 837DF805 cmp dword ptr [ebp-08], 00000005 :00453A9E 750B jne 00453AAB :00453AA0 8B55FC mov edx, dword ptr [ebp-04] :00453AA3 891510044900 mov dword ptr [00490410], edx :00453AA9 EB02 jmp 00453AAD * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00453A9E(C) | :00453AAB EBC8 jmp 00453A75 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00453A82(C), :00453AA9(U) | :00453AAD 8BE5 mov esp, ebp :00453AAF 5D pop ebp :00453AB0 C3 ret * * * 追到： :004302F2 E856FFFFFF call 0043024D <---将这个CALL斩了就行了。(即将e856ffffff改为：9090909090 就可以了，自己再用HIEW改了它就能不用光盘玩三国群英2了） :004302F7 E8541F0200 call 00452250 * Possible StringData Ref from Data Obj ->"SANGO2.PAK" | :004302FC 685CB54800 push 0048B55C :00430301 E8DD220200 call 004525E3 2001年7月20日写 富强工作室 E-MAIL: lfq168@163.com 主页:lfq668.yeah.net


三角洲部队之大地勇士

 标 题:三角洲部队之大地勇士光盘版的破解 (3千字)
发信人:大波罗
时 间:2001-8-24 18:26:50
详细信息:
三角洲部队之大地勇士光盘版的破解

前几天到电脑市场买了这个游戏，没光盘也能玩，不过只能玩Multiplayer的join模式，不插光盘毫无提示，破解颇费了一番周折，首先查看了安装目录下的文件，发现DFLW.CD里面有光驱的盘符G：，先下断BPX GETDRIVETYPE，运行游戏......，怎么？没拦住？用W32DASM反汇编DFLW.EXE,发现并没加壳，查看输入的函数，KERNEL32里没有此函数，难怪没拦住。但看到GETVOLUMEINFORMATIONA,双击它，来到：

* Reference To: KERNEL32.GetVolumeInformationA, Ord:01DEh ----------------读取卷信息
|
:0042E7E9 FF1544524E00 Call dword ptr [004E5244]
:0042E7EF 6A0B push 0000000B
:0042E7F1 8D8424B4000000 lea eax, dword ptr [esp+000000B4]

* Possible StringData Ref from Data Obj ->"DELTAFORCELW" -----------------这不是光盘的卷名吗？有戏！
|
:0042E7F8 682C834E00 push 004E832C
:0042E7FD 50 push eax
:0042E7FE E89DA60800 call 004B8EA0
:0042E803 83C40C add esp, 0000000C
:0042E806 85C0 test eax, eax
:0042E808 7549 jne 0042E853
:0042E80A 53 push ebx

* Possible StringData Ref from Data Obj ->"CDFS" ------------------- 光盘的标志
|
:0042E80B BE24834E00 mov esi, 004E8324
:0042E810 8D8424B4010000 lea eax, dword ptr [esp+000001B4]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042E839(C)
|
:0042E817 8A10 mov dl, byte ptr [eax]
:0042E819 8A1E mov bl, byte ptr [esi]
:0042E81B 8ACA mov cl, dl
:0042E81D 3AD3 cmp dl, bl
:0042E81F 751E jne 0042E83F
:0042E821 84C9 test cl, cl
:0042E823 7416 je 0042E83B
:0042E825 8A5001 mov dl, byte ptr [eax+01]
:0042E828 8A5E01 mov bl, byte ptr [esi+01]
:0042E82B 8ACA mov cl, dl
:0042E82D 3AD3 cmp dl, bl
:0042E82F 750E jne 0042E83F
:0042E831 83C002 add eax, 00000002
:0042E834 83C602 add esi, 00000002
:0042E837 84C9 test cl, cl
:0042E839 75DC jne 0042E817

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042E823(C)
|
:0042E83B 33C0 xor eax, eax
:0042E83D EB05 jmp 0042E844

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042E81F(C), :0042E82F(C)
|
:0042E83F 1BC0 sbb eax, eax
:0042E841 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042E83D(U)
|
:0042E844 85C0 test eax, eax
:0042E846 5B pop ebx
:0042E847 750A jne 0042E853
:0042E849 C705CCD9CD0000000000 mov dword ptr [00CDD9CC], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042E775(C), :0042E808(C), :0042E847(C)
|
:0042E853 5E pop esi
:0042E854 81C4AC020000 add esp, 000002AC
:0042E85A C3 ret
试着将上述的几个跳转改一下，均未成功，苦思冥想时，觉得:0042E849 mov dword ptr [00CDD9CC], 00000000有点问题，试着改为mov dword ptr [00CDD9CC], 00000001，再运行游戏，哇！成功了。原来光盘检测函数的返回值是个全局变量，在DS:00CDD9CC处，当它为0时表示无光盘，为1时表示有光盘。
用HIEW32t打开DFLW.EXE找到：
C705CCD9CD0000000000
改为：
C705CCD9CD0001000000
搞定！

大波罗
2001.8.24
转载请保持完整，谢谢


新倚天屠龙记

标 题:新倚天屠龙记的光盘破解手记。 (1千字)
发信人:bwkpjq
时 间:2001-1-5 20:04:43
详细信息:
新倚天屠龙记硬盘版制作手记
这是一款根据金庸小说改编的游戏，玩了一下还不错。由于前两天我利用从网上学来的一丁点破解知识，成功的将《幻世录》和《凯撒大帝III》破成了硬盘版，于是怀着高昂的兴致想把《新倚天屠龙记》也一鼓作气破了，谁知用尽了我所知的方法，参考了近十篇游戏破解文章，连一点头绪也没有，差一点就放弃了，于是我想再来最后一次吧，实在不行只有向高手请教了。
过程如下：
这个游戏蛮怪，我用TRW载入后，试了好多断点都拦截不住，最后搞了一个BPX
GetFileSize才拦截住，通过分析，发现 00401F38 CALL 00435D90有问题，有光盘时EAX=1
无光盘时EAX=0，于是我便以为把这条指令改成00401F38 MOV EAX，01即可，（有些游戏是这样改的），错了，一改就死机！
于是F8追进，找到：00436160 PUSH EBX
F8再追进，找到：00436188 CALL EDI（MSS32！-AIL-REDBOOK-STAT）
按F8进入，找到：20007ACF CALL 20017780
F8进入，找到：200177B2 CALL MSS32！-AIL-SERVE
F8再追进，找到：200076B8 CALL KERNEL32！SLEEP
F8进入，找到：200177C0 JZ 200177DA 看到没有，就是这个JZ在捣乱，把它改成JNZ即可！
于是用UltraEdit打开EXE文件，奇怪，怎么也找不到这条指令，（我出汗了），不甘心，终于在游戏目录下的Mss32.dll文件中找到，
即找到：74 18 3D 0E 02 00 00
改为：75 18 3D 0E 02 00 00 存盘，搞定！
有人问，我怎么找到上面那些CALL的，我是根据EAX值的变化判断出来的，有无光盘EAX的值不一样，而且程序一经过上面的那些CALL就会跳出请放入光盘的提示。试了近百次，写满了九大张纸（正反面的）总算OK啦！不过，游戏进行时，我发现还会检测光驱，不要紧，游戏照常进行！
还有什么问题欢迎来信交流！
Bwkpjq
E-Mail:bwkpjq@yeah.net
2000/12/11 凌晨两点半


月影传说

 标 题:光盘版游戏变硬盘版游戏2===>>月影传说 (4千字)
发信人:copyyour
时 间:2001-8-23 23:29:20
详细信息:
呵呵，我又来了，这是我的第二篇破解光盘游戏的文章，写得不好，请大家指正，小弟这次就不罗嗦了，工具还是上次说的那些，不知道上次没破出来的朋友是否用起子和榔头解决了问题，如果没有的话，请先别急，再看看小弟的这篇

开工：

1。找到可执行文件.exe的就是了，一看只有200多k,有点怀疑，就用fi检查，哈哈，没有加壳，好
接下来还是拿出我的工具w32dasm开始反他！嘿嘿

代码如下：

:00408867 8D44243C lea eax, dword ptr [esp+3C]

* Possible StringData Ref from Data Obj ->"C:" ===>>检查文件是否来源于c:\
|
:0040886B 6808894300 push 00438908
:00408870 50 push eax

* Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:00408871 FF1510304300 Call dword ptr [00433010]

* Reference To: KERNEL32.SetErrorMode, Ord:0264h =======>>设置错误代码（小弟猜的。呵呵）
|
:00408877 8B1D1C304300 mov ebx, dword ptr [0043301C]

* Reference To: KERNEL32.GetVolumeInformationA, Ord:0177h ===>>这次的重点！！！！注意啦！！GetVolumeInformationA函数是获得盘符卷标的，呵呵，明白了吧，干紧看看第二张光盘的卷标是什么？
|
:0040887D 8B2D20304300 mov ebp, dword ptr [00433020]
:00408883 C744241000000000 mov [esp+10], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004088F5(C)
|
:0040888B 8D4C243C lea ecx, dword ptr [esp+3C]
:0040888F 51 push ecx

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h ======>>>还用说吗？上次不明白的还有吗？自己看winapi吧
|
:00408890 FF1530304300 Call dword ptr [00433030]
:00408896 83F805 cmp eax, 00000005 =======>>>赶快改！！！！
:00408899 7544 jne 004088DF ====>>不是就跳走!!!
:0040889B 6A01 push 00000001
:0040889D FFD3 call ebx
:0040889F 8BF0 mov esi, eax
:004088A1 6A00 push 00000000
:004088A3 8D542418 lea edx, dword ptr [esp+18]
:004088A7 6A00 push 00000000
:004088A9 8D442420 lea eax, dword ptr [esp+20]
:004088AD 52 push edx
:004088AE 50 push eax
:004088AF 6A00 push 00000000
:004088B1 8D4C2430 lea ecx, dword ptr [esp+30]
:004088B5 6A20 push 00000020
:004088B7 8D542454 lea edx, dword ptr [esp+54]
:004088BB 51 push ecx
:004088BC 52 push edx
:004088BD FFD5 call ebp
:004088BF 56 push esi
:004088C0 8BF8 mov edi, eax
:004088C2 FFD3 call ebx
:004088C4 85FF test edi, edi
:004088C6 7417 je 004088DF
:004088C8 8B842490000000 mov eax, dword ptr [esp+00000090]
:004088CF 8D4C241C lea ecx, dword ptr [esp+1C]
:004088D3 50 push eax
:004088D4 51 push ecx

* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:004088D5 FF15F4304300 Call dword ptr [004330F4]
:004088DB 85C0 test eax, eax
:004088DD 7432 je 00408911

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00408899(C), :004088C6(C)
|
:004088DF 8A44243C mov al, byte ptr [esp+3C]
:004088E3 FEC0 inc al
:004088E5 8844243C mov byte ptr [esp+3C], al
:004088E9 8B442410 mov eax, dword ptr [esp+10]
:004088ED 40 inc eax
:004088EE 83F818 cmp eax, 00000018 ====>>比较24次
:004088F1 89442410 mov dword ptr [esp+10], eax
:004088F5 7C94 jl 0040888B

* Possible StringData Ref from Data Obj ->"请插入《月影传说》的第二号光盘，再重新运行本程"
->"序。"
|
:004088F7 68D4884300 push 004388D4

以上为简单分析，值得注意的是这次开始加上了卷标的判断 希望大家注意，修改方法如下：
改c:\卷标和改000005为000003

cracked by copyyour[CCG]


DOS应用程序

 标 题:DOS应用程序中用光盘破解（转载）
发信人:小小K
时 间:2000-12-29 13:58:26
详细信息:
DOS应用程序中用CD-ROM,主要用到 INT 2FH 的 1510H（Send device driver request） 功能。

要用到的几个中断说明如下：

1. IOCTL input 的格式：

偏移量 类型 内容
00H 字节 1AH
01H 字节 00H
02H 字节 03H
03H 字节 11 DUP（？）
0EH 双字 缓冲区地址
12H 字 缓冲区长度
14H 字节 6 DUP（？）

2. IOCTL output 的格式：

偏移量 类型 内容
00H 字节 1AH
01H 字节 00H
02H 字节 0CH
03H 字节 11 DUP（？）
0EH 双字 缓冲区地址
12H 字 缓冲区长度
14H 字节 6 DUP（？）

3. 在缓冲区中填入命令再用 INT 2fH 的 1510H 便可以实现 CD-ROM 的各种功能，缓冲的一些命令格式如下：

作用 长度 格式
解锁 2 01，00
加锁 2 01，01
入盒 1 05
取CD-ROM 状态 5 06，0，0，0，0
返回：06，xx，xx，0，0
xx,xx为状态字
位0：1 门开，0门关
位1：1未锁，0门锁
位B：1无盘，0有盘

4. 检测 CD-ROM 驱动程序的存在：

AX = 1500H
BX = 0
INT 2fH
返回：BX = CD-ROM 个数
CX = 起始CD-ROM 盘符，0=A：，1=B：等等

5. 发送 Device Driver Request：

AX = 1510H
ES：BX=请求头地址
出盒 1 00
CX = CD-ROM 的盘号


Safe Disk 2

标 题:光盘保护(10千字)
发信人:1212
时 间:2001-4-7 20:54:38
详细信息:
序 号:13330
标 题:转贴一篇文章，光盘保护 (9千字)
发信人:machoman[CCG]
------------------------------------------------------------------------------------------

Safe Disk 2生世之谜大公开+破解方法

最近有许多网友写信来问站长说如何拷贝有著safe disk 2的光碟

其实以现在的烧录软体和烧录机的技术

即使不靠破解档,也可轻易破解,但是前提是,你的硬体必须刚刚好配合

烧录软体..........

以下是解说safe disk 2的原文 (感谢ck阿强提供)

Cdrtimes has been formulating a list of CD Readers/writers that are supposedly capable of producing working Backups of SafeDisk 2 protected CD愀. This information has been supplied by various people and cdrtimes can not at this time confirm the information, but would welcome any feed back from owners of these drives, or owners of drives not mentioned in this Article as to there results. Please use the submit your SD2 results link on the sites main page
This from Olli himself regarding the new safedisk 2 protection.
"...SD2 is a very interesting beast, as some of you already know. Sometimes a copy works only in the CD-Writer, sometimes not at all. Sometimes - depending on the writer used - in any CD-ROM. Some people claim, that they had success with other burning software. Let me explain, what the reason for all this might be. (I say "might be", as the information here is just revealed through observation, but I believe I am at least pretty close)

The first funny thing is, that if a SD2 copy doesn't play in a CD-ROM, this copy has additional bad sectors, which weren't on the original. As CloneCD reads and writes "as is!", I would have assumed, this is simply impossible. So, if you are a curious guy, you can look at these sectors on the original CD (where they are readable). You will find a lot of garbage on the first view. But if you run these sectors through a sector scrambler (a device, which is in every CD-ROM and CD-WRITER) you see the reason for all the trouble: Regular patterns like 'XYXYXYXYXY...' and so forth.

And this is exactly how the protection works. To understand this, you need to know, what the scrambler is used for (from ECMA-130, ISO/IEC 10149):

"A regular bit pattern fed into the EFM encoder can cause large values of the digital sum value in case the merging bits cannot reduce this value. The scrambler reduces this risk by converting the bits in byte 12 to 2351 of a Sector in a prediscribed way. ..."

The sectors I have mentioned above try in fact to overload the EFM encoder of the CD-Writer, because *AFTER* passing the scrambler the poor device has to write *REGULAR BIT PATTERNS* - something it really doesn't like.

After some quick tests, it seems, that some writers are affected by this problem more than others. For example, writers based on Philips hardware (Philips, Fujitsu/Siemens, Acer, just to name a few) are NOT affected by this at all. With such a writer, you can copy SD2 with any CloneCD version, and the copy will run on every CD-ROM. Most other writers will not write these sectors correctly. Some writers (Plextor) can at least read the copy they've made, so the copy will run in the writer, but not in an ordinary CD-ROM. The reason for this might be, that the writer is able to position better, but this is just guess.

I must admit, this is a very, very cool protection: Something is on the original which can be read, and not be written. I really didn't believe such a protection is possible. Now for the interesting question: Will CloneCD ever be able to overcome this problem?

Well, you can answer this yourself: I guess not. Okay, you can probably do nasty tricks like modifying the pattern. But this isn't what CloneCD is about. It is called CloneCD, not PatchCD. In opposite to the belief of some people, CloneCD does not cheat or modify data in any way. I like to keep it this way. Will any other software overcome this problem? Again, you can answer this yourself: No, unless they are cheating somehow. Can a firmware update fix this? Maybe. But I have the strange feeling, that the problem resides in the writer's chipset, not its firmware. Maybe a firmware workaround would be possible. But who would be so nice to modify the firmware in this regard?

Conclusion: Either use your Plextor writer to play the copy, or buy a unit based on Philips hardware (Philips PCRW804, ACER 4432 for example..."

There seems to be a little confusion as to what is safedisk 2 and what isnt,use these two ways to identify if you have a SD2 title, that way you can know for sure that you have 100 % compatible hardware, if you could verify this before submitting your hardware it would help us out no end.
With the game in your cdrom,open Windows Explorer. Make sure the option show all files is enabled. Click on the game directory, you should see two tmp. files. They are numbered 00000001.tmp and 00000002.tmp.Also the file Clokspl.is missing from Safedisc2,it is present on earlier versions of Safedisc.
Here is another way to confirm if the disc you are trying to copy is SD2 protected.
safedisk 2 can also be differentiated from safedisc 1 by looking for the
*.icd file.
for example if the name of a safedisc 1 exe is tzar.exe there would also be a
tzar.icd file. this is not true for SD2. since the icd is integrated into the
exe.

以下为解说safe disk 2翻译版 (感谢Ash翻译)

这几天发现有这个烧录讨论版,发现很多人在讨论如何烧protected by safedisc2的光碟,

真的是看到一堆的奇怪烧录方法,在这我要告诉大家,能不能完整备份safedisc2的光碟与

你所用的烧录软体无关,原因是出于烧录机上的控制晶片,因此大家不要再用blindread+NERO

等方式来烧了,这只会让你增加更多飞盘而已....我在这来简述一下SD2的原理,及为何cloneCD

Blindsuit 两大超强软体都对它没辄~~~

SAFEDISC 2的原理:

safedisc version 2 承袭version 1的共点就是在光碟上做跳跃式的连续坏轨

让光碟机无法读取这些sector(其实这些坏轨的资料全都是5),而游戏执行档会检查

这些坏轨,若无坏轨则判定为illegal disc ,safedisc2(以下称SD2)也跟version 1

一样会检查坏轨,而且更严格,坏轨的地方及数量都要与原定的相同才算通过,但只是

如此更本难不倒cloneCD配合现今优良的烧录机以DAO或SAO RAW mode写入,那问题在

那呢?为何还是烧不出呢?...我来大略说明一下:

烧录机在写入资料前,烧录软体会先送出instruction给烧录机,告诉烧录机接下来要

用什么方式来写入资料,之后再送资料给烧录机,烧录机再将datas write on disc

而这些烧录指令都是特定的一些OP code,SD2就是利用这个地方来作防拷光碟,方法

很简单,你也可以自己做SD2的光碟,它的原理就是在光碟的资料轨上储存一些烧录机

所用到的Instruction,大约是放在各sector的末端,当烧录软体读取这些sector上的

资料后将其送到烧录机的chipset,chipset解码后便控制雷射头写入资料到disc上,

但有趣的事情来啦,因为这些datas中居然暗藏烧录机用来控制光学读写头的指令

,烧录机上的晶片收到datas后将其误认为是真的Instruction而命令雷射头做出其指示

的动作,而依我的观察这些指令是将这一sector的尾端到下一sector的开端写入一些废

物资料,原本sector的开头是记录著此sector的编号,如今已经被破坏了,各sector的EDC码

也与原来的不一样,EDC都会变成0,这时原本这常的sector被你烧录机烧进后都已经变成坏

轨了,所以当你用光碟机玩backup CD时,光碟机依TOC到特定的sector读取资料,但这些sector

的编号栏位已经被写入废资料,之后你的光碟机就会找不到资料而LOCK在那好像不会动,

但你会问,为什么烧录机和DVD可以玩这些backup CD呢?这是因为烧录机&DVD读资料的方式

与CD-ROM不同,烧录机是以算frame位移的方式来读取sector上的资料,它不是去读sector的

编号栏,所以它能读到所要的资料...,SD2的骗术是可以用软体将它视破的,但是为什么clonCD

不出个新版的将SD2干掉呢?...因为要修正SD2所造成的错误,cloneCD就要对其image档做修改

但这样backup CD便与original CD不一样了,也就是失去了cloneCD的clone之意义,而且此举有

可能让游戏商有机会告cloneCD的作著...

有些烧录机可以成功地备份SD2的光碟是因为其烧录机会把指令流与资料流分离,因此

此可以烧SD2的光碟,那除了PLEXTOR R820T外还有那台可以烧呢?...最近PHILIP不是出什么

双晶片神话的烧录机吗?...其不是号称一个晶片处理资料流,另一晶片处理指令流以达烧录

的正确性吗?...要SD2的话就找他吧......

支援烧录safe disk 2的烧录机和必备韧体

以下的烧录机经站长证实过,下列飞利浦全系列和plextor 820和宏棋 8432可完全烧录sd2

且可完全读取于任何光碟机,烧录机上...

站长没那么多下列烧录机,剩下的就留给大家去证实.......

Artec
CD-RW WPA28 (not yet confirmed)

Philips 以下所有烧录机接支援拷贝 safe disk 2 的功能 且任何光碟机皆可读取

800 Series internal IDE 8x4x3

Philips CDD4401-31 (E118405) IDE-CD R/RW 4x4x32 Firmware 1.4b
Philips CDD4801 Firmware 2.0

Philips PCRW804K Firmware 2.0

Philips CDD3801 CD-R/RW Firmware 1.6

Philips CDD4201

Fujitsu-Siemens
Fujitsu-Siemens Spinbird 4x4x32x Firmware 1.4b

Fujitsu-Siemens Spinbird 8x4x32x Firmware 2.0

ACER
Acer 4432

Acer 8432a 8 MB buffer Firmware 5.1V (confirmed to read in drives other than the recorder)

Acer 8432ia 8 MB buffer Firmware 5BX (confirmed to read in drives other than the recorder)

Plextor
Plextor 8/2/20 Firmware 1.04 ( Confirmed to read in drives other than the recorder )

Plexwriter 8/4/32 ide Firmware 1.7

Plexwriter 12/10/32 A Firmware 1.7 (various results)

Plexwriter 8/20 Firmware 1.7 (plays in any cd-rom.)

Plexwriter 12/4/32scsi (Only readable with the recorder)

Waitec
Waitec 8x4x32 (Only readable with the recorder)

Waitec 3244 (Confirmed to read in drives other than the recorder)

Waitec 2444 (Confirmed to read in drives other than the recorder)

Iomega
Iomega 8432 Firmware 1.1

Ricoh
Ricoh 6200 Firmware 2.40 (not yet confirmed)

Ricoh MP- 7083A (Confirmed to read in drives other than the recorder)

Ricoh 7060A Firmware 1.70 (Confirmed to read in drives other than the recorder)

Yamaha
Yamaha 2100E (Confirmed to read in drives other than the recorder when drive is used to read and write the CD)

Sony (no confirmed reports .)
Traxdata
CD-RW 8432 Plus (Confirmed to read in drives other than the recorder)

CD-RW 4432 Plus (Confirmed to read in drives other than the recorder)

CD-RW 4424 Plus (Confirmed to read in drives other than the recorder)

--------------------------------------------------------------------------------


AutoGraphicsHTML5.5

标 题:谁能帮我破解AutoGraphicsHTML5.5，请看详细内容>> (1千字)
发信人:wwiping
时 间:2001-2-15 9:07:15
详细信息:
我在网上找到一关于AutoGraphicsHTML的东东，但只能破3.6版，而我的是5.5版，
好像不行，能帮下我吗？先谢个了。
AutoGraphicsHTML5.5下载地址:
http://www.newhua.com/autographicshtml.htm

破AutoGraphicsHTML

工具: softice , 16进制编辑器,如 ultraedit

前言: AutoGraphicsHTML可以把一整个资料夹中的图档通通转换
成GIF、JPEG格式，并且制作小图示一一连结到原来的影像档，
很快的就能制作一个可以展示各种图档的网站来喔！ (节录自 todo)
他的保护不是用注册码,也不是用日期限制,而是加上浮水印
让你的小图示出现 Demo version 之类的字, 所以只有修改一途了
这个软体的程度, 比较简单一点.
ok, go!!

(1) 启动AutoGraphicsHTML, 一直往下执行, 等到成品完成之後
会启动浏览器, 打开刚刚做好的 htm 档案, 看一下小图式,
会看到一些很讨厌的字,Demo version 之类的,
我就开始猜了,他会帮你将影像作成小图示,是很不错
但他是如何将自写到小图示里的 ?
是用哪一个 API 呢 ?
我想了一下, drawtexta 或是 drawtextexa 呢 ?
不管,都下好了, 所以进入 softice, 下 bpx drawtexta, bpx drawtextexa

(2) 再启动 AutoGraphicsHTML 一次, 可能有时会被拦下来, 不过不要管他
按 F5, 直到最後一个步骤, 也就是将图形转换时,会有一个 bar 出现
显示目前的进度,对不对 , 在这个地方若被拦住了, 就按F12 回到上一层
你会发现你现在正在 picobj31 里面, 看下方那一条绿色的线的中央有写
会发现 call drawtextexa ,机械码是 FF15D8620110

(3) 所以啦, 用 ULTRAEDIT 开启 picobj31.dll
找 FF15D8620110, 通通改成 909090909090
90 就是 nop, 也就是什麽都不要执行
这样就破了

标 题:新版本用DrawTextA还是可以，不过有更方便的方法 (1千字)
发信人:blowfish
时 间:2001-2-15 11:38:51
详细信息:

反汇编picobj41.dll，看到下面几个含义明显的输出函数。这几个都是C++的类成员函数，函数名均为AddDemoLabel( )，前两个是CImageInterface类的重载函数，后两个是CImageProcessor类的重载函数）：

Addr:10003AA0 Ord: 42 (002Ah) Name: ?AddDemoLabel@CImageInterface@@QAEHH@Z
Addr:10003AC0 Ord: 43 (002Bh) Name: ?AddDemoLabel@CImageInterface@@SAHPAUHDC__@@H@Z
Addr:10006D20 Ord: 44 (002Ch) Name: ?AddDemoLabel@CImageProcessor@@SAHPAPAXH@Z
Addr:100068E0 Ord: 45 (002Dh) Name: ?AddDemoLabel@CImageProcessor@@SAHPAUHDC__@@HJJ@Z

再反汇编AutoGraphicsHTML.exe，看它在哪里引用了这些函数，结果在import table里没找到上述函数，说明该exe不是直接调用这些函数的。

在该dll中查找文本串“AddDemoLabel”，发现只有一处是在上述几个函数的函数体之外调用它们的（在CImageSaver类的BeforeSave( )函数中）：

Exported fn(): ?BeforeSave@CImageSaver@@QAEHPAPAXHHHHHHHMJUtagRECT@@H@Z - Ord:0030h

:10007B69 8B442410 mov eax, dword ptr [esp+10]
:10007B6D 85C0 test eax, eax
:10007B6F 740B je 10007B7C
:10007B71 6A01 push 00000001
:10007B73 56 push esi
* Reference To: PicObj41.?AddDemoLabel@CImageProcessor@@SAHPAPAXH@Z
|
:10007B74 E8A7F1FFFF call 10006D20
:10007B79 83C408 add esp, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10007B6F(C)
|
:10007B7C 8B442444 mov eax, dword ptr [esp+44]

显然只要把CS:10007B6F处的je改为jmp即可（74改为EB）。

总结：不要使用含义明显的串；程序的保护部分越符合结构化的特点越容易被破掉。


金山词霸

标 题:让金山词霸在Acrobat Reader最新版中取词 (491字)
发信人:bpx
时 间:2001-1-15 11:13:46
详细信息:
小弟用Crack软件同样的方法知道了Acrobat Read不让词霸在其4.05版本中取词的地方, 因此patch了它并专门做了一个网站供大家下载, 有兴趣的朋友可去看看:

http://acropat.home.chinaren.com

方法简单的不好意思说:
1. 在运行Acrobat Reader前下断 bpx CreateFileA do "d esp->4"
直到显示出正在打开xdict32.api.

2. 再下断:
bpx ReadFile
bpx ReadFileEx
经几次F12后 发现有
or eax, eax
jnz xxxxx
就在这儿改!

其实ICE除了破解, 用它来发现并改变软件的行为是大有可为的. 我类似使用ICE的例子绝不只这一个.


Flash32 3.08

标 题:Flash32 3.08汉化版无法运行的破解 (4千字)
发信人:fishs
时 间:2001-4-26 23:36:26
详细信息:
软件名称：Flash32 3.08
破解目的：做成汉化版后无法运行，提示软件没有正确安装云云，卸载后重新安装任何英文版都无法运行，有猫腻！
破解工具：W32Dsm89 黄金版、UltraEdit

首先用 W32Dsm89 反编译后，查找提示信息，可以找到两处如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411F45(C) <---- 看看是从哪里跳过来的
|
:00411F9D 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Flash 32"
|
:00411F9F 6870804500 push 00458070

* Possible StringData Ref from Data Obj ->"Flash 32 is not correctly installed...
Please "
->"execute install."
|
:00411FA4 68F8C34500 push 0045C3F8
:00411FA9 6A00 push 00000000
:00411FAB EB0D jmp 00411FBA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411D02(C) <---- 看看是从哪里跳过来的
|
:00411FAD 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Flash 32"
|
:00411FAF 6870804500 push 00458070

* Possible StringData Ref from Data Obj ->"Flash 32 is not correctly installed...
Please "
->"execute install."
|
:00411FB4 68F8C34500 push 0045C3F8
:00411FB9 53 push ebx

我们先来看看第一处：

* Possible Ref to Menu: MenuID_00E3, Item: "Quitter"
|
:00411EE0 6A01 push 00000001
:00411EE2 68A0134800 push 004813A0
:00411EE7 6820FE4700 push 0047FE20
:00411EEC 68D0084800 push 004808D0
:00411EF1 68C0064800 push 004806C0
:00411EF6 68C01B4800 push 00481BC0
:00411EFB 68F8054800 push 004805F8
:00411F00 6880054800 push 00480580
:00411F05 6800054800 push 00480500
:00411F0A 6868054800 push 00480568
:00411F0F 6820044800 push 00480420
:00411F14 68F0FA4700 push 0047FAF0
:00411F19 6860FA4700 push 0047FA60
:00411F1E 6850FA4700 push 0047FA50
:00411F23 6800F94700 push 0047F900
:00411F28 68F0F84700 push 0047F8F0
:00411F2D 6820F94700 push 0047F920
:00411F32 68E0054800 push 004805E0
:00411F37 6880EF4700 push 0047EF80
:00411F3C E8AF6C0200 call 00438BF0
:00411F41 83C44C add esp, 0000004C
:00411F44 48 dec eax
:00411F45 7456 je 00411F9D <---- 这里
:00411F47 48 dec eax
:00411F48 742B je 00411F75 <---- 这也是一个可疑的地方
:00411F4A 8B9424BC010000 mov edx, dword ptr [esp+000001BC]
:00411F51 6A00 push 00000000
:00411F53 6830D84000 push 0040D830
:00411F58 6A00 push 00000000

* Possible Reference to Dialog: DialogID_009C
|
:00411F5A 689C000000 push 0000009C
:00411F5F 52 push edx

再来看看第二处：

* Possible Ref to Menu: MenuID_007F, Item: "? 輗"
|
:00411CD4 C705AC04480000010000 mov dword ptr [004804AC], 00000100
:00411CDE C70570FA4700FFFFFFFF mov dword ptr [0047FA70], FFFFFFFF
:00411CE8 891D68054800 mov dword ptr [00480568], ebx
:00411CEE 8915FC054800 mov dword ptr [004805FC], edx
:00411CF4 A3DC084800 mov dword ptr [004808DC], eax
:00411CF9 E8F26E0200 call 00438BF0
:00411CFE 83C44C add esp, 0000004C
:00411D01 48 dec eax
:00411D02 0F84A5020000 je 00411FAD <---- 这里
:00411D08 6880EF4700 push 0047EF80
:00411D0D 8D8C24B8000000 lea ecx, dword ptr [esp+000000B8]

* Possible StringData Ref from Data Obj ->"%s\Flash 32.lic"
|
:00411D14 6808C54500 push 0045C508
:00411D19 51 push ecx

看明白后就很容易了，用 UltraEdit 修改：

查找 83 C4 4C 48 0F 84 A5 02 00 00
改为 83 C4 4C 48 90 90 90 90 90 90

查找 83 C4 4C 48 74 56 48 74 2B
改为 83 C4 4C 48 90 90 48 90 90

fishs
http://fishs.126.com


Mover98 3.1

标 题:破解 Mover98 3.1 的自校验 (2千字)
发信人:fishs
时 间:2001-3-22 22:39:30
详细信息:
目的：破解 Mover98 3.1 的自校验（初学）
工具：W32Dasm 8.93
方法：瞎猫撞上死耗子
程序介绍：Mover98 是专门给软件搬家的工具，而不会影响程序的运行。电脑报上有介绍，我就不罗嗦了。
前言：事实上，我并不是诚心要跟它过不去，我是个做汉化的，这么好的软件我当然不能放过。下载、安装、注册之后，先开始汉化“关于”对话框（这是我的惯例，也是先验证一下能否汉化，因为我经常碰到不能汉化的情况），然后退出运行程序，鼠标指针晃了两下就没动静了，再改回来，程序正常运行。哦，原来有自校验！
分析：软件的这种自校验肯定是在程序开始运行的时候就要比较的，所以这段代码一定在程序的入口不远处。
用 W32Dasm 反汇编出代码后，开始瞪大眼睛仔细寻找……

//******************** Program Entry Point ********
:0047DC1C 55 push ebp
:0047DC1D 8BEC mov ebp, esp
:0047DC1F 83C4F0 add esp, FFFFFFF0
:0047DC22 33C0 xor eax, eax
:0047DC24 8945F0 mov dword ptr [ebp-10], eax
:0047DC27 B87CD94700 mov eax, 0047D97C
:0047DC2C E8977FF8FF call 00405BC8
:0047DC31 33C0 xor eax, eax
:0047DC33 55 push ebp
:0047DC34 6817DD4700 push 0047DD17
:0047DC39 64FF30 push dword ptr fs:[eax]
:0047DC3C 648920 mov dword ptr fs:[eax], esp
:0047DC3F 8D55F0 lea edx, dword ptr [ebp-10]
:0047DC42 33C0 xor eax, eax
:0047DC44 E84B4CF8FF call 00402894
:0047DC49 8B45F0 mov eax, dword ptr [ebp-10]
:0047DC4C B98B3B0000 mov ecx, 00003B8B
:0047DC51 33D2 xor edx, edx
:0047DC53 E80843FBFF call 00431F60
:0047DC58 84C0 test al, al <----开始判断
:0047DC5A 7505 jne 0047DC61 <----跳过下面这个 call
:0047DC5C E86F5BF8FF call 004037D0 <----让它运行你就死定了

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047DC5A(U)
|
:0047DC61 A1D4F34700 mov eax, dword ptr [0047F3D4]
:0047DC66 8B00 mov eax, dword ptr [eax]
:0047DC68 E82334FBFF call 00431090
:0047DC6D 8D55F0 lea edx, dword ptr [ebp-10]
:0047DC70 B801000000 mov eax, 00000001
:0047DC75 E81A4CF8FF call 00402894
:0047DC7A 8B45F0 mov eax, dword ptr [ebp-10]

纵观上下十几行就只有这一个跳转，肯定就是它了。原来这么简单，只要跳过 call 004037D0 就行了。好办，把 jne 改成 jmp（7505 改成 EB05）。OK!


黎之工资 v6.0

标 题:谁与我共续这破解的故事？《破解“黎之工资”对抗脱壳之故事（上集）》 (9千字)
发信人:paulyoung
时 间:2001-3-25 20:16:10
详细信息:
谁与我共续这破解的故事？《破解“黎之工资”对抗脱壳之故事（上集）》

**************************************************************************************************************

〖作　　者〗PaulYoung
〖日　　期〗二○○一年三月二十五日
〖软　　件〗黎之工资 v6.0(http://leaze.3322.net/lzgz/lzgz60.zip)
〖破解工具〗W32DASM V8.93,TRW2000 V1.03,FILEINFO V2.43A
AspackDie 1.1(http://mud.sz.jsinfo.net/per/aaron/files/unpackers/win/aspackdie11.zip)...

    黎之工资 V6.0 是用Aspack v2.11加的壳，用很多工具都可以脱，如我用 AspackDie 1.1,但无论用什么工具脱壳，脱壳后的程序一运行即一闪即逝，自行退出了。
    我用 TRW2000 V1.03（唉，没办法，高版本的 TRW2000 与我爱的爱“姬”不和，唯有用1.03了。Browse 找到已脱壳的程序，Load...OK!
F10　单步跟踪，看到……

//******************** Program Entry Point ********
:0051DE6C 55 push ebp
:0051DE6D 8BEC mov ebp, esp
:0051DE6F 83C4F4 add esp, FFFFFFF4
:0051DE72 53 push ebx
:0051DE73 56 push esi
:0051DE74 57 push edi
:0051DE75 B80CDB5100 mov eax, 0051DB0C
:0051DE7A E86D98EEFF call 004076EC ******
:0051DE7F 8B3514255200 mov esi, dword ptr [00522514]
:0051DE85 8B3D20225200 mov edi, dword ptr [00522220]
:0051DE8B 8B0F mov ecx, dword ptr [edi]
:0051DE8D B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DE8F A190E14800 mov eax, dword ptr [0048E190]
:0051DE94 E893D5F2FF call 0044B42C ******
:0051DE99 8906 mov dword ptr [esi], eax
:0051DE9B BB03000000 mov ebx, 00000003

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0051DEB6(C)
|
:0051DEA0 8B06 mov eax, dword ptr [esi]
:0051DEA2 8B10 mov edx, dword ptr [eax]
:0051DEA4 FF92D8000000 call dword ptr [edx+000000D8] *弹出登录窗口
:0051DEAA 8B06 mov eax, dword ptr [esi]
:0051DEAC 83B83402000001 cmp dword ptr [eax+00000234], 00000001 *口令是否正确？
:0051DEB3 7403 je 0051DEB8　*不正确即出错，下 r fl z(即相当于把je 改为jne或9090，使其不跳）
:0051DEB5 4B dec ebx
:0051DEB6 75E8 jne 0051DEA0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0051DEB3(C)
|
:0051DEB8 8B06 mov eax, dword ptr [esi]
:0051DEBA 83B83402000001 cmp dword ptr [eax+00000234], 00000001 ***比较什么？？？
:0051DEC1 0F8574010000 jne 0051E03B　*下 r fl z（原理同上），否则再按几下 F10 就会退出！！（关键）
:0051DEC7 8B0F mov ecx, dword ptr [edi]
:0051DEC9 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DECB A1286A4B00 mov eax, dword ptr [004B6A28]
:0051DED0 E857D5F2FF call 0044B42C ***
:0051DED5 8B15841E5200 mov edx, dword ptr [00521E84]
:0051DEDB 8902 mov dword ptr [edx], eax
:0051DEDD 8B06 mov eax, dword ptr [esi]
:0051DEDF E82452EEFF call 00403108 *******
:0051DEE4 A1841E5200 mov eax, dword ptr [00521E84]
:0051DEE9 8B00 mov eax, dword ptr [eax]
:0051DEEB E81C14F3FF call 0044F30C ********
:0051DEF0 A1841E5200 mov eax, dword ptr [00521E84]
:0051DEF5 8B00 mov eax, dword ptr [eax]
:0051DEF7 8B10 mov edx, dword ptr [eax]
:0051DEF9 FF9280000000 call dword ptr [edx+00000080] *******
:0051DEFF 8B07 mov eax, dword ptr [edi]
:0051DF01 E8924BF3FF call 00452A98 ********
:0051DF06 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"黎之工资管理"
|
:0051DF08 BA4CE05100 mov edx, 0051E04C
:0051DF0D E88A47F3FF call 0045269C ********
:0051DF12 8B0D64225200 mov ecx, dword ptr [00522264]
:0051DF18 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"`+A"
|
:0051DF1A 8B15C8B64C00 mov edx, dword ptr [004CB6C8]
:0051DF20 E88B4BF3FF call 00452AB0 ***
:0051DF25 8B0D941E5200 mov ecx, dword ptr [00521E94]
:0051DF2B 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF2D 8B1554C85100 mov edx, dword ptr [0051C854]
:0051DF33 E8784BF3FF call 00452AB0 ***
:0051DF38 8B0D44215200 mov ecx, dword ptr [00522144]
:0051DF3E 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF40 8B1580515100 mov edx, dword ptr [00515180]
:0051DF46 E8654BF3FF call 00452AB0 ****
:0051DF4B 8B0DC81C5200 mov ecx, dword ptr [00521CC8]
:0051DF51 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF53 8B15C8415000 mov edx, dword ptr [005041C8]
:0051DF59 E8524BF3FF call 00452AB0 *****
:0051DF5E 8B0D20255200 mov ecx, dword ptr [00522520]
:0051DF64 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF66 8B15349D5100 mov edx, dword ptr [00519D34]
:0051DF6C E83F4BF3FF call 00452AB0 ******
:0051DF71 8B0D90225200 mov ecx, dword ptr [00522290]
:0051DF77 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF79 8B15D8D34F00 mov edx, dword ptr [004FD3D8]
:0051DF7F E82C4BF3FF call 00452AB0 ***
:0051DF84 8B0D80205200 mov ecx, dword ptr [00522080]
:0051DF8A 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF8C 8B1580FC4F00 mov edx, dword ptr [004FFC80]
:0051DF92 E8194BF3FF call 00452AB0 ***
:0051DF97 8B0DE81C5200 mov ecx, dword ptr [00521CE8]
:0051DF9D 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DF9F 8B153C8D4F00 mov edx, dword ptr [004F8D3C]
:0051DFA5 E8064BF3FF call 00452AB0 ***
:0051DFAA 8B0D4C225200 mov ecx, dword ptr [0052224C]
:0051DFB0 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DFB2 8B150C245100 mov edx, dword ptr [0051240C]
:0051DFB8 E8F34AF3FF call 00452AB0 ***
:0051DFBD 8B0DAC245200 mov ecx, dword ptr [005224AC]
:0051DFC3 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DFC5 8B15B86F4F00 mov edx, dword ptr [004F6FB8]
:0051DFCB E8E04AF3FF call 00452AB0 ***
:0051DFD0 8B0D2C235200 mov ecx, dword ptr [0052232C]
:0051DFD6 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DFD8 8B1564885000 mov edx, dword ptr [00508864]
:0051DFDE E8CD4AF3FF call 00452AB0 ***
:0051DFE3 8B0D101F5200 mov ecx, dword ptr [00521F10]
:0051DFE9 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DFEB 8B153CE55000 mov edx, dword ptr [0050E53C]
:0051DFF1 E8BA4AF3FF call 00452AB0 ***
:0051DFF6 8B0DC0215200 mov ecx, dword ptr [005221C0]
:0051DFFC 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051DFFE 8B1548375000 mov edx, dword ptr [00503748]
:0051E004 E8A74AF3FF call 00452AB0 ***
:0051E009 8B0DF8225200 mov ecx, dword ptr [005222F8]
:0051E00F 8B07 mov eax, dword ptr [edi]

* Possible StringData Ref from Code Obj ->"艾C"
|
:0051E011 8B15E8D05000 mov edx, dword ptr [0050D0E8]
:0051E017 E8944AF3FF call 00452AB0 ***
:0051E01C A1841E5200 mov eax, dword ptr [00521E84]
:0051E021 8B00 mov eax, dword ptr [eax]
:0051E023 E8DC12F3FF call 0044F304　　　　　　　　　　****程序中止，自行退出！！
:0051E028 A1841E5200 mov eax, dword ptr [00521E84]
:0051E02D 8B00 mov eax, dword ptr [eax]
:0051E02F E8D450EEFF call 00403108
:0051E034 8B07 mov eax, dword ptr [edi]
:0051E036 E8F54AF3FF call 00452B30
.
.
.

    以上每经过一个 call 程序就会运行一步，一直到0051E023 call 0044F304处退出。如果不在0051DEC1 jne 0051E03B处下 r fl z,程序很快就会退出。也就是脱壳后的程序马上退出的地方了（惨……连程序的界面是啥模样都不让人看）。把0051DEC1 jne 0051E03B的jne 改为 je 或9090后，程序运行一段时间才退出。到底还有什么地方还在校验呢？我就找不到了。希望哪位高手赏脸，试一试，指点一下我这位初哥，在此先行拜谢了。

标 题:在主程序中发送退出消息然后在消息循环中退出的程序如何破解 (3千字)
发信人:小牧童
时 间:2001-4-1 0:29:46
详细信息:

在主程序中发送退出消息然后在消息循环中退出的程序如何破解
作者：小牧童[CCG]

现在很多程序，如果没有软件狗，或时间过期，在运行中途就自动退出，常规的教学都是让拦或用W32dasm查找 exitprocess函数，但当拦到这个函数已经退出主程序了，作用不大，其实还有一条好用的，这就是bpx postquitmessage下面以我破解得不完全的黎之工资为例说明：
上次我破的程序不完全，时间超过2001年后，打印功能失效。即然是与时间相关我就下bpx getlocaltime按报表打印拦到后按F12后到下面：（记不清几次了）
:0051D2D9 E98A65EEFF jmp 00403868
:0051D2DE EBF0 jmp 0051D2D0
:0051D2E0 8B45D4 mov eax, dword ptr [ebp-2C]
:0051D2E3 8B55DC mov edx, dword ptr [ebp-24]
:0051D2E6 E8916EEEFF call 0040417C
:0051D2EB 730D jnb 0051D2FA
:0051D2ED 8B45D8 mov eax, dword ptr [ebp-28]
:0051D2F0 8B55E0 mov edx, dword ptr [ebp-20]
:0051D2F3 E8846EEEFF call 0040417C
:0051D2F8 7249 jb 0051D343 //将这里改为JMP

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0051D2EB(C)
|
:0051D2FA A164225200 mov eax, dword ptr [00522264]
:0051D2FF 8B00 mov eax, dword ptr [eax]
:0051D301 8B4074 mov eax, dword ptr [eax+74]
:0051D304 8B4024 mov eax, dword ptr [eax+24]
:0051D307 BA0C000000 mov edx, 0000000C
:0051D30C E823ADF4FF call 00468034
:0051D311 8D5584 lea edx, dword ptr [ebp-7C]
:0051D314 8B08 mov ecx, dword ptr [eax]
:0051D316 FF5158 call [ecx+58]
在softice环境中再按数次F12打印界面出现了，但一按F5程序自动退出了。
别急，打印界面能出现说明前面的判断是对的，后面还有比较，现在是解决程序退出问题
首先改好0051d2f8处，然后bpx postquitmessage
拦到后按F12到下面
* Referenced by a CALL at Addresses:
|:0044F1C3 , :0048E4BE , :0048E53B , :0048E5A4 , :004B6DC0
|:004B7347 , :0050EFEC , :0051D0EF , :0051D599
|
:00452BE4 E88BB6FBFF call 0040E274
:00452BE9 84C0 test al, al
:00452BEB 7407 je 00452BF4
:00452BED 6A00 push 00000000

* Reference To: user32.PostQuitMessage, Ord:0000h
|
:00452BEF E86455FBFF Call 00408158 //就是这里让程序退出

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00452BEB(C)
|
:00452BF4 C3 ret
总于让我抓住狐狸的尾巴了，现在的关键是让这条psostquitmessage指令不运行
如果单纯的改上面的00452BEB 让其JMP的话程序是能运行了，但是退不出去了，现在是要知道是什么地方调用这段过程，临时在00452beb处设断，拦到后用r fl z让其不运行psostquitmessage按F10到这里：
:0050EFCC D805A4F05000 fadd dword ptr [0050F0A4]
:0050EFD2 DB7DF0 fstp tbyte ptr [ebp-10]
:0050EFD5 9B wait
:0050EFD6 E8F5C0EFFF call 0040B0D0
:0050EFDB DB6DF0 fld tbyte ptr [ebp-10]
:0050EFDE DED9 fcompp
:0050EFE0 DFE0 fstsw ax
:0050EFE2 9E sahf
:0050EFE3 730C jnb 0050EFF1
:0050EFE5 A120225200 mov eax, dword ptr [00522220]
:0050EFEA 8B00 mov eax, dword ptr [eax]
:0050EFEC E8F33BF4FF call 00452BE4 ／/原来就是在这里调用的

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0050EFAE(C), :0050EFE3(C)

到此当然知道去改什么地方去了将0050EFE3 处改为JMP，我也跟着Jump了，不知这次是否改全了？大家试试看。


无盘RPL Win98设置试用软件

标 题:无盘RPL Win98设置试用软件(373字)
发信人:ufokill
时 间:2001-3-20 18:13:57
详细信息:

这是个很有趣的软件，软件本身没有加壳，但如果你修改了他的任何一个字节，他马上就能感觉得到，并拒绝运行（非法操作），如果你修改回来，又可以运行了。同时他还能判断是否是由其他程序load他运行的，如果是，他也会拒绝运行，也就是说，你无法用修改可执行文件或用内存patch的方法来破解他。厉害吧，有兴趣的大客可以来试试，我很想知道作者是怎么实现的。
下载地址：61.139.50.69/xkx/setup98.exe
Homepage: http://zlocksoft.com

标 题:这里 (1千字)
发信人:[最弱智]
时 间:2001-3-21 18:16:46
详细信息:
004015C6 loc_4015C6: ; CODE XREF: sub_4014D0+EFj
004015C6 mov eax, ecx
004015C8 lea edx, [ecx+ecx*4]
004015CB neg eax
004015CD shl eax, 2
004015D0 sub eax, ecx
004015D2 lea edx, [edx+edx*4]
004015D5 lea eax, [eax+eax*4]
004015D8 lea edx, [edx+edx*4]
004015DB lea eax, [eax+eax*4]
004015DE lea edx, [edx+edx*4]
004015E1 shl edx, 4
004015E4 lea eax, [eax+eax*4]
004015E7 shl eax, 6
004015EA lea esi, [edx+0Ah]
004015ED cmp eax, esi
004015EF jge short loc_401600
004015F1
004015F1 loc_4015F1: ; CODE XREF: sub_4014D0+12Ej
004015F1 mov dl, cl
004015F3 add dl, al
004015F5 mov byte ptr unk_40540C[eax], dl
004015FB inc eax
004015FC cmp eax, esi
004015FE jl short loc_4015F1

里面的

004015F5 mov byte ptr unk_40540C[eax], dl

这句。

标 题:[最弱智]兄找到了要害 (352字)
发信人:ufokill
时 间:2001-3-21 23:27:36
详细信息:

016F:004015F3 ADD DL,AL
016F:004015F5 MOV [EAX+0040540C],DL
016F:004015FB INC EAX
016F:004015FC CMP EAX,ESI

把MOV [EAX+0040540C],DL,这句改成nop 就可以对这个程序为所欲为了。软件的确有独特之处，如果文件被修改或这文件是由其他进程load的，那[EAX+0040540C]这个内存区域就会是个未分配的区域，把dl的值mov给他马上就非法操作了。


防止同一程序多次运行

 标 题:关于防止同一程序多次运行的破解方法--答hkip的提问 (3千字)
发信人:liangs
时 间:2001-6-15 22:23:41
详细信息:
关于防止同一程序多次运行的破解方法
by liangs

hkip朋友提了一个问题如下：
如下的这个软件,是个游戏。他为了防止作弊不允许开两个窗口。
可我找了半天都不知道怎么解决这个问题。
http://61.141.247.212/MyGames/DownLoad/Setup-Plaza.exe
程序不大，只有6百K这个程序用ASPROTECT11加密，可以使用CASPR11解开。

-------------------------------------------------------------------
问题的解决：

上面的Setup-Plaza.exe实际上是个游戏大厅的安装程序，是中国游戏中心
在线游戏的大厅安装程序，就象联众游戏的大厅安装程序一样。这个程序脱壳
后反汇编的代码中找不到任何有用的提示，全都是乱码。程序运行后，如果发
现已有一个进程在运行就会退出，也不给出任何提示，下bpx ExitProcess也
没法中断，faint!

在试过多个中断没有效果的情况下，我跟踪了一下程序的API调用，结果如下。

******************程序首次运行的跟踪结果*************************
.....
FindWindowA(LPSTR:00465908:"iGameMainWndClass",LPSTR:00000000)::00417DBF
FindWindowA'returns: 00000000

SetRectEmpty()::00447247
SetRectEmpty'returns: FFFFFFFF

GetClassInfoA(HANDLE:00400000,LPSTR:00465908:"iGameMainWndClass",LPDATA:006FFD28)::00417E11
GetClassInfoA'returns: 00000000

LoadCursorA(HANDLE:00400000,LPSTR:00007F00)::00417E3F
LoadCursorA'returns: 00000000

GetClassInfoA(HANDLE:00400000,LPSTR:00465908:"iGameMainWndClass",LPDATA:006FFC70)::00437BA8
GetClassInfoA'returns: 00000000

RegisterClassA(LPDATA:006FFD28)::00437BB3
RegisterClassA'returns: 0000C306

LoadStringA(HANDLE:00400000,DWORD:000003F7,LPSTR:006FFBA4,DWORD:00000100)::0043C7AB
LoadStringA'returns: 00000013

lstrlenA(LPSTR:006FFBA4:"游戏大厅 Ver 0.7.63")::0043A9DC
lstrlenA'returns: 00000013
.....
部分略。。。

★★★ 特别注意 ★★★
CreateWindowExA(DWORD:00000200,LPSTR:00465908:"iGameMainWndClass",LPSTR:020E42A0:"游戏大厅 Ver 0.7.63",DWORD:00CF0000,DWORD:00000000,DWORD:00000000,DWORD:00000402,DWORD:000002E2,HWND:00000000,HANDLE:00000000,HANDLE:00400000,LPDATA:00000000)::0043758F

******************程序二次运行的跟踪结果*************************
注意下面的跟踪结果是运行一个进程不关闭的情况下，再运行程序的监视结果

FindWindowA(LPSTR:00465908:"iGameMainWndClass",LPSTR:00000000)::00417DBF
FindWindowA'returns: 00000FC8

FreeLibrary(HANDLE:10000000)::0041803F
FreeLibrary'returns: 00000001

CloseHandle(HANDLE:10000000)::0041804B
CloseHandle'returns: 00000000

UnhookWindowsHookEx(HANDLE:4B48779C)::0044D6FC
UnhookWindowsHookEx'returns: 00000001

LocalFree(HANDLE:005D0CC4)::0044ACE2
LocalFree'returns: 00000000
.....
部分略。。。

SetUnhandledExceptionFilter(LPDATA:7FC69E61)::0042D21B
SetUnhandledExceptionFilter'returns: 0042D1B8

ExitProcess(DWORD:00000000)::00428472

*************************************************************************

大家比较一下上面两次跟踪的结果，会发现00417DBF的FindWindowA()的
返回值不同!!! 如果程序首次运行返回00000000，如果程序已经运行则返回
00000FC8。如果0417DBF的FindWindowA()返回00000000的话，我们可以看到
不远处的CreateWindowExA()，这个API大家再熟悉不过了，就是产生程序的
主窗口。

下面我们在来看看00417DBF处的程序调用：

//调用FindWindowA()
:00417DB9 FF1598154500 call dword ptr [00451598]
:00417DBF 85C0 test eax, eax
//这里大家可以注意一下两种情况下EAX中的返回值
:00417DC1 7407 je 00417DCA
//如果EAX=0，就一切OK!!!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417C1A(U)
|
:00417DC3 33C0 xor eax, eax
//不用说了，这个跳转一跳就Over了!!!
:00417DC5 E94D020000 jmp 00418017

现在你知道怎么改了，就将00417DC1的7407简单的改为EB07就OK了。

上面我是通过API的跟踪来破解的，当然你也可以通过bpx FindWindowA
来跟踪搞定它，同样的没问题。


Anfy Java applet v1.45

标 题:Anfy Java applet v1.45 (7千字)
发信人:blowfish
时 间:2001-2-19 15:14:00
详细信息:
 Anfy（http://anfyteam.com)和CoolFocus的类似，也已经有注册机了。对应的HTML代码如下（以anfy3d.class为例），其中的regcode就是注册码：

<applet archive="anfy3d.jar" code="anfy3d.class" width=320 height=200>
<param name=credits value="Applet by Andrea Fasce (www.anfyteam.com)">
<param name=regcode value="123456987654">
<param name=reglink value="http://www.site.com">
<param name=regnewframe value="YES">
<param name=regframename value="_blank">
<param name=statusmsg value="Anfy 3d applet">
</APPLET>

不同的是，这个applet包对字符串进行了简单编码，所以反编译后查找getParameter( )看到的是一些乱码，如下：

cI = getParameter(c("va:BMvx(Q"));
String s1 = null;
s1 = getParameter(c("fg>RQqf"));
if(s1 != null)
{
if(!s1.startsWith(c("De+Z]q59O\030D{?D]d5\035WKfp{\036OrbuWVc")))
c();
} else
{
c();
}

看看解码函数c(String)是什么样的（重载的函数不用管）：

private static String c(String s1)
{
char ac[] = s1.toCharArray();
int i1 = ac.length;
int j1 = 0;
label0:
do
{
int k1 = 0;
ac[j1] ^= '\005';
do
{
j1++;
k1++;
if(i1 != j1)
switch(k1)
{
case
    1: // '\001'
ac[j1] ^= '\025';
break;

case
    2: // '\002'
ac[j1] ^= '[';
break;

case
    3: // '\003'
ac[j1] ^= '6';
break;

case
    4: // '\004'
ac[j1] ^= '8';
break;

case
    5: // '\005'
continue label0;
}
else
return
    new String(ac);
} while(true);
} while(true);
}

很简单，可以将其拷贝下来改造成一个解码程序，用它把反编译后的文件中的字符串密文全部解码成明文。再查找“regcode”直接到关键的地方。显然下面的变量cf是个全局标志，表示注册与否。

public void init()
{
setLayout(null);
addNotify();
cS = getToolkit();
cI = getParameter("statusmsg");
String s1 = null;
s1 = getParameter("credits");
if(s1 != null)
{
if(!s1.startsWith("Applet by Andrea
    Fasce (www.anf"))
c();
} else
{
c();
}
String s2 = null;
String s3 = null;
try
{
s2 = getDocumentBase().getProtocol();
}
catch(SecurityException _ex)
{
s2 = "file";
}
try
{
s3 = getDocumentBase().getHost();
}
catch(SecurityException _ex)
{
s3 = "";
}
if(s2.equalsIgnoreCase("file") || s3.length()
    == 0 || s3.equalsIgnoreCase("localhost") || s3.equals("127.0.0.1"))
{
cf = true;  //本地运行则视为注册版
} else
{
if(s3.startsWith("www."))
s3 = s3.substring(4);
String s4 = null;
s4 = getParameter("regcode");
    //取得注册码
if(s4 != null && !s4.equals("NO")
    && s4.length() > 10)
{
int i1 = 1;
try
{
for(int
    j1 = 0; j1 < s4.length(); j1++)
if(s4.charAt(j1) == '+')
i1++;

}
catch(StringIndexOutOfBoundsException
    _ex) { }
int ai[] = new int[i1];
if(i1 == 1)
{
ai[0]
    = s4.length();
} else
{
int
    k1 = 0;
try
{
for(int l1 = 0; l1 < s4.length(); l1++)
if(s4.charAt(l1) == '+')
{
ai[k1] = l1;
k1++;
}

}
catch(StringIndexOutOfBoundsException
    _ex) { }
ai[k1]
    = s4.length();
}
String as[] = new
    String[i1];
int i2 = 0;
for(int k2 = 0; k2
    < i1; k2++)
{
try
{
as[k2] = s4.substring(i2, ai[k2]);
}
catch(StringIndexOutOfBoundsException
    _ex) { }
i2 =
    ai[k2] + 1;
}

for(int l2 = 0; l2
    < i1; l2++)
{
int
    i3 = as[l2].length() - 8;
byte
    abyte0[] = new byte[i3];
byte
    abyte1[] = new byte[8];
as[l2].getBytes(0,
    i3, abyte0, 0);
as[l2].getBytes(i3,
    i3 + 8, abyte1, 0);
int
    j3 = i3 % 7;
int
    k3 = i3 % 3;
for(int
    l3 = 0; l3 < i3; l3++)
{
byte byte0 = abyte0[l3];
if(byte0 >= 48 && byte0 <= 57)
abyte0[l3] = a(byte0, j3, 48, 57);
else
if(byte0 >= 65 && byte0 <= 90)
abyte0[l3] = a(byte0, j3, 65, 90);
else
if(byte0 >= 97 && byte0 <= 122)
abyte0[l3] = a(byte0, j3, 97, 122);
else
if(byte0 == 45)
abyte0[l3] = 46;
else
if(byte0 == 46)
abyte0[l3] = 45;
if((j3 = j3 + k3) > 7)
j3 = 1;
}

int
    i4 = 0;
int
    j4 = 0;
for(int
    k4 = 0; k4 < 4; k4++)
abyte1[k4] -= 52;

for(int
    l4 = 4; l4 < 8; l4++)
abyte1[l4] -= 55;

for(int
    i5 = 0; i5 < i3; i5 += 2)
i4 = i4 + abyte0[i5];

for(int
    j5 = 1; j5 < i3; j5 += 2)
j4 += abyte0[j5];

String
    s12 = String.valueOf(i4);
String
    s13 = String.valueOf(j4);
for(;
    s12.length() < 4; s12 = "0" + s12);
for(;
    s13.length() < 4; s13 = "0" + s13);
byte
    abyte2[] = new byte[8];
s12.getBytes(0,
    4, abyte2, 0);
s13.getBytes(0,
    4, abyte2, 4);
String
    s14 = new String(abyte2, 0);
if(s14.equals(new
    String(abyte1, 0)))
{
String s15 = new String(abyte0, 0);
String s16 = null;
if(s15.startsWith(c("www.")))
s16 = s15.substring(4);
else
s16 = s15;
if(s3.equalsIgnoreCase(s16))
cf = true;  //注册码正确！
}
}

}
}
........
}


CoolFocus Java Applet

标 题:CoolFocus Java Applet的破解 (4千字)
发信人:blowfish
时 间:2001-2-19 12:08:55
详细信息:
 http://www.coolfocus.com有不少很酷的Java Applet，可以做出多种特效。其保护如下：

Registered Applets
If you register an applet with Cool Focus, we'll send you  personal code
    parameters that remove the shareware restrictions. You'll continue to use
    the same class files and documentation and simply add these codes to the applet
    tags in your own pages. We'll also notify you by email when an updated version
    of the applet you registered is available, and you can return to this section
    of the site to download it. The same registration codes will continue to work
    with all updated versions.

在网页中应按照如下格式使用其applet（只列出了与注册码有关的部分）：

<APPLET CODE="ryElevator.class" ARCHIVE="Elevator.jar" MAYSCRIPT WIDTH="400"
    HEIGHT="990">
<param name=Copyright value="Elevator (c) 1999 Cool Focus
    [www.coolfocus.com]">
<param name=Base value="http://members.tripod.lycos.nl/tool_place/">
<param name=Key value="7392045-1209-0-1038">
</APPLET>

其中Key就是注册码，这个注册码是根据嵌有该applet的HTML文档的document base字符串计算出来的，所以必需写注册机。

虽然现在已经有处理*.class文件的工具以防止被反编译，但大多数applet还是未作过任何手脚，所以可以轻易地利用Java反编译器/反汇编器将class文件反编译/反汇编，从而得到其源码。有了源码，破解它的难度近乎为0，同时还可以“偷”到设计者的Java编程技巧。在这一点上Java
    applet和VB3、FoxPro程序没太大区别。

以ryImageWizard.class为例，反编译后查找“Key”，看它如何处理注册码。非常简单：

private boolean _mth0146(String s)
throws NoSuchElementException
{
String s1 = getParameter("Key");  //取出注册码
if(s1 == null)
{
s1 = "";
return false;
}
StringTokenizer stringtokenizer = new StringTokenizer(s1,
    "-");  //以“-”字符将注册码分成4部分
String s2 = stringtokenizer.nextToken(); //注册码第1部分
String s3 = stringtokenizer.nextToken(); //注册码第2部分
String s4 = stringtokenizer.nextToken(); //注册码第3部分
String s5 = stringtokenizer.nextToken(); //注册码第4部分
int i = s.length();
i = i * 7510 + 928;
i -= 28338;
i *= 12;
if(!s2.equals(Integer.toString(i)))  //判断第1部分
return false;
int j = _mth0145(s, 'e') * 684;
if(!s3.equals(Integer.toString(j)))  //判断第2部分
return false;
j = _mth0145(s, 'w') * 947;
if(!s4.equals(Integer.toString(j)))  //判断第3部分
return false;
j = _mth0145(s, 's') * 456;
return s5.equals(Integer.toString(j)); //判断第4部分
}

上面所用到的函数_mth0145( )只是简单地统计某字符在一个串中出现的次数：

private int _mth0145(String s, char c)
{
int i = 0;
byte byte0 = 120;        //垃圾代码还是反编译器有问题？
for(int j = 0; j < s.length(); j++)
{
char c1 = s.charAt(j);
if(c1 == c)
i++;
}

return i;
}

那么函数_mth0146( )是在哪里被调用的呢？查找即知在如下的地方。很显然_fld0104是个全局标志，表示注册与否。传递给_mth0146(
    )的参数就是嵌有applet的HTML的URL。

private void _mth0147()
{
String s = getDocumentBase().toString().toLowerCase();
    //取得HTML的URL
boolean flag = false;
if(s.startsWith("file:") && s.indexOf("imagewizard/docs/")
    >= 0)    //是否是在本地运行本applet
{
_fld0104 = true;  //本地则不判注册码
return;
}
String s1 = getParameter("Base");
if(s1 == null)
{
s1 = "";
_fld0104 = false;
return;
}
String s2 = "";
if(s1.indexOf("|") >= 0)  //多个URL用竖线隔开
{
StringTokenizer stringtokenizer
    = new StringTokenizer(s1, "|");
String as[] = new String[stringtokenizer.countTokens()];
for(int i = 0; i < as.length;
    i++)
{
String s4 = stringtokenizer.nextToken();
if(!s4.startsWith("http"))
as[i]
    = "http://" + s4;
else
as[i]
    = s4;
s2 = s2 + as[i];
if(s.indexOf(s4) >=
    0 || s.startsWith("file:"))
flag
    = true;
}

} else
{
String s3 = s1;
if(!s1.startsWith("http"))
s2 = "http://" + s1;
else
s2 = s1;
if(s.indexOf(s3) >= 0 || s.startsWith("file:"))
flag = true;
}
if(!flag)
{
_fld0104 = false;
return;
}
try
{
_fld0104 = _mth0146(s2);  //这里判注册码
return;
}
catch(NoSuchElementException _ex)
{
_fld0104 = false;
}
}

至此就可以写出注册机。


Dr

 标 题:第一次发长篇，格式不好，所以改改格式、排列一下！ (2千字)
发信人:yuppc
时 间:2001-6-15 22:49:44
详细信息:
这麽好的功能还要注册，而且还有附加条件。起其实他们为了促销Dr.eye软件，把软件的价格定到了一元钱了。
在网站上copy加入后发现果然不能进行网上查字典，通过对其网站的原码分析，发现了破解其网上免费使用的方法，也为提供类似服务的网站提个醒，

下面请看分析（注在***号中间的为注解,^^^^号为注意）：

1. 原码为（用"查看源文件"查看其网页，找到下面）：

***重点***<form method="post" action="" name="dicForm" onsubmit="return fsMySubmit('../dict/dict.phtml')">
^^^^^^^ ^^^^^^^^^^^^^^^^^
<TD rowSpan=2 width="106" background="../images/b4.gif" valign="middle">
<input type="text" name="w" size="15">
^^^^^
<input type=hidden name="ver" value="gb">
^^^^ ^^^^^^^^
</TD>
<TD rowSpan=2 width="107" background="../images/b4.gif" valign="middle">
<table width="83%" border="0" height="30" cellpadding="4" cellspacing="4">
<tr>
<td>
<input type="submit" style="FONT-SIZE: 9pt" name="Submit" value="查询">
^^^^^^^^^^^^
</td>
</tr>
</table></td>
2.在单词输入框中输入一个单词（如：type)用以测试其工作原理：

3.结果其新开一页显示单词"type"的中文解释，结果我发现在我浏览器地址栏的地址显示为
"http://www.dreye.com.cn/dict/dict.phtml?w=type&d=010300&account=123456&ver=gb"
^^^^^^^^ ^^^^^ ^^^^^^ ^^^^^^
大家看明白了吗，太清楚不过了：我们输入的单词"type"被付给变量"w"了，而变量"d"和"account"及其它们的值"01030"和"123456"就是我们要得到的通用帐号和密码了；

4.开始行动：1>前面form的action的值为"http://www.dreye.com.cn/dict/dict.phtml?w=Submit&d=010300&account=123456&ver=gb"
2>"onsubmit"的值为"return fsMySubmit('http://www.dreye.com.cn/dict/dict.phtml')"
************************************************************
5.因此在适当位置插入以下代码即可实现网上查字典（不用注册哟）：
<form method="post" action="http://www.dreye.com.cn/dict/dict.phtml?w=Submit&d=010300&account=123456&ver=gb" name="dicForm" onsubmit="return fsMySubmit('http://www.dreye.com.cn/dict/dict.phtml')">
<TD rowSpan=2 width="106" background="../images/b4.gif" valign="middle">
<input type="text" name="w" size="15">
<input type=hidden name="ver" value="gb">
</TD>
<TD rowSpan=2 width="107" background="../images/b4.gif" valign="middle">
<table width="83%" border="0" height="30" cellpadding="4" cellspacing="4">
<tr>
<td>
<input type="submit" style="FONT-SIZE: 9pt" name="Submit" value="查询">
</td>
</tr>
</table>
</TD>
</form>


JVISION 1.4.2

标 题:用SoftICE跳过注册码检查可以安装成功，其试用版是用VBOX搞的 (3千字)
发信人:blowfish
时 间:2001-4-22 21:09:59
详细信息:

JVISION 1.4.2 for Commercial use

http://www.object-insight.com/html/screensunlock.html

这个需要安装序列号的好象是正式版？装好之后没有VBOX。

jvision*.exe

001B:02FFDE77 8B442410 MOV EAX,[ESP+10]
001B:02FFDE7B 85C0 TEST EAX,EAX
001B:02FFDE7D 7522 JNZ 02FFDEA1 //NOP this
001B:02FFDE7F 8BC3 MOV EAX,EBX
001B:02FFDE81 8BCE MOV ECX,ESI
001B:02FFDE83 E88C7FCDFE CALL 01CD5E14 //finishing installation
001B:02FFDE88 8B6C2448 MOV EBP,[ESP+48]
001B:02FFDE8C B801000000 MOV EAX,00000001
001B:02FFDE91 8B7C2444 MOV EDI,[ESP+44]
001B:02FFDE95 8B742440 MOV ESI,[ESP+40]
001B:02FFDE99 8B5C243C MOV EBX,[ESP+3C]
001B:02FFDE9D 83C44C ADD ESP,4C
001B:02FFDEA0 C3 RET
001B:02FFDEA1 B8D0B5C700 MOV EAX,00C7B5D0
001B:02FFDEA6 8BCE MOV ECX,ESI
001B:02FFDEA8 E893404900 CALL 03491F40
001B:02FFDEAD 8BCE MOV ECX,ESI
001B:02FFDEAF E88891CDFE CALL 01CD703C //"serial number incorrect"

安装程序似是用InstallAnywhere for Java制作的。有个编译后的安装脚本文件InstallScript.data，但实际上是个*.class文件，里面有判断注册码的东西。如下：

show_Serial_Number_Panel_Enter_Serial_Number = new SetSerialNumber();
show_Serial_Number_Panel_Enter_Serial_Number.setPrefix(true);
show_Serial_Number_Panel_Enter_Serial_Number.setMutuallyExclusiveProducts(true);
show_Serial_Number_Panel_Enter_Serial_Number.setSeedStr("*#&*,&*,!*#!},!*,!}#!*,&*#&");
show_Serial_Number_Panel_Enter_Serial_Number.setNoOfSerialNumbers(1000L);
show_Serial_Number_Panel_Enter_Serial_Number.setMatchingProduct("Product");
show_Serial_Number_Panel_Enter_Serial_Number.setInstallPanelClassName("com.zerog.ia.installer.installpanels.SerialNumberInstallPanel");
show_Serial_Number_Panel_Enter_Serial_Number.setAllowBlankInput(false);
show_Serial_Number_Panel_Enter_Serial_Number.setSerialNumberEntered("UserEnteredSerialNumber");
show_Serial_Number_Panel_Enter_Serial_Number.setPrompt("Please Enter the Serial Number: ");
show_Serial_Number_Panel_Enter_Serial_Number.setStepTitle("Enter Serial Number");
show_Serial_Number_Panel_Enter_Serial_Number.setNoOfProductsStr("(|%({e$@+.");
show_Serial_Number_Panel_Enter_Serial_Number.setStaticStringStr("+`^+:+|(}:+!(})");
show_Serial_Number_Panel_Enter_Serial_Number.setSuffix(false);
show_Serial_Number_Panel_Enter_Serial_Number.setAdditionalText("This Installer Requires a Serial Number to Continue");
show_Serial_Number_Panel_Enter_Serial_Number.setNoOfDigitsStr("(!^(@@*e1.");
show_Serial_Number_Panel_Enter_Serial_Number.setFileName("jvision142w_SerialNumbers.txt");
show_Serial_Number_Panel_Enter_Serial_Number.setExternalID("SetSerialNumber.15");
ProgressMonitor.updateScriptIncrement();
jVISIO2_preInstallActions.addElement(show_Serial_Number_Panel_Enter_Serial_Number);

再把临时目录下的IAclasses.zip解开，找到SetSerialNumber.class、SerialNumberManager.class、SerialNumberInstallPanel.class，真正的注册码判断就在这里面。有兴趣的自己分析吧。真正的程序文件都在installer.zip中的raw目录下。


Zelix KlassMaster

 标 题:破解 Zelix KlassMaster 的字符串加密 在java游戏中作弊(转载文章) (7千字)
发信人:梦醒时分
时 间:2001-7-24 20:18:35
详细信息:
破解 Zelix KlassMaster 的字符串加密
在java游戏中作弊

版本 1.1

作者; Morten Poulsen
翻译; 梦醒时分 /*梦侠俱乐部[http://www.patching.net/dream]*/
日期; 2001年7月10日

相关消息; http://www.zelix.com/klassmaster/featuresStringEncryption.html

简介
~~~~

反编译 Java 小程序,并且转变为代码都很难,人们为了寻找隐藏的消息经常迷失在
java 代码中.一种方法就是打乱行号,替换所有的 classes 的名称, 方法和变量,我们
将会发现我们所需要的:字符串加密.

分析代码你所需要的工具:
- Java 反编译器 (例如:JAD)
- 编辑工具 (例如:vim)
- 感觉能力 (例如:大脑)

最好能够有些 JVM 的知识, 不过不懂也不用担心，在这儿我会把一切都告诉你的.
但是想要制作你自己的破解程序，你就一定需要那些知识了.

要作弊 Java 游戏，你所需要的工具:

- TCP 嗅探器 (例如:tcpdump)
- 支持 Java 的浏览器 (例如:Mozilla)
- C 编译器 (例如:gcc)
- GNU 的工具 (例如:grep)
- 支持 PHP 的服务器 ;-)

第一步:是什么呢？

当然是寻找破解的目标喽 :) 在 Coca~Cola's 主页上的游戏看起来不错(nordic).打
开 TCP 嗅探器(tcpdump -w file), 运行游戏.玩一会,然后记录你的分数.TCP 嗅探器可
以停止了.打开记录文件(vi file).在文件中寻找你的分数,你应该看到这一行:

GET /magazine/servlet/SetHighscoreServlet?score=6324&game=0&cookie=yourname&md5=c404cd019e1a214487cd4c841

我们所要解决的就是 md5 的数值是怎么生成的，那么我们就可以作弊，自己加分
数了.

第二步:反编译和分析

下载游戏的 .jar 文件夹(提示: 查看源文件, <applet> 标签中的 archive=...),
解开后，反编译每一个 class 文件.现在试着在代码中查找返回数据到服务器的地方
(fgrep -rn "URL" *). b/a/a.java 的第 122 行 (用 jad 反编译的结果) 看起来可以
作为我们开始的地方:

URL url = new URL(c, b("L9\001 qMdK|)\016rZ!\f\007cfg8\ndMa-\007DK|)
\016rZ1,\001x\\kb") + Integer.toString(i) + b("DpOc:_") + d + b("DtA
a4\013r\023") + e + b("DzJ;b") + a.a.a.a.a.a(i, Integer.parseInt(d), e));

URL 看起来是这样的:
"long text"+i+"text"+d+"text"+e+"text"+result_of_calculation(i,d,e)

现在的问题是"这些是不是我们看到的字符串?"(不要紧张嘛~) 和 " a.a.a.a.a.a()
都干了些什么?".

打开文件 (vi b/a/a.java) 到 122 行.我们可以看到加密字符串的方法是 b() .
查看 b() (line 224).是这样的:

224: private static String b(String s)
225: {
226: char ac[];
227: int i;
228: int j;
229: ac = s.toCharArray();
230: i = ac.length;
231: j = 0;
232: goto _L1
233: _L9:
234: ac;
235: j;
236: JVM INSTR dup2 ;
237: JVM INSTR caload ;
238: j % 5;
239: JVM INSTR tableswitch 0 3: default 76
240: // 0 52
241: // 1 58
242: // 2 64
243: // 3 70;
244: goto _L2 _L3 _L4 _L5 _L6
245: _L3:
246: 0x62;
247: goto _L7
248: _L4:
249: 23;
250: goto _L7
251: _L5:
252: 46;
253: goto _L7
254: _L6:
255: 14;
256: goto _L7
257: _L2:
258: 95;
259: _L7:
260: JVM INSTR ixor ;
261: (char);
262: JVM INSTR castore ;
263: j++;
264: _L1:
265: if(j < i) goto _L9; else goto _L8
266: _L8:
267: return new String(ac);
268: }

Java's Virtual Machine(JVM) 是基于机器的堆栈.也就是说,只通过一个寄存器,
指令指针, 其它的寄存器都是在堆栈中进行完成工作的.例如: c=a+b 是通过 PUSH a,
PUSH b, ADD (用来 pop 操作出堆栈的内容，并且返回结果)和POP c.

如果我们进一步的观察代码, 我们可以看到 232,233,264,265,266 是一个 while
循环, 循环通过了字符串中的内容. 238 行push了 j%5 的结果到堆栈上.239-259 看起
来像是 switch/case, push 一个数字到堆栈, 基于 j%5. 260 行两次 pop 了堆栈,得
到了加密了的字符串, 和神秘的数字,然后是一个 XOR. 哈哈!神秘的数字就是一个简单
的 XOR 加密的密钥!如果写成 C 语言就是:

for (j=0; j<strlen(str); j++) {
str[j] ^= key[j%5];
}

就是这样了. Just a plain 40-bit XOR. 让我们写一个小程序来加密一个字符串.

decode1.c:
------------------------------------------------------------------------------
#include <stdlib.h>

#define KEYSIZE 5

int main(void) {
unsigned char buf[] = "L9\001 qMdK|)\016rZ!\f\007cfg8\ndMa-\007DK|)\016rZ1,\001x\\kb";
unsigned char key1[] = { 0x62, 23, 46, 14, 95 };
unsigned char c;
int i;

for (i=0; i<strlen(buf); i++) {
c = buf[i] ^ key1[i%KEYSIZE];
printf("%c", c);
}
printf("\n");

return EXIT_SUCCESS;
}
------------------------------------------------------------------------------

编译并且运行它 (gcc decode1.c && ./a.out) :
../../servlet/SetHighscoreServlet?score=

这样,我们通过几行C代码就完成了字符串的加密。

第三步:Hash 函数

在HTTP-请求中的 MD5 的数值像是用 md5 加密的,所以我的想法是: 它使用了 md5 来
表示分数,游戏 id, 用户名和一些隐藏字符串.但是为什么方法分三步呢(long,int,String)?
那样不符合 MD5 函数. 打开文件(vi a/a/a/a/a.java),查看分三个部分的 a() (83 行). 哈!
他调用了真正的 MD5 方法来完成一个字符串:

(l + i) + s + "some secret string"

l 就是分数, i 是游戏的 id ，还有 s 是用户名. 但是隐藏字符串是加密后的.事实上,
它加密了两次(你可以看到它 calls 了 c() 和 b(), 但是没有关系的.

查看 c() (line 140). 哈! 他和上面是一样的，只不过 密钥 改变了.我们再看看 b()
(89 行). 嘿嘿, 也是一样的. 所以我们所要做的就是获得隐藏字符串.我们把上面的程序稍加
修改就可以获得2个 密钥了.

decode2.c:
------------------------------------------------------------------------------
#include <stdlib.h>

#define KEYSIZE 5
#define BUFSIZE 25 /* needed, 'cause buf has a null byte */

int main(void) {
unsigned char buf[] = "mS?\032<lD/\0137aS&\003<e_,\013*}D.\000>";
unsigned char key1[] = { 0x71, 103, 47, 41, 9 };
unsigned char key2[] = { 120, 81, 100, 71, 80 };
unsigned char c;
int i;

for (i=0; i<BUFSIZE; i++) {
c = buf[i] ^ key1[i%KEYSIZE] ^ key2[i%KEYSIZE];
printf("%c", c);
}
printf("\n");

return EXIT_SUCCESS;
}
------------------------------------------------------------------------------

运行程序，它返回 "detteerdenhemmeligestreng" 是 "thisisthesecretstring"的丹麦语.

第四步: 利用这个程序

警告! 不要在家使用,有一定的危险性 ;-) 为了方便,作者写了一个 PHP 脚本来生成
URL 请求服务器加分 (只要拷贝/粘贴到浏览器中).去试一试吧,这里我的 hash 值是假的,
使用你自己的.

hash.php:
------------------------------------------------------------------------------
<html>
<head>
<title>Coca~Cola hiscore generator</title>
</head>
<body>
<?php
if ($cookie) print("http://www.coca-cola.fi/magazine/servlet/SetHighscoreServlet?score=$score&game=$game&cookie=$cookie&md5=".md5($score.$cookie.'detteerdenhemmeligestreng')."<br>\n");
print("<form>\n");
print("<input type=\"text\" name=\"score\" value=\"" . (int)$score . "\" size=\"10\"><br>\n");
print("<input type=\"text\" name=\"game\" value=\"" . (int)$game . "\" size=\"2\"><br>\n");
print("<input type=\"text\" name=\"cookie\" value=\"$cookie\" size=\"30\"<br>\n");
print("<input type=\"submit\" value=\"go go go\">\n");
print("</form>");
?>
</body>
</html>
------------------------------------------------------------------------------


MFC 程式的跟踪

 标 题:MFC 程式的跟踪 (一) (6千字)
发信人:WinDos2K
时 间:2001-5-1 13:19:23
详细信息:
MFC 程式的跟踪 (一)

工具(选用最新版本)
1 Win32Dasm
2 IDA Pro
3 HexEditor
4 SICE

目标
http://soft.269.net/SoftWareView.asp?SoftWareID=21721
这东西如何用还未知道,只知道是做图表的,但一些工能被停用了,会跳出Demo版无此工能的对活框

目的
去除Demo对活框，恢复原有工能

小知识
MFC程式有两种,一是所谓静态库（static library），另一种是分享动态连接库（shared dll）
第一种程式比较完整,所有工能码都附在程式内，另一种工能码跟别人分享,所以
会有很多转跳，上面程式应是第二种，而分享动态连接库是MFC42.DLL,又MS把这连接库
的名字都用序号,Ordinal：09CE之类，令人混淆不清.

正题
打开程式,隋意做些图表,打开File选单,可看到存档(Save/Save AS子选单没有丧失工能)，按Save As一下,Demo 指示跳出.那麽把Demo框去除,跳回Save As子程式,那不是很容易吗?正是!整个过程就是做这个事情.但到底什样做?
Demo框是目标之一,就拿它下手,用W32Dasm把主程式反汇一下(这是我一贯做法),分析後发现这Demo框字串出现有二十三处之多,也弄不清是那一个对应Save As选单,就把每个对应地址记下,打开ICE Loader加载主程式,当停在程式入口处的时候,把记下的地址一一 bpx XXXXXXXX 加入断点,F5运行程式,再选Save AS, 程式中断在4C2940,返回W32Dasm,逆流而上,看看源头是什么样,结果令人失望.
:0040187A E941A61100 jmp 0051BEC0
:0040187F E94CE91700 jmp 005801D0
:00401884 E977D20400 jmp 0044EB00 &szlig;--其中一起始点

这起始点就是Save As子程式的入口点,很明显是没有被任何直接呼叫.

小知识
在x86汇编的定址模式中,有直接定址和间接定址, 直接定址易明不用多说了, 间接定址也经常在PE程式中出现如 Call dword ptr [edx+000000A0],这种定址模式反汇编是无法反的.在这例子中,edx是这表的最底部,而00A0是偏移量,注意这模式,後面会用到.

静态分析碰钉,改动态分析, 打开ICE Loader加载主程式,当停在程式入口处的时候,下bpx 4C2940,当经过一轮鼠工之後,程式断在4C2940处,

:004C2940 6AFF push FFFFFFFF
:004C2942 6A00 push 00000000

* Possible Reference to String Resource ID=00144: "This function is not available in the demo."
|
:004C2944 6890000000 push 00000090

* Reference To: MFC42.Ordinal:04AF, Ord:04AFh
|
:004C2949 E874981200 Call 005EC1C2 &szlig;- MessageBox ???
:004C294E 33C0 xor eax, eax
:004C2950 C20800 ret 0008

这时在4C2950处又下一断点,F5运行程式,Demo框字串出现,按OK,又中断在4C2950处,这时按一下F8,程式转到下面6C3D0A64的MFC42.DLL里

Exported fn(): Ordinal:1209 - Ord:1209h
:6C3D0A58 8B01 mov eax, dword ptr [ecx]
:6C3D0A5A 6A01 push 00000001
:6C3D0A5C 6A00 push 00000000
:6C3D0A5E FF90A0000000 call dword ptr [eax+000000A0]
:6C3D0A64 C3 ret

好了，那就是说6C3D0A5E这个Call产生Demo框了，跟踪一下这个Call [eax+000000A0]=Call [62D5BC+A0]àCall [62D65C]==Call 402F7C.

:00402F7C E9BFF90B00 jmp 004C2940

从MFC42.DLL反回主程式,又碰钉了,但是奇怪的为什么要从MFC42.DLL反回主程式？看看
这62D65C(RVA)== 22D65C(File)的位置

0022D640 3B 9D 40 00 10 C8 5E 00 0A C8 5E 00 04 C8 5E 00
0022D650 57 72 40 00 E2 CB 5E 00 F2 C7 5E 00 7C 2F 40 00
0022D660 E6 C7 5E 00 E0 C7 5E 00 DC CB 5E 00 D6 CB 5E 00

就是地址列表(Relocation table)，但都是从005EXXXX 开始，只有00402F7C有点奇怪，看看
005EC804 是什么样

* Reference To: MFC42.Ordinal:15C9, Ord:15C9h
|
:005EC804 FF25FC736800 Jmp dword ptr [006873FC]

又看看006873FC是什么样

:00620FF6 00000000000000000000 BYTE 10 DUP(0)

oops W32Dasm 最多到00621000 ,没有选择，用IDA Pro 反一下

06873E8 ; public: virtual int __thiscall CDocument::DoFileSave(void)
006873E8 extrn ?DoFileSave@CDocument@@UAEHXZ:dword
006873E8 ; DATA XREF:CDocument::DoFileSave(void) r
006873EC ; public: virtual int __thiscall CDocument::DoSave(char const *,int)
006873EC extrn ?DoSave@CDocument@@UAEHPBDH@Z:dword
006873EC ; DATA XREF: CDocument::DoSave(char const *,int) r
006873F0 ; public: virtual void __thiscall COleDocument::PreCloseFrame(class CFrameWnd *)
006873F0 extrn ?PreCloseFrame@COleDocument@@UAEXPAVCFrameWnd@@@Z:dword
006873F0 ; DATA XREF: COleDocument::PreCloseFrame(CFrameWnd *) r
006873F4 ; public: virtual int __thiscall COleDocument::SaveModified(void)
006873F4 extrn ?SaveModified@COleDocument@@UAEHXZ:dword
006873F4 ; DATA XREF: COleDocument::SaveModified(void) r
006873F8 ; public: virtual int __thiscall CDocument::CanCloseFrame(class CFrameWnd *)
006873F8 extrn ?CanCloseFrame@CDocument@@UAEHPAVCFrameWnd@@@Z:dword
006873F8 ; DATA XREF: CDocument::CanCloseFrame(CFrameWnd *) r
006873FC ; public: virtual void __thiscall CDocument::ReleaseFile(class CFile *,int)
006873FC extrn ?ReleaseFile@CDocument@@UAEXPAVCFile@@H@Z:dword

看到这些字是不是很有意思,DoFileSave,DoSave等等,都是跟保存文件有密切关系。

小知识
在「深入浅出 MFC」,Dissecting MFC 第四部分 第八章. Document View 深入探讨 里,对於程式的读写都讲解得很详细,这是MFC四大天王其中之一是本很好的书. http://www.csdn.net/expert/jjhou/

既然MFC42.DLL里别有洞天,我们便把这DLL反一下, 详细的看一看.

Exported fn(): Ordinal:1208 - Ord:1208h
:6C3D0A50 8B01 mov eax, dword ptr [ecx]
:6C3D0A52 FFA0A4000000 jmp dword ptr [eax+000000A4]

Exported fn(): Ordinal:1209 - Ord:1209h
:6C3D0A58 8B01 mov eax, dword ptr [ecx]
:6C3D0A5A 6A01 push 00000001
:6C3D0A5C 6A00 push 00000000
:6C3D0A5E FF90A0000000 call dword ptr [eax+000000A0]
:6C3D0A64 C3 ret

在上面Ord:1208h及Ord:1209h便是MFC OnFileSave( )及OnFileSaveAs( )的入口点,最後会转到DoSave( ) Ord:09EEh上,详细情况可看 深入浅出 MFC一书.

Exported fn(): Ordinal:09EE - Ord:09EEh
:6C3D0AA0 B86F3F406C mov eax, 6C403F6F

* Reference To: MSVCRT._EH_prolog, Ord:0042h
|
:6C3D0AA5 E8D305FAFF Call 6C37107D

你会问为什么我会知道这些入口点的名称,答案==IDA Pro+学作+练习

现在程式的来龙去脉都清楚了,只要把call [eax+000000A0]从显现Demo框改到DoSave( )上便可存档,什么样改就不用说了,最後打印是用OnFilePrint( ).

结语
主要修改为下
存档 在22D65C改402F7C为5EC7EC
打印 在22E6C4改40A961为5ECC8A
只要把MFC42.DLL跟主程式作一体化,MFC程式还是可跟踪的.
还有其它工能有机会再写.


解密FOX加密的程序

标 题:转帖--对付几个特殊加密的破解方法以fox程序为主---作者:diaojf (2千字)
发信人:CrackerABC[BCG]
时 间:2001-4-15 11:43:39
详细信息:
作者:diaojf(202.206.xxx.xxx) 04.14 15:40

该软件是够变态的了.

1.先20/20出品的SoftSentry对FOX编译的EXE文件进行加密;
2.然后采用VFP&EXE对FOX编译的EXE文件加壳.
3.因此你用"方法一(见下)",虽然可突破VFP&EXE解出Y26356.exe文件(该文件名在你的微机上可能不同),但你使用市面所有反编译FOX文件的程序
都会告诉你"该文件不是FOX系列文件"因此无法反编译得到PRG,SCX等源代码(其实由于该软件未采用编制源程序的方法产生注册画面,故即使你本领超人破出源代码,也是无用)-需加密源代码可用该方法.
4.使用FileInfo.exe检查Y26356.exe文件,未发现是经过SoftSentry加过壳的.
5.到此,我只好调出TRW进行跟踪,胡乱下了几个 r fl z后发现程序中出现20/20字样,马上想到可能是经过softSentry处理过的.(说道这,还要谢谢wjx,要不是他提出破解MINIDVD,我是从未见过采用softSentry软件来进行加壳的)
6.至此,调出上午刚下载的desoft05.zip对Y26356.exe进行逆向工程(运行Desoft9x.exe后有三个按钮,选最下面的进行脱壳,文本框中的"1000"不要改),破出Y26356.exe纯净程序.运行,一切OK.

注:
1. TaskInfo2000下载地址:http://www.newhua.com/TASKINFO.HTM
2.desoft05.zip下载地址:http://mud.sz.jsinfo.net/per/aaron/files/unpackers/win/desoft05.zip

方法一: <<<<<<以下仅部分适用于破解"教程">>>>>>>>
<<<<<>>>>>>
<<<<<<注意: 资源管理器的配置中选中"显示使用文件"否则你看不见具有隐藏属性的Y26356.exe文件>>>>>>>>>>>

该软件使用VFP&EXE加密处理,如对其胜新库管王.EXE进行处理,那你就自认倒霉吧.
其实当你在启动胜新库管王.EXE后,再运行TaskInfo2000 2.2,你将发现有一个名为W25677.exe的文件,该文件子进程显示"胜新库管王",可推断出W25677.exe可能为软件自动脱壳后的真正FOXPRO编译的胜新库管王主程序.

但是,该文件位于c:\RECYCLED\ \ \ \0目录下,如你用资源管理器查看c:\RECYCLED,由于WIN98保护机制你将一无所获.

同时胜新库管王.exe进程对该文件进行了保护,当你复制c:\RECYCLED时显示"文件的一部分被锁定",这时你可用TaskInfo2000 2.2中止胜新库管王.exe进程(注意:不是中止W25677.exe)以去掉锁定.

到此,剩下的问题是将W25677.exe文件单独分离复制出来,以便进行相应处理.
方法如下:

<<<<<<<<<<< 拷贝即可>>>>>>>>

1.当你用TaskInfo2000 2.2中止胜新库管王.exe进程后,使用资源管理器复制c:\RECYCLED整个目录到d:\1子目录下
2.使用WINZIP.EXE对d:\1进行压缩,以使W25677.exe进入压缩包1.zip.(利用winzip的不带路径解压缩功能可将W25677.exe解出)
3.打开1.zip,你将看见W25677.exe文件.
4.选中W25677.exe文件对其解压缩,注意:此时将释放对话框中的"use folder name"前面的勾去掉.
5.至此W25677.exe文件已被分离出来,剩下的事你就看着办吧.


全国邮编区号查询系统

标 题:全国邮编区号查询系统的破解！ (550字)
发信人:1212
时 间:2001-2-14 10:50:32
详细信息:
URL：http://pcft.top263.net/zip/pcft-yz.zip

这个软件用了UPX0.9?加的外壳，脱了之后运行出来以下对话框：

“对不起！你这个软件可能是Vfp&Exe l.32以下版本加密的，无法运行，请你升级到1.33版！”
我就继续CRACK这个MESSAGEBOX，但过了之后他又出来一个对话框：
“请输入密码！”
唉！只有不了了之，

如果不脱壳，那么在输入注册码的地方很难拦的住！我试过hmemcpy,sendmessage,lockmytask等，就算拦住了，我估计也没什么可能找到注册码！（从作者的一系列的ANTI-CRACK来看，他在这方面是下了一番功夫的）

试过Wd32asm，没什么效果，那位大侠能教教我？多谢先。。。。
标 题:FoxKill反编译=》查看、分析代码=》VB写注册机，原代码如下： (1千字)
发信人:品琳居
时 间:2001-2-15 19:59:49
详细信息:
Option Explicit
Private Const MAX_FILENAME_LEN = 256
Private Declare Function GetVolumeInformation& Lib "kernel32" Alias "GetVolumeInformationA" _
(ByVal lpRootPathName As String, ByVal pVolumeNameBuffer As String, _
ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, _
lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _
ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long)
Public Function GetSerialNumber(sDrive As String) As Long
Dim ser As Long
Dim s As String * MAX_FILENAME_LEN
Dim s2 As String * MAX_FILENAME_LEN
Dim i As Long
Dim j As Long

Call GetVolumeInformation(sDrive + ":\" & Chr$(0), s, MAX_FILENAME_LEN, ser, i, j, s2, MAX_FILENAME_LEN)
GetSerialNumber = ser
End Function
Private Sub cmdGenKey_Click()
Dim Code1, Code2, HardDiskSerial, Serial1, Serial2 As Long
Dim Key, PassWord As String

If Val(txtID.Text) < 100000000000000# Then
MsgBox "身份证号码至少为15位，请重新输入！", vbCritical, "警告"
txtID.Text = ""
txtID.SetFocus
Exit Sub
End If

HardDiskSerial = GetSerialNumber("c")

Code1 = 1000000 - Val(Mid(txtID.Text, 6, 6))
Code2 = 1000000 - Val(Mid(txtID.Text, 1, 6))

Serial1 = 2371 + Int(Val(HardDiskSerial) / 923)
Serial2 = 1807 + Int(Val(HardDiskSerial) / 737)

Key = Str(3 * (Serial1 + Code2) + (Serial2 + Code1))
Key = RTrim(LTrim(Key))

PassWord = "R" + Key + "Y"
PassWord = RTrim(LTrim(PassWord))

txtPassword.Text = PassWord
End Sub

标 题:很多人都会。。。。。 (666字)
发信人:品琳居
时 间:2001-2-15 19:35:23
详细信息:

FoxKill 不存在这个问题，我在公布Refox Brand II 解密插件时已经
将Refox Brand I+ 考虑进去了。Refox8之前是没有Brand I+,在写
FoxKill的时候，没有考虑到这个问题。到后来我发现Refox8的演示版
中可以轻易修改使其具备 Brand I+、II（0001E6F8: 0A改为1C ）的功
能时便公布了破解此类加密的插件。

Unfoxall 不能反编译是因为作者穆先生的小失误。对付UNFOXALL其实很
容易，随便改一点东西它就不能识别了。

也许适当的时候我会考虑公布 FOXPRO 2.5 - VFP 7.0的非标准EXE（加密、
变换）还原为标准APP文件的汇编原代码，这样你可以使用REFOX 7.X以上或
UNFOXALL都能正确反编译。

要研究FOX文件的反编译，必须先从研究APP文件入手。

不要找我要FoxKill，一个给我带来太多太多麻烦的心血之作，


胜新库管王

标 题:转帖：胜新库管王破解要点 (1千字)
发信人:CrackerABC[BCG]
时 间:2001-4-12 17:10:37
详细信息:
胜新库管王破解要点 (来源 中国安全技术论坛 diaojf )

该软件使用VFP&EXE加密处理,如对其胜新库管王.EXE进行处理,那你就自认倒霉吧.
其实当你在启动胜新库管王.EXE后,再运行TaskInfo2000 2.2,你将发现有一个名为W25677.exe的文件,该文件子进程显示"胜新库管王",可推断出W25677.exe可能为软件自动脱壳后的真正FOXPRO编译的胜新库管王主程序.

但是,该文件位于c:\RECYCLED\ \ \ \0目录下,如你用资源管理器查看c:\RECYCLED,由于WIN98保护机制你将一无所获.

同时胜新库管王.exe进程对该文件进行了保护,当你复制c:\RECYCLED时显示"文件的一部分被锁定",这时你可用TaskInfo2000 2.2中止胜新库管王.exe进程(注意:不是中止W25677.exe)以去掉锁定.

到此,剩下的问题是将W25677.exe文件单独分离复制出来,以便进行相应处理.
方法如下:

1.当你用TaskInfo2000 2.2中止胜新库管王.exe进程后,使用资源管理器复制c:\RECYCLED整个目录到d:\1子目录下
2.使用WINZIP.EXE对d:\1进行压缩,以使W25677.exe进入压缩包1.zip.(利用winzip的不带路径解压缩功能可将W25677.exe解出)
3.打开1.zip,你将看见W25677.exe文件.
4.选中W25677.exe文件对其解压缩,注意:此时将释放对话框中的"use folder name"前面的勾去掉.
5.至此W25677.exe文件已被分离出来,剩下的事你就看着办吧.

至于反编译涉及到版权,请自己研究,网上有相关软件,保证让你爽一下.


中国杂志管理系统

标 题:中国杂志管理系统之简单获取用户名和密码! (1千字)
发信人:小球
时 间:2001-3-13 22:43:08
详细信息:
中国杂志管理系统之简单获取用户名和密码！
首先，我知道这个软件不用注册。而且作者也在readme中告诉我们初始用户名和密码。
只不过我想试试unfoxall的功能！呵呵！！！
它是用fox编的，当然用unfoxall来反编译！
用unfoxal打开中国杂志管理系统的主程序：cmmis.exe
然后选择反编译，指定一个目录。
在其目录中你会发现mima这个windows脚本部件。打开它你会看到如下：
PROCEDURE Click
IF .NOT. EMPTY(THISFORM.TEXT1.VALUE) AND .NOT. EMPTY(THISFORM.TEXT2.VALUE)
IF ALLTRIM(THISFORM.TEXT1.VALUE) = 'zmlm0k' AND ; *这是另一个用户名。
ALLTRIM(THISFORM.TEXT2.VALUE) = '88488341' *和密码
THISFORM.RELEASE
CLOSE DATABASES
DO mainmenu.mpr
ELSE
LOCATE FOR THISFORM.TEXT1.VALUE = PWDMAN.NAME AND THISFORM.TEXT2.VALUE = PWDMAN.PASSWD
IF .NOT. EOF()
THISFORM.RELEASE
CLOSE DATABASES
DO mainmenu.mpr
ELSE
CMESSAGETITLE = '提示信息'
CMESSAGETEXT = '密码错误，要重新输入吗？'
NDIALOGTYPE = 36
NANSWER = MESSAGEBOX(CMESSAGETEXT,NDIALOGTYPE,CMESSAGETITLE)
DO CASE
CASE NANSWER = 6
THISFORM.TEXT2.VALUE = ''
THISFORM.TEXT1.SETFOCUS
CASE NANSWER = 7
CMESSAGETITLE = '警告信息'
CMESSAGETEXT = '密码错误，你不能进入本系统！'
MESSAGEBOX(CMESSAGETEXT,0,CMESSAGETITLE)
THISFORM.RELEASE
QUIT
ENDCASE
ENDIF
ENDIF
ELSE
WAIT WINDOW NOWAIT '未输入合法用户名或密码！'
ENDIF
ENDPROC
*------
PROCEDURE Destroy
&&----无事件！
ENDPROC  O
PROCEDURE LostFocus
CNAME = ALLTRIM(THISFORM.TEXT1.VALUE)
ENDPROC
*------  Q
PROCEDURE LostFocus
CPASSWD = ALLTRIM(THISFORM.TEXT2.VALUE)
ENDPROC
*------  R
PROCEDURE Click
THISFORM.RELEASE
CLOSE DATABASES
QUIT
ENDPROC
*------


VB Pcode

 标 题:VB Pcode破解方法及实例 (5千字)
发信人:8989
时 间:2001-6-16 18:35:50
详细信息:
VB Pcode破解方法及实例
破解工具：exdec.exe（vb pcode反编译工具） http://guodong.home.sohu.com/exdec.zip
破解对象：风飘雪crackme001 （下载http://duba.126.com)
exdec反编译
Email josephco_@hotmail.com with any errors or problems
This program doesn't have executable code right after it loads

Proc: 402870
40276C: f5 LitI4: 0x0 0 (....)
402771: 71 FStR4 local_0098
402774: f5 LitI4: 0x0 0 (....)
402779: 71 FStR4 local_009C
40277C: 04 FLdRfVar local_00A4
40277F: 21 FLdPrThis
402780: 0f VCallAd 7b3fc360
402783: 19 FStAdFunc local_00A0
402786: 08 FLdPr local_00A0
402789: 0d VCallHresult 7b3fbe88
40278E: 3e FLdZeroAd local_00A4
402791: 31 FStStr local_0090
402794: 1a FFree1Ad local_00A0
402797: 04 FLdRfVar local_00A4
40279A: 21 FLdPrThis
40279B: 0f VCallAd 7b3fc358
40279E: 19 FStAdFunc local_00A0
4027A1: 08 FLdPr local_00A0
4027A4: 0d VCallHresult 7b3fbe88
4027A9: 3e FLdZeroAd local_00A4
4027AC: 31 FStStr local_0094
4027AF: 1a FFree1Ad local_00A0
4027B2: 6c ILdRf local_0090
4027B5: 4a FnLenStr ====取输入姓名长度（0090）
4027B6: f5 LitI4: 0x9 9 (....)
4027BB: d1 LtI4
4027BC: 6c ILdRf local_0090
4027BF: 4a FnLenStr
4027C0: f5 LitI4: 0xb 11 (....)
4027C5: db GtI4
4027C6: c4 AndI4 =====姓名长度要求9-11
4027C7: 6c ILdRf local_0094
4027CA: 4a FnLenStr ====取输入注册码长度（0094）
4027CB: f5 LitI4: 0x9 9 (....)
4027D0: d1 LtI4
4027D1: c5 OrI4 =====注册码长度要求大于等于9
4027D2: 1c BranchF: 4027DA
4027D5: 10 ThisVCallHresult 0
4027DA: f4 LitI2_Byte: 0x1 1 (.) ===步长1（I2）
4027DC: 04 FLdRfVar local_008A
4027DF: 6c ILdRf local_0090 ====读入姓名（0090）
4027E2: 4a FnLenStr
4027E3: e4 CI2I4
4027E4: Lead3/63 ForI2: (when done) 402829
4027EA: 27 LitVar_Missing ==============循环
4027ED: 6b FLdI2 local_008A
4027F0: e7 CI4UI1
4027F1: 6c ILdRf local_0090
4027F4: 0b ImpAdCallI2 
4027F9: 23 FStStrNoPop local_00A4
4027FC: 0b ImpAdCallI2 
402801: e7 CI4UI1
402802: 71 FStR4 local_0088
402805: 2f FFree1Str local_00A4
402808: 35 FFree1Var local_00C8
40280B: 6c ILdRf local_0098
40280E: 6c ILdRf local_0088
402811: f5 LitI4: 0x4 4 (....)
402816: b2 MulI4 =====ascii码值乘4
402817: aa AddI4
402818: f5 LitI4: 0x12 18 (....)
40281D: aa AddI4 ======加18
40281E: 71 FStR4 local_0098
402821: 04 FLdRfVar local_008A
402824: 64 NextI2: (continue) 4027EA==========循环（I2）
402829: 6c ILdRf local_0098
40282C: f5 LitI4: 0x817fdb0 135790000 (....)
402831: aa AddI4 ======加135790000
402832: 71 FStR4 local_0098
402835: 6c ILdRf local_0094 =====读入注册码
402838: 0a ImpAdCallFPR4: 
40283D: f4 LitI2_Byte: 0x18 24 (.)
40283F: eb CR8I2
402840: ab AddR8 =======加24
402841: e8 CI4R8
402842: 71 FStR4 local_009C
402845: 6c ILdRf local_0098
402848: 6c ILdRf local_009C
40284B: c7 EqI4 ====相等则真
40284C: 1c BranchF: 402867
40284F: 1b LitStr: http://duba.126.com ====正确注册结果
402852: 21 FLdPrThis
402853: 0f VCallAd 7b3fc348
402856: 19 FStAdFunc local_00A0
402859: 08 FLdPr local_00A0
40285C: 0d VCallHresult 7b3fbdf0
402861: 1a FFree1Ad local_00A0
402864: 1e Branch: 40286c
402867: 10 ThisVCallHresult 0
40286C: 13 ExitProcHresult

Proc: 40272c

402700: 27 LitVar_Missing
402703: 27 LitVar_Missing
402706: 27 LitVar_Missing
402709: f5 LitI4: 0x0 0 (....)
40270E: 3a LitVarStr: ( local_0094 )
402713: 4e FStVarCopyObj local_00A4
402716: 04 FLdRfVar local_00A4
402719: 0a ImpAdCallFPR4: 
40271E: 36 FFreeVar
402729: Lead1/c8 End
40272B: 13 ExitProcHresult

Successfully went through the program!
Now it's up to you to decipher it hehe!

Email josephco_@hotmail.com with any problems or errors


唤醒者 1.2.68

标 题:大客过来看看这个软件：唤醒者 1.2.68如何破? http://www.newhua.com/huanxz.htm (空)
发信人:1212
时 间:2001-3-3 17:24:50
详细信息:

标 题:MSVBVM5.0的一个有趣的现象，兼谈“唤醒者”的。。。。 (1千字)
发信人:1212
时 间:2001-3-7 14:00:15
详细信息:

MSVBVM5.0的一个有趣的现象，兼谈“唤醒者”的。。。。
我们知道用p-code方式编译的程序的确很难破解，因为我们跟踪用这种方式编译的程序时，看不到程序作者写的程序，只能看到vb的程序，我们只能在微软设计好的vb程序里面兜圈子，但是在兜圈子的过程中，作者的程序已经在执行了。
在对“唤醒者”的跟踪过程中，想找到作者的比较注册码的程序，可以说是一无所获，根本看不到程序是如何运行的，但是也不能说是没有收获，发现了另外的一个有趣的现象，并且能把这个程序破解掉。
运行“唤醒者”。
首先用msvbvm50.rtcmsgbox中断，然后运行程序的电子注册，等SoftICE出现后，在唤醒者的4045cc处中断（我叫它中断1）和在msvbvm50的7637d549（中断2）处中断，我们看到在中断2处是一个条件转移。
现在保留中断1，把别的中断BD掉。
运行注册程序，随便输入注册码，点击注册，中断1会起作用，然后把中断2激活，按8次F5后（即经过中断2处8次后），会弹出来注册失败的对话框。
现在把中断2BD掉（不然的话，它会一直跳出来）重复上面的过程，只是在中断2处经过7次，然后下命令“r fl z”，你会发现，弹出来的是注册成功的对话框。爽否？
我推测，这里是vb来解释程序的消息循环里面的消息的过程，不跳走就执行这个消息对于的程序功能，跳走就去解释下面的一个消息。
我们可以做下面的试验来验证一下。
再运行注册程序，在第1次经过中断2时，下命令“r fl z”，你会发现程序运行的是“设置”的对话框；
再运行注册程序，在第2次经过中断2时，下命令“r fl z”，你会发现程序运行的是“音乐顺序”的对话框；
。
。
。
等等。
你还可以用另外的程序来试试是否这样的。
对了，再告诉一句，如果你注册成功后，电子注册那个按钮没有了，变成了“关于”，没办法做上面的试验,你只要把
c:\windows\BoobRou.dll这个文件里面的r＝Boo的Boo换成别的就行了。

标 题:不错，这种情况在VB6中也是一样，对付VB的PAGE-CODE方式编译的程序最有效！ (409字)
发信人:china 2000
时 间:2001-3-8 17:15:03
详细信息:

不错，这种情况在VB6中也是一样，只是地址不同而已。
目前用来对付VB的PAGE-CODE方式编译的程序最有效！
但要注意一个在VB的MSVBVM50.DLL或MSVBVM60.DLL中如何定位的问题。
因为VB动态链接库在内存中是变换地址的。
就象上面这位msvbvm50的（中断2）在7637d549处
而我的msvbvm50的（中断2）在799Ad549处。
后面的四位是不会变的，前面的四位是会变的。
谁有好方法能快速定位？
同样，前几天有人提出的股票之星3.0也可以这样破解。


Batch UnZip1.0.5

 标 题:批量解压缩（Batch UnZip)1.0.5破解纪录(VB6) (1千字)
发信人:8989
时 间:2001-4-27 20:50:43
详细信息:
批量解压缩（Batch UnZip）1.0.5破解纪录(VB6)

共享软件注册中心 最新国产软件 西安“笨蛋软件”实验室
不注册有使用次数限制
作者主页 boob.163.net
软件简介：
本软件是一款批量文件解压缩的实用工具。可结合到Windows资源管理器的右键菜单(就像Winzip一样)，大大简化解压缩操作。
通常我们解压缩一个Zip，最简单的方法就是直接在这个Zip文件上点击鼠标右键，然后选择 Extract To folder 将这个Zip文件解压到目录中。
问题是：当我们下载了几十个甚至是上百个Zip文件后也要一个一个的解压缩。实在是浪费时间！！
批量解压缩（Batch UnZip）就可以帮助您解决这个问题。

VB6程序,吓人家一大跳,而且注册码输入后不立即比对,真的想放弃.
号称笨蛋,其实感觉我最弱智,软件倒有点用,let my try!!
load Batch unzip
input name : guodong
register number :89898989
quit

load Smartcheck
load Batch unzip
start
点"帮助"的"关于"
信息出完全时 暂停Smartcheck
+_Load
-_Click
-_Load
.....
.....
.....
Len returns Long:7 右边看到转换后的姓名v.$?*)= 姓名7个字母
Right 右边看到注册码11846-36634241-61 即上面的ASCII码值
....
....
....
-_Load 注意:从下往上看

如何准确定位: 上面非常多的Len returns Long ,紧跟的都是Mid

整理 用户名 guodong
注册码 11846-3663-4241-61

http://duba.126.com 每日更新,希望各位朋友多多捧场


彩票王

标 题:如何使用smartcheck6.03破解《彩票王》 (1千字)
发信人:CrackerABC[BCG]
时 间:2001-4-17 11:03:05
详细信息:
如何使用smartcheck6.03破解《彩票王》

作者: CrackerABC[BCG]
主页: http://crackerabc.longcity.net

这个软件可以在我的主页的“破解工具”中下载。

http://crackerabc.longcity.net

好多朋友都比较的懒，我明明说明白了用trw2000来得到注册码的方法，但是他们还是来问我说注册码不正确，要指导这是针对一机一码的注册。
我的机器不适合别人的，没办法只好用smartcheck来写过程了。

好了开始吧：

1、首先启动smartcheck，然后打开“彩票王”，等载入完毕后，点smartcheck工具按钮中的开始按钮（小绿色的三角号，和你家的DVD播放按钮一样形状），一直等程序执行完毕，自己按照平时使用这个软件的样子输入注册码，当然是假的了。

我输入的是：
姓名: CrackerABC[BCG]
身份证号码: 370101200101011011
电话号码: 7654321
传真:
E-mail:
所在地区: 山东省
邮政编码:
通信地址:
用户代码:
用户机器码: 6CAI8-9X2R1-3Q17H-AB#&- （机器号是针对机器本身产生的）
注册码：AAAAA-BBBBB-CCCCC-DDDDD

二、点击确定按钮出现“注册错误”的对话框。

三、千万别关闭“彩票王”软件，返回到smartcheck程序，对看到的一系列对话小栏仔细看，这里你把那些小“＋”号打开，会发现里面好多东西，其中有好多的是对你输入的信息的记录和比较，在其进行了一系列的记录比较运算后，你会找到你的注册码的，位置就是在：
- Thread 0 [thread id:4294725351 (0xFFFc4EE7)]
Event reporting started:01-04-17 10:20:03
GetSetting
Date
Yeah
Integer(3)->String("3")
+ _Load
+ _Resize
_Activate
_Activate
_Activate
_Click
+ _Click ---------->把这个展开
_Activate
+ _Resize
_Time

四、展开以后直接到最下面的倒数第二个_Click，展开这个_Click

五、然后在找这个_Click下面的倒数第三的Mid（注册码和个数）和第二个Left（注册码的形式注意别要最后的"-"）,注意看smartcheck窗口的右边，你就看到了你的注册码！！！！注意形式。

我的是：NBAG6-83969-2587R-1BE$O

好了，总算写完了，希望别再让我给你找注册码了。拜托！

<----------完--------->


电脑体育彩票下注王V2.00,

 标 题:发啦电脑体育彩票下注王V2.00,smartChack 破解法 (1千字)
发信人:lancelot
时 间:2001-8-12 13:49:24
详细信息:
用smartCheck载入
填入用户名：lancelot 注册码：12345678
到这里
__vbaVarAdd returns DWORD:7FF4E4<--| lhs(variant)
| |
| --double . dblVal=5678
|
| rhs(variant)
| |
| --signed long .lVal=19760327

这里把注册码的第5位以后的数字和19760327（估计是作者的生日）相加
得到：19766005

__vbaVarMove returns DWORD:5D1ED8
__vbaFreeVar returns DWORD:5D1ED8
__vbaVartstEq returns DWORD:0<-----| lhs(variant)
| |
| --double .dblVal=19766005
|
| rhs(variant)
| |
| --signed long .lVal=907046155

把 19766005 与 907046155 比较，什么意思？
试着用 907046155-19760327=887285828
再将 887285828 填入注册码从第5位开始，前4位任意
bingo!!!

Crack by lancelot 2001.08.12


福利彩票随机号码产生器V3.3

标 题:用SMARTCHECK破解福利彩票随机号码产生器V3.3 (750字)
发信人:风飘雪
时 间:2001-3-2 12:59:47
详细信息:
用SMARTCHECK破解福利彩票随机号码产生器V3.3

福利彩票随机号码产生器V3.3
下载http://www.esoftware.com.cn/oload.php?url=ftp://ftp.eware.com.cn/pub/utility/otheru/numberV3.3.zip

smartcheck 载入number.exe,
start ,注册码填123456789,点注册,出错,退出
+number_load
+showRegister.show
+reg_click
+register.show
+regclick
RegisterCode.Text
Val returns double ***
光条停在**行,右边你可以看到123456789
点View菜单中的Show all events
向下找到两个__vbaVarCmpEq returns
右边你可以看到123456789和1472654522(真注册码)
此软件为一机一码,注册信息保存在
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Stock-Star-Website\Number32\Reg
regcodetrue=1472654522

作者 风飘雪
主页 http://duba.126.com
邮件 gd1@yeah.net


魔装网神2.5

标 题:用NuMega SmartCheck 6.03获取魔装网神2.5的注册码（初学者请进) (1千字)
发信人:1212
时 间:2001-2-24 13:11:33
详细信息:
用NuMega SmartCheck 6.03获取魔装网神2.5的注册码

作者：华仔

魔装网神又是一个VB的产物，未注册版本只能打开八个页面。这东西真有点
讨厌，注册时输入名字和注册码单击确定后一点反映都没有，它是在程序启
动时比对注册码的。曾想用TRW2000在它读取注册表时中断，但它读取的注册
表信息何止一两处，跳来跳去人都乏了（其实是功力不够），于是想到这位大
哥：SmartCheck。由于是初次使用该软件，不妥之处请指正。

○、运行“魔装网神”选注册，输入用户名：ZHENG HUA 注册码：1974923 再确
定，让它将我们的注册信息写入注册表。

一、配置好 SmartCheck

二、启动SmartCheck并载入运行NetMyth.exe

三、一阵“暴风骤雨”过后一切又恢复了平静，魔装网神已进入了主界面，然后
在SmartCheck的工具栏单击END图标以结束它的使命。现在我们可以坐下来
“轻松轻松”了。

四、先来一段推理：一般情况下软件作者在设计软件时当读取完注册表中用户输入的注册信息

后可能要立即进行一下运算或校验，除非这个程序员是一个不怕麻繁的程序员，将这段代码放

在其它别的位置，人都有惰性，程序员也不例外。所以我们就来看一下它是在什么地方读取注

册信息的（找我们的关键字：ZHENG HUA和1974923），如果你只想获得软件注册码，你可以按

“CTRL+F”输入HEX 确定即可。

五、看一下SmartCheck左边的窗口有一个“+ _Load”字样，它实际上是程序启动的过程，好

我们就点击它。出来很多内容，但我们更要注意在它里面还有一个“+ _Load”字样，再点一

下，最后我们在“UCase”下找到“1974923”和“ZHENG HUA”字样，再下一点是“HEX”，这

才是我们的关键所在。“HEX”在SmartCheck右边窗口中的内容如下：

- string (variant)
- signed lpng * .plVal = 006CF1B4
Long = 42672637 0x028B21FD 这就是我们要的注册码

在“HEX”下面有两个连续的“UCase”，经分析程序居然将你输入的用户名：“ZHENG HUA”

和“LiuJianYing”作比较，那么这个“LiuJianYing”应该是黑名单了吧，真是“人心不古，
世风日下”。


decompiler vb 5.0

标 题:about decompiler vb 5.0 译得不好请原谅。 (1千字)
发信人:^0-0^
时 间:2001-4-19 3:05:43
详细信息:
你正打算践踏版权吗？ Go look at ANY other VBP file and just monkey see, monkey do it.
1) 大多数VBP 文件信息在EXE文件镜像内列有清楚的文本。 先从这个VBP文件结构开始处查找F4 01，以找到源工程文件。 而要寻找VB5结构的开始，就要寻找“VB5！”。 那里你将发现4个其它的域( 在&H58是Exe文件名，在&5B处是标题，在&H60处是帮助文件名字，在&H64处是名字； 这些是VB5 结构的开始处的有关的重要数据的偏移地址)
2) FRM & .BAS 文件名在EXE文件镜像内也清楚地列有的文本。 (按图索骥查找OLB，文件名是一条捷径。 )
3) 如果你的EXE文件引用了OCX驱动文件，查找文字“OCX”！从那里你将找到OCX文件的名字。 如果你顺便查看一下OCX文件的结构，你将发现GUID（或者查看REGISTRY，或者从其它使用OCX的VBP工程文件中查看) 。
4) 开始处是"SUB MAIN"函数或主表单的名字。紧跟着跳转表的后面，你可以很容易地从发现那个信息。
5) VB 环境/编译程序将给你填入很多其它的PIECE。 你是一个美洲狮吗 ( 是！ 我能够重新计算出它，我将重新构造那个VBP文件！ ) ，还是只不过是一只忠于原著的小猫猫？ ( 不 ...它对我太错综复杂 ...请帮助我 ...请寄给我( 和30 其它不完全的反编译的片段 ...) 喵呜 ...LOL。 golem


搬运工

标 题:关于聪明的搬运工 (1千字)
发信人:1212
时 间:2001-1-14 17:17:55
详细信息:
 boxman用blowfish兄介绍的dodi的vb discompiler反编译出来的代码就直接
可以作为注册码生成程序，很简单。不过此软件的注册还是需要从作者那里得到
一个文件---boxman.box应该是地图文件，非常重要了，要不然即便注册成功，
也没有用。下面就是注册程序。

Function fn0428 (ByVal p0052 As String, ByVal p0054 As String, p0056

As String, p0058 As Single) As String
Dim l005C As Integer
Dim l005E As Integer
Dim l0060 As Integer
Dim l0062 As String
Dim l0064 As Integer
Dim l0066 As Variant
Dim l006A As Variant
l005E = Len(p0054)
If  p0052 = "E" Then
Randomize
l0064 = (p0058 * 10000 Mod 255) + 1
l0062 = Hex$(l0064)
If  Len(l0062) = 1 Then
l0062 = "0" + l0062
End If
For l006A = 1 To Len(p0056)
l0060 = (Asc(Mid$(p0056, l006A, 1)) + l0064) Mod
    255
If  l005C < l005E Then l005C = l005C +
    1 Else l005C = 1
l0060 = l0060 Xor Asc(Mid$(p0054, l005C, 1))
l0062 = l0062 + Format$(Hex$(l0060), "@@")
l0064 = l0060
Next
ElseIf p0052 = "D" Then
l0064 = Val("&H" + Left$(p0056, 2))
For l006A = 3 To Len(p0056) Step 2
l0060 = Val("&H" + Trim(Mid$(p0056, l006A,
    2)))
If  l005C < l005E Then l005C = l005C +
    1 Else l005C = 1
l0066 = l0060 Xor Asc(Mid$(p0054, l005C, 1))
If  l0066 <= l0064 Then
l0066 = 255 + l0066 - l0064
Else
l0066 = l0066 - l0064
End If
l0062 = l0062 + Chr(l0066)
l0064 = l0060
Next
End If
fn0428 = l0062
End Function

现在破解真实越来越自动化了！
arbiter

标 题:我反编译的代码段 (2千字)
发信人:chn-boy
时 间:2001-1-16 10:39:24
详细信息:

Sub btn_Register_Click ()
Dim l001C As Integer
Dim l001E As Single
Dim l0020 As Integer
Dim l0022 As String
Dim l0024 As String
' Const mc003C = 1 ' &H1%
' Const mc003E = 2 ' &H2%
' Const mc0046 = 13 ' &HD%
' Const mc0048 = 19 ' &H13%
If Trim$(txt_Name.Text) = "" Or Len(Trim$(txt_Name.Text)) < 3 Then
MsgBox "请输入用户名, 至少三字母!", 48, "聪明搬运工"
Exit Sub
End If
If Trim$(txt_Code.Text) = "" Then
MsgBox "请输入注册码!", 48, "聪明搬运工"
Exit Sub
End If
l001E = (Val(Mid$(Trim$(ssp_Id.Caption), 5, 3)) + Val(Right$(Trim$(ssp_Id.Caption), 3))) / 2000
l0024$ = ""
For l0020% = 1 To Len(Trim$(txt_Code.Text))
l0022$ = Mid$(Trim$(txt_Code.Text), l0020%, 1)
If l0022$ = "-" Then l0022$ = " "
l0024$ = l0024$ + l0022$
Next l0020%
If fn0428$("E", Trim$(ssp_Id.Caption), Trim$(txt_Name.Text), l001E) = l0024$ And fn0428$("D", Trim$(ssp_Id.Caption), l0024$, l001E) = Trim$(txt_Name.Text) Then
If Dir$("boxman.box") = "" Then
If frm_Main.mnu_Sound.Checked Then
l001C% = extfn009B%("BOXUNDO.WAV", mc003C + mc003E)
End If
MsgBox "请向作者注册!", 48, "聪明搬运工"
End
End If
If frm_Main.mnu_Sound.Checked Then
l001C% = extfn009B%("BOXWIN.WAV", mc003C + mc003E)
End If
gv0008% = 7
frm_Main.mnu_Scenery(5).Enabled = True
frm_Main.mnu_Scenery(6).Enabled = True
frm_Main.mnu_Scenery(7).Enabled = True
frm_Main.mnu_Scenery(8).Enabled = True
gv00BC% = True
MsgBox "注册成功!", 48, "聪明搬运工"
frm_Main.Caption = "聪明搬运工（注册为" + " " + Trim$(txt_Name.Text) + " " + "）"
Close
Open "boxman.box" For Random As #1 Len = 1
gv00BE% = LOF(1) \ (mc0046 + 1) \ (mc0048 + 1)
gv00C0$ = "Level"
Else
If frm_Main.mnu_Sound.Checked Then
l001C% = extfn009B%("BOXUNDO.WAV", mc003C + mc003E)
End If
gv00BC% = False
gv00CC% = gv00CC% + 1
If gv00CC% < 5 Then
MsgBox "注册不成功!", 48, "聪明搬运工"
Exit Sub
Else
MsgBox "五次注册不成功!", 48, "聪明搬运工"
End
End If
End If
Unload Me
End Sub

标 题:这是注册码要满足的条件： (179字)
发信人:1212
时 间:2001-1-16 12:27:55
详细信息:

这是注册码要满足的条件：

fn0428$("E", Trim$(ssp_Id.Caption), Trim$(txt_Name.Text), l001E) = l0024$ And fn0428$("D", Trim$(ssp_Id.Caption), l0024$, l001E) = Trim$(txt_Name.Text)

标 题:根据1212和chn-boy的帖子，我做出了算号器，代码见内： (662字)
发信人:小　明
时 间:2001-1-18 7:04:45
详细信息:

 我有1.0的boxman.box，但每次运行仍要注册。是不是还有什么条件？望1212和chn-boy兄将反编译的方法告知我等菜鸟，或将弹出注册的这一段代码公布出来，以便大家能彻底破解之，谢谢！

Private Sub Command1_Click()
Dim zz As Single
zz = (Val(Mid(Trim(Text1.Text), 5, 3)) + Val(Right(Trim(Text1.Text),
    3))) / 2000
a = (zz * 10000 Mod 255) + 1
b = Hex(a)
c = Len(Text1.Text)
d = 0
If Len(b) = 1 Then b = "0" + b
For i = 1 To Len(Text2.Text)
e = (Asc(Mid(Text2.Text, i, 1)) + a) Mod 255
If d < c Then d = d + 1 Else d = 1
e = e Xor Asc(Mid(Text1.Text, d, 1))
b = b + Format(Hex(e), "@@")
a = e
Next
Text3.Text = b
End Sub

标 题:每次运行都要输注册码，我一个朋友买了这个小游戏，作者这样说的。 (空)
发信人:1212
时 间:2001-1-18 11:37:49
详细信息:

标 题:我还是忍不住说两句吧！ (508字)
发信人:1212
时 间:2001-1-18 11:58:41
详细信息:

这个游戏其实是Linux自代的一个小游戏的翻版
如果你非常喜欢这个游戏的话装一个Blue Point Linux
或Xteam Linux ,Read Hat的不知道有没有带
全世界的人都可以为他设计关卡，当然关卡是完全免费的
而且关卡可以不断下载的。
而且我认为它的关卡绝对是万里挑一的，设计的很科学

同时我也觉得我们中国的个人软件缺乏开放性，似乎从写软件
一开始就一心想着赚钱，这种心态下很难写一个好软件的，
就拿我们讨论的这个软件来讲吧，

游戏的创意是别人的
关卡的设计也是别人的
作者用VB盗版了一个就想方设法去要钱，
也不照照镜子看看自己


桥牌程序

标 题:桥牌程序Suit.exe的破解 (3千字)
发信人:blowfish
时 间:2001-1-13 20:20:34
详细信息:
2.DaBriSoft 软件公司出品的系列桥牌教学软件
① 花色定约的坐庄打法 1.1
http://www.dabrisoft.dk/download-uk/Suit.exe[1150K]
以上三个软件均由VB3编制,是为提高坐庄水平而设计的,包括不同难度级别的165副牌,未注册时可玩15副。
--------------------------------------------------------------

用Dodi的VB3 decompiler将suit.exe反汇编之后，在REG.BAS看到如下的注册码判断。显然，suit.exe通过文件c:\input.dat和c:\windows\system\dptkey.exe和c:\windows\system\dptwkey.exe进行通信，由这两个exe根据生成与机器相关的序列号存放在文件c:\output.dat中，并对注册码进行判断，如果注册码正确它们就会建一个名为c:\success的目录，否则就建一个c:\wrong目录。而suit.exe只用这两个目录作为注册码正确与否的依据。

Open gv1D10 + ":\input.data" For Output As l001E
Print #l001E, Reg.adgang
Close #l001E
l0022% = 282
l0022% = Shell(gv1D14 + "dptreg.exe /" + gv1D14 + "dptwkey.EXE", 1)
While extfn00DB(l0022%) > 0
l0024% = DoEvents()
Wend
If Dir(gv1D10 + ":\wrong") <> "" Then
MsgBox "The access code you have typed is wrong - try again.", 48, "Information"
GoTo L3C528
End If
If Dir(gv1D10 + ":\success") = "" Then
MsgBox "An unknown error has occured - try again. Your harddisk may be in a bad condition.", 48, "Information"
GoTo L3C528
End If
If Dir(gv1D10 + ":\success") <> "" Then
MsgBox "The access code has been accepted and the program is being exited. When you start the program again, it will be updated to the full version.", 48, "Information"
sub071A
Unload Reg
Unload Spil
End
End If

以上只是输入注册码之后的判断，因为将dptreg.exe修改一下让它始终只建立c:\success目录，则虽能通过输入注册码后的检查，但下次suit.exe启动时还是demo版本。可见启动时的判断不同。

查找启动时显示的“Demo Vesion”字符串，发现是在Pral.FRM中，相应地在Pral.bas中有如下的程序段：

Sub Form_Load ()
sub070E
If gv1CE0 = 1 Then Spil.mnureg.Enabled = False
gv1CF0 = 3
If gv1CE0 = 1 Then gv1CF0 = 33
If gv1CE0 = 1 Then
Pral.Label2.Visible = False
Pral.Label7.Visible = False
Pral.Label8.Visible = False
End If
..........
End Sub

很显然gv1CE0是个全局标志（gv＝Global Variable），表示注册与否。若gv1CE0为1，则Help菜单不显示Registration and Purchase，启动时不显示“Demo version”，且每个级别有33个牌局可玩。

查找gv1CE0，看它是在哪里被赋值的。在MODULE1.BAS中看到，它启动时是调用“dptwkey.exe /3”来判断是否已经注册，生成文件c:\XMQRPT.DAT，如果已注册的话则该文件的第一行的前两个字符是“00”。

Sub sub070E ()
Dim l0BF4 As Integer
Dim l0BF6 As Integer
Dim l0BF8 As Variant
gv1CE0 = 0
l0BF8 = FreeFile
gv1D10 = String$(145, Chr$(0))
gv1D10 = Left$(gv1D10, extfn00AE(gv1D10, Len(gv1D10)))
gv1D10 = Left$(gv1D10, 1)
gv1D14 = String$(145, Chr$(0))
gv1D14 = Left$(gv1D14, extfn00C5(gv1D14, Len(gv1D14)))
If Right$(gv1D14, 1) <> "\" Then gv1D14 = gv1D14 + "\"
sub071A
l0BF4% = 282
l0BF4% = Shell(gv1D14 + "dptwkey.EXE /3", 1)
While extfn00DB(l0BF4%) > 0
l0BF6% = DoEvents()
Wend
Open gv1D10 + ":\XMQRPT.DAT" For Input As l0BF8
Line Input #l0BF8, gv19D4$
If (Left$(gv19D4$, 2) = "07") Then
MsgBox "The program is installed on another computer. A registered program cannot be copied.", 48, "Information"
Unload Spil
End
End If
If (Left$(gv19D4$, 2) = "00") Then gv1CE0 = 1
Close l0BF8
sub071A
End Sub

经过上面的分析，最终得到破解方法如下：
1、将suit.exe中的“XMQRPT.DAT”改成“123456.dat”。该文件中共有4个“XMQRPT.DAT”，只改第一处即可。
3、建立一个文本文件c:\123456.dat，只要其第一行的前两个字符为“00”即可。

dptreg.exe和dptwkey.exe是两个小文件，且不是VB3的。有兴趣的可研究一下这两个东西写个注册机（bpint 21 if ah=xx）。
其它两个Vb3的估计与此类似。

blowfish 2001/01/13


Vopt99 v4.31

标 题:Vopt99 v4.31暴力破解实录(仅供初学者参考) (5千字)
发信人:mjing
时 间:2001-2-19 9:25:59
详细信息:
Vopt99 v4.31暴力破解实录(仅供初学者参考)

所需工具：Softice或trw2000,DASM黄金版，UltraEdit

VOPT99是一个非常好的磁盘整理软件，我一用就喜欢上它了。
可是，它有30天限制，要注册，本人没有$$$，只好对不住它了。

Vopt99是用VB5写的(我向来看见VB的东东就头晕)，尝试找出
注册码，但是，它的注册码保护得很好，我功力又尚浅(成为大侠是
没有什么希望了:<),好了，言归正传。先用DASM将它反编译，以什么为
突破口呢？主界面上不是有这么一句话：“30 day trial:”，一找，
嘿，还真找到了：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004318B7(C)
|
:004318D6 C78560FFFFFF00000000 mov dword ptr [ebp+FFFFFF60], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004318D4(U)
|
:004318E0 8B55B4 mov edx, dword ptr [ebp-4C]
:004318E3 895580 mov dword ptr [ebp-80], edx

* Possible StringData Ref from Code Obj ->"330 day trial: "
|
:004318E6 68DCF94000 push 0040F9DC
:004318EB 668B45CC mov ax, word ptr [ebp-34]
:004318EF 50 push eax

* Reference To: MSVBVM50.__vbaStrI2, Ord:0000h
|
:004318F0 FF159CD24500 Call dword ptr [0045D29C]
:004318F6 8BD0 mov edx, eax
:004318F8 8D4DC4 lea ecx, dword ptr [ebp-3C]

* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:004318FB FF15C4D44500 Call dword ptr [0045D4C4]
:00431901 50 push eax

* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00431902 FF1504D34500 Call dword ptr [0045D304]
:00431908 8BD0 mov edx, eax
:0043190A 8D4DC0 lea ecx, dword ptr [ebp-40]

分析一下，如果试用期未过期的话，004318E3处的代码是应该被执行到的，
如果过期了则此部分代码不会被执行。因此向上查看跳转代码：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043181E(C)
|
:0043183D C78564FFFFFF00000000 mov dword ptr [ebp+FFFFFF64], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043183B(U)
|
:00431847 8D4DB8 lea ecx, dword ptr [ebp-48]

* Reference To: MSVBVM50.__vbaFreeObj, Ord:0000h
|
:0043184A FF15F4D44500 Call dword ptr [0045D4F4]
:00431850 C745FC25000000 mov [ebp-04], 00000025
:00431857 66837DCC00 cmp word ptr [ebp-34], 0000
:0043185C 7E07 jle 00431865 ;此处只要不跳就可以继续试用了
:0043185E 66837DCC2D cmp word ptr [ebp-34], 002D
:00431863 7E15 jle 0043187A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043185C(C)
|
:00431865 C745FC26000000 mov [ebp-04], 00000026
:0043186C 66C70576904500FFFF mov word ptr [00459076], FFFF
:00431875 E920010000 jmp 0043199A ;此处跳到了显示主界面和要求输入注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431863(C)
|
:0043187A C745FC28000000 mov [ebp-04], 00000028
:00431881 8B4D08 mov ecx, dword ptr [ebp+08]
:00431884 8B11 mov edx, dword ptr [ecx]
:00431886 8B4508 mov eax, dword ptr [ebp+08]
:00431889 50 push eax
:0043188A FF9218030000 call dword ptr [edx+00000318]
:00431890 50 push eax
:00431891 8D4DB8 lea ecx, dword ptr [ebp-48]
:00431894 51 push ecx

* Reference To: MSVBVM50.__vbaObjSet, Ord:0000h
|
:00431895 FF1538D34500 Call dword ptr [0045D338]
:0043189B 894588 mov dword ptr [ebp-78], eax
:0043189E 8D55B4 lea edx, dword ptr [ebp-4C]
:004318A1 52 push edx
:004318A2 6A01 push 00000001
:004318A4 8B4588 mov eax, dword ptr [ebp-78]
:004318A7 8B08 mov ecx, dword ptr [eax]
:004318A9 8B5588 mov edx, dword ptr [ebp-78]
:004318AC 52 push edx
:004318AD FF5140 call [ecx+40]
:004318B0 894584 mov dword ptr [ebp-7C], eax
:004318B3 837D8400 cmp dword ptr [ebp-7C], 00000000
:004318B7 7D1D jge 004318D6
:004318B9 6A40 push 00000040
:004318BB 68BC154100 push 004115BC
:004318C0 8B4588 mov eax, dword ptr [ebp-78]
:004318C3 50 push eax
:004318C4 8B4D84 mov ecx, dword ptr [ebp-7C]
:004318C7 51 push ecx

* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:004318C8 FF1518D34500 Call dword ptr [0045D318]
:004318CE 898560FFFFFF mov dword ptr [ebp+FFFFFF60], eax
:004318D4 EB0A jmp 004318E0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004318B7(C)
|
:004318D6 C78560FFFFFF00000000 mov dword ptr [ebp+FFFFFF60], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004318D4(U)
|
:004318E0 8B55B4 mov edx, dword ptr [ebp-4C]
:004318E3 895580 mov dword ptr [ebp-80], edx

* Possible StringData Ref from Code Obj ->"330 day trial: "
|
:004318E6 68DCF94000 push 0040F9DC
:004318EB 668B45CC mov ax, word ptr [ebp-34]
:004318EF 50 push eax

如果你对这些跳转判断不出的话，可以在跳转上设断，逐一试试，就可以了，
我也是试出来的。

总结一下：
用十六进制编辑器打开vopt99.exe，
找66 83 7D CC 00 7E 07
^^ ^^
90 90

这样就完成了。运行后，主界面上显示您的试用期还-XX天，没关系啦，
试用一下功能，一切正常。

2001.2.19 by mjing,E-mail:mjing@wx88.net


VOPTME6.01

 标 题:VOPTME6.01破解第一次写教程，有不对的地方请指出，谢谢！ (3千字)
发信人:jfxie
时 间:2001-5-24 0:16:23
详细信息:
第一次写教程，有不对的地方请指出，谢谢！

软件名称：VoptMe 6.01
软件大小：
简 介：整理硬盘碎片工具（30天试用）
使用平台：Win95/98/ME
下载网址：http://www8.pconline.com.cn/download/download.phtml?id=44272

作 者：JFXIE
级 别：初学者
E-mail: JFXIE@CHINA.COM
破解工具：WASM8.93 UEDIT8。1A

这个软件非常不错的硬盘整理碎片软件，但只能使用30天。

这个软件的注册码我是没有戏把它找出来了。只能用暴力法了。
没有加壳，可直接反汇编。

在串式参考中找到可疑的字符串，“**30days trial"

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00421036(C), :004210B2(C)
|
:004210CD A108754700 mov eax, dword ptr [00477508]
:004210D2 3BC6 cmp eax, esi〈———————时间比较
:004210D4 7E57 jle 0042112D————————不等则GAME OVER
:004210D6 83F81E cmp eax, 0000001E 《————这是30天的TRIAL时间
:004210D9 7F52 jg 0042112D〈———————大于30天就OVER

* Possible StringData Ref from Code Obj ->"** 30day trial, "
|
:00426E7D 68786D4100 push 00416D78
:00426E82 50 push eax

* Reference To: MSVBVM50.__vbaStrI4, Ord:0000h
|
:00426E83 FF15C0A24700 Call dword ptr [0047A2C0]

* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:00426E89 8B35ECA44700 mov esi, dword ptr [0047A4EC]
:00426E8F 8BD0 mov edx, eax
:00426E91 8D4DE4 lea ecx, dword ptr [ebp-1C]
:00426E94 FFD6 call esi

* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00426E96 8B3D1CA34700 mov edi, dword ptr [0047A31C]
:00426E9C 50 push eax
:00426E9D FFD7 call edi
:00426E9F 8BD0 mov edx, eax
:00426EA1 8D4DE0 lea ecx, dword ptr [ebp-20]
:00426EA4 FFD6 call esi
:00426EA6 50 push eax
:00426E96 8B3D1CA34700 mov edi, dword ptr [0047A31C]
:00426E9C 50 push eax
:00426E9D FFD7 call edi
:00426E9F 8BD0 mov edx, eax
:00426EA1 8D4DE0 lea ecx, dword ptr [ebp-20]
:00426EA4 FFD6 call esi
:00426EA6 50 push eax

* Possible StringData Ref from Code Obj ->" days left"
|
:00426EA7 689C6D4100 push 00416D9C
:00426EAC FFD7 call edi
:00426EAE 8B4D08 mov ecx, dword ptr [ebp+08]
:00426EB1 8BD0 mov edx, eax
:00426EB3 FFD6 call esi
:00426EB5 8D4DE0 lea ecx, dword ptr [ebp-20]
:00426EB8 8D55E4 lea edx, dword ptr [ebp-1C]
:00426EBB 51 push ecx
:00426EBC 52 push edx

用UEDIT将其打开，将两处比较跳跃的JLE——7E57和JG--7F52
分为改为NOP，NOP----9090

大功告成！！


检查时间

标 题:看一段VB6程序检查时间的典型代码 (2千字)
发信人:Lamer
时 间:2000-12-28 16:45:34
详细信息:
* Reference To: MSVBVM60.rtcGetPresentDate, Ord:0222h
|
:1100C0F9 FF1584120011 Call dword ptr [11001284]
:1100C0FF 8D435C lea eax, dword ptr [ebx+5C]
:1100C102 6A01 push 00000001
:1100C104 898574FFFFFF mov dword ptr [ebp+FFFFFF74], eax
:1100C10A 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C]
:1100C110 6A01 push 00000001
:1100C112 8D4D9C lea ecx, dword ptr [ebp-64]
:1100C115 50 push eax
:1100C116 51 push ecx
:1100C117 8D558C lea edx, dword ptr [ebp-74]
:1100C11A 6880480011 push 11004880
:1100C11F 52 push edx
:1100C120 C7856CFFFFFF07400000 mov dword ptr [ebp+FFFFFF6C], 00004007

* Reference To: MSVBVM60.rtcDateDiff, Ord:0296h
|
:1100C12A FF156C100011 Call dword ptr [1100106C]
:1100C130 8D458C lea eax, dword ptr [ebp-74]
:1100C133 50 push eax

* Reference To: MSVBVM60.__vbaI2Var, Ord:0000h
|
:1100C134 FF15B0110011 Call dword ptr [110011B0]
:1100C13A 8D4D8C lea ecx, dword ptr [ebp-74]
:1100C13D 8D559C lea edx, dword ptr [ebp-64]
:1100C140 51 push ecx
:1100C141 52 push edx
:1100C142 6A02 push 00000002
:1100C144 8945D4 mov dword ptr [ebp-2C], eax

* Reference To: MSVBVM60.__vbaFreeVarList, Ord:0000h
|
:1100C147 FF1534100011 Call dword ptr [11001034]
:1100C14D 8B45D4 mov eax, dword ptr [ebp-2C]
:1100C150 83C40C add esp, 0000000C

* Possible StringData Ref from Code Obj ->"YYour Temporary Software License "
->"Key has only "
|
:1100C153 6830530011 push 11005330
:1100C158 50 push eax

* Reference To: MSVBVM60.__vbaStrI2, Ord:0000h
|
:1100C159 FF1508100011 Call dword ptr [11001008]
:1100C15F 8BD0 mov edx, eax
:1100C161 8D4DC0 lea ecx, dword ptr [ebp-40]
:1100C164 FFD6 call esi
:1100C166 50 push eax
:1100C167 FFD7 call edi
:1100C169 8BD0 mov edx, eax
:1100C16B 8D4DBC lea ecx, dword ptr [ebp-44]
:1100C16E FFD6 call esi
:1100C170 50 push eax

* Possible StringData Ref from Code Obj ->" days left."
|
:1100C171 6890530011 push 11005390
:1100C176 FFD7 call edi


Fast PC Linker-III

 标 题:修改指针法破解VB程序-Fast PC Linker-III (8千字)
发信人:囚童
时 间:2001-6-29 21:31:35
详细信息:
修改指针法破解VB程序
Fast PC Linker-III

作者:　囚童
课题:　解除Fast PC Linker-III传送量限制,清NAG
背景:　VB3.0编程
下载:
工具: TRW2000
      Ultra Edit 32
      FC

Fast PC Linker-III支持基于不同平台(Windows 3.1, 95, 98 和 NT4 WorkStation)的两台PC
之间通过串并口进行高速文件传送.支持全目录和全盘复制.支持长文件名.也支持网络设备及
光驱.Fast PC Linker-III具有自动搜索和优化配置I/O口的功能,又十分小巧,一张软盘就可以
带走.对于那些没有光驱的老式机器和笔记本机,想安装运行大一点的程序有了它可就方便多了.
特别在它之前,由于NT不支持直接电缆连接,从办公室向家里传送MP3之类的大文件,要是其中一
台机不能上网,那可就惨了.有了Fast PC Linker-III,找一台笔记本机,在打印电缆上装一个转
换接头(有关转换接头另文介绍),两下搞定.

Fast PC Linker-III试用版采用传送量限制,试用完规定的传送量(大约25x300MB),程序就停止
工作.倘若正在传送一个大硬盘,刚传了一半就死翘翘,确实让人恼火.

由于必须支持Windows 3.1,Fast PC Linker-III选择VB3.0编程.大家知道,VB程序的特点是既难
跟又难改,这就给破解带来相当的难度.

下面给出用修改指针法破解VB程序的例子,供参考.

将C:\WINDOWS\WIN.INI以1.INI为名做一个备份.
安装Fast PC Linker-III,将安装后的WIN.INI以2.INI为名再做一个备份.
在C:\WINDOWS\COMMAND目录下找到fc.exe,在DOS提示符下键入:

fc 1.ini 2.ini > comp.txt

fc将对安装前后的两个ini文件进行比较,并把比较结果存入comp.txt中.
打开comp.txt,可以看到:

Comparing files 1.INI and 2.ini
****** 1.INI

****** 2.ini

[Disk Safety Info]　　　┐
Protection FL3= 25　　　 >　FastPCL安装后向WIN.INI中加入的两行
                        ┘
******

新加入的两行即试用版赋予用户的初始传送量,其最大值为25节,每节大约300MB.当这一数值用
尽时,即使重新安装,也不能恢复.

启动TRW2000,点OK,TRW2000在屏幕右下角生成一个小图标.右击这个图标,选TRmewTCB.

双击Fast PC Linker-III图标,TRW截获这一新线程.

WIN.INI是WINDOWS启动时调入内存常驻的.
下指令: S 30:0 LFFFFFFFF 3D 32 35 ;=25
TRW给出:　　9B0B6

下指令: BPM 30:9B0B6+1 R
按F5,程序被TRW截获.
下指令: BD*　　;清中断.

按F5数次,程序来到:

014F:5A96　CLD
014F:5A97　PUSH　DS
014F:5A98　PUSH　ES
014F:5A99　POP　 DS
014F:5A9A　MOV　 SI,DI
014F:5A9C　LES　 DI,[BP+06]
014F:5A9F　MOV　 AX,CX
014F:5AA1　REP MOVSB　　　　　　;光标停在这里
014F:5AA3　MOV　 BYTE [ES:DI],00
014F:5AA7　POP　 DS

下指令: D DS:SI-1
TRW给出:
00CF:25D7 32 35 0D 0A 0D 0A 0D 0A-0D 0A 00 00 00 00 00 00 25..............

此时若连续下指令: BPM ES:DI-1,通过88C0、96E5可以跟踪这个"25"一直来到:

1B2F:0B43　LODSB
1B2F:0B44　CMP　BYTE [0FB9],00　;光标停在这里
1B2F:0B49　JZ　 0B5B
1B2F:0B4B　CMP　AL,20
1B2F:0B4D　JZ　 0B3D
1B2F:0B4F　CMP　AL,09
1B2F:0B51　JZ　 0B3D

下指令: D DS:SI-1
TRW给出:
0F1F:779A 32 35 00 FF 9C 00 C0 77-A8 91 47 35 04 00 2A 00 25.�?纖☉G5..*.

如果有耐心继续跟踪,将会发现程序将ASCII码"25"转换为16进制码H19后,又将16进制码转换为
80Bit的浮点数,自76A2送入浮点系统进行繁杂的浮点运算,然后来到:

372F:0F67　SUB　　SP,BYTE +02
372F:0F6A　MOV　　BX,SP
372F:0F6C　NOP
372F:0F6D　FISTP　WORD [SS:BX] ;关键!
372F:0F70　INT　　3D
372F:0F72　LODSW
372F:0F74　JMP　　AX

利用F6D处的指令FISTP,将预放在浮点堆栈内的80Bit运算结果,恢复成16进制码H19压入当前堆
栈内.接着通过F74处的跳转指令,来到:

3DC7:2D55　LODSW
3DC7:2D57　XCHG　AX,BX
3DC7:2D58　MOV　 BX,[BX]
3DC7:2D5A　MOV　 DS,[SS:1CFA]
3DC7:2D5F　POP　 WORD [BX] ;关键!
3DC7:2D61　MOV　 DS,[SS:1CF2]
3DC7:2D66　LODSW
3DC7:2D68　JMP　 AX

利用2D5F处的弹出指令,将16进制码H19从栈顶弹出到变量寄存器中.

下指令: ? BX
TRW给出:
DEC = 32106
HEX = 7D6A

试着用E命令修改DS:7D6A.
置入0,程序在后面的运行中将弹出程序失效的提示窗口;置入H63(D99),试用版传输量将大大提
升.

但是,上面提到的全部数据传输和处理过程都是在vbrun300.dll中完成的,无法将f6d处改写为例
如MOV [SS:BX],H63 这样的指令.

分析上面给出的F67和2D55两节指令,可以看出VB代码结构的明显特征:指针ES:SI指向一个混合
装有指令入口和数据的指针列表,节首的装载指令通过指针列表下载数据;节尾的装载指令通过
指针列表下载新的指令入口.这样就将事先按死顺序编好在VB运行库里的指令代码和用户数据通
过指针列表盘活了.

把上面的过程整理一下,如下表:

节序　　　　①　　　　②　　　　③　　　　　　 ④
指令指针　　6080　　　6084　　　6086　　　　　 6088
指令入口　　3234　　　76A2　　　F67　　　　　　2D55
数据指针　　6082　　　-　　　　 -　　　　　　　-
数据内容　　0380　　　-　　　　 -　　　　　　　-
功能　　　　传送数据　浮点处理 浮点栈>当前栈　当前栈>变量寄存器

如果能舍去浮点处理,将数据如H63(D99)在节①处直接压入当前堆栈内,在节④处从栈顶弹出到
变量寄存器中,试用版传输量将提高到可以认为是没有限制了.

在当前指令代码段中找了一下,有下面3节大约可用:

⑴
1C2F:2A86　LODSW
1C2F:2A88　XCHG　AX,BX
1C2F:2A89　MOV　 BX,[BX]
1C2F:2A8B　MOV　 DS,[SS:1CFA]
1C2F:2A90　PUSH　WORD [BX]
1C2F:2A92　MOV　 DS,[SS:1CF2]
1C2F:2A97　LODSW
1C2F:2A99　JMP　 AX

⑵
1C2F:2B50　LODSW
1C2F:2B52　XCHG　AX,BX
1C2F:2B53　PUSH　WORD [BX]
1C2F:2B55　LODSW
1C2F:2B57　JMP　 AX

⑶
1C2F:3834　LODSW
1C2F:3836　PUSH　AX
1C2F:3837　LODSW
1C2F:3839　JMP　 AX

试选⑶,做一个新的指针方案:

节序　　　①　　　　　 ②　　　③　　　④
指令指针　6080　　　　 6084　　6086　　6088
指令入口　3834　　　　 3837　　3837　　2D55
数据指针　6082　　　　 -　　　 -　　　 -
数据内容　0063　　　　 -　　　 -　　　 -
功能　　　数据>当前栈　空运转　空运转　当前栈>变量寄存器

选定TRW的TRnewTCB,重新激活FastPCL,TRW截获它.

下指令: BPM 30:9B0B7 R
按F5,程序被TRW截获.
下指令: BD*　　;清中断.
按F12三次,F10六次,来到:

342F:650E　PUSH　AX　　;光标停在这里
342F:650F　CMP　 CL,FF
342F:6512　JZ　　6515
342F:6514　PUSH　CX
342F:6515　OR　　SI,SI
342F:6517　JZ　　651D
342F:6519　LODSW
342F:651B　JMP　 AX

可以看到TRW反汇编窗口下面的横线中央标有VBRUN300(xx)+xxx,指出当前模块名是vbrun300,
括号中是子模块序号,加号后是在模块中的偏移量.
这就是VB3的指针控制域.所谓VB难追,也是指在这个域里.

下指令: E ES:6080 34 38 63 00 37 38 37 38
按F5.
修改成功.FastPCL右上角的试用版窗口显示剩余传输量为99节.左上角是定购信息窗.

这么大的传输量对于一般用户来讲可以说已经没有什么限制了,故可以进一步尝试将试用版窗
口和定购信息窗去掉.

选定TRW的TRnewTCB,重新激活FastPCL,TRW截获它.

下指令: BPX ACCESSRESOURCE
按F5十七次,按F12两次,F10一直来到:

3FEF:010D　CALL　063C
3FEF:0112　MOV　 SI,AX ;光标停在这里
3FEF:0114　OR　　SI,AX
3FEF:0116　JZ　　0120
3FEF:0118　MOV　 AX,SI
3FEF:011A　POP　 SI
3FEF:011B　POP　 DI
3FEF:011C　LEAVE
3FEF:011D　RET　 0A
3FEF:0120　LEA　 AX,[BP-04]
3FEF:0123　PUSH　SS
3FEF:0124　PUSH　AX
3FEF:0125　MOV　 ES,[1F3A]
3FEF:0129　LEA　 BX,[DI+19]
3FEF:012C　PUSH　WORD [ES:BX]
3FEF:012F　CALL　0482 ;按F8跟进去
3FEF:0134　MOV　 SI,AX

下指令: BD*　　;清中断.

接着一直按F10,来到:

1BD7:0493　CALL　07C0　　;按F8跟进去
1BD7:0498　MOV　 SI,AX
1BD7:049A　OR　　SI,AX
1BD7:049C　JZ　　04A6
1BD7:049E　MOV　 AX,SI
1BD7:04A0　POP　 SI
1BD7:04A1　POP　 DI
1BD7:04A2　LEAVE
1BD7:04A3　RETF　06

接着一直按F10,来到:

35C7:08F8　CALL　`KERNEL!_LREAD`
35C7:08FD　MOV　 [BP-06],AX　　　;光标停在这里
35C7:0900　CMP　 AX,FFFF
35C7:0903　JNZ　 0908
35C7:0905　JMP　 09A8
35C7:0908　MOV 　ES,[1F42]

下指令: DW ES:26A
获得段地址①.

下指令: DB 段地址①:B19
数据窗口显示:

35AF:0B19 04 00 00 00 00 05 2D 00-DE 03 9E 07 85 02 12 07 ......-.???..
35AF:0B29 00 14 02 1E FF FF 00 03-65 00 00 80 0A 12 00 00 ....��..e..�....
35AF:0B39 01 FF 00 22 41 6C 73 6F-20 4C 6F 67 20 4E 65 74 .�."Also Log Net

这是定购窗口的VB显示参数,包括窗口位置、字体、字体尺寸、前景、背景、效果等.
在它的前面是将要显示的字串.

下指令: DB 段地址①:CB8
数据窗口显示:

35AF:0CB8 03 00 00 FF 00 04 FF FF-FF 00 05 BB 17 DE 03 EA ...�..���..???
35AF:0CC8 06 85 02 0C 0D 4D 53 20-53 61 6E 73 20 53 65 72 .?..MS Sans Ser

这是试用版窗口的VB显示参数.

下指令: E 段地址①:B21 0 0 0 0 A 0
下指令: E 段地址①:CBE 0 0 0 0 5 2D 0 0 0 0 0 A 0

按F5.
修改成功.两个窗口均被清除.

使用Ultra Edit 32,按下面的方法做最后的修改:

34 32 80 03 A2 76 67 0F 55
-- 38 63 00 37 38 37 38 --

17 DE 03 EA 06 85 02 OC
-- 00 00 00 00 0A 00 --

00 DE 03 9E 07 85 02 12
-- 00 00 00 00 0A 00 --

试运行.哇,成功!
VB是可以修改的!

忙了半天,只是为了说明VB是可以修改的.
其实按下面的方法修改,只要修改一处,效果是一样的:

34 32 80 03 A2 76 67 0F 55
-- 38 FF FF 37 38 37 38 --

俨然一个正版.

倘若只是想用一用软件,或想偷个懒,或者缺少工具,只要用Notepad打开Win.ini,在Protection
FL3= 25一行的前面加上一个分号";",然后存盘,就万事大吉了.


腾图影视'97

 标 题:修改指针法破解VB程序 腾图影视'97 (14千字)
发信人:囚童
时 间:2001-7-25 22:57:31
详细信息:
修改指针法破解VB程序
腾图影视'97

作者:　囚童
课题:　解除"腾图影视'97"五分钟播映时间限制,清NAG
背景:　VB4.0编程
下载:
工具:　TRW2000
       Ultra Edit 32

    腾图影视'97是一个播放VCD等数字影视节目的工具软件，除了播放画面流畅、色
彩逼真、界面美观以外，还采用了独创的“无界面”操作技术，即在影片播放过程中
进行的任何操作，都不会有操作画面进行遮挡。此外，还增加了动态屏幕变焦（动态
的将局部画面进行放大、缩小）及漫游，多画面播放（产生电视墙的效果），动态连
续抓拍，还可以将窗口缩小后放在最上层，边干别的工作边看电影，互不干扰。在播
放卡拉－OK时，可将所有曲目的画面显示在屏幕上，从而进行屏幕选曲，操作十分方
便。播放多种格式的视频文件(*.FLI)、 (*.FLC)、(*.DAT)、(*.MPG)、 (*.AVI)、
(*.MOV)等。

腾图影视'97试用版有5分钟播映时间限制，并会弹出一个提示窗口。没有注册入口。

    腾图影视'97选择VB4.0编程.大家知道,VB程序的特点是既难跟又难改,这就给破解
带来相当的难度.

下面给出用修改指针法破解VB程序的例子,供参考.

启动TRW2000,点OK,TRW2000在屏幕右下角生成一个小图标.右击这个图标,选TRmewTCB.

将一张VCD影碟放入光驱,双击腾图影视'97图标,TRW截获这一新线程.

为了让大家了解什么是VB的指针,我们先做如下操作:

下指令: BPX THROW
按F5,程序被TRW截获.
下指令: BD*　　;清中断.
按F12三次,按F10一直来到:

109F:30B6　MOV 　DS,BX
109F:30B8　CALL　FAR [BP+0C]　//按F7、F8进入
109F:30BB　MOV 　[BP-04],AX　 //光标停在这里
109F:30BE　MOV 　[BP-02],DX
109F:30C1　MOV 　CX,[BP+06]
109F:30C4　ADD 　SP,CX
109F:30C6　ADD 　SP,CX
109F:30C8　MOV 　AX,[BP-04]
109F:30CB　MOV 　DX,[BP-02]
109F:30CE　POP 　SI
109F:30CF POP DI
109F:30D0　LEAVE
109F:30D1　RETF　0A

将光标上移到30B8一行，按F7、F8进入到：

418F:2CF0　MOV　CX,C8　　　//光标停在这里
418F:2CF3　CMP　AX,C933
418F:2CF6　MOV　AX,2622
418F:2CF9　MOV　DX,1ADF
418F:2CFC　JMP　`VB40016!METHCALLENGINE`　　//将光标移在这里，按F7、F8进入
418F:2D01　ADD　[BX+SI],AL
418F:2D03　ADD　[BX+SI],AL
418F:2D05　DB　 00
3EC7:2D06　MOV　CX,D0
3EC7:2D09　CMP　AX,C933
3EC7:2D0C　MOV　AX,1CB4
3EC7:2D0F　MOV　DX,3EDF
3EC7:2D12　JMP　`VB40016!METHCALLENGINE`

这是典型的VB指针控制域的一个引导入口表。
按F8跟进去，来到：

VB40016!METHCALLENGINE
1A57:0E40　MOV 　BX,SP　　　　　//光标停在这里
1A57:0E42　SUB 　[SS:BX+04],CX
1A57:0E46　MOV 　BX,CX
1A57:0E48　MOV 　CX,3D0C
1A57:0E4B　JMP 　SHORT 0E50
1A57:0E4D　MOV 　CX,3CDD
1A57:0E50　PUSH　BP
         ┇
         ┇
1ADF:0F7E　MOV　[ES:BX+0162],AX
1ADF:0F83　ADD　SI,BYTE +02
1ADF:0F86　JMP　NEAR [SI-02] 　　//将光标移在这里，按F7跟到这里

将光标下移到F86一行，按F7。
可以看到，AX的值经处理存入指针SI，DX置为DS段值。
按住F10，可以来到：

1C27:209B　MOV 　　AX,[SI]
1C27:209D　PUSH　　SS
1C27:209E　ADD 　　AX,BP
1C27:20A0　PUSH　　AX
1C27:20A1　ADD 　　SI,BYTE +04
1C27:20A4　JMP 　　NEAR [SI-02]
         ┇
         ┇
1C27:20B9　MOV 　　DI,[SI]
1C27:20BB　POP 　　AX
1C27:20BC　MOV 　　[BP+DI],AL
1C27:20BE　ADD 　　SI,BYTE +04
1C27:20C1　JMP 　　NEAR [SI-02]

    分析上面给出的209B和20B9两节指令，可以看出VB指针控制域代码结构的明显特
征：指针DS:SI指向一个混合装有指令入口和数据的指针列表，节首的传送指令通过指
针列表下载数据；节尾的跳转指令通过指针列表下载新的指令入口。这样就将事先按
死顺序编好在VB运行库里的指令代码和用户所给的数据通过指针列表盘活了。因此，
下面给出的带条件语句的TRW跟踪指令也反映了VB指针控制域代码结构的这一特征。

那么，怎样解除"腾图影视'97"五分钟播映时间限制呢？

    "腾图影视'97"有多个时间限制机制，一个是由窗口内的鼠标指针激活的与系统时
钟相关的5分钟计时，另七个是内建的以分钟为单位的5分钟计时，它们各自独立运行。

先看第一个：
A：

其指令引导表为：
1B1F:22DE　MOV　CX,0086
1B1F:22E1　CMP　AX,C933
1B1F:22E4　MOV　AX,2DA6
1B1F:22E7　MOV　DX,1AC7
1B1F:22EA　JMP　`VB40016!METHCALLENGINE`

下指令：G 158E IF（SI==2），回车，将光标移入窗口，截获到：

15A7:158B　MOV 　DI,15AF
15A7:158E　CALL　FAR [SI]　　　//光标停在这里
15A7:1590　ADD 　SI,BYTE +04
15A7:1593　JMP 　DI
15A7:1595　MOV 　DI,159A
15A7:1598　JMP 　SHORT 158E
15A7:159A　XOR 　AH,AH
15A7:159C　PUSH　AX
15A7:159D　ADD 　SI,BYTE +02
15A7:15A0　JMP 　NEAR [SI-02]
15A7:15A3　MOV 　DI,15AE
15A7:15A6　JMP 　SHORT 158E
15A7:15A8　MOV 　DI,15AD
15A7:15AB　SHORT 158E
15A7:15AD　PUSH　DX
15A7:15AE　PUSH　AX
15A7:15AF　ADD 　SI,BYTE +02
15A7:15B2　JMP 　NEAR [SI-02]

    可以看到TRW反汇编窗口下面的横线中央标有VB40016(xx)+xxx,指出当前模块名
是VB40016,括号中是子模块序号,加号后是在模块中的偏移量.

这就是VB4的指针控制域.所谓VB难追,也是指在这个域里.

    为什么上面的TRW跟踪指令要附带条件语句呢？因为VB是解释语言，解释语言的
一节命令可能会被反复多次调用，不同的调用会有不同的指针。用指针做条件可以限
定在指定的调用环境下截获中断。特别在长调用返回时，若调用的节对自身再次调用，
无指针做条件会导致返回在下一个调用的返回处。

（若按F8跟进去，可以发现这是对函数RTCGetTimeBSTR的调用。）

下指令：D DS：0
得到指针列表（方扩号是作者加的。方扩号内是指令指针，方扩号外是数据指针）：

1AC7:0000[15A8]0BCC 116F[402E]FF9A[2051]FF9A[3283]
1AC7:0010 0001 0000[332C]FF5C 0002[15A8]0AE0 3B6F
1AC7:0020[4025]FF58[394B]FF50[158B]1E18 116F[2051]
1AC7:0030 FF9A[3283]0004 0000[332C]FF30 0002[15A8]
1AC7:0040 0AE0[3B6F 4025]FF2C[394B]FF24[158B]1E18
1AC7:0050 116F[2BA0]0026 0000[321B 468C 381D]0006
1AC7:0060 005C[3283]0005 0000[3555 1876 2090]FF50
1AC7:0070[3213]003C[1869 3631 2090]FF24[3585 1965]
1AC7:0080[46E4 33B2 220B]0004 FF58 FF2C[21F7]0004
1AC7:0090 FF5C FF30[148B]000C 161E 0004 06AC 3BE0

将上表整理，可得指针、指令和数据的关系如下（每一序号包含一至多节）：

节序 　　　　①　　　　　　②　　　　　　③　　　　　　④　　　　　　⑤
指针SI　　　　　2 　　　　　　C 　　　　　　1C 　　　　　40 5C
指令入口[SI-2] 15A8　　　　　2051 　　15A8　　　　　15A8　　　　　468C
数据内容[SI]　　0BCC　　　　　FF9A 　　0AE0 　0AE0　　　　　—
数据内容描述　　函数地址偏移　数据地址偏移　函数地址偏移　函数地址偏移　—
该节功能　　　　获取当前时间　传送时间　　　处理小时　　　处理分钟 判小时

节序 　　　　⑥　　　　　　⑦　　　　　　⑧
指针SI　　　　　5E　　　　　　82　　　　　　84
指令入口[SI-2] 381D　　　　　46E4　　　　　33B2
数据内容[SI]　　0006　　　　　—　　　　　　—
数据内容描述　　浮点处理参数　—　　　　　　—
该节功能　　　　进入浮点处理　判分钟 终判、置标志

节①　SI=2
1A8F:158E　CALL　FAR [SI]　　//SI指向函数RTCGETTIMEBSTR入口，获取当前时间
1A8F:1590　ADD 　SI,BYTE +04
1A8F:1593　JMP 　DI
1A8F:1595　MOV 　DI,159A
1A8F:1598　JMP 　SHORT 158E
1A8F:159A　XOR 　AH,AH
1A8F:159C　PUSH　AX
1A8F:159D　ADD 　SI,BYTE +02
1A8F:15A0　JMP 　NEAR [SI-02]
1A8F:15A3　MOV 　DI,15AE
1A8F:15A6　JMP 　SHORT 158E
1A8F:15A8　MOV 　DI,15AD　　　//该节入口
1A8F:15AB　JMP 　SHORT 158E
1A8F:15AD　PUSH　DX
1A8F:15AE　PUSH　AX
1A8F:15AF　ADD 　SI,BYTE +02 　//指向下一节
1A8F:15B2　JMP 　NEAR [SI-02]　//跳到下一节入口

节②　SI=C
1A8F:2051　MOV 　DI,[SI]
1A8F:2053　PUSH　WORD [BP+DI+02] //将指向当前时间的地址压入堆栈
1A8F:2056　PUSH　WORD [BP+DI]
1A8F:2058　ADD 　SI,BYTE +04 　　//指向下一节
1A8F:205B　JMP 　NEAR [SI-02]　　//跳到下一节入口

节③　SI=1C
同节①，SI指向函数RTCMIDCHARBSTR入口，取小时值供后续处理。

节④　SI=40
同节③，SI指向函数RTCMIDCHARBSTR入口，取分钟值供后续处理。

节⑤　SI=5C
1A8F:468C　POP 　DX　　　　　//弹出参照标量
1A8F:468D　POP 　CX　　　　　//弹出小时处理结果
1A8F:468E　CMP 　CX,DX　　 　//判断
1A8F:4690　MOV 　AX,00　　 　//清小时超时标志
1A8F:4693　JNZ 　4696 　　 　//未超时，跳
1A8F:4695　DEC 　AX　　　　　//超时，置小时超时标志FFFF
1A8F:4696　PUSH　AX　　　　 //压入堆栈
1A8F:4697　ADD 　SI,BYTE +02 //指向下一节
1A8F:469A　JMP 　NEAR [SI-02]//跳到下一节入口

节⑥　SI=5E
1A8F:381D　MOV 　DI,[SI]
1A8F:381F　LES 　DI,[BP+DI]
1A8F:3821　MOV 　AX,ES
1A8F:3823　OR 　AX,AX
1A8F:3825　JZ 　3870
1A8F:3827　ADD 　DI,[SI+02]
1A8F:382A　PUSH　WORD [ES:DI+02] //将浮点处理参数压入堆栈
1A8F:382E　PUSH　WORD [ES:DI]　 　//供浮点系统处理
1A8F:3831　ADD 　SI,BYTE +06
1A8F:3834　JMP 　NEAR [SI-02]

节⑦　SI=82
3A7F:46E4　CALL　C777　　　　//在浮点系统中先将十六进制分钟数据转换为80位的数
3A7F:46E7　JMP 　SHORT 46F6 //据，再判断是否超时，将结果送入AH，再将AH中的内
3A7F:46E9　CALL　C785　　　　//容送标志位。
3A7F:46EC　JMP 　SHORT 46F6
3A7F:46EE　CALL　C74C
3A7F:46F1　JMP 　SHORT 46F6
3A7F:46F3　CALL　C732
3A7F:46F6　SBB 　AX,AX　　　　//根据标志位置分钟超时标志，0为未超时，FFFF为超时。
3A7F:46F8　PUSH　AX　　　　　 //压入堆栈
3A7F:46F9　ADD 　SI,BYTE +02　//指向下一节
3A7F:46FC　JMP 　NEAR [SI-02] //跳到下一节入口

节⑧　SI=84
31B7:33B2　POP 　AX　　　　　//弹出小时超时标志
31B7:33B3　POP 　CX　　　　　//弹出分钟超时标志
31B7:33B4　AND 　AX,CX 　　　//终判，其一为超时则判为超时
31B7:33B6　PUSH　AX　　　　　//置终判标志于栈顶
31B7:33B7　ADD 　SI,BYTE +02 //指向下一节
31B7:33BA　JMP 　NEAR [SI-02]//跳到下一节入口

    可见，只要在节⑧位置向栈顶压入标志字0，就可以不去理会浮点运算有多么复
杂，使程序始终处于未超时状态。

    但是,上面提到的全部数据传输和处理过程都是在vb40016.dll中完成的,无法将
33B6处改写为例如PUSH　BYTE +00这样的指令（改写公共DLL文件是对用户极不负责
的表现）.

    而指针表是程序在编译过程中生成的，是可以改写的。只要记住这样的规则，就
不怕改写VB程序了：不要指望改写语句，要设法改变调用。

改变调用的方法就是修改指针表。

在当前指令代码段中找了一下,有下面2节大约可用于新的调用：

⑴
31D7:1746　SBB 　AX,AX
31D7:1748　PUSH　AX
31D7:1749　ADD 　SI,BYTE +02
31D7:174C　JMP 　NEAR [SI-02]

⑵
31D7:321B　PUSH　BYTE +00
31D7:321D　ADD 　SI,BYTE +02
31D7:3220　JMP 　NEAR [SI-02]

试选⑵,做一个新的指针方案:

节序 　　　　⑧
指针SI　　　　　84
指令入口[SI-2] 321B
数据内容[SI]　　—
数据内容描述　　—
该节功能　　　　强制设置未超时标志0

    抄下指针表中指针84前后的十六进制码，使用Ultra Edit 32,按下面的方法做第
一步的修改:

46 B2 33 0B
— 1B 32 —

下面来看另七个内建的以分钟为单位的5分钟计时。
B-1：

其指令引导表为：
346F:0F40　MOV　CX,66
346F:0F43　CMP　AX,C933
346F:0F46　MOV　AX,370C
346F:0F49　MOV　DX,346F
346F:0F4C　JMP　`VB40016!METHCALLENGINE`

下指令：G 3807 IF（SI==31F2），回车，来到：

1A8F:3807　MOV 　DI,[SI]　　　//光标停在这里
1A8F:3809　LES 　DI,[BP+DI]
1A8F:380B　MOV 　AX,ES
1A8F:380D　OR 　AX,AX
1A8F:380F　JZ 　3870
1A8F:3811　ADD 　DI,[SI+02]
1A8F:3814　PUSH　WORD [ES:DI]
1A8F:3817　ADD 　SI,BYTE +06
1A8F:381A　JMP 　NEAR [SI-02]

下指令：D DS：31E0

得到指针列表（方扩号是作者加的。方扩号内是指令指针，方扩号外是数据指针）：

346F:31E0[0F92]0004[0F92]0008[3D49]0512[0F92]0012
346F:31F0[3807]0006 0034[321B 47C5 148B]0018[0F92]
346F:3200 0014[3807]0006 0034[3223 359C 38BA]0006
346F:3210 0034[1474]04E4[0F92]0004[0F92]0034[321B]

将上表整理，可得指针、指令和数据的关系如下（每一序号包含一至多节）：

节序 　　　　①　　　　　　②　　　　　③　　　　　　④
指针SI　　　　　31F2　　　　　31F8　　　　31FA　　　　　31FC
指令入口[SI-2] 3807　　　　　321B 　47C5　　　　　148B
数据内容[SI]　　0006　　　　　—　　　　　—　　　　　　—
数据内容描述　　数据地址偏移　—　　　　　—　　　　　　—
该节功能　　　　获取剩余分钟　给出参照值　比较、置标志　判断

节序　　　　　　⑤　　　　　　⑥　　　　　⑦　　　　　⑧
指针SI　　　　　3204　　　　　320A　　　　320C　　　　320E
指令入口[SI-2] 3087　　　　　3223　　　　359C　　　　38BA
数据内容[SI]　　0006　　　　　—　　　　　—　　　　　0006
数据内容描述　　数据地址偏移　—　　　　　—　　　　　非超时增跳节数
该节功能　　　　获取剩余分钟　给出递减值　剩余分钟减1 回置存储单元

节①　SI=31F2

1A8F:3807　MOV 　DI,[SI] 　　//取数据地址偏移
1A8F:3809　LES 　DI,[BP+DI]
1A8F:380B　MOV 　AX,ES
1A8F:380D　OR 　AX,AX 　　//校验地址有效性
1A8F:380F　JZ 　3870
1A8F:3811　ADD 　DI,[SI+02]　//取下一个数据地址偏移
1A8F:3814　PUSH　WORD [ES:DI]//将剩余分钟压入堆栈
1A8F:3817　ADD 　SI,BYTE +06 //指向下一节
1A8F:381A　JMP 　NEAR [SI-02]//跳到下一节入口

节②　SI=31F8

1A8F:321B　PUSH　BYTE +00　　//给出参照值，0为计时结束。
1A8F:321D　ADD 　SI,BYTE +02 //指向下一节
1A8F:3220　JMP 　NEAR [SI-02]//跳到下一节入口

节③　SI=31FA

1A8F:47C5　POP 　DX　　　　　//弹出参照值
1A8F:47C6　POP 　CX　　　　　//弹出剩余分钟值
1A8F:47C7　XOR 　AX,AX 　　　//清超时标志
1A8F:47C9　CMP 　CX,DX 　　　//比较
1A8F:47CB　JNG 　47CE　　　　//非超时，跳；标志为0
1A8F:47CD　DEC 　AX　　　　　//超时，不跳；标志为FFFF
1A8F:47CE　PUSH　AX　　　　　//保存标志
1A8F:47CF　ADD 　SI,BYTE +02 //指向下一节
1A8F:47D2　JMP 　NEAR [SI-02]//跳到下一节入口

节④　SI=31FC

1A8F:148B　POP　CX 　　　　　//弹出超时标志
1A8F:148C　MOV　AX,[SI]　　　//取非超时增跳节数
1A8F:148E　OR 　CX,CX　　　　//判断
1A8F:1490　JNZ　1494 　　　　//超时，保持原节进程
1A8F:1492　ADD　SI,AX　　　　//非超时，增跳指定指令节数
1A8F:1494　ADD　SI,BYTE +04　//指向下一节
1A8F:1497　JMP　NEAR [SI-02] //跳到下一节入口

节⑤　SI=3204
同节①

节⑥　SI=320A

1A8F:3223 PUSH BYTE +01　　//取递减值
1A8F:3225 ADD SI,BYTE +02 //指向下一节
1A8F:3228 JMP NEAR [SI-02]//跳到下一节入口

节⑦　SI=320C

1A8F:359C　POP　AX 　　　　　//弹出递减值
1A8F:359D　MOV　BX,SP
1A8F:359F　SUB　[SS:BX],AX　　//剩余分钟值减1
1A8F:35A2　JO 　35BD
1A8F:35A4　ADD　SI,BYTE +02 //指向下一节
1A8F:35A7　JMP　NEAR [SI-02]//跳到下一节入口

节⑧　SI=320E

1A8F:38BA　MOV　DI,[SI] 　　//取数据地址偏移
1A8F:38BC　LES　DI,[BP+DI]
1A8F:38BE　MOV　AX,ES
1A8F:38C0　OR 　AX,AX 　　//校验地址有效性
1A8F:38C2　JZ 　3870
1A8F:38C4　ADD　DI,[SI+02]　//取下一个数据地址偏移
1A8F:38C7　POP　WORD [ES:DI]//将更新的剩余分钟值回置原存储单元
1A8F:38CA　ADD　SI,BYTE +06 //指向下一节
1A8F:38CD　JMP　NEAR [SI-02]//跳到下一节入口

    从节④可以看出，在VB中，指令的跳转不是按指令字节数来跳转的，而是按指令
的节数来跳转的。

    从节⑦可以看出，若时间递减值为0，则剩余分钟值永不为0，程序就可以不受限
制地运行下去了。这可以通过改变节⑥的调用来实现。我们仍可以用前面用到过的321B
来替换节⑥。

新的调用：

31D7:321B　PUSH　BYTE +00
31D7:321D　ADD 　SI,BYTE +02
31D7:3220　JMP 　NEAR [SI-02]

新的指针方案:

节序 　　　　⑥
指针SI　　　　　320A
指令入口[SI-2] 321B
数据内容[SI]　　—
数据内容描述　　—
该节功能　　　　强制设置时间递减值为0

另外6个计时器大同小异，但指针表的位置不一样，列表如下：

计时器号　　　　B-1 　　B-2 　　B-3 　　B-4 　　B-5 　　B-6 　　B-7
入口引导表入口　F40 　　23BA　　28F8　　30B8　　3560　　389C　　3A98
首节指针SI　　　31E2　　56E 　　270A　　374E　　2C76　　2　 　　ADA
首节入口　　　　F92 　　F92 　　F92 　　F92 　　F92 　　F92 　　F92
指令指针SI　　　31F8　　57E 　　271A　　375E　　2C86　　12　　　AEA
指令入口　　　　3807　　3807　　3807　　3807　　3807　　3807　　3807
需要改值的指针　3208　　594 　　2730　　3774　　2C9C　　28　　　B00
UltraEdit32偏移 44440 　45510 　43970 　449A0 　43ED0 　44F90 　45A80

    抄下指针表中需要改值的指针前后的十六进制码（它们大致相同），使用Ultra
Edit 32,按下面的方法做最后的修改:

00 23 32 9C 35 BA 38
-- 1B -- -- -- -- --

    与此代码相同的不止7处，可参考上表最下面一行UltraEdit32偏移，它是一组行
号，需要改值的指针在此行内。

存盘。
试运行。哇,成功!
VB是以修改的!


badcat21

 标 题:破解badcat21---真正的初学者 (5千字)
发信人:下弦月
时 间:2001-5-19 9:42:30
详细信息:
这个软件极弱，正好作为破解第一课。
运行badcat21，选注册，填121212121，按ctrl+n，下bpx hmemcpy，x退出点注册，pmodule到它领空，按f12，一次就退了，弱吧，嘿嘿
原样再来一便，到这里。
按f10往下，
:00482DD5 3BC6 cmp eax, esi
:00482DD7 DBE2 fclex
:00482DD9 7D12 jge 00482DED
:00482DDB 68A0000000 push 000000A0

* Possible StringData Ref from Code Obj ->"酦?檉??"
|
:00482DE0 681CA04100 push 0041A01C
:00482DE5 53 push ebx
:00482DE6 50 push eax

* Reference To: MSVBVM60.__vbaHresultCheckObj, Ord:0000h
|
:00482DE7 FF1558104000 Call dword ptr [00401058]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00482DD9(C)
|
:00482DED 8B45E0 mov eax, dword ptr [ebp-20]
:00482DF0 8D4DBC lea ecx, dword ptr [ebp-44]
:00482DF3 8945D4 mov dword ptr [ebp-2C], eax
:00482DF6 8D45CC lea eax, dword ptr [ebp-34]
:00482DF9 50 push eax
:00482DFA 51 push ecx
:00482DFB 8975E0 mov dword ptr [ebp-20], esi
:00482DFE C745CC08000000 mov [ebp-34], 00000008

* Reference To: MSVBVM60.rtcTrimVar, Ord:0208h
|
:00482E05 FF15C4104000 Call dword ptr [004010C4]
:00482E0B 8B55E8 mov edx, dword ptr [ebp-18]

来到这里。这个edx就是算出来的注册码
再往下就判断退出了。

:00482E0E B80B000000 mov eax, 0000000B
:00482E13 89857CFFFFFF mov dword ptr [ebp+FFFFFF7C], eax
:00482E19 89458C mov dword ptr [ebp-74], eax
:00482E1C 8D45BC lea eax, dword ptr [ebp-44]
:00482E1F 899564FFFFFF mov dword ptr [ebp+FFFFFF64], edx
:00482E25 8D8D5CFFFFFF lea ecx, dword ptr [ebp+FFFFFF5C]
:00482E2B 50 push eax
:00482E2C 8D55AC lea edx, dword ptr [ebp-54]
:00482E2F 51 push ecx
:00482E30 52 push edx
:00482E31 C74584FFFFFFFF mov [ebp-7C], FFFFFFFF
:00482E38 897594 mov dword ptr [ebp-6C], esi
:00482E3B C7855CFFFFFF08800000 mov dword ptr [ebp+FFFFFF5C], 00008008

* Reference To: MSVBVM60.__vbaVarCmpNe, Ord:0000h
|
:00482E45 FF154C104000 Call dword ptr [0040104C]
:00482E4B 8BD0 mov edx, eax
:00482E4D 8D4D9C lea ecx, dword ptr [ebp-64]

* Reference To: MSVBVM60.__vbaVarMove, Ord:0000h
|
:00482E50 FF1514104000 Call dword ptr [00401014]
:00482E56 8D857CFFFFFF lea eax, dword ptr [ebp+FFFFFF7C]
:00482E5C 8D4D8C lea ecx, dword ptr [ebp-74]
:00482E5F 50 push eax
:00482E60 8D559C lea edx, dword ptr [ebp-64]
:00482E63 51 push ecx
:00482E64 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C]
:00482E6A 52 push edx
:00482E6B 50 push eax

* Reference To: MSVBVM60.rtcImmediateIf, Ord:02A9h
|
:00482E6C FF15E0114000 Call dword ptr [004011E0]
:00482E72 8D8D6CFFFFFF lea ecx, dword ptr [ebp+FFFFFF6C]
:00482E78 51 push ecx

* Reference To: MSVBVM60.__vbaBoolVar, Ord:0000h
|
:00482E79 FF15C0104000 Call dword ptr [004010C0]
:00482E7F 8D4DDC lea ecx, dword ptr [ebp-24]
:00482E82 8945E4 mov dword ptr [ebp-1C], eax

* Reference To: MSVBVM60.__vbaFreeObj, Ord:0000h
|
:00482E85 FF1578124000 Call dword ptr [00401278]
:00482E8B 8D956CFFFFFF lea edx, dword ptr [ebp+FFFFFF6C]
:00482E91 8D857CFFFFFF lea eax, dword ptr [ebp+FFFFFF7C]
:00482E97 52 push edx
:00482E98 8D4D8C lea ecx, dword ptr [ebp-74]
:00482E9B 50 push eax
:00482E9C 8D559C lea edx, dword ptr [ebp-64]
:00482E9F 51 push ecx
:00482EA0 8D45BC lea eax, dword ptr [ebp-44]
:00482EA3 52 push edx
:00482EA4 8D4DCC lea ecx, dword ptr [ebp-34]
:00482EA7 50 push eax
:00482EA8 51 push ecx
:00482EA9 6A06 push 00000006

* Reference To: MSVBVM60.__vbaFreeVarList, Ord:0000h
|
:00482EAB FF1534104000 Call dword ptr [00401034]
:00482EB1 8B17 mov edx, dword ptr [edi]
:00482EB3 83C41C add esp, 0000001C
:00482EB6 8D45E4 lea eax, dword ptr [ebp-1C]
:00482EB9 50 push eax
:00482EBA 57 push edi
:00482EBB FF9204070000 call dword ptr [edx+00000704]

很简单吧？第一次写破解。
下弦月


Folder Browser Control v1.0.10

 标 题:Folder Browser Control v1.0.10注册码的计算 (15千字)
发信人:robot
时 间:2001-6-2 22:05:36
详细信息:
控件名称：Folder Browser
软件授权：共享软件
下载地址：http://www.bitdebris.com/downloads/bdsfbrws.zip
控件简介：From the developer: "When all you want to do is select a folder. The Folder Browser Control provides an interface for selecting a folder to the user of your program. It implements a common feel of the Windows interface, a hierarchical tree structure representing the local and network file system, similar to the one found in the Windows Explorer. The Folder Browser Control acts as a drop-in replacement for the Common Dialog control when all you want to do is to select a folder."
目标程序：bdsfbrws.ocx，69632 bytes
破解工具：W32Dasm 8.93(打过VB支持补丁)，SoftICE 4.05
说明：本人想用VB编一个程序，需要用到只取得文件夹名称的控件，而VB中的Dirlist控件只能显示当前驱动器的文件夹，必须结合DriveList控件，但这样用起来又太不方便了，让人感觉太别扭，于是上网搜索，奋战了3个多小时，终于找到两个满意的，确实比微软的那个强，但都需要注册，前面我说过FolderView 3.0注册部分的计算过程，这次介绍Folder Browser注册部分的计算过程，该控件采用VB 6.0编程，Active编码方式(^_^，如果是P-Code，我立即只有瞪眼的份)，我没有象FolderView那样立即写出注册部分的计算过程，就是因为它的注册码的计算含有幂和sin的计算，我从“五一”才开始利用一点时间练习用VB编程(我很讨厌VB，代码有臭又长，尤其讨厌该程序至少必须有一个更臭更长的DLL支持库，我希望以后转到DEPHI，我练习用VB编程也是因为现在很多程序都是用VB编的，要想破解容易点儿，了解它所用的编译语言会很有帮助的，当然，我学破解的部分目的是学习软件作者的编程思想)，对于VB编程中幂等浮点的计算的W32Dasm反汇编结果中push参数如何进行没有十分搞清楚(不过现在基本明白了——我是指的非P-Code形式)。另外，该控件用SmartCheck可以看到真正的注册码。好了，闲话少说，现在就说一下它注册部分的计算过程。

* Referenced by a CALL at Addresses:
|:110065E4 , :11006D6A , :1100831E
|
:11007AB0 55 push ebp
:
:
:
:11007B26 8B45E0 mov eax, dword ptr [ebp-20] ====> RegCode

* Reference To: MSVBVM60.__vbaLenBstr, Ord:0000h
|
:11007B29 8B1D1C100011 mov ebx, dword ptr [1100101C]
:11007B2F 50 push eax
:11007B30 FFD3 call ebx
:11007B32 8B4DEC mov ecx, dword ptr [ebp-14] ====> UserName
:11007B35 8BD0 mov edx, eax
:11007B37 F7DA neg edx
:11007B39 1BD2 sbb edx, edx
:11007B3B 51 push ecx
:11007B3C F7DA neg edx
:11007B3E 89955CFFFFFF mov dword ptr [ebp+FFFFFF5C], edx
:11007B44 FFD3 call ebx
:11007B46 8B955CFFFFFF mov edx, dword ptr [ebp+FFFFFF5C]
:11007B4C F7D8 neg eax
:11007B4E 1BC0 sbb eax, eax
:11007B50 F7D8 neg eax
:11007B52 85D0 test eax, edx
:11007B54 0F84F1000000 je 11007C4B
:11007B5A 8B45DC mov eax, dword ptr [ebp-24] ====> CompanyName
:11007B5D 50 push eax
:11007B5E FFD3 call ebx
:11007B60 85C0 test eax, eax
:11007B62 0F8EA1000000 jle 11007C09
:11007B68 8D5588 lea edx, dword ptr [ebp-78]
:11007B6B 6A01 push 00000001 ====> 取一个字符
:11007B6D 8D45C8 lea eax, dword ptr [ebp-38]
:11007B70 8D4DDC lea ecx, dword ptr [ebp-24]
:11007B73 BE08400000 mov esi, 00004008
:11007B78 52 push edx
:11007B79 50 push eax
:11007B7A 894D90 mov dword ptr [ebp-70], ecx
:11007B7D 897588 mov dword ptr [ebp-78], esi

* Reference To: MSVBVM60.rtcLeftCharVar, Ord:0269h
|
:11007B80 FF1568110011 Call dword ptr [11001168] ====> 取单位名左第一个字符
:11007B86 8B4DEC mov ecx, dword ptr [ebp-14]
:11007B89 8D8568FFFFFF lea eax, dword ptr [ebp+FFFFFF68]
:11007B8F 894D80 mov dword ptr [ebp-80], ecx
:11007B92 6A01 push 00000001 ====> 取一个字符
:11007B94 8D4DA8 lea ecx, dword ptr [ebp-58]
:11007B97 8D55DC lea edx, dword ptr [ebp-24]
:11007B9A 50 push eax
:11007B9B 51 push ecx
:11007B9C C78578FFFFFF08000000 mov dword ptr [ebp+FFFFFF78], 00000008
:11007BA6 899570FFFFFF mov dword ptr [ebp+FFFFFF70], edx
:11007BAC 89B568FFFFFF mov dword ptr [ebp+FFFFFF68], esi

* Reference To: MSVBVM60.rtcRightCharVar, Ord:026Bh
|
:11007BB2 FF1574110011 Call dword ptr [11001174] ====> 取单位名右第一个字符

* Reference To: MSVBVM60.__vbaVarCat, Ord:0000h
|
:11007BB8 8B35E4100011 mov esi, dword ptr [110010E4]
:11007BBE 8D55C8 lea edx, dword ptr [ebp-38]
:11007BC1 8D8578FFFFFF lea eax, dword ptr [ebp+FFFFFF78]
:11007BC7 52 push edx
:11007BC8 8D4DB8 lea ecx, dword ptr [ebp-48]
:11007BCB 50 push eax
:11007BCC 51 push ecx
:11007BCD FFD6 call esi ====> 复制左侧字符
:11007BCF 50 push eax
:11007BD0 8D55A8 lea edx, dword ptr [ebp-58]
:11007BD3 8D4598 lea eax, dword ptr [ebp-68]
:11007BD6 52 push edx
:11007BD7 50 push eax
:11007BD8 FFD6 call esi ====> 复制右侧字符
:11007BDA 50 push eax
:
:
:
:11007C11 8B55E0 mov edx, dword ptr [ebp-20] ====> NewRegName
:11007C14 8D4514 lea eax, dword ptr [ebp+14] ====> eax=0x18DEB=101867
:11007C17 52 push edx
:11007C18 8D4DE8 lea ecx, dword ptr [ebp-18] ====> Username
:11007C1B 50 push eax
:11007C1C 51 push ecx
:11007C1D E89EFBFFFF call 110077C0 ====> 计算注册码
:11007C22 8BD0 mov edx, eax
:11007C24 8D4DD8 lea ecx, dword ptr [ebp-28]

* Reference To: MSVBVM60.__vbaStrMove, Ord:0000h
|
:11007C27 FF1570110011 Call dword ptr [11001170]
:11007C2D 50 push eax ====> SoftICE下d eax即可看到真正注册码

* Reference To: MSVBVM60.__vbaStrCmp, Ord:0000h
|
:11007C2E FF159C100011 Call dword ptr [1100109C] ====> 比较两个注册码是否相等
:11007C34 8BF0 mov esi, eax ====> 改为xor esi, esi (机器码33F6)即可暴力破解
:
:
:
:11007C94 C3 ret

* Referenced by a CALL at Address:
|:11007C1D
|
:110077C0 55 push ebp
:
:
:
:1100780C 8B4508 mov eax, dword ptr [ebp+08]
:1100780F 8B08 mov ecx, dword ptr [eax]
:11007811 51 push ecx

* Reference To: MSVBVM60.__vbaLenBstr, Ord:0000h
|
:11007812 FF151C100011 Call dword ptr [1100101C] ====> 计算NewRegName的长度
:11007818 8BC8 mov ecx, eax

* Reference To: MSVBVM60.__vbaI2I4, Ord:0000h
|
:1100781A FF15A8100011 Call dword ptr [110010A8]

* Reference To: MSVBVM60.__vbaStrMove, Ord:0000h
|
:11007820 8B1D70110011 mov ebx, dword ptr [11001170]
:11007826 898574FFFFFF mov dword ptr [ebp+FFFFFF74], eax
:1100782C BF01000000 mov edi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:11007A29(U)
|
:11007831 663BBD74FFFFFF cmp di, word ptr [ebp+FFFFFF74]
:11007838 0F8FF0010000 jg 11007A2E
:1100783E 8B5508 mov edx, dword ptr [ebp+08] ====> NewRegName
:11007841 8D4DB8 lea ecx, dword ptr [ebp-48]
:11007844 0FBFC7 movsx eax, di
:11007847 8955A0 mov dword ptr [ebp-60], edx
:1100784A 51 push ecx
:1100784B 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax
:11007851 50 push eax
:11007852 8D5598 lea edx, dword ptr [ebp-68]
:11007855 8D45A8 lea eax, dword ptr [ebp-58]
:11007858 52 push edx
:11007859 50 push eax
:1100785A C745C001000000 mov [ebp-40], 00000001
:11007861 C745B802000000 mov [ebp-48], 00000002
:11007868 C7459808400000 mov [ebp-68], 00004008

* Reference To: MSVBVM60.rtcMidCharVar, Ord:0278h
|
:1100786F FF1584100011 Call dword ptr [11001084] ====> 从NewRegName中取一个字符
:11007875 8D4DA8 lea ecx, dword ptr [ebp-58]
:11007878 8D55D0 lea edx, dword ptr [ebp-30]
:1100787B 51 push ecx
:1100787C 52 push edx

* Reference To: MSVBVM60.__vbaStrVarVal, Ord:0000h
|
:1100787D FF15E0100011 Call dword ptr [110010E0] ====> 转为数值型
:11007883 50 push eax

* Reference To: MSVBVM60.rtcAnsiValueBstr, Ord:0204h
|
:11007884 FF1534100011 Call dword ptr [11001034] ====> ascii转为字符
:1100788A 8D4DD0 lea ecx, dword ptr [ebp-30]
:1100788D 8BF0 mov esi, eax ====> 放到esi中

* Reference To: MSVBVM60.__vbaFreeStr, Ord:0000h
|
:1100788F FF1588110011 Call dword ptr [11001188]
:11007895 8D45A8 lea eax, dword ptr [ebp-58]
:11007898 8D4DB8 lea ecx, dword ptr [ebp-48]
:1100789B 50 push eax
:1100789C 51 push ecx
:1100789D 6A02 push 00000002

* Reference To: MSVBVM60.__vbaFreeVarList, Ord:0000h
|
:1100789F FF1528100011 Call dword ptr [11001028]
:110078A5 8B5508 mov edx, dword ptr [ebp+08]
:110078A8 83C40C add esp, 0000000C
:110078AB DB8568FFFFFF fild dword ptr [ebp+FFFFFF68] ====> st0=1
:110078B1 8B02 mov eax, dword ptr [edx]
:110078B3 50 push eax
:110078B4 DD9D60FFFFFF fstp qword ptr [ebp+FFFFFF60]

* Reference To: MSVBVM60.__vbaLenBstr, Ord:0000h
|
:110078BA FF151C100011 Call dword ptr [1100101C] ====> NewRegName的长度
:110078C0 89855CFFFFFF mov dword ptr [ebp+FFFFFF5C], eax
:110078C6 8B4D0C mov ecx, dword ptr [ebp+0C] ====> ecx=0x18DEB
:110078C9 DB855CFFFFFF fild dword ptr [ebp+FFFFFF5C]
:110078CF 83EC08 sub esp, 00000008
:110078D2 DD9D54FFFFFF fstp qword ptr [ebp+FFFFFF54] ====> 长度放到此
:110078D8 DD8560FFFFFF fld qword ptr [ebp+FFFFFF60] ====> st0=1
:110078DE 833D00C0001100 cmp dword ptr [1100C000], 00000000
:110078E5 7508 jne 110078EF
:110078E7 DCB554FFFFFF fdiv qword ptr [ebp+FFFFFF54] ====> 1/len(NewRegName)
:110078ED EB11 jmp 11007900

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:110078E5(C)
|
:110078EF FFB558FFFFFF push dword ptr [ebp+FFFFFF58]
:110078F5 FFB554FFFFFF push dword ptr [ebp+FFFFFF54]

* Reference To: MSVBVM60._adj_fdiv_m64, Ord:0000h
|
:110078FB E8D49AFFFF Call 110013D4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:110078ED(U)
|
:11007900 DFE0 fstsw ax
:11007902 A80D test al, 0D
:11007904 0F858F010000 jne 11007A99
:1100790A DD1C24 fstp qword ptr [esp] ====> 作为幂
:1100790D DB01 fild dword ptr [ecx] ====> [ecx]=18DEB=101867
:1100790F DD9D4CFFFFFF fstp qword ptr [ebp+FFFFFF4C]
:11007915 8B9550FFFFFF mov edx, dword ptr [ebp+FFFFFF50]
:1100791B 8B854CFFFFFF mov eax, dword ptr [ebp+FFFFFF4C]
:11007921 52 push edx
:11007922 50 push eax

* Reference To: MSVBVM60.__vbaPowerR8, Ord:0000h
|
:11007923 FF1524110011 Call dword ptr [11001124] ====> 101867的幂
:11007929 DD0578120011 fld qword ptr [11001278] ====> st0=3.14159265359(用pi表示)
:1100792F 833D00C0001100 cmp dword ptr [1100C000], 00000000
:11007936 7508 jne 11007940
:11007938 DC3570120011 fdiv qword ptr [11001270] ====> pi/180
:1100793E EB11 jmp 11007951

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:11007936(C)
|
:11007940 FF3574120011 push dword ptr [11001274]
:11007946 FF3570120011 push dword ptr [11001270]

* Reference To: MSVBVM60._adj_fdiv_m64, Ord:0000h
|
:1100794C E8839AFFFF Call 110013D4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1100793E(U)
|
:11007951 83EC08 sub esp, 00000008
:11007954 DEC9 fmulp st(1), st(0)
:11007956 DFE0 fstsw ax
:11007958 A80D test al, 0D
:1100795A 0F8539010000 jne 11007A99
:11007960 DD1C24 fstp qword ptr [esp] ====> 放到[esp]

* Reference To: MSVBVM60.rtcSin, Ord:0246h
|
:11007963 FF1504100011 Call dword ptr [11001004] ====> sin
:11007969 DD9D7CFFFFFF fstp qword ptr [ebp+FFFFFF7C]
:1100796F DD857CFFFFFF fld qword ptr [ebp+FFFFFF7C]
:11007975 DC0D68120011 fmul qword ptr [11001268] ====> 乘以255
:1100797B D9E1 fabs ====> 取绝对值
:1100797D DFE0 fstsw ax
:1100797F A80D test al, 0D
:11007981 0F8512010000 jne 11007A99

* Reference To: MSVBVM60.__vbaR8IntI2, Ord:0000h
|
:11007987 FF1560110011 Call dword ptr [11001160] ====> 取整
:1100798D 33F0 xor esi, eax ====> 与所取字符异或
:1100798F 8D5598 lea edx, dword ptr [ebp-68]
:11007992 8D45B8 lea eax, dword ptr [ebp-48]
:11007995 8D4DD4 lea ecx, dword ptr [ebp-2C]
:11007998 52 push edx
:11007999 50 push eax
:1100799A 8975D4 mov dword ptr [ebp-2C], esi
:1100799D 894DA0 mov dword ptr [ebp-60], ecx
:110079A0 C7459802400000 mov [ebp-68], 00004002

* Reference To: MSVBVM60.rtcHexVarFromVar, Ord:023Dh
|
:110079A7 FF1510110011 Call dword ptr [11001110] ====> 计算结果转为16进制
:
:
:
:11007A1D B801000000 mov eax, 00000001 ====> 准备下一个字符
:11007A22 6603C7 add ax, di
:11007A25 7077 jo 11007A9E
:11007A27 8BF8 mov edi, eax
:11007A29 E903FEFFFF jmp 11007831

计算过程：
NewRegName=left(company,1)+UserName+right(company,1);
for i=1 to len(NewRegName);
Regcode=Regcode+Hex(Asc(Mid(NewRegName, i, 1)) Xor Abs(Int(Sin(101867^(i/len(NewRegName))*(3.14159265359/180))*255)))
next i
上面的注册适用于英文名字注册，如果适合中英文名字，改为：
Regcode=Regcode+Right(Hex(Asc(Mid(NewRegName, i, 1)) Xor Abs(Int(Sin(101867^(i/len(NewRegName))*(3.14159265359/180))*255))),4)
注册器已经制作成功


System View 4.05

 标 题:请高手破解这款软件！
发信人:huozhuo
时 间:2000-11-28 11:15:33
详细信息:
本人近来使用一款在市面不常用的软件叫
System View 4.05
www.elanix.com/eval.htm下载的。
但是它是评估版，有日期限制。
当使用过期后，重新安装也不行，必须重新格式化
才能重新安装，真烦啊，有谁能破它啊，
感谢啊！

标 题:改正后的
发信人:1212
时 间:2000-11-28 14:54:03
详细信息:

刚才把表格长度搞错了，应为0x32，不是32 :(

#include <windows.h>
#include <stdio.h>

void main(void)
{
long Table[0x32] =
{
0x00011F1B, 0x0000E298, 0x0000F2CC, 0x00008CDC,
0x00009137, 0x0001376E, 0x00002BFD, 0x00013281,
0x00014568, 0x00012055, 0x00003701, 0x0000B89E,
0x00015653, 0x00013CF7, 0x0000AA62, 0x0001793F,
0x0001596E, 0x00003AD5, 0x000174E4, 0x0000A709,
0x0000DF96, 0x000134C0, 0x000039DF, 0x0000F759,
0x0000CBD7, 0x00008FE2, 0x000101FA, 0x00010ACF,
0x000083CD, 0x00008944, 0x00014ACA, 0x000148F6,
0x0000F630, 0x000181BC, 0x00016752, 0x000076D1,
0x00011B70, 0x00017F98, 0x00007CD1, 0x0000E2C0,
0x00004C75, 0x0001866B, 0x000114C7, 0x00002C95,
0x0000F146, 0x00004A3C, 0x00004B48, 0x00013FEB,
0x00008B13, 0x0000371C
};

long random, Remain, sn, passwd[3], Index;

printf("Input your S/N: ");
scanf("%lu", &sn);

random = GetTickCount( );

passwd[0] = 0x0000DCE7L;

Index = sn % 0x32L;

Remain = random % 0x000000B4L;
passwd[1] = Remain + Table[Index];

Remain = Table[Index] + Remain;
passwd[2] = Remain + 0x0001B14FL;

printf("Your password is: ");
for(Index = 0; Index < 3; Index++)
{
printf("%lu", passwd[Index]);
if (Index == 2) printf("\n");
else printf("-");
}
}

好象过期之后再输入一次注册码就可以继续用了。

blowfish

标 题:VB6
发信人:1212
时 间:2000-11-28 16:29:42
详细信息:

试试这两个断点：

1、__vbaInStr( )

相当于C函数strstr( )。它用这个函数判断注册码是否包含“-”字符。

2、__vbaI4Str( )

相当于C函数atol( )。


Vopt Millennium edition

 标 题:半字节破解Vopt Millennium edition (9千字)
发信人:conanxu[BCG]
时 间:2001-5-13 13:42:29
详细信息:
半字节破解Vopt Millennium edition
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00432956(C), :004329FE(C), :00432AE6(C)
|
:00432B39 C745FC22000000 mov [ebp-04], 00000022
:00432B40 8B55DC mov edx, dword ptr [ebp-24]
:00432B43 52 push edx
:00432B44 E867E2FDFF call 00410DB0

* Reference To: MSVBVM50.__vbaSetSystemError, Ord:0000h
|
:00432B49 FF151C334600 Call dword ptr [0046331C]
:00432B4F C745FC23000000 mov [ebp-04], 00000023
:00432B56 movsx eax, word ptr [0045F642]
:00432B5D 85C0 test eax, eax
:00432B5F 0F8573030000 jne 00432ED8 --->这里可以跳过改为je 00432ED8即0F8473030000
:00432B65 C745FC24000000 mov [ebp-04], 00000024
:00432B6C 8B4D08 mov ecx, dword ptr [ebp+08]
:00432B6F 8B11 mov edx, dword ptr [ecx]
:00432B71 8B4508 mov eax, dword ptr [ebp+08]
:00432B74 50 push eax
:00432B75 FF92F4030000 call dword ptr [edx+000003F4]
:00432B7B 50 push eax
:00432B7C 8D4DB8 lea ecx, dword ptr [ebp-48]
:00432B7F 51 push ecx

* Reference To: MSVBVM50.__vbaObjSet, Ord:0000h
|
:00432B80 FF1544334600 Call dword ptr [00463344]
:00432B86 894588 mov dword ptr [ebp-78], eax
:00432B89 6AFF push FFFFFFFF
:00432B8B 8B5588 mov edx, dword ptr [ebp-78]
:00432B8E 8B02 mov eax, dword ptr [edx]
:00432B90 8B4D88 mov ecx, dword ptr [ebp-78]
:00432B93 51 push ecx
:00432B94 FF505C call [eax+5C]
:00432B97 894584 mov dword ptr [ebp-7C], eax
:00432B9A 837D8400 cmp dword ptr [ebp-7C], 00000000
:00432B9E 7D1D jge 00432BBD
:00432BA0 6A5C push 0000005C

* Possible StringData Ref from Code Obj ->"iO?檉??"
|
:00432BA2 686C254100 push 0041256C
:00432BA7 8B5588 mov edx, dword ptr [ebp-78]
:00432BAA 52 push edx
:00432BAB 8B4584 mov eax, dword ptr [ebp-7C]
:00432BAE 50 push eax

* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00432BAF FF1524334600 Call dword ptr [00463324]
:00432BB5 898564FFFFFF mov dword ptr [ebp+FFFFFF64], eax
:00432BBB EB0A jmp 00432BC7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432B9E(C)
|
:00432BBD C78564FFFFFF00000000 mov dword ptr [ebp+FFFFFF64], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432BBB(U)
|
:00432BC7 8D4DB8 lea ecx, dword ptr [ebp-48]

* Reference To: MSVBVM50.__vbaFreeObj, Ord:0000h
|
:00432BCA FF1504354600 Call dword ptr [00463504]
:00432BD0 C745FC25000000 mov [ebp-04], 00000025
:00432BD7 66837DCC00 cmp word ptr [ebp-34], 0000
:00432BDC 7E07 jle 00432BE5
:00432BDE 66837DCC2D cmp word ptr [ebp-34], 002D
:00432BE3 7E15 jle 00432BFA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432BDC(C)
|
:00432BE5 C745FC26000000 mov [ebp-04], 00000026
:00432BEC 66C70576F04500FFFF mov word ptr [0045F076], FFFF
:00432BF5 E920010000 jmp 00432D1A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432BE3(C)
|
:00432BFA C745FC28000000 mov [ebp-04], 00000028
:00432C01 8B4D08 mov ecx, dword ptr [ebp+08]
:00432C04 8B11 mov edx, dword ptr [ecx]
:00432C06 8B4508 mov eax, dword ptr [ebp+08]
:00432C09 50 push eax
:00432C0A FF9218030000 call dword ptr [edx+00000318]
:00432C10 50 push eax
:00432C11 8D4DB8 lea ecx, dword ptr [ebp-48]
:00432C14 51 push ecx

* Reference To: MSVBVM50.__vbaObjSet, Ord:0000h
|
:00432C15 FF1544334600 Call dword ptr [00463344]
:00432C1B 894588 mov dword ptr [ebp-78], eax
:00432C1E 8D55B4 lea edx, dword ptr [ebp-4C]
:00432C21 52 push edx
:00432C22 6A01 push 00000001
:00432C24 8B4588 mov eax, dword ptr [ebp-78]
:00432C27 8B08 mov ecx, dword ptr [eax]
:00432C29 8B5588 mov edx, dword ptr [ebp-78]
:00432C2C 52 push edx
:00432C2D FF5140 call [ecx+40]
:00432C30 894584 mov dword ptr [ebp-7C], eax
:00432C33 837D8400 cmp dword ptr [ebp-7C], 00000000
:00432C37 7D1D jge 00432C56
:00432C39 6A40 push 00000040
:00432C3B 6804224100 push 00412204
:00432C40 8B4588 mov eax, dword ptr [ebp-78]
:00432C43 50 push eax
:00432C44 8B4D84 mov ecx, dword ptr [ebp-7C]
:00432C47 51 push ecx

* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00432C48 FF1524334600 Call dword ptr [00463324]
:00432C4E 898560FFFFFF mov dword ptr [ebp+FFFFFF60], eax
:00432C54 EB0A jmp 00432C60

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432C37(C)
|
:00432C56 C78560FFFFFF00000000 mov dword ptr [ebp+FFFFFF60], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432C54(U)
|
:00432C60 8B55B4 mov edx, dword ptr [ebp-4C]
:00432C63 895580 mov dword ptr [ebp-80], edx

* Possible StringData Ref from Code Obj ->"330 day trial: " -->试用标志
|
:00432C66 681C024100 push 0041021C
:00432C6B 668B45CC mov ax, word ptr [ebp-34]
:00432C6F 50 push eax

* Reference To: MSVBVM50.__vbaStrI2, Ord:0000h
|
:00432C70 FF15A4324600 Call dword ptr [004632A4]
:00432C76 8BD0 mov edx, eax
:00432C78 8D4DC4 lea ecx, dword ptr [ebp-3C]

* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:00432C7B FF15D0344600 Call dword ptr [004634D0]
:00432C81 50 push eax

* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00432C82 FF150C334600 Call dword ptr [0046330C]
:00432C88 8BD0 mov edx, eax
:00432C8A 8D4DC0 lea ecx, dword ptr [ebp-40]

* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:00432C8D FF15D0344600 Call dword ptr [004634D0]
:00432C93 50 push eax

* Possible StringData Ref from Code Obj ->" days left." -->试用标志
|
:00432C94 68A0374100 push 004137A0

* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00432C99 FF150C334600 Call dword ptr [0046330C]
:00432C9F 8BD0 mov edx, eax
:00432CA1 8D4DBC lea ecx, dword ptr [ebp-44]

* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:00432CA4 FF15D0344600 Call dword ptr [004634D0]
:00432CAA 50 push eax
:00432CAB 8B4D80 mov ecx, dword ptr [ebp-80]
:00432CAE 8B11 mov edx, dword ptr [ecx]
:00432CB0 8B4580 mov eax, dword ptr [ebp-80]
:00432CB3 50 push eax
:00432CB4 FF5254 call [edx+54]
:00432CB7 89857CFFFFFF mov dword ptr [ebp+FFFFFF7C], eax
:00432CBD 83BD7CFFFFFF00 cmp dword ptr [ebp+FFFFFF7C], 00000000
:00432CC4 7D20 jge 00432CE6
:00432CC6 6A54 push 00000054

* Possible StringData Ref from Code Obj ->"貼?檉??"
|
:00432CC8 6814224100 push 00412214
:00432CCD 8B4D80 mov ecx, dword ptr [ebp-80]
:00432CD0 51 push ecx
:00432CD1 8B957CFFFFFF mov edx, dword ptr [ebp+FFFFFF7C]
:00432CD7 52 push edx

* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00432CD8 FF1524334600 Call dword ptr [00463324]
:00432CDE 89855CFFFFFF mov dword ptr [ebp+FFFFFF5C], eax
:00432CE4 EB0A jmp 00432CF0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432CC4(C)
|
:00432CE6 C7855CFFFFFF00000000 mov dword ptr [ebp+FFFFFF5C], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00432CE4(U)
|
:00432CF0 8D45BC lea eax, dword ptr [ebp-44]
:00432CF3 50 push eax
:00432CF4 8D4DC0 lea ecx, dword ptr [ebp-40]
:00432CF7 51 push ecx
:00432CF8 8D55C4 lea edx, dword ptr [ebp-3C]
:00432CFB 52 push edx
:00432CFC 6A03 push 00000003

conanxu[BCG]
conanxu@eastday.com


Vopt99

 标 题:Vopt99另类破解实战录 (3千字)
发信人:Banhouse
时 间:2000-9-27 14:29:58
详细信息:
用Trw2000破解Vopt99实战录

Vopt99是一个用作整理硬盘碎片的磁盘工具（用VB5.0编成的，为什么我会知道？因为我用了UtrlEdit
打开过Vopt99.exe时看见的嘛！），而且有30天的使用限制，除之以外就没有其它限制。所以把时间限制去
除，就算是破解完成了。Loder32或Trw2000的用法请浏览“看雪学宛”主页，那里有Soft-Ice、Trw2000的
使用价绍和下载。本文就假设你已基本了解Soft-Ice、Trw2000这两个软件。。

工件开始啦！

1. 首先，把Vopt99安装一次。输入你的大名、公司名和注册码，Vopt99提示你如没得到注册码，可以用
TRIAL来作试用并按提示完成安装。安装完成后，把系统日期调至使Vopt99叫出时间限对话筐面的日期,
先运行Trw2000,再运行Vopt99，接着Vopt99要求现在注册，但不要这个时候按注册键，Ctrl-N呼出
Trw2000,按数次F12功能键，此时Trw2000返回Vopt99主程序,是时候按取消键啦！此时又返回Trw2000（
因为不知道Vopt99调用的是什么函数所以只好这样做嘛……），接着按数次F10功能键，返回VOPT99!.
TEXT+XXXXX的领空，注意！看当前光标上一行！
.
.
.
0177:00437E1E 56 PUSH ESI
XXXX:XXXX7E1F FF97B0020000 CALL NEAR [EDI+02B0]
XXXX:XXXX7E25 85C0 TEST EAX,EAX ;返回时光标所在，可见上面那个CALL
XXXX:XXXX7E27 7D12 JNL 00437E3B ;个CALL的用途。
.
.
.
XXXX:XXXX7E3B 66833D4296450000 CMP WORD [00459642],BYTE+00
XXXX:XXXX7E43 7469 JZ 00437EAE ;JUMP
.
.
.
XXXX:XXXX7E16 C7458C00FA4000 MOV DWORD [EBP-74],0040FA00 ;用D命令看一看0040FA00 ，你就看会见
;Thank you for your using our product!
;可见上面那个JZ 00437EAE 有问题!那把
;它修改为 90 90
按几下F10功能键来到这里

XXXX:XXXX7EXX CALL MSVBVM50!rtcMsgBox ;出现了注册成功的窗口

由此可见，就这个CALL MSVBVM50!rtcMsgBox带出Vopt99提示时间限制画面！原来Vopt99是用了
这个函数！那么今后就要知道要拦截VB就以可 Bpx rtcMsgBox 来放置段点啦！

按F5功能键，看看结果......退出？？难道还有其它地方要修改？

2. 没办法只好再来一次!

当带过上面那XXXX:XXXX7EXX CALL MSVBVM50!rtcMsgBox时（此时已返回Vopt99主体程序），按确认键（返回
Trw2000），第二次返回Vopt99的领空

0177:00431AE0 837D8800 CMP DWORD [EBP-78],BYTE+00
XXXX:XXXX1AE4 7D20 JNL 00431B06 ;此处Jump并会退出Vopt99，于是把它修改为90 90
.
.
.
XXXX:XXXXXXXX 0FBF0D42964500
XXXX:XXXX1B1E 85C9 TEST ECX,ECX
XXXX:XXXX1B20 7536 JNZ 00431B58 ;此处不Jump并会退出Vopt99，于是把它修改为EB 36
XXXX:XXXXXXXX C745FC2F000000
.
.
.

再一次按F5功能键看看...... Bingo !

整理：

运行16进制编辑器如：UtrlEdit打开Vopt99.exe找刚才抄下的机器代码
1. 找 56 FF 97 B0 02 00 00 85 C0 , 把FF 97 B0 02 00 00 改为 90 90 90 90 90 90
2. 找 66 83 3D 42 96 45 00 00 74 69, 把74 69 改为 90 90
3. 找 83 7D 88 00 7d 20 , 把7d 20 改为 90 90
4. 找 0F BF 0D 42 96 45 00 85 C9 75 36, 把75 36 改为 EB 36

储存后退出并运行Vopt99.exe ，试一试。看见了吗？这和已注册有何区别？

Cracker : BanhouseMaster
E-Mail : banhouse@21cn.com
Phone : (0755)13613070052

标 题:其实只需要把一处的代码改成C3即RET就OK了。 (204字)
发信人:EBjump
时 间:2000-9-27 19:48:45
详细信息:

其实只需要把一处的代码改成C3即RET就OK了。
哪位大虾能搞明白它的算法或搞到它注册码（注册名大于1位的），这个
软件保护太强悍了。希望检验自己能力的朋友可以试一试！（提示：注册码不唯一）

标 题:很久以前的事情了，找了半天老版本的VOPT99，找到一个4.15版。改的地方请进入看 (1千字)
发信人:EBjump
时 间:2000-9-29 21:46:03
详细信息:

本来不想写这篇了，因为已经很长时间没有动笔写教程了。（懒了！呵呵）但马上就到10.1了，当作我送大家的礼物吧。也算看雪老兄一份礼物吧。

改动的地方很简单（4.15）

5DC2040090909090909090558bec83ec186836284000
======================C3====================

大家可以试一试，至于那个启动时候的未注册字样，你愿意怎么改什么名字都可以，比较简单，我就不多说了。这里只想说说这样改的原理。

VOPT是VB5编写的东东，你可以在NuMega SmartCheck受到些启发，更多的是秘密是：如果你分析它的汇编程序，会发现有好些相似的程序过程调用，（即你搜索558bec83ec186836284000字串会发现好些。这也是上面修改的地方我为什么用那么多字串来锁定这个地方。）这些调用是干什么的呢？是调用一个窗体中的各种界面，很怪的是VOPT把所有的界面（你启动看到的包括注册前主程序界面、注册后主程序界面、注册码输入界面、所有你看到的界面都放到一个很大的窗体中。根据条件来判断出现什么样的界面（不知我这么说大家是否明白），不信你可以多搜索几处“558bec83ec186836284000”来修改看看，会有部分界面不显示的情况。呵呵，这点大家没有想到吧。原理就是我把它的未注册部分给RET了，当然出现没有时间限制的注册版界面了。只是在启动时说是未注册版本。这个字样只要捎有些汉化经验的朋友就可以给改掉，这样，改成自己的名字后再打个补丁，这样在VOPT推出新版时放出去，OK就是你破解的了！呵呵。

VOPT的各个版本几乎没有太多变化，如果大家找不到4.15版本试验的话，你可以拿最新版本的VoptMe V5.0来试一试，修改的地方捎不一样，这样：

5DC204009090909090909090558bec83ec1868562F4000
========================C3====================

就这里吧，废话不多说，只希望这篇文章能促进大家的交流，也祝看雪的论坛越来越人气兴旺。Banhouse老兄，我没有骗你吧。我只改了一个地方，其实条条道路通北京嘛。

最后，祝大家10.1玩的开心！撤人！


Vopt99 v4.31

 标 题:Vopt99 v4.31的注册码破解 (11千字)
发信人:superboss
时 间:2000-9-28 8:33:48
详细信息:
Vopt99 v4.31的注册码破解
工具:TRW2000和Wdasm 8.93
目标说明:Vopt99可将分裂在硬盘上不同扇区的文件快速和安全的重整，帮你节省更多时间，
支持FAT16和FAT32格式及中文长文件名，速度特快！真不知道M$的那个是怎么写的！
下载地址:ftp://member.myrice.com/czy/dl3/V99v431.exe
难度：中级?
===========================================================================
运行程序，输入Name:sUpErbOss Location:Super Personal key:1234567890ABCDEFGHIJ
按Ctrl-N切换到TRW2000下，设段BPX HMEMCPY，点击“OK”按钮，被拦下,打"BD *"。
按几次F12键，回到Vopt99模组下，再一直按F10键，直到下面所指的重点处：

:00456F63 8BF8 mov edi, eax
:00456F65 FF91A0000000 call dword ptr [ecx+000000A0]
:00456F6B 3BC3 cmp eax, ebx <----我们首先在此登陆！
:00456F6D 7D12 jge 00456F81
:00456F6F 68A0000000 push 000000A0
:00456F74 68A4244100 push 004124A4
.
.
.
* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:004570B0 FF15C4D44500 Call dword ptr [0045D4C4]
:004570B6 8D4DE4 lea ecx, dword ptr [ebp-1C]
:004570B9 51 push ecx
:004570BA E87124FDFF call 00429530 <-----重点哦！！(按F8键吧！^_^)
:004570BF 8D55E4 lea edx, dword ptr [ebp-1C]
:004570C2 8D45E8 lea eax, dword ptr [ebp-18]

进去后，很快来到下面所指的地方，现在该明白了，注册码为什么要输20个字符吧？！
还有啦！呆会儿，程序会把输入的字符打乱，未免产生混乱，所以要按一定的顺序输入注册码！
这是破解软件的好习惯！

* Reference To: MSVBVM50.__vbaLenBstr, Ord:0000h
|
:004295ED 8B3DC4D24500 mov edi, dword ptr [0045D2C4]
:004295F3 FFD7 call edi
:004295F5 33DB xor ebx, ebx
:004295F7 83F814 cmp eax, 00000014 <-----注册码长度要为20个字符
:004295FA 0F94C3 sete bl
:004295FD A148964500 mov eax, dword ptr [00459648]
:00429602 50 push eax
:00429603 FFD7 call edi
:00429605 33C9 xor ecx, ecx
:00429607 83F805 cmp eax, 00000005 <-----Location的长度不能小于5个字符
:0042960A 0F9DC1 setnl cl
:0042960D 85D9 test ecx, ebx
:0042960F 0F8599000000 jne 004296AE
.
.
.
:00429BCC 50 push eax <-----"IGJFH"
:00429BCD 8B55A0 mov edx, dword ptr [ebp-60]
:00429BD0 52 push edx <-----"CEPUB"

* Reference To: MSVBVM50.__vbaStrCmp, Ord:0000h
|
:00429BD1 FF1590D34500 Call dword ptr [0045D390] <---注册码的第一个比对处！
:00429BD7 8BD8 mov ebx, eax
:00429BD9 F7DB neg ebx
:00429BDB 1BDB sbb ebx, ebx
:00429BDD 43 inc ebx
:00429BDE F7DB neg ebx

看到上面的比对后，二话不说，先在00429BD1处设段（什么键？！当然是F9键啦)，再改注册码:"1234567890ABCDEUEBCP"
再往下走，就到了程序的迷魂阵了，在主程序中什么也找不到！
其实，Vopt99还借助了第三方的注册码校验器，它就是ShareLock，其主文件shrlk21.dll位于系统目录下。
用WDasm反汇编后，会找到如下的输出函数，这就是我们的突破点，Let's Go!!
按Ctrl-N切换到TRW2000下,打"pdll32 shrlk21.dll",按F5键回到系统，将Vopt99关闭。
被拦下后，记一下当前指令的地址(即shrlk21.dll入口处的地址),将它与Wdasm中shrlk21.dll的入口地址比较一下，如：
指令的地址为00F88E50，而Wdasm中显示的为00448E50，那么下面可这样打"BPX 00F87548"。
重新输入注册码："1234567890ABCDEUEBCP"，点击“OK”按钮，被拦下,打"BD *"。
接着，一直按F10键往下走，到了核心Call_1处，按F8键进入:

Exported fn(): InputUnlockCode - Ord:000Ch
:00447548 55 push ebp
:00447549 8BEC mov ebp, esp
:0044754B 6A00 push 00000000
:0044754D 6A00 push 00000000
:0044754F 6A00 push 00000000
:00447551 33C0 xor eax, eax
:00447553 55 push ebp
:00447554 68AD754400 push 004475AD
:00447559 64FF30 push dword ptr fs:[eax]
:0044755C 648920 mov dword ptr fs:[eax], esp
:0044755F 8D45FC lea eax, dword ptr [ebp-04]
:00447562 8B5510 mov edx, dword ptr [ebp+10]
:00447565 E8C6C4FBFF call 00403A30
:0044756A 8B45FC mov eax, dword ptr [ebp-04]
:0044756D 50 push eax
:0044756E 8D45F8 lea eax, dword ptr [ebp-08]
:00447571 8B550C mov edx, dword ptr [ebp+0C]
:00447574 E8B7C4FBFF call 00403A30
:00447579 8B45F8 mov eax, dword ptr [ebp-08]
:0044757C 50 push eax
:0044757D 8D45F4 lea eax, dword ptr [ebp-0C]
:00447580 8B5508 mov edx, dword ptr [ebp+08]
:00447583 E8A8C4FBFF call 00403A30
:00447588 8B45F4 mov eax, dword ptr [ebp-0C]
:0044758B 5A pop edx
:0044758C 59 pop ecx
:0044758D E8F2D5FFFF call 00444B84 <----核心Call_1！(别忘了按F8键哦!)
:00447592 33C0 xor eax, eax

进入核心Call_1后，再一直按F10键往下走，直到核心Call_2处，按F8键进入:

:00444B84 55 push ebp
:00444B85 8BEC mov ebp, esp
:00444B87 83C4E8 add esp, FFFFFFE8
:00444B8A 53 push ebx
:00444B8B 33DB xor ebx, ebx
:00444B8D 895DE8 mov dword ptr [ebp-18], ebx
:00444B90 894DF4 mov dword ptr [ebp-0C], ecx
:00444B93 8955F8 mov dword ptr [ebp-08], edx
:00444B96 8945FC mov dword ptr [ebp-04], eax
:00444B99 8B45FC mov eax, dword ptr [ebp-04]
:00444B9C E80BF1FBFF call 00403CAC
:00444BA1 8B45F8 mov eax, dword ptr [ebp-08]
:00444BA4 E803F1FBFF call 00403CAC
:00444BA9 8B45F4 mov eax, dword ptr [ebp-0C]
:00444BAC E8FBF0FBFF call 00403CAC
:00444BB1 33C0 xor eax, eax
:00444BB3 55 push ebp
:00444BB4 68524D4400 push 00444D52
:00444BB9 64FF30 push dword ptr fs:[eax]
:00444BBC 648920 mov dword ptr fs:[eax], esp
:00444BBF C645F300 mov [ebp-0D], 00
:00444BC3 C645F300 mov [ebp-0D], 00
:00444BC7 33C0 xor eax, eax
:00444BC9 8945EC mov dword ptr [ebp-14], eax
:00444BCC 803D8DA8440000 cmp byte ptr [0044A88D], 00
:00444BD3 741D je 00444BF2
:00444BD5 8D45EC lea eax, dword ptr [ebp-14]
:00444BD8 50 push eax
:00444BD9 8D45E8 lea eax, dword ptr [ebp-18]
:00444BDC 50 push eax

* Reference To: ShrLk21.GetDriveNumber
|
:00444BDD E84E300000 call 00447C30
:00444BE2 8B55E8 mov edx, dword ptr [ebp-18]
:00444BE5 8D4DF3 lea ecx, dword ptr [ebp-0D]
:00444BE8 8B45FC mov eax, dword ptr [ebp-04]
:00444BEB E8AC010000 call 00444D9C
:00444BF0 EB1D jmp 00444C0F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00444BD3(C)
|
:00444BF2 8D45EC lea eax, dword ptr [ebp-14]
:00444BF5 50 push eax
:00444BF6 8D55E8 lea edx, dword ptr [ebp-18]
:00444BF9 8B45F8 mov eax, dword ptr [ebp-08]
:00444BFC E85B2AFCFF call 0040765C
:00444C01 8B55E8 mov edx, dword ptr [ebp-18]
:00444C04 8D4DF3 lea ecx, dword ptr [ebp-0D]
:00444C07 8B45FC mov eax, dword ptr [ebp-04]
:00444C0A E88D010000 call 00444D9C <----核心Call_2! (别忘了按F8键哦!)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00444BF0(U)
|
:00444C0F 8A45F3 mov al, byte ptr [ebp-0D]

进了核心Call_2，就到站啦！往下看吧！

:00444D9C 55 push ebp
:00444D9D 8BEC mov ebp, esp
:00444D9F 83C4E4 add esp, FFFFFFE4
:00444DA2 53 push ebx
:00444DA3 33DB xor ebx, ebx
:00444DA5 895DE8 mov dword ptr [ebp-18], ebx
.
.
.
:00444E59 8AC3 mov al, bl
:00444E5B 83E841 sub eax, 00000041 <---eax必须为41，即字母"A"
:00444E5E 6BC01A imul eax, 0000001A
:00444E61 33D2 xor edx, edx
:00444E63 8A55EF mov dl, byte ptr [ebp-11] <---dl必须也为41，即字母"A"
:00444E66 83EA41 sub edx, 00000041
:00444E69 03C2 add eax, edx
:00444E6B 8B5508 mov edx, dword ptr [ebp+08]
:00444E6E 8902 mov dword ptr [edx], eax <---eax必须为0，下面会比对！
:00444E70 33DB xor ebx, ebx
.
.
:00444EAF 8BD3 mov edx, ebx
:00444EB1 E8BA070000 call 00445670
:00444EB6 8B55E8 mov edx, dword ptr [ebp-18] <------"1C41A5EAD6F2"
:00444EB9 8B45FC mov eax, dword ptr [ebp-04] <------"54B7DE038296"
:00444EBC E847EDFBFF call 00403C08 <----比对注册码！(光带移到此处，按F9键设段)
:00444EC1 7506 jne 00444EC9
:00444EC3 8B45F4 mov eax, dword ptr [ebp-0C]
:00444EC6 C60001 mov byte ptr [eax], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00444EC1(C)
|
:00444EC9 8B4508 mov eax, dword ptr [ebp+08]
:00444ECC 833800 cmp dword ptr [eax], 00000000 <----[eax]的值必须为0
:00444ECF 750C jne 00444EDD
:00444ED1 807DEE43 cmp byte ptr [ebp-12], 43 <------[ebp-12]的值必须为"C"
:00444ED5 7406 je 00444EDD
:00444ED7 8B45F4 mov eax, dword ptr [ebp-0C]
:00444EDA C60000 mov byte ptr [eax], 00

注意哦！Vopt99在核心Call_2中设置了一个小小的陷阱,第一次打"D EDX"，看到的注册码是假的。如果你用假的注册码
注册，程序也会显示注册成功，但在About对话框中，会显示授权给非法的版本。再次启动Vopt99，根本就不能运行了！
所以，第一次到这时，设置一个断点，按F5键再次拦下，这时打"D EDX",看到的注册码才是真的。
下面排一下注册码：
1 2 3 4 5 6 7 8 9 0 A B C D E U E B C P
| | | | | | | | | | | | | | |
| 6 A C 1 2 1 D F E | 4 | A 5
C A A
很明显，注册码为"C6AC121DFEA4AA5UEBCP",重新输入，成功啦！
不过，此注册码并不能流通，也就是说，不同的机器，注册码是不一样的！可能还有安装时间或机器硬件信息也参与了注册码
的运算,看来只能用算号器，来得到注册码了！:（


超级魔法兔子设置 V3.8

 标 题:anti-homeMade(3): 超级魔法兔子设置 V3.8 及简单VB程序的破解思路 (1千字)
发信人:6767
时 间:2001-5-20 18:24:36
详细信息:
超级魔法兔子设置 V3.8 及简单VB程序的破解思路
crack by 6767

工具：使用SOFTICE
说明：注册表设置软件，比较好用
地址：http://www.csdn.net/soft/openfile.asp?kind=1&id=9909
别处也可当到

整个下午一边听 THE CURE，一边分析代码，很爽(我这里没有马丁尼，只有白开水)。这是一个 VB5 软件，注册机我是不大可能作出来的 :-)。注册码在网上很容易得到，但重要的是得到的方法。
为什么要用SOFTICE来找注册码？原因很简单：在SMARTCHECK下无法正常运行，见不到界面。要记得在winice.dat包含VB5的运行库。

运行魔法兔子，它要求你输入注册信息，选“cancel”跳过。然后直接关闭魔法兔子，还是要求输入注册信息，在名字处输入：67676767，注册码：123654987，单击“OK”退出。

之后在SI中下断点：Bpx __vbaStrComp (记得是两个 '_'， 我以前也不知道)。再运行魔法兔子，立刻被中断，下 Bd * 关掉断点。小心的按几次F10向下追踪，你会在代码窗口中见到下面的指令：

PUSH EAX
PUSH DWORD PTR [EBP+0C]
PUSH DWORD PTR [EBP+10]
CALL *******
TEST EAX,EAX
........

这里有三条PUSH 指令，随便在其中一条上双击鼠标设断点，并用 Bpe 将其改为 Bpx ###### do "d ebp->10"，再按下F5返回。如果一切顺利立刻又会中断回来，以下所要作的是狂按 F5 ，大致有50次，直到在数据窗口中见到输入的注册码为止。这时下 d ebp->c, 能看到的就是你的注册码，把它记下来。下 Bd *关断点。退出魔法兔子，输入注册码，确定。再运行，NAG不见了，是不是有点简单？

一开始我用6767作名字注册，能得到注册码，但就是不成功，i6767、chani也不行，原来它是检查名字的长度，但我没有找到。

注册码是9字节，不区分大小写，注册信息存放于：
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Super Rabbit\MagicSet]
"Version"=" V3.8"
"RegName"="67676767"
"RegCode"="1K3OLBCD0"

美中不足处在于即使已经注册，程序界面那个大大广告窗口仍存在，而且菜单项也不变。眼不见心不烦，立刻被我清出硬盘。


聪明搬运工2.1

 标 题:不完全的破解
发信人:chn-boy
时 间:2000-11-23 13:03:07
详细信息:
软件名称：聪明搬运工2.1珍藏版
软件类型：VB程序
动态库：VBRUN300.DLL
使用工具：SoftICE4.05

目的：想得出注册码

运行BOXMAN程序后，出现一个注册窗口，输入姓名和Virtual注册码，我输入的是：

Name：chn-boy
Code：123456789087654321

Ctrl+D启动SoftICE4.05，下断点：bpx hmemcpy，F5回到Windows，点注册，程序
被拦断，下命令：bd * ，让Hmemcpy断点不再激活。F12数下，当到VBRUN300的领空时
候，下命令搜索VBRUN300的核心字符串比较代码点：

S 30:0 L FFFFFFFF 8B,CA,F3,A6,74,01,9F,92,8D,5E,08

SoftICE能得到一个Pattern地址，我的是：Pattern found at 0030:816930CF (816930CF)
得到的地址即为VBRUN300的字符串比较核心代码处，然后 bpx 30:816930CF do "d ds:di"
F5以后，你就可以看到下段程序：

2A4F:8CA4 CALL 9103
2A4F:8CA7 MOV DI,BX
2A4F:8CA9 POP DX
2A4F:8CAA CMP DX,CX
2A4F:8CAC LAHF
2A4F:8CAD JA 8CB1
2A4F:8CAF MOV CX,DX <-- 其实上述断点是下在这个地方，程序中断于此

2A4F:8CB1 REPZ CMPSB <-- 这个就是字符串比较指令了，第一次到这里的
时候，你可以看到你输入的Virtual Code。
2A4F:8CB3 JZ 8CB6
2A4F:8CB5 LAHF
2A4F:8CB6 XCHG AX,DX
2A4F:8CB7 LEA BX,[BP+08]
2A4F:8CBA CALL 92CB
2A4F:8CBD POP BX
2A4F:8CBE TEST BL,01
2A4F:8CC1 JNZ 8CC9
2A4F:8CC3 LEA BX,[BP+0C]

下命令d es:di，你可以看到数据区显示的是"-"，不用管他，继续按F5。要按多少下，是根据
你输入的Code长度决定（注：输入的Virtual Code长度要足够长，要不将得不到注册码，好像
要不小于16个字符吧？具体我没有测试过）。按F5到一定的多下的时候，你就可以看到在你的
数据区出现一串字符串。我的是4C99379193C6 24D

383F:0000027C 34 43 39 39 33 37 39 31-39 33 43 36 20 32 34 44 4C99379193C6 24D
383F:0000028C 03 00 37 32 0F 00 35 36-37 38 39 30 38 37 36 35 ..72..5678908765
383F:0000029C 34 33 32 31 0F 00 0C 00-31 32 33 34 35 36 37 38 4321....12345678
383F:000002AC 39 30 38 37 05 00 01 00-36 32 0F 00 35 36 37 38 9087....62..5678

这时，你 d es:di，就可以看到你原来输入的Virtual Code了。那么ds:si中的字符串内容
就是你的注册码了，bd *，F5，回到Windows，重新在注册码框中输入你得到的字符串，我
的就是4C99379193C6 24D，点注册，弹出一个对话框“请向作者注册”。其实说白了就是注
册仍然没有成功，不过我估计这可能还缺少一个文件，需要作者补齐吧。在往下我没有深入
的研究了，看看那位高手帮忙解决这个问题。诚盼！

后记：这其实是一个不完全的破解，我也是个新手，很多地方我都不懂，也是在一步一步学
习，希望老一辈给予指教。


共创校园办公系统

标 题:给大家拜年奉上破烂文一条Cracking (1千字)
发信人:kernelfeng
时 间:2001-1-23 21:53:39
详细信息:
首先,大家过年好，本人写了第一篇破解文章
文采全无，大家当笑话看得了，当是新年礼物。

常来这里看人家破戒文章，自己也想侃侃而谈写一篇
本人正在一家公司作开发校园办公系统的工作
无奈想看看别人程序的功能，我就借来一套别人软件
<<共创校园办公系统>> http://www.jsccsoft.com
这东西用VB写的，是根据硬件信息加的密,密码需要
到公司注册，本人用简单的方法使其

“不再挑婆家，是男人就嫁”。

破戒方法

已装此软件机为: Y
要装的机器为: R

我看了Y的注册表找到了点东西

REGEDIT4

[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\CCSoft License]

[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\CCSoft License\01001]
"username"="fengyang"
"SerialNumber"="01001-000001-2628"
"LicenseKey"="354288029"

[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\CCSoft License\ProductID]
"0"="01001"

把它拷到R上，Double click the reg file

用安装盘安装R ,你会发现注册号，已填好。

不过装完不能用,(能用就不用写了:)

用TRW 追Y上的应用程序，发现它们都对一个叫
NJSSCommLib32.dll的小有暧昧的关系
用PDLL32 njsscommlib32截获
我发现它有一个export called GetHDKey
Now bpx getHDKey
when Trw repops up and you press
F12 我用D *(esp+4)发现string "GTQ15890\0"
in data window. 我记下了。

我在R上试追不能正常运行的应用,当然这次又碰
到这个叫NJSSCommLib32.dll的小子，不过这次
他返回不是string "GTQ15890\0"（怪不得我和
应用之间夫妻关系不好，第三者插足!），

(我说我这张旧船票
还能否登上你的破船)

我趁机将其
改回"GTQ151890\0", 嘿!

结果呢？
~~~~涛声依旧了~~~~ :>

（夫妻关系不会恢复正常,重新启动应用还须上述过程
:注册表不用改了,不过NJSSCommlib32.dll 可就......
,所以为NJSSCommLib32.dll需要做个Patch）


华琦库管精灵1.2.4

 标 题:破解华琦库管精灵1.2.4 (8千字)
发信人:Z-H
时 间:2000-9-11 22:27:46
详细信息:
破解华琦库管精灵1.2.4
注册时随便输入8位非零字符的注册码即可注册成功，但在录入数据时提示注册不正确。
其过程序如下：

* Possible StringData Ref from Code Obj ->"EoF"
|
:0047D9BC 6818104100 push 00411018

* Reference To: MSVBVM60.__vbaStrCmp, Ord:0000h
|
:0047D9C1 8B3548114000 mov esi, dword ptr [00401148]
:0047D9C7 FFD6 call esi
:0047D9C9 85C0 test eax, eax 录入数据时比较
:0047D9CB 0F8424010000 je 0047DAF5 -->> 0F8524010000如注册码正确则跳
:0047D9D1 BA05000000 mov edx, 00000005
:0047D9D6 A124D14D00 mov eax, dword ptr [004DD124]
:0047D9DB 2B5014 sub edx, dword ptr [eax+14]
:0047D9DE 8B400C mov eax, dword ptr [eax+0C]
:0047D9E1 8B0C90 mov ecx, dword ptr [eax+4*edx]
:0047D9E4 51 push ecx

* Possible StringData Ref from Code Obj ->"00000000"
|
:0047D9E5 6824104100 push 00411024
:0047D9EA FFD6 call esi
:0047D9EC 85C0 test eax, eax
:0047D9EE 757C jne 0047DA6C
:0047D9F0 8D55B0 lea edx, dword ptr [ebp-50]
:0047D9F3 52 push edx

* Reference To: MSVBVM60.rtcGetDateVar, Ord:0262h
|
:0047D9F4 FF15A0124000 Call dword ptr [004012A0]
:0047D9FA B902000000 mov ecx, 00000002
:0047D9FF A124D14D00 mov eax, dword ptr [004DD124]
:0047DA04 2B4814 sub ecx, dword ptr [eax+14]
:0047DA07 8B500C mov edx, dword ptr [eax+0C]
:0047DA0A 8B048A mov eax, dword ptr [edx+4*ecx]
:0047DA0D 50 push eax

* Reference To: MSVBVM60.__vbaDateStr, Ord:0000h
|
:0047DA0E FF15E8114000 Call dword ptr [004011E8]
:0047DA14 DD9D58FFFFFF fstp qword ptr [ebp+FFFFFF58]
:0047DA1A C78550FFFFFF07000000 mov dword ptr [ebp+FFFFFF50], 00000007
:0047DA24 8D4DB0 lea ecx, dword ptr [ebp-50]
:0047DA27 51 push ecx
:0047DA28 8D9550FFFFFF lea edx, dword ptr [ebp+FFFFFF50]
:0047DA2E 52 push edx
:0047DA2F 8D45A0 lea eax, dword ptr [ebp-60]
:0047DA32 50 push eax

* Reference To: MSVBVM60.__vbaVarSub, Ord:0000h
|
:0047DA33 FF1504104000 Call dword ptr [00401004]
:0047DA39 50 push eax

* Reference To: MSVBVM60.__vbaI4Var, Ord:0000h
|
:0047DA3A FF1594124000 Call dword ptr [00401294]
:0047DA40 8BF0 mov esi, eax
:0047DA42 8D4DB0 lea ecx, dword ptr [ebp-50]

* Reference To: MSVBVM60.__vbaFreeVar, Ord:0000h
|
:0047DA45 FF1524104000 Call dword ptr [00401024]
:0047DA4B 83FE1E cmp esi, 0000001E
:0047DA4E 7F10 jg 0047DA60
:0047DA50 85F6 test esi, esi
:0047DA52 7C0C jl 0047DA60
:0047DA54 C745DC00000000 mov [ebp-24], 00000000
:0047DA5B E9DC000000 jmp 0047DB3C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047DA4E(C), :0047DA52(C)
|
:0047DA60 C745DC01000000 mov [ebp-24], 00000001
:0047DA67 E9D0000000 jmp 0047DB3C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047D9EE(C)
|
:0047DA6C 8B0D24D14D00 mov ecx, dword ptr [004DD124]
:0047DA72 8B4114 mov eax, dword ptr [ecx+14]
:0047DA75 8B490C mov ecx, dword ptr [ecx+0C]
:0047DA78 8D148500000000 lea edx, dword ptr [4*eax+00000000]
:0047DA7F 8BF9 mov edi, ecx
:0047DA81 2BFA sub edi, edx
:0047DA83 8B5704 mov edx, dword ptr [edi+04]
:0047DA86 52 push edx
:0047DA87 BA03000000 mov edx, 00000003
:0047DA8C 2BD0 sub edx, eax
:0047DA8E 8B0491 mov eax, dword ptr [ecx+4*edx]
:0047DA91 50 push eax

* Reference To: MSVBVM60.__vbaStrCat, Ord:0000h
|
:0047DA92 FF156C104000 Call dword ptr [0040106C]
:0047DA98 8BD0 mov edx, eax
:0047DA9A 8D4DD8 lea ecx, dword ptr [ebp-28]

* Reference To: MSVBVM60.__vbaStrMove, Ord:0000h
|
:0047DA9D 8B3DF0124000 mov edi, dword ptr [004012F0]
:0047DAA3 FFD7 call edi
:0047DAA5 B905000000 mov ecx, 00000005
:0047DAAA A124D14D00 mov eax, dword ptr [004DD124]
:0047DAAF 2B4814 sub ecx, dword ptr [eax+14]
:0047DAB2 8B500C mov edx, dword ptr [eax+0C]
:0047DAB5 8B048A mov eax, dword ptr [edx+4*ecx]
:0047DAB8 50 push eax
:0047DAB9 8D4DD8 lea ecx, dword ptr [ebp-28]
:0047DABC 51 push ecx
:0047DABD E85E27FDFF call 00450220
:0047DAC2 8BD0 mov edx, eax
:0047DAC4 8D4DD4 lea ecx, dword ptr [ebp-2C]
:0047DAC7 FFD7 call edi
:0047DAC9 50 push eax
:0047DACA FFD6 call esi
:0047DACC 8BF0 mov esi, eax
:0047DACE F7DE neg esi
:0047DAD0 1BF6 sbb esi, esi
:0047DAD2 46 inc esi
:0047DAD3 F7DE neg esi
:0047DAD5 8D55D4 lea edx, dword ptr [ebp-2C]
:0047DAD8 52 push edx
:0047DAD9 8D45D8 lea eax, dword ptr [ebp-28]
:0047DADC 50 push eax
:0047DADD 6A02 push 00000002

* Reference To: MSVBVM60.__vbaFreeStrList, Ord:0000h
|
:0047DADF FF156C124000 Call dword ptr [0040126C]
:0047DAE5 83C40C add esp, 0000000C
:0047DAE8 66F7DE neg si
:0047DAEB 1BF6 sbb esi, esi
:0047DAED 83C603 add esi, 00000003
:0047DAF0 8975DC mov dword ptr [ebp-24], esi
:0047DAF3 EB47 jmp 0047DB3C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047D9CB(C)
|
:0047DAF5 8B0D38D04D00 mov ecx, dword ptr [004DD038]
:0047DAFB 51 push ecx

* Possible StringData Ref from Code Obj ->"storage.Dat"
|
:0047DAFC 683C114100 push 0041113C

* Reference To: MSVBVM60.__vbaStrCat, Ord:0000h
|
:0047DB01 FF156C104000 Call dword ptr [0040106C]
:0047DB07 8BD0 mov edx, eax
:0047DB09 8D4DD8 lea ecx, dword ptr [ebp-28]

* Reference To: MSVBVM60.__vbaStrMove, Ord:0000h
|
:0047DB0C FF15F0124000 Call dword ptr [004012F0]
:0047DB12 50 push eax

* Reference To: MSVBVM60.rtcFileLen, Ord:0242h
|
:0047DB13 FF1584124000 Call dword ptr [00401284]
:0047DB19 33D2 xor edx, edx
:0047DB1B 3DA0F70300 cmp eax, 0003F7A0
:0047DB20 0F9FC2 setg dl
:0047DB23 F7DA neg edx
:0047DB25 8BF2 mov esi, edx
:0047DB27 8D4DD8 lea ecx, dword ptr [ebp-28]

* Reference To: MSVBVM60.__vbaFreeStr, Ord:0000h
|
:0047DB2A FF153C134000 Call dword ptr [0040133C]
:0047DB30 6685F6 test si, si 再一次比较注册信息
:0047DB33 7407 je 0047DB3C -->> EB07注册信息正确才跳
:0047DB35 C745DC04000000 mov [ebp-24], 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047DA5B(U), :0047DA67(U), :0047DAF3(U), :0047DB33(C)
|
:0047DB3C 6A52 push 00000052
:0047DB3E 8D45B0 lea eax, dword ptr [ebp-50]
:0047DB41 50 push eax

* Reference To: MSVBVM60.rtcVarBstrFromAnsi, Ord:0260h
|
:0047DB42 8B3500124000 mov esi, dword ptr [00401200]
:0047DB48 FFD6 call esi
:0047DB4A 6A65 push 00000065
:0047DB4C 8D4DA0 lea ecx, dword ptr [ebp-60]
:0047DB4F 51 push ecx
:0047DB50 FFD6 call esi
:0047DB52 6A67 push 00000067
:0047DB54 8D5580 lea edx, dword ptr [ebp-80]
:0047DB57 52 push edx
:0047DB58 FFD6 call esi

* Possible StringData Ref from Code Obj ->"State"

标 题:今天看见IceWorld破解的此软件 (6千字)
发信人:Z-H
时 间:2000-9-12 21:47:00
详细信息:

今天看见IceWorld破解的此软件，分析并试用了一下感觉有点不完整，录入数据时还是提示注册不正确。现分析如下：

* Reference To: MSVBVM60.__vbaStrCmp, Ord:0000h
|
:004D5163 FF1548114000 Call dword ptr [00401148]
:004D5169 85C0 test eax, eax
:004D516B 0F8424010000 je 004D5295
:004D5171 A124D14D00 mov eax, dword ptr [004DD124]
:004D5176 B905000000 mov ecx, 00000005
:004D517B 8B5014 mov edx, dword ptr [eax+14]
:004D517E 2BCA sub ecx, edx
:004D5180 8B500C mov edx, dword ptr [eax+0C]
:004D5183 8B048A mov eax, dword ptr [edx+4*ecx]
:004D5186 50 push eax

* Possible StringData Ref from Code Obj ->"00000000" （这个字符串是软件中提示的注册码，其实只要任意输入8位非0有效数字即可）
|
:004D5187 6824104100 push 00411024

* Reference To: MSVBVM60.__vbaStrCmp, Ord:0000h
|
:004D518C FF1548114000 Call dword ptr [00401148]
:004D5192 8BD8 mov ebx, eax
:004D5194 A124D14D00 mov eax, dword ptr [004DD124]
:004D5199 F7DB neg ebx
:004D519B 8B5014 mov edx, dword ptr [eax+14]
:004D519E B905000000 mov ecx, 00000005
:004D51A3 1BDB sbb ebx, ebx
:004D51A5 2BCA sub ecx, edx
:004D51A7 8B500C mov edx, dword ptr [eax+0C]
:004D51AA F7DB neg ebx
:004D51AC 8B048A mov eax, dword ptr [edx+4*ecx]
:004D51AF 50 push eax

* Reference To: MSVBVM60.__vbaLenBstr, Ord:0000h
|
:004D51B0 FF1530104000 Call dword ptr [00401030]
:004D51B6 B908000000 mov ecx, 00000008
:004D51BB 33D2 xor edx, edx
:004D51BD 3BC1 cmp eax, ecx
:004D51BF 897D8C mov dword ptr [ebp-74], edi
:004D51C2 0F94C2 sete dl
:004D51C5 85DA test edx, ebx
:004D51C7 897584 mov dword ptr [ebp-7C], esi
:004D51CA 897D9C mov dword ptr [ebp-64], edi
:004D51CD 897594 mov dword ptr [ebp-6C], esi
:004D51D0 897DAC mov dword ptr [ebp-54], edi
:004D51D3 8975A4 mov dword ptr [ebp-5C], esi
:004D51D6 7559 jne 004D5231 ------->>>IceWorld只将此改为eb59

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:004D51D8 8B1DBC124000 mov ebx, dword ptr [004012BC]
:004D51DE 898D34FFFFFF mov dword ptr [ebp+FFFFFF34], ecx
:004D51E4 8D9534FFFFFF lea edx, dword ptr [ebp+FFFFFF34]
:004D51EA 8D4DB4 lea ecx, dword ptr [ebp-4C]
:004D51ED C7853CFFFFFFB4084100 mov dword ptr [ebp+FFFFFF3C], 004108B4
:004D51F7 FFD3 call ebx
:004D51F9 8D4584 lea eax, dword ptr [ebp-7C]
:004D51FC 8D4D94 lea ecx, dword ptr [ebp-6C]
:004D51FF 50 push eax
:004D5200 8D55A4 lea edx, dword ptr [ebp-5C]
:004D5203 51 push ecx
:004D5204 52 push edx
:004D5205 8D45B4 lea eax, dword ptr [ebp-4C]
:004D5208 6A40 push 00000040
:004D520A 50 push eax

* Reference To: MSVBVM60.rtcMsgBox, Ord:0253h
|
:004D520B FF15C4104000 Call dword ptr [004010C4]
:004D5211 8D4D84 lea ecx, dword ptr [ebp-7C]
:004D5214 8D5594 lea edx, dword ptr [ebp-6C]
:004D5217 51 push ecx
:004D5218 8D45A4 lea eax, dword ptr [ebp-5C]
:004D521B 52 push edx
:004D521C 8D4DB4 lea ecx, dword ptr [ebp-4C]
:004D521F 50 push eax
:004D5220 51 push ecx
:004D5221 6A04 push 00000004

* Reference To: MSVBVM60.__vbaFreeVarList, Ord:0000h
|
:004D5223 FF1538104000 Call dword ptr [00401038]
:004D5229 83C414 add esp, 00000014
:004D522C E9B0FDFFFF jmp 004D4FE1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D51D6(C)
|

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:004D5231 8B1DBC124000 mov ebx, dword ptr [004012BC]
:004D5237 898D34FFFFFF mov dword ptr [ebp+FFFFFF34], ecx
:004D523D 8D9534FFFFFF lea edx, dword ptr [ebp+FFFFFF34]
:004D5243 8D4DB4 lea ecx, dword ptr [ebp-4C]
:004D5246 C7853CFFFFFF90084100 mov dword ptr [ebp+FFFFFF3C], 00410890
:004D5250 FFD3 call ebx
:004D5252 8D5584 lea edx, dword ptr [ebp-7C]
:004D5255 8D4594 lea eax, dword ptr [ebp-6C]
:004D5258 52 push edx
:004D5259 8D4DA4 lea ecx, dword ptr [ebp-5C]
:004D525C 50 push eax
:004D525D 51 push ecx
:004D525E 8D55B4 lea edx, dword ptr [ebp-4C]
:004D5261 6A24 push 00000024
:004D5263 52 push edx

* Reference To: MSVBVM60.rtcMsgBox, Ord:0253h
|
:004D5264 FF15C4104000 Call dword ptr [004010C4]
:004D526A 8945EC mov dword ptr [ebp-14], eax
:004D526D 8D4584 lea eax, dword ptr [ebp-7C]
:004D5270 8D4D94 lea ecx, dword ptr [ebp-6C]
:004D5273 50 push eax
:004D5274 8D55A4 lea edx, dword ptr [ebp-5C]
:004D5277 51 push ecx
:004D5278 8D45B4 lea eax, dword ptr [ebp-4C]
:004D527B 52 push edx
:004D527C 50 push eax
:004D527D 6A04 push 00000004

* Reference To: MSVBVM60.__vbaFreeVarList, Ord:0000h
|
:004D527F FF1538104000 Call dword ptr [00401038]
:004D5285 8B45EC mov eax, dword ptr [ebp-14]
:004D5288 83C414 add esp, 00000014
:004D528B 83F806 cmp eax, 00000006
:004D528E 7475 je 004D5305
:004D5290 E94CFDFFFF jmp 004D4FE1


开心斗地主1.6

标 题:开心斗地主1.6标准版 注册码破解 (4千字)
发信人:Leafred
时 间:2001-4-25 21:33:04
详细信息:
这几天在研究Crack，为了研究VB PCode Crack方法，就找了这个
开心斗地主的最新版本来试手。

开心斗地主1.6标准版，的确不错，挺好完的。它的保护方法也挺
乐的。刚安装上它的时候，你有30次使用次数，就为了保护这个次数
开心斗地主也完了不少花招，注册表里记录的是没用的，它在系统system
目录下生成两个文件Olive.DLL和Coierd.CPL，其中以Coierd.CPL为主。
实际上Coierd.CPL是Olive.DLL的内容以ASC码值存储。一但发现这些信息
不符，立即提示说非法注册，好阴险哦。

当然我们不会局限于这种修改，现在我们就开始用工具来获取真正的注册码。
先用fileinfo来检查一下开心斗地主是否加壳，哈哈，UPX V1.06几个大字显示眼前，
OK，UPX的-d选项来脱壳，好了，现在用W32Dasm来反汇编，看有没有什么收获，
嗯，这个字符串“UFO8769967”有点可疑，进入引用之处看看，啊哟，太多了，
引用它的地方太多了，算了，还是用TRW2000来对付它吧。

OK，先把MSVBVM50.dll，拷贝到TRW200的DLL目录下面，因为待会我们要用
rtcMsgBox来作断点。运行TRW2000，提示已经Load MSVBVM50.dll，现在读入
开心斗地主，到注册窗口，输入注册名，注册码，随便了。我输入Leafred及56376058，
按Ctrl＋N到TRW2000，打入bpx rtcMsgBox，F5回到程序，按确定，被TRW2000中断，
按F2，在按F10来到调用处，发现在XXXX：004C16D5，好，现在再来到W32Dasm，从
XXXX：004C16D5，向上读，发现按钮处理入口在XXXX：004C0100，好，现在重新以
bpm 004C0100 X，作断点，重新注册，现在进入了TRW2000，好，追踪吧。

拿好纸和笔，以下要耐心，并不时D EAX、D EDX等等，检查什么时候，读取字符，什么时候
进行比较。我在下面列出部分：

用户名是否为空判断＝＝＝》：
017F:004C07C6 PUSH EAX ＝＝＝＝＝＝＝＝ 》》 EAX 是我们输入的用户名。
017F:004C07C7 PUSH DWORD 00440408 ＝＝＝＝》》 为空
017F:004C07CC CALL `MSVBVM50!__vbaStrCmp` ＝＝＝＝＝》》这里判断输入用户名是否为空。
017F:004C07D2 NEG EAX ＝＝＝＝》》 你可以试试，把返回值改掉，会弹出提示请输入用户名。
017F:004C07D4 SBB EAX,EAX
017F:004C07D6 INC EAX
017F:004C07D7 NEG EAX
017F:004C07D9 MOV [EBP+FFFFFEAC],AX
017F:004C07E0 LEA ECX,[EBP-60]
017F:004C07E3 CALL `MSVBVM50!__vbaFreeStr`
017F:004C07E9 LEA ECX,[EBP-80]
017F:004C07EC CALL `MSVBVM50!__vbaFreeObj`
017F:004C07F2 MOVSX ECX,WORD [EBP+FFFFFEAC]

判断注册码是否为空＝＝＝》：
017F:004C0A12 MOV EDX,[EBP-60]
017F:004C0A15 PUSH EDX ＝＝＝＝＝＝》》EDX 输入的注册码。
017F:004C0A16 PUSH DWORD 00440408
017F:004C0A1B CALL `MSVBVM50!__vbaStrCmp`
017F:004C0A21 NEG EAX
017F:004C0A23 SBB EAX,EAX
017F:004C0A25 INC EAX
017F:004C0A26 NEG EAX
017F:004C0A28 MOV [EBP+FFFFFEAC],AX

其中某一判断＝＝＝》》：
017F:004C0F5D MOV EDX,[EBP-60]
017F:004C0F60 PUSH EDX ＝＝＝＝＝＝＝》》输入的用户名
017F:004C0F61 PUSH DWORD 004433C0 ＝＝＝＝＝＝＝》》比较杂乱五章的字符，其实很有用。
017F:004C0F66 CALL `MSVBVM50!__vbaStrCmp`
017F:004C0F6C NEG EAX
017F:004C0F6E SBB EAX,EAX
017F:004C0F70 INC EAX
017F:004C0F71 NEG EAX
017F:004C0F73 AND BX,AX
017F:004C0F76 MOV EAX,[EBP-64]
017F:004C0F79 PUSH EAX ＝＝＝＝＝＝＝＝＝＝＝＝＝》》 输入的注册码。
017F:004C0F7A PUSH DWORD 004433D0 ＝＝＝＝＝＝＝》》“http://ufocn.coc.cc”
017F:004C0F7F CALL `MSVBVM50!__vbaStrCmp`
017F:004C0F85 NEG EAX
017F:004C0F87 SBB EAX,EAX
017F:004C0F89 INC EAX
017F:004C0F8A NEG EAX
017F:004C0F8C AND BX,AX
017F:004C0F8F MOV [EBP+FFFFFEA4],BX

此处对于破解非常重要＝＝＝＝》：
017F:004C1373 MOV ECX,[EBP-6C]
017F:004C1376 PUSH ECX ＝＝＝＝＝＝＝》输入的用户名
017F:004C1377 MOV EDX,[EBP-68]
017F:004C137A PUSH EDX ＝＝＝＝＝＝＝＝》》一些字符。
017F:004C137B CALL `MSVBVM50!__vbaStrCmp`
017F:004C1381 NEG EAX
017F:004C1383 SBB EAX,EAX
017F:004C1385 INC EAX
017F:004C1386 NEG EAX
017F:004C1388 MOV [EBP+FFFFFEA0],AX

十日注册码之处＝＝＝＝》：
017F:004C15CE MOV EDX,[EBP-70]
017F:004C15D1 PUSH EDX ＝＝＝＝＝＝＝》 输入的注册码
017F:004C15D2 PUSH DWORD 00442B78 ＝＝＝》“UFO8769967”
017F:004C15D7 CALL `MSVBVM50!__vbaStrCmp`
这里如果我们让他相等，则提示十日注册成功。

由此可以看出我们在W32Dasm中看到的“UFO8769967”是十日注册码。

现在我们已经有了十日注册码，可以用一阵子了。

下面再来找标准注册码，
我们已经看到
017F:004C1373 MOV ECX,[EBP-6C]
017F:004C1376 PUSH ECX ＝＝＝＝＝＝＝》输入的用户名
017F:004C1377 MOV EDX,[EBP-68]
017F:004C137A PUSH EDX ＝＝＝＝＝＝＝＝》》一些字符。
017F:004C137B CALL `MSVBVM50!__vbaStrCmp`
017F:004C1381 NEG EAX

现在肯定是不相等的，如果我们把这里改为相等，会怎么样呢，哈哈，注册成功。
但再运行时，有不行了。看来它每次重新比较。不过我们已经知道这里时比较关键了，
我们再试试改注册名和注册码，发现EDX里的值只随注册码而变化，这样我们就可以
随便输入注册码，然后获取注册用户，当然可以根据算法来根据注册名反算出注册码，
但我不想再去研究算法了。OK，现在，以bpm 4c1373 X,为断点，随便输入注册码，
输入：547865，中断后，运行到017F:004C137B，D EDX 发现了什么Txe，现在重新运行
程序，输入注册名Txe，注册码547865，哈哈，发现什么，恭喜、恭喜，注册成功！！


辽宁省职称计算机考试2001

 标 题:辽宁省职称计算机考试2001年光盘的破解和注册机的制作 (13千字)
发信人:robot
时 间:2001-5-4 13:50:32
详细信息:
使用工具：SoftICE 4.05，W32Dasm白金版
说明：2001年光盘的模拟考试必须先进行注册，该光盘允许安装4台机器，获取注册号需要通过拨打电话16898173，然后输入一个14位长的数字，我听过周围的好几个人说电话注册很费劲也很麻烦，经常为了一个注册需要打好几次信息台电话，花了不少电话费，50块钱一张光盘就够贵的了，竟然还要通过信息台再挣一次钱，真是可恨，因此绝对有必要破解它。其实找出注册码的方法很多，也很容易，用SmartCheck就可以轻松搞定。
用SoftICE的破解过程：
设定好SoftICE，出现输入注册号的对话框后，输入一个12位的注册号，bpx hmemcpy或bpx rtcinputbox，按确定后，会被拦截回来，一步一步跟踪，就会找到真正的注册号。
用SmartCheck的破解过程：
设定好SmartCheck后，运行软件，出现输入注册号的对话框后，输入一个12位的注册号，按确定，当然肯定是错误，按退出，查找SmartCheck记录，就会找到注册号。
注册码的生成过程：
* Possible StringData Ref from Code Obj ->"cc:\jsjdog"
|
:0059350D 6898EE4100 push 0041EE98
...
* Reference To: MSVBVM50.__vbaFileOpen, Ord:0000h
|
:0059351E FF15CCD35D00 Call dword ptr [005DD3CC]

* Reference To: MSVBVM50.rtcEndOfFile, Ord:023Bh
|
:00593524 8B35DCD35D00 mov esi, dword ptr [005DD3DC]
:0059352A 6A01 push 00000001
:0059352C FFD6 call esi
:0059352E 6685C0 test ax, ax
:00593531 6A01 push 00000001
:00593533 750C jne 00593541
:00593535 8D45A4 lea eax, dword ptr [ebp-5C]
:00593538 50 push eax
* Reference To: MSVBVM50.__vbaLineInputVar, Ord:0000h
|
:00593539 FF15A4D25D00 Call dword ptr [005DD2A4]
:0059353F EBE9 jmp 0059352A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00593533(C)
|
* Reference To: MSVBVM50.__vbaFileClose, Ord:0000h
|
:00593541 FF1538D35D00 Call dword ptr [005DD338]
:00593547 8D4D84 lea ecx, dword ptr [ebp-7C]
:0059354A 8D55A4 lea edx, dword ptr [ebp-5C] ====> 行输入内容地址
:0059354D 51 push ecx
:0059354E 6A04 push 00000004
:00593550 8D8574FFFFFF lea eax, dword ptr [ebp+FFFFFF74]
:00593556 52 push edx
:00593557 50 push eax
:00593558 C7458C05000000 mov [ebp-74], 00000005
:0059355F C7458402000000 mov [ebp-7C], 00000002

* Reference To: MSVBVM50.rtcMidCharVar, Ord:0278h
|
:00593566 FF1530D35D00 Call dword ptr [005DD330]
:0059356C 8D8D74FFFFFF lea ecx, dword ptr [ebp+FFFFFF74]
:00593572 51 push ecx

* Reference To: MSVBVM50.__vbaR8Var, Ord:0000h
|
:00593573 FF1504D45D00 Call dword ptr [005DD404]
:00593579 DD5DB4 fstp qword ptr [ebp-4C]
:0059357C 8D9574FFFFFF lea edx, dword ptr [ebp+FFFFFF74]
:00593582 8D4584 lea eax, dword ptr [ebp-7C]
:00593585 52 push edx
:00593586 50 push eax
:00593587 6A02 push 00000002

* Reference To: MSVBVM50.__vbaFreeVarList, Ord:0000h
|
:00593589 FF1598D25D00 Call dword ptr [005DD298]
:0059358F 83C40C add esp, 0000000C

上面这段程序是打开c:\jsjdog文件，用行读入方式读取文件，从第4个字符开始取5个字符，并转成单精度格式，用VB程序表示如下：
Open "c:\jsjdos" For Input As #1
Do While Not EOF(1)
Line Input #1, DogCode$
Loop
Close #1
VeriCode=Csng(Mid(DogCode$, 4, 5))

:00593592 8D95D4FEFFFF lea edx, dword ptr [ebp+FFFFFED4]
:00593598 8D4D84 lea ecx, dword ptr [ebp-7C]

* Possible StringData Ref from Code Obj ->"cc:\Msdos"
|
:0059359B C785DCFEFFFFC4EE4100 mov dword ptr [ebp+FFFFFEDC], 0041EEC4
:005935A5 C785D4FEFFFF08000000 mov dword ptr [ebp+FFFFFED4], 00000008

* Reference To: MSVBVM50.__vbaVarDup, Ord:0000h
|
:005935AF FF1538D45D00 Call dword ptr [005DD438]
:005935B5 8D4D84 lea ecx, dword ptr [ebp-7C]
:005935B8 53 push ebx
:005935B9 51 push ecx

* Reference To: MSVBVM50.rtcDir, Ord:0285h
|
:005935BA FF15C0D35D00 Call dword ptr [005DD3C0]
:005935C0 8BD0 mov edx, eax
:005935C2 8D4DA0 lea ecx, dword ptr [ebp-60]
:005935C5 FFD7 call edi
:005935C7 50 push eax
:005935C8 6818584100 push 00415818

* Reference To: MSVBVM50.__vbaStrCmp, Ord:0000h
|
:005935CD FF1548D35D00 Call dword ptr [005DD348]
:005935D3 8BF0 mov esi, eax
:005935D5 8D4DA0 lea ecx, dword ptr [ebp-60]
:005935D8 F7DE neg esi
:005935DA 1BF6 sbb esi, esi
:005935DC F7DE neg esi
:005935DE F7DE neg esi

* Reference To: MSVBVM50.__vbaFreeStr, Ord:0000h
|
:005935E0 FF1580D45D00 Call dword ptr [005DD480]
:005935E6 8D4D84 lea ecx, dword ptr [ebp-7C]

* Reference To: MSVBVM50.__vbaFreeVar, Ord:0000h
|
:005935E9 FF157CD25D00 Call dword ptr [005DD27C]
:005935EF 663BF3 cmp si, bx ====> 是否存在"c:\Msdos"
:005935F2 743C je 00593630 ====> 不存在，则转

* Possible StringData Ref from Code Obj ->"cc:\Msdos"
|
:005935F4 68C4EE4100 push 0041EEC4
:005935F9 6A01 push 00000001
:005935FB 6AFF push FFFFFFFF
:005935FD 6A01 push 00000001

* Reference To: MSVBVM50.__vbaFileOpen, Ord:0000h
|
:005935FF FF15CCD35D00 Call dword ptr [005DD3CC]
:00593605 8D55CC lea edx, dword ptr [ebp-34]
:00593608 6A01 push 00000001
:0059360A 52 push edx

* Reference To: MSVBVM50.__vbaLineInputVar, Ord:0000h
|
:0059360B FF15A4D25D00 Call dword ptr [005DD2A4]
:00593611 6A01 push 00000001

* Reference To: MSVBVM50.__vbaFileClose, Ord:0000h
|
:00593613 FF1538D35D00 Call dword ptr [005DD338]
:00593619 6A07 push 00000007 ====> 属性值为7，即系统、只读、隐含

* Possible StringData Ref from Code Obj ->"cc:\msdos"
|
:0059361B 6800584100 push 00415800

* Reference To: MSVBVM50.rtcSetFileAttr, Ord:0244h
|
:00593620 FF1588D45D00 Call dword ptr [005DD488]
:00593626 BB0A000000 mov ebx, 0000000A
:0059362B E999080000 jmp 00593EC9

上面这段程序是检测C盘是否有msdos这个文件(其实这个文件的内容就是注册码)，如果有则打开这个文件并读取内容，VB程序可能如下：
A$="c:\Msdos"
B$=Dir("c:\Msdos")
If A$=B$ Then
Open B$ For Input As #1
Line Input #1, RegCode1$
Close #1
SetAttr B$, vbReadOnly+vbHidden+vbSystem
Else
进入输入软件序列号和注册码对话框
End If

:00593EC9 DD45B4 fld qword ptr [ebp-4C]

* Reference To: MSVBVM50.__vbaFpI4, Ord:0000h
|
:00593ECC 8B3544D45D00 mov esi, dword ptr [005DD444]
:00593ED2 FFD6 call esi
:00593ED4 99 cdq
:00593ED5 B905000000 mov ecx, 00000005
:00593EDA F7F9 idiv ecx
:00593EDC 83FA04 cmp edx, 00000004
:00593EDF 0F8768280000 ja 0059674D
:00593EE5 FF249594695900 jmp dword ptr [4*edx+00596994] ====> 转到593EEC、594661、594DD6、5955D6、595DD6

:00593EEC DD45B4 fld qword ptr [ebp-4C]
:00593EEF FFD6 call esi

* Possible StringData Ref from Code Obj ->"4412345"
|
:00593EF1 6868EF4100 push 0041EF68
:00593EF6 8BD8 mov ebx, eax

* Reference To: MSVBVM50.__vbaI4Str, Ord:0000h
|
:00593EF8 FF15ECD35D00 Call dword ptr [005DD3EC] ====> 转为字符格式
:00593EFE 33D8 xor ebx, eax ====> 与412345异或
:00593F00 53 push ebx

* Reference To: MSVBVM50.__vbaStrI4, Ord:0000h
|
:00593F01 FF1574D25D00 Call dword ptr [005DD274]
:00593F07 8BD0 mov edx, eax
:00593F09 8D4DA0 lea ecx, dword ptr [ebp-60]
:00593F0C FFD7 call edi
:00593F0E DD0528354000 fld qword ptr [00403528] ====> [00403528]值为99999
:00593F14 DC65B4 fsub qword ptr [ebp-4C] ====> 99999-VeriCode
:00593F17 50 push eax
:00593F18 DFE0 fstsw ax
:00593F1A A80D test al, 0D
:00593F1C 0F85862A0000 jne 005969A8
:00593F22 FFD6 call esi

* Possible StringData Ref from Code Obj ->"2238745"
|
:00593F24 687CEF4100 push 0041EF7C
:00593F29 8BD8 mov ebx, eax

* Reference To: MSVBVM50.__vbaI4Str, Ord:0000h
|
:00593F2B FF15ECD35D00 Call dword ptr [005DD3EC]
:00593F31 33D8 xor ebx, eax ====> 与238745异或
:00593F33 53 push ebx

* Reference To: MSVBVM50.__vbaStrI4, Ord:0000h
|
:00593F34 FF1574D25D00 Call dword ptr [005DD274]
:00593F3A 8BD0 mov edx, eax
:00593F3C 8D4D9C lea ecx, dword ptr [ebp-64]
:00593F3F FFD7 call edi

* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00593F41 8B1DC0D25D00 mov ebx, dword ptr [005DD2C0]
:00593F47 50 push eax
:00593F48 FFD3 call ebx ====> 两个结果进行合并
:00593F4A 8D5584 lea edx, dword ptr [ebp-7C]
:00593F4D 89856CFFFFFF mov dword ptr [ebp+FFFFFF6C], eax
:00593F53 52 push edx
:00593F54 8D45CC lea eax, dword ptr [ebp-34]
:00593F57 6A02 push 00000002
:00593F59 8D8D74FFFFFF lea ecx, dword ptr [ebp+FFFFFF74]
:00593F5F 50 push eax
:00593F60 51 push ecx
:00593F61 C78564FFFFFF08800000 mov dword ptr [ebp+FFFFFF64], 00008008
:00593F6B C7458C0C000000 mov [ebp-74], 0000000C
:00593F72 C7458402000000 mov [ebp-7C], 00000002

* Reference To: MSVBVM50.rtcMidCharVar, Ord:0278h
|
:00593F79 FF1530D35D00 Call dword ptr [005DD330] ====> 从第2个字符开始读取12(0Ch)个注册码字符
:00593F7F 8D9564FFFFFF lea edx, dword ptr [ebp+FFFFFF64] ====> 刚才读取的字符地址
:00593F85 8D8574FFFFFF lea eax, dword ptr [ebp+FFFFFF74] ====> 两次异或运算的结果地址
:00593F8B 52 push edx
:00593F8C 50 push eax

* Reference To: MSVBVM50.__vbaVarTstEq, Ord:0000h
|
:00593F8D FF154CD35D00 Call dword ptr [005DD34C] ====> 字符串比较

上面共两段程序，第一段程序是求检测码与5的模，根据模的值进行不同的运算，第二段程序是模为0时的运算过程，另外4个运算过程与此相似，这里就不再说了。VB程序可能如下：
TestCode = Cint(VeriCode) Mod 5
Select Case TestCode
Case 0
RegCode2$=(Cstr(VerCode) Xor Cstr(412345))+(Cstr(99999-VerCode) Xor Cstr(238745))
RegCode1$=Mid(RegCode1$, 2, 12)
If RegCode1$ = RegCode2$ Then
MsgBox "注册成功！", vbOnly
GoTo 程序正常运行处
Else
MsgBox "注册失败！", vbOnly
End
End If
Case 1
RegCode2$=(Cstr(VerCode) Xor Cstr(235678))+(Cstr(99999-VerCode) Xor Cstr(338762))
RegCode1$=Mid(RegCode1$, 2, 12)
If RegCode1$ = RegCode2$ Then
MsgBox "注册成功！", vbOnly
GoTo 程序正常运行处
Else
MsgBox "注册失败！", vbOnly
End
End If
Case 2
RegCode2$=(Cstr(VerCode) Xor Cstr(897363))+(Cstr(99999-VerCode) Xor Cstr(283954))
RegCode1$=Mid(RegCode1$, 2, 12)
If RegCode1$ = RegCode2$ Then
MsgBox "注册成功！", vbOnly
GoTo 程序正常运行处
Else
MsgBox "注册失败！", vbOnly
End
End If
Case 3
RegCode2$=(Cstr(VerCode) Xor Cstr(236738))+(Cstr(99999-VerCode) Xor Cstr(458902))
RegCode1$=Mid(RegCode1$, 2, 12)
If RegCode1$ = RegCode2$ Then
MsgBox "注册成功！", vbOnly
GoTo 程序正常运行处
Else
MsgBox "注册失败！", vbOnly
End
End If
Case 4
RegCode2$=(Cstr(VerCode) Xor Cstr(763218))+(Cstr(99999-VerCode) Xor Cstr(238958))
RegCode1$=Mid(RegCode1$, 2, 12)
If RegCode1$ = RegCode2$ Then
MsgBox "注册成功！", vbOnly
GoTo 程序正常运行处
Else
MsgBox "注册失败！", vbOnly
End
End If
End Select
因此这个程序的注册机不难编写，因为软件序列号即最后5位数字是可见的
设最后5位数字为abcde，
则注册码的前6位为：固定数字1 xor abcde
则注册码的后6位为：固定数字2 xor (99999-abcde)
这样，共12位注册码，注册机已经做好并测试通过


如何破解VB5程式的密码保护

 标 题:翻译“如何破解VB5程式的密码保护... ( By DMA-48!!! )”，希望不会翻重 (4千字)
发信人:KanKer
时 间:2001-6-30 0:11:31
详细信息:
如何破解VB5程式的密码保护... ( By DMA-48!!! )
文章翻译：KanKer

呵呵，这是一个破解VB5程式密码保护的快捷方法（甚至包括一些DLL动态链接库）...

我现在假设你已有了SoftIce... (或从 CrackStore.com 下载)

...

首先... 让我们讨论一下VB5程式的结构...

从机器的可执行代码开始吧... 当你在一个系统上写你自己的代码时，叫源代码 ( 你不可能直接用16进制编吧？尤其在WinXX的系统上 ) ，因为用编程语言来测试和调试要容易的多... 在该阶段你的源代码要在机器上执行，有两种方式, 第一种方式(慢)是取一行翻译一行执行, 叫解释执行 (因为此时有一种可以将你的源代码翻译为机器能识别的形式的程式在运行，当然在程序执行最后也是可以完成一些任务的...）；第二种方式（快）是将整个源代码直接翻译为机器能识别的形式（机器不需再将程式取一行翻译一行再执行）... 这种方式叫编译执行... 在运行时不需要任何别的程式做翻译工作!...

微软又一次模糊了这个概念 -或者说又在尽力欺骗!- 正象他们经常做的 (总在隐藏真相!)...

好了... 让我们回到原话题—破解VB5的东西! (EXE或DLL)...

VB5 程式是不会单独运行的!... 它总是需要 MSVBm50.DLL 来解释执行，即使微软说“现在VB的代码可以完全编译！” ... (BULL S.ITT!)

这意味着 EXE 或别的由VB5编译的东西将不得不调用MSVBm50.DLL 来了解下一步该干什么!... 甚至在字串比较上! 它调用一个函数或一段程序叫 __VbaStrComp 来进行比较 (你能相信吗?!!?)...

可能你以前曾破解过Win9x下的东东，对如何设断也有了一定的思路，但自从VB5调用MSVBm50.DLL来解释执行程式后便行不通了（代码将不会按它自己写的方式进行处理，而是按MSVBm50.DLL解释的方式进行）, 也使系统变得很慢!... 不过也使我们知道了函数 (GetDlgItemText）, 不管是16位或32位的都不会被使用了 !... 或即使被使用了，也不会被连接到源程序中去!... 要记住... 如果你想当程序员千万不要写VB程式!...

这个也告诉我们，必须在softice目录下的softice.dat或winice.dat的exp部分加上MSVBm50.DLL, 你将不得不在该文件中加入下面一行:

EXP=C:\***你安装windows的目录***\System\MSVBm50.DLL

当你加完这一行后，你要重启机器...

重启后...

运行要破解的程式，直到出现让你输入密码的对话框...

按 CTRL+D 进入SoftIce...
键入

bpx __vbaStrComp

该断点将拦住发生在VB5程式内的字串比较动作...

好现在按CTRL+X ,你将回到VB程式中... 键入一些字符并按回车... 发生了什么!?!... 程式将被断住并回到 SoftIce中...

清除所有断点. 向下翻屏(用 CTRL+DownArrow) ，直到看到如下代码:

F003585: MOV ECX, [EBP+0C]
F003588: MOV EDI, [ECX-04]
F00358B: CMP EDI, ESI

在 F00358B处设一个断点 ( 便是 CMP EDI, ESI 的位置). 只需在该位置双击即可。 按 F5 返回程式... 将在该位置拦住... 在该点呼叫该函数的程式段将要比较的数据压入到内存中 ... 结果是第一个位置存放源数据，其指针存在 EAX 中，第二个位置是目标数据，其指针在ECX中... 要看这两处的数据，只需键入...

DEAX

这个是查看EAX指向的数据,

DECX

这个是查看ECX指向的数据...

如果你找到了你要找的，呵呵!... 清除断点，回到原程式，并填上找到的数据... ( Piece of cake! )... 如果没找到... 不要灰心... 再按一下 F5 ，因为你可能处在另一个字串比较处或在系统里(比如象变量存贮什么的!)... 按了 F5 后你将拦在同一位置，此时键入

DEAX
DECX

查看内存数据，你将发现寻找其密码是如此的容易!... ( 如果没有再按 F5 ... )...

这种方法可100% 的用于 Visual Basic5编译的程序 ( EXE, DLL, 我认为也可以用于OCX文件，但我从没试过! - :)

如果你不能发现你要找的, 也可以在MSVBm50.DLL中别的地方下断...

(*你可以停在该链接库中有比较操作的任何地方, 你也可以在拦住后看该链接库中所有的函数, 你只需键入:

( 由于我也是刚接触SoftIce, 我只知道这样做是一种很快的方法 :)

EXP

这样将看到所有在系统链接库中的所有函数，当然也包含MSVBm50.DLL了，不过是列在最后了，因为我把MSVBm50.DLL给包含在 WinIce.Dat的最后了 :)
*)

好了, 下面是用来比较的几个主要的函数:

针对字串:
__vbaStrComp
__vbaStrCmp
__vbaStrCompVar
__vbaStrLike
__vbaStrTextComp
__vbaStrTextLike

针对变量:
__vbaVarCompEq
__vbaVarCompLe
__vbaVarCompLt
__vbaVarCompGe
__vbaVarCompGt
__vbaVarCompNe
.
.
.

我相信你会发现的更多... 但在VB中比较的主要对象是字串 !.. 因为任何文本框返回的都是字串! (除非他们以值的方式取，不过不太可能的!). 因为他们经常自以为是的把字母、数字、特殊符号都作为密码!.... 这就导致结果便是字串!...

好... 祝贺一下...

Thunder23: (我真的很感激你给我的这个东东... 没有你的帮助我真的没法下手，真的很感谢你，千万次的感谢，我的朋友!..., 你希望你改日能再写一篇!!! 哈哈哈!...
SnakeHead: (我希望你能走出那个血腥的领域并认真的开始!)...
+ORC ... (兄弟, 当我读到你这篇文章时我是如此的感动，我想哭... 我记得熬过的这些日子!... 我要回去睡个大觉!)... 上帝保佑你!, 你已经说过了!
ED!SON: 这是我陷入windows迷雾后读到的第一篇文章... 因为你，我现在喜欢 SoftIce 了!... 我在用Turbo Debugger前先用它 ... 我希望还有类似的关于win95下破解的文章出现!...
非常非常的感谢 CrackStore.Com 救了我们这些蠢人!... I Owe it 2 U Budy!.
祝全世界的黑客好运 !...
使我重新破解的原因是因我要用VB5来设计一个预订系统，此系统需要跟电话系统联合，一些程序员出售该程式要?000! 没门!... 他所做的便是在其VB DLL文件中输入一个密码并把文件寄给我们，他只寄他的密码!...我花了4天的时候来研究windows，然后又花了10分钟破解了该程式，并得到了密码!...我想我既然又来这里了... 索性便花点时间把水平赶上去...

再次感谢世上所有的黑客...

DMA-48!!!


统一个人KTV点播系统 v6.0

 标 题:统一个人KTV点播系统 v6.0 (6千字)
发信人:佳洁士
时 间:2001-7-5 23:07:33
详细信息:
统一个人KTV点播系统 v6.0

这是一VB6程序，先在winice.dat装载：EXP=c:\windows\system\msvbvm60.dll。

破解工具：SoftICE4.05
破解时间：2001.6.25

用户ID：190779859 <-这个是软件生成的。
输入注册码：12324567890

................................

EAX=00000000 EBX=00000000 ECX=C17519E0 EDX=0056C868 ESI=005605DC
EDI=011E57BC EBP=0078E108 ESP=0078E038 EIP=0051B2F1 o d I s Z a P c
CS=0167 DS=016F SS=016F ES=016F FS=3927 GS=0000 SS:0078E0EC=00000000
==================================================byte==============PROT=======
016F:0056C868 31 00 32 00 33 00 34 00-35 00 36 00 37 00 38 00 1.2.3.4.5.6.7.8.
016F:0056C878 39 00 30 00 00 00 00 00-00 00 00 00 21 00 00 A0 9.0.........!...
016F:0056C888 1C 00 56 00 DC C8 56 00-5F 00 53 00 54 00 4F 00 ..V...V._.S.T.O.
016F:0056C898 50 00 00 00 00 00 00 00-84 C8 56 00 16 00 00 A0 P.........V.....
==========================================================================ROT32

0167:0051B2D0 CALL [ECX+000000A0]
0167:0051B2D6 CMP EAX,EBX 
0167:0051B2D8 FCLEX
0167:0051B2DA JGE 0051B2EE
0167:0051B2DC PUSH 000000A0
0167:0051B2E1 PUSH 004166E0
0167:0051B2E6 PUSH EDI
0167:0051B2E7 PUSH EAX
0167:0051B2E8 CALL [0040107C]
0167:0051B2EE MOV EDX,[EBP-18] <<=D EDX 就可以看见输入的注册码。
0167:0051B2F1 LEA ECX,[EBP-1C]
0167:0051B2F4 MOV [EBP-18],EBX
0167:0051B2F7 CALL [00401284]
0167:0051B2FD MOV EAX,[ESI]
0167:0051B2FF LEA ECX,[EBP-00A4]
0167:0051B305 LEA EDX,[EBP-1C]
0167:0051B308 PUSH ECX
0167:0051B309 PUSH EDX
0167:0051B30A PUSH ESI
0167:0051B30B CALL [EAX+000006FC] <<==按F8进入，
0167:0051B311 CMP EAX,EBX
0167:0051B313 JGE 0051B327 
0167:0051B315 PUSH 000006FC  
====================================FLYMANPLAYER!.text+0011A2D0================?

01)BPX #0167:0051B2EE
:bc 00
:d edx
:pagein n a1.txt

PAGEIN address Flymanpl

................................

................................
EAX=00561594 EBX=0078E0EC ECX=00000000 EDX=00561594 ESI=005605DC
EDI=78014145 EBP=0078E024 ESP=0078DFD0 EIP=0051BE0B o d I s Z a P c
CS=0167 DS=016F SS=016F ES=016F FS=3927 GS=0000 SS:0078E000=00000000
==================================================byte==============PROT==?0)==
016F:00561594 31 00 30 00 33 00 33 00-36 00 37 00 34 00 36 00 1.0.3.3.6.7.4.6.
016F:005615A4 33 00 30 00 37 00 38 00-36 00 00 00 24 00 00 A0 3.0.7.8.6...$...
016F:005615B4 1A 00 00 00 61 00 6E 00-61 00 6D 00 65 00 46 00 ....a.n.a.m.e.F.
016F:005615C4 46 00 46 00 46 00 44 00-46 00 38 00 44 00 00 00 F.F.F.D.F.8.D...
==========================================================================ROT32

0167:0051BDF5 JNZ 0051BEA2
0167:0051BDFB MOV EDX,[EBP-18] 
0167:0051BDFE MOV EAX,[EBP-1C]
0167:0051BE01 PUSH EDX
0167:0051BE02 PUSH EAX
0167:0051BE03 CALL [00401160]
0167:0051BE09 MOV EDX,EAX <<==下D EDX,就可以看见正确的注册码!
0167:0051BE0B LEA ECX,[EBP-24]
0167:0051BE0E CALL [00401284]
0167:0051BE14 PUSH EAX
0167:0051BE15 CALL [00401128]
0167:0051BE1B MOV ESI,EAX
0167:0051BE1D LEA ECX,[EBP-24]
0167:0051BE20 NEG ESI
0167:0051BE22 SBB ESI,ESI
0167:0051BE24 INC ESI
0167:0051BE25 NEG ESI
0167:0051BE27 CALL EDI
0167:0051BE29 TEST SI,SI
0167:0051BE2C JZ 0051BE66
0167:0051BE2E MOV EDX,[EBP-30]
0167:0051BE31 SUB ESP,10 
0167:0051BE34 MOV EBX,[EBX]  
====================================FLYMANPLAYER!.text+0011ADF5================

:d eax
:d ebp-04
:d edx
:pagein n a2.txt

PAGEIN address Flymanpl

................................

整理：

用户ID：190779859 <-这个号码是软件根据电脑的硬件生成的。
输入注册码：1033674630786

China Cracking Group
2001.06.25


网三机器人 10045

标 题:这个软件也是vb读注册表的，但....(网三机器人 10045 破解文档) (1千字)
发信人:wocy
时 间:2000-12-31 2:19:02
详细信息:
网三机器人 10045 破解文档
-----------------------------
雪椰
2000,12,30am
Email:wocy@263.net
Http://wocy.yeah.net(有本例中的补丁）

------------------------------
（这个软件在运行开始读注册信息，但判断的地方和程序中一样，
因我没玩网三，所以没测试过，如有问题请告知，
附：喂，那个谁，我没说过我是男士啊）

1，检查发现此程式用vb60编写，aspack压缩，用smartcheck提示出错，脱壳后也不行
我选择用s-ice,动态调试，暴力破解
2, set break point
bpx msvbvm60!__vbastrcmp
bpx msvbvm60!__vbavartsteq
bpx msvbvm60!__vbavartstne
3,your will to...

:0040D826 52 push edx
:0040D827 68606F4000 push 00406F60
:0040D82C FF15D4104000 call dword ptr [004010D4] <---bpx msvbvm60!__vbastrcmp
:0040D832 8BF8 mov edi, eax
:0040D834 8D4DD8 lea ecx, dword ptr [ebp-28]

F10 trace it to...

:0040D967 6685FF test di, di
:0040D96A 0F84B9010000 je 0040DB29 <-----(1)
:0040D970 8B0E mov ecx, dword ptr [esi]
:0040D972 56 push esi

4,at point (1), if you input a error code ,will jmp 40db29 to fail.
so,you need modify (1) with : jne xxxxxx
5,go,ok
6,但是有一个小意外，我输的网三号错了，而程式注册后不让修改了，90%在注册表。
启动regedit,发现在
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\智能机器人\setup]
"id"=" 你的网三号"
"password"="注册号"
你随便改了
7，不管怎样，世界又清净了


AddFlow

标 题:急！各位高手！帮弟一个忙！你们听说过作流程图的OCX控件AddFlow吗？ (215字)
发信人:嘴大李
时 间:2001-4-10 11:52:18
详细信息:
http://www.lassalle.com提供了最新版的AddFlow，
以前的版本未找到！如果那位高手知道以前的版本（因为网上的破解程序只支持到028版）
能告诉我网址或是给我发一个破解版的（这个OCX也不大！）或是注册号，在下不胜感激！

标 题:还是InstallShield (7千字)
发信人:blowfish
时 间:2001-4-10 14:20:59
详细信息:

 含义明显的字符串：

// ------------- FUNCTION function103 -------------------------
function function103()
number lNumber0;
number lNumber1;
number lNumber2;
string lString0;
string lString1;
string lString2;
begin
001BCB:0013:        lString0 = "";
001BD3:0013:        lString1 = "Type your name below.
    You must also type the name of your company and the product serial number.
    If you are installing an evaluation version, this serial number must be \"EVALUATION\"";

label41: //Ref: 001DD4
001C94:0013:        string4 = string7;
001C9C:0013:        string5 = string8;
001CA4:0013:        string6 = string9;
001CAC:00B5:        function1(lString0, lString1, string4,
    string5, string6);
001CC3:0021:        lNumber0 = LAST_RESULT;
001CCB:0013:        string7 = string4;
001CD3:0013:        string8 = string5;
001CDB:00B5:        function108(string6);
001CE6:0021:        lNumber2 = LAST_RESULT;
001CEE:0128:        lNumber2 = lNumber2 = 0;
001D00:0022:        if (lNumber2 = 0) then
goto label42;
endif;
001D0E:0023:        StrCompare(string6, "EVALUATION");
001D20:0021:        lNumber2 = LAST_RESULT;
001D28:0128:        lNumber2 = lNumber2 != 0;
001D3A:0022:        if (lNumber2 = 0) then
goto label42;
endif;
001D48:0013:        lString2 = "INVALID SERIAL NUMBER!
    If it is an evaluation version, just enter \"EVALUATION\" in the serial number
    field.";
001DBA:0021:        lNumber1 = -65535;
001DC4:002A:        MessageBox(lString2, lNumber1);
001DCC:0013:        string9 = string6;
001DD4:002C:        goto label41;

label42: //Ref: 001D00  001D3A
001DDD:0013:        string9 = string6;
001DE5:012F:        return(lNumber0);
001DEC:00B8:        return;
end;
//-----------------------------------------------------------------------

function108是关键的，分析一下应该可以写出keymaker：

// ------------- FUNCTION function108 --------------------------------------
function function108(pString0)
number lNumber0;
number lNumber1;
number lNumber2;
number lNumber3;
number lNumber4;
number lNumber5;
number lNumber6;
number lNumber7;
number lNumber8;
string lString0;
string lString1;
string lString2;
string lString3;
string lString4;
string lString5;
begin
001E0C:002F:        StrLength(pString0);
001E11:0021:        lNumber5 = LAST_RESULT;
001E19:0021:        lNumber4 = 0;
001E23:0021:        lNumber3 = 0;
001E2D:011A:        lNumber7 = lNumber5 - 1;

label44: //Ref: 001EBB
001E3E:0128:        lNumber8 = lNumber3 <= lNumber7;
001E4E:0022:        if (lNumber8 = 0) then
goto label46;
endif;
001E5C:007A:        GetByte(lNumber8, pString0, lNumber3);
001E67:0128:        lNumber8 = lNumber8 != 32;
001E79:0022:        if (lNumber8 = 0) then
goto label45;
endif;
001E87:007A:        GetByte(lNumber8, pString0, lNumber3);
001E92:007B:        SetByte(lString0, lNumber4, lNumber8);
001E9D:0119:        lNumber4 = lNumber4 + 1;

label45: //Ref: 001E79
001EAE:0119:        lNumber3 = lNumber3 + 1;
001EBB:002C:        goto label44;

label46: //Ref: 001E4E
001EC4:0021:        lNumber2 = 0;
001ECE:0021:        lNumber6 = 3;
001ED8:0021:        lNumber3 = 0;
001EE2:011A:        lNumber7 = lNumber4 - 2;

label47: //Ref: 001F9A
001EF3:0128:        lNumber8 = lNumber3 <= lNumber7;
001F03:0022:        if (lNumber8 = 0) then
goto label50;
endif;
001F11:007A:        GetByte(lNumber8, lString0, lNumber3);
001F1C:011A:        lNumber8 = lNumber8 - 48;
001F29:011B:        lNumber8 = lNumber8 * lNumber6;
001F34:0119:        lNumber2 = lNumber2 + lNumber8;
001F3F:0123:        lNumber2 = lNumber2 % 10;
001F4C:0128:        lNumber8 = lNumber6 = 3;
001F5E:0022:        if (lNumber8 = 0) then
goto label48;
endif;
001F6C:0021:        lNumber6 = 2;
001F76:002C:        goto label49;

label48: //Ref: 001F5E
001F7F:0021:        lNumber6 = 3;

label49: //Ref: 001F76
001F8D:0119:        lNumber3 = lNumber3 + 1;
001F9A:002C:        goto label47;

label50: //Ref: 001F03
001FA3:011A:        lNumber7 = lNumber4 - 1;
001FB0:007A:        GetByte(lNumber7, lString0, lNumber7);
001FBB:011A:        lNumber1 = lNumber7 - 48;
001FC8:0128:        lNumber7 = lNumber2 != lNumber1;
001FD8:0022:        if (lNumber7 = 0) then
goto label51;
endif;
001FE6:0021:        lNumber0 = 0;
001FF0:002C:        goto label52;

label51: //Ref: 001FD8
001FF9:0030:        StrSub(lString1, lString0, 0, 4);
00200B:0030:        StrSub(lString2, lString0, 4, 4);
00201D:0030:        StrSub(lString3, lString0, 8, 4);
00202F:0030:        StrSub(lString4, lString0, 12, 4);
002041:0124:        lString5 = lString1 + " ";
00204D:0124:        lString5 = lString5 + lString2;
002058:0124:        lString5 = lString5 + " ";
002064:0124:        lString5 = lString5 + lString3;
00206F:0124:        lString5 = lString5 + " ";
00207B:0124:        string10 = lString5 + lString4;
002086:0021:        lNumber0 = 1;

label52: //Ref: 001FF0
002094:012F:        return(lNumber0);
00209B:00B8:        return;
end;
//------------------------------------------------------------------------------

lic的格式：

// ------------- FUNCTION function93 ------------------------------------
function function93()
number lNumber0;
number lNumber1;
number lNumber2;
string lString0;
string lString1;
string lString2;
string lString3;
begin
001173:0023:        StrCompare(string6, "EVALUATION");
001185:0021:        lNumber2 = LAST_RESULT;
00118D:0128:        lNumber2 = lNumber2 = 0;
00119F:0022:        if (lNumber2 = 0) then
goto label23;
endif;
0011AD:012F:        return(0);

label23: //Ref: 00119F
0011BA:0013:        lString0 = "ADDFLOW3.LIC";
0011CE:0013:        lString1 = WINSYSDIR;
0011D6:0021:        lNumber1 = 3;
0011E0:0065:        OpenFileMode(lNumber1);
0011E5:0011:        CreateFile(lNumber0, lString1, lString0);
0011F0:0021:        lNumber2 = LAST_RESULT;
0011F8:0128:        lNumber2 = lNumber2 = 0;
00120A:0022:        if (lNumber2 = 0) then
goto label24;
endif;
001218:0012:        WriteLine(lNumber0, "AddFlow ActiveX
    Control");
001237:0012:        WriteLine(lNumber0, "Copyright (c)
    1997-99 Lassalle Technologies");
00126A:0124:        lString3 = "License number: " + string10;
001285:0012:        WriteLine(lNumber0, lString3);
00128D:0012:        WriteLine(lNumber0, "This product
    is licensed to:");
0012B1:0124:        lString3 = "User: " + string4;
0012C2:0012:        WriteLine(lNumber0, lString3);
0012CA:0124:        lString3 = "Company: " + string5;
0012DE:0012:        WriteLine(lNumber0, lString3);
0012E6:0012:        WriteLine(lNumber0, " ");
0012EF:001F:        CloseFile(lNumber0);

label24: //Ref: 00120A
0012F8:012F:        return(0);
001301:00B8:        return;
end;

标 题:奇怪，好象真没有读lic文件 (3千字)
发信人:blowfish
时 间:2001-4-10 16:10:02
详细信息:

把下面的JZ改为JMP就不会有AboutBox了。

001B:10001FD8 8BCE MOV ECX,ESI
001B:10001FDA E8DF6A0100 CALL 10018ABE
001B:10001FDF 85C0 TEST EAX,EAX
001B:10001FE1 7405 JZ 10001FE8
001B:10001FE3 6A01 PUSH 01
001B:10001FE5 58 POP EAX
001B:10001FE6 EB02 JMP 10001FEA
001B:10001FE8 33C0 XOR EAX,EAX
001B:10001FEA 5F POP EDI
001B:10001FEB 3BC3 CMP EAX,EBX
001B:10001FED 89865C040000 MOV [ESI+0000045C],EAX
001B:10001FF3 5B POP EBX
001B:10001FF4 7407 JZ 10001FFD //这里
001B:10001FF6 8BCE MOV ECX,ESI
001B:10001FF8 E8A51B0000 CALL 10003BA2 //调用AboutBox( )显示对话框
001B:10001FFD 33C0 XOR EAX,EAX
001B:10001FFF 5E POP ESI
001B:10002000 C20400 RET 0004
//---------------------------------------------------------------
相关的COM接口的定义部分：

.rdata:1001B8D8 dd offset aAboutbox ; "AboutBox" //接口函数名
.rdata:1001B8DC db 0D8h ; ?
.rdata:1001B8DD db 0FDh ; ?
.rdata:1001B8DE db 0FFh ;
.rdata:1001B8DF db 0FFh ;
.rdata:1001B8E0 db 0 ;
.rdata:1001B8E1 db 0 ;
.rdata:1001B8E2 db 0 ;
.rdata:1001B8E3 db 0 ;
.rdata:1001B8E4 db 0 ;
.rdata:1001B8E5 db 0 ;
.rdata:1001B8E6 db 0 ;
.rdata:1001B8E7 db 0 ;
.rdata:1001B8E8 dd offset sub_10003BA2 //接口函数的入口地址

//----------------------------------------------------------------------
接口函数AboutBox( )的实现部分，被多处调用：

.text:10003BA2 sub_10003BA2 proc near ; CODE XREF: sub_10001F6F+89p
.text:10003BA2 ; sub_10003B7D+Ep
.text:10003BA2 ; DATA XREF: ...
.text:10003BA2 mov eax, offset loc_1001957C
.text:10003BA7 call _EH_prolog
.text:10003BAC sub esp, 70h
.text:10003BAF push 64h
.text:10003BB1 lea ecx, [ebp-7Ch]
.text:10003BB4 call sub_10003C07
.text:10003BB9 mov eax, dword_10020B44
.text:10003BBE and dword ptr [ebp-4], 0
.text:10003BC2 mov [ebp-1Ch], eax
.text:10003BC5 mov eax, dword_10020B48
.text:10003BCA push offset unk_10020B4C
.text:10003BCF lea ecx, [ebp-14h]
.text:10003BD2 mov [ebp-18h], eax
.text:10003BD5 call ??4CString@@QAEABV0@ABV0@@Z ; CString::operator=(CString const &)
.text:10003BDA push offset unk_10020B50
.text:10003BDF lea ecx, [ebp-10h]
.text:10003BE2 call ??4CString@@QAEABV0@ABV0@@Z ; CString::operator=(CString const &)
.text:10003BE7 lea ecx, [ebp-7Ch]
.text:10003BEA call ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void)
.text:10003BEF or dword ptr [ebp-4], 0FFFFFFFFh
.text:10003BF3 lea ecx, [ebp-7Ch]
.text:10003BF6 call sub_10003C6D
.text:10003BFB mov ecx, [ebp-0Ch]
.text:10003BFE mov large fs:0, ecx
.text:10003C05 leave
.text:10003C06 retn
.text:10003C06 sub_10003BA2 endp ; sp = 4


eTrust MailWatcher1.0

标 题:破解北京冠群金辰软件公司出的信息泄漏拦截(eTrust MailWatcher)1.0 版(installshield) (1千字)
发信人:error
时 间:2001-2-18 18:00:58
详细信息:
从破解北京冠群金辰软件公司出的信息泄漏拦截(eTrust MailWatcher)1.0 版
谈installshield破解方法：
本想通过反编译installshield来破解，可反编译不成功。只好用动态破解的方法了。使用工具 trw2000 下面是破解过程：
运行trw2000，运行eTrust MailWatcher 1.0的安装程序，到达添注册信息的页面时，用户名，用户公司，注册号随便添些东西，因为不添东西的话，“下一步”不可按。用ctrl＋n 调启trw2000，下bpx messageboxa ，目的是拦截消息框，按f5 回到 注册页面，按“下一步”，trw2000被调启，因为注册号是不对的。在trw2000内下指令bc*清掉上面的断点，下断点bpx 00410afd，想知断点如何找到的请看括号内，如只要安装就可以的话，可跳过下面括号。

(按f12，到达所在call的ret，此时，会弹出注册号错误框，按“确定”后，又会回到trw2000里，按f8离开这个call，再按f12，f8再离开一个call，再按f12，f8再离开一个call，将光标上移会看到
test eax,eax
jnz 0041b04
在jnz 0041b04处下断点，为什么我在这下断点，是经验告诉我的，如你问我经验怎来的，是因为我已经经历过n次失败，在失败中得来的)

按f5，会弹出注册号错误框，按“确定”后，程序会停在jnz 0041b04处，改变z标志，让它不可跳，再下bc*清断点。按f5，eTrust MailWatcher 1.0的安装程序就会跳到下一个页面了，程序安装也就成功了。但是，这个程序安装成功后，程序执行文件还会检验注册部分，如过注册码不对，程序不会运行。用trw2000加载mwatch.exe，下指令bpx 00401929 会看到下面代码：
00401929 FFD6 call esi
0040192B 85C0 test eax,eax
0040192D 0F857A010000 jne 00401aad －－》跳走程序就不运行
00401933 837C241C6D cmp dword ptr ds:[esp+1ch],6dh
00401938 0F856F010000 jne 00401aad －－》跳走程序就不运行
0040193E 8B442420 mov eax,dword ptr ds:[esp+20h]
00401942 83F805 cmp eax,05h
00401945 7D0B jnl 00401952 －－》跳走程序正常运行

让程序运行的破解过程写的不太细，是因为我写这篇文章目的不是讲破这个软件，而是讲破解installshield的方法。希望这篇文章能帮助大家了解installshield的破解方法。如有任何不解的地方，请发贴，我会尽量回复的。


Hope 3D 2001 希望室内设计系统

标 题:入门教程==>InstallSHIELD Script Cracking (Hope 3D 2001 希望室内设计系统) (3千字)
发信人:zest
时 间:2001-4-5 0:17:06
详细信息:
入门教程==>InstallSHIELD Script Cracking (Hope 3D 2001 希望室内设计系统)

目标：Hope 3D 2001 希望室内设计系统（新世纪特别版） 2CD

crack原因：朋友买D碟没序列号无法安装，作痛苦状。

难点：程序安装时序列号不对“下一步”为灰色!!!!!!
不象windvd2.0，cakewalk7.0，delphi5.0的安装，
有“下一步”，可根据出错提示框跟踪。

=====================================================================
方法一：

tool：TRW2K122
姓名：zest
公司：ok
序号：89898989
下断点：bpx GetWindowTextA
F5返回
序号再填：8
马上中断
pmodule后，位于_INS576!.text+????中：

0167:0040A13F FF15B8994900 CALL `USER32!GetWindowTextA`
0167:0040A145 8D8500FCFFFF LEA EAX,[EBP+FFFFFC00] ==>898989898
0167:0040A14B 50 PUSH EAX
0167:0040A14C 8B4508 MOV EAX,[EBP+08]
0167:0040A14F FF7008 PUSH DWORD [EAX+08]
0167:0040A152 E8F4810300 CALL 0044234B
0167:0040A157 6A00 PUSH BYTE +00
0167:0040A159 6A00 PUSH BYTE +00
0167:0040A15B E841C30300 CALL 004464A1
0167:0040A160 33C0 XOR EAX,EAX
0167:0040A162 E978000000 JMP 0040A1DF
---------------------------------------------------------------------
在0167:0040A14B处
eax=006DF870
d eax显示898989898
下bpm eax
连续按F5，经过很多`lstrlena`，`lstrcpya`
观察006DF870之值由898989898-->ok-->zest-->898989898
然后小心按F10直到：
---------------------------------------------------------------------
0167:0046DC58 E8E84BFDFF CALL 00442845
0167:0046DC5D 8D8500F8FFFF LEA EAX,[EBP+FFFFF800] ==>660-60023351 (cool code)
0167:0046DC63 50 PUSH EAX
0167:0046DC64 8D8500FCFFFF LEA EAX,[EBP+FFFFFC00] ==>898989898 (bad code)
0167:0046DC6A 50 PUSH EAX
0167:0046DC6B FF158C974900 CALL `KERNEL32!lstrcmpiA`==>关键比较!!!!
0167:0046DC71 8985FCF7FFFF MOV [EBP+FFFFF7FC],EAX
0167:0046DC77 FFB5FCF7FFFF PUSH DWORD [EBP+FFFFF7FC]
0167:0046DC7D 6A00 PUSH BYTE +00

简单吧?我可是经过很多bpx,bpx,bpm,bpm才找到上述规律的，
你可找个类似的InstallSHIELD来看看其难度。
=====================================================================
方法二：

用Windows.Installshield.Decompiler.V1.00.Beta反编译Setup.ins
找关键：

<LABEL_00B9> REF: 00003FE9 00004069 000040E9 00004169
|
00004394: 00B6 START OF FUNCTION (3*StrLocals + 4*NumLocals)
000043A6: 00B4 NumLocal[0003] = GetDlgItem (NumLocal[0001],NumLocal[0002])
000043C9: 0128 IF (IsWindow (NumLocal[0003]) = 00000000) THEN
000043E9: 012F Return (00000000)
000043EA: 0000 ENDIF
000043F6: 00B5 SdRemoveEndSpace_[LABEL_0089] (StrLocal[0002])
00004401: 00B5 SdRemoveEndSpace_[LABEL_0089] (StrLocal[0001])
0000440C: 00B5 SdRemoveEndSpace_[LABEL_0089] (StrLocal[0003])
0000442B: 0128 IF (StrCompare (StrLocal[0003],"660-60023351") = 00000000) THEN
0000444B: 00B4 EnableWindow (NumLocal[0003],00000001)
00004458: 0000 ELSE
00004461: 00B4 EnableWindow (NumLocal[0003],00000000)
00004462: 0000 ENDIF
00004472: 00B8 END OF FUNCTION ()
00004474: 00B8 END OF FUNCTION ()
0000447A: 00B6 START OF FUNCTION (6*StrLocals + 7*NumLocals)
00004492: 0013 StrLocal[0005] = "SdRegisterUser"

序号：660-60023351
=====================================================================
方法三：

用ultraedit在Setup.ins中找找找找找，你看哪个象serial就填哪一个。
=====================================================================

-=zest=- 2000.4


InstallShield Pro 5

 标 题:转一篇比较简单的installshiled的破解 (2千字)
发信人:peterchen
时 间:2001-5-14 9:40:35
详细信息:
InstallShield Pro 5 Build 221 for Win95
Crack InstallShield International East build 224

1. Execute the package (about 20MB) downloaded from InstallShield ftp:
ftp://ftp.installshield.com/is5/intl/east/pftw/is5east.exe
2. At password-input screen, launch soft-ice. Clear all the other
breakpoints and then bpx USER32!GetWindowTextA
3. Quit soft-ice. Press a key in the password editbox.
4. Soft-ice will be triggered at GetWindowTextA
5. Issue "p ret" to get out of this procedure. You should then stop at

00403719 mov edx, [0040ef90] ; edx->input buffer
push edx ; PARAMETER_1
call 00401090 ; checksum procedure
mov edx, [0040ea88] ; ideal value of return
add esp, 4 ; stack fixup ... late
xor ecx, ecx ; zero ecx
cmp eax, edx ; eax = edx?
setz cl ; yes, cl = 1; no, cl = 0
mov eax, ecx
pop ebp ; stack frame
ret ; return in eax

while the previous instruction is to call GetWindowTextA

6. As you can see in the above, the procedure at 00401090 is the one we
are looking for. It takes one parameter: the address of the password
string. After some processing, it will return a value in eax
calculated from the string. In order to ease the reading, following
shows a psuedo-code of the procedure rather than assembly.

accumulation = 0xf143ac
do
ch = *lpPassword++;
if (ch == '\0') break;
accumulation += 2 * ch;
loop
accumulation xor 0x51993;
return accumulation;

7. After the accumulation value is returned, the program than compares
with the ideal value, which is 0xF44F75 stored in address 0040ea88 in
this case.
8. So that we can calculate the accumulation before xor, which is F156E6.
Subtract this value by the initial value F143AC will get whatever is
added in loop. From the psuedo-code, the value added is two times the
checksum of the password string, which is 0x133a.
9. Since each character is added up by two times of value, therefore the
actual checksum of the password is 0x133a / 2 = 0x99d.
10. By using a basic program to count up a checksum, I decided to use
"asdfasdfasdfasdfasdfasdO" (5 times 'asdf' plus 'asd' and 'O', case
sensitive) as the password. The final 'O' is just a fixup. Nothing
special. You may use any similar method to add-up to your own favorite
password for InstallShield International East 5 build 224.

*. The above cracking technique can be applied on PackageForTheWeb
2.00.200 packages.

标 题:再来一篇 (6千字)
发信人:peterchen
时 间:2001-5-14 9:44:18
详细信息:

66、InstallShield Pro 5 Build 221 for Win95 =======================================================

How to find the password of IS5P221.exe(InstallShield PrfessionalEdition 5.0, build 221)
========================================================================================

Tools that I used:
1. SoftIce for NT.
2. Windows NT Workstation 4.0 (english version, build 1381 with service pack 3)

Let's go:
Run the Is5P221.exe, after the about screen, it will ask you to type
the password to continue, below the Password dialog, you will not get a enabled
'Finish' button until you have entered the correct password.

So, Let us think how to find the correct pasword. After we type a character
the package must compare the characters we have entered with the correct password.

So let's begin:
First, just type anay number of characters, for example, '121212', to the pasword
field, press Ctrl-D to switch to softice, type

:bpx getwindowtexta
:Ctrl-D

Now we are back to the password dialog, enter another '1' to password field,
softice will pop up at User32!GetWindowTextA, hit F12 to return to is5p221,
now we try to serach the stack to find the password we have entered,

:s ss:0 lffffffff '121212'
Pattern find at xxxx:01800820

We have to set the breakpoints to any code they read this area, so type
:bpm 018000820 r

Press F5 to continue running, SoftIce will pop up at KERNEL!CompareStringA
:77f2b318 mov al, [esi]
:77f2b31a cmp [ebx], al <--- softice pop up at here,
ebx equal to '01800820'
:77f2b31c jnz 77f2b325 <--- if not equal, incorrect password, jump away
:77f2b31e inc esi <--- if equal, increment index
:77f2b31f inc ebx
:77f2b320 cmp byte ptr[esi], 00 <--- test if this is the last character of
stored password
:77f2b323 jnz 77f2b318 <--- compare with next character

OK, take a rest, light a cigarette, we have found the stored password, is it so easy ?

dump the data at [ebx], [esi]
:d ebx <--- you will see the password you have entered.
:d esi <--- you will see the stored password(I will give you a clue, the stored password is
"dol???????", just try to find out by yourself)

Write down the stored password you have found to a paper, then disable any breakpoints,
:bd *
:Ctrl-D

We are back to the password dialog again, erase the incorrect password, type the sotred
password you have found to the password field, you will get a enabled 'Finish' button.

Now let's think how could we crack this type of application quickly ?
The answer is :
1. run this type of program.
2. type any number of characters to the password field.
3. switch to the SoftIce.
4. set a breakpoint to KERNEL32!CompareStringA by
:bpx CompareStringA
5. run the program again and type one more character to the password field
6. softice will pop up at KERNEL32!CompareStringA
7. step the code until you stop at "jnz 77f2b325"

:77f2b318 mov al, [esi]
:77f2b31a cmp [ebx], al <--- softice pop up at here,
ebx equal to '01800820'
:77f2b31c jnz 77f2b325 <--- if not equal, incorrect password, jump away
:77f2b31e inc esi <--- if equal, increment index
:77f2b31f inc ebx
:77f2b320 cmp byte ptr[esi], 00 <--- test if this is the last character of
stored password
:77f2b323 jnz 77f2b318 <--- compare with next character

8. dump the data pointed by [esi], you will get the stored password.

这是很有深度的思考，不过既然要能对所有的密码保护都能所向无敌，应该从密码保护程式设计的角度去
观察。当然在做更深入的探讨之前，我赶忙去下载了一份InstallShield Pro 5 Build 221。我以後的软
体会用得到。

那麽，这类的边输入边查核的密码保护到底还可以用什麽方式作出来呢？有没有办法不透过 GetWindowText
就可以取得使用者在编辑窗的输入呢？答案是肯定的，事实上，有许多方法可以达成。其一，可以以
SendMessage EM_GETLINE拷贝缓冲区。其二，直接利用 SendMessage EM_SETHANDLE 指定缓冲区给编辑
窗，直接从自己的缓冲区读输入。甚或是直接 Subclass 或 Hook编辑窗，直接一个字一个字自己组合起
来。前两种范例，都可以利用 soft-ice search 的功能，再设定 BPR (Breakpoint on Range，中断於一
记忆体范围) 的 breakpoint 达成拦截，唯最後一者比较棘手，可能要找出 subclass 或 hook 的程序才
加以breakpoint，并要过滤出 WM_CHAR 或相关可以取得使用者输入字元的讯息。头皮发麻了吧？

好吧，来谈谈处理输入、判定密码的问题。一个程式，其实要做密码的判断并不难。可是不知道怎麽搞的，
许多程式一窝蜂的使用系统呼叫。其实下列不出32 bytes 的组合语言片段即可做字串比较。

; 假设 ds=es
mov esi, offset 字串1
mov edi, offset 字串2
mov ecx, 字串长度
repe cmpsb
jne 字串不相同
; 字串相同

也可以搞得复杂一点，如下所示，既有简易密码保护，也有简易流程保护：

; 假设 ds=es
xor ecx, ecx ; ecx=0
xor ebx, ebx ; ebx=0
mov ebp, offset 字串1 ; 密码值
mov esi, offset 字串2 ; 输入值
fetch_one_dword:
; 如果索性跳过这一行，会造成堆叠损毁
push dword ptr ds:[ebp + cx] ; 可能也可以用 byte ptr 吧？我不确定。
pop eax
xor eax, 55aa55aah ; 简易编码过的密码值，再 xor 一次以还原
cmp eax, dword ptr [esi + cx]
jnz password_error
add ebx, eax ; ebx += eax
add ecx, 4
cmp ecx, 字串长度
jnb done
jmp short fetch_one_dword
done:
; 先把使用者的输入字串和计算好，在此略
call calc_checksum ; esi = 字串2, 传回: eax = checksum
cmp eax, ebx ; 如果你试着要跳过前面的 cmp 的话
jne password_error ; ebx 得到的 checksum 在此会不同
; 密码答对了，有奖！

流程保护是指，不论如何，一定要完全检查过密码就是了。不然有得瞧！

当然，也有更高段的保护的。这里示范的只是一个概念，并无意要出题考各位破解
的功力。这里我还想得到的保护，还有利用 soft-ice的死角。概念是，因为 soft-ice
只能为单一执行绪除错，其他的不是被终止，就是在你执行系统呼叫时才偷偷执行，
你无法一次除错或确实终止多重执行绪，所以我就想到利用建立另一个执行绪来帮
我比较密码的概念。

嗯，能跟我跟到这里，也要谢谢您的耐心，我希望诸君都一个字一个字地看过一遍，
因为我有些句子浓缩了不少（打完字後才发现）。不过我衷心的希望这多多少少对
您有帮助。

--

Robin Hood
ICQ UIN: 1311717

mailto:robin.hood@ibm.net
-----------------------------------


installshield script

标 题:翻译一篇很简单的暴力破解installshield! (6千字)
发信人:peterchen
时 间:2001-3-15 1:42:47
详细信息:
破解installshield script的教程
翻译者：Petetchen
[ ]的翻译是我的好朋友windos2k协助！在些多谢他！

Author : SiraX / [NaTzGUL/SiraX Production 98]
Email : sirax@dongle.net

目录：
1.介绍
2.工具教程
3.反译破解教程
4.总结
5.联系

1.介绍
这个教程是试范Windows Installshield Decompiler v1.00的用法。
通过这个教程你将看到如何破解install的密码保护，一般多数软件都是用它打包。
希望通过这个教程，你将学会灵活工具和最重要正确使用这些方法来对付script.

2.工具教程
相信只有它才能反序破解installshield的保护了。
它具有CRC校正自动修改和保存的功能，这样它就有别的工具没有的功能。
这个教程里的破解对象是Adobe PhotoShop V4.0的图象编辑工具。它是用
Installshield 3.0制成的密码保护。

3.反译破解教程
在这一节，我就以破解Adobe PhotoShop V4.0逐步逐步分析。每个步都指出
对图形窗的运用。

1.装载Installshield Decompiler
2.运行setup.exe，直到注册窗出来如:
name:
company:
serial number:
任意输入密码之类, 点击Next当看到
"The serial number xxxxxxxxxx is not a valid Adobe PhotoShop serial number,
Please re-enter your serial number."为止。
3.现在写下错误提示如："invalid".我们要在反译后在"text later on"上找这样的提示。
4.退出setup,开始备份setup.ins
5.点打开菜单上的"file"(热键ctrl-O ),在打开窗口中选取Adobe PhotoShop的setup.ins文件。
6.紧着按F2或者打菜单上"decompile"->"star"不久你就看见反译进程。如果你想终止，可以点
工具栏上的"cancel"按扭。
7.当反译后，我开始找"invalid"的提示。这样的提示在工具栏"text box"上找得到,然后点击。
就来到：
<LABEL_002> REF:00000F97 00001016 00001388
|
00000DB9: 0128 IF (SdRegisterUserEx_[LABEL_0214]=000000C) THEN
00000DD9: 002C Goto (LABEL_0001)
00000DDA: 0000 ENDIF
00000DE6: 0125 StrVar[002F] = SUPPORTDIR ^ "PSSupprt.DLL"
00000E12: 0128 IF (UseDLL (StrVar[002F]) != 00000000) THEN
00000E32: 0013 StrVar[001A] = "An Error occurred during the setup process! Please contact Adobe Systems Technical Support."
00000E95: 0104 SprintfBox (FFFF0003,"Adobe Photoshop Setup",StrVar[001A])
00000EBA: 002B Exit ()
00000EBB: 0000 ENDIF
00000ED4: 0128 IF (PSSupprt.PSFunc1 (StrVar[0024]) = 00000000) THEN //function return value is compared to 0. 0 is bad.
00000EF4: 00B3 UnUseDLL ("PSSupprt") [函数返回值是与0比较，相等是不好的]
00000F01: 0013 StrVar[001A] = "The serial number %s is not a valid Adobe Photoshop serial number. Please re-enter your serial number."
00000F6F: 0104 SprintfBox (FFFF0002,"Adobe Photoshop Setup",StrVar[001A],StrVar[0024]) ////Displays the error message
[显示错误信息]

00000F97: 002C Goto (LABEL_0002) //Loops back and let user to re-enter info
00000F98: 0000 ENDIF [后退并且容许使用者重输入信息]
00000FA4: 0125 StrVar[002F] = SUPPORTDIR ^ "PSSupprt.DLL"
00000FBB: 00B3 UnUseDLL (StrVar[002F])
00000FF6: 0128 IF (SdConfirmRegistration_[LABEL_0260] = 00000000) THEN
00001016: 002C Goto (LABEL_0002)
00001017: 0000 ENDIF
00001023: 0013 StrVar[0023] = "File Components"
0000103A: 00B5 Call Function_0055_[LABEL_00F4] (StrVar[0023])
...............
8.在上面反译的内容，你能清楚看到要改的地方。
At 0000E12:0128, we have a comparison with the return value of a function and the value 0.
If the return value is zero, then we're in trouble. The error message will be displayed
at line 00000F6F:0104. Then at line 00000F97:002C, we go back to Label_002 so that this
process is repeated and user can re-enter the info.
(在0000E12:0128我们可参考[函数返回值是与0比较，相等是不好的]如果返回声明是0，这样你就麻烦了！
在00000F6F:0104[显示错误信息]。然后00000F97:002C跳回Label_002[后退并且容许使用者重输入信息])
9.Since we have identified the spot to be changed, now it's time to crack it. To make a
change so that it will accept our wrong serial, we can change the "=" operator at line
00000ED4:0128 to "!=". Clear enough!
(当我们确认修改的地方，那么就把00000ED4:0128的"="变成"!=".)

10.To make the change, it's very simple. First, double click on the "=" operator. Then
right-click your mouse to bring up the popup menu. Choose "Change To" and pick the "!="
operator. After this, you should see that the operator is now "!=".
(修改方法很简单。首先正确双击"="，之后显示一个浮动菜单。从中选取"Change To"和点选"!="，然后
你会看见"="变成了"!="。)

11.Once the above is done, we need to save the changes we made. You can either goto "Misc"
menu to pick "CRC Correction" or you can quit the IS decompiler and you will automatically
be asked whether you want to save changes or not. Click on "yes" when you're asked. And
then just sit back and relax. In a few minutes, you will see it in action.
(当你保存修改的地方后，就去点菜单上的"Misc"->"CRC Correction"或者快速的退出 is decompiler
它会自动的提示你是否保存结果选"yes")
12.After it's done, simply run the Adobe PhotoShop setup again, and enter any info and serials
at that screen. Then click on "Next". Whoaaaa. Beauti! A confirm box popped up this time,
asking us whether this information is correct or not. We DID NOT see the error message box.
Now, just click on "yes" to confirm this info is right and follow the instructions to
install the rest.
(当你做完以上工作，再一次安装Adobe PhotoShop时出现注册窗你只要按下一步就连密码也不要校正。)

13.Hey, wasn't that easy! I did it in about 10 min. The decompile process took a while. But
would you rather spent a few hours tracing through the code or POINT and CLICK to defeat it?
(多么的容易！我只用了10秒钟。如果你想追出密码就要分一些时间了？)
4.总结：
From the above walk through, we can see how easy it is to defeat such Installshield
protection with this decompiler. I hope I have made the steps clear enough for you to walk
through and get some general feel for this tool. If you have any questions, suggestions, or
even bug reports regarding this tool, we would love to hear from you. You can email us, or find
us on EFNET. After all, this is still in beta.

5.联系：
Groups:
DONGLE, GPF, REVOLT, GLoW, ENTITY, CONCEPT, PNC, etc
PERSONAL:
NaTzGUL, Vizion, BLeetz, Krazy_N, Niabi, Deviant, Norway, FaNt0m, Knoweffex, JoG, Pitty, Info[e], [Mad], [Sketch]
Hazzy, Perish, JJJ, 45mBit, CoPhiber, Spanky, Doc-Man, SuperChic, Wildwendy, Tane, TeRaPhY, Razzia, +ORC, Fravia+
LordCaligo, Dap24, Op-Ivy, Ghi, etc.....

(c) 1998 SiraX / [NaTzGUL/SiraX Production] All rights reversed


KPT 6

标 题:用ISDCC2破KPT 6的安装 (8千字)
发信人:Passion
时 间:2001-4-17 23:14:33
详细信息:
用ISDCC2破KPT 6的安装
Passion

不好意思，近来我只研究一点INSTALLSHIELD的反编译和破解，这里又贴半篇引用外界DLL文件的脚本破解法，文章水平不高，大伙儿见笑了。——之所以是半篇，因为KPT 6作为PhotoShop滤镜插件运行的时候会重新检测序列号，而本文只仅仅说了说破解安装的过程。
KPT 6的安装程序也需要输入序列号，又是InstallShield在捣鬼。反编译InstallShield的工具比较多，只是各自适用的版本不同，那个WISDEC能反编译的SETUP.INS似乎版本比较低，对付KPT 6的脚本文件出错，幸亏有个ISDCC2适用InstallShield 5.5版，可以以命令行的方式进行反编译，也可重定向到文件，只是反编译后的代码没有跳转、修改等直接的功能。我已经忘了到底是哪儿下载的，幸亏README.TXT中说了网址是http://www.tardis.ed.ac.uk/~adq

在命令行里运行isdcc2 setup.ins > kptsetup.txt就能把反编译后的内容写到KPTSETUP.TXT文件中。我个人看来，ISDCC2的反编译效果比WIS要好，可读性也强一点，但没代码导航、字串引用的功能，修改起来也很不方便。幸亏KPT 6这个东西的破解是不需要修改SETUP.INS的，否则又要麻烦了。

反编译后的KPTSETUP.TXT中包括变量声明、结构声明、函数原型声明以及反编译代码等几部份。函数声明段内有这么几句：

// ------------- FUNCTION PROTOTYPES --------------
……
prototype MCSetup.MCSerialCheck(LIST, LIST, LIST);
prototype MCSetup.MCSerialWrite(LIST);
……

这个表示安装的时候要引用MCSETUP.DLL文件中的MCSerialCheck和MCSerialWrite两个函数，看看名称，八成儿就是直接检验输入的序列号是否正确以及写入注册表的。
正文中又有那么一段：

// ------------- MAIN PROGRAM CODE --------------
……
label12:
0011B5:0022: if (1 = 0) then
goto label14;
endif;
0011C5:00B5: function112();
0011CD:0021: lNumber0 = LAST_RESULT;
0011D5:0128: lNumber3 = lNumber0 = 12;
0011E7:0022: if (lNumber3 = 0) then
goto label14;
endif;
0011F5:002C: goto label12;
……

当然，光看这段，谁都看不出这是检验序列号正确与否的，但这里面的那个function112();就有点文章。下面是function112()的内容：

// ------------- FUNCTION function112 --------------
function function112()
number lNumber0;
number lNumber1;
number lNumber2;
number lNumber3;
number lNumber4;
number lNumber5;
number lNumber6;
number lNumber7;
string lString0;
string lString1;
string lString2;
string lString3;
string lString4;
string lString5;
begin

label64:
0027F1:0110: RegDBSetDefaultRoot(-2147483646);
0027F8:0021: lNumber2 = 1;
002802:0022: if (number34 = 0) then
goto label66;
endif;
002810:0013: lString4 = "\\SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION\\";
002846:002C: goto label67;
00284F:0013: lString4 = "\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\";

label66:
002886:0152: RegDBGetKeyValueEx(lString4, "REGISTEREDOWNER", lNumber2, string5, lNumber0);
0028A6:0110: RegDBSetDefaultRoot(-2147483648);
0028AD:0013: lString0 = "Product Registration";
0028C9:0013: lString1 = "Please enter your name and the product serial number\nfor %P.";
00290D:0013: lString2 = "Name";
002919:0013: lString3 = "Serial Number";
00292E:0112: StrLoadString("", "PRODUCT_ID", lString5);
002943:00BA: AddressString(lString5);
002948:0021: lNumber3 = LAST_RESULT;
002950:0021: lNumber1 = 0;

label67:
002960:0128: lNumber6 = lNumber1 = 0;
002972:0022: if (lNumber6 = 0) then
goto label73;
endif;
002980:00B5: function17(lString0, lString1, lString2, lString3, string5, string7);
00299A:0021: lNumber0 = LAST_RESULT;
0029A2:0128: lNumber6 = lNumber0 = 1;
0029B4:0022: if (lNumber6 = 0) then
goto label71;
endif;
0029C2:0023: StrCompare(string5, "");
0029CA:0128: lNumber6 = LAST_RESULT = 0;
0029DC:0023: StrCompare(string7, "");
0029E4:0128: lNumber7 = LAST_RESULT = 0;
0029F6:0126: lNumber6 = lNumber6 || lNumber7;
002A01:0022: if (lNumber6 = 0) then
goto label69;
endif;
002A0F:002A: MessageBox("Please enter your name and the product serial number.", -65534);
002A4E:002C: goto label70;

//以上是要求输入序列号和公司名的。

label68:
002A57:00BA: AddressString(string5);
002A5C:0021: lNumber4 = LAST_RESULT;
002A64:00BA: AddressString(string7);
002A69:0021: lNumber5 = LAST_RESULT;
002A71:00B4: MCSetup.MCSerialCheck(lNumber3, lNumber4, lNumber5);

//就这个MCSerialCheck了。

002A7F:0021: lNumber1 = LAST_RESULT;

label69:
002A8B:002C: goto label72;

label70:
002A94:0021: lNumber1 = 1;

label71:
002AA2:002C: goto label68;

label72:
002AAB:012F: return(lNumber0);
002AB2:00B8: return;
end;

这里很明白，如果我们能把MCSETUP.DLL中那个MCSerialCheck函数分析清楚，序列号的检验算法就都能知晓了。要是像我这样懒得分析的，就跟踪下去改掉MCSetup.MCSerialCheck函数的返回值也行。MCSETUP.DLL是安装程序运行的时候解压临时生成的，就在WINDOWS/TEMP目录下的一些子目录中，安装程序在运行时就能找到。

下面是MCSerialCheck函数的总体代码：

Exported fn(): MCSerialCheck - Ord:0002h
:100015D0 81EC3C020000 sub esp, 0000023C
:100015D6 8D442400 lea eax, dword ptr [esp]
:100015DA 53 push ebx
:100015DB 56 push esi
:100015DC 57 push edi
:100015DD 50 push eax

* Reference To: KERNEL32.GetLocalTime, Ord:011Bh
……
|
:100015DE FF1508600010 Call dword ptr [10006008]
:100015E4 8B742412 mov esi, dword ptr [esp+12]
:100015E8 8B7C240E mov edi, dword ptr [esp+0E]
:100015EC 8B8C2454020000 mov ecx, dword ptr [esp+00000254]
:100015F3 8B5C240C mov ebx, dword ptr [esp+0C]
:100015F7 51 push ecx
:100015F8 8D4C2420 lea ecx, dword ptr [esp+20]
:100015FC E8FFF9FFFF call 10001000
:10001601 53 push ebx
:10001602 57 push edi
:10001603 8B942454020000 mov edx, dword ptr [esp+00000254]
:1000160A 56 push esi

* Possible Reference to String Resource ID=00001: "Installer Serialisation"
|
:1000160B 6A01 push 00000001
:1000160D 52 push edx
:1000160E 8D4C2430 lea ecx, dword ptr [esp+30]
:10001612 E879FBFFFF call 10001190 //这个是关键CALL
:10001617 8BF0 mov esi, eax
:10001619 6683FE01 cmp si, 0001
:1000161D 7525 jne 10001644 //比较结果，正确则跳。
:1000161F 8B842450020000 mov eax, dword ptr [esp+00000250]
:10001626 6858770010 push 10007758
:1000162B 50 push eax
:1000162C 8D4C2424 lea ecx, dword ptr [esp+24]
:10001630 E88BFEFFFF call 100014C0
:10001635 5F pop edi
:10001636 5E pop esi
:10001637 83C8FF or eax, FFFFFFFF //FFFFFFFF是错误标志
:1000163A 5B pop ebx
:1000163B 81C43C020000 add esp, 0000023C
:10001641 C20C00 ret 000C //出错返回。

:10001644 ………… //其余代码。

从10001612处的call 10001190跟进去后是大段大段的序列号分析代码。我功力不够，只跟到规定序列号格式的部分，后面的几个循环迭代就把我弄晕了。本来又想暴力法改掉MCSETUP.DLL的代码，但我手头的ICOMP又不能把改了后的文件给压缩回去，估计又是版本不对的问题，而SETUP.INS中似乎又没有明显的、改一个跳转就改变流程的代码，何况要改也不知道应该改SETUP.INS文件的什么地方。

序列号格式我分析了一点点，序列号长度只能是13、17、1a或1e，当然就选13（十进制是19个字符）了。前两个字符必须为TF，第三个和第四个字符必须为数字，第五个字符必须是W或者C（WC？和厕所有没有关系？^_^），第六个字符必须是BCENRU六字母之一，第七个字符必须是BCDFGMJKLMPSTZ之一，第八个字符是短横-，第九到第十五个字符必须是数字，十六个是短横-，十七十八十九三个字符必须都是大写字母，且不能是I或者O，而且……最重要的一点是它会根据注册码前面部分先算出一个值，再后面又算出一个，比较相等才对，这段算法我实在是跟不清，见笑了。


NetScanTools Pro 2000

标 题:破解NetScanTools Pro 2000及其InstallShield脚本破解（其实脚本没破成） (18千字)
发信人:Passion
时 间:2001-3-30 23:50:41
详细信息:
破解NetScanTools Pro 2000及其InstallShield脚本破解（不完整）

Passion

我几个星期前曾受被人尊称为“皮大爷”的peterchen老兄的语无伦次的鞭策，于是也好高骛远地想研究研究InstallShield的脚本破解，正巧不久前见了洋白菜兄的InstallShield脚本反编译教程，觉得比一个字节一个字节地研究INS文件的编译后代码要方便多了，因而也就偷了许多懒。——NetScanTools Pro 2000是一套功能非常全面的网络扫描监控工具，Northwest Performance公司开发，网址是http://www.nwpsw.com/，不过此处没完整版下载。
NetScanTools Pro 2000安装时需要输入序列号，直接破据说非常麻烦，一个比较好的法子是从INS文件入手。我在洋白菜兄的主页crackbest.com上下了一个DIS（DeInstallShield），用它反编译setup.ins文件感觉还可以。
NetScanTools Pro 2000安装程序会询问姓名公司序列号，填完按NEXT后会出现一个框要你确认填的是否正确，按“Yes”后才进行序列号检测，错则弹出对话框说“Invalid Serial Number。”没的说，用DIS反编译其SETUP.INS，在结果中找“Invalid Serial Number”的MSGREF消息字串引用，很快就找到了下面的一段：

<LABEL_0038> REF: 00000F72
|
00002044: 00B6 START OF FUNCTION (2*StrLocals + 3*NumLocals)
00002054: 0013 StrVar[001C] = ""
0000205C: 0013 StrVar[001D] = ""
00002064: 0013 StrLocal[0001] = ""
0000206C: 0013 StrLocal[0002] = ""
00002074: 0002 Disable (00000032)

<LABEL_0039> REF: 00002147
|
0000207F: 0021 NumLocal[0002] = 00000000
0000208D: 0129 WHILE (NumLocal[0002] = 00000000)
000020AF: 00B5 NumLocal[0001] = SdRegisterUserEx_[LABEL_00B0] (StrLocal[0001],StrLocal[0002],StrVar[001C],StrVar[001D],StrVar[001E])

000020CE: 00B5 NumLocal[0002] = SdConfirmRegistration_[LABEL_00E5] (StrLocal[0001],StrVar[001C],StrVar[001D],StrVar[001E],00000000)
000020EF: 0000 ENDWHILE

//以上这个WHILE就是让你输入序列号并确认的。

00002108: 0128 IF (Call Function_006F_[LABEL_004D] != 00000001) THEN
~~~~这里是不等于号
00002128: 002A MessageBox ("Invalid Serial Number",SEVERE)
//在此处引用MSG字符串。
00002147: 002C Goto (LABEL_0039)
00002148: 0000 ENDIF

//然后调用LABEL_004D处的Function_006F来验证序列号，如果返回值不是1就表示出错，出现出错对话框。

00002150: 012F Return (NumLocal[0001])
00002157: 00B8 END OF FUNCTION ()

因此这里最简单的想法是把00002108处的不等于改成等于，正巧DIS有这个功能，右键点击它选Change to，改成等于就行了。退出DIS的时候会提示是否重新校验INS文件，因为SETUP在运行时会首先检测INS文件的CRC校验和，因此这里修改后也要重新校验，选“是”后新的INS文件就产生了。
再运行NetScanTools Pro 2000的安装程序，序列号乱填一气，安装通过。

按理说通常的安装软件，破到这个程度也就差不多了，但NetScanTools Pro 2000多做了一点小手脚。本来我还挺高兴地运行NSTPRO.EXE想看看自己的成果，NSTPRO.EXE却忽地弹出个窗口说是“Invalid Installation……”并且要求重新安。？哇！看来NSTPRO.EXE启动时还有一步序列号的判断过程。序列号信息存放在什么地方呢？我连REGMON和FILEMON都懒得用了，直接打开注册表寻寻觅觅就找到了这一处：HKEY_LOCAL_MACHINE\Software\Northwest Performance Software, Inc.\NetScanTools Pro\2000\NETSCANTOOLSPRO，下面是输入的用户名和序列号等。

首先就觉得似乎从NSTPRO.EXE中分析序列号算法还不如从INS文件中分析来得简单，既然脚本中判断序列号是否正确的子程序在LABEL_004D处，就把它的内容列出来看看啦：

<LABEL_004D> REF: 00002108
|
00002A92: 00B6 START OF FUNCTION (3*StrLocals + 10*NumLocals)
00002AA4: 0021 NumLocal[0005] = 00000081
//一个固定值
00002ABB: 0128 IF (StrLength (StrVar[001E]) < 00000018) THEN
00002ADB: 012F Return (00000000)
00002ADC: 0000 ENDIF
//如果序列号长度小于18H则出错
00002AE8: 0128 IF (NumLocal[0006] > 00000019) THEN
00002B08: 012F Return (00000000)
00002B09: 0000 ENDIF
//长度大于19H也出错，因此序列号只能是18H位或19H位。

00002B15: 0128 IF (NumLocal[0006] = 00000018) THEN
//如果长度是18H，则……
00002B35: 0021 NumLocal[0003] = 00000000
//N3是SL3的字串位置指针
00002B3F: 0021 NumLocal[0002] = 00000013
//N2是序列号的字串位置指针

<LABEL_0050> REF: 00002B9D
|
00002B4D: 0128 IF (NumLocal[0002] <= 00000017) THEN
00002B6D: 007A NumLocal[0009] = GetByte (StrVar[001E],NumLocal[0002])
//SV1E是用户输入的序列号
00002B78: 007B SetByte (StrLocal[0003],NumLocal[0003],NumLocal[0009])
00002B83: 0119 NumLocal[0003] = NumLocal[0003] + 00000001
00002B90: 0119 NumLocal[0002] = NumLocal[0002] + 00000001
00002B9D: 002C Goto (LABEL_0050)
00002B9E: 0000 ENDIF
//将SL3的值赋成序列号中的第13H位到17H位子串，该子串是数字。
00002BA6: 0021 NumLocal[0006] = 00000013
//并且N6记录了该数字字串在序列号中出现的位置
00002BA7: 0000 ENDIF

//如果长度是19，则……
00002BB4: 0128 IF (NumLocal[0006] = 00000019) THEN
00002BD4: 0021 NumLocal[0003] = 00000000
00002BDE: 0021 NumLocal[0002] = 00000014

<LABEL_0053> REF: 00002C3C
|
00002BEC: 0128 IF (NumLocal[0002] <= 00000018) THEN
00002C0C: 007A NumLocal[0009] = GetByte (StrVar[001E],NumLocal[0002])
00002C17: 007B SetByte (StrLocal[0003],NumLocal[0003],NumLocal[0009])
00002C22: 0119 NumLocal[0003] = NumLocal[0003] + 00000001
00002C2F: 0119 NumLocal[0002] = NumLocal[0002] + 00000001
00002C3C: 002C Goto (LABEL_0053)
00002C3D: 0000 ENDIF
00002C45: 0021 NumLocal[0006] = 00000014
00002C46: 0000 ENDIF
00002C53: 0021 NumLocal[0002] = 00000000
//如果长度是19H，则取14H到18H位到SL3中。

<LABEL_0056> REF: 00002D5D
|
//到这里为止，N2是下一步即将进行的处理中的字串指针
//下一步是个大循环。

00002C61: 007A NumLocal[0009] = GetByte (StrVar[001E],NumLocal[0002])

//N9是输入序列号的某个字符

00002C6C: 011D NumLocal[0007] = 000000FF & NumLocal[0009]

//N7=N9 AND 0xFF，个人感觉N7实际上等于N9

00002C79: 0119 NumLocal[0002] = NumLocal[0002] + 00000001
00002C86: 0021 NumLocal[0003] = 00000000

//N3是循环变量，此处初始化

<LABEL_0057> REF: 00002D35
|
//以下是个小循环，处理序列号中的一个字符

00002C94: 0128 IF (NumLocal[0003] <= 00000007) THEN
00002CB4: 011D NumLocal[0009] = NumLocal[0005] & 00000001
00002CC1: 011D NumLocal[000A] = NumLocal[0007] & 00000001
00002CD9: 0022 IF (NumLocal[0009] ^ NumLocal[000A] != 00000000) THEN
00002CE7: 0122 NumLocal[0009] = NumLocal[0005] >> 00000001
00002CF4: 011F NumLocal[0005] = NumLocal[0009] ^ 00008408
00002D01: 0000 ELSE
00002D0A: 0122 NumLocal[0005] = NumLocal[0005] >> 00000001
00002D0B: 0000 ENDIF
00002D1B: 0122 NumLocal[0007] = NumLocal[0007] >> 00000001
00002D28: 0119 NumLocal[0003] = NumLocal[0003] + 00000001
00002D35: 002C Goto (LABEL_0057)
00002D36: 0000 ENDIF
//小循环结束

00002D5D: 0022 IF (NumLocal[0006] - = 00000000) THEN GOTO LABEL_0056

//减一后等于0就跳回去继续循环？不等呢就结束循环？这是疑点之一。

//大循环结束后开始验证

00002D6B: 0120 NumLocal[0007] = NumLocal[0005] ~ NumLocal[0005]
00002D7E: 0121 NumLocal[0009] = NumLocal[0005] << 00000008
00002D8B: 0122 NumLocal[000A] = NumLocal[0007] >> 00000008
00002D98: 011D NumLocal[000A] = NumLocal[000A] & 000000FF
00002DA5: 011E NumLocal[0005] = NumLocal[0009] | NumLocal[000A]
00002DB0: 011D NumLocal[0005] = NumLocal[0005] & 0000FFFF

//最后的结果是N5，与SL3的数字值比较，等则表示输入的序列号合法。

00002DCD: 0128 IF (StrToNum (NumLocal[0004],StrLocal[0003]) < 00000000) THEN
00002DED: 012F Return (FFFFFFFF)
00002DEE: 0000 ENDIF
00002DFA: 0128 IF (NumLocal[0005] != NumLocal[0004]) THEN
00002E18: 012F Return (FFFFFFFF)
00002E21: 0000 ELSE
00002E2A: 012F Return (00000001)
00002E2B: 0000 ENDIF
00002E37: 00B8 END OF FUNCTION ()

上边我能看懂的地方加了一些注释，名为STRVAL的都是字符串型全局变量，名里有local的都是局部变量。StrVar[001E]是我们输入的序列号。这个程序首先判断序列号是否是18H或19H长，然后取出序列号的最后五个数字。程序末尾把运算的结果与这个五位数字值比较，不等则出错。整个运算过程虽不长，却有点不符合常规。——我手头没有详细介绍INSTALLshield脚本语法的资料，上次皮特陈兄虽做了一个，却不敢看（老死机），只有猜测着来。与或非左右移等符号和C中差不多，IFWHILEENDIF等和VB又差不多。我按照我的理解编了一段C代码来模仿这段运算过程。先输入19个字符（0到0x13），再把这些字符运算得到五位数字（0x13到0x17），但拼凑起来的序列号根本通不过。我一直以为是我的脚本算法理解错误，山穷水尽了好几天也没什么结果（对自己的水平没有自信啦）。
我也打算去找一个正确的序列号来验证自己的想法，可这种软件的这个版本的序列号在什么啊嘶嗒啦唯嘶嗒上是找不到的。再后来，“我本善良”兄给了我一个能用的序列号9351324-005376-001-32602，确实后五位是数字，前19位应该是输入的东西，只是前19位看起来有了许多限制，比如哪几位是数字，哪一位是“-”等，这在脚本里却没找到。
现在只有从NSTPRO.EXE入手分析读注册表中序列号的一段了。老法子，弹出出错框时切入TRW查输入的序列号再下Bpm内存断点，偏偏TRW不稳定，内存断点又断不了，我气得扔下它不干了。过了几天，该忙的似乎应付了一点后，弄了个SOFTICE来，这下子稳定多了。——由于这段时间忙，搞点破解只能挤出时间来，经常是研究几个小时又停几天，这就叫“三天破解，两天晒网”，这种不良的风气值得批斗。
后来通过几个BPM断点来到了这一段：

* Reference To: KERNEL32.lstrlenA, Ord:02A1h
|
:00438D10 FF15C0D24900 Call dword ptr [0049D2C0]
:00438D16 83F818 cmp eax, 00000018
:00438D19 0F858D000000 jne 00438DAC
:00438D1F 8D8C2494000000 lea ecx, dword ptr [esp+00000094]

* Possible Reference to String Resource ID=00019: "Edit the list of IP addresses and Hostnames."
|
:00438D26 6A13 push 00000013
:00438D28 51 push ecx
:00438D29 E8C2210000 call 0043AEF0
:00438D2E 83C408 add esp, 00000008
:00438D31 8D942494000000 lea edx, dword ptr [esp+00000094]
:00438D38 8D4C2418 lea ecx, dword ptr [esp+18]
:00438D3C 8BF0 mov esi, eax
:00438D3E 52 push edx
:00438D3F E848AB0400 call 0048388C
:00438D44 8D44241C lea eax, dword ptr [esp+1C]

* Possible Reference to String Resource ID=00005: "Error getting host address:
%s"
|
:00438D48 6A05 push 00000005
:00438D4A 50 push eax
:00438D4B 8D4C2420 lea ecx, dword ptr [esp+20]
:00438D4F C684245C63000001 mov byte ptr [esp+0000635C], 01
:00438D57 E8E3440400 call 0047D23F //取序列号后五位子串
:00438D5C 50 push eax
:00438D5D 8D4C241C lea ecx, dword ptr [esp+1C]
:00438D61 C684245863000002 mov byte ptr [esp+00006358], 02
:00438D69 E8A9AB0400 call 00483917
:00438D6E 8D4C241C lea ecx, dword ptr [esp+1C]
:00438D72 C684245463000001 mov byte ptr [esp+00006354], 01
:00438D7A E89FAA0400 call 0048381E
:00438D7F 8B4C2418 mov ecx, dword ptr [esp+18]
:00438D83 51 push ecx
:00438D84 E8572F0300 call 0046BCE0
:00438D89 81E6FFFF0000 and esi, 0000FFFF
:00438D8F 83C404 add esp, 00000004
:00438D92 3BF0 cmp esi, eax

//此处EAX和ESI，一个是根据前多少位计算出来的校验值，一个是序列号中后五位转换成的数字值，所以这里是一步比较关键的跳转。

:00438D94 7502 jne 00438D98
:00438D96 33FF xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438D94(C)
|
:00438D98 8D4C2418 lea ecx, dword ptr [esp+18]
:00438D9C C684245463000000 mov byte ptr [esp+00006354], 00
:00438DA4 E875AA0400 call 0048381E
:00438DA9 83CEFF or esi, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00438D19(C)
|
:00438DAC 8D942494000000 lea edx, dword ptr [esp+00000094]
:00438DB3 52 push edx

* Reference To: KERNEL32.lstrlenA, Ord:02A1h
|
:00438DB4 FF15C0D24900 Call dword ptr [0049D2C0]
:00438DBA 83F819 cmp eax, 00000019
:00438DBD 0F858D000000 jne 00438E50
:00438DC3 8D842494000000 lea eax, dword ptr [esp+00000094]

* Possible Reference to String Resource ID=00020: "If checked, get latest news from our website when first view"
|
:00438DCA 6A14 push 00000014
:00438DCC 50 push eax
:00438DCD E81E210000 call 0043AEF0
:00438DD2 83C408 add esp, 00000008
:00438DD5 8D8C2494000000 lea ecx, dword ptr [esp+00000094]
:00438DDC 8BF0 mov esi, eax
:00438DDE 51 push ecx
:00438DDF 8D4C241C lea ecx, dword ptr [esp+1C]
:00438DE3 E8A4AA0400 call 0048388C
:00438DE8 8D54241C lea edx, dword ptr [esp+1C]

* Possible Reference to String Resource ID=00005: "Error getting host address:
%s"
|
:00438DEC 6A05 push 00000005
:00438DEE 52 push edx
:00438DEF 8D4C2420 lea ecx, dword ptr [esp+20]
:00438DF3 C684245C63000003 mov byte ptr [esp+0000635C], 03
:00438DFB E83F440400 call 0047D23F
:00438E00 50 push eax
:00438E01 8D4C241C lea ecx, dword ptr [esp+1C]
:00438E05 C684245863000004 mov byte ptr [esp+00006358], 04
:00438E0D E805AB0400 call 00483917
:00438E12 8D4C241C lea ecx, dword ptr [esp+1C]
:00438E16 C684245463000003 mov byte ptr [esp+00006354], 03
:00438E1E E8FBA90400 call 0048381E
:00438E23 8B442418 mov eax, dword ptr [esp+18]
:00438E27 50 push eax
:00438E28 E8B32E0300 call 0046BCE0
:00438E2D 81E6FFFF0000 and esi, 0000FFFF
:00438E33 83C404 add esp, 00000004
:00438E36 3BF0 cmp esi, eax

//这里与上面的是一样的，所不同的应该就是一个处理0X18位，一个处理0X19位。

:00438E38 7502 jne 00438E3C
:00438E3A 33FF xor edi, edi

如果要找注册码运算的地方，可从前面跟进去到下面的这个地方（如果是0X18位序列号的话）：

|
:00445DF7 6A13 push 00000013
:00445DF9 50 push eax
:00445DFA E8F150FFFF call 0043AEF0 //从这里再跟进去。
:00445DFF 83C408 add esp, 00000008
:00445E02 8D4C241C lea ecx, dword ptr [esp+1C]
:00445E06 8BF8 mov edi, eax
:00445E08 51 push ecx
:00445E09 8D4C2414 lea ecx, dword ptr [esp+14]
:00445E0D E87ADA0300 call 0048388C
:00445E12 8D542414 lea edx, dword ptr [esp+14]

从00445DFA处跟进CALL中，代码如下：

:0043AEF0 55 push ebp
:0043AEF1 8B6C240C mov ebp, dword ptr [esp+0C]

//BP循环控制，目前是13，似乎对应着00002BA6: 0021 的NumLocal[0006] = 00000013

:0043AEF5 6685ED test bp, bp

* Possible Reference to Dialog: DialogID_0081
|
:0043AEF8 B881000000 mov eax, 00000081

//这个0X81的常数是否有些眼熟？——就是INSTALLSHIELD反编译脚本中的
00002AA4: 0021 NumLocal[0005] = 00000081 哇！

:0043AEFD 7506 jne 0043AF05
:0043AEFF 66B87EFF mov ax, FF7E
:0043AF03 5D pop ebp
:0043AF04 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043AEFD(C)
|
:0043AF05 57 push edi
:0043AF06 8B7C240C mov edi, dword ptr [esp+0C]
:0043AF0A 56 push esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043AF37(C)
|
:0043AF0B 8A0F mov cl, byte ptr [edi] //读一个字符

* Possible Reference to String Resource ID=00008: "Error connecting to host:
%s"
|
:0043AF0D BE08000000 mov esi, 00000008 //对每一个字符要进行八次循环。

//

:0043AF12 81E1FF000000 and ecx, 000000FF

//对应着

:00

标 题:上面这篇是前几天的，今晚再贴个破破烂烂的序列机。 (2千字)
发信人:Passion
时 间:2001-3-30 23:53:55
详细信息:

今晚忙里偷闲写了个序列机，手头没VC，只好用DELPHI，其实也就是把那段代码套过来。下面是序列机的源程序：

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask;

type
TForm1 = class(TForm)
MaskEdit1: TMaskEdit;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
j:integer;
inputstr:string;
adr:Pointer;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
label
L_0043AEF8,L_0043AF0B,L_0043AF19,L_0043AF27,L_0043AF0D;
begin
inputstr:=self.maskedit1.text;
adr:=Pchar(inputstr);
asm
push ebp
mov ebp, 13h
test bp, bp
L_0043AEF8: mov eax, 00000081h
push edi
mov edi, adr
push esi
L_0043AF0B: mov cl, byte ptr [edi] //读一个字符
L_0043AF0D: mov esi, 00000008h //对每一个字符要进行八次循环。
and ecx, 000000FFh
inc edi

L_0043AF19: mov edx, eax
xor edx, ecx
test dl, 01h
je L_0043AF27
xor eax, 00010810h

L_0043AF27: shr eax, 1
shr ecx, 1
dec esi //小循环变量减1，要进行8次
jne L_0043AF19 //小循环
add ebp, 0000FFFFh //大循环变量减1，要进行0x13次
test bp, bp
jne L_0043AF0B //大循环
not eax
xor ecx, ecx
pop esi
mov cl, ah
pop edi
mov ch, al
pop ebp
mov eax, ecx
mov j, eax

end;
self.Edit1.Text:=format('%s%5.5d',[inputstr,j]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
messagebox(self.handle,'NetScanTools Pro 2000安装序列号生成器。'+#10+#13+'在框中输满所有数字即可生成序列号。'+#10+#13+#10+#13+'该破序列机作者：Passion','说明',MB_OK);
end;

end.


pwindpro 5.00

 标 题:转载：破解一个用InstallShield制作的安装文件手记 (24千字)
发信人:jsjyt
时 间:2001-6-22 19:32:06
详细信息:
1.破解软件
     名字为pwindpro,版本号5.00，该软件是通过NDIS来直接
读取网卡数据报，可以用它来做网络监听软件，有源代码的，
我目前在做的一个项目可能用到它，所以我就破解他了。
2.破解工具
     icomp,w32dasm,trw2000,VC6.0
3.破解过程
     若光破这个程序是很简单的，它是自解压的，解压后的
目录在C:\Windows\Temp下，我等它解压完，把其拷入另一个
目录，接着我观察该目录，发现在Disk1下面有setup.ins,这
个文件是经过压缩的，还有个_setup.lib,先用Fi查看文件类
型，发现他们均是.z结尾的，这种文件可以用icomp来解压。
然后我把_setup.lib解压，发现里面有个很可疑的dll即Serial.dll
.于是我把该文件用W32dasm反汇编。呵呵，它就导出一个函数
SerialCheck,肯定就是它了，然后吗，用trw跟进该函数，怎么
跟呢，它不是会弹出出错对话框吗，OK，bpx messageboxa，然后
F12,呵呵，是不是到了Serial啊，赶快往前翻，在SerialCheck的
入口点下一个断点，以后就每次都会在这中断了。跟踪发现它仅用
返回值来标记是否合法，所以我简单的把它的返回值始终设为1，
这样，一切OK，不用再输入序列号了。
     接着呢，破是破掉了，但总觉得不爽，索性把它的注册机
也写出来了。下面是我写该注册机的过程，该程序的注册算法
比较简单，我只用了一天的时间把它写出来，最主要的时间
还浪费在写代码上，一开始我想用纯C语言来写，但碰到一个问
题，就是汇编指令imul调用之后会设置高位寄存器，如果两个
操作数均是DWORD，在C中如何取到结果的高位，C中调用乘法后
它自动帮你截断了，而我又必须要有该信息，所以，我就请教了
一个人，Craxy Z,从他那我获得了灵感，VC不是支持内嵌汇编语
句吗，我直接写汇编语句不就可以了，(顺带一句，那位能用C语
言来解决该问题的，能不能告诉我方法，那种将数字堪称数组，
然后自己写乘法的方法就不用说了),接下来的工作就很简单了。
4.注册机写作过程
* Referenced by a CALL at Address:
|:1000101A
|
:10001030 8B542408　　　　　　　　mov edx, dword ptr [esp+08]
    ；[esp+08]指向输入的序列号
:10001034 83EC20　　　　　　　　　sub esp, 00000020
:10001037 83C9FF　　　　　　　　　or ecx, FFFFFFFF
:1000103A 33C0　　　　　　　　　　xor eax, eax
:1000103C 56　　　　　　　　　　　push esi
:1000103D 57　　　　　　　　　　　push edi
:1000103E 8BFA　　　　　　　　　　mov edi, edx
:10001040 F2　　　　　　　　　　　repnz
:10001041 AE　　　　　　　　　　　scasb
:10001042 F7D1　　　　　　　　　　not ecx
:10001044 49　　　　　　　　　　　dec ecx
:10001045 83F913　　　　　　　　　cmp ecx, 00000013
    ；看其长度是否为19，
    ；格式为xxxx-xxxx-xxxx-xxxx
:10001048 741F　　　　　　　　　　je 10001069
:1000104A 8B44242C　　　　　　　　mov eax, dword ptr [esp+2C]
:1000104E 6A30　　　　　　　　　　push 00000030
* Possible StringData Ref from Data Obj ->"Invalid Serial Number"
                                  |
:10001050 68EC910010　　　　　　　push 100091EC
* Possible StringData Ref from Data Obj ->"Serial number has incorrect
lengt
h!"
                                  |
:10001055 68C8910010　　　　　　　push 100091C8
:1000105A 50　　　　　　　　　　　push eax
* Reference To: USER32.MessageBoxA, Ord:01C3h
                                  |
:1000105B FF15EC800010　　　　　　Call dword ptr [100080EC]
:10001061 5F　　　　　　　　　　　pop edi
:10001062 33C0　　　　　　　　　　xor eax, eax
:10001064 5E　　　　　　　　　　　pop esi
:10001065 83C420　　　　　　　　　add esp, 00000020
:10001068 C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001048(C)
|
:10001069 8BFA　　　　　　　　　　mov edi, edx
:1000106B 83C9FF　　　　　　　　　or ecx, FFFFFFFF
:1000106E 33C0　　　　　　　　　　xor eax, eax
:10001070 53　　　　　　　　　　　push ebx
:10001071 F2　　　　　　　　　　　repnz
:10001072 AE　　　　　　　　　　　scasb
:10001073 F7D1　　　　　　　　　　not ecx
:10001075 2BF9　　　　　　　　　　sub edi, ecx
:10001077 8D5C240C　　　　　　　　lea ebx, dword ptr [esp+0C]
:1000107B 8BD1　　　　　　　　　　mov edx, ecx
:1000107D 8BF7　　　　　　　　　　mov esi, edi
:1000107F 8BFB　　　　　　　　　　mov edi, ebx
:10001081 8D44240C　　　　　　　　lea eax, dword ptr [esp+0C]
:10001085 C1E902　　　　　　　　　shr ecx, 02
:10001088 F3　　　　　　　　　　　repz
:10001089 A5　　　　　　　　　　　movsd
    ；拷贝字符串到另一个地方
:1000108A 8BCA　　　　　　　　　　mov ecx, edx
* Possible StringData Ref from Data Obj ->"-"
                                  |
:1000108C 6830900010　　　　　　　push 10009030
:10001091 83E103　　　　　　　　　and ecx, 00000003
:10001094 50　　　　　　　　　　　push eax
:10001095 F3　　　　　　　　　　　repz
:10001096 A4　　　　　　　　　　　movsb
:10001097 E863050000　　　　　　　call 100015FF
    ；该函数将原来串中的"-"用00来替代了
* Possible StringData Ref from Data Obj ->"-"
                                  |
:1000109C 6830900010　　　　　　　push 10009030
:100010A1 6A00　　　　　　　　　　push 00000000
:100010A3 A3A09E0010　　　　　　　mov dword ptr [10009EA0], eax
:100010A8 E852050000　　　　　　　call 100015FF
* Possible StringData Ref from Data Obj ->"-"
                                  |
:100010AD 6830900010　　　　　　　push 10009030
:100010B2 6A00　　　　　　　　　　push 00000000
:100010B4 A3A49E0010　　　　　　　mov dword ptr [10009EA4], eax
:100010B9 E841050000　　　　　　　call 100015FF
* Possible StringData Ref from Data Obj ->"-"
                                  |
:100010BE 6830900010　　　　　　　push 10009030
:100010C3 6A00　　　　　　　　　　push 00000000
:100010C5 A3A89E0010　　　　　　　mov dword ptr [10009EA8], eax
:100010CA E830050000　　　　　　　call 100015FF
    ；上面的四个call 100015ff分别处理序列号的四项
:100010CF 8B3DA09E0010　　　　　　mov edi, dword ptr [10009EA0]
:100010D5 83C420　　　　　　　　　add esp, 00000020
:100010D8 8BF0　　　　　　　　　　mov esi, eax
:100010DA 85FF　　　　　　　　　　test edi, edi
:100010DC 8935AC9E0010　　　　　　mov dword ptr [10009EAC], esi
:100010E2 5B　　　　　　　　　　　pop ebx
:100010E3 0F841C020000　　　　　　je 10001305
:100010E9 83C9FF　　　　　　　　　or ecx, FFFFFFFF
:100010EC 33C0　　　　　　　　　　xor eax, eax
:100010EE F2　　　　　　　　　　　repnz
:100010EF AE　　　　　　　　　　　scasb
:100010F0 F7D1　　　　　　　　　　not ecx
:100010F2 49　　　　　　　　　　　dec ecx
:100010F3 83F904　　　　　　　　　cmp ecx, 00000004
    ；我上面提到的序列号格式是由这获知的
    ；以下一长段都是在检查格式对不对的
:100010F6 0F8509020000　　　　　　jne 10001305
:100010FC 8B3DA49E0010　　　　　　mov edi, dword ptr [10009EA4]
:10001102 85FF　　　　　　　　　　test edi, edi
:10001104 0F84DC010000　　　　　　je 100012E6
:1000110A 83C9FF　　　　　　　　　or ecx, FFFFFFFF
:1000110D F2　　　　　　　　　　　repnz
:1000110E AE　　　　　　　　　　　scasb
:1000110F F7D1　　　　　　　　　　not ecx
:10001111 49　　　　　　　　　　　dec ecx
:10001112 83F904　　　　　　　　　cmp ecx, 00000004
:10001115 0F85CB010000　　　　　　jne 100012E6
:1000111B 8B15A89E0010　　　　　　mov edx, dword ptr [10009EA8]
:10001121 85D2　　　　　　　　　　test edx, edx
:10001123 0F849E010000　　　　　　je 100012C7
:10001129 8BFA　　　　　　　　　　mov edi, edx
:1000112B 83C9FF　　　　　　　　　or ecx, FFFFFFFF
:1000112E F2　　　　　　　　　　　repnz
:1000112F AE　　　　　　　　　　　scasb
:10001130 F7D1　　　　　　　　　　not ecx
:10001132 49　　　　　　　　　　　dec ecx
:10001133 83F904　　　　　　　　　cmp ecx, 00000004
:10001136 0F858B010000　　　　　　jne 100012C7
:1000113C 85F6　　　　　　　　　　test esi, esi
:1000113E 0F8464010000　　　　　　je 100012A8
:10001144 8BFE　　　　　　　　　　mov edi, esi
:10001146 83C9FF　　　　　　　　　or ecx, FFFFFFFF
:10001149 F2　　　　　　　　　　　repnz
:1000114A AE　　　　　　　　　　　scasb
:1000114B F7D1　　　　　　　　　　not ecx
:1000114D 49　　　　　　　　　　　dec ecx
:1000114E 83F904　　　　　　　　　cmp ecx, 00000004
:10001151 0F8551010000　　　　　　jne 100012A8
    ；到这为止，长度检查完毕
:10001157 52　　　　　　　　　　　push edx
    ；edx为序列号的第三项
:10001158 E817040000　　　　　　　call 10001574
    ；该函数将字符串xyzw转化为数字(十进制)
    ；返回值在eax中，例如串"0101"就变为数字101
:1000115D 8BC8　　　　　　　　　　mov ecx, eax
:1000115F B867666666　　　　　　　mov eax, 66666667
:10001164 8BD1　　　　　　　　　　mov edx, ecx
:10001166 81E2FFFF0000　　　　　　and edx, 0000FFFF
:1000116C F7EA　　　　　　　　　　imul edx
:1000116E C1FA02　　　　　　　　　sar edx, 02
:10001171 8BC2　　　　　　　　　　mov eax, edx
:10001173 C1E81F　　　　　　　　　shr eax, 1F
:10001176 03D0　　　　　　　　　　add edx, eax
:10001178 66891554A20010　　　　　mov word ptr [1000A254], dx
    ；以上计算得到一个值，其后要用到
    ；它共设置两个字节，根据其地址，
    ；我把它记做var4,var5，并把该段
    ；计算过程定义成func3.1
:1000117F 8AC2　　　　　　　　　　mov al, dl
:10001181 B20A　　　　　　　　　　mov dl, 0A
:10001183 F6EA　　　　　　　　　　imul dl
:10001185 2AC8　　　　　　　　　　sub cl, al
:10001187 A1AC9E0010　　　　　　　mov eax, dword ptr [10009EAC]
:1000118C 50　　　　　　　　　　　push eax
    ；eax为序列号的第四项
:1000118D 880D58A20010　　　　　　mov byte ptr [1000A258], cl
    ；cl的就算过程定义为func3.2
    ；并把代表它的地址记做var8
:10001193 E8DC030000　　　　　　　call 10001574
:10001198 8B0DA49E0010　　　　　　mov ecx, dword ptr [10009EA4]
:1000119E 66A356A20010　　　　　　mov word ptr [1000A256], ax
    ；不作任何处理直接将结果存入，
    ；记为func4，变量记做var6,var7
:100011A4 51　　　　　　　　　　　push ecx
    ；ecx为序列号的第二项
:100011A5 E8CA030000　　　　　　　call 10001574
:100011AA 8BC8　　　　　　　　　　mov ecx, eax
:100011AC B81F85EB51　　　　　　　mov eax, 51EB851F
:100011B1 8BD1　　　　　　　　　　mov edx, ecx
:100011B3 81E2FFFF0000　　　　　　and edx, 0000FFFF
:100011B9 F7EA　　　　　　　　　　imul edx
:100011BB C1FA05　　　　　　　　　sar edx, 05
:100011BE 8BF2　　　　　　　　　　mov esi, edx
:100011C0 8BC2　　　　　　　　　　mov eax, edx
:100011C2 C1EE1F　　　　　　　　　shr esi, 1F
:100011C5 03C6　　　　　　　　　　add eax, esi
:100011C7 B264　　　　　　　　　　mov dl, 64
:100011C9 A252A20010　　　　　　　mov byte ptr [1000A252], al
    ；al的计算过程定义为func2.1
    ；变量记做var2
:100011CE F6EA　　　　　　　　　　imul dl
:100011D0 2AC8　　　　　　　　　　sub cl, al
:100011D2 8D44243C　　　　　　　　lea eax, dword ptr [esp+3C]
:100011D6 880D53A20010　　　　　　mov byte ptr [1000A253], cl
    ；cl的计算过程定义为func2.2
    ；变量记做var3
:100011DC 8B0DA09E0010　　　　　　mov ecx, dword ptr [10009EA0]
:100011E2 50　　　　　　　　　　　push eax
    ；eax为序列号的第一项
* Possible StringData Ref from Data Obj ->"%x"
                                  |
:100011E3 68C4910010　　　　　　　push 100091C4
:100011E8 51　　　　　　　　　　　push ecx
:100011E9 E852030000　　　　　　　call 10001540
    ；该函数将字符串xyzw转换为0Xxyzw(十六进制)
    ；例如将串"1234"转换为0x1234
:100011EE 668B542448　　　　　　　mov dx, word ptr [esp+48]
:100011F3 6850A20010　　　　　　　push 1000A250
:100011F8 66891550A20010　　　　　mov word ptr [1000A250], dx
    ；dx即为上面得到的十六进制数
    ；其计算过程我定义为func1
:100011FF E88C010000　　　　　　　call 10001390
    ；★★★注意，该函数就是关键的比较函数了，后面有分析
:10001204 83C41C　　　　　　　　　add esp, 0000001C
:10001207 84C0　　　　　　　　　　test al, al
:10001209 751F　　　　　　　　　　jne 1000122A
    ；此处必须跳转才是正确的
:1000120B 8B44242C　　　　　　　　mov eax, dword ptr [esp+2C]
:1000120F 6A30　　　　　　　　　　push 00000030
* Possible StringData Ref from Data Obj ->"Invalid Serial Number"
                                  |
:10001211 68EC910010　　　　　　　push 100091EC
* Possible StringData Ref from Data Obj ->"The serial number is invalid!"
                                  |
:10001216 68A4910010　　　　　　　push 100091A4
:1000121B 50　　　　　　　　　　　push eax
* Reference To: USER32.MessageBoxA, Ord:01C3h
                                  |
:1000121C FF15EC800010　　　　　　Call dword ptr [100080EC]
:10001222 5F　　　　　　　　　　　pop edi
:10001223 33C0　　　　　　　　　　xor eax, eax
:10001225 5E　　　　　　　　　　　pop esi
:10001226 83C420　　　　　　　　　add esp, 00000020
:10001229 C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001209(C)
|
:1000122A 66A154A20010　　　　　　mov ax, word ptr [1000A254]
    ；应该跳到1000126D处
    ；其后的比较告诉我们func3.1
    ；算出来的值var4,var5必须满足特定条件，
    ；即在【A--E】之间。
:10001230 663D0A00　　　　　　　　cmp ax, 000A
:10001234 7437　　　　　　　　　　je 1000126D
:10001236 663D0B00　　　　　　　　cmp ax, 000B
:1000123A 7431　　　　　　　　　　je 1000126D
:1000123C 663D0C00　　　　　　　　cmp ax, 000C
:10001240 742B　　　　　　　　　　je 1000126D
:10001242 663D0D00　　　　　　　　cmp ax, 000D
:10001246 7425　　　　　　　　　　je 1000126D
:10001248 663D0E00　　　　　　　　cmp ax, 000E
:1000124C 741F　　　　　　　　　　je 1000126D
:1000124E 8B4C242C　　　　　　　　mov ecx, dword ptr [esp+2C]
:10001252 6A30　　　　　　　　　　push 00000030
* Possible StringData Ref from Data Obj ->"Invalid Serial Number"
                                  |
:10001254 68EC910010　　　　　　　push 100091EC
* Possible StringData Ref from Data Obj ->"The serial number is not for
this
"
                                        ->"product!"
                                  |
:10001259 6878910010　　　　　　　push 10009178
:1000125E 51　　　　　　　　　　　push ecx
* Reference To: USER32.MessageBoxA, Ord:01C3h
                                  |
:1000125F FF15EC800010　　　　　　Call dword ptr [100080EC]
:10001265 5F　　　　　　　　　　　pop edi
:10001266 33C0　　　　　　　　　　xor eax, eax
:10001268 5E　　　　　　　　　　　pop esi
:10001269 83C420　　　　　　　　　add esp, 00000020
:1000126C C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001234(C), :1000123A(C), :10001240(C), :10001246(C), :1000124C(C)
|
:1000126D 6850A20010　　　　　　　push 1000A250
:10001272 E8D9010000　　　　　　　call 10001450
    ；这个call有点奇怪，但看了后面就知道了
    ；它可能是把一些特殊的序列号过滤掉
:10001277 83C404　　　　　　　　　add esp, 00000004
:1000127A 84C0　　　　　　　　　　test al, al
:1000127C 741F　　　　　　　　　　je 1000129D
:1000127E 8B54242C　　　　　　　　mov edx, dword ptr [esp+2C]
:10001282 6A30　　　　　　　　　　push 00000030
* Possible StringData Ref from Data Obj ->"Expired Serial Number"
                                  |
:10001284 6860910010　　　　　　　push 10009160
* Possible StringData Ref from Data Obj ->"The period for free updates to
"
                                        ->"this product has expired."
                                  |
:10001289 6824910010　　　　　　　push 10009124
:1000128E 52　　　　　　　　　　　push edx
* Reference To: USER32.MessageBoxA, Ord:01C3h
                                  |
:1000128F FF15EC800010　　　　　　Call dword ptr [100080EC]
:10001295 5F　　　　　　　　　　　pop edi
:10001296 33C0　　　　　　　　　　xor eax, eax
:10001298 5E　　　　　　　　　　　pop esi
:10001299 83C420　　　　　　　　　add esp, 00000020
:1000129C C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000127C(C)
|
:1000129D 5F　　　　　　　　　　　pop edi
    ；正常的应该到达这
:1000129E B801000000　　　　　　　mov eax, 00000001
    ；eax为1表示通过检查
    ；简单的crack可以设置eax恒为1即可，
    ；当然，我们不满足于仅仅crack,
    ；下面我们来分析其注册过程，
:100012A3 5E　　　　　　　　　　　pop esi
:100012A4 83C420　　　　　　　　　add esp, 00000020
:100012A7 C3　　　　　　　　　　　ret
××××××××××××××××××××××××××××××××××××××
下面的函数是关键的比较过程
* Referenced by a CALL at Address:
|:100011FF
|
:10001390 83EC0C　　　　　　　　　sub esp, 0000000C
:10001393 56　　　　　　　　　　　push esi
:10001394 8B742414　　　　　　　　mov esi, dword ptr [esp+14]
:10001398 8BC6　　　　　　　　　　mov eax, esi
:1000139A 8B08　　　　　　　　　　mov ecx, dword ptr [eax]
:1000139C 894C2404　　　　　　　　mov dword ptr [esp+04], ecx
:100013A0 8B5004　　　　　　　　　mov edx, dword ptr [eax+04]
:100013A3 89542408　　　　　　　　mov dword ptr [esp+08], edx
:100013A7 668B4008　　　　　　　　mov ax, word ptr [eax+08]
:100013AB 668944240C　　　　　　　mov word ptr [esp+0C], ax
:100013B0 33C0　　　　　　　　　　xor eax, eax
:100013B2 6689442404　　　　　　　mov word ptr [esp+04], ax
:100013B7 8844240D　　　　　　　　mov byte ptr [esp+0D], al
:100013BB 8B442407　　　　　　　　mov eax, dword ptr [esp+07]
:100013BF 25FF000000　　　　　　　and eax, 000000FF
:100013C4 83F832　　　　　　　　　cmp eax, 00000032
:100013C7 7E07　　　　　　　　　　jle 100013D0
:100013C9 056C070000　　　　　　　add eax, 0000076C
:100013CE EB05　　　　　　　　　　jmp 100013D5
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013C7(C)
|
:100013D0 05D0070000　　　　　　　add eax, 000007D0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013CE(U)
|
:100013D5 3DCE070000　　　　　　　cmp eax, 000007CE
    ；由这个判断和下一个判断得知fun2.2的
    ；计算结果var3应该在【1--A】之间
:100013DA 7D07　　　　　　　　　　jge 100013E3
:100013DC 32C0　　　　　　　　　　xor al, al
:100013DE 5E　　　　　　　　　　　pop esi
:100013DF 83C40C　　　　　　　　　add esp, 0000000C
:100013E2 C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013DA(C)
|
:100013E3 3DDA070000　　　　　　　cmp eax, 000007DA
:100013E8 7E07　　　　　　　　　　jle 100013F1
:100013EA 32C0　　　　　　　　　　xor al, al
:100013EC 5E　　　　　　　　　　　pop esi
:100013ED 83C40C　　　　　　　　　add esp, 0000000C
:100013F0 C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013E8(C)
|
:100013F1 8A442406　　　　　　　　mov al, byte ptr [esp+06]
:100013F5 3C01　　　　　　　　　　cmp al, 01
    ；由这个判断条件可以得知func2.1得到的值
    ；var2应该在【1--C】之间
:100013F7 7307　　　　　　　　　　jnb 10001400
:100013F9 32C0　　　　　　　　　　xor al, al
:100013FB 5E　　　　　　　　　　　pop esi
:100013FC 83C40C　　　　　　　　　add esp, 0000000C
:100013FF C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013F7(C)
|
:10001400 3C0C　　　　　　　　　　cmp al, 0C
:10001402 7607　　　　　　　　　　jbe 1000140B
:10001404 32C0　　　　　　　　　　xor al, al
:10001406 5E　　　　　　　　　　　pop esi
:10001407 83C40C　　　　　　　　　add esp, 0000000C
:1000140A C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001402(C)
|
:1000140B 668B44240A　　　　　　　mov ax, word ptr [esp+0A]
    ；由这个判断条件和下一个判断条件
    ；可以得知func4计算出来的值var6,var7
    ；应该在【E6--2FC】之间
:10001410 663DE600　　　　　　　　cmp ax, 00E6
:10001414 7307　　　　　　　　　　jnb 1000141D
:10001416 32C0　　　　　　　　　　xor al, al
:10001418 5E　　　　　　　　　　　pop esi
:10001419 83C40C　　　　　　　　　add esp, 0000000C
:1000141C C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001414(C)
|
:1000141D 663DFC02　　　　　　　　cmp ax, 02FC
:10001421 7507　　　　　　　　　　jne 1000142A
:10001423 32C0　　　　　　　　　　xor al, al
:10001425 5E　　　　　　　　　　　pop esi
:10001426 83C40C　　　　　　　　　add esp, 0000000C
:10001429 C3　　　　　　　　　　　ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001421(C)
|
:1000142A 8D4C2404　　　　　　　　lea ecx, dword ptr [esp+04]
    ；到这才是正确的出口
:1000142E 6A0A　　　　　　　　　　push 0000000A
:10001430 51　　　　　　　　　　　push ecx
:10001431 E8FAFEFFFF　　　　　　　call 10001330
    ；该函数用上面func2.1,func2.2,func3.1,func3.2和
    ；func4算出来的值相加(每次以WORD形式相加)得到
    ；另一个值，我把它记为func5
:10001436 83C408　　　　　　　　　add esp, 00000008
:10001439 33D2　　　　　　　　　　xor edx, edx
:1000143B 663B06　　　　　　　　　cmp ax, word ptr [esi]
    ；ax为call 10001330里面设置的，[esi]
    ；为func1计算出来的值，所以它的比较
    ；算法就是看func5和func1算出来的值
    ；是否一样，若一样则注册通过，由此
    ；我们可以写一个简单的注册机，我写
    ；了一个，源程序附在其后。
:1000143E 5E　　　　　　　　　　　pop esi
:1000143F 0F94C2　　　　　　　　　sete dl
:10001442 8AC2　　　　　　　　　　mov al, dl
:10001444 83C40C　　　　　　　　　add esp, 0000000C
:10001447 C3　　　　　　　　　　　ret
××××××××××××××××××××××××××××××××××××××
××××××××
* Referenced by a CALL at Address:
|:10001431
|
:10001330 8B4C2404　　　　　　　　mov ecx, dword ptr [esp+04]
:10001334 56　　　　　　　　　　　push esi
:10001335 8B74240C　　　　　　　　mov esi, dword ptr [esp+0C]
:10001339 33C0　　　　　　　　　　xor eax, eax
:1000133B 83FE01　　　　　　　　　cmp esi, 00000001
:1000133E 7E1A　　　　　　　　　　jle 1000135A
:10001340 8BD6　　　　　　　　　　mov edx, esi
:10001342 57　　　　　　　　　　　push edi
:10001343 D1EA　　　　　　　　　　shr edx, 1
:10001345 8BFA　　　　　　　　　　mov edi, edx
:10001347 F7DF　　　　　　　　　　neg edi
:10001349 8D347E　　　　　　　　　lea esi, dword ptr [esi+2*edi]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001357(C)
|
:1000134C 33FF　　　　　　　　　　xor edi, edi
:1000134E 668B39　　　　　　　　　mov di, word ptr [ecx]
:10001351 83C102　　　　　　　　　add ecx, 00000002
:10001354 03C7　　　　　　　　　　add eax, edi
:10001356 4A　　　　　　　　　　　dec edx
:10001357 75F3　　　　　　　　　　jne 1000134C
    ；该处到1000124C之间在循环相加
:10001359 5F　　　　　　　　　　　pop edi
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000133E(C)
|
:1000135A 85F6　　　　　　　　　　test esi, esi
:1000135C 5E　　　　　　　　　　　pop esi
:1000135D 7E06　　　　　　　　　　jle 10001365
:1000135F 33D2　　　　　　　　　　xor edx, edx
:10001361 8A11　　　　　　　　　　mov dl, byte ptr [ecx]
:10001363 03C2　　　　　　　　　　add eax, edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000135D(C)
|
:10001365 A90000FFFF　　　　　　　test eax, FFFF0000
:1000136A 7413　　　　　　　　　　je 1000137F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000137D(C)
|
:1000136C 8BC8　　　　　　　　　　mov ecx, eax
:1000136E 25FFFF0000　　　　　　　and eax, 0000FFFF
:10001373 C1E910　　　　　　　　　shr ecx, 10
:10001376 03C1　　　　　　　　　　add eax, ecx
:10001378 A90000FFFF　　　　　　　test eax, FFFF0000
:1000137D 75ED　　　　　　　　　　jne 1000136C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000136A(C)
|
:1000137F F7D0　　　　　　　　　　not eax
    ；取反后返回
:10001381 C3　　　　　　　　　　　ret
××××××××××××××××××××××××××××××××××××××
××××××××
综上所述，我们知道该程序的注册算法为：
先判断长度是否正确，然后用序列号的第二，三，四项
计算得到一个WORD值，然后将该值与序列号第一项表示的十六进
制值(也是一个WORD)相比较，若相等这该序列号是正确的。
6.注册机的源代码如下(在VC中可以直接编译)
#include "stdio.h"
void Hex(WORD arg)
{
char p1,p2,p3,p4;
p1=(arg&0xf000)>>12;
p2=(arg&0x0f00)>>8;
p3=(arg&0x00f0)>>4;
p4=arg&0x000f;
printf("%1x%1x%1x%1x",p1,p2,p3,p4);
}
void Dec(WORD arg)
{
WORD tmp=arg;
char tmp1[4];
int i;
for(i=0;i<4;i++)
{
  tmp1[3-i]=tmp%10;
  tmp=tmp/10;
}
printf("%1d%1d%1d%1d",tmp1[0],tmp1[1],tmp1[2],tmp1[3]);
}
void Register()
{
BYTE var[10];
WORD *ptr,tmp;
WORD i,j,k;
WORD ret;
for(i=0;i<10;i++)
  var[i]=0;
for(i=0;i<65535;i++)
{
  //先求第三项
  var[4]=0;
  var[5]=0;
  __asm{
   mov ecx, 0
   mov cx, i
   mov eax, 0x66666667
   mov edx, ecx
   and edx, 0x0000FFFF
   imul edx
   sar edx, 02
   mov eax, edx
   shr eax, 0x1F
   add edx, eax
   mov word ptr var+4,dx;赋值1
   mov al, dl
   mov dl, 0x0A
   imul dl
   sub cl, al
   mov var[8],cl;赋值2
  }
  //然后要满足序列号第三项条件
  ptr=(WORD*)(var+4);
  if(*ptr<0x0A || *ptr>0x0E)
   continue;
  //再求第二项
  for(j=0;j<65535;j++)
  {
   var[2]=0;
   var[3]=0;
   __asm{
    mov ecx, 0
    mov cx, j
    mov eax, 0x51EB851F
    mov edx, ecx
    and edx, 0x0000FFFF
    imul edx
    sar edx, 0x05
    mov esi, edx
    mov eax, edx
    shr esi, 0x1F
    add eax, esi
    mov dl, 0x64
    mov var[2], al;赋值4
    imul dl
    sub cl, al
    mov var[3], cl;赋值5
   }
   //要满足序列号第二项条件
   if(var[2]<0x01 || var[2]>0x0C || var[3]<0x01 || var[3]>0x0A)
     continue;
   //此时已满足前两个条件，设置第四项为2fa-->"0762"
   var[6]=0xfa;
   var[7]=0x02;
   //设置其他域
   var[0]=0;
   var[1]=0;
   //计算第一项的值
   ret=0;
   for(k=0;k<5;k++)
   {
    tmp=(var[2*k+1]<<8)|(var[2*k]);
    ret+=tmp;
   }
   ret=~ret;
   //把ret值作为第一项
   printf("The Serial Number is:\n");
   Hex(ret);
   printf("-");
   Dec(j);
   printf("-");
   Dec(i);
   printf("-");
   printf("0762\n");
   printf("Do you want to get another?[y/n]\n");
   char ch[10];
   scanf("%s",ch);
   if(ch[0] != 'y' && ch[0] != 'Y')
    return;
  }
}
}
int main(int argc, char* argv[])
{
Register();
return 0;
}


SmartCheck 5.0

标 题:我的破解心得(12) (1千字)
发信人:chcw
时 间:2001-3-13 18:13:43
详细信息:
破解程序：
SmartCheck 5.0安装程序

破解工具：
ISDCC 1.0

破解者：
chcw

现在，有许多程序使用Install Shield来制作它们的安装程序，而且在安装
时就要求输入注册码。这一类程序的注册过程主要是由Install Shield来控制的，
Install Shield将其安装过程的信息存放在编译后的脚本文件Setup.ins中。因此，
只需要对Setup.ins文件进行反编译，即可洞悉Install Shield的整个安装过程。
ISDCC就是这样一个反编译工具，它能反编译Install Shield 5.1以下版本生
成的所有的脚本程序。下面以SmartCheck 5.0的安装程序为例，介绍如何利用该
工具，实现注册码的破解。

1. 用ISDCC对Install Shield的安装脚本Setup.ins进行反编译，并将结果保存在
Setup.tmp文件中：
ISDCC Setup.ins > Setup.tmp
2. 在Install Shield的安装程序中，字符串比较函数是StrCompare()。用Ultra Edit
打开Setup.tmp文件，查找串"StrCompare"。
3. 在label140处，我们发现了一句可能是比较注册码的语句：
label140:
StrCompare(lString0, "002082840001");
lNumber1 = LAST_RESULT = 0;
if (lNumber1 = 0) then
goto label141;
endif;
return(1);
4. 在该部分程序的上面，还有一些产生lString0的语句：
label139:
StrSub(lString1, pString0, 0, 4); <-取pString0中子串, 从0开始，长为4
StrSub(lString2, pString0, 5, 6); <-取pString0中子串, 从5开始，长为6
StrSub(lString3, pString0, 12, 2); <-取pString0中子串, 从12开始，长为2
lString6 = lString1 + lString2;
lString0 = lString6 + lString3;
StrFind(lString0, "-"); <-查找字符'-'
lNumber1 = LAST_RESULT >= 0;
if (lNumber1 = 0) then
goto label140;
endif;
return(0);
5. 由于反编译后的语句几乎与高级语言完全相同，因此我们很容易猜想出label139段程序
的功能,并得到pString0的形式为:
"0020-828400-01"
6. 在安装过程中输入Serial="0020-828400-01"，注册顺利通过。


SmartCheck 6.03

 标 题:SmartCheck 6.03的InstallShield序列号破解（上）——好久没研究了。 (7千字)
发信人:Passion
时 间:2001-8-20 23:11:33
详细信息:
SmartCheck 6.03的InstallShield序列号破解。
Passion
2001.8.20

SmartCheck 6.03对于破解者来说不但是对付VB的利器，而且它自个儿也算是典型的InstallShield安装的破解范例。Numega的产品的检验过程似乎都类似。我以前不完全地破过SoftICE，因为不全，感觉总不对，这次拿SmartCheck重新来一次，希望过程还算完整。

先拿Windows instalshield decompiler也就是wisdec反setup.ins，反出来一大段。有过一点破Sice的经验，也不浪费时间查找字符串“The Serial Number……”了，反正找不到。看看它导入了什么DLL文件，也就是看MISC菜单下的DLL import，有俩比较特别，是UTILITY.DLL和NMINST32.DLL，其中UTILITY.DLL有个导出的函数叫DigitCheck，一个参数还是STRING，似乎专门就是检验序列号的，这么容易？

在反编译后的文本中找字串UTILITY.DLL，很容易就找到一段：

StrLocal[0007] = SUPPORTDIR ^ "UTILITY.dll"
00004C96: 0128 IF (UseDLL (StrLocal[0007]) = 00000000) THEN
00004CB6: 00B4 NumLocal[0001] = UTILITY.DigitCheck (StrLocal[0002])
00004CC6: 00B3 UnUseDLL (StrLocal[0007])
00004CC7: 0000 ENDIF

——这是典型的动态加载UTILITY.DLL，检验序列号再释放该DLL的过程。
动态加载好办，至少可以断LoadLibraryA。
好，现在开始动态跟踪。启动SmartCheck的setup.exe，下一步下一步，嗯？怎么序列号没填就通过了？——对了，SmartCheck安装的时候会检验注册表里是否有现存的NUmega的同种产品，有的话就自动读出序列号来填到序列号框里去，真是体贴人哇。——咱们这群人谁没装Numega的东西？^_^
算了算了，按上一步回到序列号填写的界面。Ctrl＋D切入Sice，下断bpx loadlibrarya do "d esp->4"
回来按下一步，断了，正是加载utility.dll。
且慢，这是正确的序列号，倘若乱填的呢？——真的乱填一气，按下一步，糟！直接出来序列号错误的消息框了。
看来序列号有两步检验过程，第一步通过后才loadlibraryA来加载UTILITY.DLL来进行第二次检验。怎么办？
断messageboxa的话也有效，断后返回nminst32.dll的领空（在我的机子上call messageboxa的地址是2491cf9，mod nmi命令可看见NMINST32.DLL的基址是2490000），只是只能跳过检验，不能帮我们弄出正确的序列号来。

看来是nminst32.dll在弄鬼，再静态的反反看，用Win32Dasm反一下nminst32.dll，10001cf9处果然是Call MessageBoxa，往上看，一大段REPNE SCANSB加MOVSB的，也不知道在干什么。
往上面找个断点，既不能太远进不来，也不能太近（怕已经出错了）。——这段过程好像是用SendDlgItemmessagea来获取文本框内容并且进行第一步检验，对了就EndDialog。前后找找看就知道了。
选个断点1A70，也就是2491a70，是输出函数的开始：

:10001A70 8B442408 mov eax, dword ptr [esp+08]
:10001A74 81EC64020000 sub esp, 00000264
:10001A7A 83E810 sub eax, 00000010
:10001A7D 53 push ebx
:10001A7E 55 push ebp
:10001A7F 56 push esi
:10001A80 57 push edi
:10001A81 0F8490050000 je 10002017
:10001A87 2D00010000 sub eax, 00000100
:10001A8C 0F841C040000 je 10001EAE
:10001A92 48 dec eax
:10001A93 0F858E050000 jne 10002027
:10001A99 8B842480020000 mov eax, dword ptr [esp+00000280]
:10001AA0 25FFFF0000 and eax, 0000FFFF
:10001AA5 83F80C cmp eax, 0000000C
:10001AA8 0F8F76030000 jg 10001E24
:10001AAE 0F8461030000 je 10001E15
:10001AB4 48 dec eax
:10001AB5 7416 je 10001ACD
:10001AB7 48 dec eax
:10001AB8 0F8569050000 jne 10002027

其实这个断点没啥效果，程序没事就进来（这段输出函数是对话框的过程，随便动点什么东西都会进来）。
不过跟了几次后觉得前面的是检查点击了什么按钮的，看看这儿1AB5处的跳

:10001AB5 7416 je 10001ACD

其他几个跳都很远（差不多就是直接退出对话框过程），而且这个跳指向的地方附近就有SendDlgItemMessagea函数引用。估计这里跳的话可能有文章，于是下断2491acd

（不知怎的，setup界面中直接CTRL+D切入再下断的话大多数不成功，不是没效果就是Invalid address，难道填序列号的时候nminsl32.dll还没装进来？不管它，填满后先断hmemcpy进来，回Nminst32领空再来下断bpx 2491acd，注意得清掉hmemcpy的断点。）

好，断了！F10往下走:

* Reference To: USER32.SendDlgItemMessageA, Ord:01D8h
|
:10001AD4 8B1D30230210 mov ebx, dword ptr [10022330]

…………

:10001AEC FFD3 call ebx

…………

:10001B00 FFD3 call ebx

…………

:10001B11 FFD3 call ebx

连续三次Call USER32.SendDlgItemMessageA，目的八成就是获得三个序列号框中的内容。

:10001B1A 33C0 xor eax, eax
:10001B1C F2 repnz //这里看看EDI，就是输入的序列号的前四个字符。
:10001B1D AE scasb

跟下来一大段REPNE MOVSB SCANSB之类的，不容易弄明白什么功能，直到下面这里：

:10001C52 8D442410 lea eax, dword ptr [esp+10]

//这里EAX看看，是序列号第一部分的前三个字符，于是可以明白，前面是取三个字符。^_^

:10001C56 33F6 xor esi, esi
:10001C58 50 push eax
:10001C59 68608F0110 push 10018F60
:10001C5E E8DD860000 call 1000A340 //对这前三个字符进行检验。

10001C5E这里来个d *esp，看见什么了？一大堆数字：640 641 480 481 490 491 510 511 520 521
跟进去看看，原来:10001C5E处的这个Call是检验输入的序列号的前三位数字是不是这一堆中的，不是？不是当然就不行！

:10001C66 85C0 test eax, eax
:10001C68 7542 jne 10001CAC

//属于这一堆的话，返回那个符合的地址，否则返回0，不跳就完了。

稍微改改数据，接着跳：

:10001CAC 6820A60110 push 1001A620
:10001CB1 E85A810000 call 10009E10 //这里是第二步检验。
:10001CB6 83C404 add esp, 00000004
:10001CB9 8BF0 mov esi, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001CAA(C)
|
:10001CBB 85F6 test esi, esi
:10001CBD 7552 jne 10001D11 //这里不跳也完蛋。

现在，序列号判断的流程都清楚了。——如果从:10001CB1处的CALL进去，里面会来个Loadlibrarya，这才真正的装入utility.dll文件。接着GetProcAddress，传参数

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10009E75(C)
|
:10009E80 6890A20110 push 1001A290 //含utility.dll路径的字串

* Reference To: KERNEL32.LoadLibraryA, Ord:0190h
|
:10009E85 FF1518220210 Call dword ptr [10022218] //装utility.dll
:10009E8B 8BF0 mov esi, eax
:10009E8D 85F6 test esi, esi //esi返回DLL的句柄。
:10009E8F 7539 jne 10009ECA //成功则跳。

接着GetProcAddress，传参数调用

* Possible StringData Ref from Data Obj ->"DigitCheck"
|
:10009ECA 68C0520110 push 100152C0
:10009ECF 56 push esi

* Reference To: KERNEL32.GetProcAddress, Ord:0116h
|
:10009ED0 FF151C220210 Call dword ptr [1002221C] //取DigitCheck函数的地址
:10009ED6 85C0 test eax, eax
:10009ED8 740E je 10009EE8
:10009EDA 8D4C240C lea ecx, dword ptr [esp+0C]

//ECX指向我们输入的序列号，已经去掉了“-”号的，

:10009EDE 51 push ecx
:10009EDF FFD0 call eax //调用，
:10009EE1 83C404 add esp, 00000004
:10009EE4 8BD8 mov ebx, eax
:10009EE6 EB2D jmp 10009F15

10009EDF处以刚刚推入堆栈的序列号的地址为参数调用utility.DigitCheck，是应该跟进去的时候了。

标 题:SmartCheck 6.03的InstallShield序列号破解（下） (9千字)
发信人:Passion
时 间:2001-8-20 23:13:52
详细信息:

（接上）
对话框中填的序列号的格式为0000-000000-00，当然数字也可以为字母。
前面的第一步判断，前三位必须是那一堆字符中的数字，因此我们前三个填510，后面仍然乱填一气（这里填5101-234567-FF），先跟进去再说。
下面比较零乱，是我以前分析Softice的utility.dll时留下的记录，SmartCheck的utility.dll结构几乎和它一模一样，许多东西玩起来也就轻松了。^_^

Exported fn(): DigitCheck - Ord:0001h
:10001110 56 push esi
:10001111 57 push edi
:10001112 8B7C240C mov edi, dword ptr [esp+0C] //序列号地址
:10001116 83C9FF or ecx, FFFFFFFF
:10001119 33C0 xor eax, eax
:1000111B F2 repnz
:1000111C AE scasb
:1000111D F7D1 not ecx //求长度。
:1000111F 2BF9 sub edi, ecx
:10001121 8BC1 mov eax, ecx
:10001123 8BF7 mov esi, edi
:10001125 BF80CB0010 mov edi, 1000CB80
:1000112A C1E902 shr ecx, 02
:1000112D F3 repz
:1000112E A5 movsd
:1000112F 8BC8 mov ecx, eax
:10001131 83E103 and ecx, 00000003
:10001134 F3 repz
:10001135 A4 movsb //搬到一个地方去。
:10001136 E895000000 call 100011D0
:1000113B E840010000 call 10001280
:10001140 33C9 xor ecx, ecx
:10001142 890DACCB0010 mov dword ptr [1000CBAC], ecx

//这两个CALL会根据序列号的前8位数字经过查表运算得来一系列值，也就内定了前八个字符必须是数字。详细内容见后面。
计算出来八个值：04 0C 09 04 06 0A 0A 0B，放在1000CBB0处。

:10001148 8A81B0CB0010 mov al, byte ptr [ecx+1000CBB0] //取第一个
:1000114E 8A91B4CB0010 mov dl, byte ptr [ecx+1000CBB4] //取第四个
:10001154 32C2 xor al, dl //先异或

//八个值中，第一个值和第四个值异或，再和最后一个值或，结果如不是数字或者字母则加7变成字母，比较后通过则继续计算第二个和第五个，并且仍和最后一个或，依此类推。

:10001156 8A15B7CB0010 mov dl, byte ptr [1000CBB7] //一直都是取最后一个
:1000115C 0AC2 or al, dl //再或
:1000115E 0C30 or al, 30
:10001160 3C39 cmp al, 39
:10001162 8881B8CB0010 mov byte ptr [ecx+1000CBB8], al //存结果
:10001168 7E08 jle 10001172
:1000116A 0407 add al, 07 //变字母
:1000116C 8881B8CB0010 mov byte ptr [ecx+1000CBB8], al //也是存结果

//这里的AL是算出来的一个字符，算出一个后马上跟输入的序列号的最后四位比较。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001168(C)
|
:10001172 8A81B8CB0010 mov al, byte ptr [ecx+1000CBB8]
:10001178 8A9188CB0010 mov dl, byte ptr [ecx+1000CB88]

//这是输入序列号的后四位地址。前八位数字计算出来的四个字符必须和序列号末尾的四个字母一样才行。

:1000117E 3AC2 cmp al, dl
:10001180 7406 je 10001188 //比！
:10001182 0C20 or al, 20
:10001184 3AC2 cmp al, dl
:10001186 7514 jne 1000119C //不等就完蛋了

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001180(C)
|
:10001188 41 inc ecx
:10001189 83F904 cmp ecx, 00000004 //比完四对就……
:1000118C 7CBA jl 10001148
:1000118E 890DACCB0010 mov dword ptr [1000CBAC], ecx
:10001194 B801000000 mov eax, 00000001 //正确标志
:10001199 5F pop edi
:1000119A 5E pop esi
:1000119B C3 ret

这里程序算出来的四个字符是“BFBF”

——————————————————————————————

这里是第一个CALL的内容，它的功能也就是先根据输入的前8个字符查一张表，如果查出来的东西符合要求（也就是前8个字符都是数字）则把前8个字符的ASCII码都转换成实际的数字存放在1000CBB8处：

* Referenced by a CALL at Address:
|:10001136
|
:100011D0 53 push ebx
:100011D1 33D2 xor edx, edx
:100011D3 33DB xor ebx, ebx
:100011D5 56 push esi
:100011D6 8915A8CB0010 mov dword ptr [1000CBA8], edx
:100011DC 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001240(U)
|
:100011DE A18C930010 mov eax, dword ptr [1000938C]
:100011E3 890DACCB0010 mov dword ptr [1000CBAC], ecx
:100011E9 83F801 cmp eax, 00000001
:100011EC 7E20 jle 1000120E

//也不知是什么判断，反正总是跳。

:100011EE 0FBE8180CB0010 movsx eax, byte ptr [ecx+1000CB80]
:100011F5 6A04 push 00000004
:100011F7 50 push eax
:100011F8 E883080000 call 10001A80
:100011FD 8B15A8CB0010 mov edx, dword ptr [1000CBA8]
:10001203 8B0DACCB0010 mov ecx, dword ptr [1000CBAC]
:10001209 83C408 add esp, 00000008
:1000120C EB13 jmp 10001221

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100011EC(C)
|
:1000120E 0FBE8180CB0010 movsx eax, byte ptr [ecx+1000CB80] //表首地址

* Possible StringData Ref from Data Obj ->" ((((( "
->" H剟剟剟剟剟亖亖亖"
//第一张表的内容 ->"倐倐倐"
->" "
|
:10001215 8B3580910010 mov esi, dword ptr [10009180]
:1000121B 8A0446 mov al, byte ptr [esi+2*eax]
:1000121E 83E004 and eax, 00000004

//下面说明前八个字符必须都是数字。后四个字符根据这些数字来计算。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000120C(U)
|
:10001221 3BC3 cmp eax, ebx
:10001223 741D je 10001242 //如果输入的不是数字，则这里会跳。
:10001225 83F908 cmp ecx, 00000008 //满了8个则跳。
:10001228 7D18 jge 10001242
:1000122A 8A8180CB0010 mov al, byte ptr [ecx+1000CB80]
:10001230 240F and al, 0F
:10001232 8882B0CB0010 mov byte ptr [edx+1000CBB0], al
:10001238 42 inc edx
:10001239 8915A8CB0010 mov dword ptr [1000CBA8], edx
:1000123F 41 inc ecx
:10001240 EB9C jmp 100011DE

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001223(C), :10001228(C)
|
:10001242 83FA08 cmp edx, 00000008
:10001245 7D33 jge 1000127A
:10001247 4A dec edx
:10001248 B807000000 mov eax, 00000007
:1000124D 8915A8CB0010 mov dword ptr [1000CBA8], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000126D(C)
|
:10001253 3BD3 cmp edx, ebx
:10001255 7D08 jge 1000125F
:10001257 8898B0CB0010 mov byte ptr [eax+1000CBB0], bl
:1000125D EB0D jmp 1000126C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001255(C)
|
:1000125F 8A8AB0CB0010 mov cl, byte ptr [edx+1000CBB0]
:10001265 4A dec edx
:10001266 8888B0CB0010 mov byte ptr [eax+1000CBB0], cl

//这里1000cbb0处执行完后就存放了前8位数字的实际值，也就是
05 01 00 01 02 03 04 05

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000125D(U)
|
:1000126C 48 dec eax
:1000126D 79E4 jns 10001253
:1000126F A3ACCB0010 mov dword ptr [1000CBAC], eax
:10001274 8915A8CB0010 mov dword ptr [1000CBA8], edx

//这里存放俩处理过的字节数，都是8。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001245(C)
|
:1000127A 5E pop esi
:1000127B 5B pop ebx
:1000127C C3 ret

下面是第二个CALL的内容，这个CALL把第一个CALL计算出来的数字再查一次表，结果覆盖了1000cbb0处的8个字节：

* Referenced by a CALL at Address:
|:1000113B
|
:10001280 33C0 xor eax, eax
:10001282 A3AC910010 mov dword ptr [100091AC], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100012A7(C)
|
:10001287 0FBE88B0910010 movsx ecx, byte ptr [eax+100091B0]
:1000128E 8B148590800010 mov edx, dword ptr [4*eax+10008090] //又查一次表
:10001295 40 inc eax
:10001296 83F808 cmp eax, 00000008 //处理8个字符
:10001299 8A0C0A mov cl, byte ptr [edx+ecx]
:1000129C A3AC910010 mov dword ptr [100091AC], eax
:100012A1 8888AF910010 mov byte ptr [eax+100091AF], cl //存查表结果
:100012A7 7CDE jl 10001287
:100012A9 C3 ret //返回

查出来的结果仍然放在1000cbb0，这里变成了04 0C 09 04 06 0A 0A 0B

最后得可以用的序列号： 5101-2345BF-BF
说明：此段和SoftICE的序列号破解过程除了指令定位地址不一样外，其他几乎一模一样，所以连说明文字都类似，*^_^*
至于注册机，应该也能写出来，但时间仓促，……。倘若没皮兄的“鞭策”，唉，……

标 题:注册机的DELPHI源码。 (2千字)
发信人:Passion
时 间:2001-8-22 22:53:28
详细信息:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//这里是第二个表的内容。第一个表用条件判断省略了。
const table: array[1..8,0..15] of byte =(
(15,1,11,3,8,4,14,7,13,0,0,0,0,0,0,0),
(10,12,1,8,2,0,9,15,5,11,0,0,0,0,0,0),
(9,5,12,2,7,6,15,4,14,10,0,0,0,0,0,0),
(3,4,12,11,1,10,13,8,0,14,0,0,0,0,0,0),
(13,1,6,11,8,10,14,4,3,12,0,0,0,0,0,0),
(7,11,6,10,5,9,4,8,0,3,0,0,0,0,0,0),
(0,13,3,15,10,8,2,12,4,6,0,0,0,0,0,0),
(9,5,13,1,3,11,12,4,2,8,0,0,0,0,0,0)
);
implementation

{$R *.DFM}
//FORM内一个EDIT框，三个BUTTON

procedure TForm1.Button3Click(Sender: TObject);
begin
self.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
strlst:TStringList;
i,j:integer;
s:string;
t:array[1..8] of integer;
ts:array[1..4] of byte;
tc:array[1..4] of char;
begin
strlst:=TStringList.Create;
strlst.Add('640');
strlst.Add('641');
strlst.Add('480');
strlst.Add('481');
strlst.Add('490');
strlst.Add('491');
strlst.Add('510');
strlst.Add('511');
strlst.Add('520');
strlst.Add('521');
i:= (Gettickcount mod 10)+1;
randomize;
j:=random(100000);
s:=inttostr(strtoint(strlst.strings[i])*100000+j);

for i:=1 to 8 do
begin
t[i]:=table[i,strtoint(s[i])];
end;
for i:=1 to 4 do
begin
ts[i]:=((t[i] xor t[i+4]) or t[8]) or $30;
if (ts[i]>$39) then ts[i]:=ts[i]+7;
tc[i]:=chr(ts[i]);
end;
self.Edit1.Text:=copy(s,1,4)+'-'+copy(s,5,4)+copy(tc,1,2)+'-'+copy(tc,3,2);

strlst.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
messagebox(self.handle,'SmartCheck 6.03 注册机'+#13#10+'编写：Passion'+#13#10+'2001年8月22日','关于',MB_OK);
end;

end.


SoftICE4.05 for win9x

 标 题:SoftICE4.05 for win9x的安装序列号破解（1） (11千字)
发信人:Passion
时 间:2001-5-19 16:59:18
详细信息:
 SoftICE4.05 for win9x的安装序列号破解（1）
Passion

破解InstallShield安装序列号应该说有一套稍微“专门”的一点的方案，准备写出来和大家交流交流。一般对于5.5版本以下的InstallShield可以用专门的*.INS文件反编译器来分析其安装流程，这比起分析setup.exe来说似乎大多数情况下都能起到事半功倍的效果。（例外？当然有，这个就是。^_^）
对于Cracker来说，SoftICE4.05的序列号怕不少朋友都记住了。这里拿这个破解工具开刀有好几个原因：第一就是这个要跳过序列号检验很简单，但要寻出可用序列号来便有些难度，第二就是这个INSTALLSHIELD比较典型全面，既有普通的安装过程，又有大量的外部程序调用，能读懂它再读其他的应该也就没什么问题，第三便是由于皮大客的点将了。废话少说，先用ISDCC2反编译setup.ins再说：

isdcc2 setup.ins > sice405.txt

反编译出来的文档还不小，其中含有大量的外部DLL调用，如检测鼠标设置显卡等，要找出序列号判断的地方还真不容易。
打开sice405.txt，第一条路是查出错信息“The serial …… invalid ……”（不好意思，忘了，反正只查一两个单词），结果呢？没有！（事实上出错提示是在嵌入的外部动态链接库nminst32.dll中。）
第二条路，查字符串“MESSAGEBOX”，找倒是能找到一大片，可惜大多数明文的出错信息都不是我们要找的，有两三个类似于MessageBox(string2,
  -65534);等字样的，也弄不拎清这个string2到底在哪儿被赋值了，想来想去，也不容易成。
第三条路，从头细细看，看哪儿有突破口。这号反编译出来的东西，前边一点点是主程序，后边一大部分是各种各样的function实现部分，因此先看看程序体：（虽然相对来讲不多，可贴出来不少哇！）

// ------------- MAIN PROGRAM CODE --------------
program
start:
00136E:0002:    Disable(12);
001375:0021:    number60 = 0;
00137F:0021:    number56 = 0;
001389:0021:    number59 = 0;
001393:0021:    number51 = 1;
00139D:0021:    number70 = 0;
0013A7:0021:    number49 = 0;
0013B1:00B5:    function109();
0013B9:00B5:    function107();
0013C1:00B5:    function108();
    //估计是检验操作系统。
0013C9:0022:    if (number63 = 0) then
goto label2;
endif;
……

//省略NT部分的一些处理过程。

//这里下面要装载一些DLL来进行安装，如果装载失败则出错。

label1:
001690:0125:    string22 = SUPPORTDIR ^ "NMINST32.dll";
0016A7:00B2:    UseDLL(string22);
0016AC:0021:    number71 = LAST_RESULT;
0016B4:0128:    number71 = number71 != 0;
0016C6:0022:    if (number71 = 0) then
goto label3;
endif;
0016D4:002A:    MessageBox("Setup is unable to load the support DLLs
  needed to perform this SoftICE installation.", -65533);
001733:002B:    exit;

label2:
001739:0125:    string23 = SUPPORTDIR ^ "SINSETUP.dll";
001750:00B2:    UseDLL(string23);

………………… //省略部分代码

001826:002A:    MessageBox("Setup is unable to load the support DLLs
  needed to perform this SoftICE installation.", -65533);
001885:002B:    exit;

//以上是一些DLL的装载过程。下面正式开始安装过程。
//由于安装程序运行时，顺序是封面、协议、序列号，因此序列号检验怎么也不会太靠后。
label4:
00188B:0013:    string30 = "";
001893:0013:    string31 = "";
00189B:0021:    number64 = 0;
0018A5:0021:    number65 = 0;
0018AF:0021:    number66 = 0;
0018B9:0021:    number61 = 0;
0018C3:0021:    number68 = 4;
0018CD:0021:    number69 = 0;
0018D7:0021:    number67 = 4;
0018E1:00B5:    function140();
        //注意这个Function
0018E9:0021:    number71 = LAST_RESULT;
0018F1:0128:    number71 = number71 = 1;
001903:0022:    if (number71 = 0) then
goto label6;
endif;
001911:00B5:    function141();

label5:
00191D:0022:    if (0 = 0) then
goto label8;
endif;

………… //省略部分代码

label7:
001990:0128:    number71 = number62 = 1;
0019A2:0022:    if (number71 = 0) then
goto label9;
endif;
0019B0:0023:    StrCompare(string13, "");
0019B8:0128:    number71 = LAST_RESULT = 0;
0019CA:0022:    if (number71 = 0) then
goto label9;
endif;
0019D8:002A:    MessageBox("Unable to verify Serial Number. \n This
  program will now exit!", -65533);
001A1F:0159:    abort;

//这里大概是要装入DLL文件来检验序列号。
//这下面的大概就没用了，省之。
label8:
001A25:00B5:    function99();
001A2D:0021:    number71 = LAST_RESULT;
001A35:0128:    number71 = number71 < 0;
001A47:0022:    if (number71 = 0) then
goto label10;
endif;
001A55:002C:    goto label21;

………… //省略其他大部分安装代码。

001D43:00B3:    UnUseDLL(string22);
001D48:00B3:    UnUseDLL(string24);
001D4D:00B3:    UnUseDLL(string23);
001D52:0159:    abort;

label22:
001D58:002B:    exit;

endprogram

需要看看那个function140();的调用，下面是function140()的代码：
它完成的功能是检验注册表里是否有SICE的注册信息，如果有则读出来检验检验是否正确，如果正确则填到序列号输入框中免得再辛苦，这种体贴用户的做法可真不忍心来破哇！——但既然输入界面的检验过程难找，有这个检验过程也不错嘛！

// ------------- FUNCTION function140 --------------
function function140()
number lNumber0;
number lNumber1;
number lNumber2;
number lNumber3;
number lNumber4;
number lNumber5;
number lNumber6;
number lNumber7;
string lString0;
string lString1;
string lString2;
string lString3;
string lString4;
begin

label158:
005CB5:0110:        RegDBSetDefaultRoot(-2147483646);
        //就是H_L_M

005CBC:0088:        RegDBKeyExist("\\Software\\NuMega\\SoftICE");
005CD9:0021:        lNumber6 = LAST_RESULT;
005CE1:0128:        lNumber6 = lNumber6 = 1;
005CF3:0022:        if (lNumber6 = 0) then
goto label160;
endif;
005D01:0013:        lString2 = "\\Software\\NuMega\\SoftICE";
005D21:002C:        goto label161;
005D2A:0013:        lString2 = "\\Software\\Nu-Mega\\SoftICE";

label160:
005D4F:0152:        RegDBGetKeyValueEx(lString2, "InstallDir",
  lNumber1, lString0, lNumber0);
005D6A:0021:        number50 = LAST_RESULT;
005D72:0128:        lNumber6 = number50 = 0;
005D84:0022:        if (lNumber6 = 0) then
goto label162;
endif;
005D92:0013:        string10 = lString0;

label161:
005D9E:0152:        RegDBGetKeyValueEx(lString2, "User",
  lNumber1, lString0, lNumber0);
005DB3:0021:        number50 = LAST_RESULT;
005DBB:0128:        lNumber6 = number50 = 0;
005DCD:0022:        if (lNumber6 = 0) then
goto label163;
endif;
005DDB:0013:        string11 = lString0;

label162:
005DE7:0152:        RegDBGetKeyValueEx(lString2, "Company",
  lNumber1, lString0, lNumber0);
005DFF:0021:        number50 = LAST_RESULT;
005E07:0128:        lNumber6 = number50 = 0;
005E19:0022:        if (lNumber6 = 0) then
goto label164;
endif;
005E27:0013:        string12 = lString0;

label163:
005E33:0128:        lNumber6 = number62 = 1;
005E45:0022:        if (lNumber6 = 0) then
goto label166;
endif;
005E53:0021:        lNumber5 = 0;
005E5D:0013:        TARGETDIR = string10;
005E65:0125:        lString4 = TARGETDIR ^ "\\nmtrans.dll";
005E7C:007C:        GetFileInfo(lString4, 4, lNumber3, lString3);
005E8C:0125:        lString4 = TARGETDIR ^ "\\loader32.exe";
005EA4:007C:        GetFileInfo(lString4, 4, lNumber4, lString3);
005EB4:0128:        lNumber6 = lNumber3 = 0x8bc00;
005EC6:0128:        lNumber7 = lNumber4 = 0x1c4fec;
005ED8:0127:        lNumber6 = lNumber6 && lNumber7;
005EE3:0022:        if (lNumber6 = 0) then
goto label165;
endif;
005EF1:0021:        lNumber5 = 1;

label164:
005EFF:0128:        lNumber6 = lNumber5 = 0;
005F11:0022:        if (lNumber6 = 0) then
goto label166;
endif;
005F1F:002A:        MessageBox("Setup could not locate the
  correct version of \n SoftIce to update and thus will exit!", -65533);
005F7E:0159:        abort;

//上面从注册表里读安装路径、用户名、公司信息、版本号等。

label165:
005F84:0152:        RegDBGetKeyValueEx(lString2, "Serial",
  lNumber1, lString0, lNumber0);
005F9B:0021:        number50 = LAST_RESULT;
005FA3:00B5:        function143(lString0);    //读出序列号后的这个Function重要！
005FAE:0021:        lNumber6 = LAST_RESULT;
005FB6:0128:        lNumber6 = lNumber6 = 1;
005FC8:0022:        if (lNumber6 = 0) then
goto label167;
endif;
005FD6:0013:        string13 = lString0;
005FDE:012F:        return(1);
005FE7:002C:        goto label168;

label166:
005FF0:012F:        return(0);

label167:
005FFD:012F:        return(0);
006006:00B8:        return;

一层层跟下去，看function143的代码，很好，不太长：

// ------------- FUNCTION function143 --------------
function function143(pString0)
number lNumber0;
number lNumber1;
string lString0;
string lString1;
string lString2;
string lString3;
string lString4;
string lString5;
string lString6;
begin

//sice的序列号形如xxxx-xxxxxx-xx，保存在注册表里的也是这个格式。

label190:
0067BE:002F:        StrLength(pString0);
0067C3:0021:        lNumber1 = LAST_RESULT;
0067CB:0128:        lNumber1 = lNumber1 != 14;
0067DD:0022:        if (lNumber1 = 0) then
goto label192;
endif;
0067EB:012F:        return(0);

//这里我怀疑有编译错误，应该是如果序列号长14则序次执行到这里，否则返回0。

0067F8:0030:        StrSub(lString1, pString0, 0, 4);
00680A:0030:        StrSub(lString2, pString0, 5, 6);
00681C:0030:        StrSub(lString3, pString0, 12, 2);

//从注册表里的序列号中取除“-”号外的子串。

00682E:0124:        lString6 = lString1 + lString2;
006839:0124:        lString0 = lString6 + lString3;

//再拼起来，也就是相当于序列号去掉“-”号。
//下面仍旧怀疑有误。

006844:0031:        StrFind(lString0, "-");
00684D:0128:        lNumber1 = LAST_RESULT >= 0;
00685F:0022:        if (lNumber1 = 0) then
goto label193;
endif;
00686D:012F:        return(0);

label192:
00687A:0125:        lString5 = SUPPORTDIR ^ "UTILITY.dll";
006890:00B2:        UseDLL(lString5);

//装载utility.dll来准备进行进一步的序列号检验。

006895:0021:        lNumber1 = LAST_RESULT;
00689D:0128:        lNumber1 = lNumber1 = 0;
0068AF:0022:        if (lNumber1 = 0) then
goto label194;
endif;
0068BD:00B4:        UTILITY.DigitCheck(lString0);
    //这一步是关键检验过程。
0068C5:0021:        lNumber0 = LAST_RESULT;
0068CD:00B3:        UnUseDLL(lString5);

label193:
0068D6:0128:        lNumber1 = lNumber0 = 1;
0068E8:0022:        if (lNumber1 = 0) then
goto label195;
endif;
0068F6:012F:        return(1);
        //序列号正确则返回1。
0068FF:002C:        goto label196;

label194:
006908:012F:        return(0);

label195:
006915:00B8:        return;
end;

这段说明，SOFTICE安装时会读取注册表中的序列号信息（如果有的话）并且进行判断，这一段的机制与效果和检验输入的序列号是否正确是一样的。
现在就UTILITY.DigitCheck(lString0);是关键了，参数是去掉了“-”号的序列号。
SOFTICE安装程序运行时会在windows/temp目录下生成一些临时的目录和文件，其中就包括刚才提到的
utility.dll，下面是其DigitCheck的输出代码。
跟踪过程也不算太复杂，先填序列号，我填的是5100-0099BB-BB，下断bpx loadlibrarya do "d esp->8"看载入的DLL文件名，等按“Next”按钮的时候便会装入UTILITY.DLL，因此断在系统领空，返回后看看MOD
  UTILITY，我机子上的BASE是1BC0000，因此下面的地址都有一步重定位的变换，为了简明起见，我使用1000000做基址，这与W32DASM的反汇编代码相符合。
digitcheck的入口是1110，因此下断bpx 0167:1bc1110，断后便开始了漫长的跟踪过程。（见下篇）

标 题:SoftICE4.05 for win9x的安装序列号破解（2） (11千字)
发信人:Passion
时 间:2001-5-19 17:00:16
详细信息:

SoftICE4.05 for win9x的安装序列号破解（2）
Passion（接上半部分）

跟踪过程：

Exported fn(): DigitCheck - Ord:0001h
:10001110 56 push esi
:10001111 57 push edi
:10001112 8B7C240C mov edi, dword ptr [esp+0C] //当然是序列号的地址了。
:10001116 83C9FF or ecx, FFFFFFFF
:10001119 33C0 xor eax, eax
:1000111B F2 repnz
:1000111C AE scasb //先求长度。
:1000111D F7D1 not ecx
:1000111F 2BF9 sub edi, ecx
:10001121 8BC1 mov eax, ecx
:10001123 8BF7 mov esi, edi
:10001125 BF80910010 mov edi, 10009180
:1000112A C1E902 shr ecx, 02
:1000112D F3 repz
:1000112E A5 movsd //再搬地方。
:1000112F 8BC8 mov ecx, eax
:10001131 83E103 and ecx, 00000003
:10001134 F3 repz
:10001135 A4 movsb //怕没搬完，再搬零头。
:10001136 E895000000 call 100011D0
:1000113B E840010000 call 10001280

//这两个CALL会根据序列号的前8位数字经过查表运算得来一系列值，也就内定了前八个字符必须是数字。详细内容见后面。
计算出来的八个值：04 0C 09 03 0D 07 06 08，放在100091B0

:10001140 33C9 xor ecx, ecx
:10001142 5F pop edi
:10001143 890DAC910010 mov dword ptr [100091AC], ecx
:10001149 5E pop esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000118E(C)
|
:1000114A 8A81B4910010 mov al, byte ptr [ecx+100091B4] //取第一个
:10001150 8A91B0910010 mov dl, byte ptr [ecx+100091B0] //取第四个
:10001156 32C2 xor al, dl //先异或

//八个值中，第一个值和第四个值异或，再和最后一个值或，结果如不是数字或者字母则加7变成字母，比较后通过则继续计算第二个和第五个，并且仍和最后一个或，依此类推。

:10001158 8A15B7910010 mov dl, byte ptr [100091B7] //取最后一个
:1000115E 0AC2 or al, dl //再或
:10001160 0C30 or al, 30
:10001162 3C39 cmp al, 39
:10001164 8881B8910010 mov byte ptr [ecx+100091B8], al //存结果
:1000116A 7E08 jle 10001174
:1000116C 0407 add al, 07 //变字母
:1000116E 8881B8910010 mov byte ptr [ecx+100091B8], al //也是存结果

//这里的AL是算出来的一个字符，算出一个后马上跟输入的序列号的最后四位比较。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000116A(C)
|
:10001174 8A81B8910010 mov al, byte ptr [ecx+100091B8]
:1000117A 8A9188910010 mov dl, byte ptr [ecx+10009188]

//这是输入序列号的后四位地址。

:10001180 3AC2 cmp al, dl

//前八位数字计算出来的四个字符必须和序列号末尾的四个字母一样才行。

:10001182 7406 je 1000118A

//比较一个字符，这里得修改程序流程，让它继续跳回去计算正确的后几个字母。

:10001184 0C20 or al, 20
:10001186 3AC2 cmp al, dl
:10001188 7512 jne 1000119C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001182(C)
|
:1000118A 41 inc ecx
:1000118B 83F904 cmp ecx, 00000004 //比较四次也就是四个字符。
:1000118E 7CBA jl 1000114A
:10001190 890DAC910010 mov dword ptr [100091AC], ecx
:10001196 B801000000 mov eax, 00000001 //比较通过就返回1。
:1000119B C3 ret

程序算出来的四个字符是“9BFB”

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001188(C)
|
:1000119C 890DAC910010 mov dword ptr [100091AC], ecx
:100011A2 33C0 xor eax, eax //否则返回0。
:100011A4 C3 ret

这里是第一个CALL的内容，它的功能也就是先根据输入的前8个字符查一张表，如果查出来的东西符合要求（也就是前8个字符都是数字）则把前8个字符的ASCII码都转换成实际的数字存放在100091B0处：

* Referenced by a CALL at Address:
|:10001136
|
:100011D0 33D2 xor edx, edx
:100011D2 56 push esi
:100011D3 8915A8910010 mov dword ptr [100091A8], edx
:100011D9 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000123D(U)
|
:100011DB A16C830010 mov eax, dword ptr [1000836C]
:100011E0 890DAC910010 mov dword ptr [100091AC], ecx
:100011E6 83F801 cmp eax, 00000001
:100011E9 7E20 jle 1000120B

//也不知是什么判断，反正总是跳。

:100011EB 0FBE8180910010 movsx eax, byte ptr [ecx+10009180]
:100011F2 6A04 push 00000004
:100011F4 50 push eax
:100011F5 E8C4070000 call 100019BE
:100011FA 8B15A8910010 mov edx, dword ptr [100091A8]
:10001200 8B0DAC910010 mov ecx, dword ptr [100091AC]
:10001206 83C408 add esp, 00000008
:10001209 EB13 jmp 1000121E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100011E9(C)
|
:1000120B 0FBE8180910010 movsx eax, byte ptr [ecx+10009180] //表首址

//这里是第一张表
* Possible StringData Ref from Data Obj ->" ((((( "
->" H剟剟剟剟剟亖亖亖"
->"倐倐倐"
->" "
|
:10001212 8B3560810010 mov esi, dword ptr [10008160]
:10001218 8A0446 mov al, byte ptr [esi+2*eax] //查表
:1000121B 83E004 and eax, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001209(U)
|
:1000121E 85C0 test eax, eax
:10001220 741D je 1000123F //如果输入的不是数字，则这里会跳。
:10001222 83F908 cmp ecx, 00000008 //满了8个则跳。
:10001225 7D18 jge 1000123F
:10001227 8A8180910010 mov al, byte ptr [ecx+10009180]
:1000122D 240F and al, 0F
:1000122F 8882B0910010 mov byte ptr [edx+100091B0], al
:10001235 42 inc edx
:10001236 8915A8910010 mov dword ptr [100091A8], edx
:1000123C 41 inc ecx
:1000123D EB9C jmp 100011DB

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001220(C), :10001225(C)
|
:1000123F 83FA08 cmp edx, 00000008
:10001242 5E pop esi
:10001243 7D34 jge 10001279
:10001245 4A dec edx
:10001246 B807000000 mov eax, 00000007
:1000124B 8915A8910010 mov dword ptr [100091A8], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000126C(C)
|
:10001251 85D2 test edx, edx
:10001253 7D09 jge 1000125E
:10001255 C680B091001000 mov byte ptr [eax+100091B0], 00
:1000125C EB0D jmp 1000126B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001253(C)
|
:1000125E 8A8AB0910010 mov cl, byte ptr [edx+100091B0]
:10001264 4A dec edx
:10001265 8888B0910010 mov byte ptr [eax+100091B0], cl

//这里100091b0处执行完后就存放了前8位数字的实际值，也就是
05 01 00 00 00 00 09 09

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000125C(U)
|
:1000126B 48 dec eax
:1000126C 79E3 jns 10001251
:1000126E A3AC910010 mov dword ptr [100091AC], eax
:10001273 8915A8910010 mov dword ptr [100091A8], edx

//这里存放俩处理过的字节数，都是8。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001243(C)
|
:10001279 C3 ret

下面是第二个CALL的内容，这个CALL把第一个CALL计算出来的数字再查一次表，结果覆盖了100091b0处的8个字节：

* Referenced by a CALL at Address:
|:1000113B
|
:10001280 33C0 xor eax, eax
:10001282 A3AC910010 mov dword ptr [100091AC], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100012A7(C)
|
:10001287 0FBE88B0910010 movsx ecx, byte ptr [eax+100091B0]
:1000128E 8B148590800010 mov edx, dword ptr [4*eax+10008090] //又查一次表
:10001295 40 inc eax
:10001296 83F808 cmp eax, 00000008 //处理8个字符
:10001299 8A0C0A mov cl, byte ptr [edx+ecx]
:1000129C A3AC910010 mov dword ptr [100091AC], eax
:100012A1 8888AF910010 mov byte ptr [eax+100091AF], cl //存查表结果
:100012A7 7CDE jl 10001287
:100012A9 C3 ret //返回

查出来的结果仍然放在100091b0，这里变成了04 0C 09 03 0D 07 06 08

最后得可以用的序列号： 5100-000099-9BFB

需要说明的是，这一大段是检验从注册表里读出来的序列号，不是检验输入的。——其实都大同小异嘛，不信，在反编译的sice405.txt中再查找一下“function143”看看，还有这一处被调用了：

label185:
00664E:0152: RegDBGetKeyValueEx(lString0, "Serial", lNumber1, lString1, lNumber3);
006665:0021: lNumber4 = LAST_RESULT;
00666D:0128: lNumber5 = lNumber4 = 0;
00667F:0022: if (lNumber5 = 0) then
goto label187;
endif;
00668D:0013: lString3 = lString1;

label186:
006699:0152: RegDBGetKeyValueEx(lString0, "Onomatopoeia", lNumber1, lString1, lNumber3);
0066B6:0021: lNumber4 = LAST_RESULT;
0066BE:0128: lNumber5 = lNumber4 = 0;
0066D0:0022: if (lNumber5 = 0) then
goto label188;
endif;
0066DE:006D: StrToNum(lNumber0, lString1);
0066E6:0122: lNumber0 = lNumber0 >> 13;
0066F3:006E: NumToStr(lString1, lNumber0);

//推测应该是序列号前8位转化成纯数字值再右移13位后成的数字必须能通过下面的这个函数检验。

label187:
0066FF:00B4: NMINST32.ValidCookie(2, 0, lString1);

//这是多出来的一重检验函数，但运行时nminst32.dll的这个输出函数无论如何都跟不进去（不断），也不知道是怎么回事。

006711:0021: lNumber5 = LAST_RESULT;
006719:0128: lNumber5 = lNumber5 = 1;
00672B:0022: if (lNumber5 = 0) then
goto label190;
endif;
006739:00B5: function143(lString3);

//这里就是检验输入序列号是否合法的，检验形式基本一样，只不过前面多了一重束缚。

006744:0021: lNumber5 = LAST_RESULT;
00674C:0128: lNumber5 = lNumber5 = 1;
00675E:0022: if (lNumber5 = 0) then
goto label189;
endif;
00676C:0013: string13 = lString3;
006774:012F: return(1);
00677D:002C: goto label190;

还有一点，前8位数字不是随便填什么都能在10001140处中断的，估计就是那个NMINST32.ValidCookie(2, 0, lString1);搞的鬼。我在跟踪过程中却不见程序执行到这个函数的入口，也不知道是什么原因。
另外SoftICE4.05是要找出能用的序列号才需要这么麻烦地跟，倘若只想用暴力跳过检验安装成功，只需来一个bpx messageboxA再看看上面第一个JNZ的指令就行，实在不难。
再写几个随便跟出来的、可以用的序列号（在已知某些可用的序列号的基础上，;P ）
5107-0145BF-BB
5107-0045BB-BB
1107-0745FF-BF

其实这个破得也不算完美，只是时间紧，写得不好，大伙儿包涵包涵。——这还是皮特陈大客“点将”的“恶果”，有气儿找他去，我躲了。哈！


SoftIce45_for_win9x

 标 题:SoftIce45_for_win9x的安装序列码获取及序列码生成机编写(无实际意义，纯粹好玩） (9千字)
发信人:Leafred
时 间:2001-5-23 8:34:55
详细信息:
标题：SoftIce45_for_win9x的安装序列码获取及序列码生成机编写
作者：leafred
主页：http://leafred.126.com/
工具：isDcc v1.22，TRW2000

如有错误欢迎来信指正（leafspring@21cn.com）

以前搞破解，都用TRW2000，今天为了搞一个程序，结果TRW2000总是出错，无奈想起SoftIce，高高兴兴的下载完SoftIce，准备安装，没想到是要序列码的，谁叫咱会Crack呢，自己来动手找吧。哈哈，来破解Crack工具，有点滑稽吧。

先用isDcc来把setup.ins给反编译出来，当然了，setup.ins是在SoftIce安装时在系统临时目录下找到的了。包括后面要提到的动态库。
首先是想能直接从反编译的文件总给找到，来个“The serial number you entered is not valid for this product”搜索，铛的一声，弹出一个提示Search string not found!，心一沉，看来要费点劲了。
慢慢看吧。
嗯，这个声明prototype UTILITY.DigitCheck(string);可疑，从字面上看数字检查，很想序列码检查哎，先看看谁调用它吧。
找到一下这段代码，发现是function143调用，再找function143谁调用，发现果真是此处进行序列码检查。

首先看看调用function143的地方：
abel187: //Ref: 00667F
006699:0152: RegDBGetKeyValueEx(lString0, "Onomatopoeia", lNumber1, lString1, lNumber3);
＝＝＝＝》取得序列码，先从注册表获取初始值，让我们进行修改，原来没有当然输入新值了。

。。。。。。

label188: //Ref: 0066D0
＝＝＝＝》先进行数据初步校验
0066FF:00B4: NMINST32.ValidCookie(2, 0, lString1);
006711:0021: lNumber5 = LAST_RESULT;
006719:0128: lNumber5 = lNumber5 = 1;
00672B:0022: if (lNumber5 = 0) then
goto label190;
endif;
＝＝＝＝＝》初步校验通过，进行正式检查
006739:00B5: function143(lString3);

。。。。。。

现在再来看函数
// ------------- FUNCTION function143 --------------
function function143(pString0)
＝＝＝＝》省略掉变量声明
。。。。。

begin
0067BE:002F: StrLength(pString0); ＝＝》获取长度
0067C3:0021: lNumber1 = LAST_RESULT;
0067CB:0128: lNumber1 = lNumber1 != 14;
＝＝＝＝＝》长度不等于14 ？
0067DD:0022: if (lNumber1 = 0) then
＝＝＝＝＝＝＝》 No，等于14，OK下一步检查
goto label192;
endif;
＝＝＝＝》Yes，不等于14，返回0，这里可以知道输入的字符共12位，因为还含两个“－”
0067EB:012F: return(0);

label192: //Ref: 0067DD
＝＝＝＝＝》取第一个框里的字符
0067F8:0030: StrSub(lString1, pString0, 0, 4);
＝＝＝＝＝》取第二个框里的字符
00680A:0030: StrSub(lString2, pString0, 5, 6);
＝＝＝＝＝》取第三个框里的字符
00681C:0030: StrSub(lString3, pString0, 12, 2);
00682E:0124: lString6 = lString1 + lString2;
006839:0124: lString0 = lString6 + lString3;
＝＝＝＝》以上代码合并输入的内容，去掉“－”
006844:0031: StrFind(lString0, "-");
＝＝＝＝＝》还含有“－”吗？
00684D:0128: lNumber1 = LAST_RESULT >= 0;
00685F:0022: if (lNumber1 = 0) then
＝＝＝＝》No，不含了，OK继续检查
goto label193;
endif;
＝＝＝＝》还含“－”，返回0，由此看出我们输入的字符不可含有“－”
00686D:012F: return(0);

＝＝＝＝》现在开始装载UTILITY.dll了
label193: //Ref: 00685F
00687A:0125: lString5 = SUPPORTDIR ^ "UTILITY.dll";
006890:00B2: UseDLL(lString5);
006895:0021: lNumber1 = LAST_RESULT;
00689D:0128: lNumber1 = lNumber1 = 0;
0068AF:0022: if (lNumber1 = 0) then
goto label194;
endif;
＝＝＝＝＝＝》调用UTILITY.dll的DigitCheck来检查
0068BD:00B4: UTILITY.DigitCheck(lString0);
0068C5:0021: lNumber0 = LAST_RESULT;
0068CD:00B3: UnUseDLL(lString5);

label194: //Ref: 0068AF
0068D6:0128: lNumber1 = lNumber0 = 1;
0068E8:0022: if (lNumber1 = 0) then
goto label195;
endif;
0068F6:012F: return(1);
0068FF:002C: goto label196;

OK，至此我们已经知道它如何进行序列号检查的，首先进行ValidCookie，通过则检查长度，长度也通过进行最后的DigitCheck。
我们现在可以把上面用来检查的两个动态库搞过来反汇编，慢慢读程序，我现在就不这样做了，我直接用TRW2000了，不要installshiled防TRW2000哦。

老一套了，用hmemcpy中断，几个F12来到此处：
017F:01541C44 LEA EAX,[ESP+0C]
017F:01541C48 PUSH EAX
017F:01541C49 PUSH DWORD 01555820
017F:01541C4E CALL 0154AAA0
在这里我们来个D EAX看看，发现是第一个框里的前三位数字，其实往上看看我们就可以看到前三个数字被移到ESP+0C处的代码。它是先移到ESP+10处，然后把ESP减4，POP一个值了。不就是用ESP+0C来引用吗。
再D 01555820，发现是许多数字组合，再跟进去，发现0154AAA0是用来判断EAX的内容是不是在01555820中的某个数字组合中。
下面还有几处，只要有一处找到，就可以了。
因此可以知道前三个数字必须在这些数字组合中，具体的是：
230 400 401 410 411 420 421 430 431 480 481 510 930 931 950 951 ＝＝》第一处
231 401 411 421 431 481 511 931 951 ＝＝＝》第二处，一下还有几处全部没有，也就是说它现在只使用两处，下面的几处可能是保留给将来版本使用。

好了，现在再随便挑一个，重新输入再进入，（当然也可以直接改了）
来到此处：
017F:01541CA1 CALL 0154A5F0
关键所在，F8进入。
017F:0154A64E PUSH DWORD 01556C20
017F:0154A653 CALL `KERNEL32!LoadLibraryA`
017F:0154A659 MOV ESI,EAX
017F:0154A65B TEST ESI,ESI
017F:0154A65D JNZ 0154A693
＝＝＝＝》装载UTILITY.dll
。。。。。

017F:0154A693 PUSH DWORD 01554588
017F:0154A698 PUSH ESI
017F:0154A699 CALL `KERNEL32!GetProcAddress`＝＝》获取DigitCheck入口
017F:0154A69F TEST EAX,EAX
017F:0154A6A1 JZ 0154A6B1
017F:0154A6A3 LEA ECX,[ESP+0C]
017F:0154A6A7 PUSH ECX
017F:0154A6A8 CALL EAX ＝＝＝＝＝＝》此处进入DigitCheck了！！！！！
017F:0154A6AA ADD ESP,BYTE +04

进入017F:0154A6A8 CALL EAX
。。。。。。

017F:01BC1136 CALL 01BC11D0
＝＝＝＝＝》此处功能是查表求得8个数字（包含对非数字的特殊处理）
017F:01BC113B CALL 01BC1280
＝＝＝＝＝》利用上面的8个数字，再查表得8个数字。
。。。。。。

＝＝＝＝＝》01BC91B0处存放的是上面求得的8个数字
017F:01BC114A MOV AL,[ECX+01BC91B4]＝＝＝》后四位
017F:01BC1150 MOV DL,[ECX+01BC91B0]＝＝＝》前四位
017F:01BC1156 XOR AL,DL ＝＝＝》先XOR ECX＋4与ECX处数字（ECX从0到3）
017F:01BC1158 MOV DL,[01BC91B7] ＝＝＝》最后一位
017F:01BC115E OR AL,DL ＝＝＝＝》 再OR最后一位
017F:01BC1160 OR AL,30＝＝＝》再OR 0x30
017F:01BC1162 CMP AL,39 ＝＝＝》判断是否为数字
017F:01BC1164 MOV [ECX+01BC91B8],AL
017F:01BC116A JNG 01BC1174
017F:01BC116C ADD AL,07 ＝＝＝》 加7转为字母（A－Z）
017F:01BC116E MOV [ECX+01BC91B8],AL
017F:01BC1174 MOV AL,[ECX+01BC91B8]
017F:01BC117A MOV DL,[ECX+01BC9188]
017F:01BC1180 CMP AL,DL ＝＝＝＝》与输入的后四位比较
017F:01BC1182 JZ 01BC118A
017F:01BC1184 OR AL,20 ＝＝＝》不分大小写
017F:01BC1186 CMP AL,DL
017F:01BC1188 JNZ 01BC119C
017F:01BC118A INC ECX
017F:01BC118B CMP ECX,BYTE +04
017F:01BC118E JL 01BC114A
017F:01BC1190 MOV [01BC91AC],ECX
017F:01BC1196 MOV EAX,01
017F:01BC119B RET
至此，我们完全清楚它干什么了，我们可以在017F:01BC1180 中断。
每次修改DL让它与AL相等，并几下AL值四次AL的值就是正确的后四位。
也就是说它根据我们输入的东西，判一下前三位，然后进行计算，算出后四位，再与输入的后四位比较，正确，则通过。

因而，也就有了序列码生成机（不知可有更好的名字，因为它不能叫做注册机了）的概念。
代码如下：(仅仅要你输入前八位数值，不带“－”）

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
unsigned int tab[8][10] = {
{15,1,11,3,8,4,13,7,12,0},
{10,12,1,8,2, 0 ,9, 15, 5, 11},
{9 ,5, 12, 2, 7, 6, 15, 4 , 14, 10},
{3, 4, 12, 11,1, 0, 13 ,8, 0, 14},
{13 ,1, 6,11 ,8 ,10 ,14 ,4,3, 12},
{7,11,6,10,5,9,4,8,0,3},
{0,12,3,15,10,8,2,12,4,6},
{9, 5, 13, 1,3,11,12 ,4, 2 ,8}
} ; //索引表
char *fthree[] ={
"230" ,"231","400","401","410","411" ,"420", "421", "430", "431",
"480", "481","510","511","930","931", "950","951"
}; //前三个字符范围
unsigned char fthreelen = 18;
char regcode[4],getcode[80];
int i,j;
unsigned int itmp;
unsigned int code[8] ={0,0,0,0,0,0,0,0} ;

printf("SoftIce4.5 for Win9x serial number Generater\n");
printf("Written by Leafred\n");
printf("Http://leafred.126.com/\n");
printf("\nPlease Input the initial 8 letters:\n");
do {
gets(getcode);
if(strlen(getcode) != 8)
printf("Please Input the initial 8 letters:\n");
else
break;

} while(1) ;
for(i=0 ;i < fthreelen ; i++)
if(! strncmp(getcode,fthree[i],3)) break;
if(! (i < fthreelen)){
printf("\nFirst three letters must in:\n");
for(i=0;i< fthreelen;i++)
printf("%s ",fthree[i]);
printf("\n");
return 0 ;
}
strupr(getcode);
//第一个CALL
for(i=0;i<8;i++){
itmp = getcode[i] ;
if(itmp >='0' && itmp <= '9')
itmp = 132;
else if(itmp >= 'A' && itmp <= 'F')
itmp = 129;
else if(itmp >= 'G' && itmp <= 'Z')
itmp = 1;
else if(itmp >= 'a' && itmp <= 'f')
itmp = 130;
else if(itmp >= 'g' && itmp <= 'z')
itmp = 2;
else
itmp = 16;
if(!(itmp & 4))break;
code[i] = getcode[i] & 0xf;
}
//对前8各输入有字母处理
if(i < 8)
{
i--;
j = 7;
do{
if(i>=0){
code[j]=code[i];
i--;
}
else
code[j] = 0;
j--;
if(j < 0)
break;

}while (1) ;
}
//查表取值
for(i=0;i<8;i++)
code[i] = tab[i][code[i]];

//最后一步
for(i=0;i<4;i++){
regcode[i] = code[i] ^ code[i+4];
regcode[i] |= code[7];
regcode[i] |= 0x30 ;
if(regcode[i] > 0x39)regcode[i] += 7;
}
printf("Your serial number is:\n");
printf("%c%c%c%c-%s%c%c-%c%c\n",getcode[0],getcode[1],getcode[2],getcode[3],getcode+4,regcode[0],regcode[1],regcode[2],regcode[3]);
return 0;
}


StateCAD4.11TE

标 题:转载：InstallShield Password 破解一例 (1千字)
发信人:1212
时 间:2001-2-9 18:49:24
详细信息:
InstallShield Password 破解一例
软件: StateCAD4.11TE版
运行自解压的安装文件后,显示出一个对话框要求输入password，
按钮[上一步]和[完成]都被禁止，只有[取消]处于允许状态。
密码输入正确后[上一步]和[完成]按钮才能被允许。
随便输入几个数字"12345"，Ctrl+D到Soft-ICE环境，设断点 bpx GetWindowText，然后F5继续回到password对话框，再输入一个数字'6'时Soft-ICE截获GetWindowText，软件代码如下：
CALL [USER32!GetWindowTextA]
MOV EDX,[0040FFB0]
PUSH EDX ;d edx观察数据段:
;0040FFB0: 31 32 33 34 35 36 00 00
; 1 2 3 3 5 6
CALL 00401090 ;这个是算密码是否有效的CALL,下面再详细分析
MOV EDX,[0040FAA8] ;[0040FAA8]=00F45147
ADD ESP,04
XOR ECX,ECX
CMP EAX,EDX ;判断EAX=00F45147 ? //EAX=EDX才是正常的流程
SETZ CL ;保存判断结果
MOV EAX,ECX ;EAX返回判断结果
POP EBP
RET
计算密码是否有效的CALL:
015F:00401090 PUSH EBP
MOV EBP,ESP
MOV EDX,EBP+8
MOV EAX,00F143AC ;EAX初始化
MOV CL,[EDX] ;把密码的第一个字符"1"->CL
TEST CL,CL ;判断是否为00H
JZ 004010AE ;为00H则返回
015F:004010A1 MOVSX ECX,CL ;ECX的高位被清零
INC EDX ;EDX加1,指向下一个字符
LEA EAX,[ECX*2+EAX];EAX=ECX*2+EAX
MOV CL,[EDX] ;密码字符->CL
TEST CL,CL ;判断是否为0
JNZ 004011A1 ;不等于00H则跳到004011A1执行
;有点疑惑: 015F:004011A1 NOP
;事实上代码是跳到004010A1运行
;绝非笔记记录有误,难道是Soft-ICE的bug?
015F:004010AE XOR EAX,00051993 ;所有的密码字符都经过运算后,
;再与0051993 XOR一下
POP EBP
RET ;OK,返回
整个密码效验的流程如下:
EAX=00F143AC
每个密码字符都参与循环运算:
{
ECX=密码字符的ASCII码值
EAX=ECX*2+EAX
}
EAX=EAX XOR 0051993
IF EAX==00F45147 则密码正确
所以只要所有密码字符的ASCII值之和等于
294H=( (00F45147 xor 0051993)-00F143AC )/2
即可
编造一个: "abcdef?"
ASCII码值之和=61H+62H+63H+64H+65H+66H+3F=294H

回到password对话框输入试试,ok ;)


网际金典3.0(Passion)

 标 题:皮兄，网际金典3的InstallShield序列号破解。 (9千字)
发信人:Passion
时 间:2001-4-28 23:27:06
详细信息:
网际金典3的InstallShield序列号破解。

受皮特陈兄指使，也不知从哪儿弄来个网际金典3的不完全版，非得说要咱按“典型”的InstallShield破解法来找个序列号不可。临危受命，不可不从，谁叫这位FCG的老大让咱“难望其项背”呢？好，小猫下了半夜，睡一觉后起床穿衣洗脸刷牙吃饭后……开始！

网际金典安装需要序列号，简单的一小段，似乎是InstallShield安装的典型。于是先用ISDCC2反编译setup.ins到一个文件中，打开这个文件，找开始的函数声明部分（为什么不找出错信息呢？原因……嘿嘿，声明部分在前面嘛，容易看见。），果然有下面的几行：

……
prototype InstDll.RWCheckSerialNo(LIST, LIST, LIST);
prototype InstDll.InstallTcFont(LIST);
……

这说明了什么？越来越多的软件不把序列号的检验过程放在InstallShield的脚本文件中，大概是免得反编译一下就看出算法来了，因此多多少少也找些DLL来把过程隐藏在里面。这里就说明SETUP程序需要用到一个叫InstDll.dll文件中的RWCheckSerialNo过程。
下一步，不用找什么出错信息了，直接在文件中查找字串“RWCheckSerialNo”，一下就找到了，下面是相关的上下文内容：

// ------------- FUNCTION function95 --------------
function function95(pString0, pString1, pString2)
number lNumber0;
number lNumber1;
number lNumber2;
number lNumber3;
number lNumber4;
string lString0;
begin

label812:
00F164:00BA: AddressString(pString0);
00F169:0021: lNumber0 = LAST_RESULT;
00F171:00BA: AddressString(pString1);
00F176:0021: lNumber1 = LAST_RESULT;
00F17E:00BA: AddressString(pString2);
00F183:0021: lNumber2 = LAST_RESULT;
00F18B:0125: lString0 = SUPPORTDIR ^ "INSTDLL.DLL";
00F1A1:00B2: UseDLL(lString0);

//Usedll，说明INSTDLL.DLL是通过loadlibrarya动态加载的。

00F1A6:00B4: InstDll.RWCheckSerialNo(lNumber0, lNumber1, lNumber2);
00F1B4:0021: lNumber3 = LAST_RESULT;
00F1BC:00B3: UnUseDLL(lString0);

//卸载INSTDLL.DLL。

00F1C1:0128: lNumber4 = lNumber3 <= 0;

//这句话应该说明一下。其实应该是lNumber4 = (lNumber3 <= 0)，也就是说如果lNumber3小于等于0，则这个逻辑式为真，lNumber4的值就是1，下面的这个IF就会直接返回，不会跳转到正确的label814。——这里也告诉我们，RWCheckSerialNo要返回大于0的值才表示序列号通过检验，这点对于等会儿分析INSTDLL.DLL的代码是很重要的。

00F1D3:0022: if (lNumber4 = 0) then
goto label814;
endif;
00F1E1:012F: return(0);
00F1EE:012F: return(1);
00F1F7:00B8: return;
end;

调用这个FUNCTION95的程序段也可以找到：

label10:
00112E:00B5: function115();
001136:0021: lNumber0 = LAST_RESULT;
00113E:0128: lNumber4 = lNumber0 = 12;
001150:0022: if (lNumber4 = 0) then
goto label12;
endif;
00115E:002C: goto label10;

label11:
001167:00B5: function116();
00116F:0021: lNumber0 = LAST_RESULT;
001177:0128: lNumber4 = lNumber0 = 12;
001189:0022: if (lNumber4 = 0) then
goto label13;
endif;
001197:002C: goto label11;
00119C:002C: goto label14;

label12:
0011A5:00B5: function95(string11, string6, string7); //检验序列号
0011B6:0021: lNumber4 = LAST_RESULT;
0011BE:0128: lNumber4 = lNumber4 = 0;
0011D0:0022: if (lNumber4 = 0) then //错则显示提示
goto label14;
endif;
0011DE:0112: StrLoadString("", "MSG_INFO", lString1);
0011F1:003B: SetDialogTitle(4, lString1);
0011FB:0112: StrLoadString("", "ERROR_CHECK_SERIAL_NO", lString1);
00121B:002A: MessageBox(lString1, -65535);
001225:002C: goto label12;

好了，setup.ins里已经没什么地方可以做手脚了，运行setup.exe，在Windows\temp\_istmp0.dir下能找到一个instdll.dll文件，哈哈，才23k，考虑到编译时的无用代码，核心检验函数无论怎样都不会太复杂。不管怎样，先复制出来反汇编一下吧！
instdll.dll输出函数RWCheckSerialNo的地址是1000（参看以下代码），这得先记住。
功力高的话可以直接后分析反汇编后的代码，如果像我这样不怎么样的“低”手，就只有动态跟踪了。SETUP本身的框架比较复杂，hmemcpy这种断点只会把局面弄得更复杂。前面不是说了instdll.dll是动态加载的吗？于是运行SETUP.EXE后在序列号输入界面处切入SOFTICE，下断bpx loadlibrarya，回来按下一步马上断掉。
按几次F12返回到高层，用MOD INSTDLL看看刚加载的INSTDLL.DLL地址，我这里是01A50000，加上RWCheckSerialNo函数的偏移1000，u 1A51000便是RWCheckSerialNo的入口，下断bpx 0167:01a51000。
下面就是序列号的分析过程了：

Exported fn(): RWCheckSerialNo - Ord:0004h
:10001000 83EC10 sub esp, 00000010
:10001003 56 push esi
:10001004 57 push edi
:10001005 8B7C241C mov edi, dword ptr [esp+1C] //输入的序列号地址。
:10001009 33F6 xor esi, esi
:1000100B 57 push edi
:1000100C E8FF000000 call 10001110 //跟进去。
:10001011 83C404 add esp, 00000004
:10001014 85C0 test eax, eax //如果懒得跟，改这里即可。
:10001016 740D je 10001025
:10001018 B801000000 mov eax, 00000001 //正确标志。
:1000101D 5F pop edi
:1000101E 5E pop esi
:1000101F 83C410 add esp, 00000010
:10001022 C20C00 ret 000C

下面是10001110处的内容：

* Referenced by a CALL at Addresses:
|:1000100C , :100011AC
|
:10001110 83EC50 sub esp, 00000050
:10001113 56 push esi
:10001114 8B742458 mov esi, dword ptr [esp+58]
:10001118 56 push esi

* Reference To: KERNEL32.lstrlenA, Ord:029Ch
|
:10001119 FF15AC810010 Call dword ptr [100081AC]
:1000111F 83F80D cmp eax, 0000000D
:10001122 7407 je 1000112B

//检测输入的序列号长度必须为0x0D个字符，也就是13个。

:10001124 33C0 xor eax, eax
:10001126 5E pop esi
:10001127 83C450 add esp, 00000050
:1000112A C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001122(C)
|
:1000112B 8D442404 lea eax, dword ptr [esp+04]
:1000112F 56 push esi
:10001130 50 push eax

* Reference To: KERNEL32.lstrcpyA, Ord:0296h
|
:10001131 FF1548810010 Call dword ptr [10008148]

//复制一下以备分析，此时ESP+4指向输入的序列号。

:10001137 0FBE542404 movsx edx, byte ptr [esp+04]
:1000113C 0FBE4C2407 movsx ecx, byte ptr [esp+07]
:10001141 8BC2 mov eax, edx
:10001143 2BC1 sub eax, ecx
:10001145 83F8FF cmp eax, FFFFFFFF
:10001148 7407 je 10001151

//这段说明序列号的第四个字符必须比第一个字符大1（Ascii码）。

:1000114A 33C0 xor eax, eax
:1000114C 5E pop esi
:1000114D 83C450 add esp, 00000050
:10001150 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001148(C)
|
:10001151 0FBE442408 movsx eax, byte ptr [esp+08]
:10001156 2BD0 sub edx, eax
:10001158 83FA04 cmp edx, 00000004
:1000115B 7407 je 10001164

//这段说明序列号的第一个字符必须比第五个字符大4（Ascii码）。

:1000115D 33C0 xor eax, eax
:1000115F 5E pop esi
:10001160 83C450 add esp, 00000050
:10001163 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000115B(C)
|
:10001164 0FBE442405 movsx eax, byte ptr [esp+05]
:10001169 0FBE4C2406 movsx ecx, byte ptr [esp+06]
:1000116E 2BC1 sub eax, ecx
:10001170 83F8F8 cmp eax, FFFFFFF8
:10001173 7407 je 1000117C

//这段说明序列号的第三个字符必须比第二个字符大8（Ascii码）。

:10001175 33C0 xor eax, eax
:10001177 5E pop esi
:10001178 83C450 add esp, 00000050
:1000117B C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001173(C)
|
:1000117C 8D442409 lea eax, dword ptr [esp+09]

* Possible StringData Ref from Data Obj ->"lqhyhtlj"
|
:10001180 6850500010 push 10005050
:10001185 50 push eax

* Reference To: KERNEL32.lstrcmpiA, Ord:0293h
|
:10001186 FF154C810010 Call dword ptr [1000814C]

//然后从第六个字符开始的八个字符必须是“lqhyhtlj”

:1000118C 5E pop esi
:1000118D 83F801 cmp eax, 00000001
:10001190 1BC0 sbb eax, eax
:10001192 83C450 add esp, 00000050
:10001195 F7D8 neg eax
:10001197 C3 ret

于是我们可以捏造一个我们可以用的序列号，我捏的是“81994lqhyhtlj”，为保险一点又捏造了一个“e19falqhyhtlj”，安装时填入，果然都通过了（出现了下一步的自定义安装路径的对话框）。
还有一点，instdll.dll在你输入的字串长度为14时还有另外一串更复杂的检验算法，我下的不是完全安装版，没法子判断到底哪个才是正宗的，或者两个都是？——这就得靠皮特陈兄用正式安装版来检验检验了。^_^


PB6.5

标 题:如何破解PB6.5编译的程序 (23千字)
发信人:Leafred
时 间:2001-5-2 21:43:23
详细信息:

标题：如何破解PB6.5编译的程序
作者：Leafred
主页：http://leafred.126.com/

如何破解PB6.5编译的程序

（以下内容若有错误之处，还望来信指正）

以下所有均针对PowerBuilder6.5编译的伪码程序（即带有PBD的文件执行）。

PowerBuilder的伪码编译同VB伪码编译一样，同样是PB动态库（PBVM60.DLL），解释伪码执行。而PBVM60.DLL对取字符串、比较字符串、比较数值与我们常见到的c或汇编或delphi等等语言生成的执行文件不一样。

为此，我用PB6.5生成一段代码，然后跟踪，摸出一些经验：

我的Pb代码如下：（不要看有什么意思，纯粹为了研究）

string ls_t1,ls_t2,ls_444
long ll_l1,ll_l2,ll_l3

ll_l1 = 12325
ls_t1 = sle_1.text //看在PB中如何取字符串值。sle_1 是单行编辑框。
ls_t2 = '12325'

ll_l2 = integer(ls_t1) //看此处会触发什么
ll_l2 -= ll_l1
if ls_t1 <> 'fdfggfh' Then //研究PB的字符比较会调用什么。＝＝＝＝＝＝＝＝＝重点
ll_l2 = ll_l2 * 2
else
ll_l3 = integer('24354')
end if

if ll_l2 <> 3107 Then //研究PB如何进行数值比较，我们如何截取。＝＝＝＝＝＝＝＝＝＝重点
ls_444 = 'goto error'
else
MessageBox('error','dddd') //PB的messagebox调用那个API
end if
MessageBox('error','dddd') //PB的messagebox调用那个API
ls_444 = 'goto oookkk' //研究PB如何赋字符串值

ll_l2 = integer(ls_t2)
ll_l2 -= ll_l1

if ll_l2 <> 0 Then
MessageBox('error','dddd')
end if

上面的代码很乱，仅仅是为了追踪研究。

OK，现在用TRW2000加载执行，

首先用bpx hmemcpy （即所谓的万能断点）：结果不中断，却在我气愤的用鼠标点击单行编辑框时触发（真莫名其妙）。

改用bpx getdlgitemtexta（getdlgitemtext)
也不中断。
用bpx Getwindowtexta
结果，每输入一个字符就中断，真烦人。
用bpx messageboxa
OK，提示消息时，中断。
说明PB的MessageBox时调用MessageBoxA的API。
但这用处不大，PBD是解释伪码执行的，我几乎没有办法来找出那里是确定是否来弹出提示框。因为它一句一句的解释执行，弹出消息框的行与判断条件的行被PB隔的不知那里去了。

再用用lstrcmpa：
哈哈，比较字符串的地方被截取了，如下：
KERNEL32!lstrcmpA
017F:BFF77304 PUSH EBX
017F:BFF77305 PUSH ESI
017F:BFF77306 PUSH EDI
017F:BFF77307 PUSH EBP
017F:BFF77308 PUSH DWORD 01F2
017F:BFF7730D PUSH DWORD BFFA21CB
017F:BFF77312 PUSH DWORD [FS:00]
017F:BFF77319 MOV [FS:00],ESP
017F:BFF77320 MOV EAX,ESP
017F:BFF77322 PUSH DWORD [EAX+24]
017F:BFF77325 PUSH DWORD [EAX+20]
017F:BFF77328 CALL BFF71247
017F:BFF7732D POP DWORD [FS:00]
017F:BFF77334 ADD ESP,BYTE +08
017F:BFF77337 POP EBP

你试试 D EAX 和 D EDI 你看到了什么，哈哈，你输入的字符串和要比较的字符串，那现在你要做的是什么，去做吧，什么？？，不知道！！，拿笔记下另外一个字符串！！

那，是不是PB的字符串比较都是这个呢，我又写了乱七八糟的代码，然后同样可以这样获得。

好了，现在字符串比较可以轻松搞定，那又如何截取到数值比较呢？？这比较烦了，还要看别人写的程序如何了。

你看到我写的代码了吗，用了不少integer函数，一般要比较数值时，它都会把你输入的字符串转为整型或者长整型数值，即一般会调用integer()或者long()函数。

我们现在就现以integer来做。

重新启动TRW2000，记住把PBVM60.DLL放到TRW2000的DLL目录，让TRW2000启动时读入PBVM60.DLL,这样我们就可以以PBVM60里的函数来设定断点了。

打入：bpx fninteger ＝＝＝＝＝》PB的Integer（）函数
执行。被中断
PBVM60!fnInteger
017F:10BB8180 MOV EAX,[ESP+04]
017F:10BB8184 SUB ESP,BYTE +70
017F:10BB8187 PUSH EBX
017F:10BB8188 PUSH EBP
017F:10BB8189 PUSH ESI
017F:10BB818A MOV ESI,[EAX]
017F:10BB818C PUSH EDI
017F:10BB818D PUSH ESI
017F:10BB818E XOR EBX,EBX
017F:10BB8190 CALL `PBVM60!ot_get_next_evaled_arg`
017F:10BB8195 MOV CL,[EAX+04]
017F:10BB8198 AND ECX,BYTE +01
017F:10BB819B MOV EBP,ECX
017F:10BB819D JNZ NEAR 10BB8269
017F:10BB81A3 XOR ECX,ECX
017F:10BB81A5 MOV CX,[EAX+06]
017F:10BB81A9 LEA EDI,[ECX-01]
017F:10BB81AC CMP EDI,BYTE +0A
017F:10BB81AF JA NEAR 10BB8262
017F:10BB81B5 XOR EDX,EDX
017F:10BB81B7 MOV DL,[EDI+10BB82B8]
017F:10BB81BD JMP NEAR [EDX*4+10BB82A4]
017F:10BB81C4 PUSH EAX
017F:10BB81C5 PUSH ESI
017F:10BB81C6 CALL `PBVM60!ot_get_valptr`
017F:10BB81CB MOV ESI,EAX
017F:10BB81CD TEST ESI,ESI
017F:10BB81CF JZ NEAR 10BB8269

按5下F12，然后按F10，会来到下面一段代码：
........

017F:10C8F62D CALL NEAR [EAX+10D48328]
017F:10C8F633 MOV [EBP-04],EAX
017F:10C8F636 MOV EAX,[ESI+34]
017F:10C8F639 ADD ESP,BYTE +14
017F:10C8F63C TEST EAX,EAX
017F:10C8F63E JZ 10C8F647
017F:10C8F640 MOV DWORD [EBP-04],00
017F:10C8F647 MOV EAX,[ESI+14]
017F:10C8F64A TEST EAX,EAX
017F:10C8F64C JZ 10C8F5F1
........

再U 017F:10C8F5EE 会看到如下代码：
017F:10C8F5EE MOV EDI,[EBP-18]
017F:10C8F5F1 MOV EAX,[EBP+10]
017F:10C8F5F4 MOV EDX,[ESI+10]
017F:10C8F5F7 CMP EDX,[EAX+16]
017F:10C8F5FA JNC 10C8F64E
017F:10C8F5FC CMP DWORD [EBP-04],BYTE +01
017F:10C8F600 JNZ 10C8F64E
017F:10C8F602 MOV ECX,[EBP-20]
017F:10C8F605 XOR EAX,EAX
017F:10C8F607 ADD ECX,EDX
017F:10C8F609 PUSH EDI
017F:10C8F60A MOV AX,[ECX]
017F:10C8F60D LEA EAX,[EAX+EAX*2]
017F:10C8F610 SHL EAX,02
017F:10C8F613 MOV EBX,[EAX+10D4832C]
017F:10C8F619 LEA EDX,[EDX+EBX*2+02]
017F:10C8F61D MOV [ESI+10],EDX
017F:10C8F620 LEA EDX,[EBP+FFFFFF28]
017F:10C8F626 PUSH EDX
017F:10C8F627 MOV EDX,[EBP-14]
017F:10C8F62A PUSH EDX
017F:10C8F62B PUSH ECX
017F:10C8F62C PUSH ESI
017F:10C8F62D CALL NEAR [EAX+10D48328]

看到了吗，
这一句

017F:10C8F62D CALL NEAR [EAX+10D48328]是重点。

所有的伪码都要通过这一句进入执行。

我们再来看看一般一句代码执行完后，再进入CALL NEAR [EAX+10D48328]
几次，才执行下一句。

我们就研究这一段：

ll_l2 = integer(ls_t1) //看此处会触发什么
ll_l2 -= ll_l1
if ls_t1 <> 'fdfggfh' Then //研究PB的字符比较会调用什么。＝＝＝＝＝＝＝＝＝重点
ll_l2 = ll_l2 * 2
else
ll_l3 = integer('24354')
end if

if ll_l2 <> 3107 Then //研究PB如何进行数值比较，我们如何截取。＝＝＝＝＝＝＝＝＝＝重点
ls_444 = 'goto error'
else
MessageBox('error','dddd') //PB的messagebox调用那个API
end if

首先是在l_l2 = integer(ls_t1) 调用integer时中断，
5个F12，1个F10到CALL NEAR [EAX+10D48328]
我们现在开始记录每一次进入CALL NEAR [EAX+10D48328]
一直到if ll_l2 <> 3107 Then 这条比较语句。

第一次进入：
017F:10D01170 MOV EAX,[ESP+08] ＝＝＝＝＝＝＝＝＝》 017F:10D01170
017F:10D01174 XOR ECX,ECX 好像处理返回参数
017F:10D01176 PUSH ESI
017F:10D01177 PUSH EDI
017F:10D01178 MOV CX,[EAX+02]
017F:10D0117C MOV EAX,[ESP+14]
017F:10D01180 TEST ECX,ECX
017F:10D01182 JNG 10D0119A
017F:10D01184 MOV EDX,FFFFFFE6
017F:10D01189 MOV EDI,[EAX+010A]
017F:10D0118F ADD EDI,EDX
017F:10D01191 DEC ECX
017F:10D01192 MOV [EAX+010A],EDI
017F:10D01198 JNZ 10D01189
017F:10D0119A MOV ESI,[ESP+18]
017F:10D0119E MOV EDI,[EAX+010A]

第二次进入：
017F:10CFC0D0 MOV ECX,[ESP+08] ＝＝＝＝＝＝＝＝》 017F:10CFC0D0
017F:10CFC0D4 XOR EAX,EAX 好像处理返回参数
017F:10CFC0D6 MOV AX,[ECX+02]
017F:10CFC0DA LEA EDX,[EAX+EAX*2]
017F:10CFC0DD LEA EAX,[EAX+EDX*4]
017F:10CFC0E0 MOV EDX,[ESP+0C]
017F:10CFC0E4 SHL EAX,1
017F:10CFC0E6 MOV ECX,EAX
017F:10CFC0E8 MOV EAX,[EDX+010A]
017F:10CFC0EE SUB EAX,ECX
017F:10CFC0F0 MOV DL,[EAX+04]
017F:10CFC0F3 MOV WORD [EAX+06],02
017F:10CFC0F9 MOVSX ECX,WORD [EAX]
017F:10CFC0FC AND EDX,BYTE +01
017F:10CFC0FF MOV [EAX],ECX

第三次进入：
017F:10D09C60 PUSH EBX ＝＝＝＝＝＝＝＝＝＝＝＝》 017F:10D09C60
017F:10D09C61 PUSH ESI 好像处理返回参数
017F:10D09C62 MOV ESI,[ESP+14]
017F:10D09C66 MOV EBX,[ESP+10]
017F:10D09C6A PUSH EDI
017F:10D09C6B MOV EDX,[ESI+010A]
017F:10D09C71 ADD EDX,BYTE -1A
017F:10D09C74 MOV EAX,EDX
017F:10D09C76 MOV [ESI+010A],EDX
017F:10D09C7C CMP WORD [EBX+02],BYTE +00
017F:10D09C81 LEA ECX,[EAX-1A]
017F:10D09C84 MOV [ESI+010A],ECX
017F:10D09C8A JNA 10D09CD6
017F:10D09C8C MOV EDI,[ECX]
017F:10D09C8E MOV CL,[EAX+04]

第四次进入：
017F:10CFB8C0 MOV ECX,[ESP+08] ==============> 017F:10CFB8C0
017F:10CFB8C4 PUSH ESI
017F:10CFB8C5 MOV ESI,[ESP+10] 好像处理返回参数
017F:10CFB8C9 PUSH EDI
017F:10CFB8CA MOV EAX,[ESI+C2]
017F:10CFB8D0 MOV [ESP+14],EAX
017F:10CFB8D4 XOR EAX,EAX
017F:10CFB8D6 MOV AX,[ECX+02]
017F:10CFB8DA MOV ECX,[ESI+52]
017F:10CFB8DD CMP ECX,BYTE +03
017F:10CFB8E0 JNZ 10CFB918
017F:10CFB8E2 LEA EDX,[ESP+14]
017F:10CFB8E6 PUSH EAX
017F:10CFB8E7 PUSH EDX
017F:10CFB8E8 PUSH ESI
017F:10CFB8E9 CALL 10C329B0
017F:10CFB8EE ADD ESP,BYTE +0C

第五次进入：
017F:10CF9670 MOV ECX,[ESP+08] ==================> 017F:10CF9670
017F:10CF9674 PUSH ESI 好像准备下一条语句执行
017F:10CF9675 MOV ESI,[ESP+10]
017F:10CF9679 PUSH EDI
017F:10CF967A MOV EAX,[ESI+C2]
017F:10CF9680 MOV [ESP+14],EAX
017F:10CF9684 MOV AX,[ECX+02]
017F:10CF9688 CMP DWORD [ESI+52],BYTE +03
017F:10CF968C JNZ 10CF96C2
017F:10CF968E LEA EDX,[ESP+14]
017F:10CF9692 PUSH EAX
017F:10CF9693 PUSH EDX
017F:10CF9694 PUSH ESI
017F:10CF9695 CALL 10C329B0
017F:10CF969A ADD ESP,BYTE +0C
017F:10CF969D TEST EAX,EAX
017F:10CF969F JNZ 10CF96A4

第六次进入：
017F:10D0B130 PUSH EBX ==================> 017F:10D0B130
017F:10D0B131 PUSH EBP 执行了语句ll_l2 -= ll_l1
017F:10D0B132 PUSH ESI
017F:10D0B133 MOV ESI,[ESP+18]
017F:10D0B137 MOV EAX,[ESP+14]
017F:10D0B13B PUSH EDI
017F:10D0B13C MOV EBX,[ESI+010A]
017F:10D0B142 ADD EBX,BYTE -1A
017F:10D0B145 MOV [ESI+010A],EBX
017F:10D0B14B MOV DL,[EBX+04]
017F:10D0B14E AND EDX,BYTE +01
017F:10D0B151 CMP WORD [EAX+02],BYTE +00
017F:10D0B156 LEA EAX,[EBX-1A]
017F:10D0B159 MOV [ESP+1C],EDX
017F:10D0B15D MOV [ESI+010A],EAX

第七次进入：
017F:10CF9670 MOV ECX,[ESP+08] ==============> 017F:10CF9670
017F:10CF9674 PUSH ESI
017F:10CF9675 MOV ESI,[ESP+10] 好像准备下一条语句执行
017F:10CF9679 PUSH EDI
017F:10CF967A MOV EAX,[ESI+C2]
017F:10CF9680 MOV [ESP+14],EAX
017F:10CF9684 MOV AX,[ECX+02]
017F:10CF9688 CMP DWORD [ESI+52],BYTE +03
017F:10CF968C JNZ 10CF96C2
017F:10CF968E LEA EDX,[ESP+14]
017F:10CF9692 PUSH EAX
017F:10CF9693 PUSH EDX
017F:10CF9694 PUSH ESI
017F:10CF9695 CALL 10C329B0
017F:10CF969A ADD ESP,BYTE +0C
017F:10CF969D TEST EAX,EAX
017F:10CF969F JNZ 10CF96A4

第八次进入：
017F:10CFB7C0 MOV EAX,[ESP+08] ===================> 017F:10CFB7C0
017F:10CFB7C4 XOR ECX,ECX
017F:10CFB7C6 XOR EDX,EDX 好像现设置要比较的字符串
017F:10CFB7C8 PUSH ESI 先取出来
017F:10CFB7C9 MOV CX,[EAX+04]
017F:10CFB7CD MOV DX,[EAX+02]
017F:10CFB7D1 MOV ESI,[ESP+10]
017F:10CFB7D5 SHL ECX,10
017F:10CFB7D8 MOV EAX,[ESI+C2]
017F:10CFB7DE OR ECX,EDX
017F:10CFB7E0 PUSH ECX
017F:10CFB7E1 PUSH EAX
017F:10CFB7E2 PUSH ESI
017F:10CFB7E3 CALL `PBVM60!ob_get_const`
017F:10CFB7E8 MOV ECX,[ESI+010A]
017F:10CFB7EE MOV [ECX],EAX

第九次进入：
017F:10D05EB0 PUSH EBX ＝＝＝＝＝＝》 此段代码进行字符串比较，调用lstrcmpA
017F:10D05EB1 PUSH EBP if ls_t1 <> 'fdfggfh' Then
017F:10D05EB2 PUSH ESI 此处代码未全部拷贝。
017F:10D05EB3 MOV ESI,[ESP+18]
017F:10D05EB7 PUSH EDI
017F:10D05EB8 MOV EAX,[ESI+010A]
017F:10D05EBE LEA EBX,[EAX-1A]
017F:10D05EC1 LEA EBP,[EBX-1A]
017F:10D05EC4 MOV [ESI+010A],EBP
017F:10D05ECA TEST BYTE [EBP+04],01
017F:10D05ECE JNZ 10D05EDE
017F:10D05ED0 TEST BYTE [EBX+04],01
017F:10D05ED4 JNZ 10D05EDE
017F:10D05ED6 XOR EAX,EAX
017F:10D05ED8 MOV [ESP+1C],EAX
017F:10D05EDC JMP SHORT 10D05EEA
017F:10D05EDE MOV DWORD [ESP+1C],01

第十次进入：
017F:10D0A560 MOV EAX,[ESP+0C] =========================> 017F:10D0A560
017F:10D0A564 MOV EDX,[EAX+010A] 好像处理if then
017F:10D0A56A ADD EDX,BYTE -1A
017F:10D0A56D MOV [EAX+010A],EDX
017F:10D0A573 MOV EAX,EDX
017F:10D0A575 TEST BYTE [EAX+04],01
017F:10D0A579 JNZ 10D0A581
017F:10D0A57B CMP WORD [EAX],BYTE +00
017F:10D0A57F JNZ 10D0A592
017F:10D0A581 MOV ECX,[ESP+08]
017F:10D0A585 MOV EDX,[ESP+04]
017F:10D0A589 XOR EAX,EAX
017F:10D0A58B MOV AX,[ECX+02]
017F:10D0A58F MOV [EDX+10],EAX

第十一次进入：
017F:10CFB8C0 MOV ECX,[ESP+08] =================> 017F:10CFB8C0
017F:10CFB8C4 PUSH ESI
017F:10CFB8C5 MOV ESI,[ESP+10] 好像处理if then
017F:10CFB8C9 PUSH EDI
017F:10CFB8CA MOV EAX,[ESI+C2]
017F:10CFB8D0 MOV [ESP+14],EAX
017F:10CFB8D4 XOR EAX,EAX
017F:10CFB8D6 MOV AX,[ECX+02]
017F:10CFB8DA MOV ECX,[ESI+52]
017F:10CFB8DD CMP ECX,BYTE +03
017F:10CFB8E0 JNZ 10CFB918
017F:10CFB8E2 LEA EDX,[ESP+14]
017F:10CFB8E6 PUSH EAX
017F:10CFB8E7 PUSH EDX
017F:10CFB8E8 PUSH ESI
017F:10CFB8E9 CALL 10C329B0
017F:10CFB8EE ADD ESP,BYTE +0C

第十二次进入：
017F:10CF9670 MOV ECX,[ESP+08] ========================> 017F:10CF9670
017F:10CF9674 PUSH ESI
017F:10CF9675 MOV ESI,[ESP+10] 好像准备下一条语句执行
017F:10CF9679 PUSH EDI
017F:10CF967A MOV EAX,[ESI+C2]
017F:10CF9680 MOV [ESP+14],EAX
017F:10CF9684 MOV AX,[ECX+02]
017F:10CF9688 CMP DWORD [ESI+52],BYTE +03
017F:10CF968C JNZ 10CF96C2
017F:10CF968E LEA EDX,[ESP+14]
017F:10CF9692 PUSH EAX
017F:10CF9693 PUSH EDX
017F:10CF9694 PUSH ESI
017F:10CF9695 CALL 10C329B0
017F:10CF969A ADD ESP,BYTE +0C
017F:10CF969D TEST EAX,EAX
017F:10CF969F JNZ 10CF96A4

第十三次进入：
017F:10CFB510 MOV ECX,[ESP+08] =========================> 017F:10CFB510
017F:10CFB514 MOV EAX,[ESP+0C] 这段代码好像设置乘数 2
017F:10CFB518 PUSH ESI
017F:10CFB519 XOR ESI,ESI
017F:10CFB51B MOV SI,[ECX+04]
017F:10CFB51F XOR EDX,EDX
017F:10CFB521 MOV DX,[ECX+02]
017F:10CFB525 MOV ECX,[EAX+010A]
017F:10CFB52B SHL ESI,10
017F:10CFB52E OR EDX,ESI
017F:10CFB530 POP ESI
017F:10CFB531 MOV [ECX],EDX
017F:10CFB533 MOV EDX,[EAX+010A]
017F:10CFB539 MOV WORD [EDX+04],1D00
017F:10CFB53F MOV ECX,[EAX+010A]

第十四次进入：
017F:10D08AF0 MOV EDX,[ESP+0C] ===================> 017F:10D08AF0
017F:10D08AF4 PUSH EBX
017F:10D08AF5 PUSH ESI
017F:10D08AF6 MOV ESI,[EDX+010A]
017F:10D08AFC LEA ECX,[ESI-34]
017F:10D08AFF MOV [EDX+010A],ECX
017F:10D08B05 MOV EAX,[ESI-1A]
017F:10D08B08 IMUL EAX,[ECX] =====> 这里执行 ll_l2 * 2 EAX=2
017F:10D08B0B MOV [ECX],EAX
017F:10D08B0D MOV BL,[ECX+04]
017F:10D08B10 MOV EAX,01
017F:10D08B15 TEST AL,BL
017F:10D08B17 JNZ 10D08B22
017F:10D08B19 TEST [ESI-16],AL
017F:10D08B1C JNZ 10D08B22
017F:10D08B1E XOR ECX,ECX

第十五次进入：
017F:10D09C60 PUSH EBX ======================> 017F:10D09C60
017F:10D09C61 PUSH ESI
017F:10D09C62 MOV ESI,[ESP+14] 处理if then
017F:10D09C66 MOV EBX,[ESP+10]
017F:10D09C6A PUSH EDI
017F:10D09C6B MOV EDX,[ESI+010A]
017F:10D09C71 ADD EDX,BYTE -1A
017F:10D09C74 MOV EAX,EDX
017F:10D09C76 MOV [ESI+010A],EDX
017F:10D09C7C CMP WORD [EBX+02],BYTE +00
017F:10D09C81 LEA ECX,[EAX-1A]
017F:10D09C84 MOV [ESI+010A],ECX
017F:10D09C8A JNA 10D09CD6
017F:10D09C8C MOV EDI,[ECX]
017F:10D09C8E MOV CL,[EAX+04]

第十六次进入：
017F:10D0A540 MOV ECX,[ESP+08] =======================> 017F:10D0A540
017F:10D0A544 MOV EDX,[ESP+04] 处理if then
017F:10D0A548 XOR EAX,EAX
017F:10D0A54A MOV AX,[ECX+02]
017F:10D0A54E MOV [EDX+10],EAX
017F:10D0A551 MOV EAX,01
017F:10D0A556 RET
017F:10D0A557 NOP
017F:10D0A558 NOP
017F:10D0A559 NOP
017F:10D0A55A NOP
017F:10D0A55B NOP
017F:10D0A55C NOP
017F:10D0A55D NOP
017F:10D0A55E NOP
017F:10D0A55F NOP
017F:10D0A560 MOV EAX,[ESP+0C]
017F:10D0A564 MOV EDX,[EAX+010A]
017F:10D0A56A ADD EDX,BYTE -1A
017F:10D0A56D MOV [EAX+010A],EDX

第十七次进入：
017F:10CF9670 MOV ECX,[ESP+08] =====================> 017F:10CF9670
017F:10CF9674 PUSH ESI
017F:10CF9675 MOV ESI,[ESP+10] 好像准备下一条语句执行
017F:10CF9679 PUSH EDI
017F:10CF967A MOV EAX,[ESI+C2]
017F:10CF9680 MOV [ESP+14],EAX
017F:10CF9684 MOV AX,[ECX+02]
017F:10CF9688 CMP DWORD [ESI+52],BYTE +03
017F:10CF968C JNZ 10CF96C2
017F:10CF968E LEA EDX,[ESP+14]
017F:10CF9692 PUSH EAX
017F:10CF9693 PUSH EDX
017F:10CF9694 PUSH ESI
017F:10CF9695 CALL 10C329B0
017F:10CF969A ADD ESP,BYTE +0C
017F:10CF969D TEST EAX,EAX
017F:10CF969F JNZ 10CF96A4

第十八次进入：
017F:10CFB510 MOV ECX,[ESP+08] ========================> 017F:10CFB510
017F:10CFB514 MOV EAX,[ESP+0C]
017F:10CFB518 PUSH ESI
017F:10CFB519 XOR ESI,ESI 好像设置要比较的一个数值3107
017F:10CFB51B MOV SI,[ECX+04]
017F:10CFB51F XOR EDX,EDX
017F:10CFB521 MOV DX,[ECX+02]
017F:10CFB525 MOV ECX,[EAX+010A]
017F:10CFB52B SHL ESI,10
017F:10CFB52E OR EDX,ESI
017F:10CFB530 POP ESI
017F:10CFB531 MOV [ECX],EDX
017F:10CFB533 MOV EDX,[EAX+010A]
017F:10CFB539 MOV WORD [EDX+04],1D00
017F:10CFB53F MOV ECX,[EAX+010A]

第十九次进入：
017F:10D05C40 MOV EDX,[ESP+0C] =====================> 017F:10D05C40
017F:10D05C44 PUSH EBX 进行 if ll_l2 <> 3107 Then
017F:10D05C45 PUSH ESI
017F:10D05C46 PUSH EDI
017F:10D05C47 MOV ESI,[EDX+010A]
017F:10D05C4D XOR EBX,EBX
017F:10D05C4F LEA ECX,[ESI-34]
017F:10D05C52 MOV [EDX+010A],ECX
017F:10D05C58 MOV EDI,[ESI-1A]
017F:10D05C5B MOV EAX,[ECX]
017F:10D05C5D CMP EAX,EDI ＝＝＝＝＝＝＝》EDI处存放了3107
017F:10D05C5F MOV EAX,01 EAX是ll_l2的值。
017F:10D05C64 SETNZ BL
017F:10D05C67 MOV [ECX],BX
017F:10D05C6A MOV BL,[ECX+04]
017F:10D05C6D TEST AL,BL
017F:10D05C6F JNZ 10D05C7A

OK，现在我们总结一下：

XXXX：10C8F62D CALL NEAR [EAX+10D48328]
该处是PBVM60解释入口处，可以直接在次设定断点。
此处地址10C8F62D 是不变的。

一般算法代码：（除法还进一步研究）

减法：
017F:10D0B1F6 MOV ECX,[EAX]
017F:10D0B1F8 MOV AX,[ECX+04]
017F:10D0B1FC MOV ESI,EAX
017F:10D0B1FE AND EAX,FFFE
017F:10D0B203 AND ESI,BYTE +01
017F:10D0B206 OR EDX,ESI
017F:10D0B208 OR EAX,EDX
017F:10D0B20A MOV [ECX+04],AX
017F:10D0B20E MOV EDX,[EBX]
017F:10D0B210 SUB [ECX],EDX ＝＝＝＝＝＝＝＝＝＝＝》 EDX 处存放减数
017F:10D0B212 POP EDI
017F:10D0B213 POP ESI
017F:10D0B214 POP EBP
017F:10D0B215 MOV EAX,01
017F:10D0B21A POP EBX
017F:10D0B21B RET

加法：
017F:10D08310 MOV EDX,[ESP+0C]
017F:10D08314 PUSH EBX
017F:10D08315 PUSH ESI
017F:10D08316 MOV ESI,[EDX+010A]
017F:10D0831C LEA ECX,[ESI-34]
017F:10D0831F MOV [EDX+010A],ECX
017F:10D08325 MOV EAX,[ESI-1A]
017F:10D08328 ADD EAX,[ECX] ＝＝＝＝＝＝＝＝＝＝》 EAX 为加数
017F:10D0832A MOV [ECX],EAX
017F:10D0832C MOV BL,[ECX+04]
017F:10D0832F MOV EAX,01
017F:10D08334 TEST AL,BL
017F:10D08336 JNZ 10D08341
017F:10D08338 TEST [ESI-16],AL
017F:10D0833B JNZ 10D08341
017F:10D0833D XOR ECX,ECX
017F:10D0833F JMP SHORT 10D08343
017F:10D08341 MOV ECX,EAX
017F:10D08343 MOV ESI,[EDX+010A]
017F:10D08349 OR CH,1D
017F:10D0834C MOV [ESI+04],CX
017F:10D08350 MOV ECX,[EDX+010A]
017F:10D08356 POP ESI
017F:10D08357 POP EBX
017F:10D08358 MOV WORD [ECX+06],02
017F:10D0835E MOV ECX,[EDX+010A]

乘法：
017F:10D08AF0 MOV EDX,[ESP+0C]
017F:10D08AF4 PUSH EBX
017F:10D08AF5 PUSH ESI
017F:10D08AF6 MOV ESI,[EDX+010A]
017F:10D08AFC LEA ECX,[ESI-34]
017F:10D08AFF MOV [EDX+010A],ECX
017F:10D08B05 MOV EAX,[ESI-1A]
017F:10D08B08 IMUL EAX,[ECX] ＝＝＝＝＝＝＝＝＝》 EAX 乘数
017F:10D08B0B MOV [ECX],EAX
017F:10D08B0D MOV BL,[ECX+04]
017F:10D08B10 MOV EAX,01
017F:10D08B15 TEST AL,BL
017F:10D08B17 JNZ 10D08B22
017F:10D08B19 TEST [ESI-16],AL
017F:10D08B1C JNZ 10D08B22
017F:10D08B1E XOR ECX,ECX
017F:10D08B20 JMP SHORT 10D08B24
017F:10D08B22 MOV ECX,EAX
017F:10D08B24 MOV ESI,[EDX+010A]
017F:10D08B2A OR CH,1D
017F:10D08B2D MOV [ESI+04],CX
017F:10D08B31 MOV ECX,[EDX+010A]
017F:10D08B37 POP ESI
017F:10D08B38 POP EBX
017F:10D08B39 MOV WORD [ECX+06],02
017F:10D08B3F MOV ECX,[EDX+010A]

字符串比较：
017F:10D05EEE PUSH EBP
017F:10D05EEF PUSH ESI
017F:10D05EF0 CALL `PBVM60!ot_get_valptr`
017F:10D05EF5 PUSH EBX
017F:10D05EF6 PUSH ESI
017F:10D05EF7 MOV EDI,EAX
017F:10D05EF9 CALL `PBVM60!ot_get_valptr`
017F:10D05EFE PUSH EAX
017F:10D05EFF PUSH EDI
017F:10D05F00 CALL `KERNEL32!lstrcmpA` ＝＝＝＝＝＝＝＝＝》EAX 和 EDI 存放的
017F:10D05F06 MOV EDI,EAX 字符串比较
017F:10D05F08 MOV EAX,[ESP+1C]
017F:10D05F0C NEG EDI
017F:10D05F0E SBB EDI,EDI
017F:10D05F10 NEG EDI ＝＝＝＝＝＝＝＝》 OK则EDI 为 0，否则 1
017F:10D05F12 JMP SHORT 10D05F18
017F:10D05F14 MOV EDI,[ESP+18]
017F:10D05F18 MOV ECX,[ESP+18]
017F:10D05F1C CMP WORD [ECX+02],BYTE +00
017F:10D05F21 JZ 10D05F2E
017F:10D05F23 PUSH EBX
017F:10D05F24 PUSH ESI
017F:10D05F25 CALL `PBVM60!ot_free_val_ptr`
017F:10D05F2A MOV EAX,[ESP+1C]
017F:10D05F2E MOV EDX,[ESP+18]
017F:10D05F32 CMP WORD [EDX+04],BYTE +00
017F:10D05F37 JZ 10D05F44
017F:10D05F39 PUSH EBP
017F:10D05F3A PUSH ESI
017F:10D05F3B CALL `PBVM60!ot_free_val_ptr`

数值比较：
017F:10D05C58 MOV EDI,[ESI-1A]
017F:10D05C5B MOV EAX,[ECX]
017F:10D05C5D CMP EAX,EDI ＝＝＝＝＝＝＝＝＝》 执行比较，EDI 比较数
017F:10D05C5F MOV EAX,01
017F:10D05C64 SETNZ BL
017F:10D05C67 MOV [ECX],BX
017F:10D05C6A MOV BL,[ECX+04]
017F:10D05C6D TEST AL,BL
017F:10D05C6F JNZ 10D05C7A
017F:10D05C71 TEST [ESI-16],AL
017F:10D05C74 JNZ 10D05C7A
017F:10D05C76 XOR ECX,ECX
017F:10D05C78 JMP SHORT 10D05C7C
017F:10D05C7A MOV ECX,EAX
017F:10D05C7C MOV ESI,[EDX+010A]
017F:10D05C82 OR CH,05
017F:10D05C85 POP EDI
017F:10D05C86 MOV [ESI+04],CX
017F:10D05C8A MOV ECX,[EDX+010A]
017F:10D05C90 POP ESI
017F:10D05C91 POP EBX
017F:10D05C92 MOV WORD [ECX+06],07
017F:10D05C98 MOV ECX,[EDX+010A]
017F:10D05C9E ADD ECX,BYTE +1A
017F:10D05CA1 MOV [EDX+010A],ECX
017F:10D05CA7 RET

PB7.0基本上与PB6.5相同，只不过入口不同而已，它的解释入口是：
XXXX：1135BEEE CALL NEAR [EAX+11450E28]，
即入口地址是XXXX:1135BEEE


Abakus 2.01

标 题:一个delphi控件的破解 (12千字)
发信人:1212
时 间:2001-3-31 17:21:30
详细信息:
Abakus是一套Delphi的工控控件，很好的。可惜搞不到源码。
从下面这个地方可以下载到2.01版，没有源码。

URL:http://www.torry.net/vcl/indicat/packs/abkda.zip
大小: 1159615

表现症状：当你放一个控件到你的Form，会有一个information的对话框出现；当你编译好一个程序，
在delphi没有运行的情况下，会有一个Error的对话框出现。

破解工具：Dede250，Ultraedit。
作者：sxlz

1。分析：看看所有的DCU文件，有没有可疑的地方，发现一个_abinfo.dcu，好像有问题！先拿它试试，
如果不成的话，最看别的。
2。运行Dede.exe，选取DCU Dumper，把_abinfo.dcu给Dumpe一下。
3。发现：

uses
_PrjInfo {
A:pName, A:pVersion, A:Copyright, A:Mail, A:WWW},
_AbProc {
A:AbDelphiIsRunning},
IniFiles,

里有AbDelphiIsRunning，哈哈，继续查AbDelphiIsRunning，又发现：
procedure TAbInfo.nagTimerEvent (Self: TAbInfo; sender: System.TObject);
begin
00000000 : 55 PUSH EBP
00000001 : 8B EC MOV EBP,ESP
00000003 : 6A 00 PUSH $00
00000005 : 6A 00 PUSH $00
00000007 : 53 PUSH EBX
00000008 : 8B D8 MOV EBX,EAX
0000000A : 33 C0 XOR EAX,EAX
0000000C : 55 PUSH EBP
0000000D : 68(50 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000150
00000012 : 64 FF 30 PUSH DWORD PTR FS:[EAX]
00000015 : 64 89 20 MOV DWORD PTR FS:[EAX],ESP
00000018 : A1(00 00 00 00 MOV EAX,DWORD PTR [AbInfo{0x44}]
0000001D : 8B 40 1C MOV EAX,DWORD PTR [EAX+28]
00000020 : 33 D2 XOR EDX,EDX
00000022 : E8(00 00 00 00 CALL TTimer.SetEnabled{0x10}
00000027 : A1(00 00 00 00 MOV EAX,DWORD PTR [pName{0x2}]
0000002C : FF 30 PUSH DWORD PTR [EAX]
0000002E : 68(64 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000164
00000033 : A1(00 00 00 00 MOV EAX,DWORD PTR [pVersion{0x3}]
00000038 : FF 30 PUSH DWORD PTR [EAX]
0000003A : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
0000003F : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
00000044 : 68(7C 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$0000017C
00000049 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
0000004E : 68(C4 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$000001C4
00000053 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
00000058 : 68(0C 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$0000020C
0000005D : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
00000062 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
00000067 : 68(40 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000240
0000006C : A1(00 00 00 00 MOV EAX,DWORD PTR [Mail{0x5}]
00000071 : FF 30 PUSH DWORD PTR [EAX]
00000073 : 68(54 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000254
00000078 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
0000007D : A1(00 00 00 00 MOV EAX,DWORD PTR [WWW{0x6}]
00000082 : FF 30 PUSH DWORD PTR [EAX]
00000084 : 68(68 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000268
00000089 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
0000008E : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
00000093 : A1(00 00 00 00 MOV EAX,DWORD PTR [Copyright{0x4}]
00000098 : FF 30 PUSH DWORD PTR [EAX]
0000009A : 8D 45 FC LEA EAX,DWORD PTR [EBP-4]
0000009D : BA 15 00 00 00 MOV EDX,$00000015
000000A2 : E8(00 00 00 00 CALL @LStrCatN{0x3B}
000000A7 : 68(88 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000288
000000AC : FF 73 04 PUSH DWORD PTR [EBX+4]
000000AF : 68(B4 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$000002B4
000000B4 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
000000B9 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
000000BE : 68(40 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000240
000000C3 : A1(00 00 00 00 MOV EAX,DWORD PTR [Mail{0x5}]
000000C8 : FF 30 PUSH DWORD PTR [EAX]
000000CA : 68(54 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000254
000000CF : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
000000D4 : A1(00 00 00 00 MOV EAX,DWORD PTR [WWW{0x6}]
000000D9 : FF 30 PUSH DWORD PTR [EAX]
000000DB : 68(68 02 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000268
000000E0 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
000000E5 : 68(70 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000170
000000EA : A1(00 00 00 00 MOV EAX,DWORD PTR [Copyright{0x4}]
000000EF : FF 30 PUSH DWORD PTR [EAX]
000000F1 : 8D 45 F8 LEA EAX,DWORD PTR [EBP-8]
000000F4 : BA 0E 00 00 00 MOV EDX,$0000000E
000000F9 : E8(00 00 00 00 CALL @LStrCatN{0x3B}
000000FE : E8(00 00 00 00 CALL AbDelphiIsRunning{0x8} --------------------检查delphi有没有运行
00000103 : 66 85 C0 TEST AX,AX
00000106 : 74 15 JE +21; (0x11D) --------------------跳过去的话可以看到有halt0，凭直觉就不好，那就不跳好了。
00000108 : 6A 00 PUSH $00
0000010A : 66 8B 0D(C4 02 00 00 MOV CX,WORD PTR [TAbInfo.nagTimerEvent{0x4C}+$000002C4]
00000111 : B2 02 MOV DL,$02
00000113 : 8B 45 FC MOV EAX,DWORD PTR [EBP-4]
00000116 : E8(00 00 00 00 CALL MessageDlg{0x12}
0000011B : EB 18 JMP +24; (0x135)
0000011D : 6A 00 PUSH $00
0000011F : 66 8B 0D(C4 02 00 00 MOV CX,WORD PTR [TAbInfo.nagTimerEvent{0x4C}+$000002C4]
00000126 : B2 01 MOV DL,$01
00000128 : 8B 45 F8 MOV EAX,DWORD PTR [EBP-8]
0000012B : E8(00 00 00 00 CALL MessageDlg{0x12}
00000130 : E8(00 00 00 00 CALL @Halt0{0x3A}
00000135 : 33 C0 XOR EAX,EAX
00000137 : 5A POP EDX
00000138 : 59 POP ECX
00000139 : 59 POP ECX
0000013A : 64 89 10 MOV DWORD PTR FS:[EAX],EDX
0000013D : 68(57 01 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}+$00000157
00000142 : 8D 45 F8 LEA EAX,DWORD PTR [EBP-8]
00000145 : BA 02 00 00 00 MOV EDX,$00000002
0000014A : E8(00 00 00 00 CALL @LStrArrayClr{0x3C}
0000014F : C3 RET NEAR
00000150 : E9(00 00 00 00 JMP @HandleFinally{0x3D}
00000155 : EB EB JMP -21; (0x142)
00000157 : 5B POP EBX
00000158 : 59 POP ECX
00000159 : 59 POP ECX
0000015A : 5D POP EBP
0000015B : C3 RET NEAR

这个可以消除information的对话框。

4。查前面有函数：

var
AbInfo:TAbInfo;

const
Reg:System.AnsiString = raw[$0..$3]at $157
0: ....{08 00 00 00|K5 Reg{0x45}, K1 _NF_46;

function LoadAbakusInfo: TAbInfo;

那就找LoadAbakusInfo，发现：
function LoadAbakusInfo: TAbInfo;
begin
00000000 : 53 PUSH EBX
00000001 : 56 PUSH ESI
00000002 : BB(00 00 00 00 MOV EBX,AbInfo{0x44}---------这一行带(的是动态地址
00000007 : 83 3B 00 CMP DWORD PTR [EBX],0--------这个改成1，跳过去就妥了！
0000000A : 0F 85 B2 00 00 00 JNE +178; (0xC2)
00000010 : B2 01 MOV DL,$01
00000012 : A1(00 00 00 00 MOV EAX,DWORD PTR [TAbInfo{0x42}]
00000017 : E8(00 00 00 00 CALL TAbInfo.Create{0x49}
0000001C : 89 03 MOV DWORD PTR [EBX],EAX
0000001E : 8B 03 MOV EAX,DWORD PTR [EBX]
00000020 : FF 40 18 INC DWORD PTR [EAX+24]
00000023 : 8B 0D(00 00 00 00 MOV ECX,DWORD PTR [Application{0x19}]
00000029 : 8B 09 MOV ECX,DWORD PTR [ECX]
0000002B : B2 01 MOV DL,$01
0000002D : A1(00 00 00 00 MOV EAX,DWORD PTR [TTimer{0xC}]
00000032 : E8(00 00 00 00 CALL TTimer.Create{0xD}
00000037 : 8B F0 MOV ESI,EAX
00000039 : 8B 03 MOV EAX,DWORD PTR [EBX]
0000003B : 89 70 1C MOV DWORD PTR [EAX+28],ESI
0000003E : 8B C6 MOV EAX,ESI
00000040 : BA F4 01 00 00 MOV EDX,$000001F4
00000045 : E8(00 00 00 00 CALL TTimer.SetInterval{0xE}
0000004A : 8B 03 MOV EAX,DWORD PTR [EBX]
0000004C : 50 PUSH EAX
0000004D : 68(00 00 00 00 PUSH TAbInfo.nagTimerEvent{0x4C}
00000052 : 8B 03 MOV EAX,DWORD PTR [EBX]
00000054 : 8B 40 1C MOV EAX,DWORD PTR [EAX+28]
00000057 : E8(00 00 00 00 CALL TTimer.SetOnTimer{0xF}
0000005C : 8B 03 MOV EAX,DWORD PTR [EBX]
0000005E : 8B 40 1C MOV EAX,DWORD PTR [EAX+28]
00000061 : B2 01 MOV DL,$01
00000063 : E8(00 00 00 00 CALL TTimer.SetEnabled{0x10}
00000068 : 8B 03 MOV EAX,DWORD PTR [EBX]
0000006A : 83 C0 04 ADD EAX,4
0000006D : 8B 15(00 00 00 00 MOV EDX,DWORD PTR [pName{0x2}]
00000073 : 8B 12 MOV EDX,DWORD PTR [EDX]
00000075 : E8(00 00 00 00 CALL @LStrAsg{0x35}
0000007A : 8B 03 MOV EAX,DWORD PTR [EBX]
0000007C : 83 C0 08 ADD EAX,8
0000007F : 8B 15(00 00 00 00 MOV EDX,DWORD PTR [pVersion{0x3}]
00000085 : 8B 12 MOV EDX,DWORD PTR [EDX]
00000087 : E8(00 00 00 00 CALL @LStrAsg{0x35}
0000008C : 8B 03 MOV EAX,DWORD PTR [EBX]
0000008E : 83 C0 0C ADD EAX,12
00000091 : 8B 15(00 00 00 00 MOV EDX,DWORD PTR [Copyright{0x4}]
00000097 : 8B 12 MOV EDX,DWORD PTR [EDX]
00000099 : E8(00 00 00 00 CALL @LStrAsg{0x35}
0000009E : 8B 03 MOV EAX,DWORD PTR [EBX]
000000A0 : 83 C0 10 ADD EAX,16
000000A3 : 8B 15(00 00 00 00 MOV EDX,DWORD PTR [Mail{0x5}]
000000A9 : 8B 12 MOV EDX,DWORD PTR [EDX]
000000AB : E8(00 00 00 00 CALL @LStrAsg{0x35}
000000B0 : 8B 03 MOV EAX,DWORD PTR [EBX]
000000B2 : 83 C0 14 ADD EAX,20
000000B5 : 8B 15(00 00 00 00 MOV EDX,DWORD PTR [WWW{0x6}]
000000BB : 8B 12 MOV EDX,DWORD PTR [EDX]
000000BD : E8(00 00 00 00 CALL @LStrAsg{0x35}
000000C2 : 8B 03 MOV EAX,DWORD PTR [EBX]
000000C4 : 5E POP ESI
000000C5 : 5B POP EBX
000000C6 : C3 RET NEAR
end;

这个可以解决Error对话框的问题。

5。改完后，打开AbakusD5.dpk重新编译一下，重新安装。
6。要是有源码的话还是源码的好，谁有的话发给我testdog@sina.com非常感谢。
7。第一次写得不好，请原谅。


Bestofware SmartUI Activex

标 题:如何破解Bestofware SmartUI Activex 所有版本。（过程） (5千字)
发信人:品琳居
时 间:2000-12-31 12:41:21
详细信息:
如何破解Bestofware SmartUI Activex 所有版本。
============ 警告================

破解后的控件不能用于商业用途。

==================================

下载地址：www.bestofware.com 大小：2MB
功能：一个可以实现OFFICE 2000所有界面的控件，使用方法极其简单。
VB的程序员可以从该控件中看到希望，不是VB不行，而是我们的水平不
高而已。加油啊，中国的程序员！

难度：容易 用时： ≤ 5 分钟
限制：对话框、延时、过期、无法发布
所用工具： W32Dasm 8.93,UltraEdit32 8.0
在C700,128M windows 98 SE 下测试通过。

用W32Dasm 将SmartUI.ocx 反汇编，在 String 中凭感觉轻易发现
"DDemo version limitation"、"DDemoScreen" ，肯定是这两个家伙有问题。

* Reference To: MSVBVM60.__vbaChkstk, Ord:0000h
|
:1103EE78 E893A3FCFF Call 11009210
:1103EE7D 8BC4 mov eax, esp
:1103EE7F 8B8D68FFFFFF mov ecx, dword ptr [ebp+FFFFFF68]
:1103EE85 8908 mov dword ptr [eax], ecx
:1103EE87 8B956CFFFFFF mov edx, dword ptr [ebp+FFFFFF6C]
:1103EE8D 895004 mov dword ptr [eax+04], edx
:1103EE90 8B8D70FFFFFF mov ecx, dword ptr [ebp+FFFFFF70]
:1103EE96 894808 mov dword ptr [eax+08], ecx
:1103EE99 8B9574FFFFFF mov edx, dword ptr [ebp+FFFFFF74]
:1103EE9F 89500C mov dword ptr [eax+0C], edx
:1103EEA2 6A01 push 00000001
============================= 只要系统日期一改变立即调出对话框、延时
* Possible StringData Ref from Code Obj ->"DDemoScreen"
|
:1103EEA4 682C240111 push 1101242C
:1103EEA9 8B45D0 mov eax, dword ptr [ebp-30]
:1103EEAC 50 push eax

* Reference To: MSVBVM60.__vbaLateMemCall, Ord:0000h
|
:1103EEAD FF15A8120011 Call dword ptr [110012A8]
:1103EEB3 83C41C add esp, 0000001C
:1103EEB6 C745FC24000000 mov [ebp-04], 00000024
:1103EEBD 6A00 push 00000000
:1103EEBF 8D4DD0 lea ecx, dword ptr [ebp-30]
:1103EEC2 51 push ecx

* Reference To: MSVBVM60.__vbaObjSetAddref, Ord:0000h
|
:1103EEC3 FF15E4100011 Call dword ptr [110010E4]
:1103EEC9 C745FC25000000 mov [ebp-04], 00000025
:1103EED0 8B9508FFFFFF mov edx, dword ptr [ebp+FFFFFF08]
:1103EED6 0FBF8290800911 movsx eax, word ptr [edx+11098090]
:1103EEDD 85C0 test eax, eax
:1103EEDF 0F85D1000000 jne 1103EFB6
----> 检较是否过期,过期警告，无法使用。
:1103EEE5 C745FC26000000 mov [ebp-04], 00000026
:1103EEEC C7458004000280 mov [ebp-80], 80020004
:1103EEF3 C78578FFFFFF0A000000 mov dword ptr [ebp+FFFFFF78], 0000000A
:1103EEFD C7459004000280 mov [ebp-70], 80020004
:1103EF04 C745880A000000 mov [ebp-78], 0000000A

* Possible StringData Ref from Code Obj ->"DDemo version limitation"
|
:1103EF0B C78560FFFFFFA8240111 mov dword ptr [ebp+FFFFFF60], 110124A8
:1103EF15 C78558FFFFFF08000000 mov dword ptr [ebp+FFFFFF58], 00000008
:1103EF1F 8D9558FFFFFF lea edx, dword ptr [ebp+FFFFFF58]
:1103EF25 8D4D98 lea ecx, dword ptr [ebp-68]

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:1103EF28 FF15B8120011 Call dword ptr [110012B8]

* Possible StringData Ref from Code Obj ->"TThis version of SmartUI can't "
->"be distributed."
|
:1103EF2E C78570FFFFFF48240111 mov dword ptr [ebp+FFFFFF70], 11012448
:1103EF38 C78568FFFFFF08000000 mov dword ptr [ebp+FFFFFF68], 00000008
:1103EF42 8D9568FFFFFF lea edx, dword ptr [ebp+FFFFFF68]
:1103EF48 8D4DA8 lea ecx, dword ptr [ebp-58]

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h

最简单破解方法：用UltraEdit32 打开 SMARTUI.OCX
查找 85C00F85D1000000 改为
~~
84 -> 时间检测

查找 89500C6A01 -> 去掉 Nag Screen 和延时
~~
00

该方法适用于 SmartUI ActiveX Trial 所有版本。
有没有其它破解的办法？有！不过改动的东西还多一点，我第一次破SmartUI就用
另外一种方法，有兴趣的朋友可以研究一下，有不明白的地方可以发“妹儿”给
我。破过的东西很多很多，可写过程还是第一次，有点不伦不类，不好意思。这也
是我为什么老是破解而不写过程的原因，见谅！

看过以上过程的朋友可以找JanusGridEX 2000 ActiveX 来尝试一下，去年很多人叫
我破过（同样是VB写的），破解我也在我的主页公布过。破解方法大同小异，多出一
道检测而已。哦，忘了，她还用Shrink 加过壳，要先脱壳，不过还是很容易嘛。

Happy New Year!

Aming
2000.12.31

欢迎光临品琳居！


BUPack Package

 标 题:初学者的东西：BUPack Package控件注册提示窗口消除 (1千字)
发信人:Passion
时 间:2000-12-26 21:02:58
详细信息:
BUPack Package控件注册提示窗口消除法。

BUYPIN系列套装控件BUPack Package是Delphi下的需要莫名其妙地注册的优秀控件组之一，凡是使用了它的程序在运行时都会检测是否是设计期还是运行期，方法就是通过FindWindowA函数查找Delphi中的对象观察器窗口的类名"TPropertyInspector"，根据返回的值判断是否存在此窗口，进而判断是否处于设计环境下。如果不是，则弹出提示注册对话框。

程序中对应的代码如下：

:00473004 6A00 push 00000000
:00473006 6818304700 push 00473018

;这里00473018处是字符串"TPropertyInspector"的地址。

:0047300B E85C36F9FF Call 0040666C

;调用Findwindow函数。

:00473010 85C0 test eax, eax
:00473012 0F95C0 setne al

;如果EAX为0则将AL设置为0。如EAX非0则表示找到了"TPropertyInspector"窗口，
接下来的SETNE AL会使AL变为1，表示处于设计期，不出现注册提示框。

:00473015 C3 ret

因此好办，将setne al改成mov al,1就是了。不过后边还得加一个NOP

总结：
查找并修改以下十六进制字符串便可消除提示框：
85 C0 0F 95 C0 C3
-->
.. .. B0 01 90 ..

——当然，解除BUPack Package控件提示框的方法还有很多，但这个算比较保险的，只需要修改一条指令，而且似乎还比较通用，不像其他修改特定地址的CALL指令或JNZ指令的方法，倘若换一个程序，没准就失效了。

————————————————————————

咱是Crack的初学者，toye兄的教学文章让我入了门，在此表示感谢。另外问一句，整理后的教学什么时候提供CHM格式的下载啊？许多文章我没下载完整，想来个“打包”。


Dialog-Medien MP3Play

 标 题:Dialog-Medien MP3Play OCX的破解
发信人:superboss
时 间:2000-11-21 15:20:57
详细信息:
Dialog-Medien MP3Play OCX的破解
版本：1.4
工具：TRW2000和ActiveX Control Test Container
目标说明：一个专为MPEG Audio layer 3格式文件解码的软件，
能够产生高品质高压缩率的文件,未注册版本只能播放30秒!
难度：低级?
下载地址：一般的VB站点都会提供此控件的下载！
补充说明:此控件并不是用LIC文件或直接输入注册信息来注册的,而是调用控件内部函数
Authorize("Name","RegCode")来注册的。若返回的值等于-5，则注册失败；
若返回的值等于0，则注册成功！为了破解此控件,要用到MicroSoft出品的
Visual C++ 5.0或6.0中附带的控件调试工具ActiveX Control Test Container。
=====================================================================================
(1) 运行ActiveX Control Test Container后,在"Edit"菜单项中选择"Insert OLE Control...",
在控件列表中,选择"Dialog-Medien Mp3Play Control";然后,在"Edit"菜单项中选择"Invoke
Methods",选择"Authorize",输入Name:"sUpErbOss",Password:"1122334455"。
按Ctrl-D切换到TRW2000下,打入BPX HMEMCPY设段。
按F5键回到Windows下,点击"Invoke"按钮
被TRW2000拦下后,将中断Disable,下BD *指令。

(2) 现在正处于系统的领空, 所以,按几下F12键或打入PModule,快速返回到程序模组下。
然后,再下BPX WideCharToMultiByte设段。
再按F5继续运行,每次被拦下后,注意下D ESP+C指令,
在数据框中会看到如下的数据型式: (注:假设ESP+C=0066EE24)
****:0066EE24 28 77 44 00 00 00 00 00 ......
再打入D 447728又会看到如下的数据型式:
****:00447728 73 00 55 00 70 00 45 00 72 00 62 00 4F 00 73 00 ......
| | | | | | | |
s U p E r b O s
照以上步骤多做几次,数据框中会出现如下的数据型式:
****:******** 2D 00 35 00 00 00 ......
| |
- 5
根据MP3Play OCX的帮助文件所述,当Authorize("Name","Password")的返回值为-5时,
表示注册不成功;返回值为0时,表示注册成功。

(3) 按两次F12键跳出CALL,慢慢往上看，会看到如下的语句：

****:******** MOV EBX,[ESP+08] <---在此处按F9键设段!!
****:******** PUSH ESI
****:******** PUSH EDI
****:******** TEST EBX,EBX
****:******** MOV ESI,ECX
****:******** JNZ 5E45A819
.
.
若在断点的下一条指令处,下D EBX指令,则知[EBX]="-5"
再下BPM EBX指令设段,重新执行注册步骤,按F5键几次后,会在下面被拦下:

****:10007C75 CMP BYTE PTR [EAX], 00 ---> [EAX]="sUpErbOss"
****:10007C78 JE 10007DC8
****:10007C7E MOV EBX, DWORD PTR [ESP+60]
****:10007C82 TEST EBX, EBX
****:10007C84 JE 10007DC8
****:10007C8A CMP BYTE PTR [EBX], 00 ---> [EBX]="1122334455"
****:10007C8D JE 10007DC8
.
.
.
****:10007D2D XOR EDX, EDX
****:10007D2F MOV ECX, 66D81CC3
****:10007D34 DIV ECX
****:10007D36 CMP EDX, DWORD PTR [ESP+60] --->[ESP+60]="42E576F7",EDX="4ED6ED8E"
****:10007D3A SETE AL
****:10007D3D TEST AL, AL
****:10007D3F JE 10007DC8
注意:"42E576F7"好像很熟悉,哦!这不就是"1122334455"的十六进制形式吗!那EDX的值的十进制
形式"1322708366"不就是正确的注册号吗?

(4) 下BD * 指令,重新输入Name:"sUpErbOss",Password:"1322708366"。
点击"Invoke"按钮后,在ReturnedI2栏中,会显示返回值为"0"。
搞定！


EasyTable

标 题:Delphi控件EasyTable的去除NagScreen (4千字)
发信人:henryw
时 间:2001-3-16 6:51:36
详细信息:
Delphi控件EasyTable的去除NagScreen

[控件介绍]
BDE作为数据库引擎似乎太笨重了一些，所以现在出了很多替代它的工具，EasyTable是其中的一个。
它有自己的特点，比如数据库可以压缩，可以数据加密，当然，功能还是不够完善，但是对于小程
序来说已经足够用了。

下载地址：
http://www.aidaim.com/cgi-bin/download.cgi?url=http://www.aidaim.com/download/tetfred5.zip

[使用工具]
Win32Dasm
DCUExplorer
DeDe
HEdit

[过程介绍]
首先安装好这个控件，然后打开自带的Demo进行编译。在Delphi运行时候启动Demo，没有Nagscreen。
关闭Delphi，运行Demo，NagScreen出来了。

Win32Dasm上场，反编译后查找NagScreen里面显示的字串：This is....，没有！Easy Table Free，
还是没有！这下有些麻烦了。使用DeDe反编译，发现有TAboutBox项，好吧，就从这里入手。

先在控件安装目录下查找字串："Easy Table Free"和"This is blah blah blah"，在两个DCU文件中
找到：AboutBox.dcu、EasyTable.dcu。显然，对于程序而言，EasyTable里面会调用AboutBox，所以注意
力集中在EasyTable里面。使用DCUExplorer对EasyTable.dcu进行反汇编，查找第一个AboutScreen，所见
如下：

{ 19F: u? |75 BA | }
JNE @@015B; (0x15B) { OpCode : 03 }
{ 1A1: �}? |80 7D F7 00 | }
@@01A1 : CMP BYTE PTR [EBP-9],$00 { OpCode : 38 }
{ 1A5: u~ |75 7E | }
JNE @@0225; (0x225) { OpCode : 03 }
{ 1A7: ?.... |8B 0D(00 00 00 00 | }
MOV ECX,DWORD PTR [AboutScreen {0x4}] { OpCode : 87 }
{ 1AD: ?... |A1(00 00 00 00 | }
MOV EAX,DWORD PTR [Application {0x62}] { OpCode : 87 }

有些过分乱了。虽然我看不太明白，不过可以试试看，假设AboutScreen是那个Nagscreen，那么看看编译后
的Demo第一次是如何调用AboutScreen的呢？好了，使用Hex编辑器查找Demo主程序里的
75 BA 80 7D F7 00 75 7E 8B 0D，只能找到一处，看来不错。

然后记下此处的offset，到Win32Dasm反编译出来的文件中去找，会看见如下代码：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049D2C7(C)
|
:0049D2CF 46 inc esi
:0049D2D0 FF4DF0 dec [ebp-10]
:0049D2D3 75BA jne 0049D28F <---------------

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0049D287(C), :0049D2CD(U)
|
:0049D2D5 807DF700 cmp byte ptr [ebp-09], 00 <-----------------
:0049D2D9 757E jne 0049D359 <---------------
:0049D2DB 8B0DC0224B00 mov ecx, dword ptr [004B22C0]
:0049D2E1 A1B0214B00 mov eax, dword ptr [004B21B0]
:0049D2E6 8B00 mov eax, dword ptr [eax]

往上看，代码如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049D2D3(C)
|
:0049D28F 8D4DEC lea ecx, dword ptr [ebp-14]
:0049D292 8BD6 mov edx, esi
:0049D294 8B45F8 mov eax, dword ptr [ebp-08]
:0049D297 8B38 mov edi, dword ptr [eax]
:0049D299 FF570C call [edi+0C]
:0049D29C 8B55EC mov edx, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Delphi"
|
:0049D29F B8ECD34900 mov eax, 0049D3EC
:0049D2A4 E8A36EF6FF call 0040414C
:0049D2A9 48 dec eax <---------------- @@
:0049D2AA 741D je 0049D2C9 <---------------- @@
:0049D2AC 8D4DE8 lea ecx, dword ptr [ebp-18] <-- @@
:0049D2AF 8BD6 mov edx, esi
:0049D2B1 8B45F8 mov eax, dword ptr [ebp-08]
:0049D2B4 8B38 mov edi, dword ptr [eax]
:0049D2B6 FF570C call [edi+0C]
:0049D2B9 8B55E8 mov edx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"C++Builder"
|
:0049D2BC B8FCD34900 mov eax, 0049D3FC
:0049D2C1 E8866EF6FF call 0040414C
:0049D2C6 48 dec eax
:0049D2C7 7506 jne 0049D2CF

到了这里就有些明白了，它似乎在寻找Delphi或者C++Builder是否已经启动，没有的话就跳
对话框。在Dasm里面load Demo程序，断点设在0049D2AA处，发现此处不跳转。

试着在0049D2AA处改为jmp 0049D2C9，再运行程序，没有NagScreen了。

最后一步，将EasyTable.dcu和tet_pack.bpl(安装控件的时候自己将新建包命名为tet_pack.dpk)
用Hex编辑器打开，找@@处的机器码，然后将741D改为EB1D。重新运行Delphi，编译Demo程序，
关闭Delphi，运行Demo程序，没有了NagScreen。为了保险起见，由于我的硬盘是两个C盘，在
另外一个干净的Win98中试用，结果还是没有NagScreen出现，看来可以收工了。


SDL suite 5.5

标 题:SDL suite 5.5 (11千字)
发信人:1212
时 间:2001-4-2 16:11:21
详细信息:
SDL控件组也是不错的，可以做化学分子结构图；信号FFT分析；画科学工程图等等。
和ABAKUS一样，其源码难以得到，极其困难！！！
有谁有的话请发送到testdog@sina.com谢谢。

这次是SDL Suite 5.5。
表现症状：编译生成的程序也要在Delphi正在运行的情况下才会运行，不然的话会弹出对话框，
按OK后有两种表现，一种是直接退出；一种是运行程序但在它的控件上显示一串文字。
但是不管delphi是不是运行，程序运行时鼠标放在它的控件上都会有hint，
无论你在编程的时候有没有关掉showhint属性，它都要显示！
从CJ那儿下载回来的有一个crack，但是并没有破掉hint。

工具：Dede250,UltraEdit。
作者：renamed to jkl

这次所有的DCU文件都要用Dede250的DCU Dumper去Dumpe一下，不像Abakus201只在一个文件中。
步骤是一样的，以rchart.dcu为例。

1。把dumpe得到的文本文件用Ultraedit打开，凭感觉先查run,delphi,running啥的，哈哈，果然！

function DelphiIsRunning: System.Boolean;
var
Result: System.Boolean;
H0: WinProcs.HWND;
H1: WinProcs.HWND;
H2: WinProcs.HWND;
H3: WinProcs.HWND;
H4: WinProcs.HWND;
H5: WinProcs.HWND;
H6: WinProcs.HWND;
H7: WinProcs.HWND;
H8: WinProcs.HWND;
H9: WinProcs.HWND;
const
A1:array[$0..$C] of System.Char = raw[$0..$C]at $1AF0
0: TApplication.[54 41 70 70 6C 69 63 61 74 69 6F 6E 00|K5 A1{0x1F6};
A2:array[$0..$D] of System.Char = raw[$0..$D]at $1AFD
0: TAlignPalette.[54 41 6C 69 67 6E 50 61 6C 65 74 74 65 00|K5 A2{0x1F7};
A3:array[$0..$12] of System.Char = raw[$0..$12]at $1B0B
00: TPropertyInspect[54 50 72 6F 70 65 72 74 79 49 6E 73 70 65 63 74|K5 A3{0x1F8}
10: or. |6F 72 00|;
A4:array[$0..$B] of System.Char = raw[$0..$B]at $1B1E
0: TAppBuilder.[54 41 70 70 42 75 69 6C 64 65 72 00|K5 A4{0x1F9};
T0:array[$0..$A] of System.Char = raw[$0..$A]at $1B2A
0: Delphi 2.0.[44 65 6C 70 68 69 20 32 2E 30 00|K5 T0{0x1FA};
T1:array[$0..$6] of System.Char = raw[$0..$6]at $1B35
0: Delphi.[44 65 6C 70 68 69 00|K5 T1{0x1FB};
T2:array[$0..$8] of System.Char = raw[$0..$8]at $1B3C
0: Delphi 3.[44 65 6C 70 68 69 20 33 00|K5 T2{0x1FC};
T3:array[$0..$A] of System.Char = raw[$0..$A]at $1B45
0: C++Builder.[43 2B 2B 42 75 69 6C 64 65 72 00|K5 T3{0x1FD};
T4:array[$0..$8] of System.Char = raw[$0..$8]at $1B50
0: Delphi 4.[44 65 6C 70 68 69 20 34 00|K5 T4{0x1FE};
T5:array[$0..$C] of System.Char = raw[$0..$C]at $1B59
0: C++Builder 4.[43 2B 2B 42 75 69 6C 64 65 72 20 34 00|K5 T5{0x1FF};
T6:array[$0..$8] of System.Char = raw[$0..$8]at $1B66
0: Delphi 5.[44 65 6C 70 68 69 20 35 00|K5 T6{0x200};
begin
00000000 : 53 PUSH EBX
00000001 : 56 PUSH ESI
00000002 : 57 PUSH EDI
00000003 : 55 PUSH EBP
00000004 : 83 C4 EC ADD ESP,-20
00000007 : 68(00 00 00 00 PUSH T0{0x1FA}
0000000C : 68(00 00 00 00 PUSH A1{0x1F6}
00000011 : E8(00 00 00 00 CALL FindWindow{0xA9}
00000016 : 8B D8 MOV EBX,EAX
00000018 : 68(00 00 00 00 PUSH T1{0x1FB}
0000001D : 68(00 00 00 00 PUSH A1{0x1F6}
00000022 : E8(00 00 00 00 CALL FindWindow{0xA9}
00000027 : 8B F0 MOV ESI,EAX
00000029 : 68(00 00 00 00 PUSH T2{0x1FC}
0000002E : 68(00 00 00 00 PUSH A1{0x1F6}
00000033 : E8(00 00 00 00 CALL FindWindow{0xA9}
00000038 : 89 44 24 04 MOV DWORD PTR [ESP+4],EAX
0000003C : 68(00 00 00 00 PUSH T3{0x1FD}
00000041 : 68(00 00 00 00 PUSH A1{0x1F6}
00000046 : E8(00 00 00 00 CALL FindWindow{0xA9}
0000004B : 89 04 24 MOV DWORD PTR [ESP],EAX
0000004E : 68(00 00 00 00 PUSH T4{0x1FE}
00000053 : 68(00 00 00 00 PUSH A1{0x1F6}
00000058 : E8(00 00 00 00 CALL FindWindow{0xA9}
0000005D : 89 44 24 08 MOV DWORD PTR [ESP+8],EAX
00000061 : 68(00 00 00 00 PUSH T5{0x1FF}
00000066 : 68(00 00 00 00 PUSH A1{0x1F6}
0000006B : E8(00 00 00 00 CALL FindWindow{0xA9}
00000070 : 89 44 24 0C MOV DWORD PTR [ESP+12],EAX
00000074 : 68(00 00 00 00 PUSH T6{0x200}
00000079 : 68(00 00 00 00 PUSH A1{0x1F6}
0000007E : E8(00 00 00 00 CALL FindWindow{0xA9}
00000083 : 89 44 24 10 MOV DWORD PTR [ESP+16],EAX
00000087 : 6A 00 PUSH $00
00000089 : 68(00 00 00 00 PUSH A2{0x1F7}
0000008E : E8(00 00 00 00 CALL FindWindow{0xA9}
00000093 : 8B F8 MOV EDI,EAX
00000095 : 6A 00 PUSH $00
00000097 : 68(00 00 00 00 PUSH A3{0x1F8}
0000009C : E8(00 00 00 00 CALL FindWindow{0xA9}
000000A1 : 8B E8 MOV EBP,EAX
000000A3 : 6A 00 PUSH $00
000000A5 : 68(00 00 00 00 PUSH A4{0x1F9}
000000AA : E8(00 00 00 00 CALL FindWindow{0xA9}
000000AF : 85 DB TEST EBX,EBX
000000B1 : 75 26 JNE +38; (0xD9)
000000B3 : 85 F6 TEST ESI,ESI
000000B5 : 75 22 JNE +34; (0xD9)
000000B7 : 83 3C 24 00 CMP DWORD PTR [ESP],0
000000BB : 75 1C JNE +28; (0xD9)
000000BD : 83 7C 24 04 00 CMP DWORD PTR [ESP+4],0
000000C2 : 75 15 JNE +21; (0xD9)
000000C4 : 83 7C 24 08 00 CMP DWORD PTR [ESP+8],0
000000C9 : 75 0E JNE +14; (0xD9)
000000CB : 83 7C 24 0C 00 CMP DWORD PTR [ESP+12],0
000000D0 : 75 07 JNE +7; (0xD9)
000000D2 : 83 7C 24 10 00 CMP DWORD PTR [ESP+16],0
000000D7 : 74 0C JE +12; (0xE5)
000000D9 : 85 FF TEST EDI,EDI
000000DB : 74 08 JE +8; (0xE5)
000000DD : 85 ED TEST EBP,EBP
000000DF : 74 04 JE +4; (0xE5)
000000E1 : 85 C0 TEST EAX,EAX
000000E3 : 75 04 JNE +4; (0xE9)
000000E5 : 33 C0 XOR EAX,EAX
000000E7 : EB 02 JMP +2; (0xEB)
000000E9 : B0 01 MOV AL,$01
000000EB : 83 C4 14 ADD ESP,20
000000EE : 5D POP EBP
000000EF : 5F POP EDI
000000F0 : 5E POP ESI
000000F1 : 5B POP EBX
000000F2 : C3 RET NEAR
end;

上面调用findwindow在找delphi或bcb的不同版本呢。要是找到一个的话就 MOV AL,$01

这样继续查找DelphiIsRunning，看它在那里调用：

00004377 : 8B 4D 10 MOV ECX,DWORD PTR [EBP+16]
0000437A : 8B 55 E8 MOV EDX,DWORD PTR [EBP-24]
0000437D : 8B 45 EC MOV EAX,DWORD PTR [EBP-20]
00004380 : E8(00 00 00 00 CALL TCanvas.LineTo{0x6F}
00004385 : E8(00 00 00 00 CALL DelphiIsRunning{0x201}
0000438A : 84 C0 TEST AL,AL
0000438C : 0F 85 B1 00 00 00 JNE +177; (0x4443)
00004392 : 8B 45 EC MOV EAX,DWORD PTR [EBP-20]
00004395 : 8B 40 0C MOV EAX,DWORD PTR [EAX+12]
00004398 : BA FF FF FF 00 MOV EDX,$00FFFFFF

调用 00004385 : E8(00 00 00 00 CALL DelphiIsRunning{0x201}
后有 test al,al
如果 al=1 的话，就表明delphi正在运行，那么我们就把这一句用 mov al,1代替好了（机器码B001）。

在DCU文件中这个call DelphiIsRunning是要由编译器来动态连接其地址的，所以没法nop掉这个调用。

在所有的dcu文件中用同样的方法查找并替换就可以了，当然 test al,al后的下一条语句有的DCU文件和这里的不同，
没关系，只改 test al,al。

2。还有一个问题，它的hint总是要出现，告诉人们您正在用的是SDL公司的未注册版本，整个世界都要为之改变呢。
改掉它！查找shareware,copyright,unregister之类的东西，查到与copyright有关的：

function getCopyRightStr: System.AnsiString;
var
result Result: System.AnsiString;
AuxStr: System.AnsiString;
i: System.Integer;
begin
00000000 : 55 PUSH EBP
00000001 : 8B EC MOV EBP,ESP
00000003 : 6A 00 PUSH $00
00000005 : 6A 00 PUSH $00
00000007 : 53 PUSH EBX
00000008 : 56 PUSH ESI
00000009 : 57 PUSH EDI
0000000A : 8B F8 MOV EDI,EAX
0000000C : 33 C0 XOR EAX,EAX
0000000E : 55 PUSH EBP
0000000F : 68(72 00 00 00 PUSH getCopyRightStr{0x1F2}+$00000072
00000014 : 64 FF 30 PUSH DWORD PTR FS:[EAX]
00000017 : 64 89 20 MOV DWORD PTR FS:[EAX],ESP
0000001A : 8D 45 FC LEA EAX,DWORD PTR [EBP-4]
0000001D : E8(00 00 00 00 CALL @LStrClr{0xE2}
00000022 : BE 87 FF FF FF MOV ESI,$FFFFFF87
00000027 : BB(78 00 00 00 MOV EBX,ShareW{0x1F1}+$00000078
0000002C : 8D 45 F8 LEA EAX,DWORD PTR [EBP-8]
0000002F : 33 D2 XOR EDX,EDX
00000031 : 8A 13 MOV DL,BYTE PTR [EBX]
00000033 : 8A 92(00 00 00 00 MOV DL,BYTE PTR [EDXCTDecode{0x1EF}]
00000039 : E8(00 00 00 00 CALL @LStrFromChar{0xE3}
0000003E : 8B 55 F8 MOV EDX,DWORD PTR [EBP-8]
00000041 : 8D 45 FC LEA EAX,DWORD PTR [EBP-4]
00000044 : E8(00 00 00 00 CALL @LStrCat{0xE4}----------这是在拼凑那个hint呢
00000049 : 4B DEC EBX
0000004A : 46 INC ESI
0000004B : 75 DF JNE -33; (0x2C)--------------在这里改！跳到call @LStrAsg{0xE5}后面的那句
0000004D : 8B C7 MOV EAX,EDI
0000004F : 8B 55 FC MOV EDX,DWORD PTR [EBP-4]
00000052 : E8(00 00 00 00 CALL @LStrAsg{0xE5}---------拼完了就显示，那么跳过它！
00000057 : 33 C0 XOR EAX,EAX
00000059 : 5A POP EDX
0000005A : 59 POP ECX
0000005B : 59 POP ECX
0000005C : 64 89 10 MOV DWORD PTR FS:[EAX],EDX
0000005F : 68(79 00 00 00 PUSH getCopyRightStr{0x1F2}+$00000079
00000064 : 8D 45 F8 LEA EAX,DWORD PTR [EBP-8]
00000067 : BA 02 00 00 00 MOV EDX,$00000002
0000006C : E8(00 00 00 00 CALL @LStrArrayClr{0xE6}
00000071 : C3 RET NEAR
00000072 : E9(00 00 00 00 JMP @HandleFinally{0xE7}
00000077 : EB EB JMP -21; (0x64)
00000079 : 5F POP EDI
0000007A : 5E POP ESI
0000007B : 5B POP EBX
0000007C : 59 POP ECX
0000007D : 59 POP ECX
0000007E : 5D POP EBP
0000007F : C3 RET NEAR
end;

数一数后知道 75 DF 改成 EB 0A
这样就没有hint了，如果您想要自己的hint，请用别的办法吧，可以做得到的。


PerformanceTest 3.4

标 题:暴破 PerformanceTest 3.4 (8千字)
发信人:fishs
时 间:2001-4-25 23:02:28
详细信息:
软件名称：PassMark PerformanceTest 3.4
破解目的：30 天试用期，程序启动时跳出注册窗
破解工具：TRW2000、W32Dsm89、UltraEdit

首先用 TRW2000 载入程序，停留在程序入口处，然后开始不停的按 F10 单步跟踪……

//******************** Program Entry Point ********
.
.
.
* Reference To: KERNEL32.GetModuleHandleA, Ord:0126h
|
:00416B34 FF1520314200 Call dword ptr [00423120]
:00416B3A 50 push eax
:00416B3B E8302AFFFF call 00409570 <---- 这里跳出注册窗，F8 跟进
:00416B40 8945A0 mov dword ptr [ebp-60], eax
:00416B43 50 push eax
:00416B44 E8D9F9FFFF call 00416522
:00416B49 8B45EC mov eax, dword ptr [ebp-14]
:00416B4C 8B08 mov ecx, dword ptr [eax]
:00416B4E 8B09 mov ecx, dword ptr [ecx]
:00416B50 894D98 mov dword ptr [ebp-68], ecx
:00416B53 50 push eax
:00416B54 51 push ecx
:00416B55 E802570000 call 0041C25C
:00416B5A 59 pop ecx
:00416B5B 59 pop ecx
:00416B5C C3 ret

重新载入，按 F8 跟进 call 00409570，继续按 F10 单步跟踪……
.
.
.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409973(C)
|
:0040997D 8B0DC0144400 mov ecx, dword ptr [004414C0]
:00409983 8B742414 mov esi, dword ptr [esp+14]
:00409987 33C0 xor eax, eax
:00409989 83F910 cmp ecx, 00000010
:0040998C 0F9DC0 setnl al
:0040998F 3BF3 cmp esi, ebx
:00409991 A388144400 mov dword ptr [00441488], eax
:00409996 7410 je 004099A8
:00409998 8BCE mov ecx, esi
:0040999A E861550000 call 0040EF00
:0040999F 56 push esi
:004099A0 E883B80000 call 00415228
:004099A5 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409996(C)
|
:004099A8 E8A3480000 call 0040E250 <---- 这里跳出注册窗，F8 跟进
:004099AD 85C0 test eax, eax
:004099AF 750C jne 004099BD
:004099B1 E85A200000 call 0040BA10
:004099B6 53 push ebx

重新载入，按 F8 跟进 call 0040E250，按 F10 单步跟踪……

* Possible StringData Ref from Data Obj ->"2旒"
|
:0040E250 C705F81F440040B34200 mov dword ptr [00441FF8], 0042B340
:0040E25A C705F41F440000000000 mov dword ptr [00441FF4], 00000000
:0040E264 E8C7000000 call 0040E330 <---- 这里跳出注册窗。跟踪到这里的时候，我已经
没什么耐心了，而且我在下面发现了一些重要
的提示……
:0040E269 83F801 cmp eax, 00000001
:0040E26C 7501 jne 0040E26F
:0040E26E C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E26C(C)
|
:0040E26F 83F803 cmp eax, 00000003
:0040E272 0F84A7000000 je 0040E31F
:0040E278 833DF41F44000F cmp dword ptr [00441FF4], 0000000F
:0040E27F 7523 jne 0040E2A4
:0040E281 6A30 push 00000030

* Reference To: USER32.MessageBeep, Ord:01BDh
|
:0040E283 FF15F8324200 Call dword ptr [004232F8]
:0040E289 A1C41A4400 mov eax, dword ptr [00441AC4]
:0040E28E 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Date / Time Error"
|
:0040E290 6804B44200 push 0042B404

* Possible StringData Ref from Data Obj ->"The date and time on this machine " <--程序记录了使用
->"is earlier than when
the program " 时间，所以修改
->"was previously run. In order to " 系统时间以延长
->"enforce the
unregistered version's " 使用期是没用的
->"eval period, this is not be allowed"
|
:0040E295 6858B34200 push 0042B358
:0040E29A 50 push eax

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:0040E29B FF1584324200 Call dword ptr [00423284]
:0040E2A1 33C0 xor eax, eax
:0040E2A3 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E27F(C)
|
:0040E2A4 53 push ebx
:0040E2A5 56 push esi
:0040E2A6 57 push edi

* Possible StringData Ref from Data Obj ->"Dqqnqctqhmfrs`qsto- Bgdbjvqhsdodqlhrrhnmh"
->"r`u`hk`akdhmsgddwdbts`akdchqdbsnqx+ Bgdbj"
->"sgdjdx-c`sehkddwhrsrhmsgddwdbts`akdch"
->"qdbsnqx- Sqxsntmhmrs`kk%qdhmrs`kksgdrnes"
->"v`qd+heoqnakdlrodqrhrs Bnms`bs9vvv-o`rrl`q"
->"j-bnlenqrtoonqs Rs`qstoDqqnqmtladq"
| ↑ 上面这些怪码是不是就是提示过期的信息，难怪
我查找不到。
:0040E2A7 68E8AF4200 push 0042AFE8
:0040E2AC E85FFFFFFF call 0040E210

* Possible StringData Ref from Data Obj ->"Dqqnq"
|
:0040E2B1 68ACB14200 push 0042B1AC
:0040E2B6 8BF0 mov esi, eax
:0040E2B8 E853FFFFFF call 0040E210
:0040E2BD 8BD8 mov ebx, eax
:0040E2BF 8BFE mov edi, esi
:0040E2C1 83C9FF or ecx, FFFFFFFF
:0040E2C4 33C0 xor eax, eax
:0040E2C6 F2 repnz
:0040E2C7 AE scasb
:0040E2C8 F7D1 not ecx
:0040E2CA 83C113 add ecx, 00000013
:0040E2CD 51 push ecx
:0040E2CE E81B6E0000 call 004150EE
:0040E2D3 83C40C add esp, 0000000C
:0040E2D6 8BF8 mov edi, eax
:0040E2D8 6A30 push 00000030

* Reference To: USER32.MessageBeep, Ord:01BDh
|
:0040E2DA FF15F8324200 Call dword ptr [004232F8]
:0040E2E0 8B0DF41F4400 mov ecx, dword ptr [00441FF4]
:0040E2E6 51 push ecx
:0040E2E7 56 push esi
:0040E2E8 684CB34200 push 0042B34C
:0040E2ED 57 push edi
:0040E2EE E84D6B0000 call 00414E40
:0040E2F3 8B15C41A4400 mov edx, dword ptr [00441AC4]
:0040E2F9 83C410 add esp, 00000010
:0040E2FC 6A10 push 00000010
:0040E2FE 53 push ebx
:0040E2FF 57 push edi
:0040E300 52 push edx

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:0040E301 FF1584324200 Call dword ptr [00423284]
:0040E307 56 push esi
:0040E308 E8F86C0000 call 00415005
:0040E30D 53 push ebx
:0040E30E E8F26C0000 call 00415005
:0040E313 57 push edi
:0040E314 E8EC6C0000 call 00415005
:0040E319 83C40C add esp, 0000000C
:0040E31C 5F pop edi
:0040E31D 5E pop esi
:0040E31E 5B pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E272(C)
|
:0040E31F 33C0 xor eax, eax
:0040E321 C3 ret

用 UltraEdit 查找 :0040E264 处的代码：
查找 E8 C7 00 00 00 83 F8 01 75 01
改为 90 90 90 90 90 90 90 90 90 90

fishs
http://fishs.126.com

标 题:温柔一点，好吗？——暴破pt的另一种方法 (2千字)
发信人:kingtall
时 间:2001-4-26 13:33:02
详细信息:

温柔一点，好吗？——暴破pt的另一种方法
作者：kingtall

目标：Performance Test v3.4 build 1000，以下简称pt。
工具：w32dasm8.93,trw1.22

运行pt，看about框，有'Evaluation version'字样。
用w32dasm反汇编pt.ext，找Evaluation version，找到如下

* Referenced by a CALL at Addresses:
|:004096D2 , :0040990D
|
:00408680 A148194400 mov eax, dword ptr [00441948]；若不为0就显示Evaluation version
:00408685 85C0 test eax, eax
:00408687 7527 jne 004086B0
:00408689 6840704300 push 00437040

* Possible StringData Ref from Data Obj ->"V3.4"
|
:0040868E 687C614200 push 0042617C

* Possible StringData Ref from Data Obj ->"PerformanceTest"
|
:00408693 68CC684200 push 004268CC

* Possible StringData Ref from Data Obj ->"%s %s"
|
:00408698 68D8944200 push 004294D8
:0040869D 6830184400 push 00441830
:004086A2 E8D9C30000 call 00414A80
:004086A7 83C414 add esp, 00000014
:004086AA B830184400 mov eax, 00441830
:004086AF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408687(C)
|

* Possible StringData Ref from Data Obj ->"Evaluation version"
|
:004086B0 68C4944200 push 004294C4

现在只要找到程序中把[441948]置0的地方，我是这样做的，在w32dasm的Disassembler菜单中选Save Disassemble text file and create project file，保存结果为pt.alf。然后用写字板打开pt.alf，找481944，找到下面这一段

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E3FC(C)
|
:0040E40D 8BFE mov edi, esi
:0040E40F 83C9FF or ecx, FFFFFFFF
:0040E412 33C0 xor eax, eax
:0040E414 F2 repnz
:0040E415 AE scasb
:0040E416 F7D1 not ecx
:0040E418 49 dec ecx
:0040E419 83F903 cmp ecx, 00000003
:0040E41C 7244 jb 0040E462 ；把这一句改为 eb0f jmp 40e42d
^^^^ 就是注册版了。
:0040E41E 837B74FF cmp dword ptr [ebx+74], FFFFFFFF
:0040E422 753E jne 0040E462
:0040E424 80BB8000000037 cmp byte ptr [ebx+00000080], 37
:0040E42B 7535 jne 0040E462
:0040E42D C7054819440000000000 mov dword ptr [00441948], 0 ；在这里把[441948]置0。
^^^^^^

还有一点，程序启动时会先出现一个小窗口，等好长时间才能进入主窗口，好烦哪！
运行TRW，load pt.exe，下bpx sleep，找到下面（用w32dasm找sleep也一样）

0167:00409547 68DC050000 PUSH DWORD 05DC ；改为 6800000000 push dword 0
^^^^ 少睡点吧！
0167:0040954C FF1528314200 CALL `KERNEL32!Sleep`

标 题:这个玩意用了base64算法 (空)
发信人:１２１２
时 间:2001-4-26 14:08:16
详细信息:


iTime

标 题:iTime 破解实录 (15千字)
发信人:CoolBob[CCG]
时 间:2001-4-26 5:20:22
详细信息:
iTime 破解实录
iTime International Version
http://www.touchstone.de
一个可以同步你的电脑时钟的程序，在2000下不需要了。小弟还是比较喜欢用98作为破解平台，经常泡在SoftICE里面一转就是好几个小时。时钟经常不灵，最近在网上闲逛发现这个程序可以同步时钟，就抓了一个回来。居然还要注册，不然时间到了就不让用。我现在是一看到Register就会条件反射:)，还是写个注册机出来吧。OK，Let's go!
1、工具：DeDe v2.50,TRW2000 or SoftICE，TC2.0 or asm(你喜欢的编译器)
2、用DeDe打开iTime.exe，在DeDe中点击Procedures按钮，找到options(unit name)那一项双击，在右边的窗口中找到mnuRegisterClick这一项，再双击，WOW!
来到这里你已经成功一半啦!^*^(这么简单?)
* Reference to: controls.TControl.GetText(TControl):System.String;
|
004078B4 E80F0C0300 call 004384C8
004078B9 8D45F8 lea eax, [ebp-$08] <--d *eax 看到你输入的名字

|
004078BC E827670500 call 0045DFE8
004078C1 8BF0 mov esi, eax
004078C3 83FE32 cmp esi, +$32
004078C6 7E04 jle 004078CC
004078C8 B232 mov dl, $32
004078CA EB02 jmp 004078CE
004078CC 8BD6 mov edx, esi
004078CE 889528FFFFFF mov [ebp+$FFFFFF28], dl
004078D4 33C0 xor eax, eax
004078D6 8A8528FFFFFF mov al, byte ptr [ebp+$FFFFFF28]
004078DC 50 push eax
004078DD 837DF800 cmp dword ptr [ebp-$08], +$00
004078E1 7405 jz 004078E8
004078E3 8B4DF8 mov ecx, [ebp-$08]
004078E6 EB05 jmp 004078ED
004078E8 B9C8AF4600 mov ecx, $0046AFC8
004078ED 51 push ecx
004078EE 8D8529FFFFFF lea eax, [ebp+$FFFFFF29]
004078F4 50 push eax

* Reference to: _strncpy()
|
004078F5 E86C1C0600 call 00469566
004078FA 83C40C add esp, +$0C
004078FD FF4DD4 dec dword ptr [ebp-$2C]
00407900 8D45F8 lea eax, [ebp-$08]
00407903 BA02000000 mov edx, $00000002

|
00407908 E8DF650500 call 0045DEEC
0040790D 8D9528FFFFFF lea edx, [ebp+$FFFFFF28]
00407913 8D855CFFFFFF lea eax, [ebp+$FFFFFF5C]

|
00407919 E8C2B9FFFF call 004032E0
0040791E 66C745C82C00 mov word ptr [ebp-$38], $002C
00407924 33C9 xor ecx, ecx
00407926 894DF4 mov [ebp-$0C], ecx
00407929 8D55F4 lea edx, [ebp-$0C]
0040792C FF45D4 inc dword ptr [ebp-$2C]
0040792F 8B45B4 mov eax, [ebp-$4C]

* Reference to control btnDel : TResButton
|
00407932 8B80EC010000 mov eax, [eax+$01EC]

* Reference to: controls.TControl.GetText(TControl):System.String;
|
00407938 E88B0B0300 call 004384C8
0040793D 8D45F4 lea eax, [ebp-$0C] <--d *eax 看到你输入的密码

|
00407940 E8A3660500 call 0045DFE8
为了更快的找到关键比对核心，可以下bpr,或者，bpm等断点。当你看到这段代码：
0167:0040CA38 PUSH EBP
0167:0040CA39 MOV EBP,ESP
0167:0040CA3B ADD ESP,BYTE -1C
0167:0040CA3E MOV [EBP-0C],ECX
0167:0040CA41 MOV [EBP-08],EDX
0167:0040CA44 MOV [EBP-04],EAX
0167:0040CA47 MOV BYTE [EBP-16],00
0167:0040CA4B LEA EAX,[EBP-16]
0167:0040CA4E MOV EDX,0040CB90
0167:0040CA53 MOV CL,09
0167:0040CA55 CALL 0045B014
0167:0040CA5A LEA EAX,[EBP-1C]
0167:0040CA5D MOV EDX,[EBP-08]
0167:0040CA60 SHR EDX,1C
0167:0040CA63 AND EDX,BYTE +0F
0167:0040CA66 MOV DL,[EDX+0046EE4C]
0167:0040CA6C MOV [EAX+01],DL
0167:0040CA6F MOV BYTE [EAX],01
0167:0040CA72 LEA EDX,[EBP-1C]
0167:0040CA75 LEA EAX,[EBP-16]
0167:0040CA78 MOV CL,09
0167:0040CA7A CALL 0045B014
0167:0040CA7F LEA EAX,[EBP-1C]
0167:0040CA82 MOV EDX,[EBP-08]
0167:0040CA85 SHR EDX,18
0167:0040CA88 AND EDX,BYTE +0F
0167:0040CA8B MOV DL,[EDX+0046EE4C]
0167:0040CA91 MOV [EAX+01],DL
0167:0040CA94 MOV BYTE [EAX],01
0167:0040CA97 LEA EDX,[EBP-1C]
0167:0040CA9A LEA EAX,[EBP-16]
0167:0040CA9D MOV CL,09
0167:0040CA9F CALL 0045B014
0167:0040CAA4 LEA EAX,[EBP-1C]
0167:0040CAA7 MOV EDX,[EBP-08]
0167:0040CAAA SHR EDX,14
0167:0040CAAD AND EDX,BYTE +0F
0167:0040CAB0 MOV DL,[EDX+0046EE4C]
0167:0040CAB6 MOV [EAX+01],DL
0167:0040CAB9 MOV BYTE [EAX],01
0167:0040CABC LEA EDX,[EBP-1C]
0167:0040CABF LEA EAX,[EBP-16]
0167:0040CAC2 MOV CL,09
0167:0040CAC4 CALL 0045B014
0167:0040CAC9 LEA EAX,[EBP-1C]
0167:0040CACC MOV EDX,[EBP-08]
0167:0040CACF SHR EDX,10
0167:0040CAD2 AND EDX,BYTE +0F
0167:0040CAD5 MOV DL,[EDX+0046EE4C]
0167:0040CADB MOV [EAX+01],DL
0167:0040CADE MOV BYTE [EAX],01
0167:0040CAE1 LEA EDX,[EBP-1C]
0167:0040CAE4 LEA EAX,[EBP-16]
0167:0040CAE7 MOV CL,09
0167:0040CAE9 CALL 0045B014
0167:0040CAEE LEA EAX,[EBP-1C]
0167:0040CAF1 MOV EDX,[EBP-08]
0167:0040CAF4 SHR EDX,0C
0167:0040CAF7 AND EDX,BYTE +0F
0167:0040CAFA MOV DL,[EDX+0046EE4C]
0167:0040CB00 MOV [EAX+01],DL
0167:0040CB03 MOV BYTE [EAX],01
0167:0040CB06 LEA EDX,[EBP-1C]
0167:0040CB09 LEA EAX,[EBP-16]
0167:0040CB0C MOV CL,09
0167:0040CB0E CALL 0045B014
0167:0040CB13 LEA EAX,[EBP-1C]
0167:0040CB16 MOV EDX,[EBP-08]
0167:0040CB19 SHR EDX,08
0167:0040CB1C AND EDX,BYTE +0F
0167:0040CB1F MOV DL,[EDX+0046EE4C]
0167:0040CB25 MOV [EAX+01],DL
0167:0040CB28 MOV BYTE [EAX],01
0167:0040CB2B LEA EDX,[EBP-1C]
0167:0040CB2E LEA EAX,[EBP-16]
0167:0040CB31 MOV CL,09
0167:0040CB33 CALL 0045B014
0167:0040CB38 LEA EAX,[EBP-1C]
0167:0040CB3B MOV EDX,[EBP-08]
0167:0040CB3E SHR EDX,04
0167:0040CB41 AND EDX,BYTE +0F
0167:0040CB44 MOV DL,[EDX+0046EE4C]
0167:0040CB4A MOV [EAX+01],DL
0167:0040CB4D MOV BYTE [EAX],01
0167:0040CB50 LEA EDX,[EBP-1C]
0167:0040CB53 LEA EAX,[EBP-16]
0167:0040CB56 MOV CL,09
0167:0040CB58 CALL 0045B014
0167:0040CB5D LEA EAX,[EBP-1C]
0167:0040CB60 MOV EDX,[EBP-08]
0167:0040CB63 AND EDX,BYTE +0F
0167:0040CB66 MOV DL,[EDX+0046EE4C]
0167:0040CB6C MOV [EAX+01],DL
0167:0040CB6F MOV BYTE [EAX],01
0167:0040CB72 LEA EDX,[EBP-1C]
0167:0040CB75 LEA EAX,[EBP-16]
0167:0040CB78 MOV CL,09
0167:0040CB7A CALL 0045B014
0167:0040CB7F MOV EAX,[EBP-0C]
0167:0040CB82 LEA EDX,[EBP-16]
0167:0040CB85 MOV CL,09
0167:0040CB87 CALL 0045B060
0167:0040CB8C MOV ESP,EBP
0167:0040CB8E POP EBP
0167:0040CB8F RET

其实就是把一个4字节的十六进制数转换为字符串。比如它第一次是把一个0x426B2FA9转换为$426B2FA9
第二次把0x6FB73A24转换为$6FB73A24.
-----------------------------------------
0167:0040CBBF MOV AL,[EBP-4D]
0167:0040CBC2 INC EAX
0167:0040CBC3 CMP EAX,BYTE +32
0167:0040CBC6 JG 0040CBDC
0167:0040CBC8 MOV [EBP-10],EAX
0167:0040CBCB MOV EAX,[EBP-10]
0167:0040CBCE MOV BYTE [EBP+EAX-4D],2A
0167:0040CBD3 INC DWORD [EBP-10]
0167:0040CBD6 CMP DWORD [EBP-10],BYTE +33
0167:0040CBDA JNZ 0040CBCB
0167:0040CBDC LEA EAX,[EBP+FFFFFF6C]
0167:0040CBE2 MOV [EBP-0C],EAX
0167:0040CBE5 LEA ECX,[EBP+FFFFFF60]
0167:0040CBEB MOV EAX,[EBP-04]
0167:0040CBEE MOV EDX,[EAX+0224]
0167:0040CBF4 MOV EAX,[EBP-04]
0167:0040CBF7 CALL 0040CA38
这段代码就是把name不足50个字符的地方全部用'*'添满。然后再把上面的两个字符串加到你的名字像下面那样
--------------------------------------------------------------
$426B2FA9CoolBob******************************************* $6FB73A24

|－－－－－－－－－－－－－－－－－－一共71个字符－－－－－－－－－－－－－－－－－－|

下面就要小心跟踪了，来到这里：
0167:0040C9E3 MOV [EBP-08],EDX
0167:0040C9E6 MOV [EBP-04],EAX
0167:0040C9E9 MOV BYTE [EBP-15],00
0167:0040C9ED MOV EAX,[EBP-08] <---EAX初始化为0xABCDEF
0167:0040C9F0 SHR EAX,08
0167:0040C9F3 AND EAX,00FFFFFF
0167:0040C9F8 MOV [EBP-10],EAX
0167:0040C9FB XOR EAX,EAX
0167:0040C9FD MOV AL,[EBP-15]
0167:0040CA00 MOVZX EAX,BYTE [EBP+EAX-5C] <---这里也就是刚才那个71个字符了
0167:0040CA05 XOR EAX,[EBP-08]
0167:0040CA08 AND EAX,FF
0167:0040CA0D MOV EAX,[EAX*4+0046EA44] <----在TRW2000下把这段数据用 <----w 46EA44 fe*4+46EA44 c:\data.bin抓下来
<----后面作注册机少不了这个。
0167:0040CA14 MOV [EBP-14],EAX
0167:0040CA17 MOV EAX,[EBP-10]
0167:0040CA1A XOR EAX,[EBP-14]
0167:0040CA1D MOV [EBP-08],EAX
0167:0040CA20 INC BYTE [EBP-15]
0167:0040CA23 CMP BYTE [EBP-15],47
0167:0040CA27 JNZ 0040C9ED <----循环0x47次，也就是71次
这里算出来的EAX就是注册码的原型了，只是要把EAX包含的十六进制数转换为字符串输出即可！
－－－－－－－－－－－－－－－－－－－－－－－－－－－－
0167:0040CE14 MOV CL,[EAX+0375]
0167:0040CE1A LEA EDX,[EBP-42]
0167:0040CE1D MOV EAX,[EBP-04]
0167:0040CE20 CALL 0040CB94
0167:0040CE25 LEA EAX,[EBP-50] <-----d EAX (real code)
0167:0040CE28 LEA EDX,[EBP-0E] <-----d edx (our code)
0167:0040CE2B XOR ECX,ECX
0167:0040CE2D MOV CL,[EAX]
0167:0040CE2F INC ECX
0167:0040CE30 CALL 0045B114 <-----比较是否相等
0167:0040CE35 SETZ [EBP-0F] <-----相等的话置注册成功标志1到[EBP-0F]
0167:0040CE39 CMP BYTE [EBP-0F],00
0167:0040CE3D JNZ 0040CE85 <-----if jump good boy:)
0167:0040CE3F MOV EAX,[EBP-04]
0167:0040CE42 MOV BYTE [EAX+0375],01
0167:0040CE49 LEA EAX,[EBP-50]
0167:0040CE4C PUSH EAX
0167:0040CE4D MOV EAX,[EBP-04]
0167:0040CE50 MOV CL,[EAX+0375]
0167:0040CE56 LEA EDX,[EBP-42]
0167:0040CE59 MOV EAX,[EBP-04]
0167:0040CE5C CALL 0040CB94
0167:0040CE61 LEA EAX,[EBP-50]
0167:0040CE64 LEA EDX,[EBP-0E]
0167:0040CE67 XOR ECX,ECX
0167:0040CE69 MOV CL,[EAX]
0167:0040CE6B INC ECX
0167:0040CE6C CALL 0045B114
0167:0040CE71 SETZ [EBP-0F]
0167:0040CE75 CMP BYTE [EBP-0F],01
0167:0040CE79 JNZ 0040CE85
0167:0040CE7B MOV EAX,[EBP-04]
0167:0040CE7E MOV BYTE [EAX+0375],01
0167:0040CE85 MOV AL,[EBP-0F]
0167:0040CE88 POP EDI
0167:0040CE89 POP ESI
0167:0040CE8A MOV ESP,EBP
0167:0040CE8C POP EBP
0167:0040CE8D RET
该程序注册正确后，会在其目录下生成一个叫iTime.key的文件。

3、在作注册机前的准备：
我们要对那个TRW2000抓下来的data.bin进行一番处理。可以编个小程序来处理：
------------------------------------Start here--------------------------------------
#include <stdio.h>
main(){
FILE *fp1,*fp2;
unsigned long buffer[0xfe];
int i;
clrscr();
fp=fopen("c:\\data.bin","rb+");
fp2=fopen("c:\\x.bin","w+");
for(i=0;i<0xfe;i++)
{fread(&buffer[i],4,1,fp1);
printf("0x%lX,",buffer[i]);
fprintf(fp2,"0x%lX,",buffer[i]);
if (i%6==0) fprintf(fp2,"\n");
}
}
------------------------------------Cut here----------------------------------------
上面这个程序就是把data.bin里面的二进制数据转换成4字节的长整数。
4、注册机
－－－－－－－－－－－－－－－－－－－start here－－－－－－－－－－－－－－－－－－
#include <stdio.h>
#include <string.h>
main()
{
char string1[]={0x9,0x24,0x34,0x32,0x36,0x42,0x32,0x46,0x41,0x39};
char string2[]={0x9,0x24,0x36,0x46,0x42,0x37,0x33,0x41,0x32,0x34};
char name[50];
char code[8];
char sns[71];
unsigned long data[]={0x0,
0x77073096,0xEE0E612C,0x990951BA,0x76DC419,0x706AF48F,0xE963A535,
0x9E6495A3,0xEDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x9B64C2B,
0x7EB17CBD,0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,
0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,
0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,
0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,
0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,
0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC,
0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,
0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,
0x58684C11,0xC1611DAB,0xB6662D3D,0x76DC4190,0x1DB7106,0x98D220BC,
0xEFD5102A,0x71B18589,0x6B6B51F,0x9FBFE4A5,0xE8B8D433,0x7807C9A2,
0xF00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x86D3D2D,0x91646C97,
0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,
0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,
0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,
0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,
0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,
0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,0x5005713C,0x270241AA,0xBE0B1010,
0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,0x5EDEF90E,
0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,
0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x3B6E20C,0x74B1D29A,0xEAD54739,
0x9DD277AF,0x4DB2615,0x73DC1683,0xE3630B12,0x94643B84,0xD6D6A3E,
0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0xA00AE27,0x7D079EB1,0xF00F9344,
0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,
0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,
0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,
0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,0xD80D2BDA,
0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,
0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,
0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,
0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,
0xEC63F226,0x756AA39C,0x26D930A,0x9C0906A9,0xEB0E363F,0x72076785,
0x5005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0xCB61B38,0x92D28E9B,
0xE5D5BE0D,0x7CDCEFB7,0xBDBDF21,0x86D3D2D4,0xF1D4E242,0x68DDB3F8,
0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,
0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,
0x166CCF45,0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,
0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,
0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,
0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,
0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,
0xC30C8EA1};
int i,j;unsigned long ebp=0xABCDEF,eax;
clrscr();
printf("iTime (International Version) Keymaker by CoolBob[CCG]\n");
printf("written at 2001.4.25\n");
printf("name: ");
scanf("%s",name);printf("\n");
for(i=0;i<10;i++)sns[i]=string1[i];
sns[10]=strlen(name);
for(i=11;i<strlen(name)+11;i++)sns[i]=name[i-11];
if (strlen(name)<50) {for(i=strlen(name)+11;i<61;i++) sns[i]='*';};
for(i=61;i<71;i++) sns[i]=string2[i-61];
for(i=0;i<0x47;i++)
{
eax=ebp;
eax=(eax>>8)&0x00FFFFFF;
j=(sns[i]^ebp)&0xFF;
ebp=eax^data[j];
}
printf("code: %lX\n\n",ebp);
printf("Hmm,OK,that's your code!!enjoy yourself! Contact me at CoolBob@21cn.com :-)\n");
printf("press any key to exit!!");
getch();
}

－－－－－－－－－－－－－－－－－－－－cut here－－－－－－－－－－－－－－－－－－－－－

written by CoolBob[CCG]
2001.4.26
(CIH??)
CopyRight reserved by China Cracker Group

标 题:那大段东西是标准的crc32算法 (空)
发信人:１２１２
时 间:2001-4-26 11:41:31
详细信息:


CRYPTOAPI

 标 题:shareware的作者们，你们可以使用微软的CRYPTOAPI来加密注册码或者关键的程序代码！ (911字)
发信人:1212
时 间:2000-9-5 14:22:20
详细信息:
Cryptography API在MSDN中有简单介绍。

如果用CRYPTOAPI来生成注册码，则你的注册码在目前根本无人能够破解，即不知道加密密钥的人是无法得出一个正确的注册码的，就象The BAT!一样。但是只这样做的话别人还是可以强行修改程序中的JNZ、JZ指令使得软件成为注册版本。

如果发布软件之前将关键的指令代码（比如只有注册用户才能使用的那段代码）用CRYPTOAPI加密，加密密钥和解密密钥都不在软件的发行版中出现（即使使用调试器也无法在程序的发行包中得到）。用注册码作为解密密钥，即当用户输入注册码之后，程序用该注册码（或该注册码的一部分）作为解密密钥试图去解开事先加密好的那段代码，如果是注册用户，则解开的代码是可以执行的，否则解开后得到的只是一堆垃圾，只要一运行就必然出非法操作。这样该软件可以说是无法破解的了。

为了使得不同的注册用户都可以解开同一个发行包，解密密钥应该是固定的一个串，即注册码是个常数串，不包含注册用户的信息。这样一旦已注册用户得到该注册码，就可以任意传播，这是该方法的缺陷。没有好的方法可以在注册码中嵌入用户名。

标 题:对该方法的补充 (1千字)
发信人:guest
时 间:2000-9-5 15:20:39
详细信息:

刚才又想到一个如何在注册码中嵌入名字的方法。

由于用来解密程序代码的那个密钥是个常数串，所以不可能在该串中嵌入用户名，但可以将其作为注册码的第一部分，而注册码的第二部分由如下的方法得到：

RSA encrypt RSA encrypt
用户名------------->中间值--------------->注册码的第二部分

这样就在注册码的第二部分中嵌入了用户信息。在判断注册码的第二部分的时候，是这样判断的：
if (RSA_encrypt(用户名) == RSA_decrypt(注册码第二部分))
{
registered user;
}
else
{
pirate copy;
}
上述的加密和解密可以使用不同的密钥。

同时，上述if语句所在的函数的代码事先已经加密过，没有注册的用户无法得到正确的注册码的第一部分，自然无法得到上述if语句的机器码的明文。即使有某个注册用户在网上散播了其注册码的第一部分（他若散播注册码的第二部分就可以知道他是谁，除非他使用盗窃的信用卡帐号），除了软件作者也无人能满足上面的if语句的条件，只有在内存中动态patch上面的if语句及相关代码。为了提高patch的难度，可以采用动态分配内存的方法，将解压出来的代码放在动态分配得到的堆中执行，这样解压出来的代码的偏移地址是浮动的，patch的难度大大增加。


cooolftp

 标 题:cooolftp 注册过程 (643字)
发信人:１２１２
时 间:2001-6-1 11:01:08
详细信息:
cooolftp 使用了经过修改的 des 来实现注册判断。每个注册码为 8 个字符，正好是 des 需要的 key 长度。具体流程：

const char magic[100][16] = { ..... }; <-- 事先存好的结果

strupr( key );
des_init( key );
des_encrypt( key, "coolftp....", outbuf ); <--- 是一个16字符的串，可以直接看到

for (i=0; i<100; i++) {
if( !memcmp( outbuf, magic[i] ) ) reg_ok();
}
reg_failed();

所以注册码必须满足：des后的结果是事先存好的100个结果之一。

它的所有注册码都是偶数数字和第偶数个字母（B,D,F...)组成的，这样，一共有5+13=18个字符。在 18^8 范围内穷举，就可以得到注册码。

顺便说一句，作者不懂密码学，他修改过的 des 强度大大低于原来的 des。


AdSubtract PRO Version 2.04

标 题:谁能破解此软件：一个拦截网页广告的工具（高手入内） (261字)
发信人:1212
时 间:2001-1-24 15:02:54
详细信息:
谁能破解此软件：一个拦截网页广告的工具，此软件没有试用期，不注册就不让使用。本人水平太低，只能解除启动后的NAG框（在60031004处设断，将跳转改为NOP）。此软件的下载地址为：http://www.adsubtract.com/bin/20082404/ad-pro.exe　请高手破解后指出此软件的关键断点，先谢了。

标 题:破解AdSubtract PRO Version 2.04 (3千字)
发信人:大老
时 间:2001-1-26 18:27:13
详细信息:

破解AdSubtract PRO Version 2.04
其实主程序文件是ctlpanel.dll这个动态库文件.

这是一个非常好的去广告窗程序！
016F:6000A302 CMP EDI,0403
016F:6000A308 JZ NEAR 6000A46B 不能跳跳了你就要数入注册码拉！
016F:6000A30E CMP EDI,074C
016F:6000A314 JNG NEAR 6000A559
016F:6000A31A CMP EDI,074F
016F:6000A320 JG NEAR 6000A559
016F:6000A326 PUSH DWORD 60052D50
016F:6000A32B LEA ECX,[ESP+2C]
016F:6000A32F CALL 60010370
016F:6000A334 LEA EDX,[ESP+10]
016F:6000A338 XOR EBP,EBP
016F:6000A33A PUSH EDX
016F:6000A33B PUSH DWORD 60052D40
016F:6000A340 LEA ECX,[ESP+30]
016F:6000A344 MOV [ESP+01CC],EBP
016F:6000A34B CALL 600112D0
016F:6000A350 CMP DWORD [ESP+10],BYTE +04
016F:6000A355 JNL 6000A370 一定要跳转不然功能有限制！
016F:6000A357 LEA ECX,[ESP+28]
016F:6000A35B MOV DWORD [ESP+01C4],FFFFFFFF
016F:6000A366 CALL 60010440
016F:6000A36B JMP 6000A559
016F:6000A370 OR EBX,BYTE -01
016F:6000A373 LEA ECX,[ESP+28]
016F:6000A377 MOV [ESP+01C4],EBX
016F:6000A37E CALL 60010440
016F:6000A383 MOV ECX,[ESI+3C]
016F:6000A386 CMP ECX,EBP
016F:6000A388 JZ 6000A3F6
016F:6000A38A CMP WORD [ESP+01CC],03F0
016F:6000A394 JNZ 6000A3C2
016F:6000A396 PUSH BYTE +01
016F:6000A398 CALL 6002FD1B
016F:6000A39D MOV EAX,[ESI+3C]
016F:6000A3A0 MOV ECX,[EAX+1C]
016F:6000A3A3 PUSH ECX
016F:6000A3A4 CALL `USER32!SetForegroundWindow`
016F:6000A3AA MOV EAX,[ESI+3C]
016F:6000A3AD MOV EDX,[EAX+1C]
016F:6000A3B0 PUSH EDX
016F:6000A3B1 CALL `USER32!SetActiveWindow`
016F:6000A3B7 PUSH EAX
016F:6000A3B8 CALL 6002B848
016F:6000A3BD JMP 6000A559
016F:6000A3C2 CALL 6000E220
016F:6000A3C7 TEST EAX,EAX
016F:6000A3C9 JZ NEAR 6000A570
016F:6000A3CF MOV EAX,[ESI+3C]
016F:6000A3D2 LEA ECX,[ESP+18]
016F:6000A3D6 PUSH ECX
016F:6000A3D7 MOV EDX,[EAX+1C]
016F:6000A3DA PUSH EDX
016F:6000A3DB CALL `USER32!GetWindowRect`
016F:6000A3E1 MOV ECX,[ESI+3C]
016F:6000A3E4 PUSH BYTE +01
016F:6000A3E6 MOV EAX,[ECX]
016F:6000A3E8 CALL NEAR [EAX+74]
016F:6000A3EB MOV ECX,[ESI+3C]
016F:6000A3EE MOV EDX,[ECX]
016F:6000A3F0 CALL NEAR [EDX+58]
016F:6000A3F3 MOV [ESI+3C],EBP
016F:6000A3F6 CMP [ESI+3C],EBP
016F:6000A3F9 JNZ NEAR 6000A559
016F:6000A3FF PUSH EDI
016F:6000A400 PUSH EBP
016F:6000A401 PUSH DWORD 60052214
016F:6000A406 LEA ECX,[ESP+34]
016F:6000A40A CALL 6000DE00
016F:6000A40F MOV EAX,[ESP+68]
016F:6000A413 MOV DWORD [ESP+01C4],01
016F:6000A41E OR AL,02
016F:6000A420 MOV [ESP+68],EAX
016F:6000A424 CALL 6003C4E3
016F:6000A429 MOV EAX,[EAX+08]
016F:6000A42C PUSH EBP
016F:6000A42D PUSH BYTE +10
016F:6000A42F PUSH BYTE +10
016F:6000A431 PUSH BYTE +01
016F:6000A433 PUSH DWORD 8E
016F:6000A438 PUSH EAX
016F:6000A439 CALL `USER32!LoadImageA`
016F:6000A43F MOV [ESP+74],EAX
016F:6000A443 LEA EAX,[ESP+28]
016F:6000A447 LEA ECX,[ESP+28]
016F:6000A44B MOV [ESI+3C],EAX
016F:6000A44E CALL 600387D8
016F:6000A453 LEA ECX,[ESP+28]
016F:6000A457 MOV [ESI+3C],EBP
016F:6000A45A MOV [ESP+01C4],EBX
016F:6000A461 CALL 6000E120

标 题:注册流程 (269字)
发信人:[最弱智]
时 间:2001-1-26 20:31:50
详细信息:

 注册号：ab

a和b是32进制数。

设magic[]={0x5733a0c3, 0x155cf8be, 0xffc55d8d, 0x11cf424, 0x7117d5b1, 0x4baf5541,
    0x83179f31, 0x20f3f593};

md5init();
md5padding(magic);
md5padding(a);
md5padding(magic);
md5finish();
s=md5[0~4];

如果s==b，则认为注册成功。

附其它讨论：

标 题:不可逆很恐怖吗？ (445字)
发信人:1212
时 间:2001-1-27 15:37:41
详细信息:

象下面这样的即使用了不可逆算法又有什么难度呢？还不是轻而易举地写出注册机来？

if ( MD5(UserName) == SerialNumber )
{
Registered = TRUE;
}
else
{
Registered = FALSE;
}

而象下面的即使软件作者自己是最天才伟大的数学家也无法弄出注册机来，这样有什么意义呢？

if ( MD5(SerialNumber) == UserName )
{
Registered = TRUE;
}
else
{
Registered = FALSE;
}

若用MD5来对指令机器码进行运算，软件作者自己也无法搞定。


Core 的crackme2

 题:Core的crackme2
发信人:1212
时 间:2000-12-15 17:03:10
详细信息:
原算法：

1. userinfo + strrev( userinfo ) => string
2. 求 md[ 4 ] = altered_MD5( string )
3. ( code0, code1 ) = decrypt( code1, code2 )
4. ( code1, code2 ) = decrypt( code1, code2 )
5. if( md[0] == code0 && md[1] == code1 && md[2] == code2 )
then regok();

注解：
1. 头一部分是修改过的 MD5
2. 两重 decrypt 避免了穷举攻击，这两重 decrypt 是交错的，这使得算法可以更加有效地避免穷举攻击 。
3. decrypt() 中使用两个由 32 个 64 位数构成的 s-box 对输入的 64 位数进行 32 轮置换；该 s-box 是随机生成的
4. 这种加密是基于算法的强度，不是基于 password 或者 s-box 的强度的，存在另外一个算法，该算法既可以实现加密，也可以实现解密。crackme2 中使用的解密流程是经过有意修改的，使得解密者必须在理解它的基础上反推出该双向算法


oicq目录下面的hash.dat

 标 题:oicq目录下面的hash.dat
发信人:最弱智
时 间:2000-12-1 16:19:15
详细信息:
是oicq.exe的md5校验和。oicq就是通过这个判断是否被修改了的。

标 题:md5 generator
发信人:最弱智
时 间:2000-12-1 16:31:17
详细信息:

 VC6 编译：

c:\> cl mdx.c

使用：

c:\> cl oicq.exe

md5 = xx xx ............

[MDX.C]
#include    <io.h>
#include    <conio.h>
#include    <fcntl.h>
#include    <stdio.h>
#include    <stdlib.h>

#pragma intrinsic( _rotl )

#define    BLOCK    0x40
#define    BUFFER    0x6000

typedef    unsigned char    BYTE;
typedef    unsigned int    WORD;
typedef    unsigned long    DWORD;

void MDInit( DWORD *pMD )
{
pMD[ 0 ] = 0x67452301;
pMD[ 1 ] = 0xefcdab89;
pMD[ 2 ] = 0x98badcfe;
pMD[ 3 ] = 0x10325476;
}

void MD5Calc( DWORD *pData, DWORD *pMD5 )
{
static DWORD MD51[] = {
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821
};
static DWORD MD52[] = {
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a
};
static DWORD MD53[] = {
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665
};
static DWORD MD54[] = {
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};

WORD    i;
DWORD    t1, t2, t3, t4;

t1 = pMD5[ 0 ];
t2 = pMD5[ 1 ];
t3 = pMD5[ 2 ];
t4 = pMD5[ 3 ];

for( i = 0; i < 0x4; i ++ ){
t1 += ( ( ~t2 & t4 ) | ( t2 &
  t3 ) ) + MD51[ i * 4 ];
t1 = _rotl( t1 + pData[ i * 4 ], 7 ) +
  t2;

t4 += ( ( ~t1 & t3 ) | ( t1 &
  t2 ) ) + MD51[ i * 4 + 1];
t4 = _rotl( t4 + pData[ i * 4 + 1 ], 0xc
  ) + t1;

t3 += ( ( ~t4 & t2 ) | ( t4 &
  t1 ) ) + MD51[ i * 4 + 2 ];
t3 = _rotl( t3 + pData[ i * 4 + 2 ], 0x11
  ) + t4;

t2 += ( ( ~t3 & t1 ) | ( t3 &
  t4 ) ) + MD51[ i * 4 + 3 ];
t2 = _rotl( t2 + pData[ i * 4 + 3 ], 0x16
  ) + t3;
}

for( i = 0; i < 0x4; i ++ ){
t1 += ( ( ~t4 & t3 ) | ( t2 &
  t4 ) ) + MD52[ i * 4 ];
t1 = _rotl( t1 + pData[ ( i * 4 + 1 )
  & 0xf ], 5 ) + t2;

t4 += ( ( ~t3 & t2 ) | ( t1 &
  t3 ) ) + MD52[ i * 4 + 1 ];
t4 = _rotl( t4 + pData[ ( i * 4 + 0x6
  ) & 0xf ], 9 ) + t1;

t3 += ( ( ~t2 & t1 ) | ( t4 &
  t2 ) ) + MD52[ i * 4 + 2 ];
t3 = _rotl( t3 + pData[ ( i * 4 + 0xb
  ) & 0xf ], 0xe ) + t4;

t2 += ( ( ~t1 & t4 ) | ( t3 &
  t1 ) ) + MD52[ i * 4 + 3 ];
t2 = _rotl( t2 + pData[ ( i * 4 ) &
  0xf ], 0x14 ) + t3;
}

for( i = 0; i < 0x4; i ++ ){
t1 += ( t2 ^ t3 ^ t4 ) + MD53[ i * 4 ];
t1 = _rotl( t1 + pData[ ( i * 0xc + 5
  ) & 0xf ], 4 ) + t2;

t4 += ( t1 ^ t2 ^ t3 ) + MD53[ i * 4 +
  1 ];
t4 = _rotl( t4 + pData[ ( i * 0xc + 8
  ) & 0xf ], 0xb ) + t1;

t3 += ( t1 ^ t4 ^ t2 ) + MD53[ i * 4 +
  2 ];
t3 = _rotl( t3 + pData[ ( i * 0xc + 0xb
  ) & 0xf ], 0x10 ) + t4;

t2 += ( t3 ^ t4 ^ t1 ) + MD53[ i * 4 +
  3 ];
t2 = _rotl( t2 + pData[ ( i * 0xc + 0xe
  ) & 0xf ], 0x17 ) + t3;
}

for( i = 0; i < 0x4; i ++ ){
t1 += ( ( ~t4 | t2 ) ^ t3 ) + MD54[ i
  * 4 ];
t1 = _rotl( t1 + pData[ ( i * 0xc ) &
  0xf ], 6 ) + t2;

t4 += ( ( ~t3 | t1 ) ^ t2 ) + MD54[ i
  * 4 + 1 ];
t4 = _rotl( t4 + pData[ ( i * 0xc + 0x7
  ) & 0xf ], 0xa ) + t1;

t3 += ( ( ~t2 | t4 ) ^ t1 ) + MD54[ i
  * 4 + 2 ];
t3 = _rotl( t3 + pData[ ( i * 0xc + 0xe
  ) & 0xf ], 0xf ) + t4;

t2 += ( ( ~t1 | t3 ) ^ t4 ) + MD54[ i
  * 4 + 3 ];
t2 = _rotl( t2 + pData[ ( i * 0xc + 0x5
  ) & 0xf ], 0x15 ) + t3;
}

pMD5[ 0 ] += t1;
pMD5[ 1 ] += t2;
pMD5[ 2 ] += t3;
pMD5[ 3 ] += t4;

}

main( int argc, char *argv[] )
{
int    nHandle, nSize, i, nFlag;
BYTE    *pBuffer;
DWORD    MD5[ 4 ], *pData;
long    lSize;

if( argc == 1 ){
printf( "Usage: MDX <file>\n" );
exit( -1 );
}

pBuffer = ( BYTE * )malloc( ( BUFFER + 0x50 ) * sizeof( BYTE
  ) );
if( !pBuffer ){
printf( "Mallocate memory error.\n" );
exit( -1 );
}

nHandle = open( argv[ 1 ], O_RDONLY | O_BINARY );
if( nHandle == -1l ){
printf( "Can not opening file \"%s\".\n",
  argv[ 1 ] );
exit( -1 );
}

lSize = filelength( nHandle );
if( lSize == 0 | lSize == -1 ){
printf( "File is empty or too large\n"
  );
exit( -1 );
}

MDInit( MD5 );
nFlag = 1;
while( nFlag ){
nSize = read( nHandle, pBuffer, BUFFER
  );
if( nSize == -1 ){
printf( "Can not read
  from file.\n" );
exit( -1 );
}
if( nSize != BUFFER ){
nFlag = 0;
memset( &pBuffer[
  nSize ], 0, 0x4f );
pBuffer[ nSize++ ]
  = 0x80;
i = 0x40 - ( nSize
  & 0x3f );
nSize += ( i > 7 )
  ? i : i + 0x40 ;
*( (long *)&pBuffer[
  nSize - 8 ] ) = ( lSize << 3 );
}
for( i = 0; i < nSize; i += 0x40 ){
pData = ( DWORD * )(
  &pBuffer[ i ] );
MD5Calc( pData, MD5
  );
}
};

close( nHandle );
free( pBuffer );

pBuffer = ( BYTE * ) MD5;
printf( "\nMD5 = ", argv[ 1 ] );
for( i = 0; i < 0x10; i ++ ) printf( "%02X ", *pBuffer
  ++ );
printf( "\n" );
}

Netguy 于 2000-11-24 14:20:04 加贴在 灌水乐园：

Disclaimer: This is only for educational purpose. Use it at your own risk!

Take the following steps to simply prevent oicq2000 build 1115 from displaying advertisement pics:
1、rename "oicq.exe" to "old_oicq.exe"（It is packed with ASPack）.
2、compile the following prog to "oicq.exe", put it in the same directory with old_oicq.exe.

Version: oicq 2000 build 1115

#include <windows.h>
#include <stdio.h>

const char FileName[ ] = "Old_OICQ.exe";
const long PATCH_SIZE = 3;
void *BaseAddr = (void *)0x0042A9D2L;

const char NewBytes[] = { 0xE9, 0x22, 0x01 };
const char OldBytes[] = { 0x53, 0x68, 0x80 };
char TmpBytes[3];

void main(void)
{
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcessInfo;
unsigned long OldProtect;
unsigned long BytesWritten;
unsigned long BytesRead;
int k, len;
char Path[512];

printf("AD remover for OICQ 2000 buid 1115.\n");
printf("Coded by Netguy.\n");
printf("Please wait while OICQ is loading...\n");

__try
{
GetModuleFileName(NULL, Path, 512);
len = lstrlen(Path);
Path[len - 8] = '\0';
SetCurrentDirectory(Path);

ZeroMemory(& StartInfo, sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
if (CreateProcess( FileName,
NULL,
NULL,
NULL,
FALSE,
NULL,
NULL,
NULL,
&StartInfo,
&ProcessInfo
) == 0)
{
__leave;
}

if (WaitForInputIdle(ProcessInfo.hProcess, INFINITE) != 0)
{
__leave;
}

if (VirtualProtectEx(ProcessInfo.hProcess, BaseAddr, PATCH_SIZE,
PAGE_READWRITE, &OldProtect) == 0)
{
__leave;
}

if (ReadProcessMemory(ProcessInfo.hProcess, BaseAddr, TmpBytes, PATCH_SIZE,
&BytesRead) == 0)
{
__leave;
}

k = 0;
while(OldBytes[k] == TmpBytes[k]) k++;
if (k < PATCH_SIZE) __leave;

WriteProcessMemory(ProcessInfo.hProcess, BaseAddr, NewBytes, PATCH_SIZE,
&BytesWritten);
}
__finally
{
if (ProcessInfo.hProcess)
{
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
}
}


Awave Studio v7.0

 标 题:Awave Studio v7.0的破解
发信人:superboss
时 间:2000-12-5 10:48:11
详细信息:
Awave Studio v7.0的破解
工具:TRW2000和Wdasm 8.93 Gold版(http://go.163.com/~wuhuashang/gold.exe)
目标说明:一个能转换几乎所有音频格式的工具，用于聆听不同平台音频文件的最好工具之一，
你可以以各种方式使用它：音频文件格式转换器、音频编辑器、音频播放器、以及作
为一个通用波表合成器格式的转换器和编辑器。Awave可以读取差不多所有的音频文
件格式，同时它可以输出大部分流行的音频文件格式。
难度:中级?
下载地址:http://www.fmjsoft.com
==================================================================================
Awave Studio v7.0是用Asprotect加的壳，无法直接用Wdasm反汇编，只有先找到它的OEP，再从内存
中Dump出脱离壳后的文件映像(无需重建Import Table)，具体过程可参看《论坛精华 II》中的教程！
运行Wdasm 8.93(Gold版)反汇编Dump出来的文件，在String Data References中会看到"Registered to:%s"
的字样。通过RegMon监测，该软件启动时会校验注册表中的Username和Usercode两个键值，已确定是否已注册。
为了便于跟踪，可手动建立下列两个键及键值：
[HKEY_CURRENT_USER\Software\FMJ-Software\Awave Studio]
"Username"="sUpErbOss"
"Usercode"="1122334455"
启动TRW2000，加载Awave Studio，点击"Load"按钮。进入到TRW2000环境，下指令"faults off"，
再打"G 0046E22C",即可！
:0046E22C E82F140000 call 0046F660 <----重点！！(这是一个共用Call！)
:0046E231 84C0 test al, al <----al=0，则为注册版！
:0046E233 7410 je 0046E245
:0046E235 8B06 mov eax, dword ptr [esi]
:0046E237 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Unregistered copy"
|
:0046E239 689CD34C00 push 004CD39C
:0046E23E 8BCE mov ecx, esi
:0046E240 FF500C call [eax+0C]
:0046E243 EB44 jmp 0046E289

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046E233(C)
|
:0046E245 68ADF04D00 push 004DF0AD
:0046E24A 8D4C2444 lea ecx, dword ptr [esp+44]

* Possible StringData Ref from Data Obj ->"Registered to: %s"
|
:0046E24E 6888D34C00 push 004CD388
:0046E253 51 push ecx
:0046E254 E826810300 call 004A637F

================================================================================
* Referenced by a CALL at Addresses:
|:0046E22C , :0046EAC5 , :0046EB17
|
:0046F660 53 push ebx
:0046F661 56 push esi
:0046F662 68E8030000 push 000003E8
:0046F667 E82F6A0300 call 004A609B
:0046F66C 83C404 add esp, 00000004
:0046F66F 8BF0 mov esi, eax
:0046F671 E81A000000 call 0046F690 <--------核心Call(1)！跟进去！！
:0046F676 8AD8 mov bl, al
:0046F678 A05CF44D00 mov al, byte ptr [004DF45C]
:0046F67D 56 push esi
:0046F67E 84C0 test al, al
:0046F680 E80B6A0300 call 004A6090
:0046F685 83C404 add esp, 00000004
:0046F688 8AC3 mov al, bl
:0046F68A 5E pop esi
:0046F68B 5B pop ebx
:0046F68C C3 ret

===============================================================================
* Referenced by a CALL at Address:
|:0046F671
|
:0046F690 E80B000000 call 0046F6A0 <-----继续跟进！
:0046F695 F6D8 neg al
:0046F697 1BC0 sbb eax, eax
:0046F699 40 inc eax
:0046F69A C3 ret

=============================================================================
* Referenced by a CALL at Address:
|:0046F690
|
:0046F6A0 B9D0E34D00 mov ecx, 004DE3D0
:0046F6A5 C6055CF44D0001 mov byte ptr [004DF45C], 01
:0046F6AC E81F95FFFF call 00468BD0 <-----继续跟进！
:0046F6B1 F6D8 neg al
:0046F6B3 1BC0 sbb eax, eax
:0046F6B5 40 inc eax
:0046F6B6 C3 ret
=============================================================================
* Referenced by a CALL at Addresses:
|:0046445C , :00466ECC , :0046BB9C , :0046F6AC , :0047E6CC
|
:00468BD0 83EC1C sub esp, 0000001C

* Possible StringData Ref from Data Obj ->"裃j?c佀4UN塳桗勩菥?篤顤'` 鯚骸?"
->".啅L摚|菹Q赕暌??
|
:00468BD3 C705B8F14D00D8AC4C00 mov dword ptr [004DF1B8], 004CACD8
:00468BDD 53 push ebx
:00468BDE 55 push ebp
:00468BDF 8BE9 mov ebp, ecx
:00468BE1 57 push edi
:00468BE2 6A06 push 00000006

* Possible StringData Ref from Data Obj ->"@DATE="
|
:00468BE4 68ACB54C00 push 004CB5AC
:00468BE9 8D9DDD0C0000 lea ebx, dword ptr [ebp+00000CDD]
:00468BEF 53 push ebx
:00468BF0 E8AB930400 call 004B1FA0
:00468BF5 83C40C add esp, 0000000C
:00468BF8 85C0 test eax, eax <----eax=1
:00468BFA 0F85B1000000 jne 00468CB1
=============================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00468BFA(C), :00468CA6(C)
|
:00468CB1 8B0DB8F14D00 mov ecx, dword ptr [004DF1B8]
:00468CB7 8B95610D0000 mov edx, dword ptr [ebp+00000D61]
:00468CBD 51 push ecx
:00468CBE 8BFB mov edi, ebx
:00468CC0 83C9FF or ecx, FFFFFFFF
:00468CC3 33C0 xor eax, eax
:00468CC5 81C5210D0000 add ebp, 00000D21
:00468CCB 52 push edx
:00468CCC F2 repnz
:00468CCD AE scasb
:00468CCE F7D1 not ecx
:00468CD0 49 dec ecx
:00468CD1 55 push ebp
:00468CD2 51 push ecx
:00468CD3 53 push ebx
:00468CD4 E807BB0300 call 004A47E0 <-----继续跟进！
:00468CD9 85C0 test eax, eax
:00468CDB 5F pop edi
:00468CDC 5D pop ebp
:00468CDD 0F95C0 setne al
:00468CE0 5B pop ebx
:00468CE1 83C41C add esp, 0000001C
:00468CE4 C3 ret
=============================================================================
* Referenced by a CALL at Addresses:
|:00468CD4 , :00468DEE
|
:004A47E0 81ECD0000000 sub esp, 000000D0
:004A47E6 8D442438 lea eax, dword ptr [esp+38]
:004A47EA 56 push esi
:004A47EB 50 push eax
:004A47EC E84F010000 call 004A4940
:004A47F1 8D44243C lea eax, dword ptr [esp+3C]
:004A47F5 8B8C24DC000000 mov ecx, dword ptr [esp+000000DC]
:004A47FC 8B9424D8000000 mov edx, dword ptr [esp+000000D8]
:004A4803 51 push ecx
:004A4804 52 push edx
:004A4805 50 push eax
:004A4806 E865010000 call 004A4970
:004A480B 8BB424E4000000 mov esi, dword ptr [esp+000000E4]
:004A4812 83FE40 cmp esi, 00000040
:004A4815 760F jbe 004A4826 <-----跳转！！
:004A4817 B899090000 mov eax, 00000999
:004A481C 5E pop esi
:004A481D 81C4D0000000 add esp, 000000D0
:004A4823 C21400 ret 0014

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A4815(C)
|
:004A4826 8D4C243C lea ecx, dword ptr [esp+3C]
:004A482A 53 push ebx
:004A482B 8D54240C lea edx, dword ptr [esp+0C]
:004A482F 51 push ecx
:004A4830 52 push edx
:004A4831 33DB xor ebx, ebx <-----令ebx=0！！
:004A4833 E8E8010000 call 004A4A20
:004A4838 8D44240C lea eax, dword ptr [esp+0C]
:004A483C 8D4C241C lea ecx, dword ptr [esp+1C]
:004A4840 50 push eax
:004A4841 51 push ecx
:004A4842 E899000000 call 004A48E0
:004A4847 8D4C2408 lea ecx, dword ptr [esp+08]
:004A484B 8B9424EC000000 mov edx, dword ptr [esp+000000EC]
:004A4852 8B8424E4000000 mov eax, dword ptr [esp+000000E4]
:004A4859 52 push edx
:004A485A 56 push esi
:004A485B 50 push eax
:004A485C 8D9424A4000000 lea edx, dword ptr [esp+000000A4]
:004A4863 51 push ecx
:004A4864 52 push edx
:004A4865 E8860C0000 call 004A54F0 <-----------比对Call！！
:004A486A 85C0 test eax, eax
:004A486C 7540 jne 004A48AE <----将此处改为jne 004A48A1！
:004A486E 8B442408 mov eax, dword ptr [esp+08]

* Possible Reference to Dialog: DialogID_0022
|
:004A4872 B922000000 mov ecx, 00000022
:004A4877 3BC1 cmp eax, ecx <--------比对eax=22?
:004A4879 7545 jne 004A48C0
:004A487B 57 push edi
:004A487C 8D7C2420 lea edi, dword ptr [esp+20]
:004A4880 8DB4249C000000 lea esi, dword ptr [esp+0000009C]
:004A4887 33C0 xor eax, eax <---令eax=0！！
:004A4889 F3 repz
:004A488A A6 cmpsb <-------EDI与ESI指向的内容，比对22个字节！！
:004A488B 5F pop edi
:004A488C 7405 je 004A4893
:004A488E 1BC0 sbb eax, eax
:004A4890 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A488C(C)
|
:004A4893 85C0 test eax, eax <---eax=0
:004A4895 7529 jne 004A48C0
:004A4897 8D442440 lea eax, dword ptr [esp+40]
:004A489B 50 push eax
:004A489C E89F000000 call 004A4940
:004A48A1 8BC3 mov eax, ebx <----eax=ebx=0(注册成功的标志)
:004A48A3 5B pop ebx
:004A48A4 5E pop esi
:004A48A5 81C4D0000000 add esp, 000000D0
:004A48AB C21400 ret 0014

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A486C(C)
|
:004A48AE BB88080000 mov ebx, 00000888
:004A48B3 8BC3 mov eax, ebx
:004A48B5 5B pop ebx
:004A48B6 5E pop esi
:004A48B7 81C4D0000000 add esp, 000000D0
:004A48BD C21400 ret 0014

=======================================================================
* Referenced by a CALL at Address:
|:004A4865
|
:004A54F0 8B442410 mov eax, dword ptr [esp+10]
:004A54F4 83EC40 sub esp, 00000040
:004A54F7 83F840 cmp eax, 00000040
:004A54FA 0F878B000000 ja 004A558B
:004A5500 8B4C2454 mov ecx, dword ptr [esp+54]
:004A5504 8B54244C mov edx, dword ptr [esp+4C]
:004A5508 51 push ecx
:004A5509 50 push eax
:004A550A 8D442458 lea eax, dword ptr [esp+58]
:004A550E 52 push edx
:004A550F 8D4C240C lea ecx, dword ptr [esp+0C]
:004A5513 50 push eax
:004A5514 51 push ecx
:004A5515 E886000000 call 004A55A0
:004A551A 85C0 test eax, eax
:004A551C 7572 jne 004A5590
:004A551E 837C245040 cmp dword ptr [esp+50], 00000040 <----[esp+50]=40
:004A5523 7566 jne 004A558B
:004A5525 8A442400 mov al, byte ptr [esp] <-----[esp]=0
:004A5529 84C0 test al, al
:004A552B 755E jne 004A558B
:004A552D 807C240101 cmp byte ptr [esp+01], 01<------[esp+01]=1
:004A5532 7557 jne 004A558B
:004A5534 B802000000 mov eax, 00000002
:004A5539 B1FF mov cl, FF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A5545(C)
|
:004A553B 384C0400 cmp byte ptr [esp+eax], cl <-----[esp+eax]=FF
:004A553F 7506 jne 004A5547
:004A5541 40 inc eax
:004A5542 83F83F cmp eax, 0000003F <---比对27次！eax=1d
:004A5545 72F4 jb 004A553B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A553F(C)
|
:004A5547 8A540400 mov dl, byte ptr [esp+eax] <-------dl=0
:004A554B 40 inc eax <-----eax=1d+1=1e
:004A554C 84D2 test dl, dl
:004A554E 753B jne 004A558B
:004A5550 8B542448 mov edx, dword ptr [esp+48]

* Possible Reference to Dialog: DialogID_0040
|
:004A5554 B940000000 mov ecx, 00000040
:004A5559 2BC8 sub ecx, eax <-----ecx=22，eax=1e
:004A555B 890A mov dword ptr [edx], ecx
:004A555D 8D510B lea edx, dword ptr [ecx+0B]
:004A5560 83FA40 cmp edx, 00000040
:004A5563 7726 ja 004A558B
:004A5565 85C9 test ecx, ecx
:004A5567 741A je 004A5583
:004A5569 56 push esi
:004A556A 8D740404 lea esi, dword ptr [esp+eax+04]
:004A556E 8BC1 mov eax, ecx
:004A5570 57 push edi
:004A5571 8B7C244C mov edi, dword ptr [esp+4C]
:004A5575 C1E902 shr ecx, 02
:004A5578 F3 repz
:004A5579 A5 movsd
:004A557A 8BC8 mov ecx, eax
:004A557C 83E103 and ecx, 00000003
:004A557F F3 repz
:004A5580 A4 movsb
:004A5581 5F pop edi
:004A5582 5E pop esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A5567(C)
|
:004A5583 33C0 xor eax, eax
:004A5585 83C440 add esp, 00000040
:004A5588 C21400 ret 0014

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004A54FA(C), :004A5523(C), :004A552B(C), :004A5532(C), :004A554E(C)
|:004A5563(C)
|
:004A558B B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A551C(C)
|
:004A5590 83C440 add esp, 00000040
:004A5593 C21400 ret 0014
========================================================================
此软件的注册码的计算好像用到了RSA算法，要算出注册码是很困难的。但很明显，用暴力
法破解它是非常容易的，只需将004A486C处的jne 004A48AE改为jne 004A48A1，即可！
当然，改法不止这一种！由于Awave Studio被Asprotect加了壳，而最新的Asprotect的
脱壳软件Caspr v0.952对它脱壳不完整，造成脱壳后，Awave Studio运行出错！所以，无法
在脱壳后修改，只有写一个Loader搞定它！Loader源码如下：(已经调试通过）

; tasm32 /ml loader.asm
; tlink32 /Tpe /aa /c loader,loader,, <path to> import32.lib
; 以上两行是编译命令，需用到TASM 5.0！

.386P
model flat,stdcall
locals
jumps

Extrn MessageBoxA:PROC
Extrn WaitForInputIdle:PROC

Extrn WriteProcessMemory:PROC
Extrn ReadProcessMemory:PROC
Extrn CreateProcessA:PROC
Extrn CloseHandle:PROC
Extrn ExitProcess:PROC

;-=-Normal data-=-=-=-=-=-=-=-=-=-=-=-=-=
.Data
CSiR_Tag db 'Awave Studio v7.0 (Loader),by sUpErbOss ',0
CSiR_Error db 'Error!!!',0
CSiR_Error1 db 'Something wrong!!...',0
OpenERR_txt db 'CreateProcess Error :(',0
ReadERR_txt db 'ReadProcessMemory Error :(',
WriteERR_txt db 'WriteProcessMemory Error :P',0
VersionERR_txt db 'Incorrect Version of application :(',0
CSiR_ProcessInfo dd 4 dup (0) ;process handles
CSiR_StartupInfo db 48h dup (0) ;startup info for the process were opening
CSiR_RPBuffer db 2h dup (0) ;read buffer, for checking data

;-=-Patch datas-=-=-=-=-=-=-=-=-=-=-=-=-=

CSiR_AppName db 'Awave.EXE',0
AwaveVer dd 004a486ch ; address to read data from for version checking
sizeof dd 2 ; in the new process

checkbytes db 075h,040h ; the bytes to check for
; if there not there, we have the wrong version??
patch_data_1 db 033h
patch_size_1 dd 1
patch_addr_1 dd 004a486dh

.Code
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Main:
push offset CSiR_Tag
mov dword ptr [CSiR_StartupInfo],44h ; (the size in bytes of the structure)
push offset CSiR_ProcessInfo ; Typedef struct _PROCESS_INFORMATION
push offset CSiR_StartupInfo ; Pointer to STARTUPINFO structure
push 0
push 0
push 20h ; Creation flags
push 0
push 0
push 0
push 0
push offset CSiR_AppName ; Pointer to name of executable mod
call CreateProcessA
test eax,eax
jz OpenERR

Wait4Depack:
push 500 ; 此处的时间等待值请根据自己的机器配置调整,俺的是赛扬566、128M内存！
; Timeout (in milliseconds, -1 = infinate)

push dword ptr [CSiR_ProcessInfo]
call WaitForInputIdle

Check_Data:

push 0 ; BytesRead
push dword ptr [sizeof] ; Length
push offset CSiR_RPBuffer ; Destination (to read them to)
push dword ptr [AwaveVer] ; Source
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to read
call ReadProcessMemory
test eax,eax
jz ReadERR
cld
lea esi, CSiR_RPBuffer
lea edi, checkbytes
mov ecx, 2
rep cmpsb
jnz VersionERR

Patch_the_mother:
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_1] ; Length
push offset patch_data_1 ; Source
push dword ptr [patch_addr_1] ; Destination
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to patch
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR

Close_This_app:
push dword ptr [CSiR_ProcessInfo]
call CloseHandle
push dword ptr [CSiR_ProcessInfo+4]
call CloseHandle

Exit_Proc:
Push LARGE-1
Call ExitProcess

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
VersionERR:
lea eax, VersionERR_txt
jmp abort
ReadERR:
lea eax, ReadERR_txt
jmp abort
OpenERR:
lea eax, OpenERR_txt
jmp abort
WriteERR:
lea eax, WriteERR_txt
abort:
push 0
push offset CSiR_Error ; Title
push eax ; Message
push 0
call MessageBoxA
jmp Close_This_app
end Main


Windows优化大师

 标 题:可恨的Windows优化大师 (3千字)
发信人:1212
时 间:2000-8-1 19:05:46
详细信息:
在我研究此程序时竟然无意中看到了这样一句话:You are big pig.虽然我的英文次到了极点,但这句话的大概意思也知道,我想不会是说作者自己吧!

015F:004C5A0B CMP DWORD [EBP-04],BYTE +00
015F:004C5A0F JZ 004C5A25
015F:004C5A11 LEA EDX,[EBP-08]
015F:004C5A14 MOV EAX,[EBX+02DC]
015F:004C5A1A CALL 0042F6E8
015F:004C5A1F CMP DWORD [EBP-08],BYTE +00
015F:004C5A23 JNZ 004C5A42
015F:004C5A25 PUSH BYTE +10
015F:004C5A27 MOV ECX,004C5B98
015F:004C5A2C MOV EDX,004C5BA8
015F:004C5A31 MOV EAX,[004F9DB0]
015F:004C5A36 MOV EAX,[EAX]
015F:004C5A38 CALL 0044BD40
015F:004C5A3D JMP 004C5B6E
015F:004C5A42 LEA EDX,[EBP-04]
015F:004C5A45 MOV EAX,[EBX+02D8]
015F:004C5A4B CALL 0042F6E8
015F:004C5A50 MOV EAX,[EBP-04]
015F:004C5A53 CALL 004C5908
015F:004C5A58 CDQ 输入的第一注册码
015F:004C5A59 PUSH EDX
015F:004C5A5A PUSH EAX
015F:004C5A5B LEA EDX,[EBP-04]
015F:004C5A5E MOV EAX,[EBX+02DC]
015F:004C5A64 CALL 0042F6E8
015F:004C5A69 MOV EAX,[EBP-04]
015F:004C5A6C CALL 004C5908
015F:004C5A71 CDQ 输入的第二注册码
015F:004C5A72 PUSH EDX
015F:004C5A73 PUSH EAX
015F:004C5A74 LEA EDX,[EBP-04]
015F:004C5A77 MOV EAX,[EBX+02D4]
015F:004C5A7D CALL 0042F6E8
015F:004C5A82 MOV EAX,[EBP-04]
015F:004C5A85 CALL 00404074
015F:004C5A8A CALL `OCTODLL!Registed` 检测注册码
015F:004C5A8F CMP EAX,BYTE +14
015F:004C5A92 JZ 004C5AB1 相等则转到4c5ab1
015F:004C5A94 PUSH BYTE +10
015F:004C5A96 MOV ECX,004C5B98
015F:004C5A9B MOV EDX,004C5BC4
015F:004C5AA0 MOV EAX,[004F9DB0]
015F:004C5AA5 MOV EAX,[EAX]
015F:004C5AA7 CALL 0044BD40 跳出失败对话框,Game Over.
015F:004C5AAC JMP 004C5B6E
015F:004C5AB1 MOV DL,01
015F:004C5AB3 MOV EAX,[004528A8]
015F:004C5AB8 CALL 004529E8
015F:004C5ABD MOV ESI,EAX
015F:004C5ABF MOV EDX,80000002
015F:004C5AC4 MOV EAX,ESI
015F:004C5AC6 CALL 00452A80
015F:004C5ACB MOV CL,01
015F:004C5ACD MOV EDX,004C5BF0
015F:004C5AD2 MOV EAX,ESI
015F:004C5AD4 CALL 00452BDC
015F:004C5AD9 LEA EDX,[EBP-04]
015F:004C5ADC MOV EAX,[EBX+02D8]
015F:004C5AE2 CALL 0042F6E8
015F:004C5AE7 MOV ECX,[EBP-04]
015F:004C5AEA MOV EDX,004C5C08
015F:004C5AEF MOV EAX,ESI
015F:004C5AF1 CALL 0045312C
015F:004C5AF6 LEA EDX,[EBP-04]
015F:004C5AF9 MOV EAX,[EBX+02DC]
015F:004C5AFF CALL 0042F6E8
015F:004C5B04 MOV ECX,[EBP-04]
015F:004C5B07 MOV EDX,004C5C1C
015F:004C5B0C MOV EAX,ESI
015F:004C5B0E CALL 0045312C
015F:004C5B13 MOV EAX,ESI
015F:004C5B15 CALL 00452A50
015F:004C5B1A MOV EAX,ESI
015F:004C5B1C CALL 00402FC4
015F:004C5B21 PUSH BYTE +40
015F:004C5B23 MOV ECX,004C5B98
015F:004C5B28 MOV EDX,004C5C28
015F:004C5B2D MOV EAX,[004F9DB0]
015F:004C5B32 MOV EAX,[EAX]
015F:004C5B34 CALL 0044BD40 跳出注册成功对话框.
015F:004C5B39 MOV EAX,[004F9F4C]
015F:004C5B3E MOV EAX,[EAX]
015F:004C5B40 MOV EAX,[EAX+073C]
015F:004C5B46 MOV EDX,004C5C5C
015F:004C5B4B CALL 0042F718
015F:004C5B50 MOV EAX,[004F9F4C]
015F:004C5B55 MOV EAX,[EAX]
015F:004C5B57 MOV EAX,[EAX+0468]
015F:004C5B5D XOR EDX,EDX
015F:004C5B5F CALL 0042F5D8
015F:004C5B64 MOV EAX,[004FBDDC]
015F:004C5B69 CALL 00448A34
015F:004C5B6E XOR EAX,EAX
015F:004C5B70 POP EDX
015F:004C5B71 POP ECX
015F:004C5B72 POP ECX
015F:004C5B73 MOV [FS:EAX],EDX
015F:004C5B76 PUSH DWORD 004C5B90
015F:004C5B7B LEA EAX,[EBP-08]
015F:004C5B7E MOV EDX,02
015F:004C5B83 CALL 00403C58

标 题:现手头上无工具，大致说说 (497字)
发信人:dr0
时 间:2000-8-2 11:38:04
详细信息:

它先根据软件ID（即每台机器不同的那个软件编号）和字符串“You are a big pig.”以及串“1234567”得到一个数A；

然后把你输入的注册码的两部分各看作一个64位的整数，分别进行迭代运算，每一轮迭代中用的都是64位整数的运算（64位整数的加、减、乘法，由于80586是32位的CPU，所以在处理64位数的运算时要多用几条指令，看起来就复杂一点）。

经过迭代之后，将一部分迭代结果和数A进行比较，并检查另一部分迭代结果是否为常数0x14。如果均OK则注册成功。

由此可见，要得到注册码则要将迭代运算求逆，而直接求逆是比较困难的。

标 题:大致过程。 (8千字)
发信人:hying
时 间:2000-8-4 12:18:36
详细信息:

本人用的windows优化大师是2.5版，其它版本注册算法应该基本相同。
接下来我们大致了解一下，注册涉及三个数：申请码、注册码第一部分和注册码第二部分，但参与计算的申请码并非它本身，而是在显示的申请码后插入“1234567”，然后取前8个数进行计算，我机器上的申请码是162445，故参与计算的是“16244512”，注册码分别用12345678和34567890，计算使用的注册码也非它本身，它会把你输入是注册码"12345678"认为十六进制数"12345678"，十进制就是305419896，在内存中存为“78563412”第二部分也同样，当然注册码中可以有A~F的字母，但必须是大写。还有就是不要忘了“You are big pig”这句话。

先看大致流程：
0167:00544272 MOV EAX,[EDI+ESI*4]
0167:00544275 MOV [EBP-1C],EAX
0167:00544278 MOV EAX,[EDI+ESI*4+04]
0167:0054427C MOV [EBP-18],EAX
0167:0054427F MOV EDX,EBX
0167:00544281 LEA EAX,[EBP-1C]
0167:00544284 CALL 00544170 <--根据申请码计算得数1
0167:00544289 MOV EAX,[EBX]
0167:0054428B MOV [EBX+08],EAX
0167:0054428E MOV EAX,[EBX+04]
0167:00544291 MOV [EBX+0C],EAX
0167:00544294 MOV EAX,[EBP-1C]
0167:00544297 MOV [EBX],EAX
0167:00544299 MOV EAX,[EBP-18]
0167:0054429C MOV [EBX+04],EAX
0167:0054429F ADD ESI,BYTE +02
0167:005442A2 MOV EAX,[EBP-04]
0167:005442A5 CALL 00542F74
0167:005442AA TEST EAX,EAX
0167:005442AC JNS 005442B1
0167:005442AE ADD EAX,BYTE +03
0167:005442B1 SAR EAX,02
0167:005442B4 CMP ESI,EAX
0167:005442B6 JC 00544272
0167:005442B8 MOV EAX,[EBP-10]
0167:005442BB XOR EDX,EDX
0167:005442BD PUSH EDX
0167:005442BE PUSH EAX
0167:005442BF PUSH DWORD [005450D0]
0167:005442C5 PUSH DWORD [005450CC]
0167:005442CB PUSH DWORD [005450D8]
0167:005442D1 PUSH DWORD [005450D4] 根据注册码第一部分计算，
0167:005442D7 CALL 005440B8 〈--结果放入EAX，设为数2
0167:005442DC SUB EAX,BYTE +02 〈--数2减2
0167:005442DF MOV [EBP-24],EAX 〈--放入内存
0167:005442E2 MOV EAX,[EBP-0C]
0167:005442E5 XOR EDX,EDX
0167:005442E7 PUSH EDX
0167:005442E8 PUSH EAX
0167:005442E9 PUSH DWORD [005450D0]
0167:005442EF PUSH DWORD [005450CC]
0167:005442F5 PUSH DWORD [005450D8]
0167:005442FB PUSH DWORD [005450D4] 根据注册码第二部分计算，
0167:00544301 CALL 005440B8 〈--结果放入EAX，设为数3
0167:00544306 SUB EAX,BYTE +02 〈--数3减2
0167:00544309 MOV [EBP-20],EAX 〈--放入内存
0167:0054430C SHL DWORD [EBP-24],02 〈--数2左移2位
0167:00544310 LEA ECX,[EBP-24]
0167:00544313 MOV EAX,[ECX] 〈--取出数2
0167:00544315 MOV EDX,[ECX+04] 〈--取出数3
0167:00544318 SHRD EAX,EDX,02 〈--数2、数3联合移位，数2改变，数3不变
0167:0054431C SHR EDX,02 〈--数3右移2位
0167:0054431F MOV [ECX],EAX 〈--数2放入内存
0167:00544321 MOV [ECX+04],EDX 〈--数3放入内存
0167:00544324 MOV EAX,[EBP-24]
0167:00544327 CMP EAX,[EBP-1C] <--数2与数1如相同则跳转
0167:0054432A JZ 00544330 正确应跳
0167:0054432C XOR EBX,EBX
0167:0054432E JMP SHORT 00544341 〈--如到这句，注册失败
0167:00544330 MOV AX,[EBP-20] 〈--取数3的低16位放入AX，
0167:00544334 AND AX,FFFF 以后验证，正确应为0014
0167:00544338 MOV EDX,[EBP-08]
0167:0054433B MOV [EDX],AX
0167:0054433E OR EBX,BYTE -01
0167:00544341 XOR EAX,EAX
0167:00544343 POP EDX
0167:00544344 POP ECX
0167:00544345 POP ECX
0167:00544346 MOV [FS:EAX],EDX
0167:00544349 PUSH DWORD 00544366
0167:0054434E LEA EAX,[EBP-14]
0167:00544351 CALL 00542E5C
0167:00544356 LEA EAX,[EBP-04]
0167:00544359 CALL 00542E5C
0167:0054435E RET

具体看申请码的计算：
0167:00544170 PUSH EBX
0167:00544171 PUSH ESI
0167:00544172 PUSH EDI
0167:00544173 PUSH ECX
0167:00544174 MOV [ESP],EAX
0167:00544177 MOV EAX,20 <--设定循环次数
0167:0054417C MOV ECX,[ESP]
0167:0054417F MOV ECX,[ECX] <--申请码前4位放入ecx
0167:00544181 MOV EBX,[ESP]
0167:00544184 MOV EBX,[EBX+04] <--申请码后4位放入ebx
0167:00544187 XOR ESI,ESI
0167:00544189 DEC EAX
0167:0054418A ADD ESI,[005450C8]<--esi加常数9e3779b9
0167:00544190 MOV EDI,EBX
0167:00544192 SHL EDI,04
0167:00544195 ADD ECX,EDI
0167:00544197 MOV EDI,[EDX] <--将"You "的ASC码放入edi，
0167:00544199 XOR EDI,EBX 注意高低位及空格
0167:0054419B ADD ECX,EDI
0167:0054419D MOV EDI,EBX
0167:0054419F SHR EDI,05
0167:005441A2 XOR EDI,ESI
0167:005441A4 ADD ECX,EDI
0167:005441A6 ADD ECX,[EDX+04] <--将"are "的ASC码放入ecx，
0167:005441A9 MOV EDI,ECX
0167:005441AB SHL EDI,04
0167:005441AE ADD EBX,EDI
0167:005441B0 MOV EDI,[EDX+08] <--将"big "的ASC码放入edi，
0167:005441B3 XOR EDI,ECX
0167:005441B5 ADD EBX,EDI
0167:005441B7 MOV EDI,ECX
0167:005441B9 SHR EDI,05
0167:005441BC XOR EDI,ESI
0167:005441BE ADD EBX,EDI
0167:005441C0 ADD EBX,[EDX+0C]<--将ebx加上"pig "的ASC码，
0167:005441C3 TEST EAX,EAX
0167:005441C5 JA 00544189 <--回到上面循环
0167:005441C7 MOV EAX,[ESP]
0167:005441CA MOV [EAX],ECX <--ecx的值即为算得的数1
0167:005441CC MOV EAX,[ESP]
0167:005441CF MOV [EAX+04],EBX
0167:005441D2 POP EDX
0167:005441D3 POP EDI
0167:005441D4 POP ESI
0167:005441D5 POP EBX
0167:005441D6 RET
上面这些移来移去实在不明白什么意思，但用C语言或VC来写，还是很容易的，
注册码的计算过程就复杂多了

两个注册码的计算完全一样，看第一个：
计算中涉及到内存中的几个数如下
在内存地址 77f600处有
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx<--数4，初始为01000000，即十进制数1
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx<--数5，初始为E3A0AA69,即十进制数1772789987
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx<--注册码第一部分，初始为78563412，设为数6

计算过程：
0167:005440CE PUSH BYTE +00
0167:005440D0 PUSH BYTE +02
0167:005440D2 MOV EAX,[EBP+10]
0167:005440D5 MOV EDX,[EBP+14]
0167:005440D8 CALL 00543B6D <--判断内存中一数7为奇为偶，
0167:005440DD CMP EDX,BYTE +00 为奇则跳转至0054411B，
0167:005440E0 JNZ 0054411B 数7初始值为994323192
0167:005440E2 CMP EAX,BYTE +00
0167:005440E5 JNZ 0054411B
0167:005440E7 PUSH BYTE +00
0167:005440E9 PUSH BYTE +02
0167:005440EB MOV EAX,[EBP+10]
0167:005440EE MOV EDX,[EBP+14]
0167:005440F1 CALL 00543A7A <--如数7为偶则除2，结果放回原处
0167:005440F6 MOV [EBP+10],EAX
0167:005440F9 MOV [EBP+14],EDX
0167:005440FC PUSH DWORD [EBP+1C]
0167:005440FF PUSH DWORD [EBP+18]
0167:00544102 PUSH DWORD [EBP+1C]
0167:00544105 PUSH DWORD [EBP+18]
0167:00544108 PUSH DWORD [EBP+0C]
0167:0054410B PUSH DWORD [EBP+08]
0167:0054410E CALL 00544060 \
0167:00544113 MOV [EBP+18],EAX <--数6先平方，再除数5，余数放回数6处
0167:00544116 MOV [EBP+1C],EDX /
0167:00544119 JMP SHORT 0054414A
0167:0054411B MOV EAX,[EBP+10] \
0167:0054411E MOV EDX,[EBP+14] \
0167:00544121 SUB EAX,BYTE +01 \
0167:00544124 SBB EDX,BYTE +00 /<--数7减1，变为偶数
0167:00544127 MOV [EBP+10],EAX /
0167:0054412A MOV [EBP+14],EDX /
0167:0054412D PUSH DWORD [EBP+1C]
0167:00544130 PUSH DWORD [EBP+18]
0167:00544133 PUSH DWORD [EBP-04]
0167:00544136 PUSH DWORD [EBP-08]
0167:00544139 PUSH DWORD [EBP+0C]
0167:0054413C PUSH DWORD [EBP+08]
0167:0054413F CALL 00544060 \
0167:00544144 MOV [EBP-08],EAX <--数6乘数4除数5，余数放回数4
0167:00544147 MOV [EBP-04],EDX /
0167:0054414A CMP DWORD [EBP+14],BYTE +00
0167:0054414E JNZ 0054415C
0167:00544150 CMP DWORD [EBP+10],BYTE +00
0167:00544154 JA NEAR 005440CE
0167:0054415A JMP SHORT 00544162 <--当数7减小为0时到此处跳出返回，
0167:0054415C JG NEAR 005440CE 并将数4的最后值作为返回值数2
0167:00544162 MOV EAX,[EBP-08]
0167:00544165 MOV EDX,[EBP-04]
0167:00544168 POP ECX
0167:00544169 POP ECX
0167:0054416A POP EBP
0167:0054416B RET
注册码第二部分地运算过程完全相同，不再赘述。

问题：由于数4，数6都为32位数，数6平方的结果及数4、数6相乘的结果都将为64位数，然后将这64位数除32位数求余。所以运算过程比较复杂，而且一般的高级语言所涉及的长整数只有32位，如C语言和VC，即使想把它的运算过程模拟下来也比较困难。再者，对于这样复杂的迭代运算，申请码与注册码是否一一对应还是一个问题，小弟的水平不够，有没有高手可以求出逆运算并写出注册机！（不修改程序！）

小弟的水平不够，写得不好之处请各位海涵。


Windows优化大师

 标 题:可恨的Windows优化大师 (3千字)
发信人:1212
时 间:2000-8-1 19:05:46
详细信息:
在我研究此程序时竟然无意中看到了这样一句话:You are big pig.虽然我的英文次到了极点,但这句话的大概意思也知道,我想不会是说作者自己吧!

015F:004C5A0B CMP DWORD [EBP-04],BYTE +00
015F:004C5A0F JZ 004C5A25
015F:004C5A11 LEA EDX,[EBP-08]
015F:004C5A14 MOV EAX,[EBX+02DC]
015F:004C5A1A CALL 0042F6E8
015F:004C5A1F CMP DWORD [EBP-08],BYTE +00
015F:004C5A23 JNZ 004C5A42
015F:004C5A25 PUSH BYTE +10
015F:004C5A27 MOV ECX,004C5B98
015F:004C5A2C MOV EDX,004C5BA8
015F:004C5A31 MOV EAX,[004F9DB0]
015F:004C5A36 MOV EAX,[EAX]
015F:004C5A38 CALL 0044BD40
015F:004C5A3D JMP 004C5B6E
015F:004C5A42 LEA EDX,[EBP-04]
015F:004C5A45 MOV EAX,[EBX+02D8]
015F:004C5A4B CALL 0042F6E8
015F:004C5A50 MOV EAX,[EBP-04]
015F:004C5A53 CALL 004C5908
015F:004C5A58 CDQ 输入的第一注册码
015F:004C5A59 PUSH EDX
015F:004C5A5A PUSH EAX
015F:004C5A5B LEA EDX,[EBP-04]
015F:004C5A5E MOV EAX,[EBX+02DC]
015F:004C5A64 CALL 0042F6E8
015F:004C5A69 MOV EAX,[EBP-04]
015F:004C5A6C CALL 004C5908
015F:004C5A71 CDQ 输入的第二注册码
015F:004C5A72 PUSH EDX
015F:004C5A73 PUSH EAX
015F:004C5A74 LEA EDX,[EBP-04]
015F:004C5A77 MOV EAX,[EBX+02D4]
015F:004C5A7D CALL 0042F6E8
015F:004C5A82 MOV EAX,[EBP-04]
015F:004C5A85 CALL 00404074
015F:004C5A8A CALL `OCTODLL!Registed` 检测注册码
015F:004C5A8F CMP EAX,BYTE +14
015F:004C5A92 JZ 004C5AB1 相等则转到4c5ab1
015F:004C5A94 PUSH BYTE +10
015F:004C5A96 MOV ECX,004C5B98
015F:004C5A9B MOV EDX,004C5BC4
015F:004C5AA0 MOV EAX,[004F9DB0]
015F:004C5AA5 MOV EAX,[EAX]
015F:004C5AA7 CALL 0044BD40 跳出失败对话框,Game Over.
015F:004C5AAC JMP 004C5B6E
015F:004C5AB1 MOV DL,01
015F:004C5AB3 MOV EAX,[004528A8]
015F:004C5AB8 CALL 004529E8
015F:004C5ABD MOV ESI,EAX
015F:004C5ABF MOV EDX,80000002
015F:004C5AC4 MOV EAX,ESI
015F:004C5AC6 CALL 00452A80
015F:004C5ACB MOV CL,01
015F:004C5ACD MOV EDX,004C5BF0
015F:004C5AD2 MOV EAX,ESI
015F:004C5AD4 CALL 00452BDC
015F:004C5AD9 LEA EDX,[EBP-04]
015F:004C5ADC MOV EAX,[EBX+02D8]
015F:004C5AE2 CALL 0042F6E8
015F:004C5AE7 MOV ECX,[EBP-04]
015F:004C5AEA MOV EDX,004C5C08
015F:004C5AEF MOV EAX,ESI
015F:004C5AF1 CALL 0045312C
015F:004C5AF6 LEA EDX,[EBP-04]
015F:004C5AF9 MOV EAX,[EBX+02DC]
015F:004C5AFF CALL 0042F6E8
015F:004C5B04 MOV ECX,[EBP-04]
015F:004C5B07 MOV EDX,004C5C1C
015F:004C5B0C MOV EAX,ESI
015F:004C5B0E CALL 0045312C
015F:004C5B13 MOV EAX,ESI
015F:004C5B15 CALL 00452A50
015F:004C5B1A MOV EAX,ESI
015F:004C5B1C CALL 00402FC4
015F:004C5B21 PUSH BYTE +40
015F:004C5B23 MOV ECX,004C5B98
015F:004C5B28 MOV EDX,004C5C28
015F:004C5B2D MOV EAX,[004F9DB0]
015F:004C5B32 MOV EAX,[EAX]
015F:004C5B34 CALL 0044BD40 跳出注册成功对话框.
015F:004C5B39 MOV EAX,[004F9F4C]
015F:004C5B3E MOV EAX,[EAX]
015F:004C5B40 MOV EAX,[EAX+073C]
015F:004C5B46 MOV EDX,004C5C5C
015F:004C5B4B CALL 0042F718
015F:004C5B50 MOV EAX,[004F9F4C]
015F:004C5B55 MOV EAX,[EAX]
015F:004C5B57 MOV EAX,[EAX+0468]
015F:004C5B5D XOR EDX,EDX
015F:004C5B5F CALL 0042F5D8
015F:004C5B64 MOV EAX,[004FBDDC]
015F:004C5B69 CALL 00448A34
015F:004C5B6E XOR EAX,EAX
015F:004C5B70 POP EDX
015F:004C5B71 POP ECX
015F:004C5B72 POP ECX
015F:004C5B73 MOV [FS:EAX],EDX
015F:004C5B76 PUSH DWORD 004C5B90
015F:004C5B7B LEA EAX,[EBP-08]
015F:004C5B7E MOV EDX,02
015F:004C5B83 CALL 00403C58

标 题:大致过程。 (8千字)
发信人:hying
时 间:2000-8-4 12:18:36
详细信息:

本人用的windows优化大师是2.5版，其它版本注册算法应该基本相同。
接下来我们大致了解一下，注册涉及三个数：申请码、注册码第一部分和注册码第二部分，但参与计算的申请码并非它本身，而是在显示的申请码后插入“1234567”，然后取前8个数进行计算，我机器上的申请码是162445，故参与计算的是“16244512”，注册码分别用12345678和34567890，计算使用的注册码也非它本身，它会把你输入是注册码"12345678"认为十六进制数"12345678"，十进制就是305419896，在内存中存为“78563412”第二部分也同样，当然注册码中可以有A~F的字母，但必须是大写。还有就是不要忘了“You are big pig”这句话。

先看大致流程：
0167:00544272 MOV EAX,[EDI+ESI*4]
0167:00544275 MOV [EBP-1C],EAX
0167:00544278 MOV EAX,[EDI+ESI*4+04]
0167:0054427C MOV [EBP-18],EAX
0167:0054427F MOV EDX,EBX
0167:00544281 LEA EAX,[EBP-1C]
0167:00544284 CALL 00544170 <--根据申请码计算得数1
0167:00544289 MOV EAX,[EBX]
0167:0054428B MOV [EBX+08],EAX
0167:0054428E MOV EAX,[EBX+04]
0167:00544291 MOV [EBX+0C],EAX
0167:00544294 MOV EAX,[EBP-1C]
0167:00544297 MOV [EBX],EAX
0167:00544299 MOV EAX,[EBP-18]
0167:0054429C MOV [EBX+04],EAX
0167:0054429F ADD ESI,BYTE +02
0167:005442A2 MOV EAX,[EBP-04]
0167:005442A5 CALL 00542F74
0167:005442AA TEST EAX,EAX
0167:005442AC JNS 005442B1
0167:005442AE ADD EAX,BYTE +03
0167:005442B1 SAR EAX,02
0167:005442B4 CMP ESI,EAX
0167:005442B6 JC 00544272
0167:005442B8 MOV EAX,[EBP-10]
0167:005442BB XOR EDX,EDX
0167:005442BD PUSH EDX
0167:005442BE PUSH EAX
0167:005442BF PUSH DWORD [005450D0]
0167:005442C5 PUSH DWORD [005450CC]
0167:005442CB PUSH DWORD [005450D8]
0167:005442D1 PUSH DWORD [005450D4] 根据注册码第一部分计算，
0167:005442D7 CALL 005440B8 〈--结果放入EAX，设为数2
0167:005442DC SUB EAX,BYTE +02 〈--数2减2
0167:005442DF MOV [EBP-24],EAX 〈--放入内存
0167:005442E2 MOV EAX,[EBP-0C]
0167:005442E5 XOR EDX,EDX
0167:005442E7 PUSH EDX
0167:005442E8 PUSH EAX
0167:005442E9 PUSH DWORD [005450D0]
0167:005442EF PUSH DWORD [005450CC]
0167:005442F5 PUSH DWORD [005450D8]
0167:005442FB PUSH DWORD [005450D4] 根据注册码第二部分计算，
0167:00544301 CALL 005440B8 〈--结果放入EAX，设为数3
0167:00544306 SUB EAX,BYTE +02 〈--数3减2
0167:00544309 MOV [EBP-20],EAX 〈--放入内存
0167:0054430C SHL DWORD [EBP-24],02 〈--数2左移2位
0167:00544310 LEA ECX,[EBP-24]
0167:00544313 MOV EAX,[ECX] 〈--取出数2
0167:00544315 MOV EDX,[ECX+04] 〈--取出数3
0167:00544318 SHRD EAX,EDX,02 〈--数2、数3联合移位，数2改变，数3不变
0167:0054431C SHR EDX,02 〈--数3右移2位
0167:0054431F MOV [ECX],EAX 〈--数2放入内存
0167:00544321 MOV [ECX+04],EDX 〈--数3放入内存
0167:00544324 MOV EAX,[EBP-24]
0167:00544327 CMP EAX,[EBP-1C] <--数2与数1如相同则跳转
0167:0054432A JZ 00544330 正确应跳
0167:0054432C XOR EBX,EBX
0167:0054432E JMP SHORT 00544341 〈--如到这句，注册失败
0167:00544330 MOV AX,[EBP-20] 〈--取数3的低16位放入AX，
0167:00544334 AND AX,FFFF 以后验证，正确应为0014
0167:00544338 MOV EDX,[EBP-08]
0167:0054433B MOV [EDX],AX
0167:0054433E OR EBX,BYTE -01
0167:00544341 XOR EAX,EAX
0167:00544343 POP EDX
0167:00544344 POP ECX
0167:00544345 POP ECX
0167:00544346 MOV [FS:EAX],EDX
0167:00544349 PUSH DWORD 00544366
0167:0054434E LEA EAX,[EBP-14]
0167:00544351 CALL 00542E5C
0167:00544356 LEA EAX,[EBP-04]
0167:00544359 CALL 00542E5C
0167:0054435E RET

具体看申请码的计算：
0167:00544170 PUSH EBX
0167:00544171 PUSH ESI
0167:00544172 PUSH EDI
0167:00544173 PUSH ECX
0167:00544174 MOV [ESP],EAX
0167:00544177 MOV EAX,20 <--设定循环次数
0167:0054417C MOV ECX,[ESP]
0167:0054417F MOV ECX,[ECX] <--申请码前4位放入ecx
0167:00544181 MOV EBX,[ESP]
0167:00544184 MOV EBX,[EBX+04] <--申请码后4位放入ebx
0167:00544187 XOR ESI,ESI
0167:00544189 DEC EAX
0167:0054418A ADD ESI,[005450C8]<--esi加常数9e3779b9
0167:00544190 MOV EDI,EBX
0167:00544192 SHL EDI,04
0167:00544195 ADD ECX,EDI
0167:00544197 MOV EDI,[EDX] <--将"You "的ASC码放入edi，
0167:00544199 XOR EDI,EBX 注意高低位及空格
0167:0054419B ADD ECX,EDI
0167:0054419D MOV EDI,EBX
0167:0054419F SHR EDI,05
0167:005441A2 XOR EDI,ESI
0167:005441A4 ADD ECX,EDI
0167:005441A6 ADD ECX,[EDX+04] <--将"are "的ASC码放入ecx，
0167:005441A9 MOV EDI,ECX
0167:005441AB SHL EDI,04
0167:005441AE ADD EBX,EDI
0167:005441B0 MOV EDI,[EDX+08] <--将"big "的ASC码放入edi，
0167:005441B3 XOR EDI,ECX
0167:005441B5 ADD EBX,EDI
0167:005441B7 MOV EDI,ECX
0167:005441B9 SHR EDI,05
0167:005441BC XOR EDI,ESI
0167:005441BE ADD EBX,EDI
0167:005441C0 ADD EBX,[EDX+0C]<--将ebx加上"pig "的ASC码，
0167:005441C3 TEST EAX,EAX
0167:005441C5 JA 00544189 <--回到上面循环
0167:005441C7 MOV EAX,[ESP]
0167:005441CA MOV [EAX],ECX <--ecx的值即为算得的数1
0167:005441CC MOV EAX,[ESP]
0167:005441CF MOV [EAX+04],EBX
0167:005441D2 POP EDX
0167:005441D3 POP EDI
0167:005441D4 POP ESI
0167:005441D5 POP EBX
0167:005441D6 RET
上面这些移来移去实在不明白什么意思，但用C语言或VC来写，还是很容易的，
注册码的计算过程就复杂多了

两个注册码的计算完全一样，看第一个：
计算中涉及到内存中的几个数如下
在内存地址 77f600处有
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx<--数4，初始为01000000，即十进制数1
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx<--数5，初始为E3A0AA69,即十进制数1772789987
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx<--注册码第一部分，初始为78563412，设为数6

计算过程：
0167:005440CE PUSH BYTE +00
0167:005440D0 PUSH BYTE +02
0167:005440D2 MOV EAX,[EBP+10]
0167:005440D5 MOV EDX,[EBP+14]
0167:005440D8 CALL 00543B6D <--判断内存中一数7为奇为偶，
0167:005440DD CMP EDX,BYTE +00 为奇则跳转至0054411B，
0167:005440E0 JNZ 0054411B 数7初始值为994323192
0167:005440E2 CMP EAX,BYTE +00
0167:005440E5 JNZ 0054411B
0167:005440E7 PUSH BYTE +00
0167:005440E9 PUSH BYTE +02
0167:005440EB MOV EAX,[EBP+10]
0167:005440EE MOV EDX,[EBP+14]
0167:005440F1 CALL 00543A7A <--如数7为偶则除2，结果放回原处
0167:005440F6 MOV [EBP+10],EAX
0167:005440F9 MOV [EBP+14],EDX
0167:005440FC PUSH DWORD [EBP+1C]
0167:005440FF PUSH DWORD [EBP+18]
0167:00544102 PUSH DWORD [EBP+1C]
0167:00544105 PUSH DWORD [EBP+18]
0167:00544108 PUSH DWORD [EBP+0C]
0167:0054410B PUSH DWORD [EBP+08]
0167:0054410E CALL 00544060 \
0167:00544113 MOV [EBP+18],EAX <--数6先平方，再除数5，余数放回数6处
0167:00544116 MOV [EBP+1C],EDX /
0167:00544119 JMP SHORT 0054414A
0167:0054411B MOV EAX,[EBP+10] \
0167:0054411E MOV EDX,[EBP+14] \
0167:00544121 SUB EAX,BYTE +01 \
0167:00544124 SBB EDX,BYTE +00 /<--数7减1，变为偶数
0167:00544127 MOV [EBP+10],EAX /
0167:0054412A MOV [EBP+14],EDX /
0167:0054412D PUSH DWORD [EBP+1C]
0167:00544130 PUSH DWORD [EBP+18]
0167:00544133 PUSH DWORD [EBP-04]
0167:00544136 PUSH DWORD [EBP-08]
0167:00544139 PUSH DWORD [EBP+0C]
0167:0054413C PUSH DWORD [EBP+08]
0167:0054413F CALL 00544060 \
0167:00544144 MOV [EBP-08],EAX <--数6乘数4除数5，余数放回数4
0167:00544147 MOV [EBP-04],EDX /
0167:0054414A CMP DWORD [EBP+14],BYTE +00
0167:0054414E JNZ 0054415C
0167:00544150 CMP DWORD [EBP+10],BYTE +00
0167:00544154 JA NEAR 005440CE
0167:0054415A JMP SHORT 00544162 <--当数7减小为0时到此处跳出返回，
0167:0054415C JG NEAR 005440CE 并将数4的最后值作为返回值数2
0167:00544162 MOV EAX,[EBP-08]
0167:00544165 MOV EDX,[EBP-04]
0167:00544168 POP ECX
0167:00544169 POP ECX
0167:0054416A POP EBP
0167:0054416B RET
注册码第二部分地运算过程完全相同，不再赘述。

问题：由于数4，数6都为32位数，数6平方的结果及数4、数6相乘的结果都将为64位数，然后将这64位数除32位数求余。所以运算过程比较复杂，而且一般的高级语言所涉及的长整数只有32位，如C语言和VC，即使想把它的运算过程模拟下来也比较困难。再者，对于这样复杂的迭代运算，申请码与注册码是否一一对应还是一个问题，小弟的水平不够，有没有高手可以求出逆运算并写出注册机！（不修改程序！）

小弟的水平不够，写得不好之处请各位海涵。

标 题:Windows优化大师被egis搞定了，用的弱RSA算法，注册机在Keygen Studio上应能找到 (空)
发信人:guest
时 间:2000-8-17 21:33:29
详细信息:

注册机已经出来了：http://www.8bn.com/hambo/egis1/cr-wom29.zip


Windows优化大师v3.0-v3.4

Windows优化大师v3.0-v3.4的注册机源代码

时空幻影于2001年3月15日

我在《Windows优化大师》这个软件开始使用某种加密算法时就在破解时有点摸不着头脑，不知道这个算法是RSA加密算法。自从几个月前拜读了《论坛精华Ⅱ》中的《Windows优化大师v2.9+的注册码加密算法》一文后我就开始按照该文所讲的方法编写注册机，从此噩梦开始......

我先把n=0x0000000069AAA0E3进行因子分解求出p=0x80BD和q=0xD21F，于是就求得f=0x0000000069A53372，然后又按照第四条规则很辛苦地编程求出d=0x000000003E0877FD。至此我想应该可以顺利地编写出注册机了吧，然而作出来的注册机不但算出来的注册码不对，而且用加密算法算出来的结果不能用解密算法还原成原来输入的两个数值。这个问题一直弄得我头大，直到最近我从别人那弄的一个注册申请码和正确的注册码，我才算出解密密钥d不是0x000000003E0877FD，而是0x00000000002C86F9，于是我终于写成了注册机。

源代码如下：（C++ Builder 5.0编译通过）

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

unsigned __int64 __fastcall Encrypt_Decrypt(unsigned __int64 m,unsigned __int64 e,unsigned __int64 n)
{
unsigned __int64 a,b,c;

a=m;
b=e;
c=1;

while(b)
{
if ((b%2)==0)
{
b=b/2;
a=(a*a)%n;
}
else
{
b=b-1;
c=(c*a)%n;
}
}
return (c);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Application->MessageBox("时空幻影于2001年3月12日，如有什么问题请E-MAIL：shikonghuanying@sina.com","关于",MB_OK);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned __int32 s[4]={0x20756f59,0x20657261,0x20676962,0x2e676970};//"You
    are big pig."的内存表示
unsigned __int32 t1=0,t2=0,esi=0x9e3779b9,temp;
unsigned __int64 n=0x69aaa0e3,d=0x002c86f9,m1,m2,n1,n2,t;
int i,j;
AnsiString Buffer=Edit1->Text;
if (Edit1->Text.IsEmpty())
{
Application->MessageBox("请输入注册申请码!","提示",MB_OK);
return;
}
Buffer=Buffer+"1234567";
Buffer.SetLength(8);
i=4;
while (i>0)
{
t1=0x100*t1+(StrToInt(Buffer[i])+0x30);
i--;
}
i=8;
while (i>4)
{
t2=0x100*t2+(StrToInt(Buffer[i])+0x30);
i--;
}
for (j=0;j<32;j++)
{
temp=t2<<4;
t1=t1+temp+(s[0]^t2);
temp=t2>>5;
t1=t1+(temp^esi)+s[1];
temp=t1<<4;
t2=t2+temp+(s[2]^t1);
temp=t1>>5;
t2=t2+(temp^esi)+s[3];
esi=esi+0x9e3779b9;
}
t1=t1+2;
i=0;
j=0;
temp=t1;
if (t1>0x3fffffff)
{
temp=t1&0x0fffffff;
s1:
;
if (temp<=0x3fffffff)
{
j=1;
while (j<=4)
{
t=j*0x100000000+(temp<<2);
if ((t>>2)%0x100000000==t1) goto s2;
else j++;
}
i=i+0x10000000;
temp=temp+0x10000000;
if (i<0x40000000) goto s1;
}
}
s2:
;
m1=temp;
m2=(0x50|j)+2;
n1=Encrypt_Decrypt(m1,d,n);
n2=Encrypt_Decrypt(m2,d,n);
Edit2->Text=IntToHex((__int64)n1,8);
Edit3->Text=IntToHex((__int64)n2,8);
}
//---------------------------------------------------------------------------


voptme

 标 题:voptme (472字)
发信人:１２１２
时 间:2001-6-15 16:01:08
详细信息:
用了sharelock加密，里面只有一个单向hash，很简单。但是有个问题，在一台机器上可以注册成功，但是到了另外一台机器无论如何也不成了。

能注册的机器是英文的，不能注册的是中文的。

即使能注册，也还有问题。

voptme的注册号分成两部分，第一部分是sharelock标准的注册流程，第二部分是voptme自己定义的，但是找不到它在什么地方检查第二部分的key。

如果第二个key不对，在整理硬盘的时候就会有internal error。

name=Hello
location=beautifulgirl
code=541A72E471574DC25F39A924C


CloneCD

 标 题:转贴：Ivanopulo说CloneCD用的是椭圆曲线密码算法 (1千字)
发信人:guest
时 间:2000-7-11 0:13:29
详细信息:
Here is a Ivanopulo's .nfo part about asprotect:

"For those who's interested in this program's protection mechanism -
here's the info:

Main keycheck routine is implemented as Nyberg-Rueppel signature
scheme for Elliptic Curves defined over F2^m polynomial field. This
makes writing a keymaker for CloneCD impossible. (so don't believe if
someone says he managed to keygen it)

The curve used has 242 bit prime order
1026DD85081B82314691CED9BBEC30547840E4BF72D8B5E0D258442BBCD31

I have the data for field polynomial written down somewhere on my HD,
but atm I have no time to search for it, so sorry (the only thing I
can recall it was polynomial of 272 or 271 degree)

By the way, the curve used in CloneCD is the SAME curve defined over
the SAME polynomial field as used by WinRAR. Heh, I wonder where did
those guys find it and the library they used for implementing ECC. I
know only one library that implements ECC - Miracl, but it has only
Fp implementation. Maybe they bought the library from certicom...
anyway, if you have that library and don't mind to send it to me -
please do it. I had to dig into all this ECC implementation looking
at disassembled code. Not the most pleasant occupation I had in life
:)

And the second level of protection in this program is implemented
using ASProtect. Alex Solodovnikov did very good job on this
protector (hi Alex) but yet it is possible to defeat it. The point is
that ASProtect encrypts some program routines (in case of CloneCD
registration info/program settings saving functions) and decrypts
them with the password provided in the user's registration info
(encrypted there). But fortunatelly I was able to grab one of the
'stolen' keys and after it was decrypted in memory I knew ASProtect
password. Hehe, it's 'Suck me!' by the way.

Okay, enuff talking... use it and enjoy =)"


flashfxp v1.3

标 题:flashfxp v1.3 (374字)
发信人:[最弱智]
时 间:2001-1-23 16:59:33
详细信息:
这东西的防护强度比1.2大了不知道多少倍，用到的算法：

sha1
crc32

这都不算什么，这玩意还用了RSA768，真是让人挠头。其中：

N=600151214214902607454345269097316866895995439036383934712142724366129260806038836432918366661851984829897762945999759338024905461731844337497870676907922058442134244820682316759149942040594862373699650552148860541551115419476042873
E=65537


FoxMail 3.11

标 题:浅析FoxMail 3.11 及其密文解码公式 (4千字)
发信人:碳烧咖啡
时 间:2001-1-2 20:04:57
详细信息:
/***此文仅供研究，如移作他用，作者概不负责***/

如果你想编写一个获取对方信箱密码的程序，而对方用的又是FoxMail，这篇文章也许对你有用！
（其实这是一篇很无聊的文章，那为什么要写？我也不知道，可能我太无聊了）

程序需要做的步骤是：
1、找到FoxMail的安装目录；
2、在其下查找指定的帐户目录；
3、然后获得该帐户的信箱地址
4、获取信箱密码的密文；
5、最后再将其转换为明文

在正式开始以前，先假设你在FoxMail中有且仅有一个帐户：abcde，它的EMail地址是abcde@163.net，这个EMail信箱的
密码是12345，并且你的FoxMail的安装目录是D:\FOXMAIL。

1、查找FoxMail所在路径

如果对方是用FoxMail来收信的，那么它的默认邮件程序应该就是FoxMail，则它的FoxMail所在地址就记录在
HKEY_LOCAL_MACHINE\Software\CLASSES\mailto\shell\open\command中，当然，你也可以在HKEY_LOCAL_MACHINE\Software\Aerofox\FoxMail
下的“Executable”中获得

2、查找帐户路径：通过accounts.cfg（帐户配置文件）

这只是为了写程序的方便，否则你可以用资源管理器手工查找该路径。
在这个目录下你会发现这个文件：accounts.cfg，用HEdit编辑这个文件，
在偏移0x848(2120)处的值是05 00 00 00，其实它是一个值是5的DWord(双字),5的含义就是你的帐户名(abcde)由5个字节组成，跳过0x848
处的四个字节，再跳过abcde这五个字节，你又会看到：15 00 00 00，不用多说，这也是一个双字，它的值为0x15(21)，其后跟着一串
长度为0x15(21)的路径名：D:\FOXMAIL\mail\abcde。如果你建立了更多的帐户，查找其路径的方法以此类推，并且每两个帐户间的间隔是
0x1c(28)个字节。

3、获取信箱地址：通过Account.stg

前面我们已经找到了abcde的帐户目录，在该目录下有一个称为Account.stg的文件，该文件十分重要，它记录着用户在帐户->属性菜单中
的所有内容，当然也包括了我们感兴趣的密码的密文。它的格式如下：
0x00到0x7FF：乱七八糟的东西
0x800开始：“属性”中的东西

以下是从0x800开始的内容：
AutoCheck=0
AutoCheckMinutes=15
AutoMarkRead=1
AutoPack=1
AutoPackSize=20
AutoQP=1
AutoReadSeconds=5
CharSet=US_ASCII
CheckOnSend=0
DUNEntry=
ESMTPAccount=
ESMTPPassword=
HangupDUN=0
IsESMTP=0
LabelRow=1
LabelsCaptions=Label1;;Label2;;Label3;;Label4;;Label5;;Label6;;Label7
LabelsColors=255;;32768;;16711680;;8388608;;65535;;128;;32896
LeaveInServer=0
MailAddress=abcde@163.net
MailListFont=
MessageFont=
MovetoSentbox=1
NetType=0
Organization=
OrigReply=1
PlaySoundOnNewMsg=0
POP3Account=abcde
POP3Host=pop.163.net
POP3Password=F9AAB899ACA6
POP3Port=110
PrintFont=
ReplyAddr=
SameWithPop=1
SMTPHost=smtp.163.net
SMTPPort=25
SoundFileOnNew=
Subject8bit=0
UseAccNetSet=0
UseExistDUN=1
UseMIME=1
UserName=abcde
UseWeb=0
WordWrap=1

我只挑重要的讲，最重要的当然是MailAddress和POP3Password啦，哇噻，是POP3Password耶，这不是pop3的密码吗？当然不是啦，密码以
明文存放………FoxMail不会这么笨的，它是经过了加密的密文（稍后我会讲的），其它的我就不多讲了，像POP3Host是pop3的服务器地
址；POP3Port是pop3的服务器端口；SMTPHost是发信服务器，而SMTPPort是该服务器的端口…………等等，就此一笔带过（讲多了又要被
扁了），其实上面的并不是属性中所有的内容，如果你细心的话就会发现属性中的“模板”并没有包含在内，对了，再接下去的文件内容
就是模板的内容，因为这实在是无关痛痒，所以不多讲了。

5、将取得的密文转换为明文（即密文解码公式）

终于到了最刺激的部分了，这可是FoxMail的安全核心哦！
在解码之前，请你先记住一个单词：~draGon~（注意要区分大小写）。
记住了吗？好，现在解码开始：

第一步：
取得上面这个单词的ASCII码：7E 64 72 61 47 6F 6E 7E，记为a1,a2,a3,a4,a5,a6,a7,a8

第二步：
将其相加，得0x357，除以255，余数是0x5A， 记为c0

第三步：
取密码的密文：F9AAB899ACA6将它们两两分开，得到：F9 AA B8 99 AC A6，分别记为b1,b2,b3,b4,b5,b6
密文的长度为12，12/2－1＝5，所以密码的长度为5；

第四步：
c0=0X5A
C1=C0^0XF9=c0^b0=0xA3
C2=0XAA
C3=0XB8
C4=0X99
C5=0XAC

其中^为异或；0x代表此数为16进制数；
d1=b2^a1=0xD4
d2=b3^a2=0xDC
d3=b4^a3=0xEB
d4=b5^a4=0xCD
d5=b6^a5=0xE1

第五步：
判断di是否大于ci，小于或等于，则di=di+0xFF

第六步（最后一步）：
Ei=di-ci，其中Ei就是将密文解码后的明文，本例中的密码是：d4h-a3h=31h;dch-aah=32h;ebh-b8h=33h;cdh-99h=34h;e1h-ach=35h
即‘12345’。

好了，终于写完了，如果还有问题别来问我，这篇文章已经写得很详细了！

有空的话去看看我的网站吧（虽然还没有完工），网址是HTTP://TSCoffee.MyEtang.Com

祝各位
元旦快乐

---------- 碳烧咖啡
2001.1.2 晚


Oicq 99c Build 0820

 标 题:Oicq 99c Build 0820版破解 (1千字)
发信人:yuky
时 间:2000-10-13 12:26:49
详细信息:
这是目前(2000.10.12)最新的Oicq,本以为加密会很好,可破起来只用了十几分钟。不禁为腾讯公司感到悲哀。

在Oicq\dat下有Oicq2000.cfg文件，偏移0009为号码个数，后面有08000000隔开每个号码，保证你的Oicq号码的目录在Oicq\下,将Oicq2000.cfg中的号码改为你想要破的号.然后启动Oicq,在列表中选择你要破的号码,密码任意。在trw2000中下bpx hmemcpy，F5切换到Oicq，点确定， 被拦下，经过N行，到449234显示出密码错误的对话框，向上看

:449210 cmp eax,ebx
:449212 jnz near 449446;此处可跳过

在49210下断点，再运行一次，光标停在cmp eax，ebx，此时eax=0,ebx=0,修改eax为1，跳到449446，按F5运行，竟成功了，连我都不敢相信，检查一下聊天纪录、个人信息，全对！又试了几个，都没问题。不禁有些愕然，如果直接跳到449446不就不用密码了吗？将449212改为jmp 449446，果然可以，不过程序开始时会提示程序被修改，过几次后Oicq会自动恢复，已很累不想继续追了，但应可以找到CRC比对处的。

我没对此前的版本测试过，相信应更容易。

以前用过一个Oicq密码终结者,用穷举法破译密码,遇到8位9位的密码不知要多少时候,没多大意义。破它的注册码倒有些意思。

特别提醒大家在公用机房上过机后，将Oicq下和你的号码一样的目录彻底删除，否则很容易被别人偷看聊天纪录，修改密码、个人信息，后果不堪设想。


OICQ脆弱的加密机制

 标 题:OICQ脆弱的加密机制
发信人:iam0k
时 间:2000-12-19 17:38:22
详细信息:
OICQ脆弱的加密机制

作者：analysist
网站：红色警戒 http://analysist.diz.nu/

因为公司里的空气实在令我感到窒息，而本来就不想去完善那个所谓的无线电子邮局的我，正好找到一个
可以不干活的理由。其实，我并非是真的不想干活，主要是因为分配给我的活向来就不称我的心意。刚开始时
打算做些编程开发的事情，但是我却被分配去做网站，真是大材小用嘛！然后，又是去做一些理论上的研究。
等到我已经把编程都淡忘的时候，编程开发的事情终于来了，而我却已经忘了怎样编程，更可气的是，这些活
又催得那么紧，哎！真不知道自己能不能干完！：（
头晕目眩，正在这时，一个网友发来一条消息，不知道为什么，我突发奇想，打算研究一下OICQ的密码破
解方法，因为据我所知，目前还没有什么有效的OICQ密码破解工具呢！以前比较有名的就要算OICQPassOver和
OIQHACK了，前者使用的是穷举的方法，对付一些比较弱智的密码还可以，但是象~!@qaz&165这样的密码呢？
真不知道哪辈子会算出来？！至于后者，虽然可以远程破解密码，但是使用的无非还是穷举，效果自然也是不
敢恭维了！这两者的区别在于前者只能是本地破解，可以在离线状态下进行，而后者随然可以远程破解，但是
必须在连线状态，另外，要编制这样的程序必须非常清楚的了解OICQ的协议，所以对于一般人来说，想知道这
个破解的原理恐怕是很难的。
而我下面将要介绍给大家的这种方法，相信凡是有一点计算机常识的人都是可以看得懂得的。好的，下面
我就向大家介绍OICQ的加密机制的多么脆弱，多么不堪一击！本文的OICQ测试版本是OICQ 99C Build 0820，
至于其它版本是否存在相同问题就不得而知了。
我推崇的是实例教学，先看一个例子，这是默认安装完OICQ后产生的一个文件，就是它，包含了OICQ使用
者的密码信息，对Win9X而言，路径是C:\Program Files\Oicq\dat\oicq2000.cfg。我们用UltraEdit打开它：

  滔葡扇缮  30906766

能看得懂吗？看得懂才怪，呵呵。。。我们选择Edit->Hex Edit，这下呢？有点眉目吧？我真心向大家推
荐这个十六进制编辑器---UltraEdit，因为它的功能实在是太强大了。知道我为什么知道是这个文件包含OICQ
使用者的密码信息吗？就是靠的这个软件，因为它有实时文件监视功能哦！ 用UltraEdit打开OICQ目录中你认
为可能包含使用者密码信息的文件，然后执行一次修改密码的操作， 之后返回UltraEdit主界面，看到什么？
是不是提示有文件被改动了，呵呵。。。这就是包含密码信息的文件啦！怎么样？看到它的强大功能了吧？！
慢慢发掘吧，应该有很多的说！~
这个文件的十六进制格式如下：

00000000h: 01 00 00 00 08 00 00 00 CC CF C6 CF C9 C8 C9 C9 ; ........滔葡扇缮
00000010h: 01 00 00 00 08 00 00 00 33 30 39 30 36 37 36 36 ; ........30906766

经过分析（呵呵。。。我喜欢分析，所以我叫analysist），我大概清楚这个文件的格式了，第一个01应该
表示这是最后使用的OICQ号码，也就是最新使用的OICQ号码。随后的00 00 00应该是分割符， 然后的08表示密
码是8位的，然后又是分割符，然后是加密的密码，然后的01表示本文件包含1个OICQ号码，然后是分割符， 然
后的08表示OICQ号码是8位的，然后是分割符，接着就是OICQ号码的ASCII值。其实， 如果你多看几个这样的文
件的话，可能会看到包含多个OICQ号码的情况，其实情况大同小异，所以这里就以这个文件， 这种形式来分析
了，其他情况可以类推。
经过进一步的分析，终于搞明白了这个加密的机制。首先要说的是，30906766是我的OICQ号码， 测试密码
是30906766，请看下面：

3 CC 33
0 CF 30
9 C6 39
0 CF 30
6 C9 36
7 C8 37
6 C9 36
6 C9 36

看到了吗？第二行的0和第四行的0对应的CF是相同的，因此，直觉告诉我这是一种对称加密方法。再分析一
下，0到9递增，CF到C6递减，呵呵。。。和是一样的，不会那么简单吧？再试一下其它的密码，如下：

00000000h: 01 00 00 00 08 00 00 00 9E 9D 9C 9B 9A 99 98 97 ; ........灊湜殭槜
00000010h: 01 00 00 00 08 00 00 00 33 30 39 30 36 37 36 36 ; ........30906766

验证一下：

a 9E 61
b 9D 62
c 9C 63
d 9B 64
e 9A 65
f 99 66
g 98 67
h 97 68

不对了！那么，会是什么加密方法呢？我没灰心，想到了ASCII值，而ASCII值也是递增的，不会是后2项的和
吧？经过对数字，小写字母，大写字母和特殊字符的验证，事实证明我的推断是正确的。
呵呵。。。原来OICQ的加密机制如此脆弱，如此不堪一击啊！
这样，只要你能访问到这个文件，那么得到其中的OICQ密码是不是如探囊取物一般容易呢？：P 当然，你只能
拿到最后使用的用户的密码，但是这不就很好了吗？！
我曾试过手工修改密码来登陆，结果出现的情况和我在《BBS2000和BBS3000中存在的隐患》中描述的一样，但
是因为我没有做进一步的研究（主要是太冷了！），所以我就没有多少发言权了，也许只要你经过一些简单的测试
就能发现服务器会自动把你指定的OICQ的密码发给你也说不定哦！~

郑重声明：这种方法具有比较严重的破坏性，尤其是对于公共上网场所危害更大，所以本方法只能用于找回自
己遗忘的密码，不能用于破解别人的密码，否则因此所引起的法律问题，本人概不负责！另外，本文所有版权归作
者analysist，如转载请保持文章完整性并注明出处！！！

标 题:你看到的好像只是一个特例！
发信人:baddog
时 间:2000-12-22 9:17:19
详细信息:

如果你选择了下次在使用 OICQ 时不弹出密码窗口才会这样，如果没有这个选项就没有相应的数据了，现在的 OICq 安全做得还是挺好的，漏洞不好找了。


OICQ的密码比较

 标 题:浅谈OICQ的密码比较 1 (12千字)
发信人:garfield cat
时 间:2000-9-20 14:35:10
详细信息:
学CRACK已经一个多月了,想想当初成功破解第一个软件时,激动的我连续两个小时心跳加速,以后的三天晚上
没睡好觉,多可笑啊!现在回头再看看,可真是一段美好的回忆!
好了,不说废话了!下面我浅谈一下OICQ的密码比较过程.

前提是你必须在这台机子上,曾经成功登陆上服务器.而且保留matrix.cnt文件.
我没技术和时间去反推出密码.如那位CRACKER成功的话,别忘了告诉我一声,OK?
EMAIL:CL517@YEAH.NET (可别炸我呀!!!)
希望能交个朋友.
OICQ:9062494

如有错误请各位指出.

* Possible StringData Ref from Data Obj ->"matrix.cnt" <===读入这个文件!!!
|
:0044192B 68C8125100 push 005112C8
:00441930 51 push ecx
:00441931 50 push eax
:00441932 C645FC05 mov [ebp-04], 05
:00441936 E87FEF0500 call 004A08BA
:0044193B 8D4DB0 lea ecx, dword ptr [ebp-50]
:0044193E E892A60200 call 0046BFD5
:00441943 3BC3 cmp eax, ebx
:00441945 741F je 00441966
:00441947 51 push ecx
:00441948 8D450C lea eax, dword ptr [ebp+0C]
:0044194B 8BCC mov ecx, esp
:0044194D 8965F0 mov dword ptr [ebp-10], esp
:00441950 50 push eax
:00441951 E844EA0500 call 004A039A
:00441956 8D4DB0 lea ecx, dword ptr [ebp-50]
:00441959 E87EA70200 call 0046C0DC ====>关键CALL
:0044195E 3BC3 cmp eax, ebx **比较(这里只是一个标志,看不到你输入的PASSWORD)
:00441960 7404 je 00441966 **一跳就完(很奇怪吧!)
:00441962 8BF7 mov esi, edi
:00441964 EB02 jmp 00441968

matrix.cnt存着上次登陆成功的密码(当然是加密后的!)
这是我的:

5F 65 00 00 89 3B C2 4A 99 D9 31 B4 29 3C 39 6E 22 BB 2B DD
\ / \ /
--- ---------------------------------------------
这个一会儿 这是上次登陆成功密码的加密形式
会用到

追进关键CALL中:

:0046C0FB 50 push eax
:0046C0FC E85AA3FEFF call 0045645B ***CALL(对你输入的密码进行加密处理,
:0046C101 83C40C add esp, 0000000C 然后存在7AEF20-7AEF2A中)
:0046C104 6A01 push 00000001
:0046C106 5F pop edi
:0046C107 397E04 cmp dword ptr [esi+04], edi
:0046C10A 7618 jbe 0046C124
:0046C10C 8D45E4 lea eax, dword ptr [ebp-1C]----------- 对刚才加密过的密码再:0046C10F 6A10 push 00000010 | 进行循环加密处理
:0046C111 50 push eax | 这里的循环次数,是根据
:0046C112 8D45E4 lea eax, dword ptr [ebp-1C] | matrix.cnt的内容
:0046C115 50 push eax | 656F那就是25951次,
:0046C116 E840A3FEFF call 0045645B ***CALL | 好恐怖的数字呀!!
:0046C11B 83C40C add esp, 0000000C |
:0046C11E 47 inc edi |
:0046C11F 3B7E04 cmp edi, dword ptr [esi+04] |
:0046C122 72E8 jb 0046C10C ------------------------
:0046C124 83C608 add esi, 00000008
:0046C127 6A10 push 00000010
:0046C129 8D45E4 lea eax, dword ptr [ebp-1C]
:0046C12C 56 push esi
:0046C12D 50 push eax
:0046C12E E87DB70100 call 004878B0 <==比较加密后的注册码
:0046C133 8BF0 mov esi, eax
:0046C135 83C40C add esp, 0000000C
:0046C138 F7DE neg esi
:0046C13A 1BF6 sbb esi, esi
:0046C13C 834DFCFF or dword ptr [ebp-04], FFFFFFFF
:0046C140 8D4D08 lea ecx, dword ptr [ebp+08]
:0046C143 46 inc esi
:0046C144 E8DC440300 call 004A0625
:0046C149 8B4DF4 mov ecx, dword ptr [ebp-0C]
:0046C14C 8BC6 mov eax, esi
:0046C14E 5F pop edi
:0046C14F 5E pop esi
:0046C150 64890D00000000 mov dword ptr fs:[00000000], ecx
:0046C157 C9 leave
:0046C158 C20400 ret 0004

进入关键CALL 0045645B

:0045645B 55 push ebp
:0045645C 8BEC mov ebp, esp
:0045645E 83EC5C sub esp, 0000005C
:00456461 8D45A4 lea eax, dword ptr [ebp-5C]
:00456464 50 push eax
:00456465 E847F3FFFF call 004557B1
:0045646A FF7510 push [ebp+10]
:0045646D 8D45A4 lea eax, dword ptr [ebp-5C]
:00456470 FF750C push [ebp+0C]
:00456473 50 push eax
:00456474 E873F3FFFF call 004557EC
:00456479 8D45A4 lea eax, dword ptr [ebp-5C]
:0045647C 50 push eax
:0045647D FF7508 push [ebp+08]
:00456480 E8BBFEFFFF call 00456340 *****这里进行加密处理
:00456485 83C418 add esp, 00000018
:00456488 C9 leave
:00456489 C3 ret

:00456340 53 push ebx
:00456341 56 push esi
:00456342 8B742410 mov esi, dword ptr [esp+10]
:00456346 57 push edi

* Possible StringData Ref from Data Obj ->"�"
|
:00456347 BAAC195100 mov edx, 005119AC
:0045634C 8B4E58 mov ecx, dword ptr [esi+58]
:0045634F 8D5E18 lea ebx, dword ptr [esi+18]
:00456352 8BC1 mov eax, ecx
:00456354 83E103 and ecx, 00000003
:00456357 C1F802 sar eax, 02
:0045635A 83E900 sub ecx, 00000000
:0045635D 8B3C83 mov edi, dword ptr [ebx+4*eax]
:00456360 740B je 0045636D
:00456362 49 dec ecx
:00456363 7414 je 00456379
:00456365 49 dec ecx
:00456366 7418 je 00456380
:00456368 49 dec ecx
:00456369 741E je 00456389
:0045636B EB24 jmp 00456391

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456360(C)
|
:0045636D 0FB63DAC195100 movzx edi, byte ptr [005119AC]

* Possible StringData Ref from Data Obj ->""
|
:00456374 BAAD195100 mov edx, 005119AD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456363(C)
|
:00456379 33C9 xor ecx, ecx
:0045637B 8A2A mov ch, byte ptr [edx]
:0045637D 0BF9 or edi, ecx
:0045637F 42 inc edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456366(C)
|
:00456380 0FB60A movzx ecx, byte ptr [edx]
:00456383 C1E110 shl ecx, 10
:00456386 0BF9 or edi, ecx
:00456388 42 inc edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456369(C)
|
:00456389 0FB60A movzx ecx, byte ptr [edx]
:0045638C C1E118 shl ecx, 18
:0045638F 0BF9 or edi, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045636B(U)
|
:00456391 893C83 mov dword ptr [ebx+4*eax], edi
:00456394 40 inc eax
:00456395 837E5838 cmp dword ptr [esi+58], 00000038
:00456399 7C1E jl 004563B9
:0045639B 6A10 push 00000010
:0045639D 59 pop ecx
:0045639E 3BC1 cmp eax, ecx
:004563A0 7D09 jge 004563AB
:004563A2 8D3C83 lea edi, dword ptr [ebx+4*eax]
:004563A5 2BC8 sub ecx, eax
:004563A7 33C0 xor eax, eax
:004563A9 F3 repz
:004563AA AB stosd

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004563A0(C)
|
:004563AB 6A40 push 00000040
:004563AD 53 push ebx
:004563AE 56 push esi
:004563AF E8B5F6FFFF call 00455A69
:004563B4 83C40C add esp, 0000000C
:004563B7 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456399(C)
|
:004563B9 6A0E push 0000000E
:004563BB 59 pop ecx
:004563BC 3BC1 cmp eax, ecx
:004563BE 7D09 jge 004563C9
:004563C0 8D3C83 lea edi, dword ptr [ebx+4*eax]
:004563C3 2BC8 sub ecx, eax
:004563C5 33C0 xor eax, eax
:004563C7 F3 repz
:004563C8 AB stosd

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004563BE(C)
|
:004563C9 8B4610 mov eax, dword ptr [esi+10]
:004563CC 6A40 push 00000040
:004563CE 894338 mov dword ptr [ebx+38], eax
:004563D1 8B4614 mov eax, dword ptr [esi+14]
:004563D4 53 push ebx
:004563D5 56 push esi
:004563D6 89433C mov dword ptr [ebx+3C], eax
:004563D9 E88BF6FFFF call 00455A69 *******这里
:004563DE 8B44241C mov eax, dword ptr [esp+1C]
:004563E2 8B0E mov ecx, dword ptr [esi]
:004563E4 83C40C add esp, 0000000C
:004563E7 8BD1 mov edx, ecx ======>从这里到0045645A处
:004563E9 8808 mov byte ptr [eax], cl (开始向7AEF20-7AEF2A存入加密后的密码)
:004563EB 40 inc eax
:004563EC C1EA08 shr edx, 08
:004563EF 8810 mov byte ptr [eax], dl
:004563F1 8BD1 mov edx, ecx
:004563F3 40 inc eax
:004563F4 5F pop edi
:004563F5 C1EA10 shr edx, 10
:004563F8 8810 mov byte ptr [eax], dl
:004563FA 40 inc eax
:004563FB C1E918 shr ecx, 18
:004563FE 8808 mov byte ptr [eax], cl
:00456400 8B4E04 mov ecx, dword ptr [esi+04]
:00456403 40 inc eax
:00456404 8BD1 mov edx, ecx
:00456406 C1EA08 shr edx, 08
:00456409 8808 mov byte ptr [eax], cl
:0045640B 40 inc eax
:0045640C 8810 mov byte ptr [eax], dl
:0045640E 8BD1 mov edx, ecx
:00456410 40 inc eax
:00456411 C1EA10 shr edx, 10
:00456414 8810 mov byte ptr [eax], dl
:00456416 40 inc eax
:00456417 C1E918 shr ecx, 18
:0045641A 8808 mov byte ptr [eax], cl
:0045641C 8B4E08 mov ecx, dword ptr [esi+08]
:0045641F 40 inc eax
:00456420 8BD1 mov edx, ecx
:00456422 C1EA08 shr edx, 08
:00456425 8808 mov byte ptr [eax], cl
:00456427 40 inc eax
:00456428 8810 mov byte ptr [eax], dl
:0045642A 8BD1 mov edx, ecx
:0045642C 40 inc eax
:0045642D C1EA10 shr edx, 10
:00456430 8810 mov byte ptr [eax], dl
:00456432 40 inc eax
:00456433 C1E918 shr ecx, 18
:00456436 8808 mov byte ptr [eax], cl
:00456438 8B4E0C mov ecx, dword ptr [esi+0C]
:0045643B 40 inc eax
:0045643C 8BD1 mov edx, ecx
:0045643E C1EA08 shr edx, 08
:00456441 8808 mov byte ptr [eax], cl
:00456443 40 inc eax
:00456444 8810 mov byte ptr [eax], dl
:00456446 8BD1 mov edx, ecx
:00456448 40 inc eax
:00456449 C1EA10 shr edx, 10
:0045644C C1E918 shr ecx, 18
:0045644F 8810 mov byte ptr [eax], dl
:00456451 884801 mov byte ptr [eax+01], cl
:00456454 83665800 and dword ptr [esi+58], 00000000
:00456458 5E pop esi
:00456459 5B pop ebx
:0045645A C3 ret

标 题:浅谈OICQ的密码比较 2 (42千字)
发信人:garfield cat
时 间:2000-9-20 14:37:34
详细信息:

进入call 00455A69

瞧这一大堆代码!

:00455A69 55 push ebp
:00455A6A 8BEC mov ebp, esp
:00455A6C 51 push ecx
:00455A6D 51 push ecx
:00455A6E 8B4D08 mov ecx, dword ptr [ebp+08]
:00455A71 56 push esi
:00455A72 57 push edi
:00455A73 8B01 mov eax, dword ptr [ecx] ; [ECX]=01234567
:00455A75 8B7904 mov edi, dword ptr [ecx+04] ;[ECX+4]=89ABCDEF
:00455A78 8B7108 mov esi, dword ptr [ecx+08] ;[ECX+8]=FEDCBA98
:00455A7B 8B510C mov edx, dword ptr [ecx+0C] ;[ECX+C]=76543210
:00455A7E 894508 mov dword ptr [ebp+08], eax
:00455A81 8B4510 mov eax, dword ptr [ebp+10]
:00455A84 83E840 sub eax, 00000040
:00455A87 897DFC mov dword ptr [ebp-04], edi
:00455A8A 0F88AC080000 js 0045633C
:00455A90 83C040 add eax, 00000040
:00455A93 53 push ebx
:00455A94 C1E806 shr eax, 06
:00455A97 8945F8 mov dword ptr [ebp-08], eax
:00455A9A 8B450C mov eax, dword ptr [ebp+0C] **把要进行处理的密码地址放入EAX

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456335(C)
|
:00455A9D 8BDA mov ebx, edx *****开始喽!(好长呀!!)
:00455A9F 33DE xor ebx, esi
:00455AA1 23DF and ebx, edi
:00455AA3 8B7D08 mov edi, dword ptr [ebp+08]
:00455AA6 33DA xor ebx, edx
:00455AA8 0318 add ebx, dword ptr [eax]
:00455AAA 8DBC1F78A46AD7 lea edi, dword ptr [edi+ebx-28955B88]
:00455AB1 8BDF mov ebx, edi
:00455AB3 C1EB19 shr ebx, 19
:00455AB6 C1E707 shl edi, 07
:00455AB9 0BDF or ebx, edi
:00455ABB 8BFE mov edi, esi
:00455ABD 035DFC add ebx, dword ptr [ebp-04]
:00455AC0 337DFC xor edi, dword ptr [ebp-04]
:00455AC3 23FB and edi, ebx
:00455AC5 895D08 mov dword ptr [ebp+08], ebx
:00455AC8 33FE xor edi, esi
:00455ACA 037804 add edi, dword ptr [eax+04]
:00455ACD 8D943A56B7C7E8 lea edx, dword ptr [edx+edi-173848AA]
:00455AD4 8BFA mov edi, edx
:00455AD6 C1EF14 shr edi, 14
:00455AD9 C1E20C shl edx, 0C
:00455ADC 0BFA or edi, edx
:00455ADE 8B55FC mov edx, dword ptr [ebp-04]
:00455AE1 03FB add edi, ebx
:00455AE3 33D3 xor edx, ebx
:00455AE5 23D7 and edx, edi
:00455AE7 3355FC xor edx, dword ptr [ebp-04]
:00455AEA 035008 add edx, dword ptr [eax+08]
:00455AED 8DB416DB702024 lea esi, dword ptr [esi+edx+242070DB]
:00455AF4 8BD6 mov edx, esi
:00455AF6 C1EA0F shr edx, 0F
:00455AF9 C1E611 shl esi, 11
:00455AFC 0BD6 or edx, esi
:00455AFE 8BF7 mov esi, edi
:00455B00 33F3 xor esi, ebx
:00455B02 03D7 add edx, edi
:00455B04 23F2 and esi, edx
:00455B06 33F3 xor esi, ebx
:00455B08 8B5DFC mov ebx, dword ptr [ebp-04]
:00455B0B 03700C add esi, dword ptr [eax+0C]
:00455B0E 8DB433EECEBDC1 lea esi, dword ptr [ebx+esi-3E423112]
:00455B15 8BDE mov ebx, esi
:00455B17 C1E316 shl ebx, 16
:00455B1A C1EE0A shr esi, 0A
:00455B1D 0BDE or ebx, esi
:00455B1F 8BF7 mov esi, edi
:00455B21 03DA add ebx, edx
:00455B23 33F2 xor esi, edx
:00455B25 23F3 and esi, ebx
:00455B27 895DFC mov dword ptr [ebp-04], ebx
:00455B2A 8B5D08 mov ebx, dword ptr [ebp+08]
:00455B2D 33F7 xor esi, edi
:00455B2F 037010 add esi, dword ptr [eax+10]
:00455B32 8DB433AF0F7CF5 lea esi, dword ptr [ebx+esi-0A83F051]
:00455B39 8BDE mov ebx, esi
:00455B3B C1EB19 shr ebx, 19
:00455B3E C1E607 shl esi, 07
:00455B41 0BDE or ebx, esi
:00455B43 8BF2 mov esi, edx
:00455B45 035DFC add ebx, dword ptr [ebp-04]
:00455B48 3375FC xor esi, dword ptr [ebp-04]
:00455B4B 23F3 and esi, ebx
:00455B4D 895D08 mov dword ptr [ebp+08], ebx
:00455B50 33F2 xor esi, edx
:00455B52 037014 add esi, dword ptr [eax+14]
:00455B55 8DBC372AC68747 lea edi, dword ptr [edi+esi+4787C62A]
:00455B5C 8BF7 mov esi, edi
:00455B5E C1EE14 shr esi, 14
:00455B61 C1E70C shl edi, 0C
:00455B64 0BF7 or esi, edi
:00455B66 8B7DFC mov edi, dword ptr [ebp-04]
:00455B69 03F3 add esi, ebx
:00455B6B 33FB xor edi, ebx
:00455B6D 23FE and edi, esi
:00455B6F 337DFC xor edi, dword ptr [ebp-04]
:00455B72 037818 add edi, dword ptr [eax+18]
:00455B75 8D943A134630A8 lea edx, dword ptr [edx+edi-57CFB9ED]
:00455B7C 8BFA mov edi, edx
:00455B7E C1EF0F shr edi, 0F
:00455B81 C1E211 shl edx, 11
:00455B84 0BFA or edi, edx
:00455B86 8BD6 mov edx, esi
:00455B88 03FE add edi, esi
:00455B8A 33D3 xor edx, ebx
:00455B8C 23D7 and edx, edi
:00455B8E 33D3 xor edx, ebx
:00455B90 8B5DFC mov ebx, dword ptr [ebp-04]
:00455B93 03501C add edx, dword ptr [eax+1C]
:00455B96 8D9413019546FD lea edx, dword ptr [ebx+edx-02B96AFF]
:00455B9D 8BDA mov ebx, edx
:00455B9F C1E316 shl ebx, 16
:00455BA2 C1EA0A shr edx, 0A
:00455BA5 0BDA or ebx, edx
:00455BA7 8BD6 mov edx, esi
:00455BA9 03DF add ebx, edi
:00455BAB 33D7 xor edx, edi
:00455BAD 23D3 and edx, ebx
:00455BAF 895DFC mov dword ptr [ebp-04], ebx
:00455BB2 8B5D08 mov ebx, dword ptr [ebp+08]
:00455BB5 33D6 xor edx, esi
:00455BB7 035020 add edx, dword ptr [eax+20]
:00455BBA 8D9413D8988069 lea edx, dword ptr [ebx+edx+698098D8]
:00455BC1 8BDA mov ebx, edx
:00455BC3 C1EB19 shr ebx, 19
:00455BC6 C1E207 shl edx, 07
:00455BC9 0BDA or ebx, edx
:00455BCB 8BD7 mov edx, edi
:00455BCD 035DFC add ebx, dword ptr [ebp-04]
:00455BD0 3355FC xor edx, dword ptr [ebp-04]
:00455BD3 23D3 and edx, ebx
:00455BD5 895D08 mov dword ptr [ebp+08], ebx
:00455BD8 33D7 xor edx, edi
:00455BDA 035024 add edx, dword ptr [eax+24]
:00455BDD 8DB416AFF7448B lea esi, dword ptr [esi+edx-74BB0851]
:00455BE4 8BD6 mov edx, esi
:00455BE6 C1EA14 shr edx, 14
:00455BE9 C1E60C shl esi, 0C
:00455BEC 0BD6 or edx, esi
:00455BEE 8B75FC mov esi, dword ptr [ebp-04]
:00455BF1 03D3 add edx, ebx
:00455BF3 33F3 xor esi, ebx
:00455BF5 23F2 and esi, edx
:00455BF7 3375FC xor esi, dword ptr [ebp-04]
:00455BFA 037028 add esi, dword ptr [eax+28]
:00455BFD 8DBC37B15BFFFF lea edi, dword ptr [edi+esi-0000A44F]
:00455C04 8BF7 mov esi, edi
:00455C06 C1EE0F shr esi, 0F
:00455C09 C1E711 shl edi, 11
:00455C0C 0BF7 or esi, edi
:00455C0E 8BFA mov edi, edx
:00455C10 03F2 add esi, edx
:00455C12 33FB xor edi, ebx
:00455C14 23FE and edi, esi
:00455C16 33FB xor edi, ebx
:00455C18 8B5DFC mov ebx, dword ptr [ebp-04]
:00455C1B 03782C add edi, dword ptr [eax+2C]
:00455C1E 8D9C3BBED75C89 lea ebx, dword ptr [ebx+edi-76A32842]
:00455C25 8BFB mov edi, ebx
:00455C27 C1E716 shl edi, 16
:00455C2A C1EB0A shr ebx, 0A
:00455C2D 0BFB or edi, ebx
:00455C2F 8BDA mov ebx, edx
:00455C31 03FE add edi, esi
:00455C33 33DE xor ebx, esi
:00455C35 23DF and ebx, edi
:00455C37 897DFC mov dword ptr [ebp-04], edi
:00455C3A 8B7D08 mov edi, dword ptr [ebp+08]
:00455C3D 33DA xor ebx, edx
:00455C3F 035830 add ebx, dword ptr [eax+30]
:00455C42 8DBC1F2211906B lea edi, dword ptr [edi+ebx+6B901122]
:00455C49 8BDF mov ebx, edi
:00455C4B C1EB19 shr ebx, 19
:00455C4E C1E707 shl edi, 07
:00455C51 0BDF or ebx, edi
:00455C53 8BFE mov edi, esi
:00455C55 035DFC add ebx, dword ptr [ebp-04]
:00455C58 337DFC xor edi, dword ptr [ebp-04]
:00455C5B 23FB and edi, ebx
:00455C5D 895D08 mov dword ptr [ebp+08], ebx
:00455C60 33FE xor edi, esi
:00455C62 037834 add edi, dword ptr [eax+34]
:00455C65 8D943A937198FD lea edx, dword ptr [edx+edi-02678E6D]
:00455C6C 8BFA mov edi, edx
:00455C6E C1EF14 shr edi, 14
:00455C71 C1E20C shl edx, 0C
:00455C74 0BFA or edi, edx
:00455C76 8B55FC mov edx, dword ptr [ebp-04]
:00455C79 03FB add edi, ebx
:00455C7B 33D3 xor edx, ebx
:00455C7D 23D7 and edx, edi
:00455C7F 897D10 mov dword ptr [ebp+10], edi
:00455C82 3355FC xor edx, dword ptr [ebp-04]
:00455C85 035038 add edx, dword ptr [eax+38]
:00455C88 8DB4168E4379A6 lea esi, dword ptr [esi+edx-5986BC72]
:00455C8F 8BD6 mov edx, esi
:00455C91 C1EA0F shr edx, 0F
:00455C94 C1E611 shl esi, 11
:00455C97 0BD6 or edx, esi
:00455C99 8BF7 mov esi, edi
:00455C9B 03D7 add edx, edi
:00455C9D 33F3 xor esi, ebx
:00455C9F 23F2 and esi, edx
:00455CA1 33F3 xor esi, ebx
:00455CA3 8B5DFC mov ebx, dword ptr [ebp-04]
:00455CA6 03703C add esi, dword ptr [eax+3C]
:00455CA9 8D9C332108B449 lea ebx, dword ptr [ebx+esi+49B40821]
:00455CB0 8BF3 mov esi, ebx
:00455CB2 C1E616 shl esi, 16
:00455CB5 C1EB0A shr ebx, 0A
:00455CB8 0BF3 or esi, ebx
:00455CBA 8BDA mov ebx, edx
:00455CBC 03F2 add esi, edx
:00455CBE 33DE xor ebx, esi
:00455CC0 23DF and ebx, edi
:00455CC2 8B7D08 mov edi, dword ptr [ebp+08]
:00455CC5 33DA xor ebx, edx
:00455CC7 035804 add ebx, dword ptr [eax+04]
:00455CCA 8D9C1F62251EF6 lea ebx, dword ptr [edi+ebx-09E1DA9E]
:00455CD1 8BFB mov edi, ebx
:00455CD3 C1EF1B shr edi, 1B
:00455CD6 C1E305 shl ebx, 05
:00455CD9 0BFB or edi, ebx
:00455CDB 8BDE mov ebx, esi
:00455CDD 03FE add edi, esi
:00455CDF 33DF xor ebx, edi
:00455CE1 897D08 mov dword ptr [ebp+08], edi
:00455CE4 8B7D10 mov edi, dword ptr [ebp+10]
:00455CE7 23DA and ebx, edx
:00455CE9 33DE xor ebx, esi
:00455CEB 035818 add ebx, dword ptr [eax+18]
:00455CEE 8D9C1F40B340C0 lea ebx, dword ptr [edi+ebx-3FBF4CC0]
:00455CF5 8BFB mov edi, ebx
:00455CF7 C1EF17 shr edi, 17
:00455CFA C1E309 shl ebx, 09
:00455CFD 0BFB or edi, ebx
:00455CFF 037D08 add edi, dword ptr [ebp+08]
:00455D02 897D10 mov dword ptr [ebp+10], edi
:00455D05 337D08 xor edi, dword ptr [ebp+08]
:00455D08 23FE and edi, esi
:00455D0A 337D08 xor edi, dword ptr [ebp+08]
:00455D0D 03782C add edi, dword ptr [eax+2C]
:00455D10 8D943A515A5E26 lea edx, dword ptr [edx+edi+265E5A51]
:00455D17 8BFA mov edi, edx
:00455D19 C1EF12 shr edi, 12
:00455D1C C1E20E shl edx, 0E
:00455D1F 0BFA or edi, edx
:00455D21 8B5510 mov edx, dword ptr [ebp+10]
:00455D24 037D10 add edi, dword ptr [ebp+10]
:00455D27 33D7 xor edx, edi
:00455D29 235508 and edx, dword ptr [ebp+08]
:00455D2C 335510 xor edx, dword ptr [ebp+10]
:00455D2F 0310 add edx, dword ptr [eax]
:00455D31 8DB416AAC7B6E9 lea esi, dword ptr [esi+edx-16493856]
:00455D38 8BD6 mov edx, esi
:00455D3A C1E214 shl edx, 14
:00455D3D C1EE0C shr esi, 0C
:00455D40 0BD6 or edx, esi
:00455D42 8BF7 mov esi, edi
:00455D44 03D7 add edx, edi
:00455D46 33F2 xor esi, edx
:00455D48 237510 and esi, dword ptr [ebp+10]
:00455D4B 33F7 xor esi, edi
:00455D4D 037014 add esi, dword ptr [eax+14]
:00455D50 8B5D08 mov ebx, dword ptr [ebp+08]
:00455D53 8D9C335D102FD6 lea ebx, dword ptr [ebx+esi-29D0EFA3]
:00455D5A 8BF3 mov esi, ebx
:00455D5C C1EE1B shr esi, 1B
:00455D5F C1E305 shl ebx, 05
:00455D62 0BF3 or esi, ebx
:00455D64 8BDA mov ebx, edx
:00455D66 03F2 add esi, edx
:00455D68 33DE xor ebx, esi
:00455D6A 897508 mov dword ptr [ebp+08], esi
:00455D6D 8B7510 mov esi, dword ptr [ebp+10]
:00455D70 23DF and ebx, edi
:00455D72 33DA xor ebx, edx
:00455D74 035828 add ebx, dword ptr [eax+28]
:00455D77 8D9C1E53144402 lea ebx, dword ptr [esi+ebx+02441453]
:00455D7E 8BF3 mov esi, ebx
:00455D80 C1EE17 shr esi, 17
:00455D83 C1E309 shl ebx, 09
:00455D86 0BF3 or esi, ebx
:00455D88 8B5D08 mov ebx, dword ptr [ebp+08]
:00455D8B 037508 add esi, dword ptr [ebp+08]
:00455D8E 897510 mov dword ptr [ebp+10], esi
:00455D91 337508 xor esi, dword ptr [ebp+08]
:00455D94 23F2 and esi, edx
:00455D96 337508 xor esi, dword ptr [ebp+08]
:00455D99 03703C add esi, dword ptr [eax+3C]
:00455D9C 8DBC3781E6A1D8 lea edi, dword ptr [edi+esi-275E197F]
:00455DA3 8BF7 mov esi, edi
:00455DA5 C1EE12 shr esi, 12
:00455DA8 C1E70E shl edi, 0E
:00455DAB 0BF7 or esi, edi
:00455DAD 8B7D10 mov edi, dword ptr [ebp+10]
:00455DB0 037510


OICQ的密码算法

 标 题:破解OICQ的密码算法 (6千字)
发信人:jsjyt
时 间:2001-6-25 17:58:46
详细信息:
这篇文章和OICQ本身没有什么联系，我只是想讲一下程序破解的原理和方法，我在
这里会尽量用易懂的语言来描述，如果你是一个初学者，那么，此文就是为你而写的。

    我以OICQ99C 0820版为例，其它版本如OICQ2000
的破解方法基本上和此版本没有区
别。

首先，在OICQ目录下，每个使用者号码下有一个叫matrix.cnt的文件，此文件的长
度是20字节，它的内容就是此号码的原密码经过加密后对应的密文。要证明这一点非常
容易，只要稍有一点电脑能力的人都可以证明，所以这里我就不费口舌了。在正式开始
前，请用二进制编辑器打开此文件，熟悉一下内容。

启动OICQ，出现OICQ用户登录画面，选择你自己的号码，然后输入一个错误的密码
，此时按CTRL+D进入SOFTICE画面，设置断点。我们事先应该都知道OICQ检查密码是否正

确的工作原理，即：先用GetWindowText()来取得密码框中的密码字符串，将此字符串用
其内定的算法进行加密，得出加密后的密文，然后从磁盘中读取matrix.cnt，与用户输
入的密码的加密结果进行比较，如果相同，则用户输入的密码为正确密码。（或者先读
文件，后读取密码框中的值）跟据这个原理，这们应该把断点设在readfile上，即输入
：bpx
readfile。返回程序界面，点击“登录”，出现SOFTICE的画面，指针停在KERNE
L32！READFILE上。按一下F12跳过此函数，将进入OICQ的领空。

我们现在要做的就是特别注意转折语句，就是JZ，JNZ，JMP等第一个字符是J的语句
。因为这们己经假设，程序中必定存在一行转折语句，当用户输入的是正解密码时，它
跳转（或不跳转），而当用户输入错误密码时，它不跳转（或跳转）。小心地按F10单步
执行代码，在出现转折语句处设下一断点（只是做一个记号），并且记录它们的跳转情
况（经验丰富者知道哪里有必要下断点而哪里没有必要），直到程序出现密码错误的对
话框为止。

这时候你可能己经花去了1分钟的时间。好的，现在输入正确的密码作为比较。同样
单步地执行代码，你将看到上次你在跳转语句上作的记号。比较两次的跳转是否相同。

    你将看到，当程序运行到这里时，前后两次的跳转方向不同：
...
00441C1B　　call 0046c256
00441C20　　cmp eax, ebx
00441C22　　jz 00441C28----->就是这里！
00441C24　　mov esi, edi
...

分析一下这几个代码，它首先调用函数0046C256，然后比较EAX与EBX的值，如果EAX与E
BX的值相同，就跳转。我们重新执行程序，发现当输入正确密码时，EAX=1，当输入错误
密码时，EAX=0，而EBX总是0。所以，函数0046C256是一个可疑的函数！
    按F8进入函数0046C256，我们要看看它做了什么工作。
:0046C256　　mov eax, 004CD33C
:0046C25B　　call 00486B88
:0046C260　　sub esp, 00000010
:0046C263　　push esi
:0046C264　　push edi
:0046C265　　mov esi, ecx
:0046C267　　mov eax, dword ptr [ebp+08]
:0046C26A　　and dword ptr [ebp-04], 00000000
:0046C26E　　push [eax-08]
:0046C271　　push eax
:0046C272　　lea eax, dword ptr [ebp-1C]
:0046C275　　push eax
:0046C276　　call 00456718
:0046C27B　　add esp, 0000000C
:0046C27E　　push 00000001
:0046C280　　pop edi
:0046C281　　cmp dword ptr [esi+04], edi
:0046C284　　jbe 0046C29E

:0046C286　　lea eax, dword ptr [ebp-1C]
:0046C289　　push 00000010
:0046C28B　　push eax
:0046C28C　　lea eax, dword ptr [ebp-1C]
:0046C28F　　push eax
:0046C290　　call 00456718
:0046C295　　add esp, 0000000C
:0046C298　　inc edi
:0046C299　　cmp edi, dword ptr [esi+04]
:0046C29C　　jb 0046C286
:0046C29E　　int 03
:0046C29F　　mov byte ptr [eax], 6A
:0046C2A2　　adc byte ptr [ebp+5056E445], cl
:0046C2A8　　call 00487900
:0046C2AD　　mov esi, eax
:0046C2AF　　add esp, 0000000C
:0046C2B2　　neg esi
:0046C2B4　　sbb esi, esi
:0046C2B6　　or dword ptr [ebp-04], FFFFFFFF
:0046C2BA　　lea ecx, dword ptr [ebp+08]
:0046C2BD　　inc esi
:0046C2BE　　call 004A0665

:0046C2C3　　int 03
:0046C2C4　　dec ebp
:0046C2C5　　hlt
:0046C2C6　　mov eax, esi
:0046C2C8　　pop edi
:0046C2C9　　pop esi
:0046C2CA　　mov dword ptr fs:[00000000], ecx
:0046C2D1　　leave
:0046C2D2　　ret 0004
...
    按F10单步执行。我们发现在这个函数中有一个非常有意思的地方：
:0046C286　　lea eax, dword ptr [ebp-1C]
:0046C289　　push 00000010
:0046C28B　　push eax
:0046C28C　　lea eax, dword ptr [ebp-1C]
:0046C28F　　push eax
:0046C290　　call 00456718
:0046C295　　add esp, 0000000C
:0046C298　　inc edi
:0046C299　　cmp edi, dword ptr [esi+04]
:0046C29C　　jb 0046C286
程序反复地执行这些代码！！

为了能看的更清楚些，我用C++语言来简述这几个语句：
for( long i=0 ; i< *(esi+04) ; i++)
{
eax=*(ebp-1c);
调用函数 00456718;
}
就是说，函数00456718要被调用很多次，这个次数就是ESI+04的值，用D
ESI+04命令来
查看其值，天哪！这不是matrix.cnt的内容吗？（你原先在二进制编辑器中己经打开过
此文件并且看到过它的内容）而ESI+04正是matrix.cnt的前4个字节！我们现在有足够的
理由相信，密码被加密成了128位（即16个字节），且加密函数存在于函数00456718中！

抬起眼睛看一下，在函数0046C256中，一开始也调用了一次00456718函数！为了再
进一步地证实我们的设想，让我们再重新运行OICQ，输入一个错误的密码，但这次你输
入的密码长度最好和正确密码的长度相同，在第一次调用00456718前设下一个断点：
:0046C265　　mov esi, ecx
:0046C267　　mov eax, dword ptr [ebp+08]
:0046C26A　　and dword ptr [ebp-04], 00000000----->在这里设一个断点
:0046C26E　　push [eax-08]
:0046C271　　push eax
:0046C272　　lea eax, dword ptr [ebp-1C]
:0046C275　　push eax
:0046C276　　call 00456718

当程序运行至断点处时，查看各个寄存器的值，你在EAX里看到了什么？是的，EAX
里面是你输入的密码，你用这个密码进行登录，程序将出现密码错误的信息，但是，如
果你此时修改一下EAX的值，把它改为正确的密码，你又惊喜地发现：OICQ己经成功地登
录了！注意：只要你稍微留意一下，EAX-8的值正是密码的长度。以上的事实己经证明了
：函数00456718就是OICQ的加密函数。

跟据种种迹象，这个函数具体是什么算法，学过密码学的朋友己经不用往下看了。
但我们还必须深入证实。
    按F8，将看到此函数：
:00456718　　push ebp
:00456719　　mov ebp, esp
:0045671B　　sub esp, 0000005C
:0045671E　　lea eax, dword ptr [ebp-5C]
:00456721　　push eax
:00456722　　call 00455A6E
:00456727　　push [ebp+10]
:0045672A　　lea eax, dword ptr [ebp-5C]
:0045672D　　push [ebp+0C]
:00456730　　push eax
:00456731　　call 00455AA9
:00456736　　lea eax, dword ptr [ebp-5C]
:00456739　　push eax
:0045673A　　push [ebp+08]

:0045673D　　call 004565FD
:00456742　　add esp, 00000018
:00456745　　leave
:00456746　　ret
函数看上去很短小，但它又调用了三个函数。查看第一个函数：
:00455A6E　　push esi
:00455A6F　　mov esi, dword ptr [esp+08]
:00455A73　　push 0000005C
:00455A75　　push 00000000
:00455A77　　push esi
:00455A78　　call 00486FD0
:00455A7D　　and dword ptr [esi+10], 00000000
:00455A81　　and dword ptr [esi+14], 00000000
:00455A85　　and dword ptr [esi+58], 00000000
:00455A89　　add esp, 0000000C
:00455A8C　　mov dword ptr [esi], 67452301
:00455A92　　mov [esi+04], EFCDAB89
:00455A99　　mov [esi+08], 98BADCFE
:00455AA0　　mov [esi+0C], 10325476
:00455AA7　　pop esi
:00455AA8　　ret

看到标有红色的四个语句了吗？加密函数在一开始设置了4个32位的常数！！接下来
，在函数00455D5A中连续出现了64次诸如：

00455D60　　mov edi, dword ptr [ebp+08]
00455D63　　xor ebx, edx
00455D65　　add ebx, dword ptr [eax]
00455D67　　lea edi, dword ptr [edi+ebx-28955B88]　;注意，这是个常数！
00455D6E　　mov ebx, edi
形式的语句。至此为止，OICQ用的是什么加密算法，己经是不言而明了


WINZIP8.0PASSWORD追踪部分认识

 标 题:WINZIP8.0PASSWORD追踪部分认识 (7千字)
发信人:KINGSUN
时 间:2001-9-1 16:07:31
详细信息:
WINZIP8.0PASSWORD追踪部分认识

1.加密加压一个ABC.ZIP
2.解压ABC.ZIP，输入PASSWORD
3.BPX HMEMCPY 确认PASSWORD
4.按F12 进入无模块提醒领空
5.U 20001EC6
6.BPX 20001EC6
7.F5拦截成功如下

:20001EC6 A1CC4D0620 mov eax, dword ptr [20064DCC]--passwod
:20001ECB 56 push esi
:20001ECC 50 push eax
:20001ECD E83EFDFFFF call 20001C10----计算1
:20001ED2 8B4D08 mov ecx, dword ptr [ebp+08]
:20001ED5 83C404 add esp, 00000004
:20001ED8 33F6 xor esi, esi
:20001EDA 8B11 mov edx, dword ptr [ecx]
:20001EDC 8955F4 mov dword ptr [ebp-0C], edx
:20001EDF 8B4104 mov eax, dword ptr [ecx+04]
:20001EE2 8945F8 mov dword ptr [ebp-08], eax
:20001EE5 8B4908 mov ecx, dword ptr [ecx+08]
:20001EE8 894DFC mov dword ptr [ebp-04], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:20001F0E(C)
|
:20001EEB E890FCFFFF call 20001B80---计算2
:20001EF0 8A5435F4 mov dl, byte ptr [ebp+esi-0C]
:20001EF4 32D0 xor dl, al
:20001EF6 8AC2 mov al, dl
:20001EF8 885435F4 mov byte ptr [ebp+esi-0C], dl
:20001EFC 25FF000000 and eax, 000000FF
:20001F01 50 push eax
:20001F02 E899FCFFFF call 20001BA0----计算3
:20001F07 83C404 add esp, 00000004
:20001F0A 46 inc esi
:20001F0B 83FE0C cmp esi,0000000C--oc=12,
( the encryption header=12 bytes )
:20001F0E 7CDB jl 20001EEB--计算2. 计算3 循环12计算
:20001F10 8B15240F0320 mov edx, dword ptr [20030F24]
:20001F16 660FB645FF movzx ax, byte ptr [ebp-01]--计算结果
:20001F1B F6422002 test [edx+20], 02
:20001F1F 7414 je 20001F35

:20001F35 8B156A170820 mov edx, dword ptr [2008176A]--crc32
:20001F3B C1EA18 shr edx, 18
:20001F3E 663BC2 cmp ax, dx
:20001F41 7407 je 20001F4A

计算1--可能是PAUL文章如下部分：
process_keys(key):
key0_{1-l} <-- 0x12345678
key1_{1-l} <-- 0x23456789
key2_{1-l} <-- 0x34567890
loop for i <-- 1 to l
update_keys_{i-l}(key_{i})
end loop
end process_keys

:20001C10 55 push ebp
:20001C11 8BEC mov ebp, esp
:20001C13 56 push esi
:20001C14 8B7508 mov esi, dword ptr [ebp+08]--password
:20001C17 C7058840032078563412 mov dword ptr [20034088], 12345678
:20001C21 C7058C40032089674523 mov dword ptr [2003408C], 23456789
:20001C2B C7059040032090785634 mov dword ptr [20034090], 34567890
:20001C35 8A06 mov al, byte ptr [esi]--password
:20001C37 84C0 test al, al
:20001C39 7416 je 20001C51

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:20001C4F(C)
|
:20001C3B 25FF000000 and eax, 000000FF
:20001C40 50 push eax
:20001C41 E85AFFFFFF call 20001BA0 -----计算1.1
:20001C46 8A4601 mov al, byte ptr [esi+01]--next password
:20001C49 83C404 add esp, 00000004
:20001C4C 46 inc esi---password长度+1
:20001C4D 84C0 test al, al
:20001C4F 75EA jne 20001C3B --password长度=0 NO JUMP

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:20001C39(C)

:20001C51 5E pop esi
:20001C52 5D pop ebp
:20001C53 C3 ret

计算1.1

* Referenced by a CALL at Addresses:
|:20001C41 , :20001CB7 , :20001D0B , :20001D44 , :20001D78
|:20001DEE , :20001F02 , :20001F93 , :20008ACC
|
:20001BA0 55 push ebp
:20001BA1 8BEC mov ebp, esp
:20001BA3 8B1588400320 mov edx, dword ptr [20034088]-12345678
:20001BA9 8B4508 mov eax, dword ptr [ebp+08]- password
:20001BAC 8BCA mov ecx, edx
:20001BAE 56 push esi
:20001BAF 33C8 xor ecx, eax
:20001BB1 81E1FF000000 and ecx, 000000FF
:20001BB7 C1EA08 shr edx, 08
:20001BBA 8B0C8D04110320 mov ecx, dword ptr [4*ecx+20031104]
:20001BC1 33CA xor ecx, edx
:20001BC3 8B158C400320 mov edx, dword ptr [2003408C]-23456789
:20001BC9 890D88400320 mov dword ptr [20034088], ecx
:20001BCF 81E1FF000000 and ecx, 000000FF
:20001BD5 03CA add ecx, edx
:20001BD7 8B1590400320 mov edx, dword ptr [20034090]-3456790
:20001BDD 69C905840808 imul ecx, 08088405
:20001BE3 41 inc ecx
:20001BE4 8BF2 mov esi, edx
:20001BE6 890D8C400320 mov dword ptr [2003408C], ecx
:20001BEC 81E6FF000000 and esi, 000000FF
:20001BF2 C1E918 shr ecx, 18
:20001BF5 33CE xor ecx, esi
:20001BF7 5E pop esi
:20001BF8 C1EA08 shr edx, 08
:20001BFB 8B0C8D04110320 mov ecx, dword ptr [4*ecx+20031104]
:20001C02 33CA xor ecx, edx
:20001C04 890D90400320 mov dword ptr [20034090], ecx --[20034090]
结果存放地址
:20001C0A 5D pop ebp
:20001C0B C3 ret

计算2
:20001B80 8B0D90400320 mov ecx, dword ptr [20034090]
:20001B86 83C902 or ecx, 00000002
:20001B89 8BC1 mov eax, ecx
:20001B8B 83F001 xor eax, 00000001
:20001B8E 0FAFC1 imul eax, ecx
:20001B91 25FFFF0000 and eax, 0000FFFF
:20001B96 C1E808 shr eax, 08
:20001B99 C3 ret

计算3
:20001BA0 55 push ebp
:20001BA1 8BEC mov ebp, esp
:20001BA3 8B1588400320 mov edx, dword ptr [20034088]
:20001BA9 8B4508 mov eax, dword ptr [ebp+08]
:20001BAC 8BCA mov ecx, edx
:20001BAE 56 push esi
:20001BAF 33C8 xor ecx, eax
:20001BB1 81E1FF000000 and ecx, 000000FF
:20001BB7 C1EA08 shr edx, 08
:20001BBA 8B0C8D04110320 mov ecx, dword ptr [4*ecx+20031104]
:20001BC1 33CA xor ecx, edx
:20001BC3 8B158C400320 mov edx, dword ptr [2003408C]
:20001BC9 890D88400320 mov dword ptr [20034088], ecx
:20001BCF 81E1FF000000 and ecx, 000000FF
:20001BD5 03CA add ecx, edx
:20001BD7 8B1590400320 mov edx, dword ptr [20034090]
:20001BDD 69C905840808 imul ecx, 08088405
:20001BE3 41 inc ecx
:20001BE4 8BF2 mov esi, edx
:20001BE6 890D8C400320 mov dword ptr [2003408C], ecx
:20001BEC 81E6FF000000 and esi, 000000FF
:20001BF2 C1E918 shr ecx, 18
:20001BF5 33CE xor ecx, esi
:20001BF7 5E pop esi
:20001BF8 C1EA08 shr edx, 08
:20001BFB 8B0C8D04110320 mov ecx, dword ptr [4*ecx+20031104]
:20001C02 33CA xor ecx, edx
:20001C04 890D90400320 mov dword ptr [20034090], ecx--好象最终结果是解密解压的key
:20001C0A 5D pop ebp
:20001C0B C3 ret

KINGSUN

版权所有


WINZIP的密码校对原理

 标 题:WINZIP的密码校对原理 (3千字)
发信人:KINGSUN
时 间:2001-8-29 17:21:41
详细信息:
WINZIP的密码校对原理

WINZIP的密码校对用CRC，看输入密码经过计算同加密文件中的CRC是否相同，调用程序是WINZIP8.0的WZ32.DLL，过程如下：

:20001E8A A1CC4D0620 mov eax, dword ptr [20064DCC] （密码）
:20001E8F 85C0 test eax, eax
:20001E91 7416 je 20001EA9
:20001E93 8D45F4 lea eax, dword ptr [ebp-0C]
:20001E96 50 push eax
:20001E97 E824000000 call 20001EC0 （CRC校对开始）
.
.
.
:20001EC0 55 push ebp
:20001EC1 8BEC mov ebp, esp
:20001EC3 83EC0C sub esp, 0000000C
:20001EC6 A1CC4D0620 mov eax, dword ptr [20064DCC]
:20001ECB 56 push esi
:20001ECC 50 push eax
:20001ECD E83EFDFFFF call 20001C10 （第一计算）
:20001ED2 8B4D08 mov ecx, dword ptr [ebp+08]
:20001ED5 83C404 add esp, 00000004
:20001ED8 33F6 xor esi, esi
:20001EDA 8B11 mov edx, dword ptr [ecx]
:20001EDC 8955F4 mov dword ptr [ebp-0C], edx
:20001EDF 8B4104 mov eax, dword ptr [ecx+04]
:20001EE2 8945F8 mov dword ptr [ebp-08], eax
:20001EE5 8B4908 mov ecx, dword ptr [ecx+08]
:20001EE8 894DFC mov dword ptr [ebp-04], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:20001F0E(C)
|
:20001EEB E890FCFFFF call 20001B80 （第2计算）
:20001EF0 8A5435F4 mov dl, byte ptr [ebp+esi-0C]
:20001EF4 32D0 xor dl, al
:20001EF6 8AC2 mov al, dl
:20001EF8 885435F4 mov byte ptr [ebp+esi-0C], dl
:20001EFC 25FF000000 and eax, 000000FF
:20001F01 50 push eax
:20001F02 E899FCFFFF call 20001BA0 （第3计算）
:20001F07 83C404 add esp, 00000004
:20001F0A 46 inc esi
:20001F0B 83FE0C cmp esi, 0000000C
:20001F0E 7CDB jl 20001EEB （按密码长度反复计算）
:20001F10 8B15240F0320 mov edx, dword ptr [20030F24]
:20001F16 660FB645FF movzx ax, byte ptr [ebp-01] （计算结果）
:20001F1B F6422002 test [edx+20], 02
:20001F1F 7414 je 20001F35 -------》JUMP

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:20001F1F(C)
|
:20001F35 8B156A170820 mov edx, dword ptr [2008176A] （文件的CRC码）
:20001F3B C1EA18 shr edx, 18
:20001F3E 663BC2 cmp ax, dx
:20001F41 7407 je 20001F4A --相等就合法JUMP

文件的CRC码在WINZIP中查看属性，或文件的HEX地址：0000000E---00000011

关键问题：谁能写一个程序，按照文件的CRC码反计算密码，普度众生！

KINGSUN
2001-08-29 版权所有


邹丹的补丁教学

怎样为程序打补丁（一）―――基础篇

声明：

一．本文实用于初学者，需要具备一定的汇编和系统底层的知识。
二．本文只是为了让广大网友共同提高一些基础知识，本人决无卖弄之意，只供需要这方面知识的读者阅读，如果你是高手，或者不需要这方面知识，请跳过。
三．本文的实例均为普通程序，如有雷同，敬请谅解。
四．本文欢迎传抄转载，如果是商业用途，请联系本人。http://www.zoudan.com zoudan@sina.com

打补丁是常见的一种软件升级和更新手段。打补丁的形式很多，本文所述的方式基本上为修改原程序二进制代码的方式，适用于Windows95之后的平台（Win32）。

Windows95（Win32）以后的可执行文件都是PE格式，.exe、.ocx、.dll.等等都是常见的PE格式的文件映像，看一个文件是否为PE文件，不是看它的扩展名，而是看它的文件头中是否有PE文件头标示和具体的文件内容。比如常见的软件"追捕"中那个wry.dll，就不是一个PE格式的Dll（动态连接库）文件，通常用16进制编辑软件打开文件首部观察便可得知。关于PE文件的具体格式和教程不是本文的描述范围，大家可以查阅相关的资料，我网站上那篇"关于95下的可执行文件加密研究"中也有比较详尽的描述。

PE文件是一个程序代码、数据的集合。其中的程序代码是该执行文件本身的，它可能通过动态连接的形式访问其他附属的程序或者动态连接库，通常一个程序文件中包含了大量的系统调用和对其他程序及动态连接库的调用。

言归正传，无论是破解，程序改良或者程序升级，在改动不大，且没有源程序参考的情况下，最直接的方法就是更改PE可执行文件。大家都知道我制作的补丁程序，基本上就是直接修改程序文件，使之达到我们需要得到的功能。

一个PE可执行文件中通常有很多段（section），分别描述不通的数据结构和代码。最基本的几种段有.code(.text)（代码段）、.data（数据段）、.rdata、.rscs（资源）等等，这些段的名称可以是程序自定，决定它们属性的不是他的名称，而是PE文件头中的描述。有很多查看PE文件结构和内容的软件，我向大家推荐Borland C自带的一个叫Tdump的小软件，很简单和方便，在现在的Borland C++ Builder和Borland C中都有，大家可以用他来了解PE文件的内部信息。

一般来说，修改资源段中的东西最为简单。那些对话框、字符串、位图等等。修改这些资源很容易，因为有很多这方面的软件，最常见的就是VC++，只要用VC用资源修改方式打开程序文件，所有这个程序相关的资源就会很容易的修改了。大家可以随便找几个程序来试试手，挪挪对话框，改改属性，编辑文字，画画位图，很容易上手和熟悉。

修改程序文件的其他地方就没有修改资源段容易了，程序当然都是汇编机器代码，数据也是未知的结构。关于怎样看懂、跟踪、了解程序的运作就是一件非常经验的事情，不同的程序不同的方法，没有定式，它们唯一的共同点就是都是汇编代码，都能用软件反汇编和动态调试。这也已经超出了本文的范畴，我想它需要扎实的汇编基础，系统底层知识以及丰富的程序调试经验，不可能在很快的时间内掌握。这需要耐心，长时间的实战以及积累。在此我向大家推荐我常用的工具，静态的反汇编可以用IDA pro，使用该软件你会发现枯燥乏味的汇编代码变得井井有条，且多了很多帮助理解的注释，当然还有很多重要程序库的符号，比如MFC库类，标准C库等等。该程序是最好的反汇编工具，为我们读懂苦涩的机器指令提供了良好的互动环境。光静态分析汇编代码无疑是极其困难的，光靠眼睛看不可能看到寄存器，内存单元数据等等和程序运行息息相关的东西。关键是汇编代码苦涩难懂，动态的调试就成了我们深入了解程序、调试程序、探测程序的最重要的手段。我所提到的动态调试是汇编级别的，并非任何高级语言。值得提到的是有些程序带有调试符号信息，那会为我们动态调试提供很大很大的便利，不过一般Release版本都不会把调试信息链接到最终的程序文件中，粗心的程序员有可能犯这个错误。总之，汇编级的调试一般来说都非常的艰苦，不过动态调试和静态阅读相结合还是会使效率提高很多。动态调试的软件很多，而且都支持汇编级别的调试。一般集成变成环境都带有这种工具，比如VC++，C++ Builder等等。专业调试软件有W32dasm、Trw、Soft-ice等等，在这个领域里，Soft-ice无疑是绝对的佼佼者。我觉得几乎没有Soft-ice触及不到的深度，Soft-ice为我们了解系统的任何一个细节提供了可能，从DOS时代到windows时代，Soft-ice无疑是动态调试领域最重要的工具。好话说得够多了，我不是在为它打广告，实事的确如此，网上很容易下载到它的各种版本。Soft-ice虽然很厉害，但是对初学者来说的确不容易掌握，且更需要扎实的底层基础。掌握了它就为掌握了系统的最底层提供了可能，这无疑是个核武器。

关于具体怎么放置补丁程序，用DLL动态连接库方式编制复杂的补丁程序等等细节问题我将在以后的文章中介绍，请各位网友密切留意。

本篇总结：
1． 本系列文章讨论的主要话题和范围。
2． PE文件是Win32平台的可执行文件。
3． 关于修改资源段的问题。
4． 其他一些相关知识的介绍。
5． 几种工具的推荐及其简要介绍。

邹丹 于 2001年7月2日

怎样为程序打补丁（二）―――提高篇

声明：

一．本文实用于初学者，需要具备一定的汇编和系统底层的知识。
二．本文只是为了让广大网友共同提高一些基础知识，本人决无卖弄之意，只供需要这方面知识的读者阅读，如果你是高手，或者不需要这方面知识，请跳过。
三．本文的实例均为普通程序，如有雷同，敬请谅解。
四．本文欢迎传抄转载，如果是商业用途，请联系本人。http://www.zoudan.com zd_dan@263.com

不知道各位把“基础篇”中的内容搞懂没有，我现在要带领大家提高啦，请各位用心听讲!

这次要教大家的是如何为程序添加功能。大家都知道，在可执行文件当中只有少量的空间和位置可以放置我们的补丁程序，这就注定了要实现比较复杂的功能是非常有局限的。想象一下，如果在人家程序中添加大量的汇编代码，且只能是汇编代码（不要问我为什么），并且调试运行。因为是在人家的运行环境中运行，必须维护大量的寄存器，地址空间，堆栈等等，那将是何其困难和痛苦的一件事情。汇编能作很多事情，但是也不是万能，要用汇编实现很多复杂的功能简直就是变态的行为。我为大家制作的FolkQQ补丁程序，其实汇编代码也就几十行，功能也很简单，就几十个字节。但这已经使我够痛苦的了，如果再多些，常人是吃不消的（调试运行这些代码很费力，如果一个地方错了至少得重敲，而且死机重起是常事）。

看到这里，可能有同学会问，像你的SE补丁系列，实现了IP地址到具体物理地址的转换，难道也是你用汇编写的吗（用汇编写这个会死人的）？当然不是，大家注意到有个IPsearcher.dll，这是一个动态链接库，看名字就知道这是关于IP地址转换成实际地址功能的东东。对，所有的转换工作就是在其中完成。他是我用VC写的，程序很简单，但是如果用汇编写那就复杂了。我想我自己都没有毅力把它用汇编写完，然后一个一个字节一个一个指令的敲到人家的程序中去。

呵呵，今天要教大家的就是如何在补丁程序中实现复杂的功能，具体问题在上面已经描述了，方法就是为程序附带一个动态链接库，把所有复杂的功能都留在DLL里面，让高级语言去作低级语言难于实现的功能，留出接口，供被打补丁的使用即可。

关于什么是DLL，我想不用我再多说了。简单的理解就是一个函数库，别人调用它，它具体完成，就这么简单。大家可以用软件看看我写的那个IPsearcher.dll（用tdump，或者VC中的工具depends.exe）,可以看到其中只有一个函数接口，叫“_GetAddress”。给它一个IP地址的作为参数，它就能返回那个IP地址的实际地址。具体它的实现不在我们今天的讨论范围当中。

问题的关键就是如何在要被打补丁的程序中调用到这个动态链接库，让它为我们添加的补丁程序服务。

再往下看，就需要各位同学具备一定的Win32 PE格式的可执行文件的基础了（可以参考我以前写的“关于Win95下的可执行文件的加密研究”和“基础篇”）。在PE文件中，指定了该程序要使用到的所有动态链接库，还有要调用的哪个函数接口。这些信息都写在一个叫Import Table的数据结构当中。它描述了某个动态链接库的某个函数接口的调用地址，这个是为了使系统能够为该程序装入动态链接库并且重定位接口地址信息的。

可能大家有点晕菜了，没关系。让我用一个实例来解释一下Import Table。我们用tdump 打开一个PE格式的可执行文件：

C:\>tdump example.exe |more
Turbo Dump Version 5.0.16.12 Copyright (c) 1988, 2000 Inprise Corporation

........

Name RVA Size
------------------ -------- --------
Exports 00000000 00000000
Imports 0019CFA0 0000017C
Resources 00287000 00077F18

........

# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 00157744 00001000 00158000 00001000 60000020 [CER]
02 .rdata 0004723A 00159000 00048000 00159000 40000040 [IR]
03 .data 000E5C28 001A1000 0002A000 001A1000 C0000040 [IRW]

.......

Section: Import
ImportLookUpTblRVA:0019D938
Time Stamp: 00000000
Forwarder Chain: 00000000 (index of first forwarder reference)

Imports from WINMM.dll
(hint = 0071) mixerOpen
(hint = 0065) mixerClose
(hint = 006B) mixerGetLineControlsA

先说说第一个出现红字的地方，这是这个程序的Import Table的RVA地址（什么是RVA自己查）和长度；第二个红字是1A1000，它大于19CFA0，说明什么呢，Import Table的地址在.rdata段当中（好像知道了也没什么用，呵呵，写都写了，也不管这么多了）；第三个红字的地方就是tdump解析出的Import Table具体的内容，比如有个叫WINMM.DLL的动态链接库，需要调用它的序列号是0ach的waveOutClose 函数。诸如此类的后面还有很多很多，通常一个程序需要调用至少是几个的动态链接库（kernel32.dll，user32.dll等等）。

那Import Table在文件中具体的样子是什么呢，同学们可以用UltraEdit打开偏移为19CFA0的地方看看。然后结合我给出的数据结构和tdump解析出的结果，具体分析和理解一下。

以下摘抄于“关于Win95下的可执行文件的加密研究”

.idata块以一个IMAGE_IMPORT_DESCRIPTOR数组开始。每一个被PE文件隐式连结进来的DLL都有一个IMAGE_IMPORT_DESCRIPTOR。在这个数组中，没有字段指出该结构数组的项数，但它的最后一个单元是NULL，可以由此计数算出该数组的项数。IMAGE_IMPORT_DESCRIPTOR的格式如下：
Dword Characteristics
该字段是一个指针数组的RVA偏移。其中每一个指针都指向一个IMAGE_IMPORT_BY_NAME结构
Dword TimeDateStamp
时间及日期标志，可以忽略。
Dword ForwarderChain
正向链结索引。我们的资料中没有函数正向链结的格式，也没有这一样的例子。
Dword Name
以NULL结尾的ASCII字符的RVA地址，该字符串包含输入的DLL名，比如“Kernel32.dll”或“USER32.DLL”。
PIMAGE_THUNK_DATA FirstThunk
该字段是在Image_thunk_data联合结构中的RVA偏移。大多数情况下，Image_thunk_data是指IMAGE_IMPORT_BY_NAME结构的指针。如果不是一个指针的话，那它就是该功能在DLL中的序号。

IMAGE_IMPORT_DESCRIPTOR重要的部分有输入的DLL名字及两个IMAGE_IMPORT_BY_NAME指针数组。在执行文件中，这两个指针数组彼此平行，末尾都是以Null表示数组的结束。下图给出了这种关系的图形描述。

为什么由两个并行的指针数组指向IMAGE_IMPORT_BY_NAME结构呢？第一个Characteristics是单独的一项，而且不可改写，它有时被称为提示名表（Hint Name Table）。第二个数组（FirstThunk所指）是由PE装入器重写的。装载程序迭代搜索数组中的每一个指针，找到每一个IMAGE_IMPORT_BY_NAME结构所指的输入函数的地址，然后装载器找到程序的地址改写IMAGE_IMPORT_BY_NAME指针。Jmp dword ptr [xxxxxxxx]中的[xxxxxxxx]是指First Thunk数组中的一个入口。因为它被称为输入地址表（Import Address Table）。

好了，不知道大家看明白了没有，对Import Table不解的地方可以仔细查看我的文章，那里面有很详细的阐述。

我们的目标已经很明确了，把我们自己的DLL描述添加到被打补丁程序的Import table当中，让系统在装入该程序的同时，装入我们自己的DLL，并且做好重定位，为我们的补丁程序调用DLL中的接口做好准备。

我们可以直接修改Import Table，如果空间足够，我们可以这么干。但是Import Table往往是个很小一块数据，可以为一个段，也可以塞在程序的任何地方。所以Import Table的往往前后都是其他数据，我们要加一项都是很困难的事情（其实一项也就20个字节）。那如果前后都是有数据的怎么半，没关系，直接全部挪到其他空闲的地方去（什么地方空闲，请看“基础篇”）。但一定要记得的是，必须修改PE部首的字段（第一个红字所描述的地方），改到你自己的Import Table所在的地方，当然，长度也要修改（通常一个DLL就是一项，一项就是20个字节）。

最重要最关键的就是自己构造一个Import Table的表项了。（喝口水，稍等）

关于表项的具体数据结构和描述已经在上面讲述了。用UltraEdit改二进制文件就像是给病人开刀，要格外小心谨慎。要记住，每个数据的每一位都像是病人身上的肉肉，动刀前先要有信心，要有把握，谨慎，仔细，把稳。。。。

算了，说得我自己都紧张了，还是我一手一手示范讲解吧。（上个WC，不好意思）

回来了，我接着和大家聊。让我们先来看看一个实际PE可之行文件的16进制映像吧。就拿那个程序为例，我们已经知道它的Import Table的起始RVA地址(0019CFA0)，用UltraEdit打开该程序，按那个Goto按钮，接着输入地址“0x19CFA0”回车。这样你就会在编辑其中看到该文件Import Table的样子。（如下图）

大家可以看到这个可执行文件的从19cfa0到19d11b共17C个字节的Import Table，其中最后20个字节是一个空表项，它表示这个Import Table的结束。可以看到，在Import Table结束之后仍然有大量的未知数据，这就给我们添加表项带来了困难。该怎么办呢，前面已经提到，挪到其他地方去。怎么挪？

1。先找空地方，我们找到001A0250，它在.rdata和.data中间，大家可以自己用UltraEdit找各个段的接逢处，往往有空余的空间。（怎么找空隙请参阅“基础篇”）

2。把UltraEdit的光标移动到地址19cfa0到19d11f（0x180h个字节），然后按Ctrl-c拷贝。然后移动光标到1A0250，选住空白的0x180h个字节好（如果不选住再粘贴就是插入了），按Ctrl-V。这样我们就把以前的Import Table拷贝到了新的地方（以前Import Table 19cfa0的数据不用删除）。

3。拷贝完了之后还需要把PE文件头Dir Table中的Import Table的首址RVA指向到新的地方。具体做法是，在文件头部查找16进制数A0 CF 19 00(也就是19cfa0)， 把它改成50 02 1A 00 （1a0250），然后紧接着后面两个自己是Import Table的长度，以前是17Ch，现在改成17Ch+14h=190h。（14h=20，这是一个表项的长度）

挪完了，让我们用tdump 检查一下文件：

Name RVA Size
------------------ -------- --------
Exports 00000000 00000000
Imports 001A0250 00000190

.......

Section: Import
ImportLookUpTblRVA:0019D938
Time Stamp: 00000000
Forwarder Chain: 00000000 (index of first forwarder reference)

Imports from WINMM.dll
(hint = 0071) mixerOpen
(hint = 0065) mixerClose
(hint = 006B) mixerGetLineControlsA

第一个红字的地方说明我们已经把Import Table的首址改到了1a0250长度是190了。第二个红字的地方说明新的Import Table的表项数据是可靠的。

好了，最关键的最激动人心的时候到了，让我们真正为这个新的Import Table添加表项，添加表项必须是要建立在你已经完全对Import Table结构了解的基础上，输入的过程就是输入一些16进制数和字符串。下面是输入好后的屏幕切图，我将结合该图为大家讲解。

好了，大家已经看到了，这是添加好表项以后的Import Table，其中1a0250到1a03b8和以前的Import Table一模一样。以前的Import Table在1a03b8以后是20个字节的全零结束符。1a03b9到1a03cc是我们添加的表项，后面的20个字节是新的结束符。然后空了16个字节，接着是DLL信息。

让我把新表项的每一个字段都给大家讲解一下。

1a03b9开始，第一个DWORD是1a0410。地址1a0410是指向的1a03f0，1a03f0这是一个DLL接口的描述（具体结构请自行查阅资料）。可以看到01 00（0001）是_GetAddress函数在DLL中的序列号（IPsearcher.dll中只有一个函数接口，序号是1），然后是一个以0结尾的字符串“_GetAddress”这是函数的名称。

表项的第二个第三个DWORD是timestamp和向后的指针链，不管（只有一个函数，所以指针链是0，表示结束）。

第四个DWORD是1a03e0，它指向DLL文件的文件名，图例中是“ipsearcher.dll”，当然也需要以0结尾。

第五个DWORD是1a0418，这个地址是在图例中有数值，其实可以不管。因为这个地址是系统在装入DLL之后填写的该函数接口的具体地址。我们的补丁程序就是调用这个地址中的地址来调用_GetAddress这个函数。具体怎么访问呢？程序装入地址是40000h，所以该地址在装入之后就是40000h+1a0418h=5a0418h。我们的补丁程序使用call dword ptr [5a0418]就可以调用_GetAddress了。

呵呵，修改Import Table的工作已经结束。我使劲在讲，不知道大家明白了没有，可不要说我没照顾大家的感受！

对了，还有一个很重要的事情。由于在系统装入DLL的时候需要在1a0418中填写函数入口地址，所以，找个地址所在的段必须可写。关于怎么修改段表，使某一个段可写，请参阅我以前的文章。

最后当然要用我们的tdump查看一下我们修改PE文件的结果：

Imports from WININET.dll
(hint = 0075) InternetQueryOptionA
(hint = 0052) InternetCanonicalizeUrlA
(hint = 0056) InternetCloseHandle
(hint = 007E) InternetSetFilePointer
(hint = 0077) InternetReadFile
(hint = 0074) InternetQueryDataAvailable
(hint = 0088) InternetWriteFile
(hint = 0069) InternetGetLastResponseInfoA
(hint = 005C) InternetCrackUrlA
(hint = 0071) InternetOpenUrlA
(hint = 006F) InternetOpenA
(hint = 0083) InternetSetStatusCallback

Imports from ipsearcher.dll
(hint = 0001) _GetAddress

看红字，呵呵，我们已经成功了。这样，被打补丁的程序在装入的时候会自动装入ipsearcher.dll，并且把_GetAddress函数的入口地址填写到1a0418处。

以后该怎么办不是我们今天要探讨的内容，总之我们在被打补丁的程序中已经能够调用新的动态链接库中的函数接口了，这无疑为在补丁中添加实现复杂的功能提供了可能。

呵呵，很有用吧。我表达能力不太好，希望大家看懂了。不懂的自己先努力查资料自己专研，实在不懂的再问我吧。

辛苦大家看这么多，下次再见吧！

本篇总结：
1． 本系列文章讨论的主要话题和范围。
2． PE文件是Win32平台的可执行文件。
3． 关于为程序添加动态连接库的问题。
4． 其他一些相关知识的介绍。
5. 需要参考我以前的文章

邹丹 于 2001年8月18


arm1.01

标 题:使用loader方式破解 arm 1.01 (6千字)
发信人:Fpc
时 间:2001-4-16 19:26:08
详细信息:
使用loader方式破解 arm 1.01
作者:Fpc
arm1.01是近期程序保护方式的一个典型例子 (详情请见不久前的贴子)：
1、使用Aspack(或Asprotect)以及其它压缩软件为文件加壳；
2、加密算法不可逆（昨天看了MD5的算法，应该就是这个），只有暴破一条路。只是现在我还不知道有没有可能通过逐渐逼近的方式得到注册码；
3、脱壳比较困难，对我即如此（虽然Arm可以被Carspr脱壳）。
这样我们就面对比较困难的选择：要么手动，要么等待解压软件。但这两者都是解决问题的正确途径。那么对菜鸟级选手来说，采用Loader方式就是另一种选择。

以Arm为例，它的注册码计算过程至少被调用三次：启动时的检查、启动时对输入注册码的检查、启动后在‘关于’中输入注册码时的检查。显然在正常情况下，这些检查都是对同一个CALL的调用。因此要做的就是在外壳程序完成解压后、第一次对注册码的检查之前在内存中对这个CALL打补丁。这就是Loader的原理。
本例的Loader 的原型在tKC Tutor #25，可能是由 R!SC首先公布出来的，我只做了微小的改动：

;-=-Larm101.asm-=-=-cut & paste me :)=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; based on original loader.exe by Hayras [tNO '98] used in
; Hayras's Neolite v1.22 memory patcher.
; (Loader is also a real mother!!!)
; This is slightly modifide by Fpc @2001.
;
; Special thanks to TNO for graciously allowing me to use this
; source on behalf of Hayras, who has now retired from the scene.
; Yes, Hayras's loader reversed by R!SC, then totally re-written
; & released to the public, so everyone can learn this shit :)
;
; Requires Tasm 5.0 & import32.lib to compile
; make a BatFile as following:
; mk.bat
; <your path>\tasm32 /ml %1.asm
; <your path>\tlink32 /Tpe /aa /c %1,%1,, <your path>\Lib\import32.lib
; [Eof]
; replace <your path> with whatever...
; (c)1999 R!SC (see what i do instead of cracking...duh) yey Prophecy!

.386P
Locals
jumps
.Model Flat ,StdCall
;Define the needed external functions and constants here.
Extrn MessageBoxA:PROC
Extrn WaitForInputIdle:PROC
Extrn WriteProcessMemory:PROC
Extrn ReadProcessMemory:PROC
Extrn CreateProcessA:PROC
Extrn CloseHandle:PROC
Extrn ExitProcess:PROC
;-=-Normal data-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
.Data
CSiR_Tag db ' PE LOADER & CRACKER---R!SC 1999 ',0
CSiR_Error db 'Error!!!',0
CSiR_Error1 db 'Something fucked up...',0
OpenERR_txt db 'CreateProcess Error :(',0
ReadERR_txt db 'ReadProcessMemory Error :(',0
WriteERR_txt db 'WriteProcessMemory Error :P',0
VersionERR_txt db 'Incorrect Version of application :(',0
CSiR_ProcessInfo dd 4 dup (0) ;process handles
CSiR_StartupInfo db 48h dup (0) ;startup info for the process were opening
CSiR_RPBuffer db 10h dup (0) ;read buffer, for checking data
;-=-Patch datas-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
CSiR_AppName db 'arm.exe',0
fuck dd 495825h ; address to read data from for version checking
sizeof dd 10 ; in the new process
checkbytes db 089h,045h,0f0h,0c7h,045h ; the bytes to check for
db 0f4h,01h,0h,0h,00h ; if there not there, we have the wrong version??
patch_data_1 db 0c7h,045h,0f4h,01h,0h,0h,0h,08bh
db 045h,0f4h,08bh,014h,085h,044h,060h,04bh,0h
db 08bh,0c2h,089h,045h,0f0h,090h
patch_size_1 dd 23
patch_addr_1 dd 495825h
.Code
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Main:
push offset CSiR_Tag
mov dword ptr [CSiR_StartupInfo],44h ; (the size in bytes of the structure)
push offset CSiR_ProcessInfo ; Typedef struct _PROCESS_INFORMATION
push offset CSiR_StartupInfo ; Pointer to STARTUPINFO structure
push 0
push 0
push 20h ; Creation flags
push 0
push 0
push 0
push 0
push offset CSiR_AppName ; Pointer to name of executable mod
call CreateProcessA
test eax,eax
jz OpenERR
Wait4Depack:
push 800 ; Timeout (in milliseconds, -1 = infinate)
push dword ptr [CSiR_ProcessInfo] ; Here we take 0.8s
call WaitForInputIdle
Check_Data:
push 0 ; BytesRead
push dword ptr [sizeof] ; Length
push offset CSiR_RPBuffer ; Destination (to read them to)
push dword ptr [fuck] ; Source
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to read
call ReadProcessMemory
test eax,eax
jz ReadERR
;...
;int 03 ;-)
cld
lea esi, CSiR_RPBuffer
lea edi, checkbytes
mov ecx, 10
rep cmpsb
; nop
jnz VersionERR
;...
Patch_the_mother:
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_1] ; Length
push offset patch_data_1 ; Source
push dword ptr [patch_addr_1] ; Destination
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to patch
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR
Close_This_app:
push dword ptr [CSiR_ProcessInfo]
call CloseHandle
push dword ptr [CSiR_ProcessInfo+4]
call CloseHandle
Exit_Proc:
Push LARGE-1
Call ExitProcess
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
VersionERR:
lea eax, VersionERR_txt
jmp abort
ReadERR:
lea eax, ReadERR_txt
jmp abort
OpenERR:
lea eax, OpenERR_txt
jmp abort
WriteERR:
lea eax, WriteERR_txt
abort:
push 0
push offset CSiR_Error ; Title
push eax ; Message
push 0
call MessageBoxA
jmp Close_This_app
End Main
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

这个程序是有缺点的，即机器的速度如果过快或过慢，运行可能就要出错。自己的学艺实在不精。肯请哪位虾虾出手，在其中加入判断机器速度、根据这个速度来确定打补丁的时间。我这里用的800毫秒（0.8秒），在PII 300的条件下正常运行。
最后大家要注意一点，Loader方式回避了对解压这一问题的处理，有点消极，算是没有办法的办法。软件的脱壳技术还是需要掌握的。


Tag&Rename 1.7

 标 题:【标题：Tag&Rename 1.7 文章一 ：跟踪，并且制作Loader。（适合初学者）】
发信人:mcny@work
时 间:2000-11-11 15:39:06
详细信息:
【标题：Tag&Rename 1.7 文章一 ：跟踪，并且制作Loader。（适合初学者）】
========================================================================================
软件 ：Tag&Rename 1.7

软件简介 ：一个可以修改MP3 和 VQF 音乐文件中的TAG说明的程序。目前尚未支持MP3最新的ID3v2
但是，仍然是一个很好用的编辑工具。

下载处 ：软件主页: http://www.softpointer.com/tr.htm
：版本1.7（若找不到）可以在我这里下载:
http://www.geocities.com/mcny_work/orgfile/2000/TagRename17.zip
(888k bytes 不支持断点续传 )

注册方法 ：注册码（与名字无关,而且是不可逆算法，无法计算出注册码）

反跟踪保护 ：Asprotect 1.0 加壳
========================================================================================
破解难度 ：易 （这里是指：找出关键跳转，改变它）
去反跟踪保护难度：易 （这里是指：使用Loader,有现成的代码嘛，不用自己写！
若要自动脱壳的话，有现成的脱壳机(SAC的，我还没用过，不知效果如何)。
若要手工脱壳的话，可以参考http://toye.yeah.net
'破解教学'上的相关文章，难度：中）
使用工具 ：1) Trw2000 v1.22
2) TASM32 5.0(需要3个文件：import32.lib ,tasm32.exe, tlink32.exe)
目标文件 ：TagRename.exe
关键 ：找出关键跳转点，制作一个Loader来改变该跳转（原因：因为软件经过加壳，无
法直接修改目标文件）
----------------------------------------------------------------------------------------
【注1】 ：看雪论坛中，有人曾告诉我：破解是破解，脱壳是脱壳，不能混为一谈。 觉得很有
道理，所以这里就分成两个难度度量：破解、去反跟踪。
【注2】 ：编译连接Loader时，本文没有使用'资源文件'，所以制作出来Loader不会包含图标。有
兴趣，你可以自己补上。
【注3】 ：本文意在给予不曾制作Loader的朋友一个Loader的制作经验。并不是说，制作Loader
才是破解本软件最佳方法。
========================================================================================
本文作者：McNy@Work
日期 ：2000年11月09日
Email ：mcny_work@yahoo.com
（邮件主题请以"WANTED:McNycn"开始，注意英文字母大小写，否则我会收不到喔！）

【目录】
§＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝§
§第一部分：初步追踪 §
§第二部分：进一步追踪，找到关键比较点 §
§第三部分：制作Loader，附：程序源代码 §
§＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝§

-------------------------------【第一部分：初步追踪】-----------------------------------

首先运行 Trw2000 ，用它载入TagRename.exe 。按下'Load'健后，我们来到trw2000的调试框中，
按F5,程序继续运行。然后，TagRename 会出现一个提示框告述你已经使用了几天，还叫你注册。选择
'Unlock'，在Yourname中添入姓名，在Code中添入任意文本。(eg, Name: McNy@Work Code:a )
暂时不要按下OK按钮。

然后,按Ctrl+N, 来到trw2000调试框中。设置断点，键入：bpx hmemcpy ，回车。（<--这可是
经典动作喔!）按F5,让程序继续运行。我们会回到windows 中，按下刚才没按下的OK键。

程序又被中断，我们又来到trw2000调试框中。现在，我们不断的按F10 ，一直到Error对话框出
现（F10 是逐步跟踪）。其中一个ret处按下F10后会来到地址 00508B49。继续跟踪，当用F10越过
00508B76 call 004646EC 后，Error 框出现，告诉你注册码不对！ 按OK ，会回到Trw2000调试框。

很明显，00508B76 处的call 会显示error对话框。要如何避开它呢？我们向上找，发现00508B80
处的JZ有机会避开Error框，条件是AL=1。（当然，我们到这里时的AL<>1，因为注册码不对嘛！）

...
==> 017F:00508B49 MOV EAX,[EBP-08] //某一个ret会返回到此。
017F:00508B4C LEA EDX,[EBP-04]
017F:00508B4F CALL 0408EBC
017F:00508B54 MOV EAX,[EBP-04]
**(A1)** 017F:00508B57 CALL 00456510 //处理、计算、比较注册码!!!
//注册码正确时，返回AL=1。
**(A2)** 017F:00508B5C CMP AL,01
==> 017F:00508B5E JZ 0508B80 //若AL=1，则可以避开error对话框!
017F:00508B60 LEA ECX,[EBP-0C]
017F:00508B63 MOV EAX,[00541A98]
017F:00508B68 MOV EAX,[EAX]
017F:00508B6A MOV DX,01D9
017F:00508B6E CALL 0046DE40
017F:00508B73 MOV EAX,[EBP-0C]
==> 017F:00508B76 CALL 004646EC //会出现error对话框
017F:00508B7B JMP 00508C56
...

聪明的你，一定会想到改变 00508B5C 的比较指令 或者 改变 00508B5E 的条转指令来达到
避开error对话框的目的。但是，这样做的话只对了一半！因为程序不止在一地方调用 call 00456510 。
（我当然是试过才知道嘛！）所以使 call 00456510 的返回结果必定 AL=01才是一劳永逸的方法。

所以，我们也可以修改 00465610 处的代码，使之变成 mov al,01 。 ret。（置AL=1,并马上返回）
但我们不这样做，因为这样做已改变了整个Call的作用，可能会带来潜在的程序错误。我想对原始程
序用最少、最安全的修改来达到我们的目的。

于是，我们本着这样的思路来进行追踪：是什么造成AL=1？原来是地址xxxxxxxx 处的 EBX=1 时。
哪又是什么造成 xxxxxxxx 时的EBX=1?原来是地址yyyyyyyy处的 EAX<>0 ，... 就这样，一直到比较
注册码的地点。

---------------------------------第一部分完-----------------------------------------------

-------------------------------【第二部分：进一步追踪，找到关键比较点】-------------------

我们重新设置所有断点,而新断点设置在上述代码中有注明**(A1)**处，所call的地址。
即 bc * , 回车。bpx 00456510 ，回车 。 按下F5 。TagRename程序继续运行。

按'Unlock'键，'OK'键。程序又被中断，我们来到调试框中，地址是我们刚才设置的断点处，即
00456510 。不断按F10一直到过了第一个RET （下面代码的 **(A4)** 处）。由于第二个RET 才是真
正的RET，所以我们知道地址004565BD处的EBX 决定了即将返回的EAX值（我们要使EAX=1）！

于是我们把注意力转移到EBX。再往上面几行看看，发现00456598 处将1 赋值给BL。但是为什么
我们的是EBX=0 ? 这是因为 00456594 处的JZ 跳转成功！（下面代码的**(A3)** ）

很明显00456594就是我们要改的地方了。只要将 JZ 00456598 去掉即可（即，不管真正结果如
何，我们都令注册码正确(BL=1) ）。键入 code on,回车。先用纸记下00456594处开始的10 Bytes
的代码（制作LOADER时会用到:即74 02 B3 01 8B 45 F8 E8 C8 C9）。

现在，用两个nop取代00456594的JZ 00456598。我们键入a 456594，回车。nop，回车。nop，两
个回车。可以看见，00456594处的代码变成两个nop 了。

让程序继续运行前，我们应该清除所有断点。故键入bc * ，回车。按下F5。TagRename程序继续
运行。程序出现Error框（我们的修改在下一次才生效）。

按'Unlock'键，'OK'键。出现一个对话框感谢我们注册 8^) 。我们的追踪也到此结束了。选择
TagRename 程序中的HELP > ABOUT，出现的ABOUT对话框会显示 Register to: McNy@Work 。

...
==> 017F:00456510 PUSH EBP //此为断点处，程序在这里暂停。
017F:00456511 MOV EBP,ESP
...
...
017F:0045655F MOV EAX,ESI
017F:00456561 CALL 00402F68
017F:00456566 LEA EDX,[EBP-04]
017F:00456569 LEA EAX,[EBP-18]
017F:0045656C CALL 00456460 //由输入S/N，产生"输入码生成串"的
//主要调用。
017F:00456571 MOV DL,01
017F:00456573 MOV EAX,[00410060]
017F:0045657D MOV [EBP-08],EAX
017F:00456580 LEA EAX,[EBP-08]
017F:00456583 CALL 00456404
017F:00456588 MOV EDX,[EBP-04]
017F:0045658B MOV EAX,[EBP-08]
017F:0045658E MOV ECX,[EAX]
017F:00456590 CALL NEAR [ECX+50] //比较"注册码生成串'和两百余个
//"正确的串"。
//若全部不匹配返回EAX=FFFFFFFF
//（内部会调用 Kernel32!CompareStringA）
017F:00456593 INC EAX
**(A3)** 017F:00456594 JZ 0456598 //EAX=0 时跳转。我们改这里!!!
==> 017F:00456598 MOV BL,01 //若上一行不跳转，则注册码正确。
017F:0045659B CALL 00402F68
017F:004565A0 XOR EAX,EAX
017F:004565A2 POP EDX
017F:004565A3 POP ECX
017F:004565A4 POP ECX
017F:004565A5 MOV [FS:EAX],EDX
017F:004565A8 PUSH DWORD 004565BD
017F:004565AD LEA EAX,[EBP-04]
017F:004565B0 CALL 00403CEC
==> 017F:004565B5 RET //去017f:004565BD !!!
017F:004565B6 JMP 004036C8
017F:004565BB JMP SHORT 004565AD
**(A4)** 017F:004565BD MOV EAX,EBX //哈！原来是将EBX赋值给EAX。
017F:004565BF POP ESI
017F:004565C0 POP EBX
017F:004565C1 POP ESP,EBP
017F:004565C3 POP EBP
017F:004565C4 RET //返回到**(A2)**处

---------------------------------第二部分完-----------------------------------------------

-------------------------------【第三部分：制作Loader】-----------------------------------

本文采用R!SC 的Loader源代码，并改变相应的地方：

（一）我们先整理由第一、二部分的跟踪所得的一些数据：
目标程序名：TAGRENAME.EXE
修改的地址：00456594h （h 代表十六进制数）
所作修改 ：7402 ==> 9090 （nop的代码是90）
修改字节数：2
从00456594起的10个字节为：74,02,B3,01,8B,45,F8,E8,C8,C9

（二）步骤：
1）在TASM的目录中，建立一个文件名为loader.asm 的文本文件（.asm是文件扩展名）

2）将下面两行 ;+++++++++++++ 之间的代码全部拷贝粘贴到loader.asm中，保存文件。

3）将我们（一）中的所有资料填在loader.asm中**(B1)**处的相应位置。
在**(B2)**处，填入延时，先假定1000 吧。若不能正常使用则在调整。
（调整原则：Loader 可以载入TagRename，但程序依然没注册。 ==> 减少延时 (eg: 800)
Loader 不能正常运行，出现ERROR框。 ==> 增加延时 (eg:1200)
）

4）在DOS Prompt 中 ，进入TASM的目录中(笔者的目录为：e:\tasm5),依次键入以下
两行命令。
tasm32 /ml loader.asm （编译）
tlink32 /Tpe /aa /c loader,loader,,e:\tasm5\import32.lib （连接）

5）成功的话，会在当前目录产生一个名为loader.exe的文件，将它拷贝到Tag&Rename的
目录中，即可。运行Loader,看看能不能正常使用，不能则再次调整延时，重新编译。

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Requires Tasm 5.0 & import32.lib to compile

; tasm32 /ml loader.asm
; tlink32 /Tpe /aa /c loader,loader,, <path to> import32.lib
; replace <path to> with whatever...

.386P
Locals
jumps

.Model Flat ,StdCall

;Define the needed external functions and constants here.

Extrn MessageBoxA:PROC
Extrn WaitForInputIdle:PROC

Extrn WriteProcessMemory:PROC
Extrn ReadProcessMemory:PROC
Extrn CreateProcessA:PROC
Extrn CloseHandle:PROC
Extrn ExitProcess:PROC

;-=-Normal data-=-=-=-=-=-=-=-=-=-=-=-=-=
.Data
CSiR_Tag db 'Tag&Rename 1.7 (Loader),by McNy@Work ',0
CSiR_Error db 'Error!!!',0
CSiR_Error1 db 'Something wrong!!...',0
OpenERR_txt db 'CreateProcess Error :(',0
ReadERR_txt db 'ReadProcessMemory Error :(',0
WriteERR_txt db 'WriteProcessMemory Error :P',0
VersionERR_txt db 'Incorrect Version of application :(',0
CSiR_ProcessInfo dd 4 dup (0) ;process handles
CSiR_StartupInfo db 48h dup (0) ;startup info for the process were opening
CSiR_RPBuffer db 10h dup (0) ;read buffer, for checking data

;-=-Patch datas-=-=-=-=-=-=-=-=-=-=-=-=-=

CSiR_AppName db 'TAGRENAME.EXE',0 ; **(B1)**
mcny dd 00456594h ; address to read data from for version checking
sizeof dd 10 ; in the new process

checkbytes db 074h,002h,0b3h,001h,08bh ; the bytes to check for
db 045h,0f8h,0e8h,0c8h,0c9h ; if there not there, we have the wrong version??
;-----
patch_data_1 db 90h,90h
patch_size_1 dd 2
patch_addr_1 dd 00456594h

.Code
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Main:
push offset CSiR_Tag
mov dword ptr [CSiR_StartupInfo],44h ; (the size in bytes of the structure)
push offset CSiR_ProcessInfo ; Typedef struct _PROCESS_INFORMATION
push offset CSiR_StartupInfo ; Pointer to STARTUPINFO structure
push 0
push 0
push 20h ; Creation flags
push 0
push 0
push 0
push 0
push offset CSiR_AppName ; Pointer to name of executable mod
call CreateProcessA
test eax,eax
jz OpenERR

Wait4Depack:
push 1000 ; **(B2)**
; Timeout (in milliseconds, -1 = infinate)
; 原作者为 LARGE-1
; 我的PC上可以用800到1500。你自己设一个数吧！
push dword ptr [CSiR_ProcessInfo]
call WaitForInputIdle

Check_Data:

push 0 ; BytesRead
push dword ptr [sizeof] ; Length
push offset CSiR_RPBuffer ; Destination (to read them to)
push dword ptr [mcny] ; Source
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to read
call ReadProcessMemory
test eax,eax
jz ReadERR
;...
;int 03 ;-)
cld
lea esi, CSiR_RPBuffer
lea edi, checkbytes
mov ecx, 10
rep cmpsb
jnz VersionERR
;...
Patch_the_mother:
push 0 ; Pointer to byteswritten (i like null though)
push dword ptr [patch_size_1] ; Length
push offset patch_data_1 ; Source
push dword ptr [patch_addr_1] ; Destination
push dword ptr [CSiR_ProcessInfo] ; Process whose memory we are to patch
call WriteProcessMemory ; Call Kernel32!WriteProcessMenory
test eax,eax
jz WriteERR

Close_This_app:
push dword ptr [CSiR_ProcessInfo]
call CloseHandle
push dword ptr [CSiR_ProcessInfo+4]
call CloseHandle

Exit_Proc:
Push LARGE-1
Call ExitProcess

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
VersionERR:
lea eax, VersionERR_txt
jmp abort
ReadERR:
lea eax, ReadERR_txt
jmp abort
OpenERR:
lea eax, OpenERR_txt
jmp abort
WriteERR:
lea eax, WriteERR_txt
abort:
push 0
push offset CSiR_Error ; Title
push eax ; Message
push 0
call MessageBoxA

jmp Close_This_app

End Main
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

---------------------------------第三部分完-----------------------------------------------

==========================================================================================
全文结束（这是我的处女作，有不对的地方，还望大家多多指正与包涵!）

标 题:【文章一的小小补充（仅供初学者）】
发信人:mcny@work
时 间:2000-12-1 16:49:32
详细信息:

【文章一的小小补充（仅供初学者）】
========================================================================================
软件 ：Tag&Rename 1.7

软件简介 ：一个可以修改MP3 和 VQF 音乐文件中的TAG说明的程序。最新的1.8beta3版开始支持MP3
最新的ID3v2，是一个很好用的编辑工具。

下载处 ：软件主页: http://www.softpointer.com/tr.htm
：由于该主页更新很快，1.7 与 1.7(buid3)版本请在我这里下载:
http://www.freedrive.com/ASP/PostFolderShortcut.asp?fsc=15913190
（找share\TagRename ,需有freedrive的免费帐号）
----------------------------------------------------------------------------------------
Tag&Rename v.1.7 build 3 (11/22/00):
* fixed sharing violation error under Win 2000 with 'Rename folder'
function
* added Portuguese translation

Tag&Rename v.1.7 build 2 (11/04/00):
* minor bug in 'Rename files test' window fixed
* added Slovene and Swiss-German translations

Tag&Rename v.1.7 (11/02/00):
* improved scroll mouse support
* supported languages: Brazilian Portuguese, Bulgarian, Czech, Dutch
French, German, Greek, Hungarian, Italian, Russian
* minor bugs fixed

========================================================================================
【正文】
========================================================================================
由于在贴文章一的时候，TagRename1.7已经悄悄的发布了1.7(build2)。所以大家从该主页下载
的版本与我的不同。故，造成与该文章有所出入的地方。

这里以1.7(build3)为例子作一个小小的修正。其实，除了使用各个版本的Aspack、Asprotect加壳之外。
自1.4版以来它在保护上并没什么长进(虽然注册码是无望了)！ 用十几个 F12 即可搞定，找到如下代码.
( 而版本1.7(11/02/00)是一个例外，一路F10 即可。) 所以TagRename是一个很好的入门级程序。

A)1.7(build3)中 添入注册码，按OK后。被TRW2000中断，按下14个F12 ，再F10就可见到如下特征代码：
...
MOV EAX,[EBP-08] //某一个ret会返回到此。
LEA EDX,[EBP-04]
MOV EAX,[EBP-04]
CALL XXXXXXXX //处理、计算、比较注册码!!!注册码正确时，返回AL=1。 【<==我们进入此！！！】
CMP AL,01
JZ ZZZZZZZZ //若AL=1，则可以避开error对话框!

B)按F8进入 CALL XXXXXXXX 后的下面四十行以内，即可看到如下特征代码：
...
...
...
CALL NEAR [ECX+50] //比较"注册码生成串'和两百余个"正确的串"。若全部不匹配返回EAX=FFFFFFFF
//（内部会调用 Kernel32!CompareStringA + 0D）
INC EAX
JZ 0456598 //EAX=0 时跳转。 【 <==我们改这里！！！】
MOV BL,01 //若上一行不跳转，则注册码正确。
CALL YYYYYYYY
..
..
..
RET //去下面两个jmp的下一行
..
..
RET // 真正的返回。返回 A) CALL XXXXXXXX 处的下一行

C)所以Loader要做以下调整
目标程序名：TAGRENAME.EXE
修改的地址：004556a4h （h 代表十六进制数）
所作修改 ：7402 ==> 9090 （nop的代码是90）
修改字节数：2
从004556a4h起的10个字节为：74,02,B3,01,8B,45,F8,E8,3C,D8

[Loader.asm]
CSiR_AppName db 'TAGRENAME.EXE',0
mcny dd 004556a4h ; address to read data from for version checking
sizeof dd 10 ; in the new process

checkbytes db 074h,002h,0b3h,001h,08bh ; the bytes to check for
db 045h,0f8h,0e8h,03ch,0d8h ; if there not there, we have the wrong version??

patch_data_1 db 90h,90h
patch_size_1 dd 2
patch_addr_1 dd 004556a4h

附：很有趣的是,TagRename 多个Asprotect的壳，皆无法用目前流行的CASPR0.952 与 RAD0.6 完全脱壳。
有些版本脱壳后手工修正即可。另一些则只能手工脱壳了 8(
真是怪哉！怪哉！

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
笔者 ：McNy@Work
网址 ：http://mcny.yeah.net 或 http://mcny.iscool.net （施工缓慢，请见谅。。。）
日期 ：2000年12月01日
Email ：mcny_work@yahoo.com
（邮件主题请以"WANTED:McNycn"开始，注意英文字母大小写，否则我将收不到喔！）
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
全文结束（若有疏漏，还望大家多多包涵与指正!）


regsnap2.8(build 638)

标 题:regsnap2.8(build 638)之内存破解 (508字)
发信人:caiwu
时 间:2001-2-8 22:04:09
详细信息:
小弟初学破解，请多指教
前些天买了张电脑报二○○○年合订本配套光盘，里面有个注册表监视软件Regsnap 2.8 (build 638)
小弟水平太菜，找不到注册码，暴力破解时发现其对本身加密，只要改动就会拒绝执行，用trw2000调试时发现
只要把 1->[004249f0] 就可以解除时间限制。于是用Rpp 做了个内存补丁，其脚本文件如下：

O=Load_regsnap.exe:

F=regsnap.exe: ; 要补丁的程序

P=4249f0/00/01:

p=40463b/74/75:

p=411401/74,5b/90,90:

$ ; 结束

用rpp.exe 生成文件Load_regsnap.exe后将其拷到regsnap目录下执行，一切ok


RegSnap2.80

标 题:regsnap2.80破解小记 (1千字)
发信人:Leafred
时 间:2001-4-25 18:52:19
详细信息:
RegSnap2.80注册表比较工具。
该工具功能非常不错，本身也属于Crack软件,但它要注册并有三十天的时间
限制，真令人讨厌。

网上已有不少Crack高手，破解了它，但我不知他们有没有试过这软件，
它还隐含了一个陷阱，破解过它的人都知道，首先是把文件位置0x41F9处7409
改为EB09，即原有的条件跳转语句改为无条件跳转语句，以及0x421b处74DE
改为9090，同时把程序检查完整性的地方改掉。

但不知这些高手们是否测试过程序，或者说他们也太忙了，经过这样改过的
程序，RegSnap会在做比较时始终会说Broken Source file.然后就停止工作。

我曾试过找到此处也进行修改，但发现又有问题，于是我干脆对程序不作修改，
而采用ppatcher来处理，我把ppatcher.ppc文件进行一下配置：

#Process Patcher Configuration File
Version=3.93

DisplayName=My Test Program
Filename=regsnap.exe
Filesize=299008
Arguments=/quiet
Address=0x4041f9:0x74:0xEB
Address=0x40421b:0x74:0x90
Address=0x40421c:0xde:0x90

#End of Configuration File

然后把ppatcher.exe和ppatcher.ppc拷贝到Regsnap执行目录下，然后运行
ppatcher.exe，^_^，一切正常，运行比较功能，也正常。

当然这时显示的注册信息好恐怖哦。。。。

有时明明可以用另外一种办法避免的麻烦事，何不去试试呢。

我要偷懒，我要偷懒。。。。。


IPTools 1.10

标 题:IPTools 1.10 破解 (5千字)
发信人:傲世男儿
时 间:2001-2-11 14:30:16
详细信息:
IPTools 1.10 破解
URL http://newhua.infosail.com/IPTools.htm
工具：w32dsm 8.93 gold,VC...

4个月没有破解了，今天碰到了这个不错的IP工具，还是delphi写的，网上没有该版本的破解，就破它吧！
w32dsm反汇编后觉得很简单，一下子就查到了"Sorry, but Name or Registration...."

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00497171(C), :0049718B(C), :004971C6(C), :004971EE(C)
|

* Possible StringData Ref from Code Obj ->"Sorry, but Name or Registration "
->"number is wrong !"
|
:00497340 B89C744900 mov eax, 0049749C
:00497345 E866C3FAFF call 004436B0

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00497109(C), :0049733E(U)

看见上面的4个出口，找到相关的跳转nop掉，Thank You for registering出来了。

重新打开程序，看见了"Program was corrupted!!"

继续搜索"Program was corrupted!!"，原来只有一个跳转碍事，
:004B3237 8B1594984B00 mov edx, dword ptr [004B9894]
:004B323D 3B82B4000000 cmp eax, dword ptr [edx+000000B4]
:004B3243 740F je 004B3254 //改为jne
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Possible StringData Ref from Code Obj ->"Program was corrupted !"
|
:004B3245 B85C354B00 mov eax, 004B355C
:004B324A E86104F9FF call 004436B0

进去之后发现还是没有注册成功，出现一个非整数错误而程序退出，作者可真够狠毒，
用了一次非法注册号就永远取消使用权？用regmon跟踪了一下启动过程，分析后发现
关键点在HKCU\Software\Microsoft\Windows\CurrentVersion\Devices\0010下面的两
个键值，真正的注册信息放在这里，但这些内容是经过加密运算后写入的注册码，
而相同注册码每次产生的键值是不同的。删掉这两个键值，可以进入程序了，但显示为未注册。

在注册表HKCU\Software\Microsoft\KS-SOFT\IP-Tools中发现了这个键值，顾名思义是显示注册对话框的，
我起初以为只要每次启动前将该键值置0，就不会显示那个讨厌的nag了，于是用BCB做了个loader，
但发现依然不成功，似乎不是单单由这个键值决定的，而是由多个键值（比如:LastRunTime）
等等计算决定是否显示nag，这时已经陷入修改注册表的迷途，索性将所有可能相关的键值都放进
loader中，果然收效显著，我甚至以为破解成功了，可我启动程序到达20次左右时，又出现了nag，昏倒！

唉，还是回来看看w32dsm的结果吧，进而开始分析其启动过程的代码，很容易找到了ShowRegDlg
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004B2B32(C)
|
:004B2B43 A118994B00 mov eax, dword ptr [004B9918]
:004B2B48 833800 cmp dword ptr [eax], 00000000
:004B2B4B 0F8586000000 jne 004B2BD7 //就是这里判断是否显示nag
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:004B2B51 E8AEFFF4FF call 00402B04

* Possible StringData Ref from Code Obj ->"ShowRegDlg"
|
:004B2B56 BA582D4B00 mov edx, 004B2D58
:004B2B5B 8BC7 mov eax, edi
:004B2B5D E87A21F8FF call 00434CDC
:004B2B62 84C0 test al, al
:004B2B64 740F je 004B2B75

只要把0F8586000000,中的85改成84，nag便不再弹出了，我反复试验了2000次（注册表失败综合症？），
当然不是我自己用鼠标反复的打开关闭，写个程序即可，我只是在旁边看它究竟有没有出现nag而已。
的确是搞定了。

可当我使用其中的ping等功能时，竟然弹出这样一个对话框：
"98% - you use illegal registration key or cracked version of IP-Tools....",原来使用过程
中还有校验？由于我是爆破，会导致这个异常的产生，其实后来我发现，某些不完全破解的注册码也
会产生这个问题。
看了看w32dsm的结果，发现这个对话框的弹出是在异常处理模块中的，即delphi的
try
X := Y/Z;
except
on EZeroDivide do HandleZeroDivide;
end;
语句，这种判断注册有效否的方法我可是头一次见到，写了个简单的delphi try...except程序反汇编了
一下也没找到任何突破口，因为无法知道这个异常是个什么异常，是自己抛出的还是系统产生的。

想用delphi/bcb的CpuView看看，结果根本无法调进IPTools.exe文件，提示我说dll加载错误，转而使用VC载入，
竟然成功了，看来delphi/bcb这方面的功能的确有待加强，自己编译生成的东西无法调试，vc却可以，
加了个断点在这一句上，
:004B2B4B 0F8586000000 jne 004B2BD7 //就是这里判断是否显示nag
随手把85改成84,原因是想避过nag，可进入程序后点了ping功能一下，竟然没有出现那个异常！爽！
有句话怎么说来着：“老天疼憨人”！，动态修改代码没有问题，我怎么过去没想到？？？
可惜我的softice 4.05 for nt 装上后NT中鼠标总是飞来飞去，否则早就发现突破口了！

写个rpp文件如下，做个loader，OK!
T=3:
F=IP_Tools.exe: ;
P=004b2b4b/0F,85/0F,84:

趁热打铁一番，查了查产生先前提到的那个非整数错误的Call：
:004B29C8 E8EF6DFDFF call 004897BC

只要把里面的E8EF改为EB03即可躲过，省着错填注册号后每次去删那两个键值了。

这样，最终的RPP文件如下：
T=3:
F=IP_Tools.exe: ;
P=004b2b4b/0F,85/0F,84:
P=004B29C8/E8,EF/EB,03:

这样做出的loader后所有的功能可用，NAG不再弹出，只是看看license中还是显示未注册，
功力的确不够，忘大小侠们多指点。

傲世男儿
China Crack Group
01-2-11 02:23下午


aspack 2.11

 标 题:上次的那篇“如何用smc patch被aspack 2.11压缩过的文件”其实是错的 (783字)
发信人:真.hp
时 间:2000-10-14 22:18:07
详细信息:
程序被aspack2.11压缩过后，它的oep放在压缩后文件的倒数第2个
section的第7D-80字节处（section name通常为.aspack），这4个
字节被加过密（其实整个section都被加密）。而且每次压缩的加
密方法都不同。我只找出2种规律，其他的我找不出来，我以
oep=00002DB8为例（它在文件中是反着放的 B82D0000）：

1。xor 这种情况是用某个数分别与oep的4个字节xor，这时可以看
oep的第1个字节，因为oep通常为00 ?? ?? ??，就可知道它是与哪
个数xor。如
C0557878，那么oep的4个字节就分别与 78 xor。

2。相加 这种情况是用某个数分别与oep的4个字节相加，同样要先
看oep的第一个字节，如果相加的和大于FF，就要减去100。如
68DDB0B0，那么oep的4个字节就分别与 B0 相加。（B8+B0=168-100=68）

3。还有一些情况这样的，不知谁能找出它的算法（可能还有好几种）。

7A55836D 4AC58DC2 62505D06 D27821CB B82D0100 828BA10F


Awave Studio v7.0

 标 题:Awave Studio v7.0的破解之SMC--- C-pen
发信人:1212
时 间:2000-12-8 14:42:19
详细信息:
一. 前言: 用SMC去破解ASProtect的保護實在是一種痛苦的事，不過既然有人有興趣，那我們就來談談吧！在底下的文章，我將假設讀者已對ASProtect的保護有初步的了解，也跟蹤過它，對SMC的技巧有概念，最後先申明一點，因為ASProtect的多層次壓縮，所以你要用SMC的話，一定會很繁雜的，希望你有耐心看完並實作，也希望本文能對你有所幫助。
二. 使用工具: (1)Soft-ICE V.4.01 (2)FrogICE (3)16進位編輯器(建議使用Hex workshop和Hiew(方便除錯))
三. 本文:
1. ASProtect的保護機制:
(1) 動態位址: 我們要用SMC首先要克服的就是ASProtect的Relocation，它每次運行 的位址都不一樣，而我們的Code是不會變動的，故你必須先了解ASProtect是如何Relocation的，答案是ASProtect調用GetTickCount函數，拿其值去當IMAGE_RELOCATION結構中的RelocCount成員，讀者有興趣可以去查閱IMAGE_RELOCATION結構的相關資訊及編程，在此不加詳述。其程式碼如下:
EAX=GetTickCount
25FFFF0100 AND EAX,0001FFFF
EB04 JMP 0051722F
我們改為:
B811110100 MOV EAX,00011111
EB04 JMP 0051722F
如此RelocCount就會是一個常數，用Hex workshop 打開Awave.exe尋找
25FFFF0100EB04 <-- 將是唯一
改B811110100EB04
如此位址就會固定，不再是變動的了。
(2)多層次壓縮:
A..ASProtect的程式碼 <--我們稱為第一層，這是可以用16進位編輯器直接修改的 地方
B. 解壓部份代碼 <-- 第二層
C. 解壓部份代碼 <-- 第三層
D. 利用第三層代碼解壓第四層代碼 <-- 第四層亦就是ASProtect，Anti-Debugger，
CRC Check，Time Limit，NagScreen等….的地方
E. 利用第四層代碼解壓主程式代碼，Import Table加密等 <-- 第五層
如此層層相扣，不要說它在Import Table作手腳，如此多層次的壓縮，你要用內存補丁(指在有Soft-ICE的環境下) 機乎很難工作。
(3)首先我們要對付的是ASProtect的保護:
這個軟體有3種，Anti-Debugger，BoundsCheck，CRC Check
[Anti-Debugger]:
:005D6184 CALL 005D60D4 <--\\.\SIWDEBUG
:005D6189 TEST AL,AL
:005D618B(753A) JNZ 005D61C7 <-- NOP
:005D618D CALL KERNEL32!GetLastError
:005D6192 CMP EAX,02
:005D6195(7530) JNZ 005D81C7 <-- NOP
:005D6197 MOV EAX,[005DC878]
:005D619C CALL 005D60D4 <-- \\.\SICE
:005D61A1 TEST AL,AL
:005D61A3(7522) JNZ 005D61C7 <-- NOP
:005D61A5 CALL KERNEL32!GetLastError
:005D61AA CMP EAX,02
:005D61AD(7518) JNZ 005D61C7 <-- NOP
:005D61AF MOV EAX,[005DC874]
:005D61B4 CALL 005D60D4 <-- \\.\NTICE
:005D61B9 TEST AL,AL
:005D61BB(750A) JNZ 005D61C7 <-- NOP
:005D61BD CALL KERNEL32!GetLastError
:005D61C2 CMP EAX,02
:005D61C5(7413) JZ 005D61DA <-- JMP
[BoundsCheck]:
:005D6234 MOV EBP,4243484B
:005D6239 JMP 005D623D
:005D623D MOV AX,0004
:005D6241 JMP 005D6244
:005D6244 INT 3
我們只要改EBP的值，就能ByPass BoundsCheck
改:005D6235 4B --> 12
[CRC Check]:
:005D633E MOV EAX,[EBP-14]
:005D6341 CMP EAX,[EBP-10]
:005D6344 JZ 005D6389
改:005D6344 7443 --> EB43
以上就是ASProtect保護的代碼，若你要一個一個的改，可能要改很多Bytes，既然它最 終是要跳至005D6389我們何不來個乾坤大挪移讓它一次跳的夠
改:005D618B E9F9010000 JMP 005D6389
[改主程式的地方]:
找接近OEP的地方來Modify主程式(此時主程式的代碼已被解壓)我找到這個:
:005D607D 8B45F8 MOV EAX,[EBP-08]
:005D6080 EB02 JMP 005D6084
剛好5個BYTES正好符合我們做遠程跳躍

(4) SMC開始:
終於到了最重要亦是最痛苦的時刻了，希望大家能堅持下去，首先我們還須做個工作，就是找個地方(要夠大)來放我們的Code,我們找ASProtect主程式的Section
Section VS VA RS RO
----------------------------------------------------
Y38d5x 29000 157000 28800 5FE00
我找到 OffSet : 60B00
載入時位址:00557D00
這地方有大量已初值化的00 00供我們使用，Thanks ASProtect!
(A)利用第四層Modify主程式:
主程式的破解改法，我們採用Superboss的改法，維持文章的一貫性
改:004A486D 40 --> 33
還記得先前我們找到的修改主程式的地方吧!
:005D607D 8B45F8 MOV EAX,[EBP-08]
:005D6080 EB02 JMP 005D6084
改:005D607D E97E1CF8FF jmp 00557D00 <-- 跳至我們的家
按F10來到00557D00，下a eip
:00557D00 8B45F8 MOV EAX,[EBP-08] <-- 還原代碼
:00557D03 C6056D484A0033 MOV Byte Ptr [004A486D],33
:00557D0A E975E30700 JMP 005D6084 <-- 跳至原代碼
要到這裏你須先BypassASProtect的保護才行`，測試無誤後，記得抄下機器碼用16進位編輯器去改
(B)利用第三層Modify第四層:
我們用Symbole Loader來載入Awave.exe，別忘了裝載ICEdump或改Section的 Charactics, 否則無法中斷的，還記得先前所說的Anti-Debugger嗎? 我們要Modify它，位址是005D618B 下bpm 005D618B，按F5一次，中斷在:
:005E555B F3A5 REPZ MOVSD
:005E555D 8BC8 MOV ECX,EAX
:005E555F 83E103 AND ECX,03
:005E5562 F3A4 REPZ MOVSB
:005E5564 5E POP ESI
:005E5565 8B8539294400 MOV EAX,[EBP+00442939]
:005E556B 6800800000 PUSH 00008000
:005E5570 6A00 PUSH 00
:005E5572 50 PUSH EAX
走過005E5562，你會發現第四層的代碼已被解壓
改:005E556B 6800800000 PUSH 00008000
為:005E556B E99F27F7FF jmp 00557D0F
:00557D0F 6800800000 push 00008000
:00557D14 C7058B615D00E9F90100 mov dword ptr [005D618B],0001F9E9
:00557D1E C6058F615D0000 mov byte ptr [005D618F],00
:00557D25 C7057D605D00E97E1CF8 mov dword ptr [005D607D],F81C7EE9
:00557D2F C60581605D00FF mov byte ptr [005D6081],FF
:00557D36 E935D80800 jmp 005E5570
恭喜! 又完成了一層，若你尚不了解，建議你畫個流程圖，仔細思考它們的邏輯關係那會幫你了解，OK讓我們繼續吧
( C )利用第二層Modify第三層:
目標: 使:005E556B 6800800000 push 00008000
變成:005E556B E99F27F7FF jmp 00557D0F
bpm 005E556B，按F5二次，中斷在:
:005E527F F3A4 REPZ MOVSB
:005E5281 8B8539294400 MOV EAX,[EBP+00442939]
:005E5287 6800800000 PUSH 00008000 <-- 我們要Modify的地方
:005E528C 6A00 PUSH 00
原本應該是要JMP至00557D3B，不過我想留些Buffer以防萬一，所以我們JMP至00557D6C
改:005E5287 6800800000 PUSH 00008000
為:005E5287 E9E02AF7FF JMP 00557D6C
:00557D6C 6800800000 push 00008000
:00557D71 C7056B555E00E99F27F7 mov dword ptr [005E556B],F7279FE9
:00557D7B C6056F555E00FF mov byte ptr [005E556F],FF
:00557D82 E905D50800 jmp 005E528C
(D) 利用第一層Modify第二層:
終於到最後了，不知你有什麼感覺，是不是覺得ASProtect很機車呢?
目標: 使:005E5287 6800800000 push 00008000
變成:005E5287 E9E02AF7FF jmp 00557D6C
bpm 005E5287 按F5一次，中斷在:
:00557698 F3A5 REPZ MOVSD
:0055769A 83C328 ADD EBX,28
:0055769D EBDA JMP 00557679
走過00557698第二層的代碼就會被解壓，但是這一段代碼會走很多次，沒關係我們
有EDI的值當我們的指標，此時EDI=005E5B94
改:0055769A 83C328 ADD EBX,28
:0055769D EBDA JMP 00557679
為:0055769A E9E8060000 JMP 00557D87 &szlig; 這可以直接用Hex workshop來改
:00557D87 83C328 add ebx,28
:00557D8A 81FF945B5E00 cmp edi,005E5B94
:00557D90 0F85E3F8FFFF jnz 00557679
:00557D96 C70587525E00E9E02AF7 mov dword ptr [005E5287],F72AE0E9
:00557DA0 C6058B525E00FF mov byte ptr [005E528B],FF
:00557DA7 E9CDF8FFFF jmp 00557679
四. 后記:很久沒有寫文章了,寫的很雜請原諒,明年可能會到上海發展不
曉得你們歡迎否,噫!台灣真的越來越難混了.
慾海浮沈名利爭
電光石火步此生
紅塵情事揮不盡
觀世不笑是痴人
JOHNSON from Taiwan 2000\12\8


epoxUSDM

标 题:入门级smc(self modifying code)例子一个。 (4千字)
发信人:zest
时 间:2001-2-4 4:40:58
详细信息:
入门级smc(self modifying code)例子一个。

台湾磐英主板附带光盘上的监控软件===>epoxUSDM.cpl version 2.48
1. Easy to use, and convenient ControlPanel Applet
2. Can graphically show the status of the Power Supply and System-internal Temperature
3. Can show an Alarm Notification Window and Audible Alerts to potentially serious system
problems before they threaten system stability

此程序必须用控制面板COMCTL32.DLL打开。
当然你只要双击epoxUSDM.cpl即可，就像其他可执行文件一样。

smc原因：软件安装在开始/程序/启动中，每次开机自动运行后，在桌面显示一窗口
并在任务栏右下角形成一小图标。
我愿望：开机时仅要任务栏右下角小图标不要在桌面出现窗口，这样较美观。
但是双击任务栏右下角小图标时还能在桌面出现窗口。

难点：cpl文件需用ControlPanel打开，不像exe、com等好跟踪。

首先：PROCDUMP用PE EDITOR挑epoxUSDM.cpl选SECTIONS把.text的CHARACTERICTICS
由60000020改为E0000020，此步骤非常非常重要!!!!

原因：60000020表示.text部分readable executable
E0000020表示.text部分readable executable writeable
必须要writeable!!!!!!!!你可试试不改的下场。Ken的smc教程
就少了此步!当然要视软件性质而定。你若无法确定改何处，可将整个
section header的CHARACTERICTICS值全改E0000020。

TRW2K122跟踪发现：
在0167:10004E15处往下跳就出现桌面视窗，不往下跳就仅在任务栏出现小图标。
程序运行到10004E15时却总往下跳。你可能想，EASY，NOP掉10004E15不就行了？
的确，第一次运行是行了，但当你双击小图标时却无法出现桌面视窗，因为程序
还要经过10004E15，看来只好用smc法了。谢谢Ken。

看看下面的程序（在epoxUSDM.cpl中），你会惊喜发现JZ附近很多NOP，GOOOOOD！
就改此处！因程序运行时没经过此NOP，你可下中断试试，修改后不会影响原程序RUN，
不用TOPO找NOP了。

改前：
0167:10004DF4 90 NOP
0167:10004DF5 90 NOP
0167:10004DF6 90 NOP
0167:10004DF7 90 NOP
0167:10004DF8 90 NOP
0167:10004DF9 90 NOP
0167:10004DFA 90 NOP
0167:10004DFB 90 NOP
0167:10004DFC 90 NOP
0167:10004DFD 90 NOP
0167:10004DFE 90 NOP
0167:10004DFF 90 NOP
0167:10004E00 56 PUSH ESI
0167:10004E01 6880C30010 PUSH DWORD 1000C380
0167:10004E06 68F0A90010 PUSH DWORD 1000A9F0
0167:10004E0B FF1518910010 CALL `USER32!FindWindowA`
0167:10004E11 8BF0 MOV ESI,EAX
0167:10004E13 85F6 TEST ESI,ESI
0167:10004E15 7421 JZ 10004E38 ==>here!! 总是jmp
0167:10004E17 56 PUSH ESI

改为：
0167:10004DF4 66C705154E00107421 MOV WORD [10004E15],2174 ==>change [10004E15]
0167:10004DFD EB18 JMP SHORT 10004E17 ==>change 跳到10004E17
0167:10004DFF 90 NOP
0167:10004E00 56 PUSH ESI
0167:10004E01 6880C30010 PUSH DWORD 1000C380
0167:10004E06 68F0A90010 PUSH DWORD 1000A9F0
0167:10004E0B FF1518910010 CALL `USER32!FindWindowA`
0167:10004E11 8BF0 MOV ESI,EAX
0167:10004E13 85F6 TEST ESI,ESI
0167:10004E15 EBDD JMP SHORT 10004DF4 ==>change 跳到10004DF4
0167:10004E17 56 PUSH ESI

运行完一次后，10004E15变成原样：
0167:10004DF4 66C705154E00107421 MOV WORD [10004E15],2174 ==>不会到此了
0167:10004DFD EB18 JMP SHORT 10004E17 ==>不会到此了
0167:10004DFF 90 NOP
0167:10004E00 56 PUSH ESI
0167:10004E01 6880C30010 PUSH DWORD 1000C380
0167:10004E06 68F0A90010 PUSH DWORD 1000A9F0
0167:10004E0B FF1518910010 CALL `USER32!FindWindowA`
0167:10004E11 8BF0 MOV ESI,EAX
0167:10004E13 85F6 TEST ESI,ESI
0167:10004E15 7421 JZ 10004E38 ==>change 总是jmp
0167:10004E17 56 PUSH ESI

怎么样，改得简单吧，真心希望大家能看懂！
试了试，一点问题都没有！COOOOOOOOL！！

/\zest/\
2001.2


fldrmrkr

标 题:对脱壳感兴趣者请进 (1千字)
发信人:hying
时 间:2001-1-19 21:44:40
详细信息:
有一个程序地址为http://www.newhua.com.cn/down/fldrmrkr.zip，它可给电脑中的众多文件加上说明。先是在白菜的论坛上看到有人要求破解，于是下载下来一试，竟然……，只怪我软柿子捏多了，连手都软了，竟然没有捏动，特请各路高手帮忙。
经过一下午的研究发现问题在Folderem.dll中，关键处在：
00406621 55 push ebp
00406622 8BEC mov ebp, esp
00406624 8B550C mov edx, dword ptr [ebp+0C]
00406627 8B4508 mov eax, dword ptr [ebp+08]
0040662A 8B08 mov ecx, dword ptr [eax]
0040662C 3B0A cmp ecx, dword ptr [edx]
0040662E 7522 jne 00406652
00406630 8B4804 mov ecx, dword ptr [eax+04]
00406633 3B4A04 cmp ecx, dword ptr [edx+04]
00406636 751A jne 00406652
00406638 8B4808 mov ecx, dword ptr [eax+08]
0040663B 3B4A08 cmp ecx, dword ptr [edx+08]
0040663E 7512 jne 00406652
00406640 8B480C mov ecx, dword ptr [eax+0C]
00406643 3B4A0C cmp ecx, dword ptr [edx+0C]
00406646 750A jne 00406652
00406648 8B4010 mov eax, dword ptr [eax+10]
0040664B 8B5210 mov edx, dword ptr [edx+10]
0040664E 3BC2 cmp eax, edx
00406650 7404 je 00406656
00406652 33C0 xor eax, eax
00406654 EB05 jmp 0040665B <-注意
00406656 B801000000 mov eax, 00000001
0040665B 5D pop ebp
0040665C C3 ret
上面的一些全是比较，如全对最后EAX就为1，暴破的话只要将EB05改为EB00就可以了，它是用ASPACK2.1加壳的，是用UNASPACK1.0.9.1能脱，能反汇编，就是不能用。SMC我也不会。注册算法与注册名无关，是用注册码进行计算后与一常数串比较，正算法是看懂了，但逆算法却找不到。只怪我学艺不精，恳请各路高手帮忙。
另：上面的地址是反汇编来的，每次重启动WIN后66XX是不变的，但前面的会变，如7D66XX。还有它是在WIN启动时加载的。不知如何脱光它！

标 题:我的第一次SMC破解。原来它用的是SHA算法，比MD5都难破！ (5千字)
发信人:hying
时 间:2001-1-21 14:02:39
详细信息:

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。(这一段是从ljttt那剽窃来的 8-))
【前言】
前天到白菜乐园闲逛，在论坛看到有人请求破解Folder Remarker，它可给电脑中的众多文件加上说明，象我们这种经常下载东西的人尤其用得着。于是马上架起jetcar把它装回家，抄起trw2000就剁，结果剁了半天竟然没剁开，只怪我软柿子捏多了，手上没劲，咳……。
【工具】
IDA4.04、trw2000、Uedit7.0
【破解方法】
SMC
【正文】
经过一下午的研究发现问题在Folderem.dll中，关键处在：
00406621 55 push ebp
00406622 8BEC mov ebp, esp
00406624 8B550C mov edx, dword ptr [ebp+0C]
00406627 8B4508 mov eax, dword ptr [ebp+08]
0040662A 8B08 mov ecx, dword ptr [eax]
0040662C 3B0A cmp ecx, dword ptr [edx]
0040662E 7522 jne 00406652
00406630 8B4804 mov ecx, dword ptr [eax+04]
00406633 3B4A04 cmp ecx, dword ptr [edx+04]
00406636 751A jne 00406652
00406638 8B4808 mov ecx, dword ptr [eax+08]
0040663B 3B4A08 cmp ecx, dword ptr [edx+08]
0040663E 7512 jne 00406652
00406640 8B480C mov ecx, dword ptr [eax+0C]
00406643 3B4A0C cmp ecx, dword ptr [edx+0C]
00406646 750A jne 00406652
00406648 8B4010 mov eax, dword ptr [eax+10]
0040664B 8B5210 mov edx, dword ptr [edx+10]
0040664E 3BC2 cmp eax, edx
00406650 7404 je 00406656
00406652 33C0 xor eax, eax
00406654 EB05 jmp 0040665B <-注意
00406656 B801000000 mov eax, 00000001
0040665B 5D pop ebp
0040665C C3 ret
上面的一些全是比较，如全对最后EAX就为1，可惜的是，正算法是看懂了，但逆算法却找不到(事实上，它用的是SHA算法，数论的高才生也搞不定，何况是我，不过如果谁对SHA算法感兴趣的话，可以分析它的原程序，由于太长我就不贴了)。没办法只有考虑暴破。暴破的话只要将EB05改为EB00就可以了，但用FI240一看，发现它是用ASPACK2.1加壳的，用UNASPACK1.0.9.1能脱，能反汇编(上面的就是脱后反汇编来的，要注意的是每次重启动WIN后地址66XX是不变的，但前面的0040会变，如可能是变为007D66XX)，就是不能用(真可惜！)。对dll文件的手动脱壳我也不会，而且它是在WIN启动时加载的不知如何断下来(主要是我太菜！)。想来想去只有用SMC，可怜我从没用过，这次是被逼上梁山了！废话少说，马上烧香请出Crack宝典——看雪论坛精华。看了半天终于有了一些头绪，于是开始动手。
分析发现ASPACK2.1加壳的软件开始不久就有一长串的00，而且似乎没有用，不知它放在那干什么？(就等我来CRACK它？不会吧！)不过刚好放我的代码。
00419001 pusha
00419002 call sub_419579
00419007 jmp short loc_41903C
00419009 xchg ebx, ebx
0041900B nop
0041900C db 0 ; \
0041900D db 0 ; \
0041900E db 0 ; \好长一串00，
0041900F db 0 ; \刚好有用。
00419010 db 0 ; \
00419011 db 0 ; \
00419012 db 0 ; \
00419013 db 0 ; \
00419014 db 0 ; \
00419015 db 0 ; \
00419016 db 0 ; \
00419017 db 0 ; \
00419018 db 0 ; \
00419019 db 0 ; \
0041901A db 0 ; \
0041901B db 0 ; \
0041901C db 0 ; \
0041901D db 0 ; \
0041901E db 0 ; \
0041901F db 0 ; \
00419020 db 0 ; \
再看尾部:
004194DD mov eax, [ebp+443A0Eh]
004194E3 push eax
004194E4 add eax, [ebp+444798h]
004194EA pop ecx
004194EB or ecx, ecx
004194ED mov [ebp+443E3Bh], eax <-eax为返回地址
004194F3 popa <-到这儿就该去执行SMC代码了，而且不能
004194F4 jnz short loc_4194FE 先popa，不然eax的值就丢了。
004194F6 mov eax, 1
004194FB retn 0Ch
004194FE push 00000000 <-00的地址为[ebp+443E3Bh]，执行4194ED一句后
00419503 retn 原来的00000000就变为了返回地址
还有一个问题，前面说到每次重启动WIN后，执行地址都不同，有7D66XX、16766XX等，而且不跟踪的话我也不知道那时eax到底是多少(是不知如何跟踪吧？)，不过这也难不倒我，估计EAX的高4位和要修改的地址的高4位应该是一样的如007D、0167等，那我只要把它的低4位改为6654就可以了，这样两句汇编就可以办到了。

修改后反汇编如下:
头部
00419001 pusha
00419002 call sub_419579
00419007 jmp short loc_41903C
00419009 db 87h ;
0041900A db 0DBh ;
0041900B db 90h ;
0041900C and eax, FFFF0000h <-低4位清0
00419012 add eax, 6654h <-低4位变为6654
00419017 mov dword ptr [eax+0], 01B800EBh <-将EB05变为EB00
0041901E jmp loc_4194FD <-回到出口
尾部
004194E3 push eax
004194E4 add eax, [ebp+444798h]
004194EA pop ecx
004194EB or ecx, ecx
004194ED mov [ebp+443E3Bh], eax
004194F3 jmp loc_41900C <-去执行SMC代码
004194F8 db 0 ; \
004194F9 db 0 ; \ 这些没用
004194FA db 0 ; /
004194FB db 0C2h ; 0 /
004194FC db 0Ch ;
004194FD popa <-出口
004194FE push 00000000
00419503 retn
收工，试一下一切OK。(需要重启到DOS下，再用修改好的覆盖)
附：程序下载地址为http://www.newhua.com.cn/down/fldrmrkr.zip
hying[CCG] 2001.1.21


SMC体会

 标 题:个人学习SMC的一点体会--回答dREAMhTEATER兄 (2千字)
发信人:mercury
时 间:2000-10-7 13:06:50
详细信息:
个人学习SMC的一点体会--回答dREAMhTEATER兄

以下这一段是给那些经常在论坛中点播软件的人看的。
我学习破解约10个月，开始是从看了D版光碟中OSCAR10.1中的HELP开始的，后来就是YHQ，ERRORFREE等的文章。真正的学习主要来自于看雪论坛上诸君文章的教诲，以及后来从FRAVIA等处得到的教学文章。所以我也将自己所得回报给论坛各位，希望能有所助益。因为我是通过自学来获得知识，同时我相信别人也是基本如此，所以我遵循传统，除非你对破解中的具体问题有疑问，我才会尽我所能来回答。

下面是关于学习SMC的一点体会。
至今我尝试了2次SMC破解，感觉这是一个PERFECT IDEA，但可能只在去除NAG等单一方面比较有用。

第一次是尝试《有声有色3.10》，参考的是《iNLiNE pATCHiNG A pROGRAM pACKED WiTH ASProtect》作者是Predator [PC/MFD]， April 26, 2000 ，这时对SMC还不了解，只是照样画葫芦。补丁：
1. 用PRODUMP载入主程序MUSREA.EXE, 知道基地址为00400000,为了找程序入口点, 用上D.BOY的冲击波2000, 找到为0048A410. 所以offset = 0048a410-00400000 = 0008a410. 用ULTRAEDIT搜索 10 a4 08, 找到惟一地址0004c49d. 因为我准备让她先运行我的PATCH CODE, 所以准备在000003d0处修补,所以在0004c49d处将10 a4 08改为d0 03 00.
2. patch code.
首先感谢十三少与dREAMtHEATER的工作, 我知道要在
cs:0048A4E1 0F8498000000 je 0048A57F 改为
eb74 jmp 0048A761
9090 nop
9090 nop
3. 在000003d0处: 用hiew写上如下代码
000003d0: 0000 我发现跳到这里后不能直接写patch code, 必须过渡一下.
000003d2: 66c705e1a44800e9eb patch code 1
000003db: 66c705e3a448000200 patch code 2
000003e4: 66c705e5a448000090 patch code 3
000003ed: 6810e44800 放入真实的入口点
000003f2: c3 返回

第二次就是破解《有声有色3.16》，参考的是台湾陈正颖的《破ASPACK2000》及Varroa原著，Winter Lee翻译的《The Bat! 1.32破解方法》，用了一个下午。由此对SMC有了些初步的了解。具体文章请看论坛中的前作。

对于补丁代码要放在程序中何处，我的理解是要在程序中的“空地”，同时这段代码在程序映射入内存后不能被覆盖。所以在处理《有声有色3.10》时我就没有想到用TOPO来帮忙。而在《有声有色3.16》版中我找到的空地结果证实是不能使用的，所以才有TOPO的出场。
程序“空地”的使用与否，我是用以下方法知道的，可能很苯，谁用更好的方法还请指教。
在《有声有色3.16》中发现只有程序的头部有空，所以用ULTRAEDIT在这个空地中写了些标记“AAAAABBBBCCCDDE”，在程序运行后设个断点将程序拦截，并在内存中进行搜索，结果发现其在这个程序中的位置是cs:C2145D34，而不是在常规的cs:00400000节段内，所以就没有用。我想dREAMhTEATER兄可能也是同样问题。

我将文中提到的文章及我的陋文打包为mercury.zip文件，会请看雪兄提供下载，谁若有兴趣欢迎交流。

希望能有机会与dREAMhTEATER兄交流。
最后感谢曾经帮助过我的朋友们，谢谢你们！！！


webzip4.0585

标 题:关于webzip4.0585的SMC应用----教我? (1千字)
发信人:小楼
时 间:2001-3-4 19:00:32
详细信息:
关于webzip4.0585的SMC应用
这是一个离线浏览器，注册码能容易的从内存中得到，但必须在线验证，所以我选择暴力一途。注册成功标志是“属性”中“停止插入广告”成为可选项。
用FI2.4版本不知道webzip.exe是如何压缩的，研究后知道是ASPACK，又因为发现其中使用了变形引擎，估计版本在2.1或以后。

以下是我的解决之道：
（1）利用反汇编技术，知道在cs:00533D9E处令dword [eax+6c]为1就是注册版本。
（2）bpm 533D9E 知道cs:0058B179处cs:00533D9E的代码指令在内存中解压完毕（第二层压缩）。由于ASPACK压缩使用变形引擎技术，cs:0058B179的代码指令经过改变，在原始代码中不能找到，所以用
（3〕bpm 58B179 知道cs:0058B4D9处出现变形后的cs:0058B179代码（第一层压缩）。

于是：
（A）用TOPO为webzip.exe增加一些可供写入的区域（写入去1、写入区2）。
（B）从（3）知道cs:0058B51B处是第一层压缩解压完毕，所以于此令程序跳转至“写入区1”，补丁令程序运行至cs:0058B3AB（原因见下）时跳至“写入区2”
“写入区1” c705ABB35800e9b9fefb
c705ABB35800ff006a00
（C）从（2）可以知道，在cs:0058B3AB后就是第二层解压完毕，进入真正OEP。在步骤（B）处已经令程序跳至“写入区2”，因此在“写入区2”添加如下代码
c7059e3d5300c705442e
c705a23d53001f01010d
c705a63d530000009090
c705aa3d530090ba703e
6818645300
c3
即 mov dword [eax+6c], 01
push 536418 <--OEP!
ret
进入OEP工作，应该说patch是完成的，但运行后“停止插入广告”依旧不可选，虽然界面上的“unregistered"字样是去掉了。

谁能教我？

标 题:你有没有注意section的属性，要改成E0000020才行，我犯过n次此类错误。 (66字)
发信人:真.hp
时 间:2001-3-7 22:10:03
详细信息:

要用smc修改的那个section必须有可写的属性，如果没有就会出错。
sigh


WINDOWS优化大师3.2A

标 题:SMC技术在破解WINDOWS优化大师3.2A中的运用。 (8千字)
发信人:gfh[CCG]
时 间:2001-1-20 0:33:23
详细信息:
SMC技术在破解WINDOWS优化大师3.2A中的运用

[声明]

我写文章的目的是为了交流技术，希望大家在转载时能保持文章的完整性。

[前言]

这是本人在看雪论坛是发表的第一篇破解教程，写的不好，请多原谅!
其实，这是我在破解WINDOWS优化大师3.2A时用到的技术，当时我并不知
道已经用ANTI-ASPACK0.2可以脱掉它，我用FI也查不到它的壳，所以我
只有手工脱壳。这个软件被脱壳后是很好破解的。所在我在这里只谈论如
何写SMC指令，没谈到如何破解它。

PART A：分析第一层压缩。
PART B：分析第二层压缩。
PART C：写SMC指令。

======================================< PART A >============================================
1.分析第一层压缩以及关鍵性的跳转。
2.确定要修改的指令。

下面的这段指令要注意一下。

0167:0058053B A3271A11A9 MOV [A9111A27],EAX
0167:00580540 91 XCHG EAX,ECX
0167:00580541 B0E7 MOV AL,E7
0167:00580543 6742 INC EDX
0167:00580545 FF6641 JMP [ESI+41]
0167:00580548 102A ADC [EDX],CH
0167:0058054A DE33 FIDIV WORD PTR [EBX]
0167:0058054C 27 DAA
0167:0058054D EA056970ED6F80 JMP 806F:ED706905
0167:00580554 EE OUT DX,AL
0167:00580555 47 INC EDI
0167:00580556 E9E0FEFFFF JMP 0058043B ;这里我们要处理一下，改成JMP 584005
;为何要改成584005呢？请参照<PART C>
0167:0058055B 338CA456D9D422 XOR ECX,[ESP+22D4D956]
0167:00580562 2C3F SUB AL,3F
0167:00580564 1F POP DS

我们先来看一下在[58043B]里到底是什么指令。以下是[58042A--58043C]的指令片段：

0167:0058042A FF9504404400 CALL [EBP+00444004]
0167:00580430 8B2C24 MOV EBP,[ESP]
0167:00580433 81ED3C394400 SUB EBP,0044393C
0167:00580439 C3 RET
0167:0058043A 00E9 ADD CL,CH ;当程序运行到[580556]时，
;这里将变成JMP 580007
0167:0058043C C7FBFFFF0000 MOV EBX,0000FFFF

经过跟踪，我发现[58043A]的指令会被前面的JMP 58043B截成JMP 580007，这里可算是花指令技术了。
那[580007]里又是什么指令呢？跟进去瞧瞧。

0167:00580005 0000 ADD [EAX],AL
0167:00580007 E824040000 CALL 00580430 ;F8进入，到这里程序就快要解完第一层压缩了。
0167:0058000C EB00 JMP 0058000E
0167:0058000E BB30394400 MOV EBX,00443930
0167:00580013 03DD ADD EBX,EBP
0167:00580015 2B9DD03F4400 SUB EBX,[EBP+00443FD0]
0167:0058001B 83BDFC49440000 CMP DWORD PTR [EBP+004449FC],00
0167:00580022 899DFC494400 MOV [EBP+004449FC],EBX
0167:00580028 0F8566030000 JNZ 00580394

进入CALL 580430后，我们将来到这里。
0167:00580430 8B2C24 MOV EBP,[ESP]
0167:00580433 81ED3C394400 SUB EBP,0044393C
0167:00580439 C3 RET ;这里是第一层壳的出口。

======================================< PART B >============================================
1.分析第二层压缩以及关鍵性的跳转。
2.寻找主程序的入口地址。

0167:00580394 8B85AD394400 MOV EAX,[EBP+004439AD]
0167:0058039A 50 PUSH EAX
0167:0058039B 0385FC494400 ADD EAX,[EBP+004449FC]
0167:005803A1 59 POP ECX
0167:005803A2 0BC9 OR ECX,ECX
0167:005803A4 8985E63C4400 MOV [EBP+00443CE6],EAX
0167:005803AA 61 POPAD
0167:005803AB 7508 JNZ 005803B5
0167:005803AD B801000000 MOV EAX,00000001
0167:005803B2 C20C00 RET 000C
0167:005803B5 6800000000 PUSH 00000000 ;这里是第二层的出口，
;程序运行到这里的PUSH后会有一个值，
0167:005803BA C3 RET ;这个值正是主程序的入口，
;也是我们脱壳的关鍵。
0167:005803BB 8B85004A4400 MOV EAX,[EBP+00444A00]
0167:005803C1 8D8D2A4A4400 LEA ECX,[EBP+00444A2A]
0167:005803C7 51 PUSH ECX

好了，ASPACK已经完会被解压了。我们可以在这里手工脱壳，脱壳后生成的文件可以被W32DASM反汇编。

======================================< PART C >============================================
我们已经彻底搞清楚了ASPACK的解压过程，下面就要想办法写SMC指令了。我们可以用TOPO在程序前加上
150个90或00，以供我们写指令时用。我的思路是这样的：首先我们要在第一层压缩结束指令生成后的某
个地址写入JMP XXXXX，XXXXX是SMC指令相应部分所在的地址(注：因为有两层压缩，所以我的SMC指令要
分成好几个部分。)然后要在第二层压缩结束指令生成后的某个地址也写入JMP XXXXX，最后根据情况用
RET或JMP回到主程序的入口地址。(其实中间还有些细节，我会在后面的指令中一一分析的。)

[580000]是我们用TOPO加入空间后的新地址，我们要在这里写入SMC指令。

0167:00584000 JMP 00580000 ;[580000]是ASPACK的入口地址，先让它
;运行，过会再改。
0167:00584005 MOV DWORD PTR [00580439],003BDDE9 ;在第一层压缩结尾
0167:0058400F MOV BYTE PTR [0058043D],00 ;处写入JMP 0058401B
0167:00584016 JMP 00580007
0167:0058401B MOV DWORD PTR [005803BA],003C88E9 ;在第二层压缩结尾
0167:00584025 MOV BYTE PTR [005803BE],00 ;处写入JMP 00584047
0167:0058402C MOV WORD PTR [005803BF],9090
0167:00584035 MOV DWORD PTR [00580439],C7E900C3 ;这里是还原第一层压 结尾处的指令，因
0167:0058403F MOV BYTE PTR [0058043D],FB ;为;在第二层解压缩时要用到这些代码，
0167:00584046 RET ;若不还原就会死机。

0167:00584047 MOV WORD PTR [004F84BB],01B0 ;下面的指令就是向完成解压后的主程序里
0167:00584050 MOV BYTE PTR [004F84BD],EB ;写破解代码，写完后用RET退出第二层压缩。
0167:00584057 MOV WORD PTR [004F84EF],01B0 ;继续运行主程序。
0167:00584060 MOV BYTE PTR [004F84F1],EB
0167:00584067 MOV BYTE PTR [004F85FF],EB
0167:0058406E MOV WORD PTR [0050435A],00B0
0167:00584077 MOV BYTE PTR [0050435C],EB
0167:0058407E RET

[后记]

我脱壳不太好，记得我以前脱SafeCln3.02时老是出错，在WIN98第二版上脱的文件在第一版上不能用，
我怀疑是IMPORT表定位有错。哪位大哥脱壳比较好，教教小弟吧。我的QQ：17525661

祝各位在新的一年里身体健康! 工作顺利! 万事如意!

gfh[CCG]
2001年1月19日


有声有色

 标 题:内存补丁小小节---有声有色另类解法 (3千字)
发信人:丁丁虾
时 间:2000-10-7 17:56:31
详细信息:
Project：内存补丁小小节（转载希望保持完整）

级别：看着办吧 ^)^
作者：丁丁虾 又名：DDXia [CCG]

目的： 好东东一定要大家来分享哦 ：） ---古人云的，幸好不是俺说的。要不连我身上的内衣也
不见了，说错说错，那得属于"脱星"----ljtt 才对 呵呵~~~~~

很久很久没有写东东了，唉，是啊！曾有过一段时间，想退出江湖，不看论坛，不开OICQ，
不下载软件，不去mirc........曾经为Crack痴狂过，因此生活中也多了一份成功的喜悦，久久而久
之，就失去当初的那一份激情，越深入越发现，出现在你的面前不再是"bpx hmemcpy
bpx getwindowtext"简单的拦截，随之而来是许多的东东，比如汇编、C++ 和C、脱壳、vxd/wdm、
密码学等等，我被击到了，虽然跟自己讲，Crack并不是一种事业，也不是一种赚钱的工具（对于
我们所处的现实世界，面对的都是钱、钱及太多的金钱诱惑[话说回头，还是要有money，毕竟还是
要回到这个社会生活的，矛盾和不矛盾总是循环交替的]）还是放弃算了，整整失踪一个月零天，
再也忍不住要打开OICQ见见Crack朋友，跟他们聊天，Crack中的朋友，不仅仅是可以成为Crack的
朋友，也可以成为生活中的一个朋友！由共同的爱好，使我们天南海北走一起。感谢所有认识我的
人，认识到Crack的精华：在于不断的突破自己，不断的进取，不断的奉献。

言归正题。内存补丁简单的来说，暴力Crack的一种延续，由一个软件进行加载目标程序，然
后在目标程序尚未运行前，对它在内存中代码进行修改，以实现我们Crack目的。

入门文章：
1、（启发）使用KERNEL32.DLL破解？？？
原文地址：http://www.woodmann.com/madmasu.htm

2、（基础）如何访问一个进程中的内存（比如游戏补丁、进程补丁等）深入window
原文地址：http://www.woodmann.com/natz_mp2.htm

3、（重点）内存修改三种处理方法
原文地址：http://www.woodmann.com/stone1.htm

非常谢谢前面三位大师的精华文章，让我耳目一新。前两篇已经翻译，放在看雪精华2中，第
三篇已经基本翻译完了，但懒于修改，中英文混杂在一起。翻译是种苦差事，尤其是Stone的，非常
苦难，他不但是Crack的大师，连语言方面也相当的精辟，看英文都困难。所以有些地方翻不出来就
跳过了。其实看我翻译出来的中文也一样的困难 呵呵~~~~ 这是常说的外国人看不懂，中国人也不明白
将就吧！！我都打在压缩包里，放在主页上。（主页已经N久没有打扫了，一定有很多的灰尘了呵呵）

现在的内存补丁，为什么用的不多呢？？也是由于它有一定的局限性，象现在的软件，不管什
么东东，都先加壳，等你去脱吧！！现在流行脱衣舞研究，别小瞧，那可是一门学问，有先有后的，
呵呵~~~~~ 冰毒首先引进到看相论坛的！然后是冰鸟----台湾的KEN-----台湾的C-PEN----看相----后来
就好多好多人，感谢他们给我们的知识。现在什么软件见面就得脱！在第三篇文章中我采用了他的
第三种方法---经济又实惠。按照他的方法编写了一个内存补丁程序，可以在WINNT/WIN98下运行。

现在这个程序只是一个测试版，一定有N多的bug，说真的，用汇编写程序头一次，很多东西
都是蒙碴碴，希望大家体谅和理解。：）因为10月这一段假期准备过了，对大伙儿和师傅有个交代，
：） 急于有个表现的机会（这个家伙终于点中重点了，呵呵~~~）人嘛！有点虚荣心是好的。容易满足。

由于有声有色的作者比较嚣张，就那他的软件进行开刀，如果你收敛一下，我会用自己的
Crackme进行举例的，呵呵~~~ 不过呢？还是有一定的代表性。

ddxia.mp -------这个是描述文件

;有声有色3.10 ----用ASPACK压缩的。
m=6 ;如果是经过压缩的就取6，否则取3
P=musrea.exe ;需要补丁的程序名
A=48A4E1/0f,84,98/e9,7b,02: ;需要修改的代码；格式 地址/旧代码/新代码:

ddxia.mp -------这个是描述文件

;有声有色3.16-----用UPX压缩的。
m=6 ; if pack or encryp ,mode=6 ,otherwise mode=3
P=musrea.exe ;program to patch
A=4e0bc4/7d,48/eb,5b: ;patch mem address

在我的NT和WINME下，都能成功进行补丁，跳过过期限制。：）

小程序的下载URL：minipatch@263.net user: mini / password:patch
由于163有毛病，无法FTP上去。

压缩包里包括三篇译文及两个针对有声有色的描述文件。
readme.txt还没有因为都一直在写程序和测试，使用方法就是把minipatch.exe和ddxia.mp
拷贝到运行程序的目录中，运行minipatch就OK了。：）

不过，程序有缺陷：对于用asprotest 和crunch进行保护的目标程序不起作用。

丁丁虾
China Crack Group
2000.10.7.17:49:06


有声有色 v3.16

 标 题:有声有色 v3.16破解教程 (6千字)
发信人:wind[CCG]
时 间:2000-10-3 19:57:59
详细信息:
有声有色 v3.16破解教程
毫无意义的破解，请大家以后不要让我破解此类软件！没有使用价值，也没有破解价值！垃圾
软件一个！！
开始进入正题：
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046FAC2(C)
|
:0046FB29 E86E45F9FF call 0040409C
:0046FB2E 50 push eax
:0046FB2F 8B432C mov eax, dword ptr [ebx+2C]
:0046FB32 50 push eax
:0046FB33 E84C7AF9FF call 00407584
:0046FB38 8BF0 mov esi, eax
:0046FB3A 66837B4A00 cmp word ptr [ebx+4A], 0000
:0046FB3F 7408 je 0046FB49
:0046FB41 8BD3 mov edx, ebx
:0046FB43 8B434C mov eax, dword ptr [ebx+4C]
:0046FB46 FF5348 call [ebx+48]
从我们查看可得，46fb33那个call是呼叫过期窗口的那个call,我们可以用trw2000来设断
，带过这个call，那个讨厌的nag就跑出来了！如果你想修改46fb3f那个跳转来让程序继续
运行他就会跑出来告诉你修改程序或缺少文件之类的废话！我们不用管这里，我们往上走，
来到如下程序段：
* Referenced by a CALL at Addresses:
|:004E096D , :004E0A2D , :004E0AEF , :004E0C1A , :004E6635
|
:0046FAE8 55 push ebp
:0046FAE9 8BEC mov ebp, esp
:0046FAEB 6A00 push 00000000
:0046FAED 53 push ebx
:0046FAEE 56 push esi
:0046FAEF 8BD8 mov ebx, eax
:0046FAF1 33C0 xor eax, eax
:0046FAF3 55 push ebp
:0046FAF4 685FFB4600 push 0046FB5F
:0046FAF9 64FF30 push dword ptr fs:[eax]
:0046FAFC 648920 mov dword ptr fs:[eax], esp
:0046FAFF 8D55FC lea edx, dword ptr [ebp-04]
:0046FB02 8B4338 mov eax, dword ptr [ebx+38]
:0046FB05 8B08 mov ecx, dword ptr [eax]
:0046FB07 FF511C call [ecx+1C]
:0046FB0A 66837B4200 cmp word ptr [ebx+42], 0000
:0046FB0F 7408 je 0046FB19
:0046FB11 8BD3 mov edx, ebx
:0046FB13 8B4344 mov eax, dword ptr [ebx+44]
:0046FB16 FF5340 call [ebx+40]
如果程序来到这里就必然会出现过期的对话框并终止程序的使用，所以程序只要不来到这里就OK了！
可以看见有5个地方呼叫这个地方，我们过去看看，首先来到4e096d，如下：
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E0917(C), :004E0920(C), :004E0929(C), :004E0932(C), :004E093B(C)
|:004E0944(C), :004E094D(C), :004E0956(C)
|
:004E0961 8BC3 mov eax, ebx
:004E0963 E8D48DFFFF call 004D973C
:004E0968 A1B8BC4E00 mov eax, dword ptr [004EBCB8]
:004E096D E876F1F8FF call 0046FAE8
:004E0972 EB45 jmp 004E09B9
这里只是一个简单的调用，没有我们破解需要的东西，往上看，来到：
:004E08CF B8580F4E00 mov eax, 004E0F58
:004E08D4 E887D6F7FF call 0045DF60
:004E08D9 8B55CC mov edx, dword ptr [ebp-34]
:004E08DC A1C8BC4E00 mov eax, dword ptr [004EBCC8]
:004E08E1 59 pop ecx
:004E08E2 8B30 mov esi, dword ptr [eax]
:004E08E4 FF5610 call [esi+10]
:004E08E7 A2B6BC4E00 mov byte ptr [004EBCB6], al
:004E08EC 803DB6BC4E0000 cmp byte ptr [004EBCB6], 00
:004E08F3 0F8581020000 jne 004E0B7A
我们可以修改4e08f3的跳转来跳过刚刚的调用，把他改成jmp 4e0b7a就可以了！继续我们
的破解历程,跳转到4e0b7a,我看了一下没有什么，往下来到：
:004E0B90 B8FC114E00 mov eax, 004E11FC
:004E0B95 E8C6D3F7FF call 0045DF60
:004E0B9A 8B55A4 mov edx, dword ptr [ebp-5C]
:004E0B9D A1C8BC4E00 mov eax, dword ptr [004EBCC8]
:004E0BA2 59 pop ecx
:004E0BA3 8B30 mov esi, dword ptr [eax]
:004E0BA5 FF5608 call [esi+08]
:004E0BA8 8BD0 mov edx, eax
:004E0BAA 8B8340040000 mov eax, dword ptr [ebx+00000440]
:004E0BB0 E8C714F9FF call 0047207C
:004E0BB5 8B8340040000 mov eax, dword ptr [ebx+00000440]
:004E0BBB 8B9038010000 mov edx, dword ptr [eax+00000138]
:004E0BC1 83FA1E cmp edx, 0000001E
:004E0BC4 7D48 jge 004E0C0E
:004E0BC6 833D6CBC4E001E cmp dword ptr [004EBC6C], 0000001E
:004E0BCD 7D3F jge 004E0C0E
:004E0BCF 833D6CBC4E001E cmp dword ptr [004EBC6C], 0000001E
:004E0BD6 7D36 jge 004E0C0E
:004E0BD8 803DB0BC4E0001 cmp byte ptr [004EBCB0], 01
:004E0BDF 742D je 004E0C0E
:004E0BE1 803DB1BC4E0001 cmp byte ptr [004EBCB1], 01
:004E0BE8 7424 je 004E0C0E
:004E0BEA 803DB2BC4E0001 cmp byte ptr [004EBCB2], 01
:004E0BF1 741B je 004E0C0E
:004E0BF3 803DB3BC4E0001 cmp byte ptr [004EBCB3], 01
:004E0BFA 7412 je 004E0C0E
:004E0BFC 803DB4BC4E0001 cmp byte ptr [004EBCB4], 01
:004E0C03 7409 je 004E0C0E
:004E0C05 803DB5BC4E0001 cmp byte ptr [004EBCB5], 01
:004E0C0C 7513 jne 004E0C21

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E0BC4(C), :004E0BCD(C), :004E0BD6(C), :004E0BDF(C), :004E0BE8(C)
|:004E0BF1(C), :004E0BFA(C), :004E0C03(C)
|
:004E0C0E 8BC3 mov eax, ebx
:004E0C10 E8278BFFFF call 004D973C
:004E0C15 A1B8BC4E00 mov eax, dword ptr [004EBCB8]
:004E0C1A E8C9EEF8FF call 0046FAE8
:004E0C1F EB46 jmp 004E0C67
4e0c1a又是一个呼叫那个过期对话框的子程序，我们可以看到上面有很多跳转，就说明有很多
机会了，可以把4e0bc4的那个跳转修改成jmp 4e0c21来跳过整个部分，你也可以把所有的跳转
都nop掉，然后把4e0c0c的那个跳转修改成jmp 4e0c21，两种方法都可以！这样就可以完成整个
软件的破解了，我恢复了一便系统测试，没有过期的提示了，可以继续使用！
我的主页绝不会放这个垃圾软件了！坚决抛弃它！！！！
破解就在上面，大家自己看吧！！
有空来我主页：http://www.ohtop.com/wind
wind[CCG]

标 题:有声有色3.16破解---SMC技术应用一则 (3千字)
发信人:mercury
时 间:2000-10-4 14:35:49
详细信息:

有声有色3.16破解---SMC技术应用一则

对于这个程序作者用UPX0.72进行了压缩，相应版本的UPX解压出错，procdump解可以，但反汇编仍有问题，除非在procdump中选择rebuild new inport table才勉强可以，估计作者用了UPX的多重压缩技术。为此正好拿它训练一下SMC技术。

1 过期破解：
过期后用BPX MESSAGEBOXEXA断点，加上残缺的dump.exe，及不断的尝试，我们知道在
:004E0BC1 83FA1E cmp edx, 0000001E
:004E0BC4 7D48 jge 004E0C0E <-- ×××××
:004E0BC6 833D6CBC4E001E cmp dword ptr [004EBC6C], 0000001E
:004E0BCD 7D3F jge 004E0C0E
:004E0BCF 833D6CBC4E001E cmp dword ptr [004EBC6C], 0000001E
:004E0BD6 7D36 jge 004E0C0E
:004E0BD8 803DB0BC4E0001 cmp byte ptr [004EBCB0], 01
:004E0BDF 742D je 004E0C0E
:004E0BE1 803DB1BC4E0001 cmp byte ptr [004EBCB1], 01
:004E0BE8 7424 je 004E0C0E
:004E0BEA 803DB2BC4E0001 cmp byte ptr [004EBCB2], 01
:004E0BF1 741B je 004E0C0E
:004E0BF3 803DB3BC4E0001 cmp byte ptr [004EBCB3], 01
:004E0BFA 7412 je 004E0C0E
:004E0BFC 803DB4BC4E0001 cmp byte ptr [004EBCB4], 01
:004E0C03 7409 je 004E0C0E
:004E0C05 803DB5BC4E0001 cmp byte ptr [004EBCB5], 01
:004E0C0C 7513 jne 004E0C21 <-- ×××××

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E0BC4(C), :004E0BCD(C), :004E0BD6(C), :004E0BDF(C), :004E0BE8(C)
|:004E0BF1(C), :004E0BFA(C), :004E0C03(C)
|
:004E0C0E 8BC3 mov eax, ebx
:004E0C10 E8278BFFFF call 004D973C
:004E0C15 A1B8BC4E00 mov eax, dword ptr [004EBCB8]
:004E0C1A E8C9EEF8FF call 0046FAE8 <--die!!!
最终知道使:004E0BC4 jge 004E0C0E改为直接跳到cs:004E0C21就没有过期问题了。
即在cs:004E0BC4处改7D 48 为EB 5B。

2 SMC的解决
思路：当程序在内存中解压完毕，跳到真正入口点前让其先跳到补丁代码处执行补丁，再回到原入口继续正常工作。
步骤：
（1〕下bpmb 004E0BC4，用TRW2000载入主程序，被拦截后用F6在代码中往下看，发现程序真正入口点
:0053F198 E9677DFAFF jmp 004E6F04
而在此上下没有地方给我PATCH，所以用TOPO为它加了50个bytes，以供我利用。这样重新用TRW载入后，看到程序先从我加入CODE处开始，运行我这50个WORD（90，90...〕，再开始原本的UPX解压。即：
：0053E281 90 NOP
: 0053E282 90 NOP
......
: 0053E290 90 NOP
......
: 0053E2AE JMP 0053F000 此处UPX开始解压。所以从: 0053E286 90 NOP就可以利用，使得直接跳到cs:0053F000，这样多了一段空白代码供我写PATCH CODE。
(2) 在真正入口点跳转处 :0053F198 E9677DFAFF jmp 004E6F04，让代码转到空白处cs:0053E290
(3)cs:0053E290处写好patch code, mov [004E0BC4], EB5B833D
再跳回入口，jmp 004E6F04
(4)整个过程如下：
(A)用TOPO在主程序MusRea.exe中加入50个bytes。
(B)trw载入后，f10走几步，在cs:0053E286处下汇编指令A，回车后输入jmp 0053F000，两次回车后d eip,记下代码E9 75 0D。
(C)G 0053f198，
a,输入jmp 0053E290,
d eip，记下 E9 F3 F0 FF FF
(D)F10一步，跳到cs:0053E290处
a,输入 mov [004E0BC4], EB5B833D
d eip，记下 C7 05 C4 0B 4E 00 EB 5B 83 3D
(E)F10走一步，cs:0053E29A处
a,输入 jmp 004E6F04
d eip，记下 E9 65 8C FA FF
(F)打开HIEW，在上述4个地方修改后保存。

job done!

thank you for reading my tutorial.

from china crack group

mercury: 即西方神话中墨丘利(赫耳墨斯)神, 众神的信使. 在炼金术中指水
银,依靠它能最终获得炼金术最高的成就,得到点金石,青春泉!


FPE 2000 Pro

标 题:FPE 2000 Pro在Crack中的一点应用 (1千字)
发信人:liangs
时 间:2001-2-14 10:10:18
详细信息:
FPE 2000 Pro在Crack中的一点应用

FPE 2000 Pro是一个功能强大的游戏修改工具，它的内存扫描分析功能确实
相当的强劲，相信很多喜欢玩游戏的兄弟都能熟练的使用它。其实把它作为一个
Crack的辅助分析工具也是相当不错的哟！下面举一个实例来说明一下。
过年的那几天，在家里没事就玩了玩泡泡龙(Bubble Bobble Nostalgie v1.0)
，由于游戏开始只给了4条命，到了后面简直就玩不动了，想想要是能将4条命改成
N条命那该多好。说干就干，马上运行FPE 2000 Pro进行内存扫描分析，自杀几次
后，FPE找出了唯一的一处内存地址[0042CC04]，通过对此处内存地址的锁定，我们
发现的确没错。问题是用了FPE后，每次玩游戏的时候都要运行一下它，太麻烦了。
要是直接修改一下程序，让它加载时就给足你N条命，那该多好。
要修改程序，我们首先用W32Dasm静态反汇编一下，既然游戏中的生命值始终是
对内存地址[0042CC04]的操作，我们就搜索这个地址，于是就找到了如下一段代码：

:00406191 B904000000 mov ecx, 00000004
:00406196 891568CC4200 mov dword ptr [0042CC68], edx
:0040619C AA stosb
:0040619D 890D37CC4200 mov dword ptr [0042CC37], ecx
:004061A3 890D04CC4200 mov dword ptr [0042CC04], ecx

上面这段代码我想大家都能看的懂，00406191处是游戏初始化是将要赋值的4条命，
也正是我们想要修改的地方，004061A3处就是将4条命放到内存[0042CC04]中去，你
死一条命，[0042CC04]处的内存值就减1。注意，虽然共有四个字节可供你去修改，
但是，如果改的太大，游戏中命的显示会有问题。
希望大家看过这篇泡泡龙的修改后，在Crack的时候能多一条思路。

liangs
2/14/2001


监狱(QUOD)1.0

 标 题:让程序自己告诉我们它的注册码---爆破进阶篇 (3千字)
发信人:8989
时 间:2001-8-22 22:03:58
详细信息:
让程序自己告诉我们它的注册码---爆破进阶篇

作者：风飘雪

加入BCG的第三篇
感谢看雪老师提供的代理服务器，使我能上到国外的站点，学习他们的破解方法。

理论基础：许多软件在输入错误的注册码时，会弹出错误信息窗口，告诉你注册码不对。
我们可以用正确注册码替代错误信息，使弹出正确注册码，从而达到让程序自己告诉我们它的注册码
的目的。

下面举例说明

破解对象：监狱(QUOD)1.0
下载： http://newhua.ruyi.com/down/Quod10.EXE
1.用language2000侦测是否加壳，发现aspack壳 ；2.unaspack脱壳;
3.用W32DASM反汇编
:0045F32E 8B55F0 mov edx, dword ptr [ebp-10]
:0045F331 8D4DF4 lea ecx, dword ptr [ebp-0C]
:0045F334 8BC3 mov eax, ebx
:0045F336 E8BD010000 call 0045F4F8
:0045F33B 8B55F4 mov edx, dword ptr [ebp-0C] **** 破解经典句式--------------------
:0045F33E 58 pop eax ***** edx中装真码
:0045F33F E8F854FAFF call 0040483C ****** 关键call ==============
:0045F344 7576 jne 0045F3BC ****** 关键跳转 注册码不对跳到45f3bc-------
:0045F346 B201 mov dl, 01
:0045F348 A1E8EA4500 mov eax, dword ptr [0045EAE8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045F2DE(C)
|
:0045F34D E896F8FFFF call 0045EBE8
:0045F352 8945FC mov dword ptr [ebp-04], eax
:0045F355 33C0 xor eax, eax
:0045F357 55 push ebp
:0045F358 68B5F34500 push 0045F3B5
:0045F35D 64FF30 push dword ptr fs:[eax]
:0045F360 648920 mov dword ptr fs:[eax], esp
:0045F363 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\XDZHAN\Quod"
|
:0045F365 BA00F44500 mov edx, 0045F400
:0045F36A 8B45FC mov eax, dword ptr [ebp-04]
:0045F36D E87AF9FFFF call 0045ECEC

* Possible StringData Ref from Code Obj ->"Real Programmers Use Pascal!"
|
:0045F372 B920F44500 mov ecx, 0045F420

* Possible StringData Ref from Code Obj ->"Key"
|
:0045F377 BA48F44500 mov edx, 0045F448
:0045F37C 8B45FC mov eax, dword ptr [ebp-04]
:0045F37F E804FBFFFF call 0045EE88

* Possible StringData Ref from Code Obj ->"软件注册成功,谢谢您的支持!"
|
:0045F384 B854F44500 mov eax, 0045F454
:0045F389 E82A39FDFF call 00432CB8
:0045F38E A1E83E4600 mov eax, dword ptr [00463EE8]
:0045F393 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"监狱(Quod)—注册版"
|
:0045F395 BA78F44500 mov edx, 0045F478
:0045F39A E8459EFDFF call 004391E4
:0045F39F 33C0 xor eax, eax
:0045F3A1 5A pop edx
:0045F3A2 59 pop ecx
:0045F3A3 59 pop ecx
:0045F3A4 648910 mov dword ptr fs:[eax], edx
:0045F3A7 68C6F34500 push 0045F3C6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045F3BA(U)
|
:0045F3AC 8B45FC mov eax, dword ptr [ebp-04]
:0045F3AF E82043FAFF call 004036D4
:0045F3B4 C3 ret

:0045F3B5 E9AE4AFAFF jmp 00403E68
:0045F3BA EBF0 jmp 0045F3AC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045F344(C) 绿色光条停在此，双击鼠标右键，可来到跳过来的地方
|

* Possible StringData Ref from Code Obj ->"注册码不正确,无法注册!"
|
:0045F3BC B894F44500 mov eax, 0045F494------跳到这里，就改这里=>mov eax, dword ptr [ebp-0C]
:0045F3C1 E8F238FDFF call 00432CB8
:0045F3C6 33C0 xor eax, eax

（1）第一种修改方法：
dword ptr [ebp-0C]中装有真注册码
修改 0045F3BC B894F44500 mov eax, 0045F494 **459494装错误信息"注册码不正确,无法注册!"
修改为 mov eax, dword ptr [ebp-0C] ****dword ptr [ebp-0C]中装有真注册码

B894F44500=〉
8B45F49090 由于保持字节相同，补两个90

(2)第二种修改方法：
trw下断
bpx 45f33e
d (ebp-0c)
看到数据窗口 20CDBD00 ****注意
dd (ebp-0C)
看到00BDCD20上面的倒过来
DB (EBP-0C) 看到正确的注册码
按F10直到
:0045F3BC B894F44500 mov eax, 0045F494
a
mov eax,00bdcd20

继续走，弹出注册码

总结：B894F44500 (mov eax, 0045F494)
=> B820CDBD00 （mov eax,00bdcd20）

用ultredit永久修改，测试成功

修改后的程序输入姓名和任意注册码，便会弹出正确的注册码


PE资源

 标 题:转贴 “对PE资源的研究心得" (4千字)
发信人:copyyour[CCG]
时 间:2001-7-15 1:33:49
详细信息:
对PE资源的研究 作者：万重

主页：http://mantousoft.51.net
邮箱：mantousoft@sina.com

前言：没什么好说的，发现这方面的资料全是英文的，于是我一边研究，一边翻译，一边写出自己的心得。
希望大家尊重我的劳动成果，转贴保持完整。

资源一般使用树来保存，通常包含3层，在NT下，最高层是类型，然后是名字，最后是语言。
一个PE文件是否包含资源文件，通常检测块表（Section Table）中是否含有'.rsrc'，不过这个方法对有些PE文件无效。

一个类型表结构如下
——————————————————————————
| RESOURCE DIRECTORY |
——————————————————————————
| RESOURCE DATA |
——————————————————————————
资源表1（Resource File Layout）

其中的资源目录（RESOURCE DIRECTORY）结构如下：

——————————————————————————
| RESOURCE FLAGS |
——————————————————————————
| TIME/DATE STAMP |
——————————————————————————
| MAJOR VERSION |MINOR VERSION |
——————————————————————————
| # NAME ENTRY |# ID ENTRY |
——————————————————————————
| RESOURCE DIR ENTRIES |
——————————————————————————
资源表2（Resource Table Entry）

在DELPHI中的申明
{ Resources }
PIMAGE_RESOURCE_DIRECTORY = ^IMAGE_RESOURCE_DIRECTORY;
IMAGE_RESOURCE_DIRECTORY = packed record
Characteristics : DWORD;
TimeDateStamp : DWORD;
MajorVersion : WORD;
MinorVersion : WORD;
NumberOfNamedEntries : WORD;
NumberOfIdEntries : WORD;
end

其中：

RESOURCE FLAGS
通常设置为0

TIME/DATE STAMP
资源编译器建立此资源的时间/日期，可能为0

MAJOR/MINOR VERSION
版本信息

# NAME ENTRY
使用名字的资源条目的个数，包含一个使用名字的目录条目的数组。
# ID ENTRY
使用ID数字的资源条目的个数，包含一个32位的整数ID号，同用名字一样。
这个目录紧接着会是一个不定长度的目录条目，不管用的名字还是ID，都是用升序排列。

这个不定长度的目录结构如下：

31 0
——————————————————————
| NAME RVA/INTEGER ID |
——————————————————————
| E | DATA ENTRY RVA/SUBDIR RVA |
——————————————————————
资源表3（Resource Directory Entry）

在DELPHI中的申明：
PIMAGE_RESOURCE_DIRECTORY_ENTRY = ^IMAGE_RESOURCE_DIRECTORY_ENTRY;
IMAGE_RESOURCE_DIRECTORY_ENTRY = packed record
Name: DWORD; // Or ID: Word (Union)
OffsetToData: DWORD;

INTEGER ID
包含一个识别资源的整数ID
如果在根目录，这个ID表示的意义如下
资源类型
1: cursor
2: bitmap
3: icon
4: menu
5: dialog
6: string table
7: font directory
8: font
9: accelerators
10: unformatted resource data
11: message table
12: group cursor
14: group icon
16: version information

NAME RVA
名字的相对实际地址，包含一个31位的相对资源的Image Base的地址。表的形式见表4

E 一位的不可缺少的识别码(mask 80000000h)
如果这位为0，则为Resource Data Entries，其中DATA RVA = 31位的(mask 7fffffffh) 数据条目的地址。结构见表5
如果这位为1，则表示接另一个子目录（Subdirectory Entry）。

{ 此函数检验 offset 是一个字符串名还是一个目录 }
{ IMAGE_RESOURCE_NAME_IS_STRING
= IMAGE_RESOURCE_DATA_IS_DIRECTORY
= $80000000 }
function HighBitSet(L: Longint): Boolean;
begin
Result := (L and IMAGE_RESOURCE_DATA_IS_DIRECTORY) <> 0;
end;

{ 下面两个函数用于去掉E位剩下的值或者指针 }
{IMAGE_OFFSET_STRIP_HIGH = $7FFFFFFF;}
function StripHighBit(L: Longint): Longint;
begin
Result := L and IMAGE_OFFSET_STRIP_HIGH;
end;

function StripHighPtr(L: Longint): Pointer;
begin
Result := Pointer(L and IMAGE_OFFSET_STRIP_HIGH);
end;

每一个资源目录名为如下格式
——————————————————————
| LENGTH | UNICODE STRING |
——————————————————————
| LENGTH | UNICODE STRING |
——————————————————————
表4（Resource Directory String Entry）

在DELPHI中的申明
PIMAGE_RESOURCE_DIR_STRING_U = ^IMAGE_RESOURCE_DIR_STRING_U;
IMAGE_RESOURCE_DIR_STRING_U = packed record
Length : WORD;
NameString : array [0..0] of WCHAR;
end;

LENGTH
就是字符串的长度
UNICODE STRING
Unicode的字符串.

资源数据表结构：
—————————————
| DATA RVA |
—————————————
| SIZE |
—————————————
| CODEPAGE |
—————————————
| RESERVED |
—————————————
表5（Resource Data Entry）

在DELPHI中的申明
PIMAGE_RESOURCE_DATA_ENTRY = ^IMAGE_RESOURCE_DATA_ENTRY;
IMAGE_RESOURCE_DATA_ENTRY = packed record
OffsetToData : DWORD;
Size : DWORD;
CodePage : DWORD;
Reserved : DWORD;
end;

DATA RVA
资源的相对实际地址，包含一个32位相对于资源Image Base的地址。
SIZE
资源的大小。
CODEPAGE
没什么说的，好像为译码方面设置的。
RESERVED
一定为0

好了，差不多资源这部分分析玩了，其它部分我还在研究：）


修复输入表

标 题:【标题：用Import REConstructor v1.2 beta2 修复输入表】 (7千字)
发信人:BestFont
时 间:2001-4-18 2:36:05
详细信息:
【标题：用Import REConstructor v1.2 beta2修复输入表
--- 之HiClock Pro v2.2 及S-Spline 2.04】

--------------------------------------------------------------------------------
【下载处】
1)Import REConstructor v1.2 beta2
http://www.digitalrice.com/kaparo/files/utilities/imprec.zip (取自protoools)

以下两个程序皆用Asprotect1.2以后的版本加壳
2)HiClock Pro version 2.2 build 126 - released on April 9, 2001
http://www.downme.com/download/6815hiclockpro.zip
http://www.kgsoft.com/ (官方网址)

3)S-Spline 2.04
http://202.108.252.24/stcsr/rj/txtx/S-Spline%202.04.zip (康乐园)
http://www.shortcut.nl/S-Spline/Shortcut_S-SplineDemo.zip (官方下载)

--------------------------------------------------------------------------------
【前言】
本文只简述输入表的修复，没涉及软件的破解。
主角是ImpREC1.2 beta2, 目标软件是 HiClockPro v2.2 及 S-Spline 2.04 。
其中， HiClockPro 2.2 可一次性修复完成，S-Spline 2.04 还需要手工修复/填补。
本文在win98se下完成，当然也适合在windows2k下做参考

【工具】 1) ImpREC1.2beta2(必须是beta2 或其最新版本)
2) SoftIce4.05build334 , icedump6.022 (《=必备!)
3) PE-Editor1.7
4) BW2000 v0.2 (for win9x only)

工具简述：ImpREC的说明文件指出，使用ImpREC时系统中最好已加载icedump。
这样建立的输入表比较少跨平台的问题。而运行icedump前，当然得先加
载Softice。
Softice + icedump： 使用Icedump 的/tracex 命令可以找到可能
是OEiP 的地址。
PE-Editor 的dumpfixer 可以使dump 出来的文件的 RS=VS, RO=VO
BW2000 v0.2 是为了查找被加壳的程序的OEiP (ImpREC中需要此值)
若已经知道软件的OEiP,可省略。
--------------------------------------------------------------------------------
【准备工作】
加载Softice 及 Icedump 。先追踪目标程序(使用/tracex命令)，得到OEiP，
并/dump出一个脱壳版本。使用 PE-Editor 的dumpfixer修正脱壳后的文件.

==》注意1：HiClockPro 2.2 的必须采取特别步骤脱壳，否则程序无法运行。
具体请参考以下两篇：
1) http://001.com.cn/forum/toye/14781.html
标 题:简述ICEDUMP中/tracex命令在HiClock脱壳中的应用 (1千字)
发信人:henryw

2) http://www.001.com.cn/forum/toye/14335.html
标 题:不是不愿写，我真的是只知其然而不知其所以然。
我那样改的原因如内。 (690字)
发信人:hying

==》注意2: S-Spline 必须是未注册的，否则脱壳后的程序将无法正常运行。
S-Spline的破解可以参考下面这篇：
http://001.com.cn/forum/toye/14799.html
标 题:v2.04的 (9千字)
发信人:blowfish

附：这里有一篇ImpRECT 1.2 beta1 (不是beta2!!) 的使用方法。
http://001.com.cn/forum/toye/14358.html (本文参考这篇)
标 题:这样试试...... (1011字)
发信人:ljtt

【修复HiClockPro 2.2】
---------------------
0.运行HiClockPro 2.2 及 ImpRECT
1.在ImpRECT下拉列表框中选择HiClock.exe进程；
2.在左下角的OEP添入BF260 (即这个程序的OEP)
3.按IAT AutoSearch，让其自动检测IAT位置；
出现对话框Found Something!=》
“Found address which may be in the Original IAT.Try 'Get Import'”
这表示我们输入的OEP发挥作用了。
4.按Get Import，让其分析IAT结构得到基本信息；

5.按Show Invalids 按钮。
在Imported Function Found栏中点击鼠标右键，选择"Trace Level1 (Disasm)"
再按Show Invalids 按钮。如果成功，可以看到所有的dll都为valid:YES字样；
6. (很明显第5步时，这个程序的输入表已经完全修复好了)

7.现在我们要修复已脱壳的程序HiClock.exe。选择Add new section (缺省是选上的) 来
为Dump出来的文件加一个Section(虽然文件比较大，但避免了许多不必要的麻烦)
8.按Fix Dump，并选择你Dump出来的文件；
9.ImpRECT 会在该文件所在目录生成一个新的文件：HiClock_.exe ,这就是修复后的文件。

TIPS1: 在Imported Function Found栏中点击鼠标右键，可以选择"Expand all nodes" 及
"Collapse all nodes" 来打开/关闭所有节点。
TIPS2: 若因操作上的错误需要重新按GetImport钮, 最好先按程序右边的ClearImports 及
Clear Logs 按钮。否则，Imported Functions Found 栏可能会出现奇怪的现象。

修复前
- ?Fthunk:000C317C NbFunc:2E (decimal:46) valid:NO
-rva:00000000 ptr:00505A4D
-rva:00000004 ptr:00000002
-rva:00000008 ptr:000F0004
-.....

修复后
- KERNEL32.dll FThunk:000C317C NbFunc:2E (decimal:46) valid:YES <===[看这个YES]
-rva:000C317C mod:KERNEL32.dll ord:015D name:GetCurrentThreadId
-rva:000C3180 mod:KERNEL32.dll ord:00D6 name:DeleteCriticalSection
-rva:000c3184 mod:KERNEL32.dll ord:0228 name:LeaveCriticalSection
-.....

【修复S-Spline 2.04】
---------------------
0.运行S-Spline 及 ImpRECT
1.在ImpRECT下拉列表框中选择S-Spline.exe进程；
2.在左下角的OEP添入7E910
3.按IAT AutoSearch，让其自动检测IAT位置；
出现对话框Found Something!=》
“Found address which may be in the Original IAT.Try 'Get Import'”
这表示我们输入的OEP发挥作用了。
4.按Get Import，让其分析IAT结构得到基本信息；
4.1.发现只有一个dll的 valid 为NO

5.按Show Invalids 按钮。
在Imported Function Found栏中点击鼠标右键，选择"Trace Level1 (Disasm)"
再按Show Invalids 按钮。如果成功，可以看到所有的dll都为valid:YES字样；
5.1.看到长长的一堆函数名，我们知道至少有一个dll未修复。故使用
鼠标右键”Collapse all nodes"，发现只剩下一个dll未完成。
从Log栏中可以看到有一个地址修复失败。

6.按Show Invalids 按钮
在Imported Function Found栏中点击鼠标右键选择"Trace Level2 (Hook)"。
再按Show Invalids 按钮。如果成功，可以看到所有的dll都为valid:YES字样；
若还不成功，目前只能手工修复了(Trace Level3 这个功能还没开发完成)。
6.1.从Log栏可以看到”Tracer failed in 008927E4 “修复失败。
我们找到那个修复失败的是 rva:0009C2AC
(到此，这个程序的输入表还没修复完成，我们必须手工修复这两个地址)

6.2.在Imported Function Found栏,找 rva:0009C2AC ,并用鼠标左键双击它。
在Module中选 KERNEL32.dll
在Function中选 ord:032C name:WinExec
按OK
(至于这个函数名如何获得？看看下面)
6.3按Show Invalids 按钮, 都为valid:YES字样，输入表到此完成。

7.现在我们要修复已脱壳的程序S-Spline.exe。选择Add new section (缺省是选上的) 来
为Dump出来的文件加一个Section(虽然文件比较大，但避免了许多不必要的麻烦)
8.按Fix Dump，并选择你Dump出来的文件；
9.ImpRECT 会在该文件所在目录生成一个新的文件：S-Spline_.exe ,这就是修复后的文件。

《找rva:0009C2AC 的函数名》
---------------------------
以下方法只是一个参考，它不是万能的。另一方面，以后的Asprotect 的小小改变足
以使它失效，诸位姑且看之。。。

此时Softice已经运行.
1.进入S-Spline 领空(不知道这样说对不对 8-) ) :
我们只需CTRL+D ,用bpx getwindowtexta 设拦, F5 。
在S-Spline 的Serial Number 栏中添入任何资料。
程序就会被拦。此时已进入S-Spline 领空^_^

2.寻找函数名:
此时下指令 dd 49c2ac (= 9c2ac + ImageBase) , 看见该数据区显示 8972B4 。
再 u 8972B4 , 看见代码区显示 PUSH EDX
JMP C0188DC2
再 u C00188DC2 , 看见代码区显示 MOV EDX,C0197490 (<==注意这里!!!)
JMP C0188DD
再 dd C0197490 , 看见该数据区显示 C0197327 。
最后 db C0197327 就可以看到我们的函数名了 ^_^ (注：这里是用db 不是dd)
bc * 再 F5 回到程序。

----作者：BestFont ------------【全文完】------------------------------------

标 题:简述ICEDUMP中/tracex命令在HiClock脱壳中的应用 (1千字)
发信人:henryw
时 间:2001-4-16 9:20:20
详细信息:

简述ICEDUMP中/tracex命令在HiClock脱壳中的应用

前两天peterchen提出脱壳HiClock，结果hying兄成功完成。ljtt兄的提示也使我对/Tracex命令感兴趣了。

昨日装上softice和icedump，开始试验这个奇妙的命令。

Asprotect加壳的软件会使得断点无效，/tracex可以解决这个问题。

常用两种用法：

1. /tracex 地址
用bpx拦不住的地址它可以拦住，就是速度慢了些。

2. /tracex 地址下限 地址上限
比如在HiClock中就可以在softice中下/tracex 400000 500000，结果第一次断下的地方只是一个ret，相比就是Johnson大侠说的只有ret的Call吧，用f8返回可以看到是调用它的是一个call esi。再下一次/tracex 400000 500000，会在4BD530处拦住，用F11返回，会发现这里就是hying兄在脱壳文中所指的需要跳过的call所在处。当第三次下/tracex 400000 500000以后，就会来到入口点4BDB68(大概是这个值，由于删除了程序，有些记不清了)。

不过在使用这个命令前，load程序后最好先跟一段，进入11xxxxxx以后再下这个命令。

虽然这种跟踪需要很长时间等待Softice窗口再次跳出，但是很值得，是吗？

btw: 用icedump后，如果我没有理解错说明文档的话，连Frogice和icepatch都可以不用了，爽！
记得在跟踪前先启动icedump喔！

标 题:不是不愿写，我真的是只知其然而不知其所以然。我那样改的原因如内。 (690字)
发信人:hying
时 间:2001-4-13 10:16:21
详细信息:

在前面的帖子我说了，402770处的call在入口点前已经被调用多次，而第一个调用点就在11A04B1里，改上面的跳转后下面原有的一些402770的调用也都被跳过了。
0167:011A04A3 CALL 01192910
0167:011A04A8 CMP DWORD [011A3590],BYTE +00
0167:011A04AF JZ 011A04D0 〈---必须跳
0167:011A04B1 CALL NEAR [011A3590]
0167:011A04B7 LEA EDX,[EBP-08]
0167:011A04BA CALL 0119A020
henryw翻译的文章里说有的程序跳过这些后就可以正常运行，然后我试了一下，真的可以了。
我实在是不知道它的原因。

那个股市风暴4.0的antidebug做得很好，反各种调试软件、反W32DASM、反filemon……，我能想到的它差不多都anti，我也不知它是如何做的。

你的网站我会经常去的，论坛我可是第二个留言的。

--------------------------------------------------------------------------------

标 题:Sorry,误导大家了 ;D 。 (内详) (427字)
发信人:BestFont
时 间:2001-4-19 16:45:56
详细信息:

S-Spline 2.04 的确可以只需一次修复即可完成而无需手工修复，kingtall没说错。

可能只是我的系统本身的问题吧！?? 或是 king兄的系统太干净了^_^
若启动到windows的保护模式下,的确无需手工修复。

我若正常启动windows(无Softice,且msconfig中已去掉所有开机会运行的程序)，用prodump的kill
“干”掉所有可以“干” 掉的进程，所得到的结果：还是得手工修复！？？？为什么？!!!

给大家添了不少麻烦。。。实在。。。。不知诸位遇见的情况如何？


AT2000

 标 题:AT2000的不完全破解！ (2千字)
发信人:大老
时 间:2001-6-19 16:53:51
详细信息:
AT2000的不完全破解！
软件下载：http://www.modernagri.com/at2000.zip (2.5M)
破解者：大老
主页：HTTP://DALAO2001.YEAH.NET
日期：2001.6.19
软件是用sentinel软件狗保护，并用BTFNT＋wwwpack加壳
这个软件的反跟踪做的非常好！要动态跟踪要麻烦点！嘿嘿
第一步：先脱壳
用TRW2000载入文件
用G命令 G 668E10
再用MAKEPE生成脱壳后的文件！
第二步：跟踪算出注册码
这一步比较麻烦注意！要先运行程序！不能先运行TRW 或ICE，
如果你运行的话嘿嘿！你的机器！就REST!
进入注册画面！这时的调试环境已经被破坏！
这时候要运行一个程序叫superbpm然后把它的erase的选项打开
软件下载版主，主页工具里有！
不然的话嘿嘿！死机！
这时候运行TRW就可以跟踪了！
设断点BPX 5EE72C
* Possible Reference to String Resource ID=00001: "歃:"
|
:005EE71F 6A01 push 00000001
:005EE721 8B4DFC mov ecx, dword ptr [ebp-04]
:005EE724 E8688F0900 call 00687691
:005EE729 8B4DFC mov ecx, dword ptr [ebp-04]
:005EE72C E82C000000 call 005EE75D =====>关键CALL
:005EE731 85C0 test eax, eax
:005EE733 740C je 005EE741

CALLL里的关键比较
:005EE810 3B45F0 cmp eax, dword ptr [ebp-10]
:005EE813 7D1F jge 005EE834
:005EE815 8B4DF8 mov ecx, dword ptr [ebp-08]
:005EE818 83C103 add ecx, 00000003
:005EE81B 51 push ecx
:005EE81C 8B4DEC mov ecx, dword ptr [ebp-14]
:005EE81F 83C15C add ecx, 0000005C
:005EE822 E8C9F3E3FF call 0042DBF0
:005EE827 0FBED0 movsx edx, al
:005EE82A 8B45F4 mov eax, dword ptr [ebp-0C]
:005EE82D 03C2 add eax, edx
:005EE82F 8945F4 mov dword ptr [ebp-0C], eax
:005EE832 EBD0 jmp 005EE804
:005EE834 8B4DFC mov ecx, dword ptr [ebp-04]
:005EE837 81E1FF000000 and ecx, 000000FF
:005EE83D 8B55F4 mov edx, dword ptr [ebp-0C]
:005EE840 81E2FF000000 and edx, 000000FF
:005EE846 3BCA cmp ecx, edx =====>一定要ecx=edx的值
:005EE848 7404 je 005EE84E ====》关键
:005EE84A 33C0 xor eax, eax
:005EE84C EB05 jmp 005EE853

* Possible Reference to String Resource ID=00001: "歃:"
|
:005EE84E B801000000 mov eax, 00000001
:005EE853 8BE5 mov esp, ebp
:005EE855 5D pop ebp
:005EE856 C3 ret

注册吗的第一位好像没有参加比较计算！
算出注册码后还是不能用！也许还要解狗！哈哈！！！！！
我的注册码是：
USERID:AF1VGC-PH5RFW-D57QG4-IYP8KW-SF4EG
PASSWORD:1AAC70

标 题:它的反跟踪原理！ (2千字)
发信人:hying
时 间:2001-6-20 19:32:02
详细信息:

这就是关键的地方。什么意思不用我说了吧。xixi~~~
可怜我的爱机啊！被超度了n(n>10)次。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404FC6(U)
|
:00404FEF 1E push ds
:00404FF0 06 push es
:00404FF1 668CD0 mov ax, ss
:00404FF4 668ED8 mov ds, ax
:00404FF7 668EC0 mov es, ax
:00404FFA BEC84F4000 mov esi, 00404FC8
:00404FFF 8975FC mov dword ptr [ebp-04], esi
:00405002 B9EF4F4000 mov ecx, 00404FEF
:00405007 2BCE sub ecx, esi
:00405009 8B3D806E7100 mov edi, dword ptr [00716E80]
:0040500F F3 repz
:00405010 A4 movsb
:00405011 0F014DF4 sidt [ebp-0C]
:00405015 8B5DF6 mov ebx, dword ptr [ebp-0A]
:00405018 83C308 add ebx, 00000008
:0040501B 8B03 mov eax, dword ptr [ebx]
:0040501D A3586A7100 mov dword ptr [00716A58], eax
:00405022 8B4B04 mov ecx, dword ptr [ebx+04]
:00405025 890D5C6A7100 mov dword ptr [00716A5C], ecx
:0040502B 8B45FC mov eax, dword ptr [ebp-04]
:0040502E 668CC9 mov cx, cs
:00405031 FA cli
:00405032 668903 mov word ptr [ebx], ax
:00405035 66894B02 mov word ptr [ebx+02], cx
:00405039 66C7430400EE mov [ebx+04], EE00
:0040503F C1E810 shr eax, 10
:00405042 66894306 mov word ptr [ebx+06], ax
:00405046 FB sti
:00405047 83C310 add ebx, 00000010
:0040504A 8B03 mov eax, dword ptr [ebx]
:0040504C A3506A7100 mov dword ptr [00716A50], eax
:00405051 8B4B04 mov ecx, dword ptr [ebx+04]
:00405054 890D546A7100 mov dword ptr [00716A54], ecx
:0040505A 8B45FC mov eax, dword ptr [ebp-04]
:0040505D 668CC9 mov cx, cs
:00405060 FA cli
:00405061 668903 mov word ptr [ebx], ax
:00405064 66894B02 mov word ptr [ebx+02], cx
:00405068 66C7430400EE mov [ebx+04], EE00
:0040506E C1E810 shr eax, 10
:00405071 66894306 mov word ptr [ebx+06], ax
:00405075 FB sti
:00405076 07 pop es
:00405077 1F pop ds
:00405078 33C0 xor eax, eax
:0040507A 5F pop edi
:0040507B 5E pop esi
:0040507C 5B pop ebx
:0040507D 8BE5 mov esp, ebp
:0040507F 5D pop ebp
:00405080 C3 ret


Embird32

 标 题:Embird32 防破解技术的分析 (8千字)
发信人:parrot
时 间:2001-4-29 8:01:59
详细信息:
                                  Embird32 防破解技术的分析

    应皮大客的要求，写了一篇关于如何在破解Embird32中Anti-Debug的教程.因本人最近学习比较紧张，
所以这篇教程写的就不那么详细了，抱歉！我只将它的关键部分列出，希望皮大客不要再“夸”我了。;-)

    第一部分：在软件启动时的Anti-Debug，它依然使用比较通用的防破解技术，用CREATEFILEA查SICE和TRW。
各位在跟踪时要根椐你的调试器进行选择性的修改，不能将所有的CREATEFILEA后面的JZ都改成JMP。这点一定要注意。

==============================================================================
016F:00D821B8 5C 5C 2E 5C 53 49 43 45-00 00 00 00 70 54 54 00 \\.\SICE....pTT.
==============================================================================
0167:004961CB 50 PUSH EAX
0167:004961CC E8530BF7FF CALL KERNEL32!CreateFileA ;防SICE。
0167:004961D1 83F8FF CMP EAX,-01
0167:004961D4 740C JZ 004961E2
0167:004961D6 50 PUSH EAX
0167:004961D7 E8300BF7FF CALL KERNEL32!CloseHandle
0167:004961DC C645FA01 MOV BYTE PTR [EBP-06],01
0167:004961E0 EB6D JMP 0049624F
0167:004961E2 8D45F0 LEA EAX,[EBP-10]
0167:004961E5 BA30634900 MOV EDX,00496330
0167:004961EA E8D1DBF6FF CALL 00403DC0
0167:004961EF 8D45F0 LEA EAX,[EBP-10]
0167:004961F2 E84DC3FCFF CALL 00462544
0167:004961F7 6A00 PUSH 00
0167:004961F9 6880000000 PUSH 00000080 \

==============================================================================
016F:00D821A8 5C 5C 2E 5C 54 52 57 00-70 54 54 00 70 54 54 00 \\.\TRW.pTT.pTT.
==============================================================================
0167:004961F9 6880000000 PUSH 00000080
0167:004961FE 6A03 PUSH 03
0167:00496200 6A00 PUSH 00
0167:00496202 6A01 PUSH 01
0167:00496204 6800000080 PUSH 80000000
0167:00496209 8B45F0 MOV EAX,[EBP-10]
0167:0049620C E85BDFF6FF CALL 0040416C
0167:00496211 50 PUSH EAX
0167:00496212 E80D0BF7FF CALL KERNEL32!CreateFileA ;防TRW
0167:00496217 83F8FF CMP EAX,-01
0167:0049621A 740C JZ 00496228
0167:0049621C 50 PUSH EAX
0167:0049621D E8EA0AF7FF CALL KERNEL32!CloseHandle
0167:00496222 C645FA01 MOV BYTE PTR [EBP-06],01
0167:00496226 EB27 JMP 0049624F
0167:00496228 33C0 XOR EAX,EAX
0167:0049622A 55 PUSH EBP
0167:0049622B 6845624900 PUSH 00496245
0167:00496230 64FF30 PUSH DWORD PTR FS:[EAX]
0167:00496233 648920 MOV FS:[EAX],ESP
0167:00496236 CC INT 3
0167:00496237 C645FA01 MOV BYTE PTR [EBP-06],01
                                         .
.
.
0167:00496289 68F8634900 PUSH 004963F8
0167:0049628E FF75F0 PUSH DWORD PTR [EBP-10]
0167:00496291 8D45E4 LEA EAX,[EBP-1C]
0167:00496294 BA04000000 MOV EDX,00000004
0167:00496299 E8CADDF6FF CALL 00404068
0167:0049629E 8B45E4 MOV EAX,[EBP-1C]
0167:004962A1 668B0DF4624900 MOV CX,[004962F4]
0167:004962A8 B201 MOV DL,01
0167:004962AA E8693E0A00 CALL 0053A118 ;这里将显示第二个Error.
0167:004962AF C645FB01 MOV BYTE PTR [EBP-05],01
0167:004962B3 E8D8440A00 CALL 0053A790
0167:004962B8 E85B370300 CALL 004C9A18
0167:004962BD 807DFB00 CMP BYTE PTR [EBP-05],00
0167:004962C1 7408 JZ 004962CB
0167:004962C3 8B45FC MOV EAX,[EBP-04]

第二部分：在进入软件后还有防跟踪技术，这次用的是_lcreat防SICE和TRW，其实和第一部分是一样的
只是用的API不一样。用这个API我也是第一次见到。
==============================================================================
016F:00D4B47C 5C 5C 2E 5C 73 69 63 65-00 00 00 00 26 00 00 00 \\.\sice....&...
==============================================================================
0167:0049CF20 50 PUSH EAX
0167:0049CF21 E866A0F6FF CALL KERNEL32!_lcreat ;用_lcreat防SICE
0167:0049CF26 83F8FF CMP EAX,-01
0167:0049CF29 740A JZ 0049CF35
0167:0049CF2B 50 PUSH EAX
0167:0049CF2C E853A0F6FF CALL KERNEL32!_lclose
0167:0049CF31 B301 MOV BL,01
0167:0049CF33 EB32 JMP 0049CF67
0167:0049CF35 8D45FC LEA EAX,[EBP-04]
0167:0049CF38 BA60D14900 MOV EDX,0049D160
0167:0049CF3D E87E6EF6FF CALL 00403DC0
0167:0049CF42 8D45FC LEA EAX,[EBP-04]
0167:0049CF45 E8FA55FCFF CALL 00462544
0167:0049CF4A 6A01 PUSH 01
0167:0049CF4C 8B45FC MOV EAX,[EBP-04]

=============================================================================
016F:00DE3B14 5C 5C 2E 5C 74 72 77 00-3E 01 00 00 60 2C 42 00 \\.\trw.>...`,B.
=============================================================================
0167:0049CF54 50 PUSH EAX
0167:0049CF55 E832A0F6FF CALL KERNEL32!_lcreat ;用_lcreat防TRW
0167:0049CF5A 83F8FF CMP EAX,-01
0167:0049CF5D EB08 JMP 0049CF67
0167:0049CF5F 50 PUSH EAX
0167:0049CF60 E81FA0F6FF CALL KERNEL32!_lclose
0167:0049CF65 B301 MOV BL,01
0167:0049CF67 84DB TEST BL,BL
0167:0049CF69 740C JZ 0049CF77
0167:0049CF6B A164415400 MOV EAX,[00544164]
0167:0049CF70 8B00 MOV EAX,[EAX]
0167:0049CF72 E80538FBFF CALL 0045077C
0167:0049CF77 80BE772E000000 CMP BYTE PTR [ESI+00002E77],00
0167:0049CF7E E9EF000000 JMP 0049D072
0167:0049CF83 90 NOP

                 如果哪位想转载本文，请保持文章的完整性！

                                                                               gfh
2001.4.29


Crunch v1.1

标 题:Crunch v1.1中的一段有趣的反跟踪代码 (5千字)
发信人:ljtt
时 间:2001-4-8 11:38:49
详细信息:
欢迎有空光临小站：http://go1.163.com/~st0ne/
『技术研习』 『以前更新』

--------------------------------------------------------------------------------

Crunch v1.1中的一段有趣的反跟踪代码

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
这是在对Crunch.EXE脱壳时发现的一点有趣的东西，就写了出来。其中利用一种特殊的方法---修改LDT表来进入Ring0级，然后在Ring0级检测Test_Debug_Installed标志来判断当前是否有调试器跟踪，这种反跟踪方法不用区别调试器的类型。SoftICE、TRW2000、天意都可以检测到，怎么样？有点意思吧。不过如果你要对付这种外壳加密软件的话，就要小心一点了，别被当得死死的哦。:-)

作者： ljttt
写作日期： 2000-10-02

1、前面的大部分分析过程同《对Crunch v1.1加壳程序的手动脱壳及反跟踪代码的一点分析》一文中所述，这里就不多说了。

2、跟踪到如下代码处，我们的目标开始了！
015F:0066C266 53 PUSH EBX
015F:0066C267 E8C9100000 CALL 0066D335
015F:0066C26C 5B POP EBX
015F:0066C26D 899D683C0000 MOV [EBP+00003C68],EBX
015F:0066C273 BB76060000 MOV EBX,00000676
015F:0066C278 03DD ADD EBX,EBP
015F:0066C27A 899D643C0000 MOV [EBP+00003C64],EBX
015F:0066C280 BB050A0000 MOV EBX,00000A05
015F:0066C285 03DD ADD EBX,EBP
015F:0066C287 FFD3 CALL EBX <--内有反跟踪代码
015F:0066C289 90 NOP
015F:0066C28A 60 PUSHAD
015F:0066C28B BB85230000 MOV EBX,00002385
015F:0066C290 03DD ADD EBX,EBP
015F:0066C292 53 PUSH EBX
015F:0066C293 FF950A210000 CALL [EBP+0000210A]
015F:0066C299 8985F6160000 MOV [EBP+000016F6],EAX

3、在 CALL EBX 处按F8键进入看看
015F:0066C9FF FFA56C3C0000 JMP [EBP+00003C6C]
015F:0066CA05 8CD8 MOV AX,DS
015F:0066CA07 A804 TEST AL,04
015F:0066CA09 740F JZ 0066CA1A
015F:0066CA0B 8DB51B0A0000 LEA ESI,[EBP+00000A1B] <--ESI=0066CA1B（这是检测程序入口的地址
015F:0066CA11 BB460A0000 MOV EBX,00000A46
015F:0066CA16 03DD ADD EBX,EBP <--EBX
015F:0066CA18 FFD3 CALL EBX <--还要继续深入
015F:0066CA1A C3 RET

4、在 CALL EBX 处我们继续按F8键进入看看，这样我们就到了关键处
015F:0066CA46 60 PUSHAD
015F:0066CA47 53 PUSH EBX <--这里实际上是为了留出空间保存GDTR的内容
015F:0066CA48 0F014424FE SGDT FWORD PTR [ESP-02] <--获取GDTR的内容（6个字节）
015F:0066CA4D 5B POP EBX <--EBX=GDTR的4个字节的内容，实际上就是GDT的基地址
015F:0066CA4E 33C0 XOR EAX,EAX <--EAX=0
015F:0066CA50 0F00C0 SLDT AX <--获取LDT表的选择器到 AX 中
015F:0066CA53 24F8 AND AL,F8 <--限定AL大小
015F:0066CA55 03D8 ADD EBX,EAX <--获取LDT表在GDT表中的偏移地址
015F:0066CA57 8A6B07 MOV CH,[EBX+07] <--获取第8个字节
015F:0066CA5A 8A4B04 MOV CL,[EBX+04] <--获取第5个字节
015F:0066CA5D C1E110 SHL ECX,10 <--移动到高位
015F:0066CA60 668B4B02 MOV CX,[EBX+02] <--获取第3-4两个字节，此时ECX组合成为LDT表的基地址
015F:0066CA64 8D7908 LEA EDI,[ECX+08] <--获取LDT表第9个字节偏移地址指针
015F:0066CA67 FC CLD
015F:0066CA68 8BC6 MOV EAX,ESI <--EAX=ESI=0066CA1B
015F:0066CA6A 66AB STOSW <--保存两个字节，即CA1B到EDI指向的地址
015F:0066CA6C B8280000EC MOV EAX,EC000028 <--EAX=EC000028
015F:0066CA71 AB STOSD <--保存四个字节，即EC000028到EDI+2指向的地址
015F:0066CA72 0FA4F010 SHLD EAX,ESI,10 <--把ESI=0066CA1B进行移位，得到0066
015F:0066CA76 66AB STOSW <--保存两个字节，即0066到EDI+6指向的地址
015F:0066CA78 61 POPAD <--以上这些指令为了形成LDTR，使之指向0066CA1B，为以下的调用作准备
015F:0066CA79 9A000000000F00 CALL 000F:00000000 <--该调用实际上指向的015F:0066CA1B处
015F:0066CA80 C3 RET

5、我们在 CALL 000F:00000000 处按F8键继续跟踪分析
015F:0066CA1B 60 PUSHAD
015F:0066CA1C 33C0 XOR EAX,EAX
015F:0066CA1E BF3B0A0000 MOV EDI,00000A3B
015F:0066CA23 03FD ADD EDI,EBP
015F:0066CA25 CD20 INT 20 VXDCall Get_DDB <--判断DDB
015F:0066CA2B 7502 JNZ 0066CA2F <--关键了！
015F:0066CA2D CD19 INT 19 <--超度
015F:0066CA2F CD20 INT 20 VXDCall Test_Debug_Installed <--判断是否安装了调试环境
015F:0066CA35 7402 JZ 0066CA39 <--关键了！
015F:0066CA37 CD19 INT 19
015F:0066CA39 61 POPAD
015F:0066CA3A CB RETF

【后记】
这种检测跟踪的方法比较新鲜（对我来说^_^）。我想这种方法可以检测调试环境，比单纯的检测SoftICE跟踪来得更有意思。

--------------------------------------------------------------------------------

《加密及解密技术交流站》由 ljtt 制作 版权所有
&copy;2000 -2001 All Rights Reserved

转载本站所有文章请注明出处，尊重作者的劳动也是尊重你自己。让我们一同撑起绿色的天空！


Acrobat Reader 5.0

 标 题:Acrobat Reader 5.0的反跟踪代码部分 (5千字)
发信人:garfield[CCG]
时 间:2001-8-14 16:54:56
详细信息:
Acrobat Reader 5.0的反跟踪代码部分

HI，大家好！已经很久没有帖东西了！由于比较忙！（其实是懒^_^）！
今天想用Acrobat Reader 5.0看看书！没想到启动后显示了一个位图，做一些初使化后就不见了踪影！一连试了几次！嗯？？我的机子不会烂到连这个软件都不能运行的地步吧！想了想。。。。。噢！是不是又是SICE在捣鬼！由于我平时总喜欢挂着它！总会引起一些不必要的麻烦！唉！没办法，运行frogsice挡一挡吧！咦！我倒~~~~~~~~不管用！气死我了！追追它！看来是怎么发现我的宝贝的！

经过一番跟踪，发现反SICE的代码在DocBox.api这个插件中！

好吧。继续...........

:37020654 0F014DD6 sidt [ebp-2A] *********
:37020658 8A45CC mov al, byte ptr [ebp-34]
:3702065B 84C0 test al, al
:3702065D 0F84D8430100 je 37034A3B

:37034A3B 33C0 xor eax, eax
:37034A3D 8B55D0 mov edx, dword ptr [ebp-30]
:37034A40 397A20 cmp dword ptr [edx+20], edi
:37034A43 0F95C0 setne al
:37034A46 3BC7 cmp eax, edi
:37034A48 740A je 37034A54
:37034A4A 6A02 push 00000002
:37034A4C E8DE9FFDFF call 3700EA2F
:37034A51 83C404 add esp, 00000004
:37034A54 33C0 xor eax, eax
:37034A56 8B4DD8 mov ecx, dword ptr [ebp-28] 得到中断描述符表的基地址
:37034A59 668B5144 mov dx, word ptr [ecx+44] 得到偏移值为44h(68d)的两个字节
:37034A5D 6681F20005 xor dx, 0500
:37034A62 F6C61F test dh, 1F
:37034A65 7505 jne 37034A6C
:37034A67 B801000000 mov eax, 00000001
:37034A6C 3BC7 cmp eax, edi
:37034A6E 740A je 37034A7A
:37034A70 6A03 push 00000003
:37034A72 E8B89FFDFF call 3700EA2F
:37034A77 83C404 add esp, 00000004

当在读取中断描述符表偏移值为44h的两个字节时，值为8500h!不管它，继续跟下去！已经离死不远了！F10带过call 3700EA2F时！就退出程序了！里面调用了EXITPROCESS！那么只有向上找找看了！
其实有经验的人早就应该知道！在执行SIDT这条命令的时候，就应该和咱们的目标不远了！一般的程序不可能用到这个指令！TEST指令后，强制跳跃！避开那个CALL指令后来到了下面

.........
:37034AE1 6A03 push 00000003
:37034AE3 53 push ebx
:37034AE4 53 push ebx
:37034AE5 53 push ebx
:37034AE6 8B4D8C mov ecx, dword ptr [ebp-74]
:37034AE9 51 push ecx <== //./SICE
:37034AEA FF1524210537 call dword ptr [37052124] <===CreateFilea
:37034AF0 8BF0 mov esi, eax
:37034AF2 8B558C mov edx, dword ptr [ebp-74]
:37034AF5 85D2 test edx, edx
:37034AF7 7433 je 37034B2C
:37034AF9 8BFA mov edi, edx
:37034AFB 83C9FF or ecx, FFFFFFFF
:37034AFE 33C0 xor eax, eax
:37034B00 F2 repnz
:37034B01 AE scasb
:37034B02 F7D1 not ecx
:37034B04 49 dec ecx
:37034B05 B85A7DBDBC mov eax, BCBD7D5A
:37034B0A 8D80623FFFFF lea eax, dword ptr [eax+FFFF3F62]
:37034B10 8BFA mov edi, edx
:37034B12 8BD1 mov edx, ecx
:37034B14 C1E902 shr ecx, 02
:37034B17 F3 repz
:37034B18 AB stosd
:37034B19 8BCA mov ecx, edx
:37034B1B 83E103 and ecx, 00000003
:37034B1E F3 repz
:37034B1F AA stosb
:37034B20 8B458C mov eax, dword ptr [ebp-74]
:37034B23 50 push eax
:37034B24 E810030000 call 37034E39
:37034B29 83C404 add esp, 00000004
:37034B2C 83FEFF cmp esi, FFFFFFFF <======R U OK?
:37034B2F 740C je 37034B3D <==jump is OK!
:37034B31 56 push esi

* Reference To: KERNEL32.CloseHandle, Ord:001Bh
|
:37034B32 FF156C330637 Call dword ptr [3706336C]
:37034B38 BBCA104000 mov ebx, 004010CA
:37034B3D 85DB test ebx, ebx
大家已经看到了！这又是一个检测SICE的方法！也是最常用的！但如果你直接用CREATEFILEA来设断拦截是没用的！这个程序是用GETPROCADDRESS来找入口地址来调用的！玩了一个小把戏！有些病毒就是这么做的！

好了，到此也就差不多了！剩下的事就简单了！改改它就OK了！可有个问题还不清楚！读中断描术符表第68的两个字节有什么用？？问我？？我也不清楚！请高手明示吧！！！！！！

.386
.model flat, stdcall
option casemap :none
include /masm32/include/windows.inc
include /masm32/include/user32.inc
includelib /masm32/lib/user32.lib
include /masm32/include/kernel32.inc
includelib /masm32/lib/kernel32.lib
.data
format db "%x",0
.data?
char db 4 dup(?)
.code
start:
sidt [esp-2]
pop eax
xor ebx,ebx
mov bx,word ptr [eax+44h]
invoke wsprintf,addr char,addr format,ebx
invoke MessageBox,0,addr char,0,MB_OK
invoke ExitProcess,0
end start

不过我做了个实验：用MASM32编了上面的程序！来实现读出IDT的第68处的两个字节！我试过了，在没挂SICE的情况下是8E00h,在挂SICE的情况下是8500h！难不成这是SICE驻留的标志？？有意思！！请哪位高手回答一下吧！

全文完！

garfield
China Cracking Group
2001.8.14


保护机制小窥

 标 题:保护机制小窥 ---- 十三少不妨来看看
发信人:ljttt
时 间:2000-12-3 18:00:31
详细信息:
保护机制小窥

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
这次以介绍保护机制为主，就不写什么脱壳方法了，其实以前我也误导了不少善良的观众。了解一个加壳软件最主要的应该是了解其保护机制，这也是我后来才领悟的一点。以下介绍的一点保护机制的知识。这里只为了让大家和我一起来共同学习和了解保护机制的知识。

水货作者： ljttt
出厂日期： 2001-01-01 (水货的东东一般都这样写出厂日期的)

①、首先，我们来看个比较简单的自身保护方法。这段代码如下：

0040CC54: 03F3 add esi,ebx <--esi指向某段代码，ecx为代码的长度(DWORD)
0040CC56: 8B06 mov eax,dword ptr [esi] <--取出代码中的 4 个字节
0040CC58: 33D0 xor edx,eax <--XOR异或
0040CC5A: F7D2 not edx <--取反
0040CC5C: 33D1 xor edx,ecx <--与ecx(代码长度)异或
0040CC5E: 03D0 add edx,eax <--与代码中的 4 个字节相加
0040CC60: 83C604 add esi,00000004 <--定位到代码中的下 4 个字节
0040CC63: 49 dec ecx <--代码长度减一
0040CC64: 75F0 jnz 0040CC56 <--循环

先来描述一下这段代码的功能：可以看到这段代码用 ESI 作为指针，用 ECX 保存长度。把 ESI 指向的数据进行异或取反，最后在 EDX 中得到一个“值”。

那么它和自身保护有什么联系呢？我来简单说一下，如果 ESI = 0040CC54， ECX = 0040CC64 - 0040CC54。那么这段代码是不是就是把自身的代码进行运算（异或取反）呢？ OK ！

那么如果你这段代码中间设下一个断点，会有什么变化呢？运算得到的“值”会和原来未设断时的相同吗？

我们以SoftICE来简单介绍一下吧。当你在SoftICE的调试环境下，设下一个断点时，那么这个断点所在的代码的第一个字节就会变成 0xCC。
这样由于设下断点，代码就被改变了，那么运算的“值”就和未设断时不一样了。你可能想到有了这个值，就可以用比较的方法来判断是否自身是否被设下断点了。不错，这是一种方法，但是这很容易被......在加壳软件中，一般会把这个“值”作为还原密匙，来还原下一段代码。
也就是所谓的 SMC 技巧来还原代码。

（但是如果你在SoftICE中用 D 指令来显示这行代码，却没有发现变化。呵呵，但是，如果你再启动另一个调试器TRW2000，来显示这行代码，再看看？呵呵，明白了吗？）

②、SMC技巧来还原代码。
在加壳软件中，分段还原代码是一种很普遍的方法了。也许你有过这样的经历。（怎么，弄得象散文了？！）你跟踪过某个软件，发现了某段代码，比如 CPUID （相应的十六进制代码为 0x0F 0xA2）。却发现当你用十六进制编辑软件来查找 0x0F 0xA2 时，却怎么也找不到，Why？

其实道理很简单，就是在程序的可执行文件中保存的是加密了的数据，只有程序在运行时才会由程序在某处由一段还原代码来解密这段加密数据，（还原后的数据就是你在调试器中可以“看”到的真实的代码）。然后，程序才执行这段还原后的代码。现在你清楚了吧！比如象 ① 中 介绍的那段代码是用来形成还原密匙的，只有密匙正确时，也就是说它先四下“打量”一下，当“发现”自身没有被修改（或者被设下断点）时，才“悄悄地”还原出另一段被加密了的代码。然后继续！
有点意思吧！在加壳软件中，如果它“想”保护某段代码，就会加密它，然后在程序运行时用另一段代码形成密匙来还原它！这样就防止你静态分析它，当然为了防止你用动态跟踪的方法，所以它还结合了 ① 中介绍的自身保护方法。这样，如果你误入陷阱（在其自身保护的某处设下了一个断点），那么还原出的代码就是一堆垃圾代码。如果这样，你可不要写信给作者，说他程序编得有问题哦？！

（当然 SMC 技巧可以被用作多种用途。不要大家有先入为主的概念，SMC的技巧既可以被加壳软件用作自身保护的一种方法，也可以被Cracker作为一种破解的方法，所以......怎么用，还在于你！......你想用来编“病毒”.....老天，为什么天才总有点反叛因子！）

前面介绍了简单的自身保护技巧，也许你早就想好了对付它的方法，比如：
不设任何断点，用单步跟踪的方法
或者先跟踪一次记下正确的密匙，下次跟踪时任意设断，只在它取密匙时“给”个正确的给它。
或者用 BPM 断点只跟踪数据、不跟踪代码的方法进行动态跟踪。
你还可以想得更多。。。。

当然，为了更好地保护自身，所以在加壳软件中也不会只是这么简单地保护自己，你猜加壳软件中又会用到什么保护方法可以防止以上方法呢？

③、一种反跟踪方法：API调用的变形。
你也许喜欢首先在某个关键的API函数处设断，然后才进入程序代码中进行跟踪。但是在加壳软件中这种方法可就要小心了。
我们来看看这段代码：

015F:00411B6A 33C0 XOR EAX,EAX <--ESI指向API函数地址的入口，如CreateFileA( )
015F:00411B6C AC LODSB <--获取一个字节
015F:00411B6D 3C50 CMP AL,50 <--判断是否为 50
015F:00411B6F 720F JB 00411B80 <--小于 50 ，则跳转到 00411B80
015F:00411B71 3C57 CMP AL,57 <--判断是否为 57
015F:00411B73 770B JA 00411B80 <--大于 57 ，则跳转到 00411B80
......
015F:00411BD3 897A01 MOV [EDX+01],EDI
015F:00411BD6 8B831F7B0000 MOV EAX,[EBX+00007B1F]
015F:00411BDC 8B8B237B0000 MOV ECX,[EBX+00007B23]
015F:00411BE2 8B93277B0000 MOV EDX,[EBX+00007B27]
015F:00411BE8 8BBB3B7B0000 MOV EDI,[EBX+00007B3B]
015F:00411BEE 8BB3377B0000 MOV ESI,[EBX+00007B37]
015F:00411BF4 8BAB337B0000 MOV EBP,[EBX+00007B33]
015F:00411BFA 8B9B2B7B0000 MOV EBX,[EBX+00007B2B]
015F:00411C00 E900000000 JMP 00411C05 <--此处的跳转将被修改为API函数地址内的一条指令处

（说明：进入这段代码时，ESI指向了某个 API 函数的入口地址，ESP指向的堆栈中压入了该 API 函数需要的各个参数。由于代码较长，没有完整列出）

以上这段代码的作用，就是通过分析（或者说反汇编） API 函数开始的部分代码，然后把这部分代码“复制”到自己的进程空间中执行后，再进入该 API 函数的内部某处代码继续执行 API 函数。

这样，当你在此 API 函数入口处（比如： bpx CreateFileA）设断时，就会“拦”不到它，为什么？因为，它不从 API 函数入口处执行。而是绕了个弯从“侧门”进入的。瞧，加壳软件多有意思！也许，这时你会想，那么就在 API 函数的内部某处代码设断不就行了吗？你要小心，加壳软件有善良的，也有喜欢“恶作剧”的，它通过分析 API 函数开始部分的代码，一方面进行“反汇编”，另一方面，如果你在它分析的代码中设下了断点时，也可能他会痛下杀手，因为断点的代码为 0xCC，它可不喜欢在 API 函数中出现这种指令。如果你由此当机了..........

④、反动态跟踪的方法。
当然，加壳软件也可能不只是把眼光放在防范你设断点，也可能直接就把“眼光”放在防范调试状态上了。比如最直接的就是检测你的当前环境中是否加载了调试器或者是某些工具软件。比如：

This method is most known as 'MeltICE' because it has been freely distributed
via www.winfiles.com. However it was first used by NuMega people to allow Symbol
Loader to check if SoftICE was active or not (the code is located inside nmtrans.dll).

The way it works is very simple:
It tries to open SoftICE drivers handles (SICE, SIWVID for Win9x, NTICE for WinNT)
with the CreateFileA API.

Here is a sample (checking for 'SICE'):

BOOL IsSoftIce95Loaded()
{
HANDLE hFile;
hFile = CreateFile( "\\\\.\\SICE", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile != INVALID_HANDLE_VALUE )
{
CloseHandle(hFile);
return TRUE;
}
return FALSE;
}

以上是摘自FrogsICE的文档。利用 CreateFile( ) 打开一些特殊的“文件”，如果返回值不是 -1，它就可以“发现”加载了SoftICE。当然这种方法由于可以在WIN98/NT下通用，所以很常见。
类似的，如果你把检测的字符串 \\.\SICE 改成
\\.\NTICE 检测NT下的SoftICE
\\.\FILEMON 检测FileMon
\\.\REGMON 检测RegMon
\\.\TRW 检测Trw
\\.\TRWDEBUG 检测Trw
\\.\ICEDUMP 检测IceDump
就可以“发现”其他的跟踪了。

另一种常见的检测SoftICE的方法如下，同样摘自FrogsICE的文档。

* * SOFTICE SHOULD NOT BE LOADED SO THAT FROGSICE CAN DETECT THIS METHOD * *

This method of detection of SoftICE (as well as the following one) is
used by the majority of packers/encryptors found on Internet.
It seeks the signature of BoundsChecker in SoftICE

mov ebp, 04243484Bh ; 'BCHK'
mov ax, 04h
int 3
cmp al,4
jnz SoftICE_Detected

其实检测SoftICE方法有很多，在 FrogsICE 的文档中介绍了一些，这里的介绍只是窥其一斑而已。如果你有最“新”的反跟踪方法，可一定要通知我哦。^_^

⑤、自身保护和反动态跟踪相结合：
最后我们来看看这段代码：

015F:0040DDD8 01FF ADD EDI,EDI
015F:0040DDDA C783CB18000090010000MOV DWORD PTR [EBX+000018CB],00000190
015F:0040DDE4 8BEB MOV EBP,EBX
015F:0040DDE6 BA561E0000 MOV EDX,00001E56
015F:0040DDEB 03D3 ADD EDX,EBX
015F:0040DDED 52 PUSH EDX
015F:0040DDEE 6467FF360000 PUSH DWORD PTR FS:[0000] <--SEH
015F:0040DDF4 646789260000 MOV FS:[0000],ESP <--SEH
015F:0040DDFA 89A3A3760000 MOV [EBX+000076A3],ESP
015F:0040DE00 BECD1E0000 MOV ESI,00001ECD
015F:0040DE05 03F3 ADD ESI,EBX
015F:0040DE07 8BFE MOV EDI,ESI <--EDI=40DECD
015F:0040DE09 B90F0A0000 MOV ECX,00000A0F <--ECX=0xA0F,ECX保存的是循环次数
015F:0040DE0E 8B93FC760000 MOV EDX,[EBX+000076FC]

;--------------------------------------------------------------------------------------------------
;以下这一段代码同 1 中介绍的代码类似。
;也就是把代码段 ( 015F:40D8E6 - 015F: 40DECA ) 之间的代码和 EDX 的初始值进行运算来形成一个“密匙”
;结果仍然保存在 EDX 中。
;--------------------------------------------------------------------------------------------------
015F:0040DE14 56 PUSH ESI <--循环开始处
015F:0040DE15 51 PUSH ECX <--入栈保存，ECX保存的是循环的次数=A0F。
015F:0040DE16 B979010000 MOV ECX,00000179
015F:0040DE1B BEE6180000 MOV ESI,000018E6
015F:0040DE20 03F3 ADD ESI,EBX <--ESI=40C000+18E6=40D8E6。（40C000是程序入口）
015F:0040DE22 8B06 MOV EAX,[ESI] <--取代码中的 4 个字节
015F:0040DE24 33D0 XOR EDX,EAX
015F:0040DE26 33D1 XOR EDX,ECX
015F:0040DE28 83C604 ADD ESI,04
015F:0040DE2B 49 DEC ECX <--循环次数减一，ECX初始值为179
015F:0040DE2C 75F4 JNZ 0040DE22 <--这一段是和前面介绍的相同的方法进行自身保护
015F:0040DE2E 59 POP ECX <--出栈
015F:0040DE2F 5E POP ESI <--出栈
;--------------------------------------------------------------------------------------------------
;这段代码用 EDX 中的“密匙”来还原 EDI 指向中的被加密了的代码,EDI初始值为 40DECD
;--------------------------------------------------------------------------------------------------
015F:0040DE30 AD LODSD
015F:0040DE31 33C2 XOR EAX,EDX
015F:0040DE33 AB STOSD
;--------------------------------------------------------------------------------------------------
;这段代码用来进行反跟踪
;--------------------------------------------------------------------------------------------------
015F:0040DE34 0F018BA57A0000 SIDT FWORD PTR [EBX+00007AA5] <--取IDTR的内容
015F:0040DE3B 8BB3A77A0000 MOV ESI,[EBX+00007AA7] <--取IDT表基地址
015F:0040DE41 894E08 MOV [ESI+08],ECX <--修改 int 1 的处理程序地址为 ECX，让你死翘翘。
;--------------------------------------------------------------------------------------------------
;把“密匙”进行变换。
;--------------------------------------------------------------------------------------------------
015F:0040DE44 3393521E0000 XOR EDX,[EBX+00001E52]
015F:0040DE4A 8BF7 MOV ESI,EDI
015F:0040DE4C EB70 JMP 0040DEBE
......（省略）
015F:0040DEBE FF834E1E0000 INC DWORD PTR [EBX+00001E4E]
015F:0040DEC4 33D1 XOR EDX,ECX
;--------------------------------------------------------------------------------------------------
; 判断循环是否结束，即此时后面的所有被加密的代码都已经被还原
;--------------------------------------------------------------------------------------------------
015F:0040DEC6 49 DEC ECX <--循环次数减一，ECX初始值为A0F
015F:0040DEC7 0F8547FFFFFF JNZ 0040DE14 <--循环结束处
015F:0040DECD 5F POP EDI <--被加密了的代码
015F:0040DECE 44 INC ESP <--未还原的代码

这段代码比较长，所以要看懂它得花点时间。这是一种把“反动态跟踪”和“自身保护”结合的一种方法。
可以看到 015F:0040DECD 之后的代码已经被加密了，这段代码就是用来还原被加密了的代码的。当这段代码循环结束后，后面的被加密了的代码就已经还原出来了，这就是 SMC 技巧的应用。在这段代码中“密匙”是由前面所有的代码来运算得到的。并且每循环一次就变换一次。这就是 1 中介绍的自身保护。防止你修改它的代码或者设下断点跟踪。
另外，程序中还加入了一种“反动态跟踪”的方法，就是修改了 单步中断 的中断处理程序的地址。这样，你的跟踪环境就被破坏了。

015F:0040DE34 0F018BA57A0000 SIDT FWORD PTR [EBX+00007AA5] <--取IDTR的内容
015F:0040DE3B 8BB3A77A0000 MOV ESI,[EBX+00007AA7] <--取IDT表基地址
015F:0040DE41 894E08 MOV [ESI+08],ECX <--修改 int 1 的处理程序地址为 ECX，让你死翘翘。

这就是加壳软件的特点，攻防结合。所以一不小心，你就可能落入了它设下的陷阱，见到了“如来佛”。所以为了防止被它送到西天。你就得下点功夫，了解自身保护、反跟踪的特点和技巧。加壳软件一般就是这样一个陷阱重重的地方。当然加壳软件的保护机制也有它的弱点，只要你的程序指令机器“读”得懂，那么动态跟踪不行，就有静态分析，或者动静结合。所以才会各种相应的脱壳机的出现。当然这是一个“矛”和“盾”的关系，孰强孰弱，我想关键在于运用得当和推陈出新。比如，我常会结合MD5/RSA/BLOWFISH等加密算法进行注册码计算，怎么样？！哈哈，然后用IF指令进行注册判断！？...................

【后记】
由于这些保护机制的方法出现的频率比较多，所以介绍一下也无妨。其实，这些东西很早就有了。但是对于生产水货的我，常常喜欢来点新瓶装旧酒。另外，我对ANTI-DEBUG了解得还不全面，也希望能够抛砖引玉，能引出更多的高手，让大家来进行打假。

【有个问题】
最近上网，总是拔不上来。
后来我打开了"拔号号出现终端窗口"的功能，发现拔号后会出现两种提示。比如：
Welcome to xxx xxx !
Welcome to yyy yyy !
如果出现第一种，那么我总是拔不上来，即使正常的密码也上不来，会出现而如果出现第二种提示，那么我总能拔上来。真奇怪！这会是什么原因？最近，上网实在是件痛苦的事件，总是很难拔上来，一般只有到0：00点以后才会正常。


检测debugger的方法补遗

 标 题:检测debugger的方法补遗 (4千字)
发信人:blowfish
时 间:2001-6-28 17:12:34
详细信息:
 还是这个论坛对源码格式处理得比较好

下面这几个都是利用的WinNT的native API来检查debugger的，所以不能运行在Win9x/ME上。

1、ZwQuerySystemInformation
用这个可以检查系统调试器是否存在，对SoftICE似乎无用，估计只对微软自家的WinDBG有效，有条件的可测试一下。

2、ZwSetInformationThread
用这个函数可以将某个线程的调试端口设为0，使得Win32调试器无法再收到该线程的调试事件，使调试器无法再调试该线程。这个主要是针对VC++这样的ring3调试器的。

3、ZwQueryInformationProcess
这个可以检查某个进程是否正被ring3调试器所调试。

测试程序：

#include <windows.h>
#include <iostream.h>

#define NTAPI              __stdcall
typedef long              NTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_SUCCESS    ((NTSTATUS)0L)

typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION
{
BOOLEAN DebuggerEnabled;
BOOLEAN DebuggerNotPresent;
} SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION;

typedef struct _PROCESS_DEBUG_PORT_INFO
{
HANDLE DebugPort;
}    PROCESS_DEBUG_PORT_INFO;

enum SYSTEM_INFORMATION_CLASS { SystemKernelDebuggerInformation = 35 };
enum THREAD_INFO_CLASS        { ThreadHideFromDebugger
          = 17 };
enum PROCESS_INFO_CLASS      { ProcessDebugPort
              = 7  };

typedef NTSTATUS  (NTAPI *ZW_QUERY_SYSTEM_INFORMATION)(IN SYSTEM_INFORMATION_CLASS
  SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength,
  OUT PULONG ReturnLength);
typedef NTSTATUS  (NTAPI *ZW_SET_INFORMATION_THREAD)(IN HANDLE ThreadHandle,
  IN THREAD_INFO_CLASS ThreadInformationClass, IN PVOID ThreadInformation, IN
  ULONG ThreadInformationLength);
typedef NTSTATUS  (NTAPI *ZW_QUERY_INFORMATION_PROCESS)(IN HANDLE ProcessHandle,
  IN PROCESS_INFO_CLASS ProcessInformationClass, OUT PVOID ProcessInformation,
  IN ULONG ProcessInformationLength, OUT PULONG ReturnLength);

void main( )
{
HMODULE hModule = GetModuleHandle("ntdll.dll");
if (hModule == NULL)
{
cout << "Failed: GetModuleHandle"
  << endl;
cout << "This prog needs WinNT/2K/XP
  to run." << endl;
return;
}

//------------------------------------------------------------------------------------
ZW_QUERY_SYSTEM_INFORMATION ZwQuerySystemInformation;
ZwQuerySystemInformation = (ZW_QUERY_SYSTEM_INFORMATION)GetProcAddress(hModule,
  "ZwQuerySystemInformation");
if (ZwQuerySystemInformation == NULL)
{
cout << "Failed: GetProcAddress
  ZwQuerySystemInformation" << endl;
return;
}

SYSTEM_KERNEL_DEBUGGER_INFORMATION Info;
if (STATUS_SUCCESS == ZwQuerySystemInformation(SystemKernelDebuggerInformation,
  &Info, sizeof(Info), NULL))
{
if (Info.DebuggerEnabled)
{
cout << "System
  debugger enabled" << endl;
if (Info.DebuggerNotPresent)
cout
  << "System debugger not present" << endl;
else
cout
  << "System debugger present" << endl;

}
else
cout << "System
  debugger disabled" << endl;
}
else
{
cout << "Failed: ZwQuerySystemInformation"
  << endl;
}

//---------------------------------------------------------------------------------------

ZW_SET_INFORMATION_THREAD ZwSetInformationThread;
ZwSetInformationThread = (ZW_SET_INFORMATION_THREAD)GetProcAddress(hModule,
  "ZwSetInformationThread");
if (ZwSetInformationThread == NULL)
{
cout << "Failed: GetProcAddress
  ZwSetInformationThread" << endl;
return;
}

if (STATUS_SUCCESS != ZwSetInformationThread(GetCurrentThread(
  ), ThreadHideFromDebugger, NULL, 0))
cout << "Failed: ZwSetInformationThread"
  << endl;

//---------------------------------------------------------------------------------------
ZW_QUERY_INFORMATION_PROCESS ZwQueryInformationProcess;
ZwQueryInformationProcess = (ZW_QUERY_INFORMATION_PROCESS)GetProcAddress(hModule,
  "ZwQueryInformationProcess");
if (ZwQueryInformationProcess == NULL)
{
cout << "Failed: GetProcAddress
  ZwQueryInformationprocess" << endl;
return;
}

PROCESS_DEBUG_PORT_INFO ProcessInfo;
if (STATUS_SUCCESS != ZwQueryInformationProcess(GetCurrentProcess(
  ), ProcessDebugPort, &ProcessInfo, sizeof(ProcessInfo), NULL))
cout << "Failed: ZwQueryInformationProcess"
  << endl;
else
{
if (ProcessInfo.DebugPort)
cout << "Process
  debugger present" << endl;
else
cout << "Process
  debugger not present" << endl;
}

}


利用SEH改变程序流程以达到反跟踪的目的

 标 题:利用SEH改变程序流程以达到反跟踪的目的 (1千字)
发信人:blowfish
时 间:2001-6-29 12:00:56
详细信息:
 老东西，在ASProtect中大量使用，主要是想隐藏OEP。当然仅靠这个无法对付冲击波和icedump的/tracex，但这两个都是运行在Win9x下的。

如果用SoftICE跟下面的程序，在执行到REPZ MOVSD指令（在inline函数memcpy的函数体中）时，就会失去线索（petite似乎也是这样）。除了__try{
  }__except，还可以用__try{ } __finally，把这两个结合起来形成多重嵌套可以增加复杂度。

#include <windows.h>
#include <iostream.h>

#define BUFFER_SIZE 4096

void *MemAddr = NULL;
void AccessViolation( );
int  OEP( );
int  Filter( );

int main( )
{
__try
{
//........

AccessViolation( );

//You can insert some garbage code here
}
__except(Filter( ))
{
//You can insert some garbage code here

return OEP( );
}

return 0;
}

void AccessViolation( )
{
MemAddr = VirtualAlloc(NULL, BUFFER_SIZE,
  MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
memcpy(MemAddr, (void *)main, BUFFER_SIZE
  + 5);

cout << "Here is some garbage, which
  will never be executed." << endl;
//You can insert some garbage code here
}

int OEP( )
{
cout << "This is the Original Entry Point." <<
  endl;
return 0;
}

int Filter( )
{
//You can insert some garbage code here

if (MemAddr)
{
VirtualFree(MemAddr, BUFFER_SIZE, MEM_DECOMMIT
  | MEM_RELEASE);
}

//You can insert some garbage code here

return EXCEPTION_EXECUTE_HANDLER;
}


防止loader

 标 题:防止loader的一种技术 (2千字)
发信人:blowfish
时 间:2001-8-19 0:02:02
详细信息:

 通过检查进程的父进程，可以防止loader方式的破解。一般情况下普通Win32进程的父进程是explorer.exe。如果不是，则很可能是被其它loader加载了。

在NT/2K下，可以利用native API获得进程的父进程的PID，进而可获得父进程的程序名。

#include <windows.h>
#include <psapi.h>
#include <iostream.h>

#define NTAPI              __stdcall
typedef long                NTSTATUS;
#define NT_SUCCESS(Status)  (((NTSTATUS)(Status)) >= 0)

enum PROCESS_INFO_CLASS    { ProcessBasicInformation  = 0
    };

typedef struct _PROCESS_BASIC_INFORMATION
{
NTSTATUS  ExitStatus;
ULONG      PebBaseAddress;
ULONG      AffinityMask;
ULONG      BasePriority;
ULONG      UniqueProcessId;
ULONG      InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;

typedef NTSTATUS  (NTAPI *ZW_QUERY_INFORMATION_PROCESS)(IN HANDLE ProcessHandle,
    IN PROCESS_INFO_CLASS ProcessInformationClass, OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength, OUT PULONG ReturnLength);

ULONG GetParentPID(HANDLE hProcess)
{
ULONG ParentPID = (ULONG)(-1);

__try
{
HMODULE hModule = GetModuleHandle("ntdll.dll");
if (! hModule)
__leave;

ZW_QUERY_INFORMATION_PROCESS ZwQueryInformationProcess;
ZwQueryInformationProcess = (ZW_QUERY_INFORMATION_PROCESS)GetProcAddress(hModule,
    "ZwQueryInformationProcess");
if (!ZwQueryInformationProcess)
__leave;

PROCESS_BASIC_INFORMATION ProcessInfo;
NTSTATUS Status = ZwQueryInformationProcess(hProcess,
    ProcessBasicInformation, &ProcessInfo, sizeof(ProcessInfo), NULL);
if (NT_SUCCESS(Status))
{
ParentPID = ProcessInfo.InheritedFromUniqueProcessId;
}
}
__finally
{
//empty
}

return ParentPID;
}

void main(void)
{
LONG ParentPID = GetParentPID(GetCurrentProcess( ));
cout << "Parent PID: " << ParentPID <<
    endl;
HANDLE hParentProcess = OpenProcess(PROCESS_ALL_ACCESS,
    FALSE, ParentPID);
if (hParentProcess)
{
char FileName[MAX_PATH];
DWORD Len = GetModuleFileNameEx(hParentProcess,
    NULL, FileName, MAX_PATH);
if (Len)
{
cout << "Parent
    EXE name: " << FileName << endl;
}
CloseHandle(hParentProcess);
}
}

在NT/2K下，普通Win32进程的父进程还可能是cmd.exe；对于Win32服务进程，其父进程则为service.exe。


物理内存的读写

 标 题:转载：CIH 病毒原理的应用——物理内存的读写 (4千字)
发信人:a.out
时 间:2001-7-2 22:22:26
详细信息:
实现ring0倒不是很难。
如果你不想为此再写一个vxd的话，用CIH的技术吧。
不好意思，俺不懂uixm

转一篇白云黄鹤上的帖子，供参考

【实际当中应这样写函数原型
extern "C" void _stdcall ChangeSectorSize(BYTE SectorSize); 】

---------------------------------------------------
发信人: TBsoft (TBsoft), 信区: Virus
标 题: CIH 病毒原理的应用——物理内存的读写
发信站: 武汉白云黄鹤站 (Fri Mar 12 18:44:00 1999) , 站内信件

大家都很讨厌CIH 病毒，可毛老人家教导我们：“要一分为二地看问题”，
CIH病毒很可怕，但是它使用的某些特殊技术还是可以借鉴的，这样可以做到
变害为利
Windows 95/98应用程序无法直接读写物理内存，如果使用VxD编程，可以
调用VMM功能_MapPhysToLinear将物理地址映射到线性地址再进行修改，但是这
样就必须单独写一个VxD，比较麻烦，那么能不能在应用程序中直接调用VMM功
能呢？一般不能，因为VMM功能要在Ring 0上调用，而一般的应用程序工作在
Ring 3上，那么为什么CIH 病毒能够调用VMM功能呢，CIH病毒使用了一种技术，
采用Intel处理器的中断从Ring 3转到Ring 0，我们完全可以借鉴这种技术来调
用VMM功能，下面的程序演示了如何修改物理内存——以在Windows 95加密程序
中修改加密扇区大小（物理地址0000：0525H）为例：

;****************************************************************************
;* Windows 95加密软件核心模块之一－－磁盘扇区大小修改程序 *
;* *
;* 本程序在Windows 95下修改内存物理地址0000:0525 处的磁盘扇区大小字节， *
;* 为了能够修改物理地址，本程序使用了VMM 功能_MapPhysToLinear将物理地址映射 *
;* 到线性地址进行修改。为了在应用程序中调用VMM 功能，本程序使用了CIH 病毒的 *
;* 原理，使用中断将系统由Ring 3转到Ring 0，然后调用VMM 功能。 *
;* 本程序中的过程ChangeSectorSize在VC中的原型可以写成： *
;* *
;* void _stdcall ChangeSectorSize(BYTE SectorSize); *
;****************************************************************************

.386p

.model flat,stdcall

;修改的中断号，如果本中断号改成3则可以防止Soft-ICE跟踪！

HookExceptionNo EQU 05h

.data
IDTR_1 db 6 dup(0) ;保存中断描述符表寄存器
OldExceptionHook dd 0 ;保存原先的中断入口地址

.code

;修改扇区大小过程

ChangeSectorSize PROC SectorSize:BYTE
push eax
;获取修改的中断的中断描述符（中断门）地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序入口地址
push ebx
lea ebx,NewExceptionHook
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断，转到Ring 0（与CIH 病毒原理相似！）
push ebx
mov bl,byte ptr SectorSize ;扇区大小保存在bl寄存器中
int HookExceptionNo
pop ebx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;修改扇区大小过程结束
sti
pop eax
ret
ChangeSectorSize ENDP

;新的中断处理程序

NewExceptionHook PROC
push eax
push ebx
push ecx
push edx
push esi
;修改扇区大小
push dword ptr 00000000h ;必须为0
push dword ptr 00000001h ;字节数
push dword ptr 00000525h ;物理地址0000:0525
int 20h
dd 0001006ch ;以上两条指令相当于 VMMCall _MapPhysToLinear
pop esi
pop esi
pop esi
mov byte ptr [eax],bl ;修改扇区大小
;中断处理程序结束
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook ENDP

end

本过程可以被C语言调用，编译方法：ml /c /coff w95enc.asm。请用MASM 6.11
以上版本编译，不需要DDK。将编译生成的OBJ文件插入VC的工程中，并在VC程序中写
上函数原型说明，就可以调用了。
本斑竹这几天在集中精力研究CIH病毒，希望能够尽早分析出它的杀除方法。这
段文章算是一个“副产品”吧，有什么意见只管提呀。
好久没有发文章了……

--
天生我才，就做一篇锦绣文章。
风起云涌，就挽一回狂澜巨浪。
成也堂堂！
败也堂堂！

※ 修改:·TBsoft 於 Mar 12 18:45:48 修改本文·[FROM: 210.42.24.31]
※ 来源:·武汉白云黄鹤站 s1000e.whnet.edu.cn·[FROM: 210.42.24.31]


Win9x下Rng0实现

标 题:win9x下ring0的实现(翻译自www.anticracking.sk) (16千字)
发信人:kobe
时 间:2001-1-24 23:14:38
详细信息:
--------------------------------------------------------------------------------
谈谈Ring0的实现
--------------------------------------------------------------------------------

处理器有4个级的优先权：Ring0,Ring1,Ring2,Ring3.

大多数程序运行于Ring3这个级别。Ring3有很多限制，

如： 我们不能读DR（debug-registers,调试寄存器），所有关于 DR的指令都不起作用。（如：mov eax,dr7).

对我们来说当然是优先级越高越好，所以我们要使我们的 程序运行在Ring0.但是只有少数的特殊的程序有Ring0的优先权。

设备驱动程序运行于Ring0,但它的代码可不简单！

所幸，Windows有很多漏洞，特别是Win9X。有很多方法可以将 程序的优先级从Ring3变成Ring0.

这些方法被很多病毒所用， 当然，我们还有更多，更好的用途！

这些方法只适用于Win9X，不适用WinNT。因为WinNT是黑客的主要攻击对象，它的漏洞都添的差不多了。

可以在程序中加入代码 先判断操作系统是否Win9X，若是就可以用了。

如果一定要在 WinNT或Win2K下用Ring0,就要编写设备驱动了。

如果你是admin(管理员)级别的用户，那还有别的方法，但前提是你必须有admin的级别。

对一般用户来说这是个好消息，因为Win下的病毒没那么好编， 那些病毒作者就要费老劲了！

--------------------------------------------------------------------------------

Part I

下面介绍一下改变优先权至Ring0的方法用LDT(Locale Descriptor Table):

这个古老的方法极少被用。这不是最好的方法，但至少比用IDT 好，原因嘛？因为它鲜为人知。 下面是程序范例：

--------------------------------------------------------------------------------
.386p
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
include w32.inc
Extrn SetUnhandledExceptionFilter : PROC

.data

msg1
db "Switch to Ring0 by LDT",0

msg2

db "Ring0 activated",0

gdt_
df 0

call_
dd 00
dw 0Fh

o_gate
.code
dw 0
dw 028h ;segment for RING0
dw 0EC00h
dw 0

Start:

mov eax, offset ring0
;our Ring0 routine
mov [o_gate],ax ;set address of our new Ring0 service to our "callgate" shr eax,16
mov [o_gate+6],ax

xor eax, eax
sgdt fword ptr gdt_
;save GDT mov ebx,dword ptr [gdt_+2] ;GDT base address

sldt
ax

add

ebx,eax

;discriptor address

mov
al,[ebx+4]

mov
ah,[ebx+7]

shl
eax,16
;LDT address

mov ax,[ebx+2] ;callgate's discriptor address

add eax,8

mov edi,eax
;set in callgate for changes

mov esi,offset
o_gate
;our "callgate" address

movsd
;move it to real callgate

movsd
;for jump to Ring0

call fword ptr [call_]
;jump to Ring0 to our Ring0 service

xor eax, eax

sub edi,8
stosd
stosd
;delete our changes in callgate

call MessageBoxA,0, offset msg2, offset msg1,0
call ExitProcess, -1

--------------------------------------------------------------------------------
;Our new Ring0 service

--------------------------------------------------------------------------------

ring0:
mov eax, dr7 ;test for Ring0

retf ;back to RING3
ends
end Start
--------------------------------------------------------------------------------

Part II

下面是我在网上找到的例子，是Sopinky用C写的。

Example:

--------------------------------------------------------------------------------

Main.CPP

--------------------------------------------------------------------------------
#include <WINDOWS.h>
#include "DirectHackers.h"

//it is a example of a proc in Ring 0
Ring0Proc()
{
InitRing0();
__asm
{
int 20h //get current vm
_emit 0x01 //Function ID
_emit 0x00
_emit VMM_ID //VXD ID
_emit 0x00
//in ebx i have the handle
//of virtual machine
}

RetCallback;
};
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR lpCmdLine,int nCmdShow)
{
MSG msg ;
DWORD a;
int x;
__asm pusha
InitDirectH();
CallRing0((unsigned int)Ring0Proc);
__asm popa
return 0;
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A .h Files;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DirectHackers.h

--------------------------------------------------------------------------------
#ifndef __DirectHackers_h
#define __DirectHackers_h

#include "VMMStruct.h"
//Data
DWORD VM=0,TR=0;
Control_Block *VMCBSystem=0,*VMCB=0;
DWORD esp3;
WORD cs3,ds3,es3,sp3,fs3,gs3; //State of ring 3 register
WORD cs0,ds0,es0,fs0,gs0; //State of ring 0 register

Comp *Callb,Callbcpy; //a callbacks

//to return of ring 0
#define RetCallback \
_asm sti \
_asm pop edi \
_asm pop esi \
_asm pop ebx \
_asm leave \
_asm retf;

InitDirectH()
{
FPWORD gdt; //Base of GDT
Descriptor *gdtdesc;
word a;
__asm sgdt gdt; //get the addres of GDT
gdtdesc=(Descriptor *)gdt.base;

__asm //Save the ring 3 Segments selectors
{
mov cs3,cs
mov ds3,ds
mov es3,es
mov sp3,sp
mov fs3,fs
mov gs3,gs
mov esp3,esp
}

//Serch for the adecuate CS
for(a=0;a<(gdt.limite>>3);a++)
{
gdtdesc=(Descriptor *)(gdt.base+((DWORD)0x08*a));
if(gdtdesc->limit_l==0xffff &&
gdtdesc->base_l==0x0000 &&
gdtdesc->base_m==0x00 &&
gdtdesc->access==0x9b &&
gdtdesc->limit_h== 0xcf &&
gdtdesc->base_h==0x00)break;

}
cs0=a<<3;

//Serch for the adecuate DS, ES, Etc
for(a=0;a<(gdt.limite>>3);a++)
{
gdtdesc=(Descriptor *)(gdt.base+((DWORD)0x08*a));
if(gdtdesc->limit_l==0xffff &&
gdtdesc->base_l==0x0000 &&
gdtdesc->base_m==0x00 &&
gdtdesc->access==0x93 &&
gdtdesc->limit_h== 0xcf &&
gdtdesc->base_h==0x00)break;
}
ds0=a<<3;
es0=a<<3;
fs0=a<<3;
gs0=a<<3;
}

//Call a proc and switch to ring 0
CallRing0(DWORD PUNTERO)
{
FPWORD gdt;
Descriptor *gdtdesc;
Comp *Callb,Callbcpy;
FARJMP salto;
WORD h,l;
salto.offset32=0;
salto.seg=0x08;

__asm sgdt gdt;
gdtdesc=(Descriptor *)(gdt.base+8);
Callb=(Comp *)(gdt.base+8);

Callbcpy.sel=Callb->sel; //make a copy
Callbcpy.attrib=Callb->attrib;
Callbcpy.offs_l=Callb->offs_l;
Callbcpy.offs_h=Callb->offs_h;

Callb->sel=cs0;
Callb->attrib=0xec00;;

__asm
{
mov eax,PUNTERO
mov l,ax
shr eax,16
mov h,ax
}
Callb->offs_l=l;
Callb->offs_h=h;
__asm {
push ds
push es
push gs
push fs
} //save the ring 3 segment selectors

__asm
//Call the CALL GATE!!!!

cli
{

call FWORD PTR
}
__asm
{
cli
pop fs
salto
//restore de segment selectors in ring 3

pop gs
pop es
pop ds

sti
}
return;
}

InitRing0()
{
FPWORD gdt;
Comp *Callb;

__asm sgdt gdt;
__asm cli
Callb=(Comp *)(gdt.base+8);
Callb->sel=Callbcpy.sel;
Callb->attrib=Callbcpy.attrib;
Callb->offs_l=Callbcpy.offs_l;
Callb->offs_h=Callbcpy.offs_h;
__asm
{
mov ds,ds0
mov es,es0
mov fs,fs0
mov gs,gs0
sti

//int 3h
int 20h
_emit 0x08 //get the thead handle
_emit 0x01
_emit VMM_ID
_emit 0x00
mov TR,edi
int 20h
_emit 0x01 //get current vm
_emit 0x00
_emit VMM_ID
_emit 0x00
mov VM,ebx //current VM handle, osea de sistema
sti
}
}
#endif

------------------------------------****--------------------------------------
VMMStruct.h
------------------------------------****--------------------------------------
#ifndef __vmmstruct_h
#define __vmmstruct_h

//definitions
#define Get_Cur_VM_Handle 0x01
#define Get_VMM_Version 0x00
#define VMM_ID 0x01
#define VDD_ID 0x0a
#define VFD_ID 0x0011f;
#define VWIN32_ID 0x0002A
#define SHELL_ID 0x00017
#define word unsigned short
#define dword unsigned int
#define DWORD unsigned int
#define WORD unsigned short
#define byte unsigned char
#define BYTE unsigned char

//Structs
#pragma pack(1)
typedef struct
{
word limite;
dword base;
}FPWORD;

typedef struct
{
dword offset32;
word seg;
}FARJMP;

//struct of descriptors
typedef struct
{
WORD limit_l;
WORD base_l;
BYTE base_m;
BYTE access;
BYTE limit_h;
BYTE base_h;
}Descriptor;

typedef struct
{
WORD desp_l;
WORD sel;
BYTE tipo_l;
BYTE tipo_h;
BYTE desp_h;
}Idt_Descriptor;

//compuertas del 386
typedef struct
{
WORD offs_l;
WORD sel;
WORD attrib;
WORD offs_h;
}Comp;

//Description Block
typedef struct {
ULONG DDB_Next; /* VMM RESERVED FIELD */
USHORT DDB_SDK_Version; /* INIT <DDK_VERSION> RESERVED FIELD */
USHORT DDB_Req_Device_Number; /* INIT <UNDEFINED_DEVICE_ID> */
UCHAR DDB_Dev_Major_Version; /* INIT <0> Major device number */
UCHAR DDB_Dev_Minor_Version; /* INIT <0> Minor device number */
USHORT DDB_Flags; /* INIT <0> for init calls complete */
UCHAR DDB_Name[8]; /* AINIT <" "> Device name */
ULONG DDB_Init_Order; /* INIT <UNDEFINED_INIT_ORDER> */
ULONG DDB_Control_Proc; /* Offset of control procedure */
ULONG DDB_V86_API_Proc; /* INIT <0> Offset of API procedure */
ULONG DDB_PM_API_Proc; /* INIT <0> Offset of API procedure */
ULONG DDB_V86_API_CSIP; /* INIT <0> CS:IP of API entry point */
ULONG DDB_PM_API_CSIP; /* INIT <0> CS:IP of API entry point */
ULONG DDB_Reference_Data; /* Reference data from real mode */
ULONG DDB_Service_Table_Ptr; /* INIT <0> Pointer to service table */
ULONG DDB_Service_Table_Size; /* INIT <0> Number of services */
ULONG DDB_Win32_Service_Table; /* INIT <0> Pointer to Win32 services */
ULONG DDB_Prev; /* INIT <'Prev'> Ptr to prev 4.0 DDB */
ULONG DDB_Size; /* INIT <SIZE(VxD_Desc_Block)> Reserved */
ULONG DDB_Reserved1; /* INIT <'Rsv1'> Reserved */
ULONG DDB_Reserved2; /* INIT <'Rsv2'> Reserved */
ULONG DDB_Reserved3; /* INIT <'Rsv3'> Reserved */
}Desc_Block;

//Control block
typedef struct {
ULONG Client_EDI; /* Client's EDI */
ULONG Client_ESI; /* Client's ESI */
ULONG Client_EBP; /* Client's EBP */
ULONG Client_res0; /* ESP at pushall */
ULONG Client_EBX; /* Client's EBX */
ULONG Client_EDX; /* Client's EDX */
ULONG Client_ECX; /* Client's ECX */
ULONG Client_EAX; /* Client's EAX */
ULONG Client_Error; /* Dword error code */
ULONG Client_EIP; /* EIP */
USHORT Client_CS; /* CS */
USHORT Client_res1; /* (padding) */
ULONG Client_EFlags; /* EFLAGS */
ULONG Client_ESP; /* ESP */
USHORT Client_SS; /* SS */
USHORT Client_res2; /* (padding) */
USHORT Client_ES; /* ES */
USHORT Client_res3; /* (padding) */
USHORT Client_DS; /* DS */
USHORT Client_res4; /* (padding) */
USHORT Client_FS; /* FS */
USHORT Client_res5; /* (padding) */
USHORT Client_GS; /* GS */
USHORT Client_res6; /* (padding) */
ULONG Client_Alt_EIP;
USHORT Client_Alt_CS;
USHORT Client_res7;
ULONG Client_Alt_EFlags;
ULONG Client_Alt_ESP;
USHORT Client_Alt_SS;
USHORT Client_res8;
USHORT Client_Alt_ES;
USHORT Client_res9;
USHORT Client_Alt_DS;
USHORT Client_res10;
USHORT Client_Alt_FS;
USHORT Client_res11;
USHORT Client_Alt_GS;
USHORT Client_res12;
}Client_Reg_Struc;

typedef struct Thread_Control_Block {
ULONG TCB_Flags; /* Thread status flags */
ULONG TCB_Reserved1; /* Used internally by VMM */
ULONG TCB_Reserved2; /* Used internally by VMM */
ULONG TCB_Signature;
ULONG TCB_ClientPtr; /* Client registers of thread */
ULONG TCB_VMHandle; /* VM that thread is part of */
USHORT TCB_ThreadId; /* Unique Thread ID */
USHORT TCB_PMLockOrigSS; /* Original SS:ESP before lock stack */
ULONG TCB_PMLockOrigESP;
ULONG TCB_PMLockOrigEIP; /* Original CS:EIP before lock stack */
ULONG TCB_PMLockStackCount;
USHORT TCB_PMLockOrigCS;
USHORT TCB_PMPSPSelector;
ULONG TCB_ThreadType; /* dword passed to VMMCreateThread */
USHORT TCB_pad1; /* reusable; for dword align */
UCHAR TCB_pad2; /* reusable; for dword align */
UCHAR TCB_extErrLocus; /* extended error Locus */
USHORT TCB_extErr; /* extended error Code */
UCHAR TCB_extErrAction; /* " " Action */
UCHAR TCB_extErrClass; /* " " Class */
ULONG TCB_extErrPtr; /* " pointer */
}Thread_Control_Block;

typedef struct
{
DWORD CB_VM_Status ;
DWORD CB_High_Linear ;
DWORD CB_Client_Pointer ;
DWORD CB_VMID ;
DWORD CB_Signature ;
}Control_Block;
#endif

--------------------------------------------------------------------------------

Part III

我想汇编语言的例子会比C写的更简洁明了些！毕竟低层代码是汇编的拿手好戏。 下面介绍常用的用IDT（Interupt Descriptor Table)实现Ring0的方法 最早是ELICZ写的，后来陈盈豪写CIH也用到了。 这种方法是很常用的，但现在能被大多数的跟踪程序(Frog-Ice,IceDump)检测出来， 这就是我推荐LDT方法的原因，好了废话少说，下面是代码。 Example:

--------------------------------------------------------------------------------
.386p
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
include w32.inc

Extrn SetUnhandledExceptionFilter : PROC

Interrupt
equ 5
;interrupt number which we will use

.DATA

;if you use Int 1h or 3h, it will be
;more harder debugg your program

msg1
db
"Switch to
Ring0 by IDT",0

msg2
db
"Ring0 activated",0

.CODE
Start:

push
edx

sidt
[esp-2]
;read IDT to stack

pop
edx
;address of Interrupt table

add
edx,(Interrupt*8)+4

;Interrupt table base+Int number+size for
;Int in Interrupt table=Int vector address

mov
ebx,[edx]

mov

bx,word ptr

[edx-4]
;read old address our interrupt (INT 5h)

lea
edi,InterruptHandler

mov
[edx-4],di

ror
edi,16
;set our new interrupt handler

mov

[edx+2],di

push
ds
;save registers

push
es

int
Interrupt
;jump to Ring0 (our int 5h handler)

pop
es
;restore registers

pop
ds

mov [edx-4],bx ;set old int 5h handler ror ebx,16
mov [edx+2],bx
call MessageBoxA,0, offset msg2, offset msg1,0 call ExitProcess, -1

;-----------------------------------------------------------------------------
;OUR NEW INT 5h HANDLER (it run in Ring0)
;-----------------------------------------------------------------------------

InterruptHandler:

mov eax,dr7
;test for Ring0

iretd
;jump back to Ring3

ends
end Start
--------------------------------------------------------------------------------
还有很多方法可以实现Ring0,我也不知道了。大家请自己学习吧。


利用SEH技巧进入Ring0级

标 题:怎样利用SEH技巧进入Ring0级 (8千字)
发信人:ljtt
时 间:2001-4-7 21:17:57
详细信息:
欢迎各位有空光临小站。http://st0ne.go.163.com

『技术研习』 『以前更新』

--------------------------------------------------------------------------------

怎样利用SEH技巧进入Ring0级

【前言】
这份源码我学习到现在有一段时间了。其中的一些注释是我自己加上的。现在就作一份资料和大家交流吧。
注意几点情况：1、这种方法只能在Windows95/98下使用，如果在NT/2000下使用是不成功的。
______________2、当段选择符CS=28、DS=30时，在Windows98下即为Ring0级时的选择符。
______________3、CR3的内容和内存定址有关，只有在Ring0级才可以读出其内容，否则非法。所以这里通过读CR3的内容来验证是否进入了Ring0级。
______________4、完整的源码我已经上传到主页的"源码学习"下。这里来"下载"。

; 分析日期：2000-10-24
; 此程序主要为SEH技术的一种应用，这里将详细的注释说明。这是我今天分析的第二个相关源程序

include "../inc/win32n.inc"

extern _ExitProcess@4
extern _GetTickCount@0
extern _GetStdHandle@4
extern _MessageBeep@4
extern _WriteConsoleA@20

global _mainCRTStartup

SEGMENT .text USE32 class=code

_mainCRTStartup
push dword STD_OUTPUT_HANDLE ;
call _GetStdHandle@4 ;获取输出控制屏的句柄
mov [stdout],eax ;保存句柄

;******************************************
;* 以下这一段是按照SEH必要的方式形成链表
;******************************************
xor ebx,ebx
push dword eh ;压入自己Except Handle指针，即 eh 处
push dword [fs:ebx] ;压入当前[FS:0]
mov [fs:ebx],esp ;形成链表形式

pushfd ;入栈保存当前EFlags标志寄存器的内容
mov eax,esp ;保存当前堆栈指针到 eax

;******************************************
;* 这里将产生断点中断，从而进入异常处理程序
;******************************************
int3

;******************************************
;* 这里是从异常处理程序中返回后来到的地址
;******************************************
mov ebx,cr3 ;以后将会显示ebx的内容，即显示 cr3 的内容

;**************************************************************************************
;* 以下是一种特殊方式的跳转。由于使用 push/iretd 来进行跳转，注意不是 push/retn。
;* 所以，在堆栈中要把各个寄存器的内容入栈，这是因为当中断发生时，系统会自动把
;* 这些寄存器的内容入栈，而在 iretd 返回时自动出栈。这就是 iretd 和 retn 的区别。
;* 另外，由于在异常处理程序中进行了以下修改。所以刚返回时：ECX=CS,CS=28,EDX=SS,SS=30，
;* 所以，此时我们看到各寄存器的内容与此相同。这主要是一种演示，或者说是一种简单的应用。
;**************************************************************************************
push dword edx ; GS
push dword edx ; FS
push dword edx ; ES
push dword edx ; DS
push dword edx ; SS
push eax ; ESP
push dword [eax] ; EFLAGS
push dword ecx ; CS
push dword .wow ; EIP
iretd
.wow
;******************************************
;* 显示 ebx 的内容
;******************************************
popfd
call printaddress

;******************************************
;* 这一段将在SEH链表中清除自己的异常处理
;******************************************
pop dword [fs:0] ;通过出栈的方式修改[FS:0]的内容
add esp,4

push dword MB_ICONASTERISK
call _MessageBeep@4 ;鸣声提示

push dword 0
call _ExitProcess@4 ;退出程序
; retn

;******************************************
;* 这里是自己的异常处理程序开始
;******************************************
eh
push ebp
mov ebp,esp
push ebx ;入栈保存
push ecx ;入栈保存

;******************************************
;* 这一段为判断异常标志(ExceptionFlags)是否
;* 为UNWIND_STACK。
;******************************************
mov eax,[ebp+8] ;[EBP+8]=EXCEPTION_RECORD_ptr，即EAX为EXCEPTION_RECORD的指针
test dword [eax+4],6 ;[EAX+4]=EXCEPTION_RECORD_ptr->ExceptionFlags，
;即判断ExceptionFlags是否为UNWIND_STACK，此在SEH.inc中有定义
jz .cont ;是，则跳转

;******************************************
;* 显示 oi
;******************************************
push dword 0
push dword written
push dword 2
push dword oi
push dword [stdout]
call _WriteConsoleA@20
mov eax,1
jmp .e

.cont
;*********************************************************
;* 判断异常代码(ExceptionCode)是否为EXCEPTION_BREAKPOINT
;*********************************************************
mov ebx,[ebp+8] ;[EBP+8]=EXCEPTION_RECORD_ptr，即EAX为EXCEPTION_RECORD的指针
mov eax,1
cmp dword [ebx],0x80000003 ;[EBX]=EXCEPTION_RECORD_ptr->ExceptionCode，
;即判断ExceptionCode是否为EXCEPTION_BREAKPOINT(断点标志)
jne .e ;不是，则跳转，返回值EAX为1

;**********************************************************
;* 修改xFrame_RECORD_ptr->cx_Ecx=xFrame_RECORD_ptr->cxSegCs
;**********************************************************
mov eax,[ebp+0x10] ;[EBP+10]=xFrame_RECORD_ptr，即EAX为xFrame_RECORD的指针
movzx ecx,word [eax+CONTEXT.cx_SegCs]
mov [eax+CONTEXT.cx_Ecx],ecx ;xFrame_RECORD_ptr->cx_Ecx=xFrame_RECORD_ptr->cxSegCs

;**********************************************************
;* 修改xFrame_RECORD_ptr->cx_SegCs=0x28
;**********************************************************
mov dword [eax+CONTEXT.cx_SegCs],0x28

;**********************************************************
;* 修改xFrame_RECORD_ptr->cx_Edx=xFrame_RECORD_ptr->cxSegSs
;**********************************************************
movzx ecx, word [eax+CONTEXT.cx_SegSs]
mov [eax+CONTEXT.cx_Edx],ecx

;**********************************************************
;* 修改xFrame_RECORD_ptr->cx_SegSs=0x30
;**********************************************************
mov dword [eax+CONTEXT.cx_SegSs],0x30

;**********************************************************
;* 修改xFrame_RECORD_ptr->cx_EFlags=0x0200
;**********************************************************
or dword [eax+CONTEXT.cx_EFlags],0x0200 ;设置EFlags中的IF标志(中断允许标志)为1，即 CLI

;*********************************************************
;* 在控制屏上显示 ebx 的内容
;*********************************************************
mov ebx,0x12345678
call printaddress

;*********************************************************
;* EAX=0，即通知Kernel将继续执行
;*********************************************************
mov eax,0

.e
pop ecx ;出栈恢复
pop ebx ;出栈恢复
mov esp,ebp
pop ebp
retn ;返回
;******************************************
;* 这里是自己的异常处理程序结束处
;******************************************

;******************************************
;* 转换ebx的内容为字符形式，并在屏幕上显示
;* ebx为入口参数，代表一个地址
;******************************************
printaddress
push ecx ; just a lame routine to print out
push edx ; a hex address, no explanations ;-)

xor ecx,ecx
.n
rol ebx,4
mov dl,bl
and dl,0x0F
cmp dl,0x9
ja .abcdef
add dl,'0'
jmp .a
.abcdef
add dl,'A'-0xA
.a
mov [ecx+address],dl
inc cl
cmp cl,8
jne .n

push dword 0
push dword written
push dword 9
push dword address
push dword [stdout]
call _WriteConsoleA@20

pop edx
pop ecx
retn

SEGMENT .data USE32 class=data

stdout dd 0
onedot db '.'
oi db '!',0x0A
written dd 0
address db 0,1,2,3,4,5,6,7,0x0A

--------------------------------------------------------------------------------

《加密及解密技术交流站》由 ljtt 制作 版权所有
&copy;2000 -2001 All Rights Reserved

转载本站所有文章请注明出处，尊重作者的劳动也是尊重你自己。让我们一同撑起绿色的天空！


ProcDump中的隐藏自己的方法

标 题:算了算了，刚才到网"难"去了一趟，原来是服务器要笑正。把一篇先放到这儿吧。明天再见。 (7千字)
发信人:ljtt
时 间:2001-4-20 22:40:39
详细信息:
欢迎到小站坐坐 http://st0ne.yeah.net
『技术研习』 『以前更新』

--------------------------------------------------------------------------------

ProcDump中的隐藏自己的方法

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
运行ProcDump的Script时，总能看到其开始时会显示一段"Hiding Debugger to host ..."的信息，这到底是做什么用的呢？我们来看看吧。

作者： ljtt
写作日期： 2001-04-19

以下是用W32Dasm反汇编得到的结果。

:00408E15 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Hiding Debugger to host ..."
|
:00408E17 6833C44000 push 0040C433
:00408E1C E89E88FFFF call 004016BF <--显示"Hiding Debugger to host ..."
:00408E21 6814204100 push 00412014
:00408E26 FF35E4204100 push dword ptr [004120E4]

* Reference To: KERNEL32.GetThreadContext, Ord:0152h
|
:00408E2C E8150A0000 Call 00409846 <--取得线程上下文内容到 00412014 地址处
:00408E31 52 push edx
:00408E32 53 push ebx
:00408E33 50 push eax
:00408E34 8CC0 mov ax, es
:00408E36 50 push eax
:00408E37 A1A4204100 mov eax, dword ptr [004120A4] <--取得 FS 段选择器的内容
:00408E3C 8EC0 mov es, ax
:00408E3E 26C7052000000000000000 mov dword ptr es:[00000020], 00000000 <--设置 DebugContext = 0
:00408E49 58 pop eax
:00408E4A 8EC0 mov es, ax
:00408E4C 58 pop eax
:00408E4D 5B pop ebx
:00408E4E 5A pop edx

我们不妨来分析一下吧。

程序首先用 GetThreadContext 函数来取得线程上下文的内容，此也就是 _CONTEXT 结构的内容，并保存在 00412014 地址处。
( _CONTEXT 结构的定义附后 )

然后，程序取 [004120A4] 的内容到 EAX 中，并赋给 ES 段选择器中。

:00408E37 A1A4204100 mov eax, dword ptr [004120A4] <--取得 FS 选择器的内容
:00408E3C 8EC0 mov es, ax

[004120A4]中保存的到底是什么呢？从 _CONTEXT 结构的定义中我们知道其偏移 90h 处保存的是当前 FS 段选择器的值，而 [00412014 + 90] = [004120A4] ，因此 [004120A4] 保存的即为 FS 段选择器的值。这两条指令的作用即为把 FS 段选择器的值赋给 ES 段选择器。

然后，程序赋 ES:[20] 的值为 0，这有何用意呢？我们知道Windows在调入进程，创建线程时，操作系统均会为每个线程分配TEB，而且都将FS段选择器(i386)指向当前线程的TEB数据(单CPU机器在任何时刻系统中只有一条线程在执行)，因此此时 FS 段选择器即为 TEB 结构的指针。
看来，我们需要了解一下TEB结构的知识了，以下是有关TEB结构的知识及相关定义：

TEB在Windows 9x系列中称为TIB(Thread Information Block)，她纪录着线程的重要信息，每一个线程对应一个TEB结构。其格式如下(摘自Matt Pietrek的Under the Hood专栏－MSJ 1996):

typedef struct _TIB
{
PEXCEPTION_REGISTRATION_RECORD pvExcept;
// 00h Head of exception record list
PVOID pvStackUserTop; // 04h Top of user stack
PVOID pvStackUserBase; // 08h Base of user stack

union // 0Ch (NT/Win95 differences)
{
struct // Win95 fields
{
WORD pvTDB; // 0Ch TDB
WORD pvThunkSS;
// 0Eh SS selector used for thunking to 16 bits
DWORD unknown1; // 10h
} WIN95;

struct // WinNT fields
{
PVOID SubSystemTib; // 0Ch
ULONG FiberData; // 10h
} WINNT;
} TIB_UNION1;

PVOID pvArbitrary;
// 14h Available for application use
struct _tib *ptibSelf;
// 18h Linear address of TIB structure

union // 1Ch (NT/Win95 differences)
{
struct // Win95 fields
{
WORD TIBFlags; // 1Ch
WORD Win16MutexCount; // 1Eh
DWORD DebugContext; // 20h
DWORD pCurrentPriority; // 24h
DWORD pvQueue;
// 28h Message Queue selector
} WIN95;

struct // WinNT fields
{
DWORD unknown1; // 1Ch
DWORD processID; // 20h
DWORD threadID; // 24h
DWORD unknown2; // 28h
} WINNT;
} TIB_UNION2;

PVOID* pvTLSArray; // 2Ch Thread Local Storage array

union // 30h (NT/Win95 differences)
{
struct // Win95 fields
{
PVOID* pProcess;
// 30h Pointer to owning process database
} WIN95;
} TIB_UNION3;

} TIB, *PTIB;

了解了这些以后，我们再理解上面指令的作用不再困难，TEB结构的偏移 20h 处在Win9x的定义中为 DebugContext，因此 ES:[20] = 0， 即为 FS:[20] = 0，即为设置 TEB 结构的 DebugContext 为 0。

现在，我们明白了为什么有些情况ProcDump可以加载并进行脱壳的程序，而你编写的程序却无法把它作为一个子进程来加载它，原来ProcDump有这一手。:-)

【后记】
虽然这种方法现在已经不足以对付外壳加密程序的反跟踪保护了，但是我们学习的目的正在于了解它，掌握它，从而有所创新。
我想当我们对此类知识了解得更多的的时候，对与此相关的新的变化的跟踪方法也就能成竹在胸了。如果你有更多、更好的跟踪方法也请告诉我哦。:-)

[附：_CONTEXT结构定义]
_CONTEXT STRUC
cx_ContextFlags DD ?

;CONTEXT_DEBUG_REGISTERS
cx_Dr0 DD ? ;04
cx_Dr1 DD ? ;08
cx_Dr2 DD ? ;0C
cx_Dr3 DD ? ;10
cx_Dr6 DD ? ;14
cx_Dr7 DD ? ;18

;CONTEXT_FLOATING_POINT
cx_ControlWord DD ?
cx_StatusWord DD ?
cx_TagWord DD ?
cx_ErrorOffset DD ?
cx_ErrorSelector DD ?
cx_DataOffset DD ?
cx_DataSelector DD ?
SIZE_OF_80387_REGISTERS EQU 80
cx_RegisterArea DB SIZE_OF_80387_REGISTERS DUP (?)
cx_Cr0NpxState DD ?

;CONTEXT_SEGMENTS
cx_SegGs DD ? ;8C
cx_SegFs DD ? ;90
cx_SegEs DD ? ;94
cx_SegDs DD ? ;98

;CONTEXT_INTEGER
cx_Edi DD ? ;9C
cx_Esi DD ? ;A0
cx_Ebx DD ? ;A4
cx_Edx DD ? ;A8
cx_Ecx DD ? ;AC
cx_Eax DD ? ;B0

;CONTEXT_CONTROL
cx_Ebp DD ? ;B4
cx_Eip DD ? ;B8
cx_SegCs DD ? ;BC
cx_EFlags DD ? ;C0
cx_Esp DD ? ;C4
cx_SegSs DD ? ;C8
_CONTEXT ENDS
;size of CONTEXT is 0CCH bytes

--------------------------------------------------------------------------------

《加密及解密技术交流站》由 ljtt 制作 版权所有
&copy;2000 -2001 All Rights Reserved

转载本站所有文章请注明出处，尊重作者的劳动也是尊重你自己。让我们一同撑起绿色的天空！


ANTI－W32dasm

标 题:哪位大侠能解决这个对抗W32DASM的“轻松试卷”??? (454字)
发信人:paulyoung
时 间:2001-3-24 16:14:05
详细信息:
哪位大侠能解决这个对抗W32DASM的“轻松试卷”???

    各位大哥，小弟已用动态跟踪破了“轻松试卷”，想写一篇破解心得，可它无法反汇编，用W32DASM v8.93一打开就“没有响应”，试过很多电脑都是这样，猜想它可能对抗W32DASM，试过很多办法都不行。有谁能帮我解决它，使它能用W32DASM打开，好让我写出这篇心得文章。
    我用过TRW2000的 U 命令，可保存的文件根本不适合写文章，看得很不爽。
    各位大侠，帮帮小弟好吗？

请到此下载“轻松试卷”

http://easypaper.yeah.net

标 题:两个ANTI－W32dasm的程序的解决办法 (3千字)
发信人:小牧童
时 间:2001-3-24 19:38:24
详细信息:

两个ANTI－W32dasm的程序的解决办法
作者：小牧童[CCG]
版权：CCG所有，转载请保持完整。
难度：易

程序1：http://www.my169.com/~zxhxmz/porciins.exe
程序2：就是上面这位大哥所想要解决的轻松试卷。http://www.shijun.com/easypaper/cn/download/eps404.zip

现象：这两个程序用W32dasm打开后陷入没有反应之中，只有用Ctrl+alt+del才能使其退出。
思路：W32dasm陷入无应之中估计进入某处死循环。呵呵，小牧童就是会钻死牛角尖^_^！有了思路ANTI功能自然就解了。
方法：
程序1：
运行W32dasm 并打开animal.exe文件进行编译，W32dasm进入死循环。
下Ctrl+D 进入softice按2次F12到下面：

:0046149F E8DCDB0400 call 004AF080
:004614A4 83C408 add esp, 00000008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461494(C)
|
:004614A7 8A9C35E9FDFFFF mov bl, byte ptr [ebp+esi-00000217]
:004614AE 80FB2F cmp bl, 2F
:004614B1 7615 jbe 004614C8
:004614B3 80FB3A cmp bl, 3A
:004614B6 7310 jnb 004614C8
:004614B8 889D0CF6FFFF mov byte ptr [ebp+FFFFF60C], bl
:004614BE C6850DF6FFFF00 mov byte ptr [ebp+FFFFF60D], 00
:004614C5 83C602 add esi, 00000002

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004614B1(C), :004614B6(C)
|
:004614C8 8D850CF6FFFF lea eax, dword ptr [ebp+FFFFF60C]
:004614CE 50 push eax
:004614CF E8EC9D0400 call 004AB2C0
:004614D4 59 pop ecx
:004614D5 8945F4 mov dword ptr [ebp-0C], eax
:004614D8 33D2 xor edx, edx
:004614DA 8955F8 mov dword ptr [ebp-08], edx
:004614DD 8B4DF8 mov ecx, dword ptr [ebp-08]
:004614E0 8B45F4 mov eax, dword ptr [ebp-0C]
:004614E3 3BC8 cmp ecx, eax
:004614E5 0F83B6FDFFFF jae 004612a1 //这里改为909090909090跳出死循环。

:004614E6 90 nop
:004614E7 90 nop
:004614E8 90 nop
:004614E9 90 nop
:004614EA 90 nop

程序2：
运行W32dasm 并打开easypaper.exe文件进行编译，W32dasm进入死循环。
下Ctrl+D 进入softice按2次F12到下面：

:0046151B E8BCD60400 call KERNEL32!lstrcat //按2次F12后到这里
:00461520 FF45F8 inc [ebp-08]
:00461523 8B4DF8 mov ecx, dword ptr [ebp-08]
:00461526 8B45F4 mov eax, dword ptr [ebp-0C]
:00461529 3BC8 cmp ecx, eax
:0046152B 72BE jb 004614EB ／/将这里改为9090
:0046152D E96FFDFFFF jmp 004612A1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046121D(C)
|
:00461532 8B957CFFFFFF mov edx, dword ptr [ebp+FFFFFF7C]
:00461538 85D2 test edx, edx
:0046153A 7411 je 0046154D

将0046152b的比较取消，顺着0046152d的jmp 来到下面：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046152D(U)
|
:004612A1 C7857CFFFFFF01000000 mov dword ptr [ebp+FFFFFF7C], 00000001
:004612AB 8B8D78FFFFFF mov ecx, dword ptr [ebp+FFFFFF78]
:004612B1 85C9 test ecx, ecx
:004612B3 7410 je 004612C5
:004612B5 33C0 xor eax, eax
:004612B7 89857CFFFFFF mov dword ptr [ebp+FFFFFF7C], eax
:004612BD 33D2 xor edx, edx
:004612BF 899578FFFFFF mov dword ptr [ebp+FFFFFF78], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004612B3(C)
|
:004612C5 84DB test bl, bl
:004612C7 0F85D9FEFFFF jne 004611A6 ／／这里改为9090909090跳出死循环。
:004612CD 6A01 push 00000001


UPX 0.72

 标 题:How to unpack PE file packed by UPX 0.72 by dREAMtHEATER (2千字)
发信人:dREAMtHEATER
时 间:2000-10-22 17:43:33
详细信息:
How to unpack PE file packed by UPX 0.72

Analysis：
UPX是一个可以高度压缩PE文件格式的免费的packer,压缩后original file的section被重新组织成4个section,分别从upx0到upx2, section of upx0，其Raw Size是0，但Virtual Size与原始文件Size of Image相比，稍大，可见是UPX是将解压缩后的原始文件数据映射到此；upx1起始部分是被UPX重新构建的Import Table,但很不幸，只包括IMAGE_IMPORT_DESCRIPTOR中的Name部分的正确信息，再往下是被extract出的Resource部分的Icon和Version Information,但无法用eXeScope正确查看；upx2为UPX的解压缩代码，upx3包括被压缩的原始数据。

Unpacking Procedure：
1.用PEditor查看size of image及image base,并记录
2.在Hex Workshop中，查找"EBE261E9"，在E9处记下file offset
3.计算E9处的VA
4.在Sice Loader中载入要dump的压缩exe文件，并根据E9的VA设断点
5.中断后，记下断点处jmp 00********,其中跳转的地址是程序真正的EP,并记下
6.根据size of image及image base用IceDump将刚刚解压缩完毕的内存映射数据dump到文件中
7.修改文件的EP,并令各个section的Raw size=Virtual Size, Raw offset=Virtual Size
8.删除section upx2,upx3(一些情况下你可能需要保留upx2)
9.Realign File

Tools to be included：
1.PEditor 1.7 by by yoda and M.o.D.
2.SoftIce for Win9x 4.05 by NuMega Company
3.Hex Workshop by BreakPoint SoftWare, Inc.
4.IceDump 6.0.1.9 by the Icedump Team
5.笔和纸 :-)

以上所有工具均可从Programmer's tools站点下载(别告诉我你不知道）

Problem:
虽然用UPX 0.72加完壳的程序在脱壳后，可以不需重新构建import table,但我看到 import table 结构已完全发生变化，IMAGE_IMPORT_DESCRIPTOR结构中，只有Name部分指向是正确的，而FirstThunk部分定位不正确，但原始文件中被FirstThunk所指向的array of IMAGE_THUNK_DATA与脱壳的文件中存在的部分内存映射是一样的，只是原始文件中的array of IMAGE_THUNK_DATA在被映射到内存中后会被PE Loader替换为各个dll中的function的内存真正入口地址，而在脱壳文件中本身已被UPX手动替换成各个dll中的function的内存入口地址,当脱壳文件被PE Loader载入后，不再需要PE Loader的帮忙，我的疑问就在于此,即我现在搞不清楚，PE Loader在将此脱壳文件装入内存后，就不再需要对这些function做重新定位了吗？每次dll的装载位置都是一样的吗？
另外resource如何重新构建？请高手回答！

Written by dREAMtHEATER
E-Mail: dreamtheater@263.net
2000.10.22


chm帮助编辑器v2.6

标 题:chm帮助编辑器v2.6 注册码破解详谈之一*脱壳篇* (3千字)
发信人:TAE!
时 间:2001-2-4 13:36:15
详细信息:
其实没这个必要,是应peterchen要求所写!
就先说说软件的脱壳吧!它用upx加壳.
第一种脱壳方法:trw+冲击波0.2
启动冲击波,点击Trace,然后运行要脱壳的软件,此时冲击波会显示一个数值(这里应该是00488C78),这
就是程序的入口.
trw载入文件,Ctrl+N,
g 00488C78
MakePe 或 pedump
脱壳成功!

第二种脱壳方法:只用trw.
用trw载入程序,选择加载,这时TRW弹出,按一次F10,程序来到这里:
:004BA000 60 pushad
:004BA001 E800000000 call 004BA006
一直按F10运行到上面这一行,注意这个call一定要进去,因为你再按一次F10的话,程序就运行了!
于是按F8进入:
* Referenced by a CALL at Address:
|:004BA001
|
:004BA006 83CDFF or ebp, FFFFFFFF
:004BA009 31DB xor ebx, ebx
:004BA00B 5E pop esi
:004BA00C 8DBEFA6FF4FF lea edi, dword ptr [esi+FFF46FFA]
:004BA012 57 push edi
:004BA013 668187F4830B000100 add word ptr [edi+000B83F4], 0001
:004BA01C 81C6B3010000 add esi, 000001B3
:004BA022 EB0A jmp 004BA02E

到了这里,再继续按F10跳转到 004BA02E,继续跟踪

:004BA02E 01DB add ebx, ebx
:004BA030 7507 jne 004BA039
:004BA032 8B1E mov ebx, dword ptr [esi]
:004BA034 83EEFC sub esi, FFFFFFFC
:004BA037 11DB adc ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA030(C)
|
:004BA039 72ED jb 004BA028
:004BA03B B801000000 mov eax, 00000001

在004BA039这一行程序将*向上*跳到004BA028,进行循环解压,而我们没有必要跟着它走,所以将光标
定位于004BA03B,按F7,这样就省去了许多步骤了,接着软件还会有很多类似于这里的地方,都可以用这
种方法跳过去.若是程序向下跳跃的时候,就不要多此一举了,让它跳就是了,还要注意的是按F7前,最好
先在跳转的地方设个断点,再bd掉,这样即使判断错误,也还有的救,be就可以了继续跟踪了.继续向下走:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BA04F(C), :004BA05A(C)
|
:004BA040 01DB add ebx, ebx
:004BA042 7507 jne 004BA04B \\这里会*向下*跳转,让它跳就是了.
:004BA044 8B1E mov ebx, dword ptr [esi]
:004BA046 83EEFC sub esi, FFFFFFFC
:004BA049 11DB adc ebx, ebx

这两种情况已经明白了吧!那我就省去一些了.
来到这里

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA177(C)
|
:004BA18A 240F and al, 0F
:004BA18C C1E010 shl eax, 10
:004BA18F 668B07 mov ax, word ptr [edi]
:004BA192 83C702 add edi, 00000002
:004BA195 EBE2 jmp 004BA179

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA173(C)
|
:004BA197 61 popad 运行到这里以后看看下面这个跳转
:004BA198 E9DBEAFCFF jmp 00488C78 //这里程序便完成来内存中的解工作,
将要跳到程序入口点00488C78
然后就来到了这里:
00488C78 PUSH EBP //在这里下MAKEPE命令(但我的TRW经常出错,Why)或是Pedump
00488C79 MOV EBP,ESP 但若你用了Pedump那脱壳后的文件将不能在其它操作系统和
其它机器上运行!

到trw目录中,这时看见一个文件在那儿,这就是我们脱壳后的文件,运行一下,挺好的!


ssreader

 标 题:如何用upx -d解压ssreader.exe
发信人:真.hp
时 间:2000-12-16 10:19:39
详细信息:
用16进制编辑器打开ssreader.exe

把 2F8-2FB 处改为 UPX0 共4个字节
把 320-323 处改为 UPX1 共4个字节
把 40E-412 处改为 UPX! 共4个字节
把 413 处改为 0Ch 共1个字节

至于如何找出修改点，我一般打开一
个被upx压缩过的文件，对比着修改比
较快。
如果你能把ssreader.exe放出来让我
下载就好了，害我还要去下那个1m多
的简版，我的￥啊555555
标 题:UPX!后面的4个字节是用来校验版本是否相符的，0.9x-1.0x均为0C 09 ?? ??
发信人:真.hp
时 间:2000-12-16 16:36:00
详细信息:


UPXPR壳

 标 题:小甜饼 --- 有关UPXPR处理后的程序脱壳的另一种思路（现在讨论脱壳的人真多哇，可惜我没多少时间上网 :-(） (770字)
发信人:ljttt
时 间:2000-9-7 8:17:31
详细信息:
小甜饼 --- 有关UPXPR处理后的程序脱壳的另一种思路（现在讨论脱壳的人真多哇，可惜我没多少时间上网 :-(）
这里谈谈UPX加壳后的EXE或者DLL如果被UPXPR处理后无法脱壳的问题。

其实如果找到UPXPR修改的地方加上跟踪分析UPX就会发现UPXPR不过修改了一些被UPX标识自己加壳的标志（总之是各种标志了），修复这些标识即可重新用UPX -D参数重新脱壳。（当然版本要对，不要被FI报告的版本骗了，有兴趣的朋友还可以写个小程序之类的来个批处理，哈哈）

具体的就自己去试试吧！想了解得更多，就别偷懒！自己动手，丰衣足食！;-)

（注：一些低版本的UPX自身就无法对其加壳的DLL脱壳，不用UPXPR处理也无法用UPX -D脱壳，不在此讨论之列）

我以后会写些小甜饼之类的与大家讨论，就不写各种方法的具体步骤了，只交流思路。

祝大家好运！

（附：没想到指南针各种版本的数据转换工具用了各种各样的程序加壳，有意思。:-)）


Upx壳

 标 题:如何用upx解开ASPack+ASProtect中文注册版 (698字)
发信人:真.hp
时 间:2000-10-18 22:17:30
详细信息:
今天下午刚下载了ASPack+ASProtect中文注册版，用fi查出aspack.exe
是被upx压缩的，于是掏出upx解之，结果upx却报错。

用hedit打开aspack.exe，发现此文件头被修改过。
在1A0处可看见UPX1字样，它的上面有个code字样，把code改为UPX0，
往下在27C处可看到0C 09 02 0A，把它前面的4个字节改为UPX!，保存。
本以为这样就可以解开aspack.exe，可是用upx一解压还是报错。
嘿，有点意思。

再仔细看看aspack.exe，从298到2AD处都为0，不好，莫非它把那重要的
24个字节给清空了，要是那样可就无法解开喽。还好，那24给字节还在，
只是往前移了一点。把从278到297复制下来（共32字节），替换掉2AE前
的32个字节，再把278处的UPX!改为0000（随便改，只要不是UPX!就可
以了），保存。用upx解压OK。

用兴趣的可以去解aspr-rp.exe，方法相同。


光驱护理2.0

 标 题:光驱护理2.0 另类破解法 (857字)
发信人:真.hp
时 间:2000-10-5 23:30:04
详细信息:
难度：刚发芽的菜苗
下载地址：http://snowboy20.yeah.net（这个站点也叫“冰天雪
地”……）
作者：一个只会用静态分析和暴力破解的新手
此程序未注册的话只限制了一个小功能，我们的目的就是让此功能
可以使用。

下载后发现此程序是用upx0.93压缩的，但用upx1.02解压出错，用
hexedit打开，可发现这个程序被upxpr之类的程序修改过，于是把
它修复后用upx1.02解压ok。用exescope6.0打开程序，展开RCDATA
部分，可在其中找到“启动时自动隐藏”，往下一点可找到
Enabled = False，把False改成True，保存。现在运行程序，看看
帮助中的选项那一页，“启动时自动隐藏”那一项变为可用了。
要修复被upxpr之类的程序修改过的程序很简单，只要修改3个点即可
分别是：UPX0,UPX1,UPX!，总共只需修改12个字节。

另一个更简单的方法是修改注册表，如果你要使用这个功能，把某
项键值由False改为True即可。

这个软件注册费只要5元，但我不认为你应该注册它，因为它的功能
太简单了，与其注册不如自己编一个。

标 题:我用光驱护理2.0示范一下 (232字)
发信人:真.hp
时 间:2000-10-6 7:22:15
详细信息:

把1F8处改为UPX0
把220处改为UPX1
把3E0处改为UPX!
这3个点的位置并不是固定的（可能与upx版本有关），
前两个是section name，第3点一定要用UPX!，否则不
能解压，这一点一般在3E0附近，你只要找到某个字节
为0C，前面4个字节改为UPX!即可。

标 题:我犯了一个小错误，其实只需7个字节便可恢复。 (751字)
发信人:真.hp
时 间:2000-10-7 6:25:22
详细信息:

我犯了一个小错误，其实只需7个字节便可恢复。
在第一个section name处只需改为UPX即可，不必
再改其他的section name，而UPX!则照旧。适用
范围upx0.9x-1.02。第一个section name和UPX!
出现的位置和upx版本无关，与被压缩的程序有关。

我又仔细研究了upx，从0.9x版开始（0.8x版我没
找到）均有UPX!，UPX!后面的4个字节在任何一个
被压缩过的文件里都一样均为0C 09 02 0A，在这
4个字节之后有24个字节，改掉任何一个字节都可
使upx无法解开此文件，如果不知道正确的数值是
无法恢复的。把这24个字节都清0，程序照样可以
运行，但却不能被upx解压（如果不知道这24个字
节的正确值，没有恢复的可能。upxpr等一些程序
没有修改这里，给我们留了条后路）。

另外我发现一个奇怪的问题，用upx0.72压缩过的
文件竟然无法用upx0.72解压（未经任何修改）
而且0.72版的压缩率还比后来的版本高。


API Spy

 标 题:破解API Spy for Windows 95/98/NT/2000 《=写得不好，初学者看一看吧 (4千字)
发信人:4
时 间:2001-7-3 8:37:37
详细信息:
破解API Spy for Windows 95/98/NT/2000 《=写得不好，初学者看一看吧
破解人：4
日期：七月二日
API32spy是一个非常有用的破解工具！它可以用来侦测系统调用了那些函数，帮助我们决定下什么断点。
下载：http://madmat.hypermart.net/apis3225.exe
http://apis32.virtualave.net/soft/apis3225.exe
http://skyscraper.fortunecity.com/emacs/859/soft/apis3225.exe

首先，用Fileinfor2.45(FI.exe)检查到APISpy2.5(Apis32.EXE)是用Petite1.2加密。
使用Procdump1.62脱壳它的壳吧。不是吧？ERROR！错误操作？
运行Blast Wave 2000 v0.2（Blast Wave 2000 是一个windows 下的脱壳辅助工具。
它能轻易的找到任何加密壳的入口点.包括ASProtect以及幻影的加密壳.）
按Trace键，运行Apis32.EXE. 得到Entry point: 00406360
用w32dasm打开Apis32.EXE，反编译后, 按Find Text键,打入Entry point地址：00406360
找到:004????? E989CDFEFF JMP 00406360
哈，写下E989CDFEFF吧。
不如再一次使用Procdump来脱壳它的壳吧？就写一个新的Script来脱壳Petite1.2的壳。
打开Procdump 的Script.ini
[INDEX]
.
.
.
P1B=VGCrypt 0.75
P1C=Aspack108.4
P1D=Aspack2000
P1E=Petite1.2 《=这里加入新的脱壳名称

; script by GustawKit
.
.
.
加入新的脱壳资料
[Petite1.2] 《=新的脱壳名称
L1=LOOK E9,89,CD,FE,FF 《=先前写下的E989CDFEFF
L2=BP 《=如果发现断点
L3=STEP 《=就进行一步一步的解析操作，解压以后，保存文件
OPTL1=00000000
OPTL2=01000001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

运行Procdump1.62，选择Unpack=》选择 Petite1.2=》选择Apis32.EXE
等待Apis32.EXE的信息窗口弹出，再按Procdump1.62的OK键，开始脱壳。成功了。

然后
用w32dasm打开Apis32.EXE，反编译后, 按String Data References 键。
找那个弹出窗口的信息“This copy of APIS32 is UN R E G I S T E R E D”

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402EA5(C)
|

* Possible StringData Ref from Data Obj ->"This copy of APIS32 is U "
->"N R E G I S T E R E D" "
|
:00402EA9 BF10A24000 mov edi, 0040A210
:00402EAE BA20BD4000 mov edx, 0040BD20
:00402EB3 83C9FF or ecx, FFFFFFFF
:00402EB6 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402491(U)
|
:00402494 0AC0 or al, al 《=修改这儿。or al,01（修改0AC0=>0c01）
:00402496 7402 je 0040249A 《=如果al=0,就跳（一跳就玩完了）
:00402498 EB09 jmp 004024A3

果然弹出窗口不见了。

下一步，修改注册。找那个弹出窗口的信息"The registration information you.... "

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004018B9(U)
|
:004018BC 0AC0 or al, al 《=修改这儿。or al,01（修改0AC0=>0c01）
:004018BE 7402 je 004018C2 《=如果al=0,就跳（一跳就玩完了）
:004018C0 EB2C jmp 004018EE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004018BE(C)
|

* Possible StringData Ref from Data Obj ->"The registration information you "
->"provided is incorrect. Please verify "
->"that you entered your name and "
->"code properly, and try again. If "
->"you encounter difficulties, please "
->"send mail to APIS32@Biosys.net or "
->"visit our web site http://madmat.hypermart.net"
|
:004018C2 BFFCA04000 mov edi, 0040A0FC
:004018C7 BA80C74000 mov edx, 0040C780
:004018CC 83C9FF or ecx, FFFFFFFF
:004018CF 33C0 xor eax, eax
:004018D1 F2 repnz
:004018D2 AE scasb

怎么啦？这个程序的作者老是使用这个指令去判断是否注册啊。
or al, al
je 004018C2 《=如果al=0，就跳（一跳就玩完了）
算了，把所有的 or al, al更换成or al,01吧。
使用Hex workshop的Replace代替功能把所有0AC0换成0c01 （大约十个左右）
OK，破解API Spy for Windows 95/98/NT/2000 成功。


Petite

标 题:转载：Petite 脱壳“标准”解决方法 (1千字)
发信人:1212
时 间:2001-2-6 19:35:40
详细信息:
Petite 脱壳“标准”解决方法

作者：Ronnier

发表于 - 2001/02/06 : 18:50:08
--------------------------------------------------------------------------------
工具：r!sc's petite 2.2/2.1 enlarger v1.0、PEditor 1.7

想来大家早就用 Enlarge 脱壳过了 Petite 的东东，可是，脱壳后的文件用 eXeScope 打开还是说不认，用 ResHacker 或是 Restorator 打开说没有资源。问题不是在它没有完全脱壳，而是因为 Enlarge 脱壳后对于各个段的名称不是原来的标准段名称（也许是由于 Petite 压缩的原因，无法还原这些标准的段名称），都是些 A、B、C、D…… 这样的段，由于找不到 .rsrc 段，所以那些编辑资源的软件都报错。

知道了问题所在，对症下药就简单多了。用 PEditor 打开脱壳后的文件，点击那个 directory 按钮，可以看到此文件 Resource 的 RVA，记下它的数值。关闭 directory 对话框，点击 sections 按钮，可以看到那些叫 A、B、C、D……的段吧，找到 Virtual Offset 的值为刚才记录下的那个值的段，那就是资源段。右键点击之，edit section，把 name 改为 .rsrc，apply changes，关闭 sections 对话框，关闭 PEditor，搞定！就这么简单，再看看，可以随便改了吧，呵呵。至于别的段名称，对于汉化没有意义，不理它。

说明：我不清楚 PE 文件的结构，也不会编程哦，说是“标准”解决方法是因为这样做不会像用 CoCoRes 那样使文件变大，而且用 CoCoRes 不一定都好用。这个方法是突然来的灵感搞出来的。希望各位程序员朋友和懂得 PE 文件结构的朋友能给予批评指正！请跟贴或是给我发信吧，感谢各位了！


<脱壳通辑令>之一

标 题:部份软件的脱壳(Upx 0.72-1.0x,PC Guard,Telock,PECompact) (4千字)
发信人:upx
时 间:2001-2-2 19:41:29
详细信息:
需要下载教程中工具请到:http://longdiy.myetang.com/ 或
http://go8.163.com/~panlong/
<脱壳通辑令>之一
〖1〗 -------脱掉由PCG加密过软件的壳
脱壳对象:PC Guard for Win32 3.04D2
主页地址: http://www.pc-guard.co.yu
说明:加密软件,下简称PCG
脱壳需要工具:TRW2000 1.23,PEditor 1.7,RES,BlW2000 0.2
1. 运行Blw,按Track,运行PCG,得到脱壳入口点:00411250,
然后退出BW2000和Exescope
2. 运行TRW2000,装入PCG,入到TRW调试界面后下命令e eip 0
3. 在TRW2000中下命令 g 00411250 (在TRW中去到PCG加壳入口点)
4. 在TRW2000中下命令 makepe (TRW会在PCG目录下产生个脱壳文件Newpe.exe)
5. 按X退出TRW2000
6. 运行RES,用RES打开Newpe.exe,接着按工具中的建置相容资源.确定后退出.
7. 运行PEditor 1.7,按浏览打开Newpe.exe,接着按Rebuilder.
8. 进入重建画面后选择realign file和其中的normal,再选择
rebuild Improt Table和其中的rebuild new Improt Table,
最后选择make PE header win nt/2k compatible
9. 按 DO 重建引入.确定后退出.
完成,收工.

〖2〗 --------脱掉由UPX 0.XX-Upx 1.0x压缩过软件的壳
脱壳对象:CodeFusion Wizard Version 3.0
主页地址:http://come.to/kobik
说明:补丁制作软件,它已补UPX 0.72压缩,下称CFW

脱壳需要工具:FS,RES
1. fs -u cfg.exe
2. fs -rn -spl cfg.exe
3. 运行RES ,打开cfg.exe,接着按工具中的建置相容资源.确定后退出.
脱壳完成,收工.(哗!这么简单?是哦!就这么简单,不信,你试呗)

〖3〗 --------脱掉由PECompact 1.xx压缩过软件的壳
脱壳对象:PECompact 1.43
主页地址:http://www.collakesoftware.com
说明:压缩软件,下简称PEC
脱壳需要工具:fs,PEditor 1.7,RES 3.0
1. fs -u pec.exe
2. fs -rn -spl PEC.exe
3. 运行RES ,打开PEC.exe,接着按工具中的建置相容资源.确定后退出.
4. 运行PEditor 1.7,按浏览打开PEC.exe,接着按Rebuilder.
5. 进入重建画面后选择realign file和其中的normal,再选择
rebuild Improt Table和其中的rebuild new Improt Table,
最后选择make PE header win nt/2k compatible
9. 按 DO 重建引入.退出收工
脱壳完成,收工.

〖4〗 --------脱掉由Telock 0.71压缩过软件的壳
脱壳对象: 用Telock 0.71压缩exescope.exe
说明: telock压缩选项(防softice检测,重整
覆盖和reloc区段和ITA重定位)
脱壳需要工具:TRW2000,Procdump,RES,BlW2000 0.2
脱壳过程:
1. 运行Bw2000.exe,单击BW2000中的Track, (用冲击波检测加壳入口点)
然后运行 Exescope.exe, 得到加壳入口
点004b1ec4,退出BW2000和Exescope
2. 运行trw2000,然后装入Exescope.exe
3. 在TRW2000中下命令 g 004b1ec4 (去到加壳入口点)
4. 在TRW2000中下命令 suspend
5. 回到系统界面后运行Procdump.exe (用Procdump进行去壳)
6. 跟住点击Procdump上窗口中Exescope.exe
7. 接着光标放到下窗口中的EXEscope.exe,
然后按鼠标右键,选择Dump (Full),然后
保存脱壳文件,单击确定后退出.
8. 运行RES装入刚由Procdump脱壳后保存的文件, (用RES重整资源结构)
然后选择工具中的压缩读出,读出完成后,再选
择工具中的重建相容资源.
9. 完成后,当然是收工啦!!!

〖5〗 --------脱掉由Aspack 2.11D压缩过软件的壳
脱壳对象: 用Aspack 2.11D压缩exescope.exe
说 明: 是用Aspack 2.11D未注册版压缩的
脱壳过程:
方法一 (脱壳需要工具:Procdump,RES)
1. 运行Bw2000.exe,单击BW2000中的Track,
然后运行 Exescope.exe, 得到加壳入口
点004b1ec4,退出BW2000和Exescope (用冲击波检测加壳入口点)
2. 运行trw2000,然后装入Exescope.exe
3. 在TRW2000中下命令 g 004b1ec4 (去到加壳入口点)
4. 待去到加壳入口点后,下命令 suspend
5 待回到系统界面后,运行Procdump.exe (用Procdump进行去壳)
6. 跟住点击Procdump上窗口中Exescope.exe
7. 接着光标放到下窗口中的EXEscope.exe, (方法⑴)
然后按鼠标右键,选择Dump (Full),接着
保存脱壳文件,单击确定后退出.
******** 或 *********************
光标对住上窗口中的EXEscope.exe后, (方法⑵)
然后按鼠标右键,选择Dump (Full),接着 (脱壳试哪个脱壳文件可在
保存脱壳文件,单击确定后退出. WIN2000和ME/98下可运行)
完成后,当然是收工啦!!!

方法二 (脱壳需要工具:TRW2000 1.23)
1. 运行Bw2000.exe,单击BW2000中的Track,
然后运行 Exescope.exe, 得到加壳入口
点004b1ec4,退出BW2000和Exescope (用冲击波检测加壳入口点)
2. 运行trw2000,然后装入Exescope.exe
3. 在TRW2000中下命令 g 004b1ec4 (去到加壳入口点)
4. 在TRW2000中下命令 makepe (TRW会在PCG目录下产生个脱壳文件Newpe.exe)
完成,收工

以上脱壳后的软件均可在win98/nt/win2000平台下运行.
软件脱壳通辑令中的脱壳均利用工具进行脱壳.


Armadillo2.0

作者：hying
发贴时间： 2001-6-16 17:35:31

Armadillo2.0脱壳实战
前言：Armadillo2.0是最新的加密软件，对于不了解的人可能强度很高，但是一旦掌握方法解决起来是非常方便的。
研究对象：windows自带的notepad.exe(52K)
一：先找一个Armadillo2.0，阿伦主页就有。下载下来安装好用它对notepad.exe加密，产生一个新的notepad.exe大小为200K。运行它，在同一目录下会产生一个notepad.tmp0，大小也为52K，把它复制一份，命名为note.exe。
二：用十六进制编辑器打开note.exe观察，发现所有部分基本均正常，只有代码段变成了一串"xxxxxxx"，那接下来就修补它。观察它的段表知道它的代码段在文件中的偏移从400开始，在内存中地址为401000到405000。先运行notepad.exe，再运行winhex，选编辑内存，选其中的notepad.tmp0的主内存，将里面从401000到405000的内容复制下来（在代码段最后一般会有很多的"000000"，不要复制它们），打开note.exe，从400处开始替换掉空白的代码段。好了脱壳基本完成，还差最后一步，现在note.exe的入口地址是403EA3（不同机器可能不同），这是个错误的地址，需要修正。
三：寻找正确的入口地址。运行trw2000，下faults off。用trw2000随便载入一个程序，载入后马上观察它的ESP值为64FE3C，而[64FE3C]=BFF8B86C，而且不管载入什么程序，这个值是不变的。那么BFF8B86C处是什么呢？如下：
0167:BFF8B852 PUSH EAX
0167:BFF8B853 PUSH DWORD 0500
0167:BFF8B858 CALL BFF8181C
0167:BFF8B85D MOV DWORD [EBP-04],00
0167:BFF8B864 MOV EAX,[EBP-2C]
0167:BFF8B867 CALL BFF74399 <-注意
0167:BFF8B86C MOV [EBP-28],EAX
0167:BFF8B86F JMP SHORT BFF8B88B
0167:BFF8B871 PUSH DWORD [EBP-14]
0167:BFF8B874 CALL `KERNEL32!UnhandledExceptionFilter`
0167:BFF8B879 RET
我们试着下断点bp bff8b867，再运行一个程序，果然断了下来，用F8进入看到如下：
0167:BFF74399 CMP EAX,80000000
0167:BFF7439E JNC BFF743B5
0167:BFF743A0 BTR WORD [FS:1C],01
0167:BFF743AA JNC BFF743B5
0167:BFF743AC PUSHF
0167:BFF743AD OR DWORD [ESP],0100
0167:BFF743B4 POPF
0167:BFF743B5 JMP EAX <-注意
0167:BFF743B7 INT3
F10单步跟踪，我们将由下面的JMP EAX跳到程序的真正入口。这就是系统载入程序的方法？
再次运行notepad.exe，程序第一次停在bff8b867，不管它，G，出现一个未注册提示，按确定后第二次又停下来，我们跟进去，发现由JMP EAX跳到了403EA3，就是错误的程序入口，此时还是有ESP=64FE3C，[64FE3C]=BFF8B86C，我们下断点bpm 64fe38,然后G，我们停在这儿：
0167:BFF94D32 MOV [EDX]，ECX
0167:BFF94D34 MOV EAX，[EBP-04] <-停在这儿
0167:BFF94D37 MOV DWORD[EAX+24]，BFF76920
0167:BFF94D3E MOV ESP，EBP
0167:BFF94D40 POP PBP
0167:BFF94D41 RET 04
看一下ECX的值，是4010CC。我们用F10走，到如下：
Kernel32!DebugBreak
0167:BFF76920 INT3
0167:BFF76921 RET <-这儿
0167:BFF76922 INT3
程序将从上面的RET跳到4010CC，这就是程序的正确入口，也可以在上面的BFF94D34处直接G，由于上面的RET用到[64FE38]的值，所以我们将直接停在程序入口处。找到入口点后，将note.exe修正一下就可以运行了。而且程序与未加密的notepad.exe几乎分毫不差。是不是很简单？
四：另一种方法。就是在入口点DUMP程序，然后修复输入表。Import REConstructor v1.2完全可以胜任。
注意：上面的BFFxxxxx这种地址在不同的机器上可能不相同，以代码为准！
BTW：放弃Armadillo吧，还是ASProtect最难脱！
由于水平有限，如有错误之处请指正。
hying[CCG]
2001年6月16日


Remote Administrator v2.0

 标 题:脱Remote Administrator v2.0的壳 (8千字)
发信人:fs0
时 间:2001-6-24 19:29:59
详细信息:
Remote Administrator v2.0
http://www.famatech.com/radmin20.zip : size 1,482,243 bytes
Radmin.exe : size 1,032,192 bytes

你是怎么知道它是用Armadillo加的壳？fiv245报是VC6的，但是它的确是经过了处理，OEP是 ACEBFC。
加壳程序并不像其它的把被还原出来数据放到已预定下来的section里，而是放在动态分配出来的空间，
所以pedump dump出来的exe也不过是加壳还原程序，这真的让我们一下子束手无策！

bpmb ds:acebfc w，发现 1401422 的 CALL 1401BE0 就是还原代码到OEP的。
再细看加壳还原程序就知道有六个 section 通过上面的call被还原了。
分别是:
RVA size alignment
1000 3822A 39000
3A000 4C7A 5000
3F000 1E13C 1F000
5E000 447C 5000
63000 400 1000
64000 11C18D 11D000

[0140FE30] 存放原image base : AA0000

往上看在 140137E 有 CALL 1401BE0，这里是“还原”PIMAGE_NT_HEADERS32，好像什么都有了，
将 AA0000 到 AA0000 + 64000 + 11D000 (section alignment是1000) dump出来不就行了吗？
唔？没有图标？用Peditor看section table，才五个section，什么都是空的，看directory的
resource又说出错，惨了，初步断定无药可救！

再用eXeScope看原Radmin.exe，在resource里看到有ICON, MENU, BITMAP等等，反正算是齐全了。
对，就是差这些了，把这些resource加到刚才dump出来的exe里去！
directory里的resource RVA : 11000, size : EB498，不就是整个.rsrc section吗。

好，先把dump出来exe的entry point改为 2EBFC， image base改为 AA0000，directory 里所有的RVA, size先全改为0
再将每个section的正确值修改回去，如上列出的
第一个section
name : (随便)
Virtual Address : 1000
Virtual Size : 39000
Raw Offset : 1000
Raw Size : 39000
Characteristics : E00000E0
如此类推，最后加上我们的.rsrc，resource section. RVA 181000, size 11D000，改directory的
resource RVA 181000, size EC000。

用Hex workshop将Radmin.exe的.rsrc section(Offset 10000, size EC000) copy出来，
追加到dump出来exe的最后，存盘，咦？依然未见图标？？

再用Peditor看directory的resource的详细列表，ICON, MENU, BITMAP等等都有了，选中cursor
下的21子项，在Item Info 组合框中的 RVA to Data 是 393A8，size : 134。
哦，原来RVA 393A8 并不是指向我们新加的.rsrc section。
最笨的方法就是把这些RVA to Data逐个修正过来，可是Peditor不可以修改该值，天啊，天晓得在.rsrc这堆“垃圾”里改哪个值才是！
还是写程序吧，幸好在找有关resource结构的时候找到有列举resource的程序，修改一下就可以用了。

以下程序是裁剪并修改MSDN 的 Peering Inside the PE: A Tour of the Win32 Portable Executable File Format里的程序，
(那些printf 我都没有去掉)， fix_value 就是要修正的量。
new section RVA old section RVA alignment diff
| | |
DWORD fix_value = 0x181000 - 0x10000 - 0x1000;
resDataEntry->OffsetToData = resData_RVA + fix_value;

先把.rsrc整个section save as 为res.bin, 程序是将res.bin map到内存，再修改OffsetToData，
记住运行一次该程序就可以了，再将该res.bin粘贴回dump出来的exe去，exe图标就会出现了。

最后是import table的重建了(唉，太累了!!!)。
在Import REConstructor的OEP里填2EBFC，get import不成功，原因是OEP所对应的image base 是AA0000，
而不是01400000，在load radmin.exe, trw里下 mod32. 显示:
hMod PEHeader Base Module No ModuleName
---- -------- -------- -------- -- ----------
xxxx 81991A58 01400000 xxxxxxxx xx RADMIN.EXE

d ds:81991A58 + 34 处就是image base 01400000，改其为 00AA0000
再在Import REConstructor 里get import就成功了，只有一个1401000不知道, 暂定为GetModuleFileNameA。
(后来没仔细看对不对了)，至此脱壳完成。程序有自检，这里就不说了。

/* fixres.cpp */
/* cl fixres.cpp user32.lib */

#include <stdio.h>
#include <windows.h>

BOOL bFixIt = TRUE;
DWORD fix_value = 0x181000 - 0x10000 - 0x1000;

// Function prototype (necessary because two functions recurse)
void DumpResourceDirectory
(
PIMAGE_RESOURCE_DIRECTORY resDir, DWORD resourceBase,
DWORD level, DWORD resourceType
);

// The predefined resource types
char *SzResourceTypes[] = {
"???_0", "CURSOR", "BITMAP", "ICON", "MENU", "DIALOG", "STRING", "FONTDIR",
"FONT", "ACCELERATORS", "RCDATA", "MESSAGETABLE", "GROUP_CURSOR",
"???_13", "GROUP_ICON", "???_15", "VERSION"
};

// Get an ASCII string representing a resource type
void GetResourceTypeName(DWORD type, PSTR buffer, UINT cBytes)
{
if ( type <= 16 )
strncpy(buffer, SzResourceTypes[type], cBytes);
else
wsprintf(buffer, "%X", type);
}

//
// If a resource entry has a string name (rather than an ID), go find
// the string and convert it from unicode to ascii.
//
void GetResourceNameFromId
(
DWORD id, DWORD resourceBase, PSTR buffer, UINT cBytes
)
{
PIMAGE_RESOURCE_DIR_STRING_U prdsu;

// If it's a regular ID, just format it.
if ( !(id & IMAGE_RESOURCE_NAME_IS_STRING) )
{
wsprintf(buffer, "%X", id);
return;
}

id &= 0x7FFFFFFF;
prdsu = (PIMAGE_RESOURCE_DIR_STRING_U)(resourceBase + id);

// prdsu->Length is the number of unicode characters
WideCharToMultiByte(CP_ACP, 0, prdsu->NameString, prdsu->Length,
buffer, cBytes, 0, 0);
buffer[ min(cBytes-1,prdsu->Length) ] = 0; // Null terminate it!!!
}

//
// Dump the information about one resource directory entry. If the
// entry is for a subdirectory, call the directory dumping routine
// instead of printing information in this routine.
//
void DumpResourceEntry
(
PIMAGE_RESOURCE_DIRECTORY_ENTRY resDirEntry,
DWORD resourceBase,
DWORD level
)
{
UINT i;
PIMAGE_RESOURCE_DATA_ENTRY resDataEntry;
DWORD resData_RVA;

char nameBuffer[128];

if ( resDirEntry->OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY )
{
DumpResourceDirectory( (PIMAGE_RESOURCE_DIRECTORY)
((resDirEntry->OffsetToData & 0x7FFFFFFF) + resourceBase),
resourceBase, level, resDirEntry->Name);
return;
}

// Spit out the spacing for the level indentation
for ( i=0; i < level; i++ )
printf(" ");

if ( resDirEntry->Name & IMAGE_RESOURCE_NAME_IS_STRING )
{
GetResourceNameFromId(resDirEntry->Name, resourceBase, nameBuffer,
sizeof(nameBuffer));
printf("Name: %s Offset: %08X\n",
nameBuffer, resDirEntry->OffsetToData);
}
else
{
printf("ID: %08X Offset: %08X\n",
resDirEntry->Name, resDirEntry->OffsetToData);
}
resDataEntry = (PIMAGE_RESOURCE_DATA_ENTRY)(resDirEntry->OffsetToData + resourceBase);
resData_RVA = resDataEntry->OffsetToData;
printf("Resource data RVA is : %08X\n", resData_RVA);
if ( bFixIt )
resDataEntry->OffsetToData = resData_RVA + fix_value;
}

//
// Dump the information about one resource directory.
//
void DumpResourceDirectory
(
PIMAGE_RESOURCE_DIRECTORY resDir,
DWORD resourceBase,
DWORD level,
DWORD resourceType
)
{
PIMAGE_RESOURCE_DIRECTORY_ENTRY resDirEntry;
char szType[64];
UINT i;

// Spit out the spacing for the level indentation
for ( i=0; i < level; i++ )
printf(" ");

// Level 1 resources are the resource types
if ( level == 1 && !(resourceType & IMAGE_RESOURCE_NAME_IS_STRING) )
{
GetResourceTypeName( resourceType, szType, sizeof(szType) );
}
else // Just print out the regular id or name
{
GetResourceNameFromId( resourceType, resourceBase, szType,
sizeof(szType) );
}

printf(
"ResDir (%s) Named:%02X ID:%02X TimeDate:%08X Vers:%u.%02u Char:%X\n",
szType, resDir->NumberOfNamedEntries, resDir->NumberOfIdEntries,
resDir->TimeDateStamp, resDir->MajorVersion,
resDir->MinorVersion,resDir->Characteristics);

resDirEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resDir+1);

for ( i=0; i < resDir->NumberOfNamedEntries; i++, resDirEntry++ )
DumpResourceEntry(resDirEntry, resourceBase, level+1);

for ( i=0; i < resDir->NumberOfIdEntries; i++, resDirEntry++ )
DumpResourceEntry(resDirEntry, resourceBase, level+1);
}

//
// Top level routine called to dump out the entire resource hierarchy
//
void DumpResourceSection( LPVOID pmapbase )
{
IMAGE_RESOURCE_DIRECTORY *resDir;

resDir = (IMAGE_RESOURCE_DIRECTORY*) pmapbase;
printf("Resources\n");
DumpResourceDirectory(resDir, (DWORD)resDir, 0, 0);
}

int main( void )
{
HANDLE hfile, hMap;
LPVOID p_MapFile;

if ( (hfile = CreateFile("res.bin", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE )
{
printf("Can not open file res.bin\n");
exit(1);
}

if ( (hMap = CreateFileMapping(hfile, NULL, PAGE_READWRITE, 0, 0, NULL)) == NULL )
{
CloseHandle( hfile );
printf("Can not create file mapping!\n");
exit(1);
}

if ( (p_MapFile = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0)) == NULL )
{
CloseHandle( hfile );
CloseHandle( hMap );
printf("Can not map file!\n");
exit(1);
}

__try
{
DumpResourceSection( p_MapFile );
}
__except(1)
{
printf("Error when processing file!\n");
}
UnmapViewOfFile( p_MapFile );
CloseHandle( hfile );
CloseHandle( hMap );

return 0;
}


VB power wrap V1.7

 标 题:手動脫殼的方法. (975字)
发信人:1212
时 间:2000-9-17 22:53:30
详细信息:
噫!我以前貼過Armadillo的脫殼方法,怎麼不能舉一反三.
[目標軟體]:VB power wrap V1.7
[保護機制]:Armadillo保護,防Soft-ICE,時間限制.
[使用工具]:1.Trw2000
2.Bw2000
3.Procdump32
4.Regmon
[手動脫殼]:1.第一次執行被Armadillo保護的軟體,Armadillo會在C:\WINDOWS\TEMP\的目錄下解壓一個Armxxxx.tmp的文件,這是保護系統的dll,程式用它Anti-Debugger,設置時間標誌等等,並將所取得的環境資訊寫入註冊表中,以供程式比對運用,這個Key的路徑在HKLM\Software\The Sillicon Realms Toolworks\Armadillo,故若你的軟件試用期已過,你便需要把這個Key刪除,重新獲得試用。
2.若你有安裝Soft-ICE,須先把它移除,以利作業,首先執行BW2000,按track,再執行vbrap.exe,首先在BW2000中顯示004085BB,等到NagBox出現,按OK後會再出現一個位址0048535 C這是VBRAP.tmp0的OEP這才是我們要的。
3.用Trw2000載入vbrap.exe,下faults off,再下G 0048535C等到NagBox出現按OK後程式會中斷在0048535C,再下makepe(不是很穩定)或下suspend用Procdump32,選VBRAP.tmp0,dump(full),改OEP等於0008535C即可脫殼.
C-pen 2000\9\17


aspack 2.1

 标 题:r!sc some about The new aspack 2.1 (1千字)
发信人:1212
时 间:2000-10-25 11:59:57
详细信息:
Some words from r!sc
--------------------------------------------------------------------------------
I had the same problem with 'ImageEye v5.1'

The OEP is hardcodet and decryptet, here the tip,
r!sc me gave:

hehe, looks like he is using asprotects mighty morphing stub decryptor (and encryptor)

simple decryptor..

004514A0 loc_4514A0: ; CODE XREF: .aspack:004514DCj
004514A0 mov edx, 0E120074Fh
004514A5 xor esi, 27924507h
004514AB dec byte ptr [ebp-4F0C28Fh] ; do the actual 'decryption'
004514B1 mov edx, 0EB8B32D1h
004514B6 sub esi, 2146BC41h
004514BC inc ebx
004514BD mov esi, 0C34E0847h
004514C2 mov si, cx
004514C5 xor dh, 13h
004514C8 sub ebp, 1
004514CE mov si, bx
004514D1 mov edi, ebx
004514D3 movsx ecx, di
004514D6 cmp edi, 0FCF03D3Ah
004514DC jnz loc_4514A0 ; loop until finished 'decrypting' stub

so, the simple decryption is dec byte ptr .. the rest, apart from 'sub ebp, 1 / inc ebx / mov edi, ebx / cmp edi, 0FCF03D3Ah / jnz loc_4514A0' is junk code..

the exit point ..

0137:004513B5 6800000000 PUSH 00000000
0137:004513BA C3 RET

the exit point again

0137:004513B5 6889DA4200 PUSH 0042DA89
0137:004513BA C3 RET

so, 0042DA89 is the original entrypoint .. sub imagebase = 0002da89 .. = search for 89 da 02 00 ..

oi, but its decrypted @ runtime! lets encrypt the data we have .. inc byte ptr will encrypt it..

so 89 da 02 00 -> 8a db 03 01 ! ..

search for that, u find @ offset .aspack + 7dh (somewhere around file offset 21a7dh)

say i insert patch code in the pe header, offset 300h .. would load into va 400300h .. edit entrypoint (.aspack +7dh) -> 01 04 01 01 .. decrypts to 00 03 00 00 which is dd 00000300h + imagebase = 00400300h :d

any questions?

btw, heres the push 00000000, ret, encrypted ;) .. 69 01 01 01 01 C4 .. :/

Hope this helps


Asprotect by C-pen

 标 题:淺談脫Asprotect1.07的殼. (2千字)
发信人:C-pen
时 间:2000-9-25 17:45:10
详细信息:
[前 言]:有許多朋友問我關於Asprotect1.07版的脫殼方法,我想我在這裡簡單寫一下,或許對各位有幫助,或許沒有,無論如何總是一個經驗分享,我使用Imp_list來做為重建Import Table的工作,這並非正統,若你的實力夠的話,建議你還是寫個程式來重建.不過Imp_list已經有針對Asprotect1.07升級了,只是沒有開放當漏罷了.
[目標軟件]:Advanced Word 95 Password Recovery V1.2
URL: http://www.elcomsoft.com/aw95pr.html
為什麼選它,嘻!因為它只要修正3個API(Thanks God!)
[使用工具]:1.Soft-ICE 4.01
2.Icedump
3.Procdump32
4.BW2000
5.Imp_list
[脫 殼]:
1. 先用Procdump32和BW2000 去分析我們要的資料:
Size of image:33000
Image base:400000
原始的程式進入點(OEP):401000
.idata VO:8000(執行Imp_list就會知道)
2. 執行Imp_list,會產生Address.txt,Import1.bin,Import2.bin沒有最重要的Import0.bin沒關係,打開Address.txt你會發現Shell32.dll和Comdlg32.dll它們的函數成員是亂碼,這就是新版的Asprotect的保護機制,它先不還原這些API等到程式要用時它才會還原APIname,Call GetProcAddress去得到函數位址再返回這個位址去執行程式.
記下這些指針:Shell32.dllà 006C2024
Comdlg32.dllà 006C249C
006C24B8
3. 叫出Soft-ICE下bpx createfilea do “d *(esp+4)”,執行AW95pr.exe攔住後,按F5一次,按F12返回,按F10Trace,此時是在第一段的CRC chek
按F10一直到一連串的Jmp,Mov,此時就要按F8小心Trace,它ret會到Kernel的領空,你一直按F8會返回Aw95pr的領空,若按F10程式就會執行,來到Aw95pr的領空,再按F10Trace,如此反覆數次,一直到出現Asprotect的編碼程式,此時下d 408000, 往下找,你會看到編碼後的指針,你會看到3類指針,
(1)API位址 (2)Call XXXXXXXX <-- 這兩種是可用Imp_list重建
(3)Push XXXXXXXX
Call XXXXXXXX <--這裡就是那些Shell32.dll,Comdlg32.dll編碼的地方
我們的思路就是知道這些第三類指針代表那些API和求得它的位址,再將這些位址代入指針,再使用Imp_list來順利重建.
那這些函數如何求?
我們以006c2024為例,下d 006c2024會看到68 2e 20 6c 00,下d 006c202e,會看到65 17 6c 00,再下d 006c1765,你會看到Shell32.dll,在它的後面有一組數據9F 0E C3 2B C1 AB 66 81 14 37 AE 0C 54 50 91 EC
DC 20 (9F –重此開始, 0E—表示API有0Eh個字元, DC—表中斷)
其實從C3~EC這是未還原的API Name,它會跟一組變數取XOR後還原.
再繼續Trace下去,一直來到OEP即00401000,下/dump 400000 33000C:\Awdump.exe
,下Bpx 006C2024,006C249C,006C24B8
按F5,程式出現,點Open file,程式中斷在006C249C,按F8Trace,你會發現這個Call在還原API Name=GetOpenFileNameA,Address=52086112
,再按Save中斷在006C24B8,API Name=GetSaveFileNameA,Address=52086163,再按Save一次,再中斷在006C24B8,下a eip/jmp 006C2024(偷吃步,因為只剩下一個API)得到API Name=ShellExecuteA,Address=7FD47579
再進去AW95pr,在00401000(即OEP處)改006C2024-->7FD47579
006C249C-->52086112
006C24B8-->52086163
清掉Hint,f 00408550 l 00408fc0-00408550 00
再用Imp_list去重建Import Table,這次會很成功,且有Import0.bin
最後的工作大家應該都會做,不再贅述.
很報歉!!寫的很亂,希望對大家有幫助.
JOHNSON 2000/09/25


C-pen谈Asprotect1.0

标 题:请C-Pen大侠给与指教。。。 (181字)
发信人:1212
时 间:2000-10-8 21:14:50
详细信息:

4)用Hex Workshop打開Import1.bin,從偏移1000處開始選方塊728
將其貼至iGdump.exe的,rdata section的Raw Offset處, 即
004B600.

能告诉我这些数据的来历吗？谢谢！！

标 题:补充。。。 (181字)
发信人:1212
时 间:2000-10-8 21:29:11
详细信息:

igame.exe的.rdata section的Raw Offset值为：26E00，那么0004B600
是怎么来的呢？

另外，为何从Import1.bin的偏移1000处剪 728H个字节？728H又是怎么
的来的？

请多指教，谢谢！

标 题:請進! (1千字)
发信人:C-pen
时 间:2000-10-9 9:14:40
详细信息:

Asprotect1.0針對只有.rdata section的編碼方式,是它會將Image_Thunk_D
ata這個矩陣結構放在.rdata section的開頭,即004C0000開始,Size是728h
而Import1.bin則是Image_Thunk_Data所對應的API位址; 我們為什麼要將API
的位址粘貼至Image_Thunk_Data中呢? 因為Asprotect1.0(1.07以上編碼方式
又不同)會將Image_Thunk_Data分成兩類:
(1)01xxxxxx <-- Asprotect的轉換Code
(2)API位址
舉個例子來說明: 例如iGame.exe它要調用RegCloseKey這個API時, 它的代碼
是這樣的:
Call [004C0000] <-- (A)
其中的[004C0000]在未脫殼時, 其值是01xxxxxx,上面的Code(A)可寫成
Call 01xxxxxx, 再經Asprotect的轉換會指向RegCloseKey的位址即
BFEA1644, 其時它最終可寫成
Call BFEA1644
但是當我們脫殼後,01xxxxxx的Code以不復存在,所以我們才用BFEA1644去取代
01xxxxxx,讓程式能直接去Call這個API,基本原理就是那麼簡單.
最後你問到iGame.exe的Raw Offset是26E00怎麼會粘貼至4B600處, 你仔細看文章,我寫的是粘貼至iGdump.exe(即我們dump下來的程式)它的Raw Offset是4B600,這是Procdump分配的, 若還有疑問我建議你再多讀點PE結構的
資料,會比較容易吸收, 祝好運!!!
JOHNSON 2000\10\09


FTPrint

标 题:FTPrint的脱壳(asprotect) (2千字)
发信人:henryw
时 间:2001-2-5 10:26:27
详细信息:
FTPrint的脱壳(asprotect)

小弟只是菜鸟一个，看了冰毒的AZPR3.0脱壳的文章，还有hying对于HTMLZip脱壳写的文章，受益匪浅，先拿Advanced Registry Tracer做了实验（Ken写过脱壳的方法），然后拿来了FTPrint这个软件，独立战斗，结果成功。(软件在哪里下载的我不记得了，估计在华军主页上吧)

不过，仍有不明白的地方。就是hying兄使用的imp_list.exe在这个软件中似乎dump不出正确的.idata，如果哪位兄台成功了，请告知详细方法。

软件介绍：
_________

一般打印都是在图形模式下，而FTPrint可以在文本模式下打印，这样打印更加快速，更加省墨，特别是对于喷墨打印而言。

加壳：
_____

asprotect 1.00 (FI检测)

使用工具：
_________

TRW2000
PE-Editor
冲击波2000
HEX WORKSHOP

过程：
_____

1. 使用冲击波2000探测入口，在46B8AC。
2. PE-Editor查看Section，.idata的Virtual Size=3000，Virtual Offset=77000，ImageBase=400000。
3. 用TRW2000载入FTPrint.exe，
（1）g 46B8AC，
（2）pedump h.exe
4. 运行FTPrint，退出，然后再Load FTPrint。
[以下借用冰毒在其文AZPR3.0的脱壳中的方法，文见看雪兄的论坛精华II]
下bpm 477000 (Virtual Offset + ImageBase)，在3次g后用F10追，直到
016F:004E8369 50 PUSH EAX
016F:004E836A B894764E00 MOV EAX,004E7694
016F:004E836F 50 PUSH EAX
016F:004E8370 B8A8764E00 MOV EAX,004E76A8
016F:004E8375 50 PUSH EAX
016F:004E8376 6A00 PUSH BYTE +00
016F:004E8378 B8B0764E00 MOV EAX,004E76B0
016F:004E837D 50 PUSH EAX
016F:004E837E B830A54D00 MOV EAX,004DA530
016F:004E8383 50 PUSH EAX
016F:004E8384 8B4508 MOV EAX,[EBP+08]
016F:004E8387 8B4020 MOV EAX,[EAX+20]
016F:004E838A 50 PUSH EAX
016F:004E838B 8B4508 MOV EAX,[EBP+08]
016F:004E838E 8D4824 LEA ECX,[EAX+24]
016F:004E8391 8B4508 MOV EAX,[EBP+08]
016F:004E8394 8B500C MOV EDX,[EAX+0C]
016F:004E8397 8B4508 MOV EAX,[EBP+08]
016F:004E839A 8B4008 MOV EAX,[EAX+08]
016F:004E839D E8FEF4FFFF CALL 004E78A0
016F:004E83A2 33C0 XOR EAX,EAX <-------- RET在这里，dump .idata
TRW2000为w 477000 l 3000 idata.bin(文件名字自己定的)
5. 运行FTPrint，退出，关闭TRW2000。

以下为修复PE:
6. PE-Editor打开h.exe，Directory按钮，改Import Table的RVA为77000，Size为3000。退出PE-Editor。
7. Hex Workshop打开h.exe，go到77000，选定Block为3000，然后再打开idata.bin（干净的import table），选定Block为3000，拷贝，粘贴到打开的h.exe中，存盘。

这样应该就可以了。

由于初学脱壳，文中有不妥之处还请多指教。


HTMLZip

标 题:HTMLZip脱壳后的Import Table的修复 (750字)
发信人:henryw
时 间:2001-2-10 23:36:15
详细信息:
HTMLZip脱壳后的Import Table的修复

启动HTMLZip, 然后启动imp_list.exe。

找到HTMLzip.exe，去掉autodetect前的框。RVA输入57000，长度3000。

Rebuilder后有三个文件，Import0.bin, Import1.bin, Import2.bin。

一、适用trw2000的pedump脱壳后的文件
（1）打开Import0.bin，全选，选中2C00个字节，复制
Hex Workshop打开脱壳后文件，Go to 57000，选中2C00个字节，
粘贴。存盘。
（2）用PE-editor打开修改后的文件，按directory按钮，将IMPORT Table RVA改为57000, 长度为3000就可以了。

二、适用与ProcDump脱壳后的文件
（1）用pe-editor看section，发现有57000的section的Raw Offset为54A00。
改Entry Point为542E4。存盘退出。
（2）打开Import1.bin，全选，共924个字节，copy。
（3）打开脱壳后的文件，goto 54A00，选924个字节，paste。存盘就可以了。不用其他改动。

标 题:手动脱HTMLZip的壳(asprotect)[通用方法] (5千字)
发信人:henryw
时 间:2001-2-10 23:35:22
详细信息:

手动脱HTMLZip的壳(asprotect)

有幸认识了hying兄，结果hying兄教了我如下方法进行Asprotect1.1版本以上的脱壳。
hying兄要我成功后贴个贴子，我的文笔不好，只好迎着头皮上了。

软件： HTMLZip 1.0 Beta (下载地址为：)
工具： TRW2000

TRW2000装入程序，一直到下面的连续五个Call应该如何跟，还是等Hying兄的文章吧。
告诉大家一个偷懒的办法，如果前面跟了很久也没看到这5个call的典型地方，就按F12，
一次一次地按，直到按下F12后要等将近10秒甚至更多时间才回到trw时，就按F8，
这就到了。:)

(我的系统是WinMe，其他系统会有不同的xxxx:xxxxxxxx)
016F:01110684 PUSH EBP
016F:01110685 MOV EBP,ESP
016F:01110687 ADD ESP,BYTE -0C
016F:0111068A CALL 01102F7C
016F:0111068F JNZ NEAR 01103C58
016F:01110695 CALL 01104114
016F:0111069A CALL 01108894
016F:0111069F CALL 01109224
016F:011106A4 CALL 0110B584
016F:011106A9 CALL 01103C58 <-------- 这个Call进去。
016F:011106AE MOV ESP,EBP
016F:011106B0 POP EBP
进去后按F10跟，期间能够遇到2个Call，都用F10带过，当走过第二个RET后，
(懒人可按F12, F8, F12, F8)
代码会变成：
016F:0110F4CA MOV EAX,[ESP+0C]
016F:0110F4CE JMP SHORT 0110F4D1
016F:0110F4D1 ADD DWORD [EAX+B8],BYTE +02
016F:0110F4D8 JMP SHORT 0110F4F4
下面两行动态生成：
016F:0110F4F4 XOR EAX,EAX
016F:0110F4F6 RET <--------停，看stack窗口，会看到xxxxxxxx:BFFxxxxxx
016F:0110FC4F CALL 0110D304
016F:0110FC54 CMP DWORD [01112578],BYTE +00
然后下u命令翻页，在最近的地方设断点。
此时能看到如下代码：(110F4F4，110F4F6为动态生成，翻页后就不见了。)
016F:0110F51F PUSH DWORD 0110F600
016F:0110F524 PUSH DWORD 0110EF20
016F:0110F529 PUSH DWORD 0110EBC8
016F:0110F52E PUSH DWORD 0110E58C
016F:0110F533 PUSH DWORD 0110E118
016F:0110F538 PUSH DWORD 0110F27C
016F:0110F53D RET <------- 在这里下断点，然后G可到这里。
bd这个断点，再F8。以下用F10走，看见类似于
016F:0110F4CA MOV EAX,[ESP+0C]
016F:0110F4CE JMP SHORT 0110F4D1
016F:0110F4D1 ADD DWORD [EAX+B8],BYTE +02
016F:0110F4D8 JMP SHORT 0110F4F4
016F:0110F4F4 XOR EAX,EAX
016F:0110F4F6 RET <---------------停，看stack窗口，会看到xxxxxxxx:BFFxxxxxx
就翻页找最近的RET，重复下断点，F5, bd断点，F8继续。
如此大约我进行了7次。

======================以上就是hying兄教我的方法=============================

再接着往下说之前先讲个跟踪原则：
*************************************************
* xxxx:AAAAAAAA CALL BBBBBBBB *
* 当跟踪时看到一个Call的时候，要看看 *
* BBBBBBBB是不是比AAAAAAAA大，如果是， *
* 用F8；如果不是，用F10带过。 *
*************************************************
（当然，原则会有例外，下面会讲到什么情况下原则不适用。）

现在开始，利用上面说的原则，用F8或者F10追吧。
到了这里需要注意了，下面这段代码细看和我们前面遇上的有些不同。
016F:0110F263 RET
016F:0110F264 MOV EAX,0111290C
016F:0110F269 MOV EDX,0A
016F:0110F26E CALL 0110B8D4 <------- 离110F26E很远
016F:0110F273 CALL 0110F0E4 <------- 离110F273很近，这个Call一定用F8进去，否则GameOver。
016F:0110F278 RET
*********************************************************
* 这就是原则例外(1). 当看见两个Call并在一起， *
* BBBBBBBB都<AAAAAAAA，但是第二个CALL的 *
* BBBBBBBB和AAAAAAAA相差不如第一个悬殊，用F8。 *
*********************************************************
很快会走到这里，看到USER32!MessageBoxA，标志着离终点不远了。
016F:0110F1EE PUSH BYTE +00
016F:0110F1F0 CALL `USER32!MessageBoxA` <-------- 注意!!!!!!!!!!!!!!!!
016F:0110F1F5 CALL 01102CDC
016F:0110F1FA XOR EAX,EAX
016F:0110F1FC POP EDX
016F:0110F1FD POP ECX
016F:0110F1FE POP ECX
016F:0110F1FF MOV [FS:EAX],EDX
016F:0110F202 JMP SHORT 0110F20E
016F:0110F204 JMP 01102B70

往下慢慢走，继续遵循我们的原则，来到这里，这是1126C1执行以前的代码：
016F:01126C61 CALL 01126C7E <---- 观察下面代码，是不是很“乱”？
这里一定用F10带，F8就GameOver了。
016F:01126C66 NOP
016F:01126C67 MOV BH,86
016F:01126C69 MOV EDI,GS
016F:01126C6B CALL 1A22A1A4
016F:01126C70 DB FF
016F:01126C71 JNG 01126C3D
016F:01126C73 ROR DWORD [ECX+EDX],E2
016F:01126C77 HLT
016F:01126C78 MOV BH,1A
016F:01126C7A REPNE POP EDI
016F:01126C7C IDIV DWORD [EBX]
016F:01126C7E AND EAX,BYTE -68
*************************************************
* 这里是原则例外(2)， *
* 走过USER32!MessageBoxA以后， *
* 看到类似上面这个Call，下面代码很“乱” *
* 一定用F10带过。 *
*************************************************
这就是F10执行1126C1以后的代码：
016F:01126C61 CALL 01126C7E
016F:01126C66 POP EBX
016F:01126C67 POP EAX
016F:01126C68 ADD EAX,33371CB8
016F:01126C6D POP ESP
016F:01126C6E OR ECX,ECX
016F:01126C70 JZ 01126C55
016F:01126C72 MOV [ECX],EAX
016F:01126C74 ADD EAX,EBX
016F:01126C76 MOV [ESP+1C],EAX
016F:01126C7A POPA
016F:01126C7B JMP EAX <------- 终于到家了，注意Eax的值，这就是入口值。

以上这个原则其实是hying兄方法的复杂操作，但是有时遇上
xor eax, eax
ret
最近的ret只能断一次时，就有用了。比如PictureToExe这个东东的asprotect脱壳。
用上述原则，就能成功脱掉Asprotect。

想作练习的话，可以找Advanced System Agent，前面有人在论坛上要求脱壳的，虽然
可以用冲击波，不过练习一下纯手动脱壳也不失为一个好教材。


HTMLZip 1.0 beta

标 题:HTMLZip 1.0 beta 的脱壳 (3千字)
发信人:hying
时 间:2001-2-3 15:03:54
详细信息:
用fi240检测，报告为win gui，说明fi240不认识，但是我估计它是用ASProtect1.0以上版本加的壳，为什么呢？因为我在跟踪过程中发现如下一段代码：
0167:00C00684 PUSH EBP
0167:00C00685 MOV EBP,ESP
0167:00C00687 ADD ESP,BYTE -0C
0167:00C0068A CALL 00BF2F7C
0167:00C0068F JNZ NEAR 00BF3C58
0167:00C00695 CALL 00BF4114
0167:00C0069A CALL 00BF8894
0167:00C0069F CALL 00BF9224
0167:00C006A4 CALL 00BFB584
0167:00C006A9 CALL 00BF3C58
0167:00C006AE MOV ESP,EBP
0167:00C006B0 POP EBP
0167:00C006B1 RET 0C
从ASProtect1.0开始（以前版本没试过），每次都有这样的几个连续的CALL，而且最后一个必须用F8进入。还有它也在输入表里做文章，所以我估计是用ASProtect加的壳。既然是这样，那首先考虑的就是用caspr，但试了一下，脱不了。那就只有手动了。
以前要找程序正确的入口点比较难，有了冲击波2000现在就简单多了。运行冲击波2000 0.2，按下track，然后运行htmlzip，它会弹出一个对话框，确定后程序继续运行。冲击波显示enter point为4542E4。退出htmlzip，运行trw2000。下断点bp 4542E4，再运行htmlzip，程序最终会停在4542E4处，运行命令suspend，暂停htmlzip返回windows下，运行procdump162，在Task中寻找htmlzip，点击右键，选择Dump(full),将htmlzip脱壳保存，比如保存为h.exe，再选择PE Editor,打开h.exe，将Entry Point由1000改为542E4，加上Image Base的400000，实际入口即为4542E4。最后不要忘了，再切回到trw2000，将暂停的程序运行，然后关闭。
如果对于一般的加壳，这样脱后一般就可以了，但由于是用ASProtect加的壳，它改动了程序的输入表（程序调用dll文件的调用入口地址表），所以直接运行会非法操作。需要修复输入表。修复可分全手动与借助特定工具两种，先看全手动。
用trw2000载入h.exe，用F8运行几步后，用d 457100可看到如下：（下面还有很多，不便都贴）
0030:00457100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0030:00457110 00 00 00 00 00 00 00 00-7C 22 C1 00 88 22 C1 00 ........|"???
0030:00457120 94 22 C1 00 A0 22 C1 00-AC 22 C1 00 BC 22 C1 00 ????????
0030:00457130 C8 22 C1 00 D8 22 C1 00-E8 22 C1 00 F4 22 C1 00 ????????
其中的00C1227C、00C12288等就是被破坏后的输入表地址，我们需要把它复原。那这些地址到底指向哪呢？先看00C122C8的指向。运行未脱壳的程序。在4542E4处停下，命令U C122C8，看到：
0167:00C122C8 PUSH EBP \
0167:00C122C9 MOV EBP,ESP >注意这3行
0167:00C122CB SUB ESP,BYTE +08 /
0167:00C122CE PUSH DWORD BFF80262
0167:00C122D3 RET ----------------------------------------|
再用命令U BFF80259，看到： |
0167:BFF80259 RET 04 |
KERNEL32!VirtalAlloc |
0167:BFF8025C PUSH EBP \ |
0167:BFF8025D MOV EBP,ESP >同上3行 |
0167:BFF8025F SUB ESP,BYTE +08 / |
0167:BFF80262 CMP DWORD [EBP+0C],7FC00000 跳到这<-----|
0167:BFF80269 PUSH EBX
我想大家也明白了。C122C8处的空间是程序动态申请的，脱壳时不会被保留，所以脱壳后就无法正常运行，真正的入口点应该是BFF8025C，只要将00C122C8改为BFF8025C，程序运行就正常了。但输入表很长，全部手动很费时间，估计对这个程序得花一天时间才行，而且容易出错。所以还是借助工具来得方便。工具用Imp_list 1.12。
先正常运行htmlzip，再运行Imp_list，在Process name中查找htmlzip然后单击，Module name中会列出它调用的dll文件，去掉Auto-detect import前的钩，在RVA中填入57000，Virtual size改为1000，Level选3，点击Rebuilt import,可能会跳出出错对话框，不用管它，在Imp_list同目录下的Import1.bin中就是正确的输入表，用16进制编辑器将正确的输入表覆盖掉错误的输入表就OK了(不知什么原因，有时用Imp_list重建的输入表是错误的，试几次，凭经验看就可以了)。

标 题:还是有些不明白 (294字)
发信人:henryw
时 间:2001-2-4 8:08:44
详细信息:

由于实在太菜，看了hying大侠的文章，还是有两点不明：

1. "用trw2000载入h.exe，用F8运行几步后，用d 457100可看到如下：（下面还有很多，不便都贴）"

怎么知道要看457100这个地址的？

2. "在RVA中填入57000，Virtual size改为1000，Level选3，点击Rebuilt import"

57000这个地址又是如何得到的？

标 题:请进 (365字)
发信人:hying
时 间:2001-2-4 10:22:37
详细信息:

用trw2000载入h.exe，用F8运行几步，如果走得太多，就会出现非法操作，为什么呢？因为程序跳到了C12560处，此处的程序是原程序动态生成的，脱壳后不会保存。C12560这个地址是放在内存4571FC处，然后前后看一下，差不多是从457100处开始的（再往前都是00）。下面的457000只是取了个整数，你取457100，Virtual size改为F00甚至更小一些也没关系，只要保证把所有的错误地址都包含在里面就可以了。


iGdump

标 题:请C-Pen大侠给与指教。。。 (181字)
发信人:1212
时 间:2000-10-8 21:14:50
详细信息:

4)用Hex Workshop打開Import1.bin,從偏移1000處開始選方塊728
將其貼至iGdump.exe的,rdata section的Raw Offset處, 即
004B600.

能告诉我这些数据的来历吗？谢谢！！

标 题:补充。。。 (181字)
发信人:1212
时 间:2000-10-8 21:29:11
详细信息:

igame.exe的.rdata section的Raw Offset值为：26E00，那么0004B600
是怎么来的呢？

另外，为何从Import1.bin的偏移1000处剪 728H个字节？728H又是怎么
的来的？

请多指教，谢谢！

标 题:請進! (1千字)
发信人:C-pen
时 间:2000-10-9 9:14:40
详细信息:

Asprotect1.0針對只有.rdata section的編碼方式,是它會將Image_Thunk_D
ata這個矩陣結構放在.rdata section的開頭,即004C0000開始,Size是728h
而Import1.bin則是Image_Thunk_Data所對應的API位址; 我們為什麼要將API
的位址粘貼至Image_Thunk_Data中呢? 因為Asprotect1.0(1.07以上編碼方式
又不同)會將Image_Thunk_Data分成兩類:
(1)01xxxxxx <-- Asprotect的轉換Code
(2)API位址
舉個例子來說明: 例如iGame.exe它要調用RegCloseKey這個API時, 它的代碼
是這樣的:
Call [004C0000] <-- (A)
其中的[004C0000]在未脫殼時, 其值是01xxxxxx,上面的Code(A)可寫成
Call 01xxxxxx, 再經Asprotect的轉換會指向RegCloseKey的位址即
BFEA1644, 其時它最終可寫成
Call BFEA1644
但是當我們脫殼後,01xxxxxx的Code以不復存在,所以我們才用BFEA1644去取代
01xxxxxx,讓程式能直接去Call這個API,基本原理就是那麼簡單.
最後你問到iGame.exe的Raw Offset是26E00怎麼會粘貼至4B600處, 你仔細看文章,我寫的是粘貼至iGdump.exe(即我們dump下來的程式)它的Raw Offset是4B600,這是Procdump分配的, 若還有疑問我建議你再多讀點PE結構的
資料,會比較容易吸收, 祝好運!!!
JOHNSON 2000\10\09


ReGet pro V.1.7

 标 题:我簡單說一下ReGet的手動脫殼----C-pen
发信人:1212
时 间:2000-11-24 23:15:35
详细信息:
ReGet pro V.1.7我以前脫過,不過沒留筆記,基本上和我以前寫的脫iGame
的方法一樣,不同的是iGame是ASProtect V.1.0而ReGet是ASProtect V1.07,它們都是只有.rdata Section而沒.idata Section,所以基本上我們只要Rebuild IAT,程式就能運行,IAT的RVA就是.rdata Section的VA,
重建IAT的工具當然是用Imp_list來重建,它產生的Import1.bin文件就是
IAT,具體可參考我脫iGame的文章。
如果你成功的Dump和Rebuild IAT後程式已能運行,若你想要進一步的
Rebuild Import Table,你可以在脫殼後的文件的.rdata Section後半部
(事實上這也是原始的Import Table所在)找尋你要的Import Table的RVA
再用Soft-ICE的M addr1 L addr2的指令將IAT Copy至Image_Thunk_Data
的區域,用Imp_list來重建Import Table,將Image_Import_Descriptor
的OriginalFirstThunk 指向Image_Thunk_Data,而FirstThunk指向IAT,
再將Image_Thunk_Data覆蓋IAT,將目錄表的Import Table的RVA和SIZE
修正即可重建Import Table.
JOHNSON 2000\11\24


W32DSM黄金版

 标 题:呵呵，就用来学脱Asprotect! (1千字)
发信人:guest
时 间:2000-9-25 0:31:17
详细信息:
你的W32DSM黄金版已过期？先搞定它吧，fire your regmon and run the program，
what? regmon closed but W32DSM is still running? ah Anti regmon!
ok, let's go, replace all "regvxd" in regmon.exe and regvxd.vxd with
"iegvxd"(just what you like!:). then rename the regvxd.vxd file into
iegvxd.vxd, well, launch regmon again and run W32DSM, do you find the
key? like HKCR\CLSID\{943BE8AD-85F9-0EC3-C5E4-F122FDB46E6A} (may by not
the same to yours), rename it and run W32DSM once again, did you pass now?
this can be used in some anti trw2000 protector, common anti debug routine
is CreateFile \\.\trw2000 and CreateFile \\.\trwdebug, so you can change...
(i don't want talk more about this! you can do that).
now, no one can catch you(dbpe v1.5b3 is not the exception, not our target
this time), ok go on!
this is sure not your will, well, let's shell(unshell?) the program.
first, we must know the entry point, Blast Wave2000 is our good choose,
but unfortunately, it not works on my computer this time, what else?
One way is debug W32DSM, My God! let's look at W32DSM's section table,
.CODE! we know the entry point 401000h! load W32DSM in trw200, do a command
bpx 401000, and let it go, we break at 401000, dump it full!
the rest thing is rebuild import table, run imp_list, select W32DSM and
click Rebuild import button, ignore the error message, you can get four files:
Import0.bin, Import1.bin, Import2.bin and Address.txt.
Load Import1.bin and W32DSM into Hex Workshop, copy all Import1.bin's data
and goto W32DSM OFFSET 3C200h(.idata section), high light 0xb38h bytes,
ctrl + v, save it, that's all! forgive my poor english, good luck!
大头成


Whereisit3.0

 标 题:我推荐一个特别优秀的光盘管理工具"Whereisit3.0",请高手破解. (空)
发信人:W32Crack
时 间:2000-9-28 21:37:50
详细信息:

标 题:hying請進. (894字)
发信人:C-pen
时 间:2000-9-30 15:12:09
详细信息:

沒錯這是Asprotect1.0加的殼,無法產生Import0.bin,沒關係!我們打開Address.txt看看,你會發現如下的東東(注意!你的位址可能不一樣,以偏移為主):
0087B4A4->BFF76E28[0]=(00000224)KERNEL32.DLL!GetProcAddress
(00000224)是偏移量,故ImageBase(400000)+.idata(VO)(2BF000)+偏移(00000224)=006BF224,這個位址存放0087B4A4的值,你把它改成BFF76E28,就是把它改成GetProcAddress這個API的位址(你的API位址也可能因Windows 的版本不同而不同,以你的機器為主)
即將0087B4A4 -> BFF76E28
如此Imp_list就會工作,替你dump出Import0.bin,另在我這裡還遇到點小瑕疵,
在我的Shell.dll中它的最後API成員是SHGetDesktopFolder,它的指針在002C242E,在這個指針後面不乾淨,把它清為0後,程式就能工作,你不一定會遇到
不過我還是說說比較好.
最後Asprotect從1.0版以後有多處的CheckSum,你光跳過一個是沒用的,你必需找到它們一一將它們補上,否則它就會給你來個"程式執行無效,即將關閉."
不過這個軟件不需去改Section,你怎麼會遇到,真奇怪!!!
JOHNSON 2000/09/30

标 题:那裡是Bounds Check,這是Asprotect普遍會用到,我以為你知道. (699字)
发信人:C-pen
时 间:2000-10-2 9:05:35
详细信息:

什麼是Bounds check我就不說了,網上很多教程,你也可以讀frogsice的Readme那裡有很多Anti-Debugger的Code那是Cracker必備的基本知識,我發覺很多人都會用frogsice但卻沒有幾個人會去讀Readme真是奇怪!
你要在Soft-ICE攔它時,你需先裝載SoftICE Backdoor Keeper,再重新啟動,令其生效,執行frogICE,按Ctrl-D教出Soft-ICE,下bpint 3,再執行Whereisit,你就會中斷在int 3,Bypass的方法很多,我習慣下e eip 0,再下bpm (Import Table section)來到它處理Import table的地方;若沒有Soft-ICE只有Trw2k,只要下faults off就可以Bypass,你再試試!若有疑問再說吧!
最後你不介易我給你一個習題做做吧!BLind Read&Write有用到Int 68去偵測Soft-ICE,你仔細的讀frogsICE的Readme,再去解決它!不難的,自己試試看,會有收穫的,祝你好運!!!
JOHNSON 2000/10/02


Asprotect 1.1 OEP

 标 题:关于用asprotect ver1.1 压缩过的程序的人口的寻找 (4千字)
发信人:liuhx
时 间:2000-10-24 13:55:32
详细信息:
昨天晚上，看了一篇E文的文章，关于asprotect version 1.0版的脱壳的内容，看到里面的Import Table重建实在是复杂，本人能力有限，暂不打算去做。
由于刚好我的手边有asprotect version1.1版，今天早上上班后，决定试试找它压缩过的程序的Entry Point(EP)。花上一些时间以后，竟然小有收获，找到一种方法能比较快地定位程序的EP，不敢独享，在这里特写出来献给大家。
我先用asprotect把Notepad.Exe压缩，试着来找它的EP，找到方法后，把Calc.exe和cdplayer.exe压缩再来找EP作为验证，证明这种方法应该是正确的。
下面是我用压缩过的Notepad.exe找EP的的过程。

015F:00690E99 8D4000 LEA EAX,[EAX+00]
015F:00690E9C 55 PUSH EBP (A) <-----按2次F12后，返回到这里
015F:00690E9D 8BEC MOV EBP,ESP
015F:00690E9F 83C4F4 ADD ESP,-0C
015F:00690EA2 E88922FFFF CALL 00683130
015F:00690EA7 0F855F2FFFFF JNZ 00683E0C
015F:00690EAD E81634FFFF CALL 006842C8
015F:00690EB2 E8917BFFFF CALL 00688A48
015F:00690EB7 E86489FFFF CALL 00689820
015F:00690EBC E8BFACFFFF CALL 0068BB80
015F:00690EC1 E8462FFFFF CALL 00683E0C (B)<---注意这里的EIP
015F:00690EC6 8BE5 MOV ESP,EBP
015F:00690EC8 5D POP EBP
015F:00690EC9 C20C00 RET 000C
015F:00690ECC 0000 ADD [EAX],AL
015F:00690ECE 0000 ADD [EAX],AL
015F:00690ED0 0000 ADD [EAX],AL
015F:00690ED2 0000 ADD [EAX],AL
1. 先用 bpx getprocaddress进行中断。然后运行压缩过的Notepad.exe。按5次F5后，把刚才设的中断先 BD 掉，再按2次 F12到达上面（A）的地方。往下面看，有几条语句，然后是连续的几个CALL语句，注意最后面的CALL语句（（B）的地方的）的地址是xxxx0EC1。这里要说明一下，由于notepad.exe 这个程序比较小，按5次F5即可以，如果程序比较大的话，要按更多次的F5，但这里有个标准就是，按2次F12返回后，如果没有上面的几个CALL语句，说明还要 BE 刚才设的断点，继续按几次F5，然后再 BD刚才的断点，再按F12两次，直到符合要求。这个要求就是有连续的几个CALL语句，而且最后的CALL语句的EIP是xxxx0EC1。

015F:0068D59D E8C26EFFFF CALL 00684464 (C)<---注意这里的EIP 和上面的EIP的关系，在这里设置断点。
015F:0068D5A2 8B4308 MOV EAX,[EBX+08]
015F:0068D5A5 8BD6 MOV EDX,ESI
015F:0068D5A7 E85CE9FFFF CALL 0068BF08
015F:0068D5AC 8B4B08 MOV ECX,[EBX+08]
015F:0068D5AF 83C106 ADD ECX,06
015F:0068D5B2 8BC1 MOV EAX,ECX
015F:0068D5B4 668B10 MOV DX,[EAX]
015F:0068D5B7 663B15D8136900 CMP DX,[006913D8]
015F:0068D5BE 7414 JZ 0068D5D4
015F:0068D5C0 663B1424 CMP DX,[ESP]
015F:0068D5C4 7506 JNZ 0068D5CC
015F:0068D5C6 89442404 MOV [ESP+04],EAX
015F:0068D5CA EB11 JMP 0068D5DD
015F:0068D5CC 8B5802 MOV EBX,[EAX+02]
015F:0068D5CF 83C306 ADD EBX,06
015F:0068D5D2 03CB ADD ECX,EBX
2. 现在根据（B）处的地址用下面的方法算出另外一个地址，新地址前4位是把xxxx－1，这里是0069－1＝0068，后面4位是D59D，这样算出的另外一个地址是0068d59d。在这个地址（上面（C）的地方）处设断。

015F:0068F863 5B POP EBX
015F:0068F864 6A10 PUSH 10
015F:0068F866 E8DDFEFFFF CALL 0068F748
015F:0068F86B 50 PUSH EAX
015F:0068F86C E8CFFEFFFF CALL 0068F740
015F:0068F871 50 PUSH EAX
015F:0068F872 6A00 PUSH 00
015F:0068F874 E8D7FEFFFF CALL 0068F750
015F:0068F879 53 PUSH EBX
015F:0068F87A 50 PUSH EAX
015F:0068F87B C3 RET (D)<--- 按4次F12后将返回到这里
3. 按6次F5后，再按4次F12，到上面（D）的地方，压缩程序就是从这里进入原来的程序的，也就是说，在这里按F10就到了Entry Point 。

上面只是介绍了如何找到EP 的，至于Import Table的重建，可能是我们大家的心口的痛了,望高手能指点一二或者为我们大家找出方法来。

有什么问题欢迎来信讨论。
我的Email是liuhx@lpec.com.cn


Asprotect v1.1分析

 标 题:流放一文。 对Asprotect v1.1的手动脱壳的一点分析 (9千字)
发信人:ljttt
时 间:2000-10-27 0:41:32
详细信息:
对Asprotect v1.1的手动脱壳的一点分析

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
由于r!sc已经写出了脱壳机rAD.exe，所以写此文实在没有多大意思。看此文说实话还不如去看rAD.exe的源代码更有意义。

样例文件： Asprotect.exe （Asprotect v1.1的主程序）
加壳方式： Asprotect v1.1
目标： 手动脱壳
作者： ljttt
写作日期： 2000-10-13

1、首先，启动PEEditor，打开Asprotect.exe文件，得到对我们有用的信息。
Image Base : 400000
Size of Image : 9E000

2、Ctrl-D进入SoftICE，下断点
bpint 3

3、单击break'n'enter，单击Run，将中断在第一条指令处，此时我们按照提示输入如下指令
eb eip 60
这样，就修改了入口的代码由 CC 改为 60。这样屏幕显示如下：
015F:0048F001 60 PUSHAD <--第一条指令处
015F:0048F002 E9D9040000 JMP 0048F4E0
015F:0048F007 2BD4 SUB EDX,ESP
015F:0048F009 ED IN EAX,DX
015F:0048F00A AC LODSB

4、跟踪一段，我们可以到达如下地方：
015F:0048F58A 81EE02000000 SUB ESI,00000002
015F:0048F590 81DB91D657C9 SBB EBX,C957D691
015F:0048F596 0FBFEB MOVSX EBP,BX
015F:0048F599 81FFE6C50868 CMP EDI,6808C5E6
015F:0048F59F 0F8588FFFFFF JNZ 0048F52D
015F:0048F5A5 BA4166DFBC MOV EDX,BCDF6641
015F:0048F5AA E928FFFFFF JMP 0048F4D7 <--此处将跳走
从跟踪的情况来看，我觉得这里应该说用到了"花指令"和"变形引擎"两种技术。原来我设想的"变形引擎"会出现在加壳软件中，看来现在"如愿"了。这也说明加壳软件在不断地提高反跟踪的技术。看来我也得多下苦功了。不然，以后只有用用别人写的脱壳机的份了。

5、继续跟踪到如下一段时：
015F:00C260DD 8BC8 MOV ECX,EAX
015F:00C260DF 8DBD452A4400 LEA EDI,[EBP+00442A45]
015F:00C260E5 8BB575294400 MOV ESI,[EBP+00442975]
015F:00C260EB F3A4 REPZ MOVSB <--此处是SMC技术的运用。将修改后面的代码。
015F:00C260ED 8B8575294400 MOV EAX,[EBP+00442975] <--这里的代码将被修改
015F:00C260F3 6800800000 PUSH 00008000
015F:00C260F8 6A00 PUSH 00
015F:00C260FA 50 PUSH EAX
015F:00C260FB FF957D294400 CALL [EBP+0044297D]
015F:00C26101 8D0E LEA ECX,[ESI]
015F:00C26103 85512C TEST [ECX+2C],EDX
015F:00C26106 44 INC ESP
015F:00C26107 07 POP ES
015F:00C26108 50 PUSH EAX
015F:00C26109 C3 RET

这是执行REPZ MOVSB指令以后的代码
015F:00C260E5 8BB575294400 MOV ESI,[EBP+00442975]
015F:00C260EB F3A4 REPZ MOVSB
015F:00C260ED 8B8575294400 MOV EAX,[EBP+00442975] <--这是修改后的代码
015F:00C260F3 6800800000 PUSH 00008000
015F:00C260F8 6A00 PUSH 00
015F:00C260FA 50 PUSH EAX
015F:00C260FB FF957D294400 CALL [EBP+0044297D]
015F:00C26101 8D85512C4400 LEA EAX,[EBP+00442C51]
015F:00C26107 50 PUSH EAX
015F:00C26108 C3 RET

6、继续跟踪到如下：
015F:00C265B8 5B POP EBX
015F:00C265B9 0BDB OR EBX,EBX
015F:00C265BB 8985112F4400 MOV [EBP+00442F11],EAX
015F:00C265C1 61 POPAD
015F:00C265C2 7508 JNZ 00C265CC
015F:00C265C4 B801000000 MOV EAX,00000001
015F:00C265C9 C20C00 RET 000C
015F:00C265CC 689C0EC200 PUSH 00C20E9C <--这个00C20E9C的地址也是程序用SMC的方式得到的
015F:00C265D1 C3 RET <--我们将到此处

7、在 RET 指令后将到如下一段代码处：
015F:00C20E9C 55 PUSH EBP
015F:00C20E9D 8BEC MOV EBP,ESP
015F:00C20E9F 83C4F4 ADD ESP,-0C
015F:00C20EA2 E88922FFFF CALL 00C13130
015F:00C20EA7 0F855F2FFFFF JNZ 00C13E0C
015F:00C20EAD E81634FFFF CALL 00C142C8
015F:00C20EB2 E8917BFFFF CALL 00C18A48
015F:00C20EB7 E86489FFFF CALL 00C19820
015F:00C20EBC E8BFACFFFF CALL 00C1BB80
015F:00C20EC1 E8462FFFFF CALL 00C13E0C <--在这里，我们要按F8进入，否则程序将执行完毕
015F:00C20EC6 8BE5 MOV ESP,EBP
015F:00C20EC8 5D POP EBP
015F:00C20EC9 C20C00 RET 000C

8、在 CALL 00C13E0C 处我们按 F8 键进入，此时我们不需要再继续直线跟踪下去了。因为如果你看了rAD.exe的源代码说明就知道，这不过是在DLL中的程序段中，由于DLL的入口函数部分没有什么实际意义。所以继续直线跟踪下去，只会花费我们大把大把的时间，这是有几种方法继续跟踪，看过rAD.exe的源代码后，就可以知道我们可以如下方式设断点。首先搜索特征代码，然后在特征代码处设断点继续跟踪。

第一种：
s eip l ffffffff 51,89,14,24,8B,F8,B2,01
如果搜索到的地址为 <Address>，则可以设断点
bpx <Address>-4

第二种：
s eip l ffffffff 81,C4,04,F0,FF,FF,50,81
如果搜索到的地址为 <Address>，则可以设断点
bpx <Address>

第三种：
s eip l ffffffff 55,8B,EC,83,C4,F8,53,56,57,8B,F9,89
如果搜索到的地址为 <Address>，则可以设断点
bpx <Address>

我一般设第二种方式的断点，以后的跟踪注意一旦出现 RET 指令时，首先查看一下堆栈中的内容，如果是将跳转到 FindClose 中时，则向下翻页找到 RET 语句处设断点，然后按F5键继续，（不要直接按F7，这样无效）。直到如下代码：
015F:00C205B3 E860CEFFFF CALL 00C1D418 <--此处可以按F10带过
015F:00C205B8 E801000000 CALL 00C205BE <--此处只是一个跳转指令的作用，必须按F8键，否则程序将直接执行
015F:00C205BD 8183C404310424E80100ADD DWORD PTR [EBX+043104C4],0001E824
015F:00C205C7 0000 ADD [EAX],AL
015F:00C205C9 6883C4048B PUSH 8B04C483
015F:00C205CE 051420C200 ADD EAX,00C22014
015F:00C205D3 E802000000 CALL 00C205DA <--同理
015F:00C205D8 E86883C404 CALL 05868945 <--同理
015F:00C205DD 010424 ADD [ESP],EAX
015F:00C205E0 C3 RET

9、当我们在 RET 指令执行后，（此时将看到两个CALL调用，在第二个处要按F8进入）将离最后的目标不远了，所以可以小心地按F8继续。
015F:00C1F845 5D POP EBP
015F:00C1F846 8B65FC MOV ESP,[EBP-04]
015F:00C1F849 8B45F8 MOV EAX,[EBP-08]
015F:00C1F84C 8944241C MOV [ESP+1C],EAX
015F:00C1F850 61 POPAD
015F:00C1F851 50 PUSH EAX
015F:00C1F852 6863F8C100 PUSH 00C1F863
015F:00C1F857 687BF8C100 PUSH 00C1F87B
015F:00C1F85C E8F7FEFFFF CALL 00C1F758
015F:00C1F861 50 PUSH EAX
015F:00C1F862 C3 RET <--此处，我跟踪的情况，将跳转到00C1F878处
015F:00C1F863 5B POP EBX
015F:00C1F864 6A10 PUSH 10
015F:00C1F866 E8DDFEFFFF CALL 00C1F748
015F:00C1F86B 50 PUSH EAX
015F:00C1F86C E8CFFEFFFF CALL 00C1F740
015F:00C1F871 50 PUSH EAX
015F:00C1F872 6A00 PUSH 00
015F:00C1F874 E8D7FEFFFF CALL 00C1F750
015F:00C1F879 53 PUSH EBX
015F:00C1F87A 50 PUSH EAX
015F:00C1F87B C3 RET <--这是我们要跟踪的最后的一条指令了，Yeah！[ESP]=OEP=4574F4。
015F:00C1F87C 90 NOP
015F:00C1F87D 6845F8C100 PUSH 00C1F845
015F:00C1F882 C3 RET <--此处，将向上跳转到00C1F845处

10、在 00C1F87B 处我们下指令，保存内存映象
/dump 400000 9E000 c:\temp\dump.exe

11、现在开始修补工作，用 PEEditor 打开dump.exe文件，选择dumpfixer，即修改RS=VS等等。

12、运行我写的小工具ITOOLS。先选择"修补文件头"和"写入进程空间"两项，然后打开Asprotect.exe文件，ITOOLS将创建进程，此时直到进程运行出现在任务栏中时（最好再等一会儿），单击确定按钮，ITOOLS将开始修补PE头和转换ThunkData，然后弹出对话框警告，此时如果转换正确，（即没有出现Error字眼）选择确定，最后你还需要单击一下Asprotect进程中的打开菜单一下，如果没有出现错误，则你可以启动Imp_List进行Import Table的Rebuild工作。此时我们可以得到完整的Import Table文件Import0.bin。

13、用Hex WorkShop打开dump.exe和Import0.bin，将Import0.bin中内容替换到dump.exe中的 5F000 处。（这个值可以由Address.txt得知）然后保存。

14、用 PEEditor 修改Export Table的RVA=0，Size=0，Import Table的RVA=5F000，Size=（大于0即可）。Basereloce的RVA=0，Size=0，Tls Table的RVA=63000（此值也可以不改），Size不变。保存。

15、运行程序，发现出现错误提示在地址C1C4A8，通过查找dump.exe文件，可以知道其在5D5BC和5D5A0两处有此值，看来还有问题，重新运行Asprotect。如果我们前面所设的断点没有下 bd * 禁止的话，又一次将依次中断在这些断点上，我们下指令
d C1C4A8
可以看到显示的内容为 408DC3。0K!得到了我们想要的值。回到Windows中，修改其中两处的值为 408DC3。重新运行，依然出错。这次地址很奇怪。看了半天，我终于想明白 5D5BC 和 5D5A0 保存的内容应该是指向内容为 408DC3 的指针。这好办。我把 5D5BC 和 5D5A0 两处的值修改为 5D5A4 ，把 5D5A4 的内容修改为 408DC3。再次运行。OK!终于成功。好辛苦。还是rAD.exe好！到底是大师的作品。呵呵！

【后记】
这里写得一点新意都没有。浪费了时间！再也不写这种没什么意思的文章了。仅有的一点作用可能就是在rAD.exe不起作用的时候，而且你有大把大把的时间脱壳的时候............这是什么逻辑！......:-& (口吐白沫,晕倒在地)

标 题:呀，忘了现在的Imp_List v1.1不需要我的上篇文章中的什么ITools了，可以正常工作，所以大家可别向我要ITools。 (46字)
发信人:ljttt
时 间:2000-10-27 1:07:09
详细信息:

写那篇文章时Imp_List还不够利索，现在不一样了。

标 题:其实在CodeSafe和PE-Crypt中都用到了和ASProtect类似的手法---"没事"就往FindClose中跑，FindClose成WC了，... (601字)
发信人:ljttt
时 间:2000-10-27 0:54:12
详细信息:

标题: 其实在CodeSafe和PE-Crypt中都用到了和ASProtect类似的手法---"没事"就往FindClose中跑，FindClose成WC了，呵呵......

内容:
（当然说"没事"其实是有事，有急事，为了反跟踪嘛，这对加壳软件来说，就象我们每天要去WC一样普通。）
这是一种特殊方式的SEH的应用。所以你设的内核处断点总能拦到它。
你会发现ASProtect还是挺温柔的。既没有让你当机，也没有破坏掉你的跟踪断点，只是出个破框当个警告而已。而其它两个就没有这么善良了。呵呵.....

不过我还是劝你不要把大把大把的时间浪费在脱壳上了，特别是有脱壳机的时候。不然你会和破解一样上瘾的。其实功夫在脱壳之外，技术性的东东你还得看哪些经典的文章书籍。这样要系统得多.


中国游戏中心大厅程序

 标 题:脱中国游戏中心大厅程序的壳
发信人:1212
时 间:2000-10-8 14:36:33
阅读次数:40
详细信息:
下载：（http://202.96.162.68/MyGames/DownLoad/Setup-Plaza.exe）
Asprtect已經出到1.1了,怎麼還在1.0打轉,我只講重建ImportTable的部份,跟蹤技巧省略,自己看教程慢慢摸索,才能進步。這個軟件有兩個程式被Asprotect加殼,一個是iGame.exe, 一個是GameDev.dll,我們以iGame.exe為例,dll的脫殼方法基本一樣,只是要點小技巧, 用Procdump32去分析iGame.exe
你會發現沒有.idata section只有.rdata section,Asprotect針對只有.rdata section會有另外一種編碼方式,我們不需重建Import Table,只要
Modify Image_Thunk_Data的矩陣結構即可。
那要如何Modify它呢？當然還是有力的工具Imp_list,這次我們用Imp_list
V1.09,可在老俄那邊下載, 記下.rdata section的資訊VO=4C000,Vs=11000
[脫 殼]:
(1)用BW2K,得知OEP=004224D6
(2)執行Imp_list,會分別得出,Address.txt,Import0.bin, Import1.
bin, Import2.bin
(3)在無Soft-ICE下,按Ctrl-N叫出Trw2K, 下faults off,再下CreatefileA do "d *(esp+4)",執行iGame.exe,攔住後,按F12/F10,直到返
回主程式,下BD *,G 004224D6,下Suspend用Procdump32(dump(full)),存成
iGdump.exe,改EP=000224D6
(4)用Hex Workshop打開Import1.bin,從偏移1000處開始選方塊728
將其貼至iGdump.exe的,rdata section的Raw Offset處, 即
004B600.
這樣即可脫穎成功.
C-Pen 2000\10\08


Advanced Direct Remailer 2.12

 标 题:Asprotect保护的程序脱壳后的修正--DialogBoxIndirectParamA (7千字)
发信人:liotta[BCG]
时 间:2001-9-9 6:51:50
详细信息:
Asprotect保护的程序脱壳后的修正--DialogBoxIndirectParamA

Liotta[BCG]
本文主要介绍Asprotect1.3保护的程序脱壳后关于加密函数DialogBoxIndirectParamA的修正问题。
仅供新手参考。

名称 :Advanced Direct Remailer
版本 :2.12
发布日期 :June 1, 2001
描述 :Powerful remailer with SMTP server, support for mailing lists, plugins.
操作系统 :Windows 98
目标文件 :Adr.exe

相关工具:
FI
Peditor
Softice
icedump + iceload
ImpREC

参考文档：
fs0 “脱Advanced Email Extractor PRO的壳 ”
Liotta[BCG] “UNPack CommView v.3.0”

Asprotect保护的程序，当我们手动脱壳后发现程序总是无法运行，要么自动退出、要么出现加密函数未找到
等出错信息。总是不能顺顺利利的，对于我们新手来说能够完成手动脱壳已是不易，再出现这种问题对我们来说，
实在是一大打击！
如何修正这个问题呢？
fs0在“脱Advanced Email Extractor PRO的壳 ”一文中提到：
用Asprotect加壳的程序, 脱壳后不能运行,我知道的有:
1. 原程序调用Asprotect的"Export Function", 最简单的就是:
push ..
push -1
call GetProcAddress
看其返回值是否为0, 为0 就出错或退出(AeePro就是这样的)
2. 原程序自检加壳后的程序(已经加壳了, 真不知道他是怎么检的)。
3. Asprotect 调用原程序的“初始化”函数, 当到达 OEP 前, 某些全局变量已经初始化了,
脱壳后运行就很可能出错, 解决方法是, 修改脱壳后的程序, 先运行该“初始化”函数, 再跳
到OEP 运行就可以了。
4. 再有就是DialogBoxIndirectParamA等。
现在结合 ADR脱壳后的修正来说说这个DialogBoxIndirectParamA问题，
首先，要找到程序的 OEP并DUMP，然后重构输入表并修改DUMP档。如果你还不大清楚Asprotect保护脱壳请
细阅上述参考文档。
当运行我们脱壳后的程序时，却出现“Crypt API not found.……”错误信息框，然后就退出。
让我们BPX MessageBoxA，按F12返回到程序空间，向上看看：

017F:00433590 6A04 PUSH BYTE +04
017F:00433592 6AFF PUSH BYTE -01
017F:00433594 FF154C014400 CALL `KERNEL32!GetProcAddress`
017F:0043359A 85C0 TEST EAX,EAX <--EAX=0则出错
017F:0043359C A36C564600 MOV [0046566C],EAX
017F:004335A1 7516 JNZ 004335B9 <--75改成EB即可修正
017F:004335A3 6A10 PUSH BYTE +10
017F:004335A5 68E0424400 PUSH DWORD 004442E0
017F:004335AA 68C4774400 PUSH DWORD 004477C4
017F:004335AF 50 PUSH EAX
017F:004335B0 FF15A4034400 CALL `USER32!MessageBoxA` <--出错信息框
017F:004335B6 33C0 XOR EAX,EAX
017F:004335B8 C3 RET <--退出

看到了吧！用 HEX编辑器修改75成EB即可修正最简单的错误。
修正后，程序能运行。但是当我们点击HELP中的Registration时却出现严重错误！！
我们用W32DASM来反汇编该程序，发现HELP中的Registration调用USER32.dll!DialogBoxIndirectParamA
可以肯定是函数DialogBoxIndirectParamA在搞鬼！并发现有几处调用该函数。

其中之（一）
* Reference To: USER32.DialogBoxIndirectParamA, Ord:0091h
|
:00434713 FF1568034400 Call dword ptr [00440368]

地址00440368存放的就是USER32.dll!DialogBoxIndirectParamA函数调用地址。
让我们先看看，脱壳是找到的USER32.dll!DialogBoxIndirectParamA函数原型：

017F:00F5C898 55 PUSH EBP
017F:00F5C899 8BEC MOV EBP,ESP
017F:00F5C89B 53 PUSH EBX
017F:00F5C89C 8B5D08 MOV EBX,[EBP+08]
017F:00F5C89F 8B4518 MOV EAX,[EBP+18]
017F:00F5C8A2 50 PUSH EAX
017F:00F5C8A3 8B4514 MOV EAX,[EBP+14]
017F:00F5C8A6 50 PUSH EAX
017F:00F5C8A7 8B4510 MOV EAX,[EBP+10]
017F:00F5C8AA 50 PUSH EAX
017F:00F5C8AB 6A05 PUSH BYTE +05
017F:00F5C8AD 8B450C MOV EAX,[EBP+0C]
017F:00F5C8B0 50 PUSH EAX
017F:00F5C8B1 53 PUSH EBX
017F:00F5C8B2 E8157BFFFF CALL `KERNEL32!FindResourceA` <--注意机器码(5字节)
017F:00F5C8B7 50 PUSH EAX
017F:00F5C8B8 53 PUSH EBX
017F:00F5C8B9 E87E7BFFFF CALL `KERNEL32!LoadResource` <--注意机器码(5字节)
017F:00F5C8BE 50 PUSH EAX
017F:00F5C8BF E8807BFFFF CALL `KERNEL32!LockResource` <--注意机器码(5字节)
017F:00F5C8C4 50 PUSH EAX
017F:00F5C8C5 53 PUSH EBX
017F:00F5C8C6 E8917BFFFF CALL `USER32!DialogBoxIndirectParamA`<--注意机器码(5字节)
017F:00F5C8CB 5B POP EBX
017F:00F5C8CC 5D POP EBP
017F:00F5C8CD C21400 RET 14

但由于我们已重构输入表，故上述函数要稍作修改才能引用。
在用 ImpREC重构输入表时我们看到相关的几项

Flag RVA ModuleName Ordinal Name
1 00040138 KERNEL32.dll 0123 FindResourceA
1 0004012C KERNEL32.dll 023E LockResource
1 00040130 KERNEL32.dll 022E LoadResource
1 00040368 USER32.dll 0091 DialogBoxIndirectParamA

就可知：
KERNEL32!FindResourceA函数调用地址存放在00040138+400000=00440138
KERNEL32!LoadResource函数调用地址存放在00440130
KERNEL32!LockResource函数调用地址存放在0044012C
USER32!DialogBoxIndirectParamA函数调用地址存放在00440368

所以我们作以下修改

017F:004D0F98 55 PUSH EBP
017F:004D0F99 8BEC MOV EBP,ESP
017F:004D0F9B 53 PUSH EBX
017F:004D0F9C 8B5D08 MOV EBX,[EBP+08]
017F:004D0F9F 8B4518 MOV EAX,[EBP+18]
017F:004D0FA2 50 PUSH EAX
017F:004D0FA3 8B4514 MOV EAX,[EBP+14]
017F:004D0FA6 50 PUSH EAX
017F:004D0FA7 8B4510 MOV EAX,[EBP+10]
017F:004D0FAA 50 PUSH EAX
017F:004D0FAB 6A05 PUSH BYTE +05
017F:004D0FAD 8B450C MOV EAX,[EBP+0C]
017F:004D0FB0 50 PUSH EAX
017F:004D0FB1 53 PUSH EBX
017F:004D0FB2 FF1538014400 CALL `KERNEL32!FindResourceA` <--注意机器码(6字节)
017F:004D0FB8 50 PUSH EAX
017F:004D0FB9 53 PUSH EBX
017F:004D0FBA FF1530014400 CALL `KERNEL32!LoadResource` <--注意机器码(6字节)
017F:004D0FC0 50 PUSH EAX
017F:004D0FC1 FF152C014400 CALL `KERNEL32!LockResource` <--注意机器码(6字节)
017F:004D0FC7 50 PUSH EAX
017F:004D0FC8 53 PUSH EBX
017F:004D0FC9 FF1568034400 CALL `USER32!DialogBoxIndirectParamA`<--注意机器码(6字节)
017F:004D0FCF 5B POP EBX
017F:004D0FD0 5D POP EBP
017F:004D0FD1 C21400 RET 14

然后我们来打补丁！找一块大小合适没有使用空间，我在用 ImpREC重构输入表时所加的段中选了一块

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
000D0F90 98 0F 4D 00 00 00 00 00 55 8B EC 53 8B 5D 08 8B ?M.....U嬱S媇.?
000D0FA0 45 18 50 8B 45 14 50 8B 45 10 50 6A 05 8B 45 0C E.P婨.P婨.Pj.婨.
000D0FB0 50 53 FF 15 38 01 44 00 50 53 FF 15 30 01 44 00 PS�.8.D.PS�.0.D.
000D0FC0 50 FF 15 2C 01 44 00 50 53 FF 15 68 03 44 00 5B P�.,.D.PS�.h.D.[
000D0FD0 5D C2 14 00 00 00 00 00 00 00 00 00 00 00 00 00 ]?.............

Offset000D0F90存放的是函数调用地址004D0F98，并在Offset000D0F98中写入修正后函数的机器码。

最后把原先找到的几处调用中Call dword ptr [00440368]改为[004D0f90]

其中之（一）
* Reference To: USER32.DialogBoxIndirectParamA, Ord:0091h
|
:00434713 FF1568034400 Call dword ptr [004D0f90]

终于大功告成！点击HELP中的Registration绣出Registration窗口。Asprotect保护的程序脱壳后的修正
就讲到这里。希望对大家有帮助！


Advanced Email Extractor PRO

 标 题:脱Advanced Email Extractor PRO的壳 (19千字)
发信人:fs0
时 间:2001-8-19 19:10:30
详细信息:
Advanced Email Extractor PRO
http://www.mailutilities.com/aee/aeepro.zip

首先说说Asprotect的反跟踪代码, SEH(Structure Exception Handling)当然是时下流行的

Exception Handler:
016F:00E6097B MOV EAX,[ESP+0C] ;EAX 是指向 CONTEXT record 的指针
016F:00E6097F ADD DWORD [EAX+B8],BYTE +02 ; [EAX+B8] 是产生异常的地址，这里加 2 就是 XOR [EAX],EAX 的下一条指令
016F:00E60986 PUSH ECX
016F:00E60987 XOR ECX,ECX
016F:00E60989 MOV [EAX+04],ECX ;clear dr0, 也就是清除断点, 呵呵我们有 SuperBPM 就不用担心了
016F:00E6098C MOV [EAX+08],ECX ;clear dr1
016F:00E6098F MOV [EAX+0C],ECX ;clear dr2
016F:00E60992 MOV [EAX+10],ECX ;clear dr3
016F:00E60995 MOV DWORD [EAX+18],0155 ;clear global breakpoint enable flags
016F:00E6099C POP ECX
016F:00E6099D XOR EAX,EAX ;eax=0 reload context and continue execution
016F:00E6099F RET

016F:00E609A0 XOR EAX,EAX
016F:00E609A2 PUSH DWORD [FS:EAX]
016F:00E609A5 MOV [FS:EAX],ESP
016F:00E609A8 XOR [EAX],EAX ;raise exception, 代码是两个字节
016F:00E609AA POP DWORD `DOSMGR_BackFill_Allowed` ;从这里继续执行
016F:00E609B1 POP EAX

好, Load AeePro.exe
bpx getprocaddress
g
F12
bd *
F12
F8
F12
F8

来到:
016F:00E616E8 PUSH EBP
016F:00E616E9 MOV EBP,ESP
016F:00E616EB ADD ESP,BYTE -0C
016F:00E616EE CALL 00E53130
016F:00E616F3 JNZ NEAR 00E53E0C
016F:00E616F9 CALL 00E542C8
016F:00E616FE CALL 00E58A88
016F:00E61703 CALL 00E5941C
016F:00E61708 CALL 00E5BF00
016F:00E6170D CALL 00E53E0C ;<--这里下断点, F8 跟进去
016F:00E61712 MOV ESP,EBP ;<--不会返回到这里
016F:00E61714 POP EBP
016F:00E61715 RET 0C

上面的CALL 00E53E0C F8 跟进去后, 用F8一步一步的跟, 当然要小心那些Exception啦
过不了多远, 来到:
016F:00E602F7 CALL 00E60336
016F:00E602FC PUSH DWORD 00E60305
016F:00E60301 INC DWORD [ESP]
016F:00E60304 RET

016F:00E60336 XOR EAX,EAX
016F:00E60338 JMP SHORT 00E6033C
016F:00E6033A INT 20
016F:00E6033C PUSH DWORD [FS:EAX]
016F:00E6033F JMP SHORT 00E60342 ;跳到下面

016F:00E60342 MOV [FS:EAX],ESP
016F:00E60345 XOR [EAX],EAX ;raise exception
016F:00E60347 JMP SHORT 00E6034A ;exception continue execution here, 将光标移到这里按 F7

来到:
016F:00E60355 POP EAX
016F:00E60356 PUSH DWORD 00E5E0EC ;<--下断点 bpx 00E5E0EC
016F:00E6035B PUSH DWORD 00E6043C ;g
016F:00E60360 PUSH DWORD 00E5FAD8
016F:00E60365 PUSH DWORD 00E5F788
016F:00E6036A PUSH DWORD 00E5F15C
016F:00E6036F PUSH DWORD 00E5EC04
016F:00E60374 PUSH DWORD 00E5FE90
016F:00E60379 RET

到 00E5E0EC 后 F12, F8, 来到:
016F:00E60DDC PUSH DWORD E6B8DCDB
016F:00E60DE1 PUSH DWORD 2364
016F:00E60DE6 PUSH DWORD EA74
016F:00E60DEB PUSH DWORD 00016000
016F:00E60DF0 PUSH DWORD [00E63014]
016F:00E60DF6 CALL 00E60DFC ;这段代码自检运行过的代码, 不是这个call, 而是后面的代码, 被花指令盖过了
016F:00E60DFB ADD DWORD [EBX+78E804C4],E8FFFFBB ;应该是 00E60DFF 的 CALL 00E5C97C
016F:00E60E05 ADD [EAX],EAX ;如果你改了之前的代码, 后面就会出错
016F:00E60E07 ADD [EAX],AL
016F:00E60E09 ADD DWORD [EBX+043104C4],0001E824
016F:00E60E13 ADD [EAX],AL
016F:00E60E15 PUSH DWORD 8B04C483
016F:00E60E1A ADD EAX,00E63014
016F:00E60E1F CALL 00E60E26 ;<--这里下断点 F8 跟进去
016F:00E60E24 CALL 05AA9191
016F:00E60E29 ADD [ESP],EAX
016F:00E60E2C RET

跟进 00E60E26 后几下 F8, ret 后来到:
016F:00E5FE78 MOV EAX,00E639C4
016F:00E5FE7D MOV EDX,0A
016F:00E5FE82 CALL 00E5C288
016F:00E5FE87 CALL 00E5FC9C
016F:00E5FE8C RET

往上看就是: (因为按逻辑是要跟进上面的 CALL 00E5FC9C ....还有很大一堆!!! 不多写了, 自己看着办吧)
016F:00E5FE62 CMP DWORD [EAX],BYTE +00
016F:00E5FE65 JZ 00E5FE69
016F:00E5FE67 PUSH DWORD [EAX]
016F:00E5FE69 PUSH DWORD [EBP-10]
016F:00E5FE6C JMP NEAR [EBP-14] ;跳到 [EBP-14] 后就离 OEP 不远了, 那里是一堆“垃圾代码”, 看你的啦!

最后来到:
016F:00E76155 JC 00E7611A
016F:00E76157 POP EBX
016F:00E76158 POP EAX
016F:00E76159 ADD EAX,76B922D4
016F:00E7615E POP ESP
016F:00E7615F ADD EAX,EBX
016F:00E76161 MOV [ESP+1C],EAX
016F:00E76165 POPA
016F:00E76166 JMP EAX ;Jump to EOP

;-----------------------------------------------------------------------------------
下面看看原程序的还原和Import Table的重建 (没有手动脱壳经验的, 就别往下看了, 很长的一部分!)
016F:00E5F1F0 JMP SHORT 00E5F25C
016F:00E5F1F2 CALL 00E52568
016F:00E5F1F7 MOV ESI,EAX
016F:00E5F1F9 MOV EAX,[EBX] ;[EBX]是Section RVA
016F:00E5F1FB ADD EAX,[EBP-14] ;[EBP-14]是ImageBase
016F:00E5F1FE MOV [EBP-04],EAX
016F:00E5F201 MOV ECX,[EBX+04] ;[EBX+04]是Section size
016F:00E5F204 MOV EDX,ESI
016F:00E5F206 MOV EAX,[EBP-04]
016F:00E5F209 CALL 00E5ED00 ;还原
016F:00E5F20E MOV EDI,EAX
016F:00E5F210 CMP EDI,[EBX+04]
016F:00E5F213 JZ 00E5F21F ;还原OK就跳?
016F:00E5F215 MOV EAX,00E5F2E0
016F:00E5F21A CALL 00E5EB18
016F:00E5F21F CMP BYTE [EBP-05],00
016F:00E5F223 JNZ 00E5F243
016F:00E5F225 MOV BYTE [EBP-05],01
016F:00E5F229 PUSH ESI
016F:00E5F22A MOV ESI,[EBP-04]
016F:00E5F22D ADD ESI,BYTE +14
016F:00E5F230 PUSH DWORD [ESI]
016F:00E5F232 MOV BYTE [ESI],C3
016F:00E5F235 CALL ESI
016F:00E5F237 POP DWORD [ESI]
016F:00E5F239 POP ESI
016F:00E5F23A MOV EDX,EDI
016F:00E5F23C MOV EAX,ESI
016F:00E5F23E CALL 00E5ED20
016F:00E5F243 MOV ECX,EDI
016F:00E5F245 MOV EDX,ESI
016F:00E5F247 MOV EAX,[EBP-04]
016F:00E5F24A CALL 00E5449C ;将还原后的data 复制到原程序的空间
016F:00E5F24F MOV EDX,[EBX+04]
016F:00E5F252 MOV EAX,ESI
016F:00E5F254 CALL 00E52580
016F:00E5F259 ADD EBX,BYTE +0C
016F:00E5F25C MOV EAX,[EBX+04] ;eax = next section size
016F:00E5F25F TEST EAX,EAX
016F:00E5F261 JG 00E5F1F2 ;还没全部还原完就跳
016F:00E5F263 CMP DWORD [EBP-0C],BYTE +00
016F:00E5F267 JZ 00E5F271
016F:00E5F269 MOV EAX,[EBP-0C]
016F:00E5F26C MOV EDX,[EBP-10]
016F:00E5F26F MOV [EAX],EDX
016F:00E5F271 CALL 00E5F2B0
016F:00E5F276 PUSH DWORD 00E5F27F
016F:00E5F27B INC DWORD [ESP]
016F:00E5F27E RET
;-----------------------------------------------------------------------------------

;===================================================================================
Import Table 的重定向
016F:00E5F962 PUSHA
016F:00E5F963 CLD
016F:00E5F964 MOV ESI,[EBP-04]
016F:00E5F967 LODSD
016F:00E5F968 OR EAX,EAX
016F:00E5F96A JZ 00E5F9B6 ;处理完所有DLL了吗? 是就跳
016F:00E5F96C MOV EDI,EAX ;EAX --> Next IAT RVA
016F:00E5F96E ADD EDI,[00E63560] ;[00E63560] --> ImageBase
016F:00E5F974 MOV [EBP-08],EDI ;EDI 指向该 DLL 的第一个 IAT
016F:00E5F977 MOV EBX,ESI ;ESI 指向 DLL Name
016F:00E5F979 XOR ECX,ECX
016F:00E5F97B DEC ECX
016F:00E5F97C XCHG EDI,ESI
016F:00E5F97E XOR AL,AL
016F:00E5F980 REPNE SCASB
016F:00E5F982 XCHG EDI,ESI
016F:00E5F984 LODSB
016F:00E5F985 CMP AL,00
016F:00E5F988 JZ 00E5F967 ;该DLL处理完了吗?
016F:00E5F98A CMP AL,06 ;特殊Import function ? 如GetVersion, 下面有列出
016F:00E5F98D JNZ 00E5F995 ;不是就跳(本想把这里改为jmp, 就以为可以得到完整的IAT, 可惜再细看后才发现该特殊Import function name根本就没有存起来!
016F:00E5F98F ADD DWORD [EBP-08],BYTE +04 ;是特殊Import function就跳过不处理, 后面有说这些是怎么处理的
016F:00E5F993 JMP SHORT 00E5F984
016F:00E5F995 PUSH EBX ;<--DLL name
016F:00E5F996 PUSH ESI ;<--Encrpyted Function Name
016F:00E5F997 PUSH EBX
016F:00E5F998 LEA EBX,[EBP-08] ;<--IAT
016F:00E5F99B PUSH EBX
016F:00E5F99C CMP AL,02 ;import function by name or ord?
016F:00E5F99F JZ 00E5F9A7
016F:00E5F9A1 MOVZX ECX,BYTE [ESI]
016F:00E5F9A4 INC ECX
016F:00E5F9A5 JMP SHORT 00E5F9AC
016F:00E5F9A7 MOV ECX,04
016F:00E5F9AC ADD ESI,ECX ;esi --> end of Encrpyted Function by name or import function by ord?
016F:00E5F9AE CALL 00E5F674 ;<--看下面的 00E5F674
016F:00E5F9B3 POP EBX
016F:00E5F9B4 JMP SHORT 00E5F984
016F:00E5F9B6 POPA
016F:00E5F9B7 CALL 00E5F9F6
016F:00E5F9BC PUSH DWORD 00E5F9C5
016F:00E5F9C1 INC DWORD [ESP]
016F:00E5F9C4 RET

调用GetProcAddress, 生成重定向代码的函数:
016F:00E5F674 PUSH EBP
016F:00E5F675 MOV EBP,ESP
016F:00E5F677 ADD ESP,FFFFFEFC
016F:00E5F67D PUSH EBX
016F:00E5F67E PUSH ESI
016F:00E5F67F PUSH EDI
016F:00E5F680 MOV ESI,[EBP+10]
016F:00E5F683 MOV EDI,[EBP+08]
016F:00E5F686 MOV EAX,ESI
016F:00E5F688 DEC EAX
016F:00E5F689 XOR EBX,EBX
016F:00E5F68B MOV BL,[EAX]
016F:00E5F68D LEA EAX,[EBP+FFFFFEFF]
016F:00E5F693 XOR ECX,ECX
016F:00E5F695 MOV EDX,0100
016F:00E5F69A CALL 00E52768 ;<--清空eax指向的空间
016F:00E5F69F MOV EAX,EBX
016F:00E5F6A1 DEC EAX
016F:00E5F6A2 SUB EAX,BYTE +02
016F:00E5F6A5 JC 00E5F700
016F:00E5F6A7 JZ NEAR 00E5F772
016F:00E5F6AD DEC EAX
016F:00E5F6AE JZ 00E5F700
016F:00E5F6B0 DEC EAX
016F:00E5F6B1 JNZ NEAR 00E5F77B
016F:00E5F6B7 MOV AL,[ESI]
016F:00E5F6B9 MOV [EBP-01],AL
016F:00E5F6BC INC ESI
016F:00E5F6BD XOR EBX,EBX
016F:00E5F6BF MOV BL,[EBP-01]
016F:00E5F6C2 MOV ECX,EBX
016F:00E5F6C4 LEA EAX,[EBP+FFFFFEFF]
016F:00E5F6CA MOV EDX,ESI
016F:00E5F6CC CALL 00E5449C ;<--Copy encrypted function name to eax 指向的空间
016F:00E5F6D1 PUSH BYTE +0A
016F:00E5F6D3 MOV ECX,00E639BA
016F:00E5F6D8 MOV EDX,EBX
016F:00E5F6DA LEA EAX,[EBP+FFFFFEFF]
016F:00E5F6E0 CALL 00E5C3E0 ;<--还原Import Function Name
016F:00E5F6E5 LEA ESI,[EBP+FFFFFEFF] ;<--esi指向Import Function Name
016F:00E5F6EB PUSH ESI
016F:00E5F6EC MOV EAX,[EBP+0C] ;<--eax 指向 dll name
016F:00E5F6EF PUSH EAX
016F:00E5F6F0 CALL 00E5F30C ;<--GetProcAddress by name，在eax返回地址
016F:00E5F6F5 CALL 00E5F578 ;<--(下面有说明) 在返回的eax指向的空间生成跳到Import Function的代码?
;可以将这句 call nop 掉, 直接将 EAX 放到 [EDX] 中,
;整个输入表就差那些特殊的 Import functions 了要重建了
;(当然Import REConstructor v1.2已经可以重建改输入表了, 不用这么麻烦)
;要是真的改了该代码, 要在处理完所有的 DLL 后, 还原该代码, 因为后面有自检
016F:00E5F6FA MOV EDX,[EDI]
016F:00E5F6FC MOV [EDX],EAX ;<-- 重定向IAT?
016F:00E5F6FE JMP SHORT 00E5F77B ;<--完成

016F:00E5F700 CMP EBX,BYTE +01 ;encrypted funciont name?
016F:00E5F703 JZ 00E5F70A
016F:00E5F705 CMP EBX,BYTE +04 ;Import function by ord?
016F:00E5F708 JNZ 00E5F741
016F:00E5F70A MOV AL,[ESI]
016F:00E5F70C MOV [EBP-01],AL
016F:00E5F70F INC ESI
016F:00E5F710 XOR ECX,ECX
016F:00E5F712 MOV CL,[EBP-01]
016F:00E5F715 LEA EAX,[EBP+FFFFFEFF]
016F:00E5F71B MOV EDX,ESI
016F:00E5F71D CALL 00E5449C ;copy encrypted function name to [eax]
016F:00E5F722 PUSH BYTE +0A
016F:00E5F724 MOV ECX,00E639B0
016F:00E5F729 XOR EDX,EDX
016F:00E5F72B MOV DL,[EBP-01]
016F:00E5F72E LEA EAX,[EBP+FFFFFEFF]
016F:00E5F734 CALL 00E5C3E0 ;decrypt function name
016F:00E5F739 LEA ESI,[EBP+FFFFFEFF]
016F:00E5F73F JMP SHORT 00E5F743
016F:00E5F741 MOV ESI,[ESI]
016F:00E5F743 CMP EBX,BYTE +04
016F:00E5F746 JNZ 00E5F762
016F:00E5F748 PUSH ESI ;<--Import function name is GetProcAddress ?
016F:00E5F749 MOV EAX,[EBP+0C]
016F:00E5F74C PUSH EAX
016F:00E5F74D CALL 00E5F30C
016F:00E5F752 MOV [00E6355C],EAX
016F:00E5F757 MOV EAX,00E5C490 ;<--00E5C490 处的代码自己看吧, 应该是 GetProcAddress
016F:00E5F75C MOV EDX,[EDI]
016F:00E5F75E MOV [EDX],EAX
016F:00E5F760 JMP SHORT 00E5F77B
016F:00E5F762 PUSH ESI ;<--esi指向Import Function Name or esi is import function ord
016F:00E5F763 MOV EAX,[EBP+0C]
016F:00E5F766 PUSH EAX ;<--eax 指向 dll name
016F:00E5F767 CALL 00E5F30C ;<--GetProcAddress by ord，在eax返回地址
016F:00E5F76C MOV EDX,[EDI]
016F:00E5F76E MOV [EDX],EAX
016F:00E5F770 JMP SHORT 00E5F77B
016F:00E5F772 MOV EAX,00E5C468
016F:00E5F777 MOV EDX,[EDI]
016F:00E5F779 MOV [EDX],EAX

016F:00E5F77B ADD DWORD [EDI],BYTE +04
016F:00E5F77E POP EDI
016F:00E5F77F POP ESI
016F:00E5F780 POP EBX
016F:00E5F781 MOV ESP,EBP
016F:00E5F783 POP EBP
016F:00E5F784 RET 0C

生成跳到真正Import Function地址的代码:
016F:00E5F578 PUSH EBX
016F:00E5F579 PUSH ESI
016F:00E5F57A PUSH EDI
016F:00E5F57B PUSH EBP
016F:00E5F57C ADD ESP,BYTE -10
016F:00E5F57F MOV [ESP],EAX
016F:00E5F582 MOV EAX,C8
016F:00E5F587 CALL 00E52568
016F:00E5F58C MOV [ESP+04],EAX
016F:00E5F590 MOV EAX,[ESP+04]
016F:00E5F594 MOV [ESP+08],EAX
016F:00E5F598 MOV EBP,[ESP]
016F:00E5F59B CALL 00E5F524
016F:00E5F5A0 MOV EBX,EAX
016F:00E5F5A2 MOV BYTE [ESP+0C],00
016F:00E5F5A7 MOVZX ESI,BYTE [EBX]
016F:00E5F5AA LEA EAX,[EBX+01]
016F:00E5F5AD MOVZX EDI,BYTE [EAX]
016F:00E5F5B0 LEA EDX,[EBX+02]
016F:00E5F5B3 MOV ECX,ESI
016F:00E5F5B5 MOV EAX,EBP
016F:00E5F5B7 CALL 00E5BF44
016F:00E5F5BC TEST AL,AL
016F:00E5F5BE JZ 00E5F5D8
016F:00E5F5C0 MOV ECX,EDI
016F:00E5F5C2 MOV EDX,EBP
016F:00E5F5C4 MOV EAX,[ESP+08]
016F:00E5F5C8 CALL 00E5449C
016F:00E5F5CD ADD [ESP+08],EDI
016F:00E5F5D1 ADD EBP,EDI
016F:00E5F5D3 MOV BYTE [ESP+0C],01
016F:00E5F5D8 ADD ESI,BYTE +02
016F:00E5F5DB ADD EBX,ESI
016F:00E5F5DD CMP BYTE [ESP+0C],00
016F:00E5F5E2 JNZ 00E5F5E9
016F:00E5F5E4 CMP BYTE [EBX],00
016F:00E5F5E7 JNZ 00E5F5A7
016F:00E5F5E9 CMP BYTE [ESP+0C],00
016F:00E5F5EE JNZ 00E5F59B
016F:00E5F5F0 CALL 00E52698
016F:00E5F5F5 MOV ESI,[ESP+08]
016F:00E5F5F9 SUB ESI,[ESP+04]
016F:00E5F5FD LEA EAX,[ESI+06]
016F:00E5F600 CALL 00E52568
016F:00E5F605 MOV EBX,EAX
016F:00E5F607 MOV ECX,ESI
016F:00E5F609 MOV EDI,[ESP+04]
016F:00E5F60D MOV EDX,EDI
016F:00E5F60F MOV EAX,EBX
016F:00E5F611 CALL 00E5449C
016F:00E5F616 MOV EBP,EBX
016F:00E5F618 ADD EBP,ESI
016F:00E5F61A MOV [ESP+08],EBP
016F:00E5F61E MOV EAX,02
016F:00E5F623 CALL 00E52788
016F:00E5F628 SUB EAX,BYTE +01
016F:00E5F62B JNC 00E5F647
016F:00E5F62D MOV EAX,[ESP+08]
016F:00E5F631 MOV BYTE [EAX],E9 ;<--jmp的代码, 上面的不说了
016F:00E5F634 ADD EBP,BYTE +05
016F:00E5F637 MOV EAX,[ESP]
016F:00E5F63A SUB EAX,EBP
016F:00E5F63C ADD ESI,EAX
016F:00E5F63E MOV EAX,[ESP+08]
016F:00E5F642 INC EAX
016F:00E5F643 MOV [EAX],ESI
016F:00E5F645 JMP SHORT 00E5F662
016F:00E5F647 MOV EAX,[ESP+08] ;[ESP+08]是要修改的代码的首址
016F:00E5F64B MOV BYTE [EAX],68 ;<--push的代码
016F:00E5F64E ADD ESI,[ESP] ;[ESP] 为真正的Import Function Address, 如 [ESP] = BFF72535,
016F:00E5F651 MOV EAX,[ESP+08] ;而ESI就是push前的代码字节数, 如 ESI = 1
016F:00E5F655 INC EAX ;eax为下一个要修改的代码地址
016F:00E5F656 MOV [EAX],ESI ;exp: 如果 上面的ESI = 1, [ESP] = BFF72535, 则这时的 ESI = BFF72536
016F:00E5F658 MOV EAX,[ESP+08] ;[ESP+08]是要修改的代码的首址
016F:00E5F65C ADD EAX,BYTE +05 ;PUSH XXXXXXXX 为 5 个字节
016F:00E5F65F MOV BYTE [EAX],C3 ;ret 代码
016F:00E5F662 MOV EAX,EDI
016F:00E5F664 CALL 00E52580
016F:00E5F669 MOV EAX,EBX
016F:00E5F66B ADD ESP,BYTE +10
016F:00E5F66E POP EBP
016F:00E5F66F POP EDI
016F:00E5F670 POP ESI
016F:00E5F671 POP EBX
016F:00E5F672 RET

处理特殊Import functions:
016F:00E5FA60 PUSHA
016F:00E5FA61 PUSH DWORD 00E621F0
016F:00E5FA66 LEA EAX,[EBP-0C]
016F:00E5FA69 PUSH DWORD [00E63560]
016F:00E5FA6F CALL NEAR [EAX] ;call 下面的 00E71238
016F:00E5FA71 POPA

016F:00E71238 CALL 00E7123D
016F:00E7123D POP EBP
016F:00E7123E CLD
016F:00E7123F LEA ESI,[EBP+2F] ;ESI指向特殊Import function的相关信息
016F:00E71242 XOR EAX,EAX
016F:00E71244 LODSB
016F:00E71245 OR AL,AL
016F:00E71247 JZ 00E71265 ;完了吗?
016F:00E71249 DEC AL
016F:00E7124B SHL EAX,02
016F:00E7124E ADD EAX,[ESP+08] ;[ESP+08]就是指向第一个特殊Import function的重定向地址, 我看到的就有 10 个这样的functions
016F:00E71252 MOV EBX,[EAX] ;EBX为该特殊Import function的重定向地址
016F:00E71254 LODSD ;该EBX指向的代码如: mov eax, [xxxxxxxx]
016F:00E71255 ADD EAX,[ESP+04] ; ret , 这些就是我们要手动修改的 IAT
016F:00E71259 MOV [EAX],EBX ;EAX指向 IAT
016F:00E7125B XOR EAX,EAX
016F:00E7125D MOV [ESI-04],EAX ;clear
016F:00E71260 MOV [ESI-05],AL ;clear
016F:00E71263 JMP SHORT 00E71244
016F:00E71265 RET 08

特殊的Import functions:
016F:00E5C7D8 PUSH BYTE +00
016F:00E5C7DA CALL `KERNEL32!GetModuleHandleA`
016F:00E5C7DF MOV [00E635D4],EAX
016F:00E5C7E4 CALL `KERNEL32!GetVersion`
016F:00E5C7E9 MOV [00E635D8],EAX
016F:00E5C7EE PUSH DWORD 00E635E4
016F:00E5C7F3 CALL `KERNEL32!GetVersionExA`
016F:00E5C7F8 CALL `KERNEL32!GetCurrentProcess`
016F:00E5C7FD MOV [00E635DC],EAX
016F:00E5C802 CALL `KERNEL32!GetCurrentProcessId`
016F:00E5C807 MOV [00E635E0],EAX
016F:00E5C80C CALL `KERNEL32!GetCommandLineA`
016F:00E5C811 MOV [00E63678],EAX
016F:00E5C816 RET
016F:00E5C817 NOP

016F:00E5C818 PUSH EBP ;<--第一个特殊Import function 是 KERNEL32!GetModuleHandleA
016F:00E5C819 MOV EBP,ESP
016F:00E5C81B MOV EAX,[EBP+08]
016F:00E5C81E TEST EAX,EAX
016F:00E5C820 JNZ 00E5C829
016F:00E5C822 MOV EAX,[00E63560]
016F:00E5C827 JMP SHORT 00E5C82F
016F:00E5C829 PUSH EAX
016F:00E5C82A CALL `KERNEL32!GetModuleHandleA`
016F:00E5C82F POP EBP
016F:00E5C830 RET 04
016F:00E5C833 NOP

016F:00E5C834 MOV EAX,[00E635D8] ;<--第二个 KERNEL32!GetVersion
016F:00E5C839 RET
016F:00E5C83A MOV EAX,EAX

016F:00E5C83C PUSH EBP ;<--第三个(暂时没见过哪个被加壳的软件有用到, 不知道是什么, 知道的朋友请指出!)
016F:00E5C83D MOV EBP,ESP
016F:00E5C83F PUSH ESI
016F:00E5C840 PUSH EDI
016F:00E5C841 MOV EAX,[EBP+08]
016F:00E5C844 MOV EDI,EAX
016F:00E5C846 MOV ESI,00E635E4
016F:00E5C84B MOV ECX,25
016F:00E5C850 REP MOVSD
016F:00E5C852 MOV AL,01
016F:00E5C854 POP EDI
016F:00E5C855 POP ESI
016F:00E5C856 POP EBP
016F:00E5C857 RET 04
016F:00E5C85A MOV EAX,EAX

016F:00E5C85C MOV EAX,[00E635DC] ;<--第四个 GetCurrentProcess
016F:00E5C861 RET
016F:00E5C862 MOV EAX,EAX

016F:00E5C864 MOV EAX,[00E635E0] ;<--第五个 GetCurrentProcessId
016F:00E5C869 RET
016F:00E5C86A MOV EAX,EAX

016F:00E5C86C MOV EAX,[00E63678] ;<--第六个 GetCommandLineA
016F:00E5C871 RET
016F:00E5C872 MOV EAX,EAX

016F:00E5C874 PUSH EBP ;<--第七个 KERNEL32!LockResource
016F:00E5C875 MOV EBP,ESP
016F:00E5C877 POP EBP
016F:00E5C878 RET 04
016F:00E5C87B NOP

016F:00E5C87C PUSH EBP ;<--第八个 KERNEL32!FreeResource
016F:00E5C87D MOV EBP,ESP
016F:00E5C87F POP EBP
016F:00E5C880 RET 04
016F:00E5C883 NOP

016F:00E5C884 PUSH EBP ;<--第九个(这个也不知道是什么!)
016F:00E5C885 MOV EBP,ESP
016F:00E5C887 MOV EAX,[EBP+0C]
016F:00E5C88A ADD EAX,BYTE +04
016F:00E5C88D MOV EAX,[EAX]
016F:00E5C88F ADD EAX,[EBP+08]
016F:00E5C892 POP EBP
016F:00E5C893 RET 08
016F:00E5C896 MOV EAX,EAX

016F:00E5C898 PUSH EBP ;<--第十个
016F:00E5C899 MOV EBP,ESP
016F:00E5C89B PUSH EBX
016F:00E5C89C MOV EBX,[EBP+08]
016F:00E5C89F MOV EAX,[EBP+18]
016F:00E5C8A2 PUSH EAX
016F:00E5C8A3 MOV EAX,[EBP+14]
016F:00E5C8A6 PUSH EAX
016F:00E5C8A7 MOV EAX,[EBP+10]
016F:00E5C8AA PUSH EAX
016F:00E5C8AB PUSH BYTE +05
016F:00E5C8AD MOV EAX,[EBP+0C]
016F:00E5C8B0 PUSH EAX
016F:00E5C8B1 PUSH EBX
016F:00E5C8B2 CALL `KERNEL32!FindResourceA`
016F:00E5C8B7 PUSH EAX
016F:00E5C8B8 PUSH EBX
016F:00E5C8B9 CALL `KERNEL32!LoadResource`
016F:00E5C8BE PUSH EAX
016F:00E5C8BF CALL `KERNEL32!LockResource`
016F:00E5C8C4 PUSH EAX
016F:00E5C8C5 PUSH EBX
016F:00E5C8C6 CALL `USER32!DialogBoxIndirectParamA`
016F:00E5C8CB POP EBX
016F:00E5C8CC POP EBP
016F:00E5C8CD RET 14

其中最特殊的是第十个的DialogBoxIndirectParamA, 但在 AeePro 中没有用到,
要是用到的话, 可以将该段代码dump下来, 加到脱壳后的程序上去, 再改该 IAT 指向我们加上去的代码的地址。
这十个特殊函数我想在 1.2, 1.3 中是一样的。
除了上面的特殊函数以外, Asprotect 提供的 API 我们也应该注意, 这我就没仔细研究了。

用Asprotect加壳的程序, 脱壳后不能运行, 我知道的有:
1. 原程序调用Asprotect的"Export Function", 最简单的就是:
push ..
push -1
call GetProcAddress
看其返回值是否为0, 为0 就出错或退出(AeePro就是这样的)

2. 原程序自检加壳后的程序(已经加壳了, 真不知道他是怎么检的)。
3. Asprotect 调用原程序的“初始化”函数, 当到达 OEP 前, 某些全局变量已经初始化了, 脱壳后运行就很可能出错,
解决方法是, 修改脱壳后的程序, 先运行该“初始化”函数, 再跳会到 OEP 运行就可以了。
4. 再有就是DialogBoxIndirectParamA等的了。

当然应该还有其他的。
唉, 好长的一篇!(~!@#$%^&*台下的别扔果皮:)


advanced system agent

 标 题:哪位高手帮忙破解一下，advanced system agent!用asprotect压缩，我解不开。 (96字)
发信人:cozo
时 间:2001-5-16 9:18:45
详细信息:
下载地址忘了，我是在download.com上下到的，很容易找到，2.73最新版，是个多功能小软件，占资源极小。

标 题:http://www.apssoft.com/asa27.zip ，可是 (617字)
发信人:500
时 间:2001-5-19 6:29:32
详细信息:

ASA Version 2.73 是ASPROCTECT1.2 压的，CASPR 可以脱呀！只是无法运行。

它的历史文件如下

Advanced System Agent: Versions history
=======================================

simbols:
+ new features
! improvement/modification or bug fix

Version 2.73
! Program protection improved 《《《《看这里!!!
! Resource leak in alarms feature is fixed
! Alarms loading and saving time is greatly improved
(about 8-10 times faster than before).
! Transparency performance under Windows 2000 is greatly improved.
! Access violation in atomic clock synchronization fixed.
! Improved work of dial-up function.

标 题:asa脱壳后一运行就马上退出, 问题出在GetProcAddress上 (811字)
发信人:fs0
时 间:2001-5-20 23:51:36
详细信息:

asa脱壳后一运行就马上退出, 问题出在GetProcAddress上,
Asprotect 先判断function name是否为-1, 是就返回其“Export functions”
exp:
cmp eax, -1
jnz continue
mov eax, [edx*4+xxxxxxxx]
jmp return
continue:
call GetProcAddress
return:
ret
只要bpx 上面的mov eax, [edx*4+xxxxxxxx],
让原asa运行就知道哪里用到这些Export functions了。
asa里有两处 436723, 452c8c
第一处是判断是否被脱壳了, 是就退出,
第二处是用来返回 get剩下天数的地址, 没有该地址就是过期了。
怎么改不用说了吧(:

还有就是nag screen了, 要get完剩下天数才会出nag screen的,
所以那个call nag screen 的地方应该在asa领空的不远处(MFC的就跳过吧),
一番F12, F8后来到了436c9f, 往上看的是:
jmp xxxxxxxx
push ebx
mov ecx, esi
call 004362e0
xxxxxxxx:
....
把以上三条指令都nop掉, 就可以了, 为什么就自己看吧。


Archpr1.01

 标 题:UNPACK Archpr1.01，遇难！ (6千字)
发信人:liotta
时 间:2001-8-20 10:38:47
详细信息:
作个自我介绍先，我叫Liotta，CRACK初学者，请多关照。

Advanced Archive Password Recovery
Version 1.01
archpr.exe
Entry Point :00001000 Image Base :00400000
Base of Data :00033000 Size of Image :00377000

Tools used :

FI
Peditor
Softice
icedump + iceload
ImpREC

一，脱壳

用FI查一查Archpr1.01的保护方式，显示是用Asprotect.V1.3加壳的,现在让我们来找到
Archpr的OEP。找OEP方法请参考ljttt“对Asprotect脱壳的一点总结”一文。我是这样做的：
先BPX GetVersion中断进入加壳程序，用icedump中的/tracex 400000 eip-8来接近并找到OEP，
Archpr的OEP是00001000。然后用/dump 400000 377000 c:\dump.dmp，再用Peditor的dumpfixer
来修改。

二，用ImpREC重构输入表

在ImpREC中"Attach to an Active Process"下拉框中选择目标Archpr，按"IAT AutoSearch"
"Get Import"、"Auto Trace"并"Show Invalid"是发现：

……
00033530 USER32.dll 0090 DestroyWindow
(1) 00033534 KERNEL32.dll 0123 FindResourceA (注PRT 0092C898)
00033538 USER32.dll 0095 DispatchMessageA
……
0003369C KERNEL32.dll 0133 FreeLibrary
(2) 000336A0 ? 0000 0092C87C
(3) 000336A4 ? 0000 0092C86C
000336A8 KERNEL32.dll 0158 GetCurrentDirectoryA
(4) 000336AC ? 0000 0092C85C
000336B0 KERNEL32.dll 015C GetCurrentThread
……
00033734 KERNEL32.dll 0238 LocalReAlloc
(5) 00033738 ? 0000 0092C874
0003373C KERNEL32.dll 0251 MulDiv
……

怎么USER32.dll中出现KERNEL32.dll的函数，确定有误！右键选中并invalidate掉它。
记下这些未知函数的RVA和PTR，然后设断BPX GetVersion并再次装入目标程序。

:u 92c7d8 l 92c92e-92c7d8
017F:0092C7D8 6A00 PUSH 00
017F:0092C7DA E82D7CFFFF CALL KERNEL32!GetModuleHandleA
017F:0092C7DF A3D4359300 MOV [009335D4],EAX
017F:0092C7E4 E83B7CFFFF CALL KERNEL32!GetVersion <--中断
017F:0092C7E9 A3D8359300 MOV [009335D8],EAX
017F:0092C7EE 68E4359300 PUSH 009335E4
017F:0092C7F3 E8347CFFFF CALL KERNEL32!GetVersionExA
017F:0092C7F8 E8DF7BFFFF CALL KERNEL32!GetCurrentProcess
017F:0092C7FD A3DC359300 MOV [009335DC],EAX <(4)--009335DC
017F:0092C802 E8DD7BFFFF CALL KERNEL32!GetCurrentProcessId
017F:0092C807 A3E0359300 MOV [009335E0],EAX
017F:0092C80C E8C37BFFFF CALL KERNEL32!GetCommandLineA
017F:0092C811 A378369300 MOV [00933678],EAX <(3)--00933678
017F:0092C816 C3 RET
……

对于每项未知函数都先u PTR看看。

如(4)：u 0092C85C
017F:0092C85C A1DC359300 MOV EAX,[009335DC] <(4)--009335DC
017F:0092C861 C3 RET
……
如(3): u 0092C86C
017F:0092C86C A178369300 MOV EAX,[00933678] <(3)
017F:0092C871 C3 RET
……

看到的吧！

(3)号未知函数是KERNEL32!GetCommandLineA
(4)号未知函数是KERNEL32!GetCurrentProcess

如果我们跟进以下任一函数，就可发现一些有意思的JMP表：

:u 92437c l 9244a3-92437c
017F:0092437C FF2534419300 JMP [ADVAPI32!RegCloseKey] <--反过来0093413425
^^^^^^^^^^
017F:00924382 8BC0 MOV EAX,EAX
017F:00924384 FF2530419300 JMP [ADVAPI32!RegCreateKeyExA]
017F:0092438A 8BC0 MOV EAX,EAX
017F:0092438C FF252C419300 JMP [ADVAPI32!RegFlushKey]
017F:00924392 8BC0 MOV EAX,EAX
……

比较困难一点是另外一种情况。
如(1): u 0092C898
017F:0092C874 55 PUSH EBP <--(5)
017F:0092C875 8BEC MOV EBP,ESP
017F:0092C877 5D POP EBP
017F:0092C878 C20400 RET 0004
017F:0092C87B 90 NOP
017F:0092C87C 55 PUSH EBP <--(2)
017F:0092C87D 8BEC MOV EBP,ESP
017F:0092C87F 5D POP EBP
017F:0092C880 C20400 RET 0004
017F:0092C883 90 NOP
017F:0092C884 55 PUSH EBP
017F:0092C885 8BEC MOV EBP,ESP
017F:0092C887 8B450C MOV EAX,[EBP+0C]
017F:0092C88A 83C004 ADD EAX,04
017F:0092C88D 8B00 MOV EAX,[EAX]
017F:0092C88F 034508 ADD EAX,[EBP+08]
017F:0092C892 5D POP EBP
017F:0092C893 C20800 RET 0008
017F:0092C896 8BC0 MOV EAX,EAX
017F:0092C898 55 PUSH EBP <--(1)
017F:0092C899 8BEC MOV EBP,ESP
017F:0092C89B 53 PUSH EBX
017F:0092C89C 8B5D08 MOV EBX,[EBP+08]
017F:0092C89F 8B4518 MOV EAX,[EBP+18]
017F:0092C8A2 50 PUSH EAX
017F:0092C8A3 8B4514 MOV EAX,[EBP+14]
017F:0092C8A6 50 PUSH EAX
017F:0092C8A7 8B4510 MOV EAX,[EBP+10]
017F:0092C8AA 50 PUSH EAX
017F:0092C8AB 6A05 PUSH 05
017F:0092C8AD 8B450C MOV EAX,[EBP+0C]
017F:0092C8B0 50 PUSH EAX
017F:0092C8B1 53 PUSH EBX
017F:0092C8B2 E8157BFFFF CALL KERNEL32!FindResourceA
017F:0092C8B7 50 PUSH EAX
017F:0092C8B8 53 PUSH EBX
017F:0092C8B9 E87E7BFFFF CALL KERNEL32!LoadResource
017F:0092C8BE 50 PUSH EAX
017F:0092C8BF E8807BFFFF CALL KERNEL32!LockResource
017F:0092C8C4 50 PUSH EAX
017F:0092C8C5 53 PUSH EBX
017F:0092C8C6 E8917BFFFF CALL USER32!DialogBoxIndirectParamA <--(1)
017F:0092C8CB 5B POP EBX
017F:0092C8CC 5D POP EBP
017F:0092C8CD C21400 RET 0014

(1)号未知函数是USER32!DialogBoxIndirectParamA
(2)号未知函数是KERNEL32.dll!FreeResource ？？ 请指点！
(5)号未知函数是KERNEL32.dll!LockResource ？？ 请指点！

其实我自已并不明白(2)(5)号未知函数是如何获得的！只是参考了NchantA[PGC][EVC]写
“Unpacking asprotect”一文。请知情者多多指点！

修复完输入表后，就可"Fix Dump"，为了避免不必要的麻烦我们还是"add new section"吧。
如此脱壳后的程序运行是能运行，不过在出现‘信息框’时总是出错！唉，失败。
不过，写这篇文章的目的就是要抛砖引玉，请各位多多指点，Thanks。


ASProtect V1.2

标 题:ASProtect V1.2之脫殼簡述--C-pen (1千字)
发信人:1212
时 间:2001-2-13 9:52:09
详细信息:
ASProtect V1.2和V1.1C其實大同小異.我們來脫它.以下我只列重點,相信大家均能手動脫殼.
(1)Import Table:使用最新版的Imp_list V.1.13(2001/01/06)來重建,
不過你如果選Auto-detect Import是無法重建的,估計
ASProtect做了修正去妨它,沒關係它妨新版卻不妨舊版
用舊版去重建的目的,主要是去找.idata Section它得
出的Import Table並不能用,那是因為ASProtect V1.2
對Import Table又做了新的處理,只能用Imp_list
1.13來重建,當然你也可以自己去程式中找.idata
Section,反正ASProtect的Import Table編碼處都長
的一樣.在Imp_list V1.13中不選Auto-detect
Import,RVA=66000,SIZE=2000,Level=1,如此即能重
建,再不然進入程式跟到編碼結束時下a eip/jmp eip
再用Imp_list來重建.
(2)Hook:脫殼後的程式還是不能用因為ASProtect有留下Hook,如何移除它
呢?那你得感謝ASProtect,因為它完善的SEH系統會告訴你,重開
始的SEH MessageBox中得知它留下的Hook位址為00C1C6D8,用
HexWorkshop打開已脫殼的文件,查找D8C6C100你會發現在RVA
64FAC,64FB0中各有一個,用W32Dasm去反組譯,查找0064FAC,你會
發現有如下的程式
CALL [0064FAC]
等價於
CALL 00C1C6D8 <-- 在我們已脫殼的文件中是不會有這個位址
的程式碼
比較原程式發現原來00C1C6D8只是一個RET,真是無聊!好了!那你
應該知道如何移除這個Hook吧!我的方法是找個位址放RET,再將
RVA 64FAC,64FB0指向這個位址,我選在隔壁即RVA 64FB4改:
RVA 64FAC 00C1C6D8 --> 00464FB4
RVA 64FB0 00C1C6D8 --> 00464FB4
RVA 64FB4 00 --> C3
(註:我標示的是用RVA而不是OffSet,那是因為我是用ICEdump去脫
故我需令OffSet=RVA,若你是用Procdump去脫.則OffSet並不
一定等於RVA端視你的操作選項而定)

JOHNSON 2001/02/13
标 题:補充-- C-pen (916字)
发信人:1212
时 间:2001-2-14 12:53:57
详细信息:
有關我說的重建Import Table的部份,證實第一種是無法重建的,因為ASProtect會干擾Imp_list的運作,所以只能用第二種方法,本來想讓大家方便,沒想到變成隨便,Sorry!!
事實上我是用第二種方法去重建,第一種是推論,沒想到是錯誤!!故此方法必定可行,若你操作正確的話.
ASProtect的對Import table編碼處在:
:00C1F752 PUSHAD
:00C1F753 CLD
:00C1F754 MOV ESI,[EBP-04]
:00C1F757 LODSD
:00C1F758 OR EAX,EAX
.
.
:00C1F79E CALL 00C1F454
:00C1F7A3 POP EBX
:00C1F7A4 JMP 00C1F774
:00C1F7A6 POPAD <--走到這編碼已完成
.
.
:00C1F7C4 JMP 00C1F7E0
在:00C1F7C4下a eip/jmp eip
按F5離開Soft-ICE再使用Imp_list即能重建Import Table(別忘了RVA=66000,SIZE=2000)
至於hying所說的還有其他的Hook,能否具體說明,因我移除這兩個Hook
後程式運行的很正常.
最後更正上文的兩個錯誤:
1.查找0064FAC --> 00464FAC
2.CALL [0064FAC] --> CALL [00464FAC]
真的老了,錯誤百出,還望海涵.

JOHNSON 2001/02/14


explor2000

标 题:一种偷懒的破解方法。请兄弟们多提宝贵意见。 (5千字)
发信人:kingtall
时 间:2001-4-25 16:57:12
详细信息:
explor2000的破解

ASProtect1.2以后版本加壳，ep=5f4690。
用bo2k找不到入口。手动跟踪方法参见（1），脱壳方法参见（2）。

explor2000的破解方法如下。

先运行superbpm，再运行trw，下bpx 5f4690，g。
trw弹出后，下pedump c:\explor2k.exe 脱壳。
用w32dasm对脱壳后的explor2k.exe进行反汇编。在Refs/String Data Refrences中找'trialversion'，找到后双击，看到下面这段(用find text找也可)

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005D1D0E(U), :005D1D1A(C)
|
:005D1D2D 8D45F8 lea eax, dword ptr [ebp-08]
:005D1D30 8B1520D05F00 mov edx, dword ptr [005FD020]
:005D1D36 E87523E3FF call 004040B0 ;这是一个关键的call
:005D1D3B 8B45F8 mov eax, dword ptr [ebp-08]
:005D1D3E E83524E3FF call 00404178 ;这里不是关键，进去就知道
:005D1D43 85C0 test eax, eax
:005D1D45 0F8FD2000000 jg 005D1E1D ；跳就对了
:005D1D4B 833D28D05F0000 cmp dword ptr [005FD028], 00000000 ;[5fd028]中放的是剩余天数
:005D1D52 7E47 jle 005D1D9B
:005D1D54 833D28D05F001E cmp dword ptr [005FD028], 0000001E ；试用期为30天
:005D1D5B 7E07 jle 005D1D64
:005D1D5D B805000000 mov eax, 00000005
:005D1D62 EB0B jmp 005D1D6F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005D1D5B(C)
|
:005D1D64 B823000000 mov eax, 00000023
:005D1D69 2B0528D05F00 sub eax, dword ptr [005FD028]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005D1D62(U)
|
:005D1D6F 83F80A cmp eax, 0000000A
:005D1D72 7E05 jle 005D1D79
:005D1D74 B80A000000 mov eax, 0000000A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005D1D72(C)
|
:005D1D79 8B55FC mov edx, dword ptr [ebp-04]
:005D1D7C 52 push edx
:005D1D7D 68641F5D00 push 005D1F64
:005D1D82 50 push eax
:005D1D83 8B45FC mov eax, dword ptr [ebp-04]
:005D1D86 8B90FC040000 mov edx, dword ptr [eax+000004FC]
:005D1D8C B103 mov cl, 03
:005D1D8E 8B45FC mov eax, dword ptr [ebp-04]
:005D1D91 E812020000 call 005D1FA8
:005D1D96 E982000000 jmp 005D1E1D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005D1D52(C)
|
:005D1D9B E8140EE3FF call 00402BB4
:005D1DA0 B80A000000 mov eax, 0000000A
:005D1DA5 E8CE10E3FF call 00402E78
:005D1DAA 83F802 cmp eax, 00000002
:005D1DAD 7550 jne 005D1DFF
:005D1DAF 6A30 push 00000030

* Possible StringData Ref from Code Obj ->"EXPLOR2000"
|
:005D1DB1 68E01E5D00 push 005D1EE0
:005D1DB6 8D4DF4 lea ecx, dword ptr [ebp-0C]
:005D1DB9 8B45FC mov eax, dword ptr [ebp-04]
:005D1DBC 8B8054050000 mov eax, dword ptr [eax+00000554]

* Possible StringData Ref from Code Obj ->"TrialVersion"
|
:005D1DC2 BAF41E5D00 mov edx, 005D1EF4 ；显示试用字样
:005D1DC7 E838B0F5FF call 0052CE04

下bpx 5d1d36，trw弹出后按F8进入
0167:004040B0 31C9 XOR ECX,ECX
0167:004040B2 85D2 TEST EDX,EDX
0167:004040B4 7421 JZ 004040D7
0167:004040B6 52 PUSH EDX
0167:004040B7 3A0A CMP CL,[EDX] ；[edx]=[1333405]=0。把它改为1，bd，g。
0167:004040B9 7417 JZ 004040D2 ；嘿嘿，居然成为注册版了。不过用户名是乱码。
0167:004040BB 3A4A01 CMP CL,[EDX+01]
0167:004040BE 7411 JZ 004040D1
0167:004040C0 3A4A02 CMP CL,[EDX+02]
0167:004040C3 740B JZ 004040D0
0167:004040C5 3A4A03 CMP CL,[EDX+03]
0167:004040C8 7405 JZ 004040CF
0167:004040CA 83C204 ADD EDX,BYTE +04
0167:004040CD EBE8 JMP SHORT 004040B7
0167:004040CF 42 INC EDX
0167:004040D0 42 INC EDX
0167:004040D1 42 INC EDX
0167:004040D2 89D1 MOV ECX,EDX
0167:004040D4 5A POP EDX
0167:004040D5 29D1 SUB ECX,EDX
0167:004040D7 E904FFFFFF JMP 00403FE0
0167:004040DC C3 RET

因为4040b0经常被调用，所以不能在这里修改。一种偷懒的方法是使用内存补丁ppatcher3.93。
把以下内容存为ppatcher.ppc，连同ppatcher.exe考到explor2000安装目录下，运行ppatcher.exe即可，连脱壳也不用了。
------------------------------------------------
#Process Patcher Configuration File
Version=3.93
WaitForWindowName=Explor2000

PatchAuthor=kingtall

DisplayName=Explor2000
Filename=Explor2000.exe
Filesize=933376
Address=0x1333405:0x00:0x01
#End of Configuration File
-----------------------------------------------

程序中一定有直接对[1333405]进行修改的地方，懒得再找了。哪位大哥找到了，别忘说一声。

（1）
http://001.com.cn/forum/toye/14434.html
标 题:如何跟踪ASProtect外壳加密过的程序？ (7千字)
发信人:ljtt
时 间:2001-4-13 21:30:27

（2）
http://001.com.cn/forum/toye/15931.html
标 题:PicturesToExe3.51的脱壳 (2千字)
发信人:hying
时 间:2001-4-22 19:18:35

标 题:asprotect 加壳程序又有新的变化 (2千字)
发信人:javaj901
时 间:2001-4-27 11:46:55
详细信息:

asprotect 加壳程序又有新的变化

我这里不打算讲如何脱壳和IAT的重建，因为ljtt兄的文章已经是很经典的了，也不打算讲如何破解，因为kingtall兄也已经说的很清楚了，我只想就我跟踪sfx2000这个程序看到的asprotect这个“伟大”的程序的新变化。

在sfx2000.exe 里面，我们看到了asprotect较之以前的变化的地方
1.增加了OEP的定位的难度
原来asprotect在处理完 IAT以后出来，按3-4次F8，然后按2-3次F12，就快接近OEP了，一般是连着的2-3个ret命令，就到OEP了。
在sfx2000里面，不是这样的，在处理完 IAT以后出来，对于OEP的定位又增加了极高的难度，在这里的程序是分段恢复的，每一段的恢复都用了很大的循环次数来完成的，给我的感觉是程序在这里并没有做什么，都用来恢复后面的程序了，这里的程序用了相当多的花指令，一部分是jMP，还有一部分跳转是用CALL指令来完成的，所以指令必须找准循环的结束点，否则一不小心，从一个CALL就进到主程序里面了，又的从头开始。以前用冲击波来找protect压缩的程序的OEP，几乎没有找不到的，但是这一次却不行了，只好用手动的方法来找了，发现了上面的新变化。如果大家跟踪的话，可以看到在cs:135bb37处的指令是这样的：
cs:135bb37 jmp eax
就是从这里到OEP的，这里的eax是5f4690。

2.另外的变化是输入函数的处理又有了新的花招
asprotect 把一些输入函数在程序解压时首先运行，然后把得到的值存入一个变量里面，当解压后的程序去调用输入函数时，asprotect把这个函数改成直接到对应的变量里面去取值就可以了。这个变化是这样发现的，在用importREC.exe来重建IAT 时，有几个函数找不到正确的名称，我就随意给它们定了几个函数，看看程序能不能运行，结果是程序一运行老有非法操作，跟踪了很长时间也解决不了，最后想到是不是那几个没有修正的函数造成的，进去看那几个函数是干什么的，发现有的是到几个变量里面去取值赋给EAX，也有的是垃圾函数，我就想到看看那几个变量里面的值最初是如何得到的，就用了bpm 命令来看，一看使我大吃一惊，这几个变量里面的值是在运行了几个重要的函数后把得到的值赋进去的，实际上也就是输入函数的新的处理方法。我把得到的这几个函数的RVA，在asprotect的解压缩程序的地址以及真实名称和得到的值的存储的地址列出来：
[RVA] 地址 函数名称 得到的值存储的地址
[2192a4] 133c86c GetCommandlLineA [1343678]
[219488] 133c834 GetVersion [13435D8]
[2194f8] 133c864 GetCurrentProcessID [13435E0]
当解压后的程序去调用这几个函数时，就到对应的变量里面去取就可以了。
另外还有几个函数，在程序里面不太用，大家有兴趣的话可以在下面的程序里面看到，在cs:133c7da 打头的地方，大家可以跟踪去看一看。
当我搞定这个程序的时候，心里不免感叹asprotect真是太。。。。。。

就此打住。


Maple2.

标 题:可以找到IAT (2千字)
发信人:SayYes!
时 间:2001-4-21 19:15:39
详细信息:
我在此连接下载Maple2.0 URL= http://www.shellfishsoft.com/maple.zip
Comment 电脑使用的文字处理程序非常多，从简单的只能编辑纯文字，到复杂的可编辑排版的都
有，而Maple的特点则是可以对文件建立阶层式的结构，就像书籍章节段落的安排一样，
让文件看起来阶层分明，有条不紊。在Maple视窗的左侧便是阶层的树状图，使用者可以
加入无限个节点与次节点，代表上下的阶层分类。右侧则是显示该阶层的内容，支持完
整的格式化文字，如字型、尺寸、颜色、对齐等功能，并可插入图片或物件，或者连结
其他的文件。亦支持鼠标拖、放的功能。

Calculating hash of 1034240 bytes file `E:\Maple\maple.exe`...
MD5 : 7F36CC2CDA4A8450B4802D9B3D59F336
CRC-32 : E3799E3B
---------------------------------------------------------------------------------------
工具TRW2000,Imprec,

henryw 大侠的发现叫人震惊，我自己跟了一下，结果和他差不多^=^

从跟踪的代码看来，初步估计是Asprotect1.2(不是Asprotect1.2 se)。

1)先讲讲 OEP>>
令人震惊的是，程序於 FC9D5D JMP EAX (此时EAX==401000),再从401000 JMP 401012 (可能是OEP)，
最后，会跳到5DA614 (也可能是OEP)。经试验验证， OEP == 401012 (与冲击波的一样，它真厉害呀！)

2)ImportTable>>
IAT 的RVA 是 412164 , length 是 11c4 (指在ImpREC中。注意，若是revirgin 则是11c0)。
其中，的IAT之间有很大的跳跃。
ImpREC1.2beta2 中的IAT AutoSearch失效。在ImpREC 中添入OEP，IAT，Length后,直接按GetImport。
经修复后只剩下一个rva没修好，它是KERNEL32!GetProcAddress (这是capsr1012告诉我的，我没去跟)。
修复后的程序可以正常运行。

3)原来CASPR1012 可以对这个程序脱壳，这说明我的假设是没错的-->是ASprotect 1.2 !!!!
(这个年代竟还有人用这东东^_^)

4)追踪过程中，无意间发现代码如下，哪位知道是何用途？？
017F:00FB0970 CALL 00FADC78
017F:00FB0975 CMP DWORD [00FB3578],BYTE +00
017F:00FB097C JZ 00FB098F
017F:00FB097E MOV EAX,[00FB3558]
017F:00FB0983 CALL 00FA3400
017F:00FB0988 PUSH EAX
017F:00FB0989 CALL `MAPLE!@GetRegistrationInformation$qqspc`
017F:00FB098F CMP DWORD [00FB3598],BYTE +00
017F:00FB0996 JZ 00FB09A3
017F:00FB0998 PUSH DWORD 00FAC730
017F:00FB099D CALL NEAR [00FB3598]
017F:00FB09A3 CMP DWORD [00FB3558],BYTE +00
017F:00FB09AA JNZ 00FB09B5
017F:00FB09AC CMP DWORD [00FB3598],BYTE +00
017F:00FB09B3 JZ 00FB09

5)有谁知道这个程序是如何知道:是否已经过了30天的试用期？

标 题:henryw 大侠，就 Asprotect 1.2 ，没别的。(我的看法) (1千字)
发信人:1212
时 间:2001-4-22 8:01:26
详细信息:

henryw 大侠，就 Asprotect 1.2 ，没别的。(我的看法)

至于 214164 ，与Asprotect 1.1 差不多。只需追到如下代码。到我标注的地方看看EDI。。。
所以此时，IAT start rva == EDI的值- IMAGEBASE

017F:00FAF752 PUSHA // 《《注意这里
017F:00FAF753 CLD
017F:00FAF754 MOV ESI,[EBP-04]
017F:00FAF757 LODSD
017F:00FAF758 OR EAX,EAX
017F:00FAF75A JZ 00FAF7A6
017F:00FAF75C MOV EDI,EAX
017F:00FAF75E ADD EDI,[00FB3560]
017F:00FAF764 MOV [EBP-08],EDI
017F:00FAF767 MOV EBX,ESI
017F:00FAF769 XOR ECX,ECX
017F:00FAF76B DEC ECX
017F:00FAF76C XCHG EDI,ESI
017F:00FAF76E XOR AL,AL
017F:00FAF770 REPNE SCASB
017F:00FAF772 XCHG EDI,ESI
017F:00FAF774 LODSB
017F:00FAF775 CMP AL,00
017F:00FAF778 JZ 00FAF757
017F:00FAF77A CMP AL,06
017F:00FAF77D JNZ 00FAF785
017F:00FAF77F ADD DWORD [EBP-08],BYTE +04
017F:00FAF783 JMP SHORT 00FAF774
017F:00FAF785 PUSH EBX
017F:00FAF786 PUSH ESI
017F:00FAF787 PUSH EBX
017F:00FAF788 LEA EBX,[EBP-08]
017F:00FAF78B PUSH EBX
017F:00FAF78C CMP AL,02
017F:00FAF78F JZ 00FAF797
017F:00FAF791 MOVZX ECX,BYTE [ESI]
017F:00FAF794 INC ECX
017F:00FAF795 JMP SHORT 00FAF79C
017F:00FAF797 MOV ECX,04
017F:00FAF79C ADD ESI,ECX
017F:00FAF79E CALL 00FAF454
017F:00FAF7A3 POP EBX
017F:00FAF7A4 JMP SHORT 00FAF774 <=== 第一次到达这里时看看EDI == 一般上就是IAT start
017F:00FAF7A6 POPA // 《《注意这里
017F:00FAF7A7 CALL 00FAF7E6


NotePro 1.57

 标 题:标题：NotePro 1.57 脱壳之简版(Asprotect 1.2se) (1千字)
发信人:SayYes!
时 间:2001-5-13 20:32:35
详细信息:
标题：NotePro 1.57 脱壳之简版(Asprotect 1.2se)

下载URL = http://download.21cn.com/file/utility/bianji/noteproV1.57.zip

Calculating hash of 978432 bytes file `C:\Program Files\NotePro\notepro.exe`...
MD5 : 57322E435C1E39F7BECA3585D5E05D50
CRC-32 : FEE836FF
------------------------------------------------
[重要资料]
Entry Point : 001012
ImageBase : 400000
IAT Start RVA : 1C1150
IAT Length : 1174 (ImpREC)
------------------------------------------------
[使用工具]
于win98se 中使用：TRW2000v1.23, SuperBPM ,ImpREC1.2beta2.

[脱壳]
1)运行SuperBPM,并选择Erase
2)运行TRW2000,用"Load" 调入notepro.exe。
3)在TRW中,下bpx 401012 (即上面的EntryPoint+ImageBase) , 再按F5
4)最后会在 401012 处停下。
5)bc * ,再用 pedump c:\notedump.exe ,再F5
6)到此脱壳完毕。 (无需关闭notepro.exe)

[修复ImportTable]
1)打开ImpREC , 调入 notepro.exe
2)在左下角的IAT Infos needed 添入资料：
OEP : 001012
RVA : 400000
Size : 1C1150
直接按"GetImport" 钮。
3)用ShowInvalids钮及鼠标右键来修复剩余的函数名。
4)最后还有 5 个地址不能修复，需要手工填入。它们皆属于KERNEL32.dll
它们是：FreeResource, GetCommandLineA, GetCurrentProcessId, GetVersion, LockResource
5)所有函数名修复后，按FixDump(使用缺省选项)来修复我们dumped 出来的 "notedump.exe"
6)完毕。将notedump_.exe 拷贝到 notepro的目录中。notedump_.exe 可以正常运行。


PicturesToExe3.51

标 题:PicturesToExe3.51的脱壳 (2千字)
发信人:hying
时 间:2001-4-22 19:18:35
详细信息:
文章标题：PicturesToExe3.51的脱壳
加壳软件：Asprotect1.2以上(本人估计，不一定准确)
文章重点：输入表的修复(关于如何寻找入口点等可参考其他脱壳文章)
使用软件：Trw2000、Import REConstructor v1.2 beta2、procdump162、Uedit32
参考文章：BestFont《用Import REConstructor v1.2 beta2 修复输入表》
PicturesToExe3.51用Asprotect加的壳，估计是1.2以上版本，用caspr1.012无法脱壳，只能手动。
先用冲击波2000找入口点，竟然没有找到，看样子得全手动了。祭起Trw2000，经过若干小时的艰苦奋战(有点夸张)，终于找到入口点为51133C，停下后用procdump162选“使用实际输入表”然后dump(full)，再修改入口为51133C，到此第一场战役胜利结束。
接下来就该修复输入表了，按照《用Import REConstructor v1.2 beta2 修复输入表》的方法修复，最后发现还有几个无法解决，分别如下：
偏移 值
1161F8 E3C86C
116320 E3C874
116364 E3C834
1163B4 E3C864
1163BC E3C87C
那么这些值所指向的地址到底有什么呢？我们看一下：
0167:00E3C834 MOV EAX,[00E435D8]
0167:00E3C839 RET
(调用:00407824 FF2564635100 jmp dword ptr [00516364])

0167:00E3C864 MOV EAX,[00E435E0]
0167:00E3C869 RET
(调用:00407784 FF25B4635100 jmp dword ptr [005163B4])

0167:00E3C86C MOV EAX,[00E43678]
0167:00E3C871 RET
(调用:004012C0 FF25F8615100 jmp dword ptr [005161F8])

0167:00E3C874 PUSH EBP \
0167:00E3C875 MOV EBP,ESP |实际什么都没干,
0167:00E3C877 POP EBP |相当于 ret 04
0167:00E3C878 RET 04 /
(调用:004078AC FF2520635100 jmp dword ptr [00516320])

0167:00E3C87C PUSH EBP \
0167:00E3C87D MOV EBP,ESP |同上
0167:00E3C87F POP EBP |
0167:00E3C880 RET 04 /
(调用:00407774 FF25BC635100 jmp dword ptr [005163BC])

先解决最后两个，我们找到:0040402A C20400 ret 0004，所以只要将上面两个调用处改为：
0167:004078AC E979C7FFFF jmp 0040402A
0167:00407774 E9B1C8FFFF jmp 0040402A
就行了。
再来看前面三个，发现：
[00E435D8]=C000A004
[00E435E0]=FFF9CAB3
[00E43678]=816CD848
而且都是固定不变的，所以可以这样改：
00407824 B804A000C0 mov eax, C000A004
00407829 C3 ret

00407784 B8B3CAF9FF mov eax, FFF9CAB3
00407789 C3 ret

004012C0 B848D86C81 mov eax, 816CD848
004012C5 C3 ret
现在输入表里那些无用的垃圾就都没用了，你可以随便选一个函数填上去。然后将脱下来的原始文件先修改一下，再修复输入表，都做好以后就可以运行了。


SynchroMagic 2.0 build 503

 标 题:SynchroMagic 2.0 build 503 (2千字)
发信人:blowfish
时 间:2001-5-20 23:11:44
详细信息:
http://www.gelosoft.com/synchro.exe

ASProtect的壳。OEP为43EC73。
下面5处引入函数名无法在ImpRec中解析：
RVA：6915C，69268，69274，69350，69380

对应的程序段为（下面的是6个函数）：

//这里是初始化时调用6个函数的地方
0177:0167C868 PUSH 00
0177:0167C86A CALL KERNEL32!GetModuleHandleA
0177:0167C86F MOV [016835D4],EAX
0177:0167C874 CALL KERNEL32!GetVersion
0177:0167C879 MOV [016835D8],EAX
0177:0167C87E PUSH 016835E4
0177:0167C883 CALL KERNEL32!GetVersionExA
0177:0167C888 CALL KERNEL32!GetCurrentProcess
0177:0167C88D MOV [016835DC],EAX
0177:0167C892 CALL KERNEL32!GetCurrentProcessId
0177:0167C897 MOV [016835E0],EAX
0177:0167C89C CALL KERNEL32!GetCommandLineA
0177:0167C8A1 MOV [01683678],EAX
0177:0167C8A6 RET

//以下紧跟着的是直接使用上面几个函数的返回值的地方
0177:0167C8A7 NOP
0177:0167C8A8 PUSH EBP
0177:0167C8A9 MOV EBP,ESP
0177:0167C8AB MOV EAX,[EBP+08]
0177:0167C8AE TEST EAX,EAX
0177:0167C8B0 JNZ 0167C8B9
0177:0167C8B2 MOV EAX,[01683560]
0177:0167C8B7 JMP 0167C8BF
0177:0167C8B9 PUSH EAX
0177:0167C8BA CALL KERNEL32!GetModuleHandleA
0177:0167C8BF POP EBP
0177:0167C8C0 RET 0004
0177:0167C8C3 NOP
0177:0167C8C4 MOV EAX,[016835D8]
0177:0167C8C9 RET
0177:0167C8CA MOV EAX,EAX
0177:0167C8CC PUSH EBP
0177:0167C8CD MOV EBP,ESP
0177:0167C8CF PUSH ESI
0177:0167C8D0 PUSH EDI
0177:0167C8D1 MOV EAX,[EBP+08]
0177:0167C8D4 MOV EDI,EAX
0177:0167C8D6 MOV ESI,016835E4
0177:0167C8DB MOV ECX,00000025
0177:0167C8E0 REPZ MOVSD
0177:0167C8E2 MOV AL,01
0177:0167C8E4 POP EDI
0177:0167C8E5 POP ESI
0177:0167C8E6 POP EBP
0177:0167C8E7 RET 0004
0177:0167C8EA MOV EAX,EAX
0177:0167C8EC MOV EAX,[016835DC]
0177:0167C8F1 RET
0177:0167C8F2 MOV EAX,EAX
0177:0167C8F4 MOV EAX,[016835E0]
0177:0167C8F9 RET
0177:0167C8FA MOV EAX,EAX
0177:0167C8FC MOV EAX,[01683678]
0177:0167C901 RET
0177:0167C902 MOV EAX,EAX
0177:0167C904 PUSH EBP
0177:0167C905 MOV EBP,ESP
0177:0167C907 POP EBP
0177:0167C908 RET 0004
0177:0167C90B NOP
0177:0167C90C PUSH EBP
0177:0167C90D MOV EBP,ESP
0177:0167C90F POP EBP
0177:0167C910 RET 0004

有种办法可以对上述的几个函数进行特殊处理，以便脱壳后的程序可以跨平台运行，不过比较麻烦。就是新增一个section，把上述地址为0168XXXX的变量全部放在这个新的section中（当然地址不再是0168XXXX了，相应地也要修改引用这些地址的那些指令），并把上述引用这些0168XXXX地址的几段代码也都搬到这个新的section中。并采用SMC，修改去壳后的EXE，将程序入口指向这个新的section，这样一加载去壳后的EXE就会执行这个新的section中的代码，完成上述几个函数的初始化。在这个新的section中，还要增加代码填充ImpRec未解析出来的那几个RVA处的值，以便指向新的section中的这几段代码。
总的来说就是把本来应该放在壳中的东西全部搬到新增的section中去。


Tag&Rename 1.9

标 题:Asprotect 又一新招？！目标Tag&Rename 1.9 (811字)
发信人:SayYes!
时 间:2001-3-22 10:37:36
详细信息:
目标：Tag&Rename 1.9 版
下载地址：http://www.softpointer.com/tr.htm
主文件FileVersion ：1.9.1.3
主文件HASH 结果如下： (使用DAMN 的Hash Calculator,该工具可从此处取得 http://www.damn.to )
Calculating hash of 716800 bytes file `C:\tagren19\TagRename.exe`...
MD5 : 9C4C6270408CE694CA8B03DD8650869F
CRC-32 : 61E5AB17
若你的HASH 结果与我的不同，说明你下载的版本与我的不同。
----------------------------------------------------------------------------------

1)与Tag&Rename 1.8 build 2 比较，估计使用同一个版本的Asprotect.

2)程序编程时，用了一个新的Asprotect API , 来实现 运行时对主程序作CHECKSUM 。( 不知道有没有说错^_^)

只可惜，Alexey 现在采取封闭策略，只有Asprotect的用户才有该SE(Special Edition)版本。
我们只有望梅止渴的份。

2001.03.22 星期四 上午
标 题:peterchen真可爱，给你一点tips (914字)
发信人:SayYes!
时 间:2001-3-22 12:25:26
详细信息:
环境：win98se + trw2000 + 苏慧伦的《鸭子》MP3(非调试状态时^_^)

1)运行程序，跟踪。很快就发现程序注册流程似乎跟以前一样。
只需要改动 45c618 的 74 (即je ????) 变成 两个nop ，就可以
成功注册。 (这个部分非常简单^_^，没想到还要我说)

2)成功注册后，一切似乎还正常，看看Help>About ,发现情况不对。
不应该有一条奇怪的线条。于是就假设是程序作了 bound check。

重头来过，做上面1)后，立即下指令 bpm 45c618 r 。
F5 被拦截(多处)，一路跟下去，发现原来不是bound check!
是CheckSum之类，并且在Asprotect领空有数据存取(这说明什
么？ 不言而喻。。)。。。。。所以不管改程序
哪一部分，程序都会出错，甚至不能运行。

3)程序的OEP (Original Entry Point) 是550a6c ,由于没有工具可
以修复ImportTable,我也懒的手工修复了(反正过几天又会来一个新
版本了，另一方面我认为与1.8build2的壳是同一个版本，故没必
要再去跟它耗)

言尽於此，开工去了。
--------
[幸好它没有什么Format之类的不良代码，否则。。。]

标 题:两个给peterchen的回复：(内详) (1千字)
发信人:SayYes!
时 间:2001-3-22 20:27:55
详细信息:

问1：为什么不写1.9的破解过程?
答：基本上，破解过程就跟你贴的 1.7 一个样(破解非常简单)。你倒说说看，还有什么值得再去重复写的？
其实，关键是脱壳。 (Asprotect1.1)脱壳、找OEP的过程，写的人好多好多，读者能不能举一反三、
融会贯通,才是最重要的。Asprotect1.2 与Asprotect 1.1 的过程是类似的。当然，
重建ImportTable这个神圣的任务，只好让工具软件代劳了。

题外话： 说起SAC ，无人不晓！曾在他某个nfo文件中看到他与Asprotect1.1 的奋斗日志。
第一次手工修复ImportTable 时，就花了他近4个小时！！(别忘记，他可是大师级人
物！也得花这么多时间去搞)。

问2：能不能作出注册机？
答：No Way !! 因为这个软件中使用了变种的 MD5算法 ，只能穷举！
注册码形式如右: TR-xxxxxxxx-yyyyyyyy

最后问你一个问题： 引用你的贴子，
------------------
序 号:461
标 题:再次请教! (204字)
发信人:peterchen
时 间:2001-3-22 17:29:40
阅读次数:4
详细信息:
1.8就找到注册码：
http://www.inhua.com/down/TagRename18.exe
Name: PhrozenCrew, Reg.No.:1393305812
哪么1.8以上的能找到或计算出密码吗？
哪位大客愿意写一篇1.8以上的破解教程？
1.8版的破解过程发布了吗？
------------------
请问，你所说的注册码从何取得？？？！ 它肯定是假的，请相信我、相信你的智慧。


UNPack CommView v.3.0

 标 题:UNPack CommView v.3.0 (8千字)
发信人:liotta[BCG]
时 间:2001-9-1 22:53:21
详细信息:
作个自我介绍先，我叫Liotta[BCG]，CRACK初学者，请多关照。
下文简述Asprotect1.3脱壳及重构问题，仅供新手参考。

CommView v.3.0

关于CommView：
CommView is a program for monitoring Internet and Local Area
Network (LAN) activity capable of capturing and analyzing
network packets. It gathers information about data passing
through your dial-up connection or Ethernet card and decodes
the analyzed data.
WWW: http://www.tamos.com

目标 :CV.exe
Entry Point :00001000 Image Base :00400000
Base of Data :00177000 Size of Image :001E5000

相关工具:
FI
Peditor
Softice
icedump + iceload
ImpREC

参考文档：
ljttt “对Asprotect脱壳的一点总结”
fs0 “脱Advanced Email Extractor PRO的壳 ”

一，脱壳

用FI查一查CV.exe的保护方式，显示是用Asprotect.V1.2?加壳的。
现在让我们来找到CV.exe的OEP。找OEP方法请参考以上文档。
我是这样做的：

用iceload装入CV.exe
BPX GetProcAddress中断进入加壳程序，
BD*
按几下F12来到

017F:01791AD0 55 PUSH EBP
017F:01791AD1 8BEC MOV EBP,ESP
017F:01791AD3 83C4F4 ADD ESP,-0C
017F:01791AD6 E85516FFFF CALL 01783130
017F:01791ADB 0F856B23FFFF JNZ 01783E4C
017F:01791AE1 E82228FFFF CALL 01784308
017F:01791AE6 E8DD6FFFFF CALL 01788AC8
017F:01791AEB E86C79FFFF CALL 0178945C
017F:01791AF0 E89BA4FFFF CALL 0178BF90
017F:01791AF5 E85223FFFF CALL 01783E4C <--按F8进入

按F10一会就到一段所谓SEH（Structure Exception Handling）反跟踪代码
如果你不小心中招，可用icedump中的/tracex 400000 eip-8来回到正道。

017F:01790614 31C0 XOR EAX,EAX
017F:01790616 C3 RET <--小心SEH，向下看看
017F:01790617 EB01 JMP 0179061A
017F:01790619 E831C0EB02 CALL 0464C64F
017F:0179061E CD20 INT 20 VXDJmp EB30,7F64
017F:01790624 01E9 ADD ECX,EBP
017F:01790626 648920 MOV FS:[EAX],ESP
017F:01790629 3100 XOR [EAX],EAX
017F:0179062B EB01 JMP 0179062E <--在该行按F7直接跳到这里
017F:0179062D 68648F0500 PUSH 00058F64

按F8几次来到
017F:01790639 58 POP EAX
017F:0179063A 6830E27801 PUSH 0178E230 <--以下是可选择的断点
017F:0179063F 6864077901 PUSH 01790764
017F:01790644 68DCFC7801 PUSH 0178FCDC
017F:01790649 688CF97801 PUSH 0178F98C
017F:0179064E 6864F37801 PUSH 0178F364
017F:01790653 68F4ED7801 PUSH 0178EDF4
017F:01790658 6878007901 PUSH 01790078
017F:0179065D C3 RET

下断点bpx 0178e230
你如果想了解Asprotect是如何还原数据及处理DLL，可参考
fs0的“脱Advanced Email Extractor PRO的壳 ”一文

按F10来到
017F:017911C4 68FF691A33 PUSH 331A69FF
017F:017911C9 6850250000 PUSH 00002550
017F:017911CE 6870EC0000 PUSH 0000EC70
017F:017911D3 6800600100 PUSH 00016000
017F:017911D8 FF3514307901 PUSH DWORD PTR [01793014]
017F:017911DE E801000000 CALL 017911E4 <--注意花指令
017F:017911E3 8183C404E888B8FFFFE8ADD DWORD PTR [EBX+88E804C4],E8FFFFB8
017F:017911ED 0100 ADD [EAX],EAX
017F:017911EF 0000 ADD [EAX],AL
017F:017911F1 8183C404310424E80100ADD DWORD PTR [EBX+043104C4],0001E824
017F:017911FB 0000 ADD [EAX],AL
017F:017911FD 6883C4048B PUSH 8B04C483
017F:01791202 0514307901 ADD EAX,01793014
017F:01791207 E802000000 CALL 0179120E <--按F8进入
017F:0179120C E86883C404 CALL 063D9579
017F:01791211 010424 ADD [ESP],EAX
017F:01791214 C3 RET
017F:01791215 C3 RET

按F10来到
017F:01790060 B8BC397901 MOV EAX,017939BC
017F:01790065 BA0A000000 MOV EDX,0000000A
017F:0179006A E8A9C2FFFF CALL 0178C318 <--F10略过
017F:0179006F E82CFEFFFF CALL 0178FEA0 <--F8进入
017F:01790074 C3 RET

按F10来到
017F:0178FFE5 B9A4397901 MOV ECX,017939A4
017F:0178FFEA 8D45F8 LEA EAX,[EBP-08]
017F:0178FFED BA04000000 MOV EDX,00000004
017F:0178FFF2 E879C4FFFF CALL 0178C470 <--F10略过
017F:0178FFF7 E815000000 CALL 01790011 <--F8进入
017F:0178FFFC 8B44240C MOV EAX,[ESP+0C]
017F:01790000 8380B800000002 ADD DWORD PTR [EAX+000000B8],02
017F:01790007 C7401800000000 MOV DWORD PTR [EAX+18],00000000
017F:0179000E 31C0 XOR EAX,EAX
017F:01790010 C3 RET

以下有段指令比较花，可用icedump中的/tracex 400000 eip-8来找到OEP
CV.exe的OEP是00576164-00400000
然后用/dump 400000 001E5000 c:\dump.exe
A EIP
017F:00576164 JMP EIP

按F5回到Windows
把c:\dump.exe复制到CommView的安装目录下
再用Peditor的dumpfixer来修改dump.exe，并改CV.exe的OEP是00176164
然后用ImpREC重构输入表，完成后不要忘了KILL这个进程。

二，用ImpREC重构输入表

在ImpREC中"Attach to an Active Process"下拉框中选择目标CV.exe，
填入OEP，按"IAT AutoSearch"、"Get Import"、"Auto Trace"，
接着按"Show Invalid"，发现有6个KERNEL32.dll未知函数

Target: C:\TOOLS\COMMVIEW\CV.EXE
OEP: 00176164 IATRVA: 00189204 IATSize: 000008F4
RVA ModuleName PTR
(1) 00189274 ? 0178C960
(2) 001893D0 ? 0178C968
(3) 00189414 ? 0178C928
(4) 00189474 ? 0178C958
(5) 00189478 ? 0178C950
(6) 00189480 ? 0178C974

记下这些未知函数的RVA和PTR，并Save Tree。
然后设断BPX GetVersion并再次装入目标程序

017F:0178C7BC 6A00 PUSH 00
017F:0178C7BE E8897CFFFF CALL KERNEL32!GetModuleHandleA
017F:0178C7C3 A34C367901 MOV [0179364C],EAX
017F:0178C7C8 E8977CFFFF CALL KERNEL32!GetVersion <--(3)号未知函数
017F:0178C7CD A344367901 MOV [01793644],EAX
017F:0178C7D2 68AC357901 PUSH 017935AC
017F:0178C7D7 E8907CFFFF CALL KERNEL32!GetVersionExA
017F:0178C7DC E83B7CFFFF CALL KERNEL32!GetCurrentProcess <--(5)号未知函数
017F:0178C7E1 A348367901 MOV [01793648],EAX
017F:0178C7E6 E8397CFFFF CALL KERNEL32!GetCurrentProcessId <--(4)号未知函数
017F:0178C7EB A350367901 MOV [01793650],EAX
017F:0178C7F0 E81F7CFFFF CALL KERNEL32!GetCommandLineA <--(1)号未知函数
017F:0178C7F5 A340367901 MOV [01793640],EAX <-a-注意01793640
017F:0178C7FA C3 RET

对于每项未知函数都先u PTR看看。
如(1)：
u 0178C960
017F:0178C960 A140367901 MOV EAX,[01793640] <-b-注意01793640
017F:0178C965 C3 RET

看到的吧！a和b处方括号内的地址是相同的，故(1)号未知函数是KERNEL32!GetCommandLineA

同理

(3)
u 0178C928
017F:0178C928 A144367901 MOV EAX,[01793644]
017F:0178C92D C3 RET
(3)号未知函数是KERNEL32!GetVersion
(4)
u 0178C958
017F:0178C958 A150367901 MOV EAX,[01793650]
017F:0178C95D C3 RET
(4)号未知函数是KERNEL32!GetCurrentProcessId
(5)
u 0178C950
017F:0178C950 A148367901 MOV EAX,[01793648]
017F:0178C955 C3 RET
(5)号未知函数是KERNEL32!GetCurrentProcess

另外二个比较复杂，请参考fs0的“脱Advanced Email Extractor PRO的壳 ”一文
(2)
u 0178C968
017F:0178C968 55 PUSH EBP
017F:0178C969 8BEC MOV EBP,ESP
017F:0178C96B 8B4508 MOV EAX,[EBP+08]
017F:0178C96E 5D POP EBP
017F:0178C96F C20400 RET 0004
(2)号未知函数是KERNEL32.dll!LockResource
(6)
u 0178C974
017F:0178C974 55 PUSH EBP
017F:0178C975 8BEC MOV EBP,ESP
017F:0178C977 5D POP EBP
017F:0178C978 C20400 RET 0004
(6)号未知函数是KERNEL32.dll!FreeResource

修复完输入表后，就可"Fix Dump"，为了避免不必要的麻烦我们还是"add new section"吧。
完工。咦，运行……没反应！
那里出问题了？
让我们LOAD脱壳后的程序，来到
017F:00576A21 E8A229EFFF CALL 004693C8
017F:00576A26 3D00CC0A00 CMP EAX,000ACC00 <--改EAX=000ACC00就OK
017F:00576A2B 7405 JZ 00576A32 <--不等就退出
017F:00576A2D E8DAD2E8FF CALL 00403D0C <--退出处理
017F:00576A32 8B0D7CDC5700 MOV ECX,[0057DC7C]
017F:00576A38 A1F8D95700 MOV EAX,[0057D9F8]
017F:00576A3D 8B00 MOV EAX,[EAX]
017F:00576A3F 8B1520115600 MOV EDX,[00561120]
017F:00576A45 E822E7EDFF CALL 0045516C

在SOFTICE中修改EAX=000ACC00后就一切OK。请注意，直接改74->EB无效，好像在前面有段还原代码。
难道还要SMC，请高手指点！


Asprotect-小甜饼

 标 题:小甜饼 --- 有关新版Asprotect加壳程序的脱壳的又一种思路 (798字)
发信人:ljttt
时 间:2000-9-10 11:58:16
详细信息:
小甜饼 --- 有关新版Asprotect加壳程序的脱壳的又一种思路
1、用PEditor来Dump出整个文件。
2、用BWW得到Entry Point。
3、用Imp_List获得Import Table。
虽然我们得到的Import Table有部分函数不对，但是比完全重建构建一个Import Table的工作量还是小多了。下一步就来找到这些被Asprotect作了手脚的函数。

方法之一：找出脱壳过的老版本对比引入函数，可以知道。这种方法不用动态跟踪。方便。

方法之二：动态跟踪也可以得到这些函数。其实被Asprotect处理过的这些函数的引入地址被定位到Asprotect自己的一个过渡函数，在这个过渡函数中会用XOR方法还原出真正的函数名，并用LoadLibraryA等加载，得到函数真正的入口。然后进入调用该函数。

4、按照通常的脱壳方法中做修补工作。按Import Table的结构修改即可。

有兴趣的朋友可以想想办法，编个程序得到这些加密处理过的函数名称。可能要挂钩某些函数，要些技巧。

ljttt写于2000-09-10日


Asprotect脱壳经验

标 题:一点脱壳经验。(7千字)
发信人:kingtall
时 间:2001-4-20 1:11:00
详细信息:
要脱asprotect加的壳，以我等菜鸟，只能使用工具。我的工具箱里有：
fi243，检测文件壳的类型；URL: http://go2.163.com/%7Etoye/tools/fi.zip
trw1.23，不用多说；URL: http://www.doroom.com/down/trw123.zip
bw2k02，冲击波2000，用来找入口点EP；URL: http://202.103.134.11/~fsdb/bw2k02.zip
SuperBPM，辅助设断工具，确保trw能够中断成功；URL: http://www.digitalrice.com/kaparo/files/debuggers/superbpm.zip
peditor，修正脱壳后的文件；URL: http://go2.163.com/%7Etoye/tools/peditor.zip
ImportREC1.2beta2，用来修复脱壳后文件的import表；URL: http://www.digitalrice.com/kaparo/files/utilities/imprec.zip
此外还有专用自动脱壳工具，如rad，caspr等。URL: http://mud.sz.jsinfo.net/per/aaron/files/unpackers/win/caspr0952.zip
实在不行，脱不下来或脱下来不能用，只有用内存补丁了。我推荐ppatcher3.93，比常见的3.60版增加了许多有用的新特性，如WaitForWindowName，下面会讲到。URL未知，我是从作者那里直接获得的。

我的运行环境是win98第二版，没有安装softice。

概括一下一般的脱壳步骤：
第一步，用fi243确定壳的类型，有自动脱壳工具的，用工具脱。否则第二步。
第二步，用bw2k确定程序的真正入口点OEP，不妨记为xxxx；若找不到，请试一试Softice + icedump： 使用Icedump 的/tracex 命令可能找到OEP 的地址；若还找不到，只能手动跟踪，看你的功力和运气了。
第三步，用trw装入（load）程序，下bpx xxxx，g。中断后用pedump命令脱壳，格式是
pedump c:\test\test.exe。不能中断时运行superbpm，选中erase，重复第三步操作。若脱出来的test.exe可以运行，则脱壳完毕，否则第四步。
第四步， 用peditor 修正test.exe，用Import REConstructor v1.2 beta2修复输入表，参照以下这篇文章
http://001.com.cn/forum/toye/15039.html
标题：用Import REConstructor v1.2 beta2 修复输入表】 (7千字)
发信人:BestFont
若还是不行，建议你用内存补丁或放弃暴破，去算注册号吧。

以下以S-Spline 2.04为例，讲一讲手动脱壳和修复import表的具体操作步骤。S-Spline 2.04 下在地址 http://202.108.252.24/stcsr/rj/txtx/S-Spline%202.04.zip。

第一步，用fi243确定壳的类型。fi243没有GUI界面，是命令行程序，用法是这样：
c:\fi243\fi s-spline.exe。
Fi已经检测不出新版asprotect了，所以如果遇到检测不出的类型，就有可能是asprotect。接着往下做吧。
第二步，用bw2k确定程序的真正入口点OEP，
运行bw2k，面板上的entry point显示为00000000。按track钮，再运行s-spline.exe，程序界面出来之后，bw2k的面板上entry point显示为47e910，这就是入口点了。退出s-spline，我们又迈出了可喜的第二步。
第三步，运行SuperBPM，选中erase（默认为不选中），确保trw能够中断。
第四步，运行trw2k，按browse找到并选中s-spline.exe，按loader装入。下bpx 47e910，g。trw弹出时输入pedump c:\test\test.exe，退出trw（不退也行），但不要退出s-spline。在c:\test下会找到test.exe。这个程序目前还不能运行，因为它的import表是被加密的。
第五步，用peditor修正test.exe。运行peditor，按browse找到test.exe，确定。再按sections，弹出一个窗口，显示每个section的信息。在窗口中点右键，在弹出菜单中选dumpfixer(RS=VS & RO=VO)，提示'DONE'，这时可以关闭peditor了。
第六步，运行ImportREC1.2beta2，在Attach to an Active Process下拉框中选中s-spline.exe，然后在左下方OEP中输入7e910(就是EP-image base=47e910-400000)，按IAT AutoSearch。出现对话框Found Something!=》
“Found address which may be in the Original IAT.Try 'Get Import'”
按Get Import，再按Show Invalids 按钮，在Imported Function Found框中会有很多蓝色的项目。在其中点右键，选Trace Level1(Disasm)，再按Show Invalids 按钮，可以看到所有的dll都为valid:YES字样。输入表到此完成。
第七步，修复已脱壳的程序test.exe。选择Add new section(缺省是选上的),按Fix Dump，并选择刚才Dump出来的文件test.exe。ImpRECT 会在该文件所在目录生成一个新的文件：test_.exe ,这就是修复后的文件。至此终于大功告成，点击test_.exe可以运行了。

在遇到asprotect之前，procdump一直是我最爱的脱壳工具，它能脱的壳很多，操作方便，稳定性好，很少令我失望。直到那一次，一连碰到三个asprotect加壳的软件：
Aspack2.11,加壳软件，asprotect 1.1b 加壳，未注册版有时间限制和功能限制；以前的下载地址找不到了，今天找到一个带破解文件的，URL： http://mud.sz.jsinfo.net/per/aaron/files/compressors/win/aspack211.zip。
Picturetoexe2.30,图片转可执行文件工具，asprotect 1.0 加壳，未注册版制作出得文件有公司标志；http://www.wnsoft.com/apr
Advanced ZIP Password Recovery3.51（azpr），zip密码恢复工具，asprotect 1.1 加壳；未注册版只能破解5位以下密码。ftp://www.newhua.com/azpr.zip
有兴趣的不妨试一试，练练手。
那段时间好痛苦啊。找不到真正的入口点(OEP)，中断不了，壳脱不下来，脱下来的又不能运行，真是往事不堪回首。到现在也还谈不上破解，只是想把自己的一点经验写出来，希望弟兄们看了能少走点弯路。

提示：
Aspack用上述方法脱壳修复后，运行时显示
Exception EaccessViolation in module ASPACK_.EXE at 007fb318.
Access violation at address bfc54c.Read of addreds bfc54c.
不能运行。失败。但是可以用rad06(http://mud.sz.jsinfo.net/per/aaron/files/unpackers/win/rad_v06.zip)成功脱壳，脱壳后自动去掉时间限制，但仍为未注册版。

Picturetoexe2.30用上述方法脱壳失败，impREC修复的程序运行时提示非法操作。用caspr v0.952脱壳成功。

Azpr用上述办法修复成功，文件可以运行，但对其进行修改后，提示找不到api函数，不能运行。无奈只能用内存补丁ppatcher3.93。这里有thewd提供的破解方法。
首先在注册表中添加如下内容
[HKEY_LOCAL_MACHINE\Software\Elcom\Advanced ZIP Password Recovery\Registration]
"Code"="00023112193920061941tcKxzxKUhzLjuAAD"
以下是ppatcher配置文件（.ppc）的内容。
-------------------------------------------------------------------
#Process Patcher Configuration File
Version=3.93
WaitForWindowName=AZPR*

PatchAuthor=thewd
PatchContactInformation=thewd@hotmail.com

DisplayName=Advanced ZIP Password Recovery v3.51
Filename=azpr.exe
Filesize=294912
Address=0x416CE7:0x89:0x8B // (1)
Address=0x416CE8:0xC8:0xC2
#End of Configuration File

#Cracking Notes

(1) Registration Code Example: 00023112193920061941tcKxzxKUhzLjuAAD

First 4 characters are ignored.
Next 16 characters are constant (MD5 Hash)
Last 16 characters are hashed (MD5) and compared against
the resource 'DB' for a match.
i.e.
mov eax, ecx (Bad Code) ==> mov eax, edx (Correct Code)
---------------------------------------------------------------------

建议大家去http://www.exetools.com看一看，工具很多，更新很快。今晚找到caspr1.012，还没来得及试。

革命尚未成功，同志仍需努力。
不要仅仅满足于几个软件的破解，应该立志做出更多更好的工具来，跟老外们一争高下。


asprotect脱壳小结

 标 题:关于asprotect脱壳扔块砖. (971字)
发信人:得慢
时 间:2000-10-16 23:07:50
详细信息:
先说1.05吧,用imp_list重建时,address文件中显示一个函数名没有,它应该是getprocaddress.执行程序提示"_ .dll找不到".因为asprotect要用此函数,所以做了手脚.可以在PIMAGE_IMPORT_BY_NAME部分可以发现一个地址和其它相差很远,d之,在下面不远出就可看到call getprocaddress了,u getprocaddress,得到地址,将PIMAGE_IMPORT_BY_NAME中的错误地址改掉,再重建import_table就成功了.
再讲1.07,很难跟到入口.我试了很久,在int 30中有这样一个函数调用:_vwin32_set_thread_context.大概50多次后就快到了.设bpx … if bpcount == 32。呵呵，自己先记下数，然后减一，我这数不准的，是16进制，别忘了。然后F10跟吧，突然有一步就回到asprotect代码中了，应该下面出现一个call,F10带过就执行了，要F8跟进，然后几乎可以F12了，大概3次吧，很快就可看到OEP了。清掉HINT后,重建imp_table,有函数名乱码.前面有人讲过方法了.其实直接用其最后一个时的方法就可以了.
另外,对1.07及以下版本的asprotect,感觉新版的imp_list并不如旧的好用,请别将旧的随便删了.
1.1版,用我的方法也可找到OEP,但bpcount 大约90多次.重建imp_table的工作还没来得及试,更望高手指教.

标 题:脱壳，我来说说。呵呵..... (1千字)
发信人:ljttt
时 间:2000-10-20 11:25:54
详细信息:

如果在没出脱壳机之前你用这种方法，厉害！但是，以后就没必要了。看看rAD.exe的源代码，可以帮助你，设下这个断点。起码这样可以让你了解程序工作的目的是什么？
从头跟踪前一段，不长，而且很有特征，（还可以写个Fake Script，哈哈，开玩笑。）当到达类似这样一段时：

015F:00C20EAD E81634FFFF CALL 00C142C8
015F:00C20EB2 E8917BFFFF CALL 00C18A48
015F:00C20EB7 E86489FFFF CALL 00C19820
015F:00C20EBC E8BFACFFFF CALL 00C1BB80
015F:00C20EC1 E8462FFFFF CALL 00C13E0C

在最后一个CALL按F8进入后，下指令
s eip l ffffffff 81,C4,04,F0,FF,FF,50,81
找到后，设下此地址断点。以后跟踪方法类似：找特征代码或者找到自己熟悉的代码设个断点F5过去。（当然想一步是做不到，因为其也是分步还原的。）这样你可以找到OEP处DUMP出内存映象。

这样手动脱壳做成的脱壳文件和rAD.exe脱出来的有点不一样，OEP要设为你找到的OEP(入口点)。好象是rAD.exe脱出来的最后一层壳没脱，所以你会发现他脱的文件的OEP和你找到OEP不一样（你可以用BWW找，就知道真实的OEP了），用此法我脱过Asprotect v1.07、v1.1加壳的程序都成功。
不过v1.1的后期修补工作麻烦一点。

标 题:aprotect1.1也试出来了. (752字)
发信人:得慢
时 间:2000-10-20 21:16:30
详细信息:

bpx _vwin32_set_thread_context if bpount==34
F12;F12,到IRETD返回.有一半机会回到程序空间,另一半可能回到system中.如果在system中,是磁盘缓存在工作,要用F8小心走一圈,会多入_vwin32…一次.
回到程序空间应停在一个JMP上，用F8至少进一层CALL，一路走下去，大概再退3层就快到OEP了.注意栈中的值,在最后一个RET处,改为JMP EIP,然后用PEditor dump下来.
IMP_TABLE用新版IMP_LIST(V01.10)可以自动重建,手功输入.idata的地址和大小.虽然名字隐掉了,却可以猜到的.大部分1.1的程序HINT是空的,不需劳心.如果rebuild不成,就得在OEP处清一下了.
用TRW断这个函数不行,不能每次都截到,F8进INT 30也经常不成功.用ICEDUMP来dump似乎程序也不正常.
这样取得的文件只要改一下OEP和table_address,贴一下.idata,不再需要其它修改.
我用这个办法将http://www.elcomsoft.com/上所有口令破解软件都脱了.熟练后5分钟一个.


Hying谈asprotect

标 题:henryw以前寄给我的一段翻译文章，可做参考。 (2千字)
发信人:hying
时 间:2001-4-12 18:10:37
详细信息:
我草草翻译了一些内容，可能有些地方不太准确。
作者如果使用一些插件SDK形式来帮助加壳的话，那么将来可能真的需要手动拼接dump出来的可执行程序了。
(对了，hying兄，是否有关于拼接干净的exe程序的文章？)
不知道将来哪个Cracker会来完成如此困难的事情？

我试图按以前的方法重建注册表，没有成功，当然我用的imp_list出来的
import0.bin文件。没来得及试验import1.bin文件。
BTW: 以前用import1.bin可以运行的程序，启动后在revirgin里面看，还是和探测
加壳程序一样报iat需要重建。

国内还没见过讨论如此脱壳方式的文章。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
一般来说，我们跟踪目标，找到oep，dump它，然后重建iat，将它们贴回去，这就够了。
不过这回有些变化，asprotect1.2和目标程序有了某种联系：

asprotect在492830调用了一些目标代码，就是利用icedump来追踪入口时候，第一站停下来的地方，这里的代码会设置局部内存（local mem allocations），一些标志，然后回到asprotect，最终asprotect跳到程序真正入口：4aec88。

如果你在此处dump，出来的程序无法运行，程序要探测刚才的标志，然后就完蛋了。

我选择了一个简单的方法来解决此问题：
仍在4aec88处dump，不过之前不让程序跳到492830的地方，这样内存是干净的。利用revirgin重建iat，改好sections，不过把入口改为492830，把代码这样改动：
seg000:00492944 pop ebp
seg000:00492945 jmp loc_4AEC88
seg000:00492945 start endp
看见jmp 4aec88了吧，之前有个ret。

这样目标程序自己会在启动时候做asprotect要做的事情，调用这个call，然后会
跳到正常的oep。

现在知道有两个程序：
Advanced Link Catalog v1.00 (http://www.wizetech.com/alc/) and
Chameleon Clock 2.51 (http://www.softshape.com)

.......................
有必要在脱壳过程中跳过这些代码，因为这些东西会引起重建文件以后所有的
runtime错误。但是这样还会在4AEE12出现错误因为0送进了register而不是某个地
址。正如Tseph说的，这个代码会设置（asprotect?）的一些标志，但是它也在程
序启动时候查询注册表来设定程序的一些参数，比如语言，timeformat, showdate,
reg等等。我可以让这个程序运行（这句话的w/o没看懂所以没的翻译），
shareware nag可以运行，程序也启动了，但是此程序使用winamp类似的skin，照
我的方法patch程序，这个功能就不能用了........

提到的其他程序，Advanced Link Catalog，我发现脱壳中只要跳过调用程序的代
码即可，这个call可以在dumping前用/Tracex来找到(注：我现在才知道icedump里
有这等好命令^_^)。不管什么原因吧，程序可以在正常oep地方启动而不用处理丢
失的代码。

此两个程序的注册方式和Asprotect都有联系，至少Registration Key可能在加壳
的时候产生。我不知道注册过程在脱过的文件中是否还存在，但是256个byte的注
册key仍是对未加补丁程序有效的保护。ALC至少可在Hz和我找到的地方做进一步的
限制。

========================================================

Cordialement


SEH(asprotect)

 标 题:空下来又来看看asprotect，发现里面SEH用得真不少。 (1千字)
发信人:hying
时 间:2001-8-14 16:17:06
详细信息:
大家如果跟过asprotect肯定有如下的体会
0167:013004AC PUSH ESP
0167:013004AD XOR EAX,008B0130
0167:013004B2 MOV [01303560],EAX
0167:013004B7 CALL 013004F6
0167:013004BC PUSH DWORD 013004C5
0167:013004C1 INC DWORD [ESP]
0167:013004C4 RET <-转到13004C6
****************************************************
0167:013004C6 MOV EAX,[ESP+0C]
0167:013004CA JMP SHORT 013004CD
……
0167:013004CD ADD DWORD [EAX+B8],BYTE +02
0167:013004D4 JMP SHORT 013004F0
……
0167:013004F0 XOR EAX,EAX
0167:013004F2 RET <-转到BFFxxxxx，如果贸然跟进去的话，十有八九会跟丢，一般的办法是找下一个RET，如下面的1300539处，然后在那下断点，一般就能断下来。但它的依据是什么呢？
*************************************************************
注意上面第一段的那个CALL，它有什么作用呢？它会先将地址13004BC入栈，然后转到13004F6。
0167:013004F6 XOR EAX,EAX
0167:013004F8 JMP SHORT 013004FC
……
0167:013004FC PUSH DWORD [FS:EAX]
0167:013004FF JMP SHORT 01300502
……
0167:01300502 MOV [FS:EAX],ESP 建立SEH链，前面入栈的13004BC就作为异常处理程序入口。
0167:01300505 XOR [EAX],EAX 产生内存保护异常，转到13004BC去执行，执行完后理应返回到1300505。而上面的ADD DWORD [EAX+B8],BYTE +02一句则是将返回地址加2，变为1300507。到13004F2处异常处理程序结束，通过系统返回到下面的1300507继续执行。
0167:01300507 JMP SHORT 0130050A
……
0167:0130050A POP DWORD [FS:00]
0167:01300511 JMP SHORT 01300515
……
0167:01300515 POP EAX
0167:01300516 PUSH DWORD 012FE1E0
0167:0130051B PUSH DWORD 01300640
0167:01300520 PUSH DWORD 012FFC6C
0167:01300525 PUSH DWORD 012FF91C
0167:0130052A PUSH DWORD 012FF2F4
0167:0130052F PUSH DWORD 012FED9C
0167:01300534 PUSH DWORD 01300030
0167:01300539 RET


何判斷被Asprotect加殼

 标 题如何判斷被Asprotect加殼
发信人:C-pen
时 间:2000-9-25 9:23:31
详细信息:
如何判斷被Asprotect加殼?我們簡單來談談:
(1)先用Procdump32去分析,若Section Name除了.data和.rsrc外,沒有其他的Section Name且有多個.data那它有八成是Asprotect加的殼.
(2)執行Imp_list,看它的Address.txt,RVA是否跟軟件的某一Section的VO一樣,若一樣且Address.txt裡的函數還原的很好,那它幾乎可確定是Asprotect1.0以上加的殼,且有.idata段.
(3)若RVA不符合,且Address.txt一開始是GetProcAddress後面緊接著一大堆空白函數,到最後才出現一系列有系統的函數列,這就是沒有.idata只有.radta段.
(4)若有.idata,你看它的Address.txt中的函數,若Shell32.dll,Comdlg32.dll,Version.dll它的成員都是亂碼,那它就是Asprotect1.06或1.07
(你可以參考Azpr3.21,Aw95prV.1.2,WinNarigatorV.1.91等)
以上只是簡單的分類,不代表任何意義,還需要你多去Trace,和明白PE結構,你會有更多的掌握.


如何跟踪ASProtect

标 题:如何跟踪ASProtect外壳加密过的程序？ (7千字)
发信人:ljtt
时 间:2001-4-13 21:30:27
详细信息:
如何跟踪ASProtect外壳加密过的程序？

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
由于ASProtect外壳加密过的程序中运用了很多反跟踪的技术，所以说起来实在是件费事的事情。我实在担心自己水平有限，无法把它们说得明白。不过想想我又不是权威，错误在所难免。既然我办的是"技术交流站"，不一定要保证每句话都是正确的，也不是写出来就要做什么教程之类的。既是"交流"，那么应该大家都在"交流"中提高，而不是我象个传教士一样永远给大家念着一百年不变的经文。所以我希望不光我说，大家也说。怎么说都行，每个人都可以有每个人的风格。:-) 希望我的想法不是梦想。

作者： ljtt
写作日期： 2001-04-10

【开始】
你跟踪过ASProtect外壳加密过的程序吗？如果你说跟踪过，是否有过这样的经历？

015F:012803D9 E3 33 C0 5A 59 59 64 89-10 68 F7 03 28 01 8D 45 .3.ZYYd..h..(..E
015F:012803E9 FC E8 A1 2D FF FF C3 E9-F3 29 FF FF EB F0 5F 5E ...-.....)...._^
015F:012803F9 5B 59 5D C3 00 00 00 FF-FF FF FF 02 00 00 00 0D [Y].............
015F:01280409 0A 00 00 55 8B EC 53 56-8B DA 8B F0 8B 45 08 8B ...U..SV.....E..
哪哪腒ERNEL32!FindClose+0386哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪腜ROT32
015F:BFF768C6 FF5518 CALL [EBP+18]
015F:BFF768C9 83C410 ADD ESP,10
015F:BFF768CC 648F0500000000 POP DWORD PTR FS:[00000000]
015F:BFF768D3 C9 LEAVE
015F:BFF768D4 C3 RET

你时常会被带到如上图所示的 FindClose 的领空，然后在系统内核里转悠了大半个世纪，才好不容易回到程序的领空。
呵呵，我就曾有过这样的经历。正当我暗自窃喜时，却发现跟踪没多长时间又一次来到了老地方，昏倒.....。

看来这其中有蹊跷，我们不妨从当前的堆栈入手。看看有什么发现？
我们下指令：
D ESP

显示如下结果：

哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪byte哪哪哪哪哪哪哪PROT哪?0)哪
0167:0081FB10 D8 FB 81 00 D0 FC 81 00-F4 FB 81 00 B0 FB 81 00 ................
^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^

我们一一显示 0081FBD8 、0081FCD0 、0081FBF4 、0081FBB0 的内容。终于你会发现一点线索。

我们下指令：
D 81FBF4

显示如下结果：
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪byte哪哪哪哪哪哪哪PROT哪?0)哪
0167:0081FBF4 1F 00 01 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0167:0081FC04 00 00 00 00 00 00 00 00-55 01 00 00 7F 02 FF FF ........U......
0167:0081FC14 00 00 FF FF FF FF FF FF-00 00 00 00 00 00 00 00 ................
0167:0081FC24 00 00 00 00 00 00 FF FF-00 00 00 00 00 00 00 00 ................

呵呵，正好我学习过一点SEH的知识，了解CONTEXT结构，看到这......不再犹豫..... 81FBF4 可能是 _CONTEXT 结构的指针。

我们先来了解一下 _CONTEXT 结构的定义：
_CONTEXT STRUC
cx_ContextFlags DD ?

;CONTEXT_DEBUG_REGISTERS
cx_Dr0 DD ? ;04
cx_Dr1 DD ? ;08
cx_Dr2 DD ? ;0C
cx_Dr3 DD ? ;10
cx_Dr6 DD ? ;14
cx_Dr7 DD ? ;18

;CONTEXT_FLOATING_POINT
cx_ControlWord DD ?
cx_StatusWord DD ?
cx_TagWord DD ?
cx_ErrorOffset DD ?
cx_ErrorSelector DD ?
cx_DataOffset DD ?
cx_DataSelector DD ?
SIZE_OF_80387_REGISTERS EQU 80
cx_RegisterArea DB SIZE_OF_80387_REGISTERS DUP (?)
cx_Cr0NpxState DD ?

;CONTEXT_SEGMENTS
cx_SegGs DD ? ;8C
cx_SegFs DD ? ;90
cx_SegEs DD ? ;94
cx_SegDs DD ? ;98

;CONTEXT_INTEGER
cx_Edi DD ? ;9C
cx_Esi DD ? ;A0
cx_Ebx DD ? ;A4
cx_Edx DD ? ;A8
cx_Ecx DD ? ;AC
cx_Eax DD ? ;B0

;CONTEXT_CONTROL
cx_Ebp DD ? ;B4
cx_Eip DD ? ;B8
cx_SegCs DD ? ;BC
cx_EFlags DD ? ;C0
cx_Esp DD ? ;C4
cx_SegSs DD ? ;C8
_CONTEXT ENDS
;size of CONTEXT is 0CCH bytes

从上面的定义中我们可以知道 _CONTEXT 结构偏移 B8 处保存的是 EIP 的值。我们来看一下 81FBF4 + B8 的值：

我们下指令：
D 81FBF4+B8
显示如下结果：

哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪byte哪哪哪哪哪哪哪PROT哪?0)哪
0167:0081FCAC 4A FF 27 01 5F 01 00 00-46 02 00 00 D0 FC 81 00 J.'._...F.......
^^^^^^^^^^^

我们设下断点：
BPX 127FF4A

然后，按F5键，果然程序在我们设下的断点处停了下来。:-)

显示如下结果：
015F:0127FF4A 648F0500000000 POP DWORD PTR FS:[00000000] <---停在此处
015F:0127FF51 58 POP EAX
015F:0127FF52 E84127FFFF CALL 01272698
015F:0127FF57 A154352801 MOV EAX,[01283554]
015F:0127FF5C 83E80D SUB EAX,0D
015F:0127FF5F 8B1554352801 MOV EDX,[01283554]

看来我们已经掌握了它的一点规律。但我们不能只满足于此，我们来看一下程序是如何做的？

我取了程序即将设下这个小圈套的一段代码。由于其中使用了花指令，所以我稍微做了点改动，使SoftICE能正确显示汇编代码。

015F:0127FEFB 90 NOP
015F:0127FEFC 64FF30 PUSH DWORD PTR FS:[EAX]
015F:0127FEFF EB01 JMP 0127FF02
015F:0127FF01 90 NOP
015F:0127FF02 648920 MOV FS:[EAX],ESP <---建立SEH链
015F:0127FF05 3100 XOR [EAX],EAX
015F:0127FF07 EB01 JMP 0127FF0A
015F:0127FF09 90 NOP
015F:0127FF0A 648F0500000000 POP DWORD PTR FS:[00000000]
015F:0127FF11 EB02 JMP 0127FF15
015F:0127FF13 90 NOP
015F:0127FF14 90 NOP
015F:0127FF15 58 POP EAX
015F:0127FF16 E825000000 CALL 0127FF40
015F:0127FF1B 8B44240C MOV EAX,[ESP+0C] <---EAX此时即为 CONTEXT 的指针
015F:0127FF1F 8380B800000002 ADD DWORD PTR [EAX+000000B8],02 <---修改 CONTEXT.EIP
015F:0127FF26 51 PUSH ECX
015F:0127FF27 31C9 XOR ECX,ECX <---ECX = 0
015F:0127FF29 894804 MOV [EAX+04],ECX <---修改 CONTEXT.Dr0 = 0
015F:0127FF2C 894808 MOV [EAX+08],ECX <---修改 CONTEXT.Dr1 = 0
015F:0127FF2F 89480C MOV [EAX+0C],ECX <---修改 CONTEXT.Dr2 = 0
015F:0127FF32 894810 MOV [EAX+10],ECX <---修改 CONTEXT.Dr3 = 0
015F:0127FF35 C7401855010000 MOV DWORD PTR [EAX+18],00000155 <---修改 CONTEXT.Dr7 = 155
015F:0127FF3C 59 POP ECX
015F:0127FF3D 31C0 XOR EAX,EAX
015F:0127FF3F C3 RET <---在此处就将进入 FindClose 的领空了

原来程序在反跟踪时，不但用 SEH 的方式使得不知其所以的人跟踪时陷入了设下的圈套；而且，还使得我们以前设下的断点失效。
（Dr0、Dr1、Dr2、Dr3与断点有关，Dr7与断点的控制有关，至于这方面的内容如果你不清楚，那么你可以选择看一些比较专业的书籍来理解，我无法把它说得清楚。）

从这里我们更加可以肯定我们先前的判断了。以后我们再跟踪时，就不会再在这个小圈套里出不来了。如果你再总结一下规律，也许会发现更多，这就留给大家了。:-) 。
比如，我发现其实程序每次使用这种方法时，真正要跳到的地方就在 RET 指令后面不远处的指令。所以每当我遇到花指令开始的地方，就会明白程序又要给我开开玩笑了，我会在 RET 指令处停下来，然后在后面不远处的指令设下新断点，然后按 F5 键，呵呵，平稳落地。

【后记】
由于本站的主题为"技术研习"，所以我想改变以前只写"如何做"的方式，而尽量以我所知加上以"为何如此做"的方式写。这样我将选择性地在某些难点上费些口水，而不再写如何完整的脱某个程序的壳了。当然另外的原因就是现在的手动脱壳越来越繁锁，虽然外壳加密程序本身可能只是添加了一些新的反跟踪/反破解的手法而已，但只写"如何做"的方式是无法使人明白这些变化的。


Crunch v1.1

 标 题:对Crunch v1.1加壳程序的手动脱壳及反跟踪代码的一点分析 (15千字)
发信人:ljttt
时 间:2000-10-2 19:01:05
详细信息:
对Crunch v1.1加壳程序的手动脱壳及反跟踪代码的一点分析

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
由于我现在还没有破解版的Crunch v1.1，所以就拿未注册版的Crunch来测试。好象未注册版的Crunch加壳的程序的名字有限制，其他的我就不清楚了。由于我DOWN的这个文件是根据看雪论坛的一个贴子提供的地址下载的。连帮助文件也没有。:-(
而且目前我手头也没有注册版的Crunch，所以只好以未注册版的Crunch加壳Notepad.EXE程序来进行说明。

样例文件： bitarts_evaluation.exe （把Notepad.EXE加壳后的文件）
（未注册版Crunch加壳的程序文件名都是这个，不过可以在跟踪中发现文件名比较的地方）
加壳方式： 未注册版Crunch v1.1加壳
目标： 手动脱壳
作者： ljttt
写作日期： 2000-10-02

1、这次我们用ProcDump提供的Bhrama Server的功能来手动脱壳，这样可以简化一点手动脱壳的麻烦。所以首先我们启动ProcDump，选择Option/Rebuild new import table。点击Bhrama Server，这时就启动了服务器，将等待客户命令。

2、Ctrl-D进入SoftICE，设断点
bpint 3

3、启动PEditor，打开bitarts_evaluation.exe，点击break'n'enter。单击Run。这时将中断进入SoftICE。可以看到如下提示。
?You have to enter "eb eip 55" before you continue ! ?

为了继续跟踪，我们根据提示下指令
eb eip 55

现在将显示如下：
015F:0040D000 55 PUSH EBP <--这就是我们修改后的结果
015F:0040D001 E800000000 CALL 0040D006
015F:0040D006 5D POP EBP

4、继续跟踪到如下处：
015F:0040D0AC FF95B1320000 CALL [EBP+000032B1]
015F:0040D0B2 83C408 ADD ESP,08
015F:0040D0B5 8BB5AD320000 MOV ESI,[EBP+000032AD]
015F:0040D0BB BFC6000000 MOV EDI,000000C6
015F:0040D0C0 03FD ADD EDI,EBP
015F:0040D0C2 8BC8 MOV ECX,EAX
015F:0040D0C4 F3A4 REPZ MOVSB <--在此处停下，此指令执行后，以下的指令将改变，这就是SMC的技巧，以后还有多处，就不一一列举了。
015F:0040D0C6 8B07 MOV EAX,[EDI] <--现在我们看到的是加密的代码，只有上一指令执行后才会显示正确的指令代码
015F:0040D0C8 D581 AAD
015F:0040D0CA C23813 RET 1338

5、在REPZ MOVSB指令执行后我们将看到如下的正确代码：
015F:0040D0C6 8BD5 MOV EDX,EBP
015F:0040D0C8 81C238130000 ADD EDX,00001338
015F:0040D0CE 52 PUSH EDX
015F:0040D0CF 33C0 XOR EAX,EAX
015F:0040D0D1 8CD8 MOV AX,DS
015F:0040D0D3 A804 TEST AL,04
015F:0040D0D5 7408 JZ 0040D0DF
015F:0040D0D7 B402 MOV AH,02
015F:0040D0D9 CD1A INT 1A
015F:0040D0DB 8BC2 MOV EAX,EDX
015F:0040D0DD EB02 JMP 0040D0E1
015F:0040D0DF 0F31 RDTSC
015F:0040D0E1 33D2 XOR EDX,EDX
015F:0040D0E3 69C00D661900 IMUL EAX,EAX,0019660D
015F:0040D0E9 05CD0D0100 ADD EAX,00010DCD
015F:0040D0EE 8985383A0000 MOV [EBP+00003A38],EAX
015F:0040D0F4 BB56340200 MOV EBX,00023456
015F:0040D0F9 43 INC EBX
015F:0040D0FA F7F3 DIV EBX
015F:0040D0FC 8BC2 MOV EAX,EDX
015F:0040D0FE 5A POP EDX
015F:0040D0FF 90 NOP
015F:0040D100 FFD2 CALL EDX <--在此处我们要停下，如果你想了解反跟踪代码，可以进入看看
015F:0040D102 CC INT 3
015F:0040D103 CC INT 3
015F:0040D104 E80E130000 CALL 0040E417
015F:0040D109 E838100000 CALL 0040E146 <--反跟踪

6、在执行到 CALL EDX 指令处时，我们下指令
r eip eip+E
r esi 10
这样就可以跳过这一段反跟踪的代码。

7、这里我们来了解一下 CALL EDX 中的一段反跟踪代码
015F:0040E369 0F010B SIDT FWORD PTR [EBX] <--取IDTR的内容
015F:0040E36C 8B7302 MOV ESI,[EBX+02] <--取IDT表的基地址
015F:0040E36F 83C608 ADD ESI,08
015F:0040E372 8B1E MOV EBX,[ESI] <--取int 1的低位偏移
015F:0040E374 53 PUSH EBX
015F:0040E375 56 PUSH ESI
015F:0040E376 83C610 ADD ESI,10
015F:0040E379 8B36 MOV ESI,[ESI] <--取int 3的低位偏移
015F:0040E37B 81E6FFFF0000 AND ESI,0000FFFF
015F:0040E381 81E3FFFF0000 AND EBX,0000FFFF
015F:0040E387 2BF3 SUB ESI,EBX
015F:0040E389 83FE1E CMP ESI,1E <--比较低位偏移
015F:0040E38C B090 MOV AL,90
015F:0040E38E 7427 JZ 0040E3B7 <--关键了！
015F:0040E390 8BDD MOV EBX,EBP
015F:0040E392 81C311140000 ADD EBX,00001411
015F:0040E398 0F010B SIDT FWORD PTR [EBX] <--取IDTR的内容
015F:0040E39B 8B7B02 MOV EDI,[EBX+02] <--取IDT表的基地址
015F:0040E39E 83C708 ADD EDI,08
015F:0040E3A1 8B4704 MOV EAX,[EDI+04] <--取int 1的高位偏移
015F:0040E3A4 668B07 MOV AX,[EDI] <--取int 1的低位偏移
015F:0040E3A7 8038E9 CMP BYTE PTR [EAX],E9 <--判断int 1中断处理程序第一个字节是否为JMP指令
015F:0040E3AA B090 MOV AL,90
015F:0040E3AC 7409 JZ 0040E3B7 <--关键了！
015F:0040E3AE 83FE1E CMP ESI,1E
015F:0040E3B1 B090 MOV AL,90
015F:0040E3B3 7402 JZ 0040E3B7 <--关键了！
015F:0040E3B5 045B ADD AL,5B

8、这里我们来了解一下 CALL 0040E146 中的反跟踪代码
015F:0040E146 8B8587390000 MOV EAX,[EBP+00003987]
015F:0040E14C 8B8DC5300000 MOV ECX,[EBP+000030C5]
015F:0040E152 C1E908 SHR ECX,08
015F:0040E155 33D2 XOR EDX,EDX
015F:0040E157 B902000000 MOV ECX,00000002
015F:0040E15C F7F1 DIV ECX
015F:0040E15E 0BD2 OR EDX,EDX
015F:0040E160 7502 JNZ 0040E164 <--关键了！
015F:0040E162 EB27 JMP 0040E18B
==> 0040E164 8BDD MOV EBX,EBP
015F:0040E166 81C38B390000 ADD EBX,0000398B
015F:0040E16C 0F010B SIDT FWORD PTR [EBX] <--取IDTR的内容
015F:0040E16F 8B7302 MOV ESI,[EBX+02] <--取IDT表的基地址
015F:0040E172 83C608 ADD ESI,08
015F:0040E175 8B1E MOV EBX,[ESI] <--取int 1的低位偏移
015F:0040E177 83C610 ADD ESI,10
015F:0040E17A 8B36 MOV ESI,[ESI] <--取int 3的低位偏移
015F:0040E17C 81E6FFFF0000 AND ESI,0000FFFF
015F:0040E182 81E3FFFF0000 AND EBX,0000FFFF
015F:0040E188 2BF3 SUB ESI,EBX <--ESI返回低位偏移之差
015F:0040E18A C3 RET
015F:0040E18B BE10000000 MOV ESI,00000010 <--ESI返回0x10
015F:0040E190 C3 RET

9、我们继续跟踪来到如下，（这也是由SMC得来的）
015F:0040D1F7 49 DEC ECX
015F:0040D1F8 83F900 CMP ECX,00
015F:0040D1FB 75EB JNZ 0040D1E8
015F:0040D1FD 59 POP ECX
015F:0040D1FE 81E942000000 SUB ECX,00000042
015F:0040D204 51 PUSH ECX
015F:0040D205 E873100000 CALL 0040E27D <--内有反跟踪代码
015F:0040D20A 33C0 XOR EAX,EAX
015F:0040D20C 59 POP ECX
015F:0040D20D 8AC1 MOV AL,CL
015F:0040D20F 8BDD MOV EBX,EBP
015F:0040D211 81C3A5320000 ADD EBX,000032A5
015F:0040D217 8BB57D390000 MOV ESI,[EBP+0000397D]
015F:0040D21D 50 PUSH EAX
015F:0040D21E 51 PUSH ECX
015F:0040D21F 53 PUSH EBX
015F:0040D220 E8D10E0000 CALL 0040E0F6
015F:0040D225 5B POP EBX

10、进入 CALL 0040E27D 我们来看看其中的反跟踪代码。
==> 0040E29D 8BDD MOV EBX,EBP
015F:0040E29F 81C311140000 ADD EBX,00001411
015F:0040E2A5 0F010B SIDT FWORD PTR [EBX] <--取IDTR内容
015F:0040E2A8 8B7B02 MOV EDI,[EBX+02] <--取IDT表基地址
015F:0040E2AB 83C708 ADD EDI,08
015F:0040E2AE 8B4704 MOV EAX,[EDI+04] <--取int 1的高位偏移
015F:0040E2B1 668B07 MOV AX,[EDI] <--取int 1的低位偏移
015F:0040E2B4 8038E9 CMP BYTE PTR [EAX],E9 <--判断int 1中断处理程序第一个字节是否为JMP指令
015F:0040E2B7 750B JNZ 0040E2C4 <--关键了！
015F:0040E2B9 BE1E000000 MOV ESI,0000001E <--发现跟踪ESI=1E
015F:0040E2BE 8BDD MOV EBX,EBP
015F:0040E2C0 52 PUSH EDX
015F:0040E2C1 53 PUSH EBX
015F:0040E2C2 EB28 JMP 0040E2EC
015F:0040E2C4 8BDD MOV EBX,EBP
015F:0040E2C6 52 PUSH EDX
015F:0040E2C7 53 PUSH EBX
015F:0040E2C8 81C311140000 ADD EBX,00001411
015F:0040E2CE 0F010B SIDT FWORD PTR [EBX] <--取IDTR内容
015F:0040E2D1 8B7302 MOV ESI,[EBX+02] <--取IDT表基地址
015F:0040E2D4 83C608 ADD ESI,08
015F:0040E2D7 8B1E MOV EBX,[ESI] <--取int 1的低位偏移
015F:0040E2D9 83C610 ADD ESI,10
015F:0040E2DC 8B36 MOV ESI,[ESI] <--取int 3的低位偏移
015F:0040E2DE 81E6FFFF0000 AND ESI,0000FFFF
015F:0040E2E4 81E3FFFF0000 AND EBX,0000FFFF
015F:0040E2EA 2BF3 SUB ESI,EBX <--计算低位偏移之差
015F:0040E2EC 8BDE MOV EBX,ESI
015F:0040E2EE 8BD3 MOV EDX,EBX <--发现跟踪EDX=ESI=1E
015F:0040E2F0 5B POP EBX
015F:0040E2F1 81C3DB110000 ADD EBX,000011DB <--以后用不正确的EDX和ESI来SMC自身的代码，你说会发生什么现象！
015F:0040E2F7 33C0 XOR EAX,EAX
015F:0040E2F9 8A03 MOV AL,[EBX]
015F:0040E2FB 03C6 ADD EAX,ESI
015F:0040E2FD 8803 MOV [EBX],AL
015F:0040E2FF 83C304 ADD EBX,04
015F:0040E302 8A03 MOV AL,[EBX]
015F:0040E304 8BF2 MOV ESI,EDX
015F:0040E306 C1E602 SHL ESI,02
015F:0040E309 03C6 ADD EAX,ESI
015F:0040E30B 8803 MOV [EBX],AL
015F:0040E30D 5A POP EDX
015F:0040E30E C3 RET
015F:0040E30F 8BDD MOV EBX,EBP
015F:0040E311 BE10000000 MOV ESI,00000010
015F:0040E316 BA10000000 MOV EDX,00000010 <--未发现跟踪时ESI=10,EDX=10
015F:0040E31B 81C3DB110000 ADD EBX,000011DB <--以下是用SMC的技巧来还原以后的代码
015F:0040E321 33C0 XOR EAX,EAX
015F:0040E323 8A03 MOV AL,[EBX]
015F:0040E325 03C6 ADD EAX,ESI
015F:0040E327 8803 MOV [EBX],AL
015F:0040E329 83C304 ADD EBX,04
015F:0040E32C 8A03 MOV AL,[EBX]
015F:0040E32E 8BF2 MOV ESI,EDX 
015F:0040E330 C1E602 SHL ESI,02
015F:0040E333 03C6 ADD EAX,ESI
015F:0040E335 8803 MOV [EBX],AL
015F:0040E337 C3 RET

11、看完反跟踪代码，我们回到主程序继续跟踪到如下代码处
015F:0040D9C2 FFB54C210000 PUSH DWORD PTR [EBP+0000214C]
015F:0040D9C8 FF956E1E0000 CALL [EBP+00001E6E]
015F:0040D9CE 83854021000014 ADD DWORD PTR [EBP+00002140],14
015F:0040D9D5 FF8D94300000 DEC DWORD PTR [EBP+00003094]
015F:0040D9DB 6683BD9430000000 CMP WORD PTR [EBP+00003094],00
015F:0040D9E3 0F85FAFDFFFF JNZ 0040D7E3
015F:0040D9E9 B8BB140000 MOV EAX,000014BB
015F:0040D9EE 03C5 ADD EAX,EBP
015F:0040D9F0 FFE0 JMP EAX <--此处将跳转到文件名比较的地方
015F:0040D9F2 FFA5AB390000 JMP [EBP+000039AB] <--跳到以下代码处
我们分别先在 JMP EAX 和 JMP [EBP+000039AB] 处设下断点。先我们来看看加壳程序是如何进行文件名比较来防止你修改文件名的。

12、在 JMP EAX 跳转后，我们将来到如下代码处
.....之前的代码将调用GetModuleName得到文件名称，以下的代码是分析比较的部分
015F:0040E503 740F JZ 0040E514
015F:0040E505 8A1E MOV BL,[ESI] <--[ESI]指向文件名称字符串
015F:0040E507 80FB5C CMP BL,5C <--判断是否为"\"字符
015F:0040E50A 7415 JZ 0040E521
015F:0040E50C 80C320 ADD BL,20 <--转换成小写字母
015F:0040E50F 881E MOV [ESI],BL
015F:0040E511 4E DEC ESI
015F:0040E512 EBF1 JMP 0040E505
015F:0040E514 90 NOP
015F:0040E515 8A1E MOV BL,[ESI]
015F:0040E517 80FB5C CMP BL,5C
015F:0040E51A 7405 JZ 0040E521
015F:0040E51C 881E MOV [ESI],BL
015F:0040E51E 4E DEC ESI
015F:0040E51F EBF4 JMP 0040E515
015F:0040E521 46 INC ESI
015F:0040E522 BF66160000 MOV EDI,00001666
015F:0040E527 03FD ADD EDI,EBP <--EDI指向字符串"bitarts"
015F:0040E529 33C9 XOR ECX,ECX
015F:0040E52B 33C0 XOR EAX,EAX
015F:0040E52D 8A06 MOV AL,[ESI]
015F:0040E52F 3C00 CMP AL,00
015F:0040E531 7438 JZ 0040E56B <--判断字符串是否比较结束
015F:0040E533 83F905 CMP ECX,05
015F:0040E536 7433 JZ 0040E56B <--是否匹配完全相同，是则跳走
015F:0040E538 3807 CMP [EDI],AL <--判断文件名称是否相等
015F:0040E53A 7505 JNZ 0040E541 <--不等，则跳走
015F:0040E53C 46 INC ESI
015F:0040E53D 47 INC EDI
015F:0040E53E 41 INC ECX
015F:0040E53F JMP 0040E52D <--循环

13、知道了程序如何比较文件名称，按F5继续，将中断在我们设好的断点 JMP [EBP+000039AB] 处。我们继续跟踪到如下代码
015F:00410D99 BBCD150000 MOV EBX,000015CD
015F:00410D9E 03DD ADD EBX,EBP
015F:00410DA0 53 PUSH EBX
015F:00410DA1 50 PUSH EAX
015F:00410DA2 FF955E1E0000 CALL [EBP+00001E5E]
015F:00410DA8 FFD0 CALL EAX
015F:00410DAA 8B8554210000 MOV EAX,[EBP+00002154]
015F:00410DB0 0185C1300000 ADD [EBP+000030C1],EAX
015F:00410DB6 FFA59B390000 JMP [EBP+0000399B] <--此处跳转到最后的一段代码
015F:00410DBC C3 RET

14、在 JMP [EBP+0000399B] 处跳转到如下最后一处代码。这里我们可以DUMP得到完整的文件了。
015F:0040D0C6 61 POPAD
015F:0040D0C7 5D POP EBP
015F:0040D0C8 8B85C1300000 MOV EAX,[EBP+000030C1]
015F:0040D0CE 5D POP EBP
015F:0040D0CF FFE0 JMP EAX <--此时，EAX就是OEP。在此处我们DUMP的时候到了
在 JMP EAX 处我们下指令（这里我使用的是ICEDUMP 6.0168的命令使用方法）
/bhrama ProcDump32 - Dumper Server
这时程序将回到WINDOWS，过一段时间，如果成功，将出现文件保存对话框让你选择想保存的文件名。存完将回到SoftICE，好！我们按F5结束工作。

【后记】
应该说以上我介绍的并不是以脱壳为主，而是介绍一些Crunch加壳程序的特征，也希望大家以此能进行更多的分析来相互交流。
如果你按此法脱壳，可能你要花费大把大把的时间。如果你想更快的脱壳，可以参考我写的ProcDump的Script，或者根据其中脱壳的方法在加密代码还原后搜索特征代码，那样来得更快。


Crunch v1.1

 标 题:对Crunch v1.1主程序文件的脱壳方法 ---ljtt
发信人:ljtt
时 间:2000-11-30 17:32:15
详细信息:
对Crunch v1.1主程序文件的脱壳方法

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
Crunch v1.1的主程序文件的注册方法采用了和Armadilo的方法类似，由于其自身有多处反跟踪的代码，所以如果不处理。。。。。

样例文件： Crunch.EXE （Crunch v1.1的主程序文件）
加壳方式： Crunch v1.1
目标： 手动脱壳
作者： ljttt
写作日期： 2001-xx-xx （有感于某制假企业）

1、启动ICEDUMP，并启动ProcDump 1.6.2，选择Option/Rebuild new import table，单击Bhrama Server。这样我们将来手动脱壳时可以借助ProcDump的自动脱壳功能。这样很方便、快洁。

2、Ctrl-D进入SoftICE，设断点
bpint 3

3、用PEditor 1.5打开Crunch.EXE，单击break'n'enter。这时将在第一条指令处中断进入SoftICE。可以看到如下提示：
015F:0066C000 CC INT 3
015F:0066C001 E800000000 CALL 0066C006
015F:0066C006 5D POP EBP
在命令窗口提示如下：
You have to enter "eb eip 55" before you continue !

现在我按照提示输入
eb eip 55
这样修改了入口处的 CC （int 3）。现在显示如下，可以继续跟踪了。
015F:0066C000 55 PUSH EBP
015F:0066C001 E800000000 CALL 0066C006
015F:0066C006 5D POP EBP

4、继续到如下代码处：（特征是第一个 REPZ MOVSB 指令）
015F:0066C0D9 BFE4000000 MOV EDI,000000E4
015F:0066C0DE 03FD ADD EDI,EBP
015F:0066C0E0 8BC8 MOV ECX,EAX
015F:0066C0E2 F3A4 REPZ MOVSB <--在该指令执行完后，以下将得到SMC方法还原后的正确代码
015F:0066C0E4 8B07 MOV EAX,[EDI] <--现在还是加密的代码
015F:0066C0E6 D581 AAD
015F:0066C0E8 C2A614 RET 14A6

5、在 REPZ MOVSB 执行后，我们可以看到如下的代码：
015F:0066C0D9 BFE4000000 MOV EDI,000000E4
015F:0066C0DE 03FD ADD EDI,EBP
015F:0066C0E0 8BC8 MOV ECX,EAX
015F:0066C0E2 F3A4 REPZ MOVSB
015F:0066C0E4 8BD5 MOV EDX,EBP <--这是还原后的正确代码了，可以继续跟踪了
015F:0066C0E6 81C2A6140000 ADD EDX,000014A6
015F:0066C0EC 52 PUSH EDX

6、继续跟踪到如下代码处：（特征是 CALL EDX 后紧跟着两个 INT 3 指令）
015F:0066C11C 5A POP EDX
015F:0066C11D 90 NOP
015F:0066C11E FFD2 CALL EDX <--在此处我们要停下，其中有反跟踪的代码，我们要跳过这段代码
015F:0066C120 CC INT 3
015F:0066C121 CC INT 3
015F:0066C122 E85E140000 CALL 0066D585

7、在 CALL EDX 处我们要停下，下指令跳过反跟踪代码（关于这段反跟踪代码的分析我已在《对Crunch v1.1加壳程序的手动脱壳的一点分析》一文中说明）
r eip eip+E
r esi 10

8、好了，现在我们又可以继续跟踪了，到如下代码处：（特征是 JG 0066C19F 指令）
015F:0066C1A6 83C701 ADD EDI,01
015F:0066C1A9 4B DEC EBX
015F:0066C1AA 83FB00 CMP EBX,00
015F:0066C1AD 7FF0 JG 0066C19F <--现在程序又要用到SMC的方法来还原代码了。
015F:0066C1AF 90 NOP <--现在这里还是加密的代码
015F:0066C1B0 EBCD JMP 0066C17F
015F:0066C1B2 90 NOP

9、我们来看看SMC方法还原的正确代码：
015F:0066C1A6 83C701 ADD EDI,01
015F:0066C1A9 4B DEC EBX
015F:0066C1AA 83FB00 CMP EBX,00
015F:0066C1AD 7FF0 JG 0066C19F <--该指令后的代码现在是还原后的正确代码了，可以比较以上的代码看看
015F:0066C1AF B942000000 MOV ECX,00000042
015F:0066C1B4 59 POP ECX

10、继续跟踪到如下代码处：（特征是 SUB ECX,00000042 指令）
015F:0066C216 83F900 CMP ECX,00
015F:0066C219 75EB JNZ 0066C206
015F:0066C21B 59 POP ECX
015F:0066C21C 81E942000000 SUB ECX,00000042
015F:0066C222 51 PUSH ECX
015F:0066C223 E8C3110000 CALL 0066D3EB <--内有反跟踪的代码，所以在此处我们要按F8键进入
015F:0066C228 33C0 XOR EAX,EAX

11、在 CALL 0066D3EB 处我们按进入，可以看到如下代码：（这里的反跟踪代码说明见我写的《对Crunch v1.1加壳程序的手动脱壳的一点分析》一文）
015F:0066D3EB 8BDD MOV EBX,EBP
015F:0066D3ED 8B85483C0000 MOV EAX,[EBP+00003C48]
015F:0066D3F3 8B8D86330000 MOV ECX,[EBP+00003386]
015F:0066D3F9 C1E908 SHR ECX,08
015F:0066D3FC 33D2 XOR EDX,EDX
015F:0066D3FE B902000000 MOV ECX,00000002
015F:0066D403 F7F1 DIV ECX
015F:0066D405 0BD2 OR EDX,EDX
015F:0066D407 7502 JNZ 0066D40B <--在此处我们要停下！
015F:0066D409 EB72 JMP 0066D47D
015F:0066D40B 8BDD MOV EBX,EBP

12、在 JNZ 006D40B 处停下，我们不能让其跳转，所以我们可下指令
方法一：修改跳转方向
r fl z
方法二：NOP掉跳转指令
eb eip 90
eb eip+1 90

13、按F12返回到主程序代码段中，继续跟踪如下代码处：（特征是 CALL EBX 后紧跟一条 NOP 指令）
015F:0066C273 BB76060000 MOV EBX,00000676
015F:0066C278 03DD ADD EBX,EBP
015F:0066C27A 899D643C0000 MOV [EBP+00003C64],EBX
015F:0066C280 BB050A0000 MOV EBX,00000A05
015F:0066C285 03DD ADD EBX,EBP
015F:0066C287 FFD3 CALL EBX <--内有反跟踪代码，在此处我们要停下，想办法跳过它
015F:0066C289 90 NOP
015F:0066C28A 60 PUSHAD
015F:0066C28B BB85230000 MOV EBX,00002385

14、在 CALL EBX 处停下，下指令跳过反跟踪（其中的反跟踪代码说明见我写的《Crunch v1.1中的一段有趣的检测跟踪代码》一文）
r eip eip+2

15、好了，到此主程序中的反跟踪代码大部分被我们跳过了，有没有一种登山的感觉，但是现在还只是过了一小段路程，我们继续！

如果你有过对Crunch加壳的程序的脱壳经验，一定会发现大部分类似，现在我们来看看Crunch.EXE主程序和他们的不同。这也是我们以下要进行的步骤的一个原理说明吧：
首先，Crunch.EXE自身用Crunch v1.1的方法加了壳，（其中我们在跟踪时已经知道了有大量的反跟踪代码，如果不小心掉了进去，呵呵！接受一次被超度的感觉吧！）。
然后，Crunch.EXE建立一个临时文件，其中的代码是由主程序在内存中还原得到的（此文件也用Crunch v1.1加了壳）。然后通过此文件建立一个子进程。进行注册分析。
此时，主程序Crunch.EXE进入一个的循环中，等待子进程（临时文件创建）的注册过程结束，当子进程退出后，主程序Crunch.EXE退出循环。并删除此临时文件。最后，主程序进入主界面。
因此，我们要在主程序进入主界面之前，DUMP得到我们想要的脱壳文件。由于子进程中也有反跟踪代码，所以我们必须也要跳过其中的反跟踪代码，否则前功尽弃。开始我想过很多办法，比如在临时文件刚刚保存还未创建进程的时候得到完整的加壳文件来进行单独的脱壳，然后在下次跟踪时用我脱壳后没有反跟踪代码的文件替换掉临时文件，但是发现单独运行临时文件竟然无法工作，（看来作者早有防范）可见主程序Crunch.EXE需要和子进程有信息通讯，必须要同时工作，我们也只有在主程序中运行的情况下对子进程进行分析跳过其中的反跟踪代码。不过这把我一下难住了。由于WINDOWS的多任务特点，我们无法在单步跟踪时知道何时子进程开始执行第一条指令。我跟踪的情况并非在CreatProcess函数执行后，也不在ResumeThread函数执行后。不过还是让我想出了办法。Yeah！

16、继续跟踪来到如下代码处：
015F:0066C473 50 PUSH EAX
015F:0066C474 FFB50D240000 PUSH DWORD PTR [EBP+0000240D] <--数据缓冲区地址，我跟踪时为 920000
015F:0066C47A FFB505240000 PUSH DWORD PTR [EBP+00002405]
015F:0066C480 FF951E210000 CALL [EBP+0000211E] <--即 CALL WriteFile
015F:0066C486 FFB505240000 PUSH DWORD PTR [EBP+00002405]
015F:0066C48C FF9522210000 CALL [EBP+00002122]
015F:0066C492 6800800000 PUSH 00008000
015F:0066C497 6A00 PUSH 00
015F:0066C499 FFB50D240000 PUSH DWORD PTR [EBP+0000240D]
015F:0066C49F FF9512210000 CALL [EBP+00002112]

17、在 CALL [EBP+0000211E] 处停下，我们要做些准备工作。我跟踪时 [EBP+0000240D] = 920000 ，这就是即将被保存到临时文件中的数据。
我们要修改其中第一条指令为 CC 。临时文件的 Entry Point = 31C00，（这个值可以通过显示 920000 的内容，分析 PE 结构知道，也可以在无调试环境下用ProcDump来DUMP出临时文件得到。方法很多，可以自己去分析。）所以第一条指令位于 920000+31C00 处。
下指令
eb 920000+31C00 CC

18、下指令
I3HERE ON

19、继续跟踪到如下代码处：（特征是 JMP EBX 后紧跟一条指令 MOV EAX,[EBP+00003536]）
015F:0066C52D 83C304 ADD EBX,04
015F:0066C530 FF33 PUSH DWORD PTR [EBX]
015F:0066C532 FFD0 CALL EAX
015F:0066C534 BBCC0C0000 MOV EBX,00000CCC
015F:0066C539 03DD ADD EBX,EBP
015F:0066C53B FFE3 JMP EBX <--在此处停下
015F:0066C53D 8B8536350000 MOV EAX,[EBP+00003536] <--在此处设下断点
015F:0066C543 83C014 ADD EAX,14
015F:0066C546 B914000000 MOV ECX,00000014
015F:0066C54B 33D2 XOR EDX,EDX
015F:0066C54D 8034101A XOR BYTE PTR [EDX+EAX],1A
015F:0066C551 42 INC EDX
015F:0066C552 49 DEC ECX
015F:0066C553 83F900 CMP ECX,00

20、在 JMP EBX 处时我们暂时停下，在 MOV EAX,[EBP+00003536] 处设下断点
bpx 0066C53D
此处断点将在子进程结束后中断。现在子进程还并未真正运行。在 JMP EBX 后将进入了一个循环。我们不需要浪费时间，按F5键继续。

21、程序将中断在子进程第一条指令处：
015F:0047FFFF FFCC DEC ESP
015F:00480001 E800000000 CALL 00480006
015F:00480006 5D POP EBP
015F:00480007 83ED06 SUB EBP,06
015F:0048000A 8BC5 MOV EAX,EBP

22、还原原来的代码，下指令
r eip eip-1
e eip 55 <--由于原来的第一条指令代码为 55

23、现在我们的跟踪步骤和前面对主程序Crunch.EXE类似了。重复第 4 - 14 步中的方法来反跟踪。这里就不多说了，只是把一些特征代码列出。方法比较。
㈠请对比步骤4：
特征一： REPZ MOVSB
015F:004800E2 F3A4 REPZ MOVSB <--特征
015F:004800E4 8B07 MOV EAX,[EDI] <--未还原前的加密代码
015F:004800E6 D581 AAD
015F:004800E8 C29D14 RET 149D
015F:004800EB 0E PUSH CS
以下是还原后的代码
015F:004800E2 F3A4 REPZ MOVSB <--特征
015F:004800E4 8BD5 MOV EDX,EBP <--还原后的正确代码
015F:004800E6 81C29D140000 ADD EDX,0000149D
015F:004800EC 52 PUSH EDX
015F:004800ED 33C0 XOR EAX,EAX

㈡请对比步骤6：
特征二： CALL EDX 后紧跟 INT 3
015F:0048011D 90 NOP
015F:0048011E FFD2 CALL EDX <--特征，要跳过这里的反跟踪
015F:00480120 CC INT 3
015F:00480121 CC INT 3
015F:00480122 E855140000 CALL 0048157C

㈢请对比步骤8：
特征三： JG 0048019F
015F:004801AA 83FB00 CMP EBX,00
015F:004801AD 7FF0 JG 0048019F <--特征
015F:004801AF 90 NOP <--未还原前的加密代码
015F:004801B0 EBCD JMP 0048017F
015F:004801B2 90 NOP
以下是还原后的代码
015F:004801AA 83FB00 CMP EBX,00
015F:004801AD 7FF0 JG 0048019F <--特征
015F:004801AF B942000000 MOV ECX,00000042 <--还原后的正确代码
015F:004801B4 59 POP ECX
015F:004801B5 57 PUSH EDI

㈣请对比步骤10：
特征四： SUB ECX,00000042
015F:0048021B 59 POP ECX
015F:0048021C 81E942000000 SUB ECX,00000042
015F:00480222 51 PUSH ECX
015F:00480223 E8BA110000 CALL 004813E2 <--要跳过这里的反跟踪
要跳过的地方
015F:004813FA F7F1 DIV ECX
015F:004813FC 0BD2 OR EDX,EDX
015F:004813FE 7502 JNZ 00481402 <--NOP掉
015F:00481400 EB72 JMP 00481474

㈤请对比步骤13：
特征五： CALL EBX 后紧跟 NOP
015F:00480285 03DD ADD EBX,EBP
015F:00480287 FFD3 CALL EBX <--要跳过此处的反跟踪
015F:00480289 90 NOP
015F:0048028A 60 PUSHAD

24、跳过了以上这些反跟踪的部分后，按F5键让子进程进行注册分析。这时将回到WINDOWS中，单击 CONTINUE 键将进入程序主界面。（如果你想分析注册码，可以试试了）这时将中断在我们在主程序中留下的一个断点 CALL 0066C53D。显示如下：
015F:0066C534 BBCC0C0000 MOV EBX,00000CCC
015F:0066C539 03DD ADD EBX,EBP
015F:0066C53B FFE3 JMP EBX
015F:0066C53D 8B8536350000 MOV EAX,[EBP+00003536] <--在此处中断
015F:0066C543 83C014 ADD EAX,14
015F:0066C546 B914000000 MOV ECX,00000014
015F:0066C54B 33D2 XOR EDX,EDX
015F:0066C54D 8034101A XOR BYTE PTR [EDX+EAX],1A

25、我们继续跟踪到如下代码处：（特征是 JMP EAX 后紧跟 JMP [EBP+00003C6C]）
015F:0066C9DB 83850124000014 ADD DWORD PTR [EBP+00002401],14
015F:0066C9E2 FF8D55330000 DEC DWORD PTR [EBP+00003355]
015F:0066C9E8 6683BD5533000000 CMP WORD PTR [EBP+00003355],00
015F:0066C9F0 0F85FAFDFFFF JNZ 0066C7F0
015F:0066C9F6 B83C160000 MOV EAX,0000163C
015F:0066C9FB 03C5 ADD EAX,EBP
015F:0066C9FD FFE0 JMP EAX <--此处有大量的代码
015F:0066C9FF FFA56C3C0000 JMP [EBP+00003C6C] <--这里是关键！
015F:0066CA05 8CD8 MOV AX,DS
015F:0066CA07 A804 TEST AL,04

26、我们可以在 JMP EAX 处停下，直接在 JMP [EBP+00003C6C] 处设下断点，或者把光标移动到此处按F7键，快速到此。（如果你想了解各个细节可以继续慢慢跟踪。）然后继续跟踪到如下代码处：
特征是 MOV EAX,[EBP+00002415] 加 ADD [EBP+00003382],EAX 后跟一条 JMP [EBP+00003C5C] 指令
015F:00670094 BB810A0000 MOV EBX,00000A81
015F:00670099 03DD ADD EBX,EBP
015F:0067009B FFD3 CALL EBX
015F:0067009D 64678F060000 POP DWORD PTR FS:[0000]
015F:006700A3 83C408 ADD ESP,08
015F:006700A6 8B8515240000 MOV EAX,[EBP+00002415]
015F:006700AC 018582330000 ADD [EBP+00003382],EAX
015F:006700B2 FFA55C3C0000 JMP [EBP+00003C5C] <--在这里将跳转到最后一段代码处
015F:006700B8 C3 RET

27、在 JMP [EBP+00003C5C] 处按F10键将来到如下代码处：
015F:0066C0E4 61 POPAD
015F:0066C0E5 5D POP EBP
015F:0066C0E6 8B8582330000 MOV EAX,[EBP+00003382]
015F:0066C0EC 5D POP EBP
015F:0066C0ED FFE0 JMP EAX <--EAX=OEP，这里将跳转到程序真正的入口处了！

28、在 JMP EAX 处我们要停下来，这里将到了我们来DUMP文件的时候到了。（这里我使用的是ICEDUMP 6.0168的命令使用方法）
/bhrama ProcDump32 - Dumper Server
这时程序将回到WINDOWS，过一段时间，如果成功，将出现文件保存对话框让你选择想保存的文件名。存完将回到SoftICE，好！我们按F5结束工作。

【后记】
用这种方法脱壳很累，写这篇文章也很累。不过再累也得把方法留下来，让自己以后能够对该程序的加壳方法温故知新。
Crunch.EXE v1.1
在脱壳后，还需要修改一处代码使之成为注册版。
004043C8: 8D45EC lea eax,dword ptr [ebp-14]
004043CB: BA02000000 mov edx,00000002
004043D0: E81BA40D00 call 004DE7F0
004043D5: 59 pop ecx
004043D6: 84C9 test cl,cl
004043D8: 7409 jz 004043E3 <--修改此处的代码为NOP，即 7409=9090
004043DA: C605F4054E0001 mov byte ptr [004E05F4],01
004043E1: EB07 jmp 004043EA
004043E3: C605F4054E0000 mov byte ptr [004E05F4],00
004043EA: FF4E1C dec dword ptr [esi+1C]
004043ED: 8D45FC lea eax,dword ptr [ebp-04]
004043F0: BA02000000 mov edx,00000002
004043F5: E8F6A30D00 call 004DE7F0

【补充】
最新下载了Crunch v1.2 。发现脱壳方法与上类似，就不写了。
不过注意在跟踪


Crunch v1.1的ProcDump脚本

 标 题:国庆节大家好！送个小甜饼给大家 ----- 有关Crunch v1.1加壳程序的ProcDump脱壳Script (1千字)
发信人:ljttt
时 间:2000-10-2 19:03:26
详细信息:

 国庆节大家好！送个小甜饼给大家 ----- 有关Crunch v1.1加壳程序的ProcDump脱壳Script

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
由于我现在还没有破解版的Crunch v1.1，所以就拿未注册版的Crunch来测试。好象未注册版的Crunch加壳的程序的名字有限制，其他的我就不清楚了。由于我DOWN的这个文件是根据看雪论坛的一个贴子提供的地址下载的。连帮助文件也没有。:-(

目标：        脱壳
作者：        ljttt
写作日期：    2000-10-02

以下是我写的ProcDump用的Script，把其加入ProcDump的Script.ini文件就可以了。我测试的结果可以对一些Crunch加壳的程序自动脱壳，在使用时最好选中Option/Rebuild
  new import table。不过我用C++Builder3编写的程序用此自动脱壳测试时有问题。:-(

另外，在使用时最好不要在启动时加载SoftICE等调试器。本来我想在Script中跳过这些反跟踪的代码的，但是不知道有Script中有哪个指令可以直接设置ESI等寄存器的值，如ESI=10。哪位大虾知道，还请麻烦你告诉我一声。我先多谢了。

如果哪位大虾已经把Crunch.EXE脱壳了，能否通知我一声，或者简单说说脱壳的方法。毕竟我自己从头摸索又要花费大把大把的时间。小弟先作揖了。

[INDEX]
P24=My Crunch 1.1

[My Crunch 1.1]
L1=OBJR
L2=LOOK F3,A4
L3=ADD 2
L4=BP
L5=WALK
L6=OBJR
L7=LOOK FF,D2,CC,CC
L8=BP
L9=MOVE 9
LA=WALK
LB=WALK
LC=LOOK 83,FB,00,7F,F0
LD=ADD 3
LE=BP
LF=WALK
L10=WALK
L11=LOOK 03,C5,FF,E0,FF,A5
L12=ADD 4
L13=BP
L14=WALK
L15=OBJR
L16=LOOK 8B,85,??,??,??,??,01,85,??,??,??,??,FF,A5
L17=ADD C
L18=BP
L19=WALK
L1A=OBJR
L1B=LOOK 61,5D,8B,85,??,??,??,??,5D,FF,E0
L1C=ADD 9
L1D=BP
L1E=STEP
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

【后记】
如果大家在使用时有什么问题或者有什么建议，可以给跟帖子说说。


JDPE 2.01(铁甲)

 标 题:JDPE 2.01(铁甲)的脱壳 (4千字)
发信人:67
时 间:2001-6-18 20:55:25
详细信息:
JDPE 2.01(铁甲)的脱壳

by 6767 [BCG]

工具：SoftIce，IceDump
地址：http://go5.163.com/hmjd/xz/jdpe201.zip (52K)
简述：pe文件的加壳软件，与Ding Boy的DUPE类似，但水平要差的多。
目标：脱壳
难度：1/5

先把我遇到的问题写出来：如何写JDPE的脱壳脚本？

它没有对Import Table加密，不知道有没有反跟踪手段，解压缩比较容易。

研究脱壳，我们要选用记事本(感谢MICRO$OFT)，至少入口点我们知道(RVA)：10CC。

用JDPE对记事本加壳，选项里选择“设注册码”和“到期时间”，随便填入些信息，加壳。用ProcDump的PeEdit功能看一下：Image Base=400000, Image Size=E000

用Symble Loader 载入，接下来用SI来跟，小心的设断点以跳出循环，过程很容易，这里就不详述了。

* Referenced by a CALL at Address:
|:0040D001 <- Entry Point
|
:0040D006 5D pop ebp
:0040D007 8BD5 mov edx, ebp
:0040D009 81EDE21C4000 sub ebp, 00401CE2
:0040D00F 2B9501244000 sub edx, dword ptr [ebp+00402401]
:0040D015 81EA06000000 sub edx, 00000006
:0040D01B 899505244000 mov dword ptr [ebp+00402405], edx
:0040D021 83BD0924400000 cmp dword ptr [ebp+00402409], 00000000
:0040D028 0F8538020000 jne 0040D266
:0040D02E C7850924400001000000 mov dword ptr [ebp+00402409], 00000001
:0040D038 B90C060000 mov ecx, 0000060C
:0040D03D 8DB5341D4000 lea esi, dword ptr [ebp+00401D34]

>>>> 下面这个循环对紧随其后的 40D058 到 40D058+60C 之间的代码解码

:0040D043 8A8500244000 mov al, byte ptr [ebp+00402400]
:0040D049 8A1E mov bl, byte ptr [esi]
:0040D04B 32C3 xor al, bl
:0040D04D 8806 mov byte ptr [esi], al
:0040D04F 889D00244000 mov byte ptr [ebp+00402400], bl
:0040D055 46 inc esi
:0040D056 E2EB loop 0040D043

>>>> 下面的原来都是乱码，现在是正常的：

:0040D058 9C pushfd
:0040D059 58 pop eax
:0040D05A F6C401 test ah, 01
:0040D05D 7406 je 0040D065
:0040D05F FFA535224000 jmp dword ptr [ebp+00402235]

.....

:0040D30B 8BC8 mov ecx, eax
:0040D30D 8B8595224000 mov eax, dword ptr [ebp+00402295]
:0040D313 8B9D91224000 mov ebx, dword ptr [ebp+00402291]
:0040D319 8DB5C1224000 lea esi, dword ptr [ebp+004022C1]
:0040D31F FFD1 call ecx <- 这里是对运行状态的检查，如：是否过期、注册码是否正确
<- 如果出口 EAX=0 则表示失败
:0040D321 85C0 test eax, eax <- 若跟踪到此 EAX=0，则用 r EAX 1命令
:0040D323 0F846AFFFFFF je 0040D293
:0040D329 EB47 jmp 0040D372 <- 向下跳是我们所需要的
:0040D32B EB45 jmp 0040D372

.....

:0040D352 8BC8 mov ecx, eax
:0040D354 8B8595224000 mov eax, dword ptr [ebp+00402295]
:0040D35A 8B9D99224000 mov ebx, dword ptr [ebp+00402299]
:0040D360 8DB5C1224000 lea esi, dword ptr [ebp+004022C1]
:0040D366 FFD1 call ecx <- 同上，也是检查
:0040D368 85C0 test eax, eax
:0040D36A 0F8423FFFFFF je 0040D293
:0040D370 EB00 jmp 0040D372

* Referenced by Jump at Addresses:
|
:0040D372 8B9505244000 mov edx, dword ptr [ebp+00402405] <- ImageBase
:0040D378 8B8535224000 mov eax, dword ptr [ebp+00402235] <- OEip
:0040D37E 03C2 add eax, edx

:0040D380 5D pop ebp
:0040D381 FFE0 jmp eax <- 跳到OEip去

我们只要跟踪到0040D381，按一次F10到原程序的入口，就能dump得到脱壳文件：

/pedump 400000 10cc d:dumped.exe

运行这个文件，没有任何干扰窗口，成功。

总结：
与UPX差不多，用Symble Loader载入后，先跟踪到一开始的那个Loop循环结束，然后用Ctrl+PageDown向下翻页，找到后对其偏移址下 G 命令，再是一、二次F10到OEip，下Pedump就可以了。

问题：
我写了ProcDump的脚本，如下，但不成功：

[JDPE]
L1=LOOK 46,E2
L2=ADD 3
L3=BP
L4=OBJR
L5=LOOK 5D,FF
L6=BP
L7=WALK
L8=WALK
L9=STEP
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00020000
OPTL5=00000000

不知道该怎样写，哪位有时间看一下。


Krypton v0.3

 标 题:脱Krypton The Krypter v0.3加的壳 (5千字)
发信人:fs0
时 间:2001-7-21 19:52:49
详细信息:
Krypton v0.3加的壳就是一大堆的
PUSH ECX
JMP xxxxxxxx
POP ECX
JMP xxxxxxxx
令人看到就烦, 还有就是还原程序除了call API外极少见到call, ret指令,
我们的F12就没用武之地, 想偷懒都不行, 要找到OEP还真的不容易.
尽管已脱过该壳, 还没有想到十分有效, 快捷找OEP的方法. 有都是要按F8很久才找到.
要是从程序入口开始看, 程序先是找kernel32.dll的ImageBase(exe中不用Import的方法),
再找GetProcAddress的地址, 好“长”的一段程序(一大堆花指令), 然后就.....(烦!)

下面说说怎么找OEP, 加壳程序一定要还原原程序吧, 一般程序的imagebase是400000,
section alignment是1000, 我们可以 bpmb cs:401001 w (为什么不是401000 ? 第一个
一般是比较特殊的, 我们就用第二个), 然后 g, 看 g了多少次原程序就运行, 就从最后
一次看起, 跳出该还原程序, 我看到的是:
dec ecx
jnz continue_restore ; 还没有还原完就跳
jmp xxxxxxxx

之后是:
dec esi ; 还剩的section数
jnz continue_restore_next_section ; 还没有还原完所有的section就跳
jmp xxxxxxxx

经过一阵的F8后来到:
016F:006F25D0 CMP WORD [EBP+00406596],FEEB
016F:006F25D9 JNZ NEAR 006F086E
016F:006F25DF MOV [EBP+0040764C],EAX
016F:006F25E5 MOV DWORD [EBP+00407650],00
016F:006F25EF CMP DWORD [EBP+0041CD81],BYTE +00
016F:006F25F6 JNZ 006F261E
016F:006F25F8 MOV EDX,[EBP+00407665]
016F:006F25FE ADD EDX,[EBP+00407660] ; EDX = OEP
016F:006F2604 MOV [EBP+0041CD81],EDX
016F:006F260A MOV EDX,004077ED
016F:006F260F ADD EDX,EBP
016F:006F2611 PUSH EDX
016F:006F2612 PUSH DWORD [WORD FS:00]
016F:006F2618 MOV [WORD FS:00],ESP
016F:006F261E MOV EDX,[EBP+00407660]
016F:006F2624 MOV EAX,[ESI]
016F:006F2626 OR EAX,EAX
016F:006F2628 JNZ 006F262D
016F:006F262A MOV EAX,[ESI+10]
016F:006F262D ADD EAX,EDX
016F:006F262F ADD EAX,[EBP+00407650]
016F:006F2635 MOV EBX,[EAX]
016F:006F2637 MOV EDI,[ESI+10]
016F:006F263A ADD EDI,EDX
016F:006F263C ADD EDI,[EBP+00407650]
016F:006F2642 TEST EBX,EBX
016F:006F2644 JZ NEAR 006F3016 ; 处理完Import table就跳
016F:006F264A TEST EBX,11000000

016F:006F376B MOV BYTE [EBX],00 ; 清空运行过的代码
016F:006F376E INC EBX
016F:006F376F CMP EBX,ECX
016F:006F3771 JNZ 006F376B
016F:006F3773 SUB EAX,EAX
016F:006F3775 MOVZX ECX,WORD [ESI+EDX+06]
016F:006F377A SHL EAX,05
016F:006F377D SHL ECX,03
016F:006F3780 MOV [EAX],ECX ; Raise exception!

dd fs:0
37BF:0000 0065FE08 xxxxxxxx xxxxxxxx xxxxxxxx

dd ds:65FE08
0177:0065FE08 0065FF68 006F3825 xxxxxxxx xxxxxxxx

u cs:6F3825
016F:006F3825 MOV EAX,`DOSMGR_BackFill_Allowed`
016F:006F382A MOV ESP,[EAX]
016F:006F382C POP DWORD [WORD FS:00]
016F:006F3832 CALL 006F3837
016F:006F3837 POP EBP
016F:006F3838 SUB EBP,004077FF
016F:006F383E CMP BYTE [EBP+0040948A],FF ; K-Execution ?
016F:006F3845 JZ 006F3858 ; jump when yes ?
016F:006F3847 MOV ECX,[EBP+0041CD7A]
016F:006F384D MOV [ESP],ECX
016F:006F3850 MOV EDX,[EBP+0041CD81]
016F:006F3856 JMP EDX ; jump to OEP
016F:006F3858 CALL 006F385D
016F:006F385D POP EBP
016F:006F385E SUB EBP,00407825
016F:006F3864 JMP SHORT 006F38A4

如果是K-Execution则将 FF1500000000 替换为 FF15xxxxxxxx :
即 CALL NEAR [00000000] --> CALL NEAR [xxxxxxxx], 用来动态还原代码.

跟着是将 CALL NEAR [00000001] 替换为 ? (不知道:) (难道是K-Loader?)

好, 先bpx OEP, dump file, 再用Import REConstructor Get Import, 可以得到Import table的RVA,
但不知道是哪个API.
如: rva:00006000 ptr:0067001F

u 67001F
016F:0067001F ADD DWORD [0067003A],75188466 ;[0067003A] --> 4AE04B7A
016F:00670029 MOV EAX,[0067003A] ;eax = BFF8CFE0 SetHandleCount
016F:0067002E SUB DWORD [0067003A],75188466
016F:00670038 JMP EAX

这下可就有点麻烦了, 怎样才能重建Import table呢? 最初是想用程序来把上面的代码替换为
JMP BFF8CFE0 的, 但经过细看其重定向过程, 发现只需改一下该过程, 就可以直接把 BFF8CFE0
放到rva:00006000里去. 先简单说一下其重定向过程如下:

eax = GetProcAddress
pusha
生成016F:016F:0067001F处的代码
popa
mov eax, [ebp+xxxxxxxx] ; [ebp+xxxxxxxx] ＝ 0067001F , 将这句nop掉, eax 就是 BFF8CFE0, 就这样搞定Import table的问题
mov [406000], eax

跟着就是还原K-Execution的 call 为 push 代码:
K-Execution的描述请看上面的贴, 这里不重复了. 加壳程序是靠返回地址来动态还原代码的,
而且都是用同一个地址的还原程序(上面所说的 CALL NEAR [00000000] --> CALL NEAR [xxxxxxxx],
而 CALL NEAR [00000001] --> ? 的, 因为我加壳后的程序没有, 所以暂且忽律, 我想是同理).
我们可以写一程序, 在还原后的程序里查找 CALL NEAR [xxxxxxxx], 机器码是 FF15xxxxxxxx,
先push我们要其返回的地址, 再将找到后的地址加6(push ... 为6个字节)入栈,
再跳到[xxxxxxxx]让其来还原, 呵呵, 我们就像是坐收渔人之利.
当然其还原程序还要作些修改, 就是只让其还原我们想要的 push ..., push 之后的指令不让其改动, 就是:
MOV WORD [ECX+06], 15FF
MOV [ECX+08], EDX
把这两句nop掉(幸好这里没有自检), 最后在ret指令前, 将我们push进去的查找地址出栈后才执行ret指令回到到我们写的程序继续执行.

程序如下, 写得很丑, 见笑了.
要是直接用汇编写就更好, 最后就是把这段程序搬到被加壳的程序里, 放哪里? 不用说了吧:)

void GetDumpAddr(LPVOID pmapbase, DWORD dwSize, unsigned char *restore_proc)
{ //假设我们的pmapbase=0x401000, restore_proc为还原程序地址
unsigned long i, fixaddr;
for(i=0;i<dwSize-6;)
{ //我这里查找 FF15A78D7000
if (*(DWORD *)((unsigned char*)pmapbase+i) == 0x8da715ff && *(DWORD *)((unsigned char*)pmapbase+i+2) == 0x00708da7)
{
fixaddr = (unsigned long)(unsigned char*)pmapbase + i + 6;
__asm push offset conti //运行完还原程序的返回地址, 实际搬到被加壳程序空间后看看要不要改
__asm push fixaddr //找到的地址
__asm jmp restore_proc //跳到还原程序
conti:
i+=6;
}
else
i++;
}
return;
}

标 题:呵呵, CALL NEAR [00000001]这里补上, 谢谢提醒 (591字)
发信人:fs0
时 间:2001-7-22 19:17:19
详细信息:

不知为何我用来试加壳的程序没有CALL NEAR [00000001], 后来加notepad.exe就有了.
还原改代码的方法也很简单, 因为该call最后的指令是jmp near [eax], 跳到由加壳生成的重定向地址去,
而此时的eax就是原程序要call的地址, 我们可以在该jmp前写
mov ebx, dword ptr [esp]
sub ebx, byte 4
mov dword ptr [ebx], eax
ret
再用上面贴的方法还原.

的确, 该加壳方法要是在加壳时没有检测原程序有否 FF1500000000 和 FF1501000000 时, 还原时就有可能出错.

更正上面贴的一点错:

>>016F:006F2644 JZ NEAR 006F3016 ; 处理完Import table就跳

应该是处理完一个dll时跳, 判断处理完整个Import table不是这里.


Iris v2.00 build 14
[反向工程文章]

主题: 破解
目标: Iris v2.0
URL: http://www.eeye.com/iris/iris200.exe
作者: BlackB
日期: 2001-03-18 Update 1
所用工具: SoftICE, ReVirgin (@ http://tsehp.cjb.net) , IT Add (@ http://tsehp.cjb.net), PE Editor (@ http://protools.cjb.net), IceDump (@ http://protools.cjb.net)
难度 (scale 1-5): 4 ( 哦, 除非你一点都不懂，实际上不是很难 )
写在前面
这篇文章仅用于教学目的 !!
软件开发者花了许多时间来写他们的程序。他们需要卖软件来养活自己!
请购买优秀的产品!!
由 +Tsehp 在 2001 年 3 月发表。
I. 简介
欢迎来到脱壳天地。由于对 ASProtect 太过专注，可能有人都忘了还有其它的加壳保护模式。这篇文章里我们的脱壳对象是一个由PCGuard-wrapped保护的软件。当然之后要K掉它。
这是一个不错的数据包分析程序，只是有点贵，ONLY：1745$。我向作者询问过，他说(引用): "正确的价格是市场对某产品所愿意支付的价格。Iris的目标市场是公司用户，它们付的起。如果IRIS能帮助它们解决值2000$的问题(想一想那些昂贵的咨询费用)，那么就值这么多。"
既然我们大家都不开公司，那就要想办法让它变得便宜些.......
II. 关于保护

由PCGuard压缩的标志: 观察被保护exe文件的段信息就能发现。它对import table的处理与ASProtect相同，有基本的反softice手段。这是从 PC Guard 网站上的引用:

"Security envelope consist of large number of encryption layers and anti-debugging, anti reverse engineering code and contains all protection functions. Protected application becomes encrypted after protection and is distributed in encrypted state. You can put more then one protection layer around your application for better security. This makes protected application highly secure and safe from tampering."

说的真好听....但'容易' 推翻。
III. 反向工程

我采用如下步骤:

I. 脱壳

1. 寻找 OEiP
2. 解压缩
3. 重建Import Table
4. 另一种脱壳方式

II. 破解

开始了!

I. 脱壳
************

1.寻找 OEiP

这是脱壳的第一步：找到原始的Entrypoint。在我以前的脱壳文章中讲过该怎样作，现在我会更详细的再重复一遍，并采用另一种方法。
程序运行方式: 加壳程序先还原所有段的代码，完成后跳到已解压后代码的开始处(=OEiP)。一种模式：

push ebp ; 程序开始处
....解压部分代码....
....
ret 或 jmp 到 OEiP; 解压完成转到原程序入口

OEiP: 原程序开始处。

第 1 部分: OEiP

为了找到Iris的OEiP，运行 IceDump (使SoftICE不被基本的反softice代码搞乱), 在GetProcAdress 上下断点。运行程序，在SoftICE应该会跳出来，按3次F5(当然你可以多按几次)。从返回处开始追踪，设断点以跳出循环，要有耐心。
这就我找OEiP的方法，可还有更简单的方式。 IceDump 有一个命令是 跟踪X，语法: /TraceX LowEip HighEip。该能在程序执行到'low eip' 与 'high eip' 之间的指令时，让 SoftICE 跳出来。难点只是如何设置 LowEip 与 HighEip。好了，在 SoftICE 中观察一下：我们是在偏移 560000 处的某个位置上，我打赌原始程序一定是运行于偏移 400000 与 500000之间。打入： "/Tracex 400000 500000"....要有耐心....SoftICE 在 420000 附近中断，你会发现它又跳回到解压代码，所以此处不是 OEiP。用SoftICE跟踪直到你返回到解压代码中。
再次键入 "/Tracex 400000 500000" ，要有耐心. 这确实需要些时间!
当 SoftICE 跳出来时，你会在偏移 44717C 处，指令是 'push ebp'.爽，这就是我们要找的 OEiP! 现在要停下来......

2. 解压缩

还停在那里吗? 输入: "/dump 400000 130000 c:\progra~1\iris\dumped.exe" 。 400000 是 Image Base, 130000 是 Image Size，两个值在用 PEEditor 载入 Iris.exe 时得到。现在要修复段信息，使得每一段的RawSize=VirtualSize，RawOffset=VirtualOffset.在 PEEditor 中，你只要在 "Sections" 列表中对每一規段右击鼠标，选择 "Dumpfixer" ，很快就能作完。
完成后，Iris 的图标会显示在 dumped.exe 文件上，再把 OEiP 改为 4717C. 试着运行它 ........没有反应，为什么?

3. 重建Import Table

当 Iris 要用到一个 API 时，它要这样工作：
：472000 call [4BA48C]
4BA48C=CDEC08
：CDEC08 jmp kernel32!compareStringA
(在此例中，生成的 importtable 能正确的引用 API)

或者：

：472000 call [4BA48C]
4BA48C=CDEC08
：CDEC08 push DFEF04
：CDEC09 call 18FFE4
(在此例中，生成的 importtable 调用一个解压子程序，返回是正确的 thunk 值)

在此之前你是找不到原始的 IAT ，因为它事实上不存在，所以你不能仅用procdump 或者一个 IAT 重建er 就使得程序工作，这次必须重建一切。我们 *可以* 用手工方式，那要用很多时间。现在我们有一个新工具用于重建 *被破坏的* importtable。这个东东由 +tsehp 编写，名字是 ReVirgin。我们用它来重建 importtable：

运行 ReVirgin 简单看一下，这个工具不是 "你按按纽我就能搞定全部工作" 的。在用它之前你要清楚是怎么回事，有几个 editboxes 中的值你需要自己填：

1. IAT Start RVA: importtable 开始处的偏移址
2. IAT Length: importtable的长度
3. IT RVA: {自己看吧}where will the importtable be in memory, when we've inserted it in the dumped.exe
第 2 部分: ReVirgin 选项的解释

怎么找到目标:

1.在 UpdateWindow(或其它API) 上设断点，运行程序，当 SoftICE 中断时，按F12 返回到 Iris 领空，追进你所看到的每一个 call 直到你进入到跳转表中。跳转表看上去是这样子：

开始部分代码

015F:004469D8  JMP       [004BAF4C]
015F:004469DE  JMP       [004BAF50]
015F:004469E4  JMP       [004BAF54]
015F:004469EA  JMP       [004BAF58]
015F:004469F0  JMP       [004BAF5C]
015F:004469F6  JMP       [004BAF60]
015F:004469FC  JMP       [004BAF64]
015F:00446A02  JMP       [004BAF68]
015F:00446A08  JMP       [004BAF6C]
015F:00446A0E  JMP       [004BAF70]
015F:00446A14  JMP       [004BAF74]
015F:00446A1A  JMP       [004BAF78]
015F:00446A20  JMP       [004BAF7C]
015F:00446A26  JMP       [004BAF80]

结束

现在滚动跳转表，找到最小的跳转偏移 (就是找到 JMP xxxxxxxx ，xxxxxxxx 在整个跳转表中是最小值)。要注意跳转表可能被一些其它的指令所分割，所以你要确认已经找到整个表格。
另一种找最小偏移的方法是, 从跳转表随机取一个偏移(比如 4BAF80), 输入： d 4BAF80 ，向上滚动数据窗口，直到没有其它数据而只剩下 ‘00’。
在 Iris 中， IAT 开始于偏移 4BA48C，在 ReVirgin 中填入 BA48C 。

2. 对于跳转表的长度，我经常随机取一个值 (当然不能太小) ，比如 2000 什么 的，这也许不正确。在此例中运用滚动数据窗口的方式找到 importtable 的结束位置，长度是 1308 。

3. 大多数时候，我们要在文件末尾追加一个段用于加入 importtable ，只要填文件结束偏移(image size)就可以，在这里是 130000 。

运行原始的(即压缩过的)Iris.exe, 在 ReVirgin 中刷新进程列表，单击 Iris.exe 进程。它应该告诉你 importtable 不正确。在确认所需要的值都已经填入后，单击 "IAT Resolver" 按纽，完成后单击 "Resolve again" 按纽。 Voila, 现在你能看到新创建的 importtable，单击 "IAT Generator" 把 importtable 保存为 IT.BIN，注意 IT 长度为(在此例中) 194 。你可以在这里找到解析后的 importtable，在这里找到 it.bin。现在离开 ReVirgin ，并从 Iris 中退出。

接下来要作的是用新的 importtable 来改变我们的dumped.exe：

  • 用 PE Editor 打开 dumped.exe
  • 单击 "Sections"
  • 在某个 section 上右键单击，选择 "Add section"
  • 将其命名为 .idata (什么名字无所谓, 比如可以是 .BlackB)
  • 在这个段上右键单击，改变 RawSize 和 virtualSize 为 5000。这个值a不能比 importtable 长度小!!，否则无法正常工作
  • 在这个段上右键单击，选择 "Dumpfixer"
  • 离开段编辑器
  • 单击 "Directory"
  • 改变 importtable RVA 为 130000，长度为 194
  • 改变 ImageSize 为 135000 (把新段的长度 5000 加到原来的 ImageSize 130000 上得到)
  • 如果还没有改过，把 entrypoint 改为 4717C
  • 单击 "Apply changes"
  • 从 PE Editor 中退出
第 3 部分: 准备好解压缩后的 EXE 文件

用一个 hexeditor 打开 dumped.exe，光标到末尾，插入 IT.BIN，保存。运行修复后的解压缩文件，一切正常!
你还可以使用一个由 SV 开发的名为 IT 的工具，只要改变 OEiP 和 Importtable RVA 以及 dumped.exe 的长度，接下来运行 IT Add，它就为你作好了。

4. 另一种脱壳方法

对于这种保护还有另一种脱壳方法，非常非常容易，也更为简洁。那么为什么有简单的不用而采用复杂的方法呢？这是因为对于这种破坏 ImportTable 的保护方式，它在大多数情况下都解决不了。这种方法能对付所有的 PCGuard 保护，但对 ASProtect 就没有办法了。

那么，怎样实现呢？首先要找到 OEiP。当你在 OEiP 处，并且 SoftICE 和 IceDump 已经运行，输入：/pedump 400000 44717C c:\progra~1\iris\iris_dump.exe。
之后，从 SoftICE 退出，用 PeEditor 改变 iris_dump.exe 的 OEiP 为 4717C ，退出 PeEditor，运行脱壳后的文件，正常。简单，不是吗？;-)

Ok，最后要作的是....K掉它.....

II. 破戒 Iris
**************

15天使用限制和NAG。我试着在 UpdateWindow 和SendMessageA 上下断点来去除 nag ，结果并不理想，实际上这有用，但我发现了另一种简单的方法。你只需要反汇编脱壳后的文件，寻找任何的 "0Fh" , {就是这样写的，估计是0F85之类的跳转} 你会看到：

开始部分代码

004308AF loc_4308AF:                             ; code XREF: sub_430730+16Bj
004308AF                 mov     dword ptr ds:498A88h, 0
004308B9                 call    sub_446144
004308BE                 mov     eax, [eax+4]
004308C1                 push    46295Ch
004308C6                 push    462954h
004308CB                 push    46294Ch
004308D0                 mov     ecx, eax
004308D2                 call    sub_446444
004308D7                 call    sub_446144
004308DC                 mov     eax, [eax+4]
004308DF                 push    46295Ch
004308E4                 push    46293Ch
004308E9                 push    46294Ch
004308EE                 mov     ecx, eax
004308F0                 call    sub_446444
004308F5                 call    sub_446144
004308FA                 mov     eax, [eax+4]
004308FD                 push    46295Ch
00430902                 push    462934h
00430907                 push    46294Ch
0043090C                 mov     ecx, eax
0043090E                 call    sub_446444
00430913                 mov     ecx, esi
00430915                 call    sub_431570
0043091A                 test    ebp, ebp
0043091C                 jle     loc_4309F0
00430922                 cmp     ebp, 0Fh
00430925                 jg      loc_4309F0

结束

这里就是检验试用期的。可以给它打补丁，但 nag 不会消失，程序还会显示这是演示版。虽然这是演示版还是可以注册，所以一定存在一个'是否注册的旗标'。如果其值为'已注册'，那么上面代码就不会运行到。观察程序在上面(@ 0043089B = 430730 + 16B)跳向的'试用版检查'子程序。

开始部分代码

00430890 loc_430890:                             ; code XREF: sub_430730+148j
00430890                 push    0
00430892                 mov     ecx, esi
00430894                 call    sub_431660
00430899                 test    eax, eax
0043089B                 jnz     short loc_4308AF
0043089D                 push    1
0043089F                 mov     ecx, esi
004308A1                 call    sub_431660
004308A6                 push    0Fh
004308A8                 mov     ecx, esi
004308AA                 call    sub_431210

结束

不管在此处改动什么，我们仍是在试用期检查代码中，所以向前找跳向此处的跳转(@ 00430878= 430730+148)

开始部分代码

00430868 loc_430868:                             ; code XREF: sub_430730+134j
00430868                 lea     ecx, [esp+30h+var_14]
0043086C                 mov     byte ptr [esp+30h+var_4], 2
00430871                 call    sub_44611A
00430876                 test    bl, bl
00430878                 jz      short loc_430890            <- 如果注册失败则跳，否则不跳
0043087A                 mov     ecx, esi
0043087C                 mov     dword ptr ds:498A88h, 378Dh <- 置注册成功旗标
00430886                 call    sub_431570
0043088B                 jmp     loc_430A14

结束

很明显：使用你最喜欢的 hexeditor NOP掉 jz short loc_430890。完成后运行 dumped/fixed/cracked 的文件，正常工作，没有NAG，没有试用期!

使它注册到你的大名和组织，改变键值：

HKEY_CURRENT_USER\Software\eEye Digital Security\Iris\User\Nume (注意了，没有打错)
HKEY_CURRENT_USER\Software\eEye Digital Security\Iris\User\Company

这(当然了)用 RegMon 很容易发现。好了，任务完成!

IV. 结尾

虽然这文章很短，内容倒是蛮充实的。{同意} 我花了 3 个小时来破解，有些可能记不清了。不管怎样感谢 +tsehp 所开发的 ReVirgin 和使用帮助、 +Splaj 和 Risc 在脱壳和 PE 结构上所作帮助。

发现错误请尽快通知我 @ cracking (at) softhome.net，但不要要求注册码和破解!

祝贺

The Blackbird aka BlackB

Endnote:
此文由 The Blackbird 写作，© 1999-2001
This essay can be freely distributed/ published/ printed etc... as long as no modifications are made in any way. {Plz Forgive 6767 [BCG] for translation.^_^}


PE-Crypt V.1.02

 标 题:PE-Crypt V.1.02 之手動脫殼 (2千字)
发信人:C-pen
时 间:2000-10-6 14:46:17
详细信息:
[前 言]:寫這篇文章的目的是簡單的介紹PE-Crypt的保護機制,和Imp_list這個工具的應用,我想在大家讀過這篇文章後,大概也不會親自去實
踐吧!理由是它蠻繁雜的,而且它已經有優秀的脫殼工具,這個工具
是Bye PE-Crypt V1.02 by Iczelion & Plushmm, 這兩個軟體均可
在Program tool 中下載.

[保 護 機 制]:
(1) Import Table 重新編碼:此點與Asprotect相近,但Asprotect將其分割
的更細,讓你更難重建,所以在這一部份,PE-Crypt可算是比卡丘,而
Asprotect則是進化了的雷丘.
(2) 防內部下BPX:你在PE-Crypt 下BPX是無法中斷的,因為它調用
VXD call 進入0級,將你下的斷點Recover,使你的斷點失效,但它卻
沒防BPM (這也需要進入0級,Win9X下可用Cdllgate或是hook IDT
上的中斷去改drx的值)
(3) 可能因為調用VXDcall的關係,BW2K無法找出它的OEP.

[使 用 工 具]: (1) Soft-ICE V.4.01
(2) Procdump32
(3) Imp_list V.1.05
(4) Hex Workshop

[脫 殼]:
(1) 先用Procdump32去分析它:
Entry point:29000
Size of image:32000
Image Base:400000
Section .idata
VS:1000
VO:15000
RS:97C
RO:13E00
(2) 用Symbole loader載入PECrypt.exe,下d 415000,此時.idata還未解
壓,下BPM 00415000,按F5數次,直到出現Image_Import_Descriptor
的結構,此時觀察一下.idata section 的結構,你會發現,在Image_Thunk_Data 矩陣中,有些已經被編碼了,而Image_Import_By_Name的結構還在.
你可以在此時dump出 .idata section,然後再去重建, 估計Bye PE-Crypt 就是用這個方法.
我們打算用Imp_list來重建Import Table,故我們在Image_Import_By_Name 中的最後一個成員,下bpm斷點.按F5一直到這個函數也被編碼完成後,你再觀察一次.idata section 的結構
變成:
Image_Import_Descriptor <--已被編碼
Image_Thunk_Data <--已被API位址所取代(這也是我們用Imp_list的原因)
Image_Import_By_Name <--已被編碼,所有的API Name都不見了.

(3) 觀察完.idata section 後,下BD* ,按F8 Trace,你會經過繁複的解壓
過程,一直到:
:0042E112 JMP EAX &szlig; 此時 EAX=0040644D
聰明的你看到位址差那麼多,那你應該知道這就是OEP了.
此時下a eip / jmp eip ,按F5離開,用Procdump,dump(full),存檔,改
EP為0000644D, Import Table RVA=00015000
(4) 重建Import Table : 按Ctrl-D叫出Soft-ICE,此時還在PE Crypt的
領空, 我們為了要用Imp_list來重建Import Table, 故我們必須只
保留Image_Thunk_Data這個矩陣結構,其餘將其清掉:
f 415000 l 415068-415000 00
f 415348 l 415cd0-415348 00
執行Imp_list ,它會產生三個文件,Address.txt,Import1.bin,
Imprt2.bin,沒有Import0.bin,那就有可能是因為Image_Thunk_Data
的結構有錯, 以至於Imp_list無法工作,OK我們打開Address.txt
觀察一下, 你會看到:
BFF77796 ->BFF77796[1]=(00000068)KERNEL32.DLL!GetModuleHandleA
在下面你又會看到:
BFF77796 ->BFF77796[1]=(000001D8)KERNEL32.DLL!GetModuleHandleA
奇怪!怎麼會有兩組相同的API,肯定有一組是錯的, 你仔細的觀察, 會發現在
(000001D8)以前的Image_Thunk_Data的結構是錯的, 這也是作者設下的障眼法
按Ctrl-D再叫出Soft-ICE, 下
f 415068 l 4151d4-415068 00
再執行一次Imp_list, 這次會重建的很好, 有Import0.bin
(5 ) 最後的工作: 用Hex workshop打開Import0.bin, 選取適當的方塊
黏貼至我們dump下來的檔案至偏移13E00處.

JOHNSON 2000/10/06


Cabinet Manager 2001 3.5 Beta

 标 题:uNpack and craK: Cabinet Manager 2001 3.5 Beta (10千字)
发信人:6767[BCG]
时 间:2001-9-2 16:11:57
详细信息:
unpack and crak Cabinet Manager 2001 3.5 Beta
by Fpc[CCG]/6767[BCG] @2001/09

tools: si, icedump, peditor, wdasm, regmon
level: 1.5/5

软件名称：Cabinet Manager 2001b
整理日期：2001.9.1
最新版本：3.5 Beta 2
文件大小：1064KB
软件授权：共享软件
使用平台：Win9x/Me/NT/2000
发布公司：Home Page
软件简介：是一套CAB格式压缩工具软件，它除可用来建立及解压缩CAB压缩文件外，另可制成自解包文件及自动安装程序，且支持鼠标右键的快显功能、使用上相当的方便。
下载地址：http://newhua.ruyi.com/down/cab2001b.zip

又是一个压缩工具，仿Window XP界面，是测试版，有时间限制，这个可以解除，不过没有注册码，不爽。

目标由Pe-Encryptor 0.75，因其不需要重建IT，手动的难度不大。里面用到SEH知识，白天刚在Ljtt的网站看过，呵呵，首先要感谢他。下面是过程：

[Begin]
1、用peditor看主程序文件，Size=5A000。

2、用symble loader载入，当然先要运行icedump，停在入口处(下面的代码我是按执行顺序贴出的)：

017F:00459601 PUSH EBP <- 入口

017F:00459602 CALL 004596F3 <- F10

017F:00459607 XCHG EDX,EBP

017F:00459609 POP EBP

017F:0045960A PUSHAD

017F:0045960B XCHG EDX,EBP

017F:0045960D CMP BYTE PTR [EBP+402715],01

017F:00459614 JZ 0045964F <- 不会跳走

017F:00459616 MOV BYTE PTR [EBP+402715],01

017F:0045961D JMP 00459706 <- 跳走

... ...

017F:00459706 CALL 00459726 <- F8

017F:0045970B MOV ESP,[ESP+08]

... ...

017F:00459726 PUSH DWORD PTR FS:[0000] <- !!此处很重要：建立seh链

017F:0045972C MOV FS:[0000],ESP <- !!

017F:00459732 LEA ESI,[EBP+00402647] <- 准备smc，esi=00459623

017F:00459738 MOV EDI,ESI <- edi=esi

017F:0045973A MOV ECX,000000CA <- 长度

017F:0045973F MOV AH,[EBP+00402711]

017F:00459745 LODSB

017F:00459746 XOR AL,AH

017F:00459748 INC AH

017F:0045974A ROL AH,02

017F:0045974D ADD AH,90

017F:00459750 STOSB

017F:00459751 LOOP 00459745

017F:00459753 JMP 00459623 <- smc结束后跳走到 00459623

... ...

017F:00459623 CALL 00459628 <- 这是被还原后的代码，F8

017F:00459628 MOV EBX,[EBP+00402705]

017F:0045962E ADD EBX,28

017F:00459631 POP EAX

017F:00459632 SUB EAX,EBX

017F:00459634 MOV [EBP+0040270D],EAX

017F:0045963A INT 3 <- !!关键!! 产生一个例外，如果正常跟下去，程序要么运行，要么会崩溃
... ...

3、好了，在此处先停下来，检查seh链以跟踪程序：

下DD FS:0 ，在数据窗口中显示 0068FE10；继续 D 68FE10+4 得到 0045970B； U 45970B得到下面的代码，就是对例外的处理部分。下Bpx 45970B。按一次F8或F10，立刻被拦到：?

017F:0045970B MOV ESP,[ESP+08] <- 拦在此处

017F:0045970F CALL 004596F3 <- F10

017F:00459714 MOV BYTE PTR [EBP+004026CC],C3

017F:0045971B CALL 0045966B <- F10，是对文件内容进行还原

017F:00459720 JMP 0045963B <- 跳走

... ...

017F:0045963B lea edi, dword ptr [ebp+00402624]

017F:00459641 mov ecx, 0000003B

... ...

017F:00459655 ADD [EBP+00402709],EAX

017F:0045965B POPAD

017F:0045965C POPFD

017F:0045965D MOV EBX,[EDX+00402709] <- ebx=Oeip=43ABC0

017F:00459663 MOV [EDX+00402709],ECX

017F:00459669 JMP EBX <- 到Oeip

4、在459669按一次F10到原程序入口，下：/pedump 400000 3ABC0 d:dumped.exe就得到脱壳文件，执行完全没有问题。为什么用pedump而不用dump？原因在于移植性：dump命令对ImportTable的没有处理，pedump默认是建新的IT，移植不会有问题。当然这仅适用于IT没有被破坏的情况。

5、用wdasm反出脱壳后的文件，找可疑目标，有一个：Beta 2。它是显示在关于对话框中，根据前面的跳转到相应的CALL中：

:00417162 6A01 push 00000001
:00417164 898F88030000 mov dword ptr [edi+00000388], ecx
:0041716A E83127FFFF call 004098A0 <- 很重要
:0041716F 85C0 test eax, eax <- 出口eax==0表示是试用版
:00417171 8B8788030000 mov eax, dword ptr [edi+00000388]
:00417177 740F je 00417188
:00417179 05B0000000 add eax, 000000B0
:0041717E 8BCE mov ecx, esi
:00417180 50 push eax
:00417181 E8B02C0200 call 00439E36
:00417186 EB17 jmp 0041719F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417177(C)
|
:00417188 6A28 push 00000028
:0041718A 8B882C010000 mov ecx, dword ptr [eax+0000012C]
:00417190 51 push ecx

* Possible StringData Ref from Data Obj ->"(Beta 2)" <- 疑点啦
|
:00417191 68A8864400 push 004486A8
:00417196 56 push esi
:00417197 E8582C0200 call 00439DF4
:0041719C 83C410 add esp, 00000010

6、到CALL 4098A0中：

* Referenced by a CALL at Addresses:
|Many reference here
|
:004098A0 64A100000000 mov eax, dword ptr fs:[00000000]
:004098A6 55 push ebp
:004098A7 8BEC mov ebp, esp
:004098A9 6AFF push FFFFFFFF

... ...复杂的加密过程

:0040A954 8B45EC mov eax, dword ptr [ebp-14]
:0040A957 8B88B4000000 mov ecx, dword ptr [eax+000000B4]
:0040A95D 8B8558FCFFFF mov eax, dword ptr [ebp+FFFFFC58]
:0040A963 338D54FCFFFF xor ecx, dword ptr [ebp+FFFFFC54]
:0040A969 25FFFF0000 and eax, 0000FFFF
:0040A96E 03C9 add ecx, ecx
:0040A970 33C8 xor ecx, eax
:0040A972 51 push ecx

* Possible StringData Ref from Data Obj ->"%d" <- Guess
|
:0040A973 68087A4400 push 00447A08
:0040A978 68EC924400 push 004492EC <- 目标地址

* Reference To: MFC42.Ordinal:0B02, Ord:0B02h
|
:0040A97D E872F40200 Call 00439DF4 <- 相当于sprintf(wsprintf)，打印字符串
:0040A982 83C40C add esp, 0000000C
:0040A985 8B4DEC mov ecx, dword ptr [ebp-14]
:0040A988 8B81B8000000 mov eax, dword ptr [ecx+000000B8]
:0040A98E 81C1B8000000 add ecx, 000000B8
:0040A994 8B40F8 mov eax, dword ptr [eax-08]
:0040A997 85C0 test eax, eax
:0040A999 743D je 0040A9D8
:0040A99B 83E803 sub eax, 00000003
:0040A99E 8D55E8 lea edx, dword ptr [ebp-18]
:0040A9A1 50 push eax
:0040A9A2 52 push edx

* Reference To: MFC42.Ordinal:164E, Ord:164Eh
|
:0040A9A3 E8DAF60200 Call 0043A082
:0040A9A8 C745FC01000000 mov [ebp-04], 00000001
:0040A9AF 8B08 mov ecx, dword ptr [eax] <- 这里来自于注册表：

建立这样一个注册表文件，然后导入：
REGEDIT4

[HKEY_CURRENT_USER\Software\Microlog\Cabinet Manager 3.6\Settings]
"LicNo"="CM-561161061"
"Licensee"="Fpc[CCG]"

:0040A9B1 8B15EC924400 mov edx, dword ptr [004492EC]
:0040A9B7 51 push ecx
:0040A9B8 52 push edx

* Reference To: MSVCRT._mbscmp, Ord:0154h
|
:0040A9B9 FF15D0D84400 Call dword ptr [0044D8D0] <- 比较
:0040A9BF C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0040A9C6 83C408 add esp, 00000008
:0040A9C9 83F801 cmp eax, 00000001
:0040A9CC 1BC0 sbb eax, eax
:0040A9CE F7D8 neg eax
:0040A9D0 8945F0 mov dword ptr [ebp-10], eax <- 保存结果
:0040A9D3 E81D000000 call 0040A9F5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A999(C)
|
:0040A9D8 837DF000 cmp dword ptr [ebp-10], 0 <- 测试
:0040A9DC 741F je 0040A9FD <- 不等则错误，跳走
:0040A9DE 6A00 push 00000000
:0040A9E0 8B4DEC mov ecx, dword ptr [ebp-14]
:0040A9E3 E8B8EEFFFF call 004098A0 <- 对自身的调用! 不懂
:0040A9E8 85C0 test eax, eax
:0040A9EA 7411 je 0040A9FD <- 这里会跳走
:0040A9EC C745F001000000 mov [ebp-10], 00000001
:0040A9F3 EB0F jmp 0040AA04

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040A9DC(C), :0040A9EA(C)
|
:0040A9FD C745F000000000 mov [ebp-10], 00000000 <- 置失败标志

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A9F3(U)
|
:0040AA04 837DF000 cmp dword ptr [ebp-10], 0 <- 测试
:0040AA08 0F8430FFFFFF je 0040A93E <- 失败则跳
:0040AA0E 8B45EC mov eax, dword ptr [ebp-14]
:0040AA11 C780E000000000000000 mov dword ptr [ebx+000000E0], 00000000
:0040AA1B E91EFFFFFF jmp 0040A93E

7、看跳走到失败处如何处理：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040993E(C), :0040A860(C), :0040A872(C), :0040AA08(C), :0040AA1B(U)
|:0040AAC3(C), :0040AAD6(U) So Many reference, Hehe
|
:0040A93E 8B45F0 mov eax, dword ptr [ebp-10] <- 标志值到eax
<- 显然这里要改掉：push 01; pop eax。代码是：6A 01 58

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A91F(U)
|
:0040A941 8B4DF4 mov ecx, dword ptr [ebp-0C]
:0040A944 5F pop edi
:0040A945 64890D00000000 mov dword ptr fs:[00000000], ecx
:0040A94C 5E pop esi
:0040A94D 5B pop ebx
:0040A94E 8BE5 mov esp, ebp
:0040A950 5D pop ebp
:0040A951 C20400 ret 0004 <- 返回了

8、用文件编辑器找到offset：9D3E处，改为：6A 01 58。存盘退出，运行。哈! 时间限制没有了，看关于，也注册成功乐。

[End]


PE-ShiELD v0.2b2

 标 题:小丁丁 和 WinDos2000 过来看看(多谢帮助 ^_^),哪位1212也过来看看吧 ----对PE-ShiELD v0.2b2加壳程序的脱... (16千字)
发信人:ljttt
时 间:2000-10-28 20:16:41
详细信息:
标题: 小丁丁 和 WinDos2000 过来看看(多谢帮助 ^_^),哪位1212也过来看看吧 ----对PE-ShiELD v0.2b2加壳程序的脱壳的一点分析

内容:
对PE-ShiELD v0.2b2加壳程序的脱壳的一点分析

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
脱PE-ShiELD v0.2b2的壳很花功夫，不过为了感谢丁丁虾和WinDos2000的帮助，还是赶写了此文，选这个壳的原因，并不是它很简单，只因为正好碰上一位1212想了解这个壳，而我又有过这个壳的脱壳经验。所以就选它了。不过现在这个版本据说已经有脱壳机了，而我当时脱壳时还没有。所以，如果你只为了脱壳，就没有必要看此文了。找脱壳机就是了。

这个程序的手动脱壳很花功夫，这里写这篇文章主要侧重一点它的保护机制。在我跟踪此程序的过程中发现他反跟踪的地方相当多，不过幸亏没有多少故意让你死机的代码。列举一下他反跟踪的种类：
1、检测 \\.\SICE 来防范SoftICE的跟踪
2、检测 \\.\TRW 来防范TRW2000的跟踪
3、在对UnhandledExceptionFilter及其要引入的API函数在调用之前检查入口代码是否为0xCC。防范在API函数上设断点跟踪。
4、在对要引入的API函数在调用时，并不从入口处执行，而是进入其中的代码执行。防范在入口几处的代码上设断点跟踪。
4、检测 EntryPoint 和 NumberOfSections 是否被修改，来防范程序被修改，或者是SMC的方法进行破解。
5、把文件头部的所有数据进行累加和CRC比较是否被修改，来防范程序被修改或者破解。
6、使用"花指令"和SMC的方法来分段还原代码，来防范静态分析或者增加动态跟踪的难度。
7、修改了代码段中的JMP [xxxxxxxx]使之指向指向内存中动态申请的地址，防范用一般方法脱壳。
8、运行时破坏了PE结构中的所有数据，来防范用ProcDump等工具脱壳或者DUMP内存映象。
9、修改了WINDOWS加载环境中保留的PE结构，来防范ProcDump等工具脱壳或者DUMP内存映象。
还有一些，不足列举。

样例文件： znzdatII.exe （指南针数据转换程序）
下载地址： http://202.102.230.15/tanfu/soft/mdat/znzdatII.exe
加壳方式： PE-ShiELD v0.2b2
检测工具： FileInfo v2.30
目标： 手动脱壳
脱壳工具： SoftICE 4.05，ICEDUMP 6.0168，PEditor 1.6，HEX WorkShop 2.10，HIEW 5.91
作者： ljttt
写作日期： 2000-10-28

1、启动ICEDUMP。

2、Ctrl-D进入SoftICE，设下断点
bpint 3

3、用PEditor 1.6打开znzdatII.exe，记下其中的关键，然后单击 break'n'enter按钮，单击 Run 按钮。将中断进入SoftICE。
Entry Point: AA000
Image Base: 400000
Image Size: AD000
Size of Headers: 600

4、现在开始了我们的艰苦历程。由于显示的都是"花指令"，所以无法正确显示出正确的反汇编结果。列举代码也没有意义。不过跟踪了一次后，心里有数以后，可以在某些自己认为比较关键的代码处设下断点，以便下次跟踪时可以快速按F5到此。

5、我们来看看 UnhandleExceptionFilter 函数入口代码的比较代码：
015F:004AA2F9 EB01 JMP 004AA2FC <--反汇编正确的代码
015F:004AA2FB E98D9DB511 JMP 1200408D <--反汇编不正确的代码
015F:004AA300 0000 ADD [EAX],AL
015F:004AA302 EB02 JMP 004AA306
015F:004AA304 CD20 INT 20 VXDJmp 000D,4DE8
015F:004AA30A 00EB ADD BL,CH
015F:004AA30C 01EA ADD EDX,EBP
015F:004AA30E 8038CC CMP BYTE PTR [EAX],CC <--这句是关键！
015F:004AA311 EB01 JMP 004AA314
015F:004AA313 E90F84AF03 JMP 03FA2727
015F:004AA318 0000 ADD [EAX],AL
可以看到许多代码反汇编的结果不正确。这是其中一处在主程序中反跟踪代码，还有许多在子程序中的反跟踪代码就不一一列举了。
我们可以记住 CMP BYTE BTR [EAX],CC 的代码地址 004AA30E ，那么设下断点后下次跟踪时就方便了。其他类似。

6、我们再来看看 检测 TRW2000 的地方。（记住代码地址 004AA5C3 ）
015F:004AA59C 6800008000 PUSH 00800000
015F:004AA5A1 EB01 JMP 004AA5A4 <--反汇编正确的代码
015F:004AA5A3 C78D8560100000EB02EAMOV DWORD PTR [EBP+00106085],EA02EB00 <--反汇编不正确的代码
015F:004AA5AD 0450 ADD AL,50
015F:004AA5AF EB01 JMP 004AA5B2
015F:004AA5B1 C78B858D110000EB01EAMOV DWORD PTR [EBX+00118D85],EA01EB00
015F:004AA5BB E821070000 CALL 004AACE1 <--反跟踪，检测 \\.\TRW.VXD 来防范TRW2000的跟踪
015F:004AA5C0 EB01 JMP 004AA5C3
015F:004AA5C2 C783F8FFEB01EA0F85E3MOV DWORD PTR [EBX+01EBFFF8],E3850FEA
015F:004AA5C3 83F8FF CMP EAX,-01 <--比较的地方
015F:004AA5C6 EB01 JMP 004AA5C9
015F:004AA5C8 EA0F85E3000000 JMP 0000:00E3850F
015F:004AA5CF 8D8585100000 LEA EAX,[EBP+00001085]
015F:004AA5D5 EB01 JMP 004AA5D8
015F:004AA5D7 EA8D9D92100000 JMP 0000:10929D8D
015F:004AA5DE EB02 JMP 004AA5E2

7、好了，现在快到了关键的地方了。我们来看看：
015F:004AA638 6A00 PUSH 00
015F:004AA63A EB01 JMP 004AA63D <--反汇编正确的代码
015F:004AA63C E96A00EB01 JMP 0235A6AB <--反汇编不正确的代码
015F:004AA641 C78B8592100000EB01EAMOV DWORD PTR [EBX+00109285],EA01EB00
015F:004AA64B E891060000 CALL 004AACE1 <--好象是CreateThread调用
015F:004AA650 EB01 JMP 004AA653
015F:004AA652 E9FF95A510 JMP 10F03C56
015F:004AA653 FF95A5100000 CALL [EBP+000010A5] <--这里是ExitThread调用
015F:004AA659 8B859D110000 MOV EAX,[EBP+0000119D] <--注意要先在此处设下断点
015F:004AA65F E97D060000 JMP 004AACE1
015F:004AA664 8B85E0110000 MOV EAX,[EBP+000011E0]
015F:004AA66A E972060000 JMP 004AACE1
015F:004AA66F 8B85E4110000 MOV EAX,[EBP+000011E4]
在 CALL [EBP+000010A5] 处我们停下来，在其后的代码 MOV EAX,[EBP+0000119D] 处设下断点
bpx 004AA659
然后按F10继续，否则程序将直接执行。那么这一次的跟踪就结束了。如果对比在 CALL [EBP+0000119D] 执行前后的 401000 代码处的数据就可以发现执行完后代码加载到内存中了。这时的代码是还原后的代码。不过还有些没有还原。这也是PE-SHiELD防范脱壳的技巧吧。其中一处是代码段中 JMP [xxxxxxxxx] 语句没有完全还原，另外就是 .idata Section所在的Import Table部分没有还原了。

8、我们继续跟踪，现在我们来看看如何得到完整的 .idata Section 。当我们到如下代码处时：
015F:004AA94B 0FB6C9 MOVZX ECX,CL
015F:004AA94E EB01 JMP 004AA951
015F:004AA950 EA8B06EB01C889 JMP 89C8:01EB068B
015F:004AA957 16 PUSH SS
015F:004AA958 EB01 JMP 004AA95B
015F:004AA95A 6833D3EB01 PUSH 01EBD333
015F:004AA95F CA8907 RETF 0789
015F:004AA962 EB01 JMP 004AA965
015F:004AA964 C783C604EB01E283C704MOV DWORD PTR [EBX+01EB04C6],04C783E2
015F:004AA96E EB01 JMP 004AA971
015F:004AA970 684B75DAEB PUSH EBDA754B
015F:004AA975 02EA ADD CH,DL
015F:004AA977 04F3 ADD AL,F3
015F:004AA979 A4 MOVSB
015F:004AA97A 8B9549110000 MOV EDX,[EBP+00001149] <--从这里开始的代码将没有"花指令"了，我们终于走出了沼泽地
015F:004AA980 2B9541110000 SUB EDX,[EBP+00001141]
015F:004AA986 0395C9110000 ADD EDX,[EBP+000011C9]
015F:004AA98C 89954D110000 MOV [EBP+0000114D],EDX
015F:004AA992 8BB589110000 MOV ESI,[EBP+00001189]
015F:004AA998 0BF6 OR ESI,ESI
015F:004AA99A 7433 JZ 004AA9CF
015F:004AA99C 03B5C9110000 ADD ESI,[EBP+000011C9]
015F:004AA9A2 83C610 ADD ESI,10
015F:004AA9A5 8B9549110000 MOV EDX,[EBP+00001149]
015F:004AA9AB 2B95C5110000 SUB EDX,[EBP+000011C5]
015F:004AA9B1 0BD2 OR EDX,EDX
015F:004AA9B3 7405 JZ 004AA9BA
015F:004AA9B5 E854040000 CALL 004AAE0E
015F:004AA9BA 8B95C9110000 MOV EDX,[EBP+000011C9]
015F:004AA9C0 2B95D1110000 SUB EDX,[EBP+000011D1] 
015F:004AA9C6 0BD2 OR EDX,EDX
015F:004AA9C8 7405 JZ 004AA9CF
015F:004AA9CA E83F040000 CALL 004AAE0E
015F:004AA9CF 80BD3C11000000 CMP BYTE PTR [EBP+0000113C],00
015F:004AA9D6 7424 JZ 004AA9FC
015F:004AA9D8 6A04 PUSH 04
015F:004AA9DA 6800100000 PUSH 00001000
015F:004AA9DF FFB5AD110000 PUSH DWORD PTR [EBP+000011AD]
015F:004AA9E5 6A00 PUSH 00
015F:004AA9E7 E86DFCFFFF CALL 004AA659
015F:004AA9EC 0BC0 OR EAX,EAX
015F:004AA9EE 0F8469FDFFFF JZ 004AA75D
015F:004AA9F4 8BF0 MOV ESI,EAX
015F:004AA9F6 8985A1110000 MOV [EBP+000011A1],EAX
015F:004AA9FC 8B8DC9110000 MOV ECX,[EBP+000011C9]
015F:004AAA02 8B9549110000 MOV EDX,[EBP+00001149]

015F:004AAA08 8B420C MOV EAX,[EDX+0C] <--大循环体开始处
015F:004AAA0B 0BC0 OR EAX,EAX
015F:004AAA0D 0F84F3000000 JZ 004AAB06
015F:004AAA13 894A0C MOV [EDX+0C],ECX <--注意！
015F:004AAA16 03854D110000 ADD EAX,[EBP+0000114D]
015F:004AAA1C 52 PUSH EDX
015F:004AAA1D 51 PUSH ECX
015F:004AAA1E 50 PUSH EAX
015F:004AAA1F 50 PUSH EAX
015F:004AAA20 C6853F11000000 MOV BYTE PTR [EBP+0000113F],00
015F:004AAA27 8B18 MOV EBX,[EAX] 
015F:004AAA29 81E3DFDFDF00 AND EBX,00DFDFDF
015F:004AAA2F 81FB4D464300 CMP EBX,0043464D
015F:004AAA35 7518 JNZ 004AAA4F
015F:004AAA37 8B5805 MOV EBX,[EAX+05]
015F:004AAA3A 81E3FFDFDFDF AND EBX,DFDFDFFF
015F:004AAA40 81FB2E444C4C CMP EBX,4C4C442E
015F:004AAA46 7507 JNZ 004AAA4F
015F:004AAA48 C6853F11000001 MOV BYTE PTR [EBP+0000113F],01
015F:004AAA4F 8BD8 MOV EBX,EAX
015F:004AAA51 E80EFCFFFF CALL 004AA664 <--记得好象是把DLL链接库名称还原
015F:004AAA56 5B POP EBX
015F:004AAA57 59 POP ECX
015F:004AAA58 5A POP EDX
015F:004AAA59 0BC0 OR EAX,EAX
015F:004AAA5B 7512 JNZ 004AAA6F
015F:004AAA5D 52 PUSH EDX
015F:004AAA5E 51 PUSH ECX
015F:004AAA5F 53 PUSH EBX
015F:004AAA60 E80AFCFFFF CALL 004AA66F <--记得好象是加载DLL链接库吧
015F:004AAA65 0BC0 OR EAX,EAX
015F:004AAA67 0F8473FCFFFF JZ 004AA6E0
015F:004AAA6D 59 POP ECX
015F:004AAA6E 5A POP EDX
015F:004AAA6F E8EF000000 CALL 004AAB63 <--注意！把DLL链接库名称K掉
015F:004AAA74 8985D40A0000 MOV [EBP+00000AD4],EAX
015F:004AAA7A 8B32 MOV ESI,[EDX]
015F:004AAA7C 890A MOV [EDX],ECX <--注意！
015F:004AAA7E 8B7A10 MOV EDI,[EDX+10]
015F:004AAA81 894A10 MOV [EDX+10],ECX <--注意！
015F:004AAA84 0BF6 OR ESI,ESI
015F:004AAA86 7502 JNZ 004AAA8A
015F:004AAA88 8BF7 MOV ESI,EDI
015F:004AAA8A 03B54D110000 ADD ESI,[EBP+0000114D]
015F:004AAA90 03BD4D110000 ADD EDI,[EBP+0000114D]

015F:004AAA96 8B06 MOV EAX,[ESI] <--小循环体开始处
015F:004AAA98 0BC0 OR EAX,EAX
015F:004AAA9A 7462 JZ 004AAAFE
015F:004AAA9C 890E MOV [ESI],ECX <--注意！
015F:004AAA9E 7905 JNS 004AAAA5
015F:004AAAA0 0FB7C0 MOVZX EAX,AX
015F:004AAAA3 EB26 JMP 004AAACB
015F:004AAAA5 03854D110000 ADD EAX,[EBP+0000114D]
015F:004AAAAB 66C7000000 MOV WORD PTR [EAX],0000 <--注意！
015F:004AAAB0 40 INC EAX
015F:004AAAB1 40 INC EAX
015F:004AAAB2 53 PUSH EBX
015F:004AAAB3 56 PUSH ESI
015F:004AAAB4 50 PUSH EAX
015F:004AAAB5 8B9DA9110000 MOV EBX,[EBP+000011A9]
015F:004AAABB 8BF0 MOV ESI,EAX
015F:004AAABD E8A8030000 CALL 004AAE6A <--记得好象是还原引入函数名称
015F:004AAAC2 899DA9110000 MOV [EBP+000011A9],EBX
015F:004AAAC8 58 POP EAX 
015F:004AAAC9 5E POP ESI
015F:004AAACA 5B POP EBX
015F:004AAACB 50 PUSH EAX
015F:004AAACC 52 PUSH EDX
015F:004AAACD 56 PUSH ESI
015F:004AAACE 57 PUSH EDI
015F:004AAACF 51 PUSH ECX
015F:004AAAD0 53 PUSH EBX
015F:004AAAD1 50 PUSH EAX
015F:004AAAD2 50 PUSH EAX
015F:004AAAD3 6878563412 PUSH 12345678
015F:004AAAD8 E89DFBFFFF CALL 004AA67A <--加载引入函数获得函数地址
015F:004AAADD 5B POP EBX
015F:004AAADE 0BC0 OR EAX,EAX
015F:004AAAE0 0F8443FCFFFF JZ 004AA729
015F:004AAAE6 E878000000 CALL 004AAB63 <--注意！把引入函数名称K掉
015F:004AAAEB 5B POP EBX
015F:004AAAEC 59 POP ECX
015F:004AAAED 5F POP EDI
015F:004AAAEE E887000000 CALL 004AAB7A <--注意！把IMPORT_THUNK_DATA区K掉
015F:004AAAF3 5E POP ESI
015F:004AAAF4 5A POP EDX
015F:004AAAF5 5B POP EBX
015F:004AAAF6 83C604 ADD ESI,04
015F:004AAAF9 83C704 ADD EDI,04
015F:004AAAFC EB98 JMP 004AAA96   <--小循环体结束处

015F:004AAAFE 83C214 ADD EDX,14
015F:004AAB01 E902FFFFFF JMP 004AAA08 <--大循环体结束处

015F:004AAB06 EB01 JMP 004AAB09 <--大循环退出后将到此

以上列出的所有代码所做的工作主要获得函数地址，但是其中有许多代码来防止你跟踪后DUMP得到完整的Import Table。以下说明一下：
首先程序把加密的idata Section复制到申请的内存中（内存地址保存在 EDI 中）。把加密的DLL名称还原，然后LoadLibrary加载DLL动态链接库，完成后又把DLL名称用'K'掉。然后把该DLL加密的引入函数名称还原，用GetProcAddress得到函数地址。完成后又把函数名称用'K'掉。而且其中还有多处代码对IMPORT_THUNK_DATA区的数据进行了处理。这样来防止你得到完整的Import Table。因此如果不做处理，内存中始终不会存在一个完整的Import Table。这也是加壳程序用到的防脱壳的技巧吧。分析了其中的代码后，我们仍然可以想办法得到完整的Import Table。

其中我标记为"注意！"的代码共有8处，列举如下：
1、015F:004AAA13 894A0C MOV [EDX+0C],ECX <--注意！
2、015F:004AAA6F E8EF000000 CALL 004AAB63 <--注意！把DLL链接库名称K掉
3、015F:004AAA7C 890A MOV [EDX],ECX <--注意！
4、015F:004AAA81 894A10 MOV [EDX+10],ECX <--注意！
5、015F:004AAA9C 890E MOV [ESI],ECX <--注意！
6、015F:004AAAAB 66C7000000 MOV WORD PTR [EAX],0000 <--注意！
7、015F:004AAAE6 E878000000 CALL 004AAB63 <--注意！把引入函数名称K掉
8、015F:004AAAEE E887000000 CALL 004AAB7A <--注意！把IMPORT_THUNK_DATA区K掉
好！我们把这些地址的代码全部用NOP代替。（注意代码长度不同，NOP掉的字节数也不一样）这样在循环结束时我们就有了一个完整的Import Table了。

9、由于以上代码是个循环，我们并不需要详细跟踪他，所以可以在 JMP 004AAB09 处设下一个断点
bpx 004AAB06
然后按F5键，这时，程序中断在此处，这时，我们需要DUMP出这个完整的idata Section了（也就是Import Table）。下指令
/dump 5D0000 3000 c:\temp\idata.bin
（其中 5D0000 中申请的内存地址的首地址， 3000 为 idata Section 的大小，此命令用法为ICEDUMP 6.0168，低版本不同）

10、然后，我们继续跟踪，不远处就会到如下：
015F:004AAB53 B95B0B0000 MOV ECX,00000B5B
015F:004AAB58 EB01 JMP 004AAB5B
015F:004AAB5A EAF3AA61EB01EA JMP EA01:EB61AAF3
015F:004AAB61 FFE0

标 题:接上段。呀，弄错了名字，不是1212，是sworm。i am sorry! 你们先慢慢看，我先下了，网速太慢。 (3千字)
发信人:ljttt
时 间:2000-10-28 20:24:56
详细信息:

10、然后，我们继续跟踪，不远处就会到如下：
015F:004AAB53 B95B0B0000 MOV ECX,00000B5B
015F:004AAB58 EB01 JMP 004AAB5B
015F:004AAB5A EAF3AA61EB01EA JMP EA01:EB61AAF3
015F:004AAB61 FFE0 JMP EAX <--在此处停下，此时EAX=OEP=401000
015F:004AAB63 0000 ADD [EAX],AL
015F:004AAB65 0000 ADD [EAX],AL
也许你看到的一部分代码和我的不一样，为什么？因为程序到此处时会打扫战场。把前后的代码全部清零掉了。只有简单的 JMP EAX 跳转到程序真正的入口处了。好了！说了这么多，到 JMP EAX 处我们停下，下指令
/dump 400000 AD000 c:\temp\dump.exe
当然，这以后要下指令
a eip /jmp eip
然后，用PEEditor把这个进程中止掉。（注意哦，不要让他继续运行，因为为了得到完整的.idata Section我们是对代码做了修改的）

11、前期工作我们完成，但这仅仅是个开始。开始我们繁重的修补工作。
用HEX WorkShop打开znzdatII.exe和dump.exe。把znzdatII.exe开始的 600 个字节替换到 dump.exe 头部的相同个数的字节。然后保存退出。
这是由于我们得到的 dump.exe 头部的 PE结构完全被破坏了。所以如果你直接用 PEditor 或者 ProcDump 无法得到正确的文件的原因之一。

12、用 PEditor 打开 dump.exe 修改 Entry Point = 000001000，（由前面跟踪时得知）。进入 directory 修改其中的 Import Table 为 94000。（这个由跟踪得知）。进入 sections ，右键执行其中的菜单命令 dumpfixer 使各个 Section 的 RS=VS，R0=V0。

13、最后还要启动我们的 HIEW 来修改其中的 JMP [xxxxxxxx] 指令其中的偏移。
查找 FF,25，当定位的地址反汇编时显示为许多一连串的 JMP [xxxxxxxxx] 指令时说明我们找到了地方。可以看到类似如下的代码：
000835AF: 5D pop ebp
000835B0: C20400 ret 0004
000835B3: 90 nop
000835B4: FF25DC005D00 jmp dword ptr [005D00DC]
000835BA: FF25E0005D00 jmp dword ptr [005D00E0]
000835C0: FF25E4005D00 jmp dword ptr [005D00E4]
000835C6: FF25E8005D00 jmp dword ptr [005D00E8]
000835CC: FF25A0025D00 jmp dword ptr [005D02A0]
000835D2: FF25A4025D00 jmp dword ptr [005D02A4]
000835D8: FF25A8025D00 jmp dword ptr [005D02A8]

可以看到偏移地址定位到跟踪时我们发现的申请的内存地址。（这也是许多加壳程序来防范脱壳的一种办法）。而这并不是程序Import Table应该指向的真实地址。我们对比一下该如何修改
内存空间首地址 005D0000
Import Table首地址 00494000 <-- Image Base+Import Table RVA=400000+94000=494000
所以 005D00DC 对应地址为 004940DC ，所以我们只需要修改每个偏移地址中的两个字节 5D00 = 4940，以此类推。由于这些 JMP 指令有许多
（我发现的情况它们都在文件偏移 835B4 - 83F12 空间内）。因此修改是个很繁重的工作。批处理修改时必须小心！以前我就是因为无意中错误地修改了不相关的一个字节，结果让我走了很多弯路，以为自己的这种脱壳方法无效。结果第二次重新测试成功。不过这已是一个月后的事了。现在写这篇文章想起当时来真是.......）

【后记】
由于 PE-SHiELD 0.2b2 版本并不是最新版本，所以可能大家都没有注意。但是我当时并没有发现脱壳机。而且ProcDump中Script对此无效。所以只好自己手动了。一来了解一下这个壳的特点。二来掌握一下脱壳方法，以便以后再遇到这类壳时也好有个防范。呵呵.......。新版的 PE-SHiELD 0.25 已经有了脱壳机，就不用我cao心了。(这论坛"看清楚"了，是我cao心了。不是我cao！！！还让我重发。:-()

[闲言闲语]
小丁丁，就别找Sun Bird[CCG]大哥来扁我一顿了。这篇文章作为向他老人家献上的"保护费"如何？


telock 0.85f

 标 题:telock 0.85f的一点脱壳经验 (770字)
发信人:6767[BCG]
时 间:2001-9-3 0:51:13
详细信息:
telock 0.85f的一点脱壳经验
by Fpc[CCG]/6767[BCG]

研究了一下telock 0.85f对记事本的加壳，在已知入口点的情况下是能脱掉的 :)

由于现在我还没有通过跟踪找到入口点，所以方法还没有普遍性。下面简要介绍一下。

Load加壳后的记事本，下bpm 4010cc x，当然需要运行super bpm，拦下后把它Dump出来。在编辑dumped文件前先用16进制文件工具修改section的个数，原来是FFFF，根据你对目标的判断改为10个或20个。用peditor继续编辑，修改入口，把多余的段删除，选dumped fixer修复段信息，保存。

用importREC修复importTable，参见近几天的asprotect的精华贴。会有四个函数无法修复，记下ptr值。在程序(未脱壳的)运行时用softice的u命令观察相关位置，发现都是00，可以认为这四处是垃圾信息，因此删除。把新建的importtable附加到脱壳后的文件上。运行，爽! 没有问题。

接下来的任务是如何找oeip....

标 题:来看更好的： 怎样找telock加壳程序的OEip (13千字)
发信人:6767[BCG]
时 间:2001-9-3 23:35:38
详细信息:

怎样找telock加壳程序的OEip
by Fpc[CCG]/6767[BCG] @2001/09

接着前一篇，仍以记事本为对象

1、运行icedump, superbpm(thanx the guys for such beautyful tOOls!)。用symble Loader载入目标。

:0040C000 E9C750FFFF jmp 004010CC <- 入口，注意此处是被改过的
:0040C005 00CD add ch, cl
:0040C007 20E8 and al, ch
:0040C009 00000000 BYTE 4 DUP(0)

2、不要乱动，任取程序空间一点，比如下：bpm 402000，用来监视解压过程。按F5。

第一次，在这里停下：
|
:0040C6D4 AC lodsb
:0040C6D5 8D12 lea edx, dword ptr [edx] <- 这里
:0040C6D7 FEC0 inc al
:0040C6D9 0401 add al, 01

继续，第二次是：
:0040C7D9 C0C801 ror al, 01
:0040C7DC AA stosb
:0040C7DD 69D2A5B0CD4B imul edx, 4BCDB0A5 <- 这里
:0040C7E3 F9 stc
:0040C7E4 7202 jb 0040C7E8
:0040C7E6 CD20 int 20

第三次：
|
:0040C9AE AC lodsb
:0040C9AF EB02 jmp 0040C9B3 <- 这里
:0040C9B1 CD20 int 20

第四次、第五次、第六次：
:0040C9B5 2CE5 sub al, E5
:0040C9B7 32C1 xor al, cl
:0040C9B9 8807 mov byte ptr [edi], al
:0040C9BB D2C8 ror al, cl <- 这里
:0040C9BD 32C3 xor al, bl
:0040C9BF 021F add bl, byte ptr [edi]
:0040C9C1 12D9 adc bl, cl <- 这里
:0040C9C3 F6C101 test cl, 01
:0040C9C6 750F jne 0040C9D7
:0040C9C8 D1EB shr ebx, 1

:0040C9CA F7C308000000 test ebx, 00000008
:0040C9D0 7505 jne 0040C9D7
:0040C9D2 D3C3 rol ebx, cl
:0040C9D4 8D1CDB lea ebx, dword ptr [ebx+8*ebx]

:0040C9D7 AA stosb
:0040C9D8 49 dec ecx <- 这里
:0040C9D9 7FD3 jg 0040C9AE
:0040C9DB 5F pop edi

第七次：
:0040CA4E C1E902 shr ecx, 02
:0040CA51 FC cld
:0040CA52 F3 repz
:0040CA53 A5 movsd <- 这里
:0040CA54 8BCB mov ecx, ebx
:0040CA56 F3 repz

第八次：
:0040CACA 2BF0 sub esi, eax
:0040CACC F3 repz
:0040CACD A4 movsb <- 这里
:0040CACE 5E pop esi
:0040CACF EB93 jmp 0040CA64

3、好了，不要按F5。设断点：bpx GetProcAddress。按F5，被拦，按一次F12返回：

:0040CE16 81E3FFFFFF7F and ebx, 7FFFFFFF
:0040CE1C 53 push ebx
:0040CE1D FFB586AE4000 push dword ptr [ebp+0040AE86]
:0040CE23 FF95F4AD4000 call dword ptr [ebp+0040ADF4]

:0040CE29 40 inc eax <- 返回处
:0040CE2A 48 dec eax
:0040CE2B 7532 jne 0040CE5F <- 跳走
:0040CE2D 58 pop eax

... ...向下跟

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CE2B(C)
|
:0040CE5F 8907 mov dword ptr [edi], eax
:0040CE61 58 pop eax
:0040CE62 48 dec eax
:0040CE63 740D je 0040CE72 <- 先停下来

4、因为eax!=0所以不会跳，好了先关断点。看看下面的情况，下：G 40CE7E (注意：这是为了跳出循环，在里面转圈是很烦的)：

:0040CE65 40 inc eax
:0040CE66 F8 clc
:0040CE67 668943FE mov word ptr [ebx-02], ax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CE70(C)
|
:0040CE6B 8803 mov byte ptr [ebx], al
:0040CE6D 43 inc ebx
:0040CE6E 3803 cmp byte ptr [ebx], al
:0040CE70 75F9 jne 0040CE6B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CE63(C)
|
:0040CE72 83858AAE400004 add dword ptr [ebp+0040AE8A], 4
:0040CE79 E968FEFFFF jmp 0040CCE6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CDC4(C)
|
:0040CE7E 83C614 add esi, 00000014 <- 到这里
:0040CE81 8B959EAE4000 mov edx, dword ptr [ebp+0040AE9E]
:0040CE87 E945FDFFFF jmp 0040CBD1 <- 返回去了

5、好，继续看代码：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CE87(U)
|
:0040CBD1 83A55EAF400000 and dword ptr [ebp+0040AF5E], 00000000
:0040CBD8 8B460C mov eax, dword ptr [esi+0C]
:0040CBDB 83660C00 and dword ptr [esi+0C], 00000000
:0040CBDF 85C0 test eax, eax
:0040CBE1 0F84E8020000 je 0040CECF <- 这里是能跳出循环的
:0040CBE7 03C2 add eax, edx
:0040CBE9 8BD8 mov ebx, eax

6、在上面随便哪一条指令上用命令：G 0040CECF 下面的代码可有点长：

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040CBC9(C), :0040CBE1(C)
|
:0040CECF 8BBD96AE4000 mov edi, dword ptr [ebp+0040AE96] <- 车开到这里

7、激活 GetProcAddress ，按F5，会拦下(这里是三次)：

:0040CED5 85FF test edi, edi
:0040CED7 EB03 jmp 0040CEDC
:0040CED9 0100 add dword ptr [eax], eax
:0040CEDB EB74 jmp 0040CF51
:0040CEDD 3203 xor al, byte ptr [ebx]
:0040CEDF BD9EAE4000 mov ebp, 0040AE9E
:0040CEE4 8B85A6AE4000 mov eax, dword ptr [ebp+0040AEA6]
:0040CEEA 85C0 test eax, eax
:0040CEEC 7422 je 0040CF10
:0040CEEE 8B8DAAAE4000 mov ecx, dword ptr [ebp+0040AEAA]
:0040CEF4 85C9 test ecx, ecx
:0040CEF6 7418 je 0040CF10
:0040CEF8 03C7 add eax, edi
:0040CEFA 0385AEAE4000 add eax, dword ptr [ebp+0040AEAE]
:0040CF00 50 push eax
:0040CF01 51 push ecx
:0040CF02 E817FBFFFF call 0040CA1E
:0040CF07 83F8FF cmp eax, FFFFFFFF
:0040CF0A 0F841BFDFFFF je 0040CC2B

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040CEEC(C), :0040CEF6(C)
|
:0040CF10 B923010000 mov ecx, 00000123
:0040CF15 8DBD57AA4000 lea edi, dword ptr [ebp+0040AA57]
:0040CF1B 8BF7 mov esi, edi
:0040CF1D AC lodsb
:0040CF1E 3206 xor al, byte ptr [esi]
:0040CF20 AA stosb
:0040CF21 E2FA loop 0040CF1D
:0040CF23 E814000000 call 0040CF3C
:0040CF28 47 inc edi
:0040CF29 65 BYTE 065h

:0040CF2A 7443 je 0040CF6F
:0040CF2C 7572 jne 0040CFA0
:0040CF2E 7265 jb 0040CF95
:0040CF30 6E outsb
:0040CF31 7450 je 0040CF83
:0040CF33 726F jb 0040CFA4
:0040CF35 636573 arpl dword ptr [ebp+73], esp
:0040CF38 7349 jnb 0040CF83
:0040CF3A 64 BYTE 64h
:0040CF3B 00 BYTE 00h

* Referenced by a CALL at Address:
|:0040CF23
|
:0040CF3C FFB54EAF4000 push dword ptr [ebp+0040AF4E]
:0040CF42 FF95F4AD4000 call dword ptr [ebp+0040ADF4] <- 拦在此处
:0040CF48 40 inc eax <- 一次F12返回
:0040CF49 48 dec eax
:0040CF4A 0F8483000000 je 0040CFD3
:0040CF50 FFD0 call eax <- call GetCurrentProcessID
:0040CF52 8BD8 mov ebx, eax
:0040CF54 E80C000000 call 0040CF65
:0040CF59 4F dec edi
:0040CF5A 7065 jo 0040CFC1
:0040CF5C 6E outsb
:0040CF5D 50 push eax
:0040CF5E 726F jb 0040CFCF
:0040CF60 636573 arpl dword ptr [ebp+73], esp
:0040CF63 7300 jnb 0040CF65

* Referenced by a CALL at Address:
|:0040CF54
|

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CF63(C)
|
:0040CF65 FFB54EAF4000 push dword ptr [ebp+0040AF4E]
:0040CF6B FF95F4AD4000 call dword ptr [ebp+0040ADF4] <- 拦在此处
:0040CF71 40 inc eax <- 返回处
:0040CF72 48 dec eax
:0040CF73 745E je 0040CFD3
:0040CF75 53 push ebx
:0040CF76 6A00 push 00000000
:0040CF78 68FF0F1F00 push 001F0FFF
:0040CF7D FFD0 call eax <- call OpenProcess
:0040CF7F 40 inc eax
:0040CF80 48 dec eax
:0040CF81 7450 je 0040CFD3

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040CF31(C), :0040CF38(C)
|
:0040CF83 8BD8 mov ebx, eax
:0040CF85 E811000000 call 0040CF9B
:0040CF8A 56 push esi
:0040CF8B 69727475616C50 imul esi, dword ptr [edx+74], 506C6175
:0040CF92 726F jb 0040D003
:0040CF94 7465 je 0040CFFB
:0040CF96 63744578 arpl dword ptr [ebp+2*eax+78], esi
:0040CF9A 00 BYTE 00h

* Referenced by a CALL at Address:
|:0040CF85
|
:0040CF9B FFB54EAF4000 push dword ptr [ebp+0040AF4E]
:0040CFA1 FF95F4AD4000 call dword ptr [ebp+0040ADF4] <- 拦在此处
:0040CFA7 40 inc eax <- 返回处
:0040CFA8 48 dec eax
:0040CFA9 7428 je 0040CFD3
:0040CFAB 6A00 push 00000000
:0040CFAD 54 push esp
:0040CFAE 6A04 push 00000004
:0040CFB0 6800100000 push 00001000
:0040CFB5 FFB59EAE4000 push dword ptr [ebp+0040AE9E]
:0040CFBB 53 push ebx
:0040CFBC FFD0 call eax <- call VirtualProctectEX

8、离出口已经很近了，所以脱这个壳的中断是：bpx VirtualProctectEX 。绝对好用 :)

:0040CFBE 83C404 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CF5A(C)
|
:0040CFC1 40 inc eax
:0040CFC2 48 dec eax
:0040CFC3 740E je 0040CFD3
:0040CFC5 8BBD9EAE4000 mov edi, dword ptr [ebp+0040AE9E]
:0040CFCB 037F3C add edi, dword ptr [edi+3C]
:0040CFCE 66834F06FF or word ptr [edi+06], FFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040CF4A(C), :0040CF73(C), :0040CF81(C), :0040CFA9(C), :0040CFC3(C)
|
:0040CFD3 8B9DBAAE4000 mov ebx, dword ptr [ebp+0040AEBA]
:0040CFD9 33F6 xor esi, esi <- esi=0
:0040CFDB F7D3 not ebx <- ebx=OEip
:0040CFDD 0BF3 or esi, ebx
:0040CFDF 7508 jne 0040CFE9
:0040CFE1 8D9D349B4000 lea ebx, dword ptr [ebp+00409B34]
:0040CFE7 EB06 jmp 0040CFEF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CFDF(C)
|
:0040CFE9 039D9EAE4000 add ebx, dword ptr [ebp+0040AE9E]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CFE7(U)
|
:0040CFEF 895C24F0 mov dword ptr [esp-10], ebx
:0040CFF3 8DBD90AD4000 lea edi, dword ptr [ebp+0040AD90]
:0040CFF9 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CF94(C)
|
:0040CFFB B99C020000 mov ecx, 0000029C
:0040D000 F3 repz <- 代码清0，所以在这里：r ecx 0
:0040D001 AA stosb
:0040D002 8DBD349B4000 lea edi, dword ptr [ebp+00409B34]
:0040D008 B90D100000 mov ecx, 0000100D
:0040D00D F3 repz
:0040D00E AA stosb
:0040D00F 66AB stosw <- 不要执行
:0040D011 8DBD349B4000 lea edi, dword ptr [ebp+00409B34]
:0040D017 85F6 test esi, esi
:0040D019 7508 jne 0040D023
:0040D01B C70733C040C3 mov dword ptr [edi], C340C033 <- 也是搞破坏
:0040D021 EB0B jmp 0040D02E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D019(C)
|
:0040D023 C607E9 mov byte ptr [edi], E9 <- 一样的破坏
:0040D026 47 inc edi
:0040D027 2BDF sub ebx, edi
:0040D029 83EB04 sub ebx, 00000004
:0040D02C 891F mov dword ptr [edi], ebx <- 保存OEip

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D021(U)
|
:0040D02E 8DBD41AB4000 lea edi, dword ptr [ebp+0040AB41]

* Possible Reference to String Resource ID=00044: "?嘽"
|
:0040D034 B92C000000 mov ecx, 0000002C
:0040D039 F3 repz <- 代码清0，所以在这里：r ecx 0
:0040D03A AA stosb
:0040D03B 66AB stosw <- 不要执行
:0040D03D EB02 jmp 0040D041
:0040D03F 90 nop <- 这里原是花指令:CD 20，呵呵
:0040D040 90 nop
|
:0040D041 61 popad <- 恢复现场
:0040D042 FF6424D0 jmp [esp-30] <- JMP TO MOTHER!!!
:0040D046 63EB arpl ebx, ebp

That's all! Folks!


股市风暴4.0

 标 题:股市风暴4.0的外壳分析与脱壳方法(一） (7千字)
发信人:hying
时 间:2001-6-10 16:52:30
详细信息:
标题：股市风暴4.0的外壳分析与脱壳方法
所用工具：trw2000，Procdump
等级：手动脱壳入门
前言：股市风暴这个软件本身对我没有多大用处，但是它的外壳让我花费了相当长的时间，现在终于基本明白了它的流程，写下来，与那些对脱壳感兴趣的同志共同交流。
正文：
对于一个加壳的程序，常见的暴力破解方法一般有两种，一种是直接地脱壳，另外一种是利用SMC，即在外壳程序中加入一段额外的代码，当外壳对程序处理完毕后改变外壳的流程，跳转到加入的额外代码中，在内存中对生成的原程序进行修改，达到暴破的目的。对付SMC的常见方法也是运用SMC，即外壳程序也是在运行中动态生成，使破解者无法在外壳运行结束后轻易改变流程。这点在这个外壳中可以说有很充分的表现。当程序载入后可以看到如下代码：
0167:005E3000 PUSHA <-入口
0167:005E3001 CALL 005E40F3
0167:005E3006 RET
0167:005E3007 AND DWORD [EDI-22],BYTE +21
0167:005E300B ADD BH,[EDI-3E]
0167:005E300E SCASB
0167:005E300F XCHG BH,[EBX+54]
当程序运行到5E3006后会RET到另一处执行一段程序，运行完后又回到5E3007，此时代码已经变为：
0167:005E3000 PUSHA
0167:005E3001 CALL 005E40F3
0167:005E3006 RET
0167:005E3007 ADD EBX,BYTE +07
0167:005E300A REP JMP SHORT 005E300C
0167:005E300D JECXZ 005E2F92
0167:005E300F RET
0167:005E3010 SBB EDX,[EBX-18]
可以看到下面的代码已经完全改变，这就是SMC。如果你很好奇跟进那段SMC代码你会发现，那段代码执行完后会自行销毁，看来外壳作者实在很小心谨慎。
SMC代码由此开始直到5E3197有近十重之多。当一个外壳运用SMC动态生成代码有3重以上时一般用SMC来暴破就很困难了。十重！天哪，还是放弃用SMC暴破的念头吧。
当这些SMC工作全部完成后（事实上后面还有），是对外壳做一些初始（希望我没有搞错），包括对一些函数取他们的入口值，比如ExitProcess、LoadLibraryA等，等这些完成后就进入了外壳中真正重要的部分。
对于一个保护良好的外壳，antidebug是必须的，不在这方面留心一下的话恐怕连自己怎么被干掉都不知道了。下面就是他的antidebug代码。
:005E3468 8D8539040000 lea eax, dword ptr [ebp+00000439]
:005E346E 50 push eax <-EAX=5E3479，异常处理程序地址
:005E346F 33C0 xor eax, eax
:005E3471 64FF30 push dword ptr fs:[eax]
:005E3474 648920 mov dword ptr fs:[eax], esp <-建立SEH链
:005E3477 EB10 jmp 005E3489
:005E3479 8B642408 mov esp, dword ptr [esp+08] <-异常处理程序入口，在此下断点
:005E347D 8B6C2408 mov ebp, dword ptr [esp+08]
:005E3481 8D854F040000 lea eax, dword ptr [ebp+0000044F]
:005E3487 50 push eax
:005E3488 C3 ret <-到5E348F继续执行

:005E3489 CC int 03 <-下faults off，经过时产生异常可中断在上面入口，如不下faults off，经过时不产生异常就debugger detected了
:005E348A E911010000 jmp 005E35A0
:005E348F 8D8561040000 lea eax, dword ptr [ebp+00000461]
:005E3495 89442404 mov dword ptr [esp+04], eax
:005E3499 646789260000 mov fs:[0000], esp
:005E349F EB10 jmp 005E34B1
:005E34A1 8B642408 mov esp, dword ptr [esp+08]
:005E34A5 8B6C2408 mov ebp, dword ptr [esp+08]
:005E34A9 8D85A8040000 lea eax, dword ptr [ebp+000004A8]
:005E34AF 50 push eax
:005E34B0 C3 ret

:005E34B1 0F018D8E120000 sidt [ebp+0000128E] <-取IDTR的内容
:005E34B8 8B8590120000 mov eax, dword ptr [ebp+00001290] <-取IDT表的基地址
:005E34BE 83C04E add eax, 0000004E
:005E34C1 668B18 mov bx, word ptr [eax]
:005E34C4 C1E310 shl ebx, 10
:005E34C7 668B5802 mov bx, word ptr [eax+02] <-EBX为INT10的入口偏移
:005E34CB B8000C0000 mov eax, 00000C00
:005E34D0 813B45524548 cmp dword ptr [ebx], 48455245
:005E34D6 0F84C4000000 je 005E35A0
:005E34DC 813B524F4753 cmp dword ptr [ebx], 53474F52
:005E34E2 74F2 je 005E34D6
以INT10的入口为起点，在C00长度范围内查找字符串"EREH"和"ROGS"，如找到则判断为有DEBUG程序驻留。why?
:005E34E4 43 inc ebx
:005E34E5 48 dec eax
:005E34E6 7FE8 jg 005E34D0 <-没有找到，继续往下
:005E34E8 8D85BA040000 lea eax, dword ptr [ebp+000004BA]
:005E34EE 89442404 mov dword ptr [esp+04], eax
:005E34F2 646789260000 mov fs:[0000], esp
:005E34F8 EB10 jmp 005E350A
:005E34FA 8B642408 mov esp, dword ptr [esp+08] <-又是一个异常处理程序入口，可下断点
:005E34FE 8B6C2408 mov ebp, dword ptr [esp+08]
:005E3502 8D85DE040000 lea eax, dword ptr [ebp+000004DE]
:005E3508 50 push eax
:005E3509 C3 ret <-跳到5E351E

:005E350A 9C pushfd \
:005E350B 810C2400010000 or dword ptr [esp], 00000100 \
:005E3512 7502 jne 005E3516 >注意
:005E3514 CD20 int 20 /
:005E3516 9D popfd /
上面这几行作用是将单步执行标志TF置真，然后在执行下一句时产生单步异常，就会中断在上面异常处理程序入口，如果在这还单步走或在下面两句下断点的话，破坏了单步标志，不产生异常就GAME OVER了；
:005E3517 F8 clc
:005E3518 0F8382000000 jnb 005E35A0
:005E351E 8D85F0040000 lea eax, dword ptr [ebp+000004F0]
:005E3524 89442404 mov dword ptr [esp+04], eax
:005E3528 646789260000 mov fs:[0000], esp
:005E352E EB10 jmp 005E3540
:005E3530 8B642408 mov esp, dword ptr [esp+08]
:005E3534 8B6C2408 mov ebp, dword ptr [esp+08]
:005E3538 8D8517050000 lea eax, dword ptr [ebp+00000517]
:005E353E 50 push eax
:005E353F C3 ret

:005E3540 66B80043 mov ax, 4300 \
:005E3544 CD68 int 68 \
:005E3546 80BDC410000000 cmp byte ptr [ebp+000010C4], 00 \检测softice
:005E354D 7408 je 005E3557 /
:005E354F 66057B0C add ax, 0C7B /
:005E3553 6648 dec ax /
:005E3555 7449 je 005E35A0 <-检测到就跳
:005E3557 8D8529050000 lea eax, dword ptr [ebp+00000529]
:005E355D 89442404 mov dword ptr [esp+04], eax
:005E3561 646789260000 mov fs:[0000], esp
:005E3567 EB10 jmp 005E3579
:005E3569 8B642408 mov esp, dword ptr [esp+08]
:005E356D 8B6C2408 mov ebp, dword ptr [esp+08]
:005E3571 8D8554050000 lea eax, dword ptr [ebp+00000554]
:005E3577 50 push eax
:005E3578 C3 ret

:005E3579 F685C4100000FF test byte ptr [ebp+000010C4], FF
:005E3580 7412 je 005E3594
:005E3582 7501 jne 005E3585

:005E3585 BD4B484342 MOV EBP,4243484B \
:005E358A 6A04 PUSH BYTE +04 \
:005E358C 58 POP EAX >再次检测softice
:005E358D CC INT3 /
:005E358E 663D0400 CMP AX,04 /
:005E3592 750C jne 005E35A0 <-检测到就跳
:005E3594 64678F060000 pop word ptr fs:[0000]
:005E359A 83C404 add esp, 00000004
:005E359D 5D pop ebp
:005E359E EB16 jmp 005E35B6 <-一切正常

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005E348A(U), :005E34D6(C), :005E3518(C), :005E3555(C), :005E3592(C)
|
:005E35A0 64678F060000 pop word ptr fs:[0000]<-debugger detected，退出
:005E35A6 83C404 add esp, 00000004
:005E35A9 5D pop ebp
:005E35AA 81ED06D24000 sub ebp, 0040D206
:005E35B0 E9D8070000 jmp 005E3D8D
:005E35B5 C3 ret

:005E35B6 8BDD mov ebx, ebp <-如果没发现DEBUG程序就到这儿
:005E35B8 81ED06D24000 sub ebp, 0040D206
:005E35BE 8DBD3AE34000 lea edi, dword ptr [ebp+0040E33A]

既然没发现有异常情况，那接下来就该对原程序解码了。
0167:005E35D5 POP ECX
0167:005E35D6 MOV ESI,[EDI]
0167:005E35D8 ADD EDI,BYTE +04
0167:005E35DB LODSB
0167:005E35DC ADD AL,34
0167:005E35DE JZ NEAR 005E3B67
0167:005E35E4 LOOP 005E35D6
0167:005E35E6 MOV EBP,EBP
0167:005E35E8 OR EAX,EAX
0167:005E35EA JMP SHORT 005E35EE
0167:005E35EC INT 20
0167:005E35EE CWDE
0167:005E35EF CALL 005E376C <-注意
0167:005E35F4 BOUND ESI,[EDX+38]
0167:005E35F7 JC 005E3660
0167:005E35F9 INT3
在5E35D6到5E35E4里面转几个圈后，用F10带过5E35EF的CALL，你会发现下面的代码改变了，所以5E35EF的CALL应该又是一次利用SMC来恢复解码程序。
下面就是真正解码的过程：
:005E363D AC lodsb <-读入一个字符
:005E363E 02C1 add al, cl
:005E3640 0AC9 or cl, cl
:005E3642 D2C8 ror al, cl
:005E3644 0453 add al, 53
:005E3646 0ADB or bl, bl
…… <-计算过程
:005E3745 AA stosb
:005E3746 69D2A7E7E4D4 imul edx, D4E4E7A7
:005E374C F9 stc
:005E374D 7202 jb 005E3751 <-第一次计算后放回
:005E374F CD20 int 20
:005E3751 D1C2 rol edx, 1
:005E3753 69DB711FEE6A imul ebx, 6AEE1F71
:005E3759 03DA add ebx, edx
:005E375B 49 dec ecx
:005E375C 0F8FDBFEFFFF jg 005E363D <-循环，准备计算下一字节
:005E3762 8D85A6DA4000 lea eax, dword ptr [ebp+0040DAA6] <-EAX=5E38DF
:005E3768 FFE0 jmp eax <-第一次计算全部结束后跳

:005E38DF 93 xchg eax,ebx <-准备第二次计算
:005E38E0 61 popad
:005E38E1 56 push esi
:005E38E2 57 push edi
:005E38E3 8BFB mov edi, ebx
:005E38E5 8BF7 mov esi, edi
:005E38E7 8B9DF0E34000 mov ebx, dword ptr [ebp+0040E3F0]
:005E38ED AC lodsb <-再次读入
:005E38EE EB02 jmp 005E38F2
:005E38F0 CD20 int 20
:005E38F2 34B5 xor al, B5
:005E38F4 2C63 sub al, 63
……
:005E3916 AA stosb <-第二次计算后放回
:005E3917 49 dec ecx
:005E3918 7FD3 jg 005E38ED <-循环，准备计算下一字节
:005E391A 5F pop edi
:005E391B 5E pop esi
:005E391C 8B8F00E44000 mov ecx, dword ptr [edi+0040E400]
:005E3922 8B87FCE34000 mov eax, dword ptr [edi+0040E3FC]
:005E3928 F7C100000080 test ecx, 80000000
:005E392E 741C je 005E394C
:005E3930 81E1FFFFFF7F and ecx, 7FFFFFFF
:005E3936 0385DCE34000 add eax, dword ptr [ebp+0040E3DC]
:005E393C 50 push eax
:005E393D 51 push ecx
:005E393E E81A000000 call 005E395D <-又一次计算
:005E3943 83F8FF cmp eax, FFFFFFFF
:005E3946 0F84F3010000 je 005E3B3F
:005E394C 83C708 add edi, 00000008
:005E394F 4E dec esi <-每解码一个段，ESI减一
:005E3950 7406 je 005E3958 <-全部解码完毕后跳
:005E3952 FFA5ACD74000 jmp dword ptr [ebp+0040D7AC] <-返回上面对下一个段解码
整个过程循环3次，每次循环中对同一段代码进行3次计算解码，第一次循环是对代码段解码，解码字节由401000到523E00，而且只有这一次是只有2次计算（跳过了5E383E处的CALL），第二次循环是对524000到527000的段解码，第三次循环是对528000到52B000的段解码，这个段可是非常重要的，等跳到5E3598时你可以看一下这个段的内容，往下翻几页你就会看到诸如kernel32.dll、DeleteCriticalSection等文字，如果你对PE文件有些了解的话，你应该知道这儿是输入表，而且，很多的加壳软件都会对它进行加密，防止软件被DUMP，既然现在已经对输入表解码完毕，那接下来自然是马上对它再加密。加密代码是从5E3B0F到5E3D86，由于比较长而且也不宜说清楚，所以我就不详细写了。加密以后的结果是这样：原来在正常执行时[528xxx]中存放的应该是某个函数的入口地址，比如我机器上[5281A4]中存放的是"BFF8AF06"，它是函数"Kernel32!DeleteCriticalSection"的入口地址，而现在被加密后存放的是"850000"，而850000处的代码为：
0167:00850000 JMP NEAR [00850120]
[850120]中存放的才是"BFF8AF06"。如果我们DUMP程序的话，由于850000处的空间是程序外壳动态申请的，DUMP时不会被保存下来，[5281A4]中的内容就指向了无效的地址，运行到那时就会产生非法操作。所以我们想DUMP程序的话当然不希望它被加密，否则脱壳后还要再重建输入表，而且它在加密时在输入表里加入了很多的垃圾，用implist根本不能工作，用Import REConstructor恐怕也得有不少的手工工作要做。既然如此，那索性跳过这一段加密代码，让它不加密不就可以了吗（注1）？那在哪跳呢？上面我们说了，加密代码是从5E3B0F开始的，从那往上找，一看就是：
:005E3AFF 8BB5CCE34000 mov esi, dword ptr [ebp+0040E3CC]
:005E3B05 85F6 test esi, esi
:005E3B07 0F84BF020000 je 005E3DCC
:005E3B0D 03F2 add esi, edx
不有个跳转，跳到5E3DCC，刚好跳过了加密代码（事实上当加密完成时是从5E3B1F跳到5E3DCC），既然如此那就改变一下流程，直接跳到5E3DCC。接下来程序又干了些什么呢？你可以用Exescope试着打开原文件，打开后看里面的RC数据，有一些能看到内容，而另外一些则提示无法识别结构，可能被压缩。而我们根据前面解码的地址知道已经解码的段里并不包括.rsrc段，所以接下来还要干什么基本就可以猜到了，应该是对.rsrc段中被加密部分解码。从5E3DCC往下走几步后你就会看到这行代码：
:005E3DFF E859FBFFFF call 005E395D
是不是很眼熟？对，上面的解码部分中第三次解码也是用的同一个CALL，如果你跟进去的话你会找到它解码的起始地址是5418CC，刚好在.rsrc段中。
好了，经过上面的CALL后，外壳对于程序的解码就全部完成了。解码完成后又该干什么呢？既然程序完全解码了，它当然不希望你把它DUMP出来，接下来就是防DUMP，程序并不复杂，但很有效，它会让Procdump在DUMP时产生非法操作而关闭，这是如何实现的呢？请看：
先是准备工作，防DUMP一般是对文件头进行破坏，而文件头一般是写保护的，那它是破坏的呢？它连续调用了3个函数，分别是：
0167:005E3E2C call getcurrentprocessID <-检取当前调用进程的标示符
……
0167:005E3E55 call openprocess <-返回一个以存在的过程对象的句柄
……
0167:005E3E8B call VirtualProtectEx <-修改调用线程虚拟地址空间中被提交的页的访问保护权限
通过连续调用这三个函数，就去掉了当前进程文件头的写保护。如果你很感兴趣，你还可以仔细看一下，在每个函数调用之前还有一个CALL，它其实是JMP的变形，你再仔细看一下的话，你会发现它其实是一个很精巧的设计，除了做为JMP的变形，可以迷惑人以外，还有一个用处哦。8-)
既然文件头已经可写了，接下来就是破坏：
0167:005E3EAF MOV EDI,[EBP+0040E3DC] <-取程序基址（400000）
0167:005E3EB5 ADD EDI,[EDI+3C] <-取程序头地址（400100）
0167:005E3EB8 OR WORD [EDI+06],BYTE -01 <-将程序头偏移06处改为FFFF，那儿原来放的是什么东西呢？了解文件头的朋友应该知道那放的是文件有几个段。天啊！什么怪物会有65535个段！怪不得Procdump会 被搞死掉。马上去掉这句。现在再dump就安全了。
好了，外壳的任务基本完成了，再接下来该干什么呢？应该去执行程序了。且慢，还有一项工作没干，作案完毕后该破坏现场，毁灭罪证，请看：
0167:005E3EBD MOV EBX,[EBP+0040E3F8]
0167:005E3EC3 NOT EBX
0167:005E3EC5 ADD EBX,[EBP+0040E3DC]
0167:005E3ECB MOV [ESP-04],EBX <-此时EBX=509EAB，入口地址？
0167:005E3ECF LEA EDI,[EBP+0040E2D6]
0167:005E3ED5 XOR EAX,EAX
0167:005E3ED7 MOV ECX,020B
0167:005E3EDC REP STOSB <-这段是将5E4110~5E431B清零

0167:005E3EDE LEA EDI,[EBP+0040D1C6]
0167:005E3EE4 MOV ECX,0EEB
0167:005E3EE9 REP STOSB
0167:005E3EEB STOSB <-这段是将从5E3000到这句的所有外壳代码清零。

0167:005E3EEC LEA EDI,[EBP+0040D1C6]
0167:005E3EF2 MOV BYTE [EDI],E9
0167:005E3EF5 INC EDI
0167:005E3EF6 SUB EBX,EDI
0167:005E3EF8 SUB EBX,BYTE +04
0167:005E3EFB MOV [EDI],EBX <-这是将5E3000处代码改为JMP 00509EAB，why?

0167:005E3EFD LEA EDI,[EBP+0040E0B1]
0167:005E3F03 MOV ECX,1F
0167:005E3F08 REP STOSB
0167:005E3F0A STOSB <-再将这段与上面一段清零。

0167:005E3F0B JMP SHORT 005E3F0F
0167:005E3F0D INT 20
0167:005E3F0F POPA
0167:005E3F10 JMP NEAR [ESP-24] <-跳到509EAB处，应该就是程序入口吧。
现在你可以用Procdump来dump了，不过你会发现，dump出的程序即使能反汇编，得到的也是乱七八糟的东西，原来从509EAB到522541这一段代码还会对程序做解码工作，所以你可以一直运行到522541，然后等跳到509E35处时再开始dump，此时得到的程序就完全暴露在你眼前，你想对她做什么都可以了（xixi.不要想坏主意哦）如果你在这之前跳过了对输入表加密的那一段的话，dump出的程序连输入表都无须修复，这样的dump是不是很完美？（缺点就是这次的运行得以非法操作告终8-(）
当然必要的修复总是要的，你得将入口偏移改为109E35，输入表偏移改为128000，然后就可以运行了。
最后还有一个小问题，就是每次运行它都会在当前目录下生成一个stockstorm.EXE，而且会不给你任何警告就重启。太可恶了！难道想通过不断的重启来搞垮我的电脑吗？干掉它！用W32DASM反汇编，查找EXITWINDOWS，共找到3个，其中一个是这儿：
* Reference To: user32.ExitWindowsEx, Ord:0000h
:005097FA E875D5EFFF Call 00406D74 <-罪魁祸首就是它

由此往上看有：
* Reference To: kernel32.CopyFileA, Ord:0000h
:00509786 E889CEEFFF Call 00406614
:0050978B 8D55EC lea edx, dword ptr [ebp-14]
:0050978E A1606C5200 mov eax, dword ptr [00526C60]
……

拷贝文件？好象我们找到地方了。怎样才能避过这些呢？再往上找有：
:00509731 648920 mov dword ptr fs:[eax], esp
:00509734 84C9 test cl, cl
:00509736 0F84D3000000 je 0050980F <-这个
:0050973C 6A00 push 00000000
将上面这个je改为jmp再运行，一切OK！
别急，一般运行已经没问题了，不过它还会对一些程序过敏，比如filemon、softice等，如果内存中刚好有filemon在运行的话同样也会导致重启，
* Reference To: kernel32.CreateFileA, Ord:0000h
|
:004A2FA8 E87F36F6FF Call 0040662C <-利用CreateFileA打开文件
:004A2FAD 83F8FF cmp eax, FFFFFFFF
:004A2FB0 744D je 004A2FFF <-打开不成功则跳
:004A2FB2 50 push eax
…………
* Reference To: user32.ExitWindowsEx, Ord:0000h
|
:004A2FE2 E88D3DF6FF Call 00406D74
:004A2FE7 EB16 jmp 004A2FFF
程序试图打开的文件包括TRW、TRW2000、SOFTICE、SOFTICE FOR NT、FILEMON、REGMON、WKPE，打开成功则重启，对付的方法是将上面的je改为jmp就可以了。
这样改应该不犯法吧？我只是让它在我的电脑上跑得更顺畅。脱壳后程序的启动时间比原先大约减少了一半，
脱壳前后的程序如果都进行压缩的话，脱壳后的程序体积大约也减小了一半。还有由于外壳的原因，原来的程序在NT下据说无法正常进入，这样改动后应该可以了吧(没有验证)。减小体积、加快启动，改进兼容性，这算不算对原程序的优化？
注1：事实上这样做是有问题的，正常程序的输入表在程序被载入时由系统根据函数名进行初始化，在不同的系统下会初始化为不同的入口值，以便跨平台运行，现在程序被加壳，载入时真正的输入表并没有被初始化，这个工作得由外壳程序来完成，所以外壳对输入表的加密同时也是初始化，如果我们跳过加密代码的话，输入表没有被初始化，下面运行时会非法操作，不过这对于我们脱壳没有影响。
感谢：在脱壳过程中得到了Ljttt等的帮助，没有他们的指点，我也写不出这篇文章，所以在此表示感谢。

hying[CCG]
2001年5月28日


vfp&exe v1.85

 标 题:破解vfp&exe v1.85 demo加密文件的简单方法 (498字)
发信人:lpyxt
时 间:2001-9-7 18:39:58
详细信息:
vfp&exe v1.85 demo 又一简单破解法
1、运行加密的VFP文件，最小化该进程
2、运行filemon.exe找出VFP最小化进程文件名（在一些特殊目录中）
（或者开始就运行trw2000调入加密后的vfp文件，BPX 401760后F5，
中间横线上出现新的进程名后记下该文件名，退出trw2000和vfp加密文件）
3、重新运行vfp加密文件，最小化后用win98下的查找文件找到先记下的那一
文件后，按右键将该文件复制出来的文件即是去壳后的文件
4、改入口点为401760
5、删除第二次找到的FEF2后的所有字节，存盘后的文件即是可用unfoxall反编译的文件了


vfp&exe加密程序

 标 题:vfp&exe加密程序破解实录 (1千字)
发信人:lpyxt
时 间:2001-8-17 12:31:58
详细信息:
vfp&exe加密程序破解实录
vfp&exe.exe v1.8.5演示版
用vfp6编译一应用程序myvfp.exe
运行vfp&exe对myvfp.exe进行加密
运行加密后的myvfp.exe
出现输入密码窗口(如加密时选择了密码项)和一个演示版的提示窗口
去除vfp&exe加的壳：
用trw2000调入加密后的myvfp.exe
下断点bpx 401760(vfp6编译的文件入口处)
f5几次
出现输入密码窗口时输入密码
当出现演示版提示窗口时按确定，再按f5键
A！记下trw2000横线上的当前文件名
suspend 回到windows
运行ollydbg
选file菜单下的attach子菜单
在弹出的窗口中选A！处记下的文件名后击attach钮
右击左上方窗口
选go to -->address输入401760击ok钮
右击弹出的窗口
选copy to exxcutable file
右击弹出的窗口
选backup-->save data to file
选一个存放文件的路径和文件名(unmyvfp.exe)
击打开钮
运行prodump.exe
选 菜单编辑pe文件
将文件unmyvfp.exe的入口地址由48e8改为1760后存盘退出

(或者
运行winhex改文件入口偏移
调入unmyvfp.exe
取地址3CH处的值，为B8H,计算B8H+28H=E0H
改E0H处的E848H为6017------程序入口处)

运行winhex
寻找00FEF2
删除第二次找到的地方的FF处开始到文件结束的所有数据后存盘退出
用unfoxall对unmyvfp.exe就可进行反编译了！！！

此法完全用于学习，不得用于非法用途！

好了搞定这个东西耗费了我两天的时间,眼睛受不了了.....

lpyxt 写于2001年8月16日17时20分
email:liupeiyuxt@km169.net

标 题:这样做的意义不大，跟手工找到自身还原的程序无异，请看其局限性。 (1千字)
发信人:Aming[品琳居]
时 间:2001-8-17 20:00:21
详细信息:

首先，我们来看看vfp&exe对VFP文件的加密：
1、将VFP的EXE文件看做一个普通的PE文件看待，在加密后程序运行后自身解密，然后SHELL这个文件，通常保存在WINDOWS一些特殊的目录里面，如垃圾桶、INF等。
2、为防止别人拷贝这个文件，在运行这个文件的时候，对文件的存取做了限制；
3、为防止通过FILEMON查看到自身还原的程序藏身之处后将文件拷贝，
会自动终止WINDOWS自带“查找”；
4、加有反unvfp&exe的代码“☆ 文件型...终结者”、UNVFP&EXE...当发现前者自动弹出输入密码的窗口后停滞不前；发现后者则以“文件不能锁定”自动退出。
5、针对APP文件的结构作了一些小动作，将文件列表的标识符放到错误的位置，UNFOXALL不能正确识别；
6、随机加入垃圾信息，使得文件在文件列表的偏移发生变化，UNFOXALL不能正确识别；
7、加入一个APP文件，使主APP文件入口及调用产生偏移，UNFOXALL不能正确识别。
LPYXT朋友的方法只是做到了两样：
A、利用OLLYDBG找到自身还原的程序；
B、去掉使主APP文件入口及调用产生偏移的APP信息。
这种方法的局限性很大，从理论上使得对付很多文件都不可行。
其实想找到自身还原的程序并不需要TRW2000、OLLYDBG等，您只要
用一个FILEMON记下加密程序自身还原后的存放位置，狠心关机，把它拷贝出来就是了。

LPYXT朋友，你不妨用您的方法试一下：
http://www.javasoft.com.cn
上面的Foxmis。

== 欢迎光临品琳居 ==
永远的朋友：Aming


幻影v1.5b3脱壳分析笔记 --- ljttt开门一帖 【声明】 我写文章以交流为主，希望大家在转载时能保持文章的完整性。 [作者]: ljttt [日期]: 2000-09-15 【前言】 首先，我要这儿多谢wind[CCG]。 其中为了补充了一些说明，为了大家好理解。用 [注：]说明。我想根据其中的内容去写个脱壳机也不难。 这里有当初我分析幻影的两篇类似的分析笔记，当初为了分析方便，做了两份，各有一些说明（<--所指的内容）。互有补充。大家看看 [注：由于这是以前分析的笔记，只是为了自己分析方便，没有想到要做为文章，所以现在补充一些内容，让大家好理解] [注：开始幻影用了大量的XOR还原方法，共有223处，而且，还在其中用到对IDT表的修改，所以动态分析不太可能，静态分析也要用编个程序批处理才能得到这些内容] [注：这是我现在找的一段，和以前分析的地址不对应，但我只为了说明问题，这样的代码段大同小异，其中的说明也是我补充的] 0000003A: FA cli 0000003B: 56 push esi 0000003C: BE53BD4000 mov esi,0040BD53 00000041: 03F5 add esi,ebp 00000043: 0F010E sidt dword ptr [esi] <--取IDTR的内容 00000046: 8B7602 mov esi,dword ptr [esi+02] <--获取IDT表的基地址 00000049: 66FF4E08 dec word ptr [esi+08] <--int 1的低位偏移减一，大家应该知道这是干嘛的。 0000004D: FF8DCFB24000 dec dword ptr [ebp+0040B2CF] <--注意，这里修改了以后要XOR还原的一处内容，所以算个小干扰 00000053: 5E pop esi 00000054: B927000000 mov ecx,00000027 <--还原开始 00000059: 3006 xor byte ptr [esi],al <--al为XOR用的字节 0000005B: 46 inc esi 0000005C: 49 dec ecx 0000005D: 75FA jnz 00000059 <--还原结束 0000005F: FEC8 dec al <--变换，下一次用作XOR还原 00000061: FA cli [注：在经过以上的XOR还原后，来到这里，将XOR还原出所有幻影的代码了，以前我给大家说明的一些内容都可以在这里找到] 00412382: E800000000 call 00412387 00412387: 5D pop ebp 00412388: 8BD5 mov edx,ebp 0041238A: 81EDD4A64000 sub ebp,0040A6D4 <--EBP=412388-40A6D4=7CB4 00412390: FA cli 00412391: 58 pop eax 00412392: 80E401 and ah,01 00412395: 32C0 xor al,al 00412397: BE09A74000 mov esi,0040A709 0041239C: 03F5 add esi,ebp <--ESI=7CB4+40A709=4123BD 0041239E: B946160000 mov ecx,00001646 004123A3: 03F1 add esi,ecx 004123A5: 4E dec esi 004123A6: 8A06 mov al,byte ptr [esi] 004123A8: 324601 xor al,byte ptr [esi+01] 004123AB: 8806 mov byte ptr [esi],al 004123AD: 4E dec esi 004123AE: E2F6 loop 004123A6 <--代码还原 004123B0: FA cli 004123B1: 6681BD09A740009090 cmp word ptr [ebp+0040A709],9090 <--还原成功，则继续 004123BA: 75FE jnz 004123BA 004123BC: 90 nop 004123BD: 90 nop 004123BE: 90 nop [注：这是最后XOR还原得到的代码了,内容太多，我懒得加注释了，自己接和我以前的有关幻影的文章看吧] 004123BF: 2B95CBB24000 sub edx,dword ptr [ebp+0040B2CB] 004123C5: 81EA87530000 sub edx,00005387 004123CB: 8995D3B24000 mov dword ptr [ebp+0040B2D3],edx 004123D1: E8D7120000 call 004136AD <--加载DLL 004123D6: 83F800 cmp eax,00000000 004123D9: 7520 jnz 004123FB 004123DB: B8C0B94000 mov eax,0040B9C0 004123E0: 03C5 add eax,ebp 004123E2: BBC2B94000 mov ebx,0040B9C2 004123E7: 03DD add ebx,ebp 004123E9: 6A30 push 00000030 004123EB: 50 push eax 004123EC: 53 push ebx 004123ED: 6A00 push 00000000 004123EF: FF9500BC4000 call dword ptr [ebp+0040BC00] <--失败，显示dial.dll未找到 004123F5: FF956CBF4000 call dword ptr [ebp+0040BF6C] <--退出 004123FB: 8B8DF2B94000 mov ecx,dword ptr [ebp+0040B9F2] 00412401: 83C120 add ecx,00000020 00412404: 51 push ecx 00412405: 6A40 push 00000040 00412407: 6800201000 push 00102000 0041240C: 51 push ecx 0041240D: 6A00 push 00000000 0041240F: FF95CBBB4000 call dword ptr [ebp+0040BBCB] 00412415: 59 pop ecx 00412416: 6A40 push 00000040 00412418: 6800101000 push 00101000 0041241D: 51 push ecx 0041241E: 50 push eax 0041241F: FF95CBBB4000 call dword ptr [ebp+0040BBCB] <--申请内存 00412425: 8BD0 mov edx,eax 00412427: 8BF8 mov edi,eax 00412429: BE4D534000 mov esi,0040534D 0041242E: 03F5 add esi,ebp 00412430: 8B8DF2B94000 mov ecx,dword ptr [ebp+0040B9F2] 00412436: F3A4 repe movsb es:[edi],ds:[esi] <--搬家 00412438: B893A74000 mov eax,0040A793 0041243D: 2D4D534000 sub eax,0040534D 00412442: 03C2 add eax,edx 00412444: 50 push eax 00412445: C3 ret <--到新地址继续 -----------------------以上一段分析完毕，加载DLL，申请内存并复制代码继续执行------------------------ 00412446: BF4D534000 mov edi,0040534D 0041244B: 03FD add edi,ebp 0041244D: 8B8DF2B94000 mov ecx,dword ptr [ebp+0040B9F2] 00412453: 32C0 xor al,al 00412455: F3AA repe stosb es:[edi],al <--灭迹 00412457: E800000000 call 0041245C 0041245C: 5D pop ebp 0041245D: 81EDA9A74000 sub ebp,0040A7A9 <--EBP=41245C-40A7A9=7CB3 00412463: BEDDA74000 mov esi,0040A7DD 00412468: 03F5 add esi,ebp 0041246A: 6A00 push 00000000 0041246C: 6A00 push 00000000 0041246E: 6A00 push 00000000 00412470: 6A00 push 00000000 00412472: 6A00 push 00000000 00412474: 6A00 push 00000000 00412476: 56 push esi 00412477: FF95A3BB4000 call dword ptr [ebp+0040BBA3] <--检查跟踪 0041247D: 83F8FF cmp eax,FFFFFFFF 00412480: 7568 jnz 004124EA 00412482: 46 inc esi 00412483: 803E00 cmp byte ptr [esi],00 00412486: 75FA jnz 00412482 00412488: 46 inc esi 00412489: 803E00 cmp byte ptr [esi],00 0041248C: 75DC jnz 0041246A 0041248E: EB5A jmp 004124EA ---------------------以上一段代码分析完毕，检查跟踪-------------------------- **********************非代码区************************** 00412490: 5C pop esp 00412491: 5C pop esp 00412492: 2E5C pop esp 00412494: 54 push esp 00412495: 52 push edx 00412496: 57 push edi 00412497: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 0041249B: 5C pop esp 0041249C: 54 push esp 0041249D: 52 push edx 0041249E: 57 push edi 0041249F: 3230 xor dh,byte ptr [eax] 004124A1: 3030 xor byte ptr [eax],dh 004124A3: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 004124A7: 5C pop esp 004124A8: 54 push esp 004124A9: 52 push edx 004124AA: 57 push edi 004124AB: 44 inc esp 004124AC: 45 inc ebp 004124AD: 42 inc edx 004124AE: 55 push ebp 004124AF: 47 inc edi 004124B0: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 004124B4: 5C pop esp 004124B5: 52 push edx 004124B6: 45 inc ebp 004124B7: 47 inc edi 004124B8: 56 push esi 004124B9: 58 pop eax 004124BA: 44 inc esp 004124BB: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 004124BF: 5C pop esp 004124C0: 4E dec esi 004124C1: 54 push esp 004124C2: 49 dec ecx 004124C3: 43 inc ebx 004124C4: 45 inc ebp 004124C5: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 004124C9: 5C pop esp 004124CA: 53 push ebx 004124CB: 49 dec ecx 004124CC: 43 inc ebx 004124CD: 45 inc ebp 004124CE: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 004124D2: 5C pop esp 004124D3: 56 push esi 004124D4: 4B dec ebx 004124D5: 45 inc ebp 004124D6: 59 pop ecx 004124D7: 50 push eax 004124D8: 52 push edx 004124D9: 4F dec edi 004124DA: 44 inc esp 004124DB: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 004124DF: 5C pop esp 004124E0: 46 inc esi 004124E1: 49 dec ecx 004124E2: 4C dec esp 004124E3: 45 inc ebp 004124E4: 56 push esi 004124E5: 58 pop eax 004124E6: 44 inc esp 004124E7: 000000 add byte ptr [eax],al *****************************非代码区结束****************************** 004124EA: 83F8FF cmp eax,FFFFFFFF 004124ED: 7406 jz 004124F5 004124EF: FF956CBF4000 call dword ptr [ebp+0040BF6C] <--有跟踪则退出 004124F5: 60 pushad <--反跟踪 004124F6: BE53BD4000 mov esi,0040BD53 004124FB: 03F5 add esi,ebp 004124FD: 0F010E sidt dword ptr [esi] 00412500: 8B7602 mov esi,dword ptr [esi+02] 00412503: 668B4608 mov ax,word ptr [esi+08] 00412507: 66052302 add ax,0223 0041250B: 66894608 mov word ptr [esi+08],ax 0041250F: 668B460E mov ax,word ptr [esi+0E] 00412513: 668B5E06 mov bx,word ptr [esi+06] 00412517: 663BC3 cmp ax,bx 0041251A: 740E jz 0041252A 0041251C: 668B4608 mov ax,word ptr [esi+08] 00412520: 668B5E18 mov bx,word ptr [esi+18] 00412524: FA cli 00412525: 663BC3 cmp ax,bx 00412528: 7400 jz 0041252A 0041252A: 668B4608 mov ax,word ptr [esi+08] 0041252E: 668B5E0E mov bx,word ptr [esi+0E] 00412532: 66898567BE4000 mov word ptr [ebp+0040BE67],ax 00412539: 66899D69BE4000 mov word ptr [ebp+0040BE69],bx 00412540: 668B4618 mov ax,word ptr [esi+18] 00412544: 668B5E1E mov bx,word ptr [esi+1E] 00412548: 6689856BBE4000 mov word ptr [ebp+0040BE6B],ax 0041254F: 66899D6DBE4000 mov word ptr [ebp+0040BE6D],bx <--对IDT的处理，反跟踪 00412556: 89AD65BD4000 mov dword ptr [ebp+0040BD65],ebp 0041255C: 8B85C7BB4000 mov eax,dword ptr [ebp+0040BBC7] 00412562: 89856FBE4000 mov dword ptr [ebp+0040BE6F],eax 00412568: E8A9140000 call 00413A16 <--内有反跟踪的代码，进入中断处理程序 0041256D: BB63BD4000 mov ebx,0040BD63 00412572: 03DD add ebx,ebp 00412574: 53 push ebx 00412575: 6A64 push 00000064 00412577: 6A63 push 00000063 00412579: 6A00 push 00000000 0041257B: FF9508BC4000 call dword ptr [ebp+0040BC08] <--SetTimer 00412581: 61 popad 00412582: 6A00 push 00000000 00412584: FF95C3BB4000 call dword ptr [ebp+0040BBC3] <--GetModuleHandle 0041258A: 89855FBD4000 mov dword ptr [ebp+0040BD5F],eax <--413A12 00412590: 80BDC8B2400001 cmp byte ptr [ebp+0040B2C8],01 <--412F7B [ebp+0040B2C8]是一个标志，可能是用来标识是否被注册版幻影加密的 00412597: 7435 jz 004125CE 00412599: BEE1B94000 mov esi,0040B9E1 0041259E: 03F5 add esi,ebp <--413694 004125A0: 56 push esi 004125A1: FF959FBB4000 call dword ptr [ebp+0040BB9F] <--GetSystemTime 004125A7: 668B85EFB94000 mov ax,word ptr [ebp+0040B9EF] <--取毫秒时间 004125AE: 240F and al,0F 004125B0: 3C02 cmp al,02 004125B2: 731A jnb 004125CE <--结果随机，用来随机显示未注册版加密。 004125B4: B8BEB94000 mov eax,0040B9BE 004125B9: 03C5 add eax,ebp <-- 004125BB: BB11B24000 mov ebx,0040B211 004125C0: 03DD add ebx,ebp <--412EC4 **************************************************************** 本软件由 幻影v1.5 未注册版本加密 This program protected by DBPE v1.5 Unregistered version Homepage: http://fsdb.yeah.net E-mail: D.Boy@126.com ***************************************************************** 004125C2: 6A30 push 00000030 004125C4: 50 push eax 004125C5: 53 push ebx 004125C6: 6A00 push 00000000 004125C8: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA ---------------------以上一段代码分析完毕，处理反跟踪和是否被注册版幻影加密，否则将随机显示NAG窗------------- 004125CE: E862060000 call 00412C35 <--查询注册键，是否有注册信息 004125D3: 663D0100 cmp ax,0001 <--是否找到 004125D7: 7416 jz 004125EF <--找到，跳转，没有则表示第一次使用，在注册表中留下足迹 004125D9: BE60B14000 mov esi,0040B160 004125DE: 03F5 add esi,ebp <--ESI指向还原后的注册信息首地址 004125E0: 668B8589B44000 mov ax,word ptr [ebp+0040B489] <--41313C 0x60 004125E7: 668906 mov word ptr [esi],ax <--保存 004125EA: E802070000 call 00412CF1 <--创建注册键 004125EF: E87C030000 call 00412970 <--获取卷信息并且跟据注册表信息来检测软件是否已经注册 004125F4: 6689857DB44000 mov word ptr [ebp+0040B47D],ax <--40B47D卷信息标志 [ebp+0040B47D]从此开始保存了软件是否已经注册的信息。（此注册是指软件注册，而非标识幻影注册版加密） 004125FB: 663D0100 cmp ax,0001 004125FF: 0F84BF000000 jz 004126C4 <--已注册，就跳转到还原Section处 --------------------以上一段代码分析完毕，判断是否软件已经注册------------ 00412605: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 <--413410 [ebp+0040B75D]是一个标志，代码中有多处判断。但没有对其赋值的代码，只从EXE中得到。作用目前还不太清楚 0041260C: 7426 jz 00412634 <--为0，则跳走。到显示StartMessage处。 0041260E: 83BD61B7400001 cmp dword ptr [ebp+0040B761],00000001 <--413414 [ebp+0040B761]是一个标志，作用不清楚。目前没有发现赋值代码。可能是用来表示是否有Register Cub吧 00412615: 751D jnz 00412634 <--不为1，就跳转到显示StartMessage处。 00412617: E80A060000 call 00412C26 <--显示软件加的NAG信息,Register Cub ************************************* 欢迎你使用幻影 1.5 beta2， 幻影v1.5是共享软件，如果你喜欢它，希望你注册。 E-mail : ding-boy@netease.com Homepage : http://fsdb.yeah.net ************************************** 0041261C: 6689857FB44000 mov word ptr [ebp+0040B47F],ax <-413132,显示过NAG了 [ebp+0040B47F]看来从此作为一个标志了。作用不太清楚。ax返回的是按的是Try还是Register按钮。 00412623: BBC9B24000 mov ebx,0040B2C9 00412628: 03DD add ebx,ebp <--412F7C,要显示的内容，如果为"||"则表示不显示。 0041262A: 663D0200 cmp ax,0002 <--2，好象表示选择了Register按钮，则跳转到进入注册处 0041262E: 0F8444010000 jz 00412778 00412634: 6681BDF1B440007C7C cmp word ptr [ebp+0040B4F1],7C7C <--4131A4，判断是否有StartMessage显示 ***************** 欢迎 ^_^ ******************** 0041263D: 741A jz 00412659 <--没有则跳走，进入密码输入判断处 0041263F: B8BEB94000 mov eax,0040B9BE 00412644: 03C5 add eax,ebp 00412646: BBF1B44000 mov ebx,0040B4F1 0041264B: 03DD add ebx,ebp <--4131A4 ***************** 欢迎 ^_^ ******************** 0041264D: 6A30 push 00000030 0041264F: 50 push eax 00412650: 53 push ebx 00412651: 6A00 push 00000000 00412653: FF9500BC4000 call dword ptr [ebp+0040BC00] <---显示NAG窗口,Start Message ------------------以上一段代码分析未完，有几处标志作用不太清楚。------------------------------- 00412659: E8A0020000 call 004128FE <---输入密码并检测,Password很好得到，还原后的代码中有。 0041265E: BB91B84000 mov ebx,0040B891 00412663: 03DD add ebx,ebp <---413544 ******************** Invalid PassWord ****************** 00412665: 663D0000 cmp ax,0000 00412669: 0F8409010000 jz 00412778 <--密码错，跳走到注册处。 0041266F: E882010000 call 004127F6 <--检查是否过期 00412674: BB1DB64000 mov ebx,0040B61D 00412679: 03DD add ebx,ebp <--4132D0 *************************** 试用期已过。 *************************** 0041267B: 663D0000 cmp ax,0000 0041267F: 0F84F3000000 jz 00412778 <--过期，则跳走到注册处 00412685: E8C3010000 call 0041284D <--在注册表中查找注册信息，没有则创建注册信息。 0041268A: BB1DB64000 mov ebx,0040B61D <--4132D0 0041268F: 03DD add ebx,ebp *************************** 试用期已过。 *************************** 00412691: 663D0000 cmp ax,0000 00412695: 0F84DD000000 jz 00412778 <--未创建成功，则跳转到注册处 0041269B: 6683BD7DB4400000 cmp word ptr [ebp+0040B47D],0000 <--40B47D标志,是否已经成为正版用户 004126A3: 751F jnz 004126C4 <--标志有效则跳转到还原Section处 004126A5: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 <--413410 004126AC: 7416 jz 004126C4 004126AE: 6683BD7FB4400001 cmp word ptr [ebp+0040B47F],0001 <-413132,1表示按的是Try按钮 004126B6: 740C jz 004126C4 <-是，则到还原Section处 004126B8: BBC9B24000 mov ebx,0040B2C9 004126BD: 03DD add ebx,ebp <--412F7C,显示信息如果为"||"则不显示 004126BF: E9B4000000 jmp 00412778 <--到注册处 -----------------------------以上代码分析未完，还是几个标志作用不太清楚------------------ ---------------------还原各Section-------------- 004126C4: BED7B24000 mov esi,0040B2D7 004126C9: 03F5 add esi,ebp <--412F8A 004126CB: 833E00 cmp dword ptr [esi],00000000 004126CE: 746F jz 0041273F 004126D0: 8B9DD3B24000 mov ebx,dword ptr [ebp+0040B2D3] <--412F86 004126D6: 031E add ebx,dword ptr [esi] 004126D8: 8B4E04 mov ecx,dword ptr [esi+04] 004126DB: 83F900 cmp ecx,00000000 004126DE: 7505 jnz 004126E5 004126E0: 83C608 add esi,00000008 004126E3: EBE6 jmp 004126CB 004126E5: D1E9 shr ecx,1 004126E7: 668B8567B44000 mov ax,word ptr [ebp+0040B467] <--41311A, 82EE 004126EE: 66F7D0 not ax 004126F1: 663103 xor word ptr [ebx],ax 004126F4: 6648 dec ax 004126F6: 66813B3F3F cmp word ptr [ebx],3F3F 004126FB: 7518 jnz 00412715 004126FD: 817BFC44425045 cmp dword ptr [ebx-04],45504244 00412704: 750F jnz 00412715 00412706: 6683BD7DB4400001 cmp word ptr [ebp+0040B47D],0001 <--40B47D卷信息标志 0041270E: 7505 jnz 00412715 00412710: 66C7032B2B mov word ptr [ebx],2B2B 00412715: 66817BFF3F3F cmp word ptr [ebx-01],3F3F 0041271B: 7519 jnz 00412736 0041271D: 817BFB44425045 cmp dword ptr [ebx-05],45504244 00412724: 7510 jnz 00412736 00412726: 6683BD7DB4400001 cmp word ptr [ebp+0040B47D],0001 <--40B47D卷信息标志 0041272E: 7506 jnz 00412736 00412730: 66C743FF2B2B mov word ptr [ebx-01],2B2B 00412736: 43 inc ebx 00412737: 43 inc ebx 00412738: E2B7 loop 004126F1 0041273A: 83C608 add esi,00000008 0041273D: EB8C jmp 004126CB -------------以上一段为还原各Section，------------------------------- 0041273F: 90 nop 00412740: 89AD9FBE4000 mov dword ptr [ebp+0040BE9F],ebp 00412746: E84C030000 call 00412A97 <--作用不清 0041274B: E82D040000 call 00412B7D <--作用不清 00412750: 8B85CFB24000 mov eax,dword ptr [ebp+0040B2CF] <--412F82 00412756: 8B9DD3B24000 mov ebx,dword ptr [ebp+0040B2D3] <--412F86 0041275C: 03C3 add eax,ebx 0041275E: 8985F6B94000 mov dword ptr [ebp+0040B9F6],eax 00412764: 8BC5 mov eax,ebp 00412766: 5B pop ebx 00412767: 59 pop ecx 00412768: 5A pop edx 00412769: 5E pop esi 0041276A: 5F pop edi 0041276B: 5D pop ebp 0041276C: 9D popfd 0041276D: FFB0F6B94000 push dword ptr [eax+0040B9F6] 00412773: E90F120000 jmp 00413987 <--跳转到最后的代码处 -------未注册时跳到此处---------------- 00412778: 66813B7C7C cmp word ptr [ebx],7C7C 0041277D: 7413 jz 00412792 <--是否有信息显示，没有则跳走 0041277F: B8C0B94000 mov eax,0040B9C0 00412784: 03C5 add eax,ebp <--413673 一个空格 00412786: 6A30 push 00000030 00412788: 50 push eax 00412789: 53 push ebx 0041278A: 6A00 push 00000000 0041278C: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA 00412792: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 <--413410 00412799: 7446 jz 004127E1 0041279B: E810010000 call 004128B0 <--输入Serial,Your Name并进行判断结果 004127A0: 6689857DB44000 mov word ptr [ebp+0040B47D],ax <--40B47D卷信息标志 004127A7: 50 push eax 004127A8: 663D0100 cmp ax,0001 004127AC: 7507 jnz 004127B5 <--不等，注册失败，跳转 004127AE: BBF5B84000 mov ebx,0040B8F5 <--4135A8,注册成功了 ****************************************** Register Successfully ****************************************** 004127B3: EB05 jmp 004127BA 004127B5: BB59B94000 mov ebx,0040B959 004127BA: 03DD add ebx,ebp <--41360C ************************** Invalid Serial NO ************************** 004127BC: 66813B7C7C cmp word ptr [ebx],7C7C <--是否为没有内容显示的标志 004127C1: 7413 jz 004127D6 <--是，则跳转 004127C3: B8C0B94000 mov eax,0040B9C0 004127C8: 03C5 add eax,ebp <--413673 一个空格 004127CA: 6A30 push 00000030 004127CC: 50 push eax 004127CD: 53 push ebx 004127CE: 6A00 push 00000000 004127D0: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA 004127D6: 58 pop eax 004127D7: 663D0100 cmp ax,0001 004127DB: 0F84E3FEFFFF jz 004126C4 <--注册成功，就回去继续工作 004127E1: C6855DBD400000 mov byte ptr [ebp+0040BD5D],00 004127E8: 8BC5 mov eax,ebp 004127EA: 5B pop ebx 004127EB: 59 pop ecx 004127EC: 5A pop edx 004127ED: 5E pop esi 004127EE: 5F pop edi 004127EF: 5D pop ebp 004127F0: 9D popfd 004127F1: E991110000 jmp 00413987 <--从这里跳走，怕是凶多吉少 *************************主程序结束**************************************************** -----------------------------------检查是否过期------------------------ 004127F6: BEE1B94000 mov esi,0040B9E1 004127FB: 03F5 add esi,ebp <--413694 004127FD: 56 push esi 004127FE: FF959FBB4000 call dword ptr [ebp+0040BB9F] <--GetSystemTime 00412804: 668B8585B44000 mov ax,word ptr [ebp+0040B485] <--413138 0041280B: 668B9D81B44000 mov bx,word ptr [ebp+0040B481] <--413134 00412812: 663D0000 cmp ax,0000 00412816: 7430 jz 00412848 00412818: 663985E3B94000 cmp word ptr [ebp+0040B9E3],ax 0041281F: 7209 jb 0041282A 00412821: 66399DE1B94000 cmp word ptr [ebp+0040B9E1],bx 00412828: 7309 jnb 00412833 0041282A: 66399DE1B94000 cmp word ptr [ebp+0040B9E1],bx 00412831: 7606 jbe 00412839 00412833: 66B80000 mov ax,0000 00412837: EB0D jmp 00412846 00412839: 66C7857DB440000100 mov word ptr [ebp+0040B47D],0001 <--40B47D卷信息标志 00412842: 66B80100 mov ax,0001 00412846: EB04 jmp 0041284C 00412848: 66B80100 mov ax,0001 0041284C: C3 ret -------------------------------------------------------------- ------------------------对注册表查找创建注册信息---------------------------------------------- 0041284D: 60 pushad 0041284E: 6683BD89B4400000 cmp word ptr [ebp+0040B489],0000 <--41313C 0x60 00412856: 750B jnz 00412863 00412858: 66C785FBAB40000100 mov word ptr [ebp+0040ABFB],0001 <--4128AE 过期标志 00412861: EB42 jmp 004128A5 00412863: E8CD030000 call 00412C35 <--找注册键 00412868: BE60B14000 mov esi,0040B160 <--ESI指向还原后的注册信息首地址 0041286D: 03F5 add esi,ebp 0041286F: 663D0100 cmp ax,0001 00412873: 7405 jz 0041287A <--找到则跳转 00412875: 66C7060000 mov word ptr [esi],0000 0041287A: 66833E00 cmp word ptr [esi],0000 0041287E: 7417 jz 00412897 <--没找到，或者错误则跳转 00412880: 66FF0E dec word ptr [esi] 00412883: 66C785FBAB40000100 mov word ptr [ebp+0040ABFB],0001 <--4128AE 过期标志 0041288C: 66C7857DB440000100 mov word ptr [ebp+0040B47D],0001 <--40B47D卷信息标志 00412895: EB09 jmp 004128A0 00412897: 66C785FBAB40000000 mov word ptr [ebp+0040ABFB],0000 <--4128AE 过期标志 004128A0: E84C040000 call 00412CF1 <--创建注册信息 004128A5: 61 popad 004128A6: 668B85FBAB4000 mov ax,word ptr [ebp+0040ABFB] <--4128AE 过期标志 004128AD: C3 ret ----------------------------------------------------------------- ----------------------------非代码区------------------------------ 004128AE: 0000 add byte ptr [eax],al ------------------------------------------------------------- ---------------------------输入Serial并进行判断------------------------------------ 004128B0: E8BB000000 call 00412970 <--根据卷信息来检测是否原版用户 004128B5: 8B85A8AD4000 mov eax,dword ptr [ebp+0040ADA8] lpTotalNumberOfBytes, 004128BB: BBB0AD4000 mov ebx,0040ADB0 004128C0: 03DD add ebx,ebp <--412A63 "%lX" 004128C2: B983B14000 mov ecx,0040B183 004128C7: 03CD add ecx,ebp 004128C9: 50 push eax 004128CA: 53 push ebx ************** %lX *************** 004128CB: 51 push ecx 004128CC: FF9504BC4000 call dword ptr [ebp+0040BC04] <--wsprintfA 004128D2: 83C40C add esp,0000000C 004128D5: B865B14000 mov eax,0040B165 <--存放Your Name 004128DA: 03C5 add eax,ebp 004128DC: BB79B14000 mov ebx,0040B179 <--存放Serial No 004128E1: 03DD add ebx,ebp 004128E3: B983B14000 mov ecx,0040B183 <--转换后的序列号 004128E8: 03CD add ecx,ebp 004128EA: 51 push ecx 004128EB: 53 push ebx 004128EC: 50 push eax 004128ED: FF95BCBC4000 call dword ptr [ebp+0040BCBC] <--GetRegister 004128F3: E8F9030000 call 00412CF1 <--保存注册信息到注册表 004128F8: E873000000 call 00412970 <--根据卷信息来检测是否原版用户 004128FD: C3 ret ------------------------------------------------------------------------- -----------------------------------------检测密码Password-------------------------- 004128FE: 6683BD49B740007C cmp word ptr [ebp+0040B749],007C 00412906: 7505 jnz 0041290D 00412908: 66B80100 mov ax,0001 0041290C: C3 ret 0041290D: B89FAC4000 mov eax,0040AC9F 00412912: 03C5 add eax,ebp <--412952 00412914: 50 push eax 00412915: FF95B8BC4000 call dword ptr [ebp+0040BCB8] <--GetPassword 0041291B: BE49B74000 mov esi,0040B749 00412920: 03F5 add esi,ebp <--4133FC，保存的密码 00412922: BF9FAC4000 mov edi,0040AC9F <--412952 00412927: 03FD add edi,ebp 00412929: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 00412930: 8A26 mov ah,byte ptr [esi] 00412932: 3A27 cmp ah,byte ptr [edi] 00412934: 7509 jnz 0041293F 00412936: 80FC00 cmp ah,00 00412939: 7409 jz 00412944 0041293B: 46 inc esi 0041293C: 47 inc edi 0041293D: EBF1 jmp 00412930 0041293F: 66B80000 mov ax,0000 00412943: C3 ret 00412944: 66C7857DB440000100 mov word ptr [ebp+0040B47D],0001 <--40B47D卷信息标志 0041294D: 66B80100 mov ax,0001 00412951: C3 ret ---------------------------------------------------------- ----------------------------非代码区----------------------------------- 00412952: 0000 add byte ptr [eax],al 00412954: 0000 add byte ptr [eax],al 00412956: 0000 add byte ptr [eax],al 00412958: 0000 add byte ptr [eax],al 0041295A: 0000 add byte ptr [eax],al 0041295C: 0000 add byte ptr [eax],al 0041295E: 0000 add byte ptr [eax],al 00412960: 0000 add byte ptr [eax],al 00412962: 0000 add byte ptr [eax],al 00412964: 0000 add byte ptr [eax],al 00412966: 0000 add byte ptr [eax],al 00412968: 0000 add byte ptr [eax],al 0041296A: 0000 add byte ptr [eax],al 0041296C: 0000 add byte ptr [eax],al 0041296E: 0000 add byte ptr [eax],al --------------------------------------------------------------- --------------------------根据卷信息保存到注册表---------------------- 00412970: B810000000 mov eax,00000010 00412975: 50 push eax <--nFileSystemNameSize 00412976: B8B8AD4000 mov eax,0040ADB8 0041297B: 03C5 add eax,ebp 0041297D: 50 push eax <--lpFileSystemNameBuffer, 0041297E: B8C8AD4000 mov eax,0040ADC8 00412983: 03C5 add eax,ebp 00412985: 50 push eax <--lpFileSystemFlags, 00412986: B8CCAD4000 mov eax,0040ADCC 0041298B: 03C5 add eax,ebp 0041298D: 50 push eax <--lpMaximumComponentLength, 0041298E: B8D0AD4000 mov eax,0040ADD0 00412993: 03C5 add eax,ebp 00412995: 50 push eax <--lpVolumeSerialNumber, 00412996: B810000000 mov eax,00000010 0041299B: 50 push eax <--nVolumeNameSize, 0041299C: B8D4AD4000 mov eax,0040ADD4 004129A1: 03C5 add eax,ebp 004129A3: 50 push eax <--lpVolumeNameBuffer, 004129A4: B8B4AD4000 mov eax,0040ADB4 004129A9: 03C5 add eax,ebp <--412A67 004129AB: 50 push eax <--lpRootPathName, "C:\" 004129AC: FF95BFBB4000 call dword ptr [ebp+0040BBBF] <--GetVolumeInformationA 004129B2: B8A4AD4000 mov eax,0040ADA4 004129B7: 03C5 add eax,ebp 004129B9: BBA8AD4000 mov ebx,0040ADA8 004129BE: 03DD add ebx,ebp lpTotalNumberOfBytes, 004129C0: B9ACAD4000 mov ecx,0040ADAC 004129C5: 03CD add ecx,ebp 004129C7: C701633A5C00 mov dword ptr [ecx],005C3A63 004129CD: 50 push eax lpTotalNumberOfFreeBytes 004129CE: 53 push ebx lpTotalNumberOfBytes, 004129CF: 6A00 push 00000000 lpFreeBytesAvailableToCaller, 004129D1: 51 push ecx lpDirectoryName,"C:\" 004129D2: FF95B7BB4000 call dword ptr [ebp+0040BBB7] <--GetDiskFreeSpaceExA 004129D8: 8B85A8AD4000 mov eax,dword ptr [ebp+0040ADA8] lpTotalNumberOfBytes, 004129DE: F7D0 not eax 004129E0: 3385D0AD4000 xor eax,dword ptr [ebp+0040ADD0] lpVolumeSerialNumber, 004129E6: 8985A8AD4000 mov dword ptr [ebp+0040ADA8],eax lpTotalNumberOfBytes, 004129EC: E844020000 call 00412C35 <--查找注册表，提取数据 004129F1: B801000000 mov eax,00000001 004129F6: 33DB xor ebx,ebx 004129F8: BE65B14000 mov esi,0040B165 004129FD: 03F5 add esi,ebp <--412E18,存放Your Name 004129FF: 8A1E mov bl,byte ptr [esi] 00412A01: 80FB00 cmp bl,00 00412A04: 7405 jz 00412A0B 00412A06: F7E3 mul ebx 00412A08: 46 inc esi 00412A09: EBF4 jmp 004129FF 00412A0B: 33855DB74000 xor eax,dword ptr [ebp+0040DB75] <--413410,Register Key 00412A11: 3385A8AD4000 xor eax,dword ptr [ebp+0040ADA8] lpTotalNumberOfBytes, 00412A17: 86E0 xchg al,ah 00412A19: 8BD8 mov ebx,eax 00412A1B: BE79B14000 mov esi,0040B179 <--412E2C,存放Serial No 00412A20: 03F5 add esi,ebp 00412A22: E80E000000 call 00412A35 <--数据转换 00412A27: 3BD8 cmp ebx,eax <--比较是否正版 00412A29: 7405 jz 00412A30 00412A2B: 66B80000 mov ax,0000 00412A2F: C3 ret 00412A30: 66B80100 mov ax,0001 00412A34: C3 ret -------------------------------------------------------------------------- -------------------------字符转换成数值--------------------------------- 00412A35: 53 push ebx 00412A36: 56 push esi 00412A37: 33DB xor ebx,ebx 00412A39: 8A06 mov al,byte ptr [esi] 00412A3B: 3C39 cmp al,39 00412A3D: 7606 jbe 00412A45 00412A3F: 24CF and al,CF 00412A41: 2C37 sub al,37 00412A43: EB02 jmp 00412A47 00412A45: 240F and al,0F 00412A47: C1E304 shl ebx,04 00412A4A: 0AD8 or bl,al 00412A4C: 46 inc esi 00412A4D: 803E00 cmp byte ptr [esi],00 00412A50: 75E7 jnz 00412A39 00412A52: 8BC3 mov eax,ebx 00412A54: 5E pop esi 00412A55: 5B pop ebx 00412A56: C3 ret ---------------------------------------------------------------------- ---------------------------非代码区--------------------------------- 00412A57: 0000 add byte ptr [eax],al 00412A59: 0000 add byte ptr [eax],al 00412A5B: 0000 add byte ptr [eax],al 00412A5D: 0000 add byte ptr [eax],al 00412A5F: 633A arpl word ptr [edx],di 00412A61: 5C pop esp 00412A62: 00256C580043 add byte ptr [4300586C],ah 00412A68: 3A5C0000 cmp bl,byte ptr [eax+eax] 00412A6C: 0000 add byte ptr [eax],al 00412A6E: 0000 add byte ptr [eax],al 00412A70: 0000 add byte ptr [eax],al 00412A72: 0000 add byte ptr [eax],al 00412A74: 0000 add byte ptr [eax],al 00412A76: 0000 add byte ptr [eax],al 00412A78: 0000 add byte ptr [eax],al 00412A7A: 0000 add byte ptr [eax],al 00412A7C: 0000 add byte ptr [eax],al 00412A7E: 0000 add byte ptr [eax],al 00412A80: 0000 add byte ptr [eax],al 00412A82: 0000 add byte ptr [eax],al 00412A84: 0000 add byte ptr [eax],al 00412A86: 0000 add byte ptr [eax],al 00412A88: 0000 add byte ptr [eax],al 00412A8A: 0000 add byte ptr [eax],al 00412A8C: 0000 add byte ptr [eax],al 00412A8E: 0000 add byte ptr [eax],al 00412A90: 0000 add byte ptr [eax],al 00412A92: 0000 add byte ptr [eax],al 00412A94: 0000 add byte ptr [eax],al 00412A96: 00 ------------------------------------------------------------------ -------------------------------------------------------- 00412A97: 60 pushad 00412A98: 8B9D69B44000 mov ebx,dword ptr [ebp+0040B469] <--41311C 00412A9E: 83FB00 cmp ebx,00000000 00412AA1: 0F84A6000000 jz 00412B4D 00412AA7: 039DD3B24000 add ebx,dword ptr [ebp+0040B2D3] 00412AAD: 8B430C mov eax,dword ptr [ebx+0C] 00412AB0: 83F800 cmp eax,00000000 00412AB3: 0F8494000000 jz 00412B4D 00412AB9: 0385D3B24000 add eax,dword ptr [ebp+0040B2D3] 00412ABF: 8BF0 mov esi,eax 00412AC1: 50 push eax 00412AC2: FF9564BF4000 call dword ptr [ebp+0040BF64] 00412AC8: 89857DBA4000 mov dword ptr [ebp+0040BA7D],eax 00412ACE: 8B33 mov esi,dword ptr [ebx] 00412AD0: 8B7B10 mov edi,dword ptr [ebx+10] 00412AD3: 83FE00 cmp esi,00000000 00412AD6: 7502 jnz 00412ADA 00412AD8: 8BF7 mov esi,edi 00412ADA: 03B5D3B24000 add esi,dword ptr [ebp+0040B2D3] 00412AE0: 03BDD3B24000 add edi,dword ptr [ebp+0040B2D3] 00412AE6: 8B06 mov eax,dword ptr [esi] 00412AE8: 83F800 cmp eax,00000000 00412AEB: 7505 jnz 00412AF2 00412AED: 83C314 add ebx,00000014 00412AF0: EBBB jmp 00412AAD 00412AF2: 807E0380 cmp byte ptr [esi+03],80 00412AF6: 7514 jnz 00412B0C 00412AF8: 33C0 xor eax,eax 00412AFA: 668706 xchg word ptr [esi],ax 00412AFD: 50 push eax 00412AFE: FFB57DBA4000 push dword ptr [ebp+0040BA7D] 00412B04: FF9568BF4000 call dword ptr [ebp+0040BF68] 00412B0A: EB37 jmp 00412B43 00412B0C: 33C0 xor eax,eax 00412B0E: 8706 xchg dword ptr [esi],eax 00412B10: 0385D3B24000 add eax,dword ptr [ebp+0040B2D3] 00412B16: 83C002 add eax,00000002 00412B19: 8BC8 mov ecx,eax 00412B1B: E83B000000 call 00412B5B <---判断是否为ExitProcess字符串 00412B20: 663D0100 cmp ax,0001 00412B24: 7510 jnz 00412B36 <--不同，则跳转 00412B26: C6855DBD400001 mov byte ptr [ebp+0040BD5D],01 00412B2D: B89EBE4000 mov eax,0040BE9E 00412B32: 03C5 add eax,ebp 00412B34: EB0D jmp 00412B43 00412B36: 50 push eax 00412B37: FFB57DBA4000 push dword ptr [ebp+0040BA7D] 00412B3D: FF9568BF4000 call dword ptr [ebp+0040BF68] 00412B43: 8907 mov dword ptr [edi],eax 00412B45: 83C604 add esi,00000004 00412B48: 83C704 add edi,00000004 00412B4B: EB99 jmp 00412AE6 00412B4D: 61 popad 00412B4E: C3 ret ----------------------------------------------------- --------------------非代码区------------ 00412B4F: 45 inc ebp 00412B50: 7869 js 00412BBB 00412B52: 7450 jz 00412BA4 00412B54: 726F jb 00412BC5 00412B56: 636573 arpl word ptr [ebp+73],sp 00412B59: 7300 jnb 00412B5B ----------------------------------- ----------------判断是否为ExitProcess字符串-------------------- 00412B5B: 53 push ebx 00412B5C: 56 push esi 00412B5D: 57 push edi 00412B5E: 8BF0 mov esi,eax 00412B60: BF9CAE4000 mov edi,0040AE9C 00412B65: 03FD add edi,ebp <---412B4F ********************** ExitProcess *********************** 00412B67: 8A1E mov bl,byte ptr [esi] 00412B69: 3A1F cmp bl,byte ptr [edi] 00412B6B: 750C jnz 00412B79 00412B6D: 46 inc esi 00412B6E: 47 inc edi 00412B6F: 80FB00 cmp bl,00 00412B72: 75F3 jnz 00412B67 00412B74: B801000000 mov eax,00000001 00412B79: 5F pop edi 00412B7A: 5E pop esi 00412B7B: 5B pop ebx 00412B7C: C3 ret --------------------------------------------------- -------------------------------------------------- 00412B7D: 60 pushad 00412B7E: 33C0 xor eax,eax 00412B80: 8BB56DB44000 mov esi,dword ptr [ebp+0040B46D] 00412B86: 83FE00 cmp esi,00000000 00412B89: 7459 jz 00412BE4 00412B8B: 03B5D3B24000 add esi,dword ptr [ebp+0040B2D3] 00412B91: 668B3E mov di,word ptr [esi] 00412B94: 663B7E02 cmp di,word ptr [esi+02] 00412B98: 744A jz 00412BE4 00412B9A: 8B3E mov edi,dword ptr [esi] 00412B9C: 83FF00 cmp edi,00000000 00412B9F: 7443 jz 00412BE4 00412BA1: 03BDD3B24000 add edi,dword ptr [ebp+0040B2D3] 00412BA7: 8B4E04 mov ecx,dword ptr [esi+04] 00412BAA: 83E908 sub ecx,00000008 00412BAD: 83F900 cmp ecx,00000000 00412BB0: 7432 jz 00412BE4 00412BB2: D1E9 shr ecx,1 00412BB4: 83C608 add esi,00000008 00412BB7: 668B06 mov ax,word ptr [esi] 00412BBA: 662500F0 and ax,F000 00412BBE: 663D0030 cmp ax,3000 00412BC2: 7519 jnz 00412BDD 00412BC4: 668B06 mov ax,word ptr [esi] 00412BC7: 6625FF0F and ax,0FFF 00412BCB: 8B9D79B44000 mov ebx,dword ptr [ebp+0040B479] 00412BD1: 291C07 sub dword ptr [edi+eax],ebx 00412BD4: 8B9DD3B24000 mov ebx,dword ptr [ebp+0040B2D3] 00412BDA: 011C07 add dword ptr [edi+eax],ebx 00412BDD: 83C602 add esi,00000002 00412BE0: E2D5 loop 00412BB7 00412BE2: EBAD jmp 00412B91 00412BE4: 61 popad 00412BE5: C3 ret ---------------------------------------------------- 00412BE6: 60 pushad 00412BE7: 8BB571B44000 mov esi,dword ptr [ebp+0040B471] 00412BED: 83FE00 cmp esi,00000000 00412BF0: 7432 jz 00412C24 00412BF2: 03B5D3B24000 add esi,dword ptr [ebp+0040B2D3] 00412BF8: 8B8D75B44000 mov ecx,dword ptr [ebp+0040B475] 00412BFE: 83F900 cmp ecx,00000000 00412C01: 7421 jz 00412C24 00412C03: 8B06 mov eax,dword ptr [esi] 00412C05: 83F800 cmp eax,00000000 00412C08: 7412 jz 00412C1C 00412C0A: 2B8579B44000 sub eax,dword ptr [ebp+0040B479] 00412C10: 2020 and byte ptr [eax],ah 00412C12: 2020 and byte ptr [eax],ah 00412C14: 2032 and byte ptr [edx],dh 00412C16: 37 aaa 00412C17: 3133 xor dword ptr [ebx],esi 00412C19: 3800 cmp byte ptr [eax],al 00412C1B: 0000 add byte ptr [eax],al 00412C1D: 0000 add byte ptr [eax],al 00412C1F: 0000 add byte ptr [eax],al 00412C00: 0074218B add byte ptr [ecx-75],dh 00412C04: 06 push es 00412C05: 83F800 cmp eax,00000000 00412C08: 7412 jz 00412C1C 00412C0A: 2B8579B44000 sub eax,dword ptr [ebp+0040B479] 00412C10: 0385D3B24000 add eax,dword ptr [ebp+0040B2D3] 00412C16: C70000000000 mov dword ptr [eax],00000000 00412C1C: 83C604 add esi,00000004 00412C1F: 83E904 sub ecx,00000004 00412C22: 75DF jnz 00412C03 00412C24: 61 popad 00412C25: C3 ret ---------------------显示NAG窗口------------------------ 00412C26: B865B74000 mov eax,0040B765 00412C2B: 03C5 add eax,ebp <--413418 ************************************* 欢迎你使用幻影 1.5 beta2， 幻影v1.5是共享软件，如果你喜欢它，希望你注册。 E-mail : ding-boy@netease.com Homepage : http://fsdb.yeah.net ************************************** 00412C2D: 50 push eax 00412C2E: FF95C0BC4000 call dword ptr [ebp+0040BCC0] <--ShowTryWindow 00412C34: C3 ret --------------------------- ----------------查寻注册键，找到则进行还原并且返回1，否则返回0----------- 00412C35: 60 pushad 00412C36: 66C7855EB140000000 mov word ptr [ebp+0040B15E],0000 <--412E11 00412C3F: B848B14000 mov eax,0040B148 00412C44: 03C5 add eax,ebp <--412DFB 00412C46: BB40B14000 mov ebx,0040B140 00412C4B: 03DD add ebx,ebp <--412DF3 00412C4D: B91EB14000 mov ecx,0040B11E 00412C52: 03CD add ecx,ebp <--412DD1 ********************* wrifile\shell\open\command\config ********************** 00412C54: 50 push eax 00412C55: 53 push ebx 00412C56: 683F001F00 push 001F003F 00412C5B: 6A00 push 00000000 00412C5D: 6A00 push 00000000 00412C5F: 6A00 push 00000000 00412C61: 6A00 push 00000000 00412C63: 51 push ecx 00412C64: 6800000080 push 80000000 00412C69: FF9576BC4000 call dword ptr [ebp+0040BC76] <--RegCreateKeyA 00412C6F: 663D0000 cmp ax,0000 00412C73: 7566 jnz 00412CDB 00412C75: BE1AB14000 mov esi,0040B11A 00412C7A: 03F5 add esi,ebp <--412DCD 00412C7C: BF16B14000 mov edi,0040B116 00412C81: 03FD add edi,ebp <-- 00412C83: B860B14000 mov eax,0040B160 00412C88: 03C5 add eax,ebp <--412E13 00412C8A: BB50B14000 mov ebx,0040B150 00412C8F: 03DD add ebx,ebp <--412E03 ******************** 91 80 88 80 B8 80 99 80 EE 82 ******************** 00412C91: 8B8D40B14000 mov ecx,dword ptr [ebp+0040B140] 00412C97: 56 push esi <--412DCD "=" 00412C98: 50 push eax <--412E13 00412C99: 57 push edi 00412C9A: 6A00 push 00000000 00412C9C: 53 push ebx 00412C9D: 51 push ecx 00412C9E: FF957EBC4000 call dword ptr [ebp+0040BC7E] <--RegQueryValueEx 00412CA4: 663D0000 cmp ax,0000 00412CA8: 7531 jnz 00412CDB 00412CAA: 66C7855EB140000100 mov word ptr [ebp+0040B15E],0001 <--412E11 00412CB3: 668B8567B44000 mov ax,word ptr [ebp+0040B467] <--41311A ******************** EE 82 ******************** 00412CBA: 8AE0 mov ah,al 00412CBC: BE60B14000 mov esi,0040B160 00412CC1: 03F5 add esi,ebp <--412DE13 ************-------------------关键的还原-------------************* 00412CC3: B93D000000 mov ecx,0000003D 00412CC8: 51 push ecx 00412CC9: 8A06 mov al,byte ptr [esi] 00412CCB: 3C00 cmp al,00 00412CCD: 7402 jz 00412CD1 00412CCF: 32C4 xor al,ah 00412CD1: B104 mov cl,04 00412CD3: D2C8 ror al,cl 00412CD5: 8806 mov byte ptr [esi],al 00412CD7: 46 inc esi 00412CD8: 59 pop ecx 00412CD9: E2ED loop 00412CC8 ***************-----------------------------------******************* 00412CDB: 8B8540B14000 mov eax,dword ptr [ebp+0040B140] 00412CE1: 50 push eax 00412CE2: FF957ABC4000 call dword ptr [ebp+0040BC7A] <--RegCloseKeyA 00412CE8: 61 popad 00412CE9: 668B855EB14000 mov ax,word ptr [ebp+0040B15E] 00412CF0: C3 ret ---------------------------------------------------------------- -------------------------保存注册信息到注册表-------------------------------- 00412CF1: 60 pushad 00412CF2: 66C7855EB140000000 mov word ptr [ebp+0040B15E],0000 00412CFB: B848B14000 mov eax,0040B148 00412D00: 03C5 add eax,ebp 00412D02: BB40B14000 mov ebx,0040B140 00412D07: 03DD add ebx,ebp 00412D09: B91EB14000 mov ecx,0040B11E 00412D0E: 03CD add ecx,ebp <--412DD1 00412D10: 50 push eax 00412D11: 53 push ebx 00412D12: 683F001F00 push 001F003F 00412D17: 6A00 push 00000000 00412D19: 6A00 push 00000000 00412D1B: 6A00 push 00000000 00412D1D: 6A00 push 00000000 00412D1F: 51 push ecx <--412DD1 ***************** wrifile\shell\open\command\config ************************** 00412D20: 6800000080 push 80000000 00412D25: FF9576BC4000 call dword ptr [ebp+0040BC76] <--RegCreateKeyA 00412D2B: 663D0000 cmp ax,0000 00412D2F: 755A jnz 00412D8B 00412D31: 668B8567B44000 mov ax,word ptr [ebp+0040B467] <--41311A ******************** EE 82 ******************** 00412D38: 8AE0 mov ah,al 00412D3A: BE60B14000 mov esi,0040B160 00412D3F: 03F5 add esi,ebp 00412D41: B93D000000 mov ecx,0000003D 00412D46: 51 push ecx 00412D47: 8A06 mov al,byte ptr [esi] 00412D49: B104 mov cl,04 00412D4B: D2C0 rol al,cl 00412D4D: 3C00 cmp al,00 00412D4F: 7402 jz 00412D53 00412D51: 32C4 xor al,ah 00412D53: 8806 mov byte ptr [esi],al 00412D55: 46 inc esi 00412D56: 59 pop ecx 00412D57: E2ED loop 00412D46 00412D59: B860B14000 mov eax,0040B160 00412D5E: 03C5 add eax,ebp <--412DE13 00412D60: BB50B14000 mov ebx,0040B150 00412D65: 03DD add ebx,ebp <--412DE03 ******************** 91 80 88 80 B8 80 99 80 EE 82 ******************** 00412D67: 8B8D40B14000 mov ecx,dword ptr [ebp+0040B140] 00412D6D: 6A3D push 0000003D 00412D6F: 50 push eax 00412D70: 6A03 push 00000003 00412D72: 6A00 push 00000000 00412D74: 53 push ebx 00412D75: 51 push ecx 00412D76: FF9582BC4000 call dword ptr [ebp+0040BC82] <--RegSetValueExA 00412D7C: 663D0000 cmp ax,0000 00412D80: 7509 jnz 00412D8B 00412D82: 66C7855EB140000100 mov word ptr [ebp+0040B15E],0001 00412D8B: 8B8540B14000 mov eax,dword ptr [ebp+0040B140] 00412D91: 50 push eax 00412D92: FF957ABC4000 call dword ptr [ebp+0040BC7A] <--RegCloseKeyA 00412D98: 668B8567B44000 mov ax,word ptr [ebp+0040B467] <--41311A ******************** EE 82 ******************** 00412D9F: 8AE0 mov ah,al 00412DA1: BE60B14000 mov esi,0040B160 00412DA6: 03F5 add esi,ebp <--412DE13 00412DA8: B93D000000 mov ecx,0000003D 00412DAD: 51 push ecx 00412DAE: 8A06 mov al,byte ptr [esi] 00412DB0: 3C00 cmp al,00 00412DB2: 7402 jz 00412DB6 00412DB4: 32C4 xor al,ah 00412DB6: B104 mov cl,04 00412DB8: D2C8 ror al,cl 00412DBA: 8806 mov byte ptr [esi],al 00412DBC: 46 inc esi 00412DBD: 59 pop ecx 00412DBE: E2ED loop 00412DAD 00412DC0: 61 popad 00412DC1: 668B855EB14000 mov ax,word ptr [ebp+0040B15E] 00412DC8: C3 ret ************************************************************** -------------------------------非代码区---------------------------- 00412DC9: 0300 add eax,dword ptr [eax] 00412DCB: 0000 add byte ptr [eax],al 00412DCD: 3D00000077 cmp eax,77000000 00412DD2: 7269 jb 00412E3D 00412DD4: 66696C655C7368 imul bp,word ptr [ebp+5C],6873 00412DDB: 656C insb es:[edi],dx 00412DDD: 6C insb es:[edi],dx 00412DDE: 5C pop esp 00412DDF: 6F outsd dx,ds:[esi] 00412DE0: 7065 jo 00412E47 00412DE2: 6E outsb dx,ds:[esi] 00412DE3: 5C pop esp 00412DE4: 636F6D arpl word ptr [edi+6D],bp 00412DE7: 6D insd es:[edi],dx 00412DE8: 61 popad 00412DE9: 6E outsb dx,ds:[esi] 00412DEA: 645C pop esp 00412DEC: 636F6E arpl word ptr [edi+6E],bp 00412DEF: 666967000000 imul sp,word ptr [edi],0000 00412DF5: 0000 add byte ptr [eax],al 00412DF7: 0000 add byte ptr [eax],al 00412DF9: 0000 add byte ptr [eax],al 00412DFB: 0000 add byte ptr [eax],al 00412DFD: 0000 add byte ptr [eax],al 00412DFF: 0000 add byte ptr [eax],al 00412E01: 0000 add byte ptr [eax],al 00412E03: 91 xchg eax,ecx 00412E04: 808880B8809980 or byte ptr [eax-667F4780],80 00412E0B: EE out dx,al 00412E0C: 820000 add byte ptr [eax],00 00412E0F: 0000 add byte ptr [eax],al 00412E11: 0000 add byte ptr [eax],al 00412E13: 0000 add byte ptr [eax],al 00412E15: 0000 add byte ptr [eax],al 00412E17: 0000 add byte ptr [eax],al 00412E19: 0000 add byte ptr [eax],al 00412E1B: 0000 add byte ptr [eax],al 00412E1D: 0000 add byte ptr [eax],al 00412E1F: 0000 add byte ptr [eax],al 00412E21: 0000 add byte ptr [eax],al 00412E23: 0000 add byte ptr [eax],al 00412E25: 0000 add byte ptr [eax],al 00412E27: 0000 add byte ptr [eax],al 00412E29: 0000 add byte ptr [eax],al 00412E2B: 0000 add byte ptr [eax],al 00412E2D: 0000 add byte ptr [eax],al 00412E2F: 0000 add byte ptr [eax],al 00412E31: 0000 add byte ptr [eax],al 00412E33: 0000 add byte ptr [eax],al 00412E35: 0000 add byte ptr [eax],al 00412E37: 0000 add byte ptr [eax],al 00412E39: 0000 add byte ptr [eax],al 00412E3B: 0000 add byte ptr [eax],al 00412E3D: 0000 add byte ptr [eax],al 00412E3F: 0000 add byte ptr [eax],al 00412E41: 0000 add byte ptr [eax],al 00412E43: 0000 add byte ptr [eax],al 00412E45: 0000 add byte ptr [eax],al 00412E47: 0000 add byte ptr [eax],al 00412E49: 0000 add byte ptr [eax],al 00412E4B: 0000 add byte ptr [eax],al 00412E4D: 0000 add byte ptr [eax],al 00412E4F: 0000 add byte ptr [eax],al 00412E51: 0000 add byte ptr [eax],al 00412E53: 0000 add byte ptr [eax],al 00412E55: 0000 add byte ptr [eax],al 00412E57: 0000 add byte ptr [eax],al 00412E59: 0000 add byte ptr [eax],al 00412E5B: 0000 add byte ptr [eax],al 00412E5D: 0000 add byte ptr [eax],al 00412E5F: 0000 add byte ptr [eax],al 00412E61: 0000 add byte ptr [eax],al 00412E63: 0000 add byte ptr [eax],al 00412E65: 0000 add byte ptr [eax],al 00412E67: 0000 add byte ptr [eax],al 00412E69: 0000 add byte ptr [eax],al 00412E6B: 0000 add byte ptr [eax],al 00412E6D: 0000 add byte ptr [eax],al 00412E6F: 0000 add byte ptr [eax],al 00412E71: 0000 add byte ptr [eax],al 00412E73: 0000 add byte ptr [eax],al 00412E75: 0000 add byte ptr [eax],al 00412E77: 0000 add byte ptr [eax],al 00412E79: 0000 add byte ptr [eax],al 00412E7B: 0000 add byte ptr [eax],al 00412E7D: 0000 add byte ptr [eax],al 00412E7F: 0000 add byte ptr [eax],al 00412E81: 0000 add byte ptr [eax],al 00412E83: 0000 add byte ptr [eax],al 00412E85: 0000 add byte ptr [eax],al 00412E87: 0000 add byte ptr [eax],al 00412E89: 0000 add byte ptr [eax],al 00412E8B: 0000 add byte ptr [eax],al 00412E8D: 0000 add byte ptr [eax],al 00412E8F: 0000 add byte ptr [eax],al 00412E91: 0000 add byte ptr [eax],al 00412E93: 0000 add byte ptr [eax],al 00412E95: 0000 add byte ptr [eax],al 00412E97: 0000 add byte ptr [eax],al 00412E99: 0000 add byte ptr [eax],al 00412E9B: 0000 add byte ptr [eax],al 00412E9D: 0000 add byte ptr [eax],al 00412E9F: 0000 add byte ptr [eax],al 00412EA1: 0000 add byte ptr [eax],al 00412EA3: 0000 add byte ptr [eax],al 00412EA5: 0000 add byte ptr [eax],al 00412EA7: 0000 add byte ptr [eax],al 00412EA9: 0000 add byte ptr [eax],al 00412EAB: 0000 add byte ptr [eax],al 00412EAD: 0003 add byte ptr [ebx],al 00412EAF: 0000 add byte ptr [eax],al 00412EB1: 0029 add byte ptr [ecx],ch 00412EB3: 0000 add byte ptr [eax],al 00412EB5: 002A add byte ptr [edx],ch 00412EB7: 00494E add byte ptr [ecx+4E],cl 00412EBA: 5F pop edi 00412EBB: 43 inc ebx 00412EBC: 4F dec edi 00412EBD: 44 inc esp 00412EBE: 45 inc ebp 00412EBF: 0000 add byte ptr [eax],al 00412EC1: 0000 add byte ptr [eax],al 00412EC3: 0020 add byte ptr [eax],ah 00412EC5: 2020 and byte ptr [eax],ah 00412EC7: 2020 and byte ptr [eax],ah 00412EC9: 2020 and byte ptr [eax],ah 00412ECB: 2020 and byte ptr [eax],ah 00412ECD: 2020 and byte ptr [eax],ah 00412ECF: B1BE mov cl,BE 00412ED1: C8EDBCFE enter BCED,FE 00412ED5: D3C9 ror ecx,cl 00412ED7: 20BBC3D3B076 and byte ptr [ebx+76B0D3C3],bh 00412EDD: 312E xor dword ptr [esi],ebp 00412EDF: 3520CEB4D7 xor eax,D7B4CE20 00412EE4: A2B2E1B0E6 mov [E6B0E1B2],al 00412EE9: B1BE mov cl,BE 00412EEB: BCD3C3DC20 mov esp,20DCC3D3 00412EF0: 2020 and byte ptr [eax],ah 00412EF2: 2020 and byte ptr [eax],ah 00412EF4: 2032 and byte ptr [edx],dh 00412EF6: 37 aaa 00412EF7: 3133 xor dword ptr [ebx],esi 00412EF9: 3800 cmp byte ptr [eax],al 00412EFB: 0000 add byte ptr [eax],al 00412EFD: 0000 add byte ptr [eax],al 00412EFF: 0000 add byte ptr [eax],al 00412EE0: 20CE and dh,cl 00412EE2: B4D7 mov ah,D7 00412EE4: A2B2E1B0E6 mov [E6B0E1B2],al 00412EE9: B1BE mov cl,BE 00412EEB: BCD3C3DC20 mov esp,20DCC3D3 00412EF0: 2020 and byte ptr [eax],ah 00412EF2: 2020 and byte ptr [eax],ah 00412EF4: 2020 and byte ptr [eax],ah 00412EF6: 2020 and byte ptr [eax],ah 00412EF8: 2020 and byte ptr [eax],ah 00412EFA: 0D0A0D0A20 or eax,200A0D0A 00412EFF: 54 push esp 00412F00: 6869732070 push 70207369 00412F05: 726F jb 00412F76 00412F07: 677261 jb 00412F6B 00412F0A: 6D insd es:[edi],dx 00412F0B: 207072 and byte ptr [eax+72],dh 00412F0E: 6F outsd dx,ds:[esi] 00412F0F: 7465 jz 00412F76 00412F11: 63746564 arpl word ptr [ebp+64],si 00412F15: 206279 and byte ptr [edx+79],ah 00412F18: 20444250 and byte ptr [edx+eax*2+50],al 00412F1C: 45 inc ebp 00412F1D: 207631 and byte ptr [esi+31],dh 00412F20: 2E352020556E xor eax,6E552020 00412F26: 7265 jb 00412F8D 00412F28: 6769737465726564 imul esi,dword ptr [bp+di+74],64657265 00412F30: 207665 and byte ptr [esi+65],dh 00412F33: 7273 jb 00412FA8 00412F35: 696F6E0D0A0D0A imul ebp,dword ptr [edi+6E],0A0D0A0D 00412F3C: 0D0A0D0A20 or eax,200A0D0A 00412F41: 48 dec eax 00412F42: 6F outsd dx,ds:[esi] 00412F43: 6D insd es:[edi],dx 00412F44: 657061 jo 00412FA8 00412F47: 67653A20 cmp ah,byte ptr gs:[bx+si] 00412F4B: 687474703A push 3A707474 00412F50: 2F das 00412F51: 2F das 00412F52: 667364 jnb 00412FB9 00412F55: 622E bound ebp,dword ptr [esi] 00412F57: 7965 jns 00412FBE 00412F59: 61 popad 00412F5A: 682E6E6574 push 74656E2E 00412F5F: 2020 and byte ptr [eax],ah 00412F61: 2020 and byte ptr [eax],ah 00412F63: 45 inc ebp 00412F64: 2D6D61696C sub eax,6C69616D 00412F69: 3A20 cmp ah,byte ptr [eax] 00412F6B: 44 inc esp 00412F6C: 2E42 inc edx 00412F6E: 6F outsd dx,ds:[esi] 00412F6F: 7940 jns 00412FB1 00412F71: 3132 xor dword ptr [edx],esi 00412F73: 362E636F6D arpl word ptr cs:[edi+6D],bp 00412F78: 200D0A007C7C and byte ptr [7C7C000A],cl 00412F7E: 00D0 add al,dl 00412F80: 0000 add byte ptr [eax],al 00412F82: CC int 3 00412F83: 1000 adc byte ptr [eax],al 00412F85: 0000 add byte ptr [eax],al 00412F87: 0000 add byte ptr [eax],al 00412F89: 0000 add byte ptr [eax],al 00412F8B: 1000 adc byte ptr [eax],al 00412F8D: 0000 add byte ptr [eax],al 00412F8F: 40 inc eax 00412F90: 0000 add byte ptr [eax],al 00412F92: 005000 add byte ptr [eax],dl 00412F95: 0000 add byte ptr [eax],al 00412F97: 1000 adc byte ptr [eax],al 00412F99: 0000 add byte ptr [eax],al 00412F9B: 60 pushad 00412F9C: 0000 add byte ptr [eax],al 00412F9E: 0010 add byte ptr [eax],dl 00412FA0: 0000 add byte ptr [eax],al 00412FA2: 00C0 add al,al 00412FA4: 0000 add byte ptr [eax],al 00412FA6: 0010 add byte ptr [eax],dl 00412FA8: 0000 add byte ptr [eax],al 00412FAA: 0000 add byte ptr [eax],al 00412FAC: 0000 add byte ptr [eax],al 00412FAE: 0000 add byte ptr [eax],al 00412FB0: 0000 add byte ptr [eax],al 00412FB2: 0000 add byte ptr [eax],al 00412FB4: 0000 add byte ptr [eax],al 00412FB6: 0000 add byte ptr [eax],al 00412FB8: 0000 add byte ptr [eax],al 00412FBA: 0000 add byte ptr [eax],al 00412FBC: 0000 add byte ptr [eax],al 00412FBE: 0000 add byte ptr [eax],al 00412FC0: 0000 add byte ptr [eax],al 00412FC2: 0000 add byte ptr [eax],al 00412FC4: 0000 add byte ptr [eax],al 00412FC6: 0000 add byte ptr [eax],al 00412FC8: 0000 add byte ptr [eax],al 00412FCA: 0000 add byte ptr [eax],al 00412FCC: 0000 add byte ptr [eax],al 00412FCE: 0000 add byte ptr [eax],al 00412FD0: 0000 add byte ptr [eax],al 00412FD2: 0000 add byte ptr [eax],al 00412FD4: 0000 add byte ptr [eax],al 00412FD6: 0000 add byte ptr [eax],al 00412FD8: 0000 add byte ptr [eax],al 00412FDA: 0000 add byte ptr [eax],al 00412FDC: 0000 add byte ptr [eax],al 00412FDE: 0000 add byte ptr [eax],al 00412FE0: 0000 add byte ptr [eax],al 00412FE2: 0000 add byte ptr [eax],al 00412FE4: 0000 add byte ptr [eax],al 00412FE6: 0000 add byte ptr [eax],al 00412FE8: 0000 add byte ptr [eax],al 00412FEA: 0000 add byte ptr [eax],al 00412FEC: 0000 add byte ptr [eax],al 00412FEE: 0000 add byte ptr [eax],al 00412FF0: 0000 add byte ptr [eax],al 00412FF2: 0000 add byte ptr [eax],al 00412FF4: 0000 add byte ptr [eax],al 00412FF6: 0000 add byte ptr [eax],al 00412FF8: 0000 add byte ptr [eax],al 00412FFA: 0000 add byte ptr [eax],al 00412FFC: 0000 add byte ptr [eax],al 00412FFE: 0000 add byte ptr [eax],al 00413000: 0000 add byte ptr [eax],al 00413002: 0000 add byte ptr [eax],al 00413004: 0000 add byte ptr [eax],al 00413006: 0000 add byte ptr [eax],al 00413008: 0000 add byte ptr [eax],al 0041300A: 0000 add byte ptr [eax],al 0041300C: 0000 add byte ptr [eax],al 0041300E: 0000 add byte ptr [eax],al 00413010: 0000 add byte ptr [eax],al 00413012: 0000 add byte ptr [eax],al 00413014: 0000 add byte ptr [eax],al 00413016: 0000 add byte ptr [eax],al 00413018: 0000 add byte ptr [eax],al 0041301A: 0000 add byte ptr [eax],al 0041301C: 0000 add byte ptr [eax],al 0041301E: 0000 add byte ptr [eax],al 00413020: 0000 add byte ptr [eax],al 00413022: 0000 add byte ptr [eax],al 00413024: 0000 add byte ptr [eax],al 00413026: 0000 add byte ptr [eax],al 00413028: 0000 add byte ptr [eax],al 0041302A: 0000 add byte ptr [eax],al 0041302C: 0000 add byte ptr [eax],al 0041302E: 0000 add byte ptr [eax],al 00413030: 0000 add byte ptr [eax],al 00413032: 0000 add byte ptr [eax],al 00413034: 0000 add byte ptr [eax],al 00413036: 0000 add byte ptr [eax],al 00413038: 0000 add byte ptr [eax],al 0041303A: 0000 add byte ptr [eax],al 0041303C: 0000 add byte ptr [eax],al 0041303E: 0000 add byte ptr [eax],al 00413040: 0000 add byte ptr [eax],al 00413042: 0000 add byte ptr [eax],al 00413044: 0000 add byte ptr [eax],al 00413046: 0000 add byte ptr [eax],al 00413048: 0000 add byte ptr [eax],al 0041304A: 0000 add byte ptr [eax],al 0041304C: 0000 add byte ptr [eax],al 0041304E: 0000 add byte ptr [eax],al 00413050: 0000 add byte ptr [eax],al 00413052: 0000 add byte ptr [eax],al 00413054: 0000 add byte ptr [eax],al 00413056: 0000 add byte ptr [eax],al 00413058: 0000 add byte ptr [eax],al 0041305A: 0000 add byte ptr [eax],al 0041305C: 0000 add byte ptr [eax],al 0041305E: 0000 add byte ptr [eax],al 00413060: 0000 add byte ptr [eax],al 00413062: 0000 add byte ptr [eax],al 00413064: 0000 add byte ptr [eax],al 00413066: 0000 add byte ptr [eax],al 00413068: 0000 add byte ptr [eax],al 0041306A: 0000 add byte ptr [eax],al 0041306C: 0000 add byte ptr [eax],al 0041306E: 0000 add byte ptr [eax],al 00413070: 0000 add byte ptr [eax],al 00413072: 0000 add byte ptr [eax],al 00413074: 0000 add byte ptr [eax],al 00413076: 0000 add byte ptr [eax],al 00413078: 0000 add byte ptr [eax],al 0041307A: 0000 add byte ptr [eax],al 0041307C: 0000 add byte ptr [eax],al 0041307E: 0000 add byte ptr [eax],al 00413080: 0000 add byte ptr [eax],al 00413082: 0000 add byte ptr [eax],al 00413084: 0000 add byte ptr [eax],al 00413086: 0000 add byte ptr [eax],al 00413088: 0000 add byte ptr [eax],al 0041308A: 0000 add byte ptr [eax],al 0041308C: 0000 add byte ptr [eax],al 0041308E: 0000 add byte ptr [eax],al 00413090: 0000 add byte ptr [eax],al 00413092: 0000 add byte ptr [eax],al 00413094: 0000 add byte ptr [eax],al 00413096: 0000 add byte ptr [eax],al 00413098: 0000 add byte ptr [eax],al 0041309A: 0000 add byte ptr [eax],al 0041309C: 0000 add byte ptr [eax],al 0041309E: 0000 add byte ptr [eax],al 004130A0: 0000 add byte ptr [eax],al 004130A2: 0000 add byte ptr [eax],al 004130A4: 0000 add byte ptr [eax],al 004130A6: 0000 add byte ptr [eax],al 004130A8: 0000 add byte ptr [eax],al 004130AA: 0000 add byte ptr [eax],al 004130AC: 0000 add byte ptr [eax],al 004130AE: 0000 add byte ptr [eax],al 004130B0: 0000 add byte ptr [eax],al 004130B2: 0000 add byte ptr [eax],al 004130B4: 0000 add byte ptr [eax],al 004130B6: 0000 add byte ptr [eax],al 004130B8: 0000 add byte ptr [eax],al 004130BA: 0000 add byte ptr [eax],al 004130BC: 0000 add byte ptr [eax],al 004130BE: 0000 add byte ptr [eax],al 004130C0: 0000 add byte ptr [eax],al 004130C2: 0000 add byte ptr [eax],al 004130C4: 0000 add byte ptr [eax],al 004130C6: 0000 add byte ptr [eax],al 004130C8: 0000 add byte ptr [eax],al 004130CA: 0000 add byte ptr [eax],al 004130CC: 0000 add byte ptr [eax],al 004130CE: 0000 add byte ptr [eax],al 004130D0: 0000 add byte ptr [eax],al 004130D2: 0000 add byte ptr [eax],al 004130D4: 0000 add byte ptr [eax],al 004130D6: 0000 add byte ptr [eax],al 004130D8: 0000 add byte ptr [eax],al 004130DA: 0000 add byte ptr [eax],al 004130DC: 0000 add byte ptr [eax],al 004130DE: 0000 add byte ptr [eax],al 004130E0: 0000 add byte ptr [eax],al 004130E2: 0000 add byte ptr [eax],al 004130E4: 0000 add byte ptr [eax],al 004130E6: 0000 add byte ptr [eax],al 004130E8: 0000 add byte ptr [eax],al 004130EA: 0000 add byte ptr [eax],al 004130EC: 0000 add byte ptr [eax],al 004130EE: 0000 add byte ptr [eax],al 004130F0: 0000 add byte ptr [eax],al 004130F2: 0000 add byte ptr [eax],al 004130F4: 0000 add byte ptr [eax],al 004130F6: 0000 add byte ptr [eax],al 004130F8: 0000 add byte ptr [eax],al 004130FA: 0000 add byte ptr [eax],al 004130FC: 0000 add byte ptr [eax],al 004130FE: 0000 add byte ptr [eax],al 00413100: 0000 add byte ptr [eax],al 00413102: 0000 add byte ptr [eax],al 00413104: 0000 add byte ptr [eax],al 00413106: 0000 add byte ptr [eax],al 00413108: 0000 add byte ptr [eax],al 0041310A: 0000 add byte ptr [eax],al 0041310C: 0000 add byte ptr [eax],al 0041310E: 0000 add byte ptr [eax],al 00413110: 0000 add byte ptr [eax],al 00413112: 0000 add byte ptr [eax],al 00413114: 0000 add byte ptr [eax],al 00413116: 0000 add byte ptr [eax],al 00413118: 0000 add byte ptr [eax],al 0041311A: EE out dx,al 0041311B: 820060 add byte ptr [eax],60 0041311E: 0000 add byte ptr [eax],al 00413120: 00C0 add al,al 00413122: 0000 add byte ptr [eax],al 00413124: 0000 add byte ptr [eax],al 00413126: 0000 add byte ptr [eax],al 00413128: 0000 add byte ptr [eax],al 0041312A: 0000 add byte ptr [eax],al 0041312C: 0000 add byte ptr [eax],al 0041312E: 40 inc eax 0041312F: 0000 add byte ptr [eax],al 00413131: 0000 add byte ptr [eax],al 00413133: 00D0 add al,dl 00413135: 07 pop es 00413136: 0000 add byte ptr [eax],al 00413138: 0A00 or al,byte ptr [eax] 0041313A: 0000 add byte ptr [eax],al 0041313C: 640000 add byte ptr fs:[eax],al 0041313F: 00443A5C add byte ptr [edx+edi+5C],al 00413143: 54 push esp 00413144: 45 inc ebp 00413145: 4D dec ebp 00413146: 50 push eax 00413147: 5C pop esp 00413148: 64627065 bound esi,dword ptr fs:[eax+65] 0041314C: 5C pop esp 0041314D: 54 push esp 0041314E: 45 inc ebp 0041314F: 53 push ebx 00413150: 54 push esp 00413151: 5C pop esp 00413152: 54 push esp 00413153: 45 inc ebp 00413154: 53 push ebx 00413155: 54 push esp 00413156: 37 aaa 00413157: 5C pop esp 00413158: 44 inc esp 00413159: 42 inc edx 0041315A: 4E dec esi 0041315B: 6F outsd dx,ds:[esi] 0041315C: 7465 jz 004131C3 0041315E: 2E45 inc ebp 00413160: 58 pop eax 00413161: 45 inc ebp 00413162: 0000 add byte ptr [eax],al 00413164: 0000 add byte ptr [eax],al 00413166: 0000 add byte ptr [eax],al 00413168: 0000 add byte ptr [eax],al 0041316A: 0000 add byte ptr [eax],al 0041316C: 0000 add byte ptr [eax],al 0041316E: 0000 add byte ptr [eax],al 00413170: 0000 add byte ptr [eax],al 00413172: 0000 add byte ptr [eax],al 00413174: 0000 add byte ptr [eax],al 00413176: 0000 add byte ptr [eax],al 00413178: 0000 add byte ptr [eax],al 0041317A: 0000 add byte ptr [eax],al 0041317C: 0000 add byte ptr [eax],al 0041317E: 0000 add byte ptr [eax],al 00413180: 0000 add byte ptr [eax],al 00413182: 0000 add byte ptr [eax],al 00413184: 0000 add byte ptr [eax],al 00413186: 0000 add byte ptr [eax],al 00413188: 0000 add byte ptr [eax],al 0041318A: 0000 add byte ptr [eax],al 0041318C: 0000 add byte ptr [eax],al 0041318E: 0000 add byte ptr [eax],al 00413190: 0000 add byte ptr [eax],al 00413192: 0000 add byte ptr [eax],al 00413194: 0000 add byte ptr [eax],al 00413196: 0000 add byte ptr [eax],al 00413198: 0000 add byte ptr [eax],al 0041319A: 0000 add byte ptr [eax],al 0041319C: 0000 add byte ptr [eax],al 0041319E: 0000 add byte ptr [eax],al 004131A0: 0000 add byte ptr [eax],al 004131A2: 0000 add byte ptr [eax],al 004131A4: 2020 and byte ptr [eax],ah 004131A6: 2020 and byte ptr [eax],ah 004131A8: BBB6D3AD20 mov ebx,20ADD3B6 004131AD: 205E5F and byte ptr [esi+5F],bl 004131B0: 5E pop esi 004131B1: 0000 add byte ptr [eax],al 004131B3: 0000 add byte ptr [eax],al 004131B5: 0000 add byte ptr [eax],al 004131B7: 0000 add byte ptr [eax],al 004131B9: 0000 add byte ptr [eax],al 004131BB: 0000 add byte ptr [eax],al 004131BD: 0000 add byte ptr [eax],al 004131BF: 0000 add byte ptr [eax],al 004131C1: 0000 add byte ptr [eax],al 004131C3: 0000 add byte ptr [eax],al 004131C5: 0000 add byte ptr [eax],al 004131C7: 0000 add byte ptr [eax],al 004131C9: 0000 add byte ptr [eax],al 004131CB: 0000 add byte ptr [eax],al 004131CD: 0000 add byte ptr [eax],al 004131CF: 0020 add byte ptr [eax],ah 004131D1: 2020 and byte ptr [eax],ah 004131D3: 2020 and byte ptr [eax],ah 004131D5: 3237 xor dh,byte ptr [edi] 004131D7: 3133 xor dword ptr [ebx],esi 004131D9: 3800 cmp byte ptr [eax],al 004131DB: 0000 add byte ptr [eax],al 004131DD: 0000 add byte ptr [eax],al 004131DF: 0000 add byte ptr [eax],al 004131C0: 0000 add byte ptr [eax],al 004131C2: 0000 add byte ptr [eax],al 004131C4: 0000 add byte ptr [eax],al 004131C6: 0000 add byte ptr [eax],al 004131C8: 0000 add byte ptr [eax],al 004131CA: 0000 add byte ptr [eax],al 004131CC: 0000 add byte ptr [eax],al 004131CE: 0000 add byte ptr [eax],al 004131D0: 0000 add byte ptr [eax],al 004131D2: 0000 add byte ptr [eax],al 004131D4: 0000 add byte ptr [eax],al 004131D6: 0000 add byte ptr [eax],al 004131D8: 0000 add byte ptr [eax],al 004131DA: 0000 add byte ptr [eax],al 004131DC: 0000 add byte ptr [eax],al 004131DE: 0000 add byte ptr [eax],al 004131E0: 0000 add byte ptr [eax],al 004131E2: 0000 add byte ptr [eax],al 004131E4: 0000 add byte ptr [eax],al 004131E6: 0000 add byte ptr [eax],al 004131E8: 0000 add byte ptr [eax],al 004131EA: 0000 add byte ptr [eax],al 004131EC: 0000 add byte ptr [eax],al 004131EE: 0000 add byte ptr [eax],al 004131F0: 0000 add byte ptr [eax],al 004131F2: 0000 add byte ptr [eax],al 004131F4: 0000 add byte ptr [eax],al 004131F6: 0000 add byte ptr [eax],al 004131F8: 0000 add byte ptr [eax],al 004131FA: 0000 add byte ptr [eax],al 004131FC: 0000 add byte ptr [eax],al 004131FE: 0000 add byte ptr [eax],al 00413200: 0000 add byte ptr [eax],al 00413202: 0000 add byte ptr [eax],al 00413204: 0000 add byte ptr [eax],al 00413206: 0000 add byte ptr [eax],al 00413208: 0000 add byte ptr [eax],al 0041320A: 0000 add byte ptr [eax],al 0041320C: 0000 add byte ptr [eax],al 0041320E: 0000 add byte ptr [eax],al 00413210: 0000 add byte ptr [eax],al 00413212: 0000 add byte ptr [eax],al 00413214: 0000 add byte ptr [eax],al 00413216: 0000 add byte ptr [eax],al 00413218: 0000 add byte ptr [eax],al 0041321A: 0000 add byte ptr [eax],al 0041321C: 0000 add byte ptr [eax],al 0041321E: 0000 add byte ptr [eax],al 00413220: 0000 add byte ptr [eax],al 00413222: 0000 add byte ptr [eax],al 00413224: 0000 add byte ptr [eax],al 00413226: 0000 add byte ptr [eax],al 00413228: 0000 add byte ptr [eax],al 0041322A: 0000 add byte ptr [eax],al 0041322C: 0000 add byte ptr [eax],al 0041322E: 0000 add byte ptr [eax],al 00413230: 0000 add byte ptr [eax],al 00413232: 0000 add byte ptr [eax],al 00413234: 0000 add byte ptr [eax],al 00413236: 0000 add byte ptr [eax],al 00413238: 0000 add byte ptr [eax],al 0041323A: 0000 add byte ptr [eax],al 0041323C: 0000 add byte ptr [eax],al 0041323E: 0000 add byte ptr [eax],al 00413240: 0000 add byte ptr [eax],al 00413242: 0000 add byte ptr [eax],al 00413244: 0000 add byte ptr [eax],al 00413246: 0000 add byte ptr [eax],al 00413248: 0000 add byte ptr [eax],al 0041324A: 0000 add byte ptr [eax],al 0041324C: 0000 add byte ptr [eax],al 0041324E: 0000 add byte ptr [eax],al 00413250: 0000 add byte ptr [eax],al 00413252: 0000 add byte ptr [eax],al 00413254: 0000 add byte ptr [eax],al 00413256: 0000 add byte ptr [eax],al 00413258: 0000 add byte ptr [eax],al 0041325A: 0000 add byte ptr [eax],al 0041325C: 0000 add byte ptr [eax],al 0041325E: 0000 add byte ptr [eax],al 00413260: 0000 add byte ptr [eax],al 00413262: 0000 add byte ptr [eax],al 00413264: 0000 add byte ptr [eax],al 00413266: 0000 add byte ptr [eax],al 00413268: 0000 add byte ptr [eax],al 0041326A: 0000 add byte ptr [eax],al 0041326C: 0000 add byte ptr [eax],al 0041326E: 0000 add byte ptr [eax],al 00413270: 0000 add byte ptr [eax],al 00413272: 0000 add byte ptr [eax],al 00413274: 0000 add byte ptr [eax],al 00413276: 0000 add byte ptr [eax],al 00413278: 0000 add byte ptr [eax],al 0041327A: 0000 add byte ptr [eax],al 0041327C: 0000 add byte ptr [eax],al 0041327E: 0000 add byte ptr [eax],al 00413280: 0000 add byte ptr [eax],al 00413282: 0000 add byte ptr [eax],al 00413284: 0000 add byte ptr [eax],al 00413286: 0000 add byte ptr [eax],al 00413288: 0000 add byte ptr [eax],al 0041328A: 0000 add byte ptr [eax],al 0041328C: 0000 add byte ptr [eax],al 0041328E: 0000 add byte ptr [eax],al 00413290: 0000 add byte ptr [eax],al 00413292: 0000 add byte ptr [eax],al 00413294: 0000 add byte ptr [eax],al 00413296: 0000 add byte ptr [eax],al 00413298: 0000 add byte ptr [eax],al 0041329A: 0000 add byte ptr [eax],al 0041329C: 0000 add byte ptr [eax],al 0041329E: 0000 add byte ptr [eax],al 004132A0: 0000 add byte ptr [eax],al 004132A2: 0000 add byte ptr [eax],al 004132A4: 0000 add byte ptr [eax],al 004132A6: 0000 add byte ptr [eax],al 004132A8: 0000 add byte ptr [eax],al 004132AA: 0000 add byte ptr [eax],al 004132AC: 0000 add byte ptr [eax],al 004132AE: 0000 add byte ptr [eax],al 004132B0: 0000 add byte ptr [eax],al 004132B2: 0000 add byte ptr [eax],al 004132B4: 0000 add byte ptr [eax],al 004132B6: 0000 add byte ptr [eax],al 004132B8: 0000 add byte ptr [eax],al 004132BA: 0000 add byte ptr [eax],al 004132BC: 0000 add byte ptr [eax],al 004132BE: 0000 add byte ptr [eax],al 004132C0: 0000 add byte ptr [eax],al 004132C2: 0000 add byte ptr [eax],al 004132C4: 0000 add byte ptr [eax],al 004132C6: 0000 add byte ptr [eax],al 004132C8: 0000 add byte ptr [eax],al 004132CA: 0000 add byte ptr [eax],al 004132CC: 0000 add byte ptr [eax],al 004132CE: 0000 add byte ptr [eax],al 004132D0: 2020 and byte ptr [eax],ah 004132D2: 2020 and byte ptr [eax],ah 004132D4: 2020 and byte ptr [eax],ah 004132D6: 2020 and byte ptr [eax],ah 004132D8: 2020 and byte ptr [eax],ah 004132DA: CAD4D3 retf D3D4 004132DD: C3 ret 004132DE: C6DAD2 mov dl,D2 004132E1: D1B9FDA1A320 sar dword ptr [ecx+20A3A1FD],1 004132E7: 0D0A0D0A00 or eax,000A0D0A 004132EC: 0000 add byte ptr [eax],al 004132EE: 0000 add byte ptr [eax],al 004132F0: 0000 add byte ptr [eax],al 004132F2: 0000 add byte ptr [eax],al 004132F4: 0000 add byte ptr [eax],al 004132F6: 0000 add byte ptr [eax],al 004132F8: 0000 add byte ptr [eax],al 004132FA: 0000 add byte ptr [eax],al 004132FC: 0000 add byte ptr [eax],al 004132FE: 0000 add byte ptr [eax],al 00413300: 0000 add byte ptr [eax],al 00413302: 0000 add byte ptr [eax],al 00413304: 0000 add byte ptr [eax],al 00413306: 0000 add byte ptr [eax],al 00413308: 0000 add byte ptr [eax],al 0041330A: 0000 add byte ptr [eax],al 0041330C: 0000 add byte ptr [eax],al 0041330E: 0000 add byte ptr [eax],al 00413310: 0000 add byte ptr [eax],al 00413312: 0000 add byte ptr [eax],al 00413314: 0000 add byte ptr [eax],al 00413316: 0000 add byte ptr [eax],al 00413318: 0000 add byte ptr [eax],al 0041331A: 0000 add byte ptr [eax],al 0041331C: 0000 add byte ptr [eax],al 0041331E: 0000 add byte ptr [eax],al 00413320: 0000 add byte ptr [eax],al 00413322: 0000 add byte ptr [eax],al 00413324: 0000 add byte ptr [eax],al 00413326: 0000 add byte ptr [eax],al 00413328: 0000 add byte ptr [eax],al 0041332A: 0000 add byte ptr [eax],al 0041332C: 0000 add byte ptr [eax],al 0041332E: 0000 add byte ptr [eax],al 00413330: 0000 add byte ptr [eax],al 00413332: 0000 add byte ptr [eax],al 00413334: 0000 add byte ptr [eax],al 00413336: 0000 add byte ptr [eax],al 00413338: 0000 add byte ptr [eax],al 0041333A: 0000 add byte ptr [eax],al 0041333C: 0000 add byte ptr [eax],al 0041333E: 0000 add byte ptr [eax],al 00413340: 0000 add byte ptr [eax],al 00413342: 0000 add byte ptr [eax],al 00413344: 0000 add byte ptr [eax],al 00413346: 0000 add byte ptr [eax],al 00413348: 0000 add byte ptr [eax],al 0041334A: 0000 add byte ptr [eax],al 0041334C: 0000 add byte ptr [eax],al 0041334E: 0000 add byte ptr [eax],al 00413350: 0000 add byte ptr [eax],al 00413352: 0000 add byte ptr [eax],al 00413354: 0000 add byte ptr [eax],al 00413356: 0000 add byte ptr [eax],al 00413358: 0000 add byte ptr [eax],al 0041335A: 0000 add byte ptr [eax],al 0041335C: 0000 add byte ptr [eax],al 0041335E: 0000 add byte ptr [eax],al 00413360: 0000 add byte ptr [eax],al 00413362: 0000 add byte ptr [eax],al 00413364: 0000 add byte ptr [eax],al 00413366: 0000 add byte ptr [eax],al 00413368: 0000 add byte ptr [eax],al 0041336A: 0000 add byte ptr [eax],al 0041336C: 0000 add byte ptr [eax],al 0041336E: 0000 add byte ptr [eax],al 00413370: 0000 add byte ptr [eax],al 00413372: 0000 add byte ptr [eax],al 00413374: 0000 add byte ptr [eax],al 00413376: 0000 add byte ptr [eax],al 00413378: 0000 add byte ptr [eax],al 0041337A: 0000 add byte ptr [eax],al 0041337C: 0000 add byte ptr [eax],al 0041337E: 0000 add byte ptr [eax],al 00413380: 0000 add byte ptr [eax],al 00413382: 0000 add byte ptr [eax],al 00413384: 0000 add byte ptr [eax],al 00413386: 0000 add byte ptr [eax],al 00413388: 0000 add byte ptr [eax],al 0041338A: 0000 add byte ptr [eax],al 0041338C: 0000 add byte ptr [eax],al 0041338E: 0000 add byte ptr [eax],al 00413390: 0000 add byte ptr [eax],al 00413392: 0000 add byte ptr [eax],al 00413394: 0000 add byte ptr [eax],al 00413396: 0000 add byte ptr [eax],al 00413398: 0000 add byte ptr [eax],al 0041339A: 0000 add byte ptr [eax],al 0041339C: 0000 add byte ptr [eax],al 0041339E: 0000 add byte ptr [eax],al 004133A0: 0000 add byte ptr [eax],al 004133A2: 0000 add byte ptr [eax],al 004133A4: 0000 add byte ptr [eax],al 004133A6: 0000 add byte ptr [eax],al 004133A8: 0000 add byte ptr [eax],al 004133AA: 0000 add byte ptr [eax],al 004133AC: 0000 add byte ptr [eax],al 004133AE: 0000 add byte ptr [eax],al 004133B0: 0000 add byte ptr [eax],al 004133B2: 0000 add byte ptr [eax],al 004133B4: 0000 add byte ptr [eax],al 004133B6: 0000 add byte ptr [eax],al 004133B8: 0000 add byte ptr [eax],al 004133BA: 0000 add byte ptr [eax],al 004133BC: 0000 add byte ptr [eax],al 004133BE: 0000 add byte ptr [eax],al 004133C0: 0000 add byte ptr [eax],al 004133C2: 0000 add byte ptr [eax],al 004133C4: 0000 add byte ptr [eax],al 004133C6: 0000 add byte ptr [eax],al 004133C8: 0000 add byte ptr [eax],al 004133CA: 0000 add byte ptr [eax],al 004133CC: 0000 add byte ptr [eax],al 004133CE: 0000 add byte ptr [eax],al 004133D0: 0000 add byte ptr [eax],al 004133D2: 0000 add byte ptr [eax],al 004133D4: 0000 add byte ptr [eax],al 004133D6: 0000 add byte ptr [eax],al 004133D8: 0000 add byte ptr [eax],al 004133DA: 0000 add byte ptr [eax],al 004133DC: 0000 add byte ptr [eax],al 004133DE: 0000 add byte ptr [eax],al 004133E0: 0000 add byte ptr [eax],al 004133E2: 0000 add byte ptr [eax],al 004133E4: 0000 add byte ptr [eax],al 004133E6: 0000 add byte ptr [eax],al 004133E8: 0000 add byte ptr [eax],al 004133EA: 0000 add byte ptr [eax],al 004133EC: 0000 add byte ptr [eax],al 004133EE: 0000 add byte ptr [eax],al 004133F0: 0000 add byte ptr [eax],al 004133F2: 0000 add byte ptr [eax],al 004133F4: 0000 add byte ptr [eax],al 004133F6: 0000 add byte ptr [eax],al 004133F8: 0000 add byte ptr [eax],al 004133FA: 0000 add byte ptr [eax],al 004133FC: 6C insb es:[edi],dx 004133FD: 6A74 push 00000074 004133FF: 6C insb es:[edi],dx 00413400: 6A74 push 00000074 00413402: 0000 add byte ptr [eax],al 00413404: 0000 add byte ptr [eax],al 00413406: 0000 add byte ptr [eax],al 00413408: 0000 add byte ptr [eax],al 0041340A: 0000 add byte ptr [eax],al 0041340C: 0000 add byte ptr [eax],al 0041340E: 0000 add byte ptr [eax],al 00413410: D20400 rol byte ptr [eax+eax],cl 00413413: 0001 add byte ptr [ecx],al 00413415: 0000 add byte ptr [eax],al 00413417: 0020 add byte ptr [eax],ah 00413419: 2020 and byte ptr [eax],ah 0041341B: 2020 and byte ptr [eax],ah 0041341D: 2020 and byte ptr [eax],ah 0041341F: 2020 and byte ptr [eax],ah 00413421: 2020 and byte ptr [eax],ah 00413423: 2020 and byte ptr [eax],ah 00413425: 2020 and byte ptr [eax],ah 00413427: 2020 and byte ptr [eax],ah 00413429: BBB6D3ADC4 mov ebx,C4ADD3B6 0041342E: E3CA jecxz 004133FA 00413430: B9D3C3BBC3 mov ecx,C3BBC3D3 00413435: D3B020312E35 shl dword ptr [eax+352E3120],cl 0041343B: 206265 and byte ptr [edx+65],ah 0041343E: 7461 jz 004134A1 00413440: 32A3AC0D0A0D xor ah,byte ptr [ebx+0D0A0DAC] 00413446: 0A20 or ah,byte ptr [eax] 00413448: 2020 and byte ptr [eax],ah 0041344A: BBC3D3B076 mov ebx,76B0D3C3 0041344F: 312E xor dword ptr [esi],ebp 00413451: 35CAC7B9B2 xor eax,B2B9C7CA 00413456: CF iretd 00413457: ED in eax,dx 00413458: C8EDBCFE enter BCED,FE 0041345C: A3ACC8E7B9 mov [B9E7C8AC],eax 00413461: FB sti 00413462: C4E3 les esp,(Invalid)bx 00413464: CF iretd 00413465: B2BB mov dl,BB 00413467: B6CB mov dh,CB 00413469: FC cld 0041346A: A3ACCFA3CD mov [CDA3CFAC],eax 0041346F: FB sti 00413470: C4E3 les esp,(Invalid)bx 00413472: D7 xlat 00413473: A2B2E1A1A3 mov [A3A1E1B2],al 00413478: 200D0A0D0A20 and byte ptr [200A0D0A],cl 0041347E: 2020 and byte ptr [eax],ah 00413480: 2020 and byte ptr [eax],ah 00413482: 2020 and byte ptr [eax],ah 00413484: 2020 and byte ptr [eax],ah 00413486: 2020 and byte ptr [eax],ah 00413488: 2020 and byte ptr [eax],ah 0041348A: 2020 and byte ptr [eax],ah 0041348C: 2020 and byte ptr [eax],ah 0041348E: 200D0A0D0A20 and byte ptr [200A0D0A],cl 00413494: 2020 and byte ptr [eax],ah 00413496: 2020 and byte ptr [eax],ah 00413498: 2020 and byte ptr [eax],ah 0041349A: 2020 and byte ptr [eax],ah 0041349C: 2020 and byte ptr [eax],ah 0041349E: 2020 and byte ptr [eax],ah 004134A0: 2020 and byte ptr [eax],ah 004134A2: 2020 and byte ptr [eax],ah 004134A4: 2020 and byte ptr [eax],ah 004134A6: 45 inc ebp 004134A7: 2D6D61696C sub eax,6C69616D 004134AC: 2020 and byte ptr [eax],ah 004134AE: 203A and byte ptr [edx],bh 004134B0: 2020 and byte ptr [eax],ah 004134B2: 2020 and byte ptr [eax],ah 004134B4: 2032 and byte ptr [edx],dh 004134B6: 37 aaa 004134B7: 3133 xor dword ptr [ebx],esi 004134B9: 3800 cmp byte ptr [eax],al 004134BB: 0000 add byte ptr [eax],al 004134BD: 0000 add byte ptr [eax],al 004134BF: 0000 add byte ptr [eax],al 004134A0: 2020 and byte ptr [eax],ah 004134A2: 2020 and byte ptr [eax],ah 004134A4: 2020 and byte ptr [eax],ah 004134A6: 45 inc ebp 004134A7: 2D6D61696C sub eax,6C69616D 004134AC: 2020 and byte ptr [eax],ah 004134AE: 203A and byte ptr [edx],bh 004134B0: 2064696E and byte ptr [ecx+ebp*2+6E],ah 004134B4: 672D626F7940 sub eax,40796F62 004134BA: 6E outsb dx,ds:[esi] 004134BB: 657465 jz 00413523 004134BE: 61 popad 004134BF: 7365 jnb 00413526 004134C1: 2E636F6D arpl word ptr cs:[edi+6D],bp 004134C5: 200D0A202020 and byte ptr [2020200A],cl 004134CB: 2020 and byte ptr [eax],ah 004134CD: 2020 and byte ptr [eax],ah 004134CF: 2020 and byte ptr [eax],ah 004134D1: 2020 and byte ptr [eax],ah 004134D3: 2020 and byte ptr [eax],ah 004134D5: 2020 and byte ptr [eax],ah 004134D7: 2020 and byte ptr [eax],ah 004134D9: 2020 and byte ptr [eax],ah 004134DB: 48 dec eax 004134DC: 6F outsd dx,ds:[esi] 004134DD: 6D insd es:[edi],dx 004134DE: 657061 jo 00413542 004134E1: 6765203A and byte ptr gs:[bp+si],bh 004134E5: 206874 and byte ptr [eax+74],ch 004134E8: 7470 jz 0041355A 004134EA: 3A2F cmp ch,byte ptr [edi] 004134EC: 2F das 004134ED: 667364 jnb 00413554 004134F0: 622E bound ebp,dword ptr [esi] 004134F2: 7965 jns 00413559 004134F4: 61 popad 004134F5: 682E6E6574 push 74656E2E 004134FA: 2020 and byte ptr [eax],ah 004134FC: 2020 and byte ptr [eax],ah 004134FE: 2020 and byte ptr [eax],ah 00413500: 2020 and byte ptr [eax],ah 00413502: 2020 and byte ptr [eax],ah 00413504: 2020 and byte ptr [eax],ah 00413506: 200D0A0D0A00 and byte ptr [000A0D0A],cl 0041350C: 0000 add byte ptr [eax],al 0041350E: 0000 add byte ptr [eax],al 00413510: 0000 add byte ptr [eax],al 00413512: 0000 add byte ptr [eax],al 00413514: 0000 add byte ptr [eax],al 00413516: 0000 add byte ptr [eax],al 00413518: 0000 add byte ptr [eax],al 0041351A: 0000 add byte ptr [eax],al 0041351C: 0000 add byte ptr [eax],al 0041351E: 0000 add byte ptr [eax],al 00413520: 0000 add byte ptr [eax],al 00413522: 0000 add byte ptr [eax],al 00413524: 0000 add byte ptr [eax],al 00413526: 0000 add byte ptr [eax],al 00413528: 0000 add byte ptr [eax],al 0041352A: 0000 add byte ptr [eax],al 0041352C: 0000 add byte ptr [eax],al 0041352E: 0000 add byte ptr [eax],al 00413530: 0000 add byte ptr [eax],al 00413532: 0000 add byte ptr [eax],al 00413534: 0000 add byte ptr [eax],al 00413536: 0000 add byte ptr [eax],al 00413538: 0000 add byte ptr [eax],al 0041353A: 0000 add byte ptr [eax],al 0041353C: 0000 add byte ptr [eax],al 0041353E: 0000 add byte ptr [eax],al 00413540: 0000 add byte ptr [eax],al 00413542: 0000 add byte ptr [eax],al 00413544: 49 dec ecx 00413545: 6E outsb dx,ds:[esi] 00413546: 7661 jbe 004135A9 00413548: 6C insb es:[edi],dx 00413549: 6964202050617373 imul esp,dword ptr [eax+20],73736150 00413551: 57 push edi 00413552: 6F outsd dx,ds:[esi] 00413553: 7264 jb 004135B9 00413555: 0000 add byte ptr [eax],al 00413557: 0000 add byte ptr [eax],al 00413559: 0000 add byte ptr [eax],al 0041355B: 0000 add byte ptr [eax],al 0041355D: 0000 add byte ptr [eax],al 0041355F: 0000 add byte ptr [eax],al 00413561: 0000 add byte ptr [eax],al 00413563: 0000 add byte ptr [eax],al 00413565: 0000 add byte ptr [eax],al 00413567: 0000 add byte ptr [eax],al 00413569: 0000 add byte ptr [eax],al 0041356B: 0000 add byte ptr [eax],al 0041356D: 0000 add byte ptr [eax],al 0041356F: 0000 add byte ptr [eax],al 00413571: 0000 add byte ptr [eax],al 00413573: 0000 add byte ptr [eax],al 00413575: 0000 add byte ptr [eax],al 00413577: 0000 add byte ptr [eax],al 00413579: 0000 add byte ptr [eax],al 0041357B: 0000 add byte ptr [eax],al 0041357D: 0000 add byte ptr [eax],al 0041357F: 0000 add byte ptr [eax],al 00413581: 0000 add byte ptr [eax],al 00413583: 0000 add byte ptr [eax],al 00413585: 0000 add byte ptr [eax],al 00413587: 0000 add byte ptr [eax],al 00413589: 0000 add byte ptr [eax],al 0041358B: 0000 add byte ptr [eax],al 0041358D: 0000 add byte ptr [eax],al 0041358F: 0000 add byte ptr [eax],al 00413591: 0000 add byte ptr [eax],al 00413593: 0000 add byte ptr [eax],al 00413595: 0000 add byte ptr [eax],al 00413597: 0000 add byte ptr [eax],al 00413599: 0000 add byte ptr [eax],al 0041359B: 0000 add byte ptr [eax],al 0041359D: 0000 add byte ptr [eax],al 0041359F: 0000 add byte ptr [eax],al 004135A1: 0000 add byte ptr [eax],al 004135A3: 0000 add byte ptr [eax],al 004135A5: 0000 add byte ptr [eax],al 004135A7: 005265 add byte ptr [edx+65],dl 004135AA: 6769737465722053 imul esi,dword ptr [bp+di+74],53207265 004135B2: 7563 jnz 00413617 004135B4: 636573 arpl word ptr [ebp+73],sp 004135B7: 7366 jnb 0041361F 004135B9: 756C jnz 00413627 004135BB: 6C insb es:[edi],dx 004135BC: 7900 jns 004135BE 004135BE: 0000 add byte ptr [eax],al 004135C0: 0000 add byte ptr [eax],al 004135C2: 0000 add byte ptr [eax],al 004135C4: 0000 add byte ptr [eax],al 004135C6: 0000 add byte ptr [eax],al 004135C8: 0000 add byte ptr [eax],al 004135CA: 0000 add byte ptr [eax],al 004135CC: 0000 add byte ptr [eax],al 004135CE: 0000 add byte ptr [eax],al 004135D0: 0000 add byte ptr [eax],al 004135D2: 0000 add byte ptr [eax],al 004135D4: 0000 add byte ptr [eax],al 004135D6: 0000 add byte ptr [eax],al 004135D8: 0000 add byte ptr [eax],al 004135DA: 0000 add byte ptr [eax],al 004135DC: 0000 add byte ptr [eax],al 004135DE: 0000 add byte ptr [eax],al 004135E0: 0000 add byte ptr [eax],al 004135E2: 0000 add byte ptr [eax],al 004135E4: 0000 add byte ptr [eax],al 004135E6: 0000 add byte ptr [eax],al 004135E8: 0000 add byte ptr [eax],al 004135EA: 0000 add byte ptr [eax],al 004135EC: 0000 add byte ptr [eax],al 004135EE: 0000 add byte ptr [eax],al 004135F0: 0000 add byte ptr [eax],al 004135F2: 0000 add byte ptr [eax],al 004135F4: 0000 add byte ptr [eax],al 004135F6: 0000 add byte ptr [eax],al 004135F8: 0000 add byte ptr [eax],al 004135FA: 0000 add byte ptr [eax],al 004135FC: 0000 add byte ptr [eax],al 004135FE: 0000 add byte ptr [eax],al 00413600: 0000 add byte ptr [eax],al 00413602: 0000 add byte ptr [eax],al 00413604: 0000 add byte ptr [eax],al 00413606: 0000 add byte ptr [eax],al 00413608: 0000 add byte ptr [eax],al 0041360A: 0000 add byte ptr [eax],al 0041360C: 49 dec ecx 0041360D: 6E outsb dx,ds:[esi] 0041360E: 7661 jbe 00413671 00413610: 6C insb es:[edi],dx 00413611: 6964205365726961 imul esp,dword ptr [eax+53],61697265 00413619: 6C insb es:[edi],dx 0041361A: 204E4F and byte ptr [esi+4F],cl 0041361D: 0000 add byte ptr [eax],al 0041361F: 0000 add byte ptr [eax],al 00413621: 0000 add byte ptr [eax],al 00413623: 0000 add byte ptr [eax],al 00413625: 0000 add byte ptr [eax],al 00413627: 0000 add byte ptr [eax],al 00413629: 0000 add byte ptr [eax],al 0041362B: 0000 add byte ptr [eax],al 0041362D: 0000 add byte ptr [eax],al 0041362F: 0000 add byte ptr [eax],al 00413631: 0000 add byte ptr [eax],al 00413633: 0000 add byte ptr [eax],al 00413635: 0000 add byte ptr [eax],al 00413637: 0000 add byte ptr [eax],al 00413639: 0000 add byte ptr [eax],al 0041363B: 0000 add byte ptr [eax],al 0041363D: 0000 add byte ptr [eax],al 0041363F: 0000 add byte ptr [eax],al 00413641: 0000 add byte ptr [eax],al 00413643: 0000 add byte ptr [eax],al 00413645: 0000 add byte ptr [eax],al 00413647: 0000 add byte ptr [eax],al 00413649: 0000 add byte ptr [eax],al 0041364B: 0000 add byte ptr [eax],al 0041364D: 0000 add byte ptr [eax],al 0041364F: 0000 add byte ptr [eax],al 00413651: 0000 add byte ptr [eax],al 00413653: 0000 add byte ptr [eax],al 00413655: 0000 add byte ptr [eax],al 00413657: 0000 add byte ptr [eax],al 00413659: 0000 add byte ptr [eax],al 0041365B: 0000 add byte ptr [eax],al 0041365D: 0000 add byte ptr [eax],al 0041365F: 0000 add byte ptr [eax],al 00413661: 0000 add byte ptr [eax],al 00413663: 0000 add byte ptr [eax],al 00413665: 0000 add byte ptr [eax],al 00413667: 0000 add byte ptr [eax],al 00413669: 0000 add byte ptr [eax],al 0041366B: 0000 add byte ptr [eax],al 0041366D: 0000 add byte ptr [eax],al 0041366F: 004520 add byte ptr [ebp+20],al 00413672: 0020 add byte ptr [eax],ah 00413674: 0020 add byte ptr [eax],ah 00413676: 2020 and byte ptr [eax],ah 00413678: 4C dec esp 00413679: 6F outsd dx,ds:[esi] 0041367A: 61 popad 0041367B: 642020 and byte ptr fs:[eax],ah 0041367E: 20446961 and byte ptr [ecx+ebp*2+61],al 00413682: 6C insb es:[edi],dx 00413683: 2E646C insb es:[edi],dx 00413686: 6C insb es:[edi],dx 00413687: 2020 and byte ptr [eax],ah 00413689: 6661 popa 0041368B: 6C insb es:[edi],dx 0041368C: 7365 jnb 004136F3 0041368E: 642120 and dword ptr fs:[eax],esp 00413691: 2020 and byte ptr [eax],ah 00413693: 00D0 add al,dl 00413695: 07 pop es 00413696: 0800 or byte ptr [eax],al 00413698: 0400 add al,00 0041369A: 1100 adc dword ptr [eax],eax 0041369C: 0800 or byte ptr [eax],al 0041369E: 3800 cmp byte ptr [eax],al 004136A0: 1900 sbb dword ptr [eax],eax 004136A2: EE out dx,al 004136A3: 0200 add al,byte ptr [eax] 004136A5: 346C xor al,6C 004136A7: 0000 add byte ptr [eax],al 004136A9: 0000 add byte ptr [eax],al 004136AB: 0000 add byte ptr [eax],al 004136AD: 60 pushad 004136AE: BB85BA4000 mov ebx,0040BA85 004136B3: 03DD add ebx,ebp 004136B5: 807B0800 cmp byte ptr [ebx+08],00 004136B9: 746D jz 00413728 004136BB: 8BC3 mov eax,ebx 004136BD: 83C008 add eax,00000008 004136C0: 50 push eax 004136C1: FF9564BF4000 call dword ptr [ebp+0040BF64] 004136C7: 89857DBA4000 mov dword ptr [ebp+0040BA7D],eax 004136CD: 83F800 cmp eax,00000000 004136D0: 750C jnz 004136DE 004136D2: C78581BA400000000000 mov dword ptr [ebp+0040BA81],00000000 004136DC: EB4A jmp 00413728 004136DE: 8B33 mov esi,dword ptr [ebx] 004136E0: 8B7B04 mov edi,dword ptr [ebx+04] 004136E3: 03F5 add esi,ebp 004136E5: 03FD add edi,ebp 004136E7: 803E00 cmp byte ptr [esi],00 004136EA: 750E jnz 004136FA 004136EC: 83C308 add ebx,00000008 004136EF: 803B00 cmp byte ptr [ebx],00 004136F2: 7403 jz 004136F7 004136F4: 43 inc ebx 004136F5: EBF8 jmp 004136EF 004136F7: 43 inc ebx 004136F8: EBBB jmp 004136B5 004136FA: 56 push esi 004136FB: FFB57DBA4000 push dword ptr [ebp+0040BA7D] 00413701: FF9568BF4000 call dword ptr [ebp+0040BF68] 00413707: 83F800 cmp eax,00000000 0041370A: 750C jnz 00413718 0041370C: C78581BA400000000000 mov dword ptr [ebp+0040BA81],00000000 00413716: EB10 jmp 00413728 00413718: 8907 mov dword ptr [edi],eax 0041371A: 83C704 add edi,00000004 0041371D: 803E00 cmp byte ptr [esi],00 00413720: 7403 jz 00413725 00413722: 46 inc esi 00413723: EBF8 jmp 0041371D 00413725: 46 inc esi 00413726: EBBF jmp 004136E7 00413728: 61 popad 00413729: 8B8581BA4000 mov eax,dword ptr [ebp+0040BA81] 0041372F: C3 ret 00413730: 0000 add byte ptr [eax],al 00413732: 0000 add byte ptr [eax],al 00413734: 0100 add dword ptr [eax],eax 00413736: 0000 add byte ptr [eax],al 00413738: E3BA jecxz 004136F4 0041373A: 40 inc eax 0041373B: 009FBB40006B add byte ptr [edi+6B0040BB],bl 00413741: 65726E jb 004137B2 00413744: 656C insb es:[edi],dx 00413746: 3332 xor esi,dword ptr [edx] 00413748: 2E646C insb es:[edi],dx 0041374B: 6C insb es:[edi],dx 0041374C: 00D3 add bl,dl 0041374E: BB400000BC mov ebx,BC000040 00413753: 40 inc eax 00413754: 007573 add byte ptr [ebp+73],dh 00413757: 657233 jb 0041378D 0041375A: 322E xor ch,byte ptr [esi] 0041375C: 646C insb es:[edi],dx 0041375E: 6C insb es:[edi],dx 0041375F: 0014BC add byte ptr [esp+edi*4],dl 00413762: 40 inc eax 00413763: 0072BC add byte ptr [edx-44],dh 00413766: 40 inc eax 00413767: 006164 add byte ptr [ecx+64],ah 0041376A: 7661 jbe 004137CD 0041376C: 7069 jo 004137D7 0041376E: 3332 xor esi,dword ptr [edx] 00413770: 2E646C insb es:[edi],dx 00413773: 6C insb es:[edi],dx 00413774: 008EBC4000B8 add byte ptr [esi-47FFBF44],cl 0041377A: BC40006469 mov esp,69640040 0041377F: 61 popad 00413780: 6C insb es:[edi],dx 00413781: 2E646C insb es:[edi],dx 00413784: 6C insb es:[edi],dx 00413785: 0000 add byte ptr [eax],al 00413787: 0000 add byte ptr [eax],al 00413789: 0000 add byte ptr [eax],al 0041378B: 0000 add byte ptr [eax],al 0041378D: 0000 add byte ptr [eax],al 0041378F: 0020 add byte ptr [eax],ah 00413791: 2020 and byte ptr [eax],ah 00413793: 2020 and byte ptr [eax],ah 00413795: 3237 xor dh,byte ptr [edi] 00413797: 3133 xor dword ptr [ebx],esi 00413799: 3800 cmp byte ptr [eax],al 0041379B: 0000 add byte ptr [eax],al 0041379D: 0000 add byte ptr [eax],al 0041379F: 0000 add byte ptr [eax],al 00413780: 6C insb es:[edi],dx 00413781: 2E646C insb es:[edi],dx 00413784: 6C insb es:[edi],dx 00413785: 0000 add byte ptr [eax],al 00413787: 0000 add byte ptr [eax],al 00413789: 0000 add byte ptr [eax],al 0041378B: 0000 add byte ptr [eax],al 0041378D: 0000 add byte ptr [eax],al 0041378F: 0000 add byte ptr [eax],al 00413791: 0000 add byte ptr [eax],al 00413793: 0000 add byte ptr [eax],al 00413795: 004765 add byte ptr [edi+65],al 00413798: 7453 jz 004137ED 0041379A: 7973 jns 0041380F 0041379C: 7465 jz 00413803 0041379E: 6D insd es:[edi],dx 0041379F: 54 push esp 004137A0: 696D6500437265 imul ebp,dword ptr [ebp+65],65724300 004137A7: 61 popad 004137A8: 7465 jz 0041380F 004137AA: 46 inc esi 004137AB: 696C654100577269 imul ebp,dword ptr [ebp+41],69725700 004137B3: 7465 jz 0041381A 004137B5: 46 inc esi 004137B6: 696C6500436C6F73 imul ebp,dword ptr [ebp],736F6C43 004137BE: 6548 dec eax 004137C0: 61 popad 004137C1: 6E outsb dx,ds:[esi] 004137C2: 646C insb es:[edi],dx 004137C4: 65004372 add byte ptr gs:[ebx+72],al 004137C8: 6561 popad 004137CA: 7465 jz 00413831 004137CC: 50 push eax 004137CD: 726F jb 0041383E 004137CF: 636573 arpl word ptr [ebp+73],sp 004137D2: 7341 jnb 00413815 004137D4: 004765 add byte ptr [edi+65],al 004137D7: 7445 jz 0041381E 004137D9: 7869 js 00413844 004137DB: 7443 jz 00413820 004137DD: 6F outsd dx,ds:[esi] 004137DE: 646550 push eax 004137E1: 726F jb 00413852 004137E3: 636573 arpl word ptr [ebp+73],sp 004137E6: 7300 jnb 004137E8 004137E8: 47 inc edi 004137E9: 657444 jz 00413830 004137EC: 69736B46726565 imul esi,dword ptr [ebx+6B],65657246 004137F3: 53 push ebx 004137F4: 7061 jo 00413857 004137F6: 636545 arpl word ptr [ebp+45],sp 004137F9: 7841 js 0041383C 004137FB: 0044656C add byte ptr [ebp+6C],al 004137FF: 657465 jz 00413867 00413802: 46 inc esi 00413803: 696C654100476574 imul ebp,dword ptr [ebp+41],74654700 0041380B: 56 push esi 0041380C: 6F outsd dx,ds:[esi] 0041380D: 6C insb es:[edi],dx 0041380E: 756D jnz 0041387D 00413810: 6549 dec ecx 00413812: 6E outsb dx,ds:[esi] 00413813: 666F outsw dx,ds:[esi] 00413815: 726D jb 00413884 00413817: 61 popad 00413818: 7469 jz 00413883 0041381A: 6F outsd dx,ds:[esi] 0041381B: 6E outsb dx,ds:[esi] 0041381C: 41 inc ecx 0041381D: 004765 add byte ptr [edi+65],al 00413820: 744D jz 0041386F 00413822: 6F outsd dx,ds:[esi] 00413823: 64756C jnz 00413892 00413826: 6548 dec eax 00413828: 61 popad 00413829: 6E outsb dx,ds:[esi] 0041382A: 646C insb es:[edi],dx 0041382C: 6541 inc ecx 0041382E: 005265 add byte ptr [edx+65],dl 00413831: 61 popad 00413832: 6450 push eax 00413834: 726F jb 004138A5 00413836: 636573 arpl word ptr [ebp+73],sp 00413839: 734D jnb 00413888 0041383B: 656D insd es:[edi],dx 0041383D: 6F outsd dx,ds:[esi] 0041383E: 7279 jb 004138B9 00413840: 005669 add byte ptr [esi+69],dl 00413843: 7274 jb 004138B9 00413845: 7561 jnz 004138A8 00413847: 6C insb es:[edi],dx 00413848: 41 inc ecx 00413849: 6C insb es:[edi],dx 0041384A: 6C insb es:[edi],dx 0041384B: 6F outsd dx,ds:[esi] 0041384C: 6300 arpl word ptr [eax],ax 0041384E: 0000 add byte ptr [eax],al 00413850: 0000 add byte ptr [eax],al 00413852: 0000 add byte ptr [eax],al 00413854: 0000 add byte ptr [eax],al 00413856: 0000 add byte ptr [eax],al 00413858: 0000 add byte ptr [eax],al 0041385A: 0000 add byte ptr [eax],al 0041385C: 0000 add byte ptr [eax],al 0041385E: 0000 add byte ptr [eax],al 00413860: 0000 add byte ptr [eax],al 00413862: 0000 add byte ptr [eax],al 00413864: 0000 add byte ptr [eax],al 00413866: 0000 add byte ptr [eax],al 00413868: 0000 add byte ptr [eax],al 0041386A: 0000 add byte ptr [eax],al 0041386C: 0000 add byte ptr [eax],al 0041386E: 0000 add byte ptr [eax],al 00413870: 0000 add byte ptr [eax],al 00413872: 0000 add byte ptr [eax],al 00413874: 0000 add byte ptr [eax],al 00413876: 0000 add byte ptr [eax],al 00413878: 0000 add byte ptr [eax],al 0041387A: 0000 add byte ptr [eax],al 0041387C: 0000 add byte ptr [eax],al 0041387E: 0000 add byte ptr [eax],al 00413880: 0000 add byte ptr [eax],al 00413882: 0000 add byte ptr [eax],al 00413884: 0000 add byte ptr [eax],al 00413886: 4D dec ebp 00413887: 657373 jnb 004138FD 0041388A: 61 popad 0041388B: 676542 inc edx 0041388E: 6F outsd dx,ds:[esi] 0041388F: 7841 js 004138D2 00413891: 007773 add byte ptr [edi+73],dh 00413894: 7072 jo 00413908 00413896: 696E7466410053 imul ebp,dword ptr [esi+74],53004166 0041389D: 657454 jz 004138F4 004138A0: 696D6572004B69 imul ebp,dword ptr [ebp+65],694B0072 004138A7: 6C insb es:[edi],dx 004138A8: 6C insb es:[edi],dx 004138A9: 54 push esp 004138AA: 696D6572000000 imul ebp,dword ptr [ebp+65],00000072 004138B1: 0000 add byte ptr [eax],al 004138B3: 0000 add byte ptr [eax],al 004138B5: 0000 add byte ptr [eax],al 004138B7: 0000 add byte ptr [eax],al 004138B9: 0000 add byte ptr [eax],al 004138BB: 0000 add byte ptr [eax],al 004138BD: 0000 add byte ptr [eax],al 004138BF: 0000 add byte ptr [eax],al 004138C1: 0000 add byte ptr [eax],al 004138C3: 0000 add byte ptr [eax],al 004138C5: 0000 add byte ptr [eax],al 004138C7: 52 push edx 004138C8: 65674F dec edi 004138CB: 7065 jo 00413932 004138CD: 6E outsb dx,ds:[esi] 004138CE: 4B dec ebx 004138CF: 657945 jns 00413917 004138D2: 7841 js 00413915 004138D4: 005265 add byte ptr [edx+65],dl 004138D7: 6743 inc ebx 004138D9: 7265 jb 00413940 004138DB: 61 popad 004138DC: 7465 jz 00413943 004138DE: 4B dec ebx 004138DF: 657945 jns 00413927 004138E2: 7841 js 00413925 004138E4: 005265 add byte ptr [edx+65],dl 004138E7: 6743 inc ebx 004138E9: 6C insb es:[edi],dx 004138EA: 6F outsd dx,ds:[esi] 004138EB: 7365 jnb 00413952 004138ED: 4B dec ebx 004138EE: 657900 jns 004138F1 004138F1: 52 push edx 004138F2: 656751 push ecx 004138F5: 7565 jnz 0041395C 004138F7: 7279 jb 00413972 004138F9: 56 push esi 004138FA: 61 popad 004138FB: 6C insb es:[edi],dx 004138FC: 7565 jnz 00413963 004138FE: 45 inc ebp 004138FF: 7841 js 00413942 00413901: 005265 add byte ptr [edx+65],dl 00413904: 6753 push ebx 00413906: 657456 jz 0041395F 00413909: 61 popad 0041390A: 6C insb es:[edi],dx 0041390B: 7565 jnz 00413972 0041390D: 45 inc ebp 0041390E: 7841 js 00413951 00413910: 005265 add byte ptr [edx+65],dl 00413913: 6744 inc esp 00413915: 656C insb es:[edi],dx 00413917: 657465 jz 0041397F 0041391A: 56 push esi 0041391B: 61 popad 0041391C: 6C insb es:[edi],dx 0041391D: 7565 jnz 00413984 0041391F: 41 inc ecx 00413920: 0000 add byte ptr [eax],al 00413922: 0000 add byte ptr [eax],al 00413924: 0000 add byte ptr [eax],al 00413926: 0000 add byte ptr [eax],al 00413928: 0000 add byte ptr [eax],al 0041392A: 0000 add byte ptr [eax],al 0041392C: 0000 add byte ptr [eax],al 0041392E: 0000 add byte ptr [eax],al 00413930: 0000 add byte ptr [eax],al 00413932: 0000 add byte ptr [eax],al 00413934: 0000 add byte ptr [eax],al 00413936: 0000 add byte ptr [eax],al 00413938: 0000 add byte ptr [eax],al 0041393A: 0000 add byte ptr [eax],al 0041393C: 0000 add byte ptr [eax],al 0041393E: 0000 add byte ptr [eax],al 00413940: 004765 add byte ptr [edi+65],al 00413943: 7450 jz 00413995 00413945: 61 popad 00413946: 7373 jnb 004139BB 00413948: 776F jnbe 004139B9 0041394A: 7264 jb 004139B0 0041394C: 004765 add byte ptr [edi+65],al 0041394F: 7452 jz 004139A3 00413951: 656769737465720053 imul esi,dword ptr gs:[bp+di+74],53007265 0041395A: 686F775472 push 7254776F 0041395F: 7957 jns 004139B8 00413961: 696E646F770000 imul ebp,dword ptr [esi+64],0000776F 00413968: 0000 add byte ptr [eax],al 0041396A: 0000 add byte ptr [eax],al 0041396C: 0000 add byte ptr [eax],al 0041396E: 0000 add byte ptr [eax],al 00413970: 0000 add byte ptr [eax],al 00413972: 0000 add byte ptr [eax],al 00413974: 0000 add byte ptr [eax],al 00413976: 0000 add byte ptr [eax],al 00413978: 0000 add byte ptr [eax],al 0041397A: 0000 add byte ptr [eax],al 0041397C: 0000 add byte ptr [eax],al 0041397E: 0000 add byte ptr [eax],al 00413980: 0000 add byte ptr [eax],al 00413982: 0000 add byte ptr [eax],al 00413984: 000000 ?? ------------------------------------------------------- ------------------最后结束的代码------------------------- 00413987: 60 pushad 00413988: 8BE8 mov ebp,eax 0041398A: 80BD5DBD400000 cmp byte ptr [ebp+0040BD5D],00 00413991: 7555 jnz 004139E8 <--是否注册失败，不是跳走 00413993: BE63BD4000 mov esi,0040BD63 00413998: 03F5 add esi,ebp <--413A16 0041399A: C606C3 mov byte ptr [esi],C3 0041399D: 8B8573BE4000 mov eax,dword ptr [ebp+0040BE73] 004139A3: 83F800 cmp eax,00000000 004139A6: 7407 jz 004139AF 004139A8: 898577BE4000 mov dword ptr [ebp+0040BE77],eax 004139AE: CC int 3 004139AF: BE53BD4000 mov esi,0040BD53 004139B4: 03F5 add esi,ebp 004139B6: 0F010E sidt dword ptr [esi] 004139B9: 8B7602 mov esi,dword ptr [esi+02] 004139BC: 668B8567BE4000 mov ax,word ptr [ebp+0040BE67] 004139C3: 668B9D69BE4000 mov bx,word ptr [ebp+0040BE69] 004139CA: 66894608 mov word ptr [esi+08],ax 004139CE: 66895E0E mov word ptr [esi+0E],bx 004139D2: 668B856BBE4000 mov ax,word ptr [ebp+0040BE6B] 004139D9: 668B9D6DBE4000 mov bx,word ptr [ebp+0040BE6D] 004139E0: 66894618 mov word ptr [esi+18],ax 004139E4: 66895E1E mov word ptr [esi+1E],bx 004139E8: 61 popad 004139E9: 56 push esi 004139EA: 51 push ecx 004139EB: BE4D534000 mov esi,0040534D 004139F0: 03F0 add esi,eax 004139F2: B9F7690000 mov ecx,000069F7 004139F7: C60600 mov byte ptr [esi],00 004139FA: 46 inc esi 004139FB: E2FA loop 004139F7 004139FD: 59 pop ecx 004139FE: 5E pop esi 004139FF: 58 pop eax 00413A00: FFE0 jmp eax ------------------------------------------------ 希望大家多到此地捧捧场。


幻影v1.5b3脱壳分析笔记之二 [作者]: ljttt [日期]: 2000-09-15 以上是一段被我处理掉的代码，从这里开始分析 00013381: 5E pop esi 00013382: E800000000 call 00013387 <---JMP 00013387: 5D pop ebp <---获得 EBP = 413387 00013388: 8BD5 mov edx,ebp ***********说明以后的一段代码常以EBP做为基地址************** 0001338A: 81EDD4A64000 sub ebp,0040A6D4 <---EBP=413387-40A6D4 = 8CB3 00013390: FA cli 00013391: 58 pop eax 00013392: 80E401 and ah,01 00013395: 32C0 xor al,al 00013397: BE09A74000 mov esi,0040A709 0001339C: 03F5 add esi,ebp 0001339E: B946160000 mov ecx,00001646 000133A3: 03F1 add esi,ecx 000133A5: 4E dec esi 000133A6: 90 nop 000133A7: 90 nop 000133A8: 90 nop 000133A9: 90 nop 000133AA: 90 nop 000133AB: 90 nop 000133AC: 90 nop 000133AD: 90 nop 000133AE: 90 nop 000133AF: 90 nop 000133B0: FA cli 000133B1: 6681BD09A740009090 cmp word ptr [ebp+0040A709],9090 000133BA: 75FE jnz 000133BA 000133BC: 90 nop 000133BD: 90 nop 000133BE: 90 nop 000133BF: 2B95CBB24000 sub edx,dword ptr [ebp+0040B2CB] 000133C5: 81EA87530000 sub edx,00005387 000133CB: 8995D3B24000 mov dword ptr [ebp+0040B2D3],edx ********此处调用加载各个函数库****************** ID:CALL000146AD 000133D1: E8D7120000 call 000146AD <---加载函数库 000133D6: 83F800 cmp eax,00000000 000133D9: 7520 jnz 000133FB <---成功跳走 ****************显示Dial.dll加载失败，并退出程序 000133DB: B8C0B94000 mov eax,0040B9C0 000133E0: 03C5 add eax,ebp 000133E2: BBC2B94000 mov ebx,0040B9C2 000133E7: 03DD add ebx,ebp 000133E9: 6A30 push 00000030 000133EB: 50 push eax 000133EC: 53 push ebx 000133ED: 6A00 push 00000000 000133EF: FF9500BC4000 call dword ptr [ebp+0040BC00] <---MessageBoxA 000133F5: FF956CBF4000 call dword ptr [ebp+0040BF6C] <---ExitProcess 000133FB: 8B8DF2B94000 mov ecx,dword ptr [ebp+0040B9F2] <---跳到此处 ********申请内存********** 00013401: 83C120 add ecx,00000020 00013404: 51 push ecx 00013405: 6A40 push 00000040 00013407: 6800201000 push 00102000 0001340C: 51 push ecx 0001340D: 6A00 push 00000000 0001340F: FF95CBBB4000 call dword ptr [ebp+0040BBCB] <---VirtualAlloc 00013415: 59 pop ecx *************申请内存********** 00013416: 6A40 push 00000040 00013418: 6800101000 push 00101000 0001341D: 51 push ecx 0001341E: 50 push eax 0001341F: FF95CBBB4000 call dword ptr [ebp+0040BBCB] <---VirtualAlloc 00013425: 8BD0 mov edx,eax 00013427: 8BF8 mov edi,eax ************搬家*************** 00013429: BE4D534000 mov esi,0040534D 0001342E: 03F5 add esi,ebp 00013430: 8B8DF2B94000 mov ecx,dword ptr [ebp+0040B9F2] 00013436: F3A4 repe movsb es:[edi],ds:[esi] <----复制到新位置 00013438: B893A74000 mov eax,0040A793 0001343D: 2D4D534000 sub eax,0040534D 00013442: 03C2 add eax,edx 00013444: 50 push eax 00013445: C3 ret <----到新地址执行下面的语句 *******把原来地方的代码清零************* 00013446: BF4D534000 mov edi,0040534D 0001344B: 03FD add edi,ebp 0001344D: 8B8DF2B94000 mov ecx,dword ptr [ebp+0040B9F2] 00013453: 32C0 xor al,al 00013455: F3AA repe stosb es:[edi],al <----把原来的位置的内容清零 *******取新的EBP值，以后许多地方以EBP为基地址********* 00013457: E800000000 call 0001345C <---JMP语句 0001345C: 5D pop ebp <---EBP = 41345C 0001345D: 81EDA9A74000 sub ebp,0040A7A9 <---EBP = 41345C-40A7A9 = 8CB3 ************以下是一段检测跟踪的代码************ 00013463: BEDDA74000 mov esi,0040A7DD 00013468: 03F5 add esi,ebp 0001346A: 6A00 push 00000000 0001346C: 6A00 push 00000000 0001346E: 6A00 push 00000000 00013470: 6A00 push 00000000 00013472: 6A00 push 00000000 00013474: 6A00 push 00000000 00013476: 56 push esi 00013477: FF95A3BB4000 call dword ptr [ebp+0040BBA3] <----CreateFileA 0001347D: 83F8FF cmp eax,FFFFFFFF 00013480: 7568 jnz 000134EA <----判断是否发现跟踪 00013482: 46 inc esi 00013483: 803E00 cmp byte ptr [esi],00 00013486: 75FA jnz 00013482 00013488: 46 inc esi 00013489: 803E00 cmp byte ptr [esi],00 0001348C: 75DC jnz 0001346A 0001348E: EB5A jmp 000134EA <----跳走 *******************这里不是代码区******************* 00013490: 5C pop esp 00013491: 5C pop esp 00013492: 2E5C pop esp 00013494: 54 push esp 00013495: 52 push edx 00013496: 57 push edi 00013497: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 0001349B: 5C pop esp 0001349C: 54 push esp 0001349D: 52 push edx 0001349E: 57 push edi 0001349F: 3230 xor dh,byte ptr [eax] 000134A1: 3030 xor byte ptr [eax],dh 000134A3: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 000134A7: 5C pop esp 000134A8: 54 push esp 000134A9: 52 push edx 000134AA: 57 push edi 000134AB: 44 inc esp 000134AC: 45 inc ebp 000134AD: 42 inc edx 000134AE: 55 push ebp 000134AF: 47 inc edi 000134B0: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 000134B4: 5C pop esp 000134B5: 52 push edx 000134B6: 45 inc ebp 000134B7: 47 inc edi 000134B8: 56 push esi 000134B9: 58 pop eax 000134BA: 44 inc esp 000134BB: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 000134BF: 5C pop esp 000134C0: 4E dec esi 000134C1: 54 push esp 000134C2: 49 dec ecx 000134C3: 43 inc ebx 000134C4: 45 inc ebp 000134C5: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 000134C9: 5C pop esp 000134CA: 53 push ebx 000134CB: 49 dec ecx 000134CC: 43 inc ebx 000134CD: 45 inc ebp 000134CE: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 000134D2: 5C pop esp 000134D3: 56 push esi 000134D4: 4B dec ebx 000134D5: 45 inc ebp 000134D6: 59 pop ecx 000134D7: 50 push eax 000134D8: 52 push edx 000134D9: 4F dec edi 000134DA: 44 inc esp 000134DB: 005C5C2E add byte ptr [esp+ebx*2+2E],bl 000134DF: 5C pop esp 000134E0: 46 inc esi 000134E1: 49 dec ecx 000134E2: 4C dec esp 000134E3: 45 inc ebp 000134E4: 56 push esi 000134E5: 58 pop eax 000134E6: 44 inc esp 000134E7: 0000 add byte ptr [eax],al **************************非代码区***************** **************判断检测的结果************* 000134E9: 0083F8FF7406 add byte ptr [ebx+0674FFF8],al <---跳转，不跳就死定了 ***********退出程序 000134EF: FF956CBF4000 call dword ptr [ebp+0040BF6C] <---ExitProcess ***********这是一段反跟踪的代码****************** 000134F5: 60 pushad <---跳到此处 000134F6: BE53BD4000 mov esi,0040BD53 000134FB: 03F5 add esi,ebp 000134FD: 0F010E sidt dword ptr [esi] <---获取IDTR内容 00013500: 8B7602 mov esi,dword ptr [esi+02] <---获取IDT表的基地址 00013503: 668B4608 mov ax,word ptr [esi+08] <---取int 1的低位偏移 00013507: 66052302 add ax,0223 <---计算新值 0001350B: 66894608 mov word ptr [esi+08],ax <---保存int 1新偏移值 0001350F: 668B460E mov ax,word ptr [esi+0E] <---取int 1的高位偏移 00013513: 668B5E06 mov bx,word ptr [esi+06] <---取int 0的高位偏移 00013517: 663BC3 cmp ax,bx <---是否相等 0001351A: 740E jz 0001352A <---相等则跳转 0001351C: 668B4608 mov ax,word ptr [esi+08] <---取int 1的低位偏移 00013520: 668B5E18 mov bx,word ptr [esi+18] <---取int 3的低位偏移 00013524: FA cli 00013525: 663BC3 cmp ax,bx <---判断是否相等 00013528: 7400 jz 0001352A <---相等则跳转 0001352A: 668B4608 mov ax,word ptr [esi+08] <---取int 1的低位偏移 0001352E: 668B5E0E mov bx,word ptr [esi+0E] <---取int 1的高位偏移 00013532: 66898567BE4000 mov word ptr [ebp+0040BE67],ax <---保存 00013539: 66899D69BE4000 mov word ptr [ebp+0040BE69],bx <---保存 00013540: 668B4618 mov ax,word ptr [esi+18] <---取int 3的低位偏移 00013544: 668B5E1E mov bx,word ptr [esi+1E] <---取int 3的高位偏移 00013548: 6689856BBE4000 mov word ptr [ebp+0040BE6B],ax <---保存 0001354F: 66899D6DBE4000 mov word ptr [ebp+0040BE6D],bx <---保存 **************保存EBP的值 00013556: 89AD65BD4000 mov dword ptr [ebp+0040BD65],ebp **************保存ReadProcessMemory的首地址 0001355C: 8B85C7BB4000 mov eax,dword ptr [ebp+0040BBC7] <---取ReadProcessMemory的首地址 00013562: 89856FBE4000 mov dword ptr [ebp+0040BE6F],eax <---保存 **************这里是一段反跟踪代码****************** 00013568: E8A9140000 call 00014A16 <---这里又是一段SIDT代码 **************开始分析注册情况********************** 0001356D: BB63BD4000 mov ebx,0040BD63 00013572: 03DD add ebx,ebp 00013574: 53 push ebx 00013575: 6A64 push 00000064 00013577: 6A63 push 00000063 00013579: 6A00 push 00000000 0001357B: FF9508BC4000 call dword ptr [ebp+0040BC08] <---SetTimer 00013581: 61 popad 00013582: 6A00 push 00000000 00013584: FF95C3BB4000 call dword ptr [ebp+0040BBC3] <---GetModuleHandle 0001358A: 89855FBD4000 mov dword ptr [ebp+0040BD5F],eax **************判断是否用的是注册版的幻影加密**************** 00013590: 80BDC8B2400001 cmp byte ptr [ebp+0040B2C8],01 <---是否注册标志 00013597: 7435 jz 000135CE <---相等，注册版则跳走 ***************用系统时间随机显示未注册的NAG窗口***************** 00013599: BEE1B94000 mov esi,0040B9E1 0001359E: 03F5 add esi,ebp 000135A0: 56 push esi 000135A1: FF959FBB4000 call dword ptr [ebp+0040BB9F] <---GetSystemTime 000135A7: 668B85EFB94000 mov ax,word ptr [ebp+0040B9EF] 000135AE: 240F and al,0F 000135B0: 3C02 cmp al,02 000135B2: 731A jnb 000135CE <---结果随机，跳转 000135B4: B8BEB94000 mov eax,0040B9BE <---到此，将显示NAG窗口 000135B9: 03C5 add eax,ebp <--- v1.5 This Program 000135BB: BB11B24000 mov ebx,0040B211 000135C0: 03DD add ebx,ebp 000135C2: 6A30 push 00000030 000135C4: 50 push eax 000135C5: 53 push ebx 000135C6: 6A00 push 00000000 ******调用MessageBoxA显示NAG窗口******* 000135C8: FF9500BC4000 call dword ptr [ebp+0040BC00] <---MessageBoxA ************ 跳到此处********开始处理用户加密的信息 000135CE: E862060000 call 00013C35 <---从注册表获取信息 000135D3: 663D0100 cmp ax,0001 000135D7: 7416 jz 000135EF <---成功就跳走 *********没注意此段内容************* 000135D9: BE60B14000 mov esi,0040B160 000135DE: 03F5 add esi,ebp 000135E0: 668B8589B44000 mov ax,word ptr [ebp+0040B489] 000135E7: 668906 mov word ptr [esi],ax 000135EA: E802070000 call 00013CF1 ********对用户注册信息的处理************ 000135EF: E87C030000 call 00013970 <---有磁盘和卷的调用 000135F4: 6689857DB44000 mov word ptr [ebp+0040B47D],ax <--此处是一个标志 000135FB: 663D0100 cmp ax,0001 000135FF: 0F84BF000000 jz 000136C4 <--成功，跳走 ********判断标志，显示用户加的NAG提示信息窗口************ 00013605: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 0001360C: 7426 jz 00013634 0001360E: 83BD61B7400001 cmp dword ptr [ebp+0040B761],00000001 <--判断标志 00013615: 751D jnz 00013634 <--不等，就跳走 00013617: E80A060000 call 00013C26 <--显示用户加的NAG提示信息窗口,1.5beta2 Email: ding-boy 0001361C: 6689857FB44000 mov word ptr [ebp+0040B47F],ax 00013623: BBC9B24000 mov ebx,0040B2C9 00013628: 03DD add ebx,ebp 0001362A: 663D0200 cmp ax,0002 0001362E: 0F8444010000 jz 00013778 ***********判断是否是缺省NAG提示信息************ 00013634: 6681BDF1B440007C7C cmp word ptr [ebp+0040B4F1],7C7C 0001363D: 741A jz 00013659 <--相等，就跳走 0001363F: B8BEB94000 mov eax,0040B9BE 00013644: 03C5 add eax,ebp 00013646: BBF1B44000 mov ebx,0040B4F1 0001364B: 03DD add ebx,ebp 0001364D: 6A30 push 00000030 0001364F: 50 push eax 00013650: 2020 and byte ptr [eax],ah 00013652: 2020 and byte ptr [eax],ah 00013654: 2038 and byte ptr [eax],bh *********显示用户加的NAG提示信息窗口*********** 00013656: 3530343400 xor eax,00343430 0001365B: 0000 add byte ptr [eax],al 0001365D: 0000 add byte ptr [eax],al 0001365F: 0000 add byte ptr [eax],al 00013640: BEB9400003 mov esi,030040B9 00013645: C5BBF1B44000 lds edi,pword ptr [ebx+0040B4F1] 0001364B: 03DD add ebx,ebp 0001364D: 6A30 push 00000030 0001364F: 50 push eax 00013650: 53 push ebx 00013651: 6A00 push 00000000 <--欢迎 ,^-^ 00013653: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA 00013659: E8A0020000 call 000138FE <--跳到此处 0001365E: BB91B84000 mov ebx,0040B891 00013663: 03DD add ebx,ebp 00013665: 663D0000 cmp ax,0000 00013669: 0F8409010000 jz 00013778 <--等于0，就跳走 0001366F: E882010000 call 000137F6 <--获取系统时间 00013674: BB1DB64000 mov ebx,0040B61D 00013679: 03DD add ebx,ebp 0001367B: 663D0000 cmp ax,0000 0001367F: 0F84F3000000 jz 00013778 00013685: E8C3010000 call 0001384D <--注册表和磁盘 0001368A: BB1DB64000 mov ebx,0040B61D 0001368F: 03DD add ebx,ebp 00013691: 663D0000 cmp ax,0000 00013695: 0F84DD000000 jz 00013778 0001369B: 6683BD7DB4400000 cmp word ptr [ebp+0040B47D],0000 000136A3: 751F jnz 000136C4 000136A5: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 000136AC: 7416 jz 000136C4 000136AE: 6683BD7FB4400001 cmp word ptr [ebp+0040B47F],0001 000136B6: 740C jz 000136C4 000136B8: BBC9B24000 mov ebx,0040B2C9 000136BD: 03DD add ebx,ebp 000136BF: E9B4000000 jmp 00013778 000136C4: BED7B24000 mov esi,0040B2D7 000136C9: 03F5 add esi,ebp 000136CB: 833E00 cmp dword ptr [esi],00000000 <---此处循环将还原各Section 000136CE: 746F jz 0001373F <--是否循环结束 000136D0: 8B9DD3B24000 mov ebx,dword ptr [ebp+0040B2D3] 000136D6: 031E add ebx,dword ptr [esi] 000136D8: 8B4E04 mov ecx,dword ptr [esi+04] 000136DB: 83F900 cmp ecx,00000000 000136DE: 7505 jnz 000136E5 000136E0: 83C608 add esi,00000008 000136E3: EBE6 jmp 000136CB 000136E5: D1E9 shr ecx,1 000136E7: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 000136EE: 66F7D0 not ax 000136F1: 663103 xor word ptr [ebx],ax 000136F4: 6648 dec ax 000136F6: 66813B3F3F cmp word ptr [ebx],3F3F 000136FB: 7518 jnz 00013715 000136FD: 817BFC44425045 cmp dword ptr [ebx-04],45504244 00013704: 750F jnz 00013715 00013706: 6683BD7DB4400001 cmp word ptr [ebp+0040B47D],0001 0001370E: 7505 jnz 00013715 00013710: 66C7032B2B mov word ptr [ebx],2B2B 00013715: 66817BFF3F3F cmp word ptr [ebx-01],3F3F 0001371B: 7519 jnz 00013736 0001371D: 817BFB44425045 cmp dword ptr [ebx-05],45504244 00013724: 7510 jnz 00013736 00013726: 6683BD7DB4400001 cmp word ptr [ebp+0040B47D],0001 0001372E: 7506 jnz 00013736 00013730: 66C743FF2B2B mov word ptr [ebx-01],2B2B 00013736: 43 inc ebx 00013737: 43 inc ebx 00013738: E2B7 loop 000136F1 0001373A: 83C608 add esi,00000008 0001373D: EB8C jmp 000136CB <---大循环 0001373F: 90 nop 00013740: 89AD9FBE4000 mov dword ptr [ebp+0040BE9F],ebp 00013746: E84C030000 call 00013A97 0001374B: E82D040000 call 00013B7D 00013750: 8B85CFB24000 mov eax,dword ptr [ebp+0040B2CF] 00013756: 8B9DD3B24000 mov ebx,dword ptr [ebp+0040B2D3] 0001375C: 03C3 add eax,ebx 0001375E: 8985F6B94000 mov dword ptr [ebp+0040B9F6],eax 00013764: 8BC5 mov eax,ebp 00013766: 5B pop ebx 00013767: 59 pop ecx 00013768: 5A pop edx 00013769: 5E pop esi 0001376A: 5F pop edi 0001376B: 5D pop ebp 0001376C: 9D popfd 0001376D: FFB0F6B94000 push dword ptr [eax+0040B9F6] 00013773: E90F120000 jmp 00014987 <---跳到后面处理入口处的代码 00013778: 66813B7C7C cmp word ptr [ebx],7C7C 0001377D: 7413 jz 00013792 0001377F: B8C0B94000 mov eax,0040B9C0 00013784: 03C5 add eax,ebp 00013786: 6A30 push 00000030 00013788: 50 push eax 00013789: 53 push ebx 0001378A: 6A00 push 00000000 <---显示dial.dll没有找到 0001378C: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA 00013792: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 00013799: 7446 jz 000137E1 0001379B: E810010000 call 000138B0 000137A0: 6689857DB44000 mov word ptr [ebp+0040B47D],ax 000137A7: 50 push eax 000137A8: 663D0100 cmp ax,0001 000137AC: 7507 jnz 000137B5 000137AE: BBF5B84000 mov ebx,0040B8F5 000137B3: EB05 jmp 000137BA 000137B5: BB59B94000 mov ebx,0040B959 000137BA: 03DD add ebx,ebp 000137BC: 66813B7C7C cmp word ptr [ebx],7C7C 000137C1: 7413 jz 000137D6 000137C3: B8C0B94000 mov eax,0040B9C0 000137C8: 03C5 add eax,ebp 000137CA: 6A30 push 00000030 000137CC: 50 push eax 000137CD: 53 push ebx 000137CE: 6A00 push 00000000 000137D0: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA 000137D6: 58 pop eax 000137D7: 663D0100 cmp ax,0001 000137DB: 0F84E3FEFFFF jz 000136C4 000137E1: C6855DBD400000 mov byte ptr [ebp+0040BD5D],00 000137E8: 8BC5 mov eax,ebp 000137EA: 5B pop ebx 000137EB: 59 pop ecx 000137EC: 5A pop edx 000137ED: 5E pop esi 000137EE: 5F pop edi 000137EF: 5D pop ebp 000137F0: 9D popfd 000137F1: E991110000 jmp 00014987 -------子程序开始------- ********获取系统时间，不知道要干什么，不会是比较时间差来判断是否被SOFTICE跟踪吧********* 000137F6: BEE1B94000 mov esi,0040B9E1 000137FB: 03F5 add esi,ebp 000137FD: 56 push esi 000137FE: FF959FBB4000 call dword ptr [ebp+0040BB9F] <---GetSystemTime 00013804: 668B8585B44000 mov ax,word ptr [ebp+0040B485] 0001380B: 668B9D81B44000 mov bx,word ptr [ebp+0040B481] 00013812: 663D0000 cmp ax,0000 00013816: 7430 jz 00013848 00013818: 663985E3B94000 cmp word ptr [ebp+0040B9E3],ax 0001381F: 7209 jb 0001382A 00013821: 66399DE1B94000 cmp word ptr [ebp+0040B9E1],bx 00013828: 7309 jnb 00013833 0001382A: 66399DE1B94000 cmp word ptr [ebp+0040B9E1],bx 00013831: 7606 jbe 00013839 00013833: 66B80000 mov ax,0000 00013837: EB0D jmp 00013846 00013839: 66C7857DB440000100 mov word ptr [ebp+0040B47D],0001 00013842: 66B80100 mov ax,0001 00013846: EB04 jmp 0001384C 00013848: 66B80100 mov ax,0001 0001384C: C3 ret --------子程序结束---------- ---------子程序开始------------- 0001384D: 60 pushad 0001384E: 6683BD89B4400000 cmp word ptr [ebp+0040B489],0000 00013856: 750B jnz 00013863 00013858: 66C785FBAB40000100 mov word ptr [ebp+0040ABFB],0001 00013861: EB42 jmp 000138A5 00013863: E8CD030000 call 00013C35 <--从注册表中获取信息 00013868: BE60B14000 mov esi,0040B160 0001386D: 03F5 add esi,ebp 0001386F: 663D0100 cmp ax,0001 00013873: 7405 jz 0001387A 00013875: 66C7060000 mov word ptr [esi],0000 0001387A: 66833E00 cmp word ptr [esi],0000 0001387E: 7417 jz 00013897 00013880: 66FF0E dec word ptr [esi] 00013883: 66C785FBAB40000100 mov word ptr [ebp+0040ABFB],0001 0001388C: 66C7857DB440000100 mov word ptr [ebp+0040B47D],0001 00013895: EB09 jmp 000138A0 00013897: 66C785FBAB40000000 mov word ptr [ebp+0040ABFB],0000 000138A0: E84C040000 call 00013CF1 <--获取磁盘和卷的信息 000138A5: 61 popad 000138A6: 668B85FBAB4000 mov ax,word ptr [ebp+0040ABFB] 000138AD: C3 ret 000138AE: 0000 add byte ptr [eax],al 000138B0: E8BB000000 call 00013970 000138B5: 8B85A8AD4000 mov eax,dword ptr [ebp+0040ADA8] 000138BB: BBB0AD4000 mov ebx,0040ADB0 000138C0: 03DD add ebx,ebp 000138C2: B983B14000 mov ecx,0040B183 000138C7: 03CD add ecx,ebp 000138C9: 50 push eax 000138CA: 53 push ebx 000138CB: 51 push ecx 000138CC: FF9504BC4000 call dword ptr [ebp+0040BC04] 000138D2: 83C40C add esp,0000000C 000138D5: B865B14000 mov eax,0040B165 000138DA: 03C5 add eax,ebp 000138DC: BB79B14000 mov ebx,0040B179 000138E1: 03DD add ebx,ebp 000138E3: B983B14000 mov ecx,0040B183 000138E8: 03CD add ecx,ebp 000138EA: 51 push ecx 000138EB: 53 push ebx 000138EC: 50 push eax 000138ED: FF95BCBC4000 call dword ptr [ebp+0040BCBC] 000138F3: E8F9030000 call 00013CF1 000138F8: E873000000 call 00013970 000138FD: C3 ret ------子程序------ 000138FE: 6683BD49B740007C cmp word ptr [ebp+0040B749],007C 00013906: 7505 jnz 0001390D 00013908: 66B80100 mov ax,0001 0001390C: C3 ret 0001390D: B89FAC4000 mov eax,0040AC9F 00013912: 03C5 add eax,ebp 00013914: 50 push eax 00013915: FF95B8BC4000 call dword ptr [ebp+0040BCB8] 0001391B: BE49B74000 mov esi,0040B749 00013920: 03F5 add esi,ebp 00013922: BF9FAC4000 mov edi,0040AC9F 00013927: 03FD add edi,ebp 00013929: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 00013930: 2020 and byte ptr [eax],ah 00013932: 2020 and byte ptr [eax],ah 00013934: 2038 and byte ptr [eax],bh 00013936: 3530343400 xor eax,00343430 0001393B: 0000 add byte ptr [eax],al 0001393D: 0000 add byte ptr [eax],al 0001393F: 0000 add byte ptr [eax],al 00013920: 03F5 add esi,ebp 00013922: BF9FAC4000 mov edi,0040AC9F 00013927: 03FD add edi,ebp 00013929: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 00013930: 8A26 mov ah,byte ptr [esi] 00013932: 3A27 cmp ah,byte ptr [edi] 00013934: 7509 jnz 0001393F 00013936: 80FC00 cmp ah,00 00013939: 7409 jz 00013944 0001393B: 46 inc esi 0001393C: 47 inc edi 0001393D: EBF1 jmp 00013930 0001393F: 66B80000 mov ax,0000 00013943: C3 ret 00013944: 66C7857DB440000100 mov word ptr [ebp+0040B47D],0001 0001394D: 66B80100 mov ax,0001 00013951: C3 ret ------子程序------------ ******非代码区********* 00013952: 0000 add byte ptr [eax],al 00013954: 0000 add byte ptr [eax],al 00013956: 0000 add byte ptr [eax],al 00013958: 0000 add byte ptr [eax],al 0001395A: 0000 add byte ptr [eax],al 0001395C: 0000 add byte ptr [eax],al 0001395E: 0000 add byte ptr [eax],al 00013960: 0000 add byte ptr [eax],al 00013962: 0000 add byte ptr [eax],al 00013964: 0000 add byte ptr [eax],al 00013966: 0000 add byte ptr [eax],al 00013968: 0000 add byte ptr [eax],al 0001396A: 0000 add byte ptr [eax],al 0001396C: 0000 add byte ptr [eax],al 0001396E: 0000 add byte ptr [eax],al ******非代码区结束******* ----------子程序开始--------- ********获取C盘的卷信息********** 00013970: B810000000 mov eax,00000010 00013975: 50 push eax 00013976: B8B8AD4000 mov eax,0040ADB8 0001397B: 03C5 add eax,ebp 0001397D: 50 push eax 0001397E: B8C8AD4000 mov eax,0040ADC8 00013983: 03C5 add eax,ebp 00013985: 50 push eax 00013986: B8CCAD4000 mov eax,0040ADCC 0001398B: 03C5 add eax,ebp 0001398D: 50 push eax 0001398E: B8D0AD4000 mov eax,0040ADD0 00013993: 03C5 add eax,ebp 00013995: 50 push eax 00013996: B810000000 mov eax,00000010 0001399B: 50 push eax 0001399C: B8D4AD4000 mov eax,0040ADD4 000139A1: 03C5 add eax,ebp 000139A3: 50 push eax 000139A4: B8B4AD4000 mov eax,0040ADB4 000139A9: 03C5 add eax,ebp 000139AB: 50 push eax <--"C:\" 000139AC: FF95BFBB4000 call dword ptr [ebp+0040BBBF] <--GetVolumeInformationA *****************获取C盘空余磁盘信息******** 000139B2: B8A4AD4000 mov eax,0040ADA4 000139B7: 03C5 add eax,ebp 000139B9: BBA8AD4000 mov ebx,0040ADA8 000139BE: 03DD add ebx,ebp 000139C0: B9ACAD4000 mov ecx,0040ADAC 000139C5: 03CD add ecx,ebp 000139C7: C701633A5C00 mov dword ptr [ecx],005C3A63 000139CD: 50 push eax 000139CE: 53 push ebx 000139CF: 6A00 push 00000000 000139D1: 51 push ecx 000139D2: FF95B7BB4000 call dword ptr [ebp+0040BBB7] <--GetDiskFreeSpaceExA *****************从注册表获取信息************** 000139D8: 8B85A8AD4000 mov eax,dword ptr [ebp+0040ADA8] 000139DE: F7D0 not eax 000139E0: 3385D0AD4000 xor eax,dword ptr [ebp+0040ADD0] 000139E6: 8985A8AD4000 mov dword ptr [ebp+0040ADA8],eax 000139EC: E844020000 call 00013C35 <--从注册表中获取信息 *****************好象是还原信息******** 000139F1: B801000000 mov eax,00000001 000139F6: 33DB xor ebx,ebx 000139F8: BE65B14000 mov esi,0040B165 000139FD: 03F5 add esi,ebp 000139FF: 8A1E mov bl,byte ptr [esi] 00013A01: 80FB00 cmp bl,00 00013A04: 7405 jz 00013A0B 00013A06: F7E3 mul ebx 00013A08: 46 inc esi 00013A09: EBF4 jmp 000139FF 00013A0B: 33855DB74000 xor eax,dword ptr [ebp+0040B75D] 00013A11: 3385A8AD4000 xor eax,dword ptr [ebp+0040ADA8] 00013A17: 86E0 xchg al,ah 00013A19: 8BD8 mov ebx,eax *******处理信息********* 00013A1B: BE79B14000 mov esi,0040B179 00013A20: 03F5 add esi,ebp 00013A22: E80E000000 call 00013A35 <--处理信息 00013A27: 3BD8 cmp ebx,eax 00013A29: 7405 jz 00013A30 00013A2B: 66B80000 mov ax,0000 00013A2F: C3 ret 00013A30: 66B80100 mov ax,0001 00013A34: C3 ret ----------子程序结束----------- -----------子程序开始---------- 00013A35: 53 push ebx 00013A36: 56 push esi 00013A37: 33DB xor ebx,ebx 00013A39: 8A06 mov al,byte ptr [esi] 00013A3B: 3C39 cmp al,39 00013A3D: 7606 jbe 00013A45 00013A3F: 24CF and al,CF 00013A41: 2C37 sub al,37 00013A43: EB02 jmp 00013A47 00013A45: 240F and al,0F 00013A47: C1E304 shl ebx,04 00013A4A: 0AD8 or bl,al 00013A4C: 46 inc esi 00013A4D: 803E00 cmp byte ptr [esi],00 00013A50: 75E7 jnz 00013A39 00013A52: 8BC3 mov eax,ebx 00013A54: 5E pop esi 00013A55: 5B pop ebx 00013A56: C3 ret ---------子程序结束----------- 00013A57: 0000 add byte ptr [eax],al 00013A59: 0000 add byte ptr [eax],al 00013A5B: 0000 add byte ptr [eax],al 00013A5D: 0000 add byte ptr [eax],al 00013A5F: 633A arpl word ptr [edx],di 00013A61: 5C pop esp 00013A62: 00256C580043 add byte ptr [4300586C],ah 00013A68: 3A5C0000 cmp bl,byte ptr [eax+eax] 00013A6C: 0000 add byte ptr [eax],al 00013A6E: 0000 add byte ptr [eax],al 00013A70: 0000 add byte ptr [eax],al 00013A72: 0000 add byte ptr [eax],al 00013A74: 0000 add byte ptr [eax],al 00013A76: 0000 add byte ptr [eax],al 00013A78: 0000 add byte ptr [eax],al 00013A7A: 0000 add byte ptr [eax],al 00013A7C: 0000 add byte ptr [eax],al 00013A7E: 0000 add byte ptr [eax],al 00013A80: 0000 add byte ptr [eax],al 00013A82: 0000 add byte ptr [eax],al 00013A84: 0000 add byte ptr [eax],al 00013A86: 0000 add byte ptr [eax],al 00013A88: 0000 add byte ptr [eax],al 00013A8A: 0000 add byte ptr [eax],al 00013A8C: 0000 add byte ptr [eax],al 00013A8E: 0000 add byte ptr [eax],al 00013A90: 0000 add byte ptr [eax],al 00013A92: 0000 add byte ptr [eax],al 00013A94: 0000 add byte ptr [eax],al ----子程序---------- 00013A96: 00608B add byte ptr [eax-75],ah 00013A99: 9D popfd 00013A9A: 69B4400083FB000F84A600 imul esi,dword ptr [eax+eax*2+00FB8300],00A6840F 00013AA5: 0000 add byte ptr [eax],al 00013AA7: 039DD3B24000 add ebx,dword ptr [ebp+0040B2D3] 00013AAD: 8B430C mov eax,dword ptr [ebx+0C] 00013AB0: 83F800 cmp eax,00000000 00013AB3: 0F8494000000 jz 00013B4D 00013AB9: 0385D3B24000 add eax,dword ptr [ebp+0040B2D3] 00013ABF: 8BF0 mov esi,eax 00013AC1: 50 push eax 00013AC2: FF9564BF4000 call dword ptr [ebp+0040BF64] <--LoadLibraryA 00013AC8: 89857DBA4000 mov dword ptr [ebp+0040BA7D],eax 00013ACE: 8B33 mov esi,dword ptr [ebx] 00013AD0: 8B7B10 mov edi,dword ptr [ebx+10] 00013AD3: 83FE00 cmp esi,00000000 00013AD6: 7502 jnz 00013ADA 00013AD8: 8BF7 mov esi,edi 00013ADA: 03B5D3B24000 add esi,dword ptr [ebp+0040B2D3] 00013AE0: 03BDD3B24000 add edi,dword ptr [ebp+0040B2D3] 00013AE6: 8B06 mov eax,dword ptr [esi] 00013AE8: 83F800 cmp eax,00000000 00013AEB: 7505 jnz 00013AF2 00013AED: 83C314 add ebx,00000014 00013AF0: EBBB jmp 00013AAD 00013AF2: 807E0380 cmp byte ptr [esi+03],80 00013AF6: 7514 jnz 00013B0C 00013AF8: 33C0 xor eax,eax 00013AFA: 668706 xchg word ptr [esi],ax 00013AFD: 50 push eax 00013AFE: FFB57DBA4000 push dword ptr [ebp+0040BA7D] 00013B04: FF9568BF4000 call dword ptr [ebp+0040BF68] 00013B0A: EB37 jmp 00013B43 00013B0C: 33C0 xor eax,eax 00013B0E: 8706 xchg dword ptr [esi],eax 00013B10: 0385D3B24000 add eax,dword ptr [ebp+0040B2D3] 00013B16: 83C002 add eax,00000002 00013B19: 8BC8 mov ecx,eax 00013B1B: E83B000000 call 00013B5B 00013B20: 663D0100 cmp ax,0001 00013B24: 7510 jnz 00013B36 00013B26: C6855DBD400001 mov byte ptr [ebp+0040BD5D],01 00013B2D: B89EBE4000 mov eax,0040BE9E 00013B32: 03C5 add eax,ebp 00013B34: EB0D jmp 00013B43 00013B36: 50 push eax 00013B37: FFB57DBA4000 push dword ptr [ebp+0040BA7D] 00013B3D: FF9568BF4000 call dword ptr [ebp+0040BF68] <--GetProcAddress 00013B43: 8907 mov dword ptr [edi],eax 00013B45: 83C604 add esi,00000004 00013B48: 83C704 add edi,00000004 00013B4B: EB99 jmp 00013AE6 00013B4D: 61 popad 00013B4E: C3 ret ----子程序结束----------- 00013B4F: 45 inc ebp 00013B50: 7869 js 00013BBB 00013B52: 7450 jz 00013BA4 00013B54: 726F jb 00013BC5 00013B56: 636573 arpl word ptr [ebp+73],sp 00013B59: 7300 jnb 00013B5B ------子程序开始---------- 00013B5B: 53 push ebx 00013B5C: 56 push esi 00013B5D: 57 push edi 00013B5E: 8BF0 mov esi,eax 00013B60: BF9CAE4000 mov edi,0040AE9C 00013B65: 03FD add edi,ebp 00013B67: 8A1E mov bl,byte ptr [esi] 00013B69: 3A1F cmp bl,byte ptr [edi] 00013B6B: 750C jnz 00013B79 00013B6D: 46 inc esi 00013B6E: 47 inc edi 00013B6F: 80FB00 cmp bl,00 00013B72: 75F3 jnz 00013B67 00013B74: B801000000 mov eax,00000001 00013B79: 5F pop edi 00013B7A: 5E pop esi 00013B7B: 5B pop ebx 00013B7C: C3 ret ------子程序结束----------- 00013B7D: 60 pushad 00013B7E: 33C0 xor eax,eax 00013B80: 8BB56DB44000 mov esi,dword ptr [ebp+0040B46D] 00013B86: 83FE00 cmp esi,00000000 00013B89: 7459 jz 00013BE4 00013B8B: 03B5D3B24000 add esi,dword ptr [ebp+0040B2D3] 00013B91: 668B3E mov di,word ptr [esi] 00013B94: 663B7E02 cmp di,word ptr [esi+02] 00013B98: 744A jz 00013BE4 00013B9A: 8B3E mov edi,dword ptr [esi] 00013B9C: 83FF00 cmp edi,00000000 00013B9F: 7443 jz 00013BE4 00013BA1: 03BDD3B24000 add edi,dword ptr [ebp+0040B2D3] 00013BA7: 8B4E04 mov ecx,dword ptr [esi+04] 00013BAA: 83E908 sub ecx,00000008 00013BAD: 83F900 cmp ecx,00000000 00013BB0: 7432 jz 00013BE4 00013BB2: D1E9 shr ecx,1 00013BB4: 83C608 add esi,00000008 00013BB7: 668B06 mov ax,word ptr [esi] 00013BBA: 662500F0 and ax,F000 00013BBE: 663D0030 cmp ax,3000 00013BC2: 7519 jnz 00013BDD 00013BC4: 668B06 mov ax,word ptr [esi] 00013BC7: 6625FF0F and ax,0FFF 00013BCB: 8B9D79B44000 mov ebx,dword ptr [ebp+0040B479] 00013BD1: 291C07 sub dword ptr [edi+eax],ebx 00013BD4: 8B9DD3B24000 mov ebx,dword ptr [ebp+0040B2D3] 00013BDA: 011C07 add dword ptr [edi+eax],ebx 00013BDD: 83C602 add esi,00000002 00013BE0: E2D5 loop 00013BB7 00013BE2: EBAD jmp 00013B91 00013BE4: 61 popad 00013BE5: C3 ret 00013BE6: 60 pushad 00013BE7: 8BB571B44000 mov esi,dword ptr [ebp+0040B471] 00013BED: 83FE00 cmp esi,00000000 00013BF0: 7432 jz 00013C24 00013BF2: 03B5D3B24000 add esi,dword ptr [ebp+0040B2D3] 00013BF8: 8B8D75B44000 mov ecx,dword ptr [ebp+0040B475] 00013BFE: 83F900 cmp ecx,00000000 00013C01: 7421 jz 00013C24 00013C03: 8B06 mov eax,dword ptr [esi] 00013C05: 83F800 cmp eax,00000000 00013C08: 7412 jz 00013C1C 00013C0A: 2B8579B44000 sub eax,dword ptr [ebp+0040B479] 00013C10: 2020 and byte ptr [eax],ah 00013C12: 2020 and byte ptr [eax],ah 00013C14: 2038 and byte ptr [eax],bh 00013C16: 3530343400 xor eax,00343430 00013C1B: 0000 add byte ptr [eax],al 00013C1D: 0000 add byte ptr [eax],al 00013C1F: 0000 add byte ptr [eax],al 00013C00: 0074218B add byte ptr [ecx-75],dh 00013C04: 06 push es 00013C05: 83F800 cmp eax,00000000 00013C08: 7412 jz 00013C1C 00013C0A: 2B8579B44000 sub eax,dword ptr [ebp+0040B479] 00013C10: 0385D3B24000 add eax,dword ptr [ebp+0040B2D3] 00013C16: C70000000000 mov dword ptr [eax],00000000 00013C1C: 83C604 add esi,00000004 00013C1F: 83E904 sub ecx,00000004 00013C22: 75DF jnz 00013C03 00013C24: 61 popad 00013C25: C3 ret ----子程序------ *******显示用户加的启动NAG提示信息 00013C26: B865B74000 mov eax,0040B765 00013C2B: 03C5 add eax,ebp 00013C2D: 50 push eax 00013C2E: FF95C0BC4000 call dword ptr [ebp+0040BCC0] <--MessageBoxA 00013C34: C3 ret ------子程序------- ---被主程序调用------ 00013C35: 60 pushad 00013C36: 66C7855EB140000000 mov word ptr [ebp+0040B15E],0000 <---作标记 *********开始注册表中的键wrifile\shell\open\command\config 00013C3F: B848B14000 mov eax,0040B148 00013C44: 03C5 add eax,ebp 00013C46: BB40B14000 mov ebx,0040B140 00013C4B: 03DD add ebx,ebp 00013C4D: B91EB14000 mov ecx,0040B11E 00013C52: 03CD add ecx,ebp 00013C54: 50 push eax 00013C55: 53 push ebx 00013C56: 683F001F00 push 001F003F 00013C5B: 6A00 push 00000000 00013C5D: 6A00 push 00000000 00013C5F: 6A00 push 00000000 00013C61: 6A00 push 00000000 00013C63: 51 push ecx <-- "wrifile\shell\open\command\config" 00013C64: 6800000080 push 80000000 00013C69: FF9576BC4000 call dword ptr [ebp+0040BC76] <---RegCreateKeyA 00013C6F: 663D0000 cmp ax,0000 00013C73: 7566 jnz 00013CDB <--无此键，就跳走 **************查找某键*********** 00013C75: BE1AB14000 mov esi,0040B11A 00013C7A: 03F5 add esi,ebp 00013C7C: BF16B14000 mov edi,0040B116 00013C81: 03FD add edi,ebp 00013C83: B860B14000 mov eax,0040B160 00013C88: 03C5 add eax,ebp 00013C8A: BB50B14000 mov ebx,0040B150 00013C8F: 03DD add ebx,ebp 00013C91: 8B8D40B14000 mov ecx,dword ptr [ebp+0040B140] 00013C97: 56 push esi 00013C98: 50 push eax 00013C99: 57 push edi 00013C9A: 6A00 push 00000000 00013C9C: 53 push ebx <--91,80,88,80,B5,80,A3,80,C8,80 00013C9D: 51 push ecx 00013C9E: FF957EBC4000 call dword ptr [ebp+0040BC7E] <---RegQueryValueEx 00013CA4: 663D0000 cmp ax,0000 00013CA8: 7531 jnz 00013CDB <--无此键，就跳走 00013CAA: 66C7855EB140000100 mov word ptr [ebp+0040B15E],0001 <--作标记 ********开始处理用户注册信息的还原********* 00013CB3: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 00013CBA: 8AE0 mov ah,al 00013CBC: BE60B14000 mov esi,0040B160 00013CC1: 03F5 add esi,ebp 00013CC3: B93D000000 mov ecx,0000003D 00013CC8: 51 push ecx 00013CC9: 8A06 mov al,byte ptr [esi] 00013CCB: 3C00 cmp al,00 00013CCD: 7402 jz 00013CD1 00013CCF: 32C4 xor al,ah 00013CD1: B104 mov cl,04 00013CD3: D2C8 ror al,cl 00013CD5: 8806 mov byte ptr [esi],al 00013CD7: 46 inc esi 00013CD8: 59 pop ecx 00013CD9: E2ED loop 00013CC8 ************关闭注册表*********** 00013CDB: 8B8540B14000 mov eax,dword ptr [ebp+0040B140] 00013CE1: 50 push eax 00013CE2: FF957ABC4000 call dword ptr [ebp+0040BC7A] <---RegCloseKey 00013CE8: 61 popad 00013CE9: 668B855EB14000 mov ax,word ptr [ebp+0040B15E] 00013CF0: C3 ret -----子程序结束------ ---被主程序调用-------对磁盘的一些调用 00013CF1: 60 pushad 00013CF2: 66C7855EB140000000 mov word ptr [ebp+0040B15E],0000 00013CFB: B848B14000 mov eax,0040B148 00013D00: 03C5 add eax,ebp 00013D02: BB40B14000 mov ebx,0040B140 00013D07: 03DD add ebx,ebp 00013D09: B91EB14000 mov ecx,0040B11E 00013D0E: 03CD add ecx,ebp 00013D10: 50 push eax 00013D11: 53 push ebx 00013D12: 683F001F00 push 001F003F 00013D17: 6A00 push 00000000 00013D19: 6A00 push 00000000 00013D1B: 6A00 push 00000000 00013D1D: 6A00 push 00000000 00013D1F: 51 push ecx 00013D20: 6800000080 push 80000000 00013D25: FF9576BC4000 call dword ptr [ebp+0040BC76] <--GetVolumeInformation 00013D2B: 663D0000 cmp ax,0000 00013D2F: 755A jnz 00013D8B 00013D31: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 00013D38: 8AE0 mov ah,al 00013D3A: BE60B14000 mov esi,0040B160 00013D3F: 03F5 add esi,ebp 00013D41: B93D000000 mov ecx,0000003D 00013D46: 51 push ecx 00013D47: 8A06 mov al,byte ptr [esi] 00013D49: B104 mov cl,04 00013D4B: D2C0 rol al,cl 00013D4D: 3C00 cmp al,00 00013D4F: 7402 jz 00013D53 00013D51: 32C4 xor al,ah 00013D53: 8806 mov byte ptr [esi],al 00013D55: 46 inc esi 00013D56: 59 pop ecx 00013D57: E2ED loop 00013D46 00013D59: B860B14000 mov eax,0040B160 00013D5E: 03C5 add eax,ebp 00013D60: BB50B14000 mov ebx,0040B150 00013D65: 03DD add ebx,ebp 00013D67: 8B8D40B14000 mov ecx,dword ptr [ebp+0040B140] 00013D6D: 6A3D push 0000003D 00013D6F: 50 push eax 00013D70: 6A03 push 00000003 00013D72: 6A00 push 00000000 00013D74: 53 push ebx 00013D75: 51 push ecx 00013D76: FF9582BC4000 call dword ptr [ebp+0040BC82] <---GetDiskFreeSpaceExA 00013D7C: 663D0000 cmp ax,0000 00013D80: 7509 jnz 00013D8B 00013D82: 66C7855EB140000100 mov word ptr [ebp+0040B15E],0001 00013D8B: 8B8540B14000 mov eax,dword ptr [ebp+0040B140] 00013D91: 50 push eax 00013D92: FF957ABC4000 call dword ptr [ebp+0040BC7A] <---GetExitCodeProcess 00013D98: 668B8567B44000 mov ax,word ptr [ebp+0040B467] 00013D9F: 8AE0 mov ah,al 00013DA1: BE60B14000 mov esi,0040B160 00013DA6: 03F5 add esi,ebp 00013DA8: B93D000000 mov ecx,0000003D 00013DAD: 51 push ecx 00013DAE: 8A06 mov al,byte ptr [esi] 00013DB0: 3C00 cmp al,00 00013DB2: 7402 jz 00013DB6 00013DB4: 32C4 xor al,ah 00013DB6: B104 mov cl,04 00013DB8: D2C8 ror al,cl 00013DBA: 8806 mov byte ptr [esi],al 00013DBC: 46 inc esi 00013DBD: 59 pop ecx 00013DBE: E2ED loop 00013DAD 00013DC0: 61 popad 00013DC1: 668B855EB14000 mov ax,word ptr [ebp+0040B15E] 00013DC8: C3 ret --------子程序结束---------- 00013DC9: 0300 add eax,dword ptr [eax] 00013DCB: 0000 add byte ptr [eax],al 00013DCD: 3D00000077 cmp eax,77000000 00013DD2: 7269 jb 00013E3D 00013DD4: 66696C655C7368 imul bp,word ptr [ebp+5C],6873 00013DDB: 656C insb es:[edi],dx 00013DDD: 6C insb es:[edi],dx 00013DDE: 5C pop esp 00013DDF: 6F outsd dx,ds:[esi] 00013DE0: 7065 jo 00013E47 00013DE2: 6E outsb dx,ds:[esi] 00013DE3: 5C pop esp 00013DE4: 636F6D arpl word ptr [edi+6D],bp 00013DE7: 6D insd es:[edi],dx 00013DE8: 61 popad 00013DE9: 6E outsb dx,ds:[esi] 00013DEA: 645C pop esp 00013DEC: 636F6E arpl word ptr [edi+6E],bp 00013DEF: 666967000000 imul sp,word ptr [edi],0000 00013DF5: 0000 add byte ptr [eax],al 00013DF7: 0000 add byte ptr [eax],al 00013DF9: 0000 add byte ptr [eax],al 00013DFB: 0000 add byte ptr [eax],al 00013DFD: 0000 add byte ptr [eax],al 00013DFF: 0000 add byte ptr [eax],al 00013E01: 0000 add byte ptr [eax],al 00013E03: 91 xchg eax,ecx 00013E04: 808880B580A380 or byte ptr [eax-5C7F4A80],80 00013E0B: C8800000 enter 0080,00 00013E0F: 0000 add byte ptr [eax],al 00013E11: 0000 add byte ptr [eax],al 00013E13: 0000 add byte ptr [eax],al 00013E15: 0000 add byte ptr [eax],al 00013E17: 0000 add byte ptr [eax],al 00013E19: 0000 add byte ptr [eax],al 00013E1B: 0000 add byte ptr [eax],al 00013E1D: 0000 add byte ptr [eax],al 00013E1F: 0000 add byte ptr [eax],al 00013E21: 0000 add byte ptr [eax],al 00013E23: 0000 add byte ptr [eax],al 00013E25: 0000 add byte ptr [eax],al 00013E27: 0000 add byte ptr [eax],al 00013E29: 0000 add byte ptr [eax],al 00013E2B: 0000 add byte ptr [eax],al 00013E2D: 0000 add byte ptr [eax],al 00013E2F: 0000 add byte ptr [eax],al 00013E31: 0000 add byte ptr [eax],al 00013E33: 0000 add byte ptr [eax],al 00013E35: 0000 add byte ptr [eax],al 00013E37: 0000 add byte ptr [eax],al 00013E39: 0000 add byte ptr [eax],al 00013E3B: 0000 add byte ptr [eax],al 00013E3D: 0000 add byte ptr [eax],al 00013E3F: 0000 add byte ptr [eax],al 00013E41: 0000 add byte ptr [eax],al 00013E43: 0000 add byte ptr [eax],al 00013E45: 0000 add byte ptr [eax],al 00013E47: 0000 add byte ptr [eax],al 00013E49: 0000 add byte ptr [eax],al 00013E4B: 0000 add byte ptr [eax],al 00013E4D: 0000 add byte ptr [eax],al 00013E4F: 0000 add byte ptr [eax],al 00013E51: 0000 add byte ptr [eax],al 00013E53: 0000 add byte ptr [eax],al 00013E55: 0000 add byte ptr [eax],al 00013E57: 0000 add byte ptr [eax],al 00013E59: 0000 add byte ptr [eax],al 00013E5B: 0000 add byte ptr [eax],al 00013E5D: 0000 add byte ptr [eax],al 00013E5F: 0000 add byte ptr [eax],al 00013E61: 0000 add byte ptr [eax],al 00013E63: 0000 add byte ptr [eax],al 00013E65: 0000 add byte ptr [eax],al 00013E67: 0000 add byte ptr [eax],al 00013E69: 0000 add byte ptr [eax],al 00013E6B: 0000 add byte ptr [eax],al 00013E6D: 0000 add byte ptr [eax],al 00013E6F: 0000 add byte ptr [eax],al 00013E71: 0000 add byte ptr [eax],al 00013E73: 0000 add byte ptr [eax],al 00013E75: 0000 add byte ptr [eax],al 00013E77: 0000 add byte ptr [eax],al 00013E79: 0000 add byte ptr [eax],al 00013E7B: 0000 add byte ptr [eax],al 00013E7D: 0000 add byte ptr [eax],al 00013E7F: 0000 add byte ptr [eax],al 00013E81: 0000 add byte ptr [eax],al 00013E83: 0000 add byte ptr [eax],al 00013E85: 0000 add byte ptr [eax],al 00013E87: 0000 add byte ptr [eax],al 00013E89: 0000 add byte ptr [eax],al 00013E8B: 0000 add byte ptr [eax],al 00013E8D: 0000 add byte ptr [eax],al 00013E8F: 0000 add byte ptr [eax],al 00013E91: 0000 add byte ptr [eax],al 00013E93: 0000 add byte ptr [eax],al 00013E95: 0000 add byte ptr [eax],al 00013E97: 0000 add byte ptr [eax],al 00013E99: 0000 add byte ptr [eax],al 00013E9B: 0000 add byte ptr [eax],al 00013E9D: 0000 add byte ptr [eax],al 00013E9F: 0000 add byte ptr [eax],al 00013EA1: 0000 add byte ptr [eax],al 00013EA3: 0000 add byte ptr [eax],al 00013EA5: 0000 add byte ptr [eax],al 00013EA7: 0000 add byte ptr [eax],al 00013EA9: 0000 add byte ptr [eax],al 00013EAB: 0000 add byte ptr [eax],al 00013EAD: 0003 add byte ptr [ebx],al 00013EAF: 0000 add byte ptr [eax],al 00013EB1: 0029 add byte ptr [ecx],ch 00013EB3: 0000 add byte ptr [eax],al 00013EB5: 002A add byte ptr [edx],ch 00013EB7: 00494E add byte ptr [ecx+4E],cl 00013EBA: 5F pop edi 00013EBB: 43 inc ebx 00013EBC: 4F dec edi 00013EBD: 44 inc esp 00013EBE: 45 inc ebp 00013EBF: 0000 add byte ptr [eax],al 00013EC1: 0000 add byte ptr [eax],al 00013EC3: 0020 add byte ptr [eax],ah 00013EC5: 2020 and byte ptr [eax],ah 00013EC7: 2020 and byte ptr [eax],ah 00013EC9: 2020 and byte ptr [eax],ah 00013ECB: 2020 and byte ptr [eax],ah 00013ECD: 2020 and byte ptr [eax],ah 00013ECF: B1BE mov cl,BE 00013ED1: C8EDBCFE enter BCED,FE 00013ED5: D3C9 ror ecx,cl 00013ED7: 20BBC3D3B076 and byte ptr [ebx+76B0D3C3],bh 00013EDD: 312E xor dword ptr [esi],ebp 00013EDF: 3520CEB4D7 xor eax,D7B4CE20 00013EE4: A2B2E1B0E6 mov [E6B0E1B2],al 00013EE9: B1BE mov cl,BE 00013EEB: BCD3C3DC20 mov esp,20DCC3D3 00013EF0: 2020 and byte ptr [eax],ah 00013EF2: 2020 and byte ptr [eax],ah 00013EF4: 2038 and byte ptr [eax],bh 00013EF6: 3530343400 xor eax,00343430 00013EFB: 0000 add byte ptr [eax],al 00013EFD: 0000 add byte ptr [eax],al 00013EFF: 0000 add byte ptr [eax],al 00013EE0: 20CE and dh,cl 00013EE2: B4D7 mov ah,D7 00013EE4: A2B2E1B0E6 mov [E6B0E1B2],al 00013EE9: B1BE mov cl,BE 00013EEB: BCD3C3DC20 mov esp,20DCC3D3 00013EF0: 2020 and byte ptr [eax],ah 00013EF2: 2020 and byte ptr [eax],ah 00013EF4: 2020 and byte ptr [eax],ah 00013EF6: 2020 and byte ptr [eax],ah 00013EF8: 2020 and byte ptr [eax],ah 00013EFA: 0D0A0D0A20 or eax,200A0D0A 00013EFF: 54 push esp 00013F00: 6869732070 push 70207369 00013F05: 726F jb 00013F76 00013F07: 677261 jb 00013F6B 00013F0A: 6D insd es:[edi],dx 00013F0B: 207072 and byte ptr [eax+72],dh 00013F0E: 6F outsd dx,ds:[esi] 00013F0F: 7465 jz 00013F76 00013F11: 63746564 arpl word ptr [ebp+64],si 00013F15: 206279 and byte ptr [edx+79],ah 00013F18: 20444250 and byte ptr [edx+eax*2+50],al 00013F1C: 45 inc ebp 00013F1D: 207631 and byte ptr [esi+31],dh 00013F20: 2E352020556E xor eax,6E552020 00013F26: 7265 jb 00013F8D 00013F28: 6769737465726564 imul esi,dword ptr [bp+di+74],64657265 00013F30: 207665 and byte ptr [esi+65],dh 00013F33: 7273 jb 00013FA8 00013F35: 696F6E0D0A0D0A imul ebp,dword ptr [edi+6E],0A0D0A0D 00013F3C: 0D0A0D0A20 or eax,200A0D0A 00013F41: 48 dec eax 00013F42: 6F outsd dx,ds:[esi] 00013F43: 6D insd es:[edi],dx 00013F44: 657061 jo 00013FA8 00013F47: 67653A20 cmp ah,byte ptr gs:[bx+si] 00013F4B: 687474703A push 3A707474 00013F50: 2F das 00013F51: 2F das 00013F52: 667364 jnb 00013FB9 00013F55: 622E bound ebp,dword ptr [esi] 00013F57: 7965 jns 00013FBE 00013F59: 61 popad 00013F5A: 682E6E6574 push 74656E2E 00013F5F: 2020 and byte ptr [eax],ah 00013F61: 2020 and byte ptr [eax],ah 00013F63: 45 inc ebp 00013F64: 2D6D61696C sub eax,6C69616D 00013F69: 3A20 cmp ah,byte ptr [eax] 00013F6B: 44 inc esp 00013F6C: 2E42 inc edx 00013F6E: 6F outsd dx,ds:[esi] 00013F6F: 7940 jns 00013FB1 00013F71: 3132 xor dword ptr [edx],esi 00013F73: 362E636F6D arpl word ptr cs:[edi+6D],bp 00013F78: 200D0A007C7C and byte ptr [7C7C000A],cl 00013F7E: 00D0 add al,dl 00013F80: 0000 add byte ptr [eax],al 00013F82: CC int 3 00013F83: 1000 adc byte ptr [eax],al 00013F85: 0000 add byte ptr [eax],al 00013F87: 0000 add byte ptr [eax],al 00013F89: 0000 add byte ptr [eax],al 00013F8B: 1000 adc byte ptr [eax],al 00013F8D: 0000 add byte ptr [eax],al 00013F8F: 40 inc eax 00013F90: 0000 add byte ptr [eax],al 00013F92: 005000 add byte ptr [eax],dl 00013F95: 0000 add byte ptr [eax],al 00013F97: 1000 adc byte ptr [eax],al 00013F99: 0000 add byte ptr [eax],al 00013F9B: 60 pushad 00013F9C: 0000 add byte ptr [eax],al 00013F9E: 0010 add byte ptr [eax],dl 00013FA0: 0000 add byte ptr [eax],al 00013FA2: 00C0 add al,al 00013FA4: 0000 add byte ptr [eax],al 00013FA6: 0010 add byte ptr [eax],dl 00013FA8: 0000 add byte ptr [eax],al 00013FAA: 0000 add byte ptr [eax],al 00013FAC: 0000 add byte ptr [eax],al 00013FAE: 0000 add byte ptr [eax],al 00013FB0: 0000 add byte ptr [eax],al 00013FB2: 0000 add byte ptr [eax],al 00013FB4: 0000 add byte ptr [eax],al 00013FB6: 0000 add byte ptr [eax],al 00013FB8: 0000 add byte ptr [eax],al 00013FBA: 0000 add byte ptr [eax],al 00013FBC: 0000 add byte ptr [eax],al 00013FBE: 0000 add byte ptr [eax],al 00013FC0: 0000 add byte ptr [eax],al 00013FC2: 0000 add byte ptr [eax],al 00013FC4: 0000 add byte ptr [eax],al 00013FC6: 0000 add byte ptr [eax],al 00013FC8: 0000 add byte ptr [eax],al 00013FCA: 0000 add byte ptr [eax],al 00013FCC: 0000 add byte ptr [eax],al 00013FCE: 0000 add byte ptr [eax],al 00013FD0: 0000 add byte ptr [eax],al 00013FD2: 0000 add byte ptr [eax],al 00013FD4: 0000 add byte ptr [eax],al 00013FD6: 0000 add byte ptr [eax],al 00013FD8: 0000 add byte ptr [eax],al 00013FDA: 0000 add byte ptr [eax],al 00013FDC: 0000 add byte ptr [eax],al 00013FDE: 0000 add byte ptr [eax],al 00013FE0: 0000 add byte ptr [eax],al 00013FE2: 0000 add byte ptr [eax],al 00013FE4: 0000 add byte ptr [eax],al 00013FE6: 0000 add byte ptr [eax],al 00013FE8: 0000 add byte ptr [eax],al 00013FEA: 0000 add byte ptr [eax],al 00013FEC: 0000 add byte ptr [eax],al 00013FEE: 0000 add byte ptr [eax],al 00013FF0: 0000 add byte ptr [eax],al 00013FF2: 0000 add byte ptr [eax],al 00013FF4: 0000 add byte ptr [eax],al 00013FF6: 0000 add byte ptr [eax],al 00013FF8: 0000 add byte ptr [eax],al 00013FFA: 0000 add byte ptr [eax],al 00013FFC: 0000 add byte ptr [eax],al 00013FFE: 0000 add byte ptr [eax],al 00014000: 0000 add byte ptr [eax],al 00014002: 0000 add byte ptr [eax],al 00014004: 0000 add byte ptr [eax],al 00014006: 0000 add byte ptr [eax],al 00014008: 0000 add byte ptr [eax],al 0001400A: 0000 add byte ptr [eax],al 0001400C: 0000 add byte ptr [eax],al 0001400E: 0000 add byte ptr [eax],al 00014010: 0000 add byte ptr [eax],al 00014012: 0000 add byte ptr [eax],al 00014014: 0000 add byte ptr [eax],al 00014016: 0000 add byte ptr [eax],al 00014018: 0000 add byte ptr [eax],al 0001401A: 0000 add byte ptr [eax],al 0001401C: 0000 add byte ptr [eax],al 0001401E: 0000 add byte ptr [eax],al 00014020: 0000 add byte ptr [eax],al 00014022: 0000 add byte ptr [eax],al 00014024: 0000 add byte ptr [eax],al 00014026: 0000 add byte ptr [eax],al 00014028: 0000 add byte ptr [eax],al 0001402A: 0000 add byte ptr [eax],al 0001402C: 0000 add byte ptr [eax],al 0001402E: 0000 add byte ptr [eax],al 00014030: 0000 add byte ptr [eax],al 00014032: 0000 add byte ptr [eax],al 00014034: 0000 add byte ptr [eax],al 00014036: 0000 add byte ptr [eax],al 00014038: 0000 add byte ptr [eax],al 0001403A: 0000 add byte ptr [eax],al 0001403C: 0000 add byte ptr [eax],al 0001403E: 0000 add byte ptr [eax],al 00014040: 0000 add byte ptr [eax],al 00014042: 0000 add byte ptr [eax],al 00014044: 0000 add byte ptr [eax],al 00014046: 0000 add byte ptr [eax],al 00014048: 0000 add byte ptr [eax],al 0001404A: 0000 add byte ptr [eax],al 0001404C: 0000 add byte ptr [eax],al 0001404E: 0000 add byte ptr [eax],al 00014050: 0000 add byte ptr [eax],al 00014052: 0000 add byte ptr [eax],al 00014054: 0000 add byte ptr [eax],al 00014056: 0000 add byte ptr [eax],al 00014058: 0000 add byte ptr [eax],al 0001405A: 0000 add byte ptr [eax],al 0001405C: 0000 add byte ptr [eax],al 0001405E: 0000 add byte ptr [eax],al 00014060: 0000 add byte ptr [eax],al 00014062: 0000 add byte ptr [eax],al 00014064: 0000 add byte ptr [eax],al 00014066: 0000 add byte ptr [eax],al 00014068: 0000 add byte ptr [eax],al 0001406A: 0000 add byte ptr [eax],al 0001406C: 0000 add byte ptr [eax],al 0001406E: 0000 add byte ptr [eax],al 00014070: 0000 add byte ptr [eax],al 00014072: 0000 add byte ptr [eax],al 00014074: 0000 add byte ptr [eax],al 00014076: 0000 add byte ptr [eax],al 00014078: 0000 add byte ptr [eax],al 0001407A: 0000 add byte ptr [eax],al 0001407C: 0000 add byte ptr [eax],al 0001407E: 0000 add byte ptr [eax],al 00014080: 0000 add byte ptr [eax],al 00014082: 0000 add byte ptr [eax],al 00014084: 0000 add byte ptr [eax],al 00014086: 0000 add byte ptr [eax],al 00014088: 0000 add byte ptr [eax],al 0001408A: 0000 add byte ptr [eax],al 0001408C: 0000 add byte ptr [eax],al 0001408E: 0000 add byte ptr [eax],al 00014090: 0000 add byte ptr [eax],al 00014092: 0000 add byte ptr [eax],al 00014094: 0000 add byte ptr [eax],al 00014096: 0000 add byte ptr [eax],al 00014098: 0000 add byte ptr [eax],al 0001409A: 0000 add byte ptr [eax],al 0001409C: 0000 add byte ptr [eax],al 0001409E: 0000 add byte ptr [eax],al 000140A0: 0000 add byte ptr [eax],al 000140A2: 0000 add byte ptr [eax],al 000140A4: 0000 add byte ptr [eax],al 000140A6: 0000 add byte ptr [eax],al 000140A8: 0000 add byte ptr [eax],al 000140AA: 0000 add byte ptr [eax],al 000140AC: 0000 add byte ptr [eax],al 000140AE: 0000 add byte ptr [eax],al 000140B0: 0000 add byte ptr [eax],al 000140B2: 0000 add byte ptr [eax],al 000140B4: 0000 add byte ptr [eax],al 000140B6: 0000 add byte ptr [eax],al 000140B8: 0000 add byte ptr [eax],al 000140BA: 0000 add byte ptr [eax],al 000140BC: 0000 add byte ptr [eax],al 000140BE: 0000 add byte ptr [eax],al 000140C0: 0000 add byte ptr [eax],al 000140C2: 0000 add byte ptr [eax],al 000140C4: 0000 add byte ptr [eax],al 000140C6: 0000 add byte ptr [eax],al 000140C8: 0000 add byte ptr [eax],al 000140CA: 0000 add byte ptr [eax],al 000140CC: 0000 add byte ptr [eax],al 000140CE: 0000 add byte ptr [eax],al 000140D0: 0000 add byte ptr [eax],al 000140D2: 0000 add byte ptr [eax],al 000140D4: 0000 add byte ptr [eax],al 000140D6: 0000 add byte ptr [eax],al 000140D8: 0000 add byte ptr [eax],al 000140DA: 0000 add byte ptr [eax],al 000140DC: 0000 add byte ptr [eax],al 000140DE: 0000 add byte ptr [eax],al 000140E0: 0000 add byte ptr [eax],al 000140E2: 0000 add byte ptr [eax],al 000140E4: 0000 add byte ptr [eax],al 000140E6: 0000 add byte ptr [eax],al 000140E8: 0000 add byte ptr [eax],al 000140EA: 0000 add byte ptr [eax],al 000140EC: 0000 add byte ptr [eax],al 000140EE: 0000 add byte ptr [eax],al 000140F0: 0000 add byte ptr [eax],al 000140F2: 0000 add byte ptr [eax],al 000140F4: 0000 add byte ptr [eax],al 000140F6: 0000 add byte ptr [eax],al 000140F8: 0000 add byte ptr [eax],al 000140FA: 0000 add byte ptr [eax],al 000140FC: 0000 add byte ptr [eax],al 000140FE: 0000 add byte ptr [eax],al 00014100: 0000 add byte ptr [eax],al 00014102: 0000 add byte ptr [eax],al 00014104: 0000 add byte ptr [eax],al 00014106: 0000 add byte ptr [eax],al 00014108: 0000 add byte ptr [eax],al 0001410A: 0000 add byte ptr [eax],al 0001410C: 0000 add byte ptr [eax],al 0001410E: 0000 add byte ptr [eax],al 00014110: 0000 add byte ptr [eax],al 00014112: 0000 add byte ptr [eax],al 00014114: 0000 add byte ptr [eax],al 00014116: 0000 add byte ptr [eax],al 00014118: 0000 add byte ptr [eax],al 0001411A: C8800060 enter 0080,60 0001411E: 0000 add byte ptr [eax],al 00014120: 00C0 add al,al 00014122: 0000 add byte ptr [eax],al 00014124: 0000 add byte ptr [eax],al 00014126: 0000 add byte ptr [eax],al 00014128: 0000 add byte ptr [eax],al 0001412A: 0000 add byte ptr [eax],al 0001412C: 0000 add byte ptr [eax],al 0001412E: 40 inc eax 0001412F: 0000 add byte ptr [eax],al 00014131: 0000 add byte ptr [eax],al 00014133: 0000 add byte ptr [eax],al 00014135: 0000 add byte ptr [eax],al 00014137: 0000 add byte ptr [eax],al 00014139: 0000 add byte ptr [eax],al 0001413B: 0000 add byte ptr [eax],al 0001413D: 0000 add byte ptr [eax],al 0001413F: 00443A5C add byte ptr [edx+edi+5C],al 00014143: 54 push esp 00014144: 45 inc ebp 00014145: 4D dec ebp 00014146: 50 push eax 00014147: 5C pop esp 00014148: 64627065 bound esi,dword ptr fs:[eax+65] 0001414C: 5C pop esp 0001414D: 54 push esp 0001414E: 45 inc ebp 0001414F: 53 push ebx 00014150: 54 push esp 00014151: 5C pop esp 00014152: 54 push esp 00014153: 45 inc ebp 00014154: 53 push ebx 00014155: 54 push esp 00014156: 315C4442 xor dword ptr [esp+eax*2+42],ebx 0001415A: 4E dec esi 0001415B: 6F outsd dx,ds:[esi] 0001415C: 7465 jz 000141C3 0001415E: 2E45 inc ebp 00014160: 58 pop eax 00014161: 45 inc ebp 00014162: 0000 add byte ptr [eax],al 00014164: 0000 add byte ptr [eax],al 00014166: 0000 add byte ptr [eax],al 00014168: 0000 add byte ptr [eax],al 0001416A: 0000 add byte ptr [eax],al 0001416C: 0000 add byte ptr [eax],al 0001416E: 0000 add byte ptr [eax],al 00014170: 0000 add byte ptr [eax],al 00014172: 0000 add byte ptr [eax],al 00014174: 0000 add byte ptr [eax],al 00014176: 0000 add byte ptr [eax],al 00014178: 0000 add byte ptr [eax],al 0001417A: 0000 add byte ptr [eax],al 0001417C: 0000 add byte ptr [eax],al 0001417E: 0000 add byte ptr [eax],al 00014180: 0000 add byte ptr [eax],al 00014182: 0000 add byte ptr [eax],al 00014184: 0000 add byte ptr [eax],al 00014186: 0000 add byte ptr [eax],al 00014188: 0000 add byte ptr [eax],al 0001418A: 0000 add byte ptr [eax],al 0001418C: 0000 add byte ptr [eax],al 0001418E: 0000 add byte ptr [eax],al 00014190: 0000 add byte ptr [eax],al 00014192: 0000 add byte ptr [eax],al 00014194: 0000 add byte ptr [eax],al 00014196: 0000 add byte ptr [eax],al 00014198: 0000 add byte ptr [eax],al 0001419A: 0000 add byte ptr [eax],al 0001419C: 0000 add byte ptr [eax],al 0001419E: 0000 add byte ptr [eax],al 000141A0: 0000 add byte ptr [eax],al 000141A2: 0000 add byte ptr [eax],al 000141A4: 7C7C jl 00014222 000141A6: 0020 add byte ptr [eax],ah 000141A8: BBB6D3AD20 mov ebx,20ADD3B6 000141AD: 205E5F and byte ptr [esi+5F],bl 000141B0: 5E pop esi 000141B1: 0000 add byte ptr [eax],al 000141B3: 0000 add byte ptr [eax],al 000141B5: 0000 add byte ptr [eax],al 000141B7: 0000 add byte ptr [eax],al 000141B9: 0000 add byte ptr [eax],al 000141BB: 0000 add byte ptr [eax],al 000141BD: 0000 add byte ptr [eax],al 000141BF: 0000 add byte ptr [eax],al 000141C1: 0000 add byte ptr [eax],al 000141C3: 0000 add byte ptr [eax],al 000141C5: 0000 add byte ptr [eax],al 000141C7: 0000 add byte ptr [eax],al 000141C9: 0000 add byte ptr [eax],al 000141CB: 0000 add byte ptr [eax],al 000141CD: 0000 add byte ptr [eax],al 000141CF: 0020 add byte ptr [eax],ah 000141D1: 2020 and byte ptr [eax],ah 000141D3: 2020 and byte ptr [eax],ah 000141D5: 383530343400 cmp byte ptr [00343430],dh 000141DB: 0000 add byte ptr [eax],al 000141DD: 0000 add byte ptr [eax],al 000141DF: 0000 add byte ptr [eax],al 000141C0: 0000 add byte ptr [eax],al 000141C2: 0000 add byte ptr [eax],al 000141C4: 0000 add byte ptr [eax],al 000141C6: 0000 add byte ptr [eax],al 000141C8: 0000 add byte ptr [eax],al 000141CA: 0000 add byte ptr [eax],al 000141CC: 0000 add byte ptr [eax],al 000141CE: 0000 add byte ptr [eax],al 000141D0: 0000 add byte ptr [eax],al 000141D2: 0000 add byte ptr [eax],al 000141D4: 0000 add byte ptr [eax],al 000141D6: 0000 add byte ptr [eax],al 000141D8: 0000 add byte ptr [eax],al 000141DA: 0000 add byte ptr [eax],al 000141DC: 0000 add byte ptr [eax],al 000141DE: 0000 add byte ptr [eax],al 000141E0: 0000 add byte ptr [eax],al 000141E2: 0000 add byte ptr [eax],al 000141E4: 0000 add byte ptr [eax],al 000141E6: 0000 add byte ptr [eax],al 000141E8: 0000 add byte ptr [eax],al 000141EA: 0000 add byte ptr [eax],al 000141EC: 0000 add byte ptr [eax],al 000141EE: 0000 add byte ptr [eax],al 000141F0: 0000 add byte ptr [eax],al 000141F2: 0000 add byte ptr [eax],al 000141F4: 0000 add byte ptr [eax],al 000141F6: 0000 add byte ptr [eax],al 000141F8: 0000 add byte ptr [eax],al 000141FA: 0000 add byte ptr [eax],al 000141FC: 0000 add byte ptr [eax],al 000141FE: 0000 add byte ptr [eax],al 00014200: 0000 add byte ptr [eax],al 00014202: 0000 add byte ptr [eax],al 00014204: 0000 add byte ptr [eax],al 00014206: 0000 add byte ptr [eax],al 00014208: 0000 add byte ptr [eax],al 0001420A: 0000 add byte ptr [eax],al 0001420C: 0000 add byte ptr [eax],al 0001420E: 0000 add byte ptr [eax],al 00014210: 0000 add byte ptr [eax],al 00014212: 0000 add byte ptr [eax],al 00014214: 0000 add byte ptr [eax],al 00014216: 0000 add byte ptr [eax],al 00014218: 0000 add byte ptr [eax],al 0001421A: 0000 add byte ptr [eax],al 0001421C: 0000 add byte ptr [eax],al 0001421E: 0000 add byte ptr [eax],al 00014220: 0000 add byte ptr [eax],al 00014222: 0000 add byte ptr [eax],al 00014224: 0000 add byte ptr [eax],al 00014226: 0000 add byte ptr [eax],al 00014228: 0000 add byte ptr [eax],al 0001422A: 0000 add byte ptr [eax],al 0001422C: 0000 add byte ptr [eax],al 0001422E: 0000 add byte ptr [eax],al 00014230: 0000 add byte ptr [eax],al 00014232: 0000 add byte ptr [eax],al 00014234: 0000 add byte ptr [eax],al 00014236: 0000 add byte ptr [eax],al 00014238: 0000 add byte ptr [eax],al 0001423A: 0000 add byte ptr [eax],al 0001423C: 0000 add byte ptr [eax],al 0001423E: 0000 add byte ptr [eax],al 00014240: 0000 add byte ptr [eax],al 00014242: 0000 add byte ptr [eax],al 00014244: 0000 add byte ptr [eax],al 00014246: 0000 add byte ptr [eax],al 00014248: 0000 add byte ptr [eax],al 0001424A: 0000 add byte ptr [eax],al 0001424C: 0000 add byte ptr [eax],al 0001424E: 0000 add byte ptr [eax],al 00014250: 0000 add byte ptr [eax],al 00014252: 0000 add byte ptr [eax],al 00014254: 0000 add byte ptr [eax],al 00014256: 0000 add byte ptr [eax],al 00014258: 0000 add byte ptr [eax],al 0001425A: 0000 add byte ptr [eax],al 0001425C: 0000 add byte ptr [eax],al 0001425E: 0000 add byte ptr [eax],al 00014260: 0000 add byte ptr [eax],al 00014262: 0000 add byte ptr [eax],al 00014264: 0000 add byte ptr [eax],al 00014266: 0000 add byte ptr [eax],al 00014268: 0000 add byte ptr [eax],al 0001426A: 0000 add byte ptr [eax],al 0001426C: 0000 add byte ptr [eax],al 0001426E: 0000 add byte ptr [eax],al 00014270: 0000 add byte ptr [eax],al 00014272: 0000 add byte ptr [eax],al 00014274: 0000 add byte ptr [eax],al 00014276: 0000 add byte ptr [eax],al 00014278: 0000 add byte ptr [eax],al 0001427A: 0000 add byte ptr [eax],al 0001427C: 0000 add byte ptr [eax],al 0001427E: 0000 add byte ptr [eax],al 00014280: 0000 add byte ptr [eax],al 00014282: 0000 add byte ptr [eax],al 00014284: 0000 add byte ptr [eax],al 00014286: 0000 add byte ptr [eax],al 00014288: 0000 add byte ptr [eax],al 0001428A: 0000 add byte ptr [eax],al 0001428C: 0000 add byte ptr [eax],al 0001428E: 0000 add byte ptr [eax],al 00014290: 0000 add byte ptr [eax],al 00014292: 0000 add byte ptr [eax],al 00014294: 0000 add byte ptr [eax],al 00014296: 0000 add byte ptr [eax],al 00014298: 0000 add byte ptr [eax],al 0001429A: 0000 add byte ptr [eax],al 0001429C: 0000 add byte ptr [eax],al 0001429E: 0000 add byte ptr [eax],al 000142A0: 0000 add byte ptr [eax],al 000142A2: 0000 add byte ptr [eax],al 000142A4: 0000 add byte ptr [eax],al 000142A6: 0000 add byte ptr [eax],al 000142A8: 0000 add byte ptr [eax],al 000142AA: 0000 add byte ptr [eax],al 000142AC: 0000 add byte ptr [eax],al 000142AE: 0000 add byte ptr [eax],al 000142B0: 0000 add byte ptr [eax],al 000142B2: 0000 add byte ptr [eax],al 000142B4: 0000 add byte ptr [eax],al 000142B6: 0000 add byte ptr [eax],al 000142B8: 0000 add byte ptr [eax],al 000142BA: 0000 add byte ptr [eax],al 000142BC: 0000 add byte ptr [eax],al 000142BE: 0000 add byte ptr [eax],al 000142C0: 0000 add byte ptr [eax],al 000142C2: 0000 add byte ptr [eax],al 000142C4: 0000 add byte ptr [eax],al 000142C6: 0000 add byte ptr [eax],al 000142C8: 0000 add byte ptr [eax],al 000142CA: 0000 add byte ptr [eax],al 000142CC: 0000 add byte ptr [eax],al 000142CE: 0000 add byte ptr [eax],al 000142D0: 7C7C jl 0001434E 000142D2: 0020 add byte ptr [eax],ah 000142D4: 2020 and byte ptr [eax],ah 000142D6: 2020 and byte ptr [eax],ah 000142D8: 2020 and byte ptr [eax],ah 000142DA: CAD4D3 retf D3D4 000142DD: C3 ret 000142DE: C6DAD2 mov dl,D2 000142E1: D1B9FDA1A320 sar dword ptr [ecx+20A3A1FD],1 000142E7: 0D0A0D0A00 or eax,000A0D0A 000142EC: 0000 add byte ptr [eax],al 000142EE: 0000 add byte ptr [eax],al 000142F0: 0000 add byte ptr [eax],al 000142F2: 0000 add byte ptr [eax],al 000142F4: 0000 add byte ptr [eax],al 000142F6: 0000 add byte ptr [eax],al 000142F8: 0000 add byte ptr [eax],al 000142FA: 0000 add byte ptr [eax],al 000142FC: 0000 add byte ptr [eax],al 000142FE: 0000 add byte ptr [eax],al 00014300: 0000 add byte ptr [eax],al 00014302: 0000 add byte ptr [eax],al 00014304: 0000 add byte ptr [eax],al 00014306: 0000 add byte ptr [eax],al 00014308: 0000 add byte ptr [eax],al 0001430A: 0000 add byte ptr [eax],al 0001430C: 0000 add byte ptr [eax],al 0001430E: 0000 add byte ptr [eax],al 00014310: 0000 add byte ptr [eax],al 00014312: 0000 add byte ptr [eax],al 00014314: 0000 add byte ptr [eax],al 00014316: 0000 add byte ptr [eax],al 00014318: 0000 add byte ptr [eax],al 0001431A: 0000 add byte ptr [eax],al 0001431C: 0000 add byte ptr [eax],al 0001431E: 0000 add byte ptr [eax],al 00014320: 0000 add byte ptr [eax],al 00014322: 0000 add byte ptr [eax],al 00014324: 0000 add byte ptr [eax],al 00014326: 0000 add byte ptr [eax],al 00014328: 0000 add byte ptr [eax],al 0001432A: 0000 add byte ptr [eax],al 0001432C: 0000 add byte ptr [eax],al 0001432E: 0000 add byte ptr [eax],al 00014330: 0000 add byte ptr [eax],al 00014332: 0000 add byte ptr [eax],al 00014334: 0000 add byte ptr [eax],al 00014336: 0000 add byte ptr [eax],al 00014338: 0000 add byte ptr [eax],al 0001433A: 0000 add byte ptr [eax],al 0001433C: 0000 add byte ptr [eax],al 0001433E: 0000 add byte ptr [eax],al 00014340: 0000 add byte ptr [eax],al 00014342: 0000 add byte ptr [eax],al 00014344: 0000 add byte ptr [eax],al 00014346: 0000 add byte ptr [eax],al 00014348: 0000 add byte ptr [eax],al 0001434A: 0000 add byte ptr [eax],al 0001434C: 0000 add byte ptr [eax],al 0001434E: 0000 add byte ptr [eax],al 00014350: 0000 add byte ptr [eax],al 00014352: 0000 add byte ptr [eax],al 00014354: 0000 add byte ptr [eax],al 00014356: 0000 add byte ptr [eax],al 00014358: 0000 add byte ptr [eax],al 0001435A: 0000 add byte ptr [eax],al 0001435C: 0000 add byte ptr [eax],al 0001435E: 0000 add byte ptr [eax],al 00014360: 0000 add byte ptr [eax],al 00014362: 0000 add byte ptr [eax],al 00014364: 0000 add byte ptr [eax],al 00014366: 0000 add byte ptr [eax],al 00014368: 0000 add byte ptr [eax],al 0001436A: 0000 add byte ptr [eax],al 0001436C: 0000 add byte ptr [eax],al 0001436E: 0000 add byte ptr [eax],al 00014370: 0000 add byte ptr [eax],al 00014372: 0000 add byte ptr [eax],al 00014374: 0000 add byte ptr [eax],al 00014376: 0000 add byte ptr [eax],al 00014378: 0000 add byte ptr [eax],al 0001437A: 0000 add byte ptr [eax],al 0001437C: 0000 add byte ptr [eax],al 0001437E: 0000 add byte ptr [eax],al 00014380: 0000 add byte ptr [eax],al 00014382: 0000 add byte ptr [eax],al 00014384: 0000 add byte ptr [eax],al 00014386: 0000 add byte ptr [eax],al 00014388: 0000 add byte ptr [eax],al 0001438A: 0000 add byte ptr [eax],al 0001438C: 0000 add byte ptr [eax],al 0001438E: 0000 add byte ptr [eax],al 00014390: 0000 add byte ptr [eax],al 00014392: 0000 add byte ptr [eax],al 00014394: 0000 add byte ptr [eax],al 00014396: 0000 add byte ptr [eax],al 00014398: 0000 add byte ptr [eax],al 0001439A: 0000 add byte ptr [eax],al 0001439C: 0000 add byte ptr [eax],al 0001439E: 0000 add byte ptr [eax],al 000143A0: 0000 add byte ptr [eax],al 000143A2: 0000 add byte ptr [eax],al 000143A4: 0000 add byte ptr [eax],al 000143A6: 0000 add byte ptr [eax],al 000143A8: 0000 add byte ptr [eax],al 000143AA: 0000 add byte ptr [eax],al 000143AC: 0000 add byte ptr [eax],al 000143AE: 0000 add byte ptr [eax],al 000143B0: 0000 add byte ptr [eax],al 000143B2: 0000 add byte ptr [eax],al 000143B4: 0000 add byte ptr [eax],al 000143B6: 0000 add byte ptr [eax],al 000143B8: 0000 add byte ptr [eax],al 000143BA: 0000 add byte ptr [eax],al 000143BC: 0000 add byte ptr [eax],al 000143BE: 0000 add byte ptr [eax],al 000143C0: 0000 add byte ptr [eax],al 000143C2: 0000 add byte ptr [eax],al 000143C4: 0000 add byte ptr [eax],al 000143C6: 0000 add byte ptr [eax],al 000143C8: 0000 add byte ptr [eax],al 000143CA: 0000 add byte ptr [eax],al 000143CC: 0000 add byte ptr [eax],al 000143CE: 0000 add byte ptr [eax],al 000143D0: 0000 add byte ptr [eax],al 000143D2: 0000 add byte ptr [eax],al 000143D4: 0000 add byte ptr [eax],al 000143D6: 0000 add byte ptr [eax],al 000143D8: 0000 add byte ptr [eax],al 000143DA: 0000 add byte ptr [eax],al 000143DC: 0000 add byte ptr [eax],al 000143DE: 0000 add byte ptr [eax],al 000143E0: 0000 add byte ptr [eax],al 000143E2: 0000 add byte ptr [eax],al 000143E4: 0000 add byte ptr [eax],al 000143E6: 0000 add byte ptr [eax],al 000143E8: 0000 add byte ptr [eax],al 000143EA: 0000 add byte ptr [eax],al 000143EC: 0000 add byte ptr [eax],al 000143EE: 0000 add byte ptr [eax],al 000143F0: 0000 add byte ptr [eax],al 000143F2: 0000 add byte ptr [eax],al 000143F4: 0000 add byte ptr [eax],al 000143F6: 0000 add byte ptr [eax],al 000143F8: 0000 add byte ptr [eax],al 000143FA: 0000 add byte ptr [eax],al 000143FC: 7C00 jl 000143FE 000143FE: 0000 add byte ptr [eax],al 00014400: 0000 add byte ptr [eax],al 00014402: 0000 add byte ptr [eax],al 00014404: 0000 add byte ptr [eax],al 00014406: 0000 add byte ptr [eax],al 00014408: 0000 add byte ptr [eax],al 0001440A: 0000 add byte ptr [eax],al 0001440C: 0000 add byte ptr [eax],al 0001440E: 0000 add byte ptr [eax],al 00014410: 0000 add byte ptr [eax],al 00014412: 0000 add byte ptr [eax],al 00014414: 0000 add byte ptr [eax],al 00014416: 0000 add byte ptr [eax],al 00014418: 2020 and byte ptr [eax],ah 0001441A: 2020 and byte ptr [eax],ah 0001441C: 2020 and byte ptr [eax],ah 0001441E: 2020 and byte ptr [eax],ah 00014420: 2020 and byte ptr [eax],ah 00014422: 2020 and byte ptr [eax],ah 00014424: 2020 and byte ptr [eax],ah 00014426: 2020 and byte ptr [eax],ah 00014428: 20BBB6D3ADC4 and byte ptr [ebx-3B522C4A],bh 0001442E: E3CA jecxz 000143FA 00014430: B9D3C3BBC3 mov ecx,C3BBC3D3 00014435: D3B020312E35 shl dword ptr [eax+352E3120],cl 0001443B: 206265 and byte ptr [edx+65],ah 0001443E: 7461 jz 000144A1 00014440: 32A3AC0D0A0D xor ah,byte ptr [ebx+0D0A0DAC] 00014446: 0A20 or ah,byte ptr [eax] 00014448: 2020 and byte ptr [eax],ah 0001444A: BBC3D3B076 mov ebx,76B0D3C3 0001444F: 312E xor dword ptr [esi],ebp 00014451: 35CAC7B9B2 xor eax,B2B9C7CA 00014456: CF iretd 00014457: ED in eax,dx 00014458: C8EDBCFE enter BCED,FE 0001445C: A3ACC8E7B9 mov [B9E7C8AC],eax 00014461: FB sti 00014462: C4E3 les esp,(Invalid)bx 00014464: CF iretd 00014465: B2BB mov dl,BB 00014467: B6CB mov dh,CB 00014469: FC cld 0001446A: A3ACCFA3CD mov [CDA3CFAC],eax 0001446F: FB sti 00014470: C4E3 les esp,(Invalid)bx 00014472: D7 xlat 00014473: A2B2E1A1A3 mov [A3A1E1B2],al 00014478: 200D0A0D0A20 and byte ptr [200A0D0A],cl 0001447E: 2020 and byte ptr [eax],ah 00014480: 2020 and byte ptr [eax],ah 00014482: 2020 and byte ptr [eax],ah 00014484: 2020 and byte ptr [eax],ah 00014486: 2020 and byte ptr [eax],ah 00014488: 2020 and byte ptr [eax],ah 0001448A: 2020 and byte ptr [eax],ah 0001448C: 2020 and byte ptr [eax],ah 0001448E: 200D0A0D0A20 and byte ptr [200A0D0A],cl 00014494: 2020 and byte ptr [eax],ah 00014496: 2020 and byte ptr [eax],ah 00014498: 2020 and byte ptr [eax],ah 0001449A: 2020 and byte ptr [eax],ah 0001449C: 2020 and byte ptr [eax],ah 0001449E: 2020 and byte ptr [eax],ah 000144A0: 2020 and byte ptr [eax],ah 000144A2: 2020 and byte ptr [eax],ah 000144A4: 2020 and byte ptr [eax],ah 000144A6: 45 inc ebp 000144A7: 2D6D61696C sub eax,6C69616D 000144AC: 2020 and byte ptr [eax],ah 000144AE: 203A and byte ptr [edx],bh 000144B0: 2020 and byte ptr [eax],ah 000144B2: 2020 and byte ptr [eax],ah 000144B4: 2038 and byte ptr [eax],bh 000144B6: 3530343400 xor eax,00343430 000144BB: 0000 add byte ptr [eax],al 000144BD: 0000 add byte ptr [eax],al 000144BF: 0000 add byte ptr [eax],al 000144A0: 2020 and byte ptr [eax],ah 000144A2: 2020 and byte ptr [eax],ah 000144A4: 2020 and byte ptr [eax],ah 000144A6: 45 inc ebp 000144A7: 2D6D61696C sub eax,6C69616D 000144AC: 2020 and byte ptr [eax],ah 000144AE: 203A and byte ptr [edx],bh 000144B0: 2064696E and byte ptr [ecx+ebp*2+6E],ah 000144B4: 672D626F7940 sub eax,40796F62 000144BA: 6E outsb dx,ds:[esi] 000144BB: 657465 jz 00014523 000144BE: 61 popad 000144BF: 7365 jnb 00014526 000144C1: 2E636F6D arpl word ptr cs:[edi+6D],bp 000144C5: 200D0A202020 and byte ptr [2020200A],cl 000144CB: 2020 and byte ptr [eax],ah 000144CD: 2020 and byte ptr [eax],ah 000144CF: 2020 and byte ptr [eax],ah 000144D1: 2020 and byte ptr [eax],ah 000144D3: 2020 and byte ptr [eax],ah 000144D5: 2020 and byte ptr [eax],ah 000144D7: 2020 and byte ptr [eax],ah 000144D9: 2020 and byte ptr [eax],ah 000144DB: 48 dec eax 000144DC: 6F outsd dx,ds:[esi] 000144DD: 6D insd es:[edi],dx 000144DE: 657061 jo 00014542 000144E1: 6765203A and byte ptr gs:[bp+si],bh 000144E5: 206874 and byte ptr [eax+74],ch 000144E8: 7470 jz 0001455A 000144EA: 3A2F cmp ch,byte ptr [edi] 000144EC: 2F das 000144ED: 667364 jnb 00014554 000144F0: 622E bound ebp,dword ptr [esi] 000144F2: 7965 jns 00014559 000144F4: 61 popad 000144F5: 682E6E6574 push 74656E2E 000144FA: 2020 and byte ptr [eax],ah 000144FC: 2020 and byte ptr [eax],ah 000144FE: 2020 and byte ptr [eax],ah 00014500: 2020 and byte ptr [eax],ah 00014502: 2020 and byte ptr [eax],ah 00014504: 2020 and byte ptr [eax],ah 00014506: 200D0A0D0A00 and byte ptr [000A0D0A],cl 0001450C: 0000 add byte ptr [eax],al 0001450E: 0000 add byte ptr [eax],al 00014510: 0000 add byte ptr [eax],al 00014512: 0000 add byte ptr [eax],al 00014514: 0000 add byte ptr [eax],al 00014516: 0000 add byte ptr [eax],al 00014518: 0000 add byte ptr [eax],al 0001451A: 0000 add byte ptr [eax],al 0001451C: 0000 add byte ptr [eax],al 0001451E: 0000 add byte ptr [eax],al 00014520: 0000 add byte ptr [eax],al 00014522: 0000 add byte ptr [eax],al 00014524: 0000 add byte ptr [eax],al 00014526: 0000 add byte ptr [eax],al 00014528: 0000 add byte ptr [eax],al 0001452A: 0000 add byte ptr [eax],al 0001452C: 0000 add byte ptr [eax],al 0001452E: 0000 add byte ptr [eax],al 00014530: 0000 add byte ptr [eax],al 00014532: 0000 add byte ptr [eax],al 00014534: 0000 add byte ptr [eax],al 00014536: 0000 add byte ptr [eax],al 00014538: 0000 add byte ptr [eax],al 0001453A: 0000 add byte ptr [eax],al 0001453C: 0000 add byte ptr [eax],al 0001453E: 0000 add byte ptr [eax],al 00014540: 0000 add byte ptr [eax],al 00014542: 0000 add byte ptr [eax],al 00014544: 49 dec ecx 00014545: 6E outsb dx,ds:[esi] 00014546: 7661 jbe 000145A9 00014548: 6C insb es:[edi],dx 00014549: 6964202050617373 imul esp,dword ptr [eax+20],73736150 00014551: 57 push edi 00014552: 6F outsd dx,ds:[esi] 00014553: 7264 jb 000145B9 00014555: 0000 add byte ptr [eax],al 00014557: 0000 add byte ptr [eax],al 00014559: 0000 add byte ptr [eax],al 0001455B: 0000 add byte ptr [eax],al 0001455D: 0000 add byte ptr [eax],al 0001455F: 0000 add byte ptr [eax],al 00014561: 0000 add byte ptr [eax],al 00014563: 0000 add byte ptr [eax],al 00014565: 0000 add byte ptr [eax],al 00014567: 0000 add byte ptr [eax],al 00014569: 0000 add byte ptr [eax],al 0001456B: 0000 add byte ptr [eax],al 0001456D: 0000 add byte ptr [eax],al 0001456F: 0000 add byte ptr [eax],al 00014571: 0000 add byte ptr [eax],al 00014573: 0000 add byte ptr [eax],al 00014575: 0000 add byte ptr [eax],al 00014577: 0000 add byte ptr [eax],al 00014579: 0000 add byte ptr [eax],al 0001457B: 0000 add byte ptr [eax],al 0001457D: 0000 add byte ptr [eax],al 0001457F: 0000 add byte ptr [eax],al 00014581: 0000 add byte ptr [eax],al 00014583: 0000 add byte ptr [eax],al 00014585: 0000 add byte ptr [eax],al 00014587: 0000 add byte ptr [eax],al 00014589: 0000 add byte ptr [eax],al 0001458B: 0000 add byte ptr [eax],al 0001458D: 0000 add byte ptr [eax],al 0001458F: 0000 add byte ptr [eax],al 00014591: 0000 add byte ptr [eax],al 00014593: 0000 add byte ptr [eax],al 00014595: 0000 add byte ptr [eax],al 00014597: 0000 add byte ptr [eax],al 00014599: 0000 add byte ptr [eax],al 0001459B: 0000 add byte ptr [eax],al 0001459D: 0000 add byte ptr [eax],al 0001459F: 0000 add byte ptr [eax],al 000145A1: 0000 add byte ptr [eax],al 000145A3: 0000 add byte ptr [eax],al 000145A5: 0000 add byte ptr [eax],al 000145A7: 005265 add byte ptr [edx+65],dl 000145AA: 6769737465722053 imul esi,dword ptr [bp+di+74],53207265 000145B2: 7563 jnz 00014617 000145B4: 636573 arpl word ptr [ebp+73],sp 000145B7: 7366 jnb 0001461F 000145B9: 756C jnz 00014627 000145BB: 6C insb es:[edi],dx 000145BC: 7900 jns 000145BE 000145BE: 0000 add byte ptr [eax],al 000145C0: 0000 add byte ptr [eax],al 000145C2: 0000 add byte ptr [eax],al 000145C4: 0000 add byte ptr [eax],al 000145C6: 0000 add byte ptr [eax],al 000145C8: 0000 add byte ptr [eax],al 000145CA: 0000 add byte ptr [eax],al 000145CC: 0000 add byte ptr [eax],al 000145CE: 0000 add byte ptr [eax],al 000145D0: 0000 add byte ptr [eax],al 000145D2: 0000 add byte ptr [eax],al 000145D4: 0000 add byte ptr [eax],al 000145D6: 0000 add byte ptr [eax],al 000145D8: 0000 add byte ptr [eax],al 000145DA: 0000 add byte ptr [eax],al 000145DC: 0000 add byte ptr [eax],al 000145DE: 0000 add byte ptr [eax],al 000145E0: 0000 add byte ptr [eax],al 000145E2: 0000 add byte ptr [eax],al 000145E4: 0000 add byte ptr [eax],al 000145E6: 0000 add byte ptr [eax],al 000145E8: 0000 add byte ptr [eax],al 000145EA: 0000 add byte ptr [eax],al 000145EC: 0000 add byte ptr [eax],al 000145EE: 0000 add byte ptr [eax],al 000145F0: 0000 add byte ptr [eax],al 000145F2: 0000 add byte ptr [eax],al 000145F4: 0000 add byte ptr [eax],al 000145F6: 0000 add byte ptr [eax],al 000145F8: 0000 add byte ptr [eax],al 000145FA: 0000 add byte ptr [eax],al 000145FC: 0000 add byte ptr [eax],al 000145FE: 0000 add byte ptr [eax],al 00014600: 0000 add byte ptr [eax],al 00014602: 0000 add byte ptr [eax],al 00014604: 0000 add byte ptr [eax],al 00014606: 0000 add byte ptr [eax],al 00014608: 0000 add byte ptr [eax],al 0001460A: 0000 add byte ptr [eax],al 0001460C: 49 dec ecx 0001460D: 6E outsb dx,ds:[esi] 0001460E: 7661 jbe 00014671 00014610: 6C insb es:[edi],dx 00014611: 6964205365726961 imul esp,dword ptr [eax+53],61697265 00014619: 6C insb es:[edi],dx 0001461A: 204E4F and byte ptr [esi+4F],cl 0001461D: 0000 add byte ptr [eax],al 0001461F: 0000 add byte ptr [eax],al 00014621: 0000 add byte ptr [eax],al 00014623: 0000 add byte ptr [eax],al 00014625: 0000 add byte ptr [eax],al 00014627: 0000 add byte ptr [eax],al 00014629: 0000 add byte ptr [eax],al 0001462B: 0000 add byte ptr [eax],al 0001462D: 0000 add byte ptr [eax],al 0001462F: 0000 add byte ptr [eax],al 00014631: 0000 add byte ptr [eax],al 00014633: 0000 add byte ptr [eax],al 00014635: 0000 add byte ptr [eax],al 00014637: 0000 add byte ptr [eax],al 00014639: 0000 add byte ptr [eax],al 0001463B: 0000 add byte ptr [eax],al 0001463D: 0000 add byte ptr [eax],al 0001463F: 0000 add byte ptr [eax],al 00014641: 0000 add byte ptr [eax],al 00014643: 0000 add byte ptr [eax],al 00014645: 0000 add byte ptr [eax],al 00014647: 0000 add byte ptr [eax],al 00014649: 0000 add byte ptr [eax],al 0001464B: 0000 add byte ptr [eax],al 0001464D: 0000 add byte ptr [eax],al 0001464F: 0000 add byte ptr [eax],al 00014651: 0000 add byte ptr [eax],al 00014653: 0000 add byte ptr [eax],al 00014655: 0000 add byte ptr [eax],al 00014657: 0000 add byte ptr [eax],al 00014659: 0000 add byte ptr [eax],al 0001465B: 0000 add byte ptr [eax],al 0001465D: 0000 add byte ptr [eax],al 0001465F: 0000 add byte ptr [eax],al 00014661: 0000 add byte ptr [eax],al 00014663: 0000 add byte ptr [eax],al 00014665: 0000 add byte ptr [eax],al 00014667: 0000 add byte ptr [eax],al 00014669: 0000 add byte ptr [eax],al 0001466B: 0000 add byte ptr [eax],al 0001466D: 0000 add byte ptr [eax],al 0001466F: 004520 add byte ptr [ebp+20],al 00014672: 0020 add byte ptr [eax],ah 00014674: 0020 add byte ptr [eax],ah 00014676: 2020 and byte ptr [eax],ah 00014678: 4C dec esp 00014679: 6F outsd dx,ds:[esi] 0001467A: 61 popad 0001467B: 642020 and byte ptr fs:[eax],ah 0001467E: 20446961 and byte ptr [ecx+ebp*2+61],al 00014682: 6C insb es:[edi],dx 00014683: 2E646C insb es:[edi],dx 00014686: 6C insb es:[edi],dx 00014687: 2020 and byte ptr [eax],ah 00014689: 6661 popa 0001468B: 6C insb es:[edi],dx 0001468C: 7365 jnb 000146F3 0001468E: 642120 and dword ptr fs:[eax],esp 00014691: 2020 and byte ptr [eax],ah 00014693: 00D0 add al,dl 00014695: 07 pop es 00014696: 0800 or byte ptr [eax],al 00014698: 0400 add al,00 0001469A: 1100 adc dword ptr [eax],eax 0001469C: 0800 or byte ptr [eax],al 0001469E: 35002300C8 xor eax,C8002300 000146A3: 0000 add byte ptr [eax],al 000146A5: 346C xor al,6C 000146A7: 0000 add byte ptr [eax],al 000146A9: 0000 add byte ptr [eax],al 000146AB: 0000 add byte ptr [eax],al *************子程序 ID:CALL000146AD ************** 000146AD: 60 pushad 000146AE: BB85BA4000 mov ebx,0040BA85 000146B3: 03DD add ebx,ebp 000146B5: 807B0800 cmp byte ptr [ebx+08],00 000146B9: 746D jz 00014728 000146BB: 8BC3 mov eax,ebx 000146BD: 83C008 add eax,00000008 000146C0: 50 push eax 000146C1: FF9564BF4000 call dword ptr [ebp+0040BF64] <--LoadLibraryA 000146C7: 89857DBA4000 mov dword ptr [ebp+0040BA7D],eax 000146CD: 83F800 cmp eax,00000000 000146D0: 750C jnz 000146DE 000146D2: C78581BA400000000000 mov dword ptr [ebp+0040BA81],00000000 000146DC: EB4A jmp 00014728 000146DE: 8B33 mov esi,dword ptr [ebx] 000146E0: 8B7B04 mov edi,dword ptr [ebx+04] 000146E3: 03F5 add esi,ebp 000146E5: 03FD add edi,ebp 000146E7: 803E00 cmp byte ptr [esi],00 000146EA: 750E jnz 000146FA 000146EC: 83C308 add ebx,00000008 000146EF: 803B00 cmp byte ptr [ebx],00 000146F2: 7403 jz 000146F7 000146F4: 43 inc ebx 000146F5: EBF8 jmp 000146EF 000146F7: 43 inc ebx 000146F8: EBBB jmp 000146B5 000146FA: 56 push esi 000146FB: FFB57DBA4000 push dword ptr [ebp+0040BA7D] 00014701: FF9568BF4000 call dword ptr [ebp+0040BF68] <--GetProcAddress 00014707: 83F800 cmp eax,00000000 0001470A: 750C jnz 00014718 0001470C: C78581BA400000000000 mov dword ptr [ebp+0040BA81],00000000 00014716: EB10 jmp 00014728 00014718: 8907 mov dword ptr [edi],eax 0001471A: 83C704 add edi,00000004 0001471D: 803E00 cmp byte ptr [esi],00 00014720: 7403 jz 00014725 00014722: 46 inc esi 00014723: EBF8 jmp 0001471D 00014725: 46 inc esi 00014726: EBBF jmp 000146E7 00014728: 61 popad 00014729: 8B8581BA4000 mov eax,dword ptr [ebp+0040BA81] 0001472F: C3 ret ************结束***************** 00014730: 0000 add byte ptr [eax],al 00014732: 0000 add byte ptr [eax],al 00014734: 0100 add dword ptr [eax],eax 00014736: 0000 add byte ptr [eax],al 00014738: E3BA jecxz 000146F4 0001473A: 40 inc eax 0001473B: 009FBB40006B add byte ptr [edi+6B0040BB],bl 00014741: 65726E jb 000147B2 00014744: 656C insb es:[edi],dx 00014746: 3332 xor esi,dword ptr [edx] 00014748: 2E646C insb es:[edi],dx 0001474B: 6C insb es:[edi],dx 0001474C: 00D3 add bl,dl 0001474E: BB400000BC mov ebx,BC000040 00014753: 40 inc eax 00014754: 007573 add byte ptr [ebp+73],dh 00014757: 657233 jb 0001478D 0001475A: 322E xor ch,byte ptr [esi] 0001475C: 646C insb es:[edi],dx 0001475E: 6C insb es:[edi],dx 0001475F: 0014BC add byte ptr [esp+edi*4],dl 00014762: 40 inc eax 00014763: 0072BC add byte ptr [edx-44],dh 00014766: 40 inc eax 00014767: 006164 add byte ptr [ecx+64],ah 0001476A: 7661 jbe 000147CD 0001476C: 7069 jo 000147D7 0001476E: 3332 xor esi,dword ptr [edx] 00014770: 2E646C insb es:[edi],dx 00014773: 6C insb es:[edi],dx 00014774: 008EBC4000B8 add byte ptr [esi-47FFBF44],cl 0001477A: BC40006469 mov esp,69640040 0001477F: 61 popad 00014780: 6C insb es:[edi],dx 00014781: 2E646C insb es:[edi],dx 00014784: 6C insb es:[edi],dx 00014785: 0000 add byte ptr [eax],al 00014787: 0000 add byte ptr [eax],al 00014789: 0000 add byte ptr [eax],al 0001478B: 0000 add byte ptr [eax],al 0001478D: 0000 add byte ptr [eax],al 0001478F: 0020 add byte ptr [eax],ah 00014791: 2020 and byte ptr [eax],ah 00014793: 2020 and byte ptr [eax],ah 00014795: 383530343400 cmp byte ptr [00343430],dh 0001479B: 0000 add byte ptr [eax],al 0001479D: 0000 add byte ptr [eax],al 0001479F: 0000 add byte ptr [eax],al 00014780: 6C insb es:[edi],dx 00014781: 2E646C insb es:[edi],dx 00014784: 6C insb es:[edi],dx 00014785: 0000 add byte ptr [eax],al 00014787: 0000 add byte ptr [eax],al 00014789: 0000 add byte ptr [eax],al 0001478B: 0000 add byte ptr [eax],al 0001478D: 0000 add byte ptr [eax],al 0001478F: 0000 add byte ptr [eax],al 00014791: 0000 add byte ptr [eax],al 00014793: 0000 add byte ptr [eax],al 00014795: 004765 add byte ptr [edi+65],al 00014798: 7453 jz 000147ED 0001479A: 7973 jns 0001480F 0001479C: 7465 jz 00014803 0001479E: 6D insd es:[edi],dx 0001479F: 54 push esp 000147A0: 696D6500437265 imul ebp,dword ptr [ebp+65],65724300 000147A7: 61 popad 000147A8: 7465 jz 0001480F 000147AA: 46 inc esi 000147AB: 696C654100577269 imul ebp,dword ptr [ebp+41],69725700 000147B3: 7465 jz 0001481A 000147B5: 46 inc esi 000147B6: 696C6500436C6F73 imul ebp,dword ptr [ebp],736F6C43 000147BE: 6548 dec eax 000147C0: 61 popad 000147C1: 6E outsb dx,ds:[esi] 000147C2: 646C insb es:[edi],dx 000147C4: 65004372 add byte ptr gs:[ebx+72],al 000147C8: 6561 popad 000147CA: 7465 jz 00014831 000147CC: 50 push eax 000147CD: 726F jb 0001483E 000147CF: 636573 arpl word ptr [ebp+73],sp 000147D2: 7341 jnb 00014815 000147D4: 004765 add byte ptr [edi+65],al 000147D7: 7445 jz 0001481E 000147D9: 7869 js 00014844 000147DB: 7443 jz 00014820 000147DD: 6F outsd dx,ds:[esi] 000147DE: 646550 push eax 000147E1: 726F jb 00014852 000147E3: 636573 arpl word ptr [ebp+73],sp 000147E6: 7300 jnb 000147E8 000147E8: 47 inc edi 000147E9: 657444 jz 00014830 000147EC: 69736B46726565 imul esi,dword ptr [ebx+6B],65657246 000147F3: 53 push ebx 000147F4: 7061 jo 00014857 000147F6: 636545 arpl word ptr [ebp+45],sp 000147F9: 7841 js 0001483C 000147FB: 0044656C add byte ptr [ebp+6C],al 000147FF: 657465 jz 00014867 00014802: 46 inc esi 00014803: 696C654100476574 imul ebp,dword ptr [ebp+41],74654700 0001480B: 56 push esi 0001480C: 6F outsd dx,ds:[esi] 0001480D: 6C insb es:[edi],dx 0001480E: 756D jnz 0001487D 00014810: 6549 dec ecx 00014812: 6E outsb dx,ds:[esi] 00014813: 666F outsw dx,ds:[esi] 00014815: 726D jb 00014884 00014817: 61 popad 00014818: 7469 jz 00014883 0001481A: 6F outsd dx,ds:[esi] 0001481B: 6E outsb dx,ds:[esi] 0001481C: 41 inc ecx 0001481D: 004765 add byte ptr [edi+65],al 00014820: 744D jz 0001486F 00014822: 6F outsd dx,ds:[esi] 00014823: 64756C jnz 00014892 00014826: 6548 dec eax 00014828: 61 popad 00014829: 6E outsb dx,ds:[esi] 0001482A: 646C insb es:[edi],dx 0001482C: 6541 inc ecx 0001482E: 005265 add byte ptr [edx+65],dl 00014831: 61 popad 00014832: 6450 push eax 00014834: 726F jb 000148A5 00014836: 636573 arpl word ptr [ebp+73],sp 00014839: 734D jnb 00014888 0001483B: 656D insd es:[edi],dx 0001483D: 6F outsd dx,ds:[esi] 0001483E: 7279 jb 000148B9 00014840: 005669 add byte ptr [esi+69],dl 00014843: 7274 jb 000148B9 00014845: 7561 jnz 000148A8 00014847: 6C insb es:[edi],dx 00014848: 41 inc ecx 00014849: 6C insb es:[edi],dx 0001484A: 6C insb es:[edi],dx 0001484B: 6F outsd dx,ds:[esi] 0001484C: 6300 arpl word ptr [eax],ax 0001484E: 0000 add byte ptr [eax],al 00014850: 0000 add byte ptr [eax],al 00014852: 0000 add byte ptr [eax],al 00014854: 0000 add byte ptr [eax],al 00014856: 0000 add byte ptr [eax],al 00014858: 0000 add byte ptr [eax],al 0001485A: 0000 add byte ptr [eax],al 0001485C: 0000 add byte ptr [eax],al 0001485E: 0000 add byte ptr [eax],al 00014860: 0000 add byte ptr [eax],al 00014862: 0000 add byte ptr [eax],al 00014864: 0000 add byte ptr [eax],al 00014866: 0000 add byte ptr [eax],al 00014868: 0000 add byte ptr [eax],al 0001486A: 0000 add byte ptr [eax],al 0001486C: 0000 add byte ptr [eax],al 0001486E: 0000 add byte ptr [eax],al 00014870: 0000 add byte ptr [eax],al 00014872: 0000 add byte ptr [eax],al 00014874: 0000 add byte ptr [eax],al 00014876: 0000 add byte ptr [eax],al 00014878: 0000 add byte ptr [eax],al 0001487A: 0000 add byte ptr [eax],al 0001487C: 0000 add byte ptr [eax],al 0001487E: 0000 add byte ptr [eax],al 00014880: 0000 add byte ptr [eax],al 00014882: 0000 add byte ptr [eax],al 00014884: 0000 add byte ptr [eax],al 00014886: 4D dec ebp 00014887: 657373 jnb 000148FD 0001488A: 61 popad 0001488B: 676542 inc edx 0001488E: 6F outsd dx,ds:[esi] 0001488F: 7841 js 000148D2 00014891: 007773 add byte ptr [edi+73],dh 00014894: 7072 jo 00014908 00014896: 696E7466410053 imul ebp,dword ptr [esi+74],53004166 0001489D: 657454 jz 000148F4 000148A0: 696D6572004B69 imul ebp,dword ptr [ebp+65],694B0072 000148A7: 6C insb es:[edi],dx 000148A8: 6C insb es:[edi],dx 000148A9: 54 push esp 000148AA: 696D6572000000 imul ebp,dword ptr [ebp+65],00000072 000148B1: 0000 add byte ptr [eax],al 000148B3: 0000 add byte ptr [eax],al 000148B5: 0000 add byte ptr [eax],al 000148B7: 0000 add byte ptr [eax],al 000148B9: 0000 add byte ptr [eax],al 000148BB: 0000 add byte ptr [eax],al 000148BD: 0000 add byte ptr [eax],al 000148BF: 0000 add byte ptr [eax],al 000148C1: 0000 add byte ptr [eax],al 000148C3: 0000 add byte ptr [eax],al 000148C5: 0000 add byte ptr [eax],al 000148C7: 52 push edx 000148C8: 65674F dec edi 000148CB: 7065 jo 00014932 000148CD: 6E outsb dx,ds:[esi] 000148CE: 4B dec ebx 000148CF: 657945 jns 00014917 000148D2: 7841 js 00014915 000148D4: 005265 add byte ptr [edx+65],dl 000148D7: 6743 inc ebx 000148D9: 7265 jb 00014940 000148DB: 61 popad 000148DC: 7465 jz 00014943 000148DE: 4B dec ebx 000148DF: 657945 jns 00014927 000148E2: 7841 js 00014925 000148E4: 005265 add byte ptr [edx+65],dl 000148E7: 6743 inc ebx 000148E9: 6C insb es:[edi],dx 000148EA: 6F outsd dx,ds:[esi] 000148EB: 7365 jnb 00014952 000148ED: 4B dec ebx 000148EE: 657900 jns 000148F1 000148F1: 52 push edx 000148F2: 656751 push ecx 000148F5: 7565 jnz 0001495C 000148F7: 7279 jb 00014972 000148F9: 56 push esi 000148FA: 61 popad 000148FB: 6C insb es:[edi],dx 000148FC: 7565 jnz 00014963 000148FE: 45 inc ebp 000148FF: 7841 js 00014942 00014901: 005265 add byte ptr [edx+65],dl 00014904: 6753 push ebx 00014906: 657456 jz 0001495F 00014909: 61 popad 0001490A: 6C insb es:[edi],dx 0001490B: 7565 jnz 00014972 0001490D: 45 inc ebp 0001490E: 7841 js 00014951 00014910: 005265 add byte ptr [edx+65],dl 00014913: 6744 inc esp 00014915: 656C insb es:[edi],dx 00014917: 657465 jz 0001497F 0001491A: 56 push esi 0001491B: 61 popad 0001491C: 6C insb es:[edi],dx 0001491D: 7565 jnz 00014984 0001491F: 41 inc ecx 00014920: 0000 add byte ptr [eax],al 00014922: 0000 add byte ptr [eax],al 00014924: 0000 add byte ptr [eax],al 00014926: 0000 add byte ptr [eax],al 00014928: 0000 add byte ptr [eax],al 0001492A: 0000 add byte ptr [eax],al 0001492C: 0000 add byte ptr [eax],al 0001492E: 0000 add byte ptr [eax],al 00014930: 0000 add byte ptr [eax],al 00014932: 0000 add byte ptr [eax],al 00014934: 0000 add byte ptr [eax],al 00014936: 0000 add byte ptr [eax],al 00014938: 0000 add byte ptr [eax],al 0001493A: 0000 add byte ptr [eax],al 0001493C: 0000 add byte ptr [eax],al 0001493E: 0000 add byte ptr [eax],al 00014940: 004765 add byte ptr [edi+65],al 00014943: 7450 jz 00014995 00014945: 61 popad 00014946: 7373 jnb 000149BB 00014948: 776F jnbe 000149B9 0001494A: 7264 jb 000149B0 0001494C: 004765 add byte ptr [edi+65],al 0001494F: 7452 jz 000149A3 00014951: 656769737465720053 imul esi,dword ptr gs:[bp+di+74],53007265 0001495A: 686F775472 push 7254776F 0001495F: 7957 jns 000149B8 00014961: 696E646F770000 imul ebp,dword ptr [esi+64],0000776F 00014968: 0000 add byte ptr [eax],al 0001496A: 0000 add byte ptr [eax],al 0001496C: 0000 add byte ptr [eax],al 0001496E: 0000 add byte ptr [eax],al 00014970: 0000 add byte ptr [eax],al 00014972: 0000 add byte ptr [eax],al 00014974: 0000 add byte ptr [eax],al 00014976: 0000 add byte ptr [eax],al 00014978: 0000 add byte ptr [eax],al 0001497A: 0000 add byte ptr [eax],al 0001497C: 0000 add byte ptr [eax],al 0001497E: 0000 add byte ptr [eax],al 00014980: 0000 add byte ptr [eax],al 00014982: 0000 add byte ptr [eax],al 00014984: 0000 add byte ptr [eax],al 00014986: 00608B add byte ptr [eax-75],ah 00014989: E880BD5DBD call BD5F070E 0001498E: 40 inc eax 0001498F: 0000 add byte ptr [eax],al 00014991: 7555 jnz 000149E8 00014993: BE63BD4000 mov esi,0040BD63 00014998: 03F5 add esi,ebp 0001499A: C606C3 mov byte ptr [esi],C3 0001499D: 8B8573BE4000 mov eax,dword ptr [ebp+0040BE73] 000149A3: 83F800 cmp eax,00000000 000149A6: 7407 jz 000149AF <---不跳就死定了 000149A8: 898577BE4000 mov dword ptr [ebp+0040BE77],eax 000149AE: CC int 3 000149AF: BE53BD4000 mov esi,0040BD53 000149B4: 03F5 add esi,ebp 000149B6: 0F010E sidt dword ptr [esi] 000149B9: 8B7602 mov esi,dword ptr [esi+02] 000149BC: 668B8567BE4000 mov ax,word ptr [ebp+0040BE67] 000149C3: 668B9D69BE4000 mov bx,word ptr [ebp+0040BE69] 000149CA: 66894608 mov word ptr [esi+08],ax 000149CE: 66895E0E mov word ptr [esi+0E],bx 000149D2: 668B856BBE4000 mov ax,word ptr [ebp+0040BE6B] 000149D9: 668B9D6DBE4000 mov bx,word ptr [ebp+0040BE6D] 000149E0: 66894618 mov word ptr [esi+18],ax 000149E4: 66895E1E mov word ptr [esi+1E],bx 000149E8: 61 popad 000149E9: 56 push esi 000149EA: 51 push ecx 000149EB: BE4D534000 mov esi,0040534D 000149F0: 03F0 add esi,eax 000149F2: B9F7690000 mov ecx,000069F7 000149F7: C60600 mov byte ptr [esi],00 000149FA: 46 inc esi 000149FB: E2FA loop 000149F7 <--灭迹 000149FD: 59 pop ecx 000149FE: 5E pop esi 000149FF: 58 pop eax 00014A00: FFE0 jmp eax <--跳到入口处，EAX=OEP 00014A02: 00EB add bl,ch


幻影v1.5b3注册相关代码分析

 标 题:对幻影1.5b3加壳的程序中各种注册相关代码的一点分析 ---这是一篇写了很旧的东东了，一直没发，这次充数吧 (10千字)
发信人:ljttt
时 间:2000-9-13 23:29:39
详细信息:
对幻影1.5b3加壳的程序中各种注册相关代码的一点分析

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

【前言】
跟踪分析幻影加密的程序实在很痛苦，在我的爱机被他超度了N次之后，终于让我下定决心去详细分析一下他的加密方法。
经过数天艰苦卓绝的战斗，终于让我有了一点收获，现在我可以很快获取Serial No和脱壳。这可能是我最下功夫去了解的一个加壳程序了。

作者： ljttt
写作日期： 2000-08-25

这里说一说幻影中各种注册相关代码的内容。首先我们来看看幻影加密中的用到的几种方法：
1、Start Message 你可以由此加入一些程序启动时的欢迎之类的信息
2、Restrictive Date 你可以由此设置程序的过期日期
3、Restrictive Time 你可以由此设置程序的未注册限制使用次数
4、Pass Word 你可以由此设置程序启动时的口令
5、Register Key 你可以由此设置程序加密用的 Key （此 Key 用于代码还原，所以这里就不分析他了）
6、Register Cue 你可以由此设置程序

以上有五类注册相关的设置（第 5 项除外），实际上还有一处，就是如果你用未注册版的幻影去加密程序，那么程序在使用时会随机显示该程序是被未注册版幻影加密的信息。所以共有六类，现在我们来看一下相关的代码。

第一段：判断程序是否被注册版幻影加密
00412574: 53 push ebx
00412575: 6A64 push 00000064
00412577: 6A63 push 00000063
00412579: 6A00 push 00000000
0041257B: FF9508BC4000 call dword ptr [ebp+0040BC08] <--SetTimer()
00412581: 61 popad
00412582: 6A00 push 00000000
00412584: FF95C3BB4000 call dword ptr [ebp+0040BBC3] <--GetModuleHandle()
0041258A: 89855FBD4000 mov dword ptr [ebp+0040BD5F],eax
00412590: 80BDC8B2400001 cmp byte ptr [ebp+0040B2C8],01 <--标志，可能是用来标识是否被注册版幻影加密的
00412597: 7435 jz 004125CE <--注册版加密的，就会跳转。否则将随机显示信息
00412599: BEE1B94000 mov esi,0040B9E1
0041259E: 03F5 add esi,ebp
004125A0: 56 push esi
004125A1: FF959FBB4000 call dword ptr [ebp+0040BB9F] <--GetSystemTime()
004125A7: 668B85EFB94000 mov ax,word ptr [ebp+0040B9EF] <--取其中的毫秒时间
004125AE: 240F and al,0F
004125B0: 3C02 cmp al,02
004125B2: 731A jnb 004125CE <--判断结果随机，用来随机显示未注册版加密。
004125B4: B8BEB94000 mov eax,0040B9BE <--如果没有跳走，将会显示该程序被未注册版的幻影加密

EAX指向的其缺省显示内容如下：
****************************************************************
本软件由 幻影v1.5 未注册版本加密

This program protected by DBPE v1.5 Unregistered version

Homepage: http://fsdb.yeah.net E-mail: D.Boy@126.com
*****************************************************************

004125B9: 03C5 add eax,ebp
004125BB: BB11B24000 mov ebx,0040B211
004125C0: 03DD add ebx,ebp
004125C2: 6A30 push 00000030
004125C4: 50 push eax
004125C5: 53 push ebx
004125C6: 6A00 push 00000000
004125C8: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA

第二段：判断程序是否被注册。
.......（前面的省略）
004125EF: E87C030000 call 00412970 <--获取硬件信息并计算比较注册表信息来检测软件是否已经注册
004125F4: 6689857DB44000 mov word ptr [ebp+0040B47D],ax <--保存软件是否已经注册的信息。将来程序还会以此来作点脱壳的小障碍。

004125FB: 663D0100 cmp ax,0001
004125FF: 0F84BF000000 jz 004126C4 <--已注册，就跳转到代码还原的地方，否则进入下一段

第三段：判断是否显示 StartMessage 信息
00412605: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 <--标志
0041260C: 7426 jz 00412634 <--为0，则跳走。去显示 StartMessage 信息。

0041260E: 83BD61B7400001 cmp dword ptr [ebp+0040B761],00000001 <--标志
00412615: 751D jnz 00412634 <--不等于1，则跳走，去显示 StartMessage 信息。
00412617: E80A060000 call 00412C26 <--显示 Try 对话框，其中有 Try 和 Register 按钮选择。
0041261C: 6689857FB44000 mov word ptr [ebp+0040B47F],ax
00412623: BBC9B24000 mov ebx,0040B2C9
00412628: 03DD add ebx,ebp <--EBX指向要显示的内容，如果为"||"则表示不显示。
0041262A: 663D0200 cmp ax,0002 <--2，表示选择了Register按钮
0041262E: 0F8444010000 jz 00412778 <--相等，则跳转到注册输入处。

00412634: 6681BDF1B440007C7C cmp word ptr [ebp+0040B4F1],7C7C <--判断是否为"||"
0041263D: 741A jz 00412659 <--相等则表示不显示任何信息，跳走到口令输入处
0041263F: B8BEB94000 mov eax,0040B9BE
00412644: 03C5 add eax,ebp
00412646: BBF1B44000 mov ebx,0040B4F1
0041264B: 03DD add ebx,ebp
0041264D: 6A30 push 00000030
0041264F: 50 push eax
00412650: 53 push ebx
00412651: 6A00 push 00000000
00412653: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA()，此处为显示 StartMessage 信息

第四段：判断口令
00412659: E8A0020000 call 004128FE <--弹出口令输入框接受输入的口令并返回判断结果。
0041265E: BB91B84000 mov ebx,0040B891
00412663: 03DD add ebx,ebp <--EBX指向 Invalid PassWord 信息
00412665: 663D0000 cmp ax,0000 <--判断口令是否输入正确
00412669: 0F8409010000 jz 00412778 <--口令错，跳走到注册输入处。

第五段：判断是否过期
0041266F: E882010000 call 004127F6 <--检查使用是否过期，并返回判断结果
00412674: BB1DB64000 mov ebx,0040B61D
00412679: 03DD add ebx,ebp <--EBX指向"试用期已过"等信息
0041267B: 663D0000 cmp ax,0000 <--判断是否过期
0041267F: 0F84F3000000 jz 00412778 <--过期，则跳走到注册输入处
00412685: E8C3010000 call 0041284D <--没有过期，则在注册表中查找注册信息，第一次使用则在注册表创建相关信息。
0041268A: BB1DB64000 mov ebx,0040B61D
0041268F: 03DD add ebx,ebp <--EBX指向"试用期已过"等信息
00412691: 663D0000 cmp ax,0000
00412695: 0F84DD000000 jz 00412778 <--过期，则跳转去显示信息，否则继续下面的判断
0041269B: 6683BD7DB4400000 cmp word ptr [ebp+0040B47D],0000 <--此标志前面已有说明，判断是否已经成为正版用户
004126A3: 751F jnz 004126C4 <--已注册，则跳转到代码还原处
004126A5: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 <--此标志前面已有说明
004126AC: 7416 jz 004126C4 <--为0，则跳走到代码还原处
004126AE: 6683BD7FB4400001 cmp word ptr [ebp+0040B47F],0001 <--此标志前面已有说明，表示你在 Try 框中按下的按钮
004126B6: 740C jz 004126C4 <--按的是Try按钮而不是Register按钮，则跳到代码还原处
004126B8: BBC9B24000 mov ebx,0040B2C9
004126BD: 03DD add ebx,ebp <--EBX指向要显示的信息，如果为"||"则不显示
004126BF: E9B4000000 jmp 00412778 <--跳到显示信息处

004126C4: ................... （此处开始是代码还原部分。省略此段代码）
................... （同上，省略）
00412773: E90F120000 jmp 00413987 <--跳转到最后的一段Anti-Debug代码处，那里将不久就到了程序真正的入口了。不过那里还有最后一关要过。这里就不多说了。
00412778: 66813B7C7C cmp word ptr [ebx],7C7C <--判断是否为""||"
0041277D: 7413 jz 00412792 <--是，则不显示信息，跳走
0041277F: B8C0B94000 mov eax,0040B9C0
00412784: 03C5 add eax,ebp
00412786: 6A30 push 00000030
00412788: 50 push eax
00412789: 53 push ebx
0041278A: 6A00 push 00000000
0041278C: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA()，显示信息

第六段：弹出注册输入框，并判断注册是否成功
00412792: 83BD5DB7400000 cmp dword ptr [ebp+0040B75D],00000000 <--此标志前面已有说明
00412799: 7446 jz 004127E1 <--为0，则跳走
0041279B: E810010000 call 004128B0 <--这里将弹出注册输入框（要求你输入正确的Serial No）并返回判断结果
004127A0: 6689857DB44000 mov word ptr [ebp+0040B47D],ax <--保存判断结果，标志
004127A7: 50 push eax
004127A8: 663D0100 cmp ax,0001 <--判断是否注册成功
004127AC: 7507 jnz 004127B5 <--不等于1，注册失败，跳转到显示信息处
004127AE: BBF5B84000 mov ebx,0040B8F5 <--注册成功了，EBX指向"Register Successfully"信息处
004127B3: EB05 jmp 004127BA <--去显示信息

004127B5: BB59B94000 mov ebx,0040B959
004127BA: 03DD add ebx,ebp <--EBX指向"Invalid Serial NO"信息处
004127BC: 66813B7C7C cmp word ptr [ebx],7C7C <--判断是否为"||"
004127C1: 7413 jz 004127D6 <--是，则表示不显示信息，跳转
004127C3: B8C0B94000 mov eax,0040B9C0
004127C8: 03C5 add eax,ebp
004127CA: 6A30 push 00000030
004127CC: 50 push eax
004127CD: 53 push ebx
004127CE: 6A00 push 00000000
004127D0: FF9500BC4000 call dword ptr [ebp+0040BC00] <--MessageBoxA，显示注册成功或者注册失败

004127D6: 58 pop eax
004127D7: 663D0100 cmp ax,0001 <--判断是否注册成功
004127DB: 0F84E3FEFFFF jz 004126C4 <--注册成功，则重新回到代码还原处继续正常工作

004127E1: C6855DBD400000 mov byte ptr [ebp+0040BD5D],00
004127E8: 8BC5 mov eax,ebp
004127EA: 5B pop ebx
004127EB: 59 pop ecx
004127EC: 5A pop edx
004127ED: 5E pop esi
004127EE: 5F pop edi
004127EF: 5D pop ebp
004127F0: 9D popfd
004127F1: E991110000 jmp 00413987 <--从这里跳走到最后的Anti-Debug处，怕是凶多吉少，因为代码没有还原，而最后的那段代码中还有一段Anti-Debug代码，虽然那里就快到了程序真正的入口处，老天！死在那里，可真悲哀。西天取经的最后一关，死在如来佛祖面前..........$#%^#。

【后记】
幻影在动态反跟踪上设计得十分优秀，不过由于其没有对动态反跟踪代码进行更多的保护，以及在静态反跟踪上有些不足，才让我能够有此收获。不过这些我已经给D.Boy提些建议，所以在新版幻影中我相信他的表现一定更加优秀。到那时不知道我的爱机还要被 k 多少次.....555555.......我的爱机啊..。------------- 怎么我现在就想着被 k ，难道幻影中加了玛啡？


Flashfxp 1.3 build 780

 标 题:脱Flashfxp 1.3 build 780的壳 (10千字)
发信人:fs0
时 间:2001-8-15 22:29:59
详细信息:
Flashfxp 1.3 build 780
http://www.billwang.net/ut/attach/159613-ffxp1.3.780.zip
fi245检测不出是用什么程序加壳，该壳绝对不亚于Asprotect，幸好该壳还算温柔，不然我的机子可惨了。

解壳程序中有不少的地方会产生异常，如：
int1
int3
div ecx ;eax=0
堆栈溢出等
只要知道Exception Handler的地址，在那里设断点就可以执行下去了，
要经常的记录有用的断点，在有走离解壳程序而出现非法操作的就从上次最近断点开始从新跟下去，一般是没问题的。
有循环的当然要注意跳过去啦，有些比较特殊的下面简单说说。

016F:005761B9 PUSHA
016F:005761BA CALL 005761C5
016F:005761BF MOV ESP,[ESP+08]
016F:005761C3 JMP SHORT 005761DF
016F:005761C5 PUSH DWORD [WORD FS:00]
016F:005761CB MOV [WORD FS:00],ESP
016F:005761D1 PUSHF
016F:005761D2 OR DWORD [ESP],0100
016F:005761D9 POPF
016F:005761DA CLC
016F:005761DB JNC 005761B9 ;<--这里是死循环，最终是堆栈溢出，Raise Exception
016F:005761DD INT 20 ;xhandler 始终是 005761BF
016F:005761DF POP DWORD [WORD FS:00]
016F:005761E5 POP EAX
016F:005761E6 POPA

016F:005754D5 LEA EAX,[EBP+046C]
016F:005754DB SUB BX,BX
016F:005754DE PUSH EAX
016F:005754DF XOR EAX,EAX
016F:005754E1 PUSH DWORD [FS:EAX]
016F:005754E4 MOV [FS:EAX],ESP
016F:005754E7 JMP SHORT 005754F9
016F:005754E9 MOV ESP,[ESP+08]
016F:005754ED MOV EBP,[ESP+08]
016F:005754F1 LEA EAX,[EBP+048B]
016F:005754F7 PUSH EAX
016F:005754F8 RET
016F:005754F9 DIV BX ;<--Exception
016F:005754FC JNZ NEAR 00575622
016F:00575502 JZ NEAR 00575622
016F:00575508 LEA EAX,[EBP+049D]
016F:0057550E MOV [ESP+04],EAX
016F:00575512 MOV [WORD FS:00],ESP
016F:00575518 JMP SHORT 0057552A
016F:0057551A MOV ESP,[ESP+08]
016F:0057551E MOV EBP,[ESP+08]
016F:00575522 LEA EAX,[EBP+04C2]
016F:00575528 PUSH EAX
016F:00575529 RET
016F:0057552A PUSHF
016F:0057552B OR DWORD [ESP],0100
016F:00575532 JNZ 00575536
016F:00575534 INT 20
016F:00575536 POPF
016F:00575537 CLC
016F:00575538 NOP
016F:00575539 JNC NEAR 00575622 ;<-- 这里不能跳，rfl c，不然就退出了
016F:0057553F LEA EAX,[EBP+04E1]
016F:00575545 MOV [ESP+04],EAX
016F:00575549 MOV [WORD FS:00],ESP
016F:0057554F CMP BYTE [EBP+12C7],00

下面有个循环比较难看出是哪里退出循环，这里列出来
016F:00575ABE MOVSB
016F:00575ABF CALL 00575B2C
016F:00575AC4 JNC 00575ABE
016F:00575AC6 XOR ECX,ECX
016F:00575AC8 CALL 00575B2C
016F:00575ACD JNC 00575AE9
016F:00575ACF XOR EAX,EAX
016F:00575AD1 CALL 00575B2C
016F:00575AD6 JNC 00575AF8
016F:00575AD8 INC ECX
016F:00575AD9 MOV AL,10
016F:00575ADB CALL 00575B2C
016F:00575AE0 ADC AL,AL
016F:00575AE2 JNC 00575ADB
016F:00575AE4 JNZ 00575B22
016F:00575AE6 STOSB
016F:00575AE7 JMP SHORT 00575ABF
016F:00575AE9 CALL 00575B38
016F:00575AEE DEC ECX
016F:00575AEF LOOP 00575B01
016F:00575AF1 CALL 00575B36
016F:00575AF6 JMP SHORT 00575B20
016F:00575AF8 LODSB
016F:00575AF9 SHR EAX,1
016F:00575AFB JZ 00575B48 <--跳出循环
016F:00575AFD ADC ECX,ECX
016F:00575AFF JMP SHORT 00575B1D
016F:00575B01 XCHG EAX,ECX
016F:00575B02 DEC EAX
016F:00575B03 SHL EAX,08
016F:00575B06 LODSB
016F:00575B07 CALL 00575B36
016F:00575B0C CMP EAX,7D00
016F:00575B11 JNC 00575B1D
016F:00575B13 CMP AH,05
016F:00575B16 JNC 00575B1E
016F:00575B18 CMP EAX,BYTE +7F
016F:00575B1B JA 00575B1F
016F:00575B1D INC ECX
016F:00575B1E INC ECX
016F:00575B1F XCHG EAX,EBP
016F:00575B20 MOV EAX,EBP
016F:00575B22 PUSH ESI
016F:00575B23 MOV ESI,EDI
016F:00575B25 SUB ESI,EAX
016F:00575B27 REP MOVSB
016F:00575B29 POP ESI
016F:00575B2A JMP SHORT 00575ABF
016F:00575B2C ADD DL,DL
016F:00575B2E JNZ 00575B35
016F:00575B30 MOV DL,[ESI]
016F:00575B32 INC ESI
016F:00575B33 ADC DL,DL
016F:00575B35 RET
016F:00575B36 XOR ECX,ECX
016F:00575B38 INC ECX
016F:00575B39 CALL 00575B2C
016F:00575B3E ADC ECX,ECX
016F:00575B40 CALL 00575B2C
016F:00575B45 JC 00575B39
016F:00575B47 RET
016F:00575B48 POP EBP <--跳到这里继续执行
016F:00575B49 POP EDX
016F:00575B4A MOV EBX,[ESP+24]
016F:00575B4E ADD EBX,BYTE +10
016F:00575B51 PUSH DWORD 4000
016F:00575B56 PUSH EBX
016F:00575B57 PUSH EDX
016F:00575B58 CALL NEAR [EBP+0040AF28]

016F:00575A58 PUSH EAX
016F:00575A59 PUSH ECX
016F:00575A5A CALL 00575A79
016F:00575A5F CMP EAX,BYTE -01
016F:00575A62 JZ NEAR 00575C86
016F:00575A68 ADD EDI,BYTE +0C
016F:00575A6B DEC ESI <--这里的ESI可能是原程序的Section数
016F:00575A6C JNG 00575A74 <--还原完就跳
016F:00575A6E JMP NEAR [EBP+0040A1D0]
016F:00575A74 JMP 00575B77

;=======================================================================
其生成输入表的重定向代码如下
016F:00870000 FF358E018700 PUSH DWORD [0087018E] ;<-- [0087018E] 放的是 Import Function Address
016F:00870006 3CC3 CMP AL,C3
016F:00870008 C3 RET
016F:00870009 FC CLD
016F:0087000A FF3592018700 PUSH DWORD [00870192]
016F:00870010 F6C1C3 TEST CL,C3
016F:00870013 C3 RET
016F:00870014 FF3596018700 PUSH DWORD [00870196]
016F:0087001A A8C3 TEST AL,C3 ;<-- 无用代码?
016F:0087001C 90 NOP
016F:0087001D C3 RET

下面是解壳程序Import table重建的部分代码
016F:00575C16 MOV EDX,[EBP+0040AFBE]
016F:00575C1C MOV ESI,[EBP+0040AFAE]
016F:00575C22 TEST ESI,ESI
016F:00575C24 JZ NEAR 00575FC7
016F:00575C2A ADD ESI,EDX
016F:00575C2C AND DWORD [EBP+0040B0AA],BYTE +00
016F:00575C33 MOV EAX,[ESI+0C]
016F:00575C36 AND DWORD [ESI+0C],BYTE +00
016F:00575C3A TEST EAX,EAX
016F:00575C3C JZ NEAR 00575FC7 ;<-- 处理完全部dll没有?
016F:00575C42 ADD EAX,EDX
016F:00575C44 MOV EBX,EAX
016F:00575C46 PUSH EAX
016F:00575C47 CALL NEAR [EBP+0040AF18]

016F:00575DE3 MOV [ESP],EBX
016F:00575DE6 MOV AX,35FF ;<-- PUSH 的代码，改为 MOV EAX,25FF
016F:00575DEA PUSH DWORD 00C3C1F6
016F:00575DEF PUSH DWORD C3A8C33C
016F:00575DF4 PUSH DWORD 0035FF80
016F:00575DF9 PUSH DWORD 90FCF9F8
016F:00575DFE PUSH BYTE +00
016F:00575E00 STOSW
016F:00575E02 INC DWORD [ESP] ;<-- 已处理的Import functions数
016F:00575E05 MOV [EDI],EBX ;<-- ebx 是Import functions的地址
016F:00575E07 ADD EBX,BYTE +04
016F:00575E0A ADD EDI,BYTE +04
016F:00575E0D AND DWORD [ESP],BYTE +03
016F:00575E11 CMP DWORD [ESP],BYTE +00
016F:00575E15 JZ 00575E45
016F:00575E17 CMP DWORD [ESP],BYTE +01
016F:00575E1B JZ 00575E4D
016F:00575E1D CMP DWORD [ESP],BYTE +02
016F:00575E21 JZ 00575E6A
016F:00575E23 ROL DWORD [ESP+0C],10
016F:00575E28 MOV AX,[ESP+0C] ;<-- 随机无用代码?
016F:00575E2D STOSW
016F:00575E2F MOV EAX,EBX
016F:00575E31 SHR EAX,03
016F:00575E34 AND EAX,BYTE +03
016F:00575E37 MOV AL,[ESP+EAX+04]
016F:00575E3B STOSB
016F:00575E3C MOV AL,C3 ;<-- RET 代码
016F:00575E3E STOSB
016F:00575E3F MOV AX,35FF ;<-- PUSH 的代码，改为 MOV EAX,25FF
016F:00575E43 JMP SHORT 00575E72
016F:00575E45 MOV EAX,[ESP+08]
016F:00575E49 STOSD
016F:00575E4A DEC EDI
016F:00575E4B JMP SHORT 00575E3C
016F:00575E4D MOV AX,[ESP+0C]
016F:00575E52 STOSW
016F:00575E54 MOV AL,C3
016F:00575E56 STOSB
016F:00575E57 MOV EAX,EBX
016F:00575E59 SHR EAX,03
016F:00575E5C AND EAX,BYTE +03
016F:00575E5F MOV AL,[ESP+EAX+04]
016F:00575E63 STOSB
016F:00575E64 MOV AX,35FF ;<-- PUSH 的代码，改为 MOV EAX,25FF
016F:00575E68 JMP SHORT 00575E72
016F:00575E6A MOV EAX,[ESP+10]
016F:00575E6E STOSD
016F:00575E6F DEC EDI
016F:00575E70 JMP SHORT 00575E3C
016F:00575E72 LOOP 00575E00 ;<--该dll处理完没有
016F:00575E74 STOSW
016F:00575E76 ADD ESP,BYTE +14
016F:00575E79 POPA
016F:00575E7A MOV [EBP+0040B0AA],EDI
016F:00575E80 MOV EDI,[EBP+0040B0AA] ;<--下面是GetProcAddress, 放到EDI指向的地方
016F:00575E86 MOV EAX,[EBP+0040B0B2]
016F:00575E8C ADD EAX,[EBP+0040AFAA]
016F:00575E92 MOV ECX,[EBP+0040B0AE]
016F:00575E98 MOV [EAX],ECX
016F:00575E9A ADD DWORD [EBP+0040B0AE],BYTE +0A
016F:00575EA1 JMP SHORT 00575EAB

下面我们要重建Import Table

016F:00870000 FF358E018700 PUSH DWORD [0087018E]
016F:00870006 3CC3 CMP AL,C3
016F:00870008 C3 RET
上面的代码用Import REConstructor v1.2并不能识别，经过上面的分析，
我们可以将PUSH DWORD [0087018E] 改为 JMP DWORD [0087018E]，Import REConstructor就可以重建，
将 FF35 改为 FF25 就行了
;=======================================================================

再过不远就到
016F:005760EB LEA EDI,[EBP+0040AEB0]
016F:005760F1 XOR EAX,EAX
016F:005760F3 MOV ECX,02C0
016F:005760F8 REP STOSB ;<-- 清除上面的代码
016F:005760FA LEA EDI,[EBP+00409B68]
016F:00576100 MOV ECX,1105
016F:00576105 REP STOSB ;<-- 清除上面的代码
016F:00576107 STOSW
016F:00576109 LEA EDI,[EBP+00409B68]
016F:0057610F TEST ESI,ESI
016F:00576111 JNZ 0057611B
016F:00576113 MOV DWORD [EDI],C340C033
016F:00576119 JMP SHORT 00576126
016F:0057611B MOV BYTE [EDI],E9
016F:0057611E INC EDI
016F:0057611F SUB EBX,EDI
016F:00576121 SUB EBX,BYTE +04
016F:00576124 MOV [EDI],EBX
016F:00576126 LEA EDI,[EBP+0040AC6D]
016F:0057612C MOV ECX,2C
016F:00576131 REP STOSB ;<-- 清除上面的代码
016F:00576133 STOSW
016F:00576135 JMP SHORT 00576139
016F:00576137 INT 20
016F:00576139 POPA
016F:0057613A JMP NEAR [ESP-30] ;<--Jump to OEP


MagicWin 2.0

标 题:由对MagicWin 2.0的脱壳想到的 (3千字)
发信人:robot
时 间:2001-2-22 1:37:33
详细信息:
本文是我在脱壳过程中的体会，对于软件的脱壳，我目前还有很多不明白的地方，请高手赐教。
url: http://binbin.myrice.com/download/magicwin2.zi
说明：该软件在一定程度上是免费的，本人仅是以这个软件为例来讨论一些问题
MagicWin 2.0是Authorware的第三方外部函数，程序名为magicwin.u32，即dll库，程序已经被加壳，该壳用fi并不能检测出来，本文的目的是脱壳并找到程序的入口点，而不是找出该dll的注册码的计算部分。

工具：SoftICE 4.05，Procdump 1.6，peditor，W32Dasm

1. 运行peditor，打开magicwin.u32，观察入口点为1D001
2. 运行Authorware 5.2，选择倒入外部函数，load，弹出对话框后，找到magicwin.u32
3. Ctrl+D呼出SoftICE，bpx loadlibrarya，f5，选择打开magicwin.u32，这时会被SoftICE拦截，这时的magicwin.u32已经脱壳
4. code on，记下eip当前的机器码：8B F0，a eip，输入jmp eip(机器码EB FE)，f5
5. 运行Procdump，在task中找到Authorware 5.exe，在其下面的module中找到magicwin.u32，鼠标右键dump，就会得到脱壳的文件，现在需要的工作之一就是修改入口点
6. 观察magicwin.u32被载入到05410000段，05410000+1D001=0542D001，即加壳的入口点，bpx 0542D001，f5
7. 随便选择一个要载入的函数或者选择“取消”，这时又会被拦回
8. f8几次就会来到入口点：05412B38，用peditor编辑脱壳后的magicwin.u32，改入口点为2B38
9. 一般地，到8也就结束了，重新修改资源即可得到完整的脱壳文件。
但下面的是我的发现及体会
10. 用W32Dasm对magicwin.u32反汇编，在改入口点之前和之后有些不一样，在改之前反汇编的结果入口点是灰的，而改之后则有入口点，到底是什么原因哪？

观察程序的section，共有7个，如下(改入口点之前)
Object01: .text RVA: 00001000 Offset: 00000600 Size: 000044D0 Flags: 60000040
Object02: .rdata RVA: 00006000 Offset: 00004C00 Size: 00001180 Flags: C0000040
Object03: .data RVA: 00008000 Offset: 00005E00 Size: 00010C3C Flags: C0000040
Object04: .rsrc RVA: 00019000 Offset: 00016C00 Size: 00002E8C Flags: C0000040
Object05: .reloc RVA: 0001C000 Offset: 00019C00 Size: 0000062C Flags: C0000040
Object06: .crypt RVA: 0001D000 Offset: 0001A400 Size: 00001318 Flags: C0000040
Object07: .data RVA: 0001F000 Offset: 0001B800 Size: 00000000 Flags: C0000040

其中，第6个为壳的代码，section为一个中不中洋不洋的的名字，为了便于理解，用peditor改为.crypt，从这个表中可以知道，.text为代码部分，Flags为60000040，其他的均为C0000040，这就告诉W32Dasm，
只对.text中的代码进行反汇编，而壳的地址为1D000，故这段代码当然就不进行反汇编，因此，用peditor修改magicwin.u32，编辑.crypt段，将Flags由C0000040改为60000040，再用W32Dasm进行反汇编，哈哈，这回壳的代码出来了，入口点也有了，看一段该壳的反汇编结果

:1001D001 60 pushad <-- 壳的入口地址
:1001D002 E900000000 jmp 1001D007
:1001D007 E824040000 call 1001D430
:1001D00C EB00 jmp 1001D00E
:1001D00E BB30394400 mov ebx, 00443930
:1001D013 03DD add ebx, ebp
:1001D015 2B9DD03F4400 sub ebx, dword ptr [ebp+00443FD0]
:1001D01B 83BDFC49440000 cmp dword ptr [ebp+004449FC], 00000000 <--是否已经解码，0则表示没有解码
:1001D022 899DFC494400 mov dword ptr [ebp+004449FC], ebx
:1001D028 0F8566030000 jne 1001D394 <-- 已经解码，则走
:
:
:
:1001D394 8B85AD394400 mov eax, dword ptr [ebp+004439AD]
:
:
:做一些准备工作
:
:
:1001D3B5 68382B4105 push 05412B38 <-- magicwin.u32真正的入口点
:1001D3BA C3 ret

通过这个程序的脱壳过程，使我体会到，如果需要反汇编出某段代码，只要修改其Flags，这对于那些加过壳的软件可能会有帮助。在《论坛精华》的脱壳篇中，冰毒的文章《手动脱壳的基本技巧》有这样一段文字：“别人教我说, E0000020将使section成为可执行的,因此Softice将会中断于入口处.”也许就是这个意思。我将C0000040改为60000040可能实际上并不对，但我的目的是反汇编，只要能反汇编出代码就行了。
希望高手能批评指正，大家共同探讨。另外，我对脱壳后的重建还不是很熟，谁能帮我？


红色警报2防拷贝

 标 题:(safedisc 2) 红色警报2破软件防拷贝部分分析 (30千字)
发信人:machoman[CCG]
时 间:2001-5-21 20:07:52
详细信息:
(safedisc 2) 红色警报2破软件防拷贝部分
CrackBy: machoman[CCG]
AllRight Reserved : [CCG](China Crack Group)
其他不同SD2保护采用方式也是相似的，其保护方法其实采用Crack的方式是不太舒服的。在驱动级截获其命令，对付SD2是最简单的方法。

红色警报2的安装文件setup.exe 和可执行文件ra2.exe采用了多种防拷贝措施，在这里面加入了safedisc2
的防拷贝部分的代码，和一个不知道的壳，在这个壳的保护下。通过一系列代码保护的外加程序，变形的外接
dll文件。对程序进行一部分部分的还原。并且在其中加入了防止debug的措施，在以下的部分主要就是要通过
对这几部分的保护，找到程序的完全还原的映射。把它重新构件为一个无壳,无防debug,无safedisc2调用的可
执行文件。我通过以下步骤想完成该部分的无壳程序的重建。

1。）首先用trw 1.03装入程序ra2.exe
然后跟踪到程序完全还原处，在这个程序中的解密还原处为40787f绝对地址。用suspend 挂起程序
再把内存中的影象用pdump1.60保存在一个文件中。得到了该程序的无壳影象。但这个程序还不可执行，这个程
序破坏了导入表。无法装入外界的动态连接库。
再重构import_table ，让程序能够找到入口，这个程序的导入表也采用了加密措施，它把导入表的解密部分
放在~df349b.tmp的里面，在这里进行导入表的再装配，但其实只是对kernel32.dll和user32.dll的import_
table进行了加密，ra2.exe程序在对这两个的内含函数进行调用时，需要通过对~df349b.tmp调用，才能间接的
访问这些函数，但这个~df349b.tmp(~df349b.dll)本身也是加有外壳，被一个不知道的壳付在上面，而且也防
调试，只能通过自己重构一个import_table跳过对这的调用，给ra2.exe中的调用重新建立隐射。
下面是重建import_table的步骤
(1)首先在dump出来的文件中查找kernel32.dll这个字符串，它的导入表需要重建。在文件中可以找到几个位置
其中在0131a4,这个位置的字符就是该在import_table的IMAGE_IMPORT_DESCRIPTOR.name指针指向的内容，于是
就查找到在ra2.exe的正确的导入表位置在12cd8在这里开始的就是程序的导入表的IMAGE_IMPORT_DESCRIPTOR结
构所在。然后把程序的IMAGE_DATA_DIRCTORY的第二项，就是improt_table的地址改为12cd8就可以找到部分的导
入函数，就是除kernel32.dll,和user32.dll以外的其他函数都定位正确，但是这两个函数的RVA地址全没有正确
定位，看来程序是对这个部分的导入进行了手工的重新装配，它的手工装配程序在~df349b.tmp里执行，这部分
也是有壳加密的，脱起来很繁。最好的办法就是跳过这个动态库函数的调用。自己去给它重构它的RVA,但我对
pe的装入机制不了解，现在还不能重构好，重构出来的也不能完全对应。但是程序只要完成了导入表的重构，
就能够做到破软件防拷贝。不会在对硬件要求是safedisc2加密后的盘应该也能读，因为在脱壳完成后就已经
跳过了检测部分的代码。
有一个很奇怪的情况，程序在我下脱壳断点的位置，时我还dump出了一个很奇怪的文件。这个文件好象正跟我
上面要找的导入表互补，它的导入表是完整的，但是程序是一个部分的影射，不能执行。但我我用静态反汇编就已
经发现了我所有的调用的函数的入口，但是我现在还是没太搞懂import_table的结构，我自己去找这个文件的
入口结构时又是怪怪的。找不到。我有种感觉，这个程序是分段解密调入执行的，所有的tmp都是临时的可执行
影象，只要搞清楚这两个的联系，完全脱壳该是只有一步了，但我现在就是不能把这两个联系起来。。。

这样解后程序就能够跳过对soft_ice和safedisc2的检测，但还是不能对光盘的物理结构的section进行拷贝，
这样做只是跳过了软件部分的检测，对光盘的拷贝破解还是需要对safdisc2的结构继续研究。
在safedisc2加密的文件中有两种切入导入表的方法，第一种是在ra2.exe中除了导入表的位置改动，其他没有
变化的方法，这样的部分可以重新指正确就可以改动，在safedisc2中对这部分的处理采用了以下方法，先把程
序的导入表位置改为加密dll的入口，在加密dll中先有以下代码对程序的环境压入堆栈，保护然后进入加密部
分切入核心模块，

(2)在已经dump出的部分的程序中，也还有部分的import参数不是直接调用的情况它采用一个jmp指令跳到下面的地
方进行切换进入外接的dll,这样也造成了程序的代码返回后的不可读性，只有把这样的调用也给它重新构造，才
能把代码完全还原，它是采用的分别跳转的方法，有很多个类似的jmp和这样的切入真的好烦！！！每个都要去
给它打掉才可以重构，这个加密给解密的工作量是很大的。。
/*********************************************************************************************/
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C488(U)
|
:0041B025 53 push ebx //这个ebx该是外接dll的代码段描述符
:0041B026 E800000000 call 0041B02B//这个调用的目的是把IP压入堆栈

* Referenced by a CALL at Address:
|:0041B026
|
:0041B02B 870424 xchg dword ptr [esp], eax//eax中为新的IP跟堆栈中的进行交换
:0041B02E 9C pushfd//32位标志压入堆栈
:0041B02F 05D5FFFFFF add eax, FFFFFFD5//IP-2bh=41b02b-2bh=41b000,每个调用都是定位这里
:0041B034 8B18 mov ebx, dword ptr [eax]//把这个位置的内容送给ebx
:0041B036 6BDB01 imul ebx, 00000001
:0041B039 035804 add ebx, dword ptr [eax+04]//41b004中该是存储的入口dll的基地址
:0041B03C 9D popfd
:0041B03D 58 pop eax
:0041B03E 871C24 xchg dword ptr [esp], ebx//改变ret的方向，实际上是切换进入dll
:0041B041 C3 ret//进入dll,调用函数，加密挺厉害的！！！！！！
/*********************************************************************************************/

红色警报2，该程序在安装及执行前先在系统的mywindows\temp生成一个子目录~ef87a,这个目录里有几个临时
文件，其中的~df394b.tmp其实是一个动态连接库，该为~df394b.dll在其中内有判断调试器存在的代码，要跟踪
就一定要打掉这几个保护，该类文件在程序退出时会删除，下面就是其判断Soft_ice的方法
Kill_ice (1)
/***********************************************************************************************/
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000F415(C), :1000F419(C)
|
:1000F41E EB03 jmp 1000F423

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F413(C)
|
:1000F420 73F3 jnb 1000F415
:1000F422 18C7 sbb bh, al
:1000F424 45 inc ebp
:1000F425 FC cld
:1000F426 00000000 BYTE 4 DUP(0)
;This method of detection of SoftICE (as well as the following one) is
;used by the majority of packers/encryptors found on Internet.
;It seeks the signature of BoundsChecker in SoftICE

:1000F42A 55 push ebp
:1000F42B BD4B484342 mov ebp, 4243484B ; 'BCHK'
:1000F430 B804000000 mov eax, 00000004
:1000F435 CC int 03//这里是判断soft_ice的一种方法
:1000F436 5D pop ebp
:1000F437 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:1000F43E EB14 jmp 1000F454
:1000F440 8B55EC mov edx, dword ptr [ebp-14]
:1000F443 52 push edx
:1000F444 E8E7000000 call 1000F530
:1000F449 C3 ret
Kill_ice(2)
/***********************************************************************************************/
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000E493(C), :1000E4AF(U)
|
:1000E4A8 8BFF mov edi, edi
:1000E4AA 7006 jo 1000E4B2
:1000E4AC 90 nop
:1000E4AD 7103 jno 1000E4B2
:1000E4AF EBF7 jmp 1000E4A8
:1000E4B1 DBE8 fucomi st(0), st(0)
:1000E4B3 C9 leave
:1000E4B4 000000 BYTE 3 DUP(0)

//Method of detection of the WinICE handler in the int68h (V86)
// mov ah,43h
// int 68h
// cmp ax,0F386h
// jz SoftICE_Detected

:1000E4B7 25FFFF0000 and eax, 0000FFFF
:1000E4BC 85C0 test eax, eax
:1000E4BE 7522 jne 1000E4E2
:1000E4C0 60 pushad
:1000E4C1 33C0 xor eax, eax
:1000E4C3 66B80043 mov ax, 4300
:1000E4C7 CD68 int 68
:1000E4C9 89855CFFFFFF mov dword ptr [ebp+FFFFFF5C], eax
:1000E4CF 3D00430000 cmp eax, 00004300
:1000E4D4 740B je 1000E4E1
:1000E4D6 B801000000 mov eax, 00000001
:1000E4DB 898560FFFFFF mov dword ptr [ebp+FFFFFF60], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000E4D4(C)
|
:1000E4E1 61 popad

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000E4BE(C)
|
:1000E4E2 33D2 xor edx, edx
:1000E4E4 83BD60FFFFFF00 cmp dword ptr [ebp+FFFFFF60], 00000000
:1000E4EB 0F95C2 setne dl
:1000E4EE 668955FC mov word ptr [ebp-04], dx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000E43E(C)
|
:1000E4F2 EB07 jmp 1000E4FB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000E4FB(U)
|
:1000E4F4 8BFF mov edi, edi
:1000E4F6 7806 js 1000E4FE
:1000E4F8 90 nop
:1000E4F9 7903 jns 1000E4FE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000E4F2(U)
|
:1000E4FB EBF7 jmp 1000E4F4
:1000E4FD 3A7F09 cmp bh, byte ptr [edi+09]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000E50B(C)
|
:1000E500 90 nop
:1000E501 87DB xchg ebx, ebx
:1000E503 7809 js 1000E50E
:1000E505 87D2 xchg edx, edx
:1000E507 7905 jns 1000E50E
:1000E509 7700 ja 1000E50B
Kill_ice (3)
/***********************************************************************************************/
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1001094C(C), :10010950(C)
|
:10010955 EB03 jmp 1001095A
:10010957 70F3 jo 1001094C
:10010959 0B6A00 or ebp, dword ptr [edx+00]
:1001095C 6880000000 push 00000080
:10010961 6A03 push 00000003
:10010963 6A00 push 00000000
:10010965 6A03 push 00000003
:10010967 68000000C0 push C0000000
:1001096C 8B955CFFFFFF mov edx, dword ptr [ebp+FFFFFF5C]//检测在win98里有soft_ice存在
:10010972 52 push edx // \\.\SICE
:10010973 FF954CFFFFFF call dword ptr [ebp+FFFFFF4C]//这里实际是调用API CreateFileA
:10010979 898548FFFFFF mov dword ptr [ebp+FFFFFF48], eax //这里如果是有Soft_ice，eax!=-1
:1001097F EB07 jmp 10010988
kill_ice(4)
/***********************************************************************************************/
//在以下的程序中改动中断变量描述符表(idt)的int 05号中断，被该程序站用
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100081EA(C)
|
:100081F7 73F3 jnb 100081EC
:100081F9 82C745 add bh, 45
:100081FC FC cld
:100081FD 00000000 BYTE 4 DUP(0)

:10008201 60 pushad
:10008202 9C pushfd
:10008203 0F014DDC sidt [ebp-24]//取出中断变量描述符(idtr)寄存器
:10008207 8B5DDE mov ebx, dword ptr [ebp-22]//取出基地址
:1000820A 039D38FFFFFF add ebx, dword ptr [ebp+FFFFFF38]//定位到int 05号中断base+0x28
:10008210 8BBD2CFFFFFF mov edi, dword ptr [ebp+FFFFFF2C]//把原来的中断向量保存在这个单元
:10008216 8BF3 mov esi, ebx//保存原来的int 05中断描述符表的内容，以被后面退出恢复
:10008218 A5 movsd
:10008219 A5 movsd
:1000821A FA cli //关中断
:1000821B 8BFB mov edi, ebx//把红警的描述符表的05中断向量挂到int 05
:1000821D 8B75E4 mov esi, dword ptr [ebp-1C]//红警改动的描述符表的位址
:10008220 A5 movsd
:10008221 A5 movsd
:10008222 FB sti//开中断，
//只在这条指令开放了中断，到底干啥？
:10008223 FA cli //关中断
:10008224 8BFB mov edi, ebx//恢复原来的中断向量
:10008226 8BB52CFFFFFF mov esi, dword ptr [ebp+FFFFFF2C]//马上又恢复中断！
:1000822C A5 movsd
:1000822D A5 movsd
:1000822E FB sti
:1000822F 9D popfd
:10008230 61 popad
:10008231 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:10008238 E99E000000 jmp 100082DB
:1000823D B801000000 mov eax, 00000001
:10008242 C3 ret
/***********************************************************************************************/
//程序调用~df50cd.dll(~df50cd.tmp)验证逻辑驱动器是不是光驱，这里是判断的过程，这个保护很容易通过，
只要改动程序在以下部分的内容就可以实现，但关键是对解开safedisc 2的保护才能通过对程序的使用。
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10014993(C), :100149B7(C)
|
:100149C8 8D442418 lea eax, dword ptr [esp+18]
:100149CC 50 push eax
:100149CD 6895000000 push 00000095

* Reference To: KERNEL32.GetLogicalDriveStringsA, Ord:00F8h//把所有的逻辑驱动器的号取出，判断光驱
|
:100149D2 FF1554700210 Call dword ptr [10027054]
:100149D8 8A442418 mov al, byte ptr [esp+18]
:100149DC C644241000 mov [esp+10], 00
:100149E1 84C0 test al, al
:100149E3 0F8485000000 je 10014A6E
:100149E9 8B442410 mov eax, dword ptr [esp+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10014A4F(C)
|
:100149ED 25FF000000 and eax, 000000FF
:100149F2 8D740418 lea esi, dword ptr [esp+eax+18]
:100149F6 56 push esi
:100149F7 FFD3 call ebx //这里是调用GetDriveTypeA判断指定的驱动器是不是，光驱
:100149F9 83F805 cmp eax, 00000005
:100149FC 7520 jne 10014A1E
:100149FE 57 push edi
:100149FF 56 push esi

* Possible StringData Ref from Data Obj ->"%s%s"
|
:10014A00 6824A40210 push 1002A424
:10014A05 6830170310 push 10031730
:10014A0A E811300000 call 10017A20
:10014A0F 83C410 add esp, 00000010
:10014A12 6830170310 push 10031730
:10014A17 FFD5 call ebp
:10014A19 83F8FF cmp eax, FFFFFFFF
:10014A1C 7541 jne 10014A5F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100149FC(C)
|
:10014A1E 803E00 cmp byte ptr [esi], 00
:10014A21 7416 je 10014A39

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10014A37(C)
|
:10014A23 FE442410 inc [esp+10]
:10014A27 8B4C2410 mov ecx, dword ptr [esp+10]
:10014A2B 81E1FF000000 and ecx, 000000FF
:10014A31 8A440C18 mov al, byte ptr [esp+ecx+18]
:10014A35 84C0 test al, al
:10014A37 75EA jne 10014A23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10014A21(C)
|
:10014A39 FE442410 inc [esp+10]
:10014A3D 8B442410 mov eax, dword ptr [esp+10]
:10014A41 8BD0 mov edx, eax
:10014A43 81E2FF000000 and edx, 000000FF
:10014A49 8A4C1418 mov cl, byte ptr [esp+edx+18]
:10014A4D 84C9 test cl, cl
:10014A4F 759C jne 100149ED
:10014A51 6633C0 xor ax, ax
:10014A54 5F pop edi
:10014A55 5E pop esi
:10014A56 5D pop ebp
:10014A57 5B pop ebx
:10014A58 81C4A4010000 add esp, 000001A4
:10014A5E C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10014A1C(C)
|
:10014A5F 66B80100 mov ax, 0001
:10014A63 5F pop edi
:10014A64 5E pop esi
:10014A65 5D pop ebp
:10014A66 5B pop ebx
:10014A67 81C4A4010000 add esp, 000001A4
:10014A6D C3 ret
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100149E3(C)
|
:10014A6E 5F pop edi
:10014A6F 5E pop esi
:10014A70 5D pop ebp
:10014A71 6633C0 xor ax, ax
:10014A74 5B pop ebx
:10014A75 81C4A4010000 add esp, 000001A4
:10014A7B C3 ret

:10014A7C 90 nop
:10014A7D 90 nop
:10014A7E 90 nop
:10014A7F 90 nop

* Referenced by a CALL at Address:
|:1000E81E
|
:10014A80 83EC1C sub esp, 0000001C
:10014A83 66833D0825031000 cmp word ptr [10032508], 0000
:10014A8B 53 push ebx
:10014A8C 56 push esi
:10014A8D 57 push edi
:10014A8E 745D je 10014AED
:10014A90 A110250310 mov eax, dword ptr [10032510]
:10014A95 50 push eax

* Reference To: USER32.DestroyWindow, Ord:008Ah
|
:10014A96 FF1594710210 Call dword ptr [10027194]

* Reference To: USER32.PeekMessageA, Ord:01AFh
|
:10014A9C 8B35E0710210 mov esi, dword ptr [100271E0]
:10014AA2 6A01 push 00000001
:10014AA4 6A00 push 00000000
:10014AA6 6A00 push 00000000
:10014AA8 8D4C2418 lea ecx, dword ptr [esp+18]
:10014AAC 6A00 push 00000000
:10014AAE 51 push ecx
:10014AAF FFD6 call esi
:10014AB1 85C0 test eax, eax
:10014AB3 7459 je 10014B0E

* Reference To: USER32.TranslateMessage, Ord:0245h
|
:10014AB5 8B3DE4710210 mov edi, dword ptr [100271E4]

* Reference To: USER32.DispatchMessageA, Ord:0090h
|
:10014ABB 8B1DE8710210 mov ebx, dword ptr [100271E8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10014AE0(C)
|
:10014AC1 8D54240C lea edx, dword ptr [esp+0C]
:10014AC5 52 push edx
:10014AC6 FFD7 call edi
:10014AC8 8D44240C lea eax, dword ptr [esp+0C]
:10014ACC 50 push eax
:10014ACD FFD3 call ebx
:10014ACF 6A01 push 00000001
:10014AD1 6A00 push 00000000
:10014AD3 6A00 push 00000000
:10014AD5 8D4C2418 lea ecx, dword ptr [esp+18]
:10014AD9 6A00 push 00000000
:10014ADB 51 push ecx
:10014ADC FFD6 call esi
:10014ADE 85C0 test eax, eax
:10014AE0 75DF jne 10014AC1
:10014AE2 66B80100 mov ax, 0001
:10014AE6 5F pop edi
:10014AE7 5E pop esi
:10014AE8 5B pop ebx
:10014AE9 83C41C add esp, 0000001C
:10014AEC C3 ret
/*******************************************************************************************/

以下是脱壳过后的.stxt744 section的代码，跳转(jmp)切入Kernel32.dll 和User32.dll要用到这里的代码，这里就是IMPORT_TABLE
重构部分，小弟完全是用手工给重构的，真太笨了。哪个大哥能说说这样的东西该如何用技巧解决？
*********************************************************************************************

:0041B000 4B dec ebx
:0041B001 0300 add eax, dword ptr [eax]
:0041B003 00DB add bl, bl
:0041B005 630D0153E800 arpl dword ptr [00E85301], ecx
:0041B00B 000000 BYTE 3 DUP(0)

:0041B00E 870424 xchg dword ptr [esp], eax
:0041B011 9C pushfd
:0041B012 05F2FFFFFF add eax, FFFFFFF2
:0041B017 8B18 mov ebx, dword ptr [eax]
:0041B019 6BDB00 imul ebx, 00000000
:0041B01C 035804 add ebx, dword ptr [eax+04]
:0041B01F 9D popfd
:0041B020 58 pop eax
:0041B021 871C24 xchg dword ptr [esp], ebx
:0041B024 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C488(U)
|
:0041B025 53 push ebx
:0041B026 E800000000 call 0041B02B

* Referenced by a CALL at Address:
|:0041B026
|
:0041B02B 870424 xchg dword ptr [esp], eax
:0041B02E 9C pushfd
:0041B02F 05D5FFFFFF add eax, FFFFFFD5
:0041B034 8B18 mov ebx, dword ptr [eax]
:0041B036 6BDB01 imul ebx, 00000001
:0041B039 035804 add ebx, dword ptr [eax+04]
:0041B03C 9D popfd
:0041B03D 58 pop eax
:0041B03E 871C24 xchg dword ptr [esp], ebx
:0041B041 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C90A(U)
|
:0041B042 53 push ebx
:0041B043 E800000000 call 0041B048

* Referenced by a CALL at Address:
|:0041B043
|
:0041B048 870424 xchg dword ptr [esp], eax
:0041B04B 9C pushfd
:0041B04C 05B8FFFFFF add eax, FFFFFFB8
:0041B051 8B18 mov ebx, dword ptr [eax]
:0041B053 6BDB02 imul ebx, 00000002
:0041B056 035804 add ebx, dword ptr [eax+04]
:0041B059 9D popfd
:0041B05A 58 pop eax
:0041B05B 871C24 xchg dword ptr [esp], ebx
:0041B05E C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409D7D(U)
|
:0041B05F 53 push ebx
:0041B060 E800000000 call 0041B065

* Referenced by a CALL at Address:
|:0041B060
|
:0041B065 870424 xchg dword ptr [esp], eax
:0041B068 9C pushfd
:0041B069 059BFFFFFF add eax, FFFFFF9B
:0041B06E 8B18 mov ebx, dword ptr [eax]
:0041B070 6BDB03 imul ebx, 00000003
:0041B073 035804 add ebx, dword ptr [eax+04]
:0041B076 9D popfd
:0041B077 58 pop eax
:0041B078 871C24 xchg dword ptr [esp], ebx
:0041B07B C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D48A(U)
|
:0041B07C 53 push ebx
:0041B07D E800000000 call 0041B082

* Referenced by a CALL at Address:
|:0041B07D
|
:0041B082 870424 xchg dword ptr [esp], eax
:0041B085 9C pushfd
:0041B086 057EFFFFFF add eax, FFFFFF7E
:0041B08B 8B18 mov ebx, dword ptr [eax]
:0041B08D 6BDB04 imul ebx, 00000004
:0041B090 035804 add ebx, dword ptr [eax+04]
:0041B093 9D popfd
:0041B094 58 pop eax
:0041B095 871C24 xchg dword ptr [esp], ebx
:0041B098 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004079B7(U)
|
:0041B099 53 push ebx
:0041B09A E800000000 call 0041B09F

* Referenced by a CALL at Address:
|:0041B09A
|
:0041B09F 870424 xchg dword ptr [esp], eax
:0041B0A2 9C pushfd
:0041B0A3 0561FFFFFF add eax, FFFFFF61
:0041B0A8 8B18 mov ebx, dword ptr [eax]
:0041B0AA 6BDB05 imul ebx, 00000005
:0041B0AD 035804 add ebx, dword ptr [eax+04]
:0041B0B0 9D popfd
:0041B0B1 58 pop eax
:0041B0B2 871C24 xchg dword ptr [esp], ebx
:0041B0B5 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403788(U)
|
:0041B0B6 53 push ebx
:0041B0B7 E800000000 call 0041B0BC

* Referenced by a CALL at Address:
|:0041B0B7
|
:0041B0BC 870424 xchg dword ptr [esp], eax
:0041B0BF 9C pushfd
:0041B0C0 0544FFFFFF add eax, FFFFFF44
:0041B0C5 8B18 mov ebx, dword ptr [eax]
:0041B0C7 6BDB06 imul ebx, 00000006
:0041B0CA 035804 add ebx, dword ptr [eax+04]
:0041B0CD 9D popfd
:0041B0CE 58 pop eax
:0041B0CF 871C24 xchg dword ptr [esp], ebx
:0041B0D2 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409CF1(U)
|
:0041B0D3 53 push ebx
:0041B0D4 E800000000 call 0041B0D9

* Referenced by a CALL at Address:
|:0041B0D4
|
:0041B0D9 870424 xchg dword ptr [esp], eax
:0041B0DC 9C pushfd
:0041B0DD 0527FFFFFF add eax, FFFFFF27
:0041B0E2 8B18 mov ebx, dword ptr [eax]
:0041B0E4 6BDB07 imul ebx, 00000007
:0041B0E7 035804 add ebx, dword ptr [eax+04]
:0041B0EA 9D popfd
:0041B0EB 58 pop eax
:0041B0EC 871C24 xchg dword ptr [esp], ebx
:0041B0EF C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040517E(U)
|
:0041B0F0 53 push ebx
:0041B0F1 E800000000 call 0041B0F6

* Referenced by a CALL at Address:
|:0041B0F1
|
:0041B0F6 870424 xchg dword ptr [esp], eax
:0041B0F9 9C pushfd
:0041B0FA 050AFFFFFF add eax, FFFFFF0A
:0041B0FF 8B18 mov ebx, dword ptr [eax]
:0041B101 6BDB08 imul ebx, 00000008
:0041B104 035804 add ebx, dword ptr [eax+04]
:0041B107 9D popfd
:0041B108 58 pop eax
:0041B109 871C24 xchg dword ptr [esp], ebx
:0041B10C C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004090F1(U)
|
:0041B10D 53 push ebx
:0041B10E E800000000 call 0041B113

* Referenced by a CALL at Address:
|:0041B10E
|
:0041B113 870424 xchg dword ptr [esp], eax
:0041B116 9C pushfd
:0041B117 05EDFEFFFF add eax, FFFFFEED
:0041B11C 8B18 mov ebx, dword ptr [eax]
:0041B11E 6BDB09 imul ebx, 00000009
:0041B121 035804 add ebx, dword ptr [eax+04]
:0041B124 9D popfd
:0041B125 58 pop eax
:0041B126 871C24 xchg dword ptr [esp], ebx
:0041B129 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409450(U)
|
:0041B12A 53 push ebx
:0041B12B E800000000 call 0041B130

* Referenced by a CALL at Address:
|:0041B12B
|
:0041B130 870424 xchg dword ptr [esp], eax
:0041B133 9C pushfd
:0041B134 05D0FEFFFF add eax, FFFFFED0
:0041B139 8B18 mov ebx, dword ptr [eax]
:0041B13B 6BDB0A imul ebx, 0000000A
:0041B13E 035804 add ebx, dword ptr [eax+04]
:0041B141 9D popfd
:0041B142 58 pop eax
:0041B143 871C24 xchg dword ptr [esp], ebx
:0041B146 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040381C(U)
|
:0041B147 53 push ebx
:0041B148 E800000000 call 0041B14D

* Referenced by a CALL at Address:
|:0041B148
|
:0041B14D 870424 xchg dword ptr [esp], eax
:0041B150 9C pushfd
:0041B151 05B3FEFFFF add eax, FFFFFEB3
:0041B156 8B18 mov ebx, dword ptr [eax]
:0041B158 6BDB0B imul ebx, 0000000B
:0041B15B 035804 add ebx, dword ptr [eax+04]
:0041B15E 9D popfd
:0041B15F 58 pop eax
:0041B160 871C24 xchg dword ptr [esp], ebx
:0041B163 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403AD2(U)
|
:0041B164 53 push ebx
:0041B165 E800000000 call 0041B16A

* Referenced by a CALL at Address:
|:0041B165
|
:0041B16A 870424 xchg dword ptr [esp], eax
:0041B16D 9C pushfd
:0041B16E 0596FEFFFF add eax, FFFFFE96
:0041B173 8B18 mov ebx, dword ptr [eax]
:0041B175 6BDB0C imul ebx, 0000000C
:0041B178 035804 add ebx, dword ptr [eax+04]
:0041B17B 9D popfd
:0041B17C 58 pop eax
:0041B17D 871C24 xchg dword ptr [esp], ebx
:0041B180 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409485(U)
|
:0041B181 53 push ebx
:0041B182 E800000000 call 0041B187

* Referenced by a CALL at Address:
|:0041B182
|
:0041B187 870424 xchg dword ptr [esp], eax
:0041B18A 9C pushfd
:0041B18B 0579FEFFFF add eax, FFFFFE79
:0041B190 8B18 mov ebx, dword ptr [eax]
:0041B192 6BDB0D imul ebx, 0000000D
:0041B195 035804 add ebx, dword ptr [eax+04]
:0041B198 9D popfd
:0041B199 58 pop eax
:0041B19A 871C24 xchg dword ptr [esp], ebx
:0041B19D C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C41C(U)
|
:0041B19E 53 push ebx
:0041B19F E800000000 call 0041B1A4

* Referenced by a CALL at Address:
|:0041B19F
|
:0041B1A4 870424 xchg dword ptr [esp], eax
:0041B1A7 9C pushfd
:0041B1A8 055CFEFFFF add eax, FFFFFE5C
:0041B1AD 8B18 mov ebx, dword ptr [eax]
:0041B1AF 6BDB0E imul ebx, 0000000E
:0041B1B2 035804 add ebx, dword ptr [eax+04]
:0041B1B5 9D popfd
:0041B1B6 58 pop eax
:0041B1B7 871C24 xchg dword ptr [esp], ebx
:0041B1BA C3 ret


红色警报2脱壳

标 题:贴上一个safedisc2的东西，方法奇搓，希望其他兄弟能给出更好的搞定方法。我先谢谢了 (12千字)
发信人:买草帽
时 间:2001-2-9 9:20:42
详细信息:
红色警报2(red Alert 2)繁体版脱壳解密说明
1概述 ：
红色警报2是WestWood的新版游戏，它在众多游戏中率先采用了c-dilla公司的光盘保护技术safedic
2来对其起正版保护。要让游戏在虚拟光驱的环境下能够运行，首先必须模拟或者跳过对光盘保护特征区域
的调用。根据实际的情况，在red alert 2中并没有把游戏的数据写入保护区域。这样就为我们通过脱去游
戏的光盘识别部分的判别程序。重构一个不具备判断保护的程序提供了可能。以下的做法就是在以脱壳的基
础上实现其在虚拟光驱下执行游戏的一种实现方法的操作说明。

--使用工具
- TRW V1.23 (safdisc2的保护部分对softice的防护很周到，就是加补丁也搞死。好在还有TRW)
- 天意II0.46测试版(也是一个很新的动态反编译工具，就是现在不太稳定。支持的命令也不太全)
- ProcDump 1.6.2 FINAL VERSION (脱壳工具，用它可以方便的重内存中dump出映像)
- W32Dasm Version 8.93 (比较直观的静态反汇编工具)
- UltrEdit32 (或者其他的2进制编辑器用来修改程序)
- Vitual Driver 2000 v 6.0 虚拟光驱软件(farstone)
-----具体操作
---脱壳
首先用TRW 1.23 装入该软件的可执行档ra2.exe.程序载入后 ,首先停留在。stext371这个section中代码
部分如下：
016F:0041C1FD 55 PUSH EBP//装入停留在这里
016F:0041C1FE 8BEC MOV EBP,ESP
016F:0041C200 60 PUSHAD
016F:0041C201 B87BC24100 MOV EAX,0041C27B
016F:0041C206 2DFDC14100 SUB EAX,0041C1FD
016F:0041C20B 03057CC24100 ADD EAX,[0041C27C]
016F:0041C211 C705FDC14100E9000000 MOV DWORD PTR [0041C1FD],E9
016F:0041C21B A3FEC14100 MOV DOWRD PTR [0041C1FE],EAX
016F:0041C220 68C9C04100 PUSH 0041C0C9
016F:0041C225 68BBC04100 PUSH 0041C0BB
016F:0041C22A 6809C04100 PUSH 0041C009
016F:0041C22F 689BC04100 PUSH 0041C09B
016F:0041C234 A021C04100 MOV AL,[0041C021]
016F:0041C239 3C01 CMP AL,01
016F:0041C23B 7407 JE 0041C244
016F:0041C23D B800000000 MOV EAX,00
016F:0041C242 EB03 JMP 0041C247
016F:0041C244 8B4508 MOV EAX,[EBP+08]
016F:0041C247 50 PUSH EAX
016F:0041C248 E833000000 CALL 0041C280//这里就是safedisc2解密代码的入口，按F10跳过
016F:0041C24D 83C414 ADD ESP,14
016F:0041C250 83F800 CMP EAX,00
016F:0041C253 741C JE 0041C271
当程序过了41c248这个调用后就会弹出一个开始图象，在这个call 41c280中就是safdisc2的关键部分，但现
在不用去研究它。当按F10走过这里时，程序再单步执行几步会跳出.stext371这个section,来到如下的部分
这时看看section的情况，已经是在.text的部分了。这就是说程序已经到了无壳时候的部分。该是游戏程序
的真面目了。
016F:0040787F 55 PUSH EBP//停在这里
016F:00407880 8BEC MOV EBP,ESP
016F:00407882 6AFF PUSH FF
016F:00407884 6878234100 PUSH 00412378
016F:00407889 68E4C54000 PUSH 0040C5E4
016F:0040788E 64A100000000 MOV EAX,BYTE PTR FS:[00]
016F:00407894 50 PUSH EAX
016F:00407895 64892500000000 MOV FS:[00],ESP
016F:0040789C 83EC58 SUB ESP,58
016F:0040789F 53 PUSH EBX
016F:004078A0 56 PUSH ESI
016F:004078A1 57 PUSH EDI
016F:004078A2 8965E8 MOV [EBP+E8],ESP
016F:004078A5 FF15DC104100 CALL [004110DC]
016F:004078AB 33D2 XOR EDX,EDX
016F:004078AD 8AD4 MOV DL,AH
016F:004078AF 891518724100 MOV [00417218],EDX
016F:004078B5 8BC8 MOV ECX,EAX
016F:004078B7 81E1FF000000 ADN ECX,FF
016F:004078BD 890D14724100 MOV [00417214],ECX
016F:004078C3 C1E108 SHL ECX,08
016F:004078C6 03CA ADD ECX,EDX
016F:004078C8 890D10724100 MOV [00417210],ECX
当程序在40787f处停下时在TWR1.22中下命令suspend，挂起程序，回到WINDOWS界面，现在我们
要脱掉程序上面的外壳了。在windows下调出ProcDump 1.6.2 FINAL VERSION把内存中的影象dump
出来，打开procdump后再task对话框中可以找到一个ra2.exe的影象，用鼠标选中它，再点鼠标右键
，在弹出框中选择dump(full)项，然后选一个你指定的文件名保存，我用abd.exe保存，这样就把程
序的主体部分给分离出来了。该是没safedic2调用了。

-----IMPORT_TABLE导入表的重构
------第一种情况（你要做 CALL [********]= 转换=> Call Kernel32.dll(或user32.dll)!具体函数）
然后执行一下该档碰碰运气，会不会就OK了。可惜程序可没这样简单，马上给报非法错误。。就在4078a5
处的 call[004110dc]非法错误，这个可是大麻烦处。以下的处理全都是为了解决这个问题而采取的。首先
只有回到原来的程序重新调试到4078a5,然后跟进去看看，马上就是调用一个外接的文件了，空间已经到了另
一个程序应该是一个dll文件。看看它都做了些啥，下内存断点bpm esp RW 执行几下后发现程序最后在
kernel32.dll的空间中停下，想想该是有API调用了。继续发现是对函数Kernel32.dll!GetVersion()的调用，
这只有一个可能加壳程序把原程序的导入表(IMPORT_TABLE)中的Kernel32函数破坏了。它通过外接的dll用函
数GetProcAddress来对每个原来的函数导入进行实现，而且把函数的执行也在其中代劳了。
那我就先在程序中找找导入表的位置把，用procdump打开，点中PE Editor按钮发现IMPORT_TABLE的RVA是
1f000 size 1b8,找到1f000的位置发现导入表的位置全不对！看来程序是把它给隐藏了。而且用W32Dasm反汇
编也找不到。只有手工找找，根据PE文件的结构，我先在abd.exe中查找字符串"kernel32.dll",在131a4这个
RVA找到一个，然后再在程序中查找二进制a4 31 01也就是看IMPORT_TABLE的IMAGE_IMPORT_DESCRIPTOR结构里
有Kernel32.dll这个函数吗，还好，在12ce4处找到。 在我可以先假定IMPROT_TABLE的RVA为12cd8（根据结构
IMAGE_IMPORT_DESCRIPTOR找到其偏移首址）,先改改看。
用procdump打开abd.exe，点中PE Editor按钮,把IMPROT_TABLE的RVA改为12cd8。然后再用W32Dasm 反汇编
看见FUCTION 按钮的IMPORT已经出来了，可以看见kernel32.dll,user32.dll,GDI32.dll,ADVAPI32.dll,
Shell32.dll,COMCTL32.dll已经出来了，但可以看见，kernel32.dll,和user32.dll的函数全是空白。这些函
数看来要我去给找出来了。其他的dll调用都正常了。
下面就是找到程序的加密部分进行分析。把程序走过的API进行重构。还是针对第一个出错的地方，在跟进
的dll空间可以看见以下代码

016F:004078A5 FF15DC104100 CALL [004110DC] 切入下面的代码中
016F:004078AB 33D2 XOR EDX,EDX
/*********************************************************************************************/
注：程序在下面用了间接Ret 指令的方式代替call调用返回的方式，把调用下一条指令的IP（004078AB)及
标志和所有的寄存器保存在堆栈单元中。然后再用改变堆栈的方法切回4078AB,具体实现见下面代码
010c6CD7 PUSH DWORD BFEA13B4
010c6CDC PUSHF//保存标志
010c6CdD PUSHA//保存所有的寄存器
010c6CDE PUSH ESP
010c6CdF PUSH DOWRD 10C6D167
010c6CE4 CALL 100195F0 //进入~df394b.tmp，其实是个dll文件，F8跟进可发现
010c6CE9 ADD ESP BYTE +8//不会到这条指令的，再上一条指令用F10的话就过了！！！！game begin
010c6CEC PUSH BYTE 00
010c6CEE POP EAX
010c6CEF POPA
010c6CF0 POPF
010c6CF1 RET

走走....到下面........找了好久 在~df394b.tmp中下面的指令中有花指令，静态汇编不可看的到的。

0100183c8 SETS [EBP-8]
0100183cc MOV EAX,[EBP-8]
0100183cf AND EAX,0x000000FF
0100183d4 TEST EAX,EAX
0100183d6 JNZ 0100183e5 //这里通常是要跳的
0100183d8 MOV ECX,[0100500E8]
0100183df CALL Kernel32.dll!SetEvent
0100183e5 JMP SHORT 0100183ee//再1跳
0100183e7 MOV EBX,EBX
0100183e9 JO 0100183F1
0100183eb NOP
0100183ec JNO SHORT 0100183f1//再N跳，花指令一直就在跳，这是最后一跳。。
0100183ee JMP 0100183e7//再2跳
...............................花指令
0100183f1 MOV ESP,[EBP+0c]//跳到这里水落石出，这里EBP+0c中的就是IP（004078AB)那里压入
//的环境数据
0100183f4 POPA//修改标志为4078a5的的状态
0100183f5 POPF//修改寄存器4078a5时的状态
0100183f6 RET //切入Kernel32.dll中的对应函数中，在这条指令下一条时，堆栈已经指向IP 4078AB
//当程序重Kernel32模块的对应函数返回时，就返回到4078AB回到主程序执行。
/*********************************************************************************************/
说了半天，结果其实这里就是一个API调用，完全可以通过把函数在004078A5 CALL [004110DC]处的内容
改为具体的API就可以了，这需要对PE文件的IMPORT_TABLE 的结构了解。你可以发现其实其他的call调用的区
域跟这个一样，都是在IMAGE_IMPORT_DESCRIPTOR结构的 Kernel32.dll或user32.dll的FirstThunk指象的区域
你可以发现现在这里的全是通过上面的外接调用实现的，我们要改它其中的内容为内部直接调用，这就要用手
工了，很麻烦。。首先在程序的.rdata section的末端选择全是00的区域把该函数的hint和名字字符串写入，
可能你还需要手工在procdump修改.rdata section的Vsize 和Psize为能放下你的所有函数hint和名字串的大
小我的这个函数导入表的构造方法如下
第一个断点在4078a5中，其真正的CALL dword ptr [4110dc] ,110dc地址的指针改为1394d,在1394d中有第一
个函数GetVersion的hint及标示字符（这里是自己加的哟）
RVA 110dc------value------>1394d => RVA 1394d----------value------->0800GetVersion
^ ^
hint Characteris

这样就构造好了第一个函数Kernel32.dll!GetVersion()
后面的这种调用如法泡制，可能要重构30几个这样的函数。但可能还是有规律的，要是能找到规律或完整的
导入表，就不用这样辛苦了。

------第二钟情况（你要做JMP.stxt774的入口地址==转换=>Call Call Kernel32.dll(或user32.dll)!具体函数)
第二种情况通过远跳指令跳到.stxt774的相应入口中。
第一条花指令切入是函数GetVersionExA,位置在
409450 jmp 41b12a（跳到。stxt段） ；这里实际上是 call Kernel32.dll!GetVersionExA，原程序的加
；密处理可以见后继code程序下面的是花指令，静态反汇编会看不见真正代码

它在.stxt774 section中的代码如下

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409450(U)
|
:0041B12A 53 push ebx
:0041B12B E800000000 call 0041B130 //这个call的目的只是把IP压栈保存

* Referenced by a CALL at Address:
|:0041B12B
|
:0041B130 870424 xchg dword ptr [esp], eax//
:0041B133 9C pushfd //标志保存
:0041B134 05D0FEFFFF add eax, FFFFFED0
:0041B139 8B18 mov ebx, dword ptr [eax]
:0041B13B 6BDB0A imul ebx, 0000000A //计算切入dll的位置
:0041B13E 035804 add ebx, dword ptr [eax+04]
:0041B141 9D popfd //恢复状态
:0041B142 58 pop eax
:0041B143 871C24 xchg dword ptr [esp], ebx//切入~df394b.tmp的位置
:0041B146 C3 ret//切入

然后可以看见下面的类似代码中

010c6CD7 PUSH ***********//409450的下一条指令，可是花指令哟，这里处理很毒的，不看这里的
//话你是不能看见409450的真正的下条指令的情况的。
010c6CDC PUSHF//保存标志
010c6CdD PUSHA//保存所有的寄存器
010c6CDE PUSH ESP
010c6CdF PUSH DOWRD 10C6D167
010c6CE4 CALL 100195F0 //进入~df394b.tmp，其实是个dll文件，F8跟进可发现
010c6CE9 ADD ESP BYTE +8//不会到这条指令的，再上一条指令用F10的话就过了！！！！game begin
010c6CEC PUSH BYTE 00
010c6CEE POP EAX
010c6CEF POPA
010c6CF0 POPF
010c6CF1 RET

这种情况的修改方法，在程序的相对偏移地址13bd9中加入 3300GetVersionExA
^ ^
hint Characteris
然后在IMPORT_TABLE区域的空余空间相对偏移地址11184中写入Hint和Characteris的地址首址13bd9即
Address 411184------value------>13bd9 => Address 13bd9----------value------->3300GetVersionExA
^ ^
hint Characteris
然后再动态执行原程序下断点bpx 409450,用a指令动态修改这里的汇编代码
a
*****:409450 call near [411184]
*****:409456 *********** ;这样原来的指令就还原了，可以看见真正的指令
记录下程序在该处的16进至数据为 FF1584114100,然后用编辑器在程序中的该位置修改为这几个数据，完成
对GetVersionExA的重构 。。。。

用上面的方法一个一个跟踪就可以得到一个完全无壳的可执行文件， 最后在一切搞定后执行的时候一定要把
原程序的执行目录里的ra2.lcf复制为abd.lcf这样才行。也可以让程序执行了，但过程真的好麻烦要是能够生成
这些东西就好了。在制作虚拟光碟时用farstone 的制作虚拟光碟制作vcd档选定智慧算法读取，不要用穷读法，否则过不了safe
disc2的不可读保护，制作完毕后装入就可以不用光盘第顽red alert 2游戏了。


Vampp 2.0.8

 标 题:Vampp 2.0.8 Build 311的脱壳(Vbox 4.10)
发信人:robot
时 间:2000-12-6 18:45:38
详细信息:
Vampp 2.0.8 Build 311的脱壳(Vbox 4.10)
说明: 一个英文版奶牛育种管理软件
工具: SoftICE 4.05; FrogsICE v1.07.3; ProcDump 1.6.2 Final
下载: http://www.modernagri.com/vampp208.exe
感谢: 看雪及看雪教学上的冰毒和dEZZY的两篇文章
该程序被Vbox 4.10加壳，本人正在学习Vbox 4.30的去壳，学了很长时间，按看雪的教程中的关于Vbox 4.3去壳的两篇文章去做，还是没有把Visual SlickEdit v6.0的壳去掉，感觉就差那么一点点儿，(因为已经看到了教程所述的那几段代码，但程序就是不执行到那)如果哪位高手解了，请贴出来，本人也想学习学习。但从练习Vbox 4.30中也长了不少知识，轻松把Vampp.exe的壳去掉了。闲话少说，开始吧。
1. 运行SoftICE。
2. 运行FrogsICE，除了默认的Options外，还要选中Force int3 hook和Force int3 SEH两项。
3. 运行Vampp.exe。
4. 进入Softice。设断 bpx getprocaddress。
5. F5返回，单击Try Vampp按钮，这时会被Softice拦回。
6. bd *之后，按F12，不多不少，正好4次，其中，第2次时间稍长，至如下代码

:00E33020 FF15A830E300 call [00E330A8]
:00E33026 68FFFFFFFF push FFFFFFFF
:00E3302B FFD0 call eax ====> eax的值即为入口点，记下入口点的值：401530
:00E3302D C20C00 ret 000C

7. 执行到E3302B时，修改E3302B，下a e3302b，将call eax，改为jmp eip，F5退出
8. 运行ProcDump，找到Vampp，鼠标右键选择dump full，保存文件名为Vampp1.exe
9. 用Procdump的PE Editor修改Entry Point的值为0001530。OK，保存文件。
10. 试着运行一下程序，已经没有Vbox 4.10的保护了，脱壳成功。
用TRW2000进行脱壳的过程与上面基本类似，也是到上面的代码处(TRW2000在E33020处显示为call Vboxb410!ord_00000001)，至E3302B时，按F8，然后执行PEDUMP即可
我还试了另外的一个被Vbox 4.10加壳的软件，与上面的脱壳流程完全一样
这时我第一个脱壳作品


STEP 7-MicroWIN 32 V3.1.0.31E

标 题:第一次打这些东东！打了我两个小时!能看就看吧！可别看完之后满地找鸡蛋扔我.... (9千字)
发信人:freevirus
时 间:2001-1-3 12:50:46
详细信息:
软件 ：STEP 7-MicroWIN 32 V3.1.0.31E(西门子公司做的工控软件)
注册费：不知道！
保护 ：VBOX 4.2 (NAG&60天时间限制)
目的 ：杀掉保护
工具 ：freevirus，TRW2000 1.22 (LTT是最伟大的，向他致敬！我要去注册)，

开始：

用BPX GETLOCALTIME，F12后来到VBOXS420.DLL中，再F12几下，就会来到MicroWin.exe里：

* Possible StringData Ref from Data Obj ->"STEP-7MICROWINVER310EVAL"
^^^^^^^^^^^^^^^^^^^^^^^^
这是VBOX的试用注册码（我猜的）
|
:004E8031 BFBCBD6200 mov edi, 0062BDBC
:004E8036 8DB5E8FEFFFF lea esi, dword ptr [ebp+FFFFFEE8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E805E(C)
|
:004E803C 8A16 mov dl, byte ptr [esi] ---------
:004E803E 8A0F mov cl, byte ptr [edi] |
:004E8040 8AC2 mov al, dl |
:004E8042 3AD1 cmp dl, cl |
:004E8044 751E jne 004E8064 |
:004E8046 84C0 test al, al |
:004E8048 7416 je 004E8060 这是典型的比较程序
:004E804A 8A4E01 mov cl, byte ptr [esi+01] |
:004E804D 8A5701 mov dl, byte ptr [edi+01] |
:004E8050 8AC1 mov al, cl |
:004E8052 3ACA cmp cl, dl |
:004E8054 750E jne 004E8064 |
:004E8056 83C602 add esi, 00000002 |
:004E8059 83C702 add edi, 00000002 |
:004E805C 84C0 test al, al |
:004E805E 75DC jne 004E803C -----------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E8048(C)
|
:004E8060 33C0 xor eax, eax
:004E8062 EB05 jmp 004E8069

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E8044(C), :004E8054(C)
|
:004E8064 1BC0 sbb eax, eax
:004E8066 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E8062(U)
|
:004E8069 33F6 xor esi, esi
:004E806B 3BC6 cmp eax, esi
:004E806D 7415 je 004E8084
:004E806F 8D5594 lea edx, dword ptr [ebp-6C]
:004E8072 68F0166000 push 006016F0
:004E8077 52 push edx

* Possible Reference to Dialog: DialogID_0069, CONTROL_ID:03EC, "***Some String"
|
:004E8078 C74594EC030000 mov [ebp-6C], 000003EC

* Reference To: MSVCRT._CxxThrowException, Ord:0041h
|
:004E807F E878690000 Call 004EE9FC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E806D(C)
|
:004E8084 8D45BC lea eax, dword ptr [ebp-44]
:004E8087 56 push esi
:004E8088 50 push eax

* Reference To: vboxs420.showMainDialog, Ord:0004h
|
:004E8089 E82C580000 Call 004ED8BA 《---CALL VBOXS420.SHOWMAINDIALOG因为过了这个CALL出来了NAG,所以进去...
:004E808E 3BC6 cmp eax, esi
:004E8090 741E je 004E80B0
:004E8092 83F809 cmp eax, 00000009
:004E8095 0F8444090000 je 004E89DF
:004E809B 8D4DB0 lea ecx, dword ptr [ebp-50]
:004E809E 68F0166000 push 006016F0
:004E80A3 51 push ecx

进入CALL 004ED8BA之后，来到下面：
在vboxs420.dll中有以下语句:

XXXX:00B52FA0 CALL NEAR [EAX+2C]
XXXX:00B52FA3 CMP EAX,EBX <----EBX=03EA
XXXX:00B52FA5 JNZ 00B52FBA <----这里一跳，也就完了！

跟进CALL NEAR [EAX+2C],最后他会有以下语句：

XXXX:00B6B10C:8B4124 MOV EAX,[ECX+24] <----什么都好，肯定不会是03EA！不然还破啥！
XXXX:00B6B10F:C3 RET

这里有一种改法：
XXXX:00B6B10C: PUSH EBX
XXXX:00B6B10D: POP EAX
XXXX:00B6B10E: NOP

这种改法我想是可以很彻底的破了Vbox4.20，在内存中修改试验，的确通过！也不用担心程序会崩溃。
可惜，只能在内存中修改，而VBOXS420.DLL是加了外壳的，我没有功力去脱他，只好另寻出路了...

再来看上面的程序：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E8048(C)
|
:004E8060 33C0 xor eax, eax
:004E8062 EB05 jmp 004E8069

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E8044(C), :004E8054(C)
|
:004E8064 1BC0 sbb eax, eax
:004E8066 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E8062(U)
|
:004E8069 33F6 xor esi, esi
:004E806B 3BC6 cmp eax, esi
:004E806D 7415 je 004E8084 《《《注意这一跳！我们可以利用
:004E806F 8D5594 lea edx, dword ptr [ebp-6C]
:004E8072 68F0166000 push 006016F0
:004E8077 52 push edx

* Possible Reference to Dialog: DialogID_0069, CONTROL_ID:03EC, "***Some String"
|
:004E8078 C74594EC030000 mov [ebp-6C], 000003EC

* Reference To: MSVCRT._CxxThrowException, Ord:0041h
|
:004E807F E878690000 Call 004EE9FC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E806D(C)
|
:004E8084 8D45BC lea eax, dword ptr [ebp-44]
:004E8087 56 push esi
:004E8088 50 push eax

* Reference To: vboxs420.showMainDialog, Ord:0004h
|
:004E8089 E82C580000 Call 004ED8BA 《---CALL VBOXS420.SHOWMAINDIALOG
:004E808E 3BC6 cmp eax, esi 《《《IF EAX=ESI=0,世界都是你的！
:004E8090 741E je 004E80B0
:004E8092 83F809 cmp eax, 00000009
:004E8095 0F8444090000 je 004E89DF
:004E809B 8D4DB0 lea ecx, dword ptr [ebp-50]
:004E809E 68F0166000 push 006016F0
:004E80A3 51 push ecx

* Possible Reference to Dialog: DialogID_0069, CONTROL_ID:03EC, "***Some String"
|
:004E80A4 C745B0EC030000 mov [ebp-50], 000003EC

* Reference To: MSVCRT._CxxThrowException, Ord:0041h
|
:004E80AB E84C690000 Call 004EE9FC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E8090(C)
|
:004E80B0 8B45BC mov eax, dword ptr [ebp-44] 《《《如果过期，EAX=03EB,

* Possible Reference to Dialog: DialogID_0072, CONTROL_ID:03E8, ""
|
:004E80B3 3DE8030000 cmp eax, 000003E8
:004E80B8 7428 je 004E80E2 《《《天堂和地狱的分界

* Possible Reference to Dialog: DialogID_0134, CONTROL_ID:03E9, ""
|
:004E80BA 3DE9030000 cmp eax, 000003E9
:004E80BF 7421 je 004E80E2 《《《同上

* Possible Reference to Dialog: DialogID_006E, CONTROL_ID:03EA, "***Enable Out (ENO)"
|
:004E80C1 3DEA030000 cmp eax, 000003EA
:004E80C6 741A je 004E80E2 《《《同上

* Possible Reference to Dialog: DialogID_0134, CONTROL_ID:03EB, ""
|
:004E80C8 3DEB030000 cmp eax, 000003EB
:004E80CD 7531 jne 004E8100
:004E80CF 33C0 xor eax, eax
:004E80D1 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004E80D4 64890D00000000 mov dword ptr fs:[00000000], ecx
:004E80DB 5F pop edi
:004E80DC 5E pop esi
:004E80DD 5B pop ebx
:004E80DE 8BE5 mov esp, ebp
:004E80E0 5D pop ebp
:004E80E1 C3 ret

由以上程序可见，Microwin.exe只是CALL VBOX进行验证，之后返回参数以决定程序的流程，如果vbox没有在其它地方放地雷的话，我们可以...
既然它CALL完VBOX之后正常的话会去到004380B0，那我们何不这样（注意堆栈）：
:004E806D 7415 je 004E8084 《《《注意这一跳！我们可以利用
:004E906D 7441 je 004380B0

:004E80B0 8B45BC mov eax, dword ptr [ebp-44] 《《《如果过期，EAX=03EB,
由于没有CALL VBOX，这里EAX《》03EB或其它比较有规律的东东，只是一个乱数！
可以把下面三个天堂地狱分界线中的一个改为JMP，你不改的话别指望进天堂！

最后，事实证明是成功的！只改动两个字节，成功的从VBOX身边溜了过去!哈哈...
但是得到一个经验，并不一定要去钻VBOX的这个牛角尖，达到目的，不择手段嘛！还有就是西门子公司的程序员太懒了！

当然，以上的改法其实相当不好！成功是靠运气!本来这种方法是很容易造成程序崩溃的（堆栈或资源）！
最好的改法我认为是改Vboxs420.dll，这是治本的方法！但我没法改！
高手们有兴趣不妨看看！
http://www.ad.siemens.de/simatic/ftp/demosoft/ver3_1/mw_ges_e.exe


非常好色V3.10

标 题:非常好色V3.10 超值试用版的脱壳(不要往别处想呕) (2千字)
发信人:robot
时 间:2001-1-4 23:25:16
详细信息:
软件下载：http://ilike.myrice.com:8080/cgi-bin/dl.pl?url=ftp://ftp.bj.software.chinese.com/software/soft_photo/pm30.exe
执行文件：Tpmagid.exe
文件大小：535048 bytes
说明：我这个脱壳并没有什么新意，主要思路均参考看雪教学。
前言：我一直想找一个能够制作出带农历的日历软件，这个软件就是。不过，该软件只有30天的使用寿命，
下载后进行安装，用FI.EXE看不出被什么软件加了壳，用UltraEdit打开Tpmagid.exe，观察PE文件头，在Section中有PREVIEW、WeijunLi，怎么这么熟悉?!先运行Tpmagid.exe，再运行Procdump，在mask中选择
Tpmagid.exe，再看看moudle，哈哈，vboxt420.dll，照妖镜告诉是被vbox4.2加壳，看雪教学里正好有这方面的脱壳例子，就拿它练手吧。打开看雪教学，看一看vbox4.2的脱壳过程，记下关键要点，上路。
工具：SoftICE 4.05 Procdump 1.6
步骤：
1. 运行非常好色，Ctrl+D 激活SoftICE，设断：bpx getprocaddress，F5返回
2. 选择第一个按钮，我不知道这个按钮说的是什么，big5码，反正应该是试用之类的，这时被SoftICE拦回， bd *，F12共6次，其中第2次时间较长。(F12几次不重要，关键是F12后光标应该停留在CALL ESI的后面)，
至如下代码：

:02800483 FFD6 call esi ====> 在此处设断
:02800485 5B pop ebx ====> 光标停在此处
:02800486 85C0 test eax,eax
:02800488 742E jz 028004B8

3. 在02800483处设断，每次运行时，0280可能不同，但0483肯定相同，F5，会又被SoftICE拦回，bd *，F8
4. 一直按F8或F10，至如下代码处：
(此段特征是：只有一个CALL，简便的方法是用PageDown向下翻页，找到CALL后将光标移到此CALL，F7)

:02830100 FF75F8 push dword ptr [EBP-08]
:02830103 FF75FC push dword ptr [EBP-04]
:02830106 FF7508 push dword ptr [EBP+08]
:02830109 E808000000 call 02830116 ====> F8进入此CALL

5. 一直按F8或F10，至如下代码处：
(此段特征是：只有一个JMP EBX，简便的方法是用PageDown向下翻页，找到JMP EBX后将光标移到此处，F7)
:0283037C 8B45F8 mov eax, [EBP-08]
:0283037F 8B4814 mov ecx, [EAX+14]
:02830382 894DEC mov [EBP-14], ecx
:02830385 8B5DEC mov ebx, [EBP-14]
:02830388 FFE3 jmp ebx ====> ebx中的值即为正确的入口点，用笔记下，ebx=457D90

6. 程序执行到02830388时，下A EIP，输入JMP EIP，F5
7. 启动Procdump，在Options中选择Rebuild import table后，在Task中选择Tpmagid.exe，鼠标右键 dump (full) dump出来的文件大小为1636864个字节
8. 用Procdump中的PE editer编辑被dump出来的文件，设置入口点为 457D90-400000=57D90
9. dump后，别忘了Ctrl+D，将jmp eip改回jmp ebx，尽管我们已经大功告成

将dump出来的文件改名为Tpmagid.exe，覆盖原来的文件，运行一下，已经没有壳了，再运行Procdump，在task中选择Tpmagid.exe，Module中已经没有vboxt420.dll了，脱壳成功。因这个软件是big5码，如果不嫌麻烦的话，还可以用exescope等将其改成简体中文显示，将什么“印表机”之类的改为“打印机”，又成为简体中文版了
另外，我用Procdump下的vbox42进行脱壳，虽然能够把壳脱掉，但脱壳后的文件并不能够运行。用PE editor观看
两个脱壳的文件，入口点没错，都是57D90，但size of image不同。
这种壳用TRW2000脱起来可能更简单，但我的机子中安装了超级保镖后，不能运行TRW2000。我的另一个分区的系统没有被超级保镖保护，运行TRW2000就没有问题，不过我可不敢在那个分区乱装软件。


EasyPDF v1.5.2

 标 题:重建EasyPDF v1.5.2 的import table (4千字)
发信人:fs0
时 间:2001-6-9 23:46:50
详细信息:
EasyPDF v1.5.2 是用Visual Protect 3加的壳
被重定向的import table 都是kernel32.dll, user32.dll等
其重定向方式为

IAT [0068C208] = 01BFAC18
01BFAC18:
B84CC39200 mov eax, 0092C34C
FFE0 jmp eax

0092C34C:
B88818F7BF mov eax, BFF71888 <-- GetCurrentThreadId
FFE0 jmp eax

看上去很简单, 但Import REConstructor v1.2 的 Trace Level1 (Disasm)是不能分析这种重定向方式的,
因此我们只能手动重建了, 逐个将 BFxxxxxx 填回去是一件非常累人的事情, 幸好其redirect方式很固定,
都是mov eax, xxxxxxxx, jmp eax 每次的代码不同之处只是 xxxxxxxx , 我们可以写个程序来读
IAT 指向的第1, 6, 7字节是否分别为 B8, FF, E0, 是就认为这是个有效的redirect, 再根据第5个字节
比 B0 大, 不是就以2--5字节为指向下一个jmp的地址再读, 是就认为这个DWORD是真正的Import Table Address,
将其写到 IAT处 (如上例的[0068C208]). 然后处理下一个 IAT, 直到 IAT size / 4 个为止.

下面附上源程序, 四个参数 m_processid(进程ID), m_imagebase(IMAGE BASE), m_iatrva(IAT RVA), m_iatsize(IAT SIZE)
(为什么是 m_xxxxx ? , 呵呵是VC里搬过来的(:)

这样处理完以后就剩下一个被重定向为 0089EF0C 的IAT, debug 看一下, 看其push进去的参数和返回结果就知道这是GetProcAddress.
EasyPDF.exe 重建好了, vspdf.dll也差不多, Process ID 就是 EasyPDF.exe的, 关键是找到 IAT RVA 和 IAT SIZE, 其 OEP 是 0x1000,
不过Import REConstructor说找不到IAT, 我试了 OEP 为 0x1CBC0 就能发现 IAT, 但 size 好像也不对, 我也没仔细看, 反正我是把它改大了.
对那些没用的IAT都 cut 掉. 还有就是EasyPDF.exe 的 662082 jz near xxxxxxxx. 好, 大功告成。

// file name exp.cpp
// compile with "cl exp.cpp user32.lib"
#include <windows.h>

void main( void )
{
DWORD m_processid, m_imagebase, m_iatrva, m_iatsize;

m_processid = 0xFFF529C6;
m_imagebase = 0x00400000;
m_iatrva = 0x0028C204;
m_iatsize = 0x00000A0C;

unsigned char buf[MAX_PATH];
HANDLE h_process;
DWORD dw_ImageBase = 0x400000;
unsigned int *p_iatva, *p_first_iatrva, *p_NextRedirect;
unsigned long *p_oldprotection=0;
int num, NestedCount, i;

dw_ImageBase = m_imagebase;
num = m_iatsize/4;
__try
{
p_first_iatrva = (unsigned int*) m_iatrva;
if ( (h_process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, m_processid)) != NULL )
{
p_iatva = (unsigned int *) ((unsigned int)p_first_iatrva + dw_ImageBase);
for(i=0; i<num; i++)
{
if( ReadProcessMemory( h_process, (void *)p_iatva, buf, 4, 0 ) )
{
p_NextRedirect = (unsigned int*) buf;
p_NextRedirect = (unsigned int*) *p_NextRedirect;
for( NestedCount=0; NestedCount<5; NestedCount++)
if( ReadProcessMemory( h_process, (void *)p_NextRedirect, buf, 10, 0 ) )
{
if (*buf == 0xB8 && *(buf+5) == 0xff && *(buf+6) == 0xe0) //mov eax, hhxxxxxx
{ //jmp eax
p_NextRedirect = (unsigned int *)(void *) (buf + 1);
p_NextRedirect = (unsigned int*) *p_NextRedirect;
if ( *(buf+4) < 0xB0 ) //when hh >= 0xb0 assume it is the real import address, only test on my ME.
continue; //Visual Protect seem to redirect kernel32.dll, user32.dll ... only.
else
{
if(!VirtualProtectEx(h_process, (void *)p_iatva, 4, PAGE_READWRITE, p_oldprotection))
{
MessageBox(0, "Error changing access protection of process!", "exp", MB_OK);
break;
}
if(!WriteProcessMemory(h_process, (void *)p_iatva, (void *)(buf+1), 4, 0))
{
wsprintf( (char *) buf,"Write process memory error at %x , error code : %x", p_iatva, GetLastError());
MessageBox(0, (char *) buf, "exp", MB_OK | MB_ICONERROR);
break;
}
else
break; //next iat
}
}
else
break; //does not match format or already write
}
else
{
//MessageBox(0, "Read process memory error!", "exp", MB_OK | MB_ICONERROR);
break;
}
}
else
MessageBox(0, "Read process IAT memory error!", "exp", MB_OK | MB_ICONERROR);

p_iatva ++; //get next iat
}
MessageBox(0, "Write process memory end.", "exp", MB_OK | MB_ICONINFORMATION);
}
else
MessageBox(0, "Can not open process!", "exp", MB_OK | MB_ICONERROR);
}
__except(1)
{
MessageBox(0, "Found exception!!!", "exp", MB_OK | MB_ICONERROR);
}

CloseHandle(h_process);
}


easypdf1.5.2

 标 题:Visual Protect3.0脱壳 (16千字)
发信人:hying
时 间:2001-6-10 11:29:53
详细信息:
标题：Visual Protect3.0脱壳讨论
所用工具：trw2000，peditor1.7
研究对象：easypdf1.5.2
前言：
Visual Protect3.0是一款不错的加密软件，它可以给你的共享软件提供如使用总时间限制、使用总日期限制，使用次数限制、过期限制等，还可以定制试用版提示框。如果用户注册的话只需要利用网络传送一个小于1K的keyfile即可去除所有限制。在它的帮助里说：Once a file or program has been protected with Visual Protect and distributed to your customers, its protection CANNOT BE REMOVED。在这点上它好象有些太自信了。下面我们就来看看如何去除它的保护。
保护原理：
利用Visual Protect保护一个软件时，它会在被保护软件同目录下放一个vp.dll，再对被保护软件加一个外壳，利用这个外壳调用vp.dll，利用vp.dll对授权文件*.vpl进行验证，验证通过后对程序解密运行。可见破解的方法可以有两种，一种是对被保护程序进行脱壳，一般脱壳后就不再会有使用日期等限制，而且可以脱离vp.dll运行。第二种是对vp.dll的破解。利用同一版本Visual Protect加密的软件的vp.dll是相同的，一旦破解了某个版本的vp.dll，那所有利用这个版本的Visual Protect保护的软件的加密都会失效。
破解对象简介：
easypdf据说是一款不错的所见即所得的pdf文件制作工具（很遗憾它似乎不支持中文，用它制作的中文文档会显示乱码，我还没找到解决办法，修改过W32DASM的同志可以看看）。它与Visual Protect是同一家软件公司编写的，所以它加密用的Visual Protect应该是最典型的。安装后观察有3个文件是用Visual Protect加密的，分别是easypdf.exe、vspdf.dll和vp.dll（他们好象真的很自信，这么重要的文件都用它来加密），这三个文件的脱壳都不完全相同，下面我们就分别讨论它们的脱壳方法。
脱壳实战：
一、easypdf.exe的脱壳
运行trw2000，运行命令faults off，用trw2000载入easypdf.exe，先出现一个试用提示框，按下'try'后会中断在easypdf.exe的入口6B5BC0，往下走有4个CALL，在第四个CALL按F8进入，进入后按F10一直往下走，直到：
0167:006B6C4A 8D4C2424 LEA ECX,[ESP+24]
0167:006B6C4E 50 PUSH EAX
0167:006B6C4F 8D54242C LEA EDX,[ESP+2C]
0167:006B6C53 51 PUSH ECX
0167:006B6C54 52 PUSH EDX
0167:006B6C55 FF1574AB6B00 CALL `VP![NONAME]` <-注意
0167:006B6C5B 8B442414 MOV EAX,[ESP+14]
0167:006B6C5F 85C0 TEST EAX,EAX
0167:006B6C61 740F JZ 006B6C72
0167:006B6C63 8B0DD8AB6B00 MOV ECX,[006BABD8]
0167:006B6C69 03C1 ADD EAX,ECX
0167:006B6C6B 81C464030000 ADD ESP,0364
0167:006B6C71 C3 RET
在6B6C55处按F8进入，运行命令D 401000，你将会看到很多的"?"，不管它，一直用F10往下走，直到：
0167:008AD84D MOV EAX,[008B35F8]
0167:008AD852 CALL 0088CDDC
0167:008AD857 MOV EAX,[EBP+08]
0167:008AD85A CALL NEAR [EAX] <-注意
0167:008AD85C MOV EAX,[008B35AC]
0167:008AD861 MOV EAX,[EAX]
经过8AD85A处的CALL后，你会发现原来显示"?"的地方可以看到内容了，所以这个CALL应该是对程序进行了解码，再往下走，直到：
0167:008AD909 MOV EAX,008ACEC8
0167:008AD90E CALL 008AE198
0167:008AD913 CMP EAX,[008B66B0]
0167:008AD919 JZ 008AD92D
0167:008AD91B MOV EAX,[008B357C]
0167:008AD920 MOV BYTE [EAX],00
0167:008AD923 MOV EAX,[008B35F8]
0167:008AD928 CALL 0088CDDC
0167:008AD92D JMP NEAR [EBP-04] <-注意
0167:008AD930 PUSH BYTE +00
0167:008AD932 CALL 00836788
0167:008AD937 JMP 008ADD31
0167:008AD93C MOV EAX,[008B3824]
0167:008AD941 MOV EAX,[EAX+41]
注意，程序将由上面的JMP跳到原始的入口67B9E0，现在你可以把它DUMP下来，DUMP完后用F8慢慢走，可到如下地方：
0167:00407DF4 JMP NEAR [0068C304]
0167:00407DFA MOV EAX,EAX
0167:00407DFC JMP NEAR [0068C300]
0167:00407E02 MOV EAX,EAX
0167:00407E04 JMP NEAR [0068C2FC]
0167:00407E0A MOV EAX,EAX
0167:00407E0C JMP NEAR [0068C2F8]
根据经验，可以判断68C300前后应该是输入表的所在，再上下看看，看到如下：
0030:0068C1E0 00 00 00 00 00 00 00 00-00 00 00 00 EA F4 28 00 ............牯(.
0030:0068C1F0 84 CB 28 00 00 00 00 00-00 00 00 00 00 00 00 00 勊(.............
0030:0068C200 00 00 00 00 00 00 00 00-88 F7 6E 01 A0 AE 6E 01 ........堶n.牣n.
0030:0068C210 DC B4 6E 01 FC 7E 73 01-08 7F 73 01 5C 7F 73 01 艽n.鼅s..s.\s.
……………………
0030:0068CBD0 6C 76 7E 00 54 76 7E 00-38 76 7E 00 44 74 7E 00 lv~.Tv~.8v~.Dt~.
0030:0068CBE0 50 70 7E 00 74 70 7E 00-28 72 7E 00 F4 8D 7E 00 Pp~.tp~.(r~.魨~.
0030:0068CBF0 00 00 00 00 6B 65 72 6E-65 6C 33 32 2E 64 6C 6C ....kernel32.dll
0030:0068CC00 00 00 00 00 12 EA A3 E1-C7 13 22 14 43 51 31 25 .....辏崆.".CQ1%
根据经验判断输入地址表是从68C200到68CBF0，其中的016EF788等都是被加密的函数入口地址，例如：程序通过JMP NEAR [0068C208]调用某个函数，[0068C208]中应存放有这个函数的入口地址，现在被加密放入了016EF788，程序跳到16EF788处的代码为：
0167:016EF788 MOV EAX,009311E8
0167:016EF78D JMP EAX
程序将跳到9311E8，9311E8处的代码为：
0167:009311E8 MOV EAX,BFF816F3
0167:009311ED JMP EAX
程序将跳到BFF816F3，BFF816F3处的代码为：
KERNEL32!GetCurrentThreadId
0167:BFF816F3 MOV EAX,[BFFCADE0]
0167:BFF816F8 PUSH DWORD [EAX]
0167:BFF816FA CALL BFF80455
所以JMP NEAR [0068C208]调用的应该是KERNEL32!GetCurrentThreadId函数，[0068C208]中放的本应是BFF816F3。原理很简单，下面就是如何修复了。可是我很遗憾的发现常用的修复输入表的工具对它都失效了。看样子我们得另想办法。一种是我们先象刚才一样通过手动将正确的地址逐个写入，写入以后再利用工具完全修复，但是这样太费时间了，估计一天都可能干不完。看来得另想方法。另一个方法是考虑如何让它不加密。刚才我们已经讲了008AD85A处的CALL [EAX]是对程序进行解码，那输入表的加密肯定是再这个之后，所以再次运行，通过这个CALL后我们下命令：
bpx GetProcAddress
然后G，停下来后用F12走几次返回，看到如下代码：
0167:008C5BEA PUSH DWORD [EBP+0C]
0167:008C5BED PUSH ECX
0167:008C5BEE CALL `KERNEL32!GetProcAddress`
0167:008C5BF4 PUSH BYTE +08 <-返回到这
0167:008C5BF6 PUSH BYTE +00
0167:008C5BF8 MOV [EBP+0C],EAX
0167:008C5BFB CALL `KERNEL32!LocalAlloc`
0167:008C5C01 MOV ESI,EAX
0167:008C5C03 LEA EAX,[EBP+0C]
0167:008C5C06 PUSH BYTE +04
0167:008C5C08 PUSH EAX
0167:008C5C09 LEA EAX,[ESI+01]
0167:008C5C0C MOV BYTE [ESI],B8
0167:008C5C0F PUSH EAX
0167:008C5C10 CALL 008C6320
0167:008C5C15 ADD ESP,BYTE +0C
0167:008C5C18 OR BYTE [ESI+05],FF
0167:008C5C1C MOV BYTE [ESI+06],E0
0167:008C5C20 MOV EAX,ESI
0167:008C5C22 POP ESI
0167:008C5C23 POP EBP
0167:008C5C24 RET
返回时EAX中放的就是正确的入口地址。按F12两次后走到：
0167:0089EEB2 CALL 00836858
0167:0089EEB7 CALL 0089EDF0 <-到这，注意这个CALL
0167:0089EEBC POP ECX
0167:0089EEBD MOV EAX,[EBP+08]
0167:0089EEC0 MOV EBX,[EAX-04] <-注意此时的EBX的值
0167:0089EEC3 MOV EAX,[EBP+08]
0167:0089EEC6 MOV ECX,[EAX-04]
0167:0089EEC9 MOV EDX,[EBP-04]
0167:0089EECC MOV EAX,EDI
0167:0089EECE MOV ESI,[EAX]
0167:0089EED0 CALL NEAR [ESI+38]
0167:0089EED3 XOR EAX,EAX
走几圈后你会发现规律，就是上面取出的EBX的值就是最后放入输入表的值，那这个值是如何产生的呢？进入上面的CALL看个究竟：
0167:0089EDF0 PUSH EBP
0167:0089EDF1 MOV EBP,ESP
0167:0089EDF3 PUSH ECX <-入栈，此时ECX的值就是正确的人口地址
0167:0089EDF4 MOV [EBP-04],EAX <-破坏堆栈内的正确人口地址
0167:0089EDF7 MOV EAX,07
0167:0089EDFC CALL 0083279C
0167:0089EE01 MOV EDX,[EBP+08]
0167:0089EE04 MOV [EDX-04],EAX <-保存加密后的入口地址
0167:0089EE07 MOV EAX,[EBP+08]
0167:0089EE0A MOV EAX,[EAX-04]
0167:0089EE0D MOV BYTE [EAX],B8
0167:0089EE10 MOV EAX,[EBP+08]
0167:0089EE13 MOV EAX,[EAX-04]
0167:0089EE16 LEA EDX,[EAX+01]
0167:0089EE19 LEA EAX,[EBP-04]
0167:0089EE1C MOV ECX,04
0167:0089EE21 CALL 008328B4
0167:0089EE26 MOV EAX,[EBP+08]
0167:0089EE29 MOV EAX,[EAX-04]
0167:0089EE2C MOV BYTE [EAX+05],FF
0167:0089EE30 MOV EAX,[EBP+08]
0167:0089EE33 MOV EAX,[EAX-04]
0167:0089EE36 MOV BYTE [EAX+06],E0
0167:0089EE3A POP ECX
0167:0089EE3B POP EBP
0167:0089EE3C RET
我们可以在内存中对这些代码稍做修改，如下：
0167:0089EDF0 55 PUSH EBP
0167:0089EDF1 8BEC MOV EBP,ESP
0167:0089EDF3 51 PUSH ECX <-入栈，此时ECX的值就是正确的人口地址
0167:0089EDF4 90 NOP <-去掉了破坏刚入栈的正确地址的代码
0167:0089EDF5 90 NOP
0167:0089EDF6 90 NOP
0167:0089EDF7 B807000000 MOV EAX,07
0167:0089EDFC E89B39F9FF CALL 0083279C
0167:0089EE01 8B5508 MOV EDX,[EBP+08]
0167:0089EE04 8942FC MOV [EDX-04],EAX
0167:0089EE07 8B4508 MOV EAX,[EBP+08]
0167:0089EE0A 8B40FC MOV EAX,[EAX-04]
0167:0089EE0D C600B8 MOV BYTE [EAX],B8
0167:0089EE10 8B4508 MOV EAX,[EBP+08]
0167:0089EE13 8B40FC MOV EAX,[EAX-04]
0167:0089EE16 8D5001 LEA EDX,[EAX+01]
0167:0089EE19 8D45FC LEA EAX,[EBP-04]
0167:0089EE1C B904000000 MOV ECX,04
0167:0089EE21 E88E3AF9FF CALL 008328B4
0167:0089EE26 8B4508 MOV EAX,[EBP+08]
0167:0089EE29 59 POP ECX <-取出正确的地址
0167:0089EE2A 8948FC MOV [EAX-04],ECX <-替换掉被加密的入口地址
0167:0089EE2D 5D POP EBP
0167:0089EE2E C3 RET
这样修改后放入输入表的就将是未被加密的函数入口地址。
运行起来后我们就可以用Import REConstructor来进行输入表的完全修复，具体操作可看相关文章。须注意的是修复时发现还有两个函数的入口地址不对。仔细研究发现它们对应的都是函数KERNEL32!GetProcAddress，需手工选择一下，再将程序的入口修正为正确入口就可以了。至此，easypdf.exe脱壳完成。
二、vspdf.dll的脱壳
dll文件的脱壳一般较少被提到，开始我也没有注意，只是因为发现在easypdf.exe运行前已经出现一个试用框，然后寻找原因才发现是vspdf.dll被加壳了。下面我们就来看如何脱它。
要脱壳先得找到它的入口点，但是dll文件被载入的基址并不是我们静态观察文件头看到的基址，那如何找到他的入口呢？我们可以用peditor1.7来找，先按"browse"按钮打开vspdf.dll，取得它的入口偏移为6CBC0，再运行easypdf，运行好后按"tasks"按钮，在上半窗口中点easypdf.exe，然后可在下半窗口中找到vspdf.dll的基址为7B0000，所以正确入口应该是81CBC0。
运行trw2000，下命令faults off和bp 81CBC0。运行easypdf，中断后我们可看到如下代码：
0167:0081CBC0 MOV EAX,[ESP+08]
0167:0081CBC4 CMP EAX,BYTE +01
0167:0081CBC7 JNZ 0081CC04
0167:0081CBC9 MOV [00821B9C],EAX
0167:0081CBCE MOV EAX,[ESP+04]
0167:0081CBD2 PUSH EAX
0167:0081CBD3 MOV [00821BD8],EAX
0167:0081CBD8 CALL 0081D540 <-进入
0167:0081CBDD ADD ESP,BYTE +04
0167:0081CBE0 MOV [00820704],EAX
0167:0081CBE5 TEST EAX,EAX
0167:0081CBE7 JNZ 0081CBEC
0167:0081CBE9 RET 0C
0167:0081CBEC MOV ECX,[ESP+0C]
0167:0081CBF0 MOV EDX,[00821BD8]
0167:0081CBF6 PUSH ECX
0167:0081CBF7 PUSH BYTE +01
0167:0081CBF9 PUSH EDX
0167:0081CBFA MOV [00820700],EAX
0167:0081CBFF CALL EAX <-注意此时EAX的值
0167:0081CC01 RET 0C
0167:0081CC04 MOV ECX,[ESP+0C]
0167:0081CC08 MOV EDX,[00821BD8]
0167:0081CC0E PUSH ECX
0167:0081CC0F PUSH EAX
0167:0081CC10 PUSH EDX
0167:0081CC11 CALL NEAR [00820700]
0167:0081CC17 RET 0C
第一个JNZ是不跳的，我们进入81CBD8的CALL，然后就跟easypdf.exe查不多了。不同的是对输入表加密完后继续走会回到81CBDD，那哪是正确的入口呢？我们继续往下走，走到81CBFF的CALL EAX，然后发现此时EAX的值为7B1000，这不是正确入口吗？好了在入口处我们可以DUMP它，不过发现用Procdump无法DUMP，但是peditor可以，DUMP下来后再按上面的方法修复输入表，修复时发现一个奇怪的现象，就是vspdf.dll的输入地址表有两份，交错地放在一起，不知道为什么？其中一份已经初始化好了，我们只要把这一份修复就可以了。还有一个问题就是Import REConstructor修复的vspdf.dll的输入表变得让我看不懂了。我竟然找不到函数名，但是却可以初始化，谁能帮我解释一下。
三、vp.dll的脱壳
可运用上面相同的方法找到它的现在的人口地址和原来的入口地址。不同的是第一个CALL进入后的流程与前面不同，当然了，因为这时候vp.dll还没有完全运行。可以看到如下代码：
0167:008C62CE MOV EAX,[ESP+04]
0167:008C62D2 MOV [008CAB5C],EAX
0167:008C62D7 CALL 008C5E2D
0167:008C62DC CALL 008C6085
0167:008C62E1 CALL 008C5A47
0167:008C62E6 MOV EAX,[008CAB5C]
0167:008C62EB CMP EAX,[008CA7C5]
0167:008C62F1 JZ 008C6301
0167:008C62F3 CMP DWORD [008CA7BD],BYTE +00
0167:008C62FA JZ 008C6301
0167:008C62FC CALL 008C5AA5
0167:008C6301 CALL 008C5CAF
0167:008C6306 MOV EAX,[008CAB5C]
0167:008C630B MOV ECX,[008CA7B9]
0167:008C6311 ADD EAX,ECX
0167:008C6313 RET
我们可以走到8C6301后下bpx GetProcAddress找到关键的输入表加密处。走几圈你会找到规律。关键代码如下：
0167:008C5E03 PUSH EAX
0167:008C5E04 PUSH EBP
0167:008C5E05 CALL 008C5C25 <-关键的CALL
0167:008C5E0A POP ECX
0167:008C5E0B POP ECX
0167:008C5E0C CMP EAX,EDI
0167:008C5E0E MOV [ESI],EAX <-将被加密的入口地址放入
0167:008C5E10 JNZ 008C5E18
0167:008C5E12 MOV DWORD [ESI],DEADBEEF <-将被加密的入口地址放入
0167:008C5E18 ADD ESI,BYTE +04
0167:008C5E1B JMP SHORT 008C5DDA
我们可以参照前面的改法修改，但是这儿我们可以尝试另一种方法。你可能注意到了，在现在的输入表里，函数名部分还是被加密的，我们能否完全修复它呢？
进入上面的CALL看一下：
我把它改成了这样：
0167:008C5C25 55 PUSH EBP
0167:008C5C26 8BEC MOV EBP,ESP
0167:008C5C28 81EC00010000 SUB ESP,0100
0167:008C5C2E 8B450C MOV EAX,[EBP+0C]
0167:008C5C31 56 PUSH ESI
0167:008C5C32 0FB630 MOVZX ESI,BYTE [EAX]
0167:008C5C35 40 INC EAX
0167:008C5C36 50 PUSH EAX
0167:008C5C37 56 PUSH ESI
0167:008C5C38 50 PUSH EAX
0167:008C5C39 48 DEC EAX
0167:008C5C3A 90 NOP
0167:008C5C3B 90 NOP
0167:008C5C3C 90 NOP
0167:008C5C3D 90 NOP
0167:008C5C3E 50 PUSH EAX
0167:008C5C3F E8DC060000 CALL 008C6320
0167:008C5C44 80243000 AND BYTE [EAX+ESI],00
0167:008C5C48 90 NOP
0167:008C5C49 90 NOP
0167:008C5C4A 90 NOP
0167:008C5C4B 90 NOP
0167:008C5C4C 6A00 PUSH BYTE +00
0167:008C5C4E 90 NOP
0167:008C5C4F 90 NOP
0167:008C5C50 90 NOP
0167:008C5C51 90 NOP
0167:008C5C52 90 NOP
0167:008C5C53 90 NOP
0167:008C5C54 56 PUSH ESI
0167:008C5C55 50 PUSH EAX
0167:008C5C56 E815000000 CALL 008C5C70
0167:008C5C5B 83C418 ADD ESP,BYTE +18
0167:008C5C5E 58 POP EAX
0167:008C5C5F 48 DEC EAX
0167:008C5C60 90 NOP
0167:008C5C61 90 NOP
0167:008C5C62 90 NOP
0167:008C5C63 90 NOP
0167:008C5C64 50 PUSH EAX
0167:008C5C65 FF7508 PUSH DWORD [EBP+08]
0167:008C5C68 E8DCFEFFFF CALL 008C5B49
0167:008C5C6D 5E POP ESI
0167:008C5C6E C9 LEAVE
0167:008C5C6F C3 RET
你对照着走一偏就能明白它的意思。最后还要把8C5E0E和8C5E12处的两句NOP掉，让它不初始化。然后返回到程序的真正入口。这时候的输入表就是完全被解密的未初始化的输入表，接下来就可以DUMP了，DUMP完后就把这个进程杀掉，不然由于输入表未初始化，再运行就是非法操作。将DUMP下来的程序的入口和输入表地址修改一下就可以使用了。
问题：上面的方法在本机上经过试验都成功了。对于vp.dll的输入表的修复方法是否可以运用在前两个文件上面呢？应该也是可以的，但修改会比较复杂一些，各位可以自己试一下。还有所有脱壳都是在我的98上进行的，脱壳后的vp.dll在NT4.0上运行会产生初始化错误，估计应该不是输入表的问题，哪位可以找出原因。前面两个脱壳文件未试。
由于本人水平有限，如有错误之处请指正。
hying[CCG]
2001年6月10日


Visual Protect

 标 题:Visual Protect (13千字)
发信人:henryw
时 间:2001-6-2 17:52:53
详细信息:
Bye bye Visage Software's Visual Protect
v2.31 [2-August-2000] filesize:4.04mb
http://www.visagesoft.com
by meRlin 6-August 2000

我没见过任何软件用它来做保护，希望将来也不会碰到，不过破解它实在很有意思。
写这一小篇东西是为了：
1 - 记住自己是怎么做的。
2 - 希望告诉其他破解者如何处理这种保护。

用到的工具：
SoftIce 4.xx
Wdasm
Procdump
Hexeditor

作者的话：
Visage Software发布这个很专业的工具其对象是那些希望发布试用版软件的开发者。

Visual Protect是计算机软件电子商务的有效和实用的解决办法。它有着优美的界面，允许可能的用户在购买前试用你完整的软件。Visual Protect是一种强有力的工具，提供64位，有安全加密的出口许可，可在世界范围内销售。

它不和你程序通常功能发生关系，只是集中于维护一个安全的发布环境。Visual Protect的使用者可完全控制如何将程序提供给最终用户。
一旦文件或者程序由Visual Protect来保护并发布到您的用户手中，这种保护不能被移除。

好了好了！
我们中所有人都听说过这样的话：“现成的保护都是没用的!!”

对于VBox类的保护也是一样，我将显示如何修改它，使得任何被这种方法保护的程序可以获得全部功能，就算保护依旧存在，而"*.vpl"文件不存在时。第一步我将unpack/dump这个文件。

Visage Software显然相信自己的工作，Visual Protect自身用它自己来保护。（如果有人dump了它，Visual Protect自身就不会完全工作。）
当你启动了被保护的程序以后，Filemon或者Regmon就不能运行了。

提示！你可以在保护一个新的程序的同时运行他们。

用Notepad.exe来测试这个加壳的程序（先拷贝notepad!!）
运行Visual protect，你现在可以看见"Try/Buy"nag是如何查找它保护的程序的，按下"Try"
-生成新项目->下一步
在Trial Options
-check number of days, fill with any encryptionkey you like ->next
-you do not need to change anything here! ->next
-Select notepad.exe and push "Apply"

加壳完毕后可见一些信息：

Protection applied:
1.The Protected application file(s):
-C:\Program Files\Visage Software\Visual
Protect\Notepad.exe
2.The backup file(s):
-C:\Program Files\Visage Software\Visual
Protect\Notepad.bak

Some more text and then:
To distribute the protected application, please make
The following changes to your installer:

1.replace your original executable(s) with:
-C:\Program Files\Visage Software\Visual
Protect\Notepad.exe

2.Add the Visual Protect file(s):
2. 加入Visual Protect文件到安装程序中：
-C:\Program Files\Visage Software\Visual
Protect\Notepad.vpl
-C:\PROGRAM FILES\VISAGE SOFTWARE\VISUALPROTECT\VP.DLL
To your installer

啊哈! 监视程序需要VP.DLL。

在Softice的symbol loader里面加载notepad.exe，按下"load exports"，然后查找VP.DLL，选择并按"load"....哦，入口处没停!
运行Procdump并观察notepad.exe的Sections，
按下"Sections"
除了.rsrc以外所有的sections都不见了，加入了两个新的：
.VDATA
.VCODE

我们应该将.VDATA的"characteristics"由C00000040改为E00000020，如此它就可以在入口处停下了(别被.VDATA的名字骗了)，改好后存盘退出。
再次加载symbol loader。进入第四个call，在其后0040FFA1处可见REPZ STOSD，STOSW和下面的几行->两个call(解壳/解密calls)和下面25-30多行有个CALL [USER32!CharUpperA]，把断点设在这个call后面的一个call，继续运行（F5） 知道它被断下，F10单步，你完成后会看到下面的东西：
:00410032 push dword ptr [00414A90]
push eax
lea eax, [ebp-0C]
push eax
CALL [VP![NONAME]] -intresting call!!
mov eax, [ebp+08]
pop edi
pop esi
pop ebx
test eax, eax
jz 0041005D
mov ecx, [00414A90]
add eax, ecx
pop ebx
leave
ret

在call后面一行设断点，运行它! (F5)
我们的"nag"就在这里!

按下"Try"，softice将在call后的这行断下，看看什么东西放进了eax(000010CC=真正的程序入口)，下面几行放入ecx(00400000=Imagebase)，再下面几行add eax, ecx =004010CC。再往下走到reg，停下来做这些：

A EIP (return)
JMP EIP (return)
按下Esc退出汇编模式。

现在我们可以dump Notepad.exe了。按F5回到Windows运行procdump，找到notepad.exe一行，选中它，用鼠标右键dump (Full)，保存文件为Dumped.exe.

现在我们再一次右击notepad行，点"Kill task"退出notepad。按PE Editor找到dumped.exe，选中它，改入口点为100CC，点"OK"保存，点"Exit"退出Procdump.

我建议你将Dumped.exe放到一个空文件夹然后运行它，会有一个消息框告诉你VP.DLL不见了!拷贝VP.DLL进同一个目录，再次运行Dumped.exe，它可以工作了，也没了恼人的nag，只是仍旧说它需要DLL，谁还在乎呢？反正我不会! dumping后的一个缺点就是它的大小。
我不知道是否可能将其恢复到原来状态。
(我建议你也dump出VisualProtect.exe，如果你的计算机上日期被移走了。)

--第二步--
--找到我们的“破解处”--

正如我们以前看到的，如果软件是个Demo或者正式版，那个神秘的call里面有一些东西会被擦掉，我们跟进去看看。
直接到offset 00499BEC，或许你的机器上会不一样!
(检查最后偏移地址最后三位，如果一样，你应该也在这个位置了。)
:00499BEC add eax, 64
mov ecx, 00001000
call 00432890
mov eax, [0049E6EC] -------- put a bpx here, then run with F5 until it break
mov edx, [ebp-04]
mov [eax], edx
mov eax, [0049E6EC]
cmp dword ptr [eax], 0C
jz 00499DF4
mov eax, [0049E6EC]
cmp dword ptr [eax], 02
jz 00499E50
mov eax, [0049E6EC]
cmp dword ptr [eax], 03
jz 00499EAC
mov eax, [0049E6EC]
cmp dword ptr [eax], 0A
jz 00499C61
mov eax, [0049E6EC]
cmp dword ptr [eax], 0B
jz 00499FB55
mov eax, [0049E6EC]
cmp dword ptr [eax], 04
jz 00499F08
mov eax, [0049E6EC]
cmp dword ptr [eax], 01
jz 0049A00E
call 0049872C
mov eax, [0049E6EC]
cmp dword ptr [eax], 00
jz 00499C88

--more code--

我敢说我们已经很接近我们的破解处了。
实际上所有的指针对在和eax指的内存位置进行比较，dump它(内存位置0049E204)，将它的值改为A，然后按F5；P)
这个程序过期了!

再回到那里，将字节改为1(!!你一定要等到所有的那些ffffffff都被改写后再改动)，然后再运行，!!破解了 :)
正如你看到的，你可以试验很多选择-> A,B,C,1,2,3,4,0.
关闭notepad，清楚所有的断点。

我们把它找出来!
首先，我们需要找到何时一些字节会写到offset 00??E204 ok! (就是EAX的内存地址)
With notepad.exe it will be 0049E204 (InMyComputer)
对notepad.exe而言，它将是0049E204 (在我的计算机上)
在softice里这样做：BPMB DS:0049E204 RW
再次运行notepad.exe，softice会在这里中断：
（你按下第二次F5以后）

jb 004B02BC
:004B0293 repz movsd ----------land here
jmp [edx*4+004B03A8]
mov eax, edi
mov edx, 00000003
sub ecx, 04

你会看见内存地址被填满FFFFFFFF，不过最终我们需要它成为00000001=Registered OK!
下一步，找到所有这些FFFFFFFF从哪里来的，按F5一次，当再次中断时，你会看到这些：
push dword ptr FS:[eax]
mov FS:[eax], esp
mov eax,[0049E6EC] <---------------this points to 0049E204
:0049A910 mov dword ptr [eax], FFFFFFFF <--- fill with this
push 00002000 ---------------you land here

在softice里下 A CS:0049A910 (return)
写入mov dword ptr [eax], 00000001(Esc退出汇编模式)
将eip改回到offset 0049A910 (R EIP)
然后运行它，会中断几次来进行合法检查，跳过他们，就像它已经注册了(也是欺骗注册文件)
我们的破解只是改了上面提到的代码，我可以告诉你你不会在VP.DLL里面找到这些代码(它被加壳了在运行时候被load进来?)

mov byte ptr [eax], FFFFFFFF和0xC700FFFFFFFFh等价，如果你在0049A910处（这里是我们看到代码的地方）dump，你会看到它们。0049A910只有在我们的notepad运行时候可以看到，如果你保护的是其他软件，offset会改变，不过最后四位xxxxA910总是一样的。
这种补丁在内存中很容易做到，不过我们的目标是对VP.DLL补丁，这样就可以让它在运行时自己补自己。

---第三部分---
---我们如何做---

首先，我们需要一些地方来放我们的新代码。用hexeditor打开VP.DLL，往下卷一点，你会看见很多00，这里可以放我们的代码。
我决定用offset 00000360作为起始点，在这个offset写入"here"。保存文件。
为什么？当我们需要定位的时候很容易找到它（它可以成为一个通用patch，我们有时要找到它，这是就需要search它一下。）
从哪里来调用我们的代码呢？我们要在VP.DLL里面找一些地方，那里的代码不会改变他们自己(就是真正的offset)
这次我们很幸运，这个文件没有CRC校验。

再次运行notepad，再一次停在这里：
jb 004B02BC
:004B0293 repz Movsd
jmp [edx*4+004B03A8]
mov eax, edi
mov edx, 00000003
sub ecx, 04

从这里单步F10，直到下一个ret，越过call [KERNEL32!GlobalFree]，最终越过下一个ret，出现下面代码：
:004AFC44 pop ecx ------------------you are here
mov eax, [004B4A28]
mov ecx, [eax+3C]
add esi, 28
inc edi
movzx ecx, word ptr [eax+ecx+06]
cmp edi, ecx
jl 004AFC1F
5F pop edi -------------
5E pop esi |
C3 ret - we can use the space here to jump to our patch!
55 push ebp - 9 bytes is enough to do it.
8BEC mov ebp, esp |
83EC10 sub esp, 10 ------------

我们需要查查这些代码是否用了很多次，如果这样的话，就要一个计数器了，或许第一件事是在hexeditor里面找找它。查找5F5EC3558BEC83EC10，你会在offset 0003DC5A处找到。(VP.DLL)。
在POP EDI处下bpx，按F5。我们真运气！这个代码只用了一次。在停在这里后，你会在我们需要打补丁的地方停下了（如果你仍旧还有R/W bpx在）
Ok! 这就是我们（应该说我）用来跳到我们补丁代码的地方了。
如何找到我们应该跳到何处呢？
如果你做了我刚才说的（在vp.dll offset 0000360处写入"here!"），这就不成问题了。找到它。

下一步在我们的断点周围(POP EDI)看看，是否能找到当运行不同程序的时候的保护模式。
停掉所有的R/W断点，留下其他的"on"，当softice在bpx处中断时，寄存器看起来象这样：

this values is for notepad.exe
EAX 00430000 EBX 81747B68 ECX 00000003 EDX 005C0008 ESI 00430270
EDI 00000003 EBP 006EFC24 ESP 006EFC10 EIP 004AFC5A

and this is for Visual Protect itself (VisualProtect.exe)
EAX 007E0000 EBX 81747B68 ECX 00000003 EDX 00970328 ESI 007e0270
EDI 00000003 EBP 00A9FC24 ESP 00A9FC10 EIP 0085FC5A

finaly I did create a protected calc.exe and this is the values for it
EAX 00400000 EBX 81747B68 ECX 00000003 EDX 00590008 ESI 00400270
EDI 00000003 EBP 005FFC24 ESP 005FFC10 EIP 0047FC5A

如果看看eax指向的内存位置，我们就能得到VP.DLL的入口点(dump它，你会看到的)。好吧，现在我们从这里开始，如果我们用eax来找我们的补丁代码，就可以不管被保护文件装载时的内存位置了，我们来找到它。

如果用eax，我们可以找到我们的代码，唯一要记住的是加上360，（文件offset 360），这样就指向了我们补丁代码的第一位。
单步(F8)直到ret，我们该下手了! 看看发生了什么
edi为0，ecx=esi=eax，这是要保证我们没有破坏重要的东西。
用edi来补丁是安全的，(ECX也不错，不过最好在离开时恢复它)要做这样的补丁，我们需要找到当我们补丁成功时如何回来的路。

我确实找到了一个“聪明”的方法来做这些，我看看周围，发现内存esp-10处是最适位置，那里的值一直不变（惟一不同的地方是offset的前4位，比如00??FC37）。它指向一个eip地址(和我们的一样)，这就是我们回来的路!（当然我们需要加上0x23h在我们用它之前，为什么？从00??FC37 到 00??FC5A 我们跳到补丁的地方相差0x23h）

我们在00??A910处得到补丁代码了。
现在运行另外一个被保护的程序，看看这些代码在那里被加载，如果我们在此行下断点，就能看到不同了。

看起来代码始终（从我们的观点来看）被加载于低于我们eip（从这点我们跳向我们的新代码）10000个byte的地方，记住这点! 我们要用这个值来在我们的补丁中找到它。

那么是什么呢？
汇编POP EDI行，（写下老的代码）

add eax, 0360 -to file offset for first byte in our patch
jmp eax - jump to it
nop - to fill
nop - to fill

写下新代码 (0560030000FFE09090)

打开VP.DLL查找老代码，将他们替换为新代码，保存文件为patched.dll！将原来的VP.DLL改名，然后将patched.dll改为VP.DLL.

现在我们有些事情要记住!

首先要从我们的代码处回来需要加上23h，这个值储存在[esp-10]，它等于eip=00??FC5A。

其次，我们要打补丁的偏移地址要减掉10000(如果我们比较它和[esp-10]处的eip)，比如004AFC37，首先清掉FC37为004A0000，然后减掉10000->00490000，最后加上A910成为0049A910，这是要patch的偏移地址。

运行带有打过补丁的dll的notepad，停在跳往004AFC5A的这一行，准备跳向（00???360），汇编如下：

File offset:
00000360
mov eax, [esp-10] - grab eip ->00??FC37
XOR AH, AH - zero ah
XOR AL, AL - zero al
DEC EAX - decrease eax
SUB EAX, FFFF - substract with FFFF
ADD EAX, 0A910 - EAX gets memorylocation to patch
ADD EAX, 02 - add 02 to move past the C7 byte
MOV DWORD PTR [EAX], 00000001 - patch it
MOV EAX, ESI
^^^^|^^^
eax需要回到我们跳之前的值，esi保存剩余的值。
--------
XOR AH, AH - zero ah |--just in case
XOR AL, AL - zero al |--something is added
--------
MOV EDI, [ESP-10] - get back the eip
ADD EDI, 023 - add 23h to correct it
MOV DWORD PTR [EDI], 55C35E5F
^^^^|^^^
改回原来的代码，这在内存00??FC5A。

ADD EDI, 04 - move forward
MOV DWORD PTR [EDI], EC83EC8B - change some more bytes back
ADD EDI, 04 - move forward
MOV BYTE PTR [EDI], 10 - the last byte to change back
MOV EDI, [ESP-10] - get back the eip
ADD EDI, 023 - add 23h to correct it
JMP EDI - all done! jump back

当你回到那里时，还是原来的代码（在你打补丁之前），看起来就像什么对没发生过一样。


Autodesk AUTOCAD 14

 标 题:转帖【梦醒时分t0db.myetang.com】翻译的：【破解Autodesk AUTOCAD 14 狗加密 】 (15千字)
发信人:toye
时 间:2000-10-22 20:58:51
详细信息:
怎样破解Autodesk AUTOCAD 14 法语版的狗加密
--------------------------------------------------------------------------------

translate by 梦醒时分
yinqun2000@263.net
http://t0db.myetang.com

级别:中级-高级

所需工具:

Soft ice 3.x
你自己最喜欢的 编辑器 (我一直用 Hexworkshop)
汇编知识 (至少是基础)
Wdasm89 (并不特别需要)
大脑 (你有一个 , 是吗 ? :p )
一些啤酒 :O ( 因为破解这个软件是要很长时间的!)
一些音乐 ;)

历史:

我是很久以前破解这个软件的... ;O

它对我来说很难,而且浪费了我几天时间.最难的部分就是找到检查狗的地方而且我不是用下面我
教你的方法做的!那是一种很复杂的方法...我很蠢的破解了它,而且还常常崩溃!几天前,我完成了
另一个注册机时觉得很烦.所以,我想到除了注册机的破解.那么那个狗保护的Autocad 14?!啊!那
是狗保护!我讨厌狗,而且在这方面几乎没有什么经验...

狗保护是最贵的保护方法,这个软件的售价是$7000左右!(够开一个网吧的了)

让我们来破解它吧:)

BTW,我用好方法破解它大概用了 2 小时 (包括 反汇编: 最长的部分 :p) 这期间没有死机 ;)

1)运行软件 :)

好的.. 让我们来看看这个目标,我安装这个软件非常慢.. 该死的光盘!假设它非常快吧!安装好后,找
到安装目录.有一个 Acad.exe 的可执行文件和其它很多dll文件...我运行这个软件,跳出一个对话框:

"ERREUR FATALE : Le system de securit?verrouillage materiel..."

这是法语, 意思是:

"FATAL ERROR : security system is missing! blablabla"

好的,它就是告诉我们最重要的硬件(*狗*)丢失!哈哈哈

那么... 让我们更深层的看看 ;) 我使用softice设置了在 LPT1上最常用的断点: (BPIO -H 378 R).
我们停在了这儿:

0028:CE5AA885 88442405 MOV [ESP+05],AL ; 这儿.
0028:CE5AA889 66C746680100 MOV WORD PTR [ESI+68],0001
0028:CE5AA88F 8A442405 MOV AL,[ESP+05]
0028:CE5AA893 884615 MOV [ESI+15],AL
0028:CE5AA896 884614 MOV [ESI+14],AL
0028:CE5AA899 5E POP ESI
0028:CE5AA89A 83C404 ADD ESP,04
0028:CE5AA89D C3 RET
0028:CE5AA89E CC INT 3
0028:CE5AA89F CC INT 3
0028:CE5AA8A0 83EC04 SUB ESP,04
0028:CE5AA8A3 56 PUSH ESI
0028:CE5AA8A4 8B74240C MOV ESI,[ESP+0C]
0028:CE5AA8A8 56 PUSH ESI
0028:CE5AA8A9 E832000000 CALL CE5AA8E0
0028:CE5AA8AE 668B465C MOV AX,[ESI+5C]
0028:CE5AA8B2 83C404 ADD ESP,04
0028:CE5AA8B5 6689442406 MOV [ESP+06],AX
0028:CE5AA8BA 8A4658 MOV AL,[ESI+58]
0028:CE5AA8BD 243F AND AL,3F
0028:CE5AA8BF 88442405 MOV [ESP+05],AL
0028:CE5AA8C3 8A442405 MOV AL,[ESP+05]
0028:CE5AA8C7 668B542406 MOV DX,[ESP+06]
0028:CE5AA8CC EE OUT DX,AL
0028:CE5AA8CD 5E POP ESI
0028:CE5AA8CE 83C404 ADD ESP,04
0028:CE5AA8D1 C3 RET

我们是在 chat_to_dongle routine. 而且如果我们看下面的data部分,我们看到:SENTINELXXX...
这是什么啊?! 你应该知道有什么公司提供这种加狗的服务如: Hasp, Sentinel, DesKEY,
Activator/Unikey 还有许多其它的.

因此,我们可以推断碰到的是一个 SENTINEL 狗加密!我们现在在 SENTINEL.VXD 文件... 回到文章
中来,我们停在这儿:

0028:CE5AA885 88442405 MOV [ESP+05],AL ; 这里..
0028:CE5AA889 66C746680100 MOV WORD PTR [ESI+68],0001
0028:CE5AA88F 8A442405 MOV AL,[ESP+05]
0028:CE5AA893 884615 MOV [ESI+15],AL
0028:CE5AA896 884614 MOV [ESI+14],AL

我们要看是关于可执行文件的CALL,所以我们要按三四次F12,我们会在这儿:

0028:CE5B35D6 50 PUSH EAX
0028:CE5B35D7 55 PUSH EBP
0028:CE5B35D8 57 PUSH EDI
0028:CE5B35D9 E8D2FEFFFF CALL CE5B34B0 ; 我们的 call :)
0028:CE5B35DE C06C241F01 SHR BYTE PTR [ESP+1F],01 ;回到这儿.
0028:CE5B35E3 83C40C ADD ESP,0C
0028:CE5B35E6 0AD8 OR BL,AL
0028:CE5B35E8 664E DEC SI
0028:CE5B35EA 75E1 JNZ CE5B35CD
0028:CE5B35EC C0EB01 SHR BL,01
0028:CE5B35EF 6A64 PUSH 64
0028:CE5B35F1 57 PUSH EDI
0028:CE5B35F2 E8C979FFFF CALL CE5AAFC0
0028:CE5B35F7 8A44241B MOV AL,[ESP+1B]
0028:CE5B35FB 83C408 ADD ESP,08
0028:CE5B35FE 2401 AND AL,01
0028:CE5B3600 50 PUSH EAX
0028:CE5B3601 55 PUSH EBP
0028:CE5B3602 57 PUSH EDI
0028:CE5B3603 E8A8FEFFFF CALL CE5B34B0
0028:CE5B3608 83C40C ADD ESP,0C
0028:CE5B360B 0AD8 OR BL,AL
0028:CE5B360D 66BE0300 MOV SI,0003
0028:CE5B3611 6A64 PUSH 64
0028:CE5B3613 C06C241701 SHR BYTE PTR [ESP+17],01
0028:CE5B3618 57 PUSH EDI

在 CALL 中:

0028:CE5B35D6 50 PUSH EAX
0028:CE5B35D7 55 PUSH EBP
0028:CE5B35D8 57 PUSH EDI
0028:CE5B35D9 E8D2FEFFFF CALL CE5B34B0
0028:CE5B35DE C06C241F01 SHR BYTE PTR [ESP+1F],01
0028:CE5B35E3 83C40C ADD ESP,0C
0028:CE5B35E6 0AD8 OR BL,AL
0028:CE5B35E8 664E DEC SI
0028:CE5B35EA 75E1 JNZ CE5B35CD
0028:CE5B35EC C0EB01 SHR BL,01
0028:CE5B35EF 6A64 PUSH 64
0028:CE5B35F1 57 PUSH EDI
0028:CE5B35F2 E8C979FFFF CALL CE5AAFC0
0028:CE5B35F7 8A44241B MOV AL,[ESP+1B]
0028:CE5B35FB 83C408 ADD ESP,08
0028:CE5B35FE 2401 AND AL,01
0028:CE5B3600 50 PUSH EAX
0028:CE5B3601 55 PUSH EBP
0028:CE5B3602 57 PUSH EDI
0028:CE5B3603 E8A8FEFFFF CALL CE5B34B0
0028:CE5B3608 83C40C ADD ESP,0C
0028:CE5B360B 0AD8 OR BL,AL
0028:CE5B360D 66BE0300 MOV SI,0003
0028:CE5B3611 6A64 PUSH 64
0028:CE5B3613 C06C241701 SHR BYTE PTR [ESP+17],01
0028:CE5B3618 57 PUSH EDI
0028:CE5B3619 E8A279FFFF CALL CE5AAFC0
0028:CE5B361E 83C408 ADD ESP,08
0028:CE5B3621 C0EB01 SHR BL,01
0028:CE5B3624 8A442413 MOV AL,[ESP+13]
0028:CE5B3628 2401 AND AL,01
0028:CE5B362A 50 PUSH EAX
0028:CE5B362B 55 PUSH EBP
0028:CE5B362C 57 PUSH EDI
0028:CE5B362D E87EFEFFFF CALL CE5B34B0
0028:CE5B3632 C06C241F01 SHR BYTE PTR [ESP+1F],01
0028:CE5B3637 83C40C ADD ESP,0C
0028:CE5B363A 0AD8 OR BL,AL
0028:CE5B363C 664E DEC SI
0028:CE5B363E 75E1 JNZ CE5B3621
0028:CE5B3640 6A05 PUSH 05
0028:CE5B3642 80E380 AND BL,80
0028:CE5B3645 68DF000000 PUSH 000000DF
0028:CE5B364A 57 PUSH EDI
0028:CE5B364B FF5718 CALL [EDI+18]
0028:CE5B364E 83C40C ADD ESP,0C
0028:CE5B3651 B900000000 MOV ECX,00000000
0028:CE5B3656 80FB01 CMP BL,01
0028:CE5B3659 5D POP EBP
0028:CE5B365A 83D1FF ADC ECX,-01
0028:CE5B365D 5F POP EDI
0028:CE5B365E 6683E103 AND CX,03
0028:CE5B3662 5E POP ESI
0028:CE5B3663 668BC1 MOV AX,CX
0028:CE5B3666 5B POP EBX
0028:CE5B3667 83C404 ADD ESP,04
0028:CE5B366A C3 RET

Ok,看看下面的代码并不能帮助我们什么 :( 我看过几篇关于狗加密的教程.我们做
的这几步,应该是已经完成了.我想,在CALL后面,会有一个关于狗的 CMP ,如果值是
和狗相同,那么就通过,否则就会加上一个错误的旗标...... 但是,我们是不幸运的,
这里不是那么简单!的.通过和代码游戏(跟踪call,寻找一些比较的代码),我按很多
次 F12 ,但是找不到一点好东西!

BTW,我无从这该死的Sentinel的VXD中出来!按住 F12,可是什么都没有变!VDX使我
陷入困境了......我希望回到 Acad.exe 文件中!我不希望破解狗硬件,大多数的时候,
狗保护的弱点一般都是在目标本身!

我试了 BPIO -h 378 R
让我们在 I/O-port 上试试其它的断点 :

378 已经试过了
3BC 这个 ;)
278 这个也是 ;o)

OK,运行软件,但是却没有拦截 ;( 我的天啊!

因为它是一个 VDX ,所以我也试了 bpx CreateFileA ,但是走不了多久......
那么,为什么不反汇编它呢?运气好说不定能找到一些在字符串中找到一些关于出错
的信息(不要做梦了,那是不可能有的!!:p)现在你能用工具中的啤酒了 ;) 因为我们
要花很长时间去反汇编!!!! 那就是我为什么不用IDA的原因了! BTW, 我们的目标可
执行文件大概是 7.24 mb!好了,现在你知道为什么要花这么多时间了吧..

喝过酒后,一觉醒来.

经过这么长的时间,终于反汇编好了! 首先,保存结果!我们不希望再等那么多时间,不是
吗?如果你的电脑死机或者其它原因,你只有再等那么多时间了!再喝一次酒,呵呵!
完了吗? Ok!

我们愚蠢的想法是去找字符串,运气不佳,没有,其实是意料之中 :p 那么让我们想想!
我们怎样攻击它呢? 我们看看 Import 表吧!看看狗到底调用了什么函数 :) 我们可以找
到一个 "l33t0" API 函数!哈哈,我想会有一些好东西了, 我们来看看内核......

太太太好了 :) 我找到一些有趣的东西了:

DeviceIoControl

从没有看过,但是名称,听起来非常好,不是吗?
呵呵!去除所有的断点只在softice中输入: 'bc *' 和: 'BPX DeviceIocontrol'

现在运行我们的软件! 哈哈,它拦截下来了 :) 按F12,我们跳出了dll文件来到了ACAD.exe
:) 让我们和代码玩耍吧.......

先看代码, 我按F12几次直到在一个好位置.下面是来自我的winice.log 的一部分:

:bl
00) BPX KERNEL32!DeviceIoControl // Damn good :)

Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl
Break due to BPX KERNEL32!DeviceIoControl

// 你在这可以看到我在找到好地方之前被拦截下来多少次
// 你用这个 bpx 的时候,你按 F5 3 次,一会有拦截下来,
// 你再按两次后停在了这儿 :

025F:0098B1AF 668B442402 MOV AX,[ESP+02] ; EAX = 一些值
025F:0098B1B4 83C404 ADD ESP,04
025F:0098B1B7 C20800 RET 0008
025F:0098B1BA 8D9B00000000 LEA EBX,[EBX+00000000]
025F:0098B1C0 33C0 XOR EAX,EAX
025F:0098B1C2 8A442408 MOV AL,[ESP+08]
025F:0098B1C6 83F801 CMP EAX,01
025F:0098B1C9 7415 JZ 0098B1E0
025F:0098B1CB 83F802 CMP EAX,02
025F:0098B1CE 7456 JZ 0098B226
025F:0098B1D0 83F803 CMP EAX,03
025F:0098B1D3 0F8497000000 JZ 0098B270
025F:0098B1D9 C20800 RET 0008

// 通过 RET 后,我们落在这儿:

025F:006ABE9A 0FBFC0 MOVSX EAX,AX ; 呵呵 :)
025F:006ABE9D 83F8FF CMP EAX,-01 ; EAX = FFFF ?!
025F:006ABEA0 7405 JZ 006ABEA7 ; 跳转到 6abea7
025F:006ABEA2 25FFFF0000 AND EAX,0000FFFF
025F:006ABEA7 5F POP EDI
025F:006ABEA8 C3 RET ; 返回 ....

// 这是最重要的部分 :

025F:006ABD94 83C404 ADD ESP,04
025F:006ABD97 85C0 TEST EAX,EAX
025F:006ABD99 7C36 JL 006ABDD1
025F:006ABD9B 8D44240C LEA EAX,[ESP+0C]
025F:006ABD9F 50 PUSH EAX
025F:006ABDA0 E8DB000000 CALL 006ABE80
025F:006ABDA5 83C404 ADD ESP,04
025F:006ABDA8 85C0 TEST EAX,EAX
025F:006ABDAA 7C25 JL 006ABDD1
025F:006ABDAC 686071A700 PUSH 00A77160
025F:006ABDB1 E8CA000000 CALL 006ABE80
025F:006ABDB6 83C404 ADD ESP,04
025F:006ABDB9 85C0 TEST EAX,EAX
025F:006ABDBB 7C14 JL 006ABDD1
025F:006ABDBD 68F470A700 PUSH 00A770F4
025F:006ABDC2 E8B9000000 CALL 006ABE80
025F:006ABDC7 83C404 ADD ESP,04
025F:006ABDCA 3DFDDC0000 CMP EAX,0000DCFD ; eax= DCFD?
025F:006ABDCF 7408 JZ 006ABDD9 ; 好! 狗
025F:006ABDD1 47 INC EDI ; 锁住了 :)
025F:006ABDD2 83FF04 CMP EDI,04
025F:006ABDD5 7EA3 JLE 006ABD7A
025F:006ABDD7 EB17 JMP 006ABDF0 ; 知道吗?
025F:006ABDD9 8B0D8871A700 MOV ECX,[00A77188] ;狗在这儿
025F:006ABDDF 6633F6 XOR SI,SI
025F:006ABDE2 A18471A700 MOV EAX,[00A77184]
025F:006ABDE7 8B1481 MOV EDX,[EAX*4+ECX]
025F:006ABDEA C70202000000 MOV DWORD PTR [EDX],00000002
025F:006ABDF0 8B0D8471A700 MOV ECX,[00A77184] ;没有狗:/
025F:006ABDF6 A18871A700 MOV EAX,[00A77188]
025F:006ABDFB 8B1488 MOV EDX,[ECX*4+EAX]
025F:006ABDFE 8D0C88 LEA ECX,[ECX*4+EAX]
025F:006ABE01 8B1D8471A700 MOV EBX,[00A77184]
025F:006ABE07 8B02 MOV EAX,[EDX]
025F:006ABE09 35A9B50000 XOR EAX,0000B5A9
025F:006ABE0E 03C3 ADD EAX,EBX
025F:006ABE10 A3A471A700 MOV [00A771A4],EAX
025F:006ABE15 8B11 MOV EDX,[ECX]
025F:006ABE17 833A00 CMP DWORD PTR [EDX],00
025F:006ABE1A 752F JNZ 006ABE4B
025F:006ABE1C E81F010000 CALL 006ABF40
025F:006ABE21 35A9B50000 XOR EAX,0000B5A9
025F:006ABE26 3D564AFFFF CMP EAX,FFFF4A56
025F:006ABE2B 741E JZ 006ABE4B

--------------------------- 8< ---------------------- 截取 :p

Ok,我首先想到的是改变:

025F:006ABDCA 3DFDDC0000 CMP EAX,0000DCFD ; 是 eax= DCFD ?
025F:006ABDCF 7408 JZ 006ABDD9 ; 好的! 狗锁住了

成为:

025F:006ABDCA 3DFDDC0000 CMP EAX,0000DCFD
025F:006ABDCF EB08 JMP 006ABDD9 ;不管 EAX 了,我跳 :p

但是,EAX 的值很重要,否则是会崩溃的:( 我们也看到了很多处都调用了 EAX 寄存器
,检查了好几次哦!那么,我们只有暴力使 EAX 的值等于 DCFD 了!

你还不清除吗,新手?EAX的值为什么要等于 DCFD?你没看到:CMP EAX,0000DCFD
吗?先在大家都清楚了吧!

我们到哪去修改目标呢?想想什么时候对 AX 赋值的?我清理一下内存,整理出下面这段
代码:

025F:0098B1AF 668B442402 MOV AX,[ESP+02] ; EAX = 一些值.
025F:0098B1B4 83C404 ADD ESP,04
025F:0098B1B7 C20800 RET 0008
025F:0098B1BA 8D9B00000000 LEA EBX,[EBX+00000000]
025F:0098B1C0 33C0 XOR EAX,EAX
025F:0098B1C2 8A442408 MOV AL,[ESP+08]
025F:0098B1C6 83F801 CMP EAX,01
025F:0098B1C9 7415 JZ 0098B1E0
025F:0098B1CB 83F802 CMP EAX,02
025F:0098B1CE 7456 JZ 0098B226
025F:0098B1D0 83F803 CMP EAX,03
025F:0098B1D3 0F8497000000 JZ 0098B270
025F:0098B1D9 C20800 RET 0008

'是的!就是你说过的那个地方! *SLAP*!!

呵呵,我们只要使EAX的值永远等于DCFD就行了,代码就变成:

66B8FDDC MOV AX,DCFD ; 你知道这是干什么,对吗? ;)
90 NOP ; 一个 NOP 就是什么都不干!
C20800 RET 0008 ; 不变

Ok,很简单吧? BTW 当你修改的时候不要忘了把代码倒一下,比如: B8FDCD 是 CDFD,
你应该知道我是什么意思,对吗?不??

现在给你的目标打上补丁,运行试试看!

下面就是说软件破解的非常成功,我就不翻译了.

原文作者:ACiD BuRN [ECLiPSE / Immortal Descendants]

-=-=-=-=-=-=-=-=-=-=-=-[EOF]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=梦经第四期-=-=-=-=-=-=-=-


CAXA2000电子图板

标 题:打狗CAXA2000电子图板，只改半字节!!!!!!!!!!!!!!!!!!!!!!!!! (1千字)
发信人:zest
详细信息:
打狗CAXA2000电子图板，只改半字节!!!!!!!!!!!!!!!!!!!!!!!!!
2XXX年X月X日，头喜画图，买一6元XXXX精华版D碟。
内软件均破唯此DOG===>CAXA2000
一声犬吠,
我打！

无狗不能SAVE!!!!!!岂有犬理????????

内eb.exe 1881KB
找c:\windows\system\keypro.dll

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:100010BE(C), :100010E7(C)
|
:10001102 33DB xor ebx, ebx
:10001104 66891E mov word ptr [esi], bx
:10001107 66895E02 mov word ptr [esi+02], bx
:1000110B 66895E04 mov word ptr [esi+04], bx
:1000110F 66895E06 mov word ptr [esi+06], bx
:10001113 66895E08 mov word ptr [esi+08], bx
:10001117 66895E0A mov word ptr [esi+0A], bx
:1000111B 66895E0C mov word ptr [esi+0C], bx
:1000111F 66895E0E mov word ptr [esi+0E], bx
:10001123 66895E10 mov word ptr [esi+10], bx
:10001127 66C7070300 mov word ptr [edi], 0003
^^^^ ^^^^
改0000 0000
:1000112C 5F pop edi
:1000112D 5E pop esi
:1000112E 5B pop ebx
:1000112F C20400 ret 0004

不但狗骨头被啃光，序列号也被干掉了，我哈哈哈哈！
不要问我为什么？我还要去跪算盘！
可由提示窗口着手，
也可BPIO 378着脚。

/\zest/\
2001.1


Label Matrix 32 for

 标 题:等几天不見小牧童的打狗下篇,只好自已拿打狗棍亂舞,結果...哈哈(Lebel Matrix32) (1千字)
发信人:iCesHip
时 间:2000-10-14 13:54:36
详细信息:
Software: Label Matrix 32 for windows
Version : 4.80.1
Dongle : Sentinel Pro

上次的貼子小牧童兄回復之后,我跟著童兄的上篇方法做,自已制造Int3來攔,但是沒用,還是什么都攔不到!!!可能是我功力不夠!以下說一下我的大慨思路.
但由于無狗時是Demo版,有個Nag出來,所以我就用showwindow來攔,再行跟蹤,最后跟到DeviceIOControl!(啪!頭上挨了重重的一巴,我的手道:為什么不早用這個斷點?跟ShowWindow,按F10按得好辛苦啊! :( )
在程序Call Kernel!DeviceIOControl后,在內存的某一地址處有一標記,有狗時為0500,無狗時為0503,由于我不知道如何去修改DeviceIOControl的返回,所以只有在Call完之后,將那個地址強行置0.(注,此處的標記永遠不變,所以可以強行置0,而下面的標記就不行)
還有第二個標記是:地址內容為隨機的內容,所以只能用暴力更改程序流程.
在看雪的教程里有一些英文解狗教程講在解Sentinel的狗時用CreateFileA來攔,我試過,斷點太多,不知道那里是判斷核心.我實在是不知道如何跟下去!
進去之后,軟件每10秒還會測狗一次,由于每次測狗得到一些數都不同,所以只能采取暴力法,強迫程序跳轉!注意,此處的標記地址與上面第二個標記一樣,但是比較完之后的流程大不相同)
最后進行各種測試,已和有狗版一樣,所有功能完整無缺,免狗補丁已做好!如需要的網友可來Email!
最后得出一個結論,Cracker一定要有耐心,上次我解的時候用了5個小時,沒有結果,停了這么多天.這次我昨天用了近10個小時來分析,終于分析的比較透徹,所以解起來也比較容易! 并且最終還是要靠自已,因為別人的教程或方法由于客觀原因(比如你的功力或軟件的不同,小牧童的我易用不了)并不一定適合你!
耐心!!!!!!!!!!!!!!!

iceship
2000-10-14


Label matrix 5.0

 标 题:Label matrix 5.0出来了,极品条码工具!但保护也相当强悍!高手但请一试!
发信人:1212
时 间:2000-12-13 9:03:45
详细信息:
http://www.strandware.com/download/lmw50.exe
发装时可用以下形式的Activation Code激活continue install按钮
"C2G2G-2T464-A3623-30819-OHJ62"仅能激活按钮,不能继续安装!

希望高手破完能把过程写出来!以便菜鸟受益!呵呵....

标 题:呵呵..沒貼上,再來!
发信人:iCESHiP
时 间:2000-12-14 16:39:07
详细信息:

這個軟件我有4.0的正版,今天看到這個貼子,于是把他搞下來想升級,誰知道裝都不讓裝,Kao!
于是架起TRW2000,准備跟蹤:

先照BF大俠的吩咐,把Frg3117x.dll換個名字,結果出來熟悉的畫面:"程序運行在Demo方式"!4.0時就這樣,有狗就是正式版,無狗就是"Demo方式"!現在就正式開始跟蹤吧,Lets go for fun!

1.用狗的,當然是bpx DeviceIOControl了,斷了無數次,每次用pmodule返回時都回到spool32中,不行,得想第二個辦法!
2.要在程序開始斷下來,又不愿意用sendmessage來攔,良久,實在是想不到什么好的辦法,最后只有用DeviceIOControl,一斷下來先回到Spool32之后就狂按F10(我是按信F10不松,也不知道有多少下,不到一分鐘),突然程序運行了!結束程序,回到TRW中!在那個Call上按F9.第一步收工!
3.再運行程序,在斷點處按F8進去(此時,已是lmw32.exe的領空),又狂按F10.........最終你會來到lmw50v.dll的領空,成功一半了,呵呵...
4.這時一定要注意DS:02124360的值,開始的時候他是1.如果他變成5,嘿嘿.....你就4了4了的!
5.知道他不能為5,那么就looklook他為什么等于5了,中間跟蹤過程太多,不一一列出,如果你見到以下代碼,你就成功了!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10236E26(C)
|
:10236E35 0FBE55E8 movsx edx, byte ptr [ebp-18]
:10236E39 83FA31 cmp edx, 00000031
:10236E3C 7553 jne 10236E91
:10236E3E E8DCD50100 call 1025441F //這里出來EAX不為0完了 !!!
:10236E43 85C0 test eax, eax //如果是2,肯定你的Frg3117x.dll沒有刪!!!也麻煩!
:10236E45 741B je 10236E62
:10236E47 8B8D5CFDFFFF mov ecx, dword ptr [ebp+FFFFFD5C]
:10236E4D E8DEF5E1FF call 10056430
:10236E52 0C04 or al, 04
:10236E54 50 push eax
:10236E55 8B8D5CFDFFFF mov ecx, dword ptr [ebp+FFFFFD5C]
:10236E5B E8F08DE6FF call 1009FC50
:10236E60 EB2D jmp 10236E8F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10236E45(C)
|
:10236E62 8B8D5CFDFFFF mov ecx, dword ptr [ebp+FFFFFD5C]
:10236E68 E8C3F5E1FF call 10056430 //剛才跳完,來到這里!這個Call很簡單,只是把DS:02124360中的值給EAx見下面的代碼!
:10236E6D 83E040 and eax, 00000040 //and完之后EAX為0,你又完了!
:10236E70 85C0 test eax, eax
:10236E72 751B jne 10236E8F //我跳.........
:10236E74 8B8D5CFDFFFF mov ecx, dword ptr [ebp+FFFFFD5C]
:10236E7A E8B1F5E1FF call 10056430
:10236E7F 0C04 or al, 04
:10236E81 0C40 or al, 40
:10236E83 50 push eax
:10236E84 8B8D5CFDFFFF mov ecx, dword ptr [ebp+FFFFFD5C]
:10236E8A E8C18DE6FF call 1009FC50

call 10056430

:10056430 55 push ebp
:10056431 8BEC mov ebp, esp
:10056433 51 push ecx
:10056434 894DFC mov dword ptr [ebp-04], ecx
:10056437 8B45FC mov eax, dword ptr [ebp-04]
:1005643A 8B8020010000 mov eax, dword ptr [eax+00000120]
:10056440 8BE5 mov esp, ebp
:10056442 5D pop ebp
:10056443 C3 ret

經過以上兩跳之后,進入程序,所以的"Demo"字樣已完全不見了,呵呵.....當然,時間,功能什么的就....

6.其中Call 1025441F相當之重要,如ds:02124360中的值就是在這里面給的,不同的值會有和種不同的結果...改的好的話,Frg3117x.dll都不用刪!
7.分析到這里,怎么改各位自已去試了!你可以直接下斷點來到以上的call處!
8.收工!

總結:1.開始進入斷點的方法很愚蠢,希望高手指點一下?
2.多謝BF大俠發現Frg3117x.dll,把它刪掉之后我才有信心Crack的!BF大俠能不能賜教你是怎么找到這個秘密的???多謝先!
3.這個東東好象不需要狗!? 反正我的4.0是要狗的!可能是5.0改了吧!
4.多謝這位發信息的朋友,我還不知道他升級到了5.0呢!呵呵...比4.0好用!(廢話)
號外:發現一個Hex Workshop的問題,我用它改Lmw50v.dll完成之后,存盤,一切都正常!但是運行時完全反應,,,再跟蹤一看,根本沒改到!!!最后只有用Save as用另外的文件名存完后,再換回文件名的方法!問題可能是windows沒有釋放這個束DLL,但Hex也應該告訴我不能存啊!

iceship
2000-12-14


Rainbow Sentinel

 标 题:关于Rainbow Sentinel 的一般解法 (541字)
发信人:小无
时 间:2001-5-4 14:00:02
详细信息:
一、参考前面的碟子
二、Sentinel Driver 现在的版本到6.3了，但变化不大
以Sx32w.dll为例：
用Wdasm 反编，找出口函数
将INIT,等找狗、初始化狗的函数
一律改返回值EAX=0
这样，软件的检测狗的部分可以通过了
三、对软件中对狗要求数据返回部分
仔细分析软件、尽可能找出有效数据
一般的加密软件来说，狗中的数据，在程序中都有对应数据

Sentinel Query函数，除返回调用正确外
在第三个调用参数（指针）是返回值response
返回长度在第六个参数(Short INT)

Extend Read, Read的函数做法类似

谢谢阅读


监理通2000

 标 题:SentinelDOG 破解监理通2000单机版，及网络版 ((1千字)
发信人:小无
时 间:2001-5-4 16:03:34
详细信息:
Yinci那个RBDLL什么都看得到，
不过我没有原狗没试过，我想它的程序也是有价值的

Sx32w.dll (这是5.051版本的，6.xx版本大同小异）

没有找到狗后都转到这里出口：(改为找狗成功）
改00406C60子程序
:00406C60 668B442404 mov ax, word ptr [esp+04]
:00406C65 663D0301 cmp ax, 0103
:00406C69 7507 --->33C0 jne 00406C72
:00406C6B 66B81201-->C2040090 mov ax, 0112
:00406C6F C20400-->909090 ret 0004

找sx32w.dll QUERY位置 0x00006E10
改Query
:00407A10 53 push ebx
:00407A11 56 push esi
:00407A12 57 push edi
:00407A13 8B442410 mov eax, dword ptr [esp+10]
:00407A17 0BC0 or eax, eax
:00407A19 750A jne 00407A25
:00407A1B 66B80200 mov ax, 0002
:00407A1F 5F pop edi
:00407A20 5E pop esi
:00407A21 5B pop ebx
:00407A22 C21800 ret 0018

:00407A10 52 push edx
:00407A11 8B542414 mov edx, dword ptr [esp+14]
:00407A15 B8xxxxxxxx mov eax, xxxxxxxx
:00407A1A 8902 mov dword ptr [edx], eax
:00407A1C 33C0 xor eax, eax
:00407A1E 33C0 xor eax, eax
:00407A20 5A pop edx
:00407A21 C21800 ret 0018
:00407A24 90 nop

xxxxxxxx是某软件的关键数据,不同版本不一样
不过改一下上段代码，很容易通用的

标 题:JLT2000单机版、网络版通用破解（三个不同的狗加密数据） (2千字)
发信人:小无
时 间:2001-5-4 20:58:36
详细信息:

我搞破解不到一月，谢谢Toye兄
sx32w.dll(V5.0.51)
+++++++++++++++++++ EXPORTED FUNCTIONS ++++++++++++++++++
Number of Exported Functions = 0017 (decimal)
Addr:00407280 Ord: 1 (0001h) Name: RNBOsproInitialize
Addr:00407620 Ord: 2 (0002h) Name: RNBOsproRead
Addr:004076D0 Ord: 3 (0003h) Name: RNBOsproExtendedRead
Addr:00407790 Ord: 4 (0004h) Name: RNBOsproWrite
Addr:00407970 Ord: 5 (0005h) Name: RNBOsproActivate
Addr:00407830 Ord: 6 (0006h) Name: RNBOsproOverwrite
Addr:00407350 Ord: 7 (0007h) Name: RNBOsproGetVersion
Addr:00407B10 Ord: 8 (0008h) Name: RNBOsproGetFullStatus
Addr:00407220 Ord: 9 (0009h) Name: RNBOsproFormatPacket
Addr:00406DC0 Ord: 10 (000Ah) Name: RNBOsproCfgLibParams
Addr:00407450 Ord: 11 (000Bh) Name: RNBOsproFindFirstUnit
Addr:00407540 Ord: 12 (000Ch) Name: RNBOsproFindNextUnit
Addr:004078E0 Ord: 13 (000Dh) Name: RNBOsproDecrement
Addr:00407A10 Ord: 14 (000Eh) Name: RNBOsproQuery
Addr:00406C80 Ord: 15 (000Fh) Name: RNBOsproGetUnitInfo
Addr:00406D10 Ord: 16 (0010h) Name: RNBOsproSetUnitInfo
Addr:00407B40 Ord: 20 (0014h) Name: DllEntryPoint

Exported fn(): RNBOsproQuery - Ord:000Eh
:00407A10 9C pushfd
:00407A11 52 push edx
:00407A12 8B542418 mov edx, dword ptr [esp+18]
:00407A16 837C24102A cmp dword ptr [esp+10], 0000002A
:00407A1B 7515 jne 00407A32
:00407A1D 837C241030 cmp dword ptr [esp+10], 00000030
:00407A22 7507 jne 00407A2B
:00407A24 xxxxxxxx(单机版 mov eax, xxxxxxxx
另一个可用数据）
:00407A29 EB0C jmp 00407A37

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407A22(C)
|
:00407A2B xxxxxxxx单机版数据 mov eax, xxxxxxxx
:00407A30 EB05 jmp 00407A37

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407A1B(C)
|
:00407A32 xxxxxxxx mov eax, xxxxxxxx(网络版数据）

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407A29(U), :00407A30(U)
|
:00407A37 8902 mov dword ptr [edx], eax
:00407A39 33C0 xor eax, eax
:00407A3B 33C0 xor eax, eax
:00407A3D 5A pop edx
:00407A3E 9D popfd
:00407A3F C21800 ret 0018


金天地MH型软件狗

标 题:金天地MH型软件狗 "时间间隔检测保护"补充
发信人:ljtt
时 间:2000-12-29 18:54:19
详细信息:
可能是有问题。那是晚上熬夜写的，写到晚上1点，人困马乏，加上是从记录中整理的，就没有象以前实际测试一遍，让你浪费时间了，你试试这样看行不行。这是我以前跟踪时所用的断点。现在没有以前那么多时间可以写那么长的东东了。

用iceload加载程序，然后 be 0 ，然后一路按 F5 试试。我现在也差不多不记得当时的跟踪情况，大致是这样，如果有错误，。。。就自己试着解决吧。奸笑！
我对狗了解也很少，其实按招我的东东来解狗有点浪费时间，我的错误太多了，只希望你能了解思路就行了。你完全自己做到的，关键是自己掌握分析和跟踪方法。

0： bpx CreateFileA do "bd 0; be 3"
1： bpx 408D46 do "eb eip c7,45,c8,0,0,0,0,eb"
2： bpx 408F28 do "eb eip c7,05,be,32,41,00,d3,0,0,0"
3： bpx 408A69 do "d 4132be; bd 3"
4： bpx 4079EB do "eb eip c7,45,b4,0,0,0,0,eb"
5： bpx 408A55
标 题:对ljtt《金天地MH型软件狗 "时间间隔检测保护"的一点分析》一文的一点补充 (1千字)
发信人:真.hp
时 间:2000-12-29 22:28:52
详细信息:
我看了ljtt的那篇文章，于是跟着作了，但却不成功，于是我也跟踪了一下，
发现程序在015F:00408A2F处有一call走过之后就会推出，于是用F8跟进

0040782F 55 push ebp
00407830 8BEC mov ebp, esp
00407832 83EC4C sub esp, 4Ch
00407835 53 push ebx
00407836 56 push esi
00407837 57 push edi
00407838 C745C800000000 mov dword ptr [ebp-38h], 0
0040783F 833D7C30410000 cmp ds:dword_41307C, 0 <-判断此处是否为0
00407846 0F843B010000 jz loc_407987 <-跳就完了
0040784C C745D0724102CF mov [ebp+var_30], 0CF024172h
00407853 8175D035247683 xor [ebp+var_30], 83762435h

由于后面的程序还会判断41307C是否为0，所以我把0040783F处的代码改为

0040783F C6057C30410001 mov ds:dword_41307C, 1

正好也是7个字节，这样就可以对付以后的判断了。另外

004079FD C705183041004C9B4000 MOV DWORD PTR [00413018],00409B4C

的代码和

00408F28 C705183041004C9B4000 MOV DWORD PTR [00413018],00409B4C

一样于是我把它也改为

C705BE324100D3000000 MOV DWORD PTR [004132BE],000000D3

否则照样无法运行。

被mh-dog加壳的程序的那个用来还原程序数据的“密匙”
放.data的某处（在notepadmh.exe中为123FFh处），只要
一个字节即可，而源程序的oep，放在.gdata的+18h处的4
个字节（dj-dog加的壳的oep在.gdata的+10h处）。
我还没找出好方法来判断那个“密匙”存放的地方。

最后，我要感谢ljtt的无私奉献！
ps:ljtt，你能把如何反推出“密匙”的方法详细的讲一下吗？
我比较笨，怎么跟都看不懂算法。

标 题:如何快速破解被金天地DJ，MH型狗加壳的程序。 (2千字)
发信人:真.hp
时 间:2000-12-31 22:27:35
详细信息:

此方法仅对被金天地DJ，MH型狗加壳的程序有效，
对彩虹天地的DJ，MH型狗可能无效。由于例子太少
，无法作太多的研究。请有软狗的人像小牧童一样
把notepad用软狗加密程序加密一下放到网上供人
下载，或发给我hp_xm@elong.com，好让我有更多
的例子可研究。（记的写明是哪种狗加的壳）

现在开始（以小牧童的那6个程序为例）：

DJ型狗

打开notepaddj.exe，转到.gdata段。
.gdata+10h处放的是程序的oep（4字节），
.gdata+14h和.gdata+26h（各4字节）存放
的是程序运行的期限，即程序未过期时可免
狗运行。算法如下：
（设.gdata+14h处为11 22 33 44，.gdata+26h处为55 66 77 88）
11 xor 55　　　得出日期
22 xor 66　　　得出月份
4433 xor 8877　得出年份
日期同时也是那个关键的“密匙”，当日期为0时dj狗的
“密匙”为0Bh，mh狗的“密匙”为D3h。（后半句未经
验正，不知是否于狗有关）
.gdata+74h处放的是加壳方式（4字节）为1时无狗可运行，
但过期后要狗，为0时要有狗才能运行。
现在我们来修改notepaddj.exe，
把.gdata+74h处改为 01 00 00 00，
把.gdata+14h处改为 0B 0C 0F 27
0B（日期兼“密匙”）0C（12月）0F27->270F（9999年）
把.gdata+26h处改为 00 00 00 00
这样改过之后程序就可以运行了，过期日9999年12月11日。

MH型狗

打开notepadmh.exe，转到.gdata段。
.gdata+18h处放的是程序的oep（4字节），
.gdata+1Ch和.gdata+2Eh（各4字节）存放
的是程序运行的期限，即程序未过期时可免
狗运行。算法如下：
（设.gdata+1Ch处为11 22 33 44，.gdata+2Eh处为55 66 77 88）
11 xor 55　　　得出日期
22 xor 66　　　得出月份
4433 xor 8877　得出年份
日期同时也是那个关键的“密匙”，当日期为0时dj狗的
“密匙”为0Bh，mh狗的“密匙”为D3h。（后半句未经
验正，不知是否于狗有关）
.gdata+7Ch处放的是加壳方式（4字节）为1时无狗可运行，
但过期后要狗，为0时要有狗才能运行。
现在我们来修改notepadmh.exe，
把.gdata+7Ch处改为 01 00 00 00，
把.gdata+1Ch处改为 D3 0C 0F 27
D3（日期兼“密匙”）0C（12月）0F27->270F（9999年）
把.gdata+2Eh处改为 00 00 00 00
这样改过之后程序的过期日9999年12月211日，但此时还不
能运行。因为加了mh的限期运行的壳后它会生成一个文件，
这个文件是用来记录程序上次运行的时间，如果没有这个
文件程序就不能运行，如果存在，它会读取这个文件，判
断程序上次运行的时间是否小于当前时间，如果大于当前
时间则拒绝运行。这个文件大小为20字节
.gdata+84h处的4个字节，文件内容与这4个字节有关系，
不过我不知道算法。
.gdata+88h处放这个文件的文件名。
我们把.gdata+84h处的4个字节改为00 00 00 00
把.gdata+88h处改为"date.dat"，并建立一个大小为20字
节，内容均为00h的文件date.dat，这时即可成功运行程序。
标 题:分析得这么透彻，真不简单！！祝你元旦快乐！ (1千字)
发信人:ljtt
时 间:2000-12-31 23:04:28
详细信息:
我是这么改的。

Comparing files NOTEPADDJ.EXE and TEMP\CRDJ.EXE
00005E75: 55 C3
00006B8D: 10 96
00006B8E: D0 D2
00006B91: 06 0B
00006B92: 78 00
00006B93: 40 00

Comparing files NOTEPADDJ1.EXE and TEMP\CRDJ1.EXE
00005E75: 55 C3
00006B8D: 10 96
00006B8E: D0 D2
00006B91: 06 0B
00006B92: 78 00
00006B93: 40 00

Comparing files NOTEPADDJ2.EXE and TEMP\CRDJ2.EXE
00005E75: 55 C3
00006B8D: 10 96
00006B8E: D0 D2
00006B91: 06 16
00006B92: 78 00
00006B93: 40 00

Comparing files NOTEPADMH.EXE and TEMP\CRMH.EXE
000079EB: 89 C7
000079EE: 83 00
000079EF: 7D 00
000079F0: B4 00
000079F2: 74 EB
00008D46: 89 C7
00008D49: 83 00
00008D4A: 7D 00
00008D4B: C8 00
00008D4D: 74 EB
00008F2A: 18 BE
00008F2B: 30 32
00008F2E: 4C D3
00008F2F: 9B 00
00008F30: 40 00

Comparing files NOTEPADMH1.EXE and TEMP\CRMH1.EXE
000079EB: 89 C7
000079EE: 83 00
000079EF: 7D 00
000079F0: B4 00
000079F2: 74 EB
00008D46: 89 C7
00008D49: 83 00
00008D4A: 7D 00
00008D4B: C8 00
00008D4D: 74 EB
00008F2A: 18 BE
00008F2B: 30 32
00008F2E: 4C D3
00008F2F: 9B 00
00008F30: 40 00

Comparing files NOTEPADMH2.EXE and TEMP\CRMH2.EXE
000079EB: 89 C7
000079EE: 83 00
000079EF: 7D 00
000079F0: B4 00
000079F2: 74 EB
00008D46: 89 C7
00008D49: 83 00
00008D4A: 7D 00
00008D4B: C8 00
00008D4D: 74 EB
00008F2A: 18 BE
00008F2B: 30 32
00008F2E: 4C 16
00008F2F: 9B 00
00008F30: 40 00
标 题:在你贴出那篇文章之前我已作了不少研究，但被卡在那个“密匙”处，我找不出恢复数据“密匙”，你那篇文章给... (147字)
发信人:真.hp
时 间:2000-12-31 23:11:40
详细信息:
标题: 在你贴出那篇文章之前我已作了不少研究，但被卡在那个“密匙”处，我找不出恢复数据“密匙”，你那篇文章给了我很大帮助！也祝你新年快乐！

内容:
标 题:我则是小牧童的笨笨招下启发的，他不是说关键的是小部分，大部分是对付破解的代码。所以。。。。 (633字)
发信人:ljtt
时 间:2000-12-31 23:24:07
详细信息:
我想找出关键的地方就行了，就没有去关心其他的转换的过程了。我是逆推的。
其实我也很笨.......只不过是因为我早已过了“迷时师渡”的年龄，虽然笨到无法“悟”得，但也只好过着“自渡”的生活，加上爱一点面子的原因，所以有问题总是自己想办法解决。虽然很苦，但也有乐趣。:-)

这个所谓的“算法”说出来让你笑掉大牙！你看了就知道我是多么得头脑简单，只能对付这种被我冠以“算法”/“密匙”的一段代码，所以别被我唬住了，什么“密匙”/“算法”那都是我.........面子.........上的一点考虑.......。
程序那一大段代码是为了迷惑视线的。可以简化为：
key = key * 0x4e35;
key = key & 0x000000ff;
key = key + 1
所以我说“很简单”，是真的很“简单”了。


速达3000 Pro

标 题:破解《速达3000 Pro》 正式版的加密狗 (16千字)
发信人:xiaqin[CCG]
时 间:2001-3-16 9:26:27
详细信息:
破解《速达3000 Pro》 正式版的加密狗

【声明】
我写这篇文章是以技术交流为主，希望大家在转载时能保持文章的完整性。

【前言】
看过牧童兄的《小牧童放牛赶“狗“笨笨招（上）》后，一直想找个加密狗软件学习研究一下。恰好小弟所在公司为了实现会计电算化。购买了正版的《速达3000 pro》进销存财务软件。小弟正好拿来练练手，在小弟的软硬兼施外加一顿肯德基的诱惑下公司财务部的MM，终于肯将软件和加密狗借给我一观。

这是小弟第一次破解加密狗的软件，功力有限。如有不足之处，请各位大侠指点。

软件简介：《速达3000 PRO》软件是非常著名的进销存财务软件。

破解工具：
(1)Soft-ICE v4.01 //及各种补丁Frogsice 1.08、icepatch 、si_bd.zip
(2)wmldr.zip、 //让Soft-ICE能够在Win ME下运行的补丁。
(3)IceDump 6.015
(4)Trw2000 1.22
(5)UltraEdit-32 v7.10b
(6)CodeFusion Wizard V3.00 //补丁制作工具

在破解之前，我们需要对软件有一个基本的了解。 在没有安装加密狗之前，在启动软件时会弹出“未检测到本软件使用的软件狗，本软件将工作试验版状态”对话框。在软件的启动画面中醒目的有红色“试用版”三个字。就进入了“选择公司帐套”。在进入软件后。在 “关于速达3000 PRO”中同样有红色“试用版”三个字。

首先，取出我们的打狗棒Soft-ICE，在 LPT1上设置了最常用破狗断点: BPIO -H 378 R。 停在了这儿:

EAX=CA51033F EBX=C17CDB9C ECX=CA51CCBC EDX=CA510378 ESI=CA51CE64
EDI=C17CDBB0 EBP=CA51CB6C ESP=CA51CB5C EIP=C17CB061 o d I S z a p c
CS=0028 DS=0030 SS=0030 ES=0030 FS=0078 GS=0030 SS:CA51CB68=CB88
==================================================byte==============PROT==?0)==
0030:00000000 CC 00 FF 2F 2B 04 70 00-C3 E2 00 F0 2B 04 70 00 .../+.p.....+.p.
0030:00000010 2B 04 70 00 54 FF 00 F0-08 80 00 F0 6F EF 00 F0 +.p.T.......o...
0030:00000020 00 00 00 C8 87 E9 00 F0-6F EF 00 F0 6F EF 00 F0 ........o...o...
0030:00000030 6F EF 00 F0 6F EF 00 F0-57 EF 00 F0 6F EF 00 F0 o...o...W...o...
==========================================================================ROT32==
0028:C17CB060 IN AL,DX
0028:C17CB061 MOV [EBP-04],AX <<--光标停在了这儿
0028:C17CB065 MOV AX,[EBP-04]
0028:C17CB069 JMP C17CB06E
0028:C17CB06E POP EDI
0028:C17CB06F POP ESI
0028:C17CB070 POP EBX
0028:C17CB071 LEAVE
0028:C17CB072 RET
0028:C17CB073 PUSH EBP
0028:C17CB074 MOV EBP,ESP
0028:C17CB076 PUSH EBX
0028:C17CB077 PUSH ESI
0028:C17CB078 PUSH EDI
0028:C17CB079 MOV AL,[EBP+0C]
0028:C17CB07C MOV DX,[EBP+08]
0028:C17CB080 OUT DX,AL
0028:C17CB081 POP EDI
0028:C17CB082 POP ESI
0028:C17CB083 POP EBX
0028:C17CB084 LEAVE
0028:C17CB085 RET
0028:C17CB086 PUSH EBP
0028:C17CB087 MOV EBP,ESP
0028:C17CB089 SUB ESP,1C
====================================TDSD(01)+3060==============================
:CLS
:pagein n 1.txt

从上面的信息可以推断出这是一个TDSD狗加密的软件(可能是彩虹DJ系列的狗)，我对狗认识不多，请指正。在按了几次F12后，就跳到了Sd3000的领空。但我无从这该死的SD3000领空中出来!按住 F12,可是什么都没有变!使我陷入困境了。

在这里我发现一个奇怪的现象。在SD3000的领空时，用Soft-ICE跟踪时按F10代码会随机改变。而Trw2000 1.22则没有这样的现象发生。我怀疑加密狗防Soft-ICE造成。但是在给Soft-ICE打上Frogsice 1.08、icepatch 、si_bd.zip等补丁后，还是有这样的情况发生。不知是什么问题。有那位大虾知道请告知!! 小弟先行谢谢了。

第一次解狗，我不可能解加密狗的硬件,我看过的一些解狗的教程中有提到，“狗保护的弱点一般都是在软件的本身!”也就是说要在软件本身下手。对了，软件在启动时有对话框。我们就从这个点进行突破。

下指令bpx createwindowex 拦截软件的对话框。
来到cc3250mt.dll的领空。
......................
016F:3257DBC9 INC EBX
016F:3257DBCA JMP SHORT 3257DBCD
016F:3257DBCC INC EBX
016F:3257DBCD MOV AL,[EBX]
016F:3257DBCF TEST AL,AL
016F:3257DBD1 JZ 3257DBD7
016F:3257DBD3 CMP AL,20
016F:3257DBD5 JZ 3257DBCC
016F:3257DBD7 CMP AL,09
016F:3257DBD9 JZ 3257DBCC
016F:3257DBDB CALL 3257DC24
016F:3257DBE0 PUSH EAX
016F:3257DBE1 PUSH EBX
016F:3257DBE2 PUSH BYTE +00
016F:3257DBE4 PUSH BYTE +00
016F:3257DBE6 CALL `KERNEL32!GetModuleHandleA`
016F:3257DBEB PUSH EAX
016F:3257DBEC CALL NEAR [ESI+18] <<---关键! ! !
016F:3257DBEF ADD ESP,BYTE +10
016F:3257DBF2 PUSH EAX
016F:3257DBF3 CALL `CC3250MT!_exit`
016F:3257DBF8 POP ECX
016F:3257DBF9 JMP SHORT 3257DC1C
016F:3257DBFB MOV EDX,[325AD400]
016F:3257DC01 PUSH EDX
016F:3257DC02 MOV ECX,[325AD3FC]
016F:3257DC08 PUSH ECX
......................

当走到016F:3257DBEC CALL NEAR [ESI+18]时，按F10带过此处时，软件弹出“未检测到本软件使用的软件狗，本软件将工作试验版状态”对话框。估计在016F:3257DBEC CALL NEAR [ESI+18]此处有重大嫌疑，重新在此处下中断点。按F8进入此CAll。来到了SD3000的领空，就真正进入的软件检查加密的核心。

.................
016F:004017F4 55 PUSH EBP
016F:004017F5 8BEC MOV EBP,ESP
016F:004017F7 83C4C0 ADD ESP,BYTE -40
016F:004017FA 53 PUSH EBX
016F:004017FB 56 PUSH ESI
016F:004017FC 57 PUSH EDI
016F:004017FD B8D8C97500 MOV EAX,0075C9D8
016F:00401802 E8AD782800 CALL 006890B4
016F:00401807 6A00 PUSH BYTE +00
016F:00401809 680EC97500 PUSH DWORD 0075C90E
016F:0040180E E853933500 CALL `USER32!FindWindowA`
016F:00401813 8945C0 MOV [EBP-40],EAX
016F:00401816 837DC000 CMP DWORD [EBP-40],BYTE +00
016F:0040181A 7622 JNA 0040183E
016F:0040181C 6A00 PUSH BYTE +00
016F:0040181E 6A00 PUSH BYTE +00
016F:00401820 68B9080000 PUSH DWORD 08B9
016F:00401825 FF75C0 PUSH DWORD [EBP-40]
016F:00401828 E841943500 CALL `USER32!PostMessageA`
016F:0040182D 33C0 XOR EAX,EAX
016F:0040182F 8B55C4 MOV EDX,[EBP-3C]
016F:00401832 64891500000000 MOV `DOSMGR_BackFill_Allowed`,EDX
016F:00401839 E9F0030000 JMP 00401C2E
016F:0040183E C6050056890000 MOV BYTE [00895600],00
016F:00401845 803D0056890000 CMP BYTE [00895600],00
016F:0040184C 0F852B010000 JNZ NEAR 0040197D
016F:00401852 C6050056890001 MOV BYTE [00895600],01
016F:00401859 66C745D41400 MOV WORD [EBP-2C],14
016F:0040185F 8D45F8 LEA EAX,[EBP-08]
016F:00401862 E8D1030000 CALL 00401C38
016F:00401867 FF45E0 INC DWORD [EBP-20]
016F:0040186A E86D353500 CALL `SD3000!@Dogtestpro@_ManCheckDlgDan$qqrv`
016F:0040186F 66C745D40800 MOV WORD [EBP-2C],08
016F:00401875 66C745D42000 MOV WORD [EBP-2C],20
016F:0040187B BA1FC97500 MOV EDX,0075C91F
016F:00401880 8D45F4 LEA EAX,[EBP-0C]
016F:00401883 E8EC3D3500 CALL 00755674
016F:00401888 FF45E0 INC DWORD [EBP-20]
016F:0040188B 8D55F4 LEA EDX,[EBP-0C]
016F:0040188E 8D45F8 LEA EAX,[EBP-08]
016F:00401891 E856413500 CALL 007559EC
016F:00401896 50 PUSH EAX
016F:00401897 FF4DE0 DEC DWORD [EBP-20]
016F:0040189A 8D45F4 LEA EAX,[EBP-0C]
016F:0040189D BA02000000 MOV EDX,02
016F:004018A2 E861403500 CALL 00755908
016F:004018A7 59 POP ECX
016F:004018A8 84C9 TEST CL,CL
016F:004018AA 7412 JZ 004018BE
016F:004018AC E83F373500 CALL `SD3000!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
016F:004018B1 84C0 TEST AL,AL
016F:004018B3 7457 JZ 0040190C
016F:004018B5 C6050056890000 MOV BYTE [00895600],00
016F:004018BC EB4E JMP SHORT 0040190C
016F:004018BE 66C745D42C00 MOV WORD [EBP-2C],2C
016F:004018C4 BA21C97500 MOV EDX,0075C921
016F:004018C9 8D45F0 LEA EAX,[EBP-10]
016F:004018CC E8A33D3500 CALL 00755674
016F:004018D1 FF45E0 INC DWORD [EBP-20]
016F:004018D4 8D55F0 LEA EDX,[EBP-10]
016F:004018D7 8D45F8 LEA EAX,[EBP-08]
016F:004018DA E80D413500 CALL 007559EC
016F:004018DF 50 PUSH EAX
016F:004018E0 FF4DE0 DEC DWORD [EBP-20]
016F:004018E3 8D45F0 LEA EAX,[EBP-10]
016F:004018E6 BA02000000 MOV EDX,02
016F:004018EB E818403500 CALL 00755908
016F:004018F0 59 POP ECX
016F:004018F1 84C9 TEST CL,CL
016F:004018F3 7417 JZ 0040190C
016F:004018F5 33C0 XOR EAX,EAX
016F:004018F7 E820BB0100 CALL 0041D41C
016F:004018FC 84C0 TEST AL,AL
016F:004018FE 740C JZ 0040190C
016F:00401900 E8833B3500 CALL `SD3000!@Dogtestpro@WriteNewInfo$qqrv`
016F:00401905 C6050056890000 MOV BYTE [00895600],00
016F:0040190C 803D0056890000 CMP BYTE [00895600],00
016F:00401913 7452 JZ 00401967
016F:00401915 BADEC87500 MOV EDX,0075C8DE
016F:0040191A 8D45E8 LEA EAX,[EBP-18]
016F:0040191D E8523D3500 CALL 00755674
016F:00401922 FF45E0 INC DWORD [EBP-20]
016F:00401925 FF30 PUSH DWORD [EAX]
016F:00401927 66C745D43800 MOV WORD [EBP-2C],38
016F:0040192D BA23C97500 MOV EDX,0075C923
016F:00401932 8D45EC LEA EAX,[EBP-14]
016F:00401935 E83A3D3500 CALL 00755674
016F:0040193A FF45E0 INC DWORD [EBP-20]
016F:0040193D 8B00 MOV EAX,[EAX]
016F:0040193F 33C9 XOR ECX,ECX
016F:00401941 5A POP EDX
016F:00401942 E849E50100 CALL 0041FE90 //走到这儿。对话框跳出来了。
016F:00401947 FF4DE0 DEC DWORD [EBP-20]
016F:0040194A 8D45E8 LEA EAX,[EBP-18]
016F:0040194D BA02000000 MOV EDX,02
016F:00401952 E8B13F3500 CALL 00755908
016F:00401957 FF4DE0 DEC DWORD [EBP-20]
016F:0040195A 8D45EC LEA EAX,[EBP-14]
016F:0040195D BA02000000 MOV EDX,02
016F:00401962 E8A13F3500 CALL 00755908
016F:00401967 FF4DE0 DEC DWORD [EBP-20]
016F:0040196A 8D45F8 LEA EAX,[EBP-08]
016F:0040196D BA02000000 MOV EDX,02
.................

不知道，大家看了上面的代码，有什么感觉。给我的第一个感觉就是[00895600]地址有问题。眼睛尖的朋友会注意到，程序在很多地方都调用了[00895600]这个地址的数值。而且在[00895600]这个地址后面几乎都有比较、跳转指令。难道这个[00895600]这个地址真有问题？为了证明我的想法是正确的。这需要来通过调试来验证。
首先，看一下什么地方可以跳过016F:00401942 E849E50100 CALL 0041FE90 子程序。向上找发现最近一处在：

016F:0040190C 803D0056890000 CMP BYTE [00895600],00 //比较[00895600]和00的值
016F:00401913 7452 JZ 00401967 //改为jnz.

可以跳过016F:00401942 E849E50100 CALL 。

通过修改，程序在启动时。对话框不见了 ，但是在启动画面中还有“试用版”三个字。这是一个不错的现象哦！虽然，我跳过了对话框，可以估计软件其他地方还需要调用加密狗的标记，因为我是用强制手段跳过检查加密狗对话框的，所以还有“试用版”的文字。

在看看016F:0040190C 803D0056890000 CMP BYTE [00895600],00 是比较[00895600]和00的值.
实际上00895600＝1。同00不相等，用 E 命令强制把00895600＝1改为＝0。走到016F:00401913 7452 JZ 00401967 时自然就跳过016F:00401942 E849E50100 CALL处。按X键退出调试状态。通过以上修改，程序在启动时，不但对话框不不见了,连启动画面中的“试用版”三个字也不见了。如果我没有猜错的话，00895600=0应该是软件检查已经安装加密狗的标记。

下面我们来分析软件是如何加解密的过程吧。

第一步：锁住加密的软件。
...........
016F:0040183E C6050056890000 MOV BYTE [00895600],00 //将00传送008995600地址中。
016F:00401845 803D0056890000 CMP BYTE [00895600],00 //比较00和008995600的值。
016F:0040184C 0F852B010000 JNZ NEAR 0040197D //不相等就跳。
016F:00401852 C6050056890001 MOV BYTE [00895600],01 //将01传送008995600地址中。
. . . . 用狗锁住软件。
. . . .

第二步：调用子程序检查是否安装了加密狗。
016F:004018A2 E861403500 CALL 00755908 //检查狗。
016F:004018A7 59 POP ECX //出栈。
016F:004018A8 84C9 TEST CL,CL //CL是否等于1。<CL=1表示安装了狗>
016F:004018AA 7412 JZ 004018BE //没安狗，跳到004018BE。
016F:004018AC E83F373500 CALL `SD3000!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv` //看函数名就明白了吧。
016F:004018B1 84C0 TEST AL,AL //al是否等于1。<AL=1表示安装了狗>
016F:004018B3 7457 JZ 0040190C //没安狗，跳到0040190C。
016F:004018B5 C6050056890000 MOV BYTE [00895600],00 <<--把狗处于待解开的状态!!!
016F:004018BC EB4E JMP SHORT 0040190C //无条件跳到0040190C
. . . .
. . . .

第三步：解开狗。
016F:0040190C 803D0056890000 CMP BYTE [00895600],00 //比较00895600和00。
016F:00401913 7452 JZ 00401967 //00895600=0 就跳到00401967。
............. 好的! 狗被解开了

同过上面的调试和分析,我们只要使 [00895600] 的值等于 0 ，就可以把狗解开! 我改。

016F:004018A2 E861403500 CALL 00755908
016F:004018A7 59 POP ECX
016F:004018A8 84C9 TEST CL,CL
016F:004018AA 7412 JZ 004018BE <<--改为jnz
016F:004018AC E83F373500 CALL `SD3000!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
016F:004018B1 84C0 TEST AL,AL
016F:004018B3 7457 JZ 0040190C <<--改为jnz
016F:004018B5 C6050056890000 MOV BYTE [00895600],00 //将00传送008995600地址中
016F:004018BC EB4E JMP SHORT 0040190C

用UltraEdit打开Sd3000.exe
找到：74 12 E8 3F 37 35 00 84 C0 74 57
修改：75 -- -- -- -- -- -- -- -- 75 --

改了两个字节，就把加密狗给解开了。
现在给你的软件打上补丁,运行试试看!

正好应了牧童兄的话：“有些软件作者可是非常想信软件狗的保护能力，在软件中其它保护做得很少，甚至拦出错消息框就能解决问题。” 《速达3000 pro》就是这句话的真实写照。


如何保护自己的壳

 标 题:谈谈如何使用加壳保护自己的软件不被常用方法脱壳(2千字)
发信人:ljttt
时 间:2000-10-10 23:37:07
详细信息:
标题: 好哇！背后说我的坏话，认为我不知道就偷着乐。看我怎么清蒸红烧了你。哈哈，我拿惠泉啤酒，这会下手没意见了吧。大家来共享这道美味---红烧丁丁虾。

内容:
这会不脱了，也简单谈谈如何使用加壳保护自己的软件不被常用方法脱壳，正好借题发挥一下。

浅谈如何使用加壳保护自己的软件不被常用方法脱壳

作者： ljttt
写作日期： 2000-10-08

【前言】
一个好的加壳软件如何使用不当，同样会很容易被轻松脱壳。我也只是分析过寥寥几个加壳软件就在这里闭着眼睛说大话，一定会被高手耻笑。不过我文以交友，高手不耻，低手或者中手就和我做个朋友吧。^_^ 如果你因为使用我说的方法被人轻松脱壳，请不要怪我，因为我不过是个低手，很可能在思路中有个大漏勺的地方被高手抓住偷着乐。所以你还得开动你的聪明的大脑。想出更多好的方法。

1、利用DLL保护自己。
一般常用的（当然也是利害的）几种脱壳工具如BWW2000、ProcDump等都针对着EXE文件的脱壳有特效。但是对于DLL就方法不多了。由于跟踪DLL不如EXE方便。而且找Entry Point在没有BWW2000的帮助下只有手动跟踪分析，对于反跟踪保护强的加壳软件来说，陷阱重重。对于只会使用工具的脱壳初手来说，哈哈.....
把你的程序中的重要代码放在DLL中。然后把EXE和DLL文件分别用一种加壳软件进行保护。这样，必须有脱掉两种壳的能力才能......。
当然，在选择加壳软件时不一定要选择最新最强的加壳软件，因为这些太新的软件开始只是没有人研究它，一旦过些时候就会被人写个脱壳机之类的，可就惨了。找些不起眼的，版本旧但功能不弱且没有脱壳机的加壳软件，反而会更有利。

2、连体婴儿保护。
知道Aramillo保护的人一定知道它保护自己的方法：他提供的主程序文件是个被保护了的只有LOAD功能的文件，真正的主程序文件在临时产生的文件中。这种思路不是一个坏主意，我们来强化一下保护强度，如果把LOAD文件和临时产生的文件（真正的主程序文件）分别用一种加壳软件进行保护，先初步强化一下，然后，如果在编程时加入进程间通讯，使得LOAD文件和临时产生的文件必须同时运行才行，否则执行出错，同时在编程时加入对对方的CRC保护机制，那么会怎么样，防止别人单独DUMP文件，然后脱壳。哈哈.......。
当然，在选择加壳软件时要找个没有脱壳机的加壳软件或者不大可能写出脱壳机的加壳软件。

3、高手的方法
如果你有实力自己写个加壳软件，那么我所写的对你来说不过是个小儿科。不过，由于一般的人自己写出的加壳软件反跟踪保护功能不强，所以还得再使用一种加壳软件加强保护。如果把你的加壳保护和主程序编程在设计时进行统一设计，使得脱壳后无法正常执行，那么，你的程序就象"丁丁虾的外套"-----脱了壳就活不了。^_^

【后记】
想了解更强的保护......你可以找丁丁虾，据说他的大螯和盔甲十分得厉害，要脱他的壳，必须拿惠泉啤酒才行。哈哈......
这一篇纯粹是信口胡说，借题发挥一下。如果思路有雷同或者剽窃之嫌，那么，你大可以骂我三百句..............唐诗。


对一种加密保护的思想的一点分析

 标 题:对一种加密保护的思想的一点分析..... (1千字)
发信人:ljtt
时 间:2001-5-11 22:59:40
详细信息:
对一种加密保护的思想的一点分析.....

【声明】
我写文章以交流为主，希望大家在转载时能保持文章的完整性。

作者： ljtt
写作日期： 2001-05-08

【前言】
有段时间没有写东东，主要是肚子空空如也，没有什么可写的了，这会只好又拿点葫萝卜加白菜的方法，凑合着向大家推销点东西了。
不巧的是今天正好赶上"欢乐时光"，希望不会在我写到最后来个什么惊.....

【分析对象】一类共享软件的保护机制

此共享软件的合法使用方式：电子注册，一机一码，付钱给码。

保护方法：

1、把用户输入的注册码和用户名进行变换得到一个解密数据的KEY。

2、对加密的数据用KEY进行解密。

3、对解密后的数据进行CRC检验，如果检验值正确，则提示注册成功，并"打开"被禁止(或保护)的功能。
以后用户就可以合法使用软件了。

暗藏机关：

现在得说一说这些加密的数据了。:-) 那些加密的数据是被禁止(或保护)的功能要使用到的一些关键数据。

此保护方法优点：

可对付某些形式的暴破。如果只修改跳转方向并不能得到真正解密的数据，而这些数据由于还要在被禁止(或保护)的功能中用到。
如果是KEY不正确，还原出一堆垃圾，那么会在功能使用中出现一些奇异的错误。:-)

此保护方法缺点：

1、如果有一合法用户泄密了KEY，则整个保护体系崩溃。:-)

2、如果加密的数据有明显的特征，则KEY可能会被推测出来。

3、如果加密/解密算法设计不当，也会出问题。

4、好象有已经针对CRC检验的一些破解办法，所以这里说到的CRC检验只是代表类似这样一种检验方法而已，具体用怎样的检验算法还得小心。

这主要是说明这种保护思路中的说明的重要一点就是不要进行明码比较，加密算法使用得再好，如果最后进行直接明码比较，就功亏一溃。
这种方法主要是针对此薄弱点进行的一种探讨。当然要改进之处也很多了。更多的保护方法还是你来吧，我只有三脚猫的功底，说多了就漏了。:-) 当然我想你至少会把这种方式进行迭加，弄它十个几十个解密/CRC检验方式。当然最后的保护效果如何，还是请暴破工程队来说说吧。

【后记】
当然我相信你知道更多更好的加密思想，如果你希望别人和你分享其中思想的闪光点，那么不妨说说吧。当然你也可以给我写信悄悄地告诉我，我猜这大概你已经用在自己编写的软件上了吧。:-)


KV3XXX

 标 题:KV3XXX解密过程 By: CHINA 2000.10.28 (3千字)
发信人:1212
时 间:2000-10-29 16:46:44
详细信息:
KV3XXX解密过程
CHINA 2000.10.28
(转载请保持完整！不要将我的名字替换成你的！！！)

在WIND兄放上KV3XXXX的光盘文件后，发现我不能再用它了。
虽然我是一个KV300+的正版用户，但我没用过几次（我怕，每次
运行时软盘在沙沙的响，万一坏了怎么办，花钱去更新？要20元
钱！还要时间... :-< ）而这次KV3XXXX更是将我们这些老用户都
抛弃了！怎么办，有了KV3XXXX的光盘文件就好办了。
（由于众所周知的原因，在此不提供下载地址请自行查找。）
首先，运行setup.exe,点[KVW3000]，软驱灯亮了一下，弹出
一个对话框。提示“请在 A 驱动器中插入 KV3000 加密盘”
有门！就下了一个MESSAGEBOXA，点[继续]，程序中断。我们来看
一下：0167:004018D6 83F804 //程序返回
我们完整地来看看：
0167:004018B4 56 PUSH ESI
0167:004018B5 E866FFFFFF CALL 00401820 //进行判断软驱中有无盘，各位将它用9090909090代替会如何？Ha,Ha,Ha...
0167:004018BA 83C414 ADD ESP,BYTE +14
0167:004018BD 85C0 TEST EAX,EAX
0167:004018BF 7528 JNZ 004018E9 //有盘就跳，无盘就...
0167:004018C1 8B3D90534100 MOV EDI,[00415390]
0167:004018C7 6A25 PUSH BYTE +25
0167:004018C9 8D442418 LEA EAX,[ESP+18]
0167:004018CD 6844A14100 PUSH DWORD 0041A144
0167:004018D2 50 PUSH EAX
0167:004018D3 56 PUSH ESI
0167:004018D4 FFD7 CALL EDI //弹出那个对话框
0167:004018D6 83F804 CMP EAX,BYTE +04
0167:004018D9 751F JNZ 004018FA //是否退出
0167:004018DB 55 PUSH EBP
0167:004018DC 56 PUSH ESI
0167:004018DD E83EFFFFFF CALL 00401820 //进行判断软驱中有无盘
0167:004018E2 83C408 ADD ESP,BYTE +08
0167:004018E5 85C0 TEST EAX,EAX
0167:004018E7 74DE JZ 004018C7 //无盘就返回继续比较，有盘就OK了！
0167:004018E9 5F POP EDI
通过这关后，程序又开始读软驱，这回可没有提示框了。我们就来
看看KVW3000.Exe这个安装程序吧。
程序自动结束，就下BPX ExitProcess吧，中断是中断了，可程序也
完成了。没什么戏，这个程序是安装的，可能会...
对了用BPX GetTempPathA，这回运气不错，没有读盘就中断了。
0167:0040208D 6800010000 PUSH DWORD 0100
0167:00402092 FF1514814100 CALL `KERNEL32!GetTempPathA`
0167:00402098 8D4C2410 LEA ECX,[ESP+10] //来到这里
0167:0040209C 8D942420010000 LEA EDX,[ESP+0120]
0167:004020A3 51 PUSH ECX
0167:004020A4 6A00 PUSH BYTE +00
0167:004020A6 68D8A34100 PUSH DWORD 0041A3D8
0167:004020AB 52 PUSH EDX
0167:004020AC FF15C4804100 CALL `KERNEL32!GetTempFileNameA`
0167:004020B2 8D442410 LEA EAX,[ESP+10]
0167:004020B6 686CA44100 PUSH DWORD 0041A46C
......
0167:004020E9 7412 JZ 004020FD
0167:004020EB E8901F0000 CALL 00404080
0167:004020F0 85C0 TEST EAX,EAX
0167:004020F2 751A JNZ 0040210E
0167:004020F4 A168C34100 MOV EAX,[0041C368]
0167:004020F9 85C0 TEST EAX,EAX
0167:004020FB 757C JNZ 00402179
0167:004020FD 8D442410 LEA EAX,[ESP+10]
0167:00402101 50 PUSH EAX
0167:00402102 E8A9FAFFFF CALL 00401BB0 //这是这个CALL要读盘，各位将它用9090909090代替会如何？Ha,Ha,Ha...
0167:00402107 83C404 ADD ESP,BYTE +04
0167:0040210A 85C0 TEST EAX,EAX
0167:0040210C 746B JZ 00402179
0167:0040210E 8D4C2410 LEA ECX,[ESP+10]
0167:00402112 686CA44100 PUSH DWORD 0041A46C
以上完成后，就可以自己偷着乐了。不好，忘了一件事，就是这两个程序
都是用UPX 1.01压缩过的，要用UPX -d XXXX.exe来解压才能进行除BIG。

[本文献给支持我的朋友以及中国的CRACK们.2000]


LOCK98

 标 题:转载 (1千字)
发信人:sunjoin
时 间:2001-6-3 22:39:51
详细信息:
实 战 演 练

LOCK98
LOCK98是由微宏电脑软件研究所开发,号称国内第一套基于Windows 32位操作系统软
件加密工具.据其介绍: 它可以对抗一切拷贝机和拷贝软件.事实的确如此,反正我用
SCS(4.0i),KING-COPY2000(pro)都没复制成功.这才激发了我对它的兴趣.现在,让我
们来看看它的庐山真面目吧!

首先,运行ANDISK分析它KEY盘的79道1面,这里有四个特殊扇区: 79,1,19,02 79,1,
50,02 E xxx,xxx,xxx,(xx) xxx,xxx,xxx(xx) 不用说了问题就在这四个扇区中!
其中,E 代表有CRC错误, xxx 代表其数值为随机, 根据以往的经验,我认为: 79,1,50
02 E 这个扇区的嫌疑最大,先分析它!用ANDISK读出它的内容: 前面128个相同的字节
是随机的,后面两个字节不用管,在后面的9个字节为缓冲,这很重要!再后面的12个00
和3个a1,1个FE不用管下面就是最精彩的了.

看到fe后这四个字节了吧,这是十六进制的,把它换成十进制看看.对了,它就是最后一个
扇区的ID.以此类推,下面还有一个是挨着它的那个扇区的ID. 好了,分析完了! 最后就是
格式化了.
将0000:0525设为0, 0000:0526设为3, 0000:0529设为9, 0000:052a设为您所读到的那
128个相同的字节,注意为十六进制! 磁盘的ID您只需设置最后这79,1,50,02 E XXX,XXX
XXX,(XX) XXX,XXX,XXX,(XX)三个即可.X的值以您读到的为准.您若不会编写格式化程序
就用SCS格吧!您只需设好参数!
OK!! LOCK98搞定了,就这么简单,真没意思!! 下一个目标是谁? SCS的安装盘或锁王吧 :)

此篇文章转载自影子的传说 http://shadowcool.netfirms.com


VRV2000 9.E

标 题:转载一篇破解教程（vrv2000) 作者：飞刀浪子 (14千字)
发信人:duba.126.com
时 间:2001-3-29 12:42:01
详细信息:
嗨，大家好，我是飞刀浪子。“什么飞刀浪子，听都没听说过。”我~!@#$#$#$#$$%&^&**&^$倒，(一个小时后)从桌下爬起。
好，听好了，我乃中原人士，今年该21了，进的时男卫生间。好，废话少说，切入正题！今天我讲的是VRV2000 9.E(2000.11.22)版破解全攻略.
作案工具：TR ,HIEW 先用TR 载VRV2000 BPINT 13 AH=2 . .
2779:30F7 80E1C0 AND CL,C0
2779:30FA 024E0E ADD CL,[BP+000E]
2779:30FD 8A6E0C MOV CH,[BP+000C]
2779:3100 8A760A MOV DH,[BP+000A]
2779:3103 8A5608 MOV DL,[BP+0008]
2779:3106 CD13 INT 13 ；在此处拦下 CX=5011，DX=0100
2779:3108 807E0608 CMP [BYTE BP+0006],08
2779:310C 750A JNE 3118
2779:310E C45E12 LES BX,[BP+0012]
2779:3111 26890F MOV [ES:BX],CX
2779:3114 26895702 MOV [ES:BX+0002],DX
2779:3118 8AC4 MOV AL,AH ；!注
2779:311A B400 MOV AH,00 ；!意
2779:311C 5D POP BP
2779:311D CB RETF ；返回
3616:1612 6A02 PUSH 02
3616:1614 9AE4307927 CALL FAR 2779:30E4 ；读盘过程,读1面50H道11H扇区
3616:1619 83C410 ADD SP,10 ；返回到此
3616:161C 0BC0 OR AX,AX ；必须为0，因它为额外的正常扇区
3616:161E 7520 JNE 1640
3616:1620 1E PUSH DS
3616:1621 6818B8 PUSH B818
3616:1624 6A01 PUSH 01
3616:1626 6A12 PUSH 12
3616:1628 6A50 PUSH 50
3616:162A 6A01 PUSH 01
3616:162C 6A00 PUSH 00
3616:162E 6A02 PUSH 02
3616:1630 9AE4307927 CALL FAR 2779:30E4 ；读盘过程,读1面50H道12H扇区
3616:1635 83C410 ADD SP,10
3616:1638 0BC0 OR AX,AX ;此扇区为坏区或没有，所以应该不为0
3616:163A 7404 JE 1640
3616:163C B001 MOV AL,01 ;此处将AL=1 就OK了
3616:163E EB08 JMP 1648
3616:1640 46 INC SI
3616:1641 83FE02 CMP SI,02
3616:1644 7CBE JL 1604
3616:1646 B000 MOV AL,00
3616:1648 5E POP SI
3616:1649 CB RETF .
.避开此两处判断点，就OK 了。不过，VRV会说内存不够，这一次它说的是真的。好，我们搜索代码，咦，找不到，看来被压过了。
UNP 试试看，还是不行。那就手脱吧。 TR载入VRV2000 EXE1 RELOAD BPREG G G
；此时出现 MOV DX，XXXX
； MOV [CS：0291]，DX
； MOV AH，30 ； INT 21
WEXE1 EXE2 RELOAD G ；直到刚才哪个地方 WEXE2 Q MAKEXE
好了，当前目录下就有了一个MEM.EXE的程序，找到刚才的判断点改掉，就OK了。不行，不行，怎么用了第一次就不能用第二次，原来它还回写了自己。
再次TR 设BPINT 21 AH=3D 通过堆栈 STACK 看它是什么地方 CALL 此处，有好几个耶，一个一个 U 看看，
分析一下前后代码，可疑就把这个 CALL 干掉试试看（最好是用JMP 飞过去，但注意平衡堆栈）。
（通过STACK 看堆栈有时是很有用的，早期的VRV 追到后面的INT 13 会死机，我就是通过堆栈来解的）
另外，若用PKLITE将解压过后的程序压一偏也可以不用改。下面我们讲一下用DEBUG脱壳，虽然有些烦，但可以增加功力啦。DEBUG VRV2000.EXE-U
3D96:001C FC CLD
3D96:001D 2E806C1310 SUB [BYTE CS:SI+0013],10
3D96:0022 73E8 JAE 000C
3D96:0024 6619ED SBB EBP,EBP
3D96:0027 AF SCASW
3D96:0028 AD LODSW
3D96:0029 0E PUSH CS
3D96:002A 0E PUSH CS
3D96:002B 0E PUSH CS
3D96:002C 06 PUSH ES
3D96:002D 1F POP DS
3D96:002E 07 POP ES
3D96:002F 16 PUSH SS
3D96:0030 680500 PUSH 0005
3D96:0033 6631DB XOR EBX,EBX
3D96:0036 CB RETF-G36-T-P912E:0004 A4 MOVSB
912E:0005 E86D00 CALL 0075 ;解码过程
912E:0008 72FA JB 0004 ;循环
912E:000A 6631C0 XOR EAX,EAX
912E:000D 40 INC AX
912E:000E E86400 CALL 0075
912E:0011 6611C0 ADC EAX,EAX
912E:0014 E85E00 CALL 0075
912E:0017 73F5 JAE 000E
912E:0019 6683E803 SUB EAX,03
912E:001D 720D JB 002C
912E:001F 66C1E008 SHL EAX,08
912E:0023 AC LODSB
912E:0024 6683F0FF XOR EAX,-01
912E:0028 7469 JE 0093
912E:002A 6695 XCHG EAX,EBP
912E:002C E84100 CALL 0070
912E:002F 11C9 ADC CX,CX
912E:0031 7508 JNE 003B
912E:0033 41 INC CX
912E:0034 E83900 CALL 0070
912E:0037 73FB JAE 0034
912E:0039 41 INC CX
912E:003A 41 INC CX
912E:003B 6681FD00F3FFFF CMP EBP,FFFFF300
912E:0042 81D10100 ADC CX,0001
912E:0046 89FA MOV DX,DI
912E:0048 8CC0 MOV AX,ES
912E:004A C1EA04 SHR DX,04
912E:004D 83E70F AND DI,0F
912E:0050 01D0 ADD AX,DX
912E:0052 1E PUSH DS
912E:0053 8EC0 MOV ES,AX
912E:0055 56 PUSH SI
912E:0056 66C1E004 SHL EAX,04
912E:005A 01F8 ADD AX,DI
912E:005C 6601E8 ADD EAX,EBP
912E:005F 89C6 MOV SI,AX
912E:0061 66C1E804 SHR EAX,04
912E:0065 83E60F AND SI,0F
912E:0068 8ED8 MOV DS,AX
912E:006A F3 REPZ
912E:006B A4 MOVSB
912E:006C 5E POP SI
912E:006D 1F POP DS
912E:006E EB95 JMP 0005 ;继续循环
912E:0070 E80200 CALL 0075
912E:0073 11C9 ADC CX,CX
912E:0075 6601DB ADD EBX,EBX
912E:0078 7518 JNE 0092
912E:007A B7B0 MOV BH,B0
912E:007C 39DE CMP SI,BX
912E:007E 7609 JBE 0089
912E:0080 29DE SUB SI,BX
912E:0082 8CDB MOV BX,DS
912E:0084 80C70B ADD BH,0B
912E:0087 8EDB MOV DS,BX
912E:0089 668B1C MOV EBX,[SI]
912E:008C 83EEFC SUB SI,-04
912E:008F 6611DB ADC EBX,EBX
912E:0092 C3 RET
912E:0093 59 POP CX
912E:0094 8CC0 MOV AX,ES ;!!!!(ES-CX) SHL 4 + DI=文件长 设为X
912E:0096 80EC04 SUB AH,04
912E:0099 8ED8 MOV DS,AX
912E:009B 2BBDFE3F SUB DI,[DI+3FFE]
912E:009F 8DB50040 LEA SI,[DI+4000]
912E:00A3 5D POP BP ;!!!BP值指向了程序的起始段
912E:00A4 31DB XOR BX,BX
912E:00A6 8EC1 MOV ES,CX
912E:00A8 AC LODSB ; !!!重定位开始
912E:00A9 25FF00 AND AX,00FF
912E:00AC 7405 JE 00B3
912E:00AE 3CEF CMP AL,EF
912E:00B0 7710 JA 00C2
912E:00B2 A8AD TEST AL,AD
912E:00B4 01C3 ADD BX,AX
912E:00B6 7305 JAE 00BD
912E:00B8 80C510 ADD CH,10
912E:00BB 8EC1 MOV ES,CX ；!!!
912E:00BD 26012F ADD [ES:BX],BP ;!!重定位
912E:00C0 EBE6 JMP 00A8
912E:00C2 88C4 MOV AH,AL
912E:00C4 AC LODSB
912E:00C5 25FF0F AND AX,0FFF
912E:00C8 75EA JNE 00B4
912E:00CA AD LODSW
912E:00CB 01C1 ADD CX,AX
912E:00CD 73D5 JAE 00A4
912E:00CF 07 POP ES
912E:00D0 AD LODSW ;取原SP ，记下AX等一下会用到。
912E:00D1 012C ADD [SI],BP ;定位SS,记下SI的值
912E:00D3 8E14 MOV SS,[SI]
912E:00D5 94 XCHG AX,SP
912E:00D6 06 PUSH ES
912E:00D7 1F POP DS
912E:00D8 EA0000963D JMP FAR 3D96:0000 ;解码完毕,进入程序-gd8-t-nvrv.dat-RBX
X 的高位 ---->X 看前面RCXX 的低位WCS:0 ；回写程序的执行代码Q;下面写重定位数据DEBUG VRV2000.EXE-G36-T
-GA8-R DI ;将DI指向一个不影响我们工作的任意地址500-FES:500 L 1000 FF ;为了方便找最后一个重定位
；将BB处的两字节NOP掉，将BD处的三字节改为CALL 200 然后在200处写我们的指令。-A200 MOV AX,BX STOSW
MOV AX,CX SUB AX,BP ;BP值指向了程序的起始段 STOSW RET-G D8
;搜索ES:500后什么地方出现连续的FF,找到的第一个FF的地址-500 假设结果为 Y
；将 Y/4 的结果记下，等一下要用。-NRELOCAL.DAT-RCXY ;若Y不是16的整倍数，将它补为16的整倍数。-RBX0
-WES:500 ;写RELOCAL.DAT-N HEADER.DAT-FDS:100 L 20 0-RCX -20
-WDS:100 ;写HEADER.DAT-QCOPY /B HEADER.DAT+RELOCAL.DAT+VRV.DAT VRV.EXE
此时，我们已经得到了一个程序，但他还不能执行，下面修补档头，用HIEW打开
4D 5A XX XX XX XX XX XX XX XX 00 00 FF FF XX XX XX XX
---- ---- ---- ---- ---- ----
|_____|_____|_____|_________________|_____|___________VRV.EXE 的长度除以200H的余数
|_____|_____|_________________|_____|___________商，若余数不为0，还应再加1
|_____|_________________|_____|___________刚才Y/4的结果
|_________________|_____|___________(HEADER.DAT+RELOCAL.DAT)长度/10H
|_____|___________刚才记的SS值
|___________刚才记的SP值
00 00 XX XX 00 00 20 00 00 00 00 00 00 00 -----
|________HEADER.DAT+RELOCAL.DAT 的长度注:上面都是十六进制，且是字方式，所以请注意存储的反向问题。
好了，大功告成，亲个嘴儿。注：若我们将任意盘格式化一个正常的1面50H道11H扇区，就可以做它的加密盘。
若有原版加密盘，可将其所读资料写入我们自做的加密盘中，这样更好。 不过，我解的加密盘都没有原盘，所以只有这样啦。
飞刀浪子 留


KV3000密钥盘源程序

 标 题:我学软盘加解密时也用这本书，这是我的学有所用KV3000密钥盘源程序
发信人:小牧童
时 间:2000-12-9 16:52:49
详细信息:
.MODEL LARGE
STACK SEGMENT PARA STACK 'STACK'
DW 128 DUP(?)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'

PA70_0 DB 46h,0,50,08;70道0面
DB 46h,0,245,08
DB 46h,0,110,08
DB 46h,0,64,08
DB 46h,0,87,08

PA70_1 DB 46h,1,13,08;70道1面
DB 46h,1,37,08
DB 46h,1,206,08
DB 46h,1,169,08
DB 46h,1,162,08

PA71_0 DB 47h,0,231,6
DB 47h,0,44,6;71道0面

PA71_1 DB 47h,1,198,6
DB 47h,1,192,6;71道1面

PA72_0 DB 48h,0,51,4;72道0面
DB 48h,0,118,6
DB 48h,0,147,6
DB 48h,0,223,06h
DB 48h,0,102,6

PA72_1 DB 48h,1,117,6
DB 48h,1,111,6;72道1面

PA73_0 DB 49h,0,44,4
DB 49h,0,172,6
DB 49h,0,86,6
DB 49h,0,103,6
DB 49h,0,190,6

PA73_1 DB 49h,1,77,6
DB 49h,1,179,6

PA74_0 DB 4ah,0,67,6
DB 4ah,0,107,6

PA74_1 DB 4ah,1,39,6
DB 4ah,1,61,6

PA75_0 DB 4bh,0,22,6
DB 4bh,0,18,6

PA75_1 DB 4bh,1,115,6
DB 4bh,1,86,6

PA76_0 DB 4ch,0,102,6
DB 4ch,0,52,6

PA76_1 DB 4ch,1,99,6
DB 4ch,1,244,6

PA77_0 DB 4dh,0,25,6
DB 4dh,0,101,5
DB 4dh,0,138,6
DB 4dh,0,83,6
DB 4dh,0,53,6

PA77_1 DB 4dh,1,3,6
DB 4dh,1,117,6

PA78_0 DB 4eh,0,133,7
DB 4eh,0,146,6
DB 4eh,0,254,4
DB 4eh,0,252,6
DB 4eh,0,156,6

PA78_1 DB 4eh,1,56,06
DB 4eh,1,199,6

PA79_0 DB 4Fh,0,126,6
DB 4Fh,0,100,6

PA79_1 DB 4fh,1,31,04
DB 4fh,1,145,06
DB 4fh,1,166,08
DB 4fh,1,104,06
DB 4fh,1,201,6

PA80_0 DB 50h,0,19,08
DB 50h,0,125,06
DB 50h,0,133,06
DB 50h,0,56,05
DB 50h,0,247,06h

PA80_1 DB 50h,1,101,6
DB 50h,1,248,6

f710 db 'k71044.fin',0
f711 db 'k711192.fin',0
f721 db 'k721111.fin',0
f731 db 'k731179.fin',0
f740 db 'k740107.fin',0
f741 db 'k74161.fin',0
f750 db 'k75018.fin',0
f751 db 'k75186.fin',0
f760 db 'k76052.fin',0
f761 db 'k761244.fin',0
f771 db 'k771117.fin',0
f781 db 'k781199.fin',0
f790 db 'k790100.fin',0
f801 db 'k801248.fin',0

DISP1 DB 'Failure!',0ah,0dh,24h
DISP2 DB 'Success!',0ah,0dh,24h
DISP3 DB 'Making KV3000 Key Disk!',0AH,0DH,24H
DISP4 DB 'CRACKED by ZHUXIAOHUA 2000.11.18',0AH,0DH,24H
DISP5 DB 'TRY A BUG',0AH,0DH,24H
DISP6 DB 'Insert a disk in drive A: press any key to continue!',0ah,0dh,24h
DISP7 DB 'E-mail:zhuxiaohua@126.com', 0ah,0dh,24h
READ_ERR DB 'Can not open fin file or file not exist!',0AH,0DH,24H
DISP700 DB 'Track 70 side 0 made OK',0AH,0DH,24H
DISP701 DB 'Track 70 side 1 made OK',0ah,0dh,24h
DISP710 DB 'Track 71 side 0 made OK',0AH,0DH,24H
DISP711 DB 'Track 71 side 1 made OK',0ah,0dh,24h
DISP720 DB 'Track 72 side 0 made OK',0ah,0dh,24h
DISP721 DB 'Track 72 side 1 made OK',0AH,0DH,24H
DISP730 DB 'Track 73 side 0 made OK',0AH,0DH,24H
DISP731 DB 'Track 73 side 1 made OK',0ah,0dh,24h
DISP740 DB 'Track 74 side 0 made OK',0ah,0dh,24h
DISP741 DB 'Track 74 side 1 made OK',0ah,0dh,24h
DISP750 DB 'Track 75 side 0 made OK',0ah,0dh,24h
DISP751 DB 'Track 75 side 1 made OK',0AH,0DH,24H
DISP760 DB 'Track 76 side 0 made OK',0ah,0dh,24h
DISP761 DB 'Track 76 side 1 made OK',0AH,0DH,24H
DISP770 DB 'Track 77 side 0 made OK',0AH,0DH,24H
DISP771 DB 'Track 77 side 1 made OK',0ah,0dh,24h
DISP780 DB 'Track 78 side 0 made OK',0AH,0DH,24H
DISP781 DB 'Track 78 side 1 made OK',0ah,0dh,24h
DISP790 DB 'Track 79 side 0 made OK',0ah,0dh,24h
DISP791 DB 'Track 79 side 1 made OK',0ah,0dh,24h
DISP800 DB 'Track 80 side 0 made OK',0ah,0dh,24h
DISP801 DB 'Track 80 side 1 made OK',0ah,0dh,24h

DISP710W DB 'Track 71 side 0 Write OK',0AH,0DH,24H
DISP711W DB 'Track 71 side 1 Write OK',0ah,0dh,24h
DISP721W DB 'Track 72 side 1 Write OK',0AH,0DH,24H
DISP731W DB 'Track 73 side 1 Write OK',0ah,0dh,24h
DISP740W DB 'Track 74 side 0 Write OK',0ah,0dh,24h
DISP741W DB 'Track 74 side 1 Write OK',0ah,0dh,24h
DISP750W DB 'Track 75 side 0 Write OK',0ah,0dh,24h
DISP751W DB 'Track 75 side 1 Write OK',0AH,0DH,24H
DISP760W DB 'Track 76 side 0 Write OK',0ah,0dh,24h
DISP761W DB 'Track 76 side 1 Write OK',0AH,0DH,24H
DISP770W DB 'Track 77 side 0 Write OK',0AH,0DH,24H
DISP771W DB 'Track 77 side 1 Write OK',0ah,0dh,24h
DISP780W DB 'Track 78 side 0 Write OK',0AH,0DH,24H
DISP781W DB 'Track 78 side 1 Write OK',0ah,0dh,24h
DISP790W DB 'Track 79 side 0 Write OK',0ah,0dh,24h
DISP791W DB 'Track 79 side 1 Write OK',0ah,0dh,24h
DISP800W DB 'Track 80 side 0 Write OK',0ah,0dh,24h
DISP801W DB 'Track 80 side 1 Write OK',0ah,0dh,24h

ERR DB 00;格式化或写盘成功标志01成功00失败
DATA_CX DW 0000H;格式化磁盘磁道号临时存区CX
DATA_BX DW 0000H;
DATA_FILE DB 8192 DUP(0)
DATA ENDS

CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,DISP3
MOV AH,09H
INT 21H
LEA DX,DISP4
INT 21H
LEA DX,DISP6
INT 21H

MOV AH,0
INT 16H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4600H;开始格式化70道0面
LEA BX,DATA_CX
MOV ES:[BX],AX
MOV DX,0;0面
LEA AX,PA70_0
LEA BX,DATA_BX
MOV ES:[BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R700
JMP FAIL
R700: LEA DX,DISP700
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4600H;开始格式化70道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA70_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R701
JMP FAIL
R701:LEA DX,DISP701
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4700H;开始格式化71道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA71_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R710
JMP FAIL
R710:LEA DX,DISP710
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4700H;开始格式化71道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA71_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R711
JMP FAIL
R711:LEA DX,DISP711
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4800H;开始格式化72道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA72_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R720
JMP FAIL
R720:LEA DX,DISP720
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4800H;开始格式化72道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA72_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R721
JMP FAIL
R721:LEA DX,DISP721
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4900H;开始格式化73道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA73_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R730
JMP FAIL
R730:LEA DX,DISP730
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4900H;开始格式化73道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA73_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R731
JMP FAIL
R731:LEA DX,DISP731
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4a00H;开始格式化74道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA74_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R740
JMP FAIL
R740:LEA DX,DISP740
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,04BH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4a00H;开始格式化74道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA74_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R741
JMP FAIL
R741:LEA DX,DISP741
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4b00H;开始格式化75道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA75_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R750
JMP FAIL
R750:LEA DX,DISP750
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES

MOV AX,4b00H;开始格式化75道1面
LEA BX,DATA_CX
MOV es:[BX],AX
MOV DX,0100h;1面
LEA AX,PA75_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,es:[BX]
CMP AX,00
JZ R751
JMP FAIL
R751:LEA DX,DISP751
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4c00H;开始格式化76道0面
LEA BX,DATA_CX
MOV es:[BX],AX
MOV DX,0;0面
LEA AX,PA76_0
LEA BX,DATA_BX
MOV es:[BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,es:[BX]
CMP AX,00
JZ R760
JMP FAIL
R760:LEA DX,DISP760
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4c00H;开始格式化76道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA76_1
LEA BX,DATA_BX
MOV es:[BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R761
JMP FAIL
R761:LEA DX,DISP761
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4d00H;开始格式化77道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA77_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R770
JMP FAIL
R770:LEA DX,DISP770
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4d00H;开始格式化77道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA77_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R771
JMP FAIL
R771:LEA DX,DISP771
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4e00H;开始格式化78道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA78_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R780
JMP FAIL
R780:LEA DX,DISP780

MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4e00H;开始格式化78道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA78_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R781
JMP FAIL
R781:LEA DX,DISP781
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4f00H;开始格式化79道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA79_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R790
JMP FAIL
R790:LEA DX,DISP790
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,4f00H;开始格式化79道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA79_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R791
JMP FAIL
R791:LEA DX,DISP791;开始格式化80道0面
MOV AH,09H
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,05;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,5000H;开始格式化80道0面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0;0面
LEA AX,PA80_0
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R800
JMP FAIL
R800:LEA DX,DISP800
MOV AH,09H
INT 21H
PUSH ES;开始格式化80道1面
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,04
MOV ES:[BX+3],AL;扇区大小
MOV AL,02;每道格式化扇区数
MOV ES:[BX+4],AL
MOV AL,54H;扇区间隙正常为54h
MOV ES:[BX+7],AL
MOV AL,06fH;充填字节，正常为F6H
MOV ES:[BX+8],AL

POP ES
MOV AX,5000H;开始格式化80道1面
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,PA80_1
LEA BX,DATA_BX
MOV [BX],AX
CALL FORMATS
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ R801
JMP FAIL
R801:LEA DX,DISP801
MOV AH,09H
INT 21H

LEA DX,F710;读71道0面44扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,472cH;写71道0面44扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0000h;0面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W710
JMP FAIL
W710:LEA DX,DISP710W
MOV AH,09H
INT 21H

;读71道1面192扇区指纹文件
LEA DX,F711
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,47c0H;写71道1面192扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W711
JMP FAIL
W711:LEA DX,DISP711W
MOV AH,09H
INT 21H

LEA DX,F721;读72道1面111扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,486fH;写72道1面111扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;0面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W721
JMP FAIL
W721:LEA DX,DISP721W
MOV AH,09H
INT 21H

LEA DX,F731;读73道1面179扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,49b3H;写73道1面179扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W731
JMP FAIL
W731:LEA DX,DISP731W
MOV AH,09H
INT 21H

LEA DX,F740;读74道0面107扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4a6bH;写74道0面107扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0000h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W740
JMP FAIL
W740:LEA DX,DISP740W
MOV AH,09H
INT 21H

LEA DX,F741;读74道1面61扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4a3dH;写74道1面61扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W741
JMP FAIL
W741:LEA DX,DISP741W
MOV AH,09H
INT 21H

LEA DX,F750;读75道0面18扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4b12H;写74道0面107扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0000h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W750
JMP FAIL
W750:LEA DX,DISP750W
MOV AH,09H
INT 21H

LEA DX,F751;读75道1面86扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4b56H;写75道1面86扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W751
JMP FAIL
W751:LEA DX,DISP751W
MOV AH,09H
INT 21H

LEA DX,F760;读76道0面34扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4c34H;写74道0面107扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0000h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W760
JMP FAIL
W760:LEA DX,DISP760W
MOV AH,09H
INT 21H

LEA DX,F761;读76道1面244扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4cf4H;写76道1面244扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W761
JMP FAIL
W761:LEA DX,DISP761W
MOV AH,09H
INT 21H

LEA DX,F771;读77道1面117扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4d75H;写77道1面117扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W771
JMP FAIL
W771:LEA DX,DISP771W
MOV AH,09H
INT 21H

LEA DX,F781;读78道1面119扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4ec7H;写78道1面119扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W781
JMP FAIL
W781:LEA DX,DISP781W
MOV AH,09H
INT 21H

LEA DX,F790;读79道0面100扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,4f64H;写70道0面100扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,000h;0面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W790
JMP FAIL
W790:LEA DX,DISP790W
MOV AH,09H
INT 21H

LEA DX,F801;读80道1面248扇区指纹文件
CALL READFILE
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,06
MOV ES:[BX+3],AL;扇区大小
MOV ES:[BX+8],AL
POP ES
MOV AX,50f8H;写80道1面248扇区
LEA BX,DATA_CX
MOV [BX],AX
MOV DX,0100h;1面
LEA AX,DATA_FILE
LEA BX,DATA_BX
MOV [BX],AX
CALL WRITES
LEA BX,ERR;判断是否出错
MOV AX,[BX]
CMP AX,00
JZ W801
JMP FAIL
W801:LEA DX,DISP801W
MOV AH,09H
INT 21H

JMP EXIT

FAIL:LEA DX,DISP1
MOV AH,09H
INT 21H
LEA DX,DISP7
INT 21H

JMP EXIT1
EXIT:LEA DX,DISP2
MOV AH,09H
INT 21H
LEA DX,DISP7
INT 21H

JMP EXIT1
EXIT1:PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H;恢复磁盘参数
MOV AL,02H
MOV ES:[BX+3],AL
MOV AL,12H
MOV ES:[BX+4],AL;
MOV AL,54H
MOV ES:[BX+7],AL
MOV AL,0F6H
MOV ES:[BX+8],AL
POP ES
RET
MAIN ENDP

FORMATS PROC NEAR;格式化特殊磁道
MOV CX,05h
REP01:PUSH CX
LEA BX,DATA_CX;得到磁道号
MOV AX,es:[BX]
MOV CX,AX

LEA BX,DATA_BX;取得磁道格式
MOV AX,ES:[BX]
MOV BX,AX
MOV AX,0501h
INT 13H
JNB RIGHT01;成功转移
POP CX
DEC CX
JZ FAIL01
JMP REP01
FAIL01:LEA BX,ERR;写出错标志
MOV AX,01
MOV [BX],AX
JMP QUIT01
RIGHT01:POP CX
LEA BX,ERR;写入成功标志
MOV AX,00
MOV [BX],AX
QUIT01:RET
FORMATS ENDP

WRITES PROC NEAR;格式化特殊磁道
MOV CX,05h
REP02:PUSH CX
LEA BX,DATA_CX;得到磁道号
MOV AX,es:[BX]
MOV CX,AX

LEA BX,DATA_BX;取得磁道格式
MOV AX,ES:[BX]
MOV BX,AX
MOV AX,0301h
INT 13H
JNB RIGHT02;成功转移
POP CX
DEC CX
JZ FAIL02
JMP REP02
FAIL02:LEA BX,ERR;写出错标志
MOV AX,01
MOV [BX],AX
JMP QUIT02
RIGHT02:POP CX
LEA BX,ERR;写入成功标志
MOV AX,00
MOV [BX],AX
QUIT02:RET
WRITES ENDP

READFILE PROC NEAR
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H;置正常磁盘参数
MOV AL,02H
MOV ES:[BX+3],AL
MOV AL,12H
MOV ES:[BX+4],AL;
MOV AL,54H
MOV ES:[BX+7],AL
MOV AL,0F6H
MOV ES:[BX+8],AL
POP ES
mov ax,3d00h ;为读而打开文件
int 21h
jnb read ;成功转
err1:lea dx,READ_ERR
mov ah,9
int 21h
mov ah,4ch
int 21h
read:
mov bx,ax ;bx=文件号
mov cx,8192 ;读入8192字节
lea dx,DATA_FILE ;ds:dx为读入地址
mov ah,3fh
int 21h ;读入文件至data_00,ax为读入字节数
cmp ax,8192
jnz err1
mov ah,3eh
int 21h ;关闭文件
ret
readfile endp
CODE ENDS
END MAIN

标 题:特殊指纹文件生成方法
发信人:小牧童
时 间:2000-12-9 17:08:11
详细信息:

特殊指纹文件生成方法：

用Debug
e0:0525 06
a9000
mov ax,0201
mov bx,100
mov cx,XXXX //XXXX为扇区号
mov dx,DDDD //DDDD 为道号０为０面0100为１面
int 13
int 3

g=9000

r bx:cx
0:2000
N ＸＸＸＸ.fin //指纹文件名
w


明伦五笔高手1.2A

标 题:我的破解心得(6) (3千字)
发信人:chcw
时 间:2001-3-13 18:06:41
详细信息:
破解程序：
明伦五笔高手1.2A
破解工具：
SoftICE 3.0 For Windows 95 (Util16 Dldr)
W32Dasm 8.5
UltraEdit 5.0
破解者:
chcw

明伦五笔高手是Dos下的一个应用程序，该程序在初启时和选择菜单命令时，都会去访问软驱，并显示
‘请插入Key盘’的对话框，但在软驱中无盘或无钥匙盘的情况下，并不会出错。由于频繁的访问软驱对软
驱损害较大，所以我们要把该程序访问软驱的部分破解掉。

1. 用Dldr载入WT.EXE程序。
2. 在DOS下常用的磁盘IO中断是INT 13H，我们就对该中断设置断点：
BPINT 13
3. 键入X, 运行程序。立即就会被SoftICE拦截到：

1DB3:13B3 XOR AX, AX
1DB3:13B5 INT 13 ; Reset Controler <----亮带所在点

4. 键入BC *，清除原有的断点。然后从亮带处向下，找到子程序的返回点处：
1DB3:1458 RETF
将光标移到1458处，键入'HERE'。程序将执行至此处。
5. 按F10返回到调用的语句处：
1DB3:01C3 CALL 13A8
1DB3:01C6 POP CX
1DB3:01C7 POP CX
键入r ax，查得返回值ax=0。仔细分析堆栈，发现执行调用CALL 13A8后，SP指针增加了2。因此我们可以
用语句:
XOR AX, AX ; 将ax置为0
POP CX ; 将SP指针增加2
代替CALL 13A8语句来获得相同的效果。
6. 用W32Dasm反汇编WT.EXE程序，并将反汇编代码存为文件WT.ALF, 在文件WT.ALF中查找字符串'int 13'，找
到以下地址：
:0002.2B95 CD13 int 13
7. 从该地址向上找，可以找到该语句所在子程序的入口点，并得到调用该程序的语句地址：
* Referenced by a CALL at Addresses:
|:0002.19A3, :0002.2C42
|
:0002.2B88 55 push bp <---子程序入口点
8. 下面我们将把WT.EXE程序中所有调用子函数0002.2B88的语句改为语句xor ax,ax/pop cx。找到地址
0002.19A3处:
:0002.19A3 E8E211 call 2B88
该函数调用语句的机器码为'E8E211'，用UltraEdit打开WT.EXE程序，查找字符串'E8E211'并将其替换为
'33C059'（'33C0'是xor ax, ax的机器码, '59'是pop cx的机器码）。同理可以将0002.2C42地址处的机
器码进行修改。
9. 执行WT.EXE程序，程序不会再对软驱进行访问了，但仍会显示‘请插入Key盘’的对话框。

注:程序在调用2B88之后，若返回值ax==0，会显示‘请插入Key盘’的对话框。因此如果在第8步中将替换
的字符串该为'B00159'（'B001'是mov al, 1的机器码，'59'是pop cx的机器码），那么连对话框也不会
显示了。

附: WT.EXE的Patch程序Patcher.c

----------------------------Patcher.c---------------------------------
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>

void main()
{
const long filesize=101334; //101,334 bytes
const unsigned char oldcode[][4]={{0xE8, 0xE2, 0x11, 0x00}, {0xE8, 0x43, 0xFF, 0x00}};

unsigned char patchcode[4]={0xB0, 0x01, 0x59, 0x00};
unsigned char buffer[4];
long offset[]={0x000135A3, 0x00014842};
FILE *fp;
int i;

printf("Crack for WT\n");
printf("Written by Mr. Chcw\n");

if ((fp=fopen("wt.exe", "r+"))==NULL) {
printf("Error: Cannot open file wt.exe\n");
exit(1);
}
else if (filelength(fileno(fp))!=filesize) {
printf("Error: Incorrect WT version, cannot patch it\n");
exit(2);
}

for (i=0; i<2; i++) {
fseek(fp,offset[i],SEEK_SET);
fread(buffer, 3, 1, fp);
buffer[3]='\0';

if (strcmp(buffer, oldcode[i]) != 0) {
printf("Error: The file wt.exe is corrupted\n");
exit(3);
}
}

for (i=0; i<2; i++) {
fseek(fp,offset[i],SEEK_SET);
fwrite(patchcode, 3, 1, fp);
}

fclose(fp);

printf("Patch successful\n");
}
---------------------- End of File Patcher.c --------------------------


瑞星、KV3000小谈

 标 题:瑞星、KV3000小谈---GFH要看就进来吧--不闲DOS老土的也近来看看吧。 (5千字)
发信人:飞刀浪子
时 间:2001-5-8 9:51:54
详细信息:
写这篇该死东西根本算不上教程,只是GFH要,只好写一下了.如果闲老掉牙，赶快退出，免得伤了你的法眼。
下面是在瑞星中找到的保护模式的进出。
PUSH 00
POPF
LGDT [CS:4F70] ;FF 0F 2C A9 01 00 这就是4F70的内容了
LIDT [CS:4F76] ;FF 07 2C A1 01 00 这就是4F76的内容了
MOV EAX,[CS:4F44] ;00 80 02 00 这就是4F44的内容了
MOV CR3,EAX ；CR3被置为00028000 高20位就是页目录物理基
；址，且允许页目录回写式高速缓存。
MOV EAX,CR0
OR EAX,80000001 ;分页的保护模式
MOV CR0,EAX
JMP FAR 0800:24D9 ；跳入保护模式罗
MOV AX,0808
MOV SS,AX
MOVZX ESP,SP
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
RET

PUSH 00
POPF
MOV AX,0808
MOV DS,AX
MOV ES,AX
MOV SS,AX
MOV FS,AX
MOV GS,AX
MOV EAX,CR0
AND EAX,7FFFFFFE
MOV CR0,EAX ；在回到实模式之前，修改CR0
SUB EAX,EAX
MOV CR3,EAX ；清掉页目录地址
JMP FAR 16A7:2512 ；回到实模式
:2512 LGDT [CS:4F86]
LIDT [CS:4F80]
MOV AX,CS
MOV SS,AX
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOVZX ESP,SP
.
.
;让我们看看1A92:000C是些甚么东东,呵呵下面就是GDT表了（8位一组）
00 00 00 00 00 00 00 00-FF FF 70 6A 01 9E 00 00 ........��pj.?.
FF FF 70 6A 01 9E 00 00-FF FF 70 6A 01 9E 00 00 ��pj.?.��pj.?.
FF FF 70 6A 01 9E 00 00-FF FF 70 6A 01 9E 00 00 ��pj.?.��pj.?.
FF FF 70 6A 01 9E 00 00-FF FF 70 6A 01 9E 00 00 ��pj.?.��pj.?.
FF FF 70 6A 01 9E 00 00-FF FF 70 6A 01 9E 00 00 ��pj.?.��pj.?.
.
.
.

;再让我们看看1A12:000C的IDT表（8位一组）
97 1F 08 00 00 8E 00 00-97 1F 10 00 00 8F 00 00 ?...?.?...?.
97 1F 18 00 00 8E 00 00-97 1F 20 00 00 8F 00 00 ?...?.? ..?.
97 1F 28 00 00 8E 00 00-97 1F 30 00 00 8E 00 00 ?(..?.?0..?.
97 1F 38 00 00 8E 00 00-97 1F 40 00 00 8E 00 00 ?8..?.?@..?.
D2 1D 40 00 00 8E 00 00-D2 1D 48 00 00 8E 00 00 ?@..?.?H..?.
.
.
.
；在这里我并没有讲怎样破解瑞星DOS版，毕竟它还是给我们带来了不少方便，留点面子吧。对于瑞星，我觉得
；他的保护是越来越强，但加密盘做的简直是在放水嘛，我8.0写的内存解密程序现在都还可以用。真搞不懂。
；还有上面讲的只是保护模式的最简单的进出，要想写详细，一本书都有的写，而且我也没哪个水平。

；如果你觉得现在有劲没处使，那就搞定下面的这个吧，我举双手支持。
；下面看看老汪那牛皮哄哄的KV3000 G+版
；注：某些跳转指令是不正确的，因我用了其他的方法回写反汇编文本，不过重要的偏移
； 我已在前面标明。
:CC84 MOV BX,3B00 BB003B
MOV CX,0001 B90100
MOV DX,0000 BA0000
MOV BP,0005 BD0500
MOV AX,0201 B80102
:CC93 INT 13 CD13 ；我在此处将IP值改为CFCA
JAE 0128 7315
.
.
CMP [WORD BX+0013],0960 817F136009 ；此处判断软盘类型
JNE 0161 7511 ；不是3.5就跳
CMP [BYTE D4C9],24 803EC9D424
JA 015E 7707
INC [BYTE 80AA] FE06AA80
JMP 0203 E9A500
JMP F0FD E99CEF
MOV [BYTE D3AF],00 C606AFD300
CMP [BYTE D4C9],44 803EC9D444
JBE 0181 7614
CMP [BYTE D4C9],C5 803EC9D4C5
JNE 0177 7503
JMP 0203 E98C00
CMP [BYTE D4C9],55 803EC9D455
JBE 0181 7603
JMP 0203 E98200
MOV AX,F000 B800F0
MOV ES,AX 8EC0
CMP [WORD ES:FF80],779A 26813E80FF9A77
JNE 01A4 7515
.
.
.
CMP [WORD ES:FFEE],5141 26813EEEFF4151
JNE 044C 7506
:CFCA CALL FAR 3B6A:884D 9A4D886A3B ；就是这里了，从此处
:CFCF RET C3 ；全速执行，就...
;看见程序界面了，呵呵有改进，用了直接写屏来写汉字。只是操作起来还是那么麻烦。
；就这样完了，都没什么搞头，比KV300还不如，会不会有陷阱哦。扫一下我硬盘里的
；病毒样本，呵呵，还真让他给找到了。
；上面是跟踪时改的，我们要对付它有两个办法：
；1. 脱壳。这家伙用了KeyMaker 3.0加外壳，网上有脱它的程序，可以找一个来用。
；之后要改的可不只是上面的那一点了，还要避开他的自我检测部分，很麻烦就是了。
；以前解他的KV300时就改了好些地方。而且，它每查一个文件都要检查（两次）他那
；WJM有没有被修改，这简直是浪费资源嘛，我一时火起，把那个地方贴上我的大名，其
；他地方用大写的X填写，一大串XXXXXXXX看起来象什么，哈哈哈。
；2.就是内存解密啦，最方便，各位老大有空就写一个吧。

还有我上次那个用DEBUG脱VRV2000的那个教程，在回写VRV.DAT文件之前的重定位指令要NOP掉，上次让我
写掉了，SORRY（我做什么都尽量完美，所以在这个地方多个嘴，给它打个补丁）。另外，我看见其他地方COPY
了去，只是该换行的地方没有换，搞的我都有些看不懂。
有兴趣的朋友到GFH的网页去看看吧。（兄弟，我又在帮你打广告了，怎么谢我？）
好累，休息一下，明天准备过我的21岁小寿了。过几天还的考试，唉，有点烦....
2000.5.8 飞刀浪子 留


瑞星杀毒2001

标 题:在无钥匙盘下,解瑞星杀毒软件【2001版】 (1千字)
发信人:tarcy
时 间:2001-1-8 9:37:10
详细信息:
在无钥匙盘下,解瑞星杀毒软件【2001版】

一,用 TYP 测试 瑞星杀毒软件【2001版】是被哪种壳给加密了 ,
哇是UPX1.03 ,没有现成工具,我才不脱呢.(我懒的要死)
二,运行TRW2000
三,运行 安装文件setup.exe
提示插入A号盘.
四,按TRW2000的热键,( ctrl+n )
停在系统里面了,不管它3,7,28.
TRW2000有个好用的命令pmodule就用它
五,返回到提示按取消,TRW2000给激活了
怎么会给激活了(是命令pmodule)

看到我们兴趣的地方了

017F:00406660 MOV EAX,[ECX+02D8]
017F:00406666 CMP EAX,BYTE +07
017F:00406669 JZ 00406670
017F:0040666B CMP EAX,BYTE +64
017F:0040666E JNZ 00406680
017F:00406670 XOR EAX,EAX
017F:00406672 PUSH EAX
017F:00406673 MOV EAX,[ESP+08]
017F:00406677 PUSH EAX
017F:00406678 CALL `SETUP!CheckKey` <-------检查钥匙盘
017F:0040667D RET 04
017F:00406680 CMP EAX,BYTE +14
017F:00406683 JNZ 00406698
017F:00406685 MOV EAX,02
017F:0040668A PUSH EAX
017F:0040668B MOV EAX,[ESP+08]
017F:0040668F PUSH EAX
017F:00406690 CALL `SETUP!CheckKey` <-------检查钥匙盘
017F:00406695 RET 04 <---------停在这里

----------------------
017F:004064B0 CALL 00406660 <-------主call
017F:004064B5 TEST EAX,EAX <-------test eax
017F:004064B7 JZ NEAR 004065EC <-------出错跳转...
017F:004064BD PUSH EBX
017F:004064BE LEA ECX,[ESP+08]
017F:004064C2 PUSH EDI
017F:004064C3 LEA EAX,[ESI+034C]
017F:004064C9 PUSH ECX

制造补丁我使用 R!SC's Process Patcher v1.5.1
(内存动态补丁制作软件)


瑞星杀毒软件2001

标 题:破解瑞星杀毒软件2001版，半字节，没搞错吧？？（破解手记） (1千字)
发信人:duba.126.com
时 间:2001-2-12 19:38:13
详细信息:
破解瑞星杀毒软件2001版，半字节，没搞错吧？？（破解手记）

非常棒的国产精品杀毒软件，从瑞星网站下载最新版，
目前为2001版，安装时需瑞星密钥盘。
图形版ravcpic.exe 字符版ravcchar.exe
下面以图形版为例。
1。用winzip等解压缩软件将ravcpic.exe 展到一个目录下
2。将其中的SETUP.DLL的UPX1.03壳给脱了。
脱壳可用UPX1.06，参数-D即可（UPX SETUP.DLL -D）
3。用打开w32dasm黄金版打开SETUP.DLL==》串式参考
"请插入瑞星A号盘，如果该提示仍出现请与经销商联?
共四处，我们只看最早的一处

:10001916 85C0 test eax, eax
:10001918 7407 je 10001921 (74改75)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001947(C)
|
:1000191A B801000000 mov eax, 00000001
:1000191F 5E pop esi
:10001920 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001918(C)
| ^^^^^^^^^^^
:10001921 A180CD0010 mov eax, dword ptr [1000CD80]

* Reference To: USER32.MessageBoxA, Ord:0000h
|
:10001926 8B356C910010 mov esi, dword ptr [1000916C]
:1000192C 6A31 push 00000031

* Possible StringData Ref from Data Obj ->"提示"
|
:1000192E 6884B20010 push 1000B284

* Possible StringData Ref from Data Obj ->"请插入瑞星A号盘，如果该提示仍出现请与经销商联?
->"怠?
|
:10001933 6850B20010 push 1000B250
4。运行目录下的安装主程序setup.exe，哇塞，省掉一百多大洋，
情人节is coming,party的门票钱出来了。
5。请保存修改后的setup.dll，可将瑞星2001图形版毙掉（难得瑞星三天两头的升级）
6。字符版可参考1~5，原理同。

本文曾参考看雪论坛http://210.77.146.78/forum/toye/5520.html(作者conanxu)
顺向conanxu兄,toye师，洋白菜兄问好，祝论坛旺，旺，旺上加旺！！！！

作者：风飘雪
主页http://duba.126.com


瑞星世纪版密钥盘

 标 题:中秋到了，给初学者送上一块月饼，“瑞星世纪版密钥盘制作源程序“。 (1千字)
发信人:小牧童
时 间:2000-9-11 23:26:40
详细信息:
STACK SEGMENT PARA STACK 'STACK'
DW 128 DUP(?)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
PARA1 DB 4FH,00,01,02
DB 4FH,00,02,02
DB 4FH,01,03,02
DB 4FH,00,0A7H,02
DB 4eH,01,0D1H,02
DB 4FH,01,0BCH,02
DB 4FH,00,0EH,02
DB 04H,01,08,02
DB 4FH,01,67h,02
DISP1 DB 'Failure!',0ah,0dh,24h
DISP2 DB 'Success!',0ah,0dh,24h
DISP3 DB 'RAV 99 Century Cracked,Only use by yourself!',0AH,0DH,24H
DISP4 DB 'Cracked by Zhuxiaohua 1999.08.25',0AH,0DH,24H
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,DISP3
MOV AH,09H
INT 21H
LEA DX,DISP4
INT 21H
PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,00
MOV ES:[BX+3],AL
MOV AL,09
MOV ES:[BX+4],AL
MOV AL,6CH
MOV ES:[BX+7],AL
POP ES
MOV CX,05
REP1:PUSH CX
MOV DX,0100h
MOV CH,4FH
LEA BX,PARA1
MOV AH,05
INT 13H
JNB EXIT
POP CX
DEC CX
JZ FAIL
JMP REP1
FAIL:LEA DX,DISP1
MOV AH,09H
INT 21H
JMP EXIT1
EXIT:POP CX
LEA DX,DISP2
MOV AH,09H
INT 21H
JMP EXIT1
EXIT1:PUSH ES
MOV AH,35H
MOV AL,1EH
INT 21H
MOV AL,02H
MOV ES:[BX+3],AL
MOV AL,12H
MOV ES:[BX+4],AL
MOV AL,54H
MOV ES:[BX+7],AL
POP ES
RET
MAIN ENDP
CODE ENDS
END MAIN


环宇通汉英翻译系统用户手册(V3.0版)

标 题:disk-check如何破解？ (1千字)
发信人:peterchen
时 间:2001-3-22 13:58:38
详细信息:
“环宇通”汉英翻译系统用户手册(V3.0版)
我把check-disk的主要程序上载了只有817 KB!
0167:004E4090 DB ??
0167:004E4091 DB ??
0167:004E4092 DB ??
0167:004E4093 DB ??
0167:004E4094 DB ??
0167:004E4095 DB ??
0167:004E4096 DB ??
0167:004E4097 DB ??
0167:004E4098 DB ??
0167:004E4099 DB ??
0167:004E409A DB ??
0167:004E409B DB ??
0167:004E409C DB ??
0167:004E409D DB ??
0167:004E409E DB ??
0167:004E409F DB ??
0167:004E40A0 DB ??
0167:004E40A1 DB ??<-(用trw2000装载方式)
0167:004E40A2 DB ??
0167:004E40A3 DB ??
------------------CEW!_LOCK98_+9A----------------
0167:004E40A1 CALL 004E40A6<-(用"PMODULE"而且一跳过它就开始测试磁盘,最后出现提示)
0167:004E40A6 POP EBP
0167:004E40A7 SUB EBP,004300A6
0167:004E40AD JMP SHORT 004E40B7
0167:004E40AF SALC
0167:004E40B0 FDIVR QWORD [EBX+2A2C60D4]
0167:004E40B6 RET
------------------CEW!_LOCK98_+A1----------------
0167:004E408A PUSH ECX
0167:004E408B SALC
0167:004E408C AND EAX,D2B7F302
0167:004E4091 MOV DL,51
0167:004E4093 TEST AL,72
0167:004E4095 CMP EAX,2AAC54F6
0167:004E409A NEG DWORD [ESI-40]
0167:004E409D ADD [ECX],BL
0167:004E409F ADC EAX,E855
0167:004E40A4 ADD [EAX],AL<-(把游标向上走就变成这样)
0167:004E40A6 POP EBP
0167:004E40A7 SUB EBP,004300A6
0167:004E40AD JMP SHORT 004E40B7
0167:004E40AF SALC
0167:004E40B0 FDIVR QWORD [EBX+2A2C60D4]
0167:004E40B6 RET
--------------------------------------------------
0167:004E40A1 DB ?? \开始是没有call,当用了"PMODULE"就变成了call?
0167:004E40A1 CALL 004E40A6 /发现开始时所有的汇编都没有流程最后就有了!
原来lock98才用动态形式来保护的!
小弟用过Wdst14多数仍然是狂读软驱?不知道哪位大客帮帮忙用trw2000或sice把
disk-check去掉!
http://go8.163.com/~peter007/hyt.rar

标 题:运行TRW2000，选TRnewTCB,运行CEW.EXE: (5千字)
发信人:xfshm
时 间:2001-3-22 18:59:53
详细信息:

运行TRW2000，选TRnewTCB,运行CEW.EXE:
0167:004E40A1 CALL 004E40A6：按F8可以进入单步跟踪。

按照下面的代码下bpx指令，F5返回，拦截成功，你可以继续分析。我也是刚学破解，而且没有时间。你可以继续分析。

015F:004E7C58 MOV AX,0401 ;校验
015F:004E7C5C MOV CX,4F01
015F:004E7C60 MOV DH,01
015F:004E7C62 MOV DL,[EBP+00433DE9]
015F:004E7C68 CALL 004E7925
015F:004E7C6D MOV AX,0201 ；读盘
015F:004E7C71 MOV CX,4F32 ；C:4F H:1 R:32
015F:004E7C75 MOV DH,01
015F:004E7C77 MOV DL,[EBP+00433DE9] ;磁盘号
015F:004E7C7D CALL 004E7925
015F:004E7C82 MOV DL,[EBP+00433DE9]
015F:004E7C88 CALL 004E78FD
015F:004E7C8D MOV DL,[EBP+00433DE9]
015F:004E7C93 CALL 004E78FD
015F:004E7C98 MOV EBX,[EBP+00433DD7]
015F:004E7C9E CMP EBX,[EBP+00433DBF]
015F:004E7CA4 JZ 004E7CB7
015F:004E7CA6 CMP BYTE [EBP+00433DE9],01
015F:004E7CAD JNC 004E7CCE
015F:004E7CAF INC BYTE [EBP+00433DE9]
015F:004E7CB5 JMP SHORT 004E7C3E
015F:004E7CB7 PUSH EAX
015F:004E7CB8 LEA EDI,[EBP+00433BD7]
015F:004E7CBE LEA ECX,[EBP+00433CCA]
015F:004E7CC4 SUB ECX,EDI
015F:004E7CC6 DEC ECX
015F:004E7CC7 CLD
015F:004E7CC8 XOR AL,AL
015F:004E7CCA REP STOSB
015F:004E7CCC POP EAX
015F:004E7C58 MOV AX,0401
015F:004E7C5C MOV CX,4F01
015F:004E7C60 MOV DH,01
015F:004E7C62 MOV DL,[EBP+00433DE9]
015F:004E7C68 CALL 004E7925
015F:004E7C6D MOV AX,0201 ;读盘
015F:004E7C71 MOV CX,4F32
015F:004E7C75 MOV DH,01
015F:004E7C77 MOV DL,[EBP+00433DE9]
015F:004E7C7D CALL 004E7925
015F:004E7C82 MOV DL,[EBP+00433DE9]
015F:004E7C88 CALL 004E78FD
015F:004E7C8D MOV DL,[EBP+00433DE9]
015F:004E7C93 CALL 004E78FD
015F:004E7C98 MOV EBX,[EBP+00433DD7]
015F:004E7C9E CMP EBX,[EBP+00433DBF]
015F:004E7CA4 JZ 004E7CB7
015F:004E7CA6 CMP BYTE [EBP+00433DE9],01
015F:004E7CAD JNC 004E7CCE
015F:004E7CAF INC BYTE [EBP+00433DE9]
015F:004E7CB5 JMP SHORT 004E7C3E
015F:004E7CB7 PUSH EAX
015F:004E7CB8 LEA EDI,[EBP+00433BD7]
015F:004E7CBE LEA ECX,[EBP+00433CCA]
015F:004E7CC4 SUB ECX,EDI
015F:004E7CC6 DEC ECX
015F:004E7CC7 CLD
015F:004E7CC8 XOR AL,AL
015F:004E7CCA REP STOSB
015F:004E7CCC POP EAX

015F:004E7967 MOV ESI,03 ;读盘三次
015F:004E796C PUSH ESI
015F:004E796D PUSH EAX
015F:004E796E PUSH EBX
015F:004E796F PUSH ECX
015F:004E7970 PUSH EDX
015F:004E7971 CALL 004E752A
015F:004E7976 MOV [EBP+00433E50],EAX
015F:004E797C MOV [EBP+00433E4C],ECX
015F:004E7982 MOV [EBP+00433E48],EDX
015F:004E7988 MOV EBX,[EBP+00433A01]
015F:004E798E MOV [EBP+00433E44],EBX
015F:004E7994 SHR EBX,10
015F:004E7997 MOV [EBP+00433E56],BX
015F:004E799E MOV BL,13
015F:004E79A0 CALL 004E7756
015F:004E79A5 POP EDX
015F:004E79A6 POP ECX
015F:004E79A7 POP EBX
015F:004E79A8 POP EAX
015F:004E79A9 POP ESI
015F:004E79AA CMP AH,02 ；AH=2，读盘
015F:004E79AD JNZ 004E79C2
015F:004E79AF MOV EBX,[EBP+00433A05]
015F:004E79B5 CMP WORD [EBX],BYTE +00
015F:004E79B9 JNZ 004E79C2
015F:004E79BB OR ESI,ESI
015F:004E79BD JZ 004E79C2
015F:004E79BF DEC ESI
015F:004E79C0 JMP SHORT 004E796C
015F:004E79C2 CMP CX,4F32 ；磁道4F 扇区32H
015F:004E79C7 JNZ 004E79F1
015F:004E79C9 MOV EBX,[EBP+00433A05]
015F:004E79CF MOV ECX,0200
015F:004E79D4 CALL 004E7B24
015F:004E79D9 MOV [EBP+00433DBF],EAX
015F:004E79DF MOV EAX,[EBX+9B]
015F:004E79E5 XOR EAX,[EBX+0162]
015F:004E79EB XOR [EBP+00433DBB],EAX
015F:004E79F1 MOV EAX,[EBP+004339FD]
015F:004E79F7 CALL 004E761C
015F:004E7967 MOV ESI,03
015F:004E796C PUSH ESI
015F:004E796D PUSH EAX
015F:004E796E PUSH EBX
015F:004E796F PUSH ECX
015F:004E7970 PUSH EDX
015F:004E7971 CALL 004E752A
015F:004E7976 MOV [EBP+00433E50],EAX
015F:004E797C MOV [EBP+00433E4C],ECX
015F:004E7982 MOV [EBP+00433E48],EDX
015F:004E7988 MOV EBX,[EBP+00433A01]
015F:004E798E MOV [EBP+00433E44],EBX
015F:004E7994 SHR EBX,10
015F:004E7997 MOV [EBP+00433E56],BX
015F:004E799E MOV BL,13
015F:004E79A0 CALL 004E7756
015F:004E79A5 POP EDX
015F:004E79A6 POP ECX
015F:004E79A7 POP EBX
015F:004E79A8 POP EAX
015F:004E79A9 POP ESI
015F:004E79AA CMP AH,02
015F:004E79AD JNZ 004E79C2
015F:004E79AF MOV EBX,[EBP+00433A05]
015F:004E79B5 CMP WORD [EBX],BYTE +00
015F:004E79B9 JNZ 004E79C2
015F:004E79BB OR ESI,ESI
015F:004E79BD JZ 004E79C2
015F:004E79BF DEC ESI
015F:004E79C0 JMP SHORT 004E796C
015F:004E79C2 CMP CX,4F32
015F:004E79C7 JNZ 004E79F1
015F:004E79C9 MOV EBX,[EBP+00433A05]
015F:004E79CF MOV ECX,0200
015F:004E79D4 CALL 004E7B24
015F:004E79D9 MOV [EBP+00433DBF],EAX
015F:004E79DF MOV EAX,[EBX+9B]
015F:004E79E5 XOR EAX,[EBX+0162]
015F:004E79EB XOR [EBP+00433DBB],EAX
015F:004E79F1 MOV EAX,[EBP+004339FD]
015F:004E79F7 CALL 004E761C


解开硬盘逻辑死

 标 题:解开硬盘逻辑死锁的一种有效方法 (转贴） (10千字)
发信人:幻影2001[BCG]
时 间:2001-6-10 21:10:35
详细信息:
一·序言

不知道你是否曾碰到过从软盘和硬盘都启动不了计算机的情形？一般计算机的硬盘分区表被病毒感染后，若不能启动机子，通常从软盘可以启动。但在严重的情形下，不但从硬盘不能启动机子，就是从软盘也不能启动。有的恶毒的病毒就能使硬盘被死锁。笔者一次在自己机子上玩弄硬盘锁时，就被锁住过一次。结果在硬盘下选择DOS或WIN95模式启动机子都死机，在软盘下用DOS启动也死机；在COMS中将硬盘类型选择None，虽然可以从软盘启动，但启动后没有硬盘，使用软盘上的FDISK命令，想重新分区或格式化都没门。弄得我一筹莫展。

本来，硬盘被锁住时，可以采用3.0以下的DOS版本启动机子，机子启动后虽然也不认硬盘，但其不认的原因在于其管理不了现在的大硬盘，因此可以用Debug修改硬盘分区表，修改后可以启动。但在已进入WINDOWS的年代，3.0以下的DOS实难找到，即使找到，你的机子上恐怕也因没有5寸软驱而不能使用。因此，最好的办法是编制一个程序来解决这个问题。笔者通过尝试和思考，找到一种比较实用的方法，可以轻松解开死锁的硬盘，当然也把自己的硬盘解开了。下面，我将这种方法介绍出来。

二·硬盘锁住原理

硬盘锁住通常是对硬盘的分区表做手脚，因此首先应该了解硬盘的分区表。硬盘分区表位于0柱面0磁头1扇区，这个扇区的前面200多个字节是主引导程序，后面从01BEH开始的64个字节是分区表。分区表共64字节，分为4栏，每栏16字节，用来描述一个分区。如果是用DOS的FDISK程序分区后，最多只用两栏，第一栏描述基本的DOS分区，第二栏描述扩展的DOS分区。

分区表一栏的结构与各字节的含义如下：

00H—标志活动字节，活动DOS分区为80H，其它为00H。

01H—本分区逻辑0扇区所在的磁头号。

02H—逻辑0扇区所在柱面中的扇区号。

03H—逻辑0扇区所在的柱面号。

04H—分区类型标志。

05H—本分区最后一个扇区的磁头号。

06H—最后一个扇区的扇区号。

07H—最后一个柱面的柱面号。

08H—硬盘上在本分区之前的扇区总数，用双字表示。

0CH—本分区的扇区总数，从逻辑0扇区计数，不含隐藏扇区，用双字表示。

在上面的介绍中给出的柱面号与扇区号虽然各占一个字节，但实际上扇区号用6位表示，柱面号用10位表示，扇区号所在字节的最高两位实际上是柱面号的最高两位。

分区表的最后两个字节是分区表的有效标志，如果将其改变，将不能从硬盘启动，这是一种简单的锁住硬盘的方法。解决的办法是从软盘启动，启动后硬盘仍然可以使用。用Debug或Noratn中的Diskedit软件将硬盘该分区表中的标志恢复，则从硬盘启动也没有问题了。锁住硬盘的另一种方法是对分区参数做手脚，如果将分区参数全部变为0，则启动时由于找不到分区参数，从硬盘是没法启动，从软盘启动后也不认硬盘，如果你敲入盘符C并回车，将出现提示Invalid driver specification。但所幸的是，毕竟可以启动机子，不认硬盘没关系，在A盘上用DOS的Debug仍然可以读出硬盘0柱面0磁头1扇区的内容，修改后再写入0柱面0磁头1扇区，重新启动机子又没问题了。如果将分区表参数随意改为其它参数，则有可能不能用可以安装DOS的DOS系统盘启动，按F3退出后将出现内存分配错误，不能装载DOS的命令解释器COMMAND的提示，系统就死机了，笔者就曾碰见过这种情形。但用一张格式化成系统盘的软盘则可以顺利启动，只要有Debug，你仍然可以将分区表参数修改回去。可怕的事情是，如果你不幸将分区表参数改成一个循环链，即C盘的下一个分区指向D驱，D驱的下一个分区又指向C区，这样循环下去，DOS启动或WIN95启动时由于无休止的读取逻辑驱动器，就只有死机的份了。这是只要有硬盘存在，不管你用软盘还是硬盘都没法启动机子了，由于不能启动是由于硬盘造成的，即使你将硬盘下到其它计算机上，也没法使用，这样硬盘就彻底被锁死了，笔者所遭遇就是此情形。不信，你只需将硬盘0柱面0磁头1扇区的1D0H处改为1（如果你的D驱开始柱面号不够大，此处本来就为1），将1D1H处改为0，表示D盘的开始柱面号跟C盘一样，看看你的计算机还能不能启动，不过你在没有充分的准备前绝不要试。

一个完整的硬盘锁程序，不过是重新改写0柱面0磁头1扇区的引导程序，并将分区表破坏或故意制造一个循环分区表，而将真正的硬盘分区表参数和引导程序放在其它隐藏扇区并保护起来，如果启动时口令不对，则不能启动机子，口令对了则顺利启动。这种硬盘锁程序，情形好的还可以用软盘启动；情形严重的就是连软盘也不能启动，硬盘真被锁住。

三·解开硬盘锁的程序法

如果硬盘被锁死，是否真的就无法解开呢？当然不是。看看问题的症结所在，根源在于DOS中的IO.SYS文件，它包含LOADER、IO1、IO2、IO3四个模块，其中IO1中包含有一个很关键的程序SysInt_I，它在启动中很固执，非要去读分区表，而且不把分区表读完誓不罢休。如果碰上分区表是循环的，它就只有死机了。这是DOS的脆弱性和不完备性。其实这也不能怪DOS，因为DOS为了获得硬盘使用权，就必需读分区表参数，而且DOS还约定驱动器号不能超过26，只不过没有考虑到此等循环分区表情形。一句话，机子不能启动不过是DOS操作系统造成的，如果另写一个操作系统，或许就能启动机子。当然这只是说个笑话。

明白了病因在于DOS，问题就好办了。DOS启动中不是要读硬盘分区表吗？我不让你读分区表甚至连硬盘都不让你读，不就可以顺利启动了。的确是这样的，解开硬盘锁的程序实现方法就是基于这个思想形成的。当然，这只有从软盘启动着手了。

看看计算机的启动过程，上电首先进行的多项硬件自测跟我们没有关系，我们关心的只是它最开始和磁盘打交道时是干什么。如果选择从硬盘启动，则计算机和磁盘最开始打交道是将硬盘0柱面0磁头1扇区的内容读入内存0000：7C00处并跳到0000：7C00处执行；如果选择从软盘启动，则计算机和磁盘最开始打交道是将A盘0磁道0磁头1扇区的内容读入内存0000：7C00处并跳到0000：7C00处执行，在执行过程中，计算机并不检查该扇区的内容是什么，只机械地执行读命令，这使得许多系统型病毒得以生存。但利用这一点，恰恰使我们的程序解锁法有了用武之地。如果我们用DOS格式化一张可以启动机子的系统软盘，将该软盘的0磁道0磁头1扇区的内容移到后面的空白扇区中，而重新写一段程序到该软盘的0磁道0磁头1扇区，这样用软盘启动时首先执行的是我们所写的程序了。在这段程序中，具备这样一些功能：在DOS启动前抢先拦截INT 13H，驻留高端内存并监视INT 13H，判断是否读硬盘，如果是读硬盘就直接返回，这样就禁止了读硬盘，也就避免了DOS读硬盘循环分区表造成的死机；同时拦截对软盘的读取，如果读软盘的0磁道0磁头1扇区，就改成读真正有引导程序和磁盘参数表的扇区，免得DOS在启动中找不到软盘的磁盘参数表而死机。完成这些任务的同时，还要读取软盘真正的引导程序并把控制权交给它。

该方法可以称为万能的，因为它在用软盘启动中，始终不与硬盘打交道，这样不管你硬盘用什么方法加锁了，对DOS的启动都没有影响。当然，这样启动的机子是不认硬盘的，但这没有关系。你可在机子启动后，用Debug调出驻留高端内存的新INT 13H程序，将其改为只有一条直接执行旧INT 13H的语句，这样在Debug下可以用INT 13H读取硬盘0柱面0磁头1扇区的内容，如果你有备份，将分区表参数恢复后再写入0柱面0磁头1扇区，重新启动计算机就可以了。如果实在没有备份，去掉分区表中的循环链，用正常DOS启动盘重启机子后至少也可以重新对硬盘分区，不至于硬盘被锁住打不开了。

四·程序及说明

1·下面是写入软盘0磁道0头1扇区的源程序key.com，程序用debug输入。

C>debug

-a100

100 CLI

101 XOR AX,AX

103 MOV DS,AX

105 MOV ES,AX

107 MOV SS,AX

109 MOV AX,7C00

10C MOV SP,AX

10E STI

10F MOV SI,AX

111 MOV DI,7E00

114 CLD

115 MOV CX,0200

118 REPNZ

119 MOVSB

11A JMP 0000:7E1F

11F MOV CX,0003

122 PUSH CX

123 MOV AX,0201；读启动软盘的引导扇区

126 MOV BX,7C00

129 MOV CX,4F01

12C MOV DX,0100

12F INT 13

131 POP CX

132 DEC CX

133 JNZ 0122

135 MOV AX,[004C]；抢先获取INT 13H的位置

138 MOV [7E88],AX

13B MOV AX,[004E]

13E MOV [7E8A],AX

141 MOV AX,[0413]

144 DEC AX

145 MOV [0413],AX

148 MOV CL,06

14A SHL AX,CL

14C MOV ES,AX

14E XOR AX,AX

150 MOV DS,AX

152 MOV SI,7E6D；复制改写的INT 13H程序到高端内存

155 MOV DI,0000

158 MOV CX,0030

15B REPNZ

015C MOVSB

015D MOV AX,0000；将新INT 13H位置写入中断向量表

0160 MOV [004C],AX

0163 MOV AX,ES

0165 MOV [004E],AX

0168 JMP 0000:7C00

016D PUSHF；新INT 13H程序

016E CMP DX,0080；是否是硬盘

0172 JNZ 0176；不是硬盘则继续

0174 POPF

0175 IRET；是硬盘则直接返回

0176 CMP DX,+00；是否读软盘BOOT区？

0179 JNZ 0186

017B CMP CX,+01

017E JNZ 0186

0180 MOV CX,4F01；是则读79磁道1磁头1扇区

0183 MOV DX,0100

0186 POPF

0187 JMP 0000:0000；此处跳转去执行旧INT 13，

；旧INT 13H的位置由前面程序获得后写入。

N key.com

RCX

200

W

Q

2·程序的装载

在进行下面工作前，先用DOS格式化一张启动的系统盘，并保证没有坏扇区，最好进行启动测试，确保其可以启动机子。由于现在机子上大多只有3寸软驱，因此选择1.44M的3.5寸软盘。然后用debug key.com将程序key.com调入内存偏移地址为100H，同时在400H处写入一段装载程序。即：

C>debug key.com

-a400

400 MOV CX,0003

403 PUSH CX

404 MOV AX,0201；将A盘引导程序读入内存1000H处

407 MOV BX,1000；为确保成功，首次采用重复读3次

40A MOV CX,0001

40D MOV DX,0000

410 INT 13

412 POP CX

413 DEC CX

414 JNZ 0403

416 MOV AX,0301；将已读入内存的软盘引导程序写入软盘

419 MOV BX,1000；最后一个磁道的首扇区

41C MOV CX,4F01

41F MOV DX,0100

422 INT 13

424 MOV AX,0301；将key.com程序写入软盘0磁道0磁头1扇区

427 MOV BX,0100

42A MOV CX,0001

42D MOV DX,0000

430 INT 13

432 INT 3

为保证万无一失，最好将软盘这两个扇区的内容重新读出来看一看，以保证写成功了。做好这一切，保险的还是进行一次测试，即用该软盘启动一次机子，看能否成功，若成功启动，你就可以用循环分区表法锁住硬盘，看从正常DOS下能否启动，然后再用此软盘启动机子试试，看看功效如何？

从该软盘启动后，不认硬盘，并且在高端内存驻留了新INT 13H程序，该段程序实际上是key.com中从16D到187部分。由于有此段程序存在，在debug下也无法读硬盘，也就没法恢复硬盘分区表，因此机子启动后首先应修改这段程序。现在的机子基本内存通常都为640K，这样这段程序就位于内存中9FC0：0000处，在debug下，用U9FC0：0显示这段程序，可以看到位于9FC0：001A处是一条跳转指令，该跳转指令即转去执行最原始的INT 13H。由于BIOS版本不一样，跳转指令指向的位置可能不一样，如笔者机子上是一条JMP F000：A5D4语句。这时在在debug下编写这样一语句：a9FC0:0 JMP F000：A5D4。这样，对硬盘的禁写与禁读都不再起作用了，在debug下用INT 13H的2号子功能可以读出硬盘分区表，修改恢复后再用3号子功能将数据写回分区表。退出debug，重新用正常DOS启动计算机，就可以了。

附带提一下，在正常DOS下，该软盘由于没有BOOT区，也就没有磁盘参数表，从而不能使用，用DIR A：命令会出现General failure reading drive A提示。不要理睬它，这并不影响它作特殊启动盘。

五·建议

为更好的保护你的硬盘，笔者建议你最好将你的硬盘分区表信息备份起来。备份有两种方式，一种是以文件形式将硬盘每个逻辑盘的分区信息存储起来；另另一种是将分区信息备份在硬盘隐藏扇区里。比如可以将0柱面0磁头1扇区备份在0柱面0磁头3扇区，将D盘开始柱面号0磁头1扇区备份在该柱面0磁头3扇区，其它逻辑盘也如此。这种方法简单、方便，也很可靠。用NORTAN中的DISKEDI很容易操作和实现。有了备份分区表信息，就不怕破坏分区表的病毒了；再加上我给你的程序，即使有人真锁住了你的硬盘，你也可以轻而易举解开了。

标 题:不需这么麻烦，引导软盘的IO.sys改一个字节就可以了。 (122字)
发信人:小牧童
时 间:2001-6-13 8:01:22
详细信息:

查找 b9 01 00 cd 13， msdos6.22只有一处，98有 2 处
改为 b9 10 00 cd 13

我学汇编和解密就是从它开始的，感谢WJM !!!


用磁盘的序列号进行软件加密

标 题:利用磁盘的序列号进行软件加密 (3千字)
发信人:uino
时 间:2001-4-21 18:50:32
详细信息:
发信人: beny (刺客 ), 信区: Software
标 题: 利用磁盘的序列号进行软件加密
发信站: 紫金飞鸿 (2001年03月16日19:03:42 星期五), 站内信件

用过共享软件的人都知道，一般的共享软件(特别是国外的)在使用一段时间后都会
提出一些“苛刻”的要求，如让您输入注册号等等。如果您想在软件中实现该“功能”
的话，方法有很多。在这里我介绍一种我认为安全性比较高的一种，仅供参考。
    大家都知道，当您在命令行中键入“dir”指令后，系统都会读出一个称作Serial
Number的十六进制数字。这个数字理论上有上亿种可能，而且很难同时找到两个序列号
一样的硬盘。这就是我这种注册方法的理论依据，通过判断指定磁盘的序列号决定该机
器的注册号。
    要实现该功能，如何获得指定磁盘的序列号是最关键的。在Windows中，有一个Get
VolumeInformation的API函数，我们利用这个函数就可以实现。
    下面是实现该功能所需要的代码：
    Private Declare Function GetVolumeInformation& Lib "kernel32" _
    Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _
    ByVal pVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
    lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _
    lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _
    ByVal nFileSystemNameSize As Long)
    Private Const MAX_FILENAME_LEN = 256
    Public Function DriveSerial(ByVal sDrv As String) As Long
    'Usage:
    'Dim ds As Long
    'ds = DriveSerial("C")
    Dim RetVal As Long
    Dim str As String * MAX_FILENAME_LEN
    Dim str2 As String * MAX_FILENAME_LEN
    Dim a As Long
    Dim b As Long
    GetVolumeInformation sDrv & ":\", str, MAX_FILENAME_LEN, RetVal, _
    a, b, str2, MAX_FILENAME_LEN
    DriveSerial = RetVal
    End Function
    如果我们需要某个磁盘的序列号的话，只要DriverSerial(该磁盘的盘符)即可。如
DriverASerialNumber=DriverSerial("A")。
    下面，我们就可以利用返回的磁盘序列号进行加密，需要用到一些数学知识。在这
里我用了俄罗斯密码表的加密算法对进行了数学变换的序列号进行加密。下面是注册码
验证部分的代码：
    Public Function IsValidate(ByVal SRC As Long, ByVal Value As String) As
Boolean
    Dim SourceString As String
    Dim NewSRC As Long
    For i = 0 To 30
    If (SRC And 2 ^ i) = 2 ^ i Then
    SourceString = SourceString + "1"
    Else
    SourceString = SourceString + "0"
    End If
    Next i
    If SRC < 0 Then
    SourceString = SourceString + "1"
    Else
    SourceString = SourceString + "0"
    End If
    Dim Table As String
    Dim TableIndex As Integer
    '=======================================================================
    '这是密码表，根据你的要求换成别的，不过长度要一致
    '=======================================================================
    '注意：这里的密码表变动后，对应的注册号生成器的密码表也要完全一致才能生成
正确的注册号
    Table = "JSDJFKLUWRUOISDH;KSADJKLWQ;ABCDEFHIHL;KLADSHKJAGFWIHERQOWRLQH"
    '=======================================================================
    Dim Result As String
    Dim MidWord As String
    Dim MidWordValue As Byte
    Dim ResultValue As Byte
    For t = 1 To 1
    For i = 1 To Len(SourceString)
    MidWord = Mid(SourceString, i, 1)
    MidWordValue = Asc(MidWord)
    TableIndex = TableIndex + 1
    If TableIndex > Len(Table) Then TableIndex = 1
    ResultValue = Asc(Mid(Table, TableIndex, 1)) Mod MidWordValue
    Result = Result + Hex(ResultValue)
    Next i
    SourceString = Result
    Next t
    Dim BitTORool As Integer
    For t = 1 To Len(CStr(SRC))
    BitTORool = SRC And 2 ^ t
    For i = 1 To BitTORool
    SourceString = Right(SourceString, 1) _
    + Left(SourceString, Len(SourceString) - 1)
    Next i
    Next t
    If SourceString = Value Then IsValidate = True
    End Function
    由于代码较长，还有一些部分的代码在此省略，您可以去我的网站(http://vbtech
nology.yeah.net)下载源程序研究一下。
    最后，我们就可以利用这些子程序进行加密了。


指南针月库数据生成器

标 题:修改主引导区--指南针月库数据生成器150试用版 (995字)
发信人:KINGSUN
时 间:2001-4-4 23:58:08
详细信息:
目前出现一个新的指南针月库数据生成器，程序名称：指南针月库数据生成器，作者是杨廷荣， 主页地址 http://cqytr181.533.net 邮件地址 cqytr@163.net。
注册费用：指南针月库数据生成器
1.指南针月库数据生成器（不含第2项）一年使用28元，长期使用38元。使用期
内免费升级。
2.每周邮件发送除权数据及相关数据文件（不含第1项）每年60元。
-----------------------------------------------------------
下载指南针月库数据生成器150试用版，不注册则提示只用到2001-3-31
日，不会出现问题。修改系统时间2001-01-01 ，启动指南针月库数据生成器150试用版，嘿嘿！！好戏开场！！告诉你执行有误，请按‘确认’OR ’忽若‘。确认以后出现几个CALL ************。现在进入高潮！！！！！！重新启动，我的硬盘不动了------这就是尾声。
为了一丁点注册费，竟修改主引导区，黑黑黑！！！！连CRACK不齿的事都干。请大家不要用该程序，这种人不应出现在网上，”笑傲江湖“中的君之剑”岳不群------现实虚拟版。
幸亏我的硬盘安装EZ-BIOS，使用0磁道备份/恢复功能，使硬盘起死回生，希望大家不要出现悲剧。
人啊！我是爱你们的，你们可要小心啊！

标 题:恶瘤在这里。 (802字)
发信人:小牧童
时 间:2001-4-7 22:25:05
详细信息:

恶瘤在这里

作者：小牧童[CCG]

:0001.37AE 9A7A06260D call 0D26:067A
:0001.37B3 83C402 add sp, 0002
:0001.37B6 8B1ED24C mov bx, [4CD2]
:0001.37BA 2E89471F mov cs:[bx+1F], ax
:0001.37BE 50 push ax
:0001.37BF 53 push bx
:0001.37C0 51 push cx
:0001.37C1 52 push dx
:0001.37C2 8B1ED24C mov bx, [4CD2]
:0001.37C6 B90800 mov cx, 0008 ／／好狠！！写8个扇区！！！
:0001.37C9 BA8000 mov dx, 0080 ／／写C盘
:0001.37CC B80103 mov ax, 0301
:0001.37CF 0E push cs
:0001.37D0 07 pop es
:0001.37D1 CD13 int 13 ／／让它运行，惨了。


AccelerateX5.0DEMO

标 题:转贴一个，linux 解密，www.zoudan.com (8千字)
发信人:菜鸟[BCG]
时 间:2001-4-14 19:20:05
详细信息:
AccelerateX5.0DEMO版之破解心得
网管中心的bbs服务器是基于RedHat5.1的Linux系统。作为临时bbs管理员，一天坐
在那里上比比哀思真的是很无聊。于是想用Xwindows来上万维网。但着台服务器偏偏是
讨厌的Sis 6236显卡，Xwindows根本就用不起，于是在沉淀的ftp上下了一个AccelerateX5.
0DEMO版。安装倒是非常的顺利，但讨厌的DEMO版非要在99年1月4号以前用。我把服务器的日
期调到1月4号之前则可以用，且效果很好！但作为bbs服务器，日期之重要，日期一变非但发
表文章不正常，每日排行榜也不能正常工作。那如何解决这个问题呢？把它搞定！！这么多
程序都是我可以轻松搞定的，区区一个AX算得了什么！在重起了N次gdb，重设了N次break
*0x804bxxx之后终于找到了关键的地方！千万不要以为断点是很好找的，特别是在Linux下。
找断点的功力需要在实践中长期练就，想当年的LOCK 89，90，91，95 NT，BitLOK，KeyMake
，LockMaster......都是在反跟踪措施非常严密的情况下步步跟踪到核心的。现在的程序有
个暴好的优点，那就是统统没有反跟踪代码！可以说是去除了破解软件的最大的困难，难度
从而降低了95%！那在Linux破解还有什么难度呢？难度是大大的，那就是：在Linux这种不太
成熟的操作系统下，连调试软件也是极其的难用！哪像Win95/DOS下大名鼎鼎的Soft-ice，
Turbo Debugger......像察看内存，修改内存这样的基本功能都没有！TMD！还有就是gdb下的
反汇编太伤脑筋了，看惯了Soft-ice和Debug下的汇编，看gdb下的真是像天书！还好，我功力
深厚，办法多:-)
来吧，切入正题，试试身手！
先启动Linux(废话)，登录(又是废话)，取得一定权限(如果你是root，那就方便多了，
俗话说得好“我是root我怕谁” xxx语)！
先看看你的AX50DEMO和我的一不一样！跟着作吧:-)
[~/]#cd /usr/X11R6/lib/X11/AccelerateX/bin
[/usr/X11R6/lib/X11/AccelerateX/bin]#gdb Xaccel-glibc ;用gdb调入AX50DEMO主程序
GNU gdb 4.17
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(no debugging symbols found)...
(gdb)disass _start 反汇编函数 _start（Linux下的程序基本上都是以_start
或_init开始的）

Dump of assembler code for function _start:
0x804b520 <_start>: xorl %ebp,%ebp
0x804b522 <_start+2>: testl %edx,%edx
0x804b524 <_start+4>: je 0x804b52d <_start+13>
0x804b526 <_start+6>: pushl %edx
0x804b527 <_start+7>: call 0x804b214 <atexit>
0x804b52c <_start+12>: popl %eax
0x804b52d <_start+13>: call 0x804ae24 <__libc_init_first>
0x804b532 <_start+18>: popl %esi
0x804b533 <_start+19>: leal 0x4(%esp,%esi,4),%eax
0x804b537 <_start+23>: movl %eax,0x80d33d8
0x804b53c <_start+28>: movl %esp,%edx
0x804b53e <_start+30>: andl $0xfffffff8,%esp
0x804b541 <_start+33>: pushl %eax
0x804b542 <_start+34>: pushl %eax
0x804b543 <_start+35>: pushl %edx
0x804b544 <_start+36>: pushl %esi
0x804b545 <_start+37>: call 0x804a750 <_init>
0x804b54a <_start+42>: pushl $0x80c3bb0
0x804b54f <_start+47>: call 0x804b214 <atexit>
0x804b554 <_start+52>: popl %eax
0x804b555 <_start+53>: call 0x804c96c <_start+5196>
0x804b55a <_start+58>: pushl %eax
0x804b55b <_start+59>: call 0x804b324 <exit>
0x804b560 <_start+64>: hlt
0x804b561 <_start+65>: nop
0x804b562 <_start+66>: nop
0x804b563 <_start+67>: nop
0x804b564 <_start+68>: pushl %ebp
0x804b565 <_start+69>: movl %esp,%ebp
0x804b567 <_start+71>: cmpl $0x0,0x80cdd8c
0x804b56e <_start+78>: jne 0x804b5a3 <_start+131>
0x804b570 <_start+80>: jmp 0x804b585 <_start+101>
0x804b572 <_start+82>: movl %esi,%esi
0x804b574 <_start+84>: addl $0x4,0x80cdd88
0x804b57b <_start+91>: movl 0x80cdd88,%eax
0x804b580 <_start+96>: movl 0xfffffffc(%eax),%eax
0x804b583 <_start+99>: call *%eax
0x804b585 <_start+101>: movl 0x80cdd88,%eax
0x804b58a <_start+106>: cmpl $0x0,(%eax)
0x804b58d <_start+109>: jne 0x804b574 <_start+84>
0x804b58f <_start+111>: pushl $0x80d2bd4
0x804b594 <_start+116>: call 0x80c397c <cbrt+3660>
0x804b599 <_start+121>: movl $0x1,0x80cdd8c
0x804b5a3 <_start+131>: leave
0x804b5a4 <_start+132>: ret
0x804b5a5 <_start+133>: leal 0x0(%esi),%esi
0x804b5a8 <_start+136>: pushl %ebp
0x804b5a9 <_start+137>: movl %esp,%ebp
0x804b5ab <_start+139>: leave
0x804b5ac <_start+140>: ret
0x804b5ad <_start+141>: leal 0x0(%esi),%esi
.......
.......
.......
0x804b776 <_start+598>: movl $0x63,0xffffef5c(%ebp)
0x804b780 <_start+608>: movl $0x3,0xffffef58(%ebp)
0x804b78a <_start+618>: movl $0x1,0xffffef54(%ebp)
0x804b794 <_start+628>: movl $0x0,0xffffef50(%ebp)
0x804b79e <_start+638>: movl $0x0,0xffffef4c(%ebp)
0x804b7a8 <_start+648>: movl $0x1,0xffffef48(%ebp)
0x804b7b2 <_start+658>: movl $0xffffffff,0xffffef68(%ebp)
0x804b7bc <_start+668>: pushl %eax
0x804b7bd <_start+669>: call 0x804ade4 <mktime> ;获得时间
0x804b7c2 <_start+674>: addl $0x4,%esp
0x804b7c5 <_start+677>: cmpl $0xffffffff,%eax ;调用成功否?eax为返回值
0x804b7c8 <_start+680>: je 0x804b7d2 <_start+690>
0x804b7ca <_start+682>: cmpl %eax,0xffffeaec(%ebp)
0x804b7d0 <_start+688>: jle 0x804b7dc <_start+700> ;小于则转到_start+700
0x804b7d2 <_start+690>: pushl $0xffffffff ;失败标志'-1'入栈
0x804b7d4 <_start+692>: call 0x804c948 <_start+5160> ;失败处理并退出
0x804b7d9 <_start+697>: addl $0x4,%esp
0x804b7dc <_start+700>: pushl $0x13880000 ;进入主程序
0x804b7e1 <_start+705>: call 0x804ed80 <_start+14432>
0x804b7e6 <_start+710>: addl $0x4,%esp
0x804b7e9 <_start+713>: testl %eax,%eax
0x804b7eb <_start+715>: jne 0x804b7fa <_start+730>
0x804b7ed <_start+717>: pushl $0x80c3ce4
0x804b7f2 <_start+722>: call 0x8092674 <ffs+221348>
0x804b7f7 <_start+727>: addl $0x4,%esp
.......
.......
.......
q 这是退出命令
[/usr/X11R6/lib/X11/AccelerateX/bin]#
既然关键的地方找到了！那就该改原代码了。在dos/win95下要改代码很简单，先获得
指令的16进制代码，在调试器或16进制编辑器中查找到直接改掉即可！但在Linux下就......
还好我还没把我的M$ dos和Win95丢掉。跟着我作吧！
[/usr/X11R6/lib/X11/AccelerateX/bin]#mount /dev/fd0 -tvfat /mnt/fd ;插入软盘把软驱
蟒上(在目录/mnt/fd)
[/usr/X11R6/lib/X11/AccelerateX/bin]#cp Xaccel-glibc /mnt/fd ;把主文件考到软盘上
[/usr/X11R6/lib/X11/AccelerateX/bin]#umount /dev/fd0 ;卸下
(或直接把dos/win95的分区mount上，拷贝之，如果管理员给了你这个权限)
重起计算机或换台计算机，把软盘上的程序考到硬盘上！启动我最喜爱的，大名鼎鼎的
，最拉风的，最芭腊的Soft-ice（千万不要告诉我你不会启动Soft-ice，我cow，信不信我一刀
捅死你）！用Soft-ice的装入器(一般是Symbol Loader.exe)随便调入一个32为的程序(如calc.
exe).用a命令(汇编)把关键部分的指令(就是上面写的，但要翻译成一般的汇编格式)输入:
xxxxxxxx:cmp [ebp+0ffffeaec],eax ;就是cmpl %eax,0xffffeaec(%ebp)啦
xxxxxxxx:jle XXXXXXXX ;XXXXXXXX乱填
xxxxxxxx:jge XXXXXXXX ;XXXXXXXX乱填
在用code on命令把指令的16进制代码显示出来！
xxxxxxxx:3985eceaffff cmp [ebp+0ffffeaec],eax
~~~~~~~~~~~~记下该16进制代码
xxxxxxxx:7exx jle XXXXXXXX
~~~~~~~~~~~~记下该16进制代码
xxxxxxxx:7dxx jgl XXXXXXXX
~~~~~~~~~~~~记下该16进制代码
用exit命令强行退出（会获得一个非法指令错误，不理它）
看到这里，看官们都知道了，只要把jle 0x804b7dc <_start+700>改成
jge 0x804b7dc <_start+700>就可以了！
也就是把7e改成7d即可！
有人会说原理好~简单，但步骤好~复杂！我也没更好~办法，其实破解Linux程序的一般步
骤就只有这样了，将就用吧！但是看官你需要作的很简单：
1。把主程序Xaccel-glibc考到硬盘上
2。用不管什么编辑器修改，查找3985eceaffff7e，改为3985eceaffff7d，存盘。
3。把Xaccel-glibc考回去，覆盖之

好了好了！写这么多字，好辛苦哟（我打字极慢，用全拼，还分不清前鼻音后鼻音，卷
舌音，翘舌音......痛苦异常，速度可想而知，！）这全是为了全xx类，为了我国的xx技术，为
了早日实现xx的现代化......
上篇大作不知各位看了没有，没看？那肯定4月26日遭惨了！还不看？“Cih1.4病毒之
中文详解”，快去下吧:ftp://202.115.32.2/incoming/tpo/cih14.asm或到我的主页上去瞧瞧:
http://bbs.scu.edu.cn/~tpo好东西多多哟(Email:zd_dan@263.net)！
鉴于cih病毒再次的爆发流行和4月26日的惨痛教训，我决定把cih病毒的发作模块好身
剖析一下，再把遭cih清洗的硬盘的恢复方法好好研究一下，写成文章张贴出来！
各位看官，敬请期待我的大作吧！下次再见咯！


新书介绍

首页＞＞
定价：￥40.00元
加密与解密--软件保护技术及完全解决方案(含光盘)
【作译者】 | 看雪编著
【出版社】 | 电子工业出版社
【书号】 | 5053-6923-7/TP.3948
【出版日期】 | 2001-09
【所属类别】 | 计算机专业人员书库

【印张】 | 25.75
【字数千】 | 659
【页数】 | 399
【开本】 | 16开
【版次】 | 1-1
内容简介
     软件保护工作是维护软件开发人员利益的必要手段，是软件开发过程中的重要环节。本书讲述Windows环境下的软件保护技术及相关解决方案。全书共分为3个部分。第一部分介绍与软件保护技术相关的基础知识；第二部分讲述各种软件保护方式，如序列号、时间限制、CRC、SMC及各种加密算法，并且还介绍了注册表、VB保护程序的特点。第三部分主要介绍脱壳的基本技巧，以及一些大型商业软件保护的实例。 本书是国内密界一流好手的呕心之作，通过解析大量的实例来展示软件调试的最深处，是软件开发人员不可多得的读物。
图书目录

序言/前言

Copyright © 2000-2001 KanXue Studio All Rights Reserved.


Winice Loader

 标 题:好久没有来了，看看这个。呵呵！ (3千字)
发信人:EBjump
时 间:2000-9-5 19:52:53
详细信息:
Winice Loader Readme file (Beta 2)
------------------------------------

This utility is a small loader designed to load Winice on Windows
Millennium, without the need of the checked build of io.sys, which is part
of the Millennium DDK (Microsoft has made a simplified version of the DDK
available at http://www.microsoft.com/ddk/debugging/download/WINMEDDK.EXE,
you decide if you go with this loader or the Microsoft/NuMega solution).

---------------
1. Installation
---------------

1. Install Softice for Windows Millennium normally. Make sure that
winice.exe, winice.dat and siwvid.386 files are present in the Windows root
directory. Don't rename winice.exe to anything else, the loader expects to
find "winice.exe". Configure video display and mouse as usual.

2.Copy the file loader.exe into %WINDIR%\SYSTEM\VMM32\ folder.

3.Reboot your system.

-----------------------------
2. Errors and troubleshooting
-----------------------------

The utility relies on the %winbootdir% environment variable, and needs
it to point to the Windows root folder. The Millennium io.sys versions which I
checked all define this variable and correctly initialize it. If the Winice
loader cannot find it, it will complain about it, but will continue to boot
Windows normally.
If winice.exe is not found (e.g. Softice was uninstalled), the loader
will transparently continue to boot Windows.
If winice.exe fails execution for whatever reason (such as no XMS
present, insufficient memory...) the user will be prompted by io.sys for
the name of the Windows loader. Just enter at the prompt:

%WINDIR%\SYSTEM\vmm32.vxd

This will boot Windows normally.

In the event that your %WINDIR%\system\vmm32\ folder already contains
a loader.exe file, DO NOT overwrite it with our loader. Please write down if
your Windows is a special OEM build, the build number, and send us this info,
attaching your io.sys and loader.exe.
Since this utility interferes with the boot process of Windows
Millennium, it is a good idea to have a rescue disk ready. If the system crashes
or does not boot in a reasonable amount of time, boot from floppy and delete
loader.exe. Keep in mind that we are not responsible for any damage this
utility causes to you, your data, your mental sanity or global warming. It
was written for ourselves, but we decided to release it because many crackers
wanted to use Windows Millennium and Winice.
This utility was tested using Windows Millennium builds 2525 and 3000
and Winice for Windows Millennium 4.0.5 builds 334 and 410. Beyond these
versions there is no guarantee that the loader will work, because certain
things we rely on might change. Yet mail us the build numbers, and we will
fix the utility. Also, please report any anomalies while using Winice loaded
this way.

The source code is provided for educational purposes only. Distribution
of modified versions is strictly prohibited.

Best regards , Icedump team

(C) 2000 Iceman [UKC] and rest of Icedump Team. All rights reserved.

标 题:http://pleiku.vietmedia.com/protoools/files/debuggers/wmldr.zip (空)
发信人:WinDos2K
时 间:2000-9-13 13:44:33
详细信息:

标 题:SICE in Win98ME安装成工 !! (312字)
发信人:WinDos2K
时 间:2000-9-14 14:05:13
详细信息:

安装过程如下:
1 正常安装W98ME,如在C:\WIN98ME.
2 如常安装WSICE405 Build 334.
3 COPY WINICE.EXE , WINICE.DAT , SIWVID.386
3 FILES 到 C:\WIN98ME下.
4 从WMLDR.ZIP内,UNZIP LOADER.EXE,COPY这FILE到
C:\WINME98\SYSTEM\VMM32\ 下.
5 REBOOT SYSTEM.

我的ME是Build 2535,没有试Numega的方法 .
如有向题,可发贴子.


Asprotect ver1.1

 标 题:关于用asprotect ver1.1 压缩过的程序的人口的寻找 (4千字)
发信人:liuhx
时 间:2000-10-24 13:54:52
详细信息:
昨天晚上，看了一篇E文的文章，关于asprotect version 1.0版的脱壳的内容，看到里面的Import Table重建实在是复杂，本人能力有限，暂不打算去做。
由于刚好我的手边有asprotect version1.1版，今天早上上班后，决定试试找它压缩过的程序的Entry Point(EP)。花上一些时间以后，竟然小有收获，找到一种方法能比较快地定位程序的EP，不敢独享，在这里特写出来献给大家。
我先用asprotect把Notepad.Exe压缩，试着来找它的EP，找到方法后，把Calc.exe和cdplayer.exe压缩再来找EP作为验证，证明这种方法应该是正确的。
下面是我用压缩过的Notepad.exe找EP的的过程。

015F:00690E99 8D4000 LEA EAX,[EAX+00]
015F:00690E9C 55 PUSH EBP (A) <-----按2次F12后，返回到这里
015F:00690E9D 8BEC MOV EBP,ESP
015F:00690E9F 83C4F4 ADD ESP,-0C
015F:00690EA2 E88922FFFF CALL 00683130
015F:00690EA7 0F855F2FFFFF JNZ 00683E0C
015F:00690EAD E81634FFFF CALL 006842C8
015F:00690EB2 E8917BFFFF CALL 00688A48
015F:00690EB7 E86489FFFF CALL 00689820
015F:00690EBC E8BFACFFFF CALL 0068BB80
015F:00690EC1 E8462FFFFF CALL 00683E0C (B)<---注意这里的EIP
015F:00690EC6 8BE5 MOV ESP,EBP
015F:00690EC8 5D POP EBP
015F:00690EC9 C20C00 RET 000C
015F:00690ECC 0000 ADD [EAX],AL
015F:00690ECE 0000 ADD [EAX],AL
015F:00690ED0 0000 ADD [EAX],AL
015F:00690ED2 0000 ADD [EAX],AL
1. 先用 bpx getprocaddress进行中断。然后运行压缩过的Notepad.exe。按5次F5后，把刚才设的中断先 BD 掉，再按2次 F12到达上面（A）的地方。往下面看，有几条语句，然后是连续的几个CALL语句，注意最后面的CALL语句（（B）的地方的）的地址是xxxx0EC1。这里要说明一下，由于notepad.exe 这个程序比较小，按5次F5即可以，如果程序比较大的话，要按更多次的F5，但这里有个标准就是，按2次F12返回后，如果没有上面的几个CALL语句，说明还要 BE 刚才设的断点，继续按几次F5，然后再 BD刚才的断点，再按F12两次，直到符合要求。这个要求就是有连续的几个CALL语句，而且最后的CALL语句的EIP是xxxx0EC1。

015F:0068D59D E8C26EFFFF CALL 00684464 (C)<---注意这里的EIP 和上面的EIP的关系，在这里设置断点。
015F:0068D5A2 8B4308 MOV EAX,[EBX+08]
015F:0068D5A5 8BD6 MOV EDX,ESI
015F:0068D5A7 E85CE9FFFF CALL 0068BF08
015F:0068D5AC 8B4B08 MOV ECX,[EBX+08]
015F:0068D5AF 83C106 ADD ECX,06
015F:0068D5B2 8BC1 MOV EAX,ECX
015F:0068D5B4 668B10 MOV DX,[EAX]
015F:0068D5B7 663B15D8136900 CMP DX,[006913D8]
015F:0068D5BE 7414 JZ 0068D5D4
015F:0068D5C0 663B1424 CMP DX,[ESP]
015F:0068D5C4 7506 JNZ 0068D5CC
015F:0068D5C6 89442404 MOV [ESP+04],EAX
015F:0068D5CA EB11 JMP 0068D5DD
015F:0068D5CC 8B5802 MOV EBX,[EAX+02]
015F:0068D5CF 83C306 ADD EBX,06
015F:0068D5D2 03CB ADD ECX,EBX
2. 现在根据（B）处的地址用下面的方法算出另外一个地址，新地址前4位是把xxxx－1，这里是0069－1＝0068，后面4位是D59D，这样算出的另外一个地址是0068d59d。在这个地址（上面（C）的地方）处设断。

015F:0068F863 5B POP EBX
015F:0068F864 6A10 PUSH 10
015F:0068F866 E8DDFEFFFF CALL 0068F748
015F:0068F86B 50 PUSH EAX
015F:0068F86C E8CFFEFFFF CALL 0068F740
015F:0068F871 50 PUSH EAX
015F:0068F872 6A00 PUSH 00
015F:0068F874 E8D7FEFFFF CALL 0068F750
015F:0068F879 53 PUSH EBX
015F:0068F87A 50 PUSH EAX
015F:0068F87B C3 RET (D)<--- 按4次F12后将返回到这里
3. 按6次F5后，再按4次F12，到上面（D）的地方，压缩程序就是从这里进入原来的程序的，也就是说，在这里按F10就到了Entry Point 。

上面%D


crack 论坛

 让联想账号在普通机器上使用
冰河2.2(ducksun专版)的通用密码很多人都很感兴趣呀，但是用它来搞到联想的账号没法用怎么办呀?跟我来吧:)，我又要做坏事了，555...
联想的账号只能在联想的机器上用，而且它有自己的一套拨号程序，不能在其他普通机器上用。破这种东西同破解普通密码一样，而且比解普通密码要简单。
首先，要搞来一套联想的拨号程序，运行之，建立新账号，起名legend，密码78787878(这是瞎填的),按ctrl+d进s-ice，下s 30:0 l ffffffff '78787878',搜到一个地址，下bpm 搜到的这个地址，点拨号后立刻被拦下，按几下f12进入dial的地盘，再按几次f12，当程序走到如下所示，不跳的话就over了，所以我们强制让它跳

476e9b test al,al
476e9d jnz 476ec1 ->jmp 476ec1
476e9f mov eax,doword ptr [483048]

完活

整理一下：

要修改文件：dial.exe
要修改文件大小：741,376 字节

用winhex等16进制编辑器修改

查找：84c07522a148304800
改成：84c0eb22a148304800

我想改完以后就应该能用了吧，谁有联想账号，试试去^-^

我本来不想写这些东西的，肯定被很多人骂，还要得罪很多人,不要找我要冰河密码，我不说。但是我想像我这样的初学者还是多数吧，多学点技术，有人愿意跟我分享账号我没意见啦^-^。学习crack技术是很枯燥的事，我只想给各位增加一点兴趣和动力，好好享受一下成功的喜悦吧。看雪兄能使crack普及教育，真是很厉害，各位慢慢学吧。这是本月最后一次灌水，过两天要考试，我一点都不会，要从头看一学期的东西，要我命呀，都是星际争霸闹的，天天去cgol战网打，谁有兴趣谁跟我切磋一下，手下留情，我作弊太多，已经不给我加胜绩了，我可不想败太多次^-^

另一版本

472631 jnz 472655

查找：84c07522a100e04700
改成：84c0eb22a100e04700


KILL防火墙

标 题:KILL出品的新防火墙软件安装破解方法 (1千字)
发信人:Jacky_Wu
时 间:2001-2-4 21:07:38
详细信息:
1.运行FPEsetup.exe后，在C:\Windows\Temp\Disk1目录中找到CDKTST.ese文件(该文件是关键);
2.用W32dsm89进行反编译并可找出代码如下：
Possible StringData Ref from Data Obj ->"Decrypt Result : Hex [0x%08X] "
->" Dec [%d]
"
|
:004011A9 6814814000 push 00408114
:004011AE E8D9010000 call 0040138C
:004011B3 83C418 add esp, 00000018
:004011B6 3BF5 cmp esi, ebp
:004011B8 0F85DD000000 jne 0040129B >>>>>>>>>>>>>跳则提示安装出错，
不跳则能继续安装。
故只需把jne改为je。 :004011BE 8D542428 lea edx, dword ptr [esp+28]
:004011C2 52 push edx

3.用UltraEdit-32查找
3BF50F85DD0000008D542428
^^
改为 3BF50F84DD0000008D542428
^^

标 题:关于时间限制的破解! (389字)
发信人:gfh[CCG]
时 间:2001-2-4 23:17:08
详细信息:

唉!我本打算写一篇教程的,但现在不用了,已经有人写的,我这里只谈一下好何
让它没有时间限制.
修改eFPE.exe文件. 修改如下代码即可.
找: FC007448837D
^^
改: ....EB......


Turbo Browser 2001 V8.0

标 题:暴破 Turbo Browser 2001 V8.0 (8千字)
发信人:Fpc
时 间:2001-4-17 19:46:33
详细信息:
暴破 Turbo Browser 2001 V8.0
作者: Fpc @2001/04/17
工具：SoftIce 4.05，W32dasm 8.93，Hedit 2.0，Exescope
目标：解除30天试用限制，但还不清楚注册机制

软件名称：Turbo Browser Ver 8.0 Build 110325
作 者: FileStream Inc.
文件大小：1,823KB
授权方式：共享软件
使用平台：Win95/98
主文件名：Turbob.exe

软件简介：类资源管理器，功能强大

下载地址：http://software.wx88.net/down/tb2k1et8.exe

这是个类资源管理器类软件，比较肥大，当然功能比较多，我也没试过是否方便，我们只关注它的保护方式。对不起大家，没找到注册机制，只好暴掉了：-（

1、用Hedit把它打开，简单浏览一下。这一步是必要的，因为这有助于知道下一步该怎样做。浏览中能找到一些字符串，在结尾处是一些对话框，初步断定没有被压缩，一个仁慈的敌人^_^
2、运行TB，它只能用30天（当然在这台机器上不是的^_^）,没有NAG，没有功能限制，也没有输入注册码的对话框 *_*。退出，将日期调后一年，再运行，出现对话框，内容“This trial version of TB has expired....”。记下这个对话框，关闭，并将系统时间改回。
3、用Exescope打开TB，能找到过期对话框的ID是3307（DEC），再找字符串。~~~好长一列，从头到尾，没有有用的，那只有从这个对话框入手。
4、Fire Up W32Dasm DeCompile，好慢，在 PII机器上用了5、6分钟才完成，找对话框0CEBh，双击之，在046162F处有调用；再双击，在0464B3A有调用，不过看此处的上下关联内容，这个不是。好了，只有这两处。
5、下面用SI的Symbol Loader载入TB，下BPX 46162F，F5运行程序，正常。关闭TB，将日期调后一年，再载入，F5运行，这次立刻被SI拦到，哈！找对了。下面是此处的程式码：

* Referenced by a CALL at Address:
|:004CB5EA
|
:0046161B B89B455400 mov eax, 0054459B
:00461620 E83FED0700 call 004E0364
:00461625 51 push ecx
:00461626 56 push esi
:00461627 8BF1 mov esi, ecx
:00461629 FF7508 push [ebp+08]
:0046162C 8975F0 mov dword ptr [ebp-10], esi

* Possible Reference to Dialog: DialogID_0CEB
|

* Possible Reference to Dialog: DialogID_0129, CONTROL_ID:0CEB, "&Exact (=)"
|
:0046162F 68EB0C0000 push 00000CEB
:00461634 E8B92B0A00 call 005041F2
:00461639 8365FC00 and dword ptr [ebp-04], 00000000
:0046163D 8D4E5C lea ecx, dword ptr [esi+5C]
:00461640 E8748B0600 call 004CA1B9
:00461645 8D8EB0000000 lea ecx, dword ptr [esi+000000B0]
:0046164B C645FC01 mov [ebp-04], 01
:0046164F E8658B0600 call 004CA1B9
:00461654 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00461657 C70638B45500 mov dword ptr [esi], 0055B438
:0046165D 8BC6 mov eax, esi
:0046165F 5E pop esi
:00461660 64890D00000000 mov dword ptr fs:[00000000], ecx
:00461667 C9 leave
:00461668 C20400 ret 0004

看上面的REFERENCE，到04CB5EA处：
:004CB5BF 8D4DEC lea ecx, dword ptr [ebp-14]
:004CB5C2 E86C970300 call 00504D33
:004CB5C7 8D85ACFCFFFF lea eax, dword ptr [ebp+FFFFFCAC]
:004CB5CD 50 push eax
:004CB5CE E865910100 call 004E4738
:004CB5D3 59 pop ecx
:004CB5D4 898690000000 mov dword ptr [esi+00000090], eax
:004CB5DA E824DDFFFF call 004C9303
:004CB5DF 85C0 test eax, eax
:004CB5E1 7563 jne 004CB646
:004CB5E3 53 push ebx
:004CB5E4 8D8DB0FDFFFF lea ecx, dword ptr [ebp+FFFFFDB0]
:004CB5EA E82C60F9FF call 0046161B
:004CB5EF 8D8DB0FDFFFF lea ecx, dword ptr [ebp+FFFFFDB0]
:004CB5F5 C645FC01 mov [ebp-04], 01
:004CB5F9 E8A98C0300 call 005042A7
:004CB5FE 51 push ecx
:004CB5FF 8BCC mov ecx, esp
:004CB601 8965EC mov dword ptr [ebp-14], esp

很明显那个call 004C9303值得怀疑，出口的Eax=0是Bad Guy：

* Referenced by a CALL at Address:
|:004CB5DA
|
:004C9303 56 push esi

* Possible StringData Ref from Data Obj ->"fsutil80.dll"
|
:004C9304 682CAA5A00 push 005AAA2C

* Reference To: KERNEL32.LoadLibraryA, Ord:01C2h
|
:004C9309 FF15FC045500 Call dword ptr [005504FC]
:004C930F 85C0 test eax, eax
:004C9311 7479 je 004C938C

* Possible StringData Ref from Data Obj ->"Init"
|
:004C9313 6824AA5A00 push 005AAA24
:004C9318 50 push eax

* Reference To: KERNEL32.GetProcAddress, Ord:013Eh
|
:004C9319 FF1500055500 Call dword ptr [00550500]
:004C931F 85C0 test eax, eax
:004C9321 A3946A5B00 mov dword ptr [005B6A94], eax
:004C9326 7464 je 004C938C

* Possible StringData Ref from Data Obj ->"Warning"
|
:004C9328 BE1CAA5A00 mov esi, 005AAA1C
:004C932D 6A00 push 00000000
:004C932F 56 push esi

* Possible Reference to Dialog: DialogID_008F, CONTROL_ID:006F, ""
|

* Possible Reference to String Resource ID=00111: "Default"
|
:004C9330 6A6F push 0000006F
:004C9332 E83B3CFAFF call 0046CF72
:004C9337 59 pop ecx
:004C9338 8B0D786B5B00 mov ecx, dword ptr [005B6B78]
:004C933E 50 push eax
:004C933F E8EEAE0500 call 00524232 <- 检查注册表中有无 Warning 项
:004C9344 33C9 xor ecx, ecx <- 不过EAX的返回值在下面的CALL中不起作用
:004C9346 85C0 test eax, eax <- 偶不知道这是什么原因，只好暴破

注册表中的这一项是手工加上去的：
REGEDIT4

[HKEY_CURRENT_USER\Software\FileStream\Turbo Browser\8\Default]
"warning"=dword:00000100

:004C9348 0F94C1 sete cl
:004C934B 51 push ecx
:004C934C FF15946A5B00 call dword ptr [005B6A94] <- 这个CALL用于计算是否过期
<- 如不过期,EAX=3（唯一正确的返回值）;过期则EAX=0；而EAX=1则注册表中有Warning 项

:004C9352 83E800 sub eax, 00000000 <- 暴破改这里 PUSH 03；POP EAX（6A 03 58）
:004C9355 7435 je 004C938C <- INC EAX；DEC EAX （40 48）--其实是NOP
:004C9357 48 dec eax
:004C9358 7432 je 004C938C
:004C935A 48 dec eax
:004C935B 7405 je 004C9362
:004C935D 48 dec eax
:004C935E 752C jne 004C938C
:004C9360 EB25 jmp 004C9387

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C935B(C)
|

* Possible Reference to String Resource ID=00255: "Shell|*.sh;*.conf|"
|
:004C9362 6AFF push FFFFFFFF
:004C9364 6A00 push 00000000
:004C9366 6896EF0000 push 0000EF96
:004C936B E85E640400 call 0050F7CE

* Possible Reference to String Resource ID=00001: "File Save As"
|
:004C9370 6A01 push 00000001
:004C9372 56 push esi

* Possible Reference to Dialog: DialogID_008F, CONTROL_ID:006F, ""
|

* Possible Reference to String Resource ID=00111: "Default"
|
:004C9373 6A6F push 0000006F
:004C9375 E8F83BFAFF call 0046CF72
:004C937A 59 pop ecx
:004C937B 8B0D786B5B00 mov ecx, dword ptr [005B6B78]
:004C9381 50 push eax
:004C9382 E8CA660400 call 0050FA51

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C9360(U)
|

* Possible Reference to String Resource ID=00001: "File Save As"
|
:004C9387 6A01 push 00000001
:004C9389 58 pop eax
:004C938A 5E pop esi
:004C938B C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004C9311(C), :004C9326(C), :004C9355(C), :004C9358(C), :004C935E(C)
|
:004C938C 33C0 xor eax, eax
:004C938E 5E pop esi
:004C938F C3 ret

暴破只要改主文件的0XC9352处，改为：6A 03 58 40 48

这样处理后就没有期限限制，但主窗口还是显示（Trial version），这好办：在其主文件中找 T r i a l （中间不是空格，是0X00）,第一处的不是，将第二处的改为 F u c k ！，这回可以了吧。


3DMark2001

标 题:3DMark2001注册机源代码（C++ Build 5.0编译通过） (1千字)
发信人:时空幻影
时 间:2001-4-18 14:37:05
详细信息:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Passcode="ABCDEFHJKLMNPQRSTUVWXYZ0123456789";
AnsiString r;
AnsiString s1,s2,s3,s4;
int i,k,t1,t2,t3,m[5];
if (Edit1->Text=="") r="shikonghuanying@sina.com";
else
{
r=Edit1->Text.Delete(6,2);
r=r.Delete(11,2);
r=r.Delete(16,2);
r=r.Delete(3,1);
}
for (i=1,t1=0;i<5;i++)
{
k=int(r[i])%0x21;
t1=t1+k;
s1=s1+Passcode[k+1];
}
s1=s1+Passcode[t1%0x21+1];
for (i=6,t2=0;i<10;i++)
{
k=int(r[i])%0x21;
t2=t2+k;
s2=s2+Passcode[k+1];
}
s2=s2+Passcode[t2%0x21+1];
for (i=11,t3=0;i<15;i++)
{
k=int(r[i])%0x21;
t3=t3+k;
s3=s3+Passcode[k+1];
}
s3=s3+Passcode[t3%0x21+1];
m[0]=(t1+t2+t3)%0x21;
m[1]=(t2+t3+m[0])%0x21;
m[2]=(t3+m[0]+m[1])%0x21;
m[3]=(m[0]+m[1]+m[2])%0x21;
m[4]=(m[1]+m[2]+m[3])%0x21;
s4+=Passcode[m[0]+1];
s4+=Passcode[m[1]+1];
s4+=Passcode[m[2]+1];
s4+=Passcode[m[3]+1];
s4+=Passcode[m[4]+1];
Edit1->Text=s1+"-"+s2+"-"+s3+"-"+s4;
}
//---------------------------------------------------------------------------