扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
第3章 静态分析技术
第一节 基础知识
一、虚拟地址和偏移量转换
由于Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。与实地址模式下的分段地址类似,虚拟地址也可写成"段:偏移量"的形式,这里的段是指段选择器。
文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 9x中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。
相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。即:相对虚拟地址(RVA)=虚拟地址(VA)-基址(ImageBase)。
文件中的地址与内存中表示不同,它是用偏移量(File offset)来表示的。
在SoftICE和W32Dasm下显示的地址值是内存地址(memory offset),或称之为虚拟地址(Virual Address,VA)。而十六进制工具里,如:Hiew、Hex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 或物理地址(RAW offset)。
在实际操作时,使用 RVA-Offset之类的转换器很容易查出字串RVA和偏移量的值。
以Pc_offset(光盘\tools\offset)此工具为例说说如何将SoftICE下看到的虚拟地址(Virual Address,VA)转换成十六进制工具里的偏移量(File offset),运行该软件打开记事本程序,在Memory Address(内存地址)输入虚拟地址(Virual Address,VA)的值:40117D,点击"Do it"按钮将显示己转换成文件偏移量(File offset),如图一所示。
(图一)内存虚拟地址转换成文件偏移量
二、文件类型分析
文件分析是静态分析程序的第一步,通过相关工具显示欲调试文件的信息,如它是用什么语言写的,是否加壳等。常用的文件分析工具有TYP、Gtw或FileInfo。其中FileInfo(光盘\tools\file\File analysers)由于识别文件类型较多,使用方便,在这一节简单地讲讲它的用法。
FileInfo运行时是DOS界面,支持Windows长文件名,能识别DOS、NE、PE等各种文件类型和壳。
语法:fi <drive:\path\><*.*> </r> </f> </d-> </l+> </p+>
"fi /r"or "/s" 列出当前目录和子目录所有的文件信息;
"fi /f" 仅列出能识别的文件
由于每次要进入DOS窗口运行程序相当不便,在这可创建快捷方式,把要分析的文章复制到FileInfo目录下,用鼠标双击FileInfo主文件即可。FileInfo快捷方式如图二。在快捷方式中的命令行中可以键入相关参数,如:FI.EXE /l /p+,此后用鼠标双击FileInfo快捷方式,会自动分析出FileInfo当前目录内的所有文件,不包含子目录。
图二FileInfo快捷方式中命令参数配制
双击此快捷方式就可执行带参数的FileInfo,显示结果如图三所示。
图三 FileInfo分析文件的报告
在此例中,文件CHAP301.EXE被分析出是用VC6.0编译的, CHAP303.EXE文件类型是Win GUI,就是Windows图形用户界面程序(一般FileInfo分析不出类型就报此类型)。另外此工具也可分析出程序是被何种软件所加密的等。
第二节 W32Dasm简介
W32Dasm是一个强大的反汇编工具,操作简单,使用方便。通常被程序员使用,当然也可被用来Crack软件了,很适合Cracker使用。我在这把与crack相关的功能简述如下:
1.0 开始
1.1 运行W32Dasm,在这里以windows95自带的计算器为例:calc.exe。
1.2 从Disassembler(反汇编)菜单选择Disassembler Options(反汇编程序选项)选项将出现如下对话框:
1.3 在Disassembler(反汇编)菜单,选择Open File(打开文件)选项或按工具栏按钮
1.4 选择你要打开的文件就可。
注意:你反汇编文件后,如字符己超过屏幕外,这时你要选择合适的字体(在Font字体选项中Select Font选择字体),然后设为默认字体(Save Default Font)即可。 当然一般以默认值就可。
2.0 保存反汇编文本文件和创建方案文件(Save The Disassembly Text and Create A Project File)
略。
3.0 反汇编源代码的基本操作
3.1 转到代码开始(Goto Code Start)
在工具栏按或从菜单的转到(Goto)选项选择转到代码开始(Goto Code Start) 或按Ctrl S, 这样光标将来到代码的开始处,用户可通过双击鼠标或用shift+上下光标键改变光标的位置。
注:代码的开始处是反汇编代码列表清单汇编指令的开始,而不是代码运行的起点,程序运行的起点称为程序入口点(Program Entry Point)
3.2 转到程序入口点(Goto Program Entry Point)
在工具栏按或菜单的转到(Goto)选项选择 转到程序入口点(Goto Program Entry Point)或按F10,这样光标将来到程序入口点(Entry Point),这里就是程序执行的起始点,一般动态调试时LOAD时也就停在此处。
3.3 转到页(Goto Page)
在工具栏按或菜单的转到(Goto)选项选择转到页(Goto Page)或按F11,这时跳出一对话框,输入页数可跳转到相关页面去。
3.4 转到代码位置(Goto Code Location)
在工具栏按或菜单的转到(Goto)选项选择转到代码位置(Goto Code Location)或按F12,一个对话框将出现,充许用户输入代码偏移地址,以跳转到此位置上去。
3.5 执行文本跳转(Execute Text Jump)
这功能是在Execute Text(执行文本)菜单选项里的,执行跳跃(Execute Jump)功能激活条件是光标在代码的跳转指令这行上(这时光条是高亮度的绿颜色)。此时工具条Jump To按钮也激活。如图:
此时按或菜单选项Execute Jump(执行跳跃)或按右光标键,光条将来到跳转指令所指到的位置。在这例子里,将来到:004076CE xor eax,eax 这一行代码处:
如要返回到上一次跳跃,请参考3.6.
3.6 返回到上一次跳跃Return From Last Jump
这功能是在Execute Text(执行文本)菜单选项里的,此指令仅仅是在 执行文本跳转功能完成后才激活。当这条件成立时,按钮将激活。按或在菜单里选项返回到上一次跳跃(Return From Last Jump)或按左光标键,光条将返回到上一次跳跃位置处。
3.7 执行呼叫Execute Text Call
这功能是在Execute Text(执行文本)菜单选项里的,此功能激活的条件是光条在CALL指令一行。在这一行时光条将发绿,按钮将激活。执行时光条将会来到CALL所指的地址处。
如下图: 光条在0040751D call 004073D4 一行。
此时按或在菜单的执行呼叫(Execute Text Call)或按右光标键,光条将来到CALL所指的地址004073D4这一行。
如要返回到刚才起点的0040751D call 004073D4 一行,参考3.8的返回呼叫。
3.8 返回呼叫(Return From Last Call)
这功能是在Execute Text(执行文本)菜单选项里的,此指令仅仅是在执行呼叫Execute Text Call功能完成后才激活。当这条件成立时,按钮将激活。按或在菜单里选项返回呼叫(Return From Last Call)或按左光标键,光条将返回到上一次呼叫位置处。
3.9 导入功能(Imported)
在菜单功能选项里,其作用主要是查看import函数。按或在菜单功能选项里的导入(Imports)命令,执行后将列出当前文件的Import函数。
你可双击这些项目,光条将来到调用这些函数的代码处。
注意:如果代码多处引用了这些函数,你双击这个项目函数时,光条将在调用了其的几个位置代码处循环.
你也可用copy all或copy view复制import函数。
3.10 出口功能(Exported)
在菜单功能选项里,其作用主要是查看Export函数。按或在菜单功能选项里的出口(Exports)命令,执行后将列出当前文件的Exports函数。
注意:一般EXE文件没有exported,DLL文件有exported函数。
3.11 裁判(References)
在这个菜单选项里有菜单参考(MENU), 对话参考(DIALOG)or (串式数据参考STRING DATA),分别对应按钮:,或。
注意:其中(串式数据参考STRING DATA)功能破解时很常用。
4.0 复制汇编代码文本
W32dasm充许打印或复制指定行的汇编代码。首先你将鼠标移到W32DASM的最左边单击,将会出现一个小红点,再按住shift键,移到你需要的下一行,再单击鼠标一下,将选中一段,按CTRL+C复制或在菜单选项反汇编里的拷贝指定的行(Copy Lines of Text)功能或按,把数据复制到剪贴板里。如:
5.0 装载32位的汇编代码动态调试
5.1 反汇编windows自带的计算器程序 calc.exe.
5.2 选择菜单调试选项中的加载处理(Load Process),或按Ctrl+L.出现一个加载对话框,你可输入选项命令。现在你可按装载(load)按钮。
Calc.exe现在被W32DASM动态调试,将出现左右两个调试窗口(如下图),在初始化calc.exe程序后,指令将停留在入口点(Entry Point)处。
左边的调试窗口列出各种状态器如:CPU寄存器,CPU控制寄存器,断点,活动的DLL,段寄存器等等;
(左调试窗口)
(右调试窗口)
6.0 运行,暂停或终止程序
6.1 在右调试窗口,按运行(RUN)按钮或按F9,calc.exe将运行起来。
按暂停(PAUSE)按钮或空格键,程序将暂停,这在单步跟踪时经常用到。
按终止(TERMINAT)按钮,程序将停止,退出动态调试环境。
7.0单步跟踪程序
7.1 重新加载 calc.exe
7.2 在程序加载后,停留在入口点,你可按F7或F8单步调试程序,这两个键所不同的是F7是跟进CALL里,F8是路过。
7.3 进入自动调试按 (F5) 和结束自动调试按 (F6) 。
8.0设置激活断点
8.1 重新加载 calc.exe
8.2 在W32DASM的菜单转到选项转到代码处(goto code)功能,填上403198,按确定,你将在W32Dasm的主窗口(此时可能最小化了,把其还原即可)来到403198地址一行。光条在这一行显亮绿色,按F2或用鼠标左点击最左边(同时按住CTRL)设置断点。
这时如断点设置成功,光条最左边有一小段黄条,显示此行为断点。如下图:
如果断点不在这里,整行光条将是黄色的。
当断点设置好后,在左调试窗口中的断点小窗口显示断点情况(右边有一*):
此时按F2或(鼠标左键+CTRL),断点将取消。
8.3 此时按F9程序将运行到相关断点时停止。
9.0 偏移地址和虚拟地址转换
W32DASM、SOFTICE和Hiew(Decode模式)显示的地址都是虚拟地址,但是在Hiew(Decode模式)下,F5功能键查找的地址是偏移地址,因此必须将虚拟地址转换成偏移地址,才能找到正确的地址。常用的方法是在W32DASM下将绿色的光条移到某一行代码上 , 在窗口底部有一行字指示其偏移地址 , 如虚似地址:Code DaTa@0040534e而偏移地址为:@Offset 0000474Eh. 这就是偏移地址。
10.0 结束
第三节 IDA Pro简介
开始前
IDA Pro Avanced是一个极好的反汇编工具,它大的胜过了w32dasm。近来它的盗版已经在网上传播开了,你可以很轻松得到它。对于这方面的观点有如下几种:一些人认为这是好的,是自由的;而另一些人认为是可耻的,那些认为是可耻的人通常是这个软件的老用户,事实上他们买了那个程序,如果你花了$500买了那个程序的话,你就可以理解他们的反应了。 对于读者来说,你们做什么不是我的问题及我所关心的。而我的观点是如果认为非法的winzip软件同IDA Pro 4.0x一样好或坏。如果你使用非法的winzip,你就不应当使用非法的IDA Pro。
I 介绍 几天前我烈军属了一篇关于解密程序的教程,而这篇也是一个对于高效的,极好的IDA Pro 4.0x教程。通常菜鸟不喜欢,而高手又崇拜它。不喜欢的原因是因为IDA相对于w32dasm来说有更多的附加功能和作用,有更大的复杂性
在下面的教程中由于你过去可能喜欢使用w32dasm,我将尽力给出一个简单和清楚的解释来介绍如何使用IDA。也将试差回答"什么是最好的反汇编?"这里其实没有一个简单的回答。对于更多的高手来说可以读这个:向菜鸟100%解释IDA的使用过程。
II. IDA: 一个高效的反汇编工具
当你运行IDA Pro时,你所最先注意到的是它的界面比w32dasm更加专业,这里比w32dasm有更多的选项或更先进的地方。它的优点是可以更好的反汇编和更有深层分析。而缺点是使用IDA更困难。
实际上IDA同w32dasm有很多相同的功能:可以快速到达指定的代码位置;可以看到跳到指定的位置的jmp的命令位置;可以看参考字符串;可以保存静态汇编等。
现在让我们运行和反汇编一个小程序(我使用starclean.exe)一个窗口弹出来,那里有很多选项,不要动它,仅仅点击OK。让IDA来分析,当它结束后在name的选项中同w32dasm中参考字符串一样,查找"a"字符。在name窗口中搜索栏中按a,然后开始查找,一旦找到,按enter或双击它,它就将到达正确的位置。按ctrl+enter将到达下一个位置。参考字符串就在光标附近。IDA就可以到达相应的位置了。
另一个同w32dasm相同的:jmp和call参考在IDA也是有效的。在w32dasm反汇编的代码同IDA中相同的。
代码开始(w32dasm)
*
Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B50(C)
| :00403B5F 81FAFC000000 cmp edx, 000000FC :00403B65 0F8478010000 je 00403CE3
:00403B6B 8D8424B4000000 lea eax, dword ptr [esp+000000B4] :00403B72 6804010000
push 00000104 :00403B77 50 push eax * Reference To: KERNEL32.GetModuleFileNameA,
Ord:00E9h | :00403B78 8B2D88924000 mov ebp, dword ptr [00409288] :00403B7E 6A00
push 00000000 :00403B80 FFD5 call ebp :00403B82 85C0 test eax, eax :00403B84 7516
jne 00403B9C * Possible StringData Ref from Data Obj ->""
| :00403B86 BE206A4000 mov esi, 00406A20 :00403B8B 8DBC24B4000000 lea edi, dword
ptr [esp+000000B4] :00403B92 B905000000 mov ecx, 00000005 :00403B97 F3 repz :00403B98
A5 movsd :00403B99 66A5 movsw :00403B9B A4 movsb结束结束
代码开始(IDA Pro 4.0x)
00403B5F
loc_403B5F: ;CODE XREF: sub_403B00+50j 00403B5F cmp edx, 0FCh 00403B65 jz loc_403CE3
00403B6B lea eax, [esp+1B8h+var_104] 00403B72 push 104h 00403B77 push eax 00403B78
mov ebp, ds:GetModuleFileNameA 00403B7E push 0 00403B80 call ebp ;GetModuleFileNameA
00403B82 test eax, eax 00403B84 jnz short loc_403B9C 00403B86 mov esi, offset
aProgramNameUnk ;"<program name unknown>" 00403B8B lea edi, [esp+1B8h+var_104]
00403B92 mov ecx, 5 00403B97 repe movsd 00403B99 movsw 00403B9B movsb 代码结束
你在这里看到,IDA提供了更多的细节信息,它是更加清楚,用一个参考作为例子。
在w32dasm中如下:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403B50(C)
在IDA Pro中如下:
CODE XREF: sub_403B00+50j
IDA provides 使用更短的行来提供更多的信息。
1. 用一个jump (j)
2. jump到代码的位置位于00403B50 (=403B00+50)
3. 函数/call本身在403B00(403B00+50)
4. jump在.code section
如果参考的是一个call那么它将如下:
CODE XREF: sub_403B00+50p
另一个大的优点是IDA可以转换变量。你可以双击变量以找到它们保存的地址处: lea edi, [esp+1B8h+var_104]。
功能中最有用的之一是使用近似查找。很容易解释:IDA尽力记住寄存器所关联的库函数。如下:
代码开始 (IDA Pro)
004012D2
loc_4012D2: ;CODE XREF: sub_401280+5Fj 004012D2 movsx ecx, byte ptr [eax] 004012D5
push eax 004012D6 lea ebp, [ebp+ecx*2+0] 004012DA call edi ;CharNextA ;Return
a pointer to the next character in a
;string 004012DC cmp byte ptr [eax],
0 004012DF jnz short loc_4012D2 代码结束
代码开始(w32dasm)
*
Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004012DF(C)
| :004012D2 0FBE08 movsx ecx, byte ptr [eax] :004012D5 50 push eax :004012D6 8D6C4D00
lea ebp, dword ptr [ebp+2*ecx] :004012DA FFD7 call edi :004012DC 803800 cmp byte
ptr [eax], 00 :004012DF 75F1 jne 004012D2代码结束
你注意到它们的不同了吗?IDA将向解释每一件事情。
在IDA中另一个同w32dasm近似的是十分简单的,如:"Goto code location" 等同于在IDA"Jump - Jump to adress" . 或者 "Goto entrypoint" 等同于在IDA"Jump - Jump to entry point" .
那些就是在你了解IDA开始使用它前最为重要的东西。有时 ,IDA显示大量的"db",参考字符串,仅有代码。仅仅可以设好光标,按"c"键,IDA转换代码如下
开始 (在按'C'之前)
00401228
dd offset unk_406130 0040122C db 8Bh ;?0040122D db 35h ;5 0040122E dd offset
RegSetValueExA 00401232 db 6Ah ;j 00401233 db 1 ;00401234 db 6Ah ;j 00401235
db 0 ;00401236 db 68h ;h 00401237 dd offset aName ;"Name" 0040123B db 51h ;
Q 0040123C db 0FFh ;0040123D db 0D6h ;?0040123E db 8Bh ;?0040123F db 4Ch ;
L 00401240 db 24h ;$ 00401241 db 8 ;00401242 db 68h ;h 代码结束
开始 (在按'C'之前)
0040122C
mov esi, ds:RegSetValueExA 00401232 ;---------------------------------------------------------------------------
00401232 push 1 00401234 push 0 00401236 push offset aName ;"Name" 0040123B ;
--------------------------------------------------------------------------- 0040123B
push ecx 0040123C call esi ;RegSetValueExA 0040123E mov ecx, [esp+8] 00401242
push 100h 00401247 push offset unk_406030 0040124C ;---------------------------------------------------------------------------
0040124C push 1 0040124E push 0 00401250 push offset aCode ;"Code" 00401255 ;
--------------------------------------------------------------------------- 00401255
push ecx 00401256 call esi ;RegSetValueExA 00401258 mov eax, [esp+8] 0040125C
push eax 0040125D call ds:RegCloseKey 代码结束
IDA另一个优点(快速相加):
1. 能够对w32dasm无法反汇编的最难的软件进行反汇编(如加壳程序)
2. 能够以.asm .sym 和甚至是 .exe及其它文件形式保存
3. 压缩的静态汇编,可以节省大量的磁盘空间。
4. 可以重命名函数
5. 能够分析巨大的程序
等等.... ;-)
III. w32dasm??
你看完了后你现在可以自问"如果IDA这么好看,为什么我还要使用w32dasm?"下面就是对于这个的解释:
首先是速度,对于IDA来分析一个小程序是非常非常的快,但是如果分析一个大的exe它就要花费3个小时或更多的时间来全面分析exe。
其次,如果你对于一个指定的搜索,IDA将很慢的,而在w32dasm中在文本方面中搜索是很快的。
第三:当分析一个仅有简单的保护的程序时,w32dasm就为首选。因为你就不需要在IDA那些附加的功能了。
上面的三个因素可以说明一切了 :-) 如果你知道其它的使用w32dasm原因的话,请告诉我。
IV. 结束
又一个教程结束了。享受IDA and w32dasm以及所有.....享受研究和保持学习和继续研究和破解吧。不是为了解密,仅是文章,写下你的文章,传播你的知识。对于解密这是重要的来说。不要用于解密吧。
第四节 HIEW简介
一、Hiew的运行
在Hiew目录找到Hiew.exe,运行它,这时Hiew界面出现的是Hiew目录文件。
此时在屏幕底部的命令行有相关提示,对应的是功能键F(n),如按F1出现的帮助:
F2 - Hidden - 打开或关闭隐藏文件显示
F3 - Name - 按文件排序
F4 - Exten - 按扩展名排序
F5 - Time - 按文件时间排序
F6 - Size - 按文件大小排序
F7 - Unsort - 未分类排序
F8 - Revers - 反转排序
F9 - Files - 查看曾打开的文件历史
F10 - Filter - 设置过滤
Ctrl \ - 来到驱动器的根目录
Ctrl PgUp - 回到上一目录
Insert - 打开/创建文件
Alt-F1 - 选择驱动器
Al-tF2 - 选择驱动器
Alt-F4 - 重新读取目录文件
Ctrl-F(n) - 将当前目录路径保存
Ctrl-F(n+1) - 回到保存的目录中
回车键 - 可进入子目录或从子目录退出
二、Hiew的基本操作
1、参考上表操作打开你需要修改的文件。
2、此时按F1,屏幕又会出现相关的帮助信息。(在此略)
3、打开文件后,观察屏幕底部的4 (Mode),此时按F4,将出现一对话框,让你选择Text(文本), Hex(十六进制)和 Decode(反汇编)模式。
4、此时你可跟据需要选择相关的模式。在这我们以Decode(反汇编)模式为例,在此模式下,将出现汇编代码,你可修改这些代码。现在按 F3 (Edit)将进入编辑模式,按F5 (Goto)将跳到指定的地址(注:是偏移地址,具体请参考上一节W32Dasm的相关描述),按F7 (Search)是查找ASCII码或十六进制数据。
5、F3 (Edit)将进入编辑模式后,移动光标到相应的行,按F2或回车键,跳出一对话框,可修改汇编代码。修改好后,F9存盘(按回车后到下一行,再按ESC让对话框消失,然后按F9)。
第五节 拆解教程
破解工具:W32Dasm,Hiew;
1、思路提示:首先要试运行要破解的程序,了解其一些提示信息,如:文本/NAG屏/按钮等等.最重要的就是出错信息 .如: "Wrong serial.."记下,因为你在后面要用到它,你需要它来找到call出错messagebox的地方.当 W32Dasm反编译后你会看到一屏幕难懂的汇编码 .你还记得刚要你记下的那个message么? 此时单击在工具栏里的串式数据参考SDR (=String Data Reference).这个功能可是非常有用的.
在串式数据参考SDR中找到那个提示信息(它也许只显示了信息的一部分) ,此时双击它,来到相关代码处,再分析源代码。
2、运行crackme,输入假的序列号,点击CHECK,出现错误提示:"Incorrect try again!! "记下。
3、将crackmer备份一份,用W32DASM反汇编它。
4、一旦完成反汇编 , 点串式数据参考(string data reference)按钮 , 在列出的字符串列表中找到 : "Incorrect try again!! " 并双击它 . (注:如代码中有多处有此字串,你再次双击后,光标将出现在下一代码上)
5、关闭这个窗口回到主窗口 , 你应该能够看到下面这一行 :
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401595(C)
|
:004015AD 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"CrackMe"//错误提示窗口的标题
|
:004015AF 686C304000 push 0040306C
* Possible StringData Ref from Data Obj ->"Incorrect try again!!"//错误提示处,我们来到这一行
|
:004015B4 6874304000 push 00403074
:004015B9 8B4DE0 mov ecx, dword ptr [ebp-20]
6、现在你必须从这行起向上找 , 直到找到有这样的命令为止 :cmp,jne,je,test 等等 .
CMP = 比较 (如 CMP EAX, EBX) <- 比较EAX和EBX
JE = 如果相等就跳转
JNE = 如果不相等就跳转
JL = 如果小于就跳转
JLE = 如果小于等于就跳转
JA = 如果大于就跳转
JAE = 如果大于等于就跳转
JMP = 无条件跳转
7、注意这一行代码:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401595(C)
|
:004015AD 6A40 push 00000040
:00401595(C) 是代码位置而不是offset,表示指令由00401595一行跳转到此.此时你在利用菜单的转到代码位置功能或按shift+F12,在对话框中输入:00401595,你将来到此:
:00401585 8D4DE4 lea ecx, dword ptr [ebp-1C]
:00401588 51 push ecx
:00401589 8D55F4 lea edx, dword ptr [ebp-0C]
:0040158C 52 push edx
* Reference To: KERNEL32.lstrcmpA, Ord:02FCh
|
:0040158D FF1500204000 Call dword ptr [00402000]
:00401593 85C0 test eax, eax
:00401595 7516 jne 004015AD
8、此时你借助SOFTICE动态调试能很快找到序列号,在这我们今天用暴力法破解,注意 :
:0040158D FF1500204000 Call dword ptr [00402000]//真假序列号比较核心(调用函数lsrcmpa比较)
:00401593 85C0 test eax, eax//用eax当旗帜,如相等,则eax=0
:00401595 7516 jne 004015AD//如不跳转则注册成功
看明白了吗?要让程序接受任何注册码就只要把JNE (=不相等就跳)改成JE (=相等就跳).或把改成空指令nop(什么也不执行),这样前一各改法要注册就只能输入错误的注册码,后者可任意注册码。
9、将绿色的光条移到 :00401595 7516 jne 004015AD上 , 在窗口底部有一行字指示这句命令的偏移地址 , 此处为 @Offset 00001595h. 这就是应该修改的地方了 .
10、启动hiew, 打开crackme.exe,按 F4 然后选择 decode mode, 按 F5 输入偏移地址1595(@Offset 00001595h). 你应该看到下面这几行 :
00401593: 85C0 test eax,eax
00401595: 7516 jne .0004015AD
11、这就是修改的地方了,按F3进入修正状态,在机器码处直接用7416代替7516,按F9存盘。或在这一行按F2或回车进入小汇编修改状态,输入正确的指令。
12、第二种修改方法是用两个NOP指令(NOP指令机器码是90,是一个字节)代替机器码:7516,即改为:9090
13、运行 crackme, 随便输入几个字符试试 . 成功了 ! (当然这只是对那些简单的程序有效)
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。