[转载]木马隐藏端口的一种方法

木马冰河之原理篇(深入浅出看木马) 主题:木马冰河之原理篇(转载)    在网上,大家最关心的事情之一就是木马:最近出了新的木马吗?木马究竟能实现哪些功能?木马如何防治?木马究竟是如何工作的?本文试图以我国最著名的木马之一 冰河为例,向大家剖析木马的基本原理,为大家揭开木马的神秘面纱。   木马冰河是用delphi和C++Builder写的,为了便于大家理解,我将用相对比较简单的VB来说明它,其中涉及到一些WinSock编程和Win 阅读详情
这是一种很特殊的方法,使用它通讯没有端口,而且由于它的特殊性,也许会带来一些其他的优点。但这种方法也有一个比较大的缺点。
    它,也许该起个名字,比如叫Jiurl255。它不使用tcp协议,也不使用udp协议,也不使用icmp协议。它使用什么协议,就像乱起的那个名字一样,它使用255协议。


上面这幅图,是一个没有IP选项的IP头。其中有个字段为8位协议,一个字节长,系统就是通过这个字节中的值来区别上层协议是什么,通过这个字节的值来决定应该把数据交给谁来处理。TCP是十进制6,UDP是十进制17。就是说这个值是6的话就交给tcp处理,是17的话就交给udp处理。那么如果这个值是一个没有人处理的值会怎么样呢?比如222,255(8bit,最大255)。我觉得255漂亮些,就拿255说吧,其他没人用的值都是一样的。那么会怎么样呢?我猜测可以收到的,后来做了些小试验,说明我是对的。(我曾夜观天象,发现你有学计算机的命)。这个东西和tcp,udp没什么关系,自然也就不会有tcp,udp的端口号了。

好了,有兴趣的先试一试吧,使用Jiurl255做一次简单通讯的客户端程序下载,服务器端程序下载。
服务器端叫rserver,客户端叫rclient。
rserver 首先 theSocket = socket(AF_INET, SOCK_RAW, 255);建立一个使用Jiurl255的原始套接字,然后绑定本地地址,最后阻塞在recvfrom,等待着发往255协议的数据。收到之后,会将收到数据打印出来。
rclient 首先 获得服务器的IP地址,然后 theSocket = socket(AF_INET, SOCK_RAW, 255);建立一个使用Jiurl255的原始套接字,然后让你从键盘输入些数据 就 sendto 用协议255向服务器端发送输入的数据。

第一个试验,进行一次收发,就可以发现,确实是可以利用没人用的协议号发送和接收数据。大概是这样的,系统收到ip包以后看该协议号有没有进程要接受,如果有的话,就发给那个进程。

第二个试验,运行一个rclient,运行两个rserver,发一次数据。可以发现,两个rserver都收到了rclient发的数据。说明系统会把收到的数据发给每个要接受这个协议号上数据的进程。

另一个试验,server端创建套接字时,指定协议号为200,client端创建套接字,填充ip头时,都指定协议号为255,结果server端就收不到client端发送的数据了。

当时试验后的笔记:"
server端收数据
client端发数据
server端创建套接字时,指定协议号为255,
client端创建套接字,填充ip头时,都指定协议号为255,
结果server端收到了client端发送的数据。

server端创建套接字时,指定协议号为200,
client端创建套接字,填充ip头时,都指定协议号为255,
结果server端就收不到client端发送的数据了。

多个server端,都使用协议号255,
client端也向255协议发数据,
多个server端,都收到了数据。
"

还有就是,如果程序既发又收的,并且是发往本机的,那么程序会收到自己发出的内容。没说清楚好像,比如吧,一个程序,发255的数据之后,就接收255上的数据,他把数据发往本机,那么它就会收到数据。

rclient:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <ws2tcpip.h> 
#include <conio.h>

#pragma comment(lib,"ws2_32.lib")


typedef struct ip_hdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER, *PIP_HEADER;


USHORT CheckSum(USHORT *buffer, int size);

void RawClient( char *szServer );


void main()
{
WSADATA wsaData;

char ServerAddr[256];

printf("Server Addr : ");
scanf("%s",ServerAddr);
printf("/n");

WSAStartup(0x0202, &wsaData);

RawClient(ServerAddr);

WSACleanup();
}

/////////////////////////////////////////////////
USHORT CheckSum(USHORT *buffer, int size)
{
unsigned long cksum=0;

while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT); 
}
if (size)
{
cksum += *(UCHAR*)buffer; 
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16); 

return (USHORT)(~cksum); 
}

//////////////////////////////////////////////////////////
void RawClient( char *szServer )
{
LPHOSTENT lpHostEntry;

lpHostEntry = gethostbyname(szServer);
if (lpHostEntry == NULL)
{
printf("gethostbyname() error/n");
return;
}

SOCKET theSocket;

theSocket = socket(AF_INET, SOCK_RAW, 255);
if (theSocket == INVALID_SOCKET)
{
printf("socket() error/n");
return;
}

int nRet;
BOOL optval;

optval=TRUE;
nRet = setsockopt(theSocket, IPPROTO_IP, IP_HDRINCL, (char*)&optval, sizeof(optval));
if (SOCKET_ERROR == nRet)
{
printf("SetSockOpt Error!%d/n", WSAGetLastError());
return;
}

SOCKADDR_IN saServer;

saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); // Let WinSock assign address
saServer.sin_port = 0; // Use port passed from user

char szBuf[1024];

//////////////////////////////////////////////////////////////////
memset(szBuf, 0, sizeof(szBuf));

int IpHdrLen=0;
int DataLen=0;

IP_HEADER *pIpHdr=NULL;
char* pData=NULL;

IpHdrLen=sizeof(IP_HEADER);

pIpHdr=(IP_HEADER*)szBuf;

pIpHdr->h_verlen=(4<<4)| (sizeof(IP_HEADER) / sizeof(unsigned long));
pIpHdr->tos=0;
pIpHdr->proto=255;
pIpHdr->ttl=128;
pIpHdr->ident=0;
pIpHdr->checksum=0;
pIpHdr->frag_and_flags=0;
pIpHdr->sourceIP=inet_addr("1.1.1.1");
pIpHdr->destIP=(unsigned int)saServer.sin_addr.s_addr;

pData=(szBuf+IpHdrLen);
printf("Type a String :");
scanf("%s",pData);
DataLen=strlen(pData);

pIpHdr->total_len=IpHdrLen+DataLen;

//////////////////////////////////////////////////////////////////
nRet = sendto(theSocket, // Socket
szBuf, // Data buffer
IpHdrLen+DataLen, // Length of data
0, // Flags
(LPSOCKADDR)&saServer, // Server address
sizeof(struct sockaddr)); // Length of address
if(nRet!=SOCKET_ERROR)
{
printf("Client send: %s/n",pData);
}

getch();
closesocket(theSocket);
return;
}

rserver:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <ws2tcpip.h> 
#include <conio.h>

#pragma comment(lib,"ws2_32.lib")

void RawServer();

void main()
{
WSADATA wsaData;

WSAStartup(0x0202, &wsaData);

RawServer();

WSACleanup();
}

//////////////////////////////////////////////////////////
void RawServer()
{
int nRet;
SOCKET theSocket;

theSocket = socket(AF_INET, SOCK_RAW, 255);
if (theSocket == INVALID_SOCKET)
{
printf("socket() error/n");
return;
}

SOCKADDR_IN saServer;

saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock assign address
saServer.sin_port = 0; // Use port passed from user

nRet = bind(theSocket, // Socket descriptor
(LPSOCKADDR)&saServer, // Address to bind to
sizeof(struct sockaddr) // Size of address
);
if (nRet == SOCKET_ERROR)
{
printf("bind() error/n");
closesocket(theSocket);
return;
}

///////////////////////////////////////////////////
int nLen;
nLen = sizeof(SOCKADDR);
char szBuf[1024];

nRet = gethostname(szBuf, sizeof(szBuf));
if (nRet == SOCKET_ERROR)
{
printf("gethostname() error/n");
closesocket(theSocket);
return;
}

LPHOSTENT lpHostEntry;
lpHostEntry = gethostbyname(szBuf);

printf("Server named %s addr %s /n/n",
szBuf, inet_ntoa(*(LPIN_ADDR)lpHostEntry->h_addr));
///////////////////////////////////////////////////

SOCKADDR_IN saClient;

memset(szBuf, 0, sizeof(szBuf));

nRet = recvfrom(theSocket, // Bound socket
szBuf, // Receive buffer
sizeof(szBuf), // Size of buffer in bytes
0, // Flags
(struct sockaddr*)&saClient, // Buffer to receive client address 
&nLen); // Length of client address buffer
if(nRet!=SOCKET_ERROR)
{
printf("Server recv: %s/n",szBuf+20);
}
else
{
printf("recv error: %d/n",WSAGetLastError());
closesocket(theSocket);
return;
}

getch();
closesocket(theSocket);
return;
}

使用Jiurl255进行数据传输明显是没有tcp和udp的端口的,这样也就不会被 netstat -an 之类的命令看到。这和利用icmp传输数据很象,但是我觉得Jiurl255比用icmp传数据要来的好一些。它还有个比较大的缺点就是,由于直接使用的是ip,所以传输的数据是有可能丢失的,这是我观察后写的笔记:"使用ip,ip头字段中的上层协议填255,这是一个还没有人用的协议号。然后在网络中两个主机上分别运行c,s程序,c发送ip255报文,内容hello n,共发50个,每秒发一个。s收ip255报文,确实收到,一次测试中,50个报文,收到了49个,也确实存在ip报丢失的情况。两个方向上都试了,是可行的。"
因此用此方法隐藏端口是要多费不少力气的,我自己写的一个程序中,传送文件使用了一些简单的等待ack,超时重发的机制保证数据不会丢失和发生错误,传送命令,没有保证不会丢失。有时间的话,准备写个保证不丢失,不错误的收发函数。传送文件用的那些机制,参考了使用udp协议进行文件可靠传输的tftp协议。

终

隐藏IP和端口,可以隐藏指定的IP和端口 IP,端口隐藏工具IP 立即下载

相关推荐

ring0驱动内核级的ROOTKIT实现隐藏文件,隐藏注册表项,隐藏端口.zip

ring0驱动内核级的ROOTKIT实现隐藏文件,隐藏注册表项,隐藏端口.zip

常见的木马隐藏技术

使用 Rootkit 技术:Rootkit 是一种可以获取系统底层控制权的技术,木马程序利用 Rootkit 可以隐藏自己的文件、进程、网络连接等信息,甚至可以篡改系统的内核数据结构,使得操作系统的监控和检测机制失效。这样,在查看进程列表时,只能看到合法进程在运行,而木马程序的代码在该合法进程的内存空间中执行。- 加载到内核模块:将木马程序的代码加载到操作系统的内核模块中,内核模块在系统中具有较高的权限和优先级,并且其运行在操作系统的内核空间,普通的安全软件很难对其进行检测和查杀。

m0_57836225的博客 1616

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 426

协议Jiurl255 技术参考

这是一种很特殊的方法,使用它通讯没有端口,而且由于它的特殊性,也许会带来一些其他的优点。但这种方法也有一个比较大的缺点。    它,也许该起个名字,比如叫Jiurl255。它不使用tcp协议,也不使用udp协议,也不使用icmp协议。它使用什么协议,就像乱起的那个名字一样,它使用255协议。 上面这幅图,是一个没有IP选项的IP头。其中有个字段为8位协议,一个字节长,系统就是通过这个字节

FreeXploiT 1615

在QTableWidget中添加支持多选的QComboBox并显示

定义自定义表格项,主要用于显示复选框自定义的多选ComboBox类自定义委托类,用于表格中的多选ComboBox代码展示如下。

YUyang0304的博客 2783

BEVFusion实战:从零搭建LiDAR-Camera融合的3D目标检测环境(附避坑指南)

本文提供了BEVFusion实战指南,详细讲解如何从零搭建LiDAR-Camera融合的3D目标检测环境。内容涵盖环境配置、数据预处理、模型训练与性能优化等关键步骤,并附有实用的避坑技巧,帮助开发者高效部署这一先进的BEV感知算法。

p4q5r6s7t的博客 514

安全之路 —— 利用端口复用技术隐藏后门端口

简介 前面我们介绍到我们可以用进程注入的方法,借用其他应用的端口收发信息,从而达到穿墙的效果,那么今天介绍一种新的方法,叫做端口复用技术,他能够与其他应用绑定同一个端口,但同时进行端口复用的程序会接管之前程序的信息接受权,所以我们在复用端口后,要对非后门信息通过127.0.0.1本机回环地址进行消息转发。 C++代码样例 //////////////////////////////...

dengdao1372的博客 302

Open3D 曲率下采样

曲率下采样是一种基于几何特征的点云处理技术,通过计算每个点的曲率来判断其所在位置的局部表面特征,从而进行选择性保留。曲率的计算通常基于点的法向量和其邻域点的分布。

纵马踏花向自由 841

服务器如何隐藏端口才能不被扫描?

服务器如何隐藏端口才能不被扫描

2409_89014517的博客 4574

C/C++跳动的爱心(完整代码)

C语言实现跳动的爱心的完整代码。

AIGC 5842

(10)三相三绕组变压器的建模仿真

建立了三相三绕组变压器组的Simulink仿真模型,通过实例进行了仿真计算。

weixin_45670943的博客 1143

NT系统下木马进程的隐藏与检测

揭开木马的神秘面纱   DLL木马篇  NT系统下木马进程的隐藏与检测  Shotgun    本文首发于Yesky,传统媒体转载需联系作者,网络媒体请注明出处并保持文章完整  在WIN9X中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在WINNT中却完全不同,无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能欺骗WINNT的任务管理器,以至于很多的朋友问我

Shannonhe的专栏 1437

网工运维掌握OpenClaw这7大必备技能,自动化运维效率直接起飞

OpenClaw的核心就是它的技能系统。通过官方技能市场(clawhub.ai),你只需一条命令就能安装扩展,让AI代理变成你的“运维副手”。今天我就结合网工运维的真实痛点,精选7项最热门、最实用的OpenClaw技能(基于ClawHub下载量和实际测试),手把手教你安装、使用和进阶玩法。这些技能不是玩具,而是能直接提升运维效率10倍以上的生产力工具!安装后,你的OpenClaw代理就能自动处理Zabbix告警、总结syslog日志、更新Obsidian网络拓扑笔记、甚至通过n8n触发自动修复脚本。

网络技术联盟站 574

木马编程相关杂谈[转载]

木马编程相关杂谈       作者: JIURL     我写了这样一个Windows下的程序,服务器端没有进程,没有端口,开机自动运行,可以接收客户端发来的文件并执行文件。只有不被发现的木马才能长寿。木马能接收文件并且执行文件,就可以干任何事。比如搜集系统的信息,只要传一个搜集系统信息的程序,并且执行。其他各种需要的功能也可以写成相应的程序,发送并且执行。      隐藏进程     也就是为了

我的win32 api之旅 1296

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

共轭梯度法的核心原理是求解优化问题的共轭向量组作为优化方向,由于优化方向间彼此正交,故每次迭代只需沿着一个方向寻优而互不影响。本文设计基于ESDF的障碍约束、曲率约束和平滑约束,基于ROS C++和Python提供了共轭梯度法的轨迹优化实践案例

FRIGIDWINTER的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINNT下隐藏木马的进程 DLL木马篇

——WINNT下隐藏木马的进程 DLL木马篇——   来源:网络收集                                                             

tjgoahead的专栏 766

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

端口截听实现端口隐藏,嗅探与攻击

创建时间:2002-11-05文章属性:原创文章提交:flashsky (flashsky1_at_sina.com)作者:FLASHSKYEMAIL:flashsky@xfocus.org站点:www.xfocus.net  www.shopsky.com转载请注明原作者安全焦点在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:       s=socket(AF_INE

uuty的专栏 1211

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

伪装植入木马的常见方法

鉴于木马的危害性,很多人对木马知识还是有一定了解的,这对木马的传播起了一定的抑制作用,这是木马设计者所不愿见到的,因此他们开发了多种功能来伪装木马,以达到降低用户警觉,欺骗用户的目的。

弈风的专栏 3752

木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求

摘自:http://kczxsp.hnu.edu.cn/upload/20150504165623705.pdf 里面对于木马的实验过程写得非常清楚,值得一看。 木马是隐藏在正常程序中的具有特殊功能的恶意代码,是具备破坏、删除和 修改文件、发送密码、记录键盘、实施 DOS 攻击甚至完全控制计算机等特殊功 能的后门程序。它隐藏在目标的计算机里,可以随计算机自动启动并在某一端...

djph26741的博客 977

用C#实现木马程序(分析)(转载)

1.在VC#中,建立一个后台服务程序是很容易的,先建立一个新的C#的Windows应用程序,项目名称自定(不过为了隐藏可使用与系统相近的名称),将窗体属性“ShowInTaskbar”属性设为false,让它运行时不会在任务栏中显示,并将属性“Windowstate”属性设为Mininized即可,这样窗体就可以隐藏运行了。3.C#中实现注册表的修改,使用了.NET类库中的System.Microsoft.Win32命令空间,它提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。

biyusr的专栏 885

揭开木马的神秘面纱(二)

 Shotgun           本文首发于Yesky,传统媒体转载需联系作者,网络媒体请注明出处并保持文章完整         前言          离冰河二的问世已经快一年了,大家对于木马这种远程控制软件也有了一定的认识,比如:他会改注册表,他会监听端口等等,和一年前几乎没有人懂得木马是什么东西相比,这是一个质的飞跃。但是,在这个连“菜鸟”都会用NETSTAT看端口,用LOCKDOWN保

1096

如何搜索木马隐藏的系统文件(downmoon原创)

最近服务器老是在木马出没,网管查了又查,杀了又来,今天决定亲自认真查一下,很快,在服务器上找到一个aspxSpy,还是1.1版本的,在网上搜索下,在作者主页,版本为2.0,看到如下说明:1.开发环境VS2008 + C#,兼容FrameWork1.1/2.0,基本实现代码分离。2.密码为32位MD5加密(小写) 默认为 admin.3.全部采用POST方式提交数据,增强了隐蔽性。4.增强...

dfdfadsf3443的博客 151

进程隐藏(转载,收藏)

随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——Ring 0。位于Ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的EXE。后门作者把后门写成符合WDM规范(Windows Driver Model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无

shenj15的专栏 1275

Atitit.病毒木马程序的感染 传播扩散 原理

Atitit.病毒木马程序的感染 传播扩散 原理     1. 从木马的发展史考虑,木马可以分为四代 1 2. 木马有两大类,远程控制  vs  自我复制传播1 3. 自我复制2 3.1. 需要知道当前cpu核心数量2 3.2. Cpu占用百分比2 3.3. Io占用百分比2 3.4. 内存占用百分率2 4. 通过email传播扩散3 5. 通过qq等sns im软件传播扩

attilax的专栏 1275

Linux无文件木马程序渗透测试复现

今天继续给大家介绍渗透测试相关知识,本文主要内容是Linux无文件木马程序渗透测试复现。 一、实战介绍 二、初次渗透测试 三、无文件木马渗透测试

永远是少年 1513
上一篇: [转载]Hook钩子攻略
下一篇: HOOK专题
csdboy
博客等级 码龄25年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值