ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:31.95KB ,
资源ID:8413876      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-8413876.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(New Microsoft 通用ShellCode深入剖析文档格式.docx)为本站会员(b****5)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

New Microsoft 通用ShellCode深入剖析文档格式.docx

1、目录1,PE文件结构的简介,及PE引出表的分析.1.1 PE文件简介1.2 引出表分析1.3 使用内联汇编写一个通用的根据DLL基址获得引出函数地址的实用函数GetFunctionByName2,通用Kernel32.DLL地址的获得方法.2.1 结构化异常处理和TEB简介2.2 使用内联汇编写一个通用的获得Kernel32.DLL函数基址的实用函数GetKernel323,综合运用(一个简单的通用ShellCode)3.1 综合前面所讲解的技术编写一个添加帐号及开启Telnet的简单ShellCode:根据第2节所述技术使用我们自己实现的GetFunctionByName获得LoadLibr

2、aryA和GetProcAddress函数地址,再使用这两个函数引入所有我们需要的函数实现期望的功能.4,参考资料.5,关键字.-一,PE文件结构及引出表基础1,PE文件结构简介PE(Portable Executable,移植的执行体),是微软Win32环境可执行文件的标准格式(所谓可执行文件不光是.EXE文件,还包?DLL/.VXD/.SYS/.VDM等)PE文件结构(简化):-1,DOS MZ header2,DOS stub 3,PE header 4,Section table5,Section 1 6,Section 2 Section . n,Section n 记得在我还没有接

3、确Win32编程时,我曾在Dos下运行过一个Win32可执行文件,程序只输出了一行This program cannot be run in DOS mode.,我觉得很有意思,它是怎么识别自己不在Win32平台下的呢?其实它并没有进行识别,它可能简单到只输入这一行文字就退出了,可能源码就像下面的C程序这么简单:#include void main(void)printf(This program cannot be run in DOS mode.n);你可能会问我在写Win32程序时并没有写过这样的语句啊?,其实这是由连接器(linker)为你构建的一个16位DOS程序,当在16位系统(D

4、OS/Windows 3.x)下运行Win32程序时它才会被执行用来输出一串字符提示用户这个程序不能在DOS模式下运行.我们先来看看DOS MZ header到底是什么东西,下面是它在Winnt.h中的结构描述:typedef struct _IMAGE_DOS_HEADER /DOS .EXE headerWORD e_magic; /0x00 Magic numberWORD e_cblp; /0x02 Bytes on last page of fileWORD e_cp; /0x04 Pages in fileWORD e_crlc; /0x06 RelocationsWORD e_c

5、parhdr; /0x08 Size of header in paragraphsWORD e_minalloc; /0x0a Minimum extra paragraphs neededWORD e_maxalloc; /0x0c Maximum extra paragraphs neededWORD e_ss; /0x0e Initial (relative) SS valueWORD e_sp; /0x10 Initial SP valueWORD e_csum; /0x12 ChecksumWORD e_ip; /0x14 Initial IP valueWORD e_cs; /0

6、x16 Initial (relative) CS valueWORD e_lfarlc; /0x18 File address of relocation tableWORD e_ovno; /0x1a Overlay numberWORD e_res4; /0x1c Reserved wordsWORD e_oemid; /0x24 OEM identifier (for e_oeminfo)WORD e_oeminfo; /0x26 OEM information; e_oemid specificWORD e_res210; /0x28 Reserved wordsLONG e_lfa

7、new; /0x3c File address of new exe header IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;DOS MZ header中包括了一些16位DOS程序的初使化值如果IP(指令指针),cs(代码段寄存器),需要分配的内存大小,checksum(校验和)等,当DOS准备为可执行文件建立进程时会读取其中的值来完成初使化工作.留意到最后一个结构成员了吗?微软的人对它的描述是File address of new exe header意义是新的exe文件头部地址,它是一个相对偏移值,我想文件偏移量你一定知道是什么吧!e_lfanew就是一个文

8、件偏移值,它指向PE header,它对我们来说非常重要.紧跟着DOS MZ header的是DOS stub它是linker为我们建立的这个16位DOS程序的代码实体部分,就是它输出了.再后面就是PE header了,有人曾问过我PE头部相对于.exe文件的偏移是不是固定的?这个可不好说,不同的编译器生成的stub长度可能不一样(比如:它可能存储了这样一个字串来提示用户The Currnet OS is not Win32,I want to run in Win32 Mode.,那么这个stub的长度将比前面的那个长),所以用一个固定值来定位PE header是不科学的,这个时候我们就用到

9、了e_lfanew,它指向真正的PE header,它总是正确吗?那是当然的!linker总是会它赋予一个正确的值.所以我们要它精确定位PE header,同样的Win32 PELoader也根据e_lfanew来定位真正的PE header,并使用PE header中的不同的成员值进行初使化,PE还包涵了很多个节(Section),有用来存储数据的,有用来存可执行代码的,还有的是用来存资源的(如:程序图标,位图,声音,对话框模板等)下面我只简单分析一下PE结构与编写ShellCode相关的部分,如果你对其它部分也比较感兴趣可以看看台港侯俊杰先生译的中的相关内容以及Iczelion的经典PE教

10、程,我个人觉得将两者结合起来看要好一点.2,引出表分析在PE header结构(你可以Winnt.h中找到它)中包括一个DataDirectory结构成员数组,可以通过这样的方法来找到它的位置:PE头部偏移=可执行文件内存映象基址+0x3c(e_lfanew)PE基址=可执行文件内存映象基址+PE头部偏移引出表目录指针(IMAGE_EXPORT_DIRECTORY*)=PE基址+0x78int x,y,z=y=x=0;Input two integer number:scanf(%d %d,&x,&y);z=x/y;%d DIV %d = %d,x,y,z);getch();return 0;

11、编译,运行:输入4 2,程序输出4 DIV 2 = 2,结果很正确.再运行输入 4 0,问题出来了,Visual Studio弹出了一个信息框:Unhandled exception in seh.exe:0xC0000094:Integer Divide by Zero,出现了未处理的除0异常,传统的方法是我们在z=x/y之前加上判断:if(!y)Can not Divide by Zero!goto LQUIT;LQUIT:出错处理在这个小程序里这的确很容易看懂,可是想想如果在数千甚至上万行的程序里,这样的错误捕获处理会让程序变的十分凌乱难懂,而且传统方法处理的是我们可以想像(猜测)到的错误,但是某些导到程序出错的情况是很随机的,这样就不能保证程序的健壮性了,而SEH正是为了让正常的处理代码和出错处理代码分开,以使程序结构清淅,并使程序更加健壮.让我们再把这个小程序改一下:windows.hInput Two Integer Number:_try/把可能出错的程序段封装起来/._except(EXCEPTION_EXECUTE_HANDLER)/在这里找出出现异常的原因,并进行处理switch(GetExceptionCode()case EXCEPTION_INT_DIVIDE_BY_ZERO:/如果除0异常case EXCEPT

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2