-
-
[转贴]发一个以前写的模拟dll的代码,保存成.dpr可以直接用delphi编译
-
2004-9-7 13:18
4062
-
[转贴]发一个以前写的模拟dll的代码,保存成.dpr可以直接用delphi编译
原贴地址:
http://www.exetools.com/forum/showthread.php?t=5261
{
Do not modify / remove this copyright notice
Copyright(C) 2004 by parker
Description: Sense KeyPro DLL Emulator
Version: 1.10
Last Update: 2004-2-22
}
library KeyProEmu;
uses
Windows;
const
//功能码
KeyAPIReadMemory = $00; //读狗数据
KeyAPIWriteMemory = $01; //写狗数据
KeyAPISetPassword = $02; //设置密码
KeyAPIRemoveDriver = $03; //卸载驱动
//返回值
APISuccess = $00; //调用成功
APIAddressOverflow = $01; //软件狗数据地址越界
APIInvalidFunction = $02; //调用功能码非法
APINoKeyPro = $03; //软件狗未找到或密码不对
APINoKeyDriver = $0F; //软件狗驱动未安装
//一些常量
KeyMemFile = '.\KeyData.dat'; //记录软件狗数据的文件,128字节
MemSize = $40; //文件长度单位是Word
KeyMemSize = $3C; //狗数据长度单位是Word
Pass0 = $3C; //密码0在文件中的位置
Pass1 = $3D; //密码1在文件中的位置
Ext0 = $3E; //扩展数据0文件中的位置
Ext1 = $3F; //扩展数据1文件中的位置
type
pKeyproData=^KEYPRODATA; //指向KEYPRODATA结构体的指针
KEYPRODATA=record //结构体变量
ReturnFlag: Word; //返回值
FunctionCode: Word; //功能码
MemAddress: Word; //数据地址
Password0: Word; //密码0
Password1: Word; //密码1
MemContent: Word; //读出的数据或者要写入数据
Lock0: Word; //修改密码时填写,新密码0
Lock1: Word; //修改密码时填写,新密码1
Reserved: array[$0..$1F] of Word; //保留
end;
var
TKeyMem: array [$0..MemSize - 1] of Word; //存放软件狗数据的数组
{载入DLL时做的初始化动作,读取记录软件狗数据的文件,放入数组KeyMem中}
procedure DLLEnter;
var
hFile,Count: Cardinal;
begin
hFile:=CreateFile(KeyMemFile,GENERIC_READ,FILE_SHARE_READ,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
ReadFile(hFile, TKeyMem, SizeOf(TKeyMem), Count,nil);
CloseHandle(hFile);
end;
{卸载DLL时做的收尾动作,把数组KeyMem中的内容,保存到记录软件狗数据的文件}
procedure DLLExit(const Reason:Integer);
var
hFile,Count:Cardinal;
begin
if Reason=DLL_PROCESS_DETACH then //在卸载DLL时才进行保存动作
begin
hFile:=CreateFile(KeyMemFile,GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(hFile, TKeyMem, SizeOf(TKeyMem), Count,nil);
CloseHandle(hFile);
end;
end;
{模拟读取软件狗数据的功能}
procedure ReadMemory(const Stru:pKeyproData);
begin
if Stru.MemAddress<KeyMemSize then //判断要读取的狗数据的地址是否越界
begin
Stru.MemContent:=TKeyMem[Stru.MemAddress];
Stru.ReturnFlag:=APISuccess;
end
else begin
Stru.ReturnFlag:=APIAddressOverflow; //地址越界
end;
end;
{模拟写入软件狗数据的功能}
procedure WriteMemory(const Stru:pKeyproData);
begin
if Stru.MemAddress<KeyMemSize then //判断要写入的狗数据的地址是否越界
begin
TKeyMem[Stru.MemAddress]:=Stru.MemContent;
Stru.ReturnFlag:=APISuccess;
end
else begin
Stru.ReturnFlag:=APIAddressOverflow; //地址越界
end;
end;
{模拟设置软件狗密码的功能}
procedure SetPassword(const Stru:pKeyproData);
begin
TKeyMem[Pass0]:=Stru.Lock0;
TKeyMem[Pass1]:=Stru.Lock1;
Stru.ReturnFlag:=APISuccess;
end;
{模拟卸载软件狗驱动的功能}
procedure RemoveDriver(const Stru:pKeyproData);
begin
Stru.ReturnFlag:=APISuccess;
end;
{设置KeyproData结构体的元素的数据,主要供FoxPro使用}
procedure PutData(const Data:Word;const Stru:Integer;const Pos:Integer);stdcall;export;
var
StruData:^Word;
begin
StruData:=Pointer(Stru+Pos);
StruData^:=Data;
end;
{读取KeyproData结构体的元素的数据,主要供FoxPro使用}
function GetData(const Stru:Integer;const Pos:Integer):Integer;stdcall;export;
var
StruData:^Word;
begin
StruData:=Pointer(Stru+Pos);
Result:=StruData^;
end;
{模拟对软件狗的所有操作}
procedure KEYPRO(const Stru:pKeyproData);stdcall;export;
begin
if TKeyMem[Ext0]=0 then //设置是否模拟软件狗的比较密码功能
begin //扩展数据为0时比较密码,为非0时不比较
if (Stru.Password0<>TKeyMem[Pass0]) or (Stru.Password1<>TKeyMem[Pass1]) then
begin
Stru.ReturnFlag:=APINoKeyPro; //密码错误
Exit;
end;
end;
case Stru.FunctionCode of //根据功能码选择模拟的功能
KeyAPIReadMemory: ReadMemory(Stru);
KeyAPIWriteMemory: WriteMemory(Stru);
KeyAPISetPassword: SetPassword(Stru);
KeyAPIRemoveDriver: RemoveDriver(Stru);
else
begin
Stru.ReturnFlag:=APIInvalidFunction; //功能码错误
end;
end;
end;
exports
PutData,
GetData,
KEYPRO;
begin
DLLProc:=@DLLExit;
DLLEnter;
end.
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法