- 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 编辑 ] |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |