delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
关于线程插入函数如何用的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061207182656107.html
我现在掌握了不用dll也能代码注入的技术  
   
  就是有一个inject函数   把要插入进程的句柄和要插入的函数名前加一个"@"  
  当作参数传递过去就行了,如下:  
  procedure   Inject(ProcessHandle:   longword;   EntryPoint:   pointer);  
   
  本来是很好用的  
   
  但是我这里有一份带窗体的程序的代码     想让它插到某个pid里  
  原来的dpr文件是这样的:  
   
  program   server;  
   
  uses  
        Forms,  
      mainserve   in   'mainserve.pas'   {ServerForm};  
   
  begin  
      Application.Initialize;  
      Application.CreateForm(TServerForm,   ServerForm);  
      Application.Run;  
  end.  
   
  我改成了:  
   
  program   server;  
   
  uses  
        Forms,windows,  
      mainserve   in   'mainserve.pas'   {ServerForm};  
   
  procedure   main();  
   
  begin  
      Application.Initialize;  
      Application.CreateForm(TServerForm,   ServerForm);  
      Application.Run;  
  end;  
   
   
  var  
  ProcessHandle,   PID:   longword;  
   
  begin  
   
  PID:=1252;//当前我运行的某个IE的PID  
  ProcessHandle   :=   OpenProcess(PROCESS_ALL_ACCESS,   False,   PID);//打开进程  
  Inject(ProcessHandle,   @Main);//插入代码  
  CloseHandle(ProcessHandle);//关闭线程句柄  
  end.  
   
   
   
  那个mainserve.pas没作改动  
   
  编译没错       一运行就出错说   某个内存引用的某个内存不能为writen   结果IE就关了  
   
   
  我的改动并没错呀??  
   
  我怀疑这个错误和程序里有窗体有关       但是用到了timer     是不是就不能去掉窗体??  
   
  我的怀疑正确吗????  
 

说明一下       我修改时已把inject的定义加上了       只是上面的代码没体现出来

不用DLL   注入   的方法我也想知道哦..  
  aphex的不用DLL远程注入是  
  GetWindowThreadProcessId(FindWindow('Shell_TrayWnd',   nil),   @Pid);  
  //获取Exp进程的PID码,Shell_TrayWnd为类名,相关的需用SPY++来查看  
   
  ProcessHandle   :=   OpenProcess(PROCESS_ALL_ACCESS,   False,   Pid);   //打开进程  
   
  hModule   :=   Pointer(GetModuleHandle(nil));  
  //这里得到的值为一个返回一个指针型变量,指向内容包括自身映像的基址和长度  
   
  Extent   :=   PImageOptionalHeader(Pointer(integer(hModule)   +   PImageDosHeader(hModule)._lfanew   +   SizeOf(dword)   +   SizeOf(TImageFileHeader))).SizeOfImage;  
  //得到内存映像的长度  
   
  VirtualFreeEx(ProcessHandle,   hModule,   0,   MEM_RELEASE);  
  //在Exp进程的内存范围内分配一个足够长度的内存  
   
  hModule_News   :=   VirtualAllocEx(ProcessHandle,   hModule,   Extent,   MEM_COMMIT   or   MEM_RESERVE,   PAGE_EXECUTE_READWRITE);  
  //确定起始基址和内存映像基址的位置  
   
  WriteProcessMemory(ProcessHandle,   hModule_News,   hModule,   Extent,   Size);  
  //确定上面各项数据后,这里开始进行操作  
   
  CreateRemoteThread(ProcessHandle,   nil,   0,   @Download,   hModule,   0,   ThreadId);  
  //建立远程线程,至此注入过程完成  
   
  CloseHandle(ProcessHandle);  
   
   
  偶把我的程序定义成个过程   然后用他这样的方法去注入.   结果跟LX一样...    
  高手详细说下吧..  
 

楼上的是同道中人  
   
  实际上我们插入一个小过程可以成功     哪怕这个过程调用其它自定义的过程  
   
  但是把一个程序的原代码里dpr文件里的主程序定义为过程   再插入这个过程就会报错  
   
  因为什么??

请高手现身

关注

请高手献身

请高手献身

人工置顶

还没有人来么?  
  我现在也有段代码   他定义的过程注入没问题..我自己写个过程   注入都出错.     郁闷

人工置顶

人工置顶

posted on 2008-09-23 09:36 delphi2007 阅读(125) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。