之前只是知道怎样脱去fsg壳,对壳的压缩算法没有太多的注意,今天就对算法进行一些分析

  1. 使用的版本是fsg1.33,首先用peid查壳:

  2.将程序载入OD,看到如下代码

  可以看到这段代码主要是从以esi为起始的地方取出dword类型的数据存入寄存器中,那么这一段数据是什么呢?在数据窗口中跟随一下:

  看到一些长得像代码地址的一些数据,在后面的分析中,也会发现这些地址或者加上偏移就是程序要执行的代码的地址或者是要解压缩的数据的地址

我们单步走到第一个call的位置,可以看到各寄存器的值如下:

  而且4001B0被压入了栈中:

  这里可以看到上面的那些地址分别被存入了ebx,edi,esi.这里esi的值等于数据窗口中的第三个地址加1,是因为在4103F1处执行了movs指令。这里关于dl和dh的赋值我推测是用来影响标志位从而控制程序执行的流程的,在后面的分析中也发现除了影响标志位以外,EDX没太多参与其他运算

  这里的call指令将跳转到ebx指向的代码,跟进去看看:

  这段代码后面会经常被执行,可以看到代码主要是对dl进行运算,而运算的目的就是为了修改标志位。还可以看到当zf标志位等于1的时候esi的值将自加1.因此这里除了影响了标志位外,很可能也是在调整将要被解压缩的源地址

  继续往下走:

  后面又是在重复的执行ebx指向的代码,先往下走:

可以看到费了这么多功夫程序就是调整了esi的值,修改了一些标志位,注意这里eax和ecx被置零了。并不是eax存放的地址没用了而是前面已经压入栈了

  这里有一个跳转,跳过去看看:

  继续往下走,410426有一个未实现的跳转,走到jmp位置,看各寄存器的值:

  jmp指令跳到了410446

  单步往下走:

这里有一个movs指令,在数据窗口中跟随一下esi指向的地址:

什么情况,程序在这里用0去覆盖0?其实这里程序是为了抬高edi的值。为什么没说esi,因为esi的值前面在41044D处被压入了栈,在movs执行完后又被弹出了栈。

----------------------------------------------------------------------------------------------------------------------------------------------------

先分析到这里,先吃饭,2015年10月16日11:40:39,by:http://www.cnblogs.com/wd1001/

  继续往下走是一个jmp指令,看一下他跳到了那里:

程序又跳回了4103F4,不过到这里标志位和寄存器发生了一些变化,程序的流程可能就跟之前不同了:

看到这个之前未实现的跳转实现了,可以看到下一条将要执行的是movs指令,在数据窗口中跟随一下esi指向的位置:

可以推测出壳程序将要从这里解压出原程序真正的数据

下面是edi指向的位置:

继续单步走直到4103F6处的跳转不再往回跳,此时edi指向的位置的数据变成了:

此时esi和edi的值分别为:40C91D和401009

  继续单步走,直到下一个跳转

这之前不过是做了一些调整,修改了eax,ecx,edx和一些标志位

  往下看跳到了哪里:

又来到了这个位置,不过这次跟刚才不一样了这时edi减去eax的地方不再是0了,走到410452的时候,esi和edi的值分别是:401004和401009

而此时401004处是刚才movs指令传送过来的数据:

因此这里不仅仅只是为了抬高edi的值了,rep movs后的结果:

  后面又是jmp跳回4103F4,因此这里是循环进行解压缩了,解压缩结束后:

edi的值变成了404E9B,而在数据窗口中可以看到401004到404E9B已经有了数据:

  继续往下走,看到刚才压入栈中的4001B0,被弹出了栈:

esi变成了4001B0,数据窗口中跟随esi指向位置:

又看到一些类似地址的数据,可以推测接下来将要对另一块数据进行解压缩

  继续往下走:

可以看到程序又要往前跳了,而此时edi的值变成了40500,而且esi又被压入了栈中,上面的mov edx esi,将esi的值临时存入了edx,在这里又将edx给了esi.因此接下来的代码解压缩的源地址还是紧接着前面的,即:40EB53

  接下来看跳回去的代码:

程序又跳回了这段解压缩程序,只是esi,和edi发生了变化,此时在数据窗口中跟随edi指向的数据:

后面的解压缩算法跟刚才一样,直接跳过解压程序

405000处的数据已经完成了解压缩,跟401004处一样,第一趟走下来只是为了抬高edi,因此实际解压缩的目的地址是405004.后面以406004,407004,40658A为目的地址进行了解压缩

  解压缩完成后再看后面的代码:

这里修改了ebx的值,继续往下走:

从这里可以看到被修改的ebx指向了一个系统函数LoadLibrary的地址,而函数的参数是SHELL32.dll

  继续往下走是一个循环:

函数的目的是让esi指向SHELL32.dll这个字符串的后一个字符串,在数据窗口中看一下(这一段数据是前面解压缩出来的):

循环结束后是dec语句,把406598处的U改成了T,接下来又是一个跳转到一个dec语句:

将406598处的T改成了S:

接下来是一个大跳转,按enter过去可以看到就是程序的入口了。但这里没有跳,继续往下走

调用了GetProcAddress函数,从栈中可以看出这里载入的函数就是刚才修改了名字后的函数

下面将函数返回的地址存入了edi指向的地址中

  往下走是一条jmp指令,程序又跳回了刚才那个循环让esi指向了下一个字符串

因此最后在跳转到程序入口前程序对解压出来的数据进行了调整,即最后解压出来的这一段数据就是程序将要调用的系统函数,不过前面解压出来的函数名的第一个字母需要进行调整,调整完后用GetProcAddress函数载入并将函数地址存放在指定位置最后跳转到正常的入口:

  3.至此壳的代码就分析完了,总结一下,其实就是两个大的过程,第一个过程就是从源地址处解压缩数据到目的地址。其中有一段数据是程序将要调用的函数和所在的dll文件名,不过直接解压出来的函数名的第一个字母需要调整,第二个过程就是调整函数名并用GetProcAddress函数载入并将返回值即函数地址存放起来,最后跳转到程序入口。

FSG1.33解压缩算法分析的更多相关文章

  1. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  2. C#压缩、解压缩文件(夹)(rar、zip)

    主要是使用Rar.exe压缩解压文件(夹)(*.rar),另外还有使用SevenZipSharp.dll.zLib1.dll.7z.dll压缩解压文件(夹)(*.zip).需要注意的几点如下: 1.注 ...

  3. RapidMiner的基本使用(一个医疗数据的简单决策树算法分析)

    RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) 需要分析的文件: 右键分别创建读取excel数据,选择属性,设置 ...

  4. 使用VC++压缩解压缩文件夹

    前言   项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码,  都不是很称心, 现在把我自己实现的代码和大家分享. 要求: 1.使用Unicode(支持中文). 2.使用源代码.(不使用静态或 ...

  5. Linux下的压缩与解压缩

    1 .gz 1)压缩 root@xiaohuang-virtual-machine:/home/xiaohuang/桌面/hellow/hellow# gzip 2.txt 3.txt root@xi ...

  6. 利用Java进行zip文件压缩与解压缩

    摘自: https://www.cnblogs.com/alphajuns/p/12442315.html 工具类: package com.alphajuns.util; import java.i ...

  7. 免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)

    前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib.在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官 ...

  8. CSharpGL(33)使用uniform块来优化对uniform变量的读写

    CSharpGL(33)使用uniform块来优化对uniform变量的读写 +BIT祝威+悄悄在此留下版了个权的信息说: Uniform块 如果shader程序变得比较复杂,那么其中用到的unifo ...

  9. C#开发微信门户及应用(33)--微信现金红包的封装及使用

    我在上篇随笔<C#开发微信门户及应用(32)--微信支付接入和API封装使用>介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行 ...

随机推荐

  1. XJOI——NOIP2015提高组模拟题19-day1——观光旅行

    http://www.hzxjhs.com:83/contest/493/problem/3 [题目大意] 给定一个有n(n<=500000)个点,m(1<=500000)条边的无向图.给 ...

  2. .NET开发者需要的工具箱

    本文作者 Spencer 是一名专注于 ASP.NET 和 C# 的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等 ...

  3. 《SDN核心技术剖析和实战指南》3.3读书笔记

    这一节主要是介绍几种开源的SDN控制器. NOX/POX.最初的NOX混合了C++和Python两种编程语言,现在演变为两个版本.NOX版本主要面向Linux平台,利用C++开发,目标是提供快速的控制 ...

  4. 支付宝开通海外退税 阿里腾讯暗战跨境O2O_21世纪网

    支付宝开通海外退税 阿里腾讯暗战跨境O2O_21世纪网 支付宝开通海外退税 阿里腾讯暗战跨境O2O

  5. Vagrant 部署python开发环境

    Vagrant简介 Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境. 在Windows下 ...

  6. 技能CDDemo(点击鼠标左键实现技能界面旋转)

    using UnityEngine; using System.Collections; using UnityEngine.UI; public class HealthController : M ...

  7. android performClick使用

    performClick 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件) ----------------------------------------- boolean android. ...

  8. Android中的多媒体显示之图片缩放

    一:图片OOM异常: 代码示例: public class MainActivity extends Activity { private ImageView iv_imageView; protec ...

  9. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  10. Event Delivery: The Responder Chain(事件传递,响应链)

    当我们设计app的时候,我们很可能想动态的响应事件.例如,触摸一个拥有许多不同对象的屏幕,你要决定给哪个对象一个响应事件,怎么样对象接收到事件. 当一个用户产生事件发生时(如 点击),UIKit产生一 ...