WIN32程序挂钩SetLastError,输出错误描述到控制台

Cobalt Strike无文件上线:Invoke-SharpLoader与自定义C#加载器实战 在网络安全领域,进程注入与内存执行是规避终端检测与响应(EDR)和防病毒(AV)软件的关键技术。其核心原理在于避免恶意代码以文件形式落盘,转而通过反射加载、内存模块等纯内存操作来执行载荷,从而绕过基于文件特征的静态扫描。这项技术的核心价值在于显著提升了攻击的隐蔽性和持久性,广泛应用于红队评估、渗透测试的后渗透阶段,用于建立稳定的指挥控制(C2)通道。本文聚焦于利用PowerShell脚本Invoke-SharpLoader与自定义C#加载器,实现Cobalt Strike Beacon的无文件代理上线,详细 阅读详情
 一、窗口模式应用程序(GUI)启用控制台的方法为:

  

步骤 方法
1 启动/关闭控制台 AllocConsole()

 

  FreeConsole()

2 重定向输入/输出 freopen("CONIN$","r",stdin)

 

  freopen("CONOUT$","w",stdout)

  freopen("CONOUT$","w",stderr)

3 控制台输入/输出 #include <conio.h>

 

  #include <stdio.h>

  printf(...)

  scanf(...)

  system("pause")

  二、挂钩API函数的简单方法为:

  1. DEBUG模式下,函数名值为指令“JMP函数体”的地址。指令格式为“E9 □□□□”,附带的参数为四字节表示的转移偏移量。因此“函数名值 + *(DWORD*)((DWORD)函数名值 + 1)”为函数体入口地址。“使用转到反汇编”的功能计算出函数体入口栈指令长度,得出实际入口地址为“函数名值 + *(DWORD*)((DWORD)函数名值 + 1) + 入口栈指令长度”;

  2. RELEASE模式下,函数名值直接为函数体的入口地址。使用“转到反汇编”的功能计算出函数体除退出指令外的指令长度,得出函数出口地址为“函数名 + 指令长度”,API函数正是这种模式;

  3. 使用“::WriteProcessMemory(::GetCurrentProcess(), API函数出口地址...)”的方法在API函数上挂钩以下调用:

  

序号 说明 指令参数值
1调用挂钩函数E8 □□□□挂钩函数体实际入口地址
2退出C2 □□函数参数总长度,用于恢复栈的状态

  三、挂钩API函数SetLastError,并输出错误描述到控制台的范例

#include <stdio.h>
#include <windows.h>
void hook_SetLastError()//为简化调用挂钩函数时的栈操作,挂钩函数无参数和返回值。
{
if (::GetLastError())
{
 LPVOID lpMsgBuf = 0;
 if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    0, ::GetLastError(), LANG_USER_DEFAULT, (LPTSTR) &lpMsgBuf, 0, 0))
 {
  ::printf("ERROR: %d %s", ::GetLastError(), (LPCSTR)lpMsgBuf);
  ::LocalFree(lpMsgBuf);
 }
}
}
int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 unsigned char setup_SetLastError[8] = {0xE8, 0, 0, 0, 0, 0xC2, 4, 0};
#ifdef _DEBUG
 *(unsigned int*)(setup_SetLastError + 1) = (unsigned int)hook_SetLastError +
  *(unsigned int*)((unsigned char*)hook_SetLastError + 1) - (unsigned int)SetLastError - 18;
#else
 *(unsigned int*)(setup_SetLastError + 1) = (unsigned int)hook_SetLastError -
   (unsigned int)SetLastError - 23;
#endif
 ::WriteProcessMemory(::GetCurrentProcess(), (LPVOID)((unsigned int)::SetLastError + 18),
   setup_SetLastError, 8, new SIZE_T);
 ::AllocConsole();
 ::freopen("CONIN$", "r", stdin);
 ::freopen("CONOUT$", "w", stdout);
 //此处添加自己的代码
 ::WriteProcessMemory(::GetCurrentProcess(), (LPVOID)((unsigned int)::SetLastError + 18),
    setup_SetLastError + 5, 3, new SIZE_T);
 ::system("pause");
 return 0;
}
 

Windows PE中加载.NET程序集的实战方案与避坑指南 .NET程序集加载是Windows平台下实现离线工具自动化的核心能力,其本质依赖运行时宿主、API兼容性与内存模型三重支撑。在Windows PE这类精简内核环境中,.NET Framework需借助WinPE-NetFX功能包注入mscoree.dll宿主,而.NET Core/5+则面临hostfxr.dll对api-ms-win-core-*转发DLL的强校验失败问题。技术价值在于突破操作系统启动依赖,支撑磁盘克隆、硬件采集、BitLocker恢复等关键离线运维场景。本文聚焦真实企业级部署经验,覆盖. 阅读详情

相关推荐

C# MessageBox按钮文字自定义:基于Windows Hook的本地化解决方案

在桌面应用开发中,本地化与UI定制是提升用户体验的关键环节。Windows操作系统通过消息机制管理窗口交互,而钩子技术允许开发者拦截并处理特定事件,为深度定制提供了可能。通过Win32 API的P/Invoke调用,C#程序能够突破托管封装的限制,直接与底层系统交互,实现高度灵活的界面控制。这一技术价值在于平衡了标准化与个性化需求,尤其适用于需要多语言支持或品牌定制的商业软件场景。本文聚焦于C# MessageBox按钮文字的自定义需求,利用CBT Hook在窗口创建阶段动态修改控件文本,为WinForms

weixin_33984032的博客 445

getlasterror返回5的解决办法

getlasterror返回5的解决办法

sj005的博客 3380

C# Hook技术实战:动态修改MessageBox按钮文字

在Windows桌面应用开发中,系统对话框是常见的用户交互组件,但其默认行为往往无法满足定制化需求。通过Windows API Hook技术,开发者可以在不重写原生组件的前提下,深入系统消息处理流程,实现对标准控件行为的动态拦截与修改。这一技术原理基于事件驱动的回调机制,允许在窗口创建、激活等关键生命周期节点注入自定义逻辑,具有极高的灵活性和系统兼容性。其技术价值在于以最小侵入性实现深度定制,平衡了开发效率与用户体验。在C#开发场景中,结合P/Invoke平台调用,可安全稳定地应用于**系统对话框定制**、

weixin_30325971的博客 294

GetLastError返回值大全(英文最新版)(错误码0-1000)

格式说明:第一行:VS枚举宏定义 第二行:错误码 第三行:错误原因ERROR_SUCCESS 0 (0x0) The operation completed successfully. ERROR_INVALID_FUNCTION 1 (0x1) Incorrect function. ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the ...

摔不死的笨鸟的博客 3721

VC++实战:模拟360杀毒软件,掌握Windows系统编程与安全开发

Windows系统编程是深入理解操作系统底层机制和开发高性能桌面应用的核心技术。其原理在于通过Windows API直接与操作系统内核交互,实现对进程、内存、文件系统和网络等核心资源的精细控制。这项技术的价值在于能够构建安全软件、性能工具和系统级应用,是客户端开发和安全领域的基石。在应用场景上,它广泛用于杀毒软件、防火墙、系统优化工具等安全防护产品的开发。本文以模拟实现360杀毒软件为例,深入探讨了如何使用VC++进行特征码扫描和实时文件监控,涵盖了从架构设计到多线程同步的完整工程实践,为学习Windows

weixin_30633405的博客 410

查看lasterror

用来查找错误的调试方法,可以看到最近的代买的错误号,可以根据错误号更快的查找出问题所在

SetErrorMode与SetLastError

SetErrorMode: 功能: 控制指定类型的严重错误是由windows处理还是由应用程序处理。SetErrorMode函数控制系统是否处理指定类型的严重错误,或者进程是否处理这些错误。 返回值:错误模式的先前的状态 与每个进程都关联了一组标志,这些标志的作用是让系统知道进程如何响应严重错误,包括磁盘介质错误、未处理的异常、文件査找错误以及数据对齐错误等.进程可以调用SetErrorMode函...

weixin_45239587的博客 1706

Jetson nano/nx使用麒麟arm版向日葵实现远程控制

Jetson nano/nx使用麒麟arm版向日葵实现远程控制1、安装向日葵软件2、运行Sunlogin Client3、向日葵闪退问题4、重启系统5、重启后黑屏问题 特别提醒: 本博客的第3步切换桌面管理环境到lightdm,存在重启后开机黑屏的风险,我在自己的nano/nx上都没有问题,但帮一个同学的nx配置时,切换到lightdm,重启开机却出现了黑屏,所以执行第3步的话要有心理准备,黑屏解决方法见第5步,特此提醒。

胡乱学点东西 2万+

GetLastError

GetLastError GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置。函数   并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能   担保函数已成功执行。只有在函数调用返回一个错误结果时,这个函数指出的错误结果   才是有效的。通常,只有在函数返回一个错误结果,而...

weixin_33885253的博客 937

Minitab田口设计实战:如何用正交试验优化遗传算法参数(附完整操作步骤)

本文详细介绍了如何利用Minitab田口设计进行遗传算法参数优化,通过正交试验方法显著提升效率。文章涵盖实验设计、Minitab操作步骤、结果分析及高级技巧,帮助工程师快速掌握这一工业级优化技术,实现算法性能的显著提升。

wind6的博客 866

基于Freertos与lwip移植FreeModbusTcp协议

基于FreeRTOS的N32G457VEL7之LWIP网络协议栈移植-优快云博客。

Dd_456456的博客 3239

C++-win32-GetLastError的返回值的含义

GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置。函数并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能担保函数已成功执行。只有在函数调用返回一个错误结果时,这个函数指出的错误结果才是有效的。通常,只有在函数返回一个错误结果,而且已知函数会设置GetLastError变量的前提下,才应访问GetLastError;这时能保证获得有效的结果。SetLastError函数主要在对api函数进行模拟的dll函数中

插件开发 2361

PCIe Link Training 深度解析:从物理检测到高速数据传输

本文深入解析PCIe链路训练(Link Training)的技术细节,揭示了这一复杂协商过程的五个关键阶段:物理检测阶段通过电气特性识别设备连接;轮询阶段建立时钟和符号同步;配置阶段确定链路宽度并处理拓扑异常;恢复阶段完成速率切换和信号均衡;最终进入正常工作状态。文章特别强调了高速率下的均衡技术挑战,以及验证工程师需要关注的多个维度,包括状态机跳转、有序集内容、均衡算法和错误恢复能力。随着PCIe速率不断提升,理解这一底层机制对高速接口设计具有重要价值。

元直的博客 1657

【C#】请教DllImportAttribute.SetLastError属性的作用?

C#-请教DllImportAttribute.SetLastError属性的作用? 在调用win32 API时,会用到DllImport特性类,该类中有一个属性是SetLastError,文档在此: https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.dllimportattribute.setlasterror(v=vs.80).aspx 我对该属性大概的理解是,如果将它设为true,那么会在api函数执行

cxu123321的博客 2096

华为OD新系统机试真题 - 端口流量统计

华为OD机试新系统真题【端口流量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统4月26号机试真题【端口流量统计】。

qq_45776114的博客 766

YOLOv11改进 | Conv/卷积篇 | 利用Hype-YOLO提出MANet增强YOLOv11特征提取能力

本文给大家带来的最新改进机制是由Hype-YOLO提出的MANet结构,其是一种C3、C2f、C3k2的升级版,用于增强特征提取能力。MANet可以理解为C2f的升级版,其整合了DSConv和C2f结构,这些模块的组合使得信息流动更加丰富,有助于在训练过程中提高梯度流动,从而增加基础特征的语义深度。官方发布的数据中HypeYOLO的精度是高于YOLOv11的,本文内容包含MAnet替换C3k2的教程以及原理介绍。欢迎大家订阅我的专栏一起学习YOLO,购买专栏读者联系读者入群获取进阶项目文件!

Snu77的博客 2163

【SequoiaDB巨杉数据库】setLastError()概述1

名称 setLastError - 设置前一次操作返回的错误码。 语法 setLastError(<error code>) 类别 Global 描述 设置前一次操作返回的错误码。 参数 error code(Int32,必填) 错误码。 更多内容请点击巨杉数据库 ...

weixin_45890253的博客 275

基于Python的房地产评估数据抓取与分析 —— 房价走势与市场报告

在房地产行业中,了解和分析房产价格的变化趋势、各个地区的房价差异以及市场评价报告,可以帮助投资者、购房者以及政策制定者做出更加明智的决策。本文介绍了如何使用Python爬虫技术抓取房地产平台上的房产评估报告、价格走势等数据,并对抓取的数据进行分析。通过这些技术,您可以自动化抓取房地产平台的数据,分析房价走势,获取市场报告,为房地产投资决策提供数据支持。假设我们要从链家网抓取某个房产的价格、房产描述以及历史成交价格,首先需要获取目标房产页面的URL,并发送HTTP请求。伪装为常见浏览器,避免被识别为爬虫。

2201_76125261的博客 847

windows Heap manager

前缀我们首先看一下关于heap函数的前缀使用: 1. its native interfaces ( prefixed with rtl ) are available only for use in internal windows components or kernel-mode device drivers. 2. The documented windows api interfac

飞鸟的专栏 2475

华为OD机考双机位C卷 - 相对开音节 (Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 相对开音节 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 744

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

GetLastError与SetLastError的使用和注意事项

GetLastError 与 SetLastError #include #include #define ERROR_NOT_SUPPORTED 50L int func(int m) { if(m == 0 ) //SetLastError(0xe0000001); SetLastError(ER

思重的专栏 2352

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

windows内核开发笔记二:错误信息处理

windows内核开发笔记二:错误信息处理 GetLastError: GetLastError返回错误编码,即便出错函数后边跟随一个正确执行了的函数,也不会覆盖原先的错误代码: GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置。函数并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能担保函数已...

jyl_sh的专栏 7644

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

GetProcAddress获取函数地址和直接调用(或者引用) API函数---这两者有何不同?

在源程序文件中使用GetProcAddress获取函数地址后调用函数和在源码中直接调用 API函数或者直接引用API函数,这两者有何不同?

要把所有那些负面的信息当做对自身行为的评价,而不是对自身价值的评判。 592

定义自己的错误代码

非常简单,SetLastError(DWORD);#include "stdafx.h" #include <windows.h> bool fun() { DWORD errCode = 1 << 29 | 100; SetLastError(errCode); return false; }int main() { fun(); printf("The

混沌的博客 1049

记一次 .NET某机械臂上位系统 卡死分析

这次朋友的生产事故,对我们做分析的人来说还是有很大的教训意义,有时候主线程的一些抛错或者阻塞假象会诱导我们陷入分析误区,这就需要调试人员具有一双慧眼识别,及时的浪子回头。

一线码农的专栏 901
上一篇: 破解还原卡的方法总结!!
下一篇: 在VS2005中调试Windows Service
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值