【原创源码】我用c++和内联汇编写的一个壳-SimpleDpack(不定期更新)
说明: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 , //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;//变换区段索引
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
attentions:
the initial demo version that can pack the pe32 exe file
code section by lzma through dll
new 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
it鬼才 发表于 2016-3-17 00:56
我特别想学习易语言,求带呀。
题目都说了这个壳是用c++写的,我并不会易语言 {:301_997:收下了 顶一下楼主嘞 楼主最棒 加油!!加油 感谢分享 感谢楼主分享 大神感谢楼主 我特别想学习易语言,求带呀。 感谢楼主!!膜拜!{:1_893:} 感谢楼主分享
页:
[1]
2