OD使用教程18 - 解密系列【调试篇】
- 格式:ppt
- 大小:248.50 KB
- 文档页数:4
od教程没有具体的破解,不过是些个⼈经验ollydbg1.06集调试和⽂件修改于⼀⾝,其中的直接显⽰字符串的功能是不必说,还有针对cpu窗⼝中的5个窗格的右健菜单,功能⾮常强⼤。
修改⽂件,选view,file,打开⽂件后,选disassemble,马上可以看到反汇编后的命令(32位的hiew?),选中⼀⾏后按空格键,直接修改命令,不必记住机器码,改后选右键菜单的save,可以保存到⽂件。
如果先analyze后,可以通过ctrl+G,写虚拟地址,直接找到⾏,不必再转成⽂件偏移地址,改后直接选copy to exeutive file,注意,必须让光标停在你改的⾏上,否则不能修改,如果改错了,选undo selection。
在调试中,animate step over/in 这两个命令⾮常⽅便,尤其我觉得在对付nag程序的时候,⼏乎不必设断,⽐如,先analyze 程序,然后选animatestep over或in,程序开始运⾏,光标在命令⾏上滑过(要的就是这种效果),然后nag出现,仔细看看反汇编窗格,是不是光标停在⼀个call上,它到底call什么我们不关⼼,反正call出了nag对话框,然后往上看看,极有可能有个jz,jnz,直接改了跳过即可(⼀般程序⽽⾔)然后有两个命令是⾮常好的东西,hit trace和run trace,hit trace可以⽤来查看在你选定的命令范围内命令被执⾏与否,执⾏了前⾯就有个红竖线,⽽run trace可以为你设定的命令范围作⼀个运⾏的profile,有了它,你就可以完全掌握程序的跳转,在爆破的时候不⽤为了⼀个个跳转反复的找。
其次,ollydbg的拷贝功能⾮常好,在任意⾏⼀都可以拷贝到剪贴扳,或拷贝到⽂件,甚⾄在上⾯说的由run trace做出来的profile,你都可以copy the whole table,留下来细细研究。
在调试中寄存器的值都能⽤10进制16进制看到的,⽅法是只要选中如eax,ebx然后按回车,省得你⽼是?这?那的敲命令,如果要r fl z,只要双击0状态标志Z后⾯的值就可以了,⾮常⽅便值的⼀提的是follow命令,在反汇编中选中⼀条命令,如果其中有⽤到内存中的地址,那么follow in dump 有两个选项,⼀个是selection⼀个是address,sellection到命令所在的虚拟地址,address到其中⽤到的内存地址,这样可以⾮常⽅便的看到到底有些什么东西,不⽤反复⽤d命令。
od 加密函数断点
OD加密函数断点是指在使用OD(OllyDbg)调试工具时,针对
特定的加密函数设置断点以便分析其加密算法和过程。
在进行OD加
密函数断点时,我们通常需要考虑以下几个方面:
1. 加密函数的位置,首先需要在程序中定位到需要分析的加密
函数的位置,可以通过静态分析或动态调试的方式找到函数的入口点。
2. 加密算法分析,一旦设置了断点,当程序执行到加密函数时,我们可以逐步跟踪代码的执行过程,观察寄存器和内存的变化,以
便分析加密算法的具体实现方式。
3. 输入输出数据分析,通过断点可以观察到加密函数的输入和
输出数据,我们可以分析这些数据的结构和变化规律,以便理解加
密过程中数据的转换和变换。
4. 调试技巧,在设置加密函数断点时,需要灵活运用OD调试
工具提供的功能,比如条件断点、内存监视等,以便更好地分析加
密函数的执行过程。
总之,在进行OD加密函数断点时,我们需要综合运用静态分析和动态调试的方法,结合加密算法分析和输入输出数据分析,以便全面深入地理解加密函数的实现原理和运行过程。
这样能够帮助我们更好地理解程序的加密机制,为安全分析和逆向工程提供有力支持。
od反编译工具用法反编译是指将已经编译过的程序文件转换为高级源代码的过程。
反编译工具可以帮助开发者了解和学习其他人编写的程序,对于调试和修复软件错误也很有帮助。
OD (OllyDbg) 是一种广泛使用的反汇编调试工具,本文将介绍如何使用OD进行反编译。
OD的基本使用方法如下:2.打开需要反编译的程序:在OD主界面上点击“文件”菜单,然后选择“打开”选项,浏览并选择需要反编译的程序文件,并点击“打开”按钮。
3.反汇编代码窗口:OD会在主界面上打开一个反汇编代码窗口,这个窗口将显示程序的机器码和相应的汇编指令。
4.反编译代码:可以通过“右键单击”汇编指令,然后选择“跟随”选项来进行反编译。
OD会尝试寻找并显示反编译后的代码。
5.查看变量和数据:在OD的主界面上,有一个“数据窗口”,可以显示程序中的变量和内存数据。
在反汇编代码窗口中选择一些指令,然后在数据窗口中查看它所使用的变量和数据的值。
6.设置断点:在OD中设置断点可以帮助我们在特定指令上暂停执行程序,以便查看程序状态和调试错误。
在反汇编代码窗口中选择一些指令,然后点击“上方”菜单中的“条件断点”选项,OD会弹出一个对话框,可以在其中设置断点条件。
7.运行程序:在OD的主界面上,有一个“执行”菜单,可以用于运行程序。
可以通过点击“执行”菜单中的“运行”选项来启动程序的执行。
当程序遇到断点时,会停止执行并进入调试模式。
8.调试程序:在OD的调试模式下,可以通过一些常用的调试功能来调试程序。
例如,可以通过“单步执行”菜单选项逐行执行程序代码,通过“寄存器窗口”查看和修改寄存器值,通过“内存窗口”查看和修改内存数据等。
需要注意的是,使用OD进行反编译需要一定的汇编和调试知识。
同时,反编译软件可能涉及违法行为,如未获得程序开发者的许可而进行反编译。
请确保遵守法律规定,并只在合法和正当的情况下使用反编译工具。
在使用OD进行反编译时,可以参考以下一些技巧和注意事项:1.了解汇编语言与机器码的对应关系:汇编语言是将机器码转换为可读性更高的指令的语言,因此了解汇编语言的基本语法和常见指令有助于理解和分析程序。
几种用OD脱壳方法OD是反编译软件的一种,可以将可执行文件转换为可读的源代码。
脱壳是指从已经加密或保护的软件中提取出原始的未加密或未保护的代码。
下面是几种常见的OD脱壳方法:1.静态分析法:静态分析是指对二进制文件进行分析,了解其结构、函数调用和控制流程等信息。
通过对逆向工程的分析,可以分析出加密算法和解密函数的位置。
使用静态分析法脱壳的主要步骤如下:-打开OD软件,将加密的可执行文件加载到OD中。
- 使用各种OD工具,如IDA Pro,OllyDbg等,显示可执行文件的汇编代码。
-通过分析代码和调试程序,找到加密算法和解密函数的位置。
-根据找到的位置,修改程序的执行流程,跳过解密函数,使得程序直接执行解密后的代码。
2.动态调试法:动态调试是指在运行时对程序进行调试和分析。
使用动态调试法脱壳的主要步骤如下:-打开OD软件,将加密的可执行文件加载到OD中。
- 使用动态调试工具,如OllyDbg或GDB等,在程序执行期间跟踪和记录函数调用和内存访问。
-通过分析函数调用和内存访问,找到加密算法和解密函数的位置。
-在找到的位置上下断点,执行程序并使用OD工具查看解密后的代码。
3.内存镜像法:内存镜像法是指通过将程序加载到内存中,并对内存进行镜像和分析来脱壳。
使用内存镜像法脱壳的主要步骤如下:-运行加密的可执行文件。
- 使用内存镜像工具,如DumpBin或WinDBG等,将程序的内存镜像保存到磁盘上。
-使用OD软件加载内存镜像文件。
-通过分析内存镜像文件,找到加密算法和解密函数的位置。
-修改程序的执行流程,跳过解密函数,使得程序直接执行解密后的代码。
这些方法都可以用于将加密的可执行文件转换为可读的源代码,从而进行进一步的分析和修改。
脱壳过程需要进行深入的逆向工程和对程序的理解,因此需要具备一定的技术和知识。
此外,需要注意的是,脱壳过程可能涉及到破解和侵犯版权的行为,应遵守法律规定,并仅限于安全研究和个人学习的目的使用。
od 调试原理Debugging is the process of finding and fixing errors or bugs in a computer program. 调试是在计算机程序中查找和修复错误或漏洞的过程。
It is an essential part of software development, as even the most carefully written code can contain bugs that need to be identifiedand resolved. 这是软件开发中必不可少的一部分,因为即使是最仔细编写的代码也可能包含需要被识别和解决的bug。
There are various methods and tools used for debugging, and different programmers may have their own preferred techniques. 有各种方法和工具用于调试,而不同的程序员可能有他们自己偏好的技术。
One common method for debugging is to use a debugger, which is a software tool that allows the programmer to step through the code and inspect the values of variables at different points in theprogram's execution. 一种常见的调试方法是使用调试器,这是一种软件工具,允许程序员逐步执行代码,并检查程序在不同执行点的变量值。
This can help pinpoint exactly where an error is occurring and provide insight into how to fix it. 这可以帮助准确定位错误发生的地方,并提供修复它的见解。
Ollydbg强大的调试工具,简单的介绍一下,在以后的使用中再详细介绍每个功能是具体使用。
如果不把常用到的软件先介绍一下,等使用的时候再介绍会很麻烦。
所以前面的几篇文章就当作铺垫吧。
虽然这几篇文章都很枯燥,但是有不能不提前介绍。
前面的配置很简单,需要掌握。
其余的窗口介绍,名词介绍,和后面的快捷键可以了解一下就算了,我们会在以后的实践当中慢慢去使用的。
这篇文章主要是认识软件,了解快捷键,学会配置插件和UDD的绝对路径,学会添加到右键。
OllyDBG 的安装与配置到OD的文件夹下面直接运行ollydbg.exe即可。
反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。
同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
每个窗口以后都会用到。
等具体使用的时候在具体讲解。
第一次使用OD首先要配置插件和UDD的目录为绝对路径,否则很多莫名其妙的错误会出现。
点击菜单上的选项->界面,将会出来一个界面选项的对话框,点击其中的目录标签:UDD 目录的作用是保存你调试的工作。
比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时 OllyDBG 就会把你所做的工作保存到这个 UDD 目录,以便你下次调试时可以继续以前的工作。
如果不设置这个 UDD 目录,OllyDBG 默认是在其安装目录下保存这些后缀名为 udd 的文件,时间长了就会显的很乱,所以还是建议专门设置一个目录来保存这些文件。
另外一个重要的选项就是调试选项,可通过菜单选项->调试设置来配置:上面那个异常标签中的选项经常会在脱壳中用到。
1. 工具SoftICE是一款经典的调试工具,运行在Ring0级,可以调试驱动。
但平时调试的程序都是Ring3级,因此推荐大家用OllyDBG(简称OD),这款工具上手容易,功能十分强大,现在论坛上的文章基本都是用OllyDBG来讲解的。
Q:从哪儿得到OllyDBG、IDA等加解密工具?A: /tools.htm另外,由于版权,本站不提供SoftICE、IDA等商业软件下载,需要的可以用Google搜索或时常关注论坛。
Q:W32Dasm中的“Ord:0109h”是什么?A:是Hint,本函数在其所驻留DLL的导出表中的索引号( firstrose 回答)Q:谁能介绍一下sig文件的制造方法?A:How to create .sig file from .cpp?1. Compile the CPP files (remember, compile ONLY, do not link)2. See the resulting .OBJ files?3. Run the IDA FLIRT utilities on the .OBJ files4. Voila! Instant .SIG files5. Copy those .SIG files to the SIG folder of IDA6. Disassemble the app in IDA7. Open the "APPLY SIGNATURE" box8. Select your signatures and apply-------------------------------------------------------------------------------- Olldbg常见问题Q: OD中如何运行到光标所在处?A: 将光标移到目标位置,按F4.(SoftICE等价功能键是F7)Q: 如何用OD修改可执行程序?A:直接在反汇编代码区更改,这时可以使用汇编代码更改,然后选中修改后的汇编代码,右击-->复制到可执行文件-->保存文件.Q:使用OD,从内存区复制内存数据的时候,有时候无法将所有的数据都复制到剪贴板A:ALT + o 打开调试选项,选择“字符串”标签,里面有个“无法打印的ASCII字符转存为圆点”,选中就可以了。
od用流程图查看代码执行流程准备工作。
Windows程序由于要使用API函数,在分析中以API函数作为切入点就使过程变得容易起来。
·先了解程序序列号验证流程。
1.输入用户名和序列号;2.使用GetDlgItemTextA函数把字符读出;3.对输入字符进行计算;4.使用lstrcmp函数进行比较。
所以上述的函数就是我们下断点分析的目标,追踪程序序列号验证过程。
(这种为了解密制作的小程序一般称为“CrackMe)。
加载目标文件进行调试。
为了让OD中断在程序入口点,在加载前需要在Options->Debuggingoptions中设置。
在event标签里,一般需要将断点设置在WinMain处。
寄存器。
ESP栈指针指向栈顶。
EIP当前要执行指令(无法通过寄存器面板修改,只能通过在反汇编窗口Neworiginhere改变EIP及当前执行指令的位置,程序会从这条指令开始执行)。
寄存器下方显示的是标志寄存器。
C,P,......,O;只能在0/1之间切换。
单步追踪。
F2设置断点。
F7单步步进遇到call指令跟进。
F8单步步过遇到call指令路过,不跟进。
F9/菜单栏中播放按钮运行程序。
F12暂停程序处理死循环使用。
Ctrl+F2重新调试目标程序(OD将结束目标进程并重新加载它)。
Ctrl+F7在用户按ESC/F12或遇到其他断点时停止重复单步步进。
Ctrl+F8在用户按ESC/F12或遇到其他断点时停止重复单步步过。
Ctrl+F9直到出现ret指令时中断,返回调用call指令的位置。
执行到返回(Executetillreturn)OD会停止在第一个ret/retf/iret遇到ret指令时暂停还是路过在调试选项中设置。
➖在进入子程序的过程中,回看之前单步追踪的代码。
Alt+F9若进入系统领空,可瞬间回到应用程序领空Executetillusercode(执行到用户代码)。
双击EIP或者点击view菜单中的C让光标回到当前EIP指向的语句。
一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个ZIP压缩包,只要解压到一个目录下,运行OllyDBG.exe 就可以了。
汉化版的发布版本是个RAR 压缩包,同样只需解压到一个目录下运行OllyDBG.exe 即可OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的CPU 寄存器内容。
同样点击标签寄存器(FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG 就可以生效了。
启动后我们要把插件及UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把OllyDBG 解压在F:\OllyDBG 目录下,所以相应的UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。
在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个UDD 目录不清楚。
我这简单解释一下:这个UDD 目录的作用是保存你调试的工作。
OllyDBG 入门系列(一)-认识OllyDBG一、OllyDBG的安装与配置OllyDBG1.10版的发布版本是个ZIP压缩包,只要解压到一个目录下,运行OllyDBG.exe就可以了。
汉化版的发布版本是个RAR压缩包,同样只需解压到一个目录下运行OllyDBG.exe即可:OllyDBG中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考TT小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的CPU寄存器内容。
同样点击标签寄存器(FPU)可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG就可以生效了。
启动后我们要把插件及UDD的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把OllyDBG解压在F:\OllyDBG目录下,所以相应的UDD目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。
在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个UDD目录不清楚。
我这简单解释一下:这个UDD目录的作用是保存你调试的工作。
几种用OD脱壳方法OD(Object Dump)即对象转储,是指将内存中的对象转化为文件或其他形式的过程。
脱壳是指从被加壳/保护的程序中提取可执行代码的过程。
以下是几种常见的用OD脱壳方法:1.静态脱壳:静态脱壳是指在未运行程序的情况下进行脱壳。
这种方法适用于一些简单的壳或保护机制。
静态脱壳一般包括以下步骤:-分析被加壳程序的文件结构,确定壳的类型和解密算法。
-定位加密/保护的代码段和目标程序的入口点。
-提取加密的代码段并进行解密。
-删除或替换壳代码,将解密的代码插入到目标程序的入口点。
2.动态脱壳:动态脱壳是指在运行被加壳程序的过程中进行脱壳。
这种方法更加复杂,但可以应对一些更强大的保护机制。
动态脱壳的步骤如下:- 使用调试器(如OllyDbg、IDA Pro等)加载被加壳程序,并设置断点。
-运行程序并观察其行为。
一般可以通过跟踪内存或执行流来确定代码解密、动态链接等操作。
-当程序执行到解密/动态链接等关键点时,暂停程序并检查相关内存中的加密数据。
-通过观察内存数据的变化和算法的操作,找出解密算法、关键数据等。
-使用调试器的功能(如修改内存、暂停/恢复执行等)来修改和恢复解密的数据,最终达到脱壳的目的。
3.虚拟机检测:有时候,加壳程序会在运行时检测是否在虚拟机中执行。
如果发现运行在虚拟机中,则不会执行解密操作。
因此,一种常见的脱壳方法是绕过虚拟机检测。
这可以通过修改虚拟机检测函数的返回值来实现。
通过调试器可以定位到虚拟机检测的相关代码,并修改相应的变量或寄存器值。
4.内存脱壳:部分加壳程序并不是一次性将整个程序都解密并运行,而是采用内存加载的方式,将加密的代码段逐步解密到内存中执行。
这种情况下,可以使用内存脱壳来获取完整的可执行文件。
内存脱壳的步骤如下:-使用调试器加载被加壳程序。
-执行程序,观察其行为并找到解密/加载代码的操作。
-在解密/加载代码执行前暂停程序,此时可使用调试器的内存修改功能,在内存中找到加密的代码段,并修改为解密后的代码。
Ollydbg破解教学之万能断点篇(图)安全中国 更新时间:2008-9-6 0:30:57 责任编辑:流火热点:终于有一点时间总结一下OD破解的经验,有许多大侠们都认为OD不能下万能断点,可是有些软件的破解需要用到万能断点,以前一直没有这方面的资料,有的只是OD不能下万能断点的断言,一时心恢之极,可是我原来用TRW和SICE用的挺好,谁知系统又跟我闹矛盾,一用TRW和SICE就死机,没办法我现在只能用OD,我写的一些破解文章都是用OD破的,反复试验,我终于发现OD也能下万能断点,在我以前写的一些文章中好象有一篇简单提到过,但没有说的很详细,这次静下心,想写一点东西,送给我心爱的组织DFCG吧,我的破解是从DFCG组织起步的,很感谢DFCG的高手们的帮助,在此说声谢谢!为了更明确,这次破解所使用的调试器OD是从看雪论坛临时下载的OD1.09的汉化版,没有使用我自己手头经过改造的OD,在此也感谢看雪论坛,这里真的有很多高手,在这个论坛我也学到了很多.这次破解的对象是超级XX王,为保护国产软件我隐去了软件相关信息,我不想给自己带来麻烦,现在工作很忙,能少一点麻烦就尽量少一点吧.破解作者yzez[DFCG]破解工具ollydbg1.09汉化版,看雪论坛下载.破解目的本不为破解而破解,只因为技术而破解破解环境WINDOWS XP,这个我已经在98和XP下各做了两次,贴图和我这篇文章是在XP系统下完成的.破解过程1.检查了一下,该程序无壳,C++编译,用W32DSM反汇编一堆乱码,我倒!那就动态调试吧!用ollydbg1.09载入程序,这次我将教你们如何用OD下万能断点,过程我尽可能详细一点,下面请看.载入程序选OD菜单栏上的插件-----命令行(快捷键是ALT+F1),在弹出的窗口中输入万能断点命令:bpx hmemcpy,按ENTER键,结果又出现一个对话框:Intermodular calls00401164 CALL DWORD PTR DS:[<&USER32.GetWindowRect>] USER32.GetWindowRect0040118F CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect00401279 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect004013E1 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect0040190A CALL DWORD PTR DS:[<&KERNEL32.GetThreadLocale>] kernel32.GetThreadLocale0040191C CALL DWORD PTR DS:[<&KERNEL32.GetLocaleInfoA>] kernel32.GetLocaleInfoA还有很多,我就省略了,在这个框里右键单击,出现一个对话框,选中在每个命令中设置断点(热键是S),单击,你看每一行都变成了红色吧,这表示全部设下断点了,后面的过程很烦燥,你要一边按F9,边按F2把一些无用的断点去掉,有一点耐心吧,当然也可以不这样做,但遇到断点跳不过的时候,你就得按F2把这个断点去掉.感觉在这一点上OD比不上TRW和SICE,到出现注册信息框后,你要输入注册信息,然后按确定,程序被断下来,我的序列号是:GK342QZ0C6RE03L,我输入试验码:123456789098765.程序中断在下面:00471F71 CALL DWORD PTR DS:[<&USER32.GetWindowTex>****按确定后回到OD程序中断在此,按F8走,在此还没有到关键处!*****************************************************注意这里会循环两次,分别处理序列号和试验码,按F8走00471F77 LEA ECX,DWORD PTR DS:[EAX+1]00471F7A PUSH ECX00471F7B MOV ECX,DWORD PTR SS:[EBP+10]00471F7E PUSH EAX00471F7F CALL SuperPIM.0043E15D00471F84 PUSH EAX00471F85 PUSH ESI00471F86 CALL DWORD PTR DS:[<&USER32.GetWindowTex>00471F8C MOV ECX,DWORD PTR SS:[EBP+10]00471F8F PUSH -100471F91 CALL SuperPIM.00401D6A00471F96 JMP SHORT SuperPIM.00471FA300471F98 MOV EAX,DWORD PTR SS:[EBP+10]00471F9B PUSH DWORD PTR DS:[EAX]00471F9D PUSH ESI00471F9E CALL SuperPIM.00470B6100471FA4 POP ESI00471FA5 POP EBP00471FA6 RETN 0C*************************************程序第二次循环后最后会返回到0040FE99下面看代码:----------------------------------------------------------------------------------------------------------0040FE99 LEA EAX,DWORD PTR SS:[EBP-14]****第二次循环后会返回到这里,注意这就是我们要找的关键地方,按F8往下!0040FE9C PUSH EAX0040FE9D CALL SuperPIM.00433D92***********这就是关键CALL,按F7追进,一定要进,因为算法就在这里面!0040FEA2 POP ECX0040FEA3 AND DWORD PTR SS:[EBP-4],00040FEA7 LEA ESI,DWORD PTR DS:[EDI+74]0040FEAA MOV EAX,DWORD PTR DS:[ESI]******试验码入EAX0040FEAC CMP DWORD PTR DS:[EAX-C],0******比较试验码输入了吗?0040FEB0 JE SHORT SuperPIM.0040FF2F******没有输入就跳走,一跳就失败!0040FEB2 PUSH 280040FEB4 LEA EAX,DWORD PTR SS:[EBP-18]0040FEB7 PUSH ESI0040FEB8 PUSH EAX0040FEB9 CALL SuperPIM.0042CEC8**********此CALL对输入的注册码进行处理,得到一个40位的长字符串,有兴趣自己跟,******************************************我已是头晕的很,不想跟进!0040FEBE LEA ECX,DWORD PTR SS:[EBP-14]0040FEC1 PUSH ECX0040FEC2 PUSH EAX0040FEC3 CALL SuperPIM.0040F9B7**********此CALL对序列号处理,也是得到一个40位的长字符串0040FEC8 MOV ECX,DWORD PTR SS:[EBP-18]0040FECB ADD ESP,140040FECE ADD ECX,-100040FED1 MOV BYTE PTR SS:[EBP-D],AL0040FED4 CALL SuperPIM.00401B5D**********此CALL进行比较,注册码不对,值为00040FED9 CMP BYTE PTR SS:[EBP-D],0*******比较是0吗?0040FEDD JE SHORT SuperPIM.0040FF2F******相等就跳,跳就失败,所以一定不能跳!0040FEDF PUSH 0**************************不跳往下你就成功了!下面代码省略!...............................................................省略若干代码!.........................=============================================================================================================************************************关键CALL的代码!*******************************************************00433D92 MOV EAX, SuperPIM.0049844E****追进关键CALL后我们来到这里!00433D97 CALL SuperPIM.0045090000433D9C PUSH ECX00433D9D PUSH ECX00433D9E AND [LOCAL.5], 000433DA2 LEA EAX, [LOCAL.5]00433DA5 PUSH EAX00433DA6 CALL SuperPIM.00433CA9********此CALL根据电脑硬件信息得到你的序列号,有兴趣跟吧!我是没有兴趣!00433DAB AND [LOCAL.1], 000433DAF PUSH 1400433DB1 LEA EAX, [LOCAL.5]00433DB4 PUSH EAX00433DB5 LEA EAX, [LOCAL.4]00433DB8 PUSH EAX00433DB9 CALL SuperPIM.0042CEC8*******算法CALL(1),按F7跟进!00433DBE PUSH 2800433DC0 LEA EAX, [LOCAL.4]00433DC3 PUSH EAX00433DC4 PUSH [ARG.1]00433DC7 MOV BYTE PTR SS:[EBP-4], 100433DCB CALL SuperPIM.0042CEC800433DD0 MOV ECX, [LOCAL.4]00433DD3 ADD ESP, 1C00433DD6 ADD ECX, -10*****************************省略N行代码!********************************************************0043454B RETN===========================================================================================================***********************************算法CALL!*********************************************************0042CEC8 MOV EAX, SuperPIM.00497B52********追进算法CALL我们在这里!0042CECD CALL SuperPIM.004509000042CED2 SUB ESP, 140042CED5 PUSH EBX0042CED6 PUSH ESI0042CED7 XOR EBX, EBX0042CED9 PUSH EDI0042CEDA MOV [LOCAL.8], EBX0042CEDD CALL SuperPIM.004639B50042CEE2 MOV EDX, DWORD PTR DS:[EAX]0042CEE4 MOV ECX, EAX0042CEE6 CALL DWORD PTR DS:[EDX+C]0042CEE9 LEA EDI, DWORD PTR DS:[EAX+10]0042CEEC MOV [LOCAL.4], EDI0042CEEF MOV EAX, [ARG.2]0042CEF2 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L 移入EAX0042CEF4 MOV ESI, DWORD PTR DS:[EAX-C]*****序列号的位数15(十六进制值是F)送入ESI0042CEF7 CMP ESI, EBX**********************比较ESI和EBX,ESI的值是F即序列号位数,EBX的初始值是00042CEF9 MOV [LOCAL.1], EBX0042CEFC MOV [LOCAL.8], ESI0042CEFF JE SuperPIM.0042CFB2*************相等就跳,这里当然不相等,所以就不会跳!0042CF05 MOV EAX, [ARG.3]******************常数14(十进制值是20)送入EAX0042CF08 CMP EAX, ESI**********************比较EAX和ESI,即14和F 比较!0042CF0A MOV [LOCAL.6], EAX0042CF0D JG SHORT SuperPIM.0042CF12*******大于就跳!0042CF0F MOV [LOCAL.6], ESI0042CF12 CMP [LOCAL.6], EBX****************跳到这里!比较14和0 0042CF15 JLE SuperPIM.0042CFB2*************小于就跳,这里当然不会小!所以不跳!0042CF1B MOV EAX, EBX**********************0移入EAX0042CF1D CDQ***********************************EDX清0,准备计算!0042CF1E IDIV ESI***************************除,EAX/ESI ,EAX的值是0,ESI的值存放序列号的位数F0042CF20 MOV EAX, [ARG.2]******************赋EAX地址值0042CF23 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L 移入EAX0042CF25 PUSH EBX***************************EBX入栈0042CF26 MOV AL, BYTE PTR DS:[EDX+EAX]*****序列号的第一位G(ASCII码值47)入AL0042CF29 MOV BYTE PTR SS:[EBP-1C], AL******保存值470042CF2C PUSH [LOCAL.7]0042CF2F CALL SuperPIM.0042CD8E***************************算法CALL(2)*****************************************************0042CD8E PUSH EBP0042CD8F MOV EBP, ESP0042CD91 PUSH ECX*************************G的ASCII码值47入ECX 0042CD92 MOVZX EAX, BYTE PTR SS:[EBP+8]****扩展成000000470042CD96 MOV ECX, [ARG.2]****************赋ECX的初始值为00042CD99 MOV [LOCAL.1], EAX0042CD9C MOV EAX, ECX********************ECX的值移入EAX0042CD9E IMUL EAX, ECX********************EAX=EAX*ECX=0*00042CDA1 LEA EAX, DWORD PTR DS:[EAX+EAX*2+7]**EAX+EAX*2+7的值7给EAX0042CDA5 IMUL EAX, ECX********************EAX=EAX*ECX=7*00042CDA8 ADD EAX, 0D*********************EAX=EAX+0D=D0042CDAB IMUL EAX, ECX********************EAX=EAX*ECX=D*0=00042CDAE PUSH ESI*************************序列号位数F入栈!0042CDAF LEA ESI, DWORD PTR DS:[ECX+5]0042CDB2 PUSH ESI0042CDB3 MOV [ARG.1], EAX0042CDB6 LEA EAX, [ARG.1]0042CDB9 PUSH 40042CDBB PUSH EAX0042CDBC CALL SuperPIM.0042CD2E***********这个CALL也在计算,我实在不想跟进!0042CDC1 PUSH ESI0042CDC2 LEA EAX, [LOCAL.1]0042CDC5 PUSH 40042CDC7 PUSH EAX0042CDC8 CALL SuperPIM.0042CD5E**********这个CALL也是计算CALL,烦!不跟了!0042CDCD MOV EAX, [ARG.1]0042CDD0 ADD ESP, 180042CDD3 XOR EAX, [LOCAL.1]*************这里赋EAX的值38000002 0042CDD6 POP ESI0042CDD7 LEAVE0042CDD8 RETN======================================================================= ==算法CALL(2)结束==================0042CF34 POP ECX0042CF35 POP ECX0042CF36 PUSH 2B***************************常数2B入栈!0042CF38 XOR EDX, EDX0042CF3A POP ECX**************************把常数2B赋给ECX0042CF3B DIV ECX**************************除,EAX/ECX=38000002/2B=014D6535,余数1B入EDX0042CF3D MOV ECX, EDX*********************结果1B入ECX0042CF3F ADD CL, 30***********************CL=CL+30=1B+30=4B(对应的字符串是K)0042CF42 CMP CL, 39***********************比较是不是数字90042CF45 MOV BYTE PTR SS:[EBP-14], CL*****保存字符串K0042CF48 JLE SHORT SuperPIM.0042CF55******小于就跳走!0042CF4A CMP CL, 41***********************比较是不是A0042CF4D JGE SHORT SuperPIM.0042CF55******大于就跳走0042CF4F ADD CL, 0F60042CF52 MOV BYTE PTR SS:[EBP-14], CL0042CF55 CMP EBX, [ARG.3]*****************跳到这里!比较0和140042CF58 JGE SHORT SuperPIM.0042CF67******大于等于就跳走!0042CF5A PUSH [LOCAL.5]0042CF5D LEA ECX, [LOCAL.4]0042CF60 CALL SuperPIM.00417EAF0042CF65 JMP SHORT SuperPIM.0042CFA5******无条件跳0042CF67 MOV EAX, EBX0042CF69 CDQ0042CF6A IDIV [ARG.3]0042CF6D MOVSX ECX, CL0042CF70 PUSH 2B0042CF72 MOV ESI, EDX0042CF74 MOVSX EAX, BYTE PTR DS:[ESI+EDI]0042CF78 LEA EAX, DWORD PTR DS:[EAX+ECX-60]0042CF7C CDQ0042CF7D POP ECX0042CF7E IDIV ECX0042CF80 ADD DL, 300042CF83 CMP DL, 390042CF86 MOV BYTE PTR SS:[EBP-14], DL0042CF89 JLE SHORT SuperPIM.0042CF960042CF8B CMP DL, 410042CF8E JGE SHORT SuperPIM.0042CF960042CF90 ADD DL, 0F60042CF93 MOV BYTE PTR SS:[EBP-14], DL0042CF96 PUSH [LOCAL.5]0042CF99 LEA ECX, [LOCAL.4]0042CF9C PUSH ESI0042CF9D CALL SuperPIM.0042CE4B0042CFA2 MOV ESI, [LOCAL.8]0042CFA5 MOV EDI, [LOCAL.4]***************上面跳到这里!0042CFA8 INC EBX*************************EBX加10042CFA9 CMP EBX, [LOCAL.6]**************比较1和14 0042CFAC JL SuperPIM.0042CF1B***********小于就跳,循环,序列号只有15位,这里循环20次,取完后又从第一位取出!************************************循环结束后得到的值是:K3L2LPBDW1F2H4B8S0UY这就是我们要的注册码!0042CFB2 MOV ECX, [ARG.1]0042CFB5 LEA EAX, [LOCAL.4]0042CFB8 PUSH EAX0042CFB9 CALL SuperPIM.00401F360042CFBE LEA ECX, DWORD PTR DS:[EDI-10]0042CFC1 CALL SuperPIM.00401B5D0042CFC6 MOV ECX, [LOCAL.3]0042CFC9 MOV EAX, [ARG.1]0042CFCC POP EDI0042CFCD POP ESI0042CFCE POP EBX0042CFCF MOV DWORD PTR FS:[0], ECX0042CFD6 LEAVE0042CFD7 RETN写这篇文章的目的是想说明如何在OD下万能断点,算法过程太烦琐,就不想多跟了!希望能对大家有点启发,如果觉得这篇破文还行帮我顶一下吧!也是希望有更多的人能看到,对更多的人有益,我也是一只菜鸟,请大家多多指点!我的序列号:GK342QZ0C6RE03L注册码:K3L2LPBDW1F2H4B8S0UYWinXP 关于POINT-H万能断点的教程________________________________________标题: 【翻译】WinXP 关于POINT-H万能断点的教程作者: nba2005时间: 2008-04-01,17:26:46链接: /showthread.php?t=62346WinXP 关于POINT-H万能断点的教程【文章标题】: WinXP 关于POINT-H万能断点的教程【文章译者】: NBA2005【作者邮箱】: stockfox1699@【作者QQ号】: 382309369创作《算法分析实战篇和应用篇之提高(一)我的常用断点系统》,顺手对该文进行了翻译,前后共三个小时。
OD快捷键使用大全。
非常详细(游戏逆向分析必看)无论当前的OllyDbg窗口是什么,这些快捷键均有效:Ctrl+F2 - 重启程序,即重新启动被调试程序。
如果当前没有调试的程序,OllyDbg会运行历史列表[historylist]中的第一个程序。
程序重启后,将会删除所有内存断点和硬件断点。
译者注:从实际使用效果看,硬件断点在程序重启后并没有移除。
Alt+F2 - 关闭,即关闭被调试程序。
如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。
F3 - 弹出“打开32位.EXE文件”对话框[Open 32-bit .EXE file],您可以选择可执行文件,并可以输入运行参数。
Alt+F5 -让OllyDbg总在最前面。
如果被调试程序在某个断点处发生中断,而这时调试程序弹出一个总在最前面的窗口(一般为模式消息或模式对话框[modal messageor dialog]),它可能会遮住OllyDbg的一部分,但是我们又不能移动最小化这个窗口。
激活OllyDbg(比如按任务栏上的标签)并按Alt+F5,OllyDbg将设置成总在最前面,会反过来遮住刚才那个窗口。
如果您再按一下Alt+F5,OllyDbg会恢复到正常状态。
OllyDbg是否处于总在最前面状态,将会保存,在下一次调试时依然有效。
当前是否处于总在最前面状态,会显示在状态栏中。
F7 -单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。
如果当前命令是是含有REP前缀,则只执行一次重复操作。
Shift+F7 -与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
Ctrl+F7 -自动步入,在所有的函数调用中一条一条地执行命令(就像您按住F7键不放一样,只是更快一些)。
当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。
OD和IDA的使用专业:信息安全班级:0441104姓名:夏维学号:2011211830授课老师:董涛一 OD的使用1 界面构成OllyDbg发行版是一个ZIP压缩包,只要解压运行OllyDbg.exe即可。
运行OllyDbg打开进程,主窗口显示反汇编清单。
各窗口的外观属性如:“标题栏(bar)、字体(font)”等在右键菜单"界面选项(appearance)"里控制代码窗口代码窗口(OllyDbg帮助文件自称反编汇窗口)显示被调试程序的代码。
他有四个列地址/Address(虚拟地址)HEX数据/HEX dump(机器码)反汇编/Diassassembly(汇编代码)注释/Comment(注释)最后一列注释(Comment)显示相关API参数或运行简表,非常有用,有点类似于IDA Pro。
在代码窗口(地址行,不是列标题)双击时完成动作。
地址(Address)列:显示相对被双击地址的地址,再次双击返回标准地址模式;HEX数据(HEX dump)列:设置或取消无条件断点,按F2键也能设置断点;反汇编(Diassassembly)列:调试编辑器,可直接修改汇编代码;注释(Comment)列:允许增加或编辑注释。
代码窗口允许浏览、分析、搜索和修改代码,保存改变到可执行文件,设置断点等。
相关弹出式菜单包括100多项。
信息窗口(Information window)动态跟踪时,与指令相关的各寄存器的值、API函数调用提示、跳转提示等信息显示。
数据窗口以十六进制或内存方式显示文件在内容中的数据,类似于softICE的数据窗口。
要显示数据可单击右键"转到→表达式(Go to→expression)"或按Ctrl+G键打开地址窗口,输入地址。
寄存器(Registers window)显示CPU各寄存器的值,支持浮点(FPU)、MMX,3DNow!寄存器,可以单击鼠标右键切换。
使用OllyDbg从零开始Cracking第一章(翻译:BGCoder)《使用OllyDbg从零开始Cracking》教程的目的是为那些想精通Cracking(译注1)艺术的人提供必要的基础知识。
有了这些基础知识,你就可以阅读和理解更高级的教程,例如《INTRODUCCIÓN AL CRACKING》(译注2),这个系列教程现在仍在不断加入新的内容。
写这个教程想法的产生,是由于意识到了《INTRODUCCIÓN AL CRACKING》中的很多教程对于新手来说太过于复杂。
而新手们还未能达到课程所需的能力要求。
多方面的原因导致这些新人难以继续学习。
因此,《使用OllyDbg从零开始Cracking》的目标并不是取代来自《INTRODUCCIÓN AL CRACKING》中的教程(它里面的教程数量已逾500),而是为学完这个课程后的读者打下一个良好的基础,以便去学习阅读日益复杂的资料。
它的主要目的是减少课程数量,提供必要的基础知识,从而使新的Cracker对更复杂的文章资料能够深入的理解。
为什么使用OllyDbg?我们不会去探讨SoftICE和OllyDbg之间的对抗,我认为即使是SoftICE的狂热追随者也可以很容易的入手OllyDbg。
而OllyDbg拥有更多的资料且更容易学习。
我们需要从OllyDbg这扇大门进入Cracking的世界。
以后可能会在必要的时候换成其它调试器,但变化的只是它们的使用方法,不变的是它们的本质。
让我们从头开始。
首先,需要装备我们以后将主要使用的工具(OllyDbg),点此下载(译注3)。
下载成功后,将其解压到你容易访问的硬盘文件夹内,一个好的办法是在C盘创建一个目录,尽管它在哪里都可以运行,在这里我选择了C:\。
解压后,进入你创建的文件夹内可以看到:它的可执行文件是OLLYDBG.exe,为了方便,我们可以将其快捷方式发送到桌面。
好的,启动软件,点击OllyDbg图标。