把通用模板机器码直覆盖目标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. 爬虫必知必会(6)_提升scrapy框架爬取数据的效率之配置篇

    如何提升scrapy爬取数据的效率:只需要将如下五个步骤配置在配置文件中即可 增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_ ...

  2. [SDOI2009] HH的项链(待续)

    [SDOI2009] HH的项链(待续) 题目大意:对一个由若干个数字(可重复)组成的数列,询问\([l,r]\)中出现的不同的数字数量 考试时(考试时范围小)用的暴力,but,没有考虑数字0的情况, ...

  3. Linux系统浮动IP的配置

    什么是浮动IP,为什么要配置浮动IP 首先说一下为什么要配置浮动IP. 原文链接:https://blog.csdn.net/readiay/article/details/53538085 现在有一 ...

  4. 通俗易懂,android是如何管理内存的

    封面来源:https://medium.com/android-news/android-performance-patterns-rescue-tips-8c1e4c7cb1f0 前言 很高兴遇见你 ...

  5. 阿里云 RTC QoS 弱网对抗之变分辨率编码

    本文为 QoS 弱网优化系列的第二篇 作者|安基程.田伟峰 审校| 泰一 视频编码中的变分辨率问题及解决 变分辨率在弱网场景的实际应用中非常常见,网络状况不好的时候降低分辨率可以降低码率,减少块效应, ...

  6. DAOS 分布式异步对象存储|安全模型

    DAOS 使用了一个灵活的安全模型,将身份验证和授权分离开来.它的设计令其对 I/O 的影响被降到最小. DAOS 对用于 I/O 传输的网络结构没有提供任何传输安全性保障.在部署 DAOS 时,管理 ...

  7. 【macOS】显示/隐藏 允许“任何来源”的应用

    问题产生 在macOS中安装某些版本软件时会提示: "xxx"已损坏,打不开.您应该将它移动到废纸篓. 某些情况下实际上并不是软件已损坏,而是因为macOS对于开发者的验证导致软件 ...

  8. 【笔记】《Redis设计与实现》chapter8 对象

    8.1 对象的类型与编码 Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性.encoding属性和ptr属性 typedef struc ...

  9. 一起来看Java设计思想之23种设计模式

    目录 怎么使用设计模式 23种设计模式 创建型模式 结构型模式 行为型模式 总结 怎么使用设计模式 为什么要使用设计模式? 编写代码,写接口.写类.写方法 用设计模式做设计的作用是什么? 指导.规定如 ...

  10. 2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯

    DevOpsDays 是一个全球知名的系列技术会议品牌,内容涵盖了软件开发.自动化.测试.安全.组织文化以及 IT 运营的社区会议等.DevOpsDays 由 DevOps 之父 Patrick De ...