1.这是无限无限什么
2.Keil MDK使用备忘之---仿真基本功能介绍
3.OLLYDBG详细介绍
4.JavaScript如何实现debugger
5.免杀动态对抗之syscall[源码分析]
6.硬件仿ççä½ç¨
这是什么
远程用的
OllyDbg是一个位汇编级的直观的分析调试器。
它在源代码不可得或者你用编译器遇到问题的硬件源码硬件源码用时候特别有用。
运行需要。断点断点工作在Windows ,无限无限,Me,NT或者,可能XP上(没有测试)。硬件源码硬件源码用
运行于任何奔腾级别的断点断点php疫情源码电脑上,但是无限无限如果想要流畅的调试,你可能需要一个至少MHz的硬件源码硬件源码用处理器。
Ollydbg是断点断点很耗内存的。如果你想要使用某些扩展特性比如追踪,无限无限我推荐或更多内存。硬件源码硬件源码用
支持的断点断点处理器。OllyDbg支持所有x,无限无限奔腾,硬件源码硬件源码用MMX,断点断点3Dnow!,包括Athlon扩展,和SSE指令以及相应数据格式。
但不支持SSE2. 可配置性。大约有个选项控制OllyDbg的行为和外观。
数据格式。
Dump窗口显示所有常规数据格式:
hex,ASCII,UNICODE,和位正/负/进制整数,//位浮点数,地址,反汇编(MASM或IDEAL),或作为注释的
PE部首或者线程数据块。
帮助。
这个文件包含理解和使用OllyDbg所需的重要信息。
如果你有Windows API帮助文件(因为考虑到版权的原因没有附带),你可以把它附加到OllyDbg一起,以便在系统调
用的时候获得立即帮助。
启动。
你可以以命令行,文件菜单,拖放的方式指定可执行文件,重启最后调试过的程序或者把它附加到正在运行的程序上
。OllyDbg支持实时调试。安装是不必要的,你可以从软盘上启动OllyDbg。
线程。
OllyDbg可以调试多线程应用程序。你可以从一个线程切换到另一个,挂起,恢复和中止线程或者改变他们的优先级。
线程窗口显示每一个线程的错误信息(通过调用GetLastError来返回)
分析。
分析器是OllyDbg重要的一部分。它识别过程,简单和级联转换器,表,嵌入代码中的常数和字符串,复杂的结构,
API函数调用,函数参数号,输入段等等。分析可以使二进制代码可读性增强,使调试变得容易以及减少错误中断和崩
溃的源码易学可能性。它不是面向编译器的,可以于任何的PE程序工作得一样好。
对象扫描器。
OllyDbg扫描对象文件或库(都是按OMF和COFF格式的),释放代码段并在被调试的程序中定位它们。
IMPLIB扫描器。
一些DLLS只按照序数输出它们的Symbols,这对于人的眼睛来说是没什么意义的。如果你有相应的输入库,OllyDBg能
把序数翻译回symbolic名称。
全UNICODE支持。
几乎所有对ASCII串可用的操作对于UNICODE串都是可用的,反之亦然。
名称。
OllyDbg显示所有输入和输出的symbols.它按照Borland格式把名称从调试信息中提取出来。对象扫描器允许识别库函
数。你可以增添你自己的名字和注释。如果某些DLL中的函数是通过序数输出的,你可以附加一个输入库到OllyDbg中
,以恢复原始名称。Ollydbg也可识别许多常数的symbolic名称,像窗口消息,错误代码或位段,然后在call中把他们
解码为已知的函数。
已知函数。
OllyDbg能通过名称识别大约个被C和Windows API频繁使用的函数,并能解码他们的参数。你可以添加你自己的描
述,或者分配预先定义的译码。你可以在已知函数上设置logging breakpoint(记录断点)并把参数记录到日志中。
堆栈。使用简单的试探,OllyDbg尝试识别返回地址和堆栈帧。
但注意,他们有可能是上一个call所留下的残余(译者:破解的时候有时反而需要!)。如果程序在已知的函数上暂
停,堆栈窗口解码实参。 搜索。大量的可能性!搜索命令(确切的或近似的),命令号,常数,二进制或者文本串(
不必是连续的),搜索参考地址的所有命令,常数或者地址范围,搜索名称,在整个分配的内存中搜索2进制序列。如
果发现多个地址,你可以在他们中间来回的切换。
资源。
如果Windows API函数参考资源串,OllyDbg可以释放并显示它(译者:wdsam)。对其它类型的neuron 源码只是限制在列出附属
资源,转储和2进制编辑。 断点。OllyDbg支持所有种类的常规断点:简单断点,条件断点,中断并把信心写到日志文
件(例如,函数的参数),写或访问的内存断点,硬件断点(只能ME/NT/)。在hit trace(命中追踪)的极端例
子下,INT3中断可以设置在模块的每个命令下。在有MHz处理器的Windows NT环境中,OllyDbg可以每秒钟处理
个以上的中断。 监视和查看工具。Watch是一个每次程序暂停时候都被计算的表达式。你可以使用寄存器,常数
,地址表达式,布尔和任何复杂的代数操作符。你可以比较ASCII和UNICODE串。Inspector是包含2个索引并能以一个
2维表格的形式表示的watch,它可以解码数组和结构。
执行。
你可以一步步的执行程序,或者进入子过程,或者立刻执行它。你可以运行程序知道返回或者运行到指定的地方,或
者连续执行。当程序运行时,你仍然对其具有完全的控制,而且你还可以查看内存,设置断点,甚至在运行时实时调
整代码。而且,在任何时候你都能暂停和重启被调试的程序。 命中追踪。Hit trace显示到目前为止,那些命令或进
程被执行了,它允许你检测你代码的所有分支。Hit trace在每个指定的命令上下断点,并在命令被执行后(被命中
Hit)移去它。
运行追踪。
Run trace一步一步执行程序,并把执行结果摘要到一个大的缓冲中。这个摘要包括所有的寄存器(除了SSE),旗标
和线程错误,消息和已知函数的解码后的参数。你可以保存原始命令,这样可以使调试自改变程序变的容易。你可以
指定条件以停止追踪。或者按地址范围,表达式或者一个命令。你可以把run trace的结果保存到一个文件中并比较两
个独立的Run。Run trace允许回朔追综,并详细分析大量命令执行的源码宠物经过。
摘要。
摘要计算某条指令在run trace缓冲区中被列出了多少次。用摘要,你可以知道哪部分代码消耗了最多的处理时间。
补丁。
内建的汇编器自动选择最短可能的代码。二进制编辑器同时以ASCII,UNICODE和进制的形式同步显示数据。固有的拷
贝粘贴功能仍然是可用的。自动备份允许撤销改变。你可以直接修改后拷贝到可执行文件中去,OllyDbg甚至还能适当
调整你做的改变。
自解压文件。
当调试自解压文件时,你常常想要跳过自解压然后停在原始程序的入口点。OllDbg完成SFX(自解压)追踪,它尝试这
定位真实的入口。SFX追踪常常对于加了保护的自解压程序是无能为力的。发现入口(或者指定)后,OllyDbg可以更
快速和可靠的跳过解压程序。 插件。通过编写你自己的插件,你可以给OllyDbg添加功能。插件存取所有重要的数据
结构,添加菜单和快捷方式到存在的OllyDbg窗口并使用超过个插件API函数,这些插件API有详细的文档说明。
UDD。
OllyDbg存储所有程序或模块相关信息到单个文件并在模块装载的时候读入。这些信息包括标签,注释,断点,监视,
分析数据,条件等等。 定制。你可以定制字体和颜色方案。
Keil MDK使用备忘之---仿真基本功能介绍
Keil MDK仿真基本功能概览
在使用Keil MDK的过程中,软件仿真功能是必不可少的一部分。它主要涉及软件操作技巧,分为无硬件关联的软件仿真和硬件相关的仿真方式,比如STC的IAP和STM的J-Link。 软件仿真界面提供了丰富的功能:Reset cpu: 用于在程序执行过程中重新开始,返回到main函数的开头。
Run: 全速执行,遇到断点时暂停,不中断程序流程。
Stop: 停止当前运行的程序。
Step和 Step Over: 分别单步执行和单步跳过子函数。
Step Out: 当在子函数内执行时,跳出子函数。
Run to Cursor Line: 运行至光标所在的代码行。
Serial Windows: 串口输出,实时查看程序通信。
Logic Analyzer: 逻辑分析工具,用于监控信号变化,延迟源码可通过新建、命名、设置显示方式等功能获取波形图。
还有变量观察、程序运行时间、反汇编窗口和C语言源码视图。
在Keil 4中,如需进行IO口仿真,如P2口,初始状态为高电平。通过Step或Step Over操作,可以观察到延时函数的处理。 逻辑分析仪是强大的调试工具,通过设置后,可以实时捕捉和分析信号变化。对于STM的学习,以下资源可供参考:STM中断系统详解
USART串口应用教程
揭示STM定时器的深入技巧
ADC光照传感器读取技术
OLLYDBG详细介绍
OllyDbg是一款强大的调试工具,它针对多种处理器和数据格式提供支持,要求至少MHz奔腾处理器和MB内存。其功能包括多选项配置、源码级调试、代码高亮、多线程分析、对象扫描和Implib扫描,支持Unicode,识别超过个C和Windows API函数,连无调试信息的递归调用也能处理。OllyDbg展示了函数名称、参数和调试信息,方便用户理解和使用,无需安装,直接运行即可。 OllyDbg的强大功能还包括智能栈分析,识别返回地址和参数,SEH链跟踪,以及多种搜索功能如精确和模糊搜索。它提供窗口管理,包括断点设置和资源查看,支持硬件断点和Hit/Run跟踪,协助代码执行流程分析。工具支持Unicode,允许添加标签和注释,跟踪栈帧和结构化异常处理,并能搜索二进制代码、数据和命令,非常适合现代程序的调试。 OllyDbg可以追踪字符串、符号或Run记录中的引用,列出指向特定地址的命令。它支持条件断点,执行速度高效,带有Hit和Run跟踪功能,分别用于检测代码执行和记录执行历史。工具能处理多线程,自动恢复线程状态,并允许创建内存快照,对比不同版本。此外,它简化了添加补丁和修改可执行文件的流程,但需注意不适用于位Win系统。 使用OllyDbg的方法包括副作用检测、自解压入口提取,以及一系列的单步和自动执行操作。工具还支持Hit和Run跟踪,以及条件执行。在反汇编面板中,用户可以通过快捷键快速操作,如设置断点、搜索和修改代码等。 注意,保护或反调试技术可能影响OllyDbg的跟踪效果。在调试独立DLL时,用户可以通过加载DLL、设置断点和调用函数来进行操作,如调试MessageBoxW函数。同时,理解插件使用和解码技巧对于充分利用OllyDbg也至关重要。扩展资料
OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。JavaScript如何实现debugger
调试代码在开发过程中至关重要,开发者常用chrome devtools或IDE内置的调试工具进行单步或断点调试。但你是否好奇过debugger的运行机制是怎样的?
debugger的实现依赖于引擎、系统和硬件,计算机操作系统和CPU在设计时就支持了debugger功能,不同语言和平台的debugger实现机制各有不同。要深入了解debugger,首先要知道代码在计算机上是如何运行的。
对于早期熟练使用命令行的开发者来说,打开应用程序只需键入对应程序可执行文件所在的地址。
在nodejs开发中执行脚本代码文件,则需要在命令行中键入:
应用程序可执行文件可以直接打开执行,而脚本代码需要依托node平台编译执行,这就是代码的两种运行方式:直接执行和解释执行。
CPU提供了一套指令集,基于这套指令集可以控制整个计算机的运行,机器语言的代码就是由这些指令和对应的操作数构成的。这些机器码可以直接在计算机(机器)上运行,也就是直接执行。由它们构成的文件叫做可执行文件。
不同操作系统可执行文件的格式不同,如windows上是pe(Portable Executable)格式,linux系统上是elf(Excutable Linkable FOrmat)格式,macOS系统上则是mash-o格式。不同的格式规定了不同的内容应该放在文件中的什么位置,但其中真正可执行的部分还是由cpu提供的机器指令构成的机器码。
编译型语言会经过编译、汇编、链接的阶段,其中编译是把源代码转换成汇编语言构成的中间代码,汇编是把中间代码变成目标代码,链接会把目标代码组合成可执行文件。这个可执行文件是可以在操作系统上直接执行的。因为该可执行文件由cpu的机器指令构成,所以它可以直接控制cpu。
像javascript、python这类脚本语言就是解释型语言,需要依托解释器来运行。不同于编译型语言依靠生成可执行文件(机器码)在操作系统上直接执行程序,解释型语言有了解释器后不再需要生成机器码就可以在cpu上运行。其原理在于解释器是需要编译成机器码的,cpu知道如何执行解释器,解释器知道如何执行脚本代码(高级语言)。如此一来,脚本语言便依靠cpu的机器码解释执行解释器,再由解释器解释执行上层代码来完成运转。
chrome V8是最熟知的js解析引擎,它主要由Parse、Ignition解释器(Interpreter)、TurboFan编译器(JIT compiler)构成。大部分代码由解释器解释执行,热点代码会经过JIT编译器编译成机器码直接在OS上执行以提高性能。
具体过程为:如果函数只是声明没有被调用,则不会被转换为AST,V8不会去编译它。
如果函数只被调用一次,Ignition会将其编译成字节码直接执行,TurboFan编译器不会进行优化编译。这也容易理解,因为编译器需要Ignition模块收集函数执行时的类型信息,这就需要函数至少被执行1次以上,编译器才能够进行优化编译。
如果函数被多次调用,那么会被操作系统标记为热点函数,这个时候如果Ignition解释器收集到的信息能够证明可以做优化的话,TurboFan就会将字节码转换成为优化后的机器码交给cpu执行,以提高代码的执行性能,这部分机器码就叫做Optimized Machine Code。
但是经过TurboFan转换后的机器码也有可能被还原为字节码,比如如果函数在后续执行的过程中类型发生了变化(如fn函数原来执行的是number类型,后来执行被改变成了string类型),那么之前优化后的机器码就不能再正确执行,则会逆向还原为字节码,如上图红色箭头所示。在js中不应随意更改一个变量的类型。
V8引擎处理js代码的主要流程就是这样。另外,V8中还有一个重要的模块Orinoco,用来负责垃圾回收(GC),将程序中不需要的内存空间回收释放,以减少内存负载提高性能。
剖析cpu或者操作系统如何实现debugger,涉及到计算机硬件、组成原理以及汇编语言等知识范畴,门槛略高,这里尝试做一些初步的探究。
CPU指令集规定了cpu可以执行什么指令,每种指令需要提供什么样的操作数,不同类型的cpu会有不同的指令集。指令集会按照执行顺序不间断执行,但是程序在运行过程中不免要处理一些外部消息比如网络请求、异常、io读写操作等,所以cpu设计了中断机制,cpu每执行完一条指令就会去看下中断标记,是否需要触发中断机制。
INT指令是cpu中用来引发中断过程的指令,中断指令有对应的编号,不同的编号对应不同的处理程序,记录编号和中断处理程序的表叫做中断向量表。其中INT 3(即3号中断)用来触发debugger。
调试器将INT 3当做软件中断指令来用,当在可执行文件中的某一位置加断点的时候,调试器会把断点处指令编码的第一个字节替换成INT 3指令的编码。当程序执行到INT 3,会向调试器申请系统调用权,此时调试器获得cpu控制权,同时也可以获取相应的环境数据来做调试。
在需要恢复断点的时候再将被替换掉的指令编码替换回去即可完成。综上,可执行文件的debugger最终依靠的是cpu的中断机制来实现。
编译型语言因为最终将会转换为机器码在操作系统上执行,所以要利用cpu和OS的中断机制和系统调用来实现debugger。但是解释型语言有自己的解释器(自己实现代码的解释执行),实现debugger也相对简单一些,不需要cpu的3号中断。
解释型语言通过插入一段代码来实现断点,支持环境数据的查看和代码的执行,当释放断点时解释器能够继续往下执行。
像js等脚本语言可以通过debugger语句实现断点,但是断住之后如何获取环境数据则需要debugger客户端来实现,常用的debugger客户端有chrome devtools、vscode debugger等等。
在chrome devtools中,V8引擎会把设置断点、连接请求、获取环境信息以及执行脚本的能力通过socket暴露出来以提供调试协议,要实现debugger,就要遵循并对接引擎的底层协议。
这份协议中列出了实现debug相关的socket信息以及各请求/响应体的参数类型,非常详尽,我们可以根据所需查看一部分协议内容:
设置断点请求:
清除断点请求:
继续执行代码:
chrome和nodejs底层都使用了V8引擎,因此除了在chrome devtools上调试js代码之外,也可以直接使用node cli调试。
有多种方式可以连接到nodejs inspector服务器(nodejs调试器),一种是通过node cli,使用 inspect 指令引擎会临时搭建一个websocket服务器用来监听debugging客户端,其调试原理就是遵循了v8的debug protocol。
另一种方式可以使用chrome提供的专门用来调试nodejs的devtools,前提是需要在devtools中配置好nodejs服务器对应的地址(host)和端口号(port)。
此外,对于上一节中提到的v8引擎中的Ignition解释器和TurboFan编译器分别对js代码执行了不同的处理(分别转换为字节码和机器码),也可以通过nodejs指令运行查看。
免杀动态对抗之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检测和系统调用监控,实现免杀动态对抗。
硬件仿ççä½ç¨
仿ççç®çå°±æ¯å¯ä»¥è¿è¡è°è¯ãè·è¸ªãçè§ççï¼éç¨çæ¹æ³æåæ¥ãæç¹ãå ¨éã触åççãå¨éæçµè·¯è®¾è®¡ä¸ï¼ç¡¬ä»¶ä»¿çæ¯ç¨å¦ä¸å硬件ï¼é常æ¯ä¸ç¨ä»¿çç³»ç»ï¼æ¨¡ä»¿ä¸ä¸ªæå¤ä¸ªç¡¬ä»¶ï¼é常æ¯è®¾è®¡ä¸çç³»ç»ï¼çè¡ä¸ºçè¿ç¨ã仿ç模åé常åºäºç¡¬ä»¶æè¿°è¯è¨ï¼å¦Verilogï¼æºä»£ç ï¼ç¼è¯æ仿çç³»ç»ä½¿ç¨çæ ¼å¼ã
ç®æ é常æ¯å¯¹æ£å¨è®¾è®¡çç³»ç»è¿è¡è°è¯ååè½éªè¯ãé常ï¼ä»¿çå¨çé度足å¤å¿«ï¼å¯ä»¥æå ¥å°å·¥ä½ç®æ ç³»ç»ä¸ä»£æ¿å°æªæ建çè¯çï¼å æ¤å¯ä»¥ä½¿ç¨å®æ¶æ°æ®è°è¯æ´ä¸ªç³»ç»ãè¿æ¯å¨çº¿ä»¿ççä¸ç§ç¹æ®æ åµã
ææ¶ï¼ç¡¬ä»¶ä»¿çå¯è½ä¼ä¸ç¡¬ä»¶è®¾å¤æ··æ·ï¼ä¾å¦å¸¦æè¾ å©è½¯ä»¶ä»¿çåè½ç硬件å¤çå¨çæ©å±å¡ï¼ä¾å¦å¸¦æxè¯ççæ§åæ¿ï¼ä»¥å 许xæä½ç³»ç»å¨ä¸åå¤çå¨ç³»åç主æ¿ä¸è¿è¡ã
gdb是什么意思
GDB的意思GDB是GNU Debugger的缩写,它是一个在Unix和类似Unix系统上的开源调试工具。以下是关于GDB的详细解释:
GDB介绍
GDB是GNU项目的一部分,为源代码调试提供了强大的功能。它可以用来调试C、C++以及其他语言的程序。在程序出现错误或崩溃时,开发者可以使用GDB来定位问题,查看程序的状态,包括变量的值、寄存器的状态等。此外,GDB还允许设置断点、单步执行代码等,为开发者提供了一个强大的调试环境。
GDB的功能特点
1. 源代码调试:GDB允许开发者在源代码级别进行调试,这意味着可以跟踪程序的执行流程,查看和修改变量的值,设置断点等。
2. 强大的命令集:GDB拥有一套丰富的命令集,包括设置断点、单步执行、继续运行到下一个断点等命令,使得开发者能够精细地控制程序的执行过程。
3. 跨平台支持:GDB支持多种操作系统和硬件平台,使得开发者可以在不同的环境下使用相同的调试工具。
如何使用GDB
使用GDB调试程序通常涉及以下步骤:
1. 使用`gdb`命令启动GDB。
2. 使用`file`命令加载要调试的程序。
3. 设置断点。
4. 使用`run`命令开始调试会话。
5. 使用各种GDB命令来检查程序状态、修改变量值、单步执行等。
总之,GDB是一个强大的源代码调试工具,对于开发和调试复杂程序非常有用。无论是初学者还是资深开发者,掌握GDB的使用都是非常重要的技能。