首页
社区
课程
招聘
[原创]仿天易love读狂牛Key工具源码
发表于: 2012-11-13 21:36 11328

[原创]仿天易love读狂牛Key工具源码

2012-11-13 21:36
11328

这几天,网上下载了些视频教程学习,一运行才发现需要密码,以前也见过类似的EXE视频文件,但大都是加的穿山甲等等神么的壳,穿山甲大家研究的多了,所以相关的帮助教程也较多,无非就是将双进程变为单进程然后将壳脱去就能正确播放了或者是有正确的KEY直接Patch机器码等。但这次遇到的用Peid查壳,发现是Visual C++,再细看一下区段,发现好多不知名的东东,用ExeScope查看下资源,发现了一些信息:狂牛视频加密。以前没碰到过这东东,所以也无从下手,就来论坛里搜索下吧,发现坛子里的天易Love兄研究的较多,于是就下载了天易兄的工具也小试一下老版本的吧,不曾想在我的Win7下及虚拟机XP下运行后均出现乱码,如图:



再看看天易兄的文章,提到是用的硬编码,百度了一下,发现硬编码这东西貌似很难,无奈了,怎么办?从天易兄的文章中得到一些指导,索性自己写一个吧,仔细拜读了天易兄的文章,再加上他的工具,获得了很多有用的信息:工具的原理:1.获取所有进程;2.选择需要读KEY的狂牛视频进程,遍历内存,找到加密KEY所在的内存地址3.读取这段内存中的值(当然这里搜索到的可能不止一处,但如果是精确搜索的话,出来的有两处,并且值是一样的,那么取其中一个就行了),然后与84(16进制值)进行异或,然后转为Asc字符串就是所需要的KEY了。我大致的理解是这样的,或许天易兄的工具在进行内存定位这一块有更加好的方法,我这方法比较笨。于是,就写了个类似的工具,代码如下:

unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ComCtrls,
  uProcessUtils,StrUtils;

type
  TMainFrm = class(TForm)
    GroupBox1: TGroupBox;
    btnRefresh: TButton;
    btnReadKey: TButton;
    Edit1: TEdit;
    ListBox1: TListBox;
    btnEnumProcess: TButton;
    GroupBox2: TGroupBox;
    edtAscStr: TEdit;
    edtHexStr: TEdit;
    btnGetAsc: TButton;
    btnAsc2Hex: TButton;
    edtDestStr: TEdit;
    btnGetKey: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure btnReadKeyClick(Sender: TObject);
    procedure btnEnumProcessClick(Sender: TObject);
    procedure btnGetAscClick(Sender: TObject);
    procedure btnAsc2HexClick(Sender: TObject);
    procedure btnGetKeyClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  MainFrm: TMainFrm;
implementation

{$R *.dfm}


procedure TMainFrm.btnAsc2HexClick(Sender: TObject);
var
   XorStr,HexStr : AnsiString;
   nLen,i,ordValue : Integer;
   chrArr : array of AnsiChar;
begin
    XorStr := 'wP%';
    nLen := Length(XorStr);
    SetLength(chrArr,nLen);
    for i:=1 to nLen do
    begin
        //chrArr[i] :=
        ordValue := Ord(XorStr[i]);
        HexStr := HexStr+IntToHex(ordValue,2);
    end;
    edtHexStr.Text := HexStr;
end;

procedure TMainFrm.btnEnumProcessClick(Sender: TObject);
begin
    //MemHandle.GetProcList;
    //GetKeyAddress('password=');
end;

procedure TMainFrm.btnGetAscClick(Sender: TObject);
var
   i     : Integer;
   hexStr,ascStr,tempStr,XorStr,s1,s2 : AnsiString;

begin
    hexStr := edtHexStr.Text;
    for i := 0 to (Length(hexStr)-1) div 2 do
    begin
        tempStr := '$'+ Copy(hexStr,i*2,2);
        ascStr := ascStr + Chr(StrToInt(tempStr));
    end;
    edtAscStr.Text := ascStr;
end;

procedure TMainFrm.btnGetKeyClick(Sender: TObject);
var
   XorStr,tempStr,hexStr : string;
   i ,nLen: Integer;
begin
   hexStr := '71F7DFA23E2F522093311B48FDA8A220077DD976ADE13';
   nLen := Length(hexStr);
   for i := 0 to ((nLen-1) div 2) do
   begin
       tempStr := '$'+AnsiMidStr(hexStr,i*2,2);
       //tempStr := '$'+ Copy(hexStr,i*2,2);
       XorStr := XorStr+Chr(StrToInt(tempStr) xor $84);
   end;
   edtDestStr.Text := XorStr;
end;

procedure TMainFrm.btnReadKeyClick(Sender: TObject);
var
   processID : Integer;
   keyStr : string;
   exeName : string;
begin
   if ListBox1.ItemIndex = -1 then
   begin
      Exit;
   end;
   processID := GetProcessID(ListBox1.Items.Strings[ListBox1.ItemIndex]);
   keyStr := ReadKey(processID);
   Edit1.Text := keyStr;
end;

procedure TMainFrm.btnRefreshClick(Sender: TObject);
var
   processList : TStringList;
   i : Integer;
begin
   //processList := TStringList.Create;
   ListBox1.Items.Clear;
   processList := GetProcessList();
   for i:=0 to processList.Count-1 do
   begin
      ListBox1.Items.Add(processList.Strings[i]);
   end;
end;

procedure TMainFrm.FormCreate(Sender: TObject);
var
   processList : TStringList;
   i : Integer;
begin
   //processList := TStringList.Create;
   ListBox1.Items.Clear;
   processList := GetProcessList();
   for i:=0 to processList.Count-1 do
   begin
      ListBox1.Items.Add(processList.Strings[i]);
   end;
end;

procedure TMainFrm.ListBox1Click(Sender: TObject);
begin
    //Edit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];

end;

end.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (13)
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
2
这是什么语言写的?
看不懂呢
2012-11-13 22:56
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
delphi
2012-11-13 23:12
0
雪    币: 257
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
为delphi顶个
2012-11-14 00:07
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
什么的什么的什么啊??什么读牛KEY啊??晕了..不懂是干嘛的..

怪不得贴了一大片代码.版主没给精华..哈哈哈..
2012-11-14 05:40
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
我也是一看到delphi代码就郁闷
2012-11-14 07:43
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
你这是刺激版主呢还是刺激我呢,呵呵!版主一急给我加个精华去了,呵呵!不过这也算不上精华,很简单的代码而已。
2012-11-15 09:21
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
8
MemSearch单元在哪里?
2012-11-15 09:34
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
在软件开发过程中,文档还是很重要,方便大家沟通交流。此帖先设关注,等有文字说明再调整。
2012-11-16 11:33
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
10
我的源代码简直和楼主的没法比,显然楼主是完全吃透了那个工具的原理。
2012-11-16 12:56
0
雪    币: 510
活跃值: (433)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
为开源来顶。
2012-11-16 22:24
0
雪    币: 107
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
同为delphier,顶
2012-11-17 09:01
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
delphi看的少,,,眼花缭乱
2013-7-22 10:52
0
雪    币: 198
活跃值: (131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不会delphi路过,有工具就好了!
2013-8-4 11:26
0
游客
登录 | 注册 方可回帖
返回
//