【原创】我用c++和内联汇编写的一个壳-SimpleDpack(不定期更新)
本帖最后由 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 , //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;//变换区段索引
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
attentions:
the initial demo version that can pack the pe32 exe file
code section by lzma through dll
now it can only support a little various of exe file,
so just be regardless of the compatibility
now Anti-virus software may regard the packed file as an viru
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
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
--simpledpackshell32.dll
simpledpackshell32.cpp ;shell code to start packed pe
dllmain
dpackCode.c ;pack functions
dunpackCode.c ;unpack functions
dpackType.c ;structures decleare
本帖最后由 Dxer 于 2016-3-14 20:31 编辑
谢谢,收藏一份。已去git下载了。
小弟帮你代劳一份百度云链接:http://pan.baidu.com/s/1bokpBWz 密码:hbwo
前排支持,虽然看不懂,但是期待新作 学习! 请把帖子内链改掉~
请楼主尽快编辑掉帖子的内链。谢谢合作! 感谢分享了,顶起来 飘云 发表于 2016-3-14 23:20
学习! 请把帖子内链改掉~
已改,一开始从那个帖子直接复制的,没注意
感谢楼主分享! 感谢楼主作品 感谢楼主作品
页:
[1]
2