把通用模板机器码直覆盖目标PE

这个地方真是尝试了好久,遇到很多坑点,Win PE那本书上的东西有点不够,也就直接写书上的例子会发现很多地方不是说的那样,里面提供的信息太少了,就比如里面并没有提被注入的目标PE的随机基址问题,比如说中给了一套模板(模板里面有一些变量定义了没有使用,还有获取Kernel32.dll的地方是错误的,还有通用模板运行的时候内存溢出了...)额...总之不要在意这些细节。我自己摸索着弄吧,这个地方。

今天打算尝试几种姿势手动把自己的模板机器码添加到目标PE某个位置让其加载我们的功能。

对于模板代码来说,要注意的问题之前说过了,注意导入表、注意数据段、注意重定位等等。其实重定位还是很好解决的。导入表和数据段可以解决,但是很麻烦,需要重构,这也就意味着给我们的目标无形中带来了兼容性的问题。学习的时候可以过度开发。深刻研究,但是一旦你是为了实现功能而写代码的时候建议一定要从简,我们的目的是实现功能。出招过慢通常是因为姿势过多[这个是别人提醒我的话]。OK不废话,说正题。

尝试1:

(1)随便写一个程序,作为宿主文件,记住代码多写点。别弄的代码段只有很少内容,结果自己注入的模板字节码比原来.text还大。[记住这个文件的随机基址一定要关闭,如果你用的是VS的话,在这里]

(2)编写一个通用模板程序(加载dll的),汇编代码在最后,开发环境(vs2012+masm32),这个程序的基址随不随机无所谓,因为一会只是把.text段部分拷贝过去。

下图是生成的载体EXE:

(3)然后把1生成的那个exe,的程序入口改成对应FOA=0X400的地方。在把2生成的EXE的代码段部分拷贝到1的FOA=0X400处,运行1生成的exe会发现成功加载了相关dll。

下图是改PE头里面程序入口地址:

然后是替换代码段的部分:

最后那个E9 XXX 我没有修改,这个地方是留着最终嵌入到目标程序某个位置,执行完之后最好是跳转回原来的函数入口,这样就不会影响原目标载体的正常执行,同时又能执行我们自己的代码逻辑。

这个实验是要是为了验证载体的独立行和可行性。因为源程序里并没有嵌入代码里的那些调用函数,也没有导入表,也没有数据段。这样只要让目标文件的逻辑指向咱们的入口就OK了,咱们是完全独立的。同时上面注意一个问题,就是再写被注入载体例子的时候,我是关掉了随机基址选项。接下来实验二尝试打开随机基址选项。因为实际嵌入别人程序很多时候对方的随机基址选项是开着的。开不开随机基址,看PE头信息就能看出来:

尝试2:

这次打算解决上一个例子的不足。关于随机基址的问题,在平时使用的过程中,通常要做的是嵌入到别人的程序里,所以咱们认为很多的程序的那个选项是开着的,也就是基址是随机的,这个地方我刚刚做了很多尝试,我一开始是发现我嵌入的代码在call的地方失败了,call的地址什么都没有,然后我就在嵌入模板里在这个位置上做了很多次尝试,结果都失败了。我用全局变量重定位的姿势搞了这个call,结果还是不行(可能是姿势错误)。后来我反复编译我自己的一个helloworld[因为我也不知道到底那个选项改了什么],发现那个选项对代码段没有影响,额...既然我的代码是独立可以运行的,同时那个东西对代码段又没有影响,那是不是在我的程序里,我可以直接把那个随机的选项抹掉:

结果我是在PE头里找到那个位置,把那个改成0,发现可以成功运行,然后我又找来chrome等别的程序,测试了几个,发现可以。

然后打算下个PE比较工具看下具体细节,随便点击了一个界面进去了:

看到的这个:

一如既往的”喜欢的界面”,看那个大大橙色点击下来你就会下载一个你都不知道是啥的东西,对,都怪你,不仔细看细节。然后在下面不起眼的地方找到了“真实”的下载地址,下载了个这货:

依然很熟悉的套路

百度上搜索东西,下载很多都是下载个这么个东西,超级大礼包。[打着签名哦,而且国内杀软几乎都方行了],也许上面也是,都没违规只是做的不明显让你取消安装。但是国外貌似不承认这种所谓的不违规:

下面是avast上执行这个exe的结果,执行前没报毒,也就是祖国的这款大礼包程序并没有对avast的动态扫毒做免杀,打着签名还被avast报毒,这肯定是一点都没有免杀...

最后经过重重困难,在虚拟上安装了UC,然后运行不起来。FK。浪费时间。算了这个地方酱紫。继续 实验2 的测试流程

然后就硬着试了一次:把目标PE头里面的这个字段直接抹成0,然后在用 实验1 的姿势去做,结果发现是可以的。OK 说下这次尝试的姿势步骤:

(1)找到本机chrome.exe,修改PE头的两个地方

{

A:基部重定位表地址为0

B:程序入口地址RVA(FOA=0x400)

}

(2) 然后编译嵌入模板文件,把.text(FOA=400)处的机器码拷贝到(1)改变之后的对应FOA=0X400的位置上。

(3) 把测试dll和改好后的exe放到,chrome原来文件夹下,记住改名为chrome.exe,无意发现,chrome.exe如果换了名字之后就运行不起来了,额...不知道这个是处于防护还是什么,应该不是防护,防护的话这么做感觉没什么卵用,难道是怕别人做类似chrome->chrome2,my.exe->chrome.exe 这类事? 反正便面上看没卵用。

(4) 运行chrome会发现相关dll被加载,点击确定之后chrome崩溃,崩溃是必然,因为首先没有给最后的那个跳转指令E9 XXXX更改实际值,同时因为暴力覆盖了原来代码部分,导致代码损坏。So这就是下个实验要做的事,把代码嵌入到某个位置,比如某个间隙,某个段(比如最后一段),或者自己单独创建一个段。放在里面等等。然后修改函数入口跳转进来,做完事再跳转到之前该跳转的位置。

下面是实验2的一些细节截图:

下图成功通过chrome.exe加载了dll。

下图是我本机上原版chrome重命名后起不来,弹的错误窗口:

劫持过程中发现360弹窗,注意木马名称。之前没见过这个颜色的窗,我没记错的话之前是见过红色的[应该是加载服务或者驱动的时候],黄色的[镜像劫持或者hook的时候,直接cmd强行修改密码也是黄色]...不过不重要,可能就是随便换个皮肤吧,还顺便打个广告。主要是看描述和名称。同时还发现一个问题,如果是改chrome的话发现有保护,改自己写的代码并没有保护,没猜错应该是有这种特判逻辑,有时间研究下怎么过这个。不过这个不重要了,平时很少分析国内杀软。也不知道国内杀软都什么套路,就像发现电脑管家的一个优点就是界面贼帅,但是随便TDL无签名加上一个驱动,然后干掉它。全程没有提示。额.....

360提示报毒之后,被修改的chrome.exe被干掉了,但是那个劫持I.dll,没被清理掉。这个地方差评,也许是还没到我加载这个DLL的时候就已经被截断了,所以就直接把exe干了。然后并没有在沙箱里跑我,看我操作那些文件,进一步清理。不过这样做也可以理解。没有理由继续深一步清理。产品---用户,效率---过度开发。很多时候过度开发就是在浪费生命。

之后的实验是在不破坏原来PE结构的前提下附加我们的补丁代码。姿势有很多,我觉得我会选择扩展最后一节大小来做这个事,不过越简单的东西也就越容易被检测出来,想到最后一节扩展,突然想起个事,最后一节改完之后,然后对其,然后修改PE头。貌似对于大签名的文件来说签名还是正常的。这个之前分析过。BUT,这么改肯定要修改PE头的另两个字节,入口地址和代码重定位值。签名跟定无效了。So......

感觉今天废话说的有点多,可能是周末时间多,无聊吧。看到都好奇,就简单看看。

Windows PE变形练手3-把通用模板机器码直接覆盖目标PE的更多相关文章

  1. Windows PE变形练手1-用PE自己的机器码修改自己的逻辑

    PE变形练手1-用PE自己的机器码修改自己的逻辑 就是找一个PE文件,用自己的部分代码部分覆盖或者而修改自己另一个代码部分的补丁姿势(现实中使用很少,极少数破解可以用到.这次例子目的是了解PE). 第 ...

  2. Windows PE变形练手2-开发一套自己的PE嵌入模板

    PE嵌入模板 编写一段代码,生成一个已经处理过重定位信息,同时所有的内容都在代码段里,并且没有导入表的PE程序,把这个程序嵌入到其他PE的相关位置,能够独立的运行,接下来是整理了2个模板,一个是Hel ...

  3. Windows API初练手 -- 疯狂写文件代码

    警告:恶作剧软件,慎用!仅供初学者研究代码所用!!! 提示:默认文件创建目录在"D:\test",如果需要使用的话请自行更改目录. 1. Windows API 版本 (调用系统函 ...

  4. Windows PE 第十二章 PE变形技术

    PE变形技术 这章东西太多,太细了.这里我只记录了一些重点概念.为后面学习做铺垫. PE变形:改变PE结构之后,PE加载器依然可以成功加载运行我们的程序. 一 变形常用技术: 结构重叠技术.空间调整技 ...

  5. web前端学习部落22群分享给需要前端练手项目

    前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程, ...

  6. webpack练手项目之easySlide(三):commonChunks(转)

    Hello,大家好. 在之前两篇文章中: webpack练手项目之easySlide(一):初探webpack webpack练手项目之easySlide(二):代码分割 与大家分享了webpack的 ...

  7. webpack练手项目之easySlide(一):初探webpack (转)

    最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力.     webpack是一个前端的打包管理工具,大家可以前往:http:/ ...

  8. Vue练手项目(包含typescript版本)

    本项目的git仓库https://github.com/lznism/xiachufang-vue 对应的使用typescript实现的版本地址https://github.com/lznism/xi ...

  9. C语言练手游戏-控制台输出一个会移动的坦克

    把C语言的知识融合起来做一个练手的小游戏项目,将自己掌握到的数据结构.数组.函数.宏定义等知识综合利用,增加对语法的熟练程度. 操作系统: windows 10 x64 编译IDE : VS2015 ...

随机推荐

  1. python带颜色打印字符串

    python带颜色打印字符串 之前调试pwn题的时候,有时候需要将某些特别的,重要的信息用不一样的颜色打印出来.查阅一些资料,了解了print函数的特性后,自己写了一个脚本,可以用来获取带颜色信息的字 ...

  2. 如何自学成 Python 大神?这里有些建议

    人生苦短,我用 Python.为什么?简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状:网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲解基础知 ...

  3. 爬虫必知必会(5)_scrapy框架_基础

    一.移动端数据的爬取 基于某一款抓包工具,fiddler,青花瓷,miteproxy fillder进行一个基本的配置:tools->options->connection->all ...

  4. java IO NIO BIO 最权威的总结

    1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/N ...

  5. 解决无法通过浏览器访问docker成功安装rabbitMQ后页面问题

    我发现了问题后,花了两天的时间解决了这个问题. 一.测试在docker本机中使用curl "ip地址:端口" 查看是否能访问成功,结果是没问题,排除了docker安装失败的问题 二 ...

  6. 学习笔记-cordova 限制app横屏

    禁止手机app横竖屏幕转换,只需在根目录下的 config.xml 中添加如下内容 <preference name="orientation" value="po ...

  7. Webpack的基本配置和打包与介绍(二)

    1. 前言 在上一章中我们学习到了webpack的基本安装配置和打包,我们这一章来学学如何使用loader和plugins 如果没看第一章的这里有传送门 2. Loader 2.1 什么是loader ...

  8. 【近取 key】NABCD分析

    项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-NABCD分析 我在这个课程的目标是 提升工程能力和团队意识,熟悉软件开发的流程 这个作 ...

  9. OO_Unit1_Summary

    经历了十分充实(痛不欲生)的三周不一样的码代码的生活,让我对通宵oo有了新的认识.往届学长学姐诚不欺我 第一次作业 需求分析 第一次需求非常简单(相比较后两次作业而言),仅为简单多项式求导,而且仅包含 ...

  10. Java性能调优实战,覆盖80%以上调优场景

    Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...