Delphi进程注入的部分代码 (非DLL注入)

//-------------------------注入代码的函数----------------------------  
{参数说明: 
InHWND:被注入的窗口句柄 
Func:注入的函数的指针 
Param:参数的指针 
ParamSize:参数的大小 

procedure InjectFunc(InHWND: HWND; Func: Pointer; Param: Pointer; ParamSize: DWORD);  
var 
    hProcess_N: THandle;  
    ThreadAdd, ParamAdd: Pointer;  
    hThread: THandle;  
    ThreadID: DWORD;  
    lpNumberOfBytes:DWORD;  
begin 
    GetWindowThreadProcessId(InHWND, @ThreadID);    //获得窗口ID  
    hProcess_N := OpenProcess(PROCESS_ALL_ACCESS, False, ThreadID);//打开被注入的进程  
    ThreadAdd := VirtualAllocEx(hProcess_N, nil, 4096, MEM_COMMIT, PAGE_READWRITE);    //申请写入代码空间  
    WriteProcessMemory(hProcess_N, ThreadAdd, Func, 4096, lpNumberOfBytes); //写入函数地址  
    ParamAdd := VirtualAllocEx(hProcess_N, nil, ParamSize, MEM_COMMIT, PAGE_READWRITE);    //申请写入代码参数空间  
    WriteProcessMemory(hProcess_N, ParamAdd, Param, ParamSize, lpNumberOfBytes); //写入参数地址  
    hThread := CreateRemoteThread(hProcess_N, nil, 0, ThreadAdd, ParamAdd, 0, lpNumberOfBytes); //创建远程线程  
    ResumeThread(hThread); //直接运行线程  
    CloseHandle(hThread); //关闭线程  
    VirtualFreeEx(hProcess_N, ThreadAdd, 4096, MEM_RELEASE);  
    VirtualFreeEx(hProcess_N, ParamAdd, ParamSize, MEM_RELEASE); //释放申请的地址  
    CloseHandle(hProcess_N); //关闭打开的句柄  
end;  
//-----------------------------定义一个参数类型-----------------------  
type 
    TPickCallParam = packed record 
      ax, ay: single;  
    end;  
    PPickCallParam = ^TPickCallParam;    //指向结构的指针(C中叫这种方式的数据应该叫结构体吧)  
procedure runCall(p:PPickCallParam);stdcall;    // 走路call  
var 
addres,addres1,addres2:pointer;  
x,y:single;  
begin 
      addres:=pointer($0045ec00);  
      addres1:=pointer($00462620);  
      addres2:=pointer($0045f000);  
      x:=p^.ax;              //目的地X坐标  
      y:=p^.ay;            //目的地Y坐标  
      asm 
      pushad  
        mov      eax, dword ptr [$8f207c]  
        mov      eax, dword ptr [eax+$1C]  
        mov      esi, dword ptr [eax+$20]  
        mov      ecx, dword ptr [esi+$ba0]  
        push      1 
        call      addres  
        mov      edi, eax  
        lea      eax, dword ptr [esp+$18]  
        push      eax  
        push      0 
        mov      ecx, edi  
        call      addres1  
        push      0 
        push      1 
        push      edi  
        mov      ecx, dword ptr [esi+$ba0]  
        push      1 
        call      addres2  
        mov      eax, dword ptr [$8f207c]  
        mov      eax, dword ptr [eax+$1C]  
        mov      eax, dword ptr [eax+$20]  
        mov      eax, dword ptr [eax+$ba0]  
        mov      eax, dword ptr [eax+$30]  
        mov      ecx, dword ptr [eax+4]  
        mov      eax, x  
        mov      [ecx+$20], eax  
        mov      eax, y  
        mov      [ecx+$28], eax  
      popad  
      end;  
END;  
procedure TForm1.Button1Click(Sender: TObject);//在控件中做个按钮 测试  
var 
      CallParam:TPickCallParam;  
begin;  
    getmem(pname,33);  
    myhwnd := FindWindow(nil,'Element Client');{查找窗口句柄} 
    GetWindowThreadProcessId(myhwnd, aproc); {得到窗口ID} 
    phnd := OpenProcess(PROCESS_VM_READ , False, aproc);{以完全访问权限打开进程句柄} 
    if (phnd<>0 ) then 
    begin 
      CallParam.ax:= 1860.0;    //给注入代码函数赋值  
      CallParam.ay:=120.0;      //给注入代码函数赋值  
      InjectFunc(myhWnd,@runCall,@CallParam,SizeOf(CallParam)); //运行注入代码函数  
      sleep(100);  
      CloseHandle(PHND) //关闭进程  
    end;  
end;  


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aroc_lo/archive/2009/11/26/4877088.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种编程语言,而DLL(Dynamic-Link Library)是一种模块化的文件格式,用于存储代码和数据,可以被多个应用程序共享。DLL注入是一种技术,它允许将DLL文件加载到正在运行的进程中,并使得该进程能够调用DLL中的函数和使用其中的数据。 在Delphi中实现DLL注入的方法有很多种。一种常见的方法是使用Windows API函数LoadLibrary和GetProcAddress。通过调用LoadLibrary函数,将DLL文件加载到进程的虚拟地址空间中。然后使用GetProcAddress函数获取DLL中导出函数的地址,并将其传递给需要调用的函数。通过这种方式,可以在运行时将DLL注入到目标进程中,并且通过调用DLL中的函数来扩展进程的功能。 DLL注入在实际应用中有多种用途。例如,可以使用DLL注入来为某个程序添加额外的功能或修改程序的行为。DLL注入还可以用于实现一些调试和监控的功能。通过注入DLL,可以截获程序的输入和输出,或者在程序执行某些指定的操作时进行额外的处理。 在Delphi中实现DLL注入需要一定的编程知识和技巧。需要考虑目标进程的架构和权限限制,以及如何管理注入DLL的生命周期和资源管理。同时,还需要处理一些安全性和稳定性方面的问题,以确保注入过程不会对目标进程造成损害或崩溃。 总之,Delphi可以通过调用Windows API函数来实现DLL注入,从而扩展和修改进程的功能。但在实际应用中,需要考虑各种方面的问题,并且遵守相关的法律和规定,以确保注入操作的安全性和合法性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值