孤注一掷

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2012年10月13日

摘要: 看一个类在内存中的布局最直接的方法是使用OD之类的调试器,动态跟踪关于类成员的存取代码,但是该方法使用起来不是很方便,而且也有可能因为有的成员的访问代码不便跟踪。解决之道是:VC编译器(CL.EXE)提供了一个隐藏开关,用于打印编译器为类所确定的类Layout信息。该方法最好在命令行下使用,因为在IDE中编译会在每行头部输出额外的信息,这样会打乱原始输出。下面介绍使用技巧:首先写一个类(类文件分别为test.h和test.cpp):class Test {protected: int a; int b;public: Test(void); ~Test(void);};开关1:-d1repor 阅读全文
posted @ 2012-10-13 15:32 孤注一掷 阅读(473) 评论(0) 推荐(0) 编辑

摘要: 查看系统函数的反汇编代码时会发现开头有个"mov edi,edi"(2字节),再往前则是5个nop指令(当然这不会引人注意),可是"mov edi,edi"有什么用了.上网搜索"mov edi,edi",结果让人惊奇,据说系统函数都添加了这段"无用"的代码,为的是Hot Patching,详细内容请自行搜索.通过改写代码来挂接API时,一般是移动前几个字节加入jump指令,对于"mov edi,edi"开头的函数也习惯性的这样处理.可现在情况不同了,这7个字节提供了方便,文中提到了更好的办法,在 阅读全文
posted @ 2012-10-13 14:46 孤注一掷 阅读(1987) 评论(0) 推荐(0) 编辑

摘要: 最近在研究C++的逆向,为了了解VC编译器的代码生成规则,经常自己编写测试代码,然后使用VC编译,再通过Ollydbg来查看反汇编情况。但是,由于默认程序都是生成Debug版本,中间插入了一些未优化代码,尤其是堆栈检查指令CC,不但干扰我的分析调试过程,同时在实际的第三方程序调试过程中,也很少有Debug版本,所以我需要去掉这些信息。为什么不直接使用Release版本编译呢,这是因为默认的的Release优化是很可怕的,比如我写了一些简单的类和过程调用,都会被直接优化掉的,因此为了还原真实的程序意图和流程,我决定在Debug版本下自己控制编译选项,生成我需要的二进制码。本次测试的代码很简单,如 阅读全文
posted @ 2012-10-13 01:18 孤注一掷 阅读(1088) 评论(0) 推荐(0) 编辑

摘要: 转自:http://www.cnblogs.com/Kane_zzt/archive/2009/02/04/1383797.html可以通过Settings -->Project-->C/C++-->Customize来设置这个编译开关。VC 编译命令开关/C: 在预处理输出中保留注释语句/c: 只编译,不连接,相当于在"Build"菜单下选择了"Compile"/D: 定义常量和宏,与源程序里的#define 有相同效果/E:预处理C、C++源文件,将源文件中所有的预编译指令及宏展开,将注释去掉,然后将预处理器的输出拷贝至标准输出设备 阅读全文
posted @ 2012-10-13 00:51 孤注一掷 阅读(285) 评论(0) 推荐(0) 编辑