|
这个软件很有意思,它的壳被动了手脚,用脱壳机不能自动脱壳,脱壳就死机!
但我觉得作者好蠢,这样会更加激起破解者的斗志的!(猪一头...)
【软件限制】: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次! |
|