
shellcode入门与实战
文章平均质量分 81
这是一个以实战为主,从0到1详细介绍windows平台下shellcode实战开发与使用的专题。shellcode是网络安全中核心技术之一,在漏洞利用、免杀对抗、武器化开发中均发挥了重要作用。
李小咖
我是李小咖,主要从事网络安全技术开发和研究。持续更新《李小咖·网安技术库》,欢迎一起学习交流:https://imbyter.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第1章 基础必备常识:当前目录与上级目录
本文介绍了计算机目录中的特殊符号.和..的使用技巧。.代表当前目录,..代表上级目录,这些在资源管理器中不可见但可在命令行操作。文章详细说明了如何在文件复制、目录切换、程序执行和代码编写中使用这些符号,例如cd..快速返回上级目录,.\calc.exe限定执行当前目录程序等。通过相对路径的使用,可以提高操作效率和程序健壮性,如在Python代码中用./和../访问当前及上级目录文件。这些技巧对日常文件管理和编程开发都很有帮助。原创 2025-07-15 22:48:07 · 553 阅读 · 0 评论 -
第1章 基础必备常识:环境变量
本文介绍了环境变量的概念、分类及使用方法。环境变量分为进程、用户和系统三个层级,分别对应不同作用范围。系统自带的环境变量可通过"高级系统设置"查看。用户可通过CMD命令或系统界面添加/修改环境变量,在CMD中使用%变量名%格式调用,在编程语言中各有特定调用方式。文章还列举了常用的默认环境变量及其含义,如%PATH%、%OS%等,帮助用户了解系统运行环境的基本配置。原创 2025-07-16 20:13:36 · 598 阅读 · 0 评论 -
第1章 基础必备常识:运行功能
本文介绍了Windows系统中"运行"对话框的使用技巧,主要包括:1)两种打开方式(右键开始菜单或Win+R快捷键);2)支持执行的功能,如打开指定路径文件、环境变量、Shell目录等;3)详细列出了系统内置的Shell快捷目录和控制面板目录,包括用户文件夹、系统文件夹、程序文件等常用路径;4)列举了系统自带可执行文件及其功能;5)解释了"运行"命令的查找逻辑,优先搜索system32目录,其次是windows和用户目录。这些技巧有助于提高Windows系统操作效率,原创 2025-07-16 20:29:57 · 694 阅读 · 0 评论 -
第1章 基础必备常识:文件隐藏
本文介绍了Windows文件属性的基本概念和操作方法。主要讲解四种文件属性:只读、隐藏、系统和存档属性,并详细说明如何通过资源管理器设置和cmd命令(attrib/dir)查看或修改这些属性。特别指出带有"系统+隐藏"属性的文件需要特殊设置才能显示,并解释了病毒木马常利用这些属性进行隐藏。文章还提供了Microsoft官方文档作为技术参考,适合网络安全技术人员学习文件属性相关的操作技巧。原创 2025-07-17 16:21:19 · 432 阅读 · 0 评论 -
第1章 基础必备常识:密码存储
本文介绍了密码存储技术的发展历程及其安全性演进。文章指出密码存储经历了四个主要阶段:从最初极不安全的明文存储,到可逆的简单加密存储,再到更安全的单向哈希加密(如MD5、SHA系列),最终发展到当前主流的盐值加密存储。通过C++代码示例(包括MD5.h头文件和main.cpp实现)演示了单向哈希加密的实际应用,展示了用户注册和登录时的密码处理流程。原创 2025-07-17 16:26:05 · 150 阅读 · 0 评论 -
第1章 基础必备常识:回环地址
本文介绍了回环地址的概念及其在网络编程中的应用。回环地址(127.0.0.1)是TCP/IP协议中用于本地测试的特殊IP地址,数据包不会经过网络传输,而是直接返回本机。文章比较了localhost与127.0.0.1的区别,说明一台主机可同时拥有真实网卡、虚拟网卡和回环三类IP地址。重点阐述了0.0.0.0、127.0.0.1和具体网卡地址在端口监听时的不同作用,并通过TCP服务端/客户端代码演示了回环地址的实际使用场景。原创 2025-07-18 11:39:28 · 780 阅读 · 0 评论 -
第1章 基础必备常识:权限划分(1)
本文简要介绍了Windows系统权限的划分和特点。主要将权限分为系统权限(SYSTEM)、管理员权限(Administrator)和普通用户权限(LocalUser)。SYSTEM权限最高,由系统服务使用;管理员权限可管理系统资源;普通用户需授权才能执行管理操作。文章还解释了权限继承机制,说明程序会继承启动用户的权限属性,并演示了如何通过PsExec工具获取SYSTEM权限。最后指出在网络安全对抗中,获取SYSTEM权限意味着完全控制权,而普通用户权限需要通过技术手段提升才能执行更多操作。原创 2025-07-18 11:45:07 · 666 阅读 · 0 评论 -
第1章 基础必备常识:权限划分(2)
本文介绍了Windows系统中用户权限管理的几个关键点:1.安装系统时创建的用户默认属于管理员组,但受UAC限制,可通过调整设置关闭提示;2.只有管理员才能创建新用户,可通过控制面板或命令行操作;3.普通用户执行敏感操作需管理员授权;4.Administrator账户默认禁用,可通过命令激活;5.使用PsExec工具可切换到权限更高的system用户。文章提供了具体操作命令,同时强调关闭UAC提示存在安全风险。原创 2025-07-25 22:18:04 · 775 阅读 · 0 评论 -
第10章 shellcode实战:01 什么是shellcode
这是我做的一个关于shellcode入门和开发的专题课👩🏻💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考🫡原创 2024-04-27 21:05:46 · 2124 阅读 · 0 评论 -
第10章 shellcode实战:02 Shellcode项目属性规范
在VS中开发shellcode不同于普通程序的开发,要进行一些特殊的设置。比如修改原main入口点函数,关闭缓冲区安全检查,修改运行库,关闭生成清单,关闭调试信息等等。原创 2024-04-28 11:00:00 · 1229 阅读 · 0 评论 -
第10章 shellcode实战:03 原则:避免使用双引号字符串
C语言正常情况下字符串可以用双引号写,比如char* a="hello world",但在shellcode开发的时候,不能使用这种双引号写法,要用单引号替代,写为:char s[] = {'h','e','l','l','o',' ','w','o','r','l','d',0};原创 2024-04-29 10:30:00 · 956 阅读 · 0 评论 -
第10章 shellcode实战:04 原则:函数的动态调用
一般在编程中我们都是直接调用 Windows API 的函数名来使用这个函数,以这种方式在生成exe文件的过程中,链接器会构建一个“导入表”,来记录程序中所有用到的Windows API信息,而当程序被加载到内存的时候,系统会再将“导入表”中的信息,“还原”到代码中相应的位置。也就是说,一个exe文件中使用了哪些Windows API,是以固定的“信息”存在了导入表中,这是常规的函数(Windows API)使用方法。原创 2024-04-30 13:30:00 · 954 阅读 · 1 评论 -
第10章 shellcode实战:05 原则:Kernel32基址的获取
简单说,kernel32基址是指kernel32.dll这个动态链接库加载到内存中后,它内存最开始的位置。任何一个exe加载到内存执行的时候,它所用到的动态链接库(dll)也都需要加载到内存中,才能够使用这个dll中的导出函数。在shellcode中,因为不存在PE结构,所以对每一个用到的函数所对应的dll文件,都需要我们手动去加载(即映射到内存)。比如我们要使用socket()这个函数,就需要先将这个函数所在的ws2_32.dll映射到内存,一般我们可以使用LoadLibrary这个函数来实现。原创 2024-05-01 12:45:00 · 1222 阅读 · 2 评论 -
第10章 shellcode实战:06 原则:函数地址的动态获取
实现对GetProcAdress函数地址的获取后,就可以结合kernel32的基址,再次获取到LoadLibraryA(或LoadLibraryW)这个函数的地址,然后就可以LoadLibraryA+GetProcAdress实现对任意函数的动态调用。上述GetProcAddress地址的获取,是基于PE结构导出表定位函数地址的原理。上一讲我们介绍了kernel32基址的获取,这一节来介绍如何解决GetProcAddress动态调用的问题。在上述代码中,我们测试了MessageBoxA函数的动态调用。原创 2024-05-02 19:00:00 · 190 阅读 · 1 评论 -
第10章 shellcode实战:07 原则:避免全局变量的使用
在shellcode编写过程中,所有的全局变量都不能直接使用,因为代码中的全局变量都是被编译在PE结构的数据段(.data)或只读数据段(.rdata),在调用时,是以绝对地址的形式进行调用的,所以不能使用全局变量。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考🫡。上述代码中的g_nTime编译后被保存在了数据段(.data)中,在代码调用该变量的时候就会产生全局变量的使用,不适应shellcode的编写原则。一个人走得再快,不如一群人走得更远!原创 2024-05-03 18:00:00 · 404 阅读 · 1 评论 -
第10章 shellcode实战:08 原则:手动加载动态库
比如我们shellcode代码中要使用MessageBoxA这个函数,那么在使用这个函数前,必须要先将MessageBoxA所在的动态链接库,即user32.dll加载到内存:LoadLibraryA("user32.dll");同样,在用到其他函数,比如socket(),这个函数所在的动态链接库是ws2_32.dll,就要在使用这个函数前先执行LoadLibraryA("ws2_32.dll"),其他函数亦是如此。开发经验浓缩在了这个专题课👩🏻💻里,主要面向对网络安全技术感兴趣的小伙伴。原创 2024-05-04 13:00:00 · 499 阅读 · 1 评论 -
第10章 shellcode实战:09 第一种shellcode编写实战
我把多年的shellcode开发经验浓缩在了这个专题课👩🏻💻里,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考。原创 2024-05-05 17:00:00 · 1721 阅读 · 0 评论 -
第10章 shellcode实战:10 单文件函数生成位置规律
函数声明是对一个函数的类型,包括参数、返回值等,提前做一个存在的说明。通过这个声明我们可以知道有这样的一个函数,但这个函数内具体是怎么实现的,有什么功能,我们要看函数定义。定义是函数内部具体实现的一个展示。// 函数声明// 函数定义。原创 2024-05-07 22:35:02 · 1146 阅读 · 0 评论 -
第10章 shellcode实战:11 多文件函数生成位置规律
但如果对已经创建的cpp文件重命名,当关闭VS项目后,再重新打开项目,就会发现显示的规律仍然符合先0-9,再a-z,但编译的顺序,却不受重命名影响,还是与最初重命名前编译的顺序一致。在新建项目中,所有首次创建的cpp文件,在“解决方案资源管理器”中的显示排序,是以文件名首字母,先由0-9,再由a-z从上到下顺序显示。上面所说cpp文件显示顺序与编译顺序的对应,仅仅是表象,真正编译顺序的体现,是在我们编译项目时,输出窗口的显示日志。多文件项目编译时,函数生成顺序仅与项目中.cpp文件有关,与.h文件无关。原创 2024-05-09 23:28:00 · 991 阅读 · 1 评论 -
第10章 shellcode实战:12 第二种shellcode编写实战(1)
我最近在做一个关于shellcode入门和开发的专题课👩🏻💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考🫡。原创 2024-05-11 14:53:50 · 997 阅读 · 1 评论 -
第10章 shellcode实战:13 第二种shellcode编写实战(2)
在类CDoShellcode中,将所有函数功能执行的参数都传递一个CAPI的指针变量,那么所有功能都可以使用CAPI中的函数。如此一来,对类CDoShellcode而言,我们只关注功能的实现,不必再顾及函数动态调用的问题。所有用到的动态函数的实现都可以共享CAPI中的实现。的基础上,新增加一个CAPI类,将所有用到的函数都在这个类中做动态调用的处理,这样使得整个shellcode功能结构更加清晰。原创 2024-05-12 14:15:25 · 650 阅读 · 1 评论 -
第10章 shellcode实战:14 第二种shellcode编写实战(3)
使用ADVobfuscator来自动处理双引号字符串时,不能禁用项目“优化”选项,即工程 “属性”--->“C/C++”--->“优化”中,“优化”选项可以选择“/O1”、“/O2”,或者“/Ox”,不能使用“已禁用 (/Od)”,否则字符换处理无效。对于上述代码,表面看使用了双引号字符串,实际上在编译时对代码中O("xxx")的内容都是以宏定义的方式进行了转换处理,生成的PE文件中并没有双引号字符串的直接暴露,既符合shellcode编写规范,又一定程度提高了开发效率。原创 2024-05-13 10:45:14 · 744 阅读 · 0 评论 -
第10章 shellcode实战:15 编写shellcode加载器
我最近在做一个关于shellcode入门和开发的专题课👩🏻💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考。我们编写一个最简单的shellcode加载工具,应用于将本地的shellcode文件执行起来。一个人走得再快,不如一群人走得更远!原创 2024-05-14 10:37:53 · 684 阅读 · 1 评论 -
第10章 shellcode实战:16 实战:文件转shellcode
我最近做了一个关于shellcode入门和开发的专题课👩🏻💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考。原创 2024-05-14 18:15:00 · 2174 阅读 · 1 评论 -
第10章 shellcode实战:17 实战:shellcode进程注入
我最近做了一个关于shellcode入门和开发的专题课👩🏻💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考。传统的exe文件执行都是在自己的进程空间中,而shellcode本身没有固定的执行进程,它取决于加载器将它“安排”到哪个进程,它就在哪个进程执行。这种以进程“寄宿”方式执行的方式就被称为进程注入。原创 2024-05-15 09:50:50 · 720 阅读 · 0 评论 -
第10章 shellcode实战:18 神级开源shellcode工具:donut
Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。原创 2024-05-15 10:38:10 · 1996 阅读 · 1 评论