老文章档案 · 2003 年

短信群发专家3.0 商务版分析

破解教程 · 算法分析 · 2003-10-17 · 作者:辉仔Yock 人气: · 出处:赢政天下整理收藏)

这个软件很有意思,它的壳被动了手脚,用脱壳机不能自动脱壳,脱壳就死机!

但我觉得作者好蠢,这样会更加激起破解者的斗志的!(猪一头...)

【软件限制】:5天 功能限制

【作者声明】:本人发表这篇文章只是为了学习!!!请不用于商业用途或是将本文方法制作的注册机任意传播,读者看了文章后所做的事情与我无关,我也不会负责,请读者看了文章后三思而后行!最后希望大家在经济基础好的时候,支持共享软件!

【破解工具】:TRW2K

—————————————————————————————————

【过 程】:

这个软件是ASPack 2.12 的壳,由于动了手脚,自动脱壳不成功(一脱就当机,搞得我重起了N次)!

那么就不脱壳动态跟踪吧!(下面的代码是TRW2K复制出来的!)

先运行"短信群发专家3.0 商务版"主程序Powersms.exe-->选择注册-->随便填个用户名Yock和注册码48484848

运行TRW2K-->ctrl+n呼出-->下断点bpx hmemcpy-->f5返回-->按注册-->拦下-->bd暂时清楚断点-->pmodule

来到了这里:

016F:005727F7 8D45F0 LEA EAX,[EBP-10]

016F:005727FA E81917E9FF CALL 00403F18

016F:005727FF 8D55E8 LEA EDX,[EBP-18]

016F:00572802 8B45FC MOV EAX,[EBP-04]

016F:00572805 8B80E8020000 MOV EAX,[EAX+02E8]

016F:0057280B E85C49ECFF CALL 0043716C

// 取用户名和位数

016F:00572810 8B45E8 MOV EAX,[EBP-18]

016F:00572813 8D55F8 LEA EDX,[EBP-08]

016F:00572816 E81D77E9FF CALL 00409F38

// 不清楚

016F:0057281B 837DF800 CMP DWORD [EBP-08],BYTE +00

// 这个不知道是什么!绝对不是比较用户名得位数

016F:0057281F 0F8410010000 JZ NEAR 00572935

// 我这里是没有跳的,如果跳走的话,什么反应也没有

016F:00572825 8D55E4 LEA EDX,[EBP-1C]

016F:00572828 8B45FC MOV EAX,[EBP-04]

016F:0057282B 8B80EC020000 MOV EAX,[EAX+02EC]

016F:00572831 E83649ECFF CALL 0043716C

// 这里是取注册码和位数

016F:00572836 8B45E4 MOV EAX,[EBP-1C]

016F:00572839 8D55F4 LEA EDX,[EBP-0C]

016F:0057283C E8F776E9FF CALL 00409F38

// 不清楚

016F:00572841 8D4DF0 LEA ECX,[EBP-10]

016F:00572844 A100045B00 MOV EAX,[005B0400]

016F:00572849 8B00 MOV EAX,[EAX]

016F:0057284B 8B55F8 MOV EDX,[EBP-08]

// 用户名

016F:0057284E E8898D0000 CALL 0057B5DC

// 哈哈,这里就是关键了!

// 也就是注册码怎么炼成的地方!

// 跟进去

016F:00572853 8B55F4 MOV EDX,[EBP-0C]

// 假码

016F:00572856 8B45F0 MOV EAX,[EBP-10]

// 真码

016F:00572859 E80E75E9FF CALL 00409D6C

//这个是真码和假码得比较CALL

016F:0057285E 85C0 TEST EAX,EAX

// 注册码是否正确得标志比较!

016F:00572860 740F JZ 00572871

// 这个是什么我就不写了(废话!)

016F:00572862 B870295700 MOV EAX,00572970

016F:00572867 E8DCD2EEFF CALL 0045FB48

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

上面0057284E的CALL来到这里:

// 下面有两个大循环,旁边的注释是第一次循环的!

// 由于会循环30次之多,我就不每一次都写出来了!

016F:0057B5DA 0000 ADD [EAX],AL

016F:0057B5DC 55 PUSH EBP

016F:0057B5DD 8BEC MOV EBP,ESP

016F:0057B5DF 51 PUSH ECX

016F:0057B5E0 B905000000 MOV ECX,05

016F:0057B5E5 6A00 PUSH BYTE +00

016F:0057B5E7 6A00 PUSH BYTE +00

016F:0057B5E9 49 DEC ECX

016F:0057B5EA 75F9 JNZ 0057B5E5

016F:0057B5EC 51 PUSH ECX

016F:0057B5ED 874DFC XCHG ECX,[EBP-04]

016F:0057B5F0 53 PUSH EBX

016F:0057B5F1 56 PUSH ESI

016F:0057B5F2 57 PUSH EDI

016F:0057B5F3 894DF8 MOV [EBP-08],ECX

016F:0057B5F6 8955FC MOV [EBP-04],EDX

016F:0057B5F9 8B45FC MOV EAX,[EBP-04]

016F:0057B5FC E84B8DE8FF CALL 0040434C

016F:0057B601 33C0 XOR EAX,EAX

016F:0057B603 55 PUSH EBP

016F:0057B604 6859B85700 PUSH DWORD 0057B859

016F:0057B609 64FF30 PUSH DWORD [FS:EAX]

016F:0057B60C 648920 MOV [FS:EAX],ESP

016F:0057B60F 8D45E8 LEA EAX,[EBP-18]

016F:0057B612 BA70B85700 MOV EDX,0057B870

// 是一串字母和数字(sef1sn8y3420dnu2ofps)

// 可能是密匙吧!

016F:0057B617 E89489E8FF CALL 00403FB0

016F:0057B61C 8D45EC LEA EAX,[EBP-14]

016F:0057B61F E8F488E8FF CALL 00403F18

016F:0057B624 8D45E4 LEA EAX,[EBP-1C]

016F:0057B627 8B0DFC4E5B00 MOV ECX,[005B4EFC]

// 这里是机器码

016F:0057B62D 8B55FC MOV EDX,[EBP-04]

// 这里是用户名

016F:0057B630 E8AF8BE8FF CALL 004041E4

// 这里是把用户名和机器码连在一起

016F:0057B635 8B45E4 MOV EAX,[EBP-1C]

// 这里就是连在一起的用户名和机器码(用户名在前,机器码在后)

016F:0057B638 E85B8BE8FF CALL 00404198

// 这里是取得用户名和机器码连在一起后的位数!

016F:0057B63D A1FC4E5B00 MOV EAX,[005B4EFC]

// 这里是机器码

016F:0057B642 E8518BE8FF CALL 00404198

// 取机器码的位数

016F:0057B647 8BF0 MOV ESI,EAX

016F:0057B649 85F6 TEST ESI,ESI

// 比较是否有机器码!

016F:0057B64B 0F8EA8000000 JNG NEAR 0057B6F9

// 没有机器码的话就跳走!

016F:0057B651 BB01000000 MOV EBX,01

// 赋值1

016F:0057B656 8D45E0 LEA EAX,[EBP-20]

016F:0057B659 50 PUSH EAX

016F:0057B65A B901000000 MOV ECX,01

//赋值1

016F:0057B65F 8BD3 MOV EDX,EBX

016F:0057B661 A1FC4E5B00 MOV EAX,[005B4EFC]

// 这里是机器码

016F:0057B666 E8358DE8FF CALL 004043A0

// 取机器码的第一位

016F:0057B66B 8B45E0 MOV EAX,[EBP-20]

// 这里是机器码的第一位

016F:0057B66E E8E98CE8FF CALL 0040435C

// 不清楚有什么用!

// 好像是看看是否有机器码第一位

// 没有就不知道跳去哪了!

// 我这里有机器码,所以没有去看看了!

016F:0057B673 8BF8 MOV EDI,EAX

016F:0057B675 8B45FC MOV EAX,[EBP-04]

// 用户名

016F:0057B678 E81B8BE8FF CALL 00404198

// 取用户名位数

016F:0057B67D 3BD8 CMP EBX,EAX

// 比较是否取完

016F:0057B67F 7F1F JG 0057B6A0

// 取完就跳下去

016F:0057B681 8D45DC LEA EAX,[EBP-24]

016F:0057B684 50 PUSH EAX

016F:0057B685 B901000000 MOV ECX,01

016F:0057B68A 8BD3 MOV EDX,EBX

016F:0057B68C 8B45FC MOV EAX,[EBP-04]

// 用户名

016F:0057B68F E80C8DE8FF CALL 004043A0

// 取用户名第一位

016F:0057B694 8B45DC MOV EAX,[EBP-24]

// 这里是用户名第一位

016F:0057B697 E8C08CE8FF CALL 0040435C

// 不清楚有什么用!

// 好像是看看是否有用户名第一位

// 没有就不知道跳去哪了!

// 我输入了用户名,所以没有去看看了!

016F:0057B69C 8BD0 MOV EDX,EAX

016F:0057B69E EB1D JMP SHORT 0057B6BD

016F:0057B6A0 8D45D8 LEA EAX,[EBP-28]

016F:0057B6A3 50 PUSH EAX

016F:0057B6A4 B901000000 MOV ECX,01

016F:0057B6A9 8BD3 MOV EDX,EBX

016F:0057B6AB 8B45E8 MOV EAX,[EBP-18]

// 这里是一串字符和数字(sef1sn8y3420dnu2ofps)

// 当用户名取完就取这里的了!

016F:0057B6AE E8ED8CE8FF CALL 004043A0

// 取这里的第一位!

016F:0057B6B3 8B45D8 MOV EAX,[EBP-28]

// 这里是(sef1sn8y3420dnu2ofps)第一位

// 其实也不能这样说的,应该说是当前的第一位

// 具体你跟一次就知道了!

016F:0057B6B6 E8A18CE8FF CALL 0040435C

016F:0057B6BB 8BD0 MOV EDX,EAX

016F:0057B6BD 8A07 MOV AL,[EDI]

// 这里是机器码第一位的ASCII码入EAX低位

016F:0057B6BF 8A12 MOV DL,[EDX]

// 这里是用户名第一位的ASCII码入EDX低位

016F:0057B6C1 3C41 CMP AL,41

// 比较机器码第一位是否A(ASCII 41=A)

016F:0057B6C3 7502 JNZ 0057B6C7

// 不是就跳走咯...

// 我的是P,所以跳走了

016F:0057B6C5 B066 MOV AL,66

// 哈哈,想把P变成f

016F:0057B6C7 8BF8 MOV EDI,EAX

// 这里EAX=EDI的低位是P

016F:0057B6C9 81E7FF000000 AND EDI,FF

// 现在EDI变成P了!

016F:0057B6CF 33C0 XOR EAX,EAX

// 清零

016F:0057B6D1 8AC2 MOV AL,DL

// AL=DL=ASCII 59

016F:0057B6D3 03F8 ADD EDI,EAX

// EAX+EDI=EDI

016F:0057B6D5 03FB ADD EDI,EBX

// EBX+EDI=EDI

016F:0057B6D7 8D4DD4 LEA ECX,[EBP-2C]

016F:0057B6DA BA02000000 MOV EDX,02

016F:0057B6DF 8BC7 MOV EAX,EDI

016F:0057B6E1 E8C2EBE8FF CALL 0040A2A8

//这里是把寄存器EDI的值放到内存区保存起来!

016F:0057B6E6 8B55D4 MOV EDX,[EBP-2C]

016F:0057B6E9 8D45F0 LEA EAX,[EBP-10]

016F:0057B6EC E8AF8AE8FF CALL 004041A0

//这里是把每次上面得到的EDI值连在一起!

016F:0057B6F1 43 INC EBX

016F:0057B6F2 4E DEC ESI

016F:0057B6F3 0F855DFFFFFF JNZ NEAR 0057B656

// 跳回去继续循环

016F:0057B6F9 8B45F0 MOV EAX,[EBP-10]

// 这里是上面循环运算后0057B6D5处EDI的值连在一起!

016F:0057B6FC E8978AE8FF CALL 00404198

// 取他们的位数!我的是30个!

// 下面将会循环30次!

016F:0057B701 8D45F4 LEA EAX,[EBP-0C]

016F:0057B704 8B55F0 MOV EDX,[EBP-10]

016F:0057B707 E8A488E8FF CALL 00403FB0

016F:0057B70C 8B45F4 MOV EAX,[EBP-0C]

016F:0057B70F E8848AE8FF CALL 00404198

016F:0057B714 8BF0 MOV ESI,EAX

016F:0057B716 85F6 TEST ESI,ESI

016F:0057B718 0F8E0D010000 JNG NEAR 0057B82B

016F:0057B71E BB01000000 MOV EBX,01

//赋值1

016F:0057B723 8B45F4 MOV EAX,[EBP-0C]

016F:0057B726 807C18FF41 CMP BYTE [EAX+EBX-01],41

// 比较这个地方的字符是否等于ASCII*41 (A)

// 如果是的话就到下面换成ASCII*37 (1)

016F:0057B72B 750D JNZ 0057B73A

016F:0057B72D 8D45F4 LEA EAX,[EBP-0C]

016F:0057B730 E8338CE8FF CALL 00404368

016F:0057B735 C64418FF31 MOV BYTE [EAX+EBX-01],31

// 是A的话就换成1

016F:0057B73A 8B45F4 MOV EAX,[EBP-0C]

016F:0057B73D 807C18FF43 CMP BYTE [EAX+EBX-01],43

// 比较这个地方的字符是否等于ASCII*43 (C)

// 如果是的话就到下面换成ASCII*32 (2)

016F:0057B742 750D JNZ 0057B751

016F:0057B744 8D45F4 LEA EAX,[EBP-0C]

016F:0057B747 E81C8CE8FF CALL 00404368

016F:0057B74C C64418FF32 MOV BYTE [EAX+EBX-01],32

// 是C的话就换成2

016F:0057B751 8B45F4 MOV EAX,[EBP-0C]

016F:0057B754 807C18FF44 CMP BYTE [EAX+EBX-01],44

// 比较这个地方的字符是否等于ASCII*44 (D)

// 如果是的话就到下面换成ASCII*33 (3)

016F:0057B759 750D JNZ 0057B768

016F:0057B75B 8D45F4 LEA EAX,[EBP-0C]

016F:0057B75E E8058CE8FF CALL 00404368

016F:0057B763 C64418FF33 MOV BYTE [EAX+EBX-01],33

// 是D的话就换成3

016F:0057B768 8B45F4 MOV EAX,[EBP-0C]

016F:0057B76B 807C18FF46 CMP BYTE [EAX+EBX-01],46

// 比较这个地方的字符是否等于ASCII*46 (F)

// 如果是的话就到下面换成ASCII*32 (2)

016F:0057B770 750D JNZ 0057B77F

016F:0057B772 8D45F4 LEA EAX,[EBP-0C]

016F:0057B775 E8EE8BE8FF CALL 00404368

016F:0057B77A C64418FF32 MOV BYTE [EAX+EBX-01],32

// 是F的话就换成2

016F:0057B77F 8B45F4 MOV EAX,[EBP-0C]

016F:0057B782 807C18FF42 CMP BYTE [EAX+EBX-01],42

// 比较这个地方的字符是否等于ASCII*42 (B)

// 如果是的话就到下面换成ASCII*36 (6)

016F:0057B787 750D JNZ 0057B796

016F:0057B789 8D45F4 LEA EAX,[EBP-0C]

016F:0057B78C E8D78BE8FF CALL 00404368

016F:0057B791 C64418FF36 MOV BYTE [EAX+EBX-01],36

// 是B的话就换成6

016F:0057B796 8B45F4 MOV EAX,[EBP-0C]

016F:0057B799 807C18FF45 CMP BYTE [EAX+EBX-01],45

// 比较这个地方的字符是否等于ASCII*45 (E)

// 如果是的话就到下面换成ASCII*36 (6)

016F:0057B79E 750D JNZ 0057B7AD

016F:0057B7A0 8D45F4 LEA EAX,[EBP-0C]

016F:0057B7A3 E8C08BE8FF CALL 00404368

016F:0057B7A8 C64418FF36 MOV BYTE [EAX+EBX-01],36

// 是E的话就换成6

016F:0057B7AD 8B45F4 MOV EAX,[EBP-0C]

016F:0057B7B0 807C18FF48 CMP BYTE [EAX+EBX-01],48

// 比较这个地方的字符是否等于ASCII*48 (H)

// 如果是的话就到下面换成ASCII*34 (4)

016F:0057B7B5 750D JNZ 0057B7C4

016F:0057B7B7 8D45F4 LEA EAX,[EBP-0C]

016F:0057B7BA E8A98BE8FF CALL 00404368

016F:0057B7BF C64418FF34 MOV BYTE [EAX+EBX-01],34

// 是H的话就换成4

016F:0057B7C4 8B45F4 MOV EAX,[EBP-0C]

016F:0057B7C7 807C18FF30 CMP BYTE [EAX+EBX-01],30

// 比较这个地方的字符是否等于ASCII*30 (0)

// 如果是的话就到下面换成ASCII*38 (8)

016F:0057B7CC 750D JNZ 0057B7DB

016F:0057B7CE 8D45F4 LEA EAX,[EBP-0C]

016F:0057B7D1 E8928BE8FF CALL 00404368

016F:0057B7D6 C64418FF38 MOV BYTE [EAX+EBX-01],38

// 是0的话就换成8

016F:0057B7DB 8B45F4 MOV EAX,[EBP-0C]

016F:0057B7DE 807C18FF47 CMP BYTE [EAX+EBX-01],47

// 比较这个地方的字符是否等于ASCII*47 (G)

// 如果是的话就到下面换成ASCII*33 (3)

016F:0057B7E3 750D JNZ 0057B7F2

016F:0057B7E5 8D45F4 LEA EAX,[EBP-0C]

016F:0057B7E8 E87B8BE8FF CALL 00404368

016F:0057B7ED C64418FF33 MOV BYTE [EAX+EBX-01],33

// 是G的话就换成3

016F:0057B7F2 8B45F4 MOV EAX,[EBP-0C]

016F:0057B7F5 807C18FF4B CMP BYTE [EAX+EBX-01],4B

// 比较这个地方的字符是否等于ASCII*4B (K)

// 如果是的话就到下面换成ASCII*37 (7)

016F:0057B7FA 750D JNZ 0057B809

016F:0057B7FC 8D45F4 LEA EAX,[EBP-0C]

016F:0057B7FF E8648BE8FF CALL 00404368

016F:0057B804 C64418FF37 MOV BYTE [EAX+EBX-01],37

// 是K的话就换成7

016F:0057B809 8D45D0 LEA EAX,[EBP-30]

016F:0057B80C 8B55F4 MOV EDX,[EBP-0C]

016F:0057B80F 8A541AFF MOV DL,[EDX+EBX-01]

016F:0057B813 E8A888E8FF CALL 004040C0

016F:0057B818 8B55D0 MOV EDX,[EBP-30]

016F:0057B81B 8D45EC LEA EAX,[EBP-14]

016F:0057B81E E87D89E8FF CALL 004041A0

016F:0057B823 43 INC EBX

016F:0057B824 4E DEC ESI

016F:0057B825 0F85F8FEFFFF JNZ NEAR 0057B723

// 跳回去继续

// 这里是把0057B6F9处EAX指向地址的值

// 把这些值的A/C/D/F/B/E/H/0/G/K/

// 转换成相对应的数字1/2/3/2/6/6/4/8/3/7/

016F:0057B82B 8B45F8 MOV EAX,[EBP-08]

016F:0057B82E 8B55EC MOV EDX,[EBP-14]

// 哈哈,这里就是真的注册码,真难炼!

016F:0057B831 E83687E8FF CALL 00403F6C

016F:0057B836 33C0 XOR EAX,EAX

016F:0057B838 5A POP EDX

016F:0057B839 59 POP ECX

016F:0057B83A 59 POP ECX

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

【总 结】:

内存注册机:

中断地址:00572859

中断次数:1

第一字节:E8

字节长度:5

注册码-->寄存器-->EAX

注册信息保存在注册表的:

[HKEY_USERS\.DEFAULT\Identities\More]

"Passwd"="112193626115776466717169132261"

"UsrName"="Yock"

删除就变成未注册!

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

算法:由于我的语文水平有限,表达得不好,请原谅!

(一下全是16进制数的运算)

用户名的字符依次覆盖到(sef1sn8y3420dnu2ofps)上面,如果用户名是Yock(4位),那么就变成了(Yocksn8y3420dnu2ofps)

再取(Yocksn8y3420dnu2ofps)前面的15[机器码的位数]位!

[ 机器码是PY-C9183234-2FA(15位), 那么取前面15位的话,就变成了Yocksn8y3420dnu ]

[ 假如机器码某一位是ASCII*41=A的话就变成ASCII*66=f来运算! ]

之后Yocksn8y3420dnu的每一位的ASCII码和机器码的每一位ASCII码对应加在一起,再加上机器码当前位的位数!

最后把上面的结果依次连在一起!

连再一起的值的每一位要是等于A/C/D/F/B/E/H/0/G/K/的话,就把它们转换成相对应的数字1/2/3/2/6/6/4/8/3/7/

[ 也就是下面这样 ]

A/C/D/F/B/E/H/0/G/K/

转换成:

1/2/3/2/6/6/4/8/3/7/

最后的结果就是真的注册码了!

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

最后在这里真心感谢你花了那么多时间看这篇文章!谢谢了...

(出处:赢政天下整理收藏)

相关文章:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。

档案馆里的相关老软件

🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史