看雪学苑

《看雪学院 》

制作说明
1. 本论坛精华手册由收集了看雪技术论坛 2000.7.1 ～ 2000.8.31 期间的精华内容，共175余篇原创文章。
2. 本论坛精华手册中的所有内容，个人用户可以免费的收藏、参考，但是谢绝任何商业网站及传统媒体（如出版物）摘编转载！！！
3. 未经看雪学院的授权许可，任何人不得擅自进行篡改、反编译，及将其全部或部分用于商业用途或把本精华手册收录到出版物内。
4. 本精华手册内收录的帖子及图片的相关版权归各版权所有人所有。
5. 欢迎在保持论坛精华手册的完整下散发该教学包。
6. 本精华手册所有文章仅为学习研究软件内含的设计思想和原理。对于您使用本精华中技术所导致的一切后果我们不负任何责任！
7. 特别感谢论坛中的各位版主在论坛辛勤的工作及所有网友对论坛的支持，没有你们的帮助，论坛是无法得到发展及壮大的，也感谢所有将自己的经验无私奉献的朋友们。
8. 其他各类事宜，所有解释权归看雪学院及其论坛或相关的论坛注册用户所有。

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

2000月9日2完稿

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


关于看雪学院

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

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

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

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


'net PAL 1.2C

 标 题:'net PAL 1.2C注册码破解,可是我用它拨了15分钟还没上来,用WIN98自带的很快就上来了. (4千字)
发信人:小楼
时 间:2000-7-26 0:00:25
详细信息:
'net PAL 1.2C注册码破解

由于近日持续遇见拨号上网难以接入的问题,今天终于从网上拉了一个强力拨号软件'NET PAL1.2C.
这个软件需要注册,否则只能使用30天.
bpx hmemcpy
F12 11下,以后我们来到
:00417EB4 E8CA340000 call 0041B383 <--比较用户名输入否?
:00417EB9 85C0 test eax, eax
:00417EBB 7413 je 00417ED0

:00417ED4 E8AA340000 call 0041B383 <--比较注册码输入否?
:00417ED9 85C0 test eax, eax
:00417EDB 7413 je 00417EF0

:00417F28 E8EF0D0000 call 00418D1C <--比较核心,F8进入

:00418D62 83F845 cmp eax, 00000045 <--???
:00418D65 7529 jne 00418D90
:00418D67 8B4514 mov eax, dword ptr [ebp+14]
:00418D6A 40 inc eax
:00418D6B 50 push eax
:00418D6C 8D45C8 lea eax, dword ptr [ebp-38]
:00418D6F 50 push eax

* Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:00418D70 FF1598D24300 Call dword ptr [0043D298]
:00418D76 66C745E80100 mov [ebp-18], 0001
:00418D7C 6A1E push 0000001E
:00418D7E FF7510 push [ebp+10]
:00418D81 6A07 push 00000007
:00418D83 FF7508 push [ebp+08]
:00418D86 E8CAF8FFFF call 00418655
:00418D8B 8945BC mov dword ptr [ebp-44], eax
:00418D8E EB25 jmp 00418DB5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418D65(C)
|
:00418D90 FF7514 push [ebp+14]
:00418D93 8D45C8 lea eax, dword ptr [ebp-38]
:00418D96 50 push eax

* Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:00418D97 FF1598D24300 Call dword ptr [0043D298]
:00418D9D 668365E800 and word ptr [ebp-18], 0000
:00418DA2 6A1E push 0000001E
:00418DA4 FF7510 push [ebp+10]
:00418DA7 FF750C push [ebp+0C]
:00418DAA FF7508 push [ebp+08]
:00418DAD E8A3F8FFFF call 00418655
:00418DB2 8945BC mov dword ptr [ebp-44], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418D8E(U)
|
:00418DB5 6A2D push 0000002D
:00418DB7 8D45C8 lea eax, dword ptr [ebp-38]
:00418DBA 50 push eax
:00418DBB E860680000 call 0041F620
:00418DC0 59 pop ecx
:00418DC1 59 pop ecx
:00418DC2 8945EC mov dword ptr [ebp-14], eax
:00418DC5 8365B800 and dword ptr [ebp-48], 00000000
:00418DC9 837DEC00 cmp dword ptr [ebp-14], 00000000
:00418DCD 742F je 00418DFE
:00418DCF 8B45EC mov eax, dword ptr [ebp-14]
:00418DD2 802000 and byte ptr [eax], 00
:00418DD5 8B45EC mov eax, dword ptr [ebp-14]
:00418DD8 40 inc eax
:00418DD9 8945EC mov dword ptr [ebp-14], eax
:00418DDC 6A2D push 0000002D
:00418DDE FF75EC push [ebp-14]
:00418DE1 E83A680000 call 0041F620
:00418DE6 59 pop ecx
:00418DE7 59 pop ecx
:00418DE8 8945B8 mov dword ptr [ebp-48], eax
:00418DEB 837DB800 cmp dword ptr [ebp-48], 00000000
:00418DEF 740D je 00418DFE
:00418DF1 8B45B8 mov eax, dword ptr [ebp-48]
:00418DF4 802000 and byte ptr [eax], 00
:00418DF7 8B45B8 mov eax, dword ptr [ebp-48]
:00418DFA 40 inc eax
:00418DFB 8945B8 mov dword ptr [ebp-48], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00418DCD(C), :00418DEF(C)
|
:00418DFE 6A0A push 0000000A
:00418E00 6A00 push 00000000
:00418E02 8D45C8 lea eax, dword ptr [ebp-38]
:00418E05 50 push eax
:00418E06 E84F7A0000 call 0042085A
:00418E0B 83C40C add esp, 0000000C
:00418E0E 8945F4 mov dword ptr [ebp-0C], eax
:00418E11 8B45F4 mov eax, dword ptr [ebp-0C]
:00418E14 3B45BC cmp eax, dword ptr [ebp-44] <--比较注册码
:00418E17 0F85DB010000 jne 00418FF8

所以
name: xiaolou[CCG]
serial: 1895830

此外,有个奇怪问题, 从HELP文件中得知, 注册分个人用户与团体用户两种, 我猜
:00418D62 83F845 cmp eax, 00000045 <--???
处,即第一个字母为E,就是团体用户,可是这样得到的注册码输入后,程序告诉我出现一个"致命错误", 并要我上报"BUG FILE".
who know???


1tox

 标 题:1tox注册法（简单） (1千字)
发信人:backboy
时 间:2000-8-5 14:19:53
详细信息:
一个不错的文件分割与合并工具，可在华军软件园下载。网上已有破解，但那是暴力破解法。
程序破解难度不太，程序注册后产生一个名为1TOX.LIC的文本文件，注册信息保存在内。
1.暴力破解法：
改 83C4043BC1742E6A10
83C4043BC1752E6A10
2.注册码找法：
在 0167：00409950 CMP EAX，ECX （此时直接下 R EAX ECX也可）
？ EAX 输入的注册码
？ ECX 真正的注册码
相应的程序代码如下
:004098AF 8D442414 lea eax, dword ptr [esp+14]
:004098B3 8D4C2468 lea ecx, dword ptr [esp+68]
:004098B7 50 push eax 此处的EAX为输入的NAME

* Possible StringData Ref from Data Obj ->"1toX"
|
:004098B8 6868844200 push 00428468
:004098BD 51 push ecx 此处ECX为输入的FIRST NAME
:004098BE 8D9424B8060000 lea edx, dword ptr [esp+000006B8]
。
。
:0040992C 8B442410 mov eax, dword ptr [esp+10]
:00409930 8D9424BC000000 lea edx, dword ptr [esp+000000BC]
:00409937 35F0BD6824 xor eax, 2468BDF0
:0040993C 52 push edx
:0040993D A308C94200 mov dword ptr [0042C908], eax
:00409942 E8010E0100 call 0041A748 计算注册码的CALL
:00409947 8B0D08C94200 mov ecx, dword ptr [0042C908]
:0040994D 83C404 add esp, 00000004
:00409950 3BC1 cmp eax, ecx 此处的ECX为你想要的。
:00409952 742E je 00409982 不等就注册不成功
:00409954 6A10 push 00000010

另此程序的注册有个怪现象，你可在00409950处下R ECX EAX程序注册成功，在程序的ABOUT项中显示的注册码为你
输入的假码，重新启动后程序依然为注册版（假码也可注册？）。只要一改动或删除1TOX.lic文件，就可成为非注册版。

另WINPATCH1。2的注册码可在0167：0041CA37 PUSH EBP 时 D EAX 得到。（一个好用的PATCH制作工具）
WINHEX9。53
改 7515B003E817C1F8FF
EB3A--------------
803D9D75450000
-------------1
即可。


1toX 1.63

 标 题:破解实录（六）之 1toX 1.63 (6千字)
发信人:xiA Qin
时 间:2000-7-20 11:27:47
详细信息:
破解实录（六）之 1toX 1.63

软件名称：1toX 1.63 -->(30天试用)
简 介：文件分割工具，支持 CRC 校验、密码保护、拖放等。

作 者：xiA Qin
级 别：刚学不久
解密日前：2000年7月19日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。所以在文中没有任何的注册码，只作技术交流。如若有纰漏，请各位大侠多指教！

首先运行1toX 1.63
输入注册信息
name: xiA Qin &任意输入
First Name: china &任意输入
register key: 9876543210 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............
015F:00408E9F LEA EAX,[ESP+14] //载入name , <<- 这里是xiA Qin
015F:00408EA3 LEA ECX,[ESP+68] //载入First name, <<- 这里是china
015F:00408EA7 PUSH EAX
015F:00408EA8 PUSH DWORD 00426464
015F:00408EAD PUSH ECX
015F:00408EAE LEA EDX,[ESP+06B8]
015F:00408EB5 PUSH DWORD 004272A4
015F:00408EBA PUSH EDX
015F:00408EBB CALL EBX
015F:00408EBD LEA EDI,[ESP+06C0]
015F:00408EC4 OR ECX,BYTE -01
015F:00408EC7 XOR EAX,EAX
015F:00408EC9 ADD ESP,BYTE +14
015F:00408ECC REPNE SCASB
015F:00408ECE NOT ECX
015F:00408ED0 SUB EDI,ECX
015F:00408ED2 LEA EDX,[ESP+0294]
015F:00408ED9 MOV EAX,ECX
015F:00408EDB MOV ESI,EDI
015F:00408EDD MOV EDI,EDX
015F:00408EDF SHR ECX,02
015F:00408EE2 REP MOVSD
015F:00408EE4 MOV ECX,EAX
015F:00408EE6 LEA EAX,[ESP+0294]
015F:00408EED AND ECX,BYTE +03
015F:00408EF0 REP MOVSB
015F:00408EF2 MOV CL,[ESP+0294]
015F:00408EF9 TEST CL,CL
015F:00408EFB JZ 00408F1C
015F:00408EFD CMP BYTE [EAX],5F
015F:00408F00 JNZ 00408F05
015F:00408F02 MOV BYTE [EAX],20
015F:00408F05 MOVSX ECX,BYTE [EAX]
015F:00408F08 XOR ECX,[ESP+10]
015F:00408F0C XOR ECX,13579ACE
015F:00408F12 INC EAX
015F:00408F13 MOV [ESP+10],ECX
015F:00408F17 CMP BYTE [EAX],00
015F:00408F1A JNZ 00408EFD
015F:00408F1C MOV EAX,[ESP+10]
015F:00408F20 LEA EDX,[ESP+BC]
015F:00408F27 XOR EAX,2468BDF0
015F:00408F2C PUSH EDX
015F:00408F2D MOV [0042A698],EAX
015F:00408F32 CALL 00418F27
015F:00408F37 MOV ECX,[0042A698]
015F:00408F3D ADD ESP,BYTE +04
015F:00408F40 CMP EAX,ECX
015F:00408F42 JZ 00408F72
015F:00408F44 PUSH BYTE +10
015F:00408F46 PUSH DWORD 004272FC
015F:00408F4B PUSH DWORD 00427254
015F:00408F50 PUSH EBP
015F:00408F51 CALL `USER32!MessageBoxA`
015F:00408F57 PUSH BYTE +01
015F:00408F59 PUSH EBP
015F:00408F5A CALL `USER32!EndDialog`
015F:00408F60 MOV EAX,01
015F:00408F65 POP EDI
015F:00408F66 POP ESI
015F:00408F67 POP EBP
015F:00408F68 POP EBX
015F:00408F69 ADD ESP,089C
015F:00408E9F LEA EAX,[ESP+14]
015F:00408EA3 LEA ECX,[ESP+68]
015F:00408EA7 PUSH EAX
015F:00408EA8 PUSH DWORD 00426464
015F:00408EAD PUSH ECX
015F:00408EAE LEA EDX,[ESP+06B8]
015F:00408EB5 PUSH DWORD 004272A4
015F:00408EBA PUSH EDX
015F:00408EBB CALL EBX
015F:00408EBD LEA EDI,[ESP+06C0]
015F:00408EC4 OR ECX,BYTE -01
015F:00408EC7 XOR EAX,EAX
015F:00408EC9 ADD ESP,BYTE +14
015F:00408ECC REPNE SCASB
015F:00408ECE NOT ECX
015F:00408ED0 SUB EDI,ECX
015F:00408ED2 LEA EDX,[ESP+0294]
015F:00408ED9 MOV EAX,ECX
015F:00408EDB MOV ESI,EDI
015F:00408EDD MOV EDI,EDX
015F:00408EDF SHR ECX,02
015F:00408EE2 REP MOVSD
015F:00408EE4 MOV ECX,EAX
015F:00408EE6 LEA EAX,[ESP+0294]
015F:00408EED AND ECX,BYTE +03
015F:00408EF0 REP MOVSB
015F:00408EF2 MOV CL,[ESP+0294]
015F:00408EF9 TEST CL,CL
015F:00408EFB JZ 00408F1C <--|
015F:00408EFD CMP BYTE [EAX],5F |这里是通过
015F:00408F00 JNZ 00408F05 |First name+1toX+name
015F:00408F02 MOV BYTE [EAX],20 |来运算注册码
015F:00408F05 MOVSX ECX,BYTE [EAX] |
015F:00408F08 XOR ECX,[ESP+10] |
015F:00408F0C XOR ECX,13579ACE |
015F:00408F12 INC EAX |
015F:00408F13 MOV [ESP+10],ECX |
015F:00408F17 CMP BYTE [EAX],00 |
015F:00408F1A JNZ 00408EFD <--|
015F:00408F1C MOV EAX,[ESP+10]
015F:00408F20 LEA EDX,[ESP+BC] //输入的注册码9876543210
015F:00408F27 XOR EAX,2468BDF0
015F:00408F2C PUSH EDX
015F:00408F2D MOV [0042A698],EAX
015F:00408F32 CALL 00418F27
015F:00408F37 MOV ECX,[0042A698]
015F:00408F3D ADD ESP,BYTE +04
015F:00408F40 CMP EAX,ECX //比较注册码
015F:00408F42 JZ 00408F72 //注册码相等，就跳到00408F72
015F:00408F44 PUSH BYTE +10
015F:00408F46 PUSH DWORD 004272FC
015F:00408F4B PUSH DWORD 00427254
015F:00408F50 PUSH EBP
015F:00408F51 CALL `USER32!MessageBoxA` //注册失败的对话框
015F:00408F57 PUSH BYTE +01
015F:00408F59 PUSH EBP
015F:00408F5A CALL `USER32!EndDialog`
015F:00408F60 MOV EAX,01
015F:00408F65 POP EDI
015F:00408F66 POP ESI
015F:00408F67 POP EBP
015F:00408F68 POP EBX
................................

从上面可以看出.

将00408F42 742E JZ 00408F72
改00408F42 752E JNZ 00408F72

就可以注册。

整里一下，用Ultraedt打开1toX.exe

找到74 2E 6A 10 68

改成75 2E 6A 10 68

保存修改文件，重新运行

输入注册信息 ，现在是想输入什么都可以。
name: &任意输入
First Name: &任意输入
register key: &任意输入

后 记：
1toX 1.63是通过读取安装目录下的文件1toXe.cnt来判断，程序是否注册。如果把文件1toXe.cnt删除，1toX 1.63又成了非注册版。


3DMark2000 1.0

 标 题:菜鸟破解录(14)之 3DMark2000 1.0 (4千字)
发信人:xiA Qin
时 间:2000-7-31 8:26:36
详细信息:
菜鸟破解录(14)之 3DMark2000 1.0

软件名称：3DMark2000
版 本：1.00
简 介：
如果你是3D游戏的玩家，千万不要错过这一套可以分析 、测试、并回应报告你电脑的3D表现效果的诊断工具， 包括图片品质、贴图速度等重要的参考数据。同时它支持 AMD 3DNOW! 和 P-III Streaming SIMD Extensions技术。可以让你比较看看 ---------搭配新一代的处理器的效果。具有精美绝伦的演示画面, 配合生动的音效, 真是一种享受! 测试以下您的 3D 加速卡到底有 ---------多利害? 可以以数值和图像的方式表现出来, 一般来说: TNT2 M64板可以跑到2800以上。同时, 她还是业界知名的 3D 显示卡测试软件, 具有最新的技术支持, 最好的纹理测试效果, 很完善的评估。众多显卡生产厂商都以 3DMark2000的测试数据作为一个评价标准, 代表了产品的性能质量。如果您也想看看 Voodoo3和 TNT2 到底有什么区别? 那就下载一个试试吧……

作 者：xiA Qin
等 级：很菜....很菜....
破解日期：2000年7月30日
破解工具：Trw2000 1.22
破解目的：学习注册码的破解（简单）

说 明：

本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

运行程序，输入注册信息。

name: China xi &任意输入
code: 12345678901234567 必须是17位，为什么?程序会检查注册码位数。下面会讲到

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面的代码。
...............................

015F:0040C726 MOV EBP,[EBX+60]
015F:0040C729 MOV EAX,[EBP-08]
015F:0040C72C TEST EAX,EAX
015F:0040C72E JZ 0040C7F9
015F:0040C734 OR ECX,-01
015F:0040C737 XOR EAX,EAX
015F:0040C739 MOV EDI,EBP
015F:0040C73B REPNZ SCASB 把16进制的11换算成10进制=17，表示注册码17位
015F:0040C73D NOT ECX ┍────────────
015F:0040C73F DEC ECX ↓
015F:0040C740 CMP ECX,11
015F:0040C743 JNZ 0040C7EE //检查注册码的位数，是否是17位
015F:0040C749 MOV EDX,00564B08
015F:0040C74E MOV EAX,[EDX]
015F:0040C750 TEST EAX,EAX
015F:0040C752 JZ 0040C79F
015F:0040C754 MOV ESI,EBP
015F:0040C756 MOV BL,[EAX]
015F:0040C758 MOV CL,BL
015F:0040C75A CMP BL,[ESI]
015F:0040C75C JNZ 0040C77A
015F:0040C75E TEST CL,CL
015F:0040C760 JZ 0040C776
015F:0040C762 MOV BL,[EAX+01]
015F:0040C765 MOV CL,BL
015F:0040C767 CMP BL,[ESI+01]
015F:0040C76A JNZ 0040C77A
015F:0040C76C ADD EAX,02
015F:0040C76F ADD ESI,02
015F:0040C772 TEST CL,CL
015F:0040C774 JNZ 0040C756
015F:0040C776 XOR EAX,EAX
015F:0040C778 JMP 0040C77F
015F:0040C77A SBB EAX,EAX
015F:0040C77C SBB EAX,-01
015F:0040C77F TEST EAX,EAX
015F:0040C781 JNZ 0040C796
015F:0040C783 MOV EDI,[ESP+10]
015F:0040C787 OR ECX,-01
015F:0040C78A REPNZ SCASB
015F:0040C78C MOV EAX,[EDX+04]
015F:0040C78F NOT ECX
015F:0040C791 DEC ECX
015F:0040C792 CMP EAX,ECX
015F:0040C794 JZ 0040C7EE
015F:0040C796 MOV EBX,[ESP+14]
015F:0040C79A ADD EDX,08
015F:0040C79D JMP 0040C74E
015F:0040C79F MOV EAX,[ESP+10]
015F:0040C7A3 PUSH 01
015F:0040C7A5 PUSH EAX
015F:0040C7A6 CALL 004017D0 //正确的注册码 D EAX
015F:0040C7AB ADD ESP,08
015F:0040C7AE MOV ESI,EBP
015F:0040C7B0 MOV DL,[EAX]
015F:0040C7B2 MOV CL,DL
015F:0040C7B4 CMP DL,[ESI]
015F:0040C7B6 JNZ 0040C7D4 //比较注册码的
015F:0040C7B8 TEST CL,CL
015F:0040C7BA JZ 0040C7D0
015F:0040C7BC MOV DL,[EAX+01]
015F:0040C7BF MOV CL,DL
015F:0040C7C1 CMP DL,[ESI+01]
015F:0040C7C4 JNZ 0040C7D4
015F:0040C7C6 ADD EAX,02
015F:0040C7C9 ADD ESI,02
015F:0040C7CC TEST CL,CL
015F:0040C7CE JNZ 0040C7B0
015F:0040C7D0 XOR EAX,EAX
015F:0040C7D2 JMP 0040C7D9
015F:0040C7D4 SBB EAX,EAX
015F:0040C7D6 SBB EAX,-01
015F:0040C7D9 TEST EAX,EAX
015F:0040C7DB JNZ 0040C7EE
015F:0040C7DD PUSH 01
015F:0040C7DF MOV ECX,EBX
015F:0040C7E1 CALL 00512D04
015F:0040C7E6 POP EDI
015F:0040C7E7 POP ESI
015F:0040C7E8 POP EBP
015F:0040C7E9 POP EBX
015F:0040C7EA ADD ESP,08
015F:0040C7ED RET
015F:0040C7EE PUSH 00
015F:0040C7F0 PUSH 00
015F:0040C7F2 PUSH 0000F09E
015F:0040C7F7 JMP 0040C802
015F:0040C7F9 PUSH 00
015F:0040C7FB PUSH 00
015F:0040C7FD PUSH 0000F0A0
015F:0040C802 MOV ECX,00566AA8
015F:0040C807 CALL 004736D0
015F:0040C80C PUSH EAX
015F:0040C80D CALL 00512A40 //注册失败对话框
015F:0040C812 POP EDI
015F:0040C813 POP ESI
015F:0040C814 POP EBP
015F:0040C815 POP EBX
015F:0040C816 ADD ESP,08
015F:0040C819 RET

.......................

整理一下,输入注册信息。

User Name: China xiA

Registration Code: F9JCT-4D7F7-K8V92


A Day in the Life 1.51

 标 题:菜鸟破解录(10)之 A Day in the Life 1.51 (6千字)
发信人:xiA Qin
时 间:2000-7-23 9:23:57
详细信息:
菜鸟破解录(10)之 A Day in the Life 1.51

软件名称：A Day in the Life
版 本：1.51
简 介：
日记或是记录软件。完全支持中文不会有乱码！可记录每天生活的点点滴滴。附有万年历。可允许多人使用并各自设定自己的密码。这样你的日记就不会被偷看了。除了基本的功能外。还可以打印输出，载入图片，及录制声音。非常方便。

有了这个软件再也不怕阿妈偷看日记了。我加密码。哈哈...

作 者：xiA Qin
等 级：很菜....很菜....
破解日期：2000年7月23日
破解工具：Trw2000 1.22
破解目的：学习注册码的破解（有点难）

说 明：

本文是在我的软件破解记录上整理出来的，只作技术交流。如若有纰漏，请各位大侠多指教！

运行程序，输入注册信息。

name: xiA Qin &任意输入
code: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按register，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面的代码。
...................

015F:004B9ED3 MOV EAX,[EBP-08] <--|
015F:004B9ED6 XOR EBX,EBX |
015F:004B9ED8 MOV BL,[ECX+EAX-01] |按正序
015F:004B9EDC IMUL EBX,EDI |读入name
015F:004B9EDF CMP EBX,12 |即读入xiA Qin
015F:004B9EE2 JL 004B9EF3 |的顺序
015F:004B9EE4 MOV EAX,[EBP-08] |
015F:004B9EE7 MOV EAX,EBX | 注意EBX的变化
015F:004B9EE9 MOV EBX,00000011 |
015F:004B9EEE CDQ |
015F:004B9EEF IDIV EBX |
015F:004B9EF1 MOV EDI,EAX |
015F:004B9EF3 INC ECX |
015F:004B9EF4 DEC ESI |
015F:004B9EF5 JNZ 004B9ED3 <--|
015F:004B9EF7 MOV EAX,[EBP-08]
015F:004B9EFA CALL 00403EA0
015F:004B9EFF MOV ECX,EAX
015F:004B9F01 CMP ECX,01
015F:004B9F04 JL 004B9F45
015F:004B9F06 MOV EAX,[EBP-08] <--|
015F:004B9F09 MOV BL,[ECX+EAX-01] |按逆序
015F:004B9F0D MOV ESI,EBX |读入name
015F:004B9F0F AND ESI,000000FF |即iQ Aix
015F:004B9F15 MOV EAX,ECX |的顺序
015F:004B9F17 CDQ |
015F:004B9F18 IDIV ESI |
015F:004B9F1A TEST EDX,EDX |
015F:004B9F1C JZ 004B9F2B |
015F:004B9F1E MOV EAX,[EBP-08] |
015F:004B9F21 SUB ESI,0B |
015F:004B9F24 IMUL ESI,EDI |注意EBX的变化
015F:004B9F27 MOV EDI,ESI |
015F:004B9F29 JMP 004B9F40 |
015F:004B9F2B MOV EAX,[EBP-08] |
015F:004B9F2E XOR EAX,EAX |
015F:004B9F30 MOV AL,BL |
015F:004B9F32 ADD EAX,11 |
015F:004B9F35 PUSH EAX |
015F:004B9F36 MOV EAX,EDI |
015F:004B9F38 POP EDX |
015F:004B9F39 MOV EBX,EDX |
015F:004B9F3B CDQ |
015F:004B9F3C IDIV EBX |
015F:004B9F3E MOV EDI,EAX |
015F:004B9F40 DEC ECX |
015F:004B9F41 TEST ECX,ECX |
015F:004B9F43 JNZ 004B9F06 <--|
015F:004B9F45 MOV EAX,[EBP-08]
015F:004B9F48 CALL 00403EA0
015F:004B9F4D PUSH EAX
015F:004B9F4E MOV EAX,EDI
015F:004B9F50 POP EDX
015F:004B9F51 SUB EAX,EDX
015F:004B9F53 MOV ECX,00000007
015F:004B9F58 CDQ
015F:004B9F59 IDIV ECX
015F:004B9F5B ADD EAX,00000F92
015F:004B9F60 MOV EDI,EAX
015F:004B9F62 LEA EDX,[EBP-0C]
015F:004B9F65 MOV EAX,EDI
015F:004B9F67 CALL 00408504
015F:004B9F6C LEA EAX,[EBP-10]
015F:004B9F6F MOV EDX,[EBP-08]
015F:004B9F72 MOV DL,[EDX]
015F:004B9F74 CALL 00403DC8
015F:004B9F79 MOV EAX,[EBP-10]
015F:004B9F7C LEA EDX,[EBP-0C]
015F:004B9F7F MOV ECX,00000001
015F:004B9F84 CALL 0040412C
015F:004B9F89 MOV EDX,[EBP-08]
015F:004B9F8C MOV EAX,004BA098
015F:004B9F91 CALL 00404188
015F:004B9F96 MOV EDX,[EBP-08]
015F:004B9F99 MOV DL,[EAX+EDX]
015F:004B9F9C LEA EAX,[EBP-10]
015F:004B9F9F CALL 00403DC8
015F:004B9FA4 MOV EAX,[EBP-10]
015F:004B9FA7 PUSH EAX
015F:004B9FA8 MOV EAX,[EBP-0C]
015F:004B9FAB CALL 00403EA0
015F:004B9FB0 MOV ECX,EAX
015F:004B9FB2 INC ECX
015F:004B9FB3 LEA EDX,[EBP-0C]
015F:004B9FB6 POP EAX
015F:004B9FB7 CALL 0040412C
015F:004B9FBC MOV EAX,[EBP-0C] //生成注册码的数字部分,如x-182778339Q
015F:004B9FBF CALL 00403EA0
015F:004B9FC4 MOV ECX,EAX
015F:004B9FC6 SAR ECX,1
015F:004B9FC8 JNS 004B9FCD
015F:004B9FCA ADC ECX,00
015F:004B9FCD LEA EDX,[EBP-0C]
015F:004B9FD0 MOV EAX,004BA0A4
015F:004B9FD5 CALL 0040412C //生成注册码的字母部分,如ClaDiTL
015F:004B9FDA LEA EDX,[EBP-14]
015F:004B9FDD MOV EAX,[EBP-04]
015F:004B9FE0 MOV EAX,[EAX+000002F0]
015F:004B9FE6 CALL 004306F4
015F:004B9FEB MOV EDX,[EBP-14]
015F:004B9FEE MOV EAX,[EBP-0C] //正确的注册码D EAX
015F:004B9FF1 CALL 00403FB0
015F:004B9FF6 JNZ 004BA028 //比较注册码。
015F:004B9FF8 LEA EDX,[EBP-14]
015F:004B9FFB MOV EAX,[EBP-04]
015F:004B9FFE MOV EAX,[EAX+000002F0]
015F:004BA004 CALL 004306F4
015F:004BA009 MOV EDX,[EBP-14]
015F:004BA00C MOV EAX,004BA0A4
015F:004BA011 CALL 00404188
015F:004BA016 TEST EAX,EAX
015F:004BA018 JLE 004BA028
015F:004BA01A MOV EAX,[004C79A8]
015F:004BA01F MOV EAX,[EAX]
015F:004BA021 CALL 004C3DE4
015F:004BA026 JMP 004BA05F
015F:004BA028 PUSH 00
015F:004BA02A MOV CX,[004BA0AC]
015F:004BA031 MOV DL,01
015F:004BA033 MOV EAX,004BA0B8
015F:004BA038 CALL 00454628 //失败对话框
015F:004BA03D MOV EAX,[EBP-04]
015F:004BA040 MOV EAX,[EAX+000002EC]
015F:004BA046 MOV EDX,[EAX]
015F:004BA048 CALL [EDX+000000D0]
015F:004BA04E MOV EAX,[EBP-04]
015F:004BA051 MOV EAX,[EAX+000002F0]
015F:004BA057 MOV EDX,[EAX]
015F:004BA059 CALL [EDX+000000D0]

整理一下,输入注册信息。

name: xiA Qin
code: x-182ClaDiTL778339Q


Animated Screen

 标 题:菜鸟破解录之 Animated Screen (4千字)
发信人:xiA Qin
时 间:2000-8-13 8:37:43
详细信息:
菜鸟破解录之 Animated Screen

软件名称： Animated Screen
软件版本： 5.2
软件大小： 3086KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.pysoft.com/anim_screen_fr.html
软件简介：
屏幕保护程序或是做简报的制作软件。使用上所提供的功能设定不少，可以做出多样的效果与变化！可把做好的屏幕保护存成SCR文件外，还可以存成EXE的执行安装文件。并且可以设定使用者限制等等。

作 者：xiA Qin
级 别：很菜....很菜.....
解密日前：2000年8月11日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（★）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行Animated Screen
输入注册信息

Name: xiA Qin &任意输入
Registration key: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令

..................
015F:004F24E8 PUSH EBP
015F:004F24E9 PUSH DWORD 004F294A
015F:004F24EE PUSH DWORD [FS:EAX]
015F:004F24F1 MOV [FS:EAX],ESP
015F:004F24F4 LEA EDX,[EBP+FFFFFDF4]
015F:004F24FA MOV EAX,[EBX+02C8]
015F:004F2500 CALL 00430FEC
015F:004F2505 MOV EAX,[EBP+FFFFFDF4]
015F:004F250B LEA EDX,[EBP+FFFFFDF8] //输入的姓名 D EAX
015F:004F2511 CALL 004A2AF0
015F:004F2516 MOV EAX,[EBP+FFFFFDF8]
015F:004F251C PUSH EAX //正确的注册码 D EAX
015F:004F251D LEA EDX,[EBP+FFFFFDF4]
015F:004F2523 MOV EAX,[EBX+02D0]
015F:004F2529 CALL 00430FEC
015F:004F252E MOV EDX,[EBP+FFFFFDF4] //输入的注册码 D EDX
015F:004F2534 POP EAX //正确的注册码1 D EAX :158CF100
015F:004F2535 CALL 00403F80 //注册码比较
015F:004F253A JZ NEAR 004F262B //注册码相等，就跳
015F:004F2540 LEA EDX,[EBP+FFFFFDF4]
015F:004F2546 MOV EAX,[EBX+02C8]
015F:004F254C CALL 00430FEC
015F:004F2551 MOV EAX,[EBP+FFFFFDF4]
015F:004F2557 LEA EDX,[EBP+FFFFFDF8]
015F:004F255D CALL 004A2B60
015F:004F2562 MOV EAX,[EBP+FFFFFDF8]
015F:004F2568 PUSH EAX
015F:004F2569 LEA EDX,[EBP+FFFFFDF4]
015F:004F256F MOV EAX,[EBX+02D0]
015F:004F2575 CALL 00430FEC
015F:004F257A MOV EDX,[EBP+FFFFFDF4]
015F:004F2580 POP EAX //正确的注册码2 D EAX :6F87EA00
015F:004F2581 CALL 00403F80
015F:004F2586 JZ NEAR 004F262B
015F:004F258C LEA EDX,[EBP+FFFFFDF4]
015F:004F2592 MOV EAX,[EBX+02C8]
015F:004F2598 CALL 00430FEC
015F:004F259D MOV EAX,[EBP+FFFFFDF4]
015F:004F25A3 LEA EDX,[EBP+FFFFFDF8]
015F:004F25A9 CALL 004A2BCC
015F:004F25AE MOV EAX,[EBP+FFFFFDF8]
015F:004F25B4 PUSH EAX
015F:004F25B5 LEA EDX,[EBP+FFFFFDF4]
015F:004F25BB MOV EAX,[EBX+02D0]
015F:004F25C1 CALL 00430FEC
015F:004F25C6 MOV EDX,[EBP+FFFFFDF4]
015F:004F25CC POP EAX //正确的注册码3 D EAX :EAAA6100
015F:004F25CD CALL 00403F80
015F:004F25D2 JZ 004F262B
015F:004F25D4 MOV EAX,[005151C8]
015F:004F25D9 MOV EAX,[EAX]
015F:004F25DB MOV DX,FFF5
015F:004F25DF CALL 0044BC50
015F:004F25E4 MOV EAX,0BB8
015F:004F25E9 CALL 004502AC
015F:004F25EE MOV EAX,[005151C8]
015F:004F25F3 MOV EAX,[EAX]
015F:004F25F5 XOR EDX,EDX
015F:004F25F7 CALL 0044BC50
015F:004F25FC LEA EAX,[EBP-04]
015F:004F25FF MOV EDX,004F2960
015F:004F2604 CALL 00403C8C
015F:004F2609 PUSH BYTE +10
015F:004F260B PUSH DWORD 004F29B8
015F:004F2610 MOV EAX,[EBP-04]
015F:004F2613 CALL 00404034
015F:004F2618 PUSH EAX
015F:004F2619 MOV EAX,EBX
015F:004F261B CALL 00436DA8
015F:004F2620 PUSH EAX
015F:004F2621 CALL `USER32!MessageBoxA` //注册失败对话框
......................

整理一下,输入注册信息。

Name: xiA Qin
Registration key: 158CF100 <-|
6F87EA00 |三个注册码都可以使用。
EAAA6100 <-|

注册信息在注册表中
[HKEY_CURRENT_USER\Software\PySoft\Animated_Screen]
"Reg_Name"="掇首僖@首猇"
"Reg_Key"="茫c穋穋份DO硞銈


AutoDialogs

 标 题:菜鸟破解录之 AutoDialogs (3千字)
发信人:xiA Qin
时 间:2000-8-18 10:30:22
详细信息:
菜鸟破解录之 AutoDialogs

软件名称： AutoDialogs
软件版本： 1.1.57 SR 1
软件大小： 293KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.metaproducts.com/mpPS-ADL.html
软件简介： 文件夹快速切换工具。在标准文件打开、保存、浏览窗口中，可以使用系统区图标选择，或直接用自己定义的快捷键，快速切换到预定义的文件夹，免除一层一层跳进跳出的麻烦。

作 者：xiA Qin
级 别：很菜....很菜.....
解密日前：2000年8月11日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（★★）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行AutoDialogs
输入注册信息
name: xiA Qin xiA Qin
Registration key: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
.................

015F:00486953 LEA EDX,[EBP-08]
015F:00486956 MOV EAX,[EBX+02F4]
015F:0048695C CALL 004325C0
015F:00486961 MOV EAX,[00492074]
015F:00486966 MOV EAX,[EAX]
015F:00486968 MOV ECX,[EBP-08] //输入的姓名假注册码。
015F:0048696B MOV EDX,[EBP-04] //输入的姓名。
015F:0048696E CALL 0048DE1C //肯定有问题，按F8进入。
015F:00486973 TEST AL,AL //以al=1作为注册标志
015F:00486975 JZ 004869C4 //注册码不相等，就玩完了。
015F:00486977 MOV EAX,[00492074]
015F:0048697C MOV EAX,[EAX]
015F:0048697E MOV BYTE [EAX+0333],01
015F:00486985 MOV EAX,[00492074]
015F:0048698A MOV EAX,[EAX]
015F:0048698C ADD EAX,0334
015F:00486991 MOV EDX,[EBP-04]
015F:00486994 CALL 00403BDC
015F:00486999 MOV EAX,[00492074]
015F:0048699E MOV EAX,[EAX]
........................
按F8进入0048696E CALL 0048DE1C

改按F10来到下面指令。其中，要经过好长一段黑名单。

015F:0048DF66 MOV EDX,01276DF2
015F:0048DF6B MOV EAX,[EBP-0C]
015F:0048DF6E CALL 0048DBEC
015F:0048DF73 LEA EDX,[EBP-10]
015F:0048DF76 CALL 0048DC70
015F:0048DF7B MOV EDX,[EBP-10] //正确的注册码
015F:0048DF7E MOV EAX,[EBP-08] //输入的注册码
015F:0048DF81 CALL 00403F18
015F:0048DF86 SETZ BL
015F:0048DF89 XOR EAX,EAX
015F:0048DF8B POP EDX
015F:0048DF8C POP ECX
015F:0048DF8D POP ECX
015F:0048DF8E MOV [FS:EAX],EDX
015F:0048DF91 PUSH DWORD 0048DFAB
015F:0048DF96 LEA EAX,[EBP-10]
015F:0048DF99 MOV EDX,04
015F:0048DF9E CALL 00403BAC
015F:0048DFA3 RET
015F:0048DFA4 JMP 004035E8
015F:0048DFA9 JMP SHORT 0048DF96
015F:0048DFAB MOV EAX,EBX
015F:0048DFAD POP EBX
015F:0048DFAE MOV ESP,EBP
015F:0048DFB0 POP EBP
015F:0048DFB1 RET
。。。。。。。。。。。。。。

整理一下,输入注册信息。

name: xiA Qin xiA Qin
Registration key: 38774414352821GH

注册信息在注册表中：
[HKEY_CURRENT_USER\Software\MetaProducts\AutoDialogs]
"RegUser"="xiA Qin"
"RegKey"="38774414352821GH"


AutoZip 98 v4.0

标 题:Tutor 10 How to crack AutoZip 98 v4.0
发信人:dREAMtHEATER
时 间:15/16th, August 1999
详细信息:

作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期: 15/16th, August 1999

软件背景资料

运行平台: Win9X
文件名称: azp32v41.exe(版本号可能有误）
程序类型: 解压缩类工具
下载地点: http://www.mfsoft.com
文件大小: 771KB

使用的工具

W32Dasm V8.93--Win9X Dissembler
Hex WorkShop V2.54--Hex Editor
RegSnap V2.51--Registry Analyzing Tool
Registry Studio V1.01--Enhanced Registry Editor

难易程度

Easy(x) Medium( ) Hard( ) Pro( )

----------=======声明========----------

未经作者同意，不得修改、引用原文，一切权利保留。
本教程只供教学用，其他一切用途皆被禁止。

----------=======软件介绍========----------

软件的作者这样说：
AutoZip is a tool that lets you extract zip files directly from Netscape and
Internet Explorer. If the zip file contains a setup program, AutoZip can extract the
archive temporarily and run the setup file.

----------=======软件的保护机制========-------

这个shareware做的很体贴人，没有nag,程序中也没有任何地方可注册，应该是在线（
on-line)注册，只有你使用超过30天以后，才出现提示窗口告诉你必须注册，否则休想再继续使用
。没关系，你可以用RegSnap在软件安装前后分别给注册表做个快照，然后进行比较。比较后，凭直
觉我认为程序第一次运行时间保存在：HKEY_USERS\.DEFAULT\Software\MFSoft\AutoZip\Config40
，验证的方法直接从注册表删除这个键值，重新启动程序。congratulate!你又获得了三十天的试用
期。

----------========正文========----------

Part1 如何用W32Dasm的Debugger功能快速破解本程序

线索
首先将主运行程序在W32Dasm中反汇编，然后看看“String Data References”中有没有跟“
共享”、时间限制等相关的词汇，这可是你快速破解的最好方式！很可惜，没有找到任何有参考价
值的词汇，这会让你不知所措吗？想一想，还有什么蛛丝马迹可让你来跟踪的。请看下面：

"Color"
"Columns"
"comctl32.dll"
"commdlg_FindReplace"
"commdlg_help"
"Config40" 〈==看到了吗？
"CONGRATULATIONS! "
"Content Type"
"ControlOfs%.8X%.8X"
"Convert EXE to ZIP"
"Convert ZIP to EXE"
"Copy"
"CoReleaseServerProcess"
"CoResumeClassObjects"
"CoSuspendClassObjects"
"Couldn"
"Create directory"

"Config40"是从注册表中读写记录时间的键值！在"W32Dasm List of String Data Items"窗
口中高亮显示这一行，并用鼠标双击这一行，你会发现代码窗口中有两处与此相关的部分。

1）
* Possible StringData Ref from Code Obj ->"Software\MFSoft\AutoZip"
|
:00492364 BA98234900 mov edx, 00492398
:00492369 8BC3 mov eax, ebx
:0049236B E8344DFCFF call 004570A4
:00492370 8BCE mov ecx, esi

* Possible StringData Ref from Code Obj ->"Config40"
|
:00492372 BAB8234900 mov edx, 004923B8
:00492377 8BC3 mov eax, ebx
:00492379 E8864FFCFF call 00457304

2）
* Possible StringData Ref from Code Obj ->"Software\MFSoft\AutoZip"
|
:004923F9 BA5C244900 mov edx, 0049245C
:004923FE 8B45FC mov eax, dword ptr [ebp-04]
:00492401 E89E4CFCFF call 004570A4
:00492406 33C0 xor eax, eax
:00492408 55 push ebp
:00492409 682D244900 push 0049242D
:0049240E 64FF30 push dword ptr fs:[eax]
:00492411 648920 mov dword ptr fs:[eax], esp

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

* Possible StringData Ref from Code Obj ->"Config40"
|
:00492414 BA7C244900 mov edx, 0049247C
:00492419 8B45FC mov eax, dword ptr [ebp-04]
:0049241C E8F74EFCFF call 00457318

这两部分代码验证了我前面说的，你可以看到在每个"Config40"前面数行都有
"Software\MFSoft\AutoZip"，这分明在读取注册表的"Config40"的键值。
那么，到底哪部分是我们所需要的呢？请在W32dasm的Debugger状态下，分别在出现"Config40"
字符串的下面一行的偏移地址设断点，即:00492372、:00492414两处，然后press F9,程序停在
:00492414y一行。
上面过程说明程序是在我上面列出的第二部分的代码处读取安装时间的（请保证你不是第一次
运行该程序）。如果这时你的此程序还没有过期，请退出W32Dasm的Debugger状态，往后调整系统时
间，迫使程序过期，再重新进入W32Dasm的Debugger状态，设断点在:00492414;否则，你只须取消所
有的断点，press F6,继续跟踪，你会发现程序很快呼叫出过期的提示窗口：

:00492591 83F81E cmp eax, 0000001E <==与30天比较
:00492594 7E25 jle 004925BB <==小于30天跳转
:00492596 B9085A4900 mov ecx, 00495A08
:0049259B A1304B4900 mov eax, dword ptr [00494B30]
:004925A0 8B00 mov eax, dword ptr [eax]
:004925A2 8B15F4204900 mov edx, dword ptr [004920F4]
:004925A8 E8F7AAFBFF call 0044D0A4
:004925AD A1304B4900 mov eax, dword ptr [00494B30]
:004925B2 8B00 mov eax, dword ptr [eax]
:004925B4 E86BABFBFF call 0044D124 <==呼叫过期的提示窗口
:004925B9 B301 mov bl, 01

多么直接了当的一段代码，不用我说了，应该知道怎么改吧！

----------=======The Patch========----------

在文件AutoZip.exe的offset:00091994处，修改7E25为EB25

---------========The Final========----------

W32Dasm的一些具体操作我没有很仔细地讲，如若有不清楚的地方，请看它的Help文件。
Debugger状态下，如想能在很短的时间内找出呼叫象Nag Screen这样的窗口的CALL,如果你
没有其他好的方法可以使用（比如下合适的API函数断点），那就必须找到与此有关联的部分，例如
从注册表读取安装时间、注册信息的代码部分，这些都是很好的线索，呼叫nag的CALL与这些代码应
该离得很近，此种方法在大多数情况下都很有效，再不济的，如果你实在找不到任何信息，那你就
从程序的入口点（Entry Point)一行一行地执行代码，直到执行到呼叫出nag的那个CALL,到这还没
完，如果你在这里修改程序，往往会使程序@#^&*!,这是因为这个CAll里面还包含着很多的CAll，你
还须trace into 这个CALL,然后有可能且极有可能再trace into.....天啊！是不是把你已经累死了
！不要认为这种方法不可行，我曾经不止一次这样trace过，而且成功地破解过数个shareware,不过
，还好，没有把我完全累死，只是咳咳.... :-)
从本章内容，你会了解到W32Dasm的Debug功能也蛮强的，不过他远不如SoftIce的断点设置
能力强，尤其在windows API函数断点设置方面简直就是白痴！其Debugger状态下，最大的优点就是
非常容易观察程序的变化。不要再迷信SoftIce了，他绝对不是你唯一的选择！
W32Dasm,kool!


AxMan3.10

 序 号:3458
标 题:菜鸟破解录(12)之 AxMan3.10 (3千字)
发信人:xiA Qin
时 间:2000-7-26 11:35:00
详细信息:
菜鸟破解录(12)之 AxMan3.10

软件名称：AxMan
版 本：3.10
简 介：
一个非常不错的文件分割工具，该工具的主要作用是可以将大文件切成几个小文件便于拷贝到软盘或作为电子邮件附件发送。对于分割的文件，程序提供自动合并功能，同时该工具也提供非常简单的操作界面和操作方式以方便用户使用。

作 者：xiA Qin
等 级：很菜....很菜....
破解日期：2000年7月24日
破解工具：Trw2000 1.22
破解目的：学习注册码的破解(简单)

说 明：

本文是在我的软件破解记录上整理出来的，只作技术交流。如若有纰漏，请各位大侠多指教！

运行程序，输入注册信息。

name: xiA Qin &任意输入
Company: China &任意输入
Registration: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按OK ，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面的代码。
...................

015F:004063A9 LEA EAX,[EBP-18] //载入name:xiA Qin
015F:004063AC LEA ECX,[ESI+000000D4]
015F:004063B2 PUSH EAX
015F:004063B3 CALL 0042B1F4
015F:004063B8 LEA EAX,[EBP-14] //载入Company：China
015F:004063BB LEA ECX,[ESI+5C]
015F:004063BE PUSH EAX
015F:004063BF CALL 0042B1F4
015F:004063C4 LEA ECX,[EBP-1C] //载入Registration:1234567890
015F:004063C7 CALL 00405F6D
015F:004063CC PUSH DWORD PTR [EBP-14]
015F:004063CF LEA ECX,[EBP-1C]
015F:004063D2 MOV BYTE PTR [EBP-04],03
015F:004063D6 PUSH DWORD PTR [EBP-18]
015F:004063D9 PUSH DWORD PTR [EBP-10]
015F:004063DC CALL 00405F99 <--有问题，按F8进入看一看。
015F:004063E1 TEST AL,AL
015F:004063E3 JNZ 004063FD //注册码不相等，就不跳。

####################################
按F8进入004063DC CALL 00405F99后
按F10来到下面的指令

015F:00405F99 PUSH EBP
015F:00405F9A MOV EBP,ESP
015F:00405F9C SUB ESP,18
015F:00405F9F LEA EAX,[EBP-18]
015F:00405FA2 PUSH EAX
015F:00405FA3 PUSH DWORD PTR [EBP+0C]
015F:00405FA6 PUSH DWORD PTR [EBP+08]
015F:00405FA9 CALL 00405FC6
015F:00405FAE PUSH DWORD PTR [EBP+10]
015F:00405FB1 LEA EAX,[EBP-18] //正确的注册码 D EAX
015F:00405FB4 PUSH EAX
015F:00405FB5 CALL 00418FC0
015F:00405FBA NEG EAX
015F:00405FBC POP ECX
015F:00405FBD SBB AL,AL
015F:00405FBF POP ECX
015F:00405FC0 INC AL
015F:00405FC2 LEAVE
015F:00405FC3 RET 000C

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

015F:004063E5 PUSH 30
015F:004063E7 PUSH 0045FAB0
015F:004063EC PUSH 0045FA8C
015F:004063F1 MOV ECX,ESI
015F:004063F3 CALL 0042BF41 //注册失败对话框
015F:004063F8 JMP 0040648B
015F:004063FD LEA EAX,[EBP-01AC]
015F:00406403 PUSH 0045FA5C
015F:00406408 PUSH EAX
015F:00406409 CALL 00419B90
015F:0040640E LEA EAX,[EBP-01AC]
015F:00406414 PUSH 0045FA08
015F:00406419 PUSH EAX
015F:0040641A CALL 00419BA0
015F:0040641F ADD ESP,10
015F:00406422 LEA EAX,[EBP-01AC]
015F:00406428 MOV ECX,ESI

整理一下,输入注册信息。

name: xiA Qin
Company: China
Registration: 130-464-421


BackupXpress Pro

 标 题:菜鸟破解录(17)之 BackupXpress Pro (3千字)
发信人:xiA Qin
时 间:2000-8-5 9:10:04
详细信息:
菜鸟破解录(17)之 BackupXpress Pro

软件名称：BackupXpress Pro
版 本：v2.50.058
简 介：
BACKUPXpress有许许多多贴心的设计来帮你安排你的备份行程。你只要排除你不要备份的暂存档或无用的资料档的类型，剩下的工作都交给它来帮你搞定。甚至还能利用Email或Ftp来帮你制作远端备份哦！

作 者：xiA Qin
级 别：很菜....很菜....
解密日前：2000年8月3日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行 BackupXpress Pro
输入注册信息
name: xiA Qin &任意输入
Serial Number: 9876543210 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令

.................................

015F:00518890 LEA EAX,[EBP-10]
015F:00518893 PUSH EAX
015F:00518894 LEA EDX,[EBP-14]
015F:00518897 MOV EAX,[005322FC]
015F:0051889C MOV EAX,[EAX]
015F:0051889E CALL 00452FF8
015F:005188A3 MOV EAX,[EBP-14]
015F:005188A6 XOR ECX,ECX
015F:005188A8 MOV EDX,[EBP-04] //载入姓名，根据姓名运算注册码
015F:005188AB CALL 0046A090
015F:005188B0 LEA EAX,[EBP-08]
015F:005188B3 PUSH EAX
015F:005188B4 LEA EDX,[EBP-18]
015F:005188B7 MOV EAX,[005322FC]
015F:005188BC MOV EAX,[EAX]
015F:005188BE CALL 00452FF8
015F:005188C3 MOV EAX,[EBP-18]
015F:005188C6 XOR ECX,ECX
015F:005188C8 MOV EDX,[EBP-04]
015F:005188CB CALL 0046A090
015F:005188D0 LEA EAX,[EBP-0C]
015F:005188D3 PUSH EAX
015F:005188D4 LEA EDX,[EBP-1C]
015F:005188D7 MOV EAX,[005322FC]
015F:005188DC MOV EAX,[EAX]
015F:005188DE CALL 00452FF8
015F:005188E3 MOV EAX,[EBP-1C]
015F:005188E6 XOR ECX,ECX
015F:005188E8 MOV EDX,[EBP-04]
015F:005188EB CALL 0046A090
015F:005188F0 LEA EDX,[EBP-20]
015F:005188F3 MOV EAX,[EBP-10] //正确的注册码 D EAX
015F:005188F6 CALL 004090D4
015F:005188FB MOV EAX,[EBP-20]
015F:005188FE PUSH EAX
015F:005188FF LEA EDX,[EBP-28]
015F:00518902 MOV EAX,[EBX+000002F0]
015F:00518908 CALL 00434C24
015F:0051890D MOV EAX,[EBP-28]
015F:00518910 LEA EDX,[EBP-24]
015F:00518913 CALL 004090D4
015F:00518918 MOV EDX,[EBP-24] //输入的注册码。 D EDX
015F:0051891B POP EAX //正确的注册码。 D EAX
015F:0051891C CALL 004042D0 //注册码比较核心。
015F:00518921 JNZ 00518AF5 //跳到00518af5,就死定了。
015F:00518927 LEA EDX,[EBP-30]
015F:0051892A MOV EAX,[EBX+000002EC]
015F:00518930 CALL 00434C24
015F:00518935 MOV EAX,[EBP-30]
015F:00518938 LEA EDX,[EBP-2C]
015F:0051893B CALL 00468F44

.............................

015F:00518AF5 MOV EAX,[EBP-08]
015F:00518AF8 MOV EDX,[EBP-0C]
015F:00518AFB CALL 004042D0
015F:00518B00 JNZ 00518B0D
015F:00518B02 MOV EAX,[EBX+0000031C]
015F:00518B08 CALL 0046B298 //注册失败对话框
015F:00518B0D MOV DWORD PTR [EBX+00000234],00000001
015F:00518B17 XOR EAX,EAX
015F:00518B19 POP EDX
015F:00518B1A POP ECX
015F:00518B1B POP ECX

整理一下,输入注册信息。

Name: xiA Qin

Serial Number: 9876-64-8636-VM


Barcode Magic

 标 题:初学者(17) (1千字)
发信人:liutongwu
时 间:2000-7-4 21:04:57
详细信息:
Barcode Magic is a shareware utility used for the creation of barcodes.
No special installation is required. Just Unzip the bcmag210.zip, and run the executible named
setup.exe. You can launch the application from your start menu, under programs/barcode magic,
or run the executible named bcMagic.exe
This program is shareware. After 15 days of use, several features will be disabled.
Feel free to distribute this application. Any commercial distribution is prohibited without
the original authors approval.
Author:
John Denny
johnd@ichiku.com
Ichiku Software
http://www.ichiku.com/

注册码类软件

设断点bpx hmemcpy
中断后按F12键12次(第15次出错)后,按F10键若干次,用D EAX便可看到注册码
注册码格式:BM-****-***
以下是注册码生成过程:
1.输入用户名:Killer(转成大写后HEX为 4B 49 4C 4C 45 52)
软件内部有一字符串:YOU BE SLICK(HEX为59 4F 55 20 42 45 20 53 4C 49 43 4B)
将用户名与此字符串的HEX相减,差乘3后累加起来.
59-4B=E E*3=2A 2A+0=2A
4F-49=6 6*3=12 12+2A=3C
55-4C=9 9*3=1B 1B+3C=57
4C-20=2C 2C*3=84 84+57=DB
45-42=3 3*3=9 9+DB=E4
52-45=D D*3=27 27+E4=10B
10B(HEX)=267(D) 267即第一组数字的前3位
2.第一组数字的第4位计算过程
37-30=7 7*3=15 15+0=15
36-30=6 不乘3 6+15=1B
32-30=2 2*3=6 6+1B=21
21(HEX)除A余数为3,A-3=7 7+30=37

3.第2组数字的计算过程
到此注册码为:BM-2677-***(HEX:42 4D 2D 32 36 37 37 2D)
42-20=22 22+0=22
4D-20=2D 2D*1=2D 2D+22=4F 4F除67余数为4F
2D-20=D D*2=1A 1A+4F=69 69除67余数为2
32-20=12 12*3=36 36+2=38 38除67余数为38
36-20=16 16*4=58 58+38=90 90除67余数为29
37-20=17 17*5=73 73+29=9C 9C除67余数为35
37-20=17 17*6=8A 8A+35=BF BF除67余数为58
2D-20=D D*7=5B 5B+58=B3 B3除67余数为4C
4C+20=6C 6C(HEX)=108(D)

整理后
用户名:Killer
注册码:BM-2677-108

用户名:LiuTong
注册码:BM-3964-100

破解注册码生成过程时,很费劲,差一点就放弃了.


BlindRead

 标 题:有谁能搞定这两个软件。 (209字)
发信人:guest
时 间:2000-7-17 6:22:09
详细信息:
哪位高手能破解BlindWrite和Search&Replace
BlindWrite:ftp://ftp02.softhouse.com.cn/download3/31892BW_Install.exe
Search&Replace:http://go.163.com/~nihility/down/other/sr32.zip
最好能把破解过程贴出来，谢谢！

标 题:BlindRead太变态了（1） (4千字)
发信人:guest
时 间:2000-7-17 21:11:08
详细信息:

几乎把FrogsICE中提到的检测SoftICE的方法都用上了。

* Referenced by a CALL at Address:
|:00492F15
|
:00492B88 6A00 push 00000000
:00492B8A 6A00 push 00000000
:00492B8C 6A03 push 00000003
:00492B8E 6A00 push 00000000
:00492B90 6A02 push 00000002
:00492B92 6800000080 push 80000000

* Possible StringData Ref from Code Obj ->"\\.\NTICE"
|
:00492B97 683C2C4900 push 00492C3C

* Reference To: KERNEL32.CreateFileA, Ord:0000h
|
:00492B9C E84B39F7FF Call 004064EC
:00492BA1 83F8FF cmp eax, FFFFFFFF
:00492BA4 741D je 00492BC3
:00492BA6 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Error"
|
:00492BA8 68482C4900 push 00492C48

* Possible StringData Ref from Code Obj ->"This software is not designed "
->"to operate under a debugger. The "
->"application will stop."
|
:00492BAD 68502C4900 push 00492C50
:00492BB2 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:00492BB4 E86B41F7FF Call 00406D24
:00492BB9 B801000000 mov eax, 00000001
:00492BBE E83110F7FF call 00403BF4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492BA4(C)
|
:00492BC3 6A00 push 00000000
:00492BC5 6A00 push 00000000
:00492BC7 6A03 push 00000003
:00492BC9 6A00 push 00000000
:00492BCB 6A02 push 00000002
:00492BCD 6800000080 push 80000000

* Possible StringData Ref from Code Obj ->"\\.\SIWVID"
|
:00492BD2 68A82C4900 push 00492CA8

* Reference To: KERNEL32.CreateFileA, Ord:0000h
|
:00492BD7 E81039F7FF Call 004064EC
:00492BDC 83F8FF cmp eax, FFFFFFFF
:00492BDF 741D je 00492BFE
:00492BE1 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Error"
|
:00492BE3 68482C4900 push 00492C48

* Possible StringData Ref from Code Obj ->"This software is not designed "
->"to operate under a debugger. The "
->"application will stop."
|
:00492BE8 68502C4900 push 00492C50
:00492BED 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:00492BEF E83041F7FF Call 00406D24
:00492BF4 B801000000 mov eax, 00000001
:00492BF9 E8F60FF7FF call 00403BF4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492BDF(C)
|
:00492BFE 6A00 push 00000000
:00492C00 6A00 push 00000000
:00492C02 6A03 push 00000003
:00492C04 6A00 push 00000000
:00492C06 6A02 push 00000002
:00492C08 6800000080 push 80000000

* Possible StringData Ref from Code Obj ->"\\.\SICE"
|
:00492C0D 68B42C4900 push 00492CB4

* Reference To: KERNEL32.CreateFileA, Ord:0000h
|
:00492C12 E8D538F7FF Call 004064EC
:00492C17 83F8FF cmp eax, FFFFFFFF
:00492C1A 741D je 00492C39
:00492C1C 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Error"
|
:00492C1E 68482C4900 push 00492C48

* Possible StringData Ref from Code Obj ->"This software is not designed "
->"to operate under a debugger. The "
->"application will stop."
|
:00492C23 68502C4900 push 00492C50
:00492C28 6A00 push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
|
:00492C2A E8F540F7FF Call 00406D24
:00492C2F B801000000 mov eax, 00000001
:00492C34 E8BB0FF7FF call 00403BF4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492C1A(C)
|
:00492C39 C3 ret

标 题:（2） (9千字)
发信人:guest
时 间:2000-7-17 21:17:55
详细信息:

:0046441A B057 mov al, 57
:0046441C BF00000100 mov edi, 00010000
:00464421 B900003F00 mov ecx, 003F0000
:00464426 33D2 xor edx, edx
:00464428 6844444600 push 00464444
:0046442D 64FF32 push dword ptr fs:[edx]
:00464430 892524AF4900 mov dword ptr [0049AF24], esp
:00464436 892D28AF4900 mov dword ptr [0049AF28], ebp
:0046443C 648922 mov dword ptr fs:[edx], esp
:0046443F EB1A jmp 0046445B
:00464441 90 nop
:00464442 90 nop
:00464443 90 nop
:00464444 8B2524AF4900 mov esp, dword ptr [0049AF24]
:0046444A 8B2D28AF4900 mov ebp, dword ptr [0049AF28]
:00464450 5A pop edx
:00464451 646789160000 mov fs:[0000], edx
:00464457 58 pop eax
:00464458 33C0 xor eax, eax
:0046445A C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0046443F(U), :00464472(U), :0046447D(C)
|
:0046445B F2 repnz
:0046445C AE scasb
:0046445D E325 jcxz 00464484
:0046445F 90 nop
:00464460 90 nop
:00464461 90 nop
:00464462 90 nop
:00464463 90 nop
:00464464 90 nop
:00464465 90 nop
:00464466 813F494E4943 cmp dword ptr [edi], 43494E49
:0046446C 7406 je 00464474
:0046446E 90 nop
:0046446F 90 nop
:00464470 90 nop
:00464471 90 nop
:00464472 EBE7 jmp 0046445B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046446C(C)
|
:00464474 83C704 add edi, 00000004
:00464477 813F452E4252 cmp dword ptr [edi], 52422E45
:0046447D 75DC jne 0046445B
:0046447F B801000000 mov eax, 00000001
:00464484 5A pop edx
:00464485 646789160000 mov fs:[0000], edx
:0046448B 5A pop edx
:0046448C C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:004643CA
|
:0046448D 33D2 xor edx, edx
:0046448F 68AB444600 push 004644AB
:00464494 64FF32 push dword ptr fs:[edx]
:00464497 892524AF4900 mov dword ptr [0049AF24], esp
:0046449D 892D28AF4900 mov dword ptr [0049AF28], ebp
:004644A3 648922 mov dword ptr fs:[edx], esp
:004644A6 EB1A jmp 004644C2
:004644A8 90 nop
:004644A9 90 nop
:004644AA 90 nop
:004644AB 8B2524AF4900 mov esp, dword ptr [0049AF24]
:004644B1 8B2D28AF4900 mov ebp, dword ptr [0049AF28]
:004644B7 5A pop edx
:004644B8 646789160000 mov fs:[0000], edx
:004644BE 58 pop eax
:004644BF 33C0 xor eax, eax
:004644C1 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004644A6(U)
|
:004644C2 B804000000 mov eax, 00000004
:004644C7 BD4B484342 mov ebp, 4243484B
:004644CC CC int 03
:004644CD 5A pop edx
:004644CE 646789160000 mov fs:[0000], edx
:004644D4 5A pop edx
:004644D5 B801000000 mov eax, 00000001
:004644DA C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:004643B5
|
:004644DB 33D2 xor edx, edx
:004644DD 68F9444600 push 004644F9
:004644E2 64FF32 push dword ptr fs:[edx]
:004644E5 892524AF4900 mov dword ptr [0049AF24], esp
:004644EB 892D28AF4900 mov dword ptr [0049AF28], ebp
:004644F1 648922 mov dword ptr fs:[edx], esp
:004644F4 EB1A jmp 00464510
:004644F6 90 nop
:004644F7 90 nop
:004644F8 90 nop
:004644F9 8B2524AF4900 mov esp, dword ptr [0049AF24]
:004644FF 8B2D28AF4900 mov ebp, dword ptr [0049AF28]
:00464505 5A pop edx
:00464506 646789160000 mov fs:[0000], edx
:0046450C 58 pop eax
:0046450D 33C0 xor eax, eax
:0046450F C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004644F4(U)
|
:00464510 B443 mov ah, 43
:00464512 CD68 int 68
:00464514 5A pop edx
:00464515 646789160000 mov fs:[0000], edx
:0046451B 5A pop edx
:0046451C 663D86F3 cmp ax, F386
:00464520 7407 je 00464529
:00464522 90 nop
:00464523 90 nop
:00464524 90 nop
:00464525 90 nop
:00464526 33C0 xor eax, eax
:00464528 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00464520(C)
|
:00464529 B801000000 mov eax, 00000001
:0046452E C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:004643EF
|
:0046452F 33D2 xor edx, edx
:00464531 684D454600 push 0046454D
:00464536 64FF32 push dword ptr fs:[edx]
:00464539 892524AF4900 mov dword ptr [0049AF24], esp
:0046453F 892D28AF4900 mov dword ptr [0049AF28], ebp
:00464545 648922 mov dword ptr fs:[edx], esp
:00464548 EB1A jmp 00464564
:0046454A 90 nop
:0046454B 90 nop
:0046454C 90 nop
:0046454D 8B2524AF4900 mov esp, dword ptr [0049AF24]
:00464553 8B2D28AF4900 mov ebp, dword ptr [0049AF28]
:00464559 5A pop edx
:0046455A 646789160000 mov fs:[0000], edx
:00464560 58 pop eax
:00464561 33C0 xor eax, eax
:00464563 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00464548(U)
|
:00464564 0F010D2CAF4900 sidt [0049AF2C]
:0046456B A12EAF4900 mov eax, dword ptr [0049AF2E]
:00464570 83C008 add eax, 00000008
:00464573 8B18 mov ebx, dword ptr [eax]
:00464575 83C010 add eax, 00000010
:00464578 8B00 mov eax, dword ptr [eax]
:0046457A 25FFFF0000 and eax, 0000FFFF
:0046457F 81E3FFFF0000 and ebx, 0000FFFF
:00464585 2BC3 sub eax, ebx
:00464587 83F81E cmp eax, 0000001E
:0046458A 7406 je 00464592
:0046458C 90 nop
:0046458D 90 nop
:0046458E 90 nop
:0046458F 90 nop
:00464590 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046458A(C)
|
:00464592 5A pop edx
:00464593 646789160000 mov fs:[0000], edx
:00464599 5A pop edx
:0046459A C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:00464404
|

* Possible StringData Ref from Data Obj ->"C:\ntice\nmtrans.dll"
|
:0046459B 683DAF4900 push 0049AF3D

* Reference To: KERNEL32.LoadLibraryA, Ord:0000h
|
:004645A0 E8BF20FAFF Call 00406664
:004645A5 85C0 test eax, eax
:004645A7 7419 je 004645C2
:004645A9 90 nop
:004645AA 90 nop
:004645AB 90 nop
:004645AC 90 nop

* Possible StringData Ref from Data Obj ->"NmSymIsSoftICELoaded"
|
:004645AD 6852AF4900 push 0049AF52
:004645B2 50 push eax

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:004645B3 E81420FAFF Call 004065CC
:004645B8 85C0 test eax, eax
:004645BA 7406 je 004645C2
:004645BC 90 nop
:004645BD 90 nop
:004645BE 90 nop
:004645BF 90 nop
:004645C0 FFD0 call eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004645A7(C), :004645BA(C)
|
:004645C2 C3 ret

标 题:（3） (9千字)
发信人:dr0
时 间:2000-7-17 21:20:23
详细信息:

和（2）完全一样的代码，难怪现在的软件奇大无比，实在是垃圾太多。

:00492D32 B057 mov al, 57
:00492D34 BF00000100 mov edi, 00010000
:00492D39 B900003F00 mov ecx, 003F0000
:00492D3E 33D2 xor edx, edx
:00492D40 685C2D4900 push 00492D5C
:00492D45 64FF32 push dword ptr fs:[edx]
:00492D48 8925D0A84A00 mov dword ptr [004AA8D0], esp
:00492D4E 892DD4A84A00 mov dword ptr [004AA8D4], ebp
:00492D54 648922 mov dword ptr fs:[edx], esp
:00492D57 EB1A jmp 00492D73
:00492D59 90 nop
:00492D5A 90 nop
:00492D5B 90 nop
:00492D5C 8B25D0A84A00 mov esp, dword ptr [004AA8D0]
:00492D62 8B2DD4A84A00 mov ebp, dword ptr [004AA8D4]
:00492D68 5A pop edx
:00492D69 646789160000 mov fs:[0000], edx
:00492D6F 58 pop eax
:00492D70 33C0 xor eax, eax
:00492D72 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00492D57(U), :00492D8A(U), :00492D95(C)
|
:00492D73 F2 repnz
:00492D74 AE scasb
:00492D75 E325 jcxz 00492D9C
:00492D77 90 nop
:00492D78 90 nop
:00492D79 90 nop
:00492D7A 90 nop
:00492D7B 90 nop
:00492D7C 90 nop
:00492D7D 90 nop
:00492D7E 813F494E4943 cmp dword ptr [edi], 43494E49
:00492D84 7406 je 00492D8C
:00492D86 90 nop
:00492D87 90 nop
:00492D88 90 nop
:00492D89 90 nop
:00492D8A EBE7 jmp 00492D73

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492D84(C)
|
:00492D8C 83C704 add edi, 00000004
:00492D8F 813F452E4252 cmp dword ptr [edi], 52422E45
:00492D95 75DC jne 00492D73
:00492D97 B801000000 mov eax, 00000001
:00492D9C 5A pop edx
:00492D9D 646789160000 mov fs:[0000], edx
:00492DA3 5A pop edx
:00492DA4 C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:00492CE2
|
:00492DA5 33D2 xor edx, edx
:00492DA7 68C32D4900 push 00492DC3
:00492DAC 64FF32 push dword ptr fs:[edx]
:00492DAF 8925D0A84A00 mov dword ptr [004AA8D0], esp
:00492DB5 892DD4A84A00 mov dword ptr [004AA8D4], ebp
:00492DBB 648922 mov dword ptr fs:[edx], esp
:00492DBE EB1A jmp 00492DDA
:00492DC0 90 nop
:00492DC1 90 nop
:00492DC2 90 nop
:00492DC3 8B25D0A84A00 mov esp, dword ptr [004AA8D0]
:00492DC9 8B2DD4A84A00 mov ebp, dword ptr [004AA8D4]
:00492DCF 5A pop edx
:00492DD0 646789160000 mov fs:[0000], edx
:00492DD6 58 pop eax
:00492DD7 33C0 xor eax, eax
:00492DD9 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492DBE(U)
|
:00492DDA B804000000 mov eax, 00000004
:00492DDF BD4B484342 mov ebp, 4243484B
:00492DE4 CC int 03
:00492DE5 5A pop edx
:00492DE6 646789160000 mov fs:[0000], edx
:00492DEC 5A pop edx
:00492DED B801000000 mov eax, 00000001
:00492DF2 C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:00492CCD
|
:00492DF3 33D2 xor edx, edx
:00492DF5 68112E4900 push 00492E11
:00492DFA 64FF32 push dword ptr fs:[edx]
:00492DFD 8925D0A84A00 mov dword ptr [004AA8D0], esp
:00492E03 892DD4A84A00 mov dword ptr [004AA8D4], ebp
:00492E09 648922 mov dword ptr fs:[edx], esp
:00492E0C EB1A jmp 00492E28
:00492E0E 90 nop
:00492E0F 90 nop
:00492E10 90 nop
:00492E11 8B25D0A84A00 mov esp, dword ptr [004AA8D0]
:00492E17 8B2DD4A84A00 mov ebp, dword ptr [004AA8D4]
:00492E1D 5A pop edx
:00492E1E 646789160000 mov fs:[0000], edx
:00492E24 58 pop eax
:00492E25 33C0 xor eax, eax
:00492E27 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492E0C(U)
|
:00492E28 B443 mov ah, 43
:00492E2A CD68 int 68
:00492E2C 5A pop edx
:00492E2D 646789160000 mov fs:[0000], edx
:00492E33 5A pop edx
:00492E34 663D86F3 cmp ax, F386
:00492E38 7407 je 00492E41
:00492E3A 90 nop
:00492E3B 90 nop
:00492E3C 90 nop
:00492E3D 90 nop
:00492E3E 33C0 xor eax, eax
:00492E40 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492E38(C)
|
:00492E41 B801000000 mov eax, 00000001
:00492E46 C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:00492D07
|
:00492E47 33D2 xor edx, edx
:00492E49 68652E4900 push 00492E65
:00492E4E 64FF32 push dword ptr fs:[edx]
:00492E51 8925D0A84A00 mov dword ptr [004AA8D0], esp
:00492E57 892DD4A84A00 mov dword ptr [004AA8D4], ebp
:00492E5D 648922 mov dword ptr fs:[edx], esp
:00492E60 EB1A jmp 00492E7C
:00492E62 90 nop
:00492E63 90 nop
:00492E64 90 nop
:00492E65 8B25D0A84A00 mov esp, dword ptr [004AA8D0]
:00492E6B 8B2DD4A84A00 mov ebp, dword ptr [004AA8D4]
:00492E71 5A pop edx
:00492E72 646789160000 mov fs:[0000], edx
:00492E78 58 pop eax
:00492E79 33C0 xor eax, eax
:00492E7B C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492E60(U)
|
:00492E7C 0F010DD8A84A00 sidt [004AA8D8]
:00492E83 A1DAA84A00 mov eax, dword ptr [004AA8DA]
:00492E88 83C008 add eax, 00000008
:00492E8B 8B18 mov ebx, dword ptr [eax]
:00492E8D 83C010 add eax, 00000010
:00492E90 8B00 mov eax, dword ptr [eax]
:00492E92 25FFFF0000 and eax, 0000FFFF
:00492E97 81E3FFFF0000 and ebx, 0000FFFF
:00492E9D 2BC3 sub eax, ebx
:00492E9F 83F81E cmp eax, 0000001E
:00492EA2 7406 je 00492EAA
:00492EA4 90 nop
:00492EA5 90 nop
:00492EA6 90 nop
:00492EA7 90 nop
:00492EA8 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492EA2(C)
|
:00492EAA 5A pop edx
:00492EAB 646789160000 mov fs:[0000], edx
:00492EB1 5A pop edx
:00492EB2 C3 ret

;--------------------------------------------------------------------

* Referenced by a CALL at Address:
|:00492D1C
|

* Possible StringData Ref from Data Obj ->"C:\ntice\nmtrans.dll"
|
:00492EB3 68E9A84A00 push 004AA8E9

* Reference To: KERNEL32.LoadLibraryA, Ord:0000h
|
:00492EB8 E8A737F7FF Call 00406664
:00492EBD 85C0 test eax, eax
:00492EBF 7419 je 00492EDA
:00492EC1 90 nop
:00492EC2 90 nop
:00492EC3 90 nop
:00492EC4 90 nop

* Possible StringData Ref from Data Obj ->"NmSymIsSoftICELoaded"
|
:00492EC5 68FEA84A00 push 004AA8FE
:00492ECA 50 push eax

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
|
:00492ECB E8FC36F7FF Call 004065CC
:00492ED0 85C0 test eax, eax
:00492ED2 7406 je 00492EDA
:00492ED4 90 nop
:00492ED5 90 nop
:00492ED6 90 nop
:00492ED7 90 nop
:00492ED8 FFD0 call eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00492EBF(C), :00492ED2(C)
|
:00492EDA C3 ret


BrainsBreaker

 标 题:请高手试试这个软件的破解，它的保护非常的好，要破它实在是有点难度。 (585字)
发信人:liangs
时 间:2000-7-10 21:47:29
详细信息:
软件名称：BrainsBreaker 版本：2.5 大小：953KB
软件介绍：一款拼图游戏，实在是精品中的精品！
下载地址：http://www.brainsbreaker.com

破解时请注意以下几点：
1、该软件没有用任何软件加壳,修改代码后运行程序会发现自己被修改过,但不影响运行.
2、进入界面后直接按"CTRL+F8"来呼出“注册信息框”,形式如下：

PACK: Full
NAME: The GodFader
YOUR ID: PZCRACKTEAM
KEY: 77473408754

3、我参考了国外一个2.3版本破解的补丁，他是先将主程序打个补丁，
再在“注册信息框”中输入相应的注册信息,如上所示。大家可按这个
思路来考虑。

标 题:Sunli，我已破掉完整性检验和DEMO字样显示，不知你的修改步长始终为0是怎样做的，能否具体告知，也好使该破... (233字)
发信人:guest
时 间:2000-7-12 21:48:19
详细信息:

标题: Sunli，我已破掉完整性检验和DEMO字样显示，不知你的修改步长始终为0是怎样做的，能否具体告知，也好使该破解完整。

内容:
Sunli，我已破掉完整性检验和DEMO字样显示，不知你的修改步长始终为0是怎样做的，能否具体告知，也好使该破解完整。

标 题:关于步长的描述（进来） (943字)
发信人:SunLi
时 间:2000-7-13 21:21:53
详细信息:

我又把这个软件找出来跟踪了一下，我已记不得是如何找到这个地址的了，反正是截获的ShowWindow，然后向上反了好几层。好在我还保存有改过的版本，下面是一些关于该软件中已走的步数的信息：
1，当前已走的步数保存地址：bbrk32!data+44F0，长度为long型
2，每走一步，该计数器加1，若按F5，计算机自动走一步，计数器加2，相应的代码地址为：bbrk32!text+0001A40B，代码如下：
8B 44 24 04 mov eax,[esp+04] ; 当前计数器加几
6A 01 push 01
01 41 38 add [ecx+38],eax ; 关键代码，将该语句置空即可
E8 25 00 00 00 call 0041b43e ; 没跟踪该调用的含义
C2 04 00 ret 04 ; 返回，该子程序结束

注：跟踪软件对该计数器的使用，应该可以找到一些关键的判断语句，使其可以继续玩下去，象我这样将add [ecx+38],eax语句改为nop nop nop，是能保证可以继续玩，但要存储玩的进度就比较讨厌，因为存储的结果都是已走步数为0。我对协处理器的指令不太熟，所以没有认真地分析后面的计算，希望你能继续下去。

完成后请给一个说明，我也很喜欢这个软件。

标 题:DEMO字样及完整性检验破解 (615字)
发信人:guest
时 间:2000-7-14 21:13:11
详细信息:

以下地址请用Hexwork修改，若要跟踪请在各地址前加4：
1、DEMO字样去除
39911：7407改为EB07
2、完整性检验
共四处，地址分别为：06D80、07C51、110BF、4B31E
第一处为程序启动检验，可修改8C459:7427为EB27
其它三处为中间检验，我是按如下修改的，今天在测试过程中发现，尚存在一些问题，就是改完后有时屏幕方块画面会覆盖一些小马赛克，请高手协助跟踪一下，看如何解决。
第二处：07AF1:0F84F5000000改为909090909090
第三处：11032:0F850B220000改为90E90B220000
第四处：4B161:0F8454010000改为909090909090
感谢Sunli对步长的破解，因明日出差，暂时先把做的这些公布出来，这两天谁有时间再完善一下吧，我暂时尚无时间整理。

标 题:大家请看... (161字)
发信人:liangs
时 间:2000-7-15 14:54:26
详细信息:

如果去掉00404D09处的启动完整性检验提示，就会在拼图时出现
马赛克现象.guest在上面的破解只去掉了主界面上的Demo显示，
并没有去掉进入拼图界面里的图片上的Demo显示.

附：冰毒的一篇破解参考：（软件手术室）

BrainsBreaker 2.5.01 --- 不成功的破解

目标程序：BrainsBreaker 2.5.01
程序 址：http://www.brainsbreaker.com 或者 http://jtrujillo.pair.com/bb
文件大小：文件包 929KB；主文件 BBrk32.exe 700KB
教程写作: Breakice
写作日期: 2000年6月18日
使用工具：Softice 3.23; W32Dasm 8.9
特别声明: 本文只作技术交流用途. 转贴请保持完整
1. 引言
BrainsBreaker是一款很棒的拼图游戏. 未注册版本有注册提示; 部分拼图有Demo字样,这些拼图会限定所拼的块数. 软件保护做得很好,对于水平仍旧很菜的我而言,尚不能搞定它. 但因为最近没做别的破解,就把大致过程写出来凑个数,另外也是抛砖引玉,希望感兴趣的朋友们试试. 期待高手做出完美的破解来.
2. 破解过程

1. 去除"Demo"字样: 最容易的部分. 用Hex Editor打开BBrk32.EXE,找"Demo". 把找到的第二处Null掉. 再找"(Demo mode)",同样Null掉. 再看拼图画面,干净了许多. 但是那些本来有"Demo"标志的拼图上还有个小的透明框.

2. 去掉透明框:

:004318B2 85C0                    test eax, eax
:004318B4 0F84EF000000            je 004319A9 /改jmp

3. 去掉拼图开始及结束时的NAG

:0043BF86 E889D80300              call 00479814
:0043BF8B 395D0C                  cmp dword ptr [ebp+0C], ebx
:0043BF8E 7532                    jne 0043BFC2 /改jmp

4. 去掉块数限制:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412A9C(U)
|
:004129C2 0FBE435C                movsx eax, byte ptr [ebx+5C]
:004129C6 0FBE735C                movsx esi, byte ptr [ebx+5C]
:004129CA 0FBF444350              movsx eax, word ptr [ebx+2*eax+50]
:004129CF 0FBF747344              movsx esi, word ptr [ebx+2*esi+44]
:004129D4 8D3C85FEFFFFFF          lea edi, dword ptr [4*eax+FFFFFFFE]
:004129DB 03C0                    add eax, eax
:004129DD 0FAFF7                  imul esi, edi
:004129E0 0FBF55C8                movsx edx, word ptr [ebp-38]
:004129E4 2BF0                    sub esi, eax
:004129E6 8955EC                  mov dword ptr [ebp-14], edx
:004129E9 3BD6                    cmp edx, esi
:004129EB 0F8DB0000000            jnl 00412AA1
:004129F1 0FBE435C                movsx eax, byte ptr [ebx+5C]
:004129F5 0FBF544344              movsx edx, word ptr [ebx+2*eax+44]
:004129FA 0FBE435C                movsx eax, byte ptr [ebx+5C]
:004129FE 8D3495FEFFFFFF          lea esi, dword ptr [4*edx+FFFFFFFE]
:00412A05 03D2                    add edx, edx
:00412A07 668B444350              mov ax, word ptr [ebx+2*eax+50]
:00412A0C 660FAFC6                imul ax, si
:00412A10 2BC2                    sub eax, edx
:00412A12 6685C0                  test ax, ax
:00412A15 741F                    je 00412A36
:00412A17 DB45EC                  fild dword ptr [ebp-14]
:00412A1A 0FBFC0                  movsx eax, ax
:00412A1D DC0DF0C74900            fmul qword ptr [0049C7F0]
:00412A23 8945F8                  mov dword ptr [ebp-08], eax
:00412A26 DB45F8                  fild dword ptr [ebp-08]
:00412A29 DEF9                    fdivp st(1), st(0)
:00412A2B D81D40C74900            fcomp dword ptr [0049C740]
:00412A31 DFE0                    fstsw ax
:00412A33 9E                      sahf
:00412A34 7707                    ja 00412A3D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412A15(C)
|
:00412A36 66837DC878              cmp word ptr [ebp-38], 0078 /*
:00412A3B 7E58                    jle 00412A95

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412A34(C)
|
:00412A3D 66837DC828              cmp word ptr [ebp-38], 0028 /*
:00412A42 7F45                    jg 00412A89
:00412A44 0FBE435C                movsx eax, byte ptr [ebx+5C]
:00412A48 0FBF544344              movsx edx, word ptr [ebx+2*eax+44]
:00412A4D 0FBE435C                movsx eax, byte ptr [ebx+5C]
:00412A51 8D3495FEFFFFFF          lea esi, dword ptr [4*edx+FFFFFFFE]
:00412A58 03D2                    add edx, edx
:00412A5A 668B444350              mov ax, word ptr [ebx+2*eax+50]
:00412A5F 660FAFC6                imul ax, si
:00412A63 2BC2                    sub eax, edx
:00412A65 6685C0                  test ax, ax
:00412A68 742B                    je 00412A95
:00412A6A DB45EC                  fild dword ptr [ebp-14]
:00412A6D 0FBFC0                  movsx eax, ax
:00412A70 DC0DF0C74900            fmul qword ptr [0049C7F0]
:00412A76 8945F8                  mov dword ptr [ebp-08], eax
:00412A79 DB45F8                  fild dword ptr [ebp-08]
:00412A7C DEF9                    fdivp st(1), st(0)
:00412A7E D81D90C84900            fcomp dword ptr [0049C890]
:00412A84 DFE0                    fstsw ax
:00412A86 9E                      sahf
:00412A87 760C                    jbe 00412A95

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412A42(C)
|
:00412A89 8B45C0                  mov eax, dword ptr [ebp-40]
:00412A8C 83B87801000032          cmp dword ptr [eax+00000178], 00000032 /*
:00412A93 7F0C                    jg 00412AA1 /这里nop掉

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00412A3B(C), :00412A68(C), :00412A87(C)
|
:00412A95 FF45E4                  inc [ebp-1C]
:00412A98 8345C802                add dword ptr [ebp-38], 00000002
:00412A9C E921FFFFFF              jmp 004129C2

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004129EB(C), :00412A93(C)
|
:00412AA1 0FBE435C                movsx eax, byte ptr [ebx+5C]
:00412AA5 0FBE735C                movsx esi, byte ptr [ebx+5C]
:00412AA9 0FBF444350              movsx eax, word ptr [ebx+2*eax+50]
:00412AAE 0FBF747344              movsx esi, word ptr [ebx+2*esi+44]
:00412AB3 0FBF55E4                movsx edx, word ptr [ebp-1C]
:00412AB7 8D3C85FEFFFFFF          lea edi, dword ptr [4*eax+FFFFFFFE]
:00412ABE 8955F8                  mov dword ptr [ebp-08], edx
:00412AC1 0FAFF7                  imul esi, edi
:00412AC4 03D2                    add edx, edx
:00412AC6 03C0                    add eax, eax
:00412AC8 2BF0                    sub esi, eax
:00412ACA 8D040A                  lea eax, dword ptr [edx+ecx]
:00412ACD 3BC6                    cmp eax, esi
:00412ACF 0F848F000000            je 00412B64

* Reference To: WINMM.timeGetTime, Ord:0098h
                                  |
:00412AD5 8B354CC54900            mov esi, dword ptr [0049C54C]
:00412ADB 3BD1                    cmp edx, ecx
:00412ADD 7C07                    jl 00412AE6
:00412ADF 66837DE419              cmp word ptr [ebp-1C], 0019 /*
:00412AE4 7D0F                    jge 00412AF5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412ADD(C)
|
:00412AE6 FFD6                    call esi
:00412AE8 2B05109A4A00            sub eax, dword ptr [004A9A10]
:00412AEE 3D30750000              cmp eax, 00007530
:00412AF3 730B                    jnb 00412B00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412AE4(C)
|
:00412AF5 66837DE408              cmp word ptr [ebp-1C], 0008 /*
:00412AFA 0F8F11010000            jg 00412C11

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412AF3(C)
|
:00412B00 FFD6                    call esi /nag
:00412B02 6A30                    push 00000030
:00412B04 A3109A4A00              mov dword ptr [004A9A10], eax
:00412B09 E87F690600              call 0047948D
:00412B0E 8BF0                    mov esi, eax
:00412B10 59                      pop ecx
:00412B11 85F6                    test esi, esi
:00412B13 7435                    je 00412B4A
:00412B15 FF75F8                  push [ebp-08]
:00412B18 66C745EC5C02            mov [ebp-14], 025C

把00412A93行nop掉以后,提醒你还有多少可玩的nag不会出现了,但是无论你用作弊(F5)还是自己拼图,还是无法再多玩一块.

5. 让作弊方式(F5)可以继续:

:0044A238 FF5614                  call [esi+14]
:0044A23B F6460C02                test [esi+0C], 02
:0044A23F 7503                    jne 0044A244
:0044A241 FF5618                  call [esi+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044A23F(C)
|
:0044A244 F6460C04                test [esi+0C], 04
:0044A248 7415                    je 0044A25F /这里改为jmp
:0044A24A 85F6                    test esi, esi
:0044A24C 0F84AC060000            je 0044A8FE
:0044A252 8B06                    mov eax, dword ptr [esi]

这样F5可以一直玩到结束了. 但试自己拼图时,还是不行.

6. 使自己拼图可以继续:

:00411F5B FF559C                  call [ebp-64]
:00411F5E F6459402                test [ebp-6C], 02
:00411F62 7503                    jne 00411F67
:00411F64 FF55A0                  call [ebp-60]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411F62(C)
|
:00411F67 F6459404                test [ebp-6C], 04
:00411F6B 7507                    jne 00411F74 /这里nop掉
:00411F6D 8BCF                    mov ecx, edi
:00411F6F E8DCDCFFFF              call 0040FC50

这样可以玩了,但很快便发现选中放下的拼图块会莫名其妙的消失,用作弊方式拼图也会一团糟.

7. 让一切恢 正常:

:00412E21 8B45C0                  mov eax, dword ptr [ebp-40]
:00412E24 8B7508                  mov esi, dword ptr [ebp+08]
:00412E27 83B87801000032          cmp dword ptr [eax+00000178], 00000032
:00412E2E 7F06                    jg 00412E36 /这里nop掉
:00412E30 837E2000                cmp dword ptr [esi+20], 00000000
:00412E34 7466                    je 00412E9C

于是一切看来又正常了. 只是程序启动时和拼图过程中会有文件被改动的nag.

8. 去掉启动时的nag

* Possible StringData Ref from Data Obj ->"mbbrk32"
                                  |
:00406B66 689C5A4A00              push 004A5A9C
:00406B6B 53                      push ebx
:00406B6C 53                      push ebx
:00406B6D A358984A00              mov dword ptr [004A9858], eax
:00406B72 33FF                    xor edi, edi
:00406B74 E854020800              call 00486DCD
:00406B79 83C40C                  add esp, 0000000C
:00406B7C 3D22334455              cmp eax, 55443322 /Magic Number
:00406B81 7403                    je 00406B86 /改jmp

这样启动时一般不再出现文件被改动的nag,但拼图时还有随 弹出的nag.

9. 难以去掉的随 的nag

* Referenced by a CALL at Addresses:
|:00406D80   , :00407C51   , :0040D1C4   , :004110BF   , :00413B1D
|:00424D55   , :0043A1A7   , :0044B31E
|
:00404CCC 56                      push esi
:00404CCD 8BF1                    mov esi, ecx
:00404CCF 68D8000000              push 000000D8
:00404CD4 E8B4470700              call 0047948D
:00404CD9 85C0                    test eax, eax
:00404CDB 59                      pop ecx
:00404CDC 740A                    je 00404CE8
:00404CDE 56                      push esi
:00404CDF 8BC8                    mov ecx, eax
:00404CE1 E88C030000              call 00405072
:00404CE6 EB02                    jmp 00404CEA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404CDC(C)
|
:00404CE8 33C0                    xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404CE6(U)
|
:00404CEA 837C240800              cmp dword ptr [esp+08], 00000000
:00404CEF 7407                    je 00404CF8
:00404CF1 80888500000010          or byte ptr [eax+00000085], 10

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404CEF(C)
|
:00404CF8 8B4E1C                  mov ecx, dword ptr [esi+1C]
:00404CFB 894820                  mov dword ptr [eax+20], ecx
:00404CFE 8B4E70                  mov ecx, dword ptr [esi+70]
:00404D01 898880000000            mov dword ptr [eax+00000080], ecx
:00404D07 8BC8                    mov ecx, eax
:00404D09 E858130000              call 00406066 /这里产生对话框
:00404D0E 5E                      pop esi
:00404D0F C20400                  ret 0004

00406D80的Call是产生启动时的nag,前面的patch后已经跳过; 00407C51,004110BF两处的Call产生随 的NAG,不能nop掉. 如果追进00404D09行的Call,里面还有几处子例程的调用,但这几处也被用于产生别的对话框. 只能在00404D09行打补丁. 但patch后会见到不少图块上带有"划痕". :( 这块补丁打不打,只好自个儿权衡了.

3. 结语
这是一次失败的破解. 不仅没有解决随 弹出的文件被改动的nag,而且自己制做的新拼图在选择超过50块以上的拼图时,虽然作弊模式一般没问题,但若自己拼图到一定块数时程序多半会崩溃. :( 找出有效的注册序号,写出相应的注册 才是克锐客(Cracker)应当追求的目标和境界.


BuddyPhone

 标 题:谁来帮帮我?IP电话BuddyPhone 的破解. (417字)
发信人:guest
时 间:2000-7-13 19:57:31
详细信息:
软件名称：BuddyPhone
保护:注册码
下载:http://ilike.myrice.com/soft_chat/buddyphone_1.html

软件简介：
    一款小巧玲珑，性能优异，操作简单的网络电话。其优异而平滑的通话质量，对硬件的低要求，清晰明白的界面，与 ICQ 天衣无缝的链接，简单顺手的操作。

这软件要移去广告条必需要输入注册码,我试过破解,己找到注册码比较处,但其算法我看不懂,请高手指点为感.

地址:4135DB附近的CALL是比较核心处,在这代码下面还有一处比较.

标 题:需要写注册机 (2千字)
发信人:dr0
时 间:2000-7-13 21:46:31
详细信息:

不过注册机还是很好写的。

它先检查注册码中是否有横杠字符，即注册码是分成两部分的。

015F:004135C7 PUSH 2D //横杠字符
015F:004135C9 LEA ECX,[ESP+18]
015F:004135CD MOV [ESP+30],EDI
015F:004135D1 CALL 00440EB8 //检查有无横杠
015F:004135D6 MOV EDI,EAX
015F:004135D8 CMP EDI,-01
015F:004135DB JZ 004137A1 //jum if bad guy

然后就根据FirstName、LastName、ProductID和注册码的前半部分计算出注册码的后半部分。

015F:0041368A MOV EDX,[ESP+24]
015F:0041368E MOV ECX,[ESP+20]
015F:00413692 MOV AL,[EDX] //FirstName的首字符（大写）
015F:00413694 MOV DL,[ECX] //Lastname的首字符（大写）
015F:00413696 MOV [ESP+13],AL
015F:0041369A MOV EAX,[ESP+1C]
015F:0041369E PUSH EAX
015F:0041369F MOV [ESP+16],DL
015F:004136A3 CALL 0042B330 //将注册码前半部分转换成整数
015F:004136A8 MOVSX ECX,BYTE PTR [ESP+16] //LastName的首字符(大写）
015F:004136AD MOVSX EDX,BYTE PTR [ESP+17] //FirstName的首字符（大写）
015F:004136B2 SHL ECX,08
015F:004136B5 ADD ECX,EDX
015F:004136B7 MOV EDX,[0046B250] //取出ProcuctID
015F:004136BD ADD EAX,EDX //和注册码前半部分相加
015F:004136BF LEA EDI,[EAX+ECX+FFFF7BD8] //edi中放的就是注册码的后半部分的正确值
015F:004136C6 MOV EAX,[ESP+1C]
015F:004136CA PUSH EAX
015F:004136CB CALL 0042B330 //将你输入的注册码的后半部分转换成整数
015F:004136D0 ADD ESP,08
015F:004136D3 CMP EDI,EAX //比较后半部分
015F:004136D5 MOV EDI,00000001 //good guy
015F:004136DA JZ 004136E0 //jump if bad guy
015F:004136DC MOV EDI,[ESP+2C] //bad guy
015F:004136E0 LEA ECX,[ESP+18]
015F:004136E4 MOV BYTE PTR [ESP+38],03
015F:004136E9 CALL 00440A3D
015F:004136EE LEA ECX,[ESP+1C]
015F:004136F2 MOV BYTE PTR [ESP+38],02
015F:004136F7 CALL 00440A3D
015F:004136FC TEST EDI,EDI
015F:004136FE JZ 004137A1 //jump if bad guy


CacheX

 标 题:求助！！！ (886字)
发信人:guest
时 间:2000-7-12 18:09:01
详细信息:
如何在TRW2000v1.22中抓如下样式的屏幕

:004F4055 55 push ebp
:004F4056 8BEC mov ebp, esp
:004F4058 83EC0C sub esp, 0000000C
:004F405B 8B4D08 mov ecx, dword ptr [ebp+08]
:004F405E 53 push ebx
:004F405F 56 push esi
:004F4060 33F6 xor esi, esi
:004F4062 8B4104 mov eax, dword ptr [ecx+04]
:004F4065 57 push edi
:004F4066 40 inc eax
:004F4067 C745FC79786573 mov [ebp-04], 73657879
:004F406E C745F865626162 mov [ebp-08], 62616265
:004F4075 8945F4 mov dword ptr [ebp-0C], eax

2.运行TRW2000后，运行CacheX for Internet Explorer v3.00
(download: http://www.mwso.com/)
会弹出"Debug mode not allowed"对话框，如何解决，请高手指点。

标 题:哈哈，这个CacheX挺棘手的！！ (958字)
发信人:dr0
时 间:2000-7-12 23:27:03
详细信息:

这个软件没有加壳，部分结果如下（启动的时候）：
1、调用kernel32.dll中的IsDebuggerInstalled( )判断是否驻留了系统调试器。
2、调用CreateFileA( )三次，检查SoftICE的Driver是否驻留在内存。
3、调用CreateFileA( )一次，是用来检查CRC的。
4、调用int 3两次，用来检查debugger。
5、FrogsICE还报告检测到它用SEH来发现debugger。
5、程序在执行过程中会经常用GlobalAlloc( )或LocalAlloc( )分配一段内存，
然后动态解出一段指令来放到刚分配的空间中并执行，执行完毕后又将内存释放掉。
该程序的偏移地址一般为004XXXXX，如果当前EIP为006XXXXX，则说明在执行动态解压出来的代码。
我将上述1～4打补丁之后，结果发现有一处动态解压出来的代码始终是错误的，结果总是非法操作。如下：
......
CS:0043C7D4 CALL ESI
......
即如果改了程序文件之后，CS:ESI处的指令是乱七八糟的指令，说明解压出错，导致非法操作。
猜测该程序动态解码时可能与程序的其它部分相关。如果真是这样，这个玩意儿比较难搞定。

安装时间记录在
HKEY_CLASSES_ROOT\CLSID\{5EFB6220-0DBD-11D4-841A-0060978867CF}\AutoConvertTo\@


CCED2000

 标 题:一篇没有永远没有下篇的破解指南--CCED2000 发行版-1破解实战(上) (8千字)
发信人:IceWorld
时 间:2000-8-11 17:16:24
详细信息:
一篇没有永远没有下篇的破解指南
CCED2000 发行版-1破解实战(上)

--作者：IceWorld
冰天雪地破解站
网址：http://iceworld.126.com/

唉，又要开工了......每天要开始工作前我总是这么唉叹一声，然后无可奈何的打起十二份的精神，用一只手机械地打开电源总开关，显示器，机箱电源，伴随着从PC喇叭中穿来“嘟”的一声，把我从胡思乱想的边缘拉了回来。

好了，不多说废话了（免得被人说我有骗稿费之嫌，西西）让我们先来检查一下工作所需要的劳动器材：
(1)Soft-ICE For Windows95/98 v4.05
动态跟踪的极品软件，尽管还有TRW，我还是爱它，习惯称它叫兄弟
(2)URSoft W32Dasm v8.93
用来破解软件最好的静态分析工具，IDA太过专业我不用它
(3)R!SC's Process Patcher v1.5.1
内存Patch软件，作用我在下面会说到它
(4)UltraEdit-32 v7.2
修改文件专用，老牌子了，高手用的都是它（西西，我可不是高手呀）
(5)FileInfo v2.4
我常用它来看文件被什么软件加密！
(6)一瓶百事可乐（要大瓶的那种）
这个不用我多说了吧，健脑提神上上之佳品，可是我怕以后会生不出小孩子！
我的机器配置：Celeron 400(Slot 1),128M HY(PC-100),Trident 9880(8M),
FireBall 10G,Acer 40XCD,Creative VIBRA128,Motorola 56K Modem,Daytek 17"

喝上一口可乐，大叫一声“我有，我可以”。输入我熟悉的 SIW 就进入了我们的工作平台 Windows98，大家别以为我的桌面有多乱，嘿嘿，我的桌面才2个图标，系统资源：98%可用，厉害吧！什么，你的才80%，算了吧，如果你不会优化自己的系统，或者你的桌面杂乱无章，我劝你还是先学一下怎么优化系统吧！一个优秀的Cracker，对自己的工作平台应该是非常熟悉的！

进入正题，再喝一口可乐。先用 FileInfo 看一下执行文件是否被加密？西西，很幸运，没问题，那我可以省下很多时间了，为了庆祝，再来一口。既然没有加密，那么现在该抡到我们的元老级工具 W32Dasm 出场了，载入文件，也没问题，这么善良，今天我真是幸运儿，让我再喝一口...经过漫长的等待（3分钟而已）程序中的代码就清楚的出现在我的面前！好吧，先运行 CCED 看一下加密方式。啊喔，出错了，无效的地址调用？朱崇军应该没有这么白痴吧，刚运行就出错，看来大概是我的 Soft-ICE 有问题了。唉，为什么现在的软件都要防你呢？我可怜的 Soft-ICE，为了不让别人找到你的身影，我已经在你的身上打满了补丁，呜呜...事到如今，摆在面前的只有2条路：自己找反跟踪代码，或用FrogeICE（喂，老兄，还有没有第三条路？有呀，删除你的CCED，关掉你的计算机，睡觉去呀！）唉，明知山有虎，偏向虎山行，谁让我喜欢想难度挑战呢！在这里，我用 CreateFileA 来拦截，看来幸运又一次被我抓到了，呵呵，原来是用这个方法来找我的兄弟，看我不把你给K了。

* Possible StringData Ref from Data Obj ->"\\.\SICE"
|
:00530B99 68A4226100 push 006122A4
:00530B9E FF15D87E6200 Call KERNEL32.CreateFileA
:00530BA4 8945FC mov dword ptr [ebp-04], eax
:00530BA7 837DFCFF cmp dword ptr [ebp-04], FFFFFFFF
:00530BAB 7411 je 00530BBE
:00530BAD 8B45FC mov eax, dword ptr [ebp-04]
:00530BB0 50 push eax
:00530BB1 FF15E47E6200 Call KERNEL32.CloseHandle
:00530BB7 B801000000 mov eax, 00000001
:00530BBC EB39 jmp 00530BF7
:00530BBE 6A00 push 00000000
:00530BC0 6880000000 push 00000080
:00530BC5 6A03 push 00000003
:00530BC7 6A00 push 00000000
:00530BC9 6A03 push 00000003
:00530BCB 68000000C0 push C0000000

* Possible StringData Ref from Data Obj ->"\\.\NTICE"
|
:00530BD0 68B0226100 push 006122B0
:00530BD5 FF15D87E6200 Call KERNEL32.CreateFileA
:00530BDB 8945FC mov dword ptr [ebp-04], eax
:00530BDE 837DFCFF cmp dword ptr [ebp-04], FFFFFFFF
:00530BE2 7411 je 00530BF5
:00530BE4 8B4DFC mov ecx, dword ptr [ebp-04]
:00530BE7 51 push ecx

:00530BE8 FF15E47E6200 Call KERNEL32.CloseHandle
:00530BEE B802000000 mov eax, 00000002
:00530BF3 EB02 jmp 00530BF7

:00530BF5 33C0 xor eax, eax
:00530BF7 8BE5 mov esp, ebp
:00530BF9 5D pop ebp
:00530BFA C3 ret
看到了吗？上面这段代码就是用来查找 Soft-ICE 的一种方法，不管是在98还是在NT下都可以用得到，现在让我来给它做个小手术，将530BAB处的代码改个跳转方向，西西，猜到了吗？跳到哪里？

好了，一块这么大的拌脚石被我清除了，好好的喝一大口可乐奖励自己吧！接下来就是关键的一步了，让它成为注册版。可是从哪里入手呢？通常一个软件的关于对话框中会有注册的相关信息，CCED也不例外：未注册或注册未成功。
突破口找到了，用 W32Dasm 寻找这个信息，定位在 407E21 处，并提示是从 407DCC 处跳转的。好吧，让我们来看看这段代码：

* Possible StringData Ref from Data Obj ->"授权结果："
|
:00407DB4 6868875F00 push 005F8768
:00407DB9 8D4DF0 lea ecx, dword ptr [ebp-10]
:00407DBC E841CF1700 call 00584D02
:00407DC1 C645FC03 mov [ebp-04], 03
:00407DC5 833D981F620001 cmp dword ptr [00621F98], 00000001
:00407DCC 7E53 jle 00407E21
:00407DCE A164236200 mov eax, dword ptr [00622364]
:00407DD3 2500000800 and eax, 00080000
:00407DD8 85C0 test eax, eax
:00407DDA 7536 jne 00407E12

* Possible StringData Ref from Data Obj ->"加密盘识别成功，软件编号="
|
:00407DDC 6874875F00 push 005F8774
:00407DE1 8D4DF0 lea ecx, dword ptr [ebp-10]
:00407DE4 E849D21700 call 00585032
:00407DE9 6A10 push 00000010
:00407DEB 8D8DCCFEFFFF lea ecx, dword ptr [ebp+FFFFFECC]
:00407DF1 51 push ecx
:00407DF2 8B1564236200 mov edx, dword ptr [00622364]
:00407DF8 52 push edx
:00407DF9 E8C28C1600 call 00570AC0
:00407DFE 83C40C add esp, 0000000C
:00407E01 8D85CCFEFFFF lea eax, dword ptr [ebp+FFFFFECC]
:00407E07 50 push eax
:00407E08 8D4DF0 lea ecx, dword ptr [ebp-10]
:00407E0B E822D21700 call 00585032
:00407E10 EB0D jmp 00407E1F

* Possible StringData Ref from Data Obj ->"注册成功"
|
:00407E12 6890875F00 push 005F8790
:00407E17 8D4DF0 lea ecx, dword ptr [ebp-10]
:00407E1A E813D21700 call 00585032
:00407E1F EB0D jmp 00407E2E

* Possible StringData Ref from Data Obj ->"未注册或注册未成功"
|
:00407E21 689C875F00 push 005F879C
:00407E26 8D4DF0 lea ecx, dword ptr [ebp-10]
:00407E29 E804D21700 call 00585032

看到了吗？关键指令就是在 407DC5 处的这个判断，如果 621F98 处的值小与或等于1的话就什么都没了，407DDA 处的跳转知识判断你是用注册码还是加密盘进行授权的，至于注册的方式是注册码还是加密盘，完全看你个人的喜好了！我挑选了注册码方式，先呼出 Soft-ICE，下 BPM 621F98 W，然后用 BD 先关闭这个断点，进入软件的“电子注册”，输入注册码“8888888888”，按确认后退出。呼出 Soft-ICE，用 BE 打开断点后再运行 CCED2000，这是代码停在了这里。

:004056E3 C7811804000000000000 mov dword ptr [ebx+00000418],0

然后软件就再也没有对这个地址进行写入的动作，看来我只有在这个指令上动手脚了！既然小与等于1是错误的，那我就用2来代替吧。将上面这个指令改为

:004056E3 C7811804000002000000 mov dword ptr [ebx+00000418],2

看看结果如何？西西，不用我说大家都知道了！（我要喝可乐）可是很明显这个指令不是真的判断注册码处的地方，只是对是否注册的这个全局变量进行初始化，真正的判断还在后面，但是今天我不想把所有地方都写出来，否则就没有任何意义了，那我也不用写这篇指南，还不如将修改方法直接告诉大家吧！其实用上面这个方法是不完美的。如果你是一个真正的 Cracker，就应该接着研究下去。

接着当然是修改文件中的代码了，咦，提示“错误：CCED2000执行文件已被非法修改，请检查病毒并重新安装系统！”。看来这个软件还有自我保护功能，西西，我喜欢！用 BPX MESSAGEBOXA 拦截消息窗口，很快可以找到下面这段代码，将 405F49 处的判断改为 JMP 就可以了！

:00405F3F 668B8455E0FEFFFF mov ax, word ptr [ebp+2*edx-00000120]
:00405F47 3BC8 cmp ecx, eax
:00405F49 7433 je 00405F7E <- 文件是否被修改

再运行一下，怎么样？省了60多元钱了吧，请我喝可乐哦！啊？凌晨3点多了，可乐也喝完了，改收工了。

总结：其实上面这些改法只是给大家做参考的，真正运行起来还会有一些问题，但我写这篇教程的目的只是叫大家如何钓鱼，而不是给您鱼吃！希望大家看了后能有所提高，这样我的目的也达到了！

IceWorld
写与2000年8月10日


CD Box Labeler Pro

 标 题:菜鸟破解实录(16)之 CD Box Labeler Pro (4千字)
发信人:xiA Qin
时 间:2000-8-3 16:28:27
详细信息:
菜鸟破解实录(16)之 CD Box Labeler Pro

软件名称：CD Box Labeler Pro
版 本：v1.4.1.806
简 介：
相当简单的CD外盒标签的制作软件，内建一个制作精灵，可一步步轻而易举的完成制作，您只需选好图片，打入文字、调调文字的颜色及大小，立即完成一个漂亮的CD外盒标签，且可将它打印出来使用。

作 者：xiA Qin
级 别：很菜....很菜....
解密日前：2000年8月2日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行CD Box Labeler Pro
输入注册信息
name: xiA Qin &任意输入
Serial Number: 9876543210 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令

.................................

015F:00522E0D MOV EAX,[EBP-04]
015F:00522E10 CALL 00404128
015F:00522E15 XOR ESI,ESI
015F:00522E17 MOV EBX,EAX
015F:00522E19 TEST EBX,EBX
015F:00522E1B JLE 00522E3E
015F:00522E1D INC ESI
015F:00522E1E LEA EAX,[EBP-08]
015F:00522E21 PUSH EAX
015F:00522E22 MOV ECX,00000001
015F:00522E27 MOV EDX,ESI
015F:00522E29 MOV EAX,[EBP-04]
015F:00522E2C CALL 00404330
015F:00522E31 LEA EDX,[EBP-08]
015F:00522E34 MOV EAX,EDI
015F:00522E36 CALL 00522490
015F:00522E3B DEC EBX
015F:00522E3C JNZ 00522E1D
015F:00522E3E MOV EAX,[005C3F08]
015F:00522E43 IMUL EBX,[EAX],0000037D
015F:00522E49 MOV EAX,[005C3F08]
015F:00522E4E IMUL ESI,[EAX],000005B3
015F:00522E54 PUSH 00523084
015F:00522E59 LEA EDX,[EBP-24]
015F:00522E5C MOV EAX,EBX
015F:00522E5E CALL 00409170 //生成注册码的中间部分:260756
015F:00522E63 PUSH DWORD PTR [EBP-24]
015F:00522E66 PUSH 00523094
015F:00522E6B LEA EDX,[EBP-28]
015F:00522E6E MOV EAX,ESI
015F:00522E70 CALL 00409170 //生成注册码的后面部分:426028
015F:00522E75 PUSH DWORD PTR [EBP-28]
015F:00522E78 LEA EAX,[EBP-10]
015F:00522E7B MOV EDX,00000004
015F:00522E80 CALL 004041E8 <-注册码的组合。
015F:00522E85 MOV EAX,[EBP-0C] //输入的注册码 D EAX
015F:00522E88 MOV EDX,[EBP-10] //正确的注册码 D EDX
015F:00522E8B CALL 00404238 //比较注册码。
015F:00522E90 JNZ 00522F3E //跳到00522F3E,就死定了。
015F:00522E96 MOV DL,01
015F:00522E98 MOV EAX,[00474C00]
015F:00522E9D CALL 00474E1C
015F:00522EA2 MOV [EBP-14],EAX
015F:00522EA5 XOR EAX,EAX
015F:00522EA7 PUSH EBP
015F:00522EA8 PUSH 00522EF8
015F:00522EAD PUSH DWORD PTR FS:[EAX]
015F:00522EB0 MOV FS:[EAX],ESP
015F:00522EB3 MOV CL,01
015F:00522EB5 MOV EDX,005230A0
015F:00522EBA MOV EAX,[EBP-14]
015F:00522EBD CALL 0047503C
015F:00522EC2 MOV ECX,[EBP-04]
015F:00522EC5 MOV EDX,005230E8
015F:00522ECA MOV EAX,[EBP-14]
015F:00522ECD CALL 0047558C
015F:00522ED2 MOV ECX,[EBP-0C]
015F:00522ED5 MOV EDX,005230F4
015F:00522EDA MOV EAX,[EBP-14]
015F:00522EDD CALL 0047558C
015F:00522EE2 XOR EAX,EAX
015F:00522EE4 POP EDX
015F:00522EE5 POP ECX
015F:00522EE6 POP ECX
015F:00522EE7 MOV FS:[EAX],EDX
015F:00522EEA PUSH 00522EFF
015F:00522EEF MOV EAX,[EBP-14]
015F:00522EF2 CALL 00403180
015F:00522EF7 RET
015F:00522EF8 JMP 004038A0
015F:00522EFD JMP 00522EEF
015F:00522EFF MOV EAX,[005C4208]
015F:00522F04 MOV EDX,[EBP-04]
015F:00522F07 CALL 00403EFC
015F:00522F0C MOV EAX,[005C3FC4]
015F:00522F11 MOV BYTE PTR [EAX],01
015F:00522F14 PUSH 00
015F:00522F16 MOV EAX,[005C421C]
015F:00522F1B MOV EAX,[EAX]
015F:00522F1D MOV CX,[005230F8]
015F:00522F24 MOV DL,02
015F:00522F26 CALL 00459AF4
015F:00522F2B MOV EAX,[005C4108]
015F:00522F30 MOV EAX,[EAX]
015F:00522F32 MOV DWORD PTR [EAX+00000234],00000001
015F:00522F3C JMP 00522F5D
015F:00522F3E MOV EAX,[005C3FC4]
015F:00522F43 MOV BYTE PTR [EAX],00
015F:00522F46 PUSH 00
015F:00522F48 MOV EAX,[005C4004]
015F:00522F4D MOV EAX,[EAX]
015F:00522F4F MOV CX,[005230F8]
015F:00522F56 MOV DL,01
015F:00522F58 CALL 00459AF4 //失败对话框
..............................

整理一下,输入注册信息。

Name: xiA Qin

Serial Number: GPS-260756-426028

注册信息在注册表中
[HKEY_CURRENT_USER\Software\Green Point Software UK\CD Box Labeler Pro\Properties]
"RG"="xiA Qin"
"SN"="GPS-260756-426028"


CDSpace 1.95

 标 题:菜鸟破解录(九)之 CDSpace 1.95 (4千字)
发信人:xiA Qin
时 间:2000-7-22 8:56:30
详细信息:
菜鸟破解录(九)之 CDSpace 1.95

软件名称：CDSpace
版 本：1.95
简 介：一个相当不错的虚拟光驱程序，操作简单，最大可同时使用23个虚拟光驱。

作 者：xiA Qin
等 级：很菜....很菜....
破解日期：2000年7月22日
破解工具：Trw2000 1.22
破解目的：学习注册码的破解（简单）

说 明：

本文是在我的软件破解记录上整理出来的。所以在文中没有任何的注册码，只作技术交流。如若有纰漏，请各位大侠多指教！

运行程序，输入注册信息。

name: xiA Qin &任意输入
code: 1234567890123456 必须是16位，为什么?程序会检查注册码位数。下面会讲到

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面的代码。
...................
015F:00409570 CALL 0040FB9E
015F:00409575 LEA ECX,[ESP+10]
015F:00409579 CALL 0040FB1A
015F:0040957E XOR ESI,ESI
015F:00409580 LEA ECX,[ESP+14]
015F:00409584 MOV [ESP+2C],ESI
015F:00409588 CALL 0040FB1A
015F:0040958D MOV EAX,[EDI+60]
015F:00409590 LEA EBP,[EDI+60]
015F:00409593 MOV BYTE PTR [ESP+2C],01
015F:00409598 CMP DWORD PTR [EAX-08],06
015F:0040959C JGE 004095AA
015F:0040959E PUSH ESI
015F:0040959F PUSH ESI
015F:004095A0 PUSH 00418810
015F:004095A5 JMP 004096AC 把16进制的10换算成10进制=16，表示注册码
015F:004095AA MOV EDX,[EDI+64] ┍──────────── 是16位
015F:004095AD LEA EBX,[EDI+64] ↓
015F:004095B0 CMP DWORD PTR [EDX-08],10 //检查注册码的位数是不是16位。
015F:004095B4 JZ 004095C2 //是16位就跳到004095C2继续检查注册码是否正确，
015F:004095B6 PUSH ESI 不然死给你看。当然我们可以把它改成无条件
015F:004095B7 PUSH ESI 跳转 JMP 。
015F:004095B8 PUSH 004187FC
015F:004095BD JMP 004096AC
015F:004095C2 XOR ECX,ECX
015F:004095C4 MOV AL,[ECX+EDX]
015F:004095C7 CMP AL,30
015F:004095C9 JL 004095CF
015F:004095CB CMP AL,39
015F:004095CD JLE 004095DF
015F:004095CF CMP AL,41
015F:004095D1 JL 0040969E
015F:004095D7 CMP AL,46
015F:004095D9 JG 0040969E
015F:004095DF INC ECX
015F:004095E0 CMP ECX,08
015F:004095E3 JL 004095C4
015F:004095E5 LEA ECX,[ESP+1C]
015F:004095E9 PUSH ECX
015F:004095EA PUSH ECX
015F:004095EB MOV ECX,ESP
015F:004095ED MOV [ESP+20],ESP
015F:004095F1 PUSH EBP
015F:004095F2 CALL 0040FC0A
015F:004095F7 MOV ECX,EDI
015F:004095F9 CALL 004096F0
015F:004095FE LEA ECX,[ESP+10]
015F:00409602 CALL 0040FCE2
015F:00409607 XOR EDX,EDX <--|
015F:00409609 LEA EAX,[ESP+14] |
015F:0040960D MOV DL,[ESI+ESP+1C] |计
015F:00409611 PUSH EDX |算
015F:00409612 PUSH 004187F4 |正
015F:00409617 PUSH EAX |确
015F:00409618 CALL 0040FB98 |的
015F:0040961D ADD ESP,0C |注
015F:00409620 LEA ECX,[ESP+14] |册
015F:00409624 PUSH ECX |码
015F:00409625 LEA ECX,[ESP+14] |.
015F:00409629 CALL 0040FBEC |注意 EDX 的变化。
015F:0040962E INC ESI |
015F:0040962F CMP ESI,08 |
015F:00409632 JL 00409607 <--|
015F:00409634 LEA ECX,[ESP+10]
015F:00409638 CALL 0040FBC8
015F:0040963D MOV ECX,EBX //正确的注册码 D EAX.
015F:0040963F CALL 0040FBC8
015F:00409644 MOV EAX,[EBX]
015F:00409646 MOV EDX,[ESP+10]
015F:0040964A PUSH EAX
015F:0040964B PUSH EDX
015F:0040964C CALL [0041268C]
015F:00409652 ADD ESP,08
015F:00409655 TEST EAX,EAX
015F:00409657 PUSH 00
015F:00409659 PUSH 00
015F:0040965B JNZ 004096A7 //比较注册码是否相等。
015F:0040965D PUSH 004187D4
015F:00409662 CALL 0040FB92 //注册成功对话框。
015F:00409667 CALL 0040FB68
015F:0040966C MOV ESI,[EAX+04]
015F:0040966F MOV EAX,[EBP+00]
015F:00409672 PUSH EAX
015F:00409673 PUSH 004187CC
015F:00409678 MOV ECX,ESI
015F:0040967A CALL 0040BD70 //注册失败对话框。
015F:0040967F MOV EAX,[EBX]
015F:00409681 MOV ECX,ESI
015F:00409683 PUSH EAX
015F:00409684 PUSH 004187C0
015F:00409689 CALL 0040BD70
015F:0040968E MOV ECX,EDI
015F:00409690 MOV BYTE PTR [ESI+000000C4],00
.........................


cleanPC

 标 题:本人写的第一篇破解文章（cleanPC) (902字)
发信人:gcehi
时 间:2000-8-16 16:02:45
详细信息:
CleanPC 破解过程。（简单，适用与初学者）

1.名称：gce （随便） ；注册代码：516688（随便）

2.crtl+m,下bpx hmemcpy 后下g

3.按F10一直到 00407025 call USER32!MessageBOXA出现错误对话框

4.往上找找有没有可以跳到此call的区域，在00406f98 jz 00406fda

发现可以，顾上面的call为要害，F9(下断点), 再 F8跟入

5.一直F10到 004073B5 call 0040746F
004073ba ADD ESP,BYTE+ 08 下d eax真正的注册码
d edx你输入的注册码

(你也可以在00406f98 jz 00406fda处下a命令，改为********* jnz ********

就可以随便添了！

解释：Q:为什么要在ADD这里下呢？？

A:因为在上面你下d ecx可看见你输入的名字，下d edx可看见
你输入的注册码，顾推测此 call 为计算注册码的，你可以
跟入，也可以过了此行看注册码（随你啦）。

名称：gce
注册代码：417-15756-339-4242


CleanReg 3.2.6

 标 题:菜鸟破解录之 CleanReg 3.2.6 (3千字)
发信人:xiA Qin
时 间:2000-8-15 9:40:42
详细信息:
菜鸟破解录之 CleanReg 3.2.6

软件名称： CleanReg
软件版本： 3.2.6
软件大小： 1574KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.cleanreg.com/
软件简介：
CleanReg3帮您将系统中无用的文件全部一扫而空。CleanReg3与一般系统登录文件修改工具软件不同的是，它并非真正立即将这些登录设定给移除掉，而是先将您的系统中目前有那些文件连结有错误的先显示出来，然后您可以再选择是要透过手动的方式选择是要忽略掉这些无用的文件或者是要移除掉。

作 者：xiA Qin
级 别：很菜....很菜.....
解密日前：2000年8月12日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行CleanReg

输入注册信息

Registered: xiA Qin &任意输入
License: 1234567890 &输入的十进制数字不能大于2147483647。
也就是十六进制不能大于 7FFFFFFF 。

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
.................
015F:004062CA MOV ECX,ESI
015F:004062CC PUSH EAX
015F:004062CD PUSH 00000409
015F:004062D2 MOV BYTE PTR [ESP+24],01
015F:004062D7 CALL 00411CC2
015F:004062DC PUSH 01
015F:004062DE PUSH 00
015F:004062E0 PUSH 000003ED
015F:004062E5 MOV ECX,ESI <-|拌脚石一块，检察输入的注册码
015F:004062E7 CALL 00411CBC |是否大于十六进数字制的7FFFFFFF
015F:004062EC MOV EDI,EAX |
015F:004062EE TEST EDI,EDI <-|
015F:004062F0 JZ 0040634E //大于7FFFFFFF,就跳，玩完了。
015F:004062F2 MOV ECX,[ESP+08]
015F:004062F6 MOV EAX,[ECX-08]
015F:004062F9 TEST EAX,EAX
015F:004062FB JLE 0040634E
015F:004062FD LEA EDX,[ESP+10]
015F:00406301 LEA EAX,[ESP+0C]
015F:00406305 PUSH EDX
015F:00406306 LEA ECX,[ESP+0C]
015F:0040630A PUSH EAX
015F:0040630B PUSH ECX
015F:0040630C CALL 00411550 //注册码运算子程序。
015F:00406311 ADD ESP,0C
015F:00406314 TEST EAX,EAX
015F:00406316 JZ 0040634E
015F:00406318 CMP [ESP+10],EDI //比较输入的注册码。
015F:0040631C JNZ 0040634E //不相等，就跳。玩完了
015F:0040631E PUSH EDI
015F:0040631F MOV ECX,0041BBA8
015F:00406324 CALL 00405A10
015F:00406329 MOV EDX,[ESP+08]
015F:0040632D MOV EAX,[0041BCFC]
015F:00406332 MOV ECX,[0041BCF8]
015F:00406338 PUSH EDX
015F:00406339 PUSH EAX
015F:0040633A PUSH ECX
015F:0040633B MOV ECX,0041BBA8
015F:00406340 CALL 00411BD8
015F:00406345 MOV ECX,ESI
015F:00406347 CALL 004116A4
015F:0040634C JMP 00406368
015F:0040634E PUSH 00
015F:00406350 PUSH 05
015F:00406352 PUSH 0041B3AC
015F:00406357 CALL 004119EC //
015F:0040635C SUB EAX,02
015F:0040635F JNZ 00406368
015F:00406361 MOV ECX,ESI
.......................

当光标在00406318 CMP [ESP+10],EDI时

看一下 EDI 和 SS:0066F344= 的值

EDI=499602D2 <<--眼熟吧...嘻嘻...就是1234567890的16进值...

SS:0066F344=66A29C38 <<--当然就是注册码罗...换算成10进值...

答案就是：1721932856

按F5回到程序。重新输入。

整理一下注册信息。
Registered: xiA Qin
License: 1721932856

注册信息在注册表中的
[HKEY_CURRENT_USER\Software\ArmstrongSystems\CleanReg3\Registered]
"CodeB"=hex:14,00,00,00,03,02,05,00,45,9c,af,66,40,ae,1f,40,04,05,c0,01
"User"="xiA Qin"


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 =)"


CuteFTP 4.0

 标 题:如何破解CuteFTP 4.0 (5千字)
发信人:dr0
时 间:2000-7-20 3:36:10
详细信息:
CuteFTP早期的版本的保护还是比较厉害的，先是KeyFile，后来才改成注册码。它有个3.x版本被拿来作为HCU（High Cracking University）的strainer。4.0版本可以变成注册版，但是输入注册码之后它要连到其公司的服务器上去验证。输入注册码之后是可以跟出注册码来的，但是通不过联机验证则它不会将注册码保存起来，所以下次启动还是未注册版。可以从它启动时开始跟踪，找到注册码，实际上所有的软件都可以从启动时入手。
用RegMon、FileMon检查一下，发现有个注册表键叫做Key1，里面放的是一些很长的乱七八糟的字符。可以用bpx RegQueryValueExA作断点，然后跟踪，但是这玩意儿读的注册表键太多，且SoftICE的条件断点又不是很灵光（我用bpx RegQueryValueExA if *(esp+8)=='Key1'作断点它不中断），所以改用W32Dasm来寻找合适的断点。将其反汇编之后查找引用到"Key1"这个字符串的地方，记下其地址作为断点，然后用Symbol Loader加载主程序，设好断点，发现在下面的地方读出该键值，但它要求Key1串的长度小于等于20。

015F:00489074 MOV ESI,[ADVAPI32!RegQueryValueExA]
015F:0048907A JNZ 004890A9
015F:0048907C MOV ECX,[ESP+10]
015F:00489080 LEA EDX,[ESP+14]
015F:00489084 PUSH EDX
015F:00489085 LEA EAX,[ESP+20]
015F:00489089 PUSH EBX
015F:0048908A PUSH EAX
015F:0048908B PUSH 00
015F:0048908D PUSH 0053E030 //Key1
015F:00489092 PUSH ECX
015F:00489093 CALL ESI //读注册表
015F:00489095 TEST EAX,EAX
015F:00489097 JNZ 004890A2
015F:00489099 MOV EDX,[ESP+10]
015F:0048909D PUSH EDX
015F:0048909E CALL EBP
015F:004890A0 JMP 00489108

.........

015F:00489108 MOV ECX,[ESP+14] //Key1串的长度
015F:0048910C CMP ECX,14 //长度小于等于0x14则继续检查
015F:0048910F JBE 0048911B
015F:00489111 POP EDI
015F:00489112 POP ESI
015F:00489113 POP EBP
015F:00489114 XOR EAX,EAX //bag guy
015F:00489116 POP EBX
015F:00489117 ADD ESP,10
015F:0048911A RET
015F:0048911B MOV EAX,[ESP+28]
015F:0048911F TEST EAX,EAX
015F:00489121 JZ 00489125
015F:00489123 MOV [EAX],ECX
015F:00489125 POP EDI
015F:00489126 POP ESI
015F:00489127 POP EBP
015F:00489128 MOV EAX,00000001
015F:0048912D POP EBX
015F:0048912E ADD ESP,10
015F:00489131 RET

将Key1串改成一个长度小于20的ASCIIZ串，重新来一遍。等它读完Key1后用BPR断点监视Key1串，会看见它把Key1转换成大写，并检查长度：

015F:004AB0F0 REPNZ SCASB
015F:004AB0F2 NOT ECX
015F:004AB0F4 DEC ECX
015F:004AB0F5 CMP ECX,0E
015F:004AB0F8 JNZ 004AB16D

可见长度应为14个字符。接下来它检查Key1的第一个字符是否为'A'，并计算注册码的其它位：

015F:00491828 CMP BYTE PTR [EBX],41 //Key1的首字符
015F:0049182B JZ 00491832
015F:0049182D POP EDI
015F:0049182E XOR EAX,EAX //bad guy
015F:00491830 POP EBX
015F:00491831 RET
015F:00491832 PUSH ESI //以下为计算过程
015F:00491833 MOV ESI,00000001
015F:00491838 MOV AL,[EBX+ESI]
015F:0049183B PUSH EAX
015F:0049183C CALL 004917D0
015F:00491841 SHL EDI,05
015F:00491844 ADD ESP,04
015F:00491847 OR EDI,EAX
015F:00491849 INC ESI
015F:0049184A CMP ESI,07
015F:0049184D JL 00491838
015F:0049184F MOV CL,[EBX+07]
015F:00491852 PUSH ECX
015F:00491853 CALL 004917D0
015F:00491858 ADD ESP,04
015F:0049185B LEA EDX,[EDI*4+00000000]
015F:00491862 SHR EAX,02
015F:00491865 POP ESI
015F:00491866 POP EDI
015F:00491867 OR EAX,EDX
015F:00491869 POP EBX
015F:0049186A RET

计算完了之后就开始比较：

015F:004AB0F0 REPNZ SCASB
015F:004AB0F2 NOT ECX
015F:004AB0F4 DEC ECX
015F:004AB0F5 CMP ECX,0E //这是刚才判长度的地方
015F:004AB0F8 JNZ 004AB16D
015F:004AB0FA PUSH ESI
015F:004AB0FB CALL 004B1B8A
015F:004AB100 PUSH 0E
015F:004AB102 LEA EAX,[ESP+20]
015F:004AB106 PUSH ESI
015F:004AB107 PUSH EAX
015F:004AB108 CALL 004AF930
015F:004AB10D LEA ECX,[ESP+28]
015F:004AB111 MOV BYTE PTR [ESP+36],00
015F:004AB116 PUSH ECX
015F:004AB117 CALL 00491820 //这是刚才计算的地方
015F:004AB11C MOV ESI,EAX
015F:004AB11E PUSH ESI
015F:004AB11F CALL 00491510
015F:004AB124 LEA EDX,[ESP+20]
015F:004AB128 MOV EDI,EAX
015F:004AB12A PUSH EDX
015F:004AB12B PUSH ESI
015F:004AB12C MOV BYTE PTR [ESP+28],00
015F:004AB131 CALL 004916A0
015F:004AB136 LEA EAX,[ESP+38]
015F:004AB13A PUSH 0E //14个字符
015F:004AB13C LEA ECX,[ESP+2C]
015F:004AB140 PUSH EAX //真注册码
015F:004AB141 PUSH ECX //假注册码
015F:004AB142 CALL 004B04D0 //比较
015F:004AB147 ADD ESP,2C
015F:004AB14A TEST EAX,EAX
015F:004AB14C JNZ 004AB15E
015F:004AB14E MOV EDX,[ESP+2C]
015F:004AB152 OR AX,FFFF //good guy
015F:004AB156 MOV [EDX],EDI
015F:004AB158 POP EDI
015F:004AB159 POP ESI
015F:004AB15A ADD ESP,20
015F:004AB15D RET
015F:004AB15E MOV EAX,[ESP+2C]
015F:004AB162 MOV [EAX],EDI
015F:004AB164 POP EDI
015F:004AB165 XOR AX,AX //bad guy
015F:004AB168 POP ESI
015F:004AB169 ADD ESP,20
015F:004AB16C RET

至此就找出了注册码。根据上面的计算和比较过程可知注册码与名字什么的没有关系，所以它启动时不用读取用户名。用RegMon监视一下它显示About对话框的时候的动作，发现它还读取RegUserName键，这显然是存放用户名的。
关键的健：
HKEY_LOCAL_MACHINE\Software\GlobalSCAPE Inc.\CuteFTP\Key1
HKEY_LOCAL_MACHINE\Software\GlobalSCAPE Inc.\CuteFTP\RegUserName
HKEY_CLASSES_ROOT\pfc
最后一个键是存放日期的，老版本的也在这里。

dr0, 2000.7.20


cutepage

 标 题:一个文岭大侠评价很高的cutepage系列的破解。（初级） (851字)
发信人:backboy
时 间:2000-8-4 16:25:30
详细信息:
以下为一系列国产软体CUTEPAGE注册号的寻找法。该软体为我们湖北人开发的一组用于网页制作的，
被文岭大侠首先破解，有着很高的评价，不过我没网页，用别人的注册号总觉。。。，^__^,好费话少说，
所用工具为SOFTICE，下载可去白菜乐园。
1.cutepage coolbutton1.5
backboy@263.net/50C52AC273583B29
D 0167:014071A4 即可见注册码。
2.cutepage coolmenu 2.5
backboy@263.net/8B15C1FC9E5F55BA
D 0167:01406BB4
3.cutepage cooltext 1.5
backboy@263.net/246A18EDC73552F5
D 0167:01406C54
4.cutepage slidingmenu 1.5
backboy@263.net/FDF63FF3ED97E686
地址忘了，不过破了上面几个，这个也没问题。
总体感觉它的保护太弱，不用跟踪也可得到注册码，很适合我们这些初哥练手！
1.另试卷生成系统1.00（可从华军软件园下载，下错了软件，但KILL掉太可惜了，一块破了）
所用工具为SOFTICE
大家可在0167：00434014 PUSH EAX 时 D EAX
北京实验小学/D3D8D-CF408-43762-DE5EC

标 题:我的破解过程如下，没有对该系列程序进行跟踪。平均不到1分钟一个. (411字)
发信人:backboy
时 间:2000-8-5 9:47:09
详细信息:

1。运行该程序，点选配置，此时出现注册窗口，选择“注册”，填入你的
邮箱地址（如backboy@263.net)及注册码（如78787878,这个我常用）。
2。crtl+d 下BPX HMEMCPY
F5返回。
3。按下注册键。程序被SOFTICE中断，此时按F5至出错框。
4。crtl+d 返回SOFTICE。
S ****:0 L FFFFFFFF '78787878' ----这时的“****”为第二次中断后的地址头。
找到后按PAGEDOWN键3次即可见到注册码。
哪位有跟踪破解的过程望能贴出。多谢了！


DBPE 注册码判断核心

 标 题:为了庆祝论坛重新开张，献上一份厚礼，DBPE 注册码判断核心 (840字)
发信人:IceWorld
时 间:2000-7-7 1:34:55
详细信息:
DBPE 注册码判断核心
作者：IceWorld
网址：http://iceworld.126.com/
注意：装载请注明出处

MOV EAX,1
XOR EBX,EBX
MOV ESI,4086EE
ADD ESI,EBP

A_1: MOV BL,[ESI] 取经过换算的注册码
CMP BL,00 到末尾了吗？
JZ A_2
MUL EBX
INC ESI
JMP A_1

A_2: XOR EAX,[EBP+40A01F]
XOR EAX,[EBP+4084CF]
XCHG AH,AL
MOV EBX,EAX 这时EBX为正确的注册码
MOV ESI,408702
ADD ESI,EBP
CALL Check_Serial 判断注册码正确与否
CMP EBX,EAX
JZ Serial_OK 如果正确则AX=1

MOV AX,0 如果错误则AX=0
RET

Serial_OK: MOV AX,1
RET

标 题:GOOD~~~~ (964字)
发信人:D.Boy
时 间:2000-7-7 12:32:05
详细信息:

不知道IceWorld对付的是哪一版本呢？ 1.2版本的得到算法代码不难，如果是
1.5的话实在佩服！ :) 1.5在前面部分的算法和1.2有些不同！

文章中有点地方有误:

A_1: MOV BL,[ESI] 取经过换算的注册码
CMP BL,00 到末尾了吗？
JZ A_2
MUL EBX
INC ESI
JMP A_1
这是对输入的名字进行换算，得CRC到EAX

A_2: XOR EAX,[EBP+40A01F]
XOR EAX,[EBP+4084CF]
xor register key和硬件代码。

XCHG AH,AL
MOV EBX,EAX 这时EBX为正确的注册码

MOV ESI,408702
ADD ESI,EBP
CALL Check_Serial 判断注册码正确与否
这个CALL是Str to int,把输入号放到EAX.

CMP EBX,EAX
JZ Serial_OK 如果正确则AX=1

MOV AX,0 如果错误则AX=0
RET

欢迎大家去K幻影，感谢大家对幻影有兴趣。 ^_^


DlgXRSizer 4.2.1.2

 标 题:菜鸟破解录之 DlgXRSizer (4千字)
发信人:xiA Qin
时 间:2000-8-17 9:29:26
详细信息:
菜鸟破解录之 DlgXRSizer

软件名称： DlgXRSizer
软件版本： 4.2.1.2
软件大小： 1658KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://web.access.net.au/jag/gajits/
软件简介： 可用来使用于打开文件、另存文件或按浏览文件夹时将浏览资料的对话方块、设成自己喜欢、习惯的大小及位置，也可设成全屏幕浏览，且可设定为打开时以文件列表的方式、也可加入日期、文件名、大小、文件格式的排序，真的大大改善Windows此方面的不便性。

作 者：xiA Qin
级 别：很菜....很菜.....
解密日前：2000年8月11日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（★★）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行DlgXRSizer
输入注册信息

Registration key: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
.................

015F:0048CCB1 PUSH EBX
015F:0048CCB2 MOV EBX,EAX
015F:0048CCB4 XOR EAX,EAX
015F:0048CCB6 PUSH EBP
015F:0048CCB7 PUSH DWORD 0048CD6C
015F:0048CCBC PUSH DWORD [FS:EAX]
015F:0048CCBF MOV [FS:EAX],ESP
015F:0048CCC2 LEA EAX,[EBP-04]
015F:0048CCC5 PUSH EAX
015F:0048CCC6 MOV ECX,[EBX+0830]
015F:0048CCCC MOV EDX,0048CD80
015F:0048CCD1 MOV EAX,0048CDA8 //输入的假的注册码
015F:0048CCD6 CALL 00453610 //有问题按F8进入。
015F:0048CCDB CMP DWORD [EBP-04],BYTE +00
015F:0048CCDF JZ 0048CD56
015F:0048CCE1 MOV EDX,[EBP-04]
015F:0048CCE4 MOV EAX,0048CDC8
015F:0048CCE9 CALL 00456940
015F:0048CCEE TEST AL,AL
015F:0048CCF0 JNZ 0048CD09
015F:0048CCF2 PUSH BYTE +00
015F:0048CCF4 MOV CX,[0048CDD4]
015F:0048CCFB MOV DL,01
015F:0048CCFD MOV EAX,0048CDE0
015F:0048CD02 CALL 004531FC //注册失败对话框，
015F:0048CD07 JMP SHORT 0048CD56
。。。。。。。。。。。。。。

按F8进入0048CCD6 CALL 00453610

改按F10来到下面指令
...................

015F:004569D8 CALL 00403E7C
015F:004569DD MOV EDX,[EBP-08]
015F:004569E0 MOV EAX,00456A94
015F:004569E5 CALL 00403F60
015F:004569EA TEST EAX,EAX
015F:004569EC JNZ 00456989
015F:004569EE LEA EDX,[EBP-14]
015F:004569F1 MOV EAX,[EBP-0C]
015F:004569F4 CALL 00408100
015F:004569F9 MOV EDX,[EBP-14] //输入的假注册码 D EDX
015F:004569FC LEA EAX,[EBP-0C]
015F:004569FF CALL 00403A94
015F:00456A04 LEA EAX,[EBP-10]
015F:00456A07 MOV EDX,[EBP-08]
015F:00456A0A CALL 00403A94 //输入的假注册码 D EDX
015F:00456A0F PUSH DWORD [EBP-0C]
015F:00456A12 PUSH DWORD 00456A94
015F:00456A17 PUSH DWORD [EBP-10]
015F:00456A1A LEA EAX,[EBP-18]
015F:00456A1D MOV EDX,03
015F:00456A22 CALL 00403D38
015F:00456A27 MOV EAX,[EBP-18] //看看假的注册码有什么变化。D EAX
015F:00456A2A LEA EDX,[EBP-14] 在假注册码前面加了一个空格。
015F:00456A2D CALL 00407F50
015F:00456A32 MOV EAX,[EBP-14]
015F:00456A35 PUSH EAX
015F:00456A36 LEA ECX,[EBP-1C]
015F:00456A39 MOV EDX,[EBP-0C]
015F:00456A3C MOV EAX,[EBP-04]
015F:00456A3F CALL 00456A98
015F:00456A44 MOV EAX,[EBP-1C]
015F:00456A47 LEA EDX,[EBP-18] //正确的注册码 D EAX
015F:00456A4A CALL 00407F50
015F:00456A4F MOV EDX,[EBP-18]
015F:00456A52 POP EAX
015F:00456A53 CALL 00403D88
015F:00456A58 JZ 00456A5E
015F:00456A5A XOR EBX,EBX
015F:00456A5C JMP SHORT 00456A60
015F:00456A5E MOV BL,01
015F:00456A60 XOR EAX,EAX
015F:00456A62 POP EDX
015F:00456A63 POP ECX
015F:00456A64 POP ECX
015F:00456A65 MOV [FS:EAX],EDX
015F:00456A68 PUSH DWORD 00456A82
015F:00456A6D LEA EAX,[EBP-1C]
015F:00456A70 MOV EDX,07
015F:00456A75 CALL 00403A20
015F:00456A7A RET
015F:00456A7B JMP 00403438
015F:00456A80 JMP SHORT 00456A6D
015F:00456A82 MOV EAX,EBX
015F:00456A84 POP EBX
015F:00456A85 MOV ESP,EBP
015F:00456A87 POP EBP
015F:00456A88 RET
..........................

整理一下,输入注册信息。

Registration key: 636298121 <--注意：注册码前面有一个空格
^
空格

注册信息在注册表中：
[HKEY_CURRENT_USER\Software\Gajits\DlgXRSizer]
"Reg String"=" 636298121"


DLL EXPLORER 2.2.2

 标 题:初学者(19) (4千字)
发信人:liutong
时 间:2000-7-10 21:30:46
详细信息:
DLL EXPLORER 2.2.2

设断点bpx hmemcpy
程序被中断后,按F12键12次,来到:

:004412E4 8B45F8 mov eax, dword ptr [ebp-08]<----可看到输入的注册码
:004412E7 8D55FC lea edx, dword ptr [ebp-04]
:004412EA E81964FCFF call 00407708
:004412EF 837DFC00 cmp dword ptr [ebp-04], 00000000
:004412F3 7525 jne 0044131A
:004412F5 6A00 push 00000000
:004412F7 668B0DF4134400 mov cx, word ptr [004413F4]
:004412FE 33D2 xor edx, edx

* Possible StringData Ref from Code Obj ->"Please enter your user name exactly "
->"as it appears in the registration "
->"information that you received."
|
:00441300 B800144400 mov eax, 00441400
:00441305 E8BAACFFFF call 0043BFC4
:0044130A 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:00441310 8B10 mov edx, dword ptr [eax]
:00441312 FF5278 call [edx+78]
:00441315 E9AB000000 jmp 004413C5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004412F3(C)
|
:0044131A 8D55F8 lea edx, dword ptr [ebp-08]
:0044131D 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:00441323 E8A411FEFF call 004224CC
:00441328 8B45F8 mov eax, dword ptr [ebp-08]
:0044132B 8D55FC lea edx, dword ptr [ebp-04]
:0044132E E8D563FCFF call 00407708
:00441333 837DFC00 cmp dword ptr [ebp-04], 00000000
:00441337 7522 jne 0044135B
:00441339 6A00 push 00000000
:0044133B 668B0DF4134400 mov cx, word ptr [004413F4]
:00441342 33D2 xor edx, edx

* Possible StringData Ref from Code Obj ->"Please enter your registration "
->"key as it appears in the registration "
->"information that you received."
|
:00441344 B870144400 mov eax, 00441470
:00441349 E876ACFFFF call 0043BFC4
:0044134E 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:00441354 8B10 mov edx, dword ptr [eax]
:00441356 FF5278 call [edx+78]
:00441359 EB6A jmp 004413C5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00441337(C)
|
:0044135B 8D55F8 lea edx, dword ptr [ebp-08]
:0044135E 8B83EC010000 mov eax, dword ptr [ebx+000001EC]
:00441364 E86311FEFF call 004224CC
:00441369 8B45F8 mov eax, dword ptr [ebp-08]<----可看到输入的注册码,下BPM EAX
:0044136C 50 push eax
:0044136D 8D55F4 lea edx, dword ptr [ebp-0C]
:00441370 8B83E4010000 mov eax, dword ptr [ebx+000001E4]
:00441376 E85111FEFF call 004224CC
:0044137B 8B45F4 mov eax, dword ptr [ebp-0C]
:0044137E 50 push eax
:0044137F 8D55F0 lea edx, dword ptr [ebp-10]
:00441382 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:00441388 E83F11FEFF call 004224CC
:0044138D 8B55F0 mov edx, dword ptr [ebp-10]
:00441390 A150004900 mov eax, dword ptr [00490050]
:00441395 8B00 mov eax, dword ptr [eax]
:00441397 59 pop ecx
:00441398 E8CB9F0400 call 0048B368
:0044139D A150004900 mov eax, dword ptr [00490050]
:004413A2 8B00 mov eax, dword ptr [eax]
:004413A4 80780400 cmp byte ptr [eax+04], 00
:004413A8 7514 jne 004413BE

下BPM EAX,程序被中断在
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403DE1(C)
|
:00403DC5 8B0E mov ecx, dword ptr [esi]<----D ESI可看到注册码
:00403DC7 8B1F mov ebx, dword ptr [edi]<----D EDI可看到输入的注册码
:00403DC9 39D9 cmp ecx, ebx
:00403DCB 7558 jne 00403E25
:00403DCD 4A dec edx
:00403DCE 7415 je 00403DE5
:00403DD0 8B4E04 mov ecx, dword ptr [esi+04]
:00403DD3 8B5F04 mov ebx, dword ptr [edi+04]
:00403DD6 39D9 cmp ecx, ebx
:00403DD8 754B jne 00403E25
:00403DDA 83C608 add esi, 00000008
:00403DDD 83C708 add edi, 00000008
:00403DE0 4A dec edx
:00403DE1 75E2 jne 00403DC5
:00403DE3 EB06 jmp 00403DEB

方法2将上面的两个JNE 00403E25改为NOP
注意:注册码是12位

未能找出注册码的生成过程,如哪位找出了算法,请帖出来

标 题:注册码的比较核心 (1千字)
发信人:小楼
时 间:2000-7-10 23:16:08
详细信息:

dll explorer 2.22

看了发言,就马上来试试我的运气, 幸亏还好. 找到注册码了.

在
:00441398 E8CB9F0400 call 0048B368
:0044139D A150004900 mov eax, dword ptr [00490050]
:004413A2 8B00 mov eax, dword ptr [eax]
:004413A4 80780400 cmp byte ptr [eax+04], 00
~~~~~~~~~~~~~~~~~
:004413A8 7514 jne 004413BE <-- jne改为je后注册成功.

* Possible StringData Ref from Code Obj ->"Could not register the product."
|
:004413AA B8DC144400 mov eax, 004414DC
:004413AF E8F4ACFFFF call 0043C0A8

所以要看
byte ptr [eax+04](即cs:00E22268)的值是如何改变的, 跟踪一下可以发现,在
:00441398 E8CB9F0400 call 0048B368以前,cs:00E50028为1, 走过这个call后值为0,注册失败. 于是进入:00441398 E8CB9F0400 call 0048B368.

下面就是运气了,进入后在
cs:0048B3EF 处 d eax, 就可以见到真正的注册码.
其比较核心在
cs:0044113D ---- cs:441153 之间.有兴趣的可以自己算算.

原本不准备公布注册码的, 但考虑到加入china crack group后没有做过贡献, 所以在此为它作个宣传.
User Name: china crack group
Company Name: [CCG]
Registration Key: 220920548047


Drag And View v4.50

标 题:Tutor13 How to crack Drag And View v4.50
发信人:dREAMtHEATER
时 间:16/17th, Oct 1999
详细信息:

作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期: 16/17th, Oct 1999

软件背景资料

运行平台: Win9X/NT
文件名称: dv95.exe
程序类型: 文件格式浏览器
下载地点: http://www.canyonsw.com
文件大小: 1,970KB

使用的工具

SoftIce V4.0--Win9X Debugger
W32Dasm V8.93--Win9X Dissembler
RegSnap V2.51--Registry Analyzing Tool
Registry Studio V1.01--Enhanced Registry Editor

保护类型
Serials(*) Nag Screens(*) Keyfiles( ) Crippled( ) Packed( ) CD-Checks( )

难易程度
Easy(X) Medium( ) Hard( ) Pro( )

----------=======声明========----------

未经作者同意，不得修改、引用原文，一切权利保留。
本教程只供教学用，其他一切用途皆被禁止。

----------=======软件介绍========----------

超强的浏览,编辑程序,支持拖放功能，支持各种文本、图形，甚至数据库的浏览。可取代
ACDsee,UltraEdit等。
它所支持的文件类型如下：
- Word, Works, WordPerfect, Ami Pro,
Q&AWrite, 纯文本、二进制文件等类型文档。
- Excel, Lotus, Quattro等电子表格
- FoxPro, Clipper, dBase数据库
- 播放动态GIF文件
- 播放MIDI, WAV和RMI声音文件
- 播放AVI动画
- 大量最新的Internet文件格式
- 使用Active X控制显示Web页面
- 大量的图形文件

注册后能够支持下列格式：
PowerPoint PPT
Autocad DXF
Micrografx Designer DRW
Computer Graphics Metafiles CGM
Encapsulated Postscript Files EPS
HPGL
Lotus PIC
WordPerfect Graphics WPG

----摘自该软件的汉化说明（作者：张楚权）

----------=======软件的保护系统========-------

该软件可以免费试用三十天，六十天后必须注册,时间写在
HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{34ee9750-9350-11d1-8fee-004095e2400c}默认键
值中，注册后在注册表： HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{34ee9750-9350-11d1-
8fee-004095e2400c}\InprocServer32 这个子键下写入默认键值：“ole32.DLL”，如果是重新获得
30天试用期，将在:
HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{34ee9750-9350-11d1-8fee-004095e2400c}下写入
一个DWORD值 “Extension=0x00000001(1)”。可见，该程序并不是将真正的注册码写入注册表，而
是以“ole32.DLL”和“Extension=0x00000001(1)”为标志。

----------========正文========----------

如何计算注册码

运行程序，还好！没有讨厌的nag出现，直接到菜单中寻找注册项，没有！难道是过期后才提
示注册？对！将系统时间往后调，关闭窗口，准备重新运行。就在我按下窗口的关闭按纽后，哇！
Nag出现了，原来它躲在这里！点击上面的"Enter Code" button,进入注册窗口，输入1234567890。
在SoftIce中设断点"bpx hmemcpy" ,Ctrl-D,回到注册窗口，press "OK" button,BOOM!你又立
即回到SoftIce中,"bc *",取消所有断点，Press F12数次，直到下面的代码出现：

:00402B15 6A0F push 0000000F
:00402B17 50 push eax

* Possible Reference to Dialog: DialogID_0083, CONTROL_ID:01F9, ""
|
:00402B18 68F9010000 push 000001F9
:00402B1D 56 push esi

* Reference To: USER32.GetDlgItemTextA, Ord:00F5h <==程序调用"GetDlgItemTextA"来获取
你输入的code，在SI中你也可以设置
这个断点，但请记住，在你不知道程
序调用什么函数之前，"hmemcpy"应
是你的首选，它的命中率为99.9% ，
这会节省你的时间，但需要你有较
多的经验。
|
:00402B1E FF1570BD4400 Call dword ptr [0044BD70]
:00402B24 FF35EC5A4400 push dword ptr [00445AEC]
:00402B2A 8D45EC lea eax, dword ptr [ebp-14] <==eax指向输入的code
:00402B2D 50 push eax
:00402B2E 56 push esi
:00402B2F E83C000000 call 00402B70 <==code check
:00402B34 83C40C add esp, 0000000C
:00402B37 85C0 test eax, eax
:00402B39 7417 je 00402B52 <==good/bad boy
:00402B3B 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"Thank You"
|
:00402B3D 6808134400 push 00441308

* Possible StringData Ref from Data Obj ->"Program is registered"
|
:00402B42 68F0124400 push 004412F0
:00402B47 56 push esi

* Reference To: USER32.MessageBoxA, Ord:0195h
|
:00402B48 FF1574BD4400 Call dword ptr [0044BD74]

为了了解程序如何进行注册码计算的，我们需要trace into "call 00402B70",因此在
:00402B70处设断点，重新回到注册窗口，填入fake code,这回你进入了下面的这段代码：

* Referenced by a CALL at Address:
|:00402B2F
|
:00402B70 55 push ebp
:00402B71 8BEC mov ebp, esp
:00402B73 56 push esi
:00402B74 57 push edi
:00402B75 8B7D0C mov edi, dword ptr [ebp+0C]
:00402B78 57 push edi <==eax point to code you type into

* Reference To: KERNEL32.lstrlenA, Ord:02A1h
|
:00402B79 FF1508BA4400 Call dword ptr [0044BA08] <==获取你输入code的字符串
长度
:00402B7F 83F80E cmp eax, 0000000E
:00402B82 7550 jne 00402BD4 <==not equal to 14 ,bad boy
:00402B84 57 push edi
:00402B85 33F6 xor esi, esi

* Reference To: USER32.CharUpperA, Ord:002Bh
|
:00402B87 FF1564BD4400 Call dword ptr [0044BD64] <==将输入的code中的小写字
母变成大写。
:00402B8D 33C9 xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402BAF(C)
|
:00402B8F 8A0439 mov al, byte ptr [ecx+edi]---------+
:00402B92 3C41 cmp al, 41 |
:00402B94 0FBEC0 movsx eax, al |
:00402B97 7C06 jl 00402B9F |
:00402B99 8D7406BF lea esi, dword ptr [esi+eax-41] |
:00402B9D EB04 jmp 00402BA3 |
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:00402B97(C) |
| |
:00402B9F 8D7406D0 lea esi, dword ptr [esi+eax-30] |
|---real serial
* Referenced by a (U)nconditional or (C)onditional Jump at Address: | check
|:00402B9D(U) |
| |
:00402BA3 83FE09 cmp esi, 00000009 |
:00402BA6 7E03 jle 00402BAB |
:00402BA8 83EE09 sub esi, 00000009 |
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |
|:00402BA6(C) |
| |
:00402BAB 41 inc ecx |
:00402BAC 83F90E cmp ecx, 0000000E |
:00402BAF 7CDE jl 00402B8F -----------------------+
:00402BB1 83FE04 cmp esi, 00000004
:00402BB4 750F jne 00402BC5 〈== if eax=4, you'll recover more 30
days to evaluate it
:00402BB6 FF7510 push [ebp+10]
:00402BB9 FF7508 push [ebp+08]
:00402BBC E8A3000000 call 00402C64 <==写注册表
:00402BC1 59 pop ecx
:00402BC2 59 pop ecx
:00402BC3 EB3D jmp 00402C02

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402BB4(C)
|
:00402BC5 8B4510 mov eax, dword ptr [ebp+10] <==eax=5
:00402BC8 3BF0 cmp esi, eax
:00402BCA 7508 jne 00402BD4 <==good/bad boy
:00402BCC 48 dec eax
:00402BCD 7425 je 00402BF4
:00402BCF 83E804 sub eax, 00000004
:00402BD2 7419 je 00402BED

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402B82(C), :00402BCA(C)
|
:00402BD4 6A10 push 00000010

* Possible StringData Ref from Data Obj ->"Invalid Code"
|
:00402BD6 6888134400 push 00441388

* Possible StringData Ref from Data Obj ->"Sorry, Invalid Code!"
|
:00402BDB 6870134400 push 00441370
:00402BE0 FF7508 push [ebp+08]

* Reference To: USER32.MessageBoxA, Ord:0195h
|
:00402BE3 FF1574BD4400 Call dword ptr [0044BD74]
:00402BE9 33C0 xor eax, eax
:00402BEB EB15 jmp 00402C02

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

* Possible StringData Ref from Data Obj ->"{34ee9750-9350-11d1-8fee-004095e2400c}"
|
:00402BED 6890114400 push 00441190
:00402BF2 EB05 jmp 00402BF9

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

* Possible StringData Ref from Data Obj ->"{6ea280e0-9350-11d1-8fee-004095e2400c}"
|
:00402BF4 68E0114400 push 004411E0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402BF2(U)
|
:00402BF9 E808000000 call 00402C06 <==写注册表
:00402BFE 59 pop ecx
:00402BFF 6A01 push 00000001
:00402C01 58 pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402BC3(U), :00402BEB(U)
|
:00402C02 5F pop edi
:00402C03 5E pop esi
:00402C04 5D pop ebp
:00402C05 C3 ret

从:00402B8F到:00402BAC计算注册码，你能看懂吗？其中，edi指向code字符串的首地址，
我们可以将我们输入的code看作一个字符串数组(假设为reg(I))，按顺序取字符串的每一位，共进
行十四次循环，每次将该位字符的ACSII码值与0x41（字符“A”）相比，若小于则将码值减去0x30(
字符“0”)，所得值加上esi(初始值为零）再赋给esi;若大于等于，则减去0x41,其他步骤同前。每
次循环的最后将esi与9比较，大于9则令esi=esi-9。
循环计算结束，所得esi值若等于4，你将重新获得30天试用期，等于5，你就是注册用户了
，等于其他数，程序就认为你输入了无效的注册码。
为了便于理解，我将上面计算注册码的部分翻译成BASIC语言（注：48,65代表"0","A"十进
制ASCII值）：

esi=0
for i=1 to 14
a=asc(reg(i))-65
if a<0 then
esi=esi+asc(reg(i))-48
else
esi=esi+asc(reg(i))-65
end if
if esi>9 then
esi=esi-9
end if
next i
if esi=5 then goto goodbay
else
if esi=4 then goto more30days
end if
end if
goto badboy

经过上面的讲述你能独立算出正确的注册码吗？可以看出，有无数个14位字符组成的字符串
符合上述条件。最简单、直接的推算，可以写出50000000000000,5jjjjjjjjjjjjj,11111111111111
.......你能类推吗？

If you have any questions,please free drop me at dreamtheater@263.net

dREAMtHEATER


DremEdit2.28

 标 题:请教关于DremEdit2.28如何算注册码？ (3千字)
发信人:1212
时 间:2000-7-13 18:12:22
详细信息:
关于DremEdit2.28如何算注册码？

http://shengqh.yeah.net
请高手帮我注上含义，谢谢！

015F:00516604 MOV EAX,[EBP-04]
015F:00516607 CALL 004A1690
015F:0051660C TEST AL,AL
015F:0051660E JZ NEAR 005166DE --->jump
在TRW2000环境中，输入何指令能让JZ不jump
因为我想运行下面的指令
---------------------------------------
015F:00516614 LEA EDX,[EBP-08]
015F:00516617 MOV EAX,[EBX+0300]
015F:0051661D CALL 00437D14
015F:00516622 MOV EAX,[EBP-08]
015F:00516625 PUSH EAX
015F:00516626 LEA EDX,[EBP-0C]
015F:00516629 MOV EAX,[EBX+02F4]
015F:0051662F CALL 00437D14
015F:00516634 MOV EAX,[EBP-0C]
015F:00516637 POP EDX
015F:00516638 CALL 004043AC
015F:0051663D TEST EAX,EAX
015F:0051663F JNG NEAR 005166DE
015F:00516645 LEA EAX,[EBP-10]
015F:00516648 CALL 004A1610
015F:0051664D MOV ECX,[EBP-10]
015F:00516650 MOV DL,01
015F:00516652 MOV EAX,[00460860]
015F:00516657 CALL 00460908
015F:0051665C MOV ESI,EAX
015F:0051665E LEA EDX,[EBP-14]
015F:00516661 MOV EAX,[EBX+0300]
015F:00516667 CALL 00437D14
015F:0051666C MOV EAX,[EBP-14]
015F:0051666F PUSH EAX
015F:00516670 MOV ECX,00516740
015F:00516675 MOV EDX,00516750
015F:0051667A MOV EAX,ESI
015F:0051667C MOV EDI,[EAX]
015F:0051667E CALL NEAR [EDI+04]
015F:00516681 LEA EDX,[EBP-18]
015F:00516684 MOV EAX,[EBX+02F4]
015F:0051668A CALL 00437D14
015F:0051668F MOV EAX,[EBP-18]
015F:00516692 PUSH EAX
015F:00516693 MOV ECX,00516760
015F:00516698 MOV EDX,00516750
015F:0051669D MOV EAX,ESI
015F:0051669F MOV EDI,[EAX]
015F:005166A1 CALL NEAR [EDI+04]
015F:005166A4 MOV EAX,ESI
015F:005166A6 CALL 004030D8
015F:005166AB PUSH BYTE +40
015F:005166AD PUSH DWORD 00516768
015F:005166B2 PUSH DWORD 00516774
015F:005166B7 MOV EAX,EBX
015F:005166B9 CALL 0043DF38
015F:005166BE PUSH EAX
015F:005166BF CALL `USER32!MessageBoxA`
015F:005166C4 MOV EAX,[0055F9F4]
015F:005166C9 MOV EAX,[EAX]
015F:005166CB MOV EDX,005167A0
015F:005166D0 CALL 00437D44
015F:005166D5 MOV EAX,EBX
015F:005166D7 CALL 00454188
015F:005166DC JMP SHORT 005166F7
----------------------------------------
015F:005166DE PUSH BYTE +10
015F:005166E0 PUSH DWORD 005167BC
015F:005166E5 PUSH DWORD 005167C4
015F:005166EA MOV EAX,EBX
015F:005166EC CALL 0043DF38
015F:005166F1 PUSH EAX
015F:005166F2 CALL `USER32!MessageBoxA`
------------------------------------>跳出错误对话框
015F:005166F7 XOR EAX,EAX
015F:005166F9 POP EDX
015F:005166FA POP ECX
015F:005166FB POP ECX
015F:005166FC MOV [FS:EAX],EDX
015F:005166FF PUSH DWORD 0051672E
015F:00516704 LEA EAX,[EBP-18]
015F:00516707 MOV EDX,02
015F:0051670C CALL 00403E64
015F:00516711 LEA EAX,[EBP-10]
015F:00516714 CALL 00403E40
015F:00516719 LEA EAX,[EBP-0C]
015F:0051671C MOV EDX,03
015F:00516721 CALL 00403E64
015F:00516726 RET

标 题:Too easy! (492字)
发信人:guest
时 间:2000-7-13 19:06:09
详细信息:

下面是两个判断，正好3个条件限制：

1、注册码的各字符的ASCII码之和必须为13的整数倍。且注册码最少5个字符

015F:00516604 MOV EAX,[EBP-04]
015F:00516607 CALL 004A1690 ;检查累加和
015F:0051660C TEST AL,AL
015F:0051660E JZ NEAR 005166DE

2、名字必须是注册码的子串，即注册码包含名字。

015F:00516634 MOV EAX,[EBP-0C]
015F:00516637 POP EDX
015F:00516638 CALL 004043AC
015F:0051663D TEST EAX,EAX
015F:0051663F JNG NEAR 005166DE


drip

 标 题:小楼兄和其他朋友： (285字)
发信人:mago
时 间:2000-8-2 15:28:31
详细信息:
整理磁盘时误将drip的破解文件给删除了，麻烦你手中有的话给我再发一次。
汉化已好：http://go.163.com/~sons/soft/DRIP.EXE

另外还有一个程序：
可以在美国特许厅USUTO上下载文件，
http://go.163.com/~sons/soft/djusp170.lzh 315k
未注册只能下载5个文件。麻烦哪位帮我破解一下。
在此先谢谢。

标 题:还好,DRIP留有笔记,请看 (1千字)
发信人:小楼
时 间:2000-8-2 16:14:16
详细信息:

drip

注册码错误得到"蔬杰澳迋獖詧醾羵膫軅?",用W32DASM修改版反汇编
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004037B3(C) <--***
|
:0040385E 8B761C mov esi, dword ptr [esi+1C]
:00403861 85F6 test esi, esi
:00403863 7403 je 00403868
:00403865 8B761C mov esi, dword ptr [esi+1C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403863(C)
|
:00403868 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"搊榐幐攕"
|
:0040386A 6850A44600 push 0046A450

* Possible StringData Ref from Data Obj ->"蔬杰澳迋獖詧醾羵膫軅?"
|
:0040386F 6834A44600 push 0046A434

再看
:004037A9 E8F8140200 call 00424CA6 <--重点
:004037AE 83C408 add esp, 00000008
:004037B1 85C0 test eax, eax
:004037B3 0F85A5000000 jne 0040385E

所以用F8进入:004037A9 E8F8140200 call 00424CA6
走到
:00424CE6 8945F8 mov dword ptr [ebp-08], eax
下指令d eax, 就看到注册码
我的是
xiaolou
aaa
01E5

标 题:mago兄,DJUSP的破解zxem说的对, 具体注册码是15946211,详细见内 (1千字)
发信人:小楼
时 间:2000-8-5 12:54:01
详细信息:

DJUSP注册

用WDASM反汇编
:004698E5 E8FAFEFFFF call 004697E4
:004698EA 8BD8 mov ebx, eax
:004698EC 8D45F8 lea eax, dword ptr [ebp-08]
:004698EF E834A3F9FF call 00403C28

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004698E1(U)
|
:004698F4 84DB test bl, bl <--bl=1注册成功
:004698F6 752C jne 00469924
:004698F8 6A20 push 00000020
:004698FA E869D9F9FF Call 00407268
:004698FF 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"Registration"
|
:00469901 68A0994600 push 004699A0

* Possible StringData Ref from Code Obj ->"Password incorrect. "
|
:00469906 68B0994600 push 004699B0
:0046990B 8BC7 mov eax, edi
:0046990D E8D2C2FCFF call 00435BE4

注意到:004698F4 84DB test bl, bl
处BL由:004698EA 8BD8 mov ebx, eax赋值,所以用F8进入
:004698E5 E8FAFEFFFF call 004697E4

......
:00469847 8BC3 mov eax, ebx <--eax为输入数值的16进制
:00469849 3513487D00 xor eax, 007D4813 <--异或
:0046984E 3DF0198E00 cmp eax, 008E19F0 <--比较
:00469853 7504 jne 00469859

所以我得到PASSWORD: 1767996592

此外,我用WDASM修改版不能正确反汇编, 看来还是要用原版.


EditPlus v2.01

 标 题:菜鸟破解实录（五）之 EditPlus v2.01 (7千字)
发信人:xiA Qin
时 间:2000-8-1 16:49:16
详细信息:
菜鸟破解实录（五）之 EditPlus v2.01

软件名称：EditPlus -->(30天试用)
版 本：v2.01
简 介： 一套功能强大，可取代记事本的文字编辑器，拥有无限制的Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能，就是它有监视剪贴簿的功能，能够同步于剪贴簿自动将文字贴进EditPlus的编辑窗口中，让你省去做贴上的步骤。另外它也是一个好用的HTML编辑器，除了可以颜色标记HTMLTag(同时支持C/C++、Perl、Java)外，还内建完整的HTML和CSS1指令功能，对于习惯用记事本编辑网页的朋友，它可帮你节省一半以上的网页制作时间，若你有安装IE3.0以上版本，它还会结合IE浏览器于EditPlus窗口中，让你可以直接预览编辑好的网页(若没安装IE，也可指定浏览器路径)。

作 者：xiA Qin
级 别：刚学不久
解密日前：2000年7月30日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行EditPlus
输入注册信息
name: xiA Qin &任意输入
register key: 9876543210 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............

015F:00462070 LEA ECX,[EDI+5C]
015F:00462073 PUSH EDX
015F:00462074 CALL 0049FE4D
015F:00462079 MOV AL,[ESI]
015F:0046207B CMP AL,20
015F:0046207D JZ 00462083
015F:0046207F CMP AL,09
015F:00462081 JNZ 00462086
015F:00462083 INC ESI
015F:00462084 JMP 00462079
015F:00462086 PUSH ESI
015F:00462087 CALL [004CD278]
015F:0046208D TEST EAX,EAX
015F:0046208F JLE 004620A4
015F:00462091 MOV CL,[EAX+ESI-01]
015F:00462095 CMP CL,20
015F:00462098 JZ 0046209F
015F:0046209A CMP CL,09
015F:0046209D JNZ 004620A4
015F:0046209F DEC EAX
015F:004620A0 TEST EAX,EAX
015F:004620A2 JG 00462091
015F:004620A4 TEST EAX,EAX
015F:004620A6 MOV BYTE PTR [ESI+EAX],00
015F:004620AA JZ 0046219E
015F:004620B0 MOV EAX,[ESP+08]
015F:004620B4 MOV ECX,[EAX-08]
015F:004620B7 TEST ECX,ECX
015F:004620B9 JZ 0046219E
015F:004620BF LEA ECX,[ESP+08]
015F:004620C3 CALL 004A3D99
015F:004620C8 MOV ECX,[ESP+08]
015F:004620CC PUSH ECX
015F:004620CD PUSH ESI
015F:004620CE CALL 00462280 //有问题，按F8进入子程序。
015F:004620D3 ADD ESP,08
015F:004620D6 TEST EAX,EAX
015F:004620D8 JNZ 004620ED //这里可以跳过失败对话框。
................................

015F:00462280 83EC0C SUB ESP,0C
015F:00462283 53 PUSH EBX
015F:00462284 8B1D78D24C00 MOV EBX,[004CD278]
015F:0046228A 56 PUSH ESI
015F:0046228B 57 PUSH EDI
015F:0046228C 8B7C241C MOV EDI,[ESP+1C]
015F:00462290 57 PUSH EDI
015F:00462291 FFD3 CALL EBX
015F:00462293 8BF0 MOV ESI,EAX
015F:00462295 85F6 TEST ESI,ESI
015F:00462297 7507 JNZ 004622A0 //修改这里，变成任意注册版
015F:00462299 5F POP EDI
015F:0046229A 5E POP ESI
015F:0046229B 5B POP EBX
015F:0046229C 83C40C ADD ESP,0C
015F:0046229F C3 RET
015F:004622A0 E83BFFFFFF CALL 004621E0
015F:004622A5 56 PUSH ESI
015F:004622A6 57 PUSH EDI
015F:004622A7 6A00 PUSH 00
015F:004622A9 E882FFFFFF CALL 00462230
015F:004622AE 25FFFF0000 AND EAX,0000FFFF
015F:004622B3 50 PUSH EAX
015F:004622B4 8D44241C LEA EAX,[ESP+1C]
015F:004622B8 6814624F00 PUSH 004F6214
015F:004622BD 50 PUSH EAX
015F:004622BE E8CDD60200 CALL 0048F990
015F:004622C3 8B742438 MOV ESI,[ESP+38]
015F:004622C7 8A442424 MOV AL,[ESP+24]
015F:004622CB 83C418 ADD ESP,18
015F:004622CE 8A4E02 MOV CL,[ESI+02]
015F:004622D1 8D7E02 LEA EDI,[ESI+02]
015F:004622D4 3AC8 CMP CL,AL
015F:004622D6 7409 JZ 004622E1
015F:004622D8 5F POP EDI
015F:004622D9 5E POP ESI
015F:004622DA 33C0 XOR EAX,EAX
015F:004622DC 5B POP EBX
015F:004622DD 83C40C ADD ESP,0C
015F:004622E0 C3 RET
015F:004622E1 8A5603 MOV DL,[ESI+03]
015F:004622E4 8A44240D MOV AL,[ESP+0D]
015F:004622E8 3AD0 CMP DL,AL
015F:004622EA 7409 JZ 004622F5
015F:004622EC 5F POP EDI
015F:004622ED 5E POP ESI
015F:004622EE 33C0 XOR EAX,EAX
015F:004622F0 5B POP EBX
015F:004622F1 83C40C ADD ESP,0C
015F:004622F4 C3 RET
015F:004622F5 56 PUSH ESI
015F:004622F6 FFD3 CALL EBX
015F:004622F8 83E802 SUB EAX,02
015F:004622FB 50 PUSH EAX
015F:004622FC 57 PUSH EDI
015F:004622FD 6A00 PUSH 00
015F:004622FF E82CFFFFFF CALL 00462230
015F:00462304 25FFFF0000 AND EAX,0000FFFF
015F:00462309 50 PUSH EAX
015F:0046230A 8D44241C LEA EAX,[ESP+1C]
015F:0046230E 6814624F00 PUSH 004F6214
015F:00462313 50 PUSH EAX
015F:00462314 E877D60200 CALL 0048F990
015F:00462319 8A0E MOV CL,[ESI]
015F:0046231B 8A442424 MOV AL,[ESP+24]
015F:0046231F 83C418 ADD ESP,18
015F:00462322 3AC8 CMP CL,AL
015F:00462324 7409 JZ 0046232F
015F:00462326 5F POP EDI
015F:00462327 5E POP ESI
015F:00462328 33C0 XOR EAX,EAX
015F:0046232A 5B POP EBX
015F:0046232B 83C40C ADD ESP,0C
015F:0046232E C3 RET

............................
015F:004620DA PUSH FF
015F:004620DC PUSH 10
015F:004620DE PUSH 00005F81
015F:004620E3 CALL 004AB493 //注册失败对话框
015F:004620E8 JMP 004621A6
015F:004620ED MOV EAX,[EDI+000000D4]
015F:004620F3 TEST EAX,EAX
015F:004620F5 JNZ 0046214C
015F:004620F7 MOV EDX,[004F7750]
015F:004620FD MOV [ESP+0C],EDX
015F:00462101 MOV EAX,[ESP+08]
015F:00462105 LEA ECX,[ESP+0C]
015F:00462109 PUSH EAX
015F:0046210A PUSH ESI
015F:0046210B PUSH 000053D7
015F:00462110 PUSH ECX
015F:00462111 MOV BYTE PTR [ESP+0000021C],01
015F:00462119 CALL 0049CB8A
015F:0046211E MOV EDX,[ESP+1C]
015F:00462122 ADD ESP,10
015F:00462125 PUSH 00
015F:00462127 PUSH 24

从上面可以看出.

将00462297 7507 JNZ 004622A0
改00462297 7407 JZ 004622A0
就可以注册。

整里一下，用Ultraedt打开EditPlus

找到75 07 5f 5e 5b 83 c4 0c

改成74 07 5f 5e 5b 83 c4 0c

保存修改文件，重新运行

输入注册信息 ，现在是想输入什么都可以。
name: China &任意输入

register key: 1949101 &任意输入

保存修改程序，重新运行试一试。

标 题:这个软件的作者到处设暗桩。 (554字)
发信人:dr0
时 间:2000-8-2 11:07:55
详细信息:

好象从1.21版本就开始了。它判断注册码不是集中在一个地方判断，程序刚启动的时候判断几位，退出的时候再判断另外几位，你使用它的preferences菜单的时候再判断一位。
以上是旧版本的情况。2.01a版本与此有所不同。由于不知道它会在哪里判断注册码，所以不能清除BPR断点，即要一直保留针对输入的假注册码所设的BPR断点；或者用bpx RegDeleteValueA设断点，试用一下其各种功能，看它是否会删除注册表中的假注册码，就可以找到判断注册码的地方。另外，这个软件的注册码的前5位是由后面的计算出来的，而后面有多少位并无明显的限制，所以各人作出来的注册码长短不一。另，据说注册码似乎有随机性。

1.22版本在用户使用preferences菜单时会判一位注册码，此时注册码会失效 (空)(dr0


Emblaze.Audio 1.01

标 题:Tutor12 How to crack Emblaze.Audio 1.01
发信人:dREAMtHEATER
时 间:17th, Sep 1999
详细信息:

作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期: 17th, Sep 1999

软件背景资料

运行平台: Win9X
文件名称: embaudio.exe
程序类型: Multimedia Tools
下载地点: http://www.emblaze.com
文件大小: 1,151KB

使用的工具

W32Dasm V8.93--Win9X Dissembler
Hex WorkShop V2.54--Hex Editor
RegSnap V2.51--Registry Analyzing Tool
Registry Studio V1.01--Enhanced Registry Editor

难易程度

Easy(x) Medium( ) Hard( ) Pro( )

----------=======声明========----------

未经作者同意，不得修改、引用原文，一切权利保留。
本教程只供教学用，其他一切用途皆被禁止。

----------=======软件介绍========----------

Emblaze Audio is an application used for compressing *.wav audio files suitable
for use on the Internet.

----------=======软件的保护机制========-------

与时间相关的键值记录在：
HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\ultxfile\Format\MSHV04A6\open
HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\ultxfile\Format\MSHV04A6\write
HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\ultxfile\Format\MSHV04A6\xlate
其他内容看正文！

----------========正文========----------

Hi! 大家好！我们又见面了 :-)
我已有好长一段时间没有写tutor了（距tutor 11的推出已有28天了），想必让各位等苦了（
千万不要对我失去了信心啊！）。上个月简直没差点把我累死，咳咳.....,为了练好CRACKing内功
，我没白天黑日地做练习，每天搞得我都是脑发胀、眼发直、手发酸，还好，功夫不负有心人，一
个月下来我也许创下了破解记录---crack掉将近100个共享软件(所有软件均随机性的从网上D下的，
这可花了我一百大元），可以说我遇到了几乎所有的保护系统，并积累了大量的cracking经验。说
实话，学习cracking没有什么捷径可走，你唯一可以做的就是努力再努力！
好！话回正题，我今天向大家介绍一种程序保护类型。如果文中提到的例子的破解你能完全
理解，那么再遇到此类程序，你应该能百分之百地破解。
本讲中用的shareware例子叫“Emblaze.Audio”,该共享软件是用Release Software
Corporation(简称RS)出品的time limited类型的保护程序封装的。安装后在该软件的安装目录下有
三个与此相关的文件，分别是Rsagent.hlp，rsdll.dll，rsagnt32.dll，我也曾经遇到过其他几个
用RS封装的软件，均是在软件的安装目录下存在这三个文件，其中包括著名的杀毒软件--Norton
AntiVirus 4.0,因此我觉得有必要将这一类共享程序的破解方法公布于众。不过告诉你，这个RS封
装程序真的很差劲，可以说极容易破解，因此我今天不着重讲解破解过程，只对他的注册过程做一
详细介绍。刚开始时，我也被他的注册过程给唬住了，以为该程序必须网上注册，其实不然！
首先，运行文件AUDIO.exe，程序马上跳出一个nagscreen,告诉你还剩多少天可以试用，窗口
上还有三个BUTTON,分别是Buy Now,Try It,Cancel,此界面做得很象用VBox封装的程序。请用鼠标点
取"Buy Now" button,进入Registration Wizard,你必须逐项的填写registration form，当然你可
以随便填了，填好后点击next,这一步要求你填credit card number，expired date, card name,
这回估计你犯难了，你上哪儿找credit card number, 没关系，我在网上找了一个VISA的number,当
然这也不能用，只是骗骗他 :-),请填入credit card number：4760313551454，expired date：
10/99, card name:dREAMtHEATER（你可以随便填）,点击next-->order by fax/mail-->完成！该操
作完毕后，会在你的windows目录下生成一个叫“rsagent.ini”的文件，里面包括你刚才你输入的
个人信息，同时生成一个personalCode项。
退出程序，重新运行，再次点击“Buy Now”，这会程序读取rsagent.ini中的信息，并提取
其中的firstName=dREAMtHEATER，lastName=Home'99，personalCode=0018471466（这是我的信息）
列于order by fax/mail的注册窗口上，并且有一个空的EditBox等待你输入UnlockingCode，那么
OK,我随便输入1234567890。
在SoftIce中设断点bpx hmemcpy ,Ctrl-D,回到注册窗口，press "OK" button,重新回到
SoftIce中,记住你不要再按Ctrl-D,"bc *",取消所有断点，Press F12数次，程序停在：

:100055FA 6816040000 push 00000416
:100055FF 55 push ebp
:10005600 FFD3 call ebx
:10005602 BFE00D0310 mov edi, 10030DE0 <==回到这里
:10005607 83C9FF or ecx, FFFFFFFF
:1000560A 33C0 xor eax, eax
:1000560C F2 repnz
:1000560D AE scasb
:1000560E F7D1 not ecx
:10005610 49 dec ecx
:10005611 83F90A cmp ecx, 0000000A <==检查输入的code是否是10位数
:10005614 743F je 10005655
:10005616 8D542410 lea edx, dword ptr [esp+10]

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
->"not valid for this program."
|
:1000561A 6890180210 push 10021890
:1000561F 52 push edx
:10005620 E88BF20000 call 100148B0
:10005625 83C408 add esp, 00000008
:10005628 8D442410 lea eax, dword ptr [esp+10]
:1000562C 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"Invalid Unlocking Code"
|
:1000562E 6878180210 push 10021878
:10005633 50 push eax
:10005634 55 push ebp

* Reference To: USER32.MessageBoxA, Ord:0195h
|
:10005635 FF15A8950310 Call dword ptr [100395A8]
:1000563B 8B0D74170310 mov ecx, dword ptr [10031774]
:10005641 83C8FF or eax, FFFFFFFF
:10005644 66C741040000 mov [ecx+04], 0000
:1000564A 5F pop edi
:1000564B 5E pop esi
:1000564C 5D pop ebp
:1000564D 5B pop ebx
:1000564E 81C470020000 add esp, 00000270
:10005654 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10005614(C)
|
:10005655 BF10B00210 mov edi, 1002B010
:1000565A 83C9FF or ecx, FFFFFFFF
:1000565D 33C0 xor eax, eax
:1000565F 8D94240C010000 lea edx, dword ptr [esp+0000010C]
:10005666 F2 repnz
:10005667 AE scasb
:10005668 F7D1 not ecx
:1000566A 2BF9 sub edi, ecx
:1000566C 8BC1 mov eax, ecx
:1000566E 8BF7 mov esi, edi
:10005670 8BFA mov edi, edx
:10005672 8B1574170310 mov edx, dword ptr [10031774]
:10005678 C1E902 shr ecx, 02
:1000567B F3 repz
:1000567C A5 movsd
:1000567D 8BC8 mov ecx, eax
:1000567F 81C2B6000000 add edx, 000000B6
:10005685 83E103 and ecx, 00000003
:10005688 8D84240C010000 lea eax, dword ptr [esp+0000010C]
:1000568F F3 repz
:10005690 A4 movsb
:10005691 8D8C24D8000000 lea ecx, dword ptr [esp+000000D8]
:10005698 51 push ecx
:10005699 52 push edx
:1000569A 50 push eax
:1000569B E8B0620000 call 1000B950
:100056A0 83C40C add esp, 0000000C
:100056A3 8D8C24D8000000 lea ecx, dword ptr [esp+000000D8] <==ecx指向real
code
:100056AA 68E00D0310 push 10030DE0
:100056AF 51 push ecx
:100056B0 E8ABA20100 call 1001F960 <==real code与你输入code进行比较
:100056B5 83C408 add esp, 00000008
:100056B8 85C0 test eax, eax
:100056BA 0F85AC020000 jne 1000596C
:100056C0 8D942480010000 lea edx, dword ptr [esp+00000180]

你用F10执行到:100056AA这一行时，下命令"d ecx",即可看到数据窗口中显示的real code(我的是
UnlockingCode=JDALNFVWQI),是不是真的很简单？
在注册窗口重新填入你的code,press OK,出现类似Explorer中复制文件的窗口，告诉你请等
待，稍等片刻，程序注册成功，出现主窗口！
到此为止，你已百分之百地cracking了该程序！

---------========The Final========----------

所有用RS封装的程序破解过程是完全一样的，不同的只是UnlockingCode!


EmEditor v3.00 b3

 标 题:嗨！这是EmEditor v3.00 b3破解过程 (5千字)
发信人:木尼
时 间:2000-8-5 12:52:21
详细信息:
嗨！大家好，这是EmEditor v3.00 b3破解过程；

让我们从这里开始吧……
key1 是我们输入的第一串数字，我用1000
key2 是我们输入的第二串数字，我用2000
key3 是我们输入的第三串数字，我用3000
key4 是我们输入的第四串数字，我用4000

key1 key2 key3 key4
| | | |
1000 - 2000 - 3000 - 4000

下 BPX GETDLGITEMINT

017F:00416F71 CALL `USER32!GetDlgItemInt` <--在这里中断
017F:00416F77 MOV [EDI],AX
017F:00416F7A INC ESI
017F:00416F7B INC EDI
017F:00416F7C INC EDI
017F:00416F7D CMP ESI,BYTE +04
017F:00416F80 JL 00416F65 <--这里会向上跳4次（不管啦！抓紧时间）
017F:00416F82 LEA EAX,[EBP-0C]
017F:00416F85 PUSH EAX
017F:00416F86 CALL 00416E80 <--从这里进去算注册码（F8）
017F:00416F8B CMP EAX,EBX <--比较EAX=EBX
017F:00416F8D POP EDI
017F:00416F8E JZ 00416FBA <--如果上面EAX<>EBX，则要出破框
017F:00416F90 XOR ECX,ECX
017F:00416F92 CMP EAX,BYTE +02
017F:00416F95 SETNZ CL
017F:00416F98 DEC ECX
017F:00416F99 PUSH BYTE +30
017F:00416F9B AND ECX,BYTE +03
017F:00416F9E ADD ECX,0454
017F:00416FA4 PUSH ECX
017F:00416FA5 CALL 00411E5E <--出破框的CALL
017F:00416FAA PUSH BYTE +02
017F:00416FAC PUSH DWORD [EBP+08]
017F:00416FAF CALL `USER32!EndDialog`
017F:00416FB5 JMP 0041703F <--注册成功！

CALL 00416E80
从这里开始算注册码key1即第一个框输入的四个数字…

017F:00416E80 PUSH ESI
017F:00416E81 MOV ESI,[ESP+08]
017F:00416E85 PUSH EDI
017F:00416E86 PUSH BYTE +0A
017F:00416E88 MOVZX EAX,WORD [ESI]
017F:00416E8B CDQ
017F:00416E8C POP ECX
017F:00416E8D IDIV ECX
017F:00416E8F CMP EAX,AB <--得出注册码的第一串为1710 key1/A=AB
017F:00416E94 JZ 00416E9B <--这必需跳！
017F:00416E96 PUSH BYTE +01
017F:00416E98 POP EAX
017F:00416E99 JMP SHORT 00416EB0
017F:00416E9B MOV DI,[ESI+06]
017F:00416E9F PUSH ESI
017F:00416EA0 CALL 00416DD9 <--子CALL比较key2,key3,key4;进去
017F:00416EA5 TEST EAX,EAX
017F:00416EA7 JNZ 00416EB0
017F:00416EA9 CMP DI,[ESI+06] <--看看这里的ESI+06“这不就是……”
017F:00416EAD SETNZ AL
017F:00416EB0 POP EDI
017F:00416EB1 POP ESI
017F:00416EB2 RET 04

CALL 00416E80
开始算key2 key3 key4

017F:00416DD9 PUSH ESI
017F:00416DDA MOV ESI,[ESP+08]
017F:00416DDE MOV AX,[ESI+02]
017F:00416DE2 AND WORD [ESI+06],BYTE +00
017F:00416DE7 CMP AX,270F
017F:00416DEB JA NEAR 00416E79
017F:00416DF1 MOV CX,[ESI+04]
017F:00416DF5 CMP CX,270F
017F:00416DFA JA 00416E79
017F:00416DFC TEST AX,AX
017F:00416DFF JZ 00416E75
017F:00416E01 CMP AX,08AE <--如果AX=08ae，即key2=2222 就跳进死穴
017F:00416E05 JZ 00416E75
017F:00416E07 CMP AX,162E <--如果AX=162e，即key2=4567 就跳进死穴
017F:00416E0B JZ 00416E75 （如此说来key2，key3只要不是2222或4567;就可以啦！）
017F:00416E0D PUSH EBX （以下的key4就是用key1,key2,key3来算的）
017F:00416E0E PUSH EBP （详细看以下算法，就可以写出注册机啦！）
017F:00416E0F PUSH EDI
017F:00416E10 PUSH BYTE +0A
017F:00416E12 MOVZX EDI,CX
017F:00416E15 MOVZX ECX,WORD [ESI]
017F:00416E18 MOVZX EAX,AX
017F:00416E1B MOV [ESP+18],EAX
017F:00416E1F MOV EAX,ECX
017F:00416E21 CDQ
017F:00416E22 POP EBX
017F:00416E23 IDIV EBX
017F:00416E25 PUSH BYTE +64
017F:00416E27 POP EBP
017F:00416E28 PUSH EBP
017F:00416E29 MOV EBX,EAX
017F:00416E2B MOV EAX,EDI
017F:00416E2D CDQ
017F:00416E2E IDIV EBP
017F:00416E30 MOV EDX,[ESP+18]
017F:00416E34 ADD EDX,EBX
017F:00416E36 ADD EAX,EDX
017F:00416E38 ADD EAX,EDI
017F:00416E3A POP EDI
017F:00416E3B CDQ
017F:00416E3C IDIV EDI
017F:00416E3E MOV EAX,[ESP+14]
017F:00416E42 PUSH EBP
017F:00416E43 POP EBX
017F:00416E44 PUSH EBP
017F:00416E45 MOV EDI,[EDX*4+00436BA8]
017F:00416E4C CDQ
017F:00416E4D IMUL EDI,EDI,BYTE +64
017F:00416E50 IDIV EBX
017F:00416E52 MOV EBX,EAX
017F:00416E54 MOV EAX,ECX
017F:00416E56 CDQ
017F:00416E57 IDIV EBP
017F:00416E59 ADD ECX,EBX
017F:00416E5B ADD EAX,ECX
017F:00416E5D POP ECX
017F:00416E5E CDQ
017F:00416E5F IDIV ECX
017F:00416E61 MOV EAX,[EDX*4+00436BA8]
017F:00416E68 ADD EDI,EAX
017F:00416E6A XOR EAX,EAX
017F:00416E6C MOV [ESI+06],DI <--注意：DI就是你要的key4
017F:00416E70 POP EDI
017F:00416E71 POP EBP
017F:00416E72 POP EBX
017F:00416E73 JMP SHORT 00416E7C
017F:00416E75 PUSH BYTE +02
017F:00416E77 JMP SHORT 00416E7B
017F:00416E79 PUSH BYTE +01
017F:00416E7B POP EAX
017F:00416E7C POP ESI
017F:00416E7D RET 04

以上是用TRW2000 1.22跟的过程。
由于时间关系，就简单写一下，要写注册机的请自己去摸索吧！
这也是我第一次写的心得，有些地方不足。
或许有更好的方法，希望多提一点意见，大家以后互相多交流；谢谢！

木尼
2000/08/05
sxkok@163.net


EXEscope 5.0

 标 题:初学者(19) (4千字)
发信人:liutong
时 间:2000-7-7 22:52:17
详细信息:
EXEscope 5.0

设断点bpx hmemcpy
程序被中断后,按F12键12次,再按F10键,便可找到下面的程序

:0047CD77 8D55FC lea edx, dword ptr [ebp-04]
:0047CD7A 8B83DC010000 mov eax, dword ptr [ebx+000001DC]
:0047CD80 E82363FAFF call 004230A8
:0047CD85 8B55FC mov edx, dword ptr [ebp-04]
:0047CD88 A1E8704800 mov eax, dword ptr [004870E8]
:0047CD8D E8C26BF8FF call 00403954
:0047CD92 8D55FC lea edx, dword ptr [ebp-04]
:0047CD95 8B83E0010000 mov eax, dword ptr [ebx+000001E0]
:0047CD9B E80863FAFF call 004230A8
:0047CDA0 8B55FC mov edx, dword ptr [ebp-04]
:0047CDA3 A198704800 mov eax, dword ptr [00487098]
:0047CDA8 E8A76BF8FF call 00403954
:0047CDAD 8B1598704800 mov edx, dword ptr [00487098]
:0047CDB3 8B12 mov edx, dword ptr [edx]
:0047CDB5 A1906F4800 mov eax, dword ptr [00486F90]
:0047CDBA 8B00 mov eax, dword ptr [eax]
:0047CDBC E84B770000 call 0048450C
:0047CDC1 84C0 test al, al <----此处测试标志
:0047CDC3 0F848D000000 je 0047CE56

下面分析产生标志的过程:
* Referenced by a CALL at Addresses:
|:0047CDBC , :0048433C
|
:0048450C 55 push ebp
:0048450D 8BEC mov ebp, esp
:0048450F 51 push ecx
:00484510 53 push ebx
:00484511 8955FC mov dword ptr [ebp-04], edx
:00484514 8B45FC mov eax, dword ptr [ebp-04]
:00484517 E814F8F7FF call 00403D30
:0048451C 33C0 xor eax, eax
:0048451E 55 push ebp
:0048451F 6876454800 push 00484576
:00484524 64FF30 push dword ptr fs:[eax]
:00484527 648920 mov dword ptr fs:[eax], esp
:0048452A 33DB xor ebx, ebx
:0048452C 8B45FC mov eax, dword ptr [ebp-04]
:0048452F E848F6F7FF call 00403B7C
:00484534 83F80A cmp eax, 0000000A <----比较注册码是否为10位
:00484537 7527 jne 00484560 <----不是,继续试用期
:00484539 8B45FC mov eax, dword ptr [ebp-04]
:0048453C 803841 cmp byte ptr [eax], 41 <---比较第一位注册码是否为"A"
:0048453F 751F jne 00484560 <----不是,继续试用期
:00484541 8B45FC mov eax, dword ptr [ebp-04] <----读取第八个字符
:00484544 0FB64008 movzx eax, byte ptr [eax+08]
:00484548 8B55FC mov edx, dword ptr [ebp-04] <----读取第九个字符
:0048454B 0FB65209 movzx edx, byte ptr [edx+09]
:0048454F 03C2 add eax, edx <----相加
:00484551 B90A000000 mov ecx, 0000000A
:00484556 99 cdq
:00484557 F7F9 idiv ecx <----作除法
:00484559 83FA04 cmp edx, 00000004 <----余数是否为4
:0048455C 7502 jne 00484560 <----不是,继续试用期
:0048455E B301 mov bl, 01 <----标志

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00484537(C), :0048453F(C), :0048455C(C)
|
:00484560 33C0 xor eax, eax
:00484562 5A pop edx
:00484563 59 pop ecx
:00484564 59 pop ecx
:00484565 648910 mov dword ptr fs:[eax], edx
:00484568 687D454800 push 0048457D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048457B(U)
|
:0048456D 8D45FC lea eax, dword ptr [ebp-04]
:00484570 E88BF3F7FF call 00403900
:00484575 C3 ret

:00484576 E90DEEF7FF jmp 00403388
:0048457B EBF0 jmp 0048456D
:0048457D 8BC3 mov eax, ebx <----标志
:0048457F 5B pop ebx
:00484580 59 pop ecx
:00484581 5D pop ebp
:00484582 C3 ret

用户名:(好像没用)
注册码:A123456799
请问6.0版在哪儿下?


exescope6.0

 标 题:exescope6.0 (3千字)
发信人:liutong
时 间:2000-7-13 22:41:35
详细信息:
EXEscope 6.0

同5版本的注册没有大的改变
设断点bpx hmemcpy,中断后按F12键12次,再按F10键若干次,可找到:
:004807D1 E85A790000 call 00488130
:004807D6 84C0 test al, al
:004807D8 0F848D000000 je 0048086B

追入test上面的CALL
* Referenced by a CALL at Addresses:
|:004807D1 , :00487FE3
|
:00488130 55 push ebp
:00488131 8BEC mov ebp, esp
:00488133 51 push ecx
:00488134 53 push ebx
:00488135 8955FC mov dword ptr [ebp-04], edx
:00488138 8B45FC mov eax, dword ptr [ebp-04]
:0048813B E8F0BBF7FF call 00403D30
:00488140 33C0 xor eax, eax
:00488142 55 push ebp
:00488143 68B2814800 push 004881B2
:00488148 64FF30 push dword ptr fs:[eax]
:0048814B 648920 mov dword ptr fs:[eax], esp
:0048814E 33DB xor ebx, ebx
:00488150 8B45FC mov eax, dword ptr [ebp-04]
:00488153 E824BAF7FF call 00403B7C
:00488158 83F80A cmp eax, 0000000A<----输入码是否为10位
:0048815B 753F jne 0048819C
:0048815D 8B55FC mov edx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"A1910"
|
:00488160 B8C8814800 mov eax, 004881C8
:00488165 E89EBCF7FF call 00403E08<----搜索输入码中有无(A1910应为开头5位)
:0048816A 48 dec eax
:0048816B 7410 je 0048817D<----转到下面继续比较,否则试第二组注册码
:0048816D 8B55FC mov edx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"A1423"
|
:00488170 B8D8814800 mov eax, 004881D8
:00488175 E88EBCF7FF call 00403E08<----搜索输入码中有无A1423(A1423应为开头5位)
:0048817A 48 dec eax
:0048817B 751F jne 0048819C<----出错信息

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048816B(C)
|
:0048817D 8B45FC mov eax, dword ptr [ebp-04]
:00488180 0FB64008 movzx eax, byte ptr [eax+08]<----取输入码第9位
:00488184 8B55FC mov edx, dword ptr [ebp-04]
:00488187 0FB65209 movzx edx, byte ptr [edx+09]<----取输入码第10位
:0048818B 03C2 add eax, edx
:0048818D B90A000000 mov ecx, 0000000A
:00488192 99 cdq
:00488193 F7F9 idiv ecx
:00488195 83FA04 cmp edx, 00000004<----判断余数是否为4
:00488198 7502 jne 0048819C
:0048819A B301 mov bl, 01<----正确标志

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048815B(C), :0048817B(C), :00488198(C)
|
:0048819C 33C0 xor eax, eax
:0048819E 5A pop edx
:0048819F 59 pop ecx
:004881A0 59 pop ecx
:004881A1 648910 mov dword ptr fs:[eax], edx
:004881A4 68B9814800 push 004881B9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004881B7(U)
|
:004881A9 8D45FC lea eax, dword ptr [ebp-04]
:004881AC E84FB7F7FF call 00403900
:004881B1 C3 ret

:004881B2 E9D1B1F7FF jmp 00403388
:004881B7 EBF0 jmp 004881A9
:004881B9 8BC3 mov eax, ebx<----标志转移
:004881BB 5B pop ebx
:004881BC 59 pop ecx
:004881BD 5D pop ebp
:004881BE C3 ret

其中一个:A191012344


FINAL DATA

 标 题:FINAL DATA注册码计算 (2千字)
发信人:小楼
时 间:2000-7-24 23:20:11
详细信息:
final data1.0

由MAGO提供

name: xiaolou
company: aaa
sn: STD18121-4412-141872101238

bpx hmemxpy
F12 12次
:0042AB9B E85072FFFF call 00421DF0 <--进入
:0042ABA0 83C404 add esp, 00000004
:0042ABA3 85C0 test eax, eax
:0042ABA5 745F je 0042AC06 <-- jump=failure

发现
* Possible StringData Ref from Data Obj ->"STD"
|
:00421E0C 68F0EF4600 push 0046EFF0
:00421E11 8D55C8 lea edx, dword ptr [ebp-38]
:00421E14 52 push edx
:00421E15 E8F6150100 call 00433410
:00421E1A 83C408 add esp, 00000008
:00421E1D 85C0 test eax, eax
:00421E1F 7407 je 00421E28 <--sn开始3位必须是STD
:00421E21 33C0 xor eax, eax
:00421E23 E9D7020000 jmp 004220FF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00421E1F(C)
|
:00421E28 8B4508 mov eax, dword ptr [ebp+08]
:00421E2B 0FBE4808 movsx ecx, byte ptr [eax+08]
:00421E2F 83F92D cmp ecx, 0000002D <--9位是-
:00421E32 751B jne 00421E4F
:00421E34 8B5508 mov edx, dword ptr [ebp+08]
:00421E37 0FBE420D movsx eax, byte ptr [edx+0D]
:00421E3B 83F82D cmp eax, 0000002D <--14位是-
:00421E3E 750F jne 00421E4F
:00421E40 8B4D08 mov ecx, dword ptr [ebp+08]
:00421E43 51 push ecx

* Reference To: KERNEL32.lstrlenA, Ord:0308h
|
:00421E44 FF15FCD24500 Call dword ptr [0045D2FC]
:00421E4A 83F81A cmp eax, 0000001A <--sn 是26位
:00421E4D 7407 je 00421E56

......

......

再走到
:004220B2 3BD0 cmp edx, eax <--17位=EAX
:004220B4 7540 jne 004220F6
:004220B6 8B4DB8 mov ecx, dword ptr [ebp-48]
:004220B9 81E1FF000000 and ecx, 000000FF
:004220BF 8B55B4 mov edx, dword ptr [ebp-4C]
:004220C2 81E2FF000000 and edx, 000000FF
:004220C8 3BCA cmp ecx, edx <--6位及7位组成的十位数=EDX
:004220CA 752A jne 004220F6
:004220CC 8B45B0 mov eax, dword ptr [ebp-50]
:004220CF 25FF000000 and eax, 000000FF
:004220D4 8B4DFC mov ecx, dword ptr [ebp-04]
:004220D7 81E1FF000000 and ecx, 000000FF
:004220DD 3BC1 cmp eax, ecx <--4位及5位组成的十位数=ECX
:004220DF 7515 jne 004220F6
:004220E1 8B55C4 mov edx, dword ptr [ebp-3C]
:004220E4 81E2FF000000 and edx, 000000FF
:004220EA 8B45F8 mov eax, dword ptr [ebp-08]
:004220ED 25FF000000 and eax, 000000FF
:004220F2 3BD0 cmp edx, eax <--最后两位组成的十位数=EAX
:004220F4 7404 je 004220FA <--注册成功

注:请不要问我我是如何知道的, 因为基本上我都是猜出来的.


Font Creator Program

 标 题:本来不想上网的不过本人,打资料快要完了就是差只个韦氏音标的字体.(各大客十万火极) (853字)
发信人:peter007
时 间:2000-7-19 23:46:53
详细信息:
谁有好像国际音标一样韦氏音标的字体或者知道它的下载?
如果有的请E-mail: peter@nie-go.com
如果知道它下载请知之,本人用了许多搜器都没有找.
如果真的没有只好自己做字体这里有作字体要破解:
软件名称：Font Creator Program
整理日期：2000.7.14
最新版本：2.2
文件大小：1165KB
软件授权：共享软件
使用平台：Win95/98/NT
发布公司：home page
软件简介：
    可用来制作字体(TTF)的程序，除可自行制作外也能够直接编辑修改视窗操作系统上的任何TrueType字体，制作好的字体或修改好的字体能够让你储存和使用。
本地下载：
http://www.newhua.com.cn/down/fcp2.exe
http://newhua.xingtai.net/down/fcp2.exe
本地下载：2.20 build 227 汉化补丁 46KB YC-周 汉化
http://newhua.21f.net/down/HB_fcp220(227)_YC_ZHOU.zip
http://www.newhua.com.cn/down/HB_fcp220(227)_YC_ZHOU.zip
最好把一个完整的过程写出来,最好把密码也写出来.
这个软件本人不会用的,如果有大客用过也发表一下好吗？

标 题:这个简单，新手可轻松搞定 (2千字)
发信人:dr0
时 间:2000-7-20 0:53:07
详细信息:

Name: dr0
Company: （不要填任何东西）
Code: H0D220828026

用hmemcpy，中断后按12次F12就到了：

015F:004B74A7 CALL 00434534 //hmemcpy
015F:004B74AC PUSH DWORD PTR [EBP-10]
015F:004B74AF LEA EDX,[EBP-14]
015F:004B74B2 MOV EAX,[EBP-04]
015F:004B74B5 MOV EAX,[EAX+00000304]
015F:004B74BB CALL 00434534 //hmemcpy
015F:004B74C0 PUSH DWORD PTR [EBP-14]
015F:004B74C3 LEA EDX,[EBP-18]
015F:004B74C6 MOV EAX,[EBP-04]
015F:004B74C9 MOV EAX,[EAX+0000030C]
015F:004B74CF CALL 00434534 //hmemcpy
015F:004B74D4 PUSH DWORD PTR [EBP-18]
015F:004B74D7 LEA EDX,[EBP-1C]
015F:004B74DA MOV EAX,[EBP-04]
015F:004B74DD MOV EAX,[EAX+00000314]
015F:004B74E3 CALL 00434534 //hmemcpy
015F:004B74E8 PUSH DWORD PTR [EBP-1C]
015F:004B74EB LEA EAX,[EBP-08]
015F:004B74EE MOV EDX,00000004
015F:004B74F3 CALL 004040A4
015F:004B74F8 LEA EDX,[EBP-24]
015F:004B74FB MOV EAX,[EBP-04]
015F:004B74FE MOV EAX,[EAX+0000030C]
015F:004B7504 CALL 00434534 //hmemcpy
015F:004B7509 MOV EAX,[EBP-24]
015F:004B750C MOV EDX,00000003
015F:004B7511 DEC EDX
015F:004B7512 CMP EDX,[EAX-04]
015F:004B7515 JB 004B751C
015F:004B7517 CALL 00402F34
015F:004B751C INC EDX
015F:004B751D MOV AL,[EDX+EAX-01]
015F:004B7521 PUSH EAX
015F:004B7522 LEA EDX,[EBP-28]
015F:004B7525 MOV EAX,[EBP-04]
015F:004B7528 MOV EAX,[EAX+000002E0]
015F:004B752E CALL 00434534
015F:004B7533 MOV EAX,[EBP-28]
015F:004B7536 LEA ECX,[EBP-20]
015F:004B7539 POP EDX
015F:004B753A CALL 004B496C
015F:004B753F MOV EAX,[EBP-20]
015F:004B7542 PUSH EAX
015F:004B7543 LEA EDX,[EBP-2C]
015F:004B7546 MOV EAX,[EBP-08]
015F:004B7549 CALL 004089F4
015F:004B754E MOV EDX,[EBP-2C] //真注册码
015F:004B7551 POP EAX //假注册码
015F:004B7552 CALL 004040F4 //比较注册码
015F:004B7557 JNZ 004B75AF


FTP Control 4.2.0.0

 标 题:初学者(20) (1千字)
发信人:liutong
时 间:2000-8-8 22:53:26
详细信息:
FTP Control
软件版本：4.2.0.0 软件大小：4191KB 运行平台：Win95/98/NT 下载
软件简介： 随着FTP软件技术的发展，我觉得现在好的FTP软件的起码标准配置是应该具有下面等功能：
支持断点续传、拖拽、自动重拨、远程编辑文件等，但是只有这些功能是无法在FTP软件中一举夺取桂冠的，
如果想脱颖而出还必须有一些自己的绝招，“江山代有人才出”，这个时候FTP Control出现了，它带给我
焕然一新的惊喜。而FTP Control不仅有以上提到的所有特性，而且它还有华丽清爽界面，并支持整个子目录
的拽复制、定时定位传输、后台传输、剪贴板URL监测、支持防火墙和代理服务器等功能，如果你对Getright
和Netant的使用比较熟悉，你会发觉FTP Control还有一个类似Getright、Netant一样的“购物篮子”（是不
是很惊喜？），在使用的时候，你只需要把选中的文件先放在篮子里（这些文件可以是不同目录或者是不同
驱动器的）当选择结束后，单击“购物篮”，然后FTP Control会让你选择传输的类型--Up/Download,这个
非常易用的功能是其他十一种软件所没有的，在测试过程中，我发觉在速度与稳定性上FTP Control表现得
都非常优秀，可以说它是十一个软件中最为强大、完美的一个，而且它的价格也是参评软件中比较理想的一个。
（因为LeechFTP和WS_FTP LE它们是免费软件，所以FTP Control 当然没法和它相比。）......

软件来源:软件2000-08 A盘
key root:LI-TONG
key:87654321
设断点bpx hmemcpy,中断后,按若干次F12
可找到"87654321"的地址****:********
设断点bpm ****:********
可找到比较程序
找到的三个密码:
LITE Version: 3EDE5B4F
PRO Version: 3D2F923C
PRO POWER Version: 3D283FD3

此软件密码计算过程中使用了很多计算指令,我没跟出来.


GIF Construction Set Pro

 标 题:菜鸟破解录之 GIF Construction Set Pro及算法分析 (8千字)
发信人:xiA Qin
时 间:2000-9-1 10:44:20
详细信息:
菜鸟破解录之 GIF Construction Set Pro及算法分析

软件名称： GIF Construction Set Pro
软件版本： 2.0a(Ptach 20)
软件大小： 4132KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.mindworkshop.com/alchemy/gifcon.html
软件简介：
快速、专业地创建为你的网页创建透明、交错和活动的GIF文件。动画向导可另你在几分钟之内创建极具魅力的Web图形。

作 者：xiA Qin
解密日前：2000年8月30日
解密工具：Trw2000 1.22

说 明：这是我写的第一篇算法分析的破文，难免有错误存在，望各位大侠指点。

这个程序需要在安装时，就需要输入注册码和注册名。

输入注册信息：
注册 码：11111-22-33333-44

注：为了方便说明，分为4段。
第1段为：11111
第2段为：22
第3段为：33333
第4段为：44

注册名：Chinese #字符数必须大于5位数。

..............................
015F:00403163 PUSH EAX
015F:00403164 LEA EDX,[EBP+FFFFFBF4]
015F:0040316A PUSH EDX
015F:0040316B CALL 00424508
015F:00403170 ADD ESP,BYTE +08
015F:00403173 LEA ECX,[EBP+FFFFFBF4]
015F:00403179 PUSH ECX
015F:0040317A PUSH DWORD 0042FCB6
015F:0040317F CALL 00424598
015F:00403184 ADD ESP,BYTE +08
015F:00403187 MOV DWORD [EBP-04],01
015F:0040318E PUSH DWORD 0042FCB6
015F:00403193 CALL 004245C8
015F:00403198 POP ECX
015F:00403199 CMP EAX,BYTE +11 //又要检查注册码位数，17位。
015F:0040319C JZ 004031A3 //不相等，就跳。
015F:0040319E XOR EAX,EAX
015F:004031A0 MOV [EBP-04],EAX
015F:004031A3 CMP DWORD [EBP-04],BYTE +00
015F:004031A7 JZ 00403203
015F:004031A9 XOR EDX,EDX
015F:004031AB MOV [EBP-08],EDX
015F:004031AE MOV ESI,EDX
015F:004031B0 JMP SHORT 004031D4
015F:004031B2 XOR EAX,EAX //将eax清零。
015F:004031B4 MOV AL,[ESI+0042F8B4] //依次载入姓名字符。
015F:004031BA PUSH EAX
015F:004031BB CALL 00429FCC //将大写A~Z转换为小写a~z。
015F:004031C0 POP ECX
015F:004031C1 MOV EDX,ESI
015F:004031C3 AND EDX,BYTE +07
015F:004031C6 XOR ECX,ECX
015F:004031C8 MOV CL,[EDX+0042E088]
015F:004031CE XOR EAX,ECX // 把EAX和ECX做异或操作，
015F:004031D0 ADD [EBP-08],EAX //累加异或操作 [EBP-08]=[EBP-08]+EAX
015F:004031D3 INC ESI
015F:004031D4 CMP BYTE [ESI+0042F8B4],00 //取下个字符，等于00，就结束计算。
015F:004031DB JNZ 004031B2 //比较姓名字符是否计算结束
015F:004031DD MOV EAX,[EBP-08] //将[EBP-08]的值移入寄存器eax中
015F:004031E0 MOV ECX,64 //将16进制的64移入寄存器ECX
015F:004031E5 CDQ //判断eax中的值是否大于80000000,
015F:004031E6 IDIV ECX //用EAX与ECX求余.
015F:004031E8 MOV ESI,EDX //余数从EDX移入ESI。

一、算法总结:
1、这部分就是把你输入的注册名的每个字符都转成相应的Ascii码！

2、然后，与相对应80 40 20 10 08 04 02 01进行异或计算。再将计算后的值累加。
然后注册名大于8位，就循环使用80 40 20 10 08 04 02 01。

3、直到注册名计算完毕的值A与64求余。得到B.这就是我们需要的是第2段注册码
4、将B转换成十进制数就是注册码，这就是我们需要的是第2段注册码

计算公式：
注:注册名的第一位用a1来代替，第二位用a2来代替，第三位用a3来代替......，以次类推。

(a1 xor 80)+(a2 xor 40)+(a3 xor 20)+(a4 xor 10)+(a5 xor 08)+(a6 xor 04)+(a7 xor 02)
+(a8 xor 80)+(a9 xor 80)+(a10 xor 40)+(a10 xor 20)+(a11 xor 10)+(a12 xor 08).......=A

A IDIV 64=B

将B转换成十进制数就是注册码. 是第2段注册码。

二、举例说明：

我输入的注册名是chinese，它对应的Ascii如下。

字 符: c h i n e s e
Ascii: 63 68 69 6e 65 73 65 与80 40 20 10 08 04 02 进行异或计算

(63 xor 80)+(68 xor 40)+(69 xor 20)+(6e xor 10)+(65 xor 08)+(73 xor 04)+(65xor 02)=
e3+28+49+7e+6d+77+67=31D

31D IDIV 64 =61

61转换成十进制为97。 <<--第2段注册码

015F:004031EA TEST ESI,ESI
015F:004031EC JNZ 004031EF
015F:004031EE INC ESI
015F:004031EF PUSH DWORD 0042FCBC
015F:004031F4 CALL 0042A088
015F:004031F9 POP ECX
015F:004031FA CMP ESI,EAX //比较注册码。
015F:004031FC JZ 00403203 //不相等，就跳。
015F:004031FE XOR EAX,EAX
015F:00403200 MOV [EBP-04],EAX
015F:00403203 CMP DWORD [EBP-04],BYTE +00
015F:00403207 JZ NEAR 0040328E
015F:0040320D XOR EDX,EDX
015F:0040320F MOV [EBP-08],EDX
015F:00403212 XOR ESI,ESI
015F:00403214 JMP SHORT 0040322F
015F:00403216 MOV AL,[ESI+0042FCB6] <<--| 11111
015F:0040321C MOV EDX,ESI |
015F:0040321E AND EDX,BYTE +07 |
015F:00403221 XOR AL,[EDX+0042E088] |
015F:00403227 XOR ECX,ECX |
015F:00403229 MOV CL,AL |
015F:0040322B ADD [EBP-08],ECX |
015F:0040322E INC ESI |
015F:0040322F CMP BYTE [ESI+0042FCB6],00 |
015F:00403236 JZ 0040323D |
015F:00403238 CMP ESI,BYTE +05 |
015F:0040323B JL 00403216 <<--|
015F:0040323D XOR ESI,ESI
015F:0040323F JMP SHORT 0040325A
015F:00403241 MOV AL,[ESI+0042FCBF] <<--|
015F:00403247 MOV EDX,ESI | 33333
015F:00403249 AND EDX,BYTE +07 |
015F:0040324C XOR AL,[EDX+0042E088] |
015F:00403252 XOR ECX,ECX |
015F:00403254 MOV CL,AL |
015F:00403256 ADD [EBP-08],ECX |
015F:00403259 INC ESI |
015F:0040325A CMP BYTE [ESI+0042FCBF],00 |
015F:00403261 JZ 00403268 |
015F:00403263 CMP ESI,BYTE +05 |
015F:00403266 JL 00403241 <<--|
015F:00403268 MOV EAX,[EBP-08]
015F:0040326B MOV ECX,64
015F:00403270 CDQ
015F:00403271 IDIV ECX
015F:00403273 MOV ESI,EDX

此处的计算方法基本相同，不同的地方是它是用注册码的第1段(11111)和第3段(33333)来计算。

一、算法总结:
1、把你输入的注册码第1段(11111)的每个字符都转成相应的Ascii码！
2、然后，与相对应80 40 20 10 08 进行异或计算。再将计算后的值A累加。
3、把你输入的注册码第3段(33333)的每个字符都转成相应的Ascii码！
4、然后，与相对应80 40 20 10 08 进行异或计算。再将计算后的值B累加。
5、直到注册码计算完毕的值B与64求余。得到C.这就是我们需要的注册码C。
6、将C转换成十进制数就是注册码，这就是我们需要的第4段注册码。

计算公式：
注:注册码第1段(11111)的第一位用a1来代替，第二位用a2来代替，第三位用a3来代替......，以次类推
注册码第3段(33333)的第一位用b1来代替，第二位用b2来代替，第三位用b3来代替......，以次类推

(a1 xor 80)+(a2 xor 40)+(a3 xor 20)+(a4 xor 10)+(a5 xor 08)=A

A+(b1 xor 80)+(b2 xor 40)+(b3 xor 20)+(b4 xor 10)+(b5 xor 08)=B

B IDIV 64=C

将C转换成十进制数就是注册码.

二、举例说明：
我输入的注册码第1段是11111、第2段33333。

(31 xor 80)+(31 xor 40)+(31 xor 20)+(31 xor 10)+(31 xor 08)=B1+71+11+21+39=18D

18D+(33 xor 80)+(33 xor 40)+(33 xor 20)+(33 xor 10)+(33 xor 08)=18D+B3+73+13+23+3B=324

324 IDIV 64=04

04转换成十进制为04。<<--第4段注册码。

015F:00403275 TEST ESI,ESI
015F:00403277 JNZ 0040327A
015F:00403279 INC ESI
015F:0040327A PUSH DWORD 0042FCC5
015F:0040327F CALL 0042A088
015F:00403284 POP ECX
015F:00403285 CMP ESI,EAX // ? eax 44 是输入的注册码.
015F:00403287 JZ 0040328E ? esi 04 正确的注册码.
015F:00403289 XOR EAX,EAX
015F:0040328B MOV [EBP-04],EAX
015F:0040328E CMP DWORD [EBP-04],BYTE +00
015F:00403292 JNZ 004032A6
015F:00403294 PUSH DWORD 00430FCC
015F:00403299 PUSH EBX
015F:0040329A CALL 004038FD //密码失败对话框
015F:0040329F ADD ESP,BYTE +08
015F:004032A2 XOR EAX,EAX
015F:004032A4 JMP SHORT 00403310
.........................

通过以上分析可以知道，这个程序是用注册册名计算第2段注册吗。用第1段和第3段来计算第4段注册码。

也就是说，注册码第2段，同注册名有关。
注册码第4段，同注册码第1段和第3段有关。

整理一下：

注册码：11111-97-33333-04
注册名：Chinese

罗罗嗦嗦讲了一大堆，希望大家能够明白我的意思!


Green Tea 2.60

 标 题:Green Tea 2.60注册码算法分析 (3千字)
发信人:wind[CCG]
时 间:2000-7-17 12:42:37
详细信息:
Green Tea 2.60注册码算法
文章作者：wind[CCG]
作者主页：http://biggow.8u8.com
作者E-mail:biggow@eastday.com
欢迎转载，但请保持原文完整性！
看完此文，希望大家可以写出注册机，应该不是很难！

:0046A029 E8EE9BF9FF call 00403C1C
:0046A02E 8BD0 mov edx, eax
:0046A030 85D2 test edx, edx
:0046A032 7E14 jle 0046A048
:0046A034 B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A046(C)
|
:0046A039 8B4DF0 mov ecx, dword ptr [ebp-10]
:0046A03C 0FB64C01FF movzx ecx, byte ptr [ecx+eax-01]
:0046A041 0FAFD9 imul ebx, ecx
:0046A044 40 inc eax
:0046A045 4A dec edx
:0046A046 75F1 jne 0046A039
------------------------->上面这段程序，是将你输入的注册名，把注册名每个字符的Ascii码算出
然后，将每个字符的Ascii码相乘，得到一个积（在这里给这个乘积取一个变量名S)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A032(C)
|
:0046A048 83C364 add ebx, 00000064------->就是把乘积S加上64,
假设A=S+64（这里都是十六进制数）
:0046A04B 8BC3 mov eax, ebx-------->把算出的A移入寄存器eax中！
:0046A04D 99 cdq-------->判断eax中的值是否大于80000000,如果大于80000000那么
edx=ffffffff,反之，edx=00000000
:0046A04E 33C2 xor eax, edx------>把eax和edx做异或操作，也就是把A变量的值和
ffffffff或00000000作异或操作
如果edx=00000000的话,异或后eax的值保持
不变!
:0046A050 2BC2 sub eax, edx------->eax=eax-edx,也就是把异或出来的
值去减FFFFFFFF或00000000
如果edx=00000000的话,eax的值保持不变
:0046A052 8BF8 mov edi, eax
:0046A054 8BC7 mov eax, edi
:0046A056 8D951CFEFFFF lea edx, dword ptr [ebp+FFFFFE1C]
:0046A05C E813D0F9FF call 00407074
:0046A061 8B951CFEFFFF mov edx, dword ptr [ebp+FFFFFE1C]
:0046A067 8B86F8010000 mov eax, dword ptr [esi+000001F8]

算法总结：这个软件的注册部分就是把你输入的注册名的每个字符都转成相应的Ascii码！
然后，把每个字符的Ascii码相乘，得到这个乘积S,再把它加上64，然后把这个值放到eax中，然后
用cdq这个指令来判断eax的值是否大于80000000,如果大于，那么edx=ffffffff，否则，
edx=00000000
然后，把eax也就是A和00000000或ffffffff做异或，把异或出来的值放到eax里去！
再用eax的值去减去了edx也就是00000000或ffffffff!

执行cdq这个指令的时候，eax小于80000000，那么edx=00000000,那么这个A转换成十进制
数后就是注册码！

为了说明清楚，就举个简单的例子:
我要的注册名：wind
要转换的字符： w i n d
Ascii： 77 69 6E 64
chengji=77*69*6E*64;用计算器计算，得到chengji=8313E88
zonghe=chengji+64;计算后得到zonghe=8313EEC
由于8313EEC小于80000000，所以，edx=00000000
由于和00000000异或(后面的sub eax,edx,一个数减0当然不变啦!)，所以,zonghe不变，仍然等于8313EEC
将8313EEC转换成十进制数就是注册码
8313EEC转成十进制为137445100

最后整理出
注册名:wind 注册码：137445100

如果zonghe这个变量大于80000000的话，edx=ffffffff,就有一个异或过程，也就是说异或后的值会改变！
还有最后要加上1(因为sub eax,edx码!)

xor(异或):也就是必须两个相反的数才会得1,只有0和1出现的时候，结果才会为1，如果是0和0或者1和1
这个结果只能是0!

很久没有写东西了，希望大家对我粗糙的文笔表示谅解，也希望大家能够明白我的意思!
如果你读了这篇文章之后，写出了注册机，别忘了，提一下我的名字:wind[CCG]
以及我的网站:biggow.8u8.com!宣传一下!

wind
China Cracking Group
2000.7.16.


GWD Text Editor 3.0

 标 题:菜鸟破解录（18）之 GWD Text Editor 3.0 (4千字)
发信人:xiA Qin
时 间:2000-8-6 8:44:50
详细信息:
菜鸟破解录（18）之 GWD Text Editor 3.0

软件名称：GWD Text Editor -->(30天试用)
软件版本：3.0
软件下载: http://www.iridis.com/gwd/index.htm
简 介：
功能完整的文字编辑工具,不限制打开文件大小,可读取WordPerfect,MSWord这类常见软件的文件类型。

作 者：xiA Qin
级 别：刚学不久
解密日前：2000年8月4日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行GWD Text Editor
输入注册信息

register: 9876543210 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............

015F:004AD304 6810905A00 PUSH 005A9010
015F:004AD309 E8CADEFFFF CALL 004AB1D8
015F:004AD30E 59 POP ECX
015F:004AD30F 85C0 TEST EAX,EAX
015F:004AD311 746B JZ 004AD37E //跳到004AD37E,就死定了。我改！
015F:004AD313 E8B8EAFFFF CALL 004ABDD0
015F:004AD318 8BF0 MOV ESI,EAX
015F:004AD31A 89357C905A00 MOV [005A907C],ESI
015F:004AD320 85F6 TEST ESI,ESI
015F:004AD322 742E JZ 004AD352
015F:004AD324 6A40 PUSH 40
015F:004AD326 6A04 PUSH 04
015F:004AD328 68234E0000 PUSH 00004E23
015F:004AD32D 833D44495D0000 CMP DWORD PTR [005D4944],00
015F:004AD334 8B03 MOV EAX,[EBX]
015F:004AD336 8B500C MOV EDX,[EAX+0C]
015F:004AD339 52 PUSH EDX
015F:004AD33A 7508 JNZ 004AD344
015F:004AD33C 8B0D6B505900 MOV ECX,[0059506B]
015F:004AD342 EB06 JMP 004AD34A
015F:004AD344 8B0D44495D00 MOV ECX,[005D4944]
015F:004AD34A 51 PUSH ECX
015F:004AD34B E8E8C70000 CALL 004B9B38 //注册成功对话框
015F:004AD350 EB5D JMP 004AD3AF
015F:004AD352 6A10 PUSH 10
015F:004AD354 6A04 PUSH 04
015F:004AD356 68244E0000 PUSH 00004E24
015F:004AD35B 833D44495D0000 CMP DWORD PTR [005D4944],00
015F:004AD362 8B03 MOV EAX,[EBX]
015F:004AD364 8B500C MOV EDX,[EAX+0C]
015F:004AD367 52 PUSH EDX
015F:004AD368 7507 JNZ 004AD371
015F:004AD36A A16B505900 MOV EAX,[0059506B]
015F:004AD36F EB05 JMP 004AD376
015F:004AD371 A144495D00 MOV EAX,[005D4944]
015F:004AD376 50 PUSH EAX
015F:004AD377 E8BCC70000 CALL 004B9B38
015F:004AD37C EB31 JMP 004AD3AF
015F:004AD37E 6A30 PUSH 30
015F:004AD380 6A04 PUSH 04
015F:004AD382 C60510905A0000 MOV BYTE PTR [005A9010],00
015F:004AD389 68224E0000 PUSH 00004E22
015F:004AD38E 8B13 MOV EDX,[EBX]
015F:004AD390 833D44495D0000 CMP DWORD PTR [005D4944],00
015F:004AD397 8B4A0C MOV ECX,[EDX+0C]
015F:004AD39A 51 PUSH ECX
015F:004AD39B 7507 JNZ 004AD3A4
015F:004AD39D A16B505900 MOV EAX,[0059506B]
015F:004AD3A2 EB05 JMP 004AD3A9
015F:004AD3A4 A144495D00 MOV EAX,[005D4944]
015F:004AD3A9 50 PUSH EAX
015F:004AD3AA E889C70000 CALL 004B9B38 //注册失败对话框
015F:004AD3AF BA01000000 MOV EDX,00000001
015F:004AD3B4 833D7C905A0000 CMP DWORD PTR [005A907C],00
015F:004AD3BB 7501 JNZ 004AD3BE
015F:004AD3BD 42 INC EDX
015F:004AD3BE 52 PUSH EDX
015F:004AD3BF 53 PUSH EBX
015F:004AD3C0 8B4B0C MOV ECX,[EBX+0C]
015F:004AD3C3 FF5120 CALL [ECX+20]
015F:004AD3C6 83C408 ADD ESP,08
015F:004AD3C9 5E POP ESI
015F:004AD3CA 5B POP EBX
015F:004AD3CB 5D POP EBP
015F:004AD3CC C3 RET
.............................

从上面可以看出.

将004AD311 746B JZ 004AD37E
改004AD311 756B JNZ 004AD37E

就可以注册。

整里一下，用Ultraedt打开GTE.exe

找到74 68 E8 B8 EA FF FF

改成75 68 E8 B8 EA FF FF

保存修改文件，重新运行

输入注册信息 ，现在是想输入什么都可以。

register: &任意输入

后 记：
GWD Text Editor是通过读取安装目录下的文件Reg.lic来判断，程序是否注册。不管注册码是否正确。如果把文件Reg.lic删除，GWD Text Editor又成了非注册版。


GWD Text Editor 3.0

 标 题:菜鸟破解实录 之 GWD Text Editor 3.0 (9千字)
发信人:xiA Qin
时 间:2000-8-16 9:09:07
详细信息:
菜鸟破解实录 之 GWD Text Editor 3.0

软件名称：GWD Text Editor -->(30天试用)
软件版本：3.0
软件下载: http://www.iridis.com/gwd/index.htm
简 介：
功能完整的文字编辑工具,不限制打开文件大小,可读取WordPerfect,MSWord这类常见软件的文件类型。

作 者：Backbuy / xiA Qin
级 别：刚学不久
解密日前：2000年8月14日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
以前，破解过这个软件，当时用的是暴力，没有找到注册码。

backboy兄的指导下，终于找到了注册码，重新把它贴出来。

首先运行GWD Text Editor
输入注册信息

register: 9876543210 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............

015F:004AD304 6810905A00 PUSH 005A9010
015F:004AD309 E8CADEFFFF CALL 004AB1D8 //通过下面的分析。肯定此CALL.
015F:004AD30E 59 POP ECX 有问题。按F8进入。
015F:004AD30F 85C0 TEST EAX,EAX //以EAX=1作为注册标志。
015F:004AD311 746B JZ 004AD37E //跳到004AD37E,就死定了
015F:004AD313 E8B8EAFFFF CALL 004ABDD0
015F:004AD318 8BF0 MOV ESI,EAX
015F:004AD31A 89357C905A00 MOV [005A907C],ESI
015F:004AD320 85F6 TEST ESI,ESI
015F:004AD322 742E JZ 004AD352
015F:004AD324 6A40 PUSH 40
015F:004AD326 6A04 PUSH 04
015F:004AD328 68234E0000 PUSH 00004E23
015F:004AD32D 833D44495D0000 CMP DWORD PTR [005D4944],00
015F:004AD334 8B03 MOV EAX,[EBX]
015F:004AD336 8B500C MOV EDX,[EAX+0C]
015F:004AD339 52 PUSH EDX
015F:004AD33A 7508 JNZ 004AD344
015F:004AD33C 8B0D6B505900 MOV ECX,[0059506B]
015F:004AD342 EB06 JMP 004AD34A
015F:004AD344 8B0D44495D00 MOV ECX,[005D4944]
015F:004AD34A 51 PUSH ECX
015F:004AD34B E8E8C70000 CALL 004B9B38 //注册成功对话框
015F:004AD350 EB5D JMP 004AD3AF
015F:004AD352 6A10 PUSH 10
015F:004AD354 6A04 PUSH 04
015F:004AD356 68244E0000 PUSH 00004E24
015F:004AD35B 833D44495D0000 CMP DWORD PTR [005D4944],00
015F:004AD362 8B03 MOV EAX,[EBX]
015F:004AD364 8B500C MOV EDX,[EAX+0C]
015F:004AD367 52 PUSH EDX
015F:004AD368 7507 JNZ 004AD371
015F:004AD36A A16B505900 MOV EAX,[0059506B]
015F:004AD36F EB05 JMP 004AD376
015F:004AD371 A144495D00 MOV EAX,[005D4944]
015F:004AD376 50 PUSH EAX
015F:004AD377 E8BCC70000 CALL 004B9B38
015F:004AD37C EB31 JMP 004AD3AF
015F:004AD37E 6A30 PUSH 30
015F:004AD380 6A04 PUSH 04
015F:004AD382 C60510905A0000 MOV BYTE PTR [005A9010],00
015F:004AD389 68224E0000 PUSH 00004E22
015F:004AD38E 8B13 MOV EDX,[EBX]
015F:004AD390 833D44495D0000 CMP DWORD PTR [005D4944],00
015F:004AD397 8B4A0C MOV ECX,[EDX+0C]
015F:004AD39A 51 PUSH ECX
015F:004AD39B 7507 JNZ 004AD3A4
015F:004AD39D A16B505900 MOV EAX,[0059506B]
015F:004AD3A2 EB05 JMP 004AD3A9
015F:004AD3A4 A144495D00 MOV EAX,[005D4944]
015F:004AD3A9 50 PUSH EAX
015F:004AD3AA E889C70000 CALL 004B9B38 //注册失败对话框
015F:004AD3AF BA01000000 MOV EDX,00000001
015F:004AD3B4 833D7C905A0000 CMP DWORD PTR [005A907C],00
015F:004AD3BB 7501 JNZ 004AD3BE
015F:004AD3BD 42 INC EDX
015F:004AD3BE 52 PUSH EDX
015F:004AD3BF 53 PUSH EBX
015F:004AD3C0 8B4B0C MOV ECX,[EBX+0C]
015F:004AD3C3 FF5120 CALL [ECX+20]
015F:004AD3C6 83C408 ADD ESP,08
015F:004AD3C9 5E POP ESI
015F:004AD3CA 5B POP EBX
015F:004AD3CB 5D POP EBP
015F:004AD3CC C3 RET
.............................

按F8进入004AD309 CALL 004AB1D8

015F:004AB1D8 PUSH EBP
015F:004AB1D9 MOV EBP,ESP
015F:004AB1DB PUSH EBX
015F:004AB1DC PUSH ESI
015F:004AB1DD MOV EBX,[EBP+08]
015F:004AB1E0 MOV ESI,005D273C
015F:004AB1E5 MOV AL,[EBX]
015F:004AB1E7 INC EBX
015F:004AB1E8 XOR EDX,EDX
015F:004AB1EA MOV DL,AL
015F:004AB1EC PUSH EDX
015F:004AB1ED CALL 00587248
015F:004AB1F2 POP ECX
015F:004AB1F3 CMP EAX,47 <--比较注册码的第1位
015F:004AB1F6 JZ 004AB1FF <--相等，就跳。继续比较下一位。
015F:004AB1F8 XOR EAX,EAX
015F:004AB1FA JMP 004AB2F2
015F:004AB1FF MOV DL,[EBX]
015F:004AB201 INC EBX
015F:004AB202 XOR ECX,ECX
015F:004AB204 MOV CL,DL
015F:004AB206 PUSH ECX
015F:004AB207 CALL 00587248
015F:004AB20C POP ECX
015F:004AB20D CMP EAX,57 <--比较注册码的第2位
015F:004AB210 JZ 004AB219 <--相等，就跳。继续比较下一位。
015F:004AB212 XOR EAX,EAX
015F:004AB214 JMP 004AB2F2
015F:004AB219 MOV DL,[EBX]
015F:004AB21B INC EBX
015F:004AB21C XOR ECX,ECX
015F:004AB21E MOV CL,DL
015F:004AB220 PUSH ECX
015F:004AB221 CALL 00587248
015F:004AB226 POP ECX
015F:004AB227 CMP EAX,44 <--比较注册码的第3位
015F:004AB22A JZ 004AB233 <--相等，就跳。继续比较下一位。
015F:004AB22C XOR EAX,EAX
015F:004AB22E JMP 004AB2F2
015F:004AB233 MOV DL,[EBX]
015F:004AB235 INC EBX
015F:004AB236 MOVSX ECX,DL
015F:004AB239 CMP ECX,2D <--比较注册码的第4位
015F:004AB23C JZ 004AB245 <--相等，就跳。继续比较下一位。
015F:004AB23E XOR EAX,EAX
015F:004AB240 JMP 004AB2F2
015F:004AB245 MOV DL,[EBX]
015F:004AB247 INC EBX
015F:004AB248 MOVSX ECX,DL
015F:004AB24B CMP ECX,33 <--比较注册码的第5位
015F:004AB24E JZ 004AB257 <--相等，就跳。继续比较下一位。
015F:004AB250 XOR EAX,EAX
015F:004AB252 JMP 004AB2F2
015F:004AB257 MOV DL,[EBX]
015F:004AB259 INC EBX
015F:004AB25A MOVSX ECX,DL
015F:004AB25D CMP ECX,30 <--比较注册码的第6位
015F:004AB260 JZ 004AB269 <--相等，就跳。继续比较下一位。
015F:004AB262 XOR EAX,EAX
015F:004AB264 JMP 004AB2F2
015F:004AB269 MOV DL,[EBX]
015F:004AB26B INC EBX
015F:004AB26C MOVSX ECX,DL
015F:004AB26F CMP ECX,2D <--比较注册码的第7位
015F:004AB272 JZ 004AB278 <--相等，就跳。继续比较下一位。
015F:004AB274 XOR EAX,EAX
015F:004AB276 JMP 004AB2F2
015F:004AB278 MOV DL,[EBX]
015F:004AB27A XOR ECX,ECX
015F:004AB27C MOV CL,DL
015F:004AB27E INC EBX
015F:004AB27F TEST BYTE PTR [ECX*2+ESI+03],01 //检查注册码第8位是否是字母。
015F:004AB284 JNZ 004AB28A
015F:004AB286 XOR EAX,EAX
015F:004AB288 JMP 004AB2F2
015F:004AB28A MOV DL,[EBX]
015F:004AB28C XOR ECX,ECX
015F:004AB28E MOV CL,DL
015F:004AB290 INC EBX
015F:004AB291 TEST BYTE PTR [ECX*2+ESI+03],01 //检查注册码第9位是否是字母
015F:004AB296 JNZ 004AB29C
015F:004AB298 XOR EAX,EAX
015F:004AB29A JMP 004AB2F2
015F:004AB29C MOV DL,[EBX]
015F:004AB29E XOR ECX,ECX
015F:004AB2A0 MOV CL,DL
015F:004AB2A2 INC EBX
015F:004AB2A3 TEST BYTE PTR [ECX*2+ESI+02],04 //检查注册码第10位是否是数字
015F:004AB2A8 JNZ 004AB2AE
015F:004AB2AA XOR EAX,EAX
015F:004AB2AC JMP 004AB2F2
015F:004AB2AE MOV DL,[EBX]
015F:004AB2B0 XOR ECX,ECX
015F:004AB2B2 MOV CL,DL
015F:004AB2B4 INC EBX
015F:004AB2B5 TEST BYTE PTR [ECX*2+ESI+02],04 //检查注册码第11位是否是数字
015F:004AB2BA JNZ 004AB2C0
015F:004AB2BC XOR EAX,EAX
015F:004AB2BE JMP 004AB2F2
015F:004AB2C0 MOV DL,[EBX]
015F:004AB2C2 XOR ECX,ECX
015F:004AB2C4 MOV CL,DL
015F:004AB2C6 INC EBX
015F:004AB2C7 TEST BYTE PTR [ECX*2+ESI+02],04 //检查注册码第12位是否是数字
015F:004AB2CC JNZ 004AB2D2
015F:004AB2CE XOR EAX,EAX
015F:004AB2D0 JMP 004AB2F2
015F:004AB2D2 MOV DL,[EBX]
015F:004AB2D4 XOR ECX,ECX
015F:004AB2D6 MOV CL,DL
015F:004AB2D8 INC EBX
015F:004AB2D9 TEST BYTE PTR [ECX*2+ESI+02],04 //检查注册码第13位是否是数字
015F:004AB2DE JNZ 004AB2E4
015F:004AB2E0 XOR EAX,EAX
015F:004AB2E2 JMP 004AB2F2
015F:004AB2E4 CMP BYTE PTR [EBX],00 //检查注册码的位数，13位
015F:004AB2E7 JZ 004AB2ED //超过13位，就跳。玩完
015F:004AB2E9 XOR EAX,EAX
015F:004AB2EB JMP 004AB2F2
015F:004AB2ED MOV EAX,00000001 <--将EAX赋值为1
015F:004AB2F2 POP ESI
015F:004AB2F3 POP EBX
015F:004AB2F4 POP EBP
015F:004AB2F5 RET
..................

我们把比较的数字抄下了分别是
1 2 3 4 5 6 7
47 57 44 2D 33 30 2D

查ASCII字符表，十六进制。

十六进制： 47 57 44 2D 33 30 2D
分别对应： G W D - 3 0 - (GWD-30- )

X代表字母。*代表数字。

8 9 10 11 12 13
X X * * * *

整理一下，输入注册信息

code: GWD-30-XX****

比如：我的注册码是GWD-30-AB1234

后 记：
GWD Text Editor是通过读取安装目录下的文件Reg.lic来判断，程序是否注册。不管注册码是否正确。如果把文件Reg.lic删除，GWD Text Editor又成了非注册版。


HyperSnap-DX V3.62

 标 题:有没有谁破解了HyperSnap-DX V3.62这个抓图软件的注册码? (空)
发信人:guest
时 间:2000-8-5 16:27:21
详细信息:

标 题:我的注册码。 (247字)
发信人:hying
时 间:2000-8-5 21:37:26
详细信息:

我的注册码：姓名 hying;注册码：QKFP-WLDU-QMXA-IHRK-GDFD-GLQO；是3.55版的，不知是否通用？它的注册算法有一点复杂，但看懂以后求逆算法并不太难。但有一个问题，它的第五个字母必须是“W”，如不是的话，显示注册正确但并不保存，下次还得注册，不知是什么原因。

标 题:你的注册码在V3.62中仍然有效 (空)
发信人:guest
时 间:2000-8-7 9:46:56
详细信息:

标 题:你可以參考Ken的HyoerCam教學,同一家公司出品,註冊碼的計算方法雷同,僅表格和參數不同. (389字)
发信人:C-pen
时 间:2000-8-7 9:22:56
阅读次数:23
详细信息:

Ken的教學:http://home.pchome.com.tw/computer/metalken/
另外Hyper Snap-DX V.3.62還須注意的幾點是:
(1)起使的參數是第5個字元.
(2)有黑名單TKC/PC亦在裏頭.
(3)再來就是hying的問題,其實並不是只有W可以,程式會拿註冊碼的第5字元和變形後的第1字元取XOR,其值等於0會在一個Flag賦值1,否則為0,這並不是在比對之列,所以它一樣會Thank Yoy!只是下次運作時會重新要求你註冊,所以第字元可以是P,S,W也只有這3種可能.

标 题:我找到了以前写的注册机的原程序，是VC++，有兴趣可看，不知是否有帮助。 (1011字)
发信人:hying
时 间:2000-8-8 17:20:19
详细信息:

//姓名是否合适
if(i==0)
{
ax=m_name.GetLength();
if(ax<5)
{i=1;m_code="您姓名中的英文字符应不少于五个！";}
}
//由姓名算变换后的注册码
if(i==0)
{n=0;
for(i=0;i<ax;i++)
{if(m_name[i]>64&&m_name[i]<91)
{m_name2.Insert(n,m_name[i]);n++;}
if(m_name[i]>96&&m_name[i]<123)
{m_name2.Insert(n,m_name[i]-32);n++;}
}
ax=m_name2.GetLength();
m_name1="WORDXC";
i=0;
for(n=6;n<22;n++)
{if(i==ax)i=0;
m_name1.Insert(n,m_name2[i]);
i++;}
ax=0;
for(n=0;n<21;n++)
{i=m_name1[n]-65;
ax=ax+i;
n++;
i=m_name1[n]-65;
i=i+i;
if(i>25)i=i-25;
ax=ax+i;}
i=ax/26;
n=ax-i*26;
m_name1.Insert(23,n+65);
//
//算注册码
si=22;
i=0;
for(n=0;n<23;n++)
{if(i==4)
{m_code.Insert(n,22+65);i++;}
ax=m_name1[n]-65;
ax=ax+si;
ax++;
if(ax>=26)ax=ax-26;
m_code.Insert(i,m_code1[ax]);
si=m_code[i]-65;
i++;
}
m_code.Insert(4,45);
m_code.Insert(9,45);
m_code.Insert(14,45);
m_code.Insert(19,45);
m_code.Insert(24,45);
}
UpdateData(false);


iceplayer 1.80

 标 题:真相大白!我的真正的入门破解4 (7千字)
发信人:PeterChen
时 间:2000-8-30 16:57:44
详细信息:
Hi!
我又来了，我不会受到这样的错锉就放弃在这个看雪高手的论坛上哑然无声！
我只是开一个玩笑！哈.....哈......合！
我们是cracker对付一个软件所受到的困难比起这样的事，算就么？
浪话不太多！
正题：
今晚拿iceplayer来开刀！
用trw2000
软件下载http://newhua.21f.net/ICEPlayer.htm
打开ice.exe,然后会看见welcome to use ice meiaplayer v1.80
点击一下.会看见tool再点击,看见注册！
也只是输入注册码！
sn 111111111111 22222222222
直接到把前码和后码都把注册框填满！
hmemcpy
x
pmodule
直接到
0167:00480D29 MOV DWORD [EBP-60],00
0167:00480D30 MOV ECX,[EBP-24]（光条走到这里显示ss:[6DF57C]=004BD180)
D 4BD180 (显示前码）
....
0167:00480D33 PUSH ECX
d ecx （就是显示软入前码）
...
0167:00480D34 PUSH DWORD 00425624
我试了d 425624马上显示(Hi!
我又来了，我不会受到这样的错锉就放弃在这个看雪高手的论坛上哑然无声！
我只是开一个玩笑！哈.....哈......合！
我们是cracker对付一个软件所受到的困难比起这样的事，算就么？
浪话不太多！
正题：
今晚拿iceplayer来开刀！
用trw2000
软件下载http://newhua.21f.net/ICEPlayer.htm
打开ice.exe,然后会看见welcome to use ice meiaplayer v1.80
点击一下.会看见tool再点击,看见注册！
也只是输入注册码！
sn 111111111111 22222222222
直接到把前码和后码都把注册框填满！
hmemcpy
x
pmodule
直接到
0167:00480D29 MOV DWORD [EBP-60],00
0167:00480D30 MOV ECX,[EBP-24]（光条走到这里显示ss:[6DF57C]=004BD180)
D 4BD180 (显示前码）
....
0167:00480D33 PUSH ECX
d ecx （就是显示软入前码）
...
0167:00480D34 PUSH DWORD 00425624
我试了d 425624马上显示(Z76-102386-H23-10B12 & Ice9-013-m01-h08A16)
...
0167:00480D39 CALL `MSVBVM60!__vbaStrCmp`
0167:00480D3F MOV ESI,EAX
0167:00480D41 NEG ESI
0167:00480D43 SBB ESI,ESI
0167:00480D45 INC ESI
0167:00480D46 NEG ESI
0167:00480D48 MOV EDX,[EBP-28](显示SS;[6DF78]=0051B728)
D 51B728(显示后码）
...
0167:00480D4B PUSH EDX （显示SS:[6DF520]=004BD180,很眼熟,啊!是前码）
EDX会不会是后码了?不用猜d下果然是！
...
0167:00480D4C PUSH DWORD 00425654 (光条来到这里显示DS:[6DF51C]=00425624)
噫!等于0167:00480D34 PUSH DWORD 00425624,中的00425624?
d了这里的425624果然一样!我在d 425654就只显示Ice9-013-m01-h08A16
....
0167:00480D51 CALL `MSVBVM60!__vbaStrCmp`
0167:00480D57 NEG EAX
0167:00480D59 SBB EAX,EAX
0167:00480D5B INC EAX
0167:00480D5C NEG EAX
0167:00480D5E AND SI,AX
0167:00480D61 MOV [EBP-44],SI
0167:00480D65 LEA EAX,[EBP-28]
0167:00480D68 PUSH EAX
0167:00480D69 LEA ECX,[EBP-24]
0167:00480D6C PUSH ECX
0167:00480D6D PUSH BYTE +02
0167:00480D6F CALL `MSVBVM60!__vbaFreeStrList`
0167:00480D75 ADD ESP,BYTE +0C
0167:00480D78 LEA EDX,[EBP-30]
0167:00480D7B PUSH EDX
0167:00480D7C LEA EAX,[EBP-2C]
0167:00480D7F PUSH EAX
0167:00480D80 PUSH BYTE +02
0167:00480D82 CALL `MSVBVM60!__vbaFreeObjList`
0167:00480D88 ADD ESP,BYTE +0C
0167:00480D8B MOVSX ECX,WORD [EBP-44]
0167:00480D8F TEST ECX,ECX
0167:00480D91 JZ NEAR 00480E90
0167:00480D97 MOV DWORD [EBP-04],04
0167:00480D9E MOV EDX,[EBP+08]
0167:00480DA1 MOV WORD [EDX+34],EC78
0167:00480DA7 MOV DWORD [EBP-04],05
0167:00480DAE MOV EAX,[EBP+08]
0167:00480DB1 MOV CX,[EAX+34]
0167:00480DB5 PUSH ECX
0167:00480DB6 CALL `MSVBVM60!__vbaStrI2`
0167:00480DBC MOV EDX,EAX
0167:00480DBE LEA ECX,[EBP-24]
0167:00480DC1 CALL `MSVBVM60!__vbaStrMove`
0167:00480DC7 PUSH EAX
0167:00480DC8 PUSH DWORD 00424390
0167:00480DCD PUSH DWORD 00424378
0167:00480DD2 PUSH DWORD 00424360
0167:00480DD7 CALL `MSVBVM60!rtcSaveSetting`
0167:00480DDD LEA ECX,[EBP-24]
0167:00480DE0 CALL `MSVBVM60!__vbaFreeStr`
0167:00480DE6 MOV DWORD [EBP-04],06
0167:00480DED MOV EDX,004243CC
0167:00480DF2 MOV ECX,[EBP+08]
0167:00480DF5 ADD ECX,BYTE +4C
0167:00480DF8 CALL `MSVBVM60!__vbaStrCopy`
0167:00480DFE MOV DWORD [EBP-04],07
0167:00480E05 MOV EDX,[EBP+08]
0167:00480E08 MOV EAX,[EDX+4C]
0167:00480E0B PUSH EAX
0167:00480E0C PUSH DWORD 00424390
0167:00480E11 PUSH DWORD 00424378
0167:00480E16 PUSH DWORD 004243A8
0167:00480E1B CALL `MSVBVM60!rtcSaveSetting`
0167:00480E21 MOV DWORD [EBP-04],08
0167:00480E28 MOV ECX,[EBP+08]
我怀疑这两者都是注册码(Z76-102386-H23-10B12 & Ice9-013-m01-h08A16)
但是我不知道如何输入？有哪位大客帮小弟解决问题？
如果大客破解的方法不同小弟或我找错地方请贴上过程行吗？
)
...
0167:00480D39 CALL `MSVBVM60!__vbaStrCmp`
0167:00480D3F MOV ESI,EAX
0167:00480D41 NEG ESI
0167:00480D43 SBB ESI,ESI
0167:00480D45 INC ESI
0167:00480D46 NEG ESI
0167:00480D48 MOV EDX,[EBP-28](显示SS;[6DF78]=0051B728)
D 51B728(显示后码）
...
0167:00480D4B PUSH EDX （显示SS:[6DF520]=004BD180,很眼熟,啊!是前码）
EDX会不会是后码了?不用猜d下果然是！
...
0167:00480D4C PUSH DWORD 00425654 (光条来到这里显示DS:[6DF51C]=00425624)
噫!等于0167:00480D34 PUSH DWORD 00425624,中的00425624?
d了这里的425624果然一样!我在d 425654就只显示Ice9-013-m01-h08A16
....
0167:00480D51 CALL `MSVBVM60!__vbaStrCmp`
0167:00480D57 NEG EAX
0167:00480D59 SBB EAX,EAX
0167:00480D5B INC EAX
0167:00480D5C NEG EAX
0167:00480D5E AND SI,AX
0167:00480D61 MOV [EBP-44],SI
0167:00480D65 LEA EAX,[EBP-28]
0167:00480D68 PUSH EAX
0167:00480D69 LEA ECX,[EBP-24]
0167:00480D6C PUSH ECX
0167:00480D6D PUSH BYTE +02
0167:00480D6F CALL `MSVBVM60!__vbaFreeStrList`
0167:00480D75 ADD ESP,BYTE +0C
0167:00480D78 LEA EDX,[EBP-30]
0167:00480D7B PUSH EDX
0167:00480D7C LEA EAX,[EBP-2C]
0167:00480D7F PUSH EAX
0167:00480D80 PUSH BYTE +02
0167:00480D82 CALL `MSVBVM60!__vbaFreeObjList`
0167:00480D88 ADD ESP,BYTE +0C
0167:00480D8B MOVSX ECX,WORD [EBP-44]
0167:00480D8F TEST ECX,ECX
0167:00480D91 JZ NEAR 00480E90
0167:00480D97 MOV DWORD [EBP-04],04
0167:00480D9E MOV EDX,[EBP+08]
0167:00480DA1 MOV WORD [EDX+34],EC78
0167:00480DA7 MOV DWORD [EBP-04],05
0167:00480DAE MOV EAX,[EBP+08]
0167:00480DB1 MOV CX,[EAX+34]
0167:00480DB5 PUSH ECX
0167:00480DB6 CALL `MSVBVM60!__vbaStrI2`
0167:00480DBC MOV EDX,EAX
0167:00480DBE LEA ECX,[EBP-24]
0167:00480DC1 CALL `MSVBVM60!__vbaStrMove`
0167:00480DC7 PUSH EAX
0167:00480DC8 PUSH DWORD 00424390
0167:00480DCD PUSH DWORD 00424378
0167:00480DD2 PUSH DWORD 00424360
0167:00480DD7 CALL `MSVBVM60!rtcSaveSetting`
0167:00480DDD LEA ECX,[EBP-24]
0167:00480DE0 CALL `MSVBVM60!__vbaFreeStr`
0167:00480DE6 MOV DWORD [EBP-04],06
0167:00480DED MOV EDX,004243CC
0167:00480DF2 MOV ECX,[EBP+08]
0167:00480DF5 ADD ECX,BYTE +4C
0167:00480DF8 CALL `MSVBVM60!__vbaStrCopy`
0167:00480DFE MOV DWORD [EBP-04],07
0167:00480E05 MOV EDX,[EBP+08]
0167:00480E08 MOV EAX,[EDX+4C]
0167:00480E0B PUSH EAX
0167:00480E0C PUSH DWORD 00424390
0167:00480E11 PUSH DWORD 00424378
0167:00480E16 PUSH DWORD 004243A8
0167:00480E1B CALL `MSVBVM60!rtcSaveSetting`
0167:00480E21 MOV DWORD [EBP-04],08
0167:00480E28 MOV ECX,[EBP+08]
两者注册码(Z76-102386-H23-10B12 & Ice9-013-m01-h08A16)
昨晚太晚破解,眼睛不行!把Z76看成Z16,m01看成mo1!
还有本人是用五笔喜欢盲打,以后会在发表时再看一次谢谢客位指教!


Icon Clock 5.0

 标 题:初学者(26) (9千字)
发信人:liutong
时 间:2000-8-17 8:28:22
详细信息:
Icon Clock
Version 5.0

The shareware version of Icon Clock will only run 30 days. There are now
two options for registering Icon Clock. The Standard Registration costs
just $10.00. The Deluxe Registration is $20.00.
* Possible StringData Ref from Data Obj ->"clock"

安装后,输入用户名:LiuTong
注册码:987654321(注册码要求9位)
开始时,按常用方法设bpx hmemcpy断点
找到了输入的注册码"987654321"的地址****:********
设断点bpm ****:********
但未发现比较指令.
因此猜测软件将用户名和注册码存到某个地方,当下次启动时比较.
追踪过程中发现软件在注册表中存了几个数据:
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Icinst/lday<---当前日期
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Icinst/lhr<---当前时间
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Icinst/sday<---安装日期
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Icinst/smonth<---安装月

改用断点bpx GetPrivateProfileStringA
很快便找到了用户名和输入码,并分别用bpm设了两个断点
于是找到下面的程序
:00401B8B 68D4E14200 push 0042E1D4
:00401B90 52 push edx
:00401B91 8BC8 mov ecx, eax
:00401B93 E8DE0D0200 call 00422976
:00401B98 8B442408 mov eax, dword ptr [esp+08]
:00401B9C BE02000000 mov esi, 00000002
:00401BA1 893518224300 mov dword ptr [00432218], esi
:00401BA7 8378F809 cmp dword ptr [eax-08], 00000009
:00401BAB 0F85EB020000 jne 00401E9C
:00401BB1 8B44240C mov eax, dword ptr [esp+0C]
:00401BB5 8378F804 cmp dword ptr [eax-08], 00000004
:00401BB9 0F8CDD020000 jl 00401E9C
:00401BBF 0FBE08 movsx ecx, byte ptr [eax]
:00401BC2 51 push ecx
:00401BC3 E8A89C0000 call 0040B870
:00401BC8 83C404 add esp, 00000004
:00401BCB E8B09C0000 call 0040B880<--计算Call
:00401BD0 99 cdq
:00401BD1 B909000000 mov ecx, 00000009
:00401BD6 F7F9 idiv ecx
:00401BD8 8B442408 mov eax, dword ptr [esp+08]
:00401BDC 0FBE4806 movsx ecx, byte ptr [eax+06]<--输入码第7位
:00401BE0 83C230 add edx, 00000030 <--注册码第7位
:00401BE3 3BD1 cmp edx, ecx
:00401BE5 7406 je 00401BED
:00401BE7 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401BE5(C)
|
:00401BED E88E9C0000 call 0040B880
:00401BF2 99 cdq
:00401BF3 B909000000 mov ecx, 00000009
:00401BF8 F7F9 idiv ecx
:00401BFA 8B442408 mov eax, dword ptr [esp+08]
:00401BFE 0FBE4803 movsx ecx, byte ptr [eax+03]<--输入码第4位
:00401C02 83C230 add edx, 00000030<--注册码第4位
:00401C05 3BD1 cmp edx, ecx
:00401C07 7406 je 00401C0F
:00401C09 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C07(C)
|
:00401C0F E86C9C0000 call 0040B880
:00401C14 99 cdq
:00401C15 B909000000 mov ecx, 00000009
:00401C1A F7F9 idiv ecx
:00401C1C 8B442408 mov eax, dword ptr [esp+08]
:00401C20 0FBE08 movsx ecx, byte ptr [eax]<--输入码第1位
:00401C23 83C230 add edx, 00000030<--注册码第1位
:00401C26 3BD1 cmp edx, ecx
:00401C28 7406 je 00401C30
:00401C2A 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C28(C)
|
:00401C30 8B54240C mov edx, dword ptr [esp+0C]
:00401C34 0FBE4201 movsx eax, byte ptr [edx+01]
:00401C38 50 push eax
:00401C39 E8329C0000 call 0040B870
:00401C3E 83C404 add esp, 00000004
:00401C41 E83A9C0000 call 0040B880
:00401C46 99 cdq
:00401C47 B909000000 mov ecx, 00000009
:00401C4C F7F9 idiv ecx
:00401C4E 8B442408 mov eax, dword ptr [esp+08]
:00401C52 0FBE4807 movsx ecx, byte ptr [eax+07]<--输入码第8位
:00401C56 83C230 add edx, 00000030<--注册码第8位
:00401C59 3BD1 cmp edx, ecx
:00401C5B 7406 je 00401C63
:00401C5D 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C5B(C)
|
:00401C63 E8189C0000 call 0040B880
:00401C68 99 cdq
:00401C69 B909000000 mov ecx, 00000009
:00401C6E F7F9 idiv ecx
:00401C70 8B442408 mov eax, dword ptr [esp+08]
:00401C74 0FBE4804 movsx ecx, byte ptr [eax+04]<--输入码第5位
:00401C78 83C230 add edx, 00000030<--注册码第5位
:00401C7B 3BD1 cmp edx, ecx
:00401C7D 7406 je 00401C85
:00401C7F 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C7D(C)
|
:00401C85 E8F69B0000 call 0040B880
:00401C8A 99 cdq
:00401C8B B909000000 mov ecx, 00000009
:00401C90 F7F9 idiv ecx
:00401C92 8B442408 mov eax, dword ptr [esp+08]
:00401C96 0FBE4801 movsx ecx, byte ptr [eax+01]<--输入码第2位
:00401C9A 83C230 add edx, 00000030<--注册码第2位
:00401C9D 3BD1 cmp edx, ecx
:00401C9F 7406 je 00401CA7
:00401CA1 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C9F(C)
|
:00401CA7 8B54240C mov edx, dword ptr [esp+0C]
:00401CAB 0FBE4202 movsx eax, byte ptr [edx+02]
:00401CAF 50 push eax
:00401CB0 E8BB9B0000 call 0040B870
:00401CB5 83C404 add esp, 00000004
:00401CB8 E8C39B0000 call 0040B880
:00401CBD 99 cdq
:00401CBE B909000000 mov ecx, 00000009
:00401CC3 F7F9 idiv ecx
:00401CC5 8B442408 mov eax, dword ptr [esp+08]
:00401CC9 0FBE4808 movsx ecx, byte ptr [eax+08]<--输入码第9位
:00401CCD 83C230 add edx, 00000030<--注册码第9位
:00401CD0 3BD1 cmp edx, ecx
:00401CD2 7406 je 00401CDA
:00401CD4 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401CD2(C)
|
:00401CDA E8A19B0000 call 0040B880
:00401CDF 99 cdq
:00401CE0 B909000000 mov ecx, 00000009
:00401CE5 F7F9 idiv ecx
:00401CE7 8B442408 mov eax, dword ptr [esp+08]
:00401CEB 0FBE4805 movsx ecx, byte ptr [eax+05]<--输入码第6位
:00401CEF 83C230 add edx, 00000030<--注册码第6位
:00401CF2 3BD1 cmp edx, ecx
:00401CF4 7406 je 00401CFC
:00401CF6 893D18224300 mov dword ptr [00432218], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401CF4(C)
|
:00401CFC E87F9B0000 call 0040B880
:00401D01 99 cdq
:00401D02 B909000000 mov ecx, 00000009
:00401D07 F7F9 idiv ecx
:00401D09 8B442408 mov eax, dword ptr [esp+08]
:00401D0D 0FBE4802 movsx ecx, byte ptr [eax+02]<--输入码第3位
:00401D11 83C230 add edx, 00000030<--注册码第3位
:00401D14 3BD1 cmp edx, ecx
:00401D16 7406 je 00401D1E
:00401D18 893D18224300 mov dword ptr [00432218], edi

计算Call见下:
* Referenced by a CALL at Addresses:
|:00401BCB , :00401BED , :00401C0F , :00401C41 , :00401C63
|:00401C85 , :00401CB8 , :00401CDA , :00401CFC , :00401D44
|:00401D68 , :00401D8A , :00401DBD , :00401DDF , :00401E01
|:00401E39 , :00401E5E , :00401E80
|
:0040B880 E8FB3A0000 call 0040F380
:0040B885 8B4814 mov ecx, dword ptr [eax+14]
:0040B888 8D1449 lea edx, dword ptr [ecx+2*ecx]
:0040B88B 8D1491 lea edx, dword ptr [ecx+4*edx]
:0040B88E C1E204 shl edx, 04
:0040B891 03D1 add edx, ecx
:0040B893 C1E208 shl edx, 08
:0040B896 2BD1 sub edx, ecx
:0040B898 8D8C91C39E2600 lea ecx, dword ptr [ecx+4*edx+00269EC3]
:0040B89F 894814 mov dword ptr [eax+14], ecx
:0040B8A2 8BC1 mov eax, ecx
:0040B8A4 C1E810 shr eax, 10
:0040B8A7 25FF7F0000 and eax, 00007FFF
:0040B8AC C3 ret

实际计算中,软件使用用户名的第一个字母计算出第7,4,1位注册码
使用用户名的第二个字母计算出第8,5,2位注册码
使用用户名的第三个字母计算出第9,6,3位注册码

整理:
用户名:LiuTong
注册码:441752736


JPEG Optimizer3.15

 标 题:菜鸟破解录 JPEG Optimizer3.15 (6千字)
发信人:xiA Qin
时 间:2000-8-14 8:28:17
详细信息:
菜鸟破解录 JPEG Optimizer3.15

软件名称： JPEG Optimizer
软件版本： 3.15
软件大小： 1408KB
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.xat.com
软件简介： 该软件能对JPG图形文件压缩50%而不损失画质，自定压缩比，能即时显现压缩后的图片，让你比较差异，效果相当不错。

作 者：xiA Qin
级 别：很菜....很菜.....
解密日前：2000年8月11日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行JPEG Optimizer
输入注册信息
Registration code: 12345678 &只能输入8个字符（程序会检查注册码的位数）

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
.................

015F:0042947E LEA EAX,[EBP-0C]
015F:00429481 XOR EDX,EDX
015F:00429483 MOV [EBP-10],EDX
015F:00429486 LEA EDX,[EBP-10]
015F:00429489 INC DWORD [ESI+1C]
015F:0042948C CALL 0044CE07
015F:00429491 LEA EDX,[EBP-10]
015F:00429494 MOV EAX,EDI
015F:00429496 MOV EDX,[EDX]
015F:00429498 CALL 0044585C
015F:0042949D DEC DWORD [ESI+1C]
015F:004294A0 LEA EAX,[EBP-10]
015F:004294A3 MOV EDX,02
015F:004294A8 CALL 0044C524
015F:004294AD DEC DWORD [ESI+1C]
015F:004294B0 LEA EAX,[EBP-0C]
015F:004294B3 MOV EDX,02
015F:004294B8 CALL 0044C524
015F:004294BD MOV WORD [ESI+10],2C
015F:004294C3 XOR ECX,ECX
015F:004294C5 MOV [EBP-08],ECX
015F:004294C8 LEA EDX,[EBP-08]
015F:004294CB INC DWORD [ESI+1C]
015F:004294CE MOV EAX,[EBX+01C8]
015F:004294D4 CALL 0044582C
015F:004294D9 MOV WORD [ESI+10],08
015F:004294DF MOV WORD [ESI+10],38
015F:004294E5 XOR ECX,ECX
015F:004294E7 MOV [EBP-14],ECX
015F:004294EA LEA EDX,[EBP-14]
015F:004294ED INC DWORD [ESI+1C]
015F:004294F0 MOV EAX,[EBX+01C8]
015F:004294F6 CALL 0044582C
015F:004294FB LEA EAX,[EBP-14]
015F:004294FE CALL 0044C77E
015F:00429503 CMP EAX,BYTE +08 //第一个拦路虎，检查注册码的位数，8位
015F:00429506 JNZ 00429523 //注册码位数不等于8，就跳。
015F:00429508 CMP DWORD [EBP-08],BYTE +00
015F:0042950C JZ 00429513
015F:0042950E MOV EDX,[EBP-08]
015F:00429511 JMP SHORT 00429518
015F:00429513 MOV EDX,004825B3
015F:00429518 PUSH EDX
015F:00429519 CALL 0042A0C4 //通过下面的分析，可以肯定此CAll有问题。按F8进入。
015F:0042951E POP ECX
015F:0042951F TEST AL,AL //以al=1作为注册标志
015F:00429521 JNZ 00429527 //不跳则失败。
015F:00429523 XOR EAX,EAX
015F:00429525 JMP SHORT 0042952C
015F:00429527 MOV EAX,01
015F:0042952C PUSH EAX
015F:0042952D DEC DWORD [ESI+1C]
015F:00429530 LEA EAX,[EBP-14]
015F:00429533 MOV EDX,02
015F:00429538 CALL 0044C524
015F:0042953D POP ECX
015F:0042953E TEST CL,CL
015F:00429540 JZ NEAR 0042969E
.......................

按F8进入00429519 CALL 0042A0C4

015F:0042A0C4 PUSH EBP
015F:0042A0C5 MOV EBP,ESP
015F:0042A0C7 ADD ESP,BYTE -0C
015F:0042A0CA PUSH EBX
015F:0042A0CB MOV EAX,[EBP+08]
015F:0042A0CE LEA EBX,[EBP-0C]
015F:0042A0D1 MOV DL,[EAX]
015F:0042A0D3 MOV [EBX],DL
015F:0042A0D5 MOV CL,[EAX+01] <-|
015F:0042A0D8 MOV [EBX+01],CL |
015F:0042A0DB MOV DL,[EAX+02] |载入
015F:0042A0DE MOV [EBX+02],DL |假的注册码
015F:0042A0E1 MOV CL,[EAX+03] |
015F:0042A0E4 MOV [EBX+03],CL |
015F:0042A0E7 MOV DL,[EAX+04] |
015F:0042A0EA MOV [EBX+04],DL |
015F:0042A0ED MOV CL,[EAX+05] |
015F:0042A0F0 MOV [EBX+05],CL |
015F:0042A0F3 MOV DL,[EAX+06] |
015F:0042A0F6 MOV [EBX+06],DL |
015F:0042A0F9 MOV CL,[EAX+07] |
015F:0042A0FC MOV [EBX+07],CL |
015F:0042A0FF MOV AL,[EAX+08] <-|
015F:0042A102 MOV [EBX+08],AL
015F:0042A105 MOV BYTE [EBX+09],00
015F:0042A109 MOVSX EAX,BYTE [EBX]
015F:0042A10C PUSH EAX
015F:0042A10D CALL 00472D34
015F:0042A112 POP ECX
015F:0042A113 CMP EAX,BYTE +4A <--比较注册码第1位
015F:0042A116 JNZ 0042A171 <--不相等，就跳
015F:0042A118 MOVSX EDX,BYTE [EBX+01]
015F:0042A11C PUSH EDX
015F:0042A11D CALL 00472D34
015F:0042A122 POP ECX
015F:0042A123 CMP EAX,BYTE +53 <--比较注册码第2位
015F:0042A126 JNZ 0042A171 <--不相等，就跳
015F:0042A128 MOVSX ECX,BYTE [EBX+02]
015F:0042A12C CMP ECX,BYTE +24 <--比较注册码第3位
015F:0042A12F JNZ 0042A171 <--不相等，就跳
015F:0042A131 MOVSX EAX,BYTE [EBX+03]
015F:0042A135 CMP EAX,BYTE +32 <--比较注册码第4位
015F:0042A138 JNZ 0042A171 <--不相等，就跳
015F:0042A13A MOVSX EDX,BYTE [EBX+04]
015F:0042A13E CMP EDX,BYTE +38 <--比较注册码第5位
015F:0042A141 JNZ 0042A171 <--不相等，就跳
015F:0042A143 MOVSX ECX,BYTE [EBX+05]
015F:0042A147 CMP ECX,BYTE +39 <--比较注册码第6位
015F:0042A14A JNZ 0042A171 <--不相等，就跳
015F:0042A14C MOVSX EAX,BYTE [EBX+06]
015F:0042A150 CMP EAX,BYTE +32 <--比较注册码第7位
015F:0042A153 JNZ 0042A171 <--不相等，就跳
015F:0042A155 MOVSX EDX,BYTE [EBX+07]
015F:0042A159 CMP EDX,BYTE +31 <--比较注册码第8位
015F:0042A15C JNZ 0042A171 <--不相等，就跳
015F:0042A15E MOV DWORD [0048A408],69FC4314
015F:0042A168 CALL 00404924
015F:0042A16D MOV AL,01
015F:0042A16F JMP SHORT 0042A18C
015F:0042A171 PUSH EBX
015F:0042A172 CALL 0042CA48
015F:0042A177 POP ECX
015F:0042A178 TEST AL,AL
015F:0042A17A JZ 0042A180
015F:0042A17C MOV AL,01
015F:0042A17E JMP SHORT 0042A18C
015F:0042A180 MOV DWORD [0048A408],9603BCEB
015F:0042A18A XOR EAX,EAX
015F:0042A18C POP EBX
015F:0042A18D MOV ESP,EBP
015F:0042A18F POP EBP
015F:0042A190 RET
.......................

我们把比较的数字抄下了分别是
1 2 3 4 5 6 7 8
4A 53 24 32 38 39 32 21

查ASCII字符表，十六进制。

十六进制： 4A 53 24 32 38 39 32 21
分别对应： J S $ 2 8 9 2 1

整理一下，输入注册信息

Registration code:JS$28921

成功了。

注册信息在注册表中的
[HKEY_CURRENT_USER\Software\XA Tech\JpegOpt]
"Code"="JS$28921"


KeyGhost V3.2

 标 题:KeyGhost V3.2 破解实录 (11千字)
发信人:liangs
时 间:2000-8-17 23:20:25
详细信息:
KeyGhost V3.2 破解实录

作者:liangs
E-mail:liang_s@263.net

软件名称：KeyGhost V3.2
下载地址：http://sunhy.126.com

使用的工具
W32Dasm V8.93 超级中文版
Trw2000 ver1.22

首先连按两次ALT+F12呼出KeyGhost,在注册框中输入：liangs-787878,为什么是'liangs-787878'
而不是'liangs787878',下面你就知道了。然后下bpx hmemcpy，中断后，首先bd *,去掉所有中断，
再按18次F12。

* Possible StringData Ref from Code Obj ->"请合法使用软件"
|
:00475580 B888564700 mov eax, 00475688
:00475585 E842ADFDFF call 004502CC
:0047558A 837DFC00 cmp dword ptr [ebp-04], 00000000 <---我们停在这；
:0047558E 0F8499000000 je 0047562D
:00475594 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]
:0047559A 8B55FC mov edx, dword ptr [ebp-04] <---此处edx=liangs-787878;
:0047559D B9FF000000 mov ecx, 000000FF
:004755A2 E881E8F8FF call 00403E28
:004755A7 8D85FCFEFFFF lea eax, dword ptr [ebp+FFFFFEFC]

:004755AD E8CAC2FFFF call 0047187C <---判断输入的注册码的合法性,此处按F8跟入;
:004755B2 84C0 test al, al
:004755B4 7477 je 0047562D <---注册码错误就跳走;

:004755B6 B201 mov dl, 01
:004755B8 8B8340030000 mov eax, dword ptr [ebx+00000340]
:004755BE E8F570FBFF call 0042C6B8
:004755C3 33D2 xor edx, edx
:004755C5 8B8318030000 mov eax, dword ptr [ebx+00000318]
:004755CB E8E870FBFF call 0042C6B8
:004755D0 B201 mov dl, 01
:004755D2 8B8340040000 mov eax, dword ptr [ebx+00000440]
:004755D8 8B08 mov ecx, dword ptr [eax]
:004755DA FF515C call [ecx+5C]
:004755DD C605D1BA470001 mov byte ptr [0047BAD1], 01

* Possible StringData Ref from Code Obj ->"Code"
|
:004755E4 68A0564700 push 004756A0
:004755E9 8D95E8FEFFFF lea edx, dword ptr [ebp+FFFFFEE8]
:004755EF 8B45FC mov eax, dword ptr [ebp-04]
:004755F2 E84595FEFF call 0045EB3C
:004755F7 8B95E8FEFFFF mov edx, dword ptr [ebp+FFFFFEE8]
:004755FD 8D85ECFEFFFF lea eax, dword ptr [ebp+FFFFFEEC]
:00475603 E8A4F9F8FF call 00404FAC
:00475608 8D85ECFEFFFF lea eax, dword ptr [ebp+FFFFFEEC]
:0047560E 50 push eax

* Possible StringData Ref from Code Obj ->"Software\Sun\Keyghost3xx"
|
:0047560F B9B0564700 mov ecx, 004756B0
:00475614 B202 mov dl, 02
:00475616 8B8310030000 mov eax, dword ptr [ebx+00000310]
:0047561C E85F21FEFF call 00457780

* Possible StringData Ref from Code Obj ->"注册成功！谢谢您的支持！"
|
:00475621 B8D4564700 mov eax, 004756D4 <---注册码正确跳到此处;
:00475626 E885A9FDFF call 0044FFB0
:0047562B EB0A jmp 00475637

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047558E(C), :004755B4(C)
|

* Possible StringData Ref from Code Obj ->"请购买本软件！见右侧注册说明！"
|
:0047562D B8F8564700 mov eax, 004756F8 <---注册码错误跳到此处;
:00475632 E879A9FDFF call 0044FFB0

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

跟入 call 0047187C 中：此Call用来判断输入的注册码的合法性

* Referenced by a CALL at Addresses:
|:004755AD , :00475979
|
:0047187C 55 push ebp
:0047187D 8BEC mov ebp, esp
:0047187F 81C4ECFCFFFF add esp, FFFFFCEC
:00471885 53 push ebx
:00471886 56 push esi
:00471887 57 push edi
:00471888 33D2 xor edx, edx
:0047188A 8995F0FCFFFF mov dword ptr [ebp+FFFFFCF0], edx
:00471890 8995ECFCFFFF mov dword ptr [ebp+FFFFFCEC], edx
:00471896 8995F8FCFFFF mov dword ptr [ebp+FFFFFCF8], edx
:0047189C 8995F4FCFFFF mov dword ptr [ebp+FFFFFCF4], edx
:004718A2 8BF0 mov esi, eax
:004718A4 8DBDFFFEFFFF lea edi, dword ptr [ebp+FFFFFEFF]
:004718AA 33C9 xor ecx, ecx
:004718AC 8A0E mov cl, byte ptr [esi]
:004718AE 41 inc ecx
:004718AF F3 repz
:004718B0 A4 movsb
:004718B1 33C0 xor eax, eax
:004718B3 55 push ebp
:004718B4 68DE194700 push 004719DE
:004718B9 64FF30 push dword ptr fs:[eax]
:004718BC 648920 mov dword ptr fs:[eax], esp
:004718BF C645FF00 mov [ebp-01], 00
:004718C3 8D85F4FCFFFF lea eax, dword ptr [ebp+FFFFFCF4]
:004718C9 8D95FFFEFFFF lea edx, dword ptr [ebp+FFFFFEFF]
:004718CF E81C25F9FF call 00403DF0
:004718D4 8B85F4FCFFFF mov eax, dword ptr [ebp+FFFFFCF4]
:004718DA 8D95F8FCFFFF lea edx, dword ptr [ebp+FFFFFCF8]
:004718E0 E82374F9FF call 00408D08
:004718E5 8B95F8FCFFFF mov edx, dword ptr [ebp+FFFFFCF8]
:004718EB 8D85FFFEFFFF lea eax, dword ptr [ebp+FFFFFEFF]
:004718F1 B9FF000000 mov ecx, 000000FF
:004718F6 E82D25F9FF call 00403E28
:004718FB 33DB xor ebx, ebx
:004718FD C685FFFDFFFF00 mov byte ptr [ebp+FFFFFDFF], 00
:00471904 C685FFFCFFFF00 mov byte ptr [ebp+FFFFFCFF], 00
:0047190B 8D95FFFEFFFF lea edx, dword ptr [ebp+FFFFFEFF]
:00471911 B8F0194700 mov eax, 004719F0

:00471916 E80511F9FF call 00402A20 <---判断输入的注册号是否是xxxx-yyyy的形式；
按F8跟入可知。
:0047191B 8BF0 mov esi, eax
:0047191D 85F6 test esi, esi
:0047191F 0F8E9B000000 jle 004719C0 <---注册号若不是xxxx-yyyy的形式则跳
这里千万不能跳，不然就OVER了。:-)

:00471925 8D85FFFDFFFF lea eax, dword ptr [ebp+FFFFFDFF]
:0047192B 50 push eax
:0047192C 8BCE mov ecx, esi
:0047192E 49 dec ecx
:0047192F BA01000000 mov edx, 00000001
:00471934 8D85FFFEFFFF lea eax, dword ptr [ebp+FFFFFEFF]
:0047193A E8250FF9FF call 00402864
:0047193F 8D85FFFCFFFF lea eax, dword ptr [ebp+FFFFFCFF]
:00471945 50 push eax
:00471946 33C9 xor ecx, ecx
:00471948 8A8DFFFEFFFF mov cl, byte ptr [ebp+FFFFFEFF]
:0047194E 2BCE sub ecx, esi
:00471950 8D5601 lea edx, dword ptr [esi+01]
:00471953 8D85FFFEFFFF lea eax, dword ptr [ebp+FFFFFEFF]
:00471959 E8060FF9FF call 00402864
:0047195E 33D2 xor edx, edx
:00471960 8A95FFFDFFFF mov dl, byte ptr [ebp+FFFFFDFF]
:00471966 85D2 test edx, edx
:00471968 7E16 jle 00471980
:0047196A 8D8500FEFFFF lea eax, dword ptr [ebp+FFFFFE00]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047197E(C)
|
:00471970 33C9 xor ecx, ecx
:00471972 8A08 mov cl, byte ptr [eax]
:00471974 03D9 add ebx, ecx
:00471976 81C3A41D0F00 add ebx, 000F1DA4
:0047197C 40 inc eax
:0047197D 4A dec edx
:0047197E 75F0 jne 00471970

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00471968(C)
|
:00471980 8D85F0FCFFFF lea eax, dword ptr [ebp+FFFFFCF0]
:00471986 8D95FFFCFFFF lea edx, dword ptr [ebp+FFFFFCFF]
:0047198C E85F24F9FF call 00403DF0
:00471991 8B85F0FCFFFF mov eax, dword ptr [ebp+FFFFFCF0]
:00471997 50 push eax
:00471998 8D95ECFCFFFF lea edx, dword ptr [ebp+FFFFFCEC]
:0047199E 8BC3 mov eax, ebx

:004719A0 E8E374F9FF call 00408E88 <---用xxxx算出正确的注册码;
执行完上面这条语句后,EDX中就是
正确的注册码,我的是：5944406

:004719A5 8B95ECFCFFFF mov edx, dword ptr [ebp+FFFFFCEC]
:004719AB 58 pop eax

:004719AC E8AB25F9FF call 00403F5C <---判断yyyy与上面用xxxx算出的
注册码是否相等； :004719B1 750D jne 004719C0 <---不等就跳走;

:004719B3 80BD00FFFFFF61 cmp byte ptr [ebp+FFFFFF00], 61
:004719BA 7204 jb 004719C0
:004719BC C645FF01 mov [ebp-01], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047191F(C), :004719B1(C), :004719BA(C)
|
:004719C0 33C0 xor eax, eax <---可爱的EAX标志被置0，就OVER了
:004719C2 5A pop edx
:004719C3 59 pop ecx
:004719C4 59 pop ecx
:004719C5 648910 mov dword ptr fs:[eax], edx
:004719C8 68E5194700 push 004719E5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004719E3(U)
|
:004719CD 8D85ECFCFFFF lea eax, dword ptr [ebp+FFFFFCEC]
:004719D3 BA04000000 mov edx, 00000004
:004719D8 E81322F9FF call 00403BF0
:004719DD C3 ret

--------------------------------------------------------------------------------
由 call 00402A20 跟入：此Call判断注册码是否为xxxx-yyyy的形式.

:00402A20 53 push ebx
:00402A21 56 push esi
:00402A22 57 push edi
:00402A23 89C6 mov esi, eax
:00402A25 89D7 mov edi, edx
:00402A27 31C9 xor ecx, ecx
:00402A29 8A0F mov cl, byte ptr [edi]
:00402A2B 47 inc edi
:00402A2C 57 push edi
:00402A2D 31D2 xor edx, edx
:00402A2F 8A16 mov dl, byte ptr [esi]
:00402A31 46 inc esi
:00402A32 4A dec edx
:00402A33 781B js 00402A50
:00402A35 8A06 mov al, byte ptr [esi] <---将AL赋值'2D',也就是符号'-';
:00402A37 46 inc esi
:00402A38 29D1 sub ecx, edx
:00402A3A 7E14 jle 00402A50

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402A4E(U)
|
:00402A3C F2 repnz
:00402A3D AE scasb <---循环依次取输入的注册码与AL中的'-'比较
:00402A3E 7510 jne 00402A50 <---注册码中没有'-'符就跳走；

:00402A40 89CB mov ebx, ecx
:00402A42 56 push esi
:00402A43 57 push edi
:00402A44 89D1 mov ecx, edx
:00402A46 F3 repz
:00402A47 A6 cmpsb
:00402A48 5F pop edi
:00402A49 5E pop esi
:00402A4A 7409 je 00402A55
:00402A4C 89D9 mov ecx, ebx
:00402A4E EBEC jmp 00402A3C

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402A33(C), :00402A3A(C), :00402A3E(C)
|
:00402A50 5A pop edx
:00402A51 31C0 xor eax, eax
:00402A53 EB05 jmp 00402A5A

整理一下我的注册码为：liangs-5944406


LeapFTP 2.62

 标 题:初学者(22) (7千字)
发信人:liutong
时 间:2000-8-9 1:10:51
详细信息:
LeapFTP
软件版本：2.62 软件大小：794 KB 运行平台：
软件简介： 如果提起LeapFTP，我想不少的网迷都有点陌生，的确LeapFTP是
一个比较新的软件，但是它却在许多方面超过了它的前辈们，在国内不少的
站点的九九年共享软件评比中LeapFTP被评为最佳FTP软件，LeapFTP除具有其他
FTP软件的大多数特性，比如队列功能、远程文件编辑、支持防火墙/代理服务器，
高级脚本语言、剪贴板监视，LeapFTP还具有以下特点：定制命令、目录列表缓存
、批量文件属性更改（CHMOD）、从Windows资源管理器拖放文件到服务器、移动
远程文件、保存/打印远程文件目录、反空闲（Anti-Idle）以防服务器断开连接
等功能。另外，它还可以按照分类快速登录到需要的服务器上，这个软件在上传
功能方面非常强劲，是维护主页的最佳利器。我在对它进行试用了几次后渐渐地
被LeapFTP所吸引，但是我也发觉它有一个致命的弱点：它不具有自动重拨、服务
器之间传输等功能的话，按照现在国内的网络条件，它是很不适宜的......

软件来源:软件 2000-08
输入 用户名: LiuTong
注册码: ABC1-EF2H-I3KL-4NOP
(注册码要求:在第5,10,15位为"-";在4的倍数位为数字;其他位为大写字母)

设断点bpx hmemcpy
中断后按F12键12次,很容易找到注册码的地址****:********
设断点BPM ****:********,中断后按F10便可找到下面的程序:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048824A(C)
|
:004881C4 8BC3 mov eax, ebx
:004881C6 2503000080 and eax, 80000003
:004881CB 7905 jns 004881D2
:004881CD 48 dec eax
:004881CE 83C8FC or eax, FFFFFFFC
:004881D1 40 inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004881CB(C)
|
:004881D2 85C0 test eax, eax
:004881D4 7516 jne 004881EC
:004881D6 8B45FC mov eax, dword ptr [ebp-04]
:004881D9 8A4418FF mov al, byte ptr [eax+ebx-01]
:004881DD E84EFFFFFF call 00488130 <----判断是否是数字,若是AL=1
:004881E2 84C0 test al, al
:004881E4 0F84C5000000 je 004882AF
:004881EA EB22 jmp 0048820E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004881D4(C)
|
:004881EC 8BC3 mov eax, ebx
:004881EE B905000000 mov ecx, 00000005
:004881F3 99 cdq
:004881F4 F7F9 idiv ecx
:004881F6 85D2 test edx, edx
:004881F8 7414 je 0048820E
:004881FA 8B45FC mov eax, dword ptr [ebp-04]
:004881FD 8A4418FF mov al, byte ptr [eax+ebx-01]
:00488201 E83EFFFFFF call 00488144<----判断是否是字母,若是AL=1
:00488206 84C0 test al, al
:00488208 0F84A1000000 je 004882AF

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004881EA(U), :004881F8(C)
|
:0048820E 8B45FC mov eax, dword ptr [ebp-04]
:00488211 8A4418FF mov al, byte ptr [eax+ebx-01]
:00488215 3C2D cmp al, 2D
:00488217 742D je 00488246
:00488219 83FB05 cmp ebx, 00000005
:0048821C 7D0C jge 0048822A
:0048821E 8B55FC mov edx, dword ptr [ebp-04]
:00488221 25FF000000 and eax, 000000FF
:00488226 03F0 add esi, eax<----输入码第一组的ASCII码和存在ESI
:00488228 EB1C jmp 00488246

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048821C(C)
|
:0048822A 83FB0A cmp ebx, 0000000A
:0048822D 7D0C jge 0048823B
:0048822F 8B55FC mov edx, dword ptr [ebp-04]
:00488232 25FF000000 and eax, 000000FF
:00488237 03F8 add edi, eax<----输入码第二组的ASCII码和存在EDI
:00488239 EB0B jmp 00488246

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048822D(C)
|
:0048823B 8B55FC mov edx, dword ptr [ebp-04]
:0048823E 25FF000000 and eax, 000000FF
:00488243 0145F4 add dword ptr [ebp-0C], eax<----输入码第三组的ASCII码和存在[EBP-0C]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00488217(C), :00488228(U), :00488239(U)
|
:00488246 43 inc ebx
:00488247 83FB0F cmp ebx, 0000000F
:0048824A 0F8574FFFFFF jne 004881C4
:00488250 8D0C37 lea ecx, dword ptr [edi+esi]<----输入码前两组相加存在ECX
:00488253 034DF4 add ecx, dword ptr [ebp-0C]<-----加上第3组ASCII
:00488256 8BC6 mov eax, esi<----输入码第一组的ASCII码的和
:00488258 BB1A000000 mov ebx, 0000001A
:0048825D 99 cdq
:0048825E F7FB idiv ebx
:00488260 83C241 add edx, 00000041
:00488263 8B45FC mov eax, dword ptr [ebp-04]
:00488266 3A500F cmp dl, byte ptr [eax+0F]<----与输入码的第16位比较
:00488269 7544 jne 004882AF
:0048826B 8BC7 mov eax, edi<----输入码第二组的ASCII码的和
:0048826D BB1A000000 mov ebx, 0000001A
:00488272 99 cdq
:00488273 F7FB idiv ebx
:00488275 83C241 add edx, 00000041
:00488278 8B45FC mov eax, dword ptr [ebp-04]
:0048827B 3A5010 cmp dl, byte ptr [eax+10]<----与输入码的第17位比较
:0048827E 752F jne 004882AF
:00488280 8B45F4 mov eax, dword ptr [ebp-0C]<----输入码第三组的ASCII码的和
:00488283 BB1A000000 mov ebx, 0000001A
:00488288 99 cdq
:00488289 F7FB idiv ebx
:0048828B 83C241 add edx, 00000041
:0048828E 8B45FC mov eax, dword ptr [ebp-04]
:00488291 3A5011 cmp dl, byte ptr [eax+11]<----与输入码的第18位比较
:00488294 7519 jne 004882AF
:00488296 8BC1 mov eax, ecx<----输入码前三组的ASCII码的和
:00488298 B91A000000 mov ecx, 0000001A
:0048829D 99 cdq
:0048829E F7F9 idiv ecx
:004882A0 83C241 add edx, 00000041
:004882A3 8B45FC mov eax, dword ptr [ebp-04]
:004882A6 3A5012 cmp dl, byte ptr [eax+12]<----与输入码的第19位比较
:004882A9 7504 jne 004882AF
:004882AB C645FB01 mov [ebp-05], 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00488189(C), :00488196(C), :004881A3(C), :004881B0(C), :004881E4(C)
|:00488208(C), :00488269(C), :0048827E(C), :00488294(C), :004882A9(C)
|
:004882AF 33C0 xor eax, eax
:004882B1 5A pop edx
:004882B2 59 pop ecx
:004882B3 59 pop ecx
:004882B4 648910 mov dword ptr fs:[eax], edx
:004882B7 68CC824800 push 004882CC

上例
A B C 1 - E F 2 H - I 3 K L - ****
41 42 43 31 2D 45 46 32 48 2D 49 33 4B 4C 2D
第一组ASCII的和:F7
第二组ASCII的和:105
第三组ASCII的和:113
前三组ASCII的和:30F
F7/1A余数D D+41=4E("N")
105/1A余数1 1+41=42("B")
113/1A余数F F+41=50("P")
30F/1A余数3 3+41=44("D")

整理
用户名: LiuTong
注册码: ABC1-EF2H-I3KL-NBPD


LockDown 2000 3.0

标 题:Tutor8?How to crack LockDown 2000 3.0 Build 3.0.1.28
发信人:dREAMtHEATER E-mail:dreamtheater@263.net
时 间:3rd, Aug 1999
详细信息:

软件背景资料

运行平台: Win9X/NT
文件名称: Lockdown2000.exe
程序类型: 杀毒工具
下载地点: http://lockdown2000.com\download.html
文件大小: 2,046KB

使用的工具

SoftIce V3.25--Win9X Debugger
W32Dasm V8.93--Win9X Dissembler
Hex WorkShop v2.54--Hex Editor
RegSnap V2.51--Registry Tracer

难易程度

Easy(X) Medium( ) Hard( ) Pro( )

----------=======声明========----------

未经作者同意，不得修改、引用原文，一切权利保留。
本教程只供教学用，其他一切用途皆被禁止。

----------=======软件介绍========----------

简单地说，它是一个查杀网上流行黑客程序的共享软件（还是先防防我的cracking吧,^O^)他
的查杀速度我可不敢恭维，另外启动极慢，反正我是不会用的。

----------=======软件的保护机制========-------

第一次运行时间记录在windows目录\AJBALSE.INI中
注册时，不需要name,程序自动产生一个Product Serial,我的是：6WD-Q2D3-6F67-2,为了证
实这个码是不是随机产生的，我曾将该软件反安装，为了保险，并将安装时在windows目录里生成的
文件、注册表键值均统统删掉，然后再次安装，看看Product Serial变没变，结果还是
6WD-Q2D3-6F67-2，但我估计他的产生有可能根据windows安装时你输入的个人信息。如果你感兴趣
，在你的机器上安装此软件，看看是否与我的Product Serial一样。
注册后，注册信息保存在注册表的
HKEY_LOCAL_MACHINE\Software\Harbor Telco\LockDown 2000 v3.0\3.0.1.1\Register

----------========正文========----------

Part1 Snippet out code

在注册窗口中，输入任意的code,我输入:12121212
在SoftIce中设断点bpx hmemcpy do "p ret;",Ctrl-D,回到注册窗口，press "OK" button,
重新回到SoftIce中,"bc *",取消所有断点，Press F12数次，程序停在：

:004C5132 E8CDDCF6FF call 00432E04
:004C5137 8B55F8 mov edx, dword ptr [ebp-08] <==回到这里，edx指向我
们输入的code的首地址
:004C513A 58 pop eax
:004C513B E8FCEEF3FF call 0040403C <==计算注册码
:004C5140 7504 jne 004C5146 <==注册不成功，jump to 004c5146
:004C5142 B301 mov bl, 01 <==注册成功，bl=1
:004C5144 EB02 jmp 004C5148

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C5140(C)
|
:004C5146 33DB xor ebx, ebx <==ebx=0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C5144(U)
|
:004C5148 84DB test bl, bl
:004C514A 7523 jne 004C516F <==注册成功，则bl=1，jump to 004C516F
:004C514C 6A00 push 00000000
:004C514E 668B0D7C524C00 mov cx, word ptr [004C527C]
:004C5155 33D2 xor edx, edx

* Possible StringData Ref from Code Obj ->"The unlock code you have entered "
->"is invalid for this machine, please "
->"re-type the number or contact "
->"Harbor Telco to receive a new "
->"registration number."
|
:004C5157 B888524C00 mov eax, 004C5288
:004C515C E80F14F9FF call 00456570
:004C5161 8B86CC020000 mov eax, dword ptr [esi+000002CC]
:004C5167 8B10 mov edx, dword ptr [eax]
:004C5169 FF92B4000000 call dword ptr [edx+000000B4]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C514A(C)
|
:004C516F 84DB test bl, bl <==再一次检查bl是否为1
:004C5171 0F84D9000000 je 004C5250 〈==不等于0，显示注册成功
:004C5177 8D55F8 lea edx, dword ptr [ebp-08]
:004C517A 8B86CC020000 mov eax, dword ptr [esi+000002CC]
:004C5180 E87FDCF6FF call 00432E04
:004C5185 8B45F8 mov eax, dword ptr [ebp-08]
:004C5188 E8F7E5FDFF call 004A3784
:004C518D 6A00 push 00000000
:004C518F 668B0D7C524C00 mov cx, word ptr [004C527C]
:004C5196 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thank you for registering LockDown "
->"2000!"
|
:004C5198 B828534C00 mov eax, 004C5328
:004C519D E8CE13F9FF call 00456570
:004C51A2 A120EC4C00 mov eax, dword ptr [004CEC20]
:004C51A7 8B00 mov eax, dword ptr [eax]
:004C51A9 80784700 cmp byte ptr [eax+47], 00
:004C51AD 750E jne 004C51BD
:004C51AF A120EC4C00 mov eax, dword ptr [004CEC20]

为了找到注册码, 让我们trace into call 0040403C

:0040403C 53 push ebx
:0040403D 56 push esi
:0040403E 57 push edi
:0040403F 89C6 mov esi, eax <==令esi指向real code的首地址
:00404041 89D7 mov edi, edx <==令edi指向fake code的首地址
:00404043 39D0 cmp eax, edx
:00404045 0F848F000000 je 004040DA
:0040404B 85F6 test esi, esi
:0040404D 7468 je 004040B7
:0040404F 85FF test edi, edi
:00404051 746B je 004040BE
:00404053 8B46FC mov eax, dword ptr [esi-04]
:00404056 8B57FC mov edx, dword ptr [edi-04]
:00404059 29D0 sub eax, edx
:0040405B 7702 ja 0040405F
:0040405D 01C2 add edx, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040405B(C)
|
:0040405F 52 push edx
:00404060 C1EA02 shr edx, 02
:00404063 7426 je 0040408B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404081(C)
|
:00404065 8B0E mov ecx, dword ptr [esi] 〈==real code前四位字符的
ASCII码值赋给ecx
:00404067 8B1F mov ebx, dword ptr [edi] <==fake code前四位字符的
ASCII码值赋给ecx
:00404069 39D9 cmp ecx, ebx <==比较real与fake的前四位字符
:0040406B 7558 jne 004040C5
:0040406D 4A dec edx
:0040406E 7415 je 00404085 <==jump to 00404085
:00404070 8B4E04 mov ecx, dword ptr [esi+04]
:00404073 8B5F04 mov ebx, dword ptr [edi+04]
:00404076 39D9 cmp ecx, ebx
:00404078 754B jne 004040C5
:0040407A 83C608 add esi, 00000008
:0040407D 83C708 add edi, 00000008
:00404080 4A dec edx
:00404081 75E2 jne 00404065
:00404083 EB06 jmp 0040408B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040406E(C)
|
:00404085 83C604 add esi, 00000004 <==esi=esi+4
:00404088 83C704 add edi, 00000004 <==edi=edi+4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404063(C), :00404083(U)
|
:0040408B 5A pop edx
:0040408C 83E203 and edx, 00000003
:0040408F 7422 je 004040B3
:00404091 8B0E mov ecx, dword ptr [esi] <==从real code第五位取四位
字符的ASCII码赋给ecx
:00404093 8B1F mov ebx, dword ptr [edi] 〈==从fake code第五位取四位
字符的ASCII码赋给ecx
:00404095 38D9 cmp cl, bl <==比较fake与real的第五位字符的ASCII
码值
:00404097 7541 jne 004040DA
:00404099 4A dec edx
:0040409A 7417 je 004040B3
:0040409C 38FD cmp ch, bh 〈==比较fake与real的第六位字符的ASCII
码值
:0040409E 753A jne 004040DA
:004040A0 4A dec edx
:004040A1 7410 je 004040B3 〈==jump to 004040B3
:004040A3 81E30000FF00 and ebx, 00FF0000
:004040A9 81E10000FF00 and ecx, 00FF0000
:004040AF 39D9 cmp ecx, ebx
:004040B1 7527 jne 004040DA

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040408F(C), :0040409A(C), :004040A1(C)
|
:004040B3 01C0 add eax, eax
:004040B5 EB23 jmp 004040DA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040404D(C)
|
:004040B7 8B57FC mov edx, dword ptr [edi-04]
:004040BA 29D0 sub eax, edx
:004040BC EB1C jmp 004040DA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404051(C)
|
:004040BE 8B46FC mov eax, dword ptr [esi-04]
:004040C1 29D0 sub eax, edx
:004040C3 EB15 jmp 004040DA

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040406B(C), :00404078(C)
|
:004040C5 5A pop edx
:004040C6 38D9 cmp cl, bl
:004040C8 7510 jne 004040DA
:004040CA 38FD cmp ch, bh
:004040CC 750C jne 004040DA
:004040CE C1E910 shr ecx, 10
:004040D1 C1EB10 shr ebx, 10
:004040D4 38D9 cmp cl, bl
:004040D6 7502 jne 004040DA
:004040D8 38FD cmp ch, bh

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00404045(C), :00404097(C), :0040409E(C), :004040B1(C), :004040B5(U)
|:004040BC(U), :004040C3(U), :004040C8(C), :004040CC(C), :004040D6(C)
|
:004040DA 5F pop edi
:004040DB 5E pop esi
:004040DC 5B pop ebx
:004040DD C3 ret

有注释的部分为填入的code正确时程序的执行过程，其实在0040403F处,我们在SoftIce中下
命令“d eax”，即可在数据窗口看到real code,做注释的目的使你更清楚程序是如何检验你输入的
code的正确性。
我的code:7ERE55

Part2 快速破解法

线索
当我从该软件公司的主页下载此程序时，对方告之试用版只能查黑客程序而不能杀掉。

在W32Dasm中，反汇编LockDown2000.exe，用鼠标点击工具栏中的“String Data References
”,调出程序参考的字符串，你会看到程序参考的字符串量非常大，你需要有耐心，一点点找，当你
发现下面的这部分：

"tcp is the only protocol supported "
"tcp"
"test.txt"
"text/html"
"TextHeight"
"Thank you for registering LockDown "
"The trial period on this demo "
"The unlock code you have entered "
"time to live expired"
"To enable LockDown 2000 trojan " 〈==这一行
"Too many levels of remote in path"
"Too many levels of symbolic links"
"Too many open files"
"Too many processes"
"Too many references: can't splice"
"Too many users"
"too much data availaible"

用鼠标双击这一行，主窗口将显示与此字符串相关的程序代码部分；

:004C5617 E83CE2FDFF call 004A3858
:004C561C 84C0 test al, al
:004C561E 751A jne 004C563A <==

* Possible StringData Ref from Code Obj ->"To enable LockDown 2000 trojan "
->"removal and repair features, you "
->"must first purchase a license "
->"for this computer."
|
:004C5620 B858564C00 mov eax, 004C5658
:004C5625 E83E10F9FF call 00456668
:004C562A A11CEB4C00 mov eax, dword ptr [004CEB1C]
:004C562F 8B00 mov eax, dword ptr [eax]

从004C5617至004C561E ，又是经典的call/test/conditional jump,让我们进入那个call看
看，用鼠标单击 004C5617这一行，这使窗口高亮显示这一行代码，再用鼠标点击工具栏中的“
Execute Call”，窗口将显示下面这部分代码：

* Referenced by a CALL at Addresses:
|:004A457F , :004A46A6 , :004A4B70 , :004A507F , :004B78F5
|:004BD0A1 , :004BE69C , :004C3F12 , :004C5617 , :004C5773
|
:004A3858 55 push ebp
:004A3859 8BEC mov ebp, esp
:004A385B 6A00 push 00000000
:004A385D 6A00 push 00000000
:004A385F 53 push ebx
:004A3860 33C0 xor eax, eax
:004A3862 55 push ebp
:004A3863 68E9384A00 push 004A38E9
:004A3868 64FF30 push dword ptr fs:[eax]
:004A386B 648920 mov dword ptr fs:[eax], esp
:004A386E B201 mov dl, 01
:004A3870 A15C974700 mov eax, dword ptr [0047975C]
:004A3875 E82260FDFF call 0047989C
:004A387A 8BD8 mov ebx, eax
:004A387C BA02000080 mov edx, 80000002
:004A3881 8BC3 mov eax, ebx
:004A3883 E8AC60FDFF call 00479934
:004A3888 B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"Software\Harbor Telco\LockDown "
->"2000 v3.0\3.0.1.1"
|
:004A388A BA00394A00 mov edx, 004A3900
:004A388F 8BC3 mov eax, ebx
:004A3891 E80261FDFF call 00479998
:004A3896 8D4DFC lea ecx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"Register"
|
:004A3899 BA3C394A00 mov edx, 004A393C
:004A389E 8BC3 mov eax, ebx
:004A38A0 E8EB64FDFF call 00479D90
:004A38A5 8BC3 mov eax, ebx
:004A38A7 E85860FDFF call 00479904
:004A38AC 8BC3 mov eax, ebx
:004A38AE E869F7F5FF call 0040301C
:004A38B3 8D45F8 lea eax, dword ptr [ebp-08]
:004A38B6 E89DFBFFFF call 004A3458
:004A38BB 8B55F8 mov edx, dword ptr [ebp-08]
:004A38BE 8B45FC mov eax, dword ptr [ebp-04]
:004A38C1 E87607F6FF call 0040403C
:004A38C6 7504 jne 004A38CC
:004A38C8 B301 mov bl, 01
:004A38CA EB02 jmp 004A38CE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A38C6(C)
|
:004A38CC 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A38CA(U)
|
:004A38CE 33C0 xor eax, eax
:004A38D0 5A pop edx
:004A38D1 59 pop ecx
:004A38D2 59 pop ecx
:004A38D3 648910 mov dword ptr fs:[eax], edx
:004A38D6 68F0384A00 push 004A38F0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A38EE(U)
|
:004A38DB 8D45F8 lea eax, dword ptr [ebp-08]
:004A38DE BA02000000 mov edx, 00000002
:004A38E3 E8EC03F6FF call 00403CD4
:004A38E8 C3 ret

看到了吗？这部分代码从注册表的
HKEY_LOCAL_MACHINE\Software\Harbor Telco\LockDown 2000 v3.0\3.0.1.1\Register
获取注册信息，若存在，检验正确性，一切OK,让返回值al=1。另外，你还会看到，此段代码被10个
call参考，那就说明程序从10个不同方面检查你是否注册。
我没有再仔细分析这段代码，为了让所有参考此部分代码的call都认为程序已注册，最简单的
方法：在004A3858处，按顺序修改代码为 (1)mov al, 01 (2)ret
修改后，重新执行程序，bingo!程序百分之百注册！

----------=======The Patch========----------

在文件LockDown2000.exe的offset:0xA2C58处，修改558BEC为B001C3。


Macro Magic4.1

 标 题:Macro Magic4.1N解密方法 (780字)
发信人:xiA Qin
时 间:2000-7-8 13:26:18
详细信息:
软件名称：Macro Magic4.1N
注册方式：注册码

首先请出我们的工具Trw2000

下指令bpx hmemcpy

下指令bd *

下指令pmodule

来到这里
015F:0045D577 8B45D8 MOV EAX,[EBP-28] 这里放你的输入的注册码
015F:0045D57A 50 PUSH EAX
015F:0045D57B FF75F8 PUSH DWORD [EBP-08]
015F:0045D57E FF75F4 PUSH DWORD [EBP-0C]
015F:0045D581 8D45E4 LEA EAX,[EBP-1C]
015F:0045D584 E807050000 CALL 0045DA90
015F:0045D589 8B55E4 MOV EDX,[EBP-1C]
015F:0045D58C 58 POP EAX 这里放正确的注册码
015F:0045D58D E81E68FAFF CALL 00403DB0
015F:0045D592 0F8551010000 JNZ NEAR 0045D6E9

不到两分钟，就破了。是不是很简单。


Mail Scan

 标 题:破解“Mail Scan” (1千字)
发信人:(cflanker)
时 间:2000-8-4 11:08:10
详细信息:
破解“Mail Scan”

作者：(cflanker)
工具：Trw2000 v1.22(Reged Ver)
日期：2000年8月1日
软件简介：这个软件可以从文本文件中过滤出电子邮件地址。这里所指的文本文件不仅仅指
*.txt文件，还包括*.htm文件、*.html文件、*.csv、*.eml、*.mbx等文本格式的文件。她
可以在这些文件中搜寻可能包含邮件地址的文本行，然后对这些内容进行处理，过滤掉重复
的和非法的地址。然后按照服务器地址自动排序，你存盘后就得到了一个E-Mail地址表。然
后，你就可以轻松使用这些地址来进行你的宣传活动了。

Let's go
运行Mail Scan。他会显示未注册窗口，不管他。go on
他是一机一码 所以
1:填写注册码: 22222222
2:ctrl+M
3:bpx hmemcpy
4:g
5:点击 注册
6:被trw2000 拦截
7:按 f12<------好像是61次 faint
8:然后按f 10 一直到
call 00483730
9:按 f8进去
10:按f 10 一直到
call 00403fd8
11:按 f8进去
12:按f 10 一直到
cmp eax,edx
13:d eax; bingo 你已经看到你想要的东西了
end
总结一下：有人可能问 为什么要按61 次 ？ A:ok 问的好 你按到62 次 就知道问什么只按61了^_^
那为什么要在这两个call 按f8 呢? A: 你仔细看就发现这两个call 前后有明显的判断 跳转语句
所以这两个call 肯定有问题于是。。。。

好了，搞定，收工！


Mail Scan V3.5.1.2

 标 题:极大的难题，希望你能帮我这个忙 (359字)
发信人:dannyhuang
时 间:2000-6-29 18:47:21
详细信息:
我现在正在学CRACK软件，但是可能是刚刚初学的原因
遇上了难题，不知你能能否帮我解决。
我需要CRACK的软件是：Mail Scan
版本为：V3.5.1.2
文件大小：1400K
下载网址：http://www4.netease.com/~herald/zip/mailscan.zip

最后真诚的希望
能透过你能学到怎样CRACK软件。行的话请告诉我一声，无论你是否答
应也麻烦请你给我回一封信，THANK YOU。我的信箱： zhicool@21cn.com

标 题:搞定 (3千字)
发信人:dr0
时 间:2000-6-29 19:13:16
详细信息:

用bpx MessageBoxA设断点，输入注册码并按“确定”之后会中断，
按几下F12并向上看，看见如下的判断：

0167:00488A42 MOV ECX,[EBP-08]
0167:00488A45 MOV EDX,[EBP-04]
0167:00488A48 MOV EAX,[EBX+0000034C]
0167:00488A4E CALL 00483730 //检查注册码
0167:00488A53 TEST AL,AL
0167:00488A55 JZ 00488AB6
0167:00488A57 PUSH 00
0167:00488A59 CALL USER32!MessageBeep
0167:00488A5E MOV EDX,00488B00
0167:00488A63 MOV EAX,EBX
0167:00488A65 CALL 0042CD98
0167:00488A6A XOR EDX,EDX
0167:00488A6C MOV EAX,[EBX+00000310]
0167:00488A72 MOV ECX,[EAX]
0167:00488A74 CALL [ECX+5C]
0167:00488A77 MOV EAX,[EBX+0000034C]
0167:00488A7D CALL 0048339C
0167:00488A82 MOV DL,01
0167:00488A84 MOV EAX,[EBX+000002FC]
0167:00488A8A MOV ECX,[EAX]
0167:00488A8C CALL [ECX+5C]
0167:00488A8F MOV DL,01
0167:00488A91 MOV EAX,[EBX+00000300]
0167:00488A97 MOV ECX,[EAX]
0167:00488A99 CALL [ECX+5C]
0167:00488A9C PUSH 40
0167:00488A9E MOV ECX,00488B14
0167:00488AA3 MOV EDX,00488B20
0167:00488AA8 MOV EAX,[0048C088]
0167:00488AAD MOV EAX,[EAX]
0167:00488AAF CALL 0044AC98 //注册码正确
0167:00488AB4 JMP 00488ACE
0167:00488AB6 PUSH 40
0167:00488AB8 MOV ECX,00488B68
0167:00488ABD MOV EDX,00488B70
0167:00488AC2 MOV EAX,[0048C088]
0167:00488AC7 MOV EAX,[EAX]
0167:00488AC9 CALL 0044AC98 //注册码错误

跟进call 00483730，看见：

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 //比较注册码
0167:0048377C JNZ 004837D9

由于这个软件的注册码显然是用Win98的ProductID算出来的，故需要写
注册机。跟进call 00483820，把计算注册码的算法搞清楚。很简单，如下：

0167:00483864 MOV EAX,00000001
0167:00483869 MOV EDX,[EBP-08]
0167:0048386C MOV DL,[EAX+EDX-01] //从ProcductID中取一字符
0167:00483870 XOR EBX,EBX
0167:00483872 MOV BL,DL
0167:00483874 CMP EAX,04
0167:00483877 JNZ 00483881
0167:00483879 MOV ESI,EDX
0167:0048387B AND ESI,000000FF
0167:00483881 MOV EDX,EBX
0167:00483883 ADD EDX,EDX
0167:00483885 LEA EDX,[EDX*4+EDX]
0167:00483888 IMUL EDX,EAX
0167:0048388B IMUL EDX,ESI
0167:0048388E ADD [EBP-10],EDX
0167:00483891 INC EAX
0167:00483892 DEC ECX
0167:00483893 JNZ 00483869 //循环

0167:00483895 MOV EAX,[EBP-04]
0167:00483898 MOV ECX,[EAX+40]
0167:0048389B MOV EAX,[ECX+08]
0167:0048389E IMUL EBX
0167:004838A0 MOV EDX,[ECX+0C]
0167:004838A3 IMUL EDX,[EBP-10]
0167:004838A7 ADD EAX,EDX
0167:004838A9 MOV EDX,[ECX+04]
0167:004838AC IMUL EDX,ESI
0167:004838AF ADD EAX,EDX
0167:004838B1 CDQ
0167:004838B2 MOV [EBP-18],EAX //注册码
0167:004838B5 MOV [EBP-14],EDX
0167:004838B8 PUSH DWORD PTR [EBP-14]
0167:004838BB PUSH DWORD PTR [EBP-18]
0167:004838BE MOV EAX,[EBP-0C]
0167:004838C1 CALL 00409360 //将注册码由数值形式转为字符串


mIRC V5.71

 标 题:化“悲痛”为力量，【mIRC V5.71破解实战】希望对刚入门的朋友有些启发。 (9千字)
发信人:看雪
时 间:2000-8-19 22:49:49
详细信息:
写 作: 看雪
写作日期：2000年8月19日

目标程序：mIRC V5.71 32Bit
程序下载：http://ilike.myrice.com/soft_chat/mirc_2.html
使用工具：TRW2000，Turbo c++3.0 编译器
保护方式：注册码
难易程度：易，适合初学者练习写注册机。

最近申请了一个IRC聊天（202.96.137.64 频道：#Crack），当然选用mRIC这个最流行的 IRC 客户程序，这是一个十分优秀的共享软件，不注册有时间限制。刚好今天闲着没事，好久没为新手写东西了，故以这软件为例，谈谈如何写注册机。
拿到这个软件，首先运行一遍，看看功能是否有限制，然后再看看注册方式，还好，这是一个常用的注册保护方式，不注册还有NAG跳出，在Help处输入注册码，当然我们从输入注册码方式来下手了。
在破解序列号有多种方式，我们这次采用常用的方法，就是根据出错的对话框，反推找到注册码比较核心。

注册不成功时，会跳出一对话框。因此我们用bpx messagboxa设断来拦截这个对话框。

0167:004A33A8 PUSH DWORD 00531B23 -- -序列号进栈
0167:004A33AD PUSH DWORD 0053173C--- - ID进栈
0167:004A33B2 CALL 004A2F9C—————重点！！！跟进看何处使EAX可不为0
0167:004A33B7 TEST EAX,EAX ————— 试着下 EAX=0注册失败（这是以EAX为旗帜）
0167:004A33B9 JZ NEAR 004A345A———这里也可跳过
..........................................................
..........................................................
0167:004A3450 MOV EAX,01
0167:004A3455 JMP 004A351A——————这里可跳过
..........................................................
..........................................................
0167:004A34AA PUSH EAX
0167:004A34AB MOV EAX,[EBP+08]
0167:004A34AE PUSH EAX
0167:004A34AF CALL `USER32!MessageBoxA`—出错的对话框，然后向上分析何处跳过此处。

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

跟进0167:004A33B2 CALL 004A2F9C后：

0167:004A2FBD MOV EAX,EDI
0167:004A2FBF MOV EDX,ECX
0167:004A2FC1 SHR ECX,02
0167:004A2FC4 REP MOVSD --------- 如在TRW2000里按F10，会马上带过下面代码（因此在这里用F8）
0167:004A2FC6 MOV ECX,EDX----而在SOFTICE里就没这种情况。
0167:004A2FC8 AND ECX,BYTE +03
0167:004A2FCB REP MOVSB ---------这里用TRW2000时，按f8
0167:004A2FCD POP ESI
0167:004A2FCE PUSH ESI
0167:004A2FCF MOV EDI,ESI
0167:004A2FD1 MOV ESI,005425DC
0167:004A2FD6 XOR EAX,EAX
0167:004A2FD8 OR ECX,BYTE -01
0167:004A2FDB REPNE SCASB ---------这里用TRW2000时，按f8
0167:004A2FDD NOT ECX
0167:004A2FDF SUB EDI,ECX
0167:004A2FE1 XCHG ESI,EDI
0167:004A2FE3 MOV EAX,EDI

0167:004A2FF3 POP ESI
0167:004A2FF4 PUSH DWORD 005425DC-----序列号进栈
0167:004A2FF9 PUSH DWORD 005424DC ----ID进栈
0167:004A2FFE CALL 004A2EA4----------------重点！！！跟进看何处使EAX可不为0
0167:004A3003 TEST EAX,EAX------------------EAX=0失败
0167:004A3005 JZ 004A300E

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
按F8跟进0167:004A2FFE CALL 004A2EA4里，如下：
0167:004A2EB9 POP ECX
0167:004A2EBA CMP EAX,BYTE +05---------判断输入的姓名字符个数是否大于或等于5
0167:004A2EBD JNC 004A2EC6
0167:004A2EBF XOR EAX,EAX
0167:004A2EC1 JMP 004A2F90
0167:004A2EC6 PUSH BYTE +2D
0167:004A2EC8 PUSH ESI
0167:004A2EC9 CALL 00401278-------------------判断注册码中有无短线符号“-"
0167:004A2ECE ADD ESP,BYTE +08
0167:004A2ED1 MOV EBX,EAX
0167:004A2ED3 TEST EBX,EBX
0167:004A2ED5 JNZ 004A2EDE (NO JUMP)
0167:004A2ED7 XOR EAX,EAX

0167:004A2EEE INC EBX
0167:004A2EEF CMP BYTE [EBX],00-判断注册码的短线是否在最后，如：123234-
0167:004A2EF2 JNZ 004A2EFB
0167:004A2EF4 XOR EAX,EAX

0167:004A2F16 MOV EDX,03
0167:004A2F1B MOV ECX,[EBP+08]
0167:004A2F1E ADD ECX,BYTE +03
0167:004A2F21 CMP EDX,[EBP-0C]
0167:004A2F24 JNL 004A2F42

以下就是注册码比较核心：

0167:004A2F26 MOVZX ESI,BYTE [ECX]———此处将姓名字符ASCII码给ESI，初值是从姓名第四个字符开始
0167:004A2F29 IMUL ESI,[EAX*4+0052158C]—EAX的初值＝0；
这里程序将是取表（D 52158C）的值，每次取一值，结果赋值给ESI
0167:004A2F31 ADD EBX,ESI-———————EBX的初值＝0
0167:004A2F33 INC EAX—————————EAX+1
0167:004A2F34 CMP EAX,BYTE +26-————比较是否超过字符表的范围（EAX初值是0）
0167:004A2F37 JNG 004A2F3B
0167:004A2F39 XOR EAX,EAX———————如姓名超过了39（27H）字符，则重新从表的开始处查表。
0167:004A2F3B INC EDX—————————EDX+1 循环计数＋1
0167:004A2F3C INC ECX—————————ECX+1准备取下一个字数
0167:004A2F3D CMP EDX,[EBP-0C]————比较姓名字符是否计算结束
0167:004A2F40 JL 004A2F26 (JUMP)—没有跳到:004A2F26继续计算下一个字符。
0167:004A2F42 CMP EBX,[EBP-04]————————比较核心，在此:
①? EBX 显示：DEC 1405 ；HEX 57D 这里十进制1405就是注册码的前半部分
②下命令：DD EBP-4 此时在数据区显示：00003039；
再次下命令：？ 3039 显示：DEC 12345 ；HEX 3039这就是我们输入的注册码。

********************************************************************************************
在这里我们稍微仔细地把刚才的流程数据处理过程写一下：
①我们输入的ID：toye1 serial:1234-56789
②查看表格数据，DD 0052158C显示：

0030:0052158C 0000000B 00000006 00000011 0000000C ................
0030:0052159C 0000000C 0000000E 00000005 0000000C ................ 
0030:005215AC 00000010 0000000A 0000000B 00000006 ................
0030:005215BC 0000000E 0000000E 00000004 0000000B ................
0030:005215CC 00000006 0000000E 0000000E 00000004 ................
0030:005215DC 0000000B 00000009 0000000C 0000000B ................
0030:005215EC 0000000A 00000008 0000000A 0000000A ................
0030:005215FC 00000010 00000008 00000004 00000006 ................
0030:0052160C 0000000A 0000000C 00000010 00000008 ................
0030:0052161C 0000000A 00000004 00000010 00000000 ................

③每次循环执行[EAX*4+0052158C]一次，依次从数据表中取值：B、6、11、C等；
首先将ID中的第四个字符e(ASCII是65）乘以数据表的第一个数字“B“，然后再循环一次将ID的第五个字符“1”（ASCII是31）乘以数据表中的第二个数“6",由于ID就是5个字符，计算完成，最后生成的数字为：
65*B+31*6=57D 转换成十进制为1405，这个数就是注册码的前半部分。
********************************************************************************************

我们继续跟踪下半部分的注册码：
此时填上：ID为toye1 serial为1405-xxxxx（后面的任意）

0167:004A2F5F MOVZX ESI,BYTE PTR [ECX] ———首先将第四个字符赋给ESI
0167:004A2F62 MOVZX EDI,BYTE PTR [ECX-01] ——首先将第三个字符赋给EDI
0167:004A2F66 IMUL ESI,EDI -——————————ESI*EDI并将值放到ESI
0167:004A2F69 IMUL ESI,[EAX*4+0052158C] -———ESI乘以数据表中的第一数据
0167:004A2F71 ADD EBX,ESI ——————————EBX初值是0
0167:004A2F73 INC EAX
0167:004A2F74 CMP EAX,26 -——判断ID是否超过了39字符，以决定是否重复调用数据表
0167:004A2F77 JLE 004A2F7B
0167:004A2F79 XOR EAX,EAX
0167:004A2F7B INC EDX ————EDX+1 循环计数＋1
0167:004A2F7C INC ECX ————ECX+1准备取下一个字数
0167:004A2F7D CMP EDX,[EBP-0C] ————比较姓名字符是否计算结束
0167:004A2F80 JL 004A2F5F
0167:004A2F82 CMP EBX,[EBP-08] ————————比较核心，在此:
？EBX将看到正确的注册码，DD EBP-8将看到我们输入的注册码的十六进制

注册码的后半部的算法分析和前半部分类似，所不同的每次取ID的两个字符。
以toye1姓名为例：计算关系式：字符"e"乘以字符"y",再乘以B。再次循环字符"1"乘以字符"e",再乘以6:
65*79*B+31*65*6=2811D 换算成十进制为164125；
因此注册码就是1405-164125 ID：toye1

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
注册机：

#include <stdio.h>
#include <string.h>
void main(void)
{
unsigned long code1=0,code2=0,temp;
int i,j;
char name[80];
unsigned char Table[39] =
{0xB,0x6,0x11,0xC,0xC,0xE,0x5,0xC,
0x10,0xA,0xB,0x6,0xE,0xE,0x4,0xB,0x6,
0xE,0xE,0x4,0xB,0x9,0xC,0xB,0xA,0x8,
0xA,0xA,0x10, 0x8,0x4,0x6,0xA,0xC,
0x10,0x8,0xA,0x4,0x10};

printf("mIRC_v5.71 32bit Keymaker (c) by toye(看雪）\n");
printf("【看雪学苑】http://toye.yeah.net\n\n\n");
printf("Input your name:");
scanf("%s",name);

while (strlen(name)<5)
{
printf("you must input your name above 5 letters.\n");
printf("please entry your name again:");
scanf("%s",name);
}

for(i=3,j=0;name[i]!='\0';i++)
{if(j>38) j=0;
code1=name[i]*Table[j]+code1;
j++;
}

for(i=3,j=0;name[i]!='\0';i++)
{if(j>38) j=0;
temp=name[i]*name[i-1];
code2=temp*Table[j]+code2;
j++;}

printf("\n");
printf("Registration code =%ld-%ld\n",code1,code2);
}

名亦我所欲也，利亦我所欲也；
若为破解故，二者皆可抛！
———end———


MP3 explorer

标 题:MP3 explorer 破解和注册机的制作
发信人:梦醒时分
详细信息:

=========================================================================
工具
=========================================================================
- Soft ice 3.23 (喜新不厌旧!)
- C++编译器
- 大脑和好听的音乐 :)

Note: 我希望你知道这些工具怎么用,否则的话,先保存这篇文章,找一些基础的文章看看
我推荐"看雪学苑"中的文章!我主页上也有连接.

=========================================================================
一,二,三 /开始!
=========================================================================

运行MP3 explorer,到帮助菜单,点击关于,你应该看到输入注册码的地方了吧!

输入名字: ACiD BuRN
假设一个密码: 12321

记得许多教程中让你一步步地跟踪调试吗?太累了,很久都不会走上路子,特别是一些新手,
这儿介绍一种新思维:使用BPR技术,可以轻易帮我们解决问题 :)

设置一个GetWindowtextA断点,回到注册窗口,点击OK! Soft ice自动跳出来!

Break due to BPX USER32!GETWINDOWTEXTA...

不要按任何键!(包括 F11 或 F12) 我们将要看一看堆栈的参数. 为了清楚地介绍,我们将看看
dword (命令 = dd) 那么,在soft ice中键入: dd esp为什么呢?让我告诉你吧:

"dd"是指: 显示 dword 和 "esp" 堆栈指针!

你键入"dd esp"之后, 在Soft-ice's中,窗口将发生变化,我们可以看到参数:

xxxx:yyyyyyyy A B C D ................
xxxx:yyyyyyyy E F G H ................

那些A,B,C,D,E...应该看起来象这样: XXXXXXXX (当然XXXXXXXX只是一些数字)

你应该看到一些象这样的:

xxxx:yyyyyyyy 0044423B 00000464 015DB338 0000000A ...........

我们将只用这些知识 :)

(你应该注意到,在这儿 A=0044423B , B=00000464, C= 015DB338...)

我们只能看到我们注册的名字结束的地方 (015DB338).

键入 D "名字结束的地址" 这儿是: D 015DB338

现在,你可以按一下F11,你就应该在地址中看到我们输入的名字(那就是名字结束的地方...)

很好,我们的路子走对了!

我们将使用一个 BPR (break on memory range). 这种断点的设置应该象这样:
bpr "开始地址" "结束地址" RW

RW 是指: 读和写.就是指将在这段地址进行读写的时候停下来.

那么在Soft-ice中, 键入:
bpr 015DB338 015DB338 + (名字的长度 - 1) RW

如 ACiD BuRN (有九个字母 -> 9 - 1 = 8)

我们的目标是 ACiD BuRN,所以我们键入 :

bpr 15DB338 015DB338+8 RW

这时候,你设置的getwindowtextA断点已经没用了!你只有按F5了,我们将直接在目标处被截下.
但是,在这个软件中,不太直接,我们落在 dll中,所以不停地按F5直到跳出去.当跳到软件的代码
时, 我们来到了好地方! 就是从那开始的: 看看我 winice.log 中的记录吧!

----------------------SNiP----- SNiP----- SNiP----------------------------

:bpx getwindowtexta
Break due to BPX USER32!GetWindowTextA (ET=1.17 seconds)
:dd esp
:d 15f5a18
Break due to G (ET=268.99 microseconds)
:bpr 15f5a18 15f5a18+8 RW
:bd 0
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
Break due to BPR #0267:015F5A18 #0267:015F5A20 RW
:u eip l 50

注释:这儿是第一个 loop:

025F:0040A173 8B442420 MOV EAX,[ESP+20] ; EAX 中是我名字的地址
025F:0040A177 0FBE0C06 MOVSX ECX,BYTE PTR [EAX+ESI] ; ECX = 第一个字母的hex值
025F:0040A17B 51 PUSH ECX
025F:0040A17C E8E9BB0100 CALL 00425D6A ; 有趣 !!!!
025F:0040A181 83C404 ADD ESP,04
025F:0040A184 03E8 ADD EBP,EAX ; 把ascii值转化成hex值送到EBP中
025F:0040A186 46 INC ESI ; 第二个字母!
025F:0040A187 3BF7 CMP ESI,EDI ; 都结束了吗 ?!
025F:0040A189 7CE8 JL 0040A173 ; 如果没有,跳回吧 !

025F:0040A18B 8B4C240C MOV ECX,[ESP+0C] /
025F:0040A18F BAC0D40100 MOV EDX,0001D4C0 /
025F:0040A194 2BD5 SUB EDX,EBP / 我们一会再看这儿
025F:0040A196 33C0 XOR EAX,EAX /
025F:0040A198 3BCA CMP ECX,EDX /
025F:0040A19A 8D4C2420 LEA ECX,[ESP+20] /
025F:0040A19E 0F94C0 SETZ AL /

在这里, 我们看到了把每个字母的ascii值转化成hex值送到EBP中.但是,我们看到了那个Call
非常有趣!让我们进去看看 :

:u eip l 50

025F:00425D6A 53 PUSH EBX
025F:00425D6B 33DB XOR EBX,EBX ; 使EBX=0
025F:00425D6D 391D74344800 CMP [00483474],EBX
025F:00425D73 7513 JNZ 00425D88
025F:00425D75 8B442408 MOV EAX,[ESP+08] ;把ascii值移至EAX
025F:00425D79 83F861 CMP EAX,61 ;和 61h 比较
025F:00425D7C 7C59 JL 00425DD7 ;如果小于 61? 跳到 425DD7
025F:00425D7E 83F87A CMP EAX,7A ;和 7A 比较
025F:00425D81 7F54 JG 00425DD7 ;如果大于 7A? 跳到 425DD7
025F:00425D83 83E820 SUB EAX,20 ;小于 7A 但大于 61 (eax-20)
025F:00425D86 5B POP EBX
025F:00425D87 C3 RET ;返回!call结束!
025F:00425D88 56 PUSH ESI
025F:00425D89 BE88484800 MOV ESI,00484888
025F:00425D8E 57 PUSH EDI
025F:00425D8F 56 PUSH ESI

那么,接着该怎么办呢?!它和 61 , 7A 进行比较! 61h = a 并且 7Ah = z 如果它小于7A但是大于61
它将会被减去20.其实这只是把它转化成大写字母!那么ACiD BuRN 的注册码将会和 Acid Burn, acid
burn, ACID burn...一样.那么主loop会怎么做呢? 把所有字母转化成大写接着把ascii值转化成hex值
送到EBP中... 所有的字母完成后我们将会在这儿:

025F:0040A18B 8B4C240C MOV ECX,[ESP+0C] ; ECX = 我们输入的假注册码
025F:0040A18F BAC0D40100 MOV EDX,0001D4C0 ; EDX = 1D4C0h = 12000
025F:0040A194 2BD5 SUB EDX,EBP ; EDX = EDX - EBP
025F:0040A196 33C0 XOR EAX,EAX ; EAX = 0
025F:0040A198 3BCA CMP ECX,EDX ; 比较真假注册码
025F:0040A19A 8D4C2420 LEA ECX,[ESP+20]
025F:0040A19E 0F94C0 SETZ AL

这已经很清楚了!
步骤是这样的:

- 把所有字母转化成大写
- add all ascii values
- Subtract the result of ascii added to 12000

现在,你可以非常容易的为 MP3 Explorer 编写注册机了 !通常, 我会把我自己编写的源代码
给你 :)这儿用的是是 C++ 和 inline asm :)

-------------------------源代码 从这开始!---------------------------------

#include <stdio.h>
#include <string.h>
#include <conio.h>

int main(){
int i,len;

unsigned char name[100];

unsigned long check=128;

printf("\Mp3 Explorer Keygen By : ACiD BuRN [Immortal descendants] \n ");
printf("\ ");
printf("\nEnter name: ");
gets(name);
len=strlen(name);

asm
{
xor ecx, ecx
xor edi, edi
mov edx, [len]

start1:
movsx eax, [name+ecx]
cmp eax, 97
jl temp1
cmp eax, 122
jg temp1
sub eax, 32

temp1:
add edi, eax
inc ecx
cmp ecx, edx
jne start1

mov eax, 120000
sub eax, edi
mov [check], eax

}

printf("=: %lu" ,check); /* %lu = decimal, check = serial */
printf("\nEnjoy!");
getch();
return 0;

}

----------------------------结束---------------------------------

=======================================================================
翻译来自 "梦醒时分" 网站,欢迎访问获得更多的资料,争作中国最好的网站! }
translate from "time of dream broken" get more information at our web.}
We Will Best in China! }
======================================================================}
http://todb.yeah.net http://go.163.com/~yinqun2000/ }
=======================================================================


Noterpro V1.1

 标 题:各位大侠帮我看一下这个小程序怎么破（内有下载地址） (173字)
发信人:快乐笨笨
时 间:2000-8-21 11:49:28
详细信息:
那位好心人帮我看下这个程序怎么破，看了好多破解教程，可是破解的第一个软件仍然是失败，真的好伤心，是不是我太笨了？它的下载地址是：

http://www.newhua.com.cn/down/notepro.zip

标 题:看雪破解过程的补充内容 (11千字)
发信人:程式猎人
时 间:2000-8-27 12:07:10
详细信息:

Noterpro V1.1
程式猎人
简介：这个软件是一个小型的编辑软件，功能比note强大。
追踪：name:dahuilang
RN:01234567
在写这个教程前，我看到了看雪关于这个软件的整个计算过程，在他的文章中讲解的非常清楚，如何得到的注册码大家想必一看就知道了。但是看雪没有写出来如何能够追踪到计算的地方，我想对于初学者来说追踪到这里是非常关键的，而大家没有追踪出来的原因大多数也就在此，所以我就将它从开始处直到追踪到计算过程处写出来，供大家学习。
下bpx hmemcpy后你将被拦下。跳跃到主程序中，如下：
0040b1f7 call 0049a768
lea edx [ebp-08] <-出来
xor eax eax
……
……
0040b214 call 0049a768
lea edx [ebp-08]
mov edx [edx]
mov eax [004e9c80]
pop eax
call 00406bb0
push eax ****
……
……
0040b245 call 004dccc
pop ecx
test cl cl
jz 0040b38b
现在我们就追踪到这里，你将首先从上面标记的地方出来，因为程序要读取两次，所以它使用了call 0049a768两次的，程序读取完后下面的那个call就是关键的地方，我在这里向大家解释一下为什么说call 00406bb0就是重要的地方。
因为在下面0040b245处开始，如果程序在这里跳跃的话，将出现错误提示，所以说这个跳跃是一个相当关键的地方，那么ecx的值决定这个程序能够注册成功与否了。程序调用ecx是使用出栈的方法得到ecx的，那么就要看在那里进栈了，观察程序发现只有****处进入堆栈，所以现在就知道call 00406bb0是一个重要的函数了。
进入call 00406bb0中，如下：

00406e6b mov edx [ebp-08]
call notepro!@stratil@xordecord$qqrx17
lea edx [ebp-2c]
lea eax [ebp-14]
call 004dcd9c
push eax ****
……
……
00406e92 call 004dcccc
pop ecx
test cl cl
jz 00406e98
mov byte [ebp-51] 01 ****
00406e98 dec dword [ebp-34]
……
……
00406eae mov al [ebp-51] ***
mov edx 02
push eax **
leax eax [ebp-08]
……
……
00406ecd call 004dcccc
pop eax *
mov edx [ebp-50]
现在开始介绍程序在这个call中如何得到的eax值的，因为出这个call后我们最关心的就是eax值，那么就要注意这个值的变化。我先从后面看，这个eax就是程序返回的值，它从这里得到的。
pop eax *
那么在上面就有进入堆栈的地方
push eax **
它又是mov al [ebp-51]从这得到的，再向上查找程序在这里使用mov byte [ebp-51] 01，这个是决定你注册成功的关键，那么上面正好有一个jz，这就应当找到了关键地方了。但是在这里你不要进入
00406e92 call 004dcccc
中，因为它不是最后的运行call，为什么？还是使用前面讲到的地方，因为程序使用的是pop ecx来传值的，所以上面才是关键的地方。
call 004dcd9c
push eax
这里者关键的地方，那么如果你进入这里call中你会发现这里只是一个比较过程，它的两个值一个是明码，另一个不是，其中名码就是通过你的name计算得到的，而不是明码的就是通过你的注册码计算得到的。现在的关键是找到如何通过你的注册码计算得到这个比较码的。那么在上面茫茫的代码中如何找呢？
这里也有一个技巧，因为如果你进入call 00406bb0这里后，你会发现程序前面的计算入口值都是name，也就是前面的计算都真对name的，而在这里你可以看到它的入口值是你输入的RN
00406e6b mov edx [ebp-08] <-RN *******
call notepro!@stratil@xordecord$qqrx17
lea edx [ebp-2c]
lea eax [ebp-14]
那么下面的那个call就是运行的关键了，进入后你就会发现它同看雪介绍的一样，你手中一定要有一个XOR表，如果没有话，自己做一个就行了。下面就是看雪破解的计算过程。

程序名是：notepro 1.04
下载：http://www.newhua.com.cn/down/notepro.zip

我们看看这个程序的算法，这程序先跟据姓名如：toye，计算出一中间数m,这里m=4091327126,然后将这m各位依次转换ASCII码，再依次与内部固定字串：67gjhab480klvn176 异或运算，结果就是以两位十六进制表示，这就是注册码。
如：设我们输入的姓名格式：a1 a2 a3 ...a(n)
m分成三段，依次根据姓名计算。设m=m1+m2+m3
m1=a1+a2+a3+--+a(n-1)+61 (全部数字是以十进制表示计算的）
m2=（a1+a(n))*3D (全部数字以十六进制计算，结果转换成十进制）
m3=3D+3D+n (全部数字以十六进制计算，结果转换成十进制）

在这里：toye
m=m1 m2 m3= 409 1327 126 =4091327126

m=4091327126
展开：34 30 39 31 33 32 37 31 32 36 (将m转换成ASDCII码）
XOR：36 37 67 6A 68 61 62 34 38 30 (固定字串67gjhab480klvn176以ASCII表示）
——————————————————
02 07 5e 5b 5b 53 51 03 09 02 5d

因此：注册码就是：02075e5b5b53510309025d

至此，注册机应不难写了。

下面简单将破解过程的代码例出：

用SOFTICE来破，用WF打开浮点开关。

①计算m1部分

ST0 111. ST4 empty
ST1 empty ST5 empty
ST2 empty ST6 empty
ST3 empty ST7 empty
-----------------------------------------------------------------------------
0167:00406898 MOV ESI,EBX
0167:0040689A PUSH ESI
0167:0040689B LEA EAX,[EBP-04]
0167:0040689E PUSH EAX
0167:0040689F CALL 004DBEDC
0167:004068A4 ADD ESP,08
0167:004068A7 LEA EAX,[EBP-04]
0167:004068AA CALL 004DC178
0167:004068AF ADD ESI,[EBP-04]
0167:004068B2 DEC ESI
0167:004068B3 MOVSX EDX,BYTE PTR [ESI] //依次将姓名各个字符传给edx
0167:004068B6 AND EDX,7F
0167:004068B9 MOV [EBP-70],EDX
0167:004068BC FILD DWORD PTR [EBP-70] //将这个字符放进浮点寄存器ST0
0167:004068BF FADD REAL8 PTR [EBP-5C] //ebp-5c的初值为0 ，ST0与ebp-5c的值相加
0167:004068C2 FSTP REAL8 PTR [EBP-5C] //将结果取出，放进ebp-5c
0167:004068C5 INC EBX
0167:004068C6 CMP DWORD PTR [EBP-04],00
0167:004068CA JZ 004068D4
0167:004068CC MOV ECX,[EBP-04]
0167:004068CF MOV EAX,[ECX-04]
0167:004068D2 JMP 004068D6
0167:004068D4 XOR EAX,EAX
0167:004068D6 CMP EBX,EAX //依次循环n-1次，只有姓名的最后一字符没参加运算。
0167:004068D8 JL 00406898 (JUMP )
0167:004068DA FILD DWORD PTR [EDI+000005C8] //将定值 61（十进制）放进浮点寄存器 ST1
0167:004068E0 FADD REAL8 PTR [EBP-5C] //将61加上前n-1位的和。成为m1
0167:004068E3 FSTP REAL8 PTR [EBP-5C]
0167:004068E6 PUSH 01
0167:004068E8 LEA EDX,[EBP-04]
0167:004068EB PUSH EDX

②m2部分计算
ST0 13237. ST4 empty
ST1 empty ST5 empty
ST2 empty ST6 empty
ST3 empty ST7 empty
————————————————————————————————

0167:00406929 ADD EBX,[EBP-04]
0167:0040692C DEC EBX
0167:0040692D MOVSX EDX,BYTE PTR [EBX]
0167:00406930 AND EDX,7F
0167:00406933 POP ECX
0167:00406934 ADD ECX,EDX //ecx=是姓名第一字符，edx=姓名的第后一字符
0167:00406936 IMUL ECX,[EDI+000005C8] //将上面的结果乘以十六进制数：3D. 成为m2
0167:0040693D MOV [EBP-70],ECX
0167:00406940 FILD DWORD PTR [EBP-70]
0167:00406943 FSTP REAL8 PTR [EBP-64]
0167:00406946 CMP DWORD PTR [EBP-04],00
0167:0040694A JZ 00406954
0167:0040694C MOV EAX,[EBP-04]
0167:0040694F MOV EDX,[EAX-04] 
0167:00406952 JMP 00406956

③m3的计算

0167:0040695C ADD EAX,EAX //EAX的值是定值：3D（十六进制）
0167:0040695E ADD EDX,EAX //EDX值是姓名的位数n 计算的结果就是m3
0167:00406960 MOV [EBP-70],EDX
0167:00406963 FILD DWORD PTR [EBP-70]
0167:00406966 FSTP REAL8 PTR [EBP-6C]
0167:00406969 MOV WORD PTR [EBP-40],0038
0167:0040696F FLD REAL8 PTR [EBP-6C]
0167:00406972 CALL 004D5094
0167:00406977 PUSH EDX

④
167:00406A4E XOR ECX,ECX
0167:00406A50 MOV [EBP-2C],ECX
0167:00406A53 LEA ECX,[EBP-2C]
0167:00406A56 INC DWORD PTR [EBP-34]
0167:00406A59 MOV EAX,[EDI+000005DC]
0167:00406A5F MOV EDX,[EBP-08]
0167:00406A62 CALL 004354D8 //将输入的注册码与定值67gjhab480klvn176 异或运算，以结果K表示
0167:00406A67 LEA EDX,[EBP-2C]
0167:00406A6A LEA EAX,[EBP-14]
0167:00406A6D CALL 004DC0F0 // 将结果k与M比较
0167:00406A72 PUSH EAX //如相等EAX ＝1 ,将EAX入栈
0167:00406A73 DEC DWORD PTR [EBP-34]
0167:00406A76 LEA EAX,[EBP-2C]
0167:00406A79 MOV EDX,00000002
0167:00406A7E CALL 004DC020
0167:00406A83 POP ECX //cl出栈，即将EAX的值传到cl
0167:00406A84 TEST CL,CL // 如相等cl =1
0167:00406A86 JZ 00406A8C
0167:00406A88 MOV BYTE PTR [EBP-51],01
0167:00406A8C DEC DWORD PTR [EBP-34]

---------------------------------end------------------------

标 题:初学者快速获得Notepro v1.1注册码 (1千字)
发信人:wind[CCG]
时 间:2000-8-27 12:52:22
详细信息:

初学者快速获得Notepro v1.1注册码：
1.启动trw2000和notepro v1.1
2.填入Name和Code作为注册资料
我用name: wind
code: 7878787878
3.Ctrl+N,下bpx hmemcpy
4.返回Notepad,按OK!程序被中断!
5.pmodule,来到Notepro
6.F10开始追踪
...来到如下程序段
015F:0040B219 LEA EDX,[EBP-04]
015F:0040B21C MOV EDX,[EDX]
015F:0040B21E MOV EAX,[004E9C80] ----->用d edx可以看到Name
015F:0040B223 POP ECX ----->d ecx可以看到我们输入的注册码！
故判断下面那个call是计算或转换部分!
015F:0040B224 CALL 00406BB0 ---->进入这个call，
这个call就是计算注册码的部分

进入40b224那个call后，用f10跟踪一段时间后，来到：
015F:00406E0F CALL 004DCCCC
015F:00406E14 DEC DWORD [EBP-34] ----->用d edx看，可以在内存区看到
通过名字计算得出的数值！
这里用ncode表示
015F:00406E17 LEA EAX,[EBP-24]
.
.
.
.
然后来到如下处：
015F:00406E65 MOV EAX,[EDI+0610]
015F:00406E6B MOV EDX,[EBP-08] ----->用d eax可以看到一串字符！这串字符是固定的！
015F:00406E6E CALL `NOTEPRO!@Strutils@XorDecode$qqrx17System@AnsiStringt1`

通过xor就可以得到自己的注册码了！
我的ncode是：39513359126
固定字串为：67gjhab480klvn176
转换成ascii: 33 39 35 31 33 33 35 39 31 32 36
固定字串转换成ascii：36 37 67 6A 68 61 62 34 38 30 6B
进行异或操作后得到： 05 0e 52 5b 5b 52 57 0d 09 02 5d

所以我的注册码就是：
Name: wind
Code: 050e525b5b52570d09025d

谢谢看雪大虾的文章！


Offline Explorer 1.3 230

 标 题:Offline Explorer 1.3 230破解实战 (3千字)
发信人:xiA Qin
时 间:2000-7-8 15:16:21
详细信息:
软件名称：Offline Explorer 1.3 230
简 介：功能强大的离线浏览器
解密日前：2000年7月7日
解密工具：Trw2000 1.22

说明：网上的朋友，大家好！
这是我写的第二篇破解实战，如若有纰漏，请各位大虾多指教！

特别感谢看雪大虾。是他编辑的破解教材《CRACK教学》，让我在学习破解的过程中受益匪浅。

首先用Trw2000载入Offline Explorer
输入注册信息
name:xiA Qin &任意输入
register key:1949101 &任意输入

下指令bpx hmemcpy //下中断点
按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
015F:004B8B1F MOV EAX,[EBP-04]
015F:004B8B22 PUSH EAX
015F:004B8B23 LEA EDX,[EBP-08]
015F:004B8B26 MOV EAX,[EBX+02E0]
015F:004B8B2C CALL 00432F2C
015F:004B8B31 MOV EDX,[EBP-08]
015F:004B8B34 MOV EAX,[004D8C4C]
015F:004B8B39 MOV EAX,[EAX]
015F:004B8B3B POP ECX
015F:004B8B3C CALL 004C65E0 ->这个CALL有问题，按F8进入。
015F:004B8B41 TEST AL,AL ->检验注册标记
015F:004B8B43 JZ 004B8BAA ->注册码不相等，就跳004B8BAA
015F:004B8B45 MOV EAX,[004D8C4C]
015F:004B8B4A MOV EAX,[EAX]
015F:004B8B4C MOV BYTE [EAX+060C],01
015F:004B8B53 LEA EDX,[EBP-04]
...............................

015F:004B8BAA PUSH BYTE +10
015F:004B8BAC LEA ECX,[EBP-10]
015F:004B8BAF MOV EAX,[004D8C4C]
015F:004B8BB4 MOV EAX,[EAX]
015F:004B8BB6 MOV EAX,[EAX+04F8]
015F:004B8BBC MOV EDX,07
015F:004B8BC1 CALL 004A4CB0
015F:004B8BC6 PUSH DWORD [EBP-10]
015F:004B8BC9 PUSH DWORD 004B8CA8
...................
015F:004B8C52 CALL 00404034
015F:004B8C57 MOV ECX,EAX
015F:004B8C59 MOV EDX,004B8CB8
015F:004B8C5E MOV EAX,[004D8E4C]
015F:004B8C63 MOV EAX,[EAX]
015F:004B8C65 CALL 0044F6D8 ->到这里GAME OVER了,
015F:004B8C6A XOR EAX,EAX 向上看什么地方可以
015F:004B8C6C POP EDX 跳过这个CALL.
015F:004B8C6D POP ECX

=========================================
按F8进入004B8B3C CALL后
按F10来到下面的指令

015F:004C6930 FF75FC PUSH DWORD [EBP-04]
015F:004C6933 681C6D4C00 PUSH DWORD 004C6D1C
015F:004C6938 8D45F4 LEA EAX,[EBP-0C]
015F:004C693B BA03000000 MOV EDX,03
015F:004C6940 E8EBD5F3FF CALL 00403F30
015F:004C6945 BAC163D306 MOV EDX,06D363C1
015F:004C694A 8B45F4 MOV EAX,[EBP-0C]
015F:004C694D E8FAF9FFFF CALL 004C634C
015F:004C6952 8D55F0 LEA EDX,[EBP-10]
015F:004C6955 E876FAFFFF CALL 004C63D0
015F:004C695A 8B55F0 MOV EDX,[EBP-10] ->真正的注册码 下指令D EDX
015F:004C695D 8B45F8 MOV EAX,[EBP-08] ->这里是你输入的注册码
015F:004C6960 E81BD6F3FF CALL 00403F80
015F:004C6965 0F94C3 SETZ BL
015F:004C6968 33C0 XOR EAX,EAX
015F:004C696A 5A POP EDX
015F:004C696B 59 POP ECX
015F:004C696C 59 POP ECX
015F:004C696D 648910 MOV [FS:EAX],EDX

........................

抄下来，填入试一试。


OicqPassOver.exe Ver1.

 标 题:谈谈关于如何破解OicqPassOver.exe Ver1.14的问题 (4千字)
发信人:电神魔鬼
时 间:2000-7-31 21:32:25
详细信息:
谈谈关于如何破解OicqPassOver.exe Ver1.14的问题

一.如何注册OicqPassOver.exe Ver1.14

1.如果你对这个软件没什么兴趣的话,按如下方法注册即可
在HKEY_CURRENT_USER\Software\Intel新建字符串值speed内容为102717715,再新建字符串值cpu内容为BB901AC1,其中cpu的内容会随speed的内容不同而变化.

2.如果你对他很感兴趣的话,分析一下他的注册流程

简要方法:
017f:00451d41 lea eax,[ebp-04]
017f:00451d44 call 00407b9c
017f:00451d49 mov edx,[ebp-04]
017f:00451d4c pop eax ------>d eax
017f:00451d4d call 00403c3c
017f:00451d52 jnz 004551ee0

首先选注册,输入78787878,后按ctrl+d进入softice,执行s 30:0 l ffffffff '78787878',后bpm搜到的地址,按f5返回,点确定后被softice拦到,下bd *,按数次f12进入OicqPassOver的领空,按f10跟踪到上面所写的地方,当程序执行到00451d4c处时,用d eax,上下翻页看一下内存的话,speed值,cpu值,密码值写在一起,很容易找到,当程序执行到00451d52时,如果密码正确不跳,否则跳,跟踪完毕.

注册的话,填正确的密码,强制不跳,都能注册,但程序会在windows\system下放一个叫kbd.386的文件,据说这个玩艺会使使用者当机,我没碰到过当机,不知是怎么回事:(,可是不管你怎么注册,他都会放的,我只有继续跟踪了.

二.如何跳过程序的“暗柱”

我们继续跟踪到

017F:00451DB5 MOV EDX,00451E78
017f:00451dba mov edx,esi
017f:00451dbc mov ecx,[eax]
017f:00451dbe call [eax+34]
017f:00451dc1 dec ebx
017f:00451dc2 jnz 00451d85 ->jmp 00451e0f

这个jnz会在刚才d eax所显示内存处的下面连续写hahaha.....!,就是kbd.386的内容,我没有仔细分析,直接跳到00451e0f的话会提示注册成功,且不会在windows\system下放kbd.386(jmp 00451e0f是试出来的,在此省略测试若干,由于我没细分析,有毛病的话,就应该是jmp到哪的问题了)

三.如何跳过"路漫漫"的问题

这个问题我的能力解决不了,不过我参考了一下
iCEbIRD [CCG] * [CCG] stands for cHINA cRACKING gROUP
http://nemc.yeah.net/
icebird_crack@21cn.com
的破 OICQ 密码终结者 1.13的关于消除nag screen的部分,得到完满的解决.

好我们开始(参考部分原文)

因为soft-ice无法查找中文,用winhex查找"路漫漫"(他用的是ultra-edit,我习惯用winhex),把他改为cracking,然后执行OicqPassOver.exe,进入后在softice中下bpx destroywindow,点确定,被拦到,按f12到OicqPassOver的领空后,下s 30:0 l ffffffff 'cracking',bpm搜到的地址,退出OicqPassOver,再次执行OicqPassOver.exe,被拦到,下bd *,按f12直到进入OicqPassOver的领空,按住f10直到回到OicqPassOver中,点确定后又被拦到,看一下是哪一个call调的

017f:0044b14d call [edx+cc]

由于这是一个公共的call,我们不能直接把它给NOP掉,所以在程序中加入一段子程序,在44b14d处首先CALL我的子程序进行判断，看是出现那个有诗句的nag screen还是其它。那么我的code要放在哪里呢？因为程序的入口在.CODE section，所以用winhex打开文件，在.CODE section中找可以存放我的code的地方，我找到了这里：(这一段几乎抄的原文,下面是关键 )

000562e3 e8 bb f5 fe ff 5b e8 a1 c8 fa ff 90 00 00 00 <- end of .CODE section
000562f2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <- here save my code

解释一下我理解的上面的查找方法:抄下softice跟踪到的机器码,比如017f:00451d52 jnz 004551ee0的机器码是0f85c8000000,在winhex中查找之,找到后,按pagedown向下翻页直到又连续的000000000000000000000......处(在hex values中),最明显的标志是text栏中runtime error的上面(我的表达能力太差了:(,sorry)

我决定在562f2处放我的code，所以先在这里做一个mark，键入mycode.
再次运行程序，这次在44b14d处拦下后就下s 30:0 l ffffffff 'mycode'，找到了内存地址456ee3, 此时还要记下两样数据：[EDX+CC]==>443608，EDI==>0
现在可以开始改了，下A 44b14d，然后下CALL 456ee3，下nop，回车,程序变成了这样

017f:00448125 0f8450bcee78 call 456ee3
017f:00448126 90 nop

接下来就下G 456ee3，到了456ee3后就下A，然后下这些指令：

xxxx:xxxxxxxx 83ff00 CMP EDI,00
xxxx:xxxxxxxx 0f846742ffff JZ 0044b153
xxxx:xxxxxxxx e917c7feff JMP 00443608

完成.

四.做成release版的OicqPassOver.exe密码终结者

1.注册号随便填

查找:0f85c8000000b201
改为:909090909090b201

2.跳过程序的“暗柱”

查找:ff51344b75f1
改为:ff51344beb4b

3.跳过"路漫漫....."

查找:8b10ff92cc0000008945f8
改为:8b10e891bd0000908945f8

查找:6D79636F6465????????????????
改为:83ff000f846742ffffe917c7feff
(只有填mycode时,这样找,或直接用winhex在000562f2处写入83ff000f846742ffffe917c7feff)

完成.

注:1.没有经过安全测试,有什么副作用未知:)
2.我用的是winhex9.52,如果你没有注册号的话,按如下方法改可以免注册:)
附winhex ver9.52免注册

*[45759d] 在这强制置1的话,程序会认为你已经注册

017f:00450041 jnz 00450064 ->nop
017f:00450062 jz 00450068 ->jmp 00450068
017f:0043e31b jl 0043e372 ->nop
017f:0043e36b jz 0043e37d ->jmp 0043e37d

7521B85C524500
9090B85C524500

3B027404
3B02eb04

7C55A13C764500
9090A13C764500

741083F954
eb1083F954

cracked by 电神魔鬼
thanks for your supports


Opera 4.

 标 题:Opera 4.0 (255字)
发信人:dREAMtHEATER
时 间:2000-7-12 23:39:08
详细信息:
dr0兄：
Hi!很高兴认识你，我是dREAMtHEATER,有一事向你请教。
你能告诉我Opera把安装时间存在什么地方吗？我从3.0开始
破解这个程序的，但始终没有找到正确的答案，这种情况我
很少遇到，一般存在注册表或windows目录下，但它好象不
是，望赐教。

dREAMtHEATER

标 题:它的秘密在WIN.INI和OUsr402.dat中 (1千字)
发信人:dr0
时 间:2000-7-13 2:53:18
详细信息:

Opera 4.0 Final把时间记录在如下两个地方：
1、WIN.INI
[Compatibility Driver]
SAPDRV = 0x00002d //这个是4.0 Final的
SAPDRVQ = 0x00003d //下面这两个是旧版本的
SAPDRVX = 0x00001c

2、OUsr402.dat
在该文件的偏移地址0x00000004处，占4个字节（即一个长整数），是和
四个固定字节异或后的值。整个文件的解密都是采用异或的方式。
旧版本的文件名与此稍有不同，如OUsr401.dat等。注册码也放在这个文件中。
这个文件长度固定为0x4BC，即1212字节。

将文件OUsr402.dat删除，并将win.ini中的相应部分删除就可以再用30天。

时间判断如下：

:00417272 call 005101A5 //调用GetLocalTime( )取当前时间
:00417277 sub eax, dword ptr [ebx+04] //减去安装时间
:0041727A push eax
:0041727B call 0050E648
:00417280 add esp, 00000018
:00417283 cmp eax, 00015180 //0x15180 = 3600秒每小时 * 24小时 = 1天
:00417288 jl 00417298
:0041728A inc [ebx+08]
:0041728D push 00000000
:0041728F call 005101A5
:00417294 pop ecx
:00417295 mov dword ptr [ebx+04], eax
:00417298 push 0000001F
:0041729A mov ecx, ebx
:0041729C call 00416E58
:004172A1 mov ecx, dword ptr [ebx+08]
:004172A4 cmp ecx, eax
:004172A6 jle 004172AA
:004172A8 mov eax, ecx
:004172AA cmp eax, 0000001E //30天过期没有
:004172AD jle 004172B2
:004172AF push 0000001E
:004172B1 pop eax
:004172B2 push eax
:004172B3 mov ecx, ebx
:004172B5 mov dword ptr [ebx+08], eax
:004172B8 call 00416DE8
:004172BD pop edi
:004172BE pop esi
:004172BF pop ebx
:004172C0 leave
:004172C1 ret


Opera 4.0 Final

标 题:如何破解Opera 4.0 Final
发信人:dr0
时 间:2000年7月6日
详细信息:

written by dr0

时间:2000年7月6日

Opera 4.0 Final的注册码与4.0 beta 5相比，差别不大，但是和以前的版本相比，注册码判断算法有根本的变化，找注册码等价于写注册机。不过我觉得这种只改变算法的策略并不能很好地保护其软件。

首先，我们用bpx GetDlgItemTextA设断点，它会调用该函数3次，分别读入Name、Company、Code。由于Name、Company与Code无关，故我们只要在它最后一次调用GetDlgItemTexA时拦住即可。如下：

:004420A6 8B6C2410 mov ebp, dword ptr [esp+10]
:004420AA BB2B010000 mov ebx, 0000012B
:004420AF 57 push edi

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:004420B0 8B3D5C555300 mov edi, dword ptr [0053555C]
:004420B6 8D8638010000 lea eax, dword ptr [esi+00000138]
:004420BC 53 push ebx
:004420BD 50 push eax
:004420BE 68BD2B0000 push 00002BBD
:004420C3 55 push ebp
:004420C4 FFD7 call edi //读取Name
:004420C6 8D8664020000 lea eax, dword ptr [esi+00000264]
:004420CC 53 push ebx
:004420CD 50 push eax
:004420CE 68BE2B0000 push 00002BBE
:004420D3 55 push ebp
:004420D4 FFD7 call edi //读取Company
:004420D6 8D8690030000 lea eax, dword ptr [esi+00000390]
:004420DC 53 push ebx
:004420DD 50 push eax
:004420DE 68BF2B0000 push 00002BBF
:004420E3 55 push ebp
:004420E4 FFD7 call edi //读取Code

查阅一下API手册，可以知道传递给GetDlgItemTextA( )的第3个参数是缓冲区的首址。看一下上面的代码，发现在3次调用GetDlgItemTextA( )时使用的缓冲区首址是esi+00000390，于是等它执行完CS:004420E4处的call edi指令后，马上用BPR esi+390 esi+390+len rw作为断点监视你输入的假注册码，看它如何处理你输入的假注册码，其中len是假注册码的长度。然后按F5执行，马上在下面的地方又中断下来：

:0050E680 F7C703000000 test edi, 00000003
:0050E686 7514 jne 0050E69C
:0050E688 C1E902 shr ecx, 02
:0050E68B 83E203 and edx, 00000003
:0050E68E 83F908 cmp ecx, 00000008
:0050E691 7229 jb 0050E6BC
:0050E693 F3 repz
:0050E694 A5 movsd //在这里中断
:0050E695 FF2495A8E75000 jmp dword ptr [4*edx+0050E7A8]

很显然，它要把我们的假注册码搬到内存的另一个地方去。清除所有断点，直接按一下F12，回到上一层，我们准备从更高的调用层次上来分析一下程序大致流程，免得过早地陷入细节分析中去。如无特殊说明，以后就只按F10了。

:0043CF6C 68BC040000 push 000004BC
:0043CF71 56 push esi
:0043CF72 57 push edi
:0043CF73 E8E8160D00 call 0050E660 //刚才是在这里面

...............................................

:0043D00C FF750C push [ebp+0C]
:0043D00F 894514 mov dword ptr [ebp+14], eax
:0043D012 E849110D00 call 0050E160 //求注册码长度
:0043D017 83F80C cmp eax, 0000000C //长度等于12吗？
:0043D01A 59 pop ecx
:0043D01B 753C jne 0043D059
:0043D01D 56 push esi
:0043D01E E8A40F0D00 call 0050DFC7
:0043D023 BE00010000 mov esi, 00000100
:0043D028 56 push esi
:0043D029 E8D30F0D00 call 0050E001
:0043D02E 59 pop ecx
:0043D02F 8BF8 mov edi, eax
:0043D031 59 pop ecx
:0043D032 56 push esi
:0043D033 57 push edi

* Possible Reference to String Resource ID=22005: "Invalid registration number. "
"You have probably entered a previous"
|
:0043D034 68F5550000 push 000055F5
:0043D039 8B0DB8205600 mov ecx, dword ptr [005620B8]
:0043D03F E8E6500800 call 004C212A
:0043D044 6A10 push 00000010
:0043D046 FF7514 push [ebp+14]
:0043D049 57 push edi
:0043D04A FF7508 push [ebp+08]

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:0043D04D FF1574565300 Call dword ptr [00535674]

上述代码检查你输入的假注册码长度是否为12，若为12则认为是老版本的注册码，否则继续检查你输入的假注册码的前12位是否和旧版本的相同。

:0043D086 8D45C4 lea eax, dword ptr [ebp-3C] //字符串1
:0043D089 50 push eax
:0043D08A 8D857CFFFFFF lea eax, dword ptr [ebp-84] //字符串2
:0043D090 50 push eax
:0043D091 E87A0F0D00 call 0050E010 //比较字符串
:0043D096 83C420 add esp, 20
:0043D099 85C0 test eax, eax
:0043D09B 7521 jne 0043D0BE
:0043D09D 56 push esi
:0043D09E E8240F0D00 call 0050DFC7
:0043D0A3 BE00010000 mov esi, 00000100
:0043D0A8 56 push esi
:0043D0A9 E8530F0D00 call 0050E001
:0043D0AE 59 pop ecx
:0043D0AF 8BF8 mov edi, eax
:0043D0B1 59 pop ecx
:0043D0B2 56 push esi
:0043D0B3 57 push edi

* Possible Reference to String Resource ID=22006: "Invalid registration number."
"You have entered a 3.5x or 3.6x"
|
:0043D0B4 68F6550000 push 000055F6
:0043D0B9 E97BFFFFFF jmp 0043D039

如果不相同，则马上到了关键的判断（由于W32Dasm犯傻，故改用SoftICE反汇编出来的代码），总算是有点盼头了。

015F:0043D0CF 8D8790030000 LEA EAX,[EDI+00000390]
015F:0043D0D5 50 PUSH EAX //假注册码
015F:0043D0D6 E812040000 CALL 0043D4ED //核心判断
015F:0043D0DB 59 POP ECX
015F:0043D0DC 84C0 TEST AL,AL
015F:0043D0DE 59 POP ECX
015F:0043D0DF 7507 JNZ 0043D0E8
015F:0043D0E1 C745FC01000000 MOV DWORD PTR [EBP-04],00000001 //设good标志位

按F8跟进call 0043D4ED中去，可以看到这个函数写得简明扼要：

:0043D4ED 55 push ebp
:0043D4EE 8BEC mov ebp, esp
:0043D4F0 83EC18 sub esp, 00000018
:0043D4F3 E8319FFDFF call 00417429 //准备性的计算工作，不必跟进去
:0043D4F8 84C0 test al, al
:0043D4FA 7530 jne 0043D52C //这里是绝对不会跳的
:0043D4FC FF7508 push [ebp+08]
:0043D4FF 8D45E8 lea eax, dword ptr [ebp-18]
:0043D502 50 push eax
:0043D503 E8EC690B00 call 004F3EF4 //重要，必须跟进去
:0043D508 59 pop ecx
:0043D509 84C0 test al, al
:0043D50B 59 pop ecx
:0043D50C 751E jne 0043D52C
:0043D50E 8D45E8 lea eax, dword ptr [ebp-18]
:0043D511 50 push eax
:0043D512 E8889FFDFF call 0041749F //重要，必须跟进去
:0043D517 84C0 test al, al
:0043D519 59 pop ecx
:0043D51A 7510 jne 0043D52C
:0043D51C 8D45E8 lea eax, dword ptr [ebp-18]
:0043D51F 50 push eax
:0043D520 E8D56B0B00 call 004F40FA //重要，必须跟进去
:0043D525 84C0 test al, al
:0043D527 59 pop ecx
:0043D528 7502 jne 0043D52C
:0043D52A C9 leave
:0043D52B C3 ret
:0043D52C 0CFF or al, FF //bad guy
:0043D52E C9 leave
:0043D52F C3 ret

由此可知，要点在上述的3个call中。下面得改按F8，逐一分析这3个call。先跟进call 004F3EF4：

:004F3EF4 55 push ebp
:004F3EF5 8BEC mov ebp, esp
:004F3EF7 51 push ecx
:004F3EF8 53 push ebx
:004F3EF9 56 push esi
:004F3EFA 8B750C mov esi, dword ptr [ebp+0C]
:004F3EFD B02D mov al, 2D
:004F3EFF 57 push edi
:004F3F00 384601 cmp byte ptr [esi+01], al //第1个字符为'-'吗？
:004F3F03 0F85A4000000 jne 004F3FAD
:004F3F09 384607 cmp byte ptr [esi+07], al //第7个字符为'-'吗？
:004F3F0C 0F859B000000 jne 004F3FAD
:004F3F12 38460D cmp byte ptr [esi+0D], al //第13个字符为'-'吗？
:004F3F15 0F8592000000 jne 004F3FAD
:004F3F1B 384613 cmp byte ptr [esi+13], al //第19个字符为'-'吗？
:004F3F1E 0F8589000000 jne 004F3FAD
:004F3F24 384619 cmp byte ptr [esi+19], al //第25个字符为'-'吗？
:004F3F27 0F8580000000 jne 004F3FAD

:004F3F2D 56 push esi
:004F3F2E E82DA20100 call 0050E160 //求注册码长度
:004F3F33 83F81F cmp eax, 0000001F //长度为31吗？
:004F3F36 59 pop ecx
:004F3F37 7574 jne 004F3FAD

到了这里，我们就知道注册码应包含31个字符，且第1、7、13、19、25个均为横杠字符'-'。于是将假注册码改成
w-RSuhU-8bbTm-taXah-v3uMt-EDrKv（这个是可用的，呵呵），重复上面的步骤，到如下的地方。

下面是一个两重循环，在这个两重循环中，它要把你输入的假注册码的后5部分转换成5个长整数。根据其转换过程，我们知道注册码的后5部分可以看作是5个五十进制数。即RSuhU、8bbTm、taXah、v3uMt、EDrKv为5个五十进制的数，只不过最低位
在最左边。它所使用的五十进制数的表格为"abcdefhijkmnprstuvwxyzABCDEFHJKLMNPQRSTUVWXY345678"。

下面举个例子，看它如何把注册码的第2部分即五十进制数“RSuhU”转换为对应的十六进制数。
1、首先取五十进制数的最低位，即R，查表，发现R在该表中的下标为36，即五十进制中的R对应十进制中的36。用
用36乘以50的0次方，得到36。
2、再取五十进制数RSuhU的次低位，即S，查表，发现S在该表中的下标为37，即五十进制中的S对应十进制中的37。
用37乘以50的1次方，得到1850。
3、取五十进制数RSuhU的u位，查表，发现五十进制的u对应十进制的16。
用16乘以50的2次方，得到40000。
4、取五十进制数RSuhU的h位，查表，发现五十进制的h对应十进制的6。
用6乘以50的3次方，得到750000。
5、取五十进制数RSuhU的U位，查表，发现五十进制的U对应十进制的39。
用39乘以50的4次方，得到243750000。
将上述5个乘积累加，得到244541886。十进制数244541886的十六进制形式为0E9369BE，故五十进制数RSuhU对应的十六进制数为0E9369BE（当然前提是遵循Opera的作者所制定的转换规则，即使用上面的那张表）。
同理可把8bbTm、taXah、v3uMt、EDrKv转换为对应的十六进制数：04023177、023DCE97、05D430D9、068EFB70。
除了转换之外，它还限制转换后的十六进制数不得大于0x0FFFFFFF，即最高4 bit必须为0，这点在后面会用到。

:004F3F39 8B4508 mov eax, dword ptr [ebp+08]
:004F3F3C 8A0E mov cl, byte ptr [esi] //注册码的第1部分
:004F3F3E 8365FC00 and dword ptr [ebp-04], 00000000
:004F3F42 8D7E02 lea edi, dword ptr [esi+02]
:004F3F45 8808 mov byte ptr [eax], cl //把注册码的第1部分搬到另外的地方
:004F3F47 83C004 add eax, 00000004
:004F3F4A 894508 mov dword ptr [ebp+08], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3FA7(C)
|
:004F3F4D 33DB xor ebx, ebx //累加和清0
:004F3F4F C7450C01000000 mov [ebp+0C], 00000001 //50的0次方
:004F3F56 33F6 xor esi, esi //循环控制变量清0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3F8A(C)
|
:004F3F58 0FBE0437 movsx eax, byte ptr [edi+esi] //取五十进制数的一位
:004F3F5C 50 push eax
:004F3F5D FF3584D35300 push dword ptr [0053D384]
:004F3F63 E888AA0100 call 0050E9F0 //查表
:004F3F68 59 pop ecx
:004F3F69 85C0 test eax, eax
:004F3F6B 59 pop ecx
:004F3F6C 743F je 004F3FAD
:004F3F6E 2A0584D35300 sub al, byte ptr [0053D384]
:004F3F74 0FB6C0 movzx eax, al //查表所得的下标
:004F3F77 0FAF450C imul eax, dword ptr [ebp+0C] //乘以50的n次方
:004F3F7B 03D8 add ebx, eax //累加到ebx中
:004F3F7D 8B450C mov eax, dword ptr [ebp+0C]
:004F3F80 6BC032 imul eax, 00000032 //50的n次方再乘以50
:004F3F83 46 inc esi //循环控制变量++
:004F3F84 89450C mov dword ptr [ebp+0C], eax
:004F3F87 83FE05 cmp esi, 00000005 //5位全转换完了？
:004F3F8A 7CCC jl 004F3F58 //内循环
:004F3F8C F7C3000000F0 test ebx, F0000000 //转换结果不得大于0x0FFFFFFF
:004F3F92 7519 jne 004F3FAD //jump if bad guy
:004F3F94 8B4508 mov eax, dword ptr [ebp+08]
:004F3F97 FF45FC inc [ebp-04]
:004F3F9A 83450804 add dword ptr [ebp+08], 00000004
:004F3F9E 83C706 add edi, 00000006
:004F3FA1 837DFC05 cmp dword ptr [ebp-04], 00000005 //注册码的后5部分全转换完了？
:004F3FA5 8918 mov dword ptr [eax], ebx
:004F3FA7 7CA4 jl 004F3F4D //外循环
:004F3FA9 32C0 xor al, al //good guy
:004F3FAB EB02 jmp 004F3FAF

经过上面的转换，注册码的后5部分被转换成了5个十六进制数。显然上面的转换是可逆的，即给定一个十六进制数，我们可以写出其五十进制的表示。这对写注册机是有用的。下面我们继续看它如何处理这5个数。用数组a[5]表示这5个数，则下面的汇编代码可以翻译为对应的C程序：
for(k = 0; k < 4; k++)
{
a[k] ^= a[k+1];
}

* Referenced by a CALL at Address:
|:004174A3
|
:004174F3 8B442404 mov eax, dword ptr [esp+04]
:004174F7 56 push esi
:004174F8 6A04 push 00000004 //循环4次
:004174FA 83C004 add eax, 00000004
:004174FD 5A pop edx
:004174FE 8B7004 mov esi, dword ptr [eax+04] //取出a[k+1]
:00417501 8D4804 lea ecx, dword ptr [eax+04]
:00417504 3130 xor dword ptr [eax], esi //与a[k]异或
:00417506 4A dec edx
:00417507 8BC1 mov eax, ecx
:00417509 75F3 jne 004174FE //循环
:0041750B 32C0 xor al, al
:0041750D 5E pop esi
:0041750E C3 ret

由于异或运算是可逆的，因此上面的变换也可逆。我们继续看它如何处理异或过的这5个数。接下来将是一个大的异或变换，不过不用担心，这个变换仍是可逆的。如下：

* Referenced by a CALL at Address:
|:004174B4
|
:004174C4 56 push esi
:004174C5 57 push edi
:004174C6 33FF xor edi, edi //循环控制变量edi清0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004174EC(C)
|
:004174C8 6A05 push 00000005
:004174CA 8BC7 mov eax, edi
:004174CC 33D2 xor edx, edx
:004174CE 59 pop ecx
:004174CF F7F1 div ecx //循环控制变量edi对5求余
:004174D1 8B44240C mov eax, dword ptr [esp+0C]
:004174D5 6A00 push 00000000
:004174D7 8D749004 lea esi, dword ptr [eax+4*edx+04]
:004174DB E870FFFFFF call 00417450 //取常数数列的下一项
:004174E0 25FFFFFF0F and eax, 0FFFFFFF //屏蔽掉高4个bit
:004174E5 59 pop ecx
:004174E6 3106 xor dword ptr [esi], eax //与a[edi % 5]异或
:004174E8 47 inc edi //循环控制变量加1
:004174E9 83FF65 cmp edi, 00000065
:004174EC 72DA jb 004174C8 //继续循环
:004174EE 5F pop edi
:004174EF 32C0 xor al, al
:004174F1 5E pop esi
:004174F2 C3 ret

上面的汇编代码可翻译为如下的伪码：
for(edi = 0; edi < 0x65; edi++)
{
NextNumber = GetNumberFromSequence( );
NextNumber &= 0x0FFFFFFF;
a[edi % 5] ^= NextNumber;
}
即用一个常数数列的前0x65项来分别与我们在上一步所得到的5个数进行异或。这个循环的异或过程可以等价于：
a[0] ^= 常数1；
a[1] ^= 常数2；
a[2] ^= 常数3；
a[3] ^= 常数4；
a[4] ^= 常数5；
其中上述5个常数是可以求出来的，因为所用到的常数数列是确定的，跟进call 00417450就可以看清常数数列的计算过程。
用Sequence[n]表示该数列的第n项，则call 00417450的作用就是根据Sequence[n]计算出Sequence[n+1]来，相当于数列的递推公式，如下所示。

:0041745C 8B0D50625400 mov ecx, dword ptr [00546250] //取出Sequence[n]
:00417462 8BC1 mov eax, ecx
:00417464 8D1409 lea edx, dword ptr [ecx+ecx]
:00417467 24FE and al, FE
:00417469 33C2 xor eax, edx
:0041746B 8BD1 mov edx, ecx
:0041746D D1E0 shl eax, 1
:0041746F 83E2FC and edx, FFFFFFFC
:00417472 33C2 xor eax, edx
:00417474 8BD1 mov edx, ecx
:00417476 C1E002 shl eax, 02
:00417479 83E2F0 and edx, FFFFFFF0
:0041747C 33C2 xor eax, edx
:0041747E 8BD1 mov edx, ecx
:00417480 C1E002 shl eax, 02
:00417483 83E2C0 and edx, FFFFFFC0
:00417486 33C2 xor eax, edx
:00417488 8BD1 mov edx, ecx
:0041748A C1E019 shl eax, 19
:0041748D 81E200000080 and edx, 80000000
:00417493 33C2 xor eax, edx
:00417495 D1E9 shr ecx, 1
:00417497 0BC1 or eax, ecx
:00417499 A350625400 mov dword ptr [00546250], eax //保存Sequence[n+1]
:0041749E C3 ret

看一下DS:[00546250]中存放的初始值，就知道Sequence[0] = 0x01A26A75。根据异或运算的结合律，可以知道：
常数1 = (Sequence[1] ^ Sequence[6] ^ ... ^ Sequence[96] ^ Sequence[101]) & 0x0FFFFFFF
常数2 = (Sequence[2] ^ Sequence[7] ^ ... ^ Sequence[97]) & 0x0FFFFFFF
常数3 = (Sequence[3] ^ Sequence[8] ^ ... ^ Sequence[98]) & 0x0FFFFFFF
常数4 = (Sequence[4] ^ Sequence[9] ^ ... ^ Sequence[99]) & 0x0FFFFFFF
常数5 = (Sequence[5] ^ Sequence[10] ^ ... ^ Sequence[100]) & 0x0FFFFFFF

经过了上面的循环异或后，我们再来看看它下面是怎么处理的。运算了半天，总该判断一下了吧。
在如下的代码中，它要判断注册码的第2部分。

* Referenced by a CALL at Address:
|:004F4107
|
:004F3FB4 55 push ebp
:004F3FB5 8BEC mov ebp, esp
:004F3FB7 83EC18 sub esp, 00000018
:004F3FBA 8B4508 mov eax, dword ptr [ebp+08]
:004F3FBD 56 push esi
:004F3FBE 8B750C mov esi, dword ptr [ebp+0C]
:004F3FC1 57 push edi
:004F3FC2 BA000000F0 mov edx, F0000000 //掩码，用来提取一个数的高4bit（即28～31 bit）
:004F3FC7 8B4E08 mov ecx, dword ptr [esi+08] //取出a[1]
:004F3FCA 89480C mov dword ptr [eax+0C], ecx
:004F3FCD 8B4E0C mov ecx, dword ptr [esi+0C] //取出a[2]
:004F3FD0 894810 mov dword ptr [eax+10], ecx
:004F3FD3 8B4E10 mov ecx, dword ptr [esi+10] //取出a[3]
:004F3FD6 894814 mov dword ptr [eax+14], ecx
:004F3FD9 8B4E14 mov ecx, dword ptr [esi+14] //取出a[4]
:004F3FDC 894818 mov dword ptr [eax+18], ecx
:004F3FDF 8B4E04 mov ecx, dword ptr [esi+04] //取出a[0]
:004F3FE2 C1E104 shl ecx, 04 //a[0]左移4位
:004F3FE5 8BF9 mov edi, ecx
:004F3FE7 23FA and edi, edx //与掩码相与
:004F3FE9 09780C or dword ptr [eax+0C], edi //把a[0]的4个bit分给a[1]
:004F3FEC C1E104 shl ecx, 04 //a[0]再左移4位
:004F3FEF 8BF9 mov edi, ecx
:004F3FF1 23FA and edi, edx //与掩码相与
:004F3FF3 097810 or dword ptr [eax+10], edi //把a[0]的4个bit分给a[2]
:004F3FF6 C1E104 shl ecx, 04 //a[0]再左移4位
:004F3FF9 8BF9 mov edi, ecx
:004F3FFB 23FA and edi, edx //与掩码相与
:004F3FFD 097814 or dword ptr [eax+14], edi //把a[0]的4个bit分给a[3]
:004F4000 C1E104 shl ecx, 04 //a[0]再左移4位
:004F4003 8BF9 mov edi, ecx
:004F4005 23FA and edi, edx //与掩码相与
:004F4007 BA000F0000 mov edx, 00000F00 //另一个掩码，用来提取一个数的第8～11 bit
:004F400C 097818 or dword ptr [eax+18], edi //把a[0]的4个bit分给a[4]
:004F400F C1E910 shr ecx, 10 //a[0]再右移16位
:004F4012 8BF9 mov edi, ecx
:004F4014 23FA and edi, edx //与掩码相与，
:004F4016 3BFA cmp edi, edx //与掩码比较！
:004F4018 752E jne 004F4048 //jump if bad guy
:004F401A 8BD1 mov edx, ecx
:004F401C 83E101 and ecx, 00000001 //与另一掩码相与，提取最低bit（即第0 bit）
:004F401F D1EA shr edx, 1 //右移一位，等于去掉了原来的第0 bit
:004F4021 6A06 push 00000006
:004F4023 83E27F and edx, 0000007F //与掩码7F相与，提取出最低的7个bit
:004F4026 8908 mov dword ptr [eax], ecx //保存第0个bit，以后再判断
:004F4028 59 pop ecx
:004F4029 8D7DE8 lea edi, dword ptr [ebp-18]
:004F402C 895008 mov dword ptr [eax+08], edx //保存7个bit，以后再判断
:004F402F F3 repz
:004F4030 A5 movsd

上面有很多位运算，实际上是在对a[0]进行五马分尸，要把a[0]的28个bit共拆分为7个部分（a[0]的最高4个bit均为0，故不考虑在内）。详细说明如下：
假定十六进制表示为：
a[0] = 0MNYZUVW，a[1] = 0xxxxxxx，a[2] = 0yyyyyyy，a[3] = 0zzzzzzz，a[4] = 0kkkkkkk。
则将a[0]拆分为7部分后，变为：
a[1] = Mxxxxxxx，a[2] = Nyyyyyyy，a[3] = Yzzzzzzz，a[4] = Zkkkkkkk。
即a[0]给了a[1]、a[2]、a[3]、a[4]各4个bit（即M、N、Y、Z）作为他们的最高4个bit。另外，a[0]的最低8个bit（即VW）被拆分为两部分，一部分只有一个bit，另外一部分有7个bit，并分别保存起来，后面它要对这两部分进行判断，此为后话。
a[0]的另外4个bit（即U）在上面的CS:004F4016处进行了判断，如果满足a[0] & 00000F00 = 00000F00，则OK，由此可知 a[0]的第8～11 bit均应为1（即U = F）。

经过这一番折腾，它把a[0]瓜分了，显然是想分散我们的注意力，只要我们漏过a[0]的7部分中的任一部分，有效的注册码就找不到。

还记不记得注册码的第1部分只有一个字符？接下来它就要对注册码的第1部分进行查表变换。

:004F4031 0FB655E8 movzx edx, byte ptr [ebp-18] //取出注册码的第1部分
:004F4035 33C9 xor ecx, ecx //下标清0

:004F4037 0FBEB180D35300 movsx esi, byte ptr [ecx+0053D380]//查表，从表"emuw"中取出一个字符
:004F403E 3BF2 cmp esi, edx //和注册码的第一部分相等？
:004F4040 740A je 004F404C //相等则将下标记下来
:004F4042 41 inc ecx //下标加1
:004F4043 83F903 cmp ecx, 00000003 //该表中仅4个字符
:004F4046 7EEF jle 004F4037 //循环，遍历该表

:004F4048 0CFF or al, FF //bad guy
:004F404A EB05 jmp 004F4051
:004F404C 894804 mov dword ptr [eax+04], ecx //保存此时的下标
:004F404F 32C0 xor al, al //good guy
:004F4051 5F pop edi
:004F4052 5E pop esi
:004F4053 C9 leave
:004F4054 C3 ret

由上可见，如果你输入的假注册码的第一个字符如果不是e或m或u或w，则bye-bye了。否则它就记下该下标，此后要对这个下标进行判断，耐心等等，后面还会提到。

接下来，它要根据a[1]、a[2]、a[3]计算出一个数来，然后和a[4]进行比较。至此我们知道a[4]是根据a[1]、a[2]、a[3]计算出来的，这对写注册机很重要。计算没什么特别的地方，照搬到我们的注册机中，稍加改动即可。计算过程如下：

* Referenced by a CALL at Address:
|:004F411A
|
:004F4055 55 push ebp
:004F4056 8BEC mov ebp, esp
:004F4058 83EC0C sub esp, 0000000C
:004F405B 8B4D08 mov ecx, dword ptr [ebp+08]
:004F405E 53 push ebx
:004F405F 56 push esi
:004F4060 33F6 xor esi, esi
:004F4062 8B4104 mov eax, dword ptr [ecx+04]
:004F4065 57 push edi
:004F4066 40 inc eax
:004F4067 C745FC79786573 mov [ebp-04], 73657879
:004F406E C745F865626162 mov [ebp-08], 62616265
:004F4075 8945F4 mov dword ptr [ebp-0C], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40DF(C)
|
:004F4078 8BC6 mov eax, esi
:004F407A 6A03 push 00000003
:004F407C 99 cdq
:004F407D 5F pop edi
:004F407E F7FF idiv edi
:004F4080 46 inc esi
:004F4081 6A03 push 00000003
:004F4083 8BC6 mov eax, esi
:004F4085 5B pop ebx
:004F4086 8B7C910C mov edi, dword ptr [ecx+4*edx+0C]
:004F408A 99 cdq
:004F408B F7FB idiv ebx
:004F408D 8B45F4 mov eax, dword ptr [ebp-0C]
:004F4090 85C0 test eax, eax
:004F4092 8B54910C mov edx, dword ptr [ecx+4*edx+0C]
:004F4096 7E37 jle 004F40CF
:004F4098 8B5DFC mov ebx, dword ptr [ebp-04]
:004F409B 894508 mov dword ptr [ebp+08], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40AA(C)
|
:004F409E 8BC3 mov eax, ebx
:004F40A0 0FAFC3 imul eax, ebx
:004F40A3 33C7 xor eax, edi
:004F40A5 FF4D08 dec [ebp+08]
:004F40A8 8BD8 mov ebx, eax
:004F40AA 75F2 jne 004F409E
:004F40AC 895DFC mov dword ptr [ebp-04], ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40D2(U)
|
:004F40AF 8B4108 mov eax, dword ptr [ecx+08]
:004F40B2 83C003 add eax, 00000003
:004F40B5 85C0 test eax, eax
:004F40B7 7E1B jle 004F40D4
:004F40B9 894508 mov dword ptr [ebp+08], eax
:004F40BC 8B45F8 mov eax, dword ptr [ebp-08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40CB(C)
|
:004F40BF 8BF8 mov edi, eax
:004F40C1 0FAFF8 imul edi, eax
:004F40C4 33FA xor edi, edx
:004F40C6 FF4D08 dec [ebp+08]
:004F40C9 8BC7 mov eax, edi
:004F40CB 75F2 jne 004F40BF
:004F40CD EB0A jmp 004F40D9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4096(C)
|
:004F40CF 8B5DFC mov ebx, dword ptr [ebp-04]
:004F40D2 EBDB jmp 004F40AF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40B7(C)
|
:004F40D4 8B45F8 mov eax, dword ptr [ebp-08]
:004F40D7 EB03 jmp 004F40DC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40CD(U)
|
:004F40D9 8945F8 mov dword ptr [ebp-08], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F40D7(U)
|
:004F40DC 83FE1F cmp esi, 0000001F
:004F40DF 7C97 jl 004F4078
:004F40E1 81E3F0F0F000 and ebx, 00F0F0F0 //最高4 bit被干掉了
:004F40E7 250F0F0F0F and eax, 0F0F0F0F //最高4 bit被干掉了
:004F40EC 0BD8 or ebx, eax
:004F40EE 8B450C mov eax, dword ptr [ebp+0C]
:004F40F1 5F pop edi
:004F40F2 5E pop esi
:004F40F3 8918 mov dword ptr [eax], ebx //保存计算的结果
:004F40F5 32C0 xor al, al
:004F40F7 5B pop ebx
:004F40F8 C9 leave
:004F40F9 C3 ret

注意上面的注释！在CS:004F40E1和CS:004F40E7这两处，最高4个bit都被变为0了，这意味着计算出来的这个数的最高4 bit全部为0。但是它又要拿这个计算出来的数和a[4]进行比较，那说明此时a[4]的最高4 bit也必须为0。
还记不记得此时a[4]的最高4 bit是从a[0]中分来的（十六进制形式为Zkkkkkkk）！至此我们又搞定a[0]的7部分
中的一部分。

下面是和a[4]进行比较：

:004F4112 8D4508 lea eax, dword ptr [ebp+08]
:004F4115 50 push eax
:004F4116 8D45E4 lea eax, dword ptr [ebp-1C]
:004F4119 50 push eax
:004F411A E836FFFFFF call 004F4055 //根据a[1]、a[2]、a[3]计算
:004F411F 59 pop ecx
:004F4120 84C0 test al, al
:004F4122 59 pop ecx
:004F4123 7528 jne 004F414D
:004F4125 8B45FC mov eax, dword ptr [ebp-04]
:004F4128 3B4508 cmp eax, dword ptr [ebp+08] //和a[4]比较
:004F412B 7520 jne 004F414D

紧跟着它要判断a[1]、a[2]、a[3]了，如下：

* Referenced by a CALL at Address:
|:004F4131
|
:004F4155 8B442404 mov eax, dword ptr [esp+04]
:004F4159 56 push esi
:004F415A BE74D35300 mov esi, 0053D374
:004F415F 8D480C lea ecx, dword ptr [eax+0C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4178(C)
|
:004F4162 8B01 mov eax, dword ptr [ecx] //取出a[k]，k=1,2,3
:004F4164 33D2 xor edx, edx
:004F4166 F736 div dword ptr [esi] //分别除以常数
:004F4168 85D2 test edx, edx //余数不为0则bad guy
:004F416A 7512 jne 004F417E
:004F416C 83C604 add esi, 00000004
:004F416F 83C104 add ecx, 00000004 //余数为0则继续比较
:004F4172 81FE80D35300 cmp esi, 0053D380
:004F4178 7CE8 jl 004F4162 //循环
:004F417A 32C0 xor al, al //a[1]、a[2]、a[3]均通过检查则OK
:004F417C 5E pop esi
:004F417D C3 ret

由上可知，此时的a[1]、a[2]、a[3]应为常数的整数倍，执行上面的那条除法指令时敲dd esi，可以看见常数分别为00114BCF, 0x0013D39F, 0x003687A9。至于究竟是多少倍，我们写注册机的时候可以用随机数（我用GetTickCount模拟随机数），这也说明这个软件有很多个注册码。注意到此时的a[1]、a[2]、a[3]的最高4 bit都是从a[0]中分来的一杯羹，于是我们又搞定了a[0]的7部分之中的3部分。

至此，我们已经可以写程序生成a[1]、a[2]、a[3]，然后再生成a[4]，现在只剩下a[0]的7部分中的两部分（即最低8bit位，分成7个bit和1个bit共两部分）和注册码的第一部分（即查表后的下标）了。

下面就是对这3个东西的判断：

:004F412D 8D45E4 lea eax, dword ptr [ebp-1C]
:004F4130 50 push eax
:004F4131 E81F000000 call 004F4155 //这里头检查a[1]、a[2]、a[3]
:004F4136 84C0 test al, al
:004F4138 59 pop ecx
:004F4139 7512 jne 004F414D
:004F413B 837DE400 cmp dword ptr [ebp-1C], 00000000 //a[0]的最低bit，即第0bit
:004F413F 750C jne 004F414D
:004F4141 837DE803 cmp dword ptr [ebp-18], 00000003 //注册码的第1部分所对应的下标
:004F4145 7506 jne 004F414D
:004F4147 837DEC02 cmp dword ptr [ebp-14], 00000002 //a[0]的第1～7bit
:004F414B 7404 je 004F4151

根据上面的比较可知，注册码的第一部分在表格"emuw"中的下标应为3，即注册码的第一个字符固定为w；
a[0]的最低8个bit用十六进制表示为0x04，结合前面我们得到的关于a[0]的信息，就可以把a[0]表示出来了。

至此可以写出注册机。（累死了，呵呵）

为保持完整性，把注册机再贴一下：

//keygen for Opera 4.0 Final
//compiled with Visual C++ 5

#include <stdio.h>
#include <windows.h>

unsigned long Sequence;
const unsigned long factor[3] = { 0x00114BCF, 0x0013D39F, 0x003687A9 };
const char table[50] = "abcdefhijkmnprstuvwxyzABCDEFHJKLMNPQRSTUVWXY345678";
int k, m;
unsigned long a[5];
long EBP_04, EBP_08, EBP_0C, EBP_p08;

void main(void)
{

printf("Key generator for Opera 4.0 final.\n");
printf("http://www.opera.com.\n");
printf("coded by dr0, 2000.6.30.\n");

for (k = 1; k <= 3; k++)
{
a[k] = factor[k-1] * (GetTickCount( ) % (0xFFFFFFFFL / factor[k-1] + 1));
}

_asm
{
push eax
push ebx
push ecx
push edx
push esi
push edi

mov ecx, offset a

XOR ESI,ESI
MOV EAX,0x03
INC EAX
MOV DWORD PTR [EBP_04],0x73657879L
MOV DWORD PTR [EBP_08],0x62616265L
MOV [EBP_0C],EAX
_004F4078: MOV EAX,ESI
PUSH 0x03
CDQ
POP EDI
IDIV EDI
INC ESI
PUSH 0x03
MOV EAX,ESI
POP EBX
MOV EDI,[EDX*4+ECX+4]
CDQ
IDIV EBX
MOV EAX,[EBP_0C]
TEST EAX,EAX
MOV EDX,[EDX*4+ECX+4]
JLE _004F40CF
MOV EBX,[EBP_04]
MOV [EBP_p08],EAX
_004F409E: MOV EAX,EBX
IMUL EAX,EBX
XOR EAX,EDI
DEC DWORD PTR [EBP_p08]
MOV EBX,EAX
JNZ _004F409E
MOV [EBP_04],EBX
_004F40AF: MOV EAX,0x02
ADD EAX,0x03
TEST EAX,EAX
JLE _004F40D4
MOV [EBP_p08],EAX
MOV EAX,[EBP_08]
_004F40BF: MOV EDI,EAX
IMUL EDI,EAX
XOR EDI,EDX
DEC DWORD PTR [EBP_p08]
MOV EAX,EDI
JNZ _004F40BF
JMP _004F40D9
_004F40CF: MOV EBX,[EBP_04]
JMP _004F40AF
_004F40D4: MOV EAX,[EBP_08]
JMP _004F40DC
_004F40D9: MOV [EBP_08],EAX
_004F40DC: CMP ESI,0x1F
JL _004F4078
AND EBX,0x00F0F0F0L
AND EAX,0x0F0F0F0FL
OR EBX,EAX

mov [ecx+4*4], ebx

pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
}

a[0] = 0;
for (k = 1; k <= 3; k++)
{
a[0] |= a[k] >> 28;
a[0] <<= 4;
}
a[0] <<= 12;
a[0] |= 0x00000F04L;

for (k = 0; k < 4; k++)
{
a[k] &= 0x0FFFFFFFL;
}

Sequence = 0x01A26A75;
for(k = 0; k < 0x65; k++)
{
_asm
{
push eax
push ecx
push edx

MOV ECX, [Sequence]
MOV EAX, ECX
LEA EDX, [ECX+ECX]
AND AL, 0xFE
XOR EAX, EDX
MOV EDX, ECX
SHL EAX, 1
AND EDX, -0x04
XOR EAX, EDX
MOV EDX, ECX
SHL EAX, 0x02
AND EDX, -0x10
XOR EAX, EDX
MOV EDX, ECX
SHL EAX, 0x02
AND EDX, -0x40
XOR EAX, EDX
MOV EDX, ECX
SHL EAX, 0x19
AND EDX, 0x80000000
XOR EAX, EDX
SHR ECX, 1
OR EAX, ECX
MOV [Sequence], EAX

pop edx
pop ecx
pop eax
}

a[k % 5] ^= (Sequence & 0x0FFFFFFFL);
}

for (k = 3; k >= 0; k--)
{
a[k] ^= a[k+1];
}

printf("Your code is: ");
putchar('w');
for(k = 0; k < 5; k++)
{
putchar('-');
for(m = 0; m < 5; m++)
{
putchar(table[a[k] % 50L]);
a[k] /= 50L;
}
}

printf("\n");
}


PacMania v1.5

 标 题:初学者(27) (1千字)
发信人:liutong
时 间:2000-8-25 23:56:18
详细信息:
软件名称：PacMania
版本：v1.5
文件大小：2.1MB
软件简介：一个更新了的大嘴吃豆的游戏。

注册后无成功与否的提示.
没办法只好用W32DASM
在string data reference中找到"Registered to",双击找到下面的程序

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045275A(C)
|
:004527C1 8B460C mov eax, dword ptr [esi+0C]
:004527C4 BA10000000 mov edx, 00000010
:004527C9 E8A219FCFF call 00414170
:004527CE 803D2C68450000 cmp byte ptr [0045682C], 00
:004527D5 7430 je 00452807
:004527D7 80BBB002000002 cmp byte ptr [ebx+000002B0], 02
:004527DE 753A jne 0045281A
:004527E0 8D45FC lea eax, dword ptr [ebp-04]
:004527E3 8B0DD0714500 mov ecx, dword ptr [004571D0]

* Possible StringData Ref from Code Obj ->"Registered to "
|
:004527E9 BA84284500 mov edx, 00452884
:004527EE E88912FBFF call 00403A7C
:004527F3 8B45FC mov eax, dword ptr [ebp-04]
:004527F6 50 push eax
:004527F7 33C9 xor ecx, ecx
:004527F9 BA0A000000 mov edx, 0000000A
:004527FE 8BC6 mov eax, esi
:00452800 E80326FCFF call 00414E08
:00452805 EB13 jmp 0045281A

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

* Possible StringData Ref from Code Obj ->"Unregistered"
|
:00452807 689C284500 push 0045289C
:0045280C 33C9 xor ecx, ecx
:0045280E BA0A000000 mov edx, 0000000A
:00452813 8BC6 mov eax, esi
:00452815 E8EE25FCFF call 00414E08

显然在0045682C中存的是注册标志,查找0045682C,将相关的跳转修改即可.


Particle Fire V1.1a

标 题:Particle Fire V1.1a
发信人:程式猎人
时 间:2000年6月5日
详细信息:

简介：这是一个相当好的屏幕保护程序。
追踪：RN:01234567
这个软件的破解过程对于初学者来说有一定的难度，因为通常的软件在注册过程中就可以看到它的比较过程，而这个软件它不是输入注册码后就进行比较的。它是在软件运算的过程中不断的去比较，所以这个软件在难度上应当属于中级水平。
因为这个软件是当你输入正确的注册码后才注册成功也就是它使用实时检证的方法，所以现在先输入0123456后，再设bpx hmemcpy后，输入7后被拦下。

:0040254F FFD7 call edi
:00402551 85C0 test eax, eax <-出来的地方，eax=0012d687
:00402553 7423 je 00402578
:00402555 8D442410 lea eax, dword ptr [esp+10]
:00402559 6A00 push 00000000
:0040255B 50 push eax
:0040255C 68F0030000 push 000003F0
:00402561 56 push esi
:00402562 FFD7 call edi
:00402564 5D pop ebp
:00402565 A314214100 mov dword ptr [00412114], eax <-eax=12d687

* Possible Reference to String Resource ID=00001: "Particle Fire!"
|
:0040256A B801000000 mov eax, 00000001
:0040256F 5F pop edi
:00402570 5E pop esi
:00402571 5B pop ebx
:00402572 83C414 add esp, 00000014
:00402575 C21000 ret 0010

我们在上面的地方被拦下来，仔细分析一下上面的程式，你可以发现在上面程式将我们输入的注册码放在了00412114这个固定地址上。如果你现在向下追踪的话，你将是一无发现，因为程序就如我在前面所说的那样，它不是在下面就进行比较，而是在某个时间来进行比较的。
现在我们就得使用W32dasm来分析这个软件，查找00412114这个地址，我们将找到几个地址，其中下面的地址是关键的地方，如下所示：

:00402726 A114214100 mov eax, dword ptr [00412114]
:0040272B 50 push eax
:0040272C E8CFE8FFFF call 00401000
:00402731 83C404 add esp, 00000004
:00402734 85C0 test eax, eax
:00402736 0F852D030000 jne 00402A69
在这里可是这个软件的比较关键之处，而且如果你在这里设下断点的话，你将无法回到正常的地方，因为程序一值在调用它，用它来不断的验证注册码的正确性。下面是这个软件如何计算注册码的。因为它使用了令人讨厌的XOR操作，而我使用C语言又没有将它给算出来（可能C语言处理XOR时有问题）。

:00401000 8B442404 mov eax, dword ptr [esp+04]
:00401004 56 push esi
:00401005 3D00CA9A3B cmp eax, 3B9ACA00 <-1000000000
:0040100A 763D jbe 00401049
:0040100C 3D00943577 cmp eax, 77359400 <-2000000000
:00401011 7336 jnb 00401049
:00401013 8BC8 mov ecx, eax
:00401015 8BF0 mov esi, eax
:00401017 C1E114 shl ecx, 14
:0040101A 8BD0 mov edx, eax
:0040101C C1E610 shl esi, 10
:0040101F 81E10000F0FF and ecx, FFF00000
:00401025 C1EA10 shr edx, 10
:00401028 0BF2 or esi, edx
:0040102A 2BD2 sub edx, edx
:0040102C 33F1 xor esi, ecx
:0040102E 8BC8 mov ecx, eax
:00401030 C1E90C shr ecx, 0C
:00401033 33F1 xor esi, ecx
:00401035 B994260000 mov ecx, 00002694
:0040103A 33C6 xor eax, esi
:0040103C F7F1 div ecx
:0040103E 85D2 test edx, edx
:00401040 7507 jne 00401049 ***

* Possible Reference to String Resource ID=00001: "Particle Fire!"
|
:00401042 B801000000 mov eax, 00000001
:00401047 5E pop esi
:00401048 C3 ret

好了，现在我使用修改方法来进行这个软件注册，我在这里先输入1234567890后，再修改***处，具体方法如下：

****************************
* 查找：85 D2 75 07 B8 *
* 替换：85 D2 90 90 B8 *
****************************
我现在想同大家说的是，我因为没有得到这个软件的注册码而不死心，毕竟我离注册码只有一步之隔，因为我已经知道了这个软件是如何运算的过程。于是我就使用C语言编写了下面的程序，我准备使用穷举法来得到注册码。但是通过下面的程序算出来的注册码是不对的，我仔细的验证了我编写的过程，相信它是绝对没有错误的，所以在这里想请高手来帮助一下，如何能够得到这个软件的注册码（你不论使用什么语言都可以）。

main()
{
unsigned long i,j;
unsigned long eax,ebx,ecx,edx;

clrscr();

for(i=0x3b9aca00;i<0x4190ab00;i++)
{
eax=i<<16;
ebx=i>>16;
ecx=eax|ebx;

eax=i<<20;
ebx=i>>12;
edx=eax|ebx;

eax=ecx|edx|i;

j=eax%0x2694;
if(j==0)
{
printf("\n Your register number is %lx",i);
break;
}
}
printf("\n your seach is over!!!");
getch();
}

声明：此文可以自由拷贝，散发和传播，如果你认为有错误的地方你可以将改正后发表在网上，但是请不要将原作者的名字删除或改变，你可以加上你修改后作者名字，并希望你能将修改的文章发给本人。如果愿意同我讨论的话，可以向下面的邮箱写信。我将非常高兴同你讨论关于解密方面的事情，谢谢。（千万不要给我发病毒或黑客程序啊）
邮箱：programhunter@china.com

附：论坛回应：

序 号:1182
标 题:穷举程序如下：
发信人:郭大志
时 间:2000-6-6 13:23:08
详细信息:

关于Particle Fire， 作者的破解思路是对的，就是用穷举的方法猜注册码，我以前也是这么干的 ，如果不用穷举法，就要求解一个逻辑（主要是异或运算）方程组，而这是相当困难的。实际上对这个屏保程序的注册码的穷举法速度很快。以前在水木清华的某个版（newsoftware还是hacker版记不清了）发过一个穷举注册码的程序。

在城市猎人的程序的基础上修改的。找到的一个最小的注册码为1000002675，适用于v1.1a。

#include <stdio.h>

void main(void)
{
unsigned long i;
unsigned long eax;

for(i = 0x3b9aca00; i < 0x7190ab00; i++)
{

eax = (i >> 16) | (i << 16);
eax ^= (i << 20);
eax ^= (i >> 12);
eax ^= i;

eax %= 0x2694;
if(eax == 0)
{
printf("\nYour register number is %lu",i);
break;
}
}
printf("\n your search is over!!!");
}


Pegtop XFader 4.02

 标 题:初学者(18) (2千字)
发信人:liutong
时 间:2000-7-5 22:16:20
详细信息:
Pegtop XFader
Version 4.02 - 08 May 2000
--------------------------
XFader creates seamless textures from any image you want.
It's easy to manipulate wallpapers and other images.
Useful for backgrounds of websites, your Windows desktop
or to generate textures for 3D rendering.
--------------------------
Visit our website at "www.pegtop.de"

注册码

设断点bpx hmemcpy
程序被中断后,按F12键12次,在此处用d eax可看到输入的注册码.
再设断点bpx eax,当程序再次被中断时,是一比较语句,用d esi
和d edi可看到输入的注册码和实际的注册码.

下面是注册码生成过程:
用户名:LiuTong
程序首先将用户名转成大写:LIUTONG(对应HEX为4C 49 55 54 4F 4E 47)
再将用户名补足为8个字符:LIUTONGL(对应HEX为4C 49 55 54 4F 4E 47 4C)
此8个子符与系统内部的8个子符组合成:
序号 1 2 3 4 5 6 7 8 | 9 A B C D E F 10
P X F 1 2 O K T | L I U T O N G L
50 58 46 31 32 4F 4B 54| 4C 49 55 54 4F 4E 47 4C
系统内部字符 <--------|------->用户名

系统内部另有8组数据:
1 3 5 7 根据此行数据计算得到第1位注册码
2 4 A C 根据此行数据计算得到第2位注册码
9 B D F 根据此行数据计算得到第3位注册码
6 8 E 10 根据此行数据计算得到第4位注册码
1 10 2 F 根据此行数据计算得到第5位注册码
3 E 4 D 根据此行数据计算得到第6位注册码
5 C 6 B 根据此行数据计算得到第7位注册码
7 A 8 9 根据此行数据计算得到第8位注册码

举例说明:

50 XOR 46 -->16 ROL 32 -->58 XOR 4B -->13 除 0A 余数 9
58 XOR 31 -->69 ROL 49 -->D2 XOR 54 -->86 除 0A 余数 4
4C XOR 55 -->19 ROL 4F -->8C XOR 47 -->CB 除 0A 余数 3
4F XOR 54 -->1B ROL 4E -->C6 XOR 4C -->8A 除 0A 余数 8
50 XOR 4C -->1C ROL 58 -->1C XOR 47 -->5B 除 0A 余数 1
46 XOR 4E -->08 ROL 31 -->10 XOR 4F -->5F 除 0A 余数 5
32 XOR 54 -->66 ROL 4F -->33 XOR 55 -->66 除 0A 余数 2
4B XOR 49 -->02 ROL 54 -->20 XOR 4C -->6C 除 0A 余数 8
| | | |
| | | --第4列数字作为序号从上面16个子符中选出的HEX码
| | --第3列数字作为序号从上面16个子符中选出的HEX码
| --第2列数字作为序号从上面16个子符中选出的HEX码
--第1列数字作为序号从上面16个子符中选出的HEX码

整理
用户名:LiuTong
注册码:94381528

标 题:初学者(18-2) (1千字)
发信人:liutong
时 间:2000-7-5 23:08:41
详细信息:

Pegtop WaterWall
Version 4.00 - 20 Oct 1999

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

WaterWall is a wallpaper manager for you desktop including various
style effects, a slide show, sounds and more.

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

Visit our website at "www.pegtop.de"
注册码

设断点bpx hmemcpy
程序被中断后,按F12键12次,在此处用d eax可看到输入的注册码.
再设断点bpx eax,当程序再次被中断时,是一比较语句,用d esi
和d edi可看到输入的注册码和实际的注册码.

下面是注册码生成过程:
用户名:LiuTong
程序首先将用户名转成大写:LIUTONG(对应HEX为4C 49 55 54 4F 4E 47)
再将用户名补足为8个字符:LIUTONGL(对应HEX为4C 49 55 54 4F 4E 47 4C)
此8个子符与系统内部的8个子符组合成:
序号 1 2 3 4 5 6 7 8 | 9 A B C D E F 10
P W W 2 4 J A N | L I U T O N G L
50 57 57 32 34 4A 41 4E| 4C 49 55 54 4F 4E 47 4C
系统内部字符 <--------|------->用户名

系统内部另有8组数据:
1 3 5 7 根据此行数据计算得到第1位注册码
2 4 A C 根据此行数据计算得到第2位注册码
9 B D F 根据此行数据计算得到第3位注册码
6 8 E 10 根据此行数据计算得到第4位注册码
1 10 2 F 根据此行数据计算得到第5位注册码
3 E 4 D 根据此行数据计算得到第6位注册码
5 C 6 B 根据此行数据计算得到第7位注册码
7 A 8 9 根据此行数据计算得到第8位注册码

整理
用户名:LiuTong
注册码:98373328

标 题:初学者(18-3) (1千字)
发信人:liutong
时 间:2000-7-5 23:09:48
详细信息:

Pegtop Flagimation

Version 1.05 - 11 Dec 1999

Flagimation creates animated 3D flags you can save as gif images.
Just copy Flagimation.exe to your harddisk and execute it.

Visit our homepage at "www.pegtop.de"

挺有意思的程序

注册码

设断点bpx hmemcpy
程序被中断后,按F12键12次,在此处用d eax可看到输入的注册码.
再设断点bpx eax,当程序再次被中断时,是一比较语句,用d esi
和d edi可看到输入的注册码和实际的注册码.

下面是注册码生成过程:
用户名:LiuTong
程序首先将用户名转成大写:LIUTONG(对应HEX为4C 49 55 54 4F 4E 47)
再将用户名补足为8个字符:LIUTONGL(对应HEX为4C 49 55 54 4F 4E 47 4C)
此8个子符与系统内部的8个子符组合成:
序号 1 2 3 4 5 6 7 8 | 9 A B C D E F 10
P F L 2 8 J U L | L I U T O N G L
50 46 4C 32 38 4A 55 4C| 4C 49 55 54 4F 4E 47 4C
系统内部字符 <--------|------->用户名

系统内部另有8组数据:
1 3 5 7 根据此行数据计算得到第1位注册码
2 4 A C 根据此行数据计算得到第2位注册码
9 B D F 根据此行数据计算得到第3位注册码
6 8 E 10 根据此行数据计算得到第4位注册码
1 10 2 F 根据此行数据计算得到第5位注册码
3 E 4 D 根据此行数据计算得到第6位注册码
5 C 6 B 根据此行数据计算得到第7位注册码
7 A 8 9 根据此行数据计算得到第8位注册码

计算方法同初学者(18)

整理
用户名:LiuTong
注册码:38354181


PSXPLAY1.40

标 题:破解 PSXPLAY1.40( 该适合任何版本 )
发信人: CZR
时 间:2000 1.18
详细信息:

各位好 :

我是 JJ, 在此献上拙文一篇为各位热热身 .PSXPLAY 是一个在电脑上观看 PS(SONY 的 PLAYSATION) 动画的软件有了它你不必将 PS 游戏打出就可以看结局动画了 ! 软件是日本人做的不注册你只能将动画看一半 , 需要美金注册我们只有破它啦 ! 好啦我们开始吧 !

第一步 : 下载 PSXPLAY1.40 并将其解压 , 打开它点击 HELP 再点击 REGIST, 接着在注册框中输入名字和注册号我就输 :

USER:CZR KEYWORD:12345( 名字和号码随你填但别输中文 ) 别忙按 OK 接着第二步 .

第二步 :CTRL+D 呼出 SOFT-ICE( 当然你要已经装上了 SOFT-ICE) 并输入 BPX HMEMCPY 接着按回车 , 再按一下 F5 这时你又回到注册框了 , 好了按 OK, 这时程序会被 SOFT-ICE 拦截下 , 来我们继续第三步 !

第三步 : 输入 BC * 然后要开始艰巨使命了 , 按 F12 共 39 下 ( 因为再按一下你就注册失败了 ), 接着你要开始按 F10 了这下你不用记住按几次了因为我也没记住 , 你只须按啊按按到 017F: 00407F49 CALL [004485C4] 将光条停在此处 , 你可别按过去哦 ! 这一条指令就是使你注册失败的罪魁祸首 , 好让我们来跟踪它 , 来第四步 .

第四步 : 你按一下 F8 可别多按哦 ! 好你现在的光条停留在 017F: BFF541BA PUSH EBP 现在你已经完成了破解的 99% 了 , 现在就开始激动人心的一刻吧 ! 输入 D EBP 回车 , 哈哈哈 ! 你看到什么了 , 注册码和注册名 :JJ VJNFWCTF 把它抄下来吧 ! 别忙还有工作要做 !

第五步 : 输入 X 回车 , 这时会弹出注册失败的信息 , 别管它 . 按确定重新将你刚才抄下的东西输进去 , 搞定了吧 !

总结 : 这个程序是最好破的那种啦 , 别说你还不会那我不是白说了吗 ? 好了收工 , 谢谢各位将此文看完 , 感谢看雪兄给我这个机会 !

CZR 首次发表于看雪学苑

2000 1.18


RCCD and RCCDPlus

 标 题:初学者(15) (3千字)
发信人:liutongwu
时 间:2000-7-4 21:01:44
详细信息:
RCCD and RCCDPlus,
products designed for playing audio CD's under
Windows 95 or above and Windows NT 4.0 or above.

软件类型:注册码
难易度:固定注册码,易

输入注册码后,CTRL+D进入s-ice
设断点BPX HMEMCPY,CTRL+D返回并按ok
软件被中断后,按F12键15次(第17次出错)
按F10几次后,可找到判断AL的语句--软件以AL为标志
进入上面的CALL,来到下面的程序段.

* Referenced by a CALL at Addresses:
|:00411AD3 , :0041690B , :00417C11 , :0041D06D , :0041D105
|:0041E230 , :004299FE , :00430B92 , :00430C1D , :00431857
|:00431ACC , :0043C56B , :0043CB55 , :0043CCC5 , :0043CE39
|:0043FB91 , :0043FC55 , :00440030 , :004400EF , :0044054A
|:0044079E , :00440D09 , :00440EC7 , :0044E967 , :004613E3
|:0046181A , :00462DC4 , :00466E4F , :00467874 , :0046DEFF
|:004710FC , :004711B1 , :0047623F , :0047629F , :00476433
|:004766BF , :00479C92 , :00479D1B , :0047A0DF , :0047A1A0
|:0047A1B2 , :0047A279 , :0047A2A1 , :0047A349 , :0047A500
|:0047A51F , :0047A549 , :0047A924 , :0047AF56 , :0047AFC8
|:00481AFD , :00481B82 , :0048BC31 , :0048BC40 , :0048BCE7
|:0048BD58 , :0048BDC9 , :0048BE34 , :0048C454 , :0048D182
|:0048D785 , :0048D797 , :0048D80E , :0048D889 , :0048D8E7
|:0048E485 , :0048FB45 , :0048FB5B , :0048FBE9 , :0048FBFF
|:004900FA , :00490142 , :0049018C , :004901D6 , :00492027
|:00492048 , :004ADE08 , :004AE6E2 , :004AE7E2 , :004B0CD0
|:004B0D1A , :004B112E , :004B1284 , :004B1634 , :004B30CB
|:004BC4E2 , :004BD8B1 , :004BDC8A , :004BDD5A , :004BDD8A
|:004BE09F , :004BE0F6 , :004BE14D , :004BE1EC , :004BE21C
|:004BE36C , :004BE46D , :004BE6C4 , :004BE7BA , :004BE811
|:004BE868 , :004BE8BF , :004BF460 , :004BF475 , :004BF554
|:004BF611 , :004BF6BC , :004BF723 , :004BF9F4 , :004BFA2F
|:004BFA6A , :004BFADB , :004BFB42 , :004BFC93 , :004BFD76
|:004BFFC1 , :004C00C1 , :004C00FC , :004C0137 , :004C0172
|:004C01D1 , :004C155E , :004C215C , :004C2387 , :004C265E
|:004C267F
|
:00403F34 53 push ebx
:00403F35 56 push esi
:00403F36 57 push edi
:00403F37 89C6 mov esi, eax
:00403F39 89D7 mov edi, edx
:00403F3B 39D0 cmp eax, edx
:00403F3D 0F848F000000 je 00403FD2
:00403F43 85F6 test esi, esi
:00403F45 7468 je 00403FAF
:00403F47 85FF test edi, edi
:00403F49 746B je 00403FB6
:00403F4B 8B46FC mov eax, dword ptr [esi-04]<----D EAX可看到输入注册码
:00403F4E 8B57FC mov edx, dword ptr [edi-04]<----D EDX可看到软件注册码
:00403F51 29D0 sub eax, edx
:00403F53 7702 ja 00403F57
:00403F55 01C2 add edx, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403F53(C)
|
:00403F57 52 push edx
:00403F58 C1EA02 shr edx, 02
:00403F5B 7426 je 00403F83

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403F79(C)
|
:00403F5D 8B0E mov ecx, dword ptr [esi]
:00403F5F 8B1F mov ebx, dword ptr [edi]
:00403F61 39D9 cmp ecx, ebx<-----比较
:00403F63 7558 jne 00403FBD
:00403F65 4A dec edx
:00403F66 7415 je 00403F7D
:00403F68 8B4E04 mov ecx, dword ptr [esi+04]
:00403F6B 8B5F04 mov ebx, dword ptr [edi+04]
:00403F6E 39D9 cmp ecx, ebx
:00403F70 754B jne 00403FBD
:00403F72 83C608 add esi, 00000008
:00403F75 83C708 add edi, 00000008
:00403F78 4A dec edx
:00403F79 75E2 jne 00403F5D
:00403F7B EB06 jmp 00403F83

注册码:247012546


S-Spline

 标 题:help me! (97字)
发信人:qbss
时 间:2000-7-6 2:14:33
详细信息:
请求各位高手，帮忙破解一下S-Spline！程序在以下地址：http://www.shortcut.nl/Sspline/S-Spline.exe

标 题:注册码：327155958 (1千字)
发信人:dr0
时 间:2000-7-7 0:58:40
详细信息:

这个玩意儿在启动的时候进行判断，如下：

015F:00401E4E CALL 0045A590 //从注册表中读出注册码
015F:00401E53 MOV [004C4D10],EAX //保存在全局变量中
015F:00401E58 DEC DWORD PTR [EBP-44]
015F:00401E5B LEA EAX,[EBP-14]
015F:00401E5E MOV EDX,00000002
015F:00401E63 CALL 004BF1C0
015F:00401E68 MOV ECX,[004C4D10] //取出注册码
015F:00401E6E XOR ECX,1385A3F6 //与常数异或
015F:00401E74 TEST ECX,FFF00000 //再与常数相与
015F:00401E7A JNZ 00401EBD //jump if bad guy

由上可知，注册码code应满足如下条件：
(code ^ 0x1385A3F6) ^ 0xFFF00000 = 0
亦即
code ^ 0x1385A3F6 = 0x000yyyyy
其中y可以是任意十六进制数字。故注册码的十六进制形式的高3位为138。

用BPM 004C4D10设断点，到了如下的地方：

015F:00404018 MOV ECX,[004C4D10] //取出注册码
015F:0040401E XOR EDX,EDX
015F:00404020 MOV EAX,ECX
015F:00404022 AND ECX,000FFFFF //与掩码相与，取出低20个bit
015F:00404028 AND EAX,FFF00000 //与掩码相与，取出高12个bit
015F:0040402D SHR EAX,14 //将高12个bit移到最右边
015F:00404030 SHL ECX,0C //将低20个bit移到最左边
015F:00404033 OR EAX,ECX //至此高12 bit和低20 bit交换了位置
015F:00404035 MOV ECX,000000C5
015F:0040403A XOR EAX,17293843 //换位后再与常数异或
015F:0040403F DIV ECX //对0xC5求余
015F:00404041 TEST EDX,EDX
015F:00404043 JNZ 0040406F //余数不为0就错误

根据上面的分析，我们可以写个小程序穷举一下，找到一个合适的注册码327155958。

#include <stdio.h>

void main(void)
{

unsigned long k;
unsigned long a;

for (k = 0x00000; k <= 0xFFFFF; k++)
{
a = ((k << 12) | 0x00000138) ^ 0x17293843;

if ((a % 0xC5) == 0)
{
printf("Foud a valid code: %lu\n", k | 0x13800000);
break;
}
}
}

标 题:不好意思，这句笔误：(code ^ 0x1385A3F6) ^ 0xFFF00000 = 0 ，应为(code ^ 0x1385A3F6) & 0xFFF00000 = 0 (空)
发信人:dr0
时 间:2000-7-7 1:08:55
详细信息:


Screen Taker V2.31

标 题:Screen Taker V2.31
发信人:程式猎人
时 间:2000年6月5日
详细信息

简介：个相当不错的屏幕捕捉软件，可惜哥们没有使用过。
追踪：first name:dahuilang
second name:jhw
RN:0000-12345678
这个软件是我向大家介绍的第一篇文章，所以自己也非常高兴，希望通过它能给你们的解密有一个帮助。
现在开始介绍如何破解这个软件，这个软件的注册码运算过程是一个相当复杂的过程，说它复杂是因为它经过了一次XOR和一次OR操作后，算出一个数值来，再使用这个数值进行比较，如果满足条件的话，才能注册成功。现在就向下来看如何破解它。

:00446485 8B049D2CB44400 mov eax, dword ptr [4*ebx+0044B42C] <-xw33
:0044648C 8B55FC mov edx, dword ptr [ebp-04] <-0000
:0044648F E8D4D6FBFF call 00403B68
:00446494 75E9 jne 0044647F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00446483(C)
|
:00446496 83FB02 cmp ebx, 00000002
:00446499 7E04 jle 0044649F
:0044649B 33DB xor ebx, ebx
:0044649D EB73 jmp 00446512
在这里程序是比较注册码的前四位，这前四位是明码，并且它有两个，我们可以任意等于其中的一个，这里我就使用xw33，现在还要说一句，以后的程序将使用这个值来进行运算，就是前面所说的XOR运算，这要等到以后再说了。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00446499(C)
|
:0044649F 33C0 xor eax, eax
:004464A1 55 push ebp
:004464A2 68CF644400 push 004464CF
:004464A7 64FF30 push dword ptr fs:[eax]
:004464AA 648920 mov dword ptr fs:[eax], esp
:004464AD 8D4DF4 lea ecx, dword ptr [ebp-0C]
:004464B0 8B55F8 mov edx, dword ptr [ebp-08]
:004464B3 8B45FC mov eax, dword ptr [ebp-04]
:004464B6 E849FAFFFF call 00445F04
:004464BB 8B45F4 mov eax, dword ptr [ebp-0C]
:004464BE E86108FCFF call 00406D24 <-出错，进入
:004464C3 8BD8 mov ebx, eax
:004464C5 33C0 xor eax, eax
:004464C7 5A pop edx
:004464C8 59 pop ecx
:004464C9 59 pop ecx
:004464CA 648910 mov dword ptr fs:[eax], edx
:004464CD EB13 jmp 004464E2
:004464CF E9B0CBFBFF jmp 00403084
:004464D4 33DB xor ebx, ebx
:004464D6 E84DCEFBFF call 00403328
:004464DB EB35 jmp 00446512
:004464DD E846CEFBFF call 00403328

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004464CD(U)
|
:004464E2 8BC3 mov eax, ebx
:004464E4 B943000000 mov ecx, 00000043
:004464E9 99 cdq
:004464EA F7F9 idiv ecx
:004464EC 8BC8 mov ecx, eax
:004464EE 83F901 cmp ecx, 00000001
:004464F1 7C08 jl 004464FB
:004464F3 81F9E8030000 cmp ecx, 000003E8
:004464F9 7E04 jle 004464FF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004464F1(C)
|
:004464FB 33DB xor ebx, ebx
:004464FD EB13 jmp 00446512

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004464F9(C)
|
:004464FF 8BC3 mov eax, ebx
:00446501 B943000000 mov ecx, 00000043
:00446506 99 cdq
:00446507 F7F9 idiv ecx
:00446509 4A dec edx
:0044650A 7404 je 00446510
:0044650C 33DB xor ebx, ebx
:0044650E EB02 jmp 00446512

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044650A(C)
|
:00446510 B301 mov bl, 01 ***
从0044649F到00446510这里是这个程序主要的比较过程，其中这里有我在上面标记的地方出错，我因为已经将这个软件破解出来了，所以现在来讲解时，当然可以从系统的方面来介绍它。那个出错的地方我们以后一定要进入，但是现在是先介绍它如何能注册成功。这个对以后的运算目的是很重要的。在***处大家看到了吧，这里将使bl=1，而出错时是将bl=0，这就说明这个程序如果要注册成功一定要让程序走到这个位置，那么我们必需回避那里才能使用程序走到这里，我们在前比较明码的地方就已经知道了一个地方，就是下面的地方。

:0044649B 33DB xor ebx, ebx
:0044649D EB73 jmp 00446512
这里将bl=0，并且将跳到00446512，现在我想对那些初学者说一个小经验，就是象上面那里可以跳到出错的地方，记住这个出错的地方的地址，只要以后能跳到这个地址的地方，都是我们要避开的地方。现在大家向上看，那里有可以跳到出错的地方。
上面共有两个地方可以跳到出错的地方，那么我们就一定要回避这两个地方。现在就分析一下如何回避它们。首先来看第一个地方，在那里我们将有什么样的结论呢？程序在那里使用的eax/43(H)后，得到的余数一定要大于0小于3E8(H)，这样它才能不跳到出错的地方，不知道你们是否看明白没有，如果没有可就不能怪我，你们就要学习学习汇编语言了。对于我们已经知道的第一个可以避开出错的地方，那么有人会问那个eax从何而来的，这个大家先不要去管它，我们先弄明白如何能避开出错的地方，到以后就是水到渠成了。现在我们再研究一下第二个出错的地方。在这里它还是使用eax/43后得到余数edx，将edx-1应当等于0，这样它才能跳到使bl=1的地方，这个也就是说eax/43后得到的余数一定要为1，这样才满足程序的要求。好了现在所有的出错的地方我们都已经研究过了，我们现在的任务就是要如何解决掉那个出错的call。现在就进入那个出错的call中，开始对它进行攻击。
如下：
:00406D41 8D55FC lea edx, dword ptr [ebp-04]
:00406D44 8BC3 mov eax, ebx
:00406D46 E80DBDFFFF call 00402A58 ***
:00406D4B 8BF0 mov esi, eax
:00406D4D 837DFC00 cmp dword ptr [ebp-04], 00000000
:00406D51 7423 je 00406D76
:00406D53 8D55F8 lea edx, dword ptr [ebp-08]
:00406D56 B85C674000 mov eax, 0040675C
:00406D5B E878DAFFFF call 004047D8
:00406D60 8B45F8 mov eax, dword ptr [ebp-08]
***处是一个关键地方，所以我们还要进入call中。

:00402A88 80EB30 sub bl, 30
:00402A8B 80FB09 cmp bl, 09
:00402A8E 772A ja 00402ABA
:00402A90 39F8 cmp eax, edi
:00402A92 7726 ja 00402ABA
:00402A94 8D0480 lea eax, dword ptr [eax+4*eax]
:00402A97 01C0 add eax, eax
:00402A99 01D8 add eax, ebx
:00402A9B 8A1E mov bl, byte ptr [esi]
:00402A9D 46 inc esi
:00402A9E 84DB test bl, bl
:00402AA0 75E6 jne 00402A88
:00402AA2 FECD dec ch
:00402AA4 7410 je 00402AB6
:00402AA6 85C0 test eax, eax
:00402AA8 7C10 jl 00402ABA

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402AB8(C), :00402AFD(U)
|
:00402AAA 59 pop ecx
:00402AAB 31F6 xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402ABD(U)
|
:00402AAD 8932 mov dword ptr [edx], esi
:00402AAF 5F pop edi
:00402AB0 5E pop esi
:00402AB1 5B pop ebx
:00402AB2 C3 ret
我们进入call后将来到这里，上面的地方大家发现没有其实它就是运算我们前面所研究的那个eax，在这里我们可以看到那个bl一定要有一定的要求。bl的值一定要在30(H)到39(H)之间，也就是数字，而上面的过程就是将字符数字转化为运算的数字。也就是说字符串12345使用上面的过程就可以将字符串转化为数字12345，这个有什么不同的？我想这个就不用我再说了吧。再说一下，那个转化的数字是10进位的。
现在我们就可以知道了它的过程了。那么我们研究的关键是如何得到那个bl值，对了，这个软件的注册关键就在这里。我们将如何得到那个经过运算过的bl值。
现在就应当展开搜捕了，捕捉到那个bl值了。经过我的追踪发现在主程序中call 00445F04这里将是第一次的运算bl过程。我们就进入call中看一看它将如何计算。

如下：
:00445F6B BE01000000 mov esi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445FAE(C)
|
:00445F70 8BC6 mov eax, esi
:00445F72 03C0 add eax, eax
:00445F74 8B55F8 mov edx, dword ptr [ebp-08]
:00445F77 8A4402FE mov al, byte ptr [edx+eax-02] 奇数位上的值
:00445F7B E870FFFFFF call 00445EF0
:00445F80 8BD8 mov ebx, eax
:00445F82 C1E302 shl ebx, 02
:00445F85 8BC6 mov eax, esi
:00445F87 03C0 add eax, eax
:00445F89 8B55F8 mov edx, dword ptr [ebp-08]
:00445F8C 8A4402FF mov al, byte ptr [edx+eax-01] 相邻偶数上的值
:00445F90 E85BFFFFFF call 00445EF0
:00445F95 0AD8 or bl, al
:00445F97 8D45E0 lea eax, dword ptr [ebp-20]
:00445F9A 8BD3 mov edx, ebx
:00445F9C E8DFD9FBFF call 00403980
:00445FA1 8B55E0 mov edx, dword ptr [ebp-20]
:00445FA4 8D45E8 lea eax, dword ptr [ebp-18]
:00445FA7 E8B4DAFBFF call 00403A60
:00445FAC 46 inc esi
:00445FAD 4F dec edi
:00445FAE 75C0 jne 00445F70
上面就开始使用我们输入的后面10位值了。程序首先使用奇数位上的值如第1位1，将它带入call 00445EF0中，算出一个值来，再将它＊4后，得到bl值，然后再使用相邻的偶数位上的值（这里偶数位上的值是指奇数位后面的偶数），这里就将使用2来计算，将2带入同样的call中，运算出第二个值来al，将bl OR al就可以得到一个运算的值，但是这个运算的值还不是我们上面的bl值，在下面我们还要有一次运算。现在我们就来说一下那个call是如何运算值的。这个就要参考我在下面提供的附表1了，call 00445EF0的计算实际上就是将我们输入的字符找出在附表1中的位置值，如我输入的2，它在附表中的值就为36，那么它在出这个call后的al=36，现在你们就应当明白它是如何计算我们输入的值了。现在我们还不能做什么，因为在下面还有一个地方等着我们去分析它。

如下：
:00445FBF BE01000000 mov esi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445FF1(C)
|
:00445FC4 8B45E8 mov eax, dword ptr [ebp-18]
:00445FC7 8A5C30FF mov bl, byte ptr [eax+esi-01] 前面得到的bl值
:00445FCB 8BC6 mov eax, esi
:00445FCD 99 cdq
:00445FCE F77DEC idiv [ebp-14]
:00445FD1 8B45FC mov eax, dword ptr [ebp-04]
:00445FD4 8A4410FF mov al, byte ptr [eax+edx-01] <-78 77 33 00 78:00445FD8 32D8 xor bl, al
:00445FDA 8D45E0 lea eax, dword ptr [ebp-20]
:00445FDD 8BD3 mov edx, ebx
:00445FDF E89CD9FBFF call 00403980
:00445FE4 8B55E0 mov edx, dword ptr [ebp-20]
:00445FE7 8D45E4 lea eax, dword ptr [ebp-1C]
:00445FEA E871DAFBFF call 00403A60
:00445FEF 46 inc esi
:00445FF0 4F dec edi
:00445FF1 75D1 jne 00445FC4
上面就是程序第二个计算的地方，当在这里计算完后的值就是我们在将字符串转为数字的值了。上面是如何计算的呢？上面我已经标明的所需要的条件了。它实际上就是使用我们在前面第一次得到的bl值（共5个值）再同下面的那5个值进行XOR操作，得到的bl值将是我们想要得到的值。
我们到此已经明白了这个软件的整个注册过程了，现在就是如何通过计算得到注册码了问题了。那么我们将怎样计算得到注册码呢？我们在前面得到的可以避开出错地方的条件在这里就得到了应用了。程序要求我们计算后的值除以43(H)后应当得到余数1，那么满足这个条件的数值将有什么呢？这里我使用了最简单的一个值因为43(H)=67(D),那么只要计算得到68就满足条件了。现在我们有了一个明确的值了，再进行前面的XOR操作就简单多了。
我们完成XOR后，应当得到0 0 0 6 8这5个值，这样就能注册成功了。我们就使用反推法来计算第一个值，
bl XOR 78 =30
通过计算这个bl值应当等于48，而这个48的值是通过第1位的位置值＊4再同第2位的位置值进行或操作得到的。现在就再来讨论如何得到这两个值，因为a OR b =48，这里因为使用了OR操作，经我查OR表发现只有当0 OR 4 =4，4 OR 4=4（这里专指4的位），因为a和b都为附表中的位置值，所以没有一个可以在首位上等于4的，所以在这里只有首位为0和1的满足条件（因为bl＊4）。现在就设第1位为Q，那么第二位应当等于什么呢？我在这里就不向大家介绍如何计算了，因为这里就比较简单了。满足条件应当为I，这样我们就得到的前两位的注册码了。以下同上面一样，就可以得到这个软件的注册码了。
好了，我这节课也应当结束了，也不知道大家都听懂没有，如果没有听懂可以给我写信，。再见！！！

附表1：
序号：0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15
字母：A B C D E F G H I J K L M N O P Q R S T U V
序号：16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C
字母：W X Y Z a b c d e f g h i j k l m n o p q r s
序号：2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D
字母： t u v w x y z 0 1 2 3 4 5 6 7 8 9

*********************************
* First name: dahuilang *
* Second name:jhw *
* RN: xw33-QIQHADNyQA *
*********************************

声明：此文可以自由拷贝，散发和传播，如果你认为有错误的地方你可以将改正后发表在网上，但是请不要将原作者的名字删除或改变，你可以加上你修改后作者名字，并希望你能将修改的文章发给本人。如果愿意同我讨论的话，可以向下面的邮箱写信。我将非常高兴同你讨论关于解密方面的事情，谢谢。（千万不要给我发病毒或黑客程序啊）
邮箱：programhunter@china.com


Second Copy 97 version 5.31

标 题:Tutor 9 How to crack Second Copy 97 version 5.31 build 96
发信人:dREAMtHEATER
时 间:13th, August 1999
详细信息:

作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期:13th, August 1999

软件背景资料

运行平台: Win9X
文件名称: setup97.exe
程序类型: 备份工具
下载地点: http://www.centered.com
文件大小: 702KB

使用的工具

SoftIce V4.0--Win9X Debugger
W32Dasm V8.93--Win9X Dissembler
Hex WorkShop v2.54--Hex Editor
RegSnap V2.51--Registry Analyzing Tool

难易程度

Easy(x) Medium( ) Hard( ) Pro( )

----------=======声明========----------

未经作者同意，不得修改、引用原文，一切权利保留。
本教程只供教学用，其他一切用途皆被禁止。

----------=======软件介绍========----------

软件的作者这样说：

Second Copy 97 allows you to keep a "second copy" of all your important files at
a different location. Set it up once and forget about it. Second Copy 97 will copy
your files at specified intervals in the background without manual intervention.
Initially it will copy all specified files. In subsequent runs it will only copy new
or changed files.

----------=======软件的保护机制========-------

典型的name/code注册形式，未注册时，每次启动都有nagscreen,告诉你还可以使用多少天
，时间和注册信息均存在本软件同目录下的SC97.cfg文件中

SC97.cfg格式（sample)：

[General]
Settings=8E21 〈==第一次运行的时间
Version=5.31
Build=96
RegName=dREAMtHEATER
RegKey=466A-2E7B-37B2

这实际上就是一个INI文件，只有[General]一个小节，不要被他的文件扩展名所迷惑！
另外，我还需说明，code还分"Single User License"与"Site License"之分，后面我会详
讲。

----------========正文========----------

Part1 Snippet out code

在注册窗口中，输入任意的name/code,我输入dREAMtHEATER/1234567890
在SoftIce中设断点bpx hmemcpy ,Ctrl-D,回到注册窗口，press "Register" button,重新回
到SoftIce中,再次Ctrl-D,又立即回到SoftIce中，"bc *",取消所有断点，Press F12数次，程序停
在：

:00461DAE E875A5FCFF call 0042C328
:00461DB3 8B45F8 mov eax, dword ptr [ebp-08] <==SoftIce回到这里,eax指
向我们输入的code
:00461DB6 50 push eax
:00461DB7 8D55F4 lea edx, dword ptr [ebp-0C] <==edx指向name
:00461DBA 8B83E4010000 mov eax, dword ptr [ebx+000001E4]
:00461DC0 E863A5FCFF call 0042C328
:00461DC5 8B45F4 mov eax, dword ptr [ebp-0C]
:00461DC8 5A pop edx
:00461DC9 E8D2F3FFFF call 004611A0 <==计算注册码，trace into
:00461DCE 8BF0 mov esi, eax
:00461DD0 85F6 test esi, esi
:00461DD2 0F8E0A010000 jle 00461EE2 <==返回值esi<=0,注册失败
:00461DD8 8D45F0 lea eax, dword ptr [ebp-10]
:00461DDB E82C0C0000 call 00462A0C
:00461DE0 8B4DF0 mov ecx, dword ptr [ebp-10]
:00461DE3 B201 mov dl, 01
:00461DE5 A1FC374400 mov eax, dword ptr [004437FC]
:00461DEA E8691AFEFF call 00443858
:00461DEF 8945FC mov dword ptr [ebp-04], eax
:00461DF2 33C0 xor eax, eax
:00461DF4 55 push ebp
:00461DF5 68DB1E4600 push 00461EDB
:00461DFA 64FF30 push dword ptr fs:[eax]
:00461DFD 648920 mov dword ptr fs:[eax], esp
:00461E00 8D55F8 lea edx, dword ptr [ebp-08]
:00461E03 8B83E4010000 mov eax, dword ptr [ebx+000001E4]
:00461E09 E81AA5FCFF call 0042C328
:00461E0E 8B45F8 mov eax, dword ptr [ebp-08]
:00461E11 50 push eax

* Possible StringData Ref from Code Obj ->"RegName"
|
:00461E12 B9A01F4600 mov ecx, 00461FA0

* Possible StringData Ref from Code Obj ->"General"
|
:00461E17 BAB01F4600 mov edx, 00461FB0
:00461E1C 8B45FC mov eax, dword ptr [ebp-04]
:00461E1F E8C81AFEFF call 004438EC
:00461E24 8D55F8 lea edx, dword ptr [ebp-08]
:00461E27 8B83F0010000 mov eax, dword ptr [ebx+000001F0]
:00461E2D E8F6A4FCFF call 0042C328
:00461E32 8B45F8 mov eax, dword ptr [ebp-08]
:00461E35 50 push eax

* Possible StringData Ref from Code Obj ->"RegKey"
|
:00461E36 B9C01F4600 mov ecx, 00461FC0

* Possible StringData Ref from Code Obj ->"General"
|
:00461E3B BAB01F4600 mov edx, 00461FB0
:00461E40 8B45FC mov eax, dword ptr [ebp-04]
:00461E43 E8A41AFEFF call 004438EC
:00461E48 A1A0CE4700 mov eax, dword ptr [0047CEA0]
:00461E4D 8B00 mov eax, dword ptr [eax]
:00461E4F 50 push eax

* Possible StringData Ref from Code Obj ->"Version"
|
:00461E50 B9D01F4600 mov ecx, 00461FD0

* Possible StringData Ref from Code Obj ->"General"
|
:00461E55 BAB01F4600 mov edx, 00461FB0
:00461E5A 8B45FC mov eax, dword ptr [ebp-04]
:00461E5D E88A1AFEFF call 004438EC
:00461E62 6A00 push 00000000

* Possible StringData Ref from Code Obj ->"You are now registered with "
|
:00461E64 68E01F4600 push 00461FE0
:00461E69 8D55EC lea edx, dword ptr [ebp-14]
:00461E6C 8BC6 mov eax, esi
:00461E6E E87155FAFF call 004073E4
:00461E73 FF75EC push [ebp-14]

* Possible StringData Ref from Code Obj ->" user license."
|
:00461E76 6808204600 push 00462008
:00461E7B 6820204600 push 00462020

* Possible StringData Ref from Code Obj ->"Keep the registration key in a "
->"safe place."
|
:00461E80 6830204600 push 00462030
:00461E85 6820204600 push 00462020

* Possible StringData Ref from Code Obj ->"You can also see this key on the "
->"About box."
|
:00461E8A 6864204600 push 00462064
:00461E8F 8D45F0 lea eax, dword ptr [ebp-10]
:00461E92 BA07000000 mov edx, 00000007
:00461E97 E8601EFAFF call 00403CFC
:00461E9C 8B45F0 mov eax, dword ptr [ebp-10]
:00461E9F 668B0D6C1F4600 mov cx, word ptr [00461F6C]
:00461EA6 B202 mov dl, 02
:00461EA8 E833E5FDFF call 004403E0
:00461EAD A194CE4700 mov eax, dword ptr [0047CE94]
:00461EB2 8B00 mov eax, dword ptr [eax]
:00461EB4 33D2 xor edx, edx
:00461EB6 E839F8FFFF call 004616F4
:00461EBB C7835001000001000000 mov dword ptr [ebx+00000150], 00000001
:00461EC5 33C0 xor eax, eax
:00461EC7 5A pop edx
:00461EC8 59 pop ecx
:00461EC9 59 pop ecx
:00461ECA 648910 mov dword ptr fs:[eax], edx
:00461ECD 68351F4600 push 00461F35

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461EE0(U)
|
:00461ED2 8B45FC mov eax, dword ptr [ebp-04]
:00461ED5 E84E0FFAFF call 00402E28
:00461EDA C3 ret

:00461EDB E90015FAFF jmp 004033E0
:00461EE0 EBF0 jmp 00461ED2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461DD2(C)
|
:00461EE2 8D55F8 lea edx, dword ptr [ebp-08]
:00461EE5 8B83F0010000 mov eax, dword ptr [ebx+000001F0]
:00461EEB E838A4FCFF call 0042C328
:00461EF0 8B55F8 mov edx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"HELPMEPLEASE"
|
:00461EF3 B898204600 mov eax, 00462098
:00461EF8 E82720FAFF call 00403F24
:00461EFD 85C0 test eax, eax
:00461EFF 7E1F jle 00461F20
:00461F01 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:00461F07 8B88E0000000 mov ecx, dword ptr [eax+000000E0]
:00461F0D A1DCCF4700 mov eax, dword ptr [0047CFDC]
:00461F12 8B00 mov eax, dword ptr [eax]
:00461F14 BA01000000 mov edx, 00000001
:00461F19 E8524FFCFF call 00426E70
:00461F1E EB15 jmp 00461F35

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461EFF(C)
|
:00461F20 6A00 push 00000000
:00461F22 668B0D6C1F4600 mov cx, word ptr [00461F6C]
:00461F29 B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"Invalid Registration Key"
|
:00461F2B B8B0204600 mov eax, 004620B0
:00461F30 E8ABE4FDFF call 004403E0

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00461DA0(U), :00461F1E(U)
|
:00461F35 33C0 xor eax, eax
:00461F37 5A pop edx
:00461F38 59 pop ecx
:00461F39 59 pop ecx
:00461F3A 648910 mov dword ptr fs:[eax], edx
:00461F3D 68641F4600 push 00461F64

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461F62(U)
|
:00461F42 8D45EC lea eax, dword ptr [ebp-14]
:00461F45 BA02000000 mov edx, 00000002
:00461F4A E8951AFAFF call 004039E4
:00461F4F 8D45F4 lea eax, dword ptr [ebp-0C]
:00461F52 BA02000000 mov edx, 00000002
:00461F57 E8881AFAFF call 004039E4
:00461F5C C3 ret

让我们trace into call 004611A0

* Referenced by a CALL at Addresses:
|:00461BF5 , :00461DC9 , :00462BBF , :004635B8
|
:004611A0 55 push ebp
:004611A1 8BEC mov ebp, esp
:004611A3 33C9 xor ecx, ecx
:004611A5 51 push ecx
:004611A6 51 push ecx
:004611A7 51 push ecx
:004611A8 51 push ecx
:004611A9 53 push ebx
:004611AA 56 push esi
:004611AB 57 push edi
:004611AC 8BDA mov ebx, edx
:004611AE 8BF0 mov esi, eax
:004611B0 33C0 xor eax, eax
:004611B2 55 push ebp
:004611B3 688C124600 push 0046128C
:004611B8 64FF30 push dword ptr fs:[eax]
:004611BB 648920 mov dword ptr fs:[eax], esp
:004611BE 85F6 test esi, esi
:004611C0 0F84A9000000 je 0046126F
:004611C6 8BC3 mov eax, ebx
:004611C8 E86F2AFAFF call 00403C3C <==计算输入的code的长度
:004611CD 83F80E cmp eax, 0000000E 〈==code必须是14个字符
:004611D0 0F8599000000 jne 0046126F
:004611D6 8D45F8 lea eax, dword ptr [ebp-08]
:004611D9 50 push eax
:004611DA B904000000 mov ecx, 00000004
:004611DF BA01000000 mov edx, 00000001
:004611E4 8BC3 mov eax, ebx
:004611E6 E8552CFAFF call 00403E40
:004611EB 8D45F4 lea eax, dword ptr [ebp-0C]
:004611EE 50 push eax
:004611EF B909000000 mov ecx, 00000009
:004611F4 BA06000000 mov edx, 00000006
:004611F9 8BC3 mov eax, ebx
:004611FB E8402CFAFF call 00403E40
:00461200 8D45FC lea eax, dword ptr [ebp-04]
:00461203 8BCE mov ecx, esi 〈==ecx指向name
:00461205 8B55F8 mov edx, dword ptr [ebp-08] <==edx指向fake code的前
四位
:00461208 E87B2AFAFF call 00403C88
:0046120D 8D55F0 lea edx, dword ptr [ebp-10]
:00461210 8B45FC mov eax, dword ptr [ebp-04]
:00461213 E898010000 call 004613B0
:00461218 8B55F0 mov edx, dword ptr [ebp-10] <==指向real code的后九位
:0046121B 8B45F4 mov eax, dword ptr [ebp-0C] <==指向fake code的后九位
:0046121E E8292BFAFF call 00403D4C <==比较real与fake的后九位
:00461223 7546 jne 0046126B
:00461225 33D2 xor edx, edx
:00461227 55 push ebp
:00461228 685D124600 push 0046125D

该子程序是真正计算注册码的部分，程序首先计算你输入的code是否是14个字符，然后根据
你输入的name以及code的前四位计算code的后面的八个数值。
我必须说明，你必须trace into call 00403D4C,看懂程序如何比较code的后九位，这部分
我就不想讲了，留给读者自己去练习，不是很难，记住，要想提高自己的技术，必须能看懂一部分
汇编代码，否则真的很难深入！
为了验证code的规律性，我反复实验了十多次，总结如下：程序取code的前四位算出
"Single User License"或者"Site License"（包括user的数目）的后八位code，但前四位数是应该
有限制的，只能包括数字，字母应是"A"--"F",看来程序要取前四位code的十六进制值，我没有继续
去研究，第五位可以是任意字符，倒数三位是固定的，是“7B2”。code形式应为xxxxxxxx-x7B2。

Part 2 做Patch

线索

Part 1里列出的计算注册码的子程序被四个地方呼叫，分别是:00461BF5 , :00461DC9 ,
:00462BBF , :004635B8，让我们去00461BF5处看看该子程序的返回值是什么。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00461BA1(C)
|
:00461BBD 6A00 push 00000000
:00461BBF 8D45F4 lea eax, dword ptr [ebp-0C]
:00461BC2 50 push eax

* Possible StringData Ref from Code Obj ->"RegKey"
|
:00461BC3 B9301D4600 mov ecx, 00461D30

* Possible StringData Ref from Code Obj ->"General"
|
:00461BC8 BA001D4600 mov edx, 00461D00
:00461BCD 8B45FC mov eax, dword ptr [ebp-04]
:00461BD0 E8B71CFEFF call 0044388C
:00461BD5 8B45F4 mov eax, dword ptr [ebp-0C]
:00461BD8 50 push eax
:00461BD9 6A00 push 00000000
:00461BDB 8D45F0 lea eax, dword ptr [ebp-10]
:00461BDE 50 push eax

* Possible StringData Ref from Code Obj ->"RegName"
|
:00461BDF B9401D4600 mov ecx, 00461D40

* Possible StringData Ref from Code Obj ->"General"
|
:00461BE4 BA001D4600 mov edx, 00461D00
:00461BE9 8B45FC mov eax, dword ptr [ebp-04]
:00461BEC E89B1CFEFF call 0044388C
:00461BF1 8B45F0 mov eax, dword ptr [ebp-10]
:00461BF4 5A pop edx
:00461BF5 E8A6F5FFFF call 004611A0 <==计算注册码
:00461BFA 85C0 test eax, eax
:00461BFC 7570 jne 00461C6E 〈== if eax=1,then you have been
registered
:00461BFE A1F4CE4700 mov eax, dword ptr [0047CEF4]
:00461C03 C60001 mov byte ptr [eax], 01
:00461C06 A1DCCF4700 mov eax, dword ptr [0047CFDC]
:00461C0B 8B00 mov eax, dword ptr [eax]
:00461C0D 8B482C mov ecx, dword ptr [eax+2C]
:00461C10 B201 mov dl, 01
:00461C12 A134264600 mov eax, dword ptr [00462634]
:00461C17 E8CCFEFBFF call 00421AE8
:00461C1C 8945F8 mov dword ptr [ebp-08], eax
:00461C1F 33C0 xor eax, eax
:00461C21 55 push ebp
:00461C22 685C1C4600 push 00461C5C
:00461C27 64FF30 push dword ptr fs:[eax]
:00461C2A 648920 mov dword ptr fs:[eax], esp
:00461C2D 8B45F8 mov eax, dword ptr [ebp-08]
:00461C30 C780480200000B000000 mov dword ptr [ebx+00000248], 0000000B
:00461C3A 8B45F8 mov eax, dword ptr [ebp-08]
:00461C3D 8B80DC010000 mov eax, dword ptr [eax+000001DC]
:00461C43 B201 mov dl, 01
:00461C45 E866BBFDFF call 0043D7B0
:00461C4A 8B45F8 mov eax, dword ptr [ebp-08]
:00461C4D E8AE2EFCFF call 00424B00 <==呼叫nagscreen
:00461C52 33C0 xor eax, eax
:00461C54 5A pop edx
:00461C55 59 pop ecx
:00461C56 59 pop ecx
:00461C57 648910 mov dword ptr fs:[eax], edx
:00461C5A EB12 jmp 00461C6E
:00461C5C E98315FAFF jmp 004031E4
:00461C61 8B45F8 mov eax, dword ptr [ebp-08]
:00461C64 E8BF11FAFF call 00402E28
:00461C69 E81A18FAFF call 00403488

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00461BFC(C), :00461C5A(U)
|
:00461C6E 33C0 xor eax, eax
:00461C70 5A pop edx
:00461C71 59 pop ecx

该段代码从文件SC97.cfg中读取RegName、RegKey，并进行注册码的验证，
这样我们可以在004611A0处改代码为 (1)mov eax, 00000001 (2)ret,然后删掉文件SC97.cfg
，重新启动程序，nag screen不见了，但about中"registered to"还是"unregistered",没关系，用
NotePad打开文件SC97.cfg，按照我软件的保护机制中讲的SC97.cfg文件格式添上RegName、RegKey
这两行，内容随意输入你想要的,保存，再重新启动程序，ABOUT会告诉你"registered to xxxx"，
Kool!

----------=======The Patch========----------

在文件sc97.exe的offset:000605A0h处，修改558BEC33C951为B801000000C3。


See This 1.07

 标 题:初学者(16) (2千字)
发信人:liutongwu
时 间:2000-7-4 21:03:10
详细信息:
软件名称：See This 1。07
软件大小：248KB
软件类型：共享
适用环境：Win9x
软件介绍：
当你从网络上看到好东西的时候，你一定很想把整个画面传给朋友看。
See This就是一个这麽好用的小工具，可以把整个屏幕“拍”下来，并且用Email传送出去。
如果对方也是See This的用户，画面就会立刻被传出去并且出现在他的屏幕上。要是对方没有使用See This，
那麽这张图就会以jpg格式的Email夹文件传出去。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417514(C)
|
:004174F1 0FBE54340C movsx edx, byte ptr [esp+esi+0C]
:004174F6 52 push edx
:004174F7 E834E40000 call 00425930<-----大小写转换
:004174FC 88443410 mov byte ptr [esp+esi+10], al<----放回原处
:00417500 83C404 add esp, 00000004
:00417503 8D7C240C lea edi, dword ptr [esp+0C]
:00417507 83C9FF or ecx, FFFFFFFF
:0041750A 33C0 xor eax, eax
:0041750C 46 inc esi
:0041750D F2 repnz
:0041750E AE scasb
:0041750F F7D1 not ecx
:00417511 49 dec ecx
:00417512 3BF1 cmp esi, ecx
:00417514 72DB jb 004174F1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004173BC(C)
|
:0041739E 33C9 xor ecx, ecx
:004173A0 8A88B09A4300 mov cl, byte ptr [eax+00439AB0]
:004173A6 83C1BF add ecx, FFFFFFBF
:004173A9 83F90F cmp ecx, 0000000F
:004173AC 774F ja 004173FD
:004173AE 8BD6 mov edx, esi
:004173B0 0FAFD1 imul edx, ecx
:004173B3 03DA add ebx, edx
:004173B5 C1E604 shl esi, 04
:004173B8 40 inc eax
:004173B9 83F808 cmp eax, 00000008
:004173BC 7CE0 jl 0041739E
:004173BE 3BEB cmp ebp, ebx
:004173C0 733B jnb 004173FD
:004173C2 8B0D68B64300 mov ecx, dword ptr [0043B668]
:004173C8 8B156CB64300 mov edx, dword ptr [0043B66C]

例:
输入:abcdefgh
转换后:01234567

由于追踪过程中,注册成功,未能将比较代码的程序记录下来. 卸载程序,仍是注册的.
大致过程如下:
1.软件按照上面的办法将输入码减41(HEX),然后与50(HEX)比较(即输入的注册码要求
是字符且要小于等于50(HEX,即字符P)),注册码为8位.
2.软件将转换后的码与内部码(放在EBP中)比较(注:软件有多个内部码)
我得到的是:LAPKLDFB


ShowDep 4.0 beta 1

 标 题:重灌一遍：ShowDep 4.0 beta 1 brute-force attack (8千字)
发信人:dr0
时 间:2000-7-4 21:05:05
详细信息:
http://www.showdep.com

用穷举法找到个注册码，输入之后说“Thank you”但是会引起非法操作，
why?我又没运行SoftICE。估计还是注册码的长度不对，看了一下它存
在注册表中的注册码，似乎应是64个字符（即32字节）。
Name: Registered User
Code: DB883980

下面是穷举程序的主要部分：

.DATA

UserName db 100 dup (0)
RegCodeString db 16 dup (0)
RegCode dd 3 dup (?)

StringFormat db "%08lX", 0
Serial dd ?
NameLen dd ?
NotFound db "no valid serial found.", 0
Seed dd 3 dup(?)

Old_ESP dd ?
temp dd ?

_hInst dd ?
_hWnd dd ?
_hIcon dd ?
_hDlg dd ?

MagicTable dd 00000000h, 77073096h, 0EE0E612Ch, 990951BAh
dd 076DC419h, 706AF48Fh, 0E963A535h, 9E6495A3h
dd 0EDB8832h, 79DCB8A4h, 0E0D5E91Eh, 97D2D988h
dd 09B64C2Bh, 7EB17CBDh, 0E7B82D07h, 90BF1D91h
dd 1DB71064h, 6AB020F2h, 0F3B97148h, 84BE41DEh
dd 1ADAD47Dh, 6DDDE4EBh, 0F4D4B551h, 83D385C7h
dd 136C9856h, 646BA8C0h, 0FD62F97Ah, 8A65C9ECh
dd 14015C4Fh, 63066CD9h, 0FA0F3D63h, 8D080DF5h
dd 3B6E20C8h, 4C69105Eh, 0D56041E4h, 0A2677172h
dd 3C03E4D1h, 4B04D447h, 0D20D85FDh, 0A50AB56Bh
dd 35B5A8FAh, 42B2986Ch, 0DBBBC9D6h, 0ACBCF940h
dd 32D86CE3h, 45DF5C75h, 0DCD60DCFh, 0ABD13D59h
dd 26D930ACh, 51DE003Ah, 0C8D75180h, 0BFD06116h
dd 21B4F4B5h, 56B3C423h, 0CFBA9599h, 0B8BDA50Fh
dd 2802B89Eh, 5F058808h, 0C60CD9B2h, 0B10BE924h
dd 2F6F7C87h, 58684C11h, 0C1611DABh, 0B6662D3Dh
dd 76DC4190h, 01DB7106h, 98D220BCh, 0EFD5102Ah
dd 71B18589h, 06B6B51Fh, 9FBFE4A5h, 0E8B8D433h
dd 7807C9A2h, 0F00F934h, 9609A88Eh, 0E10E9818h
dd 7F6A0DBBh, 086D3D2Dh, 91646C97h, 0E6635C01h
dd 6B6B51F4h, 1C6C6162h, 856530D8h, 0F262004Eh
dd 6C0695EDh, 1B01A57Bh, 8208F4C1h, 0F50FC457h
dd 65B0D9C6h, 12B7E950h, 8BBEB8EAh, 0FCB9887Ch
dd 62DD1DDFh, 15DA2D49h, 8CD37CF3h, 0FBD44C65h
dd 4DB26158h, 3AB551CEh, 0A3BC0074h, 0D4BB30E2h
dd 4ADFA541h, 3DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh
dd 4369E96Ah, 346ED9FCh, 0AD678846h, 0DA60B8D0h
dd 44042D73h, 33031DE5h, 0AA0A4C5Fh, 0DD0D7CC9h
dd 5005713Ch, 270241AAh, 0BE0B1010h, 0C90C2086h
dd 5768B525h, 206F85B3h, 0B966D409h, 0CE61E49Fh
dd 5EDEF90Eh, 29D9C998h, 0B0D09822h, 0C7D7A8B4h
dd 59B33D17h, 2EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh
dd 0EDB88320h, 9ABFB3B6h, 03B6E20Ch, 74B1D29Ah
dd 0EAD54739h, 9DD277AFh, 04DB2615h, 73DC1683h
dd 0E3630B12h, 94643B84h, 0D6D6A3Eh, 7A6A5AA8h
dd 0E40ECF0Bh, 9309FF9Dh, 0A00AE27h, 7D079EB1h
dd 0F00F9344h, 8708A3D2h, 1E01F268h, 6906C2FEh
dd 0F762575Dh, 806567CBh, 196C3671h, 6E6B06E7h
dd 0FED41B76h, 89D32BE0h, 10DA7A5Ah, 67DD4ACCh
dd 0F9B9DF6Fh, 8EBEEFF9h, 17B7BE43h, 60B08ED5h
dd 0D6D6A3E8h, 0A1D1937Eh, 38D8C2C4h, 4FDFF252h
dd 0D1BB67F1h, 0A6BC5767h, 3FB506DDh, 48B2364Bh
dd 0D80D2BDAh, 0AF0A1B4Ch, 36034AF6h, 41047A60h
dd 0DF60EFC3h, 0A867DF55h, 316E8EEFh, 4669BE79h
dd 0CB61B38Ch, 0BC66831Ah, 256FD2A0h, 5268E236h
dd 0CC0C7795h, 0BB0B4703h, 220216B9h, 5505262Fh
dd 0C5BA3BBEh, 0B2BD0B28h, 2BB45A92h, 5CB36A04h
dd 0C2D7FFA7h, 0B5D0CF31h, 2CD99E8Bh, 5BDEAE1Dh
dd 9B64C2B0h, 0EC63F226h, 756AA39Ch, 026D930Ah
dd 9C0906A9h, 0EB0E363Fh, 72076785h, 05005713h
dd 95BF4A82h, 0E2B87A14h, 7BB12BAEh, 0CB61B38h
dd 92D28E9Bh, 0E5D5BE0Dh, 7CDCEFB7h, 0BDBDF21h
dd 86D3D2D4h, 0F1D4E242h, 68DDB3F8h, 1FDA836Eh
dd 81BE16CDh, 0F6B9265Bh, 6FB077E1h, 18B74777h
dd 88085AE6h, 0FF0F6A70h, 66063BCAh, 11010B5Ch
dd 8F659EFFh, 0F862AE69h, 616BFFD3h, 166CCF45h
dd 0A00AE278h, 0D70DD2EEh, 4E048354h, 3903B3C2h
dd 0A7672661h, 0D06016F7h, 4969474Dh, 3E6E77DBh
dd 0AED16A4Ah, 0D9D65ADCh, 40DF0B66h, 37D83BF0h
dd 0A9BCAE53h, 0DEBB9EC5h, 47B2CF7Fh, 30B5FFE9h
dd 0BDBDF21Ch, 0CABAC28Ah, 53B39330h, 24B4A3A6h
dd 0BAD03605h, 0CDD70693h, 54DE5729h, 23D967BFh
dd 0B3667A2Eh, 0C4614AB8h, 5D681B02h, 2A6F2B94h
dd 0B40BBE37h, 0C30C8EA1h, 5A05DF1Bh, 2D02EF8Dh
;---------------------------------------------------------------------------
GenKey proc

push ebp

push 64h
push offset UserName
push IDC_NAME
push [_hDlg]
call GetDlgItemTextA
test eax, eax
jz ExitProc0
mov [NameLen], eax

mov [Old_ESP], esp

mov esp, 12345678h
mov esi, 23456789h
mov edi, 34567890h

mov ecx, [NameLen]
mov ebp, offset UserName

name_iteration:

mov eax, esp
xor al, [ebp]
movzx ebx, al
shr esp, 8
xor esp, [MagicTable+ebx*4]

mov eax, esp
and eax, 0ffh
add eax, esi
mov edx, 08088405h
mul edx
inc eax
mov esi, eax

shr eax, 24
xor eax, edi
movzx ebx, al
shr edi, 8
xor edi, [MagicTable+ebx*4]

inc ebp
loop name_iteration

mov [Seed], esp
mov [Seed+4], esi
mov [Seed+8], edi

mov dword ptr [Serial], 0

brute_force:

mov eax, [Serial]
mov [RegCode], eax
mov dword ptr [RegCode+4], 00000000h
mov dword ptr [RegCode+8], 00000000h

mov esp, [Seed]
mov esi, [Seed+4]
mov edi, [Seed+8]

mov ecx, 0Ch
mov ebp, offset RegCode

serial_iteration:

mov eax, esp
xor al, [ebp]
movzx ebx, al
shr esp, 8
xor esp, [MagicTable+ebx*4]

mov eax, esp
and eax, 0ffh
add eax, esi
mov edx, 08088405h
mul edx
inc eax
mov esi, eax

shr eax, 24
xor eax, edi
movzx ebx, al
shr edi, 8
xor edi, [MagicTable+ebx*4]

inc ebp
loop serial_iteration

; mov eax, [Serial]
; xor edx, edx
; mov ebx, 10000
; div ebx
; test edx, edx
; jnz continue

; mov [temp], esp
; mov esp, [Old_ESP]
; pushad

; push [Serial]
; push offset StringFormat
; push offset RegCodeString
; call _wsprintfA
; add esp, 12

; push offset RegCodeString
; push IDC_KEY
; push [_hDlg]
; call SetDlgItemTextA

; popad
; mov esp, [temp]

continue:

test edi, edi
jz serial_found

dec dword ptr [Serial]
jnz brute_force
jmp not_found

serial_found:

mov esp, [Old_ESP]

push [Serial]
push offset StringFormat
push offset RegCodeString
call _wsprintfA
add esp, 12

push offset RegCodeString
jmp DisplayResult

not_found:
mov esp, [Old_ESP]

push offset NotFound

DisplayResult:

push IDC_KEY
push [_hDlg]
call SetDlgItemTextA

ExitProc0:
pop ebp
ret

GenKey endp

标 题:这个东西在启动时除了用_lopen( )检测SoftICE，还会检查CreateFileA( )是否被设了bpx断点 (50字)
发信人:guest
时 间:2000-7-5 14:00:09
详细信息:

即检查CreateFileA( )的入口的第一个字节是否为0xCC。


SubmitWolf Enterprise V4.02

标 题:一个未完成的破解 (SubmitWolf Enterprise V4.02 CN build: 003 Script: 1.000)
发信人: iloveeagle
时 间: 2000.6.10
详细信息:

软件的功能概述：
~~~~~~~~~~~~~~
SubmitWolf是宣传因特网站点的自动提交向导，它能够在几分钟内将一个URL排列
到数百个搜索引擎和链接目录上。

保护方法：
~~~~~~~~
    简单的name/code保护；未注册版本中，大多数站点不可使用，URL只能被提交到少数
几个选定的站点。

破解过程：
~~~~~~~~
(第一次)    启动TRW2000，按OK,TRW2000已隐藏在TaskBar了。运行SubmitWolf，按“注册”，
            分别填入：

         注册名称：iloveeagle
        序列号：  10101010

CTRL-N,进入TRW2000，下断点bpx getdlgitemtexta,再CTRL-N，按“确定”。程序中断在：

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
                                  |
:00418588 8B355C514300            mov esi, dword ptr [0043515C]
:0041858E 8D44240C                lea eax, dword ptr [esp+0C]<---注册码地址
:00418592 6A50                    push 00000050
:00418594 50                      push eax
:00418595 6814040000              push 00000414
:0041859A 53                      push ebx
:0041859B FFD6                    call esi<----------取得注册码

我们中断在此CALL内，F12来到RET语句，再F10回到下面一句。然后清除所有断点
:BC *
再F10一路走下。

:0041859D 8D8C248C000000          lea ecx, dword ptr [esp+0000008C] ;name地址
:004185A4 6A50                    push 00000050
:004185A6 51                      push ecx

* Possible Reference to Dialog: DialogID_0098, CONTROL_ID:0405, ""
                                  |
:004185A7 6805040000              push 00000405
:004185AC 53                      push ebx
:004185AD FFD6                    call esi<-----------------取得name
:004185AF 8D54240C                lea edx, dword ptr [esp+0C]
:004185B3 6A52                    push 00000052
:004185B5 52                      push edx
:004185B6 E8254F0100              call 0042D4E0<---------若注册码中含有字符"R",则返回
:004185BB 83C408                  add esp, 00000008      "R"的地址;否则返回0。对应于第二
:004185BE 85C0                    test eax, eax           种注册码的情形。
:004185C0 7475                    je 00418637
:004185C2 8D7C240C                lea edi, dword ptr [esp+0C]---|这个过程是把name和code调换位置
:004185C6 83C9FF                  or ecx, FFFFFFFF              |注册码为第二种形式时，执行这
:004185C9 33C0                    xor eax, eax                  |里的语句。（***）
:004185CB 8D54240C                lea edx, dword ptr [esp+0C]   |
:004185CF F2                      repnz                         |
:004185D0 AE                      scasb                         |
:004185D1 F7D1                    not ecx                       |
:004185D3 2BF9                    sub edi, ecx                  |
:004185D5 8BC1                    mov eax, ecx                  |
:004185D7 8BF7                    mov esi, edi                  |
:004185D9 BF60E64300              mov edi, 0043E660             |
:004185DE C1E902                  shr ecx, 02                   |
:004185E1 F3                      repz                          |
:004185E2 A5                      movsd                         |
:004185E3 8BC8                    mov ecx, eax                  |
:004185E5 33C0                    xor eax, eax                  |
:004185E7 83E103                  and ecx, 00000003             |
:004185EA F3                      repz                          |
:004185EB A4                      movsb                         |
:004185EC 8DBC248C000000          lea edi, dword ptr [esp+0000008C]
:004185F3 83C9FF                  or ecx, FFFFFFFF              |
:004185F6 F2                      repnz                         |
:004185F7 AE                      scasb                         |
:004185F8 F7D1                    not ecx                       |
:004185FA 2BF9                    sub edi, ecx                  |
:004185FC 8BC1                    mov eax, ecx                  |
:004185FE 8BF7                    mov esi, edi                  |
:00418600 8BFA                    mov edi, edx                  |
:00418602 8D94248C000000          lea edx, dword ptr [esp+0000008C]
:00418609 C1E902                  shr ecx, 02                   |
:0041860C F3                      repz                          |
:0041860D A5                      movsd                         |
:0041860E 8BC8                    mov ecx, eax                  |
:00418610 33C0                    xor eax, eax                  |
:00418612 83E103                  and ecx, 00000003             |
:00418615 F3                      repz                          |
:00418616 A4                      movsb                         |
:00418617 BF60E64300              mov edi, 0043E660             |
:0041861C 83C9FF                  or ecx, FFFFFFFF              |
:0041861F F2                      repnz                         |
:00418620 AE                      scasb                         |
:00418621 F7D1                    not ecx                       |
:00418623 2BF9                    sub edi, ecx                  |
:00418625 8BC1                    mov eax, ecx                  |
:00418627 8BF7                    mov esi, edi                  |
:00418629 8BFA                    mov edi, edx                  |
:0041862B C1E902                  shr ecx, 02                   |
:0041862E F3                      repz                          |
:0041862F A5                      movsd                         |
:00418630 8BC8                    mov ecx, eax                  |
:00418632 83E103                  and ecx, 00000003             |
:00418635 F3                      repz                          |
:00418636 A4                      movsb-------------------------|

走到:004185C0处，看看跳转的两个方向，都没要出对话框的意思。那么先F10跟它走，看看有何结果。我们来
到:00418637处。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004185C0(C)
|
:00418637 8D8C248C000000          lea ecx, dword ptr [esp+0000008C]
:0041863E 51                      push ecx
:0041863F E83CDBFFFF              call 00416180<-------------对name的第一位和最后一位字符
:00418644 8D542410                lea edx, dword ptr [esp+10]   做有效性检查.
:00418648 52                      push edx
:00418649 E832DBFFFF              call 00416180<-------------对code的第一位和最后一位字符
:0041864E 8D442414                lea eax, dword ptr [esp+14]   做有效性检查.
:00418652 8D8C2494000000          lea ecx, dword ptr [esp+00000094]
:00418659 50                      push eax
:0041865A 51                      push ecx
:0041865B E890090000              call 00418FF0<---------注册码不正确则返回0.重要,F8进入.

* Reference To: USER32.LoadStringA, Ord:01ABh
                                  |
:00418660 8B35A8514300            mov esi, dword ptr [004351A8]
:00418666 83C410                  add esp, 00000010
:00418669 85C0                    test eax, eax
:0041866B 0F85AE000000            jne 0041871F<---------这里是要害所在!

走到这里，抬头看看eax，它的值为0。程序不会跳走，再看看下面的语句，将要显示一个出错对话框。我们
马上明白：要想注册成功，eax必须不为0。问题的焦点马上集中在:0041865B处的那个CALL上了。

:00418671 8B1550624400            mov edx, dword ptr [00446250]  下面的messageboxa.
:00418677 68D00F0000              push 00000FD0
:0041867C 6860E64300              push 0043E660

* Possible Reference to String Resource ID=01459: "鑼
??鬣H"
                                  |
:00418681 68B3050000              push 000005B3
:00418686 52                      push edx
:00418687 FFD6                    call esi
:00418689 A150624400              mov eax, dword ptr [00446250]
:0041868E 68D00F0000              push 00000FD0
:00418693 6800D44300              push 0043D400

* Possible Reference to String Resource ID=01460: "鑼郒"
                                  |
:00418698 68B4050000              push 000005B4
:0041869D 50                      push eax
:0041869E FFD6                    call esi
:004186A0 6A30                    push 00000030
:004186A2 6800D44300              push 0043D400
:004186A7 6860E64300              push 0043E660
:004186AC 53                      push ebx

* Reference To: USER32.MessageBoxA, Ord:01BEh

(第二次)    CTRL-N,回到程序，重新输入注册信息。这次CODE我输的是191919（为了便于进行内存搜索，我
            每次都输不同的CODE，这是个小经验）。CTRL-N进入TRW2000，在:0041859D处双击鼠标，设置断
            点。再CTRL-N回到程序，按下“确定”钮。（BC *）清除所有断点，F10一直到

:0041865B E890090000              call 00418FF0

F8进入。再F10一路走下。

下面是call 00418FF0的内容:

:00418FF0 83EC70                  sub esp, 00000070
:00418FF3 53                      push ebx
:00418FF4 8B5C2478                mov ebx, dword ptr [esp+78]      ;[ebx]->code
:00418FF8 56                      push esi
:00418FF9 57                      push edi
:00418FFA 85DB                    test ebx, ebx
:00418FFC 7436                    je 00419034
:00418FFE 6A52                    push 00000052<--"R"----------------------------|注册码为第二种
:00419000 53                      push ebx                                       |形式时，执行这
:00419001 E8DA440100              call 0042D4E0<--返回code中"R"的地址.           |里的语句。
:00419006 83C408                  add esp, 00000008                              |（***）
:00419009 85C0                    test eax, eax                                  |
:0041900B 7427                    je 00419034                                    |
:0041900D 8BBC2484000000          mov edi, dword ptr [esp+00000084]  ;[edi]->name|
:00419014 85FF                    test edi, edi                                  |
:00419016 0F84ED010000            je 00419209                                    |
:0041901C 6A40                    push 00000040                                  |
:0041901E 57                      push edi                                       |
:0041901F E8BC440100              call 0042D4E0<--返回name中"@"的地址.           |
:00419024 83C408                  add esp, 00000008                              |
:00419027 85C0                    test eax, eax                                  |
:00419029 7410                    je 0041903B                                    |
:0041902B 8BFB                    mov edi, ebx                                   |
                                                                                |
* Possible StringData Ref from Data Obj ->"EPAK"                                 |
                                  |                                              |
:0041902D BB44824300              mov ebx, 00438244                              |
:00419032 EB07                    jmp 0041903B-----------------------------------|

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00418FFC(C), :0041900B(C)
|
:00419034 8BBC2484000000          mov edi, dword ptr [esp+00000084]  ;[edi]->code

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00419029(C), :00419032(U)
|
:0041903B 85FF                    test edi, edi
:0041903D 0F84C6010000            je 00419209
:00419043 85DB                    test ebx, ebx
:00419045 0F84BE010000            je 00419209

* Possible Ref to Menu: MenuID_0064, Item: ""
                                  |
:0041904B 6A02                    push 00000002

* Possible StringData Ref from Data Obj ->"PY"
                                  |
:0041904D 685C824300              push 0043825C
:00419052 57                      push edi
:00419053 E898450100              call 0042D5F0<------比较code前两位是否为"PY",相等则返回0...(1)
:00419058 83C40C                  add esp, 0000000C   否则不为0
:0041905B 85C0                    test eax, eax
:0041905D 7418                    je 00419077

* Possible Ref to Menu: MenuID_0064, Item: ""
                                  |
:0041905F 6A02                    push 00000002

* Possible StringData Ref from Data Obj ->"EY"
                                  |
:00419061 6858824300              push 00438258
:00419066 57                      push edi
:00419067 E884450100              call 0042D5F0<------比较code前两位是否为"EY",相等则返回....(2)
:0041906C 83C40C                  add esp, 0000000C   否则不为0
:0041906F 85C0                    test eax, eax
:00419071 0F8592010000            jne 00419209

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

* Possible Ref to Menu: MenuID_0064, Item: ""
                                  |
:00419077 6A02                    push 00000002

* Possible StringData Ref from Data Obj ->"EY"
                                  |
:00419079 6858824300              push 00438258
:0041907E 57                      push edi
:0041907F E86C450100              call 0042D5F0<----同上.....................................(3)
:00419084 F7D8                    neg eax
:00419086 1BC0                    sbb eax, eax
:00419088 6A2D                    push 0000002D
:0041908A 40                      inc eax
:0041908B 57                      push edi
:0041908C A304BC4300              mov dword ptr [0043BC04], eax
:00419091 E81A470100              call 0042D7B0<-----------------返回code中"-"的位置.........(4)
:00419096 83C414                  add esp, 00000014
:00419099 85C0                    test eax, eax
:0041909B 0F8468010000            je 00419209<------若无"-",则死
:004190A1 83C9FF                  or ecx, FFFFFFFF
:004190A4 33C0                    xor eax, eax
:004190A6 F2                      repnz
:004190A7 AE                      scasb
:004190A8 F7D1                    not ecx
:004190AA 2BF9                    sub edi, ecx
:004190AC 8D542414                lea edx, dword ptr [esp+14]
:004190B0 8BC1                    mov eax, ecx
:004190B2 8BF7                    mov esi, edi
:004190B4 8BFA                    mov edi, edx
:004190B6 6A2D                    push 0000002D
:004190B8 C1E902                  shr ecx, 02
:004190BB F3                      repz
:004190BC A5                      movsd
:004190BD 8BC8                    mov ecx, eax
:004190BF 83E103                  and ecx, 00000003
:004190C2 F3                      repz
:004190C3 A4                      movsb
:004190C4 8D4C2418                lea ecx, dword ptr [esp+18]
:004190C8 51                      push ecx
:004190C9 E8E2460100              call 0042D7B0<--------------------同上....................(5)
:004190CE 8BF8                    mov edi, eax
:004190D0 83C408                  add esp, 00000008
:004190D3 85FF                    test edi, edi
:004190D5 0F842E010000            je 00419209
:004190DB C60700                  mov byte ptr [edi], 00
:004191BA 8D442448                lea eax, dword ptr [esp+48]

(第三次)   这里我略去了一个繁长的计算过程。其实第二次我们不会来到这里，反而会很快跳到:00419209
           处，返回eax=0，跳到失败。从第二次的过程我们看到，注册码的前两位必须是“PY”或“EY”
           并且必须有一位是“-”。再从头来一次，这次输入name:QQQ/code:EY2000-121212。进入

           :0041865B E890090000              call 00418FF0

           后，反正是F10，一路按下。突然，看看下面，多么熟悉的身影映入眼帘。这样你就得到了一个
           正确的注册码组合。若想作注册机就仔细研究一下略去的部分。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004191E0(C)
|
:004191BE 8A10                    mov dl, byte ptr [eax]<--------真假code的比较!!!...........(6)
:004191C0 8A1E                    mov bl, byte ptr [esi]
:004191C2 8ACA                    mov cl, dl
:004191C4 3AD3                    cmp dl, bl
:004191C6 752C                    jne 004191F4
:004191C8 84C9                    test cl, cl
:004191CA 7416                    je 004191E2
:004191CC 8A5001                  mov dl, byte ptr [eax+01]
:004191CF 8A5E01                  mov bl, byte ptr [esi+01]
:004191D2 8ACA                    mov cl, dl
:004191D4 3AD3                    cmp dl, bl
:004191D6 751C                    jne 004191F4
:004191D8 83C002                  add eax, 00000002
:004191DB 83C602                  add esi, 00000002
:004191DE 84C9                    test cl, cl
:004191E0 75DC                    jne 004191BE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:<---跳到这里,则成功
|:004191CA(C)
|
:004191E2 33C0                    xor eax, eax
:004191E4 33C9                    xor ecx, ecx
:004191E6 85C0                    test eax, eax
:004191E8 0F94C1                  sete cl
:004191EB 5F                      pop edi
:004191EC 5E                      pop esi
:004191ED 8BC1                    mov eax, ecx
:004191EF 5B                      pop ebx
:004191F0 83C470                  add esp, 00000070
:004191F3 C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:<--跳到这里,有可能成功
|:004191C6(C), :004191D6(C)                                          但看看这两个跳转,都是
|                                                                    jnz,所以到这里也是死!
:004191F4 1BC0                    sbb eax, eax
:004191F6 5F                      pop edi
:004191F7 83D8FF                  sbb eax, FFFFFFFF
:004191FA 33C9                    xor ecx, ecx
:004191FC 85C0                    test eax, eax
:004191FE 0F94C1                  sete cl
:00419201 5E                      pop esi
:00419202 8BC1                    mov eax, ecx
:00419204 5B                      pop ebx
:00419205 83C470                  add esp, 00000070
:00419208 C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:<---若跳到这里,则失败.
|:00419016(C), :0041903D(C), :00419045(C), :00419071(C), :0041909B(C)
|:004190D5(C)
|
:00419209 5F                      pop edi
:0041920A 5E                      pop esi
:0041920B 33C0                    xor eax, eax
:0041920D 5B                      pop ebx
:0041920E 83C470                  add esp, 00000070
:00419211 C3                      ret

事情完了吗？没有。我们应该研究一下两个标有（***）的程序段。第一个程序段在判断CODE中含有“R”
后，把NAME和CODE在内存的地址对调；第二个程序段是判断NAME中是否含有字符“@”。见下面总结：

总结：

这个程序存在两种类型的注册码：

1、一种注册码形式如：
    Name:QQQ/code:EY2000-121212
    这里，"EY"和"-"间的数字随意。“-”后的数字由Name和“-”前的字符（包括EY）
算出。“EY”也可以是“PY”。当然"EY"和"-"间也可以没东西，这样注册后也可看到
注册成功的画面。但在联网升级时，会发生错误，连选择升级组件的列表都不出现；我
用上面的注册码注册时，会出现选择升级组件的列表，选好组件后，要求我输入email地
址，这时我才犯难了。我怎么知道有哪些email地址在它的服务器上注了册，我又不是
黑客。

2、另一种注册码形式如：
    Name:anything@anything/code:EYR2002-121212
    这种形式的注册码和NAME是无关的。注册码中必须含有“R”，前两位也必须是
“EY”或“PY”。“-”后的数字由字符“EPAK”和“-”前的字符（包括“EY”或“PY”）
算出。而NAME中的“@”是必须有的，作者很可能想让你输入email地址。这种注册码也许和
引擎软件包（Engine Pack）的升级有关。


system mechanic 3.5

 标 题:system mechanic 3.5的注册码及winhex9.5破解法（参照shizg，此版稍有不同） (1千字)
发信人:backboy
时 间:2000-7-14 0:27:40
详细信息:
现在3元一小时，可一天不上网总觉少了些什么，只好少来了！现在真是理解ICEWORLD兄了,_^^_!
SYSTEM MECHANIC 3.5的注册码。
程序用aspack压缩过。
用trw2000载入，选enter code
name: backboy
code: 78787878
设断点bpx 0137:004943c9
F5(enter)
ok(enter)
d eax(enter)
相关段如下 0137：00494388 push eax D EAX 可见正确注册码 D EDX 可见 输入的假码
0137: 0049439a pop eax
0137: 0049439b call 00403f58 此处进行注册码比对
0137: 004943a0 jnz 004943a7 此处一跳就..
此处得出的注册码与注册机给出的不同，但都能用。
一个可用的注册码如下：
NAME:backboy
CODE:90919-PR845-7747173554
程序将注册名及注册码保存在注册表的HKEY_CURRENT_USER\Software\iolo\System Mechanic下。

另发布winhex5的修改方法给需要的朋友，我特别爱用它，一共改2处。
1.改4500007515B003E8B7C5FBFF为
------EB3A--------------
2.改803D9875450000为
-------------1

另请教看雪我用的是win97osr，不知为什么不能加载frogice，一运行系统就死机。我已按frogice的说明中将相应的vxd文件放入了
相关目录下了。


teleport pro tm 1,29

 标 题:这是本人入门后的第二篇破解小结 (4千字)
发信人:peter007
时 间:2000-8-16 15:15:05
详细信息:
teleport pro tm中文版 版本1.29 Build 431
Name: Peter
com:home
sn: 89898989
1. 下 bpx getwindowtexta
2. F12 4下
3. F10 24下
来到这里:
0167:00421951 EB4E JMP SHORT 004219A1
0167:00421953 FFB7D5000000 PUSH DWORD [EDI+D5]
0167:00421959 E829090000 CALL 00422287 (这就是比较的地方)
0167:0042195E 3945EC CMP [EBP-14],EAX(这是就是注册码比较)
0167:00421961 59 POP ECX
0167:00421962 0F85E4000000 JNZ NEAR 00421A4C
0167:00421968 8D4DF0 LEA ECX,[EBP-10]
0167:0042196B E8CFE50100 CALL 0043FF3F
0167:00421970 68410C0000 PUSH DWORD 0C41
0167:00421975 8D4DF0 LEA ECX,[EBP-10]
0167:00421978 C745FC02000000 MOV DWORD [EBP-04],02
0167:0042197F E84FEC0100 CALL 004405D3
0167:00421984 53 PUSH EBX
0167:00421985 53 PUSH EBX
0167:00421986 FF75F0 PUSH DWORD [EBP-10]
0167:00421989 C745FC03000000 MOV DWORD [EBP-04],03
0167:00421990 E81B5D0200 CALL 004476B0
0167:00421995 834DFCFF OR DWORD [EBP-04],BYTE -01
0167:00421999 8D4DF0 LEA ECX,[EBP-10]
0167:0042199C E8E9E60100 CALL 0044008A
0167:004219A1 A144BD4700 MOV EAX,[0047BD44]
0167:004219A6 8898AC020000 MOV [EAX+02AC],BL
0167:004219AC A144BD4700 MOV EAX,[0047BD44]
0167:004219B1 8898AD020000 MOV [EAX+02AD],BL
0167:004219B7 A140BD4700 MOV EAX,[0047BD40]
0167:004219BC 3BC3 CMP EAX,EBX
0167:004219BE 7406 JZ 004219C6
0167:004219C0 88985A0F0000 MOV [EAX+0F5A],BL
0167:004219C6 FF75EC PUSH DWORD [EBP-14]
0167:004219C9 8B0D44BD4700 MOV ECX,[0047BD44]
0167:004219CF 6834584700 PUSH DWORD 00475834
0167:004219D4 56 PUSH ESI
0167:004219D5 E8485E0200 CALL 00447822
0167:004219DA FFB7D5000000 PUSH DWORD [EDI+D5]
0167:004219E0 8B0D44BD4700 MOV ECX,[0047BD44]
0167:004219E6 8D9FD5000000 LEA EBX,[EDI+D5]
0167:004219EC 6838574700 PUSH DWORD 00475738
0167:004219F1 56 PUSH ESI
0167:004219F2 E8A05E0200 CALL 00447897
0167:004219F7 FFB7D9000000 PUSH DWORD [EDI+D9]
0167:004219FD 8B0D44BD4700 MOV ECX,[0047BD44]
0167:00421A03 6830574700 PUSH DWORD 00475730
0167:00421A08 56 PUSH ESI
0167:00421A09 E8895E0200 CALL 00447897
0167:00421A0E A144BD4700 MOV EAX,[0047BD44]
0167:00421A13 53 PUSH EBX
0167:00421A14 8D88CE020000 LEA ECX,[EAX+02CE]
0167:00421A1A E864E70100 CALL 00440183
0167:00421A1F 8D87D9000000 LEA EAX,[EDI+D9]
0167:00421A25 50 PUSH EAX
0167:00421A26 A144BD4700 MOV EAX,[0047BD44]
0167:00421A2B 8D88D2020000 LEA ECX,[EAX+02D2]
0167:00421A31 E84DE70100 CALL 00440183
0167:00421A36 8BCF MOV ECX,EDI
0167:00421A38 E85BA90100 CALL 0043C398
0167:00421A3D 8B4DF4 MOV ECX,[EBP-0C]
0167:00421A40 5F POP EDI
0167:00421A41 5E POP ESI
0167:00421A42 64890D00000000 MOV [FS:00],ECX
0167:00421A49 5B POP EBX
0167:00421A4A C9 LEAVE
0167:00421A4B C3 RET
0167:00421A4C 8BBFD5000000 MOV EDI,[EDI+D5]

0167:0042195E 3945EC CMP [EBP-14],EAX
当光条走到这里,就有
ss:[6FF480]=055BBFED
我不是很会计算，不过我试地十进与十六进制转换太麻烦。
用windows的计算，破解解时不方便。
trw2000,soft-ice自带计算器而且比较windows更准确。
就以刚才的"055bbfed" 只要输入 ? 55bbfed
一会儿就出显(十进制) Dec=89898989(这就是我用的假Sn)
(十六进制) Hex=055bbfed
不用说真的当在"EAX"，? EAX （同上面的）
CMP [EBP-14],EAX 有人可能问不是? [ebp-14]才对吗？
ss:[6FF480]=055BBFED我好像在汇编看，这是一等式。（如果有请指出？）
就是[ebp-14]=ss:[6ff480]=055bbfed
不就是同十进与十六进制转换差不多？
这个软件，我很快就破解完过是我破解过程中最快的方法。
我开始不是想自己破解，因为很就有人破解了我也有这个教程。
教程中是用bpx hmemcpy,我无中想试一下bpx getwindowtexta。
结果能中断，不久就Crack it!
最后本版不同，教程的核心全部了。只好自己也写一下过程。
教程的方法也行不过，比较麻烦。
我用许多方法，一开始是利用自己一点汇编知识分析破解出来。
就是让JNZ,JMP....等跳跃到的地方再分析，最后来
0167:0042195E 3945EC CMP [EBP-14],EAX
这是就是注册码比较（分析出来）
可以说是我比较最快的方法。 如果什么错误的地方请指出修正？


The Cleaner 3.1

 标 题:菜鸟破解录之 The Cleaner (4千字)
发信人:xiA Qin
时 间:2000-8-12 10:20:35
详细信息:
菜鸟破解录之 The Cleaner

软件名称： The Cleaner
软件版本： 3.1 Build 3138 database 3104
软件大小： 1192
软件授权： 共享软件
使用平台： Win95/98/NT
发布公司： http://www.moosoft.com/cleaner.php3
软件简介： 一个专门检测和清除侵入您系统中的特洛伊木马的专业程序,内置1393个木马标识。可在线升级版本和病毒数据库,操作简单,功能强大!查杀的各类特洛伊木马种类最多，几乎所有较出名的这里都有，如Netspy、BO、Netbus、Girlfriend、Happy99、BackDoor以及它们的一些不同版本。还有很多种我们大多数网友听都没听过，有了它我们可以将电脑“清洁”得干干净净，放心大胆地上网。

作 者：xiA Qin
级 别：很菜。。。。很菜。。。
解密日前：2000年8月11日
解密工具：Trw2000 1.22 <--不用说了吧!
Procdump1.62 <--自动脱壳的工具。
typ <--侦测程序是用什么加的壳。

破解目的：学习脱壳+注册码的破解。（简单）

第一步：脱壳

用typ查一下The Cleaner.exe是用什么加的壳。用upx 0.81加的壳。

1、运行Procdump，看到它的右边有几个按钮。
2、单击“UNPACK”，选UPX，选择目标程序Cleaner.exe。
3、过不久就出现“Please hi OK when task is loaded(check TaskBar)” ，要注意了，当Cleaner.EXE出现在工具条时，再单击‘OK’。
4、等一会，它会选一个文件名进行保存，存为China.EXE（任意） 。
5、运行China.exe，嘻嘻！！！！运行成功。

第二步：

首先运行China.exe
输入注册信息

Name: xiA Qin &任意输入

SN: 1234567890123456789 此处先乱填...程式会先看看注册码是否为19个字...
是的话才会去比较

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............

015F:00474637 MOV EAX,[EBP-01D0]
015F:0047463D CALL 00403D00
015F:00474642 CMP EAX,13 //眼熟吧！注册码位数检查，19位
015F:00474645 JZ 0047466C
015F:00474647 ADD BYTE PTR [EBX+000001FC],01
015F:0047464E JAE 00474655
015F:00474650 CALL 00402E60
015F:00474655 PUSH 30
015F:00474657 CALL 00406674
015F:0047465C MOV EAX,[EBX+000001F8]
015F:00474662 CALL 00473EE4
015F:00474667 JMP 00474745
015F:0047466C MOV EAX,[00482C00]
015F:00474671 MOV EAX,[EAX]
015F:00474673 MOV EDX,[EAX+0000532C]
015F:00474679 LEA EAX,[EBP-01D4]
015F:0047467F MOV ECX,00474780
015F:00474684 CALL 00403D4C
015F:00474689 MOV EDX,[EBP-01D4]
015F:0047468F LEA EAX,[EBP-01CC]
015F:00474695 CALL 004051E6
015F:0047469A LEA EAX,[EBP-01CC]
015F:004746A0 CALL 00405586
015F:004746A5 LEA EDX,[EBP-01D0]
015F:004746AB MOV EAX,[EBX+000001E0]
015F:004746B1 CALL 0041F320
015F:004746B6 MOV EDX,[EBP-01D0]
015F:004746BC LEA EAX,[EBP-01CC]
015F:004746C2 CALL 00404094
015F:004746C7 CALL 004057CB
015F:004746CC LEA EDX,[EBP-01D0]
015F:004746D2 MOV EAX,[EBX+000001E4]
015F:004746D8 CALL 0041F320
015F:004746DD MOV EDX,[EBP-01D0]
015F:004746E3 LEA EAX,[EBP-01CC]
015F:004746E9 CALL 00404094
015F:004746EE CALL 004057CB
015F:004746F3 LEA EAX,[EBP-01CC]
015F:004746F9 CALL 00405350
015F:004746FE MOV EAX,[00482C00]
015F:00474703 MOV EAX,[EAX]
015F:00474705 CALL 0047E894 //注册码运算子程序
015F:0047470A TEST AL,AL //由AL当旗标值...来决定注册成功与否...
015F:0047470C JZ 00474725 //注册码比较
015F:0047470E MOV EAX,[EBX+000001F4]
015F:00474714 CALL 004737D4
015F:00474719 MOV DWORD PTR [EBX+00000150],00000001
015F:00474723 JMP 00474745
015F:00474725 ADD BYTE PTR [EBX+000001FC],01
015F:0047472C JAE 00474733
015F:0047472E CALL 00402E60
015F:00474733 PUSH 30
015F:00474735 CALL 00406674
015F:0047473A MOV EAX,[EBX+000001F8]
015F:00474740 CALL 00473EE4
015F:00474745 XOR EAX,EAX
015F:00474747 POP EDX
015F:00474748 POP ECX
015F:00474749 POP ECX
015F:0047474A MOV FS:[EAX],EDX
015F:0047474D PUSH 00474770
015F:00474752 LEA EAX,[EBP-01D4]
015F:00474758 CALL 00403A84 //注册失败对话框
015F:0047475D LEA EAX,[EBP-01D0]
015F:00474763 CALL 00403A84
015F:00474768 RET

从上面可以看出.

将0047470C JZ 00474725
改0047470C JNZ 00474725

就可以注册。

整里一下，用Ultraedt打开China.exe

找到74 17 8b 83 f4 01

改成75 17 8b 83 f4 01

保存修改文件，重新运行。

还有延迟画面，要我注册。

找到75 4C 8B 45 FC 05 A4

改成74 4C 8B 45 FC 05 A4

这一下，可把你搞定了。


tumesg

 标 题:mago进来，要汉化的软件己破解 (1千字)
发信人:看雪
时 间:2000-7-5 22:11:52
详细信息:
下载：http://download.vector.co.jp/pack/win95/game/table/shogi/tumesg2.lzh

这软件是日文,我看不懂,只能猜测,刚开始是输入密码了,下断:
bpx messageboxa

你按F10走出，共跳出两级CALL。

0167:00431906 PUSH EAX
0167:00431907 CALL 004245D0—————————进去，可找到密码mh5vk
0167:0043190C TEST EAX,EAX
0167:0043190E JNZ NEAR 0043192D
0167:00431914 PUSH DWORD 00447900
0167:00431919 LEA EAX,[EBP+FFFFFE78]
0167:0043191F PUSH EAX
0167:00431920 CALL 004245D0—————————进去，可找到密码MH5VK
0167:00431925 TEST EAX,EAX
0167:00431927 JZ NEAR 0043193C
0167:0043192D MOV DWORD [007FCBDC],01
0167:00431937 JMP 00431973
0167:0043193C MOV DWORD [007FCBDC],00
0167:00431946 PUSH DWORD 00447908
0167:0043194B LEA EAX,[EBP+FFFFFE78]
0167:00431951 PUSH EAX
0167:00431952 CALL 00424670——————————此处是将你输入的密码和MH5VK，再和mh5vk比较
0167:00431957 TEST EAX,EAX———————————都不对，则失败
0167:00431959 JZ NEAR 00431973
0167:0043195F PUSH BYTE +00
0167:00431961 PUSH BYTE +00
0167:00431963 PUSH DWORD 0044790C
0167:00431968 MOV ECX,[EBP+FFFFFE74]
0167:0043196E CALL `MFC40!ord_00000E83` -----------------出错的对话框
0167:00431973 MOV EAX,[EBP+FFFFFE74]
0167:00431979 CMP DWORD [EAX+60],BYTE +00

只举一例，其它几个CALL类同。
进去0167:00431920 CALL来到：
0167:004245D3 PUSH EBX
0167:004245D4 PUSH ESI
0167:004245D5 PUSH EDI
0167:004245D6 MOV EAX,[EBP+0C]——————此处D EAX在数据窗口看到：MH5VK
0167:004245D9 PUSH EAX
0167:004245DA MOV ECX,[EBP+08]
0167:004245DD CALL 00424610

密码成功后，会在目录下生成一文件tumesgp.ini
内容是：password=mh5vk
以后运行程序，直接按回车就可进入程序，但不知注册和不注册在功能上有什么差别？
发现日本在软件保护方面是简单，可能和其国内盗版少有关。


VoxPhone Pro V3.0 Build 36

标 题:VoxPhone Pro V3.0 Build 36所用的Rsagnt32.dll
发信人:iloveeagle
时 间: 2000.6.11
详细信息:

(by iloveeagle 2000.6.11)
<tr> tr>

【作者】iloveeagle
破解文库 http://mypage.zhongo.com/~iloveeagle

软件的功能概述：
~~~~~~~~~~~~~~
    通过Internet打电话的软件，据说效果很不错。我没用过。

保护方法：
~~~~~~~~
    时间限制。用Rsagnt32.dll来保护。

破解过程：
~~~~~~~~
用bpx hmemcpy中断。被SoftIce拦截后，(BD *)清除所有断点，连续
按F12一直来到Rsagnt32.dll的代码区，代码窗和命令窗之间的分隔线
变为：

--------RSAGNT32!.TEXT+nnnnn----------

再F10一路按下。

* Reference To: USER32.GetDlgItemTextA, Ord:00EDh
                                  |
:10001E8C FF1578050310            Call dword ptr [10030578]
     ^^^^
（:00691E8C<-----在Debug时，看到的地址形式,其余类推。）
       ^^^^

:10001E92 B9FFFFFFFF              mov ecx, FFFFFFFF<--------|连续按F12后到这里。
:10001E97 2BC0                    sub eax, eax              |这是计算字符个数的典型语句段。
:10001E99 F2                      repnz                     |ECX的值就是字符个数。
:10001E9A AE                      scasb                     |
:10001E9B F7D1                    not ecx                   |
:10001E9D 49                      dec ecx<------------------|
:10001E9E 83F90A                  cmp ecx, 0000000A<---------Unlock Code的字符数应为10(D)
:10001EA1 7440                    je 10001EE3
:10001EA3 8D442474                lea eax, dword ptr [esp+74]

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
                                        ->"not valid for this program."
                                  |
(略)
* Possible StringData Ref from Data Obj ->"Invalid Unlocking Code"
                                  |
(略)
* Reference To: USER32.MessageBoxA, Ord:0188h
                                  |
(略)
:10001EE2 C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001EA1(C)
|
:10001EE3 BFD03A0210              mov edi, 10023AD0<-------------|;personal code的地址
:10001EE8 B9FFFFFFFF              mov ecx, FFFFFFFF              |
:10001EED 2BC0                    sub eax, eax                   |
:10001EEF F2                      repnz                          |
:10001EF0 AE                      scasb                          |
:10001EF1 F7D1                    not ecx                        |
:10001EF3 2BF9                    sub edi, ecx                   |
:10001EF5 8BC1                    mov eax, ecx                   |
:10001EF7 C1E902                  shr ecx, 02                    |
:10001EFA 8BF7                    mov esi, edi                   |
:10001EFC 8D7C240C                lea edi, dword ptr [esp+0C]    |拷贝personal code
:10001F00 F3                      repz                           |
:10001F01 A5                      movsd                          |
:10001F02 8BC8                    mov ecx, eax                   |
:10001F04 83E103                  and ecx, 00000003              |
:10001F07 F3                      repz                           |
:10001F08 A4                      movsb<-------------------------|
:10001F09 8D4C2440                lea ecx, dword ptr [esp+40]
:10001F0D A1B4780210              mov eax, dword ptr [100278B4]
:10001F12 51                      push ecx
:10001F13 05B6000000              add eax, 000000B6
:10001F18 8D4C2410                lea ecx, dword ptr [esp+10]
:10001F1C 50                      push eax
:10001F1D 51                      push ecx
:10001F1E E8BD170000              call 100036E0<----------------计算Unlock code的过程
:10001F23 8D4C244C                lea ecx, dword ptr [esp+4C]<--real Ucode的地址(1)
:10001F27 83C40C                  add esp, 0000000C
:10001F2A 68B0840210              push 100284B0<----------------fake Ucode的地址(2)
:10001F2F 51                      push ecx
:10001F30 E84B8A0100              call 1001A980<----------------真假注册码的比较过程
:10001F35 83C408                  add esp, 00000008
:10001F38 85C0                    test eax, eax
:10001F3A A1B4780210              mov eax, dword ptr [100278B4]
:10001F3F 7512                    jne 10001F53<---------------------------------(3)
:10001F41 66C740040100            mov [eax+04], 0001
:10001F47 33C0                    xor eax, eax
:10001F49 5F                      pop edi
:10001F4A 5E                      pop esi
:10001F4B 5B                      pop ebx
:10001F4C 81C430010000            add esp, 00000130
:10001F52 C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001F3F(C)
|
:10001F53 8D4C2474                lea ecx, dword ptr [esp+74]

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
                                        ->"not valid for this program."

(略)
* Possible StringData Ref from Data Obj ->"Invalid Unlocking Code"
(略)
* Reference To: USER32.MessageBoxA, Ord:0188h
(略)
:10001F8C C3                      ret

按F10，经过上面(1)处时，(d ecx)在数据窗会看到真正的Unlock code；到(2)处时，(d 6984B0)会看到我输入的假注册码。
再看(3)处的跳转语句，可以看到call 1001A980的返回值eax应为0，否则注册失败。而call 1001A980实际上就是真假注册码的
比较过程。值得一提的是Patch程序时，应在call 1001A980内进行(只PATCH一处即可)；而不宜在call 1001A980外，因为程序
在别的地方也调用了call 1001A980。看下面：

********************************************************************
在该DLL中还发现另一处取得fake code，计算real code和两者比较的代码：

* Reference To: USER32.GetDlgItemTextA, Ord:00EDh
                                  |
:100030DA FF1578050310            Call dword ptr [10030578]
:100030E0 B9FFFFFFFF              mov ecx, FFFFFFFF
:100030E5 2BC0                    sub eax, eax
:100030E7 F2                      repnz
:100030E8 AE                      scasb
:100030E9 F7D1                    not ecx
:100030EB 49                      dec ecx
:100030EC 83F90A                  cmp ecx, 0000000A
:100030EF 743E                    je 1000312F
:100030F1 A1B4780210              mov eax, dword ptr [100278B4]

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
                                        ->"not valid for this program."
                                  |
(略)
* Possible StringData Ref from Data Obj ->"Invalid Unlocking Code"
                                  |
(略)
* Reference To: USER32.MessageBoxA, Ord:0188h
                                  |
(略)
:1000312E C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100030EF(C)
|
:1000312F 6860C60110              push 1001C660
:10003134 A1B4780210              mov eax, dword ptr [100278B4]
:10003139 05B6000000              add eax, 000000B6
:1000313E 50                      push eax
:1000313F 68E83A0210              push 10023AE8
:10003144 E897050000              call 100036E0<----------------计算Unlock code的过程
:10003149 83C40C                  add esp, 0000000C
:1000314C 6850C60110              push 1001C650<----------------fake Ucode的地址
:10003151 6860C60110              push 1001C660<----------------real Ucode的地址
:10003156 E825780100              call 1001A980<----------------真假注册码的比较过程
:1000315B 83C408                  add esp, 00000008
:1000315E 85C0                    test eax, eax
:10003160 A1B4780210              mov eax, dword ptr [100278B4]
:10003165 7511                    jne 10003178
:10003167 66C740040100            mov [eax+04], 0001
:1000316D 33C0                    xor eax, eax
:1000316F 5F                      pop edi
:10003170 5E                      pop esi
:10003171 81C400010000            add esp, 00000100
:10003177 C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10003165(C)
|
:10003178 8D4C2408                lea ecx, dword ptr [esp+08]

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
                                        ->"not valid for this program."
                                  |
(略)
* Possible StringData Ref from Data Obj ->"Invalid Unlocking Code"
(略)
* Reference To: USER32.MessageBoxA, Ord:0188h
(略)
:100031B0 C3                      ret

最后要和网友共享成果：(1)PATCH这个DLL并把它发布到网上，使网友们可以以任意Unlock Code注册，而不用管Personal Code
是什么。(2)作出注册机，使不会破解的网友可以由自己的Personal Code计算出Unlock Code。下面就是Unlock Code的计算过程。

* Referenced by a CALL at Addresses:****************************注册码计算过程
|:10001F1E   , :10003144
|
:100036E0 83EC18                  sub esp, 00000018

* Possible StringData Ref from Data Obj ->"PQYZMERUOA"
                                  |
:100036E3 B948C90110              mov ecx, 1001C948
:100036E8 8D542400                lea edx, dword ptr [esp]
:100036EC 53                      push ebx
:100036ED 56                      push esi
:100036EE 8B01                    mov eax, dword ptr [ecx]
:100036F0 57                      push edi
:100036F1 8B5904                  mov ebx, dword ptr [ecx+04]
:100036F4 55                      push ebp
:100036F5 8902                    mov dword ptr [edx], eax
:100036F7 668B6908                mov bp, word ptr [ecx+08]
:100036FB 8A410A                  mov al, byte ptr [ecx+0A]

* Possible StringData Ref from Data Obj ->"JIKLICBXZC"
                                  |
:100036FE B93CC90110              mov ecx, 1001C93C
:10003703 895A04                  mov dword ptr [edx+04], ebx
:10003706 66896A08                mov word ptr [edx+08], bp
:1000370A 8B5904                  mov ebx, dword ptr [ecx+04]
:1000370D 668B6908                mov bp, word ptr [ecx+08]
:10003711 88420A                  mov byte ptr [edx+0A], al
:10003714 8D54241C                lea edx, dword ptr [esp+1C]
:10003718 8B01                    mov eax, dword ptr [ecx]
:1000371A 6633FF                  xor di, di
:1000371D 8902                    mov dword ptr [edx], eax
:1000371F 8A410A                  mov al, byte ptr [ecx+0A]
:10003722 8B742434                mov esi, dword ptr [esp+34]
:10003726 8B4C2430                mov ecx, dword ptr [esp+30]
:1000372A 895A04                  mov dword ptr [edx+04], ebx
:1000372D 66896A08                mov word ptr [edx+08], bp
:10003731 88420A                  mov byte ptr [edx+0A], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000377B(C)
|
:10003734 8B44242C                mov eax, dword ptr [esp+2C]
:10003738 B219                    mov dl, 19
:1000373A 0FBFEF                  movsx ebp, di
:1000373D B319                    mov bl, 19
:1000373F 8A440500                mov al, byte ptr [ebp+eax]
:10003743 32442C10                xor al, byte ptr [esp+ebp+10]
:10003747 32440D00                xor al, byte ptr [ebp+ecx]
:1000374B 2AE4                    sub ah, ah
:1000374D F6F2                    div dl
:1000374F 8AC4                    mov al, ah
:10003751 8A542C1C                mov dl, byte ptr [esp+ebp+1C]
:10003755 0441                    add al, 41
:10003757 88443500                mov byte ptr [ebp+esi], al
:1000375B 32540D00                xor dl, byte ptr [ebp+ecx]
:1000375F 32D0                    xor dl, al
:10003761 8AC2                    mov al, dl
:10003763 2AE4                    sub ah, ah
:10003765 F6F3                    div bl
:10003767 8AC4                    mov al, ah
:10003769 0441                    add al, 41
:1000376B 3C4F                    cmp al, 4F
:1000376D 7502                    jne 10003771
:1000376F B058                    mov al, 58

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000376D(C)
|
:10003771 6647                    inc di
:10003773 88443500                mov byte ptr [ebp+esi], al
:10003777 6683FF0A                cmp di, 000A
:1000377B 7CB7                    jl 10003734
:1000377D C6460A00                mov [esi+0A], 00
:10003781 5D                      pop ebp
:10003782 5F                      pop edi
:10003783 5E                      pop esi
:10003784 5B                      pop ebx
:10003785 83C418                  add esp, 00000018
:10003788 C3                      ret

把上面的汇编语句翻译成VB6，是下面的样子：

注册机源程序:
______________________________________________________
Private Sub Command1_Click()

  Dim n(1 To 10) As Integer
  Dim c(1 To 10) As Integer
  Dim d(1 To 10) As Integer
  Dim e(1 To 10) As Integer
  Dim i As Integer
  Dim t As Integer
  Dim ucode As String

  For i = 1 To 10
    c(i) = Asc(Mid$("PQYZMERUOA", i, 1))
  Next i
  For i = 1 To 10
    d(i) = Asc(Mid$("NVEW2973hb", i, 1))
  Next i
  For i = 1 To 10
    e(i) = Asc(Mid$("JIKLICBXZC", i, 1))
  Next i
  For i = 1 To Len(Trim$(Text1.Text))
   Text1.SelStart = i - 1
   Text1.SelLength = 1
   n(i) = Asc(Text1.SelText)
  Next i

  ucode = ""
  For i = 1 To 10
    t = (((n(i) Xor c(i) Xor d(i)) Mod &H19 + &H41) Xor e(i) Xor d(i)) Mod &H19 + &H41
    If (t = &H4F) Then
      t = &H58
    End If
    ucode = ucode & Chr(t)
  Next i

  Text2.Text = ucode

End Sub
-----------------------------------------------------------
Private Sub Command2_Click()
 Unload Me
End Sub
-----------------------------------------------------------
Private Sub Form_Load()
  Me.Move 3500, 2500

End Sub
-----------------------------------------------------------

Private Sub Text1_Change()
 If Len(Trim$(Text1.Text)) >= 10 Then
  Command1.Enabled = True
 Else
  Command1.Enabled = False
  Text2.Text = ""
 End If
End Sub
____________________________________________________________


wall paper changer 3.5

 标 题:看雪,dr0及各位大侠请看！ (2千字)
发信人:backboy
时 间:2000-7-15 20:41:14
详细信息:
看雪,dr0及各位大侠，现在对一些软件，HMEMCPY 这个万用中断好象已失效。不信大家请看看国人用DEPHI编的wall paper changer 3.5 这个软件，设bpx hmemcpy,一按F5，就又被中断了，上海番外地对它的破解附后，但我不论使用SOFTICE或TRW2000，都不能在按注册按钮后再中断，全部是设断点后立即就被中断返回调试窗口，根本没有按注册按钮的机会。类似的情况我在一些CRACKME中碰到过，但还可以通过先不输入最后一位注册码，然后再设断，返回，输入最后一位注册码来解决，但现在这个软件连这个机会都不给，用UNASPACK1.91脱壳后，DASM893也不能正确反汇编，不知为什么，至此这个软件好象已不可解，请高手们指教对该类软件的破解方法，多谢了！这种软件已不是第一次碰到。以下为转载上海番外地对该软件的破解教程（但好象不可用）。

-----------------------------------------------------------------
作者主页：http://www.hu.zj.cninfo.net/~wangyin/wangyin.html
破解工具：Soft-ICE 4.05 for Windows 95/98、File Infor 2.3、UnAspack 1.0.9.0、Hiew
难 度：易
说 明：全功能的“桌面布景”管理程序、包括桌面、图标、光标、声音、背景配色、开关机画面、Web背景等，能更改、更换各项配置，然后将此存成另一布景、相当好用，值得一提的是程序提供背景配色的编辑、且内建多种的模组可套用、甚至自行更改，而Web背景图、更是一般相似软件中少见的功能，总之相当好用，喜欢改、改、改的网友值得下载。

破解过程：

1.先启动Soft-ICE，再启动WPC，从“关于”中看到了“注册信息”，有两个内容： 姓名: FanWaiDi[CCG] (发现这个用户名不是自己添的而是从系统安装信息中调入的)
注册号码: 78787878 (随便填，我习惯填78787878)

2.打Ctrl+D，进入S-ICE，设断点bpx hmemcpy，打F5返回WPC，点“OK”，则被S-ICE拦截。

3.打bc *，清除断点。再打F12键12下后，再按F10来到：

...
XXXX:0046F856 MOV EDX,[EBP-08]
XXXX:0046F859 POP EAX
XXXX:0046F85A CALL 00403058
XXXX:0046F85F JNZ 0046F88C（这里一跳跃就会出现错误的窗口，那么上面的那个CALL肯定有问题，进去看看！）
XXXX:0046F861 MOV EDX,00000001
...

4、在0046F85A处按F8进入，
...
XXXX:00403D5B MOV ESI，EAX
XXXX:00403D5D MOV EDI，EDX
XXXX:00403D5F CMP EAX，EDX（在这里就可以找到注册码了！）
XXXX:00403D61 JZ 00403DF6
XXXX:00403D67 TEST ESI，ESI
...
在00403D5F处下D EAX就可以看到我的注册码了：WPC25-003086！！
D EDX就是我原来输入的78787878

5、至此我的注册码已经破解出来的，但是问题就来了，如果别人的机器不是使用我这个名字来安装win9x的话就不能使用这个注册码，写注册机太繁了，需要花费我很多时间，时间有限就作个破解吧！

6、还好刚才我记下了0046F85A处的机内码，具体如下，
XXXX:0046F85A E9F044F0FF CALL 00403058
XXXX:0046F85F 752B JNZ 0046F88C
红字的地方就是机内码，只要将752B修改为742B就可以。

标 题:照样可以用hmemcpy (656字)
发信人:dr0
时 间:2000-7-15 21:12:52
详细信息:

只不过点击Register按钮的时机要把握好。

015F:0047E52C CALL 004212A0 //这里头调用hmemcpy
015F:0047E531 MOV EAX,[EBP-08]
015F:0047E534 LEA EDX,[EBP-04]
015F:0047E537 CALL 004690C0
015F:0047E53C MOV EAX,[EBP-04]
015F:0047E53F PUSH EAX
015F:0047E540 LEA EDX,[EBP-08]
015F:0047E543 MOV EAX,[ESI+000002F8]
015F:0047E549 CALL 004212A0
015F:0047E54E MOV EDX,[EBP-08] //假注册码
015F:0047E551 POP EAX //真注册码
015F:0047E552 CALL 00403D98 //比较注册码
015F:0047E557 JNZ 0047E584

从程序启动的时候开始跟踪注册码也可以。

标 题:注册机 (2千字)
发信人:dr0
时 间:2000-7-15 21:57:16
详细信息:

有些程序的定时处理中会调用hmemcpy，CTerm也是。

#include <stdio.h>
#include <string.h>

void main(void)
{
long Table[11] = { 0, 5, 7, 3, 2, 0, 1, 4, 8, 3, 8 };
char Name[64];
long sum;
int k;
int len;

printf("Input your name:");
gets(Name);

len = strlen(Name);
if (len > 10)
{
len = 10;
}

sum = 0;
for (k = 1; k < 11; k++)
{
if (len >= k)
{
sum += Table[k-1] * ((long)Name[k-1] & 0xFF);
sum -= Table[k];
}
else
{
sum += (Table[k-1] << 5) + Table[k];
}
}

printf("Your registration code is: WPC25-%06d\n", sum);
}

对应的汇编代码：

015F:004690F1 XOR EBX,EBX
015F:004690F3 MOV EAX,[EBP-04]
015F:004690F6 CALL 00403C88
015F:004690FB MOV ECX,EAX
015F:004690FD CMP ECX,0A
015F:00469100 JLE 00469107
015F:00469102 MOV ECX,0000000A
015F:00469107 MOV EDX,00000001
015F:0046910C MOV EAX,00484CF4
015F:00469111 CMP ECX,EDX
015F:00469113 JGE 00469121
015F:00469115 MOV ESI,[EAX]
015F:00469117 SHL ESI,05
015F:0046911A ADD EBX,ESI
015F:0046911C ADD EBX,[EAX+04]
015F:0046911F JMP 00469131
015F:00469121 MOV ESI,[EBP-04]
015F:00469124 MOVZX ESI,BYTE PTR [EDX+ESI-01]
015F:00469129 IMUL ESI,[EAX]
015F:0046912C ADD EBX,ESI
015F:0046912E SUB EBX,[EAX+04]
015F:00469131 INC EDX
015F:00469132 ADD EAX,04
015F:00469135 CMP EDX,0B
015F:00469138 JNZ 00469111
015F:0046913A LEA EAX,[EBP-0C]
015F:0046913D PUSH EAX
015F:0046913E MOV [EBP-14],EBX
015F:00469141 MOV BYTE PTR [EBP-10],00
015F:00469145 LEA EDX,[EBP-14]
015F:00469148 XOR ECX,ECX
015F:0046914A MOV EAX,004691C4
015F:0046914F CALL 00407E24
015F:00469154 JMP 00469172
015F:00469156 MOV EDX,[EBP-0C]
015F:00469159 MOV EAX,004691D8
015F:0046915E CALL 00403F14
015F:00469163 MOV EBX,EAX
015F:00469165 LEA EAX,[EBP-0C]
015F:00469168 CALL 00403E58
015F:0046916D MOV BYTE PTR [EBX+EAX-01],30
015F:00469172 MOV EDX,[EBP-0C]
015F:00469175 MOV EAX,004691D8
015F:0046917A CALL 00403F14
015F:0046917F TEST EAX,EAX
015F:00469181 JG 00469156


WebZIP V2.72.135

标 题:Tutor 11 How to crack WebZIP V2.72.135
发信人:dREAMtHEATER
时 间:20th, August 1999
详细信息:

作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期: 20th, August 1999

软件背景资料

运行平台: Win9X/NT4
文件名称: WEBZIP272.EXE
程序类型: InterNet工具
下载地点: http://www.spidersoft.com
文件大小: 1,314KB

使用的工具

W32Dasm V8.93--Win9X Dissembler&Debugger
Hex WorkShop V2.54--Hex Editor
RegSnap V2.51--Registry Analyzing Tool
Registry Studio V1.01--Enhanced Registry Editor

难易程度

Easy( ) Medium(x) Hard( ) Pro( )

----------=======声明========----------

未经作者同意，不得修改、引用原文，一切权利保留。
本教程只供教学用，其他一切用途皆被禁止。

----------=======软件介绍========----------

WebZip是目前一个非常流行的网站下载软件，它的很大的一个卖点就是可将下载的站点压缩
为一个Zip文件，方便传输及节省磁盘空间，另外它的界面相当的漂亮，并且可换Skins,同类软件中
它应是你首选的。不过我认为它的不足是启动时间过长，经我检查，此软件又是用Delphi编写的，
而且用了很多第三方的控件，太多的功能必然导致占据较多的系统资源，对于我来说，我不喜欢这
种过多占用系统资源的软件，你呢？

----------=======软件的保护机制========-------

又是Name/Code保护形式，试用期28天，试用期或过期后，如若往回调整系统时间，程序均会
提醒你将系统时间调回，如果是在试用期间调整的，那么将直接导致试用期结束，结束后程序每个
下载任务最多包括50个网页。
未注册时，每次启动均有nag,提醒你还剩多少天的试用期。
用RegSnap拍照、分析注册表后，得知时间与注册信息保存在：
HKEY_USERS\.DEFAULT\Software\Microsoft\IFind\
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Metrics\
两处的键值是完全一模一样的，这就相当于在其中的一处做了备份，试用期过后，只有将两处的键
值同时删去，才能重新获得28天试用期。另外，键值的内容是加密的，包括注册信息，下面是程序
在我的注册表里生成的时间记录值（sample):
4u8h儎厗噲墛E=@I@DCDE敃枟RJMVMQPQR、￥Y`Ж┆f]`f`dcde吹斗nnpo哎究懒旅呐

----------========正文========----------

这个软件如果你没有足够的crack经验，我想几天之内休想破解掉它。我曾经先后几次破解
此软件，但均以失败告终，但昨天站长Cflanker让我帮帮忙，把此软件破掉，于是我抱着最后一线
希望又拿它开刀了！老天真给我面子，这会我终于找到了切入点，看来做什么事情都需要讲究点方
式方法（怎么那么多废话！得！各位看官着急了,我这就话回正题）。
还是老规矩，请出我们的老朋友--W32Dasm,反汇编、等待（够你歇会儿的），OK!
还是先去“String Data References”看看有没有可值得参考的字符串，在这里，我想要的
信息都找到了，我分别到代码窗口去寻找他们对应的代码，看看有没有CALL/TEST/JNE这样的经典结
构，或者reg flag这样的全局变量，很不幸，我迷失在“汇编”丛林中。我可以推测出这些相应的
代码是被寄存器间接寻址方式呼叫的，因此只有在Debugger状态下才能找到源头！
真的没有办法了吗？我开始漫无边际地寻找，也许幸运之神很青睐我，请看下面的代码：

:004E28A8 8B45FC mov eax, dword ptr [ebp-04]
:004E28AB E8241AF2FF call 004042D4
:004E28B0 50 push eax

* Reference To: SHRLK20.InputUnlockCode, Ord:0000h 《==调用动态链结库SHRLK20.DLL的
InputUnlockCode函数
|
:004E28B1 E872F9FFFF Call 004E2228
:004E28B6 33C0 xor eax, eax
:004E28B8 5A pop edx
:004E28B9 59 pop ecx

我终于大彻大悟，原来所有的秘密都在这个SHRLK20.DLL动态链结库里，怪不得找不到CALL的
源头。
接下来我到W32代码窗口开始部分的“IMPORTED FUNCTIONS”处看看程序调用了SHRLK20.DLL
的哪些函数（如下）：

Import Module 021: SHRLK20.DLL

Addr:0011BE5C hint(0000) Name: PassHandle
Addr:0011BE6A hint(0000) Name: InputUnlockCode
Addr:0011BE7C hint(0000) Name: GetUserName
Addr:0011BE8A hint(0000) Name: GetTryNumber
Addr:0011BE9A hint(0000) Name: GetTrialPeriodRemaining
Addr:0011BEB4 hint(0000) Name: CheckProtectionDLL

各个函数的名称非常直接了当，不用我再多说了吧！我非常关心“PassHandle”这个函数，
它极有可能是程序启动时调用的函数。在W32Dasm的search窗口，输入“PassHandle”，查找的结果
有两处,其中一处是由下面的代码呼叫出来的，可不予考虑：

* Referenced by a CALL at Address:
|:0050A8B4
|
:004E2780 55 push ebp
:004E2781 8BEC mov ebp, esp
:004E2783 6A00 push 00000000
:004E2785 53 push ebx
:004E2786 8BD8 mov ebx, eax
:004E2788 33C0 xor eax, eax
:004E278A 55 push ebp
:004E278B 6824284E00 push 004E2824
:004E2790 64FF30 push dword ptr fs:[eax]
:004E2793 648920 mov dword ptr fs:[eax], esp
:004E2796 8B4324 mov eax, dword ptr [ebx+24]
:004E2799 50 push eax

* Reference To: SHRLK20.PassHandle, Ord:0000h
|
:004E279A E891FAFFFF Call 004E2230 〈==trace进去，还是呼叫“
SHRLK20.PassHandle”
:004E279F 33C0 xor eax, eax
:004E27A1 8A4344 mov al, byte ptr [ebx+44]
:004E27A4 50 push eax
:004E27A5 33C0 xor eax, eax
:004E27A7 8A4370 mov al, byte ptr [ebx+70]
:004E27AA 50 push eax
:004E27AB 8B4354 mov eax, dword ptr [ebx+54]
:004E27AE 50 push eax
:004E27AF 8B4350 mov eax, dword ptr [ebx+50]
:004E27B2 50 push eax
:004E27B3 8B434C mov eax, dword ptr [ebx+4C]
:004E27B6 50 push eax
:004E27B7 8B4368 mov eax, dword ptr [ebx+68]
:004E27BA E8151BF2FF call 004042D4
:004E27BF 50 push eax
:004E27C0 8B4360 mov eax, dword ptr [ebx+60]
:004E27C3 E87C99F2FF call 0040C144
:004E27C8 83C4F8 add esp, FFFFFFF8
:004E27CB DD1C24 fstp qword ptr [esp]
:004E27CE 9B wait
:004E27CF 8D55FC lea edx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"ddddd"
|
:004E27D2 B838284E00 mov eax, 004E2838
:004E27D7 E8A091F2FF call 0040B97C
:004E27DC 8B45FC mov eax, dword ptr [ebp-04]
:004E27DF E8F01AF2FF call 004042D4
:004E27E4 50 push eax
:004E27E5 8B436C mov eax, dword ptr [ebx+6C]
:004E27E8 E8E71AF2FF call 004042D4
:004E27ED 50 push eax
:004E27EE 8B4364 mov eax, dword ptr [ebx+64]
:004E27F1 E8DE1AF2FF call 004042D4
:004E27F6 50 push eax
:004E27F7 8B432C mov eax, dword ptr [ebx+2C]
:004E27FA E8D51AF2FF call 004042D4
:004E27FF 50 push eax
:004E2800 8B4328 mov eax, dword ptr [ebx+28]
:004E2803 E8CC1AF2FF call 004042D4
:004E2808 50 push eax

* Reference To: SHRLK20.CheckProtectionDLL, Ord:0000h
|
:004E2809 E8FAF9FFFF Call 004E2208 <==此处出现nag
:004E280E 33C0 xor eax, eax
:004E2810 5A pop edx
:004E2811 59 pop ecx
:004E2812 59 pop ecx
:004E2813 648910 mov dword ptr fs:[eax], edx

* Possible StringData Ref from Code Obj ->"[Y]"
|
:004E2816 682B284E00 push 004E282B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E2829(U)
|
:004E281B 8D45FC lea eax, dword ptr [ebp-04]
:004E281E E86116F2FF call 00403E84
:004E2823 C3 ret

为了验证以上结论，我是在W32Dasm的Debugger状态下通过的，具体操作方式请看W32Dasm的
Help。
再让我们去呼叫此部分代码的上一个CALL去瞧瞧，即:0050A8B4处

:0050A891 E8BA85FCFF call 004D2E50
:0050A896 B201 mov dl, 01
:0050A898 A1B4674F00 mov eax, dword ptr [004F67B4]
:0050A89D E88EBFFEFF call 004F6830
:0050A8A2 A32C815100 mov dword ptr [0051812C], eax
:0050A8A7 8BC3 mov eax, ebx
:0050A8A9 E85AEBFFFF call 00509408
:0050A8AE 8B8314030000 mov eax, dword ptr [ebx+00000314]
:0050A8B4 E8C77EFDFF call 004E2780 〈==呼叫nag
:0050A8B9 A104695100 mov eax, dword ptr [00516904]
:0050A8BE 8B00 mov eax, dword ptr [eax]
:0050A8C0 E84364F4FF call 00450D08
:0050A8C5 A104695100 mov eax, dword ptr [00516904]
:0050A8CA 8B00 mov eax, dword ptr [eax]
:0050A8CC 80B88400000000 cmp byte ptr [eax+00000084], 00
:0050A8D3 0F85BC010000 jne 0050AA95
:0050A8D9 C683D507000000 mov byte ptr [ebx+000007D5], 00
:0050A8E0 B201 mov dl, 01

为了进一步验证，在W32Dasm的Debugger状态下,在:0050A8B4处设断点，又一次验证了结论，
程序执行完此行后，出现nag;将你的系统时间往前调整，再次用此方法验证，还是在这个CALL里出
现提醒你将系统时间调回的messagebox。看来这个CALL是处理程序启动时检查注册信息、试用期是
否已过的部分！
接下来，我试着把此CALL Nop掉，重新运行程序，Bingo!nag没了，窗口的title处也不再有
还剩多少天的适用期的提示，Cool!为了进一步验证，我将系统时间调前调后均没有任何影响，看来
可以收兵了！

The Patch

在文件WebZIP.exe的offset:00109CB4h处，将E8C77EFDFF修改为9090909090,但这不是最好
的办法，你应该知道机器码E8xxxxxxxx代表CALL xxxxxxxx，而B8xxxxxxxx代表MOV eax, xxxxxxxx,
这样只需将E8改为B8即可，是不是很cool,只改半个字节就让程序百分之百注册！

---------========The Final========----------

这回你知道了，在W32Dasm中，除了“String Data References”以外，“IMPORTED
FUNCTIONS”也很重要哦！
祝你好运！下节见。


Winamp 2.04

 标 题:本人首次自己试破解（请各位高手指教一下） (1千字)
发信人:peter007
时 间:2000-8-11 16:45:10
详细信息:
Winamp 2.04
启动winamp.exe
1. 把开关于"wiamp",选Shareware.
2. 按 Enter Registration Info
3. Name: Peter Reg#:78787878
4. Ctrl+N
5. bpx getdlgitemtexta
6. 按 x 返回 再输入一个数学(我用"9")
7. 又被拦阻,到一个"User32!Getdlgitemtexta
8. F10,22次
9. 你会看见 0167:0041EF81 PUSH EAX
10. 我用 d eax 一看有 Peter我字眼，我就定比较地方一定在不远的地方。
11. 本人汇编不好，只是知道Push eax。大概是输入字符到eax中。要输入字符不
就是要用的名字，d了一下果然是。
12. 再往下看:
0167:0041EF82 CALL 0042218 (也许是比比较的地方)
0167:0041EF87 ADD ESP,BYTE+04
0167:0041EF8A CMP EAX,ESI
0167:0041EF8C JNZ 0041EF97
13. 想一下刚才我破解winamp skin maker v1.2时，不用是用Sun Bird翻译了v1.05资料中
14. 不是有"CMP EAX,ESI" 不是用d而用？
15. 试一试：
16. ? EAX
17. DEC=67972642(会不会是注册码？)
18. HEX=40d2e22
19. ? EDI
20. DEC=787878789(不是我刚才用的假码？)
21. HEX=2ef61385
22. CMP EAX,ESI(不就是两个记存器比较？要比较就一定要有注册码吗？)
23. 好试一下，果然是。Yeah!
24. 我再试一下进入0167:0041EF82 CALL 0042218 (也许是比比较的地方)
25. 可能本人技术不行，只能白作工。
这才是本人自己破解的第一个软件，多谢我的师傅和Sun Bird大哥帮助！
我是用手打的，0167:0041EF82 CALL 0042218
……….
0167:0041EF8C JNZ 0041EF97
用trw2000 or soft-ice,能不能copy出来和抓图？


WinAmp Skin Maker v1.05

标 题:破解 WinAmp Skin Maker v1.05
发信人:Sun Bird [CCG]
时 间:2000年3月22日
详细信息:

作者：Sun Bird [CCG]（我，Sun Bird 属于破解团体 China Cracking Group ^_^）

日期：2000年3月22日

国外破解人 DRaCooLa（根据下文估计的，也可能是别人，记不清了^_^）撰写了这
篇使用 SoftICE 追 WinAmp Skin Maker v1.05 注册码的教程，写得非常通俗、详细，
很适合初学破解的朋友学习。

原文中充斥着大量国外 Cracker 专门使用的词汇。这些词汇有些是为了减少击键次
数、有些是为了显示与众不同（装酷^_^）、而有些则纯粹属于拼写错误。同样的词汇也
充斥在 Internet 上。希望学习破解的朋友一定要让自己习惯这类词汇，这样才能看懂
国外最新的破解教程（虽然我不愿意承认，但平心而论，国外 Cracker 的整体水平要比
国内高许多）。

为了帮助尚不熟悉这类词汇的朋友理解这篇好东东，我尽量保持原样翻译。鉴于本人
的 E 文很蹩脚、中文又很糟糕，所以译文有错是在所难免的，请将就着对照原文看吧^_^

译文中以“SB：”开头的话是我加的评语（Sun Bird 嘛^_^），自认为有些对初学者
很有帮助呦^_^

作者在开头即强调“英语不是我的母语”，所以我也借用作者的话为自己找个借口
“Please excuse my English, it's not my mother language !”^_^

翻译人：Sun Bird [CCG]（我，Sun Bird 属于破解团体 China Cracking Group ^_^）

Welcome to another cracking tutor written by .......... ME !!! This time
WE'll crack WinAmp Skin Maker v1.05.
欢迎再次来到我写的破解教程！这次我们将破解 WinAmp Skin Maker v1.05。
------------------------------------------------------------------------
Please excuse my English , it's not my mother language !!!
请不要介意我糟糕的 E 文，那并不是我的母语！（SB：同意！）
------------------------------------------------------------------------

What a fine New Year's Eve I had. I was at Keio's party with many friends
of mine. We had a GREAT time and I hope you all had a good time like us. We
had party till Saturday night *COOL HUH ???*
我过了一个很棒的新年。我和许多朋友在 Keio 处聚会。我们过得非常愉快，我希望
你们所有人都能拥有象我们一样的快乐。我们的聚会一直持续到星期六的晚上，呵呵，够
酷吧？（SB：好象我的新年过得很平淡）

Now for this little sucka !!! I've found a very good cure for it : the REAL
SERIAL NUMBA !!!
现在来看这个小东东！我已经找到了最好的对付它的办法：真正的注册码！（SB：相对
而言，“暴力”破解是最容易的，追踪注册码要难许多，而写出某个软件的注册机才是破解
的终极目标！）

Tools:
工具：

- Soft-Ice (3.x or greater)
SoftICE（3.x 或更高版本）（SB：国产的 TRW2000 更酷）

- Pen and paper
笔和纸（SB：非常重要！破解过程中常常要从头来过，如果不勤于记录，哭去吧……）

- A little bit of brain ( this is the hardest part *COUGH* )
一点点智慧（这是最难的部分，呃呃）（SB：其实破解最需要的还是耐心，记得曾经破解
某个软件，反复达近百次，中间放弃过若干次，而最终破解成功时发现，原来离曾经放弃过
的位置相隔很近）

So let's nail this little sucker:
让我们盯住这个小软件：

1.Install the proggie and run it. It's a pretty cool proggie : you can make
skins for WinAmp with only your imagination and a little bit of art skill.
安装并运行软件。这是个非常棒的软件：你可以自己制作 WinAmp 的外壳，需要的仅
仅是你的想象力和一点点绘画技巧。

2.Try to register it: write your name , in my case DRaCooLa , and write a
serial ex: 2244.
尝试注册它：输入你的名字，在我的例子中用 DRaCooLa，输入注册码，例如 2244。
（SB：我通常使用 Sun Bird [CCG] 和 1234567890）

3.If SI ( Soft-Ice ) is loaded you now should press Ctrl+D and write: BPX
GETDLGITEMTEXTA and press ENTER.. Then press Ctrl+D. If you don't know what this
is then I'll tell you what this is : it's a BREAKPOINT !!! It will break in SI
when WSM ( WinAmp Skin Maker ) when it checks the serial. Now press OK.
当 SI（SoftICE）调入后按 Ctrl-D，输入：BPX GETDLGITEMTEXTA 并回车，然后再按
Ctrl-D。如果你不明白这是在干什么，那么我来告诉你：那是一个断点！它告诉 SI，当 WSM
（WinAmp Skin Maker）检测注册码时中断。现在按 OK。（SB：如果你对 Windows 编程比较
熟悉，那么选择哪个断点会容易得多，否则你可以使用 BPX HMEMCPY）

4.When back in SI press F5 then press F10 till you find this:
当回到 SI 后按 F5，然后按 F10 直到你看到这些：

CMP EDI,EBX

I think you must press F10 about 27 times. When the green line is on the
CMP EDI,EBX line write ? EBX. You should see :
我想你需要按 F10 27次（SB：总有人问为什么按 F12/F10 N 次？原因很简单，通常情
况是当你按 N+1 次时程序告诉你“注册码错误”并停止运行，所以最容易想到的方法就是减
少一次，也就变成 N 次了。另外的原因则是，我已经追过注册码了，我知道只有按 N 次才可
能成功。这个 N 可能是通过我数百次的试验最后得出的，也可能是我的运气好^_^）。当绿色
光棒位于 CMP EDI,EBX 行时，输入 ? EBX（SB：显示寄存器 EBX 的值，第一个数字是 16 进
制，第二个数字是 10 进制）。你应见到：

002E2ABB 0003025595

5.Write down the second code ( 0003025595 ) but whitout the 0's. Now go back
to WSM and write:
记下第二个号码（0003025595），但是不包括“0”。现在重新回到 WSM 并输入：

Name:DRaCooLa
Code:3025595

Now you should see:
现在你会看到：

This program is licensed to
DRaCooLa
3025595

Thanks for reading this tut. I hope you learned something from this tut.
感谢阅读这个教程。我希望你们能够从中学到些什么。（SB：同样的话送给你^_^）


WinBoost 2000 Gold

标 题:WinBoost 2000 Gold 破解教程
发信人:Sun Bird [CCG]
时 间:2000年3月22日
详细信息:

作者：Sun Bird [CCG]（我，Sun Bird 属于破解团体 China Cracking Group ^_^）

日期：2000年3月22日

在网上已经有高手公布了使用 FileMon 跟踪分析注册 WinBoost 2000 Gold
的方法，思路之巧妙、方法之简单，真是令人佩服！我个人感觉，能够使用简单
方法注册成功，应该是 WinBoost 2000 Gold 的疏漏。国外著名 Cracker LW2000
也撰写了同样使用 FileMon 跟踪分析并注册成功的简单方法。看来，无论国内还
是国外，天下 Cracker 是一家^_^

但是很多朋友希望能够使用 SoftICE 追踪出 WinBoost 2000 Gold 的真正注
册码，恰巧 LW2000 还写了这篇教程。那么，就让我用我那蹩脚的 E 文和糟糕的
中文将之 Translate 吧（无关紧要的部分就省略了，因为我只会使用全拼……）。

需要声明的是，我没有安装 WinBoost 2000 Gold，因而译文可能会有错误，
但关键是思路和技巧，所以大家将就着看吧^_^

Name : WinBoost 2000 Gold

Version : generic

Editor : Magellass

s/n saved : win.ini
注册码存储位置：win.ini
Tools : Softice & Brain

Cracker : LW2000
破解人： LW2000（好象属于国际著名破解团体 Phrozen Crew 或 CiA）

翻译人： Sun Bird [CCG]（就是属于破解团体 China Cracking Group 的
意思啦^_^）

日期： 2000年3月16日（刚刚过完“3.15”，哎－我们这些可怜的消费者
强烈要求电信部门提速、降价！）

---
DISCLAIMER
For educational purposes only!
I hold no responsibility of the mis-used of this material!
---

(1) Mhmm... Enter the following details:
输入下面的注册信息：

User Name: LW2000
WB98 Registration Code: 1239900
WB2000 Registration Code: 1230099

I always try to break on GetDlgItemTextA and GetWindowTextA, you
should do the same... it saves a lot of time =)
我通常设断点 GetDlgItemTextA 和 GetWindowTextA……

Try to validate the code.

*BOOM* Sice pops up.
程序被 SoftICE 中断。

We'll have to hit F12 about 13x times till we get a usefull piece
of code:
按 F12 13 次，直到我们到达这段代码：

.004D33D9: 8B80C8020000 mov eax,[eax][0000002C8]
.004D33DF: E88CB9F5FF call .00042ED70
.004D33E4: 8D55F0 lea edx,[ebp][-0010] <-
.004D33E7: 8B45FC mov eax,[ebp][-0004]
.004D33EA: 8B80D8020000 mov eax,[eax][0000002D8]
.004D33F0: E87BB9F5FF call .00042ED70
.004D33F5: 8D55EC lea edx,[ebp][-0014]
.004D33F8: 8B45FC mov eax,[ebp][-0004]
.004D33FB: 8B80CC020000 mov eax,[eax][0000002CC]
.004D3401: E86AB9F5FF call .00042ED70
.004D3406: 8D45F4 lea eax,[ebp][-000C]
.004D3409: 8B55EC mov edx,[ebp][-0014]
.004D340C: E81B07F3FF call .000403B2C
.004D3411: 8B55F8 mov edx,[ebp][-0008]
.004D3414: 8B45FC mov eax,[ebp][-0004]
.004D3417: E8F8FCFFFF call .0004D3114
.004D341C: 8D55E0 lea edx,[ebp][-0020]
.004D341F: E83C4DF3FF call .000408160
.004D3424: 33C0 xor eax,eax
.004D3426: 5A pop edx
.004D3427: 59 pop ecx
.004D3428: 59 pop ecx
.004D3429: 648910 mov fs:[eax],edx
.004D342C: 686E3F4D00 push 0004D3F6E
.004D3431: 837DF000 cmp d,[ebp][-0010],000
.004D3435: 0F84F7090000 je .0004D3E32

(2) Only bullshit, because we don't want to write a keygen, we only
want to have one serial ...

.004D343B: 8B45F0 mov eax,[ebp][-0010] <- WB98 key
我们输入的 WB98 注册码
.004D343E: 8B55E0 mov edx,[ebp][-0020] <- correct key
正确的注册码
.004D3441: E8DA09F3FF call .000403E20 <- compare string
比较注册码
.004D3446: 0F851F010000 jne .0004D356B

There are about 17 more checks after this. The checked key will
not work, because Magellass has found them in the Web!
这里会检测注册码，超过 17 个网上可以找到的注册码不会工作！

(3) Mhmm... great! Then just step until you are by .004D3441. Then
type 'd edx' and write your key down and set a bpx on it.
跟踪到 .004D3441 时，下“ d edx”，记下注册码并在这里设断点。

Ok.. lets type the new key as WB98 code...
重新输入“WB98”正确的注册码……

Back in SoftIce we step through the next code:
回到 SoftICE 跟踪至下面的代码：

.004D35DB: 8B45EC mov eax,[ebp][-0014] <-- WB2K Key
我们输入的 WB2K 注册码
.004D35DE: E82D07F3FF call .000403D10
.004D35E3: 83F814 cmp eax,014 <-- length
长度
.004D35E6: 0F8E5A030000 jle .0004D3946

(4) Mhmm.. does that mean we must have 14h (= 20) or more characters?
maybe, but let the jump do ...
这意味着我们必须输入 14H（20）位或更长的字符？也许，让跳转命令继
续……

.004D3946: 8D45E8 lea eax,[ebp][-0018]
.004D3949: 8B55EC mov edx,[ebp][-0014]
.004D394C: E8DB01F3FF call .000403B2C
.004D3951: 8B45EC mov eax,[ebp][-0014]
.004D3954: E8B703F3FF call .000403D10
.004D3959: 83F817 cmp eax,017 <-- length
长度
.004D395C: 0F8EEA030000 jle .0004D3D4C

(5) Next check.. this time with 17h (=23) or more chars? Let it
be ... trace on with F10
再检测……这次是 17H（23）位或更长？按 F10 继续跟踪

.004D3D4C: 8D45E4 lea eax,[ebp][-001C]
.004D3D4F: 8B55EC mov edx,[ebp][-0014]
.004D3D52: E8D5FDF2FF call .000403B2C
.004D3D57: 33DB xor ebx,ebx
.004D3D59: 8D4DDC lea ecx,[ebp][-0024]
.004D3D5C: 0FBFF3 movsx esi,bx
.004D3D5F: 8BD6 mov edx,esi
.004D3D61: A110684D00 mov eax,[0004D6810]
.004D3D66: 8B00 mov eax,[eax]
.004D3D68: 8B8054020000 mov eax,[eax][000000254]
.004D3D6E: 8B4024 mov eax,[eax][00024]
.004D3D71: 8B38 mov edi,[eax]
.004D3D73: FF570C call d,[edi][0000C]
.004D3D76: 8B55DC mov edx,[ebp][-0024] <-- our key
我们输入的注册码
.004D3D79: 8B45E4 mov eax,[ebp][-001C] <-- a key
一个正确的注册码
.004D3D7C: E89F00F3FF call .000403E20 <-- compare
比较
.004D3D81: 7427 je .0004D3DAA
.004D3D83: 8D4DDC lea ecx,[ebp][-0024]

(6) *g* 'd eax' ... so just write the key down. Let's try it!
下“d eax”，记下注册码

Congratulation! You are an registered user.
祝贺！你是注册用户了。

FINISH! Easy, or?


wincrack

标 题:大家请进来！ (329字)
发信人:guest
时 间:2000-8-23 13:50:12
阅读次数:

详细信息:

各位高手，大侠请帮我看一下这个程序wincrack，它是用UPX加的壳，脱壳倒是很简单，但我一直追不出它的注册码，它好象是根据你输入的注册码来比较注册名，不知我看懂没有？？？还请各位大侠指点我。呜。。呜。。呜。。

它的下载地址是：http://www.imall.com.cn/register/dl.asp?name=filename&url=http://home.online.tj.cn/~whf/whf/wincrack.zip

Name: 郭大志
Code: 1F66167076F15F

cracking for fun

标 题:不要再争了。注册机如下： (1千字)
发信人:dr0
时 间:2000-8-25 13:31:15
详细信息:

 看看就知道算法是怎么样的了。第一个for循环可以优化，懒得做了。

int  k, len;
unsigned char name[7];

unsigned long b[6] =
  { 0xAD, 0xC0, 0x90, 0x9B, 0x26, 0xC3};
unsigned long a[6] =
  { 0x8C, 0x5E, 0x1A, 0x35, 0x4D, 0x96};

unsigned long c[6] =
  { 0xD1, 0xDB, 0x24, 0xBB, 0xC5, 0x82};

unsigned long serial[7],
  tmp;

char buf[64];

len = GetDlgItemTextA(hDlg,
  IDC_USERNAME, (char *)name, 7);
if ( (len < 4) ||
  (len > 6))
{
SetDlgItemTextA(hDlg,
  IDC_REGCODE, "There must be 4~6 chars in your name.");
return
  FALSE;
}

for (k = 0; k < len;
  k++)
{
name[k]
  ^= (a[k] ^ b[k]);
}

//随机数
serial[len] = GetTickCount(
  ) & 0xFF;

for(k = len -1; k >=0;
  k--)
{
c[k] ^=
  serial[k+1];

tmp =
  (unsigned long)name[k];
if (tmp
  > c[k])
{
serial[k] = c[k] + 0x00FF - tmp;
}
else
{
serial[k] = c[k] - tmp;
}
}

for(k =0; k <= len;
  k++)
{
wsprintf(&buf[k*2], "%02lX", serial[k]);
}

SetDlgItemTextA(hDlg,
  IDC_REGCODE, buf);


WinGlobe2.0

 标 题:菜鸟破解录(11)之 WinGlobe2.0 (7千字)
发信人:xiA Qin
时 间:2000-7-24 13:21:12
详细信息:
菜鸟破解录(11)之 WinGlobe2.0

软件名称：WinGlobe
版 本：2.0
简 介：
桌面地球仪，在你的桌面上显示出地球的地图，大小可以自订。用鼠标的移动来“转动”这个地球仪，当鼠标停下来时，它会显示出鼠标所在城市的当地时间。或者你也可以用搜寻的方式找到你要找的城市。它还可以计算出前后两次你鼠标停驻所在位置彼此之间的距离。

作 者：xiA Qin
等 级：很菜....很菜....
破解日期：2000年7月24日
破解工具：Trw2000 1.22
破解目的：学习注册码的破解（有点难）

说 明：

本文是在我的软件破解记录上整理出来的，只作技术交流。如若有纰漏，请各位大侠多指教！

运行程序，输入注册信息。

name: xiA Qin &任意输入
code: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面的代码。
...................

015F:004126AC LEA EAX,[ESP+18]
015F:004126B0 PUSH EDX
015F:004126B1 PUSH EAX
015F:004126B2 CALL 0042E3AA
015F:004126B7 LEA ECX,[ESP+10]
015F:004126BB PUSH EAX
015F:004126BC PUSH ECX
015F:004126BD MOV ECX,ESI
015F:004126BF MOV BYTE PTR [ESP+0000008C],03
015F:004126C7 CALL 00406F40
015F:004126CC LEA ECX,[ESP+14]
015F:004126D0 MOV BYTE PTR [ESP+00000084],05
015F:004126D8 CALL 0042E161
015F:004126DD MOV EDX,[ESP+0C]
015F:004126E1 MOV EAX,[ESP+10] //正确的注册码 D EAX
015F:004126E5 PUSH EDX
015F:004126E6 PUSH EAX
015F:004126E7 CALL 00413CAE
015F:004126EC ADD ESP,08
015F:004126EF TEST EAX,EAX
015F:004126F1 PUSH 00
015F:004126F3 JNZ 00412743 //注册码的比较
015F:004126F5 PUSH 40
015F:004126F7 PUSH 00449B00
015F:004126FC CALL 0043222E
015F:00412701 MOV ECX,[ESP+08]
015F:00412705 PUSH ECX
015F:00412706 PUSH 0044939C
015F:0041270B PUSH 00449394
015F:00412710 MOV ECX,ESI
015F:00412712 CALL 004323DC
015F:00412717 MOV EDX,[ESP+10]
015F:0041271B MOV ECX,ESI
015F:0041271D PUSH EDX
015F:0041271E PUSH 00449384
015F:00412723 PUSH 00449394
015F:00412728 CALL 004323DC
015F:0041272D MOV DWORD PTR [ESI+000000C0],00000001
015F:00412737 MOV EAX,[EDI]
015F:00412739 MOV ECX,EDI
015F:0041273B CALL [EAX+000000C4]
015F:00412741 JMP 0041274F
015F:00412743 PUSH 10
015F:00412745 PUSH 00449AD0
015F:0041274A CALL 0043222E //注册失败对话框
015F:0041274F LEA ECX,[ESP+10]
015F:00412753 MOV BYTE PTR [ESP+00000084],02
015F:0041275B CALL 0042E161
015F:00412760 LEA ECX,[ESP+08]
015F:00412764 MOV BYTE PTR [ESP+00000084],01
015F:0041276C CALL 0042E161
015F:00412771 LEA ECX,[ESP+0C]
015F:00412775 MOV BYTE PTR [ESP+00000084],00
015F:0041277D CALL 0042E161
015F:00412782 LEA ECX,[ESP+78]
015F:00412786 MOV DWORD PTR [ESP+00000084],00000007
015F:00412791 CALL 0042E161
015F:00412796 LEA ECX,[ESP+74]
015F:0041279A MOV BYTE PTR [ESP+00000084],06
015F:004127A2 CALL 0042E161
015F:004127A7 LEA ECX,[ESP+18]
015F:004127AB MOV DWORD PTR [ESP+00000084],FFFFFFFF
015F:004127B6 CALL 0042A348
015F:004127BB MOV ECX,[ESP+7C]
015F:004127BF POP EDI
015F:004127C0 POP ESI
015F:004127C1 MOV FS:[00000000],ECX
015F:004127C8 ADD ESP,00000080
015F:004127CE RET

整理一下,输入注册信息。

name: xiA Qin
code: amawonop

软件名称：WinGlobe
版 本：2.0
简 介：
桌面地球仪，在你的桌面上显示出地球的地图，大小可以自订。用鼠标的移动来“转动”这个地球仪，当鼠标停下来时，它会显示出鼠标所在城市的当地时间。或者你也可以用搜寻的方式找到你要找的城市。它还可以计算出前后两次你鼠标停驻所在位置彼此之间的距离。

作 者：xiA Qin
等 级：很菜....很菜....
破解日期：2000年7月24日
破解工具：Trw2000 1.22
破解目的：学习注册码的破解（有点难）

说 明：

本文是在我的软件破解记录上整理出来的，只作技术交流。如若有纰漏，请各位大侠多指教！

运行程序，输入注册信息。

name: xiA Qin &任意输入
code: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面的代码。
...................

015F:004126AC LEA EAX,[ESP+18]
015F:004126B0 PUSH EDX
015F:004126B1 PUSH EAX
015F:004126B2 CALL 0042E3AA
015F:004126B7 LEA ECX,[ESP+10]
015F:004126BB PUSH EAX
015F:004126BC PUSH ECX
015F:004126BD MOV ECX,ESI
015F:004126BF MOV BYTE PTR [ESP+0000008C],03
015F:004126C7 CALL 00406F40
015F:004126CC LEA ECX,[ESP+14]
015F:004126D0 MOV BYTE PTR [ESP+00000084],05
015F:004126D8 CALL 0042E161
015F:004126DD MOV EDX,[ESP+0C]
015F:004126E1 MOV EAX,[ESP+10] //正确的注册码 D EAX
015F:004126E5 PUSH EDX
015F:004126E6 PUSH EAX
015F:004126E7 CALL 00413CAE
015F:004126EC ADD ESP,08
015F:004126EF TEST EAX,EAX
015F:004126F1 PUSH 00
015F:004126F3 JNZ 00412743 //注册码的比较
015F:004126F5 PUSH 40
015F:004126F7 PUSH 00449B00
015F:004126FC CALL 0043222E
015F:00412701 MOV ECX,[ESP+08]
015F:00412705 PUSH ECX
015F:00412706 PUSH 0044939C
015F:0041270B PUSH 00449394
015F:00412710 MOV ECX,ESI
015F:00412712 CALL 004323DC
015F:00412717 MOV EDX,[ESP+10]
015F:0041271B MOV ECX,ESI
015F:0041271D PUSH EDX
015F:0041271E PUSH 00449384
015F:00412723 PUSH 00449394
015F:00412728 CALL 004323DC
015F:0041272D MOV DWORD PTR [ESI+000000C0],00000001
015F:00412737 MOV EAX,[EDI]
015F:00412739 MOV ECX,EDI
015F:0041273B CALL [EAX+000000C4]
015F:00412741 JMP 0041274F
015F:00412743 PUSH 10
015F:00412745 PUSH 00449AD0
015F:0041274A CALL 0043222E //注册失败对话框
015F:0041274F LEA ECX,[ESP+10]
015F:00412753 MOV BYTE PTR [ESP+00000084],02
015F:0041275B CALL 0042E161
015F:00412760 LEA ECX,[ESP+08]
015F:00412764 MOV BYTE PTR [ESP+00000084],01
015F:0041276C CALL 0042E161
015F:00412771 LEA ECX,[ESP+0C]
015F:00412775 MOV BYTE PTR [ESP+00000084],00
015F:0041277D CALL 0042E161
015F:00412782 LEA ECX,[ESP+78]
015F:00412786 MOV DWORD PTR [ESP+00000084],00000007
015F:00412791 CALL 0042E161
015F:00412796 LEA ECX,[ESP+74]
015F:0041279A MOV BYTE PTR [ESP+00000084],06
015F:004127A2 CALL 0042E161
015F:004127A7 LEA ECX,[ESP+18]
015F:004127AB MOV DWORD PTR [ESP+00000084],FFFFFFFF
015F:004127B6 CALL 0042A348
015F:004127BB MOV ECX,[ESP+7C]
015F:004127BF POP EDI
015F:004127C0 POP ESI
015F:004127C1 MOV FS:[00000000],ECX
015F:004127C8 ADD ESP,00000080
015F:004127CE RET

整理一下,输入注册信息。

name: xiA Qin
code: amawonop


winimp1.11

 标 题:winimp1.11注册码破解 (2千字)
发信人:小楼
时 间:2000-7-16 0:25:29
详细信息:

http://newhua.xingtai.net/down/winimp111-32.exe

winimp1.11注册码破解

WINIMP是一个压缩软件，同等条件下其压缩率远高于WINZIP，是我的新爱。
因为在最新的番外地3。6注册码查询系统中winimp只有0。99版的，不能用，所以就自己破了。

在HELP中可以输入注册码。
首先随便输入一个号码，得到告示“the keys do not match the names...”，再用W32DASM反汇编，从STRING DATA REFERENCE中找到
:004260B5 81FA00000001 cmp edx, 01000000
:004260BB 7216 jb 004260D3
:004260BD 3D00000001 cmp eax, 01000000
:004260C2 720F jb 004260D3
:004260C4 89D0 mov eax, edx
:004260C6 8B55F8 mov edx, dword ptr [ebp-08]
:004260C9 E8D9010000 call 004262A7
:004260CE 3B45FC cmp eax, dword ptr [ebp-04]
:004260D1 7418 je 004260EB

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004260BB(C), :004260C2(C)
|
:004260D3 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"WinImp"
|
:004260D5 6830D24400 push 0044D230

* Possible StringData Ref from Data Obj ->"The keys do not match the name. "
->"Please check your registration "
->"details and try again."
|
:004260DA 6828CC4400 push 0044CC28
:004260DF 56 push esi

* Reference To: USER32.MessageBoxA, Ord:0048h
|
:004260E0 2EFF150CD84300 Call dword ptr cs:[0043D80C]
:004260E7 31C0 xor eax, eax
:004260E9 EB68 jmp 00426153

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004260D1(C)
|
:004260EB BB603C4500 mov ebx, 00453C60

向上看，
1、:004260B5 cmp edx, 01000000 <--edx为key1，必须大于等于01000000
:004260BB jb 004260D3
2、:004260BD cmp eax, 01000000 <--eax为key2，也必须大于等于01000000
:004260C2 jb 004260D3
3、:004260CE cmp eax, dword ptr [ebp-04] <--相等就注册成功
:004260D1 je 004260EB
所以要追入:004260C9 call 004262A7
遗憾的是，其中的计算很烦，不能搞懂，但是我发现在
:004260CE cmp eax, dword ptr [ebp-04]，只要用户名，key1固定，key2值的变化只是影响到eax的变化，且各个数位之间是对应的，所以可以用断点bpx 004260CE，通过改变key2值来猜。
4、结果
name: xixiaolou [CCG]
key1: 10000000
key2: 3e64a67e

标 题:填完正确的注册码什么都不说 (2千字)
发信人:dr0
时 间:2000-7-16 3:49:23
详细信息:

没有"Thank you"之类的东西。

注册机：

#include <stdio.h>

unsigned char Table[256] =
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
};

unsigned long key1, key2;
char sum[4];

void main(void)
{
char Name[64];
int k, index;

printf("Input your name: ");
gets(Name);

do
{
printf("Input HEX key1(must no less than 0x01000000): ");
scanf("%lX", &key1);
} while(key1 < 0x01000000);

for(k = 0; k < 4; k++)
{
sum[k] = 0;
}

k = 0;
index = 0;
while(Name[k])
{
if ((Name[k] == 0x20) || (Name[k] == 0x2E))
{
k++;
continue;
}

index &= 3;
sum[index] += Table[Name[k] & 0xFF];
k++;
index++;
}

_asm
{
pushad

MOV ECX, [key1]
MOV ebp, 0x00000002
MOV EDI,[key1]
JMP _00426259
_00426250:
SHL ebp, 1
CMP ebp, 0
JZ _0042629F
_00426259:
MOV ESI,0xF527789F
MOV EAX,EDI
MOV EDX,EDI
MUL EDX
CMP ESI,EDX
JA _00426273
MOV EBX,EAX
MOV EAX,EDX
XOR EDX,EDX
DIV ESI
MOV EAX,EBX
_00426273:
DIV ESI
MOV ESI, 0xE8B8D413
MOV EAX,EDX
MOV EDI,EDX
TEST ebp,ESI
JZ _00426250
MOV ESI, 0xF527789F
MOV EDX,ECX
MUL EDX
CMP ESI,EDX
JA _00426299
MOV EBX,EAX
MOV EAX,EDX
XOR EDX,EDX
DIV ESI
MOV EAX,EBX
_00426299:
DIV ESI
MOV ECX,EDX
JMP _00426250
_0042629F:

mov eax, dword ptr [sum]
xor eax, ecx
mov [key2], eax

popad
}

printf("Your key2 is: %lX\n", key2);
}

标 题:哇，这么一大堆字符表，dr0你是怎么确定的？ (空)
发信人:1212
时 间:2000-7-16 7:14:15
详细信息:

标 题:在第一次和第二次调用GetDlgItemTextA之间有个循环就是查这个表 (24字)
发信人:dr0
时 间:2000-7-16 10:39:06
阅读次数:30
详细信息:

Blowfish的表格才真的是大

标 题:它有自校验功能保护,不可以改变资源,改变就出错,如何CRACK了它? (空)
发信人:1212
时 间:2000-7-16 11:12:45
阅读次数:12
详细信息:

标 题:simple CRC (2千字)
发信人:dr0
时 间:2000-7-16 11:37:09
详细信息:

015F:00430CB7 CALL CS:[KERNEL32!GetModuleFileNameA]
015F:00430CBE MOV EDX,80000000
015F:00430CC3 LEA EAX,[EBP-0108]
015F:00430CC9 CALL 004355B1 //CreateFileA( )
015F:00430CCE MOV ECX,EAX
015F:00430CD0 CMP EAX,-01
015F:00430CD3 JNZ 00430CDF
015F:00430CD5 MOV EAX,FFFFFFFB
015F:00430CDA JMP 00430DD3
015F:00430CDF MOV EAX,[0044D214]
015F:00430CE4 CALL 00436690
015F:00430CE9 MOV [00453840],EAX
015F:00430CEE TEST EAX,EAX
015F:00430CF0 JNZ 00430CFC
015F:00430CF2 MOV EAX,FFFFFFFE
015F:00430CF7 JMP 00430DD3
015F:00430CFC MOV EBX,[0044D214]
015F:00430D02 MOV EDX,EAX
015F:00430D04 MOV EAX,ECX
015F:00430D06 CALL 00435633 //ReadFile( )
015F:00430D0B CMP EAX,[0044D214] //检查文件长度
015F:00430D11 JZ 00430D1D
015F:00430D13 MOV EAX,FFFFFFFA
015F:00430D18 JMP 00430DD3
015F:00430D1D MOV EAX,ECX
015F:00430D1F CALL 004355FE
015F:00430D24 MOV EAX,[00453840]
015F:00430D29 ADD EAX,[0044D218]
015F:00430D2F MOV DWORD PTR [EAX],00000000
015F:00430D35 MOV EBX,FFFFFFFF
015F:00430D3A MOV EDX,[0044D214]
015F:00430D40 MOV EAX,[00453840]
015F:00430D45 CALL 0042B3A0 //calculate CRC
015F:00430D4A CMP EAX,[0044D21C] //compare CRC
015F:00430D50 JZ 00430D6E //只需把这里改成jmp即可
015F:00430D52 PUSH 30
015F:00430D54 PUSH 0044D230
015F:00430D59 PUSH 0044AEC0
015F:00430D5E PUSH 00
015F:00430D60 CALL CS:[USER32!MessageBoxA]
015F:00430D67 MOV EAX,FFFFFFFF
015F:00430D6C JMP 00430DD3
015F:00430D6E MOV EAX,[00453840]
015F:00430D73 XOR ECX,ECX
015F:00430D75 MOV ESI,EAX
015F:00430D77 ADD EAX,[0044D218]
015F:00430D7D ADD ESI,00405504
015F:00430D83 SUB EAX,00000108
015F:00430D88 SUB ESI,00400A80
015F:00430D8E MOV [EBP-04],EAX
015F:00430D91 MOV EAX,FFFFFFFF
015F:00430D96 JMP 00430DB8

标 题:多谢!!!以后遇到这类情况又如果处理? (空)
发信人:1212
时 间:2000-7-16 11:48:29
详细信息:

标 题:这个可以用bpx MessageBoxA (213字)
发信人:dr0
时 间:2000-7-16 11:55:28
详细信息:

其它常用的对付CRC的断点还有CreateFileA，_lopen，OpenFile( )，ReadFile( )，_hread( )等等。总之只要是跟文件（或者内存映射文件API，因为有的程序用内存映射文件来检查CRC）操作有关的API(Win32或者Win16）都可以拿来做断点。

标 题:修改运行后还是出错,不成功 (空)
发信人:1212
时 间:2000-7-16 13:08:31
详细信息:

标 题:怎么个错法？你是怎么改的？我是这样改的 (418字)
发信人:dr0
时 间:2000-7-16 16:05:02
详细信息:

将
cmp eax, [0044d21c]
jz 00430d6e
（机器码：3b051cd24400741c)
改为
mov [0044d21c], eax
nop
jmp 00430d6e
（机器码：a31cd2440090eb1c）
检查CRC的只此一处，上述改法是没问题的。可能别的地方改错了。

汉化完毕之后最好能恢复上述原来的代码，并在文件中填入新的CRC值（旧CRC值是0x33438027，保存在该文件的偏移0x4C01C处)，这样可以保留该软件检测病毒的功能。


WinRescue 98 v4.16

标 题:破解 WinRescue 98 v4.16
发信人:Sun Bird [CCG]
时 间:2000年3月22日
详细信息:

作者：Sun Bird [CCG]（我，Sun Bird 属于破解团体 China Cracking Group ^_^）

日期：2000年3月22日

属于著名破解团体 CiA（Crackers in Action）的 LW2000 撰写了使用 W32Dasm 破解
WinRescue 98 v4.16 的教程。不好意思，我自作主张地用我那蹩脚的 E 文和糟糕的中文将
之 Translate 了（无关紧要的部分就省略了，因为我只会使用全拼……）^_^

Name : WinRescue 98

Version : 4.16

Editor : Super Win Software (http://superwin.com/)

Target : Rescue98.exe

Tools : W32Dasm & Brain

Cracker : LW2000
破解人： LW2000（属于国际著名破解团体 CiA）

翻译人： Sun Bird [CCG]（我 Sun Bird 属于破解团体 China Cracking Group ^_^）

日期： 2000年3月17日

---
DISCLAIMER
For educational purposes only!
I hold no responsibility of the mis-used of this material!
---

(1) Ok, try to register the program. *BOOM* 'WARNING - Incorrect Key Entered'
Mhmm, seems that we have found a bug, lets fix it!
尝试注册软件时蹦出“WARNING - Incorrect Key Entered”提示。

Load the Program into W32Dasm and search in the SDR for the string.
用 W32Dasm 反编译，搜索字符串“WARNING - Incorrect Key Entered”

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A422(C) <-- here we go
从该地址来的
|

* Possible StringData Ref from Code Obj ->"WARNING - Incorrect Key Entered"
|
:0046A451 B84CA54600 mov eax, 0046A54C
:0046A456 E84940FDFF call 0043E4A4
:0046A45B A14CAA4900 mov eax, dword ptr [0049AA4C]
:0046A460 8B00 mov eax, dword ptr [eax]
:0046A462 E89961FCFF call 00430600

(2) OK, go to 0046A422.
到地址 0046A422 去看看。

* Possible StringData Ref from Code Obj ->"SvetCHRISTA"
|
:0046A416 B8F8A44600 mov eax, 0046A4F8
:0046A41B E8949BF9FF call 00403FB4
:0046A420 85C0 test eax, eax
:0046A422 742D je 0046A451 <-- Bad Boy
关键跳转
:0046A424 33D2 xor edx, edx
:0046A426 8B83F4010000 mov eax, dword ptr [ebx+000001F4]
:0046A42C E82B60FBFF call 0042045C

* Possible StringData Ref from Code Obj ->"Registration Key Accepted"
|
:0046A431 B80CA54600 mov eax, 0046A50C
:0046A436 E86940FDFF call 0043E4A4
:0046A43B A1F8AA4900 mov eax, dword ptr [0049AAF8]
:0046A440 8B00 mov eax, dword ptr [eax]
:0046A442 8B8014020000 mov eax, dword ptr [eax+00000214]
:0046A448 C7400C64000000 mov [eax+0C], 00000064
:0046A44F EB16 jmp 0046A467

(3) Mhmm, 'SvetCHRISTA' what could this be *g*. Another plaintext coded serial...
Try the serial or patch the program by NOPing the je at :0046A422.
“SvetCHRISTA”是什么？一个正确的明码注册码吗？试试使用这串明码或者将 :0046A422
处的 je 改为空指令。

Congratulation! You are a registered user.

FINISH! Easy, or?


Wintility Lite

 标 题:初学者(20) (3千字)
发信人:liutong
时 间:2000-7-15 19:06:48
详细信息:
Wintility(R) Lite 2000 - version 5.3.00
Copyright (C) 1999-2000 PX Technologies, Inc.
http://www.wintility.com
All Rights Reserved

*** Brief Description ***
Wintility Lite is an indispensable tool for any type of user who manages significant
volumes of documents and needs to recover them promptly.
Wintility is a software utility to organize personnal documents and selected e-mail
messages in your computer or network. With a simple and intuitive interface you will
be able to browse through your documents such as texts, projects, worksheets,
presentations, e-mails, images, and any other work that can be saved in your computer.
You will also be allowed to easily manage your documents without activating the program
that originated them, viewing their contents and verifying if they are what you are looking for.

With Wintility you see only the documents and messages of your interest,
controlling all of your work environment, avoiding the exhibition of files
which you don't know the use. Each new document or message received or sent is
automatically identified and catalogued.

Wintility creates a logical catalog, fully personalized, that doesn't interfere with
the original structure of your files in the computer, allowing you to add additional
features to the documents such as descriptions, passwords, expiration dates and versions.

These new features, together with the usual properties of the document, will allow you
to easily identify and retrieve any document stored on your computer.

开始破解时,想找出软件的注册过程,但似乎运算过程比较复杂.
在跟踪过程中,找到:
call 0043DBA0
add esp, 00000008
jz ********
若将jz改为nop,则在注册时,输入任何注册码都可注册,但下次运行时,仍有提示注册的画面.

继续跟踪又发现:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043DC84(C)
|
:0043DC62 8A10 mov dl, byte ptr [eax]
:0043DC64 8A1E mov bl, byte ptr [esi]
:0043DC66 8ACA mov cl, dl
:0043DC68 3AD3 cmp dl, bl
:0043DC6A 90 nop<----***
:0043DC6B 90 nop
:0043DC6C 84C9 test cl, cl
:0043DC6E 7416 je 0043DC86
:0043DC70 8A5001 mov dl, byte ptr [eax+01]
:0043DC73 8A5E01 mov bl, byte ptr [esi+01]
:0043DC76 8ACA mov cl, dl
:0043DC78 3AD3 cmp dl, bl
:0043DC7A 90 nop<----***
:0043DC7B 90 nop
:0043DC7C 83C002 add eax, 00000002
:0043DC7F 83C602 add esi, 00000002
:0043DC82 84C9 test cl, cl
:0043DC84 75DC jne 0043DC62

原来***处为jnz指令，将其改为nop，就不会再有提示注册的画面了．
注意：在用HEX编辑器修改程序时,会搜索到两处上面的代码,两处都要改.

用户名:LiuTong
注册码:87654321
跟踪过程中找到了一个码(3879573111),上面的程序就是比较7654和3111的.
另外软件将用户名和注册码,按下面的方法进行了运算:
m*n=i*600937的1次方=j
m--用户名或注册码的HEX码
n--序号
将用户名(或注册码)每个字符的运算结果j累加
用户名运算后得到E73d9677
注册码运算后得到308606D8
然后我就跟不下去了
若有哪位找出了注册码的生成过程,烦请E-mail给我一份.

标 题:好象是这样的 (1千字)
发信人:dr0
时 间:2000-7-16 2:01:33
详细信息:

注册机

#include <stdio.h>
#include <string.h>
#include <windows.h>

long GenerateNumber(char *s);

void main(void)
{
char Name[64];
long number;
char Serial[9];
char buf[16];

printf("Input your name: ");
gets(Name);

number = GenerateNumber(Name);
sprintf(buf, "%010lu", number);
Serial[1] = buf[6];
Serial[2] = buf[7];
Serial[3] = buf[8];
Serial[4] = buf[9];

//Serial[0]、Serial[5]、Serial[6]是任意的，这里随机生成它们
//Serial[0]不能为0
//并非真正的随机数
number = GetTickCount( ) % 1000;
Serial[0] = (number % 9) + '1';
number /= 10;
Serial[5] = (number % 10) + '0';
number /= 10;
Serial[6] = (number % 10) + '0';

Serial[7] = '\0';

number = GenerateNumber(Serial);
sprintf(buf, "%010lu", number);
Serial[7] = buf[9];

Serial[8] = '\0';

printf("Your registration code is: %s\n", Serial);
}

long GenerateNumber(char *s)
{
long ECX;
long sum;
long k, length;

length = strlen(s);
if (length <= 0) return 0;

sum = 0;
ECX = 0x00600937;

for(k = 0; k < length; k++)
{
sum += (s[k] & 0xFF) * (k+1) * ECX;
ECX *= 0x00600937;
}

return sum;
}


winzip self-extractor2.1

 标 题:winzip self-extractor2.1最新版注册码找法，仅供刚学破解者，高手莫入。 (1千字)
发信人:backboy
时 间:2000-8-6 15:10:31
详细信息:
winzip self-extractor2.1为WINZIP公司出品的一个自解压制作程序的最新版本，网上早有注册机存在，此文的目的仅供初学者练手，它的难度较WINZIP稍高一点，因其中有一个判断使一般破解者爱用的‘78787878’大法失
效，笔者开始就走了一段弯路，只因我爱用‘78787878’大法。（程序只对输入为8位作判断，如输入为8位，则
算码CALL将不被执行，也就谈不上在内存中找到正确的注册码。

难度：一般
破解者：初级
破解工具：SOFTICE
提供对像：刚学破解者，以下只列出关键代码

在注册窗口中输入
NAME：BACKBOY
CODE：787878 （不为8位就行）
CTRL+D呼出SOFTICE后设断HMEMCPY

相应的代码段如下：
0167：00408E44 CMP EAX，08 比较输入的KEY的位数是否为8
0167：00408E47 JNZ 00408E7D 如输入为8位，则出现错误对话框，此处必须跳转
+
+
后一路F10至 0167：00408F0F CALL 00408BE6 按 F8切入，此CALL为计算注册码的CALL。
按F10直至
0167：00408C32 50 PUSH EAX 此处的EAX即为真正的注册码。

NAME:BACKBOY
CODE:302332

顺道提一下WINZIP8。0两个注册码的找法。
下BPX 0137：004692F2 INC ESI
中断第一次可内第一组注册码（数字与字母混合的）
按一下F10，再按F5即可见到第二组全是数字的注册码。


WinZip8.0

 标 题:破解实战（三）之 WinZip8.0 (5千字)
发信人:xiA Qin
时 间:2000-7-17 13:27:30
详细信息:
破解实战（三）之 WinZip8.0

软件名称：WinZip 8.0
简 介：一个强大并且易用的压缩实用程序.（30天试用）
解密日前：2000年7月15日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。

说 明：
本文是在我的软件破解记录上整理出来的。所以在文中没有任何的注册码，只作技术交流。如若有纰漏，请各位大侠多指教！

首先用Trw2000载入Winzip 8.0
输入注册信息
name:xiA Qin &任意输入
register key:1949101 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

一、按F10来到下面指令
015F:00407F73 PUSH EDI
015F:00407F74 CALL 0043F89A
015F:00407F79 PUSH EDI
015F:00407F7A CALL 0043F8C3
015F:00407F7F POP ECX
015F:00407F80 MOV ESI,0048CDA4
015F:00407F85 POP ECX
015F:00407F86 PUSH BYTE +0B
015F:00407F88 PUSH ESI
015F:00407F89 PUSH DWORD 0C81
015F:00407F8E PUSH EBX
015F:00407F8F CALL `USER32!GetDlgItemTextA`
015F:00407F95 PUSH ESI
015F:00407F96 CALL 0043F89A
015F:00407F9B PUSH ESI
015F:00407F9C CALL 0043F8C3
015F:00407FA1 CMP BYTE [0048CD78],00
015F:00407FA8 POP ECX
015F:00407FA9 POP ECX
015F:00407FAA JZ 00408005
015F:00407FAC CMP BYTE [0048CDA4],00
015F:00407FB3 JZ 00408005
015F:00407FB5 CALL 004079D5 //关键CALL。有问题，按F8进入。
015F:00407FBA TEST EAX,EAX //是不是很眼熟。
015F:00407FBC JZ 00408005 //注册码不相等跳到00408005。

1、按F8进入00407FB5 CALL。

015F:00407A7C JZ 00407A91
015F:00407A7E CALL 004082A6
015F:00407A83 AND DWORD [00489FDC],BYTE +00
015F:00407A8A XOR EAX,EAX
015F:00407A8C JMP 00407B42
015F:00407A91 LEA EAX,[EBP+FFFFFEC0]
015F:00407A97 PUSH EAX
015F:00407A98 PUSH EDI
015F:00407A99 CALL 00407B47
015F:00407A9E MOV ESI,0048CDA4
015F:00407AA3 LEA EAX,[EBP+FFFFFEC0] //下指令D ESI, 你输入的注册码。
015F:00407AA9 PUSH ESI //下指令D EAX，真正的注册码。
015F:00407AAA PUSH EAX
015F:00407AAB CALL 004692D0
015F:00407AB0 ADD ESP,BYTE +10
015F:00407AB3 NEG EAX
015F:00407AB5 SBB EAX,EAX
015F:00407AB7 INC EAX
015F:00407AB8 MOV [00489FDC],EAX
015F:00407ABD JNZ 00407B27
015F:00407ABF LEA EAX,[EBP+FFFFFEC0] //下指令D EAX，真正的注册码。
015F:00407AC5 PUSH EAX
015F:00407AC6 PUSH EDI
015F:00407AC7 CALL 00407BE4
015F:00407ACC LEA EAX,[EBP+FFFFFEC0] //下指令D EAX，真正的注册码。(与上面的注册码不同)
015F:00407AD2 PUSH ESI //下指令D ESI, 你输入的注册码。
015F:00407AD3 PUSH EAX
015F:00407AD4 CALL 004692D0
015F:00407AD9 ADD ESP,BYTE +10
015F:00407ADC NEG EAX
015F:00407ADE SBB EAX,EAX
015F:00407AE0 INC EAX
015F:00407AE1 MOV [00489FDC],EAX
015F:00407AE6 JNZ 00407B27
015F:00407AE8 LEA EAX,[EBP+FFFFFEC4]
015F:00407AEE PUSH BYTE +04
015F:00407AF0 PUSH EAX
015F:00407AF1 PUSH ESI
015F:00407AF2 CALL 004696C0
015F:00407AF7 ADD ESP,BYTE +0C
015F:00407AFA TEST EAX,EAX
015F:00407AFC JNZ 00407B20
015F:00407AFE LEA EAX,[EBP+FFFFFEC0]
015F:00407B04 PUSH BYTE +04
015F:00407B06 PUSH EAX
015F:00407B07 PUSH DWORD 0048CDA8
015F:00407B0C CALL 004696C0
015F:00407B11 ADD ESP,BYTE +0C
015F:00407B14 TEST EAX,EAX
015F:00407B16 JNZ 00407B20
015F:00407B18 MOV [00489FDC],EBX
015F:00407B1E JMP SHORT 00407B27
015F:00407B20 AND DWORD [00489FDC],BYTE +00
015F:00407B27 PUSH DWORD 012C
015F:00407B2C LEA EAX,[EBP+FFFFFEC0]
015F:00407B32 PUSH BYTE +00 //下指令D EAX，真正的注册码。
015F:00407B34 PUSH EAX
015F:00407B35 CALL 00467C10
015F:00407B3A MOV EAX,[00489FDC]
015F:00407B3F ADD ESP,BYTE +0C
015F:00407B42 POP EDI
015F:00407B43 POP ESI
015F:00407B44 POP EBX
.......................................

015F:00407FBE PUSH EDI
015F:00407FBF MOV EDI,0047FFA4
015F:00407FC4 PUSH DWORD 0047DB24
015F:00407FC9 PUSH EDI
015F:00407FCA CALL 0043B5DA
015F:00407FCF PUSH ESI
015F:00407FD0 PUSH DWORD 0047E66C
015F:00407FD5 PUSH EDI
015F:00407FD6 CALL 0043B5DA
015F:00407FDB PUSH DWORD 0047FFC4
015F:00407FE0 PUSH BYTE +00
015F:00407FE2 PUSH BYTE +00
015F:00407FE4 PUSH DWORD 0047DB30
015F:00407FE9 CALL 0043B5C1
015F:00407FEE MOV EAX,[00487AF4]
015F:00407FF3 ADD ESP,BYTE +28
015F:00407FF6 TEST EAX,EAX
015F:00407FF8 JZ 00408001
015F:00407FFA PUSH EAX
015F:00407FFB CALL `GDI32!DeleteObject`
015F:00408001 PUSH BYTE +01
015F:00408003 JMP SHORT 00408035
015F:00408005 CALL 004082A6
015F:0040800A PUSH DWORD 028E
015F:0040800F CALL 0043F5ED
015F:00408014 PUSH EAX
015F:00408015 PUSH EBX
015F:00408016 PUSH BYTE +3D
015F:00408018 CALL 00430025 //到这里GAME OVER了,
向上看什么地方可以
跳过这个CALL.

后记：
地址00407AA3、00407ABF与00407ACC、00407B2C显示的注册码不同，但是都可以使用。

太简单了!用了不到五分钟就破了。难怪网上没有winzip 8.0的破解，大侠们不屑一“破”。只好我来破之、记之。


XMLwriter 1.21

 标 题:菜鸟破解录（19）之 XMLwriter 1.21 (9千字)
发信人:xiA Qin
时 间:2000-8-8 17:12:53
详细信息:
菜鸟破解录（19）之 XMLwriter 1.21

软件名称： XMLwriter
软件版本： 1.21
软件下载： http://xmlwriter.net/
软件简介： 支持XML、XSL、DTD、CSS、HTML和普通文本文件的编辑器，其功能有：预览窗口、XML帮助、语法加亮等。

作 者：xiA Qin
级 别：刚学不久
解密日前：2000年8月5日
解密工具：Trw2000 1.22
破解目的：学习注册码的破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行XMLwriter
输入注册信息

Name: xiA Qin &任意输入

SN: 1234567890 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............

015F:0042ADB7 CALL 004DC849
015F:0042ADBC MOV EBP,[EAX+04]
015F:0042ADBF PUSH ECX
015F:0042ADC0 LEA EBX,[EDI+0000011C] //输入的姓名
015F:0042ADC6 MOV ECX,ESP
015F:0042ADC8 MOV [ESP+14],ESP
015F:0042ADCC PUSH EBX
015F:0042ADCD CALL 004B7535
015F:0042ADD2 LEA ESI,[EBP+000000C0]
015F:0042ADD8 PUSH 4C
015F:0042ADDA MOV ECX,ESI
015F:0042ADDC CALL 0044E240
015F:0042ADE1 PUSH ECX
015F:0042ADE2 LEA EAX,[EDI+00000120] //输入的注册码
015F:0042ADE8 MOV ECX,ESP
015F:0042ADEA MOV [ESP+14],ESP
015F:0042ADEE PUSH EAX
015F:0042ADEF CALL 004B7535
015F:0042ADF4 PUSH 4D
015F:0042ADF6 MOV ECX,ESI
015F:0042ADF8 CALL 0044E240
015F:0042ADFD MOV ECX,EBP
015F:0042ADFF CALL 00448240 //注册码运算子程序。按F8进入
015F:0042AE04 TEST EAX,EAX
015F:0042AE06 JZ 0042AE23 //注册码比较。
.............................

按F8进入0042ADFF CALL 00448240

按F10来到下面指令

015F:00448240 PUSH FF
015F:00448242 PUSH 004ECA42
015F:00448247 MOV EAX,FS:[00000000]
015F:0044824D PUSH EAX
015F:0044824E MOV FS:[00000000],ESP
015F:00448255 SUB ESP,1C
015F:00448258 PUSH EBX
015F:00448259 PUSH ESI
015F:0044825A LEA EAX,[ESP+18]
015F:0044825E PUSH 4C
015F:00448260 MOV ESI,ECX
015F:00448262 PUSH EAX
015F:00448263 CALL 004435B0
015F:00448268 LEA ECX,[ESP+14]
015F:0044826C PUSH 4D
015F:0044826E XOR EBX,EBX
015F:00448270 PUSH ECX
015F:00448271 MOV ECX,ESI
015F:00448273 MOV [ESP+34],EBX
015F:00448277 CALL 004435B0
015F:0044827C PUSH 0052FB20
015F:00448281 PUSH 005286A0
015F:00448286 LEA ECX,[ESP+1C]
015F:0044828A MOV BYTE PTR [ESP+34],01
015F:0044828F CALL 004AE937
015F:00448294 MOV EDX,[0052D034]
015F:0044829A MOV [ESP+08],EDX
015F:0044829E PUSH ECX
015F:0044829F LEA EAX,[ESP+1C]
015F:004482A3 MOV ECX,ESP
015F:004482A5 MOV [ESP+20],ESP
015F:004482A9 PUSH EAX
015F:004482AA MOV BYTE PTR [ESP+34],02
015F:004482AF CALL 004B7535
015F:004482B4 MOV ECX,ESI
015F:004482B6 CALL 00448B10
015F:004482BB MOV [ESP+1C],EAX
015F:004482BF MOV [ESP+20],EBX
015F:004482C3 FILD QWORD PTR [ESP+1C]
015F:004482C7 FMUL REAL8 PTR [004FC170]
015F:004482CD FSTP REAL8 PTR [ESP+1C]
015F:004482D1 MOV ECX,[ESP+20]
015F:004482D5 MOV EDX,[ESP+1C]
015F:004482D9 PUSH ECX
015F:004482DA PUSH EDX
015F:004482DB CALL 0049E4DB
015F:004482E0 FSUBR REAL8 PTR [ESP+24]
015F:004482E4 FMUL REAL8 PTR [004FC168]
015F:004482EA FSTP REAL8 PTR [ESP]
015F:004482ED CALL 0049E4DB
015F:004482F2 CALL 0049E4B4
015F:004482F7 PUSH EAX
015F:004482F8 LEA EAX,[ESP+14]
015F:004482FC PUSH 0052869C
015F:00448301 PUSH EAX
015F:00448302 CALL 004AF06B
015F:00448307 MOV ECX,[ESP+1C] //注册码的前面部分 D ECX
015F:0044830B ADD ESP,14
015F:0044830E MOV EAX,[ECX-08]
015F:00448311 CMP EAX,0A
015F:00448314 JGE 0044832E
015F:00448316 PUSH 00522B28
015F:0044831B LEA ECX,[ESP+0C]
015F:0044831F CALL 004B7B9C
015F:00448324 MOV EDX,[ESP+08]
015F:00448328 CMP DWORD PTR [EDX-08],0A
015F:0044832C JL 00448316
015F:0044832E PUSH ECX
015F:0044832F LEA EAX,[ESP+0C]
015F:00448333 MOV ECX,ESP
015F:00448335 MOV [ESP+20],ESP
015F:00448339 PUSH EAX
015F:0044833A CALL 004B7535
015F:0044833F MOV ECX,ESI
015F:00448341 CALL 00448CB0
015F:00448346 XOR EDX,EDX
015F:00448348 MOV ECX,00000064
015F:0044834D DIV ECX
015F:0044834F MOV EAX,[0052D034]
015F:00448354 MOV [ESP+10],EAX
015F:00448358 PUSH EDX
015F:00448359 LEA ECX,[ESP+14]
015F:0044835D PUSH 0052869C
015F:00448362 PUSH ECX
015F:00448363 MOV BYTE PTR [ESP+38],03
015F:00448368 CALL 004AF06B
015F:0044836D MOV EAX,[ESI+1C]
015F:00448370 ADD ESP,0C
015F:00448373 CMP EAX,EBX
015F:00448375 JNZ 004483A4
015F:00448377 PUSH 00002094
015F:0044837C CALL 004B7E4E
015F:00448381 ADD ESP,04
015F:00448384 MOV [ESP+1C],EAX
015F:00448388 CMP EAX,EBX
015F:0044838A MOV BYTE PTR [ESP+2C],04
015F:0044838F JZ 0044839A
015F:00448391 MOV ECX,EAX
015F:00448393 CALL 00418FF0
015F:00448398 JMP 0044839C
015F:0044839A XOR EAX,EAX
015F:0044839C MOV BYTE PTR [ESP+2C],03
015F:004483A1 MOV [ESI+1C],EAX
015F:004483A4 MOV EDX,[ESP+10]
015F:004483A8 MOV ESI,00000002 //注册码的后面两位。D ECX
015F:004483AD CMP [EDX-08],ESI
015F:004483B0 JGE 004483C9
015F:004483B2 PUSH 00522B28
015F:004483B7 LEA ECX,[ESP+14]
015F:004483BB CALL 004B7B9C
015F:004483C0 MOV EAX,[ESP+10]
015F:004483C4 CMP [EAX-08],ESI
015F:004483C7 JL 004483B2
015F:004483C9 LEA ECX,[ESP+10]
015F:004483CD PUSH ECX
015F:004483CE LEA ECX,[ESP+0C]
015F:004483D2 CALL 004B7BD8
015F:004483D7 LEA EDX,[ESP+18]
015F:004483DB LEA ECX,[ESP+0C]
015F:004483DF PUSH EDX
015F:004483E0 CALL 004B7535
015F:004483E5 LEA ECX,[ESP+0C]
015F:004483E9 MOV BYTE PTR [ESP+2C],05
015F:004483EE CALL 004B7D39
015F:004483F3 PUSH 00528694
015F:004483F8 LEA ECX,[ESP+10]
015F:004483FC CALL 004AECE5
015F:00448401 TEST EAX,EAX
015F:00448403 JZ 004484DE
015F:00448409 PUSH 0052868C
015F:0044840E LEA ECX,[ESP+10]
015F:00448412 CALL 004AECE5
015F:00448417 TEST EAX,EAX
015F:00448419 JZ 004484DE
015F:0044841F PUSH 00528684
015F:00448424 LEA ECX,[ESP+10]
015F:00448428 CALL 004AECE5
015F:0044842D TEST EAX,EAX
015F:0044842F JZ 004484DE
015F:00448435 PUSH 00528678
015F:0044843A LEA ECX,[ESP+10]
015F:0044843E CALL 004AECE5
015F:00448443 TEST EAX,EAX
015F:00448445 JZ 004484DE
015F:0044844B MOV ESI,[ESP+14]
015F:0044844F MOV EAX,[ESP+08] //输入的注册码 D EAX
015F:00448453 MOV DL,[EAX] //正确的注册码 D EAX
015F:00448455 MOV CL,DL
015F:00448457 CMP DL,[ESI]
015F:00448459 JNZ 00448477
015F:0044845B CMP CL,BL
015F:0044845D JZ 00448473
015F:0044845F MOV DL,[EAX+01]
015F:00448462 MOV CL,DL
015F:00448464 CMP DL,[ESI+01]
015F:00448467 JNZ 00448477
015F:00448469 ADD EAX,02
015F:0044846C ADD ESI,02
015F:0044846F CMP CL,BL
015F:00448471 JNZ 00448453
015F:00448473 XOR EAX,EAX
015F:00448475 JMP 0044847C
015F:00448477 SBB EAX,EAX
015F:00448479 SBB EAX,-01
015F:0044847C CMP EAX,EBX
015F:0044847E MOV BYTE PTR [ESP+2C],03
015F:00448483 LEA ECX,[ESP+0C]
015F:00448487 JNZ 004484E7
015F:00448489 CALL 004B77C0
015F:0044848E LEA ECX,[ESP+10]
015F:00448492 MOV BYTE PTR [ESP+2C],02
015F:00448497 CALL 004B77C0
015F:0044849C LEA ECX,[ESP+08]
015F:004484A0 MOV BYTE PTR [ESP+2C],01
015F:004484A5 CALL 004B77C0
015F:004484AA LEA ECX,[ESP+14]
015F:004484AE MOV [ESP+2C],BL
015F:004484B2 CALL 004B77C0
015F:004484B7 LEA ECX,[ESP+18]
015F:004484BB MOV DWORD PTR [ESP+2C],FFFFFFFF
015F:004484C3 CALL 004B77C0
015F:004484C8 MOV EAX,00000001
015F:004484CD MOV ECX,[ESP+24]
015F:004484D1 MOV FS:[00000000],ECX
015F:004484D8 POP ESI
015F:004484D9 POP EBX
015F:004484DA ADD ESP,28
015F:004484DD RET

............................

015F:0042AE08 MOV ECX,EDI
015F:0042AE0A CALL 004B369D
015F:0042AE0F PUSH 4C
015F:0042AE11 MOV ECX,ESI
015F:0042AE13 CALL 0044E3E0
015F:0042AE18 PUSH 4D
015F:0042AE1A MOV ECX,ESI
015F:0042AE1C CALL 0044E3E0
015F:0042AE21 JMP 0042AE95
015F:0042AE23 PUSH ECX
015F:0042AE24 LEA EAX,[EDI+00000120]
015F:0042AE2A MOV ECX,ESP
015F:0042AE2C MOV [ESP+14],ESP
015F:0042AE30 PUSH EAX
015F:0042AE31 CALL 004B7535
015F:0042AE36 PUSH ECX
015F:0042AE37 MOV BYTE PTR [ESP+28],01
015F:0042AE3C MOV ECX,ESP
015F:0042AE3E MOV [ESP+1C],ESP
015F:0042AE42 PUSH EBX
015F:0042AE43 CALL 004B7535
015F:0042AE48 MOV ECX,EBP
015F:0042AE4A MOV BYTE PTR [ESP+28],00
015F:0042AE4F CALL 00448540 //注册失败对话框
015F:0042AE54 TEST EAX,EAX
015F:0042AE56 JZ 0042AE61
015F:0042AE58 MOV ECX,EDI
015F:0042AE5A CALL 004B36B6
015F:0042AE5F JMP 0042AE95

整理一下,输入注册信息。

Name: xiA Qin

Serial Number: 397203763183

注册信息在注册表中
[HKEY_CURRENT_USER\Software\Wattle Software\XMLwriter 1.0\Preferences]
"RegName"="xiA Qin"
"RegNo"="397203763183"


超级点击机器II V0.63

 标 题:超级点击机器II　V0.63 破解实录 (8千字)
发信人:liangs
时 间:2000-8-23 23:31:33
详细信息:
超级点击机器II　V0.63 破解实录

下载地址：http://zjfeng.yeah.net
软件简介: 帮大家多赚点广告费的东东。

作 者：liangs
解密工具：Trw2000 1.22 、W32Dasm Ver8.93 超级中文版

最近，从白菜乐园下载了一个超级点击机器II的破解文件，发现它是
暴力修改程序，其实，完全不用这样，其注册码的破解也很简单。

首先，用W32Dasm Ver8.93超级中文版将MoreCounter.exe主程序反汇编，
然后在W32Dasm的数据串列表中可以发现"谢谢你的注册,请重新启动超级
点击机器II"的字样。该程序输入注册码后，若不对则什么也不提示，以
上的提示无疑是我们破解的出发点。

:0040513C E85F040000 call 004055A0 <---输入注册码的判断
:00405141 84C0 test al, al <---注册码错误标志为0
:00405143 7448 je 0040518D <---标志为0，跳出注册程序
:00405145 6A00 push 00000000
:00405147 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"谢谢你的注册,请重新
启动超级点击机器II"
|
:00405149 68648C4200 push 00428C64 <---我们停在这儿
:0040514E E87F620100 call 0041B3D2
:00405153 E8E8870100 call 0041D940
:00405158 8B8C24D0010000 mov ecx, dword ptr [esp+000001D0]
:0040515F 8B7004 mov esi, dword ptr [eax+04]
:00405162 51 push ecx

从00405149往上看，很明显0040513C处是注册码的比较判断点，F8跟入。

-----------------------------------------------------------------
由上面 call 004055A0 跟入：

* Referenced by a CALL at Addresses:
|:004044B0 , :0040513C

上面两个Call的地址，一个是程序启动用来判断是否注册，另一个当然就是
目前注册码判断的Call，大家都公用的一个子程序。因此，要打补丁的话，
也要打在这个子程序里面。

:004055A0 6AFF push FFFFFFFF
:004055A2 6880F54100 push 0041F580
:004055A7 64A100000000 mov eax, dword ptr fs:[00000000]
:004055AD 50 push eax
:004055AE 64892500000000 mov dword ptr fs:[00000000], esp
:004055B5 83EC08 sub esp, 00000008
:004055B8 56 push esi
:004055B9 68D8A44200 push 0042A4D8
:004055BE 8D4C2408 lea ecx, dword ptr [esp+08]
:004055C2 C744241801000000 mov [esp+18], 00000001
:004055CA E8D3340100 call 00418AA2
:004055CF 8B44241C mov eax, dword ptr [esp+1C]
:004055D3 33F6 xor esi, esi
:004055D5 C644241402 mov [esp+14], 02
:004055DA 8B48F8 mov ecx, dword ptr [eax-08]
:004055DD 85C9 test ecx, ecx
:004055DF 7E28 jle 00405609

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405607(C)
|
:004055E1 83FE0A cmp esi, 0000000A
:004055E4 7D23 jge 00405609
:004055E6 0FBE0406 movsx eax, byte ptr [esi+eax]
:004055EA 99 cdq
:004055EB B90A000000 mov ecx, 0000000A
:004055F0 F7F9 idiv ecx
:004055F2 8D4C2404 lea ecx, dword ptr [esp+04]
:004055F6 80C230 add dl, 30
:004055F9 52 push edx
:004055FA E886370100 call 00418D85
:004055FF 8B44241C mov eax, dword ptr [esp+1C]
:00405603 46 inc esi
:00405604 3B70F8 cmp esi, dword ptr [eax-08]
:00405607 7CD8 jl 004055E1

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004055DF(C), :004055E4(C)

* Possible StringData Ref from Data Obj ->"zjfeng.yeah.net"
|
:00405609 68CC8C4200 push 00428CCC
:0040560E 8D4C2408 lea ecx, dword ptr [esp+08]
:00405612 E847370100 call 00418D5E
:00405617 8D542408 lea edx, dword ptr [esp+08]
:0040561B 6A0A push 0000000A
:0040561D 52 push edx
:0040561E 8D4C240C lea ecx, dword ptr [esp+0C]
:00405622 E8EBE00000 call 00413712
:00405627 50 push eax
:00405628 8D4C2408 lea ecx, dword ptr [esp+08]
:0040562C C644241803 mov [esp+18], 03
:00405631 E8EB340100 call 00418B21
:00405636 8D4C2408 lea ecx, dword ptr [esp+08]
:0040563A C644241402 mov [esp+14], 02
:0040563F E8F0330100 call 00418A34

:00405644 8B742420 mov esi, dword ptr [esp+20]
^^^ <--根据输入的ID算出的注册号；

:00405648 8B442404 mov eax, dword ptr [esp+04]
^^^ <--输入的假注册号；

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040566A(C)
|
:0040564C 8A10 mov dl, byte ptr [eax]
取[EAX]的第一位数
:0040564E 8ACA mov cl, dl
:00405650 3A16 cmp dl, byte ptr [esi]
取[ESI]的第一位数
:00405652 751C jne 00405670
不等就跳走
:00405654 84C9 test cl, cl
是否已是最后一位数
:00405656 7414 je 0040566C
是就跳走
:00405658 8A5001 mov dl, byte ptr [eax+01]
取[EAX]的下一位数
:0040565B 8ACA mov cl, dl
:0040565D 3A5601 cmp dl, byte ptr [esi+01]
取[ESI]的下一位数
:00405660 750E jne 00405670
不等就跳走
:00405662 83C002 add eax, 00000002
调整指针指向EAX再下一位
:00405665 83C602 add esi, 00000002
调整指针指向ESI再下一位
:00405668 84C9 test cl, cl
是否已是最后一位
:0040566A 75E0 jne 0040564C
不是就跳到0040564C循环取数比较

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405656(C)
|
:0040566C 33C0 xor eax, eax
:0040566E EB05 jmp 00405675

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00405652(C), :00405660(C)
|
:00405670 1BC0 sbb eax, eax
:00405672 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040566E(U)
|
:00405675 85C0 test eax, eax
:00405677 5E pop esi
:00405678 C644241001 mov [esp+10], 01
:0040567D 8D4C2400 lea ecx, dword ptr [esp]
:00405681 7537 jne 004056BA
:00405683 E8AC330100 call 00418A34
:00405688 8D4C2418 lea ecx, dword ptr [esp+18]
:0040568C C644241000 mov [esp+10], 00
:00405691 E89E330100 call 00418A34
:00405696 8D4C241C lea ecx, dword ptr [esp+1C]
:0040569A C7442410FFFFFFFF mov [esp+10], FFFFFFFF
:004056A2 E88D330100 call 00418A34

:004056A7 B001 mov al, 01 <---注册成功标志

:004056A9 8B4C2408 mov ecx, dword ptr [esp+08]
:004056AD 64890D00000000 mov dword ptr fs:[00000000], ecx
:004056B4 83C414 add esp, 00000014
:004056B7 C20800 ret 0008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405681(C)
|
:004056BA E875330100 call 00418A34
:004056BF 8D4C2418 lea ecx, dword ptr [esp+18]
:004056C3 C644241000 mov [esp+10], 00
:004056C8 E867330100 call 00418A34
:004056CD 8D4C241C lea ecx, dword ptr [esp+1C]
:004056D1 C7442410FFFFFFFF mov [esp+10], FFFFFFFF
:004056D9 E856330100 call 00418A34
:004056DE 8B4C2408 mov ecx, dword ptr [esp+08]

:004056E2 32C0 xor al, al <---注册失败,标志位置0

:004056E4 64890D00000000 mov dword ptr fs:[00000000], ecx
:004056EB 83C414 add esp, 00000014
:004056EE C20800 ret 0008

-------------------------------------------------------------
一个可用的注册码：
ID: 1234567890 注册码：9012345678

注：如果你用它帮你挣了Money,希望你注册该软件，支持一下作者。


超级信封打印工具 v3.2

 标 题:菜鸟破解实录（八）之 超级信封打印工具 v3.2 (6千字)
发信人:xiA Qin
时 间:2000-7-21 15:23:58
详细信息:
菜鸟破解实录（八）之 超级信封打印工具 v3.2

软件名称：超级信封打印工具 v3.2 -->(30天试用)
简 介：看名字就知道。

作 者：xiA Qin
级 别：很菜.....很菜......
解密日前：2000年7月21日
解密工具：Trw2000 1.22
破解目的：软件作者的太串了、太嚣张了，为破解论谈争气。

说 明：
本文是在我的软件破解记录上整理出来的。所以在文中没有任何的注册码，只作技术交流。如若有纰漏，请各位大侠多指教！

首先运行超级信封打印工具
输入注册信息

register key: xxxx-xx-xxx

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............
015F:004AB037 807C38FF2D CMP BYTE [EAX+EDI-01],2D
015F:004AB03C 7503 JNZ 004AB041
015F:004AB03E FF45F8 INC DWORD [EBP-08]
015F:004AB041 47 INC EDI
015F:004AB042 4E DEC ESI
015F:004AB043 75E1 JNZ 004AB026
015F:004AB045 837DF802 CMP DWORD [EBP-08],BYTE +02
015F:004AB049 0F857E010000 JNZ NEAR 004AB1CD //检查注册码的格式
015F:004AB04F 8D55F4 LEA EDX,[EBP-0C] 是否是xxxx-xx-xxx格式
015F:004AB052 8B83D0020000 MOV EAX,[EBX+02D0]
015F:004AB058 E8EB87F8FF CALL 00433848
015F:004AB05D 8B55F4 MOV EDX,[EBP-0C]
015F:004AB060 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB065 8B00 MOV EAX,[EAX]
015F:004AB067 0518110000 ADD EAX,1118
015F:004AB06C E87B8CF5FF CALL 00403CEC
015F:004AB071 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB076 8B00 MOV EAX,[EAX]
015F:004AB078 8B55FC MOV EDX,[EBP-04]
015F:004AB07B E870480200 CALL 004CF8F0
015F:004AB080 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB085 8B00 MOV EAX,[EAX]
015F:004AB087 8B55FC MOV EDX,[EBP-04]
015F:004AB08A E861470200 CALL 004CF7F0
015F:004AB08F A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB094 8B00 MOV EAX,[EAX]
015F:004AB096 8B55FC MOV EDX,[EBP-04]
015F:004AB099 E852490200 CALL 004CF9F0
015F:004AB09E A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB0A3 8B00 MOV EAX,[EAX]
015F:004AB0A5 8B80781B0000 MOV EAX,[EAX+1B78]
015F:004AB0AB 8B15A42C4D00 MOV EDX,[004D2CA4]
015F:004AB0B1 8B12 MOV EDX,[EDX]
015F:004AB0B3 3B82081D0000 CMP EAX,[EDX+1D08]
015F:004AB0B9 0F8504010000 JNZ NEAR 004AB1C3 //注册码中间的位数
015F:004AB0BF A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB0C4 8B00 MOV EAX,[EAX]
015F:004AB0C6 8B80C0710000 MOV EAX,[EAX+71C0]
015F:004AB0CC 8B15A42C4D00 MOV EDX,[004D2CA4]
015F:004AB0D2 8B12 MOV EDX,[EDX]
015F:004AB0D4 3B8208700000 CMP EAX,[EDX+7008]
015F:004AB0DA 0F85E3000000 JNZ NEAR 004AB1C3 //比较注册码后面的第一位。
015F:004AB0E0 A1A42C4D00 MOV EAX,[004D2CA4] 正确就成功注册。
015F:004AB0E5 8B00 MOV EAX,[EAX]
015F:004AB0E7 8B8034710000 MOV EAX,[EAX+7134]
015F:004AB0ED 8B15A42C4D00 MOV EDX,[004D2CA4]
015F:004AB0F3 8B12 MOV EDX,[EDX]
015F:004AB0F5 3B82A46F0000 CMP EAX,[EDX+6FA4]
015F:004AB0FB 0F85C2000000 JNZ NEAR 004AB1C3
015F:004AB101 B804B24A00 MOV EAX,004AB204
015F:004AB106 E879A4FAFF CALL 00455584 //注册成功对话框
015F:004AB10B 8B8314030000 MOV EAX,[EBX+0314]
015F:004AB111 E82A28F8FF CALL 0042D940
015F:004AB116 8D55F4 LEA EDX,[EBP-0C]
015F:004AB119 8B83D0020000 MOV EAX,[EBX+02D0]
015F:004AB11F E82487F8FF CALL 00433848
015F:004AB124 8B55F4 MOV EDX,[EBP-0C]
015F:004AB127 8B8314030000 MOV EAX,[EBX+0314]
015F:004AB12D 8B80EC010000 MOV EAX,[EAX+01EC]
015F:004AB133 8B08 MOV ECX,[EAX]
015F:004AB135 FF5134 CALL NEAR [ECX+34]
015F:004AB138 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB13D 8B00 MOV EAX,[EAX]
015F:004AB13F 8B808C030000 MOV EAX,[EAX+038C]
015F:004AB145 B201 MOV DL,01
015F:004AB147 E8247BF9FF CALL 00442C70
015F:004AB14C A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB151 8B00 MOV EAX,[EAX]
015F:004AB153 055C770000 ADD EAX,775C
015F:004AB158 BA1CB24A00 MOV EDX,004AB21C
015F:004AB15D E88A8BF5FF CALL 00403CEC
015F:004AB162 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB167 8B00 MOV EAX,[EAX]
015F:004AB169 8B8880050000 MOV ECX,[EAX+0580]
015F:004AB16F A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB174 8B00 MOV EAX,[EAX]
015F:004AB176 8B905C770000 MOV EDX,[EAX+775C]
015F:004AB17C 8D45F0 LEA EAX,[EBP-10]
015F:004AB17F E8DC8DF5FF CALL 00403F60
015F:004AB184 8B55F0 MOV EDX,[EBP-10]
015F:004AB187 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB18C 8B00 MOV EAX,[EAX]
015F:004AB18E E8E586F8FF CALL 00433878
015F:004AB193 A1A42C4D00 MOV EAX,[004D2CA4]
015F:004AB198 8B00 MOV EAX,[EAX]
015F:004AB19A 8B907C050000 MOV EDX,[EAX+057C]
015F:004AB1A0 8D45F0 LEA EAX,[EBP-10]
015F:004AB1A3 B93CB24A00 MOV ECX,004AB23C
015F:004AB1A8 E8B38DF5FF CALL 00403F60
015F:004AB1AD 8B55F0 MOV EDX,[EBP-10]
015F:004AB1B0 8B8314030000 MOV EAX,[EBX+0314]
015F:004AB1B6 8B80EC010000 MOV EAX,[EAX+01EC]
015F:004AB1BC 8B08 MOV ECX,[EAX]
015F:004AB1BE FF5164 CALL NEAR [ECX+64]
015F:004AB1C1 EB0A JMP SHORT 004AB1CD
015F:004AB1C3 B854B24A00 MOV EAX,004AB254
015F:004AB1C8 E8B7A3FAFF CALL 00455584 //注册失败对话框

整里一下：

软件比较注册码xxxx-xx-xxx
^
第一位数字

所以将注册码 0000-00-x00 将x用阿拉伯数字123456789都试一遍。就可以注册。
^^^^ ^^ ^^
随便输
比如：我的计算机是 0000-00-600

后 记：
超级信封打印工具 v3.2是通过读取安装目录下的文件zhuceFile.data来判断，程序是否注册。如果把文件zhuceFile.data删除， 超级信封打印工具 v3.2又成了非注册版。

软件作者的太串了、太嚣张了，我从看到他的留言到现在连吃饭、下载、分析、记录破解过程一共用了2小时。没有破不掉的软件。希望他记住他讲过的话。

标 题:鸟破解实录（八）之 超级信封打印工具 v3.2补充 (2千字)
发信人:xiA Qin
时 间:2000-7-21 17:25:01
详细信息:

菜鸟破解实录（八）之 超级信封打印工具 v3.2补充

软件名称：超级信封打印工具 v3.2 -->(30天试用)
简 介：看名字就知道。

作 者：xiA Qin
级 别：很菜.....很菜......
解密日前：2000年7月21日16：53
解密工具：Trw2000 1.22
破解目的：软件作者的太串了、太嚣张了。

说 明：
刚刚被软件作者气糊涂了，写的不正确。只好重新破解。不好意思啦！！！

本文是在我的软件破解记录上整理出来的。所以在文中没有任何的注册码，只作技术交流。如若有纰漏，请各位大侠多指教！

首先运行超级信封打印工具

下指令bpx hmemcpy //下中断点

按F5回到程序，按打印按扭，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
...............

015F:004CB09A 33C0 XOR EAX,EAX
015F:004CB09C EB02 JMP SHORT 004CB0A0
015F:004CB09E B001 MOV AL,01
015F:004CB0A0 80BB0D11000000 CMP BYTE [EBX+110D],00
015F:004CB0A7 7412 JZ 004CB0BB
015F:004CB0A9 80BB0E11000000 CMP BYTE [EBX+110E],00
015F:004CB0B0 7409 JZ 004CB0BB
015F:004CB0B2 80BB0F11000000 CMP BYTE [EBX+110F],00
015F:004CB0B9 7504 JNZ 004CB0BF
015F:004CB0BB 84C0 TEST AL,AL
015F:004CB0BD 741F JZ 004CB0DE //修改这里。
015F:004CB0BF E8C492F5FF CALL 00424388
015F:004CB0C4 E8778AF5FF CALL 00423B40
015F:004CB0C9 8BD6 MOV EDX,ESI
015F:004CB0CB 8BC3 MOV EAX,EBX
015F:004CB0CD E822F9FFFF CALL 004CA9F4
015F:004CB0D2 E8B192F5FF CALL 00424388
015F:004CB0D7 E8008BF5FF CALL 00423BDC
015F:004CB0DC EB0A JMP SHORT 004CB0E8
015F:004CB0DE B814B14C00 MOV EAX,004CB114
015F:004CB0E3 E89CA4F8FF CALL 00455584
015F:004CB0E8 33C0 XOR EAX,EAX
015F:004CB0EA 5A POP EDX
015F:004CB0EB 59 POP ECX
015F:004CB0EC 59 POP ECX
015F:004CB0ED 648910 MOV [FS:EAX],EDX
015F:004CB0F0 6805B14C00 PUSH DWORD 004CB105
015F:004CB0F5 8D45FC LEA EAX,[EBP-04]
015F:004CB0F8 E89B8BF3FF CALL 00403C98 //时间过期对话框

整里一下：

从上面可以看出.

将004CB0BD 741F JZ 004CB0DE
改004CB0BD 751F JNZ 004CB0DE
就可以注册。
整里一下，用Ultraedt打开xf.exe

找到74 1F E8 C4 92

改成75 1F E8 C4 92

保存修改文件，重新运行。

还是那句，没有解不开的密。希望作者多在软件的质量上下功夫。


炒股理财 v1.13

 标 题:炒股理财 v1.13破解实战录！ (3千字)
发信人:八爪鱼
时 间:2000-8-24 15:58:53
详细信息:
炒股理财 v1.13

作者：八爪鱼
破解工具：TRW2000 v1.22注册版、RegShot v1.01i

很久没有写什么文章了，今天先写一个简单一点的，过几天有一篇关于软件带有广告条的破解方法，奉献给大家！！！

启动炒股理财，在帮助中选择软件注册码，填写你的注册码，当时是破解使用的78大法啰，
在注册码中填写“78787878”，注意一定要填写满8个，一个都不能多，也一个都不能少，

启动TRW2000，下bpx hmemcpy，F5返回，点下“确定”漫长的破解之路开始了，大家慢慢
听我来讲，按几下F12（大概是14下）和F10之后来到下面地址：

0177:00413619 CALL 0051323C
0177:0041361E LEA EAX,[EBP-04]
0177:00413621 CALL 005133C8
0177:00413626 CMP EAX,BYTE +08 //判断注册码是不是8位，如果是就继续，如果不是就结束了！！
0177:00413629 JNZ NEAR 0041388C
0177:0041362F CMP DWORD [EBP-04],BYTE +00
0177:00413633 JZ 0041363A
0177:00413635 MOV EDX,[EBP-04]
0177:00413638 JMP SHORT 0041363F
0177:0041363A MOV EDX,0051D315
0177:0041363F MOV ECX,08
0177:00413644 MOV EAX,EBX
0177:00413646 CALL 0041354C
0177:0041364B MOVSX EAX,AX
0177:0041364E ADD ESI,EAX
0177:00413650 LEA EAX,[EBP-04]
0177:00413653 CALL 005133C8
0177:00413658 SUB ESI,EAX
0177:0041365A MOV WORD [EBP-3C],2C
0177:00413660 MOV EAX,EBX
0177:00413662 CALL 004130E8
0177:00413667 XOR EDX,EDX
0177:00413669 LEA ECX,[EBP-10]
0177:0041366C MOV [EBP-10],EDX
0177:0041366F MOV EDX,08
0177:00413674 INC DWORD [EBP-30]
0177:00413677 CALL 004FCC8C
0177:0041367C CMP DWORD [EBP-10],BYTE +00
0177:00413680 JZ 00413687
0177:00413682 MOV EDX,[EBP-10]
0177:00413685 JMP SHORT 0041368C
0177:00413687 MOV EDX,0051D316
0177:0041368C MOV ECX,08
0177:00413691 MOV EAX,EBX
0177:00413693 CALL 0041354C
0177:00413698 MOVSX EAX,AX
0177:0041369B SUB ESI,EAX
0177:0041369D DEC DWORD [EBP-30]
0177:004136A0 LEA EAX,[EBP-10]
0177:004136A3 MOV EDX,02
0177:004136A8 CALL 0051323C //下面那个JNZ一跳同样也结束，所以进入这个CALL！！
0177:004136AD TEST ESI,ESI
0177:004136AF JNZ NEAR 0041388C
0177:004136B5 MOV DL,01
0177:004136B7 MOV EAX,[004A0A78]

通过“0177:004136A8 CALL 0051323C”按F8之后来到下载这里
0177:0051323C PUSH EBP
0177:0051323D MOV EBP,ESP
0177:0051323F PUSH ECX
0177:00513240 PUSH EBX
0177:00513241 PUSH ESI
0177:00513242 MOV ESI,EDX
0177:00513244 MOV [EBP-04],EAX
0177:00513247 CMP DWORD [EBP-04],BYTE +00
0177:0051324B JZ 00513266
0177:0051324D MOV EAX,[EBP-04]
0177:00513250 CALL 0050587C //继续按F8进入，查看注册码的判断！！
0177:00513255 TEST ESI,01
0177:0051325B JZ 00513266
0177:0051325D PUSH DWORD [EBP-04]

从“0177:00513250 CALL 0050587C”按F8之后来到下面的注册码比较地；
0177:0050587C MOV EDX,[EAX]
0177:0050587E TEST EDX,EDX //下D EDX就可以看到你的注册码了！！！
0177:00505880 JZ 0050589D
0177:00505882 MOV DWORD [EAX],00
0177:00505888 MOV ECX,[EDX-08]
0177:0050588B DEC ECX
0177:0050588C JL 0050589D
0177:0050588E MOV [EDX-08],ECX
0177:00505891 JNZ 0050589D
0177:00505893 PUSH EAX
0177:00505894 LEA EAX,[EDX-08]

拿到注册码之后，就可以注册了，最后再看看这个软件的注册码存放地，它存放在：
“HKEY_LOCAL_MACHINE\Software\Hong System Ltd.\炒股理财”
里面！！！

另外许多朋友来信问我如何将TRW2000中的屏幕信息拷贝下来，具体的方法你可以参考
TRW2000的说明文件，我这里使用了一个比较简单的方法，具体如下：
u 413619,4136BC > fwd
413619－－拷贝的起始地址
4136BC－－拷贝的结束地址
>－－重定向到文件
fwd－－最后生成的文件

八爪鱼
2000/8/24


程式猎人 1.2

 标 题:破解 程式猎人 1.2 (2千字)
发信人:lihtao
时 间:2000-8-10 0:17:12
详细信息:
软件名称：程式猎人 1.2
软件版本：1.2
软件下载: http://go.163.com/~brothers/works/setup.exe
简 介：非注册版的程式猎人只有一个功能限制：程序组总数不能超过六个。非注册版会在你前十五次使用本软件时对你进行提醒，以后就不会自动提醒你注册了。
作 者：Lihtao
级 别：刚学不久
解密日前：2000年8月9日
解密工具：W32DASM 8.93 TRW2000 1.22
破解目的：学习破解。（简单）

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

用TRW2000载入程式猎人 1.2（phunter.exe） , run , 调出注册框，填入注册名（随便）和注册码 12345678 ，详细跟踪看上一节

到：

:004037FF FF1528964000 Call dword ptr [00409628]
:00403805 47 inc edi
:00403806 81FF30750000 cmp edi, 00007530

81FF01000000 cmp edi, 00000001 如果嫌那进度条慢!

:0040380C 7CDA jl 004037E8
:0040380E 8B86A4000000 mov eax, dword ptr [esi+000000A4]
:00403814 BF80969800 mov edi, 00989680
:00403819 3BC7 cmp eax, edi
:0040381B 7E59 jle 00403876 如果注册码小于或等于10000000，死！
:0040381D 3DFFE0F505 cmp eax, 05F5E0FF
:00403822 7D52 jge 00403876 如果注册码大于或等于99999999，死！
:00403824 55 push ebp
:00403825 8BEF mov ebp, edi
:00403827 99 cdq
:00403828 F7FD idiv ebp
:0040382A 8B8EA0000000 mov ecx, dword ptr [esi+000000A0]
:00403830 50 push eax
:00403831 51 push ecx
:00403832 8BCE mov ecx, esi
:00403834 E854000000 call 0040388D
:00403839 8BC8 mov ecx, eax
:0040383B 8B86A4000000 mov eax, dword ptr [esi+000000A4]
:00403841 99 cdq
:00403842 F7FF idiv edi
:00403844 5D pop ebp
:00403845 3BCA cmp ecx, edx
:00403847 752D jne 00403876 不等！死！

742D je 00403876 成功了吧！

:00403849 53 push ebx
:0040384A 53 push ebx
:0040384B 6864D24000 push 0040D264

注：建议大家在修改注册前，先将文件备份一份，等注册成功后将原文件拷回即可！


词汇终结者

 标 题:词汇终结者破解实录 (7千字)
发信人:liangs
时 间:2000-8-13 21:36:59
详细信息:
首先将WordsendReg.exe考到词汇终结者安装目录下，如果不考到词汇终结者安装目录下，反汇编出来的地址是不一样的，我不知是为什么？这个版本的W32Dasm实在是太COOL了！然后用W32Dasm Ver8.93超级中文版反汇编，我用English版的W32Dasm Ver8.93就不能反汇编WordsendReg.exe，而且W32Dasm Ver8.93超级中文版将程序里面的汉字都能反汇编出来。

当W32Dasm反汇编完后，点击工具栏上的"Strn ReF",在数据串项目列表后面可以看见"注册码错误!"的条目，双击该条目。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401C65(C)
|
:00401DBE 8D4C244C lea ecx, dword ptr [esp+4C]
:00401DC2 E86A940100 call 0041B231
:00401DC7 6A00 push 00000000
:00401DC9 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"注册码错误！"
|
:00401DCB 683CC24200 push 0042C23C ---我们在这
:00401DD0 8BCB mov ecx, ebx
:00401DD2 E8457D0100 call 00419B1C

可以看见"注册码错误！"的提示是从地址：00401C65处过来的。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401BC6(C)
|
:00401C27 8B442448 mov eax, dword ptr [esp+48]
:00401C2B 6A00 push 00000000
:00401C2D 0517B00F00 add eax, 000FB017
:00401C32 8D4C2434 lea ecx, dword ptr [esp+34]
:00401C36 50 push eax
:00401C37 E87C950100 call 0041B1B8
:00401C3C 8B6C2468 mov ebp, dword ptr [esp+68]
:00401C40 8B542430 mov edx, dword ptr [esp+30]
:00401C44 689E960100 push 0001969E
:00401C49 55 push ebp
:00401C4A 8D4C2438 lea ecx, dword ptr [esp+38]
:00401C4E FF5234 call [edx+34]
:00401C51 8B442418 mov eax, dword ptr [esp+18]
:00401C55 8B4C2428 mov ecx, dword ptr [esp+28]
:00401C59 50 push eax
:00401C5A 51 push ecx
:00401C5B E872820000 call 00409ED2 ---注册码比较
:00401C60 83C408 add esp, 00000008
:00401C63 85C0 test eax, eax
:00401C65 0F8553010000 jne 00401DBE ---注册码不对就跳到错误显示处了,
正确就提示注册成功！并展开字库
:00401C6B 8B542460 mov edx, dword ptr [esp+60]
:00401C6F 8B44244C mov eax, dword ptr [esp+4C]
:00401C73 68615B0300 push 00035B61
:00401C78 52 push edx
:00401C79 8D4C2454 lea ecx, dword ptr [esp+54]
:00401C7D FF5038 call [eax+38]
:00401C80 8B54244C mov edx, dword ptr [esp+4C]
:00401C84 689E960100 push 0001969E
:00401C89 55 push ebp
:00401C8A 8D4C2454 lea ecx, dword ptr [esp+54]
:00401C8E FF5238 call [edx+38]
:00401C91 8B44244C mov eax, dword ptr [esp+4C]
:00401C95 6807410A00 push 000A4107
:00401C9A 57 push edi
:00401C9B 8D4C2454 lea ecx, dword ptr [esp+54]
:00401C9F FF5038 call [eax+38]
:00401CA2 8B54244C mov edx, dword ptr [esp+4C]
:00401CA6 68A4E50600 push 0006E5A4
:00401CAB 56 push esi
:00401CAC 8D4C2454 lea ecx, dword ptr [esp+54]
:00401CB0 FF5238 call [edx+38]
:00401CB3 8B442448 mov eax, dword ptr [esp+48]
:00401CB7 8B4C2470 mov ecx, dword ptr [esp+70]
:00401CBB 8B54244C mov edx, dword ptr [esp+4C]
:00401CBF 50 push eax
:00401CC0 51 push ecx
:00401CC1 8D4C2454 lea ecx, dword ptr [esp+54]
:00401CC5 FF5238 call [edx+38]
:00401CC8 8D4C244C lea ecx, dword ptr [esp+4C]
:00401CCC E860950100 call 0041B231
:00401CD1 A178C54200 mov eax, dword ptr [0042C578]
:00401CD6 89442424 mov dword ptr [esp+24], eax
:00401CDA 89442440 mov dword ptr [esp+40], eax
:00401CDE 6A0D push 0000000D
:00401CE0 6A0A push 0000000A
:00401CE2 8D442448 lea eax, dword ptr [esp+48]

* Possible StringData Ref from Data Obj ->"%c%c"
|
:00401CE6 6800C24200 push 0042C200
:00401CEB 50 push eax
:00401CEC C684245001000012 mov byte ptr [esp+00000150], 12
:00401CF4 E867460100 call 00416360
:00401CF9 83C410 add esp, 00000010
:00401CFC 8D8C24D4000000 lea ecx, dword ptr [esp+000000D4]
:00401D03 51 push ecx

* Possible Reference to Dialog: DialogID_0064
|

* Possible Reference to Dialog: DialogID_7801, CONTROL_ID:0064, ""
|
:00401D04 6A64 push 00000064

* Reference To: KERNEL32.GetCurrentDirectoryA, Ord:00F5h
|
:00401D06 FF1580324200 Call dword ptr [00423280]
:00401D0C 6A0D push 0000000D
:00401D0E 8D9424D8000000 lea edx, dword ptr [esp+000000D8]
:00401D15 6A0A push 0000000A
:00401D17 52 push edx
:00401D18 8D442430 lea eax, dword ptr [esp+30]

* Possible StringData Ref from Data Obj ->"注册成功！在当前目录(%s)下已生成名为wordslib.z"
->"ip的词库压缩文件，%c%c详细用法请查看压缩文件里"
->"的readme.txt! "
|
:00401D1C 6894C14200 push 0042C194
:00401D21 50 push eax
:00401D22 E839460100 call 00416360
:00401D27 83C414 add esp, 00000014
:00401D2A 8D4C2440 lea ecx, dword ptr [esp+40]
:00401D2E 8D542424 lea edx, dword ptr [esp+24]
:00401D32 8D442464 lea eax, dword ptr [esp+64]
:00401D36 51 push ecx
:00401D37 52 push edx
:00401D38 50 push eax
:00401D39 E8C89C0100 call 0041BA06

* Possible StringData Ref from Data Obj ->"请妥善保存注册码和用户名！以备将来更新词库和升"
->"级文件！"
|
:00401D3E 685CC14200 push 0042C15C
:00401D43 8D4C246C lea ecx, dword ptr [esp+6C]
:00401D47 50 push eax
:00401D48 51 push ecx
:00401D49 C684244C01000013 mov byte ptr [esp+0000014C], 13
:00401D51 E8169D0100 call 0041BA6C
:00401D56 50 push eax
:00401D57 8D4C2428 lea ecx, dword ptr [esp+28]
:00401D5B C684244401000014 mov byte ptr [esp+00000144], 14
:00401D63 E8A89B0100 call 0041B910
:00401D68 8D4C2468 lea ecx, dword ptr [esp+68]
:00401D6C C684244001000013 mov byte ptr [esp+00000140], 13
:00401D74 E85E9A0100 call 0041B7D7
:00401D79 8D4C2464 lea ecx, dword ptr [esp+64]
:00401D7D C684244001000012 mov byte ptr [esp+00000140], 12
:00401D85 E84D9A0100 call 0041B7D7
:00401D8A 8B542424 mov edx, dword ptr [esp+24]
:00401D8E 6A30 push 00000030
:00401D90 6A00 push 00000000
:00401D92 52 push edx
:00401D93 8BCB mov ecx, ebx
:00401D95 E8827D0100 call 00419B1C
:00401D9A 8D4C2440 lea ecx, dword ptr [esp+40]
:00401D9E C684244001000011 mov byte ptr [esp+00000140], 11
:00401DA6 E82C9A0100 call 0041B7D7
:00401DAB 8D4C2424 lea ecx, dword ptr [esp+24]
:00401DAF C684244001000007 mov byte ptr [esp+00000140], 07
:00401DB7 E81B9A0100 call 0041B7D7
:00401DBC EB23 jmp 00401DE1

在地址00401C5B处设断，下'd eax','d ecx' ,你就可以看到注册码了。


打字高手V3.0

 标 题:打字高手V3.0前两天有人问 (4千字)
发信人:1212
时 间:2000-8-5 8:49:45
详细信息:
015F:004B808E 8B45FC MOV EAX,[EBP-04]
015F:004B8091 50 PUSH EAX
015F:004B8092 FF358C1E4E00 PUSH DWORD [004E1E8C]
015F:004B8098 FF35881E4E00 PUSH DWORD [004E1E88]
015F:004B809E 8D45F8 LEA EAX,[EBP-08]
015F:004B80A1 E81E12F5FF CALL 004092C4
015F:004B80A6 8B55F8 MOV EDX,[EBP-08]
015F:004B80A9 58 POP EAX //下d edx是你需要的
015F:004B80AA E82DBFF4FF CALL 00403FDC
015F:004B80AF 0F85CB000000 JNZ NEAR 004B8180 //跳转则显示失败对话框
015F:004B80B5 8B832C030000 MOV EAX,[EBX+032C]
015F:004B80BB E8A01FFDFF CALL 0048A060
015F:004B80C0 8B832C030000 MOV EAX,[EBX+032C]
015F:004B80C6 E8093CFDFF CALL 0048BCD4
015F:004B80CB 8D55FC LEA EDX,[EBP-04]
015F:004B80CE 8B8320030000 MOV EAX,[EBX+0320]
015F:004B80D4 E8E3A1F7FF CALL 004322BC
015F:004B80D9 8B55FC MOV EDX,[EBP-04]
015F:004B80DC 8D45E8 LEA EAX,[EBP-18]
015F:004B80DF E810CEF4FF CALL 00404EF4
015F:004B80E4 8D45E8 LEA EAX,[EBP-18]
015F:004B80E7 50 PUSH EAX
015F:004B80E8 BA14824B00 MOV EDX,004B8214
015F:004B80ED 8B832C030000 MOV EAX,[EBX+032C]
015F:004B80F3 E8B429FDFF CALL 0048AAAC
015F:004B80F8 5A POP EDX
015F:004B80F9 8B08 MOV ECX,[EAX]
015F:004B80FB FF919C000000 CALL NEAR [ECX+9C]
015F:004B8101 8B832C030000 MOV EAX,[EBX+032C]
015F:004B8107 8B10 MOV EDX,[EAX]
015F:004B8109 FF92E4010000 CALL NEAR [EDX+01E4]
015F:004B810F 8B832C030000 MOV EAX,[EBX+032C]
015F:004B8115 E8521FFDFF CALL 0048A06C
015F:004B811A A188004E00 MOV EAX,[004E0088]
015F:004B811F 8B00 MOV EAX,[EAX]
015F:004B8121 8B8078030000 MOV EAX,[EAX+0378]
015F:004B8127 33D2 XOR EDX,EDX
015F:004B8129 E8D6AAF9FF CALL 00452C04
015F:004B812E 6A00 PUSH BYTE +00
015F:004B8130 668B0D1C824B00 MOV CX,[004B821C]
015F:004B8137 B202 MOV DL,02
015F:004B8139 B828824B00 MOV EAX,004B8228
015F:004B813E E8F1E6F9FF CALL 00456834 //跳出注册成功对话框
015F:004B8143 33D2 XOR EDX,EDX
015F:004B8145 8B83E0020000 MOV EAX,[EBX+02E0]
015F:004B814B 8B08 MOV ECX,[EAX]
015F:004B814D FF5160 CALL NEAR [ECX+60]
015F:004B8150 33D2 XOR EDX,EDX
015F:004B8152 8B83F0020000 MOV EAX,[EBX+02F0]
015F:004B8158 8B08 MOV ECX,[EAX]
015F:004B815A FF5160 CALL NEAR [ECX+60]
015F:004B815D 33D2 XOR EDX,EDX
015F:004B815F 8B8318030000 MOV EAX,[EBX+0318]
015F:004B8165 8B08 MOV ECX,[EAX]
015F:004B8167 FF5160 CALL NEAR [ECX+60]
015F:004B816A 33D2 XOR EDX,EDX
015F:004B816C 8B8320030000 MOV EAX,[EBX+0320]
015F:004B8172 8B08 MOV ECX,[EAX]
015F:004B8174 FF5160 CALL NEAR [ECX+60]
015F:004B8177 8BC3 MOV EAX,EBX
015F:004B8179 E82236F9FF CALL 0044B7A0
015F:004B817E EB59 JMP SHORT 004B81D9
----------------------------------------------------------------
015F:004B8180 FF05841E4E00 INC DWORD [004E1E84]
015F:004B8186 A188004E00 MOV EAX,[004E0088]
015F:004B818B 8B00 MOV EAX,[EAX]
015F:004B818D 8B8078030000 MOV EAX,[EAX+0378]
015F:004B8193 B201 MOV DL,01
015F:004B8195 E86AAAF9FF CALL 00452C04
015F:004B819A 6A00 PUSH BYTE +00
015F:004B819C 668B0D1C824B00 MOV CX,[004B821C]
015F:004B81A3 B202 MOV DL,02
015F:004B81A5 B848824B00 MOV EAX,004B8248
015F:004B81AA E885E6F9FF CALL 00456834
015F:004B81AF 833D841E4E0014 CMP DWORD [004E1E84],BYTE +14
015F:004B81B6 7521 JNZ 004B81D9
015F:004B81B8 6A00 PUSH BYTE +00
015F:004B81BA 668B0D1C824B00 MOV CX,[004B821C]
015F:004B81C1 33D2 XOR EDX,EDX
--------------------------------------------------------------------
015F:004B81C3 B88C824B00 MOV EAX,004B828C
015F:004B81C8 E867E6F9FF CALL 00456834
015F:004B81CD A108044E00 MOV EAX,[004E0408]
015F:004B81D2 8B00 MOV EAX,[EAX]
015F:004B81D4 E8C36DF9FF CALL 0044EF9C
015F:004B81D9 33C0 XOR EAX,EAX
015F:004B81DB 5A POP EDX
015F:004B81DC 59 POP ECX
015F:004B81DD 59 POP ECX
015F:004B81DE 648910 MOV [FS:EAX],EDX


单词抓取器 V1.71

 标 题:单词抓取器 V1.71 (看雪和dr0，各大客帮帮） (1千字)
发信人:peter007
时 间:2000-7-10 19:50:21
详细信息:
高春辉 http://www.tiandown.com/
·单词抓取器 V1.71

设计公司： http://go.163.com/~wllwllwll/
作 者： 吴雷雷
联系邮件： wllwllwll@sina.com
版 本： V1.71
档案大小： 255KB
本地下载： 是
更新日期： 2000-7-9 17:38:00
授权方式： 共享软件 （国产）
有效期限： 15天
注册费用： 15.00￥
应用平台： Windows 95/98/NT
软件评价：
浏览次数： 4/23（周/总）
下载次数： 2/5（周/总）
下载时间： 使用 56K Modem 需耗时 1 分钟
使用 128K ISDN 需耗时 1 分钟

说 明：
单词抓取器的主要功能是将金山词霸动态翻译出来的单词（包括单词、音标和解释）自动或者手动抓取下来并且保存到文件当中，您可以将每一个单词设定难度等级，并且将它们分类管理。之后还可以利用单词抓取器背单词，支持全程语音技术(TTS) ，准确读出么一单词帮助您学习英语。除此之外，您还可以将单词分类，将不同类别的单词分门别类的放到不同的类别中形成你自己的单词库，这样使您的单词条理清晰明了。强大的单词查询功能能够迅速的查找到您需要的单词。

新增功能： V1.71
作了若干改进工作。

如果您发现软件不能下载，请发信通知 mailto:bug@corp.tiandown.com?subject=报告，编号为2193的软件不能正常下载！，谢谢！
ftp://ftp.tiandown.com/pub/software/appli/app-edit/grabber171.zip
dr0曾经说要我学好English,但学好它单词是最要的。
最好把破解过程写详细一点，还有下的中断。
最好把密码整理出来。

标 题:peter同志真是执着 (5千字)
发信人:dr0
时 间:2000-7-10 20:38:31
详细信息:

用bpx GetWindowTextA作断点，中断后清除断点，再按4次F12，就到下面：

015F:00403BBD CALL 0043731F //调用GetWindowTextA
015F:00403BC2 MOV EAX,[ESI+5C]
015F:00403BC5 CMP DWORD PTR [EAX-08],06 //检查Name的长度
015F:00403BC9 JGE 00403BE9
015F:00403BCB PUSH 00
015F:00403BCD PUSH 40
015F:00403BCF PUSH 00474200 //“名字至少6个字符！”
015F:00403BD4 CALL 00444F4B //MessageBoxA
015F:00403BD9 POP ESI
015F:00403BDA MOV ECX,[ESP+10]
015F:00403BDE MOV FS:[00000000],ECX
015F:00403BE5 ADD ESP,1C
015F:00403BE8 RET
015F:00403BE9 PUSH EAX
015F:00403BEA LEA EAX,[ESP+0C]
015F:00403BEE PUSH EAX
015F:00403BEF MOV ECX,ESI
015F:00403BF1 CALL 00403D00 //生成注册码，没新东西，拷贝下来就是注册机
015F:00403BF6 MOV EAX,[ESI+60]
015F:00403BF9 MOV ECX,[ESP+08]
015F:00403BFD PUSH EAX
015F:00403BFE PUSH ECX
015F:00403BFF MOV DWORD PTR [ESP+24],00000000
015F:00403C07 CALL 00422239 //比较注册码
015F:00403C0C ADD ESP,08
015F:00403C0F TEST EAX,EAX
015F:00403C11 JZ 00403C42
015F:00403C13 PUSH 00
015F:00403C15 PUSH 40
015F:00403C17 PUSH 004741F0 //注册码不正确
015F:00403C1C CALL 00444F4B //MessageBoxA
015F:00403C21 LEA ECX,[ESP+08]
015F:00403C25 MOV DWORD PTR [ESP+1C],FFFFFFFF
015F:00403C2D CALL 00438954
015F:00403C32 POP ESI
015F:00403C33 MOV ECX,[ESP+10]
015F:00403C37 MOV FS:[00000000],ECX
015F:00403C3E ADD ESP,1C
015F:00403C41 RET
015F:00403C42 PUSH EBX
015F:00403C43 XOR EBX,EBX
015F:00403C45 MOV [ESP+14],EBX
015F:00403C49 MOV EDX,[00475098]
015F:00403C4F MOV [ESP+08],EDX
015F:00403C53 PUSH 0000EF20
015F:00403C58 LEA ECX,[ESP+0C]
015F:00403C5C MOV BYTE PTR [ESP+24],02
015F:00403C61 CALL 00439F0C
015F:00403C66 MOV ECX,[ESP+08]
015F:00403C6A LEA EAX,[ESP+10]
015F:00403C6E PUSH EAX
015F:00403C6F PUSH 000F003F
015F:00403C74 PUSH EBX
015F:00403C75 PUSH ECX
015F:00403C76 PUSH 80000002
015F:00403C7B MOV [ESP+24],EBX
015F:00403C7F CALL [ADVAPI32!RegOpenKeyExA] //以下将注册信息存入注册表
015F:00403C85 TEST EAX,EAX
015F:00403C87 JNZ 00403CB0
015F:00403C89 MOV EBX,[ESP+10]
015F:00403C8D PUSH EDI
015F:00403C8E MOV EDI,[ESI+5C]
015F:00403C91 MOV [ESP+18],EBX
015F:00403C95 PUSH EDI
015F:00403C96 CALL [KERNEL32!lstrlen]
015F:00403C9C INC EAX
015F:00403C9D PUSH EAX
015F:00403C9E PUSH EDI
015F:00403C9F PUSH 01
015F:00403CA1 PUSH 00
015F:00403CA3 PUSH 004741E4
015F:00403CA8 PUSH EBX
015F:00403CA9 CALL [ADVAPI32!RegSetValueExA]

跟进call 00422239，看见比较注册码：

015F:00422239 PUSH EBP
015F:0042223A MOV EBP,ESP
015F:0042223C CMP DWORD PTR [0047B0FC],00
015F:00422243 PUSH EBX
015F:00422244 PUSH ESI
015F:00422245 PUSH EDI
015F:00422246 JNZ 0042225A
015F:00422248 PUSH DWORD PTR [EBP+0C]
015F:0042224B PUSH DWORD PTR [EBP+08]
015F:0042224E CALL 004277C0
015F:00422253 POP ECX
015F:00422254 POP ECX
015F:00422255 JMP 004222E3
015F:0042225A PUSH 19
015F:0042225C CALL 0042741C
015F:00422261 MOV ESI,[EBP+0C]
015F:00422264 MOV EDI,[EBP+08]
015F:00422267 POP ECX
015F:00422268 MOVZX CX,BYTE PTR [EDI] //正确的注册码
015F:0042226C MOVZX EAX,CL
015F:0042226F INC EDI
015F:00422270 MOV [EBP+0C],ECX
015F:00422273 TEST BYTE PTR [EAX+0047B201],04
015F:0042227A JZ 00422292
015F:0042227C MOV AL,[EDI]
015F:0042227E TEST AL,AL
015F:00422280 JNZ 00422288
015F:00422282 AND DWORD PTR [EBP+0C],00
015F:00422286 JMP 00422292
015F:00422288 XOR EDX,EDX
015F:0042228A INC EDI
015F:0042228B MOV DH,CL
015F:0042228D MOV DL,AL
015F:0042228F MOV [EBP+0C],EDX
015F:00422292 MOVZX BX,BYTE PTR [ESI] //你输入的假码
015F:00422296 MOVZX EAX,BL
015F:00422299 INC ESI
015F:0042229A TEST BYTE PTR [EAX+0047B201],04
015F:004222A1 JZ 004222B6
015F:004222A3 MOV AL,[ESI]
015F:004222A5 TEST AL,AL
015F:004222A7 JNZ 004222AD
015F:004222A9 XOR EBX,EBX
015F:004222AB JMP 004222B6
015F:004222AD XOR ECX,ECX
015F:004222AF INC ESI
015F:004222B0 MOV CH,BL
015F:004222B2 MOV CL,AL
015F:004222B4 MOV EBX,ECX
015F:004222B6 CMP [EBP+0C],BX //比较一个字符
015F:004222BA JNZ 004222C5
015F:004222BC CMP WORD PTR [EBP+0C],00
015F:004222C1 JZ 004222D9
015F:004222C3 JMP 00422268
015F:004222C5 PUSH 19
015F:004222C7 CALL 0042747D
015F:004222CC CMP BX,[EBP+0C] //比较一个字符
015F:004222D0 POP ECX
015F:004222D1 SBB EAX,EAX
015F:004222D3 AND EAX,02
015F:004222D6 DEC EAX
015F:004222D7 JMP 004222E3
015F:004222D9 PUSH 19
015F:004222DB CALL 0042747D
015F:004222E0 POP ECX
015F:004222E1 XOR EAX,EAX //good guy
015F:004222E3 POP EDI
015F:004222E4 POP ESI
015F:004222E5 POP EBX
015F:004222E6 POP EBP
015F:004222E7 RET


斗地主V1.1

 标 题:请教如何破解斗地主 (269字)
发信人:1212
时 间:2000-7-29 13:39:46
详细信息:
1.下bpx hmemcpy 每次跳出的“注册码无效，无法注册！”对话框好象是随机的，无法拦截，别的中断也不行，请指教。
2.在这个Delphi程序中，为何找不到跳出错误对话框上的字“注册码无效，无法注册！”（使用FI检测程序没有压缩）（使用UltraEdit7.10a,Hex Workshop v3.02,WinHex9.4）

标 题:斗地主V1.1破解实录(初学者请进) (6千字)
发信人:bandi
时 间:2000-7-30 18:09:26
详细信息:

斗地主V1.1破解实录:

应网友的要求,我把以前破解的记录整理贴出来,供大家相互交流学习.不妥之处,还请各位高手指点.

使用工具:TRW1.13

找到输入注册信息对话框:填入以下内容

注册姓名：咪咪
邮箱地址：bandi@yeah.net
注册码： 7878787878787878

起动TRW1.13后按CTRL+N

下命令:bpx hmemcpy
:g

按马上注册,嘣跳到TRW

下命令:bc *
:pmodule 来到程序的领空

紧接着按F12 N次(失败的前一次)

再按F10:

0167:0045F3DD 8BC6 MOV EAX,ESI<-----这时光棒停在这一句,好开始追. Let's Go!
0167:0045F3DF E84439FAFF CALL 00402D28
0167:0045F3E4 803DB028460000 CMP BYTE [004628B0],00
0167:0045F3EB 746A JZ 0045F457
0167:0045F3ED 8D55F8 LEA EDX,[EBP-08]
0167:0045F3F0 A1A8284600 MOV EAX,[004628A8]
0167:0045F3F5 E8A2F5FEFF CALL 0044E99C
0167:0045F3FA A1AC284600 MOV EAX,[004628AC]
0167:0045F3FF 50 PUSH EAX
0167:0045F400 8D45FC LEA EAX,[EBP-04]
0167:0045F403 50 PUSH EAX
0167:0045F404 8B0DA4284600 MOV ECX,[004628A4]
0167:0045F40A 8B55F8 MOV EDX,[EBP-08]
0167:0045F40D A144294600 MOV EAX,[00462944]
0167:0045F412 E805EEFEFF CALL 0044E21C
0167:0045F417 8D4DF4 LEA ECX,[EBP-0C]
0167:0045F41A 8B55F8 MOV EDX,[EBP-08]
0167:0045F41D 8B45FC MOV EAX,[EBP-04]
0167:0045F420 E883F6FEFF CALL 0044EAA8
0167:0045F425 8B55F4 MOV EDX,[EBP-0C]
0167:0045F428 8D45FC LEA EAX,[EBP-04]
0167:0045F42B E81845FAFF CALL 00403948
0167:0045F430 A1A8284600 MOV EAX,[004628A8]
0167:0045F435 8B55FC MOV EDX,[EBP-04]
0167:0045F438 E8FF47FAFF CALL 00403C3C---->注册比较的CALL,追进去...!
0167:0045F43D 740C JZ 0045F44B-->这里不跳,你就死定了.
0167:0045F43F A154294600 MOV EAX,[00462954]
0167:0045F444 E84F3DFDFF CALL 00433198--->走过这句就出现注册失败的对话框了.
0167:0045F449 EB0C JMP SHORT 0045F457
0167:0045F44B A13C294600 MOV EAX,[0046293C]
0167:0045F450 E8433DFDFF CALL 00433198---注册成功的CALL
0167:0045F455 B301 MOV BL,01
0167:0045F457 33C0 XOR EAX,EAX
0167:0045F459 5A POP EDX
0167:0045F45A 59 POP ECX
0167:0045F45B 59 POP ECX
0167:0045F45C 648910 MOV [FS:EAX],EDX
0167:0045F45F 6879F44500 PUSH DWORD 0045F479
0167:0045F464 8D45F4 LEA EAX,[EBP-0C]
0167:0045F467 BA03000000 MOV EDX,03
0167:0045F46C E86344FAFF CALL 004038D4
0167:0045F471 C3 RET

在0167:0045F438这一句.按F8进入后,我们来到这里:

0167:00403C3C 53 PUSH EBX
0167:00403C3D 56 PUSH ESI
0167:00403C3E 57 PUSH EDI
0167:00403C3F 89C6 MOV ESI,EAX
0167:00403C41 89D7 MOV EDI,EDX
0167:00403C43 39D0 CMP EAX,EDX--这里是注册比较的地方

d eax 你乱输入的注册码:7878787878787878
d edx 正确的注册码: 72TGRK68S8447MQX(我看到的是这样的,你的呢?)

0167:00403C45 0F848F000000 JZ NEAR 00403CDA
0167:00403C4B 85F6 TEST ESI,ESI
0167:00403C4D 7468 JZ 00403CB7
0167:00403C4F 85FF TEST EDI,EDI
0167:00403C51 746B JZ 00403CBE
0167:00403C53 8B46FC MOV EAX,[ESI-04]
0167:00403C56 8B57FC MOV EDX,[EDI-04]
0167:00403C59 29D0 SUB EAX,EDX
0167:00403C5B 7702 JA 00403C5F
0167:00403C5D 01C2 ADD EDX,EAX
0167:00403C5F 52 PUSH EDX
0167:00403C60 C1EA02 SHR EDX,02
0167:00403C63 7426 JZ 00403C8B
0167:00403C65 8B0E MOV ECX,[ESI]
0167:00403C67 8B1F MOV EBX,[EDI]
0167:00403C69 39D9 CMP ECX,EBX
0167:00403C6B 7558 JNZ 00403CC5
0167:00403C6D 4A DEC EDX
0167:00403C6E 7415 JZ 00403C85
0167:00403C70 8B4E04 MOV ECX,[ESI+04]
0167:00403C73 8B5F04 MOV EBX,[EDI+04]
0167:00403C76 39D9 CMP ECX,EBX
0167:00403C78 754B JNZ 00403CC5
0167:00403C7A 83C608 ADD ESI,BYTE +08
0167:00403C7D 83C708 ADD EDI,BYTE +08
0167:00403C80 4A DEC EDX
0167:00403C81 75E2 JNZ 00403C65
0167:00403C83 EB06 JMP SHORT 00403C8B
0167:00403C85 83C604 ADD ESI,BYTE +04
0167:00403C88 83C704 ADD EDI,BYTE +04
0167:00403C8B 5A POP EDX
0167:00403C8C 83E203 AND EDX,BYTE +03
0167:00403C8F 7422 JZ 00403CB3
0167:00403C91 8B0E MOV ECX,[ESI]
0167:00403C93 8B1F MOV EBX,[EDI]
0167:00403C95 38D9 CMP CL,BL
0167:00403C97 7541 JNZ 00403CDA
0167:00403C99 4A DEC EDX
0167:00403C9A 7417 JZ 00403CB3
0167:00403C9C 38FD CMP CH,BH
0167:00403C9E 753A JNZ 00403CDA
0167:00403CA0 4A DEC EDX
0167:00403CA1 7410 JZ 00403CB3
0167:00403CA3 81E30000FF00 AND EBX,00FF0000
0167:00403CA9 81E10000FF00 AND ECX,00FF0000
0167:00403CAF 39D9 CMP ECX,EBX
0167:00403CB1 7527 JNZ 00403CDA
0167:00403CB3 01C0 ADD EAX,EAX
0167:00403CB5 EB23 JMP SHORT 00403CDA
0167:00403CB7 8B57FC MOV EDX,[EDI-04]
0167:00403CBA 29D0 SUB EAX,EDX
0167:00403CBC EB1C JMP SHORT 00403CDA
0167:00403CBE 8B46FC MOV EAX,[ESI-04]
0167:00403CC1 29D0 SUB EAX,EDX
0167:00403CC3 EB15 JMP SHORT 00403CDA
0167:00403CC5 5A POP EDX
0167:00403CC6 38D9 CMP CL,BL
0167:00403CC8 7510 JNZ 00403CDA
0167:00403CCA 38FD CMP CH,BH
0167:00403CCC 750C JNZ 00403CDA
0167:00403CCE C1E910 SHR ECX,10
0167:00403CD1 C1EB10 SHR EBX,10
0167:00403CD4 38D9 CMP CL,BL
0167:00403CD6 7502 JNZ 00403CDA
0167:00403CD8 38FD CMP CH,BH
0167:00403CDA 5F POP EDI
0167:00403CDB 5E POP ESI
0167:00403CDC 5B POP EBX
0167:00403CDD C3 RET-----------这里返回

整理如下:

注册姓名：咪咪
邮箱地址：bandi@yeah.net
注册码： 72TGRK68S8447MQX

按注册按钮后注册成功.注册成功后软件把注册信息写入到注册表中:

[HKEY_CURRENT_USER\Software\Littlegrass]

[HKEY_CURRENT_USER\Software\Littlegrass\LandOwner]
"Version"="1.1 共享版"
"RegInfo1"="jg妟妬mp卥ijj厙?"
"RegInfo3"="bandi@yeah.net"
"RegInfo2"="咪咪"

删除这些键值后,该软件又变为未注册版了.

好了浪费了大家不少时间,希望你也能按照我的方法破解成功. ^_^ bandi

标 题:我试了一下1.0共享版 (1千字)
发信人:dr0
时 间:2000-7-30 14:00:46
详细信息:

从这里下载的：http://www.win2000.com.cn/duodz.htm
居然还非得用中文名。

Name: 郭大志
Mail： 123@456.789
Code: MBTR-CFTH-JTPA-4RI6

它先把你输入的4部分注册码合并在一起，然后比较：

0167:0045E792 MOV EDX,[EBP-0C]
0167:0045E795 LEA EAX,[EBP-04]
0167:0045E798 CALL 0040392C
0167:0045E79D MOV EAX,[0045FD5C]
0167:0045E7A2 MOV EAX,[EAX] //错误的注册码
0167:0045E7A4 MOV EDX,[EBP-04] //正确的注册码
0167:0045E7A7 CALL 00403C20 //比较
0167:0045E7AC JZ 0045E7BA
0167:0045E7AE MOV EAX,[0046096C]
0167:0045E7B3 CALL 0043317C //“注册码不正确，无法注册”
0167:0045E7B8 JMP 0045E7C6
0167:0045E7BA MOV EAX,[00460954]
0167:0045E7BF CALL 0043317C
0167:0045E7C4 MOV BL,01
0167:0045E7C6 XOR EAX,EAX
0167:0045E7C8 POP EDX
0167:0045E7C9 POP ECX
0167:0045E7CA POP ECX
0167:0045E7CB MOV FS:[EAX],EDX
0167:0045E7CE PUSH 0045E7E8
0167:0045E7D3 LEA EAX,[EBP-0C]
0167:0045E7D6 MOV EDX,00000003
0167:0045E7DB CALL 004038B8
0167:0045E7E0 RET

� � �


通用电脑语音系统

标 题:两个可爱语音朗读软件，初学者可用来练手。 (3千字)
发信人:backboy
时 间:2000-8-29 21:36:55
详细信息:

一个是读霸1.3，一个是通用电脑语音系统。

还没见过这么可爱的程序，作者自己把注册码给你，不信，这样做
将时间调后一个月
运行程序出现注册框
输入假注册码AAAABBBBCCCCDDDD(要为16位，程序中有比较，不过如只为找注册码不是也没关系）
在TRW2000中下中断BPX HMEMCPY
确定后进入TRW2000环境中
PMODULE
然后F10一次
D ECX 就可见到假注册码与真注册码在一块，呵呵!多谢作者，这么体谅我们CRACKER.
其比较核心在0137：0040154A CALL 004080E0中，用F8进入此CALL
可见下面语句
0137:004080E0 MOV EDX,[ESP+04] 此时下D EDX可见假注册码（AAAABBBBCCCCDDDD)
0137:004080E4 MOV ECX,[ESP+08] D ECX (YOU WANT)
0137:004080E8 TEST EDX,00000003
0137:004080EE JNZ 0040812C
0137:004080F0 MOV EAX,[EDX]
0137:004080F2 CMP AL,[ECX] 比较注册码第一组的头一位A
0137:004080F4 JNZ 00408124 不等就死
0137:004080F6 OR AL,AL
0137:004080F8 JZ 00408120
0137:004080FA CMP AH,[ECX+01] 比较注册码第一组的第二位
0137:004080FD JNZ 00408124 不等就死
0137:004080FF OR AH,AH
0137:00408101 JZ 00408120
0137:00408103 SHR EAX,10
0137:00408106 CMP AL,[ECX+02] 比较注册码第一组的第三位
0137:00408109 JNZ 00408124 不等就死
0137:0040810B OR AL,AL
0137:0040810D JZ 00408120
0137:0040810F CMP AH,[ECX+03] 比较注册码第一组的第四位
0137:00408112 JNZ 00408124 不等就死
0137:00408114 ADD ECX,00000004 将下一组真注册码放入ECX
0137:00408117 ADD EDX,00000004 将下一组假注册码放入EDX
0137:0040811A OR AH,AH 比较是否比较完毕
0137:0040811C JNZ 004080F0 未比较完成继续比较下一组
0137:0040811E MOV EDI,EDI
本机的注册码如下
识别码：5191990565825523
注册码：LDBEVFDENBWTAFEK
============================================================
另一个同类软件电脑语音系统的破解如下
可下BPX 00403EBA
中断后BC *
D EAX 可见序列号与假注册码
D ESI 可见正确的注册码
后面是与读霸差不多的，仍是逐位比较
0403EA4 C68424D801000001 mov byte ptr [esp+000001D8], 01
:00403EAC 51 push ecx
:00403EAD 8BCF mov ecx, edi
:00403EAF E80CFEFFFF call 00403CC0
:00403EB4 8B30 mov esi, dword ptr [eax]
:00403EB6 8B44240C mov eax, dword ptr [esp+0C]
:00403EBA C68424D801000002 mov byte ptr [esp+000001D8], 02
此时D EAX 可见假注册码
D ESI 可见真注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403EE4(C)
|
:00403EC2 8A10 mov dl, byte ptr [eax]
:00403EC4 8A1E mov bl, byte ptr [esi]
:00403EC6 8ACA mov cl, dl
:00403EC8 3AD3 cmp dl, bl 比较注册码第一位
:00403ECA 751E jne 00403EEA
:00403ECC 84C9 test cl, cl
:00403ECE 7416 je 00403EE6
:00403ED0 8A5001 mov dl, byte ptr [eax+01]
:00403ED3 8A5E01 mov bl, byte ptr [esi+01]
:00403ED6 8ACA mov cl, dl
:00403ED8 3AD3 cmp dl, bl 比较注册码第二位
:00403EDA 750E jne 00403EEA
:00403EDC 83C002 add eax, 00000002
:00403EDF 83C602 add esi, 00000002
:00403EE2 84C9 test cl, cl
:00403EE4 75DC jne 00403EC2 没完继续比较后几位

本机注册码如下
序列号：758583554
版本号：V2000
注册号：910-04765

以上两个软件可从WWW.DOWNLOAD.COM.CN 可 WWW.NEWHUA.COM的软件分类中下载，还可去CHINA的主页下载，软件个头有点大
不过较前一版本好用许多。这两个程序都不难，初学者可别放过哟！


疯狂单词

 标 题:疯狂单词破解实录(初学者请进!） (9千字)
发信人:bandi
时 间:2000-8-24 1:10:24
详细信息:
疯狂单词破解实录：

我破解的是版本是Wordslover 1.0 beta12

首先下载beta9安装版，下载地址是：http://asp.cnshare.com/coco/cnshare/ds.asp?softid=28&durl=/wl10b9setup.exe
安装好后，再下载beta12版的升级程序。按照升级版安装说明升级完以后它就变成了Wordslover 1.0 beta12版了。

使用工具：TRW1.22
保护类型：注册码保护（明码）
教学目的：学习注册码的破解
难度级别：易

运行程序，找到输入注册的地方输入以下信息：

姓名：bandi 注册类型：D类[站长级]
地区：其它 Email地址：bandi@yeah.net
文化程序：大学 其它说明：
职业：教师
注册号码：78787878

起动TRW1.22，下命令:bpx hmemcpy
按F5返回注册界面后,再按注册按钮，TRW1.22蹦出。
bc * 清除断点
pmodule 跳到程序领空
紧接着按F12键4次，再按F10来到如下地址：

0167:00405370 8D4C2408 LEA ECX,[ESP+08]
0167:00405374 E8E75C0000 CALL 0040B060
0167:00405379 8D4C2438 LEA ECX,[ESP+38]
0167:0040537D C78424B800000000+MOV DWORD [ESP+B8],00
0167:00405388 E8534C0000 CALL 00409FE0
0167:0040538D 8D442428 LEA EAX,[ESP+28]
0167:00405391 8D8E98000000 LEA ECX,[ESI+98]
0167:00405397 50 PUSH EAX
0167:00405398 C68424BC00000001 MOV BYTE [ESP+BC],01
0167:004053A0 E8674C0300 CALL 0043A00C
0167:004053A5 8D4C240C LEA ECX,[ESP+0C]
0167:004053A9 51 PUSH ECX
0167:004053AA 8D8E00020000 LEA ECX,[ESI+0200]
0167:004053B0 E8574C0300 CALL 0043A00C
0167:004053B5 8D542410 LEA EDX,[ESP+10]
0167:004053B9 8D8EC4010000 LEA ECX,[ESI+01C4]
0167:004053BF 52 PUSH EDX
0167:004053C0 E8474C0300 CALL 0043A00C
0167:004053C5 8D44241C LEA EAX,[ESP+1C]
0167:004053C9 8D8E10010000 LEA ECX,[ESI+0110]
0167:004053CF 50 PUSH EAX
0167:004053D0 E8374C0300 CALL 0043A00C
0167:004053D5 8D4C2414 LEA ECX,[ESP+14]
0167:004053D9 51 PUSH ECX
0167:004053DA 8D8E88010000 LEA ECX,[ESI+0188]
0167:004053E0 E8274C0300 CALL 0043A00C
0167:004053E5 8D542418 LEA EDX,[ESP+18]
0167:004053E9 8D8E4C010000 LEA ECX,[ESI+014C]
0167:004053EF 52 PUSH EDX
0167:004053F0 E8174C0300 CALL 0043A00C
0167:004053F5 8D442420 LEA EAX,[ESP+20]
0167:004053F9 8D8ED4000000 LEA ECX,[ESI+D4]
0167:004053FF 50 PUSH EAX
0167:00405400 E8074C0300 CALL 0043A00C
0167:00405405 8B8E3C020000 MOV ECX,[ESI+023C]
0167:0040540B 6864194700 PUSH DWORD 00471964
0167:00405410 894C2434 MOV [ESP+34],ECX
0167:00405414 8D4C2428 LEA ECX,[ESP+28]
0167:00405418 E8FB2E0300 CALL 00438318
0167:0040541D 6860194700 PUSH DWORD 00471960
0167:00405422 8D4C2430 LEA ECX,[ESP+30]
0167:00405426 E8ED2E0300 CALL 00438318
0167:0040542B 83EC2C SUB ESP,BYTE +2C
0167:0040542E 8D542438 LEA EDX,[ESP+38]
0167:00405432 8BF4 MOV ESI,ESP
0167:00405434 89642460 MOV [ESP+60],ESP
0167:00405438 52 PUSH EDX
0167:00405439 89742464 MOV [ESP+64],ESI
0167:0040543D 8D4E04 LEA ECX,[ESI+04]
0167:00405440 E8BF2A0300 CALL 00437F04
0167:00405445 8D44243C LEA EAX,[ESP+3C]
0167:00405449 8D4E08 LEA ECX,[ESI+08]
0167:0040544C 50 PUSH EAX
0167:0040544D C68424E800000002 MOV BYTE [ESP+E8],02
0167:00405455 E8AA2A0300 CALL 00437F04
0167:0040545A 8D4C2440 LEA ECX,[ESP+40]
0167:0040545E C68424E400000003 MOV BYTE [ESP+E4],03
0167:00405466 51 PUSH ECX
0167:00405467 8D4E0C LEA ECX,[ESI+0C]
0167:0040546A E8952A0300 CALL 00437F04
0167:0040546F 8D542444 LEA EDX,[ESP+44]
0167:00405473 8D4E10 LEA ECX,[ESI+10]
0167:00405476 52 PUSH EDX
0167:00405477 C68424E800000004 MOV BYTE [ESP+E8],04
0167:0040547F E8802A0300 CALL 00437F04
0167:00405484 C68424E400000005 MOV BYTE [ESP+E4],05
0167:0040548C 8D442448 LEA EAX,[ESP+48]
0167:00405490 50 PUSH EAX
0167:00405491 8D4E14 LEA ECX,[ESI+14]
0167:00405494 E86B2A0300 CALL 00437F04
0167:00405499 8D4C244C LEA ECX,[ESP+4C]
0167:0040549D C68424E400000006 MOV BYTE [ESP+E4],06
0167:004054A5 51 PUSH ECX
0167:004054A6 8D4E18 LEA ECX,[ESI+18]
0167:004054A9 E8562A0300 CALL 00437F04
0167:004054AE 8D542450 LEA EDX,[ESP+50]
0167:004054B2 8D4E1C LEA ECX,[ESI+1C]
0167:004054B5 52 PUSH EDX
0167:004054B6 C68424E800000007 MOV BYTE [ESP+E8],07
0167:004054BE E8412A0300 CALL 00437F04
0167:004054C3 8D442454 LEA EAX,[ESP+54]
0167:004054C7 8D4E20 LEA ECX,[ESI+20]
0167:004054CA 50 PUSH EAX
0167:004054CB C68424E800000008 MOV BYTE [ESP+E8],08
0167:004054D3 E82C2A0300 CALL 00437F04
0167:004054D8 8D4C2458 LEA ECX,[ESP+58]
0167:004054DC C68424E400000009 MOV BYTE [ESP+E4],09
0167:004054E4 51 PUSH ECX
0167:004054E5 8D4E24 LEA ECX,[ESI+24]
0167:004054E8 E8172A0300 CALL 00437F04
0167:004054ED 8B54245C MOV EDX,[ESP+5C]
0167:004054F1 8D4C2464 LEA ECX,[ESP+64]
0167:004054F5 895628 MOV [ESI+28],EDX
0167:004054F8 C70680CD4500 MOV DWORD [ESI],0045CD80
0167:004054FE C68424E400000001 MOV BYTE [ESP+E4],01
0167:00405506 E8C5510000 CALL 0040A6D0--------这里是注册比较的CALL，追进去。。。
0167:0040550B 84C0 TEST AL,AL
0167:0040550D 6A00 PUSH BYTE +00
0167:0040550F 6A00 PUSH BYTE +00
0167:00405511 7507 JNZ 0040551A---在这里跳就可以注册成功了。
0167:00405513 6890194700 PUSH DWORD 00471990---对不起,注册号码不正确,您不是合法的注册用户!
0167:00405518 EB05 JMP SHORT 0040551F
0167:0040551A 6870194700 PUSH DWORD 00471970----恭喜,您已经是合法的注册用户!
0167:0040551F E847EA0300 CALL 00443F6B-----这里即是注册成功的CALL也是注册失败的CALL
0167:00405524 8B442428 MOV EAX,[ESP+28]
0167:00405528 8BCF MOV ECX,EDI
0167:0040552A 50 PUSH EAX
0167:0040552B 6878124700 PUSH DWORD 00471278
0167:00405530 6874124700 PUSH DWORD 00471274

===============================================================
在0167:00405506 CALL 0040A6D0这句处按F8追进后来到这里：

0167:0040A6D0 6AFF PUSH BYTE -01
0167:0040A6D2 6853714500 PUSH DWORD 00457153
0167:0040A6D7 64A100000000 MOV EAX,[FS:00]
：
：
：
：
程序要走好长一段路，中间还有几处在作循环，可要有耐心哦！最后我们会来到这里：

0167:0040A9C0 8B4C2414 MOV ECX,[ESP+14]----带过这句，? ecx可以看到正确的注册码
0167:0040A9C4 8B8424E0010000 MOV EAX,[ESP+01E0]----错误的注册码
0167:0040A9CB 5F POP EDI
0167:0040A9CC 5E POP ESI
0167:0040A9CD 3BC1 CMP EAX,ECX-----注册码比较的地方（十六进制数）， ？ecx可看到正确注册码
0167:0040A9CF 5D POP EBP
0167:0040A9D0 C68424A401000000 MOV BYTE [ESP+01A4],00
0167:0040A9D8 8D4C2404 LEA ECX,[ESP+04]
0167:0040A9DC 7436 JZ 0040AA14
0167:0040A9DE E8ACD70200 CALL 0043818F
0167:0040A9E3 8D8C24AC010000 LEA ECX,[ESP+01AC]
0167:0040A9EA C78424A4010000FF+MOV DWORD [ESP+01A4],FFFFFFFF
0167:0040A9F5 E896070000 CALL 0040B190
0167:0040A9FA 32C0 XOR AL,AL-----------AL清零
0167:0040A9FC 8B8C249C010000 MOV ECX,[ESP+019C]
0167:0040AA03 5B POP EBX
0167:0040AA04 64890D00000000 MOV [FS:00],ECX
0167:0040AA0B 81C4A4010000 ADD ESP,01A4
0167:0040AA11 C22C00 RET 2C
0167:0040AA14 E876D70200 CALL 0043818F
0167:0040AA19 8D8C24AC010000 LEA ECX,[ESP+01AC]
0167:0040AA20 C78424A4010000FF+MOV DWORD [ESP+01A4],FFFFFFFF
0167:0040AA2B E860070000 CALL 0040B190
0167:0040AA30 B001 MOV AL,01----------这里就是注册成功的旗标志吧！
0167:0040AA32 EBC8 JMP SHORT 0040A9FC
：
：
：

最后整理如下：

姓名：bandi 注册类型：D类[站长级]
地区：其它 Email地址：bandi@yeah.net
文化程序：大学 其它说明：
职业：教师
注册号码：104829984

知道了注册码比较的地方，追其它类型的注册码就容易多了。在TRW1.22中下命令：

一，bpx 0040A9CD
二，程序会被断在断点处，然后再下命令？ecx,你看到的就是正确的注册码了，还不快记下来！！！

说明：在没有改动上述注册信息，只改动注册类型的情况下，我追出来的注册码是：

A类[友情级] 注册号码：121995227
B类[普通级] 注册号码：108492014
C类[开发级] 注册号码：101794480
D类[站长级] 注册号码：104829984

哎！好累啊，破这个软件没有花我多少功夫，写这篇破文却花了我不少时间，由于本人写作水平有限，希望你能看懂，惹有错误请指教，转载请保持完整。

bandi整理于2000/08/23


疯狂单词 Wordslover 1.0

 标 题:疯狂单词的破解方法！ (3千字)
发信人:xiA Qin
时 间:2000-8-22 16:24:06
详细信息:
写 作：xiA Qin

软件名称：疯狂单词 Wordslover 1.0 betal1

输入注册信息：任意输入。

注册号码：只能输入数字，为什么？你试一试就知道了。

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
.................
015F:00404DF5 8D4C2458 LEA ECX,[ESP+58]
015F:00404DF9 C68424E400000009 MOV BYTE [ESP+E4],09
015F:00404E01 51 PUSH ECX
015F:00404E02 8D4E24 LEA ECX,[ESI+24]
015F:00404E05 E8BA230300 CALL 004371C4
015F:00404E0A 8B54245C MOV EDX,[ESP+5C]
015F:00404E0E 8D4C2464 LEA ECX,[ESP+64]
015F:00404E12 895628 MOV [ESI+28],EDX
015F:00404E15 C70660BD4500 MOV DWORD [ESI],0045BD60
015F:00404E1B C68424E400000001 MOV BYTE [ESP+E4],01
015F:00404E23 E8C84D0000 CALL 00409BF0 //注册码比较。按F8进入。
015F:00404E28 84C0 TEST AL,AL
015F:00404E2A 6A00 PUSH BYTE +00
015F:00404E2C 6A00 PUSH BYTE +00
015F:00404E2E 7507 JNZ 00404E37
015F:00404E30 68F0024700 PUSH DWORD 004702F0 //注册成功
015F:00404E35 EB05 JMP SHORT 00404E3C
015F:00404E37 68D0024700 PUSH DWORD 004702D0 //注册失败
015F:00404E3C E8DDE40300 CALL 0044331E
015F:00404E41 8B442428 MOV EAX,[ESP+28]
。。。。。。。。。。。。。。。。。。。。。。。。

按F8进入00404E23 CALL 00409BF0
按F10来到下面：

015F:00409EE0 8B4C2414 MOV ECX,[ESP+14]
015F:00409EE4 8B8424E0010000 MOV EAX,[ESP+01E0]
015F:00409EEB 5F POP EDI
015F:00409EEC 5E POP ESI
015F:00409EED 3BC1 CMP EAX,ECX <-正确的注册码。d ecx
015F:00409EEF 5D POP EBP
015F:00409EF0 C68424A401000000 MOV BYTE [ESP+01A4],00
015F:00409EF8 8D4C2404 LEA ECX,[ESP+04]
015F:00409EFC 7436 JZ 00409F34 <-修改这里。
015F:00409EFE E84CD50200 CALL 0043744F
015F:00409F03 8D8C24AC010000 LEA ECX,[ESP+01AC]
015F:00409F0A C78424A4010000FF+MOV DWORD [ESP+01A4],FFFFFFFF
015F:00409F15 E896070000 CALL 0040A6B0
015F:00409F1A 32C0 XOR AL,AL
015F:00409F1C 8B8C249C010000 MOV ECX,[ESP+019C]
015F:00409F23 5B POP EBX
015F:00409F24 64890D00000000 MOV [FS:00],ECX
015F:00409F2B 81C4A4010000 ADD ESP,01A4
015F:00409F31 C22C00 RET 2C
015F:00409F34 E816D50200 CALL 0043744F
015F:00409F39 8D8C24AC010000 LEA ECX,[ESP+01AC]
015F:00409F40 C78424A4010000FF+MOV DWORD [ESP+01A4],FFFFFFFF
015F:00409F4B E860070000 CALL 0040A6B0
015F:00409F50 B001 MOV AL,01
015F:00409F52 EBC8 JMP SHORT 00409F1C

.............................

第一种方法：爆破
把00409EFC 7436 JZ 00409F34
改00409EFC 7536 JNZ 00409F34

找到74 36 E8 4C D5 02 00

改成75 36 E8 4C D5 02 00

第二种方法：注册码
注册码：
EAX的值是你输入的注册码的十六进制。

将ECX的值换算成十进制就是正确的注册码。


Resource Explorer

 标 题:汉化辅助软件---有谁感兴趣? (38字)
发信人:guest
时 间:2000-7-18 7:06:14
详细信息:
http://batry.hypermart.net/DFMV_1e.htm

标 题:是动态链接的，需要另外的VCL 3.0的运行库才能转！ (空)
发信人:guest
时 间:2000-7-18 12:05:13
详细信息:

标 题:vcl30.dpl在这里（附注册码） (98字)
发信人:guest
时 间:2000-7-18 13:14:51
详细信息:

http://www.abgc.homecreatures.com/September1999/xOtix/vcl_30.zip

Registration Key: 35005259-dr0

标 题:Resource Explorer注册码：37150444-dr0 (空)
发信人:guest
时 间:2000-7-19 12:07:06
详细信息:

标 题:用了这个注册码，虽然显示已注册，但是打开一个delphi程序后，选择save resource，它仍然会提示只有注册用... (134字)
发信人:guest
时 间:2000-7-20 8:46:18
详细信息:

标题: 用了这个注册码，虽然显示已注册，但是打开一个delphi程序后，选择save resource，它仍然会提示只有注册用户才能使用此功能。

内容:

标 题:原来第6位的那个比较是有用的。可用的注册码是37150244-dr0 (261字)
发信人:dr0
时 间:2000-7-20 11:35:09
详细信息:

下面的这个比较是有用的，虽然不影响它在About对话框里显示Registered to:XXXX，但是影响Save Resource。

015F:0040F140 MOV EDX,[EBP-0C] //正确
015F:0040F143 POP EAX //错误
015F:0040F144 CALL 004011B0
015F:0040F149 SETZ BL

标 题:过程 (4千字)
发信人:dr0
时 间:2000-7-19 23:29:36
详细信息:

以ResXplor3.exe为例，其它类似。

输入注册码之后用hmemcpy作断点，中断后按12次F12，就到这里，是在vcl30.dpl中。执行call之前敲d edx可以看见自己输入的注册码，于是用BPR edx edx+len-1设断点监视假注册码（len为注册码长度）。BPR断点是很好用的，可惜在NT上好象没有。

015F:4137BEBB MOV EDX,[EBP-28] //假注册码
015F:4137BEBE MOV EAX,[EBP-08]
015F:4137BEC1 CALL 41304754
015F:4137BEC6 MOV BYTE PTR [EBP-09],01
015F:4137BECA XOR EAX,EAX

然后按F5执行，就到这里停下来。还是在DLL中。在执行REPNZ SCASB那条指令的时候看一下AL寄存器中的值为2D，这说明它试图在你输入的假注册码中匹配横杠字符（减号），由此可知注册码是含有横杠的。实际上下面的代码就对应C语言中的strstr( )函数，即检查一个串是否为另一个串的子串。

015F:41304CA9 MOV AL,[ESI]
015F:41304CAB INC ESI
015F:41304CAC SUB ECX,EDX
015F:41304CAE JLE 41304CC4
015F:41304CB0 REPNZ SCASB
015F:41304CB2 JNZ 41304CC4
015F:41304CB4 MOV EBX,ECX
015F:41304CB6 PUSH ESI
015F:41304CB7 PUSH EDI
015F:41304CB8 MOV ECX,EDX
015F:41304CBA REPZ CMPSB
015F:41304CBC POP EDI
015F:41304CBD POP ESI
015F:41304CBE JZ 41304CCC
015F:41304CC0 MOV ECX,EBX
015F:41304CC2 JMP 41304CB0
015F:41304CC4 POP EDX
015F:41304CC5 XOR EAX,EAX
015F:41304CC7 JMP 41304CD1
015F:41304CC9 XOR EAX,EAX
015F:41304CCB RET
015F:41304CCC POP EDX
015F:41304CCD MOV EAX,EDI
015F:41304CCF SUB EAX,EDX
015F:41304CD1 POP EDI
015F:41304CD2 POP ESI
015F:41304CD3 POP EBX
015F:41304CD4 RET

在假注册码中加入一个横杠字符，重复上面的步骤，执行完上面的RET指令后，按F10或者直接向下翻屏就看见一段比较：

015F:0040EF5A MOV EAX,[EBP-10]
015F:0040EF5D LEA ECX,[EBP-08]
015F:0040EF60 MOV EDX,00000003 //3个字符
015F:0040EF65 CALL 0040EE10
015F:0040EF6A MOV EAX,[EBP-0C]
015F:0040EF6D MOV AL,[EAX]
015F:0040EF6F MOV EDX,[EBP-08]
015F:0040EF72 CMP AL,[EDX] //比较注册码的首字符
015F:0040EF74 JNZ 0040EFA0
015F:0040EF76 MOV EAX,[EBP-0C]
015F:0040EF79 MOV AL,[EBX+EAX-01]
015F:0040EF7D MOV EDX,[EBP-08]
015F:0040EF80 CMP AL,[EDX+02] //比较横杠前的那个字符
015F:0040EF83 JNZ 0040EFA0
015F:0040EF85 MOV EAX,[EBP-0C]
015F:0040EF88 MOV AL,[EBX+EAX-02]
015F:0040EF8C MOV EDX,[EBP-08]
015F:0040EF8F CMP AL,[EDX+01] //比较横杠前的倒数第2个字符
015F:0040EF92 JNZ 0040EFA0
015F:0040EF94 MOV EDI,00000001 //good guy
015F:0040EF99 JMP 0040EFA0
015F:0040EF9B MOV EDI,00000001
015F:0040EFA0 DEC EDI //bag guy
015F:0040EFA1 SETZ BL
015F:0040EFA4 JMP 0040EFA8

至此我们找到了注册码中的3位。继续按F10（或者按一下F12），又看见一段判断。这个判断也不复杂，写个小程序穷举一下或者在心里推算一下就可以确定注册码的2～5位应该是什么（但是不唯一）。

015F:0040F05A MOV EDX,00000002
015F:0040F05F CALL 00401C28 //把注册码的2～5转成一个整数
015F:0040F064 MOV ECX,EAX
015F:0040F066 CMP ECX,00001389 //根据该数和0x1389的大小分成两种情况
015F:0040F06C JGE 0040F080
015F:0040F06E LEA EAX,[ECX+29] //小于0x1389则加上0x29
015F:0040F071 MOV ECX,00000007
015F:0040F076 CDQ
015F:0040F077 IDIV ECX
015F:0040F079 TEST EDX,EDX
015F:0040F07B SETZ BL //和必须是7的倍数才行
015F:0040F07E JMP 0040F096
015F:0040F080 MOV EAX,ECX
015F:0040F082 SUB EAX,27 //大于等于0x1389则减去0x27
015F:0040F085 MOV ECX,0000000D
015F:0040F08A CDQ
015F:0040F08B IDIV ECX
015F:0040F08D TEST EDX,EDX
015F:0040F08F SETZ BL //差必须是0x0D的倍数才行
015F:0040F092 JMP 0040F096

继续按F10，看见另一个判断，这是在判断注册码的第6位。

015F:0040F140 MOV EDX,[EBP-0C] //正确
015F:0040F143 POP EAX //错误
015F:0040F144 CALL 004011B0
015F:0040F149 SETZ BL

至于横杠后面为何是名字，等注册成功后看一下它的About对话框就明白了，因为那里显示的是Registered to: XXXX。


黑马输入法2000

 标 题:菜鸟破解录之 黑马输入法2000 (2千字)
发信人:xiA Qin
时 间:2000-8-11 13:49:02
详细信息:
菜鸟破解录之 黑马输入法2000

软件名称： 黑马输入法2000
软件大小： 60MB
软件简介： 一种高效的拼音整句输入法。

作 者：xiA Qin
解密日前：2000年8月10日
解密工具：S-ICE4.00
破解目的：学习注册码的破解。★★☆

首先运行黑马输入法2000安装程序setup.exe

输入合法用法信息：
输入数字：123

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被S-ICE拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空

按F10来到下面指令
。。。。。。。。。。。。。
015F:00401271 CMP EAX,[00412478] //比较 EAX 和 00412478的值。
015F:00401277 JNZ 00401291 //不相等就跳到00401291
015F:00401279 PUSH 01
015F:0040127B PUSH ESI
015F:0040127C CALL [00414448]
015F:00401282 MOV EAX,00000001
015F:00401287 POP ESI
015F:00401288 ADD ESP,0000010C
015F:0040128E RET 0010
015F:00401291 MOV EAX,[0041247C] <-|程序
015F:00401296 PUSH 00 |计算
015F:00401298 INC EAX |注册
015F:00401299 CMP EAX,0A |的次数
015F:0040129C MOV [0041247C],EAX |
015F:004012A1 JB 004012B9 <-|EAX=A 就退出安装
015F:004012A3 PUSH ESI
015F:004012A4 CALL [00414448]
015F:004012AA MOV EAX,00000001
015F:004012AF POP ESI
015F:004012B0 ADD ESP,0000010C
015F:004012B6 RET 0010
015F:004012B9 PUSH 0040E084
015F:004012BE PUSH 0040E060
015F:004012C3 PUSH ESI
015F:004012C4 CALL [0041444C] //注册失败对话框
015F:004012CA PUSH 00412480
015F:004012CF PUSH 000003F0
015F:004012D4 PUSH ESI
............................

当光标在015F:00401271 CMP EAX,[00412478]时

看一下 EAX 和 DS:00412478 的值

EAX=00000007B <<--好眼熟...嘻嘻...就是123的16进值...

DS:00412478=00000023C <<--当然就是注册码罗...换算成10进值...
(这个值的是随机变化的，每次安装都不同。)

答案就是：572

按F5回到程序。重新输入。

当然，也可以用E和R命令来修改EAX 和 DS:00412478 的值，使他们相等。


美萍网管大师v5.2

 标 题:W32dasm分析破解美萍网管大师v5.2以及用Crackcode2000制作注册机 (5千字)
发信人:wind[CCG]
时 间:2000-8-30 12:27:59
详细信息:
W32dasm分析破解美萍网管大师v5.2以及用Crackcode2000制作注册机

本文作者:wind[CCG]
我的网站:http://biggow.8u8.com(有空来看看)
China Cracking Group是中国自己的破解组织,有兴趣可以和SunBird大哥联系!
他的E-mail:sun.bird@371.net

开篇：美萍安全卫士v5.2可以防trw2000和softice，而且极为凶悍，有些程序检测到
这类跟踪调试软件只不过是显示一个nag然后终止程序运行，而美萍网管大师v5.2
（包括安全卫士的最新版本）发现此类程序，就关机，所以这次使用w32dasm超级
中文版来破解它！

1、scon.exe这个文件是用aspack 1.07加的壳，直接使用unaspack就可以搞定了！

2、启动W32dasm反汇编scon.exe，那么我们从何入手呢，看看说明；哦，有时间
限制，还有那个注册框上显示的未注册一句话作为入手！如果在W32dasm中，找
不到，那么我们可以通过注册表，因为它通过阅读注册表的信息，然后判断是否
注册，很高兴，我们找到了这么一句话“软件试用期还剩”，我们就从这里入手！
双击它，然后来到如下程序段：

* Possible StringData Ref from Code Obj ->"软件试用期还剩"
|
:004846DA 6808494800 push 00484908
:004846DF 8D55DC lea edx, dword ptr [ebp-24]
:004846E2 A1F48D4800 mov eax, dword ptr [00488DF4]
:004846E7 40 inc eax
:004846E8 2B0544DE4A00 sub eax, dword ptr [004ADE44]
:004846EE E8392EF8FF call 0040752C
:004846F3 FF75DC push [ebp-24]
:004846F6 6820494800 push 00484920
/*当然这里没有我们需要的信息，我们需要往上找*/
往上来到如下：

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484476(C)
|
:004846A3 E8EC55FEFF call 00469C94 --->判断什么的？
:004846A8 85C0 test eax, eax
:004846AA 7577 jne 00484723 --->这个jnz有可疑！双击此处，让光标来到此处！
:004846AC A1F48D4800 mov eax, dword ptr [00488DF4]
:004846B1 83E80F sub eax, 0000000F
:004846B4 3B0544DE4A00 cmp eax, dword ptr [004ADE44]
:004846BA 7D67 jge 00484723
:004846BC 6A40 push 00000040
:004846BE 8D45E8 lea eax, dword ptr [ebp-18]
--让光标停留在4846AA处，然后用jump to看它跳到哪里去.....

* Possible StringData Ref from Code Obj ->",请赶快向作者注册(0371-8982414)"
|
:004846FB 682C494800 push 0048492C
:00484700 8D45E4 lea eax, dword ptr [ebp-1C]
:00484703 BA04000000 mov edx, 00000004
:00484708 E88FF5F7FF call 00403C9C
:0048470D 8B45E4 mov eax, dword ptr [ebp-1C]
:00484710 E88BF6F7FF call 00403DA0
:00484715 50 push eax
:00484716 8BC3 mov eax, ebx
:00484718 E82719FAFF call 00426044
:0048471D 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:0048471E E8DD1BF8FF Call 00406300 --->call出那个讨厌对话框的地方！

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004846AA(C), :004846BA(C)
|
:00484723 B201 mov dl, 01 --->4846AA的跳跃就是来到这里的
到了这里，也就是跳过了那个窗口！
:00484725 8B8314020000 mov eax, dword ptr [ebx+00000214]
:0048472B E85408FDFF call 00454F84
/*那么4846A3的那个call不是判断时间就是判断注册码的，我们进那个call看看*/

4846A3那个call的内容如下：

* Referenced by a CALL at Addresses:
|:0048305F , :004846A3
|
:00469C94 53 push ebx
:00469C95 A13C8F4800 mov eax, dword ptr [00488F3C]
:00469C9A 8B00 mov eax, dword ptr [eax]
:00469C9C E827A5FFFF call 004641C8 --->计算注册码的call!写注册机就要仔细看这个call
它的算法不是很复杂!
:00469CA1 8BD8 mov ebx, eax

* Possible StringData Ref from Code Obj ->"RegNum" -->看见了吗，这个call就是判断注册码的！
算出注册码也不能了吧！

|:00469CA3 B8C49C4600 mov eax, 00469CC4
:00469CA8 E8B3A6FFFF call 00464360
:00469CAD 3BD8 cmp ebx, eax -->哈哈，我们可以用trw2000来下断点!下断点469C94
很快来到这里,看ebx的值,把它转成十进制就是注册码

:00469CAF 7507 jne 00469CB8 -->这里不跳就OK!改破解版,就改这里好了把7507改成9090
:00469CB1 B801000000 mov eax, 00000001
:00469CB6 5B pop ebx
:00469CB7 C3 ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00469CAF(C)
|
:00469CB8 33C0 xor eax, eax -->不能来到这里,让他把eax清0就完了!
:00469CBA 5B pop ebx
:00469CBB C3 ret

下面我们用Crackcode2000来制作注册机,因为今次的注册码不是直接用ASCII码形式放在内存中的，
而是用数值的形式放在寄存器处的，所以这时就要用模式1了。下面是Crackcode.ini的信息:
[Options]
CommandLine=scon.exe
Mode=1
First_Break_Address=469CAD
First_Break_Address_Code=3B
First_Break_Address_Code_Lenth=2
Save_Code_Address=EBX

我的序列号是183894,计算出的注册码是30806!crackcode2000注册机就写好了!很简单吧!
哈哈,这要感谢我们的Rufeng兄,写了一个如此棒的程序!而且体积很小!

破解版制作:
1、用UnAspack解压scon.exe文件
2、查找：E8 B3 A6 FF FF 3B D8 75 07
替换：-- -- -- -- -- -- -- 90 90

今天就到这里，休息.......休息！
wind
China Cracking Group
2000.8.30


木马逆向分析

标 题:木马逆向分析
发信人:梦醒时分
详细信息:

-作者defiler
-梦醒时分译

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

我们的目标是Sub7你认为，你在Sub7的服务端设置了一个密码，那么其他人就无法连接它了吗？
你犯了一个大错误！这儿我就向你展示，我是怎样在这木马服务端找到安全漏洞的。

你需要的工具：

(x) SoftICE (+ SymbolLoader.)可以从crack迷们要到，许多crack网站也可以找到！
(x) Hiew 6.16，一个编辑器。
(x) 目标, Sub7, 可在这里找到: subseven.slak.org
(x) SoftICE's 命令和汇编语言的基础知识.

让我们开始吧：

我对连接客户端的时候，让密码进行比较的过程比较感兴趣。所以，我使用SoftICE's的symbol
loader输入一些winsock的端口 ：）

运行loader,点击“FILE--LOAD EXPORTS”菜单，指向你的windows系统目录，选择"wsock32.dll"
打开。SymbolLoader应该显示：

"Exports for Z:\WINDBLOWZ\SYSTEM\Wsock32.dll loaded sucessfully"

现在去使用 EditServer.exe文件设置Sub7的服务端（请看其它文档，我在这儿不提了）我设置端口
为666，密码为“abuse”.运行服务端的木马，你不久就可以被安装好服务端，但千万别在网上。（
关于这个程序我不对你负任何责任，它不是我编的）执行SubSeven.exe连接到服务端（IP地址为127.0.0.1,
就是你本机了），密码框会弹出来，任意输入一个密码。服务端是用WSOCK32!recv接收客户端的信息的。
Windows的Sockets recv 接收数据功能使用一个Socket.结构如下：

int recv (

SOCKET s,
char FAR* buf,
int len,
int flags
);
第二行(char FAR* buf)非常重要。信息就储藏在那里。现在，在softice中在recv上设置断点
(输入 "d esp->8")点击OK送出密码。SoftICE回弹出，按F11(g @ss:esp)。跳到密码部分时会在
SoftICE的信息栏中显示'PWD'。现在在密码的地址中设置一个断点。（如: bpr 405000 405010 RW)
Now set a bpr on the password's address (e.g.: bpr 405000 405010 RW) and on the copy
it will make at 004029c5.

下一次你将会停在004040dd:

0167:004040dd 8b0e mov ecx,[esi]
0167:004040df 8b1f mov ebx,[edi]
0167:004040e1 39d9 cmp ecx,ebx
0167:004040e3 7558 jnz 0040413d
0167:004040e5 4a dec edx
0167:004040e6 7415 jz 004040fd
0167:004040e8 8b4e04 mov ecx,[esi+04]
0167:004040eb 8b5f04 mov ebx,[edi+04]
0167:004040ee 39d9 cmp ecx,ebx

它停在了4040dd这一行，我们在我们的密码上设置了一个断点。那么它在本地将保存在esi中。前四个字母
移到ecx中。另外四个字母存在ebx中后进行比较...你现在认为，你发现了密码比较的地方了吗?不，不，
没门！其实Sub7的作者更愚蠢！！！在softice中输入“d edi”看看：

016F:012A3DD4 31 34 34 33 38 31 33 36-37 38 32 37 31 35 31 30 1443813678271510
016F:012A3DE4 31 39 38 30 00 69 6F 00-28 00 00 00 22 00 00 00 1980.io.(..."...
016F:012A3DF4 01 00 00 00 13 00 00 00-53 75 62 73 65 76 65 6E ........Subseven
016F:012A3E04 5F 5F 5F 3C 20 70 69 63-6B 20 3E 00 10 3E 2A 01 ___< pick >..>*.
016F:012A3E14 10 3E 2A 01 38 00 00 00-53 75 62 73 65 76 65 6E .>*.8...Subseven

奇怪，那不是我设置的“abuse”密码。那么让我们在连接一次试试...SubSeven显示：connected.
啊，那怎么可能？SubSeven留一个系统密码吗？呵呵，你可以在自己的电脑上再试几次。啊，是的，
那是系统密码。

好的就到这儿了，我只是想有人会对这感兴趣的。我对这遍文章不负任何责任！

祝好运,

可以向作者回信，不过要是英文! defiler@elitereversers.de


人体生物节律查询7.09

 标 题:人体生物节律查询7.09的破解。换个角度入手，可能会简单得多。 (4千字)
发信人:hying[CCG]
时 间:2000-8-13 9:44:51
详细信息:
一般软件的注册方法是在注册对话框中输入一些信息后按“注册”按钮，然后它会进行验证，根据对、错给出相应的提示，或者告诉你需重新启动然后验证，但“人体生物节律查询7.09”却有些不同，以至有网友费了很大的力气跟踪它的注册过程，但一直没有发现关键点。现破解如下：
我的机器号为“26402905”，在注册对话框中输入注册码“78787878”，切换到trw2000，用s 0,ffffffff '78787878'找到一个地址xxxxxxxx，然后下bpm xxxxxxxx，回到注册画面，按下“OK”，马上被拦截，再接下来就是艰苦的跟踪过程，过程比较复杂，似乎在进行一些计算，还没看到什么值得怀疑的内容就回到了“人体”，什么提示都没有。也不知道是否注册成功，怎么办？再追一次，还是一样。看一下它的帮助信息，它提示说没有注册就不能打印，试一下，果然一按“打印”，马上提示“未注册，不能打印”，既然这样就有办法了。下bpx messageboxexa，按“打印”，马上被拦截，然后慢慢走，看这个消息框是哪儿调用的。走啊走……直到地址47A3BA(如下），一看很值得怀疑，既然怀疑就要验证，怎么办？先bc去掉以前的中断，再下bp 47a33c，回到“人体”再按“打印”，马上拦截，然后一步一步走。到47a380,ecx与edi不相同，跳到下面提示未注册，如让47a382那个不跳，让47a3a5那个跳的话，就出现打印对话框。看样子关键果然在这，换一个注册码"34345656"注册一下后再试，发现在47a380处的ecx是“0c5d”保持不变，edi在改变，而且，每换一个注册码，edi都会改变，是否可以猜想，ecx由机器号决定，edi由注册码决定？再看edi是由内存中两个数决定的，那两个数是“0D6A”和“1618”，换成十进制不是“3434”和“5656”吗？有一些眉目了！再看下面47a3a3的比较，其中的edi也是由这两个数决定的，而且它应与eax相同，仔细看一下，列一个二元一次方程组解出这两个四位数，如不足四位如xxx则添零变成0xxx，然后连成一个8位数就是注册码。如果您对机器码的计算过程也感兴趣的话，也可试一下，只是一些求商、求余的算法，很简单。
0167:0047A33C PUSH EBX
0167:0047A33D PUSH ESI
0167:0047A33E PUSH EDI
0167:0047A33F PUSH ECX
0167:0047A340 MOV [ESP],EDX
0167:0047A343 MOV EBX,EAX
0167:0047A345 MOV EAX,[004808AC]
0167:0047A34A SUB EAX,BYTE +47
0167:0047A34D MOV ECX,EAX
0167:0047A34F SHL ECX,02
0167:0047A352 LEA ECX,[ECX+ECX*2]
0167:0047A355 MOV EDX,[004808C0]
0167:0047A35B SUB EDX,BYTE +2F
0167:0047A35E MOV EDI,EDX
0167:0047A360 ADD EDI,EDI
0167:0047A362 SUB ECX,EDI
0167:0047A364 MOV ESI,[004808B8]
0167:0047A36A SUB ESI,BYTE +2B
0167:0047A36D IMUL EDI,ESI,BYTE +0B
0167:0047A370 ADD ECX,EDI
0167:0047A372 MOV EDI,[004808B0] \
0167:0047A378 ADD EDI,EDI <-算edi
0167:0047A37A SUB EDI,[004808C4] /
0167:0047A380 CMP ECX,EDI
0167:0047A382 JNZ 0047A3A7
0167:0047A384 MOV ECX,[004808C4] \
0167:0047A38A ADD ECX,ECX <-算edi
0167:0047A38C MOV EDI,[004808B0] /
0167:0047A392 SUB EDI,ECX
0167:0047A394 LEA EAX,[EAX+EAX*2]
0167:0047A397 ADD EDX,EDX
0167:0047A399 LEA EDX,[EDX+EDX*4]
0167:0047A39C SUB EAX,EDX
0167:0047A39E LEA EDX,[ESI+ESI*4]
0167:0047A3A1 SUB EAX,EDX
0167:0047A3A3 CMP EDI,EAX
0167:0047A3A5 JZ 0047A3C1
0167:0047A3A7 PUSH BYTE +10
0167:0047A3A9 MOV ECX,0047A430
0167:0047A3AE MOV EDX,0047A43C
0167:0047A3B3 MOV EAX,[0047F828]
0167:0047A3B8 MOV EAX,[EAX]
0167:0047A3BA CALL 0044CB30 <-运行则提示“未注册”
0167:0047A3BF JMP SHORT 0047A428
0167:0047A3C1 MOV EAX,[EBX+0318]
0167:0047A3C7 MOV EDX,[EAX]
0167:0047A3C9 CALL NEAR [EDX+3C]
0167:0047A3CC TEST AL,AL
0167:0047A3CE JZ 0047A428
0167:0047A3D0 CMP BYTE [EBX+2763],00
0167:0047A3D7 JZ 0047A3E6
0167:0047A3D9 XOR EDX,EDX
0167:0047A3DB MOV EAX,[EBX+0410]
0167:0047A3E1 CALL 0042E7F0
0167:0047A3E6 MOV BYTE [EBX+2762],01
0167:0047A3ED CALL 0041F0DC
0167:0047A3F2 CALL 0041E7AC
0167:0047A3F7 MOV EDX,[ESP]
0167:0047A3FA MOV EAX,EBX
0167:0047A3FC CALL 00476A20
0167:0047A401 CALL 0041F0DC
0167:0047A406 CALL 0041E834
0167:0047A40B MOV BYTE [EBX+2762],00
0167:0047A412 CMP BYTE [EBX+2763],00
0167:0047A419 JZ 0047A428
0167:0047A41B MOV DL,01
0167:0047A41D MOV EAX,[EBX+0410]
0167:0047A423 CALL 0042E7F0
0167:0047A428 POP EDX
0167:0047A429 POP EDI
0167:0047A42A POP ESI
0167:0047A42B POP EBX
0167:0047A42C RET

破后感：对于这个软件，如果一味跟踪注册码输入过程的话，可能永远找不到关键所在，因为没有明显的对、错标志，或许根本不在那儿判断，但是只要找到一个标志，如我用的打印，从这个标志入手破解可能会变得很简单。还有就是破解一个软件时，如果费了很多精力仍然破不了，那可以想一想，是否可以换个角度、换个地方入手，找个最薄弱的环节，绕过它的马其诺防线，可能就会有“山重水复疑无路，柳暗花明又一村”的感觉。

标 题:还方程组？建议软件作者去http://www.counterpane.com/搞份Twofish或Blowfish的源码来算注册码算了 (空)
发信人:dr0
时 间:2000-8-14 22:38:53
详细信息:


鼠标锁V2.5

 标 题:鼠标锁V2.5 修正版注册机 (616字)
发信人:看雪
时 间:2000-7-11 22:06:20
详细信息:

 鼠标锁V2.5 修正版，主要是修正了注册的算法了。注册机如下：（算法太简单，随便写写）#include
  <stdio.h>
#include <string.h>
void main(void)
{unsigned long s;
int i,n;
char c[80];
char name[]="opq98";

printf("KeyGen for mouse lock 2.5.\n");
printf("coded by toye.\n");
printf("http://toye.yeah.net\n\n\n");

printf("Your name:");
scanf("%s",c);

while (strcmp(name,c)==0)
{
printf("opq98 has been ranged into black list\n");
printf("please entry your name again:");
scanf("%s",c);
}

s=0;

for(i=0;(n=c[i])!='\0';i++)
s=s+n*n;
s=s*190;
printf("\n");
printf("Registration code =%ld\n",s);
}


文字录入速度测试系统 V3.0

 标 题: 文字录入速度测试系统 V3.0 网络版 (1千字)
发信人:guest
时 间:2000-8-21 17:02:20
详细信息:
文字录入速度测试系统 V3.0 网络版
计算机文字录入练习、考试、比赛工作者的好帮手!
是一个集中英文打字练习、测试，五笔编码、拼音编码查询功能为一体的纯32位应用软件，她不局限于某一种输入法，您可以用任何输入法进行测试。她对于中英文各提供了三种测试方式供您选择，她还支持多用户管理，您可以在一台机器上建立若干个用户，分别进行测试，并分别查看各自的成绩；您还可以自由设定测试时间、用户权限、随时暂停测试；您也可以设定文章的载入点，这样您就可以每次都从同一地方开始测试了。
网络版：除了具有单机版的所有功能外，还增加了一些网络功能。她分为服务器版和工作站版，基于TCP/IP网络协议，可以通过局域网，甚至是Internet进行远程考核。工作站版的功能和单机版的功能基本一样，并且，当工作站版不联接服务器时，也可做单机版用；
它的下载地址：http://go.163.com/~mrxiong/download/stclient3.exe

该软件有30天的试用期。我输入用户编号1111-1111-1111后，胡乱输入注册号：7878-7878-7878。经过长时间的跟踪，得到一个注册号码为：6119-1911-1121。急忙把它填入，按注册，哈哈，显示：注册成功。

正当我高兴这时，又重新启动了该软件，什么？？？？它摇身一变又变成了30天限制的试用版。我当时就晕倒。。。作者搞了一个假的注册码。那么真的在什么地方呢？我算是功夫不到，败下阵来了。望各位大侠出一篇它的破解实录，帮我报一箭之仇，小弟不胜感激。

标 题:我的是这样的 (813字)
发信人:看雪
时 间:2000-8-21 19:54:24
详细信息:

:004D7981 E8DEC7F2FF call 00404164
:004D7986 8B45D8 mov eax, dword ptr [ebp-28]
:004D7989 8D4DDC lea ecx, dword ptr [ebp-24]
:004D798C BA0C000000 mov edx, 0000000C
:004D7991 E8221CFDFF call 004A95B8
:004D7996 8B55DC mov edx, dword ptr [ebp-24]————根据用户名计算的注册码。 d edx
:004D7999 8B45F8 mov eax, dword ptr [ebp-08]————你输入的注册码 d eax
:004D799C E813C8F2FF call 004041B4
:004D79A1 0F85E2000000 jne 004D7A89-------------------不跳成功
:004D79A7 8D55C4 lea edx, dword ptr [ebp-3C]
:004D79AA 8B83F4020000 mov eax, dword ptr [ebx+000002F4]

我的注册码是:
用户名：1111 1111 1111
注册码：9211 1156 0161

注册后，完全成功。

标 题:你注册失败的原因： (2千字)
发信人:看雪
时 间:2000-8-21 20:32:14
详细信息:

:004D7981 E8DEC7F2FF call 00404164
:004D7986 8B45D8 mov eax, dword ptr [ebp-28]
:004D7989 8D4DDC lea ecx, dword ptr [ebp-24]
:004D798C BA0C000000 mov edx, 0000000C
:004D7991 E8221CFDFF call 004A95B8
:004D7996 8B55DC mov edx, dword ptr [ebp-24] //根据用户名计算的注册码。 d edx
:004D7999 8B45F8 mov eax, dword ptr [ebp-08]//你输入的注册码 d eax
:004D799C E813C8F2FF call 004041B4
:004D79A1 0F85E2000000 jne 004D7A89//不跳成功（此处才是正确的注册码了）
:004D79A7 8D55C4 lea edx, dword ptr [ebp-3C]
:004D79AA 8B83F4020000 mov eax, dword ptr [ebx+000002F4]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D79A1(C)
|
:004D7A89 8D55A0 lea edx, dword ptr [ebp-60]
:004D7A8C 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:004D7A92 E85DB4F5FF call 00432EF4
:004D7A97 FF75A0 push [ebp-60]
:004D7A9A 8D559C lea edx, dword ptr [ebp-64]
:004D7A9D 8B83F8020000 mov eax, dword ptr [ebx+000002F8]
:004D7AA3 E84CB4F5FF call 00432EF4
:004D7AA8 FF759C push [ebp-64]
:004D7AAB 8D5598 lea edx, dword ptr [ebp-68]
:004D7AAE 8B83FC020000 mov eax, dword ptr [ebx+000002FC]
:004D7AB4 E83BB4F5FF call 00432EF4
:004D7AB9 FF7598 push [ebp-68]
:004D7ABC 8D45A4 lea eax, dword ptr [ebp-5C]
:004D7ABF BA03000000 mov edx, 00000003
:004D7AC4 E89BC6F2FF call 00404164
:004D7AC9 8B45A4 mov eax, dword ptr [ebp-5C]
:004D7ACC 8D4DA8 lea ecx, dword ptr [ebp-58]
:004D7ACF BA0C000000 mov edx, 0000000C
:004D7AD4 E85B19FDFF call 004A9434
:004D7AD9 8B55A8 mov edx, dword ptr [ebp-58]
:004D7ADC 8B45F8 mov eax, dword ptr [ebp-08]//在此D EAX看到：6119-1911-1121陷井！！！
:004D7ADF E8D0C6F2FF call 004041B4
:004D7AE4 0F8574010000 jne 004D7C5E//不跳则显示注册成功的假象！

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

* Possible StringData Ref from Code Obj ->"ccccccccc"注册失败提示处！
|
:004D7C5E B8107E4D00 mov eax, 004D7E10
:004D7C63 E8083CF8FF call 0045B870
:004D7C68 8B8300030000 mov eax, dword ptr [ebx+00000300]
:004D7C6E E80D1FF5FF call 00429B80
:004D7C73 8B8300030000 mov eax, dword ptr [ebx+00000300]
:004D7C79 8B10 mov edx, dword ptr [eax]


Win2000/Hex Workshop/打字高手

 标 题:我的破解之路-BBOY (3千字)
发信人:guest（bboycool@263.net）
时 间:2000-7-21 1:22:31
详细信息:
我的破解之路——BBOY

1.Win2000破解过程(第一次成功地破解) 2000-7-15

首先用Trw2000下断点bpx getdlgitemtexta
一共会有五次，因为有五个输入框

执行完五次getdlgitemtexta后，会有一个call，跟踪进去
----------------------------------------------------
......
......
0187:0140EC66 TEST EAX,EAX
0187:0140EC68 JZ 0140EC84 ------错误的地址(使用r eip改正地址)
----------------------------------------------------
0187:0140EC6A MOV EAX,[01428064]
0187:0140EC6F CMP EAX,EDI
0187:0140EC71 JZ 0140EC8D ------正确的地址
0187:0140EC73 MOV ECX,[0142BA18]
0187:0140EC79 CMP ECX,[EBP+18]
0187:0140EC7C JZ 0140EC8D ------正确的地址(使用r eip改正地址)
----------------------------------------------------
执行此段的话就会跳转到错误的地址
0187:0140EC7E MOV [0142B934],EBX
0187:0140EC84 XOR EAX,EAX
0187:0140EC86 POP EDI
0187:0140EC87 POP ESI
0187:0140EC88 POP EBX
0187:0140EC89 LEAVE
0187:0140EC8A RET 14
-----------------------------------------------------
0187:0140EC8D ...... 正确的地址

后记：
Win2000的加密很有意思，它的注册码计算在一个子程序中。如果不正确，子程序就正常的退出；如果正确就跳转到正确的代码区执行程序。

2.Hex Workshop2.10破解过程 2000-7-17

首先输入注册码 87654321
用Trw2000下断点bpx getwindowtexta
中断后用指令pmodule返回
-----------------------------------------------------
0187:00441F5E CALL `USER32!GetWindowTextA`
0187:00441F64 PUSH BYTE -01
0187:00441F66 MOV ECX,EDI
0187:00441F68 CALL 00434F8B 获得注册码长度
0187:00441F6D JMP SHORT 00441F7B
不断地按F8(很长的一段时间)
-----------------------------------------------------
0187:00416367 MOV [EBP-10],EAX
0187:0041636A CMP DWORD [EBP-10],BYTE +00
跳向错误的地址：
0187:0041636E JZ NEAR 004163ED 使用r eip改正
-----------------------------------------------------
0187:00416374 MOV ECX,[EBP+FFFFFF2C]
0187:0041637A ADD ECX,BYTE +5C
0187:0041637D CALL 00404760
0187:00416382 PUSH EAX
0187:00416383 MOV EAX,[EBP+FFFFFF2C]
0187:00416389 MOV EAX,[EAX+68]
0187:0041638C ADD EAX,BYTE +02
0187:0041638F PUSH EAX
0187:00416390 CALL 00428888
0187:00416395 ADD ESP,BYTE +08
--------------------------------------------------------

后记：
这个软件很奇怪，执行时总是跳来跳去，估计是经过加密了的。在注册后，程序所在的文件夹中生成一个HEXWORKS.REG的文件。

3.打字高手2.01破解过程 2000-7-19

首先输入注册码 87654321
用Trw2000下断点bpx hmemcpy (getwindowtexta和getdlgitemtexta无效)
中断后用指令pmodule返回
s 0030:0,ffffffff '87654321'
得到输入的注册码地址 xxxxxxxx
bpm xxxxxxxx rw
g

程序中断在：
--------------------------------------------------------
0187:00403FFD ADD EDX,EAX
0187:00403FFF PUSH EDX
0187:00404000 SHR EDX,02
0187:00404003 JZ 0040402B
--------------------------------------------------------
前四个字节比较:
0187:00404005 MOV ECX,[ESI]
0187:00404007 MOV EBX,[EDI]
0187:00404009 CMP ECX,EBX
0187:0040400B JNZ 00404065 错误的地址
--------------------------------------------------------
后四个字节比较:
0187:0040400D DEC EDX
0187:0040400E JZ 00404025
0187:00404010 MOV ECX,[ESI+04]
0187:00404013 MOV EBX,[EDI+04]
0187:00404016 CMP ECX,EBX
0187:00404018 JNZ 00404065 错误的地址
---------------------------------------------------------
只要d edi就可以看都注册码79826002了(由此可见直接比较注册码的方式十分的不可靠)

后记：这个软件是垃圾，第一次使用后我就把它给删除了


象棋桥2000

 标 题:象棋桥2000新版及absolute security pro3.7的注册破解。 (3千字)
发信人:backboy
时 间:2000-8-28 7:34:25
详细信息:
目标程序：象棋桥最新版
保护方式：采用注册名与注册码形式,不是旧版采用机器码与注册码的形式。
难度：易
工具：softice4.05
下载：CHINA主页共享软件栏目或华军软件园WWW.NEWHUA.COM

填入用户名：backboy
注册码： 78787878
下BPX HMEMCPY F5返回，按确定后中断返回程序空间，按F10来到如下代码处

:0040860C E8D3BAFFFF call 004040E4
:00408611 8BD6 mov edx, esi
:00408613 8B37 mov esi, dword ptr [edi]
:00408615 85DB test ebx, ebx
:00408617 7415 je 0040862E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040862C(C)
|
:00408619 8A02 mov al, byte ptr [edx]
:0040861B 3C61 cmp al, 61
:0040861D 7206 jb 00408625
:0040861F 3C7A cmp al, 7A
:00408621 7702 ja 00408625
:00408623 2C20 sub al, 20

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040861D(C), :00408621(C)
|
:00408625 8806 mov byte ptr [esi], al
:00408627 42 inc edx
:00408628 46 inc esi
:00408629 4B dec ebx
:0040862A 85DB test ebx, ebx
:0040862C 75EB jne 00408619
以上代码逐个比较输入的注册码是否为小写字母，是则出错
============================================================
:0049E2FC E8AF5AF6FF call 00403DB0
:0049E301 83F80E cmp eax, 0000000E 此处比较输入注册码的位数是否为14位
:0049E304 7525 jne 0049E32B 不是14位就死，重新填入14位注册码12345678901234
再来一次。
:0049E306 8D45F4 lea eax, dword ptr [ebp-0C]
:0049E309 B905000000 mov ecx, 00000005
:0049E30E BA0A000000 mov edx, 0000000A
:0049E313 E8E05CF6FF call 00403FF8
:0049E318 8B45F4 mov eax, dword ptr [ebp-0C]
一路F10来到
:0049E31B BA38E54900 mov edx, 0049E538
:0049E320 E89B5BF6FF call 00403EC0 此CALL为比较核心F8跟入
:0049E325 7406 je 0049E32D
:0049E327 33DB xor ebx, ebx
:0049E329 EB02 jmp 0049E32D

============================================================
:00403EC0 53 push ebx
:00403EC1 56 push esi
:00403EC2 57 push edi
:00403EC3 89C6 mov esi, eax
:00403EC5 89D7 mov edi, edx
:00403EC7 39D0 cmp eax, edx 此时的D EAX为输入的假码，D EDX为真注册码
程序只作前9位比较
此时的EDX内容为CCB2000R-
EAX内容为12345678901234
:00403EC9 0F848F000000 je 00403F5E 相等则注册成功

至此注册码已出来，象棋桥2000最新版的注册码与用户名无关，注册码形式为CCB2000R-*****(此处的＊为除
小写字母外的其它数字或字母）
backboy/CCB2000R-12345

另winxfile同一公司出品的ABSOLUTE SECURITY PRO3.7（能加密各种文件）的注册比较核心在
0137：0048c4cb call 000403914 时F8进入。
一路F10到
0137:00403917 mov esi,eax
0137:00403919 mov edi,edx
0137:0040391b cmp eax,edx 此时的D EDX和D EAX即可见到注册码。
0137:0040391d jz 004039b2
一组注册码如下：
backboy/PHJCRLAPDCAFTGV
WWW.PEPSOFT.COM


象棋桥V1.2

 标 题:我想破解象棋桥这个软件，请各位大侠给点提示好吗？谢谢（内有下载地址） (51字)
发信人:copyyour
时 间:2000-8-11 10:57:20
详细信息:
http://sq.k12.com.cn/~ccbridge/content/CCBridge.exe

标 题:象棋桥V1.2破解实录（请高手莫入，初学者请进） (8千字)
发信人:bandi
时 间:2000-8-13 23:55:17
详细信息:

象棋桥V1.2破解实录

今天闲着没事，所以就把这个破解整理出来了，希望大家不要笑我,毕竟写破文要比我破这个软件的时间多。惹有不对请指正。

使用工具：TRW1.22
级别：简单（适合初学者）
保护型式：序列号

下载地址：URL http://sq.k12.com.cn/~ccbridge/content/CCBridge.exe

启动象棋桥V1.2找到输入注册码的对话框，输入以下内容

用户姓名：badni
用户公司：badni
注册密码：78787878

启动TRW1.22 按Ctrl+N 下命令：bpx hmemcpy
按F5返回，按注册确定，TRW1.22蹦出

bc * (清除断点）
pmodule (回到程序的领空）哇！这个命令很好用耶。不象ICE那么麻烦

紧接着按F12 N次（当然是失败的前一次，记不清了，好象是66次，小心F12要坏哦！！！）
再按F10来到如下地址：

0167:004561C9 A1B4A24500 MOV EAX,[0045A2B4]
0167:004561CE 8B80D4020000 MOV EAX,[EAX+02D4]
0167:004561D4 83780C01 CMP DWORD [EAX+0C],BYTE +01
0167:004561D8 0F85E3010000 JNZ NEAR 004563C1
0167:004561DE 8D55F4 LEA EDX,[EBP-0C]
0167:004561E1 A1B4A24500 MOV EAX,[0045A2B4]
0167:004561E6 8B80DC020000 MOV EAX,[EAX+02DC]
0167:004561EC E8F329FDFF CALL 00428BE4
0167:004561F1 8B45F4 MOV EAX,[EBP-0C]
0167:004561F4 8D55F8 LEA EDX,[EBP-08]
0167:004561F7 E8F017FBFF CALL 004079EC
0167:004561FC C645FF00 MOV BYTE [EBP-01],00
0167:00456200 B301 MOV BL,01
0167:00456202 BEDCC84500 MOV ESI,0045C8DC
0167:00456207 8D45F0 LEA EAX,[EBP-10]
0167:0045620A 8BD6 MOV EDX,ESI-------d edx可以看到九组正确的注册码
0167:0045620C E8B3D9FAFF CALL 00403BC4
0167:00456211 8B55F0 MOV EDX,[EBP-10]
0167:00456214 8B45F8 MOV EAX,[EBP-08]
0167:00456217 E814DBFAFF CALL 00403D30------注册码比较的CALL可以追进去看一下
0167:0045621C 7503 JNZ 00456221
0167:0045621E 885DFF MOV [EBP-01],BL
0167:00456221 43 INC EBX
0167:00456222 83C609 ADD ESI,BYTE +09
0167:00456225 80FB0A CMP BL,0A
0167:00456228 75DD JNZ 00456207
0167:0045622A 8B45F8 MOV EAX,[EBP-08]
0167:0045622D E8EED9FAFF CALL 00403C20
0167:00456232 83F80C CMP EAX,BYTE +0C
0167:00456235 7530 JNZ 00456267
0167:00456237 8B45F8 MOV EAX,[EBP-08]
0167:0045623A 803843 CMP BYTE [EAX],43
0167:0045623D 7528 JNZ 00456267
0167:0045623F 8B45F8 MOV EAX,[EBP-08]
0167:00456242 80780143 CMP BYTE [EAX+01],43
0167:00456246 751F JNZ 00456267
0167:00456248 8B45F8 MOV EAX,[EBP-08]
0167:0045624B 80780242 CMP BYTE [EAX+02],42
0167:0045624F 7516 JNZ 00456267
0167:00456251 8B45F8 MOV EAX,[EBP-08]
0167:00456254 80780331 CMP BYTE [EAX+03],31
0167:00456258 750D JNZ 00456267
0167:0045625A 8B45F8 MOV EAX,[EBP-08]
0167:0045625D 80780432 CMP BYTE [EAX+04],32
0167:00456261 7504 JNZ 00456267
0167:00456263 C645FF0A MOV BYTE [EBP-01],0A
0167:00456267 807DFF00 CMP BYTE [EBP-01],00
0167:0045626B 0F8438010000 JZ NEAR 004563A9----跳到注册失败的地方，故这里不能跳哦！！！
0167:00456271 B201 MOV DL,01
0167:00456273 A178354500 MOV EAX,[00453578]
0167:00456278 E83BD4FFFF CALL 004536B8
0167:0045627D 8BD8 MOV EBX,EAX
0167:0045627F BA01000080 MOV EDX,80000001
0167:00456284 8BC3 MOV EAX,EBX
0167:00456286 E8C5D4FFFF CALL 00453750
0167:0045628B B101 MOV CL,01
0167:0045628D BA00644500 MOV EDX,00456400
0167:00456292 8BC3 MOV EAX,EBX
0167:00456294 E81BD5FFFF CALL 004537B4
0167:00456299 8B4DF8 MOV ECX,[EBP-08]
0167:0045629C BA2C644500 MOV EDX,0045642C
0167:004562A1 8BC3 MOV EAX,EBX
0167:004562A3 E8A8D6FFFF CALL 00453950
0167:004562A8 8D55F4 LEA EDX,[EBP-0C]
0167:004562AB A1B4A24500 MOV EAX,[0045A2B4]
0167:004562B0 8B80CC020000 MOV EAX,[EAX+02CC]
0167:004562B6 E82929FDFF CALL 00428BE4
0167:004562BB 8B4DF4 MOV ECX,[EBP-0C]
0167:004562BE BA44644500 MOV EDX,00456444
0167:004562C3 8BC3 MOV EAX,EBX
0167:004562C5 E886D6FFFF CALL 00453950
0167:004562CA 8D55F4 LEA EDX,[EBP-0C]
0167:004562CD A1B4A24500 MOV EAX,[0045A2B4]
0167:004562D2 8B80D0020000 MOV EAX,[EAX+02D0]
0167:004562D8 E80729FDFF CALL 00428BE4
0167:004562DD 8B4DF4 MOV ECX,[EBP-0C]
0167:004562E0 BA54644500 MOV EDX,00456454
0167:004562E5 8BC3 MOV EAX,EBX
0167:004562E7 E864D6FFFF CALL 00453950
0167:004562EC 8BC3 MOV EAX,EBX
0167:004562EE E82DD4FFFF CALL 00453720
0167:004562F3 8BC3 MOV EAX,EBX
0167:004562F5 E80ACBFAFF CALL 00402E04
0167:004562FA C605C5C8450001 MOV BYTE [0045C8C5],01
0167:00456301 C605C6C8450000 MOV BYTE [0045C8C6],00
0167:00456308 8D55F4 LEA EDX,[EBP-0C]
0167:0045630B A1B4A24500 MOV EAX,[0045A2B4]
0167:00456310 8B80CC020000 MOV EAX,[EAX+02CC]
0167:00456316 E8C928FDFF CALL 00428BE4
0167:0045631B 8B55F4 MOV EDX,[EBP-0C]
0167:0045631E B8C8C84500 MOV EAX,0045C8C8
0167:00456323 E8D0D6FAFF CALL 004039F8
0167:00456328 8D55F4 LEA EDX,[EBP-0C]
0167:0045632B A1B4A24500 MOV EAX,[0045A2B4]
0167:00456330 8B80D0020000 MOV EAX,[EAX+02D0]
0167:00456336 E8A928FDFF CALL 00428BE4
0167:0045633B 8B55F4 MOV EDX,[EBP-0C]
0167:0045633E B8CCC84500 MOV EAX,0045C8CC
0167:00456343 E8B0D6FAFF CALL 004039F8
0167:00456348 8B87EC030000 MOV EAX,[EDI+03EC]
0167:0045634E 33D2 XOR EDX,EDX
0167:00456350 E81F1CFEFF CALL 00437F74
0167:00456355 8B87F0030000 MOV EAX,[EDI+03F0]
0167:0045635B 33D2 XOR EDX,EDX
0167:0045635D E8121CFEFF CALL 00437F74
0167:00456362 8B87F4030000 MOV EAX,[EDI+03F4]
0167:00456368 33D2 XOR EDX,EDX
0167:0045636A E88D27FDFF CALL 00428AFC
0167:0045636F A1107F4500 MOV EAX,[00457F10]
0167:00456374 8B00 MOV EAX,[EAX]
0167:00456376 BA64644500 MOV EDX,00456464
0167:0045637B E810E7FEFF CALL 00444A90
0167:00456380 BA64644500 MOV EDX,00456464
0167:00456385 A1A4A24500 MOV EAX,[0045A2A4]
0167:0045638A E88528FDFF CALL 00428C14
0167:0045638F 6A30 PUSH BYTE +30
0167:00456391 B970644500 MOV ECX,00456470
0167:00456396 BA7C644500 MOV EDX,0045647C
0167:0045639B A1107F4500 MOV EAX,[00457F10]
0167:004563A0 8B00 MOV EAX,[EAX]
0167:004563A2 E885ECFEFF CALL 0044502C----这里是什么？当然是注册成功的CALL了。
0167:004563A7 EB18 JMP SHORT 004563C1
0167:004563A9 6A30 PUSH BYTE +30
0167:004563AB B9A8644500 MOV ECX,004564A8
0167:004563B0 BAB4644500 MOV EDX,004564B4
0167:004563B5 A1107F4500 MOV EAX,[00457F10]
0167:004563BA 8B00 MOV EAX,[EAX]
0167:004563BC E86BECFEFF CALL 0044502C-------注册失败的CALL
0167:004563C1 33C0 XOR EAX,EAX
0167:004563C3 5A POP EDX
0167:004563C4 59 POP ECX
0167:004563C5 59 POP ECX
0167:004563C6 648910 MOV [FS:EAX],EDX
0167:004563C9 68EE634500 PUSH DWORD 004563EE
0167:004563CE 8D45F0 LEA EAX,[EBP-10]
0167:004563D1 E8CED5FAFF CALL 004039A4
0167:004563D6 8D45F4 LEA EAX,[EBP-0C]
0167:004563D9 E8C6D5FAFF CALL 004039A4
0167:004563DE 8D45F8 LEA EAX,[EBP-08]
0167:004563E1 E8BED5FAFF CALL 004039A4
0167:004563E6 C3 RET

整理一下我们可以得到九组正确的注册码：
13258732
22125963
37844622
45742971
58596433
65579812
74699281
85134762
97415633
所以你只要填入任何一组注册码即可注册成功！注册成功已否与用户姓名和用户公司没有关系，简单吧！

用户姓名：badni
用户公司：badni
注册密码：13258732

注册成功！嘻嘻，真有意思！该软件有两种注册方法，另外一种留给你去思考。

bandi整理于2000/08/13


有声有色 3.10

 标 题:有声有色 3.10 (1千字)
发信人:十三少
时 间:2000-8-16 23:26:34
详细信息:
软件下载地址：
http://www.newhua.com.cn/down/you310.zip

iis兄，你说的那个程序我看了一下，由于时间关系，没有深究，应该不算太难，首先需要脱壳，这一步比较容易，然后再用trw载入脱壳后的程序，此程序
用过了30次之后，就会出现注册提示，拒绝执行。
这时可下
：pmodule
：X (返回)
按下回车，被拦于下：
015F:0047437A 50 PUSH EAX
015F:0047437B E8242AF9FF CALL `USER32!MessageBoxA` //注册提示框
015F:00474380 8BF0 MOV ESI,EAX
015F:00474382 66837B4A00 CMP WORD [EBX+4A],BYTE +00
015F:00474387 7408 JZ 00474391 (NO JUMP) //此处不跳则死
015F:00474389 8BD3 MOV EDX,EBX
015F:0047438B 8B434C MOV EAX,[EBX+4C]
015F:0047438E FF5348 CALL NEAR [EBX+48]
015F:00474391 33C0 XOR EAX,EAX
015F:00474393 5A POP EDX
015F:00474394 59 POP ECX
015F:00474395 59 POP ECX
015F:00474396 648910 MOV [FS:EAX],EDX
015F:00474399 68AE434700 PUSH DWORD 004743AE
015F:0047439E 8D45FC LEA EAX,[EBP-04]
015F:004743A1 E882F6F8FF CALL 00403A28
015F:004743A6 C3 RET

程序中只要将015F：00474387 JZ 00474391 改为JMP 00474391即可继续执行
程序!(找74088BD38B改为E905000000)

标 题:一点补允! (2千字)
发信人:十三少
时 间:2000-8-18 12:01:19
详细信息:

iis兄，那个软件我看了一下，用它来做网页特效真的不错，这个东西的
注册程序不知道如何下手，我试了一下，修改程序可以让其继续执行。
方法如下：
015F:0047437A 50 PUSH EAX
015F:0047437B E8242AF9FF CALL `USER32!MessageBoxA` //注册提示框
015F:00474380 8BF0 MOV ESI,EAX
015F:00474382 66837B4A00 CMP WORD [EBX+4A],BYTE +00
015F:00474387 7408 JZ 00474391 (NO JUMP) //此处不跳则死
015F:00474389 8BD3 MOV EDX,EBX
015F:0047438B 8B434C MOV EAX,[EBX+4C]
015F:0047438E FF5348 CALL NEAR [EBX+48]
015F:00474391 33C0 XOR EAX,EAX
015F:00474393 5A POP EDX
015F:00474394 59 POP ECX
015F:00474395 59 POP ECX
015F:00474396 648910 MOV [FS:EAX],EDX
015F:00474399 68AE434700 PUSH DWORD 004743AE
015F:0047439E 8D45FC LEA EAX,[EBP-04]
015F:004743A1 E882F6F8FF CALL 00403A28
015F:004743A6 C3 RET

程序中只要将015F:00474387 JZ 00474391 改为JMP 00474391即可继续执行!(找74088BD38B改为E905000000)
我们在015F:0047437B E8242AF9FF CALL `USER32!MessageBoxA` 用F8追入
可以到达如下程序：
015F:BFF52E29 E8B0540000 CALL `KERNEL32!SMapLS_IP_EBP_12` //R eip BFF52E4D
015F:BFF52E2E 50 PUSH EAX
015F:BFF52E2F E8B6540000 CALL `KERNEL32!SMapLS_IP_EBP_16`
015F:BFF52E34 50 PUSH EAX
015F:BFF52E35 FF7514 PUSH DWORD [EBP+14]
015F:BFF52E38 66FF7518 PUSH WORD [EBP+18]
015F:BFF52E3C FF15B327F5BF CALL NEAR [BFF527B3]
015F:BFF52E42 98 CWDE
015F:BFF52E43 E8FC540000 CALL `KERNEL32!SUnMapLS_IP_EBP_12`
015F:BFF52E48 E803550000 CALL `KERNEL32!SUnMapLS_IP_EBP_16`
015F:BFF52E4D C9 LEAVE
015F:BFF52E4E C21400 RET 14
在消除注册提示框我有一个问题：

在程序处015F:BFF52E29 E8B0540000 CALL `KERNEL32!SMapLS_IP_EBP_12`
修改eip的值r eip BFF52E4D，可以跳过注册提示框 !但命令修改为 JMP BFF52E4D 可是我用hiew修改程序时，找不到E8B0540000机器码？
请问高手，这是为什么？？？
my mail:scyb@371.net

标 题:若是單純的只要拿掉那個Messagebox只要用SMC就可以! (空)
发信人:C-pen
时 间:2000-8-18 14:54:02
详细信息:


windows commander 4.5

 标 题:淺淡破windows commander Ver4.5 (2千字)
发信人:C-pen
时 间:2000-8-1 11:21:56
详细信息:
由於JOHNSON已被註冊,故以C-pen代替,感謝看雪,dr0,lijj的關心.我們以Windows Commander 4.5為例,4.51應該差不多吧:
(1) 脫殼:Aspack壓的,用Trw2000下PNEWSEC再下MakePE即可
(2) CRC Check:程式一旦被Loader或中斷後,即會認為被病毒感染而結束程式, 這是防跟蹤的手段,我們可用反向Trace法即下Bpx MessageBoxA去攔那個 警告訊息,返回後找可跳過此訊息的JMP;我找到:
:004DF1D7 SUB EAX,00000536 <--CRC出錯時EAX=536
:004DF1DC JZ 004DF4F5 <--跳至MessgeBoxA
:004DF1E2 JMP 004DF937 &szlig;跳至正常程式
如此只要將004DF1DC JZ 004DF4F5 改為NOP即可,但是如此程式還是會
會結束,因為還有一處檢測:
:004E8171 MOV EAX,[00534048] <--取CRC flag
:004E8176 SUB EAX,000023B9 <--正確值為23B9
:004E817B JZ 004E8171 <--若正確即跳躍
:004E817D MOV EAX,00000001 <--否則EAX賦值1
:004E8182 CALL 004044E4 <--CALL離開程式
:004E8187 CALL 004498E0 <--正常執行程式
因此只要再將004E817B JZ 004E8187改jmp即可瓦解程式的CRC Check
(3)NagBOX:未註冊版有令人討厭的NagBox,我們把它拿掉,用fimon分析,發現
它試圖讀Wincmd.key這個Keyfile(其實有經驗的應該知道這個軟體從舊版開始就是用Keyfile保護)故我們假照Wincmd.key這個檔,這個版的正確字元
須為1024Byts,下bpx createfilea do “d *(esp+4)”和bpx Readfile,程式首先會去
讀你的Keyfile是否為80h,若是它會出現你的Keyfile是舊版的訊息,其實只要不是80h你會來到:
:004CDF0A LEA EDX,[EBP+FFFFF6D4]
:004CDF10 MOV ECX,00000068
:004CDF15 MOV EAX,[EBP-0118]
:004CDF1B CALL 004C9C0C
…………….略…………………….
以上一大串的程式是做Keyfile取樣和轉換的工作,有恆心和毅力的人可以試看看,我可沒有,按F10Trace來到:
:004CDFBF CALL 00402A0C <--Keyfile比對
:004CDFC4 JZ 004CE078 <--正確時會JMP,先下R fl Z跳過
:004CDFCA XOR EBX,EBX <--EBX在此之前為1,一旦被清掉就是未註冊版
繼續Trace直到:
:004CE3DA CALL 00402A0C <--再比對一次
:004CE3DF JZ 004CE3E3 <--等於0跳至Good-Guy
:004CE3E1 XOR EBX,EBX <--清掉EBX,Bad-Guy
.
.
:004CE404 MOV [0053E6B8],BL <--[0053E6B8]賦值1為已註冊
[後記]:改法應該很清楚了,只是這樣破了之後在註冊訊息會有一大堆亂碼那是因為我們沒去分析Keyfile,若你看著礙眼可去分析Keyfile去顯示你要的註冊訊息,或者去找印出這些字樣的地方,它應該是push xxxxxxxx Call xxxxxxxx
只要讓它傳遞值為0就不會印出字樣,或是用SMC讓它顯示你要的字樣,由於我不用這個軟體,所以後面的工作我沒有做,故無法跟你經驗分享,實在抱歉
希望你會喜歡!若有問題可和我聯絡:My E-mail:f41400@ms39.hinet.net
JOHNSON from Taiwan


NAG去除

 标 题:去除NaG的一种方法。 (1千字)
发信人:czs
时 间:2000-8-16 18:35:10
详细信息:
本人在使用winRar２.71时，过期，弹出NaG.
用Exescope打开winrar.exe,找到resource-->dialog-->REMINDER,发现
是NaG窗口的内容，用W32dasm8.93打开winrar.exe,查找REMINDER，
* 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
: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
:00401529 90 nop
:0040152A 90 nop
；抱歉，这里已修改了，但不难想象是一跳转。
:0040152B 85C0 test eax, eax
:0040152D 7D26 jge 00401555
: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"
|
:00401544 68E73B4600 push 00463BE7
:00401549 8B0D20CC4600 mov ecx, dword ptr [0046CC20]
:0040154F 51 push ecx

* Reference To: USER32.DialogBoxParamA, Ord:0000h
|
:00401550 E878090600 Call 00461ECD

很快，它的NaG就被Kill掉了。

                            CZS 2000.8.16


vb5.0或6.0软件的NAG

标 题:去掉vb5.0或6.0软件的NAG
发信人:梦醒时分
详细信息:

主页： http://todb.yeah.net

希望这篇教程对你有帮助.

我要先解释一下NAG,有许多人都不懂是什么.它就是软件运行时,跳出一个对话框.过一段时间后,可以
继续运行,退出时又会出现一个对话框.......

有关于时间的nag都可以用以下方法,但它仍然还会显示,只不过有关于时间的限制都被cracked了!
开始之前,你要备份一下我们要修改的文件.

包括 msvbvm50.dll (一般在 c:\<windows目录>\system)
编辑 msvbvm50.dll
寻找 :57 FF 75 08 FF 75 08 ,
改成 :50 FF 75 08 FF 75 08

还有 msvbvm60.dll (一般在 c:\<windows目录>\system)
编辑 msvbvm60.dll
寻找:57 FF 74 24 14 FF 74 24
改成:50 FF 74 24 14 FF 74 24

现在,和时间有关的nag就不会再浪费你的时间了!我在下面的软件中试过Coffe Cup Html editor 5-7和
Icon Edit pro 3-5,我相信这对你会有帮助的,bye!!


Animated Email Magic 2.0

 标 题:初学者(23) (7千字)
发信人:liutong
时 间:2000-8-13 10:08:36
详细信息:
软件名称：Animated Email Magic
最新版本：2.0 Release D
文件大小：7463KB
使用平台：Win95/98/NT
软件简介：
在邮件中加上动画，让MAIL更加生动活泼。

安装完,运行,发现要在线注册,差点儿uninstall,突然发现是30天DEMO,干脆把时钟向前调,
再次运行,弹出个对话框,显示出本机代码并要求输入注册码.嘿嘿,这就好办了....

设断点bpx hmemcpy,找到了计算和比较的地方,看下面

========================================================================
以下是计算部分
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044E94B(C)
|
:0044E930 8B550C mov edx, dword ptr [ebp+0C]
:0044E933 8B0C82 mov ecx, dword ptr [edx+4*eax]<-----取内部的数据
:0044E936 8BD3 mov edx, ebx
:0044E938 D3E2 shl edx, cl
:0044E93A 85F2 test edx, esi<--ESI存放的是十六进制的输入码与1D7EA925的异或结果
:0044E93C 7409 je 0044E947
:0044E93E 8BC8 mov ecx, eax
:0044E940 8BD3 mov edx, ebx
:0044E942 D3E2 shl edx, cl
:0044E944 0955FC or dword ptr [ebp-04], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044E93C(C)
|
:0044E947 40 inc eax
:0044E948 83F820 cmp eax, 00000020 <-----32个数据
:0044E94B 7CE3 jl 0044E930
:0044E94D 8B45FC mov eax, dword ptr [ebp-04]
:0044E950 5E pop esi
:0044E951 5B pop ebx
:0044E952 59 pop ecx
:0044E953 5D pop ebp
:0044E954 C3 ret

32个内部数据
4 1A 6 15
8 A 18 C
1 F 7 B
0 2 0 10
1B 1E 12 1F
11 1D 13 14
17 9 E 19
16 1C 5 3

由我输入的注册码87654321计算后得到3615A6A1
然后软件会将其与另一个码E992DC7F(估计与本机代码391-8716-031有关)比较

=================
* Referenced by a CALL at Addresses:
|:0044EF73 , :0044F615
|
:0044EFF3 55 push ebp
:0044EFF4 8BEC mov ebp, esp
:0044EFF6 53 push ebx
:0044EFF7 56 push esi
:0044EFF8 8B5D08 mov ebx, dword ptr [ebp+08]
:0044EFFB 8B750C mov esi, dword ptr [ebp+0C]
:0044EFFE FF35009F5000 push dword ptr [00509F00]
:0044F004 68809E5000 push 00509E80
:0044F009 56 push esi
:0044F00A E809F9FFFF call 0044E918
:0044F00F 83C40C add esp, 0000000C
:0044F012 3B4341 cmp eax, dword ptr [ebx+41]<---3615A6A1与E992DC7F比较
:0044F015 0F94C0 sete al <----若输入的注册码正确设标志
:0044F018 83E001 and eax, 00000001
:0044F01B 5E pop esi
:0044F01C 5B pop ebx
:0044F01D 5D pop ebp
:0044F01E C3 ret

==============
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044F238(C)
|
:0044F60A 53 push ebx
:0044F60B E879F3FFFF call 0044E989
:0044F610 59 pop ecx
:0044F611 8BD8 mov ebx, eax
:0044F613 53 push ebx
:0044F614 56 push esi
:0044F615 E8D9F9FFFF call 0044EFF3
:0044F61A 83C408 add esp, 00000008
:0044F61D 84C0 test al, al
:0044F61F 753D jne 0044F65E <----查注册标志,若为"1"转
:0044F621 8B06 mov eax, dword ptr [esi]
:0044F623 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Error"
|
:0044F625 68BAA35000 push 0050A3BA

* Possible StringData Ref from Data Obj ->"Key is invalid"
|
:0044F62A 68ABA35000 push 0050A3AB
:0044F62F FF700C push [eax+0C]
:0044F632 FF7068 push [eax+68]
:0044F635 E88F9C0700 call 004C92C9
:0044F63A 83C414 add esp, 00000014
:0044F63D 33C0 xor eax, eax
:0044F63F 50 push eax
:0044F640 6A02 push 00000002
:0044F642 8D55F8 lea edx, dword ptr [ebp-08]
:0044F645 52 push edx
:0044F646 E811950A00 call 004F8B5C
:0044F64B 83C408 add esp, 00000008
:0044F64E 58 pop eax
:0044F64F 8B55C4 mov edx, dword ptr [ebp-3C]
:0044F652 64891500000000 mov dword ptr fs:[00000000], edx
:0044F659 E9D8010000 jmp 0044F836

若将jne 0044F65E 改为jmp 0044F65E 注册后会有"注册成功"提示,但退出后重新启动又会有注册提示.
在跟踪第二段代码时发现在软件启动时也会走这段程序,并找到了调用处

==================
* Reference To: USER32.ClientToScreen, Ord:0000h
|
:00447524 E8612C0B00 Call 004FA18A
:00447529 8D45D8 lea eax, dword ptr [ebp-28]
:0044752C 50 push eax
:0044752D 53 push ebx
:0044752E E8F4F90700 call 004C6F27
:00447533 83C408 add esp, 00000008
:00447536 56 push esi
:00447537 8D75D8 lea esi, dword ptr [ebp-28]
:0044753A 8D7DE8 lea edi, dword ptr [ebp-18]
:0044753D B904000000 mov ecx, 00000004
:00447542 F3 repz
:00447543 A5 movsd
:00447544 5E pop esi
:00447545 8B4510 mov eax, dword ptr [ebp+10]
:00447548 3B45E8 cmp eax, dword ptr [ebp-18]
:0044754B 7C18 jl 00447565
:0044754D 8B5510 mov edx, dword ptr [ebp+10]
:00447550 3B55F0 cmp edx, dword ptr [ebp-10]
:00447553 7D10 jge 00447565
:00447555 8B4D14 mov ecx, dword ptr [ebp+14]
:00447558 3B4DEC cmp ecx, dword ptr [ebp-14]
:0044755B 7C08 jl 00447565
:0044755D 8B4514 mov eax, dword ptr [ebp+14]
:00447560 3B45F4 cmp eax, dword ptr [ebp-0C]
:00447563 7C04 jl 00447569

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0044754B(C), :00447553(C), :0044755B(C)
|
:00447565 33C0 xor eax, eax
:00447567 EB05 jmp 0044756E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447563(C)
|
:00447569 B801000000 mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447567(U)
|
:0044756E 84C0 test al, al
:00447570 7409 je 0044757B <----未注册转
:00447572 53 push ebx
:00447573 E809D90700 call 004C4E81
:00447578 59 pop ecx
:00447579 EB41 jmp 004475BC
将je 0044757B 改为两个nop,软件将不会过期了(但不知是否有功能限制,因为在提示软件注册成功时同时
显示说是full function了)

由于注册码计算都是与或指令,不太好算,想有空时编个程序算.


AudioSphere V1.3

 标 题:有谁能名将它完全破解了 (5千字)
发信人:程式猎人
时 间:2000-8-26 16:21:08
详细信息:
我现在已经将这个程序破解了，但是注册码人的姓名却不是我，所以如果大家有兴趣的话，可以研究一下。

AudioSphere V1.3
程式猎人
【英文版】（390KB，版本：1.3 for Win9x/NT）
简介：这个软件可以让你更加随意地控制你的 PC 的声音系统的音量、平衡、高音以及低音。该软件制作非常紧凑，界面
很漂亮而易用，比起 Win中自带的那个音量控制要好得多。还允许使用者将不同的音量设置保存在软件中。其他特
性还包括：界面颜色可选，梯度风格、多设置预设。
追踪：RN：01234567
今天追踪这个软件是有一定的运气在里面的，但是这也是建立在一定的知识基础上的，好了就不多说了，开始破解这个软件了。
首先这个程序有一个注册的地方，但是在这里我使用bpx hmemcpy无法得到正确的结果，所以有就开始想其它的方法，看一看能够破解它不。
1 使用W32DASM反汇编它，从中可以得到下面的关键地方，
* Possible StringData Ref from Code Obj ->"SOFTWARE\Svetlana Software\Audiosphere"
看到程序调用注册表值，所以就进入注册表的相应位置，查找需要的值，在这里你可以发现它有这样一个值FirstRunDate，当然如果你稍稍懂英语的话，就知道它是什么意思了。这里就是记录你第一次行的时间，我就将它给删除了，下面就开始破解它的。
2 在W32中还发现到这里比较重要
:0044B51A 8B55FC mov edx, dword ptr [ebp-04]
:0044B51D 8B831C020000 mov eax, dword ptr [ebx+0000021C]
:0044B523 E84C0DFDFF call 0041C274

* Possible StringData Ref from Code Obj ->"The 30 days evaluation period: "
|
:0044B528 6898B54400 push 0044B598
:0044B52D 8D55F8 lea edx, dword ptr [ebp-08]
:0044B530 B81E000000 mov eax, 0000001E
:0044B535 2BC6 sub eax, esi
:0044B537 E8D4B8FBFF call 00406E10
:0044B53C FF75F8 push [ebp-08]

* Possible StringData Ref from Code Obj ->" days left"
|
:0044B53F 68C0B54400 push 0044B5C0
:0044B544 8D45FC lea eax, dword ptr [ebp-04]
:0044B547 BA03000000 mov edx, 00000003
程序提示你已经过期多长时间了，那么这个程序是在那里调用它的呢？向上看可以看到是这里调用它的
* Referenced by a CALL at Address:
|:00452BFA
查找它的位置如下：
* Referenced by a CALL at Address:
|:0045255E
|
:00452B94 55 push ebp
:00452B95 8BEC mov ebp, esp
:00452B97 8B8038020000 mov eax, dword ptr [eax+00000238]
:00452B9D 83780C0A cmp dword ptr [eax+0C], 0000000A ***

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00452B31(C)
|
:00452BA1 755C jne 00452BFF
:00452BA3 E8204FFBFF call 00407AC8
:00452BA8 DB05047D4500 fild dword ptr [00457D04]
:00452BAE DEE9 fsubp st(1), st(0)
:00452BB0 D81D042C4500 fcomp dword ptr [00452C04]
:00452BB6 DFE0 fstsw ax
:00452BB8 9E sahf
:00452BB9 760E jbe 00452BC9
:00452BBB A1506D4500 mov eax, dword ptr [00456D50]
:00452BC0 8B00 mov eax, dword ptr [eax]
:00452BC2 E82D93FDFF call 0042BEF4
:00452BC7 EB36 jmp 00452BFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00452BB9(C)
|
:00452BC9 E8FA4EFBFF call 00407AC8
:00452BCE DB05047D4500 fild dword ptr [00457D04]
:00452BD4 DEE9 fsubp st(1), st(0)
:00452BD6 D81D082C4500 fcomp dword ptr [00452C08]
:00452BDC DFE0 fstsw ax
:00452BDE 9E sahf
:00452BDF 761E jbe 00452BFF
:00452BE1 E8E24EFBFF call 00407AC8
:00452BE6 DB05047D4500 fild dword ptr [00457D04]
:00452BEC DEE9 fsubp st(1), st(0)
:00452BEE E839FDFAFF call 0040292C
:00452BF3 8BD0 mov edx, eax
:00452BF5 A1D47C4500 mov eax, dword ptr [00457CD4]
:00452BFA E8C188FFFF call 0044B4C0 这里调用call

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00452BA1(C), :00452BC7(U), :00452BDF(C)
|
:00452BFF 5D pop ebp
:00452C00 C3 ret
好了，在这里你可以看到程序的运行情况了，在上面有三处可以跳跃过这里的地方，那么到底是哪一处呢。我们可以一试，因为我在前面已经将首次运行时间删除掉了，所以当程序重新运行时，已经无法正常运行了，但是如果你在***处设断的话，程序将在这里中断，如果你在这里强迫程序在jne 00452BFF处跳跃的话，它将能够正常运行了，并且在主画面中也没有要求注册的字样了，可是在about项中还要求注册。如果大家使用这个软件的话，时间过了话，就可以将上面的地方改掉就可以无限期的使用它的。但是它依然没有注册，那么我还没有完全成功，所以继续破解它。
这回我使用filemon来跟踪程序调用的什么文件（这个可是今天的关键地方）。通过跟踪，发现程序在我点击about时，它调用它的目录下一个audiosphere.key文件，我于是就查找目录是否有这个文件，发现没有。那么我们通常的作法就是建立一个这样文件，于是就建立了一个这样的文件，内容吗就是随便写的，但是我发现程序如果重新运行的话，在about选项中已经再也没有提示30天的限制了。现在已经变成完全注册了，因为在about中你可以发现这个软件注册给：？？？？？，这个由你输入的值决定的。但是它是经过转换的，到这里这个程序算是破解完了。好了再整理一下。

1 查找：75 5c e8 20 4f
替换：eb -- -- -- --
--表示不用换的值
2 在它的目录下建立一个audiosphere.key文件，内容自己定，一定要大于20个字符。 现在你再运行改后程序，你会发现它已经注册了。


Dynamic Desktop 1.4.2

 标 题:菜鸟破解实录之 Dynamic Desktop 1.4.2 (9千字)
发信人:xiA Qin
时 间:2000-8-9 7:14:46
详细信息:
菜鸟破解实录之 Dynamic Desktop 1.4.2

软件名称： Dynamic Desktop -->(30天试用，在桌面中间留下请注册的英文)
软件版本： 1.4.2
软件大小： 1352KB
发布公司： http://www.dancingbits.com/
软件简介： 可以动态更换墙纸，支持将桌面图标文本背景透明化。
。

作 者：xiA Qin
级 别：刚学不久
解密日前：2000年8月5日
解密工具：S-ICE 4.00
破解目的：学习注册码的破解。(中)

说 明：
本文是在我的软件破解记录上整理出来的。如若有纰漏，请各位大侠多指教！

首先运行Dynamic Desktop

输入注册信息

Code: 12345678901 &任意输入

下指令bpx hmemcpy //下中断点

按F5回到程序，按确定，这时会被Trw2000拦截到。

下指令bd * //屏障中断点

下指令pmodule //直接跳到程序的领空(需要两次)

按F10来到下面指令
...............

015F:00403476 85C0 TEST EAX,EAX
015F:00403478 0F8462DDFFFF JZ 004011E0
015F:0040347E 681CEA4600 PUSH 0046EA1C
015F:00403483 8D85F0FDFFFF LEA EAX,[EBP-0210]
015F:00403489 6840EA4600 PUSH 0046EA40
015F:0040348E 50 PUSH EAX
015F:0040348F 8D85F8E5FFFF LEA EAX,[EBP+FFFFE5F8]
015F:00403495 50 PUSH EAX
015F:00403496 8D8584F5FFFF LEA EAX,[EBP+FFFFF584]
015F:0040349C 50 PUSH EAX
015F:0040349D E8A73F0000 CALL 00407449 //注册码运算，按F8进入。
015F:004034A2 83C414 ADD ESP,14
015F:004034A5 83F802 CMP EAX,02

此处是使用EAX当作一个标值。
也就是以EAX的值来决定注册成功或失败。
当EAX=2时，注册成功。EAX=1,注册失败。(关键，破解的关键)

015F:004034A8 7441 JZ 004034EB //注册码比较
015F:004034AA 0FB605A0FA4600 MOVZX EAX,BYTE PTR [0046FAA0]
015F:004034B1 6A30 PUSH 30
015F:004034B3 6878854600 PUSH 00468578
015F:004034B8 FF3485AC174600 PUSH DWORD PTR [EAX*4+004617AC]
015F:004034BF FF7508 PUSH DWORD PTR [EBP+08]
015F:004034C2 FF15ACB24400 CALL [0044B2AC] //注册失败对话框
015F:004034C8 A0A0FA4600 MOV AL,[0046FAA0]
015F:004034CD 888584F5FFFF MOV [EBP+FFFFF584],AL
015F:004034D3 8D8584F5FFFF LEA EAX,[EBP+FFFFF584]
015F:004034D9 50 PUSH EAX

................................

按F8进入0040349D CALL 00407449来到下面的指令。要按很久哦!

015F:00407502 7418 JZ 0040751C
015F:00407504 56 PUSH ESI
015F:00407505 E816010000 CALL 00407620
015F:0040750A 59 POP ECX
015F:0040750B B94B144600 MOV ECX,0046144B
015F:00407510 2BC8 SUB ECX,EAX
015F:00407512 8A01 MOV AL,[ECX]
015F:00407514 8806 MOV [ESI],AL
015F:00407516 46 INC ESI
015F:00407517 803E00 CMP BYTE PTR [ESI],00
015F:0040751A 75E8 JNZ 00407504 (JUMP )
015F:0040751C 80BD00FCFFFF00 CMP BYTE PTR [EBP-0400],00
015F:00407523 8DB500FCFFFF LEA ESI,[EBP-0400]
015F:00407529 8DBD00FCFFFF LEA EDI,[EBP-0400]
015F:0040752F 742E JZ 0040755F
015F:00407531 807E0100 CMP BYTE PTR [ESI+01],00
015F:00407535 8D5E01 LEA EBX,[ESI+01]
015F:00407538 7425 JZ 0040755F
015F:0040753A 56 PUSH ESI
015F:0040753B E8E0000000 CALL 00407620
015F:00407540 8BD0 MOV EDX,EAX
015F:00407542 53 PUSH EBX
015F:00407543 C0E204 SHL DL,04
015F:00407546 895508 MOV [EBP+08],EDX
015F:00407549 E8D2000000 CALL 00407620
015F:0040754E 59 POP ECX
015F:0040754F 59 POP ECX
015F:00407550 8B4D08 MOV ECX,[EBP+08]
015F:00407553 02C8 ADD CL,AL
015F:00407555 46 INC ESI
015F:00407556 46 INC ESI
015F:00407557 880F MOV [EDI],CL
015F:00407559 47 INC EDI
015F:0040755A 803E00 CMP BYTE PTR [ESI],00
015F:0040755D 75D2 JNZ 00407531
015F:0040755F 802700 AND BYTE PTR [EDI],00
015F:00407562 6A01 PUSH 01 <-修改
015F:00407564 58 POP EAX
015F:00407565 5F POP EDI
015F:00407566 388500FCFFFF CMP [EBP-0400],AL
015F:0040756C 5B POP EBX
015F:0040756D 753B JNZ 004075AA
015F:0040756F 8B9501FCFFFF MOV EDX,[EBP-03FF]
015F:00407575 6A05 PUSH 05
015F:00407577 59 POP ECX
015F:00407578 0FB6B40D00FCFFFF MOVZX ESI,BYTE PTR [ECX+EBP-0400]
015F:00407580 2BD6 SUB EDX,ESI
015F:00407582 41 INC ECX
015F:00407583 83F90D CMP ECX,0D
015F:00407586 7CF0 JL 00407578
015F:00407588 85D2 TEST EDX,EDX
015F:0040758A 0F858D000000 JNZ 0040761D
015F:00407590 8B4514 MOV EAX,[EBP+14]
015F:00407593 8B8D05FCFFFF MOV ECX,[EBP-03FB]
015F:00407599 8908 MOV [EAX],ECX
015F:0040759B 8B4518 MOV EAX,[EBP+18]
015F:0040759E 8B8D09FCFFFF MOV ECX,[EBP-03F7]
015F:004075A4 8908 MOV [EAX],ECX
015F:004075A6 33C0 XOR EAX,EAX
015F:004075A8 EB73 JMP 0040761D
015F:004075AA 80BD00FCFFFF02 CMP BYTE PTR [EBP-0400],02
015F:004075B1 756A JNZ 0040761D
015F:004075B3 80BD05FCFFFF00 CMP BYTE PTR [EBP-03FB],00
015F:004075BA 8BB501FCFFFF MOV ESI,[EBP-03FF]
015F:004075C0 8D8D05FCFFFF LEA ECX,[EBP-03FB]
015F:004075C6 7413 JZ 004075DB
015F:004075C8 8A9505FCFFFF MOV DL,[EBP-03FB]
015F:004075CE 0FB6D2 MOVZX EDX,DL
015F:004075D1 2BF2 SUB ESI,EDX
015F:004075D3 8A5101 MOV DL,[ECX+01]
015F:004075D6 41 INC ECX
015F:004075D7 84D2 TEST DL,DL
015F:004075D9 75F3 JNZ 004075CE
015F:004075DB 85F6 TEST ESI,ESI
015F:004075DD 753E JNZ 0040761D
015F:004075DF 8B7101 MOV ESI,[ECX+01]
015F:004075E2 41 INC ECX
015F:004075E3 83C104 ADD ECX,04
015F:004075E6 8A11 MOV DL,[ECX]
015F:004075E8 84D2 TEST DL,DL
015F:004075EA 7408 JZ 004075F4
015F:004075EC 0FB6D2 MOVZX EDX,DL
015F:004075EF 2BF2 SUB ESI,EDX
015F:004075F1 41 INC ECX
015F:004075F2 EBF2 JMP 004075E6
015F:004075F4 85F6 TEST ESI,ESI
015F:004075F6 7525 JNZ 0040761D
015F:004075F8 8D8505FCFFFF LEA EAX,[EBP-03FB]
015F:004075FE 50 PUSH EAX
015F:004075FF FF750C PUSH DWORD PTR [EBP+0C]
015F:00407602 E8D0FBFFFF CALL 004071D7
015F:00407607 8D84050AFCFFFF LEA EAX,[EAX+EBP-03F6]
015F:0040760E 50 PUSH EAX
015F:0040760F FF7510 PUSH DWORD PTR [EBP+10]
015F:00407612 E8C0FBFFFF CALL 004071D7
015F:00407617 83C410 ADD ESP,10
015F:0040761A 6A02 PUSH 02
015F:0040761C 58 POP EAX
015F:0040761D 5E POP ESI
015F:0040761E C9 LEAVE
015F:0040761F C3 RET
............................

如果要使EAX=2，从上面可以看出，

将00407562 6A01 PUSH 01
改00407562 6A02 PUSH 02

就可以注册。

整里一下，用Ultraedt打开Dynamic Desktop.exe

找到6A 01 58 5F 38 85

改成6A 02 58 5F 38 85

保存修改文件，重新运行。

噢！已经注册了。

嗨！只是看不明白注册码、每次注册码都不相同，看来我太暴力了。

第二种破解方法：

1、
找到004075B1 756A JNZ 0040761D
改成004075B1 746A JZ 0040761D

2、
找到004075DD 753E JNZ 0040761D
改成004075DD 743E JZ 0040761D

3、
找到004075F6 7525 JNZ 0040761D
改成004075F6 7425 JZ 0040761D

同样用Ultraedt打开Dynamic Desktop.exe

1、
找到75 6A 80 BD 05 FC FF

改成74 6A 80 BD 05 FC FF
2、
找到75 3E 8B 71 01

改成74 3E 8B 71 01
3、
找到75 25 8D 85 05 FC FF FF

改成74 25 8D 85 05 FC FF FF

注册信息在注册表中
[HKEY_CURRENT_USER\Software\Dancing Bits\Dynamic Desktop]
"szRegistered"="1234567890"


LanExplorer 3.5

 标 题:LanExplorer 3.5 (16千字)
发信人:dr0
时 间:2000-8-17 14:46:36
详细信息:
LanExplorer 3.5
http://www.intellimax.com

一个很不错的网络抓包工具。它有15天时间限制，15天到期之后可以输入一个密码，然后就可以再用15天或50次，密码好找，但没什么用处，

因为始终会过期。安装的时候可以输入一个序列号，这个序列号会放在注册表中一个名叫SerialNumber的键中，不过序列号似乎没什么用处（

只是推测，未经证实）。我的目的是去除其15天的限制。其目录下有两个可执行程序：probe.exe，inprobe.exe。probe.exe就是普通的EXE，

用W32Dasm反汇编inprobe.exe之后能发现如下的程序段读取SerialNumber，不过根据程序流程分析，它读了注册码之后一定会判断时间，因此

推测注册码可能没什么用。

* Possible StringData Ref from Data Obj ->"SOFTWARE\Intellimax\LanExplorer\CurrentVersion"
|
:0044E79F 68980A4B00 push 004B0A98
:0044E7A4 8D4DA8 lea ecx, dword ptr [ebp-58]
:0044E7A7 E8FEC70200 Call 0047AFAA
:0044E7AC 8B45AC mov eax, dword ptr [ebp-54]
:0044E7AF C7400C02000080 mov [eax+0C], 80000002
:0044E7B6 683F000F00 push 000F003F
:0044E7BB 8D4DA8 lea ecx, dword ptr [ebp-58]
:0044E7BE E87D30FBFF call 00401840
:0044E7C3 50 push eax
:0044E7C4 8B4DAC mov ecx, dword ptr [ebp-54]
:0044E7C7 8B11 mov edx, dword ptr [ecx]
:0044E7C9 8B4DAC mov ecx, dword ptr [ebp-54]
:0044E7CC FF5274 call [edx+74]
:0044E7CF B819000200 mov eax, 00020019
:0044E7D4 85C0 test eax, eax
:0044E7D6 7428 je 0044E800
:0044E7D8 8B8D24FCFFFF mov ecx, dword ptr [ebp+FFFFFC24]
:0044E7DE 81C1DC020000 add ecx, 000002DC
:0044E7E4 51 push ecx

* Possible StringData Ref from Data Obj ->"SerialNumber"
|
:0044E7E5 68C80A4B00 push 004B0AC8
:0044E7EA 8B55AC mov edx, dword ptr [ebp-54]
:0044E7ED 8B02 mov eax, dword ptr [edx]
:0044E7EF 8B4DAC mov ecx, dword ptr [ebp-54]
:0044E7F2 FF505C call [eax+5C]

首先修改机器时间使其过期，然后再运行它，则显示出一个对话框，要求输入password以便延长试用期限。在W32Dasm中查找“expired”，共

找到两处，如下：

第一处：这里它试图删文件，但是已加载到内存中的DLL对应的磁盘文件无法删除。

:0044E918 B960944B00 mov ecx, 004B9460
:0044E91D E81E2FFBFF call 00401840
:0044E922 3BF0 cmp esi, eax
:0044E924 7C18 jl 0044E93E //此处NOP掉
:0044E926 8D4DC0 lea ecx, dword ptr [ebp-40]
:0044E929 E8122FFBFF call 00401840
:0044E92E 8BF0 mov esi, eax
:0044E930 B95C944B00 mov ecx, 004B945C
:0044E935 E8062FFBFF call 00401840
:0044E93A 3BF0 cmp esi, eax
:0044E93C 7E23 jle 0044E961 //此处改为JMP

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

* Possible StringData Ref from Data Obj ->"indis.dll"
|
:0044E93E 68D80A4B00 push 004B0AD8

* Reference To: MSVCRT.remove, Ord:02A8h
|
:0044E943 FF15345D4800 Call dword ptr [00485D34] //试图删文件
:0044E949 83C404 add esp, 00000004

* Possible Reference to Dialog: DialogID_00AC, CONTROL_ID:00FF, ""
|
:0044E94C 6AFF push FFFFFFFF
:0044E94E 6A10 push 00000010

"This trial version of LanExplorer has expired. Please contac"
|
:0044E950 688EF60000 push 0000F68E

* Reference To: MFC42.Ordinal:04AF, Ord:04AFh
|
:0044E955 E804C70200 Call 0047B05E

第二处：从下面的代码中可以看出它把时间在INI文件中放了一份。

* Possible StringData Ref from Data Obj ->"IntactValue"
|
:0041592B 68C4E84A00 push 004AE8C4

* Possible StringData Ref from Data Obj ->"Intact"
|
:00415930 68D0E84A00 push 004AE8D0

* Reference To: KERNEL32.GetPrivateProfileIntA, Ord:0134h
|
:00415935 FF1588534800 Call dword ptr [00485388]
:0041593B 898584FEFFFF mov dword ptr [ebp+FFFFFE84], eax
:00415941 8D8DDCFEFFFF lea ecx, dword ptr [ebp+FFFFFEDC]
:00415947 E8F4BEFEFF call 00401840
:0041594C 50 push eax

* Reference To: MSVCRT.remove, Ord:02A8h
|
:0041594D FF15345D4800 Call dword ptr [00485D34]
:00415953 83C404 add esp, 00000004
:00415956 8B95D4FEFFFF mov edx, dword ptr [ebp+FFFFFED4]
:0041595C 899574FEFFFF mov dword ptr [ebp+FFFFFE74], edx
:00415962 8B8574FEFFFF mov eax, dword ptr [ebp+FFFFFE74]
:00415968 83E801 sub eax, 00000001
:0041596B 898574FEFFFF mov dword ptr [ebp+FFFFFE74], eax
:00415971 83BD74FEFFFF05 cmp dword ptr [ebp+FFFFFE74], 00000005
:00415978 0F87C2000000 ja 00415A40
:0041597E 8B8D74FEFFFF mov ecx, dword ptr [ebp+FFFFFE74]
:00415984 FF248DA35A4100 jmp dword ptr [4*ecx+00415AA3] //跳转表
:0041598B 8B95D0FEFFFF mov edx, dword ptr [ebp+FFFFFED0]
:00415991 52 push edx
:00415992 8B857CFEFFFF mov eax, dword ptr [ebp+FFFFFE7C]
:00415998 50 push eax
:00415999 E852BF0100 call 004318F0
:0041599E 83C408 add esp, 00000008
:004159A1 898580FEFFFF mov dword ptr [ebp+FFFFFE80], eax
:004159A7 E994000000 jmp 00415A40
:004159AC 8B8DD0FEFFFF mov ecx, dword ptr [ebp+FFFFFED0]
:004159B2 51 push ecx
:004159B3 8B957CFEFFFF mov edx, dword ptr [ebp+FFFFFE7C]
:004159B9 52 push edx
:004159BA E88DBF0100 call 0043194C
:004159BF 83C408 add esp, 00000008
:004159C2 898580FEFFFF mov dword ptr [ebp+FFFFFE80], eax
:004159C8 EB76 jmp 00415A40
:004159CA 8B85D0FEFFFF mov eax, dword ptr [ebp+FFFFFED0]
:004159D0 50 push eax
:004159D1 8B8D7CFEFFFF mov ecx, dword ptr [ebp+FFFFFE7C]
:004159D7 51 push ecx
:004159D8 E8C8BF0100 call 004319A5
:004159DD 83C408 add esp, 00000008
:004159E0 898580FEFFFF mov dword ptr [ebp+FFFFFE80], eax
:004159E6 EB58 jmp 00415A40
:004159E8 8B95D0FEFFFF mov edx, dword ptr [ebp+FFFFFED0]
:004159EE 52 push edx
:004159EF 8B857CFEFFFF mov eax, dword ptr [ebp+FFFFFE7C]
:004159F5 50 push eax
:004159F6 E806C00100 call 00431A01
:004159FB 83C408 add esp, 00000008
:004159FE 898580FEFFFF mov dword ptr [ebp+FFFFFE80], eax
:00415A04 EB3A jmp 00415A40
:00415A06 8B8DD0FEFFFF mov ecx, dword ptr [ebp+FFFFFED0]
:00415A0C 51 push ecx
:00415A0D 8B957CFEFFFF mov edx, dword ptr [ebp+FFFFFE7C]
:00415A13 52 push edx
:00415A14 E844C00100 call 00431A5D
:00415A19 83C408 add esp, 00000008
:00415A1C 898580FEFFFF mov dword ptr [ebp+FFFFFE80], eax
:00415A22 EB1C jmp 00415A40
:00415A24 8B85D0FEFFFF mov eax, dword ptr [ebp+FFFFFED0]
:00415A2A 50 push eax
:00415A2B 8B8D7CFEFFFF mov ecx, dword ptr [ebp+FFFFFE7C]
:00415A31 51 push ecx
:00415A32 E885C00100 call 00431ABC
:00415A37 83C408 add esp, 00000008
:00415A3A 898580FEFFFF mov dword ptr [ebp+FFFFFE80], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00415978(C), :004159A7(U), :004159C8(U), :004159E6(U), :00415A04(U)
|:00415A22(U)
|
:00415A40 8B9584FEFFFF mov edx, dword ptr [ebp+FFFFFE84]
:00415A46 3B9580FEFFFF cmp edx, dword ptr [ebp+FFFFFE80]
:00415A4C 7419 je 00415A67
:00415A4E 83BD84FEFFFF00 cmp dword ptr [ebp+FFFFFE84], 00000000
:00415A55 740E je 00415A65 //改为JMP

* Possible Reference to Dialog: DialogID_00AC, CONTROL_ID:00FF, ""
|
:00415A57 6AFF push FFFFFFFF
:00415A59 6A10 push 00000010

"This trial version of LanExplorer has expired.Please contact"
|
:00415A5B 688EF60000 push 0000F68E

* Reference To: MFC42.Ordinal:04AF, Ord:04AFh
|
:00415A60 E8F9550600 Call 0047B05E

将上述几处修改之后，再运行probe.exe，发现还是会弹出对话框要求输密码。用bpx GetLocalTime或bpx DialogBoxIndirectParamA设断点，

中断之后发现处在inprobe.exe的代码段中，而inprobe.exe是真正的EXE（用IDA可以正确地反汇编），并非DLL，所以它肯定是用

CreateProcessA、WinExec（过时的，实际是调用CreateProcessA）、ShellExecute之类的函数启动inprobe.exe的。用这几个函数作断点，发

现在下面的地方它启动inprobe.exe，并把时间作为命令行参数传给它，而后用WaitForSingleObject阻塞自己，等待inprobe.exe退出，再取其

退出值进行判断。

* Referenced by a CALL at Address:
|:0044EABD
|
:004157C4 55 push ebp
:004157C5 8BEC mov ebp, esp

* Possible Reference to Dialog: DialogID_00AC, CONTROL_ID:00FF, ""
|
:004157C7 6AFF push FFFFFFFF
:004157C9 688CF24700 push 0047F28C
:004157CE 64A100000000 mov eax, dword ptr fs:[00000000]
:004157D4 50 push eax
:004157D5 64892500000000 mov dword ptr fs:[00000000], esp
:004157DC 81EC80010000 sub esp, 00000180
:004157E2 8B4508 mov eax, dword ptr [ebp+08]
:004157E5 50 push eax
:004157E6 8D8DDCFEFFFF lea ecx, dword ptr [ebp+FFFFFEDC]

* Reference To: MFC42.Ordinal:0219, Ord:0219h
|
:004157EC E8B1590600 Call 0047B1A2
:004157F1 C745FC00000000 mov [ebp-04], 00000000

* Reference To: MSVCRT.rand, Ord:02A6h
|
:004157F8 FF152C5D4800 Call dword ptr [00485D2C]
:004157FE 99 cdq
:004157FF B906000000 mov ecx, 00000006
:00415804 F7F9 idiv ecx
:00415806 83C201 add edx, 00000001
:00415809 8995D4FEFFFF mov dword ptr [ebp+FFFFFED4], edx

* Reference To: MSVCRT.rand, Ord:02A6h
|
:0041580F FF152C5D4800 Call dword ptr [00485D2C]
:00415815 89857CFEFFFF mov dword ptr [ebp+FFFFFE7C], eax

* Reference To: MSVCRT.rand, Ord:02A6h
|
:0041581B FF152C5D4800 Call dword ptr [00485D2C]
:00415821 8985D0FEFFFF mov dword ptr [ebp+FFFFFED0], eax
:00415827 C78584FEFFFF00000000 mov dword ptr [ebp+FFFFFE84], 00000000
:00415831 C78580FEFFFF00000000 mov dword ptr [ebp+FFFFFE80], 00000000
:0041583B C785D8FEFFFF00000000 mov dword ptr [ebp+FFFFFED8], 00000000

* Possible StringData Ref from Data Obj ->"intact.ini"
|
:00415845 689CE84A00 push 004AE89C
:0041584A 8D8DDCFEFFFF lea ecx, dword ptr [ebp+FFFFFEDC]

* Reference To: MFC42.Ordinal:03AD, Ord:03ADh
|
:00415850 E835590600 Call 0047B18A
:00415855 8B95D0FEFFFF mov edx, dword ptr [ebp+FFFFFED0]
:0041585B 52 push edx
:0041585C 8B857CFEFFFF mov eax, dword ptr [ebp+FFFFFE7C]
:00415862 50 push eax
:00415863 8B8DD4FEFFFF mov ecx, dword ptr [ebp+FFFFFED4]
:00415869 51 push ecx

* Possible StringData Ref from Data Obj ->"InProbe.exe -f%d -s%d -e%d"
|
:0041586A 68A8E84A00 push 004AE8A8
:0041586F 8D95E0FEFFFF lea edx, dword ptr [ebp+FFFFFEE0]
:00415875 52 push edx

* Reference To: MSVCRT.sprintf, Ord:02B2h
|
:00415876 FF15705D4800 Call dword ptr [00485D70]
:0041587C 83C414 add esp, 00000014
:0041587F 6A44 push 00000044
:00415881 6A00 push 00000000
:00415883 8D858CFEFFFF lea eax, dword ptr [ebp+FFFFFE8C]
:00415889 50 push eax

* Reference To: MSVCRT.memset, Ord:0299h
|
:0041588A E87B630600 Call 0047BC0A
:0041588F 83C40C add esp, 0000000C
:00415892 C7858CFEFFFF44000000 mov dword ptr [ebp+FFFFFE8C], 00000044
:0041589C C785B8FEFFFF01000000 mov dword ptr [ebp+FFFFFEB8], 00000001
:004158A6 66C785BCFEFFFF0500 mov word ptr [ebp+FFFFFEBC], 0005
:004158AF 8D4DE4 lea ecx, dword ptr [ebp-1C]
:004158B2 51 push ecx
:004158B3 8D958CFEFFFF lea edx, dword ptr [ebp+FFFFFE8C]
:004158B9 52 push edx
:004158BA 6A00 push 00000000
:004158BC 6A00 push 00000000

* Possible Reference to Dialog: DialogID_0080
|
:004158BE 6880000000 push 00000080
:004158C3 6A00 push 00000000
:004158C5 6A00 push 00000000
:004158C7 6A00 push 00000000
:004158C9 8D85E0FEFFFF lea eax, dword ptr [ebp+FFFFFEE0]
:004158CF 50 push eax
:004158D0 6A00 push 00000000

* Reference To: KERNEL32.CreateProcessA, Ord:0044h
|
:004158D2 FF15B8534800 Call dword ptr [004853B8]

* Possible Reference to Dialog: DialogID_07D0
|
:004158D8 68D0070000 push 000007D0
:004158DD 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004158E0 51 push ecx

* Reference To: KERNEL32.WaitForSingleObject, Ord:02CEh
|
:004158E1 FF15A0534800 Call dword ptr [004853A0]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415911(U)
|
:004158E7 8D9588FEFFFF lea edx, dword ptr [ebp+FFFFFE88]
:004158ED 52 push edx
:004158EE 8B45E4 mov eax, dword ptr [ebp-1C]
:004158F1 50 push eax

* Reference To: KERNEL32.GetExitCodeProcess, Ord:010Bh
|
:004158F2 FF15B4534800 Call dword ptr [004853B4]
:004158F8 85C0 test eax, eax
:004158FA 7417 je 00415913
:004158FC 81BD88FEFFFF03010000 cmp dword ptr [ebp+FFFFFE88], 00000103
:00415906 7507 jne 0041590F
:00415908 E8490C0400 call 00456556
:0041590D EB02 jmp 00415911

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415906(C)
|
:0041590F EB02 jmp 00415913

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041590D(U)
|
:00415911 EBD4 jmp 004158E7

注意到上面这个函数是在probe.exe的CS:0044EABD处进行调用的，如下。很显然，只要把CS:0044EABC处的指令改为JMP 0044EAD0就可以将

inprobe.exe整个bypass掉，也就可以把inprobe.exe删了。

:0044EABC 50 push eax
:0044EABD E8026DFCFF call 004157C4 //加载inprobe.exe
:0044EAC2 83C404 add esp, 00000004
:0044EAC5 85C0 test eax, eax
:0044EAC7 7507 jne 0044EAD0 //jump if good guy
:0044EAC9 33C0 xor eax, eax //bad guy, exit
:0044EACB E916160000 jmp 004500E6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044EAC7(C)
|
:0044EAD0 8B8D24FCFFFF mov ecx, dword ptr [ebp+FFFFFC24]
很显然，只要把CS:0044EABC处的指令改为JMP 0044EAD0就可以将

inprobe.exe整个bypass掉，也就可以把inprobe.exe删了。

:0044EABC 50 push eax
:0044EABD E8026DFCFF call 004157C4 //加载inprobe.exe
:0044EAC2 83C404 add esp, 00000004
:0044EAC5 85C0 test eax, eax
:0044EAC7 7507 jne 0044EAD0 //jump if good guy
:0044EAC9 33C0 xor eax, eax //bad guy, exit
:0044EACB E916160000 jmp 004500E6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044EAC7(C)
|
:0044EAD0 8B8D24FCFFFF mov ecx, dword ptr [ebp+FFFFFC24]

这个程序启动的时候还有一个splash screen，比较讨厌。用bpx CreateWindowExA设断点，会发现OT60as.dll中的一个函数负责显示splash

screen，在probe.exe中的如下地方被调用。跳过下面的这个call即可，不会造成资源泄漏，修改的时候注意保持堆栈平衡即可。

:0044EA62 6A00 push 00000000
:0044EA64 6800000090 push 90000000
:0044EA69 6A00 push 00000000
:0044EA6B 8B45C4 mov eax, dword ptr [ebp-3C]
:0044EA6E 8B10 mov edx, dword ptr [eax]
:0044EA70 8B4DC4 mov ecx, dword ptr [ebp-3C]
:0044EA73 FF92C0000000 call dword ptr [edx+000000C0]

dr0, 2000/08/17


MicroAngelo 98 4.77

 标 题:谁能破解 MicroAngelo 98 4.77! (软件详细说明见内） (636字)
发信人:1212
时 间:2000-7-15 19:15:57
详细信息:
桌面工具|ICON工具
http://www.newhua.com.cn/Microangelo98.htm
软件名称：MicroAngelo 98
整理日期：2000.4.10
最新版本：4.77
文件大小：1361KB
软件授权：共享软件
使用平台：Win95/98/NT
发布公司：http://www.impactsoft.com/index.htm
软件简介：
    MicroAngelo是一个可编辑和管理光标的工具，可让您轻易地浏览、管理和编辑ICO、ICL、EXE、DLL文件中的图示文件，支持单色，16或者256颜色及8x8到64x64的图素尺寸。还能调整设定你的桌面，如布景主题、移除桌面图示捷径的箭头等。说明文章

本地下载：
http://www.newhua.com/down/mike98.exe
http://www.win2000.com.cn/down/mike98.exe
国外下载：
http://www.impactsoft.com/muangelo/download/mike98.exe

标 题:well, easy to defeat it (321字)
发信人:guest
时 间:2000-7-15 20:49:57
详细信息:

use "BPX GetLocalTime", press F12 twice, then press F10, you will see all the time checks.It uses such registry keys as "State", "LastRun", "CheckNum" etc. Delete these keys and reinstall it.
Disassemble "MUAPP.DLL', read its exported functions. The function names are self-explained.
Patching its EXEs is a good idea.

标 题:但MUAPP.DLL有自检功能！要先破解这自检才行！ (空)
发信人:china2000
时 间:2000-7-16 7:08:39
阅读次数:12
详细信息:

标 题:顺便说一下：从汇编代码来看，如果存在文件mucom.dll，则该软件为注册版。即注册后作者会给这个文件 (空)
发信人:dr0
时 间:2000-7-18 15:37:50
详细信息:

标 题:如下 (3千字)
发信人:dr0
时 间:2000-7-18 17:30:04
详细信息:

这个软件（包）是属于比较简单的那一类。先用RegMon、FileMon找一下，看见几个可疑的注册表键：Start、State、CheckNum等。以Animator为例，用bpx RegQueryValueExA do "d *(esp+8)"设断点，看见它读Start键的时候就改按F12或F10，会看见它检查注册表中的这几个键。可见，只要DS:[0042BD60]为非零值，它就不会检查时间了。于是用BPM 0042BD60 W设个断点，发现它把LoadLibraryA("MUCOM.DLL",...)的返回值放在这个变量中，这说明只要存在一个有效的mucom.dll就是注册版，因为注册版不用检查日期，且不会在窗口的标题栏中显示“Evaluation day 1 of 30”之类的鬼话，而且它还会调用这个dll中的GetCopyRight( )显示注册用户的信息。由于无法构造一个有效的mucom.dll，故只需要把下面的第一个JNZ改为JMP即可。注意：不要朝[0042BD60]中写入非零值，因为它是DLL的句柄，弄不好会出非法操作。其它的几个EXE与此类似。

015F:0040C3ED MOV EAX,[0042BD60]
015F:0040C3F2 TEST EAX,EAX
015F:0040C3F4 JNZ 0040C40C
015F:0040C3F6 CALL 004184C0 //这里头检查时间。
015F:0040C3FB TEST EAX,EAX
015F:0040C3FD JNZ 0040C40C
015F:0040C3FF POP EDI
015F:0040C400 POP ESI
015F:0040C401 POP EBP
015F:0040C402 POP EBX
015F:0040C403 ADD ESP,000001E4
015F:0040C409 RET 0008
015F:0040C40C MOV EAX,[0042BE8C]

至于muapp.dll的CRC校验，用bpx CreateFileA容易搞定。只要是CRC校验，一定要使用文件读写或内存映射文件的API，用这些API作断点即可。共两处CRC校验，第一处是检查自己，第二处是检查EXE。似乎在DllMain( )中干的，因为说无法启动该DLL。

015F:6400135A 89442414 MOV [ESP+14],EAX
015F:6400135E 85DB TEST EBX,EBX
015F:64001360 7FCB JG 6400132D
015F:64001362 56 PUSH ESI
015F:64001363 FF157C700064 CALL [KERNEL32!CloseHandle]
015F:64001369 A130900064 MOV EAX,[64009030]
015F:6400136E 8B542414 MOV EDX,[ESP+14]
015F:64001372 3BD0 CMP EDX,EAX //第一处
015F:64001374 0F85BDFCFFFF JNZ 64001037

.................

015F:6400156B 85C0 TEST EAX,EAX
015F:6400156D 7507 JNZ 64001576
015F:6400156F B803000000 MOV EAX,00000003
015F:64001574 EB19 JMP 6400158F
015F:64001576 8D542430 LEA EDX,[ESP+30]
015F:6400157A 681C910064 PUSH 6400911C
015F:6400157F 52 PUSH EDX
015F:64001580 FFD6 CALL ESI
015F:64001582 85C0 TEST EAX,EAX
015F:64001584 0F85ADFAFFFF JNZ 64001037
015F:6400158A B801000000 MOV EAX,00000001
015F:6400158F 8B4C2414 MOV ECX,[ESP+14]
015F:64001593 8B148534900064 MOV EDX,[EAX*4+64009034]
015F:6400159A 3BCA CMP ECX,EDX //第二处
015F:6400159C 0F8595FAFFFF JNZ 64001037
015F:640015A2 5F POP EDI
015F:640015A3 5E POP ESI
015F:640015A4 5D POP EBP
015F:640015A5 B801000000 MOV EAX,00000001 //good guy
015F:640015AA 5B POP EBX
015F:640015AB 81C4B8020000 ADD ESP,000002B8
015F:640015B1 C20C00 RET 000C

标 题:破解一个muapp.dll就OK了！ (282字)
发信人:china2000
时 间:2000-7-18 16:44:02
详细信息:

Comparing files muapp.dll
000011B3: 74 EB
0000136F: 54 D0
00001370: 24 90
00001371: 14 90
00001C48: 75 EB
000024DE: 75 90
000024DF: 0F 90
00002835: 85 B8
00002836: C0 01
00002837: 74 00
00002838: 05 00
00002839: 33 00
0000283A: C0 90
0008893E: 28 00
000889CC: 25 00


NoteTab Pro Trial 4.81

 标 题:破解实录（四）之 NoteTab Pro Trial 4.81 (3千字)
发信人:xiA Qin
时 间:2000-7-18 16:45:24
详细信息:
破解实录（四）之 NoteTab Pro Trial 4.81

软件名称：NoteTab Pro Trial 4.81 -->(30天试用)
简 介：超级的文字编辑器，除可取代Windows的Notepad外，它可编辑大的文件，在打列方面也能调整边界、页码等，它亦可读写DOS ASCII and UNIX等格式文件，对HtmL更提供了多种的工具，可轻易快速的编写。

作 者：xiA Qin
级 别：原始社会
解密日前：2000年7月18日
解密工具：Trw2000 1.22
破解目的：学习NAG窗口的去除的破解。(简单)

说 明：
本文是在我的软件破解记录上整理出来的。只作技术交流。如若有纰漏，请各位大侠多指教！

首先将系统的时间调快一个月。

Ctrl+N进入Trw2000

下指令bpx createwindowex //下中断点

按X键回到桌面运行程序，这时会被Trw2000拦截到。

下指令bc * //清除断点

下指令pmodule //直接跳到程序的领空

按F10来到下面

015F:0054B240 8B45EC MOV EAX,[EBP-14]
015F:0054B243 8D4DF0 LEA ECX,[EBP-10]
015F:0054B246 BA7CB45400 MOV EDX,0054B47C
015F:0054B24B E84402F2FF CALL 0046B494
015F:0054B250 8B55F0 MOV EDX,[EBP-10]
015F:0054B253 A18CDD5400 MOV EAX,[0054DD8C]
015F:0054B258 E8DF8BEBFF CALL 00403E3C
015F:0054B25D 8B0D8CDD5400 MOV ECX,[0054DD8C]
015F:0054B263 8B09 MOV ECX,[ECX]
015F:0054B265 B201 MOV DL,01
015F:0054B267 A16CDE4600 MOV EAX,[0046DE6C]
015F:0054B26C E8EF2FF2FF CALL 0046E260
015F:0054B271 8B1538E15400 MOV EDX,[0054E138]
015F:0054B277 8902 MOV [EDX],EAX
015F:0054B279 33D2 XOR EDX,EDX
015F:0054B27B B001 MOV AL,01
015F:0054B27D E8AA73FCFF CALL 0051262C
015F:0054B282 A110E25400 MOV EAX,[0054E210]
015F:0054B287 803800 CMP BYTE [EAX],00
015F:0054B28A 751A JNZ 0054B2A6
015F:0054B28C E8077FFCFF CALL 00513198 //关键CALL

当走到这里时就会弹出试用过期的对话框。

看看那里可以跳过这里。

上面0054B28A 751A JNZ 0054B2A6 好像可以跳过它耶!!!!

重新下断点bpx 0054b287

按X键回到桌面运行程序，这时被Trw2000拦截到。

当光标走到0054B28A 751A JNZ 0054B2A6 ，

打入命令 CODE ON 记下指令码

下指令A 写入汇编代码
将 0054B28A 751A JNZ 0054B2A6
改 0054B28A 741A JZ 0054B2A6

好耶！又可以进入程序了，成功了。

015F:0054B291 84C0 TEST AL,AL
015F:0054B293 7411 JZ 0054B2A6
015F:0054B295 A138E15400 MOV EAX,[0054E138]
015F:0054B29A 8B00 MOV EAX,[EAX]
015F:0054B29C E8937FEBFF CALL 00403234
015F:0054B2A1 E8128AEBFF CALL 00403CB8
015F:0054B2A6 A1F8E25400 MOV EAX,[0054E2F8]
015F:0054B2AB 8B00 MOV EAX,[EAX]
015F:0054B2AD 66BAEDFF MOV DX,FFED
015F:0054B2B1 E8DAB3EEFF CALL 00436690
015F:0054B2B6 A110E25400 MOV EAX,[0054E210]
015F:0054B2BB 803800 CMP BYTE [EAX],00
015F:0054B2BE 740D JZ 0054B2CD
015F:0054B2C0 A180E05400 MOV EAX,[0054E080]
015F:0054B2C5 C70007000000 MOV DWORD [EAX],07
015F:0054B2CB EB5F JMP SHORT 0054B32C
015F:0054B2CD E84AF8FFFF CALL 0054AB1C
015F:0054B2D2 A1DCE05400 MOV EAX,[0054E0DC]
015F:0054B2D7 8B00 MOV EAX,[EAX]
015F:0054B2D9 BA88B45400 MOV EDX,0054B488
015F:0054B2DE E875CBEEFF CALL 00437E58
015F:0054B2E3 6A11 PUSH BYTE +11
015F:0054B2E5 E846C4EBFF CALL `USER32!GetAsyncKeyState`
015F:0054B2EA 6685C0 TEST AX,AX
015F:0054B2ED 0F9CC2 SETL DL
015F:0054B2F0 A138E15400 MOV EAX,[0054E138]
015F:0054B2F5 8B00 MOV EAX,[EAX]
015F:0054B2F7 B101 MOV CL,01
015F:0054B2F9 E8CA38F2FF CALL 0046EBC8

在NotePro.exe用Ultraedt找到

75 1A E8 07 7F FC FF 84
改成 74 1A E8 07 7F FC FF 84


PowerZip V5.2

 标 题:菜鸟学破解（七）之 PowerZip V5.2 (3千字)
发信人:xiA Qin
时 间:2000-7-21 9:43:54
详细信息:
菜鸟学破解（七）之 PowerZip V5.2

软件名称：PowerZip -->(60天试用)
版 本：5.2
简 介：非常强悍的压缩、解压缩工具，几乎支持所有压缩格式！感觉起来作者似乎是以WinZip 为蓝本来开发 PowerZip，因为程序介面与使用方法非常的像，而且在文件上按鼠标右键的pop menu 上也有[Add to Zip]和[Extract to...]的选项，并且亦支持制作 EXE 自解压缩档。支持格式：ZIP、A、ARJ、TAR、GZ、TGZ、Z、RAR、CAB、LHA、EXE

作 者：xiA Qin
级 别：很菜...很菜....
解密日前：2000年7月21日
解密工具：Trw2000 1.22
破解目的：学习NAG窗口的去除的破解。(简单)

说 明：
本文是在我的软件破解记录上整理出来的。只作技术交流。如若有纰漏，请各位大侠多指教！

首先将系统的时间调快60天。

Ctrl+N进入Trw2000

下指令bpx createwindowex //下中断点

按X键回到桌面运行程序，这时会被Trw2000拦截到。

下指令bc * //清除断点

下指令pmodule //直接跳到程序的领空

按F10来到下面,

.........................

015F:00504760 MOV EDX,[ESP+28]
015F:00504764 CMP [EDX-08],EBX
015F:00504767 JNZ 00504776
015F:00504769 MOV ECX,[ESI+20]
015F:0050476C PUSH DWORD 0052133C
015F:00504771 CALL `MFC42!ord_00001837`
015F:00504776 PUSH EBX
015F:00504777 PUSH DWORD 00521330
015F:0050477C PUSH DWORD 00521290
015F:00504781 MOV ECX,ESI
015F:00504783 CALL `MFC42!ord_00000DC1`
015F:00504788 TEST EAX,EAX
015F:0050478A JZ 00504790
015F:0050478C PUSH BYTE +03
015F:0050478E JMP SHORT 00504792
015F:00504790 PUSH BYTE +05
015F:00504792 MOV ECX,[ESI+20]
015F:00504795 CALL `MFC42!ord_00001847`
015F:0050479A MOV EAX,[ESI+20]
015F:0050479D MOV EAX,[EAX+20]
015F:005047A0 PUSH EAX
015F:005047A1 CALL `USER32!UpdateWindow`
015F:005047A7 MOV ECX,[ESI+20]
015F:005047AA PUSH BYTE +01
015F:005047AC CALL `MFC42!ord_000009FE`
015F:005047B1 MOV ECX,[005218D8]
015F:005047B7 CMP BYTE [ECX+E9],44
015F:005047BE JZ NEAR 00504871 //这里可以跳过下面的CALL,我改。
015F:005047C4 CALL `DTUTIL!?DT_GetEvalDay@@YGIXZ`
015F:005047CA CMP EAX,BYTE +0A
015F:005047CD JNA NEAR 00504871
015F:005047D3 LEA ECX,[ESP+3C]
015F:005047D7 CALL `MFC42!ord_000009D2` //时间过期对话框

当走到这里时就会弹出试用过期的对话框。

看看那里可以跳过这里。

上面005047BE JZ NEAR 00504871 好像可以跳过它耶!!!!

重新下断点bpx 005047B7

按X键回到桌面运行程序，这时被Trw2000拦截到。

当光标走到005047BE JZ NEAR 00504871

打入命令 CODE ON 记下指令码

下指令A 写入汇编代码
将015F:005047BE JZ NEAR 00504871

改015F:005047BE JNZ NEAR 00504871

好耶！又可以进入程序了，成功了。

015F:005047DC CMP EAX,BYTE +0A
015F:005047DF JZ NEAR 00504871
015F:005047E5 LEA ECX,[ESP+14]
015F:005047E9 MOV [ESP+0310],BL
015F:005047F0 CALL `MFC42!ord_00000269`
015F:005047F5 LEA ECX,[ESP+02FC]
...........................

整里一下，用Ultraedt打开PowerZip.exe

找到OF 84 AD 00 00 00

改成0F 85 AD 00 00 00

重新运行程序试一试。


SmartDraw 5.03

 标 题:各位大哥帮个忙 (163字)
发信人:guest
时 间:2000-8-30 10:02:20
详细信息:
SmartDraw 5.03
http://www.newhua.com/smartdraw.htm
绘制流程图和其他各种图表的工具软件，功能强大，简单易用。
很好的软件，可惜有时间限制，各位大哥帮忙破解一下吧。

标 题:SmartDraw5时间过期破解 (5千字)
发信人:小牧童
时 间:2000-8-30 20:48:35
详细信息:

SmartDraw5时间过期破解
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041CA71(C)
|
:0041CA8C E89E080000 call 0041D32F
:0041CA91 85C0 test eax, eax
:0041CA93 7423 jnz 0041CAB8 //改为 jmp 0041CAB8
:0041CA95 6830200000 push 00002030

* Possible Reference to String Resource ID=00041: "This trial version of SmartDraw has now expired. You may dow"
|
:0041CA9A 6A29 push 00000029
:0041CA9C E8E0B2FEFF call 00407D81
:0041CAA1 83C408 add esp, 00000008

* Possible Ref to Menu: MDMENU, Item: "Object"
|
:0041CAA4 C705A00D590001000000 mov dword ptr [00590DA0], 00000001

* Possible Ref to Menu: MDMENU, Item: "Object"
|
:0041CAAE C705A80D590001000000 mov dword ptr [00590DA8], 00000001 //设过期标志

l Referenced by a (U)nconditional or (C)onditional Jump at Address:

查："This Trial Version License HAS EXPIRED!"
找到判断过期标志的依据如下：
Name: CANTSAVE, # of Controls=010, Caption:"SmartDraw Trial Edition License Expired!", ClassName:"" // 注意这个CANTSAVE
001 - ControlID:0006, Control Class:"BUTTON" Control Text:"No"
002 - ControlID:0009, Control Class:"BUTTON" Control Text:"&Purchase"
003 - ControlID:0007, Control Class:"BUTTON" Control Text:"&Continue"
004 - ControlID:FFFF, Control Class:"STATIC" Control Text:""
005 - ControlID:FFFF, Control Class:"STATIC" Control Text:"This Trial Version License HAS EXPIRED!"
006 - ControlID:FFFF, Control Class:"BUTTON" Control Text:""
007 - ControlID:FFFF, Control Class:"STATIC" Control Text:"YOU ARE NO LONGER ABLE TO SAVE DOCUMENTS"
008 - ControlID:1389, Control Class:"STATIC" Control Text:"15"
009 - ControlID:040C, Control Class:"BUTTON" Control Text:"Dummy"
010 - ControlID:FFFF, Control Class:"STATIC" Control Text:"To purchase SmartDraw, press the Purchase button."
以下是由CANTSAVE所查到
／／／//不能另存为提示

* Referenced by a CALL at Address:
|:004099EE
|
:005356E4 55 push ebp
:005356E5 8BEC mov ebp, esp
:005356E7 81EC48020000 sub esp, 00000248
:005356ED C785C0FDFFFF00000000 mov dword ptr [ebp+FFFFFDC0], 00000000
:005356F7 C785E8FEFFFF00000000 mov dword ptr [ebp+FFFFFEE8], 00000000
:00535701 C745F400000000 mov [ebp-0C], 00000000
:00535708 833DA80D590000 cmp dword ptr [00590DA8], 00000000 //比较
:0053570F 741A je 0053572B

* Possible Reference to String Resource ID=00002: "There is no active printer selected. Choose Page Setup from "
|
:00535711 6A02 push 00000002

* Possible StringData Ref from Data Obj ->"CANTSAVE" //不能另存为提示
|
:00535713 6800F25800 push 0058F200
:00535718 A1201D5900 mov eax, dword ptr [00591D20]
:0053571D 50 push eax
:0053571E E8F28F0000 call 0053E715
:00535723 83C40C add esp, 0000000C
:00535726 E94F030000 jmp 00535A7A

／／//不能存为模板提示

* Referenced by a CALL at Address:
|:004099F8
|
:00535BF4 55 push ebp
:00535BF5 8BEC mov ebp, esp
:00535BF7 81EC38020000 sub esp, 00000238
:00535BFD C785C8FDFFFF00000000 mov dword ptr [ebp+FFFFFDC8], 00000000
:00535C07 833DA80D590000 cmp dword ptr [00590DA8], 00000000 //比较
:00535C0E 741A je 00535C2A

* Possible Reference to String Resource ID=00002: "There is no active printer selected. Choose Page Setup from "
|
:00535C10 6A02 push 00000002

* Possible StringData Ref from Data Obj ->"CANTSAVE" //不能保存为模板提示
|
:00535C12 6814F25800 push 0058F214
:00535C17 A1201D5900 mov eax, dword ptr [00591D20]
:00535C1C 50 push eax
:00535C1D E8F38A0000 call 0053E715
:00535C22 83C40C add esp, 0000000C
:00535C25 E9DE010000 jmp 00535E08

／／//不能保存文件提示
* Referenced by a CALL at Addresses:
|:004099E1 , :005362C8 , :0053647E , :00546B5B
|
:00535E0C 55 push ebp
:00535E0D 8BEC mov ebp, esp
:00535E0F 81EC20010000 sub esp, 00000120
:00535E15 C785E8FEFFFF00000000 mov dword ptr [ebp+FFFFFEE8], 00000000
:00535E1F 833DA80D590000 cmp dword ptr [00590DA8], 00000000 //比较
:00535E26 741C je 00535E44

* Possible Reference to String Resource ID=00002: "There is no active printer selected. Choose Page Setup from "
|
:00535E28 6A02 push 00000002

* Possible StringData Ref from Data Obj ->"CANTSAVE" //不能保存文件提示

|
:00535E2A 6820F25800 push 0058F220
:00535E2F A1201D5900 mov eax, dword ptr [00591D20]
:00535E34 50 push eax

由上可知[00590DA8]为过期标志

修改方法：
查e8 9e 08 00 00 85 c0 74 23 改为：e8 9e 08 00 00 85 c0 eb 23

查c7 05 a8 0d 59 00 01 00 00 00 替换为：c7 05 a8 0d 59 00 00 00 00 00 （共６处）

实际还有其它方法可解决问题，在此不列出了。


Windows 2000 RC3

标 题:破解 Windows 2000 RC3 的时间限制
发信人:Sun Bird [CCG]
时 间:2000年3月22日
详细信息:

作者：Sun Bird [CCG]（我，Sun Bird 属于破解团体 China Cracking Group ^_^）

日期：2000年3月22日

这篇教程是我在国外站点看到的，估计很多玩 Windows 2000 的朋友都需要，所以我就把它
贴上来了。
考虑到通篇的 E 文也许会搞得某些朋友一头雾水（借把伞吧，或者买瓶洗发水^_^），于是
我就用我那蹩脚的 E 文和糟糕的中文不自量力地将关键部分 Translate 了（希望你们还能够看
明白……^_^）。

需要声明的是，本人的机器实在太烂了（Pentium 166MMX, 64M EDO, 1.2G Hard Disk...），
不可能安装 Windows 2000，所以我不太清楚某些 Windows 2000 的名词翻译的是否正确。

特别需要指出的是，原文是针对英文版的 Windows 2000 RC3，对于中文版我不能肯定百分百
成功，所以是否使用全凭自愿。如果按照文中的方法操作失败并导致了什么“严重”的后果（能
有什么“严重后果”？大不了重装嘛！有人在安装了无数软件的机器上尝试 Windows 2000 RC3 ？
哇－你是老大！^_^）本人概不负责（丑话说在前头，以免遭人“暗算”^_^）。

This tutorial assumes you have downloaded an evaluation version of Windows 2000
that will expire after a certain number of days. If you would like to change this to
a time-unlimited version, follow the instructions below.

In this tutorial, keep in mind the following things:
在这个教程中，请牢记下面几点：

(1) The method described below only works in NT systems (ie you must be running
Windows NT4 or Windows 2000 already).
下面描述的方法只能工作在 NT 环境下（也就是说你必须已经运行在 Windows NT4 或
Windows 2000 环境下）

(2) You must reinstall to change a time-limited version to a time-unlimited
version.
你必须重新安装 Windows 2000，以便将限时版更改为无时间限制版本。

Now, without further ado:

(1) Find your setupreg.hiv file (it's in your i386 directory) and put it some-
where not write-protected. If you have already burned your Windows 2000 CD, you must
copy the setupreg.hiv file to the hard drive.
找到 setupreg.hiv 文件（在 i386 子目录内）并放到没有写保护的地方。如果你已经
烧录了 Windows 2000 光盘，你必须将 setupreg.hiv 文件复制到硬盘上。

(2) Click on Start, Run. Enter "regedt32" (without the quotes) and click OK.
点击“开始－运行”，输入“regedt32”（不包括引号）并点击“确定”。

(3) Once the registry editor is loaded, make sure you have selected the "HKEY_
LOCAL_MACHINE" key in the "HKEY_LOCAL_MACHINE on Local Machine" window.
当“注册表编辑器”运行后，确定你在“HKEY_LOCAL_MACHINE on Local Machine”窗
口中选择的是“HKEY_LOCAL_MACHINE”分支。

(4) Under the Registry menu, choose Load Hive... Navigate to the location where
your setupreg.hiv file is at and select it, choose Open.
在“注册”菜单，选择“调入 Hive...”，选择你的 setupreg.hiv 文件并“打开”。

(5) You will be presented with a Key Name box. It does not matter what you put
here, as long as you remember it. I recommend something like Setupreg.
你会见到“键名”对话框。在这里输入什么并不重要，你仅仅需要记住你输入的信息。
我推荐你输入“Setupreg”。

(6) Click OK to load it into the registry. After it loaded, navigate to the key Setupreg\ControlSet001\Services\setupdd\ and select the value "No Name".
点击“确定”将之调入。找到“Setupreg\ControlSet001\Services\setupdd\”主键并
选择键值“No Name”。

(7) Double click on this value to open it up for editing. This binary value
corresponds to the 120 day time limit. To remove the time limit, change the A, the 3,
and the 2 to 0's. Click OK.
双击打开编辑该键值。这个二进制键值决定了 120 天限制。要去掉这种限制，你需要
将“A、3、2”改为“0”。点击“确定”。

(8) Navigate back up the tree and select the Setupreg key. Go to the Registry
menu and click Unload Hive. Registry editor will prompt you, click Yes to continue.
倒退回注册表分支树找到“Setupreg”键。在“注册”菜单选择“退出 Hive”。“注
册表编辑器”会提示你，点击“是”继续。

(9) That's it! Once you've unloaded the key, close the registry editor. Make
sure the edited setupreg.hiv file is in your i386 directory before installing and
subsequent installations will be time-unlimited.
OK 啦！当退出该键后，关闭“注册表编辑器”。在你再次安装前，请确定编辑修改过
的 setupreg.hiv 文件在 i386 子目录内，这样重新安装后的 Windows 2000 RC3 将是没有时间
限制的版本。

作者：.........（忘记了，真不好意思）

翻译：Sun Bird [CCG]（就是 China Cracking Group 的 Sun Bird 啦^_^）

日期：2000年3月15日（打倒所有的假冒伪劣产品！质量上乘的 D 版除外！^_^）


虚拟光碟 2000

 标 题:破解实录（五）之 虚拟光碟 2000 (tm) 中文版 V5.1 (7千字)
发信人:xiA Qin
时 间:2000-7-19 15:49:02
详细信息:
破解实录（五）之 虚拟光碟 2000 (tm) 中文版 V5.1

软件名称：虚拟光碟 2000 (tm) 中文版 V5.1 -->(21天试用)
简 介：

作 者：xiA Qin
级 别：入门级
解密日前：2000年7月19日
解密工具：Trw2000 1.22
破解目的：学习NAG窗口的去除的破解。(简单)

说 明：
本文是在我的软件破解记录上整理出来的。只作技术交流。如若有纰漏，请各位大侠多指教！

首先将系统的时间调快一个月。

Ctrl+N进入Trw2000

下指令bpx createwindowex //下中断点

按X键回到桌面运行程序，这时会被Trw2000拦截到。

下指令bc * //清除断点

下指令pmodule //直接跳到程序的领空

按F10来到下面,

015F:00408B1E PUSH BYTE +02
015F:00408B20 LEA ECX,[EBP-58]
015F:00408B23 MOV EAX,[EDX]
015F:00408B25 PUSH EAX
015F:00408B26 CALL `ZEN!??0ZRegApp@@QAE@PAUHKEY__@@H@Z`
015F:00408B2C MOV EAX,[EBX+D0]
015F:00408B32 LEA ECX,[EBP-1C]
015F:00408B35 PUSH ECX
015F:00408B36 MOV BYTE [EBP-04],0A
015F:00408B3A LEA EAX,[EAX+EAX*2]
015F:00408B3D LEA EAX,[EAX+EAX*4]
015F:00408B40 LEA EAX,[EAX+EAX*4]
015F:00408B43 LEA EDI,[EAX+EAX*8]
015F:00408B46 SHL EDI,07
015F:00408B49 CALL `MSVCRT!time`
015F:00408B4F ADD ESP,BYTE +04
015F:00408B52 LEA ECX,[EBP-58]
015F:00408B55 PUSH DWORD 1396
015F:00408B5A CALL `ZEN!?IsValueNameExist@ZRegBase@@QAEHH@Z`
015F:00408B60 CMP EAX,ESI
015F:00408B62 JZ NEAR 00408CF7
015F:00408B68 PUSH DWORD 1396
015F:00408B6D LEA ECX,[EBP-58]
015F:00408B70 CALL `ZEN!?GetDWORD@ZRegBase@@QAEKH@Z`
015F:00408B76 MOV ECX,EAX
015F:00408B78 MOV EAX,[EBP-1C]
015F:00408B7B CMP ECX,EAX
015F:00408B7D JNA 00408BDF
015F:00408B7F CALL `MGR!?dlgUpgrade@CMainFrame@@SAXXZ`
015F:00408B84 MOV EDI,[0041C8B4]
015F:00408B8A LEA ECX,[EBP-58]
015F:00408B8D MOV BYTE [EBP-04],09
015F:00408B91 CALL EDI
015F:00408B93 LEA ECX,[EBP+FFFFFF5C]
015F:00408B99 MOV BYTE [EBP-04],05
015F:00408B9D CALL `MFC42!ord_00000269`
015F:00408BA2 LEA ECX,[EBP-2C]
015F:00408BA5 MOV BYTE [EBP-04],04
015F:00408BA9 CALL EDI
015F:00408BAB LEA ECX,[EBP-14]
015F:00408BAE MOV BYTE [EBP-04],03
015F:00408BB2 CALL `MFC42!ord_00000320`
015F:00408BB7 MOV BYTE [EBP-04],00
015F:00408BBB CALL `MFC42!ord_0000061F`
015F:00408BC0 LEA ECX,[EBP-44]
015F:00408BC3 MOV DWORD [EBP-04],FFFFFFFF
015F:00408BCA CALL EDI
015F:00408BCC XOR EAX,EAX
015F:00408BCE MOV ECX,[EBP-0C]
015F:00408BD1 MOV [FS:00],ECX
015F:00408BD8 POP EDI
015F:00408BD9 POP ESI
015F:00408BDA POP EBX
015F:00408BDB MOV ESP,EBP
015F:00408BDD POP EBP
015F:00408BDE RET
015F:00408BDF LEA EDX,[ECX+EDI]
015F:00408BE2 CMP EAX,EDX
015F:00408BE4 JNA NEAR 00408C6D (NO JUMP) //这里可以跳过下面两个CALL.
015F:00408BEA PUSH DWORD 0042B5E8
015F:00408BEF PUSH DWORD 0042B5E4
015F:00408BF4 PUSH DWORD 0042B5DC
015F:00408BF9 CALL `KERNEL32!WriteProfileStringA`
015F:00408BFF PUSH BYTE -01
015F:00408C01 PUSH BYTE +10
015F:00408C03 PUSH DWORD 1B6D
015F:00408C08 CALL `MFC42!ord_000004AF` //弹出试用过期的对话框。
015F:00408C0D CALL `MGR!?dlgUpgrade@CMainFrame@@SAXXZ` //弹出订购软件的对话框

看看那里可以跳过这里。

上面00408BE4 JNA NEAR 00408C6D 好像可以跳过它耶!!!!

重新下断点bpx 00408BE4

按X键回到桌面运行程序，这时被Trw2000拦截到。

当光标走到00408BE4 JNA NEAR 00408C6D，

打入命令 CODE ON 记下指令码

下指令A 写入汇编代码
将 00408BE4 JNA NEAR 00408C6D
改 00408BE4 JNZ NEAR 00408C6D

又可以进入程序了。

015F:00408C12 MOV EDI,[0041C8B4]
015F:00408C18 LEA ECX,[EBP-58]
015F:00408C1B MOV BYTE [EBP-04],09
015F:00408C1F CALL EDI
015F:00408C21 LEA ECX,[EBP+FFFFFF5C]
015F:00408C27 MOV BYTE [EBP-04],05
015F:00408C2B CALL `MFC42!ord_00000269`
015F:00408C30 MOV BYTE [EBP-04],04
015F:00408C34 LEA ECX,[EBP-2C]
015F:00408C37 CALL EDI
015F:00408C39 LEA ECX,[EBP-14]
015F:00408C3C MOV BYTE [EBP-04],03
015F:00408C40 CALL `MFC42!ord_00000320`
015F:00408C45 MOV BYTE [EBP-04],00
015F:00408C49 CALL `MFC42!ord_0000061F`
015F:00408C4E LEA ECX,[EBP-44]
015F:00408C51 MOV DWORD [EBP-04],FFFFFFFF
..............................

015F:00408D38 8D4DEC LEA ECX,[EBP-14]
015F:00408D3B C645FC03 MOV BYTE [EBP-04],03
015F:00408D3F E8BAF80000 CALL `MFC42!ord_00000320`
015F:00408D44 C745FC00000000 MOV DWORD [EBP-04],00
015F:00408D4B E8E2FA0000 CALL `MFC42!ord_0000061F`
015F:00408D50 6A02 PUSH BYTE +02
015F:00408D52 8D4D90 LEA ECX,[EBP-70]
015F:00408D55 E8A6930000 CALL `MGR!??0MgrRegSet@@QAE@H@Z`
015F:00408D5A 8D4D90 LEA ECX,[EBP-70]
015F:00408D5D 6A02 PUSH BYTE +02
015F:00408D5F 51 PUSH ECX
015F:00408D60 8D4D80 LEA ECX,[EBP-80]
015F:00408D63 C645FC11 MOV BYTE [EBP-04],11
015F:00408D67 E8B4920000 CALL `MGR!??0MgrRegSet_SheetPrefer@@QAE@PAVZRegBase@@H@Z`
015F:00408D6C 6864140000 PUSH DWORD 1464
015F:00408D71 8D4D80 LEA ECX,[EBP-80]
015F:00408D74 C645FC12 MOV BYTE [EBP-04],12
015F:00408D78 FF1574C84100 CALL `ZEN!?GetDWORD@ZRegBase@@QAEKH@Z`
015F:00408D7E 8BF8 MOV EDI,EAX
015F:00408D80 A168BC4200 MOV EAX,[0042BC68]
015F:00408D85 85C0 TEST EAX,EAX
015F:00408D87 744C JZ 00408DD5 //这里可以跳过下面那个CALL
^^^^^^^^
下指令A 写入汇编代码
将00408D87 744C JZ 00408DD5
改00408D87 744C JZ 00408D97
就可以跳过评估版的对话框

015F:00408D89 6AFF PUSH BYTE -01
015F:00408D8B 6A00 PUSH BYTE +00
015F:00408D8D 68C8010000 PUSH DWORD 01C8
015F:00408D92 E871FA0000 CALL `MFC42!ord_000004AF` //弹出软件是评估版的对话框，
015F:00408D97 85FF TEST EDI,EDI 并不影响使用。
015F:00408D99 0F84A8000000 JZ NEAR 00408E47
015F:00408D9F 8B8378010000 MOV EAX,[EBX+0178]
015F:00408DA5 85C0 TEST EAX,EAX
015F:00408DA7 0F849A000000 JZ NEAR 00408E47
015F:00408DAD FF1594C04100 CALL `KERNEL32!GetSystemDefaultLangID`
015F:00408DB3 8B0D68BC4200 MOV ECX,[0042BC68]
015F:00408DB9 25FF030000 AND EAX,03FF
015F:00408DBE 85C9 TEST ECX,ECX
015F:00408DC0 746F JZ 00408E31
015F:00408DC2 663D1100 CMP AX,11
015F:00408DC6 7569 JNZ 00408E31
015F:00408DC8 8B5320 MOV EDX,[EBX+20]
015F:00408DCB 6A08 PUSH BYTE +08
015F:00408DCD 52 PUSH EDX
015F:00408DCE 6800010000 PUSH DWORD 0100
015F:00408DD3 EB67 JMP SHORT 00408E3C

整里一下，用Ultraedt打开MGR.EXE

找到OF 86 83 00 00 00

改成0F 85 83 00 00 00

可以跳过试用过期的对话框，订购软件的对话框进入程序。

但是，会弹出软件是评估版的对话框。我不知道如何用Ultraedt
将00408D87 744C JZ 00408DD5
改00408D87 744C JZ 00408D97
跳过此对话框。或者有其他更好的方法。望各位大侠指点。多谢！！！

标 题:我从台湾那里看到一篇关于虚拟光驱2000的破解方法是，修改SETUP.SYS然后在安装！ (207字)
发信人:八爪鱼
时 间:2000-7-20 9:03:05
详细信息:

我从台湾那里看到一篇关于虚拟光驱2000的破解方法是，修改SETUP.SYS然后再安装，就没有问题了，但是需要你的的虚拟光驱2000文件的大小有4M大的安装程序，我在网上找了许多地方，终于给我找到了，晚上回去上传到主页上去！！


MP3光盘

 标 题:加密MP3光盘破解手记 (1千字)
发信人:驰星周
时 间:2000-8-2 11:33:15
详细信息:
近日市面上出现了一种光牒，
MP3歌曲类的。
在资源管理器里查看只有几个文件，
最大的一个是SETUP.EXE
有近500M之大。
运行之，界面还可以，而且可以点歌.
但它播放时用的却不是我机子上的播放器,
是光盘自带的WINAMP ，有很多漂亮的SKIN
便“心向往之” 想COPY到自己的硬盘上。
但死活找不到文件。

进入WINDOWS98的DOS方式
DIR列目录，没有异常。（找不到）

用软盘带光驱重新引导计算机，在纯DOS方式下
DIR列目录，发现情况。
有一个子目录为 , ,,
用CD ,.,,无法进入
用EDIT 可以列出此目录，仍无法近入......

回到WINDOWS 98里，思量破解之法，TRW2000? UEDIT?
太麻烦。

忽然想到每次在WINDOWS 98里用DOS方式时
总有一个有趣的现象：
如果 你在D盘XXX子目录下运行着一个程序SSS
此时用DOS方式进入D盘
则直接会进入到XXX子目录下

OK，那我就先运行那个该死的SETUP.EXE
然后点一首歌，
此时进入DOS方式（窗口模式）
进入光盘 哇噻..... 全在耶
包扩那个倒霉的WINAMP 都在一个叫
,.,,/,.,,/AAA/AAA的子目录中
此时用COPY命令把SKINS里的好东东全COPY到了我的宝贝硬盘上。

现在想想，真是简单，用老BILL的“系统特性”就可以破解了
比VIRTUAL DRIVE 5.1破起来还顺手。


NBA LIVE 2000

标 题:NBA LIVE 2000
发信人:KOBE
详细信息:

>KOBE 教学档之8
>===========================================================================
> 制作NBA LIVE 2000的硬盘版+去EA LOGO版！crack by kobe
>===========================================================================
>由于我是个地地道道的篮球迷！EA 的NBA系列的我一直
>支持！！！！说起CRACK EA我不太愿意。个中原因，，
>咳。。。都是我的几个同学也是篮球迷，他们也喜欢
>NBA不过他们都用我的光盘！我的当然不能常借，我还要玩呢？^0^
>于是。。。嘻。。哈。。
>“你在我心中是最霉。。。。没一个微笑都让我沉醉。。你的
>笑，你的霉，你发脾气时撅起的嘴。。”
>KOBE最近猛看文章，得之一断点：lockmytask
>SOFTICE的用法不用说了把？？？什么一点都不知道！！
>咳！去补习以下吧！！
>首先将NBA LIVE 2000完全安装！在运行时，若不放光盘，，，
>你。。会看到讨厌的PLEASE INSERT THE。。。shit!
>用SOFTICE追吧！（ctrl+d)
>1。下BPX LOCKMYTASK的断点
>2。F5拦下后按数下F12就GAME OVER了！SO 自己trace看看！我记得是按
> 21下玩完！SO我从15下就开始 trace!
> 按F10 step ...................
> .
> .
> .
> 023F：004BD57B CALL XXXXXXXXXXXX
> .
>
> 023F：004BD583 TEST EAX，EAX
> 023F：004BD585 JNZ XXXXXXXXXXXX
> 。
>很容易知道它是用EAX做为标志来判断跳转与否！而为啥是这呢？而不是前面的
>TEST EAX，EAX前面也有这条指令呀！你。。咳。。我都有室着改过。。在经历了
>N次失败后我。。。。。。不过要改也不能乱改，否则，有protect模式，会出错呦！
>我有失败后，才下code on看指令机器码！
> 023F：004BD57B E820F10C00 CALL xxxxxxxxxxxxx
>下 a 004BD57B..改为mov eax,1 其机器码为b801000000
>改完后。狂按f12 ret可。。出错了。。（出汗）它要读光驱！我用了半小时
>将NBA LIVE 2000目录下的文件一一查看(用hex workshop)。“终于被我发现。。”
>install.dat哈哈！查CD字串，找到后全改为HD。爽！
>==========================================================================
>至此CRACK已经成功！不过EA还有些小的就时启动时的画面太多！
>我又trace了一下发现一些SHOW出画面就是LOGO的时的CALL
> 023F：004BD17A CALL 0054CCE0 ========》是SHOW EA的LOGO
> 将其改为5个NOP就行，为啥是5个呢？。。。我倒。。笨那！5个byte么！
> 023F：004BD17F CALL xxxxxxxx
> 诶。。别忙改！改了就出错了！F8 TRACE进去。
> F10。。。F10。。。。
> 023F：004BCB58 CALL xxxxxxxxxx
> 对了改之！NOP嘛！
> 其它。。的关与略去动画的机制有些复杂，至今还未CRACK出，留给你们大家吧！
>总结：工具：SOFTICE +HEXWORKSHOP
> 步骤：你自己看上面！就是用HEXWORKSHOP的HEX改NBAWIN.EXE
> E820F10C00=》B801000000
> E870040000=》9090909090
> E643BF0100=》9090909090
> 用HEXWORKSHOP的ASCII改INSTALL.DAT
> 所有的CD=》HD
>==========================================================================
>还有问题么？什么？我为什么用TXT格式！我是为大家好嘛！中国的网速！哎！
>欢迎将本文做成HTML档！请不要更改信息！
>===========================================================================
> （c) copyright KOBE 工作室
> http://kobesworld.yeah.net


对付隐藏目录的加密光盘

标 题:利用 File Monitor 对付隐藏目录的加密光盘
发信人:Sun Bird [CCG]
时 间:2000年3月22日
详细信息:

作者：Sun Bird [CCG]（我，Sun Bird 属于破解团体 China Cracking Group ^_^）

日期：2000年3月22日

现在有很多光盘都加了密，直接查看只有几个数百 K 的莫名其妙的文件，运行后要求输入
密码，当密码正确时会调出光盘上的真正文件；或是象“DDR 跳舞碟”运行后自行调用音乐、足
谱……明知道光盘内有上百兆的内容，可就是找不到，真是气死人！>:-(

这些使用隐藏目录方式加密的光盘，记得最早似乎是从一些漫画书类光盘开始的。这些光盘
必须使用“冷雨浏览器”，而且必须输入正确的密码才能观看。

如果以前玩过 DOS 的朋友可能会记得，更改硬盘目录的最后几个字节就可以达到隐藏目的，
而且使用 PC Tools 也看不到。采用这种方式加密并不影响使用，只要知道目录名，可以直接使
用“CD XXX”命令进入加密子目录。本人认为，采用这种方式加密光盘，其原理也类似（个人愚
见，如有错误，恳请高手指点）。同样，对这类光盘也可以直接“CD XXX”进入（但需要在 DOS
7.X 环境下）！

那么，如何才能知道加密的目录名称呢？

其实并不难，只要利用一个小软件“File Monitor”即可！该软件不大，是纯“绿色”免费
软件，可在各大软件下载站点找到。下载的是一个压缩包，将包内文件全部解压至一个目录，自
行建立快捷方式即可。目前最新版本为“File Monitor for Windows NT/9x v4.27”。

下面以某新版“DDR 跳舞碟”（众所周知，旧版的“DDR 跳舞碟”其加密目录为“DDR99\”，
而新版的……）为例，Follow me.....

(1) 运行软件“FileMon”，在“Options”内将“Capture Events”打上勾；

(2) 运行“DDR 跳舞碟”，当选择的舞曲已调入内存后即可以退出“DDR”；

(3) 回到“FileMon”，看到什么了？对！所有的文件调用均被记录下来啦！现在再将“Cap-
ture Events”前面的勾去掉（免得仍旧不断的增加记录），然后来看看记录的都是什么（当然，
你也可以将记录保存，使用文本编辑器慢慢查看）：

………… ……… …………………
………… ……… …………………
Explorer FindOpen E:\DDR99.EXE SUCCESS
Explorer FindClose E:\DDR99.EXE SUCCESS
………… ……… …………………
………… ……… …………………
Ddr99 Open E:\IMAGS\BACK.BMP SUCCESS
Ddr99 Attributes E:\IMAGS\BACK.BMP SUCCESS
………… ……… …………………
………… ……… …………………
Ddr99 FindOpen E:\WAVE\FOOT.WAV NOTFOUND
Ddr99 FindOpen E:\WAVE\TITLE.WAV NOTFOUND
………… ……… …………………
………… ……… …………………
Ddr99 FindOpen E:\MSD\*.MSD SUCCESS
Ddr99 FindNext E:\MSD\*.MSD SUCCESS
………… ……… …………………
………… ……… …………………
Ddr99 Open E:\MUSICTITLE\TRACK_01.BMP SUCCESS
Ddr99 Attributes E:\MUSICTITLE\TRACK_01.BMP SUCCESS
………… ……… …………………
………… ……… …………………
Ddr99 FindOpen E:\BGM\TRACK_01S.WAV NOMORE
Ddr99 FindOpen E:\BGM\TRACK_01S.WAV NOMORE
………… ……… …………………
………… ……… …………………
Ddr99 FindOpen E:\BGM\S.WAV NOMORE
Ddr99 FindOpen E:\BGM\S.WAV NOMORE
………… ……… …………………
………… ……… …………………
Ddr99 Open E:\BGM\TRACK_01.WAV SUCCESS
Ddr99 Seek E:\BGM\TRACK_01.WAV SUCCESS
………… ……… …………………
………… ……… …………………

一切显而易见了，原来新版的“DDR 跳舞碟”其加密子目录为“BGM\”（因为记录的文件
调用非常多，所以我将大部分省略了。）！
好啦，可以将喜欢的曲目拷贝下来后去退碟了?!##?@#$#@%&

对了，“FileMon”当然不仅可以做这点小 Case，利用它你还可以破解软件！

有些软件在运行时会读取某些“暗贴”，利用“FileMon”就可以了解该软件到底调用了哪些
文件，这样可以集中精力对付可疑的文件调用。

好了、好了，收工，休息！


Addiction Pinball

 标 题:一篇有关cd-check的译文，随便看看吧！上网费超支，下个月见，兄弟们！ (6千字)
发信人:1212
时 间:2000-8-27 16:28:11
详细信息:
Static Vengeance CD 保护破解教程---Addiction Pinball

工具:
1.游戏:Addiction Pinball

2.W32Dasm

3.十六进制编辑器

Addiction Pinball 是一个基于win95平台的游戏,所以破解它并不难。首先要作的当然是安装游戏,然后拿掉CD运行一下,看看它说了什么。是不是跳出破框要你放入光盘呢？没问题，让我们解决它。用 W32Dasm 反汇编pinball.exe文件，完成后查找一下“字串数据参考”，你要找 "Insert CD..."，什么？没找到。那只好用“查找”功能找函数"GetDriveTypeA"，这样我们会来到这段代码：

* Referenced by a CALL at Addresses:
|:00401A8E , :004033BC , :00403BD5 ;从不同的地方 Call 以下代码
|
:0043E8F0 83EC44 sub esp, 00000044
:0043E8F3 53 push ebx
:0043E8F4 56 push esi
:0043E8F5 57 push edi
:0043E8F6 55 push ebp
:0043E8F7 BB02000000 mov ebx, 00000002 ; 我们后面要用到这条指令

* Reference To: KERNEL32.GetLogicalDrives, Ord:00F9h ; 检测CD时常用到的例程
|
:0043E8FC FF156C934700 Call dword ptr [0047936C]
:0043E902 8BF8 mov edi, eax
:0043E904 8B74245C mov esi, dword ptr [esp+5C]
:0043E908 C64424113A mov [esp+11], 3A
:0043E90D C64424125C mov [esp+12], 5C
:0043E912 C644241300 mov [esp+13], 00

* Reference To: KERNEL32.GetVolumeInformationA, Ord:014Eh ; 检测CD的卷标名
|
:0043E917 8B2D64934700 mov ebp, dword ptr [00479364]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043E96F(C)
|
:0043E91D B801000000 mov eax, 00000001
:0043E922 8ACB mov cl, bl
:0043E924 D3E0 shl eax, cl
:0043E926 85C7 test edi, eax
:0043E928 7441 je 0043E96B
:0043E92A 8D4361 lea eax, dword ptr [ebx+61]
:0043E92D 88442410 mov byte ptr [esp+10], al
:0043E931 8D442410 lea eax, dword ptr [esp+10]
:0043E935 50 push eax

* Reference To: KERNEL32.GetDriveTypeA, Ord:00DEh ; 我们被带到这里
|
:0043E936 FF1568934700 Call dword ptr [00479368]
:0043E93C 83F805 cmp eax, 00000005 ; 05 是光驱的代码值
:0043E93F 752A jne 0043E96B ; 若不等就跳到CD检测失败的代码处:0043E941 8D442414 lea eax, dword ptr [esp+14]
:0043E945 6A00 push 00000000
:0043E947 8D4C2414 lea ecx, dword ptr [esp+14]
:0043E94B 6A00 push 00000000
:0043E94D 6A00 push 00000000
:0043E94F 6A00 push 00000000
:0043E951 6A00 push 00000000
:0043E953 6A40 push 00000040
:0043E955 50 push eax
:0043E956 51 push ecx
:0043E957 FFD5 call ebp
:0043E959 8D4C2414 lea ecx, dword ptr [esp+14]
:0043E95D 56 push esi
:0043E95E 51 push ecx
:0043E95F E8FCDD0100 call 0045C760
:0043E964 83C408 add esp, 00000008
:0043E967 85C0 test eax, eax
:0043E969 7412 je 0043E97D ; 执行这个跳转继续 CD 的检测

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043E928(C), :0043E93F(C)
|
:0043E96B 43 inc ebx ; CD 循环检测的计数器
:0043E96C 83FB20 cmp ebx, 00000020 ; 最高测试次数为 32 次
:0043E96F 7CAC jl 0043E91D
:0043E971 33C0 xor eax, eax ; EAX 置0 表示CD 检测失败
:0043E973 5D pop ebp
:0043E974 5F pop edi
:0043E975 5E pop esi
:0043E976 5B pop ebx
:0043E977 83C444 add esp, 00000044
:0043E97A C20800 ret 0008 ; 返回

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043E969(C)
|
:0043E97D 8B542458 mov edx, dword ptr [esp+58]
:0043E981 85D2 test edx, edx
:0043E983 7423 je 0043E9A8
:0043E985 8D7C2410 lea edi, dword ptr [esp+10]
:0043E989 B9FFFFFFFF mov ecx, FFFFFFFF
:0043E98E 2BC0 sub eax, eax
:0043E990 F2 repnz
:0043E991 AE scasb
:0043E992 F7D1 not ecx
:0043E994 2BF9 sub edi, ecx
:0043E996 8BC1 mov eax, ecx
:0043E998 C1E902 shr ecx, 02
:0043E99B 8BF7 mov esi, edi
:0043E99D 8BFA mov edi, edx
:0043E99F F3 repz
:0043E9A0 A5 movsd
:0043E9A1 8BC8 mov ecx, eax
:0043E9A3 83E103 and ecx, 00000003
:0043E9A6 F3 repz
:0043E9A7 A4 movsb

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043E983(C)
| ; 我们最终想要到达的地方!
:0043E9A8 B801000000 mov eax, 00000001 ; 设置CD 检测通过的标记值
:0043E9AD 5D pop ebp
:0043E9AE 5F pop edi
:0043E9AF 5E pop esi
:0043E9B0 5B pop ebx
:0043E9B1 83C444 add esp, 00000044
:0043E9B4 C20800 ret 0008 ; 返回

好了，从以上 CD 检测代码的分析，你也能看出我们需要到达 43E9A8 才能在 EAX 置 1 以通过 CD检测。那我们该怎么办好呢？这一次我决定找一处代码置入一个jump指令以直接到达43E9A8。这样程序就会直接跳到"found the CD" 处的代码，并且不会执行CD的检测。向上看看，你会发现43E8F7的指令"mov ebx, 00000002"这是一个很好的插入点，因为它的字节数刚好和一个长跳转相等。那就来吧，将"mov ebx, 00000002"换成"jmp 43E9A8",用十六进制编辑器作如下修改：

Edit pinball.exe at offset 253,175
==================================
Search for: BB 02 00 00 00
Change to : E9 AC 00 00 00

ok,任务完成！

Static Vengeance


Warlords 3

 标 题:再贴一篇cd-chcek破解译文 (4千字)
发信人:1212
时 间:2000-8-27 22:41:36
详细信息:

再贴一篇cd-chcek破解译文，我自己译的，文章来源不详，若觉得还可以，给点鼓励，我会继续努力。

这次的目标是：
Warlords 3 - Darklords Rising
工具: SICE, W32Dasm

保护：CD-checks 加filesize check（文件长度检测）

破解参考:
* Reference To: KERNEL32.GetDriveTypeA, Ord:00CEh
|
:00445853 FF1540F85900 Call dword ptr [0059F840]
:00445859 83F805 cmp eax, 00000005 <-- 你在这里，这是一个检测光盘类型的指令
:0044585C 757A jne 004458D8
:0044585E 8D45E4 lea eax, dword ptr [ebp-1C]
:00445861 8D4D94 lea ecx, dword ptr [ebp-6C]
:00445864 50 push eax

* Possible StringData Ref from Data Obj ->"%sW3.DAT" <--在光盘上看是否有这个文件
|
|
:00445865 68603E4F00 push 004F3E60 <-- 压入文件指针
:0044586A 51 push ecx
:0044586B FFD7 call edi <-- call getdrivetypea
:0044586D 83C40C add esp, 0000000C
:00445870 8D4D94 lea ecx, dword ptr [ebp-6C]
:00445873 6A00 push 00000000

* Possible Reference to String Resource ID=00001: "Error!"
|
:00445875 6A01 push 00000001
:00445877 51 push ecx
:00445878 8D8D84FEFFFF lea ecx, dword ptr [ebp+FFFFFE84]
:0044587E E8FD330900 call 004D8C80 <-- 检查文件 (如果eax == 1 ->检测通过)
:00445883 85C0 test eax, eax <-- 看是否检测到文件
:00445885 7451 je 004458D8 <-- 如果没有就跳转
:00445887 8D8D84FEFFFF lea ecx, dword ptr [ebp+FFFFFE84]
:0044588D E8DE350900 call 004D8E70
:00445892 8D45E4 lea eax, dword ptr [ebp-1C]
:00445895 8D4D94 lea ecx, dword ptr [ebp-6C]
:00445898 50 push eax

* Possible StringData Ref from Data Obj ->"%sDRAKDUM\DRAKDUM0.SMK" <-- 也要检查是否有这文件
|
:00445899 68483E4F00 push 004F3E48 <-- 压入文件指针
:0044589E 51 push ecx
:0044589F FFD7 call edi <-- call getdrivetypea
:004458A1 83C40C add esp, 0000000C
:004458A4 8D4D94 lea ecx, dword ptr [ebp-6C]
:004458A7 6A00 push 00000000

* Possible Reference to String Resource ID=00001: "Error!"
|
:004458A9 6A01 push 00000001
:004458AB 51 push ecx
:004458AC 8D8D84FEFFFF lea ecx, dword ptr [ebp+FFFFFE84]
:004458B2 E8C9330900 call 004D8C80 <-- 检测 (若eax == 1 ->检测通过)
:004458B7 85C0 test eax, eax
:004458B9 741D je 004458D8
:004458BB 8D8D84FEFFFF lea ecx, dword ptr [ebp+FFFFFE84]
:004458C1 E89A360900 call 004D8F60 <-- 跟入!!

Ok.. 这就是那两个检测.. 让我们看最后一个检测, 跟入那个 call

:004D8F60 56 push esi
:004D8F61 57 push edi
:004D8F62 8BF9 mov edi, ecx
:004D8F64 33F6 xor esi, esi
:004D8F66 39B708010000 cmp dword ptr [edi+00000108], esi
:004D8F6C 7415 je 004D8F83
:004D8F6E 56 push esi
:004D8F6F 8B870C010000 mov eax, dword ptr [edi+0000010C]
:004D8F75 50 push eax

* Reference To: KERNEL32.GetFileSize, Ord:00DAh <-- 获取 DRAKDUM0.SMK文件的长度

GetFileSize是最后的检查了，它决定了DRAKDUM0.SMK的长度而且如果没有发现文件,eax将被赋值0，文件如果找到，EAX就是2B465C(文件长度的十六进制)！你自己看一看吧,2836060 = 2B465C。
唉..我们经历了艰难而漫长的道路..现在我们知道做那些修补了.
:0044587E E8FD330900 - call 004D8C80 改成 -> B801000000 - mov eax, 00000001
:004458B2 E8C9330900 - call 004D8C80 改成 -> B801000000 - mov eax, 00000001
:004458C1 E89A360900 - call 004D8F60 改成 -> B85C462B00 - mov eax, 002B465C
ok,任务完成，收工。

Static Vengeance


Kryptel 3.74

 标 题:高手帮帮我！ Kryptel 3.74(文件夹和文件加密工具)好心的高手帮帮我，我急用！ (337字)
发信人:1212
时 间:2000-8-11 17:01:30
详细信息:
详见：http://www.newhua.com.cn/Kryptel.htm

软件简介：
  集成在 Win9x 中的加密工具，您只要在 Windows 资源管理器中点击右键即可轻松加密单个或多个文件夹和文件。

本地下载：
http://www.newhua.com.cn/down/kryptel.exe
http://newhua.21f.net/down/kryptel.exe
国外下载：
http://inv.co.nz/download/kryptel.exe
好心的高手帮帮我，我急用！

标 题:初学者(25) (5千字)
发信人:liutong
时 间:2000-8-13 20:20:54
详细信息:

开始用S-ICE追,发现了下面的程序:
* Reference To: MSVCRT._strlwr, Ord:01BEh
|
:00401401 FF157CB14100 Call dword ptr [0041B17C]
:00401407 59 pop ecx
:00401408 6818B84100 push 0041B818
:0040140D FF3510B84100 push dword ptr [0041B810]
:00401413 6890B74100 push 0041B790
:00401418 FF358CB74100 push dword ptr [0041B78C]
:0040141E 6878B74100 push 0041B778
:00401423 FF3570B74100 push dword ptr [0041B770]
:00401429 68F0B64100 push 0041B6F0
:0040142E FF35E8B64100 push dword ptr [0041B6E8]
:00401434 E8A4080100 call 00411CDD
:00401439 83C420 add esp, 00000020
:0040143C FF7580 push [ebp-80]
:0040143F FF7584 push [ebp-7C]
:00401442 8D851CFFFFFF lea eax, dword ptr [ebp+FFFFFF1C]
:00401448 50 push eax
:00401449 E8D4080100 call 00411D22
:0040144E 83C40C add esp, 0000000C
:00401451 84C0 test al, al
:00401453 740C je 00401461
:00401455 C7058C12420002000000 mov dword ptr [0042128C], 00000002<----unlimited版本
:0040145F EB5B jmp 004014BC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401453(C)
|
:00401461 6868B64100 push 0041B668
:00401466 FF3560B64100 push dword ptr [0041B660]
:0040146C 68E0B54100 push 0041B5E0
:00401471 FF35DCB54100 push dword ptr [0041B5DC]
:00401477 68C8B54100 push 0041B5C8
:0040147C FF35C0B54100 push dword ptr [0041B5C0]
:00401482 6840B54100 push 0041B540
:00401487 FF3538B54100 push dword ptr [0041B538]
:0040148D E84B080100 call 00411CDD
:00401492 83C420 add esp, 00000020
:00401495 FF7580 push [ebp-80]
:00401498 FF7584 push [ebp-7C]
:0040149B 8D851CFFFFFF lea eax, dword ptr [ebp+FFFFFF1C]
:004014A1 50 push eax
:004014A2 E87B080100 call 00411D22
:004014A7 83C40C add esp, 0000000C
:004014AA 84C0 test al, al
:004014AC 0F84D3010000 je 00401685
:004014B2 C7058C12420001000000 mov dword ptr [0042128C], 00000001<---personal版本

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040145F(U)
|
:004014BC 8365FC00 and dword ptr [ebp-04], 00000000
:004014C0 C78550FDFFFF02000080 mov dword ptr [ebp+FFFFFD50], 80000002
:004014CA 83A554FDFFFF00 and dword ptr [ebp+FFFFFD54], 00000000
:004014D1 C645FC01 mov [ebp-04], 01
:004014D5 6A02 push 00000002
:004014D7 6818BF4100 push 0041BF18
:004014DC 8D8D50FDFFFF lea ecx, dword ptr [ebp+FFFFFD50]
:004014E2 E8B4DE0000 call 0040F39B
:004014E7 8BC6 mov eax, esi
:004014E9 85C0 test eax, eax
:004014EB 741E je 0040150B
:004014ED 56 push esi
:004014EE E894E90000 call 0040FE87
:004014F3 59 pop ecx
:004014F4 83C003 add eax, 00000003
:004014F7 24FC and al, FC
:004014F9 E862440100 call 00415960
:004014FE 8BC4 mov eax, esp
:00401500 50 push eax
:00401501 56 push esi
:00401502 E895E90000 call 0040FE9C
:00401507 59 pop ecx
:00401508 59 pop ecx
:00401509 EB02 jmp 0040150D
但由于计算复杂,只好用W32Dasm了

上面版本用0042128C地址做标志,因此搜索0042128C,发现
=================================================================
* Referenced by a CALL at Address:
|:00402525
|
:00401148 A18C124200 mov eax, dword ptr [0042128C]
:0040114D 83F801 cmp eax, 00000001
:00401150 7405 je 00401157
:00401152 83F802 cmp eax, 00000002
:00401155 7520 jne 00401177
=================================================================
上面的这段决定软件启动时是否出注册提示画面
=================================================================
* Referenced by a CALL at Addresses:
|:00401637 , :00403CB4 , :004051BA , :00405461
|
:004017C4 55 push ebp
:004017C5 8BEC mov ebp, esp
:004017C7 83EC50 sub esp, 00000050
:004017CA A18C124200 mov eax, dword ptr [0042128C]
:004017CF 56 push esi
:004017D0 83F801 cmp eax, 00000001
:004017D3 7434 je 00401809
:004017D5 83F802 cmp eax, 00000002
:004017D8 742F je 00401809
:004017DA 8D45B0 lea eax, dword ptr [ebp-50]
:004017DD 6A50 push 00000050
:004017DF 50 push eax
=================================================================
上面的这段决定软件的版本(在软件窗口边框上显示)
好吧,我输入的注册码计算后,0042128C的标志肯定是"0"(否则我可以去买体育彩票了)
那麽该知道怎麽改了吧

把cmp eax, 00000001和cmp eax, 00000002中的01(或02)改为"0",一切OK

标 题:初学者(25)补丁 (1千字)
发信人:liutong
时 间:2000-8-13 23:37:42
详细信息:

抱歉,刚才的破解有一点遗漏(刚才想试试软件功能,"New"时出错了)
赶快又用W32Dasm打开brw.exe
依然搜索"0042128C",找到了
:004043CA E881150100 Call 00415950
:004043CF 51 push ecx
:004043D0 81EC80000000 sub esp, 00000080
:004043D6 53 push ebx
:004043D7 56 push esi
:004043D8 57 push edi
:004043D9 8965F0 mov dword ptr [ebp-10], esp
:004043DC 33F6 xor esi, esi
:004043DE 8975D4 mov dword ptr [ebp-2C], esi
:004043E1 8975D8 mov dword ptr [ebp-28], esi
:004043E4 39358C124200 cmp dword ptr [0042128C], esi<---与0比较
:004043EA 752B jne 00404417
:004043EC 803D9404420000 cmp byte ptr [00420494], 00
:004043F3 7422 je 00404417
:004043F5 FF3558124200 push dword ptr [00421258]
:004043FB FF35FC0D4200 push dword ptr [00420DFC]

改吧,将jne 00404417改为jmp 00404417 (机器码EB2B)

:00403F50 E8FB190100 Call 00415950
:00403F55 51 push ecx
:00403F56 81ECA0000000 sub esp, 000000A0
:00403F5C 53 push ebx
:00403F5D 56 push esi
:00403F5E 57 push edi
:00403F5F 8965F0 mov dword ptr [ebp-10], esp
:00403F62 C745C820000000 mov [ebp-38], 00000020
:00403F69 C745CC05000000 mov [ebp-34], 00000005
:00403F70 C745D001000000 mov [ebp-30], 00000001
:00403F77 33F6 xor esi, esi
:00403F79 39358C124200 cmp dword ptr [0042128C], esi
:00403F7F 752B jne 00403FAC
:00403F81 803D9404420000 cmp byte ptr [00420494], 00
:00403F88 7422 je 00403FAC
:00403F8A FF3558124200 push dword ptr [00421258]
:00403F90 FF35FC0D4200 push dword ptr [00420DFC]

将jne 00403FAC改为jmp 00403FAC (机器码EB2B)

标 题:解得还不完全，见内。 (2千字)
发信人:小牧童
时 间:2000-8-14 0:24:02
详细信息:

将时间调至2001年，用右键看看。
右键操作在Klx.dll文件中，用拦时间函数的方法拦不到getsystemtime和getlocaltime 甚至用bpint 21 if ah==2都拦不到，真不知它取时间是用的什么方法。后来我拦BPX messageboxa进行分析，找到了一条非常方便的方法，由于它显示出错信息的同时显示帮助文件，我下了BPX winhelpa
非常成功的找到了关键点。以下以加密文件为例，其它几个功能找法相同
bpx winhelpa
右键执行加密
拦到后按12运行完后返回SOFTICE
将光标移到调用的CALL处按F9设断
重新运行加密，在CALL处按F8再按F10就会来到下面。

:75FC3047 E853860000 call 75FCB69F
:75FC304C A2E895FD75 mov byte ptr [75FD95E8], al
:75FC3051 A15898FD75 mov eax, dword ptr [75FD9858]
:75FC3056 59 pop ecx
:75FC3057 83F801 cmp eax,00000001 //这里进行比较
:75FC305A 59 pop ecx
:75FC305B 0F84A8000000 je 75FC3109 //改为JMP OK
:75FC3061 83F802 cmp eax, 00000002
:75FC3064 0F849F000000 je 75FC3109
:75FC306A 381D9490FD75 cmp byte ptr [75FD9094], bl
:75FC3070 7451 je 75FC30C3
:75FC3072 BE909AFD75 mov esi, 75FD9A90
:75FC3077 8BC6 mov eax, esi
:75FC3079 85C0 test eax, eax
:75FC307B 741E je 75FC309B
:75FC307D 56 push esi
:75FC307E E80F5F0000 call 75FC8F92
:75FC3083 83C003 add eax, 00000003
:75FC3086 59 pop ecx
:75FC3087 24FC and al, FC
:75FC3089 E832CE0000 call 75FCFEC0
:75FC308E 8BC4 mov eax, esp
:75FC3090 50 push eax
:75FC3091 56 push esi
:75FC3092 E8515F0000 call 75FC8FE8
:75FC3097 59 pop ecx
:75FC3098 59 pop ecx
:75FC3099 EB02 jmp 75FC309D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:75FC307B(C)
|
:75FC309B 33C0 xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:75FC3099(U)
|
:75FC309D 68424A0000 push 00004A42
:75FC30A2 6A01 push 00000001
:75FC30A4 50 push eax
:75FC30A5 53 push ebx

* Reference To: USER32.WinHelpA, Ord:02A8h
|
:75FC30A6 FF159051FD75 Call dword ptr [75FD5190]
:75FC30AC 8D45EC lea eax, dword ptr [ebp-14]
:75FC30AF 687869FD75 push 75FD6978

修改Klx.dll方法：
83 f8 01 59 0f 84 a8 00 00 00 83 f8 02
83 f8 01 e9 a9 00 00 -- --------------

83 f8 01 74 53 83 f8 02 74 4e
-------- eb -----------------

83 f8 01 0f 84 a8 00 00 00 83 f8 02
-------- e9 a9 00 -----------------

3b c7 74 52 83 f8 02
----- eb -----------

其实它的主要功能还是在鼠标右键上来得方便。


WallPaper Changer 2.5

标 题:WallPaper Changer 2.5 for Windows 98/NT
发信人:八爪鱼
时 间:2000-7-4 21:03:10
详细信息:

八爪鱼
上海番外地工作室
***********************

作者主页：http://www.hu.zj.cninfo.net/~wangyin/wangyin.html
破解工具：Soft-ICE 4.05 for Windows 95/98、File Infor 2.3、UnAspack 1.0.9.0、Hiew
难 度：易
说 明：全功能的“桌面布景”管理程序、包括桌面、图标、光标、声音、背景配色、开关机画面、Web背景等，能更改、更换各项配置，然后将此存成另一布景、相当好用，值得一提的是程序提供背景配色的编辑、且内建多种的模组可套用、甚至自行更改，而Web背景图、更是一般相似软件中少见的功能，总之相当好用，喜欢改、改、改的网友值得下载。

破解过程：

1.先启动Soft-ICE，再启动WPC，从“关于”中看到了“注册信息”，有两个内容： 姓名: FanWaiDi[CCG] (发现这个用户名不是自己添的而是从系统安装信息中调入的)
注册号码: 78787878 (随便填，我习惯填78787878)

2.打Ctrl+D，进入S-ICE，设断点bpx hmemcpy，打F5返回WPC，点“OK”，则被S-ICE拦截。

3.打bc *，清除断点。再打F12键12下后，再按F10来到：

...
XXXX:0046F856 MOV EDX,[EBP-08]
XXXX:0046F859 POP EAX
XXXX:0046F85A CALL 00403058
XXXX:0046F85F JNZ 0046F88C（这里一跳跃就会出现错误的窗口，那么上面的那个CALL肯定有问题，进去看看！）
XXXX:0046F861 MOV EDX,00000001
...

4、在0046F85A处按F8进入，
...
XXXX:00403D5B MOV ESI，EAX
XXXX:00403D5D MOV EDI，EDX
XXXX:00403D5F CMP EAX，EDX（在这里就可以找到注册码了！）
XXXX:00403D61 JZ 00403DF6
XXXX:00403D67 TEST ESI，ESI
...
在00403D5F处下D EAX就可以看到我的注册码了：WPC25-003086！！
D EDX就是我原来输入的78787878

5、至此我的注册码已经破解出来的，但是问题就来了，如果别人的机器不是使用我这个名字来安装win9x的话就不能使用这个注册码，写注册机太繁了，需要花费我很多时间，时间有限就作个破解吧！

6、还好刚才我记下了0046F85A处的机内码，具体如下，
XXXX:0046F85A E9F044F0FF CALL 00403058
XXXX:0046F85F 752B JNZ 0046F88C
红字的地方就是机内码，只要将752B修改为742B就可以。

7、启动hiew，打开WPC目录的wpcsetup.exe文件，然后按F4切换模式，切换为HEX模式，然后按F7开始查找，在HEX输入刚才的机内码E9F044F0FF752B，开始查找，但是没有找到！！

8、出来看看这个文件的大小，发现有点问题，找来文件信息察看器FILE INFO，最后查到这个文件使用了ASPACK1.06b加壳工具，拿出专门脱ASPACK壳的工具UNASPACK，将wpcsetup.exe的壳脱掉了，重复第6步工作后找到了修改的地方，将752B修改成742B任务就完成了！！！！

9、另外补充一点，就是如果你对汇编比较熟悉的话，你可以在HIEW找到修改的地方后按F4再一次切换查看模式，将它的查看模式修改为DECODE模式，就可以看到汇编的模式了！！！！


看雪学苑

 标 题:翻译(1) (6千字)
发信人:liutong
时 间:2000-7-22 15:12:35
详细信息:
膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊?
膊 ____ __ __ 膊
膊 / _/_ _ __ _ ___ ____/ /____ _/ / 膊
膊 _/ // ' \/ ' \/ _ \/ __/ __/ _ `/ / 膊
膊 /___/_/_/_/_/_/_/\___/_/ \__/\_,_/_/ 膊
膊 ____ __ __ 膊
膊 / __ \___ ___ _______ ___ ___/ /__ ____ / /____膊
膊 / /_/ / -_|_-</ __/ -_) _ \/ _ / _ `/ _ \/ __(_-<膊
膊/_____/\__/___/\__/\__/_//_/\_,_/\_,_/_//_/\__/___/膊
膊 膊
膊 Web: http://www.ImmortalDescendants.com 膊
膊 Author: UmE 膊
膊 Date: 03/13/00 膊
膊 Topic: Re-enabling functions - Cool Edit 2000 膊
膊 Level: Beginner/Intermediate 膊
膊 膊
膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊?

介绍:现在有许多软件是以演示版(有一些功能被禁止)提供给用户的.多数
情况下,被禁止的功能按钮是灰色的.一般来说,我们能够利用EnableMenuItem
这个API函数激活它们,但是它们被激活后不能正常工作.在这篇文章中,我将
介绍如何使演示版的软件正常工作.

所用工具:SoftIce 3.24 或更高版本

试验软件:Cool Edit 2000, cool2000.exe, 3420160字节

让我们开始吧!!!

步骤1:
当你运行程序时,出现一对话框,提示你想激活那个功能.那意思就是说,你不能
使用软件的所用功能,但同时也意味着这个程序包含所有被禁止功能的程序,
它是在启动时,根据你的选择进行切换的.我们的工作就是使所有的功能都能使用.
如果我们激活选项3和4,软件就提供Filters,Noise redction,Amplify,Envelope...
但除了Save功能.我将教你如何在它被禁止的时候激活它,激活其他功能的过程与
此相同.
首先,打开一个文件,你能看到在File菜单中的Save和Save As项是灰色的.
我们想激活它,因此进入SoftIce(按CTRL+D)并设断点(bpx enablemenuitem).
EnableMenuItem函数的结构如下:

BOOL EnableMenuItem (
HMENU hMenu // handle to menu resource
UINT uIDEnableItem // menu item to enable, disable or gray
UINT uEnable // menu item flags
);

在ASM中调用的格式是:

PUSH uEnable
PUSH uIDEnableItem
PUSH hMenu
CALL [KERNEL32!EnableMenuItem]

对于我们来说,重要的是找到那个激活菜单项的标志
我们知道:

uEnable=0 菜单项被激活(the item is enabled)

好吧,现在退出SoftIce,点击File菜单,马上你又回到SoftIce.按F11键返回到:

:00411580 6A01 push 00000001 <-uEnable flag
:00411582 6875010000 push 00000175
:00411587 56 push esi
:00411588 FFD3 call ebx <- Call EnableMenuItem

这不是我们要找的,因为它传递了一个常数给函数
如果你按Ctrl+D,程序将继续执行EnableMenuItem功能enable或disable各菜单项
在这个过程中,请注意EBP寄存器保存的是uIDEnableItem,直到你看到EBP=047E.
这个ID正好是Save As菜单项(你可以用W32Dasm反汇编cool2000.exe并找到此ID,
在列表开始部分的菜单信息区)
当你看到EBP=047E时按F11后程序如下

:004128A5 668B440C1C mov ax, word ptr [esp+ecx+1C]
:004128AA 50 push eax
:004128AB 55 push ebp
:004128AC 56 push esi
:004128AD FF15D0535600 Call dword ptr [005653D0] <-EnableMenuItem

eax(uEnable标志）的值取决于ESP和ECX.我们只要将"mov ax,word ptr[esp+ecx+1c]"
改为"mov ax,0000"(注意在指令后面加nop,保证与前面指令字节数相同),这样程序将
把0传递给EnableMenuItem函数.按上面的方法修改后,重新启动程序,你将看到Save As
菜单项已经enable了.但是当你按Save As时,程序自动关闭了.到底发生了什麽事情?
跟我来你会看到!!!

步骤2:现在我们已经激活了所有菜单项,我们希望它们能工作.
正如你知道的:当点击菜单项时,程序将发出一个WM_COMMAND给系统,系统将根据相关
的ID处理它.
打开SoftIce并输入"hwnd".这条命令将返回所有在桌面上已开窗口的handle.
你可看到下列内容:

Window Handle hQueue Sz QOwner Class Name Window Procedure

我们感兴趣的是window如何处理Cool Edit的主窗口.我们想从WM_COMMAND产生的地方
观察到底发生了什麽.注意下面:

Window Handle hQueue Sz QOwner Class Name Window Procedure

0414(1) 1087 32 COOL2000 COOL2000SS 32CF:0000051E

现在在message WM_COMMAND(it needs also the handel of the window)处设断点

bmsg 0414 WM_COMMAND

从SoftIce中退出并点击Save As菜单项......你将回到SoftIce.
记住我们要找的是处理此ID号的一小段代码:我们能在source code中找到,因为
编程者不可能修改系统dll使其适应他的程序!

设置下面的断点:bpx k32thk1632prolog(想了解为什麽?在www.ImmortalDescendants.com
站点可找到相关资料),按Ctrl+D退出SoftIce,但马上又回来了,按F11键,到:

CALL [KERNEL32!K32Thk1632Prolog]
CALL [.....] <-This is very important!!
CALL [KERNEL32!K32Thk1632Epilog]

按F8进入[KERNEL32!K32Thk1632Prolog]后面的call,直到你找到cool2000的代码,
现在注意各个寄存器的值,继续跟踪直到:

:004C896D 8B8C24EC010000 mov ecx, dword ptr [esp+000001EC]
:004C8974 8B9424E8010000 mov edx, dword ptr [esp+000001E8]
:004C897B 51 push ecx
:004C897C 52 push edx <- 1
:004C897D 57 push edi <- 2
:004C897E 50 push eax <- 3
:004C897F FF15C4545600 Call dword ptr [005654C4] <- 4

1-将edx压入堆栈(edx=111).这是WM_COMMAND信息的HEX码
2-将edi压入堆栈(edi=047e).这是Save As菜单项的ID
3-将eax压入堆栈(eax=0414).这是cool2000的window handle
4-调用SendMessageA函数

这个功能将WM_COMMAND信息发送到系统的信息队列.下一步这个信息将被 DefWindowProcA函数
处理.按F8进入SendMessageA函数直到你再次来到cool2000的代码,在此我们将找到关键点:

:00422900 55 push ebp
:00422901 8BEC mov ebp, esp
:00422903 83E4F8 and esp, FFFFFFF8
:00422906 B854140000 mov eax, 00001454
:0042290B E890FE1100 call 005427A0
:00422910 A124AE5800 mov eax, dword ptr [0058AE24]
:00422915 53 push ebx
:00422916 56 push esi

注意EDI=047E,继续跟踪你将发现程序如何使用EDI
从此处我们的ID将与各种常数比较以确定我们选择的ID.
跟踪若干行后,发现:

:0042C389 81FF7E040000 cmp edi, 0000047E <-Yeah!! Our ID!!
:0042C38F 0F8738070000 ja 0042CACD
:0042C395 0F840A080000 je 0042CBA5 <-Jump to 0042CBA5

At 0042CBA5 we find:

:0042CBA5 6A01 push 00000001
:0042CBA7 E8C4AB0600 call 00497770
:0042CBAC 83C404 add esp, 00000004
:0042CBAF 85C0 test eax, eax
:0042CBB1 7511 jne 0042CBC4

在0042CBA7的call用于选择被选的ID是处理还是跳过.
如果eax=0,ID被跳过;eax=1,ID被处理.
因此将jne改为jmp,Save As菜单项将恢复功能

希望你能喜欢此教程!

Bye!

UmE

Contact me at: ume15@hotmail.com


超级解霸 2000

 标 题:去解霸2000与psp6.02的时间限制 (2千字)
发信人:电神魔鬼
时 间:2000-8-5 22:08:21
详细信息:
*豪杰超级解霸 2000 最新补丁破解

setup.exe-->6,700,544 bytes (选自数码时代)

此补丁修补超级解霸2000的一些问题和增加多项功能，包含了新的卸载程序、新的可视音乐插件——超级跳舞机、网络视频MPC播放器、快速Http下载器、支持在Internet中直接播放MPC、MP3和MPG文件、与IE进一步融合在一起。同时，修正了在多数笔记本中（如东芝、宏基等等品牌）播放VCD出现非法操作的问题、Direct方式播放CD、WIN97中播放MP3无法测试文件类型等等问题。

我是在《豪杰超级解霸》（吉林.03测试版）基础上升级的

梁先生的比较核心没变,很好解,我只把结果贴上好了,有兴趣的话自己试试吧:)

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup

次数RunTime(二进制值)------->RunTime值为0的话退出

STHSVCD.exe ->747,520 bytes

017f:00415bc2 jnz 00415be6 ->jmp 00415be6

查找:85C07522E817B2FFFF
改为:85C0eb22E817B2FFFF

Mmxado.exe ->380,928 bytes

017f:0040e867 jnz 0040e89e ->jmp 0040e89e

查找:cc35E8B2E7FFFF(跟到的是7535E8B2E7FFFF why? )
改为:eb35E8B2E7FFFF

时间InstallTime(二进制值)

STHSVCD.exe

017f:00415b97 jbe 00415bbb->jmp 00415bbb

查找:3BCA7622
改为:3BCAeb22

Mmxado.exe

017f:0040e85a ja 0040e869->nop

查找:89442410770D
改为:894424109090

没有经过安全测试,有什么副作用未知,自己看着办吧:(

完活:)

*Paint Shop Pro 6.02无限期使用

psp602ev.exe-------->14,929,800 bytes(选自数码时代)

psp.exe

hkey_local_machine\software\classes\clsid\
{ADBB2D80-5DFD-11D2-A00C-00104B65AAF5}\ms
ipid6au=dword:x(x值需要小于30,超过30的话过期)

017f:00771cbd add esp,18
017f:00771cc0 cmp esi,1e(比较是不是30,小于等于跳转)
017f:00771cc3 jle 00771d0c ->jmp 00771d0c
.
.
.

017f:00771d6e add esp,04
017f:00771d71 cmp esi,eax
017f:00771d73 jle 00771e03 ->sorry,不记得了
.
.
.
017f:00771eb7 add esp,04
017f:00771eba cmp ecx,eax
017f:00771ebc jle 00771edc ->jmp 00771edc

psp.exe

查找:83 FE 1E 7E 47
改为:83 FE 1E eb 47

查找:3B F0 0F 8E 8A 00 00 00
改为:3B F0 e9 8b 00 00 00 90

查找:3B C8 7E 1E
改为:3B C8 eb 1E

anim.exe

hkey_local_machine\software\classes\clsid
{64c53720-b69e-11d2-8728-00104b141a76}\ms
ipid6au=dword:x(x值需要小于30,超过30的话过期)

017f:005085f5 add esp,18
017f:005085f8 cmp esi,1e(比较是不是30,小于等于跳转)
017f:005085fb jle 00508643 ->jmp 00508643
.
.
.
017f:005086a9 add esp,04
017f:005086ac cmp esi,eax
017f:005086ae jle 00508706 ->jmp 00508706

anim.exe

查找:83 fe 1e 7e 46
改为:83 fe 1e eb 46

查找:3b f0 7e 56
改为:3b f0 eb 56

无任何副作用,只不过进去时需点一下start,最新psp7.0 beta3华军有下载

说明:两个软件大同小异,所以写一起了,由于时间限制的软件比较好解,我偷懒不写流程了,比较核心都写在上面了,改的时候注意文件要对应,不同的话也找不到.

cracked by 电神魔鬼
thanks for your supports


神光3+2

标 题:有谁能破解http://go.163.com/~zhgzh/download/sg32.rar (空)
发信人:conanxu
时 间:2000-8-17 18:19:47
详细信息:此乃神光3+2 1.0版文件大小10M股票软件!!!!!,谢谢

标 题:About 神光3+2 1.0股票软件! for conanxu (1千字)
发信人:guest
时 间:2000-8-19 0:15:12
详细信息:

我也没破完全，不过给你一个我的追踪经验∶

0. 使用原版的sg.exe 不要用您修改过的sg.exe(我是用win98来追的)
1. 将CALL deviceiocontrol 後，的eax改成00000000
这样就跟您的修改一样了，可是我的这种改法，後
续上会有不同的结果
2. 设以下的中断你试试看:
bpx 415e09
bpx 405040 do "r ip 5133;g 406cea"
bpx 406cea do "r ip 6cfb"
此法设下去，每次中断出来後，就按下ctrl+d跳出sice，让
上述的断点自动修改
3. 选择"神光生命线"<--目前我只追了这个!
这样竟然就可以显示出支撑点，压力点，不过可以看到，数值
太大太大了，有几百亿，所以还是会溢位。

不晓得你有没有发现，进入sg.exe後，会自动生成temp.dat(必须
在未结束sg.exe时，此档才会存在)
我猜这个东西非常的重要，程式可能有将keypro内的资料写到temp.dat内
要运算的时候在去此temp.dat找公式来算，
所以才会造成溢位!

不过这个程式有个极为弱的弱点∶
如果你有原版keypro，用比对法，就可以抓到哪里的数值不一样!!!
如果只是jz或jnz的差异，那改一改就可解决。如果真如我说，会去读
temp.dat，那完了....

对了，此keypro是哪牌的？我有办法修改hasp95.dll来达到模拟HASP软狗喔!
还有，虽然我在台湾，但是我有能力可将将资料档转换，也就是我可以
将台湾的股市转成中国的股市资料;我对此软体也有兴趣，若是您
破解了，能否写封信来教导一下？

from∶ 彼得，台湾
(我就是彼得的家的彼得home.pchome.com.tw/cool/peters)

最後，你可以用以下的api来抓:
bpx deviceiocontrol <==可以替代bpio -h 378
bpx beginpaint
bpx getdevicecaps

标 题:关于加密狗的补充 (149字)
发信人:guest
时 间:2000-8-19 13:28:55
详细信息:

ROCKEY9X.VXD 是坚石加密锁的驱动程序，
其在读狗的时候加入噪声，所以拦截到的数据每次都会有所不同，
实际上，坚石加密锁和HASP的加密狗非常象（在硬件上）

标 题:补充一下 (992字)
发信人:guest
时 间:2000-8-20 8:52:09
详细信息:

我补充一下，我猜，这个软体要破解成功应该是不容易...
除非有原版的狗狗...
不晓得您有没有注意到，这个软件在检查不到狗的情况下，会
让程式「作业无效」？？其实他并没有用特别的手段，应该就是
发生溢位的错误(我猜的，我猜这个软件会随便拿个数据跟从狗里
读出数据相除。当然，没有狗，就读出0;一除下去，就无限大，就
溢位错误了，不过这只是我猜的，不过我有足够的理由这麽说，因为
每次错误的地方都是发生在浮点运算)

根据我破过许许多多的狗件，我可以再叁的强调∶如果软件本身只是
去检查狗，存在就跳、不存在就不跳的这种保护，那是不用狗就能破
解的...

但是如果他会去「读」狗的内容，再将读到的东西拿来运算，或是
当作位址来跳跃，那完了，没有狗绝对破不了!!!
之前不是有听过一个中国的土建软件？他就是把重要的公式的常数与
系数放到狗里头，没有狗，怎麽破？就算可用，正确吗、你敢用吗？？？

我觉得保护，全世界没有一个国家比的上中国(台湾也比不过!!)...
毕竟盗版太严重了，程式师不这麽作，会饿死!!!(现在台湾有在抓，
所以不至於太嚣张，因此程式师变得很懒惰，软件并非每件都难破)

by 彼得,台湾


有声有色 3.10

 标 题:iis兄，请进《有声有色 3.10》的破解方法。 (9千字)
发信人:xiA Qin
时 间:2000-8-17 13:32:37
详细信息:
有声有色 3.10
richie.coolbel.com

工具:Trw2000
有加壳。
脱壳入口点在0048e410

bpx createwindowex

pmodule

................
015F:0048A4C8 E8C399FEFF CALL 00473E90
015F:0048A4CD 8BC6 MOV EAX,ESI
015F:0048A4CF E8FCA8FEFF CALL 00474DD0
015F:0048A4D4 8B8318050000 MOV EAX,[EBX+0518] 1E为十进制的31
015F:0048A4DA 83B8380100001E CMP DWORD [EAX+0138],BYTE +1E //比较使用的次数。
015F:0048A4E1 0F8498000000 JZ NEAR 0048A57F <-改JNZ 0
015F:0048A4E7 8B831C050000 MOV EAX,[EBX+051C]
015F:0048A4CD 8BC6 MOV EAX,ESI
015F:0048A4CF E8FCA8FEFF CALL 00474DD0
015F:0048A4D4 8B8318050000 MOV EAX,[EBX+0518]
015F:0048A4DA 83B8380100001E CMP DWORD [EAX+0138],BYTE +1E
015F:0048A4E1 0F8498000000 JZ NEAR 0048A57F <-改JNZ 1
015F:0048A4E7 8B831C050000 MOV EAX,[EBX+051C]
015F:0048A4ED 8B10 MOV EDX,[EAX]
015F:0048A4EF FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A4F5 3C01 CMP AL,01
015F:0048A4F7 0F8482000000 JZ NEAR 0048A57F <-改JNZ 2
015F:0048A4FD 8B8324050000 MOV EAX,[EBX+0524]
015F:0048A503 8B10 MOV EDX,[EAX]
015F:0048A505 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A50B 3C01 CMP AL,01
015F:0048A50D 7470 JZ 0048A57F <-改JNZ 3
015F:0048A50F 8B8328050000 MOV EAX,[EBX+0528]
015F:0048A515 8B10 MOV EDX,[EAX]
015F:0048A517 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A51D 3C01 CMP AL,01
015F:0048A51F 745E JZ 0048A57F <-改JNZ 4
015F:0048A521 8B832C050000 MOV EAX,[EBX+052C]
015F:0048A527 8B10 MOV EDX,[EAX]
015F:0048A529 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A52F 3C01 CMP AL,01
015F:0048A531 744C JZ 0048A57F <-改JNZ 5
015F:0048A533 8B8330050000 MOV EAX,[EBX+0530]
015F:0048A539 8B10 MOV EDX,[EAX]
015F:0048A53B FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A541 3C01 CMP AL,01
015F:0048A543 743A JZ 0048A57F <-改JNZ 6
015F:0048A545 8B8330050000 MOV EAX,[EBX+0530]
015F:0048A54B 8B10 MOV EDX,[EAX]
015F:0048A54D FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A553 3C01 CMP AL,01
015F:0048A555 7428 JZ 0048A57F <-改JNZ 7
015F:0048A557 8B8334050000 MOV EAX,[EBX+0534]
015F:0048A55D 8B10 MOV EDX,[EAX]
015F:0048A55F FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A565 3C01 CMP AL,01
015F:0048A567 7416 JZ 0048A57F <-改JNZ 8
015F:0048A569 8B833C050000 MOV EAX,[EBX+053C]
015F:0048A56F 8B10 MOV EDX,[EAX]
015F:0048A571 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A577 3C01 CMP AL,01
015F:0048A579 0F85E2010000 JNZ NEAR 0048A761 <-改JZ 9
015F:0048A57F B201 MOV DL,01
015F:0048A581 8B831C050000 MOV EAX,[EBX+051C]
015F:0048A587 8B08 MOV ECX,[EAX]
015F:0048A589 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A58F B201 MOV DL,01
015F:0048A591 8B8324050000 MOV EAX,[EBX+0524]
015F:0048A597 8B08 MOV ECX,[EAX]
015F:0048A599 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A59F B201 MOV DL,01
015F:0048A5A1 8B8328050000 MOV EAX,[EBX+0528]
015F:0048A5A7 8B08 MOV ECX,[EAX]
015F:0048A5A9 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A5AF B201 MOV DL,01
015F:0048A5B1 8B832C050000 MOV EAX,[EBX+052C]
015F:0048A5B7 8B08 MOV ECX,[EAX]
015F:0048A5B9 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A5BF B201 MOV DL,01
015F:0048A5C1 8B8330050000 MOV EAX,[EBX+0530]
015F:0048A5C7 8B08 MOV ECX,[EAX]
015F:0048A5C9 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A5CF B201 MOV DL,01
015F:0048A5D1 8B8334050000 MOV EAX,[EBX+0534]
015F:0048A5D7 8B08 MOV ECX,[EAX]
015F:0048A5D9 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A5DF B201 MOV DL,01
015F:0048A5E1 8B833C050000 MOV EAX,[EBX+053C]
015F:0048A5E7 8B08 MOV ECX,[EAX]
015F:0048A5E9 FF91B8000000 CALL NEAR [ECX+B8]
015F:0048A5EF 8BB354060000 MOV ESI,[EBX+0654]
015F:0048A5F5 8BC6 MOV EAX,ESI
015F:0048A5F7 E8C8A5FEFF CALL 00474BC4
015F:0048A5FC 8B832C050000 MOV EAX,[EBX+052C]
015F:0048A602 8B10 MOV EDX,[EAX]
015F:0048A604 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A60A 50 PUSH EAX
015F:0048A60B B940AA4800 MOV ECX,0048AA40
015F:0048A610 BA58AA4800 MOV EDX,0048AA58
015F:0048A615 8BC6 MOV EAX,ESI
015F:0048A617 E828AAFEFF CALL 00475044
015F:0048A61C 8BC6 MOV EAX,ESI
015F:0048A61E E8ADA7FEFF CALL 00474DD0
015F:0048A623 8BB350060000 MOV ESI,[EBX+0650]
015F:0048A629 8BC6 MOV EAX,ESI
015F:0048A62B E894A5FEFF CALL 00474BC4
015F:0048A630 8B8334050000 MOV EAX,[EBX+0534]
015F:0048A636 8B10 MOV EDX,[EAX]
015F:0048A638 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A63E 50 PUSH EAX
015F:0048A63F B9BCAA4800 MOV ECX,0048AABC
015F:0048A644 BACCAA4800 MOV EDX,0048AACC
015F:0048A649 8BC6 MOV EAX,ESI
015F:0048A64B E8F4A9FEFF CALL 00475044
015F:0048A650 8BC6 MOV EAX,ESI
015F:0048A652 E879A7FEFF CALL 00474DD0
015F:0048A657 8BB34C060000 MOV ESI,[EBX+064C]
015F:0048A65D 8BC6 MOV EAX,ESI
015F:0048A65F E860A5FEFF CALL 00474BC4
015F:0048A664 8D4640 LEA EAX,[ESI+40]
015F:0048A667 BAE4A84800 MOV EDX,0048A8E4
015F:0048A66C E80B94F7FF CALL 00403A7C
015F:0048A671 8B831C050000 MOV EAX,[EBX+051C]
015F:0048A677 8B10 MOV EDX,[EAX]
015F:0048A679 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A67F 50 PUSH EAX
015F:0048A680 B910A94800 MOV ECX,0048A910
015F:0048A685 BA20A94800 MOV EDX,0048A920
015F:0048A68A 8BC6 MOV EAX,ESI
015F:0048A68C E8B3A9FEFF CALL 00475044
015F:0048A691 8D4640 LEA EAX,[ESI+40]
015F:0048A694 BA30A94800 MOV EDX,0048A930
015F:0048A699 E8DE93F7FF CALL 00403A7C
015F:0048A69E 8B8324050000 MOV EAX,[EBX+0524]
015F:0048A6A4 8B10 MOV EDX,[EAX]
015F:0048A6A6 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A6AC 50 PUSH EAX
015F:0048A6AD B954A94800 MOV ECX,0048A954
015F:0048A6B2 BA6CA94800 MOV EDX,0048A96C
015F:0048A6B7 8BC6 MOV EAX,ESI
015F:0048A6B9 E886A9FEFF CALL 00475044
015F:0048A6BE 8D4640 LEA EAX,[ESI+40]
015F:0048A6C1 BA84A94800 MOV EDX,0048A984
015F:0048A6C6 E8B193F7FF CALL 00403A7C
015F:0048A6CB 8B8328050000 MOV EAX,[EBX+0528]
015F:0048A6D1 8B10 MOV EDX,[EAX]
015F:0048A6D3 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A6D9 50 PUSH EAX
015F:0048A6DA B9ACA94800 MOV ECX,0048A9AC
015F:0048A6DF BAC0A94800 MOV EDX,0048A9C0
015F:0048A6E4 8BC6 MOV EAX,ESI
015F:0048A6E6 E859A9FEFF CALL 00475044
015F:0048A6EB 8D4640 LEA EAX,[ESI+40]
015F:0048A6EE BAD0A94800 MOV EDX,0048A9D0
015F:0048A6F3 E88493F7FF CALL 00403A7C
015F:0048A6F8 8B8330050000 MOV EAX,[EBX+0530]
015F:0048A6FE 8B10 MOV EDX,[EAX]
015F:0048A700 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A706 50 PUSH EAX
015F:0048A707 B9F8A94800 MOV ECX,0048A9F8
015F:0048A70C BA10AA4800 MOV EDX,0048AA10
015F:0048A711 8BC6 MOV EAX,ESI
015F:0048A713 E82CA9FEFF CALL 00475044
015F:0048A718 8BC6 MOV EAX,ESI
015F:0048A71A E8B1A6FEFF CALL 00474DD0
015F:0048A71F 8BB338050000 MOV ESI,[EBX+0538]
015F:0048A725 8BC6 MOV EAX,ESI
015F:0048A727 E898A4FEFF CALL 00474BC4
015F:0048A72C 8B833C050000 MOV EAX,[EBX+053C]
015F:0048A732 8B10 MOV EDX,[EAX]
015F:0048A734 FF92B4000000 CALL NEAR [EDX+B4]
015F:0048A73A 50 PUSH EAX
015F:0048A73B B9B0A84800 MOV ECX,0048A8B0
015F:0048A740 BAC0A84800 MOV EDX,0048A8C0
015F:0048A745 8BC6 MOV EAX,ESI
015F:0048A747 E8F8A8FEFF CALL 00475044
015F:0048A74C 8BC6 MOV EAX,ESI
015F:0048A74E E87DA6FEFF CALL 00474DD0
015F:0048A753 8B8320050000 MOV EAX,[EBX+0520]
015F:0048A759 E8D29BFEFF CALL 00474330 //要求注册对话框
015F:0048A75E 5E POP ESI
015F:0048A75F 5B POP EBX
015F:0048A760 C3 RET

0、0F 84 98 00 00 00 8B 83 1C 05 00 00 //注意：此处使用30次才能修改使用。
85

1、0F 84 98 00 00 00
0F 85

2、0F 84 82 00 00 00
0F 85

3、74 70 8B 83 28 05 00 00
75

4、74 5E 8B 83 2C 05 00 00
75

5、74 4C 8B 83 30 05 00 00
75

6、74 3A 8B 83 30 05 00 00
75

7、74 28 8B 83 34 05 00 00
75

8、74 16 8B 83 3C 05 00
75

9、0F 85 E2 01 00 00
0F 84


周公解梦V2.11

 标 题:周公解梦V2.11的日期限制如何破解? (252字)
发信人:bandi
时 间:2000-8-2 15:19:17
详细信息:
虽然这个软件很烂,可以说是一个垃圾,但我认为它是一个练习破解的好东东.锻炼你的综合破解能力.破解它,首先你得对它进行脱壳,然后改日期限制,改设置首页的问题.改.....总之要改的地方还很多.不知那位高手能出一篇详细的破解过程.在此先谢过了,欢迎大家一起参与讨论.!!!

标 题:周公解梦2.11破解－－高手勿入 (1千字)
发信人:小牧童
时 间:2000-8-4 23:19:26
详细信息:

周公解梦2.11破解

这个程序（能称为软件吗？），正好昨晚做了梦想看看结果所以就用了看看，气人的是它竟然会自作主张将浏览器设为它的首页，不知有多少人深受其害？
１、首先脱掉它的壳（脱壳不难）
２、解决时间限制问题，由于它将时间过期限制标志写入文件设断如下：
bpx WritePrivateProfileStringA

:0044B280 50 push eax
:0044B281 E836B2FBFF call 004064BC // WritePrivateProfileStringA这里将过期信息写入文件
:0044B286 85C0 test eax, eax
:0044B288 7527 jne 0044B2B1

３、解决将浏览器设为它的首页,问题，浏览器首页设置在注册表
HKCU\software\Microsoft\Internet Explorer\main\Start Page 中设断如下：
Bpx RegSetValueExa
:0044BD74 50 push eax
:0044BD75 E832A5FBFF call 004062AC // RegSetValueExa这里写入注册表将其设为首页
:0044BD7A 85C0 test eax, eax
:0044BD7C 7424 je 0044BDA2

４、最后修改程序
将E8 36 B2 FB FF改为 90 90 90 90 90
E8 32 A5 FB FF改为 90 90 90 90 90
如果愿意可将未注册信息一并改掉。程序简单破解也非常简单，初学者可以练练手。

标 题:看这里。 (181字)
发信人:小牧童
时 间:2000-8-5 14:57:49
详细信息:

我用的是softice TRW2000我没试，将下面的文件删除就不会再出过期信息了应该也能拦到了bpx WritePrivateProfileStringA
\windows\java\packages\data\Giadir6c.dat
原理就是不让它写过期标志


周公解梦2.11

 标 题:破解 周公解梦2.11 实战录 (3千字)
发信人:十三少
时 间:2000-8-22 20:06:55
详细信息:
周公解梦2.11 试用18天，作者也太吝了，呵呵，破了它吧!

软件下载：
http://202.102.231.158/software/download/system/other/zhou211.zip
前言：和上次的那个有声有色3.10一样，此软件也是用aspack加壳，用
毕卫国先生的unaspack1.0.9.1或手动脱壳都很容易!。
步骤：
一、安装后将时间向后调一个月，出现了过期提示框，这就是切入点，
我们可以从这里入手，此时在trw中下
:pmodule
:g (返回)
按一下“确定”，程序就被拦截下来：
015F:00459046 50 PUSH EAX
015F:00459047 E838DAFAFF CALL `USER32!MessageBoxA`
015F:0045904C 8BF0 MOV ESI,EAX //程序停于此
由此可见，注册提示框是由上面的CALL USER32!MessageBoxA出来的。

二、用W32dasm反汇编脱壳后的主程序，找到程序00459047处，看下面代码：

* Referenced by a CALL at Addresses:
|:004A3F38 , :004A4382 , :004A43F5 , :004A4426 , :004A4461
| //此处有五个地址值得怀疑!破解关键所在。
:00458FFC 55 push ebp
:00458FFD 8BEC mov ebp, esp
:00458FFF 6A00 push 00000000
:00459001 53 push ebx
:00459002 56 push esi
:00459003 8BD8 mov ebx, eax
:00459005 33C0 xor eax, eax
:00459007 55 push ebp
:00459008 6873904500 push 00459073
:0045900D 64FF30 push dword ptr fs:[eax]
:00459010 648920 mov dword ptr fs:[eax], esp
:00459013 8D55FC lea edx, dword ptr [ebp-04]
:00459016 8B4338 mov eax, dword ptr [ebx+38]
:00459019 8B08 mov ecx, dword ptr [eax]
:0045901B FF511C call [ecx+1C]
:0045901E 66837B4200 cmp word ptr [ebx+42], 0000
:00459023 7408 je 0045902D
:00459025 8BD3 mov edx, ebx
:00459027 8B4344 mov eax, dword ptr [ebx+44]
:0045902A FF5340 call [ebx+40]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00459023(C)
|
:0045902D 8B4328 mov eax, dword ptr [ebx+28]
:00459030 50 push eax
:00459031 8B4330 mov eax, dword ptr [ebx+30]
:00459034 E8C7ADFAFF call 00403E00
:00459039 50 push eax
:0045903A 8B45FC mov eax, dword ptr [ebp-04]
:0045903D E8BEADFAFF call 00403E00
:00459042 50 push eax
:00459043 8B432C mov eax, dword ptr [ebx+2C]
:00459046 50 push eax
:00459047 E838DAFAFF call 00406A84 //提示框的出处!向上看
:0045904C 8BF0 mov esi, eax
:0045904E 66837B4A00 cmp word ptr [ebx+4A], 0000
:00459053 7408 je 0045905D

三、可以下分别对我们怀疑的地址下中断
:bpx 004A3F38
:bpx 004A4382
:bpx 004A43F5
:bpx 004A4426
:bpx 004A4461
重新运行程序，程序被拦中断于004A4382，呵呵，看来有戏，接着看：

015F:004A436A 8B8328030000 MOV EAX,[EBX+0328]
015F:004A4370 8B10 MOV EDX,[EAX]
015F:004A4372 FF92B4000000 CALL NEAR [EDX+B4]
015F:004A4378 3C01 CMP AL,01
015F:004A437A 750D JNZ 004A4389 //此处跳走，则不会出错:)
015F:004A437C 8B830C030000 MOV EAX,[EBX+030C]
015F:004A4382 E8754CFBFF CALL 00458FFC //程序拦于此处!向上看2行
015F:004A4387 EB71 JMP SHORT 004A43FA
015F:004A4389 8B8318030000 MOV EAX,[EBX+0318]
015F:004A438F E8F014FBFF CALL 00455884
015F:004A4394 DD1C24 FSTP QWORD [ESP]
015F:004A4397 9B WAIT
此程序只要在004A437A处，改为JMP 004A4389就不会出现过期提示了。如何
修改程序，我就不想多说了。朱江(作者)兄，我可没改你的程序呀~~O~~
好久没写这么多东西了，真是累呀:)

十三少
China Cracking Group
2000.08.21


NetAnts1.2

 标 题:网络蚂蚁的广告条如何实现和破解的！ (74字)
发信人:wind[CCG]
时 间:2000-7-19 9:46:27
详细信息:
希望各位大虾能够指点一下小弟！
网络蚂蚁的广告条是如何实现和如何破解的！

标 题:go (105字)
发信人:电神魔鬼
时 间:2000-7-31 22:50:05
详细信息:

*netants1.22

netants.exe

去掉广告

8345F443
90909090

6a42
6a00
.
.
push 42 ->nop
.
.

标 题:或許這樣可以幫到你! (1千字)
发信人:C-pen
时 间:2000-8-1 16:23:19
详细信息:

假使你知道NetAnts1.2是用Movewindow來調用廣告視窗的話,你可以下bpx movewindow,等攔下後返回,會來到:
:0041AA4D push EDI
:0041AA4E CALL 00402452 <--調用函數的CALL
:0041AA53 CMP EAX,EBX <--我們在這
:0041AA55 POP ECX
:0041AA56 MOV [00446888],EAX
:0041AA5B JZ 0041C8E3
:0041AA61 PUSH EDI
若你不知道用MoveWindow,可下bpx Createwindowexa令其返回值等於0看看那一個窗口不見了,如此Try and Error 你會發現上述的CODE是在處理廣告視窗
分析一下CODE你會發現程式會將窗口的ID放入00446888中供程式應用,那我們
要怎麼改,當然不要讓它產生ID和不影響程式的運作,我的改法是:
:0041AA4d push EDI -->XOR EAX,EAX
:0041AA4E CALL 00402452 -->NOP掉
:0041AA53 CMP EAX,EBX -->NOP掉
:0041AA55 POP ECX -->NOP掉
:0041AA56 MOV [00446888],EAX -->保留
:0041AA5B JZ 0041C8E3 -->NOP掉
這樣改了以後還是有視窗,只是沒有畫面而已.沒關係我們用W32Dasm反匯編(在台灣叫反組譯)查找00446888亦就是廣告視窗的Flag,我找到:
:0041A80E PUSH DWORD PTR [00446888]
:0041A814 CALL EDI <--[USER32!MoveWindow]
:0041A816 ADD DWORD PTR [EBP-0C],00000043
:0041A81A ADD DWORD PTR [00444E2C],00000043
:0041A821 CMP DWORD PTR [00446A90],EBX
有編程經驗的人大概知道這是在設定窗口的大小,我們用Symbole Loader載入直接G到此處,結果發現程式在SetWindowPlacement,那我們應該知道怎麼改了
就是將0041A816和0041A81A的00000043改為00000000改完之後執行程式,清爽多了吧!這是1.2版的其他版本應該差不多吧!我儘量寫的讓大家看的懂且我不是什麼高手,水平很低的只是經驗分享而已,談不上教程,所以有表達不善之處,還請見諒!!!

标 题:以前的破解，凑合看吧 (1千字)
发信人:十夜
时 间:2000-8-1 17:58:46
详细信息:

由于我现在安装的是Win2000，SoftICE不太好使，而且我喜欢NetVampire，对NetAnt不太注意，所以不解1.22版了，以前解过一个版本，原理应该差不多，凑合着看吧。
The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area.
BOOL MoveWindow(

HWND hWnd, // handle of window
int X, // horizontal position
int Y, // vertical position
int nWidth, // width
int nHeight, // height
BOOL bRepaint // repaint flag
);
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417F4C(C)
|
:00417F88 891D80BD4300 mov dword ptr [0043BD80], ebx
:00417F8E 891D88BD4300 mov dword ptr [0043BD88], ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00417F86(U)
|
:00417F94 8B45F8 mov eax, dword ptr [ebp-08]
改为:
00417F94 EB1790
（此处跳到00417FAD，就是跳过00417FAB FFD7 call edi这个CALL是调广告窗口的）

* Possible Reference to String Resource ID=00001: "mailto:support@netants.com?subject=Feedback of "
|
:00417F97 6A01 push 00000001
:00417F99 2B45F0 sub eax, dword ptr [ebp-10]
:00417F9C 6A3F push 0000003F
:00417F9E 50 push eax
:00417F9F FF75F4 push [ebp-0C]
:00417FA2 FF75F0 push [ebp-10]
:00417FA5 FF356CD44300 push dword ptr [0043D46C]
:00417FAB FFD7 call edi（调用movewindow函数）
:00417FAD 8345F440 add dword ptr [ebp-0C],00000040
改为:
00417FAD 8345F400
(00417FAD那行加上的00000040就是广告条的高度，将其改为加上0即可）
这只是一部分破解，前边还有一处是调用adver.dll的，很好改，在w32dasm中的string找到adver.dll将其跳过即可）
其实和C-pen讲的一样，很欢迎台湾的朋友。


netants1.22

 标 题:如何去掉netants1.22的广告条 (2千字)
发信人:电神魔鬼
时 间:2000-8-1 17:29:10
详细信息:
如何去掉netants1.22的广告条

昨天翻论坛的时候,看到有人问如何去netants广告条的问题,我回答一下.netants安装后会在windows\system下生成一个叫adimage.dll的文件,以前的netants生成的是advert.dll(windows\system下好像是个垃圾场:(,什么东西都往这里扔),我们就从它入手,先把它剪切到你的桌面上,执行netants,当然他会报错,告诉你没有这个文件,然后退出去,其实这个文件就是它的"广告条".
当netants出现写着creatwindowex(advertwin)[0]的对话框时,进入softice,下bpxlockmytask,按f5退出softice,点确定,被拦到,下bd *,按f12直到进入netants的领空,按f10继续追踪,又回到windows的地盘,再按f12直到重新回到netants的领空.

017f:0041a857 mov [4485b0],eax
017f:0041a85c jz 0041c6c6 ->跳到这程序会退出
017f:0041a862 push edi

当程序走到41a85c时,双击41a85c(相当于下bpx 41a85c),程序跳到416c6c6时会退出,我们不让它跳,也就是把eip改成0041a862,按f5返回,netants出来了,好的广告条没有了,代替它的是一面墙:(,退出netants.把adimage.dll拷回到windows\system下(否则你得多按几次确定),执行netants,在0041a85c处被拦到,向上翻页到0041a65e

017f:0041a65e 6a42 push 42
017f:0041a660 50 push eax
017f:0041a661 ff75f4 push dword ptr [ebp-c0]
017f:0041a664 ff75f0 push dword ptr [ebp-10]
017f:0041a667 ff35b08544 push dword ptr [004485b0]
017f:0041a66d ffd7 call edi
017f:0041a66f 8345f443 add dword ptr [ebp-0c],43

双击41a65e这一行,按f5返回,立刻被41a65e拦到,这时按f4看一下netants,除了中文菜单以外,好大一面墙,再按f4返回softice,当执行完41a66d后,屏幕会闪动一下,按f4再看一下netants,广告条的位置出来了,这一段程序就是要害了,下code on,打开机器码显示,下bd *并按f5返回,退出netants.打开winhex修改netants.exe.

查找:6a4250
改为:6a0050

查找:8345f443
改为:90909090

再次打开netants,广告条没有了.
完活.

说明:1.netants1.20以前的版本很好跟到push 42这一段,从1.20以后开始不好找了,这个东西混在windows的地盘里,想找到的话要看运气,试试bpx getwindow,任什么玩艺都能拦到,不过要在它里面捞针的话,没有好运气别想,在此省略x hours跟踪测试,按以上方法改过后,不会有副作用的,至少我用到现在还没发现:D.
2.netants在使用的时候,有的任务中断后,再次连接时,会出现无法创建文件的问题,只需强制结束任务,重新载入netants即可.
3.netants遇到线路不好的时候,有时下载程序到97%-99%时,会变得很慢,或干脆不工作,这时选停止这个任务,再选开始,它就会很快下载完的,如果连不上活还是不工作的话,我也没办法,别找我算账,说明你这时很s呀:(.
886

附:关于阿土的游戏只能装在c盘的问题
只要不出什么意外的话,保证这条语句永远跳到1000ea92就行了,我试了,没发现不良后果
017f:1000ea32 jz 1000ea92 ->jmp 1000ea92
现在的软件兴逻辑锁,小心点为妙:(

cracked by 电神魔鬼
thanks for your supports


网际金典3.0(小楼)

 标 题:网际金典3.0----十分简单的installshield破解 (1千字)
发信人:小楼
时 间:2000-8-27 18:55:14
详细信息:
网际金典3.0----十分简单的installshield破解
简而言之, 用Windows Installshield Decompiler V1.00 Beta反汇编seup.ins后, 在StrRef中找, 发现以下语句:
"ERROR_CHECK_SERIAL_NO", 左键双击后看到:
<LABEL_000C> REF: 00001225 0000125E
|
00001177: 0128 IF (Call Function_0074_[LABEL_0035] = 0000000C) THEN
00001197: 002C Goto (LABEL_000B)
0000119C: 0000 ELSE
000011A5: 00B5 Call Function_005F_[LABEL_032D]
000011A5: 00B5 NumLocal[0005] = Call Function_005F_[LABEL_032D]
000011BE: 0128 IF (Call Function_005F_[LABEL_032D] = 00000000) THEN
000011DE: 0112 LoadInternalString ("","MSG_INFO",StrLocal[0002])
000011F1: 003B SetDialogTitle (00000004,StrLocal[0002])
000011FB: 0112 LoadInternalString ("","ERROR_CHECK_SERIAL_NO",StrLocal[0002])
0000121B: 002A MessageBox (StrLocal[0002],INFORMATION)
00001225: 002C Goto (LABEL_000C)
00001226: 0000 ENDIF
00001227: 0000 ENDIF

接下来就是依样画葫, 将
000011BE: 0128 IF (Call Function_005F_[LABEL_032D] = 00000000) THEN
改为 000011BE: 0128 IF (Call Function_005F_[LABEL_032D] != 00000000) THEN
再进行CRC CORRECTION,
安装时随便输入注册码, OK.


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优化大师 v2.9+

 标 题:Windows优化大师 v2.9+ (11千字)
发信人:dr0
时 间:2000-8-22 17:17:53
详细信息:
Windows优化大师v2.9+的注册码加密算法

written by dr0, 2000/08/22

本文将以汇编代码为例，解释一下“Windows优化大师” v2.9+中用到的RSA算法。
先简单介绍一下RSA算法，便于和汇编代码对照。具体的数学理论我们在此并不太关心，有兴趣的可以去查参考资料。

RSA算法简述：
1、取两个素数p和q。
2、计算n=pq，f=(p-1)(q-1)。
3、随机选取整数e，满足条件gcd(e, f)=1，其中gcd为最大公约数。
4、计算d，使得乘积de对f求余的结果为1，即de和1对f同余。
上述只有e和n对外公开，用于加密。

加密过程（符号^表示乘幂，mod表示求余）：
e为加密密钥，假定明文为m，则密文c = (m ^ e) mod n。

解密过程：
d为解密密钥，则解密得到的明文m'= (c ^ d) mod n。

RSA被攻破的一个充分条件是n被因子分解，即得到p和q。因为得到p和q之后便可以计算出f，从而根据“de和1对f同余”这个条件计算出解密密钥d来。

根据上面的加密和解密算法可以看出：
1、RSA的加密和解密是对称的，即加密和解密可以使用同一个函数；
2、RSA加密主要依靠模幂运算，因此这部分运算的复杂度对算法的效率影响最大。关于模幂运算，在《计算机密码学》（清华出版社，卢开澄）一书中讲了一种算法，该算法很容易理解，其指导思想就是不停地降阶，从而降低时间复杂度。用类C语言的伪码描述如下：

//下面这个函数计算(m ^ e) mod n
ReturnValueType encrypt_decrypt(m, e, n)
{
LocalVariables a, b, c;

a = m;
b = e;
c = 1;

while(b)
{
if ((b mod 2) == 0)
{
b = b / 2; //降阶
a = (a * a) mod n;
}
else
{
b = b - 1;
c = (a * c) mod n;
}
}

return c;
}

Windows优化大师的破解过程已有很多文章讲过，本文重点分析其对我们输入的注册码进行加密运算的部分，因为只有这一部分求逆的难度比较大些，其它部分可以直接拷贝或者很容易求逆（例如环形移位运算）。我们将会看到，其使用的模幂算法就是上述的算法。

用IDA反汇编OctoDll.dll，可以看到一个名为Registed( )的函数，这显然是在判断注册码。这个函数将对我们输入的两部分注册码分别进行RSA加密，再移位，把移位的结果和一个数（这个数是根据“You are big pig.”、“1234567”以及注册申请码计算出来的，这个计算过程无需求逆）进行比较，然后返回另一个值（它的主程序会判断该值是否为0x14）。

Registed proc near

var_10 = dword ptr -10h
var_A = word ptr -0Ah
var_8 = dword ptr -8
var_4 = dword ptr -4
arg_0 = dword ptr 8
arg_8 = dword ptr 10h

push ebp
mov ebp, esp
add esp, 0FFFFFFF0h
push ebx
xor edx, edx
mov [ebp+var_10], edx
mov ebx, eax
xor eax, eax
push ebp
push offset loc_4043FE
push dword ptr fs:[eax]
mov fs:[eax], esp
mov eax, [ebp+arg_8]
mov [ebp+var_8], eax
mov eax, [ebp+arg_0]
mov [ebp+var_4], eax
lea eax, [ebp+var_10]
mov edx, ebx
call unknown_libname_17
mov eax, [ebp+var_10]
lea edx, [ebp+var_A]
lea ecx, [ebp+var_8]
call sub_4041D8 //核心判断
test eax, eax
jnz short loc_4043E4
xor ebx, ebx //bad guy
jmp short loc_4043E8

loc_4043E4:
movzx ebx, [ebp+var_A] //return value

loc_4043E8:
xor eax, eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push offset loc_404405

loc_4043F5:
lea eax, [ebp+var_10]
call sub_402E5C
retn

很显然，核心判断在call sub_4041D8中。跟进去，看见函数体如下。这个函数的前半部分是在根据“You are big pig.”、“1234567”以及注册申请码通过哈希运算计算出几个数来。后半部分才是最值得关心的。注释如下：

sub_4041D8 proc near

var_24 = dword ptr -24h
var_20 = dword ptr -20h
var_1C = dword ptr -1Ch
var_18 = dword ptr -18h
var_14 = dword ptr -14h
var_10 = dword ptr -10h
var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4

push ebp
mov ebp, esp
add esp, 0FFFFFFDCh
push ebx
push esi
push edi
xor ebx, ebx
mov [ebp+var_14], ebx
mov esi, ecx
lea edi, [ebp+var_10]
movsd
movsd
mov [ebp+var_8], edx
mov [ebp+var_4], eax
mov eax, [ebp+var_4]
call sub_402FC0
xor eax, eax
push ebp
push offset loc_40435F
push dword ptr fs:[eax]
mov fs:[eax], esp
lea eax, [ebp+var_14]
mov edx, offset _str_You_are_big_pig.Text
call sub_402EC4
mov eax, [ebp+var_4]
call unknown_libname_18
and eax, 80000007h
jns short loc_40422A
dec eax
or eax, 0FFFFFFF8h
inc eax

loc_40422A:
test eax, eax
jz short loc_40425A
lea eax, [ebp+var_4]
mov edx, offset _str_1234567.Text
call @System@@LStrCat$qqrv ; System __linkproc__ LStrCat(void)
mov eax, [ebp+var_4]
call unknown_libname_18
test eax, eax
jns short loc_40424A
add eax, 7

loc_40424A:
sar eax, 3
mov edx, eax
shl edx, 3
lea eax, [ebp+var_4]
call @System@@LStrSetLength$qqrv ; System __linkproc__ LStrSetLength(void)

loc_40425A:
xor esi, esi
lea eax, [ebp+var_4]
call sub_402FD0
mov edi, eax
lea eax, [ebp+var_14]
call sub_402FD0
mov ebx, eax
jmp short loc_4042A2

loc_404272:
mov eax, [edi+esi*4]
mov [ebp+var_1C], eax
mov eax, [edi+esi*4+4]
mov [ebp+var_18], eax
mov edx, ebx
lea eax, [ebp+var_1C]
call sub_404170
mov eax, [ebx]
mov [ebx+8], eax
mov eax, [ebx+4]
mov [ebx+0Ch], eax
mov eax, [ebp+var_1C]
mov [ebx], eax
mov eax, [ebp+var_18]
mov [ebx+4], eax
add esi, 2

loc_4042A2:
mov eax, [ebp+var_4]
call unknown_libname_18
test eax, eax
jns short loc_4042B1
add eax, 3

loc_4042B1:
sar eax, 2
cmp esi, eax
jb short loc_404272 //以上为前半部分，不用求逆

mov eax, [ebp+var_10]
xor edx, edx
push edx //注册码的第一部分m1的高位（恒为0）
push eax //注册码的第一部分m1的低位
push ds:dword_4050D0 //加密密钥e的高位（0）
push ds:dword_4050CC //加密密钥e的低位（3B442AF9）
push ds:dword_4050D8 //n的高位（0）
push ds:dword_4050D4 //n的低位（69AAA0E3）
call sub_4040B8 //encrypt_decrypt(m1, e, n)
sub eax, 2
mov [ebp+var_24], eax
mov eax, [ebp+var_C]
xor edx, edx
push edx //注册码的第二部分m2的高位（恒为0）
push eax //注册码的第二部分m2的低位
push ds:dword_4050D0 //加密密钥e的高位（0）
push ds:dword_4050CC //加密密钥e的低位（3B442AF9）
push ds:dword_4050D8 //n的高位（0）
push ds:dword_4050D4 //n的低位（69AAA0E3）
call sub_4040B8 //encrypt_decrypt(m2, e, n)
sub eax, 2
mov [ebp+var_20], eax
shl [ebp+var_24], 2 //移位
lea ecx, [ebp+var_24]
mov eax, [ecx]
mov edx, [ecx+4]
shrd eax, edx, 2 //这条和下面一条完成64 bit环形移位
shr edx, 2
mov [ecx], eax
mov [ecx+4], edx
mov eax, [ebp+var_24]
cmp eax, [ebp+var_1C] //比较
jz short loc_404330
xor ebx, ebx
jmp short loc_404341

loc_404330:
mov ax, word ptr [ebp+var_20] //返回值
and ax, 0FFFFh
mov edx, [ebp+var_8]
mov [edx], ax
or ebx, 0FFFFFFFFh

loc_404341:
xor eax, eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push offset loc_404366

loc_40434E:
lea eax, [ebp+var_14]
call sub_402E5C
lea eax, [ebp+var_4]
call sub_402E5C
retn

即上面的两个call sub_4040B8分别等价于
encrypt_decrypt(m1, e, n)
encrypt_decrypt(m2, e, n)
只需要把sub_4040B8的函数体和上面的算法伪码描述对照一下就明白为什么等价了（注意windows优化大师使用的是64 bit的运算，每个数要用两个32 bit的数来表示，因此操作每个64 bit的数至少要两条指令）：

sub_4040B8 proc near

var_8 = dword ptr -8 //局部变量c的低位（c中将存放返回值）
var_4 = dword ptr -4 //局部变量c的高位
arg_0 = dword ptr 8 //m的低32位
arg_4 = dword ptr 0Ch //m的高32位
arg_8 = dword ptr 10h //e的低32位
arg_C = dword ptr 14h //e的高32位
arg_10 = dword ptr 18h //n的低32位
arg_14 = dword ptr 1Ch //n的高32位

push ebp
mov ebp, esp
add esp, 0FFFFFFF8h
mov [ebp+var_8], 1 // c = 1;
mov [ebp+var_4], 0
jmp short loc_40414A

loc_4040CE:

push 0
push 2
mov eax, [ebp+arg_8]
mov edx, [ebp+arg_C]
call __LLMOD //b mod 2
cmp edx, 0
jnz short loc_40411B
cmp eax, 0
jnz short loc_40411B
push 0
push 2
mov eax, [ebp+arg_8]
mov edx, [ebp+arg_C]
call __LLDIV // b = b / 2
mov [ebp+arg_8], eax
mov [ebp+arg_C], edx
push [ebp+arg_14]
push [ebp+arg_10]
push [ebp+arg_14]
push [ebp+arg_10]
push [ebp+arg_4]
push [ebp+arg_0]
call sub_404060 // a = (a * a) mod n
mov [ebp+arg_10], eax
mov [ebp+arg_14], edx
jmp short loc_40414A

loc_40411B:

mov eax, [ebp+arg_8]
mov edx, [ebp+arg_C]
sub eax, 1 // b = b - 1
sbb edx, 0
mov [ebp+arg_8], eax
mov [ebp+arg_C], edx
push [ebp+arg_14]
push [ebp+arg_10]
push [ebp+var_4]
push [ebp+var_8]
push [ebp+arg_4]
push [ebp+arg_0]
call sub_404060 //c = (a * c) mod n
mov [ebp+var_8], eax
mov [ebp+var_4], edx

loc_40414A:
cmp [ebp+arg_C], 0 //b等于0吗？
jnz short loc_40415C
cmp [ebp+arg_8], 0
ja loc_4040CE //继续循环
jmp short loc_404162

loc_40415C:
jg loc_4040CE //继续循环

loc_404162:
mov eax, [ebp+var_8] //返回值c
mov edx, [ebp+var_4]
pop ecx
pop ecx
pop ebp
retn 18h
sub_4040B8 endp

至此我们已经搞清其加密算法，且得到如下结果：
e = 0x000000003B442AF9
n = 0x0000000069AAA0E3
剩下的事情就是对n进行因子分解，写出注册机.


movie play 2.51

 标 题:放上Ken的一篇smc教程！也可以参考看雪放过Heibow的一篇破aspack2000的文章！ (4千字)
发信人:wind[CCG]
时 间:2000-8-18 17:13:54
详细信息:
工具 :softice,offset converter,ultraedit ,procdump,
offset converter 的 URL:
http://kontum.vietmedia.com/protools/files/utilities/oc.zip

程式 : movie play 2.51
http://www.titanic.cc/movplay/moveplay.htm

前言:

看了那篇用 self modifying code 的技巧
我又试了一下其他的软体,以前拿不掉的 nag screen
现在可以掉了,真是太棒了.
再讲一下什麽是 self modifying code,
就是找一段原来的程式,所没有用到的程式码,
加入你自己的 code, 而且还能修改他的 code
我想也可以用这个来设变数吧,
当我学到了这个技巧,我只能说,
杰克, 这真是太神奇了

但是这个程式呢? 我只是拿掉他的 nag screen 而已
其他的限制呢 ? 我想对大家来说也不是问题吧,所以
我就不写了.

ok, go!!

1:程式一执行就出现一个 nag screen, 叫你赶快去注册
的确讨厌,而今天所说的就是要拿掉他.
如何拿掉呢 ?
先离开 movie play, 按 ctrl-d 进入 softice,
下 bpx createdialogindirectparama , 这是在拦截 dialogbox的
当然不只这个 API 啦,不过 movie play 是用这个
按 F5,回到 windows, 执行 movie play, 立刻被拦住,
按一下 F12, 就回到 movie play 的领空了.
在这边
CS:00420C33 CALL 00420897
CS:00420C38 CMP EAX,EDI <--- 出来光棒停在这边
CS:00420C3A JZ 420C8E

此时 eax =1, edi=0,下意识的下 r eax 0
将 eax 改成 0, 按 F5,竟然 nag screen 不见了
那我想大家一定想说 那还不简单, 把 jz 改成 jmp 就好了啊
可惜事情没有这麽简单, 因为 下 bpx 00420c38 ,
会发现 cs:00420c38 会走两次, 第一次,若 eax = 0,
则 nag 会不见,第二次,若 eaq=0 ,则主视窗也离开了
所以啦 , 不能这样改,
不过 cs:00420c33 好像是关键喔, 在一次执行 movie play
被 softice 拦住,按一下 F12,
就先下 bd* , 在下 bpx 00420c33 , 按 F5 ,回到 windows,结束
movie play

2:执行 movie play , 被 softice 拦住, 停在 cs:00420c33
按 F8 进去 trace, 开始按数下 F10,
到了 CS:00420AA5 SETNZ AL
CS:00420AA8 MOV ECX,[EBP-C]
CS:00420AAB POP EDI
CS:00420AAC POP ESI

当然, 在 CS:00420AA5 这一行, 若令 AL =1, nag screen 就会出来
若令 al =0 , nag 就不会出来了 , 可是也不能直接修改, 因为这边会走两次
若改这边, 主程式也出不来了.

3:那应该如何是好呢 ? 就用 self modifying code 的技巧, 加入自己的 code
既然要加入自己的 code, 首先就要找一段原来程式没有用到的程式码
而且又要足够空间可容纳我们所要加进去的程式码...那应该找哪里呢 ?
都好, 只要不妨碍原来程式运作就行了 .

4:用 symbol loader 载入 movie play
一开始在进去都是一些 invalid , 按一下 F8
在这边
CS:0041392E MOV EBP,ESP
CS:00413930 PUSH FF
CS:00413932 PUSH 00431A60
看一下上面的 CODE
好像一些上面的 code 没走到
如 CS:00413900 MOV EDI,[EBP+14]
CS:00413903 TEST EDI,EDI
下 bpx 413900 , 运行一下,试一下里面所有的功能,拨放一下
真的没走到这边耶, 那就准备改这边的值了,离开 movie play

5:执行 movie play,
到了 CS:00420AA5 SETNZ AL
CS:00420AA8 MOV ECX,[EBP-C]
CS:00420AAB POP EDI
光棒停在 cs:00420aa5 时, 此时 AL=0, 但是只要一走完
cs:00420aa5, AL=1 了, 我们希望第一次走到这边 AL=0,
第二次走到这边 AL=1 , 这是我们希望的, 因为这样
nag screen 就会不见了 .
先把附近的机械码抄起来, 是 0f95c08b4df45f5e
现在想把 setnz al 改成 jmp 413900
所以下 a, 就是组译了, 在下 jmp 413900,
按两次 enter, ok,改好了,抄一下机械码,是E9562EFFFF
现在按一下 F10,
就跳到 CS:413900 了

6:到了这边 CS:413900 当然也要改啊,
要改成什麽呢 ?
首先要把 CS:00420AA5 恢复成 SETNZ AL
不然会有麻烦, 但是要如何恢复呢 ?

下 a, 在下 mov dword ptr [420aa5],8b0c950f ,按一下 enter
mov byte ptr [420aa9],4d ,按一下 enter
jmp 00420aa8 ,按两下 enter
这就是我们所加入的码了, 现在来分析一下,
为什麽要下 8b0c950f 呢? 仔细看一下原本刚刚抄下的机械码
CS:00420AA5 SETNZ AL 的机械码是 0f95c08b
现在要恢复, 当然是让他复原了, 不过这个顺序要反过来
所以变成了 8b0c950f ,
但是刚刚在 CS:00420AA5 把他改成 jmp 413900
是 5 byte , 而mov dword ptr [420aa5],8b0c950f 只是 4 byte 而已
所以还要再下一行 mov byte ptr [420aa9],4d
这样就恢复了,
再来就跳回去原来的地方,继续执行了
而我改的这几行,的机械码也抄起来吧
满长的喔,
c705a50a
42000f95
c08bc605
a90a4200
4de992d1
0000
,按一下 F5, 就没问题了...已经去掉 nag screen 了

7: 所以了,先关掉 movie play, 拿起 ultra edit 去改了
找 0f95c08b4df45f5e
改 E9562EFFFF------
再来呢 ? 我好像是忽略了什麽了, 糟了,我忘记抄下
cs:413900 附近的机械码了 , 当然可以再执行一次,再去抄下来
不过这边我介绍另一个 tool, offset converter
执行他, 去开启 movie play, 输入 413900,
他就跑出来一个值了 是13900 , 当然是 16 进位值
所以用 ultra edit 去找到这个值,
拉着卷轴, 拉到了 13900 , 就可以开始改了
改成
c705a50a
42000f95
c08bc605
a90a4200
4de992d1
0000
这样就可以了

8: 不过这个软体有使用期限, 这样做只是去掉 nag screen 而已
没有去掉其他限制, 不过这也不是问题, 这个就请大家自行去试了
因为此篇只要讲的是 self modifying code
还是那句老话, 觉得此软体好就去注册, 不好用就杀掉吧
才能有更好的软体, 只有注册 ,才能有更好的软体,


有声有色 3.10

 标 题:how to write patch for 有声有色 3.10.txt (4千字)
发信人:dREAMtHEATER
时 间:2000-8-20 20:24:26
详细信息:
今天我cracking了有声有色 3.10， 下载地点http://www.newhua.com.cn/down/you310.zip, 它是用aspack 2.1加的壳，我已成功地将它unpack, crack down, 但我想现在想写一个patch, 一个直接在它的原文件MusRea.exe上写上patch代码，即在.Aspack section最后的无代码部分加上我的patch代码，但似乎不成功，望高手能赐教：

分析过程如下：

在.Aspack section一节, 最后要返回原程序entry point前的反汇编代码如下：

:004CC4F3 61 popad
:004CC4F4 7508 jne 004CC4FE

* Possible Reference to String Resource ID=00001: "櫃橠DDD櫃櫃DDA櫃櫃橠D櫃櫃橠D櫃櫃橠D櫃櫃煓D櫉櫃�檻D?鶛�?
|
:004CC4F6 B801000000 mov eax, 00000001
:004CC4FB C20C00 ret 000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CC4F4(C)
|
:004CC4FE 6800000000 push 00000000 <==将此处改为E99D1F0000
:004CC503 C3 ret <==从此返回原程序entry point

我的思路将:004CC4FE处代码改为 jmp 004ce434, :004ce434为.Aspack section一节无代码处，在此处我写入我的patch代码，即:
mov dword ptr [0048A4E1], 90E98002
push 00000000
ret

HEX值：C705E1A448000280E9906800000000C3,
这种思路我在老外的tutor里看到过，但我的测试未通过，请高人指点。

附：我写的关于如何破解有声有色 3.10的tutor

Target file : MusRea.exe
Packer: Aspack 2.1
Compiler: Delphi 5.0

cracking tutorial:

1.unpacking target file with your favorite tools , eg. softice or trw, I prefer to use UnAspack 1.0.9.1
2.Using ProcDump change the Section Characteristics for the CODE section to 0xE0000020. (you must master PE file format, or you don't understand it. :-()
3.Disassemble the target file
4.anlysis the source code:
:0048A4D4 8B8318050000 mov eax, dword ptr [ebx+00000518]
:0048A4DA 83B8380100001E cmp dword ptr [eax+00000138], 0000001E <== see if you have used 30 times
:0048A4E1 0F8498000000 je 0048A57F
:0048A4E7 8B831C050000 mov eax, dword ptr [ebx+0000051C]
:0048A4ED 8B10 mov edx, dword ptr [eax]
:0048A4EF FF92B4000000 call dword ptr [edx+000000B4]
:0048A4F5 3C01 cmp al, 01
:0048A4F7 0F8482000000 je 0048A57F
:0048A4FD 8B8324050000 mov eax, dword ptr [ebx+00000524]
:0048A503 8B10 mov edx, dword ptr [eax]
:0048A505 FF92B4000000 call dword ptr [edx+000000B4]
:0048A50B 3C01 cmp al, 01
:0048A50D 7470 je 0048A57F
:0048A50F 8B8328050000 mov eax, dword ptr [ebx+00000528]
:0048A515 8B10 mov edx, dword ptr [eax]
:0048A517 FF92B4000000 call dword ptr [edx+000000B4]
:0048A51D 3C01 cmp al, 01
:0048A51F 745E je 0048A57F
:0048A521 8B832C050000 mov eax, dword ptr [ebx+0000052C]
:0048A527 8B10 mov edx, dword ptr [eax]
:0048A529 FF92B4000000 call dword ptr [edx+000000B4]
:0048A52F 3C01 cmp al, 01
:0048A531 744C je 0048A57F
:0048A533 8B8330050000 mov eax, dword ptr [ebx+00000530]
:0048A539 8B10 mov edx, dword ptr [eax]
:0048A53B FF92B4000000 call dword ptr [edx+000000B4]
:0048A541 3C01 cmp al, 01
:0048A543 743A je 0048A57F
:0048A545 8B8330050000 mov eax, dword ptr [ebx+00000530]
:0048A54B 8B10 mov edx, dword ptr [eax]
:0048A54D FF92B4000000 call dword ptr [edx+000000B4]
:0048A553 3C01 cmp al, 01
:0048A555 7428 je 0048A57F
:0048A557 8B8334050000 mov eax, dword ptr [ebx+00000534]
:0048A55D 8B10 mov edx, dword ptr [eax]
:0048A55F FF92B4000000 call dword ptr [edx+000000B4]
:0048A565 3C01 cmp al, 01
:0048A567 7416 je 0048A57F
:0048A569 8B833C050000 mov eax, dword ptr [ebx+0000053C]
:0048A56F 8B10 mov edx, dword ptr [eax]
:0048A571 FF92B4000000 call dword ptr [edx+000000B4]
:0048A577 3C01 cmp al, 01
:0048A579 0F85E2010000 jne 0048A761 <==if everything OK, you should jump to 0048A761 from it.

Through the analysis, you can change the code at :0048A4DA to jmp 0048A761, I think you know how to modify HEX value, do it yourself. Do you understand? let me know.
5.run the target file again, see what happen? Bingo! The limit use 30 times is removed.

DO NOT USE THIS TUTOR FOR COMMERICAL PURPOSE, IF YOU LIKE THIS PROGRAM, PLEASE PAY THE AUTHOR'S HARD WORK, THE REGISTER FEE IS ONLY TEN YUAN.

标 题:SEH成功, 可是用原版超过30次,再用破解版也不行了.谁来教我? (1千字)
发信人:小楼
时 间:2000-8-20 23:58:28
详细信息:

如何patch有声有色3.10
难得今天心情比较好, 准备学习SEH; 拿有声有色3.10开刀( 有人已经破解了, 不必再去找CODE).
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 0048A561
9090 nop
9090 nop

与我见到的[PC/MFD]写的文章**** iNLiNE pATCHiNG A pROGRAM pACKED WiTH ASProtect - by Predator 不同, 我发现要这样修改.

在000003d0处: 用hiew写上如下代码
000003d0: 0000 我发现跳到这里后不能直接
写patch,必须过渡一下.
000003d2: 66c705e1a44800eb74 patch code 1
000003db: 66c705e3a448009090 patch code 2
000003e4: 66c705e5a448009090 patch code 3
000003ed: 6810e44800 放入真实的入口点
000003f2: c3 返回

ok, job done.
完成了自己的第一个SEH作品.
同时今天自己也是第一次破解VB6程序--Dr salamn's powertools成功的日子.

标 题:sorry,看错了,应该这样PATCH (148字)
发信人:小楼
时 间:2000-8-22 13:56:03
详细信息:

000003d2: 66c705e1a44800e9eb patch code 1
000003db: 66c705e3a448000200 patch code 2
000003e4: 66c705e5a448000090 patch code 3


KERNEL32.DLL

 标 题:使用KERNEL32.DLL破解？？？（译文） (8千字)
发信人:丁丁虾
时 间:2000-8-29 9:13:10
详细信息:
原标题：
Cracking using KERNEL32.DLL??
Amazing how things don't change!

原文：http://208.50.16.104/madmasu.htm

作者： madmax 翻译 DDXia[CCG]

丁丁虾有话说：（那还用问，肯定有是废话啦^_*)===如果你是高手，请使用暴力，JMP过去^_^

Crack也有段时间了，老是在想，一天到晚的Crack，（这小子开始吹牛，踞我所知，已有
3个月没有发市啦:) 什么嘛！我可是天天都到看雪论坛报到的哦）有没有好的办法能提高自己的
功力？很多人都关心。毕竟外国的CrAcK发展比较快，所以经常去外国网站，洋为中用嘛？
今天无意中看到一篇文章，有比较大的启发。好的东东，大家分享嘛！！！顺便说一声，英语不
是俺的母语（好象tKC也说过），也比较菜，翻译内容大概的意思应该都对吧！哈哈~~~~ :)

英文的原文：http://208.50.16.104/madmasu.htm

标题：使用KERNEL32.DLL破解？？？

介绍：

在Internet上有一个非常出色的游戏。。。Subspace，by VIE(Virgin)，(DDXia：好象没有听过)
最近刚拿到它的零售版，。。。。 零售版程序中含有CRC检查和内存驻留（时时检查）（DDXia：好怕怕哦）
我们应该如何CrAck？？？

工具：
Winice 3.22
Hiew 5.66
W32Dasm 8.9 (Regged helps)
API 知识 (有Win32.Hlp 就行)

游戏的 URL/FTP
http://subspace.vie.com/

教学
SubSpace，是一个已经发布了一段时间的在线游戏。在玩游戏过程很难作弊。。。这就是运行它的乐趣，
但不会玩这个游戏。现在游戏发行了零售版，在其中加入了CD-Check。。。啊哦！！来，坐下来开始CRACK，
如果你有零售版，你会发现游戏提示"请插入CD...."，并带有时间限制....哈哈~~~~~~....但有点我懂啦....
于是进入Winice。（DDXia：真是聪明！！）
BPX GetDriveTypeA （DDXia：一般，寻找CDROM都是使用这个API）

捕获、进入SubSpace的代码中....这个程序的CDCHEK步骤如下：（DDXia：重点之一，具有普遍性）

查CDROM的驱动器号-----------------------------GetDriveTypeA
获取CD的空间--------------------------------------GetDiskSpaceFreeA
如果等于零，那肯定是CD。
获取CD的标签 -------------------------------------GetVolumeInformationA
如果标签=='SUBSPACE' 那么 CD OK
打开 CD根目录的'INTRO.FLC'。 ---------------CreateFileA
如果存在， 那么 CD OK
获取INTRO.FLC的大小---------------------------GetFileSize?
比较它的大小
如果相等，就设一个标志。

既然大多数人读了这篇文章也不会去CRACK它，所以对原代码不会在这里贴出来。但最有趣的部分，也就是关键，
是如何绕过检测部分。我们可以通过HIEW来修改跳过，但有CRC 校验检测会中断程序，那么再补丁CRC检测，
可是内存中的还有动态校验....真的很难debug，在Winice中需要修改的断点就有0CCh（DDXia:换算过来就是204处,
哇！！我倒。。。。。。）.....该怎么办呢？？恩，考虑一下API Hooking，看来没有什么希望。再想一想，
.......TSR Crack！但是这可不是DOS环境啊！在Window中没有 AX=25XX, INT 21h功能，那么哪里是突破口呢？
.......YEAH ！Windows的本身。

有了这个想法，于是到IRC中发表（DDXia：外国的Cracker非常喜欢到IRC中交流），但是这个想法就好象
自己准备去修理一颗核弹，和内核玩简直就是发疯了（DDXia：呵呵~~~~~我还是非常欣赏他的冒险精神和创
造力）我们知道在SubSpace保护程序中，第一次调用的API是 GetDriveTypeA，这个API返回一个数值，
2代表软驱，3代表硬盘，5代表CDROM，（至于其他的数值，我们不关心）.....实际上，我们要象FAKECD
程序那样攻击它的保护....当用TSR模拟一个CD的时候，我们在硬盘中模拟那些必需的文件。

在Winice中，输入：
U GetDriveTypeA （DDXia：俺孤漏寡闻，可是第一听说这样用U命令啊！！！牢记在心！哈哈~~~~，
又学到一招）
将看到API被反汇编过的代码......下面的代码是其中的一部分，也可以静态反汇编kernel32.dll。但你看到的程序，
会有些莫名其妙的比较后，使用JMP跳转到其他的API：
（DDXia：也许代码部分会有不一样，那是因为kernel32.dll版本不同）

:BFF777C4 57 push edi
:BFF777C5 6A21 push 00000021
:BFF777C7 2BD2 sub edx, edx
:BFF777C9 68EFE2F9BF push BFF9E2EF
:BFF777CE 64FF32 push dword ptr fs:[edx]
:BFF777D1 648922 mov dword ptr fs:[edx], esp
:BFF777D4 8B7C2414 mov edi, dword ptr [esp+14]
:BFF777D8 0BFF or edi, edi
:BFF777DA 7407 je BFF777E3
:BFF777DC 2BC0 sub eax, eax
:BFF777DE 8D48FF lea ecx, dword ptr [eax-01]
:BFF777E1 F2 repnz
:BFF777E2 AE scasb

* Referenced by a Jump at Address:BFF777DA(C)
|
:BFF777E3 648F02 pop dword ptr fs:[edx]
:BFF777E6 83C408 add esp, 00000008
:BFF777E9 5F pop edi
:BFF777EA E9E5D4FFFF jmp BFF74CD4

在这个程序中，我们如何放入自己的代码呢？！？在JE处设BPX，结果是它会不断被中断。所以
BPX BFF777DA，然后运行 Explorer或者某些程序就会被BPX中断。你将看到什么都不做，也会中断！
所以我们敢肯定（这主要因为是微软写的代码）这段程序有点垃圾......让我们修改和优化它：
（游戏中第一次调用是检查C：）

:BFF777C4 57 xor edx,edx ; 标志位
:BFF777C5 6A21 mov eax,[esp] ; 得到正在调用的程序的地址
:BFF777C7 2BD2 cmp eax,413e6e ; 是否是游戏的CD-CHECK
:BFF777C9 68EFE2F9BF jnz BFF777EA ; 如果不是，继续
:BFF777CE 64FF32 mov [esp+4],eax ; 保存返回地址
:BFF777D1 648922 pop eax ; ESP+4
:BFF777D4 8B7C2414 mov eax,5 ; 返回5，表示我们是CDROM
:BFF777D8 0BFF ret
:BFF777DA 7407 je BFF777E3 ; 微软代码
:BFF777DC 2BC0 sub eax, eax ; 这里！
:BFF777DE 8D48FF lea ecx, dword ptr [eax-01]
:BFF777E1 F2 repnz
:BFF777E2 AE scasb

* Referenced by a Jump at Address:BFF777DA(C)
|
:BFF777E3 648F02 pop dword ptr fs:[edx]
:BFF777E6 83C408 add esp, 00000008
:BFF777E9 5F pop edi
:BFF777EA E9E5D4FFFF jmp BFF74CD4

你能看到，我们非常暴力的截取了这个API........每一次调用，我们都去 检查是否是被游戏调用.......非常简单！
现在我们欺骗它C:就是CDROM，我们再到磁盘剩余空间的检查：
（原程序和上面的很相相似，但也是很多垃圾....谁能解决？因为这段程序是大了点.....下面是新的改良过的
程序！）
（DDXia：不过在NT中就没有怎么多的程序废话了，比较紧凑，WIN98没有看过是如何的？）

:BFF778C5 2BD2 xor edx,edx ; 好象所有的微软都喜欢这代码呢？
:BFF778C7 68B8E2F9BF mov eax,[esp] ; 得到正在调用的程序地址
:BFF778CC 64FF32 cmp eax,491E22 ;是否是 SubSpace?
:BFF778CF 648922 jnz BFF77900 ;如果不是，继续
:BFF778D2 8B4C240C add esp,14h ; 修改堆栈，保证返回正常
:BFF778D6 E302 mov [esp],eax ; 返回指针
:BFF778D8 8A01 mov [esp+18],eax ; 这里是空间大小返回。（DDXia：我觉应该是edx，
而不是eax，也许是笔误）
:BFF778DA 8B4C2410 ret ; 返回
:BFF778DE E302 jcxz BFF778EA ; 剩下的代码不变
:BFF778E0 8B01 mov eax, dword ptr [ecx]
:BFF778E2 8B4C2414 mov ecx, dword ptr [esp+14]
:BFF778E6 E302 jcxz BFF778EA
:BFF778E8 8B01 mov eax, dword ptr [ecx]
:BFF778EA 8B4C2418 mov ecx, dword ptr [esp+18]
:BFF778EE E302 jcxz BFF778F2
:BFF778F0 8B01 mov eax, dword ptr [ecx]
:BFF778F2 8B4C241C mov ecx, dword ptr [esp+1C]
:BFF778F6 E302 jcxz BFF778FA
:BFF778F8 8B01 mov eax, dword ptr [ecx]
:BFF778FA 648F02 pop dword ptr fs:[edx]
:BFF778FD 83C404 add esp, 00000004
:BFF77900 E954D5FFFF jmp BFF74E59

这样看来，我们截获这段程序，同时强迫它返回磁盘剩余空间为零，C:象个CDROM.......现在剩下的就是标签检
查和文件检查.......这样简单，修改C：的标签为SUBSPACE，和还使用一小段ASM编的程序，我们编个大小为
37,433,486的文件..然后修改KERNEL32.DLL，重新启动。不停的画十字架吧，企求不要系统崩溃吧！！

后语：
这是非常有趣的CRACK的一种方法.....不过我从来没有看见任何一个人使用这种方法，也许是因为它太
冒险，同时还有一个兼容性的问题。我主要是想交流我发现的想法，（DDXia：YEAH！Crack的精神
所在，不断的探索和传播）也许在未来会考虑这种技术.....这主要的问题是修改了 KERNEL32.DLL，因为
它有许多的版本。如果Patch 所有的版本那简直就是发疯了。

非常惊奇的是无论DOS走多远， its roots still follow us in cracking!（DDXia：这句太难翻译了）

丁丁虾再说几句：（暴力法-----Crack第一式，牢记 EB----JMP，跳过、跳过、再跳过）
的确,有些疯狂，但他思考的方式和他的自创力都是值得学习！翻译的目的是希望大家能比较深层
的思考问题。
（丁丁虾长长地、长长地吐了一口气）终于完成翻译了！请多多指教！拜托啦！好久好久都没有
写过什么东东了！就当给大家的一份小小小的礼吧！！！现在凌晨1：00 还差10分钟。该收工了！

DDXia[CCG]
2000.8.29 01:50

标 题:任何patch都必须基于对程序的正确理解，显然这个作者并未对kernel32.dll中被改动的部分有透彻的了解，只是... (128字)
发信人:1212
时 间:2000-8-29 13:02:59
详细信息:

标题: 任何patch都必须基于对程序的正确理解，显然这个作者并未对kernel32.dll中被改动的部分有透彻的了解，只是赌了一把而已

内容:

标 题:较为安全的方法可使用EliCZ的APIHOOK 或 进入ring0 修改kernel32代码进行API Hook. (空)
发信人:D.Boy
时 间:2000-8-29 16:14:55
详细信息:


如何访问一个进程中的内存

 标 题:如何访问一个进程中的内存 （译文二） (34千字)
发信人:丁丁虾
时 间:2000-8-31 22:26:09
详细信息:
原标题：HOW TO ACCESS THE MEMORY OF A PROCESS
(i.e. Game Trainer,Process Patcher etc.)
Deep into window

如何访问一个进程中的内存（比如游戏补丁、进程补丁等）
深入window

作者： NaTzGUL a great cracker (as Quine pointed out long ago)
Email: natzgul@hotmail.com

译者： DDXia[CCG]

英文联接：http://gadget.lansg.com/fravia/natz_mp2.htm

丁丁虾前言：
在Crack工具八宝箱中有一种武器为内存动态补丁制作软件，如果不懂它们的原理，会觉得非常的不
可思义，于是在网上无意中看到了这篇教程，揭示了内存动态补丁的原理，以及带有一个简单范例。写的太
精彩了。希望大家看了，能有一些启发和想法，俺丁丁虾也知足了 ：D 。
在文章中对API的详细解释，因为随便找一本中文的API大全，就可以看个明白了，何况通晓API
也是CrAcKer基本功哦！所以就没有翻译。
顺便说一声，英语不是俺的母语（好象tKC也说过），也比较菜，翻译内容大概的意思应该都对吧！
哈哈~~~~ :) 如有误人子第的地方请指出。谢谢！

介绍：
是的！我又勤奋了=)
欢迎看我的新的教学篇。
这次的热点：如何访问进程中的内存，比如写 和读
其实也没有什么新意，但问题是在WIN95中，一个进程是不能访问另一个进程的内存的。
在这个教程中，我将演示一种方法如何绕过这个问题。
虽然许多人都在谈论这个问题，但是至今还是没有人能解决，无论如何，都是我填补这个问题做一些贡献
当然也包括一些例子，就是如何使用它去破解。

目标的 URL/FTP
目标：任何的EXE (FLAT MODEL !)

教学：
首先列出了我们将要用到的API （实际上这些API是用于调试）

KERNEL32!ReadProcessMemory
KERNEL32!WriteProcessMemory

下面是 win32.hlp中的描述：
--------------------------------------------------------------------------------
ReadProcessMemory功能是读取指定进程的内存。但是被读的区域必须是可以访问的，要不就操 作失败。

BOOL ReadProcessMemory(

HANDLE hProcess, // 被读内存的进程句柄
LPCVOID lpBaseAddress, // 开始读的地址
LPVOID lpBuffer, // 用于放数据的缓存地址
DWORD cbRead, //读取的字节数
LPDWORD lpNumberOfBytesRead // 从文件中实际读入的字符数
);

参数
hProcess

hProcess

Identifies an open handle of a process whose memory is read.
The handle must have PROCESS_VM_READ access to the process.

lpBaseAddress

Points to the base address in the specified process to be read.
Before any data transfer occurs, the system verifies that all data in the
base address and memory of the specified size is accessible for read access.
If this is the case, the function proceeds; otherwise, the function fails.

lpBuffer

Points to a buffer that receives the contents from the address space of
the specified process.

cbRead

Specifies the requested number of bytes to read from the specified process.

lpNumberOfBytesRead

Points to the actual number of bytes transferred into the specified buffer.
If lpNumberOfBytesRead is NULL, the parameter is ignored.

Return Value

If the function succeeds, the return value is TRUE.
If the function fails, the return value is FALSE.
To get extended error information, call GetLastError.
The function fails if the requested read operation crosses into an area of
the process that is inaccessible.

Remarks

ReadProcessMemory copies the data in the specified address range from the
address space of the specified process into the specified buffer of the
current process.
Any process that has a handle with PROCESS_VM_READ access can call the function.
The process whose address space is read is typically, but not necessarily,
being debugged.
The entire area to be read must be accessible.
If it is not, the function fails as noted previously.

--------------------------------------------------------------------------------
The WriteProcessMemory function writes memory in a specified process.
The entire area to be written to must be accessible, or the operation fails.

BOOL WriteProcessMemory(

HANDLE hProcess, // handle of process whose memory is written to
LPVOID lpBaseAddress, // address to start writing to
LPVOID lpBuffer, // address of buffer to write data to
DWORD cbWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // actual number of bytes written
);

Parameters

hProcess

Identifies an open handle of a process whose memory is to be written to.
The handle must have PROCESS_VM_WRITE and PROCESS_VM_OPERATION access to the process.

lpBaseAddress

Points to the base address in the specified process to be written to.
Before any data transfer occurs, the system verifies that all data in the base address
and memory of the specified size is accessible for write access.
If this is the case, the function proceeds; otherwise, the function fails.

lpBuffer

Points to the buffer that supplies data to be written into the address space of the
specified process.

cbWrite

Specifies the requested number of bytes to write into the specified process.

lpNumberOfBytesWritten

Points to the actual number of bytes transferred into the specified process.
This parameter is optional. If lpNumberOfBytesWritten is NULL, the parameter is ignored.

Return Value

If the function succeeds, the return value is TRUE.
If the function fails, the return value is FALSE.
To get extended error information, call GetLastError.
The function will fail if the requested write operation crosses into an area
of the process that is inaccessible.

Remarks

WriteProcessMemory copies the data from the specified buffer in the current process
to the address range of the specified process.
Any process that has a handle with PROCESS_VM_WRITE and PROCESS_VM_OPERATION access
to the process to be written to can call the function.
The process whose address space is being written to is typically, but not necessarily,
being debugged.
The entire area to be written to must be accessible.
If it is not, the function fails as noted previously.

--------------------------------------------------------------------------------
教程： 调用它用到的参数

HANDLE hProcess = ? // 进程的句柄
LPVOID lpBaseAddress, =自己指定 // 开始读写的地址
LPVOID lpBuffer, =自己指定 //读写数据的缓冲地址
DWORD cbWrite, =自己指定 // 需要读写的字节
LPDWORD lpNumberOfBytesWritten = NULL // 实际上读写的字节

现在看起来已经很有希望了 呵呵~~~~;)
关键是需要得到我们想访问的进程句柄。
一个进程可以通过调用"KERNEL32!GetCurrentProcess" 获得自己的 pseudo-handle (假句柄)
通过这个 pseudo-handle（句柄）可以获得最大的访问权限。

如果我们想访问，我们必须开启另一个不同的进程。
我知道有两种方法可以获得另一个进程的句柄：
1、使用 USER32!FindWindowA,USER32!GetWindowThreadProcessId and KERNEL32!OpenProcess
2、使用KERNEL32!CreateProcess

方法一：
Game Trainer就是通过这种方法（DDXia：可能是一个游戏修改器）

在WIN95中进程也象其他东东一样是一个对象，这就意味着我们可以通过
"KERNEL32!OpenProcess"得到句柄，最后，不要忘记使用 "BOOL KERNEL32!CloseHandle (hProcess)" Close。否则当程序中断时进程的映象会留在内存中浪费空间。

下面是 win32.hlp中的描述：
--------------------------------------------------------------------------------

功能：返回现有进程对象的句柄

HANDLE OpenProcess(

DWORD fdwAccess, // access flag
BOOL fInherit, // handle inheritance flag
DWORD IDProcess // process identifier
);

Parameters

fdwAccess

Specifies the access to the process object. For operating systems that support security
checking, this access is checked against any security descriptor for the target process.
Any combination of the following access flags can be specified in addition to
the STANDARD_RIGHTS_REQUIRED access flags:

Access Description
PROCESS_ALL_ACCESS Specifies all possible access flags for the process object.
PROCESS_CREATE_PROCESS Used internally.
PROCESS_CREATE_THREAD Enables using the process handle in the
CreateRemoteThread function to create a thread in the process.
PROCESS_DUP_HANDLE Enables using the process handle as either the source
or target process in the DuplicateHandle function to
duplicate a handle.
PROCESS_QUERY_INFORMATION Enables using the process handle in the
GetExitCodeProcess and GetPriorityClass functions
to read information from the process object.
PROCESS_SET_INFORMATION Enables using the process handle in the SetPriorityClass
function to set the priority class of the process.
PROCESS_TERMINATE Enables using the process handle in the TerminateProcess
function to terminate the process.
PROCESS_VM_OPERATION Enables using the process handle in the VirtualProtectEx
and WriteProcessMemory functions to modify the virtual
memory of the process.
PROCESS_VM_READ Enables using the process handle in the ReadProcessMemory
function to read from the virtual memory of the process.
PROCESS_VM_WRITE Enables using the process handle in the
WriteProcessMemory function to write to the virtual
memory of the process.
SYNCHRONIZE Windows NT: Enables using the process handle in any of
the wait functions to wait for the process to terminate.

fInherit

Specifies whether the returned handle can be inherited by a new process created by
the current process. If TRUE, the handle is inheritable.

IDProcess

Specifies the process identifier of the process to open.

Return Value

If the function succeeds, the return value is an open handle of the specified process.
If the function fails, the return value is NULL. To get extended error information,
call GetLastError.

Remarks

The handle returned by the OpenProcess function can be used in any function
that requires a handle to a process, provided the appropriate access rights
were requested.

--------------------------------------------------------------------------------
教程： 调用它用到的参数

DWORD fdwAccess = PROCESS_ALL_ACCESS (Thx to Micro$oft ;) // 访问标志
BOOL fInherit = FALSE // 句柄继承标志
DWORD IDProcess = ? // 进程标志

使用 "KERNEL32!GetCurrentProcessId"得到当前进程的ID号
为了得到另一个进程的ID号，我们必须再次执行它。
为了找出现有的某个进程，我们得调用USER32!FindWindowA，它能够通过查找窗口的标题，
然后返回该窗口的句柄。利用这个窗口句柄，我们再调用GetWindowThreadProcessId去获得
该进程的ID。

下面是 win32.hlp中两个API的描述：
--------------------------------------------------------------------------------
The FindWindowA function retrieves the handle of the top-level window whose class name
and window name match the specified strings. This function does not search child windows.

HWND FindWindowA(

LPCTSTR lpClassName, // address of class name
LPCTSTR lpWindowName // address of window name
);

Parameters

lpClassName

Points to a null-terminated string that specifies the class name or is an atom that
identifies the class-name string. If this parameter is an atom, it must be a global
atom created by a previous call to the GlobalAddAtom function.
The atom, a 16-bit value, must be placed in the low-order word of lpClassName;
the high-order word must be zero.

lpWindowName

Points to a null-terminated string that specifies the window name (the window's title).
If this parameter is NULL, all window names match.

Return Value

If the function succeeds, the return value is the handle of the window that has the
specified class name and window name.
If the function fails, the return value is NULL. To get extended error information,
call GetLastError.

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

教程： 调用它用到的参数

LPCTSTR lpClassName = NIL //类名的指针
LPCTSTR lpWindowName = 自己指定 // 窗口名的指针

--------------------------------------------------------------------------------
The GetWindowThreadProcessId function retrieves the identifier of the thread that
created the specified window and, optionally, the identifier of the process that
created the window. This function supersedes the GetWindowTask function.

DWORD GetWindowThreadProcessId(

HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);

Parameters

hWnd

Identifies the window.

lpdwProcessId

Points to a 32-bit value that receives the process identifier.
If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the
process to the 32-bit value; otherwise, it does not.

Return Value

The return value is the identifier of the thread that created the window.

--------------------------------------------------------------------------------
教程： 调用它用到的参数

HWND hWnd = 从 FindWindowA返回的结果 //窗口的句柄
LPDWORD lpdwProcessId = 自己指定 // 保存进程ID变量的地址

现在我们有能力可以写一个函数，使用它来访问进程。这个函数我用Delphi3写的。如果某人问我要汇编或者是
C版本的，我也会写一个给你的，但这次我实在是太懒了;) 总之，不是很难写的。
以下为Delphi写的函数：

--------------------------------------------------------------------------------
(This function will in most cases find its use in a trainer i think)

type access_info = record
error :integer;
hwindow :integer;
thread_id :integer;
process_id :integer;
hprocess :integer;
end;

function AccessProcess ( access_type :integer;
wtitle :string;
address :integer;
buffer :PByteArray;
b_count :integer
):access_info;

var temp :integer;

begin result.error:=0;

if wtitle'' then

begin result.hwindow:=FindWindowA (nil,pchar(wtitle));
if result.hwindow0 then
begin result.thread_id:=GetWindowThreadProcessId (result.hwindow,@result.process_id);
result.hprocess:=OpenProcess (PROCESS_ALL_ACCESS,false,result.process_id);
if result.hprocess0 then
begin temp:=0;
case access_type of
0 : ;
1 : if not(ReadProcessMemory (result.hprocess,pointer(address),buffer,b_count,temp)) then
result.error:=4;
2 : if not(WriteProcessMemory (result.hprocess,pointer(address),buffer,b_count,temp)) then
result.error:=5;
else result.error:=6;
end;
CloseHandle (result.hprocess);
end
else result.error:=3;
end
else result.error:=2;
end
else result.error:=1;
end;

函数的访问类型：

0 = 仅仅是获得信息
1 = 读
2 = 写

出错信息代码：

0 = 正确
1 = 窗口标题是空的。
2 = 不能找到指定标题的窗口
3 = 不能打开进程
4 = 读错误
5 = 写错误
6 = 不支持写类型

--------------------------------------------------------------------------------
方法2：

在这一节中我们将去写一个进程补丁（ Process Patcher）。
以下是需要实行的步骤：
- 得到命令行
- 创建新的进程和处理命令行
- 等待 直到进程初始化完成
- 补丁进程
- 最后终止并单独留下新的进程

进程补丁将非常有用，如果。。。。。

1、程序是被压缩的 (如 Shrinker)
2、程序是被加密的(如 PE-Crypt)
3、在程序执行过程中有 CRC-Check
4、不在乎用其他的方式修改程序

使用进程补丁工具你不用关心程序本身，因为它会象这个教程中的第一种方法，进行修改进程。不
同的是我们不需要再指定窗口的标题，因为我们将通过使用KERNEL32!CreateProcess (with PROCESS_ALL_ACCESS)，从被返回的结果中 获得进程的句柄。

现在让我们实现每一步：

得到命令行：
-----------------------------

如果你已经把patcher.exe重命名为 app.exe，也许会有些帮助。
这种方法 app将会从补丁程序中接收到命令行，从而补丁程序对这个子进程是完全透明。

备注： 如果在exe中app执行CRC-Check，就不需要更改名字!!!!!
否则它会在补丁程序中进行检测，那也是符合逻辑的;) （DDXia：也有点糊涂，于是搬出原文


SoftICE中的断点

 标 题:已经找到几种解决在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免得麻烦。


pklite32、Shrinker 3.4 和 NeoLite

 标 题:怎样脱pklite32， Shrinker 3.4 和 NeoLite加的壳(3千字)
发信人:lis
时 间:2000-7-31 15:59:15
详细信息:
脱壳----对用pklite32加壳的程序进行手动脱壳
目标文件： pklite32w.exe
加壳方式： pklite32
所用工具： trw2000 v1.22
作者： iis / 属于梦醒时分[http://hacking.wofly.com]

1.用trw2000的Loader加载加壳程序。

2.按一下f10,将停在下面的地方，
0167:00607005 PUSH DWORD 00627F84 《——停在这里,一直按f10
0167:0060700A PUSH DWORD 00
0167:0060700F CALL 00627F84
0167:00607014 JMP 004117B0 《——执行完这个指令，执行命令makepe 文件名
0167:00607019 INC EAX
0167:0060701A SUB [EBX],AH

3.脱壳成功。

脱壳----对用Shrinker 3.4加壳的程序进行手动脱壳

加壳方式： Shrinker 3.4
所用工具： trw2000 v1.22
作者： iis / 属于梦醒时分[http://hacking.wofly.com]
1.用trw2000的Loader加载加壳程序。

2.按一下f10,将停在下面的地方，

0167:004365AF PUSH EBP 《——停在这里
0167:004365B0 MOV EBP,ESP
0167:004365B2 PUSH ESI
0167:004365B3 PUSH EDI
0167:004365B4 JNZ 00436621
0167:004365B6 PUSH DWORD 0100
0167:004365BB CALL 004370D1

3.一直按f10,

0167:00436619 CALL `KERNEL32!GetModuleFileNameA`
0167:0043661F JMP SHORT 00436624
0167:00436621 MOV ESI,[EBP+08]
0167:00436624 CALL 00435000
0167:00436629 PUSH DWORD [EBP+10]
0167:0043662C PUSH DWORD [EBP+0C]
0167:0043662F PUSH ESI
0167:00436630 CALL 0043663B 《——按f8进入
0167:00436635 POP EDI
0167:00436636 POP ESI
0167:00436637 POP EBP
0167:00436638 RET 0C

4.再按f10到达下面的地方，

0167:0043667C INC DWORD [004311C0]
0167:00436682 CALL 00435CB2 《——此处将弹出一个消息框，按‘是‘将返回tr
w2000.
0167:00436687 MOV ESI,[004311C0]
0167:0043668D TEST ESI,ESI
0167:0043668F JZ 004366FF
0167:00436691 CMP DWORD [004311C4],BYTE +00
0167:00436698 JNZ 004366C0
0167:0043669A CMP DWORD [00433774],BYTE +00
0167:004366A1 JZ 004366C0
0167:004366A3 MOV EAX,[00433774]
0167:004366A8 ADD EAX,[00433898]
0167:004366AE MOV [EBP-20],EAX
0167:004366B1 PUSH DWORD [EBP+10]
0167:004366B4 PUSH DWORD [EBP+0C]
0167:004366B7 PUSH DWORD [EBP+08]
0167:004366BA CALL NEAR [EBP-20] 《——按f8进入后，执行命令makepe 文件名
0167:004366BD MOV [EBP-1C],EAX
5.脱壳成功。

脱壳----对用NeoLite加壳的程序进行手动脱壳

目标文件： NeoLite（2.0）.exe
加壳方式： NeoLite
所用工具： trw2000 v1.22
作者： iis / 属于梦醒时分[http://hacking.wofly.com]

1.用trw2000的Loader加载加壳程序。

2.将停在下面的地方，
0167:0041C1A8 JMP 0041C253 《——停在这里
0167:0041C1AD MOV EAX,A80041DA
0167:0041C1B2 ROL BYTE [ECX+00],AC
0167:0041C1B6 ROL BYTE [ECX+00],00
0167:0041C1BA ADD [EAX],AL
0167:0041C1BC ADD [EAX+6A00004A],BH
0167:0041C1C2 RET 41
3.一直按f10,
0167:0041C262 INC BYTE [0041C252]
0167:0041C268 JMP EAX 《——跳到真正的入口点
0167:0041C26A CMP BYTE [0041C252],00
0167:0041C271 JNZ 0041C286
4.跳到下面地方，
0167:004073F3 PUSH EBP 《——跳到这，执行命令makepe 文件名
0167:004073F4 MOV EBP,ESP
0167:004073F6 PUSH BYTE -01
0167:004073F8 PUSH DWORD 0040D1A0
0167:004073FD PUSH DWORD 00409A3C
0167:00407402 MOV EAX,[FS:00]
0167:00407408 PUSH EAX
5.脱壳成功。


加壳标志

 标 题:有关判断各种软件加壳标志的方法------在PECompact中找到的。 (6千字)
发信人:ljttt
时 间:2000-8-7 11:51:07
详细信息:
有关判断各种软件加壳标志的方法------在PECompact中找到的。

作者： 该职位空缺，有意者可与本人联系。限额一名，MM优先。
写作日期： 2000-08-06

【前言】
在掌握了对PECompact v1.40b1的脱壳后，一直没太注意这个软件。今天为了寻找一下该压缩加壳软件的加壳标志，就又重新找出来了。跟踪一遍才发现，程序编的简洁高效。（看来作者很了不起哦，有可能是用Win32ASM编写的，当然跟踪起来很方便了，不象跟踪有些软件，就象到垃圾场里去捡垃圾。）不过有意思的是该软件对其他压缩软件已经加壳过的程序不再加壳，哈哈，这样剩了我不少时间，不用一一去分析其他加壳软件的加壳标志了。从这里找就是了。（注：当然这种方法找出的标志不一定有用。因为加壳软件其自身的判断标准可能与此不同。这个软件说不定也是找一种偷懒的方法来判断的。和我一样 --- 哈哈，两个懒虫，一个不如一个。:-) ）

以下是我找到的程序分析加壳标志的代码部分。我加了点注释。（也可能与实际有出入，懒得去验证了）

●第一部分：主程序代码
:0040385D 66813E5045 cmp word ptr [esi], 4550 <--这里当然是判断是否是可执行文件的PE标志了
:00403862 0F85FF000000 jne 00403967 <--不同，那还有戏唱...
:00403868 833DC9A3400001 cmp dword ptr [0040A3C9], 00000001
:0040386F 740D je 0040387E
:00403871 817E0C5045434F cmp dword ptr [esi+0C], 4F434550 <--判断是否是 'PECO'，这是PECompact加壳的标志
:00403878 0F841C010000 je 0040399A <--相等，那还用说，自然去显示你的程序被加壳了。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040386F(C)
|
:0040387E 56 push esi
:0040387F E8E42F0000 call 00406868 <--该调用测试是否被NeoLite加壳了
:00403884 0F820E020000 jb 00403A98 <--小于0，说明加壳了
:0040388A 56 push esi
:0040388B E8B72F0000 call 00406847 <--该调用测试是否被BitArts加壳了
:00403890 0F8228020000 jb 00403ABE <--小于0，说明加壳了
:00403896 56 push esi
:00403897 E8762F0000 call 00406812 <--该调用测试.....自已看E文吧....The selected file appears to have already a symbiote of some type installed, it may or may not function after compression.
:0040389C 0F8242020000 jb 00403AE4 <--小于0，.....看懂了上面的话，自己来说吧！干嘛！

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00403AE8(C), :00403B03(C)
|
:004038A2 0FB74614 movzx eax, word ptr [esi+14]
:004038A6 83C018 add eax, 00000018
:004038A9 03C6 add eax, esi <--EAX定位到Section的Name指针处
:004038AB 81382E736872 cmp dword ptr [eax], 7268732E <--判断是否是 '.shr'，测试是否被Shrinker加壳了
:004038B1 0F8495010000 je 00403A4C <--相等，以后我懒得说了
:004038B7 813855505830 cmp dword ptr [eax], 30585055 <--判断是否是 'UPX0'，测试是否被UPX加壳了
:004038BD 0F84AF010000 je 00403A72
:004038C3 56 push esi
:004038C4 E8E02E0000 call 004067A9
:004038C9 81382E575750 cmp dword ptr [eax], 5057572E <--判断是否是 '.WWP'，测试是否被WWPack32加壳了
:004038CF 0F8417010000 je 004039EC
:004038D5 83E828 sub eax, 00000028
:004038D8 81382E617370 cmp dword ptr [eax], 7073612E <--判断是否是 '.asp'，测试是否被ASPack加壳了
:004038DE 0F8446010000 je 00403A2A
:004038E4 81382E706B6C cmp dword ptr [eax], 6C6B702E <--判断是否是 '.pkl'，测试是否被PKLite32加壳了
:004038EA 0F841B010000 je 00403A0B

●第二部分：子程序代码部分

①第一个子程序段
* Referenced by a CALL at Address:
|:0040387F
|
:00406868 C8000000 enter 0000, 00
:0040686C 60 pushad
:0040686D FF7508 push [ebp+08]
:00406870 E834FFFFFF call 004067A9 <--该调用返回Sections的Name的指针到EAX
:00406875 81382E6E656F cmp dword ptr [eax], 6F656E2E <--判断是否是 '.neo'，这是加壳标志
:0040687B 7406 je 00406883 <--相等，加壳了
:0040687D 61 popad
:0040687E F8 clc
:0040687F C9 leave
:00406880 C20400 ret 0004

②第二个子程序段
* Referenced by a CALL at Address:
|:0040388B
|
:00406847 C8000000 enter 0000, 00
:0040684B 60 pushad
:0040684C FF7508 push [ebp+08]
:0040684F E855FFFFFF call 004067A9 <--该调用返回Sections的Name的指针到EAX
:00406854 813842697441 cmp dword ptr [eax], 41746942 <--判断是否是 'BitA'，这是BitArts加壳标志
:0040685A 7406 je 00406862
:0040685C 61 popad
:0040685D F8 clc
:0040685E C9 leave
:0040685F C20400 ret 0004

③跳转后的显示部分，这还用去解释吗？
:00403A98 837D1001 cmp dword ptr [ebp+10], 00000001
:00403A9C 0F8515FFFFFF jne 004039B7
:0040399A 837D1001 cmp dword ptr [ebp+10], 00000001
:0040399E 7517 jne 004039B7
:004039A0 6A10 push 00000010

* Possible StringData Ref from Code Obj ->"PECompact v1.40b1, "
|
:004039A2 6808B24000 push 0040B208

* Possible StringData Ref from Code Obj ->"File appears to already be compressed."
|
:004039A7 68BBB24000 push 0040B2BB
:004039AC FF351CB94000 push dword ptr [0040B91C]
:004039B2 E8CD090000 call 00404384

【后记】
我们已经知道了PECompact判断的方法，修改跳转就很简单了。我用Notepad.exe加壳后测试了一下，加一道壳，有三个Sections，加两道壳，又加了二个Section，以后再加壳，就没加Section了。yi,是不是PECompact开始只做表面功夫了，我一下加了八道壳，开始跟踪，结果在内存中跳来跳去的，我头也跟晕了....。又加了几十道壳，Notepad.exe开始变得越来越肥大，但还可以运行。以后有时间再分析分析其他加壳软件的加壳标志，然后来个交叉加壳。每个各加三遍..........然后再............。老天，以后你不会用这种方法加壳你的软件来对付我吧........@#$@#$@ 昏倒...@#$@#$@#$。

补充：从跟踪ASPack v2.1和ASProtect v1.0的情况来看，好象PECompact检测加壳标志的方法与其自身判断方法不同哦。

标 题:修补PECompact v1.41b1使之可以反复加壳的方法----这是SE??什么方法的吧？别写错了。不然文化局的同志就来了。 (2千字)
发信人:ljttt
时 间:2000-8-7 11:53:58
详细信息:

修补PECompact v1.41b1使之可以反复加壳的方法----这是SE??什么方法的吧？别写错了。不然文化局的同志就来了。

作者： 该职位空缺，有意者可与本人联系。限额一名，MM优先。
写作日期： 2000-08-07

【前言】
昨天，找到了PECompact v1.41b1判断其加壳标志的地方。今天继续追踪。

从前文中知道只要改变跳转方向可以使PECompact v1.41b1反复加壳。

:00403871 817E0C5045434F cmp dword ptr [esi+0C], 4F434550 <--判断是否是 'PECO'，这是PECompact加壳的标志
:00403878 0F841C010000 je 0040399A <--就是要改这里

不巧的是，在分析其他软件的过程中改动了日期，这次分析时PECompact跳出框框来说俺使用过期了。哈！真是没事找事，正好一起作手术！我偷懒没有去分析注册的方法。（其实不偷懒也未必找得到，现在俺的破解功夫早已成了花架子了）只是简单地让他不过期就行了。找到以下一处代码：（至于其他判断过期的地方，我就没有去管了，刚看了Predator做内科手术的方法，我也想试试这种Patch的方法。）

:00405262 6883A24000 push 0040A283

* Reference To: KERNEL32.GetLocalTime, Ord:00F5h
|
:00405267 E80F270000 Call 0040797B
:0040526C 66813D83A24000D007 cmp word ptr [0040A283], 07D0
:00405275 750A jne 00405281
:00405277 66833D85A2400007 cmp word ptr [0040A285], 0007
:0040527F 761C jbe 0040529D <--我要改这里的跳转方向，不跳就Game Over了。

先找到脱壳后可以让我加入Patch代码的地方。找到340处，这里宽敞明亮，适合居住。
然后，来找找芝麻开门的地方。

00008090 6A00FFD0 FFA59A21 4000619D 68007041 j......!@.a.h.pA
000080A0 00C30000 40000080 41000000 00100000 ....@...A.......

这里的809D - 80A0的字节为 00704100，对应长整数为00417000，正好是脱壳第四层的入口点。三层壳过后代码已经还原，好！这里可以设计大门，让他到我家坐坐再走。
把00704100改为40034000。

现在再来设计我们的居室 （Patch代码）

C7057838400090909090 mov dword ptr [00403878],90909090
66C7057C3840009090 mov word ptr [0040387C],9090
C6057F524000EB mov byte ptr [0040527F],EB
6800704100 push 00417000
C3 ret

把此处十六进制代码加入340处。（注：此方法是对未脱壳的PECompact而言，什么？你拿脱壳后的PECompact.EXE来做手术，完了！病人死定了。）

测试，OK!怎么PECompact.EXE没判断CRC的地方。

【后记】
这种动内科手术的方法确实高效。几行代码就搞定了，不用又去启动C++Builder了，让我的老老爷机也轻松了一把。


ProcDump脚本

 标 题:先把PECompact1.34和UPX1.01和Aspack2.1的脚本让你们测试。有哪位高手已经用ProcDump写了针对AspProtect v1... (789字)
发信人:ljttt
时 间:2000-7-23 17:29:48
详细信息:

 标题: 先把PECompact1.34和UPX1.01和Aspack2.1的脚本让你们测试。有哪位高手已经用ProcDump写了针对AspProtect
  v1.0的Script？不知道写Script的方法是否可行？

内容:
[4'My PECompact v1.34]
L1=OBJR
L2=LOOK 9C,60
L3=BP
L4=WALK
L5=OBJR
L6=LOOK C3
L7=BP
L8=WALK
L9=OBJR
LA=LOOK 61,9D,50,68,??,??,??,??,C2,04,00
LB=BP
LC=STEP
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

[2'My Aspack2.??-2.1]
L1=OBJR
L2=LOOK EB
L3=BP
L4=WALK
L5=OBJR
L6=LOOK 61,75,08,B8,??,??,??,??,C2,0C,00
L7=BP
L8=STEP
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

[1'My Upx1.01]
L1=OBJR
L2=LOOK EB,10
L3=WALK
L4=OBJR
L5=LOOK 61,E9
L6=BP
L7=STEP
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000


aspack 2.000

标 题:破 aspack 2.000
发信人:陈正颖(台湾)
时 间:2000-7-4 21:03:10
详细信息:

工具 : softice, FrogICE ,procdump, Process Patcher , topo , Offset Converter

Process Patcher 到这边抓

http://156.17.4.138/~mwd/playtools/patchers/memory/ppatcher.zip

FrogICE 到这边抓

http://kontum.vietmedia.com/protools/files/debuggers/frogsice.zip

topo 到这边抓

http://156.17.4.138/~mwd/playtools/exe-tools/topo.zip

Offset Converter 到这边抓

http://kontum.vietmedia.com/protools/files/utilities/oc.zip

程式 : aspack 2.000

请到这边抓http://kenchen.bizland.com/zip/aspack2000.zip

前言 : 这个 aspack 2.000 是一个加壳软体 , 专帮软体加壳

不过还是比不上 UPX, 加壳之后档案比 UPX 稍大一点

但也还不错用啦 .

有 30 天的限制 , 没有地方输入注册码 , 推测应该是读一个

keyfile, 类似 ultraedit 那样 , 程式一启动就读一个档案

不过我不知道是读哪一个 , 用 regmon, filemon 好像也不知道

看有没有人能够找到 ...

而且此程式本身有加壳 , 很可惜的 , 我脱不了壳 , 只好借助

其他的工具 , 而我想出了三种破解的方法 , 将一一展示给各位看官

我的 aspack.exe 大小是 231424 byte

若不一样大小 , 就是版本不同了

, ok, go!!

1: 安装完之后 , 一执行 aspack, 就出现 有常驻 debugger 之类的讯息

hmm, 会侦测 softice, 好吧 , 用 FrogICE 去欺骗他 , 执行 FrogICE,

可执行 aspack 了 , 关闭 aspack, 调日期 , 往后调个一年好了 ,

执行 aspack, 告诉我过期了 ... 将日期调回来 , 还是不行 ...

那他是如何知道我把日期调回来呢 ? 是如何知道我过期呢 ?

我就开始猜了 , 是纪录在 registry 吗 ? 那就执行 regedit.exe

( 不会有人不知道这个档案在哪里吧 ? 在 c:\windows 底下 )

找 aspack, 结果在 \HKEY_CURRENT_USER\software\aspack 找到了

干掉他吧 , 整个目录干掉了 ...

执行 aspack, 没有日期的限制了 , 这是我的第一个方法破解 aspack

2: 当然 , 这样只是没有日期的限制 , 但他会侦测 debugger, 如 softice

在想办法把他干掉吧 ...

不过在安装一次 aspack , 让他有日期的限制 ,

再来就要用 softice 的 symbol loader 来载入 , 不过一载入就跑出一个

MessageBox, 写著 debugger detection , 无法载入 ...

3: 这种软体一定要载入才行 , 因为他有加壳 , 执行 procdump, 按一下 PE Editor

的按钮 , 开启 aspack.exe , 按一下 section 的按钮 , 出现 aspack.exe 的 section

将卷轴拉下 , 点一下任何一个 section , 按滑鼠右键 , 选 Edit section

section character 的栏位是 C0000040, 改成 E0000020,

用此法 , 将所有的栏位通通改成 E0000020, 这样就可以用 symbol loader 载入了 ,

ok, 载入之后 ,

:00466001 60 PUSHAD

:00466002 E801000000 CALL 00466008 ; 到这边一定要按 F8,

; 不然就过去了

:00466007 90 NOP

:00466008 5D POP EBP

继续 trace, 一直按 F10,

:00466009 81EDF3C54400 SUB EBP,0044C5F3

:0046600F BBECC54400 MOV EBX,0044C5EC

:00466014 03DD ADD EBX,EBP

:00466016 2B9D80D24400 SUB EBX,[EBP+0044D280]

:0046601C 83BD68D1440000 CMP DWORD PTR [EBP+0044D168],00

:00466023 899DCECE4400 MOV [EBP+0044CECE],EBX

:00466029 0F8573090000 JNZ 004669A2

:0046602F 8D8570D14400 LEA EAX,[EBP+0044D170]

:00466035 50 PUSH EAX

:00466036 FF95BCD24400 CALL [EBP+0044D2BC]

:0046603C 89856CD14400 MOV [EBP+0044D16C],EAX

:00466042 8BF8 MOV EDI,EAX

:00466044 8D9D7DD14400 LEA EBX,[EBP+0044D17D]

:0046604A 53 PUSH EBX

:0046604B 50 PUSH EAX

:0046604C FF95B8D24400 CALL [EBP+0044D2B8]

:00466052 898588D24400 MOV [EBP+0044D288],EAX

:00466058 8D9D8AD14400 LEA EBX,[EBP+0044D18A]

:0046605E 53 PUSH EBX

:0046605F 57 PUSH EDI

:00466060 FF95B8D24400 CALL [EBP+0044D2B8]

:00466066 89858CD24400 MOV [EBP+0044D28C],EAX

:0046606C 8B85CECE4400 MOV EAX,[EBP+0044CECE]

:00466072 898568D14400 MOV [EBP+0044D168],EAX

:00466078 6A04 PUSH 04

:0046607A 6800100000 PUSH 00001000

:0046607F 6875090000 PUSH 00000975

:00466084 6A00 PUSH 00

:00466086 FF9588D24400 CALL [EBP+0044D288]

:0046608C 898584D24400 MOV [EBP+0044D284],EAX

:00466092 8D9DAFC64400 LEA EBX,[EBP+0044C6AF]

:00466098 50 PUSH EAX

:00466099 53 PUSH EBX

:0046609A E899090000 CALL 00466A38

:0046609F 8BC8 MOV ECX,EAX

:004660A1 8DBDAFC64400 LEA EDI,[EBP+0044C6AF]

:004660A7 8BB584D24400 MOV ESI,[EBP+0044D284]

:004660AD F3A4 REPZ MOVSB

; 执行这一行时 , 画面会一闪 , 因为他会改变自己的程式码 ,

; 看一下 ESI, 和 EDI, 和 ECX 的值吧 , SMC(self modifying code) 的技巧

4: 之后的 trace , 可真是 trace 的莫名其妙 , 因为他会跳来跳去 , 程式码随时在变

他总是跳到不太对的地方 , 跳的真是怪怪的 , 相信有 trace 过的人都会知道

而且好几次 , 遇到 call xxxxxxxx , 就已经跑出来一个 debugger detection

只好重新再载入 ... 真的是相当繁琐 , 只好用一些技巧了 ...

后来总算来到一个地方 , 快要跳出这个 call 了 , 若觉得太烦了 , 可下

g 4664dd , 可直接跑到 cs:4664dd 这边

:004664DD 6801F0C100 PUSH 00C1F001

:004664E2 C3 RET

5: 走完了 , 来到了

014F:00C1F001 60 PUSHAD

014F:00C1F002 E844060000 CALL 00C1F64B

014F:00C1F007 EB44 JMP 00C1F04D

014F:00C1F009 0000 ADD [EAX],AL

继续 trace 到了

014F:00C1F107 50 PUSH EAX

014F:00C1F108 C3 RET

就走完这个 call 了

6:

到了这边

014F:00C1F30D 8B9D192A4400 MOV EBX,[EBP+00442A19]

014F:00C1F313 0BDB OR EBX,EBX

014F:00C1F315 740A JZ 00C1F321

014F:00C1F317 8B03 MOV EAX,[EBX]

014F:00C1F319 87851D2A4400 XCHG EAX,[EBP+00442A1D]

014F:00C1F31F 8903 MOV [EBX],EAX

继续 trace 到了

014F:00C1F5D0 683C15C100 PUSH 00C1153C

014F:00C1F5D5 C3 RET

就走完这个 call 了

7:

到了这边 , 继续 trace

014F:00C1153C 55 PUSH EBP

014F:00C1153D 8BEC MOV EBP,ESP

014F:00C1153F 83C4F4 ADD ESP,-0C

014F:00C11542 E8B91AFFFF CALL 00C03000

014F:00C11547 0F854F29FFFF JNZ 00C03E9C

014F:00C1154D E8062EFFFF CALL 00C04358

014F:00C11552 E82154FFFF CALL 00C06978

014F:00C11557 E8F871FFFF CALL 00C08754

014F:00C1155C E8EFC7FFFF CALL 00C0DD50

014F:00C11561 E8CAFFFFFF CALL 00C11530

014F:00C11566 E83129FFFF CALL 00C03E9C

; 到了这边 , 只要按一下 F10, 立刻出现 debugger detection 的讯息

014F:00C1156B 8BE5 MOV ESP,EBP

014F:00C1156D 5D POP EBP

014F:00C1156E C20C00 RET 000C

8: 所以啦 , 再 load 一次 , 一 load, 立刻下 g c11566 , 以节省时间 , 到了之后

立刻按 F8, 进入这个 call 去 trace

到了这边

014F:00C1132C 648920 MOV FS:[EAX],ESP

014F:00C1132F 8B4508 MOV EAX,[EBP+08]

014F:00C11332 E88DFBFFFF CALL 00C10EC4

; 一走到这边 , 一按 F10, 立刻出现 debugger detection 的讯息

; 所以这个 call 一定有问题

014F:00C11337 33C0 XOR EAX,EAX

014F:00C11339 5A POP EDX

014F:00C1133A 59 POP ECX

9:

再 load 一次 , 一 load, 立刻下 g c11332 , 到了之后

立刻按 F8, 进入这个 call 去 trace

到了这边 ,

014F:00C10EFE 8BD3 MOV EDX,EBX

014F:00C10F00 8B45F8 MOV EAX,[EBP-08]

014F:00C10F03 E858F9FFFF CALL 00C10860

014F:00C10F08 8A154466C100 MOV DL,[00C16644]

014F:00C10F0E 8B45F8 MOV EAX,[EBP-08]

014F:00C10F11 E88EF9FFFF CALL 00C108A4

014F:00C10F16 8BD8 MOV EBX,EAX

014F:00C10F18 85DB TEST EBX,EBX

014F:00C10F1A 7445 JZ 00C10F61

; 只要这个能跳 , 就没有 debugger detection 的讯息了

; 所以到了这边 , 可以下 r fl z, 来跳过

014F:00C10F1C 6A00 PUSH 00

014F:00C10F1E A17066C100 MOV EAX,[00C16670]

014F:00C10F23 50 PUSH EAX

到了这边

014F:00C11046 7425 JZ 00C1106D

014F:00C11048 8D55E4 LEA EDX,[EBP-1C]

014F:00C1104B 33C0 XOR EAX,EAX

014F:00C1104D E8D616FFFF CALL 00C02728

014F:00C11052 8B45E4 MOV EAX,[EBP-1C]

014F:00C11055 8D55E8 LEA EDX,[EBP-18]

014F:00C11058 E8C33DFFFF CALL 00C04E20

014F:00C1105D 8B45E8 MOV EAX,[EBP-18]

014F:00C11060 E83323FFFF CALL 00C03398

014F:00C11065 8B5303 MOV EDX,[EBX+03]

014F:00C11068 E853F9FFFF CALL 00C109C0

; 走过这边 , 立刻出现 file corrupted 的讯息

; 应该是 checksum 吧 , 因为刚刚改了 section character

014F:00C1106D 8B45F8 MOV EAX,[EBP-08]

014F:00C11070 E8AF18FFFF CALL 00C02924

10: 那也要跳过 cs:00c11068 才行 , 那乾脆到了

014F:00C10F1A 7445 JZ 00C10F61

这个本来是要跳过 debugger dection 的 , 乾脆一次跳个够吧

用 symbol loader 载入 , 下 G C10F1A, 到了这边 , 下 A, 下

JMP C1106D 吧 , 抄下机械码 , 是 E94E010000

11: 到了 CS:C1106D, 继续 TRACE, 到了这边

014F:00C1141D 8B4508 MOV EAX,[EBP+08]

014F:00C11420 E87BFCFFFF CALL 00C110A0

; 这个 CALL 一走过就出现过期的讯息了

014F:00C11425 33C0 XOR EAX,EAX

014F:00C11427 5A POP EDX

014F:00C11428 59 POP ECX

014F:00C11429 59 POP ECX

12:

再 load 一次 , 一 load, 立刻下 g c11420 , 到了之后

立刻按 F8, 进入这个 call 去 trace

到了这边 ,

014F:00C111E2 E80DEEFFFF CALL 00C0FFF4

014F:00C111E7 84C0 TEST AL,AL

014F:00C111E9 7456 JZ 00C11241

; 可以从这边下手

014F:00C111EB 8B55F4 MOV EDX,[EBP-0C]

014F:00C111EE 8B45E8 MOV EAX,[EBP-18]

014F:00C111F1 E8A2EFFFFF CALL 00C10198

014F:00C111F6 8D55C8 LEA EDX,[EBP-38]

014F:00C111F9 8B45E8 MOV EAX,[EBP-18]

014F:00C111FC E81FF0FFFF CALL 00C10220

014F:00C11201 8B55C8 MOV EDX,[EBP-38]

014F:00C11204 B8F076C100 MOV EAX,00C176F0

014F:00C11209 E8A21EFFFF CALL 00C030B0

014F:00C1120E 8D55CE LEA EDX,[EBP-32]

014F:00C11211 8B45E8 MOV EAX,[EBP-18]

014F:00C11214 E893F0FFFF CALL 00C102AC

014F:00C11219 33C0 XOR EAX,EAX

014F:00C1121B 8A45CF MOV AL,[EBP-31]

014F:00C1121E 50 PUSH EAX

014F:00C1121F 8D45D0 LEA EAX,[EBP-30]

014F:00C11222 50 PUSH EAX

014F:00C11223 E8C0F0FFFF CALL 00C102E8

014F:00C11228 84C0 TEST AL,AL

014F:00C1122A 751A JNZ 00C11246

014F:00C1122C 6A00 PUSH 00

014F:00C1122E 68DC12C100 PUSH 00C112DC

014F:00C11233 68E412C100 PUSH 00C112E4

014F:00C11238 6A00 PUSH 00

014F:00C1123A E8CD32FFFF CALL USER32!MessageBoxA

014F:00C1123F EB05 JMP 00C11246

014F:00C11241 E88AF4FFFF CALL 00C106D0

; 这个会出现 过期的讯息

014F:00C11246 33C0 XOR EAX,EAX

014F:00C11248 5A POP EDX

014F:00C11249 59 POP ECX

014F:00C1124A 59 POP ECX

014F:00C1124B 648910 MOV FS:[EAX],EDX

014F:00C1124E EB0F JMP 00C1125F

014F:00C11250 E99F19FFFF JMP 00C02BF4

014F:00C11255 E876F4FFFF CALL 00C106D0

014F:00C1125A E8011BFFFF CALL 00C02D60

014F:00C1125F 33C0 XOR EAX,EAX

13: 所以我们知道要改哪里了

在

014F:00C10F1A 7445 JZ 00C10F61

改成 JMP C1106D 吧 ,

也就是把机械码 74456A00A1

改成 E94E010000

第二个要改的地方是

014F:00C111E9 7456 JZ 00C11241

改成 JMP 00C1125F 就行了

所以是机械码 7456

改成 EB74

问题是要改吗 , 此软体有加壳耶 , 所以无法直接用 ULTRAEDIT 改

那就用 Process Patcher 吧

14

将 ppatcher.ppc, ppatcher.exe copy 到 aspack 2.000 的目录底下

修改 ppatcher.ppc, 使他的内容如下

#Process Patcher Configuration File

Version=3.60

DisplayName= 破 aspack2000

Filename=aspack.exe

Filesize=231424

Arguments=/quiet

WaitInfinite=true

Address=0xc10f1a:0x74:0xe9

Address=0xc10f1b:0x45:0x4e

Address=0xc10f1c:0x6a:0x01

Address=0xc10f1d:0x00:0x00

Address=0xc10f1e:0xa1:0x00

Address=0xc111e9:0x74:0xeb

Address=0xc111ea:0x56:0x74

#End of Configuration File

15: 这样执行 ppatcher , 就可以了 , 但奇怪的是 debugger detection 有时会过不了 ,

只好执行 FrogsICE, 在执行 ppatcher 了

但这样子仍是不满意 , 我是想用 SMC(self modifying code) 的技巧来改

但是 , 使用 SMC 有一个问题 , 要找哪里的 code 来放我所加入的 code 呢 ?

我的确是有找 , 但是找不到一个够大的地方来存放我的 code,

只好用 topo 来多一些空间来存放我的 code 了

这个 topo 真是太棒了 , 可以多一些 section 出来 , 可以放入我所想要的 code

所以先 启动 topo, 开启 aspack.exe, 旁边有三个选项

Backup file, 等等 , 通通打勾

Byte to be add, 随意填一个 , 我是填 50,

在按 Do it! 好了之后 , 我的 aspack.exe 档案变大了

从 231424 byte 变成 232960 , 好像大了一点喔 , 没关系 , 可以用就好了

下面还有一个框 , 写著

memory address : 478000h

file offset 38800h

16: 用 symbol loader 载入看看

一开始是 invalid, 没关系 , 按一下 F8, 如果画面乱掉了 , 就按两下 F4, 如果画面没乱掉

就不必了 . 一直 trace, 到了这边 ,

014F:0047802C 90 NOP

014F:0047802D E9CFDFFEFF JMP 00466001

014F:00478032 0000 ADD [EAX],AL

014F:00478034 0000 ADD [EAX],AL

014F:00478036 0000 ADD [EAX],AL

那就是说 cs:478032 以后可以任我使用了 , 其实把 cs:478000 改成

JMP 00466001

也是可以啦 , 反正只要执行没问题就 ok 了

17: 那要改哪里呢 ? 用 symbol loader 载入 , 下 g c1f5c6

到了 cs:c1f5c6 , 下 a , 下 jmp 478032, 到了 cs:478032

下 a, 下 mov dword ptr [c10f1a],00014ee9

再下 mov byte ptr [c10f1e],00

再下 mov word ptr [c111e9],74eb

再下 jmp c1f5d0

把机械码纪录下来

是 C7051A0FC100E94E0100

C6051E0FC10000

66C705E911C100EB74

E97F757A00

为什么要下这些指令呢 ?

因为我们要把 CS:c10f1a 改成 JMP C1106D, 机械码是

E94E010000, 但是要反过来 , dword 是 4 BYTE, 所以先取 E94E0100

但是要反过来 , 所以变成了 00014ee9 ,

其他的也是同样道理 , 最后再跳回去 c1f5d0, 继续执行

用 Offset Converter 开启 ASPACK.EXE 输入 478032

跑出了 38A32, 所以用 ULTRA EDIT 开启 ASPACK.EXE

在 38A32 的地方 , 输入刚刚机械码

就是 C7051A0FC100E94E0100

C6051E0FC10000

66C705E911C100EB74

E97F757A00

18: 再来就是 cs:c1f5c6, 这个地方如何变成 jmp 478032 呢 ?

因为 cs:c1f5c6 这个地方 , 是 aspack 用 SMC 产生的 ,

所以无法直接修改他 , 那就来观察是什么时候产生这边的 code,

用 symbol loader 载入 , 下 bpm c1f5c6, 按 F5, 会在这边停住

cs: 466310 , 在按一次 F5, 会在 cs:c1f0eb 停住

共有两次会修改到 , 在第二次的地方比较重要

所以 , 到了 cs:c1f0eb , 下 BD* , 按几下 F10,

到了这边

cs:c1f0eb repz movsb

cs:c1f0ed mov eax , [ebp+442939]

cs:c1f0f3 push 00008000

cs:c1f0f8 push 0

当走到了 cs:c1f0f3 push 00008000 ,

这边的机械码是 6800800000, 把他改成 jmp 478051

所以下 a, 再下 jmp 478051 机械码是 E9598F85FF

到了 CS:478051 下 A ,

再下 PUSH 00008000, 按两下 ENTER,

仔细看一下 , 怎么变成 PUSH 8000 了 ...

这可不行 , 一定要 PUSH 00008000 才行啊

所以下 E 478051 , 游标跑到上面去了 , 改记忆体的值 , 改成

6800800000 , 这样才对 ,

好了 , 按一下 F10, 在开始下 A,

再下 MOV DWORD PTR [C1F5C6] , 858A67E9

再下 MOV BYTE PTR [C1F5CA] , FF

再下 JMP C1F0F8

改了四行 , 机械码总共是 ,

6800800000

C705C6F5C100E9678A85

C605CAF5C100FF

E98C707A00

一样的 , 用 Offset Converter 开启 ASPACK.EXE 输入 478051

跑出 38A51 ,

所以用 ULTRA EDIT 开启 ASPACK.EXE , 在 38A51 的地方输入

6800800000

C705C6F5C100E9678A85

C605CAF5C100FF

E98C707A00

19:

再来就是 c1f0f3 , 这个地方如何变成 push 00008000 呢 ?

用 symbol loader 载入 , 下 BPM C1F0F3, 按 F5, 会在这边停住

CS:466310 REPZ MOVSD , 但在这附近的程式码很奇怪 , 所以不要在这边动手脚

那要在哪里呢 ? 先离开 ASPACK , 再用 symbol loader 载入 , 下 G 4664D7

CS: 4664D7 JMP 4664DA

就改这边好了 , 把他改成 JMP 47806C, 机械码是 E9901B0100

跳到了 CS:47806C 时

改成 MOV DWORD PTR [C1F0F3], 858F59E9

MOV BYTE PTR [C1F0F7], FF

PUSH C1F001

RET

机械码是

C705F3F0C100E9598F85

C605F7F0C100FF

6801F0C100

C3

再用 ULTRAEDIT 在正确的位址填入这些值

20:

再来就是 4664D7 , 这个地方如何变成 JMP 47806C 呢 ?

用 symbol loader 载入 ASPACK, 到了

CS:4660AD REPZ MOVSB

; 这行会改变一些程式码

CS:4660AF MOV EAX, [EBP+44D284]

CS:4660B5 PUSH 000080000

; 这行似乎不错 , 就改这个吧

到了 CS:4660B5 时

下 A , 下 JMP 478083 , 机械码是 E9C91F0100

到了 CS:478083 时

下 A, 下

PUSH 00008000

按两下 ENTER

当然 , 和前面步骤一样 ,

所以下 E 478083 , 游标跑到上面去了 , 改记忆体的值 , 改成

6800800000 , 这样才对 ,

MOV DWORD PTR [4664D7],011B90E9

MOV BYTE PTR [4664DB],00

JMP 4660BA

这些机械码是

6800800000

C705D7644600E9901B01

C605DB64460000

E91CE0FEFF

用 ULTRAEDIT 在正确对应的地方输入这些值

21:

用 Offset Converter 开启 ASPACK.EXE 输入 4660B5

跑出 26AB5

所以用 ULTRA EDIT 开起 ASPACK.EXE, 在 26AB5

改成 E9C91F0100

改完了 ...

就大工告成了 ,

执行一下 ASPACK, 没有日期限制 , 也没有 侦测 SOFTICE 了

这就是用 SMC(self modifyiing code) 的技巧 , 不错吧

只不过有点烦 , 没办法 , 因为 aspack.exe 本身一直改自己程式码

所以我才要改那么多东西 , 因为 aspack 很复杂 ,

所以我也改的很复杂 , 若能直接脱壳 , 就不必用到 SMC 了

所以只要 SMC 用的好 , 加壳的软体根本不怕


Aspack 的壳

 标 题:请教各位用Aspack V2.000加壳的软件怎么脱!!! (88字)
发信人:bandi
时 间:2000-7-26 15:20:14
详细信息:
各位高人,我前天下载了一个软件是用Aspack V2.000来加的壳,不知怎样来脱它,请赐教!!!非常感谢.

标 题:转贴一篇文章，希望会对你有帮助。 (4千字)
发信人:sbing
时 间:2000-7-26 23:20:03
详细信息:

工具 : softice, trw2000, procdump
procdump 到这边抓最新版
http://soft2.gz168.com/wcx/exe/pd32-162.exe
目标程式
http://home.todo.com.tw/computer/metalken/zip/netterm1.zip
抓下来解开之後,放到 netterm 的目录里,若没有 netterm
就去抓下来安装吧

前言 : 这个 netterm1.exe 被我用 aspack2000 加壳了,
我是要练习脱壳...所以我就随便选一个来加壳
奇怪的是, procdump 1.62 应该是可以脱掉 aspack2000
但是我试了一下,好像脱不掉...
不管,反正现在加壳之风以日渐盛行,若不会脱壳,是不行的
有看过我的上一篇教学吗 ? 是有关於脱掉 aspack1.08.03 的壳,
但是能脱掉我写的程式,其他不行...
如果有看的话,应该有看到我的参考文献
知道大概是要如脱壳吧, 通常被加壳的程式呢 ,
一开始执行时,要把程式解压缩到记忆体, 在进入真正程式的 Entry point
所以只要找到程式的 Entry point, 就行了
而你若走到一个回圈, 常常在那边绕来绕去, 那就很有可能是在解压缩了
若你突然走到一个地方, 位址变化很大,那可能就是程式进入点了.
若找到程式进入点 , 你就可以大笑三声了
ok, Let's go!!

1: 用 softice 载入 netterm1.exe, 奇怪, 在我的电脑无法载入...
没关系... 执行 procdump, 选 PE Editor-> 选 netterm1.exe
看到 Entry point : 0005E001
Size of image : 00061000
Image Base : 00400000
那就是说, 程式一启动的 EIP 应该是 00400000 + 0005E001 = 0045E001
所以, 但是, 要如何到这边呢 ? 直接进入softice,下 bpx 0045E001 ??
当然是不行的, 要等程式到了 netterm1 的　空在下 bpx 0045E001 才行
那要如何到 netterm1 的　空 呢 ?
有很多种方法, 随便下一个 netterm1 有用到的 API, 就可以拦截了
例如说下 bpx createwindowexa ,执行 netterm1, 立刻被拦到
下 bd*, 暂停刚刚的断点, 按几下 F12, 立刻回到netterm1 的　空了
如何知道是不是 netterm1 的　空呢 ? 仔细看下方的一条绿线, 若写著
netterm1 , 就是到了是 netterm1 的　空了 ,
到了时候, 下 bpx 0045E001 , 按 F5, 离开 softice .

2: 执行 netterm1.exe ,立刻被拦住,在 cs:0045e001
好啦, 开始 trace 了...
很罗唆喔,也很烦, 会一直绕来绕去...
这是就要用一点技巧来加快 trace,
就是设中断点... 看一下程式, 你认为最远会跳到哪里呢?
中断点就设那边, 在按 F5, 如此循环
要是预估错误呢导致 netterm1 跑出来了呢? 那就算了..再执行一次啊
好,到了
cs:0045e4f2 call 0045e577
cs:0045e4f4 jnz 0045e4fc
cs:0045e4f9 ret c
cs:0045e4fc mov eax,1
cs:0045e501 ret
走到这边时,就是快要走完了

3: 小心地按 F10 ... 到了,
cs:0043f3cd mov eax,fs:[0]

注意看一下位址, 差好多喔,
而且看一下下面几行程式码,
有在呼叫 GetVersion , GetCommandLineA
若是解压缩的 source code, 是不会有这些的
所以, 聪明的你, 猜到了吧...
猜他是程式进入点, 就是 Entry point

4: 下bd* 先暂停所有的断点,按F5, 回到 windows
启动 trw2000, 载入 netterm1.exe,
竟然可以 load, 发现 trw2000 load 的能力比 softice 还强喔
ok, 开始 trace ...
不过,真的要 trace 吗 ? 不觉得太累了吗..
好吧, 偷懒一下, 因为用 softice 已经知道位址了
下 g 0043f3c0,
到了之後, 下 pedump net1.exe , net1.exe 名字可自己取
找一下 c:\windows ; 或是 netterm1 的所在目录, 或是 trw2000 的目录
就可以找到 net1.exe 了,
将他 copy 到 netterm 的目录, 执行一下...发现没有错误...

5: 嘿嘿, 开始聚气(在玩 KOF吗? 干吗聚气 ?), 达到饱和时, 开始大笑三声吧, 哈 ! 哈 ! 哈 !
第一次自己脱掉 procdump 脱不掉的壳...
岂是一个爽字了得呢 ?
对於高手, 当然脱壳以不是问题, 而对於我这个菜鸟
我已经很满足了 ....

6: 不过美中不足的是,脱的壳比原本档案大, 原本的档案是 359936 byte
脱壳之後是 397312 byte, 比本来还大...
欢迎高手来信指教, 看是哪里我的做法有哪些要改进的,很差的,
谢谢
e-mail address: g8742099@ccunix.ccu.edu.tw

後言:
或许会有人觉得奇怪, 为什堋不直接用 trw2000 trace啊, 用softice 干吗 ?
因为我实在是用不惯 trw2000, 我唯一认同 trw2000 的优点是, 他可以 dump EXE
还有不用常驻, 更惨的是, 用 trw2000 1.03 版的, 有时还会当机...
而且有些指令不能用, 如 A , 天啊, A 不能用... 这岂不是在开玩笑吗...
(难道是作者希望我们不要太 A ?? 因为 A 是...)
叫我注册...好吧, 等到 trw 在更成熟一点, 不会当机, 使用起来和 softice 相同时
我在考虑注册吧...毕竟这套软体实在不错,不过现在感觉还有很多改善的空间.


Authorware 4 中 U32

 标 题:对 Authorware 4 中 U32 类型文件的脱壳测试 ----- 告别前的最后一篇脱文 (5千字)
发信人:ljttt
时 间:2000-8-17 8:52:54
详细信息:
对 Authorware 4 中 U32 类型文件的脱壳测试 ----- 告别前的最后一篇脱文

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

【前言】
由于Authorware 4中的 U32 类型文件其实是动态链接库文件，因此对这些 U32 文件的脱壳其实和对 DLL 脱壳的方法相似。
对 Authorware 我实在不熟悉，花了半天时间，才弄清楚怎样在 Authorware 中加载 U32 类型文件。
由于上次我已经用PECompact加壳一个DLL脱壳测试过。这次就换另一种加壳程序试试。我选中了Aspack v2.1。

样例文件： ODBC.U32 （Authorware v4.0所带文件）
加壳方式： Aspack v2.1加壳
调试工具： SoftICE v4.05,PEditor v1.5,Hex WorkShop 2.10
目标： 脱壳
作者： ljttt
写作日期： 2000-08-16

（简称说明：EP: Entry Point，DLL: 动态链接库文件）

1、首先当然要分析基本信息了。用PEditor打开动态链接库文件，得到如下信息
Entry Point: 0000C001
Image Base: 10000000
Size of Image: 0000F000

Section Virtual Size Virtual Offset
.idata 00001000 00009000

2、现在我们要在动态链接库的入口点处中断，这次我用《对PECompact加壳的DLL脱壳的一点分析》一文中的第二种方法。

一、首先，用PEditor打开ODBC.U32文件，然后单击 FLC 按钮（这个功能是帮你计算Virtual Address转换为 Offset的）
输入 1000C001 ，单击 DO! 按钮，得到 Offset[hex] 为 4001。
二、然后，用Hex WorkShop打开ODBC.U32文件，定位到 4001，记下此处字节的值 60。
三、然后，用Hex WorkShop把 4001 处的字节 60 改为 CC。
四、Ctrl-D中断进入SoftICE，设断点 bpint 3。
五、F5回到Windows，运行Authorware 4.exe。（主程序文件）

这时，程序还没有加载ODBC.U32文件，单击菜单 Insert / Load Model，选择主程序目录下的 TEMPLATE/CONSUMER子目录下的QSADCONS.A4D文件，然后单击菜单 Insert / Paste Model，选择 QS:Administration - Cons.。程序开始加载ODBC.U32，此时将中断进入SoftICE。

3、下指令，修改程序入口的指令 CC 为 60。
eb eip 60
修改后代码窗口显示如下：
015F:03C6C001 60 PUSHAD <--我们中断在此
015F:03C6C002 E872050000 CALL 03C6C579
015F:03C6C007 EB33 JMP 03C6C03C
015F:03C6C009 87DB XCHG EBX,EBX
015F:03C6C00B 90 NOP
015F:03C6C00C 0000 ADD [EAX],AL
015F:03C6C00E 0000 ADD [EAX],AL

注意我们中断时的 IP 为 03C6C001，而不是 10000000+C001=1000C001，这说明Windows加载ODBC.U32的基地址不是 10000000，我们来计算一下实际加载的基地址： 3C6C001-C001=3C60000。（我跟踪发现每次加载的基地址都不一样）

4、继续跟踪，到如下（也可用 bpm 3C60000+9000 来跟踪 .idata 的变化情况来快速跟踪）
015F:03C6C2C9 F3A4 REPZ MOVSB
015F:03C6C2CB 5E POP ESI
015F:03C6C2CC 6800800000 PUSH 00008000
015F:03C6C2D1 6A00 PUSH 00
015F:03C6C2D3 FFB5E1394400 PUSH DWORD PTR [EBP+004439E1]
015F:03C6C2D9 FF95ED394400 CALL [EBP+004439ED]
015F:03C6C2DF 83C608 ADD ESI,08
015F:03C6C2E2 833E00 CMP DWORD PTR [ESI],00
015F:03C6C2E5 0F8526FFFFFF JNZ 03C6C211
015F:03C6C2EB 6800800000 PUSH 00008000
015F:03C6C2F0 6A00 PUSH 00
015F:03C6C2F2 FFB5E5394400 PUSH DWORD PTR [EBP+004439E5]
015F:03C6C2F8 FF95ED394400 CALL [EBP+004439ED] <---在此处停下来
015F:03C6C2FE 8B9D60394400 MOV EBX,[EBP+00443960]
015F:03C6C304 0BDB OR EBX,EBX
015F:03C6C306 7408 JZ 03C6C310

此时 3C69000 （.idata所在的内存地址） 处的内容如下
015F:03C69000 00009064 00000000 00000000 000092A2 d...............
015F:03C69010 00009150 00009148 00000000 00000000 P...H...........
015F:03C69020 000092C0 00009234 00009108 00000000 ....4...........

5、在此处我们要得到还原好的import table。下指令
/dump 3C69000 1000 c:\temp\dump.bin

6、继续跟踪，到如下
015F:03C6C4EA 59 POP ECX
015F:03C6C4EB 0BC9 OR ECX,ECX
015F:03C6C4ED 89852F3E4400 MOV [EBP+00443E2F],EAX
015F:03C6C4F3 61 POPAD
015F:03C6C4F4 7508 JNZ 03C6C4FE (JUMP )
015F:03C6C4F6 B801000000 MOV EAX,00000001
015F:03C6C4FB C20C00 RET 000C
==> 03C6C4FE 68001CC603 PUSH 03C61C00 <---3C61C00 就是我们要找的OEP了
015F:03C6C503 C3 RET <---在此处停下来

7、这里到了我们得到整个程序内存映象的时候了。
/dump 3C60000 F000 c:\temp\dump.u32
记下此处我们得到 OEP RVA = 3C61C00 - 3C60000 = 1C00。（也就是要减去实际基地址3C60000）

8、F5回到Windows，结束主程序。开始修补dump.u32。用PEditor打开dump.u32文件，选择sections，右键打开菜单，选择dumpfixer。OK!一次完成所有Section的RVA、Size的转换工作。再修改Entry Point为 1C00，单击apply changes保存，选择directory，修改其中的Import Table的RVA为 9000，Size为1000。单击保存。

9、用Hex WorkShop打开dump.u32和dump.bin，定位dump.dll位置到 9000，选择 1000 个字节。删除。
选择dump.bin的 1000 个字节，复制到dump.dll中。保存。

10、把dump.u32复制到主程序目录下，换名为ODBC.U32。重新运行主程序Authorware 4.exe。测试成功。

【后记】
从测试的几个DLL脱壳情况来看，加壳程序一般没有对Export table做处理。不知道Export table象import table一样加密后会怎么样。我还不太了解Windows对Export table的加载处理机制。万一遇到这种情况，我一定死翘翘了。不过还好，实验测试中没发现此类事件。不过真正的商业软件加的壳就不一定了。
但愿等我把export table的加载处理机制弄清楚了，再遇到这类软件。到那时，（俺手拿牛二尖刀，一脸阴笑）嘿嘿...................

【本月小结】
不知不觉，一个月就过去了。算下来俺也写十余篇脱文。感觉进步不少，这里要多谢看雪教学中各位高手精彩的文章给了我很大的帮助，投桃报李，因此俺也把自己的一点点所得写了出来。无奈俺用隔月上网的方式来减少网费，所以如果哪位朋友给我写信，可能只有等到我 9 月 20 日再次上网以后才能回复了。Email:ljtt@yeah.net


看雪学苑

 标 题:脱壳----对用pecompact加壳的程序进行手动脱壳 (1千字)
发信人:iis
时 间:2000-7-30 23:22:53
详细信息:
脱壳----对用pecompact加壳的程序进行手动脱壳
前言：偶然发现pecompact升级到1.4b1,拿下来看看有何变化，结果令我很是失望。脱壳方法和以前的版本一样。在这里简单的介绍一下，希望大家对它有个了解。
目标文件： pecompact（1.4b1）.exe
加壳方式： pecompact
所用工具： trw2000 v1.22
作者： iis

1.用trw2000的Loader加载加壳程序。
2.将停在下面的地方，
0167:0041E800 JMP SHORT 0041E808《——停在这里
0167:0041E802 PUSH DWORD 0001E000
0167:0041E807 RET
0167:0041E808 PUSHF
0167:0041E809 PUSHA
0167:0041E80A CALL 0041E811 《——按f8进入
0167:0041E80F XOR EAX,EAX

3.一直按f10,经过三段连续的空指令（nop)
0167:00420147 MOV EDI,ESI
0167:00420149 ADD EDI,1000
0167:0042014F NOP 《——第一段开始
.
.
.
0167:00420246 POP EDI
0167:00420247 JMP SHORT 004201D1
0167:00420249 NOP 《——第二段开始
0167:0042024A NOP
.
.
.
0167:004202AC NOP
0167:004202AD NOP 《——第二段结束
0167:004202AE CALL 00420440
0167:004202B3 NOP 《——第三段开始
0167:004202B4 NOP
.
.
.
0167:0041E000 PUSHF 《——这是个重要标志
0167:0041E001 PUSHA 《——这是个重要标志
0167:0041E002 CALL 0041E009 《——执行命令makepe 文件名

好了，脱壳已经成功，我们该做个总结了。下面是我对破壳的一点心得，希望对大家能有帮助，
用pecompact加壳的程序：
用trw2000加载后，经过三段连续的空指令（nop)后，发现的 PUSHF,PUSHA 指令后面的调用子函数（ call指令),就应该是脱壳的入口了。

标 题:你这种方法有问题，会出错 (114字)
发信人:IceWorld
时 间:2000-7-31 2:18:14
详细信息:

请到我的主页来下载完美破解版，在NT和ME下都可以正常使用！
http://iceworld.126.com/
http://home.etang.com/iceworld


PECompact v1.34

 标 题:对PECompact.exe v1.34的手动脱壳 -----俺写的一篇臭文 (10千字)
发信人:ljttt
时 间:2000-7-26 7:16:08
详细信息:
作者： ljttt
写作日期：2000-07-25
目标程序：PECompact.exe 35,840 v1.34 脱壳
程序下载：http://www.cnvnet.com/download/d/pecsetup.exe
使用工具：SoftICE 4.00; ProcDump 1.6.2; IceDump 6.0.1.5; HexWorkShop;

（补充一句：以下Import table我称作输入表，可能说法不规范，不过我打习惯了，大家原谅一下）
（注：以下文中数字为十六进制）
分析：
运行ProcDump,点击Pe-Editor按钮，选中PECompact.exe，得到程序内存映象大小:Size of Image为 00031000和基地址Image Base为0040000。然后点击Sections，没有发现.idata这样容易识别的输入表Section，
看来找输入表的地址和大小也将成为重点了。

首先我们来抓取Import table
1、先装载IceDump。到IceDump目录中运行相应SoftICE版本的icedump.exe。（比如我用的SoftICE版本为4.00就到win9x/400目录下运行icedump.exe）
2、运行SoftICE的Loader，加载PECompact.exe。
3、Ctrl-D进行SoftICE，如下设置断点
bpx loadlibrarya do "dd esp->4"
（注：在没有明确的输入表地址的情况下，这不失为找输入表地址的一种好办法）
4、按F5回到Windows中，单击Loader中的Load按钮。程序中断在第一条指令处。进入了SoftICE。
（看来PECompact.exe不象受Asprotect保护的程序那样。无法用SoftICE自动中断在第一条指令处）
5、按F5运行程序。又中断在我们设下的中断Loadlibrarya处。看看数据窗口。显示如下：

0030:004171AE 4E52454B 32334C45 4C4C442E 4C000000 KERNEL32.DLL...L
0030:004171BE 4C64616F 61726269 00417972 65470000 oadLibraryA...Ge
0030:004171CE 6F725074 64644163 73736572 56000000 tProcAddress...V
0030:004171DE 75747269 6C416C61 00636F6C 69560000 irtualAlloc...Vi
0030:004171EE 61757472 6572466C 00000065 74697845 rtualFree...Exit
0030:004171FE 636F7250 00737365 72460000 694C6565 Process...FreeLi
0030:0041720E 72617262 00000079 4D746547 6C75646F brary...GetModul
0030:0041721E 6E614865 41656C64 47000000 6F4D7465 eHandleA...GetMo
0030:0041722E 656C7564 656C6946 656D614E 9D8B0041 duleFileNameA...
0030:0041723E 004020A6 20AA9D3B 01750040 0CB58BC3 . @.;.. @.u.....

6、根据经验，一般第一次是脱壳代码自己的函数库的加载。并不是我们需要的输入表。因此，按F5继续执行程序。程序又一次中断，这一次数据窗口显示如下：

0030:0040D4A0 4E52454B 32334C45 6C6C642E 49444700 KERNEL32.dll.GDI
0030:0040D4B0 642E3233 55006C6C 33524553 6C642E32 32.dll.USER32.dl
0030:0040D4C0 4441006C 49504156 642E3233 49006C6C l.ADVAPI32.dll.I
0030:0040D4D0 4547414D 2E504C48 006C6C64 646D6F63 MAGEHLP.dll.comd
0030:0040D4E0 3233676C 6C6C642E 45485300 32334C4C lg32.dll.SHELL32
0030:0040D4F0 6C6C642E 41434A00 2E31474C 006C6C64 .dll.JCALG1.dll.
0030:0040D500 696C7061 6C642E62 00F4006C 4C746547 aplib.dll...GetL
0030:0040D510 45747361 726F7272 01A70000 65766F4D astError....Move
0030:0040D520 656C6946 01160041 50746547 41636F72 FileA...GetProcA
0030:0040D530 65726464 00007373 655201CB 6F436461 ddress....ReadCo

可以看到偏移地址为40D4A0,根据我们对输入表的知识,(具体原理说明可以看看雪教学中的"脱壳高级篇"中的文章，那里面比我说得清楚多了)我们可以搜索内存映象中的字节A0,D4,00,00。（即00D4A0=40D4A0-400000）来确定输入表的位置。下指令

s 30:400000 l ffffffff A0,D4,00,00

7、搜索的结果显示

Pattern found at 0030:0040D00C (0000D00C)

我们用如下指令来定位到输入表的起始位置（当然目前还不能确定就是输入表）

dd 0040D00C-C

如下为数据窗口的显示结果。

0030:0040D000 0000D0C8 00000000 00000000 0000D4A0 ................
0030:0040D010 0000D2B4 0000D1A0 00000000 00000000 ................
0030:0040D020 0000D4AD 0000D38C 0000D1CC 00000000 ................
0030:0040D030 00000000 0000D4B7 0000D3B8 0000D260 ............`...

现在我们来看看到底是否我们要找的输入表。下指令
dd 40D0C8

显示结果如下：
0030:0040D0C8 0000D50A 0000D51A 0000D526 0000D538 ........&...8...
0030:0040D0D8 0000D548 0000D556 0000D564 0000D57A H...V...d...z...
0030:0040D0E8 0000D58C 0000D59E 0000D5B4 0000D5C2 ................
0030:0040D0F8 0000D5D2 0000D5DE 0000D5F4 0000D5FE ................

继续追踪，下指令
db 40D50A

显示结果如下：
0030:0040D50A F4 00 47 65 74 4C 61 73-74 45 72 72 6F 72 00 00 ..GetLastError..
0030:0040D51A A7 01 4D 6F 76 65 46 69-6C 65 41 00 16 01 47 65 ..MoveFileA...Ge
0030:0040D52A 74 50 72 6F 63 41 64 64-72 65 73 73 00 00 CB 01 tProcAddress....
0030:0040D53A 52 65 61 64 43 6F 6E 73-6F 6C 65 41 00 00 31 00 ReadConsoleA..1.

（以上说这么多，只是为了说明找输入表的方法的具体实现过程，原理在各位高手的"脱壳高级篇"已经说得很详细了）
OK，符合输入表的规范。看来这就是我们要找的输入表了。我们还要确定一下输入表的长度，在数据窗口中向下翻页。直到发现大量的0x00字节。确定一下长度为C40字节。（这次就不Dump窗口看了，写到这里我开始怀疑我这篇又臭又长的文章不知道要写多长，大家还没有看着看着睡着了吧 :-) ）

现在我们来保存输入表，下指令
PAGEIN D 40D000 C40 C:\TEMP\DUMP.BIN

现在再来确定程序真正的Entry Point

1、这里我为了省事，干脆
BD *
禁止所有中断，然后按F5运行程序，重新在SoftICE的Loader中单击Load按钮运行程序，（当然这种方法在对PECompact.exe的脱壳中可以用，其他的就不一定了）又中断在第一条指令。窗口显示如下：
015F:0041E800 EB06 JMP 0041E808 (JUMP )
015F:0041E802 6800E00100 PUSH 0001E000
015F:0041E807 C3 RET
==> 0041E808 9C PUSHFD
015F:0041E809 60 PUSHAD
015F:0041E80A E802000000 CALL 0041E811 (注意了，这里可不是什么过程调用，只是JMP的变形而已)
015F:0041E80F 33C0 XOR EAX,EAX
015F:0041E811 8BC4 MOV EAX,ESP
015F:0041E813 83C004 ADD EAX,04

注意，在Call 0041E811语句处我们要按F8键继续，不然就Over了。这里的Call语句可不是什么真正的过程调用。无非是变相的一种Jmp跳转语句而已。要识别它也不难。看看它跳转的地址是否就在附近。如果是就小心了。按F8键不要按F10键。
好了，转过了一道小小的弯，一路F10下来，还顺风顺水。直到如下
015F:0041E860 5F POP EDI
015F:0041E861 8DB570804000 LEA ESI,[EBP+00408070]
015F:0041E867 B99F030000 MOV ECX,0000039F
015F:0041E86C F3A5 REPZ MOVSD
015F:0041E86E 5F POP EDI
015F:0041E86F C3 RET
到了第一个ret。看!它要跳转了。又一段旅程开始。按F8继续，这一段就要小心一点，直到。
015F:00420121 8BB53E854000 MOV ESI,[EBP+0040853E]
015F:00420127 8BBD42854000 MOV EDI,[EBP+00408542]
015F:0042012D E82E0A0000 CALL 00420B60
015F:00420132 61 POPAD
015F:00420133 9D POPFD
015F:00420134 50 PUSH EAX
015F:00420135 6800E04100 PUSH 0041E000
015F:0042013A C20400 RET 0004
又要跳转到41E000了。瞧这里，又要小心了。不要在Call 0041E009语句处按F10哦
015F:0041E000 9C PUSHFD
015F:0041E001 60 PUSHAD
015F:0041E002 E802000000 CALL 0041E009
015F:0041E007 33C0 XOR EAX,EAX
015F:0041E009 8BC4 MOV EAX,ESP
015F:0041E00B 83C004 ADD EAX,04
一路下来到
015F:0041E092 FFD0 CALL EAX
015F:0041E094 FFA59A214000 JMP [EBP+0040219A]
015F:0041E09A 61 POPAD
015F:0041E09B 9D POPFD
015F:0041E09C 6800704100 PUSH 00417000
015F:0041E0A1 C3 RET
又要跳到417000了。这里又要小心Call 00417009语句了。
015F:00417000 9C PUSHFD
015F:00417001 60 PUSHAD
015F:00417002 E802000000 CALL 00417009
015F:00417007 33C0 XOR EAX,EAX
015F:00417009 8BC4 MOV EAX,ESP
015F:0041700B 83C004 ADD EAX,04
一路下来，终于到终点站了。万岁！
015F:00417090 6A00 PUSH 00
015F:00417092 FFD0 CALL EAX
015F:00417094 FFA59A214000 JMP [EBP+0040219A]
015F:0041709A 61 POPAD
015F:0041709B 9D POPFD
015F:0041709C 6800104000 PUSH 00401000
015F:004170A1 C3 RET
程序真正的入口到了。在ret指令处我们下指令：
PAGEIN D 400000 31000 C:\TEMP\DUMP.EXE

第三步。开始我们的后期修补工作。（Zzzzzz.....Zzzzzz......什么，大家都睡着了，没办法我总不能就此结束吧。咬牙继续写下去。)

1、启动HexWorkShop，打开Dump.exe。用菜单中的Go命令定位到0000D000处。用Select Block命令选择C40个字节，按Del键删除。

然后打到Dump.bin文件，用菜单中的Select Block命令选择C40个字节(用Select All一样）。用Copy命令复制到剪贴板。切换到Dump.exe窗口用菜单中的Paste命令粘贴过来。（注意当前位置是从D000开始的，不要贴错位置哦）

2、启动ProcDump。单击PE Editor打开Dump.exe文件。然后单击Sections，把每个Section中
PSize改成和VSize同样大小,Offset改成和RVA同样大小。按OK确定。

3、然后修改Entry Point为00001000。单击Directory按钮修改其中的Import Table的RVA为0000D000,Size为00000C40，然后保存。

4、该收工吧。看看成果。运行Dump.exe。屏幕显示 "找不到所需的.Dll文件 - JCALG1.DLL"不存在。 (险些晕倒)。
5、再看看，回到HexWorkShop窗口。用菜单中的Go命令定位到00D000处，找到如下位置：
0000D000 0000D0C8 00000000 00000000 0000D4A0 ................
0000D010 0000D2B4 0000D1A0 00000000 00000000 ................
0000D020 0000D4AD 0000D38C 0000D1CC 00000000 ................
0000D030 00000000 0000D4B7 0000D3B8 0000D260 ............`...
0000D040 00000000 00000000 0000D4C2 0000D44C ............L...
0000D050 0000D284 00000000 00000000 0000D4CF ................
0000D060 0000D470 0000D28C 00000000 00000000 p...............
0000D070 0000D4DC 0000D478 0000D294 00000000 ....x...........
0000D080 00000000 0000D4E9 0000D480 0000D2A4 ................
0000D090 00000000 00000000 0000D4F5 0000D490 ................
0000D0A0 0000D2AC 00000000 00000000 0000D500 ................
0000D0B0 0000D498 00000000 00000000 00000000 ................
0000D0C0 00000000 00000000 0000D50A 0000D51A ................
0000D0D0 0000D526 0000D538 0000D548 0000D556 &...8...H...V...
6、把从0000D08C开始到0000D0B2之间的字节全部改为00。保存。为什么这样改？因为
这之间的字节分成两段，分别对应着输入表中对JCALG1.DLL和aplib.dll的引入。
0000D2A4 00000000 00000000 0000D4F5 0000D490
0000D2AC 00000000 00000000 0000D500 0000D498

7、运行，Ok！

附：
我写了个ProcDump的Script如下，可以省略大部分步骤。现在简要说明一下。
运行ProcDump。用Script脱壳出文件Dump.exe，然后按修补工作中的第3-5步修改即可。不过第5步时定位到0000C600字节处。因为ProcDump脱壳出的Dump.exe文件头只有600个字节，而内存中文件头要占1000个字节。所以可以得到VA=D000-1000-600=C600字节。

[5'My ONE PECompact v1.34]
L1=OBJR
L2=LOOK 60
L3=BP
L4=OBJR
L5=LOOK C3
L6=BP
L7=WALK
L8=OBJR
L9=LOOK EB,14
LA=BP
LB=WALK
LC=OBJR
LD=LOOK C2,04,00
LE=BP
LF=WALK
L10=OBJR
L11=LOOK C3
L12=BP
L13=WALK
L14=OBJR
L15=LOOK 68,??,??,??,??,C3
L16=BP
L17=STEP
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

脱壳时间没花多少时间，写这篇又臭又长的文章花了俺3个多小时。俺文字功底不好。该文章的结构参照看雪兄的"脱壳高级篇"中一文。俺实在写累了。睡觉去罗！

最后，还有一个问题问问各位，TRW中如何保存当前屏幕?（写作 用）还请赐教。

标 题:另一种办法 (258字)
发信人:冰毒
时 间:2000-7-27 4:05:45
详细信息:

好长时间没来,今天上来看到帖子,以为1.34比1.32有了什么改变. 抓一个一试,还是老样子: 即在Push 417000下的RET处Prodump,而不是一般以为的Push 401000下的RET处(或者说最后一层壳是不用脱的). Dump后只需改动入口值即可. 运行正常,也可用W32dasm反汇编. 至少在我的机子上是这样.


PE Compact 1.4 beta6

 标 题:用天意+Procdump脱PE Compact 1.4 beta6!只是简单介绍! (2千字)
发信人:wind[CCG]
时 间:2000-8-28 19:53:08
详细信息:
用天意+Procdump脱PE Compact 1.4 beta6

本人对PE的文件结构也不是很了解！
1、如果你和我一样使用s3的早期显卡，那么你需要安装sdd v6.53或者
sdd v7.0 alpha3

2、运行天意的test程序，如果你的显卡支持的话，会生成一个Trackit.dat的
文件！

3、我们这次脱PE Compact 1.4 beta6的壳，用天意脱这个软件的壳，
用天意似乎比trw2000更快来到关键处！

4、此篇文章由于我的水平有限无法涉及让他脱壳后跨平台运行的问题！
不过在本机应该可以使用！主要是介绍天意为cracker们特设的suspend命令！

好开始，首先用load载入pecompact.exe文件！
来到如下程序段：
015F:00419800 JMP SHORT 00419808 -->中断与此，按f10继续
015F:00419802 PUSH DWORD 00019000
015F:00419807 RET
015F:00419808 PUSHF -->按一下f10来到了这里，继续用f10单步执行！
015F:00419809 PUSHA
015F:0041980A CALL 00419811 -->来到这里，不要用f10,改用f8,f10继续！
015F:0041980F XOR EAX,EAX
015F:00419811 MOV EAX,ESP
015F:00419813 ADD EAX,BYTE +04
015F:00419816 XCHG EAX,EBX
015F:00419817 MOV ESP,EBX
015F:00419819 MOV EBX,[EBX-04]
015F:0041981C SUB EBX,0040A00F
015F:00419822 XCHG EBX,EBP
.
.
.
.
.
.
..过不了多久就来到这里！
015F:00419850 PUSH EBX
015F:00419851 PUSH EBX
015F:00419852 PUSH EBX
015F:00419853 PUSH EBX
015F:00419854 POP EAX
015F:00419855 SUB EAX,0040A070
015F:0041985A MOV [EBP+0040A071],EAX
015F:00419860 POP EDI
015F:00419861 LEA ESI,[EBP+0040A070]
015F:00419867 MOV ECX,0447
015F:0041986C REP MOVSD -->看见这条指令了吧！在天意里不管用f10或f8都是
要运行很长时间的（在trw2000里可以用f10带过）
其实，在这里，我们可以用天意的g命令跳过！
马上会来到这里...
.
.
015F:0041B40B NOP
015F:0041B40C MOV ESI,[EBP+0040A5DC]
015F:0041B412 MOV EDI,[EBP+0040A5E0]
015F:0041B418 CALL 0041C0A4
015F:0041B41D POPA
015F:0041B41E POPF
015F:0041B41F PUSH EAX
015F:0041B420 PUSH DWORD 00419000 -->在41986c处，使用g命令后来到了这里
在按f10
015F:0041B425 RET 04 -->来到这里用f10带过，就来到程序脱壳的
关键处！
..关键处代码：
015F:00419000 PUSHF -->来到这里，用f10跑到419002处
015F:00419001 PUSHA
015F:00419002 CALL 00419009 -->来到这里就可以脱壳了，这里我们用
suspend命令回到windows环境，启动
procdump，然后在就可以脱壳了！
在procdump里可以选种我们刚才准备脱壳文件的那个进程！点鼠标右键，选择
dump(full)

注：本人昨天和人打架，眼睛伤了，这篇文章只是简单介绍一下它是如何脱壳的！希望大家
能看明白，天意的功能十分强大，我无法说的清楚！希望大家关注这款国产的调试器！

wind[CCG]


DLL脱壳

 标 题:对PECompact加壳的DLL脱壳的一点分析 (7千字)
发信人:ljttt
时 间:2000-8-17 8:49:23
详细信息:
对PECompact加壳的DLL脱壳的一点分析

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

【前言】
目前，我对DLL的脱壳的了解也不多，相信有些地方会和对EXE的脱壳大致相同。现在我知道的主要不同是必须要在DLL的空间开始跟踪。否则从EXE开始跟踪，那还不把人累死。另外 ProcDump 和 PEditor 之类的工具好象还无法自动修复DLL的import table。唉，又是手动，什么时候有个DLL的脱壳机出现呢？ ou，别看我！我编程的水平三流，写不出那些好东东。

样例文件： dlcsp32.dll （DynaDoc Reader v3.01所带动态链接库文件，这个程序就是看.wdl电子图书文件的那个）
加壳方式： PECompact v1.41b1加壳
检测工具： 和尚头上的虱子-----明摆着的嘛
调试工具： SoftICE v4.05,PEditor v1.5,Hex WorkShop 2.10
目标： 脱壳
作者： ljttt
写作日期： 2000-08-16

1、首先当然要分析基本信息了。用PEditor打开动态链接库文件，得到如下信息
Entry Point: 00024000
Image Base: 10000000
Size of Image: 00029000

Section Virtual Size Virtual Offset
pec1 00020000 00001000
pec2 00003000 00021000
.pec 00004000 00024000
.rsrc 00001000 00028000

再来看看import table和export table的情况，export table没有改变。问我怎么知道？有未加壳的DLL嘛。西西。

2、现在我们要想办法在动态链接库的入口点 10024000 处中断，当然方法很多了，这里介绍两种办法。

①、第一种方法
一、首先，用PEditor打开DLL文件，然后单击 FLC 按钮（这个功能是帮你计算Virtual Address转换为 Offset的）
输入 10024000 ，单击 DO! 按钮，得到 Offset[hex] 为 B000。
二、然后，用Hex WorkShop打开DLL文件，定位到 B000，记下此处字节的值 EB。
三、然后，用PEditor打开Dlview32.EXE（主程序文件）。单击 break'n enter 按钮（这个功能是帮你在程序的某个地址空间设下int 3中断），在 Virtual Address 中输入 10024000。
四、Ctrl-D中断进入SoftICE，设断点 bpint 3。
五、F5回到Windows，单击break'n enter窗口中 RUN 按钮。这样我们将在动态链接库的第一条指令处中断。

②、第二种方法
一、同第一种方法
二、同第一种方法
三、然后，用Hex WorkShop把 B000 处的字节 EB 改为 CC。
四、同第一种方法
五、运行程序。这样我们也可以在动态链接库的第一条指令处中断。

这里，我用第一种方法。我们现在中断在第一条指令处。但是还不能继续跟踪。要把 CC （即int 3指令）改为原来程序的代码。

（简称说明： EP: Entry Point, OEP: Orginal Entry Point, RVA: Relative Virtual Address ）

代码窗口显示如下：
015F:10024000 CC INT 3 <---中断在此，这就是我们要改回的字节
015F:10024001 06 PUSH ES
015F:10024002 6810DE0000 PUSH 0000DE10 <---有点奇怪哦？ DE10 不是我们要找的 OEP 吗 ，怎么在这里就出现了？难道不用找了？
015F:10024007 C3 RET
015F:10024008 9C PUSHFD
015F:10024009 60 PUSHAD
015F:1002400A E802000000 CALL 10024011
015F:1002400F 33C0 XOR EAX,EAX
015F:10024011 8BC4 MOV EAX,ESP
015F:10024013 83C004 ADD EAX,04

下指令
eb eip EB （修改当然 IP 所在地址的字节为 EB）

好，代码显示成原来的模样了。
015F:10024000 EB06 JMP 10024008 <---代码复原后
015F:10024002 6810DE0000 PUSH 0000DE10 <---奇怪？
015F:10024007 C3 RET
==> 10024008 9C PUSHFD
015F:10024009 60 PUSHAD
015F:1002400A E802000000 CALL 10024011
015F:1002400F 33C0 XOR EAX,EAX
015F:10024011 8BC4 MOV EAX,ESP
015F:10024013 83C004 ADD EAX,04

3、这样代码就复原了。不过你发现一点问题没有？ DLL的 OEP 怎么会在这里就出现了？ 好奇怪？！先不管它，设个断点留着看看。设断点
bpx 10024002

4、设断点
bpx loadlibrarya do "dd esp->4" （老一套了）

5、按 F5 继续，又中断在我们新设的断点。我们来看一下数据窗口

显示如下：
015F:1002041A 4E52454B 32334C45 6C6C642E 00000000 KERNEL32.dll....
015F:1002042A 656C6552 44657361 00000043 44746547 ReleaseDC...GetD
015F:1002043A 53550043 32335245 6C6C642E 00000000 C.USER32.dll....
015F:1002044A 656C6544 624F6574 7463656A 00000000 DeleteObject....

哦，这里看来就是我们要找的import table的一部分了。

6、继续搜索，下指令
s 30:10000000 l ffffffff 1A,04,02,00 （这里就不多说了，和《脱壳----对用Petite2.2加壳的程序进行手动脱壳的一点分析》一文中所说的情况相同，所以搜索方法也一样了。以后几步同理）
搜索结果显示如下：
Pattern found at 0030:1002000C (0002000C)

7、下指令
dd 1002000C-C

数据窗口显示如下：
0030:10020000 000200DC 00000000 00000000 0002041A ................
0030:10020010 00020270 000201D8 00000000 00000000 p...............
0030:10020020 0002043C 0002036C 00020050 00000000 <...l...P.......

8、这样到了import table的起始处了。现在开始保存import table。
/dump 10020000 1000 c:\temp\dump.bin （1000 的长度是根据 00 字节的位置来确定的）

9、下指令 BD 2 禁止 bpx loadlibrarya 中断，继续跟踪。到如下

015F:10025335 51 PUSH ECX
015F:10025336 53 PUSH EBX
015F:10025337 6A00 PUSH 00
015F:10025339 FFD0 CALL EAX
015F:1002533B FFA55E854000 JMP [EBP+0040855E]
015F:10025341 8BB54E854000 MOV ESI,[EBP+0040854E]
015F:10025347 8BBD52854000 MOV EDI,[EBP+00408552]
015F:1002534D E82E0C0000 CALL 10025F80
015F:10025352 61 POPAD
015F:10025353 9D POPFD
015F:10025354 50 PUSH EAX
015F:10025355 6810DE0010 PUSH 1000DE10 <--- 1000DE10 - 10000000 = DE10 就是 OEP 了
015F:1002535A C20400 RET 0004 <--- 这里就要到回到真正的入口处了，在此停下。保存映象

10、记下 OEP 为 DE10。下指令保存整个DLL内存映象。
/dump 10000000 29000 c:\temp\dump.dll

11、按 F5 继续，没有中断在我们在步骤 3 处设下中断。关闭主程序时，中断。正好在此处中断。
显示如下：
015F:10024000 EB06 JMP 10024008
015F:10024002 6810DE0000 PUSH 1000DE10 <---开始中断时的 0000DE10 这时已经变成 1000DE10 了。
015F:10024007 C3 RET
==> 10024008 9C PUSHFD
015F:10024009 60 PUSHAD
015F:1002400A E802000000 CALL 10024011
015F:1002400F 33C0 XOR EAX,EAX
015F:10024011 8BC4 MOV EAX,ESP
015F:10024013 83C004 ADD EAX,04

看来此处的几条指令的用处PECompact是别有用意安排的，可能是为了方便去卸载动态链接库吧。

12、开始修补工作。用PEditor打开dump.dll文件，选择sections，右键打开菜单，选择dumpfixer。OK!一次完成所有Section的RVA、Size的转换工作。再修改Entry Point为 DE10，单击apply changes保存，选择directory，修改其中的Import Table的RVA为 20000，Size为1000。单击保存。

13、用Hex WorkShop打开dump.dll和dump.bin，定位dump.dll位置到 20000，选择 1000 个字节。删除。
选择dump.bin的 1000 个字节，复制到dump.dll中。保存。

14、测试。OK，收工。

【后记】
本来我想用UPX加壳DLL来实验的。当然是想先找个"软柿子"捏。没想到，发现它加壳的DLL在import table做了手脚。这些天我正窝火，还有一个Asprotect加壳的Awave Audio v7.0的import table始终还原不出来。想不到又碰上这种问题，让我头晕眼花了好一阵子，（现在我看见import table的问题就有这毛病......烙下病根了）于是我一脚把UPX踢开，改为分析PECompact加壳DLL来实验，西西，这回简单。怎么样，我写的东东价钱公道，水分又足，咬一口新鲜水灵，大家快来买呀...........不好，打假别动队来了，赶紧溜 .......


Petite2.2脱壳分析

 标 题:脱壳----对用Petite2.2加壳的程序进行手动脱壳的一点分析 (5千字)
发信人:ljttt
时 间:2000-7-27 19:57:10
详细信息:
脱壳----对用Petite2.2加壳的程序进行手动脱壳的一点分析

（以后如未特别说明，这里所说的脱壳均是指对用Petite2.2加壳的程序而言）

前言：这几天一直在对Petite2.2做试验。总结一下这几天的一点经验，希望对大家对Petite2.2加壳的程序进行手动脱壳时有一点帮助。一般按照以下方法可以简化跟踪的过程，也节省一点大家手动脱壳的时间。（当然大家如果手头上有对此的自动脱壳的工具的话，就不在此列了。可惜现在我手头上还没有。也没有编写这类脱壳程序的经验，不知道如何下手。希望以后我能对此知其一二 :-) ）这里能简化的一点步骤就是不需要重建import table，（以下可以看到原因）。看到r!sc的文章对Petite.exe(注意是加壳程序本身)脱壳时，需要自己构造一个import table（我没有构造import table的经验，想来这是一件很花工夫的事情），这很让人以为Petite加壳的程序也需要这样做。实际上情况比想象的好 ：-)。这也是我写篇文章的动机所在。

以下用Petite2.2加壳Notepad.exe(M$自带的记事本程序)来说明一下。
目标文件： Notepad.exe (用Level 4级压缩方式加壳)
加壳方式： Petite 2.2
所用工具： SoftICE v4.0, ProcDump v1.6.2, ICEDump v6.0.15
作者： ljttt

1、首先，当然少不了用ProcDump来分析一下对我们有用的文件信息。
Entry Point: 0000D042
Size of image: 0000E000
Image Base: 00400000

2、用SoftICE的Loader加载加壳程序。
3、设断点
bpx loadlibrarya do "dd esp->4"
4、F5运行程序，将中断在我们所设断点上。观察数据窗口。可以看到将要被程序加载的的动态链接库的名字字符串。如下：
0030:00400800 4C454853 2E32334C 006C6C64 4E52454B SHELL32.dll.KERN
0030:00400810 32334C45 6C6C642E 45535500 2E323352 EL32.dll.USER32.
0030:00400820 006C6C64 33494447 6C642E32 6F63006C dll.GDI32.dll.co
0030:00400830 676C646D 642E3233 41006C6C 50415644 mdlg32.dll.ADVAP
0030:00400840 2E323349 006C6C64 00000000 00000000 I32.dll.........
0030:00400850 00000000 00000000 00000000 00000000 ................

但是这里不是image_import_descriptors的部分。大多数时候我们看到的内存地址为400800，（这是在PE头的空间内），从我跟踪的几个程序的情况分析，还原代码总是把要加载的链接库名字复制到此，而没有破坏真正的image_import_descriptors，因此我们要找到真正的import table的入口地址。

5、下指令。向后搜索字符串
s 30:400850 l ffffffff 'SHELL32.dll'
搜索结果如下：
Pattern found at 0030:0040D382 (0000CB32)
6、下指令。搜索import table部分
s 30:400000 l ffffffff 82,D3,00,00
搜索结果如下：
Pattern found at 0030:0040D234 (0000D234)
7、我们来看看真正的import table的入口，下指令
dd 40d234-c
显示如下：
0030:0040D228 00000000 356C813B 7FCE0000 0000D382 ....;.l5.......
0030:0040D238 0000D2D4 00000000 355A749D BFF70000 .........tZ5....
0030:0040D248 0000D38E 0000D2C0 00000000 356C8139 ............9.l5
0030:0040D258 BFF50000 0000D39B 0000D2B4 00000000 ................
我们要记在其RVA=40D228-400000=0000D228。大小嘛，向下找到大量00字节的地方。计算1B4=0040D3DC-0040D228。
（我想大一点也无所谓吧）
8、好了import table的问题结解决了。再来看看找Entry Point的问题。按F12键回到Notepad.exe领空。（如果你刚才中断在Loadlibrarya领空时，没有按F12的话）显示如下：（需要把光标向上移动几行才能看到我这样的显示结果）
015F:0040596C BE00600000 MOV ESI,00006000
015F:00405971 03F5 ADD ESI,EBP
015F:00405973 8D8D00080000 LEA ECX,[EBP+00000800]
015F:00405979 8BD8 MOV EBX,EAX
015F:0040597B 833E00 CMP DWORD PTR [ESI],00
015F:0040597E 0F840E020000 JZ 00405B92 <---注意了，下一段是循环。这里才是跳出大循环的地方
015F:00405984 51 PUSH ECX
015F:00405985 51 PUSH ECX
015F:00405986 FF9590070000 CALL [EBP+00000790]
015F:0040598C 85C0 TEST EAX,EAX <---按F12后，你回到的就是这个地方
015F:0040598E 0F84DF000000 JZ 00405A73
015F:00405994 8BF8 MOV EDI,EAX
015F:00405996 03403C ADD EAX,[EAX+3C]
015F:00405999 8B4078 MOV EAX,[EAX+78]
015F:0040599C FF743818 PUSH DWORD PTR [EDI+EAX+18]
015F:004059A0 8B4C3824 MOV ECX,[EDI+EAX+24]
9、对于大循环，我们可以直接跳出，下指令
bd *
bpx 405B92
10、按F5键，中断在此：
015F:00405B92 59 POP ECX <--你停在此处
015F:00405B93 5E POP ESI
015F:00405B94 FD STD
015F:00405B95 33C0 XOR EAX,EAX
015F:00405B97 B956030000 MOV ECX,00000356
015F:00405B9C E898740000 CALL 0040D039 <--小心了，按F8键进入
11、按F8键进入Call 0040D039，就到了程序的入口处了。如下：
015F:0040D039 5F POP EDI
015F:0040D03A F3AA REPZ STOSB
015F:0040D03C 61 POPAD
015F:0040D03D 669D POPF
015F:0040D03F 83C408 ADD ESP,08
015F:0040D042 E98540FFFF JMP 004010CC <--这就是真正程序的Entry Point了
12、在JMP 004010CC处，保存内存的映象的时候到了。下指令
Pagein d 400000 e000 c:\temp\dump.exe
13、开始修补dump.exe。用ProcDump把每个Section的Offset改成RVA大小。把PSize改成VSize大小。
把Entry Point改成000010CC (即004010CC-00400000=10CC)。把Directory中的Import Table的RVA改成D228，Size改成1B4即可。

后记：（现在我怎么这么多废话）
从步骤8-13可以发现。Petite2.2加壳的程序一般从Loadlibrarya中断回来就快到真正程序的Entry Point了。一般在循环退出后的一个Call调用内就可以看到Entry Point了。（该循环应该是加载动态链接库的各个函数吧） 而真正的import table一般在LoadLibrarya中断后用搜索的方法可以找到。

俺现在还没能写出ProcDump的Script :-( 。只好Post此文滥芋充数了。不过还好，写此文只花俺1个多小时。写文章看来同样也是熟能生巧的哦。:-)

好了，写Script的历史暂时告一段落。对于写ProcDump中的Bhrama Client不是一日之功，以后有时间再学习学习。
或者哪位高手写个教学，我再学习后再说，那样可以省不少摸索的功夫了。呵呵....


Petite 2.x

 标 题:可否请大侠们发几张关于脱 Petite 2.x 的贴子?谢了! (空)
发信人:1212
时 间:2000-7-27 6:48:57
详细信息:

标 题:脱壳嘛，我说一下，破解嘛，相信你比我更在行。用我前几天的贴子的方法可以脱壳。不过有点区别。 (1千字)
发信人:ljttt
时 间:2000-7-29 13:16:33
详细信息:

简要说一下：
1、设断点
bpx loadlibrarya do "dd esp->4"
2、F12到EditPad.exe领空。
3、向上找到最近的一个JNZ。我这里跟踪时，显示如下：
015F:004B6C01 8BD8 MOV EBX,EAX
015F:004B6C03 833E00 CMP DWORD PTR [ESI],00
015F:004B6C06 0F8415020000 JZ 004B6E21 <--注意
015F:004B6C0C 51 PUSH ECX
015F:004B6C0D 51 PUSH ECX
015F:004B6C0E FF9590070000 CALL [EBP+00000790]
015F:004B6C14 85C0 TEST EAX,EAX <--你停在这儿
015F:004B6C16 0F84E6000000 JZ 004B6D02
015F:004B6C1C 8BF8 MOV EDI,EAX
4、禁止原断点，设新断点
bd *
bpx 004B6E21
5、F5，中断情况如下：
015F:004B6E1C 83EB06 SUB EBX,06
015F:004B6E1F EBC5 JMP 004B6DE6
015F:004B6E21 59 POP ECX <--你停在这儿
015F:004B6E22 5E POP ESI
015F:004B6E23 FD STD
015F:004B6E24 33C0 XOR EAX,EAX
015F:004B6E26 B965030000 MOV ECX,00000365
015F:004B6E2B E8D2720400 CALL 004FE102 <--注意了，按F8
015F:004B6E30 0000 ADD [EAX],AL
015F:004B6E32 0000 ADD [EAX],AL
6、在Call 004FE102语句处F8进入，显示如下：
015F:004FE101 07 POP ES
015F:004FE102 5F POP EDI
015F:004FE103 F3AA REPZ STOSB
015F:004FE105 61 POPAD
015F:004FE106 669D POPF
015F:004FE108 83C40C ADD ESP,0C
015F:004FE10B E96860FBFF JMP 004B4178 <--注意了，真正的Entry Point
7、在JMP语句处Dump内存映象
/dump 400000 100000 c:\temp\dump.exe
8、修补dump.exe的VA=>RVA，Entry Point为004B4178。
9、运行应该成功。
这会很幸运，连import table都不用修补。我Dump出结果import table为0000FF69C。如果不一样，改改试试。


3D Exploration

 标 题:哪位高手能脱3D Exploration的壳，它似乎是用ASProtect1.0加壳的。 (169字)
发信人:hying[CCG]
时 间:2000-8-17 10:34:50
详细信息:
哪位高手能脱3D Exploration的壳，它似乎是用ASProtect1.0加壳的。而且我追时发现3D Exploration的注册码判断部分好象在ASProtect里，不知是否是我水平不够，判断错误。望高手指教。

标 题:3D Exploration的脫殼方法 (1千字)
发信人:C-pen
时 间:2000-8-18 11:40:02
详细信息:

以下我只簡單的介紹,若有表達不善之處,還請見諒:
目標軟體:3D Exploration V.1.3.05BETA
使用工具:Soft-ICE V.4.01,Procdump32,Icedump,Imp_list
過程:1.先用Procdump32去分析它:
Size ofimage:0011E000
Image Base:400000
以上資料待會dump的時候需要另在section當中並無發現.idata和一些section的Name
2.執行3D Exploration再執行Imp_list 重建Import Table,Imp_list會警告你沒有發現.idata不過它還是會產生一個Address.txt,打開它你會發現Import Table的RVA在93000用 Procdump32 再去分析3D Exploration,你會發現在它的section當中有93000的Virtual Offset,此時你應該恍然大悟,原來它有.idata只是section name被刪除而已,不過這還需要驗證,我們先用Procdump32的Pe編輯器將93000的section name補上.idata

3.刪去Imp_list所產生的檔案,因為那是不能用的,待會我們還要重新重建一次,接下來我們要應付Asprotect的CRC Check(因為我們已經動了它的section)
4.在Soft-ICE中加載Icedump,下bpx createfilea do “d *(esp+4)”執行3D Exploration攔住後按F5三次,按F12返回,再按F10Trace來到:
:005BA0C5 CMP EAX,[EBP-04]
:005BA0C8 JZ 005BA106 <--r fl z使其不跳
繼續按F10來到第一次的一連串Push,Mov
:005BA493 MOV EAX,[EAX+08]
:005BA496 CALL 005B9764
:005BA49B XOR EAX,EAX
走到這裡下d 00493000你會看到內存都是0,再往下在004930e8的地方你會看到指針,而hint的部份則在00493bf0~00495fd0,下 f 493bf0 l 495fd0-493bf0 00將hint清為0以免妨礙Imp_list的工作
5.再來就是找OEP了,你可以下s 0 l ffffffff 8b 65 fc eb 01 e8 8b 45 f8找到後G 到這個位址,此時已快到程式進入點了,我這裡是00401000,在此位址下/dump 400000 11E000 C:\3Ddump.exe,再按F5程式就會出現,執行Imp_list重建Import Table
最後的工作:
1.將OEP改為00001000
2.將每個section的Raw Offset改為Virtual Offset,Raw Size 改為Virtual Size
3.Import Table RVA=93000 SIZE=21E0
4.再用Hex WorkShop打開Import0.bin,3Ddump.exe在Import0.bin選取21e0粘貼至3Ddump.exe的93000處
JOHNSON 2000/08/18


Advanced Administrative Tools v4.0.0.596

 标 题:脱壳 ----- AATools v4.0.0.596 (全称：Advanced Administrative Tools)
发信人:ljttt
时 间:2000-8-9 19:53:48
详细信息:

下载：http://newhua.myrice.com/down/aat40a.zip

脱！脱！脱！ ------ 众人曰："还在脱啊！脱光了没！" 答："还剩一条裤衩"

脱壳 ----- AATools v4.0.0.596 (全称：Advanced Administrative Tools)

【前言】

我写文章以交流为主，希望大家在转载时保持文章的完整性。
多日对Asprotect v1.0加壳的程序做战未果，好容易有点收获。兴奋到了极点。晚上奋起神勇，挑灯做战。（老爸在一旁怒吼："几点了，还不睡，想成仙呀！"）。俺姓李，最多只能成半仙，如果俺姓胡就不同了。胡仙......呵呵。

样例文件： AATools.exe （主程序文件）
加壳方式： ASProtect + ASPack v1.084
检测工具： FileInfo
脱壳工具： SoftICE v4.05,ICEPatch v2.0,ICEDump 1.061,ProcDump 1.62,Imp_list（这是一个好东东哦！URL http://www.reversing.net/TOOLS/016/Imp_list.exe）
目标要求： 脱壳
作者： 你看着办吧 ---- 陈小二语
日期： 2000-08-04

在《找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序》一文中我已说明了找Entry Point的方法。（补充：Ding.Boy大虾写了BWW2000可以快速找到Entry Point，强烈推荐，URL http://202.103.134.11/~fsdb/bww.zip）。这里剩下的事就不多了。我再说两句了。

1、首先，当然少不了用ProcDump来分析一下对我们有用的文件信息。
Entry Point: 00222001
Size of image: 00239000
Image Base: 00400000

1、找到Entry Point，在入口处下指令
/dump 400000 239000 c:\temp\dump.exe

2、好，按F5键，程序运行。这时运行Imp_list。单击Rebuild import，片刻，Imp_list会在工作目录下形成四个文件。分别是
Import0.bin
Import1.bin
Import2.bin
Address.txt
怎么样，简单吧。这样就Dump出了import table。

3、用ProcDump修改dump.exe。改各Section的Offset为RVA大小，PSize为VSize大小。改Entry Point为1764C0，改Directory中的Import Table的RVA为17D000，大小为3400。

4、最后别忘了把dump.exe中偏移17D000开始的字节用Import0.bin替换掉。运行OK！

【后记】
这里说两句，首先在看雪的Crack教学中我知道cloundnumer9兄已经成功脱壳了（他的方法我没试过），然后IceWorld大虾在看雪论坛下一贴，既脱壳又破解了。最后才是我赶上这班车。因为开始我用手动脱壳的方法在重建import table上遇到了很大的困难，后来找一工具才帮我度过难关。有兴趣手动脱壳的朋友不妨一试，如果你有好方法可以重建import table，一定要告诉我哦！Imp_list这个工具可不是百试百灵的，不信你试试对AZPR v3.11和ARPR v1.0脱壳试试。

以前我总喜欢在后记中加入自已的一些问题，希望大家帮帮忙，帮我解决。可是一直没有回应。所以这次就不写什么问题了。当然如果谁对加壳、脱壳有兴趣，可以和我交个朋友。Email:ljtt@yeah.net。


看雪学苑

 标 题:请帮忙破解advanced rar password recovery 1.0 final (114字)
发信人:1212
时 间:2000-7-22 8:29:23
详细信息:
小弟急需用arpr1.0，原来的beta1已经有了loader，但这个正式版目前还没有人破解。http://www.elcomsoft.com/ARPR/arpr.zip

标 题:脱壳的方法 (615字)
发信人:cloudnumber9
时 间:2000-7-23 19:57:55
详细信息:

脱壳最重要的一点是找到真正的 Entry Point.
ARPR 1.0 build 45 的 EP 是 cs:401000
找 EP 的方法现在还没有一个现成的，主要是靠经验。
我见过很多asprotect的版本，有的还防 trw,
找 ep 的方法真的是有嘴说不清，反正我都是f8 跟踪过来的，
有些地方有经验了就 f10.
1、trw2k1.22 启动后一定要输入 faults off, 然后运行 arpr
2、bpx cs:401000 (cs 为017f, 视个人的机器）
3、运行到 2 时，如果有注册的 trw2k, 就 makepe.
否则，将 cs:eip 改为 eb fe, 运行后再转到 procdump 将其dump,
好像是上面的 dump , 下面的不行。
然后将 dump 后的程序中的 eb fe 改回原值，修正 ep.

此时的 dump 程序还不能运行，需手工修改 import 表。


OEP定位

 标 题:找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序 (7千字)
发信人:ljtt
时 间:2000-8-3 11:49:37
详细信息:
找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序

【前言】
这几天我在捣鼓对Asprotect加壳程序的脱壳，结果战况惨烈。花了N个钟头，所获甚少。急疯的时候，就差向Asprotect作者索要程序源代码了(当然也想过绑架他，可路费俺花不起)。从跟踪几个加壳程序的情况来看，发现它们的脱壳难度不同，虽然在用FileInfo检测的时候都报告ASProtect + ASPack v1.084加壳。（看来这种"侦察兵"工具也该加紧升级了！！！）
由于Asprotect加壳的程序大多都有防跟踪的代码，已知的有检测SICE,SIWVID,SIWDEBUG,BCHK。（想了解手动跳过防跟踪的方法请看国外大师的文章）这里我可不想每次都把时间花在这上面。我用ICEPatch修补了SoftICE。

以下以Asprotect加壳过的ARPR v1.0为例吧。（注：从我跟踪的Azpr v3.10、AATool v4.0的情况来看，都与此类似。你也可以用Asprotect v1.0加壳一个程序来试试）

样例文件： arpr.exe （ARPR v1.0的主程序文件）
加壳方式： ASProtect + ASPack v1.084
检测工具： FileInfo
调试工具： SoftICE v4.05,ICEPatch v2.0
目标： 找到Entry Point
作者： ljttt
日期： 2000-08-03

一、粗步确定Entry Point的所在的Call调用的方法
首先，要找个比较好的入口进入arpr.exe。由于修补了SoftICE，所以就以这种防跟踪的部分为我们设断点进入的地方。
1、设断点
bpint 3

（注：对于只检测NTICE等防跟踪的加壳程序，可以设断点 bpx CreateFileA，以后类似。不同的地方可能是以后要多按几个F12吧）

这时，一般你可以看到类似如下的屏幕：
015F:004BF23C CC INT 3 <--你中断在此
015F:004BF23D EB02 JMP 004BF241
015F:004BF23F E9025DEB02 JMP 03374F46
015F:004BF244 E9FF33C05A JMP 5B0C2648
015F:004BF249 59 POP ECX
015F:004BF24A 59 POP ECX
015F:004BF24B 648910 MOV FS:[EAX],EDX
015F:004BF24E EB0A JMP 004BF25A
015F:004BF250 E91305FFFF JMP 004AF768 <--注意这个跳转语句，int 3过后就要到这里继续了。
015F:004BF255 E8AA07FFFF CALL 004AFA04
015F:004BF25A 8A1518514C00 MOV DL,[004C5118]
015F:004BF260 8B45F8 MOV EAX,[EBP-08]

2、把光标移到第五个Jmp语句以后，按F7键。好，我们过了第一道陷井。然后按三次F12。然后开始按F10跟踪，
直到出现如下类似屏幕

015F:004BF842 EB13 JMP 004BF857 <--跳转了
015F:004BF844 E91FFFFEFF JMP 004AF768
015F:004BF849 66B80E00 MOV AX,000E
015F:004BF84D E8D2EDFFFF CALL 004BE624
015F:004BF852 E8AD01FFFF CALL 004AFA04
015F:004BF857 8B4508 MOV EAX,[EBP+08] <--跳到此处
015F:004BF85A 8D4818 LEA ECX,[EAX+18]
015F:004BF85D 8B4508 MOV EAX,[EBP+08]
015F:004BF860 8B10 MOV EDX,[EAX]
015F:004BF862 8B4508 MOV EAX,[EBP+08]
015F:004BF865 8B401C MOV EAX,[EAX+1C]
015F:004BF868 E887F6FFFF CALL 004BEEF4 <---哈哈，目标。这就是Entry Point所在的Call调用。
015F:004BF86D 5F POP EDI
015F:004BF86E 5E POP ESI
015F:004BF86F 5B POP EBX
015F:004BF870 5D POP EBP
015F:004BF871 C20400 RET 0004

这里有个窍门，在按完三个F12后，在SoftICE代码窗口用PageDown向下翻页，找最早出现的ret的语句前的Call调用处，按F7键可以快速来到Entry Point所在的Call调用。这样不用按F10一步步地跟踪，不过如果要找import table时，就要一步步的来。

二、找宝贝-------Entry Point

【注】我遇到的Asprotect加壳的程序在跟踪到Entry Point入口的Call调用以后，内部跟踪时有很大不同，简单的，不远处就发现了。难的，其中还有陷井。Asprotect v1.0加壳的程序就是这种情况。arpr.exe也一样。而Thumbnailer就没有这样的危险。

如果你继续跟踪，可能会在一个Call调用中发现这种情况。
015F:004AF992 8BC0 MOV EAX,EAX
015F:004AF994 5A POP EDX
015F:004AF995 54 PUSH ESP
015F:004AF996 55 PUSH EBP
015F:004AF997 57 PUSH EDI
015F:004AF998 56 PUSH ESI
015F:004AF999 53 PUSH EBX
015F:004AF99A 50 PUSH EAX
015F:004AF99B 52 PUSH EDX
015F:004AF99C 54 PUSH ESP
015F:004AF99D 6A07 PUSH 07
015F:004AF99F 6A01 PUSH 01
015F:004AF9A1 68CEFAED0E PUSH 0EEDFACE
015F:004AF9A6 52 PUSH EDX
015F:004AF9A7 E914E3FFFF JMP KERNEL32!RaiseException
015F:004AF9AC C3 RET
看到了吧，这是一个异常，Asprotect留下的陷井。如果没有特别的方法，跟踪就此中断了，虽然离Entry Point不远了。（我为此头痛了好几天）经过几天的奋斗，我找到的以下方法可以继续跟踪。

在JMP KERNEL32!RaiseException处（其实你也可以不用进入此Call调用中，只要在此Call调用前的mov fs:[eax],esp指令后就行了。）
1、下指令
db fs:0

显示如下
0EE7:00000000 D0 FD 5C 00 00 00 5D 00-00 F0 5B 00 F6 38 77 29 ..\...]...[..8w)
0EE7:00000010 00 00 00 00 00 00 00 00-3C A7 5D 81 01 00 FF FF ........<.].....
0EE7:00000020 00 00 00 00 B1 5D 78 C1-8F 29 00 00 C4 A7 5D 81 .....]x..)....].
0EE7:00000030 4C A5 5D 81 48 69 00 80-?? ?? ?? ?? ?? ?? ?? ?? L.].Hi..........
0EE7:00000040 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................

2、注意前四个字节，看到了吗，前四个字节为 D0、FD、5C、00。当成长整数，也就是005CFDD0。好了，我们下指令
dd 015F:005CFDD0
（注：这里下指令 dd 005CFDD0不行，我试过，必须要加你跟踪时的程序所在段选择符，就是SoftICE屏幕中代码部分最左边看到的015F:xxxx字样）

显示如下
015F:005CFDD0 005CFF68 004BEF31 005CFDF8 004ACAF0 h.\.1.K...\...J.
015F:005CFDE0 00489AEC 004BF654 0045CC6F 00400000 ..H.T.K.o.E...@.
015F:005CFDF0 004BE624 005CFE1C 005CFE0C 004BF86D $.K...\...\.m.K.

3、这里注意第四-八个字节，也就是004BEF31。我们下指令
u 004BEF31
（注：这里可以省略段选择符）

显示如下
015F:004BEF31 E93208FFFF JMP 004AF768 <--关键！
015F:004BEF36 E8C90AFFFF CALL 004AFA04
015F:004BEF3B 33C0 XOR EAX,EAX

4、看到了吗Jmp 004AF768，好就在此处下断点
bpx 4AF768

5、好了，准备工作做完，就再不怕Asprotect给我们下的异常陷井了。按F5继续，三次以后（因为我跟踪的情况只有三次异常陷井），还是中断在我们设好的断点处。
以后跟踪的时候，就没有什么难点了，OK，Entry Point离你近在咫尺了。

（注：如果你有了经验，可以还可以进一步简化跟踪步骤。找到它要到的地方，直接按F7，就不用那么多步骤。这也是我前面直接按F7的原因。当然那是我 N * N次战斗后的一点收获。这里我想让大家了解一下原因，就写得详细一点。如果想了解以上方法的原理，到绿盟处下载第十期的月刊。看看WebCrazy写的《 Windows NT/2000内部数据结构探究》一文，如果还不懂，问问WebCrazy吧，抱歉！我只懂这一点儿。如果没有WebCrazy大虾的文章，恐怕我还在Asprotect的陷井中兜圈子。唉，Asprotect连CIH病毒中的一些技术都用进去了。不知道以后还有什么变化。不会把二维变形病毒中的技术也用进去吧，写个什么变形引擎之类的，ou，我这不是没事找抽吗？）

【后记】
由于手头上收集的Asprotect加壳程序不多，所以没法更多的验证。dr0老兄要我说说，就写了此文。
对Asprotect加壳程序的脱壳花了我很长时间。就有些问题向RuFeng兄写信问过，（不过他现在正在开发调试器，打扰他实在抱歉）也没有下文。cloudnumber9兄这些天也没碰上。没办法，自力更生处理了一部分问题。不过我还有许多问题要向各位请教？（老毛病了）看在我写文章劳心劳力劳神的份上，知道的就请告诉我。欢迎交流！！！

1、Asprotect v1.0加壳的程序的import table怎样重建，我用ProcDump得到的不完整，无法使用？手动脱壳也不成功。cloudnumber9兄说国外都已经出了修正工具？那儿有下载？

2、怎样写UnAspack之类的工具？那儿有相关文章？

〖声明〗
说一下我写文章的目的，我希望大家把它当作是一种技术交流，不要当作教学一类。因为许多观点还只是我一家之言，我不想误导初学者。

标 题:如果懂点SEH的话, 不管是int 3 + SEH, 还是RaiseException( ), 都很容易搞定 (160字)
发信人:dr0
时 间:2000-8-4 21:57:36
详细信息:

MSDN上面有介绍SEH, <<Advanced Windows>>上面详细讲述了如何在C中使用SEH, win32asm.cjb.net也有讲用汇编来实现SEH的. 我记得似乎VBOX的某个版本也用了RaiseException( ).


看雪学苑

 标 题:一个工具，据说可以帮助恢复ASprotect 1.05的import table，可惜说明书是俄文的 (105字)
发信人:guest
时 间:2000-7-15 23:35:16
详细信息:

http://www.reversing.net/TOOLS/016/Imp_list.exe

readme
http://www.reversing.net/TOOLS/016/readme.htm 或本地浏览 (俄文)

标 题:这个工具应该可以解决在本机运行的问题。可惜我不懂俄文，哪位高手有兴趣翻译一下。 (315字)
发信人:cloudnumber9
时 间:2000-7-23 17:46:33
详细信息:

虽然不懂俄文，但里面的阿拉伯数字和英文我还是懂。 :-D
他的方法就是把import表提取出来后，按照本机的import表改正。
由于每个人的机器硬件配置和操作系统都不相同，
只有按此笨法（其实是最好的方法）手工改正。

可惜我现在还没有能力编程，不过原理我还知道一些。
其实以前解 aatools 的方法也可以做成 exe, 可惜就是我太菜。


Asprotect by Tsehp

标 题:New essay about AsProtect: http://www.woodmann.com/tsehp_asprotect10.htm (空)
发信人:dr0
时 间:2000-7-12 15:03:48
详细信息:

 | Manually unpacking Asprotect version 1.0 The encrypted import table |
June 2000 | by Tsehp |
 | Courtesy of Reverser's page of reverse engineering | slightly edited by reverser+
 | There is a crack, a crack in everything That's how the light gets in |
Rating | ( )Beginner (x)Intermediate (x)Advanced ( )Expert |

Manually unpacking Asprotect version 2000
The encrypted import table
Written by Tsehp

Introduction

Asprotect is a well know target, this packer was studied a lot and often used as a target practice for newbies.
If you don't know anything about packing, improve your knowledge on the past essays, then come back, I'll try to
explain you their last tricks.
I use to find this target while looking for the sandman's newbie msgboard.
Thanks to a reverser called SV that explained very well the protection on his threads, his work made me save
a lot of time.

Important : This essay can bring you a working app with your actual system, but the import table is not
rebuilt, so if you update your OS and the dll's addresses changes, it will not work anymore and you'll have
to do the entire process again. I'm actually working on another essay to finalize the reconstruction of the
import table.
Tools required
Softice 4.05
Icedump
Procdump
Ida 4.04
An hex editor

Essay made on win 2000, expect to change (later in this essay) some import addresses if you're working on win 9x.
Target's URL/FTP
http://www.tamos.com/
This is Commview 2.1, another portsniffer.

Essay

1) The anti-softice routines
Before lauching this app, you have to hide your debugger.
This prog uses two typical anti softice tricks:
-Is the driver loaded ? : bpx createfileA do "d esp-4"
Commview tries to see if three different versions of softice are loaded. You will hit three times :
SIWDEBUG
SICE
NTICE
Well it depends on the system you're on, press F12 at each time, the createfilea must return 0xFFFFFFFF
If not, press F12 again and set your eip to the address pointed by the second jnz below, you will pass all the
tests.
-The boundschecker trick.
Sice uses int3 for its breakpoints, but when special values are set to register, especially ebp containing
'BCHK' 0x4243484b, then if an int3 is encountered, the normal interrupt handler just returns after this
Int3 inside your target, so the code just after is executed if sice is present.
To avoid this, press F10 several times after setting your eip, go slowly through the code until you see the
int3 in sice. When you're on it, change your ebp to something else than 0x4243484b, then the program will run
normally until a last check detected by bpx createfilea, just as above.
For the final check, just invert the jz after the createfileA, all the tests are now defeated.
Note : I used to munually do that, because frogsice is not actually implemented on win NT, the actual copy on
nt called Ntall is not fully working, so I couldn't use a loaded device to avoid those manipulations.
2) Locating the Entry point.
If you want to dump your packed program, you must stop the target here, so all the sections would be loaded.
I have to admit that I directly used the technique that Eternal Bliss found on the newbie's forum. Here it is,
untouched :
Steps:
1) bpx on getprocaddress
2) Once you break, look at the .idata section by "dd 4E3000". This is found by doing "map32 cv"
3) bpm on the 1st byte (just to break there) and disable getprocaddress breakpoint
4) F5 and let the program run
5) Upon breaking, disable all breakpoints
6) F12 4 times and you will land at a Xor EAX, EAX
7) Start tracing with F10
8) Everytime you come across a CALL, check that a few instructions below are JMP
9) If it is, you can trace over it
10) If it is a ret, you have to trace into that CALL with F8
11) Then step over the 2 subsequent CALLs
12) You will see the OEP moved into EAX somewhere there
13) Then you will come across a POPAD
14) The JMP stuff appears again like the start of the unpacking code.
15) Trace into the next (3rd) Call and F8 all the way till you hit a ret
16) Continue with it and you will land in on the OEP.

Just apply this and you will find it, 0x4de384 on my system. Just remember that you will find almost all the
time a POPAD instruction just before the final jump.
Just as an exercise, you can try to dump the exe, using icedump and procdump to rebuild the pe (this will not
be explained here, if you don't know how to do this, just look at the past packer/unpacker essays).
You have to manually hex copy the .aspr original section to your dumped file to continue the essay, this
manipulation will just replicate the partial import table to your dumped exe, just like the packed commview.
But this will not work, just try to load your dumped exe inside ida and you will notice that the import table
is damaged, some virtual addresses in other sections are also pointed to wrong places.
The main protection of Asprotect is just here : Some imports are fine, some other are pointing to a table (located
in mem at 0x00CDxxxx) normally containing some decrypted import's addresses, and this table originally contains
also some routines to decrypt other addresses when commview needs them, even if this prog is unpacked.
Well we have here a big problem :
You can manually fix the import table if you convert all the tables addresses to the .idata at the right place.
So if inside you dumped app, inside .idata you have
4e328c : jmp [cd4950] and cd4950 containing 77db858e (a valid import address)
you have to convert the jump at 4e328c to directly point at 77db858e.
You will spend a lot of time, then it will not work. Because inside the cdxxxx table, some addresses points
to code like this :
cd4950 push cd495a
       call 182f68 (for example)
Whats happening ? When commview does call 4e328c (import table) the routine located at cd4950 just decrypts
the right import adress AT RUNTIME ! You can also try to dump the cdxxxx table, the decrypting code will
still be here and definitely not working. This feature is the real improvement made since the last Asprotect
versions.
To summarize, four different things happens to the import table : 4 different cases in my following prog
1- api's address is copied directly to .idata
2- api's address is relocated to the Cxxxxx table
3- decypting routine is copied to the Cxxxxx table
4- an indirect call to GetprocAddress (in Cxxxxx table) is copied to .idata
3) Preparing to dump
You are still on the int3 instruction, just do a S 0 L FFFFFFFF  AC 08 C0 74 E4 and you will localize the
*culprit* loop that builds the import table, just do a bpmb at the start.
Here is what you find :
001B:0018A51E  AC                  LODSB
001B:0018A51F  08C0                OR        AL,AL
001B:0018A521  74E4                JZ        0018A507
001B:0018A523  4E                  DEC       ESI
001B:0018A524  56                  PUSH      ESI
001B:0018A525  53                  PUSH      EBX
001B:0018A526  80F802              CMP       AL,02
001B:0018A529  7407                JZ        0018A532
001B:0018A52B  0FB64E01            MOVZX     ECX,BYTE PTR [ESI+01]
001B:0018A52F  41                  INC       ECX
001B:0018A530  EB05                JMP       0018A537
001B:0018A532  B904000000          MOV       ECX,00000004
001B:0018A537  41                  INC       ECX
001B:0018A538  01CE                ADD       ESI,ECX
001B:0018A53A  E8B5FDFFFF          CALL      0018A2F4 <- redirect this point note the address 0x18a2f4.
001B:0018A53F  AB                  STOSD
001B:0018A540  EBDC                JMP       0018A51E <- note this address too, it's the loop back jump.

All we have to do is to find a free mem location filled with 0 so we can write a small code to modify this
routine. The address 0x190000 will be used as an example.
First patch 18a53a jmp 190000
Then write the following code in mem with softice :
190000 call 18a2f4 ; we use the legal call
190005 cmp ecx,40000000 ; ecx contains an api address ?
19000b jle 19001c ; if not
19000d add ecx,eax ; if yes convert the address***case 2
19000f add ecx,5 ; to the absolute api address for a normal import table
190012 mov dword ptr [edi],ecx ; put it in import table, pointed by edi
190014 add edi,4 ; updates edi to the next import
190017 jmp 18a51e ; back to normal
19001c cmp ecx,0 ; is it case 4 ?
19001f jz 19002e
190021 cmp eax,40000000 ; eax contains an api address ?
190026 jle 19003c ; if not go to 19003c
190028 stosd ; we're in case 1, direct copy of valid api address in import table
190029 jmp 18a51e ; back to normal
19002e push dword ptr [eax+1] ; we're in case 3, pushes the encrypted api address
190031 call 16df80 ;IMPORTANT
you have to locate this Asprotect address by doing a S 0 L FFFFFFFF 55 8b ec 81 c4 f8 fe ff ff 53 56
so we found as example 16df80, you MUST modify the code at offset 16df80+95 with three nops (90), if you don't
this call will generate an error 13 in Asprotect (the call doesn't return properly)
this call is used to decypher the encrypted api address, normally decrypted at run time
190036 stosd ; the api's address is then decrypted, copy it to import table
190037 jmp 18a51e ; back to normal, don't forget that this is the loop back jump
19003c mov eax,KERNEL32!GetProcAddress ; use softice to have your system's getprocaddress. this is case 4
190041 stosd ; copy to import table
190042 jmp 18a51e ; back to normal
When you are finished typing this, put a bpmb to the prog's starting point (I found 0x4de384 )
then launch, if you typed correctly, the import table is now normal and you can dump it using icedump :
PAGEIN D 400000 12d000 c:\temp\cv_dump.exe
Then use procdump to rebuild the pe.
Very important : Use those procump options when rebuilding the pe :
Structure : all enabled
Import : don't rebuild import
Leave other options untouched.

You have to manually copy the .aspr section from cv.exe (original) to cv_dumped.exe, using your favorite
hexeditor. As an example I found inside original raw offset : 5aa00 length 14800
dumped raw offset : ff400 length 14800, this manipulation will copy back the original import table.
Modify the entry point to 000de384 inside procdump, so your dumped exe will start at 4de384.
Copy your dumped exe to the commview directory.
Now if you launch it, it will direct exit, because there is a crc check, we have to patch this code inside
the dumped cv_dumped.exe :
004DE3B9                 call    sub_4524A0
004DE3BE                 mov     eax, [ebp+var_10]
004DE3C1                 call    sub_465118
004DE3C6                 cmp     eax, 6F200h
004DE3CB                 jz      short loc_4DE3D2 <- patch to jmp 4de3d2
004DE3CD                 call    sub_403BB4

Don't forget one thing, there is still an anti softice left. Reactivate the bpx createfilea do "d esp->4";
press F12 when it hits then invert the jz just after.
Launch again, it's now working and you're ready to continue the reversing of this crippled, time trial exe.
4) What's left to crack ?
Now the real work is finished, we can patch whatever we want inside. I will easily give you the patches,
just because this section was not the main part of my essay, this will surely save you some work.
To finish its agony, we dwelve with :
-Anti softice routine : typical one, just after the well known createfileA :

0046573E                 call    sub_406D0C (createfileA with softice driver as an argument)
00465743
00465743 crack5:
00465743                 cmp     eax, 0FFFFFFFFh is it loaded ?
00465746                 jz      short loc_465750 <- patch this to jump
00465748                 push    eax
00465749                 call    sub_406CEC
0046574E                 mov     bl, 1

-The time limit :You usually find those after a bpx to getlocaltime, and trace after.
004D8D5B                 call    sub_44EB74 ; this call contains a call to getlocaltime
004D8D60
004D8D60 loc_4D8D60:                             ; CODE XREF: sub_4D899C+386j
004D8D60                 mov     eax, ds:dword_4E051C
004D8D65                 cmp     byte ptr [eax], 0 ;is the trial finished ?
004D8D68
004D8D68                 jnz     short loc_4D8DB8 <- force this to jump
004D8D6A                 mov     eax, ds:dword_4E0378

-half of the packets displayed : an easy one with ida, just find the reference to string :
0048B5A4                 push    offset loc_48BB1C
0048B5A9                 push    dword ptr fs:[eax]
0048B5AC                 mov     fs:[eax], esp
0048B5AF                 cmp     byte ptr [ebx+5Fh], 0
0048B5B3
0048B5B3                 nop ; nop those so it never jumps to 48b5c2, you guessed why
0048B5B4                 nop
0048B5B5                 lea     edx, [ebp-14h]
0048B5B8                 mov     eax, [ebx+22h]
0048B5BB                 call    sub_48A7C0
0048B5C0                 jmp     short loc_48B5CF
0048B5C2 ; ---------------------------------------------------------------------------
0048B5C2                 lea     eax, [ebp-14h]
0048B5C5                 mov     edx, offset aDataThisEvalua ; "DATA:THIS EVALUATION VERSION DISPLAYS O"...
0048B5CA                 call    sub_403E08

you have two more places to do the same, find them and correct the *bug* .
-the annoying nag when you leave commview: I found it after a bpx to createwindowsexa, you have to press F12
a lot of times to find this routine :

00459718 loc_459718:                             ; CODE XREF: sub_45969C+6Cj
00459718                                         ; sub_45969C+70j
00459718                 mov     eax, [ebp+var_C]
0045971B                 mov     edx, [eax]
0045971D                 nop <- you have to nop this call to avoid the nag
0045971E                 nop
0045971F                 nop
00459720                 nop
00459721                 nop
00459722                 nop
00459723                 mov     [ebp-8], eax
00459726                 xor     eax, eax
00459728                 pop     edx
00459729                 pop     ecx
0045972A                 pop     ecx
0045972B                 mov     fs:[eax], edx
0045972E                 push    offset loc_459743
00459733
00459733 loc_459733:                             ; CODE XREF: CODE:00459741j
00459733                 mov     eax, [ebp+var_C]
00459736                 call    sub_403024
0045973B                 retn

Now you can enjoy your new portsniffer, auto rebuilded by itself, just like it always should be.

Final Notes
I need your feedback for this essay, so please write your comments after trying it at the msgboard :
http://www.insidetheweb.com/mbs.cgi/mb155985
You can join all the reverser's forums at sandman's , where I had this idea :
http://www.insidetheweb.com/mbs.cgi/mb628842
Or on the fravia msgboard, for intermediate and advanced ones :
http://www.insidetheweb.com/mbs.cgi/mb155985
Thanks to Eternal Bliss ,r!sc and SV for their preliminary work on that interesting target.
Tsehp
Ob Duh
I wont even bother explaining you that you should BUY this target program if you intend to use it for a longer period than the allowed one. Should you want to STEAL this software instead, you don't need to crack its protection scheme at all: you'll find it on most Warez sites, complete and already regged, farewell, don't come back.
You are deep inside reverser's page of reverse engineering, choose your way out:

标 题:我使用的是 trw2k 1.22，代码和 softice 的不同，trw2k 的 a 功能实在是太差了 (240字)
发信人:cloudnumber9
时 间:2000-7-23 18:05:26
详细信息:

找到stosd的方法：原作者的实在是太乱。
以 arpr 1.0 build 45 为例，
1，bpx 45c001
2, bpmd cs:41841c （在第二次中断时，有可能每个人的都不相同）

输入的代码基本上相同，只在第4种情况判断时要改正，我反正是
直接 stosd, 现在还没有发现问题。


看雪学苑

 标 题:抛砖引玉，AsProtect 修正 import表的一些想法 (579字)
发信人:cloudnumber9
时 间:2000-7-23 20:27:53
详细信息:
看到国外都已经有修正工具了，实在是替中国人急。
由于我水平有限，只知道大概原理，希望有高手出面也做个修正工具。
AsProtect 加密的 import table 还是有迹可寻的。
例如：41841c 为加密过的 RegCloseKey （好像是第一个地址）
4186b8 为 GetModuleHandleA
418694 为 GetCommandLineA
我估计每个 AsProtect 版本的加密函数的顺序是固定的，所以才会有
改正工具。
改正方法，
1、首先先脱壳，脱壳后的文件可以分发下载。
2、用工具将脱壳后文件的 import table 提出。（在用户机器）
3、用工具将对应的函数改回。（在用户的机器）
这就是我所能想到的，肯定有不少问题，请知道的一定来信告知。


Asprotect判断加壳标志

 标 题:Asprotect判断被其加壳的程序的标志是什么？---里面就是。 (1千字)
发信人:ljttt
时 间:2000-8-6 19:23:24
详细信息:
Asprotect判断被其加壳的程序的标志是什么？---里面就是。

【前言】
这次就不写什么作者等等没意思的东东。只希望大家多多交流。只可惜我以前问的问题一直没人回答。

Asprotect是如何判断被其加壳的程序呢？我找到以下一处。（可能还有其他的地方，我没有进行更多的测试）
以下是程序代码。找个PE结构说明一对照，很简单。

:0043F85C 8B4034 mov eax, dword ptr [eax+34] <---得到IMAGE_NT_HEADERS首地址
:0043F85F 05F4000000 add eax, 000000F4
:0043F864 F6400210 test [eax+02], 10 <---判断字节是否为10
:0043F868 7403 je 0043F86D <---相同，就说明是被其加壳过的程序
:0043F86A B001 mov al, 01
:0043F86C C3 ret
:0043F86D 33C0 xor eax, eax <---设标志了
:0043F86F C3 ret

【说明】
由于脱壳后的程序一般比原程序要大得多，因此一旦把程序脱壳破解后，总会用压缩软件重新压缩。但是由于对Asprotect加壳的程序脱壳后文该标志没有改变。因此你想重新加壳的话，就要改变此标志。

以下是步骤说明：

由于脱壳后的程序一般比原程序要大得多，因此一旦把程序脱壳破解后，可以用以下方法重新加壳。

1、用Hex WorkShop打开脱壳后的可执行文件。
2、把光标定位到偏移176地址处。（因为一般80处为PE标志。80+F4+2=176）
3、这时加壳过的程序应该看到10，修改10为00即可。
4、用Asprotect重新加壳。

【后记】
另外，对已经用Asprotect加壳过的程序就不要改了。Asprotect再加壳时会出错。要不然，每个软件作者都用此法把程序加个十几遍壳，那还让大家活不活了 ;-) 。当然了，相反，你也可以改变此标志，使未加壳的程序让Asprotect误认为已经加壳。


Asprotect脱壳的小结

 标 题:对Asprotect脱壳的一点总结 (20千字)
发信人:ljttt
时 间:2000-8-12 15:58:35
详细信息:
对Asprotect脱壳的一点总结

作者： （职位空缺）上次忘了留下联系电话，这次补上，欢迎各位垂询，小弟我在此静候佳音。热线电话：818-9481818。...你知道这是哪儿的电话号码。.......公厕电话......... @#$@#$ 熏倒 @#$@#$....
写作日期： 2000-08-11

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

【前言】

从我知道的情况来看，对Asprotect加壳的程序大致可以分为三类：（这种分类方法不具有权威性，只是我自己为了区别而已）

1、这类程序只检测SICE,SIWVID,SIWDEBUG，内存中可以得到完整的import table。一次跟踪可完成脱壳。
2、这类程序检测SICE,SIWVID,SIWDEBUG和BCHK，内存中也可以得到完整的import table。一次跟踪也可完成脱壳。
3、这类程序同 2 ，只是内存中无法得到完整的import table。因此需要其他手段来辅助得到import table。可能需要几次跟踪完成脱壳。

以上三类程序脱壳方式基本相同。因此我把跟踪过程中几个关键的特征说明一下。

【分析】

①寻找合适的中断进入加壳程序。（我称为找进入点）
（注：在跟踪之前，最好用ICEPatch修补你的SoftICE，否则你就要手动跳过防跟踪代码了）

对于 1 类程序，一般可以用以下方式进入：
Ctrl-D中断，进入SoftICE。下指令
bpx CreateFileA do "p ret"
然后按F5返回Windows，运行加壳程序，中断在我们所设下的中断处。

以后的跟踪可以直接继续，看见不远处有 ret 语句还可以按 F12 键快速返回到上一层调用中。

对于 2 、3 两类程序，一般可以用以下方式进入（操作方法同上，只是设下的断点不同）。这次我们设断点
bpint 3

以后的跟踪与上有些不同，在《找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序》一文中我已有说明，这里简要说明一下。

中断后一般你可以看到类似如下的屏幕：
015F:004BF23C CC INT 3 <--你中断在此
015F:004BF23D EB02 JMP 004BF241
015F:004BF23F E9025DEB02 JMP 03374F46
015F:004BF244 E9FF33C05A JMP 5B0C2648
015F:004BF249 59 POP ECX
015F:004BF24A 59 POP ECX
015F:004BF24B 648910 MOV FS:[EAX],EDX
015F:004BF24E EB0A JMP 004BF25A
015F:004BF250 E91305FFFF JMP 004AF768 <--注意这个跳转语句，int 3过后就要到这里继续了。
015F:004BF255 E8AA07FFFF CALL 004AFA04
015F:004BF25A 8A1518514C00 MOV DL,[004C5118]
015F:004BF260 8B45F8 MOV EAX,[EBP-08]

把光标移到第五个Jmp语句以后，按F7键。好，以后的跟踪和上面的方法相同。

②检测CRC的地方
在按了几个 F12后，一般就到了检测CRC的代码地方，这里我们不需要做什么，只是让大家明白，如果你改到了程序某处，在这里就要关心一下了。

015F:004C6B74 EBF0 JMP 004C6B66
015F:004C6B76 8B45EC MOV EAX,[EBP-14] <--注意此处
015F:004C6B79 3B45F0 CMP EAX,[EBP-10] <--注意此处
015F:004C6B7C 7443 JZ 004C6BC1 <--如果比较的结果相同，就跳转了，否则就到下面显示File corrupted! 的框框了
015F:004C6B7E 8A155CC94C00 MOV DL,[004CC95C]
015F:004C6B84 8B45F8 MOV EAX,[EBP-08]
015F:004C6B87 E848E4FFFF CALL 004C4FD4
015F:004C6B8C 8945F4 MOV [EBP-0C],EAX
015F:004C6B8F 837DF400 CMP DWORD PTR [EBP-0C],00
015F:004C6B93 742C JZ 004C6BC1
015F:004C6B95 8D85E4FEFFFF LEA EAX,[EBP-011C]
015F:004C6B9B 8D95E9FEFFFF LEA EDX,[EBP-0117]

大家注意其中三句的特征，以后跟踪时就知道这里是比较CRC的地方就行了。对于做inline patch的朋友就要记住了。

③获得 import table 和 Entry Point
在按过几下 F12 键后，就会来到类似如下代码的地方，这里我以ARPR.EXE来做例子，来一段段的分析一下，许多Asprotect加壳的程序都有这样一段，熟悉了特征以后，再对Asprotect脱壳你也可以很轻松了。

015F:004C6EAB E828FAFFFF CALL 004C68D8
015F:004C6EB0 33C0 XOR EAX,EAX <--你来到此处,一般 XOR EAX,EAX 是特征.
015F:004C6EB2 5A POP EDX
015F:004C6EB3 59 POP ECX
015F:004C6EB4 59 POP ECX
015F:004C6EB5 648910 MOV FS:[EAX],EDX
015F:004C6EB8 EB11 JMP 004C6ECB <--跳到下一段
015F:004C6EBA E9E900FFFF JMP 004B6FA8
015F:004C6EBF 33C0 XOR EAX,EAX
015F:004C6EC1 E89EEFFFFF CALL 004C5E64
015F:004C6EC6 E87903FFFF CALL 004B7244

以后我们重点关注几个Call调用，以后再跟踪这类Asprotect加壳的程序就有经验了。

015F:004C6ECB 33C0 XOR EAX,EAX
015F:004C6ECD 55 PUSH EBP
015F:004C6ECE 68086F4C00 PUSH 004C6F08
015F:004C6ED3 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6ED6 648920 MOV FS:[EAX],ESP
015F:004C6ED9 8B4508 MOV EAX,[EBP+08]
015F:004C6EDC 8B00 MOV EAX,[EAX]
015F:004C6EDE 50 PUSH EAX
015F:004C6EDF B804464C00 MOV EAX,004C4604
015F:004C6EE4 50 PUSH EAX
015F:004C6EE5 6A00 PUSH 00
015F:004C6EE7 8B4508 MOV EAX,[EBP+08]
015F:004C6EEA 8D4824 LEA ECX,[EAX+24]
015F:004C6EED 8B4508 MOV EAX,[EBP+08]
015F:004C6EF0 8D500C LEA EDX,[EAX+0C]
015F:004C6EF3 8B4508 MOV EAX,[EBP+08]
015F:004C6EF6 8B4008 MOV EAX,[EAX+08]
015F:004C6EF9 E842F0FFFF CALL 004C5F40 <--注意这个Call调用
015F:004C6EFE 33C0 XOR EAX,EAX
015F:004C6F00 5A POP EDX
015F:004C6F01 59 POP ECX
015F:004C6F02 59 POP ECX
015F:004C6F03 648910 MOV FS:[EAX],EDX
015F:004C6F06 EB13 JMP 004C6F1B <--跳到下一段
015F:004C6F08 E99B00FFFF JMP 004B6FA8
015F:004C6F0D 66B80B00 MOV AX,000B
015F:004C6F11 E84EEFFFFF CALL 004C5E64
015F:004C6F16 E82903FFFF CALL 004B7244

在以上要注意的Call调用处我们可以停下来，下指令
d 401000 （说明： 401000由来为 <Image Base>+<First Section RVA> ）
我们可以看到在没有执行这个Call调用之前，数据窗口显示的为 ?? ??。这说明这段代码还没有加载到内存中。如果按 F10键执行这个调用过后，数据窗口就会显示各种十六进制数据。这说明这个Call调用的基本功能为加载数据。

（按上段）
015F:004C6F1B 33C0 XOR EAX,EAX
015F:004C6F1D 55 PUSH EBP
015F:004C6F1E 68716F4C00 PUSH 004C6F71
015F:004C6F23 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6F26 648920 MOV FS:[EAX],ESP
015F:004C6F29 8B4508 MOV EAX,[EBP+08]
015F:004C6F2C 8B00 MOV EAX,[EAX]
015F:004C6F2E 50 PUSH EAX
015F:004C6F2F B8485E4C00 MOV EAX,004C5E48
015F:004C6F34 50 PUSH EAX
015F:004C6F35 B85C5E4C00 MOV EAX,004C5E5C
015F:004C6F3A 50 PUSH EAX
015F:004C6F3B 6A00 PUSH 00
015F:004C6F3D B8645E4C00 MOV EAX,004C5E64
015F:004C6F42 50 PUSH EAX
015F:004C6F43 B8A4894B00 MOV EAX,004B89A4
015F:004C6F48 50 PUSH EAX
015F:004C6F49 8B4508 MOV EAX,[EBP+08]
015F:004C6F4C 8B4020 MOV EAX,[EAX+20]
015F:004C6F4F 50 PUSH EAX
015F:004C6F50 8B4508 MOV EAX,[EBP+08]
015F:004C6F53 8D4824 LEA ECX,[EAX+24]
015F:004C6F56 8B4508 MOV EAX,[EBP+08]
015F:004C6F59 8B500C MOV EDX,[EAX+0C]
015F:004C6F5C 8B4508 MOV EAX,[EBP+08]
015F:004C6F5F 8B4008 MOV EAX,[EAX+08]
015F:004C6F62 E81DF1FFFF CALL 004C6084 <--注意这个Call调用
015F:004C6F67 33C0 XOR EAX,EAX
015F:004C6F69 5A POP EDX
015F:004C6F6A 59 POP ECX
015F:004C6F6B 59 POP ECX
015F:004C6F6C 648910 MOV FS:[EAX],EDX
015F:004C6F6F EB13 JMP 004C6F84 <--跳到下一段
015F:004C6F71 E93200FFFF JMP 004B6FA8
015F:004C6F76 66B80C00 MOV AX,000C
015F:004C6F7A E8E5EEFFFF CALL 004C5E64
015F:004C6F7F E8C002FFFF CALL 004B7244

我们再来关注一下上面这个要注意的Call调用。如果你用 F10 键带过这个Call调用。会发现数据窗口的内容改变了。好我们再来看看 idata Section所在位置的情况，下指令
d 418000 （注：ARPR.EXE的Image Base为 400000，idata Section 的 RVA 为 18000）
可以看到数据窗口显示的全是 00，向下翻页，仍然是 00，这说明这个Call调用的功能可能是解压还原代码，并且初始化 idata Section。

（接上段）
015F:004C6F84 B84B894B00 MOV EAX,004B894B
015F:004C6F89 40 INC EAX
015F:004C6F8A 890530DA4C00 MOV [004CDA30],EAX
015F:004C6F90 B82B894B00 MOV EAX,004B892B
015F:004C6F95 890534DA4C00 MOV [004CDA34],EAX
015F:004C6F9B FF0534DA4C00 INC DWORD PTR [004CDA34]
015F:004C6FA1 33C0 XOR EAX,EAX
015F:004C6FA3 55 PUSH EBP
015F:004C6FA4 6805704C00 PUSH 004C7005
015F:004C6FA9 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6FAC 648920 MOV FS:[EAX],ESP
015F:004C6FAF B8485E4C00 MOV EAX,004C5E48
015F:004C6FB4 50 PUSH EAX
015F:004C6FB5 B8AC694B00 MOV EAX,004B69AC
015F:004C6FBA 50 PUSH EAX
015F:004C6FBB A130DA4C00 MOV EAX,[004CDA30]
015F:004C6FC0 50 PUSH EAX
015F:004C6FC1 A134DA4C00 MOV EAX,[004CDA34]
015F:004C6FC6 50 PUSH EAX
015F:004C6FC7 B8645E4C00 MOV EAX,004C5E64
015F:004C6FCC 50 PUSH EAX
015F:004C6FCD B894954B00 MOV EAX,004B9594
015F:004C6FD2 50 PUSH EAX
015F:004C6FD3 B874954B00 MOV EAX,004B9574
015F:004C6FD8 50 PUSH EAX
015F:004C6FD9 B834904B00 MOV EAX,004B9034
015F:004C6FDE 50 PUSH EAX
015F:004C6FDF 8B4508 MOV EAX,[EBP+08]
015F:004C6FE2 8B4020 MOV EAX,[EAX+20]
015F:004C6FE5 50 PUSH EAX
015F:004C6FE6 B9E0944B00 MOV ECX,004B94E0
015F:004C6FEB 8B4508 MOV EAX,[EBP+08]
015F:004C6FEE 8B5014 MOV EDX,[EAX+14]
015F:004C6FF1 8B4508 MOV EAX,[EBP+08]
015F:004C6FF4 8B00 MOV EAX,[EAX]
015F:004C6FF6 E8A5F5FFFF CALL 004C65A0 <--注意这个Call调用
015F:004C6FFB 33C0 XOR EAX,EAX <--这里一般就是Dump import table的地方
015F:004C6FFD 5A POP EDX
015F:004C6FFE 59 POP ECX
015F:004C6FFF 59 POP ECX
015F:004C7000 648910 MOV FS:[EAX],EDX
015F:004C7003 EB13 JMP 004C7018 <--跳到下一段
015F:004C7005 E99EFFFEFF JMP 004B6FA8
015F:004C700A 66B80D00 MOV AX,000D
015F:004C700E E851EEFFFF CALL 004C5E64
015F:004C7013 E82C02FFFF CALL 004B7244

我们来看看上面这个要注意的Call调用有什么作用。如果你用 F10 键带过这个Call调用，再看看数据窗口的变化，
我们向下翻页看看，这次不再是 00，变成各种数据。这说明这个Call调用的功能可能是还原 idata Section，因此在该调用后的 XOR EAX,EAX就是我们Dump出 import table的地方。对于前面划分出的三类程序中前两类，都可以在此处看到完整的 import table，是Dump出 import table的时候了，可以下指令
/dump <Image Base + idata Section RVA> <idata Section Size> <FileName> （这是ICEDump 1.61的指令用法）
而对于第三类程序则要用其他方法。（补充说明：对于第三类程序的 import table重建问题由于我也没有找到一种统一的方法。只能不同情况不同对待。因此以后单独写文说明。）

如果你喜欢用 bpm 跟踪 idata Section的变化来做进入点。那么一般在按几个 F12键后，就在处了。

（接上段）
015F:004C7018 33C0 XOR EAX,EAX
015F:004C701A 55 PUSH EBP
015F:004C701B 6838704C00 PUSH 004C7038
015F:004C7020 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C7023 648920 MOV FS:[EAX],ESP
015F:004C7026 8B4508 MOV EAX,[EBP+08]
015F:004C7029 E8D6FCFFFF CALL 004C6D04 <--注意这个Call调用
015F:004C702E 33C0 XOR EAX,EAX
015F:004C7030 5A POP EDX
015F:004C7032 59 POP ECX
015F:004C7033 648910 MOV FS:[EAX],EDX
015F:004C7036 EB13 JMP 004C704B <--跳到下一段
015F:004C7038 E96BFFFEFF JMP 004B6FA8
015F:004C703D 66B81100 MOV AX,0011
015F:004C7041 E81EEEFFFF CALL 004C5E64
015F:004C7046 E8F901FFFF CALL 004B7244

如果我们用 F10 键带过这个Call调用，会发现数据窗口的内容又有所变化。不过这次我们看到的数据都比较大。如果你进入此调用跟踪会发现它的作用就是获取idata Section中的各个函数的指针放入此处，如果你对可执行文件的加载机制有所了解的话，那么就知道这是加壳程序在做Windows的工作，把各个Fircc转换成真正函数入口指针。因此过了此处，你再就无法获得"干净"的import table了。

（接上段）
015F:004C704B 33C0 XOR EAX,EAX
015F:004C704D 55 PUSH EBP
015F:004C704E 6884704C00 PUSH 004C7084
015F:004C7053 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C7056 648920 MOV FS:[EAX],ESP
015F:004C7059 B8645E4C00 MOV EAX,004C5E64
015F:004C705E 50 PUSH EAX
015F:004C705F 8B4508 MOV EAX,[EBP+08]
015F:004C7062 8B4810 MOV ECX,[EAX+10]
015F:004C7065 8B4508 MOV EAX,[EBP+08]
015F:004C7068 8B5004 MOV EDX,[EAX+04]
015F:004C706B 8B4508 MOV EAX,[EBP+08]
015F:004C706E 8B00 MOV EAX,[EAX]
015F:004C7070 E833F6FFFF CALL 004C66A8 <---注意此Call调用
015F:004C7075 A22CDA4C00 MOV [004CDA2C],AL
015F:004C707A 33C0 XOR EAX,EAX
015F:004C707D 59 POP ECX
015F:004C707E 59 POP ECX
015F:004C707F 648910 MOV FS:[EAX],EDX
015F:004C7082 EB13 JMP 004C7097 <--跳到下一段
015F:004C7084 E91FFFFEFF JMP 004B6FA8
015F:004C7089 66B80E00 MOV AX,000E
015F:004C708D E8D2EDFFFF CALL 004C5E64
015F:004C7092 E8AD01FFFF CALL 004B7244

对于此Call调用是什么作用，我现在还说不出来。如果你用 F10 键带来，一点事没有。但是如果你是一个好奇心太强的人，按 F8 键进入看个究竟的话，那么我恭喜你，你进入了 Asprotect 的圈套。也许你会在带过某个Call调用时程序运行了。因此你一定以为其中有 Entry Point ，于是重新来过，又进入那个Call调用看看，如此反复，也许你会某一层中发现 Entry Point，果真如此，那么我十分钦佩你的精神。我在跟踪到第四层时依然没有找到，就放弃了。至今我还没有弄明白这种圈套是怎么实现的。不过Asprotect作者一定很高兴他写的代码一行也没有浪费。

（接上段）
015F:004C7097 8B4508 MOV EAX,[EBP+08]
015F:004C709A 8D4818 LEA ECX,[EAX+18]
015F:004C709D 8B4508 MOV EAX,[EBP+08]
015F:004C70A0 8B10 MOV EDX,[EAX]
015F:004C70A2 8B4508 MOV EAX,[EBP+08]
015F:004C70A5 8B401C MOV EAX,[EAX+1C]
015F:004C70A8 E887F6FFFF CALL 004C6734 <---注意此Call调用
015F:004C70AD 5F POP EDI
015F:004C70AE 5E POP ESI
015F:004C70AF 5B POP EBX
015F:004C70B0 5D POP EBP
015F:004C70B1 C20400 RET 0004

如果你是个懒人，直接到此。那么我说你真有福气。这个Call调用一定要按 F8 键进入。其中你可以找到 Entry Point。

④获取整个内存映象
在进入Call调用后，对于前两类程序和后一类程序的情况有所不同

（注：这里以跟踪BrickShooter时截取的屏幕和跟踪ARPR时截取的屏幕做一比较）

跟踪BrickShooter的情况（代表前两类程序，以下简称 ㈠）
015F:0056EB4A 8BC0 MOV EAX,EAX
015F:0056EB4C 55 PUSH EBP
015F:0056EB4D 8BEC MOV EBP,ESP
015F:0056EB4F 83C4F8 ADD ESP,-08
015F:0056EB52 53 PUSH EBX
015F:0056EB53 8BDA MOV EBX,EDX
015F:0056EB55 8945FC MOV [EBP-04],EAX
015F:0056EB58 8B01 MOV EAX,[ECX]
015F:0056EB5A 8945F8 MOV [EBP-08],EAX
015F:0056EB5D 6A04 PUSH 04
015F:0056EB5F B944565700 MOV ECX,00575644
015F:0056EB64 8D45F8 LEA EAX,[EBP-08]
015F:0056EB67 BA04000000 MOV EDX,00000004
015F:0056EB6C E803E7FFFF CALL 0056D274 <--Call调用
015F:0056EB71 015DF8 ADD [EBP-08],EBX
015F:0056EB74 EB01 JMP 0056EB77 <--JMP跳转语句

跟踪ARPR的情况（代表后一类程序，以下简称 ㈡）
015F:004C6732 8BC0 MOV EAX,EAX
015F:004C6734 55 PUSH EBP
015F:004C6735 8BEC MOV EBP,ESP
015F:004C6737 83C4F0 ADD ESP,-10
015F:004C673A 53 PUSH EBX
015F:004C673B 56 PUSH ESI
015F:004C673C 57 PUSH EDI
015F:004C673D 894DF0 MOV [EBP-10],ECX
015F:004C6740 8955F4 MOV [EBP-0C],EDX
015F:004C6743 8945FC MOV [EBP-04],EAX
015F:004C6746 33C0 XOR EAX,EAX
015F:004C6748 55 PUSH EBP
015F:004C6749 6871674C00 PUSH 004C6771
015F:004C674E 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6751 648920 MOV FS:[EAX],ESP
015F:004C6754 33C9 XOR ECX,ECX
015F:004C6756 B201 MOV DL,01
015F:004C6758 B8088A4B00 MOV EAX,004B8A08
015F:004C675D E8AE3CFFFF CALL 004BA410 <--第一个Call调用
015F:004C6762 E86D0AFFFF CALL 004B71D4 <--第二个Call调用
015F:004C6767 33C0 XOR EAX,EAX
015F:004C6769 5A POP EDX
015F:004C676A 59 POP ECX
015F:004C676B 59 POP ECX
015F:004C676C 648910 MOV FS:[EAX],EDX
015F:004C676F EB0A JMP 004C677B <--JMP跳转语句

对比我们可以发现，㈠ 中只有一个Call调用就跟着一个JMP跳转语句。㈡ 中有两个Call调用才跟着一个JMP跳转语句。
对于 ㈠ 在JMP跳转过后，就可以很快找到Entry Point。（当然这以后要按 F8 键跟踪为妙） 对于 ㈡ 则不同，请记住这个特征，如果有两个连续的Call调用，在跟踪时，在第二个Call调用处按 F8进入看看，如果你发现类似以下代码

015F:004B71D2 8BC0 MOV EAX,EAX
015F:004B71D4 5A POP EDX
015F:004B71D5 54 PUSH ESP
015F:004B71D6 55 PUSH EBP
015F:004B71D7 57 PUSH EDI
015F:004B71D8 56 PUSH ESI
015F:004B71D9 53 PUSH EBX
015F:004B71DA 50 PUSH EAX
015F:004B71DB 52 PUSH EDX
015F:004B71DC 54 PUSH ESP
015F:004B71DD 6A07 PUSH 07
015F:004B71DF 6A01 PUSH 01
015F:004B71E1 68CEFAED0E PUSH 0EEDFACE
015F:004B71E6 52 PUSH EDX
015F:004B71E7 E914E3FFFF JMP KERNEL32!RaiseException
015F:004B71EC C3 RET

那么这就是我在《找Entry Point的又一方法 -----针对Asprotect v1.0加壳的程序》中所介绍的异常地方了。按该文可以继续跟踪找到Entry Point。在经过三个异常后，会发现同 ㈠ 一样的代码特征，只有一个Call调用和JMP语句了，那么以后你可以放心大胆地跟踪了，没有什么陷阱了。（当然在Call调用处不要用F10带过，那可能这只是一个简单的JMP语句的变形而已）

在Entry Point处我们可以下指令得到全部内存映象
/dump <Image Base> <Image Size> <FileName> （注：此为ICEDump 1.61用法）

以上介绍了跟踪部分的所有要注意的地方，以及Asprotect加壳程序的一点特征。下面说一下我们要做的修补工作。
（至于你用 ProcDump 还是 PE Editor 随你的爱好，我一般用 PEditor，它太棒了。简直就是为脱壳设计的）

首先，把 各个Section的 Raw Offset 改成 Virtual Offset 大小， Raw Size 改成 Virtual Size大小。

然后，把 Entry Point 改成你发现的大小 。比如我发现的ARPR.EXE的Entry Point为401000，由于Image Base为400000，所以Entry Point就改为 1000，（因为 401000-400000=1000）。

然后，再把 import table 的 RVA改成 idata Section的 RVA，Size改成 idata Section的Size大小。

最后，我们还有一样工作要做，就是要把 我们得到的内存映象文件中的idata Section部分用我们前面方法得到的idata Section文件替换掉。你可以用Hex WorkShop来做这项工作，它做起来很方便。

【后记】
因为我跟踪的Asprotect加壳的程序不算多，所以很可能以偏概全。不过对于跟踪某些Asprotect加壳的程序你可以依此做一参考。


CreateInstall 2000

 标 题:对 CreateInstall 2000 的脱壳 (10千字)
发信人:ljttt
时 间:2000-8-12 16:01:53
详细信息:
对 CreateInstall 2000 的脱壳

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

【前言】
CreateInstall 2000属于那种难脱的Asprotect加壳程序（也就是我前面所说的第三类Asprotect加壳程序），找OEP的难点虽然已经解决，但是import table的重建问题依然没有找到一种统一的方法，这次对CreateInstall 2000脱壳的方法只是一种，此法对有些Asprotect加壳的程序还是无效。
不过也算是开拓一种思路吧，就写了此文。

样例文件： CI2000.EXE （CreateInstall 2000的主程序文件）
加壳方式： ASProtect + ASPack v1.084
检测工具： FileInfo
脱壳工具： SoftICE v4.05,ICEPatch v2.0,PEditor,Imp_List
目标： 脱壳
作者： ljttt
日期： 2000-08-12

1、当然依然是获取有关程序的信息，这次我用PEditor。因为它很方便，一来它可以在右键菜单中出现。二来可以直接看到import table中的各个引入函数。三来，后面你就知道了。所以它是脱壳必备工具。
Entry Point: 0003F001
Size of image: 00053000
Image Base: 00400000

.idata Section
Virtual Offset: 00038000
Virtual Size: 00002000

2、Ctrl-D中断进入SoftICE，设断点
bpx CreateFileA do "p ret"

3、按 F5 键回到Windows，运行CI2000.EXE。中断进入SoftICE。
4、刚开始中断你在Explorer的怀抱，（你可以看右下角的文字，它显示的是当前中断在哪个Module），按 F12 键，看看右下角的文字，这次不错，在CI2000.EXE中，然后按 F12 键数次，直到你发现如下特征处

015F:004AB622 8B45EC MOV EAX,[EBP-14] <--注意此处
015F:004AB625 3B45F0 CMP EAX,[EBP-10] <--注意此处
015F:004AB628 7443 JZ 004AB66D <--如果比较的结果相同，就跳转了，否则就到下面显示File corrupted! 的框框了
015F:004AB62A 8A1508144B00 MOV DL,[004B1408]

5、这是CRC检测的地方，（前文已有介绍。国外大师的文章也多次提到）。然后按 F12 键两次来到如下

015F:004AB957 E828FAFFFF CALL 004AB384
015F:004AB95C 33C0 XOR EAX,EAX <--你停下此处
015F:004AB95E 5A POP EDX
015F:004AB95F 59 POP ECX
015F:004AB960 59 POP ECX
015F:004AB961 648910 MOV FS:[EAX],EDX
015F:004AB964 EB11 JMP 004AB977
015F:004AB966 E9E900FFFF JMP 0049BA54

6、好，到了我们熟悉的地盘，它别想兴风作浪了。
7、向下翻页找到如下（当然如果你是初手，建议一步步的来，熟悉了以后，再简化你的步骤）

015F:004AB9FF 8D4824 LEA ECX,[EAX+24]
015F:004ABA02 8B4508 MOV EAX,[EBP+08]
015F:004ABA05 8B500C MOV EDX,[EAX+0C]
015F:004ABA08 8B4508 MOV EAX,[EBP+08]
015F:004ABA0B 8B4008 MOV EAX,[EAX+08]
015F:004ABA0E E81DF1FFFF CALL 004AAB30 <--注意此Call调用
015F:004ABA13 33C0 XOR EAX,EAX <--在此处要停下来
015F:004ABA15 5A POP EDX
015F:004ABA16 59 POP ECX
015F:004ABA17 59 POP ECX
015F:004ABA18 648910 MOV FS:[EAX],EDX
015F:004ABA1B EB13 JMP 004ABA30
015F:004ABA1D E93200FFFF JMP 0049BA54

8、在 XOR EAX,EAX 处停下来，下指令
dd 438000
显示如下

0030:00438000 00000000 00000000 00000000 00000000 ................ <---第一段开始
0030:00438010 00000000 00000000 00000000 00000000 ................
..........（省略）
0030:00438390 00000000 00038C12 00038C00 00038BF0 ................ <---第一段结束，第二段开始
0030:004383A0 00038BE0 00038BD0 00038BC2 00000000 ................
0030:004383B0 0003914A 00039114 000391A2 00039196 J...............
..........（省略）
0030:00438660 00000000 00038C98 00038CAE 00038C86 ................
0030:00438670 00000000 00038BA4 00038B96 00038B82 ................
0030:00438680 00038B6E 00000000 00000275 00000000 n.......u....... <---第二段结束，第三段开始
..........（省略）
0030:00438690 00000000 0000026F 00000000 00000000 ....o...........
0030:004386A0 00000045 00000000 00000000 00FF0000 E...............
..........（省略）
0030:00439240 00070000 00000000 0000004C 00000000 ........L.......
0030:00439250 002B0000 00000000 00000000 00000000 ..+.............
0030:00439260 0000012C 00000000 00000000 00000124 ,...........$...
0030:00439270 00000000 00000000 00000000 00000000 ................ <---第三段结束
0030:00439280 00000000 00000000 00000000 00000000 ................

这里我说明一下，本来此处一般是Dump出idata Section的时候了，但是第三类Asprotect加壳程序（Asprotect v1.0加壳的程序也属于此类）的import table还原后还是不完整。我们来分析一下它的特征。

第一段，全是 00，而一般完整的import table，此处应为 5 个长整数一组，有规律的连续分布（这和IMAGE_IMPORT_DESCRIPTOR的结构有关）。看来这是Asprotect作的第一个手脚。他把此处清零了。

第二段，一般是一段连续的几个长整数后加一个 00000000，我们如果对import table的结构有所了解的话，就知道这是PIMAGE_IMPORT_BY_NAME部分，Asprotect对该部分没有作手脚。

第三段，一般是排序的长整数或者是比较小的长整数并加以多个 00000000 间断，比如 26F,45,FF,4C,....。你可以找到这些数字。那么这是什么呢？这就是PIMAGE_IMPORT_BY_NAME指向的地方。正常情况下应该为Hint和Name[]。然而现在不是。分析以后发现，这又是Asprotect作的手脚。其中数字的位置对应Hint。而间断的 00000000 数字的位置则是Name[]，也就是函数名称字符串的位置。而现在全被Asprotect用 00 去掉了。所以你在整个程序内存空间搜索，可能也找不到函数名称字符串。

那么现在我们该做什么呢？我先来介绍一下Imp_List这个软件，它的作用就是帮你Dump出import table。不过他有几个毛病，一、如果程序没有名为idata的Section，他就会不工作，二、如果 idata Section 中有些杂七杂八的东西，他工作后会出问题。
这里我们遇到的是第二种情况，因此必须帮他去掉 idata Section 中无用的东西。这些无用的东西就是第三段开始的字节，我们找到起始点 00438688
再找到结束点 00439270，这之间的字节属于第三段，我们要把它清零。
好，下指令
f 438688 439270-438688 00
现在，第三段全部被 00 填充。

9、该到找Entry Point的时候了。向下翻页，到如下处

015F:004ABB43 8B4508 MOV EAX,[EBP+08]
015F:004ABB46 8D4818 LEA ECX,[EAX+18]
015F:004ABB49 8B4508 MOV EAX,[EBP+08]
015F:004ABB4C 8B10 MOV EDX,[EAX]
015F:004ABB4E 8B4508 MOV EAX,[EBP+08]
015F:004ABB51 8B401C MOV EAX,[EAX+1C]
015F:004ABB54 E887F6FFFF CALL 004AB1E0 <---此处一定要按 F8 键进入
015F:004ABB59 5F POP EDI
015F:004ABB5A 5E POP ESI
015F:004ABB5B 5B POP EBX
015F:004ABB5C 5D POP EBP
015F:004ABB5D C20400 RET 0004

10、把光标定位到Call 调用处，按 F7 键到此，然后按 F8 键进入该调用。

11、可以看到如下：

015F:004AB1DE 8BC0 MOV EAX,EAX
015F:004AB1E0 55 PUSH EBP
015F:004AB1E1 8BEC MOV EBP,ESP
015F:004AB1E3 83C4F0 ADD ESP,-10
015F:004AB1E6 53 PUSH EBX
015F:004AB1E7 56 PUSH ESI
015F:004AB1E8 57 PUSH EDI
015F:004AB1E9 894DF0 MOV [EBP-10],ECX
015F:004AB1EC 8955F4 MOV [EBP-0C],EDX
015F:004AB1EF 8945FC MOV [EBP-04],EAX
015F:004AB1F2 33C0 XOR EAX,EAX
015F:004AB1F4 55 PUSH EBP
015F:004AB1F5 681DB24A00 PUSH 004AB21D
015F:004AB1FA 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004AB1FD 648920 MOV FS:[EAX],ESP
015F:004AB200 33C9 XOR ECX,ECX
015F:004AB202 B201 MOV DL,01
015F:004AB204 B8B4D44900 MOV EAX,0049D4B4
015F:004AB209 E8AE3CFFFF CALL 0049EEBC <--注意，第一个Call调用
015F:004AB20E E86D0AFFFF CALL 0049BC80 <--注意，第二个Call调用，此调用中是个异常
015F:004AB213 33C0 XOR EAX,EAX
015F:004AB215 5A POP EDX
015F:004AB216 59 POP ECX
015F:004AB217 59 POP ECX
015F:004AB218 648910 MOV FS:[EAX],EDX
015F:004AB21B EB0A JMP 004AB227

12、把光标定位到 Call 0049BC80 调用处，（注意是第二个调用处）按F7键到此。
13、这里当然是要过Asprotect设下的异常陷井了。（如果你按 F8 键进入此调用，就可以看到异常调用），为了躲过它，下指令
db fs:0
显示如下

2927:00000000 D0 FD 68 00 00 00 69 00-00 C0 68 00 4E 29 37 29 ..h...i...h.N)7)
2927:00000010 00 00 00 00 00 00 00 00-3C B4 5D 81 01 00 FF FF ........<.].....

14、注意 D0 FD 68 00 字节，下指令
dd 015f:68FDD0

015F:0068FDD0 0068FF68 004AB21D 0068FDF8 00498DDC h.h...J...h...I.
015F:0068FDE0 00475DD8 004AB940 0043FC6F 00400000 .]G.@.J.o.C...@.

15、注意 004AB21D 字节，下指令
u 4AB21D

015F:004AB21D E93208FFFF JMP 0049BA54
015F:004AB222 E8C90AFFFF CALL 0049BCF0

16、下指令
bpx 49BA54

17、好，设好断点，连按三次 F5 键，跳过三个异常陷井。然后继续跟踪到如下
015F:004AB322 8B00 MOV EAX,[EAX]
015F:004AB324 50 PUSH EAX
015F:004AB325 6A00 PUSH 00
015F:004AB327 B841D44900 MOV EAX,0049D441
015F:004AB32C 48 DEC EAX
015F:004AB32D 53 PUSH EBX
015F:004AB32E 50 PUSH EAX
015F:004AB32F C3 RET

18、在 RET 处，就可以Dump出整个内存映象了。（记住你在这里找到的OEP，如果你还不清楚，下指令 dd esp 看看第 1-4 个字节的内容，我找到的是 41F170）下指令
/dump 400000 53000 c:\temp\dump.exe

19、按 F5 键回到Windows，运行Imp_List，单击Rebuild import table。在它的工作目录下我们可以找到
Address.txt
import0.bin
import1.bin
import2.bin
这四个文件。

20、打开Address.txt，可以看到它Dump出的函数情况。打开import0.bin，可以看到它重建后的import table。OK!太方便了。

21、用PEditor打开dump.exe文件，选择sections，右键打开菜单，选择dumpfixer。OK!一次完成所有Section的RVA、Size的转换工作。方便吧。还不快用PEditor。再修改Entry Point为 1F170，单击apply changes保存，选择directory，修改其中的Import Table的RVA为38000，Size为2000。单击保存。

22、用Hex WorkShop打开dump.exe和import0.bin，定位dump.exe位置为38000，选择1400个字节。（因为import0.bin只有这么大嘛）。删除。
选择import0.bin的1400个字节，复制到dump.exe中。保存。

23、运行，OK!

【后记】
还是那句话，如果谁对加壳、脱壳有兴趣，可以和我交个朋友。Email:ljtt@yeah.net。


EldoS Thumbnailer

 标 题:请帮我做一个“EldoS Thumbnailer”的注册机，好吗？ (425字)
发信人:dengdun
时 间:2000-7-17 10:24:45
详细信息:
这是一个用来查看图标和图像的30天试用软件，程序每次启动时首先取得注册表中的HKEY_CURRENT_USER\Software\EldoS\Thumbnailer\AppData这一项的值，然后判断是否已过试用期限。如果把注册表中的该项键值删除的话，则程序会重新计算试用时间。但是我比较烦它每次启动时都弹出一个对话框，所以想请各位高手予以破解。
另外，需要告诉各位的是，该程序如果检测到SoftICE存在则不运行。
下载URL：http://dengdun.163.net/eltninst.exe
程序大小为：797KB

标 题:脱壳------ElThumbs.dll其实是个可执行文件，被作者玩了个花巧而已。 (4千字)
发信人:ljttt
时 间:2000-7-30 6:36:43
详细信息:

对于懂怎么脱Asprotect壳的朋友就看看【前言】【后记】就行了。

脱壳 ------ EldoS Thumbnailer v1.0.0.45

前言：人说："瞎猫碰上死老鼠"，俺居然也有撞上这大运的时候。呵呵！

分析：(以下对可执行文件简称为EXE，动态链接库简称为DLL)
用FileInfo分析可知EXE没有加壳，而DLL用Asprotect+Aspack2000加壳。对怎么脱DLL的壳还是头一次碰上。先多分析分析，用ShowDep看看EXE中对DLL的引入情况。没有发现对ElThumbs.dll的引入！看看DLL中的输出函数的情况，没有输出函数！yi！！！怎么发现Trace为可用的！！！！一般只有EXE才只用的呀！奇怪！先试试再说，单击Start Tracing按钮，居然运行了！（当然倒地）。到此一切谜团已解，把ElThumbs.dll改名为WhoAmI.EXE直接运行成功！ElThumbs.EXE不过是个......。以后不过是用对Asprotect加壳程序的脱壳方法而已。对此有深入分析的文章太多了。我只是简要介绍一下对此脱壳的一些步骤。

目标文件： WhoAmI.EXE (由ElThumbs.dll换名而来)
加壳方式： Asprotect+Aspack2000
所用工具： SoftICE v4.05,FrogsICE v0.43,ICEDump 6.0.16,ProcDump v1.62
检测工具： FileInfo,ShowDep
作者： ljttt
日期： 2000-07-29

1、用ProcDump分析基本信息
Entry Point: 000D7001
Size of image: 000E9000
Image Base: 00450000

.idata Section
Virtual Offset: 000B4000
Virtual Size: 00003000

因此 .idata Section内存的地址偏移为 450000+B4000=504000

2、运行FrogsICE，用SoftICE的Loader加载WhoAmI.exe。

3、设断点，使中断后显示.idata Section信息
bpx loadlibraya do "dd 450000+B4000"

4、按F5，中断！此时还没有到时候，按F5继续，又中断。这回.idata
Section显示的数据是"干净"的，保存到文件。下指令
/dump 504000 3000 c:\temp\dump.bin

5、按F12回到程序领空，继续跟踪，直到如下（大家跟踪时的地址可能不一样哦，看代码吧）
(提示：从跟踪LoadLibrarya到跟踪到此，并不远，经过三两个ret就到了，具体多少，自己把握)
015F:00440B19 59 POP ECX
015F:00440B1A 648910 MOV FS:[EAX],EDX
015F:00440B1D EB13 JMP 00440B32
015F:00440B1F E9C820FFFF JMP 00432BEC
015F:00440B24 66B80E00 MOV AX,000E
015F:00440B28 E81FF4FFFF CALL 0043FF4C
015F:00440B2D E82622FFFF CALL 00432D58
015F:00440B32 8B4508 MOV EAX,[EBP+08]
015F:00440B35 8B10 MOV EDX,[EAX]
015F:00440B37 8B4508 MOV EAX,[EBP+08]
015F:00440B3A 035018 ADD EDX,[EAX+18]
015F:00440B3D 8B4508 MOV EAX,[EBP+08]
015F:00440B40 8B401C MOV EAX,[EAX+1C]
015F:00440B43 E880F9FFFF CALL 004404C8 <--以前的按F10没关系,这里要按F8进入
015F:00440B48 5F POP EDI
015F:00440B49 5E POP ESI
015F:00440B4A 5B POP EBX
015F:00440B4B 59 POP ECX
015F:00440B4C 59 POP ECX
015F:00440B4D 5D POP EBP
015F:00440B4E C20400 RET 0004
015F:00440B51 8D4000 LEA EAX,[EAX+00]
015F:00440B54 E82B38FFFF CALL KERNEL32!GetCommandLineA
015F:00440B59 A3F8664400 MOV [004466F8],EAX
015F:00440B5E C3 RET

6、按F8进入Call 004404C8内部继续跟踪，就到了终点站了。欢呼！
015F:004404C8 89C4 MOV ESP,EAX 
015F:004404CA 89D0 MOV EAX,EDX
015F:004404CC 8B1D34564400 MOV EBX,[00445634]
015F:004404D2 89041C MOV [EBX+ESP],EAX
015F:004404D5 61 POPAD
015F:004404D6 50 PUSH EAX <--此时EAX=5009B8，所以Entry Point=5009B8-450000=B09B8
015F:004404D7 C3 RET <--这里就要跳转到真正的Entry Point了

7、下指令
/dump 450000 E9000 c:\temp\dump.exe

8、修补工作开始，用ProcDump改各Section的Offset为RVA大小，PSize为VSize大小。改Entry Point为B09B8，改Directory中的Import Table的RVA为B4000，大小为3000。

9、最后别忘了把dump.exe中偏移B4000开始的3000字节用dump.bin替换掉。运行OK！

后记：
注册码，俺没有，问题有两个。（哈哈，俺的老毛病也犯了，问大家几个问题？）
1、据说"Interactive Disassembler v4.04"是目前最好的反汇编工具"，不知国内有哪个地方下载？
2、该工具和W32Dasm相比，块头不一般哦，20M，自然有其过人之处，请问它强在哪里？有什么新功能吗？（和W32Dasm相比）


寻找EP

 标 题:寻找真正EP的简易方法-针对 AsProtect (1千字)
发信人:cloudnumber9
时 间:2000-7-24 15:51:35
详细信息:
这也是我昨天才想到的。
首先，用 ProcDump 看一下被保护的程序：
下面以 arpr 1.0 build 45 为例；下载地址可找前面的文章。
Entry Point : 5c001
Image Base : 400000
idata : Virtual Offset : 18000
所以，程序的第一个指令的位置是：45c001 (image base + entry point)
而 idata 的位置是： 418000 （image base + virtual offset)
由经验可知：AsProtect 所加密的数据一般都从 41c 这个偏移开始，
所以，由下列方法可以迅速找到真正的 Entry Point.
1. 启动 trw2k, 输入 faults off
2. 运行 arpr, 在程序空间设断点，bpx cs:45c001
3. 退出 arpr 然后再次运行 arpr
这时trw2k 会在 arpr 第一条指令处中断。
4. 输入 bpmd cs:41841c (418000+41c), 如果已存在则输入 be 2,
然后继续运行。
5. 第一次会在 repz movsw 处中断，这是程序在导入数据，继续运行。
6. 第二次会在 stosd 处中断，这时程序在生成加密的数据。
这里也是修正 import 表的位置，这时最好输入 bd 2。
7. F10 运行完这段代码，返回第一层。
8. 输入 bpx cs:401000 (这是程序的真正EP）
9. F10 继续运行，你会发现在某一个 call 你会来到 401000
请记住那个 call 的特征，然后再从 3 做到 9。
10. 这一次在该中断处 F8 进入第二层。
11. 在第二层继续 F10, 又会在一个 call 处 来到 401000
记住其特征，然后重复做 3 - 11。
12. 在第三层的某处有一个 ret 会来到 401000。
那个 ret 就是我们要找的最后一条指令。
重复上述步骤后你将熟悉所有代码的特征，这样下次就可以在由 AsProtect 保护的程序中寻找到正确的 EP 然后脱壳。

-c10udnumber9-
2000.7.24


Armadillo 1.83b

 标 题:如何去除Armadillo 1.83b的壳.(下载地址:www.siliconrealms.com) (空)
发信人:1212
时 间:2000-7-13 11:08:41
详细信息:

标 题:protection scheme (3千字)
发信人:dr0
时 间:2000-7-13 17:31:30
详细信息:

这个玩意儿自己并未加壳，但是它会在运行时在windows的temp目录下生成一个临时文件，这个文件实际上是个已还原的DLL，然后它就用LoadLibraryA( )加载这个DLL，用这个DLL中的函数来检查日期和注册码。
先要跳过它对SoftICE的检测：

1、用bpint 3设断点，看见它用SoftICE的BoundsChecker后门。这个是在EXE中进行的，可以直接patch，即把EBP的值改掉。

015F:0040582E MOV DWORD PTR [EBP-0168],4675446D
015F:00405838 MOV DWORD PTR [EBP-0148],04360C26
015F:00405842 MOV DWORD PTR [EBP-0164],00000000
015F:0040584C MOV DWORD PTR [EBP-04],00000000
015F:00405853 MOV [EBP-0164],EBP
015F:00405859 MOV EAX,[EBP-0148]
015F:0040585F XOR EAX,[EBP-0168]
015F:00405865 MOV EBP,EAX //改掉EBP的值即可
015F:00405867 MOV EAX,00000004
015F:0040586C INT 3

2、再用CreateFileA( )设断点，这下是在解出来的DLL中检测SoftICE，无法直接修改DLL文件。可以有两种策略，一是用process patcher，另外一种是等它在内存中解压出这个DLL后但是还未写入这个DLL之前将该DLL在内存中打补丁。

015F:10005BA3 PUSH EBX
015F:10005BA4 PUSH 00000080
015F:10005BA9 PUSH 03
015F:10005BAB PUSH EBX
015F:10005BAC PUSH 03
015F:10005BAE PUSH EBX
015F:10005BAF PUSH EAX
015F:10005BB0 CALL 10005C64
015F:10005BB5 POP ECX
015F:10005BB6 PUSH EAX
015F:10005BB7 CALL [KERNEL32!CreateFileA] //打开softICE
015F:10005BBD CMP EAX,-01
015F:10005BC0 JZ 10005BCB
015F:10005BC2 PUSH EAX
015F:10005BC3 CALL [KERNEL32!CloseHandle]
015F:10005BC9 JMP 10005BD6
015F:10005BCB CALL [KERNEL32!GetLastError]
015F:10005BD1 CMP EAX,02
015F:10005BD4 JZ 10005BDA
015F:10005BD6 MOV BYTE PTR [EBP-01],01 //Bad flag
015F:10005BDA MOV EAX,[ESI+04]
015F:10005BDD ADD ESI,04
015F:10005BE0 CMP EAX,EBX
015F:10005BE2 JNZ 10005BA3 //循环3次
015F:10005BE4 PUSH 1000D390
015F:10005BE9 CALL 10005C64
015F:10005BEE POP ECX
015F:10005BEF PUSH EAX
015F:10005BF0 CALL [KERNEL32!LoadLibraryA] //kernel32.dll
015F:10005BF6 MOV ESI,EAX
015F:10005BF8 CMP ESI,EBX
015F:10005BFA JZ 10005C24
015F:10005BFC PUSH 1000D37C
015F:10005C01 CALL 10005C64
015F:10005C06 POP ECX
015F:10005C07 PUSH EAX
015F:10005C08 PUSH ESI
015F:10005C09 CALL [KERNEL32!GetProcAddress]
015F:10005C0F CMP EAX,EBX
015F:10005C11 JZ 10005C1D
015F:10005C13 CALL EAX //调用IsDebugerPresent( )
015F:10005C15 TEST EAX,EAX
015F:10005C17 JZ 10005C1D
015F:10005C19 MOV BYTE PTR [EBP-01],01 //bad flag
015F:10005C1D PUSH ESI
015F:10005C1E CALL [KERNEL32!FreeLibrary]
015F:10005C24 CMP [EBP-01],BL
015F:10005C27 JZ 10005C5D //一定要跳
015F:10005C29 PUSH 00010010
015F:10005C2E PUSH EBX
015F:10005C2F PUSH EBX
015F:10005C30 PUSH EBX
015F:10005C31 PUSH EBX
015F:10005C32 PUSH EBX
015F:10005C33 PUSH EBX
015F:10005C34 PUSH EBX
015F:10005C35 PUSH EBX
015F:10005C36 PUSH EBX
015F:10005C37 PUSH 0F
015F:10005C39 CALL 100042B7 //导致非法操作的指令
015F:10005C3E ADD ESP,28
015F:10005C41 PUSH EAX
015F:10005C42 PUSH EBX
015F:10005C43 PUSH EBX
015F:10005C44 PUSH EBX
015F:10005C45 PUSH EBX
015F:10005C46 PUSH EBX
015F:10005C47 PUSH EBX
015F:10005C48 PUSH EBX
015F:10005C49 PUSH EBX
015F:10005C4A PUSH EBX
015F:10005C4B PUSH 03
015F:10005C4D CALL 100042B7
015F:10005C52 ADD ESP,28
015F:10005C55 PUSH EAX
015F:10005C56 PUSH EBX
015F:10005C57 CALL [USER32!MessageBoxA]
015F:10005C5D MOV AL,[EBP-01] //一定要返回0才行
015F:10005C60 POP ESI
015F:10005C61 POP EBX
015F:10005C62 LEAVE
015F:10005C63 RET

至于注册码，不懂点密码学是绝对搞不定的！

标 题:要把它的DLL和EXE合并在一起生成一个新的EXE得花费多大的功夫呀，显然不现实！ (空)
发信人:guest
时 间:2000-7-14 13:17:22
详细信息:

标 题:还有一种办法好象可以用 (439字)
发信人:dr0
时 间:2000-7-14 16:25:30
详细信息:

这个软件每次生成的那个DLL的名字是不同的。只要在temp目录下得到这个DLL之后，将这个DLL取个固定的名字，比如protect.dll，并将这个DLL中防SICE、检查日期和注册码的代码打补丁，然后把这个DLL放到它的安装目录下。再修改它的EXE主程序，不让它以后每次运行时再生成这个DLL（即跳过它生成这个DLL的那些代码，其实让它生成也没关系，因为我们不调用temp目录下的这个玩意儿），而是每次都直接LoadLibraryA("protect.dll",...)，即每次加载打过补丁的dll。这样也可以搞定它。

标 题:它的EXE和DLL之间主要是通过环境变量来通信的 (247字)
发信人:1212
时 间:2000-7-15 18:28:15
详细信息:

解压出来的那个DLL负责检查注册码，如果注册码正确则用SetEnvironmentVariablesA( )将注册信息填入到环境块中，而EXE则用GetEnvironmentVariablesA( )将注册信息读出来做简单判断（主要是判长度），因此很好patch。主要的三个环境变量是USERNAME、USERKEY、PAIDFOR。

标 题:请看..... (11千字)
发信人:1212
时 间:2000-8-3 21:53:14
详细信息:

How To Un-dillo A Program Protected With Armadillo 1.8X or
prior - The Silicon Realms Toolworks

------------------------------------------------------
Tools Needed
WinHex 9.0 or other memory dumper
W32DASM 8.7 or 8.9 (for Armadillo 1.8 - 1.8x protection)
Debugger Not Needed and must be disabled!
------------------------------------------------------
Whether or not you have an executable with the most recent version of Armadillo or not really doesn't matter. There is a slightly more involved procedure for un-dilloing the recent 1.80 - 1.8x versions but as you'll see it's really very simple.
The target application we are going to work on is going to be Stay On Pro 3.2. If you don't already have this file it should be available at the site www.stayonpro.com. This is a popular utility designed to keep you connected to your internet service if you happen to idle for a while doing nothing and is protected with Armadillo.
If you wish to read more about the internal armadillo workings read on.

If you wish to skip to how to dump out StayOnPro3.2 click HERE.

If you wish to skip to how to dump out Armadillo 1.8x or an Armadillo 1.8 - 1.8x protected program click HERE.

To begin I will explain the basic protection found in most Armadillo versions. No real knowledge of it's internal workings is necessary to crack the program but might help in other similar protection methods.

Starting an armadillo protected program will result in instantly creating a file either in the local directory where the program was started or in one of the temporary directories on your hard drive. This file is named ArmXXXX.tmp. This file is actually the Armadillo Access (security) DLL. This file may be copied while the program is running and then disassembled. In newer versions this file is hidden in the local user\local settings\temp directory.

Once the ArmXXXX.tmp is created with CreateFileA it is placed on the hard drive and loaded with the main program's LoadLibraryA function. All functions in Armadillo seem to be loaded on the spot in memory to help prevent direct text access.

Now, the main program calls the un-packing and un-encrypting function. In this particular version this function is named GetProgramInfo. GetProgramInfo also checks for the SoftIce hardware debugger, and any Windows debugger. It does this with a few functional steps:
---------------------------------------------------------------------
1.Calls CreateFileA 3 times with the file name parameters "\\.\SICE", "\\.\NTICE", and "\\.\SIWDEBUG" (which are internally encrypted). If they do exist or GetLastError doesn't return 2, a flag is set. This flag will be referred to as the DEBUG flag.
2.A call to IsDebuggerPresent is made to test if a windows debugger is present. SoftIce and other hardware debuggers do not test true to this function. If a Windows debugger is found the DEBUG flag is set to true
3.Depending on the version, a dialog may be shown here to warn any user who has a debugger in operation to turn it off and restart. This dialog displays under certain versions, if the DEBUG flag is true
4.If you now see a, "This program uses a secret key", at this point and it normally doesn't ask for a key, delete the Software\The Silicon Realms registry keys and start over. This happens if you screw up the steps and it catches a debugger or the program can't extract the main program's code right
5.INT 3. This is the final protecting method. A fake breakpoint set in the program to stop a debugger in it's tracks. But, SoftIce, doesn't respond to INT 3 unless you set I3HERE ON you say? Wrong, this is what baffled me for a while. SoftIce doesn't want to respond, but it does due to the fact that EBP is set to, "BCHK", not as a pointer, but actual text. When SoftIce is active it has a debug exception called bounds checker. With, "BCHK", loaded into EBP the breakpoint instruction (INT 3) calls the exception handler for SoftIce's bounds checker. SoftIce doesn't expect anything coming in and the stack isn't prepared or something similar because a page fault will occur after a return. To break this final protection you must set a breakpoint for IsDebuggerPresent not because you need to change the return value of that function, just because it's a good stopping point. Pressing F12 in SoftIce to return from that function and F12 twice again will get you back into the original program code and out of the security (armadillo) dll. Now F10 (trace over) a bunch of times and you'll get to the INT 3 instruction. You want to stop right after EBP is initialized. Type R EBP=4444444 in SoftIce. Now it's tricked and pressing CTRL + D to exit Ice will result in the target program running. So how does this really work? If there is no debugger present, Windows or SoftIce, the INT 3 causes an unhandled exception handler to trip. This unhandled exception handler is right after the JMP instruction. If a debugger exists program flow will continue after the INT 3. A bunch of code to crash the program intentionally is after this INT 3 instruction. If not it jumps over to the exception block and flow continues as if there were no debugger present
--------------------------------------------------------
Now you know the insides. Surprisingly, you don't need any of the above information. You can un-arm any Armadillo application in a few easy steps. It isn't necessary to figure out what version Armadillo is protection the program either. This you will know if you need to do extra 1.80 - 1.8x steps. You do however, need to know that armadillo is protecting the program. The above tips will let you know if this is the latter. Some other useful information is the use of GetPrivateProfileString, and it's brothers and sisters by protected applications to tell if they are for instance, "PAIDFOR". Dis-assemble the security DLL, Armadillo 1.8x, its protected programs and you can pick other variables out as well. Whoops, that makes it really hard to patch a un-dilloed application doesn't it? To think, some programmers are paying $89.00 for this! The only people is it working for is Silicon Realms Toolworks employees as they can easily use any application that uses it for free. Well, now, so can us all.
--------------------------
1. Without any debuggers present, including SoftIce, start the protected application. The file you need is the program's name you are running followed by a number and "ProgName.tmpX". So, if you are starting "StayOnPro.Exe" you'll see in the local directory, "StayOnPro.tmp0". Copy this file by selecting it and pressing CTRL+C and CTRL+V.
2. Rename this copied file ("Copy of StayOnPro.tmp0") to read, "StayOnPro(undilloed).exe".
3. Start WinHex 9.0 with the crack for it previously applied
4. Press ALT+F9 to start the process memory selection.
5. Select StayOnPro.tmp0 and select it's Primary Memory
6. Go to address 00400000H. This address should always be the starting point of the windows exe image. You'll always know you are at the correct position if you see "MZ" at the address.
7. Now you are going to select a large block of memory. Click next to the 00400000H address in the cell that shows 4D press and hold the shift key down while pressing page down (this works the quickest). Select the block all the way to address 4323D6. The same works for any other program. Ignore the first block of 0's after the program's header. This normally starts at around 400600H-401000H. The code starts at normally 401000. You want to select all the code till the block of zeros which separates a file section. In this case the second block of zeros starts at 4323D7 so we stop at 4323D6. Sometimes the code segment, the 401000H block starts at 0600H in the file. Armadillo gives the code section away by putting "X"s where the code segment starts. You can always check this first to make sure.
8. Press CTRL + C to copy the selected block into the clipboard
9. Choose File/Open and select the StayOnPro(undilloed).exe file to open it up
10.Leaving the cursor right where it is on the 4D block, choose menu Edit/Clipboard data/Write and press the okay button in the dialog telling you to write at offset 0.
11.Save the file
12.Stay On Pro is now almost completely un-armed. You may now easily disassemble and patch the file
13.Did you need a debugger? Nope. Say thank you GrandPa. ;-)
----------------------------------
Below is how to dump out Armadillo 1.80 - 1.8x itself and Armadillo 1.8 - 1.8x applications.
-------------------------------------------------------
1. Without any debuggers present, including SoftIce, start the protected application. The file you need is the program's name you are running followed by a number and "ProgName.tmpX". So, if you are starting "Armadillo.Exe" you'll see in the local directory, "Armadillo.tmp0". Copy this file by selecting it and pressing CTRL+C and CTRL+V
2. Rename this copied file ("Copy of Armadillo.tmp0") to read, "Armadillo1.8x(undilloed).exe".
3. Start WinHex 9.0 with the crack for it previously applied.
4. Press ALT+F9 to start the process memory selection
5. Select Armadillo.tmp0 and select it's Primary Memory
6. Go to address 00400000H. This address should always be the starting point of the windows exe image. You'll always know you are at the correct position if you see "MZ" at the address
7. Now you are going to select a large block of memory. Click next to the 00400000H address in the cell that shows 4D press and hold the shift key down while pressing page down (this works the quickest). Select the block all the way to and including address 41894B.
8. Press CTRL + C to copy the selected block into the clipboard.
9. Choose File/Open and select the Armadillo1.8x(undilloed).exe file to open it up
10.Leaving the cursor right where it is on the 4D block, choose menu Edit/Clipboard data/Write and press the okay button in the dialog telling you to write at offset 0
11.Save the file
12.Armadillo 1.8x or the program it's protecting is almost un-armed
13.Unfortunately, starting the program this time results in an exception. What happened? The program's header is modified to go to a different starting code location. What do we do to find a code location? Follow on...
14.In this case we'll need W32DASM so fire it up
15.Disassemble the file Armadillo1.8x(undilloed).exe. Neat huh?
16.Now the trick is to find the starting location of the program. Experience tells me almost all windows entry points have the functions GetCommandLineA, GetStartupInfoA, GetModuleHandleA, GetVersion, and ExitProcess. For this particular program do a search for GetVersion. Ignore the first and second find since that is only a reference to the import table. The third find isn't a correct match either, this is GetVersionEx which is not what we are looking for. The fourth find will be the correct location
17.Now look around. In this function do we have some or all of the above functions. Yes we do, this is most likely the windows entry point
18.The next step would be to trace backwards (move up) until a NOP or RET is found. In this case the RET is at 412D3D. That makes the entry point: 412D40. Close down W32DASM.
19.So let's plug this in and give it a try. Start WinHex up and load in the Armadillo1.8x(unarmed).exe file
20.Location E0 starts the program header. At location 108H is the entry point called by windows when the program starts
21.At 108H we are going to write the 32-bit number of the entry point but we have to do a little math first.
22.The entry point is 412D40. Subtract the virtual memory offset to get the correct value. This one loads in at 400000H. So 412D40-400000H=12D40. Make this a 32-bit number for ease and now it's 00012D40.
23.Large numbers (words, doublewords) in windows are normally written backwards for this reason the number written will be 40 2D 01 00. Write 40H @ file offset 108H, 2D @ 109H, 01H @ 10AH and 00H @ 10BH and save the file.
24.Armadillo 1.8x or it's protected program is now completely un-armed
25.Did you need a debugger? Nope. Say thank you GrandPa. ;-)


PC Guard /Armadillo

 标 题:有请各位高人出手破解PCGUARD FOR WIN,http://www.pc-guard.co.yu/files/demo/pcgw32d.zip (空)
发信人:newer11
时 间:2000-8-31 7:15:07
详细信息:

标 题:如何使用Bww來脫PC Guard for Win32和Armadillo的殼. (1千字)
发信人:C-pen
时 间:2000-8-31 17:09:34
详细信息:

[前言]:PC Guard for Win32和Armadillo都是Shareware的保護軟體,它們都
防Soft-ICE,在沒有Bww之前你可能要花費蠻久的時間才能找到OEP(Thanks D.BOY).
(一)PC Guard for Win32 V.3.03D:
(1)執行frogice
(2)執行bww,選Tarck
(3)執行Pcgwin32.exe,此時bww的窗口出現00410FF0(Bingo!!)
(4)用Trw2000載入Pcgwin32.exe下G 00410ff0中斷後直接Makepe或下
Suspend用Procdump,dump(full)均可,記得用Procdump要修改OEP.
(二)Armadillo V.1.83Beta-2:
(1)執行frogice
(2)按Ctrl-D叫出Soft-ICE,下bpint 3
(3)執行Armadillo.exe,中斷後下e eip 0騙過程式,此後再執行
Armadillo.exe,它就不會再去攔INT 3了.會直接執行程式.
(4)執行bww,選Tarck
(5)執行Armadillo.exe,此時bww的窗口出現0040856b這是Armadillo.exe
的OEP這不是我們要的,等到主程式出來後,在bww的窗口再顯示一個位址
00413550這才是我們要的,這是Armadillo.Tmp0的OEP,這才是真正的主
程式,我們要把它Dump出來.
(6)用Trw2000載入Armadillo.exe,下G 00413550,再下Makepe或用
Procdump,Dump(full),不過你要選Armadillo.tmp0而不是
Armadillo.exe
再次Thanks D.BOY JOHNSON From Taiwan 2000\08\31


幻影v1.5b3

 标 题:对幻影v1.5b3中Anti-Debug代码的一点分析 (2千字)
发信人:ljttt
时 间:2000-8-25 7:44:53
详细信息:
对幻影v1.5b3中Anti-Debug代码的一点分析

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

【前言】
不能上网的日子真是难熬，就把幻影加壳的程序分析了一下。最近写了个"幻影1.5b3解密脱壳的小工具"。今天（2000-08-25）上网一小段时间，就把他发给D.Boy看看。这里我说一点幻影中的Anti-Debug代码。

作者： ljttt
写作日期： 2000-08-23

: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] <---这里的Call调用实际上就是调用CreateFileA函数
:0041247D 83F8FF cmp eax, FFFFFFFF
:00412480 7568 jne 004124EA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00412486(C)
|
:00412482 46 inc esi <---小循环开始
:00412483 803E00 cmp byte ptr [esi], 00
:00412486 75FA jne 00412482 <---小循环结束
:00412488 46 inc esi
:00412489 803E00 cmp byte ptr [esi], 00
:0041248C 75DC jne 0041246A <---大循环结束处
:0041248E EB5A jmp 004124EA
..............（省略中间的代码）
:004124EA 83F8FF cmp eax, FFFFFFFF
:004124ED 7406 je 004124F5
:004124EF FF956CBF4000 call dword ptr [ebp+0040BF6C] <---ExitProcess()

我们来看一下幻影是怎样来超度我们的。
call dword ptr [ebp+0040BBA3]实际上就是CreateFileA函数调用。在大循环中他反复地想创建文件，也就是看你跟踪他没有，所以在 cmp eax,FFFFFFFF 后跳转代码处，你就看着办吧。如果你想继续跟踪，就要跳走。 esi 指向的地址有以下检测内容。

\\.\TRW <---检测TRW
\\.\TRW2000 <---检测TRW2000
\\.\TRWDEBUG <---检测TRW2000
\\.\REGVXD <---检测RegMON
\\.\NTICE <---检测SoftICE
\\.\SICE <---检测SoftICE
\\.\VKEYPROD <---检测....，这是什么东东带的，我还不清楚。：-(
\\.\FILEVXD <---检测FileMON

大循环结束后，通过判断eax是否为-1，来确定幻影加壳的程序是否被跟踪。

【后记】
幻影加壳的程序中破坏了跟踪环境 int 1 和 int 3 的环境，如果你想直接进行跟踪，门都没有。（你有门，快告诉我一声）。所以必须处理一下，才能动态跟踪。我80%是静态分析出来的。看上面的，W32Dasm反汇编的，西西。幻影中有许多值得研究的地方，不过由于这是D.Boy的秘密，不便泄露。所以.....西西。我可不想D.Boy在幻影新版中给我来一段。

Call_killljttt()
{ if( Call_寻找跟踪者()=="ljttt" || Call_寻找跟踪者()=="ljtt" )
{ for(int i=0;i<1000000;i++)
{ Call_发送超级龟派气功("ljttt");
}
return 你死去吧!
}
}


Error Free

资料整理: 高春辉, ID: Paul Gao, 沈阳华储 BBS 站. BBS 站台电话: (024)3846411.
====== Error Free 01/20 =======================================================

Drag & Zip

> >Drag And File Win 95/NT : 7000000000
>
> 上项对的, 但是不适用 Drag & Zip ; 在线上找了半天也找不到 (其
> 实我有找到一 Cracker 站, 画面有 Drag & Zip 但拉了老半天, 让
> 中华电信又多赚了好几百, 就是拉不下来) 所以只好用 SoftICE95
> 追追看罗!
>
> 我就用 '7878787878' 当 Key! 为什么我要用 '7878787878' 当 Key
> ? 因为用 '0123456789' 常常会和软体内的资料相冲, 待会 Search
> 出来的位址, 可能就不是我打的 '字串' 之位址.
>
> 那为什么我不用 '6767676767' 而要用 '7878787878' ? 因为我是 "
> 男生" 啊! 遇到很龟毛的事, 习惯说 "怎么那么 X X ".
>
> SoftICE 找出 '7878787878' 字串的位址, 拦到 Memory 的 Read /
> Write 的点之後, 就开始一步一步 Trace, 设断点, 用笔在纸上记录
> 可疑的位址 ... :)
>
> 准备找出 "注册无效" 的地点, 不停的按 [F-10], [F-10] 起码按了
> 近千次....按按按, 这个 Call 有显示动作了, 看是不是 "注册无效
> " 嗯? "注册完成" ?? 张大眼睛再看, 真的是 "注册完成" ! 奇怪?
> 我有动到任何东西吗?
>
> 莫非注册码真的是 '7878787878' ? 有 Drag & Zip 的人, 不妨试试
> 看, 看是不是 Drag & Zip 装死骗我. 瞎猫碰到死老鼠猜中注册码,
> 有史以来我还是第一遭...

====== Error Free 02/20 =======================================================

CAD/DRAW 4.1 Level 2

> 1.用 Winice 载入 Win95
> 2.执行 CAD/DRAW 4.1, 选择注册,
> 3.输入大名, 注册码先填 78787878 , 用此时O习惯问题.
> 4.按 Ctrl_D 进入 winice
> 5.用 S 30:0 L FFFFFFFF '78787878' , 会搜出位址 ss:ssssssss
> 6.用 BPM ss:ssssssss 设断点.
> 7.按 F5 返回 CAD/DRAW 4.1.
> 8.按 <钥匙> 後, winice 会拦截到, 而又进入 winice .
> 9.用 BD * 清除断点
> 10.在 winice 画面下, 一直按 F10, 按到如下: (<- 会按蛮久的, 但还好啦!)
>
> 14F:402332 CALL EDI
> LEA EAX,[ESP+20]
> MOV EDI,[0064...]
> : :
> LEA EAX,[ESP+00000024]
> LEA ECX,[ESP+20]
> PUSH EAX
> PUSH ECX
> 14F:4023AD CALL 4719F0 <-- 按 F10 到此, 记得换 F8 进入 CALL
>
> 11.进入 CALL 继续压 F10, 如下:
>
> 14F:4719F0 PUSH EBX
> : :
> : :
> 14F:471A11 CALL 471870 <-- 至此请压 F9 设断点.
>
> 12.再按 F5 返回 CAD/DRAW 4.1
> 13.请输入如下格式的注册码:
>
> 04200-04.00-00000-000 <- 後面不得有看不见的空白.
>
> 14.再按 <钥匙> 後, 又会被 winice 会拦截到.
>
> 假如以上的 address 14F:?????? 都与我的一样 ( ?????? 应该一样才对,
> 不一样的应该是 14F: ), 就用 G 471A69
>
> 14F:471A69 CMP ECX,EAX <- 把 EAX 抄下来换成十进位 kkkkk.
> JZ 471A74 ECX 应是 0, 因为你打 00000 .
>
> 15.再按 F5 返回 CAD/DRAW 4.1
> 16.把换算出来的十进位的 5 个数字(kkkkk), 输入到如下格式的注册码:
>
> 04200-04.00-kkkkk-000
>
> 17.再按 <钥匙> 後, 又会被 winice 会拦截到.
>
> 就用 G 471AB7
>
> 14F:471AB7 SUB EAX,EDX <- 把 EDX 抄下来换成十进位 ggg.
> POP EBP EAX 应是 0, 因为你打 000 .
> POP EDI
>
> 18.用 BD * 先暂停拦截, 再按 F5 返回 CAD/DRAW 4.1
> 19.把换算出来的十进位的 3 个数字(ggg), 输入到如下格式的注册码:
>
> 04200-04.00-kkkkk-ggg
>
> 20.再按 <钥匙> 後, 注册成功! Ya!
>
> 注: 第一个 04200 是可以到 04399 的, 04.00 也可以到 04.19 的;
> 但上两个的数值, 会影响到後面的数字, 故改大名及这边时, 都要
> 再 Trace 一次, 看看 kkkkk & ggg 的变化.

====== Error Free 03/20 =======================================================

Eudora 3.0 Pro 没有 2.x, 用SICE 也可以安装

> 1.用 softice95 载入 win95.
> 2.执行 eudora.tmp 目录下的 setup . <- 想必你早已用 "暴力" 解开了
> 　　　　　　　　　　　　　　　　　　　　只是没有 2.1.2.
>
> 3.按 <Next> 按到目录设定的地方, 有 brower 那里.
> 4.先把目标路径设定好, 再按 ctrl-d 进入 winice .
> 5.用 BPX USER!LOCKMYTASK 设断点
>
> 6.用 F5 返回 SETUP, 按 <NEXT> 一定会显示 2.1.2 不在,
> 不过没关系, 按 <确定> 後就又会被 winice 拦截到.?
>
> 用 BC * 先清掉断点.
>
> 7.再来就一直在 WINICE 下按住 F10, 按住不放比较轻松啦! 因为要
> 按一阵子. 不过你要注意一下 SOFTICE 下半部所写的字, 一开始
> 应该是 USER(08) .
>
> 8.当那个字变成 _INST0432!.text+??? 就停下来, 没马上停没关系
> , 但不要嫌著没事, 再那里硬撑.
>
> 9.用 U 0043B76C, 就会看到:
>
> 14F:0043B76C CMP DWORD PTR [EBP-14],01 <- 把这里设断点.
> JMP 0043B683
> CMP DWORD PTR [EBP-14],02
> JMP 0043B6A7
> CMP DWORD PTR [EBP-14],03
> JMP 0043B6CB
> CMP DWORD PTR [EBP-14],04
> JMP 0043B6EF
> CMP DWORD PTR [EBP-14],05
> : :
>
> 10.先用 BD * 暂停拦截一下, 按 F5 回 SETUP, 等画面稳定
> 两秒後, 再按 Ctrl-d , 才用 BE * 使 winice 恢复拦截.
>
> 11.按 F5 返回 SETUP .
> 12.按 BROWER 画面上的 <NEXT> , 此时会被 winice 拦到.
>
> 13.第一次按 F5 , 这又会被 winice 拦到.
> 14.第二次按 F5 , 一定还会被 winice 拦下来.
>
> 15.用 E EBP-14 来改记忆体的内容. 原本应该是 5. 现在你就
> 把它改成 1.
>
> 16.用 BD * 暂停中_, 按 F5 就 pass 啦!
>
> 对啦! s-ice 会把中断时的时间停下来, 以便对时间一比一
> 的模拟, 用完之後, 别忘了, 对一对你电脑上的时钟!

====== Error Free 04/20 =======================================================

Instant File Access

> 这个程式很好追, 想练习破解的人, 你们不妨只看我的 (1)-(11)
> 的步骤, 然後其它的就自己先追一追 (Trace & Trace), 追的到
> 了, 那你在 Hacker 学院就注册完成了.
>
> (1) 用 winice 载入 Win95 .
> (2) 执行 IFA 选择注册, 输入大名、等等东西 ..
> (3) 注册码先填 78787878 <- 用此数 (78787878) 是习惯问题.
> (4) 按 Ctrl_D 进入 winice
> (5) S 30:0 L FFFFFFFF '78787878'
>
> WINICE 会搜出一个位址 ss:ssssssss
>
> (6) BPM ss:ssssssss <- 设断点
> (7) 按 F5 把控制权还给 IFA .
> (8) 在 IFA 下按 OK ! 被 WINICE 拦截, 如下
>
> xxxx:9EAA REPZ MOVSD ; <- 在此点拦下, 你就开始按 F10
> POP ECX
> AND ECX,3
> REPZ MOVSB
> XOR DX,DX ; <- 按到此, 先停下来
>
> (9) 用 BD * 暂停以前的断点
> (10) 用 BPM ES:EDI-8 设另外一个.
> (11) 按 F5 返回 IFA, 一下子又被拦了下来, 如下:
>
> xxxx:1AA7 CMP AL,20 ; <- 在此点拦下.
> JZ 1AA6 ; <- 不要看到 JZ 就以为到站了
> CMP AL,9 ; 这边不是啦! 才到中坜而已
> JZ 1AA6 ; 台北还很远. 而且等一下要
> ; 先去休息站
>
> (12) 再用 BD * 暂停以前的断点, 一直按 F10 按到如下:
>
> xxxx:1AB8 LODSB ; <- 你会在这里跑迥圈
> CMP AL,39 ;
> JA 1ADC
> : :
> JMP 1AB8 ; <- 你看又上去了
>
> ; 不过没关系, 它不是死胡同, 它只跑八次, 因为注册码你打
> ; 八个字, 它在检查那八个字是不是数字等. 好了, 在休息站
> ; 休息过了, 可以继续走了, 起程吧!
>
> xxxx:1ADC POP AX ; <- 我们就不要再流连忘怀, 游标移到此 ?
> CMP AL,2D ; 按 F7 再按 F10, 继续慢慢走慢慢看.
>
> (13) 用 F10 走走走, 走到.....
>
> xxxx:D5ED CALL D934
> ADD SP,06
> CMP AX,[EP-08] ; <- 走到这里停起来, 台北到啦! 下车了.
> JNZ D602 ; <- 跳到 D602 就没戏唱了哦!
> CMP DX,[BP-06]
> JNZ D602
>
> (14) 把 DX 和 AX 的值准确的抄下来, DX 是 MSWord, AX 是 LSWord
> , 排成一个 4 bytes 的 16 进位码, 再它换算成 10 进位,
> 就是你要的东西了..

====== Error Free 05/20 =======================================================

ACDsee for win95 1.0

> 本版的注册核对 routine 和 beta10 的一模一样, ACDsee95 1.0 beta
> 10 我讲过了, 本篇就是完全 Copy beta10 的那篇示范, 再改了一下
> 小地方而已.
> ----- ----- ----- -----
> 这个程式很好追, 比上次那个 IFA 难追一点点而已, 但是因为注册的
> 运算式蛮复杂的, 所以我就不分析了, 建议直接用强迫跳过去的.
>
> 想练习破解的人, 此程式说难也不难, 你们不妨只看我的 (1)-(11) 的
> 基本动作, 其它的自己先练习看看. 追的到了, 那你在 Hacker 学院的
> 新生训练也就过啦!
>
> (1) 用 winice 载入 Win95 .
> (2) 执行 acdsee version 1.0, 选择注册, 输入大名.
> (3) 注册码先填 78787878 <- 用此数 (78787878) 是习惯问题.
> (4) 按 Ctrl_D 进入 winice
> (5) S 30:0 L FFFFFFFF '78787878'
>
> WINICE 会搜出一个位址 ss:ssssssss
>
> (6) BPM ss:ssssssss <- 设断点
> (7) 按 F5 把控制权还给 acdsee .
> (8) 在 acdsee 下按 OK ! 被 WINICE 拦截, 如下
>
> xxxx:9EAA REPZ MOVSD
> POP ECX ; <- b此点拦下, 你就开始按 F10
> AND ECX,3
> REPZ MOVSB
> XOR DX,DX ; <- 按到此, 先停下来
>
> (9) 用 BD * 暂停以前的断点
> (10) 用 BPM ES:EDI-8 设另外一个.
> (11) 按 F5 返回 acdsee, 一下子又被拦了下来, 如下:
>
> MOV EDI,EBX
> 14F:40363C REPNZ SCASB ; <- 在此点拦下
> NOT ECX
> DEC ECX
>
> (12) 再用 BD * 暂停以前的断点, 用 F10 一直走到如下:
>
> 注: 你会经过许多判别, B算的 Loop , 自己用眼睛分析一下
> , 利用游标的上下及 F7 键, 来缩简追踪的时间哦!
>
> 14F:4035C9 CALL 403620 ; <- 你会从此 Subroutine
> LEA EAX,[ESP+48] ; <- 返回至此
>
> LEA ECX,[ESP+74] ; 想用 '排列组合' 来猜码,
> ADD ESP,10 ; <- 可以把断点设在此.
> ; 用 "d eax" 或 "d ecx" 来看资料.
>
> ; 不过此软体用 Username 来顺著猜 '注册码' 并不好猜; 不过你可以牵
> ; N它产生的名字, 就是先选注册码, 再用 '排列组合' 反推可注册成功
> ; 的 Username , 就比较容易多了.
>
> MOV DL,[EAX] ;
> CMP DL,[ECX] ; <- 比较奇数字符?
> 4035DD JNZ $Error ; -> 跳到 4035F9 就玩完了
>
> OR DL,DL
> JZ $Yes ; <- 是零, 就是比较完了.
>
> MOV DL,[EAX+1]
> CMP DL,[ECX+1] ; <- 比较偶数字符?
> JNZ $Error ; -> 让 CPU 走到 $Error 就寿了.
> OR DL,DL
> JNZ $next.. ; 不是零, 就是比较还没完
>
> $Yes XOR EAX,EAX ; <-- Yes!
> JMP $Ret_Rdy
> ; 最後的提示:
> $Error SBB EAX,EAX ; <- 绝对不能让 cpu 走到这一行
> SBB EAX,-01 ;
> : :
> $Ret_Rdy : :
>
> (13) 重点就是在 4035DD , 要害我已经告诉你们了, 其它的自己想办
> 法改. 会的人不要说答案, 我一定要强迫想入门 Hacker 的线上
> "魔友" 去看组语的书.
>
> 一个 Soft-ICE 的指令说明: 当你想看机械码时, 可以用 code on ..

====== Error Free 06/20 =======================================================

Paint Shop Pro 4.12 beta2

> 先把系统的日期改一下, 通常我为了方便, 我会递增一年.
> 试著执行, 果然跑出了被打 X 的窗子..
>
> 用 ldr 载入後你会看见...
>
> 14F:4CF3F0 INVALID ; <- 这是 Soft-ICE 奇怪的地方, 不过没关系
> : ; 按一下 [F8] 就正常了. 如下
>
> 4CF3F6 PUSH EBP ; <- 游标在此, 开始按 [F10] 追罗!
> MOV ESP,ESP
> MOV EBP,ESP
> : :
> CALL [.....]
> PUSH EAX
> 4CF542 CALL 4CFB54 ; 追至此请按 [F8] 进入 CALL .
> ; 再换 [F10]
>
> 我为什么知道以上这个 call 要换 f8 进入? 因为我用 f10 带过
> 那个 call 时, 就跳出 "抬头主画面" 和 "过期告示" 了, 所以我
> 知道那个 call 有问题, 必须进入观查..
> ----
> : :
> PUSH DWORD PTR [EBP+..]
> 4CFB64 CALL 4CFBC2 ; 追至此再按 [F8] 进去看看.
>
> 这个 call 要用 f8 进入观查的原由那还要问吗? 因为我有用 f10
> 带过那个 call 嘛! O.K ?
> ----
> 4CFBC2 JMP [4F8748] ; 再按一次 [F8] (又追到别的档案
> ; 去了! )
>
> 这里为什么我要用 f8 ? 因为手刚好放在 F8 上面嘛! 除了 CALL
> 之外, F8 & F10 之作用都一样, 都是单步执行.
> ----
> 此时已经到了 MFC42!.TEXT 的范围了. 因没其它的线索, 只好用
> [F10] 继续追..
>
> PUSH EBP
> MOV EBP,ESP
> : :
> 5F40A51B CALL [EBX+58] ; <- 最讨厌追到这个. 用 [F8] 再往里面伸.
> ----
> 4031B6 INVALID ; <- 又来了, 没关系再按一下 [F8]
> : ; 就好了, 如下:
>
> 这个 invalid 我还是不知道会什么会这样, 不过出现此东西时, 按
> F8 大多不会有什么问题, 但按 F10 会依不同的软体而定, 有时会
> 当掉.
> ----
> Ya! 又回到了 psp!.text , 这下子你 psp 竟放我回来, 有你好看.
>
> 448420 MOV EAX,FS[0....]
> : :
> : : ; 哇! 这一条龙真长, 按了好久好久
> MOV EBX,[EAX]
> PUSH 00000080
> 4487B4 CALL [EBX+000000C0] ; <- 用 F10 经过此, 主画探N出来了.
> TEST EAX,EAX
> JZ 448... ; Jz!? 别穷紧张, 你若强制让 eax为零时, 表
> : : ; 示开窗不成功, 但是系统已经开成功了, 所以
> : : ; 会使程式错乱. 开窗一次, 会送一个旗号回来.
> : : ;
> : : ; 又按 F10 按了好久.
> ; : ;
> CALL 40280B ; <- 这是要害 ..
> TEST EAX,EAX
> JZ ... ; <- 有没有看见 'JZ' ?
> PUSH 00
> PUSH 10
> 44896A CALL 4CE668 ; 哇! 被打 x 的窗子弹出来了.
> : : ; 往上一看... Jz !!
>
> 想当 Hacker 的人, 自己进入要害的 call 内分析看看, 程式很短
> , 所以我就不公布答案了! 其他的高手, 最好不要说答案, 我想训
> 练一下想入门 hacker 的人, 我希望他们没事就去啃组语.
>
> 当你追到手修改完成後, 别忘了把 "系统日期时间" 改回来, 再执
> 行 ScanDisk , 要把 "无效暾? 和 "无效档名" 两项的检查项目
> 打勾, 再来 Scan 所有的 Disk .
>
> 因为 Win95 对日期很敏感, 日期矛盾时, Win95 的某些 Appz 会
> 当掉; 有的主机板异常会跳到 209x 年, 那就会不时的当.

====== Error Free 07/20 =======================================================

Lunar FTP V1.1

> 触机: 算命者预测未来的一种感觉; 如: 测字, 虽然同一个字, 但
> 面对的时地物不同时, 算出来的未来也不同, 那种不同的
> feeling 就叫 "触机" . 英文是不是叫 "sense"? 先死?
>
> 破这程式的注册码最好要有那种 "触机" , 没有的话, 你可能会猜
> 的蛮累的, 不然你就要很深入的一行一行分析此软体, 但是这样会
> 很耗时; 想要拥有那种有如作家灵感般的 hacker 触机, 你就要没
> 事多看书, 多拿软体来破, 经验足了它自然会成为你的一种本能.
>
> 不多说了! 进入正题..... 按照基本动作 (1)-(11) 就可以飞到目
> 标软体的领空了.
>
> (1) 用 winice 载入 Win95 .
> (2) 执行 LunarFTP 先选择注册
> (3) 先填 78787878 一行就好.
> (4) 按 Ctrl_D 进入 winice
> (5) S 30:0 L FFFFFFFF '78787878'
>
> WINICE 会搜出一个位址 ss:ssssssss
>
> (6) BPM ss:ssssssss <- 设断点
> (7) 按 F5 把控制权还给 LunarFTP .
> (8) 在 LunarFTP 下按 OK ! 被 WINICE 拦截, 如下
>
> xxxx:9EAA REPZ MOVSD ; <- 在此点拦下, 你就开始按 F10
> POP ECX
> AND ECX,3
> REPZ MOVSB
> XOR DX,DX ; <- 按到此, 先停下来
>
> (9) 用 BD * 暂停以前的断点
> (10) 用 BPM ES:EDI-8 设另外一个. ; <- 因为你打 8 个字, 所以减 8.
> (11) 按 F5 返回 LunarFTP 一下子又被拦了下来, 如下:
>
> 14F:4875FB REPNZ SCASB ; <- 在此点拦下
> NOT ECX
> LEA EAX,[ECX-01]
>
> (12) 用 BD * 暂停以前的断点. 用 F10 开始走...走到:
>
> POP ECX
> LEA EAX,[ESI+00001055]
> 14F:412DAF PUSH EAX ; <- 至此先停下来. 先按 F9 设一下断点
>
> 此时你用 D EAX 看资料, 你会看到 USERNAME, SERIALNO.. 等敏感的
> 字眼. 但是并没有看见你打的字.
>
> 此察动作只是其中之一例, 但它是最重要门槛之一, 若你是要练习追,
> 不妨类似的地方都要 Dump 出来看; 看不出资料有任何关联也没关系,
> 但有嫌疑形像时, 就用笔记录下来; 这类的观查记录动作, 有益於你的
> Hacker sense! 不是 "先死" 啦! 是 "触机" 啦!
>
> 那位同学, 把你隔壁那个摇起来... O.K ! 我们继续...
>
> (13) 按 F5 返回 LunarFTP , 重新再选注册, 照著如下四行的格式打,
> 别忘了, 先打在 "笔记本" 再用 Copy 的, 不然你会後悔..
>
> USERNAME: (你的大名)
> SERIALNO: (随便, 我是打 8 个数字)
> KEY:
> ABCDEFGH Z
>
> 我为什么会知道以上的格式, 除了做了许多类似 (12) 的 D EAX 的
> 观察动作外, 其实还带点猜测性, 所以说 "触机" 对一个 Hacker 而
> 言很重要. 这种感觉我一时也说不上来, 大概是我的表达能力有限吧
> ! 只好暂用 "触机" 一词.
>
> 幸好今天运气不错, 我只猜了两次注册格式. 我不是说过吗, 破解程
> 式除 "毅力" 之外, 另外一个很重要的就是 "运气" !
>
> (14) 按下 OK 之後, 又会被 WINICE 拦下来, 也就是刚刚你停下来的
> 位址, 你就继续按 F10 .... 走到如下 (会走很久很久, 这里也
> 也是很长的一条龙) :
>
> 14F:41320D CALL 436FB6 ; <- 这是要害, 必须用 F8 进入观察
> POP ECX
> TEST EAX,EAX ; <- 强迫让 EAX=1, 会弹出 "成功视窗"
> JNZ 413239 ; <- 不是 0, 就跳走
> MOV EDX,[EBP+..]
> : :
> PUSH EAX
> 413232 CALL 492AC3 ; <- 当你走过这里的时候, 失败视窗就
> JMP 413259 ; 会弹出来, 往上一看啊! 上面有个
> ; JNZ , 以上那个 CALL 必有问题.
>
> 为什么我会知 eax=1 会弹出 "成功视窗" 咧? 因为我有试嘛! 我用
> R EAX=1可不可以? 当然可以, 否则 S-ICE 就有 BUG 了. 分析软
> 体就是要多试, 这个试试, 那个试试, 多猜多试多做记录..
>
> (15) 用 F8 进入那个 CALL (要害) 内, 你n分析程式, 有那些情况
> 返回时, EAX 不会等於 "零". 用 F10 走到如下:
>
> 14F:436FB5 PUSH EBP
> : : ; 要害的心脏在此. 如下:
> 437058 XOR EAX,EAX ; 比较第一个字符时, EAX 必须等於 0 .?
>
> $loop MOV DL,[EAX+EBP+FFFFFCD4] ; 先拿一个字符.
> CMP DL,[EAX+EBP+FFFFFED4] ; 这是一个字符的比较?
> JZ $next ; 相等就准备比较下一个.
>
> XOR EAX,EAX ; 在此返回 EAX 就是 0 '?
> JMP $Return_Ready ; eax=0 就没救了.
>
> $next INC EAX ; 指标 + 1
> CMP EAX,0C8 ; 这下子你可有得抄了, 居然比较 0C8 次!
> JL $loop ; 慢慢的抄, 仔细的抄, 不要抄错. 被电脑
> ; 罚写的滋味不错吧!
>
> (16) 注册的标准格式
>
> USERNAME: (你的大名)
> SERIALNO: (随便, 我是打 8 个数字)
> KEY: (後面空白)
> (你抄到的码, 总共 200 (C8) 个英文字母, 可换行, 怕打错时,
> 可以插空白没关系, 我是每四个字就插一个空白)
> Z ( <- 结尾时, 请多加这个 Z 字当终结 )
>
> 要害内的重点分析已经说给你听了, 只要你看的懂组合语言, 你就
> 找的到那两百个英文字母..
>
> 再叮咛一次, 先打在笔记本上, 打好 Save 再 Copy 过来注册, 否
> 则要是抄错一个字, 必昏无疑... 你会干死的..
>
> 一个 S-ICE 指令, 当你想看某个位置的资料时, 可以用 "D" ,
> , 它就是 Dump 的缩写. 范例如下:
>
> D 800000
> D DS:EAX
> D EBP+0FCD4

====== Error Free 08/20 =======================================================

007 for Win32 1.0d

> 1.用 Winice 载入 Win95
> 2.执行 Ask007 . 等待抬头的延迟画面. 按 [I Agree] .
> 3.把滑鼠移到视窗上的顶行的 [007 for Win32]
> 4.按下右键, 选 [About 007] . 此时又会跑出刚刚的抬头.
>
> 为什么不用刚刚那一个? 两个都一样, 我为什么就一定要用刚
> 刚那一个? 我就偏偏要用这一个.
>
> 每次的 "猜测" 及 "设断" 总是要再来一次, 你若执意要用进
> 入程式那一个, 要再来一次时, 就必须结束程式再从新执行,
> 比较麻烦啦! 不是不可以用啦!
>
> 分析软体要 "多猜多试" 忘了吗? 试一次那段程式就执行过啦
> ! 想再来一次, 当然就是想办法再让要试的地方从Y走一次罗!
>
> 5.用 bpx lockmytask , 设断点. 当你又按下[I Agree] 时,
> 在它抬头消失完成之刹那, 就会被 S-ice 拦下, 如下:
>
> USER!LOCKMYTASK
> xxxx:636C ENTER 0004,00 ; <- 在此拦下.
> PUSH SI
> PUSH DS
> --- USER(3) ---
>
> 把这个 lockmytask 记起来, 假如你没有其它比较好的断点可
> 设时, 这个总是能发挥效用. 专门在抓关窗子的点. 不要问我
> 原理, 这个点是试出来的.
>
> 记住! 多试就会抓到未知系统的某些规则.
>
> 6.此时你按一下 F12, 如下:
>
> yyyy:44B1 CALL USER!LOCKMYTASK
> MOV EAX,[BP+0A] ; <- 在此点拦下,
> LES BX,[BP-04]
> --- USER(8) ---
>
> 你们可以看看拦下点的上一行, 是 CALL 那里啊? 不熟 S-ICE
> 的人, 自己猜猜看, F12 是内设为 P RET, 那 P RET 是做什么
> 用的? 这个指令不错吧!
>
> 注: s-ice 是可以自定功能键的, 不过我都用内设的. 想当 hacker
> 的人, 到 s-ice 的目录下找, 找找看 "定义档" 在那里?
>
> 7.接下来就不管了, 你就一直按 F12, 一直按, 要按有一阵哦!
> 第二次 ASK007! 又再度的跑出来时, 如下:
>
> 14F:00403F41 CMP [ESP+121],3F1 ;
> JNZ 403FA7 ; 不等於时, 就跳走.
> MOV ESI,[ESP+0124]
> : :
> 14F:00403F66 CALL 00402820 ; <- 这个就是那个抬头
> LEA EAX,[ESP+30] ; <- 刚到时, 你会在此
> ADD ESP,10
> : :
> 14F:00403F74 CMP [ESP+20],7CD ; <- 换成十进位看看
> JBE 403FA7
> PUSH 40
>
> 我为什知道那个 CALL 是完整的 "抬头" routine ? 我把断点设在
> 那行 CALL , 然後再选一次 About 007, 这样试行不行?
>
> 当然要找出这个 CALL , 就是每按一次 F12, 就在上面的 Call ,
> 设断点试之; 再按一次, 就再设断试一次..... 最终就会让你找到
> 了, 不对吗?
>
> 那如果按一百次呢? 当然就要试一百次啊! 破软体要有毅力, 不是
> 说假的, 这一点你们一定要接受, 没办法..... 不过在 Win95 下
> 的此程式你可以在 ASK007! 的范围时, 才设断试之便可.

====== Error Free 09/20 =======================================================

Gif gif gif

> 1.用 wice 辑载入 95 .
> 2.执行 ggg , 选择注册, 打下大名
> 3.注册号码先填 78787878.
> 4.按 Ctrl-D , 进入 s-ice,
> 5.用 S 30:0 L FFFFFFFF '78787878'
>
> 此时 sice 会搜到一个位址 30:004xxxxx . 唉! 以前不是都搜到
> :8xxxxxxx 吗? 怎么这一次会搜到 004xxxxx ??
>
> 管它的, 按照 hacker 以往的习性, 就在按一次 s 试之! 果然搜
> 到另一个位址 :8xxxxxxx. 常常用这个 :8xxxxxxx 来追也蛮烦的
> , 这次就换一条新路走走看..
>
> 6.用 bpm 30:4xxxxx 设断, 压 F5 返回 ggg .
> 7.按下 ok 後, 会被 sice 拦下来, 如下:
>
> 14F:BFF780DC MOV [EAX+08],ESI ; <- 在此拦下.
> MOV [ESI+08],EDX
> MOV [EDX+04],ESI
>
> --- KERNEL32! ---
>
> 8.按 F12 几下就到 ggg 的领空了, 如下:
>
> 14F:4358F4 CALL 4504EC
> POP EDI ; <- 刚到时在此.
> POP EBP
> --- GGG! ---
>
> 9.若己进入射程范围, 接下我通常会按 F10 开始走.
>
> 通常要 hack (砍) 掉一个保护时, 你必须先了解原程式的走向; 用
> F12 往往会跳的太快, 比较不容易看清楚程式是怎么走的. 必竟现在
> 已经登陆了, 还是小心一点好.
>
> 走走走, 不久你就会走到....
>
> 14F:00410F70 CALL 0043E26D
> ADD ESP,P4 ; <- 你会跳回至此
> : :
> ### CALL 00410C52 ; <- 可能有问题,
> ADD ESP,08
> *** TEST AL,AL ; 强迫 AL=1 似乎没什么事
> JZ 00410FA1 ; 若是 0, 就注册失败了.
> : :
> 14F:00410F9F JMP 00410FD1 ; 跳开
> 14F:00410FA1 PUSH 38
> : :
> 14F:00410FC9 CALL 0041E8E1 ; <-这里会跳出讯息的背框, 大
> ADD ESP,1C ; 小和 "失败窗" 一样, 因此
> : : ; 暂时猜测至此就危险了.
>
> 这个地方和通`的情况不太一样, 因为在 *** 那里时, 若令 AL=1
> 并不会发生什么事, 只是会把注册窗收掉而已; 但若令 AL=0 就必定
> 失败. 手上没线其他线索, 所以只能用 F8 , 进入那个 "可能有问题
> " 的 ### CALL .
>
> 10.好吧! 那我们就进去看看吧! 如下:
>
> : : :
> 14F:410C5D CALL 00410A40 ; <- 要害在此, 进去观摩一下.
> ADD ESP,08
> MOVZX EAX,AL
> TEST EAX,EAX ; <- 再做一次实验, 令 EAX=1
> JNZ 00410C70 ; 居然注册成功.?
> XOR AL,AL ; <- 在此又让 AL 填 0 了.?
> JMP 00410CA4
>
> 有 "注册成功" 样子 (想当 hacker-乱砍者, 就自己找, 看看画面的
> 那里有注册成功的痕迹) , 那 410C5D 那个 CALL 保证有问题, 而且
> 问题可大了..呵呵! 这下子总部, 即在不远的前方..
>
> 11.用 F8 进入 410C5D 那个 CALL . 如下:?
>
> : :
> 14F:00410A4A CALL 00420785
> ADD ESP,04
> CMP EAX,10 ; 这个 10 ?
> JZ 00410A5B
> XOR AL,AL ; 若让 CPU 走至此, 会 AL=0
> JMP Return_Ready ; 返回, 那就完蛋了.
> : :
>
> 举例了那么多次的范例给你们看, 我倒要看看你们的樵夫触机 (Hacker
> Sense ) 有没有变的更灵敏?
>
> 在 CMP EAX,10 那行停下来, 看看此时的 EAX 为 8, 你们有没有联想
> 到什么? 试著猜猜看....哎啊! 再想想看! ....有人说啦! 对对对, 没
> 错! 很可能就是注册号码的字数.
>
> 不过推断并不一定等於事 因为程式不是你写的, 所以一定要求证看
> 看, 这样比较不会被先入为主的观念套死, 而困在这个恐怖的迷宫中.
> 很多保护砍不掉, 通常就是 "太靠势" .
>
> 实验很简单, 用 BD * 暂停以前的断点, 在 CMP EAX,10 那一行设断,
> 从新注册, 注册码填随便填两三个字, 按 OK , 当被 sice 拦下来时,
> 看一下 EAX 是不是你刚刚打字数. 对了! 可不要再打同样的字数 8,
> 否则若运气不好, 这下子你就追惨了.?
>
> 12.好! CMP EAX,10 那个 10 就是十进位的 16 嘛! 刚刚那个断点还要
> 用, 按 F5 返回重新注册, 注册码暂时打 16 个数字. 按下 OK ! 被
> sice 拦下在刚设断的地方, 此时你就继续用 F10 慢慢走, 分析一
> 下此戒备森严的路程. 走到....
>
> OK! 在谈之前, 我们必须再回忆一下我们主要的任务到底是什么? 不然
> 你来这边干嘛? 我们要分析此 Routine, 在什么条件下执行完毕时, 不
> 会让 AL=0 返回.
>
> : : :
> 14F:00410A7A CALL 004108BB ; <- 依下看, 此 CALL 很有看头.
> ADD ESP,08
> PUSH ESI
> MOV [EBP-10],AL ; 把 AL 存起来,
> CALL 004208CD ; 先假设此 CALL 对返回的 AL 无关
> ADD ESP,04
> MOV AL,[EBP-10] ; 把 AL 提回来
> POP ESI
> POP EDI
> LEAVE
> RET ; <- 这个就是 x86 ASM 的 Return 指令哦!
>
> 求证一下第二个 CALL 与 AL 是否於返回的 AL 值无关; 在 [EBP-10],AL
> 那一行之前, 令 AL=1 就知道, 自己实验试之.
>
> 13.用 F8 再进入 410A7A 个行 CALL , 按 F10 没多久就...
>
> : :
> 14F:0041954 MOV EDX,0046009C
> MOVZX EAX,BYTE[EDX+EAX]
> MOV AL,[EAX+EDI] ; 拿一个 Byte
> CMP AL,[EBP-14] ; 比较一个 Byte
> JZ $Next ; 相等就比较下一个
>
> XOR AL,AL ; <- 这个是令 AL=0 的指令.
> JMP Return_Ready ; 在此返回就...
>
> $Next INC SI ; 指标 + 1
> CMP SI,05 ; 比较 5 次
> JB 004108F6 ; 小於就跳到前面准备继续比
> MOV AL,01 ; <- 有没有看到 AL=1
> : :
>
> 哇! 这里就是比较的核心了, 可惜啊! 这里的被比较之两个值, 居然是
> 被运算过的, 我懒的再分析前面的运算式了, 你们就看著办吧!

====== Error Free 10/20 =======================================================

WinJammer 2.30

> 由於 Winjammer 有附一个 Wjmrplay , 它也有注册选项, 所以我们就
> 拿它 (Wjmrplay) 来开刀, 因为程式比较小通常执行岜冉峡? 路比较
> 少通常也比较容易追.
>
> 你们还记得前几堂课讲的追踪密码示范吗? 没忘记吧! 不错不错, 你们
> 也蛮行的嘛! 平常我在上课时, 看你们都在睡觉, 想不到你们对课堂上
> 的东西, 也都记得蛮清楚的. 那 (1)-(11) 密码拦截的基本动作, 我就
> 不再重覆了哦!
>
> 12.到了第十一动时, 也就是 bpm ds:di-8 之後的拦截点, 如下:
>
> xxxx:5BAF JZ 5BAB ; <-- 你会在此拦下.
> JMP 5BC5
> CMP BYTE PTR [SI],20
> --- wjmrplay ---?
>
> 13.此时你按一下 F12, 如下:
>
> 因为上一段有很多 LOOP , 若按 F10 要按蛮久的, 而且我分析之後,
> 也没什么重点, 就是光在那边跑圈圈, 除非你是自己独立追的, 才会跟
> 著它跑几圈, 然後发现没什么要紧, 之後你自然也会跳走.
>
> xxxx:5A87 CALL 5B9C
> POP BX ;<- 你会从这跑出来
> PUSH
>
> 14.此时你开始用 F10 走走, 走到 ...
>
> xxxx:5B72 CALL 15EC ; <- 这是要害,
> ADD SP,04
> OR AX,AX ; <- 在此试 RAX=0 , 会弹出成功视窗
> JNZ 5B82
> PUSH WORD PTR [..
> PUSH AX
> JMP 5B93 ;
> 5B82 PUSH DS
> PUSH 096C
> CALL 344E ; <- 当用 F10 带过这个 CALL 时,
> ; 失败视窗就弹出来了. 往上一看
> ; 啊! 上面有个 CALL , 中奖
>
> 15.你用 F8 进入那个要害. 如下:
>
> xxxx:15EC PUSH BP
> : :
> 15F7 MOV SI,[BP+04]
> MOV DI,[BP+06]
> XOR AX,AX
> MOV CX,FFFF
> REPNZ SCASB
> NOT CX
> SUB DI,CX
> REPNZ CMPSB
> JZ $Return_Ready
> SBB AX,AX
> SBB AX,-1
>
> 比较的核心就在上面, 你们越来越来厉害了, 那我给你们的考题, 当然
> 难度也就要比以前高了哦! 要注册码就自己分析如上的程式, 高手不要
> 说答案, 我要强迫 Hacker 新生多啃几个 x86 的指令.

====== Error Free 11/20 =======================================================

TIPPY FOR WINDOWS 95 V 1.32

> 通常遇到有注册选项时, 我们都先用「 78787878 拦截法」试追
> 之, 但是我试的结果, 此招失效, 拦不下来.
>
> 拦不下来怎么办? 答案很简单, 要嘛就放弃不追 (老子不跟你玩
> 了, 你保护又奈我何? ) , 不死心就换步试试看.
>
> 当 hacker 就是要多试, 还是那一句老话, 多猜多试多做记录,
> 因为目标程式不会是 Hacker 写, 所以 hacker 整天面对的就是
> 茫茫大海, 当然程式的作者不会发疯打电话来告诉你要害在那里
> ; 再则 Hacker 是人不是神, 亦不可能每猜必中.
>
> 那个 78787878 不可行, 当然就不要一直死要用 78787878 来对
> 招; 我们要用智取, 不可用力敌. 大丈夫要能屈能伸, 识实务者
> 为俊杰. 人在屋檐下不得不低头, 好干! 你就抬头看看, 给撞出
> 了一个包, 在那边叫痛, 那我可不管你.
>
> 我们就换一招在 007! 那篇曾讲的 "收窗拦截法" , 还记得吧?
> 不知用什么设断时, 这个 bpx lockmytask 往往可以发挥效用.
> 以前声明过了, 这个点是「试」出来, 不要问我原理..
>
> 把 Username 打下去, 注册码先填 78787878 好了, 一按 ok !
> 注册程式毫不留情马上亮出 "失败窗" 这张王牌.
>
> 没关系, 没有三两三, 岂敢上梁山, 换我们按一下 ctrl-d , 就
> 用 bpx lockmytask 设断, 压 F5 返回 Tippy, 当你按一下 "失
> 败窗" 上的按钮时, 马上就被 wice 拦下; 呵呵! 厉害的 wice
> 果然名不虚传.
>
> 此时先用 bd * 暂停刚刚的断点, 你就开始按 F12, 要按有一阵
> 子哦! 当跑到 Tippy 的 踬 你就马上停下来如下:
>
> 14F:473255 CALL 473897 ; <- 把游标移至此设断,
> ; 因为要 "试" 了!
> JMP ... ; <- 你会跳出来至此.
>
> 我们先把上面的 CALL 设断来试试看 (记得试点时, 别忘了先用
> BD * 暂停先前的断点) , 用 F5 返回 Tippy 时, 操作注册时
> , 你会发现按下 ok 时, 就会被 wice 拦下来.
>
> 当你用 F10 带过这个 CALL 时 , "失败窗" 就会弹出来; 当你
> 在点一下按钮时, "失败窗" 一消失, 又会被 wice 拦下; 这代
> 表此 CALL 有问题.
>
> 嘿! 找到第一个重大线索, 有机会啦! 我们就往上分析看看, 在
> 什么情况下, CPU 的执行才不会跑到此地. 往上一看..如下:
>
> 14F:473214 MOV EAX,[4804F0]
> CMP EAX,[4804E0] ; 在此设断猜码试之.
>
> JZ 47325C ; 在此试强制跳到 47325C
> PUSH 50 ; Tippy 会缩起来...
> : :
> CALL 4738D9
> : :
> CALL 4738A3
> : :
> 473255 CALL 473897 ; 这个可说是失败窗的总部了
> 47325A JMP 4732AF ; 往上一看有个 JZ ! 嘿, 爽吧!
>
> 47325C MOV EAX,[4804F0]
>
> 好像找到要害了哦! 好! 我们就把以前的断点先暂停, 在 CMP EAX
> 那一行设断试之; 来用 d 4804e0 来观查与 eax 有什么关系. 注
> 册码试著改几组...
>
> 咿～！两数值皆不超过 1FF ! 而且有某一方是固定的, 当然固定
> 的那一方就是用你的 Username 算出来的, 反正 1FF 才 512 嘛
> , 那注册码你们就 q一下罗!
>
> 这个机率为 1/512 排列组合猜码, 给 Hacker 新生练习一下; 要
> 新生分析整个注册运算的 Routine, 似乎是太残忍了点. 因为我也
> 懒的去分析, 我自己 ID 的注册码, 也是用排列组合试出来的, 我
> 约试了五、六十次吧!
>
> 底下的! 不要再那边鬼叫鬼叫, 五、六十次的试码, 对 Hacker 是
> 小事一庄, 没上千次就偷笑了. 你们看一下, 光是本篇文章内总共
> 有几个 "试" 字? 以上只是所有过程的精华那一小部份哦! 若再加
> 上在非精华的背後误 "试" , 那就不计其数了.
>
> 再提示一点, 注册码要八个字.

====== Error Free 12/20 =======================================================

roboword.exe is 249,360 bytes

> 首先我们要先谈一谈如何拦截本程式--其实只要 wice 在手,
> 你是可以随时中断进去 trace 的. 你就像一个潜水夫, 潜水
> 配备亦是一级棒, 若海底内没有任何指标, 你要如何找出海中
> 的一支银针呢? 很难吧! 除非踩到狗屎, 好运当头才找的到.
>
> 像一般的注册号码拦截, 你在画面上会看到注册的窗子, 那个
> 窗子或你打的 78787878 , 就是在海中的 "显眼指标" , 只要
> 拼命的往 78787878 游过去, 若银针没有伪装的话, 通常是容
> 易找到银针的.
>
> 像以前我讲的 bpx lockmytask 的收窗拦截, 也是把 "打ｘ窗
> 子" 当成一个的指标, 然後再找进去. 故破解软体的第一指标
> , 若能够预设的够适当, 那么以後的路子就会很好走.
>
> 这之的目标主角 "ROBOWORD" , 既没有注册窗子、又不能让你
> 打 78787878 、亦没 "打ｘ窗子" , 那你如何预设断点?
>
> 说了一堆纸上谈兵的东西, 有一个很重要的 "前戏" , 我们却
> 还没做. 因为破了要有用才行, 我们要先检查一下, 破了到底
> 有没有用? 因为这是测试版, 依经验, 测试版是有很多东西不
> 存在的.
>
> 重要资料不存在, 就算你破了比对核心, 依然没什么鸟用, 除
> 非你改写程式的功力一级 若要改写一大串的东西, 不如重
> 写还来得比较快, 写出来了, 你还可以光明正大的卖钱.
>
> 前戏不是要你对女朋友怎样, 而是要你用 Ultraedit 把字典
> 档载进来观察. 一看! 这个测试版居然有 G-Z 的资料, 这下
> 子你女朋友完了, 不! 是金点完了...
>
> 教了你们这么多堂课, 眼看著一学期又要过, 我想再看看你们
> 的樵夫触机 (hacker sense) 提升到那里, 看看你们有没有资
> 格脱离 hacker 断奶期.
>
> Ok! 我问你们, 在 ROBOWORD 的执行期间, 在画面上有什么东
> 西, 可以让你当成设断的参考指标? 想一想..... 有没有想到
> ? 想到的举手..... 好! 你举手, 请说... 对! 画面有 "A to
> F...demo version" 等字.
>
> 这个 "demo version" 就是我们要攻进去的第一据点. 不过千
> 万不可以为这类的指标, 都很容易的就会被你找到. 也不可先
> 入为主以为就是找不到, hacker 就是一想到方法, 就先 trace
> 再讲; trace 不到, 再想其它的...
>
> 1.执行 roboword .
> 2.切入 wice .
> 3.用 s 30:0 L FFFFFFFF 'demo version'
>
> 有一点爽了..因为搜到了一个位置 30:xxxxxxxx
>
> 4.用 bpm 30:xxxxxxxx 设断.
> 5.按 F5 返回.
>
> 好! 第一个猜试断点设好了, 接下怎么办? 当然就是想办法让
> 我们可爱的 "金点罗伯兄" 走到你预设的断点罗! 你就随便指
> 一个字看看, 要是条件成立就会被 wice 拦下来.
>
> 什么? 拦不下来? 我看看..... 哎呀! 你这个死小子, 没事老
> 让字典程式查 "fuck" ! 不要查 "fuck" 啦! "fuck" 它的字
> 头是在 A-F 之内! 旁边有个 "shit" 字你试试看..
>
> 什么? 还是拦不下来? 我再看看... 哎哟! 你怎么用破解档在
> 练习破解呢? 快去找 "纯" 试用版的回来, 再 install 一次
> 试之.
>
> 6.经过了一番努力, 你们总算给拦下来了. 如下:
>
> xxxx:AA8D REPNZ SCASB ; <- 被拦下的地方
> LDS SI,[BP+06]
> LES DI,[BP+0A]
> MOV AX,DI
> : :
> --- KERNEL(01) ---
>
> 这下是更爽了, 因为预测的条件是成立的. 不过要爽太早, 因
> 为程式不是你写的, 好不好追, 还是个未知数.
>
> 7.你先按一下 F12, 到 roboword 的领空观查看看. 如下
>
> yyyy:06DE CALL KERNEL!LSYRCPY
> MOV AX,0001 ; <- 返回至此...
> POP SI
> : :
> --- ROBOWORD(03) ---
>
> 每到一个新地方时, 你就大略的分析一下附近的程式, 我们先
> 往上看, 因为这里是出现 'A TO F ..' 的地方, 我要了解一
> 下, 有那些条件会使 CPU 走到这里.
>
> 8.你把游标往上移, 你会看到...如下:
>
> yyyy:0D0C CMP AX,0064 ; 和 64 比较?
> JZ 0D74
> : :
> 0D2E CMP AX,0065 ; 65?
> JZ 0D74
> : :
> 0D50 CMP AX,0066 ; 66?
> JZ 0D74
> INC WORD PTR[...]
> : :
> 0D69 CALL KERNEL!...
> MOV AX,0001 ; <- 刚刚返回的地方.
>
> --- ROBOWORD(03) ---
>
> 以上有 64,65,66 你们想一想, 比较这些数字有什么特殊的意
> 义? 你们再往上看时, 亦有 61,62,63 , 那倒底有什么意义?
> 若是常常玩电脑的人, 应该一看就知道那是小写的 a,b,c...f
> 的 ASCII 码. 这下子你们可爽翻了a!
>
> 以上是给新生的第一个习题... 若搜到很多个 'demo version'
> , 请从断电重开机. 或是用最後一个 30:8xxxxxxx .
>
> 等一等! 等一下再收拾书包, 因为还没下课. 假如你不喜欢它
> 的抬头的话... 怎样? 还想听下去吧!
>
> 9.离开 roboword , 用 ldr 载入 roboword . 如下:
>
> xxxx:3F3A XOR BP,BP ; 用 F10 开始走
> PUSH BP
> : :
> 3FCF CALL yyyy:3FE4 ; 用 F8 进入
>
> 10.进入 yyyy:3FE4 的地方如下, 用 F10 开始走.
>
> yyyy:3FE4 MOV AX,DS
> NOP
> : :
> 4002 CALL zzzz:0000 ; 用 F8 再深入
>
> 11.进入 zzzz:0000 你会看如下, 亦是用 F10 继续走.
>
> zzzz:0000 ENTER ...
> CMP WORD PTR[BP+0C...
> : :
> 0197 CALL KERNEL!GETPRI...
> $$ PUSH WORD PTR[2200]
> PUSH 7D
> PUSH 00
> PUSH 2C9F
> PUSH 0330
> ## CALL USER!DIALOGBOX ; <- 跑出抬头的 call .
> @@ CALL wwww:098E
>
> 我们已经知道 ## 那个 call 是显示抬头的, 但你不可以进去
> user! 的地盘改东西. 因为 user! 是系统的范围, 改它的程
> 式码, 你的系统会完蛋.
>
> 当然你可以插 jmp 的指令, 使程式飞过 call user! 的上空
> , 也就是直到达 @@ . 但是 jmp 不可以乱插. 因为那些 push
> 是一些引数, 是要给 dialogbox 用的, 但是 dialogbox 会
> 自动补回 sp 值, 所以 jmp 不可乱插.
>
> 当执行光棒走到 @@ 时, 你就把 sp 值记下来; 你再重新执行
> roboword 一次, 当到了走 0197 时就开始注意 sp 值哦! 慢
> 慢的一步一步走, 当 sp 和刚刚一样时, 光棒所停留的那一行
> push , 也就是你要改成 jmp @@ 的地方.
>
> 其它的就自行练习吧!

====== Error Free 13/20 =======================================================

In Curcuit Emulator

> In Curcuit Emulator, 实体电路模拟器. 为了踪软体执行的动
> 作明细, 所用的一个模拟 CPU 的电子设备.
>
> 注: "ICE" 字眼, 若未注明, 通常是指 "模拟 CPU 之设备"
>
> 你可以想像一下, 有一台机器叫 ICE, 它会有一条排线, 排线端
> 有一个很像 CPU 多脚的插头. 你把它目标板子上的 CPU 拆下
> 来, 把这个头插到 CPU 的座上面.
>
> 那你就可以在 ICE 这边的萤幕键盘上, 控制, 观查 CPU 所有
> 动作.
>
> 当然 NuMage 非常臭屁, 居然取名为 Soft-"ICE" . 但他也非常
> 厉害, 用光用 Soft 就可以作出类似於真实 ICE 的功能.
>
> 要破解软体, 就要先追踪观查软体的走向, ICE 就是用来追踪用
> . 用没钱买真的 386,486,586,686 的 ICE, 就只好用 Soft-ICE.
>
> 586 的 ICE 少说也有廿万..

====== Error Free 14/20 =======================================================

破解程式和抓虫是很相像

> >大家都说s-ice很好用
> >可是各位先进谁知道那有s-ice修改的相关资料?
> >最好是针对初学者写的...
>
> Soft-ICE 只是给会低阶者的一种追踪操作的工具而已, 使用者
> 本身的基本条件一定要了解低阶语言. 最起你手边也要有一本
> 80x86 的指令群来待查, 因为现在 80x86 一票又一票, 指令多
> 的记不完.
>
> 像以前的 6502 就免了, 我连机械码都背起来了, 因为以前的 Apple
> 在 monitor 下, 并没提供线上组译器, 改程式就是查表, 然後
> 把机械码打下去, 查久了自然就背起来了!
>
> LDA # 是 A9, STA 是 85, JSR 是 20 对不对? <-- 十几年後的
> 今天, 照样记了这几个最常用的 . 4C 好像是 JMP ...
>
> 其实破解程式和抓虫是很相像, 举例来说吧!
>
> 假设回到十几年前, 同班同学因专题制做, 必须用组语写了一个
> 程式; 但是呢! 却不能跑, 因交期快到了, 除错了老半天, 不得
> 已只好求救於我.
>
> 若程式不短时, 我当然不可能只用看的罗! 我会用除错器去执行
> 的它的程式, 若是写 APPLE ][ 上面的, 当然一打 call -151,
> 就可以进入内建的除错藿 以前 APPLE ][ 称做 monitor (监
> 督系统, 意谓著是一种程式走向的监控环境. )
>
> 像 PC 当然就是用 debug.exe 或 Soft-ICE 之类的环境, 以前
> Soft-ICE 还没有出来时, 大家都嘛用 debug.exe, 也有人用真
> 正的 ICE 啦! 不过那太贵了, 个人用户是比较不可能去用那个
> 的, 大不了借公司的回来用.
>
> 程式写不好想改正, 你也要知道是那一点在搞鬼, 不然你怎么改
> ? 找问题最实在最准确的方法, 当然就是看著它执行, 直到看到
> 它出 , 就找到了.
>
> 你在除错环境下来监控程式的走向, 你的眼睛跟著程式的指令一
> 步一步慢慢的走, 看看几个地方资料改变, 就这样的一直跟到一
> 个死胡同. 当然你要看的懂低阶的指令, 也要有写程式的基本暹
> 辑思考, 不然你怎知道那一段程式, 是个死胡同??
>
> 找到死胡同了, 事情也就好办了, 因为只要你有办法把那一段死
> 胡同, 改写後, 使程式依照你的意愿走, 那么你就除错成功了,
> 那就可以向你的同学敲份牛排来吃了! 当然! 你的同学也可以顺
> 利毕业.
>
> 破解呢? 其实过程也是一样, 因为使你不能使用的那段程式, 就
> 是前面所讲的死胡同而已, Soft-ICE 只是比 Debug 好用, 环
> 境更好而已, 两者的使用方法大同小异. 只要你会 debug, Soft
> ICE 就不难学习.
>
> 像前代已久的 Apple ][ , 它的 monitor, 操作也是蛮类似的.
> 所以, 只要你会低阶语言, 你就会使用这些除错工具. 破解的基?
> 本条件:
>
> 第一. 你要会写程式.
> 第二. 你要会低阶语言.
> 第三. 你要有除错的毅力 (毅力? 没错! 就是 "毅力" !)
>
> 第四. 会用除错工具, 当然只要你写过低阶的程式, 这项工具
> 你一定没问题. 打 ? 看看功能键, 五分钟不了解六、
> 七成才怪 (有六、七成就够用了啦! 因为其它三成都嘛
> 很少用的) .

====== Error Free 15/20 =======================================================

Dr Eye 2 磁片还魂记

>第一、你必须有原版的磁片，并且已安装、注册。
> (为什么要有这一步呢?? 就是请用原版 !!!!)
>第二、copy dreye20\peadict\*.* ，其时只要有dict.exe
> (如果要dict.exe不要找我，我不想作的太绝了)

第二可以改成 "省略" .

>第三、到登录编辑程式(如果找不到那你的95 学分就不级格了)，
> 找∶
> [HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Explorer]
> "link"=
> "Version"=
> ^^^^^^後面的资料(资料不是一定的)不告诉你，问那些想当坏人的人
> 将登录档资料汇出 !!!!!!

>第四、大功告成，以後在安装时就不用注册片来注册，
> 只要将dict.exe盖掉、登录档汇入就行了!!!!

第四可以改成:

A.「控制台」->「移除程式」->「Dr.Eye 2」 (只移注册, 不要全移掉
, 所以对话框选 No ),

B.用 RegEdit 把刚刚写出的 "登录档" 汇入!

C.塞在磁碟机中的那一片「还魂」的原版磁片, 就可以拿出来了.

>另外有一件事就是它的磁片保护是怎么作的，我曾经去physical copy 磁片
>可是没有用，这个能不能教教我!!!!

1.找不到雷射孔, 应该不是雷射保护.

2.用 Physical Copy 无效, 有可能是「弱磁位元」, 或则是「检查轨长」.

3.「弱磁位元」要用比较特朱的磁碟机来制作, 且会挑 User 方的磁碟机,
不适合薄利多销的产品.

4.「检查轨长」比较容易做. 且不容易 Copy , 因为要找到两台转速丝毫不差
的磁碟机有困难.

====== Error Free 16/20 =======================================================

Roland VSC-88 软体音源

在进入手术房示范刀法之前, 我先说说对这类程式的看法:

我第一次动手下去追之前, 其实我也想了几天; 因为它播放 50 秒的
计时终了, 使 User 不能继续聆听的手法, 并不是跳出一个窗子警告
中断, 而是慢慢的渐弱缩尾; 也就是说 50.00 秒和 50.00+ 秒的表
面状况差异不明显, 这会造成 Hacker 在设断上的困扰.

那个 50 秒的临界点, 前後差异因为太不明显, 所以想要在刚好 50
秒渐弱之刹那断下来, 不容易吧! 那怎么办? 没辄就是看天吃饭!

在 Win 起始後, 其第一次使用 VSC-88 的开头, 会跑出一个日裔的
窗子来警告嘛! 那我们就先把这个窗子决解掉再说. 至於那个 50 秒
的计时, 顺其自然.

1.用 winice 载入 95 , 执行 VSC-88 . 它会弹出一个 50 秒的警告
窗子. 有没有忘记我以前曾讲的拦窗子的点 lockmytask ? 只要用
这个设断成功, 依经验, 约有八成的程式不是很难解的.

2.注意哦! 这次的窗子, 若没把握到, 就得重开机了哦! 在窗子中,
按下 Ctrl-d 切入 winice .

3.打 BPX LOCKMYTASK 设断, 压 F5 返回 VSC-88 的画面.

4.按下窗内的 "确定" , 一收窗, 就会被 winice 拦下来, 如下:

USER!LOCKMYTASK
CS:636C ENTER 0004,00 ; <- 在这里拦下来.
PUSH SI
: :

5.就开始用 F12 键, 往外层的常式跳! 注意按! 一按到了 VSC 的
地盘, 就要马上停下来! 如下:

1E07:4D00 CMP WORD PTR[005C],0 ;
JZ 4D27 ; <- JZ
CMP WORD PTR[00D4],0 ;
JZ 4D27 ; <- JZ
: :
4D1C CALL USER!MESSAGEBOX ;
MOV WORD PTR[00D4],0 ; <- 返回至此, 由此可知, 上
CMP : : ; 面的 CALL 与窗子有关.
--- VSC(1) ---

往上一看, 有两个 JZ 会飞越这个 MESSAGEBOX ! 有两个 JZ , 通常
我会先试第一个. 那要强迫第一个跳至 4D27 , 有几种方式可行. 如
下:

一、把 JZ 改成 JMP .
二、把第一个 CMP 那行最後的 0, 改成 [005C] 相同的资料.
三、把 [005C] 内填零.

通常我会用第三种. 因为在 WINICE 中, 用 E Addr 比较方便. 上两
种必须用 A Addr 来组译, 必须注意组译出来的 Bytes 数.

6.用 E DS:005C, 此时的资料栏如下:

--- VSC(2) ---
DS:005C 01 00 05 00 01 00
^^^^^
有没有注意到第一个 CMP 後面的 "WORD" 字眼? 那个 WORD 就是指
使用的资料长度是一个 Word , 也就是两个 Bytes, 因此就是把上面
画底线的两个 Bytes 填零就可以了.

7.把 DS:005C 的地方填零後, 按 F5 再返回 VSC-88 试看看.

结果, 试听时发现 "老天爷居然给饭吃" ! 50 秒的限制不见了? 有
没有注意到资料栏的地盘是 VSC ? 那表示东西不是在 VSC.DLL, 就
是在 VSC.EXE 罗!

其实还没完, 因为我改了把上头的 01 改成 00 之後, 再进入 Win95
时, 会弹出一个视窗, 说 "波形的资料毁损" !

天啊! 那我只好再改程式段再试试看吧! 也就是第一个 CMP 那个地
方. 因为资料段和程式段不同, 说不定它只检查资料段.

8.我们再看一下那一段, 如下:

1E07:4D00 CMP WORD PTR[005C],0
JZ 4D27

是不是改成如下就好了?

1E07:4D00 MOV WORD PTR[005C],0
JMP 4D27

但是改成如上会多出一个 BYTE , 因为第二个 BYTE 是 0, 所以只要
改一个 BYTE 的叙述就好了, 你可以用 BYTE PTR 的叙述来改.

也许你会想, 最好连那个 JZ 都不要改; 正在想办法把 [005C] 放 0
, 又可使 Zero 旗标举起来的叙述. 答案是有的, 那就是 AND !

====== Error Free 17/20 =======================================================

丑丑字型 & 中文 Win95.

平常 Hacker 有大半的时间, 大概都在砍别人所设下的防护
措施吧! 不过有时候呐! 也会修改到非保护关卡的常式; 或
是撞到他人撰写程式时, 不小心所留下来的 Bug.

呵! 有时候会不小心帮忙抓软体中的 Bug Routine, 这大概
就是 Hacker 要存在的意义吧!

我在追踪 ShellWizard 3.0 窗子上的字型问题时, 分析了
老半天! 似乎有愈来愈明显的趋势, 显示的 CWin95 本身的
字型系统有问题.

因为我追进了 User32.dll , 把它存取资料改掉後, 居然所
有 "丑丑字型的视窗" 之软体, 都变成很漂亮!

追踪过程很繁索, 我就直接讲重点好了. 有 "丑丑字型的视
窗" 之软体, 都会呼叫「CreateDialogIndirectParamA」这
个 Routine 来画窗子.

在呼叫「CreateDialogIndirectParamA」之前, 它会先去呼
叫「GetSystemMetrics」, 这个常式在使用之前, 必须先
Push 一个值给她, 如下:

PUSH xx
CALL USER32!GetSystemMetrics

若有像 ShellWizard 3.0 主窗那种丑丑字型之软体, 都是
PUSH 2A . 如下:

PUSH 2A ; <- 会出问题的都是 2A .?
CALL USER32!GetSystemMetrics
CMP EAX,EBX ; <- 会出 "丑" 时, EAX 都是 1.

1.切入 S-ICE, 用「bpx GetSystemMetrics if @(ESP+04)==2A」
来条件设断. 以上是 SICE 3.0x 的设断语法哦! 在 2.0
中, 并不适用.

2.按 F5 返回 Win95, 一执行 ShellWizard 3.0 Pro, 会被
S-ICE 拦下来, 就开始单步执行罗! 如下:

:u getsystemmetrics l 40
USER32!GetSystemMetrics
014F:BFF648C7 XOR EAX,EAX ; <- 在此拦下.
014F:BFF648C9 MOV EDX,[ESP+04]
014F:BFF648CD CMP EDX,00
014F:BFF648D0 JL BFF64919
014F:BFF648D2 CMP EDX,4A
014F:BFF648D5 JA BFF64919
014F:BFF648D7 CMP EDX,29
014F:BFF648DA JZ BFF64929
014F:BFF648DC MOV EAX,[BFF6714E]
014F:BFF648E1 ADD EAX,000003C4
014F:BFF648E6 ADD EAX,EDX
014F:BFF648E8 ADD EAX,EDX
014F:BFF648EA MOVZX EAX,WORD PTR [EAX] ; <- 执行到此先停住
014F:BFF648ED CMP EDX,16
014F:BFF648F0 JAE BFF64919

3.当执行光棒停在 MOVZX EAX,WORD PTR [EAX] 时, 用
D EAX 来看资料. 如下:
:d eax
0157:81EB2418 01 00 02 00 00 00 02 00-02 00 A0 00 18..
^^^^^
4.用 E EAX 来吧把第一个 01 填 00 吧! 再用 BD * 暂停
所有的断点, 然後按 F5 返回. 怎样?

ShellWizard 3.0 Pro 有没有变的相当漂亮? 妙的是! 她
这次的画面, 居然给多出了四个原先被盖住的选项.

5.此时系统的参数就被你改过了, 就开始试变丑的各种软体
吧! CuteFTP、FTP Explorer、CAMCAD 2.0.9e 的 About &
WinPack 的 About、WinHacker 95... 最後别忘了试 Clean
Sweep ! 看她的面孔有没有变的很正常....

注: 因为手边没有 GetSystemMetrics 的资料, 系统的东西若
要动, 还是要谨慎一点好, 故我尚在考虑中, 尚未产生固
定的改法, 所以暂时先在 S-ICE 下, 改著玩吧!

若有人有 GetSystemMetrics & CreateDialogIndirectParamA
两常式的呼叫使用法, 请提供一下吧!

====== Error Free 18/20 =======================================================

Re: 丑丑字型 & 中文 Win95.

> 若是要直接修改user32.dll档，应该怎么做呢？
> 因为不太用会SoftICE，所以还希望您能够指导如
> 何修改user32.dll:)谢

你真的要动它? 我还没有想出固定的改法呐! 因为系统的东东
, 不像应用程式一般, 不能开玩笑的, 不先了解原 Routine、
考虑再三, 我是不会去研究永久性改法的. 不然若传开了, 那
天出大槌了, 会害死一票国人 ...

目前我有发现一个程式会出槌, 用 Anawave Gravity 1.1 看
中文信时, 会完蛋. 我这边其它的软体, 看起倒是还算正常.

当这类丑丑的软体, 若 GetSystemMetrics(2Ah) 传回非零值
时, 在中文 95 系统会使用的字型是 "细明体 8" (它若使用
"细明体 9" 不知有好! 可惜呀!...唉...) .

英文软体的基本字型, 好像是使用 "MS Sans Serif 8" 才会
比较正常. 否则用 "细明体 8" 除了字丑以外, 字高太短才是
大事, 否则 SW30pro 的那四个选项, 就不会被那张图给盖住
了.

对了! 谁找的到 Ture Type 的 "MS Sans Serif" 之字形?

不过在应用软体层面上, 你们倒是可以先动. 追法如下:

1.切入 S-ICE, 用「bpx GetSystemMetrics if @(ESP+04)==2A」
来条件设断. 以上是 SICE 3.0x 的设断语法哦! 在 2.0
中, 并不适用.

2.按 F5 返回 Win95, 一执行 ShellWizard 3.0 Pro, 会被
S-ICE 拦下来, 按一下 F12 or F11 . 你就会看你如下的
样子了:

原来:

PUSH 2A ; <- 会出问题的都是 2A .?
CALL USER32!GetSystemMetrics
CMP EAX,EBX ; or TEST EAX,EAX ; <- 会出 "丑" 时, EAX 都是 1.

改成:

PUSH 2A
CALL USER32!GetSystemMetrics
XOR EAX,EAX ; <- 这样子该应用软体就正常了

注: SW30pro 是在 MFC42.DLL , 其它大半的都是在主 .EXE
档中. 修改 MFC42.DLL 应该不致於牵扯太广.

「改之前先备份原来的档案! 切记! 切记! 」

====== Error Free 19/20 =======================================================

More Space 2.7 ! 减肥示范教材!

通常在追一个软体之前, 就是要找一个 "明显变化" and "即时可试"
的事件出来. 要找这个, 就是要多操作你的目标软体. 像是要砍之前的
先玩玩看. 先熟目标软体的操作特性, 是有助於设断的 Sense 的! 对
啦! 再问你们一次! Sense 是不是念做 "先死" ?

不过这一点我很放心, 因为会主动去砍的软体, 想必也对它唾涎有一阵
子罗! 是不是有点像追女孩子一样? 还没有说过一句话, 对方的一切周
遭, 老早就都背得滚瓜烂熟了! 至是否闭著眼睛, 就可以走到她的房间
? 那等以後追上了, 再去求证吧! 太早求证, 会被人家骂 "猪哥" 哦!

经过对目标软体 More Space 2.7 的熟悉, 我知道在 Duplicate Files
的视窗中, 点右上角的磁碟机选择栏时, 会跳出一个小窗子来告诉你要
注册罗! 且履试不爽, 故这个小窗子就是我们的第一据点.

以前我讲过 lockmytask 有没有忘记? ..什么! 忘光啦! .. O.K! 没关
系, 反正它在今天是英雄无用武之地, 发挥不出来. 我们再换一招, 试
试 destroywindow 看看.

1.进入 More Space 2.7 的 Duplicate Files 的地盘.
2.点一下磁碟机选择栏的其中一个方格, 此时会跳出一个小窗子.
3.按 Ctrl-d , 切入 sice .
4.打 bpx destroywindow, 按 F5 返回.
5.当点一下 "OK" 时, 会被 sice 拦下来. 如下:

14F:BFF62391 MOV CL,B4 ; <- 在此拦下
JMP BFF623D7

6.按一下 F12 , 居然就到了目标领空! 如下:

14F:417BB4 RET ; <- 返回至此.

7.再按一下 F12 , 如下:

14F:423C6B CALL [EDX+68]
MOV EDX,[EBP-04] ; <- 返回至此.

有没有注意到上行有个 CALL ? 通常有 CALL 时, 你就要先看看上面有
没有判断式. 有的话, 你先暂停所有的断点, 在那个 CALL 设断. 返回
程式之後, 点一下磁碟机选择栏, 被 sice 拦下来之後, 再用 F10 带
过那个 CALL , 看是不是小窗子的整个领域之 CALL .

如果不是, 则必须暂停所有的断点, 再跳到 "步骤-5" , 再按 "OK" 前
, 再把 DestroyWindow 打开. 按 "OK" 断下来後, 再一直按 F12, 直
到返回此地的上一层 CALL 为止.

8.就这样不断的重来按 F12 的往回跳, 最终你会反返回到..如下:

14F:4C079C CALL 470FF8 ; <- 在此设断试带 F10 看看.
JMP ; <- 返回至此.

9.当然这个 CALL 470FF8 就是小窗子的总领空罗! 往上看有..如下:

14F:4C078E CALL 4B9378 ; <- 想必是核对总部, 进入观查.
TEST AL,AL ; <- 在此设断试之..
JNZ 4C97A3

10.把先前的所有断点再暂停一次. 在 TEST AL,AL 那一行设断, 压
F5 , 回目标程式. 一点磁碟机小格, 又会被 SICE 拦下.

11.把 AL 改成 1, 试之. 试的结果, 不会跑出小窗子了, 最重要最重
要的是, 你点的磁碟机, 居然出现打勾!

12.那我们就进入那个 CALL 看看..如下:

:u 4b9378 l 80
014F:004B9378 PUSH EBX
PUSH ESI
XOR EBX,EBX
: :

13.等一等. 我们进来要干嘛?

因为我们 <步骤-9> 试 AL 时, 知道 AL=0 返回不利! 所以我们要分
析此地的 routine, 在什么情况下 , AL 才不会带 0 返回... 继续
, 如下:

014F:004B937C PUSH 00008000
CALL KERNEL32!SetErrorMode
MOV ESI,EAX
PUSH 004B93EC ; <- 此位址 Dump 出来看

CALL KERNEL32!LoadLibraryA ; <- 载 .DLL 档时, 大多
; 会用到此函式. 看一
; 此软体 Help 的注册
; 章节.
014F:004B9392 MOV [004C2C00],EAX
MOVZX EAX,SI
PUSH EAX
CALL KERNEL32!SetErrorMode
CMP DWORD PTR [004C2C00],20
JL 004B93E4 ; <- 这里有一个判断.

014F:004B93A9 PUSH 004B93F8
MOV EAX,[004C2C00]
PUSH EAX
CALL KERNEL32!GetProcAddress

014F:004B93B9 MOV ESI,EAX
MOV [004C3964],ESI
TEST ESI,ESI
JZ 004B93D9 ; <- 这里也有一个判断..

014F:004B93C5 MOV EAX,000004D2
CALL [004C3964]
CMP EAX,000004D2
JNZ 004B93D9 ; <- 这里又是一个判断.

014F:004B93D7 MOV BL,01 ; <- 01 ? 生命之泉!
4B93D9 MOV EAX,[004C2C00]
PUSH EAX
CALL KERNEL32!FreeLibrary ; 把 .DLL 放掉.

014F:004B93E4 MOV EAX,EBX ; 哦! 原来 EAX 是用 EBX 的
POP ESI
POP EBX
RET

好啦! 就讲到此为止. 要玩, 就自己看著办! 要害的总部, 已经告诉你
们了; 高手不要说答案, 留给 Hacker 新生自行单步执行练习吧! 也让
他们多啃一些组合语言的书! O.K ?...下课....

====== Error Free 20/20 =======================================================

Cwin95 丑字型- 细明 8 之一

今天再来谈谈有点偏离 Hacking (砍事) 的 "字型" 话题...

其实我现在可以决解 CWin95 丑字型的方法, 依这段期间的修改记录
看来, 已经可以达到八、九成的满意度了; 剩下的那一成, 就是找不
到我心中想要的那个字型档.

所以迟迟没有把方法 Post 上来, 因为没有那个我心目中想要的字型
档, 故 Post 上来, 对网友也没什小路用..

我们最常见的问题, 就是英文软体会使用 MS Sans Serif - 8 的字
型, 但这类软体其字型问题大概可分成两种:

1.当 GetSystemMetrics(2Ah) 传回非零值时, 它会以 "细明-8"
来显示. 如: UltraEdit, Win Hacker ..等.

2.应用软体本身不受系统的引响, 依然我行我素, 正常的以 "MS Sans
Serif-8", 来显示. 表面上好像很正常, 但是若那一行带到中文字
时, 中文字照样以 "细明-8" 呈现.

当你把它改成 "MS Sans Serif-9 " 时, 遇到中文字一样是 "细明
-8" , 会照成中文化的困难. 应该是 CWin95 用的 MS Sans Serif
不是 True Type 的吧! 如: Agent ..

以上两种类形的软体, 不管是那一种, 在中文化时, 都会有一个问题
存在, 就是字高的问题, 因为 "MS Sans Serif -8" 居然会比 "细明
-9" 来的高.

若用的字形, 其字高不对时, 会照成某些表格画面的不搭调、出轨画
面、乌云遮半月... 等情况.

如: 「Powertoy 的 tweakui」.
「Paint Shop Pro -> Color -> Edit Palette」
「ShellWizard 3.0 的主画面」

如果可以找的到某个 True Type 的字型档, 若它的 -9 和 "MS Sans
Serif-8 " 一样高、一样宽, 那不就...!! 没错! 的确如此..

这些日子我就是在找那种字型档, 包括也再找建立字型档的软体, 因
为自己建造, 慢慢画慢慢改总可以了吧! 但是理想归理想, 字形建造
器想不到在 PC 界是如此的....唉! 不提也罢..

在 MAC 界, 居然有一大票的全功能免费试用版; 在 PC 界, 一大票
都是字型流漤器, 字形建造器只有小猫两三支, 而且都是几百年前的
老软体, 连 "狂人" 都不屑一顾. 只好拉那超古老的试用版来试之,
但是并不好用.

幸好我在网上有拉到一个 Fmonster35 , 可以改字形档的一些定义,
但是字高还是改不了. 翻遍了我所有的光碟片中的几千个 Font 档,
总算找到了一个. 唯一可惜的它是斜体字. 但它算是合格中的最美了.

这个的 font 名, 我把它改为 TS Sans Serif, 和 MS Sans Serif
差一个字, 在 UltraEdit 中, 改 Appz 时, 会比较方便嘛! 而且
有许多 Appz 只允许你改等长的名字, 多一个少一个字都不行. 所
以我才取名为 TS Sans Serif .

想要转成较好看的 "细明 9" , 总算有了一些生机, 下列三个方法
记起来:

1.搜 08 00 4D 00 53 00 20 00 53 00 .
09 00 54 00 53 00 20 00 53 00 .
^^ ^^
用 Replace ALL .

09 是指 -9, 54 是 T, 把 MS Sans Serif 改成 TS Sans Serif.
要不要改成 TS Sans Serif 因情况而定, 若有 "细明-9" 的英字
有出轨才要改, 如: Easy CD Pro 95 V2.11(20) 按钮上的字.

或, 它本来就是显示正常的 MS Sans Serif-8 了, 只是要中文化
, 光改成 -9 也没有用. 如: Agent .

2.若还有表格不正常, 再搜 4D 00 53 00 20 00 53, 若有搜到时,
你会看到前面有几个零, 如下:

搜 08 00 00 00 00 01 4D 00 53 00 20
改 09 54(T)

如: FsPatch, WinPatch 等. 这改成 TS Sans Serif-9 比较好看.

3.若还有问题, 再搜 08 00 48 00 65 00 6C 00 76 00
Replace All 09 00 48 00 65 00 6C 00 76 00

把 Helv-8 改成 Helv-9 , 如: UltraEdit ..

另外在 win.ini 中, 有如下这个, 你们就自行研究看看吧!

[fonts]
[FontSubstitutes]
Helv=MS Sans Serif
Tms Rmn=MS Serif
Times=Times New Roman
Helvetica=Arial
MS Shell Dlg=MS Sans Serif
Arial Cyr,204=Arial,204
Courier New Cyr,204=Courier New,204
Times New Roman Cyr,204=Times New Roman,204
Arial Greek,161=Arial,161
Courier New Greek,161=Courier New,161
Times New Roman Greek,161=Times New Roman,161
Arial CE,238=Arial,238
Courier New CE,238=Courier New,238
Times New Roman CE,238=Times New Roman,238

最重要最重的 TS Sans Serif 档名是 Tnimbusi.zip , 我把它放
在 ftp.tku.edu.tw 的 upload 目录中, 等一, 两天, 读取权应
该就会开放了.

抓到解开後, 放在临时目录中, 再用滑鼠把它丢到 windows\fonts
中就可以了.

== E-mail: paulgao@nease.net = 完 = 资料整理: 高春辉 于 06/09/97, 08/28/97. ===


YHQ

资料整理: 高春辉, ID: Paul Gao, 沈阳华储 BBS 站. 站台电话: (024)3846411.
===============================================================================
yhq 破解实战录 01 --- Teleport Pro (pro12.exe) 破解法 !!!

1.Username: 填入 YanHuaQi (因为要6个字母以上)
Company: CSMC
注册码: 87654321 (先乱填)

2.Ctrl-D 切入S-ICE...

3.bpx hmemcpy

4.按F5切回Teleport Pro...然後按下OK键...

5.S-ICE拦下後...BD * 把拦中断的功能关掉
按几次F12...跳回Teleport Pro领空...

6.然後一直按F10....直到下面:

7.XXX:0040E3C6 JZ 0040E48B
XXX:0040E3CC LEA EDI,[ESI+000000D5]
XXX:0040E3D2 MOV EAX,[EDI]
XXX:0040E3D4 PUSH EAX
XXX:0040E3D5 CALL 0041BAD0
^^^^^^^^^^^^^
这是算注册码的CALL

XXX:0040E3DA ADD ESP,04
XXX:0040E3DD CMP EAX,EBP
^^^^^^^^^^^
要害 !!! 比较核心...

XXX:0040E3DF JNZ 0040E497
^^^^^^^^^^^^
若EAX和EBP不相同...就跳到0040E497...那就GAME OVER啦...

所以执行到XXX:40E3DD那行时...看一下EAX和EBP...

嘿嘿...

EBP:05397FB1....好眼熟ㄚ...呵呵...就是87654321的16进位值...

EAX:50CCD6BA....当然就是注册码罗...换算成10进位...

答案就是: 1355601594

再次整理一遍:

username: YanHuaQi
company: CSMC
password: 1355601594

===============================================================================
yhq 破解实战录 02 --- OM21_EN.ZIP 破解法 !!!

以下将此软体简称OM...

1.Username: 填入 yhq
注册码: 87654321 (先乱填)

2.Ctrl-D 切入S-ICE...

3.bpx hmemcpy

4.按F5切回OM...然後按下OK键...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回OM领空...

6.然後一直按F10....直到下面:

7.XXX:0040D860 LEA EBX,[EDI+64]
XXX:0040D863 LEA ESI,[EDI+68]
XXX:0040D866 PUSH EBX
XXX:0040D867 MOV ECX,EDI
XXX:0040D869 CALL 0040D480
^^^^^^^^^^^^^
这是算注册码的CALL

XXX:0040D86E CMP EAX,[ESI]
^^^^^^^^^^^^^
要害 !!! 比较核心...

XXX:0040D870 JZ 0040D884
^^^^^^^^^^^
若EAX和[ESI]相同...就跳到0040D884...那就注册成功啦...

所以执行到XXX:0040D86E那行时...看一下EAX和[ESI]...

嘿嘿...

下d esi指令

XXX:0066F1F4 B1 7F 39 05

反过来看: 05397FB1

好眼熟ㄚ...呵呵...就是87654321的16进位值...

而EAX:0032F06....当然就是注册码罗...换算成10进位...

答案就是: 208646

再次整理一遍:

username: yhq
password: 208646

===============================================================================
yhq 破解实战录 03 --- Netterm 4.10 破解法 !!!

1.Username: 填入 yhq
注册码: 87654321 (先乱填)

2.Ctrl-D 切入S-ICE...

3.bpx hmemcpy

4.按F5切回Netterm...然後按下OK键...

5.S-ICE拦下後...BD * 把拦中断的功能关掉
按几次F12...跳回Netterm领空...

6.然後一直按F10....直到下面:

7.XXX:00423E4A LEA EAX,[EBP+FFFFFDBC]
XXX:00423E50 PUSH EAX
XXX:00423E51 MOV EAX,[0044814C]
XXX:00423E56 PUSH EAX
XXX:00423E57 CALL 00441826
^^^^^^^^^^^^^
此CALL会将我们带到ISIVIDEO.DLL...

就是Netterm的运算注册码和比对的核心...

XXX:00423E5C MOV [EBP+FFFFFDB8],EAX
XXX:00423E62 CMP DWORD PTR [EBP+FFFFFDB8],00
XXX:00423E69 JZ 00423EC3
^^^^^^^^^^^
跳到00423EC3...就GAME OVER...

弟破过好几套软体...

都是使用EAX当作一锅旗标值...

也就是最後以EAX的值来决定注册成功或失败...

所以由上段程式可以知道:

当EAX=0时...注册失败...

当EAX=1时...注册成功...(为啥知道是1勒...因为我trace过嘛...)

所以我们就追入XXX:00423E57那个CALL(核心)看看...

8.追入後...一直按F10...直到如下:

(这里已是ISIVIDEO.DLL的领空...而不是NETTERM.EXE的喔)

而且此处亦是比对核心最後的返回地方...

XXX:004748B1 JNZ 004748C6
XXX:004748B7 MOV EAX,00000001
XXX:004748BC JMP 004748CD
XXX:004748C1 JMP 004748CD
XXX:004748C6 XOR EAX,EAX
^^^^^^^^^^^
就是这里将EAX的值改成0...使我们注册失败..

所以执行到这一行时看看EAX为多少...嗯...就是前面说的1嘛...

所以将此行改成 NOP
NOP

或是MOV AL,1

就破解啦...

别忘了先下code on指令...将机械码计起来...

待会要改ISIVIDEO.DLL...

XXX:004748C8 JMP 004748CD
XXX:004748CD POP EDI
XXX:004748CE POP ESI
XXX:004748CF POP EBX
XXX:004748D0 LEAVE
XXX:004748D1 RET 0010

再次整理一遍:

改ISIVIDEO.DLL

FIND: E9 0C 00 00 00 E9 07 00 00 00 33 C0 E9 00 00 00 00 5F 5E 5B
EDIT: -- -- -- -- -- -- -- -- -- -- 90 90 -- -- -- -- -- -- -- --

--:表不用修改之处...

改完後...

username: 随你高兴...想填啥就填啥
password: 随你高兴...想填啥就填啥

===============================================================================
yhq 破解实战录 04 --- Master Converter v1.73 破解法 !!!

这是一套各种单位换算的软体...
以下称此软体为MC...呵呵...别乱想喔...

1.注册码: 1234567890123 (此处先乱填...但必须填满13个字...
为啥我知道13个字...因为我有先填过87654321八个字
去trace...结果程式会先看看注册码是否为13个字...
是的话才会去比较)

2.Ctrl-D 切入S-ICE...

3.下bpx hmemcpy指令...

4.按F5切回MC...然後按下OK键...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回MC领空...

6.然後一直按F10....直到下面:

XXX:00444CBB MOV EAX,[004509C4]
XXX:00444CC0 CALL 004414FC
^^^^^^^^^^^^^
算注册码及比对核心的CALL...

XXX:00444CC5 MOV [004509C0],AL
XXX:00444CCA CMP BYTE PTR [004509C0],00

由AL当旗标值...来决定注册成功与否...

XXX:00444CD1 JZ 00444CF1
^^^^^^^^^^^
XXX:00444CD3 PUSH 40

跳到00444CF1就GAME OVER啦...

追到XXX:00444CD1时...

若将IP值改成00444CD3...即让JZ 00444CF1失效...

会出现注册成功的讯息...

所以推断要害必在XXX:00444CC0那锅CALL...

所以在那行设断...重新注册一次...并追进去...

7.追入後...一直按F10...直到如下:

XXX:00403423 MOV EBX,EAX

XXX:00403425 MOV ESI,EDX
^^^^^^^^^^^
XXX:00403427 MOV EDI,ECX
^^^^^^^^^^^
追到上面那两行先停一下...

看看ESI和EDI各指向哪些资料...

下d esi指令
d edi指令

嘿嘿...真幸运...

可看到ESI指向1234567890123...刚刚输入的注册码...

嘿嘿...爽...事情成功了一半...

接著下bpm XXXX:YYYYYYYY (那锅ESI指向的位址)...

XXX:00403429 MOV EAX,EDI
XXX:0040342B CALL 004033FC

8.接著就看神对我们有没有关爱的眼神啦...

呵呵...果然神爱世人...:P

一直下 G 指令(不要按太快)...直到下面:

XXX:004035ED MOV ECX,[ESI];将真正的注册码由ESI指向处放到ECX
XXX:004035EF MOV EBX,[EDI];将输入的注册码由ESI指向处放到EBX
XXX:004035F1 CMP ECX,EBX ;比对核心...哈哈哈...Bingo !!!
XXX:004035F3 JNZ 0040364D ;不相同则跳跃到0040364D
XXX:004035F5 DEC EDX

执行到XXX:004035F1那行时...

下d esi指令...可看到真正的注册码...123740*707773

下d edi指令...可看到输入的注册码...1234567890123

当然也可将XXX:004035F3 JNZ 0040364D 这锅指令改成NOP...

不过注册码已找出...就不用费事啦...

9.再次整理一遍:

Master Converter v1.73

注册码: 123740*707773

===============================================================================
yhq 破解实战录 05 --- Video Clip MPEG 1.7 破解法 !!!

以下称此软体为VCM...

1.由於此软体没有输入注册码的地方...故猜想可能是key-file的保护...

2.Ctrl-D 切入S-ICE...

3.下bpx getprivateprofileint指令...

4.按F5切回Win95...然後执行VCM...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回VCM领空...

6.然後一直按F10....直到下面:

XXX:2C2C MOV AX,08E5
XXX:2C2F PUSH AX
XXX:2C30 PUSH 0030FFFF
XXX:2C26 CALL 0C57:A8FE
^^^^^^^^^^^^^^
执行到此CALL...就GAME OVER啦...

所以往上看...看哪里可以避开此CALL...

哇勒...好几处勒...而且都一样...

想必是检查好几次...故找最前面的那锅...如下:

7.

XXX:2BEB PUSH EAX
XXX:2BED CALL 0CA7:D618 ;此CALL为比较核心段...
主程式呼叫这锅CALL好几次..
XXX:2BF2 OR AX,AX ;以AX当旗标值...嘿嘿...很眼熟吧...
XXX:2BF4 JNZ 2C3B ;当AX不为0时就跳到2C3B...
就避开2C26那锅CALL啦...

8.所以再2BED那行设断...再重新执行一次...
拦下後...追进去...直到如下:

XXX:D61C MOV BX,[BP+0A]
XXX:D61F LES SI,[BP+06]
XXX:D622 MOV AX,ES:[SI]
XXX:D625 AND AX,BX
XXX:D627 CMP AX,BX ;嘿嘿...比较核心罗...
XXX:D629 JNZ D634 ;比较结果若不同...就跳到D634
XXX:D62B MOV AX,0001 ;我们的目的...使AX不为0 !!!
XXX:D62E POP SI
XXX:D62F LEAVE
XXX:D630 RETF 0006
XXX:D633 NOP
XXX:D634 XOR AX,AX ;嘿嘿...程式要我们死翘翘的地方...
XXX:D636 POP SI
XXX:D637 LEAVE
XXX:D638 RETF 0006

所以勒...就把 XXX:D629 JNZ D634 这行改成两锅 NOP 就破啦...

别忘了先下 code on 的指令将机械码记起来喔...待会要改原程式...

9.再次整理一遍:

Video Clip MPEG 1.7

改 VCLPMPG.EXE

FIND: C4 76 06 26 8B 04 23 C3 3B C3 75 09 B8 01 00 5E C9
EDIT: -- -- -- -- -- -- -- -- -- -- 90 90 -- -- -- -- --

--: 表不用修改之处...

===============================================================================
yhq 破解实战录 06 --- WinTex95 v2.01 破解法 !!!

以下称此软体为WT...

1.输入name: yhq
code: 87654321 (先乱写)

2.Ctrl-D 切入S-ICE...

3.下bpx hmemcpy指令...

4.按F5切回WT...按OK...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回WT领空...

6.然後一直按F10....直到下面:

XXXX:0044D3F4 MOV EAX,[EBP-08]
XXXX:0044D3F7 MOV CX,[0044D628]
XXXX:0044D3FE MOV DL,1
XXXX:0044D400 CALL 00431810 ;执行到此CALL...就GAME OVER啦...
XXXX:0044D405 JMP 0044D4F6

所以往上看...看哪里可以避开此CALL...

如下:

7.

XXXX:0044D33C CALL 0040373C ;要害CALL !!!
XXXX:0044D341 JZ 0044D40A ;跳跃点

8.所以在0044D33C那行设断...再重新执行一次...
拦下後...追进去...直到如下:

XXXX:0040373F MOV ESI,EAX
XXXX:00403741 MOV EDI,EDX
XXXX:00403743 CMP EAX,EDX ;嘿嘿...比较核心罗...
XXXX:00403745 JZ 004037DA ;若相同则跳到004037DA

所以勒...执行到XXXX:00403743 CMP EAX,EDX时...

下 d esi 指令...看到真正的注册码: 4694
d edi 指令...看到输入的注册码: 87654321

9.嗯...注册码算出来啦...重新BD *...按F5...跳回WT重新注册一次...
哈哈哈...成功啦吗???...别高兴的太早...
关掉WT...重新执行WT...哇勒!@#$%...还是有延迟画面...
而且看萤幕最上面还有 UNREGISERED !!!
这个死德国佬...还布有暗桩...!@#$%.....

10.关掉WT...用 S-ICE 的 Loader...载入Wtex95.exe...
先按F8一次...再一直按F10...直到如下...

XXXX:0046BD0D MOV EBX,EAX
XXXX:0046BD0F MOV EAX,EDI
XXXX:0046BD11 CALL 00402C10 ;这锅CALL就是延迟画面啦...

所以往上看...看哪里可以避开此CALL...

如下:

11.

XXXX:0046BCE3 MOV EBX,00000001
XXXX:0046BCE8 MOV EAX,[0046E6B4]
XXXX:0046BCED CMP BYTE PTR [EAX+000001D0],00
嘿嘿...[EAX+000001D0]就是旗标值罗...
XXXX:0046BCF4 JNZ 0046BD16 ;若不相同就跳过延迟画面...

12.所以我们先 BD *
在下 BPM XXXX:YYYYYYYY (就是EAX+000001D0那锅位址)...
看看程式是哪里在改这锅旗标值...
按F5...关掉WT...重新执行WT...
拦下後...多按几次 G...直到如下...

13.

XXXX:0044D77D MOV EBX,EAX
XXXX:0044D77F MOV BYTE PTR [EBX+000001D0],00 ;嘿嘿...抓到罗...
XXXX:0044D786 MOV EAX,EBX ;暗桩一...
XXXX:0044D788 CALL 0044D1A4 ;暗桩二...
XXXX:0044D78D CMP BYTE PTR [EBX+000001D0],00 ;返回前最後比对处...
XXXX:0044D794 JZ 0044D7A0 ;若是0...就跳到失败的地方罗...

先别急著改XXXX:0044D77F MOV BYTE PTR [EBX+000001D0],00...
因为程式後面还有暗桩...还会将[EBX+000001D0]这锅位址填0...
所以到0044D78D CMP BYTE PTR [EBX+000001D0],00这行才改...
下 CODE ON 指令...此指令共 7 BYTES...
所以可以改成MOV BYTE PTR [EBX+000001D0],01...
而0044D794 JZ 0044D7A0...改成两锅 NOP...

哈哈哈...

这一次真的破啦...死德国佬...

14.重新整理一次:

改 Wtex95.exe

FIND: 80 BB D0 01 00 00 00 74 0A
EDIT: C6 83 D0 01 00 00 01 90 90

name: yhq
code: 4694

===============================================================================
yhq 破解实战录 07 --- PrimaSoft AutoFTP v1.0 破解法 !!!

以下称此软体为AF...(不是GF啦...我快想疯罗!!!)

1.输入name: yhq
code: 87654321 (先乱写)

2.Ctrl-D 切入S-ICE...

3.下bpx hmemcpy指令...

4.按F5切回AF...按OK...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回AF领空...

6.然後一直按F10....直到下面:

XXXX:0045F87E MOV EAX,[EBP-08]
XXXX:0045F881 POP EDX
XXXX:0045F882 CALL 0045C6A8 ;要害CALL!!!
XXXX:0045F887 TEST AL,AL ;嘿嘿...眼熟吧!!!
XXXX:0045F889 JZ 0045F8C0 ;跳到0045F8C0就GAME OVER啦!!!
XXXX:0045F88B MOV BYTE PTR [EBX+000001C4],01

你要是跳到0045F8C0...要按F10一阵子才会看到失败窗...
我为啥知道这锅跳跃点是关键...
其实你要是跳到0045F8C0...接下来会有一堆RET(返回)指令...
所以大概猜想离"死期"不远罗...
而且这锅跳跃离XXXX:0045F889的下一锅指令
XXXX:0045F88B MOV BYTE PTR [EBX+000001C4],01有一点距离...
所以大胆判断...这是关键跳跃点...
所以在 XXXX:0045F882 CALL 0045C6A8 设断...重新TRACE一次...

7.进入XXXX:0045F882 CALL 0045C6A8那锅CALL後...一直按F8...
期间你会看到程式运算注册码的过程...
在这因为弟没时间KEY-IN...故略过...
仅列出比对核心要害处...
一直按F8...直到如下:

XXXX:0040396B MOV ESI,EAX
XXXX:0040396D MOV EDI,EDX
XXXX:0040396F CMP EAX,EDX ;命中要害!!!比对核心罗!!!
XXXX:00403971 JZ 00403A06 ;若相同则跳到00403A06

执行到XXXX:0040396F CMP EAX,EDX

下 D EDI 指令: 看到输入的注册码 87654321
下 D ESI 指令: 看到真正的注册码 987654820-968

8.再次整理一遍:

软体名: PrimaSoft AutoFTP v1.0
姓 名: yhq
注册码: 987654820-968

===============================================================================
yhq 破解实战录 08 --- HyperSnap-DX v3.00 破解法 !!!

以下称此软体为HS...

1.执行HS...出现延迟画面...

2.Ctrl-D 切入S-ICE...

3.下bpx lockmytask指令...

4.按F5切回HS...按OK...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回HS领空(HSDX主程式模组)...

6.然後一直按F10....直到下面:

XXXX:0040F6FE PUSH 0046CC44
XXXX:0040F703 PUSH ECX
XXXX:0040F704 PUSH EAX
XXXX:0040F705 CALL [00490D54] ;用F10带过此行...
XXXX:0040F70B TEST EDI,EDI 延迟画面就跑出来啦...
XXXX:0040F70D JZ 0040F745

所以往上看...看哪里可以避开此CALL...

如下:

7.

XXXX:0040F685 CALL 00426C10
XXXX:0040F68A CMP DWORD PTR [0048547C],00 ;比对旗标值
XXXX:0040F691 PUSH EBX
XXXX:0040F692 PUSH ESI
XXXX:0040F693 PUSH EDI
XXXX:0040F694 JNZ 0040F745 ;若[0048547C]之值等於00...
那就死定罗!!!

8.所以在0040F685那行设断...再重新执行一次...
拦下後...追进去...

但是...发觉...好像没有更动[0048547C]的指令出现...
不信邪...
下BPM XXXX:YYYYYYYY (即[0048547C]的位址)...
按下G...结果还是在XXXX:0040F691 PUSH EBX拦下...
表示此行的上一行XXXX:0040F68A CMP DWORD PTR [0048547C],00
有读写此位址...当然嘛...要比较...当然要去读咩...
除此之外就没读写那锅位址的指令...
我偏不信邪...BPM XXXX:YYYYYYYY仍然开著...
重新载入执行...哇勒...还是在老地方拦下...
但是重头载入执行...你会发觉
XXXX:0040F68A CMP DWORD PTR [0048547C],00被栏两次(检查两次)
可见没有其他的指令读写那锅位址...
算了...那就不管啦...

执行到XXXX:0040F694 JNZ 0040F745
下CODE ON...记下机械码...
然後下A...
改成JMP 0040F745
嗯...强迫跳过啦...:p

9.这一套破的蛮丑的...
还有Unregistered version的标记...
不管啦...用UltraEdit改掉就好啦...
刚试了一下(2000年)...功能都没问题...
应该ok啦...收工!!!

10.重新整理一次:

软体名: HyperSnap-DX v3.00

改 HSDX.EXE

FIND: 83 3D 7C 54 48 00 00 75 2A 8D 45 0C 50
EDIT: -- -- -- -- -- -- -- EB -- -- -- -- --

--: 表不用修改之处。

===============================================================================
yhq 破解实战录 09 --- 汉Ｘ通 v3.0 破解法 !!!

以下称此软体为XXX...

1.执行XXX...并且到输入序号的画面...输入87654321(乱填)

此套软体是依据注册码(Registered No,)(每套应该不同)
and一些其他因素(ex:时间)来算出序号(Serial No.)...
因为我第二次trace时...序号又跟上次不同(若我没记错)
所以hacker版上的序号无效...

2.Ctrl-D 切入S-ICE...

3.下bpx hmemcpy指令...

4.按F5切回XXX...按OK...

5.S-ICE拦下後...BD * 把拦中断的功能关掉

按几次F12...跳回XXX领空(XXX主程式模组)...

6.然後一直按F10....直到下面:

XXXX:3A49 PUSH 5EDA
XXXX:3A4C PUSH 00
XXXX:3A4E CALL USER!MESSAGEBOX ;这是WIN95中USER模组的API...
用来显示讯息的...
用F10带过此CALL...
错误讯息就跑出来啦...

所以往上看...看哪里可以避开此CALL...

如下:

7.

XXXX:39E5 REPNZ SCASB
XXXX:39E7 NOT CX
XXXX:39E9 SUB DI,CX
XXXX:39EB REPZ CMPSB ;要害!!!比对核心...
XXXX:39ED JZ 39F4 ;若相同则跳到39F4...即避开"死亡的界线"

所以在XXXX:39EB REPZ CMPSB设断...重新执行XXX...
拦下後...
下 D SI 会看到输入的注册码...87654321
下 D DI 会看到正确的注册码...XXXXXXXXX(每锅人不同)

===============================================================================
yhq 破解实战录 10 --- The Bologna Pony Express v2.25 破解法 !!!

以下称此软体为BPE...

1.先设定好BPE...上线...执行BPE...并且抓图抓至50个...
就会出现限制的视窗啦!!!

然後离线...省钱钱咩...

再试著抓一次(按BPE的Find Now键)...限制视窗就跑出来啦...
先按下ok...关掉限制视窗...

2.Ctrl-D 切入S-ICE...

3.下bpx postmessage指令...
我为啥知道这个限制视窗是用postmessage这个API来执行显示的...
因为我有试嘛...试很多开窗...显示讯息的API...才试出来的...

4.按F5切回BPE...按Find Now键...

5.S-ICE在此拦下:

USER!POSTMESSAGE
XXXX:0001 MOV BX,SP
XXXX:0003 CMP WORD PTR SS:[BX+0C],00

6.然後 BD * 把中断点先暂停...
一直按F12....跳回BPE领空(BPE主程式模组)...
此时...小心慢慢按F12...一直到跳出S-ICE并显示限制视窗为止...
按下OK键...又回到S-ICE...
可看到如下的程式码:

XXXX:0043424D CMP WORD PTR [0044D050],19
XXXX:00434255 JLE 0043426A ;若[0044D050]的资料小於等於19H
则跳到0043426A
XXXX:00434257 CALL 00446A70 ;限制视窗...死翘翘的地方...
XXXX:0043425C MOV WORD PTR [0044D030],FFFF ;S-ICE在此拦下...
XXXX:00434265 JMP 0043482D
XXXX:0043426A MOV EDX,[EBP+FFFFFF3C]

大胆推测一下...在XXXX:00434255 JLE 0043426A设断...
重新TRACE一次...拦下後...R IP...将IP改成0043426A...
嘿嘿...限制视窗不见了...而且程式处於连线状态...
嘿嘿...成功了吗???...还得真正连线试试看...

PS:其实这里的19H(等於10进位的25)...
你要是自己往下追...你就会知道...为啥啦...
25*2=50...自己追追看...:P

7.先用工具(EX:ULTRAEDIT)将XXXX:00434255 JLE 0043426A
的机械码改成JMP 0043426A...
然後连线抓图...嘿嘿...发生啥事...
只抓了一锅图就出现限制视窗...
所以还有暗桩...

先按OK...关掉限制视窗...CTRL-D 切回S-ICE...
一样用BPX POSTMESSAGE...抓图...拦下...
一直F12到BPE的领空...换一直F10...
你会回到XXXX:0043424D CMP WORD PTR [0044D050],19
然後就要抓改[0044D050]的要害罗...
BPM XXXX:YYYYYYYY ([0044D050]的位址)...
然後慢慢下G指令...
直到如下:

XXXX:0044426E MOVSX EAX,WORD PTR [0045D050]
XXXX:00444275 MOV [EBO+FFFFFF08],EAX

这两行使[EBO+FFFFFF08]=[0045D050]

XXXX:0044427B MOV DWORD PTR [EBP-04],0000004D
XXXX:00444282 MOV ECX,[EBP+FFFFFF08]

将[EBP+FFFFFF08]的值搬到ECX...

XXXX:00444288 ADD ECX,01 ;嘿嘿...将ECX加一...
XXXX:0044428B MOV [EBP+FFFFFF08],ECX ;加一後在存回去

所以我们得转移目标啦...
BPM AAAA:BBBBBBBB ([EBP+FFFFFF08]的位址)

8.设断後...开始下G指令...慢慢来喔...
直到如下:

XXXX:00444428 CMP DWORD PTR [EBP+FFFFFF08],31 ;嘿嘿...比对核心罗...
31H=49(10进位)...
XXXX:0044442F JLE 0044444D ;若是[EBP+FFFFFF08]中的资料
比31H小就跳到0044444D...
XXXX:00444431 MOV DWORD PTR [EBP-04],00000053
XXXX:00444438 CALL 00446A70 ;死亡的界线 !!!
XXXX:0044443D MOV DWORD PTR [EBP-04],00000054
XXXX:00444444 NOV WORD PTR [EBP-04],FFFF
XXXX:0044444D MOV DWORD PTR [EBP-04],00000056

所以再将XXXX:0044442F JLE 0044444D改成JMP 0044444D
就收工啦 !!!

9.再次整理一遍:

软体名: The Bologna Pony Express v2.25
修改码: 改 BolognaPonyT.exe
FIND: 7E 13 E8 14 28 01 00
EDIT: EB -- -- -- -- -- --

FIND: 7E 1C C7 45 FC 53 00 00 00
EDIT: EB -- -- -- -- -- -- -- --

--: 表不用修改之处

===============================================================================
yhq 破解实战录 11 --- Internet Utilities 97 v2.0.24 破解法 !!!

以下称此软体为IU97...

1.执行 IU97...
他会劈头就问你是否购买，选 Buy Now，再选 Starfish Operator...
在 Unlocking Code 的地方填入 1234567890 ...
一定要填十个字，理由待会说...

2.Ctrl-D 切入S-ICE...

3.下bpx hmemcpy指令（老步数）...

4.按F5切回IU97...按ok键...

5.S-ICE在此拦下:

KERNEL!HMEMCPY
XXXX:9E30 PUSH BP
XXXX:9E31 MOV BP,SP

在Win95的KERNEL系统模组中的HMEMCPY这个API拦下...

6.然後 BD * 把中断点先暂停...
一直按F12....跳回IU97领空(IU97主程式模组)...
此时返回的是IU97中的SIU模组...
可看到如下的程式码:

XXXX:00402431 CALL [USER32!GETDLGITEMTEXTA];这个USER32!GETDLGITEMTEXTA
系统模组API是用来读取字串的
所以也可用 bpx GETDLGITEMTEXTA
来拦下，不一定要用 bpx hmemcpy
XXXX:00402437 MOV ECX,FFFFFFFF
XXXX:0040243C SUB EAX,EAX
XXXX:0040243E REPNZ SCASB
XXXX:00402440 NOT ECX
XXXX:00402442 DEC ECX
XXXX:00402443 CMP ECX,0A ;这就是我说为何要设十个字注册码
XXXX:00402446 JZ 0040247B ;若是十个字，就跳到0040247B
XXXX:00402448 LEA EAX,[ESP+08] ;若执行到此，就完啦！

7.按F10继续往下追...

XXXX:004024D2 CALL [USER32!MESSAGEBOXA];这个API是用来显示注册码错误的
XXXX:004024D8 MOV EAX,FFFFFFFF
XXXX:004024DD POP EDI

8.所以我们往前找，看看那里可以让我们跳离开这里...

XXXX:00402492 PUSH 004180D0
XXXX:00402497 PUSH 004180E0
XXXX:0040249C CALL 00415250 ;要害CALL！！！
XXXX:004024A1 ADD ESP,08
XXXX:004024A4 TEST EAX,EAX ;嘿嘿，眼熟吧
XXXX:004024A6 JNZ 004024B3 ;若是跳到004024B3就死定啦
XXXX:004024A8 XOR EAX,EAX ;生命之泉，使EAX=0
XXXX:004024AA POP EDI
XXXX:004024AB POP ESI

所以在XXXX:0040249C CALL 00415250设断，重追一次...

9.追入XXXX:0040249C CALL...
一直按F10...直到如下∶

XXXX:00415270 MOV AL,[ESI] ;ESI指向我们输入的注册码
XXXX:00415272 INC ESI
XXXX:00415273 MOV AH,[EDI] ;EDI指向正确的注册码
XXXX:00415275 INC EDI
XXXX:00415276 CMP AH,AL ;要害！！！比对核心！！！
XXXX:00415278 JZ 0041526C ;相同则跳到0041526C

所以执行到∶
XXXX:00415270 MOV AL,[ESI]...下 D ESI...看到我们输入的注册码
1234567890
XXXX:00415273 MOV AH,[EDI]...下 D EDI...看到正确的注册码
PFABLJXIVS

当然也可改程式码，变成随便注册版...

10.整理∶

程式名∶Internet Utilities 97 v2.0.24
取得处∶Hope-Net (37) \Internet\misc\iu97trl.exe
注册码∶PFABLJXIVS
Enjoy it...Crack by yhq 1997.07.09

== E-mail: paulgao@nease.net = 完 = 资料整理: 高春辉 于 06/09/97, 08/28/97. ===


heibow

-----------------HEIBOW01_TXT-----------------

请各位用ARCHIE找 BOOKMM.ZIP
是一个 NETSCAPE 的 BOOKMARK 和IE 的我的最爱转换的程式
不注策只能用十次
解开後 BOOKMM.EXE 217,600 BYTE

这是小弟的一篇拙文...但也花满多心思. ERROR FREE 大哥说过 要破解软体就要
花时间 有耐心 不怕烦 还要会一点组合语言...没学过赶快买本书来学吧!
小弟才学会玩 SOFTICE 一个多月 ,要学的仍然很多

或许有人会问...我POST 此篇目的??

我只是想和大家分享经验... TW.CRACK.CRACK 又关了
ERROR FREE 大哥 大概太忙...好久没看到他的破解文件了

此软体很好破...对高手根本不算什麽...
但对像我这种 HACKER 新生...就要花时间了

我只是抛砖引玉...
希望各位高手破了什麽软体...也POST 出来...造福世人

但现在越来越多的 CRACKER HACKER 站都关了...不知我有无犯法....
没意外...我大概一个礼拜 POST 一篇我的破解心得...但春假 ...考试就不行了
请大家包涵

用ERROR FREE大哥的 " 78787878大法 " 记住喔!
(1) 用 winice 载入 Win95
(2) 执行 BOOKMM.EXE 先选择注册
(3) 先填 NAME : 随意 CODE : 78787878(习惯)
(4) 按 Ctrl_D 进入 winice
(5) 下指令 S 30:0 L FFFFFFFF '78787878'
WINICE 会搜出一个位址 ss:ssssssss

(6) BPM ss:ssssssss <- 设断点的方法 ( 用法: BPM [ADDRESS], 此法很好用 )
(7) 按 F5 把控制权还给 BOOKMM
(8) 在 BOOKMM 下按 OK ! 被 WINICE 拦截, 如下
(9) 用 BD * 暂停以前的断点
(10) 用 BPM ES:EDI-8 设另外一个. ; <- 因为你打 8 个字, 所以减 8
(11) 按 F5 返回 BOOKMM 一下子又被拦了下来
( 以後此点简称" 二拦 " 因为拦两次嘛)
(12) 二拦 後按四次 F12 到了 (F12 是 跳离这个 CALL )
(按五次就跑出失败视窗了 就从四次开始 TRACE )
0137:00401643 CALL .....
0137:00401649 TEST EAX , EAX <-- 从此开始
请在此设断点 知到如何设了吧!
0137:0040164B JNZ 0040167D
^^^^ ^^^^^^^^
∧ ∧
丨 |___ offset 应该和我一样
丨
    SEGMENT
可能和我不一样
(13) 按F10 (单步执行)...一直按 走到了

0137:004016a5 call ...
用 F10 带过此call必完蛋
看有无方法可避开此 call
按 F6 让游标上去 按page up 或上下观察
( 若游标 在上面...按F9 可设断点... 断点 的那行颜色不太一样,看到了吧!
BPM [ADDRESS] 也可设断点 看各位喜欢那一种 )

(14) xxxx:0040167b jmp 004016aa
可跳开 xxxx:004016a5
但刚才没走到 why??
因为 xxxx:00401649 TEST EAX , EAX
xxxx:0040164b jnz 0040167d 那行 有跳跃
(15)
xxxx:0040164b jnz 0040167d
上面两行 xxxx:00401643 call 必有问题
刚刚有设断点吧 !再注册一次 到 此call 按f8进入观察
目标 让eax = 0
(16)

xxxx:bff772ec push ebx <-- 从此开始
按f10 ..... 走到了

xxxx:bff71310 call bff71247

用f10带过此call必完蛋 , 设断,再注册一次,用f8进入

(17)
xxxx:bff71247 push ebx <-- 从此开始
按f10 ..... 走到了
xxxx:bff71277 call bff71215
xxxx:bff7127c leave
xxxx:bff7127d ret <-- 出来了
eax 当然不是 0
(18)
相信大家都知道如何做了吧
xxxx:bff71277 call bff71215 设断,再注册一次,用f8进入

(19)
xxxx:bff71215 push ebp <-- 从此开始
按f10 ..... 走到了

xxxx:bff7121a mov esi,[ebp+8]
xxxx:bff7121d mov edi,[ebp+c]
xxxx:bff71220 xor eax,eax
xxxx:bff71222 mov ah,[esi]
xxxx:bff71224 mov al,[edi]
xxxx:bff71226 cmp ah,alM
xxxx:bff71228 jb bff71235
xxxx:bff7122a ja bff71235
xxxx:bff7122c or ax,ax
xxxx:bff7122f jz bff71241
xxxx:bff71231 inc esi
xxxx:bff71232 inc edi
xxxx:bff71233 jmp bff71222 ( 比较下一个字元)

这就是比较的核心

当程式走到了 xxxx:bff71226 cmp ah,al
下指令 d esi 可查看记忆体 看到刚才输入的字了吧
下指令 d edi 可查看记忆体 看到 五个数字吧
那五个数字就是注册码了
就这样 破解了 ...

-----------------HEIBOW02_TXT-----------------

用ERROR FREE大哥的 " 78787878大法 "

(1) 用 winice 载入 Win95
(2) 执行 WINZIP 先选择注册
(3) 先填 NAME : 随意 CODE : 78787878(习惯)
(4) 按 Ctrl_D 进入 winice
(5) S 30:0 L FFFFFFFF '78787878'

WINICE 会搜出一个位址 ss:ssssssss

(6) BPM ss:ssssssss <- 设断点
(7) 按 F5 把控制权还给 WINZIP
(8) 在 WINZIP 下按 OK ! 被 WINICE 拦截, 如下
(9) 用 BD * 暂停以前的断点
(10) 用 BPM ES:EDI-8 设另外一个. ; <- 因为你打 8 个字, 所以减 8
(11) 按 F5 返回 WINZIP 一下子又被拦了下来
( 以後此点简称二拦 因为拦两次嘛)

二栏後在
XXXX:0040B434 TEST EAX , EAX <- 由此开始
XXXX:0040B436 JZ XXXXXXXX
XXXX:0040B43C CALL XXXXXXXX
XXXX:0040B441 TEST EAX , EAX
XXXX:0040B443 JNZ 0040B48E

按 F10 开始 TRACE 吧

走到了
XXXX:0040B461 CALL XXXXXXXX
按 F10 就出现错误讯息了

往上一看

XXXX:0040B443 JNZ 0040B48E
可跳过
XXXX:0040B461 CALL XXXXXXXX

所以 在
XXXX:0040B43C CALL XXXXXXXX
设断...再注册一次 , 在此被拦截 , 按 F8 进入观察

XXXX:0040AC37 PUSH EBP <- 由此开始
按 F10 开始 TRACE

走到了
XXXX:0040ADA0 LEA EAX , [EBP+FFFFFDF8]
按 一下 F10 ,下 D EAX 的指令
看记忆体会看到一行英文字母和数字
就是注册码了

这软体很好破...不熟SOFTICE的网友可试试!对高手是不成问题的!

我以前说过要每礼拜POST一封破解心得...因最近考试...SORRY
现在比较有空了!
希望各位高手破了什麽软体...也POST出心德...
使的用SOFTICE的初学者 ...例如我...
能够功力一天天进步! 谢谢!

-----------------HEIBOW03_TXT-----------------

本来应该早点post 的
但因敝人最近电脑中毒, 中了3783 的病毒
我恨死这只病毒了...害我 好几天 win95 进不了
format fdisk 再重灌都无效
因为开机片也中毒了
後来总算解毒了
win95 也灌了 20~30次了
敝人到 金帅的网页看
才知 3783 是病毒十大之一...
唉!希望大家都不要中毒!

Midi Master 7.0 是一个播放 midi 的软体..
功能还不错...但有日期限制...

没地方输入注册码!
先把日期调後...如调到2000年...就不让你执行了

请用 archie 找 mm7.zip
把日期调後 ...看有无出现 不让你执行的画面
用soft-ice loader 载入

再 xxxx:00457564 <-- 开始
按一下 F8
到了 xxxx:00457565 MOV EBP , ESP
按 F 10 数下...
到了 xxxx:00428eb2 call [esi+24] 按 f8 进入

到了 xxxx:00424530 invalid 按一下 F8
到了 xxxx:00424531 MOV EBP , ESP
按 F 10 数下...
到了 xxxx:00424615 call xxxx 按 f8 进入

到了 xxxx:00451198 invalid 按一下 F8
到了 xxxx:00451199 push esi
按 F 10 数下...
到了 xxxx:004511ad call xxxxxx 按 f8 进入

到了 xxxx:00453e9c invalid 按一下 F8
到了 xxxx:00453e9d MOV EBP , ESP
按 F 10 数下...

到了 xxxx:00453fa1 call xxxxxx 按一下 F10
又跑出了叫你注册的视窗...
往上一看...
xxxx:00453f88 jae 00453fba
可跳过 xxxx:00453fa1 call xxxxxx
大家该知道如何做了吧!
改机械码 罗! 把 jae 改成 jmp
下code on 的指令 找 midimast.exe (500736 byte)
找 dfe0 9e 7330 c683a003
^^
把73 改eb

如此就没有时间的限制了..
但执行仍有 unregistered 的字样
好像破的不太完全喔 !
但已达到我的目的了 没有时间的限制

若不喜欢 用 ultraedit 找 unregistered 改成喜欢的字吧
但别改太多字喔 ! 记得作备分!

这软体对高手来说...不算什麽...
但对初学者...例如我
就要一点时间了
希望各位高手破了什麽软体...
也能把破解心得 psot 出来
大家一起学习...

各位高手...对我的方法有何意见的...应改进的
也请post 出来...谢谢!

-----------------HEIBOW04_TXT-----------------
请用 ARCHIE 找CAT95.ZIP
CAT95 是一个小猫随着游标跑的小程式
没多大用处 但很可爱 很有趣的
但一执行就 跑出了提醒注册视窗
且只能用30天
我尝试用 78787878 大法TRACE
但发现有个困难...
我何时失败不知道 ...因注册失败没有出现失败视窗
所以有困难... 因为没有一个指标可让我寻的

关於这点...请高手给我点意见...
像这类软体 注册失败没有出现失败视窗...要何时才知注册失败呢??
是不是等到程式不再受SOFTICE 控制时 就是失败的时候??
THANKS!
所以我用另一个方法

1: 用wldr 载入cat95.exe 385024 byte

2: xxxx:0040FA40 invalid <- 由此进入
按一下F8

XXXX:0040FA46 PUSH EBP <- 由此进入
XXXX:0040FA47 MOV EBP , ESP
走到了 XXXX:0040FB8B CALL 004194D6 <- 按F8进入

3: XXXX:004194D6 PUSH EBP <- 由此进入
按F10 .....
到了 XXXX:004194E6 CALL 0042231B <- 按F8进入

4: xxxx:0042231B invalid <- 由此进入
按一下F8
到了 XXXX:0042231C MOV EBP , ESP <- 由此进入
按F10 .....
到了 XXXX:00422353 CALL [EBX+54] <- 按F8进入

5: XXXX:004023A0 MOV EAX , FS:[00000000] <- 由此进入
按F10 .....
不知走到哪里会有喵喵叫...没关系,把喇叭关掉就行了
到了 XXXX:00402847 CALL 00402FE0
跑出了提醒注册视窗
往上一看...

XXXX:0040283E CMP [ECX+000000DC] ,00
XXXX:00402845 JNZ 00402862
可跳过 XXXX:00402847 CALL 00402FE0
所以此跳跃就行了
为和我知道行了呢??

因为我到了 XXXX:0040283E CMP [ECX+000000DC] ,00

这行时 下 E ECX+000000DC 的指令
此时游标跑到上面去了 那个值肯定是00
随便改一下吧...不等於00即可...我是改01

果然注册成功了...因为 提醒注册视窗没出来了

也没有只用30天的限制了.

所以下CODE ON的指令 就可看出机械码了

找 751B E894 070000 85C0
^^
改EB

这样就行了!
这个程式满容易破的...小弟希望各位高手破了什麽软体

也把他 POST 出来 跟大家一起分享
谢谢!
.................................................................

-----------------HEIBOW05_TXT-----------------

clockz v1.1
请用 ARCHIE 找 clockz.zip
这是一个可显示世界各地的时间

(1) 输入名字,注册码...任意填(但这次注册码不要
填78787878了 ,可填中文 但不能太长)
按 ctrl-d 切入 winice
下 bpx hmemcpy
(2) 按F5返回WIN95
按下OK
(3) 被拦截,下 BD* 暂停中断
按F12 数下 到了 XXXX:0040BD6D
(4) 按F10 数下 XXXX:0040BDD7 CALL [00413328]
再按一下F10,就跑出错误视窗
按一下F6,使游标跑到程式区,按PAGE UP
往上一看 XXXX:0040BDC2 JMP 0040BDDD
可跳过 XXXX:0040BDD7 CALL [00413328]
但程式没走到这一行, WHY??
再往上一看,
XXXX:0040BDA2 CMP [EBP-4],1
XXXX:0040BDA6 JNZ 0040BDC7
因此时有跳跃,所以啦!
按上下键调整使游标停在 XXXX:0040BDA2 按F9,就是设断
按F5,离开WINICE,再注册一次
(5) 在XXXX:0040BDA2 被拦,下 E EBP-4 1 的指令
就是改记忆体的值, 按F5
跑出了注册成功的画面了...
嗯 ! 有点爽了!
但依惯例,可能还没注册成功
只知此比较有问题而已
(6) 离开程式,再注册一次
在 XXXX:0040BDA2 被拦
分析以下几行

XXXX:0040BD9A CALL 0040CB2E
XXXX:0040BD9F MOV [EBP-4],EAX
XXXX:0040BDA2 CMP DWORD PTR [EBP-4],1
XXXX:0040BDA6 JNZ 0040BDC7

可知要另 EAX=1 才不会跳跃,
可知XXXX:0040BD9A CALL 0040CB2E 有问题,设断点
(7) 再注册一次,XXXX:0040BD9A CALL 0040CB2E 被拦下
按F8进入观察 , 目标 使 EAX=1
(8) 按F10 开始TRACE,
要按很久喔! 会上下来跑去,
想偷懒可下 G 0040CC37
可直接跳到 XXXX:0040CC37
到了 XXXX:0040CC37 CMP [EBP-4],00
XXXX:0040CC3B JNZ 0040CC8E <- 设断
跳到 0040CC8E 就GAME OVER 了,
WHY? 看看程式就知
(9) 再注册一次,被拦截
若不是在XXXX:0040CC3B,可能是停在以前的断点
按F5, 到了 XXXX:0040CC3B
按一下 A 在按ENTER
A 就是 组译的意思
XXXX:0040CC3B 要确定是在这个位址喔
JNZ 0040CC8E 的长度是六个BYTE,知道如何看吧...

我想让它不跳跃...
所以改成六个 NOP
XXXX:0040CC3B NOP (按ENTER)
XXXX:0040CC3C NOP (按ENTER)
XXXX:0040CC3D NOP (按ENTER)
XXXX:0040CC3E NOP (按ENTER)
XXXX:0040CC3F NOP (按ENTER)
XXXX:0040CC40 NOP (按ENTER)
XXXX:0040CC41 不下任何指令,直接按ENTER
按F5,可执行了
画面左下角有个地球...按一下,选ABOUT
看到自已的名字了吧 注册码也看到了吧
如果刚才填78787878就...

由此可知刚才改城市是对的,可注册又不会影响程式执行

所以离开,重新注册,到了
0040CC3B 的地方, 下CODE ON 的指令
观察机械码...
所以用 ULTRAEDIT 编辑CLOCKZ.EXE 177152 BYTE
把 837DFC00 0F854D000000
改 -------- 909090909090
------- 是不变的意思
就 OK啦!

这个软体也满好破解的 还在敝人的能力范围
希望大家破解了什麽软体...
能post出来和大家一起分享...
大家彼此交流...
thanks

我是习惯改机械码...因我比较懒嘛...
我很欣赏能把注册码算出来的人...

-----------------HEIBOW06_TXT-----------------
嗨! yhq
最近我又写一篇了...如下
----------------------------------------------------------------

CD WIZZARD 4.21
(1) 请用 ARCHIE找 CDW421.ZIP 解开後 CDW.EXE 432128 BYTE

FIRST INITIAL LAST NAME PASSWORD 先任意填
如 交大 资科 骇客版 12345

按 CTRL-D 切入 WINICE ,下 BPX HMEMCPY
按F5返回WIN95 , 按下 Register
(2) 被拦後,按数下F12到了
xxxx:004140C6 LEA EAX,[EBP+FFFFFF78]
开始TRACE....按数下F10到了
xxxx:004143F2 CALL XXXXXXXX 出现了注册失败视窗
往上找看有无可跳离此 CALL 的跳跃
在 xxxx:0041431A CALL 004150CB
xxxx:0041431F ADD ESP,0C
xxxx:00414322 TEST EAX EAX
xxxx:00414324 JZ 00414342
因为这个判断有跳跃
奇怪,这中间有很多判断,为何我知到这个!
因为我试过很多个,所以我知到
ERROR FREE 大哥(或许可叫他叔叔了,他32岁了!

嗯 ! 好像还是大哥好听一点... ^_^)
说过 , 当HACKER要多试!
计得上次 TIPPY 叫我们试码...那时我大概试了几十次
这次没那麽多判断好试...网友可试试!
(3) xxxx:00414322 TEST EAX EAX
在此下 R EAX 1
即可注册成功了!
所以 xxxx:0041431A CALL 004150CB 设断点
按F8进入观察
(4) xxxx:004160CB CMP [ESP+8] , 8 <-- 由此进入
开始TRACE....按数下F10到了
xxxx:004150F2 CMP [ESP+C] , AX
xxxx:004150F7 SETZ CL
下 D ESP+C 的指令 在记忆体那栏可看到 39 30
倒过来是 30 39 用工程计算机把3039的16进制
转为10进制得 12345
正好是刚才输入的 PASSWORD
此时AX=263 用工程计算机把263的16进制
转为10进制得 611
就是注册码了!

所以
FIRST INITIAL LAST NAME PASSWORD
交大 资科 骇客版 611
----------------------------------------------------------------

唉!
最近好忙...常常熬夜!
我看这学期结束
寿命大概减少五年了...
加油吧!
对了,
请问你是用 softice for win95 v2.0 还是 v3.01啊
我trace某些软体常当机
有些就不会,真讨厌啊!
--

[36m 空中云雀 [0;37;40m 是重金属狂热份子

-----------------HEIBOW07_TXT-----------------
发信人: heibow.bbs@bbs.cis.nctu.edu.tw (空中云雀), 信区: hacker
标 题: 破ＣｌｉｐＭａｔｅ　４。２６
发信站: 交大资科_BBS (Mon Jun 23 17:33:47 1997)
转信站: csmcbbs!news.cis.nctu!cis_nctu
Origin: 140.129.42.108

Clip mate 4.26
请用 ARCHIE 找 CM32_426.ZIP
解开安装完之後 clipmt42.exe 693760 byte

1: 先任意填名字,注册码
如TRACY 12345678
2: 按ctrl-d 切入winice 下bpx hmemcpy
按F5返回win95
3: 按下OK ,被winice拦下,下bc* ,清除断点,按数下F12
直到了clipmate的领空,也就是看到下面那条
绿线写着clipmt42
也就是 xxxx:0042cc81 pop ESI
再按六下F12 就跑出了注册失败视窗了
4: 再下bpx hmemcpy , 再注册一次, (记得拦下之後,下bc *)
到了 xxxx:0042cc81 pop ESI
刚才按六下F12 就跑出了注册失败视窗了,
这次按五下F12 就行了.
到了 xxxx:0044b9e1 mov eax , [ebp-0110]
xxxx:0044b9e7 call 0040382c
5: 开始trace 吧 ！ 按F10数下 到了
xxxx:0044bb17 call 00406bcc
xxxx:0044bb1c cmp eax, 0b
xxxx:0044bb1f jnz 0044bc8e
xxxx:0041bb25 lea eax,[ebp-0c]
eax 和b比 ? b是16进位 转成十进位就是11
此时eax＝8 就是刚才输入的注册码的字数
不然可在此设断点,再注册一次,
当然注册码要多或少几个字来比较
可知注册码要11个字
6: 走完这四行,下 D EAX 就可看到一个英文字母
和一串数字 例如我是看到 F0110802924
算算看共有11个字,正好和注册码的字数相同
先把它抄下来 ,按F5离开winice
填入刚才的抄到的注册码...
好！注册成功了!

7: 整理一下 name: TRACY
register key: F0110802924
这软体很好破, 注册码直接写在记忆体上.
满适合刚学softice的人
例如我...
希望各位高 手破了什麽软体,也能将心得post出来
大家一起研究....谢谢！

後记: 期末考考完了 ,又可开始来玩破解了
不过,我升上去就大四了
暑假要补习...希望研究所能让我黑到一间
至少要上本校的研究所（在台北市的）

--

[36m 空中云雀 [0;37;40m 是重金属狂热份子
--
* Origin: ★ 交通大学资讯科学系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

-----------------HEIBOW08_TXT-----------------
发信人: heibow.bbs@bbs.cis.nctu.edu.tw (空中云雀), 信区: hacker
标 题: 破Ｓｃｒｅｅｎｓ　９５　Ｖ２。０
发信站: 交大资科_BBS (Thu Jun 26 16:17:52 1997)
转信站: csmcbbs!news.cis.nctu!cis_nctu
Origin: 140.129.42.94

请用archie找screens95
安装好之後screens.exe 121344 byte
注意,和screen95不一样喔
这是一个虚拟桌面的软体
类似xwindows的虚拟桌面
此软体的保护和stiletto很像
也就是注册码输入正确才能按下OK的软体
好！开始吧做 hacker 爱做的事吧！

1: name 先任意填
2: 按ctrl-d 切入winice 下bpx hmemcpy
按F5返回win95
3: 注册码先任意填一个字, 立刻被winice拦下
4: 按数下F12, 注意 winice画面下方那一条
绿线跟screens95有关吗?是不是系统档案?

5: 果然到了 xxxx:10001be2 push esi
winice画面下方那一条绿线写着
sutils....... 应该不是系统档案
设断点,按数下F12,到了
xxxx:10001bf8 mov ecx , [10006c88]
设断点,再按数下F12就又回到win95了

6: 按ctrl-d 切入winice ,下bc 0
就是清除hmemcpy的断点
按F5返回win95
注册码再填一个字,立刻被winice拦下

7: 按F10数下,到了
xxxx:10001C14 CALL 10001EB3

走完了这行 eax=0 试探性的下 r eax 1
按F5 返回win95
竟然发现 OK 的按钮 可按了
所以在 xxxx:10001C14 CALL 10001EB3
设断点,在注册一次,被拦截,按F8进入观察

8: 进去之後...按F10数下,到了
xxxx:10001ec0 call [100082b8]
xxxx:10001ec6 cmp eax , 11
xxxx:10001ec9 jnz 100020d3

这是检查注册码的字数
11是十六进制 换算成十进制是17
也就是说code要17个字
先下r eax 11吧
跳到100020d3 就 game over了
到了这边不妨重新注册一次
先下 bd *
注册时随意填吧
如我是 name : TRACY
注册码 ： 111-1111-1111111
注册码 先填16个字
按ctrl-d 切入winice ,下be* 使所有的段点enable
不过刚才 bpx hmemcpy 以清掉了 就没了
刚才 xxxx:10001C14 CALL 10001EB3
设断点,被拦截,按F8进入观察

9: 到了
xxxx:10001ecf cmp [esi+3] , 2d
xxxx:10001ed3 jnz 100020d3
xxxx:10001ed9 cmp [esi+8] , 2d
xxxx:10001edd jnz 100020d3
下d esi+3 看看是什麽吧！
这是检查注册码 的第四个字和第九个字是不是 " - "
下 e esi+3 2d
e esi+8 2d 吧
10:
所以这注册码可分成三个区段
此程式一段一段的检查
走到了这边
从 xxxx:10001f4x(那个x是我忘了记录 大概就在那附近）
到 xxxx:10001fa0 是产生注册码第一段的字

可下d 0066ed78 察看那附近的记忆体的变化
就可知道会由name产生什麽字了
以我而言, 会产生 UKE

在此我先不讲, 因我下一篇要讲简单注册机的作法
xxxx:10001fd1 call [100082b4]
xxxx:10001fd7 test eax , eax
xxxx:10001fd9 jnz 100020d3
这是检查 注册码第一段的字是否和刚才产生的是否一样
不一样就game over了

11:
到了 xxxx:100020ba cmp si,[ebp+10]
xxxx:100020be jne 100020d3
此时esi=11111111
正好是注册码最後一段
下d ebp+10 看到记忆体写着 ce6c
和si比较 那也就是说si=6cce
就行了
所以 name: TRACY
注册码是 UKE-1111-11116CCE
各位可能觉得奇怪
UKE-1111-11116CCE
^^^^ ^^^^
这八个数目字难道不检查吗?
有啊,会检查是不是数字还是英文
只要是数字都可以
如
而6CCE是固定不变的
只有前三个字会变, 依照输入的名字不同

还有 name 一定要输入英文,数字好像不行
至少要五个字 不能有空白

--

[36m 空中云雀 [0;37;40m 是重金属狂热份子
--
* Origin: ★ 交通大学资讯科学系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

-----------------HEIBOW09_TXT-----------------
发信人: heibow.bbs@bbs.cis.nctu.edu.tw (空中云雀), 信区: hacker
标 题: 破Ｓｃｒｅｅｎｓ　９５　Ｖ２。０ 之二
发信站: 交大资科_BBS (Thu Jun 26 16:45:14 1997)
转信站: csmcbbs!news.cis.nctu!cis_nctu
Origin: 140.129.42.94

有一件事想请教高手
请问这用C/C++如何写呢?
这是用组语比较好写啦
那请问用C/C++呢?
如shl , shr ,rol, ror,EAX,EDI,
那些指令要如何用C/C++写呢
我以前基础不好
C/C++ 组语 都只懂得皮毛而已
或有没有这类的书可叁考呢
访间一般的书好像都没有耶
请指导一下小弟吧
谢谢!
再来我要讲的是screens 95 v2.0 的注册机制作
这是承袭上一篇的文章
已知道注册码有三段,只有第一段是依照name产生的
以下就是如何产生第一段的那三个英文字

例如说我 name 输入 TRACY
name一定要输入中文,中间不能有空白,或数字

MOV EAX,[ebp-24H] ; 把T给eax, eax=00000054
cs:10001f4b MOV ECX,[ebp-20H] ; 把R给ecx, ecx=00000052
SHL ECX,4 ; ecx=00000520
SHL EAX,10 ; eax=00540000
OR ECX,[ebp-1C] ; ecx OR " A "
; 520 OR 41 = ecx=00000561
SHL ECX,4 ; ecx=00005610
OR ECX,[ebp-18] ; ecx OR " C "
; 5610 OR 43 =ECX=00005653
SHL ECX,4 ; ECX = 00056530
OR ECX,EAX ; ECX = 00556530
OR ECX,[ebp-14] ; ECX OR " Y "
; ECX =00556579
MOV EAX,ECX ; EAX=ECX=00556579
SHR EAX ,10 ; EAX=00000055
; 第一个字出来了 是 U
MOV [ebp-24],EAX ; 使 T 变 U
XOR EAX,EAX ; eax=0
MOV AL,CH ; EAX=00000065
AND ECX,0000000FF ; ECX=00000079
MOV [ebp-20],EAX
MOV [ebp-1C],ECX
cs:10011f80 LEA ECX,[ebp-24]
cs:10011f83 LEA EAX,[ebp-18]
CMP ECX,EAX
JAE 10001fa0
CMP DWORD PTR [ECX],5AH
JLE 10001f9b
cs:10001f8f MOV EAX,[ECX]
SUB EAX,1A
MOV [ECX],EAX
CMP EAX,5A ; 5AH 是" Z " ,比Z大就减1AH
JG 10001F8F
cs:10001f9b ADD ECX,4
cs:10001f9e JMP 10001F83
cs:10001fa0 push 4

此时[ebp-24],[ebp-20],[ebp-1C]
就是放注册码的前三个字了

以下就是我写的注册码仅供叁考

是因为算法还不会很复杂,我才有办法写
有些软体很复杂
我就写不出来了

所以可如下组译
以下只是范例,不一定要如此写
=
=========================================================
==========================================================

..386
STACK SEGMENT STACK
DW 1024 DUP(?)
STACK ENDS
DATA SEGMENT
NEWLINE DB 0DH,0AH,'$'
MSG1 DB '这是Screens 95 v2.0注册机,',0dh,0ah
MSG4 DB 'This program can show Chinese. Do you see Chinese ?',0dh,0ah
msg2 db '请输入您的英文名字,至少要五个字,不能有空白',0dh,0ah,'$'

NAME1 DB 'TabcRdefA C Y FECDBA9876543210$'
MSG3 DB '注册码是 '
CODE1 DB '111-1234-56786CCE$'
DATA ENDS
CODE SEGMENT USE16
PROG PROC FAR
ASSUME CS:CODE , DS:DATA , SS:STACK
PUSH DS
MOV AX,0
PUSH AX
MOV AX , DATA
MOV DS , AX
MOV ES , AX
LEA DX,MSG1
MOV AH,9
int 21h
CLD
LEA ESI,NAME1
MOV CX,25H
INITIAL:
MOV BYTE PTR [ESI],0
INC ESI
LOOP INITIAL
MOV AH,1
LEA EDI,NAME1
MOV BL,0
READ:
INT 21H
CMP AL,0DH
JE READ_OVER
CMP AL,60H
JB NOUPCASE
SUB AL,20H
NOUPCASE:
CMP BL,5
JA READ
STOSB
INC BL
ADD EDI,3
JMP READ
READ_OVER:
CLD
LEA EDI,CODE1
LEA DX,NEWLINE
MOV AH,9
INT 21H
LEA ESI,NAME1+24H
MOV EAX,[ESI-24H]
MOV ECX,[ESI-20H]
SHL ECX,4
SHL EAX,10H
OR ECX,[ESI-1CH]
SHL ECX,4
OR ECX,[ESI-18H]
SHL ECX,4
OR ECX,EAX
OR ECX,[ESI-14H]
MOV EAX,ECX
SHR EAX ,10H ; FIRST----------------------
MOV [ESI-24H],EAX
XOR EAX,EAX
MOV AL,CH
AND ECX,0000000FFH
MOV [ESI-20H],EAX
MOV [ESI-1CH],ECX
LEA ECX,[ESI-24H]
ANOTHER1:
LEA EAX,[ESI-18H]
CMP ECX,EAX
JAE FINISH
CMP DWORD PTR [ECX],5AH
JLE ANOTHER
CHANGE:
MOV EAX,[ECX]
SUB EAX,1AH
MOV [ECX],EAX
CMP EAX,5AH
JG CHANGE
ANOTHER:
ADD ECX,4
JMP ANOTHER1
FINISH:
LEA EAX,[ESI-10H]
CLD
LEA SI,NAME1
LEA DI,CODE1
MOV CL,3
LOAD1:
LODSB
STOSB
ADD SI,3
LOOP LOAD1
MOV AH,9
LEA EDX,MSG3
INT 21H

OVER:
RET

PROG ENDP
CODE ENDS
END PROG

==========================================================
==========================================================

--
* Origin: ★ 交通大学资讯科学系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

-----------------HEIBOW010_TXT-----------------

From - Thu Jul 10 16:14:07 1997
X-POP3-Rcpt: s42049@mercury
Received: from bbs.csmc.edu.tw (bbs@bbs.csmc.edu.tw [140.128.136.11]) by mercury.csmc.edu.tw (8.6.12/8.6.12) with ESMTP id GAA11530 for <s42049@mercury.csmc.edu.tw>; Wed, 9 Jul 1997 06:54:34 +0800
From: yhq.bbs@bbs.csmc.edu.tw
Received: (from bbs@localhost) by bbs.csmc.edu.tw (8.7.5/8.6.9) id HAA21542 for s42049@mercury.csmc.edu.tw; Wed, 9 Jul 1997 07:23:01 +0800
Date: Wed, 9 Jul 1997 07:23:01 +0800
Message-Id: <199707082323.HAA21542@bbs.csmc.edu.tw>
X-Authentication-Warning: bbs.csmc.edu.tw: bbs set sender to yhq.bbs@bbs.csmc.edu.tw using -f
Reply-To: yhq.bbs@bbs.csmc.edu.tw
To: s42049@mercury.csmc.edu.tw
Subject: 破 UnMozify(转寄)
X-Forwarded-By: yhq (网中魔)
X-Disclaimer: 中山医学院BBS -- 絮情小站 对本信内容恕不负责。
Precedence: junk
X-Mozilla-Status: 2001

发信人: heibow.bbs@bbs.cis.nctu.edu.tw (空中云雀), 信区: hacker
标 题: 破 UnMozify
发信站: 交大资科_BBS (Tue Jul 8 23:21:20 1997)
转信站: csmcbbs!news.cis.nctu!cis_nctu
Origin: 140.129.42.94

破解UnMozify
这是可用来离线浏览一些站台
实际功能我也不是很清楚
请用archie找 unmoz_ns.exe

(1)先执行它->file->UnLock UnMozify
然後随意填入注册码
下ctrl-d 进入winice 然後下指令 bpx hmemcpy
(2)按F5返回win95再按下ok
然後会被winice拦截,再按数下F12
到了cs:004515c1 mov edx,[ebp-0104]
cs:004515c7 lea eax,[ebp-0100]
(3)按数下F10到了cs:00451513 call 00433c10
按F8进入此副程式
(4)再按数下F10到了cs:00433c2f call [ecx+8]
按 F8进入此副程式
(5))再按数下F10到了cs:0043415b call xxxxxx
cs:00434160 cmp [esi+10c],0
cs:00434167 jz 0043416b
此时下d esi+10c 会看到记忆体显示零,所以此时会跳跃
会跳跃表示注册失败了,所以下 code on
然後改机械码,把 cmp [esi+10c],0
改成 inc byte ptr[esi+10c]

但少一buye ,改成nop即可
所以找UnMozify.exe
找 80be0c01000000
改 fe860c01000090
这样就行了
但选about
只看到 register to
空白的...
管他的...能用就好了

--

[36m 空中云雀 [0;37;40m 是重金属狂热份子
--
* Origin: ★ 交通大学资讯科学系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>


Import List for ASProtect

I. ?/font> 镳钽疣祆?/font>

  蒡?/font> 镳钽疣祆?/font> 稃蜞弪? (桧钽溧 ?/font> 镱塍鬣弪?) 忸耨蜞磬怆桠囹?/font>
  镱腠 耧桉铌 桁镱痱?/font> 桉镱腠�屐 羿殡钼 钺疣犷蜞眄
  ASProtect by 离尻皴?/font> 杨腩漕忭桕钼 (?/font>.?/font>.).

  ?/font> 磬耱??/font> 祛戾眚 镳邃耱噔?弪 耦犷?/font> 麇痦钼桕 镥疴铋 鬣耱?/font> 篁桦栩?/font> 镱
  噔蝾爨蜩麇耜铎?/font> 忸耨蜞眍怆屙棹 怦彘 皴牿梃.

  ?/font> 镱耠邃龛?/font> 忮瘃??/font> ASProtect 桁镱痱 耱嚯 麴钼囹� - ?/font> 痼赅扈 邈?/font>
  忸耨蜞磬怆桠囹?/font> 篁铎栩咫?/font> 潆� 镱祛 镳?/font> 忸耨蜞眍怆屙梃 IT ?/font>
  镳邃磬珥圜屙?/font> ?/font> 镳钽疣祆?/font>.

II. 锐镱朦珙忄龛?/font>:

  1) 青矬耜噱?/font> 玎眄簋 镳钽疣祆?/font>
  2) 青矬耜噱?/font> Imp_List
  3) ?/font> 耧桉赍 镳铞羼耦?/font> 磬躅滂?/font> 玎眄簋 镳钽疣祆?/font>
  4) 旗屐 觏铒牦 'Save address list'
  5) ?/font> 耠篦噱 篑镥铋 钺疣犷蜿?/font> 耦玟帼蝰� 羿殡?/font> 'Address.Txt', 'Import1.Bin',
     'Import2.Bin' (桧钽溧 忪羼蝾 溻篚 bin-羿殡钼 耦玟噱蝰� 钿桧).

Note:
  1) 篷腓 忮瘃? ASProtect 恹狃囗?/font> 礤镳噔桦?/font> 桁屙?/font> 礤觐蝾瘥?/font> 趔黻鲨?/font> 狍潴?/font>
     镳邃耱噔脲睇 ?/font> 忤溴 耠篦嚅眍泐 磬犷疣 耔焘铍钼.

III. 绣珞朦蜞螓 疣犷螓:

  1) 脏殡 'Address.Txt' - 蝈犟蝾恹?/font> 羿殡, 觐蝾瘥?/font> 耦狁蜮屙眍 ?/font> 耦溴疰栩 耧桉铌 桁镱痱?/font>.
     橡桁屦 恹忸溧:
       00C01D74[2]=(00000118)KERNEL32.DLL!DeleteCriticalSection:00D6
       -- 1-----2------3-------4---------------------------------5--

       1 - 渔?/font> 磬耱痤屙睇?/font> 噤疱?/font> 趔黻鲨?/font>, 桤 Import Table (IT)
       2 - 诣?/font>
       3 - 鸯妁屙桢 噤疱襦 ?/font> 皴牿梃 桁镱痱?/font> (耢 羿殡 ImportN.Bin)
       4 - 填潴朦 ?/font> 桁� 趔黻鲨?/font>
       5 - 祛驽?/font> 铗耋蝰蜮钼囹?/font> - Ordinal 趔黻鲨?/font>.
  2) 脏殡?/font> Import1.Bin ?/font> Import2.Bin - 恹徼疣屐 犷朦?/font> 镱 疣珈屦?/font> - ?/font> ?/font> 狍溴?/font> 羿殡
     ?/font> 皴牿桢?/font> Import-?/font>. 皖 铐 镱赅 麒耱 - ?/font>.?/font>. 牮铎?/font> 噤疱耦?/font> 趔黻鲨?/font>, 觐蝾瘥?/font>
     疣聒梏痤忄睇 ?/font> 羿殡?/font> 'Address.Txt' 龛麇泐 礤 耦溴疰栩.
  3) ?/font> 镳邃镱豚汔?/font>, 黩?/font> 桁? 恹镳桠邃屙眢?/font> 桧纛痨圉棹 祛骓?/font> 稃蜞螯? 噔蝾爨蜩麇耜?/font>
     忸耨蜞磬怆桠囹?/font> 怦?/font> 皴牿棹 Import-?/font>. ?/font> 钽?/font> 镱赅 礤 皲咫嚯 - 躅? ?/font> 犭桄嚅?/font>
     狍潴?/font> 耦徼疣?/font> 镱镳钺钼囹?/font>.

-------------------------------------------------------------------------------------------
霹?/font> 礤耜铍?/font> 耠钼 ?/font> 蝾?/font>, 黩?/font> 礤 疣犷蜞弪:
1) 项赅 礤 觐痧尻蝽?/font> 钺疣徉螓忄? 羿殡?/font> ?/font> 觐蝾瘥?/font> 铗耋蝰蜮箦?/font> 皴牿? '.idata'.
2) ?/font> ?/font>.?/font>.
-------------------------------------------------------------------------------------------
项耠邃龛?/font> 桤戾礤龛�:
1) 绣?/font> 镳桉忸栩?/font> 铎?/font> 麇痦钼桕?/font> 忮瘃棹 - 躅? 猁 潆� 蝾泐, 黩?/font> 猁 忮耱?/font> 篦弪 桤戾礤龛?/font>.
2) 洛瘃? 01.01 - 忸珈铈眍耱?/font> 痼黜钽?/font> 恹犷疣 忮瘃梃 ASProtect
3) 洛瘃? 01.02 - 玎戾龛?/font> 忸珈铈眍耱?/font> 恹犷疣 忮瘃梃 ASProtect-?/font> 磬 噔蝾溴蝈牝.
4) 洛瘃? 01.03 - ?/font> 羿殡 Import0.Bin - 恹镨覃忄弪? 镳邃镱豚汔屐? 皴牿? 桁镱痱?/font>, 疣犷蜞弪
                  溧脲觐 礤 磬 怦艴 羿殡?/font> - � 猁 耜噻嚯 蝾朦觐 磬 礤觐蝠, ?/font> 蝾?/font> 麒耠?/font> ?/font> 磬
                  ASProtect.Exe. 念 忸耨蜞眍怆屙? 镱腠铞屙眍泐 羿殡?/font> 妁?/font> 磬漕 桤?漤?/font> 镱忸玷螯?
                  ?/font> 皴牿?扈 - 眍 怦� 桧纛痨圉? 潆� 钽?/font> 羼螯.
5) 洛瘃? 01.04 - 桤戾龛豚顸 纛痨?/font> 腓耱桧汔:

     00BD0410->BFF7FFF0[2]=(00000118)KERNEL32.DLL!VirtualAlloc:0319
       -- 1------2------3-------4-----------5-------------------6

       1 - 袜耱痤屙睇?/font> ASProtect 噤疱?/font> 趔黻鲨?/font>, 桤 Import Table (IT) - ?/font> 祛驽?/font> 猁螯 噤疱?/font>
           镥疱躅漤桕?/font> 桦?/font> 疱嚯 噤疱?/font> 趔黻鲨?/font>
       2 - 绣嚯 噤疱?/font>, 羼腓 镥疱躅漤桕?/font> 礤?/font>, 蝾 耦怙噤噱?/font> ?/font> 1.
       3 - 诣?/font>
       4 - 鸯妁屙桢 噤疱襦 ?/font> 皴牿梃 桁镱痱?/font> (耢 羿殡?/font> ImportN.Bin)
       5 - 填潴朦 ?/font> 桁� 趔黻鲨?/font>
       6 - 祛驽?/font> 铗耋蝰蜮钼囹?/font> - Ordinal 趔黻鲨?/font>.

  如戾龛腓顸 ?/font> 羿殡?/font> 溧眄:
   Import0.Bin - 忸耱囗钼脲眄? 皴牿? 桁镱痱?/font> (?/font> 桁屙囔?/font>)
   Import1.Bin - 皴牿? 桁镱痱?/font> ?/font> 磬耱痤屙睇扈 噤疱襦扈 (徨?/font> 桁屙) - 妣 祛骓?/font> 耩噻?/font>
                 玎戾?螯 桁镱痱 ?/font> dump-?/font> - ?/font> 镱塍鬣弪? 欣廖兹?/font> EXE 羿殡, 觐蝾瘥?/font>
                 溧驽 桧钽溧 玎矬耜噱蝰� - ?/font> 玎忤耔?/font> 铗 桉镱朦珞屐 徼犭桀蝈?/font>
   Import2.Bin - Import c 磬耱痤屙睇扈 ASProtect 噤疱襦扈 (?/font> 噤疱襦扈 镥疱躅漤桕钼) -
                 ?/font> 磬耱??/font> 祛戾眚 龛赅觐?/font> 镱蝠遽眍耱?/font> ?/font> 礤?/font> 礤?/font>.

6) 洛瘃? 01.05 - 漕徉怆屙?/font> 镱滗屦骊?/font> 忮瘃梃 ASProtect 1.0 铗 13.06.2000 (镳邃簌?
                  忮瘃? 桁咫?/font> 蜞觐?/font> 驽 眍戾?/font>, 眍 猁豚 恹矬磬 31.05.2000), ?/font> 赅?/font>
                  耠邃耱忤?/font> 筢疣眍 钽疣龛麇龛?/font> 磬 镳桉篁耱忤?/font> 皴牿梃 '.idata'.

Boris

delf_ltd@mail.ru

8/07/2000