OD常用断点表

合集下载

od 加密函数断点

od 加密函数断点

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

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

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

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

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

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

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

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之常用命令

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断点等熟悉了再补充。

ollydbg破解教学之万能断点篇

ollydbg破解教学之万能断点篇

ollydbg破解教学之万能断点篇有的只是OD不能下万能断点的断⾔,⼀时⼼恢之极,可是我原来⽤TRW和SICE⽤的挺好,谁知系统⼜跟我闹⽭盾,⼀⽤TRW和SICE就死机,没办法我现在只能⽤OD,我写的⼀些破解⽂章都是⽤OD破的,反复试验,我终于发现OD也能下万能断点,在我以前写的⼀些⽂章中好象有⼀篇简单提到过,但没有说的很详细,这次静下⼼,想写⼀点东西,送给我⼼爱的组织DFCG吧,我的破解是从DFCG组织起步的,很感谢DFCG的⾼⼿们的帮助,在此说声谢谢!为了更明确,这次破解所使⽤的调试器OD是从看雪论坛临时下载的OD1.09的汉化版,没有使⽤我⾃⼰⼿头经过改造的OD,在此也感谢看雪论坛,这⾥真的有很多⾼⼿,在这个论坛我也学到了很多.这次破解的对象是超级XX王,为保护国产软件我隐去了软件相关信息,我不想给⾃⼰带来⿇烦,现在⼯作很忙,能少⼀点⿇烦就尽量少⼀点吧.破解作者yzez[DFCG]破解⼯具ollydbg汉化版,下载https:///softs/58565.html破解⽬的本不为破解⽽破解,只因为技术⽽破解破解环境WINDOWS XP,这个我已经在98和XP下各做了两次,贴图和我这篇⽂章是在XP系统下完成的.破解过程1.检查了⼀下,该程序⽆壳,C++编译,⽤W32DSM反汇编⼀堆乱码,我倒!那就动态调试吧!⽤ollydbg1.09载⼊程序,这次我将教你们如何⽤OD下万能断点,过程我尽可能详细⼀点,下⾯请看.载⼊程序选OD菜单栏上的插件-----命令⾏(快捷键是ALT+F1),在弹出的窗⼝中输⼊万能断点命令:bpx hmemcpy,按ENTER键,结果⼜出现⼀个对话框:Intermodular calls00401164 CALL DWORD PTR DS:[<&USER32.GetWindowRect>] USER32.GetWindowRect0040118F CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect00401279 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect004013E1 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect0040190A CALL DWORD PTR DS:[<&KERNEL32.GetThreadLocale>] kernel32.GetThreadLocale0040191C CALL DWORD PTR DS:[<&KERNEL32.GetLocaleInfoA>] kernel32.GetLocaleInfoA还有很多,我就省略了,在这个框⾥右键单击,出现⼀个对话框,选中在每个命令中设置断点(热键是S),单击,你看每⼀⾏都变成了红⾊吧,这表⽰全部设下断点了,后⾯的过程很烦燥,你要⼀边按F9,边按F2把⼀些⽆⽤的断点去掉,有⼀点耐⼼吧,当然也可以不这样做,但遇到断点跳不过的时候,你就得按F2把这个断点去掉.感觉在这⼀点上OD⽐不上TRW和SICE,到出现注册信息框后,你要输⼊注册信息,然后按确定,程序被断下来,我的序列号是:GK342QZ0C6RE03L,我输⼊试验码:123456789098765.程序中断在下⾯:00471F71 CALL DWORD PTR DS:[<&USER32.GetWindowTex>****按确定后回到OD程序中断在此,按F8⾛,在此还没有到关键处!*****************************************************注意这⾥会循环两次,分别处理序列号和试验码,按F8⾛00471F77 LEA ECX,DWORD PTR DS:[EAX+1]00471F7A PUSH ECX00471F7B MOV ECX,DWORD PTR SS:[EBP+10]00471F7E PUSH EAX00471F7F CALL SuperPIM.0043E15D00471F84 PUSH EAX00471F85 PUSH ESI00471F86 CALL DWORD PTR DS:[<&USER32.GetWindowTex>00471F8C MOV ECX,DWORD PTR SS:[EBP+10]00471F8F PUSH -100471F91 CALL SuperPIM.00401D6A00471F96 JMP SHORT SuperPIM.00471FA300471F98 MOV EAX,DWORD PTR SS:[EBP+10]00471F9B PUSH DWORD PTR DS:[EAX]00471F9D PUSH ESI00471F9E CALL SuperPIM.00470B6100471FA4 POP ESI00471FA5 POP EBP00471FA6 RETN 0C*************************************程序第⼆次循环后最后会返回到0040FE99下⾯看代码:----------------------------------------------------------------------------------------------------------0040FE99 LEA EAX,DWORD PTR SS:[EBP-14]****第⼆次循环后会返回到这⾥,注意这就是我们要找的关键地⽅,按F8往下!0040FE9C PUSH EAX0040FE9D CALL SuperPIM.00433D92***********这就是关键CALL,按F7追进,⼀定要进,因为算法就在这⾥⾯!0040FEA2 POP ECX0040FEA3 AND DWORD PTR SS:[EBP-4],00040FEA7 LEA ESI,DWORD PTR DS:[EDI+74]0040FEAA MOV EAX,DWORD PTR DS:[ESI]******试验码⼊EAX0040FEAC CMP DWORD PTR DS:[EAX-C],0******⽐较试验码输⼊了吗?0040FEB0 JE SHORT SuperPIM.0040FF2F******没有输⼊就跳⾛,⼀跳就失败!0040FEB2 PUSH 280040FEB4 LEA EAX,DWORD PTR SS:[EBP-18]0040FEB7 PUSH ESI0040FEB8 PUSH EAX0040FEB9 CALL SuperPIM.0042CEC8**********此CALL对输⼊的注册码进⾏处理,得到⼀个40位的长字符串,有兴趣⾃⼰跟,******************************************我已是头晕的很,不想跟进!0040FEBE LEA ECX,DWORD PTR SS:[EBP-14]0040FEC1 PUSH ECX0040FEC2 PUSH EAX0040FEC3 CALL SuperPIM.0040F9B7**********此CALL对序列号处理,也是得到⼀个40位的长字符串0040FEC8 MOV ECX,DWORD PTR SS:[EBP-18]0040FECB ADD ESP,140040FECE ADD ECX,-100040FED1 MOV BYTE PTR SS:[EBP-D],AL0040FED4 CALL SuperPIM.00401B5D**********此CALL进⾏⽐较,注册码不对,值为00040FED9 CMP BYTE PTR SS:[EBP-D],0*******⽐较是0吗?0040FEDD JE SHORT SuperPIM.0040FF2F******相等就跳,跳就失败,所以⼀定不能跳!0040FEDF PUSH 0**************************不跳往下你就成功了!下⾯代码省略! ...............................................................省略若⼲代码!.........................============================================================================================================= ************************************关键CALL的代码!*******************************************************00433D92 MOV EAX, SuperPIM.0049844E****追进关键CALL后我们来到这⾥!00433D97 CALL SuperPIM.0045090000433D9C PUSH ECX00433D9D PUSH ECX00433D9E AND [LOCAL.5], 000433DA2 LEA EAX, [LOCAL.5]00433DA5 PUSH EAX00433DA6 CALL SuperPIM.00433CA9********此CALL根据电脑硬件信息得到你的序列号,有兴趣跟吧!我是没有兴趣!00433DAB AND [LOCAL.1], 000433DAF PUSH 1400433DB1 LEA EAX, [LOCAL.5]00433DB4 PUSH EAX00433DB5 LEA EAX, [LOCAL.4]00433DB8 PUSH EAX00433DB9 CALL SuperPIM.0042CEC8*******算法CALL(1),按F7跟进!00433DBE PUSH 2800433DC0 LEA EAX, [LOCAL.4]00433DC3 PUSH EAX00433DC4 PUSH [ARG.1]00433DC7 MOV BYTE PTR SS:[EBP-4], 100433DCB CALL SuperPIM.0042CEC800433DD0 MOV ECX, [LOCAL.4]00433DD3 ADD ESP, 1C00433DD6 ADD ECX, -10*****************************省略N⾏代码!********************************************************0043454B RETN=========================================================================================================== ***********************************算法CALL!*********************************************************0042CEC8 MOV EAX, SuperPIM.00497B52********追进算法CALL我们在这⾥!0042CECD CALL SuperPIM.004509000042CED2 SUB ESP, 140042CED5 PUSH EBX0042CED6 PUSH ESI0042CED7 XOR EBX, EBX0042CED9 PUSH EDI0042CEDA MOV [LOCAL.8], EBX0042CEDD CALL SuperPIM.004639B50042CEE2 MOV EDX, DWORD PTR DS:[EAX]0042CEE4 MOV ECX, EAX0042CEE6 CALL DWORD PTR DS:[EDX+C]0042CEE9 LEA EDI, DWORD PTR DS:[EAX+10]0042CEEC MOV [LOCAL.4], EDI0042CEEF MOV EAX, [ARG.2]0042CEF2 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L移⼊EAX0042CEF4 MOV ESI, DWORD PTR DS:[EAX-C]*****序列号的位数15(⼗六进制值是F)送⼊ESI0042CEF7 CMP ESI, EBX**********************⽐较ESI和EBX,ESI的值是F即序列号位数,EBX的初始值是00042CEF9 MOV [LOCAL.1], EBX0042CEFC MOV [LOCAL.8], ESI0042CEFF JE SuperPIM.0042CFB2*************相等就跳,这⾥当然不相等,所以就不会跳!0042CF05 MOV EAX, [ARG.3]******************常数14(⼗进制值是20)送⼊EAX0042CF08 CMP EAX, ESI**********************⽐较EAX和ESI,即14和F⽐较!0042CF0A MOV [LOCAL.6], EAX0042CF0D JG SHORT SuperPIM.0042CF12*******⼤于就跳!0042CF0F MOV [LOCAL.6], ESI0042CF12 CMP [LOCAL.6], EBX****************跳到这⾥!⽐较14和00042CF15 JLE SuperPIM.0042CFB2*************⼩于就跳,这⾥当然不会⼩!所以不跳!0042CF1B MOV EAX, EBX**********************0移⼊EAX0042CF1D CDQ***********************************EDX清0,准备计算!0042CF1E IDIV ESI***************************除,EAX/ESI ,EAX的值是0,ESI的值存放序列号的位数F0042CF20 MOV EAX, [ARG.2]******************赋EAX地址值0042CF23 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L移⼊EAX0042CF25 PUSH EBX***************************EBX⼊栈0042CF26 MOV AL, BYTE PTR DS:[EDX+EAX]*****序列号的第⼀位G(ASCII码值47)⼊AL0042CF29 MOV BYTE PTR SS:[EBP-1C], AL******保存值470042CF2C PUSH [LOCAL.7]0042CF2F CALL SuperPIM.0042CD8E*************算法CALL(2),按F7跟进!代码直接在下⾯给出============================================================================================================== ***************************算法CALL(2)*****************************************************0042CD8E PUSH EBP0042CD8F MOV EBP, ESP0042CD91 PUSH ECX*************************G的ASCII码值47⼊ECX0042CD92 MOVZX EAX, BYTE PTR SS:[EBP+8]****扩展成000000470042CD96 MOV ECX, [ARG.2]****************赋ECX的初始值为00042CD99 MOV [LOCAL.1], EAX0042CD9C MOV EAX, ECX********************ECX的值移⼊EAX0042CD9E IMUL EAX, ECX********************EAX=EAX*ECX=0*00042CDA1 LEA EAX, DWORD PTR DS:[EAX+EAX*2+7]**EAX+EAX*2+7的值7给EAX0042CDA5 IMUL EAX, ECX********************EAX=EAX*ECX=7*00042CDA8 ADD EAX, 0D*********************EAX=EAX+0D=D0042CDAB IMUL EAX, ECX********************EAX=EAX*ECX=D*0=00042CDAE PUSH ESI*************************序列号位数F⼊栈!0042CDAF LEA ESI, DWORD PTR DS:[ECX+5]0042CDB2 PUSH ESI0042CDB3 MOV [ARG.1], EAX0042CDB6 LEA EAX, [ARG.1]0042CDB9 PUSH 40042CDBB PUSH EAX0042CDBC CALL SuperPIM.0042CD2E***********这个CALL也在计算,我实在不想跟进!0042CDC1 PUSH ESI0042CDC2 LEA EAX, [LOCAL.1]0042CDC5 PUSH 40042CDC7 PUSH EAX0042CDC8 CALL SuperPIM.0042CD5E**********这个CALL也是计算CALL,烦!不跟了!0042CDCD MOV EAX, [ARG.1]0042CDD0 ADD ESP, 180042CDD3 XOR EAX, [LOCAL.1]*************这⾥赋EAX的值380000020042CDD6 POP ESI0042CDD7 LEAVE0042CDD8 RETN=========================================================================算法CALL(2)结束================== 0042CF34 POP ECX0042CF35 POP ECX0042CF36 PUSH 2B***************************常数2B⼊栈!0042CF38 XOR EDX, EDX0042CF3A POP ECX**************************把常数2B赋给ECX0042CF3B DIV ECX**************************除,EAX/ECX=38000002/2B=014D6535,余数1B⼊EDX0042CF3D MOV ECX, EDX*********************结果1B⼊ECX0042CF3F ADD CL, 30***********************CL=CL+30=1B+30=4B(对应的字符串是K)0042CF42 CMP CL, 39***********************⽐较是不是数字90042CF45 MOV BYTE PTR SS:[EBP-14], CL*****保存字符串K0042CF48 JLE SHORT SuperPIM.0042CF55******⼩于就跳⾛!0042CF4A CMP CL, 41***********************⽐较是不是A0042CF4D JGE SHORT SuperPIM.0042CF55******⼤于就跳⾛0042CF4F ADD CL, 0F60042CF52 MOV BYTE PTR SS:[EBP-14], CL0042CF55 CMP EBX, [ARG.3]*****************跳到这⾥!⽐较0和140042CF58 JGE SHORT SuperPIM.0042CF67******⼤于等于就跳⾛!0042CF5A PUSH [LOCAL.5]0042CF5D LEA ECX, [LOCAL.4]0042CF60 CALL SuperPIM.00417EAF0042CF65 JMP SHORT SuperPIM.0042CFA5******⽆条件跳0042CF67 MOV EAX, EBX0042CF69 CDQ0042CF6A IDIV [ARG.3]0042CF6D MOVSX ECX, CL0042CF70 PUSH 2B0042CF72 MOV ESI, EDX0042CF74 MOVSX EAX, BYTE PTR DS:[ESI+EDI]0042CF78 LEA EAX, DWORD PTR DS:[EAX+ECX-60]0042CF7C CDQ0042CF7D POP ECX0042CF7E IDIV ECX0042CF80 ADD DL, 300042CF83 CMP DL, 390042CF86 MOV BYTE PTR SS:[EBP-14], DL0042CF89 JLE SHORT SuperPIM.0042CF960042CF8B CMP DL, 410042CF8E JGE SHORT SuperPIM.0042CF960042CF90 ADD DL, 0F60042CF93 MOV BYTE PTR SS:[EBP-14], DL0042CF96 PUSH [LOCAL.5]0042CF99 LEA ECX, [LOCAL.4]0042CF9C PUSH ESI0042CF9D CALL SuperPIM.0042CE4B0042CFA2 MOV ESI, [LOCAL.8]0042CFA5 MOV EDI, [LOCAL.4]***************上⾯跳到这⾥!0042CFA8 INC EBX*************************EBX加10042CFA9 CMP EBX, [LOCAL.6]**************⽐较1和140042CFAC JL SuperPIM.0042CF1B***********⼩于就跳,循环,序列号只有15位,这⾥循环20次,取完后⼜从第⼀位取出! ************************************循环结束后得到的值是:K3L2LPBDW1F2H4B8S0UY这就是我们要的注册码!0042CFB2 MOV ECX, [ARG.1]0042CFB5 LEA EAX, [LOCAL.4]0042CFB8 PUSH EAX0042CFB9 CALL SuperPIM.00401F360042CFBE LEA ECX, DWORD PTR DS:[EDI-10]0042CFC1 CALL SuperPIM.00401B5D0042CFC6 MOV ECX, [LOCAL.3]0042CFC9 MOV EAX, [ARG.1]0042CFCC POP EDI0042CFCD POP ESI0042CFCE POP EBX0042CFCF MOV DWORD PTR FS:[0], ECX0042CFD6 LEAVE0042CFD7 RETN写这篇⽂章的⽬的是想说明如何在OD下万能断点,算法过程太烦琐,就不想多跟了!希望能对⼤家有点启发,如果觉得这篇破⽂还⾏帮我顶⼀下吧!也是希望有更多的⼈能看到,对更多的⼈有益,我也是⼀只菜鸟,请⼤家多多指点!。

OD下断点的方法

OD下断点的方法

OD下断点‎的方法‎寻常断点‎O llyd‎b g中一般‎下中断的方‎法,就是在‎程序的地址‎处用鼠标选‎择这一行。

‎然后按F2‎键,这时被‎选择的那一‎行的地址会‎变成别的颜‎色,就表示‎这个地址处‎下了中断。

‎然后运行程‎序时只有到‎这个地址处‎就会被Ol‎l ydbg‎中断。

‎这个方法用‎的比较多,‎所以把他称‎作寻常断点‎。

如果‎有命令行插‎件,就可以‎在命令窗口‎中输入BP‎X xxx‎x xxxx‎下断点。

‎优点:‎只要自己怀‎疑是重要的‎代码处都可‎以下这种下‎断点,不受‎条件的限制‎,所以方便‎实用。

‎缺点:如果‎不知道代码‎功能下断点‎具有盲目性‎。

A‎P I断点‎O llyd‎b g中一般‎下API中‎断的方法,‎有二种。

‎1. ‎在代码窗口‎中点鼠标右‎键,出现功‎能菜单。

在‎[搜索]选‎择项下有〔‎当前模块的‎名称〕和〔‎全部模块的‎名称〕俩项‎,选择其中‎的一项就打‎开了程序调‎用 API‎的窗口,在‎这个窗口中‎选择你要跟‎踪的API‎函数名。

双‎击这个函数‎就能到程序‎的调用地址‎处。

然后用‎F2下中断‎。

也可以在‎A PI窗口‎中选择需要‎跟踪的函‎数点鼠标右‎键出现功能‎菜单,选择‎〔在每个参‎考设置断点‎〕。

同样下‎了断点。

‎‎‎‎‎‎‎‎快捷‎方式:Ct‎r l+N ‎2. ‎在命令行窗‎口中输入B‎P X A‎P I函数名‎或者BP ‎API函‎数名后回‎车。

这时出‎现了所有调‎用这个函数‎的地址的窗‎口,在这个‎窗口中可以‎看到调用这‎个API函‎数的地址已‎改变了颜色‎。

说明下好‎了断点。

‎说明一下‎:BPX一‎般中断在程‎序调用AP‎I的地址处‎。

BP会中‎断在API‎的写入地址‎处。

二这有‎所不同,根‎据需要选择‎。

‎优点:这‎种方法下的‎断点是针对‎每一个AP‎I函数的,‎所以具有明‎确的目的。

‎‎缺点:关键‎的API函‎数不容易找‎到。

所以有‎时下的断点‎没有作用。

od 硬件条件断点

od 硬件条件断点

od 硬件条件断点
OD (OllyDbg) 是一款用于调试二进制应用程序的工具,它可
以在执行程序时设置断点并检查程序的状态。

要在OD中设置硬件条件断点,你需要遵循以下步骤:
1. 打开OllyDbg,并加载要调试的二进制程序。

2. 找到你想要设置断点的位置。

这可以是一个特定的内存地址,也可以是程序中的某个函数。

3. 在OllyDbg的菜单栏上选择 "Breakpoints" > "Hardware breakpoints"。

4. 在 "Hardware breakpoints" 窗口中,点击 "New" 按钮。

5. 在弹出的窗口中,选择 "Condition" 选项卡。

6. 在 "Condition" 选项卡中,输入你想要设置的条件,例如要
求寄存器的值等于某个特定值。

7. 点击 "OK" 按钮保存设置。

8. 回到主OllyDbg窗口,你将看到硬件条件断点已添加到"Browse breakpoints" 窗口中。

9. 启动程序,并当程序执行到设置的断点位置时,程序会停止执行并等待你进一步调试。

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

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

常用断点

常用断点
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
拦截驱动器:
bp GetDriveTypeA 获取磁盘驱动器类型
bp GetLogicalDrives 获取逻辑驱动器符号
bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径
★★VB程序专用断点★★
bp __vbaStrCmp 比较字符串是否相等
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
6
mov eax [ ]
mov edx [ ]
call 00??????
test eax eax
setz (setnz) bl,cl…
7
call 00?????? ***
push eax (ebx,ecx…)
POPD 32位标志出栈.
二、算术运算指令
───────────────────────────────────────
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.

od常用下断api

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

OD断点

大多数壳都有一个共同的特点。

在壳准备开始解压时都要执行PUSHAD,当壳解压完时都要调用POPAD。

到底PUSHAD和POPAD 是什么干什么用的呢?其实PUSHAD是用来将所有普通寄存器顺序进栈的指令,POPAD 是所有普通寄存器顺序出栈指令。

POPAD 的出栈顺序和PUSHAD相反。

壳为了保护寄存器,便在解压前将所有寄存器进栈保护起来,当解压完成后又将寄存器出栈,恢复其原貌,并将IP设置为原程序的OEP。

这样我们就可以通过这个特点快速脱掉多种软件的壳。

32位程序级的调试器--ollyDbg,这个东东操作简便,提示信息量大,介绍一些简单的操作快捷键:F3,装入程序F8,单步执行,不进入callF9 (运行)F7,单步执行,进入callCTRL+F9,相当于trw2000的F12ALT+F9,相关于trw2000的pmodule F2,设置断点(相当于trw2000的F9)CTRL+N(当前模块中的名称)F12(暂定)CTRL+F12(重新运行)CTRL+F11(跟踪进入)CTRL+T(设置条件)CTRL+F7(自动步入)CTRL+F8(自动步过)CTRL+F9(执行到返回)另转的快捷键使用方法如下OllyDbg 常用快捷热键聆风听雨整理==================================== ===========================打开一个新的可执行程序 (F3)重新运行当前调试的程序 (Ctrl+F2)当前调试的程序 (Alt+F2)运行选定的程序进行调试 (F9)暂时停止被调试程序的执行 (F12)单步进入被调试程序的 Call 中 (F7) 步过被调试程序的 Call (F8)跟入被调试程序的 Call 中 (Ctrl+F11) 跟踪时跳过被调试程序的 Call(Ctrl+F12)执行直到返回 (Ctrl+F9) 显示记录窗口 (Alt+L)显示模块窗口 (Alt+E)显示内存窗口 (Alt+M)显示 CPU 窗口 (Alt+C)显示补丁窗口 (Ctrl+P)显示呼叫堆栈 (Alt+K)显示断点窗口 (Alt+B)打开调试选项窗口 (Alt+O)窗口:左上:代码区左下:内存数据右上:寄存器右下:stack区以下命令适用于 OllyDbg 的快捷命令栏插件(显示于程序的状态栏上方)==================================== ====================CALC判断表达式WATCH添加监视表达式AT / FOLLOW Disassemble at address 在地址进行反汇编orIGDisassemble at EIP反汇编于 EIPDUMPDump at address在地址转存DADump as disassembly转存为反汇编代码DBDump in hex byte format 转存在十六进制字节格式DCDump in ASCII format转存在 ASCII 格式DDDump in stack format转存在堆栈格式DUDump in UNICODE format 转存在 UNICODE 格式DWDump in hex word format 转存在十六进制字词格式STKGo to address in stack 前往堆栈中的地址AS + 地址 + 字符串Assemble at address 在地址进行汇编L + 地址 + 字符串Label at address在地址进行标号C + 地址 + 字符串Comment at address 在地址进行注释BPBreak with condition 使用条件中断BPXBreak on all calls 中断在全部调用Delete break on all calls 清除位于全部调用的断点BCDelete breakpoint清除断点MRMemory breakpt on access 内存断点于访问时MWMemory breakpt on write 内存断点于写入时MDRemove memory breakpoint 清除内存断点HW break on access硬件中断在访问HWHW break on write硬件中断在写入HEHW break on execution 硬件中断在执行HDRemove HW breakpoint 清除硬件断点STOPPause execution暂停执行PAUSEPAUSERUNRun program运行程序Run till address运行到地址GERun and pass exception 运行和通过例外SIStep into步入SOStep over步过TITrace in till address跟踪进入直到地址TOTrace over till address 跟踪步过直到地址TCTrace in till condition 跟踪进入直到条件TOCTrace over till condition 跟踪步过直到条件TRTill return直到返回TUTill user code直到用户代码LOGView Log window查看记录窗口MODView Modules window 查看模块窗口MEMView Memory window 查看内存窗口CPUView CPU window查看 CPU 窗口CSView Call Stack查看 Call 堆栈BRKView Breakpoints window 查看断点窗口OPTOpen Options打开选项EXIT / QUITQuit OllyDbg退出 OllyDbgOPENOpen executable file打开可执行文件CLOSEClose executable关闭程序RSTRestart current program恢复当前程序HELPHelp on API functionAPI 函数的帮助ASMAssemble (if command needs it's own addres, \"ASM COMMAND;ADDRESS\") 汇编 (如果命令需要自身的地址 \"ASM COMMAND;ADDRESS\")DASMDisassemble immediate opcode反汇编直接的机器码FRFind reference to selected command/address查找参考到选定的命令/地址ACAnalyse code分析代码SNSearch for Name(label) in current module在当前模块中搜索名称(标号)SOBScan object files扫描项目文件Name: ollydbg 命令行帮助文件.rar Size: 6071 B此文件的引用地址为:up/1141912360.rarName: OllyDbg-script v1.081命令中文解说.rar Size: 219473 B此文件的引用地址为:up/1141912390.rar一、Ollydbg 中断方法Quote:originally posted by dong at 2004-6-1 10:29 PM:我问个问题在od中怎么下断点呢??现在有的程序一点注册就没反映了这样的怎么下断点呢??能介绍下什么情况下什么断点吗?在转存中下硬件访问->Word"断点,下断之后,怎么取消!9398944(老菜鸟) 11:09:59alt+D 按H 然后删除这个没有万能的方法,只能视具体情况而定,就我的经验而言:第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如“未注册”,“已注册”等等之类的,都可用做断点的。

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

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

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

OllyDBG分析报告系列(1)---Int3断点

OllyDBG分析报告系列(1)---Int3断点

个有机会Ollydbg(以下均简称为OD)中的Int3断点的主要功能是:在需要下断点的执行代码处将原来的代码改成0xCC,程序执行到此处后会报一个Int3异常,由OD捕获并处理。

当要执行该行代码时,将原来的代码改回来并执行,然后再恢复断点,这样就不会影响程序的正常运行了。

这里仅描述最常见的功能,其它的有兴趣的话可以分析一把。

先说明一下OD中的两个结构体,在IDA中,声明为如下格式:t_bpoint用来保存Int断点的相关信息00000000 t_bpoint struc ; (sizeof=0x11)00000000 addr dd ? ; // Address of breakpoint00000004 dummy dd ? ; // Always 100000008 type dd ? ; // Type of breakpoint, TY_xxx0000000C cmd db ? ; // Old value of command0000000D passcount dd ? ; // Actual pass count00000011 t_bpoint ends其中:addr为断点的地址,dummy始终为1,type为断点的类型,cmd为要用0xCC替换的指令码,passcount为需要断下的次数,0表示每次都断下。

t_sorted结构体保存了一种有序的数据:00000000 ; Descriptor of sorted table00000000 t_sorted struc ; (sizeof=0x138)00000000 name[MAXPA TH] db 260 dup(?) ; char Name of table, as appears in error messages00000104 n dd ? ; int Actual number of entries00000108 nmax dd ? ; int Maximal number of entries0000010C selected dd ? ; int Index of selected entry or -100000110 seladdr dd ? ; ulong Base address of selected entry00000114 itemsize dd ? ; int Size of single entry00000118 version dd ? ; ulong Unique version of table0000011C data dd ? ; void* Elements, sorted by address00000120 sortfunc dd ? ; SORTFUNC Function which sorts data or NULL00000124 destfunc dd ? ; DESTFUNC Destructor function or NULL00000128 sort dd ? ; int Sorting criterium (column)0000012C sorted dd ? ; int Whether indexes are sorted00000130 index dd ? ; int Indexes, sorted by criterium00000134 suppresserr dd ? ; int Suppress multiple overflow errors00000138 t_sorted endsname是结构体的名称,用来区别不同类型的结构体n是数组元素的个数itemsize是数组元素的大小data 是指向各种数据结构数组的指针,这里使用的是int3断点,所以现在保存的是int3断点数据结构体数组的指针---------------------------------------------------------------------------------------------------------------------------------1)Int3断点的设置int3断点的设置是通过消息来处理的,对应右键点击菜单中的切换,其对应的消息为1E;此外还有热键F2、双击反汇编窗口等也能切换int3断点,转入的函数虽然不同,但是调用设置int3断点的函数都是同一个,就不再举例了。

od条件断点使用方法

od条件断点使用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

OD和IDA的使用

OD和IDA的使用

OD和IDA的使用专业:信息安全班级:0441104姓名:夏维学号:2011211830授课老师:董涛一 OD的使用1 界面构成OllyDbg发行版是一个ZIP压缩包,只要解压运行OllyDbg.exe即可。

运行OllyDbg打开进程,主窗口显示反汇编清单。

各窗口的外观属性如:“标题栏(bar)、字体(font)”等在右键菜单"界面选项(appearance)"里控制代码窗口代码窗口(OllyDbg帮助文件自称反编汇窗口)显示被调试程序的代码。

他有四个列地址/Address(虚拟地址)HEX数据/HEX dump(机器码)反汇编/Diassassembly(汇编代码)注释/Comment(注释)最后一列注释(Comment)显示相关API参数或运行简表,非常有用,有点类似于IDA Pro。

在代码窗口(地址行,不是列标题)双击时完成动作。

地址(Address)列:显示相对被双击地址的地址,再次双击返回标准地址模式;HEX数据(HEX dump)列:设置或取消无条件断点,按F2键也能设置断点;反汇编(Diassassembly)列:调试编辑器,可直接修改汇编代码;注释(Comment)列:允许增加或编辑注释。

代码窗口允许浏览、分析、搜索和修改代码,保存改变到可执行文件,设置断点等。

相关弹出式菜单包括100多项。

信息窗口(Information window)动态跟踪时,与指令相关的各寄存器的值、API函数调用提示、跳转提示等信息显示。

数据窗口以十六进制或内存方式显示文件在内容中的数据,类似于softICE的数据窗口。

要显示数据可单击右键"转到→表达式(Go to→expression)"或按Ctrl+G键打开地址窗口,输入地址。

寄存器(Registers window)显示CPU各寄存器的值,支持浮点(FPU)、MMX,3DNow!寄存器,可以单击鼠标右键切换。

使用OllyDbg从零开始Cracking 第十章-断点

使用OllyDbg从零开始Cracking 第十章-断点

第十章-断点本章将介绍各种类型的断点。

断点可以让你在程序代码执行到合适的时候暂停下来。

这次我们的实验的对象还是CrueHead’a的CrackMe。

普通断点这是一个很普通的断点,我们前面章节已经使用了。

在SoftIce中我们可以使用BPX命令来设置断点。

OD中可以使用BP命令或者F2快捷键来设置断点。

也可以再按一次F2快捷键来取消断点。

我们来到CrueHead’a的CrackMe的入口点处。

举个例子,拿401018这行来说吧,按F2键-这行就会以红色突出显示,在该地址处设置的断点就会加入了断点列表中。

我们来看看断点列表刚刚设置的断点,此时该断点是激活状态。

断点列表中Active栏显示的是Always。

在该行上单击鼠标右键会弹出一些操作断点的菜单项。

Remove:从列表中删除断点。

Disable:禁用断点但并不将断点从列表中删除。

禁用时,断点并不会触发。

Edit condition:给断点设置触发条件,我们后面再来讨论。

Follow in disassembler:在反汇编窗口中显示断点。

Disable all or enable all:禁用/启用列表中的全部断点。

这里没有启用的选项,因为列表中唯一的断点没有被禁用。

Copy to Clipboard:把选中断点的信息复制到剪贴板。

我们来实验一下。

我们选择Whole line拷贝整行,Whole Table可以拷贝整个列表的断点信息。

Breakpoints, item 0Address=00401018Module=CRACKMEActive=AlwaysDisassembly=OR EAX,EAX拷贝下来的信息显示了断点的地址,对应的指令以及激活状态。

按下F9键-CrackMe运行起来了。

然后正如猜想的一样中断了下来。

在状态栏显示暂停状态。

暂停的原因如下:我们来了解一下当设置一个断点以后,二进制代码会发生什么变化。

单击鼠标右键选择-Follow in Dump-Selection我们看看数据窗口中401018地址处的内容:我们初看一下数据窗口中的内容和反汇编代码中代码是一样的:数据窗口和反汇编代码中我们看到的都是0B C0,对应的是OR EAX,EAX。

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操作(菜单点击, 按钮点击)得到子窗体的消息处理过程.。

找万能断点方法

找万能断点方法

断点是一个信号,它通知调试器,在某个特定点上暂时将程序执行挂起。

当执行在某个断点处挂起时,我们称程序处于中断模式。

进入中断模式并不会终止或结束程序的执行。

执行可以在任何时候继续。

断点模式可以看作一种超时。

所有元素(例如,函数、变量和对象)都保留在内存中,但它们的移动和活动被挂起了。

在中断模式下,您可以检查它们的位置和状态,以查看是否存在冲突或 bug。

您可以在中断模式下对程序进行调整。

例如,可以更改变量的值。

可以移动执行点,这会改变执行恢复后将要执行的下一条语句。

在 C++、C# 和 Visual Basic 中,甚至可以在中断模式下对代码本身进行更改(使用一种称为“编辑并继续”的强大功能)。

断点提供了一种强大的工具,使您能够在需要的时间和位置挂起执行。

与逐句或逐条指令地检查代码不同的是,可以让程序一直执行,直到遇到断点,然后开始调试。

这大大地加快了调试过程。

没有这个功能,调试大的程序几乎是不可能的。

许多编程语言都有用于挂起执行并使程序进入中断模式的语句或构造。

例如,Visual Basic 有Stop语句。

断点不同于这些语句,因为它不是必须添加到程序中的实际源代码。

您不必在源代码窗口中键入断点语句。

只需通过调试器界面请求断点,由调试器加入断点。

要插入行断点,请在要设置断点的行旁边的灰色空白中单击。

利用全功能的“断点”窗口,可以处理更复杂的断点。

相对于调试构造(如 Visual Basic 的 Stop 语句),断点具有很多优点。

不必改动程序源代码就可以删除或更改断点。

由于断点不是语句,当生成程序的发行版时,它们不会产生额外的代码。

如果在程序中使用Stop语句,则需要在生成发行版本之前手动删除Stop语句,或者使用如下所示的条件句式:复制代码#If DEBUG Then Stop #End If如果想暂时禁用Stop语句,需要在源代码中找到该语句并对它进行注释:复制代码' Stop如果只有一条Stop语句,这样做当然没问题。

OD工具破解VB程序的常用断点

OD工具破解VB程序的常用断点

OD工具破解VB程序的常用断点OD工具破解VB程序的常用断点(转)-现在也流行破解常用断点设置-- 收集的精华(编缉分类好装入PYG记事本)bpx hmemcpy 破解万能断点,拦截内存拷贝动作 (注意:Win9x 专用断点,XP无效)bpx Lockmytask 当你用其它断点都无效时可以试一下,这个断点拦截按键的动作实在找不到断点可以试下面的方法:bmsg handle wm_gettext 拦截注册码(handle为对应窗口的句柄)bmsg handle wm_command 拦截OK按钮(handle为对应窗口的句柄)拦截窗口:bpx CreateWindow 创建窗口bpx CreateWindowEx(A/W) 创建窗口bpx ShowWindow 显示窗口bpx UpdateWindow 更新窗口bpx GetWindowText(A/W) 获取窗口文本拦截消息框:bpx MessageBox(A) 创建消息框bpx MessageBoxExA 创建消息框bpx MessageBoxIndirect(A) 创建定制消息框拦截警告声:bpx MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)拦截对话框:bpx DialogBox 创建模态对话框bpx DialogBoxParam(A/W) 创建模态对话框bpx DialogBoxIndirect 创建模态对话框bpx DialogBoxIndirectParam(A/W) 创建模态对话框bpx CreateDialog 创建非模态对话框bpx CreateDialogParam(A) 创建非模态对话框bpx CreateDialogIndirect 创建非模态对话框bpx CreateDialogIndirectParam(A/W) 创建非模态对话框bpx GetDlgItemText(A/W) 获取对话框文本bpx GetDlgItemInt 获取对话框整数值拦截剪贴板:bpx GetClipboardData 获取剪贴板数据拦截注册表:bpx RegOpenKey(A) 打开子健( 例:bpx RegOpenKey(A) if *(esp+8)=='****' )bpx RegOpenKeyEx 打开子健( 例:bpx RegOpenKeyEx if *(esp+8)=='****' )bpx RegQueryValue(A) 查找子健 ( 例:bpx RegQueryValue(A) if *(esp+8)=='****' )bpx RegQueryValueEx 查找子健 ( 例:bpx RegQueryValueEx if *(esp+8)=='****' )bpx RegSetValue(A) 设置子健( 例:bpx RegSetValue(A) if *(esp+8)=='****' )bpx RegSetValueEx(A) 设置子健 ( 例:bpx RegSetValueEx(A) if *(esp+8)=='****' )注意:“****”为指定子键名的前4个字符,如子键为“Regcode”,则“****”= “Regc”==================功能限制拦截断点:bpx EnableMenuItem 禁止或允许菜单项bpx EnableWindow 禁止或允许窗口bmsg hMenu wm_command 拦截菜单按键事件,其中hMenu 为菜单句柄bpx K32Thk1632Prolog 配合bmsg hMenu wm_command使用,可以通过这个断点进入菜单处理程序应用示例:CALL [KERNEL32!K32Thk1632Prolog]CALL [......] <-- 由此跟踪进入菜单处理程序CALL [KERNEL32!K32Thk1632Epilog]======================拦截时间:bpx GetLocalTime 获取本地时间bpx GetSystemTime 获取系统时间bpx GetFileTime 获取文件时间bpx GetTickCount 获得自系统成功启动以来所经历的毫秒数bpx GetCurrentTime 获取当前时间(16位)bpx SetTimer 创建定时器bpx TimerProc 定时器超时回调函数拦截文件:bpx CreateFileA 创建或打开文件 (32位)bpx OpenFile 打开文件 (32位)bpx ReadFile 读文件 (32位)bpx WriteFile 写文件 (32位)bpx _lcreat 创建或打开文件 (16位)bpx _lopen 打开文件 (16位)bpx _lread 读文件 (16位)bpx _lwrite 写文件 (16位)bpx _hread 读文件 (16位)bpx _hwrite 写文件 (16位)拦截驱动器:bpx GetDrivetype(A/W) 获取磁盘驱动器类型bpx GetLogicalDrives 获取逻辑驱动器符号bpx GetLogicalDriveStringsA(W) 获取当前所有逻辑驱动器的根驱动器路径拦截狗:bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口+++++++++++VB程序专用断点:++++++++++bp__vbaFreeStr 偶发现了VB杀手断点.不管是重起验证.还是有错误提示的VB..下这个断点通杀bpx msvbvm50!__vbaStrCmp 比较字符串是否相等bpx msvbvm50!__vbaStrComp 比较字符串是否相等bpx msvbvm50!__vbaVarTstNe 比较变量是否不相等bpx msvbvm50!__vbaVarTstEq 比较变量是否相等bpx msvbvm50!__vbaStrCopy 复制字符串bpx msvbvm50!__vbaStrMove 移动字符串bpx MultiByteT oWideChar ANSI字符串转换成Unicode字符串bpx WideCharToMultiByte Unicode字符串转换成ANSI字符串上面的断点对应VB5程序,如果是VB6程序则将msvbvm50改成msvbvm60即可VB程序的破解VB程序使很多朋友感到头痛,主要是VB程序反编译时产生大量的顶!代码,而且也找不到有用的信息,在动态调试过程中,顶!代码太多,往往迷失于冗余的代码中,找不到方向。

OD学习笔记

OD学习笔记

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

OD常用断点表

OD常用断点表

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bp ExitProcess 退出进程
DestroyWindow
mouse_event (鼠标中断)
postquitmessage (Cracking足彩xp,很有用^_^)
vb:
_rtcMsgBox
ini文件内容常用中断
GetPrivateProfileStringA
GetPrivateProfileProfileInt
葡萄虽无树,藤生棚中秧。
人处凡尘中,岂不惹尘埃?
小球[CCG]
那要看是在哪作的标记,通常是在注册表中留下信息!
在softice中就要用bpx regqueryvalueexa do "d esp->8"来中断看看,
在trw中要用bpx regqueryvalueexa do "d*(esp+8)"来中断看看。
bp OpenFile 打开文件 (32位)
bp ReadFile 读文件 (32位)
bp WriteFile 写文件 (32位)
GetModuleFileNameA
GetFileSize
Setfilepointer
fileopen
FindFirstFileA
ReadFile
OD常用断点表
常用断点(OD中)
拦截发包函数
bp send
bp WSASend
bp sendto
bp WSASendto
收包 拦截
bp recv
bp WSARecv
bp recvform
bp WSARecvform
拦截窗口:
bp CreateWindow 创建窗口
bp MultiByteToWideChar ANSI字符串转换成Unicode字符串
bp WideCharToMultiByte Unicode字符串转换成ANSI字符串
=============== ================
密码常用中断
Hmemcpy (win9x专用)
GetDlgItemTextA
getdrivetype
int 2fh (dos)
32:
GetDriveTypeA
GetFullPathNameA
GetWindowsDirectoryA
读磁盘中断
GETLASTERROR 返回扩充出错代码
限制中断
EnableMenuItem 允许、禁止或变灰指定的菜单条目
__vbaVarTstNe似乎是用来进行自校验的,正常情况下返回值 为0。
已知适用的软件有:网络三国智能机器人、音乐贺卡厂。当这两个软件被脱壳后都回出错,网络三国智能机器人会产生非法*作,而音乐贺卡厂会告诉你是非法拷贝,通过修改__vbaVarTstNe的返回值都可让它们正常运行。
所以当您遇到一个VB软件,脱壳后无法正常运行,而又找不出其它问题时,可试试拦截这个函数,说不定会有用哦。8-)
EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)
不知道软盘中断是什么了?还有其它特殊中断,不知道其他朋友可否说一下了?
如ockmytask and mouse_event,这些就不是api32函数?
win9x 与 win2k进行破解,以上中断有部分已经不能用了?
3、rtcMsgBox 显示一信息对话框
4、rtcBeep //让扬声器叫唤
5、rtcGetPresentDate //取得当前日期
针对字串:
__vbaStrComp
__vbaStrCmp
__vbaStrCompVar
__vbaStrLike
__vbaStrTextComp
key文件:
getprivateprofileint
ReadFile
CreateFileA
注册表常用中断
RegQueryvalueA
RegQueryvalueExA
狗加密中断
BPIO -h 278 R
BPIO -h 378 R
其它常用函数断点
CreateFileA (读狗驱动程序),
bp SetTimer 创建定时器
bp TimerProc 定时器超时回调函数
GetDlgItemInt 得指定输入框整数值
GetDlgItemText 得指定输入框输入字符串
GetDlgItemTextA 得指定输入框输入字符串
拦截文件:
bp CreateFileA 创建或打开文件 (32位)
bp __vbaStrCmp 比较字符串是否相等
bp __vbaStrComp 比较字符串是否相等
bp __vbaVarTstNe 比较变量是否不相等
bp __vbaVarTstEq 比较变量是否相等
bp __vbaStrCopy 复制字符串
bp __vbaStrMove 移动字符串
bp EnableWindow 禁止或允许窗口
拦截时间:
bp GetLocalTime 获取本地时间
bp GetSystemTime 获取系统时间
bp GetFileTime 获取文件时间
bp GetTickCount 获得自系统成功启动以来所经历的毫秒数
bp GetCurrentTime 获取当前时间(16位)
bp CreateDialogIndirectParam(A) 创建非模态对话框
bp GetDlgItemText(A) 获取对话框文本
bp GetDlgItemInt 获取对话框整数值
拦截剪贴板:
bp GetClipboardData 获取剪贴板数据
拦截注册表:
bp RegOpenKey(A) 打开子健
bp CreateWindowEx(A) 创建窗口
bp ShowWindow 显示窗口
bp UpdateWindow 更新窗口
bp GetWindowText(A) 获取窗口文本
拦截消息框:
bp MessageBox(A) 创建消息框
bp MessageBoxExA 创建消息框
改为0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80], bx)
时间常用中断
GetSystemTime
GetLocalTime
GetTickCount
vb:
rtcGetPresentDate //取得当前日期
杀窗常用中断
Lockmytask (win9x专用)
bp RegOpenKeyEx 打开子健
bp RegQueryValue(A) 查找子健
bp RegQueryValueEx 查找子健
bp RegSetValue(A) 设置子健
bp RegSetValueEx(A) 设置子健
功能限制拦截断点:
bp EnableMenuItem 禁止或允许菜单项
bp MessageBoxIndirect(A) 创建定制消息框
bp IsDialogMessageW
拦截警告声:
bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动 系统喇叭发声)
拦截对话框:
bp DialogBox 创建模态对话框
bp DialogBoxParam(A) 创建模态对话框
API不太知道,也许可以通过BIOS在98平台上读写扇区,不过在2000/NT下可以通过内黑ATAPI,HAL写扇区
machoman[CCG]
bpx WRITE_PORT_BUFFER_USHORT
NT/2000下这个断点,当edx=1f0h,时,可以看见EDI地址内数据为扇区位置数据,必须先 在winice.dat 中装入hal.sys 详细内容看ATAPI手册
不知道在win2k上,以上常用中断函数是什么了?
也就是问密码、时间、窗口、ini、key、注册表、加密狗、光盘、软盘、限制等!
了解常用的中断,对破解分析可以做到事半功倍!
请大家说一下!还有如何破解了某个软件时,一重启就打回原形?
不知道下什么中断了?可以分为三种情况:
1.比较可能在注册表中
2.比较在特殊文件(*.key *.ini *.dat等)
3.比较在程序中,没有任何错误提示或者反译也找不到明显字符(这个就是我想问的)
还有一个是最难的,就是去掉水印!
也可以三种情况:
A.水印是位图文件(bitblt,creatBITMAP等位图函数)
B.水印是明显字符(反译分析)
C.水印不是明显字符(如:This a demo!它只是显示在另一个制作文件上,可是*.htm *.exe等)
GetDlgItemInt
vb:
getvolumeinformationa
vbastrcomp (trw)
Bpx __vbaStrComp (记得是两个 '_')
MSVBVM60!_vbastrcomp|sofice
MSVBVM50! |
VBAI4STR
Ctrl+D
bp DialogBoxIndirect 创建模态对话框
bp DialogBoxIndirectParam(A) 创建模态对话框
bp CreateDialog 创建非模态对话框
bp CreateDialogParam(A) 创建非模态对话框
bp CreateDialogIndirect 创建非模态对话框
相关文档
最新文档