<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[driftcloudy的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/driftcloudy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; driftcloudy]]></copyright><item><title><![CDATA[一个有趣的C语法]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83939906</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83939906</guid><author>driftcloudy</author><pubDate>Thu, 02 Jun 2011 00:48:06 +0800</pubDate><description><![CDATA[今天阅读代码时第一次碰到形如：
#include &amp;lt;stdio.h&amp;gt;

void main()
{
	printf(&quot;%d\n&quot;, add(2,3));
	getchar();
}

int add(a, b)
int a;int b;
{
	return a+b;
}
这里定义函数add时，参数列表中没有指明形参a、b的类型，反而在 int add(a, ...]]></description><category></category></item><item><title><![CDATA[逆向C++学习手记（1）]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83938544</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83938544</guid><author>driftcloudy</author><pubDate>Tue, 31 May 2011 02:40:47 +0800</pubDate><description><![CDATA[最近常遇到的尴尬是看着汇编代码却无法在脑中反应出正确的C、C++代码 。近日偶得一篇好文《reverse C++》，细读下来收获不少。遂打算在《reverse C++》的基础上扩展，从汇编角度来认识一些C、C++中的语法现象~先从一些简单的开始...

一、数组

数组是非常基本的数据结构，C++中的数组表现为一段连续可用的内存。注意这段内存地址是连续的，这与很多动态语言中的数组不一样，举...]]></description><category></category></item><item><title><![CDATA[从Entry Point到main函数调用（6）：exit]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83937633</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83937633</guid><author>driftcloudy</author><pubDate>Sat, 28 May 2011 20:31:32 +0800</pubDate><description><![CDATA[本章是该系列最后一篇，打算看一下 exit 函数中究竟做了些什么。
 

main函数的返回值

在第（5）篇里完成了_cinit() 的分析之后，mainCRTStartup中接下来代码是：
__initenv = _environ;
mainret = main(__argc, __argv, _environ);
exit(mainret);
很显然， 其实main函数是可...]]></description><category></category></item><item><title><![CDATA[从Entry Point到main函数调用（5）：_cinit]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83937119</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83937119</guid><author>driftcloudy</author><pubDate>Fri, 27 May 2011 15:07:23 +0800</pubDate><description><![CDATA[
_cinit

在完成了_setargv() 以及_setenvp() 之后，进入到_cinit 函数。该函数的注释很短，就一句“do C data initialize”，让人完全摸不着头脑。不过不用着急，可以阅读_cinit 函数的实现来加以分析。
 
_cinit 函数很短，大致上分为三个步骤：
1. _fpmath() 或者 (*_FPinit)();
2. _initte...]]></description><category></category></item><item><title><![CDATA[从Entry Point到main函数调用（4）]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83924547</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83924547</guid><author>driftcloudy</author><pubDate>Sat, 21 May 2011 14:13:51 +0800</pubDate><description><![CDATA[先撇开_ioinit()不谈，IO有点儿麻烦，待有空再去挖掘这些东西。

GetCommandLineA

该函数的汇编代码短得令人发指。
7C812FBD    mov     eax, dword ptr [7C8855F4]
7C812FC2    retn 
可见7C8855F4是个特殊的内存地址，其中存放了一个指向命令行缓冲区的指针。通过该指针，可以访问整个exe的完整路径...]]></description><category></category></item><item><title><![CDATA[从Entry Point到main函数调用（3）：_heap_init]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83923462</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83923462</guid><author>driftcloudy</author><pubDate>Thu, 19 May 2011 14:48:14 +0800</pubDate><description><![CDATA[
_heap_init

在（1）中提到过该函数用于分配一个堆。这个堆是动态创建的私有堆，与系统为进程分配的默认堆不同。进程启动时，系统会在进程虚拟地址空间中创建一个堆，即为进程的默认堆。默认堆的创建和回收均由系统来完成。除了默认堆，进程中还可以存在若干个私有堆。私有堆可以由进程动态创建，并且在此基础上进行内存分配、释放等操作。
 
_heap_init函数本质上是调用了HeapCrea...]]></description><category></category></item><item><title><![CDATA[从Entry Point到main函数调用（2）：GetVersion]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83923199</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83923199</guid><author>driftcloudy</author><pubDate>Thu, 19 May 2011 03:16:21 +0800</pubDate><description><![CDATA[之前（1）篇中大致介绍了mainCRTStartup，但是其中一些调用到的函数并未深究，现打算逐一剖析它们。
 

GetVersion

GetVersion函数是kernel32.dll中提供的API，用于获取当前Win平台的版本。准确的说，GetVersion可以获得3个信息：
1. OSPlatformId
2. OSBuildNumber
3. OSMinorVersio...]]></description><category></category></item><item><title><![CDATA[从Entry Point到main函数调用（1）]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83923001</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83923001</guid><author>driftcloudy</author><pubDate>Wed, 18 May 2011 17:46:18 +0800</pubDate><description><![CDATA[
（1）
  
之前在调试exe时感觉很奇怪，为什么Entry Point并非直接进入到main函数。
举例来说，如果将一段空的C代码build为exe：
void main(){ }
编译环境为：VC6 release。
再将该exe文件进行反汇编，那么从EP开始的代码部分大概形如：
ASM代码 
push ebp
……一段汇编代码
 
……call Main函数
 ...]]></description><category></category></item><item><title><![CDATA[第一次干掉 CrackMe && TraceMe]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83913751</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83913751</guid><author>driftcloudy</author><pubDate>Sat, 30 Apr 2011 18:33:32 +0800</pubDate><description><![CDATA[这两个exe都是“加密与解密”书中“调试篇”的例子，CrackMe很简单，TraceMe稍微复杂一点。
 

1. CrackMe

 
分析CrackMe无需用OD打断点跟进，该程序逻辑非常简单，仅仅从汇编代码的调用上即可判断出其内部实现。
先用IDA进行CrackMe的反汇编，在最下方可以看到关于序列号的判断：

注意刚开始是无法看到右侧“序列号不对，重新再试一次”的字样的，需...]]></description><category></category></item><item><title><![CDATA[OD一段简单的C++代码]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83912432</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83912432</guid><author>driftcloudy</author><pubDate>Thu, 28 Apr 2011 01:09:59 +0800</pubDate><description><![CDATA[开始学习逆向，从熟悉的js、php跳跃到汇编，有点小凌乱
...
 
先来OD一段简单的C++代码：
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

int funcA(int a, int b);

void main()
{
	int a;
	int b;
...]]></description><category></category></item><item><title><![CDATA[浅析document.referrer]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83884936</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83884936</guid><author>driftcloudy</author><pubDate>Mon, 04 Apr 2011 19:43:37 +0800</pubDate><description><![CDATA[在流量统计服务中都有Traffic source这个功能。Traffic source是针对访次级别的概念，换句话说，当访次建立的时候，landing page的流量来源即是该访次的Traffic source。虽然Traffic source有很多种，不过不幸的是依据现在JS，获得Traffic source的途径只有两种——document.referrer、window.opener.更不幸...]]></description><category></category></item><item><title><![CDATA[一道阿里前端笔试题]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83878017</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83878017</guid><author>driftcloudy</author><pubDate>Thu, 24 Mar 2011 15:49:39 +0800</pubDate><description><![CDATA[题目：


用CSS实现布局



让我们一起来做一个页面首先，我们需要一个布局。请使用CSS控制3个div，实现如下图的布局。

用javascript优化布局



由于我们的用户群喜欢放大看页面，于是我们给上一题的布局做一次优化。当鼠标略过某个区块的时候，该区块会放大25%，并且其他的区块仍然固定不动。


思路：
注意题目由于是只让用3个div，这让我很不习...]]></description><category></category></item><item><title><![CDATA[【翻译】JS里的各种trim实现]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83854465</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83854465</guid><author>driftcloudy</author><pubDate>Sat, 12 Mar 2011 16:34:22 +0800</pubDate><description><![CDATA[前不久blog频道有人发表了一篇讲js里各种trim实现的 http://justjavac.iteye.com/blog/933093

不过没有提及Dojo中的trim。Dojo中有两种trim实现：
 
1.较为常用的：


dojo.trim = String.prototype.trim ?
		function(str){ return str.trim(); } :...]]></description><category></category></item><item><title><![CDATA[JS中的对象创建、属性访问]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83852929</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83852929</guid><author>driftcloudy</author><pubDate>Wed, 09 Mar 2011 21:45:43 +0800</pubDate><description><![CDATA[
一条面试题


公司最近在招web fronter，免不了需要进行面试，于是大家在群里讨论一些题目。其中一题如下：
var a = new Object;
var b = new Object;
var c = new Object;
c[a]=a;
c[b]=b;
alert(c[a]===a); //输出什么
 
这个题目还是很有意思的，第一反应往往会心中涌起一丝疑惑...]]></description><category></category></item><item><title><![CDATA[DOJO中的面向对象__第五章 Dojo/_base/declare.js源码剖析(2)]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83847167</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83847167</guid><author>driftcloudy</author><pubDate>Mon, 28 Feb 2011 19:55:01 +0800</pubDate><description><![CDATA[接着第四章....
(二)   getInherited和inherited方法

　　这两个方法是对外提供的扩展接口，可以用declare出来的类型的实例调用。它们的用途是返回父类中曾经出现的方法，或者对其进行调用。具体的用法在第二章中已经描述，这里不再举例说明。
　　1. getInherited方法主要用来返回父类中的方法；
　　2. inherited方法主要用来调用父类中的方法...]]></description><category></category></item><item><title><![CDATA[DOJO中的面向对象__第四章 Dojo/_base/declare.js源码剖析(1)]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83845896</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83845896</guid><author>driftcloudy</author><pubDate>Fri, 25 Feb 2011 22:24:28 +0800</pubDate><description><![CDATA[　　declare.js中包含了整个dojo面向对象中最重要的代码，即对类型表达和扩展的一些封装。功能虽然强大，但是幸好文件并不复杂，拥有清晰的脉络。整个declare.js一共定义了15个函数，14个具名函数，1个匿名函数。这14个具名函数中又有一些是declare.js内部使用的函数，外部无法调用，还有一些是由dojo提供的接口，可以供dojo.declare声明的类型来调用。具体函数如下所示...]]></description><category></category></item><item><title><![CDATA[DOJO中的面向对象__第三章补充：关于preamble、postscript以及chain]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83841426</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83841426</guid><author>driftcloudy</author><pubDate>Thu, 17 Feb 2011 21:00:12 +0800</pubDate><description><![CDATA[　　这是dojo.declare中的三个极度蛋疼的功能，在对多继承的实质有所了解之后，才会加深对这三个功能的认识，所以放到最后说。这里就不谈它们的实现原理了，第四章中也许会描述到= =!
 
　　如果觉得运行constructor前后缺少了些什么，那么preamble、postscript可以很好的帮助我们进行弥补。根据我时间不长的开发经验，还想不出什么情况下需要这种操作来弥补。如果在类型的定...]]></description><category></category></item><item><title><![CDATA[DOJO中的面向对象__第三章 Dojo中的多继承]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83841383</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83841383</guid><author>driftcloudy</author><pubDate>Thu, 17 Feb 2011 17:40:08 +0800</pubDate><description><![CDATA[(一) 定义多继承
　　Dojo在基于类的面向对象系统方面增强了JS的表现力，在第二章中已经提到Dojo还允许用户使用多继承，本章将主要探讨关于多继承的内容。利用dojo.declare声明多继承的类是很方便的，用户只需要传递一个数组（superclass
）进去，superclass数组包含了所有的父类。
dojo.declare(&quot;A&quot;, null, {
	constructor: f...]]></description><category></category></item><item><title><![CDATA[DOJO中的面向对象__第二章 Dojo中的类]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83840575</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83840575</guid><author>driftcloudy</author><pubDate>Wed, 16 Feb 2011 11:39:08 +0800</pubDate><description><![CDATA[(一) 利用DOJO.DECLARE声明类

　　在第一章中讲到，JS提供的是一种基于原型（Prototype）的对象系统。这与JS诞生的初衷有关，在把JS仅仅用作页面脚本时，利用Prototype是一种优势。因为基于原型的对象不仅节约内存，初始化速度快，更重要的是还拥有了原型继承带来的动态特性。但是如果需要在RIA环境下构建丰富的web应用，JS的原型系统又显得不太给力。在继承性方面，原型系统...]]></description><category></category></item><item><title><![CDATA[DOJO中的面向对象__第一章 JS中的对象模型]]></title><link>https://blog.youkuaiyun.com/driftcloudy/article/details/83840261</link><guid>https://blog.youkuaiyun.com/driftcloudy/article/details/83840261</guid><author>driftcloudy</author><pubDate>Tue, 15 Feb 2011 19:14:59 +0800</pubDate><description><![CDATA[ＤＯＪＯ中的面向对象
 
　　在JS中并没有Java等面向对象语言中常见的类(class)的概念。也就是说，JS中的对象并非基于类的。它仅仅为开发者提供了一些原类型和基本的内置对象。从写法上来看，它更加的类似于面向过程式的语言，函数仿佛成了JS中的顶级实体。事实上，JS是一门函数式编程的语言。所以当我们需要以面向对象的方式来构建大型web应用时，原生态的JS并不能很好的满足这一点。而DOJO的...]]></description><category></category></item></channel></rss>