主程序加了简单的壳:
ASPack 2.12 -> Alexey Solodovnikov
没想脱,直接搜索:
push 0
retn
然后在retn上下断,F9运行,然后再单步就到了程序的OEP了,呵呵
让程序运行起来,随意的输入假码,利用万能断点就能找到程序的算法关键所在!
这是一个典型的查表注册机制,代码如下:
00586D5B 8B45 FC mov eax,dword ptr ss:[ebp-4] ; 将EAX指向机器码
00586D5E 0FB64438 FF movzx eax,byte ptr ds:[eax+edi-1] ; 以EDI为索引逐一取机器码的ASCII值
00586D63 2B45 F0 sub eax,dword ptr ss:[ebp-10]
00586D66 03C7 add eax,edi
00586D68 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; 将EDX指向用户名
00586D6B 0FB6541A FF movzx edx,byte ptr ds:[edx+ebx-1] ; 以EBX不索引逐一取用户名的ASCII码值
00586D70 33C2 xor eax,edx ; 将两者进行或运算
00586D72 03C3 add eax,ebx ; 加上用户名的索引值(从1开始)
00586D74 99 cdq
00586D75 33C2 xor eax,edx
00586D77 2BC2 sub eax,edx
00586D79 8BF0 mov esi,eax
00586D7B 8BC6 mov eax,esi
00586D7D B9 24000000 mov ecx,24
00586D82 99 cdq
00586D83 F7F9 idiv ecx ; 除以0x24求余
00586D85 8BF2 mov esi,edx
00586D87 8D45 E0 lea eax,dword ptr ss:[ebp-20]
00586D8A 8A96 90C75A00 mov dl,byte ptr ds:[esi+5AC790] ; 将余数作为索引从字符表中取字符
00586D90 E8 07DEF8FF call etdirloc.00514B9C
00586D95 8B55 E0 mov edx,dword ptr ss:[ebp-20]
00586D98 8D45 E4 lea eax,dword ptr ss:[ebp-1C]
00586D9B E8 DCDEF8FF call etdirloc.00514C7C
00586DA0 3B7D EC cmp edi,dword ptr ss:[ebp-14] ; 判断是否超出机器码长度
00586DA3 7D 03 jge short etdirloc.00586DA8
00586DA5 47 inc edi ; 不是则增1
00586DA6 EB 05 jmp short etdirloc.00586DAD
00586DA8 BB 01000000 mov ebx,1 ; 否则将用户名的索引设为1,
00586DAD 3B5D E8 cmp ebx,dword ptr ss:[ebp-18] ; 判断是否超出用户名长度
00586DB0 7D 03 jge short etdirloc.00586DB5
00586DB2 43 inc ebx ; 不是则增1
00586DB3 EB 05 jmp short etdirloc.00586DBA
00586DB5 BB 01000000 mov ebx,1
00586DBA FF45 F0 inc dword ptr ss:[ebp-10]
00586DBD 837D F0 15 cmp dword ptr ss:[ebp-10],15
00586DC1 ^ 75 98 jnz short etdirloc.00586D5B
通过mov dl,byte ptr ds:[esi+5AC790] 这句,我们可以知道,所要查找表的是在位置5AC790处:
005AC790 30 43 4D 35 45 51 39 52 50 5A 36 44 56 34 42 33 0CM5EQ9RPZ6DV4B3
005AC7A0 55 4C 43 37 59 53 47 38 4B 46 4E 41 31 48 49 47 ULC7YSG8KFNA1HIG
005AC7B0 32 4A 4F 54 00 00 00 00 2JOT....
存放在一个全局变量里,呵呵!
现在可以动手写注册机了,代码如下是:
#include
#include
using namespace std;
const char gString[]="0CM5EQ9RPZ6DV4B3ULC7YSG8KFNA1HIG2JOT";
int main()
{
cout<<"不支持用户名中带空格!\n";
char username[20]={0};
cout<<"请输入你的用户名:";
cin>>username;
char strM[32]={0};
cout<<"请输入你的机器码:";
cin>>strM;
cout<<"你的注册码是:(填写时请按5位一组填写)\n";
char strCode[32]={0};
int len=strlen(username);
for(int i=0,j=0;i<20;i++){
int tmp=strM[i] ^ username[j];
tmp+=(j+1);
tmp %= 0x24;
strCode[i]=gString[tmp];
j++;
if(j>=len)
j=0;
}
cout<
return 0;
}
在我电脑上运行如下([color=#0000FF]注意是在命令行下运行[/color]):
G:\TDDOWNLOAD>keyGen
不支持用户名中带空格!
请输入你的用户名:iawen
请输入你的机器码:1412101181315857262915313
你的注册码是:(填写时请按5位一组填写)
L3C71C6CF176JFK8427Y
即注册码为:[color=#FF0000]L3C71-C6CF1-76JFK-8427Y[/color]
点击下载注册机:
keyGen.rar
好的,谢谢你!到时候记得发出来共享哦,呵呵!
网上没有新的破解,找到的都是注册之后,然后运行都会自动关闭在注册的,如果可以能麻烦你在破一下v6.7.1.1吗?谢谢!
你好,注册成功之后,在运行的时候会自动关闭,然后在运行的时候又要重新注册,有什么好的解决办法吗?谢谢!
还是得麻烦您!
感谢您给我算了注册码,但仍未注册成功!!不但如此,还出现了一个新问题,我发现,下载的绿色版本的软件都不能在后台运行,也就是说,只要一点“关闭”,程序就自动退出了,这样是无论如何也起不到保护作用的!我原来还担心是杀软的问题,为此,我重装了系统,在安装杀软前运行软件,也一样不能驻留内存,不知是什么原因。
还有,如果可能的话,麻烦您把包含注册机的软件给我发一个完整的压缩包好吗?我的邮箱是:ssqh@163.com。我的QQ:10548756,联系我好吗?
再次感谢您!
再次留言!
已在CMD命令下解决了窗口停留问题,但是,所得出的注册码并没有注册成功!!!!
唉,伤心啊
若博主肯费心,我的注册码为:915231192343;注册姓名:sqh(或你随便取一个也行),我将非常感谢!
原来博主刚刚还在的,擦肩而过了。
所谓在“在控制台下”是什么意思,不就是“开始”-“运行”么?
按您说的运行程序,输入用户名和机器码,回车后窗口不见了,根本就没看见注册码
重新下了。无法注册
的确无法成功注册,望修正。
这个可以成功注册电脑锁2007,但是注册不了文件夹锁2006,说注册码非法。请站长做个文件夹锁2006的keygen,感谢之极!