把通用模板机器码直覆盖目标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. hibernate 的一对多关联关系映射配置

    hibernate 是操作实体类: 表是一对多的关系,当创建这2个实体的时候 在一的一方定义一个多的一方的集合 在多的一方定义一个一的一方的对象 表是多对多的关系,当创建这2个实体的时候 在互相中都有 ...

  2. 「NOIP 2020」微信步数(计数)

    「NOIP 2020」微信步数(Luogu P7116) 题意: 有一个 \(k\) 维场地,第 \(i\) 维宽为 \(w_i\),即第 \(i\) 维的合法坐标为 \(1, 2, \cdots, ...

  3. NIO三大组件之Selector选择器

    什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...

  4. Java 多线程 | 并发知识问答总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  5. python-@函数装饰器

    例如@classmethod,@staticmethod的本质就是函数装饰器,其中,classmethod和staticmethod都是python的内置函数 使用@引用已有的函数后,可用于修饰其他函 ...

  6. Genymotion下载模拟器慢

    •问题来源 Genymotion 是个很不错的 Android 模拟器,系统更新快,启动速度快: 但是服务器在国外,Android 镜像下载起来那个速度就不敢恭维了: 当然如果你可以[科学,上网]就另 ...

  7. SpringBoot中整合Redis、Ehcache使用配置切换 并且整合到Shiro中

    在SpringBoot中Shiro缓存使用Redis.Ehcache实现的两种方式实例 SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这sh ...

  8. java面试一日一题:mysql事务是如何实现的

    问题:请讲下mysql的事务是如何实现的 分析:该问题主要考察对事务的理解及实现方式: 回答要点: 主要从以下几点去考虑, 1.对事务的概念的理解? 2.事务的实现方式? 讲到mysql的事务,很快可 ...

  9. Python是啥?为什么这么多职业人和学生就算报班也要学它?!

    嗨,大家好 这里是汐仔 首先我们先来考究一下近几年的头条和新闻. 1.早在2018年python就已经被纳入高考之一了 2.Python加入全国计算机等级考试,从2018年九月起新增为大学计算机二级考 ...

  10. BUAA_OO_第二单元

    BUAA_OO_2020_UNIT2 一.程序结构分析 第五次作业 UML & Mertrics ​ 电梯的调度问题,实质上就是任务的请求与分配问题,笔者在第五次作业中采用简单的"生 ...