OD硬件断点&内存断点

合集下载

OD常用断点

OD常用断点

附个断点表:常用断点(OD中)拦截窗口:bp CreateWindow 创建窗口bp CreateWindowEx(A) 创建窗口bp ShowWindow 显示窗口bp UpdateWindow 更新窗口bp GetWindowT ext(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 __vbaVarT stNe 比较变量是否不相等bp __vbaVarT stEq 比较变量是否相等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出册码出来了。

OD下断点的方法

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中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。

OllyDBG分析报告系列(3)---硬件断点

OllyDBG分析报告系列(3)---硬件断点

方的韩国Ollydbg(以下均简称为OD)中的硬件断点的主要原理是:将要下断点的内存地址放入调试寄存器对应的选项中,由调试寄存器将其断下,并报异常给OD,等待调试人员操作。

硬件断点的长度有3种情况:1个字节(1)、2个字节(2)、4个字节(4)硬件标识有8种情况:未知(0)、执行断点(1)、访问断点(2)、写入断点(3)、未知(4)、临时断点(5)、未知(6)、未知(7)临时断点主要用于单步跳过OD在以下结构体中存放了以下硬件断点的信息:第一个4字节:硬件断点的首地址第二个4字节:硬件断点的长度第三个4字节:硬件断点的标识下面三个4字节:未知004D8D70 7A 06 40 00 01 00 00 00 02 00 00 00 00 00 00 00 z @. ... .......004D8D80 00 00 00 00 00 00 00 00 00 00 00 00 ............通过分析,硬件断点表的设置、断点表的添加以及断点表的删除都是由不同的函数来完成的,一共有三个函数。

这里硬件断点表的添加和删除要特别说明一下,函数中会在添加断点表时检查调试线程是否是运行状态,如果是运行状态就会进入一个判断函数,并查看是否需要断下。

写完断点表后,断点的处理就不需要由这两个函数来完成了。

这里先概括的介绍其流程,下面再详细分析代码:添加硬件断点表(Sethardwarebreakpoint):该函数有三个参数:断点首地址、断点长度、断点标识(访问、写入、执行断点等等)1、判断是何种类型的断点,若是可执行断点的话,下断的内存长度只能是1,而且会强制设为1;2、若为断点类型不为4(这个还没有逆向出来)的话,要判断下断的内存长度是否是4的倍数,如果不是则退出;3、判断下断的内存长度是否为1、2、4,如果都不符合,则退出;4、读取硬件断点表数据,用于下面的比较;5、循环判断当前断点是否已经存在在硬件断点表中,判断的方法如下:a) 判断断点类型是否相同,不同则判断表中的下一个元素;b) 断点地址是否相同,相同则继续,不同则判断原先的断点是否命中在当前断点地址之中,若在其中,则修改原先的断点地址和长度,若不在其范围内,则判断下一个元素;c) 断点长度是否相同,相同则继续,不同则如同b的处理;d) 判断4个硬件调试寄存器是否已经用完,若用完了,则弹出硬件断点对话框,传入参数为1,要求用户必须删掉一个断点,若不删除,则退出;e) 若为类型为5、6、7的话,直接退出;f) 若有空余的寄存器元素,则把当前的断点信息赋值;6、检查线程是否运行,线程信息结构体是否存在,若没有运行则跳过下面的处理,直接退出;7、暂停所有活动线程;8、遍历所有线程,查询硬件断点表,EIP的地址是否等于断点表中的地址,判断方法如下:a) 设置调试寄存器属性为CONTEXT_DEBUG_REGISTERS,并得到线程环境,若得到线程环境失败则查询下一个线程;b) 根据硬件断点表中的数据修改线程环境结构体数据;c) 遍历整个硬件断点表,判断表中是否有值,若无则继续检查下一个;d) 根据硬件断点的不同做相应的处理,主要是设置调试寄存器的dr7;e) 遍历完硬件断点表后,使用SetThreadContext函数将线程环境设置回去;f) 继续遍历线程9、重启线程并退出函数00451CE3 . 6A 03 push 3 ; BreakPoint_Flag00451CE5 . 6A 01 push 1 ; BreakPoint_Len00451CE7 . 8B4D B0 mov ecx, dword ptr [ebp-50] ; |00451CEA . 51 push ecx ; | BreakPoint_Addr00451CEB . E8 A069FBFF call _Sethardwarebreakpoint ; \_Sethardwarebreakpoint该函数主要有三个参数:断点首地址、断点长度、断点标识(访问、写入、执行断点)00408690 >/$ 55 push ebp00408691 |. 8BEC mov ebp, esp00408693 |. 81C4 24FDFFFF add esp, -2DC00408699 |. 53 push ebx0040869A |. 56 push esi0040869B |. 57 push edi0040869C |. 8B75 10 mov esi, dword ptr [ebp+10] ;断点标识0040869F |. 8B7D 08 mov edi, dword ptr [ebp+8] ;断点首地址004086A2 |. 833D 5C374D00>cmp dword ptr [4D375C], 0004086A9 |. 75 08 jnz short 004086B3004086AB |. 83C8 FF or eax, FFFFFFFF004086AE |. E9 2F030000 jmp 004089E2一个switch…case循环体,用来判断要设置什么类型的硬件断点:004086B3 |> 83FE 01 cmp esi, 1 ;比较是否是执行断点004086B6 |. 74 0F je short 004086C7 ;跳转到处理函数004086B8 |. 83FE 05 cmp esi, 5004086BB |. 74 0A je short 004086C7004086BD |. 83FE 06 cmp esi, 6004086C0 |. 74 05 je short 004086C7004086C2 |. 83FE 07 cmp esi, 7004086C5 |. 75 09 jnz short 004086D0 ;如果都不是,跳到下面处理处理执行断点:004086C7 |> C745 0C 01000>mov dword ptr [ebp+C], 1 ;设置断点长度为1 004086CE |. EB 21 jmp short 004086F1 ;跳转到长度处理比较该断点标识是不是4004086D0 |> 83FE 04 cmp esi, 4004086D3 |. 75 08 jnz short 004086DD004086D5 |. 81E7 FFFF0000 and edi, 0FFFF ; Case 4004086DB |. EB 14 jmp short 004086F1 ;跳转到长度处理比较该断点标识是不是0004086DD |> 85F6 test esi, esi004086DF |. 74 10 je short 004086F1 ;跳转到长度处理断点标识为1、2、3时检查断点的长度及地址是否按内存对齐:004086E1 |. 8B55 0C mov edx, dword ptr [ebp+C] ; Default004086E4 |. 4A dec edx004086E5 |. 85FA test edx, edi004086E7 |. 74 08 je short 004086F1 ;跳转到长度处理004086E9 |. 83C8 FF or eax, FFFFFFFF ;内存不对齐则返回错误004086EC |. E9 F1020000 jmp 004089E2断点长度检查处理:004086F1 |> 837D 0C 01 cmp dword ptr [ebp+C], 1 ; Case 0004086F5 |. 74 14 je short 0040870B ;长度为一跳转004086F7 |. 837D 0C 02 cmp dword ptr [ebp+C], 2004086FB |. 74 0E je short 0040870B ;长度为二跳转004086FD |. 837D 0C 04 cmp dword ptr [ebp+C], 400408701 |. 74 08 je short 0040870B ;长度为四跳转00408703 |. 83C8 FF or eax, FFFFFFFF ;长度不为1 / 2 / 4时,返回错误00408706 |. E9 D7020000 jmp 004089E2查询断点表,要下的断点是否在表中,如果是则直接返回:0040870B |> B8 708D4D00 mov eax, 004D8D70 ;004D8070是断点表的首地址00408710 |. 33D2 xor edx, edx00408712 |. 8955 F8 mov dword ptr [ebp-8], edx00408715 |. 33DB xor ebx, ebx00408717 |> 8B50 08 /mov edx, dword ptr [eax+8]0040871A |. 85D2 |test edx, edx ;查询表是否有记录0040871C |. 74 3E |je short 0040875C ;没有则跳转到下一个记录结构体0040871E |. 3BF2 |cmp esi, edx ;比较断点类型是否相同00408720 |. 75 3A |jnz short 0040875C ;不同则跳转到下一个记录结构体如果要下的断点在断点表某个断点的范围内,则直接返回:00408722 |. 3B38 |cmp edi, dword ptr [eax] ;比较断点首地址与断点表地址00408724 |. 72 15 |jb short 0040873B ;断点首地址小则跳转00408726 |. 8B08 |mov ecx, dword ptr [eax]00408728 |. 8B55 0C |mov edx, dword ptr [ebp+C]0040872B |. 0348 04 |add ecx, dword ptr [eax+4]0040872E |. 03D7 |add edx, edi00408730 |. 3BCA |cmp ecx, edx ;比较断点尾地址与断点表尾地址00408732 |. 72 07 |jb short 0040873B ;断点尾地址大则跳转00408734 |. 33C0 |xor eax, eax00408736 |. E9 A7020000 |jmp 004089E2 ;跳转到结束处如果要下的断点在断点表中存在,则直接返回:0040873B |> 3B38 |cmp edi, dword ptr [eax] ;比较断点首地址与断点表地址0040873D |. 77 1D |ja short 0040875C ;断点首地址大则跳转0040873F |. 8B08 |mov ecx, dword ptr [eax]00408741 |. 8B55 0C |mov edx, dword ptr [ebp+C]00408744 |. 0348 04 |add ecx, dword ptr [eax+4]00408747 |. 03D7 |add edx, edi00408749 |. 3BCA |cmp ecx, edx ;比较断点尾地址与断点表尾地址0040874B |. 77 0F |ja short 0040875C ;断点尾地址小则跳转0040874D |. 8938 |mov dword ptr [eax], edi0040874F |. 8B4D 0C |mov ecx, dword ptr [ebp+C]00408752 |. 8948 04 |mov dword ptr [eax+4], ecx00408755 |. C745 F8 01000>|mov dword ptr [ebp-8], 1跳转到下一个结构体中:0040875C |> 43 |inc ebx0040875D |. 83C0 1C |add eax, 1C00408760 |. 83FB 04 |cmp ebx, 400408763 |.^ 7C B2 \jl short 00408717 如果断点表没访问完,继续比较查询断点是否包含在断点表中,包含则跳转到标识检查:00408765 |. 837D F8 00 cmp dword ptr [ebp-8], 000408769 |. 0F85 91000000 jnz 00408800通过检查断点表中的标识,判断断点表是否已满:0040876F |. 33DB xor ebx, ebx00408771 |. B8 788D4D00 mov eax, 004D8D7800408776 |> 8338 00 /cmp dword ptr [eax], 000408779 |. 74 09 |je short 00408784 ;如果有空位,跳转到下面处理0040877B |. 43 |inc ebx0040877C |. 83C0 1C |add eax, 1C0040877F |. 83FB 04 |cmp ebx, 400408782 |.^ 7C F2 \jl short 00408776 ;若断点表没访问完,继续比较如果断点表未满,则跳转到设置断点表代码中去:00408784 |> 83FB 04 cmp ebx, 400408787 |. 7C 40 jl short 004087C9如果断点表已满,比较断点标识,如果小于5则跳转到处理函数:00408789 |. 83FE 05 cmp esi, 5 ;标识为5,返回-10040878C |. 74 0A je short 004087980040878E |. 83FE 06 cmp esi, 6 ;标识为6,返回-100408791 |. 74 05 je short 0040879800408793 |. 83FE 07 cmp esi, 7 ;标识为7,返回-100408796 |. 75 08 jnz short 004087A000408798 |> 83C8 FF or eax, FFFFFFFF0040879B |. E9 42020000 jmp 004089E2 ;跳转到函数结束处断点表已满处理函数(弹出对话框选择在断点表中删除一个断点来放置现在的断点):004087A0 |> 6A 01 push 1 ; /Arg1 = 00000001004087A2 |. E8 AD070000 call _Hardbreakpoints ; \_Hardbreakpoints004087A7 |. 59 pop ecx004087A8 |. 85C0 test eax, eax ;查看是否有删除断点表中的值004087AA |. 74 08 je short 004087B4 ;如果有删除则跳转到下面检查空位004087AC |. 83C8 FF or eax, FFFFFFFF004087AF |. E9 2E020000 jmp 004089E2 ;如果选择取消,则返回-1这里检查断点表中是否有空位,没有则报错,并返回-1:004087B4 |> 33DB xor ebx, ebx004087B6 |. B8 788D4D00 mov eax, 004D8D78004087BB |> 8338 00 /cmp dword ptr [eax], 0 ;比较断点表的标识变量004087BE |. 74 09 |je short 004087C9 ;如果为0则跳转004087C0 |. 43 |inc ebx ;比较下一个表中的值004087C1 |. 83C0 1C |add eax, 1C004087C4 |. 83FB 04 |cmp ebx, 4004087C7 |.^ 7C F2 \jl short 004087BB ;如果没有比较完,继续比较004087C9 |> 83FB 04 cmp ebx, 4 ;查看断点表中有多少个值004087CC |. 7C 13 jl short 004087E1 ;如果断点表不满则跳转到下面004087CE |. 68 040D4B00 push 004B0D04; /当前没有空闲的位置进行新的硬件中断。

od 硬件条件断点

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. 启动程序,并当程序执行到设置的断点位置时,程序会停止执行并等待你进一步调试。

请注意,硬件条件断点只在特定条件满足时触发断点,因此你需要确保设置的条件是合适的,并且可以满足在期望的情况下触发断点。

此外,硬件断点通常会影响程序的执行速度,因此在调试大型程序时,设置过多的硬件条件断点可能会导致性能下降。

过驱动保护之TsSafe(读写内存OD能附加下硬件断点)

过驱动保护之TsSafe(读写内存OD能附加下硬件断点)

过驱动保护之TsSafe(读写内存OD能附加下硬件断点)————————————————————————————————作者:————————————————————————————————日期:过驱动保护之TesSafe.sys对抗(过了后能读写内存OD能附加下硬件断点)学习各种外挂制作技术,马上去百度搜索"魔鬼作坊" 点击第一个站进入、快速成为做挂达人。

由于我的C用的比较少,所以大部分都用的汇编,部分地方用汇编写不是很方便,所以我用的C,由于只是学习,所以内核地址我没有计算都是硬编码的。

过DNF主要分为三步,也许我的思路不太正确,反正可以OD调试,下断。

程序没怎么修边幅,因为只是测试,所以一般都没有写更改内核后的恢复,不过不妨碍使用。

附加不了就是KiAttachProcess 没恢复。

附加之后什么都没有就是debugport被清零。

第一步,这也是最起码的,你必须要能够打开游戏进程和线程,能够开打进程和线程后不被检测到第二步,能够读写进村内存第三步,能够用OD附加游戏进程第四步,能够下硬件断点而不被检测在NtReadVirtualMemory,NtWriteVirtualMemory函数头处有如下HOOKmov eax,TesSafeproc_Addrjmp eax上述2条指令占8字节跳过NtReadVirtualMemory,NtWriteVirtualMemory函数头的钩子代码:#include<ntddk.h>typedef struct _SERVICE_DESCRIPTOR_TABLE{PVOID ServiceTableBase;PULONG ServiceCounterTableBase;ULONG NumberOfService;ULONG ParamTableBase;}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;//由于KeServiceDescriptorTable只有一项,这里就简单点了Extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数/////////////////////////////////////VOID Hook();VOID Unhook();VOID OnUnload(IN PDRIVER_OBJECT DriverObject);//////////////////////////////////////ULONG JmpAddress;//跳转到NtOpenProcess里的地址ULONG JmpAddress1;//跳转到NtOpenProcess里的地址ULONG OldServiceAddress;//原来NtOpenProcess的服务地址ULONG OldServiceAddress1;//原来NtOpenProcess的服务地址//////////////////////////////////////__declspec(naked) NTSTATUS __stdcall MyNtReadVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress,PVOID Buffer,ULONG NumberOfBytesToRead,PULONG NumberOfBytesReaded){//跳过去__asm{push 0x1cpush 804eb560h //共十个字节jmp [JmpAddress]}}__declspec(naked) NTSTATUS __stdcall MyNtWriteVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress,PVOID Buffer,ULONG NumberOfBytesToWrite,PULONG NumberOfBytesReaded){//跳过去__asm{push 0x1cpush 804eb560h //共十个字节jmp [JmpAddress1]}}///////////////////////////////////////////////////NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){DriverObject->DriverUnload = OnUnload;DbgPrint("Unhooker load");Hook();return STATUS_SUCCESS;}/////////////////////////////////////////////////////VOID OnUnload(IN PDRIVER_OBJECT DriverObject)DbgPrint("Unhooker unload!");Unhook();}/////////////////////////////////////////////////////VOID Hook(){ULONG Address, Address1;Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//0x7A为NtOpenProcess服务IDAddress1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;//0x7A为NtOpenProcess服务IDDbgPrint("Address:0x%08X",Address);OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址OldServiceAddress1 = *(ULONG*)Address1;//保存原来NtOpenProcess的地址DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);DbgPrint("OldServiceAddress1:0x%08X",OldServiceAddress1);DbgPrint("MyNtOpenProcess:0x%08X",MyNtReadVirtualMemory);DbgPrint("MyNtOpenProcess:0x%08X",MyNtWriteVirtualMemory);JmpAddress = (ULONG)0x805b528a + 7; //跳转到NtOpenProcess函数头+10的地方,这样在其前面写的JMP都失效了JmpAddress1 = (ULONG)0x805b5394 + 7;DbgPrint("JmpAddress:0x%08X",JmpAddress);DbgPrint("JmpAddress1:0x%08X",JmpAddress1);__asm{ //去掉内存保护climov eax,cr0and eax,not 10000hmov cr0,eax}*((ULONG*)Address) = (ULONG)MyNtReadVirtualMemory;//HOOK SSDT*((ULONG*)Address1) = (ULONG)MyNtWriteVirtualMemory;__asm{ //恢复内存保护mov eax,cr0or eax,10000hmov cr0,eaxsti}}//////////////////////////////////////////////////////VOID Unhook()ULONG Address, Address1;Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0xBA * 4;//查找SSDT Address1 = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x115 * 4;__asm{climov eax,cr0and eax,not 10000hmov cr0,eax}*((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT*((ULONG*)Address1) = (ULONG)OldServiceAddress1;//还原SSDT__asm{mov eax,cr0or eax,10000hmov cr0,eaxsti}DbgPrint("Unhook");}由于它不断对DebugPort清零,所以要修改调试相关函数,使得所有的访问DebugPort的地方全部访问EPROCESS中的ExitTime字节,这样它怎么清零都无效了,也检测不到代码:.386.model flat, stdcalloption casemap:noneinclude dnf_hook.inc.c*****tDspdo_1 equ 80643db6hDmpp_1 equ 80642d5ehDmpp_2 equ 80642d64hDct_1 equ 806445d3hDqm_1 equ 80643089hKde_1 equ 804ff5fdhDfe_1 equ 80644340hPcp_1 equ 805d1a0dhMcp_1 equ 805b0c06hMcp_2 equ 805b0d7fhDmvos_1 equ 8064497fhDumvos_1 equ 80644a45hPet_1 equ 805d32f8hDet_1 equ 8064486chDep_1 equ 806448e6h.code;还原自己的HookDriverUnload proc pDriverObject:PDRIVER_OBJECTretDriverUnload endpModifyFuncAboutDbg proc addrOdFunc, cmd_1, cmd_2pushadmov ebx, addrOdFuncmov eax, cmd_1mov DWORD ptr [ebx], eaxmov eax, cmd_2mov DWORD ptr [ebx + 4], eaxpopadretModifyFuncAboutDbg endpDriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING climov eax, cr0and eax, not 10000hmov cr0, eaxinvoke ModifyFuncAboutDbg, Dspdo_1, 90784789h, 0fde89090hinvoke ModifyFuncAboutDbg, Dmpp_1, 90787e39h, 950f9090hinvoke ModifyFuncAboutDbg, Dct_1, 90785e39h, 840f9090hinvoke ModifyFuncAboutDbg, Dqm_1, 9078408bh, 45899090hinvoke ModifyFuncAboutDbg, Kde_1, 90787839h, 13749090hinvoke ModifyFuncAboutDbg, Dfe_1, 9078418bh, 0d2329090hinvoke ModifyFuncAboutDbg, Pcp_1, 90784389h, 45f69090hinvoke ModifyFuncAboutDbg, Mcp_1, 90785e39h, 950f9090hinvoke ModifyFuncAboutDbg, Mcp_2, 90784a89h, 5e399090hinvoke ModifyFuncAboutDbg, Dmvos_1, 9078498bh, 0cb3b9090hinvoke ModifyFuncAboutDbg, Dumvos_1, 00787983h, 74909090hinvoke ModifyFuncAboutDbg, Pet_1, 00787f83h, 74909090hinvoke ModifyFuncAboutDbg, Det_1, 9078498bh, 0c9859090hinvoke ModifyFuncAboutDbg, Dep_1, 9078498bh, 0c9859090h;invoke ModifyFuncAboutDbg, Dmpp_2, 8bc0950fh, 8b90c032hmov eax, pDriverObjectassume eax : ptr DRIVER_OBJECTmov [eax].DriverUnload, offset DriverUnloadassume eax : nothingmov eax, cr0or eax, 10000hmov cr0, eaxstimov eax, STATUS_SUCCESSretDriverEntry endpend DriverEntry绕过NtOpenProcess,NtOpenThread,KiAttachProcess以及最重要的,不能让它检测到有硬件断点,所以要对CONTEXT做一些伪装,把真实的DR0~DR7的数据存放到别的地方,OD访问的时候返回正确的数据,如果是DNF要获取上下文,就稍微做下手脚代码:.386.model flat, stdcalloption casemap:noneinclude dnf_hook.inc.c*****tNtOpenProcessHookAddr equ 805cc626hNtOpenProcessRetAddr equ 805cc631hNtOpenProcessNoChange equ 805cc62chNtOpenThreadHookAddr equ 805cc8a8hNtOpenThreadRetAddr equ 805cc8b3hNtOpenThreadNoChange equ 805cc8aehKiAttachProcessAddr equ 804f9a08hKiAttachProcessRetAddr equ 804f9a0fhObOpenObjectByPointerAddr equ 805bcc78hNtGetContextThreadAddr equ 805d2551h;805c76a3hNtGetContextThreadRetAddr equ 805c76a7h;805d2555h.datanameOffset dd ?threadCxtLink dd 0tmpLink dd ?.codeGetProcessName procinvoke PsGetCurrentProcessmov ebx, eaxadd ebx, nameOffsetinvoke DbgPrint, $CTA0("\n")push ebxinvoke DbgPrint, ebxpop ebxinvoke strncmp, $CTA0("DNF.exe"), ebx, 6invoke DbgPrint, $CTA0("\n")pop eaxretGetProcessName endpHookCode proc;执行被覆盖的代码push dword ptr [ebp-38h]push dword ptr [ebp-24h];判断是否dnf的进程invoke GetProcessName.if !eax ;如果是DNF自己的进程,那么跳转回去执行它的Hook代码pushadinvoke DbgPrint, $CTA0("\nNotUnHook\n")popadmov eax, NtOpenProcessNoChange;805c13e6hjmp eax.else ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面pushadinvoke DbgPrint, $CTA0("\nUnHook\n")popadmov eax, ObOpenObjectByPointerAddr;805b13f0hcall eaxmov ebx, NtOpenProcessRetAddr;805c13ebhjmp ebx.endifHookCode endp;获取系统名称偏移GetNameOffset proc epelocal tmpOffsetpushadmov ebx, epeinvoke strlen, $CTA0("System")xor ecx, ecx@@:push eaxpush ecxinvoke strncmp, $CTA0("System"), ebx, eaxpop ecx.if !eaxpop eaxmov tmpOffset, ecxpopadmov eax, tmpOffset.elseifpop eaxinc ebxinc ecxcmp ecx, 4096je @Fjmp @B.endif@@:popadmov eax, -1retGetNameOffset endpHook procpushad;头5字节跳转mov eax, offset HookCodesub eax, NtOpenProcessHookAddr;805c13e0h;805c13edhsub eax, 5mov ebx, NtOpenProcessHookAddr;805c13e0h;805c13edhmov cl, 0E9hmov BYTE PTR [ebx], clmov DWORD PTR [ebx + 1], eaxpopadretHook endpHookThreadCode proc;执行被覆盖的代码push dword ptr [ebp-34h]push dword ptr [ebp-20h];判断是否dnf的进程invoke GetProcessName.if !eax ;如果是DNF自己的进程,那么跳转回去执行它的Hook代码pushadinvoke DbgPrint, $CTA0("\nNotUnHook\n")popadmov eax, NtOpenThreadNoChange;805c13e6hjmp eax.else ;如果不是DNF自己的进程,那么直接调用ObOpenObjectByPointer,再返回到后面pushadinvoke DbgPrint, $CTA0("\nUnHook\n")popadmov eax, ObOpenObjectByPointerAddr;805b13f0hcall eaxmov ebx, NtOpenThreadRetAddr;805c13ebhjmp ebx.endifHookThreadCode endpHookThread procpushad;头5字节跳转mov eax, offset HookThreadCodesub eax, NtOpenThreadHookAddr;805c13e0h;805c13edh sub eax, 5mov ebx, NtOpenThreadHookAddr;805c13e0h;805c13edh mov cl, 0E9hmov BYTE PTR [ebx], clmov DWORD PTR [ebx + 1], eaxpopadretHookThread endpHookDbg procmov edi, edipush ebpmov ebp, esppush ebxpush esimov esi, KiAttachProcessRetAddrjmp esiHookDbg endpDbg procpushad;头5字节跳转mov eax, offset HookDbgsub eax, KiAttachProcessAddr;805c13e0h;805c13edh sub eax, 5mov ebx, KiAttachProcessAddr;805c13e0h;805c13edh mov cl, 0E9hmov BYTE PTR [ebx], clmov DWORD PTR [ebx + 1], eaxpopadretDbg endp;还原自己的HookDriverUnload proc pDriverObject:PDRIVER_OBJECT climov eax, cr0and eax, not 10000hmov cr0, eax;还原进程处理mov eax, 0ffc875ffhmov ebx, 805cc656hmov DWORD ptr [ebx], eaxmov eax, 43e8dc75hmov DWORD ptr [ebx + 4], eax;还原线程处理mov eax, 0ffcc75ffhmov ebx, 805cc8d8hmov DWORD ptr [ebx], eaxmov eax, 0c1e8e075hmov DWORD ptr [ebx + 4], eax;还原调试处理mov eax, 08b55ff8bhmov ebx, 804f9a08hmov DWORD ptr [ebx], eaxmov eax, 08b5653echmov DWORD ptr [ebx + 4], eaxmov eax, cr0or eax, 10000hmov cr0, eaxstiretDriverUnload endp;显示LinkTable的信息ShowLinkTableInfo proc ptrLTpushadinvoke DbgPrint, $CTA0("\nThe LinkTable Info:\n")mov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).ThreadHandleinvoke DbgPrint, $CTA0("ThreadHandle:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).Dr0Seginvoke DbgPrint, $CTA0("Dr0Seg:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).Dr1Seginvoke DbgPrint, $CTA0("Dr1Seg:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).Dr2Seginvoke DbgPrint, $CTA0("Dr2Seg:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).Dr3Seginvoke DbgPrint, $CTA0("Dr3Seg:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).Dr6Seginvoke DbgPrint, $CTA0("Dr6Seg:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).Dr7Seginvoke DbgPrint, $CTA0("Dr7Seg:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).LinkPtrinvoke DbgPrint, $CTA0("LinkPtr:%0X\n"), eaxmov ebx, ptrLTmov eax, (LinkTable ptr [ebx]).NextLinkPtrinvoke DbgPrint, $CTA0("NextLinkPtr:%0X\n"), eaxpopadretShowLinkTableInfo endp;判断该线程是否存在;如果不存在则返回0,存在则返回指向该链表的指针,1代表链表为空ExsitsLinkTable proc pHandlepushadmov eax, threadCxtLink.if !eax ;链表为空pushadinvoke DbgPrint, $CTA0("\nLinkTable Is Null.\n")popadpopadmov eax, 1ret.endif@@:mov ebx, (LinkTable ptr [eax]).ThreadHandlecmp ebx, pHandle ;如果匹配已经存在je @Fmov eax, (LinkTable ptr [eax]).NextLinkPtr.if !eax ;已经到达末尾,没有找到匹配pushadinvoke DbgPrint, $CTA0("\pHandle Is Not Found.\n") popadpopadxor eax, eaxret.endifjmp @B@@:pushadinvoke DbgPrint, $CTA0("\npHandle Is Exsits.\n") popadinvoke ShowLinkTableInfo, eax;返回链表指针mov tmpLink, eaxpopadmov eax, tmpLinkretExsitsLinkTable endp;拷贝Context到LinkTable中CopyContextToLinkTable proc ptrContext, ptrLTpushadmov ebx, ptrContextmov edx, ptrLTmov ecx, 4@@:mov eax, DWORD ptr [ebx + ecx]mov DWORD ptr [edx + ecx], eaxadd ecx, 4cmp ecx, 18hjbe @BpopadretCopyContextToLinkTable endp;添加LinkTable表AddLinkTable proc pHandle, ptrContextpushadinvoke ExsitsLinkTable, pHandle.if eax > 1;已经存在只需要更新dr寄存器即可invoke CopyContextToLinkTable, eax, ptrContextpush eaxinvoke ExAllocatePool, 1, size LinkTable.if eax;申请内存成功mov ebx, eaxpop eax;置地一个元素mov ecx, pHandlemov (LinkTable ptr [ebx]).ThreadHandle, ecx;拷贝dr寄存器的值invoke CopyContextToLinkTable, ptrContext, ebx;置另外两个元素mov (LinkTable ptr [ebx]).LinkPtr, ebxmov (LinkTable ptr [ebx]).NextLinkPtr, 0invoke ShowLinkTableInfo, ebx;把新的链表项添加到链表中.if eax == 1;如果链表为空,直接加在表头mov threadCxtLink, ebx.else;如果链表不为空则加到末尾mov eax, threadCxtLink@@:;指向下一个元素mov ecx, (LinkTable ptr [eax]).NextLinkPtrtest ecx, ecxje @Fmov eax, ecxjmp @B@@:mov (LinkTable ptr [eax]).NextLinkPtr, ebx .endif.else;申请内存失败pop eaxpushadinvoke DbgPrint, $CTA0("\nAlloc Memory Faild.\n")popadjmp @F.endif.endif@@:retAddLinkTable endp;判断进程是否过虑进程;如果是需要过虑的进程返回值为1,否则返回0 IsFilterProcess procpushad;获取当前进程名invoke PsGetCurrentProcessmov ebx, eaxadd ebx, nameOffsetinvoke DbgPrint, $CTA0("\n%s: Call NtGetContextThread \n"), ebx invoke strncmp, $CTA0("DNF.exe"), ebx, 7test eax, eaxjne @Fpopadmov eax, 1ret@@:popadxor eax, eaxretIsFilterProcess endp;显示Context的调试寄存器ShowDrRegInfo proc ptrContextpushadinvoke DbgPrint, $CTA0("\nThe Context Info:\n")mov ebx, ptrContextmov eax, DWORD ptr [ebx + 4]invoke DbgPrint, $CTA0("Dr0:%0X\n"), eaxmov ebx, ptrContextmov eax, DWORD ptr [ebx + 8]invoke DbgPrint, $CTA0("Dr1:%0X\n"), eaxmov ebx, ptrContextmov eax, DWORD ptr [ebx + 0ch]invoke DbgPrint, $CTA0("Dr2:%0X\n"), eaxmov ebx, ptrContextmov eax, DWORD ptr [ebx + 10h]invoke DbgPrint, $CTA0("Dr3:%0X\n"), eaxmov ebx, ptrContextmov eax, DWORD ptr [ebx + 14h]invoke DbgPrint, $CTA0("Dr6:%0X\n"), eaxmov ebx, ptrContextmov eax, DWORD ptr [ebx + 18h]invoke DbgPrint, $CTA0("Dr7:%0X\n"), eaxpopadretShowDrRegInfo endp;恢复被隐藏的dr寄存器RecoveryDrReg proc ptrContext, pHandlepushad;定位到LinkTablemov ebx, threadCxtLinkNEXT:test ebx, ebxjne @F ;如果没有遍历完popadret@@:mov eax, (LinkTable ptr [ebx]).ThreadHandlecmp eax, pHandleje @F ;如果找到匹配项mov ebx, (LinkTable ptr [ebx]).NextLinkPtrjmp NEXT@@:;拷贝完毕后立即结束invoke CopyContextToLinkTable, ebx, ptrContextxor ebx, ebxjmp NEXTRecoveryDrReg endp;清空Context的dr寄存器ClearDrReg proc ptrContextpushadmov ebx, ptrContextmov ecx, 4@@:mov DWORD ptr [ebx + ecx], 0add ecx, 4cmp ecx, 18hjbe @Bpushadinvoke DbgPrint, $CTA0("\n-------------ClearDrReg-------------\n")popadinvoke ShowDrRegInfo, ptrContextpopadretClearDrReg endp;NtGetContextThread钩子代码NtGetContextThreadHookCode proc;ebx存放CONTEXT指针mov ebx, DWORD ptr [ebp + 10h];线程句柄mov edx, DWORD ptr [ebp + 0ch]pushadinvoke ShowDrRegInfo, ebxinvoke IsFilterProcess.if eax ;如果是DNF.exeinvoke AddLinkTable, edx, ebxinvoke ClearDrReg, ebx.else ;如果不是DNF.exeinvoke RecoveryDrReg, ebx, edx.endifinvoke ShowDrRegInfo, ebx;执行被覆盖的代码popadmov eax, esipop esileaveretNtGetContextThreadHookCode endp;NtGetContextThread加跳转HookNtGetContextThread procpushad;头5字节跳转mov eax, offset NtGetContextThreadHookCodesub eax, NtGetContextThreadAddr;805c13e0h;805c13edhsub eax, 5mov ebx, NtGetContextThreadAddr;805c13e0h;805c13edhmov cl, 0E9hmov BYTE PTR [ebx], clmov DWORD PTR [ebx + 1], eaxpopadretHookNtGetContextThread endpDriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING invoke DbgPrint, $CTA0("Begin")invoke PsGetCurrentProcessinvoke GetNameOffset, eaxmov nameOffset, eaxcmp eax, -1je @Fmov nameOffset, eaxclimov eax, cr0and eax, not 10000hmov cr0, eaxcall Hookcall HookThreadcall Dbgcall HookNtGetContextThreadmov eax, pDriverObjectassume eax : ptr DRIVER_OBJECTmov [eax].DriverUnload, offset DriverUnload assume eax : nothingmov eax, cr0or eax, 10000hmov cr0, eaxstiinvoke DbgPrint, $CTA0("End")@@:mov eax, STATUS_SUCCESSretDriverEntry endpend DriverEntry看的不错转的。

OD使用方法简单说明

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内存断点寻找真正的入口(OEP)--内存断

od内存断点寻找真正的入口(OEP)--内存断

od内存断点:寻找真正的入口(OEP)--内存断点疯狂代码 / ĵ:http://Security/Article71892.htmlAuthor:LenusFrom: ; ; ; & E-mail:Lenus_M@--------------------------------------------------1.前言; ; ;发现论坛中很多兄弟在询问:什么是 2次内存断点 3次内存断点还有很多人对内存断点原理不是很明白其实只要懂得壳是如何解压代码那么就完全可以按自己喜欢来下断; ; ;; ; ;本文要解决问题是:; ; ;1.什么是内存断点?; ; ;2.如何在寻找OEP时使用内存断点; ; ;3.内存断点局限性; ; ;2.内存断点寻找OEP原理; ;i.首先在OD中内存断点和普通断点(F2下断)是有本质区别; ;内存断点等效和命令bpm他中断要用到DR0-DR7调试寄存器也就是说OD通过这些DR0-DR7调试寄存器来判断是否断下; ;普通断点(F2下断)等效于bpx他是在所执行代码当前地址个字节修改为CC(3)当运行到3时候就会产生个异常而这个异常将交给OD处理把这个异常regEIP-1以后就正好停在了需要中断地方(这个根据系统区别会不样)同时OD在把上面3修改回原来代码; ;; ;内存断点分为:内存访问断点内存写入断点; ;我们知道在运行时候会有3种基本状态产生:读取写入执行004AE242 ; ; ; ; ;A1 00104000 ; ; ; ; ; ; ;mov eax,dword ptr ds:[004AE24C] ; ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存读取004AE247 ; ; ; ; ;A3 00104000 ; ; ; ; ; ; ;mov dword ptr ds:[004AE24C],eax ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存写入004AE24C ; ; ; ; ;83C0 01 ; ; ; ; ; ; ; ; ; ; ;add eax,1 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存执行; ;; ;那么我们应该如何中断在上面几行呢?; ;1.当我们对004AE24C下内存访问断点时候可以中断在004AE242也可以中断在004AE247; ;2.当我们对004AE24C下内存写入断点时候只能中断在004AE247; ;3.当我们对004AE24C下内存访问断点时候能中断在004AE24C; ;到这里你可能不明白了为什么内存访问断点能中断在004AE247这句对004AE24C写入而且还能中断在004AE24C执行呢?; ;其实很简单我们只要仔细体会下“内存访问”这 4个字含义遍可以知道当我们对004AE24C进行读取时候需要“访问”他吧当我对004AE24C进行写入时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C代码时候也是还是要“访问”他!; ;所以我们不难得出下面结论:; ;1.内存写入中断地方定是也可以用内存访问中断; ;2.内存执行地方也可以用内存访问中断; ;如果这时你认为那么内存写入岂不是没用了呵呵~那我要告诉你当然不是如果你想快速准确定位到004AE247这行时候那么他就大有作用了!; ;整理总结下:内存断点不修改改原代码不会像普通断点那样修改代码被校验而导致中断失败;对于区段访问只是区域大了点其原理和上面分析 3行代码是样; ;ii.如何使用内存断点来寻找OEP呢?; ;要回答这个问题首先要回答这个问题:壳是如何解压代码?; ;正如我们知道壳如果要把原来加密或压缩代码运行起来就必须要解压和解密原来代码而这个过程我们难道不能将他看做是对代码段(code段)写入吗?好了解压完毕了我们要从壳代码区段JMP到原来代码段时候难道不正是对代码段(code段)执行吗?理清了上面关系就好办了那么如果载入OD后我们直接对code段下内存访问断点时候定会中断在壳对code段写入代码上面就像上面004AE247这行而如果当他把code段代码全部解压解密完毕了以后JMP到OEP时候我们是不是还可以停在OEP代码上面呢?而且每按下F9都会中断这时code段在执行中哦!; ;相信很多人到这里已经明白了为什么在教程中到达了某个时候某行时候牛人们就叫我们对code段下内存访问断点了吧; ;而如果你还要继续问我为什么定要到那个地方才可以下断呢?我难道不可以开始就下断吗?; ;正入我上面所说如果你在前面下断很可能壳对code段还没解压完毕呢这时如果你不停按F9你将会看到OD下方不断在提示你“对401000写入中断” “对401002写入中断”“对401004写入中断”.......如果你不介意按F9到他把正个code段写完话我除了同情你“F9”以外没什么其他意见!; ;; ;那么我们就没有别更快点办法了吗?; ;有!那就是我们呼的欲出两次内存断点办法; ;如何理解两次内存断点呢?; ;让我来做个假设吧假设我是个壳作者个EXE文件有code段data段rsrc段.....依次排列在你内存空间中那么我会如何解码呢?呵呵~我比较笨点我会先将code段解码然后再将data段解压接着是rsrc段......那么聪明你不难发现只要你在data断或者rsrc段下内存访问断点那么中断时候code段就已经解压完毕了这时我们再对code段下内存反问断点不就可以到达OEP了吗?; ;这里注意上面虽然下了两次内存访问断点但是本质是不样目也是不样; ;1.对data段下内存访问断点而中断是内存写入中断目是断在对对data段解压时这时壳要对data段写数据但是code段已经解压 完毕; ;2.对code段下内存访问断点而中断是内存执行中断目当然就是寻找OEP了; ;整理总结下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点找到OEP如果不知道那么我们就依*2次内存断点去找如果还不行就用多次内存断点总的明白了原理在多次内存断点其实都样从这个过程中我们了解是壳在对区段解码顺序!; ;iii.实战; ;说了这么多我想大家都越越欲试了吧; ;好吧来弄个猛壳如何样:; ;点击浏览该文件; ;; ;这个壳是个hying旧版我们用他来实验下我们内存断点法; ;; ;OD载入以后来到这里0040D000 u> ; ;56 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push esi ; ; ; ; ; ; ; ; ; ; ; ; ; ;//这里0040D001 ; ; ; ; ;52 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push edx0040D002 ; ; ; ; ;51 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ecx0040D003 ; ; ; ; ;53 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebx0040D004 ; ; ; ; ;55 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebp0040D005 ; ; ; ; ;E8 15010000 ; ; ; ; ; ; ; ; ; ; ;call unpackme.0040D11F; ;根据跟过次经验我们将先设置除3异常以外忽略其他异常SHIFT+F9003725B9 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//到这里003725BA ; ; ; ; ;8BCD ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ecx,ebp; ;然后再设置除“除零”异常外忽略其他异常SHIFT+F900372660 ; ; ; ; ;F7F3 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;div ebx ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//到这里00372662 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop; ;; ;下面是很多单步异常太麻烦我们不管他现在开始用内存断点思路方法对code段下内存访问断点希望他已经解压完毕F90040D19D ; ; ; ; ;A4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;movs ptr es:[edi], ptr ds:[esi] ; ; ; ; ; ; ; ; ;//还没解完呢0040D19E ; ; ; ; ;B3 02 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov bl,2对data段下内存“写入”断点试试看他是不是要写data段00372712 ; ; ; ; ;F3:A4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;rep movs ptr es:[edi], ptr ds:[esi] ; ; ; ; ; ;//断到这里00372714 ; ; ; ; ;5E ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop esi下面再对code段下内存访问断点F900372855 ; ; ; ; ;8907 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[edi],eax ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; SHELL32.DragFinish ; ;//这里是对IAT加密地方了!!!00372857 ; ; ; ; ;5A ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop edx00372858 ; ; ; ; ;0FB642 FF ; ; ; ; ; ; ; ; ; ; ; ; ;movzx eax, ptr ds:[edx-1]0037285C ; ; ; ; ;03D0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edx,eax0037285E ; ; ; ; ;42 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;inc edx0037285F ; ; ; ; ;83C7 04 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edi,400372862 ; ; ; ; ;59 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop ecx00372863 ; ; ;^ E2 A9 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;loopd 0037280E00372865 ; ; ;^ E9 63FFFFFF ; ; ; ; ; ; ; ; ; ; ;jmp 003727CD0037286A ; ; ; ; ;8BB5 93060000 ; ; ; ; ; ; ; ; ;mov esi,dword ptr ss:[ebp+693] ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;;//到这里下断F2现在如果再对data下访问断点已经是没用了这时应该格外小心我们现在就想既然这段是对code解码那么我们就绕过他吧!到0037286A下断F2然后清除内存断点!!!!F9以后停在这里继续对code下内存访问断点看看左下角还在解码哎~真是麻烦!003728E1 ; ; ; ;/EB 1D ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;jmp 00372900003728E3 ; ; ; ;|25 FFFFFF7F ; ; ; ; ; ; ; ; ; ; ;and eax,7FFFFFFF003728E8 ; ; ; ;|0385 83060000 ; ; ; ; ; ; ; ; ;add eax,dword ptr ss:[ebp+683]003728EE ; ; ; ;|2B85 8F060000 ; ; ; ; ; ; ; ; ;sub eax,dword ptr ss:[ebp+68F]003728F4 ; ; ; ;|8BDE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ebx,esi003728F6 ; ; ; ;|2BD8 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sub ebx,eax003728F8 ; ; ; ;|8958 FC ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[eax-4],ebx ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//停在这里003728FB ; ; ; ;|83C7 08 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edi,8003728FE ; ; ;^|EB DB ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;jmp 003728DB00372900 ; ; ; ;\64:FF35 30000000 ; ; ; ; ; ;push dword ptr fs:[30] ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//清除内存断点以后到这里下断F9又是段解码代码再次使用上面办法手动跳出去现在继续对code段下内存访问断点!!F9以后到达这里004010CC ; ; ; ; ;FFD7 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;call edi ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; unpackme.004010CE ; ; ;//OEP哦004010CE ; ; ; ; ;58 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop eax004010CF ; ; ; ; ;83EC 44 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sub esp,44004010D2 ; ; ; ; ;56 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push esi004010D3 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop004010D4 ; ; ; ; ;E8 B518F7FF ; ; ; ; ; ; ; ; ; ; ;call 0037298E004010D9 ; ; ; ; ;8BF0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov esi,eax呵呵~虽然不是我们熟悉OEP但是地址是没错了况且根据我们步骤我可以很肯定说这是code段第次“执行”中断!所以这就是OEP了整理总结下:当我们在寻找OEP时候要多次对code下断“赌”“赌”他解压完毕如果不是就对别段试试~如果跑飞了那就没办法了重来呗~其实说起来要赌是:当data段idata段rsrc段摆在你面前你会好好“珍惜”那个段不过还好上天还会给我们从来次机会(ctrl+F2 ^_^)那么我们会对那个不会跑飞段说3个字----“先断你”如果非要在上面加个次数我希望是“次内存断点就好了”; ;vi.下面来讨论下内存断点局限性问题; ;是不是什么壳都可以用内存中断啊?; ;不是每个都可以些像UPX和ASPACK就不行; ;为什么?; ;呵呵~follew me!; ;情况1.; ;我们来看看UPX壳; ;首先他壳代码在UPX1段这里是他要跳到OEP地方0040ED4F ; ; ; ;/77 11 ; ; ; ; ; ; ; ; ; ; ; ; ;ja NOTEPAD_.0040ED62 ; ; ; ; ; ; ; ; ; ; ; ;0040ED51 ; ; ; ;|01C3 ; ; ; ; ; ; ; ; ; ; ; ; ; ;add ebx,eax0040ED53 ; ; ; ;|8B03 ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov eax,dword ptr ds:[ebx]0040ED55 ; ; ; ;|86C4 ; ; ; ; ; ; ; ; ; ; ; ; ; ;xchg ah,al0040ED57 ; ; ; ;|C1C0 10 ; ; ; ; ; ; ; ; ; ; ;rol eax,10 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//在解码0040ED5A ; ; ; ;|86C4 ; ; ; ; ; ; ; ; ; ; ; ; ; ;xchg ah,al0040ED5C ; ; ; ;|01F0 ; ; ; ; ; ; ; ; ; ; ; ; ; ;add eax,esi0040ED5E ; ; ; ;|8903 ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[ebx],eax0040ED60 ; ; ;^|EB E2 ; ; ; ; ; ; ; ; ; ; ; ; ;jmp NOTEPAD_.0040ED440040ED62 ; ; ; ;\24 0F ; ; ; ; ; ; ; ; ; ; ; ; ;and al,0F0040ED64 ; ; ; ; ;C1E0 10 ; ; ; ; ; ; ; ; ; ; ;shl eax,100040ED67 ; ; ; ; ;66:8B07 ; ; ; ; ; ; ; ; ; ; ;mov ax,word ptr ds:[edi]0040ED6A ; ; ; ; ;83C7 02 ; ; ; ; ; ; ; ; ; ; ;add edi,20040ED6D ; ; ;^ EB E2 ; ; ; ; ; ; ; ; ; ; ; ; ;jmp NOTEPAD_.0040ED51 ; ; ; ; ; ; ; ;//回跳解码0040ED6F ; ; ; ; ;61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;popad0040ED70 ; ; ;- E9 5723FFFF ; ; ; ; ; ; ;jmp NOTEPAD_.004010CC ; ; ; ; ; ; ; ; ; ; ; ; ;//跳到OEP我们看到他在对code段解压完毕时候马上就JMP到OEP去了那么我们根本就来不及使用内存断点办法你可能说我可以在0040ED6F ; ; ; ; ;61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;popad //这句下段然后使用啊呵呵~~当然可以不过你把花在下内存断点时间多按下几次F8不更好?!也就是说当个壳如果他在JMP 到OEP前行代码仍在都在对code段解压那么我们就不能再使用这种办法了! 或者说我们没必要使用内存断点更贴切点!; ;情况2.; ;对于些在OEP处有stolen code代码; ;我们来看看个OEP0049E2F4 u> ; ;55 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebp ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//OEP0049E2F5 ; ; ; ; ;8BEC ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ebp,esp0049E2F7 ; ; ; ; ;83C4 F4 ; ; ; ; ; ; ; ; ; ; ;add esp,-0C0049E2FA ; ; ; ; ;B8 BCE04900 ; ; ; ; ; ; ;mov eax,unpack.0049E0BC0049E2FF ; ; ; ; ;E8 048CF6FF ; ; ; ; ; ; ;call unpack.00406F08 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//这里子0049E304 ; ; ; ; ;A1 B8FE4900 ; ; ; ; ; ; ;mov eax,dword ptr ds:[49FEB8]0049E309 ; ; ; ; ;50 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push eax0049E30A ; ; ; ; ;6A 00 ; ; ; ; ; ; ; ; ; ; ; ; ;push 00049E30C ; ; ; ; ;68 1F000F00 ; ; ; ; ; ; ;push 0F001F0049E311 ; ; ; ; ;E8 E68EF6FF ; ; ; ; ; ; ;call <jmp.&kernel32.OpenFileMappingA> ; ;//API0049E316 ; ; ; ; ;A3 60194A00 ; ; ; ; ; ; ;mov dword ptr ds:[4A1960],eax0049E31B ; ; ; ; ;833D 60194A00 00 ; ;cmp dword ptr ds:[4A1960],0这个软件Software在被PESPIN加壳了以后这些全被偷掉了!也就是说壳在模拟OEP代码时候必然会执行0049E2FF ; ; ; ; ;E8 048CF6FF ; ; ; ; ; ; ;call unpack.00406F08 ; ;//这步而这个地方是call向code段如果我们使用内存访问断点那么就停在这个子地方00406F08 ; ; ; ; ;50 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push eax ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//会停在这里00406F09 ; ; ; ; ;6A 00 ; ; ; ; ; ; ; ; ; ; ; ; ;push 000406F0B ; ; ; ; ;E8 F8FEFFFF ; ; ; ; ; ; ;call <jmp.&kernel32.GetModuleHandleA>00406F10 ; ; ; ; ;BA 04F14900 ; ; ; ; ; ; ;mov edx,unpack.0049F10400406F15 ; ; ; ; ;52 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push edx这里既不是处理stolen code地方也不是FOEP地方这就会对我们判断产生误导当然你可以alt+F9返回到壳处理stolen地方然后用内存断点或者按几下F8到达FOEP处但试问如果你拿到个未知壳时候又如何知道应该这么处理呢?还有其他些情况留给大家整理总结吧!在下砖已抛出各位玉不久矣--------------------------------------------------3.整理总结; ; ; ; ; ;好了说了很多大家应该对内存断点办法有了全面了解如果了解了内存断点原理就不难明白他使用思路方法不难明白为什么有写壳不能使用内存断点办法其实任何种办法都需要经验积累相信如果大家在回答开篇3个问题已经不难了; ; ; ; ; ;下面给出些使用内存断点寻找OEP例子大家可以结合原理再好好体会下; ; ; ; ; ;1.手动脱壳进阶第 8篇Skvp1.32; ; ; ; ; ;2./bbs/dispbbs.asp?BoardID=5&ID=1485--------------------------------------------------- ; ; ; ; ; ;4.研究题; ; ;使用多次内存断点办法要谨慎对待datarsrc区域内存访问断点即使要下也要注意尽量用写入断点为什么?上篇文章: 逆向追踪+TC(模拟跟踪)思路方法寻找暗桩--解除脱UPX后校验下篇文章: 推广ESP定律---EBP妙用。

od 硬件条件断点

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断点

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内存断点寻找真正的入口(OEP)--内存断

od内存断点寻找真正的入口(OEP)--内存断

od内存断点:寻找真正的入口(OEP)--内存断点疯狂代码 / ĵ:http://Security/Article71892.htmlAuthor:LenusFrom: ; ; ; & E-mail:Lenus_M@--------------------------------------------------1.前言; ; ;发现论坛中很多兄弟在询问:什么是 2次内存断点 3次内存断点还有很多人对内存断点原理不是很明白其实只要懂得壳是如何解压代码那么就完全可以按自己喜欢来下断; ; ;; ; ;本文要解决问题是:; ; ;1.什么是内存断点?; ; ;2.如何在寻找OEP时使用内存断点; ; ;3.内存断点局限性; ; ;2.内存断点寻找OEP原理; ;i.首先在OD中内存断点和普通断点(F2下断)是有本质区别; ;内存断点等效和命令bpm他中断要用到DR0-DR7调试寄存器也就是说OD通过这些DR0-DR7调试寄存器来判断是否断下; ;普通断点(F2下断)等效于bpx他是在所执行代码当前地址个字节修改为CC(3)当运行到3时候就会产生个异常而这个异常将交给OD处理把这个异常regEIP-1以后就正好停在了需要中断地方(这个根据系统区别会不样)同时OD在把上面3修改回原来代码; ;; ;内存断点分为:内存访问断点内存写入断点; ;我们知道在运行时候会有3种基本状态产生:读取写入执行004AE242 ; ; ; ; ;A1 00104000 ; ; ; ; ; ; ;mov eax,dword ptr ds:[004AE24C] ; ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存读取004AE247 ; ; ; ; ;A3 00104000 ; ; ; ; ; ; ;mov dword ptr ds:[004AE24C],eax ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存写入004AE24C ; ; ; ; ;83C0 01 ; ; ; ; ; ; ; ; ; ; ;add eax,1 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//004AE24C处内存执行; ;; ;那么我们应该如何中断在上面几行呢?; ;1.当我们对004AE24C下内存访问断点时候可以中断在004AE242也可以中断在004AE247; ;2.当我们对004AE24C下内存写入断点时候只能中断在004AE247; ;3.当我们对004AE24C下内存访问断点时候能中断在004AE24C; ;到这里你可能不明白了为什么内存访问断点能中断在004AE247这句对004AE24C写入而且还能中断在004AE24C执行呢?; ;其实很简单我们只要仔细体会下“内存访问”这 4个字含义遍可以知道当我们对004AE24C进行读取时候需要“访问”他吧当我对004AE24C进行写入时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C代码时候也是还是要“访问”他!; ;所以我们不难得出下面结论:; ;1.内存写入中断地方定是也可以用内存访问中断; ;2.内存执行地方也可以用内存访问中断; ;如果这时你认为那么内存写入岂不是没用了呵呵~那我要告诉你当然不是如果你想快速准确定位到004AE247这行时候那么他就大有作用了!; ;整理总结下:内存断点不修改改原代码不会像普通断点那样修改代码被校验而导致中断失败;对于区段访问只是区域大了点其原理和上面分析 3行代码是样; ;ii.如何使用内存断点来寻找OEP呢?; ;要回答这个问题首先要回答这个问题:壳是如何解压代码?; ;正如我们知道壳如果要把原来加密或压缩代码运行起来就必须要解压和解密原来代码而这个过程我们难道不能将他看做是对代码段(code段)写入吗?好了解压完毕了我们要从壳代码区段JMP到原来代码段时候难道不正是对代码段(code段)执行吗?理清了上面关系就好办了那么如果载入OD后我们直接对code段下内存访问断点时候定会中断在壳对code段写入代码上面就像上面004AE247这行而如果当他把code段代码全部解压解密完毕了以后JMP到OEP时候我们是不是还可以停在OEP代码上面呢?而且每按下F9都会中断这时code段在执行中哦!; ;相信很多人到这里已经明白了为什么在教程中到达了某个时候某行时候牛人们就叫我们对code段下内存访问断点了吧; ;而如果你还要继续问我为什么定要到那个地方才可以下断呢?我难道不可以开始就下断吗?; ;正入我上面所说如果你在前面下断很可能壳对code段还没解压完毕呢这时如果你不停按F9你将会看到OD下方不断在提示你“对401000写入中断” “对401002写入中断”“对401004写入中断”.......如果你不介意按F9到他把正个code段写完话我除了同情你“F9”以外没什么其他意见!; ;; ;那么我们就没有别更快点办法了吗?; ;有!那就是我们呼的欲出两次内存断点办法; ;如何理解两次内存断点呢?; ;让我来做个假设吧假设我是个壳作者个EXE文件有code段data段rsrc段.....依次排列在你内存空间中那么我会如何解码呢?呵呵~我比较笨点我会先将code段解码然后再将data段解压接着是rsrc段......那么聪明你不难发现只要你在data断或者rsrc段下内存访问断点那么中断时候code段就已经解压完毕了这时我们再对code段下内存反问断点不就可以到达OEP了吗?; ;这里注意上面虽然下了两次内存访问断点但是本质是不样目也是不样; ;1.对data段下内存访问断点而中断是内存写入中断目是断在对对data段解压时这时壳要对data段写数据但是code段已经解压 完毕; ;2.对code段下内存访问断点而中断是内存执行中断目当然就是寻找OEP了; ;整理总结下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点找到OEP如果不知道那么我们就依*2次内存断点去找如果还不行就用多次内存断点总的明白了原理在多次内存断点其实都样从这个过程中我们了解是壳在对区段解码顺序!; ;iii.实战; ;说了这么多我想大家都越越欲试了吧; ;好吧来弄个猛壳如何样:; ;点击浏览该文件; ;; ;这个壳是个hying旧版我们用他来实验下我们内存断点法; ;; ;OD载入以后来到这里0040D000 u> ; ;56 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push esi ; ; ; ; ; ; ; ; ; ; ; ; ; ;//这里0040D001 ; ; ; ; ;52 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push edx0040D002 ; ; ; ; ;51 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ecx0040D003 ; ; ; ; ;53 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebx0040D004 ; ; ; ; ;55 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebp0040D005 ; ; ; ; ;E8 15010000 ; ; ; ; ; ; ; ; ; ; ;call unpackme.0040D11F; ;根据跟过次经验我们将先设置除3异常以外忽略其他异常SHIFT+F9003725B9 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//到这里003725BA ; ; ; ; ;8BCD ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ecx,ebp; ;然后再设置除“除零”异常外忽略其他异常SHIFT+F900372660 ; ; ; ; ;F7F3 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;div ebx ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//到这里00372662 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop; ;; ;下面是很多单步异常太麻烦我们不管他现在开始用内存断点思路方法对code段下内存访问断点希望他已经解压完毕F90040D19D ; ; ; ; ;A4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;movs ptr es:[edi], ptr ds:[esi] ; ; ; ; ; ; ; ; ;//还没解完呢0040D19E ; ; ; ; ;B3 02 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov bl,2对data段下内存“写入”断点试试看他是不是要写data段00372712 ; ; ; ; ;F3:A4 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;rep movs ptr es:[edi], ptr ds:[esi] ; ; ; ; ; ;//断到这里00372714 ; ; ; ; ;5E ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop esi下面再对code段下内存访问断点F900372855 ; ; ; ; ;8907 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[edi],eax ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; SHELL32.DragFinish ; ;//这里是对IAT加密地方了!!!00372857 ; ; ; ; ;5A ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop edx00372858 ; ; ; ; ;0FB642 FF ; ; ; ; ; ; ; ; ; ; ; ; ;movzx eax, ptr ds:[edx-1]0037285C ; ; ; ; ;03D0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edx,eax0037285E ; ; ; ; ;42 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;inc edx0037285F ; ; ; ; ;83C7 04 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edi,400372862 ; ; ; ; ;59 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop ecx00372863 ; ; ;^ E2 A9 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;loopd 0037280E00372865 ; ; ;^ E9 63FFFFFF ; ; ; ; ; ; ; ; ; ; ;jmp 003727CD0037286A ; ; ; ; ;8BB5 93060000 ; ; ; ; ; ; ; ; ;mov esi,dword ptr ss:[ebp+693] ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;;//到这里下断F2现在如果再对data下访问断点已经是没用了这时应该格外小心我们现在就想既然这段是对code解码那么我们就绕过他吧!到0037286A下断F2然后清除内存断点!!!!F9以后停在这里继续对code下内存访问断点看看左下角还在解码哎~真是麻烦!003728E1 ; ; ; ;/EB 1D ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;jmp 00372900003728E3 ; ; ; ;|25 FFFFFF7F ; ; ; ; ; ; ; ; ; ; ;and eax,7FFFFFFF003728E8 ; ; ; ;|0385 83060000 ; ; ; ; ; ; ; ; ;add eax,dword ptr ss:[ebp+683]003728EE ; ; ; ;|2B85 8F060000 ; ; ; ; ; ; ; ; ;sub eax,dword ptr ss:[ebp+68F]003728F4 ; ; ; ;|8BDE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ebx,esi003728F6 ; ; ; ;|2BD8 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sub ebx,eax003728F8 ; ; ; ;|8958 FC ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[eax-4],ebx ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//停在这里003728FB ; ; ; ;|83C7 08 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;add edi,8003728FE ; ; ;^|EB DB ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;jmp 003728DB00372900 ; ; ; ;\64:FF35 30000000 ; ; ; ; ; ;push dword ptr fs:[30] ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//清除内存断点以后到这里下断F9又是段解码代码再次使用上面办法手动跳出去现在继续对code段下内存访问断点!!F9以后到达这里004010CC ; ; ; ; ;FFD7 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;call edi ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; unpackme.004010CE ; ; ;//OEP哦004010CE ; ; ; ; ;58 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;pop eax004010CF ; ; ; ; ;83EC 44 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;sub esp,44004010D2 ; ; ; ; ;56 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push esi004010D3 ; ; ; ; ;90 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;nop004010D4 ; ; ; ; ;E8 B518F7FF ; ; ; ; ; ; ; ; ; ; ;call 0037298E004010D9 ; ; ; ; ;8BF0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov esi,eax呵呵~虽然不是我们熟悉OEP但是地址是没错了况且根据我们步骤我可以很肯定说这是code段第次“执行”中断!所以这就是OEP了整理总结下:当我们在寻找OEP时候要多次对code下断“赌”“赌”他解压完毕如果不是就对别段试试~如果跑飞了那就没办法了重来呗~其实说起来要赌是:当data段idata段rsrc段摆在你面前你会好好“珍惜”那个段不过还好上天还会给我们从来次机会(ctrl+F2 ^_^)那么我们会对那个不会跑飞段说3个字----“先断你”如果非要在上面加个次数我希望是“次内存断点就好了”; ;vi.下面来讨论下内存断点局限性问题; ;是不是什么壳都可以用内存中断啊?; ;不是每个都可以些像UPX和ASPACK就不行; ;为什么?; ;呵呵~follew me!; ;情况1.; ;我们来看看UPX壳; ;首先他壳代码在UPX1段这里是他要跳到OEP地方0040ED4F ; ; ; ;/77 11 ; ; ; ; ; ; ; ; ; ; ; ; ;ja NOTEPAD_.0040ED62 ; ; ; ; ; ; ; ; ; ; ; ;0040ED51 ; ; ; ;|01C3 ; ; ; ; ; ; ; ; ; ; ; ; ; ;add ebx,eax0040ED53 ; ; ; ;|8B03 ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov eax,dword ptr ds:[ebx]0040ED55 ; ; ; ;|86C4 ; ; ; ; ; ; ; ; ; ; ; ; ; ;xchg ah,al0040ED57 ; ; ; ;|C1C0 10 ; ; ; ; ; ; ; ; ; ; ;rol eax,10 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//在解码0040ED5A ; ; ; ;|86C4 ; ; ; ; ; ; ; ; ; ; ; ; ; ;xchg ah,al0040ED5C ; ; ; ;|01F0 ; ; ; ; ; ; ; ; ; ; ; ; ; ;add eax,esi0040ED5E ; ; ; ;|8903 ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov dword ptr ds:[ebx],eax0040ED60 ; ; ;^|EB E2 ; ; ; ; ; ; ; ; ; ; ; ; ;jmp NOTEPAD_.0040ED440040ED62 ; ; ; ;\24 0F ; ; ; ; ; ; ; ; ; ; ; ; ;and al,0F0040ED64 ; ; ; ; ;C1E0 10 ; ; ; ; ; ; ; ; ; ; ;shl eax,100040ED67 ; ; ; ; ;66:8B07 ; ; ; ; ; ; ; ; ; ; ;mov ax,word ptr ds:[edi]0040ED6A ; ; ; ; ;83C7 02 ; ; ; ; ; ; ; ; ; ; ;add edi,20040ED6D ; ; ;^ EB E2 ; ; ; ; ; ; ; ; ; ; ; ; ;jmp NOTEPAD_.0040ED51 ; ; ; ; ; ; ; ;//回跳解码0040ED6F ; ; ; ; ;61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;popad0040ED70 ; ; ;- E9 5723FFFF ; ; ; ; ; ; ;jmp NOTEPAD_.004010CC ; ; ; ; ; ; ; ; ; ; ; ; ;//跳到OEP我们看到他在对code段解压完毕时候马上就JMP到OEP去了那么我们根本就来不及使用内存断点办法你可能说我可以在0040ED6F ; ; ; ; ;61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;popad //这句下段然后使用啊呵呵~~当然可以不过你把花在下内存断点时间多按下几次F8不更好?!也就是说当个壳如果他在JMP 到OEP前行代码仍在都在对code段解压那么我们就不能再使用这种办法了! 或者说我们没必要使用内存断点更贴切点!; ;情况2.; ;对于些在OEP处有stolen code代码; ;我们来看看个OEP0049E2F4 u> ; ;55 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push ebp ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//OEP0049E2F5 ; ; ; ; ;8BEC ; ; ; ; ; ; ; ; ; ; ; ; ; ;mov ebp,esp0049E2F7 ; ; ; ; ;83C4 F4 ; ; ; ; ; ; ; ; ; ; ;add esp,-0C0049E2FA ; ; ; ; ;B8 BCE04900 ; ; ; ; ; ; ;mov eax,unpack.0049E0BC0049E2FF ; ; ; ; ;E8 048CF6FF ; ; ; ; ; ; ;call unpack.00406F08 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//这里子0049E304 ; ; ; ; ;A1 B8FE4900 ; ; ; ; ; ; ;mov eax,dword ptr ds:[49FEB8]0049E309 ; ; ; ; ;50 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push eax0049E30A ; ; ; ; ;6A 00 ; ; ; ; ; ; ; ; ; ; ; ; ;push 00049E30C ; ; ; ; ;68 1F000F00 ; ; ; ; ; ; ;push 0F001F0049E311 ; ; ; ; ;E8 E68EF6FF ; ; ; ; ; ; ;call <jmp.&kernel32.OpenFileMappingA> ; ;//API0049E316 ; ; ; ; ;A3 60194A00 ; ; ; ; ; ; ;mov dword ptr ds:[4A1960],eax0049E31B ; ; ; ; ;833D 60194A00 00 ; ;cmp dword ptr ds:[4A1960],0这个软件Software在被PESPIN加壳了以后这些全被偷掉了!也就是说壳在模拟OEP代码时候必然会执行0049E2FF ; ; ; ; ;E8 048CF6FF ; ; ; ; ; ; ;call unpack.00406F08 ; ;//这步而这个地方是call向code段如果我们使用内存访问断点那么就停在这个子地方00406F08 ; ; ; ; ;50 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push eax ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//会停在这里00406F09 ; ; ; ; ;6A 00 ; ; ; ; ; ; ; ; ; ; ; ; ;push 000406F0B ; ; ; ; ;E8 F8FEFFFF ; ; ; ; ; ; ;call <jmp.&kernel32.GetModuleHandleA>00406F10 ; ; ; ; ;BA 04F14900 ; ; ; ; ; ; ;mov edx,unpack.0049F10400406F15 ; ; ; ; ;52 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;push edx这里既不是处理stolen code地方也不是FOEP地方这就会对我们判断产生误导当然你可以alt+F9返回到壳处理stolen地方然后用内存断点或者按几下F8到达FOEP处但试问如果你拿到个未知壳时候又如何知道应该这么处理呢?还有其他些情况留给大家整理总结吧!在下砖已抛出各位玉不久矣--------------------------------------------------3.整理总结; ; ; ; ; ;好了说了很多大家应该对内存断点办法有了全面了解如果了解了内存断点原理就不难明白他使用思路方法不难明白为什么有写壳不能使用内存断点办法其实任何种办法都需要经验积累相信如果大家在回答开篇3个问题已经不难了; ; ; ; ; ;下面给出些使用内存断点寻找OEP例子大家可以结合原理再好好体会下; ; ; ; ; ;1.手动脱壳进阶第 8篇Skvp1.32; ; ; ; ; ;2./bbs/dispbbs.asp?BoardID=5&ID=1485--------------------------------------------------- ; ; ; ; ; ;4.研究题; ; ;使用多次内存断点办法要谨慎对待datarsrc区域内存访问断点即使要下也要注意尽量用写入断点为什么?上篇文章: 逆向追踪+TC(模拟跟踪)思路方法寻找暗桩--解除脱UPX后校验下篇文章: 推广ESP定律---EBP妙用。

OD快捷键使用大全。非常详细(游戏逆向分析必看)

OD快捷键使用大全。非常详细(游戏逆向分析必看)

OD快捷键使用大全。

非常详细(游戏逆向分析必看)无论当前的OllyDbg窗口是什么,这些快捷键均有效:Ctrl+F2 - 重启程序,即重新启动被调试程序。

如果当前没有调试的程序,OllyDbg会运行历史列表[historylist]中的第一个程序。

程序重启后,将会删除所有内存断点和硬件断点。

译者注:从实际使用效果看,硬件断点在程序重启后并没有移除。

Alt+F2 - 关闭,即关闭被调试程序。

如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。

F3 - 弹出“打开32位.EXE文件”对话框[Open 32-bit .EXE file],您可以选择可执行文件,并可以输入运行参数。

Alt+F5 -让OllyDbg总在最前面。

如果被调试程序在某个断点处发生中断,而这时调试程序弹出一个总在最前面的窗口(一般为模式消息或模式对话框[modal messageor dialog]),它可能会遮住OllyDbg的一部分,但是我们又不能移动最小化这个窗口。

激活OllyDbg(比如按任务栏上的标签)并按Alt+F5,OllyDbg将设置成总在最前面,会反过来遮住刚才那个窗口。

如果您再按一下Alt+F5,OllyDbg会恢复到正常状态。

OllyDbg是否处于总在最前面状态,将会保存,在下一次调试时依然有效。

当前是否处于总在最前面状态,会显示在状态栏中。

F7 -单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。

如果当前命令是是含有REP前缀,则只执行一次重复操作。

Shift+F7 -与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。

Ctrl+F7 -自动步入,在所有的函数调用中一条一条地执行命令(就像您按住F7键不放一样,只是更快一些)。

当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。

OD使用教程7 - 解密系列【调试篇】

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的物理支持。

OD条件与消息断点的设置方法

OD条件与消息断点的设置方法

OD条件与消息断点的设置方法一、条件断点:使用方法(如):在当前行按[Shift+F2]键->条件断点(这个不太好用,因为程序BUG偶尔失效)。

在当前行按[Shift+F4]键->条件记录断点(只要设置上条件语句和按什么条件生效就可以了)。

条件语句(如):EAX == 00401000 ; 当EAX的值为00401000时。

[EAX] == 05201314 ; 比如EAX的值为00401000,而地址00401000处所指向的值等于5201314时,即EAX的值表示为指针。

[[EAX]] == 05201314 ; 比如EAX的值为00401000,地址00401000处所指向的值为00402000,而地址00402000处所指向的值等于5201314时,即EAX的值表示为指针的指针。

EAX == 05201314 && EBX == 0x05201314 ; 当EAX的值等于5201314(十进制),并且EBX的值等于5201314(十六进制)时。

[EBP+8] == WM_COMMAND ;[[EBP+8]] == 05201314 ;byte ptr[EAX] == 'y' ;[EAX] == "coderui" ; 比如EAX的值为00401000,而地址00401000处所指向的字符串为“coderui”时,即EAX的值表示为指针。

[[EAX+4]+4] == WM_LBUTTONUP ;以上写法的意思就是命令行里面直接输入,下面我写下具体的范例,还傻乎乎的用[Shift+F2]键,上面是网上的说的模糊。

比如要断点0x3565656 这个代码地址。

那么他的条件可以写在后面。

如下所示。

bp 0x3565656 [EBP+8] == WM_COMMAND// 当 [EBP+8] 等于 WM_COMMAND的时候断下来bp 0x3565656 [[EAX+4]+4] == WM_LBUTTONUP//当[[EAX+4]+4] == WM_LBUTTONUP的时候断下来bp 0x3565656 [[EBP+8]] == 05201314//当 [[EBP+8]] == 05201314 的时候断下来所谓心跳包的过滤液是如此。

硬件断点 使用场景

硬件断点 使用场景

硬件断点(Hardware Breakpoint)是调试工具和操作系统用来在硬件层面上设置断点的一种技术。

硬件断点通常用于以下场景:
1. 嵌入式系统和实时系统:在这些系统中,软件通常直接运行在硬件上,没有操作系统的中间层。

硬件断点可以用于这些环境中的实时调试。

2. 内核级调试:在操作系统内核或驱动程序的开发中,由于内核代码运行在物理内存中,且内核调试通常需要更高的权限,硬件断点成为一种有效的调试手段。

3. 安全性分析:硬件断点可以用于检测和分析系统中的安全漏洞,例如,通过硬件断点监控特定的内存访问模式来检测潜在的缓冲区溢出问题。

4. 性能分析:在需要对系统性能进行深入分析的情况下,硬件断点可以用来测量和分析程序执行的性能,尤其是在性能敏感的应用中。

5. 硬件测试和验证:在硬件设计阶段,硬件断点可用于测试和验证硬件功能,确保硬件设计符合预期。

6. 调试固件和BIOS:固件和BIOS的调试通常需要直接访问硬件,硬件断点提供了这种访问的手段。

7. 复杂系统调试:在多处理器系统或分布式系统中,硬件断点可以帮助开发者在一个复杂的系统中设置和控制断点,尤其是在需要跨多个处理器或者节点进行调试时。

硬件断点的使用通常比软件断点更为复杂,因为它们涉及到硬件层面的操作,并且可能会受到操作系统和调试工具的支持程度的影响。

在实际应用中,使用硬件断点需要谨慎,以确保不会对系统的稳定性和性能造成不利影响。

OD断点大全

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 获取当前全部逻辑驱动器的根驱动器路径。

使用OllyDbg从零开始Cracking 第十一章-硬件断点与条件断点

使用OllyDbg从零开始Cracking 第十一章-硬件断点与条件断点

第十一章:硬件断点与条件断点下面我们将把剩下的类型的断点介绍完,本章先介绍硬件断点和条件断点。

硬件断点硬件断点(简称:HBP)是处理器的特性之一,它的工作原理我不是很了解,但是我们会用就行了,我们可以设置硬件断点使程序中断下来。

在OD中我们最多可以设置4个硬件断点,如果想设置第5个的话,你需要删除已经设置了的4个中的其中一个。

跟之前一样,我们还是拿CrueHead'a的CrackMe来做实验。

硬件断点分为:硬件执行断点(ON EXECUTION),硬件写入断点(ON WRITE),硬件访问断点(ON ACCESS)3种。

硬件执行断点与普通的CC断点作用一样,但硬件执行断点并不会将指令首字节修改为CC,所以更难检测。

但是有些程序会使用一些技巧来清除硬件断点,应对方法我们会在后面的章节介绍。

如果你想在401013处设置硬件执行断点的话,请在401013这一行单击鼠标右键选择-Breakpoint-Hardware,on execution。

也可以在命令栏中输入:这样可以设置硬件执行断点。

OD中有个特殊的窗口,通过它我们可以查看和管理硬件断点。

我们选择菜单栏中的Debug-Hardware breakpoints就可以打开这个窗口。

在硬件断点窗口中,如果我们单击Follow按钮,反汇编窗口中该硬件断点所对应的那一行指令就会灰色高亮显示。

如果我们单击Delete按钮,那么相应的硬件断点就会被清除。

现在按F9键运行程序。

中断在401013处。

正如你所看到的,起到的效果跟普通的CC断点有点像,如果你像对CC断点做的测试-MOV EAX,DWORD PTR DS:[401013]一样的话,你会发现机器码并没有改变。

在401000这一行单击鼠标右键选择-New origin here将EIP修改为401000,接着按F7键单步。

可以看到EAX的值为0004A6E8,内存的形式为E8 A60400,机器码并没有发生变化。

硬件断点与软件断点区别

硬件断点与软件断点区别

硬件断点与软件断点的区别1.硬件断点需要目标CPU的硬件支持,当前流行的ARM7/9内部硬件设计提供两组寄存器用来存贮断点信息,所以ARM7/9内核最多支持两个硬件断点,而ARM11则可以支持到8个硬件断点.这与调试器无关.2.软件断点则是通过在代码中设置特征值的方式来实现的.当需要在某地址代码处设置软件断点的时候,仿真器会先将此处代码进行备份保护,然后将预先设定好的断点特征值(一般为0x0000等不易与代码混淆的值)写入此地址,覆盖原来的代码数据.当程序运行到此特征值所在的地址时,仿真器识别出此处是一个软断点,便会产生中断.当取消断点时,之前受保护的代码信息会被自动恢复.硬件断点可以设置在任何位置的代码上,包括ROM和RAM;而软件断点由于需要修改相应地址的值,所以一般只能设在RAM上,但是数量可以不受限制.由于硬件断点设置的灵活性,所以是最优先选用的断点资源,但是两个断点往往很难满足工程师进行深入调试的需要,于是软件断点可以作为硬件断点的补充资源来使用.由于通常的软件断点只能设在RAM运行的代码上,而随着系统的代码量越来越大,特别是在移动通信领域,扩充大容量的RAM势必会增加产品的成本,所以现在很多系统直接在FlashROM上运行代码.对于这种在FlashROM上运行代码的系统,一般的软件断点是无法设置的,这也是软件断点的局限性.对于这样的系统,只能通过交替使用两个硬件断点满足需要,但是会带来一定的不便.要很好的解决这一矛盾,只有使仿真器增加在FlashROM上设置软件断点的功能,拓展仿真器中可供利用的断点资源.在FlashROM上设置软件断点的原理与在RAM上设置软断点类似,也是在设定的断点处用特征码替换原有代码,通过识别特征码使断点事件发生.不同的是,在FlashROM上设置软件断点需要对Flash进行擦写操作,这就需要仿真器能够有Flash编程功能,并且能够在尽可能短的时间内完成特征码的写入.完成这一系列的读写操作,就可使在FlashROM上调试代码的工程师获得更充裕的断点资源,从而大大提高了开发效率.但是,由于对Flash进行擦写需要一定的时间,所以在执行到Flash断点的时候会感觉到有一个停顿的时间.虽然这一点比RAM上的软件断点要差些,但是相对于给工程师调试工作整体上带来的便利而言,这一点是完全可以接受的.设置断点进行调试是最基本的一种调试手段,选择具有丰富断点资源的ICE仿真器,可以明显地提高调试效率.当然,前提是工程师能够灵活使用各种断点资源.。

断点技术相关

断点技术相关

断点技术相关版权声明:本⽂为博主原创⽂章,未经博主同意不得转载。

https:///ls1160/article/details/36707249继续研究⼀下OD实现部分中断点相关的技术:1、普通断点:1.1 OD的处理⽅法是将指令的第⼀个字节替换成CC,造成中断。

为什么能够?(由于它属于int3中断的代码)这个INT 3指令。

其机器码是CCh,也常称为CC指令。

当被调试进程运⾏INT 3指令导致⼀个异常时,调试器就会捕捉这个异常从⽽停在断点处。

然后将断点处的指令恢复成原来指令。

当然,假设⾃⼰写调试器,也可⽤其它⼀些指令取代INT 3来触发异常。

⽤INT 3断点的优点是能够设置⽆数个断点。

缺点是改变了原程序指令。

easy被软件检測到。

⽐如为了防范API被下断。

⼀些软件会检測API 的⾸地址是否为CCh,以此来推断是否被下了断点。

在这⽤C语⾔来实现这个检測,⽅法是取得检測函数的地址,然后读取它的第⼀个字节,推断它是否等于“CCh”。

1.2通过检測指令的第⼀个字节是否为CC来反调试。

实现?FARPROC Uaddr ;BYTE Mark = 0;(FARPROC&) Uaddr =GetProcAddress ( LoadLibrary("user32.dll"),"MessageBoxA");Mark = *((BYTE*)Uaddr); // 取MessageBoxA函数第⼀字节if(Mark ==0xCC) // 如该字节为CC,则觉得MessageBoxA函数被下断return TRUE // 发现断点程序编译后,对MessageBoxA设断。

程序将会发现⾃⼰被设断跟踪。

当然躲过检測的⽅法是将断点下在函数内部或末尾,⽐如能够将断点下在函数⼊⼝的下⼀⾏,就可躲过检測了。

总之是⼀个⽐較勉强的反调试⽅法。

当我们设置断点后,OD会将相应指令处第⼀个字节指令替换成CC。

OD学习笔记

OD学习笔记

OD学习笔记OD 第二课1、OD与IDA是两个常用工具。

OD是动态分析,IDA是静态分析。

2、F2下断点,F3加载一个可执行程序。

3、Call *** 按F7可以进入该函数内部,Ctrl + F9运行至ret出,就可以返回程序了。

4、Alt + B打开断点编辑器,用于取消断点,del或者空格取消断点。

5、Ctrl + G可以查找函数名,例如:GetDlgItemTextA 或者GetDlgItemTextW6、单步执行时,注意下面提示,有时候会发现一些用用的信息的。

7、当程序停止下来时,按下Ctrl + G,输入esp + 4C,可以查看地址内容。

8、Call返回值存放在eax中,返回地址时,eax中存放地址。

9、test eax,eax,查看eax是否为0,为0时,Z=1,双击Z,则Z变成0.10、不想让je跳转的两种方法,(1)将Z改成0;(2)将je short 0040122e双击,改成nop填充即可。

11、保存修改:选中修改的文件,右击,复制到可自行文件,选择,备份,保存数据到文件。

如果程序加过壳,则会不可执行。

12、如果跟进到系统dll中,此时想返回到应用程序领空,可以按Alt + F9,返回到用户代码。

13、如004013F7,这类地址一般是可自行文件领空,7C8114AB这类地址一般是系统Dll所在的地址空间。

14、Ctrl + N,可以打开应用程序的导入表OD第三课1、找callcall *** 等于push eip;然后jmp ***call几种方式——call 404000h,直接跳转到函数或者过程的地址。

——call eax,函数或者过程的地址存放在eax中。

——call dword ptr[eax] 例如:eax中存放400080h,而400080h 中存放404000h,所有实际是Call 404000h。

——call dword ptr[<&API>];执行一个系统API。

od条件断点使用方法

od条件断点使用方法

od条件断点使用方法以od条件断点使用方法为标题,写一篇文章。

一、什么是od条件断点?OD(On Demand)条件断点是一种在软件调试过程中使用的断点技术。

它允许程序在满足特定条件时暂停执行,以便开发人员能够检查程序状态和变量的值。

OD条件断点可帮助程序员快速定位和解决代码中的问题,提高调试效率。

二、OD条件断点的基本使用方法1. 设置断点位置:在需要设置断点的行上右击,选择"设置断点",或在代码行上插入断点标记。

2. 设置断点条件:在断点属性中,设置断点的条件表达式。

例如,当某个变量的值等于特定的数值时,断点会触发。

3. 调试程序:运行程序并触发断点条件。

当断点条件满足时,程序会自动暂停执行,并进入调试模式。

4. 调试过程中的操作:在调试模式下,可以查看当前程序状态、变量的值、调用栈等信息。

还可以单步执行代码,观察程序的执行流程。

5. 修改断点条件:如果需要修改断点条件,可以在调试过程中对断点属性进行修改。

三、OD条件断点的高级使用方法1. 多重条件断点:在一个断点位置上设置多个条件表达式,只有所有条件都满足时,断点才会触发。

这对于需要同时满足多个条件的调试场景非常有用。

2. 条件断点的持续性:可以设置断点的持续性,即断点是否在每次程序运行时保留。

有时,我们希望某个断点只在特定的调试阶段生效,可以将其设置为非持续性断点。

3. 断点命令:在断点属性中,可以添加一些调试命令。

当断点触发时,这些命令会被执行。

例如,可以在断点命令中输出日志信息或修改变量的值。

4. 条件断点的禁用和启用:在调试过程中,可以随时禁用或启用某个断点。

这对于临时屏蔽某个断点或重新启用已禁用的断点非常方便。

四、OD条件断点的使用场景1. 调试复杂逻辑:当程序中存在复杂的判断逻辑时,可以设置条件断点来观察程序在不同条件下的执行情况。

2. 监控变量值:当需要监控某个变量的值是否满足特定条件时,可以设置条件断点。

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

OD硬件断点、内存断点
断点和命令
BP 表达式 [,条件] 在指定地址设置 INT3 断点 BP EAX+10BP 410010, EAX==WM_CLOSEBP Kernel32.GetProcAddress
BPX 标签在当前模块每一个对外部标签的调用设置断点 BPX CreateFileA
BC 表达式删除指定地址的断点 BC 410010
MR 表达式1 [,表达式2] 设置指定范围的内存访问断点
MW 表达式1 [,表达式2] 设置指定范围的内存写断点Set
MD 移除内存断点
HR 表达式设置1字节的硬断点,当访问该地址时中断
HW 表达式设置1字节的硬断点,当写该地址时中断
HE 表达式设置硬断点,当执行该地址时中断
HD [表达式] 移除指定地址处的硬断点————————————————————————————————————————————附内存中断小结:
OD中内存断点小结
内存, 小结, 断点
0040EE67 90 nop //假设此处为EIP
0040EE68 90 nop
0040EE69 90 nop
0040EE6A A0 C4FF1200 mov al, byte ptr [12FFC4]
0040EE6F 90 nop
0040EE70 > 90 nop
0040EE71 90 nop
0040EE72 90 nop
0040EE73 90 nop
0040EE74 90 nop
0040EE75 C605 C5FF1200 11 mov byte ptr [12FFC5], 11
0040EE7C 90 nop
0040EE7D 90 nop
0040EE7E 90
12FFC4 11 11
1.内存访问断点设置12FFC4一个字节为内存访问断点 F9运行程序 OD会停在0040EE6A
原理:OD会设置12FFC4地址访问权限为不可读大小为一字节任何试图读取该地址的操作都会引发异常 OD 个异常并等待用户处理现象就是运行到 mov al, byte ptr [12FFC4] 当指令试图读取该地址内容并给AL赋候 OD断了下来
2.硬件访问断点设置12FFC4一个字节为硬件访问断点 F9运行程序 OD会停在0040EE6F
原理:OD会设置调试寄存器 DR0-DR3 其中一个为12FFC4 并设置DR7相关标记这个实现依靠CPU特性当设地址为硬件访问断点后任何试图访问该地址的操作都会引发异常 OD会捕获这个异常并等待用户处理现象就是mov al, byte ptr [12FFC4] 当指令试图读取该地址内容并给AL赋值的时候 OD断了下来
3.内存写入断点设置12FFC5一个字节为内存写入断点 F9运行程序 OD会停在0040EE75
原理:OD会设置12FFC5地址访问权限为不可写大小为一字节任何试图写入该地址的操作都会引发异常 OD 个异常并等待用户处理现象就是运行到 mov byte ptr [12FFC5], 11 当指令试图写入该地址内容 OD断了
4.硬件写入断点设置12FFC5一个字节为硬件写入断点 F9运行程序 OD会停在0040EE7C
原理:OD会设置调试寄存器 DR0-DR3 其中一个为12FFC5 并设置DR7相关标记这个实现依靠CPU特性当设地址为硬件访问写入后任何试图写入该地址的操作都会引发异常 OD会捕获这个异常并等待用户处理现象就是mov byte ptr [12FFC5], 11 当指令试图写入该地址的时候 OD断了下来
至于内存断点断在当前指令硬件断点断在当前指令的下一条取决于OD的实现。

相关文档
最新文档