experiment 用OD下消息断点, 捕获按钮操作.
od 加密函数断点

od 加密函数断点
OD加密函数断点是指在使用OD(OllyDbg)调试工具时,针对
特定的加密函数设置断点以便分析其加密算法和过程。
在进行OD加
密函数断点时,我们通常需要考虑以下几个方面:
1. 加密函数的位置,首先需要在程序中定位到需要分析的加密
函数的位置,可以通过静态分析或动态调试的方式找到函数的入口点。
2. 加密算法分析,一旦设置了断点,当程序执行到加密函数时,我们可以逐步跟踪代码的执行过程,观察寄存器和内存的变化,以
便分析加密算法的具体实现方式。
3. 输入输出数据分析,通过断点可以观察到加密函数的输入和
输出数据,我们可以分析这些数据的结构和变化规律,以便理解加
密过程中数据的转换和变换。
4. 调试技巧,在设置加密函数断点时,需要灵活运用OD调试
工具提供的功能,比如条件断点、内存监视等,以便更好地分析加
密函数的执行过程。
总之,在进行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中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。
OD使用方法

我们一直狂按shit+F9,心里要数着按了多少次,程序就运行了:)
我这里按了3次
好,我们现在重新载入程序,到了入口之后,我们再次“狂”按shit+F9,多少次?2次(3-1=2)
0040CCD2 4B dec ebx //停在这里了
0040CCD3 6F outs dx,dword ptr es:
0040CCF7 B9 00100000 mov ecx,1000
0040CCFC BB 2B11D2BB mov ebx,BBD2112B
0040CD01 AD lods dword ptr ds:
0040CD02 33C3 xor eax,ebx
0040CD04 AB stos dword ptr es:
****************************************************************************************
好了,切入正题。。。。
OD载入,因为我一开始就不忽略所有的异常,所以一载入就提示有异常,我们shit+F9,点“否”,停在入口了。(不忽略所有的异常,请大家检查一下自己的OD)
确定从所有Seh异常中走出来,如果前面有大量循环,逐段解压。
****************************************************************************************
大家先细细品位下上面的“理论”!如果你弄懂了,那你应该高兴下了。。
0040CCDB 8B00 mov eax,dword ptr ds:
0040CCDD 3D 04000080 cmp eax,80000004
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之常用命令

OD之常⽤命令⼀:od断点注释保存的问题,由于od只有在正常退出的情况下才会保存分析代码时留下的注释,⽽很多时候为了在退出od时不让⽬标程序退出使⽤了剥离进程,这样就会导致这次操作所有的注释都没有保存,第⼆次重新载⼊时候⼜的重新分析注释下断点,所以需要⾃⼰下载⼀个插件 Myinfo.dll,这个插件可以⼿动保存注释和断点,插件⾥⾯的导出操作是把注释导出到⼀个⽂件中,导⼊操作是把注释导⼊到od代码分析界⾯来,注意,每次导出操作都会删掉⽂件中的内容,保留本次导出内容⼆: 插件安装,od插件只需把插件的dll粘贴到od安装⽂件夹的plugin⽂件夹中即可三: 定位代码时有时使⽤⼀些花指令代码⽐如_asm{ mov eax,eax mov eax,eax} 这样的代码⽆实际作⽤,但是有助于定位程序代码段,可是查找命令序列时有时找不出来,这就需要点查看可执⾏模块,找出⽬标模块,双击,⼀般需要重复两次操作,这样才能找到该命令序列,以为开始中断并不处于主模块内,需要进⼊主模块段才可以查找注释和指令四:od⼀些常⽤命令dd 以四字节⽅式转储,也就是以四字节的⽅式查看地址内存的值,⽐如⼀个数组 array[20] 它的⾸地址是405118 那么 dd 405118 就可以看到array[0]的值了,dd i*0x4+405118 就可以看到数组array[i]的值,游戏分析时分析对象数组,dd [eax*4+03f82520] ⾸先取出数组03f82520[eax]⾥⾯保存的地址,然后查看该地址的值,很多怪物对象的⾸地址都是放在对象数组⾥⾯,找到该地址,就可以分析出该怪物的相应信息如 dd [eax*4+03f82520] +0xc 这个可能就是怪物⽣命等等dc 是以ascill码显⽰该地址,这个⼀般是查看⽂本信息hw硬件中断在写⼊时db 以⽐特格式⼗六进制转储当然有⼀些快捷键命令暂时不表五: 备份,修改数据之前,难免要备份,这就要⽤到备份功能,这样就可以很容易恢复到修改之前六: 跟踪调试,这个功能相当不错,可以记录所有寄存器的值,这样便于观察分析七: 直接更改程序汇编代码,然后保存到⽂件,这样就相当于更改了部分程序代码,很⽅便⼋:下API断点等熟悉了再补充。
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常用下断api
OD 常用下断API(2009-10-10 11:33:17)标签:od api 断点 it 分类:破解之道1.GetModuleHandleA获取一个应用程序或动态链接库的模块句柄常用于找Magic Jump,破解加密的IAT2.GetCurrentThreadId获取当前线程一个唯一的线程标识符常用于寻找OEP3. CreateFile这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台常用于程序自校验4.SetWindowText设置窗口的标题文字或控件的内容(在vb里使用:针对vb窗体,应使用caption或text属性)5.VirtualAlloc VirtualFree内存的分配与释放6.bp OpenMutexA双进程转单进程7.LoadLibraryA (用于找Magic Jump)8.he OutputDebugStringA断下后,选中%s%之类的字符,点右键->二进制->使用00填充 常用于 避开Anti ,OD的字符串泄漏漏洞字符串bp GetDlgItemTextA(W) ****bp GetDlgItemIntbp GetWindowTextA(W) ****bp GetWindowWordbmsg XXXX wm_gettext对话框bp MessageBeepbp MessageBoxA(W) ****bp MessageBoxExA(W)bp DialogBoxParamA(W)bp GreateWindowExA(W)bp ShowWindowbp UpdateWindowbmsg XXXX wm_command对于VB的程序用bp MessageBoxA是无法断下来的,bp rtcMsgBox注册表相关bp RegCreateKeyA(W)bp RegDeleteKeyA(W)bp RegQueryValueA(W)bp RegCloseKeybp RegOpenKeyA(W) ****bp RegOpenKeyExA **** 一种不行用另一种时间相关bp GetLocalTimebp GetFileTimebp GetSystemtimeCD-ROM或磁盘相关bp GetFileAttributesA(W) bp GetFileSizebp GetDriveTypebp GetLastErrorbp ReadFilebpio -h (CD-ROM端口地址) R软件狗bpio -h 278Rbpio -h 378RINI初始化文件相关bp GetPrivateProfileStringA **** bp GetPrivateProfileIntbp WritePrivateProfileStringbp WritePrivateProfileInt文件访问相关bp ReadFilebp WriteFilebp CreateFileA ****bp SetFilePointerbp GetSystemDirectory参考自:标 题: 笑解 API 函数 -- API 绝密档案系列之一作 者: gzgzlxg时 间: 2006-03-01 07:14链 接: /showthread.php?threadid=21959详细信息:1. HMODULE GetModuleHandle(LPCTSTR lpModuleName // address of module name to return handle// for);GetModuleHandle 实际上分为两个函数GetModuleHandleA--处理 Ansi 字符串GetModuleHandleW--处理 Unicode 字符串其实真正干活的函数是,GetModuleHandleW (指NT以后的系统),GetModuleHandleA 只不过将用户输入的 Ansi 字符串转成 Unicode 字符串然后就直接调用 GetModuleHandleW,所以在 OD 中如果下断拦截这个函数,直接拦截 GetModuleHandleW 就可以了,保险一个都跑不掉。
OD各种编程语言查找按钮事件
一、VB程序其实,VB的按纽事件的找法是最为普遍的,也就是大家所谓的万能断点.其实也不仅仅是针对按纽事件,还有很多其他的用处,如取消NAG,启动框,灰色按纽或隐藏按纽,启动时的timer事件等等,具体的就自己去总结吧,这里只演示按纽事件!OD载入后,CTRL+B,816C24确定后,就会来到下图处:然后,就在下面的JMP处F2下断,下完后CTRL+L,如果还有,就继续下断点.下完断点后,运行程序,点击相应的按纽,OD就会断下来了下面的任务就是考验大家的耐心,F8跟踪吧,不再赘述了.当然,为了方便大家,可以写个简单的脚本,免的每次都去手动设置了,节省时间: 复制内容到剪贴板代码:var Addrmov Addr,401000loop:find Addr,#816C2404??000000#cmp $RESULT,0je Exitadd $RESULT,08bp $RESULTadd $RESULT,1mov Addr,$RESULTjmp loopExit:eval "按纽事件查找完毕!"msg $RESULTret二、Delphi和BC++程序Delphi和BC++都是同一公司开发的,故查找方法都一样,当然你也可以使用DEDE.OD载入后,CTRL+G,转到00401000处然后就CTRL+B,查找特征码740E8BD38B83????????FF93????????然后就会找到下面的地方:然后就在下面的CALL处下断吧.下面的工作就是不断的CTRL+L继续查找和F2下断了.运行下看看效果吧:看,断下了吧,下面就F7跟进这个CALL吧,就来到这个按纽事件处了.同样写个脚本,方便大家操作: 复制内容到剪贴板代码:var Addrmov Addr,401000loop:find Addr,#740E8BD38B83????????FF93????????#cmp $RESULT,0je Exitadd $RESULT,0Abp $RESULTadd $RESULT,1mov Addr,$RESULTjmp loopExit:ret三、易语言易语言的这种查找方法,同样适合有壳的程序,其他的就必须脱壳后再继续操作了. OD载入后,就F9运行程序吧,当程序运行后,ALT+E选中易语言的核心库krnln,双击进去然后CTRL+B,查找FF 55 FC查找到的这个CALL就是了,F2下断吧现在输入必须的内容后,单击对应的按纽吧看,断下了吧,下面就F7跟进吧,就来到按纽事件处了同样,写个脚本,方便大家复制内容到剪贴板代码:gpa"GetProcessHeap","kernel32.dll"cmp $RESULT,0je errbp $RESULTrunrunrunbc $RESULTrtufind 10001000,#FF55FC5F5E895D??8945#bp $RESULTfind eip,#FFE0#cmp$RESULT,0je errbp $RESULTrunbc $RESULTstoMSG "按纽事件查找完毕!"reterr:MSG "脚本运行错误!请检查错误后再继续运行脚本!" ret四、VC++程序(非MFC程序)OD载入后,单击鼠标右键,选择"查找",然后是"所有命令" 在弹出的输入框里,写入特征代码"sub eax,0a"10.GIF (7 KB)2008-9-14 12:02确定后,就来到下面的窗口在下面的sub eax,0A处,双击进去吧:12.GIF (16 KB)2008-9-14 12:02来找这里后,在下面的je处跟随过去跟随来到的这个CALL,就是了,F2下断吧然后断下后,F7跟进,F8几次,就来到按纽事件了.五、MFC类程序当然判断MFC和非MFC的程序,靠大家自己去判断了OD载入后.ALT+E,来到可执行模块,找MFC的核心DLL:MFC42然后就双击进去然后就CTRL+F,查找特征代码:sub eax,0a同样,找到后,就在下面的je处跟随,跟随后看到的CALL,就是那个关键CALL了!断下后F7跟进,F8几次,就会来到按纽事件代码处了!方法就简单的介绍到这里了,当然只是抛砖引玉,其他的,还得多靠大家自己慢慢总结吧! 附件。
OD断点
大多数壳都有一个共同的特点。
在壳准备开始解压时都要执行PUSHAD,当壳解压完时都要调用POPAD。
到底PUSHAD和POPAD 是什么干什么用的呢?其实PUSHAD是用来将所有普通寄存器顺序进栈的指令,POPAD 是所有普通寄存器顺序出栈指令。
POPAD 的出栈顺序和PUSHAD相反。
壳为了保护寄存器,便在解压前将所有寄存器进栈保护起来,当解压完成后又将寄存器出栈,恢复其原貌,并将IP设置为原程序的OEP。
这样我们就可以通过这个特点快速脱掉多种软件的壳。
32位程序级的调试器--ollyDbg,这个东东操作简便,提示信息量大,介绍一些简单的操作快捷键:F3,装入程序F8,单步执行,不进入callF9 (运行)F7,单步执行,进入callCTRL+F9,相当于trw2000的F12ALT+F9,相关于trw2000的pmodule F2,设置断点(相当于trw2000的F9)CTRL+N(当前模块中的名称)F12(暂定)CTRL+F12(重新运行)CTRL+F11(跟踪进入)CTRL+T(设置条件)CTRL+F7(自动步入)CTRL+F8(自动步过)CTRL+F9(执行到返回)另转的快捷键使用方法如下OllyDbg 常用快捷热键聆风听雨整理==================================== ===========================打开一个新的可执行程序 (F3)重新运行当前调试的程序 (Ctrl+F2)当前调试的程序 (Alt+F2)运行选定的程序进行调试 (F9)暂时停止被调试程序的执行 (F12)单步进入被调试程序的 Call 中 (F7) 步过被调试程序的 Call (F8)跟入被调试程序的 Call 中 (Ctrl+F11) 跟踪时跳过被调试程序的 Call(Ctrl+F12)执行直到返回 (Ctrl+F9) 显示记录窗口 (Alt+L)显示模块窗口 (Alt+E)显示内存窗口 (Alt+M)显示 CPU 窗口 (Alt+C)显示补丁窗口 (Ctrl+P)显示呼叫堆栈 (Alt+K)显示断点窗口 (Alt+B)打开调试选项窗口 (Alt+O)窗口:左上:代码区左下:内存数据右上:寄存器右下:stack区以下命令适用于 OllyDbg 的快捷命令栏插件(显示于程序的状态栏上方)==================================== ====================CALC判断表达式WATCH添加监视表达式AT / FOLLOW Disassemble at address 在地址进行反汇编orIGDisassemble at EIP反汇编于 EIPDUMPDump at address在地址转存DADump as disassembly转存为反汇编代码DBDump in hex byte format 转存在十六进制字节格式DCDump in ASCII format转存在 ASCII 格式DDDump in stack format转存在堆栈格式DUDump in UNICODE format 转存在 UNICODE 格式DWDump in hex word format 转存在十六进制字词格式STKGo to address in stack 前往堆栈中的地址AS + 地址 + 字符串Assemble at address 在地址进行汇编L + 地址 + 字符串Label at address在地址进行标号C + 地址 + 字符串Comment at address 在地址进行注释BPBreak with condition 使用条件中断BPXBreak on all calls 中断在全部调用Delete break on all calls 清除位于全部调用的断点BCDelete breakpoint清除断点MRMemory breakpt on access 内存断点于访问时MWMemory breakpt on write 内存断点于写入时MDRemove memory breakpoint 清除内存断点HW break on access硬件中断在访问HWHW break on write硬件中断在写入HEHW break on execution 硬件中断在执行HDRemove HW breakpoint 清除硬件断点STOPPause execution暂停执行PAUSEPAUSERUNRun program运行程序Run till address运行到地址GERun and pass exception 运行和通过例外SIStep into步入SOStep over步过TITrace in till address跟踪进入直到地址TOTrace over till address 跟踪步过直到地址TCTrace in till condition 跟踪进入直到条件TOCTrace over till condition 跟踪步过直到条件TRTill return直到返回TUTill user code直到用户代码LOGView Log window查看记录窗口MODView Modules window 查看模块窗口MEMView Memory window 查看内存窗口CPUView CPU window查看 CPU 窗口CSView Call Stack查看 Call 堆栈BRKView Breakpoints window 查看断点窗口OPTOpen Options打开选项EXIT / QUITQuit OllyDbg退出 OllyDbgOPENOpen executable file打开可执行文件CLOSEClose executable关闭程序RSTRestart current program恢复当前程序HELPHelp on API functionAPI 函数的帮助ASMAssemble (if command needs it's own addres, \"ASM COMMAND;ADDRESS\") 汇编 (如果命令需要自身的地址 \"ASM COMMAND;ADDRESS\")DASMDisassemble immediate opcode反汇编直接的机器码FRFind reference to selected command/address查找参考到选定的命令/地址ACAnalyse code分析代码SNSearch for Name(label) in current module在当前模块中搜索名称(标号)SOBScan object files扫描项目文件Name: ollydbg 命令行帮助文件.rar Size: 6071 B此文件的引用地址为:up/1141912360.rarName: OllyDbg-script v1.081命令中文解说.rar Size: 219473 B此文件的引用地址为:up/1141912390.rar一、Ollydbg 中断方法Quote:originally posted by dong at 2004-6-1 10:29 PM:我问个问题在od中怎么下断点呢??现在有的程序一点注册就没反映了这样的怎么下断点呢??能介绍下什么情况下什么断点吗?在转存中下硬件访问->Word"断点,下断之后,怎么取消!9398944(老菜鸟) 11:09:59alt+D 按H 然后删除这个没有万能的方法,只能视具体情况而定,就我的经验而言:第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如“未注册”,“已注册”等等之类的,都可用做断点的。
od使用教程
od使用教程
使用开发者工具(OD)可以帮助开发人员调试和测试应用程序。
下面是一些OD的常用功能和使用方法的教程:
1. 查看控制台输出信息:在OD中打开开发者工具控制台,可以查看应用程序输出的日志、错误和警告信息。
2. 调试JavaScript代码:在OD的“Sources”选项卡中,可以查看和编辑应用程序的JavaScript代码。
可以通过在代码中设置断点,并使用“Step Over”、“Step Into”和“Step Out”等按钮来逐行执行代码。
3. 检查和修改样式:在OD的“Elements”选项卡中,可以查看和修改应用程序的HTML和CSS样式。
可以在“Elements”面板中选择元素,并在“Styles”面板中编辑其样式。
4. 模拟设备和网络:在OD的“Device Mode”选项卡中,可以模拟不同的设备类型和网络条件,以确保应用程序在不同环境下的表现。
5. 监测网络请求:在OD的“Network”选项卡中,可以查看应用程序发送和接收的网络请求。
可以查看请求的详细信息,如请求头、请求参数和响应状态。
6. 性能分析:在OD的“Performance”选项卡中,可以进行应用程序的性能分析。
可以查看页面加载时间、资源占用和函数执行时间等。
这些是OD的一些常用功能和使用方法的简要介绍。
希望对你有帮助!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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操作(菜单点击, 按钮点击)得到子窗体的消息处理过程.。