《Windows PE》4.1.4 手工重构导入表

接下来我们做一个稍微复杂一些的实验,实验需要四个程序:

       HelloWorld.exe:弹出MessageBox窗口(实验1已实现)。

       Regedit.exe:添加注册表启动项。

       LockTray.exe:锁定任务栏窗口。

UnLockTray.exe:解锁任务栏窗口。

       【注】为了减少不必要的麻烦,上述四个程序都使用32位汇编代码实现。

实验二十八:手工重构导入表

       ■实验要求

       ●分别编译实现上述四个实验程序。

       ●Regedit.exe程序的功能是将LockTray.exe添加到注册表启动项中。

       ●手工实现,将Regedit.exe程序的代码、数据、IAT表和导入表添加到HelloWorld.exe程序中,并可以正确运行。

●HelloWorld.exe源码:(略)

●LockTray.exe源码:

       ;------------------------

;Filename:LockTray.asm

;实验28:锁定任务栏

;by:bcdaren

;编写日期:2021.04.26

;========================================================

    .386

    .model flat,stdcall

    option casemap:none

include    windows.inc

include    user32.inc

includelib user32.lib

include    kernel32.inc

includelib kernel32.lib

;数据段

.data

szClassName      db  'Shell_TrayWnd',0

hTray                  dd  ?

;代码段

.code

start:

    invoke FindWindow,addr szClassName,0

    mov hTray,eax

    invoke ShowWindow,hTray,SW_HIDE;SW_SHOW解锁

    invoke EnableWindow,hTray,FALSE

    invoke ExitProcess,NULL

end start

       ●UnLockTray.exe源码:(略)

●Regedit.exe源码:

;------------------------

;Filename:regedit.asm

;实验28:添加注册表启动项

;by:bcdaren

;编写日期:2021.04.26

;========================================================

    .386

    .model flat,stdcall

    option casemap:none

include    windows.inc

include    user32.inc

includelib user32.lib

include    kernel32.inc

includelib kernel32.lib  

include    advapi32.inc

includelib advapi32.lib

;数据段

.data

szSubKey db  'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run',0

szValueName        db  'NewValue',0

szData                  db  'D:\code\winpe\ch04\LockTray\LockTray.exe',0       ;41个字节

hKey       dd  ?

;代码段

.code

start:

    invoke RegCreateKey,HKEY_LOCAL_MACHINE,addr szSubKey,addr hKey

    invoke RegSetValueExA,hKey,addr szValueName,NULL,REG_SZ,addr szData,41

    invoke RegCloseKey,hKey

    invoke ExitProcess,NULL

end start

●手工重构导入表

第一步:新建一个HelloWorld.exe程序的副本。在WinHex中新建一个空白文件,并将HelloWorld.exe复制到空白文件中。

第二步:定位副本文件中的.data节区,将Regedit.exe程序的.data节区数据写入到副本文件.data节区的结尾处。

00000800   68 65 6C 6C 6F 00 48 65  6C 6C 6F 2C 77 65 6C 63   hello.Hello,welc

00000810   6F 6D 65 20 74 6F 20 50  45 21 00 53 4F 46 54 57   ome to PE!.SOFTW

00000820   41 52 45 5C 57 4F 57 36  34 33 32 4E 6F 64 65 5C   ARE\WOW6432Node\

00000830   4D 69 63 72 6F 73 6F 66  74 5C 57 69 6E 64 6F 77   Microsoft\Window

00000840   73 5C 43 75 72 72 65 6E  74 56 65 72 73 69 6F 6E   s\CurrentVersion

00000850   5C 52 75 6E 00 4E 65 77  56 61 6C 75 65 00 44 3A   \Run.NewValue.D:

00000860   5C 63 6F 64 65 5C 77 69  6E 70 65 5C 63 68 30 34   \code\winpe\ch04

00000870   5C 4C 6F 63 6B 54 72 61  79 5C 4C 6F 63 6B 54 72   \LockTray\LockTr

00000880   61 79 2E 65 78 65 00 00  00 00 00 00 00 00 00 00   ay.exe..........

【注意】下面的步骤中只需要插入advapi32.dll模块中3个注册表函数的IAT、INT、函数名和模块名数据,剔除重复的ExitProcess导入函数数据。

第三步:将Regedit.exe程序的IAT表数据插入到副本文件IAT表的结尾处。

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000600   76 20 00 00 00 00 00 00  5C 20 00 00 00 00 00 00   v ......\ ......

00000610   A6 20 00 00 88 20 00 00  96 20 00 00 00 00 00 00   ?..?..?......

第四步:将Regedit.exe程序的导入表描述符数据插入到副本文件导入表描述符结尾处。

00000620   54 20 00 00 00 00 00 00  00 00 00 00 6A 20 00 00   T ..........j ..

00000630   08 20 00 00 4C 20 00 00  00 00 00 00 00 00 00 00   . ..L ..........

00000640   84 20 00 00 00 20 00 00  54 20 00 00 00 00 00 00   ?... ..T ......

00000650   00 00 00 00 B8 20 00 00  00 20 00 00 00 00 00 00   ....?... ......

第五步:将Regedit.exe程序的INT表数据插入到副本文件INT表的结尾处。

00000670   76 20 00 00 00 00 00 00  5C 20 00 00 00 00 00 00   v ......\ ......

00000680   A6 20 00 00 88 20 00 00  96 20 00 00 00 00 00 00   ?..?..?......

第六步:将Regedit.exe程序的函数名和DLL名数据写入到副本文件函数名和DLL名数据的结尾处。

00000690   B1 01 4D 65 73 73 61 67  65 42 6F 78 41 00 75 73   ?MessageBoxA.us

000006A0   65 72 33 32 2E 64 6C 6C  00 00 9B 00 45 78 69 74   er32.dll..?Exit

000006B0   50 72 6F 63 65 73 73 00  6B 65 72 6E 65 6C 33 32   Process.kernel32

000006C0   2E 64 6C 6C 00 00 B7 01  52 65 67 43 6C 6F 73 65   .dll..?RegClose

000006D0   4B 65 79 00 BA 01 52 65  67 43 72 65 61 74 65 4B   Key.?RegCreateK

000006E0   65 79 41 00 E7 01 52 65  67 53 65 74 56 61 6C 75   eyA.?RegSetValu

000006F0   65 45 78 41 00 00 61 64  76 61 70 69 33 32 2E 64   eExA..advapi32.d

00000700   6C 6C 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ll..............

第七步:删除.rdata节区多余空字节,使.data节区保持00000800H地址不变。修正IAT表、导入表描述符和INT表。

00000600   AA 20 00 00 00 00 00 00  90 20 00 00 00 00 00 00   ?....... ......

00000610   C6 20 00 00 D4 20 00 00  E4 20 00 00 00 00 00 00   ?..?..?......

00000620   70 20 00 00 00 00 00 00  00 00 00 00 B8 20 00 00   p ..........?..

00000630   00 20 00 00 78 20 00 00  00 00 00 00 00 00 00 00   . ..x ..........

00000640   9E 20 00 00 08 20 00 00  80 20 00 00 00 00 00 00   ?... ..€ ......

00000650   00 00 00 00 F6 20 00 00  10 20 00 00 00 00 00 00   ....?... ......

00000660   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

00000670   AA 20 00 00 00 00 00 00  90 20 00 00 00 00 00 00   ?....... ......

00000680   C6 20 00 00 D4 20 00 00  E4 20 00 00 00 00 00 00   ?..?..?......

第八步:将Regedit.exe程序的.text节区数据复制到.text节区,并修正参数地址以及FF25跳转地址。

00000400   68 87 30 40 00 68 1B 30  40 00 68 02 00 00 80 E8   h?@.h.0@.h...€?

00000410   52 00 00 00 6A 29 68 5D  30 40 00 6A 01 6A 00 68   R...j)h]0@.j.j.h

00000420   55 30 40 00 FF 35 87 30  40 00 E8 3D 00 00 00 FF   U0@.5?@.?...

00000430   35 87 30 40 00 E8 2B 00  00 00 6A 00 68 00 30 40   5?@.?...j.h.0@

00000440   00 68 06 30 40 00 6A 00  E8 07 00 00 00 6A 00 E8   .h.0@.j.?...j.?

00000450   06 00 00 00 FF 25 08 20  40 00 FF 25 00 20 40 00   ....%. @.%. @.

00000460   FF 25 10 20 40 00 FF 25  14 20 40 00 FF 25 18 20   %. @.%. @.%.

00000470   40 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   @.%. @.........

【注】需要修改灰色背景的字节。

第九步:删除.text节区多余空字节,使.rdata节区起始位置00000600H地址不变。修正数据目录项导入表项的RVA地址为00002020H。

【可选项】可以选择修改的字段包括导入表的大小、IAT表的大小、.text节区的实际大小、.rdata节区的实际大小和.data节区的实际大小。如果不修改上述字段,不影响程序的运行。说明加载PE时不会检查上述字段。

  总结

       实验二十八等于手动将两个程序合并为一个新的程序。也可以理解为在原程序的基础上,手动添加了一个新的功能。

       需要特别注意的是:

       1..rdata节区内的字符串都是ASCII字符串,且偶数字节对齐。

       2..text节区内FF 25跳转到函数地址表的顺序必须与IAT表内的顺序相对应。

       3.IAT表内RVA地址的顺序可以任意排列,但是必须与.text节区内FF 25跳转到函数地址表的顺序一致。

       4.在未绑定的情况下,IAT表和INT表完全一致。

       5.可以增加节区内的数据,但是尽量不要改变节区文件偏移地址的起始位置,并保持512个字节对齐。

       6.手工重构导入表,需要将两个程序的各个节区进行合并。其中较为复杂的就是IAT表和导入表的重构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443473.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas的用法

1.简介: pandas是一个开源的python数据分析库提供了快速,灵活和表达力强的数据结构,使数据清洗和分析工作变得更加简单易行。pandas的核心数据结构是DataFrame和Series 2.DataFrame的基本操作: DataFrame是pandas库中的一个二维…

【项目记录】大模型基于llama.cpp在Qemu-riscv64向量扩展指令下的部署

概述 本文在qemu-riscv64平台上,利用向量扩展指令加速运行基于llama.cpp构建的大模型。 参考博客链接: Accelerating llama.cpp with RISC-V Vector Extension 基于RVV的llama.cpp在Banana Pi F3 RISCV开发板上的演示 llama.cpp工程 Llama.cpp是一个基…

AI教父荣获2024诺贝尔物理学奖:杰弗里·辛顿和他的深度学习之路!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作微软Office及WPS办公文档的应用(阅读、编辑、保存等),支持编辑文档时保留修改痕迹,支持书签位置内容动态填充,支持公文套红,支持文档…

springMVC添加webapp

项目结构-->模块-->找到想添加的模块下的web 点击号 添加路径 会在.../src/main/目录下自动生成目录

Golang | Leetcode Golang题解之第467题环绕字符串中唯一的子字符串

题目: 题解: func findSubstringInWraproundString(p string) (ans int) {dp : [26]int{}k : 0for i, ch : range p {if i > 0 && (byte(ch)-p[i-1]26)%26 1 { // 字符之差为 1 或 -25k} else {k 1}dp[ch-a] max(dp[ch-a], k)}for _, v :…

【xilinx-versal】【Petalinux】I2C驱动开发问题记录

问题 调试中发现系统起来后无I2C设备。 仔细查找后发现没有配置versal的I2C控制器。 解决方法 打开versal的I2C控制器的配置 起来后I2C设备注册成功

使用idea和vecode创建vue项目并启动(超详细)

一、idea创建vue项目 创建项目之前先下载好插件 新建项目找到vue生成器 写好名称,找到自己需要存放的地址,node解释器安装方式可以看我上一个博客,vueCLI是选择vue的版本,我们可以使用idea自带的vue版本默认是vue3,创…

标准正态分布的数据 tensorflow 实现正态分布图,python 编程,数据分析和人工智能

import tensorflow as tf import matplotlib.pyplot as plt # 设置随机种子以获得可重复的结果 tf.random.set_seed(42) # 生成正态分布的数据 # mean0 和 stddev1 表示生成标准正态分布的数据 # shape(1000,) 表示生成1000个数据点 data tf.random.normal(mean0, stddev1, …

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

k8s中pod的管理

资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务 所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器&…

NLP: SBERT介绍及sentence-transformers库的使用

1. Sentence-BERT Sentence-BERT(简写SBERT)模型是BERT模型最有趣的变体之一,通过扩展预训练的BERT模型来获得固定长度的句子特征,主要用于句子对分类、计算两个句子之间的相似度任务。 1.1 计算句子特征 SBERT模型同样是将句子标记送入预训练的BERT模型…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态: Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时,从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…

【源码+文档+调试讲解】二手物品调剂系统NODEJS

摘 要 二手物品调剂系统是一种在线平台,旨在促进用户之间的二手物品交易。该系统提供了一个方便的界面,让用户能够发布、浏览和搜索二手物品信息。用户可以根据自己的需求和兴趣,筛选出合适的物品,并通过系统与卖家进行联系。系统…

手撕Python之生成器、装饰器、异常

1.生成器 生成器的定义方式&#xff1a;在函数中使用yield yield值&#xff1a;将值返回到调用处 我们需要使用next()进行获取yield的返回值 yield的使用以及生成器函数的返回的接收next() def test():yield 1,2,3ttest() print(t) #<generator object test at 0x01B77…

气象大模型预测天气预报的原理

随着气象科学的发展&#xff0c;气象预报已经从早期的经验判断发展到基于数值模拟的高精度预测。气象大模型&#xff0c;作为一种强大的计算工具&#xff0c;利用大规模数据和复杂的物理模型&#xff0c;提供了精准的天气预报服务。本文将介绍气象大模型的原理&#xff0c;以及…

嵌入式面试——FreeRTOS篇(六) 任务通知

本篇为&#xff1a;FreeRTOS 任务通知篇 任务通知简介 1、任务通知介绍 答&#xff1a; 任务通知&#xff1a;用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需要另外创建一个结构体&#xff0c…

新个性化时尚解决方案!Prompt2Fashion:自动生成多风格、类型时尚图像数据集。

今天给大家介绍一种自动化生成时尚图像数据的方法Prompt2Fashion。 首先创建了一组描述&#xff0c;比如“适合婚礼的休闲风格服装”&#xff0c;然后用这些描述来指导计算机生成图像。具体来说&#xff0c;他们使用了大型语言模型来写出这些服装的描述&#xff0c;接着将这些描…

SpringBoot统一日志框架

在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。 1.日志框架的选择 市面上常见的日志框架有很多&#xff0c;它们可以被分为两类&#xff1a;日志门面&#xff08;日志抽象层&#xff09;和日志实…

【万字长文】Word2Vec计算详解(三)分层Softmax与负采样

【万字长文】Word2Vec计算详解&#xff08;三&#xff09;分层Softmax与负采样 写在前面 第三部分介绍Word2Vec模型的两种优化方案。 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff0…