首页
社区
课程
招聘
[旧帖] [求助]-------------------------------------------求Delphi高手改一个小程序----------关于DLL注入程序源码以贴 0.00雪花
发表于: 2012-6-25 00:06 1883

[旧帖] [求助]-------------------------------------------求Delphi高手改一个小程序----------关于DLL注入程序源码以贴 0.00雪花

2012-6-25 00:06
1883
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, RzButton, ExtCtrls, jpeg, RzBckgnd, RzLabel,tlhelp32;

type
  TForm1 = class(TForm)
    btn1: TRzButton;
    RzSeparator1: TRzSeparator;
    RzLabel1: TRzLabel;
    RzLabel2: TRzLabel;
    RzLabel3: TRzLabel;
    RzLabel4: TRzLabel;
    RzSeparator2: TRzSeparator;
    RzLabel5: TRzLabel;

        procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure FindAProcess(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
var
  lppe: TProcessEntry32;
  SsHandle: Thandle;
  FoundAProc, FoundOK: boolean;
begin
  ProcessID :=0;
  SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);
  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 bEnabled: Boolean): Boolean;
var
  hToken: THandle;
  tp: TOKEN_PRIVILEGES;
  a: DWORD;
const
  SE_DEBUG_NAME = 'SeDebugPrivilege';
begin
  Result := False;
  if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then
  begin
    tp.PrivilegeCount := 1;
    LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
    if bEnabled then
      tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
    else
      tp.Privileges[0].Attributes := 0;
    a := 0;
    AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);
    Result := GetLastError = ERROR_SUCCESS;
    CloseHandle(hToken);
  end;
end;

function AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD = 0): DWORD;
var
  hRemoteProcess: THandle;
  dwRemoteProcessId: DWORD;
  cb: DWORD;
  pszLibFileRemote: Pointer;
  iReturnCode: Boolean;
  TempVar: DWORD;
  pfnStartAddr: TFNThreadStartRoutine;
  pszLibAFilename: PwideChar;
begin
  Result := 0;
  EnabledDebugPrivilege(True);
  Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);
  StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 + 1);
  if PID > 0 then
     dwRemoteProcessID := PID
  else
     FindAProcess(HostFile, False, dwRemoteProcessID);
  hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允许远程创建线程}
      PROCESS_VM_OPERATION + {允许远程VM操作}
      PROCESS_VM_WRITE, {允许远程VM写}
      FALSE, dwRemoteProcessId);
  cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);
  pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));
  TempVar := 0;
  iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, cb, TempVar);
  if iReturnCode then
  begin
    pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW');
    TempVar := 0;
    Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);
  end;
  Freemem(pszLibAFilename);
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
 AttachToProcess('cc.exe', extractfilepath(paramstr(0))+'myzx.dll');
end;
end.

这个只能将DLL注入到一个名为CC.exe的进程,问题是我想开很多,开很多就会有很多CC.exe,可是来来回回就注入了一个CC.exe,要怎么样注入到全部名为cc.exe里

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
if FoundOK then
    begin
      ProcessID := lppe.th32ProcessID;
      break;
    end;

在这里集成调用注入,话说LZ,您究竟想闹哪样?
2012-6-25 00:17
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大鸟你功力都那么深了还在混新手区呢,是不是上帝给你打电话了说我有麻烦你就来啦。

你能帮我改下吗,这个代码是看书里代码,很多地不大明白,暂时不想明白。

原来注入后钩子随我的程序退出而退出的,我弄这个就可以一直挂着了而且还可以挂一些别的API,全局钩子总是影响别的程序,弄这个又安全又省心。

帮我改下吧,等哪天我弄出点新玩意给你发一份。
2012-6-25 00:37
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
啊太兴奋了 解决了

AttachToProcess('cc.exe', extractfilepath(paramstr(0))+'myzx.dll');
AttachToProcess('cc.exe', extractfilepath(paramstr(0))+'myzx.dll');

这样一下就OK了 全部CC.exe都可以注入了
这个是什么原理
2012-6-25 01:08
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好几个程序都被钩上了,关闭我的程序再打开新程序也会被注入,这个是怎么搞的。
2012-6-25 01:17
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
鸟哥,有时间帮我改下吧,我那个方法把别的程序都注入了,而且关闭我的程序再打开任何程序都会被注入,也没办法卸载了
2012-6-25 01:25
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
就这样吧,我也不会Delphi,由于VC2011默认Unicode规范,所以,你看着办吧。

通过编译,但是功能应该不会有问题。

#include <windows.h>
#include <WinBase.h>
#include <TlHelp32.h>
bool EnabledDebugPrivilege()
{
        TOKEN_PRIVILEGES tp;
        HANDLE hToken;
        DWORD temp;
        bool return_value=FALSE;
        if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
        {
                tp.PrivilegeCount=1;
                LookupPrivilegeValue(NULL,L"SeDebugPrivilege",&tp.Privileges[0].Luid);
                tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
                AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,&temp);
                if (ERROR_SUCCESS==GetLastError())
                {
                        return_value=TRUE;
                }
                CloseHandle(hToken);
        }
        return return_value;
}
int InjectProcess(PWCHAR FileName,PWCHAR MatchPath,DWORD ProcessID,PWCHAR strInjectDll)
{
        int return_value=0;
        BOOL bInject=FALSE;
        BYTE InjectPreLoad[]={
                0x55, 0x8B, 0xEC, 0x83, 0xC4, 0xF0, 0x60, 0x64, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x8B, 0x40, 0x0C, 0x8B, 0x40, 0x0C, 0x8B,
                0x00, 0x8B, 0x00, 0x8B, 0x58, 0x18, 0x8B, 0x43, 0x3C, 0x03, 0xC3, 0x8B, 0x40, 0x78, 0x03, 0xC3, 0xFF, 0x70, 0x14, 0x8F,
                0x45, 0xF0, 0x8B, 0x78, 0x1C, 0x03, 0xFB, 0x8B, 0x70, 0x20, 0x03, 0xF3, 0x56, 0xAD, 0x03, 0xC3, 0x33, 0xC9, 0x33, 0xD2,
                0x8A, 0x10, 0x40, 0x03, 0xCA, 0xC1, 0xC1, 0x07, 0x80, 0xFA, 0x00, 0x75, 0xF3, 0x81, 0xF9, 0xAB, 0x53, 0x4E, 0x73, 0x75,
                0x11, 0x8B, 0xC6, 0x2B, 0x04, 0x24, 0x03, 0xC7, 0x83, 0xE8, 0x04, 0x8B, 0x00, 0x03, 0xC3, 0x89, 0x45, 0xFC, 0x81, 0xF9,
                0x61, 0x97, 0x2B, 0xDD, 0x75, 0x11, 0x8B, 0xC6, 0x2B, 0x04, 0x24, 0x03, 0xC7, 0x83, 0xE8, 0x04, 0x8B, 0x00, 0x03, 0xC3,
                0x89, 0x45, 0xF8, 0x81, 0xF9, 0x37, 0xC4, 0xF7, 0xFF, 0x75, 0x11, 0x8B, 0xC6, 0x2B, 0x04, 0x24, 0x03, 0xC7, 0x83, 0xE8,
                0x04, 0x8B, 0x00, 0x03, 0xC3, 0x89, 0x45, 0xF4, 0xFF, 0x4D, 0xF0, 0x75, 0x9C, 0x5E, 0x64, 0xA1, 0x18, 0x00, 0x00, 0x00,
                0x83, 0xC0, 0x20, 0x50, 0x6A, 0x00, 0x6A, 0x00, 0xFF, 0x55, 0xF8, 0x83, 0xF8, 0x00, 0x75, 0x20, 0x64, 0xA1, 0x18, 0x00,
                0x00, 0x00, 0x83, 0xC0, 0x20, 0x50, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0xFF, 0x55, 0xFC, 0xE8, 0x00, 0x00, 0x00, 0x00,
                0x83, 0x04, 0x24, 0x0A, 0xFF, 0x55, 0xF4, 0x61, 0xC9, 0xC3};
        PROCESSENTRY32 pe;
        HANDLE hSnapshot;
        hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if (Process32First(hSnapshot,&pe))
        {
                do
                {
                        bInject=FALSE;
                        WCHAR *pExeFileName=pe.szExeFile;
                        while (*pExeFileName!='\\')        pExeFileName--;
                        *(pExeFileName-1)=0;
                        if (lstrcmpi(pExeFileName,FileName))
                        {
                                if (MatchPath && lstrcmpi(pe.szExeFile,MatchPath))
                                {
                                        return_value++;
                                        bInject=TRUE;
                                }
                        }
                        if (!bInject && pe.th32ProcessID==ProcessID)
                        {
                                return_value++;
                                bInject=TRUE;
                        }
                        if (bInject)
                        {
                                HANDLE hProcess;
                                if (hProcess=OpenProcess(PROCESS_CREATE_THREAD + PROCESS_VM_OPERATION,false,pe.th32ProcessID))
                                {
                                        PBYTE PreloadBuffer=(PBYTE)(VirtualAllocEx(hProcess,NULL,sizeof(InjectPreLoad),MEM_COMMIT,PAGE_EXECUTE_READWRITE));
                                        DWORD temp;
                                        WriteProcessMemory(hProcess,PreloadBuffer,InjectPreLoad,sizeof(InjectPreLoad),&temp);
                                        WriteProcessMemory(hProcess,PreloadBuffer+sizeof(InjectPreLoad),strInjectDll,lstrlen(strInjectDll),&temp);
                                        CloseHandle(CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)PreloadBuffer,NULL,NULL,NULL));
                                        CloseHandle(hProcess);
                                }
                        }
                } while (Process32Next(hSnapshot,&pe));
        }
        CloseHandle(hSnapshot);
}
2012-6-26 19:03
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
注入没有卸载的原因
if (hProcess=OpenProcess(PROCESS_CREATE_THREAD + PROCESS_VM_OPERATION,false,pe.th32ProcessID))
        {
          PBYTE PreloadBuffer=(PBYTE)(VirtualAllocEx(hProcess,NULL,sizeof(InjectPreLoad),MEM_COMMIT,PAGE_EXECUTE_READWRITE));
          DWORD temp;

          //保存hProcess和替换数据
          WriteProcessMemory(hProcess,PreloadBuffer,InjectPreLoad,sizeof(InjectPreLoad),&temp);
          WriteProcessMemory(hProcess,PreloadBuffer+sizeof(InjectPreLoad),strInjectDll,lstrlen(strInjectDll),&temp);
          CloseHandle(CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)PreloadBuffer,NULL,NULL,NULL));
          CloseHandle(hProcess);
        }

//UnHook时还原
2012-6-30 00:56
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
9
这个Unhook由用户dll来完成,我的Preload代码中间自带反重复注入。
2012-7-6 09:13
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢鸟哥 我已经解决了 直接创建进程 保存PID 之后传入反复就可以了 比较简单

我直接用的别人DLL注入的,我现在的目的就事逆出那个DLL怎么过游戏保护的 之前我发给你那个
2012-7-6 13:14
0
游客
登录 | 注册 方可回帖
返回
//