[VIP专享]使用OllyDbg从零开始Cracking 第十三章-硬编码序列号寻踪-Part1
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

字符串。监察器[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窗口中或通过菜单中的“文件”选项来打开程序。
无论使用哪种方法,我们都需要找到目标程序所在的路径,并选择打开。
三、调试程序1. 设置断点:在ollydbg中,断点是一种被设置在程序中的暂停执行的标记点。
我们可以通过双击程序中的某一行代码或者在该行代码上点击右键,然后选择“Toggle Breakpoint”来设置断点。
设置断点后,当程序执行到该行代码时,会自动停止执行,方便我们进行调试。
2. 单步执行:在调试过程中,我们可以使用单步执行功能来逐行执行程序。
我们可以通过菜单中的“调试”选项,或者使用快捷键F7来进行单步执行。
单步执行可以帮助我们逐行分析程序的执行流程,以及观察变量的值的变化。
3. 查看寄存器和内存:在调试过程中,我们经常需要查看程序中的寄存器和内存的值。
ollydbg提供了寄存器窗口和内存窗口,可以方便地查看这些信息。
我们可以通过菜单中的“窗口”选项,选择“寄存器”或者“内存”来打开相应的窗口。
4. 分析代码:在调试过程中,我们可以使用ollydbg的反汇编窗口来查看程序的汇编代码。
我们可以通过菜单中的“窗口”选项,选择“反汇编”来打开反汇编窗口。
反汇编窗口可以帮助我们分析程序的执行流程,以及理解代码的逻辑。
5. 修改变量值:在调试过程中,我们可以通过ollydbg来修改程序中的变量的值。
我们可以在变量所在的内存地址上点击右键,然后选择“修改”,来修改变量的值。
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版本修改了⼀些内容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)使用教程

精选课件
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使用方法和技巧
OllyDb g的hel p-怎样开始调试(翻译)最简单的方法是启动Ol lyDbg,点击Fi le|Op en,然后选择你想调试的程序。
程序需要命令行参数输入对话框下方的文本栏。
重新开始调试最后一个程序的快捷键是C trl+F2,并且O llyDb g使用相同的参数。
你也可以点选历史记录。
把程序拖入Olly Dbg也可以开始调试。
当然,当启动Ol lyDbg时,你在命令行中也能指定被调试的程序名和参数。
比如:你可以创建桌面快捷方式指向OllyD bg,选择属性,到快捷方式,把程序名加入目标栏。
每次你双击这个快捷图标,Oll yDbg自动装载被调试程序。
你可以at tachOllyD bg到某个正在运行的进程。
点击File|Attac h,从列表中选择该进程。
注意:当你关闭OllyD bg,这个进程也会终止。
不要试图atta ch系统进程,这很可能使系统完全SI机。
(事实上,大多数情况下,OS不允许at tach敏感进程)Olly Dbg能作为just-in-t ime d ebugg er。
这需要在注册表中登记。
点击Opt ions|Just-in-ti me de buggi ng,在对话框中按“MakeOllyD bg ju st-in-timedeb ugger”。
现在,当一些程序崩溃,你会被询问是否调试它。
这样,操作系统可以启动Olly Dbg并直接停在异常发生处。
如果你选择a ttach ing w ithou tco nfirm ation,Olly Dbg不会询问直接启动。
要恢复原来的ju st-in-timedeb ugger,在出现的对话框中按相应的按纽就行了。
使用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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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吧。