?? unttqqwry.pas
字號:
unit untTQQWry;
{作者BLOG ALALMN JACK http://hi.baidu.com/alalmn
遠程控制和木馬編寫群30096995 }
interface
uses
Windows, SysUtils, Classes, StrUtils, Controls, Math;
const //用于內存文件映射標志
QQWryMapFileTag = 'QQWryMapFile';
type
TQQWry = class(TObject)
public
constructor Create(AQQWryFileName: string);
destructor Destroy; override;
function GetQQWryFileName: string;
function GetQQWryFileSize: int64;
function GetIPDataNum: int64;
function GetQQWryDate: TDate;
function GetQQWryDataFrom: string;
procedure GetIPDataByIPRecordID(IPRecordID: int64; var IPData: PChar); overload;
procedure GetIPLocationByEndIPOffset(EndIPOffset: int64; var IPLocation: PChar);
procedure GetIPDataByIPRecordID(IPRecordID: int64; var IPData: TStringlist); overload;
function GetIPValue(IP: string): int64;
function GetIPDataID(IP: string): int64;
function ExtractIPDataToTxtFile(ATxtFileName: string): integer;
private
QQWryFileName: string;
QQWryFileSize: int64;
IPDataNum: int64;
FirstIPIndexOffset, LastIPIndexOffset: integer;
hQQWryFile, hQQWryMapFile: THandle;
pQQWryMapFile: Pointer;
pQQWryPos: PByte;
function GetFileSize(AFileName: string): int64;
end;
implementation
///**
//* 獲取文件大小
//* @param (AFileName) (文件全名)
//* @return (文件大小)
//*/
function TQQWry.GetFileSize(AFileName: string): int64;
var
FileStream: TFileStream;
begin
try
FileStream:=TFileStream.Create(AFileName, fmOpenRead);
except
raise Exception.Create(format('文件 %s 無法打開!', [AFileName]));
exit;
end;
result:=FileStream.Size;
FileStream.Free;
end;
///**
//* 構造函數(shù),構造一個TQQWry即純真IP數(shù)據(jù)庫處理對象
//* @param (AQQWryFileName) (純真IP數(shù)據(jù)庫文件的全文件名)
//* @return 無
//*/
constructor TQQWry.Create(AQQWryFileName: string);
var
Buffer: TOFStruct;
begin
inherited Create;
try
QQWryFileName:=AQQWryFileName;
//測文件存在
if not FileExists(QQWryFileName) then
raise Exception.Create(format('文件 %s 不存在!', [QQWryFileName]));
//測文件大小
QQWryFileSize:=GetFileSize(QQWryFileName);
if QQWryFileSize=0 then
raise Exception.Create(format('文件 %s 大小為空!', [QQWryFileName]));
//打開文件句柄
hQQWryFile:=OpenFile(PChar(QQWryFileName),
Buffer,
OF_READWRITE);
if hQQWryFile=-1 then
raise Exception.Create(format('文件 %s 不能打開!', [QQWryFileName]));
//創(chuàng)建文件映像對象
hQQWryMapFile:=CreateFileMapping(hQQWryFile,
nil,
PAGE_READWRITE,
0,
QQWryFileSize,
PChar(QQWryMapFileTag));
if hQQWryMapFile=0 then begin
CloseHandle(hQQWryFile);
raise Exception.Create('不能創(chuàng)建內存映象文件!');
end;
//獲取映象文件映射地址
pQQWryMapFile:=MapViewOfFile(hQQWryMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
if pQQWryMapFile=nil then begin
CloseHandle(hQQWryFile);
CloseHandle(hQQWryMapFile);
raise Exception.Create('不能獲取文件映射地址!');
end;
pQQWryPos:=pQQWryMapFile;
FirstIPIndexOffset:=PInteger(pQQWryPos)^;
Inc(pQQWryPos, 4);
LastIPIndexOffset:=PInteger(pQQWryPos)^;
IPDataNum:=(LastIPIndexOffset - FirstIPIndexOffset) div 7 + 1;
except
on E: Exception do begin
raise Exception.Create(E.Message);
exit;
end;
end;
end;
///**
//* 析構函數(shù) (釋放TQQWry對象,關閉文件映射,關閉文件映像對象句柄,關閉文件句柄)
//* @param 無
//* @return 無
//*/
destructor TQQWry.Destroy;
begin
if pQQWryMapFile<>nil then UnMapViewOfFile(pQQWryMapFile); //關閉文件映射
if hQQWryMapFile<>0 then CloseHandle(hQQWryMapFile); //關閉文件映像對象句柄
if hQQWryFile<>0 then CloseHandle(hQQWryFile); //關閉文件句柄
inherited Destroy;
end;
///**
//* 獲取純真IP數(shù)據(jù)庫文件的全文件名
//* @param 無
//* @return (純真IP數(shù)據(jù)庫文件的全文件名)
//*/
function TQQWry.GetQQWryFileName: string;
begin
Result:=QQWryFileName;
end;
///**
//* 獲取純真IP數(shù)據(jù)庫文件大小
//* @param 無
//* @return (純真IP數(shù)據(jù)庫文件大小)
//*/
function TQQWry.GetQQWryFileSize: int64;
begin
Result:=QQWryFileSize;
end;
///**
//* 獲取純真IP數(shù)據(jù)庫內含有的IP地址信息記錄數(shù)
//* @param 無
//* @return (純真IP數(shù)據(jù)庫記錄數(shù))
//*/
function TQQWry.GetIPDataNum: int64;
begin
Result:=IPDataNum;
end;
///**
//* 獲取當前QQIP數(shù)據(jù)庫的更新日期
//* @param 無
//* @return QQIP當前數(shù)據(jù)庫的更新日期 TDate
//*/
function TQQWry.GetQQWryDate: TDate;
var
DateString: string;
IPData: TStringlist;
begin
IPData:=TStringlist.Create;
GetIPDataByIPRecordID(GetIPDataNum, IPData);
DateString:=IPData[3];
IPData.Free;
DateString:=copy(DateString, 1, pos('IP數(shù)據(jù)', DateString) - 1);
DateString:=StringReplace(DateString, '年', '-', [rfReplaceAll, rfIgnoreCase]);
DateString:=StringReplace(DateString, '月', '-', [rfReplaceAll, rfIgnoreCase]);
DateString:=StringReplace(DateString, '日', '-', [rfReplaceAll, rfIgnoreCase]);
Result:=StrToDate(DateString);
end;
///**
//* 獲取當前QQIP數(shù)據(jù)庫的來源信息
//* @param 無
//* @return 當前QQIP數(shù)據(jù)庫的來源信息 string
//*/
function TQQWry.GetQQWryDataFrom: string;
var
FromString: string;
IPData: TStringlist;
begin
IPData:=TStringlist.Create;
GetIPDataByIPRecordID(GetIPDataNum, IPData);
FromString:=IPData[2];
IPData.Free;
Result:=FromString;
end;
///**
//* 給定一個IP地址信息記錄號,返回該項記錄的信息
//* @param (IPRecordID, IPData) (IP地址信息記錄號, 返回的該條信息:①起始IP 15字節(jié) ②結束IP 15字節(jié) ③國家 ④地區(qū) ⑤回車鍵2字節(jié))
//* @return 無
//*/
procedure TQQWry.GetIPDataByIPRecordID(IPRecordID: int64; var IPData: PChar);
var
EndIPOffset: integer;
i: integer;
pBlank, pReturn: PChar;
IPByteStr: string;
IPByteStrLen: integer;
IPDataPos: integer;
IPLocation: PChar;
begin
try
if (IPRecordID<=0) or (IPRecordID>GetIPDataNum) then
raise Exception.Create('IP信息記錄號過小或越界!');
pBlank:=' ';
pReturn:=#13#10;
EndIPOffset:=0;
//取內存文件映射首地址
pQQWryPos:=pQQWryMapFile;
//根據(jù)記錄的ID號移到該記錄號的索引處,因為高位在后所以從后往前讀
Inc(pQQWryPos, FirstIPIndexOffset + (IPRecordID - 1) * 7 + 3);
//取始末IP地址
//索引的前4個字節(jié)為該條記錄的起始IP地址
IPDataPos:=0;
for i:=0 to 3 do begin
IPByteStr:=IntToStr(pQQWryPos^);
IPByteStrLen:=Length(IPByteStr);
CopyMemory(@IPData[IPDataPos], PChar(IPByteStr), IPByteStrLen);
Inc(IPDataPos, IPByteStrLen);
if i<>3 then begin
IPData[IPDataPos]:='.';
Inc(IPDataPos);
end;
dec(pQQWryPos);
end;
//填充空格至16位
CopyMemory(@IPData[IPDataPos], pBlank, 16-IPDataPos);
IPDataPos:=16;
Inc(pQQWryPos, 5);
//后3個字節(jié)是該條記錄的內容區(qū)域的偏移值,內容區(qū)域的前4個字節(jié)為該條記錄的結束IP地址
CopyMemory(@EndIPOffset, pQQWryPos, 3);
//取該條記錄的結束IP地址
pQQWryPos:=pQQWryMapFile;
Inc(pQQWryPos, EndIPOffset + 3);
for i:=0 to 3 do begin
IPByteStr:=IntToStr(pQQWryPos^);
IPByteStrLen:=Length(IPByteStr);
CopyMemory(@IPData[IPDataPos], PChar(IPByteStr), IPByteStrLen);
Inc(IPDataPos, IPByteStrLen);
if i<>3 then begin
IPData[IPDataPos]:='.';
Inc(IPDataPos);
end;
dec(pQQWryPos);
end;
//填充空格至16位
CopyMemory(@IPData[IPDataPos], pBlank, 32-IPDataPos);
IPDataPos:=32;
//取該條記錄的國家地區(qū)信息
IPLocation:=PChar(@IPData[IPDataPos]);
GetIPLocationByEndIPOffset(EndIPOffset, IPLocation);
//結尾的回車
if IPLocation[StrLen(IPLocation) - 1]<>' ' then
Inc(IPDataPos, StrLen(IPLocation))
else
Inc(IPDataPos, StrLen(IPLocation) - 1);
CopyMemory(@IPData[IPDataPos], pReturn, 2);
except
on E: Exception do begin
Destroy;
raise Exception.Create(E.Message);
exit;
end;
end;
end;
///**
//* 給定一條記錄的結束IP地址的偏移,返回該條記錄的國家地區(qū)信息
//* @param (EndIPOffset, IPLocation) (該條記錄的結束IP地址偏移, 該條記錄的國家地區(qū)信息)
//* @return 無
//*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -