软件调试
文章平均质量分 78
软件调试笔记
LostSpeed
c++ coder
展开
-
WTL - error - GetModuleHandle - ERROR_MOD_NOT_FOUND : 找不到指定的模块
在看一个WTL的demo, 同时也用VS2019的WTL向导搭建了一个相同环境的初始工程。将知识点搬进去之后,效果不一样。查了一下,是调用GetModuleHandl()时,没得到DLL的句柄。对了一下源码工程,没看出啥区别。看了网上资料,没人能说清楚这个问题。那用IDA看看吧, 反汇编是不会骗人的。看DLL名称的引用,看出来了,原来“必须要先LoadLibrary, 然后在程序其他地方调用GetModuleHandle()才会成功。原创 2024-07-02 23:33:00 · 358 阅读 · 0 评论 -
vs - ms官方查看pdb文件内容的例子工程
不管哪个版本的VS,生成debug版工程时,除了工程自己的.pdb还会有vc*.pdb.因为这些vc*.pdb不是全局的pdb, 而是每个工程独有的。就想看看这些同名的.pdb内容有啥不同。先去找了一下,是否有公版的工具。最开始在github上看到了PDBExp,都是从titilima的工程来的,工程都编译不过。原因是PDL库版本的问题和WTL版本的问题,折腾了好久,始终编译不过。这些作者都没有将依赖的PDL库和WTL版本自包含在工程中,也就他们自己用的爽。原创 2024-06-03 17:09:11 · 723 阅读 · 0 评论 -
vs2019 - LoadLibrary失败时的排查方法
在做从内存载入DLL的实验,发现从内存载入DLL失败。昨天还是成功的。昨天将工程归档了,清掉了临时文件。应该是少了啥依赖的东西。用LoadLibrary显式载入,也失败。去查msdn, WIN32API失败后,可以调用GetLastError() + FormatMessage()来显示失败信息。这时显示的信息为确实为依赖的模块,具体哪个模块,还不清楚。最后,直接隐式调用DLL接口,如果是缺哪个依赖的模块,直接有messagebox提示,一目了然。原创 2024-05-12 10:17:07 · 720 阅读 · 0 评论 -
MemoryModule - exp - test
MemoryModule 是从内存载入DLL的一种实现。测试一下和隐式载入DLL/显式载入在效果上有哪些不同?是否可以在内存中载入执行正规DLL的接口?在内存载入正规DLL时,是否可以在DLL中执行正常的API?是否可以正常调用其他正规DLL的接口?原创 2024-05-10 19:20:55 · 970 阅读 · 0 评论 -
vs2019 - 用自定义对话框消息框替代MessageBox
当工程被逆向时,如果存在AfxMessageBox(), ::MessageBox()的调用,是一个明显的线索。想用自定义对话框消息替代MessageBox()的API.在codeproject上,看到前辈同学已经写好了一个实现(这个实现的功能对于我的应用来说,功能太多了。将这个实现加入现有工程时,要在工程RC中添加的东西有点多。做了一个剪裁版,插入一个新工程时,方便很多。原创 2024-05-04 10:10:18 · 849 阅读 · 0 评论 -
vs2019 - 移除PE字符串表中的RTTI字符串
用IDA打开PE, 看到字符串表中有类名的字符串。查了源码,是用类向导建立的一个类(基类为CDialogEx),类向导生成了RTTI相关的模板代码引起的。如果工程中不用RTTI的特性(e.g. IsKindOf(), RUNTIME_CLASS()), 可以将RTTI的模板代码清掉,使生成的PE字符串表中没有类名的字符串。RTTI特性不是必须的,自己用类的时候,自然知道是啥类,不是非要用RTTI特性。用RTTI只是为了更方便,但是对于程序加固是不好的。原创 2024-04-29 10:44:22 · 202 阅读 · 0 评论 -
openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__
在加固主程序。主程序已经确定是release版的了。用IDA打开,还是能看到很多相关的__FILE__的痕迹。查这些串的引用点。原来是openssl释放内存的函数要的参数。因为我写程序时为了方便,就编译了一个debug版的openssl3.2.查看openssl3.2的API定义。\ if(NULL!\ if(NULL!原创 2024-04-28 21:31:06 · 1401 阅读 · 0 评论 -
vs2019 - release版中_DEBUG宏生效的问题
在加固程序,需要去掉PE的字符串表中和逻辑相关的字符串。编译成release版后,用IDA看,还是发现有debug版才有的字符串。那明显工程是按照debug版来编译的。但是PE的体积确实比debug版小多了。为啥还是按照debug版编译的呢?编译工程的release版,为啥还是走的debug版的配置呢?看工程里面的提示,为啥_DEBUG宏是亮的呢?开始以为是VS2019的bug, 就故意将_DEBUG宏包含的库名改错,结果真走的是_DEBUG宏的判断分支。/Mdd会隐含的定义_DEBUG宏。原创 2024-04-28 12:15:26 · 335 阅读 · 0 评论 -
c++ - 动态载入DLL接口,可以给IDA静态分析增加一点麻烦
工程中用到了PostMessage来压入任务,太扎眼了。在IDA静态分析时,看API引用,很容易看到压入任务的实现。想动态载入API, 看看静态分析效果如何?网上有大神开源了一个动态载入DLL的封装类(http://www.codeproject.com/KB/DLL/LateLoad.aspx)以前也用过,只是用来方便动态调用DLL接口。这次用,主要是看看用IDA静态分析时,动态载入的API接口是否容易识别?写个demo(vs2019 vc++ console), 转圈打印字符串. 如果圈数>10,原创 2024-04-14 17:36:47 · 589 阅读 · 0 评论 -
vs2019 - detected memory leak
用VS2019建立的控制台工程, 在调试模式下, 如果出了内存泄漏,是没有提示的。// 网上的大佬在2010年就给出了解决方法。原创 2024-04-13 19:09:12 · 1305 阅读 · 0 评论 -
IDA - 字符串表的增量比较
想将程序中能出现在IDA分析的字符串表中的字符串做一下处理, 不让逆向工程师直接分析.首先就是将在程序中的字符串让IDA找出来.然后将IDA字符串表保存起来为文本.然后写程序再用IDA分析新增量程序的字符串表, 再保存字符串表为文本.然后BC4比较, 就知道自己程序中新增了哪些字符串, 然后对这些字符串做处理.原创 2024-03-22 12:13:15 · 516 阅读 · 0 评论 -
IDA - 让字符串资源不出现在字符串表中的方法
如果在程序中直接使用了字符串, 就会在IDA的字符串表中被看到, 给了逆向工程师明显的线索.以前在给IDM打补丁时, 看到作者使用了一种隐藏字符串的方法. 一个一个字符的给字符串赋值.当时就在想, 这有用么?不过当时不是依赖这个字符串的线索, 也就没在意.今天正好做了一个实验, 验证了这个想法.如果给字符串赋值, 是用字符来赋值, 确实管用.如果是用字符串赋值, 即使字符串再短(短到一个字符), 也会出现在IDA的字符串表中.原创 2024-03-22 11:30:29 · 476 阅读 · 0 评论 -
debug - 只要在内存中有显示相关的数据, 就会被CE找到
自己写了一个demo, 想验证一下, 如果不让显示值和实际值是一个地址(不直接使用结构, 而是用函数从结构中取值, 然后通过函数返回值给显示值用, 是否可以给CE增加一些麻烦?发现不好使:P因为实际值也是有地址的, 一样会被CE找到…CE在查找/定位数据方面, 真是利器.我在demo中, 还做了显示值和实际值的比对, 如果显示值被改了, 就退出程序.原创 2024-02-19 14:21:04 · 847 阅读 · 0 评论 -
小工具 - 浮点计算器
在学习CE, 在调试过程中, 经常要看内存中浮点对应的4字节内存到底对应的是啥具体的浮点值. e.g. 0x42860000 => 67.00转换逻辑挺简单的开始写了一个测试程序, 直接改4字节的值, 编译运行一下, 看打印出的结果.但是要经常看内存中的4字节数据对应的浮点值, 不胜其烦.花了半天, 写了一个小工具, 方便多了.原创 2024-02-19 10:56:21 · 2385 阅读 · 0 评论 -
debug - 打补丁 - 浮点数加法
在cm中, UI上显示的数值仅仅用来显示, 改这个显示值没用.显示时, 是从一个结构体中取出值(浮点数), 然后转成整数显示.写了一个demo(vs2019 + console + debug/x64), 模拟结构体信息中的浮点数赋值和浮点数的显示.用CE来看, 和cm中取值显示的汇编实现很像.拿自己写的demo, 来打个补丁, 让显示之前, 先对结构体中的浮点值加上一些额外的值, 然后再去显示这样的话, 显示值和结构体中的值就一致了.原创 2024-02-15 15:26:11 · 493 阅读 · 0 评论 -
vs2019 - 使用IDA定位已经被捕获的异常
正在测试程序的功能, 用VS2019开着调试版跑起来. 发现程序关闭后, 在VS2019的输出窗口发现了C++异常的信息, 还不是一条.虽然不影响程序的运行, 但是心里膈应.这种异常发生了, 但是没被VS2019断下来, 说明这4个C++异常是在工程中被try-catch住的.我现在这个程序, 主动使用try-catch的地方不多. 如果在每个try-catch住的地方下断点倒是可以.但是为了普遍性, 还是要找出一种不依赖断点无脑排错的调试方法.原创 2023-12-28 17:28:31 · 549 阅读 · 0 评论 -
openpnp - src - 配置文件载入过程的初步分析
从openpnp - dev - 2022_0801那天最后的代码, 编译除了一份可执行程序给自己用.用官方打包的发布版 dev - 2022_0801运行, 居然读取我自己版本的配置文件失败.将自己打包的那份dev-2022_0801, 再将版本退一个版本, 也会读取配置文件失败. 估计官方打包没用dev-2022_0801那天的最后版本.原创 2023-10-29 00:08:23 · 533 阅读 · 0 评论 -
openpnp - SlotSchultzFeeder source code bugfix
我的openpnp设备接入的飞达是西门子二手飞达, 用openpnp提供的SlotSchultzFeeder.发现原版openpnp有个问题(bug):接入多个西门子飞达时, 因为要调整飞达参数(或仅仅就想确认一下参数), 切换到不同飞达时, 大概率会弹框报错.报错的项目有多种(最多4种: 飞达ID取不到, 飞达送料数取不到, 步长取不到, 飞达状态取不到).如果不使用openpnp, 而使用串口助手, 怎么发指令给mage2560控制底板, 飞达都可以正常控制, 回包都正常.原创 2023-10-27 00:08:16 · 712 阅读 · 0 评论 -
debug - 用Procmon记录目标程序启动后的操作
想看看 D:\Cadence\SPB_17.4\tools\bin\Capture.exe 开始页中的recent projects 从哪里读的.想用Procmon记录Capture.exe启动后的动作, 再记录成文本日志, 从里面找找. 没找到啥有用东西, 量太大了.但是使用Procmon记录一个程序启动后的操作是可以的, 对Procmon的使用(启动一个程序, 并记录程序动作, 保存日志)做个笔记.原创 2022-11-30 13:55:01 · 1304 阅读 · 0 评论 -
STC - STC15官方库函数 - 串口操作修改
STC15官方库为 STC15-SOFTWARE-LIB-V1.0.rar, 解开后的文件夹为 STC15系列库函数与例程测试版V2.0.板子做好了, 在用STC官方库函数写一个出厂测试程序. 写好之后, 只要烧录一个出厂测试程序, 就可以通过半自动测试, 很快能知道焊好的板子元件功能是否正常. 如果不正常, 是哪个元件的操作不正常. 这个时间划算.刚开个头, 第一步是将下位机的信息上报到PC机的串口助手.但是发现官方库函数的实现有点问题. 将全局buffer sprintf之后, 用串口发送到上位机,原创 2022-10-30 22:46:43 · 1913 阅读 · 0 评论 -
1602A如果不点背光,啥也看不见
买的1602A到货了, 用STC15实验箱4的官方自带的demo工程试了一下, 居然没反应.看了一下, 好像点亮背光这里有点怪, 只给了1602的15脚A一个高, 但是却没操作1602的16脚K.尝试给1602的16脚低电平, 搞定.就是说, 官方demo没问题, 可能是原版的官方板子用的1602模块的K和GND已经在模块内部连上了. 所以不需要操作K脚.而我买的1602A是有K脚的, 所以要显势操作K脚.官方1602引脚插座图:可以看到16脚是不使用的.原创 2022-10-24 22:38:53 · 525 阅读 · 0 评论 -
bindiff can‘t compare IDA string table
在查其他资料时, 突然看到bindiff有新版了, 顺手下载了一个装上试试.bindiff功能:用来无源码比较1个可执行程序工程的不同版本之间的实现区别. e.g. 程序A的1.0.0版和1.0.20之间的实现区别. 如果改动比较小, 很容易用bindiff看出具体区别出来. 如果变化比较大, 也能定位到底哪些函数实现变化了.以前用bindiff_V4.20时, 写了一个笔记(). 那时是2017年.现在的bindiff是V7.0(2021年发布的), 比较速度比以前版本快多了.原创 2022-08-21 17:09:29 · 467 阅读 · 0 评论 -
IDM 6.40.11.2 弹窗的解决思路
IDM 6.4.11.2 弹窗的解决思路前言在IDM官方下载了IDM的30天试用版。装好后,找了一个和谐工具。运行和谐工具后,看IDM关于那里,已经是全功能版本。美中不足的是,IDM运行一段时间,就会弹出neg窗口,说文件被修改,最好是去官网下载原版的提示。我这的弹框如下:文本提示信息如下:---------------------------IDM is corrupt---------------------------The main IDM executive file is原创 2022-05-06 18:31:54 · 32097 阅读 · 0 评论 -
IDA7.7.220118 - The graph is too big
IDA7.7.220118 - The graph is too big前言在无源码调试程序,想用graph模式看看被调试函数的整体流程。有报错框弹出。找到了这个设置,改为999999按确定后,回IDA主UI.再次尝试用图形模式查看反汇编代码。这回没提示了,可以用图形模式查看。不过图形模式菜单条执行时,卡了几秒,估计这个函数是有点大。作者在消息处理时,将所有消息处理都写到一个总的消息处理函数中了.他这么写,自己不头疼啊?END...原创 2022-05-05 12:48:21 · 1504 阅读 · 0 评论 -
Footprint Expert PRO 22 - 修改封装的管脚编号
Footprint Expert PRO 22 - 修改封装的管脚编号前言和csdn上的一个同学讨论使用Footprint Expert PRO 22修改管脚号码的问题,他遇到了管脚号码修改不了的问题。但是我并没有遇到这个问题,因为我只是初步做了实验。尝试解决一下这个问题。csdn同学的问题描述weixin_42133591@csdn - question我想把2脚和3脚编号调换一下,但是提示这个Use 'Pin Reorder' to generate numeric pin name原创 2022-04-26 11:39:44 · 1807 阅读 · 0 评论 -
使用STM32F4标准外设库实现网线热插拔- 移植官方思路到自己实际固件工程
从同事工程上改了一个版本出来, 发现如果不插入网线, 不能正常跑. 卡在网卡初始化那里了.如果不能实现网线热插拔, 我改出的版本不能实际用在客户现场的. 如果不插入网线, 就不能正常用, 这谁受的了啊.前面做了一个预研使用STM32F4标准外设库实现网线热插拔- 分析STM3240G-EVAL官方工程, 知道ST官方怎么玩网线热插拔了.今天, 用ST官方工程的思路, 将网线热插拔实现移植到自己工程中, 基本可以用.但是有一些小问题(还能接受, 也能跟同事和客户解释的通), 先这样.原创 2022-02-01 00:59:24 · 2829 阅读 · 0 评论 -
使用STM32F4标准外设库实现网线热插拔- 分析STM3240G-EVAL官方工程
前言从同事的工程(STM32F4 StdPeriph_Lib)上改出一个新工程. 将其他bug改完, 发现网线必须一直插着, 否则就会卡在网卡初始化那里.看他改的其他工程, 看到他也实现了网线热插拔的一个版本. 但是他的版本很不稳定, 不能正常跑. 自然也就不会在他工程中, 将网线热插拔扒出来用.官方资料重新下载了ST官方F4标准外设库和F4 LWIP的2个工程, 看到了官方已经给了网线热插拔的demo工程.那从官方版本上, 将网线热插拔功能扒出来用.STSW-STM32065 STM32F4原创 2022-01-30 14:42:44 · 2717 阅读 · 0 评论 -
解决一次HardFault的bug
笔记正在写固件工程, 程序框架差不多了, 在和设备通讯.设备上改一个参数, 固件工程中看这个参数是否要保存, 如果是不同的值, 就写入文件.发现只要一调用这个写参数的函数, 再运行几秒, 固件工程就会进HardFault_Handler.如果不调用这个函数, 就正常.开始检查这个函数, 能保证100%的正确.而且从这个函数出来, 单步几下, 也不会HardFault.最后想了一个笨招.这个HardFault在调用写参数文件的函数后, 不是必现么?好.在和这个设备通讯的所有函数(大概50+原创 2022-01-15 22:54:31 · 334 阅读 · 0 评论 -
变量命名不规范引起的bug
笔记在同事的固件工程上, 改一个版本出来, 进行中.按照以前同事的是思路, 添加了一个新的设备处理的回调.添加完, 美滋滋的试试, 突然发现UDP线程和socket命令处理现场根本就没 进入.但是可以ping通这个设备, 而且MDK固件工程还在跑.在等锁? 内存分配失败?还好, 我知道我在加这个设备处理实现前,是好使的, 用我自己做的上位机程序, 是可以和设备通讯的.所以如果自己改了程序, 要尽早测试, 如果发现和自己改的代码不相关的问题, 也要查清除, 先回到自己改之前, 看看是不是自己改代原创 2022-01-07 18:06:06 · 744 阅读 · 0 评论 -
vs2017 : 非标准语法;请使用 “&“ 来创建指向成员的指针
笔记2019年, 用vs2010写了一个上位机程序. 用起来好使, 但是处理逻辑挫, 导致处理业务很慢.现在用在新产品里面, 想重构一下. 这时, 我本本上只装了vs2017.用vs2017编译时, 出现以下报错. 报错的代码在类函数指针赋值的地方.void CMyThread::RegisterThreadProc(CMyThread::TAG_REGISTERTHREADPROC* pParam) { if ((NULL != pParam) && (NULL != pPara原创 2021-12-20 11:46:21 · 2468 阅读 · 0 评论 -
迪文串口屏(DMG10600C101-03WTC)的通讯测试
笔记同事从迪文屏接口, 焊接出一个DB9公头.因为手头不好找DB9母头, 就用232转485 + 485转232 + 232转USB上电脑测试.怎么测试都不通, 也将同事焊接的232 TX/RX对调过. 不行.最后测试时, 直接找了一条双母头的D9连接线, 这样就改成了 DB9公头接口 + 双母头DB9转接线 + 232转USB上电脑. 这回好使.我不确定那条双母头的2,3是否有交叉. 反正通讯不行时, 就将同事焊接出的DB9公头的2,3调一下测试.记录一下用串口助手和串口屏通讯的发包的组包配原创 2021-12-14 16:45:54 · 3787 阅读 · 0 评论 -
windows subst命令实现原理模拟3 - subst挂载目录为盘符
笔记继续研究, 看subst怎么实现的挂载目录为盘符还是在查询subst盘符是否存在的函数中下断点程序参数设定为 z: d:\my_tmp程序跑起来, 看谁调用的查询盘符是否存在.从查询盘符函数出来后, 就是挂载盘符的实现.char __fastcall sub_7FF649D6113C(LPCWSTR lpDeviceName, LPCWSTR lpTargetPath, __int64 a3, MESSAGE *a4){ WCHAR *v4; // r15 MESSAGE *v5;原创 2021-12-06 11:09:33 · 626 阅读 · 0 评论 -
windows subst命令实现原理模拟2 - subst卸载已经挂载的盘符
笔记今天没啥事, 继续研究subst命令的第2个功能,卸载已经挂载的盘符.试验之前,先用subst模拟一个盘符出来.call subst z: %~dp0在cmd中, 如果能进入Z盘, 就可以继续做试验, 看看subst怎么卸载的盘符.C:\Users\me>cd /d z:Z:\>上次试验, 从引入表中,已经怀疑到了DefineDosDeviceW.idata:00007FF649D63130原创 2021-12-06 10:45:01 · 765 阅读 · 0 评论 -
windows subst命令实现原理模拟1 - 打印subst模拟出的盘符的实际路径
笔记现在经常用BAT脚本(使用subst命令),将工程目录模拟成磁盘来用,好处挺多的.今天手头的活验证完后, 突然想起来看看subst命令是咋实现的.知道咋实现之后,以后可以在自己的程序中模拟出一个磁盘来, 很方便啊.今天先研究打印subst模拟盘符对应的实际路径问题.其他2个subst功能(卸载, 加载), 等有时间再弄, 单步了一下, 实现挺简单的.subst的功能列表subst带3个功能, 用subst /? 可以看到subst /?将路径与驱动器号关联。SUBST [drive原创 2021-12-05 21:20:18 · 1048 阅读 · 0 评论 -
在IAR单步调试时,复制字符串变量实时值的方法
笔记在IAR9.10.2中单步调试demo, 正好看到http收包处理。想将收到的包保存下来,离线调试用。因为字符串值都比较长, 在watch窗口拷贝出来的都是前面的一部分。试了试,可以在memory窗口将字符串拷贝出来。试验假设我们单步到了http收包处理这块。打开auto窗口,将变量值(data)拖进去。这时,如果要复制或看data的值,都只能看到前面一部分,原样拷贝是不可能的。先将这个变量值存成文件,可以看到变量地址打开保存的变量文件看一下。保存后的文件中,变量也看不全原创 2021-11-09 13:22:22 · 476 阅读 · 0 评论 -
caculate SDC Protokoll checksum
前言现场一台EATON空调总是没回包,怀疑是发包发错了。厂家支持也不给力,看协议文档,也没看出发包的组包哪里错了。后来同事从以前的设备驱动库中找出一个插件,可以和这台设备通讯。去看了一下这个插件的发包组包,才明白错在哪里了。错误原因:协议包校验和算法看错了。即使校验和算对了,摆的顺序也是小端布局。其实协议上已经写清楚了。所以说,和第三方设备通讯,厂家支持要给力。要不谁知道哪里错了。各种可能的错误组合太多了。笔记发包的协议初看起来挺简单的。一共5个字节的发包,头3个字节是数据,后2原创 2021-09-18 02:30:42 · 251 阅读 · 0 评论 -
解决了一次模块间TTL串口不能通讯的问题
前言公司的产品嵌入式主机要更换短信模块,临时搞一台。老模块原来直接做在板子上,这次生产后,同事将老模块吹下来了。新短信模块是个小模块产品,同事将壳子拆掉,将产品板子塞进主机箱。新短信模块原来是RS232通讯,过的SP3232, 走的DB9串口。同事将SP3232拆掉,将短信模块从模组出来的TTL的串口收发和主机箱中MCU的TTL收发连在一起。用2根排线连接的。2个板子之间的收发为 A-TX => B-RX, A-RX => B-TX.2个板子通过供电(220V=>12V开关原创 2021-09-07 16:43:43 · 4132 阅读 · 0 评论 -
IS62WV51216 HAL库FMSC初始化参数验证和调整
在验证板子上的2块IS62WV51216,用CubeMX生成的默认初始化代码,操作IS62WV51216时序的时钟数填的太大,同样的测试函数,执行速度好慢(10秒)。对照数据手册和试验调整小了一些,同样的测试函数执行时间小多了(2秒)。IS62WV51216可以按照字节(byte)操作(1M 字节),也可以按照半字(WORD)操作(512K WORD).原创 2021-09-01 17:17:27 · 2329 阅读 · 0 评论 -
BSP_PlatformIsDetected
前言在做 CubeMX的SD卡(SDIO)的试验。用CubeMX生成框架工程时,需要指定SD卡检测引脚。如果不指定,CubeMX生成时有警告。就随便找了一个不用的管脚(PA11),指定为GPIO::input.fatfs_platform.h/** ****************************************************************************** * @file : fatfs_platform.h *原创 2021-08-27 14:14:04 · 510 阅读 · 0 评论 -
test STM32F407 ETH RMII
前言在验证打样的板子最后一项主要内容,RMII方式连接的ETH接口。开始网口测试不通,特意封闭了一天,查了一下。还好,硬件没有问题。是软件编程的问题。试验出问题时,手头有开发板好处就来了。找局部电路相同或类似的开发板,用商家提供的例程测试一下。找下区别。如果真的是硬件电路或外部元件有区别,也能比对出来。不过,还是要画板子时,原理图和板图别弄错了,买料时,选型别选错了。焊接时元件值别弄错了。要不,再从软件上找问题,也是白搭。板子上用的F407IG,176脚的IC.网卡芯片用的 LAN8原创 2021-08-25 23:56:49 · 2524 阅读 · 0 评论