1.源代码审计工具之:SonarQube
2.软件的软件软件分析技术有哪两种
3.Obfuscator-llvm源码分析
4.Vert.x 源码解析(4.x)——Future源码解析
5.免杀动态对抗之syscall[源码分析]
6.QT原理与源码分析之QT字符串高效拼接原理
源代码审计工具之:SonarQube
SonarQube是一个开源的代码分析平台,用于持续分析和评估项目源代码的源码源码质量。它能检测出项目中的分析分析方法重复代码、潜在bug、软件软件代码规范和安全性漏洞等问题,源码源码并通过web UI展示结果。分析分析方法起凡源码
1. Sonar简介
1.1 SonarQube是软件软件什么?
1. 代码质量和安全扫描和分析平台。
2. 多维度分析代码:代码量、源码源码安全隐患、分析分析方法编写规范隐患、软件软件重复度、源码源码复杂度、分析分析方法代码增量、软件软件测试覆盖率等。源码源码
3. 支持+编程语言的分析分析方法代码扫描和分析,包括Java、Python、C#、JavaScript、Go、C++等。
4. 涵盖了编程语言的静态扫描规则:代码编写规范和安全规范。
5. 能够与代码编辑器、CI/CD平台完美集成。
6. 能够与SCM集成,可以直接在平台上看到代码问题是由哪位开发人员提交。
7. 帮助程序猿写出更干净、更安全的代码。
静态扫描主要针对开发人员编写的源代码。
通过定义好的代码质量和安全规则,对开发人员编写的代码进行扫描和分析。
将分析的结果多维护的呈现出来,以方便开发人员进行代码的优化和规范编写。
1.2 SonarQube的各个功能:
1.2.1 代码可靠性
1. BUG检测
2. 设置需要的代码标准
3. 代码异味
4. 代码安全性
5. 对于开发的各个路径进行检测
1.2.2 软件安全性
1. Security Hotspots: 代码存在安全问题的部分
2. Vulnerabilities: 代码是否存在漏洞
1.3 SonarQube如何工作?
Sonar静态代码扫描由两部分组成:SonarQube平台和sonar-scanner扫描器。
SonarQube: web界面管理平台。
1)展示所有的项目代码的质量数据。
2)配置质量规则、管理项目、配置通知、配置SCM等。
SonarScanner: 代码扫描工具。
专门用来扫描和分析项目代码。支持+语言。
代码扫描和分析完成之后,会将扫描结果存储到数据库当中,在SonarQube平台可以看到扫描数据。
SonarQube和sonarScanner之间的关系:
2 检测
Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括Java、C#、C/C++、流控搭建源码PL/SQL、Cobol、JavaScript、Groovy等等二十几种编程语言的代码质量管理与检测。
2.1 Rules提示
2.1.1 Rule界面
2.1.2 Rule正确实例提示
2.2 糟糕的复杂度分布
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
2.3 重复
显然程序中包含大量复制粘贴的代码是质量低下的,Sonar可以展示源码中重复严重的地方。
2.4 缺乏单元测试
Sonar可以很方便地统计并展示单元测试覆盖率。
2.5 没有代码标准
Sonar可以通过PMD、CheckStyle、Findbugs等等代码规则检测工具规范代码编写。
2.6 没有足够的或者过多的注释
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降,而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
2.7 潜在的bug
Sonar可以通过PMD、CheckStyle、Findbugs等等代码规则检测工具检测出潜在的bug。
2.8 糟糕的设计(原文Spaghetti Design,意大利面式设计)
通过Sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则;通过Sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况,检测耦合。
3. Sonar组成
4. Sonar集成过程
开发人员在他们的IDE中使用SonarLint运行分析本地代码。
开发人员将他们的代码提交到代码管理平台中(SVN、GIT等),
持续集成工具自动触发构建,调用SonarScanner对项目代码进行扫描分析,
分析报告发送到SonarQube Server中进行加工,
SonarQube Server加工并且保存分析报告到SonarQube Database中,通过UI显示分析报告。
软件的分析技术有哪两种
软件的分析技术主要分为静态分析和动态分析两种。
静态分析技术是通过对软件的源代码或编译后的二进制文件进行检查,而不执行软件本身。这种技术有助于在软件开发生命周期的早期阶段发现潜在的漏洞、编码错误和其他安全问题。例如,在软件开发过程中,静态分析工具可以使用抽象语法树解析、数据流分析和模式匹配等方法来识别源代码中的潜在问题。此外,静态分析还可以包括对软件组件的依赖关系进行分析,如通过类包管理器技术识别项目依赖的采集线报源码开源组件及其版本信息,从而帮助开发团队更好地管理和更新这些组件。
动态分析技术则是在软件执行过程中观察其行为,以检测运行时错误、性能瓶颈、内存泄漏和恶意活动等。这种技术通常涉及使用调试器、性能分析工具和其他动态监测工具来收集软件运行时的数据。例如,在软件测试阶段,动态分析可以通过创建沙箱环境来安全运行软件并监视其行为,从而帮助检测潜在的恶意软件。此外,模糊测试也是一种常用的动态分析技术,它通过向软件提供无效、意外或随机输入来识别漏洞和崩溃点,以评估软件的稳健性和安全性。
总的来说,静态分析和动态分析在软件检测领域具有广泛的应用。它们各自具有独特的优势:静态分析能够在不运行软件的情况下发现潜在问题,而动态分析则能够揭示软件在实际运行环境中的行为。结合使用这两种技术可以更全面地评估软件的质量和安全性,从而提高软件的可靠性和用户体验。在具体实践中,开发团队可以根据项目的需求和资源情况选择适合的分析技术来确保软件的质量和安全。
Obfuscator-llvm源码分析
在逆向分析中,Obfuscator-llvm是一个备受关注的工具,它通过混淆前端语言生成的中间代码来增强SO文件的安全性。本文主要讲解了Obfuscator-llvm的三个核心pass——BogusControlFlow、Flattening和Instruction Substitution,它们在O-llvm-3.6.1版本中的实现。
BogusControlFlow通过添加虚假控制流和垃圾指令来混淆函数,其runOnFunction函数会检查特定参数,如混淆次数和基本块混淆概率。在测试代码中,它会将基本块一分为二,插入随机指令,形成条件跳转,如“1.0 == 1.0”条件下的真跳转和假跳转。
Flattening通过添加switch-case语句使函数结构扁平化,runOnFunction会检查启动标志。在示例代码中,它将基本块分隔,创建switch结构,并根据随机值跳转到不同case,使函数执行流程变得复杂。
Instruction Substitution负责替换特定指令,runOnFunction会检测启动命令,遍历所有指令并随机应用替换策略,如Add指令的多种可能替换方式。
虽然O-llvm提供了一定程度的混淆,但仍有改进空间,比如增加更多的产品溯源码公司替换规则和更复杂的跳转策略。作者建议,利用O-llvm的开源特性,开发者可以根据需求自定义混淆方法,提高混淆的复杂性和逆向难度。
最后,对于对Obfuscator-llvm感兴趣的读者,可以参考《ollvm的混淆反混淆和定制修改》的文章进一步学习。网易云安全提供的应用加固服务提供了试用机会,对于保护软件安全具有实际价值。
更多关于软件安全和源码分析的内容,欢迎访问网易云社区。
Vert.x 源码解析(4.x)——Future源码解析
在现代软件开发中,异步编程的重要性日益凸显,提升并发性能并处理大量并行操作。Vert.x,作为一款基于事件驱动和非阻塞设计的异步框架,提供了丰富的工具简化异步编程。本文将深入解析Vert.x 4.x版本的Future源码,理解其关键类和功能。1. 异步核心
Vert.x的核心在于FutureImpl和PromiseImpl,它们是实现异步操作的关键。AsyncResult是通用接口,用于表示异步操作的结果,包含成功值或失败异常。2. Future类详解
Future扩展了AsyncResult,提供了组合操作如join、any、all和map等功能。内部的FutureInternal主要负责添加监听器,FutureBase负责执行监听器和转换函数。 具体来说,FutureImpl的onComplete方法接收一个handler,任务完成后执行,而tryComplete则在异步操作有结果时触发,最终调用用户指定的handler。 相比之下,Promise允许用户手动设置异步结果,PromiseImpl继承自FutureImpl,并增加了context获取功能。3. 实例与源码分析
通过简单的入门实例,如独立使用Future,我们可以看到Vert.x如何通过创建PromiseImpl获取Future。源码分析显示,Promise.future获取Future,OnComplete用于添加监听,而complete方法则用于设置值并通知监听器。4. 深入源码
在源码层面,addListener和emitSuccess方法在OnComplete中扮演重要角色。而complete方法,特别是tryComplete,是设置值并触发监听的关键。5. 总结
总的抓客系统源码来说,理解Vert.x中的Future,就是创建PromiseImpl获取Future,通过OnComplete添加监听器,然后通过Promise的complete方法设置值并通知监听器。后续还将深入探讨其他Future实现类,如all、any和map的原理。免杀动态对抗之syscall[源码分析]
基础概念
操作系统分为内核和应用层,从R0-R3,R0是内核,R3是用户层。Windows中日常调用的API都是R3抽象出来的接口,虽然Win API它也是R3接口,但由于Windows的设计思想就是高度封装,实际上的R3 API是ntdll.dll中的函数。
我们调用的Win API都是kernel.dll/user.dll中的函数,最终都要经过ntdll.dll。
逆向学习一个函数,选定CreateThread,ntdll中的对应函数是NtCreateThread。可以看到首先给eax赋值(系统调用号SSN),然后再执行syscall。
EDR的工作原理是对Windows API进行hook。一般使用inline hook,即将函数的开头地址值改成jmp xxxxxxx(hook函数地址)。知道了syscall的调用模板,自己构造syscall(获取SSN,syscall),即可绕过EDR对API的hook。
学习不同项目对应的手法,如HellsGate、TartarusGate、GetSSN、SysWhispers等。这些项目通过遍历解析ntdll.dll模块的导出表,定位函数地址,获取系统调用号SSN,实现动态获取SSN。
使用直接系统调用或间接系统调用,如SysWhispers系列项目的直接系统调用(手搓syscall asm)和间接系统调用(使用用户态API,如kernel.dll中的API)。系统调用号SSN在不同版本的系统下是不一样的,可以参考相关技术博客整理的列表。
SysWhispers2使用随机系统调用跳转(Random Syscall Jumps)避免“系统调用的标记”,通过SW__GetRandomSyscallAddress函数在ntdll.dll中搜索并选择一个干净的系统调用指令来使用。
SysWhispers3引入了egg技术(动态字符替换,汇编指令层次的混淆)和支持直接跳转到syscalls,是spoof call的变体,绕过对用户态asm文件syscall的监控。
HWSyscalls项目通过kernel gadget,跳到ntdll.dll中做间接syscall,更彻底地实现了间接系统调用。
这些项目的实现涉及软件中自定义堆栈流程、硬件断点等技术,通过内核函数调用、动态字符替换、异常处理机制等,绕过EDR检测和系统调用监控,实现免杀动态对抗。
QT原理与源码分析之QT字符串高效拼接原理
本文探讨了Qt框架中字符串高效拼接的实现原理及源码分析。首先,我们了解到了QStringBuilder这一模板在实现高效字符串拼接中的应用。QStringBuilder内部仅保存了构建时传入的字符串引用,模板参数还可以嵌套另一个QStringBuilder。获取拼接结果时,执行操作符转换,计算总长度一次性分配内存,构造出符合长度要求的QString,最后将各个部分复制到该字符串中。这一过程只需分配一次内存,不生成任何临时字符串,显著提升性能。
为了实现字符串高效拼接,自定义类模板可重载运算符%,但需至少有一个参数为类类型或枚举类型。这限制了直接连接原始字符串的运算符%的实现。关注连接操作的类型有助于定义连接后字符串的大小,但默认通用版本无法确定数据类型,因此需要针对具体类型的特化版本来确定这些关注点。
ButianyunStringBuilder是模板特化版本的一个实例,它允许模板参数比通用版本更多。通过ButianyunConvertHelper模板,可以在连接时动态决定新类型,而非硬编码。这个设计使得连接关注点与类型关注点分离,简化了代码,体现了关注点分离的思想。
对于原始字符数组,可使用字符串连接函数实现高效拼接。运算符%提供简化API接口,简化字符串连接操作。
理解模板编程技术是掌握Qt框架源代码的关键。C++模板技术在编译时进行取舍,优化运行时性能。Qt框架常采用这种技术以提升性能,但可能牺牲代码可读性。熟练掌握模板编程有助于深入理解Qt源代码。
在探索Qt源代码的过程中,学习大型框架的源代码能提供宝贵的编程思想。深入学习Qt原理和源码分析有助于全面掌握Qt框架。对于那些想快速全面了解Qt软件界面开发技术、学习C/C++/Qt软件开发技术的读者,推荐相关课程和文章。
找到卡顿来源,BlockCanary源码精简分析
通过屏幕渲染机制我们了解到,Android的屏幕渲染是通过vsync实现的。软件层将数据计算好后,放入缓冲区,硬件层从缓冲区读取数据绘制到屏幕上,渲染周期是ms,这让我们看到不断变化的画面。如果计算时间超过ms,就会出现卡顿现象,这通常发生在软件层,而不是硬件层。卡顿发生的原因在于软件层的计算时间需要小于ms,而计算的执行地点则在Handler中,具体来说是在UI的Handler中。Android进程间的交互通过Binder实现,线程间通信通过Handler。
软件层在收到硬件层的vsync信号后,会在Java层向UI的Handler中投递一个消息,进行view数据的计算。这涉及到测量、布局和绘制,通常在`ViewRootImpl`的`performTraversals()`函数中实现。因此,view数据计算在UI的Handler中执行,如果有其他操作在此执行且耗时过长,则可能导致卡顿,我们需要找到并优化这些操作。
要找到卡顿的原因,可以通过在消息处理前后记录时间,计算时间差,将这个差值与预设的卡顿阈值比较。如果大于阈值,表示发生了卡顿,此时可以dump主线程堆栈并显示给开发者。实现这一功能的关键在于在Looper中设置日志打印类。通过`Looper.loop()`函数中的日志打印,我们可以插入自定义的Printer,并在消息执行前后计算时间差。另一种方法是在日志中添加前缀和后缀,根据这些标志判断时间点。
BlockCanary是一个用于检测Android应用卡顿的工具,通过源码分析,我们可以了解到它的实现逻辑。要使用BlockCanary,首先需要定义一个继承`BlockCanaryContext`的类,并重写其中的关键方法。在应用的`onCreate()`方法中调用BlockCanary的安装方法即可。当卡顿发生时,BlockCanary会通知开发者,并在日志中显示卡顿信息。
BlockCanary的核心逻辑包括安装、事件监控、堆栈和CPU信息的采集等。在事件发生时,会创建LooperMonitor,同时启动堆栈采样和CPU采样。当消息将要执行时,开始记录开始时间,执行完毕后停止记录,并计算执行时间。如果时间差超过预设阈值,表示发生了卡顿,并通过回调传递卡顿信息给开发者。
堆栈和CPU信息的获取通过`AbstractSampler`类实现,它通过`post`一个`Runnable`来触发采样过程,循环调用`doSample()`函数。StackSampler和CpuSampler分别负责堆栈和CPU信息的采集,核心逻辑包括获取当前线程的堆栈信息和CPU速率,并将其保存。获取堆栈信息时,通过在`StackSampler`类中查找指定时间范围内的堆栈信息;获取CPU信息时,从`CpuSampler`类中解析`/proc/stat`和`/proc/mpid/stat`文件的CPU数据,并保存。
总结而言,BlockCanary通过在消息处理前后记录时间差,检测卡顿情况,并通过堆栈和CPU信息提供详细的卡顿分析,帮助开发者定位和优化性能问题。
关于一款开源远程控制软件(gh0st)的源码分析(一)
gh0st软件专为远程控制设计,支持远程文件传输、视频连接等功能,类似QQ远程桌面。软件由gh0st_Client与gh0st_Server两部分组成。
启动gh0st_server,VS调试,程序运行后,中断所有调试,打开Threads窗口和CallStack窗口。gh0st_server作为服务端,启动时创建个线程,主线程负责资源初始化,创建监听线程ListenThreadProc以监听客户端连接。
主线程完成初始化后,ListenThreadProc进入循环,等待连接请求,通过m_hkillEvent事件与主线程同步。当主线程发出关闭命令,m_hkillEvent设置为可信任状态,工作线程退出循环,进行资源回收,增强程序稳定性。
gh0st_server的核心在于IOCPServer类,它负责网络事件检测、IO请求与数据收发。当有网络事件发生时,关键业务逻辑将处理数据接收与解包等操作,详情将在后续章节介绍。
库博软件源代码静态分析工具(英文简称CoBOT SAST)介绍
库博软件源代码静态分析工具(CoBOT SAST)在软件开发和质量保障中扮演着关键角色。与动态测试和传统手段相比,静态分析能更系统高效地剖析代码结构,通过白盒分析方式,显著减少漏报风险。研究表明,早期发现和修复缺陷成本远低于后期,因此,越来越多的企业采用CoBOT SAST进行源代码检测,确保符合IEC、DO-B/C等工业和安全标准。
CoBOT SAST集成了多种国际先进技术和深度学习,针对多种主流编程语言提供全面的缺陷检测,包括边界条件漏洞、SQL注入等类问题。它与Git、SVN等源代码管理系统无缝对接,并支持缺陷管理与持续集成工具,实现了编码规则检查、安全漏洞检测等功能。此外,工具还支持自定义开发接口,允许用户针对特定行业或内部编码标准进行定制,弥补了市场上的普遍不足。
该工具的优势在于其精确的缺陷检测能力,兼容多种国际和国内标准,无需搭建完整运行环境,能在片段代码中直接分析。国内研发,自主可控,且提供SDK接口和可视化视图,支持国产化环境,服务响应迅速,定制灵活。总体来看,CoBOT SAST作为一款全面且适应性强的源代码静态分析工具,能显著提升软件开发过程中的质量和安全性。
slate.js源码分析(四)- 历史记录机制
应用中常见撤销与重做功能,尤其在编辑器中,其实现看似简单却也非易事。为了更好地理解这一机制,本文将深入探讨 MVC 设计模式,并聚焦于 slate.js 如何巧妙地实现撤销与重做功能。
MVC 模式是一种经典的软件架构模式,自 年提出以来便广为应用。在 MVC 模式中,模型(Model)负责管理数据,视图(View)展示数据,而控制器(Controller)则负责处理用户输入与模型更新。
在撤销与重做功能的设计中,通常有两种实现思路。其中一种是通过 Redux 等状态管理库实现,而 slate.js 则采用了一种更为直接的方法。本文将重点介绍 slate.js 的实现策略。
撤销功能允许用户回溯至之前的页面状态,而重做功能则让用户能够恢复已撤销的操作。在执行操作后,当用户请求撤销时,系统会抛弃当前状态并恢复至前一状态。对于复杂的操作,如表格的复制与粘贴,系统的处理逻辑则更为精细,能够跳过不需要记录在历史记录中的状态,确保撤销操作的精准性。
slate.js 的状态模型主要基于树状的文档结构,通过三种类型的操作指令来管理文档状态:针对节点的修改、光标位置的调整以及文本内容的变更。对节点与文本的修改,可通过特定指令来实现,而光标操作则通常直接修改数据。借助这九种基本操作,富文本内容的任何变化都能被准确地记录与恢复。
在实现撤销功能时,关键在于如何根据操作指令中的信息推导出相应的撤销操作。例如,撤销对节点的修改操作,只需对记录的操作进行逆向操作即可。相比之下,重做功能则相对简单,只需在撤销操作时记录下指令,以便在后续操作中恢复。
操作的记录以数组形式进行,便于后续的撤销与重做操作。通过合理的指令与数据模型设计,复杂的操作最终被拆解为简单且可逆的原子操作,确保了功能的高效与稳定。
总结而言,通过精心设计的指令与数据模型,撤销与重做功能得以实现,使应用在面对用户操作时能够灵活应对,提供无缝的用户体验。此外,本文还附带了一个招聘信息,百度如流团队正面向北京、上海、深圳等地招聘,欢迎有志之士加入。
参考资料包括:Web 应用的撤销重做实现、slatejs。