飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 9581|回复: 14

[C/C++] 【原创】我用c++和内联汇编写的一个壳-SimpleDpack(不定期更新)

[复制链接]
  • TA的每日心情
    开心
    2021-2-14 16:36
  • 签到天数: 34 天

    [LV.5]常住居民I

    发表于 2016-3-14 20:04:06 | 显示全部楼层 |阅读模式
    本帖最后由 devseed 于 2016-3-15 12:41 编辑

    说明:
    飘云阁快一个月了,这期间一直在潜水,今天发一下我写的一个壳吧,现在完成了最基本的部分,软件框架写好了
    这个是我用了一周的时间写完的,同时发在吾爱破解和飘云阁上,所以这两个帖子是一样的,只是发帖的id名不一样(那边小木曾雪菜)

    v0.1版_2016_3_14
    1.此程序是我为了熟悉pe结构和加壳过程而写的,目前仅实现了最基本的lzma算法,很容易脱,等后期楼主有时间会去更新
       之后可能会用到Elliptic curve cryptography,stolen oep code,spaghetti code(国外教程上看到的名称,类似与花指令),anti-debug
        当然还会继续开源的,因为本身这个壳的目的就是为了学习
    2.楼主历时1周写完了,没有进行深度debug和兼容性测试,仅测试了几个程序可运行
    3.本程序是一个命令行的shell,将欲加壳文件拖动到simpledpack.exe中,

       或cmd到路径下输入 simpledpack inpath [outpath], //inpath 输入路径,outpath输出路径(可不填)
       楼主暂时没有时间去做gui,而且主要目的是熟悉常规加壳过程
    4.加完壳的程序360会报毒,暂时无解
    5.本程序的编写参考了网上的很多pe教程,还有很多大牛写的加壳源码,
       但是simpledpack的架构和代码编写全部是我原创(除了开源的lzma压缩算法库),我仅仅是借鉴了其他人的思路
    6.本程序的变量大部分都统一命名,采用匈牙利命名法和windows api的编程风格 如:
    typedef struct _DPACK_OUT32

    {
      PVOID extre;
    }DPACK_OUT32,*PDPACK_OUT32;
    7.我尽量做到了模块独立和高聚合低耦合,详细设计方案请参照源码与注释
    8.本程序在win10 vs2010上编译通过


    主要思想是
    【1】首先读取pe,这个没什么难度,就是繁琐,pe教程一大堆,不详细说了。
            这里我是用一个统一的基类CPEinfo来封装各种数据结构、虚函数接口等,之后方便后期解析dll或x64 pe的拓展
            这里还要声明一下:由于是c和c++混合编程(考虑到生成机器的大小和效率),所有的c++都用.cpp,.hpp来命名,所有c都用.c,.h命名,汇编基本上都是内联汇编(方便变量交互)
    【2】加壳即对各区段处理,将处理的信息保存到一个数据结构中,即源数据与转换数据的索引表,如下结构(dpackType.h中)
    typedef struct _TRANS_INDEX //源信息与变换后信息索引表是
    {
    //假设不超过4g
    DWORD dwOrigion_rva;
    DWORD dwOrigion_size;
    DWORD dwTrans_rva;
    DWORD dwTrans_size;
    }TRANS_INDEX,*PTRANS_INDEX;//此处暂时还只用一种变换函数,若多种变换函数再加上变换函数索引

    【2】将壳的代码放到dll中,将dll代码(下面称shell code)复制到被加壳文件中(LoadLibrary后的dll镜像),修改dll代码的重定位信息
            即 新的重定位地址=dll重定位后的地址-dll加载时的镜像基址+pe镜像基址+代码基址rva(PE文件镜像大小)
            将被加壳pe中的重定位指针指向shell code中的reloc表(之后要修改为IMAGE_FILE_RELOCS_STRIPPED(关闭ASLR),或者在shell code中模拟系统重定位)
           这样做的好处是dll可以用c混合编程,可以附加外部.lib,如果不重定位,则只能用汇编直接写。
    【3】dll与源pe之间的交互,可以在dll中定义数据结构,将GetProcAddress获取指针,信息交互,结构的一部分
    typedef struct _DPACK_HDADER32//DPACK变换头
    {
    DWORD dpackOepVa;        //壳的入口(放第一个元素方便初始化)
    ORIGION_INDEX32 origin_index;     //原始pe的一些信息
    WORD trans_num;         //变换的区段数,最多MAX_DPACKSECTNUM区段
    TRANS_INDEX trans_index[MAX_DPACKSECTNUM];  //变换区段索引
    DPACK_DETAIL32 detail;       //pack的详细信息
    DPACK_OUT32 out;        //用于输入dll的一些信息
    PVOID extre;         //其他信息,方便之后拓展
    }DPACK_HDADER32,*PDPACK_HDADER32;

    【4】新pe的头、节表和节区的适应性改动(此处较繁琐,细节地方挺多,尤其是地址,不再细说了,具体参照源码吧)
           sectProc,shelldllProc,setShellIat,setShellReloc,savePe
    【5】保存好了pe后就可以快乐的调试了,这时候就可以用olly去调试壳的代码了,在vs2010中观看源码,可以加上些 mov eax,eax 等语句来帮助定位

    下面来分享一下我的经历与体会吧
          最早踏入编程的大门大概是高三暑假,高三下的时候onscripter这个引擎给了我很大的乐趣,于是我就想是不是可以自己尝试着一直一部galgame,于是到高三暑假就开始了。但是的编程经历也仅有高中数学课上得一点点q-basic基础,连vb都不会。于是就去图书馆找编程资料,1个星期自学完c++,有自学了几天正则表达式,几天onsapi,就开始尝试移植了。当然路是很艰辛的,最令人头痛的还是加密脚本的处理,完全不会呀,求助大神帮我把脚本弄好了,在我的努力下也算是把秋之回忆3,秋之回忆4移植到ons平台上了。
          到了大一寒假的时候,为了能解包,我开始初次接触软件逆向工程。但是看完了,由于没有汇编基础,一头雾水,无奈之下只得放弃。
          之后我的逆向分析之旅就尘封了很久,直到今年寒假才捡起来。去年进入了某galgame汉化组,来搞程序(伪?),对前人没有研究过的引擎无从下手,再加上深入的学习了汇编,是时候重新研究一下逆向工程了。发现对汇编理解深刻后再接触这些势如破竹,很轻松的就进行下去了。我的编程故事还有很多,如果有人有兴趣听,等有空了,我会另发帖说一下我的编程经验和故事。
          写这个程序的原因是我入了逆向工程大门一个月以来,追码、文件补丁、内存补丁、dll注入、dll劫持、远程线程注入、hook编程、内 存注 册机、算 法分析 写ke ygen、二进制文件的个性化改造什么的几乎都涉猎了,至少都自己独立编写程序去实现了。脱 壳也脱 了不少了,对付比较麻烦的壳olly脚本也写过一些。可是现在基本上到了瓶颈了,遇到safe engine的壳连第一步的反调试都过不去,safe engine貌似是个门槛,我当时有些心灰意冷。于是打算尝试一下别的方面的东西,为什么不试一试自己写个壳?即使没有什么用也想着尝试一下,毕竟”纸上得来终觉浅,觉知此事要躬行“,别人做过的事情不代表你做过了,就像很多时候我们可以借用一些开源库,但是第一次去写我还是想着自己去试一试。经过了一周的奋斗,故余虽愚,卒或有所闻,那种debug成功的成就感是不可比拟的。
          这个程序暂时没什么技术含量,也毫无难度可言,关键是繁琐,容易出错,debug比较恶心。比如说一些结构指针没有强制转换为(LPBYTE)导致偏移出错,这个好久才发现;还有一些边界问题,由于没有完全理解pe结构的含义造成的错误,直接用rva访问等。这些都要在一次次的尝试中去解决。

           楼主已经习惯了看各种国外教程,api文档等,所以注释喜欢用英文去写(但本程序考虑到要发到论坛,大部分注释还是用中文写的),github上的说明也基本上用英文写的。楼主认为有时候英文更容易表达一些想法,也可能是英文文献看多了吧。建议大家多去看看外文文档,这样可以掌握第一手资料,因为有很多资料是没有汉化的。而且看得多了你会发现比汉语还难以理解,楼主有个经历一开始看中文的数据结构看着非常费劲,之后看了英文原版的数据结构很多概念一下就理解了。顺便一提,楼主英语水平并不好,英语6级也就刚过500分,希望可以给大家树立信心。

    我个人比较讨厌 “回复可见” 什么的,故我就不那么做了,
    整理、构思和写这篇文章用了将近1个下午,码了这么多字很累,希望对大家有些启发吧,
    大家看过后有什么感想在请在后面回帖反馈,bug也好、建议、不明白的地方或者是想请教的问题也好,我都会回应的
    这也是对我写这篇文章的回报吧

    源码我上会同时上传到github和百度云中,方便各位朋友观看
    github:  https://github.com/YuriSizuku/SimpleDpack
    baiduyun:   coming soon

    附:本程序在github上的说明
    ----readme.txt
    This is an aplication for packing windows pe image.

    Designed by devseed(also 小木曾雪菜,YuriSizuku)

    useage:cmdline or drag the file on simpledpack.exe
           simpledpack inpath [outpath]

    attentions:
    [1]the initial demo version that can pack the pe32 exe file
        code section by lzma through dll
    [2]now it can only support a little various of exe file,
        so just be regardless of the compatibility
    [3]now Anti-virus software may regard the packed file as an viru
    [4]other functions will be coming soon...

    coming soon:
    +more compatible version
    +pack multi sections
    +win64 pe
    +dll
    +ciphering and spagetti codes to make it hard to reverse
    +stolen oep codes
    +...

    versions:
    v0.1(initial release)
    #lzma compress only code section in win32 exe
    #c++ class to resolve pe(win32 exe),util fuctions
    #relocate the shell codes dll(c) and add in win32 exe


    ----code_structure.txt
    [win console]
    debugtry.c                         ;functions to debug
    WinConsole.cpp                     ;cmd shell
    PeInfo.cpp      ;base class CPEinfo to resolve pe
    PeInfo32.cpp      ;CPEinfo32 :public CPEinfo to resolve pe32
    SimpleDpack.cpp                    ;base class CSimpleDpack to pack pe
    SimpleDpack32.cpp     ;CSimpleDpack32 :public CSimpleDpack to pack pe32

    [dpack shell dll]
    --simpledpackshell32.dll
    simpledpackshell32.cpp             ;shell code to start packed pe
    dllmain                           

    [common shares]
    dpackCode.c      ;pack functions
    dunpackCode.c                      ;unpack functions
    dpackType.c                        ;structures decleare


    SimpleDpack_v0.1.7z

    153.19 KB, 下载次数: 5, 下载积分: 飘云币 -2 枚

    点评

    已经给你代了一份百度云链接,希望你能喜欢  发表于 2016-3-14 20:32

    评分

    参与人数 6威望 +32 飘云币 +52 收起 理由
    landwind + 4 + 4 PYG有你更精彩!
    tree_fly + 20 nice work
    kkx + 4 + 4 赞一个!
    wgz001 + 8 + 8 感谢发布原创作品!
    回忆无法挽留 + 8 + 8 继续加油
    Dxer + 8 + 8 感谢发布原创作品!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2016-3-14 20:27:09 | 显示全部楼层
    本帖最后由 Dxer 于 2016-3-14 20:31 编辑

    谢谢,收藏一份。已去git下载了。
    小弟帮你代劳一份百度云链接:http://pan.baidu.com/s/1bokpBWz 密码:hbwo
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-7-14 14:22
  • 签到天数: 615 天

    [LV.9]以坛为家II

    发表于 2016-3-14 22:47:01 | 显示全部楼层
    前排支持,虽然看不懂,但是期待新作
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2016-3-14 23:20:34 | 显示全部楼层
    学习! 请把帖子内链改掉~

    fixme.png
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2016-3-15 09:57:17 | 显示全部楼层
    请楼主尽快编辑掉帖子的内链。谢谢合作!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-3-10 20:59
  • 签到天数: 243 天

    [LV.8]以坛为家I

    发表于 2016-3-15 12:32:07 | 显示全部楼层
    感谢分享了,顶起来
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2021-2-14 16:36
  • 签到天数: 34 天

    [LV.5]常住居民I

     楼主| 发表于 2016-3-15 12:38:44 | 显示全部楼层
    飘云 发表于 2016-3-14 23:20
    学习! 请把帖子内链改掉~

    已改,一开始从那个帖子直接复制的,没注意
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-14 16:07
  • 签到天数: 1093 天

    [LV.10]以坛为家III

    发表于 2016-3-15 19:34:57 | 显示全部楼层

    感谢楼主分享!
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-7-21 00:16
  • 签到天数: 980 天

    [LV.10]以坛为家III

    发表于 2016-3-15 21:09:34 | 显示全部楼层
    感谢楼主作品
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-7-21 00:16
  • 签到天数: 980 天

    [LV.10]以坛为家III

    发表于 2016-3-15 21:09:37 | 显示全部楼层
    感谢楼主作品
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表