2021-02-14

本文介绍了四种在OD调试器中快速找到main()函数的方法:1) 代码执行法,通过设置断点并逐指令执行;2) 字符串检索法,利用程序中的unicode字符串定位;3) API检索法,在调用代码中设置断点,通过分析API调用来寻找main();4) 在API代码中设置断点,通过DLL的内存映射找到并设置断点。这些技巧对于Win32API编程和程序调试十分实用。
摘要由CSDN通过智能技术生成

快速查找指定代码的四种方法

在调试代码的过程中,main()函数并不直接位于可执行函数的EP位置上,出现在此开发函数的启动函数,我们需要查看的main()函数距离EP函数很远。
运行hello.exe文件时,会弹出一个消息框,显示"hello world!"信息。如果懂得win32API这是会联想到这是main()函数的MessageBox()函数在某个时刻调用的结果。

1.代码执行法
介绍一下设置大本营的方法执行Go to(crtl+G)命令,打开对话框,在文本框中输入对应的地址即可。光标自动锁定相关的位置,执行F4命令让调试达到该处。这也是初步调试中使用的方法,从大本营开始,按F8逐个执行命令,在某个相关时刻弹出对话框,弹出对话框时调用的函数即为main()函数。
2.字符串检索法
crtl+G打开Enter expression to follow in Dump窗口,字符串以unicode编码形式表现,这是因为win32程序中,API是通过栈传递到。VC++中默认的字符串是使用unicode码表示的,并且,处理字符串的API函数也全部变更为Unicode系列的编码。
3.API检索法,在调用代码中设置断点
windows编程中,若想向显示器显示内容,则需要使用win32API向OS请求显示输出。换而言之,应用程序向显示器输出内容时,需要在程序内部调用win32API。以hello为例,它会在运行过程中弹出一个消息窗口,由此判断该程序调用了user32.MessageBoxW()API。
在od的预分析中,不仅可以分析出程序使用的字符串,还可以摘录出程序运行时调用的API函数序列。若能事先推测出代码使用的API,则使用上述方法可以帮助快速找到所查找的位置。
在这里插入图片描述
4.API检索法,在API代码中设置断点
Search for - Name in all calls
od并不能为所有可执行的文件都列出API调用列表。使用压缩器/保护器工具对可执行文件进行压缩和保护后,文件的结构都会改变。此时的od就无法调出API调试序列了。
在这种情况下,DLL代码库会被加载到进程内存后。可以直接向DLL代码库添加断点。API是操作系统对用户应用程序提供的一系列函数,它们通过system32文件夹中的*.dll文件实现。简而言之,编写的程序进行某种操作时,必须使用OS提供的API向OS提出请求。随后被调用的API对应的DLL文件就会加载到应用程序的进程内存
Alt+M,打开内存映射窗口。
在这里插入图片描述
可以看到user32库被加载到内存中
使用od中的Name in all modules命令可以查看被加载的DLL文件提供的所有API在这里插入图片描述
找到messageboxw打开,就可以看到其代码,其实现于USER32.dll库中
在这里插入图片描述
在函数起始处下断点,设置好后F9。
在这里插入图片描述
与目标程序所在位置相同。看右下方的栈窗口,能得到更为详细的信息
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值