【软件名称】:IrfanView
【软件大小】:440 KB
【下载地址】:
http://www.irfanview.com/
【软件简介】:图像浏览处理
【软件限制】:免费软件
【保护方式】:注册码
【破解作者】:w.h.m
【破解日期】:06/03/2005
【破解声明】:学习注册算法,失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、OllyDBG、PEiD、ImportREC
―――――――――――――――――――――――――――――――――――――――――――
【破解过程】:
看雪上已经有一篇介绍IrfanView 3.97的注册算法:
http://bbs.pediy.com//showthread.php?s=&threadid=13336
但是分析的并不彻底,没有写出注册机.出于学习目的,我独立的又分析了它的注册算法,但是
这里省去了一些步骤,直接分析其计算注册码部分,其余请参考前作. 我用的不是最新版,而是
3.80, 实际算法没有变,至少我知道的自3.70后一直没有变,因为我手头有一个3.70的注册机,
作了比较,而且和baby2008计算的3.97 比较也一样,所以我懒得去下载最新的.
且看我的分析:
(注:分析所用数字为十六进制.)
00436600 /$ 8B4424 08 mov eax,dword ptr ss:[esp+8]
00436604 |. 83EC 14 sub esp,14
00436607 |. 53 push ebx
00436608 |. 55 push ebp
00436609 |. 56 push esi
0043660A |. 57 push edi
0043660B |. 50 push eax ; 参数为注册码
0043660C |. 33DB xor ebx,ebx
0043660E |. E8 9A2A0800 call x.004B90AD ; eax=注册码串转化的十六进制;记为code
00436613 |. 8B7424 2C mov esi,dword ptr ss:[esp+2C] ; 用户名
00436617 |. 8BE8 mov ebp,eax
00436619 |. 8BFE mov edi,esi
0043661B |. 83C9 FF or ecx,FFFFFFFF
0043661E |. 33C0 xor eax,eax
00436620 |. 83C4 04 add esp,4
00436623 |. 33D2 xor edx,edx
00436625 |. F2:AE repne scas byte ptr es:[edi]
00436627 |. F7D1 not ecx
00436629 |. 49 dec ecx
0043662A |. 85C9 test ecx,ecx ; ecx用户名长度
0043662C |. 7E 17 jle short x.00436645
0043662E |> 0FBE0C32 /movsx ecx,byte ptr ds:[edx+esi]
00436632 |. 03D9 |add ebx,ecx
00436634 |. 8BFE |mov edi,esi
00436636 |. 83C9 FF |or ecx,FFFFFFFF
00436639 |. 33C0 |xor eax,eax
0043663B |. 42 |inc edx
0043663C |. F2:AE |repne scas byte ptr es:[edi]
0043663E |. F7D1 |not ecx
00436640 |. 49 |dec ecx
00436641 |. 3BD1 |cmp edx,ecx
00436643 |.^ 7C E9 \jl short x.0043662E ; ebx=用户名[i]累加;记为sum
00436645 |> B8 04010000 mov eax,104
0043664A |. 6A 0A push 0A ; /Arg3 = 0000000A, 十进制
0043664C |. 2BC3 sub eax,ebx ; |
0043664E |. 99 cdq ; |
0043664F |. 33C2 xor eax,edx ; |
00436651 |. 2BC2 sub eax,edx ; |
00436653 |. 05 4C010000 add eax,14C ; |eax=abs(104-sum)+14c
00436658 |. 8D14C5 0000>lea edx,dword ptr ds:[eax*8] ; |
0043665F |. 2BD0 sub edx,eax ; |
00436661 |. 8D0C90 lea ecx,dword ptr ds:[eax+edx*4] ; |ecx=1d*eax
00436664 |. 8D5424 14 lea edx,dword ptr ss:[esp+14] ; |
00436668 |. 52 push edx ; |Arg2, 存放结果
00436669 |. 8D3448 lea esi,dword ptr ds:[eax+ecx*2] ; |
0043666C |. C1E6 03 shl esi,3 ; |esi=1d8*eax
0043666F |. 56 push esi ; |Arg1=1d8*(abs(104-sum)+14c)
00436670 |. E8 6FE10800 call x.004C47E4 ; \把Arg1转化成十进制串,存放在Arg2地址,记为s
00436675 |. 8A4C24 20 mov cl,byte ptr ss:[esp+20] ; s[4]
00436679 |. 8A4424 21 mov al,byte ptr ss:[esp+21] ; s[5]
0043667D |. 83C4 0C add esp,0C
00436680 |. 81FE 3F420F>cmp esi,0F423F
00436686 |. 0F87 E70000>ja x.00436773
0043668C |. 8A5424 13 mov dl,byte ptr ss:[esp+13] ; s[3]
00436690 |. 884C24 16 mov byte ptr ss:[esp+16],cl ; s[6]=s[4]
00436694 |. 8A4C24 11 mov cl,byte ptr ss:[esp+11] ; s[1]
00436698 |. 884424 18 mov byte ptr ss:[esp+18],al ; s[8]=s[5]
0043669C |. 8A4424 12 mov al,byte ptr ss:[esp+12] ; s[2]
004366A0 |. 885424 15 mov byte ptr ss:[esp+15],dl ; s[5]=s[3]
004366A4 |. 884C24 12 mov byte ptr ss:[esp+12],cl ; s[2]=s[1]
004366A8 |. 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
004366AC |. 81E1 FF0000>and ecx,0FF ; s[4]
004366B2 |. 884424 13 mov byte ptr ss:[esp+13],al ; s[3]=s[2]
004366B6 |. 8BC1 mov eax,ecx
004366B8 |. C1E0 05 shl eax,5
004366BB |. 2BC1 sub eax,ecx ; eax=s[4]*1f
004366BD |. 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
004366C1 |. 81E1 FF0000>and ecx,0FF ; s[8]
004366C7 |. 8D1440 lea edx,dword ptr ds:[eax+eax*2] ; edx=eax*3=s[4]*5d
004366CA |. 8D0489 lea eax,dword ptr ds:[ecx+ecx*4]
004366CD |. C1E0 03 shl eax,3
004366D0 |. 2BC1 sub eax,ecx ; eax=ecx*27=s[8]*27
004366D2 |. 2BC2 sub eax,edx
004366D4 |. 99 cdq
004366D5 |. 8BC8 mov ecx,eax
004366D7 |. 33CA xor ecx,edx
004366D9 |. 2BCA sub ecx,edx ; ecx=abs(eax-edx)
004366DB |. 8D0489 lea eax,dword ptr ds:[ecx+ecx*4]
004366DE |. C1E0 03 shl eax,3
004366E1 |. 2BC1 sub eax,ecx ; eax=ecx*27=abs(s[8]*27-s[4]*5d)*27
004366E3 |. B9 09000000 mov ecx,9
004366E8 |. 99 cdq
004366E9 |. F7F9 idiv ecx
004366EB |. 8B4424 13 mov eax,dword ptr ss:[esp+13]
004366EF |. 25 FF000000 and eax,0FF ; s[3]
004366F4 |. 80C2 30 add dl,30
004366F7 |. 885424 17 mov byte ptr ss:[esp+17],dl ; s[7]=abs(s[8]*27-s[4]*5d)*27%9+30
004366FB |. 8D1440 lea edx,dword ptr ds:[eax+eax*2]
004366FE |. C1E2 04 shl edx,4
00436701 |. 2BD0 sub edx,eax ; edx=eax*2f=s[3]*2f
00436703 |. 8B4424 15 mov eax,dword ptr ss:[esp+15]
00436707 |. 25 FF000000 and eax,0FF ; s[5]
0043670C |. 8D0CC0 lea ecx,dword ptr ds:[eax+eax*8]
0043670F |. 8D0488 lea eax,dword ptr ds:[eax+ecx*4]
00436712 |. 8D0442 lea eax,dword ptr ds:[edx+eax*2] ; eax=s[5]*a4+s[3]*2f
00436715 |. 99 cdq
00436716 |. 33C2 xor eax,edx
00436718 |. 2BC2 sub eax,edx ; eax=abs(s[5]*a4+s[3]*2f)
0043671A |. 8D0CC0 lea ecx,dword ptr ds:[eax+eax*8]
0043671D |. 8D0488 lea eax,dword ptr ds:[eax+ecx*4]
00436720 |. B9 09000000 mov ecx,9
00436725 |. 03C0 add eax,eax ; eax=abs(s[5]*a4+s[3]*2f)*4a
00436727 |. 99 cdq
00436728 |. F7F9 idiv ecx
0043672A |. 8B4C24 10 mov ecx,dword ptr ss:[esp+10] ; s[0]
0043672E |. 81E1 FF0000>and ecx,0FF
00436734 |. 8D0449 lea eax,dword ptr ds:[ecx+ecx*2]
00436737 |. 8D04C0 lea eax,dword ptr ds:[eax+eax*8]
0043673A |. 03C0 add eax,eax
0043673C |. 2BC1 sub eax,ecx ; eax=s[0]*35
0043673E |. 80C2 30 add dl,30
00436741 |. 885424 14 mov byte ptr ss:[esp+14],dl ; s[4]=abs(s[5]*a4+s[3]*2f)*4a%9+30
00436745 |. 8B4C24 11 mov ecx,dword ptr ss:[esp+11] ; s[1]
00436749 |. 81E1 FF0000>and ecx,0FF
0043674F |. 8D14CD 0000>lea edx,dword ptr ds:[ecx*8]
00436756 |. 2BD1 sub edx,ecx
00436758 |. 8D1492 lea edx,dword ptr ds:[edx+edx*4] ; edx=s[1]*23
0043675B |. 2BC2 sub eax,edx
0043675D |. 99 cdq
0043675E |. 8BC8 mov ecx,eax
00436760 |. 33CA xor ecx,edx
00436762 |. 2BCA sub ecx,edx ; ecx=abs(eax-edx)=abs(s[0]*35-s[1]*23)
00436764 |. 8D0449 lea eax,dword ptr ds:[ecx+ecx*2]
00436767 |. 8D04C0 lea eax,dword ptr ds:[eax+eax*8]
0043676A |. 03C0 add eax,eax
0043676C |. 2BC1 sub eax,ecx ; eax=abs(s[0]*35-s[1]*23)*35
0043676E |. E9 ED000000 jmp x.00436860 ; 跳过大段
00436773 |> 8A5424 16 mov dl,byte ptr ss:[esp+16]
00436777 |. 884424 16 mov byte ptr ss:[esp+16],al
0043677B |. 8A4424 11 mov al,byte ptr ss:[esp+11]
0043677F |. 885424 18 mov byte ptr ss:[esp+18],dl
00436783 |. 8A5424 12 mov dl,byte ptr ss:[esp+12]
00436787 |. 884424 12 mov byte ptr ss:[esp+12],al
0043678B |. 8B4424 16 mov eax,dword ptr ss:[esp+16]
0043678F |. 884C24 15 mov byte ptr ss:[esp+15],cl
00436793 |. 25 FF000000 and eax,0FF
00436798 |. 885424 13 mov byte ptr ss:[esp+13],dl
0043679C |. 8BC8 mov ecx,eax
0043679E |. C1E1 06 shl ecx,6
004367A1 |. 2BC8 sub ecx,eax
004367A3 |. 8B4424 18 mov eax,dword ptr ss:[esp+18]
004367A7 |. 25 FF000000 and eax,0FF
004367AC |. 8D04C0 lea eax,dword ptr ds:[eax+eax*8]
004367AF |. C1E0 02 shl eax,2
004367B2 |. 2BC1 sub eax,ecx
004367B4 |. B9 09000000 mov ecx,9
004367B9 |. 99 cdq
004367BA |. 33C2 xor eax,edx
004367BC |. 2BC2 sub eax,edx
004367BE |. 8D04C0 lea eax,dword ptr ds:[eax+eax*8]
004367C1 |. C1E0 02 shl eax,2
004367C4 |. 99 cdq
004367C5 |. F7F9 idiv ecx
004367C7 |. 80C2 30 add dl,30
004367CA |. 885424 17 mov byte ptr ss:[esp+17],dl
004367CE |. 8B4424 14 mov eax,dword ptr ss:[esp+14]
004367D2 |. 25 FF000000 and eax,0FF
004367D7 |. 83C0 20 add eax,20
004367DA |. 8D14C5 0000>lea edx,dword ptr ds:[eax*8]
004367E1 |. 2BD0 sub edx,eax
004367E3 |. 8D0490 lea eax,dword ptr ds:[eax+edx*4]
004367E6 |. 8D0C40 lea ecx,dword ptr ds:[eax+eax*2]
004367E9 |. 8B4424 13 mov eax,dword ptr ss:[esp+13]
004367ED |. 25 FF000000 and eax,0FF
004367F2 |. 8D1480 lea edx,dword ptr ds:[eax+eax*4]
004367F5 |. C1E2 03 shl edx,3
004367F8 |. 2BD0 sub edx,eax
004367FA |. 8D0451 lea eax,dword ptr ds:[ecx+edx*2]
004367FD |. 99 cdq
004367FE |. 33C2 xor eax,edx
00436800 |. 2BC2 sub eax,edx
00436802 |. 8D0CC5 0000>lea ecx,dword ptr ds:[eax*8]
00436809 |. 2BC8 sub ecx,eax
0043680B |. 8D0488 lea eax,dword ptr ds:[eax+ecx*4]
0043680E |. B9 09000000 mov ecx,9
00436813 |. 8D0440 lea eax,dword ptr ds:[eax+eax*2]
00436816 |. 99 cdq
00436817 |. F7F9 idiv ecx
00436819 |. 8B4424 10 mov eax,dword ptr ss:[esp+10]
0043681D |. 25 FF000000 and eax,0FF
00436822 |. 80C2 30 add dl,30
00436825 |. 885424 14 mov byte ptr ss:[esp+14],dl
00436829 |. 8D14C5 0000>lea edx,dword ptr ds:[eax*8]
00436830 |. 2BD0 sub edx,eax
00436832 |. 8D0490 lea eax,dword ptr ds:[eax+edx*4]
00436835 |. 8B5424 11 mov edx,dword ptr ss:[esp+11]
00436839 |. 81E2 FF0000>and edx,0FF
0043683F |. 03C0 add eax,eax
00436841 |. 8BCA mov ecx,edx
00436843 |. C1E1 04 shl ecx,4
00436846 |. 03CA add ecx,edx
00436848 |. 8D0C89 lea ecx,dword ptr ds:[ecx+ecx*4]
0043684B |. 2BC1 sub eax,ecx
0043684D |. 99 cdq
0043684E |. 33C2 xor eax,edx
00436850 |. 2BC2 sub eax,edx
00436852 |. 8D14C5 0000>lea edx,dword ptr ds:[eax*8]
00436859 |. 2BD0 sub edx,eax
0043685B |. 8D0490 lea eax,dword ptr ds:[eax+edx*4]
0043685E |. 03C0 add eax,eax
00436860 |> 99 cdq
00436861 |. B9 09000000 mov ecx,9
00436866 |. C64424 19 0>mov byte ptr ss:[esp+19],0 ; s[9]=0,确定只有9个字符
0043686B |. F7F9 idiv ecx
0043686D |. 80C2 30 add dl,30
00436870 |. 885424 11 mov byte ptr ss:[esp+11],dl ; s[1]=abs(s[0]*35-s[1]*23)*35%9+30
00436874 |. 8D5424 10 lea edx,dword ptr ss:[esp+10]
00436878 |. 52 push edx
00436879 |. E8 2F280800 call x.004B90AD ; 比较
0043687E |. 83C4 04 add esp,4
00436881 |. 33C9 xor ecx,ecx
00436883 |. 3BE8 cmp ebp,eax
00436885 |. 5F pop edi
00436886 |. 5E pop esi
00436887 |. 0F94C1 sete cl
0043688A |. 5D pop ebp
0043688B |. 8BC1 mov eax,ecx
0043688D |. 5B pop ebx
0043688E |. 83C4 14 add esp,14
00436891 \. C3 retn
总结一下:
1.sum=sum(name[i])
2.把1d8*(abs(104-sum)+14c)转化成10进制串s
3.
s[8]=s[5],s[5]=s[3],s[3]=s[2],s[2]=s[1],s[6]=s[4]
s[7]=abs(s[8]*27-s[4]*5d)*27%9+30
s[4]=abs(s[5]*a4+s[3]*2f)*4a%9+30
s[1]=abs(s[0]*35-s[1]*23)*35%9+30
4.9位数字串s即为注册码
于是写出注册机:
keygen_irfanview(char *name)
{
DWORD sum=0;
DWORD p[7]=
{
1000000,100000,10000,1000,100,10,1
};
BYTE s[10];
int i;
for(i=0;i<strlen(name);i++)
{
sum+=(DWORD)name[i];
}
sum=0x1d8*(0x14c+(DWORD)abs((signed long)sum-260));
for (i=0;i<6;i++)
{
s[i]=(sum%p[i])/p[i+1]+0x30;
}
s[8]=s[5],s[5]=s[3],s[3]=s[2],s[2]=s[1],s[6]=s[4];
s[7]=(DWORD)abs((signed long)(s[8]*0x27)-(signed long)(s[4]*0x5d))*0x27%9+0x30;
s[4]=(DWORD)abs((signed long)(s[5]*0xa4)+(signed long)(s[3]*0x2f))*0x4a%9+0x30;
s[1]=(DWORD)abs((signed long)(s[0]*0x35)-(signed long)(s[1]*0x23))*0x35%9+0x30;
s[9]=0;
printf("key is %s",(char*)s);
}
注册信息:
name: whm
code: 119036808
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法