MBR

19 9 月, 2011

MBR(Master Boot Record,主引导记录)位于硬盘的第一个扇区,注意,不是系统分区的第一个扇区。用WinHex打开,工具—>打开磁盘—>选择Physical Media中的硬盘,而不是逻辑分区中的系统分区,偏移0x000-0x1FF处。

MBR由主引导程序、DPT(Disk Partition Table,硬盘分区表)和硬盘有效标识(0x1FE-0x1FF处的0x55AA,一个硬盘有没有格式化好像就看它)三部分组成。其中主引导程序占446bytes(0x000-ox1BD),DPT占64bytes(0x1BE-0x1FD),硬盘有效标识2bytes(0x1FE-0x1FF)。

MBR不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它,但可以通过命令来修改和重写。

Win7中主引导程序的代码段为0x000-0x162,0x163-0x1BD是数据段。0x163-0x17A为“Invalid partition table\0”;0x17B-0x199为“Error loading operating system\0”;0x19A-0x1B2为“Missing operating system\0”。

MBR的百度百科(里面关于DPT的部分有误,请参考下面的链接)

Windows 7的MBR分析

硬盘逻辑结构简介(硬盘的一些基本概念)

如何将MBR反汇编

INT 13(BIOS的硬盘读写中断)

花了接近一天的时间,终于完成了XP.MBR的分析,先把分析结果发上来,资料再补充。

XP.MBR

重要修正:怎么说呢,技术还很菜,难免疏漏。用bochs跟了遍,修正下.txt文档。

Read the rest of this entry »

GetFileVersion

14 9 月, 2011

LIB中添加一个获取PE文件的文件版本的函数

GetFileVersion

32bit Or 64bit

14 9 月, 2011

一直比较困惑跨平台以及跨32bit/64bit边界的编程问题,主要是基本数据类型的sizeof大小问题。

比较确定的是(unsigned) char/(unsigned) short基本都是1byte/2byte。虽然int、long都是内置类型,但归根结底还是得看编译器的实现:32bit下一般都是4byte,64bit下就可能有多种情况了(44、48、88等)。但无论怎样编译器都知道它们的确切大小,有问题还是求助编译器吧。

32bit/64bit最大的区别就是指针大小,肯定是4byte和8byte了,因此Windows SDK的头文件通过是否定义了_WIN64宏来确定INT_PTR等自定义PTR类型的大小(_int64 or int)。

如何跨平台,当然是宏和typedef了。typedef时加上类型名称及位数,这样清晰明了,如typedef unsigned char uint8等。至于typedef unsigned int是uint32还是uint64估计还得看具体的环境了。

附上一篇参考资料:http://blog.csdn.net/tangl_99/article/details/1963762

跨平台C/C++数据类型定义

一个CrackMe

13 9 月, 2011

CrackMe地址:http://bbs.pediy.com/showthread.php?t=139622

PEiD查壳:

 

 

 

 

 

 

 

 

ESP定律脱壳:pushad过后,esp为0x12FF96,此处下硬件断点(Command中输入hr 12FF96,并在调试/硬件断点中查看)。

 

 

 

 

 

F9运行到断点,发现0x40510B处jmp 0x401000,即为OEP。来到0x401000处发现乱码,右键—>分析/分析代码即可。

设消息断点:删除硬件断点,F9让程序运行起来。菜单—>查看/窗口,找到“确定”按钮,右键—>设消息断点,设置WM_LBUTTONUP的消息断点。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

输入帐号和密码并“确定”,程序断在系统领空,此时无法使用Ctrl+F9返回或Alt+F9返回到用户领空,Alt+M为CrackMe的整个.text代码段下内存访问断点,再F9就会停在消息处理例程(乱码则右键—>分析/分析代码)。

Read the rest of this entry »

FS

10 9 月, 2011

Ring0: FS—>KPCR

Ring3: FS—>TEB

kpcr、prcb、tss、fs、tr