写在前面:这是一次实践作业,用c来写似乎好写一点,但我比较熟悉python,也找到了python相关的库,就用python来实现下,用一晚上把前天写的代码变成了图形化界面,自学过程中,学到了许多东西,也把很多学过的都实践了一遍

目标:

实现过程:

原理

上课老师讲了原理,其实很好懂,主要是PE文件的结构我不太熟悉,一直反复看,贴下原理吧

实现思路

1、找python有没有操作 pe 相关的库,有一篇参考文章

pefile库可以来完成这次的作业

2、找到相关的变量

  • ImageBase(基址)
  • VirtualAddress(虚拟地址)
  • PointToData(节在pe文件中的相对偏移)
  • SizeOfRawData(节在内存中的相对偏移)

3、根据原理实现即可

接下来就是写代码的过程了,贴个主要计算的函数

import pefile
import sys#IM 基地址
#RVA 节的相对虚拟地址
#PTRD 文件中的相对偏移
#SORD 内存中的相对偏移
def calculate(VA, RVAOfFile, PointerToRawData, SizeOfRawData):global ImageBase, SizeOfHeadersRVA = VA - ImageBaseif(RVA  < SizeOfHeaders):FOA = RVAelse:if(RVA >= RVAOfFile and RVA <= RVAOfFile + SizeOfRawData):FOA = RVA - RVAOfFile + PointerToRawDataelse:FOA = Nonereturn FOA

能力提升

这个代码写起来很简单,我主要想通过这次的实践把python的窗体编程给学会了,学得时间比较短,只是皮毛,设计也不是很好,只能凑合着用

包含的知识点:

  • 异常处理
  • 匿名函数(lambda, partial)
  • 文件路径操作

实现的主要功能

  • 打开文件夹,选择文件
  • 按按钮实现地址的计算
  • 标签、输入框等
from tkinter import *
from tkinter import messagebox
import pefile
from functools import partial
from tkinter.filedialog import askopenfilename
import osdef calculate(VA, RVAOfFile, PointerToRawData, SizeOfRawData, ImageBase, SizeOfHeaders):RVA = VA - ImageBaseif(RVA  < SizeOfHeaders):FOA = RVAelse:if(RVA >= RVAOfFile and RVA <= RVAOfFile + SizeOfRawData):FOA = RVA - RVAOfFile + PointerToRawDataelse:FOA = Nonereturn FOA
def Show(label_result, VA, File):#messagebox.showinfo("提示信息","Success")
##    print(type(VA), VA.get())
##    print(File.get())
##    print(type(label_result))
##    print(help(label_result.config()))try: VA = int(VA.get(), 16)File = File.get()pe = pefile.PE(File)except:messagebox.showinfo("Error","The args is wrong, Plz input again")return ImageBase = pe.OPTIONAL_HEADER.ImageBaseSizeOfHeaders = pe.OPTIONAL_HEADER.SizeOfHeadersFOA = Nonefor section in pe.sections:RVAOfFile = section.VirtualAddressPointerToRawData = section.PointerToRawDataSizeOfRawData = section.SizeOfRawDataFOA = calculate(VA, RVAOfFile, PointerToRawData, SizeOfRawData,  ImageBase, SizeOfHeaders)if( FOA != None):breakif(FOA == None):label_result.config(text = "result = {}".format(FOA))return else:# print("The FOA in PE is 0x{:0>8s}\n" .format(hex(FOA)[2:]))label_result.config(text = "result = 0x{:0>8s}".format((hex(FOA)[2:])))return
def Select():path_ = askopenfilename()if path_ == '':File.get()else:path_ = path_.replace('/', '//')File.set(path_)
if __name__ == "__main__":top = Tk()top.title("文件偏移地址计算器")top.geometry("400x250")VA = StringVar()File = StringVar()#File.set(os.path.abspath('.'))LableVA = Label(top, text = "内存虚拟地址").place(x = 20, y = 50)LabelFile = Label(top, text = '文件名').place(x = 20, y = 90)VA_Entry = Entry(top, textvariable = VA).place(x = 100, y = 50)File_Path = Entry(top, textvariable = File ).place(x = 100, y = 90)# entry窗口还可以设置状态 state = "readonly"Result = Label(top, text = "result")Result.place(x = 100, y = 150)Show = partial(Show, Result, VA, File)b1 = Button(top, text = "计算", command = Show, activeforeground = 'red', activebackground = 'pink', pady = 10)b2 = Button(top, text = "打开文件", command = Select, activeforeground = 'red', activebackground = 'pink')#b1 = Button(top, text = "计算", command = lambda: Show(Result, VA, File), activeforeground = 'red', activebackground = 'pink', pady = 10).place(x = 150, y = 200)b1.pack(side = BOTTOM)b2.place(x = 250, y = 90)#b2.pack(side = LEFT)top.mainloop()##print(e1)##print(e2)

实现虚拟内存地址到文件偏移地址的转换相关推荐

  1. 相对虚拟地址,虚拟地址,文件偏移地址

    相对虚拟地址(RVA,Relative Virtual Address):RVA只是内存中的一个简单相对于PE文件装入地址的偏移位置,它是一个"相对地址",或称"偏移量& ...

  2. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  3. 由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  4. 虚拟内存及PE文件与虚拟内存之间的映射

    虚拟内存         Windows 的内存可以被分为两个层面:物理内存和虚拟内存.         如图 1.2.1 所示,Windows 让所有的进程都"相信"自己拥有独立 ...

  5. php qqwry.dat_php读取qqwry.dat ip地址数据库文件程序

    首先看看QQWry.Data文件的内容结构以及解读方式. 一.文件结构 文件主要分三个结构 1.文件头,8个字节:2.数据记录区,不定长度:3.索引区,长度为 7 的整数倍: 二.文件头 文件头的8个 ...

  6. php qqwry.dat_php读取qqwry.dat ip地址数据库文件程序

    文章先来介绍关于qqwry.dat的文件内容结构然后根据它的特点我们可写出读取qqwry.dat ip库的内容找到我们想要的内容. 首先看看QQWry.Data文件的内容结构 ,以及解读方式 . 一. ...

  7. php qqwry.dat_php读取操作IP地址数据库文件QQWry.dat

    我们统计流量的时候需要可以获取用户ip,根据用户ip之后可以通过纯ip真数据库QQWry.dat,获取出用户IP 所在的地理位置,这样可以做出更有意义的统计信息. QQWry.dat请自行搜索下载. ...

  8. 基地址和偏移地址的概念

    首先必须明白 cpu和内存的区别 cpu 中央处理器 内存是物理数据存放的地方 cpu不直接存放数据而是通过内存来存放数据 cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找到对应 ...

  9. 理解文件偏移相对内存偏移节偏移

    问题背景 解决方法 总结 阅读之前注意: 本文阅读建议用时:5min 本文阅读结构如下表: 项目 下属项目 测试用例数量 问题背景 无 0 解决方法 无 0 总结 无 0 问题背景 拜读<0da ...

最新文章

  1. 香港中文大学(深圳)吴保元教授课题组招收全奖PhD、实习/访问学生
  2. UDT源码剖析(四):UDT的GC线程相关过程代码注释
  3. php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]
  4. html5 响应式背景图
  5. 写不出满分作文怎么办,GPT-3 来帮你
  6. C++面试中string类的一种正确简明的写法
  7. 剑指Offer面试题:1.实现单例模式
  8. mongodb查询分页优化(二)
  9. Visio 2013 破解工具 - KMSpico(亲测可用)
  10. Android播放器
  11. 中兴面试(含面试题)
  12. jdk动态代理使用详解
  13. SCTP客户/服务器程序
  14. vmware fusion个人版
  15. 爬虫学习——爬虫之新浪新闻
  16. 爱加密安卓应用加固、谨防“越位木马”借世界杯捆绑手机App
  17. JS学习笔记之内置对象 4.21
  18. RobotFramework入门基础教程
  19. 十二星座匹配对象_七夕,十二星座速配对象
  20. vscode现在无法连接到扩展商店,请稍后再试

热门文章

  1. MySQL之MHA高可用配置及故障切换——超详细的理论+实验!
  2. excel求平均值AVERAGE出现#DIV/0!
  3. c语言find和mid函数的使用方法,excel中mid函数和find函数用法
  4. 代码小游戏:扑克牌类设计
  5. 人工智能在病理诊断过程中能提供哪些帮助
  6. 做好这点,你的项目管理就成功了一半
  7. About 7.10 This Week
  8. 大数据在市场营销方面的几大优势
  9. java的swing教程_java图形化Swing教程(一)
  10. matlab分散度求周长,神经突方向分散度和密度成像在帕金森病早期诊断中的研究进展...