<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[一切从C开始]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[软件安全系列]]></description>
<link>http://hi.baidu.com/combojiang</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[ring0不调api徒手设置硬件断点[转帖]]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/cae30e3fd77930cb7c1e7106.html]]></link>
        <description><![CDATA[
		
		ring0不调api徒手设置硬件断点 <br>
by flyingkisser <br>
09.2.12 <br>
时间比较有限，捡关键的说说 <br>
<br>
1.如何写dr0,dr7，一般用NtSetContextThread， <br>
为了不调API，这个问题就成了如何定位到指定线程的context，办法是： <br>
先由tid拿到ethread <br>
kthread.InitialStack-29ch就是，如果这个地址无效，就使用ethread-&gt;TrapFrame <br>
这时拿到的地址指向结构KTRAP_FRAME，修改它对应的drx就行了。 <br>
为什么是_KTHREAD.InitialStack-29ch，自己逆向一下PspGetSetContextSpecialApc就知道了。 <br>
xp下是29ch,其它系统没试过 <br>
<br>
2.设置kthread-&gt;DebugActive为1，如果不设置，线程切换时不会把trapframe里的drx写回到线程context中去。 <br>
这个问题搞了我很久。 <br>
<br>
3.硬件断点断下时，1号中断ISR接管控制，这时，你下的断点处的指令并没有执行，你得在恢复所有环境准备返回时， <br>
自己去模拟断点处的指令执行，然后修改返回地址，指向断点的下一条指令处，最后再iretd。所以，选择硬件执行断点时， <br>
最后不要选择像push,pop,jmp,je这样难以模拟的指令。这个问题也困扰了我好几天。 <br>
<br>
okey,这个方法有点淫荡，至少不用改别人的代码段就可以在你想停下的地方接管控制，也不用调用什么API就可以实现。 <br>
检测起来呢，有点麻烦，但不是很难，至少不怕别人hook什么SetContextThread了。 <a href="http://hi.baidu.com/combojiang/blog/item/cae30e3fd77930cb7c1e7106.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/windows%C4%DA%BA%CB%CC%BD%CB%F7">windows内核探索</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/cae30e3fd77930cb7c1e7106.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-04  16:06</pubDate>
        <category><![CDATA[windows内核探索]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/cae30e3fd77930cb7c1e7106.html</guid>
</item>

<item>
        <title><![CDATA[根据线程ID找出其所在的模块名【转帖】]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/8e330b09e55af88bd1581b9d.html]]></link>
        <description><![CDATA[
		
		<p>从硬盘中找出来的一段代码。已不知道原始出处了。贴出来。</p>
<p>#define&nbsp;&nbsp;  WIN32_LEAN_AND_MEAN&nbsp;&nbsp;  <br>
#define&nbsp;&nbsp;  _WIN32_WINNT&nbsp;&nbsp;  0x400&nbsp;&nbsp;  <br>
#include&nbsp;&nbsp;  &lt;stdio.h&gt;&nbsp;&nbsp;  <br>
#include&nbsp;&nbsp;  &lt;tchar.h&gt;&nbsp;&nbsp;  <br>
#include&nbsp;&nbsp;  &lt;locale.h&gt;&nbsp;&nbsp;  <br>
#include&nbsp;&nbsp;  &lt;windows.h&gt;&nbsp;&nbsp;  <br>
#include&nbsp;&nbsp;  &lt;psapi.h&gt;&nbsp;&nbsp;  <br>
#include&nbsp;&nbsp;  &lt;Tlhelp32.h&gt;&nbsp;&nbsp;</p>
<p>#pragma&nbsp;&nbsp;  comment&nbsp;&nbsp;  (lib,&nbsp;&nbsp;  &quot;psapi.lib&quot;)&nbsp;&nbsp;</p>
<p>//&nbsp;&nbsp;  <br>
//&nbsp;&nbsp;  Thread&nbsp;&nbsp;  Information&nbsp;&nbsp;  Classes&nbsp;&nbsp;  <br>
//&nbsp;&nbsp;</p>
<p>typedef&nbsp;&nbsp;  enum&nbsp;&nbsp;  _THREADINFOCLASS&nbsp;&nbsp;  {&nbsp;&nbsp;  <br>
 ThreadBasicInformation,&nbsp;&nbsp;  <br>
 ThreadTimes,&nbsp;&nbsp;  <br>
 ThreadPriority,&nbsp;&nbsp;  <br>
 ThreadBasePriority,&nbsp;&nbsp;  <br>
 ThreadAffinityMask,&nbsp;&nbsp;  <br>
 ThreadImpersonationToken,&nbsp;&nbsp;  <br>
 ThreadDescriptorTableEntry,&nbsp;&nbsp;  <br>
 ThreadEnableAlignmentFaultFixup,&nbsp;&nbsp;  <br>
 ThreadEventPair_Reusable,&nbsp;&nbsp;  <br>
 ThreadQuerySetWin32StartAddress,&nbsp;&nbsp;  <br>
 ThreadZeroTlsCell,&nbsp;&nbsp;  <br>
 ThreadPerformanceCount,&nbsp;&nbsp;  <br>
 ThreadAmILastThread,&nbsp;&nbsp;  <br>
 ThreadIdealProcessor,&nbsp;&nbsp;  <br>
 ThreadPriorityBoost,&nbsp;&nbsp;  <br>
 ThreadSetTlsArrayAddress,&nbsp;&nbsp;  <br>
 ThreadIsIoPending,&nbsp;&nbsp;  <br>
 ThreadHideFromDebugger,&nbsp;&nbsp;  <br>
 ThreadBreakOnTermination,&nbsp;&nbsp;  <br>
 MaxThreadInfoClass&nbsp;&nbsp;  <br>
}&nbsp;&nbsp;  THREADINFOCLASS;&nbsp;&nbsp;</p>
<p>typedef&nbsp;&nbsp;  struct&nbsp;&nbsp;  _CLIENT_ID&nbsp;&nbsp;  {&nbsp;&nbsp;  <br>
 HANDLE&nbsp;&nbsp;  UniqueProcess;&nbsp;&nbsp;  <br>
 HANDLE&nbsp;&nbsp;  UniqueThread;&nbsp;&nbsp;  <br>
}&nbsp;&nbsp;  CLIENT_ID;&nbsp;&nbsp;  <br>
typedef&nbsp;&nbsp;  CLIENT_ID&nbsp;&nbsp;  *PCLIENT_ID;&nbsp;&nbsp;</p>
<p>typedef&nbsp;&nbsp;  struct&nbsp;&nbsp;  _THREAD_BASIC_INFORMATION&nbsp;&nbsp;  {&nbsp;&nbsp;  //&nbsp;&nbsp;  Information&nbsp;&nbsp;  Class&nbsp;&nbsp;  0&nbsp;&nbsp;  <br>
 LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ExitStatus;&nbsp;&nbsp;  <br>
 PVOID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TebBaseAddress;&nbsp;&nbsp;  <br>
 CLIENT_ID&nbsp;&nbsp;  ClientId;&nbsp;&nbsp;  <br>
 LONG&nbsp;&nbsp;  AffinityMask;&nbsp;&nbsp;  <br>
 LONG&nbsp;&nbsp;  Priority;&nbsp;&nbsp;  <br>
 LONG&nbsp;&nbsp;  BasePriority;&nbsp;&nbsp;  <br>
}&nbsp;&nbsp;  THREAD_BASIC_INFORMATION,&nbsp;&nbsp;  *PTHREAD_BASIC_INFORMATION;&nbsp;&nbsp;</p>
<p>extern&nbsp;&nbsp;  &quot;C&quot;&nbsp;&nbsp;  LONG&nbsp;&nbsp;  (__stdcall&nbsp;&nbsp;  *ZwQueryInformationThread)&nbsp;&nbsp;  (&nbsp;&nbsp;  <br>
 IN&nbsp;&nbsp;  HANDLE&nbsp;&nbsp;  ThreadHandle,&nbsp;&nbsp;  <br>
 IN&nbsp;&nbsp;  THREADINFOCLASS&nbsp;&nbsp;  ThreadInformationClass,&nbsp;&nbsp;  <br>
 OUT&nbsp;&nbsp;  PVOID&nbsp;&nbsp;  ThreadInformation,&nbsp;&nbsp;  <br>
 IN&nbsp;&nbsp;  ULONG&nbsp;&nbsp;  ThreadInformationLength,&nbsp;&nbsp;  <br>
 OUT&nbsp;&nbsp;  PULONG&nbsp;&nbsp;  ReturnLength&nbsp;&nbsp;  OPTIONAL&nbsp;&nbsp;  <br>
 )&nbsp;&nbsp;  =&nbsp;&nbsp;  NULL;&nbsp;&nbsp;</p>
<p><br>
extern&nbsp;&nbsp;  &quot;C&quot;&nbsp;&nbsp;  LONG&nbsp;&nbsp;  (__stdcall&nbsp;&nbsp;  *RtlNtStatusToDosError)&nbsp;&nbsp;  (&nbsp;&nbsp;  <br>
 IN&nbsp;&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;  status)&nbsp;&nbsp;  =&nbsp;&nbsp;  NULL;&nbsp;&nbsp;</p>
<p>BOOL&nbsp;&nbsp;  ShowThreadInfo&nbsp;&nbsp;  (DWORD&nbsp;&nbsp;  tid)&nbsp;&nbsp;  <br>
{&nbsp;&nbsp;  <br>
 THREAD_BASIC_INFORMATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  tbi;&nbsp;&nbsp;  <br>
 PVOID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  startaddr;&nbsp;&nbsp;  <br>
 LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  status;&nbsp;&nbsp;  <br>
 HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  thread,&nbsp;&nbsp;  process;&nbsp;&nbsp;</p>
<p> thread&nbsp;&nbsp;  =&nbsp;&nbsp;  ::OpenThread&nbsp;&nbsp;  (THREAD_ALL_ACCESS,&nbsp;&nbsp;  FALSE,&nbsp;&nbsp;  tid);&nbsp;&nbsp;  <br>
 if&nbsp;&nbsp;  (thread&nbsp;&nbsp;  ==&nbsp;&nbsp;  NULL)&nbsp;&nbsp;  <br>
&nbsp;&nbsp; return&nbsp;&nbsp;  FALSE;&nbsp;&nbsp;</p>
<p> status&nbsp;&nbsp;  =&nbsp;&nbsp;  ZwQueryInformationThread&nbsp;&nbsp;  (thread,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; ThreadQuerySetWin32StartAddress,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; &amp;startaddr,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; sizeof&nbsp;&nbsp;  (startaddr),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; NULL);&nbsp;&nbsp;</p>
<p> if&nbsp;&nbsp;  (status&nbsp;&nbsp;  &lt;&nbsp;&nbsp;  0)&nbsp;&nbsp;  <br>
 {&nbsp;&nbsp;  <br>
&nbsp;&nbsp; CloseHandle&nbsp;&nbsp;  (thread);&nbsp;&nbsp;  <br>
&nbsp;&nbsp; SetLastError&nbsp;&nbsp;  (RtlNtStatusToDosError&nbsp;&nbsp;  (status));&nbsp;&nbsp;  <br>
&nbsp;&nbsp; return&nbsp;&nbsp;  FALSE;&nbsp;&nbsp;  <br>
 };&nbsp;&nbsp;</p>
<p> _tprintf&nbsp;&nbsp;  (TEXT&nbsp;&nbsp;  (&quot;线程&nbsp;&nbsp;  %08x&nbsp;&nbsp;  的起始地址为&nbsp;&nbsp;  %p\n&quot;),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; tid,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; startaddr);&nbsp;&nbsp;</p>
<p> status&nbsp;&nbsp;  =&nbsp;&nbsp;  ZwQueryInformationThread&nbsp;&nbsp;  (thread,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; ThreadBasicInformation,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; &amp;tbi,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; sizeof&nbsp;&nbsp;  (tbi),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; NULL);&nbsp;&nbsp;</p>
<p> if&nbsp;&nbsp;  (status&nbsp;&nbsp;  &lt;&nbsp;&nbsp;  0)&nbsp;&nbsp;  <br>
 {&nbsp;&nbsp;  <br>
&nbsp;&nbsp; CloseHandle&nbsp;&nbsp;  (thread);&nbsp;&nbsp;  <br>
&nbsp;&nbsp; SetLastError&nbsp;&nbsp;  (RtlNtStatusToDosError&nbsp;&nbsp;  (status));&nbsp;&nbsp;  <br>
&nbsp;&nbsp; return&nbsp;&nbsp;  FALSE;&nbsp;&nbsp;  <br>
 };&nbsp;&nbsp;</p>
<p> _tprintf&nbsp;&nbsp;  (TEXT&nbsp;&nbsp;  (&quot;线程&nbsp;&nbsp;  %08x&nbsp;&nbsp;  所在进程ID为&nbsp;&nbsp;  %08x\n&quot;),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; tid,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; (DWORD)tbi.ClientId.UniqueProcess);&nbsp;&nbsp;</p>
<p> process&nbsp;&nbsp;  =&nbsp;&nbsp;  ::OpenProcess&nbsp;&nbsp;  (PROCESS_ALL_ACCESS,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; FALSE,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; (DWORD)tbi.ClientId.UniqueProcess);&nbsp;&nbsp;</p>
<p> if&nbsp;&nbsp;  (process&nbsp;&nbsp;  ==&nbsp;&nbsp;  NULL)&nbsp;&nbsp;  <br>
 {&nbsp;&nbsp;  <br>
&nbsp;&nbsp; DWORD&nbsp;&nbsp;  error&nbsp;&nbsp;  =&nbsp;&nbsp;  ::GetLastError&nbsp;&nbsp;  ();&nbsp;&nbsp;  <br>
&nbsp;&nbsp; CloseHandle&nbsp;&nbsp;  (thread);&nbsp;&nbsp;  <br>
&nbsp;&nbsp; SetLastError&nbsp;&nbsp;  (error);&nbsp;&nbsp;  <br>
&nbsp;&nbsp; return&nbsp;&nbsp;  FALSE;&nbsp;&nbsp;  <br>
 };&nbsp;&nbsp;</p>
<p> TCHAR&nbsp;&nbsp;  modname&nbsp;&nbsp;  [0x100];&nbsp;&nbsp;  <br>
 ::GetModuleFileNameEx&nbsp;&nbsp;  (process,&nbsp;&nbsp;  NULL,&nbsp;&nbsp;  modname,&nbsp;&nbsp;  0x100);&nbsp;&nbsp;</p>
<p> _tprintf&nbsp;&nbsp;  (TEXT&nbsp;&nbsp;  (&quot;线程&nbsp;&nbsp;  %08x&nbsp;&nbsp;  所在进程映象为&nbsp;&nbsp;  %s\n&quot;),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; tid,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; modname);&nbsp;&nbsp;</p>
<p> GetMappedFileName(process,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; startaddr,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; modname,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; 0x100);&nbsp;&nbsp;</p>
<p> _tprintf&nbsp;&nbsp;  (TEXT&nbsp;&nbsp;  (&quot;线程&nbsp;&nbsp;  %08x&nbsp;&nbsp;  可执行代码所在模块为&nbsp;&nbsp;  %s\n&quot;),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; tid,&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp; modname);&nbsp;&nbsp;</p>
<p> CloseHandle&nbsp;&nbsp;  (process);&nbsp;&nbsp;  <br>
 CloseHandle&nbsp;&nbsp;  (thread);&nbsp;&nbsp;  <br>
 return&nbsp;&nbsp;  TRUE;&nbsp;&nbsp;  <br>
};&nbsp;&nbsp;</p>
<p>int&nbsp;&nbsp;  main&nbsp;&nbsp;  (void)&nbsp;&nbsp;  <br>
{&nbsp;&nbsp;  <br>
 setlocale&nbsp;&nbsp;  (LC_ALL,&nbsp;&nbsp;  &quot;.ACP&quot;);&nbsp;&nbsp;</p>
<p> HINSTANCE&nbsp;&nbsp;  hNTDLL&nbsp;&nbsp;  =&nbsp;&nbsp;  ::GetModuleHandle&nbsp;&nbsp;  (TEXT&nbsp;&nbsp;  (&quot;ntdll&quot;));&nbsp;&nbsp;</p>
<p> (FARPROC&amp;)ZwQueryInformationThread&nbsp;&nbsp;&nbsp;&nbsp;  =&nbsp;&nbsp;  <br>
&nbsp;&nbsp; ::GetProcAddress&nbsp;&nbsp;  (hNTDLL,&nbsp;&nbsp;  &quot;ZwQueryInformationThread&quot;);&nbsp;&nbsp;</p>
<p> (FARPROC&amp;)RtlNtStatusToDosError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  =&nbsp;&nbsp;  <br>
&nbsp;&nbsp; ::GetProcAddress&nbsp;&nbsp;  (hNTDLL,&nbsp;&nbsp;  &quot;RtlNtStatusToDosError&quot;);&nbsp;&nbsp;</p>
<p> HANDLE&nbsp;&nbsp;  h&nbsp;&nbsp;  =&nbsp;&nbsp;  CreateToolhelp32Snapshot&nbsp;&nbsp;  (TH32CS_SNAPTHREAD,&nbsp;&nbsp;  0);&nbsp;&nbsp;  <br>
 THREADENTRY32&nbsp;&nbsp;  te;&nbsp;&nbsp;  <br>
 te.dwSize&nbsp;&nbsp;  =&nbsp;&nbsp;  sizeof&nbsp;&nbsp;  (te);&nbsp;&nbsp;  <br>
 if&nbsp;&nbsp;  (Thread32First&nbsp;&nbsp;  (h,&nbsp;&nbsp;  &amp;te))&nbsp;&nbsp;  <br>
 {&nbsp;&nbsp;  <br>
&nbsp;&nbsp; do&nbsp;&nbsp;  <br>
&nbsp;&nbsp; {&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;  (ShowThreadInfo&nbsp;&nbsp;  (te.th32ThreadID))&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp; _tprintf&nbsp;&nbsp;  (TEXT(&quot;无法获得线程&nbsp;&nbsp;  %08x&nbsp;&nbsp;  的相关信息，错误代码为&nbsp;&nbsp;  %d\n&quot;),&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; te.th32ThreadID,&nbsp;&nbsp;  GetLastError&nbsp;&nbsp;  ());&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; };&nbsp;&nbsp;  <br>
&nbsp;&nbsp; }&nbsp;&nbsp;  while&nbsp;&nbsp;  (Thread32Next&nbsp;&nbsp;  (h,&nbsp;&nbsp;  &amp;te));&nbsp;&nbsp;  <br>
 };&nbsp;&nbsp;  <br>
 CloseHandle&nbsp;&nbsp;  (h);&nbsp;&nbsp;  <br>
}</p> <a href="http://hi.baidu.com/combojiang/blog/item/8e330b09e55af88bd1581b9d.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/windows%20sdk%BF%AA%B7%A2">windows sdk开发</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/8e330b09e55af88bd1581b9d.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-19  16:48</pubDate>
        <category><![CDATA[windows sdk开发]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/8e330b09e55af88bd1581b9d.html</guid>
</item>

<item>
        <title><![CDATA[获取线程状态]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/256afb3fec8745e554e7239a.html]]></link>
        <description><![CDATA[
		
		好久没顾得上写blog了，感谢一直关注本blog的朋友。获取线程当前状态，是挂起还是终止，没有直接的API.这里把自己经常用的这段代码贴出来，与大家分享吧。<br>
<br>
#include &lt;stdio.h&gt;<br>
#include &lt;windows.h&gt;<br>
#include &lt;winbase.h&gt;<br>
#include &lt;ntsecapi.h&gt;<br>
<br>
<br>
#define UNICODE<br>
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) &gt;= 0)<br>
#define STATUS_SUCCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ((NTSTATUS) 0x00000000)<br>
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004)<br>
#define SystemProcessesAndThreadsInformation&nbsp;&nbsp;&nbsp;  5<br>
#define NTAPI&nbsp;&nbsp;&nbsp;  __stdcall<br>
<br>
typedef enum _THREAD_STATE<br>
{<br>
&nbsp;&nbsp;&nbsp;  StateInitialized,<br>
&nbsp;&nbsp;&nbsp;  StateReady,<br>
&nbsp;&nbsp;&nbsp;  StateRunning,<br>
&nbsp;&nbsp;&nbsp;  StateStandby,<br>
&nbsp;&nbsp;&nbsp;  StateTerminated,<br>
&nbsp;&nbsp;&nbsp;  StateWait,<br>
&nbsp;&nbsp;&nbsp;  StateTransition,<br>
&nbsp;&nbsp;&nbsp;  StateUnknown<br>
}THREAD_STATE;<br>
<br>
typedef enum _KWAIT_REASON<br>
{<br>
&nbsp;&nbsp;&nbsp;  Executive,<br>
&nbsp;&nbsp;&nbsp;  FreePage,<br>
&nbsp;&nbsp;&nbsp;  PageIn,<br>
&nbsp;&nbsp;&nbsp;  PoolAllocation,<br>
&nbsp;&nbsp;&nbsp;  DelayExecution,<br>
&nbsp;&nbsp;&nbsp;  Suspended,<br>
&nbsp;&nbsp;&nbsp;  UserRequest,<br>
&nbsp;&nbsp;&nbsp;  WrExecutive,<br>
&nbsp;&nbsp;&nbsp;  WrFreePage,<br>
&nbsp;&nbsp;&nbsp;  WrPageIn,<br>
&nbsp;&nbsp;&nbsp;  WrPoolAllocation,<br>
&nbsp;&nbsp;&nbsp;  WrDelayExecution,<br>
&nbsp;&nbsp;&nbsp;  WrSuspended,<br>
&nbsp;&nbsp;&nbsp;  WrUserRequest,<br>
&nbsp;&nbsp;&nbsp;  WrEventPair,<br>
&nbsp;&nbsp;&nbsp;  WrQueue,<br>
&nbsp;&nbsp;&nbsp;  WrLpcReceive,<br>
&nbsp;&nbsp;&nbsp;  WrLpcReply,<br>
&nbsp;&nbsp;&nbsp;  WrVirtualMemory,<br>
&nbsp;&nbsp;&nbsp;  WrPageOut,<br>
&nbsp;&nbsp;&nbsp;  WrRendezvous,<br>
&nbsp;&nbsp;&nbsp;  Spare2,<br>
&nbsp;&nbsp;&nbsp;  Spare3,<br>
&nbsp;&nbsp;&nbsp;  Spare4,<br>
&nbsp;&nbsp;&nbsp;  Spare5,<br>
&nbsp;&nbsp;&nbsp;  Spare6,<br>
&nbsp;&nbsp;&nbsp;  WrKernel,<br>
&nbsp;&nbsp;&nbsp;  MaximumWaitReason<br>
}KWAIT_REASON;<br>
<br>
typedef NTSTATUS (WINAPI *PNTRAISE)(NTSTATUS,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  ULONG,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  ULONG,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  PULONG,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  UINT,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  PULONG);&nbsp;&nbsp;&nbsp;  <br>
<br>
<br>
typedef LONG NTSTATUS;<br>
typedef LONG&nbsp;&nbsp;&nbsp;  KPRIORITY;<br>
<br>
typedef struct _CLIENT_ID {<br>
&nbsp;&nbsp;&nbsp;  DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  UniqueProcess;<br>
&nbsp;&nbsp;&nbsp;  DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  UniqueThread;<br>
} CLIENT_ID, * PCLIENT_ID;<br>
<br>
<br>
typedef struct _VM_COUNTERS {<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PeakVirtualSize;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  VirtualSize;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PageFaultCount;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PeakWorkingSetSize;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  WorkingSetSize;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QuotaPeakPagedPoolUsage;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QuotaPagedPoolUsage;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QuotaPeakNonPagedPoolUsage;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  QuotaNonPagedPoolUsage;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PagefileUsage;<br>
&nbsp;&nbsp;&nbsp;  SIZE_T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PeakPagefileUsage;<br>
} VM_COUNTERS;<br>
<br>
<br>
typedef struct _SYSTEM_THREAD_INFORMATION {<br>
&nbsp;&nbsp;&nbsp;  LARGE_INTEGER&nbsp;&nbsp;  KernelTime;<br>
&nbsp;&nbsp;&nbsp;  LARGE_INTEGER&nbsp;&nbsp;  UserTime;<br>
&nbsp;&nbsp;&nbsp;  LARGE_INTEGER&nbsp;&nbsp;  CreateTime;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  WaitTime;<br>
&nbsp;&nbsp;&nbsp;  PVOID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartAddress;<br>
&nbsp;&nbsp;&nbsp;  CLIENT_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ClientId;<br>
&nbsp;&nbsp;&nbsp;  KPRIORITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Priority;<br>
&nbsp;&nbsp;&nbsp;  KPRIORITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  BasePriority;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ContextSwitchCount;<br>
&nbsp;&nbsp;&nbsp;  LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  State;<br>
&nbsp;&nbsp;&nbsp;  LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  WaitReason;<br>
} SYSTEM_THREAD_INFORMATION, * PSYSTEM_THREAD_INFORMATION;<br>
<br>
<br>
<br>
typedef struct _SYSTEM_PROCESS_INFORMATION {<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NextEntryDelta;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ThreadCount;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Reserved1[6];<br>
&nbsp;&nbsp;&nbsp;  LARGE_INTEGER&nbsp;&nbsp;  CreateTime;<br>
&nbsp;&nbsp;&nbsp;  LARGE_INTEGER&nbsp;&nbsp;  UserTime;<br>
&nbsp;&nbsp;&nbsp;  LARGE_INTEGER&nbsp;&nbsp;  KernelTime;<br>
&nbsp;&nbsp;&nbsp;  UNICODE_STRING  ProcessName;<br>
&nbsp;&nbsp;&nbsp;  KPRIORITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  BasePriority;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ProcessId;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  InheritedFromProcessId;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HandleCount;<br>
&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Reserved2[2];<br>
&nbsp;&nbsp;&nbsp;  VM_COUNTERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  VmCounters;<br>
&nbsp;&nbsp;&nbsp;  IO_COUNTERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IoCounters;<br>
&nbsp;&nbsp;&nbsp;  SYSTEM_THREAD_INFORMATION  Threads[5];<br>
} SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION;<br>
<br>
<br>
<br>
typedef DWORD (WINAPI* PQUERYSYSTEM)(UINT, PVOID, DWORD,PDWORD);<br>
<br>
/************************************************************************/<br>
/* 函数说明：<br>
&nbsp;&nbsp;  参数：dwThreadID 代表线程ID ,这里主要是验证线程的ID<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  szProcessName,表示线程所在的进程名<br>
<br>
  返回值：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  true： 表示线程被挂起<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  false： 表示线程正常。<br>
<br>
*/<br>
/************************************************************************/<br>
<br>
BOOL IsThreadSuspend(DWORD dwThreadID,wchar_t *szProcessName)<br>
{<br>
&nbsp;&nbsp;&nbsp;  ULONG cbBuffer = 0x5000;<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  BOOL  bRet = FALSE;<br>
<br>
&nbsp;&nbsp;&nbsp;  LPVOID pBuffer = NULL;<br>
&nbsp;&nbsp;&nbsp;  NTSTATUS Status;<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;  DWORD b=0;<br>
<br>
&nbsp;&nbsp;&nbsp;  PQUERYSYSTEM NtQuerySystemInformation;<br>
&nbsp;&nbsp;&nbsp;  PSYSTEM_PROCESS_INFORMATION pInfo ;<br>
<br>
&nbsp;&nbsp;&nbsp;  NtQuerySystemInformation = (PQUERYSYSTEM) GetProcAddress(<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  LoadLibrary( &quot;ntdll.dll&quot; ),<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &quot;NtQuerySystemInformation&quot; );<br>
<br>
&nbsp;&nbsp;&nbsp;  do<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  pBuffer = malloc(cbBuffer);<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if (pBuffer == NULL)<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  Status = NtQuerySystemInformation(<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  SystemProcessesAndThreadsInformation,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  pBuffer, cbBuffer, NULL);<br>
<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if (Status == STATUS_INFO_LENGTH_MISMATCH)<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  free(pBuffer);<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  cbBuffer *= 2;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  else if (!NT_SUCCESS(Status))<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  free(pBuffer);<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
<br>
&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;  while (Status == STATUS_INFO_LENGTH_MISMATCH);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;  pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;<br>
<br>
&nbsp;&nbsp;&nbsp;  for (;;)<br>
&nbsp;&nbsp;&nbsp;  {<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if (pInfo-&gt;NextEntryDelta == 0)<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if(pInfo-&gt;ProcessName.Buffer!=NULL &amp;&amp;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  !_wcsicmp(pInfo-&gt;ProcessName.Buffer,szProcessName))<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  for(b=0;b&lt;pInfo-&gt;ThreadCount ;b++)<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if(pInfo-&gt;Threads[b].ClientId.UniqueThread == dwThreadID ) //找到线程&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if(pInfo-&gt;Threads[b].State == StateWait &amp;&amp; pInfo-&gt;Threads[b].WaitReason == Suspended) //线程被挂起<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  bRet = TRUE;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo) +&nbsp;&nbsp;&nbsp;  pInfo-&gt;NextEntryDelta);<br>
&nbsp;&nbsp;&nbsp;  }<br>
<br>
&nbsp;&nbsp;&nbsp;  free(pBuffer);<br>
&nbsp;&nbsp;&nbsp;  return bRet;<br>
}&nbsp;&nbsp;&nbsp;  <br>
<br>
<br>
/**************************************************************/<br>
/*判断线程是否被终止 , 如果终止返回FALSE,如果还活着返回TRUE<br>
/**************************************************************/<br>
<br>
BOOL IsThreadAlive(DWORD dwThreadID)<br>
{<br>
&nbsp;&nbsp;&nbsp;  BOOL bRet = FALSE;<br>
&nbsp;&nbsp;&nbsp;  DWORD ExitCode = 0;<br>
<br>
&nbsp;&nbsp;&nbsp;  HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION,FALSE,dwThreadID);<br>
&nbsp;&nbsp;&nbsp;  if(hThread != NULL)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if(GetExitCodeThread(hThread,&amp;ExitCode))<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if( ExitCode == STILL_ACTIVE)<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  bRet = TRUE;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br>
<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  CloseHandle(hThread);<br>
&nbsp;&nbsp;&nbsp;  }<br>
<br>
&nbsp;&nbsp;&nbsp;  return bRet;<br>
}<br>
<br>
int _tmain(int argc, _TCHAR* argv[])<br>
{<br>
<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  BOOL bRET =IsThreadSuspend(2320,L&quot;EXPLORER.EXE&quot;);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;  if(bRET)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;   printf(&quot; 2320线程被挂起了！&quot;);<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  return 0;<br>
}<br>
<br> <a href="http://hi.baidu.com/combojiang/blog/item/256afb3fec8745e554e7239a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/windows%20sdk%BF%AA%B7%A2">windows sdk开发</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/256afb3fec8745e554e7239a.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-06  11:31</pubDate>
        <category><![CDATA[windows sdk开发]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/256afb3fec8745e554e7239a.html</guid>
</item>

<item>
        <title><![CDATA[阻止全局钩子的加载[转载】]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/163e6919edf1bd4d43a9adcd.html]]></link>
        <description><![CDATA[
		
		网上有一篇关于这个问题的文章，题目叫《防止全局钩子的侵入》，作者不祥。文中简单分析了一下钩子的原理，然后使用了微软的Detours库进行 API拦截。如果只是为了拦截一个函数，使用Detours好像有点儿浪费。本文不使用Detours库，直接对LoadLibraryExW函数进行拦 截。<br>
先说一下全局钩子是怎么进入到我们的程序里来的。假如有个程序A安装了WH_GETMESSAGE的全局钩子，钩子函数在B.dll中，那么当其它程 序在调用GetMessage函数从自己的消息队列中取消息的时候，系统发现程序A安装了WH_GETMESSAGE的全局钩子，就会检查调用 GetMessage的进程是否加载了B.dll，如果没有，就调用LoadLibrary进行加载，然后调用B.dll中的钩子过程。这样，钩子dll 就会在所有调用GetMessage的进程中加载。<br>
我们要做的工作，就是在系统调用LoadLibrary的时候让它失败。这样做有两个问题：
<ol>
    <li>LoadLibrary函数这一次失败了，下一次系统还是会去尝试加载它。看起来可能会影响效率，但是即使你不让它失败，每次有消息的时候，系统也是会去调用那个钩子过程的，哪种方法更影响效率呢？这就不知道了，呵呵；</li>
    <li>怎 么知道什么时候让LoadLibrary失败呢？不能都让它失败吧，这样会死的很惨的:(.经过研究发现，正常的加载dll函数调用都是从 kernel32.dll中来的，而只有加载钩子过程是在user32.dll中进行的(winxp系统下，以后的不知道是否也是这样)。我们可以判断一 下LoadLibrary函数的返回地址，如果是在user32.dll的地址空间，就认为是钩子dll的加载，直接返回0就可以了。</li>
</ol>
<p>　　然后就来谈谈我们的API拦截。因为user32.dll中是用的LoadLibraryExW来加载钩子dll的，所以我们只需要拦截这么一个函数就可以了。分成三个步骤：</p>
<ol>
    <li>提供一个替代LoadLibraryExW的函数，假设名字叫newLoadLibraryExW，注意，函数原型要和LoadLibraryExW一模一样，本进程内所有对LoadLibraryExW的调用都会转到这儿来；
    <pre>HMODULE WINAPI newLoadLibraryExW(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags)<br>{<br> //获取函数的返回地址参考文章最后的注1<br> DWORD dwCaller;<br> __asm push dword ptr [ebp+4]<br> __asm pop  dword ptr [dwCaller] <br> <br> //判断是否是从User32.dll调用的<br> //m_dwUser32Low和m_dwUser32Hi保存user32.dll的加载地址的上下限<br> if(dwCaller &gt; m_dwUser32Low &amp;&amp; dwCaller &lt; m_dwUser32Hi)<br> {<br>   //TRACE something hint infomation<br>   return 0;<br> }<br> return rawLoadLibraryExW(lpLibFileName,hFile,dwFlags);<br>}</pre>
    </li>
    <li>提供一块空间，假设这块空间的起始地址是fakeLoadLibraryExW，把LoadLibraryExW函数前N个字节保存下来，然后再用一个jmp指令跳回（LoadLibraryExW＋N）地址处继续执行，在这里，N取7，具体原因在下边讲；</li>
    <li>修改LoadLibraryExW函数的前5个字节，用一个jmp 指令跳到我们的newLoadLibraryExW函数起始处。虽然这里只用了5个字节，但是我们先看一下LoadLibraryExW函数的前两条指令：</li>
</ol>
<pre>//你机器上的版本具体的数字可能和我的不一样<br>push 34h?//6A 34<br>push 7C80E288h?//68 88 E2 80 7C</pre>
<p>　　一共有7个字节，我们不能只修改前5个字节，然后从fakeLoadLibraryExW函数跳到第6个字节处开始执行，而要跳到第三条指令即第8个字节开始处，这就是上一步N为什么取7的原因。画个图示意一下，修改前：</p>
<p><img height="128" width="289" src="http://www.vckbase.com/document/journal/vckbase49/images/BlockDll_before.gif"></p>
<p>修改后：</p>
<p>　<img height="126" width="645" src="http://www.vckbase.com/document/journal/vckbase49/images/BlockDll_after.gif"></p>
<p>以下是封装的一个类，使用时定义一个该类的全局变量，调用一下PatchLoadLibrary函数即可。</p>
<pre>//***********************************************************************************//<br>//  FileName : GBlockHookDll.h                    <br>//  Author ：耿海增            <br>//  Date : 2006.10.07                  <br>//***********************************************************************************//<br><br>#pragma once<br><br>#include <psapi.h><br>#pragma comment(lib,&quot;psapi.lib&quot;)<br><br>class GBlockHookDll<br>{<br>public:<br> GBlockHookDll()<br> {<br>&nbsp;&nbsp;    MODULEINFO user32ModInfo = {0};<br> <br>&nbsp;&nbsp;    //获取user32.dll的加载基址和映象大小&nbsp;&nbsp;<br>&nbsp;&nbsp;    GetModuleInformation(GetCurrentProcess(),GetModuleHandle(&quot;user32.dll&quot;),&amp;user32ModInfo,sizeof(user32ModInfo));<br>&nbsp;&nbsp;    m_dwUser32Low = (DWORD)user32ModInfo.lpBaseOfDll;<br>&nbsp;&nbsp;    m_dwUser32Hi = (DWORD)user32ModInfo.lpBaseOfDll+user32ModInfo.SizeOfImage;<br> }<br> void PatchLoadLibrary()<br> {<br>&nbsp;&nbsp;    //LoadLibraryExW<br>&nbsp;&nbsp;    //7C801AF1 6A 34                push        34h<br>&nbsp;&nbsp;    //7C801AF3 68 88 E2 80 7C       push        7C80E288h<br>&nbsp;&nbsp;    LPVOID* pfnRaw = (LPVOID*)&amp;rawLoadLibraryExW;<br>&nbsp;&nbsp;    LPVOID fnNew = (LPVOID)newLoadLibraryExW;<br>&nbsp;&nbsp;    BYTE* fnRaw = (BYTE*)*pfnRaw;<br>&nbsp;&nbsp;    //1 save the first 7 bytes<br>&nbsp;&nbsp;    const int nFirstBytes = 7;<br>&nbsp;&nbsp;    BYTE* fnFake = (BYTE*)fakeLoadLibraryExW;<br>&nbsp;&nbsp;    memcpy(fnFake,*pfnRaw,nFirstBytes);<br>&nbsp;&nbsp;    fnFake[nFirstBytes] = 0xE9;&nbsp;&nbsp;    //jmp to rawAddr+nFirstBytes<br>&nbsp;&nbsp;    *(UINT32*)(fnFake + nFirstBytes+1) = (UINT32)fnRaw+nFirstBytes - (UINT32)(fnFake + nFirstBytes + 5);<br>&nbsp;&nbsp;    //2 modify the raw to jmp to fnNew<br>&nbsp;&nbsp;    DWORD dwOldProtect = 0;<br>&nbsp;&nbsp;    VirtualProtect(fnRaw,nFirstBytes,PAGE_READWRITE,&amp;dwOldProtect); //修改该代码段的属性为可写<br>&nbsp;&nbsp;    *fnRaw = 0xE9;<br>&nbsp;&nbsp;    *(UINT32*)(fnRaw+1) = (UINT32)fnNew - (UINT32)(fnRaw + 5);<br>&nbsp;&nbsp;    VirtualProtect(fnRaw,nFirstBytes,dwOldProtect,0);<br>&nbsp;&nbsp;    //3 change the rawPointer<br>&nbsp;&nbsp;    *pfnRaw = fnFake;<br> }<br>private: <br> static HMODULE WINAPI newLoadLibraryExW(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags)<br> {<br>&nbsp;&nbsp;    //get the return address<br>&nbsp;&nbsp;    DWORD dwCaller;<br>&nbsp;&nbsp;    __asm push dword ptr [ebp+4]<br>&nbsp;&nbsp;    __asm pop  dword ptr [dwCaller]<br>&nbsp;&nbsp;    if(dwCaller &gt; m_dwUser32Low &amp;&amp; dwCaller &lt; m_dwUser32Hi)<br>&nbsp;&nbsp;    {<br> #ifdef _DEBUG<br>&nbsp;&nbsp;&nbsp;    UINT uLenWide = lstrlenW(lpLibFileName);<br>&nbsp;&nbsp;&nbsp;    char* pNewChar = new char[uLenWide + 1];<br>&nbsp;&nbsp;&nbsp;    memset(pNewChar,0,uLenWide+1);<br>&nbsp;&nbsp;&nbsp;    WideCharToMultiByte(CP_ACP,0,lpLibFileName,-1,pNewChar,uLenWide,NULL,NULL);<br>&nbsp;&nbsp;&nbsp;    TRACE2(&quot;.......................LoadLibrary:return addr 0x%x,%s &quot;,dwCaller,pNewChar);<br>&nbsp;&nbsp;&nbsp;    TRACE(&quot;Blocked.......................\n&quot;);<br>&nbsp;&nbsp;&nbsp;    delete []pNewChar;<br> #endif<br>&nbsp;&nbsp;&nbsp;    return 0;<br>&nbsp;&nbsp;    }<br>&nbsp;&nbsp;    return rawLoadLibraryExW(lpLibFileName,hFile,dwFlags);<br> }<br>private:<br> static DWORD m_dwUser32Low;&nbsp;&nbsp;&nbsp;&nbsp;    //user32.dll 的加载基址<br> static DWORD m_dwUser32Hi;&nbsp;&nbsp;&nbsp;&nbsp;    //user32.dll 的加载基址＋ImageSize<br> static BYTE  fakeLoadLibraryExW[12]; //save first bytes of the raw function,and jmp back to that function<br> //保存LoadLibraryExW的指针，然后修改为fakeLoadLibraryExW<br> static HMODULE (WINAPI *rawLoadLibraryExW)( LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags );<br>};<br>DWORD GBlockHookDll::m_dwUser32Low = 0;<br>DWORD GBlockHookDll::m_dwUser32Hi  = 0;<br>BYTE GBlockHookDll::fakeLoadLibraryExW[12] = {0};<br>HMODULE (WINAPI *GBlockHookDll::rawLoadLibraryExW)(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags) = LoadLibraryExW;<br></psapi.h></pre>
注1：怎么知道函数的返回地址呢？我们都知道，函数调用的时候，先要把参数入栈，然后把返回地址入栈，这样，在我们的函数里，esp指向的应该就是函数的返回地址了。但是为了返回函数时恢复原来的栈和在函数中方便引用传递的参数，编译器一般都会产生两条指令：
<pre>push ebp<br>mov ebp,esp</pre>
先把ebp入栈，把原来的esp保存在ebp寄存器中，这样，我们的返回地址就是[ebp+4]，第一个参数是[ebp+8],第二个是[ebp+0xC]<br>
注2：如果想写一个通用一点儿的API Hook，就不能简单的patch前5个或者前7字节了，需要根据不同的指令分析需要patch多少字节。可以参考微软的  Detours 的实现。<br>
<a href="http://www.vckbase.com/document/viewdoc/?id=1694" target="_blank">http://www.vckbase.com/document/viewdoc/?id=1694</a> <a href="http://hi.baidu.com/combojiang/blog/item/163e6919edf1bd4d43a9adcd.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/%B4%FA%C2%EB%D4%D3%CC%B8">代码杂谈</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/163e6919edf1bd4d43a9adcd.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-04  02:18</pubDate>
        <category><![CDATA[代码杂谈]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/163e6919edf1bd4d43a9adcd.html</guid>
</item>

<item>
        <title><![CDATA[自己写的一个GetProcAddress【转载】]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/10bc4b23e2efab4cad34dec2.html]]></link>
        <description><![CDATA[
		
		<span style="color: rgb(0, 0, 0);">DWORD GetFunctionAddress( HMODULE phModule,</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> pProcName )<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">phModule)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> PIMAGE_DOS_HEADER pimDH </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (PIMAGE_DOS_HEADER)phModule;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> PIMAGE_NT_HEADERS pimNH </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (PIMAGE_NT_HEADERS)((</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimDH</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">e_lfanew);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> PIMAGE_EXPORT_DIRECTORY pimED </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (PIMAGE_EXPORT_DIRECTORY)((DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimNH</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> DWORD pExportSize </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> pimNH</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> DWORD pResult </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> <br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ((DWORD)pProcName </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0x10000</span><span style="color: rgb(0, 0, 0);">)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif"> </span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ((DWORD)pProcName </span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);"> pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">NumberOfFunctions</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">Base </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> (DWORD)pProcName </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">Base)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;  pResult </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">((DWORD</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)((DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">AddressOfFunctions))[(DWORD)pProcName</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">Base];<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"> }</span></span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif"> </span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;  DWORD</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> pAddressOfNames </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (DWORD</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)((DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">AddressOfNames);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">NumberOfNames;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;</span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> pExportName </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)(pAddressOfNames[i]</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">(DWORD)phModule);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (strcmp(pProcName,pExportName) </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;  WORD</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> pAddressOfNameOrdinals </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (WORD</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)((DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">AddressOfNameOrdinals);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;  pResult&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">((DWORD</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)((DWORD)phModule</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pimED</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">AddressOfFunctions))[pAddressOfNameOrdinals[i]];<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;  }</span></span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;  }</span></span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"> }</span></span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;  (pResult </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);"> pResult </span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);"> (DWORD)pimED </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);"> pResult </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> (DWORD)pimED</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">pExportSize)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif"> </span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> pDirectStr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)pResult;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> pstrok </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pDirectStr)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;</span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pDirectStr </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img align="top" style="display: none;" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span><span style="color: rgb(0, 0, 0);">{<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;  pstrok </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;  }</span></span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;  pDirectStr</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;  }</span></span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">pstrok)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> pdllname[MAX_PATH];<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;  pnamelen </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> pDirectStr</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)pResult;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (pnamelen </span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;  memcpy(pdllname,(</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)pResult,pnamelen);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;  pdllname[pnamelen] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;  HMODULE phexmodule </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> GetModuleHandle(pdllname);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;  pResult </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> GetFunctionAddress(phexmodule,pDirectStr</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"> }</span></span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"><br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif"> </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> pResult;<br>
<img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="color: rgb(0, 0, 0);"><br>
</span> <a href="http://hi.baidu.com/combojiang/blog/item/10bc4b23e2efab4cad34dec2.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/%B4%FA%C2%EB%D4%D3%CC%B8">代码杂谈</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/10bc4b23e2efab4cad34dec2.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-04  01:51</pubDate>
        <category><![CDATA[代码杂谈]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/10bc4b23e2efab4cad34dec2.html</guid>
</item>

<item>
        <title><![CDATA[一个比较变态的MessageBox]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/a56a9090e63a7a85a977a4c9.html]]></link>
        <description><![CDATA[
		
		<font color="#800000">.text:0040A4CB MyMessageBox&nbsp;&nbsp;&nbsp;    proc near&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    <br>
.text:0040A4CB<br>
.text:0040A4CB var_24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = dword ptr -24h<br>
.text:0040A4CB var_14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = byte ptr -14h<br>
.text:0040A4CB var_C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = byte ptr -0Ch<br>
.text:0040A4CB var_8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = byte ptr -8<br>
.text:0040A4CB Hwnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = dword ptr -4<br>
.text:0040A4CB arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = dword ptr  8<br>
.text:0040A4CB arg_4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = dword ptr  0Ch<br>
.text:0040A4CB arg_8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    = dword ptr  10h<br>
.text:0040A4CB<br>
.text:0040A4CB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    edi, edi<br>
.text:0040A4CD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    ebp<br>
.text:0040A4CE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    ebp, esp<br>
.text:0040A4D0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    sub&nbsp;&nbsp;&nbsp;&nbsp;    esp, 14h<br>
.text:0040A4D3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    ebx<br>
.text:0040A4D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    esi<br>
.text:0040A4D5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    edi<br>
.text:0040A4D6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    CallEncodePointer<br>
.text:0040A4DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    and&nbsp;&nbsp;&nbsp;&nbsp;    [ebp+Hwnd], 0<br>
.text:0040A4DF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    cmp&nbsp;&nbsp;&nbsp;&nbsp;    PMessageBoxA_ENCODED, 0<br>
.text:0040A4E6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    ebx, eax<br>
.text:0040A4E8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jnz&nbsp;&nbsp;&nbsp;&nbsp;    loc_40A57C<br>
.text:0040A4EE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    offset LibFileName ; &quot;USER32.DLL&quot;<br>
.text:0040A4F3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    ds:LoadLibraryA<br>
.text:0040A4F9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    edi, eax<br>
.text:0040A4FB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    edi, edi<br>
.text:0040A4FD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    loc_40A62D<br>
.text:0040A503&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    esi, ds:GetProcAddress<br>
.text:0040A509&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    offset aMessageboxa ; &quot;MessageBoxA&quot;<br>
.text:0040A50E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; hModule<br>
.text:0040A50F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    esi ; GetProcAddress<br>
.text:0040A511&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A513&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    loc_40A62D<br>
.text:0040A519&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; lpProcName<br>
.text:0040A51A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallEncodePointer ; 返回调用EncodePointer后的结果。<br>
.text:0040A51F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    [esp+24h+var_24], offset aGetactivewindo ; &quot;GetActiveWindow&quot;<br>
.text:0040A526&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; hModule<br>
.text:0040A527&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    PMessageBoxA_ENCODED, eax<br>
.text:0040A52C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    esi ; GetProcAddress<br>
.text:0040A52E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; lpProcName<br>
.text:0040A52F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallEncodePointer ; 返回调用EncodePointer后的结果。<br>
.text:0040A534&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    [esp+24h+var_24], offset aGetlastactivep ; &quot;GetLastActivePopup&quot;<br>
.text:0040A53B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; hModule<br>
.text:0040A53C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    PGetActiveWindow_ENCODED, eax<br>
.text:0040A541&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    esi ; GetProcAddress<br>
.text:0040A543&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; lpProcName<br>
.text:0040A544&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallEncodePointer ; 返回调用EncodePointer后的结果。<br>
.text:0040A549&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    [esp+24h+var_24], offset aGetuserobjecti ; &quot;GetUserObjectInformationA&quot;<br>
.text:0040A550&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; hModule<br>
.text:0040A551&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    pGetLastActivePopup_ENCODED, eax<br>
.text:0040A556&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    esi ; GetProcAddress<br>
.text:0040A558&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax<br>
.text:0040A559&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallEncodePointer ; 返回调用EncodePointer后的结果。<br>
.text:0040A55E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A55F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    pGetUserObjectInformationA_ENCODED, eax<br>
.text:0040A564&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A566&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A57C<br>
.text:0040A568&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    offset aGetprocesswind ; &quot;GetProcessWindowStation&quot;<br>
.text:0040A56D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; hModule<br>
.text:0040A56E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    esi ; GetProcAddress<br>
.text:0040A570&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax<br>
.text:0040A571&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallEncodePointer ; 返回调用EncodePointer后的结果。<br>
.text:0040A576&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A577&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    PGetProcessWindowStation_ENCODED, eax<br>
.text:0040A57C<br>
.text:0040A57C loc_40A57C:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; CODE XREF: MyMessageBox+1D j<br>
.text:0040A57C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; MyMessageBox+9B j<br>
.text:0040A57C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    eax, PGetProcessWindowStation_ENCODED<br>
.text:0040A581&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    cmp&nbsp;&nbsp;&nbsp;&nbsp;    eax, ebx<br>
.text:0040A583&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5D4<br>
.text:0040A585&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    cmp&nbsp;&nbsp;&nbsp;&nbsp;    pGetUserObjectInformationA_ENCODED, ebx<br>
.text:0040A58B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5D4<br>
.text:0040A58D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax<br>
.text:0040A58E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallDecodePointer<br>
.text:0040A593&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    pGetUserObjectInformationA_ENCODED<br>
.text:0040A599&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    esi, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; esi保存解码后的GetProcessWindowStation地址<br>
.text:0040A59B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallDecodePointer<br>
.text:0040A5A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A5A1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A5A2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    edi, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; edi保存解码后的GetUserObjectInformation地址<br>
.text:0040A5A4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    esi, esi<br>
.text:0040A5A6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5D4<br>
.text:0040A5A8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    edi, edi<br>
.text:0040A5AA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5D4<br>
.text:0040A5AC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; call  GetProcessWindowStation<br>
.text:0040A5AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A5B0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5CB<br>
.text:0040A5B2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    lea&nbsp;&nbsp;&nbsp;&nbsp;    ecx, [ebp+var_8]<br>
.text:0040A5B5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A5B6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    0Ch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; nLength<br>
.text:0040A5B6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ;<br>
.text:0040A5B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    lea&nbsp;&nbsp;&nbsp;&nbsp;    ecx, [ebp+var_14] ; typedef struct tagUSEROBJECTFLAGS {<br>
.text:0040A5B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ;&nbsp;&nbsp;&nbsp;&nbsp;    BOOL fInherit;<br>
.text:0040A5B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ;&nbsp;&nbsp;&nbsp;&nbsp;    BOOL fReserved;<br>
.text:0040A5B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ;&nbsp;&nbsp;&nbsp;&nbsp;    DWORD dwFlags;<br>
.text:0040A5B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; } USEROBJECTFLAGS,  *PUSEROBJECTFLAGS;<br>
.text:0040A5BB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A5BC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; UOI_FLAGS<br>
.text:0040A5BC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ;<br>
.text:0040A5BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; handle<br>
.text:0040A5BF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; call GetUserObjectInformation<br>
.text:0040A5C1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A5C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5CB ; 失败跳转<br>
.text:0040A5C5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    [ebp+var_C], 1  ; 判断dwFlags属性是否为WSF_VISIBLE<br>
.text:0040A5C9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jnz&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A5D4<br>
.text:0040A5CB<br>
.text:0040A5CB loc_40A5CB:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; CODE XREF: MyMessageBox+E5 j<br>
.text:0040A5CB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; MyMessageBox+F8 j<br>
.text:0040A5CB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    [ebp+arg_8], 200000h<br>
.text:0040A5D2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jmp&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A60D<br>
.text:0040A5D4 ; ---------------------------------------------------------------------------<br>
.text:0040A5D4<br>
.text:0040A5D4 loc_40A5D4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; CODE XREF: MyMessageBox+B8 j<br>
.text:0040A5D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; MyMessageBox+C0 j ...<br>
.text:0040A5D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    eax, PGetActiveWindow_ENCODED<br>
.text:0040A5D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    cmp&nbsp;&nbsp;&nbsp;&nbsp;    eax, ebx<br>
.text:0040A5DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A60D<br>
.text:0040A5DD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax<br>
.text:0040A5DE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallDecodePointer<br>
.text:0040A5E3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A5E4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A5E6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A60D<br>
.text:0040A5E8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    eax ; PGetActiveWindow_ENCODED ; 调用GetActiveWindow<br>
.text:0040A5EA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    [ebp+Hwnd], eax<br>
.text:0040A5ED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A5EF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A60D<br>
.text:0040A5F1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    eax, pGetLastActivePopup_ENCODED<br>
.text:0040A5F6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    cmp&nbsp;&nbsp;&nbsp;&nbsp;    eax, ebx<br>
.text:0040A5F8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A60D<br>
.text:0040A5FA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    eax<br>
.text:0040A5FB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallDecodePointer<br>
.text:0040A600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A601&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A603&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A60D<br>
.text:0040A605&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    [ebp+Hwnd]<br>
.text:0040A608&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    eax ; pGetLastActivePopup_ENCODED ; 调用GetLastActivePopup<br>
.text:0040A60A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    mov&nbsp;&nbsp;&nbsp;&nbsp;    [ebp+Hwnd], eax ; 保存得到的最后一个弹出窗口<br>
.text:0040A60D<br>
.text:0040A60D loc_40A60D:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; CODE XREF: MyMessageBox+107 j<br>
.text:0040A60D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; MyMessageBox+110 j ...<br>
.text:0040A60D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    PMessageBoxA_ENCODED<br>
.text:0040A613&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    LoadModuleAndCallDecodePointer<br>
.text:0040A618&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ecx<br>
.text:0040A619&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    test&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A61B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A62D<br>
.text:0040A61D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    [ebp+arg_8]<br>
.text:0040A620&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    [ebp+arg_4]<br>
.text:0040A623&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    [ebp+arg_0]<br>
.text:0040A626&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    push&nbsp;&nbsp;&nbsp;    [ebp+Hwnd]<br>
.text:0040A629&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    call&nbsp;&nbsp;&nbsp;    eax ; PGetProcessWindowStation_ENCODED ; 调用MessageBoxA<br>
.text:0040A62B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    jmp&nbsp;&nbsp;&nbsp;&nbsp;    short loc_40A62F<br>
.text:0040A62D ; ---------------------------------------------------------------------------<br>
.text:0040A62D<br>
.text:0040A62D loc_40A62D:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; CODE XREF: MyMessageBox+32 j<br>
.text:0040A62D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; MyMessageBox+48 j ...<br>
.text:0040A62D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    xor&nbsp;&nbsp;&nbsp;&nbsp;    eax, eax<br>
.text:0040A62F<br>
.text:0040A62F loc_40A62F:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ; CODE XREF: MyMessageBox+160 j<br>
.text:0040A62F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    edi<br>
.text:0040A630&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    esi<br>
.text:0040A631&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    pop&nbsp;&nbsp;&nbsp;&nbsp;    ebx<br>
.text:0040A632&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    leave<br>
.text:0040A633&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    retn<br>
.text:0040A633 MyMessageBox&nbsp;&nbsp;&nbsp;    endp</font><br>
<br>
这个函数写的很麻烦，主要思路是。<br>
<br>
1）从user32.dll中获取函数地址，然后加密这些函数地址。<br>
2）解密函数地址，并调用函数，获得当前进程桌面，判断桌面属性是否可见。<br>
&nbsp;&nbsp;    如果可见，则获取当前活动的窗口，然后得到活动窗口最后弹出的一个popup窗口句柄<br>
&nbsp;&nbsp;    最后使用这个句柄，弹出MessageBox<br>
<br>
3）加密函数和解密函数来源于一个dll模块。 <a href="http://hi.baidu.com/combojiang/blog/item/a56a9090e63a7a85a977a4c9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/%B4%FA%C2%EB%D4%D3%CC%B8">代码杂谈</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/a56a9090e63a7a85a977a4c9.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-03  17:29</pubDate>
        <category><![CDATA[代码杂谈]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/a56a9090e63a7a85a977a4c9.html</guid>
</item>

<item>
        <title><![CDATA[一段获取ssdt表及其中函数的简单代码]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/7eb228d363c116d7a8ec9a05.html]]></link>
        <description><![CDATA[
		
		typedef struct _SYSTEM_SERVICE_TABLE<br>
{<br>
&nbsp;&nbsp;&nbsp;         PNTPROC&nbsp;&nbsp;&nbsp;         ServiceTable ;&nbsp;&nbsp;&nbsp;         // array of entry points<br>
&nbsp;&nbsp;&nbsp;         PULONG&nbsp;&nbsp;&nbsp;         CounterTable ;&nbsp;&nbsp;&nbsp;         // array of usage counters . be NULL<br>
&nbsp;&nbsp;&nbsp;         ULONG&nbsp;&nbsp;&nbsp;         ServiceLimit ;&nbsp;&nbsp;&nbsp;         // number of table entries<br>
&nbsp;&nbsp;&nbsp;         UCHAR*&nbsp;&nbsp;&nbsp;         ArgumentTable ;&nbsp;&nbsp;&nbsp;         // array of bytes counts<br>
} SYSTEM_SERVICE_TABLE , *PSYSTEM_SERVICE_TABLE , **PPSYSTEM_SERVICE_TABLE ;<br>
<br>
ULONG GetSSDTFunction(ULONG nIndex, ULONG *pFunAddr  )<br>
{<br>
&nbsp;&nbsp;      &nbsp;&nbsp;       PETHREAD  kthread;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         PSYSTEM_SERVICE_TABLE&nbsp;&nbsp;         pssdt;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         kthread = (ULONG)PsGetCurrentThread();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       pssdt = kthread -&gt;ServiceTable;<br>
&nbsp;&nbsp;&nbsp;&nbsp;       <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      if( nIndex &lt; pssdt-&gt;ServiceLimit )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         *pFunAddr = pssdt-&gt;ServiceTable [nIndex];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         return&nbsp;&nbsp;         *pFunAddr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         }<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         return&nbsp;&nbsp;         0;<br>
<br>
} <a href="http://hi.baidu.com/combojiang/blog/item/7eb228d363c116d7a8ec9a05.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/windows%C4%DA%BA%CB%CC%BD%CB%F7">windows内核探索</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/7eb228d363c116d7a8ec9a05.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-02  23:34</pubDate>
        <category><![CDATA[windows内核探索]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/7eb228d363c116d7a8ec9a05.html</guid>
</item>

<item>
        <title><![CDATA[Windows System Call Table (NT/2000/XP/2003/Vista)]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/2698e0879fa7c92dc75cc30f.html]]></link>
        <description><![CDATA[
		
		<a href="http://www.pediy.com/document/Windows_System_Call_Table/Windows_System_Call_Table.htm" target="_blank">链接： http://www.pediy.com/document/Windows_System_Call_Table/Windows_System_Call_Table.htm</a><br>
<br>
这个表虽然没有及时更新，但是依然很强大。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/windows%C4%DA%BA%CB%CC%BD%CB%F7">windows内核探索</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/2698e0879fa7c92dc75cc30f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-26  12:45</pubDate>
        <category><![CDATA[windows内核探索]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/2698e0879fa7c92dc75cc30f.html</guid>
</item>

<item>
        <title><![CDATA[注入进程实现hook API -- 拦截并修改API函数参数]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/d17aa88ba6c94315c9fc7a29.html]]></link>
        <description><![CDATA[
		
		<font color="#0000ff">// MainProcessDll.cpp : Defines the entry point for the DLL application.<br>
//<br>
#include &lt;windows.h&gt;<br>
#include &lt;stdlib.h&gt;<br>
#include &lt;stdio.h&gt;<br>
<br>
char g_waiguaFullPath[0x100] = {0};<br>
DWORD g_FunAddr = 0;<br>
DWORD g_PatchFunc = 0;<br>
DWORD g_PatchAllHookFun = 0;<br>
DWORD g_CmdLen = 5;<br>
BYTE g_Cmd[0x14] = {0};<br>
LPVOID g_mem = NULL;<br>
DWORD g_hookflag = 0;<br>
<br>
WCHAR tt[] = L&quot;tt&quot;;<br>
<br>
typedef HANDLE (CALLBACK *PCreateEventW)(<br>
&nbsp;&nbsp;&nbsp;          LPSECURITY_ATTRIBUTES lpEventAttributes,<br>
&nbsp;&nbsp;&nbsp;          BOOL bManualReset,<br>
&nbsp;&nbsp;&nbsp;          BOOL bInitialState,<br>
&nbsp;&nbsp;&nbsp;          LPCWSTR lpName<br>
&nbsp;&nbsp;&nbsp;          );<br>
<br>
PCreateEventW  PCreateEventWFun = NULL;<br>
<br>
<br>
BOOL APIENTRY DllMain( HMODULE hModule, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          DWORD  ul_reason_for_call, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          LPVOID lpReserved<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           )<br>
{<br>
&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          return TRUE;<br>
}<br>
<br>
void __stdcall FreeMem()<br>
{<br>
&nbsp;&nbsp;&nbsp;          if(g_mem)<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          VirtualFree(g_mem,0x14,0x8000);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_mem = NULL;<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return;<br>
&nbsp;&nbsp;&nbsp;          }<br>
}<br>
<br>
void __stdcall RestoreHookFunction()<br>
{<br>
&nbsp;&nbsp;&nbsp;          if(g_mem == NULL)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return;<br>
<br>
&nbsp;&nbsp;&nbsp;          if(!g_hookflag)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return;<br>
<br>
&nbsp;&nbsp;&nbsp;          memcpy((void *)g_FunAddr,g_Cmd,g_CmdLen);<br>
&nbsp;&nbsp;&nbsp;          FreeMem();<br>
}<br>
<br>
void __stdcall ModifyEventName(WCHAR *EventName)<br>
{<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;          _asm<br>
&nbsp;&nbsp;&nbsp;           {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           pushad<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           mov ebx,rand<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          mov edi,EventName<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           xor esi,esi<br>
GOON:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           call ebx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           cdq<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           mov  ecx,14h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           idiv ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           add  esi,2<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           add dl,61h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           cmp esi,0Ah<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           mov [esi + edi - 2],dl <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           jl  GOON<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           popad<br>
&nbsp;&nbsp;&nbsp;           }<br>
}<br>
<br>
void __stdcall CreateEventWHookFunction(DWORD pEsp)<br>
{<br>
&nbsp;&nbsp;&nbsp;           _asm<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          pushad<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov eax,pEsp<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov ecx,[eax + 0ch]<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov ebx,[ecx + 14h]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          test ebx,ebx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          jz&nbsp;&nbsp;          QUIT<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  ecx,4<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          lea  edi,tt<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          mov  esi,ebx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          xor  eax,eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          repne cmpsb<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          jz PIPEI <br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          sbb  eax,eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          sbb  eax,0ffffffffh<br>
PIPEI:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          test  eax,eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          jnz&nbsp;&nbsp;          QUIT <br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          call  RestoreHookFunction<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          push  ebx<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          call  ModifyEventName<br>
<br>
QUIT:<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          popad<br>
&nbsp;&nbsp;&nbsp;          }<br>
}<br>
<br>
void __stdcall PatchFunctionForAllHook(DWORD pEsp)<br>
{<br>
&nbsp;&nbsp;&nbsp;          _asm<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov eax,g_PatchFunc<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov ecx,pEsp<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          push ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          call eax&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          }<br>
}<br>
<br>
int __stdcall  AddCmdToBuff()<br>
{<br>
<br>
&nbsp;&nbsp;&nbsp;          if(g_mem == NULL)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return 1;<br>
<br>
&nbsp;&nbsp;&nbsp;          _asm<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          pushad<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  eax,g_mem<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  byte PTR[eax],60h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  byte PTR[eax + 1],9ch<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov byte PTR[eax + 1],54h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          mov byte PTR[eax + 1],0B9h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  edx,g_PatchFunc<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  [eax + 1],edx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  ecx,g_PatchAllHookFun<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  byte PTR[eax + 4],0E8h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          add  eax,4<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          sub  ecx,eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          sub  ecx,5<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  [eax + 1],ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  byte PTR[eax + 4],9Dh<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          add  eax, 4<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  byte PTR[eax + 1],61h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  ecx,g_CmdLen<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  ebx, ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          shr  ecx,2<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          inc  eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          lea  esi,g_Cmd<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  edi,eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          rep  movsd<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  ecx,ebx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          and  ecx,3<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          rep  movsb<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  ecx,g_CmdLen<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  edx,g_FunAddr<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          add  eax,ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          sub  edx,eax<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          lea  ecx,[edx + ecx - 5]<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  byte PTR[eax],0E9h<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov  [eax + 1],ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          popad<br>
<br>
&nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          return 0;<br>
}<br>
<br>
int __stdcall InlineHook()<br>
{<br>
&nbsp;&nbsp;&nbsp;          memcpy(g_Cmd,(void *)g_FunAddr, g_CmdLen);<br>
&nbsp;&nbsp;&nbsp;          _asm<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          push ecx<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          mov ecx,g_FunAddr<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov eax,g_mem<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov byte ptr[ecx],0E9h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          sub eax,ecx<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          sub eax,5<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov ecx,g_FunAddr&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          mov [ecx+1],eax<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          pop ecx <br>
&nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          g_hookflag = 1;<br>
&nbsp;&nbsp;&nbsp;          g_PatchAllHookFun = (DWORD)PatchFunctionForAllHook;<br>
<br>
&nbsp;&nbsp;&nbsp;          AddCmdToBuff();<br>
<br>
&nbsp;&nbsp;&nbsp;          return 0;<br>
}<br>
<br>
int __stdcall HookFunction(DWORD FunAddr,DWORD PatchFunc)<br>
{<br>
&nbsp;&nbsp;&nbsp;          DWORD OldProtect;<br>
&nbsp;&nbsp;&nbsp;          if(!(FunAddr &amp;&amp; PatchFunc))<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return 1;<br>
<br>
&nbsp;&nbsp;&nbsp;          g_FunAddr = FunAddr;<br>
&nbsp;&nbsp;&nbsp;          g_PatchFunc = PatchFunc;<br>
<br>
&nbsp;&nbsp;&nbsp;          if(!VirtualProtect((void *)g_FunAddr,5,PAGE_EXECUTE_READWRITE,&amp;OldProtect))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          return 2;<br>
&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          g_mem = VirtualAlloc(0,0x14,MEM_COMMIT,PAGE_EXECUTE_READWRITE);<br>
&nbsp;&nbsp;&nbsp;          if(g_mem == NULL)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;          return 3;<br>
&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          InlineHook();<br>
<br>
&nbsp;&nbsp;&nbsp;          return 0;<br>
}<br>
<br>
int __stdcall Runxxx(char *waiguafullPath)<br>
{<br>
&nbsp;&nbsp;&nbsp;          char EventName[0x104] = {0};<br>
<br>
&nbsp;&nbsp;&nbsp;          if(waiguafullPath == NULL) <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return 2;<br>
<br>
&nbsp;&nbsp;&nbsp;          lstrcpy(g_waiguaFullPath,waiguafullPath);<br>
<br>
&nbsp;&nbsp;&nbsp;          PCreateEventWFun = (PCreateEventW)GetProcAddress(<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          GetModuleHandle(&quot;kernel32.dll&quot;),<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;            &quot;CreateEventW&quot;);<br>
<br>
&nbsp;&nbsp;&nbsp;          if(!PCreateEventWFun)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return 1;<br>
<br>
&nbsp;&nbsp;&nbsp;          lstrcpy(EventName,&quot;tty_btn0&quot;);<br>
&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS,TRUE,EventName);<br>
&nbsp;&nbsp;&nbsp;          if(hEvent)<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          CloseHandle(hEvent);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          HookFunction((DWORD)PCreateEventWFun + 5,(DWORD)CreateEventWHookFunction);<br>
&nbsp;&nbsp;&nbsp;          }<br>
<br>
&nbsp;&nbsp;&nbsp;          return 0;<br>
}<br>
</font>                                         <br>
<font color="#993300">////MainProcessDll.def<br>
LIBARARY MainProcessDll<br>
EXPORTS<br>
<br>
Runxxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         @1</font><br>
<br>
<br>
<font color="#0000ff">// xxxxhook.cpp : Defines the entry point for the DLL application.<br>
//<br>
#include &lt;windows.h&gt;<br>
#include &lt;stdio.h&gt;<br>
<br>
#pragma&nbsp;&nbsp;          data_seg(&quot;Shared&quot;) <br>
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          g_waiguaFullPath[0x104] = {0};<br>
HHOOK&nbsp;&nbsp;&nbsp;&nbsp;          g_hHook = NULL;<br>
#pragma&nbsp;&nbsp;          data_seg() <br>
#pragma&nbsp;&nbsp;          comment(linker,&quot;/SECTION:Shared,RWS&quot;)&nbsp;&nbsp;          <br>
<br>
<br>
BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          g_IsHook = FALSE;<br>
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          g_MainProcessDll[0x104] = {0};<br>
HANDLE&nbsp;&nbsp;&nbsp;          g_hmod_xxxxhook_dll = NULL;<br>
HMODULE&nbsp;&nbsp;          g_hModuleMainProcess = NULL;<br>
typedef int (CALLBACK *pRunxxx)(char *waiguaFullPath);<br>
pRunxxx  RunxxxFun = NULL;<br>
<br>
<br>
<br>
BOOL APIENTRY DllMain( HANDLE hModule, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          DWORD  ul_reason_for_call, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          LPVOID lpReserved<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;           )<br>
{<br>
&nbsp;&nbsp;&nbsp;          g_hmod_xxxxhook_dll = hModule;<br>
&nbsp;&nbsp;&nbsp;          return TRUE;<br>
}<br>
<br>
<br>
LRESULT CALLBACK CallWndProc(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          int nCode,<br>
&nbsp;&nbsp;&nbsp;          WPARAM wParam,<br>
&nbsp;&nbsp;&nbsp;          LPARAM lParam<br>
)<br>
{<br>
&nbsp;&nbsp;&nbsp;          try<br>
&nbsp;&nbsp;&nbsp;          {<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          if(!g_IsHook)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          {&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          if(GetModuleHandle(&quot;pg_guiwnd.dll&quot;))<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_IsHook = TRUE;<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          lstrcpy(g_MainProcessDll,g_waiguaFullPath);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          lstrcat(g_MainProcessDll,&quot;MainProcessDll.dll&quot;);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_hModuleMainProcess = LoadLibrary(g_MainProcessDll);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          if(g_hModuleMainProcess)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          RunxxxFun = (pRunxxx)GetProcAddress(g_hModuleMainProcess,&quot;Runxxx&quot;);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          if(RunxxxFun != NULL) <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          RunxxxFun(g_waiguaFullPath);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          else<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          FreeLibrary(g_hModuleMainProcess);&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_hModuleMainProcess = NULL;<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          }<br>
&nbsp;&nbsp;&nbsp;          catch (...)<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          }<br>
<br>
&nbsp;&nbsp;&nbsp;          return CallNextHookEx(g_hHook,nCode,wParam,lParam);<br>
}<br>
<br>
void Install_InitPath()<br>
{<br>
&nbsp;&nbsp;&nbsp;          char Dest[0x100] = {0};<br>
&nbsp;&nbsp;&nbsp;          GetModuleFileName(0,Dest,0x100);<br>
&nbsp;&nbsp;&nbsp;          char *pChar = Dest + lstrlen(Dest) - 1;<br>
&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          while( *pChar != '\\')<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          pChar--;<br>
<br>
&nbsp;&nbsp;&nbsp;          pChar++;<br>
&nbsp;&nbsp;&nbsp;          *pChar = 0;<br>
<br>
&nbsp;&nbsp;          lstrcpy(g_waiguaFullPath,Dest);&nbsp;&nbsp;&nbsp;          <br>
}<br>
<br>
int __stdcall Install2()<br>
{<br>
&nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          Install_InitPath();<br>
&nbsp;&nbsp;&nbsp;          g_hHook = SetWindowsHookEx(WH_CALLWNDPROC,<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          CallWndProc,<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;          (HINSTANCE)g_hmod_xxxxhook_dll,<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;          0 );<br>
<br>
&nbsp;&nbsp;&nbsp;          if(g_hHook == NULL)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return 2;<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          <br>
&nbsp;&nbsp;&nbsp;          return 0;<br>
}<br>
<br>
int __stdcall UnInstall2()<br>
{<br>
<br>
&nbsp;&nbsp;&nbsp;          if(g_IsHook)<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          if(g_hModuleMainProcess)<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          FreeLibrary(g_hModuleMainProcess);<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_hModuleMainProcess = NULL;<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          }<br>
<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_IsHook = FALSE;<br>
&nbsp;&nbsp;&nbsp;          }<br>
<br>
&nbsp;&nbsp;&nbsp;          if(g_hHook)<br>
&nbsp;&nbsp;&nbsp;          {<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          if(UnhookWindowsHookEx(g_hHook))<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          g_hHook = 0;<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          else<br>
&nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          &nbsp;&nbsp;&nbsp;          return 2;<br>
&nbsp;&nbsp;&nbsp;          }<br>
<br>
&nbsp;&nbsp;&nbsp;          return 0;<br>
}<br>
</font>                      <br>
<font color="#993300">//xxxxhook.def<br>
LIBRARY xxxxhook<br>
EXPORTS<br>
<br>
Install2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                 @1<br>
CallWndProc &nbsp;&nbsp;          @2<br>
UnInstall2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        &nbsp;&nbsp;          @3<br>
<strong><br>
<font color="#000000">另注： 明天就要离开公司，离开了与自己共事多年的朋友们，临别写一句《功夫熊猫》中的一句话勉励自己吧。&ldquo;过去的，已经过去了；未来的，还未可知。现在却是上苍的礼赠。我们可以把握的，是当下。&rdquo;</font></strong><br>
<br>
</font> <a href="http://hi.baidu.com/combojiang/blog/item/d17aa88ba6c94315c9fc7a29.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/%D3%CE%CF%B7%B7%D6%CE%F6">游戏分析</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/d17aa88ba6c94315c9fc7a29.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-25  13:23</pubDate>
        <category><![CDATA[游戏分析]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/d17aa88ba6c94315c9fc7a29.html</guid>
</item>

<item>
        <title><![CDATA[必杀技公布——用特征码定位关键代码，秒杀MFC程序【转】]]></title>
        <link><![CDATA[http://hi.baidu.com/combojiang/blog/item/d0d4b6814735e1dfbc3e1ed7.html]]></link>
        <description><![CDATA[
		
		<div style="line-height: 18px;" class="bword">【文章标题】: 必杀技公布&mdash;&mdash;用特征码定位关键代码，秒杀MFC程序<br>
【文章作者】: 书呆彭<br>
【下载地址】: 自己搜索下载<br>
【使用工具】: VC与OllyICE<br>
【作者声明】: 只是感兴趣，没有其他目的。失误之处敬请诸位大侠赐教!<br>
--------------------------------------------------------------------------------<br>
【详细过程】<br>
&nbsp;&nbsp;  本文所讲的方法，其实是一个很古老的方法了。以前，考虑到此法的杀伤力巨大，不便于公布。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  随着软件开发者保护意识的提高和软件保护技术的发展，此法的杀伤力逐渐下降成为普通等级。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  我本人这学期的课程和任务十分多，打算暂时把程序调试这个业余爱好放一放，估计至少会有半年时间不常来看雪了。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  把这个方法写出来，算是给大家的告别礼物。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  对于直接使用SDK而不使用第三方库的程序，我们要定位到程序的&ldquo;关键代码&rdquo;并不困难。通常在CreateWindow函数或DialogBoxParam函数下断点，可以直接获得其主界面的窗口过程或对话框过程。但是对于使用了MFC的程序，我们找到的窗口过程或对话框过程是在MFC提供的程序框架的内部，经过层层的分发和筛选，消息才最终到达用户代码，直接分析起来比较繁琐。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  幸好，有一个Olly的脚本，可以直接帮助我们找到诸如OnOK()之类的函数。这个脚本用到的方法，是建立在对MFC内部机制充分理解的基础上，通过在消息分发的代码处下条件断点而完成的。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  然而，我马上要讲到的这个方法，在一定程度上，比这个脚本还好使，可以一下就定位到我们感兴趣的代码处。而且，可以举一反三，如果你看明白了其中的思路，可以自己扩展成为十分强大的&ldquo;必杀技&rdquo;，不仅对MFC，对其它的应用程序框架也有效果。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  我就不讲我如何想到的这个方法，只讲两个例子。如果你看懂了这个例子，其中的思路肯定会明白了。而且，十分简单。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  我以MFC42为例。先打开VC6，创建一个MFC的对话框程序，按默认设置。我们在&ldquo;OK&rdquo;按钮的处理函数OnOK()的开头，写上这样一句：<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  __asm&nbsp;&nbsp;  int 3<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  然后，按Release编译。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  现在，用OD调试程序，不要忽略int3异常，F9运行，点击&ldquo;OK&rdquo;，OD马上断下。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  看堆栈：<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp; 
<div style="margin: 5px 20px 20px;">
<div style="margin-bottom: 2px;" class="smallfont">代码:</div>
<pre style="border: 1px inset ; margin: 0px; padding: 5px; overflow: auto; width: 640px; background-color: rgb(222, 223, 223); text-align: left;" dir="ltr">&nbsp;&nbsp;  0012F80C&nbsp;&nbsp;&nbsp;  73EFE938&nbsp;&nbsp;  返回到 MFC42.73EFE938<br>&nbsp;&nbsp;  0012F810&nbsp;&nbsp;&nbsp;  00000000<br>&nbsp;&nbsp;  0012F814&nbsp;&nbsp;&nbsp;  004022E8&nbsp;&nbsp;  MFCDialo.004022E8<br>&nbsp;&nbsp;</pre>
</div>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  我们到 MFC42.73EFE938这看一下：<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp; 
<div style="margin: 5px 20px 20px;">
<div style="margin-bottom: 2px;" class="smallfont">代码:</div>
<pre style="border: 1px inset ; margin: 0px; padding: 5px; overflow: auto; width: 640px; background-color: rgb(222, 223, 223); text-align: left;" dir="ltr">&nbsp;&nbsp;  73EFE932&nbsp;&nbsp;&nbsp;&nbsp;  8B4D 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ECX, DWORD PTR SS:[EBP+8]<br>&nbsp;&nbsp;  73EFE935&nbsp;&nbsp;&nbsp;&nbsp;  FF55 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CALL&nbsp;&nbsp;&nbsp;&nbsp;  DWORD PTR SS:[EBP+14]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; 这句就是调用用户函数的CALL<br>&nbsp;&nbsp;  73EFE938&nbsp;&nbsp;&nbsp;&nbsp;  5F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  POP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  EDI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; 这就是堆栈中的 MFC42.73EFE938<br>&nbsp;&nbsp;  73EFE939&nbsp;&nbsp;&nbsp;&nbsp;  8BC6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  EAX, ESI<br>&nbsp;&nbsp;  ...<br>&nbsp;&nbsp;</pre>
</div>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  我们看到，73EFE935处的CALL [EBP+14]的目标函数就是我们的OnOK()。记住这个地址。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  我们按ALT+E，打开模块列表，双击下面MFC42.dll这一行：<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp; 
<div style="margin: 5px 20px 20px;">
<div style="margin-bottom: 2px;" class="smallfont">代码:</div>
<pre style="border: 1px inset ; margin: 0px; padding: 5px; overflow: auto; width: 640px; background-color: rgb(222, 223, 223); text-align: left;" dir="ltr">&nbsp;&nbsp;  Executable modules<br>&nbsp;&nbsp;  基址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  入口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  文件版本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  路径<br>&nbsp;&nbsp;  00400000&nbsp;&nbsp;&nbsp;  00005000&nbsp;&nbsp;&nbsp;  00401780&nbsp;&nbsp;&nbsp;  MFCSigna&nbsp;&nbsp;&nbsp;  1, 0, 0, 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  F:\Documents\MY CODE\MFCDialog\Release\MFCDialog.exe<br>&nbsp;&nbsp;  00460000&nbsp;&nbsp;&nbsp;  0009B000&nbsp;&nbsp;&nbsp;  00486E23&nbsp;&nbsp;&nbsp;  ADVAPI32&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\ADVAPI32.dll<br>&nbsp;&nbsp;  00500000&nbsp;&nbsp;&nbsp;  0008B000&nbsp;&nbsp;&nbsp;  0050155C&nbsp;&nbsp;&nbsp;  OLEAUT32&nbsp;&nbsp;&nbsp;  5.2.3790.4202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  D:\WINDOWS\syswow64\OLEAUT32.dll<br>&nbsp;&nbsp;  00590000&nbsp;&nbsp;&nbsp;  00052000&nbsp;&nbsp;&nbsp;  005A006D&nbsp;&nbsp;&nbsp;  SHLWAPI&nbsp;&nbsp;&nbsp;&nbsp;  6.00.3790.3959 (&nbsp;&nbsp;  D:\WINDOWS\syswow64\SHLWAPI.dll<br>&nbsp;&nbsp;  02160000&nbsp;&nbsp;&nbsp;  00017000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  odbcint&nbsp;&nbsp;&nbsp;&nbsp;  3.526.1830.0 (sr&nbsp;&nbsp;  D:\WINDOWS\system32\odbcint.dll<br>&nbsp;&nbsp;  48890000&nbsp;&nbsp;&nbsp;  0003D000&nbsp;&nbsp;&nbsp;  488C5681&nbsp;&nbsp;&nbsp;  ODBC32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  3.526.3959.0 (sr&nbsp;&nbsp;  D:\WINDOWS\system32\ODBC32.dll<br>&nbsp;&nbsp;  4B3C0000&nbsp;&nbsp;&nbsp;  00050000&nbsp;&nbsp;&nbsp;  4B3C1574&nbsp;&nbsp;&nbsp;  MSCTF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\SysWOW64\MSCTF.dll<br>&nbsp;&nbsp;  4DC30000&nbsp;&nbsp;&nbsp;  0002E000&nbsp;&nbsp;&nbsp;  4DC49F69&nbsp;&nbsp;&nbsp;  msctfime&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\system32\msctfime.ime<br>&nbsp;&nbsp;  71BB0000&nbsp;&nbsp;&nbsp;  00009000&nbsp;&nbsp;&nbsp;  71BB1060&nbsp;&nbsp;&nbsp;  WSOCK32&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.0 (srv0&nbsp;&nbsp;  D:\WINDOWS\system32\WSOCK32.dll<br>&nbsp;&nbsp;  71BF0000&nbsp;&nbsp;&nbsp;  00008000&nbsp;&nbsp;&nbsp;  71BF123D&nbsp;&nbsp;&nbsp;  WS2HELP&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.1830 (s&nbsp;&nbsp;  D:\WINDOWS\system32\WS2HELP.dll<br>&nbsp;&nbsp;  71C00000&nbsp;&nbsp;&nbsp;  00017000&nbsp;&nbsp;&nbsp;  71C02560&nbsp;&nbsp;&nbsp;  WS2_32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\system32\WS2_32.dll<br>&nbsp;&nbsp;  73EB0000&nbsp;&nbsp;&nbsp;  00121000&nbsp;&nbsp;&nbsp;  73F84A8E&nbsp;&nbsp;&nbsp;  MFC42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  6.06.8063.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  D:\WINDOWS\system32\MFC42.DLL<br>&nbsp;&nbsp;  75490000&nbsp;&nbsp;&nbsp;  00065000&nbsp;&nbsp;&nbsp;  754C93CA&nbsp;&nbsp;&nbsp;  USP10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  1.0422.3790.3959&nbsp;&nbsp;  D:\WINDOWS\system32\USP10.dll<br>&nbsp;&nbsp;  75E60000&nbsp;&nbsp;&nbsp;  00027000&nbsp;&nbsp;&nbsp;  75E61239&nbsp;&nbsp;&nbsp;  apphelp&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\system32\apphelp.dll<br>&nbsp;&nbsp;  76190000&nbsp;&nbsp;&nbsp;  00012000&nbsp;&nbsp;&nbsp;  76193341&nbsp;&nbsp;&nbsp;  MSASN1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\MSASN1.dll<br>&nbsp;&nbsp;  761B0000&nbsp;&nbsp;&nbsp;  00093000&nbsp;&nbsp;&nbsp;  761B15FA&nbsp;&nbsp;&nbsp;  CRYPT32&nbsp;&nbsp;&nbsp;&nbsp;  5.131.3790.3959&nbsp;&nbsp;&nbsp;  D:\WINDOWS\syswow64\CRYPT32.dll<br>&nbsp;&nbsp;  762B0000&nbsp;&nbsp;&nbsp;  00049000&nbsp;&nbsp;&nbsp;  762B16A5&nbsp;&nbsp;&nbsp;  comdlg32&nbsp;&nbsp;&nbsp;  6.00.3790.3959 (&nbsp;&nbsp;  D:\WINDOWS\syswow64\comdlg32.dll<br>&nbsp;&nbsp;  77210000&nbsp;&nbsp;&nbsp;  000AB000&nbsp;&nbsp;&nbsp;  772115A2&nbsp;&nbsp;&nbsp;  WININET&nbsp;&nbsp;&nbsp;&nbsp;  6.00.3790.4392 (&nbsp;&nbsp;  D:\WINDOWS\syswow64\WININET.dll<br>&nbsp;&nbsp;  77530000&nbsp;&nbsp;&nbsp;  00097000&nbsp;&nbsp;&nbsp;  775948BA&nbsp;&nbsp;&nbsp;  COMCTL32&nbsp;&nbsp;&nbsp;  5.82 (srv03_sp2_&nbsp;&nbsp;  D:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.3959_x-ww_78FCF8D0\COMCTL32.dll<br>&nbsp;&nbsp;  77670000&nbsp;&nbsp;&nbsp;  00139000&nbsp;&nbsp;&nbsp;  776BC692&nbsp;&nbsp;&nbsp;  ole32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\ole32.dll<br>&nbsp;&nbsp;  77BA0000&nbsp;&nbsp;&nbsp;  0005A000&nbsp;&nbsp;&nbsp;  77BAF78B&nbsp;&nbsp;&nbsp;  msvcrt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  7.0.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\msvcrt.dll<br>&nbsp;&nbsp;  7C8D0000&nbsp;&nbsp;&nbsp;  007FF000&nbsp;&nbsp;&nbsp;  7C92BB2B&nbsp;&nbsp;&nbsp;  SHELL32&nbsp;&nbsp;&nbsp;&nbsp;  6.00.3790.4184 (&nbsp;&nbsp;  D:\WINDOWS\syswow64\SHELL32.dll<br>&nbsp;&nbsp;  7D4C0000&nbsp;&nbsp;&nbsp;  00130000&nbsp;&nbsp;&nbsp;  7D4DFD59&nbsp;&nbsp;&nbsp;  kernel32&nbsp;&nbsp;&nbsp;  5.2.3790.4062 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\kernel32.dll<br>&nbsp;&nbsp;  7D600000&nbsp;&nbsp;&nbsp;  000F0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ntdll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\system32\ntdll.dll<br>&nbsp;&nbsp;  7D800000&nbsp;&nbsp;&nbsp;  00090000&nbsp;&nbsp;&nbsp;  7D82B710&nbsp;&nbsp;&nbsp;  GDI32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.4396 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\GDI32.dll<br>&nbsp;&nbsp;  7D8D0000&nbsp;&nbsp;&nbsp;  00050000&nbsp;&nbsp;&nbsp;  7D8E0E4B&nbsp;&nbsp;&nbsp;  Secur32&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\Secur32.dll<br>&nbsp;&nbsp;  7D930000&nbsp;&nbsp;&nbsp;  000D0000&nbsp;&nbsp;&nbsp;  7D969635&nbsp;&nbsp;&nbsp;  USER32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.4033 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\USER32.dll<br>&nbsp;&nbsp;  7DA20000&nbsp;&nbsp;&nbsp;  000E0000&nbsp;&nbsp;&nbsp;  7DA3049E&nbsp;&nbsp;&nbsp;  RPCRT4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.4115 (s&nbsp;&nbsp;  D:\WINDOWS\syswow64\RPCRT4.dll<br>&nbsp;&nbsp;  7DBC0000&nbsp;&nbsp;&nbsp;  00009000&nbsp;&nbsp;&nbsp;  7DBC12E2&nbsp;&nbsp;&nbsp;  LPK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\system32\LPK.DLL<br>&nbsp;&nbsp;  7DBD0000&nbsp;&nbsp;&nbsp;  00103000&nbsp;&nbsp;&nbsp;  7DC5A99E&nbsp;&nbsp;&nbsp;  comctl_1&nbsp;&nbsp;&nbsp;  6.0 (srv03_sp2_r&nbsp;&nbsp;  D:\WINDOWS\WinSxS\WOW64_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.3959_x-ww_5FA17F4E\comctl32.dll<br>&nbsp;&nbsp;  7DEE0000&nbsp;&nbsp;&nbsp;  00060000&nbsp;&nbsp;&nbsp;  7DEF02D0&nbsp;&nbsp;&nbsp;  IMM32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.2.3790.3959 (s&nbsp;&nbsp;  D:\WINDOWS\system32\IMM32.DLL<br>&nbsp;&nbsp;  7DF50000&nbsp;&nbsp;&nbsp;  00070000&nbsp;&nbsp;&nbsp;  7DF637D7&nbsp;&nbsp;&nbsp;  uxtheme&nbsp;&nbsp;&nbsp;&nbsp;  6.00.3790.3959 (&nbsp;&nbsp;  D:\WINDOWS\system32\uxtheme.dll<br>&nbsp;&nbsp;</pre>
</div>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  就来到了MFC42.DLL这个模块的.text节了。好，我们按Ctrl+F，输入CALL [EBP+0X14]，回车。搜索到的第一个结果就是：<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp; 
<div style="margin: 5px 20px 20px;">
<div style="margin-bottom: 2px;" class="smallfont">代码:</div>
<pre style="border: 1px inset ; margin: 0px; padding: 5px; overflow: auto; width: 640px; background-color: rgb(222, 223, 223); text-align: left;" dir="ltr">&nbsp;&nbsp;  73EFE935&nbsp;&nbsp;&nbsp;&nbsp;  FF55 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CALL&nbsp;&nbsp;&nbsp;&nbsp;  DWORD PTR SS:[EBP+14]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; 这句就是调用用户函数的CALL<br>&nbsp;&nbsp;</pre>
</div>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  现在明白本文题目的意思了吧。。。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  下面来看看此法的应用。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  随便找一个MFC42的CM，用OD载入，有壳，不用管，直接F9，然后ALT+E，双击MFC42.DLL，CTRL+F，输入CALL [EBP+14]，在第一个找到的地址处F2下断点。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  点CM的确定按钮，OD断下，F2删除断点，F7。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  这里就是按钮的处理函数。可以分析了。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
--------------------------------------------------------------------------------<br>
【经验总结】<br>
&nbsp;&nbsp;  如果你看明白了我的过程，那么你也应该明白我的思路。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  MFC42.DLL的特征码就是指令CALL [EBP+14]<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  顺便说一下，所有的按钮控件的处理函数OnXXXClick()都经过这里。并且，编辑框控件的OnChange()函数，以及其它很多控<br>
&nbsp;&nbsp;  件的消息，比如CheckBox的消息，甚至OnClose()也都经过这里。什么原因呢？因为MFC框架的消息分发过程，是按参数类型<br>
&nbsp;&nbsp;  模板分类的。如果不理解，就不用理解了，只要记住方法就行了。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  另外，对所有的MFC程序，如MFC71D,MFC90U等，这个方法都可以用，并且静态连接的也可以，并且Delphi的程序也可以，只<br>
&nbsp;&nbsp;  要掌握了原理，方法大同小异。至于各自的&ldquo;特征码&rdquo;是什么，自己去找吧。<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  祝同学们早日成为高手。<br>
&nbsp;&nbsp;<br>
--------------------------------------------------------------------------------<br>
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2009年02月23日 21:02:58</div> <a href="http://hi.baidu.com/combojiang/blog/item/d0d4b6814735e1dfbc3e1ed7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/combojiang/blog/category/%B4%FA%C2%EB%D4%D3%CC%B8">代码杂谈</a>&nbsp;<a href="http://hi.baidu.com/combojiang/blog/item/d0d4b6814735e1dfbc3e1ed7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-24  09:44</pubDate>
        <category><![CDATA[代码杂谈]]></category>
        <author><![CDATA[combojiang]]></author>
		<guid>http://hi.baidu.com/combojiang/blog/item/d0d4b6814735e1dfbc3e1ed7.html</guid>
</item>


</channel>
</rss>