sys文件类型重启验证破解追踪序列号一例
sys文件类型重启验证破解追踪序列号一例【用到工具】OD,Peid,C32ASM
【调试平台】深度优化windows xp sp2
【目标程序】XXX销售管理系统
【破解目的】一切都是为了学习,提高破解水平。
【破解过程】
让我们先踩点看看,运行程序。尝试注册看看,出现错误提示信息对话框。打探敌情完毕,关闭程序
接着使用Peid查壳看看,显示为:Microsoft Visual C++ 6.0
很好,是无壳程序,载入目标程序于OD中,运行程序,继续进行尝试注册,既然在前面尝试注册时出
现了注册失败的提示信息,那么我们就在OD命令行下先下拦截信息框的断点:BP MessageBoxA看看。输入
注册信息,然后点击注册,程序就断下来了。我们取消断点,目前程序只是停留在系统领空,我们按住快
捷键Alt+F9返回到程序领空,我们F8往下单步,好,很快地来到了程序主模块领空,我们分析下,在调用
这个信息提示对话框的前面有一个无条件跳转JMP可以跳过该信息对话框,我们在往前找找。很快地,我
们可以发现前面有一个跳转是跳向该注册失败提示对话框的,再分析下附近的代码,很明显,这是个关键
跳转。这样子,那我们就不能让这个跳转实现,我们就把这个跳转NOP掉吧,保存一份,重载下被调试的
目标程序。我们再来运行下刚才保存的那份文件,运行,注册,出现提示:成功注册,请重启程序。很明
显,是一个重启验证注册的程序。嗯,这对于我们这类菜鸟朋友就有点恼火了,哈哈,不要灰心哦,我们
再来到该软件的根目录下看看呀,哈哈,是不是发现了什么,是的,在该目录下的sys文件夹下面有一个
Reg.sys文件,使用C32ASM打开看看。不得了,里面就是保存有我们的注册信息。思路来了,我们可以先试
着在OD命令行中下创建或打开文件的断点bp CreateFileA 看看,因为是重启验证嘛,它总该读取一些带
有注册信息的文件吧。下好断点,F9几下(大概十四下),这时(缓冲也比较大)我们的眼睛要注意堆栈
窗口哦,当它读取sys文件夹下面的Reg.sys文件时,我们就到达返回时机了。Alt+F9返回,记住,这时不
要取消断点,返回到程序领空后我们使用F8继续往下单步下去,一直来到主模块程序领空。好的,下面我
就给出关键性代码及其注释如下:
第一次返回到主模块程序领空处代码:
004D745A 8945 F0 mov dword ptr ss:,eax
004D745D 8B5D F4 mov ebx,dword ptr ss:
004D7460 85DBtest ebx,ebx
004D7462 74 09 je short XXXX.004D746D
004D7464 53push ebx
004D7465 E8 7A5C0A00 call XXXX.0057D0E4
004D746A 83C4 04 add esp,4
004D746D 837D F0 00cmp dword ptr ss:,0
004D7471 0F85 44000000 jnz XXXX.004D74BB
004D7477 6A 00 push 0
004D7479 6A 00 push 0
继续使用F8往下单步跟踪,然后又来到模块krnln,继续F8,接着来到这里:
1000DE51 8D4C24 60 lea ecx,dword ptr ss:
1000DE55 33D2xor edx,edx
1000DE57 83C0 04 add eax,4
1000DE5A 66:8B11 mov dx,word ptr ds:
1000DE5D 83C1 02 add ecx,2
1000DE60 8950 FC mov dword ptr ds:,edx
1000DE63 3D F0DA0E10 cmp eax,krnln.100EDAF0
1000DE68 ^ 7C EB jl short krnln.1000DE55//循环很长,设置下标志位S
1000DE6A 68 F0D60E10 push krnln.100ED6F0
再次进入到主模块程序领空处代码:
004D8507 83C4 04 add esp,4
004D850A 68 01030080 push 80000301
004D850F 6A 00 push 0
004D8511 50push eax
004D8512 68 01000000 push 1
004D8517 BB D4010000 mov ebx,1D4
004D851C E8 CF4B0A00 call XXXX.0057D0F0
继续使用F8往下单步跟踪,当来到下面的代码时一定要注意了:
(哈哈,对注释行里的aa,bb,cc,dd很有感触吧)
004D7B79 68 04000080 push 80000004
004D7B7E 6A 00 push 0
004D7B80 68 B5C44000 push XXXX.0040C4B5 ; ASCII "aa"
004D7B85 68 01000000 push 1
004D7B8A BB 20060000 mov ebx,620
004D7B8F E8 5C550A00 call XXXX.0057D0F0
004D7B94 83C4 10 add esp,10
004D7B97 8945 F0 mov dword ptr ss:,eax
004D7B9A 8955 F4 mov dword ptr ss:,edx
004D7B9D 894D F8 mov dword ptr ss:,ecx
004D7BA0 8B4D F8 mov ecx,dword ptr ss:
004D7BA3 81F9 04000080 cmp ecx,80000004
004D7BA9 74 0D je short XXXX.004D7BB8
004D7BAB 68 05000000 push 5
004D7BB0 E8 4D550A00 call XXXX.0057D102
004D7BB5 83C4 04 add esp,4
004D7BB8 A1 5021B200 mov eax,dword ptr ds:
004D7BBD 50push eax ; 寄存器窗口EAX寄存器中出现序列号的第一部分
004D7BBE FF75 F0 push dword ptr ss:
004D7BC1 E8 7AF7FFFF call XXXX.004D7340
004D7BC6 83C4 08 add esp,8
004D7BC9 83F8 00 cmp eax,0
004D7BCC B8 00000000 mov eax,0
004D7BD1 0F94C0sete al
004D7BD4 8945 EC mov dword ptr ss:,eax
004D7BD7 8B4D F8 mov ecx,dword ptr ss:
004D7BDA 81F9 04000080 cmp ecx,80000004
004D7BE0 74 0C je short XXXX.004D7BEE
004D7BE2 81F9 05000080 cmp ecx,80000005
004D7BE8 0F85 10000000 jnz XXXX.004D7BFE
004D7BEE 8B5D F0 mov ebx,dword ptr ss:
004D7BF1 85DBtest ebx,ebx
004D7BF3 74 09 je short XXXX.004D7BFE
004D7BF5 53push ebx
004D7BF6 E8 E9540A00 call XXXX.0057D0E4
004D7BFB 83C4 04 add esp,4
004D7BFE 837D EC 00cmp dword ptr ss:,0
004D7C02 0F84 B4010000 je XXXX.004D7DBC; 设置标志位Z,不让它实现(因为序列号的第一部分验证失败),让它继续读取序列号的第二部分
004D7C08 68 04000080 push 80000004
004D7C0D 6A 00 push 0
004D7C0F 68 B8C44000 push XXXX.0040C4B8; ASCII "bb"
004D7C14 68 01000000 push 1
004D7C19 BB 20060000 mov ebx,620
004D7C1E E8 CD540A00 call XXXX.0057D0F0
004D7C23 83C4 10 add esp,10
004D7C26 8945 E0 mov dword ptr ss:,eax
004D7C29 8955 E4 mov dword ptr ss:,edx
004D7C2C 894D E8 mov dword ptr ss:,ecx
004D7C2F 8B4D E8 mov ecx,dword ptr ss:
004D7C32 81F9 04000080 cmp ecx,80000004
004D7C38 74 0D je short XXXX.004D7C47
004D7C3A 68 05000000 push 5
004D7C3F E8 BE540A00 call XXXX.0057D102
004D7C44 83C4 04 add esp,4
004D7C47 A1 5421B200 mov eax,dword ptr ds:
004D7C4C 50push eax ; 寄存器窗口EAX寄存器中出现序列号的第二部分
004D7C4D FF75 E0 push dword ptr ss:
004D7C50 E8 EBF6FFFF call XXXX.004D7340
004D7C55 83C4 08 add esp,8
004D7C58 83F8 00 cmp eax,0
004D7C5B B8 00000000 mov eax,0
004D7C60 0F94C0sete al
004D7C63 8945 DC mov dword ptr ss:,eax
004D7C66 8B4D E8 mov ecx,dword ptr ss:
004D7C69 81F9 04000080 cmp ecx,80000004
004D7C6F 74 0C je short XXXX.004D7C7D
004D7C71 81F9 05000080 cmp ecx,80000005
004D7C77 0F85 10000000 jnz XXXX.004D7C8D
004D7C7D 8B5D E0 mov ebx,dword ptr ss:
004D7C80 85DBtest ebx,ebx
004D7C82 74 09 je short XXXX.004D7C8D
004D7C84 53push ebx
004D7C85 E8 5A540A00 call XXXX.0057D0E4
004D7C8A 83C4 04 add esp,4
004D7C8D 837D DC 00cmp dword ptr ss:,0
004D7C91 0F84 25010000 je XXXX.004D7DBC ; 设置标志位Z,不让它实现(因为序列号的第二部分验证失败),让它继续读取序列号的第三部分
004D7C97 68 04000080 push 80000004
004D7C9C 6A 00 push 0
004D7C9E 68 BBC44000 push XXXX.0040C4BB ; ASCII "cc"
004D7CA3 68 01000000 push 1
004D7CA8 BB 20060000 mov ebx,620
004D7CAD E8 3E540A00 call XXXX.0057D0F0
004D7CB2 83C4 10 add esp,10
004D7CB5 8945 D0 mov dword ptr ss:,eax
004D7CB8 8955 D4 mov dword ptr ss:,edx
004D7CBB 894D D8 mov dword ptr ss:,ecx
004D7CBE 8B4D D8 mov ecx,dword ptr ss:
004D7CC1 81F9 04000080 cmp ecx,80000004
004D7CC7 74 0D je short XXXX.004D7CD6
004D7CC9 68 05000000 push 5
004D7CCE E8 2F540A00 call XXXX.0057D102
004D7CD3 83C4 04 add esp,4
004D7CD6 A1 5821B200 mov eax,dword ptr ds:
004D7CDB 50push eax; 寄存器窗口EAX寄存器中出现序列号的第三部分
004D7CDC FF75 D0 push dword ptr ss:
004D7CDF E8 5CF6FFFF call XXXX.004D7340
004D7CE4 83C4 08 add esp,8
004D7CE7 83F8 00 cmp eax,0
004D7CEA B8 00000000 mov eax,0
004D7CEF 0F94C0sete al
004D7CF2 8945 CC mov dword ptr ss:,eax
004D7CF5 8B4D D8 mov ecx,dword ptr ss:
004D7CF8 81F9 04000080 cmp ecx,80000004
004D7CFE 74 0C je short XXXX.004D7D0C
004D7D00 81F9 05000080 cmp ecx,80000005
004D7D06 0F85 10000000 jnz XXXX.004D7D1C
004D7D0C 8B5D D0 mov ebx,dword ptr ss:
004D7D0F 85DBtest ebx,ebx
004D7D11 74 09 je short XXXX.004D7D1C
004D7D13 53push ebx
004D7D14 E8 CB530A00 call XXXX.0057D0E4
004D7D19 83C4 04 add esp,4
004D7D1C 837D CC 00cmp dword ptr ss:,0
004D7D20 0F84 96000000 je XXXX.004D7DBC; 设置标志位Z,不让它实现(因为序列号的第三部分验证失败),让它继续读取序列号的第四部分
004D7D26 68 04000080 push 80000004
004D7D2B 6A 00 push 0
004D7D2D 68 BEC44000 push XXXX.0040C4BE ; ASCII "dd"
004D7D32 68 01000000 push 1
004D7D37 BB 20060000 mov ebx,620
004D7D3C E8 AF530A00 call XXXX.0057D0F0
004D7D41 83C4 10 add esp,10
004D7D44 8945 C0 mov dword ptr ss:,eax
004D7D47 8955 C4 mov dword ptr ss:,edx
004D7D4A 894D C8 mov dword ptr ss:,ecx
004D7D4D 8B4D C8 mov ecx,dword ptr ss:
004D7D50 81F9 04000080 cmp ecx,80000004
004D7D56 74 0D je short XXXX.004D7D65
004D7D58 68 05000000 push 5
004D7D5D E8 A0530A00 call XXXX.0057D102
004D7D62 83C4 04 add esp,4
004D7D65 A1 5C21B200 mov eax,dword ptr ds:
004D7D6A 50push eax; 寄存器窗口EAX寄存器中出现序列号的第四部分
004D7D6B FF75 C0 push dword ptr ss:
004D7D6E E8 CDF5FFFF call XXXX.004D7340
004D7D73 83C4 08 add esp,8
004D7D76 83F8 00 cmp eax,0
004D7D79 B8 00000000 mov eax,0
004D7D7E 0F94C0sete al
004D7D81 8945 BC mov dword ptr ss:,eax
004D7D84 8B4D C8 mov ecx,dword ptr ss:
004D7D87 81F9 04000080 cmp ecx,80000004
004D7D8D 74 0C je short XXXX.004D7D9B
004D7D8F 81F9 05000080 cmp ecx,80000005
004D7D95 0F85 10000000 jnz XXXX.004D7DAB
004D7D9B 8B5D C0 mov ebx,dword ptr ss:
004D7D9E 85DBtest ebx,ebx
004D7DA0 74 09 je short XXXX.004D7DAB
004D7DA2 53push ebx
004D7DA3 E8 3C530A00 call XXXX.0057D0E4
004D7DA8 83C4 04 add esp,4
004D7DAB 837D BC 00cmp dword ptr ss:,0
004D7DAF 0F84 07000000 je XXXX.004D7DBC
004D7DB5 B8 01000000 mov eax,1
004D7DBA EB 02 jmp short XXXX.004D7DBE
004D7DBC 33C0xor eax,eax
004D7DBE 85C0test eax,eax
004D7DC0 0F84 A9000000 je XXXX.004D7E6F
004D7DC6 B8 C1C44000 mov eax,XXXX.0040C4C1
004D7DCB 50push eax
004D7DCC 8B1D 4821B200 mov ebx,dword ptr ds:
004D7DD2 85DBtest ebx,ebx
004D7DD4 74 09 je short XXXX.004D7DDF
004D7DD6 53push ebx
004D7DD7 E8 08530A00 call XXXX.0057D0E4
004D7DDC 83C4 04 add esp,4
004D7DDF 58pop eax
004D7DE0 A3 4821B200 mov dword ptr ds:,eax
004D7DE5 C705 6021B200 01000>mov dword ptr ds:,1
004D7DEF B8 CCC44000 mov eax,XXXX.0040C4CC
004D7DF4 50push eax
004D7DF5 8B1D 6421B200 mov ebx,dword ptr ds:
004D7DFB 85DBtest ebx,ebx
004D7DFD 74 09 je short XXXX.004D7E08
004D7DFF 53push ebx
004D7E00 E8 DF520A00 call XXXX.0057D0E4
004D7E05 83C4 04 add esp,4
004D7E08 58pop eax
004D7E09 A3 6421B200 mov dword ptr ds:,eax
004D7E0E 68 04000080 push 80000004
004D7E13 6A 00 push 0
004D7E15 68 DDC44000 push XXXX.0040C4DD
004D7E1A 68 01030080 push 80000301
004D7E1F 6A 00 push 0
004D7E21 68 03000000 push 3
004D7E26 68 02000300 push 30002
004D7E2B 68 D9180116 push 160118D9
004D7E30 68 01000152 push 52010001
004D7E35 68 03000000 push 3
004D7E3A BB 80000000 mov ebx,80
004D7E3F B8 02000000 mov eax,2
004D7E44 E8 B3520A00 call XXXX.0057D0FC
004D7E49 83C4 28 add esp,28
004D7E4C 6A 00 push 0
004D7E4E FF35 6421B200 push dword ptr ds:
004D7E54 6A FF push -1
004D7E56 6A 08 push 8
004D7E58 68 00000106 push 6010000
004D7E5D 68 01000152 push 52010001
004D7E62 E8 A1520A00 call XXXX.0057D108
004D7E67 83C4 18 add esp,18
004D7E6A E9 09060000 jmp XXXX.004D8478
004D7E6F B8 CCC44000 mov eax,XXXX.0040C4CC//读取序列号的四部分后来到了此处
追踪到序列号为:1429-3502-5863-0553
这个软件的序列号(本软件就是指店铺名了)跟我们输入的注册名没有什么关系的。
最后我们来总结下:该软件的注册方式属重启验证注册类型,就是说该软件在注册成功后会通过重启软件
来读取它安装目录下的Reg.sys文件进行注册验证;它把它的序列号(也就是本程序的注册码)分别保存
在四个寄存器里(EAX),然后在程序启动时读取Reg.sys文件,也就是在读取注册信息进行注册验证了;
序列号分成四个部分,它通过计算(具体怎么计算就没怎么分析了)后对这四部分逐一进行对比验证,有
一部分序列号验证不成功该软件就不能注册成功。 谢谢 学习了啊 恩学习了了啊,好东西 重启验证的不好搞哦学习下 精彩,学习中.....
谢谢思路很好,但是大大见过EXE重启验证的吗?一样这样搞定行不? 楼主写的非常明白,我学习到了新知识。
页:
[1]