标 题:Advanced
Pic Hunter v1.55 注册机C语言源代码
发信人:cnbragon
时 间:2004-08-18,13:47
详细信息:
Advanced Pic Hunter 图片猎手
官方主页:http://www.seamoontech.com/
软件简介:从因特网上搜索,下载图片的工具,并可浏览或播放多种格式文件等。使用多线程方式自动搜索和下载。网络上有成百上千的图片,而人们常想将一些漂亮的图片下载到本地来供以后使用。当然您可以一页一页的浏览网页然后一张一张的另存来达到目的,但这种方法显然是非常耗时的。海月图片猎手就是为了解决这个问题而诞生的。海月图片猎手将访问并分析您所指定的网站或页面的结构,把其中的图片如GIF和JPEG等快速地下载到本地来。成百上千的图片很快即可下载完毕,远非人工所能比拟。
----------------------------------
该软件启动时弹出注册窗口,注册后要求重启验证,信息保存在
HKCU\Software\SeaMoonTech\Advanced Pic Hunter\Settings
"RegName"="Your RegName"
"SearchNum"="Your RegCode"
-------------------------------------------------------------------
呵呵,小弟初学破解,这是一个上午的劳动成果, 算法很简单
用C语言写了个注册机,程序写的不起眼,放上来只是交流,请不吝赐教 ^_*
#include <stdio.h>
void main()
{
int leng,j,k,a,b,c,l;
int i=0;
int s[52]; /* The Array of the serial num */
char n[50]; /* ******Your RegName****** */
char t[]="seamoon";
printf("Please input Your Name:");
scanf("%s",n);
while(n[i]!='\0') i++;
leng=i;
for(k=0;k<leng;k++)
{
l=k%7;
a=t[l]+8;
a+=k*2;
b=a+n[k];
s[k]=b%9;
}
printf("\n\t Your RegCode is : ");
for(j=leng-1;j>=0;j--) printf("%d",s[j]);
c=(leng+77)%9;
printf("%d",c);
}
标 题:
发信人:cnbragon
时 间:2004-08-18,13:56
详细信息:
参考了 lovefire[BCG] 兄的文章 :P
“直接用 OD 装入程序。载入完成后,在 CPU 窗口中右击,选择“搜索”->“字串参考”,然后在出现的窗口中搜索 SearchNum,一共有两处,分别下断点。” (呵呵,lovefire的原话)
其实可以直接在这个地方下断:
00406836 . 8BCE mov ecx,esi ; |
00406838 . 889C24 5C010000 mov byte ptr ss:[esp+15C],bl ; |
0040683F . E8 9C090000 call PicHunte.004071E0 ; \这个CALL就是注册算法Call
呵呵,笔记比较乱,整理了一下,
004072EB |> /8B8424 F0000000 /mov eax,dword ptr ss:[esp+F0] ; 用户名入eax cnbragon
004072F2 |. |BD 07000000 |mov ebp,7 ; ebp=7
004072F7 |. |8A1C01 |mov bl,byte ptr ds:[ecx+eax] ; 取c的ascii值的hex63=>eax
|1)第一次ecx=0,所以就取用户名的第一个字符c=>bl ascii 99(d)
|2)第二次ecx=1,所以就取用户名的第二个字符n=>bl ascii 110(d)
|3)..三..ecx=2,..................三......b=>bl ascii 98(d)
|4)..四..ecx=3,..................四......r=>bl ascii 114(d)
004072FA |. |8BC1 |mov eax,ecx
|1) ecx=>eax=0;
|2) ecx=>eax=1;
|3) ecx=>eax=2;
|4) ecx=>eax=3
004072FC |. |99 |cdq
004072FD |. |F7FD |idiv ebp ; eax/=7
|1) eax=0 ,edx=0
|2) eax=0 ,edx=1
|3) eax=0 ,edx=2
|4) eax=0 ,edx=3
004072FF |. |0FBEC3 |movsx eax,bl ;
|1) eax=c
|2) eax=n
|3) eax=b
|4) eax=r
00407302 |. |BB 09000000 |mov ebx,9 ; ebx=9
00407307 |. |0FBE5414 10 |movsx edx,byte ptr ss:[esp+edx+10] ; 从"seamoon"中取对应字符
|1)第一次edx=0,所以第一次取得是's' s=>edx=115
|2)第二次edx=1,所以第二次取得是'e' e=>edx=101
|3)..三..edx=2,......三........'a' a=>edx=97
|4)..四..edx=3,......四........'m' m=>edx=109
0040730C |. |03D6 |add edx,esi ; edx=edx+esi,esi是注册名长度8
|1)edx=115+8=123 (d)
|2)edx=101+8=109 (d)
|3)edx=97+8=105 (d)
|3)edx=109+8=117 (d)
0040730E |. |8D144A |lea edx,dword ptr ds:[edx+ecx*2]
|1)第一次ecx=0,所以还是把123给edx
|2)第二次ecx=1,所以把edx+2=>edx=111
|3)..三..ecx=2,......edx+4=>edx=109
|3)..四..ecx=3,......edx+6=>edx=123
00407311 |. |03C2 |add eax,edx ;
|1)第一次呢是99+123=222(d)
|2)第二次呢是eax=eax+edx=110+111=221
|3)..三......eax=eax+edx=98+109=207
|4)..四......eax=eax+edx=114+123=237
00407313 |. |99 |cdq
00407314 |. |F7FB |idiv ebx ; eax/=9 edx%=9
|1)edx=6 倒数第二位注册码
|2)edx=5 ......三........
|3)edx=0 ......四........
|4)edx=3 ......五........
00407316 |. |80C2 30 |add dl,30 ; 好,余数就是对应的注册码65038774(倒过来:))
00407319 |. |41 |inc ecx ; ecx++
0040731A |. |8817 |mov byte ptr ds:[edi],dl ; 送edi指向的地方
0040731C |. |4F |dec edi ; edi-1
0040731D |. |3BCE |cmp ecx,esi ; 有没有取完,呵呵
0040731F |.^\7C CA \jl short PicHunte.004072EB
//这段代码是用 用户名 和 "seamoon"进行运算
//本人表达能力有限,:(,还是看我的程序吧:P
00407323 |> \8D46 4D lea eax,dword ptr ds:[esi+4D] ; esi中是注册名长度,所以这里是取注册名长度+4D
00407326 |. B9 09000000 mov ecx,9 ; ecx=9
0040732B |. 99 cdq
0040732C |. F7F9 idiv ecx ; eax/=ecx(9) edx为余数
0040732E |. 8B8424 EC000000 mov eax,dword ptr ss:[esp+EC] ; 假码入eax
00407335 |. 80C2 30 add dl,30 ; 余4 这个是注册码的最后一位
00407338 |. 885434 10 mov byte ptr ss:[esp+esi+10],dl
0040733C |. C64434 11 00 mov byte ptr ss:[esp+esi+11],0 ; 0也送过去?
00407341 |. 8D7424 10 lea esi,dword ptr ss:[esp+10] ; 这个就是真码了