您的位置 首页 > 数码极客

「od如何取消断点」od取消断点快捷键!

1、打开OD,随便打开一个可执行程序(我这里选择了IE浏览器), 选择EIP 及EIP以下的两百行代码,然后用二进制黏贴上面的shellcode。OD 会自动将shellcode代码转化为汇编代码

2、hex、dec、oct使用计算器来转换更加方便

3、hex用00000000至7FFFFFFF表示正数,80000000至FFFFFFFF表示负数;其中7FFFFFFF=2147483647是最大的正数;FFFFFFFF等于十进制的-1;FFFFFFFE等于十进制的-2;80000000=-2147483647;

4、在od命令栏中输入?7FFFFFFF可以查询7FFFFFFF的值以Dec、Hex、ASCII对应的结果,使用问号也可以查看寄存器的值,如?AX, ?EAX

5、十进制 十六进制 ASCII

48 30 0

57 39 9

97 61 a

122 7A z

65 41 A

90 5A Z

6、寄存器EAX、ECX EDX EBX ESP EBP ESI EDI EIP这些全是32位寄存器,这些寄存器中的内容使用16进制形式显示,它们的最小值是00000000,最大值是FFFFFFFF

7、AX是16位寄存器,用来表示EAX的后四位,AL是AX的后两位,AH是AX的前两位

8、6中的所有寄存器除了EIP外,都可以在OD的寄存器窗口中使用右键弹出的修改菜单来修改,EIP的修改方式是在汇编窗口中选择一处地址并点击右键在弹出的菜单中选择New Origin here 这样EIP就会被修改成对应地址的值

9、标志寄存器(C P A Z S T D O),他们的值只有两个0或1

O是溢出标志, 暂时这样理解,当一个指令的结果超出了他可以存取的最大值时,溢出标志O将被设置成1

P是奇偶标志,当指令的结果用二进制表示时,如果其中1的个数为偶数时P标志被设置成1,当1的个数为奇数时P标志被设置成0

Z零标志,当指令的结果是0时,Z标志被设置成1

S符号标志,当指令运行结果为负数时,S标志被设置成1

C进位标志,

标志被设置指将其值设置成1,被清除表示设置值为0

10、在OD的反汇编窗口选择一条指令点击空格或双击鼠标可以打开修改当前选中指令的修改指令窗口,在窗口中可以输入新值,之后点击汇编按钮即可完成修改

11、寄存器是CPU内部高速存储单元,比内存快很多

12、NOP,无操作指令,每一个NOP占用一个字节,它对应的字节码是90,当在OD汇编窗口中修改指令时,OD会根据原有指令的长度来判断,如果是将长指令修改成短指令那么OD就会将原有长指令在替换成短指令时使用NOP来填充多余的字节

13、堆栈中显示的值其实是数据窗口中倒序过来的值,如PUSH [401888], 如果数据窗口中对应401888处保存的是CA 98 36 22,那么在执行完PUSH [401888]后在堆栈中显示的值会是22 36 98 CA;另外 [401888]表示的是内存单元401888存储的值,而不加括号直接PUSH 401888则表示将数值401888压入堆栈,PUSH [X] 与PUSH X是两个完全不同的概念

14、PUSH X,执行前后OD中堆栈的变化是原有内容下移,之后最上面新增一条数据,即新的栈顶;

15、POP X,执行前后OD中堆栈的变化是原有内容上移,之后原来最上面中的数据存储到X中

16、LEA取地址指令,

17、XCHG交换寄存器与寄存器的值,或交换寄存器与内存单元的值

18、INC 执行加1, ADD有两个操作数,后面是值;DEC是减1

19、ADC带进位的加, 如ADC EAX,3表示 EAX=EAX+3+C(进位标志的值);SBB带进位的减与ADC刚好相反的功能

20、MUL无符号数的乘法,只有一个操作数与EAX中的值相乘,结果保存在EDX:EAX中

21、在OD中修改一条指令时,数字的头一位不能是字符,如mov eax, FF123989这样写来修改原有的指令OD会报错,这时可以在数字前加0来解决OD的这个问题,即mov eax, 0FF123989

22、IMUL是有符号乘法,它可以使用一个或两个、三个操作数,使用一个时与MUL保存结果方式相同还是存储在EDX:EAX中,而两个或三个操作数时结果保存在第一个操作数中,但是这种三个操作数的乘法最终的结果可能有一部分会被丢弃,因空间不够大

23、NEG指操作数符号即反

24、逻辑指令,有两个操作数,并将结果保存在第一个操作数里

25、AND按位与,OR按位或,XOR按位异或(即不同时取1,相同时为0),NOT按位取反

26、JZ当标志Z被置1就跳转,否则不跳转

27、AX长度是word, AL长度是BYTE, EAX长度是dword,所以使用指令访问内存单元时要这样, mov eax, dwrod ptr ds:[x]; mov ax, word ptr ds:[x]; mov al, byte ptr ds:[x]

28、TEST EAX, EAX用来判断EAX的值是否为0,test指令用来将两个操作数按位与

29、所有的跳转指令都会指向将要跳转到的地址

JMP跳转;JE,JZ结果为0则跳转;JNE,JNZ结果不为0则跳转;JS结果为负则跳转;JNS结果不为负则跳转;JP,JPE结果中1的个数为偶数则跳转;JNP,JNPE结果中1的个数为奇数则跳

JO结果溢出则跳转;JNO结果没有溢出则跳转;JB,JNAE小于则跳转(无符号数);JNB,JAE大于等于则跳转(无符号数);JBE,JNA小于等于则跳转(无符号数);

JNBE,JA大于则跳转(无符);JL,JNGE小于则跳转(有符号数);JNL,JGE大于等于则跳转(有符号);JLE,JNG小于等于则跳转(有符号数);JNLE,JG大于则跳转(有符号)

30、溢出的方法,在OD中将EAX的值设置成7FFFFFFF,之后执行INC EAX,这样就溢出了

31、OD允许调试人员只是查看将要执行的CALL而不真正执行,点击鼠标右键选择跟随(或Follow),现在看完了call中的代码了想回到之前call的位置怎么办?点击减号来回到按了跟随的那一行;

如果想从Call里跳出执行可以点击F8,如果想跟踪执行可以点击F7

32、进入到Call代码段后,如何判断这个子函数的结尾呢?在代码段中找ret/retn这就是函数结束的标志命令

33、PUSH X ;ret 这两条指令执行完后会跳转到X指定的位置,这与JMP X等效;

34、一般情况下如果在OD中改动了代码,需要重新使用OD分析代码(右键“分析/分析代码”);有时OD的分析代码有问题,则可以删除分析(右键"分析/删除分析")

35、在堆栈窗口中可以通过选择某一行并点击回车来让汇编窗口跳转到堆栈窗口中显示的位置,这一方法常用用来查看函数返回

36、一般使用ECX做为循环里的计数器,LOOP也是使用ECX做为计数器的,每次减1,直到计数器为0时退出循环;注,使用LOOP的效率一般要低于直接TEST X, X和JNZ组合;

类似的循环指令还有LOOPZ,LOOPE,LOOPNZ,LOOPNE,这些指令退出除了要检查计数器外还要检查标志Z,前面两个Z为1且计数器为0时退出循环,后面两个计数器为0且Z为0;

37、拷贝字符串指令,MOVS D, S可以拷贝4字节,如movs dword ptr ES:[EDI], dowrd ptr DS:[ESI]

movsw可以拷贝两个字节,movsb拷贝一个字节

38、REP MOVS,结合计数器ECX,可以重复执行movs;源指针ESI和目的指针EDI每次递增4或者递减4(递增或递减取决于方向标志位D)

39、LODS指令从源地址ESI拷贝数到EAX中,如,lods ptr ds:[esi];另外,lods也可以结合前缀rep使用;lods对应的两字节和一字节版本为lodsw和lodsb

40、STOS指令将EAX的值拷贝到EDI指定的内存单元,如stos ptr es:[edi];

41、CMPS指令比较指向esi,edi内存单元的内容

42、直接寻址指"不需要任何有关地址的解析或计算,地址的值是纯数字", jmp 428898, call 389398, mov dword ptr [00419988],ecx

43、间接寻址指只有在执行到这条指令时才能知道地址的值,如 jmp eax, call eax, mov eax, dword ptr [ecx], push [ebp+8]

44、OEP原始入口点,使用OD加载程序有99%的程序会默认停止在入口点,只有反调试的程序不会

45、OD在可以右键跳转在表达式里输入函数名称或地址来查看函数的实现,跳转到函数的实现代码段后,可以使用减号回到EIP处

46、可以在OD的命令栏中输入?MessageBoxA来查看函数的地址

47、bp 函数,指在函数的第一条指令处设置断点,注不是函数的调用处,除非这个函数无参数,否则会执行到第一个PUSH指令处暂停

48、在OD在执行过分析代码后,如果感觉OD分析的有问题,可以删除OD的代码分析,删除分析后大多数情况下会显示有意义的汇编代码

49、当使用OD设置断点时,OD会将对应指令处的第一个字节替换成CC(int 3),但是OD为了不影响界面显示效果,OD会将CC显示成原来的字节,

那么我们怎么验证OD替换指令第一个字节为CC?

50、bpx 函数a,它用来设置所有与函数a相关调用设置断点

51、内存访问断点,顾名思义当任何代码访问(读、写、执行)该处的代码都会触发断点;注,内存访问断点不会显示在"断点列表中";一次只能设置一个内存访问断点,不能在程序运行期间设置多个内存访问断点,也就是说,设置一个内存访问断点后,后面的会覆盖前面的断点

52、内存访问断点的另一种设置方法是,为m窗口内的模块来设置段内存访问断点,这种方式设置的断点影响的范围是整个模块,如对模块u设置了内存访问断点,那么只要访问了u内存区域内的任意地址都会触发断点

53、如果想从其他模块的执行返回到主程序模块,可以点击Alt+F9或者找到函数的返回地址后点击F7进入

54、同一个函数如果使用bp设置断点无效的话,可以尝试设置内存访问断点

55、硬件断点,分为三种,硬件执行、硬件访问、硬件写断点,可以在命令栏中输入”HE 地址“(或HE 函数名)来设置硬件执行断点;OD中最多可以同时设置4个硬件断点

硬件访问/写入断点是断在触发硬件断点的下一条指令处。如果我们想在读取或者写入4020CA地址处的内容的时候断下来的话,我们给该地址设置1个字节的硬件访问断点即可

56、条件断点

57、条件记录,比如现在想要记录MessageBoxA函数的所有返回地址、MessageBoxA调用时传入的参数,那么就可以在条件记录中设置表达式为[esp],设置暂停为从不、设置记录表达式为永远、设置函数参数值为永远即可

58、消息断点,设置消息断点需要在打开目标窗口之后,在od中打开w窗口,之后可以看到当前打开的被调试目标的窗口上所有可以设置消息断点的窗口

“在程序获取我们输入的数据时,让程序中断下来”,可以采用消息断点结合主程序内存断点的方式快速定位到主程序中哪里代码是用来获取用户输入数据的

59、硬编码序列号指由固定的字符和数字构成的固定不变的字符串

60、OD中查看地址中存储的值,可以在反汇编窗口下面的数据窗口中跳转到对应的地址查看;找到关键API(MessageBoxA, GetDlgItemTextA, GetWindowTextA, lstrcmpA)下断点

61、MOVSX指令将指定字节保存到EDX中,如果该字节是正数,高位补零,如果该字节为负数高位补1

62、硬编码注册码的破解技巧总结

1)利用输入的错误注册码找到与正确注册比较的关键代码

(1)方法一、通过MessageBox来定位,如果比较后程序给用户的提示是使用MessageBox来告知用户注册码输入错误的,那么可以根据MessageBox的返回地址找到关键代码

(2)方法二、如果程序中使用的是自定义的提示框来提示用户注册码输入的结果,此时要怎么确认关键代码?

答案是,找到关键时机,什么样的关键时机呢?我们知道注册码的校验流程是从用户的输入开始,终止于告知用户输入注册码正确与否的提示框,

那么比较注册码的关键代码必定出现在用户输入注册码之后、提示框出现之前,所以,我们可以以键盘转换函数GetWindowText或TranslateMessage为切入点,

在他上面设置断点,等待用户输入完成后得到输入的错误注册码在内存中保存的地址A,之后在A上设置内存访问断点,之后F9运行程序等待程序访问地址A,从而找到关键代码

注,如果程序入口不在401000(程序可能加壳了),那么在od加载程序时不要让od分析,等待程序运行起来后,在od的m窗口中找到401000代码区域并设置内存访问断点,

之后等待程序在主模块中中断下来,这样再来查找程序主模块中的函数列表、字符串。

在程序刚刚加载的时候不能这么做,因为那个时候我们查看当前模块使用的API的话是查看的壳所在模块使用的API函数

方法二中,如果使用的是函数TranslateMessage来确认错误注册码在内存中的位置从而找到关键代码的话,

需要在函数TranslateMessage设置断点时设置条件MSG=WM_LBUTTONDOWN,这样当在程序中输入错误的注册码后,通过点击鼠标左键来触发设置在TranslateMessage函数的断点,

此时的注册码已经输入完,所以内存中已经保存了你刚刚输入的错误注册码,此后就可以在od的m窗口中通过查询输入的错误注册码找到对应的地址

63.F2设置一般断点,shift+F2设置条件断点,shift+F4设置记录断点

原文地址:

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“od如何取消断点,od取消断点快捷键,od取消断点bp,od怎么取消断点”边界阅读