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常用API断点非常实用

OllyDBG常用API断点非常实用

OllyDbg常用断点以前收集的资料,不知道作者是谁了。

很抱歉!--liuyunagangOD常用断点常用断点(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位)GetModuleFileNameAGetFileSizeSetfilepointerfileopenFindFirstFileAReadFile拦截驱动器:bp GetDriveTypeA 获取磁盘驱动器类型bp GetLogicalDrives 获取逻辑驱动器符号bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径 ★★VB程序专用断点★★文件长度:RtcFileLenbp __vbaFreeStr 对付VB程序重启验证bp __vbaStrCmp 比较字符串是否相等bp __vbaStrComp 比较字符串是否相等bp __vbaVarTstNe 比较变量是否不相等bp __vbaVarTstEq 比较变量是否相等bp __vbaStrCopy 复制字符串bp __vbaStrMove 移动字符串bp MultiByteToWideChar ANSI字符串转换成Unicode字符串bp WideCharToMultiByte Unicode字符串转换成ANSI字符串=============== ================密码常用中断Hmemcpy (win9x专用)GetDlgItemTextAGetDlgItemIntvb:getvolumeinformationavbastrcomp (trw)Bpx __vbaStrComp (记得是两个 ’_’)MSVBVM60!_vbastrcomp|soficeMSVBVM50! |VBAI4STRCtrl+Dbpx msvbvm60!__vbastrcomp do "d *(esp+0c)"(softice)按几次F5出册码出来了。

外挂编写必备工具2OllyDBG (OD)入门系列

外挂编写必备工具2OllyDBG (OD)入门系列
00440F6B |. E8 F8C0FFFF CALL CrackMe3.0043D068
00440F70 |. EB 32 JMP SHORT CrackMe3.00440FA4
00440F72 |> 6A 00 PUSH 0
OllyDBG中各个窗口的功能如上图。简单解释一下各个窗口的功能,的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。
ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于SoftICE中的F11)
外挂编写必备工具2——OllyDBG(OD)入门系列2
OllyDBG入门系列(二)-字串参考
上一篇是使用入门,现在我们开始正式进入破解。今天的目标程序是看雪兄《加密与解密》第一版附带光盘中的镜像打包中的CFF Crackme #3,采用用户名/序列号保护方式。原版加了个UPX的壳。刚开始学破解先不涉及壳的问题,我们主要是熟悉用OllyDBG来破解的一般方法。我这里把壳脱掉来分析,附件是脱壳后的文件,直接就可以拿来用。先说一下一般软件破解的流程:拿到一个软件先别接着马上用OllyDBG调试,先运行一下,有帮助文档的最好先看一下帮助,熟悉一下软件的使用方法,再看看注册的方式。如果是序列号方式可以先输个假的来试一下,看看有什么反应,也给我们破解留下一些有用的线索。如果没有输入注册码的地方,要考虑一下是不是读取注册表或Key文件(一般称keyfile,就是程序读取一个文件中的内容来判断是否注册),这些可以用其它工具来辅助分析。如果这些都不是,原程序只是一个功能不全的试用版,那要注册为正式版本就要自己来写代码完善了。有点跑题了,呵呵。获得程序的一些基本信息后,还要用查壳的工具来查一下程序是否加了壳,若没壳的话看看程序是什么编译器编的,如VC、Delphi、VB等。这样的查壳工具有PEiD和FI。有壳的话我们要尽量脱了壳后再来用OllyDBG调试,特殊情况下也可带壳调试。下面进入正题:

ollydbg汇编指令

ollydbg汇编指令

OLLYDBG汇编指令OllyDbg是一款在Windows平台上广泛使用的调试器,主要用于逆向工程和漏洞分析。

在使用OllyDbg进行反汇编和调试时,掌握常见的汇编指令是至关重要的。

以下是一些常见的x86汇编指令以及它们在OllyDbg中的使用和解释。

1.MOV - 数据传送指令assemblyMOV destination, source描述:用于将源操作数的内容传送到目标操作数中。

示例:assemblyMOV EAX, DWORD PTR DS:[ESI]将DS段中ESI偏移处的32位数据传送到EAX寄存器。

2.ADD - 加法指令assemblyADD destination, source描述:将源操作数的值加到目标操作数上。

示例:assemblyADD ECX, 5将ECX寄存器的值加上5。

3.SUB - 减法指令assemblySUB destination, source描述:从目标操作数中减去源操作数的值。

示例:SUB EDX, 10将EDX寄存器的值减去10。

4.CMP - 比较指令assemblyCMP operand1, operand2描述:比较两个操作数的值,但不修改它们。

示例:assemblyCMP EAX, EBX比较EAX和EBX的值。

5.JMP - 无条件跳转指令assemblyJMP destination描述:无条件跳转到指定的目标地址。

示例:assemblyJMP 0x401000无条件跳转到地址0x401000。

6.JE/JZ - 条件跳转指令assemblyJE destination描述:如果前一次比较为相等,则跳转到指定的目标地址。

示例:assemblyJE 0x401000如果上一次比较相等,就跳转到地址。

7.CALL - 调用指令assemblyCALL destination描述:调用指定地址处的函数或子程序。

示例:assemblyCALL 0x401020调用地址0x401020处的函数。

ollydbg的使用教程

ollydbg的使用教程

ollydbg的使⽤教程教程四:OllyDbg的使⽤(下)⼀、简介此次教程我们继续学习Olly的使⽤。

我们将继续使⽤上⼀章的程序(我也会将它包含在下载⾥)。

你可以在tutorials中下载⽂件和PDF版的教程。

⼆、DLLS就像我前⾯说的,当你启动程序时,DLL被系统载⼊器载⼊。

这回我会细致的讲解。

DLL (Dynamic Link Libraries)是函数的集合,通常由Windows提供(当任何⼈都可以提供),其中含有很多Windows程序要⽤的函数。

这些函数可以让程序员更容易的完成⼀些乏味的重复性的任务。

例如,将字符串全部转换成⼤写是许多程序要实现的功能。

如果你的程序要多次使⽤该功能的话,你有三个选择:⼀是在你的程序中⾃⼰编码实现;问题是,你不知道你的下⼀个程序是不是也会⽤到该功能很多次。

你可能需要在你使⽤到的程序⾥复制粘贴很多次相同的代码。

⼆是创建⼀个⾃⼰的库,这样任何程序都可以调⽤。

这种情况下,你可以创建⼀个DLL,然后包含在程序中。

该DLL可能有像convertToUpper这样的通⽤函数以便于程序调⽤,因此你只需要写⼀次代码就⾏了。

这样做的另⼀个好处是,你可以说你为字符串转⼤写想到了⼀个很好的优化⽅案。

第⼀个例⼦中,你需要将代码拷贝到所有要⽤到该代码的程序中,但是在那个通⽤DLL例⼦中,你只需要修改DLL的代码,然后所有使⽤该DLL的程序都可以以最快的速度获益。

爽吧!这就是DLL产⽣的真正原因。

最后⼀个选择是,使⽤Windows提供的⼀堆DLL中包含的数千个函数中的⼀个。

这样做有很多好处。

第⼀个是,Microsoft的程序员已经花了多年时间来优化他们的函数,他们在很⼤程度上要⽐你⽜逼。

第⼆,你不需要将你的DLL包含在应⽤中,因为Windows操作系统已经内建了这些DLL。

最后,如果Windows决定修改他们的操作系统,你⾃⼰的DLL有可能和新系统不兼容。

同时,如果你使⽤Windows的DLL,它们肯定是兼容的。

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对话框,列出代码中设置的断点。

OllyDbg实用技巧六则

OllyDbg实用技巧六则
F8单步一下,切换到“MessageBox”中,确认,被OD中断。我们可以看见上面的代码41201F
处有一个“〉”,说明可以从某段代码跳转到此处,我们选择41201F这一行,在
“Information”栏看见一句“JUMP FROM 412003”,右键单击,选择“GO TO JUMP FROM
00412021 |. FF75 08 PUSH [ARG.1] ; |Text
00412024 |. FF75 F4 PUSH [LOCAL.3] ; |hOwner
00412027 |. FF15 A8534100 CALL DWORD PTR DS:[4153A8] ; \MessageBoxA
字节的移动。可以很有效的识别出花指令的所在。
后记
本人脑袋不太好使,一时记不起所有内容,以后想起来再贴。转贴时请保持本文的完整。
***坎坷亦乐园 版权所有***
【关闭窗口】
直接加载它的话,程序回警告你安装了调试器并结束。但是我们在“X语言”开启后再运行
OD,并用“Attach”系上它就就可以了,轻松通过检查。而且在OD系上它后仍然可以用
CTRL+A进行分析。如此一来,快哉!:)
4、轻松对付调用“MessageBoxA”以及类似的模态对话框的程序
“Size of run track buffer(byte/record)”,缓冲区大小,当然约大约好。其他的设置
在我以前的OLLYDBG.INI中都已经设置好了。然后,开启目标程序,在DEBUG中选择“Open
or clear run track”。然后我们就可以用CTRL+F11或CTRL+F12开启“Track into”和“

Ollydbg使用方法和技巧

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,在出现‎的对话框中‎按相应的按‎纽就行了。

OD脚本编写资料与示例

OD脚本编写资料与示例

3.1.1 保留变量
源操作数不目的操作数迚行逻辑不操作,并将结果保存到到目的
------------------------
操作数中。
$RESULT
例:
-------
and x, 0F
//x=x&&f
<RESULT>
and eax, x
//eax=eax&&x
保存某些函数的返回值,比如 FIND 函数,等等。
的字节大小。
------------------------------------------
例:
<BreakPoint>
bprm 401000, FF
//在 401000 中设置内存读断点,内存中
在指定地址设断点
的大小为 FF
例:
bp 401000
//在 401000 处下断点
BPWM 地址, 大小
AI
返回结果放到 $RESULT
----------------------------
例:
<Animate Into>
itoa "F"
//字符串"F"转成了整型,结果会等于 F
itoa "10", 10.
//字符串"10"代表十迚制,结果会等于 A
BPMC
------------------------------------
16 位寄存器 (AX, BX, CX, DX, SI, DI, BP, SP)
8 位的寄存器(AL, AH, ... DL, DH)
AN 地址
- 被中括号括起来的内存地址 (例如:[401000] 指向内存地址为 ----------------------------------

使用OllyDbg从零开始Cracking 第四十章-OllyDbg脚本的编写

使用OllyDbg从零开始Cracking 第四十章-OllyDbg脚本的编写

第四十章本章在修复PELock的IAT,AntiDump之前,我们先来讨论知识点,第一个知识点我们上一章已经碰到了,只不过没有展开讲而已,第二个知识点就是如何绕过PELock或者类似软件对硬件断点的检测。

知识点1在上一章节我们遇到过,大家可能没有在意,大家是否还记得上一章节中,OD加载目标程序以后,直接运行起来会弹出一个错误框,提示不知道该如何处理xxx处的非法指令。

为了解决这个问题,我们需要用到Patched4这个程序(又一个打过补丁的OD),我们将其置于原OD所在的文件夹中,因为原版OD 在处理非法指令的时候有个BUG,就算我们勾选上调试选项中的忽略非法指令异常,当OD遇到非法指令的时候还是会弹出一个错误框,Patched4这个OD修复了这个BUG。

大家将Patch4这个OD跟原版OD放到同一个文件夹下面,下面我们分析PELock的时候需要用到。

好,再来给大家解释一遍(PS:老外比较细心,也比较啰嗦,嘿嘿)。

原版OD处理非法指令的时候有个BUG,勾选上调试选项中忽略非法指令异常,加载UnPackMe_PELock1.06,接着运行起来。

我们可以看到弹出了一个错误框,但是我们用Patch4这个OD来加载UnPackMe_PELock1.06的话,就可以完美运行。

我们来看看日志信息。

我们可以看到最后一次异常是一个非法指令异常,现在我们不勾选的忽略非法指令异常选项。

这里我们去掉Invaild or privileged instruction这个选项的对勾,加载UnPackMe_PELock1.06,运行起来。

断在了异常处,如果我们按Shift + F9也可以继续运行下去。

也就是原版OD是就算你勾选了忽略非法指令异常这一项,OD并没有自动忽略。

如果是仅仅有一个这类异常,我们按一下Shift + F9也没什么。

但是如果目标程序会产生200或者300个这样的异常,难道我们也手工去按Shift + F9不成(PS:连续按Shift + F9 200多次,那还不得疯掉哇,哈哈)。

OD(OllyDbg)使用教程

OD(OllyDbg)使用教程
注意:这里又回到TraceMe的领空了
我们可以按Alt+B调出断点窗口,然后将GetDlgItemTextA的断点改为已禁止
接下来就在004011AE下一个断点,因为这里有调用到 GetDlgItemTextA这个函数
然后就要开始分析这些汇编代码的意义,所以,我们在使 用这个软件的时候,一定要明白这些代码的含义,现在我 们只是先认识一下这个软件的作用,所以就不为大家做出 分析,接下来就是修改代码了。其实我们要是分析下来, 可以发现,其实问题就在于一个代码行--004011F5
工具介绍 OllyDbg调试器
什么是OllyDbg?
OllyDbg简称OD,是一款具有可视化界面的用户模式调试器,结合了动 态调试和静态分析,具有强大的反汇编引擎,能够识别数千个被C和 Windows所使用的函数,并能将其参数注释出,能自动分析函数过程、 循环语句、代码中的字符串等。
显示被调试程序的反汇编代 码
上面是我的总结,大家可以大致的了解一下,有什么 不清楚的地方,可以过来跟我交流。共享的文件里面 还有教程,大家可以根据里面的教程,做更深入的学 习。还有很多汇编代码的含义没有介绍,共享文件里 面有完备的代码解释,可以好好看看,参考参考。
以上有不当之处,请大家给与批评指正, 谢谢大家!
22
注意:此时的领空是模块USER32,领空就是在
某一时刻,CPU的CS:EIP所指向代码的所有者
领空
接着,在USER32的领空中,在77D6B05E代码行按下F2, 下断点,然后按F9运行,然后键入下图所示:
点check,可以看到程序被OD截停在下断点的地方,如图所示: 接着,按Alt+F9,返回到用户代码,可以回到:
调试中我们经常要用到的快捷键有这些:

OllyDBG技巧 OllyDBG-快捷键命令

OllyDBG技巧 OllyDBG-快捷键命令
mov eax,401000 //此行按回车,则数据窗口中显示401000 数据
mov eax,[401000] //此行按回车,则数据窗口中显示401000 数据
mov [ebp-4], esp //此行按回车,则数据窗口中显示ebp-4的值(注意EIP必须指向当前行)
0012FF48 00000000
5).数据窗口选择数据显示
当光标在数据窗口移动时,会显示出光标起始地址、结束地址,以及选中的块大小。
6).数据窗口切换到代码窗口
00406000 00 12 40 00 00 00 00 00 00 00 00 00 CA 2E 40 00 . @.........?@.
^
光标移到“00 12 40 00”第一字节00处,按Ctrl+双击鼠标,则反汇编窗口显示光标所在地址,即00406000开始的代码
7).反汇编窗口或数据窗口取当前地址
快捷键:ctrl+X
例如:
A:
多半是杀毒软件(如卡巴对 LoadLibraryA)Hook API入口代码进入ring 0了,OllyDbg不能单步跟踪,这种情况下只要看堆栈返回地址,在返回地址上下端点,F9执行就可以了。(cyclotron回答)�
A:直接在反汇编代码区更改,这时可以使用汇编代码更改,然后选中修改后的汇编代码,右击-->复制到可执行文件-->保存文件.
Q:OD中的代码乱码,如:
004365E0 >db 68 ; CHAR 'h'
004365E1 >db A4
004365E2 >db 7A ; CHAR 'z'
004365E3 >db E5

从零开始的程序逆向之路基础篇第二章——用OllyDbg(OD)分析一个简单的软件

从零开始的程序逆向之路基础篇第二章——用OllyDbg(OD)分析一个简单的软件

从零开始的程序逆向之路基础篇第⼆章——⽤OllyDbg(OD)分析⼀个简单的软件作者:Crazyman_Army原⽂来⾃:0x00知识回顾 (由于笔者省事,没开XP虚拟机,⽽且没关闭ASLR,所以每次重载的内存地址会不⼀样)在第⼀章的内容中,笔者已经讲了OllyDbg(简称OD)的界⾯介绍以及基础的操作,普及了常⽤的汇编指令上次课在底下的附件中,我留下了⼀个演⽰样例,⼤家载⼊OD后搜索到字符串点击跟踪到反汇编窗⼝的时候会发现与第⼀章所讲的程序的框架不太⼀样.尤其可见多出了很多的call指令,call指令在汇编中就是调⽤⼦程序,下⾯放出代码,各位同学可以⽐对⼀下与上篇⽂件所贴出代码的不同代码如下:#include <windows.h>#include <tlhelp32.h>#include <stdio.h>BOOL getProcess(const char *procressName);BOOL getProcess(const char *procressName){char pName[MAX_PATH];strcpy(pName, procressName);CharLowerBuff(pName, MAX_PATH);PROCESSENTRY32 currentProcess;currentProcess.dwSize = sizeof(currentProcess);HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcess == INVALID_HANDLE_VALUE){printf("CreateToolhelp32Snapshot()调⽤失败!\n");return FALSE;}_asm NOP;BOOL bMore = Process32First(hProcess, ¤tProcess);while (bMore){CharLowerBuff(currentProcess.szExeFile, MAX_PATH);if (strcmp(currentProcess.szExeFile, pName) == 0){CloseHandle(hProcess);return TRUE;}bMore = Process32Next(hProcess, ¤tProcess);}CloseHandle(hProcess);return FALSE;}int main(){char* process = "explorer.exe";if (getProcess(process)){printf("发现explorer.exe\n");system("pause");exit(0);}else{printf("没有发现explorer.exe\n");printf("Cracke Success!");}getchar();return 0;}从代码⾓度来看,很明显,这次笔者讲判断进程封装成⼀个返回布尔值的函数,所以才会在核⼼判断部分出现如此多的调⽤,那这当然不能像上次⼀样改⼀步简单的跳转就解决问题,如果改得不对就会造成程序的崩溃。

第四卷 OllyDBG 插件系列 第三篇 ODbgScript的脚本命令

第四卷 OllyDBG 插件系列 第三篇 ODbgScript的脚本命令

第四卷 OllyDBG 插件系列第三篇 ODbgScript的脚本命令(2)(图) 安全中国 更新时间:2008-09-30 01:04:22 责任编辑:池天作者: hnhuqiong4.流程控制类我曾经教过一个小DD写脚本,他老是把OD的运行流程和ODbgScript的流程搞混淆了,这个概念要弄清除,作为新手常常弄不清这两个概念,而这两个概念是必须要弄明白的!要知道ODbgScript是一个脚本插件,它执行脚本的流程,靠脚本运行过程中各种返回值/计算值判断后,修改/控制/影响OD的流程.还是打个比方吧:ODbgScript是铁路传感/信号/道岔控制系统,OD就是列车,而各种返回值就是各种信号灯和传感器,列车的运行过程中,传感器系统不断的给出列车的各种运行状态,而ODbgScript就根据这些运行状态来调相应的运行时刻表让列车在控制的范围内运行.那么ODbgScript控制道岔系统就完成了一趟完整的调度系统. 大家都坐过火车吧??你喜欢的是打着信号灯的铁道工人?还是现代化的排灯/道岔控制系统???对应上一章的中断系统,我们又换概念打比方了(呵呵,对于新手我还是感觉自己有自己的一套办法来教大家弄清这些的),断点在这里就是在铁轨上的信号灯,传感器它感受到了列车(OD)到这里了,马上给控制系统(ODbgScript)发回信号,控制系统知道列车在什么位置后,相应的控制---信号灯/道岔系统,列车就乖乖的听从我们的调度来运行了.脚本其实就是列车时刻表!!!而脚本内的标号就是所管理的机务段! 邓爷爷说:实现四个现代化,靠的是科技!hnhuqiong说:OD逆向实现自动化,靠的是ODbgScript! (被愤怒的群众痛殴中!!!)-----ODbgScript流程控制类EOB :在下次中断发生时,跳转到指定标签处COB :发生中断后,让脚本继续执行(移除EOB指令)EOE :在下次异常发生时,跳转到指定标签处COE :发生异常后,让脚本继续执行(移除EOE指令)JA :大于则跳到指定标签处,在cmp命令后使用JAE :大于等于则跳到指定标签处JB :小于则跳到指定标签处,在cmp命令后使用JBE :小于等于则跳到指定标签处JE :等于则跳到指定标签处JNE :不等于则跳到指定标签处JMP :跳转到指定标签.PAUSE :暂停脚本运行RET :退出脚本-----OD流程控制类RUN :相当于在OllyDbg中按 F9GO :执行到指定地址处 F4ESTI :相当于在OllyDbg按 SHIFT-F7ESTO :相当于在OllyDbg按 SHIFT-F9STI :单步步入,相当于在OllyDbg中按 F7STO :单步步过,相当于在OllyDbg中按 F8RTR :相当于在OllyDbg中执行 "Run to return"操作 [Ctrl+F9]RTU :相当于在OllyDbg中执行 "Run to user code"操作 [Alt+F9]AI :在OllyDbg中执行“自动步入” [Animate into]操作 [Ctrl+F7]AO :在OllyDbg中执行“自动步过” [Animate over]操作 [Ctrl+F8]TI :相当于在OllyDbg中执行 "Trace into" 操作 [Ctrl+F11]TO :相当于在OllyDbg中执行 "Trace over" 操作 [Ctrl+F12]TICND :执行 "Trace into" 操作,直到条件为真时停止TOCND :执行 "Trace over" 操作,直到条件为真时停止TC :关闭TraceLBL :在指定地址处插入一个标签现在大家明白了ODbgScript可以给我们带来多少便利了吧????概念恐怕大家已清楚了,就不多讲解了. 其实,这些都是自动控制专业范围内的东西,刚好我本科是这个专业,所以比较轻车熟路. :)现代化社会这些自动控制无所不在,只是你用上了却不一定留心它!用一个复杂一点的脚本示意图我们简单的来进行类比,让大家牢牢记住它的(感谢FLY的FSG V1.X-2.X 脚本)5.计算和寄存器操作类有了刚才的概念,那么这里的计算概念就好办了,这些都是ODbgScript内的计算.这里就不多讲解了.就是现在命令有点少,我争取在下一个版本加多命令,这样调度起来不至于不会计算了,只好上铁轨手工操作了..INC :对变量进行加一操作ADD :源操作数与目的操作数相加,并把相加的结果保存到目的操作数中DEC :对变量进行减一操作SUB :和汇编里的sub一样,两个数相减AND :源操作数与目的操作数进行逻辑与操作,并将结果保存到到目的操作数中XOR :源操作数与目的操作数进行异或操作,并将结果保存到到目的操作数中OR :源操作数和目的操作数做逻辑或操作,并将结果保存到到目的操作数中SHL :左移目的操作数,n比特位;并将结果保存到到目的操作数中SHR :右移目的操作数,n 比特位;并将结果保存到到目的操作数中CMP :比较目的操作数与源操作数的大小,和其对应的汇编指令作用相同, 现支持字符串比较REV :字节反转.MOV :将源操作数移动到目的操作数中6.字符串操作类LEN :获得字符串长度FIND :从指定地址开始在内存中查找指定的内容FINDOP :从指定地址开始查找指定一个指令,这个指令是以指定内容为开始的FINDMEM :全内存中查找指定的内容ATOI :转换一个字符到整数,返回结果保存到保留变量$RESULT中ITOA :字符串进制转换EVAL :计算含义变量的表达式EXEC/ENDE :对当前调试进程,执行在EXEC和ENDE之间的指令FILL :从指定地址处,填充指定长度的值REPL :在指定地址开始,在指定长度字节内,用“替换字符串”替换“查找字符串”SCMP :比较字符串,目的和源比SCMPI :比较字符串,只不过是源和目的比PREOP :获得当前地址的汇编指令REF :交叉参考OPCODE :反汇编当前指令这里是一个很强技术概念类的类,为什么这样说呢?因为完全靠系统信息来定位断点是远远不够的,那么我们必须寻找程序内的"特征代码串",这个和杀病毒软件是一个概念,杀病毒软件是怎么干活的??就是搜索内存,找各个程序的可疑的"特征字符串或者特征码".和人的DNA一样,各个程序的DNA是不同的但又有相同的地方这就是亲子鉴定中心赚钱的秘方 :).从逆向角度来说,某个系列的加壳,加密软件它有它的一贯性,因为它的开发架构已经定死了,除非它大规模推倒从来.这里我就自己创造一个叫法叫"程序的DNA"吧,这个不是我提出来的,很多大侠早就提出了这个概念,比如FLY的"特定码",OPcode其实就那么多,但是就是这些,简简单单的OPcode就组成了千千万万的程序,但有些东西是具有一贯性的,这个和生物学上的遗传概念一模一样.药剂学上有一个东西叫生物试剂,就是利用生物的特定DNA来检测的.一旦我们找到某个"程序的DNA",那么很多东西就简单多了,大侠级别的就是"程序DNA试剂工厂",他们能够通过他们长年累月的积累总结出了大量的"程序DNA特征"检测手段,并且能够敏感的捕捉到新的"程序DNA特征",这些才是逆向水平高低的所在.为什么呢会这样呢?因为程序必须某时某刻要干某件事,这就注定了它的死结,大侠们能一眼就看明白这段OPcode它是在干什么(这需要长年累月的积累),你要动态解码,那么你解码的一小节就是你的命门,你要ANTi,你anti前必须做准备工作,这个准备工作就是命门等等诸如此类.你要干什么,我就在你要干什么前定位你的"特征码",在你干什么前把你的手段给残废了(大侠们够残忍了吧?呜~~~我的ANTI,我的解码)这就是矛和盾永远可以斗争的地方,我anti你,你定位我的ANTI,好,那么我要动态解码后才ANTI,大侠就盯上你的动态解码的回写内存,我把我动态解码一段花了,那么,我用花特征分离出你的花.........逆向反ANTI的手段就是在你动手前我先动手!!!!这叫先发制人,一招快,招招快!!!!可怜程序它必须按照列车时刻表来跑,最搞笑的是脱壳领域,有的大侠懒得理哪些大规模的ANTi了不费哪个劲脱你了,就干脆写个小东西Loader带跑.穿透壳后用特征码一步步定位后patch掉,何必处处脱呢........这里,我说了一通,大家可以看图一,第20行命令find eip,#fe??0f84#, 这个句话的含义就是寻找特征字符串fe??0f84,而这个特征字符串是什么含义呢,??代表的是可以是Hex任何数, 说明被2.0版FSG保护程序在第一次运行系统函数LoadlibraryA后,从这里取出ESP 指针所指的内存地址,下断点后,就会出现了这个特征字符码.这个是2.0版特有的.大侠们发现了它的这个特征码.它出一定会出现在被FSG2.0保护程序经过上面运行步骤后的某个内存地址中.大家是不是有点豁然开朗的感觉??我们来分析一下轰动一时的特征串:00B2C27C 68 A78FC31F PUSH 1FC38FA7f9,改eip00B7266A CALL 00B7267C68A78FC31F就是在程序还没有启动运行的时候,就存在的一个特征字符串,它存在于加载到内存后的地址00b2c27c上,大侠发现了它的这个BUG,就是在00b2c27c处,直接将列车扳道岔到00b7266a上,火车一下子变轨到b7266a处,从而跳过了themida的验证.我们用脚本来实现这个思想是什么样的?var bugaddress1var bugaddress2find eip,#68A78FC31F# //查找"特征字符串"mov bugadr1,$RESULT //保存查找到的地址bphws bugaddress1,"x" //给bugaddress1处信号灯传感器系统下命令(断点)run //列车放行,会被bugaddress1处的信号系统命令停下来bchwc bugaddress1 //信号灯系统复位,但列车还是停在原位等待放行 :)mov bugaddress2,b7266a //将b7266a的地址给变量mov eip,bugaddress2 //扳轨改变列车时刻表,从bugaddress1-bugaddress2处的//所有站点都不过了,直接走近道到bugaddress2.//这下这些站点的"乘客"们傻眼了,被脚本指挥的列车拒载了.esto //列车放行这个特征字符串仅仅存在于themida的1.3.3.0中,而不是全系列的themida的特征字符串,但是这个思想只要有了就容易了,可你是否具备了一眼就能从全系列themida中利用它的这个思想来定位它的"特征字符串"的能力,那就需要你不断的加强你的功力了.其实1.3.3.0爆出这个BUG,各路大侠马上行动,先从1.3.3.0版本中定位b2c27c和00b7266a地址处上下文中有什么可以进行再定位的地方,其实这就是这个系列的DNA指纹.从而一代枭雄轰然倒地!而上面的脚本的bugaddress1,和bugaddress2就是大侠们利用ODbgScript来进行反复搜索的利器.(习题,你能从1.3.3.0版本里面找到通用于1.3.3.5版bugaddress1的DNA指纹么?)这里我们讲解完了,ODbgScript的命令等等,下面章节我将讲解ODbgScript的使用注意事项和使用技巧.(作为脚本创作大户,原loveboom,fly都是脚本高手,其实他们才是真正的ODbgScript的英雄,我不才勉为其难吧发表速度可能要慢下来了,找合适的例子进行演示和进行语言组织就不像前三章那么可以天马行空了.)。

OllyDebug工具的使用

OllyDebug工具的使用

OllyDebug工具的使用【摘要】OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。

同时还支持插件扩展功能,是目前最强大的调试工具。

【关键词】OLLYDBG 反汇编调试专用工具一、OllyDBG 的安装OllyDBG 2.01b版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行其中的OllyDBG.exe 就可以了。

汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可(如图1-1)。

在其文件夹中:Plugin目录为OllyDebug软件的插件的存放文档。

UDD 目录的作用是保存你调试的工作。

比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时 OllyDBG 就会把你所做的工作保存到这个 UDD 目录,以便你下次调试时可以继续以前的工作。

如果不设置这个 UDD 目录,OllyDBG 默认是在其安装目录下保存这些后缀名为 udd 的文件,时间长了就会显的很乱,所以还是建议专门设置一个目录来保存这些文件。

图1-1(注:对于初学者本软件不需用额外进行设置,全部使用默认设置即可。

)二、OllyDBG的操作界面OllyDBG的操作界面主要如图1-2所示。

1 23 4图1-2整个操作界面分成四大部分:1.反汇编窗口:显示被调试程序的反汇编代码,具体的有:地址:本条汇编代码的内存地址。

HEX 数据:Intel HEX文件是记录文本行的ASCII文本文件,由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。

反汇编:由反汇编得到的代码。

注释2.寄存器窗口:显示当前所选线程的CPU 寄存器内容,可以实时查看所有寄存器的变化情况。

3.内存数据窗口:显示内存或文件的内容,并且可以用快捷键Ctrl+G方便的查看和修改内存中的任意位置的数据,就像是一个小型的“内存编辑器”。

使用OllyDbg从零开始Cracking 第八章-循环,字符串指令和寻址方式

使用OllyDbg从零开始Cracking 第八章-循环,字符串指令和寻址方式

第八章本章,我们将来看看前面章节忽略了的一些重要的指令。

我们学习完了这部分,就可以开始破解一些小玩意儿了。

循环指令为了实现循环可以使用前面介绍过一些指令。

例如,你可以将任意通用寄存器指定为计数器(通常ECX作为计数器使用),你可以将其初始化为需要循环的次数,然后执行循环体,接着计数器递减1,判断计数器是否为0,如果计数器不为0继续重复前面的过程,如果计数器为0,就不继续循环了,而直接执行下面的代码。

代码如下:XOR ECX,ECXMOV ECX,15h将计数器初始化为循环次数15h。

接下来就是循环体了:Label:DEC ECX该计数器每次递减1。

其实就是循环体了,循环体里面可以是任意指令。

最后,你需要添加一个判断计数器是否为0的指令以及条件跳转指令。

CMP ECX,0JNE Label第一次判断,计数器的值为14h,因为14h不为0,所以将继续执行循环,以此类推,直到计数器为0为止。

我们完整的来写一遍上面的循环:XOR ECX,ECXADD ECX,15hLabel:DEC ECX;循环体TEST ECX,ECXJNE Label让我们在OD上输入上面的代码:黄色突出显示的是循环代码,这个部分将重复执行,直到ECX的值为0。

循环体里面包含了多个NOP指令。

我们来单步跟踪一下循环代码,亲眼看一下循环的执行过程。

按一下F7键看看ECX是怎么初始化的。

再次按F7键,计数器将变成15h,保存了需要循环的次数。

然后继续按F7键,直到DEC ECX,这个时候我们的计数器的值将减少至14h。

继续F7单步直到TEST ECX,ECX。

该指令判断ECX是否为0,为0零标志位Z就置1,这样就停止循环,否则将继续循环。

因为此时计数器不为0,零标志位Z没有置1,所以条件跳转指令JNZ将跳转到401007地址处。

下一步计数器继续递减1,这一次减少至13h。

继续单步跟踪直到计数器为0。

当计数器为0时,零标志位Z将置1,这个时候JNZ将不会跳转至401007地址处,而是继续向下执行。

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代码更加易读易懂,可以帮助我们更好地理解程序的逻辑。

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

bphwc //清除硬件断点
sto //F8单步
sto //F8单步
cmt eip,”This is OEP”//到了OEP处加注释
log eip //把这个OEP地址显示在log窗口
ret //退出脚本
4.ask 显示一个对话框,让用户输入值,放在$RESULT里。如:ask “enter eax”
mov eax,$RESULT
5.bc 清除指定地址的断点,如:bc 00401000,bc eip;
15.cmt 指定地址处加入注释 如:cmt eip,“this is OEP”
16.dm 从内存中取数据保存在文件中。如:dm 401000,10,“D:\123.txt”
17.dma是将数据追加到指定文件的为末尾。
18.find 地址,内容,范围(可以不加范围)
19.free 释放alloc申请的内存
Ollydbg脚本常用命令整理+经典脚本实例
1.$RESULT 保存某些函数的返回值
2.#log 在脚本的前面加上,就会在OD的log窗口记录指令的运行。
3.alloc 申请内存如:alloc 1000
free $RESULT //申请1000字节的内存,初始地址放在$RESULT里
28.rtu 相当于Ctrl+F9
29.sti 相当于F7
30.sto 相当于F8
31.var 声明一个变量
32.脚本也可以定义标签,Label:
33.汇编的大部分基本命令都可以在脚本中使用。
简单的ESP脱壳定律:
#log
var addr // 变量
20.go 执行到指定地址处如:go 402000
21.gpa 在指定的动态链接库中,获得指定函数的地址。
如:gpa “send”,“WS2_32.dll” //地址保存在$RESULT
bp $RESULT //相当于命令行bp send
22.log 将值显示在log窗口 如:log “abc” //log窗口显示”abc”
23.msg 将消息显示在一个对话框如:msg “the script stop”
24.msgyn 显示的对话框有”是”” 否”按钮,点”是”,$RESULT=1.点”否”等于0.
25.pause 暂停脚本运行。
26.ret 退出脚本,写在在脚本最后一行
27.run 相当于F9
6.bp 跟命令行的一样
7.bpcnd 设置条件断点如:bpcnd 00401000,”eax==1”
8.bpd 清除调用函数断点 bpd “send”
9.bphws 设置硬件断点,3中模式”r”,”w”,”x”, 如:bphws 401000,”r”
10.bphwc 清除硬件断点 bphwc 401000
11.bphwcall 清除所有硬件断点
12.bpl 设置记录断点,运行到这里时记录所需要的值,如:bpl 401000,”eax” //执行到这里把eax的值记录到log窗口
13.bpmc 清除内存断点
14.bprm,bpwm内存读取,写入断点,如:bprm 401000,10//对401000起始的16字节内存下读取断点
log eax //log窗口就显示eax:eax的值
var x
mov x,ff10
log x //log窗口就显p //将此时esp显示在log窗口
mov addr,esp //将esp赋给变量addr
bphws addr
jmp label //在addr处下硬件断点
label:
run //F9运行
相关文档
最新文档