windbg 之 如何定位进程入口点地址
载入HelloWorld.exe之后我们看看加载了哪些模块:
查看一下堆栈:
都是ntdll中的函数,我们想要运行到HelloWorld.exe的main函数中停下。
这么办:
使用!dh命令。
帮助文档中给出!dh的解释如下:
The !dh extension displays the headers for the specified image.
Parameters
- Options
-
Any one of the following options:
- -f
-
Displays file headers.
- -s
-
Displays section headers.
- -a
-
Displays all header information.
- Address
-
Specifies the hexadecimal address of the image.
执行命令:
可以看到入口点地址为112C6,这个是RVA,即相对虚拟地址。什么是相对虚拟地址呢?我们往下看。
我们使用lm命令查看到start下的地址,就是HelloWorld.exe模块加载到内存之后的一个虚拟地址的起始位置,之所以称之为虚拟地址,就是因为它是在4G内存(32位)中的一个相对位置。
这里是0x1180000:
而相对虚拟地址就是相对于1180000的位置再偏移112C6,即112C6+1180000 = 11912C6,得到的就是入口点的虚拟地址。再不明白就如下图所示:
这时我们得到入口点的地址为11912C6,下断点:
运行,命中0号断点:
此时Disassembly窗口显示如下:
再单步运行一步就跳到了main:
对应的Disassembly窗口显示如下:
顺便提一下:
push ebp
mov ebp,esp
是典型的进入一个函数的头两个指令。他们的作用是将上一个函数的基址先进栈,而后将当前esp所指位置设为当前函数的基址。
这里的”___security_init_cookie“是设置一个security cookie,防止堆栈溢出,以后可以跟进这个call,查看具体实现的细节,相关内容可以参考:
http://blog.sina.com.cn/s/blog_4e0987310101ie77.html
跟入
__tmainCRTStartu
可以看到该main函数中具体细节。
windbg 之 如何定位进程入口点地址的更多相关文章
- Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)
一.重定位链接时重定位:目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码.当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整.同时,链接器需要对已经解 ...
- 可执行程序的入口点在那里?(强化概念:程序真正的入口是mainCRTstartup)
今天终于有时间来研究一下一个很大很大的工程编译成一个exe和若干dll后,程序是如果执行它的第一条指令的?操作系统以什么规则来找到应该执行的第一条指令(或说如何找到第一个入口函数的)? 我们以前写wi ...
- ------ Tor(洋葱路由器)匿名网络源码分析——主程序入口点(一)------
--------------------------------------------------------<概览> tor 的源码包可以从官网下载,可能需要预先利用其它FQ软件才能访 ...
- (转) MFC的入口点与消息循环,消息映射
博文分析的很不错,尤其是替换默认窗口过程的这块,本人觉得,所有的这些都可以参阅侯杰的<深入浅出MFC >. 来自:http://blog.csdn.net/sryan/article/de ...
- 在纯C工程的main函数之前跑代码(手工找到程序入口点, 替换为我们自己的函数)
在main函数之前跑代码的方法 方法: 手工找到程序入口点, 替换为我们自己的函数 写测试程序 // test.cpp : Defines the entry point for the consol ...
- vs/windows程序找不到入口点cuvidGetDecodeStatus于AppDecGL.exe动态链接库上
解决方法:这个问题的原因是由于使用的英伟达显卡驱动版本不够新,更新显卡驱动即可. 找了一个多月的原因,终于知道起源了.最终问题还是出在了nvcuvid.lib/.dll上面.通过分析vs调试信息可以得 ...
- PC逆向之代码还原技术,第二讲寻找程序入口点
PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码 ...
- 脱壳:OEP(即程序入口点)查找 --- 基本思路和常见方法
OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) 代表程序的入口点, POPAD (出栈) 代表程序的出口 ...
- C# 一、语法结构、注释、命名空间、Main入口点、变量与常量、运算符、流程控制(循环)
一.代码结构 1)一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declaration) 一个 class Class 方法 Class 属性 一个 Main 方法 语句(St ...
随机推荐
- javascript焦点图自动缓冲滚动
html中调用的js库,之前的随笔中有写,就不细说了,不明白的可以留言给我 <!DOCTYPE html> <html> <head> <meta chars ...
- javascript动画效果之透明度
在css中的filter对应老版本的ie浏览器,opacity对应的是其他浏览器 <!DOCTYPE html> <html> <head> <meta ch ...
- matlab显示原图和灰度直方图
**只会显示灰度直方图I = imread('*.bmp') %图必须是灰度图,或者转换为灰度图I=rgb2gray(I);imshow(I);imhist(I); **同时出现在一个平面上I = i ...
- 21.编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E。要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void speak() 方法,在speak方法中输出“咿咿呀呀......”的信息。 (2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法 中输出“小样
//Monkey类 package d922; public class Monkey { Monkey() { } Monkey (String s) { System.out.println(s) ...
- manifest中的largeHeap是干什么用的?
转 http://blog.csdn.net/jiaoyang623/article/details/8773445 今天群里有人讨论怎么给app分配超过100M的内存,有人亮出了largeHeap参 ...
- Objective-C和Swift实现单例的几种方式
在Swift开发中,我们对于跨类调用的变量常量,因为并没有OC中使用的全局头文件中写宏的形式,我们一般采用在类外定义全局变量/常量的形式来跨类调用.而问题在于目前写的项目需要在新添加的OC写的功能模块 ...
- ios使用xcode进行Archive打包上传出现的常见错误
error itms 90362上传appstore 一直报错ERROR ITMS-90362: "Invalid Info.plist value. The value for the k ...
- TD缺陷通过excel导入QC11.0缺陷库
在将TD升级到QC之前,参考了各种升级的方式,但是最终发现用excel导入缺陷到QC库是最简单方便的方法,实施步骤如下:1,首先登陆TD,将缺陷的所有信息显示在界面,然后使用缺陷工具将页面所有缺陷保存 ...
- 第三十七节,hashlib加密模块
在使用hashlib模块时需要先 import hashlib 引入模块 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA ...
- JavaScript高级程序设计:第一章
JavaScript简介: 1.JavaScript实现应该由以下三部分组成: (1)核心:ECMAScript (2)文档对象模型:DOM (3)浏览器对象模型:BOM 2.什么是ECMAScrip ...