吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6263|回复: 11
收起左侧

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

  [复制链接]
小木曾雪菜 发表于 2016-3-14 17:58
说明:
v0.1版
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上编译通过

9.至于为什么叫dpack是因为devseed的缩写,当时我想着注册devseed,然后开放注册后当作新人贴来发出去,
   结果由于devseed是我邮箱名的子串(为避免留邮箱的嫌疑,我不说邮箱全名),总是注册失败(是这个原因吗?),换成小木曾雪菜这个id才注册成功的,
   以后发布作品可能会以小木曾雪菜或devseed来命名作者

主要思想是
【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编程、内存注册机、算法分析写keygen、二进制文件的个性化改造什么的几乎都涉猎了,至少都自己独立编写程序去实现了。脱壳也脱了不少了,对付比较麻烦的壳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]new 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.png

SimpleDpack_v0.1.7z

153.19 KB, 下载次数: 65, 下载积分: 吾爱币 -1 CB

simpledpack

免费评分

参与人数 9威望 +1 热心值 +9 收起 理由
q120379739 + 1 我很赞同!
圈瞳 + 1 用心讨论,共获提升!
dhs347 + 1 谢谢@Thanks!
卡卡冻 + 1 必须向楼主学习
yypE + 1 赞赞
286733081 + 1 未来的大神!
Cizel + 1 + 1 用心讨论,共获提升!
amscracker + 1 膜拜大牛啊!自己写壳了!
流水爱 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 小木曾雪菜 发表于 2016-3-19 18:11
it鬼才 发表于 2016-3-17 00:56
我特别想学习易语言,求带呀。

题目都说了这个壳是用c++写的,我并不会易语言
流水爱 发表于 2016-3-14 17:59
LULIN 发表于 2016-3-14 18:21
san19788 发表于 2016-3-14 20:44
感谢分享
多嘴的橙子 发表于 2016-3-16 12:43
感谢楼主分享
1漫步云端1 发表于 2016-3-16 17:05
大神  感谢楼主
it鬼才 发表于 2016-3-17 00:56
我特别想学习易语言,求带呀。
icewindcbj 发表于 2016-3-17 10:27
感谢楼主!!膜拜!
lcxiqhl 发表于 2016-3-17 11:56
感谢楼主分享      
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-9-23 09:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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