- UID
- 4300
注册时间2005-11-4
阅读权限40
最后登录1970-1-1
独步武林
TA的每日心情 | 开心 2022-7-9 18:18 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
|
今天我发这个帖子完全是模仿
https://www.chinapyg.com/viewthr ... &extra=page%3D2
这位仁兄的作品。毫无技术可言。主要是提醒象我一样的菜菜们在跟踪软件的时候一定要细心。
或者说是在编写程序的时候- -!
具体跟踪过程略去不提。这个程序可以下BP RegQueryInfoKeyA 运行三次后看堆栈提示pass比较可疑。F8+F7小心跟踪。我们发现程序从注册表里
取出我们填入的注册码(高手所说的假码。。想当初俺理解什么是假码用了一天 - -!);单步AND单步,我们忽然发现了硬件信息
其实程序是用了GetDiskFreeSpace这个函数经过一个计算过程(- -!没跟踪猜的)得出的。继续走下去忽然发现程序的真码出现了。
OK,在上面的call上下断重新运行程序。并清楚api断点。这次我们直接断在call上。F7跟进,一步步我们会发现程序依次取硬件码的
ascii码的hex值,我的问题就出在这里我一看到那几个熟悉的数字,直觉告诉我这是在循环取ascii码呢!!接下来程序把取得的注册码
连接成字符串然后翻转这个字符串。
我这里的结果为
1573E44393142563 结果记位 v1
传入固定字符串 service456ei878 结果记为 v2
取v2的前4位结果记为T1
取v1的前4位结果记为T2
取v2的5-9位结果记为T3
取V1的5-8位结果记为T4
注册码=T1-T2-T3-T4
将
硬件码,注册码,DATA(未跟踪,怀疑为当前日期)保存至HKEY_LOCAL_MACHINE\SOFTWARE\vt\service
删除后可继续研究
附上 delphi的注册机源码- unit Unit1;
- inte**ce
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs,strutils, StdCtrls;
- type
- Tmain = class(TForm)
- sr: TEdit;
- Label1: TLabel;
- xs: TEdit;
- Button1: TButton;
- ss: TLabel;
- Label2: TLabel;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- main: Tmain;
- implementation
- {$R *.dfm}
- function getasc(s:string):string;
- var
- len,i:integer;
- asc1,mm:string;
- begin
- len:=length(s);
- for i:=1 to len do
- begin
- asc1:=inttohex(byte(s[i]),2);
- mm:=mm+asc1
- end;
- result:=mm;
- end;
- procedure Tmain.Button1Click(Sender: TObject);
- var
- numstr,mynum,mystr,sastr,t1,t2,t3,t4:string;
- begin
- mynum:=trim(main.sr.Text);
- mystr:=getasc(mynum);
- sastr:='service456ei878';
- numstr:=reversestring(mystr);
- t1:=copy(sastr,0,4);
- t2:=copy(numstr,0,4);
- t3:=copy(sastr,5,5);
- t4:=copy(numstr,5,4);
- xs.Text:=t1+'-'+t2+t3+'-'+t4;
- end;
- end.
复制代码 另:我在写程序的时候自定义了一个取字符串ascii码的函数。细心的朋友应该注意到了我上面说过我在那个地方以为程序是把
硬件码的ascii码直接翻转的其实程序于是我一开始是这么写的- function getasc(s:string):string;
- var
- len,i:integer;
- asc1,mm:string;
- begin
- len:=length(s);
- for i:=1 to len do
- begin
- asc1:=inttostr(byte(s[i]));
- mm:=mm+asc1
- end;
- result:=mm;
- end;
复制代码 当我看到我的结果不对的时候满世界的找答案问别人我这样写取ascii码正确不。。。- -!其实我的函数和我的问题搭配来看是
没错的。在判断问题的时候有时候太主观也是个障碍。。。希望大家记住我的教训。
[ 本帖最后由 笨鸟我先飞 于 2008-9-7 21:54 编辑 ] |
评分
-
查看全部评分
|