BianChengNan's Blog

Coding is hard, you can make it easy!


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

基础知识 | 函数基础 2 —— 如何不依赖外部模块却能调用它的函数?

发表于 2024-07-27 | 更新于: 2025-12-13 | 分类于 基础知识
字数统计: | 阅读时长 ≈ 分钟

缘起

前一段日子,同事遇到了一个奇怪的现象 —— B 模块调用了 A 模块某个类的成员函数,没有依赖 A 模块,编译时没有报错。而 C 模块也调用了 A 模块中同一个类的成员函数,没有依赖 A 模块,编译时却报了链接错误。

简单语音沟通后觉得不太可能。用了 A 模块的函数,却不依赖 A 模块,有点儿不讲道理!

因为当时我没在电脑前,跟同事简单沟通了几个可以设置库依赖的位置,结果都没有发现对应的依赖项。

心里越发觉得不可思议,难道 B 模块是通过其它方式依赖 A 模块的?正常情况下,如果 B 模块依赖 A 模块,一定可以在 B 模块的导入表中看到 A 模块相关的记录。于是建议同事查看 B 模块的导入表,但是同事不太熟悉。因为项目比较急,遂建议同事在 C 模块中添加对 A 模块的依赖,先解决项目问题,后面有机会再调查具体原因。

直到最近才有时间调查这个问题,结果发现这个问题非常有意思 —— B 模块确实没有依赖 A 模块(B 模块的导入表中确实没发现 A 模块的相关项),但是 B 模块确实调用了 A 模块中的函数,而且不是通过 LoadLibrary() + GetProcAddress() 的方式调用的。

本文主要关注以下问题,如果你已经有了答案,可以跳过本文。

  • B 模块在什么情况下可以调用 A 模块中的函数,但是却不依赖 A 模块?
阅读全文 »

基础知识 | 函数基础 1 —— 基本概念 & 如何调用外部模块的函数

发表于 2024-07-13 | 更新于: 2025-12-13 | 分类于 基础知识
字数统计: | 阅读时长 ≈ 分钟

缘起

最近遇到了几个跟虚函数有关的问题,既有编译链接问题,又有运行问题,归根到底是基本功不扎实导致的问题。本文将会简单梳理一下函数相关的基本知识:

  • 函数是什么?
  • 函数调用约定有哪些?有什么作用?
  • 普通函数、类静态函数、类成员函数的区别是什么?
  • 什么时候会调用构造函数,什么时候会调用析构函数?
  • 调用虚函数与调用其它函数的区别是什么?
  • B 模块如何调用 A 模块的函数?

本文适合初学者,如果您已经有一定的开发经验,可以跳过本文。

阅读全文 »

调试实战 | 调试另外一个由于全局变量初始化顺序导致的 dll 加载失败问题(下)

发表于 2024-06-08 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

在前面两篇文章中,应该算是彻底理清了项目中存在的两个问题。感兴趣的小伙伴儿可以参考《调试实战 | 调试另外一个由于全局变量初始化顺序导致的 dll 加载失败问题(上)》和 《调试实战 | 调试另外一个由于全局变量初始化顺序导致的 dll 加载失败问题(中)》。

在上篇文章的末尾提到一种情况

如果在 LoadDlls.exe 中也显式加载了 dll3.dll,还会不会崩溃呢?答案是可能崩溃,也可能不崩溃。

因为 RegisterInitCallback()内部更新数据时使用的是 map.insert(),这会导致一个问题 —— 如果 map 中已经存在相同的 key,那么 insert() 会失败,不会更新数据。

试想,如果显式加载 dll3.dll 成功,但是 dll3.dll 的基址变了。map 中保存的还是旧的无效地址,而不是新函数地址。

如果 dll3.dll 的基址没有发生变化,新函数地址与旧函数地址一样,程序可以非常“幸运”的正常运行。

本文通过实战来验证上文中的结论,什么情况下会崩溃,什么情况下不崩溃。

阅读全文 »

调试实战 | 调试另外一个由于全局变量初始化顺序导致的 dll 加载失败问题(中)

发表于 2024-05-12 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

在上篇文章《调试实战 | 调试另外一个由于全局变量初始化顺序导致的 dll 加载失败问题(上)》中,解决了由于全局变量初始化顺序不对导致的崩溃问题。但是代码里还有一处非常隐蔽的 bug,今天继续介绍一下这个问题及对应的解决方法。

阅读全文 »

调试实战 | 调试另外一个由于全局变量初始化顺序导致的 dll 加载失败问题(上)

发表于 2024-03-23 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

最近又遇到了一个程序功能不正常的问题,深入调查后发现与全局变量初始化顺序有非常大的关系,只不过这次更加隐蔽。

之前总结了两篇与全局变量初始化顺序有关的文章,感兴趣的小伙伴儿可以参考《调试实战 | dll 加载失败之全局变量初始化篇》 和 《调试实战 | 全局变量初始化顺序探究》。

阅读全文 »

2024 开工喽

发表于 2024-02-20 | 更新于: 2025-12-13 | 分类于 年度总结
字数统计: | 阅读时长 ≈ 分钟

回首 2023

回顾整个 2023 ,相比 2022 加班少了,工作没那么拼命了。

由于各种原因,年初立的 flag 好几个都没实现。

  • 公众号基本上处于鸽的状态
  • 也没分享技术视频
  • 语言倒是接触了一下 rust,但远没有达到能实战的地步
  • 嘴没管住,腿倒是迈开了

展望 2024

我对 2024 这个数字感到非常亲切,2024 = 1000 + 1024,两个一千

  • 今年的首要任务依旧是锻炼身体

    本来计划 2024 年跑步作为日常锻炼的方式,结果 2023 年最后一次从公司跑回家后膝盖疼,2024 只能偶尔跑跑了

  • 继续遛狗
    2023 花费了很大一部分时间在遛狗上,2024 继续努力。如果不是狗子的陪伴,估计我早抑郁了,感谢,感恩。
  • 坚持练习英语口语

    希望这次不要因为任何原因中断

  • 继续坚持分享技术文章

    遇到值得总结的问题,及时总结分享

  • 读一些非技术书籍

    之前看的书以技术书籍为主,2024 年争取多看些非技术的书籍

  • 做一些改变

    尽量熟悉 AI 相关的人和事

调试实战 | 记一次有教益的递归栈查看(续)

发表于 2024-01-06 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

在上篇文章中介绍了在 windbg 中如何查看非常深的调用栈 —— 使用 kN 命令指定栈帧数。kN 虽好,但最多只能查看 0xffff 个栈帧。如果栈帧数量比 0xffff 还多,该如何查看呢?本文将介绍几种查看方法。

阅读全文 »

调试实战 | 记一次有教益的递归栈查看

发表于 2024-01-06 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

最近,遇到了一个由于递归导致的卡死问题。这个问题非常有意思,值得总结。

你知道什么情况下无限递归会卡死,而不崩溃吗?你知道递归层数过多时,如何找到导致递归调用的函数吗?你知道如何快速找到关键线程吗?你知道如何附加到一个正在被调试的进程吗?你知道如何在 windbg 中显示指定数量的栈帧吗?

带着这些疑问,一起来看看这个非常有意思的问题吧。

说明: 文章末尾有这些问题的答案,可以直接跳到末尾查看。

阅读全文 »

调试实战 | 从转储文件找出抛出的异常 —— 实战

发表于 2023-12-31 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

我在上一篇文章中介绍了定位抛出异常的理论知识,本文会通过几个实例介绍各种情况下的定位方法。有调试符号如何定位?没有调试符号如何定位?32 位程序如何定位?64 位程序又该如何定位?

其实,32 位程序和 64 位程序定位过程大同小异,只不过在解析过程中需要注意,很多关键字段在 64 位程序中是偏移,需要加上模块基址得到虚拟地址后才能使用,而在 32 位程序中对应的字段就是虚拟地址,可以直接使用。

没有调试符号的时候定位异常类型会比较困难,需要根据上一篇文章中总结的步骤一步步的找到异常类型。有调试符号的情况会比较容易,有很多简便的查看方法。

一起来实战吧!

阅读全文 »

调试实战 | 从转储文件找出抛出的异常 —— 理论

发表于 2023-12-30 | 更新于: 2025-12-13 | 分类于 调试
字数统计: | 阅读时长 ≈ 分钟

缘起

最近在分析转储文件时,遇到了一个由 throw 抛出的异常。尽管在 windbg 中使用 !analyze -v 迅速知道了异常码是 0xe06d7363(对应的 ASCII 码是 .msc),但是根据异常码并不能确定具体抛出来的是哪种异常。针对这种情况,确定具体的异常类型才有意义。

本篇文章会简单介绍与抛出异常相关的内容,包括关键的函数及结构体。下一篇文章会通过实例介绍几种典型情况(有调试符号 / 没有调试符号 / 32 位程序 / 64 位程序)下的定位方法。

阅读全文 »
123…14
BianChengNan

BianChengNan

140 日志
34 分类
227 标签
RSS
GitHub 知乎 博客园
© 2019 — 2025 BianChengNan | 全博客共 字
0%