问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Dlephi中调用DLL的相关问题

发布网友 发布时间:2023-01-12 00:58

我来回答

1个回答

热心网友 时间:2023-10-30 02:57

dlephi的

**********************************************************************************
DLL文件说明:
**********************************************************************************

library Project2;
uses
SysUtils, //应用单元
Classes,
windows;

procere Log(dwReason:DWord); //要输入的函数,参数必须要dwReason:DWord 注意:尽量不用stdcall关键字
var
i:integer;
begin
for i:=0 to 5 do begin
MessageBox(0,'已经被注入,时间5秒,'0',16);
sleep(1000);
end;
ExitProcess(0);
end;

exports //输入的函数名
Log;

begin //DLL的初始化区域内容

DllProc := @Log; //DllProc是本Dll的首地址,将要注入的函数地址赋给他
Log(DLL_PROCESS_ATTACH); //函数的参数必须是:DLL_PROCESS_ATTACH

end.

***********************************************************************************
注入线程代码函数
***********************************************************************************

//-----------------------------------------获得相应应用程序的PID---------------

procere GetMyProcessID(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
//参数:进程名,false(不继承),传入的参数(返回值的参数)
var
lppe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
begin
ProcessID :=0;

SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);

lppe.dwSize := sizeof(TProcessEntry32);
FoundAProc := Process32First(Sshandle, lppe);
while FoundAProc do
begin

if PathMatch then
FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 0
else
FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)), PChar(ExtractFilename(AFilename))) = 0;
if FoundOK then
begin
ProcessID := lppe.th32ProcessID;
break;
end;

FoundAProc := Process32Next(SsHandle, lppe);
end;
CloseHandle(SsHandle);
end;

//-----------------------------------------------设置打开进程权限----------------

function EnabledDebugPrivilege(const Enabled : Boolean) : Boolean;

//---------参数:true
var
hTk : THandle;
rtnTemp : Dword;
TokenPri : TOKEN_PRIVILEGES;
const
SE_DEBUG = 'SeDebugPrivilege';
begin
Result := False;

if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hTk)) then
begin
TokenPri.PrivilegeCount := 1;

LookupPrivilegeValue(nil,SE_DEBUG,TokenPri.Privileges[0].Luid);

if Enabled then
TokenPri.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TokenPri.Privileges[0].Attributes := 0;

rtnTemp := 0;

AdjustTokenPrivileges(hTk,False,TokenPri,sizeof(TokenPri),nil,rtnTemp);

Result := GetLastError = ERROR_SUCCESS;
CloseHandle(hTk);

end;
end;

//-------------注入线程函数--------------------

function InjectTo(const Host, Guest: string; const PID: DWORD = 0): DWORD;

//--------参数: 进程名,DLL地址[第3参数:直接指定程序PID]

var

hRemoteProcess: THandle;
dwRemoteProcessId: DWORD;

memSize: DWORD;

pszLibFileRemote: Pointer;

iReturnCode: Boolean;
TempVar: DWORD;

pfnStartAddr: TFNThreadStartRoutine;

pszLibAFilename: PwideChar;
begin
Result := 0;

EnabledDebugPrivilege(True);

Getmem(pszLibAFilename, Length(Guest) * 2 + 1); //这里是在本地分配内存空间:一会儿要释放.因为进程与进程通信只能在内存上传数据
StringToWideChar(Guest, pszLibAFilename, Length(Guest) * 2 + 1);

if PID > 0 then
dwRemoteProcessID := PID //参数PID不为0,直接指定要注入的程序PID为这个
else
GetMyProcessID(Host, False, dwRemoteProcessID); //否则用函数取得PID

hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD +
PROCESS_VM_OPERATION +
PROCESS_VM_WRITE,
FALSE, dwRemoteProcessId);

memSize := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);
pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, memSize, MEM_COMMIT, PAGE_READWRITE)); //分配远程进程地址空间
TempVar := 0;
iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, memSize, TempVar); //写远程地址空间内容

if iReturnCode then
begin
pfnStartAddr := GetProcAddress(GetMoleHandle('Kernel32'), 'LoadLibraryW'); //在远程创建线程,只有使用远程调用LoadLibraryW()函数
TempVar := 0;

Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar); //创建线程
end;

Freemem(pszLibAFilename); //释放本地内存空间
end;

**************************************************************************************************
使用函数
**************************************************************************************************

procere TForm1.Button3Click(Sender: TObject);
begin

InjectTo('AAAAA.exe', extractfilepath(paramstr(0))+'d.dll');
end;
请参考
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不干胶印刷设备多少钱一套 小型不干胶印刷机价格 什么是走水运 水路的特点是什么 疯狂僵尸机游戏怎么玩,植物大战僵尸高清版怎么玩 植物大战僵尸2 植物大战僵尸2戴夫最好的朋友是谁? 怎么下载疯狂的戴夫游戏 游戏下载地址 小红书数据分析工具推荐 三分钟做好一张小红书封面,不同平台超好用的高效率工具你造吗_百度知... 网球王子的剧场版都有哪些啊 网球王子剧场版:英国式庭球城决战DVD情报 C#中登录时点关闭按钮怎样实现整个程序关闭 英国一共多少所大学 英国共有多少所大学? 为什么海水垂直温差越大,海水不稳定 形成海洋温差的源头是什么 河北大学英语四级考试时间 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息, 只想和你好好的小说叫什么名字啊? 被妖怪包围的我捡到了小魔女小说叫什么名字 被八个舅舅宠上天小说叫什么名字 妖尊非要对我负责小说叫什么名字 危险小舅子在原耽叫什么名字 暴君闺女五岁半漫画叫是什么名字 瑾岛推文:按头安利三本既沙雕又搞笑的娱乐圈爽文,真的好康! 难过的时候,就抬头看看天空吧 为什麽心情不好的时候总要仰望天空? 心情不好时,深呼吸。抬起头看着天空说一切都会过去的,明天会更好? 绑定手机号了,怎样取消绑定? )目前治疗哮喘的首选药物是() solidworks2016安装没有产品 老师要求做一个presentation:Are you a procrastinator? 急需背景资料,英文的,谢~~~ 电视机没有授权怎么弄? 永新视博数字电视怎么授权 猪血糕的做法怎样做猪血糕 红米3手机里的mab是干什么的 我想问问绿松石用水泡好吗 房屋买卖合同中买方怎么写合同 华为儿童手表3密码忘了怎么办 梦见老人去世大哭 梦见家乡过世的老人在哭 梦见已故老人吃饭流泪 英普莱扎机器人在银河奥特曼第几集登场 孩子学习乒乓球的好处有哪些~~?? 怎么自助解封? 防火墙公司真的合法吗 山东阿胶片怎么吃 电容笔硅胶笔头怎么装 vivo手机加快安装速度点功能 秋冬男装烧烤主题服装图片 dnf魔法师白色那套时装叫什么