当前位置:文档之家› 破解时常用断点按钮事件和OEP查找

破解时常用断点按钮事件和OEP查找

破解时常用断点按钮事件和OEP查找
破解时常用断点按钮事件和OEP查找

破解时常用断点、按钮事件和OEP查找!

拦截窗口:

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 CreateFileA

bpx GetFileSize

bpx SetFilePointer

bpx ExitProcess

F12堆栈调用

破解思路

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+N

2、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+N

5、字符串法---插件/搜索所有参考文本

6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样,可以通过DEDE查找FormCreate/FormShow,找到关键标志位

VB语言破解

1、VBExplorer查找按钮事件

2、有提示框则 bp rtcMsgBox(断对话框)

3、通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq

4、万能断点法(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 80000004

0040EC87 6A 00 push 0

0040EC89 68 EC904000 push dcse.004090EC

0040EC8E 68 01030080 push 80000301

0040EC93 6A 00 push 0

00 40EC95 68 00000000 push 0

0040EC9A 68 04000080 push 80000004

0040EC9F 6A 00 push 0

0040ECA1 68 F1904000 push dcse.004090F1

0040ECA6 68 03000000 push 3

0040ECAB BB 00030000 mov ebx,300

0040ECB0 E8 92000000 call dcse.0040ED47

0040ECB5 83C4 28 add esp,28

0040ECB8 E9 36000000 jmp dcse.0040ECF3

0040ECBD 68 04000080 push 80000004

0040ECC2 6A 00 push 0

0040ECC4 68 CC904000 push dcse.004090CC

0040ECC9 68 01030080 push 80000301

0040ECCE 6A 00 push 0

0040ECD0 68 00000000 push 0

0040ECD5 68 04000080 push 80000004

0040ECDA 6A 00 push 0

0040ECDC 68 02914000 push dcse.00409102

0040ECE1 68 03000000 push 3

0040ECE6 BB 00030000 mov ebx,300

0040ECEB E8 57000000 call dcse.0040ED47

0040ECF0 83C4 28 add esp,28

0040ECF3 8BE5 mov esp,ebp

0040ECF5 5D pop ebp

0040ECF6 C3 retn

******************************************************************************************** **********************************************

按钮事件

1、有注册错误/正确提示

bp MessageBoxA

bp rtcMsgBox

如果事先找不到按钮事件,可以通过下消息断点,返回后回溯即可找到按钮事件起始位置

2、无任何提示

bp GetDlgItem

可以通过bp GetDlgItem获取按钮事件代码

3、未注册一启动或者关闭就跳出个注册框或者提示框

bp RegOpenKey(A)

bp CreateFileA

bp GetPrivateProfileStringA

文件: reg/ini/dll/其他

至于保存到什么文件,可以使用以下方法

1、查找字符串,看是否有可疑文件名或者注册表键名

2、猜。。。下断点观察

3、按钮事件跟踪

4、未注册一启动或者关闭就打开网页链接

bp ShellExecuteA

类似的组合

Cmp/test/其他判断

Je/jne/jne/jz XXXXXXXX

软件启动--->判断是否注册--->是否Open

断下后回溯代码即可找到关键点,常用的方法,转存跟踪法

5、未注册就功能使用限制

判断是否注册--->某种功能是否让你使用,如果不能够用,一定会有提示的,或是错误提示或是弹出注册框等,那么从提示入手即可找到解除限制的关键

不完美破解:解除功能限制

6、未注册就日期限制

bp GetLocalTime 获取本地时间

bp GetSystemTime 获取系统时间

bp GetFileTime 获取文件时间

一般下这几个断点比较难分析关键

捷径:查找字符串--找可疑文件--一般以DLL多见

只要不让它读取到这个DLL即可解除限制

7、Demo(演示试用版)--功能残缺

这个和上面的功能限制不一样

功能限制是软件本身就有这个功能,对程序而言,相对应的功能代码也存在

Demo即是没这个功能,空架子一个而已

一句话:破解也无用!

8、网络验证

无法登陆有错误提示者:下消息断点回溯代码,找按钮事件,从头来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了

无法登陆自动退出者:下bp ExitProcess断下(一般可以断下)回溯代码,找按钮事件,从来来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了

9、狗加密

一般狗加密软件,一启动就会检测所需要的狗文件,若没有狗文件,提示错误

这里我们有两个入手点

1、“一启动就会检测所需要的狗文件”,下bp CreateFileA等断点,断下后,回溯

2、“若没有狗文件,提示错误”,下bp MessageBoxA,断下后,回溯

总结:

从上面的介绍说明可以看出,有这么一个共同点---按钮事件,可以这么说,按钮事件是我们的思路之门

按钮事件可以这样得来:

1、通过下相应断点,回溯代码

2、通过辅助工具快捷的得到(VBExplorer、DEDE)

******************************************************************************************** **********************************************

重启验证

80%-90%的软件基本都是重启验证类型

1、注册表类型

Bpx RegOpenKeyA(W)

Bpx RegOpenKeyExA(W)

2、ini文件类型(*.reg/*.ini)

Bpx GetPrivateProfileStringA

3、其他文件类型(*.dat/*.lic…)

Bpx CreateFileA(W)

Bpx ReadFile

4、DLL文件操作类型

如果没有什么有效的拦截函数,不妨试一下Bpx CreateFileA(W).余下的就是通过你的经验去判断了(例如:35课)

注意:建议使用Bpx断点,这样,比较快捷、准确。尚若Bpx失效,再尝试bp

方便断点设置的有以下3个断点插件,APIBreak中国版(不带Point-H),APIBreak英文版(带Point-H)、+BP-Olly

******************************************************************************************** **********************************************

去nag框的方法

1、若是Delphi&BCB程序,可以通过FormCreate法查找到FormCreate,再单步跟踪,找到窗口的调用CALL,一般它的具体形式是call dword ptr ds:[edx+E8]

2、OD载入程序后,单步跟踪,找到窗口的调用CALL

注意看第37课

******************************************************************************************** **********************************************

两种经典方法

1、Point-H法

此法类似下断点bp GetWindowText(A/W),但是,在某些Point-H断不下来的情况下,bp GetWindowText(A/W)却可以断下来。Point-H能够断下来的,bp GetWindowTextA基本上都可以顺利断下

2、转存跟踪法

到底是byte/word/Dword断点,一般情况下是byte,其他特殊情况大家临场判断

******************************************************************************************** **********************************************

一些常规断点

拦截窗口:

bp CreateWindow 创建窗口

bp CreateWindowEx(A/W) 创建窗口

bp ShowWindow 显示窗口

bp UpdateWindow 更新窗口

bp GetWindowText(A/W) 获取窗口文本

拦截消息框:

bp MessageBox(A/W) 创建消息框

bp MessageBoxExA 创建消息框

bp MessageBoxIndirect(A/W) 创建定制消息框

拦截警告声:

bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)

拦截对话框:

bp DialogBox 创建模态对话框

bp DialogBoxParam(A/W) 创建模态对话框

bp DialogBoxIndirect 创建模态对话框

bp DialogBoxIndirectParam(A/W) 创建模态对话框

bp CreateDialog 创建非模态对话框

bp CreateDialogParam(A) 创建非模态对话框

bp CreateDialogIndirect 创建非模态对话框

bp CreateDialogIndirectParam(A/W) 创建非模态对话框

bp GetDlgItemText(A) 获取对话框文本

bp GetDlgItemInt 获取对话框整数值

拦截剪贴板:

bp GetClipboardData 获取剪贴板数据

拦截注册表:

bp RegOpenKey(A/W) 打开子健

bp RegOpenKeyEx(A/W) 打开子健

bp RegQueryValue(A/W) 查找子健

bp RegSetValue(A/W) 设置子健

bp RegSetValueEx(A/W) 设置子健

功能限制拦截断点:

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字符串

******************************************************************************************** **********************************************

灰色按钮

有两种情况:通过代码和控件属性

VB语言:

代码:ctrl+b查找 816C24,在JMP下断,然后F2运行程序,把 push ebp 改为 retn,或者把这些代码全NOP 掉

控件属性:VBExplorer 辅助工具改属性

Delphi/BC++语言:

代码:通过DEDE找FormCreate,记下地址,改 retn

控件属性:相关辅助工具改属性

易语言

代码:bp EnableWindow,断下后返回,把 push ebp 改为 retn

控件属性:用十六进制工具查找 BOB4C5A5 ,把它后面的 07 改 05

破解时常用断点:

VB MASM32 VC BCB 易语言 Delphi

VB破解

1、VBExplorer查找按钮事件

2、有提示框则bp rtcMsgBox

3、通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq

bp __vbaStrCmp

bp __vbaStrComp

4、万能断点法(816C24法)

注册验证程序可以用这个断点下断,一般离程序访问注册表很近:

bp __vbaStrToAnsi

5.F12堆栈调用

总结:

VB程序破解的关键跳转,一般与其它语言的不同,没有JPM XXXXXXX

一般以 JE/JNE XXXXXXXXX 跳转记录一般不会很远(虽然是短距离跳转,但是关键就在这里,可以设置大量的信息)。如果发现False/True 可能是关键点

VB:

XXXXXXX JE/JNE XXXXX

设置信息

设置信息

Delphi BC++ 易语言 VC++ 汇编:

XXXXXXX JE/JNE XXXXX

设置信息

设置信息

XXXXXXX JMP XXXXX

设置信息

设置信息

VC++ 汇编(有的一段,一段的):

XXXXXXX JE/JNE XXXXX

设置信息

设置信息

retn

push xx

设置信息

设置信息

retn

push xx

设置信息

设置信息

retn

易语言

易语言破解思路:

1. 信息框法 bp MessageBoxA(断对话框)

2.字符串法

查看易语言文本信息:

bp GetProcessHeap F9运行4次,取消断点执行ALT+F9 用户代码 F8单步走或者在区段为".data"/".ecode"下断,运行

3.窗口标题法 bp SetWindowTextA

4.F12堆栈调用

0040C0CB=易语言.0040C0CB (ASCII "shaonanshaonvluntan")

DELPHI破解:

1、DEDE、PE Explorer ResScope作为强有力的辅助工具找按妞事件

2、Point-H法

3、bp GetDlgItem/GetDlgItemTextA(断输入框)

4、bp MessageBoxA(W)(断对话框)---Ctrl+N

5、字符串法---插件/搜索所有参考文本

6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样的

可以通过查找FormCreate/FormShow----DEDE,找到关键标志位!

来判断程序怎么样的判断是否注册或者用户类型

7. 窗口标题法 bp SetWindowTextA

8.F12堆栈调用

注册表:

bpx RegCreateKeyExA 对于Delphi程序程序来说,用这个断点比较合适

bp RegCreateKeyExA 对于加了壳的程序

注册码:Rc1-420+用户名(不能为整数,)+C00L

C+破解

C类

Point-H法

bp GetDlgItem(断按下按钮)

bp MessageBoxA(断对话框)

字符串法

F12堆栈调用

窗口标题法 bp SetWindowTextA

★★C+程序专用断点★★

bp lstrcmpA (KERNEL32.lstrcmpA) 比较用法

bp _mbscmp //比较

C类程序的经典断点:

bp GetWindowTextA(断按下按钮) //也是适用于其它语言

bp GetWindowTextLengthA(断按下按钮) //也是适用于其它语言

bp GetDlgItem(断按下按钮) //也是适用于其它语言

bp GetDlgItemTextA

ds:[004021C8]=77C01881 (msvcrt._mbscmp)

BC++破解

1、DEDE、PE Explorer作为强有力的辅助工具找按妞事件

2、Point-H法

3、bp GetDlgItem/GetDlgItemTextA(断输入框)

4、bp MessageBoxA(W)(断对话框)---Ctrl+N

5、字符串法---插件/搜索所有参考文本

6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样的可以通过查找FormCreate/FormShow----DEDE,找到关键标志位!

来判断程序怎么样的判断是否注册或者用户类型

7.窗口标题法 bp SetWindowTextA

8.F12堆栈调用

bpx RegCreateKeyExA 对于Delphi程序程序来说,用这个断点比较合适bp RegCreateKeyExA 对于加了壳的程序

MASM32 / TASM32破解

入口点 :

004011C7 6A 00 push 0

004011C9 E8 5E070000 call 0040192C

004011CE A3 70614000 mov dword ptr ds:[406170],eax

004011D3 6A 00 push 0

004011D5 68 EE114000 push MASM32.004011EE

004011DA 6A 00 push 0

004011DC 68 C8000000 push 0C8

Point-H法

bp GetDlgItem(断按下按钮)

bp MessageBoxA(断对话框)

字符串法

F12堆栈调用

窗口标题法 bp SetWindowTextA

OD常用断点

1、限制程序功能函数

EnableMenuItem 允许、禁止或变灰指定的菜单条目

EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)2、对话框函数

CreateDialog 从资源模板建立一非模态对话窗

CreateDialogParam 从资源模板建立一非模态对话窗

CreateDialogIndirect 从内存模板建立一非模态对话窗CreateDialogIndirectParam 从内存模板建立一非模态对话窗

DialogBox 从资源模板建立一模态对话窗

DialogBoxParam 从资源模板建立一模态对话窗

DialogBoxIndirect 从内存模板建立一模态对话窗

DialogBoxIndirectParam 从内存模板建立一模态对话窗

EndDialog 结束一模态对话窗

MessageBox 显示一信息对话框

MessageBoxEx 显示一信息对话框

MessageBoxIndirect 显示一定制信息对话框

GetDlgItemInt 得指定输入框整数值

GetDlgItemText 得指定输入框输入字符串

GetDlgItemTextA 得指定输入框输入字符串

Hmemcpy 内存复制(非应用程序直接调用)

3、磁盘处理函数1273?GAMEHK所有--admin?11326

GetDiskFreeSpaceA 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量GetDiskFreeSpaceExA 获取与一个磁盘的组织以及剩余空间容量有关的信息GetDriveTypeA 判断一个磁盘驱动器的类型

GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母

GetFullPathNameA 获取指定文件的详细路径

GetVolumeInformationA 获取与一个磁盘卷有关的信息

GetWindowsDirectoryA 获取Windows目录的完整路径名

GetSystemDirectoryA 取得Windows系统目录(即System目录)的完整路径名

4、文件处理函数

CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台

OpenFile 这个函数能执行大量不同的文件操作

ReadFile 从文件中读出数据

ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调WriteFile 将数据写入一个文件

WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调SetFilePointer 在一个文件中设置当前的读写位置

SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾

CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等_lcreat 创建一个文件

_lopen 以二进制模式打开指定的文件

_lread 将文件中的数据读入内存缓冲区

_lwrite 将数据从内存缓冲区写入一个文件

_llseek 设置文件中进行读写的当前位置

_lclose 关闭指定的文件

_hread 将文件中的数据读入内存缓冲区

_hwrite 将数据从内存缓冲区写入一个文件

OpenFileMappingA 打开一个现成的文件映射对象

CreateFileMappingA 创建一个新的文件映射对象

MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间MapViewOfFileEx (内容同上)

CreateDirectoryA 创建一个新目录

CreateDirectoryExA 创建一个新目录

RemoveDirectoryA 删除指定目录

SetCurrentDirectoryA 设置当前目录

MoveFileA 移动文件

DeleteFileA 删除指定文件

CopyFileA 复制文件

CompareFileTime 对比两个文件的时间

SetFileAttributesA 设置文件属性

SetFileTime 设置文件的创建、访问及上次修改时间

FindFirstFileA 根据文件名查找文件

FindNextFileA 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件FindClose 关闭由FindFirstFile函数创建的一个搜索句柄

SearchPathA 查找指定文件

GetBinaryTypeA 判断文件是否可以执行GetFileAttributesA 判断指定文件的属性

GetFileSize 判断文件长度

GetFileTime 取得指定文件的时间信息

GetFileType 在给出文件句柄的前提下,判断文件类型5、注册表处理函数

RegOpenKeyA 打开一个现有的注册表项RegOpenKeyExA 打开一个现有的注册表项RegCreateKeyA 在指定的项下创建或打开一个项RegCreateKeyExA 在指定项下创建新项的更复杂的方式RegDeleteKeyA 删除现有项下方一个指定的子项RegDeleteValueA 删除指定项下方的一个值RegQueryValueA 获取一个项的设置值RegQueryValueExA 获取一个项的设置值RegSetValueA 设置指定项或子项的值RegSetValueExA 设置指定项的值

RegCloseKey 关闭系统注册表中的一个项(或键)

6、时间处理函数

CompareFileTime 比较两文件时间

GetFileTime 得文件建立,最后访问,修改时间GetLocalTime 得当前本地时间

GetSystemTime 得当前系统时间

GetTickCount 得windows启动至现时毫秒

SetFileTime 设置文件时间

SetLocalTime 设置本地时间

SetSystemTime 设置系统时间

7、进程函数

CreateProcessA 创建一个新进程

ExitProcess 以干净的方式关闭一个进程

FindExecutableA 查找与一个指定文件关联在一起的程序的文件名FreeLibray 释放指定的动态链库

GetCurrentProcess 获取当前进程的一个伪句柄

GetCurrentProcessId 获取当前进程一个唯一的标识符

GetCurrentThread 获取当前线程的一个伪句柄

GetExitCodeProces 获取一个已结束进程的退出代码

GetExitCodeThread 获取一个已结束线程的退出代码

GetModuleHandleA 获取一个应用程序或动态链接库的模块句柄GetPriorityClassA 获取特定进程的优先级别

LoadLibraryA 载入指定的动态链接库,并将它映射到当前进程使用的地址空间LoadLibraryExA 装载指定的动态链接库,并为当前进程把它映射到地址空间LoadModule 载入一个windows应用程序,并在指定的环境中运行TerminateProcess 结束一个进程

8、断点设置列表

一般处理

bpx hmemcpy

bpx MessageBox

bpx MessageBoxExA

bpx MessageBeep

bpx SendMessage

bpx GetDlgItemText

bpx GetDlgItemInt

bpx GetWindowText

bpx GetWindowWord

bpx GetWindowInt

bpx DialogBoxParamA

bpx CreateWindow

bpx CreateWindowEx

bpx ShowWindow

bpx UpdateWindow

bmsg xxxx wm_move

bmsg xxxx wm_gettext

bmsg xxxx wm_command

bmsg xxxx wm_activate

时间相关

bpint 21 if ah==2A (DOS)

bpx GetLocalTime

bpx GetFileTime

bpx GetSystemtime

CD-ROM 或磁盘相关

bpint 13 if ah==2 (DOS)

bpint 13 if ah==3 (DOS)

bpint 13 if ah==4 (DOS)

bpx GetFileAttributesA

bpx GetFileSize

bpx GetDriveType

bpx GetLastError

bpx ReadFile

bpio -h (Your CD-ROM Port Address) R 软件狗相关

bpio -h 278 R

bpio -h 378 R

键盘输入相关

bpint 16 if ah==0 (DOS)

bpint 21 if ah==0xA (DOS)

文件访问相关

bpint 21 if ah==3dh (DOS)

bpint 31 if ah==3fh (DOS)

bpint 21 if ah==3dh (DOS)

bpx ReadFile

bpx WriteFile

bpx CreateFile

bpx SetFilePointer

bpx GetSystemDirectory

INI 初始化文件相关

bpx GetPrivateProfileString

bpx GetPrivateProfileInt

bpx WritePrivateProfileString

bpx WritePrivateProfileInt

注册表相关

bpx RegCreateKey

bpx RegDeleteKey

bpx RegQueryValue

bpx RegCloseKey

bpx RegOpenKey

注册标志相关

bpx cs:eip if EAX==0

内存标准相关

bpmb cs:eip rw if 0x30:0x45AA==0 显示相关

bpx 0x30:0x45AA do "d 0x30:0x44BB"

bpx CS:0x66CC do "? EAX"

bpx lockmytask :拦截任何一个按键

bpx hmemcpy :万能断点

按钮事件查找:

一、VB程序

其实,VB的按纽事件的找法是最为普遍的,也就是大家所谓的万能断点.其实也不仅仅是针对按纽事件,还有很多其他的用处,如取消NAG,启动框,灰色按纽或隐藏按纽,启动时的timer事件等等,具体的就自己去总结吧,这里只演示按纽事件!

OD载入后,CTRL+B,816C24

确定后,就会来到下图处:

然后,就在下面的JMP处F2下断,下完后CTRL+L,如果还有,就继续下断点.

下完断点后,运行程序,点击相应的按纽,OD就会断下来了

下面的任务就是考验大家的耐心,F8跟踪吧,不再赘述了.

当然,为了方便大家,可以写个简单的脚本,免的每次都去手动设置了,节省时间: 复制内容到剪贴板代码:var Addr

mov Addr,401000

loop:

find Addr,#816C2404??000000#

cmp $RESULT,0

je Exit

add $RESULT,08

bp $RESULT

add $RESULT,1

mov Addr,$RESULT

jmp loop

Exit:

eval "按纽事件查找完毕!"

msg $RESULT

ret

二、Delphi和BC++程序

Delphi和BC++都是同一公司开发的,故查找方法都一样,当然你也可以使用DEDE.

OD载入后,CTRL+G,转到00401000处

然后就CTRL+B,查找特征码740E8BD38B83????????FF93????????

然后就会找到下面的地方:

然后就在下面的CALL处下断吧.

下面的工作就是不断的CTRL+L继续查找和F2下断了.

运行下看看效果吧:

看,断下了吧,下面就F7跟进这个CALL吧,就来到这个按纽事件处了.

同样写个脚本,方便大家操作: 复制内容到剪贴板代码:var Addr

mov Addr,401000

loop:

find Addr,#740E8BD38B83????????FF93????????#

cmp $RESULT,0

je Exit

add $RESULT,0A

bp $RESULT

add $RESULT,1

mov Addr,$RESULT

jmp loop

Exit:

ret

三、易语言

易语言的这种查找方法,同样适合有壳的程序,其他的就必须脱壳后再继续操作了. OD载入后,就F9运行程序吧,当程序运行后,ALT+E

Visual Studio调试之断点进阶篇

在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel 系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样初始化IDT,可以去网上搜索一些资料。 总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU 然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是: 1.先看看机器里面是不是安装了一个调试器—记住,这一步很重要,之所以重要以 后的文章里面会介绍。 2.如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。 3.否则操作系统启动调试器,并将调试器附到进程上。 4.这样,我们才能在调试器里面检查程序内部变量的值。 前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的? 或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者C#代码都会对应好几行汇编指令。 因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、https://www.doczj.com/doc/ba4323697.html,还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。 因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式 条件断点 首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。 根据触发次数设置 比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

安卓按钮单击事件

第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监听器的!!! 对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。 第二种:内部类作为监听器 将事件监听器类定义成当前类的内部类。1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。这也是内部类的两个优势。上面代码就是内部类的形式!! 第三种:Activity本身作为事件监听器

这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。 上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。 第四种:外部类作为监听器 ButtonTest类 当用户单击button按钮时,程序将会触发MyButtonListener监听器 外部MyButtonListener类

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

eclipse断点调试指导

1.进入debug模式(基础知识列表) 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域功能快捷键 全局单步返回F7 全局单步跳过F6 全局单步跳入F5 全局单步跳入选择Ctrl+F5 全局调试上次启动F11 全局继续F8 全局使用过滤器单步执行Shift+F5 全局添加/去除断点Ctrl+Shift+B 全局显示Ctrl+D 全局运行上次启动Ctrl+F11 全局运行至行Ctrl+R 全局执行Ctrl+U ============================= 1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此

method 4.step Filter 逐步过滤一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重新开始执行debug,一直运行直到遇到breakpoint。 例如:A和B两个断点,debug过程中发现A断点已经无用,去除A 断点,运行resume就会跳过A直接到达B断点。 6.hit count 设置执行次数适合程序中的for循环(设置breakpoint view-右键hit count) 7.inspect 检查运算。执行一个表达式显示执行值 8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂 11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint) 12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...) 断点属性: 1.hit count 执行多少次数后暂挂用于循环 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂 3.suspend thread 多线程时暂挂此线程 4.suspend VM 暂挂虚拟机 13.variables 视图里的变量可以改变变量值,在variables 视图选择变

委托及事件响应button_click

C#事件及响应方法——让你明白private void button1_Click(object se nder, System.EventArgs e) C#语言自C/C++演变而来。它是现代、简单、完全面向对象和类型安全的。C#语言是微软公司针对.Net平台才推出来的一门新语言,作为.Net平台的第一语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果。面向对象、类型安全、组件技术、自动内存管理、跨平台异常处理、版本控制、代码安全管理…… 在.NET应用程序开发中,不管是WEB Forms(https://www.doczj.com/doc/ba4323697.html,)还是Windows Forms,都涉及到大量对象的事件响应及处理,比如客户在线提交一份订单、或是在Windows窗口上移动鼠标等都将有事件发生。那么在C#中,是怎样声明事件并为事件添加响应方法的呢?下面的文章对此为大家作了详细的讲述。 原理简介 在C#中,一个类可以有域(Fields)、属性(Properties)、方法(Methods)、索引(Ind exs)、事件(Events)等成员,其中事件(Events)成员就是用来声明一个类事件的。在类中声明一个事件成员一般采用如下的语法形式: public event 代表名事件名。 如在Control类中声明了一个Click事件成员,其语法如下: public event EventHandler Click; 在C#中,增加了一个新的数据类型delegate(代表)来解决事件处理问题。代表数 据类型非常类似于C语言中的指针,其与指针不同的是,其是代码是安全的,可管理的。 由于C#本身的简易性,对于没有使用过C及指针的程序来说,理解delegate也是非常容易的。 在C#中,通过使用delegate,你可以通过“+=”(加等于)操作符非常容易地为.Ne t对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。如下面为temp按钮添加Click事件的语句: temp.Click+=new System.EventHandler(this.Test);//为test添加事件处理方 法 在上面声明事件的语句中,Eventhandler是一个delegate(代表)类型,其在.Net类库中如下声明的: public delegate void EventHandler(object sender,EventArgs e); 这样,所有形如:void 函娄名(object 参数名,EventArgs参数名);的函数都可以作为Co ntrol类的Click事件响应方法了。如下面所定义的一个事件响应方法: private void button1_Click(object sender, System.EventArgs e)

OD教程文库

OD教程文库.txt曾经拥有的不要忘记;不能得到的更要珍惜;属于自己的不要放弃;已经失去的留作回忆。OllyDbg完全教程 一,什么是 OllyDbg? OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。 Version 1.10 是最终的发布版本。这个工程已经停止,我不再继续支持这个软件了。但不用担心:全新打造的 OllyDbg 2.00 不久就会面世! 运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。 支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE 指令集以及相关的数据格式,但是不支持SSE2指令集。 配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。 数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。 帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。 启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。OllyDbg支持即时调试。OllyDbg根本不需要安装,可直接在软盘中运行! 调试DLLs:您可以利用OllyDbg调试标准动态链接库 (DLLs)。OllyDbg 会自动运行一个可执行程序。这个程序会加载链接库,并允许您调用链接库的输出函数。 源码级调试: OllyDbg 可以识别所有 Borland 和 Microsoft 格式的调试信息。这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。 代码高亮: OllyDbg 的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令)和不同的操作数(常规[general]、 FPU/SSE、段/系统寄存器、在栈或内存中的操作数,常量)。您可以定制个性化高亮方案。 线程: OllyDbg 可以调试多线程程序。因此您可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。并且线程窗口将会显示每个线程的错误(就像调用 GETLASTERROR

断点回归设计的步骤

近在做一个需要利用断点回归设计的研究。为了保证实践的规范性,并且避免未来审稿中可能面对的质疑,花了几天时间梳理了一下断点回归设计的标准操作,整理出来,供来人参考。本文参考了三篇文献,先摆在这里,建议大家去读原文: 第一篇:Lee, and Lemieux, 2010," Regression Discontinuity Designs in Economics ",Journal of Economic Literature, Vol. 48: 281–355. 第二篇:Pinotti, Paolo. "Clicking on heaven's door: The effect of immigrant legalization on crime." American Economic Review107.1 (2017): 138-68. 第三篇:Thoemmes, Felix, Wang Liao, and Ze Jin. "The Analysis of the Regression-Discontinuity Design in R." Journal of Educational and Behavioral Statistics 42.3 (2017): 341-360. 1.断点回归常规操作流程 第1步检查配置变量(assignment variable,又叫running variable、forcing variable)是否被操纵。这里的配置变量,其实就是RD中决定是否进入实验的分数(Score),是否被操纵的意思就是,是否存在某种跳跃性的变化。在实际操作中有两种方式来检验,一是画出配置变量的分布图。最直接的方法,是使用一定数量的箱体(bin),画出配置变量的历史直方图(histogrm)。为了观察出分布的总体形状,箱体的宽度要尽量小。频数(frequencies)在箱体间的跳跃式变化,能就断点处的跳跃是否正常给我们一些启发。从这个角度来说,最好利用核密度估计做出一个光滑的函数曲线。二是利用McCrary(2008)的核密度函数检验。(命令是DCdensity,介绍见陈强编著的《高级计量经济学及Stata应用》(第二版)第569页), Frandsen (2013)提出了一种新的检验方法,但目前被使用 的并不多。 第2步画因变量均值对配置变量的散点图,并选择带宽(bandwidth selection)。首先,挑选出一定数目的箱体,求因变量在每个箱体内的均值,画出均值对箱体中间点的散点图。一定要画每个箱体平均值的图。如果直接画原始数据的散点图,那么噪音太大,看不出潜在函数的形状。不要画非参数估计的连续统,因为这个方法自然地倾向于给出存在断点的印象,尽管总体中本来不存在这样的断点。然后,选择第三步骤中需要的带宽。Lee和Lemieux(2010)介绍了两种确定最优带宽的方法:拇指规则法(rule of thumb)和交叉验证法(CV)。还有另外两种比较受关注的方法:IK法和CCT法。IK法以Imbens和Kalyanaraman两个人命名,对应着论文Imbens和Kalyanaraman(2012)。这篇论文发表在Review of Economic Studies,Lee和Lemieux(2010)文中提到过此文2009年的NBER工作论文版。CCT法以Calonico、Cattaneo和Titiunik三个人命名,对应着论文Calonico、Cattaneo和Titiunik(2014a)。用非参数法做断点回归估计时的stata命令rd,就是用IK发确定最优带宽。stata命令rdrobust、rdbwselect,提供CV、IK、CCT三种不同的最优带宽计算方法选项。但是实际上rdrobust中已经更新了IK带宽选择函数,更新的算法与IK算法的区别有待考证,后续会补充。实际操作中一般是两种算法都会采纳,并汇报参数估计对带宽选择是不敏感的。

HTML Button.onclick 事件汇总

HTML Button.onclick 事件汇总 关于web设计中的命名标准 #page #header #logo #sm (servicemenu) .regsiter .login #nav .menu .subMenu .search .sreachbtn(搜索按钮).sreachinput(搜索输入 框) #container .bread [#areaSidebar] #sidebar .title .service .news .newslist .piclist .hot .msg(提示信息) .download .tab .list .accordion [#areaBanner] #content .contentMain .input .select .note .summary

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 EBX

0040112F . 837D 0C 02 CMP DWORD PTR SS:[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.004011A3 F8往下走,找到创建注册窗体的代码. [cpp] view plaincopy00401209 > 6A 00 PUSH 0 ; /lParam = NULL 0040120B . 68 53124000 PUSH CRACKME.00401253 ; |DlgProc = CRACKME.00401253 00401210 . FF75 08 PUSH 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

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 禁止或允许窗口 拦截时间:

WinDBG技巧:设断点命令详解

WinDBG技巧:设断点命令详解(bp, bu, bm, ba 以及bl, bc, bd, be) WinDBG 提供了多种设断点的命令:bp, bu, bm, ba bp命令是在某个地址下断点,可以bp 0x7783FEB 也可以bp MyApp!SomeFuncti on。对于后者,WinDBG 会自动找到MyApp!SomeFunction对应的地址并设置断点。但是使用bp的问题在于:1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效;2)WinDBG 不会把bp断点保存工作空间中。所以,我比较喜欢用bu 命令。 bu 命令是针对某个符号下断点。比如bu MyApp!SomeFunction。在代码被修改之后,该断点可以随着函数地址改变而自动更新到最新位置。而且bu 断点会保存在Win Dbg工作空间中,下次启动Windbg 的时候该断点会自动设置上去。 另外,在模块没有被加载的时候,bp 断点会失败(因为函数地址不存在),而bu 断点则可以成功。新版的WinDBG中bp失败后会自动被转成bu 。 bm命令也是针对符号下断点。但是它支持匹配表达式。很多时候你下好几个断点。比如,把MyClass 所有的成员函数都下断点:bu MyApp!MyClass::*,或者把所有以CreateWindow开头的函数都下断点:bu user32!CreateWindow* 。 以上三个命令是对代码下断点,我们还可以对数据下断点。 ba命令就是针对数据下断点的命令,该断点在指定内存被访问时触发。命令格式为 ba Access Size [地址] Access 是访问的方式,比如e(执行),r(读/写),w(写) Size是监控访问的位置的大小,以字节为单位。值为1、2或4,还可以是8(64位机)。 比如要对内存0x0483DFE进行写操作的时候下断点,可以用命令ba w4 0x0483DFE 这里顺便提以下其他断点命令: bl列出所有断点

OD破解常用方法

[分享] OD破解常用方法[复制链接] 一、概论 壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳两种 顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。当然加密壳的保护能力要强得多! 二、常见脱壳方法 预备知识 1.PUSHAD (压栈)代表程序的入口点, 2.POPAD (出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近 3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。 方法一:单步跟踪法 1.用OD载入,点“不分析代码!” 2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4) 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选) 4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现! 5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP 6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入 7.一般有很大的跳转(大跨段),比如jmp XXXXXX 或者JE XXXXXX 或者有RETN的一般很快就会到程序的OEP。 Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP! 方法二:ESP定律法 ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!) 1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值) 2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车! 3.选中下断的地址,断点--->硬件访--->WORD断点。 4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。

使用OllyDbg从零开始Cracking 第三十二章-OEP寻踪

第三十二章-OEP寻踪 在上一章中我们提到了OEP(Original EntryPoint)的概念,也就是应用程序原本要执行的第一行代码,OEP %99的情况位于第一个区段中(本章中有一个例子,OEP就不在第一个区段,我是特意举的这个例子,嘿嘿)。 我们知道当到达OEP后,各个区段在内存中的分布跟原始程序很接近,这个时候我们就可以尝试将其转储到(dump)文件中,完成程序的重建工作(PS:脱壳)。 通常脱壳的基本步骤如下: 1:寻找OEP 2:转储(PS:传说中的dump) 3:修复IAT(修复导入表) 4:检查目标程序是否存在AntiDump等阻止程序被转储的保护措施,并尝试修复这些问题。 以上是脱壳的经典步骤,可能具体到不同的壳的话会有细微的差别。本章我们主要介绍定位OEP的方法。 很多时候我们遇到的壳会想方设法的隐藏原程序的OEP,要定位OEP的话就需要我们尝试各种各样的方法了。 首先我们来看看上一章CRACKME UPX,然后再来看其他的壳。 1)搜索JMP或者CALL指令的机器码(即一步直达法,只适用于少数壳,包括UPX,ASPACK壳) 对于一些简单的壳可以用这种方式来定位OEP,但是对于像AsProtect这类强壳(PS:AsProtect在04年算是强壳了,嘿嘿)就不适用了,我们可以直接搜索长跳转JMP(0E9)或者CALL(0E8)这类长转移的机器码,一般情况下(理想情况)壳在解密完原程序各个区段以后,需要一个长JMP或者CALL跳转到原程序代码段中的OEP处开始执行原程序代码。 下面我们将上一章中加了UPX壳的那个CrueHead的CrackMe加载到OD中: 这里我们按CTRL+B组合键搜索一下JMP的机器码E9,看看有没有这样一个JMP跳转到原程序的代码段。

STVD在调试的时候出现无法设置断点的问题

STVD在调试的时候出现无法设置断点的问题,提示One or more breakpoints are not positioned in valid files (no debug information or not a project file) --------------------------- ST Visual Develop --------------------------- One or more breakpoints are not positioned in valid files (no debug information or not a project file). These breakpoints have been removed. ---------------------------一个或多个断点未放置在有效文件(没有调试信息,或者不是一个项目文件)。这些断点已被删除(谷歌翻译)。 上图,如果点击确定,设置的断点便被清除,同时也会发现,右侧的反汇编窗口不能同时显示具体的汇编信息是由那句C语句生成的。 如果要设置断点,需要在Debug环境下才能放置断点。在Release环境下可以进行在线仿真,但是不能放置断点,并且仿真暂停的时候,也不知道程序停在了什么地方,不能进行单步调试等等。如下图:

1.一般情况下,我们新建的工程,都是在Release环境下建工程。并且project>settings中, 只在Release环境的设置,忽略了Debug的设置。如果在Release环境下进行了其他设置,同样的Debug下也要同样的设置。不然在调试环境下,无法通过编译,更不用提在线仿真,设置断点的问题。 2.一般进行程序编写编译的时候在Release环境中操作,此时可以进行在线仿真,但是无 法设置断点,给程序的调试带来很大的障碍,STVD环境下的设置方法如下,打开 project>settings,如下如: 此处默认设置,一般不做更改,是为了避免最后发行使用的程序忘记修改此处,避免编译的程序不是最优的。 在Debug环境下,如下图:

OllyDBG常用API断点非常实用

OllyDbg常用断点 以前收集的资料,不知道作者是谁了。很抱歉! --liuyunagang 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位) GetModuleFileNameA GetFileSize Setfilepointer fileopen FindFirstFileA ReadFile 拦截驱动器: bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径 ★★VB程序专用断点★★

相关主题
文本预览
相关文档 最新文档