飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2606|回复: 1

[原创] 成员区软件学习(教训啊,我的粗心)

[复制链接]
  • TA的每日心情
    开心
    2022-7-9 18:18
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2008-9-7 21:48:52 | 显示全部楼层 |阅读模式
    今天我发这个帖子完全是模仿
    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的注册机源码
    1. unit Unit1;

    2. inte**ce

    3. uses
    4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    5.   Dialogs,strutils, StdCtrls;

    6. type
    7.   Tmain = class(TForm)
    8.     sr: TEdit;
    9.     Label1: TLabel;
    10.     xs: TEdit;
    11.     Button1: TButton;
    12.     ss: TLabel;
    13.     Label2: TLabel;
    14.     procedure Button1Click(Sender: TObject);
    15.   private
    16.     { Private declarations }
    17.   public
    18.     { Public declarations }
    19.   end;

    20. var
    21.   main: Tmain;

    22. implementation

    23. {$R *.dfm}
    24. function getasc(s:string):string;
    25. var
    26. len,i:integer;
    27. asc1,mm:string;
    28. begin
    29. len:=length(s);
    30. for i:=1 to len do
    31. begin
    32. asc1:=inttohex(byte(s[i]),2);
    33. mm:=mm+asc1
    34. end;
    35. result:=mm;
    36. end;

    37. procedure Tmain.Button1Click(Sender: TObject);
    38. var
    39. numstr,mynum,mystr,sastr,t1,t2,t3,t4:string;
    40. begin
    41.      mynum:=trim(main.sr.Text);
    42.      mystr:=getasc(mynum);
    43.      sastr:='service456ei878';
    44.      numstr:=reversestring(mystr);
    45.      t1:=copy(sastr,0,4);
    46.      t2:=copy(numstr,0,4);
    47.      t3:=copy(sastr,5,5);
    48.      t4:=copy(numstr,5,4);
    49.      xs.Text:=t1+'-'+t2+t3+'-'+t4;
    50. end;

    51. end.
    复制代码
    另:我在写程序的时候自定义了一个取字符串ascii码的函数。细心的朋友应该注意到了我上面说过我在那个地方以为程序是把
    硬件码的ascii码直接翻转的其实程序于是我一开始是这么写的
    1. function getasc(s:string):string;
    2. var
    3. len,i:integer;
    4. asc1,mm:string;
    5. begin
    6. len:=length(s);
    7. for i:=1 to len do
    8. begin
    9. asc1:=inttostr(byte(s[i]));
    10. mm:=mm+asc1
    11. end;
    12. result:=mm;
    13. end;
    复制代码
    当我看到我的结果不对的时候满世界的找答案问别人我这样写取ascii码正确不。。。- -!其实我的函数和我的问题搭配来看是
    没错的。在判断问题的时候有时候太主观也是个障碍。。。希望大家记住我的教训。

    [ 本帖最后由 笨鸟我先飞 于 2008-9-7 21:54 编辑 ]

    评分

    参与人数 1威望 +24 收起 理由
    magic659117852 + 24 感谢分享

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-9-8 10:15:54 | 显示全部楼层
    /:001 类似算法的软件N多~~~  但暗桩也N多
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表