uses tlhelp32;
type
///////////////////////////////////////////////////////////////////////////  
  TLPFN_KernelBaseGetGlobalData=procedure ;stdcall ;
///////////////////////////////////////////////////////////////////////////
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
//查找要注入的进程,返回进程ID,这个函数测试的时候返回是正常的,所以可以跳过
function  findprocess(const afilename:string;const pathmatch:Boolean &nbspDWORD ;
var
 ippe:TProcessEntry32   ;
 sshandle:THandle ;
 foundaproc,foundok:Boolean;
begin
  Result  :=0;
  ippe.dwSize :=SizeOf (ippe);
  sshandle :=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0 );
  foundaproc :=Process32First(sshandle ,ippe);
  while foundaproc  do
   begin
     if pathmatch  then
        foundok :=AnsiStrIComp(ippe.szExeFile ,PChar(afilename))=0
     else
        foundok :=AnsiStrIComp(PChar(ExtractFilename(ippe.szExeFile )),PChar (ExtractFileName (afilename )))=0 ;
     if foundok  then
        begin
          Result  :=ippe.th32ProcessID;
          Break ;
        end;
      foundaproc :=Process32Next(sshandle ,ippe);
   end;
  CloseHandle(sshandle );
end;
/////////////////////////////////////////////////////////////////////////////////
//提权,也是正确的。

function enabledebugprivilege(const benable: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 benable 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,hKernelBase:hmodule;
 dwremoteprocessid:DWORD;
 cb:DWORD;
 pszlibfileremote:Pointer;
 ireturncode:Boolean;
 tempvar:DWORD  ;
 s:string;
 pfnstartaddr:TFNThreadStartRoutine ;
 pszlibafilename:PWideChar ;
 pKernelBaseGetGlobalData:TLPFN_KernelBaseGetGlobalData;
 pGlobalData,pmisc:PInteger   ;
begin
  pKernelBaseGetGlobalData:=nil;
  pGlobalData :=nil;
  Result:=0;
  enabledebugprivilege(true);
  GetMem(pszlibafilename ,length(guestfile)*2+1);
  StringToWideChar(guestfile ,pszlibafilename,length(guestfile)*2+1 );
  if pid >0 then
     dwremoteprocessid :=pid
  else
    dwremoteprocessid := findprocess(hostfile,False );
  hremoteprocess :=OpenProcess(PROCESS_CREATE_THREAD + PROCESS_VM_OPERATION + PROCESS_VM_WRITE,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, nativeuint(tempvar ));
  if ireturncode  then
     begin
       hKernelBase := LoadLibraryw('KernelBase');
       pKernelBaseGetGlobalData:= TLPFN_KernelBaseGetGlobalData(GetProcAddress(hKernelBase,'KernelBaseGetGlobalData'));
       pmisc:=@pKernelBaseGetGlobalData;
       tempvar :=0;
       pmisc:=Pointer ($5c+integer(pmisc));
       //下面的这步出错;说access violation at address 00511c1f in module'XX.exe'. write of address 747f6c7d,pmisc的地址是747f6c7d.
       pmisc^:=1;
       pfnstartaddr:=getprocaddress(getmodulehandle('kernel32'),loadlibrary);
       Result :=CreateRemoteThread(hremoteprocess ,nil,0,pMisc,pszlibfileremote ,0,tempvar );
       s:=IntToStr (GetLastError );
       ShowMessage(s);
     end;
  FreeMem(pszlibafilename )   ;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  attachtoprocess('explorer.exe',ExtractFilePath(ParamStr(0))+'destdll.dll');
怎么解决???
希望大家说说看法 
看雪论坛原帖http://bbs.pediy.com/showthread.php?t=154102