本次要做的尝试是通过修改导出表的函数地址,实现程序功能的更改,实现这个最大的限制就是堆栈平衡问题。

先写一个DLL和EXE为了测试。

DLL代码如下:

这样的话有两个导出函数(我们假设是一个密码验证之后执行的函数):

EXE测试代码如下:

也就是简单模拟下DLL调用,默认情况下因为密码错误,所以执行结果是这样:

然后开始一步一步分析处理问题:

1.确定需要替换函数堆栈平衡

首先IDA看下两个导出函数的调用堆栈,也就是看下参数是否一样,不然直接调换位置会导致函数调用之后堆栈不平衡:

可以确定,这两个函数的调用堆栈相同,可以直接替换。

2.从PE头开始,一步一步找到导出函数地址数组(AddressOfFunctions)

可以知道导出表的地址和大小,这个地址是RVA,根据这个RVA可以计算出来FOA。RVA-FOA之间的转换我写过总结,还写了个工具当时。需要的可以翻翻我上传的东西。这里不细说直接计算:

这样0xCF30的位置应该是存的导出表相关。找到这个位置:

黑色部分是对应的如下这个结构:

红色框部分就是倒数第三个,导出函数地址RVA,继续计算FOA

然后找到FOA 0xCF58处的一个DWORD数组,这个存的是导出函数地址,RVA。

最后把这两个地址进行交换就行了。然后运行测试exe,实现错误密码登录成功,当然这只是个演示程序,如果是实现功能的话,还可以直接OD加载进来,跑一下,在IF的地方把汇编代码的比较函数改了就行了。这个在WindowsPE的第一节我就写过操作流程,这里不细说了。

最后就是我写完这些分析的时候发现有点SB了,咱们来看下这个:

其实可以直接根据那个提供的地址,得到下面的两个地址,没看错的话,应该是一个是VA,一个是RVA,基址是10000000。稍等我去查下:

woc基址还真是这个。这样的话直接全局搜索这个地址然后替换就行了啊。额...不过没事。毕竟是为了学习吗。无所谓了。为了方便一些不太了解导出表的小伙伴,我最后在传一个导出表的结构吧。如果看不懂了可以看下这个结构理解下:

Windows PE导出表编程2(重组导出表函数地址)相关推荐

  1. WindowsPE 第五章 导出表编程-1(枚举导出表)

    导出表编程-1-枚举导出表 开始前先回忆一下导出表: 1.枚举dll函数的导出函数名字: 思路: (1)加载dll到内存里. (2)获取PE头,逐步找到可选头部. (3)然后找到里面的第一个结构(导出 ...

  2. Windows PE导出表编程4(重构导出表实现私有函数导出)

    本次是尝试调用DLL里面的私有函数. 一: 之前先探索一下,首先可以考虑用偏移量来调用,就是如果知道了某个私有函数和某个导出的公共函数的相对便宜的话,直接加载dll获取公共函数地址,然后自己手动去偏移 ...

  3. Windows PE导出表编程3(暴力覆盖导出函数)

    今天要尝试的导出表相关编程内容是:覆盖函数地址部分的指令代码. 这种覆盖技术,是将AddressOfFunctions指向的地址空间指令字节码实施覆盖,这种技术又繁衍出两种: 暴力覆盖,即将所有的代码 ...

  4. PE学习(五)导出表,编写DLL及查看DLL的导出信息

    第五章 导出表 typedef struct _IMAGE_NT_HEADERS { +00h DWORD Signature +04h IMAGE_FILE_HEADER FileHeader +1 ...

  5. PE文件和COFF文件格式分析——导出表的应用——通过导出表隐性加载DLL

    通过导出表隐性加载DLL?导出表?加载DLL?还隐性?是的.如果觉得不可思议,可以先看<PE文件和COFF文件格式分析--导出表>中关于"导出地址表"的详细介绍.(转载 ...

  6. windows下socket编程GetLastError()函数返回结果与对照表-转

    原文地址:http://blog.sina.com.cn/s/blog_4880c4bb0100b6a5.html WSAGetLastError()函数返回结果与对照表: Windows Socke ...

  7. windows编程常用系统API函数

    windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...

  8. Windows编程之使用GetAsyncKeyState()函数为什么要( 0x8000)?

    Windows编程之使用GetAsyncKeyState()函数为什么要(& 0x8000)? 先来看看GetAsyncKeyState()函数的原型:  SHORT GetAsyncKeyS ...

  9. Windows Pe 第三章 PE头文件-EX-相关编程-2(RVA_FOA转换)

    RVA-FOA之间转换 1.首先PE头加载到内存之后是和文件头内容一样的,就算是偏移不同,一个是磁盘扇区大小(400H)另一个是内存页大小(1000H),但是因为两个都是开头位置,所以相同. 2.看下 ...

最新文章

  1. 部署Configuration Manager主站点以及辅助站点
  2. Python学习笔记--2--面向对象编程
  3. linux充当防火墙,Linux下主机充当防火墙的巧妙应用之iptables!.doc
  4. 小程序使用css变量,小程序使用css变量实现“换肤”方案
  5. aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍
  6. java中的Static、final、Static final各种用法
  7. SpringCloud的Ribbon负载均衡
  8. 将activity设置成对话框模式时遇到的问题(android)
  9. 当子查询内存在ORDER BY 字句时查询会报错
  10. Java链表与数组间的相互转换
  11. windows开启远程Wmi服务支持
  12. Udacity DNN
  13. 登录邮箱手动连接服务器,outlook2016不能连接exchange2010,自动或手动均不能连接服务器...
  14. linux命令 trtest,Linux tr命令的使用方法
  15. 分享105个NET源码ASP源码,总有一款适合您
  16. 百度统计 渠道分析 渠道名称显示 未知
  17. linux量产工具使用,33-Vstr开发板资料合集 开发工具 US升级和量产工具 LiveSuitV306_For_Linux64 LiveSuit_For_Linux64 RedMe...
  18. 【Python】scipy之艾里函数
  19. 1.8255A中,若要把C口的PC3引脚置高电平,则命令字应该设
  20. 达索CATIA许可证(License)管理使用和优化,解决许可不够用

热门文章

  1. 【转】编程思想之消息机制
  2. Java_io体系之RandomAccessFile简介、走进源码及示例——20
  3. [禅悟人生]越忙的人时间越多
  4. 在WebView中如何让JS与Java安全地互相调用
  5. 匿名对象和object的转换
  6. 比赛-模拟赛 (17 Aug, 2018) (待施工)
  7. java-统计字符串中各字符次数
  8. Map集合的几种遍历方式
  9. 【模拟】【贪心】POJ2709Painter
  10. Process.Start() 传递参数中有空格问题