OD反调试大全
- 格式:doc
- 大小:84.50 KB
- 文档页数:39
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破解常用方法[复制链接]一、概论壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳两种顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。
当然加密壳的保护能力要强得多!二、常见脱壳方法预备知识1.PUSHAD (压栈)代表程序的入口点,2.POPAD (出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。
方法一:单步跟踪法1.用OD载入,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。
也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转(大跨段),比如jmp XXXXXX 或者JE XXXXXX 或者有RETN的一般很快就会到程序的OEP。
Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。
一般情况下可以轻松到达OEP!方法二:ESP定律法ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。
(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!3.选中下断的地址,断点--->硬件访--->WORD断点。
OD使用完全教程.txt如果不懂就说出来,如果懂了,就笑笑别说出来。
贪婪是最真实的贫穷,满足是最真实的财富。
幽默就是一个人想哭的时候还有笑的兴致。
OllyDbg调试工具使用完全教程一,什么是 OllyDbg?OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。
它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。
Version 1.10 是最终的发布版本。
这个工程已经停止,我不再继续支持这个软件了。
但不用担心:全新打造的 OllyDbg 2.00 不久就会面世!运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。
还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。
支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE 指令集以及相关的数据格式,但是不支持SSE2指令集。
配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。
数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。
帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。
如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。
启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。
用OD调试DLL
步骤如下:
1.打开DLL,OD会提示是否要启动LOADDLL.EXE来加载DLL,选是,然后就停在了DLL的入口处,这里我随便找了一个DLL
2.此时如果F8或者F7的话进的是DLL的主函数,如果不想跟这些主函数的话可以直接F9,然后OD会再停下来,在最下方的消息栏会提示DLL初始化完成,LIKE THIS
3.点菜单栏的调试-》调用DLL输出,会出现如下的对话框
4.选择想调试的输出函数,比如本例中的SPYMFCHWND,记住前边的函数起始地址:10002830,在这个起始地址处下一个断点
5.点击调用按钮,程序就断在我们下断点的地方了,可以调试了!。
od 反向函数工程在计算机科学领域,od反向函数工程(Reverse Engineeringwith OD)是指对一个已编译的程序进行逆向分析,以了解其内部结构和逻辑,以及还原其源代码的过程。
OD(OllyDbg)是一种常用的逆向工程工具,可以帮助分析人员进行程序的逆向过程。
二、工作原理1.准备工作在进行od反向函数工程前,首先需要准备好被分析程序的可执行文件(即目标文件),以及OD工具本身。
目标文件是待逆向分析的程序,而OD工具是用来分析和调试目标文件的工具。
2.逆向分析步骤(1)加载目标文件使用OD工具,将目标文件加载到工具中进行分析。
加载时,OD会加载并解析目标文件的二进制代码,并将其显示在界面上。
(2)动态分析使用OD工具的调试功能,通过设置断点、跟踪函数调用堆栈等手段,对目标文件进行动态分析。
动态分析可以帮助分析人员了解程序的执行流程、参数传递方式等信息。
(3)静态分析通过OD工具提供的静态分析功能,分析目标文件的二进制代码和数据结构。
静态分析可以揭示程序的算法、数据处理方式等关键信息。
(4)反汇编OD工具还提供了反汇编功能,可以将目标文件的机器码转换成汇编指令,这有助于分析人员理解程序的具体执行过程和逻辑。
(5)还原源代码通过分析目标文件的二进制代码和反汇编结果,结合对程序逻辑的理解,分析人员可以逐步还原目标文件的源代码。
这一步骤需要一定的代码阅读和推理能力。
1.逆向工程OD反向函数工程在逆向工程中扮演重要角色。
通过对目标文件进行反向分析,可以揭示软件或固件的内部结构和工作原理,帮助发现漏洞和进行安全评估。
2.软件修改和逆向软件开发通过OD反向函数工程,可以修改现有软件的行为或特性,以达到个性化需求或优化性能的目的。
同时,也可以为逆向软件开发提供基础,实现竞品分析或功能拓展。
3.版权保护和知识产权维护OD反向函数工程也可以用于版权保护和知识产权维护。
通过逆向分析,软件开发者可以检测到非法使用其源代码或功能的行为,从而维护自身的权益。
OD 反向函数工程1. 什么是 OD 反向函数工程OD 反向函数工程(OD Reverse Engineering)是一种将已编译的二进制代码转换回高级语言源代码的技术。
它可以帮助开发人员理解和修改现有的软件,尤其是当源代码不可用或丢失时。
OD 反向函数工程可以应用于各种情况,包括软件逆向工程、漏洞分析和修复、安全审计等。
2. OD 反向函数工程的原理OD 反向函数工程的原理是通过分析二进制代码的指令和数据,还原出高级语言的源代码。
它通常包括以下几个步骤:2.1 反汇编首先,将二进制代码反汇编为汇编代码。
反汇编是将机器指令转换为人类可读的汇编语言表示的过程。
反汇编器可以解析二进制代码的指令和数据,并将其转换为相应的汇编语句。
2.2 逆向分析在得到汇编代码后,进行逆向分析以还原出高级语言的源代码。
逆向分析是通过分析汇编代码的结构、逻辑和数据流来推断原始源代码的结构和功能。
逆向分析可以使用静态分析和动态分析两种方法。
静态分析是在不执行代码的情况下分析汇编代码。
它可以通过识别函数、变量和控制流来还原源代码的结构。
静态分析通常使用反汇编器、静态分析工具和模式匹配算法。
动态分析是在运行时执行代码并观察其行为。
动态分析可以通过执行代码路径、变量跟踪和内存分析来推断源代码的逻辑和功能。
动态分析通常使用调试器、动态分析工具和模糊测试。
2.3 代码重构在逆向分析的基础上,进行代码重构以还原出高级语言的源代码。
代码重构是通过修改和重组汇编代码来还原源代码的结构和功能。
代码重构可以包括删除无用代码、重命名变量和函数、添加注释和文档等。
3. OD 反向函数工程的应用OD 反向函数工程在软件开发和安全领域有着广泛的应用。
3.1 软件逆向工程在软件逆向工程中,OD 反向函数工程可以帮助分析和修改已编译的二进制代码。
它可以帮助开发人员理解第三方库、闭源软件和恶意软件的工作原理。
通过反向函数工程,开发人员可以修改和优化现有的软件,甚至实现自己的功能。
Ollydbg中断方法浅探Ollydbg是一个新的32位的汇编层调试软件。
适应于windows98、me、2000、xp和2003操作系统。
由于他具有图形窗口界面,所以操作方便、直观,是cracker的好工具。
由于Ollydbg没有了TRW2000的万能断点,所以许多的新手感觉到用Ollydbg断点不好找。
现在我来的说说Ollydbg下中断的几种方法。
本人是个菜鸟,水平有限,可能不能完整的写出来,也可能存在错误。
请大家指正。
我所表述的是Ollydbg v1.09d中文版,其他版本和英文版下自己参考。
第一寻常断点Ollydbg中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。
然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。
然后运行程序时只有到这个地址处就会被Ollydbg 中断。
这个方法用的比较多,所以把他称作寻常断点。
如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。
优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的限制,所以方便实用。
缺点:如果不知道代码功能下断点具有盲目性。
第二 API断点Ollydbg中一般下API中断的方法,有二种。
1. 在代码窗口中点鼠标右键,出现功能菜单。
在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的窗口,在这个窗口中选择你要跟踪的API函数名。
双击这个函数就能到程序的调用地址处。
然后用F2下中断。
也可以在API窗口中选择需要跟踪的函数点鼠标右键出现功能菜单,选择〔在每个参考设置断点〕。
同样下了断点。
快捷方式:Ctrl+N2. 在命令行窗口中输入BPX API函数名或者BP API函数名后回车。
这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。
说明下好了断点。
说明一下:BPX一般中断在程序调用API的地址处。
od破解软件教程破解教程希望大家互相学习学习,发现现在大家对于破解都不是很了解,很多人想学破解,但是去无从入手,所以在BCG小组大家的商议下,决定为大家写一个破解入门的教程,希望能大家了解破解有一些帮助,希望能有更多的人踏入破解的大门。
1.初级,修改程序,用ultraedit等工具修改exe文件,称暴力破解,简称爆破中级,追出软件的注册码高级,写出注册机2.常用破解工具(1)侦壳工具:PEiD(2)动静结合的OllyDbg引领破解工具的新潮流。
一,现在我们首先来学习下破解的初步,爆破~1.侦壳要破解一个软件首先要做的就是侦壳,要侦壳就要对壳有一定的了解,众所周知,软件作者用编程语言编写好软件后,是将它编译成扩展名为EXE的可执行文件。
编译为EXE 的目的有两点:(1)有一些版权信息需要保护起来,不能让别人随意改动,如作者的姓名、软件名称等;(2)需要给程序“减肥”,从而方便存储、使用和网上传输。
为了编译,会用到一些软件。
它们能将可执行文件压缩和对信息加密(图1),实现上述两个功能,这些软件称为加壳软件。
为软件加上的东东就称为“壳”。
加壳软件不同于一般的WinZIP、WinRAR等打包类压缩软件。
加壳软件是压缩可执行文件的,压缩后的文件可以直接运行。
最常见的加壳软件有3个:ASPACK 、UPX、PEcompact。
毕竟它们是主流,据统计,用它们加壳的软件约占市面所有软件的90%!其他不常用的加壳软件有ASPROTECT、PETITE 、NEOLITE、TELOCK等。
软件最常见的编程语言是Delphi,Visual Basic(简称VB),Visual C++(简称VC)。
了解些编程的知识,会让破解更加轻车熟路。
下面来说侦壳,现在比较常用侦壳软件就PeiD,他具有华丽的图形界面。
外壳整合(添加到鼠标右键)功能令使用更加方便,支持拖放操作。
配置时,务请将“扩展到鼠标右键”打上对号。
其使用方法是,鼠标点住,按鼠标右键,选"使用PEid扫描"即可;“壳”的信息就显示在底部。
调试技巧总结-原理和实现-------------------------------------------------------------------------------------------------------2008.8.7 shellwolf一、前言前段学习反调试和vc,写了antidebug-tester,经常会收到message希望交流或索要实现代码,我都没有回复。
其实代码已经在编程版提供了1个版本,另其多是vc内嵌asm写的,对cracker而言,只要反下就知道了。
我想代码其实意义不是很大,重要的是理解和运用。
做个简单的总结,说明下实现原理和实现方法。
也算回复了那些给我发Message的朋友。
部分代码和参考资料来源:1、<<脱壳的艺术>> hawking2、<<windows anti-debugger reference>> Angeljyt3、4、<<软件加密技术内幕>> 看雪学院5、<<ANTI-UNPACKER TRICKS>> Peter Ferrie我将反调试技巧按行为分为两大类,一类为检测,另一类为攻击,每类中按操作对象又分了五个小类:1、通用调试器包括所有调试器的通用检测方法2、特定调试器包括OD、IDA等调试器,也包括相关插件,也包括虚拟环境3、断点包括内存断点、普通断点、硬件断点检测4、单步和跟踪主要针对单步跟踪调试5、补丁包括文件补丁和内存补丁反调试函数前缀检测攻击通用调试器 FD_ AD_特定调试器 FS_ AS_断点 FB_ AB_单步和跟踪 FT_ AT_补丁 FP_ AP_声明:1、本文多数都是摘录和翻译,我只是重新组合并翻译,不会有人告侵权吧。
里面多是按自己的理解来说明,可能有理解错误,或有更好的实现方法,希望大家帮忙指出错误。
2、我并没有总结完全,上面的部分分类目前还只有很少的函数甚至空白,等待大家和我一起来完善和补充。
我坚信如果有扎实的基础知识,丰富的想像力,灵活的运用,就会创造出更多的属于自己的反调试。
而最强的反调试,通常都是自己创造的,而不是来自别人的代码。
二、查找-通用调试器(FD_)函数列表如下,后面会依次说明,需事先说明的是,这些反调试手段多数已家喻户晓,目前有效的不多,多数已可以通过OD的插件顺利通过,如果你想验证它们的有效性,请关闭OD 的所有反反调试插件:bool FD_IsDebuggerPresent();bool FD_PEB_BeingDebuggedFlag();bool FD_PEB_NtGlobalFlags();bool FD_Heap_HeapFlags();bool FD_Heap_ForceFlags();bool FD_Heap_Tail();bool FD_CheckRemoteDebuggerPresent();bool FD_NtQueryInfoProc_DbgPort();bool FD_NtQueryInfoProc_DbgObjHandle();bool FD_NtQueryInfoProc_DbgFlags();bool FD_NtQueryInfoProc_SysKrlDbgInfo();bool FD_SeDebugPrivilege();bool FD_Parent_Process();bool FD_DebugObject_NtQueryObject();bool FD_Find_Debugger_Window();bool FD_Find_Debugger_Process();bool FD_Find_Device_Driver();bool FD_Exception_Closehandle();bool FD_Exception_Int3();bool FD_Exception_Popf();bool FD_OutputDebugString();bool FD_TEB_check_in_Vista();bool FD_check_StartupInfo();bool FD_Parent_Process1();bool FD_Exception_Instruction_count();bool FD_INT_2d();2.1 FD_IsDebuggerPresent()对调试器来说,IsDebuggerPresent是臭名昭著的恶意函数。
不多说了,它是个检测调试的api函数。
实现更简单,只要调用IsDebuggerPresent就可以了。
在调用它之前,可以加如下代码,以用来检测是否在函数头有普通断点,或是否被钩挂。
//check softbreakif(*(BYTE*)Func_addr==0xcc)return true;//check hookif(*(BYTE*)Func_addr!=0x64)return true;2.2 FD_PEB_BeingDebuggedFlag我们知道,如果程序处于调试器中,那么在PEB结构中有个beingDegug标志会被设置,直接读取它就可判断是否在调试器中。
实际上IsDebuggerPresent就是这么干的。
__asm{mov eax, fs:[30h] ;EAX = TEB.ProcessEnvironmentBlockinc eaxinc eaxmov eax, [eax]and eax,0x000000ff ;AL = PEB.BeingDebuggedtest eax, eaxjne rt_labeljmp rf_label}2.3 FD_PEB_NtGlobalFlagsPEB中还有其它FLAG表明了调试器的存在,如NtGlobalFlags。
它位于PEB环境中偏移为0x68的位置,默认情况下该值为0,在win2k和其后的windows平台下,如果在调试中,它会被设置为一个特定的值。
使用该标志来判断是否被调试并不可靠(如在winnt中),但这种方法却也很常用。
这个标志由下面几个标志组成:***_HEAP_ENABLE_TAIL_CHECK (0x10)***_HEAP_ENABLE_FREE_CHECK (0x20)***_HEAP_VALIDATE_PARAMETERS (0x40)检测NtGlobalFlags的方法如下,这个方法在ExeCryptor中使用过。
__asm{mov eax, fs:[30h]mov eax, [eax+68h]and eax, 0x70test eax, eaxjne rt_labeljmp rf_label}2.4 FD_Heap_HeapFlags()同样,调试器也会在堆中留下痕迹,你可以使用kernel32_GetProcessHeap()函数,如果你不希望使用api函数(以免暴露),则可以直接在PEB中寻找。
同样的,使用HeapFlags和后面提到的ForceFlags来检测调试器也不是非常可靠,但却很常用。
这个域由一组标志组成,正常情况下,该值应为2。
__asm{mov eax, fs:[30h]mov eax, [eax+18h] ;PEB.ProcessHeapmov eax, [eax+0ch] ;PEB.ProcessHeap.Flagscmp eax, 2jne rt_labeljmp rf_label}2.5 FD_Heap_ForceFlags进程堆里另外一个标志,ForceFlags,它也由一组标志组成,正常情况下,该值应为0。
__asm{mov eax, fs:[30h]mov eax, [eax+18h] ;PEB.ProcessHeapmov eax, [eax+10h] ;PEB.ProcessHeap.ForceFlagstest eax, eaxjne rt_labeljmp rf_label}2.6 FD_Heap_Tail如果处于调试中,堆尾部也会留下痕迹。
标志HEAP_TAIL_CHECKING_ENABLED 将会在分配的堆块尾部生成两个0xABABABAB。
如果需要额外的字节来填充堆尾,HEAP_FREE_CHECKING_ENABLED标志则会生成0xFEEEFEEE。
据说Themida使用过这个反调试__asm{mov eax, buff;get unused_bytesmovzx ecx, byte ptr [eax-2]movzx edx, word ptr [eax-8] ;sizesub eax, ecxlea edi, [edx*8+eax]mov al, 0abhmov cl, 8repe sca**je rt_labeljmp rf_label}2.7 FD_CheckRemoteDebuggerPresentCheckRemoteDebuggerPresent是另一个检测调试的api,只是可惜它似乎只能在winxp sp1版本以后使用。
它主要是用来查询一个在winnt时就有的一个数值,其内部会调用NtQueryInformationProcess(),我是这样实现的:FARPROC Func_addr ;HMODULE hModule = GetModuleHandle("kernel32.dll");if (hModule==INVALID_HANDLE_VALUE)return false;(FARPROC&) Func_addr =GetProcAddress(hModule, "CheckRemoteDebuggerPresent");if (Func_addr != NULL){__asm{push eax;push esp;push 0xffffffff;call Func_addr;test eax,eax;je rf_label;pop eax;test eax,eaxje rf_label;jmp rt_label;}}2.8 FD_NtQueryInfoProc_DbgPort使用ntdll_NtQueryInformationProcess()来查询ProcessDebugPort可以用来检测反调试。
如果进程被调试,其返回值应为0xffffffff。
下面的代码应该是从pediy里copy过来的,时间太长,不记得是哪位兄弟的代码了。
HMODULE hModule = GetModuleHandle("ntdll.dll");ZW_QUERY_INFORMATION_PROCESS ZwQueryInformationProcess; ZwQueryInformationProcess = (ZW_QUERY_INFORMATION_PROCESS)GetProcAddress(hModule, "ZwQueryInformationProcess");if (ZwQueryInformationProcess == NULL)return false;PROCESS_DEBUG_PORT_INFO ProcessInfo;if (STATUS_SUCCESS != ZwQueryInformationProcess(GetCurrentProcess( ), ProcessDebugPort, &ProcessInfo, sizeof(ProcessInfo), NULL))return false;elseif(ProcessInfo.DebugPort)return true;elsereturn false;2.9 FD_NtQueryInfoProc_DbgObjHandle在winxp中引入了"debug object".当一个调试活动开始,一个"debug object"被创建,同也相应产生了一个句柄。