原文发表于百度空间,2011-06-20
==========================================================================

大致过程如下:

LdrInitializeThunk  //ring3线程第一次执行从这里开始

->LdrpInitialize

->_LdrpInitialize

->LdrpInitializeProcess // 如果不是该进程第一次调用,这里会变成LdrpInitializeThread,判断依据是PEB->Ldr是否被填充过

->LdrpWalkImportDescriptor //该函数是递归的。。。

->LdrpHandleOldFormatImportDescriptors 或 LdrpHandleNewFormatImportDescriptors

->LdrpHandleOneOldFormatImportDescriptor  或 LdrpHandleOneNewFormatImportDescriptor

->LdrpLoadImportModule(这里会调用LdrpMapDll加载导入表中的dll),然后调用LdrpSnapIAT

->LdrpSnapThunk

->LdrpGetProcedureAddress  //获取函数地址,进行填充

以上全是ntdll中的函数,所以什么给GetProcAddress下断观察IAT填充根本是不靠谱的。

系统断点ntdll!DbgBreakPoint是在LdrpInitializeProcess中执行完LdrpWalkImportDescriptor把IAT填充完毕后判断BeingDebugged标志有效才中断的,这时候IAT都已经填充完了,如果用OD的话最早只能中断在系统断点,所以OD不能观察到这个过程。windbg调试程序时默认也是中断在系统断点ntdll!DbgBreakPoint,但是通过设置我们可以让windbg在收到进程创建事件时就中断下来,这时进程的第一个线程才刚刚从ring3开始执行,这样就可以提前给LdrpInitializeProcess和LdrpWalkImportDescriptor下断来跟踪IAT的填充过程。具体方法如下:

一、用windbg打开要调试的PE文件,这时windbg会中断在ntdll!DbgBreakPoint

二、选择"Debug"菜单里的"Event Filters",会打开以下对话框:


然后把"Create Process"事件由Ignored设置为Enabled就可以了。

三、在windbg命令窗口中输入".restart"来重启应用程序,这时就会中断在ntdll!KiUserApcDispatcher处

四、给LdrpInitializeProcess和LdrpWalkImportDescriptor下断,然后g就可以在这里中断下来了

因为很少用windbg调ring3程序,所以误以为不能比ntdll!DbgBreakPoint更早地中断,特此更正。

【旧文章搬运】加载PE文件时IAT的填充时机的更多相关文章

  1. Android 解决在初次打开Activity加载布局文件时,ScrollView滚动条不在顶部的问题

    出现这种问题的情况列举:ScrollView中嵌套有(包括自定义)的ListView,GridView时,会出现这种情况 解决办法: 1.在布局加载时让ScrollView上面的那个控件聚焦,具体做法 ...

  2. XmlDocument.Load()加载xml文件时,提示分析 EntityName 时出错的问题。

    今天一个接口突然报错,错误是: 分析 EntityName 时出错. 行 35,位置 90. xmlDoc.Load(System.Web.HttpContext.Current.Server.Map ...

  3. arcpy加载mxd文件时,无效的MXD路径,提示assert (os.path.isfile(mxd) or (mxd.lower() == "current")), gp.getIDMessage(89004, "Invalid MXD filename")

    无效的MXD路径,将路径前加‘u’,改为这种: mxdPath = u"C:\\1331\\DB\\Original Files\\dd.mxd" 参考: https://gis. ...

  4. Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)

    今天配置Spring的xml出现了错误 Multiple annotations found at this line: - schema_reference.4: Failed to read sc ...

  5. webpack模块加载css文件及图片地址

    webpack支持css文件加载并打包,只需安装相应加载器并在配置文件中配置 . 加载的css文件内容会与该模块里的js内容混合封装,这样做的好处是一个js文件包含了所有的css与js内容,有效减少了 ...

  6. 在seajs中使用require加载静态文件的问题

    注意,在seajs中使用require加载静态文件时,必须使用常量,不能用变量.如果一定要用变量,请使用require.async var html = require("view/sys/ ...

  7. Java加载资源文件的两种方法

    处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...

  8. Spring加载xsd文件报错:because 1) could not find the document; 2) the document could not be read...

    Spring启动时加载xml文件的过程: spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的路 ...

  9. Django模版中加载静态文件配置详解

    .settings.INSTALLED_APPS下添加:django.contrib.staticfiles .settings.py下添加:STATIC_URL = '/static/' . ()在 ...

随机推荐

  1. 安装odoo 9实录

    安装Ubuntu,省略 下载 odoo源码 使用 git 下载源码 mkdir /opt/openerp/server cd /opt/openerp/server git clone https:/ ...

  2. 用C++设计一个不能被继承的类(转)

    在Java 中定义了关键字final,被final修饰的类不能被继承. 首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数.要想一个类不能被 ...

  3. Vb.net/VB 声明API函数实现父窗口功能

    回想第一次敲机房收费.自己调用了api函数实现了父窗口及其子窗口最小化的功能.现在再次遇到,自己就在思考,能不能继续使用API函数呢?答案当然是Of Course! 事实上细致看两者并没有多大的差别. ...

  4. Android------Intent.createChooser

    Intent的匹配过程中有三个步骤,包含Action , category与data 的匹配. 假设匹配出了多个结果.系统会显示一个dialog让用户来选    择.例如以下图: 那么今天我们主要是解 ...

  5. MacOS 修改主机名

    修改主机名 sudo scutil --set HostName xxx 修改共享名 sudo scutil --set ComputerName xxx

  6. vue-router 介绍

    vue-router是官方的路由管理工具,用于组建单页面应用很方便快捷.还记得我们在上一篇文章中,使用vue-cli创建的hello-vue的那个项目吗?打开项目,我们先看下目录结构: 看了上面的目录 ...

  7. Python中十六进制和字符串的转换(转载)

    调用Python内置int()函数把该字串转为数字.以下为在Python解释器编程环境下的操作示范: 把十六进制的字串转为十进制数字:Python代码>>> print int('f ...

  8. 模式匹配之sift--- sift图像特征提取与匹配算法代码

    sift,The Scale Invariant Feature Transform ,尺度不变特征变换,是检测图像中具有唯一性.对图像平移.旋转.缩放.甚至仿射变换(如从不同角度拍摄图片)保持不变性 ...

  9. JDBC编程步奏、问题总结(一)

    jdbc编程步骤: 1. 加载数据库驱动 2. 创建并获取数据库链接 3. 创建jdbc statement对象 4. 设置sql语句 5. 设置sql语句中的参数(使用preparedStateme ...

  10. appium导入哪些java模块

    简单介绍 讲解一个appium测试脚本需要导入哪些java模块. 导入的java模块 明确两点信息: 一个脚本需要讲清楚测试环境:1.自动化平台方面,测试的平台是什么(appium或者selendro ...