首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用ThreadStackSpoofer隐藏Shellcode的内存分配行为

ThreadStackSpoofer是线程堆栈欺骗技术的一个示例实现,旨在规避恶意软件分析、反病毒产品和EDR在检查的线程调用堆栈中查找Shellcode帧的引用。...其思想是隐藏对线程调用堆栈上针对Shellcode的引用,从而伪装包含了恶意代码的内存分配行为。...为了在堆栈上找到它们,我们需要首先收集帧指针,然后取消对它们的引用以进行覆盖: *(PULONG_PTR)(frameAddr + sizeof(void*)) = Fake_Return_Address...工具使用演示 下面的例子中,演示了没有执行欺骗技术时的堆栈调用情况: 开启线程堆栈欺骗之后的堆栈调用情况如下图所示: 上述例子中,我们可以看到调用栈中最新的帧为MySleep回调。...RtlUserThreadStart+0x21 上图所示为未修改的Total Commander x64线程。正如我们所看到的,它的调用堆栈在初始调用堆栈帧方面与我们自己的调用堆栈非常相似。

1.4K10

CVE-2022-23253 – Windows V** 远程内核空指针取消引用

出于某种原因,在接收到IncomingCallConnected针对已连接呼叫 ID 的控制消息时,会触发空指针取消引用,从而导致系统崩溃。...raspptp.sys充当 PPTP 的前端解析器,然后将封装的虚拟网络帧转发到 NDIS,由 Windows V**后端的其余部分路由和处理。 那么为什么会发生这种空指针取消引用呢?...,因此它主要是未逆向工程的,但很明显,主要目的是在结构上设置一些属性,该结构被跟踪为从raspptp.sys....特定变量lpCallParameters(也是CallParameters参数)导致空指针取消引用,并通过raspptp.sys;传递给函数。...CallContext对于我们的测试用例,此代码将始终执行,因此第二次调用CallEventCallInConnect将触发空指针取消引用并使 NDIS 层中的机器崩溃,从而导致出现相应的蓝屏死机:

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    无锁化编程场景下的垃圾回收机制(二)

    ) { Node * cur_top = top.load(); if ( cur_top == nullptr ) { break; // 堆栈为空...// 栈为空,取消标注cur_top为危险指针 hazard_cur_top.set(nullptr); } // 出栈操作结束,取消标注next为危险指针...,取消标注该危险指针,因为原栈顶节点还在堆栈里,不能被回收,即入栈操作不产生待回收对象。...,即堆栈为空,则取消标注这两个危险指针; 如果出栈操作成功,要标注当前栈顶指针为待回收对象,并取消标注栈顶的下一节点指针为危险指针。...只有等线程A恢复执行后,发现cur_top已经不是最新的栈顶指针,更新了栈顶指针并更新了对应的危险指针之后,才能安全回收原栈顶节点的内存。

    84820

    汇编和栈

    由于基本指针已保存到堆栈中并设置为当前堆栈指针,因此只需知道基本指针寄存器中的值即可遍历堆栈。调试器在向您显示堆栈跟踪时会执行此操作。...当使用调试信息编译程序时,调试信息将引用基本指针寄存器中的偏移量以获得变量。 这些偏移量被赋予名称,与您在源代码中为变量赋予的名称相同。...编译并优化程序以进行发布时,将打包打包到二进制文件中的调试信息。 尽管删除了这些变量和参数的引用的名称,但是您仍然可以使用堆栈指针和基指针的偏移量来查找这些引用的存储位置。...包含 RSP 和可选值的方括号表示取消引用,就像 C 编程中的 * 一样。上面的第一行说 “将 0x7 放入 RSP 指向的内存地址中。”...也就是说,编译器根据需要在堆栈上为局部变量分配空间。 通过在函数序言中查找 sub rsp,VALUE 指令,可以轻松确定是否为堆栈帧分配了额外的暂存空间。

    3.7K20

    如何在Linux上获得错误段的核心转储

    这可能是由于: 试图解引用空指针(你不被允许访问内存地址 0);◈ 试图解引用其他一些不在你内存(LCTT 译注:指不在合法的内存地址区间内)中的指针;◈ 一个已被破坏并且指向错误的地方的 C++ 虚表指针...这个“C++ 虚表指针”是我的程序发生段错误的情况。我可能会在未来的博客中解释这个,因为我最初并不知道任何关于 C++ 的知识,并且这种虚表查找导致程序段错误的情况也是我所不了解的。...一旦我这样做了,当我执行 bt 时,gdb 给了我一个带有行号的漂亮的堆栈跟踪! 如果你想它能工作,二进制文件应该以带有调试符号信息的方式被编译。...在试图找出程序崩溃的原因时,堆栈跟踪中的行号非常有帮助。:) 查看每个线程的堆栈 通过以下方式在 gdb 中获取每个线程的调用栈!...在未来如果我能让 ASAN 工作,我可能会多写点有关它的东西。(LCTT 译注:这里指使用 ASAN 也能复现段错误) 从一个核心转储得到一个堆栈跟踪真的很亲切!

    4.1K20

    深入探索GDB:Linux下强大的调试神器

    动态控制:在GDB环境中,开发者可以实时控制程序的执行流程,如暂停、恢复、单步执行、跳转到指定位置等,犹如拥有了一台时光机,能够任意穿梭于程序的执行时间线上。...数据观测:GDB提供了丰富的命令来查询和修改程序状态,包括查看变量值、内存内容、寄存器状态、线程信息、堆栈轨迹等,为深入剖析程序运行状态提供了全方位的支持。...调试实例:查找空指针解引用错误 假设我们有一个简单的C程序 null_pointer.c,其中可能存在空指针解引用错误。.../null_pointer (gdb) break main (gdb) run 当程序在main函数处暂停后,逐步执行代码,观察变量值,直至发现空指针解引用的行。...此时,可以通过print命令检查相关变量是否为空,定位问题所在。 ✨三、GDB进阶功能:解锁更深层次的调试能力 1.

    1K10

    DAOS_TSE(TaskSchedulerEngine)任务调度引擎流程及源码分析_ev_eq

    此外,DAOS 在内部使用 TSE 来跟踪和处理与 API 事件关联的所有 API 任务,并且在某些情况下,调度与单个 API 任务相对应的多个飞行中的“子”任务,并添加对该任务的依赖以进行跟踪所有那些飞行中的...返回时列表为初始化为空(可理解为从一个队列移动到新的队列) d_list_for_each_entry_safe(dtp, tmp, &comp_list, dtp_list) -> 遍历新的完成队列...、子列表和事件队列哈希列表中取消事件链接,并销毁所有子事件, EV不能是运行中, 销毁EV锁, 处理子EV, 处理父EV, 删除EV的链表, EV上的网络上下文置空, EQ引用-1 -------...该API仅在任务堆栈上保留空间,不涉及数据拷贝, 获取可用大小, 输入大小按8字节向上对齐, 将参数大小累加到栈顶指针, 计算新的参数地址(固定地址+总大小-栈顶大小)并返回....; -> 为用户分配嵌入参数保留的缓冲区,它也可以用作任务堆栈空间,可以压入/弹出参数以方便 I/O 处理。

    44500

    Go 1.23 发布笔记 AI 翻译

    新的go env -changed标志使命令仅打印与默认值不同的设置,即在空环境中没有先前使用-w标志的情况下获得的默认值。...Tracetrace工具现在通过尝试恢复它可以获取的跟踪数据,更好地容忍部分损坏的跟踪。在程序崩溃时查看跟踪时,这个功能尤其有用,因为在大多数情况下,崩溃前的跟踪数据现在可以恢复。...运行时在未处理的恐慌或其他致命错误之后,运行时打印的回溯现在将错误消息的第二行和后续行缩进一个制表符,以便可以清楚地区分第一个goroutine的堆栈跟踪。参见#64590以进行讨论。...Go 1.23的编译器现在可以重叠在函数的不相交区域中访问的局部变量的堆栈帧槽,从而减少Go应用程序的堆栈使用。对于386和amd64,编译器将使用PGO的信息对循环中的某些热块进行对齐。...3DES密码套件已从Config.CipherSuites为nil时使用的默认列表中删除。可以通过在GODEBUG环境变量中添加tls3des=1来恢复默认设置。

    24120

    如何隐藏钩子:rootkit 的管理程序2

    --[ 3.7 - 程序计数器控制 根据易受攻击的 XCode 执行逻辑, XEngine::brns() 中的动态调用是通过三个连续的 对崩溃指针的取消引用: msxml6!...取消引用逻辑: Ptr0(初始 AV / 喷雾中的地址)-> ptr1 -> ptr2 -> ptr3 -> shellcode 在上面的指针链中,指针 1 和 3 是精确的,因为它们是...4.接下来,因为padding必须解析两个连续的内存 取消引用,同时将泄漏的数据位保留在实际中 指针,我们将页面大小的模式分成两半并填充它们 不同: 否则如果(i_pattern 为各自的值 取消引用索引,例如第一次读取的 [eax+8] 以及 堆头的大小,整页堆为 0x20: ptr1 = (i_pattern - 8 + 0x20 + delta)...,即堆栈偏移量的两个泄漏字节,将 然后被应用程序本身用来恢复原来的 3rd 指针,这导致检索的正确地址 XEngine::brns() 中的动态调用,并恢复程序执行 就像没有漏洞一样: 0:007

    4.6K480

    IL指令速查

    Brfalse 如果 value 为 false、空引用(Visual Basic 中的 Nothing)或零,则将控制转移到目标指令。...Brfalse.S 如果 value 为 false、空引用或零,则将控制转移到目标指令。 Brtrue 如果 value 为 true、非空或非零,则将控制转移到目标指令。...Initobj 将位于指定地址的值类型的每个字段初始化为空引用或适当的基元类型的 0。 Isinst 测试对象引用(O 类型)是否为特定类的实例。 Jmp 退出当前方法并跳至指定方法。...Ldelema 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。 Ldfld 查找对象中其引用当前位于计算堆栈的字段的值。...Ldflda 查找对象中其引用当前位于计算堆栈的字段的地址。 Ldftn 将指向实现特定方法的本机代码的非托管指针(native int 类型)推送到计算堆栈上。

    1.6K70

    IL指令详细表

    Brfalse 如果 value 为 false、空引用(Visual Basic 中的 Nothing)或零,则将控制转移到目标指令。...Brfalse.S 如果 value 为 false、空引用或零,则将控制转移到目标指令。 Brtrue 如果 value 为 true、非空或非零,则将控制转移到目标指令。...Initobj 将位于指定地址的值类型的每个字段初始化为空引用或适当的基元类型的 0。 Isinst 测试对象引用(O 类型)是否为特定类的实例。 Jmp 退出当前方法并跳至指定方法。...Ldelema 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。 Ldfld 查找对象中其引用当前位于计算堆栈的字段的值。...Ldflda 查找对象中其引用当前位于计算堆栈的字段的地址。 Ldftn 将指向实现特定方法的本机代码的非托管指针(native int 类型)推送到计算堆栈上。

    2.1K20

    Reflector、reflexil、De4Dot、IL指令速查表

    Brfalse 如果 value 为 false、空引用(Visual Basic 中的 Nothing)或零,则将控制转移到目标指令。...Brfalse.S 如果 value 为 false、空引用或零,则将控制转移到目标指令。 Brtrue 如果 value 为 true、非空或非零,则将控制转移到目标指令。...Initobj 将位于指定地址的值类型的每个字段初始化为空引用或适当的基元类型的 0。 Isinst 测试对象引用(O 类型)是否为特定类的实例。 Jmp 退出当前方法并跳至指定方法。...Ldelema 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。 Ldfld 查找对象中其引用当前位于计算堆栈的字段的值。...Ldflda 查找对象中其引用当前位于计算堆栈的字段的地址。 Ldftn 将指向实现特定方法的本机代码的非托管指针(native int 类型)推送到计算堆栈上。

    1.8K50

    IL指令详细

    Brfalse 如果 value 为 false、空引用(Visual Basic 中的 Nothing)或零,则将控制转移到目标指令。...Brfalse.S 如果 value 为 false、空引用或零,则将控制转移到目标指令。 Brtrue 如果 value 为 true、非空或非零,则将控制转移到目标指令。...Initobj 将位于指定地址的值类型的每个字段初始化为空引用或适当的基元类型的 0。 Isinst 测试对象引用(O 类型)是否为特定类的实例。 Jmp 退出当前方法并跳至指定方法。...Ldelema 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。 Ldfld 查找对象中其引用当前位于计算堆栈的字段的值。...Ldflda 查找对象中其引用当前位于计算堆栈的字段的地址。 Ldftn 将指向实现特定方法的本机代码的非托管指针(native int 类型)推送到计算堆栈上。

    1.5K30

    C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    T 可以是包括 struct 在内的任何值类型;但不能是引用类型。 1.值类型后加问号表示此类型为可空类型,如int? i = null; int?...3.比较可空类型时,只要一个操作数为null,比较结果就为false。 ? 值类型和引用类型在赋值(或者说复制)的时候也是有区别的。...此时,堆栈指针就减4,指向新的已用空间的末尾1996,下一个自由空间为1995。下一行声明d赋值3.5后,double需要占用8个字节,所以存储在1988~1995上,堆栈指针减去8。   ...变量的生存期总是嵌套的,当d在作用域的时候,无论发生什么事情,都可以保证堆栈指针一直指向存储d的空间。删除这个d变量的时候堆栈指针递增8,现在指向d曾经使用过的空间,此处就是放置闭合花括号的地方。...但使用托管堆,就只需要读取堆指针的值,而不用搜索整个链接地址列表,来查找一个地方放置新数据。   因此在.NET下实例化对象要快得多,因为对象都被压缩到堆的相同内存区域,访问对象时交换的页面较少。

    1.1K10

    C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    T 可以是包括 struct 在内的任何值类型;但不能是引用类型。 1.值类型后加问号表示此类型为可空类型,如int? i = null; int?...3.比较可空类型时,只要一个操作数为null,比较结果就为false。 ? 值类型和引用类型在赋值(或者说复制)的时候也是有区别的。...此时,堆栈指针就减4,指向新的已用空间的末尾1996,下一个自由空间为1995。下一行声明d赋值3.5后,double需要占用8个字节,所以存储在1988~1995上,堆栈指针减去8。   ...变量的生存期总是嵌套的,当d在作用域的时候,无论发生什么事情,都可以保证堆栈指针一直指向存储d的空间。删除这个d变量的时候堆栈指针递增8,现在指向d曾经使用过的空间,此处就是放置闭合花括号的地方。...但使用托管堆,就只需要读取堆指针的值,而不用搜索整个链接地址列表,来查找一个地方放置新数据。   因此在.NET下实例化对象要快得多,因为对象都被压缩到堆的相同内存区域,访问对象时交换的页面较少。

    1.2K41

    C语言 | C++ 堆栈工作机制

    ,我们只是用它来跟踪堆栈。...下面的章节我们来跟踪堆栈的建立,堆栈的使用和堆栈的销毁。 堆栈的建立 我们从main函数执行的第一行代码,即 int result=foo(3,4); 开始跟踪。...因此,通过 EBP 很容易查找函数是被谁调用的或者访问函数的参数(或局部变量)。 为局部变量分配地址 接着,foo 函数将为局部变量分配地址。...其规则是:参数从右向左压入堆栈,x86 构架下 this 指针通过 ECX 寄存器传递,函数退出时由 callee 清理堆栈中的参数,x86构架下this指针通过ECX寄存器传递。...反编译代码的跟踪(不熟悉汇编可跳过) 以下代码为和 foo 函数对应的堆栈帧建立相关的代码的反编译代码,我将逐行给出注释,可对照前文中对堆栈的描述: main 函数中 int result=foo(3,4

    7.8K88

    详解CC++堆栈的工作机制

    ,我们只是用它来跟踪堆栈。...下面的章节我们来跟踪堆栈的建立,堆栈的使用和堆栈的销毁。 堆栈的建立 我们从main函数执行的第一行代码,即int result=foo(3,4); 开始跟踪。...因此,通过EBP很容易查找函数是被谁调用的或者访问函数的参数(或局部变量)。 为局部变量分配地址 接着,foo函数将为局部变量分配地址。...类成员函数默认使用的调用约定。其规则是:参数从右向左压入堆栈,x86构架下this指针通过ECX寄存器传递,函数退出时由callee清理堆栈中的参数,x86构架下this指针通过ECX寄存器传递。...反编译代码的跟踪(不熟悉汇编可跳过) 以下代码为和foo函数对应的堆栈帧建立相关的代码的反编译代码,我将逐行给出注释,可对照前文中对堆栈的描述: main函数中 int result=foo(3,4);

    54320

    调试试炼开始

    调用堆栈 调用堆栈,主要是程序有多个函数并且存在嵌套调用时可以观察到函数的调用关系和当前调用所处的位置。 反汇编 查看程序的汇编代码,更加底层。...但是可以通过对变量的地址解引用修改变量的值。...不能通过指针解引用的方式改变指针所指向的对象,但可以不通过指针而直接修改那个对象。 const在*右边,此时const修饰的是指针本身。指针获得一个变量的地址后不能在被另一个地址赋值。...str所指向的对象,使其不能被更改,否则程序出错 int my_strlen(const char *str){ //传入的指针可能是空指针NULL,此时str就是野指针,没有指向对象,会导致程序出现错误...不是语法错误,一般是代码中出现了未定义的函数等外部符号,链接错误一般不给出错误出现的代码行,但会标识除未定义的符号,可以使用查找功能进行排查。

    43500

    建议收藏 哭着喊着 从C语言转向C++刷算法

    1.初始化(构造函数) vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t...5.判断函数 bool empty() const:判断向量是否为空,若为空,则向量中无元素 6.大小函数 int size() const:返回向量中元素的个数 set set是集合,set不存在重复的元素...)--删除所有的数据 查找数据 find()--查找值对应的位置 注意 如果元素存在那么返回其对应的位置 否则返回end指针 所以如果查找某个元素是否存在要做的条件判断 if(s.find(233)...()---根据键删除元素 clear()--清处所有的元素 stack 称为栈(或者堆栈),堆栈是一个不容忽视的概念。...先进后出 头文件 #include 增加元素 push() 在栈顶增加元素 删除元素 pop() 移除栈顶元素 返回栈中元素数目 size() 返回栈顶元素 top() 判断是否为空

    1.4K20
    领券