免责声明
合法使用原则:文中提及的技术、工具或案例,仅用于授权范围内的安全测试、防御研究或合规技术分享,未经授权的网络攻击、数据窃取等行为均属违法,需承担法律责任。
风险自担与责任豁免:文章内容基于公开信息整理,不保证技术的准确性、完整性或适用性。读者需自行评估技术应用风险,若因不当使用导致任何法律后果或损失,均由使用者自行承担,与本公众号及作者无关。
法律管辖与提示:本公众号坚决拥护相关法律法规,反对任何危害网络安全的行为,读者需严格遵守法律法规。
回调机制
-
在Windows编程中,回调函数是一种通过函数指针调用的函数,可以理解为回调函数是一个作为参数传入另一个函数的函数指针(地址),并且这个被传入的函数会在某个特定时机被“回调”执行 -
举个生活中的例子:你让朋友帮你买奶茶,但你不想等他买完再打电话通知你,而是告诉他:“你买完奶茶后,直接去我家门口等我,”这里的“我家门口”就是回调函数的地址,朋友(Windows API)在完成任务后会主动去“我家门口”找你。
利用Windows API的的回调机制执行shellcode
-
首先可以使用 VirtualAlloc
函数申请一块可读、可写、可执行的内存空间 -
然后通过 memcpy
函数将shellcode加载到申请好的内存中 -
最后,也是最关键的一步,使用 Windows API
函数把shellcode的地址强制转换为回调函数类型(指针)并传入这个Windows API
函数规定的参数中(此时传入的并不是真正的回调函数,而是shellcode的地址),该Windows API
函数在调用回调函数时,会直接跳转到传入的地址(即shellcode的起始位置)并执行它 -
总的来说,要将存放shellcode的内存地址放到 Windows API
函数中会自动调用回调函数的参数中,才会自动运行shellcode
案例1:Windows API-EnumDateFormatsA
函数原型
-
该参数会接收3个参数
BOOL EnumDateFormatsA(
[in] DATEFMT_ENUMPROCA lpDateFmtEnumProc, // 参数1:指向应用程序定义的回调函数的指针
[in] LCID Locale, // 参数2:用于指定要为其检索日期格式信息的区域设置的区域设置标识符
[in] DWORD dwFlags // 参数3:指定日期格式的标志
);
-
此时可以看到,第一个参数的作用是指向应用程序定义的回调函数的指针,所以第一个参数就需要指向shellcode的内存地址
加载器编写
-
完整代码
-
在代码中可以看到,将shellcode的类型强制转换成了 DATEFMT_ENUMPROCA
类型,那么我们要怎么知道要强转成什么样的类型呢?有两种方法:
-
方法1:查看官方文档( https://learn.microsoft.com/zh-cn/windows/win32/api/winnls/nf-winnls-enumdateformatsa
),在官方文档中清晰的告诉了我们第一个参数的类型是DATEFMT_ENUMPROCA
-
方式2:在VS中查看,按住键盘的 Ctrl键
然后点击函数名,就能看到函数原型的语法,也能看到函数中参数对应的类型
-
拓展:有这么多回调函数,要怎么知道哪个参数是指向应用程序定义的回调函数的指针并且需要对shellcode进行强转类型呢?可以看官方文档或者在VS中查看函数语法时,看哪个参数包含 Proc
这个单词,这个单词就是指针,所以该参数就是指向应用程序定义的回调函数的指针
-
除了指针以外的参数一般情况下都可以使用 NULL
来代替
案例2:Windows API-EnumUILanguagesA
函数原型
BOOL EnumUILanguagesA(
[in] UILANGUAGE_ENUMPROCA lpUILanguageEnumProc, // 指向应用程序定义的回调函数的指针
[in] DWORD dwFlags,
[in] LONG_PTR lParam
);
加载器编写
-
完整代码
-
通过查看函数的使用语法,可以看见,需要将shellcode强转为 UILANGUAGE_ENUMPROCA
类型
其它可用的Windows API函数
CertEnumSystemStore
CertEnumSystemStoreLocation
CreateThreadPoolWait
CreateTimerQueueTimer_Tech
CryptEnumOIDInfo
EnumCalendarInfo
EnumCalendarInfoEX
EnumChildWindows
EnumDesktopW
EnumDesktopWindows
EnumDirTreeW
EnumDisplayMonitors
EnumerateLoadedModules
EnumFontFamiliesExW
EnumFontFamiliesW
EnumFontsW
EnumUILanguages
EnumLanguageGroupLocalesW
EnumObjects
EnumPageFilesW
EnumPwrSchemes
EnumResourceTypesExW
EnumResourceTypesW
EnumSystemLocalesEx
EnumThreadWindows
EnumTimeFormatsEx
EnumUILanguagesW
EnumWindows
EnumWindowStationsW
FiberContextEdit
FlsAlloc
ImageGetDigestStream
ImmEnumInputContext
LdrEnumerateLoadedModules
SetTimer
SetupCommitFileQueueW
SymEnumProcesses
本文来源:大白哥免杀课程,需要咨询课程详情,可以加绿泡泡(mhx47829)私信大白哥
原文始发于微信公众号(AegisGuard):基于回调函数的shellcode注入实战教程
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论