My Dream…….

这玩意看着就爽。。。玩起来会更爽歪歪的。。。。

不行。。头脑发热了。。冲动了。。。工作了。第一个月工资。。一定要弄这个东西玩玩。。。

It’s   My Dream

malloc和alloc的区别

函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。
malloc()函数有一个参数,即要分配的内存空间的大小:
void *malloc(size_t size);
calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。
     void *calloc(size_t numElements,size_t sizeOfElement);


    如

    pthread_t *tid;

    tid = (pthread_t*)calloc(numthrds, sizeof(pthread_t));

     如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。
     函数malloc()和函数calloc()的主要区别是前者不能初始 化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配 过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空 间还已经被重新分配)可能会出现问题。
     函数calloc()会将所分配的内存空间中的每一位都初始化为零,也 就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始 化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。

    另外,calloc返回的是一组对象的数组,而malloc返回的是一个对象。使用calloc表明是要使用一个数组。

说说这东西。。

不知从什么时候开始。。石头也开始关注股市行情了。。。。。从前年,去年的大涨。。。基金的发展。。让人们认为。。基金是只赚不赔的东西。。。蒙蔽了我们这些不懂人的眼睛。。于是人们跟风似的都大买基金。。刚开始少买点。。尝到甜头就控制不住自己的欲望了。。只赚不赔。。好事。。就把自己压箱底的钱全部拿出来买基金。。。。很可悲。在今年上半年的时间里。。基金没有涨。。而且把这些人的心都给跌碎了。。。老妈买的基金也给扔进去了。。我早就提醒过。。在没有熟悉这些行情的前提下。。永远都是跟着别人的脚步走。。不过。。没人听。。于是亲戚们来了个买基金热。。不敢买的几千块钱。。敢买的几万块钱。。本来就不是什么大款。。钱都是那一个月固定的工资。。经过大跌。。估计他们再也不买了。。因为钱是花在刀刃上了。。不是白白扔给股市的。那只会坑了自己。。如果买。。那只能在自己熟悉行情的前提下。。有点技术含量。。赔了也认了。。。。从六千点跌到两千点。。。都是有点好玩。。

不过昨天股市大涨两百点。。。。在我对这个行业陌生的情况下。。只是朦胧的对这个行业有个印象。。有点像个永远长不大的婴儿。。。。大股东就是他们的爹娘。。。国家就是他们的爹娘。。涨涨跌跌。。起起伏伏。。就是这么个回事。。跟人这一辈子一样。。。。

没有永远的不如意,也没有永远的开心。。~~

下午犯的一个小错误。。。。

几个概念性的问题。。今天编程练习PE文件结构的时候。。就弄错了。。

结构指针

虚拟偏移地址

文件偏移

搞混了。。呵呵。。结果把程序弄错了。。幸亏找出原因了。。。。。。

OnConvertVAToRawA这个函数是把VA转成RAW地址

IMAGE_THUNK_DATA *ImportThunkRaw=(IMAGE_THUNK_DATA*)OnConvertVAToRawA(myImportheader.OriginalFirstThunk);

犯了这样的错误。。RAW应该是磁盘的文件偏移才对。。结果把它弄成指针了。。概念没有搞清。。。最后澄清一下:

1.指针是在一个程序的地址空间中的东东。。

2.虚拟偏移地址是程序是内存中偏移地址

3.文件偏移是程序在磁盘上的偏移地址

看着很平常。。编程的时候没有很清楚的概念很容易搞混的。。可能是基础不牢的原因吧。。呵

躺宿舍床上闭上眼想了半天才想出来的。。也许学习就是这么个过程吧。。不需要很累。。但需要塌实。。每走一步都要多动脑子想想。。。

想出来了。。很高兴。。就跑中心写日志上了。。怕睡一晚上就忘了。。

哦耶。。上课去喽。。计算机组成原理。。~~~

VRA to RawA

汇编中虚拟地址(VRA)与文件偏移地址(FileOffset)的相互转换:

+———+———+———+———+———+———+

|  段名称    虚拟地址   虚拟大小   物理地址   物理大小    标志    |

+———+———+———+———+———+———+

|   Name      VOffset     VSize     ROffset     RSize       Flags |

+———+———+———+———+———+———+

|   .text    00001000    00000092   00000400   00000200   60000020|

|   .rdata   00002000    000000F6   00000600   00000200   40000040|

|   .data    00003000    0000018E   00000800   00000200   C0000040|

|   .rsrc    00004000    000003A0   00000A00   00000400   C0000040|

+———+———+———+———+———+———+
文件虚拟偏移地址和文件物理偏移地址的计算公式如下:


>>>>>>>VaToFileOffset(虚拟地址转文件偏移地址)
如VA = 00401000 (虚拟地址)

ImageBase = 00400000 (基地址)

VRk = VOffset – ROffset = 00001000 – 00000400 = C00 (得出文件虚拟地址和文件物理址之间的VRk值)

FileOffset = VA – ImageBase – VRk = 00401000 – 00400000 – C00 = 400(文件物理地址的偏移地址)

如VA = 00401325,则:

FileOffset = VA – ImageBase – VRk = 00401325 – 00400000 – C00 = 725


>>>>>>FileOffsetToVa(文件偏移地址转虚拟地址)
如FileOffset = 435(文件偏移地址)

VA = FileOffset + ImageBase + VRk = 435 + 00400000 + C00 = 00401035(虚拟地址)

[转自看雪bbs.pediy.com]

输出表结构

    大部分dll都会输出一些函数.有些pe文件也会有输出表.通常输出表都是放在.edata区段的.因此.edata区段的注要成分是函数名表,入口点地址,输出函数的序号.

    输出表的开始部分是一个IMAGE_EXPORT_DIRECTORY结构,之后紧接着是由该结构中的某个域所指向的数据.

    IMAGE_EXPORT_DIRECTORY结构定义如下:


    typedef struct _IMAGE_EXPORT_DIRECTORY {

    DWORD Characteristics;

    DWORD TimeDateStamp;

    WORD    MajorVersion;

    WORD    MinorVersion;

    DWORD Name;

    DWORD Base;

    DWORD NumberOfFunctions;

    DWORD NumberOfNames;

    DWORD AddressOfFunctions;     // RVA from base of image

    DWORD AddressOfNames;        // RVA from base of image

    DWORD AddressOfNameOrdinals;   // RVA from base of image

    } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;


1)Characteristics

    这个值总为0.


2)TimeDateStamp

    含有这个导出表的文件被生成的时间.


3)MajorVersion

4)MinorVersion

    版本信息.总为0.


5)Name

    含有这个导出表的pe文件的名字的RVA.

  

6)Base

    输出函数序号的开始值.

  

7)NumberOfFunctions

    数组 AddressOfFunctions 中元素的个数.这个值就是导出表中导出函数的个数.

  

8)NumberOfNames

    以名字输出的函数的个数.

  

9)AddressOfFunctions

    这是一个RVA,指向一个由函数地址组成的数组.每一个函数地址是本模块中的一个输出函数的入口地址.


10)AddressOfNames

    这是一个RVA,指向一个由字符串指针组成的数组,每个字符串是本模块中以名字输出的输出函数的函数名.


11)AddressOfNameOrdinals

    这是一个RVA,指向一个word类型的数组,该word类型数组是本模块中所有以名字输出的输出函数的输出序号.

    

    假设一个dll有三个导出函数,分别如下:

   

序号 函数名

1     “myfun1″

2    

3     “myfun2″

    其中序号为2的函数只能通过序号导出.图示如下:


IMAGE_EXPORT_DIRECTORY                       函数地址表

|—————————|   |——->|——————|

|     Characteristics     |   |         | 0x400042″myfun1″ |

|—————————|   |         |——————|

|        ……           |   |         |    0x400085     |

|—————————|   |         |——————|

| NumberOfFunctions = 3 |   |         | 0x400197″myfun2″ |

|—————————|   |         |——————|

|    NumberOfNames   = 2     |   |        

|—————————|   |             函数名表

| AddressOfFunctions     |–| |—–>|————|

|—————————|    |     | 0xXXXXXXXX |->”myfun1″

| AddressOfNames          |—-|     |————|

|—————————|            | 0xXXXXXXXX |->”myfun2″

| AddressOfNameOrdinals |—-|     |————|

|—————————|    |

                                   |     函数名称地址索引表

                                   |—–>|———–|

                                           |     1     |

                                           |———–|

                                           |     3     |

                                           |———–|

                                        

    我们来看一下pe加载程序的工作机制.假设它知道函数名”myfun2″,那么加载程序将首先遍历函数名表,找到匹配的函数名”myfun2″.由于”myfun2″在函数名表里的索引是2,所以加载函数将在函数名称地址索引表的第二个元素里取得函数在函数地址表里的索引3,然后加载程序就会在函数地址表的第三个元素里取得函数的入口地址0x400197.

    这就是以名称导出函数的过程.

    如果是以序号导出函数地址的,那将更简单.加载程序将直接用序号在函数地址表里取出函数的入口地址.可以看出,以序号导出函数比以名称导出函数快,但以序号导出函数地址会带来维护的问题.有些api函数在不同的系统上导出序号并不相同.所以微软不推荐使用序号来导出函数.

    这里讲的是Base为1时的情形,如果Base域大于1,则在取得函数在函数地址表中的索引后,用这个索引值减去Base就可以得到函数在函数地址表中的偏移值.

输入表结构

我们知道,程序调用外部的dll函数通常都是下面这种形式:

    call my_label

    …

my_label: jmp dword ptr [xxxxxxxx]

    对一个dll中的函数的调用总是通过一个地址间接的调用的.这些地址就放在输入表里.

    

    输入表(Import Table),简而言之,就是描述该pe文件从哪几个动态连接库导入了什么函数的一组结构数组.在这里我希望能用最简洁的语言让你明白什么是输入表.输入表的组成并不复杂,只用到三个结构.它们是:IMAGE_IMPORT_DESCRIPTOR,IMAGE_THUNK_DATA,IMAGE_IMPORT_BY_NAME.

    我们先看一下框图.


                           IMAGE_IMPORT_DESCRIPTOR

                           |——————–|

|————————-| OriginalFirstThunk |

|                         |——————–|

|                         | TimeDateStamp    |

|                         |——————–|

|                         | ForwarderChain |

|                         |——————–|

|                         |       Name        |—-> “USER32.DLL”

|                         |——————–|

|                         |     FirstThunk     |—————————|

|                         |——————–|                          |

|                                                                           |

|     Hint-name table     IMAGE_IMPORT_BY_NAME   import address table(IAT) |

| |——————| |——————–| |——————|    |

|-> | IMAGE_THUNK_DATA |–>| 44 | “GetMessage”   |<–| IMAGE_THUNK_DATA |<—|

    |——————| |—-|—————| |——————|

    | IMAGE_THUNK_DATA |–>| 72 | “LoadIcon”    |<–| IMAGE_THUNK_DATA |

    |——————| |—-|—————| |——————|

    |     ……       |–>| .. |    ……     |<–|     ……     |

    |——————| |—-|—————| |——————|

    |       NULL       |                            |       NULL       |

    |——————|                            |——————|


    当然,这是描述从一个dll中引入函数的情形.从几个dll中引入函数,那么就有几个这样的结构.同时,这也是磁盘文件上的结构.装入内存后FirstThunk指向的结构数组会被修改.可以看下面的图.

    我们先来熟悉一下这三个结构的定义:


typedef struct _IMAGE_IMPORT_DESCRIPTOR {

    union {

         DWORD Characteristics;    // 0 for terminating null import descriptor

         DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)

    };

    DWORD TimeDateStamp;          // 0 if not bound,

                                   // -1 if bound, and real datetime stamp

                                   //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)

                                   // O.W. date/time stamp of DLL bound to (Old BIND)


    DWORD ForwarderChain;        // -1 if no forwarders

    DWORD Name;

    DWORD FirstThunk;             // RVA to IAT (if bound this IAT has actual addresses)

} IMAGE_IMPORT_DESCRIPTOR;


typedef struct _IMAGE_THUNK_DATA32 {

    union {

         PBYTE   ForwarderString;

         PDWORD Function;

         DWORD Ordinal;

         PIMAGE_IMPORT_BY_NAME   AddressOfData;

    } u1;

} IMAGE_THUNK_DATA32;


typedef struct _IMAGE_IMPORT_BY_NAME {

    WORD    Hint;               //指出函数在所在的dll的输出表中的序号

    BYTE    Name[1];            //指出要输入的函数的函数名

} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;


    下面我们讲解一下IMAGE_IMPORT_DESCRIPTOR结构的各个域的含义:

1)union {

         DWORD Characteristics;

         DWORD OriginalFirstThunk;

   };

    这个联合指向一个 IMAGE_THUNK_DATA 类型的结构数组.这个联合不是很重要,可以为0.

  

2)TimeDateStamp

    该dll的时间日期戳,一般为0.

  

3)ForwarderChain

    正向连接索引.一般为0.

  

4)Name

    dll名字的RVA.

  

5)FirstThunk

    这个域也是一个RVA,指向一个DWORD数组,数组以NULL结束.数组中的每个DWORD实际上是一个IMAGE_THUNK_DATA结构的联合体。IMAGE_THUNK_DATA联合体通常被解释为一个指向IMAGE_IMPORT_BY_NAME结构的RVA.


    从上图我们可以看出有两个并行的指针数组都指向IMAGE_IMPORT_BY_NAME结构.事实上,OriginalFirstThunk指向的IMAGE_THUNK_DATA结构数组从来不被修改,该数组有时也叫提示名表(Hint-name table),提示名表总是指向IMAGE_IMPORT_BY_NAME结构数组.而FirstThunk指向的IMAGE_THUNK_DATA结构数组在该pe文件被加载时,加载程序会修改该数组的内容.加载程序迭代搜索数组的每一个指针,找到每一个IMAGE_IMPORT_BY_NAME结构所对应的输入函数的地址,然后加载程序用找到的地址修改相应的IMAGE_THUNK_DATA结构.

    如前面提到的

          call my_label

          …

my_label: jmp dword ptr [xxxxxxxx]

    其中的xxxxxxxx就是FirstThunk指向的IMAGE_THUNK_DATA数组中的一个的值.因为FirstThunk所指向的数组在加载后是所有输入函数的地址,因此它被称为输入地址表(Import Address Table,IAT).

    pe文件加载后输入表的情形如下:

                           IMAGE_IMPORT_DESCRIPTOR

                           |——————–|

|————————-| OriginalFirstThunk |

|                         |——————–|

|                         | TimeDateStamp    |

|                         |——————–|

|                         | ForwarderChain |

|                         |——————–|

|                         |       Name        |—-> “USER32.DLL”

|                         |——————–|

|                         |     FirstThunk     |—————————|

|                         |——————–|                          |

|                                                                           |

|     Hint-name table     IMAGE_IMPORT_BY_NAME   import address table(IAT) |

| |——————| |——————–| |——————|    |

|-> | IMAGE_THUNK_DATA |–>| 44 | “GetMessage”   | |ptr of GetMessage |<—|

    |——————| |—-|—————| |——————|

    | IMAGE_THUNK_DATA |–>| 72 | “LoadIcon”    | | ptr of LoadIcon   |

    |——————| |—-|—————| |——————|

    |     ……       |–>| .. |    ……     | |     ……     |

    |——————| |—-|—————| |——————|

    |       NULL       |                            |       NULL       |

    |——————|                            |——————|

PE结构

     _______________________________

   | IMAGE_DOS_HEADER | <– Dos部首

   ——————————-

   | ‘PE’,0,0 | <– PE文件标志

   ——————————-

   | IMAGE_FILE_HEADER | <– 映像文件头

   ——————————-

   | IMAGE_OPTIONAL_HEADER32 | <– 映像可选头

   ——————————-

   | Section Table | <– 节表

   ——————————-

   | .text | <– 代码区段

   ——————————-

   | .data | <– 数据区段

   ——————————-

   | .idata | <– 输入表

   ——————————-

   | .edata | <– 输出表

   ——————————-

   | .reloc | <– 重定位表区段

   ——————————-

   | …. |

   ——————————-

   | 调试信息 |

几个结构

   typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header

00h WORD e_magic; // Magic number **DOS头标记

02h WORD e_cblp; // Bytes on last page of file

04h WORD e_cp; // Pages in file

06h WORD e_crlc; // Relocations

08h WORD e_cparhdr; // Size of header in paragraphs

0ah WORD e_minalloc; // Minimum extra paragraphs needed

0ch WORD e_maxalloc; // Maximum extra paragraphs needed

0eh WORD e_ss; // Initial (relative) SS value

10h WORD e_sp; // Initial SP value

12h WORD e_csum; // Checksum

14h WORD e_ip; // Initial IP value

16h WORD e_cs; // Initial (relative) CS value

18h WORD e_lfarlc; // File address of relocation table

1ah WORD e_ovno; // Overlay number

1ch WORD e_res[4]; // Reserved words

24h WORD e_oemid; // OEM identifier (for e_oeminfo)

26h WORD e_oeminfo; // OEM information; e_oemid specific

28h WORD e_res2[10]; // Reserved words

3ch LONG e_lfanew; // File address of new exe header **指向PE头部

   } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;


   typedef struct _IMAGE_NT_HEADERS {

   DWORD Signature; **PE文件标识

   IMAGE_FILE_HEADER FileHeader; **映像文件头

   IMAGE_OPTIONAL_HEADER32 OptionalHeader; **映像可选头

   } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

   typedef struct _IMAGE_FILE_HEADER {

   00h WORD Machine; **运行平台

   02h WORD NumberOfSections; **区块数目

   06h DWORD TimeDateStamp; **文件日期时间戳

   0Ah DWORD PointerToSymbolTable; **指向符号表

   0Eh DWORD NumberOfSymbols; **符号表中的符号数量

   12h WORD SizeOfOptionalHeader; **映像可选头结构的大小

   14h WORD Characteristics; **文件特征值

   } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

   typedef struct _IMAGE_OPTIONAL_HEADER {

   //

   // Standard fields.

   //


   00h WORD Magic; //幻数,32位pe文件总为010bh

   02h BYTE MajorLinkerVersion; //连接器主版本号

   03h BYTE MinorLinkerVersion; //连接器副版本号

   04h DWORD SizeOfCode; //代码段总大小

   08h DWORD SizeOfInitializedData; //已初始化数据段总大小

   0ch DWORD SizeOfUninitializedData; //未初始化数据段总大小

   10h DWORD AddressOfEntryPoint; //程序执行入口地址(RVA)

   14h DWORD BaseOfCode; //代码段起始地址(RVA)

   18h DWORD BaseOfData; //数据段起始地址(RVA)


   //

   // NT additional fields.

   //


   1ch DWORD ImageBase; //程序默认的装入起始地址

   20h DWORD SectionAlignment; //内存中区块的对齐单位

   24h DWORD FileAlignment; //文件中区块的对齐单位

   28h WORD MajorOperatingSystemVersion; //所需操作系统主版本号

   2ah WORD MinorOperatingSystemVersion; //所需操作系统副版本号

   2ch WORD MajorImageVersion; //自定义主版本号

   2eh WORD MinorImageVersion; //自定义副版本号

   30h WORD MajorSubsystemVersion; //所需子系统主版本号

   32h WORD MinorSubsystemVersion; //所需子系统副版本号

   34h DWORD Win32VersionValue; //总是0

   38h DWORD SizeOfImage; //pe文件在内存中的映像总大小

   3ch DWORD SizeOfHeaders; //从pe文件开始到节表(包含节表)的总大小

   40h DWORD CheckSum; //pe文件CRC校验和

   44h WORD Subsystem; //用户界面使用的子系统类型

   46h WORD DllCharacteristics; //为0

   48h DWORD SizeOfStackReserve; //为线程的栈初始保留的虚拟内存的默认值

   4ch DWORD SizeOfStackCommit; //为线程的栈初始提交的虚拟内存的大小

   50h DWORD SizeOfHeapReserve; //为进程的堆保留的虚拟内存的大小

   54h DWORD SizeOfHeapCommit; //为进程的堆初始提交的虚拟内存的大小

   58h DWORD LoaderFlags; //为0

   5ch DWORD NumberOfRvaAndSizes; //数据目录结构数组的项数,总为 00000010h

   60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

   //数据目录结构数组

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;


typedef struct _IMAGE_SECTION_HEADER {

   00h BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //块名,8个字节长

   08h union {

   DWORD PhysicalAddress; //obj文件中,区段的实际地址

   DWORD VirtualSize; //exe和dll文件中区段在文件中对齐前的大小

   } Misc;

   0ch DWORD VirtualAddress; //块的RVA(相对虚拟地址)

   10h DWORD SizeOfRawData; //在文件中对齐后的大小

   14h DWORD PointerToRawData; //在文件中的偏移

   18h DWORD PointerToRelocations; //重定位的偏移(obj文件中使用)

   1ch DWORD PointerToLinenumbers; //行号表的偏移(调试用)

   1eh WORD NumberOfRelocations; //重定位项数目(obj文件中使用)

   20h WORD NumberOfLinenumbers; //行号表中行号的数目

   24h DWORD Characteristics; //块属性

} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

朋友生日。。

今天朋友过生日。。8月十四。。。。。。。。。。。

提前回来了。。没什么意思。。昨天就想到了。。来中心值班。。。

又是一个无聊的夜晚。。怎么一到学校就没斗志了呀。。。

明天跟朋友去植物园玩。。买只烤鸡,再弄只烤鸭,再来两瓶啤酒。。哈哈。。想想就爽歪歪。。。

期待。。。。。。

想写点什么来着。。又想不起来了。。。。。。

大三的人啦。。快毕业了。。谁知道毕业了又该何去何从。。有的考研。。有的考公务员。。我倒不慌不忙什么都不着急。。。呵。。谁让咱心理素质这么好来着。。。

有个想法。。毕业了不想找工作了。。想自己弄个小项目玩玩。。。总给别人打工一辈子挣的钱也不够花。。。这个想法是晚上跟一个将要毕业的朋友聊天突然冒出来的。。想想有点好笑。。其实用心做好一件事。。不管做什么。。只要是用心。。。。肯定会成功的。。

相信自己!

出路。。。。

又到岔道口了。。。基本上算是有三条路可走吧。。。

first.老娘说的考研。。分析一下,高数还得从头学,英语又不占优势,政治也得从头学,什么都不会,专业课也不行。。。这条路我看走不通。。。

second.公务员。。这年头。。没点门门道道能考上公务员希望是什么渺茫的。。再说党员又不是那么好争的。。。没那实力。。

third.自己瞎混吧。。既然已经到了这个世界上。。就没有理由逃避。。老天爷大概可能已经给指好道路了吧。。有点祁人忧天。。不管咋的说吧。。就是在以后的时间里。。尽量多花点时间在看书上。以后想起来。。少点遗憾。。。。。昨天还是哈哈大笑呢。今天被老娘一个电话打得笑不出来了。。很沉重。。找工作家里是帮不上什么忙了。。。不过我现在的心态还是蛮好的。。不着急。。真的不着急。。不知道咋回事。。有可能是太理想化了。。也有可能是回归一颗平静的心了。。也有可能是太堕落了。。不思进取。。一切的可能吧。。我也说不太清楚。。。感觉一年半以后的今天我会找着工作的。。不知道哪来的感觉。。就是这感觉。。反正现在就是学。。。不浪费时间就好。。

老娘让我考研是因为找工作的时候家里帮不上什么忙。。万一找不着工作了。。怕把我憋坏。。呵呵。。什么都是路。。人走出来的嘛。。。

一颗平常的心。。一颗永远积极进取的心。。。

老天爷总是喜欢把机遇和幸运带给勤奋的人!