Android Linker与SO加壳技术

Android Linker与SO加壳技术
Android Linker与SO加壳技术

Android Linker与SO加壳技术

1. 前言

Android 系统安全愈发重要,像传统pc安全的可执行文件加固一

样,应用加固是Android系统安全中非常重要的一环。目前

Android 应用加固可以分为dex加固和Native加固,Native 加

固的保护对象为Native 层的SO 文件,使用加壳、反调试、混

淆、VM 等手段增加SO文件的反编译难度。目前最主流的SO 文

件保护方案还是加壳技术,在SO文件加壳和脱壳的攻防技术领

域,最重要的基础的便是对于Linker 即装载链接机制的理解。对

于非安全方向开发者,深刻理解系统的装载与链接机制也是进阶的

必要条件。

本文详细分析了Linker 对SO 文件的装载和链接过程,最后对SO 加壳的关键技术进行了简要的介绍。

对于Linker 的学习,还应该包括Linker 自举、可执行文件的加载等技术,但是限于本人的技术水平,本文的讨论范围限定在SO 文件的加载,也就是在调用dlopen("libxx.SO")之后,Linker 的处理过程。

本文基于Android 5.0 AOSP 源码,仅针对ARM 平台,为了增强可读性,文中列举的源码均经过删减,去除了其他CPU 架构的相关源码以及错误处理。

P.S. :阅读本文的读者需要对ELF 文件结构有一定的了解。

PP.S.:腾讯御安全,一站式解决安全问题,有android app 安全加固需求的同学欢迎联系我们,官方网站:https://www.360docs.net/doc/b816905822.html,

2. SO 的装载与链接

2.1 整体流程说明

1. do_dlopen

调用dl_open 后,中间经过dlopen_ext, 到达第一个主要函数do_dlopen:

soinfo* do_dlopen(const char* name, int flags, const Android_dlextinfo* extinfo) {

protect_data(PROT_READ | PROT_WRITE);

soinfo* si = find_library(name, flags, extinfo); // 查找 SO

if (si != NULL) {

si->CallConstructors(); // 调用 SO 的 init 函数

}

protect_data(PROT_READ);

return si;

}

do_dlopen 调用了两个重要的函数,第一个是find_library, 第二个是soinfo 的成员函数CallConstructors,find_library 函数是SO 装载链接的后续函数,完成SO 的装载链接后,通过CallConstructors 调用SO 的初始化函数。

2. find_library_internal

find_library 直接调用了find_library_internal,下面直接看find_library_internal函数:

static soinfo* find_library_internal(const char* name, int dlflags, const Android_dlextinfo* extinfo) {

if (name == NULL) {

return somain;

}

soinfo* si = find_loaded_library_by_name(name); // 判断 SO 是否已经加载if (si == NULL) {

TRACE("[ '%s' has not been found by name. Trying harder...]", name); si = load_library(name, dlflags, extinfo); // 继续 SO 的加载流程 }

if (si != NULL && (si->flags & FLAG_LINKED) == 0) {

DL_ERR("recursive link to \"%s\"", si->name);

return NULL;

}

return si;

}

find_library_internal 首先通过find_loaded_library_by_name 函数判断目标SO 是否已经加载,如果已经加载则直接返回对应的soinfo指针,没有加载的话则调用load_library 继续加载流程,下面看load_library 函数。

3. load_library

static soinfo* load_library(const char* name, int dlflags, const Android_dlextinfo* extinfo) {

int fd = -1;

...

// Open the file.

fd = open_library(name); // 打开 SO 文件,获得文件描述符fd

ElfReader elf_reader(name, fd); // 创建 ElfReader 对象

...

// Read the ELF header and load the segments.

if (!elf_reader.Load(extinfo)) { // 使用 ElfReader 的 Load 方法,完成 SO 装载

return NULL;

}

soinfo* si = soinfo_alloc(SEARCH_NAME(name), &file_stat); // 为 SO 分配新的 soinfo 结构

if (si == NULL) {

return NULL;

}

si->base = elf_reader.load_start(); // 根据装载结果,更新 soinfo 的成员变量

si->size = elf_reader.load_size();

si->load_bias = elf_reader.load_bias();

si->phnum = elf_reader.phdr_count();

si->phdr = elf_reader.loaded_phdr();

...

if (!soinfo_link_image(si, extinfo)) { // 调用 soinfo_link_image 完成 SO 的链接过程

soinfo_free(si);

return NULL;

}

return si;

}

load_library 函数呈现了SO 装载链接的整个流程,主要有3步:

1.装载:创建ElfReader对象,通过ElfReader 对象的Load 方法将SO

文件装载到内存

2.分配soinfo:调用soinfo_alloc 函数为SO 分配新的soinfo 结构,并

按照装载结果更新相应的成员变量

3.链接: 调用soinfo_link_image 完成SO 的链接

通过前面的分析,可以看到,load_library 函数中包含了SO 装载链接的主要过程, 后文主要通过分析ElfReader 类和soinfo_link_image 函数, 来分别介绍SO 的装载和链接过程。

2.2 装载

在load_library 中,首先初始化elf_reader 对象, 第一个参数为SO 的名字,第二个参数为文件描述符fd:

ElfReader elf_reader(name, fd)

之后调用ElfReader 的load 方法装载SO。

...

// Read the ELF header and load the segments.

if (!elf_reader.Load(extinfo)) {

return NULL;

}

...

ElfReader::Load 方法如下:

bool ElfReader::Load(const Android_dlextinfo* extinfo) {

return ReadElfHeader() && // 读取 elf header

VerifyElfHeader() && // 验证 elf header

ReadProgramHeader() && // 读取 program header

ReserveAddressSpace(extinfo) &&// 分配空间

LoadSegments() && // 按照 program header 指示装载segments

FindPhdr(); // 找到装载后的 phdr 地址

}

ElfReader::Load 方法首先读取SO 的elf header,再对elf header进行验证,之后读取program header,根据program header 计算SO 需要的内存大小并分配相应的空间,紧接着将SO 按照以segment 为单位装载到内存,最后在装载到内存的SO 中找到program header,方便之后的链接过程使用。

下面深入ElfReader 的这几个成员函数进行详细介绍。

2.2.1 read&verify elfheader

bool ElfReader::ReadElfHeader() {

ssize_t rc = read(fd_, &header_, sizeof(header_));

if (rc != sizeof(header_)) {

return false;

}

return true;

}

ReadElfHeader 使用read 直接从SO 文件中将elfheader 读取header 中,header_ 为ElfReader 的成员变量,类型为Elf32_Ehdr,通过header 可以方便的访问elf header中各个字段,elf header中包含有program header table、section header table等重要信息。

对elf header 的验证包括:

?magic字节

?32/64 bit 与当前平台是否一致

?大小端

?类型:可执行文件、SO …

?版本:一般为1,表示当前版本

?平台:ARM、x86、amd64 …

有任何错误都会导致加载失败。

2.2.2 Read ProgramHeader

bool ElfReader::ReadProgramHeader() {

phdr_num_ = header_.e_phnum; // program header 数量

// mmap 要求页对齐

ElfW(Addr) page_min = PAGE_START(header_.e_phoff);

ElfW(Addr) page_max = PAGE_END(header_.e_phoff + (phdr_num_ * sizeof(ElfW(Phdr))));

ElfW(Addr) page_offset = PAGE_OFFSET(header_.e_phoff);

phdr_size_ = page_max - page_min;

// 使用 mmap 将 program header 映射到内存

void* mmap_result = mmap(NULL, phdr_size_, PROT_READ, MAP_PRIVATE, fd_, page_min);

phdr_mmap_ = mmap_result;

// ElfReader 的成员变量 phdr_table_ 指向program header table

phdr_table_ = reinterpret_cast(reinterpret_cast(mmap_result) + page_offset);

return true;

}

将program header 在内存中单独映射一份,用于解析program header 时临时使用,在SO 装载到内存后,便会释放这块内存,转而使用装载后的SO 中的program header。

2.2.3 reserve space & 计算load size

bool ElfReader::ReserveAddressSpace(const Android_dlextinfo* extinfo) { ElfW(Addr) min_vaddr;

// 计算加载SO 需要的空间大小

load_size_ = phdr_table_get_load_size(phdr_table_, phdr_num_, &min_vaddr);

// min_vaddr 一般情况为零,如果不是则表明 SO 指定了加载基址

uint8_t* addr = reinterpret_cast(min_vaddr);

void* start;

int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS;

start = mmap(addr, load_size_, PROT_NONE, mmap_flags, -1, 0);

load_start_ = start;

load_bias_ = reinterpret_cast(start) - addr;

return true;

}

首先调用phdr_table_get_load_size 函数获取SO 在内存中需要的空间load_size,然后使用mmap 匿名映射,预留出相应的空间。

关于loadbias: SO 可以指定加载基址,但是SO 指定的加载基

址可能不是页对齐的,这种情况会导致实际映射地址和指定的加载

地址有一个偏差,这个偏差便是load_bias_,之后在针对虚拟地址

进行计算时需要使用load_bias_修正。普通的SO 都不会指定加

载基址,这时min_vaddr = 0,则load_bias_ = load_start_,即

load_bias_等于加载基址,下文会将load_bias_直接称为基址。

下面深入phdr_table_get_load_size分析一下load_size 的计算:使用成员变量phdr_table 遍历所有的program header,找到所有类型为PT_LOAD 的segment 的p_vaddr 的最小值,p_vaddr + p_memsz 的最大值,分别作为min_vaddr 和max_vaddr,在将两个值分别对齐到页首和页尾,最终使用对齐后的max_vaddr - min_vaddr 得到load_size。

size_t phdr_table_get_load_size(const ElfW(Phdr)* phdr_table, size_t phdr_count,

ElfW(Addr)* out_min_vaddr,

ElfW(Addr)* out_max_vaddr) {

ElfW(Addr) min_vaddr = UINTPTR_MAX;

ElfW(Addr) max_vaddr = 0;

bool found_pt_load = false;

for (size_t i = 0; i < phdr_count; ++i) { // 遍历 program header

const ElfW(Phdr)* phdr = &phdr_table[i];

if (phdr->p_type != PT_LOAD) {

continue;

}

found_pt_load = true;

if (phdr->p_vaddr < min_vaddr) {

min_vaddr = phdr->p_vaddr; // 记录最小的虚拟地址

}

if (phdr->p_vaddr + phdr->p_memsz > max_vaddr) {

max_vaddr = phdr->p_vaddr + phdr->p_memsz; // 记录最大的虚拟地址

}

}

if (!found_pt_load) {

min_vaddr = 0;

}

min_vaddr = PAGE_START(min_vaddr); // 页对齐

max_vaddr = PAGE_END(max_vaddr); // 页对齐

if (out_min_vaddr != NULL) {

*out_min_vaddr = min_vaddr;

}

if (out_max_vaddr != NULL) {

*out_max_vaddr = max_vaddr;

}

return max_vaddr - min_vaddr; // load_size = max_vaddr - min_vaddr

}

2.2.4 Load Segments

遍历program header table,找到类型为PT_LOAD 的segment:

1.计算segment 在内存空间中的起始地址segstart 和结束地址

seg_end,seg_start 等于虚拟偏移加上基址load_bias,同时由于mmap 的要求,都要对齐到页边界得到seg_page_start 和seg_page_end。

2.计算segment 在文件中的页对齐后的起始地址file_page_start 和长

度file_length。

3.使用mmap 将segment 映射到内存,指定映射地址为

seg_page_start,长度为file_length,文件偏移为file_page_start。bool ElfReader::LoadSegments() {

for (size_t i = 0; i < phdr_num_; ++i) {

const ElfW(Phdr)* phdr = &phdr_table_[i];

if (phdr->p_type != PT_LOAD) {

continue;

}

// Segment 在内存中的地址.

ElfW(Addr) seg_start = phdr->p_vaddr + load_bias_;

ElfW(Addr) seg_end = seg_start + phdr->p_memsz;

ElfW(Addr) seg_page_start = PAGE_START(seg_start);

ElfW(Addr) seg_page_end = PAGE_END(seg_end);

ElfW(Addr) seg_file_end = seg_start + phdr->p_filesz;

// 文件偏移

ElfW(Addr) file_start = phdr->p_offset;

ElfW(Addr) file_end = file_start + phdr->p_filesz;

ElfW(Addr) file_page_start = PAGE_START(file_start);

ElfW(Addr) file_length = file_end - file_page_start;

if (file_length != 0) {

// 将文件中的 segment 映射到内存

void* seg_addr = mmap(reinterpret_cast(seg_page_start),

file_length,

PFLAGS_TO_PROT(phdr->p_flags),

MAP_FIXED|MAP_PRIVATE,

fd_,

file_page_start);

}

// 如果 segment 可写, 并且没有在页边界结束,那么就将 segemnt end 到页边界的内存清零。

if ((phdr->p_flags & PF_W) != 0 && PAGE_OFFSET(seg_file_end) > 0) { memset(reinterpret_cast(seg_file_end), 0, PAGE_SIZE - PAGE_OFFSET(seg_file_end));

}

seg_file_end = PAGE_END(seg_file_end);

// 将 (内存长度 - 文件长度) 对应的内存进行匿名映射

if (seg_page_end > seg_file_end) {

void* zeromap = mmap(reinterpret_cast(seg_file_end),

seg_page_end - seg_file_end,

PFLAGS_TO_PROT(phdr->p_flags),

MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,

-1,

0);

}

}

return true;

}

2.3 分配soinfo

load_library 在调用load_segments 完成装载后,接着调用soinfo_alloc 函数为目标SO分配soinfo,soinfo_alloc 函数实现如下:

static soinfo* soinfo_alloc(const char* name, struct stat* file_stat) {

soinfo* si = g_soinfo_allocator.alloc(); //分配空间,可以简单理解为malloc

// Initialize the new element.

memset(si, 0, sizeof(soinfo));

strlcpy(si->name, name, sizeof(si->name));

si->flags = FLAG_NEW_SOINFO;

sonext->next = si; // 加入到存有所有 soinfo 的链表中

sonext = si;

return si;

}

Linker 为每个SO 维护了一个soinfo结构,调用dlopen时,返回的句柄其实就是一个指向该SO 的soinfo 指针。soinfo 保存了SO 加载链接以及运行期间所需的各类信息,简单列举一下:

装载链接期间主要使用的成员:

?装载信息

?const ElfW(Phdr)* phdr;

?size_t phnum;

?ElfW(Addr) base;

?size_t size;

?符号信息

?const char* strtab;

?ElfW(Sym)* symtab;

?重定位信息

?ElfW(Rel)* plt_rel;

?size_t plt_rel_count;

?ElfW(Rel)* rel;

?size_t rel_count;

?init 函数和finit 函数

?Linker_function_t* init_array;

?size_t init_array_count;

?Linker_function_t* fini_array;

?size_t fini_array_count;

?Linker_function_t init_func;

?Linker_function_t fini_func;

运行期间主要使用的成员:

?导出符号查找(dlsym):

?const char* strtab;

?ElfW(Sym)* symtab;

?size_t nbucket;

?size_t nchain;

?unsigned* bucket;

?unsigned* chain;

?ElfW(Addr) load_bias;

?异常处理:

?unsigned* ARM_exidx;

?size_t ARM_exidx_count;

load_library 在为SO 分配soinfo 后,会将装载结果更新到soinfo 中,后面的链接过程就可以直接使用soinfo的相关字段去访问SO 中的信息。

...

si->base = elf_reader.load_start();

si->size = elf_reader.load_size();

si->load_bias = elf_reader.load_bias();

si->phnum = elf_reader.phdr_count();

si->phdr = elf_reader.loaded_phdr();

...

2.4 链接

链接过程由soinfo_link_image 函数完成,主要可以分为四个主要步骤:

1. 定位dynamic section,

由函数phdr_table_get_dynamic_section 完成,该函数会遍历program header,找到为类型为PT_DYNAMIC 的header, 从中获取的是dynamic section 的信息,主要就是虚拟地址和项数。

2. 解析dynamic section

dynamic section本质上是类型为Elf32_Dyn的数组,Elf32_Dyn 结构如下

typedef struct {

Elf32_Sword d_tag; /* 类型(e.g. DT_SYMTAB),决定 d_un 表示的意义*/

union {

Elf32_Word d_val; /* 根据 d_tag的不同,有不同的意义*/

Elf32_Addr d_ptr; /* 虚拟地址 */

} d_un;

} Elf32_Dyn;

Elf32_Dyn结构的d_tag属性表示该项的类型,类型决定了dun中信息的意义,e.g.:当d_tag = DT_SYMTAB表示该项存储的是符号表的信息,d_un.d_ptr 表示符号表的虚拟地址的偏移,当d_tag = DT_RELSZ时,d_un.d_val 表示重定位表rel的项数。

解析的过程就是遍历数组中的每一项,根据d_tag的不同,获取到不同的信息。dynamic section 中包含的信息主要包括以下3 类:

- 符号信息- 重定位信息- init&finit funcs

3. 加载needed SO

调用find_library 获取所有依赖的SO 的soinfo 指针,如果SO 还没有加载,则会将SO 加载到内存,分配一个soinfo*[]指针数组,用于存放soinfo 指针。

4. 重定位

重定位SO 链接中最复杂同时也是最关键的一步。重定位做的工作主要是修复导入符号的引用,下面一节将对重定位过程进行详细分析。

soinfo_link_image 的示意代码:

static bool soinfo_link_image(soinfo* si, const Android_dlextinfo* extinfo) {

...

// 1. 获取 dynamic section 的信息,si->dynamic 指向 dynamic section

phdr_table_get_dynamic_section(phdr, phnum, base, &si->dynamic,

&dynamic_count, &dynamic_flags); ...

// 2. 解析dynamic section

uint32_t needed_count = 0;

for (ElfW(Dyn)* d = si->dynamic; d->d_tag != DT_NULL; ++d) { switch (d->d_tag) {

// 以下为符号信息

case DT_HASH:

si->nbucket = reinterpret_cast(base + d->d_un.d_ptr)[0];

si->nchain = reinterpret_cast(base + d->d_un.d_ptr)[1];

si->bucket = reinterpret_cast(base + d->d_un.d_ptr + 8);

si->chain = reinterpret_cast(base + d->d_un.d_ptr + 8 + si->nbucket * 4);

break;

case DT_SYMTAB:

si->symtab = reinterpret_cast(base + d->d_un.d_ptr);

break;

case DT_STRTAB:

si->strtab = reinterpret_cast(base + d->d_un.d_ptr);

break;

// 以下为重定位信息

case DT_JMPREL:

si->plt_rel = reinterpret_cast(base + d->d_un.d_ptr);

break;

case DT_PLTRELSZ:

si->plt_rel_count = d->d_un.d_val / sizeof(ElfW(Rel));

break;

case DT_REL:

si->rel = reinterpret_cast(base + d->d_un.d_ptr);

break;

case DT_RELSZ:

si->rel_count = d->d_un.d_val / sizeof(ElfW(Rel));

break;

// 以下为 init&finit funcs

case DT_INIT:

si->init_func = reinterpret_cast(base + d->d_un.d_ptr);

break;

case DT_FINI:

...

case DT_INIT_ARRAY:

si->init_array = reinterpret_cast(base + d->d_un.d_ptr);

break;

case DT_INIT_ARRAYSZ:

...

case DT_FINI_ARRAY:

...

case DT_FINI_ARRAYSZ:

...

// SO 依赖

case DT_NEEDED:

...

...

}

...

// 3. 加载依赖的SO

for (ElfW(Dyn)* d = si->dynamic; d->d_tag != DT_NULL; ++d) { if (d->d_tag == DT_NEEDED) {

soinfo* lsi = find_library(library_name, 0, NULL);

si->add_child(lsi);

*pneeded++ = lsi;

}

}

*pneeded = NULL;

...

// 4. 重定位

soinfo_relocate(si, si->plt_rel, si->plt_rel_count, needed);

soinfo_relocate(si, si->rel, si->rel_count, needed);

...

// 设置已链接标志

si->flags |= FLAG_LINKED;

DEBUG("[ finished linking %s ]", si->name);

2.4.1 重定位relocate

Android ARM 下需要处理两个重定位表,plt_rel 和rel,plt 指的是延迟绑定,但是Android 目前并不对延迟绑定做特殊处理,直接与普通的重定位同时处理。两个重定位的表都由soinfo_relocate 函数处理。

soinfo_relocate 函数需要遍历重定位表,处理每个重定位项,每个重定位项的处理过程可以分为3 步:

1. 解析重定位项和导入符号的信息

重定位项的结构如下

typedef struct {

Elf32_Addr r_offset; /* 需要重定位的位置的偏移 */

Elf32_Word r_info; /* 高24位为符号在符号表中的

index,低8位为重定位类型 */

} Elf32_Rel;

首先从重定位项获取的信息如下:

?重定位的类型type

?符号在符号表中的索引号sym,sym 为0表示为本SO内部的重定位,如果不为0,意味着该符号为导入符号

?重定位的目标地址reloc,使用r_offset + si_load_bias,相当于偏移地址+基地址

符号表表项的结构为elf32_sym:

typedef struct elf32_sym {

Elf32_Word st_name; /* 名称 - index into string table

*/

Elf32_Addr st_value; /* 偏移地址 */

Elf32_Word st_size; /* 符号长度( e.g. 函数的长度) */ unsigned char st_info; /* 类型和绑定类型 */

unsigned char st_other; /* 未定义 */

Elf32_Half st_shndx; /* section header的索引号,表示位

于哪个 section 中 */

} Elf32_Sym;

2. 如果sym 不为0,则查找导入符号的信息

如果sym 不为0,则继续使用sym 在符号表中获取符号信息,从符号信息中进一步获取符号的名称。随后调用soinfo_do_lookup 函数在所有依赖的SO 中根据符号名称查找符号信息,返回值类型为elf32_sym,同时还会返回含有该符号的SO 的soinfo( lsi ),如果查找成功则该导入符号的地址为:

sym_addr = s->st_value + lsi->load_bias;

3. 修正需要重定位的地址

根据重定位类型的不同,修正重定位地址,具体的重定位类型定义和计算方法可以参考aaelf 文档的4.6.1.2 节。

对于导入符号,则使用根据第二步得到sym_addr 去修正,对于SO 内部的相对偏移修正,则直接将reloc的地址加上SO 的基址。

static int soinfo_relocate(soinfo* si, ElfW(Rel)* rel, unsigned count, soinfo* needed[]) {

ElfW(Sym)* s;

soinfo* lsi;

android课程介绍

1.课程基本信息 课程编号:M21F58D10 课程名称:Android应用与开发 开设学期:第3学期 总学时:60 总学分:4 课程类别:岗位能力课程课程性质:必修课 适用专业:软件技术(移动应用开发) 责任单位:计算机与软件学院 2.课程定位 《Android应用与开发》课程是软件技术(移动应用开发方向)专业的岗位能力课程,课程的开设依据是软件技术专业人才培养目标和相关职业岗位(群)的能力要求,对本专业所面向的手机软件开发与测试、软件开发与项目管理等岗位所需要的知识、技能和素质目标的达成起支撑作用。 在课程设置上,前导课程有《Java程序设计》(M21F1611),《数据结构》(M21F232),后续课程有《移动互联网开发综合实训》(M21J57B10)、《毕业实习》(M21J991)。 3.课程设计思路 首先依据专业人才培养方案中关于人才培养目标的阐述,明确课程目标;其次,结合职业教育课程观、教学观、能力观,基于软件工程的开发过程,以项目化教学来组织课程内容,在课程内容的选择与排序中,以软件项目研发的不同阶段、典型任务为载体,将课程内容划分为互相联系的学习情景;第三,通过对各学习情景中学习目标、主要内容、授课方式、师生要求等各项内容的描述,来规范课程所要求的内容;第四,通过对课程内容的选取和组合,以一个完整的项目为载体,完成课程的实施;最后,通过对项目实施过程中各个环节的考察和评价,来完成对课程的评鉴与考核。 本课程在设计上本着懂方法,重应用的总体思路,突出体现职业教育的技能型、应用性特色,着重培养学生的实践应用技能,力求达到理论方法够用,技术技能过硬的目的。 4.课程建设基本理念 本课程按照理论实践一体、课内外互补、课堂教学与培优工程相结合的课程设计指导思想,以任务或项目为载体组织教学内容,突出学生的主体地位,实现“教、学、做”的有机融合;通过班级讲授、团队学习、个体辅导、展示交流、技能大赛等手段,实现从模仿到应用到创新的高职学生递进式培养。 本课程强调对学生职业岗位能力的培养和职业素养的养成,针对不同环节,采用特定的教学方法,有意识、有步骤地将职业能力的训练和职业素养的形成融入到实际的教学过程中。

(完整版)常见几种脱壳方法

----------------<小A分>---------------- 一、概论 壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳(强壳)两种 "UPX" "ASPCAK" "TELOCK" "PELITE" "NSPACK(北斗)" ... "ARMADILLO" "ASPROTECT" "ACPROTECT" "EPE(王)" "SVKP" ... 顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。 当然加密壳的保护能力要强得多! -----------<小A分割线>------------- 二、工具的认识 OllyDBG ring3 shell层级别的动态编译工具、 PEid、 ImportREC、 LordPE、 softIce ring0级别调试工具 -------------<小A分割>------------------- 三、常见手动脱壳方法 预备知识 1.PUSHAD (入栈/压栈)代表程序的入口点, 2.POPAD (弹栈/出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近 3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。 ------------<小A分割线>-------------------- 方法一:单步跟踪法 1.用OD载入,点“不分析代码!” 2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4) 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选) 4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现! 5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP 6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入 7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN 的一般很快就会到程序的OEP。 近CALL F7 远CALL F8 Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,

中国古代神话与传说 论文

选修课论文 课程:中国古代神话与传说班级:旅游产业管理 姓名:方军 学号:20090420105

中国古代神话与传说所体现的民族精神 系别:媒介管理系班级:旅游产业管理学号:20090420105 姓名:方军摘要:神话与传说是民族性的反映,中华民族文化灿烂辉煌,古代神话可谓是中国文化的源头,上古时代的中国先民们在征服自然和改造自然的过程中,把自己的意愿和幻想虚化成意象集合体,从而孕育了中华民族不屈不挠、自强不息、舍己为人、仁爱善良的民族精神,成为了中华民族的精神瑰宝。 关键字:神话与传说体现民族精神 神话产生在生产力和人们的认识能力都十分低下的原始时代,那时人类的意识开始发展,但思维能力极为简单,原始人对自然界和自然现象以及人类自身无法进行科学的理解和解释,他们只能凭借自己狭隘的生活体验加以想象和幻想,因而认为自然界也像人一样有意志、有性格、有感情,日、月、风、雨、雷、电,都有神在主宰着。这样,就在原始人头脑中形成了自然神的观念。从这些神话故事,我们可以看到原始人对周围世界及其自身的幼稚的认识和虚妄的想象,当然,也可以理解这正是原始人对其周围世界和他们自身的奥秘的某些探索。不言而喻,原始人所创造的这些神以及各种神的威力,只不过是还没有被人们认识的各种自然威力在人们头脑中所引起的幼稚的幻想而已,是原始人通过幻想把各种各样的自然力加以形象化、人格化的产物。 中国古代神话与传说是中华民族的文化源头,孕育了中华民族特有的民族精神。本文从以下几方面进行论述: 一、中国古代神话中体现出的不屈不挠,自强不息的民族精神从中国古代神话中我们可以看到,那些英雄神们为了达到某种理想,敢于斗争,不屈不挠,与恶劣的环境抗争。如,我们很熟悉的《女娲补天》,女娲补天时面临的是一场大灾难,人类几乎被逼到了无法生存的灭绝境地。此时,女娲“炼五色石以补苍天”,依靠顽强的精神和坚忍不拔的毅力,经过艰苦的斗争战胜灾难,终于还人间一个安定的生存空间。从这则神话故事里我们不难想象,当时的人类是面临着怎样的灾难和恶劣的生存状况,先民们把解除灾难的希望寄托在英雄人物身上,而在其背后,不难看出先民们所希冀的那种坚韧不屈,自强不息的坚毅的民族精神。而这种坚毅的精神在继而出现的精卫和夸父身上得到了进一步的升华。

Android智能手机软件开发概述

第1章Android智能手机软件开发概述 随着移动设备的普及,其功能越来越完善,移动设备的系统平台也日渐火热。 本章首先介绍智能手机及其操作系统平台(如Symbian、Android、Windows Mobile、IOS等),并对学习Android手机软件开发的必要性进行阐述。之后, 介绍Android平台的总体架构,并对完成Android应用程序软件开发的SDK及 其组成进行简要说明。最后,对通过Android Market发布自己应用程序的方法 进行介绍。学习本章内容时,要求重点掌握如下内容: ●了解常见的智能手机操作系统平台。 ●了解Android的总体结构及主要功能。 ●了解Dalvik虚拟机、AVD等。 ●了解Android Market及发布应用程序的方法。 1.1 智能手机及其操作系统 据中国互联网络信息中心于2011年7月19日发布的统计《中国互联网络发展统计报告》显示,2011年上半年,我国手机网民规模继续稳步扩大。截至2011年6月底,我国手机网民达3.18亿,较2010年底增加1495万人(如图1.1所示)。可以说,智能手机正在快速走进人们的生活。就目前来看,已经有越来越多的人开始把智能手机当作日常看视频、办公的首选设备。随着A9架构、双核概念的问世,智能手机能更广泛、轻松地接管生活和工作中的大小事务[1]。因此,学习和研究智能手机软件开发,具有广阔的社会需求和工程实践意义。 图1.1 手机上网网民规模 智能手机一般指像个人电脑一样具有独立操作系统,可由用户自行安装软件等第三方服务商提供的程序,并且,用户能对手机功能进行扩充。目前,全球多数手机厂商都有智能手

中国古代神话漫谈

中国古代神话漫谈 神话是反映古代人们对世界起源、自然现象及社会生活的原始理解,并通过超自然的形象和幻想的形式来表现的故事和传说。它并非现实生活和科学反映,而是由于古代生产力的水平很低,人们不能科学地解释世界起源、自然现象和社会生活的矛盾、变化,借助幼稚的想象和幻想,把自然力拟人化的产物。神话往往表现了古代人民对自然力的斗争和对理想的追求。因此也可以说,神话就是古代人类企图认识自然、征服自然的幻想故事。

关于神话产生的历史年代,目前主要有三种说法:一、野蛮期低级阶段说。马克思指出:“在野蛮期的低级阶段,人类高级属性开始发展起来。……想象,这一作用于人类发展如此之大的功能,开始于此时产生的神话、传奇和传说等未记载的文学,而业已给予人类以强有力的影响”(《摩尔根〈古代社会〉一书摘要》)。建国以后,这种说法成为权威观点而被接受,所谓野蛮期低级阶段,相当于大约一万年前的新石器时代,在社会形态上属于母系氏族的全盛时期。 二、蒙昧期高级阶段说。即认为神话产生于大约四、五万年前至一、二万年前

的旧石器时代晚期,亦即母系氏族社会初期。因为这一时期已经有了弓箭、琢磨石器和木舟等,这些在神话中有所反映。三、蒙昧期中级阶段说。理由是这一阶段已经出现了动物图腾这种人类首次不自觉造的神,从而形成了原始神话的萌芽和胚胎。另外,许多人在谈到神话产生的时代时,都笼统地称之为“人类童年时代”。关于神话消亡的年代,目前也尚无定论。 神话产生的原因,大致可从两方面来认识:其一,它是远古人类在生产力和知识水平极为低下的时代,为了解释神奇莫测的自然现象和社会现象而产生

的。正如鲁迅所说:“昔者初民,见天地万物变异不常,其现象又出于人力所能之上,则自造众说以解释之。凡所解释,今谓之神话”(《中国小说史略》)。其二,它是在人力不能征服自然的情况下,通过神的力量来表达远古人民征服自然的愿望而产生的。正如马克思所说:“任何神话都是用想象或借助想象以征服自然力,支配自然力。把自然力加以形象化”(《〈政治经济学批判〉导言》)。总之,神话是人类社会初期那种认识世界、改造世界的思维方式下产生的。对这个问题,近年来还有“神话起源于劳动”“神话起源于宗教”“神话起源于自然崇拜”

Android平台介绍及使用指导

Android平台介绍及使用指导 二○一○年二月 版本 1.0

目录 Android平台介绍 ................................................................................... - 4 -基本名词...................................................................................................................... - 5 - 操作方法介绍 .......................................................................................... - 6 - 手机按键介绍.............................................................................................................. - 6 - 快捷键介绍.................................................................................................................. - 6 - 信息功能介绍.............................................................................................................. - 7 - 联系人功能介绍........................................................................................................ - 11 - 通话记录功能介绍.................................................................................................... - 14 - 文本粘贴/复制功能介绍.......................................................................................... - 14 - Push Email(Moxier)功能介绍............................................................................ - 15 - 电子邮件功能介绍.................................................................................................... - 16 - 桌面功能介绍............................................................................................................ - 19 - 蓝牙功能介绍............................................................................................................ - 23 - Wifi功能介绍........................................................................................................... - 23 - 飞行模式功能介绍.................................................................................................... - 23 - CDMA数据链接介绍................................................................................................... - 24 - 黑屏解锁功能............................................................................................................ - 25 - 回复出厂设置............................................................................................................ - 26 - 应用程序设置............................................................................................................ - 26 - GPS设置..................................................................................................................... - 27 - 手机中英文语言切换................................................................................................ - 28 - 更换手机输入法........................................................................................................ - 29 - 数据线链接Android手机........................................................................................ - 29 - 手机测试模式进入方法............................................................................................ - 30 - 横屏显示介绍............................................................................................................ - 30 - 浏览器功能介绍........................................................................................................ - 31 - RSS功能介绍............................................................................................................ - 32 - Q/A- 34 -

加壳与脱壳应用及实现

加壳与脱壳的应用与实现

一、加壳 (2) 1.什么是壳 (2) 2.加壳原因 (2) 3.壳的加载过程 (3) 4.压缩引擎 (5) 5.常见的加壳工具 (6) a.常用压缩壳介绍 (6) b.加密保护壳介绍 (7) 二、脱壳 (10) 1.侦壳 (10) 2.脱壳 (13) a.查找程序的真正入口点(OEP) (13) b.抓取内存映像文件 (15) c.输入表重建 (15) 附:视频“加壳与脱壳(软件)”和“手动脱壳” (17)

加壳与脱壳 一、加壳 1.什么是壳 在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。 图1.1 2.加壳原因 就把这样的程序称为“壳”了。 作者编好软件后,编译成exe可执行文件。 1)有一些版权信息需要保护起来,不想让别人随便改动,如作者

的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。 2)需要把程序搞的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩。 3)在黑客界给木马等软件加壳脱壳以躲避杀毒软件。实现上述功能,这些软件称为加壳软件。 3.壳的加载过程 1)获取壳自己所需要使用的API地址 如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,甚至只有Kernel32.dll以及GetProcAddress这个API 函数。 壳实际上还需要其他的API函数来完成它的工作,为了隐藏这些API,它一般只在壳的代码中用显式链接方式动态加载这些API函数2)解密原程序的各个区块(Section)的数据 壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个区块。在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。壳一般按区块加密的,那么在解密时也按区块解密,并且把解密的区块数据按照区块的定义放在合适的内存位置。 如果加壳时用到了压缩技术,那么在解密之前还有一道工序,当然是解压缩。这也是一些壳的特色之一,比如说原来的程序文件未加壳时1~2M大小,加壳后反而只有几百K。

浅析中国神话发展

浅析中国神话发展 在中国众多文化瑰宝中,最为瑰丽的当属代代相传、百世传承的古代神话传说。然而,比之其他体系的神话,拥有至少2230年传承历史的中国神话传说,却并未得到真正系统的、有序的传播与发扬。就这一问题,笔者曾与上海交通大学中文系的孟令兵博士探讨,孟博士认为,中国传统神话的不系统,不成熟,原因在于“中国没有像其他神话体系成熟的国家那样经历过英雄时代和史诗时代”。在中国历史上,确确实实存在英雄,也确实存在着诸多诗话词说,但是都并不能升华为时代,或者说,并没有一个能够长久的给人们带来崇拜与寄托的历史阶段。 “英雄时代的概念有狭义和广义两个方面。狭义的英雄时代专应用于古希腊史,即指荷马史诗所反映的时代;而广义的英雄时代则推广应用于各个民族的历史,泛指其历史上相当于荷马 时代的那个发展阶段”[1]。“英雄时代属于野蛮时代高级阶段,是铁剑、铁犁和铁斧的时代,也 是军事民主制时代”[2]。 很显然,从中国的社会、文化、政治制度来看,最初是氏族部落原始社会的禅让制;最早有历史记载的夏朝开始实行世袭制、传子制;商朝实行内服外服制度;西周开始实行分封制、宗法制和礼乐制;春秋战国时期,各诸侯拥兵自立,世间制度开始向中央集权君主专制转型;自秦朝起,中国正式进入封建社会;1912年中华民国正式立国,政治制度为民主共和制;1949年新中国成立至今,中国实行人民代表大会制度。可以看到,中国从没有一个时期是盛产民间英雄的,由于长期处于封建制度,所谓的英雄大多成为了帝王将相,难以登上百姓心中的神坛,也仅有少数如武神关羽、都江堰二郎神李二郎等人,或是由于流传于民间的声望超绝,或是功绩卓越,被后世奉为神明,但是对于这些“人神”,或者称之为偶像崇拜更为贴切,他们的“封神”,并不像《封神演义》中被封神榜加封神位的天神一样,被纳入了神话体系之中,与其他主流神明产生了互动影响。 从神的存在价值来看,神是被特定人群敬仰、将之作为精神依托的存在。随着人们生活水平、社会认知能力的发展,人们对于周遭环境的认知与未知均在与日俱增,往往,当人们生活中发生的难以解释的事情会被归为神迹、人们对新生活的希望会寄予神灵,于是,相应的神灵也就应运而生。中国古代烧饭用灶,然而灶易失火,失火又被百姓认为是国君不贤、天降神罚,因此国君便向天神祭祀,立罪己诏,百姓为了避免失火遭殃,也向神明祭祀祈祷,于是“灶王爷”的传说便流传出来,灶神文化因而诞生。类似地,中国很多的神明都是由现实生活的物质人格化产生,进而在民间流传,可是这种人格化是不充分的[3]:“中国神话中的人格化同样是形式的和表面的,只以纯然一般的力量和自然活动作为它的内容,人格化主要不表现在人的性格和感情上,只限于说话、思维、人的某些动作和行为这些人的部分特性上。这是造成中国神话不丰富的重要原因之一”。中国的这类神并没有被赋予希腊神话中诸神那种灵动的人格,或者称之为神格,因而只能被归为民俗文化,却不能被当作是神话传说流传。 因此,由上述内容可以看出,一个完整、系统的神话体系产生与传承,与其诞生的背景、产生的目的和被赋予的人格可认为是关键。在笔者看来,神话存在的原因主要有以下四点: 一、巩固皇权。在很多国家、政权的历史上,“君权神授”是当权者巩固权力、加强统 治力量的常用手段。进而,与君主、领袖相关的异象便被认为是神迹。如伏羲、女 娲是“人头蛇身”,黄帝的子孙轩辕国民是“人面蛇身,尾交首上”(《山海经·海 外西经》),祝融是“兽身人面”(《山海经·海外南经》),蚩尤是“人身牛蹄”(任 [1]出自《古希腊“英雄时代”辨析》(中华硕博网)。 [2]同[1]。 [3]选自《汉族神话不发达原因再探——与印度神话思维的比较研究》第三节(《云南社会科学》2003年第1期南京师范大学文学院王青教授)

1.android发展历程简介

android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache 开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1] 2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 编程语言 C/C++(底层)Java等(应用层) 系统家族 类Unix,Linux 源码模式 自由及开放源代码软件 内核类型 宏内核(Linux内核) 软件许可 Apache License、GPL等 1系统简介编辑 Android一词的本义指“机器人”,同时也是Google于2007年11月5日 Android logo相关图片(36张) 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上

VB加壳脱壳程序源码

VB加壳脱壳程序源码 1、窗体代码 Private Sub Check1_Click() Text2.SetFocus End Sub Private Sub Image2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Image10.Visible = False End Sub Private Sub Image3_Click() If Text1.Text = "" Then MsgBox "Please Select A File First!", vbInformation Else List1.Visible = True List2.Visible = False Frame3.Visible = False List1.Text = " UPX 1.24 " Text2.SetFocus End If End Sub Private Sub Command2_Click() Dim path As String, back_path As String, file_t As String 'Dim's strings Text2.SetFocus CommonDialog1.ShowOpen Text1.Text = CommonDialog1.FileName path = Text1.Text back_path = "Backupfile.exe" If Check1.Value = 1 Then i = FreeFile Open path For Binary As #i file_t = Space(LOF(i)) Get #i, , file_t Close #i Open back_path For Binary As #i Put #i, , file_t Close #i MsgBox " A Backup of the file has been created in the same location as the original file", vbInformation End If End Sub Private Sub Image3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Image8.Visible = True End Sub Private Sub Image3_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Image8.Visible = False

怎样使用脱壳软件

第二节脱壳 一切从“壳”开始 吴朝相1999.2.23 (搜新网https://www.360docs.net/doc/b816905822.html,) 我写这篇东西的主要目的是让初到本站的新手们能对“壳”有个大概的认识,知道我每天说了些什么。限于本人的知识,如果有ERROR 之处,还请多原谅。如果你觉得还可以,也欢迎转贴,但请保留文章的完整性和作者的资料。当然如果你想把它发表,硬塞些稿费给俺花花,我也不会拒绝的。;) 作为一个以“壳”为主的站台,如果连访者连什么是“壳”都不清楚的话,那我也太失败了。很早以前就想写编完全关于“壳”的文章,但苦于时间和文字水平的关系,都没提笔。本着对站台负责的态度,现在经过一天的努力,“打”出这编尝试由壳的历史一直谈到最新发展的本章来。 首先我想大家应该先明白“壳”的概念。在自然界中,我想大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。 最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件RCOPY 3 的作者熊焰先生。在几年前的DOS 时代,“壳”一般都是指磁盘加密软件的段加密程序,可能是那时侯的加密软件还刚起步不久吧,所以大多数的加密软件(加壳软件)所生成的“成品”在“壳”和需要加密的程序之间总有一条比较明显的“分界线”。有经验的人可以在跟踪软件的运行以后找出这条分界线来,至于这样有什么用这个问题,就不用我多说了。但毕竟在当时,甚至现在这样的人也不是很多,所以当RCOPY3 这个可以很容易就找出“分界线”,并可以方便的去掉“壳”的软件推出以后,立即就受到了很多人的注意。老实说,这个我当年在《电脑》杂志看到广告,在广州电脑城看到标着999元的软件,在当时来说,的确是有很多全新的构思,单内存生成EXE 可执行文件这项,就应该是世界首创了。但它的思路在程序的表现上我认为还有很多可以改进的地方(虽然后来出现了可以加强其功力的RO97),这个想法也在后来和作者的面谈中得到了证实。在这以后,同类型的软件想雨后春笋一般冒出来,记得住名字的就有:UNKEY、MSCOPY、UNALL .... 等等,但很多的软件都把磁盘解密当成了主攻方向,忽略了其它方面,当然这也为以后的“密界克星”“解密机器”等软件打下了基础,这另外的分支就不多祥谈了,相信机龄大一点的朋友都应该看过当时的广告了。 解密(脱壳)技术的进步促进、推动了当时的加密(加壳)技术的发展。LOCK95和BITLOK 等所谓的“壳中带籽”加密程序纷纷出笼,真是各出奇谋,把小小的软盘也折腾的够辛苦的了。正在国内的加壳软件和脱壳软件较量得正火红的时候,国外的“壳”类软件早已经发展到像LZEXE 之类的压缩壳了。这类软件说穿了其实就是一个标准的加壳软件,它把EXE 文件压缩了以后,再在文件上加上一层在软件被执行的时候自动把文件解压缩的“壳”来达到压缩EXE 文件的目的。接着,这类软件也越来越多,PKEXE、AINEXE、UCEXE 和后来被很多人认识的WWPACK 都属于这类软件,但奇怪的是,当时我看不到一个国产的同类软件。 过了一段时间,可能是国外淘汰了磁盘加密转向使用软件序列号的加密方法吧,保护EXE 文件不被动态跟踪和静态反编译就显得非常重要了。所以专门实现这样功能的加壳程序便诞生了。MESS 、

中国古代神话脉络

中国古代神话脉络 中国古代神话分三个历史时期,(1)盘古开天地-刑天杀天帝上古神时期(2)刑天杀天帝-武王伐纣自然神时期(3)武王伐纣-至今修炼神时期,生灵修炼成神。 古希腊神话有神话时代和英雄时代,其实中国上古神话也可以这么分,以帝尧为分界线,之前可以称之为神话时代,主线故事是创世,造人,三皇五帝的三次神战、妖神鬼怪及其纷争,帝尧之后可以称之为英雄时代,主线故事是羿和禹等人的英雄事迹及部落纷争。腹黑男帝尧是连接两个时代的关键。 天地混沌之初,有盘古,龙首蛇身,双目开闭为日夜,嘘为风雨,吹为雷电,每天撑开混沌天地一仗,天地增长为九万里,神曲化为大地,血液为江河,双目成日月,肌肉为田地,皮肤化为草木。 盘古死后,先天混沌之气产生了中国古代神话的最高神明,昊天上帝,即天帝,亦称太一、皇天。楚国称其为东皇太一,(屈原诗)。其人格不显,为全知全能的神。太一和鸿钧含义接近,因此有人说太一是鸿钧老祖。 盘古“开目为昼,闭目为夜”的功能被烛龙所继承,烛龙也就是烛九阴,住在钟山,人称钟山之神,长的是人面蛇身,显然和龙首蛇身的盘古有亲缘关系,另外一个和盘古有亲缘关系的,是住在雷泽的雷神,长的是人首龙身。雷神很重要,一定要记得。 而伏羲,女娲,神农三人就是传说中三皇五帝中的三皇。三皇是怎么来的呢,话说燧人氏当政的时期,风姓的华胥氏部落有个妹子,就叫她华胥吧,她跑到雷泽去玩,看到有个巨大的脚印,是的,正是上文提到的住在雷泽的那个大人物留下的,于是乎悠悠然踩了上去,估计妹子想的是踩一踩又不会怀孕,悲剧的是,她怀孕了。生的两个孩子,诸位都知道,一个叫做伏羲,一个叫做女娲。当然为什么雷神的后代长的和烛九阴一样是人首蛇身是个值得深思的问题。(什么?其实脚印是烛九阴的?烛九阴根本就没有脚啊啊啊啊)伏羲,取得了河图洛书,推演了先天十六卦,算尽天机,天帝封其为五方上帝,也就是五帝之一,掌管东方,属木,号称青帝,人称太昊,其所在的风姓伏羲氏部落,是中华民族的源起。伏羲和女娲作为兄妹,在昆仑山交合产生了人类,咦,人类不是盘古的精气孕化的吗,我嚼得应该不是一个品种,估计盘古精气所产生的那一拨就是《黄帝内经》

自我介绍,android

自我介绍,android 篇一:安卓应用软件个人简历 个人简历 篇二:面试时自我介绍整理合集 应聘面试自我介绍范文 尊敬的领导: 您好! 我是×××,毕业于××学校××专业,获得的是××学位 在学校期间,主修的专业课有×××(此处添加技术类专业课,尤其是和应聘工作相关的),根据所学的知识,也参加过一些具体项目的事实,比如××××项目,在其中负责××模块或者××工作,应用了×××计算机语言或者技术,取得了×××什么样的成果。并在实践中,加深了对××的认识,提高了软件设计(或其他技术)的实际操作能力。 另外,在学校中也参加过一些社团活动,比如××(此处最好说1-2样),在其中加强了和同学们的团队协作,并且有×××的感受和知识。个性上××××(此处copy简历里面的性格介绍,主要要有团队精神,个人踏实努力,有责任感之类的) 在这里应聘贵公司的××职位,是想将自己的所学得到充分发挥,并在这里学习成长。希望有这样的机会,能和诸位成为同事。 我的情况大概就是这样,请问您有什么其他方面想要了解的么?(主

体说完之后来句这个,可以直接话题过度给面试的人,省得最后冷场)文员面试自我介绍范文 经过长期的实践和研究,面试文员的朋友需要注意三项文员面试技巧。文员面试自我介绍范文下次奉上。 文员面试技巧一:文职岗位要求面试者有很好的亲和力,能与其他人进行充分的沟通,这就要求面试者必须要保持良好的心态来面对招聘人员。关键要做到八个字——顺其自然,不卑不亢。只有这样才能给招聘人员留下好印象,使其相信你有能力在将来进入公司后与同事和谐的相处。 要做到面带微笑,平视考官,避免情绪波动,走向两个极端:一是自卑感很重,觉得坐在对面的那人博学多才、回答错了会被笑话。所以,畏首畏尾,不敢畅快地表达自己的观点;另一种情况则是,很自信,压根不把招聘人员放在眼里,觉得对方还不如自己。这两种表现都要不得,最好的表现应是,平视对方,彬彬有礼,不卑不亢。 应树立两种心态:一.面试的目的是合作而不是竞争。招聘人员对考生的态度一般是比较友好的,他目的是把优秀的人才遴选进自己的公司增强公司的竞争力,而不是为与考生一比高低而来,所以考生在心理上不要定位谁强谁弱的问题,那不是面试的目的。二.面试中两者的地位是平等的,面试者是求职不是乞职。 面试者是在通过竞争,谋求职业,而不是向招聘人员乞求工作,成功的关键在于自己的才能以及临场发挥情况。 文员面试技巧二:面试者要注意自己在面试中的礼仪问题。因为文职

【精品】中国古代神话故事

课外阅读(必读书目)测试题 书名:《中国古代神话故事》 一、填空题(24分) 1.在盘古开天辟地之前,天和地混沌一团,好像一个_________,盘古开天辟地之后,天上有了___________,地上有了___________、鸟兽虫鱼,天地间有了一个丰富多彩的世界。 2.女娲补天是用许许多多五彩的_________,架起火将它们熔化成_____,来填补天上的窟窿。 3.炎帝的女儿女娃死后,她的灵魂化作了一只_______,____脑袋,____嘴壳,_____脚爪。 4.后羿的妻子是________,她吃了_______________飞到了_________上。 5.刑天左手握着_________的盾牌,右手拿着______________,直杀到皇帝的宫殿前。 6.女娲用手在池边挖了些______,和上______,照着自己的影子捏人。 7.雷公惩罚人类,六个月不下雨,高比去偷雨水。雷公非常生气,想用________劈死高比,却被高比用_________活捉了。 8.愚公家的门口有两座大山,一座叫___________,一座叫____________。 9.牛郎和织女被__________分隔开了,两人只能深情对望,后来,他们每年的阴历____________见一面。 10.冷热二神住到人间,_____个月换一回班,中间歇______个月。 二、选择题(40分) 1.一个年轻英俊的英雄,是个神箭手,他的名字叫()?

A.后羿 B.夸父 C. 盘古 D.炎帝 2.夸父死后,把自己的木杖扔出去,木杖落地的地方,顿时生出了大片郁郁葱葱的()。 A.苹果树 B.桃树 C.梨树 D.柳树 3.禹带领人们治水经过了()年,终于将大水治理好。 A.10 B.11 C.12 D.13 4.共工氏死后,人们奉他为() A.火神 B.雷神 C.水神 D.社神 5.()是人们常说的能起死回生的药。 A.四叶草 B.灵芝草 C.人参 D.驴蹄草 6.伏羲和女娲用雷公的牙齿种下后,长成了() A.一个大葫芦 B.一颗大牙齿 C.一棵大树 D.一艘大船 7.()把水王烧成了一块石头。 A.火神 B.托塔李天王 C.玉帝 D.电母 8.婺女和儿子混配后繁衍的后代是()族? A.苗族 B.藏族 C.黎族 D.傣族 9.()立了大功,被封为十二属相之首。 A.牛 B.虎 C.猪 D.鼠 10.纺花仙女给海生穿了一套() A.金线衣 B.银线衣 C.铁衣 D.铜衣 11.花龙抢走了八仙中的()? A.铁拐李 B.吕洞宾 C.蓝采和 D.何仙姑 12.瑶姬用碧玉簪把十二条孽龙杀死,它们的尸体变成了() A.大河 B.高山 C.火山 D.大海

android应用技术简介

Android技术应用简介 摘要:近几年来,Android逐渐成为便携设备上的主要操作系统。2011年Android 在全球的市场份额首次超过塞班系统,跃居全球第一。本文主要通过阐述Android的主要思想、发展状况以及核心技术来使读者对Android有一个初步的认识。 关键词:Android、linux、NDK、google 这学期我们开设了《Android应用程序开发》这门课程。这么课程开始的时候同学们都很兴奋。因为Android在现在是最为流行的操作系统。同学们大部分用的手机都是Android操作系统。所以对它的名字非常熟悉,但是对它的真正意义和具体是如何实现Android应用程序却十分陌生。同学们都希望了解到自己的手机上的应用程序到底是如何实现其功能的。所以对这门课程产生了极大的兴趣。 这门课程主要给我们介绍了Android开发环境、应用程序、生命周期、用户界面、组件通信与广播信息、后台服务、数据存储与访问、位置服务与地图应用、Android NDK开发这9个方面的内容。让我们对Android有一个初步的认知。这本书上的内容仅仅是Android程序开发的一小部分,是引导我们正确看待Android。在今后的学习中还需要我们多看关于Android的书籍,关注Android 各方面的消息,多做关于Android的实验和课题。这样才能进一步了解这个当今全球最为流行的操作系统。 1、Android简介 Android是一种以linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由google 收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。 Android的系统架构和其它操作系统一样,采用了分层的架构。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。 Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android 应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。 在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:python、lua、tcl、php等等),还有其他诸如:QT(qt for android)、Mono(mono for android)等一些著名编程框架也开始

相关文档
最新文档