首页
社区
课程
招聘
[原创][开源]用C++实现的壳(扩展版)
发表于: 2016-1-1 13:47 47510

[原创][开源]用C++实现的壳(扩展版)

2016-1-1 13:47
47510
typedef struct _MYIMPORT
{
  DWORD  m_dwIATAddr;      //IAT地址
  DWORD  m_dwModNameRVA;      //模块名偏移
  DWORD  m_dwFunNameRVA;      //函数名偏移
  BOOL  m_bIsOrdinal;      //是否为序号导出函数
  DWORD  m_Ordinal;        //序号
}MYIMPORT, *PMYIMPORT;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (74)
雪    币: 191
活跃值: (848)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
感谢分享,之前我也研究过写壳
2016-1-1 14:23
0
雪    币: 49
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持一下,顶起
2016-1-1 14:49
0
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
支持一下,顶起。
2016-1-1 15:13
0
雪    币: 6566
活跃值: (4526)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
非常感谢分享
2016-1-1 17:25
0
雪    币: 260
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,支持楼主,等放假回来再看看。
2016-1-1 17:26
0
雪    币: 6566
活跃值: (4526)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
方便传个vs2010版本的吗
2016-1-1 17:34
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
我电脑上只有VS2013啊

不过我给你百度了一下如何解决问题

希望能帮到你:
http://blog.csdn.net/civilman/article/details/40109483
2016-1-1 18:00
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
good job
2016-1-2 00:01
0
雪    币: 6566
活跃值: (4526)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
非常感谢回复
要是以后加入虚拟机引擎就爽了
2016-1-2 10:22
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
感谢分享!挑战一下自己,明天开始研究如何破解
2016-1-3 01:00
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
看了一下你的加密程序,有思路了,嘿嘿代码加密的找到入口点,等你自己解密了之后,就行,至于IAT加密,嘿嘿,也不难啊!可以采用,已知明文破解的办法,就是用VC编写一个静态加载自己DLL的程序,编写之后,用PE编辑工具打开这个文件,打开之后,查看导出表在文件地址,根据对齐值,计算一下加载到内存时的位置,记下这个位置,接着用楼主的程序加壳,加壳之后用OD加载被加壳的程序,拿着刚刚已经计算好的IAT地址加上模块的加载地址,就可以知道IAT地址,然后在IAT地址上下内存断点,在LoadLibraryW GetProcAddress GetModuleHandleW等函数上下执行断点,接着就调试,嘿嘿,看是什么指令写入了IAT,什么位置调用了GetProcAddress  以及加载了什么模块,等加载自己的DLL的时候,就自己手动通过EAT获取自己DLL的函数的地址,然后填入刚刚加壳程序填入的IAT地址,看是否会直接调用你的程序,如果直接调用,而没有经过加壳程序的话,就说明你获取的IAT写入地址正确了,嘿嘿,用这个方法手工恢复吧!要是获取的IAT地址不正确,就继续调试,直到能获取正确的IAT地址为止!
2016-1-3 03:19
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
你这个思路实现了吗? 我获取到真正的函数地址以后,不是直接填到对应的IAT地址的啊。。而是直接填到一块new出来的堆空间中的啊,而这个堆空间中填的地址也不是直接就是函数地址,是一段ShellCode的地址,经过一些花指令以后才会call真正的函数地址。
你dump以后成功修复IAT了? (加壳的时候别忘了选择IAT加密)
2016-1-3 10:10
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
部分实现,通过一个已知的DLL的API,我已经定位到了解码IAT的程序!已经找到了IAT原地址,你即使申请了new的地址,你也必须向原IAT地址填写一个HOOK,不是么?跟踪到后面的结果是,如果没有进行IAT加密的话,会发现惊喜,不过经过测试,加密之后也没事,你同样会发现惊喜!
2016-1-3 10:22
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
15
没有完全实现的原因,只是因为我跟踪到IAT之后,累了,就先休息了,嘿嘿,等过两天,我有空了,继续挑战,嘿嘿!不过表扬一下,花指令还是不错,不过,不是很强大,花了我多一点事件读取而已
2016-1-3 10:25
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
哇,多谢大牛赐教!

调试方面我还是太弱啊,回头研究研究你说的这种方法!

感谢感谢!
2016-1-3 10:28
0
雪    币: 260
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
1、本人环境为vs2010,附件中的源码存在问题,开始直接编译不通过。
需修改shell.cpp 245行279行添加等号。
2、修改完各种错误后静态编译出来的shell.dll只有38kb,而楼主所给的shell.dll为78kb不知是什么原因。(基本的环境配置我没有修改,只修改编译错误信息。)
3、使用楼主的shell.dll加壳在win7 x64系统可以正常运行,但是使用楼主源码编译出来的exe和dll加壳后运行弹出对话框后运行出错。第二次输出信息为:
runtime error R6009
- not enough space for environment
4、猜想附件中的源码是不是最终版本。
2016-1-3 14:32
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
我用的是VS2013开发的。
我给出的那个78kb的Shell.dll是我在VS2013下静态编译的( 运行库:多线程 MT )Release版。


你试一下你自己编译exe文件配上压缩包里自带的Shell.dll(78kb)看能不能正常加壳。如果能的话就说明是Shell编译的问题。

确定一下你的dll项目是否是Release(之前为了调试方便,我把shell项目Release的生成目录改成了Debug目录),再确定一下Shell项目是不是按照上图中的方式设置。

在我电脑上下载下来源码然后直接编译出来,加壳是没问题的。

看来VS低版本对高版本的兼容性不太好吧,你也可以看看这个迁移方案,希望能够帮到你:
http://blog.csdn.net/civilman/article/details/40109483
上传的附件:
2016-1-3 15:52
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
已经可以破解了,嘿嘿,多谢你的加壳程序了,我已经弄好了,等我整理好了,吃了晚饭,我就上传破解办法以及资料,先上传截图,等我晚上弄好以后,再上传教程,嘿嘿,肚子饿了,晚上才弄
上传的附件:
2016-1-3 17:17
0
雪    币: 27
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
留个记号,持续关注楼主的更新。
2016-1-3 17:50
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
21
楼主,你的加密程序,我已经破解好了,但是我现在在考虑是不是要公布做法,来教一教大家呢?等我公布了,我怕楼主又不高兴了!
2016-1-3 18:14
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
22
啊...暂时没有更新的打算了,我就是提供个框架,整点简单的加密而已,
主要是抛砖引玉哈哈...
2016-1-3 18:32
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
没啥不高兴的,我这壳本来就是供大家学习的,我自己水平也有限,有大牛来指点当然是极好的了!
2016-1-3 18:33
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
24
楼主犯了一个小错误,导致我可以直接在你的程序中,直接截取你的IAT填写以及复制过程,在这个过程中,可以在堆栈中记录到导出模块已经导出函数名,楼主在申请新的IAT地址前,使用了LoadLibrary和GetModuleHandle,这两个函数调用时,在堆栈上可以看到我们想要的模块,赶紧的,记录下来呗!,使用了GetProAddress,没有清空EAX寄存器的值,而是,将EAX与15151515h进行异或之后填写入局部变量中,然后就申请了新的内存,新内存地址就保存在EAX中,然后以EAX作为返回值,新的内存用来填写ShllCode,而ShllCode中对原函数的回调用的地址就直接写入SHELLCODE,同时把ShllCode地址存在一个变量中,这个变量,后来又被取出,用来填写真正的IAT地址!我只需截取 ShellCode,让ShellCode的地址指向原函数,并且取消对ShellCode的填写操作,然后用OD将对应的代码回填到可执行文件中,并且在你的程序回填IAT HOOK的时候,记录你的IAT地址就行,有了IAT地址,又有正确的模块加载列表,函数列表,以及IAT的函数地址的链表,恢复IAT不好办么?
2016-1-3 18:38
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
25
楼主,你想破解的话,先准备工具,需要的工具ollydbg
Cheat Engine和VS2010,以及楼主的加壳程序!
楼主,我先编辑资料,写上破解过程,等一下我发上来
2016-1-3 18:49
0
游客
登录 | 注册 方可回帖
返回
//