OD设置断点函数

合集下载

od 加密函数断点

od 加密函数断点

od 加密函数断点
OD加密函数断点是指在使用OD(OllyDbg)调试工具时,针对
特定的加密函数设置断点以便分析其加密算法和过程。

在进行OD加
密函数断点时,我们通常需要考虑以下几个方面:
1. 加密函数的位置,首先需要在程序中定位到需要分析的加密
函数的位置,可以通过静态分析或动态调试的方式找到函数的入口点。

2. 加密算法分析,一旦设置了断点,当程序执行到加密函数时,我们可以逐步跟踪代码的执行过程,观察寄存器和内存的变化,以
便分析加密算法的具体实现方式。

3. 输入输出数据分析,通过断点可以观察到加密函数的输入和
输出数据,我们可以分析这些数据的结构和变化规律,以便理解加
密过程中数据的转换和变换。

4. 调试技巧,在设置加密函数断点时,需要灵活运用OD调试
工具提供的功能,比如条件断点、内存监视等,以便更好地分析加
密函数的执行过程。

总之,在进行OD加密函数断点时,我们需要综合运用静态分析和动态调试的方法,结合加密算法分析和输入输出数据分析,以便全面深入地理解加密函数的实现原理和运行过程。

这样能够帮助我们更好地理解程序的加密机制,为安全分析和逆向工程提供有力支持。

experiment 用OD下消息断点, 捕获按钮操作.

experiment  用OD下消息断点, 捕获按钮操作.

experiment 用OD下消息断点, 捕获按钮操作.实验目的: 想直接拦截按钮操作的消息处理, 分析按钮操作的逻辑.实验程序: <<使用OllyDbg从零开始Cracking 第一章翻译>> 中附带的一个CrackMe.使用OD加载目标程序, 当程序运行起来后, 暂停OD经过实验, 点击菜单会触发主窗体WM_COMMAND消息. 如果直接捕获弹出的注册窗口的WM_COMMAND, 捕获不到.准备捕获主窗体的WM_COMMAND消息, 找到菜单生成注册窗体的处理.找到注册窗体的创建函数传入的注册窗口处理过程,从而找到注册窗体的所有消息处理实现逻辑.点击菜单属于WM_COMMAND, 按照消息名称排序, 好找一些.下完消息断电后, 确认一下是否消息断点已下.F9, 让程序跑起来. 点击注册菜单. 程序被断在WM_COMMAND消息断点处.[cpp] view plaincopy00401128 > $ C8 000000 ENTER 0,0 ; 主窗体消息断点WM_COMMAND 0040112C . 56 PUSH ESI 0040112D . 57 PUSH EDI 0040112E . 53 PUSH EBX0040112F . 837D 0C 02 CMP DWORD PTRSS:[EBP+C],2 00401133 . 74 5E JE SHORT CRACKME.00401193 00401135 . 817D 0C 040200>CMP DWORD PTR SS:[EBP+C],204 0040113C . 74 65 JE SHORT CRACKME.004011A3F8往下走,找到创建注册窗体的代码.[cpp] view plaincopy00401209 > 6A 00PUSH 0 ; /lParam = NULL 0040120B . 68 53124000 PUSH CRACKME.00401253 ; |DlgProc = CRACKME.00401253 00401210 . FF75 08PUSH DWORD PTR SS:[EBP+8] ;|hOwner 00401213 . 68 15214000 PUSH CRACKME.00402115 ; |pTemplate = "DLG_REGIS" 00401218 . FF35 CA204000 PUSH DWORD PTR DS:[4020CA] ; |hInst = 00400000 0040121E . E8 7D020000 CALL<JMP.&USER32.DialogBoxParamA> ;\DialogBoxParamA CRACKME.00401253 是注册窗体的消息处理过程. 转到那看看.[cpp] view plaincopy00401253/. C8 000000 ENTER0,0 ; 注册窗体消息处理过程00401257 |. 53 PUSH EBX 00401258 |. 56 PUSH ESI 00401259 |.57 PUSH EDI 0040125A |. 817D 0C 100100>CMP DWORD PTRSS:[EBP+C],110 ; WM_INITDIALOG 00401261 |. 74 34 JE SHORTCRACKME.00401297 00401263 |. 817D 0C110100>CMP DWORD PTRSS:[EBP+C],111 ; WM_COMMAND 0040126A |. 74 35 JE SHORT CRACKME.004012A1 0040126C |. 837D 0C 10CMP DWORD PTR SS:[EBP+C],10 ;WM_CLOSE 00401270 |. 0F84 81000000 JE CRACKME.004012F7 00401276 |. 817D 0C010200>CMP DWORD PTRSS:[EBP+C],201 ; WM_LBUTTONDOWN 0040127D |. 74 0C JE SHORT CRACKME.0040128B 0040127F |. B8 00000000 MOV EAX,0 00401284 |> 5F POP EDI 00401285 |. 5E POP ESI 00401286 |.5B POP EBX 00401287 |. C9LEAVE 00401288 |. C2 1000 RETN 10可以看到CRACKME.004012A1 是注册窗体WM_COMMAND命令处理函数.注册窗体一共处理了4种消息(窗体初始化, 退出, 确定, 命令处理)在地址0040126A 上回车, 去看看按钮处理逻辑. [cpp] view plaincopy004012A1 |> 33C0/XOR EAX,EAX ; 注册窗体: 按钮处理逻辑004012A3 |. 817D 10EB0300>|CMP DWORD PTR SS:[EBP+10],3EB 004012AA |. 74 4B |JE SHORT CRACKME.004012F7 004012AC |. 817D 10EA0300>|CMP DWORD PTR SS:[EBP+10],3EA 004012B3 |. 75 3B |JNZ SHORT CRACKME.004012F0 004012B5 |. 6A 0B|PUSH 0B ; /Count = B (11.) 004012B7 |. 68 8E214000 |PUSH CRACKME.0040218E ; |Buffer = CRACKME.0040218E 004012BC |. 68 E8030000|PUSH 3E8 ;|ControlID = 3E8 (1000.) 004012C1 |. FF75 08|PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004012C4 |. E8 07020000 |CALL<JMP.&USER32.GetDlgItemTextA> ;\GetDlgItemTextA 004012C9 |. 83F8 01 |CMP EAX,1 004012CC |. C745 10 EB0300>|MOV DWORD PTR SS:[EBP+10],3EB 004012D3 |.^72 CC \JB SHORT CRACKME.004012A1 004012D5 |. 6A 0B PUSH 0B ; /Count = B (11.) 004012D7 |. 68 7E214000 PUSH CRACKME.0040217E ; |Buffer = CRACKME.0040217E 004012DC |. 68 E9030000 PUSH 3E9 ;|ControlID = 3E9 (1001.) 004012E1 |. FF75 08PUSH DWORD PTR SS:[EBP+8] ;|hWnd 004012E4 |. E8 E7010000 CALL<JMP.&USER32.GetDlgItemTextA> ;\GetDlgItemTextA 004012E9 |. B8 01000000 MOV EAX,1 004012EE |. EB 07 JMP SHORT CRACKME.004012F7 004012F0 |> B8 00000000 MOV EAX,0 004012F5 |.^EB 8D JMP SHORT CRACKME.00401284 004012F7 |> 50 PUSH EAX ; /Result004012F8 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004012FB |. E8 B2010000 CALL<JMP.&USER32.EndDialog> ;\EndDialog 00401300 |. B8 01000000 MOV EAX,1 00401305 \.^E9 7AFFFFFF JMPCRACKME.00401284 如果F2 在地址004012A1 上下普通代码断点, 已经断住了注册窗体的WM_COMMAND逻辑为了只断住按钮(OK, Quit)的处理, 将断点下在004012B5 F9, 让程序跑起来. 填入Name, SN, 按下确定按钮可以看出, 注册窗口消息处理只是得到用户输入[cpp] view plaincopy004012A1 |> 33C0/XOR EAX,EAX ; 注册窗体: 按钮处理逻辑004012A3 |. 817D 10EB0300>|CMP DWORD PTR SS:[EBP+10],3EB 004012AA |. 74 4B |JE SHORT CRACKME.004012F7 004012AC |. 817D 10EA0300>|CMP DWORD PTR SS:[EBP+10],3EA 004012B3 |. 75 3B |JNZ SHORT CRACKME.004012F0 004012B5 |. 6A 0B|PUSH 0B ; /Count =B (11.) 004012B7 |. 68 8E214000 |PUSH CRACKME.0040218E ; |name 004012BC |. 68 E8030000 |PUSH3E8 ; |ControlID = 3E8 (1000.) 004012C1 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004012C4 |. E8 07020000 |CALL<JMP.&USER32.GetDlgItemTextA> ;\GetDlgItemTextA 004012C9 |. 83F8 01 |CMP EAX,1 004012CC |. C745 10 EB0300>|MOV DWORD PTR SS:[EBP+10],3EB 004012D3 |.^72 CC \JB SHORT CRACKME.004012A1 004012D5 |. 6A 0B PUSH 0B ; /Count = B (11.) 004012D7 |. 68 7E214000 PUSH CRACKME.0040217E ; |pwd 004012DC |. 68 E9030000 PUSH3E9 ; |ControlID =3E9 (1001.) 004012E1 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004012E4 |. E8 E7010000 CALL<JMP.&USER32.GetDlgItemTextA> ;\GetDlgItemTextA 004012E9 |. B8 01000000 MOVEAX,1 004012EE |. EB 07 JMP SHORT CRACKME.004012F7 004012F0 |> B8 00000000 MOV EAX,0 004012F5 |.^EB 8D JMP SHORT CRACKME.00401284 004012F7 |> 50 PUSH EAX ; /Result 004012F8 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004012FB |. E8 B2010000 CALL<JMP.&USER32.EndDialog> ;\EndDialog 00401300 |. B8 01000000 MOV EAX,1 00401305 \.^E9 7AFFFFFF JMPCRACKME.00401284 从00401305继续往下走, 进行数据有效性的校验.总结:通过消息断点, 可以从父窗口WMCOMMAND操作(菜单点击, 按钮点击)得到子窗体的消息处理过程.。

od反编译工具用法

od反编译工具用法

od反编译工具用法反编译是指将已经编译过的程序文件转换为高级源代码的过程。

反编译工具可以帮助开发者了解和学习其他人编写的程序,对于调试和修复软件错误也很有帮助。

OD (OllyDbg) 是一种广泛使用的反汇编调试工具,本文将介绍如何使用OD进行反编译。

OD的基本使用方法如下:2.打开需要反编译的程序:在OD主界面上点击“文件”菜单,然后选择“打开”选项,浏览并选择需要反编译的程序文件,并点击“打开”按钮。

3.反汇编代码窗口:OD会在主界面上打开一个反汇编代码窗口,这个窗口将显示程序的机器码和相应的汇编指令。

4.反编译代码:可以通过“右键单击”汇编指令,然后选择“跟随”选项来进行反编译。

OD会尝试寻找并显示反编译后的代码。

5.查看变量和数据:在OD的主界面上,有一个“数据窗口”,可以显示程序中的变量和内存数据。

在反汇编代码窗口中选择一些指令,然后在数据窗口中查看它所使用的变量和数据的值。

6.设置断点:在OD中设置断点可以帮助我们在特定指令上暂停执行程序,以便查看程序状态和调试错误。

在反汇编代码窗口中选择一些指令,然后点击“上方”菜单中的“条件断点”选项,OD会弹出一个对话框,可以在其中设置断点条件。

7.运行程序:在OD的主界面上,有一个“执行”菜单,可以用于运行程序。

可以通过点击“执行”菜单中的“运行”选项来启动程序的执行。

当程序遇到断点时,会停止执行并进入调试模式。

8.调试程序:在OD的调试模式下,可以通过一些常用的调试功能来调试程序。

例如,可以通过“单步执行”菜单选项逐行执行程序代码,通过“寄存器窗口”查看和修改寄存器值,通过“内存窗口”查看和修改内存数据等。

需要注意的是,使用OD进行反编译需要一定的汇编和调试知识。

同时,反编译软件可能涉及违法行为,如未获得程序开发者的许可而进行反编译。

请确保遵守法律规定,并只在合法和正当的情况下使用反编译工具。

在使用OD进行反编译时,可以参考以下一些技巧和注意事项:1.了解汇编语言与机器码的对应关系:汇编语言是将机器码转换为可读性更高的指令的语言,因此了解汇编语言的基本语法和常见指令有助于理解和分析程序。

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 的时候断下来所谓心跳包的过滤液是如此。

OD(OllyDbg)使用教程

OD(OllyDbg)使用教程
运行OllyDbg后,打开选项/调试设置
程序运行之后,在系统 空间里会触发一个INT3
文件入口点
程序的Winmain()函数入口点, 但一般都是在文件入口点
设置完成之后,载入文件,出现如图所示:
虚拟地址
机器码:
CPU执行的机器 代码
汇编指令: 和机器码对应的
程序代码
3、单步跟踪
调试器一个最基本功能就是动态跟踪,OllyDbg单步跟踪功能键:
目的:可以让软件运行的时候停在设断点的地方,以方便 反复跟踪调试
当关闭程序时,OllyDbg会将设置好的断点保存在UDD文件 中,下次运行时还有效。
5、调试分析:
调试分析其实就是分析程序代码的意义,如图:
阅读这些代码时,首先要搞清楚各API函数的定义,还弄明白 那些汇编程序代码的具体含义
6、保存修改后的文件
这里又回到traceme的领空了我们可以按altb调出断点窗口然后将getdlgitemtexta的断点改为已禁止202137chenli18接下来就在004011ae下一个断点因为这里有调用到getdlgitemtexta这个函数然后就要开始分析这些汇编代码的意义所以我们在使用这个软件的时候一定要明白这些代码的含义现在我们只是先认识一下这个软件的作用所以就不为大家做出分析接下来就是修改代码了
注意:此时的领空是模块USER32,领空就是在
某一时刻,CPU的CS:EIP所指向代码的所有者
领空
接着,在USER32的领空中,在77D6B05E代码行按下F2, 下断点,然后按F9运行,然后键入下图所示:
点check,可以看到程序被OD截停在下断点的地方,如图所示: 接着,按Alt+F9,返回到用户代码,可以回到:
图中红色的就是我们修改的地方,然后就点右键,复制到 文件,就可以保存当前的修改

od常用短点大全

od常用短点大全

od常用短点大全拦截窗口: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 WideCharT oMultiByte 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/GetWindowT extA(W)/GetWindowTextLengthA(W) (断输入框)4、字符串法—插件/搜索所有参考文本Delphi/BC++语言破解1、DEDE结合PE Explorer找按妞事件2、Point-H法3、bp GetDlgItem/GetWindowT extA(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、猜。

OD使用说明书

OD使用说明书

一、下边是几个通用的按钮1、:重新运行程序(重复上次运行的程序,快捷键:ctrl+F2)。

2、:关闭当前正在运行的程序。

(快捷键:Alt+F2)3、:运行程序,(快捷键:F9)4、:暂停执行,(快捷键:F12)5、:单步步入,意思就是:当遇到call时,就进入call的内部(快捷键:F7)6、:单步步过,意思就是:当遇到call时,就跳过call得内部,直接运行完call,然后执行下条语句。

(快捷键:F8)7、:跟踪步入,意思跟F9基本一样,步过就是遇到call就进入,这个按钮几乎不用(快捷键:ctrl+f11)8、:跟踪步过,同上,区别是遇到call就跳过了,同样也几乎不用(快捷键:ctrl+f12)9、:执行到返回,意思是执行某段代码后返回执行前的位置,(是在设置断点后才用的,)(快捷键:ctrl+f9)10、:是跳转到某一内存地址,在弹出的对话框里输入地址,然后就跳到你想要看的地址,但程序没有被执行,只是用来查看的功能。

二、后便的蓝色按钮(功能不是很经常用)1、:是用来查看记录的,(程序被载入后,调用的系统DLL和一些函数)2、:是用来显示模块窗口,告诉我们有多少个模块,和模块在机器的位置3、:是用来显示内存窗口的,一般是在脱壳的时候用到的内存脱壳方法,在这里设断点,4、:是用来显示线程的,5、:是用来显示句柄的,6、:是用来显示当前程序运行的位置的,点击后就会跑到程序当前的位置,(功能就是:当你查看其他模块的代码,然后点一下,就会跑回原来的地方,)前边的黑色就代表了程序已经运行到0100645C了,每次点击就会跑到当前运行的位置。

这个按钮主要为了提供用户方便,快速的回到当前位置。

7、:这个是用来查看当前有多少个断点,在这里也可以取消断点。

(这个按钮和C经常会用到)三、在反汇编窗口的右键功能经常用到的功能有(一级目录):二进制、汇编、断点、数据窗口跟随、查找、复制到可执行文件、ultra string reference.1、二进制:主要用来复制语句的,同时也可以清空选中的语句(即在2级目录里的NOP)2、汇编:主要用来修改语句的3、断点:主要用来设置断点,一般情况都是在比较有用的信息上设断点,(如:发现某个关键的ascii值时,一般都是在后边的注释里,能够看到的)4、数据窗口跟随:一般情况都是在2级目录里选第二个,然后你就会发现在数据窗口发现你想要的数据了。

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 然后删除这个没有万能的方法,只能视具体情况而定,就我的经验而言:第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如“未注册”,“已注册”等等之类的,都可用做断点的。

vscode 断点 参数

vscode 断点 参数

vscode 断点参数
在使用Visual Studio Code(VSCode)时,断点和参数是调试
过程中非常重要的概念。

断点是在代码中设置的位置,当程序执行
到这个位置时会暂停,允许开发人员检查程序状态和变量的值。


数则是指在调试过程中传递给函数或方法的值。

首先,让我们来谈谈断点。

在VSCode中,你可以通过点击代码
行号的位置来设置断点,也可以通过在代码行上右键单击并选择“Toggle Breakpoint”来设置断点。

一旦设置了断点,当你启动调
试器并运行程序时,程序会在断点处暂停,允许你逐步执行代码并
观察变量的值,以便更好地理解程序的运行过程。

在调试过程中,
你还可以随时添加、删除或禁用断点,以便更好地控制程序的执行
流程。

关于参数,当你在调试过程中调用函数或方法时,你可以在调
试器中查看传递给这些函数或方法的参数的值。

在VSCode的调试器中,你可以在调用栈中选择特定的函数调用,并查看传递给该函数
的参数的值,这有助于你理解程序的执行过程和调试代码中的问题。

除了上述基本概念外,VSCode还提供了丰富的调试功能,例如
条件断点、断点日志、监视表等,这些功能都可以帮助你更好地调
试程序并定位问题。

总之,在VSCode中,断点和参数是调试过程中非常重要的概念,通过合理设置断点并观察参数的值,可以帮助开发人员更好地理解
程序的执行过程,并快速定位和解决问题。

希望这些信息能够帮助
你更好地使用VSCode进行调试工作。

experiment:用OD下消息断点,捕获按钮操作.

experiment:用OD下消息断点,捕获按钮操作.

experiment:用OD下消息断点,捕获按钮操作.实验目的 : 想直接拦截按钮操作的消息处理, 分析按钮操作的逻辑.实验程序: <<使用OllyDbg从零开始Cracking 第一章翻译>> 中附带的一个CrackMe.使用OD加载目标程序, 当程序运行起来后, 暂停OD经过实验, 点击菜单会触发主窗体WM_COMMAND消息.如果直接捕获弹出的注册窗口的WM_COMMAND, 捕获不到.准备捕获主窗体的WM_COMMAND消息, 找到菜单生成注册窗体的处理.找到注册窗体的创建函数传入的注册窗口处理过程,从而找到注册窗体的所有消息处理实现逻辑.点击菜单属于WM_COMMAND, 按照消息名称排序, 好找一些.下完消息断电后, 确认一下是否消息断点已下.F9, 让程序跑起来. 点击注册菜单. 程序被断在WM_COMMAND 消息断点处.[cpp]view plaincopy1.00401128 > $ C8 000000 ENTER 0,0 ; 主窗体消息断点WM_COMMAND2.0040112C . 56 PUSH ESI3.0040112D . 57 PUSH EDI4.0040112E . 53 PUSH EBX5.0040112F . 837D 0C 02 CMP DWORD PTR SS:[EBP+C], 26.00401133 . 74 5E JE SHORT CRACKME.004011937.00401135 . 817D 0C 040200>CMP DWORD PTR SS:[EBP +C],2048.0040113C . 74 65 JE SHORT CRACKME.004011A3F8往下走,找到创建注册窗体的代码.[cpp]view plaincopy1.00401209 > 6A 00 PUSH 0 ; /l Param = NULL2.0040120B . 68 53124000 PUSH CRACKME.00401253; |DlgProc = CRACKME.004012533.00401210 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner4.00401213 . 68 15214000 PUSH CRACKME.00402115 ; |pTemplate = "DLG_REGIS"5.00401218 . FF35 CA204000 PUSH DWORD PTR DS:[402 0CA] ; |hInst = 004000006.0040121E . E8 7D020000 CALL <JMP.&USER32.DialogB oxParamA> ; \DialogBoxParamACRACKME.00401253 是注册窗体的消息处理过程. 转到那看看.[cpp]view plaincopy1.00401253 /. C8 000000 ENTER 0,0 ;注册窗体消息处理过程2.00401257 |. 53 PUSH EBX3.00401258 |. 56 PUSH ESI4.00401259 |. 57 PUSH EDI5.0040125A |. 817D 0C 100100>CMP DWORD PTR SS:[EBP +C],110 ; WM_INITDIALOG6.00401261 |. 74 34 JE SHORT CRACKME.004012977.00401263 |. 817D 0C 110100>CMP DWORD PTR SS:[EBP +C],111 ; WM_COMMAND8.0040126A |. 74 35 JE SHORT CRACKME.004012A19.0040126C |. 837D 0C 10 CMP DWORD PTR SS:[EBP+C] ,10 ; WM_CLOSE10.00401270 |. 0F84 81000000 JE CRACKME.004012F711.00401276 |. 817D 0C 010200>CMP DWORD PTR SS:[E BP+C],201 ; WM_LBUTTONDOWN12.0040127D |. 74 0C JE SHORT CRACKME.0040128B13.0040127F |. B8 00000000 MOV EAX,014.00401284 |> 5F POP EDI15.00401285 |. 5E POP ESI16.00401286 |. 5B POP EBX17.00401287 |. C9 LEAVE18.00401288 |. C2 1000 RETN 10可以看到 CRACKME.004012A1 是注册窗体WM_COMMAND命令处理函数.注册窗体一共处理了4种消息(窗体初始化, 退出, 确定, 命令处理) 在地址 0040126A 上回车, 去看看按钮处理逻辑.[cpp]view plaincopy1.004012A1 |> 33C0 /XOR EAX,EAX ; 注册窗体: 按钮处理逻辑2.004012A3 |. 817D 10 EB0300>|CMP DWORD PTR SS:[EBP +10],3EB3.004012AA |. 74 4B |JE SHORT CRACKME.004012F74.004012AC |. 817D 10 EA0300>|CMP DWORD PTR SS:[EB P+10],3EA5.004012B3 |. 75 3B |JNZ SHORT CRACKME.004012F06.004012B5 |. 6A 0B |PUSH 0B ; / Count = B (11.)7.004012B7 |. 68 8E214000 |PUSH CRACKME.0040218E ; |Buffer = CRACKME.0040218E8.004012BC |. 68 E8030000 |PUSH 3E8 ; |ControlID = 3E8 (1000.)9.004012C1 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hWnd10.004012C4 |. E8 07020000 |CALL <JMP.&USER32.Get DlgItemTextA> ; \GetDlgItemTextA11.004012C9 |. 83F8 01 |CMP EAX,112.004012CC |. C745 10 EB0300>|MOV DWORD PTR SS:[ EBP+10],3EB13.004012D3 |.^72 CC \JB SHORT CRACKME.00401 2A114.004012D5 |. 6A 0B PUSH 0B ; /Count = B (11.)15.004012D7 |. 68 7E214000 PUSH CRACKME.0040217E ; |Buffer = CRACKME.0040217E16.004012DC |. 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)17.004012E1 |. FF75 08 PUSH DWORD PTR SS:[EBP+ 8] ; |hWnd18.004012E4 |. E8 E7010000 CALL <JMP.&USER32.GetD lgItemTextA> ; \GetDlgItemTextA19.004012E9 |. B8 01000000 MOV EAX,120.004012EE |. EB 07 JMP SHORT CRACKME.00401 2F721.004012F0 |> B8 00000000 MOV EAX,022.004012F5 |.^EB 8D JMP SHORT CRACKME.0040 128423.004012F7 |> 50 PUSH EAX ; /Result24.004012F8 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd25.004012FB |. E8 B2010000 CALL <JMP.&USER32.End Dialog> ; \EndDialog26.00401300 |. B8 01000000 MOV EAX,127.00401305 \.^E9 7AFFFFFF JMP CRACKME.00401284如果F2 在地址 004012A1 上下普通代码断点, 已经断住了注册窗体的WM_COMMAND逻辑为了只断住按钮(OK, Quit)的处理, 将断点下在004012B5F9, 让程序跑起来. 填入Name, SN, 按下确定按钮可以看出, 注册窗口消息处理只是得到用户输入[cpp]view plaincopy1.004012A1 |> 33C0 /XOR EAX,EAX ; 注册窗体: 按钮处理逻辑2.004012A3 |. 817D 10 EB0300>|CMP DWORD PTR SS:[EBP +10],3EB3.004012AA |. 74 4B |JE SHORT CRACKME.004012F74.004012AC |. 817D 10 EA0300>|CMP DWORD PTR SS:[EB P+10],3EA5.004012B3 |. 75 3B |JNZ SHORT CRACKME.004012F06.004012B5 |. 6A 0B |PUSH 0B ; /Count = B (11.)7.004012B7 |. 68 8E214000 |PUSH CRACKME.0040218E ; |name8.004012BC |. 68 E8030000 |PUSH 3E8 ; |ControlID = 3E8 (1000.)9.004012C1 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hWnd10.004012C4 |. E8 07020000 |CALL <JMP.&USER32.Get DlgItemTextA> ; \GetDlgItemTextA11.004012C9 |. 83F8 01 |CMP EAX,112.004012CC |. C745 10 EB0300>|MOV DWORD PTR SS:[ EBP+10],3EB13.004012D3 |.^72 CC \JB SHORT CRACKME.00401 2A114.004012D5 |. 6A 0B PUSH 0B ; /Count = B (11.)15.004012D7 |. 68 7E214000 PUSH CRACKME.0040217E ; |pwd16.004012DC |. 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)17.004012E1 |. FF75 08 PUSH DWORD PTR SS:[EBP+ 8] ; |hWnd18.004012E4 |. E8 E7010000 CALL <JMP.&USER32.GetD lgItemTextA> ; \GetDlgItemTextA19.004012E9 |. B8 01000000 MOV EAX,120.004012EE |. EB 07 JMP SHORT CRACKME.00401 2F721.004012F0 |> B8 00000000 MOV EAX,022.004012F5 |.^EB 8D JMP SHORT CRACKME.0040 128423.004012F7 |> 50 PUSH EAX ; /Result24.004012F8 |. FF75 08 PUSH DWORD PTR SS:[EBP+ 8] ; |hWnd25.004012FB |. E8 B2010000 CALL <JMP.&USER32.End Dialog> ; \EndDialog26.00401300 |. B8 01000000 MOV EAX,127.00401305 \.^E9 7AFFFFFF JMP CRACKME.00401284从00401305继续往下走, 进行数据有效性的校验.总结:通过消息断点, 可以从父窗口WMCOMMAND操作(菜单点击, 按钮点击)得到子窗体的消息处理过程.。

(完整版)od常用断点大全

(完整版)od常用断点大全

拦截窗口: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、猜。

断点技术相关

断点技术相关

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

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中常见的函数jnz short XXXXXXXX:在这句之会有⼀个影响零位标志的⽐如cmp、or、sub等,执⾏这句以后如果不为零就跳转. short表⽰短距离(是0ffH还是多少来着忘记了) ZF: 零标志ZF⽤来反映运算结果是否为0。

如果运算结果为0,则其值为1,否则其值为0。

在判断运算结果是否为0时,可使⽤此标志位。

OF: 溢出标志位OF⽤于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表⽰的范围,则称为溢出,OF 的值被置为1,否则,OF的值被清为0.GetWindowTextLength:该函数返回指定窗⼝的标题⽂本(如果存在)的字符长度。

如果指定窗⼝是⼀个控制,函数将返回控制内⽂本的长度。

GetDlgItemText :成员函数将⽂本拷贝到lpStr指向的位置并返回拷贝的字节的数⽬。

两者作⽤范围WindowText⼤于DlgItem od中给命令⾏下BP GetDlgItemTextA,表⽰在调⽤GetDlgItemTextA的地⽅下断点,如果这个函数没有使⽤过,会⽆效。

吾爱破解OD 中的breakpoint也有,包括messagebox等。

SendDlgItemMessage 向指定的对话框控件发送消息,5个参数。

EM_LIMITTEXT限制text长度的标识符。

WM_GETTEXT获得text的值。

GetDlgItemTextA ⼀般参数有缓冲区地址,缓冲区最⼤长度count,控件id,还有⼀个...不明确test操作将两个值进⾏与操作,不改变值的⼤⼩,只影响zf的⼤⼩。

test ax,ax 判断ax是否为0xor ax,ax 将ax置0,改变值的⼤⼩。

od中函数和参数

od中函数和参数

od中函数和参数OD中函数和参数OD(Object Detection)是计算机视觉领域中的一个重要任务,其目标是从给定的图像或视频中定位和识别出特定的目标物体。

在进行OD的过程中,函数和参数的选择至关重要,它们直接影响着算法的性能和效果。

一、图像预处理函数在进行OD之前,首先需要对图像进行预处理,以提高后续算法的准确性和鲁棒性。

常用的图像预处理函数包括:1. 图像缩放函数:对图像进行缩放操作,将其调整为固定大小。

常用的缩放函数有resize()和rescale(),可以根据需求选择合适的函数。

2. 图像归一化函数:通过对图像的像素值进行归一化处理,将其转化为0到1之间的值。

常用的归一化函数有normalize()和standardize(),可以根据具体情况进行选择。

二、模型选择函数在OD中,模型的选择对于算法的性能和速度有着重要的影响。

常用的模型选择函数包括:1. 模型加载函数:用于加载预训练的OD模型,常用的加载函数有load_model()和import_model(),可以根据模型的格式和框架进行选择。

2. 模型选择函数:用于选择合适的OD模型,常用的选择函数有select_model()和choose_model(),可以根据需要选择具体的模型。

三、参数设置函数在进行OD时,参数的设置对于算法的性能和效果同样至关重要。

常用的参数设置函数包括:1. IOU阈值函数:用于设置目标检测中的IOU(Intersection over Union)阈值,常用的设置函数有set_iou_threshold()和set_overlap_threshold(),可以根据需求选择合适的函数。

2. 置信度阈值函数:用于设置目标检测中的置信度阈值,常用的设置函数有set_confidence_threshold()和set_score_threshold(),可以根据具体情况进行选择。

四、后处理函数在进行OD之后,还需要对检测结果进行后处理,以提高结果的准确性和可视化效果。

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

常用断点拦截窗口:bp CreateWindow 创建窗口bp CreateWindowEx(A) 创建窗口bp ShowWindow 显示窗口bp UpdateWindow 更新窗口bp GetWindowText(A) 获取窗口文本bp ShellExecuteA获取网站转向地址拦截消息框:bp MessageBox(A) 创建消息框bp MessageBoxExA 创建消息框bp MessageBoxIndirect(A) 创建定制消息框bp IsDialogMessageW拦截警告声:bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框:bp DialogBox 创建模态对话框bp DialogBoxParam(A) 创建模态对话框bp DialogBoxIndirect 创建模态对话框bp DialogBoxIndirectParam(A) 创建模态对话框bp CreateDialog 创建非模态对话框bp CreateDialogParam(A) 创建非模态对话框bp CreateDialogIndirect 创建非模态对话框bp CreateDialogIndirectParam(A) 创建非模态对话框bp GetDlgItemText(A) 获取对话框文本bp GetDlgItemInt 获取对话框整数值拦截剪贴板:bp GetClipboardData 获取剪贴板数据拦截注册表:bp RegOpenKey(A) 打开子健bp RegOpenKeyEx 打开子健bp RegQueryValue(A) 查找子健bp RegQueryValueEx 查找子健bp RegSetValue(A) 设置子健bp RegSetValueEx(A) 设置子健功能限制拦截断点:bp EnableMenuItem 禁止或允许菜单项bp EnableWindow 禁止或允许窗口拦截时间:bp GetLocalTime 获取本地时间bp GetSystemTime 获取系统时间bp GetFileTime 获取文件时间bp GetTickCount 获得自系统成功启动以来所经历的毫秒数bp GetCurrentTime 获取当前时间(16位)bp SetTimer 创建定时器bp TimerProc 定时器超时回调函数GetDlgItemInt 得指定输入框整数值GetDlgItemText 得指定输入框输入字符串GetDlgItemTextA 得指定输入框输入字符串拦截文件:bp CreateFileA 创建或打开文件(32位)bp OpenFile 打开文件(32位)bp ReadFile 读文件(32位)bp WriteFile 写文件(32位)GetModuleFileNameAGetFileSizeSetfilepointerfileopenFindFirstFileAReadFile拦截驱动器:bp GetDriveTypeA 获取磁盘驱动器类型bp GetLogicalDrives 获取逻辑驱动器符号bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径★★VB程序专用断点★★文件长度:RtcFileLenbp __vbaFreeStr 对付VB程序重启验证bp __vbaStrCmp 比较字符串是否相等bp __vbaStrComp 比较字符串是否相等bp __vbaVarTstNe 比较变量是否不相等bp __vbaVarTstEq 比较变量是否相等bp __vbaStrCopy 复制字符串bp __vbaStrMove 移动字符串bp MultiByteToWideChar ANSI字符串转换成Unicode字符串bp WideCharToMultiByte Unicode字符串转换成ANSI字符串=============== ================密码常用中断Hmemcpy (win9x专用)GetDlgItemTextAGetDlgItemIntvb:getvolumeinformationavbastrcomp (trw)Bpx __vbaStrComp (记得是两个'_')MSVBVM60!_vbastrcomp|soficeMSVBVM50! |VBAI4STRCtrl+Dbpx msvbvm60!__vbastrcomp do "d *(esp+0c)"(softice)按几次F5出册码出来了。

bpx regqueryvalueexa do "d esp->8"(trw)vbaVarTstEq 判断是否注册的函数(0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], ax改为0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], bx)时间常用中断GetSystemTimeGetLocalTimeGetTickCountvb:rtcGetPresentDate //取得当前日期杀窗常用中断Lockmytask (win9x专用)bp ExitProcess 退出进程DestroyWindowmouse_event (鼠标中断)postquitmessage (Cracking足彩xp,很有用^_^)vb:_rtcMsgBoxini文件内容常用中断GetPrivateProfileStringAGetPrivateProfileProfileIntkey文件:getprivateprofileintReadFileCreateFileA注册表常用中断RegQueryvalueARegQueryvalueExA狗加密中断BPIO -h 278 RBPIO -h 378 R其它常用函数断点CreateFileA (读狗驱动程序),DeviceIOControl,FreeEnvironmentStringsA (对付HASP非常有效).Prestochangoselector (16-bit HASP's), '7242' 查找字符串(对付圣天诺).具体含义参考下面的范例。

光盘破解中断16:getvolumeinformationgetdrivetypeint 2fh (dos)32:GetDriveTypeAGetFullPathNameAGetWindowsDirectoryA读磁盘中断GETLASTERROR 返回扩充出错代码限制中断EnableMenuItem 允许、禁止或变灰指定的菜单条目EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)不知道软盘中断是什么了?还有其它特殊中断,不知道其他朋友可否说一下了?如ockmytask and mouse_event,这些就不是api32函数?win9x 与win2k进行破解,以上中断有部分已经不能用了?不知道在win2k上,以上常用中断函数是什么了?也就是问密码、时间、窗口、ini、key、注册表、加密狗、光盘、软盘、限制等!了解常用的中断,对破解分析可以做到事半功倍!请大家说一下!还有如何破解了某个软件时,一重启就打回原形?不知道下什么中断了?可以分为三种情况:1.比较可能在注册表中2.比较在特殊文件(*.key *.ini *.dat等)3.比较在程序中,没有任何错误提示或者反译也找不到明显字符(这个就是我想问的)还有一个是最难的,就是去掉水印!也可以三种情况:A.水印是位图文件(bitblt,creatBITMAP等位图函数)B.水印是明显字符(反译分析)C.水印不是明显字符(如:This a demo!它只是显示在另一个制作文件上,可是*.htm *.exe等) C.才是最难搞,也是很多人想知道的!包括我在内。

不知道高手们有何提示了?广告条:可以分两种情况:A.从创建窗口进手,可以用到movewindow或者其它窗口函数!B.从位图进手,也可以用到bitblt或者其它位图函数!最后可以借助一些现有工具(如:api27,vwindset,freespy之类的工具)那要看是在哪作的标记,通常是在注册表中留下信息!在softice中就要用bpx regqueryvalueexa do "d esp->8"来中断看看,在trw中要用bpx regqueryvalueexa do "d*(esp+8)"来中断看看。

还有的是在本目录下留下注册信息,常见的有.dat .ini .dll等等,我是用bpx readfile来中断的,还有的是在windows目录下留下注册信息。

你可以借助专用的工具帮助你查看,入filemon等!vb:1、__vbaV arTstNe //比较两个变量是否不相等2、rtcR8ValFromBstr //把字符串转换成浮点数3、rtcMsgBox 显示一信息对话框4、rtcBeep //让扬声器叫唤5、rtcGetPresentDate //取得当前日期针对字串:__vbaStrComp__vbaStrCmp__vbaStrCompVar__vbaStrLike__vbaStrTextComp__vbaStrTextLike针对变量:__vbaVarCompEq__vbaVarCompLe__vbaVarCompLt__vbaVarCompGe__vbaVarCompGt__vbaVarCompNe常用断点(2)THROWVB DLL还调用了oleauto32.dll中的部分函数。

oleauto32.dll是个通用的proxy/stub DLL,其每个函数的原型在<oleauto.h>中定义,并在MSDN中有详细描述。

这也有助于理解VB DLL 中的函数的作用。

举例:LEA EAX, [EBP-58]PUSH EAXCALL [MSVBVM60!__vbaI4Var]执行call之前敲dd eax+8,得到的值为3;执行完call之后,eax = 3从而可知__vbaI4Var的作用是将一个VARIANT转换为I4(即一个长整数)。

__vbaVarTstNe似乎是用来进行自校验的,正常情况下返回值为0。

已知适用的软件有:网络三国智能机器人、音乐贺卡厂。

当这两个软件被脱壳后都回出错,网络三国智能机器人会产生非法*作,而音乐贺卡厂会告诉你是非法拷贝,通过修改__vbaVarTstNe的返回值都可让它们正常运行。

相关文档
最新文档