文档库 最新最全的文档下载
当前位置:文档库 › 在keil uvision(RVMDK)下使用stlink断点调试教程

在keil uvision(RVMDK)下使用stlink断点调试教程

在keil uvision(RVMDK)下使用stlink断点调试教程
在keil uvision(RVMDK)下使用stlink断点调试教程

楼猪本来是用JTAG用来下载和调试stm32的程序的,由于JTAG是D版(你懂的),官方有升级时手贱点了升级,JTAG就变砖了。后来发现用于STM8下载调试用的STLink还可以用来调试stm32,楼猪买的是20多块钱的STLINK,X宝买的,号称可以使用官方固件,于是就有了这篇文章:

首先声明,楼猪用的是win 10 64位,keiluvision是4.74版

1、当然是安装stlink的驱动,楼猪的stlink虽然号称是V2版,但实际上应该不是V2版,因为不能使用JTAG模式来调试,只能使用SW模式

插入硬件后设备管理器会有stlink显示

2、keiluvision中的设置

4.7版本已经不需要将tools.ini覆盖了,设置如下图就可以了,下载器列表有两个st link 的话,选择设置选项较多的一个吧;另外一个据说是D版专用的

3、stlink如何接入JTAG接口说明:stlink接入stm32只要接入三根线就可以了SWCLK SWDAT GND

接线如下图所示:

图中J1的左侧就是有JTAG硬件接口中有缺口的位置

4、如果做完上述步骤还不能进行调试(例如可以下载,但程序不能断点调试,不能跑进main函数等问题),你就要留意stm32的Boot0和Boot1管脚了

在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,

这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:

BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。

BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。

也就是说,如果要调试,要将BOOT1接地,BOOT0上拉,但楼猪自己测试的情况是只要将BOOT0上拉就行,如下图:

如果以上步骤做完还是不行,那可能是楼猪使用的硬件,或者keiluvision的生成设置与你的不一致造成的,请大家再继续钻研了。

AS断点调试

1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程

序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。 3.单步调试 3.1 step over 点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行) 3.2 step into 点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:在自定义方法发f1()处设置断点,执行调试

点击

3.3 Force step into 该按钮在调试的时候能进入任何方法。 3.4 step out 如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。 3.5 Drop frame

点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。 4. 高级调试 4.1 跨断点调试 设置多个断点,开启调试。

想移动到下一个断点,点击如下图: 程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。 4.2 查看断点

Visual Studio调试之断点进阶篇

在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel 系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样初始化IDT,可以去网上搜索一些资料。 总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU 然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是: 1.先看看机器里面是不是安装了一个调试器—记住,这一步很重要,之所以重要以 后的文章里面会介绍。 2.如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。 3.否则操作系统启动调试器,并将调试器附到进程上。 4.这样,我们才能在调试器里面检查程序内部变量的值。 前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的? 或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者C#代码都会对应好几行汇编指令。 因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、https://www.wendangku.net/doc/d28544907.html,还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。 因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式 条件断点 首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。 根据触发次数设置 比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

OD教程文库

OD教程文库.txt曾经拥有的不要忘记;不能得到的更要珍惜;属于自己的不要放弃;已经失去的留作回忆。OllyDbg完全教程 一,什么是 OllyDbg? OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。 Version 1.10 是最终的发布版本。这个工程已经停止,我不再继续支持这个软件了。但不用担心:全新打造的 OllyDbg 2.00 不久就会面世! 运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。 支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE 指令集以及相关的数据格式,但是不支持SSE2指令集。 配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。 数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。 帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。 启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。OllyDbg支持即时调试。OllyDbg根本不需要安装,可直接在软盘中运行! 调试DLLs:您可以利用OllyDbg调试标准动态链接库 (DLLs)。OllyDbg 会自动运行一个可执行程序。这个程序会加载链接库,并允许您调用链接库的输出函数。 源码级调试: OllyDbg 可以识别所有 Borland 和 Microsoft 格式的调试信息。这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。 代码高亮: OllyDbg 的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令)和不同的操作数(常规[general]、 FPU/SSE、段/系统寄存器、在栈或内存中的操作数,常量)。您可以定制个性化高亮方案。 线程: OllyDbg 可以调试多线程程序。因此您可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。并且线程窗口将会显示每个线程的错误(就像调用 GETLASTERROR

experiment 用OD下消息断点, 捕获按钮操作.

experiment 用OD下消息断点, 捕获按钮操作. 实验目的: 想直接拦截按钮操作的消息处理, 分析按钮操作的逻辑. 实验程序: <<使用OllyDbg从零开始Cracking 第一章翻译>> 中附带的一个CrackMe. 使用OD加载目标程序, 当程序运行起来后, 暂停OD 经过实验, 点击菜单会触发主窗体WM_COMMAND消息. 如果直接捕获弹出的注册窗口的WM_COMMAND, 捕获不到. 准备捕获主窗体的WM_COMMAND消息, 找到菜单生成注册窗体的处理. 找到注册窗体的创建函数传入的注册窗口处理过程,从而找到注册窗体的所有消息处理实现逻辑.点击菜单属于 WM_COMMAND, 按照消息名称排序, 好找一些.下完消息断电后, 确认一下是否消息断点已下.F9, 让程序跑起来. 点击注册菜单. 程序被断在WM_COMMAND消息断点处.[cpp] view plaincopy00401128 > $ C8 000000 ENTER 0,0 ; 主窗体消息断点WM_COMMAND 0040112C . 56 PUSH ESI 0040112D . 57 PUSH EDI 0040112E . 53 PUSH EBX

0040112F . 837D 0C 02 CMP DWORD PTR SS:[EBP+C],2 00401133 . 74 5E JE SHORT CRACKME.00401193 00401135 . 817D 0C 040200>CMP DWORD PTR SS:[EBP+C],204 0040113C . 74 65 JE SHORT CRACKME.004011A3 F8往下走,找到创建注册窗体的代码. [cpp] view plaincopy00401209 > 6A 00 PUSH 0 ; /lParam = NULL 0040120B . 68 53124000 PUSH CRACKME.00401253 ; |DlgProc = CRACKME.00401253 00401210 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner 00401213 . 68 15214000 PUSH CRACKME.00402115 ; |pTemplate = "DLG_REGIS" 00401218 . FF35 CA204000 PUSH DWORD PTR DS:[4020CA] ; |hInst = 00400000 0040121E . E8 7D020000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA CRACKME.00401253 是注册窗体的消息处理过程. 转到那看看.[cpp] view plaincopy00401253

eclipse断点调试指导

1.进入debug模式(基础知识列表) 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域功能快捷键 全局单步返回F7 全局单步跳过F6 全局单步跳入F5 全局单步跳入选择Ctrl+F5 全局调试上次启动F11 全局继续F8 全局使用过滤器单步执行Shift+F5 全局添加/去除断点Ctrl+Shift+B 全局显示Ctrl+D 全局运行上次启动Ctrl+F11 全局运行至行Ctrl+R 全局执行Ctrl+U ============================= 1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此

method 4.step Filter 逐步过滤一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重新开始执行debug,一直运行直到遇到breakpoint。 例如:A和B两个断点,debug过程中发现A断点已经无用,去除A 断点,运行resume就会跳过A直接到达B断点。 6.hit count 设置执行次数适合程序中的for循环(设置breakpoint view-右键hit count) 7.inspect 检查运算。执行一个表达式显示执行值 8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂 11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint) 12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...) 断点属性: 1.hit count 执行多少次数后暂挂用于循环 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂 3.suspend thread 多线程时暂挂此线程 4.suspend VM 暂挂虚拟机 13.variables 视图里的变量可以改变变量值,在variables 视图选择变

od破解调试秘籍断点

拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 拦截警告声: bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框: bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板: bp GetClipboardData 获取剪贴板数据 拦截注册表: bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健 功能限制拦截断点: bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口 拦截时间:

OD破解常用方法

[分享] OD破解常用方法[复制链接] 一、概论 壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳两种 顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。当然加密壳的保护能力要强得多! 二、常见脱壳方法 预备知识 1.PUSHAD (压栈)代表程序的入口点, 2.POPAD (出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近 3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。 方法一:单步跟踪法 1.用OD载入,点“不分析代码!” 2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4) 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选) 4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现! 5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP 6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入 7.一般有很大的跳转(大跨段),比如jmp XXXXXX 或者JE XXXXXX 或者有RETN的一般很快就会到程序的OEP。 Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP! 方法二:ESP定律法 ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!) 1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值) 2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车! 3.选中下断的地址,断点--->硬件访--->WORD断点。 4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。

VS环境断点调试技巧_85920453_597709898

VS环境断点调试技巧 设置断点:在如下图中的红色圆点处设置断点,红色圆点表示已经在这行设置断点。 启动调试:按F5或者点击左边红框中的按钮。右边框是开始执行(不调试)Ctrl+F5。 调试工具栏:下面是工具栏中对应的名称和快捷键。 在调试过程中F5是执行到下一个断点。F11是逐语句,在执行到下图中的断点时,按F11会执行到Fibonacci方法里面逐步记录执行过程。F10是逐过程,与逐语句不同的是,在执行到下图中断点时,再执行会执行断点下面的语句,而不是去执行语句中的方法。

局部变量:在调试过程中可以查看局部变量窗口,如下图里面会有变量的当前状态。如果找不到的话在 数组的状态表示如下图: InteliTrace记录每一步的调试状态。

条件中断 开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。 针对上述情况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。 如何设置条件断点: 设置条件断点非常容易。在特定的行上,按F9设置断点。 然后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“条件”。 这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当x==5时,调试才中断。我们可以写出如下的表达式:

现在我再运行这个程序按F5达到条件断点,只有当x等于5时,程序运行才会被中断。对于其它条件下的x值,断点将被跳过。 记录到达断点次数 有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第一次命中断点。可以通过右击断点,然后在弹出菜单上选择“命中次数”菜单命令实现。 这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。 注意:如果多个条件同时用的话,结果取交集。

使用OllyDbg从零开始Cracking 第三十二章-OEP寻踪

第三十二章-OEP寻踪 在上一章中我们提到了OEP(Original EntryPoint)的概念,也就是应用程序原本要执行的第一行代码,OEP %99的情况位于第一个区段中(本章中有一个例子,OEP就不在第一个区段,我是特意举的这个例子,嘿嘿)。 我们知道当到达OEP后,各个区段在内存中的分布跟原始程序很接近,这个时候我们就可以尝试将其转储到(dump)文件中,完成程序的重建工作(PS:脱壳)。 通常脱壳的基本步骤如下: 1:寻找OEP 2:转储(PS:传说中的dump) 3:修复IAT(修复导入表) 4:检查目标程序是否存在AntiDump等阻止程序被转储的保护措施,并尝试修复这些问题。 以上是脱壳的经典步骤,可能具体到不同的壳的话会有细微的差别。本章我们主要介绍定位OEP的方法。 很多时候我们遇到的壳会想方设法的隐藏原程序的OEP,要定位OEP的话就需要我们尝试各种各样的方法了。 首先我们来看看上一章CRACKME UPX,然后再来看其他的壳。 1)搜索JMP或者CALL指令的机器码(即一步直达法,只适用于少数壳,包括UPX,ASPACK壳) 对于一些简单的壳可以用这种方式来定位OEP,但是对于像AsProtect这类强壳(PS:AsProtect在04年算是强壳了,嘿嘿)就不适用了,我们可以直接搜索长跳转JMP(0E9)或者CALL(0E8)这类长转移的机器码,一般情况下(理想情况)壳在解密完原程序各个区段以后,需要一个长JMP或者CALL跳转到原程序代码段中的OEP处开始执行原程序代码。 下面我们将上一章中加了UPX壳的那个CrueHead的CrackMe加载到OD中: 这里我们按CTRL+B组合键搜索一下JMP的机器码E9,看看有没有这样一个JMP跳转到原程序的代码段。

中断的应用中对断点的保护

【016】中断的应用中对断点的保护 [51] 点击数:430 发布日期:2006-8-22 20:37:00 【收藏】【评论】【打印】【编程爱好者论坛】【关闭】 实验参考: 笨笨工作室-实验八、按键控制跑马灯(中断)。(查看) 实验板: FB51A。(查看) 实验目的: <1> 掌握堆栈在中断程序中的作用。 <2> 掌握让程序保护现场的方法。 实验现象: 二极管作左右跑马灯,当按下外部按键 K1 时, 8 个二极管全部闪烁 5 次后从 K1 按下之前的位置继续作跑马灯。 在应用中断时,若主程序在正常运行的过程中响应了中断就要转而去执行中断服务程序。那如何在执行完中断服务程序之后完全恢复原来的主程序呢?这就需要在执行中断服务程序之前将相关的状态保护起来,在中断完成后再将这些状态恢复,从而继续执行主程序。 51单片机中允许我们从内部 RAM 中指定一个空间专门保存这些断点处的状态,这个空间就是堆栈。并且还专门给了我们一个 8 位的堆栈指针,让我们用它来开辟堆栈空间。例如我们给堆栈指针赋值: mov sp, #70h ,就表示我们把内部数据 RAM 的地址为 70H 开始的单元设为堆栈。 MCS-51的片内存储器(RAM)共有256字节,高128字节是特殊功能寄存器,地址范围80H~FFH。这一部分可看作系统资源,不能随便利用。而剩下的低12 8字节区分如下: ──┬────────────┐ 7FHㄧ用户RAM区ㄧ ㄧ(数据缓冲区、堆栈区)ㄧ 30Hㄧ 80 byte ㄧ ──┼────────────┤ 2FHㄧ可位寻址区ㄧ 20Hㄧ 16 byte ㄧ ──┼────────────┤ 1FHㄧ第3组工作寄存器区ㄧ 18Hㄧ 8 byte ㄧ ──┼────────────┤ 17Hㄧ第2组工作寄存器区ㄧ 10Hㄧ 8 byte ㄧ ──┼────────────┤ 0FHㄧ第1组工作寄存器区ㄧ

OD里SHIFT+F4条件断点用法篇

致菜鸟: OD里SHIFT+F4条件断点用法篇 发帖人:pjb 时间: 2005-08-24 20:25 原文链接:https://www.wendangku.net/doc/d28544907.html,/showthread.php?threadid=16494 高手就不必看了~,若有错误的地方请指正! 先说一点ALT+L 看记录~ 在某条语句上按了SHIFT+F4后出现了个对话框, 1)第一行是"条件": 要输入的肯定是你感兴趣的条件啦,比如说下面的俩句 0041150 push eax 0041151 call [TranslateMessage] 你在0041150处下条件记录中断,假如这时候你要是想知道ESI等不等于0,那就可以设置条件ESI==0 或ESI!=0 反正是关于ESI的条件了而不是只能利用这行的EAX. 当然一样可以在0041150处下断追消息,比如说你想知道按了鼠标移动消息,那么就设置MSG==WM_ MOUSEMOVE 或是MSG==0200(移动的数字代码). 有人该问了,消息记录好象应该在下一行有函数的下断才正确吧? 其实不一定非要在传递消息的那行0041151下断的,但在那行下断的好处是可以记录到函数参数,这在下面会讲到~

"条件"这的书写是按照MASM32汇编的形式书写的,比如== != > < 2)"说明"="表达" "解码表达式的值" "说明"就是个注释啦,添不添无所谓了,除非你下的记录中断比较多,这样在记录里能看的明白~ "表达"其实就是我们记录的核心啦,程序在我们第1小条里的"条件"为真的时候,就会记录我们在"表达"里填的内容,比如说ESI==0的时候,我们记录[eax+4]的值 反正是你感兴趣的内容啦,若是想记录消息就添MSG 啦,很多时候我们只添了"条件"而没有添"表达",程序中断后就会显示"未知的函数或标识符!",这就是原因了. 至于下面的"解码表达式的值"你可以随便选了,他不过是把记录后的数据又分析了一下, 比如说我们记录了[eax+4]的值是201 ,那么当你选" 信息代码(WM_XXX)"的时候那么你在记录(ALT+L看记录)里看到的就是被分析成了201 WM_LBUTTONDOWN 当你选"布尔数值",那么记录里数值201后面就会跟个TRUE了,其实就是OD对这个数据按照我们选择的类型又进行了一次分析而已~~ 3)暂停程序=> 永不条件满足时永远 这三个选择就是条件为真记录表达的时候程序暂不暂停程序,那就看你调试的需要了~ 4)记录表达式的值=> 永不条件满足时永远 呵呵,要是选"永不",那么我们设立记录"表达"还有啥意义啊, 若是选"永远",那么条件似乎不就没意义了,因为记录的时候已经不管条件了,只要运行到这就记录表达.不过好象也可以利用的,自己去想想啦..我不说. 一般都是选"条件满足"啦. 5)记录函数参数=> 永不条件满足时永远 这个要是你下在没函数的那行,那么这行就变灰了~~ 记录函数的参数很有意义啊,直接可以看到很多信息,我们比如说在有函数的那行下条件记录."条件"是EAX==0 "表达"是[EAX+ 4],然后在这选择记录函数参数在"条件满足时";当然你若只想记录运行到此处的函数参数,那么就空着" 条件"和"表达"吧,同时3)和4)的选择也要变为"永不"了...也许你在记录了啥也看不到,因为运行到这行可能EAX总不=0 ,那么好换换EAX>0 ,好象看了到一堆,然后还有P MSG=XXXX Hw=XXXX,这就是运行到这里这个函数的参数啦~~ 我们也可以记录CREA TFILEA 函数,那么就知道都打开什么文件了~~

OllyDBG常用API断点非常实用

OllyDbg常用断点 以前收集的资料,不知道作者是谁了。很抱歉! --liuyunagang OD常用断点 常用断点(OD中) 拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 bp IsDialogMessageW 拦截警告声: bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框: bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 作用是得指定输入框输入字符串 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板:

bp GetClipboardData 获取剪贴板数据 拦截注册表: bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健 功能限制拦截断点: bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口 拦截时间: bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数 GetDlgItemInt 得指定输入框整数值 GetDlgItemText 得指定输入框输入字符串 GetDlgItemTextA 得指定输入框输入字符串 拦截文件: bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) GetModuleFileNameA GetFileSize Setfilepointer fileopen FindFirstFileA ReadFile 拦截驱动器: bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径 ★★VB程序专用断点★★

黑马程序员java教程:断点调试模式运行java程序

断点调试模式运行java程序 1断点调试的目的 ●跟踪源代码; ●观察程序运行状态; 2调试程序1 编写求和代码 ●设置断点; ●debug运行; ●进入debug透视图; ●程序会运行到断点处停住; ●当前行还没有运行; ●查看变量值:选中变量→鼠标右键→Watch; ●F5(跳入)、F6(跳过)、F7(跳出); 3调试程序2 使用Arrays.binarySearch()编写折半搜索数组元素代码 ●设置断点; ●测试跳入; ●测试跳过; ●测试跳出; ●添加断点; ●测试进入下一断点; ●测试返回当前方法栈的头部(Drop To Frame); ●清除断点; ●清除表达式; ●注意,停止程序! MyEclipse快捷键 1MyEclipse常用快捷键1 ●Alt + /(内容助理):补全; ●Ctrl + 1(快速定位):出错时定位错误,与点击“红X”效果一样;

●Ctrl + Shift + O:导包; ●Ctrl + Shift + F:格式化代码块; 2MyEclipse常用快捷键2 ●Ctrl + Shift + T:查看源代码; ●Ctrl + 点击源代码:查看源代码; ●F3:查看选中类的源代码; ●Alt + 左键:查看源代码时的“原路返回”; ●Ctrl + Shift + X:把小写修改为大写; ●Ctrl + Shift + Y:把小写修改为小写; ●Ctrl + Alt + 下键:复制当前行; ●Ctrl + /:添加或撤销行注释; ●Ctrl + Shift + /:对选中代码添加段注释; ●Ctrl + Shift + \:撤销当前段注释; ●Alt + 上键:向上移动当前行; ●Alt + 下键:向上移动当前行; ●Ctrl + D:删除当前行; MyEclipse: ●工作空间; ●项目名称; ●包名; ●类名; ●Alt + /、Ctrl + 1、Ctrl + shift + o、Ctrl + shift + f

keil c 的在线调试与断点设置

Keil 的调试命令、在线汇编与断点设置 上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。 一、常用调试命令 在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单 Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。 进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。 接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该 段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难 以确认错误出现在哪些程序行。单步执行是每次执行一行程序,执行完该行 程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完 以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以 找到程序中问题所在。程序调试中,这两种运行方式都要用到。 使用菜单STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序, 使用菜单STEP OVER 或功能键F10 可以以过程单步形式执行命令,所谓 过程单步,是指将汇编语言中的子程序或高级语言中的函数作为一个语句来

OD设置断点函数

常用断点 拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 bp ShellExecuteA获取网站转向地址 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 bp IsDialogMessageW 拦截警告声: bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框: bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板: bp GetClipboardData 获取剪贴板数据 拦截注册表: bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健 功能限制拦截断点: bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口

附录:程序的调试(单步执行与断点法)

附录:程序的调试(单步执行与断点法) 1单步执行 任何一个天才都不敢说,他编的程序是100%正确的。几乎每一个稍微复杂一点的程序都必须经过反复的调试,修改,最终才完成。所以说,程序的调试是编程中的一项重要技术。我们现在就来掌握一下基本的程序调试。我们以下的示范,是以时下比较流行的Borland Pascal 7.0为例子,其他的编程环境可能略有不同,但大致上是一致的。 我们先编一个比较简单的程序,看看程序是如何调试的。program tiaoshi; var i:integer; begin for i:=1 to 300 do

begin if i mod 2 = 0 then if i mod 3 = 0 then if i mod 5 = 0 then writeln(i); end; end. 该程序是输出300以内同时能被2,3,5整除的整数。现在我们开始调试。调试有多种方法,先介绍一种,权且叫步骤法,步骤法就是模拟计算机的运算,把程序每一步执行的情况都反映出来。通常,我们有F8即STEP这个功能来实现,如图:不断地按F8,计算机就会一步步地执行程序,直到执行到最后的“end.”为止。

可能你还没有发现F8的威力,我们不妨把上面的程序略微修改一下,再配合另外的一种调试的利器watch,你就会发现步骤法的用处。 program tiaoshi; var i:integer; a,b,c:boolean; begin for i:=1 to 300 do begin a:=false; b:=false; c:=false; if i mod 2 = 0 then a:=true; if i mod 3 = 0 then b:=true; if i mod 5 = 0 then c:=true; if a and b and c then writeln(i); end; end. 如图,我们单击菜单栏中debug选项,里面有一项叫watch的选项,我们单击它。

Ollydbg常用断点函数

Ollydbg常用断点函数 作者:lvvl文章来源:https://www.wendangku.net/doc/d28544907.html,点击数:1739更新时间:2007-5-21 1、限制程序功能函数 EnableMenuItem 允许、禁止或变灰指定的菜单条目 EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰) 2、对话框函数 CreateDialog 从资源模板建立一非模态对话窗 CreateDialogParam 从资源模板建立一非模态对话窗 CreateDialogIndirect 从内存模板建立一非模态对话窗CreateDialogIndirectParam 从内存模板建立一非模态对话窗 DialogBox 从资源模板建立一模态对话窗 DialogBoxParam 从资源模板建立一模态对话窗 DialogBoxIndirect 从内存模板建立一模态对话窗 DialogBoxIndirectParam 从内存模板建立一模态对话窗 EndDialog 结束一模态对话窗 MessageBox 显示一信息对话框 MessageBoxEx 显示一信息对话框 MessageBoxIndirect 显示一定制信息对话框 GetDlgItemInt 得指定输入框整数值 GetDlgItemText 得指定输入框输入字符串 GetDlgItemTextA 得指定输入框输入字符串 Hmemcpy 内存复制(非应用程序直接调用)

3、磁盘处理函数1273?GAMEHK所有--admin?11326 GetDiskFreeSpaceA 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量GetDiskFreeSpaceExA 获取与一个磁盘的组织以及剩余空间容量有关的信息 GetDriveTypeA 判断一个磁盘驱动器的类型 GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 GetFullPathNameA 获取指定文件的详细路径 GetVolumeInformationA 获取与一个磁盘卷有关的信息 GetWindowsDirectoryA 获取Windows目录的完整路径名 GetSystemDirectoryA 取得Windows系统目录(即System目录)的完整路径名 4、文件处理函数 CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 OpenFile 这个函数能执行大量不同的文件操作 ReadFile 从文件中读出数据 ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调WriteFile 将数据写入一个文件 WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调SetFilePointer 在一个文件中设置当前的读写位置 SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 _lcreat 创建一个文件 _lopen 以二进制模式打开指定的文件 _lread 将文件中的数据读入内存缓冲区

相关文档
相关文档 最新文档