od破解调试秘籍断点
OD使用教程 - 解密系列【调试篇】 调试逆向
OD使用实践
• 古语有云,趁热要打铁,趁火要打劫,趁着我们 还有点印象,赶紧实践一下吧亲╭(╯3╰)╮!
• 要求:通过OD将程序的标题“Hello world”改为 “I love ”
们的视频讲座中随着需要会逐步提供给大家的, 嗯,不用担心,我们就学好眼前的,一步步来!
OD基本快捷键及ห้องสมุดไป่ตู้能
F2 F3 F4 F5 F7 F8 F9 Ctrl+F2 Ctrl+F9 Alt+F9 Ctrl+G
下断点,也就是指定断点的地址 加载一个可执行程序,进行调试分析 程序执行到光标处 缩小、还原当前窗口 单步步入 单步步过 直接运行程序,遇到断点处,程序暂停 重新运行程序到起始处,一般用于重新调试程序 执行到函数返回处,用于跳出函数实现 执行到用户代码处,用于快速跳出系统函数 输入十六进制地址,快速定位到该地址处
调试逆向
• 在软件开发的过程中,程序员会使用一些调试工 具,以便高效地找出软件中存在的错误。
• 而在逆向分析领域,分析者也会利用相关的调试 工具来分析软件的行为并验证分析结果。
• 由于操作系统都会提供完善的调试接口,所以利 用各类调试工具可以非常方便灵活地观察和控制 目标软件。
• 在使用调试工具分析程序的过程中,程序会按调 试者的意愿以指令为单位执行。
调试逆向
• 调试逆向分为动态分析技术和静态分析技术。
• 动态分析技术指的是使用调试工具加载程序并运 行,随着程序运行,调试者可以随时中断目标的 指令流程,以便观察相关计算的结果和当前的设 备情况。
• 静态分析技术是相对于动态分析而言的。由于在 实际分析中,很多场合不方便运行目标(例如病 毒程序,设备不兼容,软件的单独某一模块)。 那么这个时候静态分析技术就该上场了!
OD下断点的方法
OD下断点的方法OD下断点的方法寻常断点Ollydbg中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。
然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。
然后运行程序时只有到这个地址处就会被Ollydbg中断。
这个方法用的比较多,所以把他称作寻常断点。
如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。
优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的限制,所以方便实用。
缺点:如果不知道代码功能下断点具有盲目性。
API断点Ollydbg中一般下API中断的方法,有二种。
1. 在代码窗口中点鼠标右键,出现功能菜单。
在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的窗口,在这个窗口中选择你要跟踪的API函数名。
双击这个函数就能到程序的调用地址处。
然后用F2下中断。
也可以在API窗口中选择需要跟踪的函数点鼠标右键出现功能菜单,选择〔在每个参考设置断点〕。
同样下了断点。
快捷方式:Ctrl+N2. 在命令行窗口中输入BPX API函数名或者BP API函数名后回车。
这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。
说明下好了断点。
说明一下:BPX一般中断在程序调用API的地址处。
BP会中断在API的写入地址处。
二这有所不同,根据需要选择。
优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。
缺点:关键的API函数不容易找到。
所以有时下的断点没有作用。
内存断点(跟踪关键数据的断点)Ollydbg中的内存断点相当于TRW中的bpm 断点。
下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。
选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。
〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。
OD破解常用方法
[分享] 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断点大全
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 获取当前全部逻辑驱动器的根驱动器路径。
用OD破解VB程序的捷径
——VB程序破解的捷径
作者: 王太辉 日期:2013.10.31
前提介绍
• 前提介绍
• 具体演示
• 实验心得
• 下周计划
VB程序介绍
• Virtual BASIC是由早期DOS时代的BASIC语言发 展而来的可视化编程语言。 • VB是由事件驱动的编程语言:就是在可视化编程 环境下我们可以绘制一些窗体,按钮,编辑框等 控件,然后为这些控件所可能引发的事件如按钮 被单击或者被双击编写对应的处理代码。
破解的关键要点:
具体实施的方法
• 如上图所示,对于VB程序的破解,我们可以直接 用OD打开,按下Ctrl+N进入到这个程序的API函 数的领空,我们直接去依次寻找所提供的API函 数,上图所示。
具体案例:一个未注册的软件
直接去寻找的API函数
• 找到我们所寻找的API函数,右键点击设置断点。 我们会发现这个程序设置88个断点。 • 启动程序,程序会停在第一个断点处,单步执行 ,注意观察注释区。我们发现了一个类似激活码 的一段文字。
用OD破解的困扰
• 所有的VB程序几乎都是依赖于一个外部的动态链 接库。这个动态链接库的名字是: MSVBVM60.dll(可能有多个版本,但名字都差 不多~) • 然而正是因为VB中所有的API函数都在DLL中去 实现,所以导致我们在跟踪程序的执行代码时灰 常频繁地在DLL领空和程序领空跳来跳去跳来跳 去跳来跳去。
• 记录下我们所发现的那段文字,我们进行测试。 • 注意:在测试前,我需要将刚刚那88个断点撤销 ,并重新载入程序。 •这个程序我们第一个API函数就成功了,当我们 如果遇到不成功的情况,我们可以继续测试下一 个。 • 如需要实验用到的那个程序,请练习我。
谢谢
ollydbg破解教学之万能断点篇
ollydbg破解教学之万能断点篇有的只是OD不能下万能断点的断⾔,⼀时⼼恢之极,可是我原来⽤TRW和SICE⽤的挺好,谁知系统⼜跟我闹⽭盾,⼀⽤TRW和SICE就死机,没办法我现在只能⽤OD,我写的⼀些破解⽂章都是⽤OD破的,反复试验,我终于发现OD也能下万能断点,在我以前写的⼀些⽂章中好象有⼀篇简单提到过,但没有说的很详细,这次静下⼼,想写⼀点东西,送给我⼼爱的组织DFCG吧,我的破解是从DFCG组织起步的,很感谢DFCG的⾼⼿们的帮助,在此说声谢谢!为了更明确,这次破解所使⽤的调试器OD是从看雪论坛临时下载的OD1.09的汉化版,没有使⽤我⾃⼰⼿头经过改造的OD,在此也感谢看雪论坛,这⾥真的有很多⾼⼿,在这个论坛我也学到了很多.这次破解的对象是超级XX王,为保护国产软件我隐去了软件相关信息,我不想给⾃⼰带来⿇烦,现在⼯作很忙,能少⼀点⿇烦就尽量少⼀点吧.破解作者yzez[DFCG]破解⼯具ollydbg汉化版,下载https:///softs/58565.html破解⽬的本不为破解⽽破解,只因为技术⽽破解破解环境WINDOWS XP,这个我已经在98和XP下各做了两次,贴图和我这篇⽂章是在XP系统下完成的.破解过程1.检查了⼀下,该程序⽆壳,C++编译,⽤W32DSM反汇编⼀堆乱码,我倒!那就动态调试吧!⽤ollydbg1.09载⼊程序,这次我将教你们如何⽤OD下万能断点,过程我尽可能详细⼀点,下⾯请看.载⼊程序选OD菜单栏上的插件-----命令⾏(快捷键是ALT+F1),在弹出的窗⼝中输⼊万能断点命令:bpx hmemcpy,按ENTER键,结果⼜出现⼀个对话框:Intermodular calls00401164 CALL DWORD PTR DS:[<&USER32.GetWindowRect>] USER32.GetWindowRect0040118F CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect00401279 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect004013E1 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect0040190A CALL DWORD PTR DS:[<&KERNEL32.GetThreadLocale>] kernel32.GetThreadLocale0040191C CALL DWORD PTR DS:[<&KERNEL32.GetLocaleInfoA>] kernel32.GetLocaleInfoA还有很多,我就省略了,在这个框⾥右键单击,出现⼀个对话框,选中在每个命令中设置断点(热键是S),单击,你看每⼀⾏都变成了红⾊吧,这表⽰全部设下断点了,后⾯的过程很烦燥,你要⼀边按F9,边按F2把⼀些⽆⽤的断点去掉,有⼀点耐⼼吧,当然也可以不这样做,但遇到断点跳不过的时候,你就得按F2把这个断点去掉.感觉在这⼀点上OD⽐不上TRW和SICE,到出现注册信息框后,你要输⼊注册信息,然后按确定,程序被断下来,我的序列号是:GK342QZ0C6RE03L,我输⼊试验码:123456789098765.程序中断在下⾯:00471F71 CALL DWORD PTR DS:[<&USER32.GetWindowTex>****按确定后回到OD程序中断在此,按F8⾛,在此还没有到关键处!*****************************************************注意这⾥会循环两次,分别处理序列号和试验码,按F8⾛00471F77 LEA ECX,DWORD PTR DS:[EAX+1]00471F7A PUSH ECX00471F7B MOV ECX,DWORD PTR SS:[EBP+10]00471F7E PUSH EAX00471F7F CALL SuperPIM.0043E15D00471F84 PUSH EAX00471F85 PUSH ESI00471F86 CALL DWORD PTR DS:[<&USER32.GetWindowTex>00471F8C MOV ECX,DWORD PTR SS:[EBP+10]00471F8F PUSH -100471F91 CALL SuperPIM.00401D6A00471F96 JMP SHORT SuperPIM.00471FA300471F98 MOV EAX,DWORD PTR SS:[EBP+10]00471F9B PUSH DWORD PTR DS:[EAX]00471F9D PUSH ESI00471F9E CALL SuperPIM.00470B6100471FA4 POP ESI00471FA5 POP EBP00471FA6 RETN 0C*************************************程序第⼆次循环后最后会返回到0040FE99下⾯看代码:----------------------------------------------------------------------------------------------------------0040FE99 LEA EAX,DWORD PTR SS:[EBP-14]****第⼆次循环后会返回到这⾥,注意这就是我们要找的关键地⽅,按F8往下!0040FE9C PUSH EAX0040FE9D CALL SuperPIM.00433D92***********这就是关键CALL,按F7追进,⼀定要进,因为算法就在这⾥⾯!0040FEA2 POP ECX0040FEA3 AND DWORD PTR SS:[EBP-4],00040FEA7 LEA ESI,DWORD PTR DS:[EDI+74]0040FEAA MOV EAX,DWORD PTR DS:[ESI]******试验码⼊EAX0040FEAC CMP DWORD PTR DS:[EAX-C],0******⽐较试验码输⼊了吗?0040FEB0 JE SHORT SuperPIM.0040FF2F******没有输⼊就跳⾛,⼀跳就失败!0040FEB2 PUSH 280040FEB4 LEA EAX,DWORD PTR SS:[EBP-18]0040FEB7 PUSH ESI0040FEB8 PUSH EAX0040FEB9 CALL SuperPIM.0042CEC8**********此CALL对输⼊的注册码进⾏处理,得到⼀个40位的长字符串,有兴趣⾃⼰跟,******************************************我已是头晕的很,不想跟进!0040FEBE LEA ECX,DWORD PTR SS:[EBP-14]0040FEC1 PUSH ECX0040FEC2 PUSH EAX0040FEC3 CALL SuperPIM.0040F9B7**********此CALL对序列号处理,也是得到⼀个40位的长字符串0040FEC8 MOV ECX,DWORD PTR SS:[EBP-18]0040FECB ADD ESP,140040FECE ADD ECX,-100040FED1 MOV BYTE PTR SS:[EBP-D],AL0040FED4 CALL SuperPIM.00401B5D**********此CALL进⾏⽐较,注册码不对,值为00040FED9 CMP BYTE PTR SS:[EBP-D],0*******⽐较是0吗?0040FEDD JE SHORT SuperPIM.0040FF2F******相等就跳,跳就失败,所以⼀定不能跳!0040FEDF PUSH 0**************************不跳往下你就成功了!下⾯代码省略! ...............................................................省略若⼲代码!.........................============================================================================================================= ************************************关键CALL的代码!*******************************************************00433D92 MOV EAX, SuperPIM.0049844E****追进关键CALL后我们来到这⾥!00433D97 CALL SuperPIM.0045090000433D9C PUSH ECX00433D9D PUSH ECX00433D9E AND [LOCAL.5], 000433DA2 LEA EAX, [LOCAL.5]00433DA5 PUSH EAX00433DA6 CALL SuperPIM.00433CA9********此CALL根据电脑硬件信息得到你的序列号,有兴趣跟吧!我是没有兴趣!00433DAB AND [LOCAL.1], 000433DAF PUSH 1400433DB1 LEA EAX, [LOCAL.5]00433DB4 PUSH EAX00433DB5 LEA EAX, [LOCAL.4]00433DB8 PUSH EAX00433DB9 CALL SuperPIM.0042CEC8*******算法CALL(1),按F7跟进!00433DBE PUSH 2800433DC0 LEA EAX, [LOCAL.4]00433DC3 PUSH EAX00433DC4 PUSH [ARG.1]00433DC7 MOV BYTE PTR SS:[EBP-4], 100433DCB CALL SuperPIM.0042CEC800433DD0 MOV ECX, [LOCAL.4]00433DD3 ADD ESP, 1C00433DD6 ADD ECX, -10*****************************省略N⾏代码!********************************************************0043454B RETN=========================================================================================================== ***********************************算法CALL!*********************************************************0042CEC8 MOV EAX, SuperPIM.00497B52********追进算法CALL我们在这⾥!0042CECD CALL SuperPIM.004509000042CED2 SUB ESP, 140042CED5 PUSH EBX0042CED6 PUSH ESI0042CED7 XOR EBX, EBX0042CED9 PUSH EDI0042CEDA MOV [LOCAL.8], EBX0042CEDD CALL SuperPIM.004639B50042CEE2 MOV EDX, DWORD PTR DS:[EAX]0042CEE4 MOV ECX, EAX0042CEE6 CALL DWORD PTR DS:[EDX+C]0042CEE9 LEA EDI, DWORD PTR DS:[EAX+10]0042CEEC MOV [LOCAL.4], EDI0042CEEF MOV EAX, [ARG.2]0042CEF2 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L移⼊EAX0042CEF4 MOV ESI, DWORD PTR DS:[EAX-C]*****序列号的位数15(⼗六进制值是F)送⼊ESI0042CEF7 CMP ESI, EBX**********************⽐较ESI和EBX,ESI的值是F即序列号位数,EBX的初始值是00042CEF9 MOV [LOCAL.1], EBX0042CEFC MOV [LOCAL.8], ESI0042CEFF JE SuperPIM.0042CFB2*************相等就跳,这⾥当然不相等,所以就不会跳!0042CF05 MOV EAX, [ARG.3]******************常数14(⼗进制值是20)送⼊EAX0042CF08 CMP EAX, ESI**********************⽐较EAX和ESI,即14和F⽐较!0042CF0A MOV [LOCAL.6], EAX0042CF0D JG SHORT SuperPIM.0042CF12*******⼤于就跳!0042CF0F MOV [LOCAL.6], ESI0042CF12 CMP [LOCAL.6], EBX****************跳到这⾥!⽐较14和00042CF15 JLE SuperPIM.0042CFB2*************⼩于就跳,这⾥当然不会⼩!所以不跳!0042CF1B MOV EAX, EBX**********************0移⼊EAX0042CF1D CDQ***********************************EDX清0,准备计算!0042CF1E IDIV ESI***************************除,EAX/ESI ,EAX的值是0,ESI的值存放序列号的位数F0042CF20 MOV EAX, [ARG.2]******************赋EAX地址值0042CF23 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L移⼊EAX0042CF25 PUSH EBX***************************EBX⼊栈0042CF26 MOV AL, BYTE PTR DS:[EDX+EAX]*****序列号的第⼀位G(ASCII码值47)⼊AL0042CF29 MOV BYTE PTR SS:[EBP-1C], AL******保存值470042CF2C PUSH [LOCAL.7]0042CF2F CALL SuperPIM.0042CD8E*************算法CALL(2),按F7跟进!代码直接在下⾯给出============================================================================================================== ***************************算法CALL(2)*****************************************************0042CD8E PUSH EBP0042CD8F MOV EBP, ESP0042CD91 PUSH ECX*************************G的ASCII码值47⼊ECX0042CD92 MOVZX EAX, BYTE PTR SS:[EBP+8]****扩展成000000470042CD96 MOV ECX, [ARG.2]****************赋ECX的初始值为00042CD99 MOV [LOCAL.1], EAX0042CD9C MOV EAX, ECX********************ECX的值移⼊EAX0042CD9E IMUL EAX, ECX********************EAX=EAX*ECX=0*00042CDA1 LEA EAX, DWORD PTR DS:[EAX+EAX*2+7]**EAX+EAX*2+7的值7给EAX0042CDA5 IMUL EAX, ECX********************EAX=EAX*ECX=7*00042CDA8 ADD EAX, 0D*********************EAX=EAX+0D=D0042CDAB IMUL EAX, ECX********************EAX=EAX*ECX=D*0=00042CDAE PUSH ESI*************************序列号位数F⼊栈!0042CDAF LEA ESI, DWORD PTR DS:[ECX+5]0042CDB2 PUSH ESI0042CDB3 MOV [ARG.1], EAX0042CDB6 LEA EAX, [ARG.1]0042CDB9 PUSH 40042CDBB PUSH EAX0042CDBC CALL SuperPIM.0042CD2E***********这个CALL也在计算,我实在不想跟进!0042CDC1 PUSH ESI0042CDC2 LEA EAX, [LOCAL.1]0042CDC5 PUSH 40042CDC7 PUSH EAX0042CDC8 CALL SuperPIM.0042CD5E**********这个CALL也是计算CALL,烦!不跟了!0042CDCD MOV EAX, [ARG.1]0042CDD0 ADD ESP, 180042CDD3 XOR EAX, [LOCAL.1]*************这⾥赋EAX的值380000020042CDD6 POP ESI0042CDD7 LEAVE0042CDD8 RETN=========================================================================算法CALL(2)结束================== 0042CF34 POP ECX0042CF35 POP ECX0042CF36 PUSH 2B***************************常数2B⼊栈!0042CF38 XOR EDX, EDX0042CF3A POP ECX**************************把常数2B赋给ECX0042CF3B DIV ECX**************************除,EAX/ECX=38000002/2B=014D6535,余数1B⼊EDX0042CF3D MOV ECX, EDX*********************结果1B⼊ECX0042CF3F ADD CL, 30***********************CL=CL+30=1B+30=4B(对应的字符串是K)0042CF42 CMP CL, 39***********************⽐较是不是数字90042CF45 MOV BYTE PTR SS:[EBP-14], CL*****保存字符串K0042CF48 JLE SHORT SuperPIM.0042CF55******⼩于就跳⾛!0042CF4A CMP CL, 41***********************⽐较是不是A0042CF4D JGE SHORT SuperPIM.0042CF55******⼤于就跳⾛0042CF4F ADD CL, 0F60042CF52 MOV BYTE PTR SS:[EBP-14], CL0042CF55 CMP EBX, [ARG.3]*****************跳到这⾥!⽐较0和140042CF58 JGE SHORT SuperPIM.0042CF67******⼤于等于就跳⾛!0042CF5A PUSH [LOCAL.5]0042CF5D LEA ECX, [LOCAL.4]0042CF60 CALL SuperPIM.00417EAF0042CF65 JMP SHORT SuperPIM.0042CFA5******⽆条件跳0042CF67 MOV EAX, EBX0042CF69 CDQ0042CF6A IDIV [ARG.3]0042CF6D MOVSX ECX, CL0042CF70 PUSH 2B0042CF72 MOV ESI, EDX0042CF74 MOVSX EAX, BYTE PTR DS:[ESI+EDI]0042CF78 LEA EAX, DWORD PTR DS:[EAX+ECX-60]0042CF7C CDQ0042CF7D POP ECX0042CF7E IDIV ECX0042CF80 ADD DL, 300042CF83 CMP DL, 390042CF86 MOV BYTE PTR SS:[EBP-14], DL0042CF89 JLE SHORT SuperPIM.0042CF960042CF8B CMP DL, 410042CF8E JGE SHORT SuperPIM.0042CF960042CF90 ADD DL, 0F60042CF93 MOV BYTE PTR SS:[EBP-14], DL0042CF96 PUSH [LOCAL.5]0042CF99 LEA ECX, [LOCAL.4]0042CF9C PUSH ESI0042CF9D CALL SuperPIM.0042CE4B0042CFA2 MOV ESI, [LOCAL.8]0042CFA5 MOV EDI, [LOCAL.4]***************上⾯跳到这⾥!0042CFA8 INC EBX*************************EBX加10042CFA9 CMP EBX, [LOCAL.6]**************⽐较1和140042CFAC JL SuperPIM.0042CF1B***********⼩于就跳,循环,序列号只有15位,这⾥循环20次,取完后⼜从第⼀位取出! ************************************循环结束后得到的值是:K3L2LPBDW1F2H4B8S0UY这就是我们要的注册码!0042CFB2 MOV ECX, [ARG.1]0042CFB5 LEA EAX, [LOCAL.4]0042CFB8 PUSH EAX0042CFB9 CALL SuperPIM.00401F360042CFBE LEA ECX, DWORD PTR DS:[EDI-10]0042CFC1 CALL SuperPIM.00401B5D0042CFC6 MOV ECX, [LOCAL.3]0042CFC9 MOV EAX, [ARG.1]0042CFCC POP EDI0042CFCD POP ESI0042CFCE POP EBX0042CFCF MOV DWORD PTR FS:[0], ECX0042CFD6 LEAVE0042CFD7 RETN写这篇⽂章的⽬的是想说明如何在OD下万能断点,算法过程太烦琐,就不想多跟了!希望能对⼤家有点启发,如果觉得这篇破⽂还⾏帮我顶⼀下吧!也是希望有更多的⼈能看到,对更多的⼈有益,我也是⼀只菜鸟,请⼤家多多指点!。
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 硬件条件断点
od 硬件条件断点
OD (OllyDbg) 是一款用于调试二进制应用程序的工具,它可
以在执行程序时设置断点并检查程序的状态。
要在OD中设置硬件条件断点,你需要遵循以下步骤:
1. 打开OllyDbg,并加载要调试的二进制程序。
2. 找到你想要设置断点的位置。
这可以是一个特定的内存地址,也可以是程序中的某个函数。
3. 在OllyDbg的菜单栏上选择 "Breakpoints" > "Hardware breakpoints"。
4. 在 "Hardware breakpoints" 窗口中,点击 "New" 按钮。
5. 在弹出的窗口中,选择 "Condition" 选项卡。
6. 在 "Condition" 选项卡中,输入你想要设置的条件,例如要
求寄存器的值等于某个特定值。
7. 点击 "OK" 按钮保存设置。
8. 回到主OllyDbg窗口,你将看到硬件条件断点已添加到"Browse breakpoints" 窗口中。
9. 启动程序,并当程序执行到设置的断点位置时,程序会停止执行并等待你进一步调试。
请注意,硬件条件断点只在特定条件满足时触发断点,因此你需要确保设置的条件是合适的,并且可以满足在期望的情况下触发断点。
此外,硬件断点通常会影响程序的执行速度,因此在调试大型程序时,设置过多的硬件条件断点可能会导致性能下降。
OD使用教程2 - 解密系列【调试篇】
调试技巧总结
• 4.所谓领空,实际上就是指在某一时刻,CPU执行 的指令所在的某段代码的所有者。
• 5.如004013F7这类地址一般是可执行文件领空, 7C8114AB这类大地址一般是系统DLL所在的地址空 间。
• 6.程序通常读取文本框内容的字符串用的是以下 两个函数:
– GetDlgItemTextA(GetDlgItemTextW) – GetWindowTextA(GetWindowTextW)
调试技巧总结
• 7.一般我们要结合经验通过猜测的方式多尝试几遍设 陷阱,找出相关的函数。
• 8.按“Ctrl+G”键打开跟随表达式的窗口。 • 9.也可以通过“Ctrl+N”键打开应用程序的导入表(
准备工作
• 拆解一个Windows程序要比拆解一个DOS程序容易 得多,因为在Windows中,只要API函数被使用, 想对寻找蛛丝马迹的人隐藏一些东西是比较困难 的。
• 因此分析一个程序,用什么API函数作为切入点就 显得比较关键了。这也正是小甲鱼常跟大家说破 解靠的是耐心和经验的道理!
• 为了便于大家理解,我们先把TraceMe这个序列号 验证程序流程图给大家展示出来:
OD使用教程
• 今天小甲鱼给大家演示使用OD破解《解密系列》 里边的小程序的过程。
• 《解密系列》里固然破解过程说明,但是看过此 书的朋友无不说太简单带过了,书中仅提到破解 该程序的简要步骤。
• 但是我们强调一定要知其然且知其所以然!所以 在今天的演示中,小甲鱼会用一样的程序讲出更 全面的内容!
OllyDBG断点
OllyDBG断点INT3 断点INT3 断点是在汇编指中向下断地址写⼊0xCC指令,当被调试进程执⾏INT3指令时产⽣异常,调试器就会捕获这个异常,从⽽停在断点处。
在OllyDBG中使⽤快捷键F2来设置或取消断点。
硬件断点硬件断点和DRx调试寄存器有关。
DRx调试寄存器共有8个(DR0-DR7),硬件断点的原理是使⽤DR0-DR7设置地址,并使⽤DR7设置状态,所以最多设置4个断点。
设置硬件断点的快捷键是F4内存断点OD可以设置内存访问或写⼊断点,原理是对所设置的地址赋予不可访问/不可写属性,这样当访问/写⼊的时候就会产⽣异常。
OD捕获异常后,⽐较异常地址是不是断点地址,如果是中断。
OllyDBG设置内存断点的⽅式:点击View -> Memory调出内存窗⼝,在需要下断点的地⽅右击选择set memory breakpoint on write内存访问⼀次性断点windows对内存使⽤段页式的管理⽅式。
在OD⾥按“Alt+M”快捷键显⽰内存,可以看到许多个段,每个段都有不可访问、读、写、执⾏属性。
在相应的段上点击右键,会在快捷菜单中发现⼀个命令“set memory breakpoint on access”,⽤于对整个内存块设置断点。
这个断点是⼀次性的,当所在段被读取或执⾏时就会中断。
如果想捕获调⽤或返回某个模块,该类断点就⾮常有⽤。
消息断点Windows本⾝是由消息驱动的,如果调试时没有合适的断点,可以尝试使⽤消息断点,当某个特定窗⼝函数接受到某个指定消息时,消息断点将使程序中断。
消息断点与INT 3断点的区别在于:INT 3断点可以在程序启动之前设置,消息断点只有在窗⼝被创建之后才能被设置并拦截消息的断点设置⽅法:View -> Windows列出窗⼝中相关参数OD⽆法反汇编代码逆向脱ASPack壳找OEP时发现程序在跳转到OEP后OD⽆法分析出代码,如下图。
按Ctrl+A或者右键删除分析即可。
od 硬件条件断点
od 硬件条件断点OD(OpenOCD)是一种开源的调试和仿真工具,可以在嵌入式系统中使用。
它支持硬件条件断点,这是一种在特定条件触发时暂停程序执行的断点。
硬件条件断点是通过在处理器的调试接口上设置断点来实现的,而不是在软件层面上进行。
它可以根据处理器的内部状态、寄存器的值或内存的内容等条件来触发断点。
要使用OD进行硬件条件断点调试,通常需要使用支持调试接口的硬件调试器(例如JTAG或SWD)。
首先,需要将调试器连接到目标系统的调试接口上,并与OD进行通信。
然后,在OD的配置文件中配置断点条件,可以使用GDB的表达式语法来编写条件。
以下是使用OD进行硬件条件断点的一些示例配置:1. 在特定地址上设置断点:```breakpoint {type hardwareenablelocation 0x80001000}```2. 在特定寄存器值上设置断点:```breakpoint {type hardwareenableexpression REGNAME == 0x12345678}```其中,REGNAME是待观察的寄存器名字。
3. 在特定内存值上设置断点:```breakpoint {type hardwareenableexpression *0x80001000 == 0x12345678}```以上是一些示例,具体的配置语法和可用的条件表达式取决于OD的版本和目标处理器的支持程度。
在实际使用中,可以参考OD的文档和相关资料来了解更多详细信息。
OD断点
大多数壳都有一个共同的特点。
在壳准备开始解压时都要执行PUSHAD,当壳解压完时都要调用POPAD。
到底PUSHAD和POPAD 是什么干什么用的呢?其实PUSHAD是用来将所有普通寄存器顺序进栈的指令,POPAD 是所有普通寄存器顺序出栈指令。
POPAD 的出栈顺序和PUSHAD相反。
壳为了保护寄存器,便在解压前将所有寄存器进栈保护起来,当解压完成后又将寄存器出栈,恢复其原貌,并将IP设置为原程序的OEP。
这样我们就可以通过这个特点快速脱掉多种软件的壳。
32位程序级的调试器--ollyDbg,这个东东操作简便,提示信息量大,介绍一些简单的操作快捷键:F3,装入程序F8,单步执行,不进入callF9 (运行)F7,单步执行,进入callCTRL+F9,相当于trw2000的F12ALT+F9,相关于trw2000的pmodule F2,设置断点(相当于trw2000的F9)CTRL+N(当前模块中的名称)F12(暂定)CTRL+F12(重新运行)CTRL+F11(跟踪进入)CTRL+T(设置条件)CTRL+F7(自动步入)CTRL+F8(自动步过)CTRL+F9(执行到返回)另转的快捷键使用方法如下OllyDbg 常用快捷热键聆风听雨整理==================================== ===========================打开一个新的可执行程序 (F3)重新运行当前调试的程序 (Ctrl+F2)当前调试的程序 (Alt+F2)运行选定的程序进行调试 (F9)暂时停止被调试程序的执行 (F12)单步进入被调试程序的 Call 中 (F7) 步过被调试程序的 Call (F8)跟入被调试程序的 Call 中 (Ctrl+F11) 跟踪时跳过被调试程序的 Call(Ctrl+F12)执行直到返回 (Ctrl+F9) 显示记录窗口 (Alt+L)显示模块窗口 (Alt+E)显示内存窗口 (Alt+M)显示 CPU 窗口 (Alt+C)显示补丁窗口 (Ctrl+P)显示呼叫堆栈 (Alt+K)显示断点窗口 (Alt+B)打开调试选项窗口 (Alt+O)窗口:左上:代码区左下:内存数据右上:寄存器右下:stack区以下命令适用于 OllyDbg 的快捷命令栏插件(显示于程序的状态栏上方)==================================== ====================CALC判断表达式WATCH添加监视表达式AT / FOLLOW Disassemble at address 在地址进行反汇编orIGDisassemble at EIP反汇编于 EIPDUMPDump at address在地址转存DADump as disassembly转存为反汇编代码DBDump in hex byte format 转存在十六进制字节格式DCDump in ASCII format转存在 ASCII 格式DDDump in stack format转存在堆栈格式DUDump in UNICODE format 转存在 UNICODE 格式DWDump in hex word format 转存在十六进制字词格式STKGo to address in stack 前往堆栈中的地址AS + 地址 + 字符串Assemble at address 在地址进行汇编L + 地址 + 字符串Label at address在地址进行标号C + 地址 + 字符串Comment at address 在地址进行注释BPBreak with condition 使用条件中断BPXBreak on all calls 中断在全部调用Delete break on all calls 清除位于全部调用的断点BCDelete breakpoint清除断点MRMemory breakpt on access 内存断点于访问时MWMemory breakpt on write 内存断点于写入时MDRemove memory breakpoint 清除内存断点HW break on access硬件中断在访问HWHW break on write硬件中断在写入HEHW break on execution 硬件中断在执行HDRemove HW breakpoint 清除硬件断点STOPPause execution暂停执行PAUSEPAUSERUNRun program运行程序Run till address运行到地址GERun and pass exception 运行和通过例外SIStep into步入SOStep over步过TITrace in till address跟踪进入直到地址TOTrace over till address 跟踪步过直到地址TCTrace in till condition 跟踪进入直到条件TOCTrace over till condition 跟踪步过直到条件TRTill return直到返回TUTill user code直到用户代码LOGView Log window查看记录窗口MODView Modules window 查看模块窗口MEMView Memory window 查看内存窗口CPUView CPU window查看 CPU 窗口CSView Call Stack查看 Call 堆栈BRKView Breakpoints window 查看断点窗口OPTOpen Options打开选项EXIT / QUITQuit OllyDbg退出 OllyDbgOPENOpen executable file打开可执行文件CLOSEClose executable关闭程序RSTRestart current program恢复当前程序HELPHelp on API functionAPI 函数的帮助ASMAssemble (if command needs it's own addres, \"ASM COMMAND;ADDRESS\") 汇编 (如果命令需要自身的地址 \"ASM COMMAND;ADDRESS\")DASMDisassemble immediate opcode反汇编直接的机器码FRFind reference to selected command/address查找参考到选定的命令/地址ACAnalyse code分析代码SNSearch for Name(label) in current module在当前模块中搜索名称(标号)SOBScan object files扫描项目文件Name: ollydbg 命令行帮助文件.rar Size: 6071 B此文件的引用地址为:up/1141912360.rarName: OllyDbg-script v1.081命令中文解说.rar Size: 219473 B此文件的引用地址为:up/1141912390.rar一、Ollydbg 中断方法Quote:originally posted by dong at 2004-6-1 10:29 PM:我问个问题在od中怎么下断点呢??现在有的程序一点注册就没反映了这样的怎么下断点呢??能介绍下什么情况下什么断点吗?在转存中下硬件访问->Word"断点,下断之后,怎么取消!9398944(老菜鸟) 11:09:59alt+D 按H 然后删除这个没有万能的方法,只能视具体情况而定,就我的经验而言:第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如“未注册”,“已注册”等等之类的,都可用做断点的。
od条件断点使用方法
od条件断点使用方法以od条件断点使用方法为标题,写一篇文章。
一、什么是od条件断点?OD(On Demand)条件断点是一种在软件调试过程中使用的断点技术。
它允许程序在满足特定条件时暂停执行,以便开发人员能够检查程序状态和变量的值。
OD条件断点可帮助程序员快速定位和解决代码中的问题,提高调试效率。
二、OD条件断点的基本使用方法1. 设置断点位置:在需要设置断点的行上右击,选择"设置断点",或在代码行上插入断点标记。
2. 设置断点条件:在断点属性中,设置断点的条件表达式。
例如,当某个变量的值等于特定的数值时,断点会触发。
3. 调试程序:运行程序并触发断点条件。
当断点条件满足时,程序会自动暂停执行,并进入调试模式。
4. 调试过程中的操作:在调试模式下,可以查看当前程序状态、变量的值、调用栈等信息。
还可以单步执行代码,观察程序的执行流程。
5. 修改断点条件:如果需要修改断点条件,可以在调试过程中对断点属性进行修改。
三、OD条件断点的高级使用方法1. 多重条件断点:在一个断点位置上设置多个条件表达式,只有所有条件都满足时,断点才会触发。
这对于需要同时满足多个条件的调试场景非常有用。
2. 条件断点的持续性:可以设置断点的持续性,即断点是否在每次程序运行时保留。
有时,我们希望某个断点只在特定的调试阶段生效,可以将其设置为非持续性断点。
3. 断点命令:在断点属性中,可以添加一些调试命令。
当断点触发时,这些命令会被执行。
例如,可以在断点命令中输出日志信息或修改变量的值。
4. 条件断点的禁用和启用:在调试过程中,可以随时禁用或启用某个断点。
这对于临时屏蔽某个断点或重新启用已禁用的断点非常方便。
四、OD条件断点的使用场景1. 调试复杂逻辑:当程序中存在复杂的判断逻辑时,可以设置条件断点来观察程序在不同条件下的执行情况。
2. 监控变量值:当需要监控某个变量的值是否满足特定条件时,可以设置条件断点。
OD反调试大全
调试技巧总结-原理和实现-------------------------------------------------------------------------------------------------------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、我并没有总结完全,上面的部分分类目前还只有很少的函数甚至空白,等待大家和我一起来完善和补充。
使用OllyDbg从零开始Cracking 第十章-断点
第十章-断点本章将介绍各种类型的断点。
断点可以让你在程序代码执行到合适的时候暂停下来。
这次我们的实验的对象还是CrueHead’a的CrackMe。
普通断点这是一个很普通的断点,我们前面章节已经使用了。
在SoftIce中我们可以使用BPX命令来设置断点。
OD中可以使用BP命令或者F2快捷键来设置断点。
也可以再按一次F2快捷键来取消断点。
我们来到CrueHead’a的CrackMe的入口点处。
举个例子,拿401018这行来说吧,按F2键-这行就会以红色突出显示,在该地址处设置的断点就会加入了断点列表中。
我们来看看断点列表刚刚设置的断点,此时该断点是激活状态。
断点列表中Active栏显示的是Always。
在该行上单击鼠标右键会弹出一些操作断点的菜单项。
Remove:从列表中删除断点。
Disable:禁用断点但并不将断点从列表中删除。
禁用时,断点并不会触发。
Edit condition:给断点设置触发条件,我们后面再来讨论。
Follow in disassembler:在反汇编窗口中显示断点。
Disable all or enable all:禁用/启用列表中的全部断点。
这里没有启用的选项,因为列表中唯一的断点没有被禁用。
Copy to Clipboard:把选中断点的信息复制到剪贴板。
我们来实验一下。
我们选择Whole line拷贝整行,Whole Table可以拷贝整个列表的断点信息。
Breakpoints, item 0Address=00401018Module=CRACKMEActive=AlwaysDisassembly=OR EAX,EAX拷贝下来的信息显示了断点的地址,对应的指令以及激活状态。
按下F9键-CrackMe运行起来了。
然后正如猜想的一样中断了下来。
在状态栏显示暂停状态。
暂停的原因如下:我们来了解一下当设置一个断点以后,二进制代码会发生什么变化。
单击鼠标右键选择-Follow in Dump-Selection我们看看数据窗口中401018地址处的内容:我们初看一下数据窗口中的内容和反汇编代码中代码是一样的:数据窗口和反汇编代码中我们看到的都是0B C0,对应的是OR EAX,EAX。
找万能断点方法
断点是一个信号,它通知调试器,在某个特定点上暂时将程序执行挂起。
当执行在某个断点处挂起时,我们称程序处于中断模式。
进入中断模式并不会终止或结束程序的执行。
执行可以在任何时候继续。
断点模式可以看作一种超时。
所有元素(例如,函数、变量和对象)都保留在内存中,但它们的移动和活动被挂起了。
在中断模式下,您可以检查它们的位置和状态,以查看是否存在冲突或 bug。
您可以在中断模式下对程序进行调整。
例如,可以更改变量的值。
可以移动执行点,这会改变执行恢复后将要执行的下一条语句。
在 C++、C# 和 Visual Basic 中,甚至可以在中断模式下对代码本身进行更改(使用一种称为“编辑并继续”的强大功能)。
断点提供了一种强大的工具,使您能够在需要的时间和位置挂起执行。
与逐句或逐条指令地检查代码不同的是,可以让程序一直执行,直到遇到断点,然后开始调试。
这大大地加快了调试过程。
没有这个功能,调试大的程序几乎是不可能的。
许多编程语言都有用于挂起执行并使程序进入中断模式的语句或构造。
例如,Visual Basic 有Stop语句。
断点不同于这些语句,因为它不是必须添加到程序中的实际源代码。
您不必在源代码窗口中键入断点语句。
只需通过调试器界面请求断点,由调试器加入断点。
要插入行断点,请在要设置断点的行旁边的灰色空白中单击。
利用全功能的“断点”窗口,可以处理更复杂的断点。
相对于调试构造(如 Visual Basic 的 Stop 语句),断点具有很多优点。
不必改动程序源代码就可以删除或更改断点。
由于断点不是语句,当生成程序的发行版时,它们不会产生额外的代码。
如果在程序中使用Stop语句,则需要在生成发行版本之前手动删除Stop语句,或者使用如下所示的条件句式:复制代码#If DEBUG Then Stop #End If如果想暂时禁用Stop语句,需要在源代码中找到该语句并对它进行注释:复制代码' Stop如果只有一条Stop语句,这样做当然没问题。
OD工具破解VB程序的常用断点
OD工具破解VB程序的常用断点OD工具破解VB程序的常用断点(转)-现在也流行破解常用断点设置-- 收集的精华(编缉分类好装入PYG记事本)bpx hmemcpy 破解万能断点,拦截内存拷贝动作 (注意:Win9x 专用断点,XP无效)bpx Lockmytask 当你用其它断点都无效时可以试一下,这个断点拦截按键的动作实在找不到断点可以试下面的方法:bmsg handle wm_gettext 拦截注册码(handle为对应窗口的句柄)bmsg handle wm_command 拦截OK按钮(handle为对应窗口的句柄)拦截窗口:bpx CreateWindow 创建窗口bpx CreateWindowEx(A/W) 创建窗口bpx ShowWindow 显示窗口bpx UpdateWindow 更新窗口bpx GetWindowText(A/W) 获取窗口文本拦截消息框:bpx MessageBox(A) 创建消息框bpx MessageBoxExA 创建消息框bpx MessageBoxIndirect(A) 创建定制消息框拦截警告声:bpx MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)拦截对话框:bpx DialogBox 创建模态对话框bpx DialogBoxParam(A/W) 创建模态对话框bpx DialogBoxIndirect 创建模态对话框bpx DialogBoxIndirectParam(A/W) 创建模态对话框bpx CreateDialog 创建非模态对话框bpx CreateDialogParam(A) 创建非模态对话框bpx CreateDialogIndirect 创建非模态对话框bpx CreateDialogIndirectParam(A/W) 创建非模态对话框bpx GetDlgItemText(A/W) 获取对话框文本bpx GetDlgItemInt 获取对话框整数值拦截剪贴板:bpx GetClipboardData 获取剪贴板数据拦截注册表:bpx RegOpenKey(A) 打开子健( 例:bpx RegOpenKey(A) if *(esp+8)=='****' )bpx RegOpenKeyEx 打开子健( 例:bpx RegOpenKeyEx if *(esp+8)=='****' )bpx RegQueryValue(A) 查找子健 ( 例:bpx RegQueryValue(A) if *(esp+8)=='****' )bpx RegQueryValueEx 查找子健 ( 例:bpx RegQueryValueEx if *(esp+8)=='****' )bpx RegSetValue(A) 设置子健( 例:bpx RegSetValue(A) if *(esp+8)=='****' )bpx RegSetValueEx(A) 设置子健 ( 例:bpx RegSetValueEx(A) if *(esp+8)=='****' )注意:“****”为指定子键名的前4个字符,如子键为“Regcode”,则“****”= “Regc”==================功能限制拦截断点:bpx EnableMenuItem 禁止或允许菜单项bpx EnableWindow 禁止或允许窗口bmsg hMenu wm_command 拦截菜单按键事件,其中hMenu 为菜单句柄bpx K32Thk1632Prolog 配合bmsg hMenu wm_command使用,可以通过这个断点进入菜单处理程序应用示例:CALL [KERNEL32!K32Thk1632Prolog]CALL [......] <-- 由此跟踪进入菜单处理程序CALL [KERNEL32!K32Thk1632Epilog]======================拦截时间:bpx GetLocalTime 获取本地时间bpx GetSystemTime 获取系统时间bpx GetFileTime 获取文件时间bpx GetTickCount 获得自系统成功启动以来所经历的毫秒数bpx GetCurrentTime 获取当前时间(16位)bpx SetTimer 创建定时器bpx TimerProc 定时器超时回调函数拦截文件:bpx CreateFileA 创建或打开文件 (32位)bpx OpenFile 打开文件 (32位)bpx ReadFile 读文件 (32位)bpx WriteFile 写文件 (32位)bpx _lcreat 创建或打开文件 (16位)bpx _lopen 打开文件 (16位)bpx _lread 读文件 (16位)bpx _lwrite 写文件 (16位)bpx _hread 读文件 (16位)bpx _hwrite 写文件 (16位)拦截驱动器:bpx GetDrivetype(A/W) 获取磁盘驱动器类型bpx GetLogicalDrives 获取逻辑驱动器符号bpx GetLogicalDriveStringsA(W) 获取当前所有逻辑驱动器的根驱动器路径拦截狗:bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口+++++++++++VB程序专用断点:++++++++++bp__vbaFreeStr 偶发现了VB杀手断点.不管是重起验证.还是有错误提示的VB..下这个断点通杀bpx msvbvm50!__vbaStrCmp 比较字符串是否相等bpx msvbvm50!__vbaStrComp 比较字符串是否相等bpx msvbvm50!__vbaVarTstNe 比较变量是否不相等bpx msvbvm50!__vbaVarTstEq 比较变量是否相等bpx msvbvm50!__vbaStrCopy 复制字符串bpx msvbvm50!__vbaStrMove 移动字符串bpx MultiByteT oWideChar ANSI字符串转换成Unicode字符串bpx WideCharToMultiByte Unicode字符串转换成ANSI字符串上面的断点对应VB5程序,如果是VB6程序则将msvbvm50改成msvbvm60即可VB程序的破解VB程序使很多朋友感到头痛,主要是VB程序反编译时产生大量的顶!代码,而且也找不到有用的信息,在动态调试过程中,顶!代码太多,往往迷失于冗余的代码中,找不到方向。
OD使用教程7 - 解密系列【调试篇】
破解的思路
• 例如jmp eax,无疑是一个直接的跳转。但是我们 知道eax是一个寄存器,对于高级语言的说法它就 是一个变量,里边的值随时可以改变。
• 那么完全可以这样:
– 未注册 -> eax == 004013A0 – 已注册 -> eax == 00401354
• 所以这个例子告诉我们,世界很大,也很邪恶, 坏叔叔很多,他们鬼点子更多,要实现技术的突 破,就要打破传统的思维模式。
OD使用教程7
• 小甲鱼觉得,掌握逆向的思维尤为重要。所以在 咱的OD使用教程中,不单会告诉你怎么去逆向这 个软件,小甲鱼更多想引导大家发挥自己的想象 力,在理解原理的基础上用更多创新的方法实现 突破。(此处应该有掌声)
• 好滴,咱一起来看一下今天的对手,正所谓知己 知彼杀杀杀!
• VisualSite Designer.exe
认识OD的两种断点
– 传说中,有这么一些寄存器,它们只用于调试,我 们称为调试寄存器:Dr0~Dr7
– 其中Dr0~Dr3四个寄存器用来存放中断地址,Dr4、 Dr5保留不使用,Dr6、Dr7用来记录Dr0~Dr3的属性 (如读,写还是执行,单位是字节,字还是双字) 。
–Байду номын сангаас因此,这就解释了为啥硬件断点只有四个,天生不 足哈。
认识OD的两种断点
– 另外还需要提一下的是,内存断点会明显降低OD 的性能,因为OD经常会校对内存。
• 软件断点: – 当我们按下F2设置的断点就是软件断点。 – 设置该断点的原理是在断点处重写代码,插入一个 int3中断指令,当CPU执行到int3指令的时候,OD 就可以获得控制权。
• 硬件断点: – 这个原理跟软件断点不同,硬件断点的可行性依赖 于CPU的物理支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拦截窗口:bp CreateWindow 创建窗口bp CreateWindowEx(A) 创建窗口bp ShowWindow 显示窗口bp UpdateWindow 更新窗口bp GetWindowText(A) 获取窗口文本拦截消息框:bp MessageBox(A) 创建消息框bp MessageBoxExA 创建消息框bp MessageBoxIndirect(A) 创建定制消息框拦截警告声: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 定时器超时回调函数拦截文件:bp CreateFileA 创建或打开文件(32位)bp OpenFile 打开文件 (32位)bp ReadFile 读文件(32位)bp WriteFile 写文件(32位)bp GetPrivateProfileStringA (ini文件)拦截驱动器:bp GetDriveTypeA 获取磁盘驱动器类型bp GetLogicalDrives 获取逻辑驱动器符号bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径★★VB程序专用断点★★bp __vbaStrCmp 比较字符串是否相等bp __vbaStrComp 比较字符串是否相等bp __vbaVarTstNe 比较变量是否不相等bp __vbaVarTstEq 比较变量是否相等bp __vbaStrCopy 复制字符串bp __vbaStrMove 移动字符串bp MultiByteToWideChar ANSI字符串转换成Unicode字符串bp WideCharToMultiByte Unicode字符串转换成ANSI字符串解自校验bpx CreateFileAbpx GetFileSizebpx SetFilePointerbpx ExitProcessF12堆栈调用破解思路C类Point-H法bp GetDlgItem(断输入框)bp MessageBoxA(断对话框)字符串法F12堆栈调用B、D类DEDE、PE Explorer作为强有力的辅助工具关键还是找按妞事件Point-H法bp GetDlgItem(断输入框)bp MessageBoxA(断对话框)字符串法F12堆栈调用V类VBExplorer、GetVBRes、SmatCheck作为强有力的辅助工具关键还是找按妞事件bp rtcMsgBox(断对话框)*********************************如果是重启验证就使用最开始的那些断点C类语言破解1、bp MessageBoxA(W)(断对话框)—Ctrl+N2、Point-H法3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (断输入框)4、字符串法—插件/搜索所有参考文本Delphi/BC++语言破解1、DEDE结合PE Explorer找按妞事件2、Point-H法3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (断输入框)4、bp MessageBoxA(W)(断对话框)—Ctrl+N5、字符串法—插件/搜索所有参考文本6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样,可以通过DEDE查找FormCreate/FormShow,找到关键标志位VB语言破解1、VBExplorer查找按钮事件2、有提示框则 bp rtcMsgBox(断对话框)3、通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq4、万能断点法(816C24法)5、字符串法—插件/搜索所有参考文本易语言破解1、借助E-Code Explorer查找按钮事件2、下消息断点,查看堆栈再返回3、eCode法–断按钮事件4、字符串法—插件/搜索所有参考文本按钮事件固定模式:0040EC78 837D F4 00 cmp dword ptr ss:[ebp-C],0 ;关键判断0040EC7C 0F84 3B000000 je dcse.0040ECBD ;关键跳0040EC82 68 04000080 push 800000040040EC87 6A 00 push 00040EC89 68 EC904000 push dcse.004090EC0040EC8E 68 01030080 push 800003010040EC93 6A 00 push 000 40EC95 68 00000000 push 00040EC9A 68 04000080 push 800000040040EC9F 6A 00 push 00040ECA1 68 F1904000 push dcse.004090F10040ECA6 68 03000000 push 30040ECAB BB 00030000 mov ebx,3000040ECB0 E8 92000000 call dcse.0040ED470040ECB5 83C4 28 add esp,280040ECB8 E9 36000000 jmp dcse.0040ECF30040ECBD 68 04000080 push 800000040040ECC2 6A 00 push 00040ECC4 68 CC904000 push dcse.004090CC0040ECC9 68 01030080 push 800003010040ECCE 6A 00 push 00040ECD0 68 00000000 push 00040ECD5 68 04000080 push 800000040040ECDA 6A 00 push 00040ECDC 68 02914000 push dcse.004091020040ECE1 68 03000000 push 30040ECE6 BB 00030000 mov ebx,3000040ECEB E8 57000000 call dcse.0040ED470040ECF0 83C4 28 add esp,280040ECF3 8BE5 mov esp,ebp0040ECF5 5D pop ebp0040ECF6 C3 retn******************************************************************************* ***********************************************************按钮事件1、有注册错误/正确提示bp MessageBoxAbp rtcMsgBox如果事先找不到按钮事件,可以通过下消息断点,返回后回溯即可找到按钮事件起始位置2、无任何提示bp GetDlgItem可以通过bp GetDlgItem获取按钮事件代码3、未注册一启动或者关闭就跳出个注册框或者提示框bp RegOpenKey(A)bp CreateFileAbp GetPrivateProfileStringA文件: reg/ini/dll/其他至于保存到什么文件,可以使用以下方法1、查找字符串,看是否有可疑文件名或者注册表键名2、猜。
下断点观察3、按钮事件跟踪4、未注册一启动或者关闭就打开网页链接bp ShellExecuteA类似的组合Cmp/test/其他判断Je/jne/jne/jz XXXXXXXX软件启动—>判断是否注册—>是否Open断下后回溯代码即可找到关键点,常用的方法,转存跟踪法5、未注册就功能使用限制判断是否注册—>某种功能是否让你使用,如果不能够用,一定会有提示的,或是错误提示或是弹出注册框等,那么从提示入手即可找到解除限制的关键不完美破解:解除功能限制6、未注册就日期限制bp GetLocalTime 获取本地时间bp GetSystemTime 获取系统时间bp GetFileTime 获取文件时间一般下这几个断点比较难分析关键捷径:查找字符串–找可疑文件–一般以DLL多见只要不让它读取到这个DLL即可解除限制7、Demo(演示试用版)–功能残缺这个和上面的功能限制不一样功能限制是软件本身就有这个功能,对程序而言,相对应的功能代码也存在Demo即是没这个功能,空架子一个而已一句话:破解也无用!8、网络验证无法登陆有错误提示者:下消息断点回溯代码,找按钮事件,从头来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了无法登陆自动退出者:下bp ExitProcess断下(一般可以断下)回溯代码,找按钮事件,从来来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了9、狗加密一般狗加密软件,一启动就会检测所需要的狗文件,若没有狗文件,提示错误这里我们有两个入手点1、―一启动就会检测所需要的狗文件‖,下bp CreateFileA等断点,断下后,回溯2、―若没有狗文件,提示错误‖,下bp MessageBoxA,断下后,回溯总结:从上面的介绍说明可以看出,有这么一个共同点—按钮事件,可以这么说,按钮事件是我们的思路之门按钮事件可以这样得来:1、通过下相应断点,回溯代码2、通过辅助工具快捷的得到(VBExplorer、DEDE)******************************************************************************* ***********************************************************重启验证80%-90%的软件基本都是重启验证类型1、注册表类型Bpx RegOpenKeyA(W)Bpx RegOpenKeyExA(W)2、ini文件类型(*.reg/*.ini)Bpx GetPrivateProfileStringA3、其他文件类型(*.dat/*.lic…)Bpx CreateFileA(W)Bpx ReadFile4、DLL文件操作类型如果没有什么有效的拦截函数,不妨试一下Bpx CreateFileA(W).余下的就是通过你的经验去判断了(例如:35课)注意:建议使用Bpx断点,这样,比较快捷、准确。