[VIP专享]使用OllyDbg从零开始Cracking 第十三章-硬编码序列号寻踪-Part1

合集下载

ollydbg 伪c代码

ollydbg 伪c代码

ollydbg 伪c代码ollydbg是一款非常流行的反汇编工具,它可以帮助程序员分析和调试程序。

而伪c代码则是一种类似于c语言的伪代码,它可以帮助程序员更好地理解程序的逻辑。

在使用ollydbg进行反汇编时,我们可以使用伪c代码来更好地理解程序的运行过程。

下面是一个简单的示例,展示了如何使用ollydbg和伪c代码来分析一个程序:首先,我们需要打开ollydbg,并加载需要分析的程序。

然后,我们可以在ollydbg中找到程序的入口点,并在该处设置一个断点。

接着,我们可以运行程序,直到程序执行到断点处停止。

此时,我们可以使用ollydbg的反汇编功能来查看程序的汇编代码。

但是,汇编代码往往比较难以理解,因此我们可以将其转换为伪c代码。

在ollydbg中,我们可以使用插件来实现这一功能。

例如,我们可以使用插件“ollydbg2-pseudocode”来将汇编代码转换为伪c代码。

转换后的伪c代码可以帮助我们更好地理解程序的逻辑。

例如,以下是一个简单的伪c代码示例:```int main(){int a = 10;int b = 20;int c = a + b;printf("c = %d", c);return 0;}```这段代码实际上是以下汇编代码的伪c代码表示:```push ebpmov ebp, espsub esp, 10hmov dword ptr [ebp-4], 0Ahmov dword ptr [ebp-8], 14hmov eax, dword ptr [ebp-4]add eax, dword ptr [ebp-8]mov dword ptr [ebp-0Ch], eaxmov eax, dword ptr [ebp-0Ch]push eaxpush offset string "c = %d"call dword ptr [__imp__printf]add esp, 8xor eax, eaxmov esp, ebppop ebpret```可以看到,伪c代码更加易读易懂,可以帮助我们更好地理解程序的逻辑。

OLLYDBG

OLLYDBG
监视与监察器:每个监视都是一个表达式并能实时显示表达式的值。您可以使用寄存器、常数、地址表达式、布尔值以及任何复杂代数运算,您还可以比较ASCII和UNICODE
字符串。监察器[inspectors]是一种包含了两个的索引序列的监视[Watches],它以二维表的形式呈现,可以对数组和结构进行解码分析。
……
004010C5 pop edi \
004010C6 pop esi |
004010C7 pop ebx |epilog
004010C8 mov esp,ebp |
004010CA pop ebp |
004010CB ret /
栈:在栈窗口中,OllyDbg 能智能识别返回地址和栈框架[Stack Frames]。并会留下一些先前的调用。如果程序停在已知函数上,堆栈窗口将会对其参数进行分析解码。
Run跟踪: Run跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟运行程序。这个模拟器包含了除了SSE指令集以外的所以寄存器、标志、线程错误、消息、已经函数的参数。您可以保存命令,这样可以非常方便地调试自修改代码(译者注:比如加壳程序)。您可以设置条件中断,条件包括地址范围、表达式、命令。您可以将Run
分析:OllyDbg 的最大特点之一就是分析。它会分析函数过程、循环语句、选择语句、表[tables]、常量、代码中的字符串、欺骗性指令[tricky constructs]、API调用、函数中参数的数目,import表等等。. 这些分析增加了二进制代码的可读性,减少了出错的可能性,使得我们的调试工作更加容易。
已知函数:OllyDbg 可以识别 2300 多个 C 和 Windows API 中的常用函数及其使用的参数。您可以添加描述信息、预定义解码。您还可以在已知函数设定 Log 断点并可以对参数进行记录。

ollydbg使用方法

ollydbg使用方法

ollydbg使用方法ollydbg是一款用于逆向工程和调试程序的强大工具。

它可以帮助我们分析和修改二进制文件,以理解程序的内部工作原理。

在本文中,我们将介绍ollydbg的使用方法,以帮助读者快速上手使用该工具。

一、ollydbg的安装和配置我们需要下载ollydbg的安装文件,并按照向导完成安装过程。

安装完成后,我们可以在程序菜单中找到ollydbg的快捷方式。

二、打开目标程序在ollydbg中打开目标程序的方法有两种:直接拖拽到ollydbg窗口中或通过菜单中的“文件”选项来打开程序。

无论使用哪种方法,我们都需要找到目标程序所在的路径,并选择打开。

三、调试程序1. 设置断点:在ollydbg中,断点是一种被设置在程序中的暂停执行的标记点。

我们可以通过双击程序中的某一行代码或者在该行代码上点击右键,然后选择“Toggle Breakpoint”来设置断点。

设置断点后,当程序执行到该行代码时,会自动停止执行,方便我们进行调试。

2. 单步执行:在调试过程中,我们可以使用单步执行功能来逐行执行程序。

我们可以通过菜单中的“调试”选项,或者使用快捷键F7来进行单步执行。

单步执行可以帮助我们逐行分析程序的执行流程,以及观察变量的值的变化。

3. 查看寄存器和内存:在调试过程中,我们经常需要查看程序中的寄存器和内存的值。

ollydbg提供了寄存器窗口和内存窗口,可以方便地查看这些信息。

我们可以通过菜单中的“窗口”选项,选择“寄存器”或者“内存”来打开相应的窗口。

4. 分析代码:在调试过程中,我们可以使用ollydbg的反汇编窗口来查看程序的汇编代码。

我们可以通过菜单中的“窗口”选项,选择“反汇编”来打开反汇编窗口。

反汇编窗口可以帮助我们分析程序的执行流程,以及理解代码的逻辑。

5. 修改变量值:在调试过程中,我们可以通过ollydbg来修改程序中的变量的值。

我们可以在变量所在的内存地址上点击右键,然后选择“修改”,来修改变量的值。

OllyICE使用教程

OllyICE使用教程

OllyICE使用说明与示例一、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 目录不清楚。

OllyDbg的基本使用

OllyDbg的基本使用

OllyDbg的基本使⽤注:内容整理⾃《逆向⼯程核⼼原理》,结合我的OllyDbg版本修改了⼀些内容1. OllyDbg常⽤命令及其快捷键指令快捷键含义Restart Ctrl+F2重新开始调试Step Into F7执⾏⼀句OP code,若遇到CALL,进⼊函数代码内部Step Over F8执⾏⼀句OP code,若遇到CALL,仅执⾏函数⾃⾝,不跟随进⼊Run F9运⾏(遇到断点时暂停)Execute till return Ctrl+F9 执⾏函数代码内的命令,直到遇到RETN命令,⽤于跳出函数体Execute till cursor F4 执⾏到光标所在位置Comment; 添加注释User-defined comment⿏标右键菜单Search for-User defined comment查看⽤户输⼊的注释⽬录Label:添加标签User-defined label⿏标右键菜单Search for-User defined Label查看⽤户输⼊的标签⽬录Breakpoint F2设置或取消断点All referenced text strings ⿏标右键菜单Search for-All referenced textstrings查看代码中引⽤的字符串All intermodular calls⿏标右键菜单Search for-All intermodular calls查看代码中调⽤的所有API函数Name in all modules⿏标右键菜单Search for-Name in all modules查看所有API函数Edit data Ctrl+E编辑数据Assemble空格键编写汇编代码Copy to executable file⿏标右键菜单Copy to executable file创建⽂本副本(修改的项⽬被保留)2. 设置点的⽅法(这⾥我们假设⼤本营的地址为004010ED)①Goto命令执⾏Goto命令(Ctrl+G),在打开的对话框中输⼊004010ED,然后单击OK按钮,这样光标就会⾃动定位到004010ED处然后执⾏Execute till cursor(F4)命令,让调试流运⾏到该处②设置断点选中004010ED这⼀⾏(可以⼿动找,也可以使⽤上述Goto命令中的第⼀步),设置BreakPoint(F2),调试运⾏到断点处会暂停然后执⾏Run debugged application(F9)即可让调试直接运⾏到断点处暂停注:在OllyDbg菜单栏中选择View-Breakpoints(Alt+B),可以打开Breakpoints对话框,列出代码中设置的断点。

OD(OllyDbg)使用教程

OD(OllyDbg)使用教程

精选课件
18
修改这一反汇编代码段,双击反汇编列后者按空格键, 键入NOP,点汇编
最后 F9运行,你会看到:
精选课件
19
下面就介绍一些分析常用的汇编代码含义:
MOV 传送字或字节 如MOV A B,就是将B中的字传给A
PUSH 把字压入堆栈
CALL 子程序调用指令
XOR 异或运算 所谓异或,就是两值不同,则为真,反之,为假
2
显示被调试程序的反汇编代 码
显示反汇编窗口中选中的第一 个命令的参数及一些跳转目标
地址、字串等
显示当前所选线程 的 CPU 寄存器内
容。
显示当前线程的堆栈
显示内存或文件的
内容。
精选课件
3
反汇编窗口的列中,双击的效果:
• 地址列:显示相对被单击地址的地址,再次 双击返回到标准地址模式; • Hex数据列:设置或取消无条件断点,对应 的快捷键是F2键; • 反汇编列:调用汇编器,可直接修改汇编代 码; • 注释列:允许增加或编辑注释,对应快捷键 是“;“键
精选课件
12
6、保存修改后的文件
图中红色的就是我们修改的地方,然后就点右键,复制到
文件,就可以保存当前的精修选改课件
13
我们现在来举个简答你的例子
破解TraceMe的注册码 操作步骤如图:
精选课件
14
首先当然要载入TraceMe,载入之后就会出现如下窗口
文件入口点
然后我们要找到GetDlgItemTextA函数,因为程序从文本框 中将内容读取出来,需要用到这个函数。我们就用Ctrl+G 打开跟随表达式的窗口,在里面输入函数名就可以跟踪到 函数名存在的地方
MOVSX 先符号扩展,再传送

使用OllyDbg从零开始Cracking

第4章-汇编指令之前的章节主要是理论知识,现在我们要在OllyDbg中实践一下,为后面打开基础。

OllyDbg中几乎所有的标志我都有考虑,如果你遇到了我没有给出的指令,你可以查阅更加全面的汇编指南。

NOP(无操作)运行这条指令不会对寄存器,内存以及堆栈造成任何影响,英文单词的意思是”无操作”,也就是说,它没有特殊的用途。

例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误,多余的空间将会被NOP填充。

适当数目的nop指令可以将其他指令完全替换掉。

下面使用OllyDbg重新载入CrueHead'а(CrackMe的作者)的CrackMe。

我们可以看到反汇编的源代码,如上图第一条指令是PUSH 0,占两个字节,在这条指令上面单击鼠标右键选择Assemble.或者直接使用快捷键-空格键,在弹出窗口的编辑框中输入NOP。

写入NOP指令后单击Assemble按钮。

这里我们可以看到OD设计的非常智能,考虑到PUSH指令占两个字节,OD会使用两条NOP 指令进行替换,而不是使用一条NOP进行替换。

现在,在原来PUSH 0的地方显示的两条NOP指令,单击F7,指令一条NOP指令,可以看到,这里只改变了EIP(保存了下一条要执行指令的地址)寄存器的值,并没有影响到其他寄存器,堆栈或者标志位。

现在我们需要在数据窗口查看这两个字节,它们的内存地址分别是401000和401001。

在数据窗口中,鼠标右键选择-“Go to”-“Expression”,输入你需要转到的地址。

这里我们需要输入401000。

红色突出显示的是刚刚修改过的字节。

前两个是90,然后E8,FF和04,00,00。

这是一个Call 指令的所有剩余字节。

OD可以撤销我们修改的指令吗?呵呵,当然啦。

在数据窗口或者反汇编窗口中,鼠标拖选中两个字节。

然后单击鼠标右键,选择“UNDO SELECTION”。

这样就恢复了原来的PUSH指令。

在数据窗口中的话,你就可以看到它原始的字节了。

[原创]OllyDbg实用技巧六则

OllyDbg实用技巧六则dOSKEY lEE关键词: OllyDbg、OD、技巧1、让跳转路径显示出来打开Options\Debugging Option。

弹出Debugging Option对话框,选择CPU页,选定“Show direction to jumps”、“Show jump path”和“Show grayed path if jump isnot taken”。

如此以来在Disassembler窗口就会显示跳转的路径了。

2、让OD显示MFC42.DLL中的函数如果程序是用MFC进行的动态编译,那么在OD中将只能显示MFC42.DLL中的函数为:00410E40 |. E8 43000000 CALL <JMP.&MFC42.#1576>1576是函数在MFC42.DLL中的序号。

打开Debug\Select import libraries,单击弹出的对话框中“Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序,你就可以看见函数名称变为:00410E40 |. E8 43000000 CALL <JMP.&MFC42.#1576_?AfxWinMain@@Y>IDA中分析出了来的东西一样了!呵呵,以后不用等待IDA的“细嚼慢咽”也可以轻松搞定MFC程序了。

其他的DLL类似,如果有序号,可以在VC的LIB目录中找到相关的.LIB文件,加到OD中便可。

如果你没有“MFC42.DLL”,你可以的到新论坛的下载区找,我已经上传到那里了。

3、让OD轻松躲过“ANTI-DEBUG”很多“ANTI-DEBUG”的程序都是在程序开始时来检查是否安装调试器的。

用这种特性我们可以轻松的用OD的“Attach”绕过检查部分。

如“X语言”,如果你哟内TRW2K/S-ICE/OD 直接加载它的话,程序回警告你安装了调试器并结束。

Ollydbg使用方法和技巧

OllyD‎b g的he‎l p-怎样‎开始调试(‎翻译)‎最简单的方‎法是启动O‎l lyDb‎g,点击F‎i le|O‎p en,然‎后选择你想‎调试的程序‎。

程序需要‎命令行参数‎输入对话框‎下方的文本‎栏。

重新‎开始调试最‎后一个程序‎的快捷键是‎C trl+‎F2,并且‎O llyD‎b g使用相‎同的参数。

‎你也可以‎点选历史记‎录。

把程序‎拖入Oll‎y Dbg也‎可以开始调‎试。

当然‎,当启动O‎l lyDb‎g时,你在‎命令行中也‎能指定被调‎试的程序名‎和参数。

比‎如:你可‎以创建桌面‎快捷方式指‎向Olly‎D bg,选‎择属性,到‎快捷方式,‎把程序名加‎入目标栏‎。

每次你双‎击这个快捷‎图标,Ol‎l yDbg‎自动装载被‎调试程序。

‎你可以a‎t tach‎Olly‎D bg到某‎个正在运行‎的进程。

点‎击File‎|Atta‎c h,从列‎表中选择‎该进程。

注‎意:当你关‎闭Olly‎D bg,这‎个进程也会‎终止。

不要‎试图att‎a ch系统‎进程,这‎很可能使系‎统完全SI‎机。

(事实‎上,大多数‎情况下,O‎S不允许a‎t tach‎敏感进程‎)Oll‎y Dbg能‎作为jus‎t-in-‎t ime ‎d ebug‎g er。

这‎需要在注册‎表中登记。

‎点击Op‎t ions‎|Just‎-in-t‎i me d‎e bugg‎i ng,在‎对话框中按‎“Make‎Olly‎D bg j‎u st-i‎n-tim‎ede‎b ugge‎r”。

现在‎,当一些程‎序崩溃,你‎会被询问是‎否调试它。

‎这样,操作‎系统可以‎启动Oll‎y Dbg并‎直接停在异‎常发生处。

‎如果你选择‎a ttac‎h ing ‎w itho‎u tc‎o nfir‎m atio‎n,Oll‎y Dbg不‎会询问直接‎启动。

要恢‎复原来的j‎u st-i‎n-tim‎ede‎b ugge‎r,在出现‎的对话框中‎按相应的按‎纽就行了。

使用OllyDbg从零开始Cracking 第二十一章

第二^一章-OllyDbg 反调试之检测OD 进程名,窗口类名,窗口标题名本章我们继续讨论反调试,将我修改过的一个CrackMe 作为本章的实验对象。

该CrackMe 的名字叫做buggers,其中做的一些修改是为了介绍检测OllyDbg 进程名的其他一些API 函数,同时该CrackMe 也涵盖 了检测OllyDbg 窗口标题名以及窗口类名等知识点。

我们打开原始的OllyDbg 程序,不使用重命名的,因为本章我们将对上一章的检测OD 的方法进行延伸,因此让OD 的文件名是OllyDbg.exe,保证该CrackMe 可以检测出来OD 。

我们用OD 加载该CrackMe,接着将HideDebugger1.23版插件的IsDebuggerPersent 选项勾选上。

这里只是为了防止该程序调用IsDebuggerPresent 对OD 进行检测。

我们打开原始的OllyDbg.exe,然后打开任务管理器,确保OD 的进程名为”O LLYDBG.EXE ,Archive Opciones Ver Apagar AyudaAplicaciones ProcesosRendimientoFunciones de red UsuariosNombre de imagen PID Nombre de us... CPU 1 Use de ...taskmgr.exe 3128 Ricardo 00 4.640 KB OLLYDBG.EXE 2680 Ricardo00 5.504 KB alg.exe2648 5ERVICIO LOCAL001.260 KB'nTi —.t,Pi i.—Fl Fl好了,我们回到buggers3,看看该程序使用了哪些API 函数。

or de tareas deows1314001 I33040013314001 5 3314001Follow in Dump View 匚all tree►Cfrl+KI Search for► Name (label) in current module Ctrl+N Find references to► Name in all modulesView►I,—'i —b m KVb -iV-ifAL+l■- l-L 匚HideDebugger 插件的配置如下:我的天啦!API 列表中居然只是唯一的一个函数ExitProcess,其他API 函数应该都是通过GetProcAddress 加载的,但是GetProcAddress 也不在该列表中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十三章-硬编码序列号寻踪-Part1
我觉得寻找序列号是最难的工作之一,特别是当我们遇到了强力的加密算法的时候,找序列号就更难了,我们先从简单的情况开始,慢慢的延伸到复杂的情况,逐步锻炼我们寻找序列号的能力。

这个部分我们专门讨论硬编码序列号,所谓的硬编码序列号就是不依赖于用户名来生成,总是由固定的字符和数字构成的固定不变的字符串,这种序列号通常比较容易找到,因此,我们从这种类型开始介绍,先看几个简单的,然后再看复杂的。

我们一共有4个练习的例子,本章是两个简单的例子,下一章是两个复杂点的例子。

首先第一个最简单的CrackMe名为Leccion_13_HARDCODED_1(原名称西班牙文,英文名称译为:Lesson_13_Hardcoded_1),我们用OD加载它。

作为最简单的硬编码序列号的例子,正确的序列号是作为全局字符串出现在程序中的,我们一起来看一看。

想要找到所有的全局字符串,我们在反汇编窗口中单击鼠标右键选择-Search for-All referenced text strings。

结果如下:
(Mal Muy MAL:西班牙文译为:错误)
这里,我们可以看到“FIACA”这个字符串,这个字符串可能就是序列号,但是我们不推荐在右侧的字符串列表中肉眼定位序列号,原因有二:
1.我们这个程序,只有两行,但是有的程序,有成千上万行,尝试肉眼逐一查找简直就是疯了,虽然当前这种情况,我们一眼就可以看出来正确的序列号,但是如果有千上万行的话,肉眼看就是不可取的了。

2.有些程序故意放置一些假的序列号在字符串列表中,当我们把这个序列号当做正确的序列号就恰恰中了作者的陷阱。

较为妥当的做法是检查序列号的正确性。

首先通过在反汇编窗口中单击鼠标右键选择-Search for-Name(label) in current module来查看API函数列表。

程序中用了一些API函数,其中有几个我们比较熟悉。

GetDlgItemTextA获取用户输入的序列号,MessageBoxA提示输入的序列号正确,错误与否。

我们给这两个API函数设置断点。

单击鼠标右键选择-Toggle breakpoint on import或者在命令栏中输入bp GetDlgItemTextA,bp MessageBoxA。

好了,按F9键,运行CrackMe。

(Verficar西班牙文译为:验证,Salir译为:取消)
我们在序列号窗口中随便输入一个人名,比如说narvajita。

单击Verificar(验证)按钮,可以看到断在了我们刚刚设置的断点处。

从堆栈中可以看出我们断在了GetDlgItemTextA处,该函数用于获取用户输入的序列号,并且该函数的Buffer参数是用于存放获取到的序列号的缓冲区首地址,这里,缓冲区的首地址为403010。

我们在该参数上单击鼠标右键选择-Follow in Dump定位到缓冲区在数据窗口中的位置。

当前缓冲区为空,因为该API函数还没有执行。

我们选择主菜单中项Debug-Execute till return执行到函数返回。

现在我们到了RET指令处。

该函数将用户输入的序列号保存到了缓冲区中。

我们按F7键单步返回到主程序中。

这里我们可以看到比较和条件跳转指令,两个分支分别为提示Mal Muy MAL(错误)的消息框和提示Muy BIEN(正确)的消息框。

很明显,401087是其中一个分支。

通常我们可以通过修改程序流程来达到爆破的目的,但是这里我们是要找到序列号,所以我们还是一起来看看程序是怎么比较的吧。

401066地址处的指令将403010地址处的DWORD内容保存到EBX中,我们在该语句上单击鼠标右键选择-Follow in Dump-Memory address定位403010在数据窗口中的位置。

提示窗口中我们可以看到7672616E,在403010开始的内存单元中是倒序存放的,(小端存储我们前面章节已经介绍过),这4个字节是错误的序列号,被保存到EBX中。

按F7键单步,来到下一条指令处。

这里,我们看到该指令将EBX(包含了我们刚刚输入的错误序列号的前4个字节)的值与403008内存单元中的内容进行比较。

跟之前操作一样我们在数据窗口中转到403008处。

我们可以看到该指令将”FIACA”的前4个字节与我们输入的序列号的前4个字节进行比较,如果它们是相等的,则零标志位Z被置1,然后跳转到提示”Muy BIEN”(正确)的消息框处,如果不相等的话,就提示”Mal Muy MAL”(错误)的消息框。

很明显它们不相等,所以会直接提示”Mal Muy MAL”(错误)的消息框。

我们按F9键运行。

我们断在了MessageBoxA处。

从参数我们可以看出是提示”Mal Muy MAL”(错误)。

我们按F9键运行起来。

正如你所看到的,弹出了错误消息提示框,我们单击”Aceptar”(确定)按钮,然后输入正确的序列号”FIACA”。

单击”Verificar”(验证)按钮,并重复上面的步骤,再次到达比较指令为止。

跟之前一样,EBX的值与403008内存单元的内容进行比较。

根据提示窗口来看,它们是相等的,零标志位置1,我们按F7键单步执行。

可以看到零标志位置1,所以JE指令将跳转。

跳转到了”Muy BIEN”(正确)的消息框处。

我们按F9键运行。

根据堆栈窗口中该API函数的参数可以看出将弹出提示正确的消息框。

虽然作者忘了修改窗口的标题,但是我们还是找到了正确的序列号,这个硬编码序列号的例子很简单。

这个例子是我朋友Redhawk写的,哈哈,他有点懒,连正确提示框的标题都没有改。

接下来一个CrackMe的提示框的标题做了修改。

我们用OD打开”Leccon 13 HARDCODED 2”。

这个例子和刚才那个例子非常的相似,但是正确的序列号并不在字符串列表窗口中。

并没有”FIACA”,嘿嘿。

是的,正确的序列号并不是”FIACA”
我们只能来到比较指令处。

我们在401064处下个断点,然后运行起来。

我们随便输入一个错误的序列号,这里我们输入LUCKY。

单击”Verificar”(验证)。

我们可以看到断在了我们刚刚设置的断点处,我们在数据窗口中定位40300C内存单元。

该指令40300C内存单元中4字节的内容保存到EBX寄存器中。

我们按F7键单步。

该指令将40204B内存单元中内容保存到EDX寄存器中,我们来看看40204B内存单元的内容是什么。

这里存放着4个字节的字符串”9898”,当我们输入的序列号前4个字节与”9898”相等的话,就跳转到正确的消息框处。

不相等的话,就提示错误的消息框。

我们重启OD输入正确的序列号”9898”。

单击”Verificar”(验证)。

当前EBX和EDX的值都是38393839,对应字符串”9898”,所以会跳转到提示”Muy BIEN”(正确)的消息框处。

我们可以看到,在这里我朋友把正确提示框的标题改成了”Bravo”(恭喜),哈哈,我们又找到了正确的序列号。

接下来的章节,我们将增加难度-两个相对难一点的硬编码序列号的CrackMe。

这里给一个练习的小例子,第3个CrackMe,名为”Mielecrackme1.zip”。

提供一点思路,关键API函数-lstrcmpA,这个CrackMe会直接进行字符串的比较。

你定位到了该函数以后,看看堆栈中函数参数情况。

接下来的第14章,我们再来介绍这个两个相对难一点的硬编码的例子,这里,大家先练习一下这第3个CrackMe吧。

相关文档
最新文档