Python快速入门

基础语法

冒号+缩进:Python语法功能的一部分,表达代码的所属关系
冒号+缩进是语法的一部分,缩进不正确程序运行错误
冒号+缩进是表达代码间包含和层次关系的唯一方式
只需要所有缩进长度一致即可,可采用N个空格或Tab,建议4个空格

·变量的使用无需定义,可以直接使用
·变量的赋值:使用等号(=)为变量赋值

流程控制

数据类型

image-20200925184731807

(2)数字类型:浮点数类型
·与数学中的实数含义相同,带有小数及小数的数字,存在取值范围
·浮点数包括常规方法和科学计数法2种方式表示
·如:0.0043=4.3e-3科学计数法:e表示a*10b

(3)数字类型:复数类型
·与数学中的复数概念相同,定义j=V-I,复数表示为a+bj
·z=a+bj,a是实部,b是虚部,a和b都是浮点数·z.real获得z的实部,z.imag获得z的虚部

(4)字节类型:字符串类型
·由0个或多个字符组成的有序字符序列
·字符串由一对单引号或一对双引号表示,如:“字符串”或‘字符串
·字符串是字符的有序序列,可以用序号访问,如:“字符串“[1]=“符”

image-20200925185105667

image-20200925185202293

组合类型

image-20200925185322882

image-20200925185348323

image-20200925185415691

image-20200925185433478

image-20200925185633735

字符串操作

image-20200925185936134

image-20200925193737700

image-20200925193839238

image-20200925194004511

image-20200925194027784

不确定尾数

image-20200925194303715

image-20200925194331606

image-20200925195001067

image-20200925195124757

image-20200925195258302

image-20200925195318387

image-20200925195528321

image-20200925195514074

image-20200925195652879

image-20200925195727285

image-20200925195812866

image-20200925195851755

字节串处理方法

image-20200925200236477

image-20200925200259079

循环完成奖励

image-20200926164103109

库引用

image-20200925192627725

image-20200925192750244

image-20200925192822623


异常处理

image-20200926165041492

else奖励 python特色…..

lambda/函数

使用globa保留字在函数内部声明并使用全局变量

image-20200926165603586

image-20200926165644577

组合数据类型

image-20200926171021182

image-20200926171141449

image-20200926171259187

集合

image-20200926171324513

image-20200926171604660

序列

image-20200926171645693

image-20200926171716164

image-20200926171731453

字典

image-20200926172004990

image-20200926172022596

image-20200926172036104

组合类型操作函数

集合

image-20200926212505324

image-20200926212610311

image-20200926212734721

image-20200926212742583

image-20200926212827263

image-20200926212944584

image-20200926213017089

image-20200926213143734

元组

image-20200926213241570

image-20200926213318340

image-20200926213404246

image-20200926213456014

image-20200926213528459

#### 列表

image-20200926213622297

image-20200926213640679

image-20200926213705179

image-20200926213715401

image-20200926213819560

image-20200926213839481

image-20200926214005598

image-20200926214047930

字典

image-20200926214627020

image-20200926214250601

image-20200926214319909

image-20200926214349373

image-20200926214446917

文件操作

image-20200927150659029

image-20200927150717509

image-20200927150744154

image-20200927150850906

image-20200927150901906

image-20200927151025226

image-20200927151303975

image-20200927152512902

image-20200927152531131)image-20200927152651110

image-20200927152729559

面向对象

image-20200926172513401

image-20200926172757073

image-20200926172825189

image-20200926173241355

image-20200926173339536

image-20200926173416819

image-20200926173547252

image-20200926173802257

类似java static

image-20200926174002654

image-20200926174058391

image-20200926174128058

image-20200926174201154

image-20200926174226153

image-20200926174255257

image-20200926174331259

image-20200926174424974

image-20200926174521139

image-20200926174541392

image-20200926174746864

image-20200926174825274

image-20200926174851948

image-20200926175022290

image-20200926175125907

image-20200926175147643

## 封装

image-20200929172041700

image-20200929172053040

image-20200929172109447

image-20200929172551327

image-20200929172616688

image-20200929173007270

形式上的私有

image-20200929173054827

image-20200929173221123

image-20200929173232504

image-20200929174138338

image-20200929174524608

image-20200929174552610

image-20200929174616846

多态

image-20201005113700314

image-20201005114448795

继承

image-20200929175044882

image-20200929175124339

image-20200929175141470

image-20200929175229950

image-20200929175857444

image-20200929175930776

image-20200929180204984

image-20200929180412493

image-20200929180426086

image-20200929180529622

image-20200929180601829

image-20200929180701794

image-20200929180848034

运算符重载

image-20201005111826833

image-20201005111924036

image-20201005112013550

image-20201005112022160

image-20201005112056611

image-20201005112110889

image-20201005112200284

image-20201005112236835

image-20201005112320837

image-20201005112406335

image-20201005112800643

image-20201005112849138

image-20201005113113787

image-20201005113130048

image-20201005113138271

image-20201005113145859

image-20201005113154572

对象引用

深拷贝:

image-20201010155717287

image-20201010155731540

image-20201010155745041

image-20201010155803835

类进阶

image-20201010160553424

image-20201010155833998

image-20201010155845304

累的装饰器:

image-20201010160009454

image-20201010160033058

自定义异常:

image-20201010160122358

image-20201010160133658

名称修饰:

image-20201010160304193

image-20201010160320287

image-20201010160333171

image-20201010160344808

image-20201010160401156

image-20201010160410558

最小空类

image-20201010160442059

image-20201010160453870

image-20201010160501850

Python计算生态

标准库

time

image-20200928172857670

image-20200928172105609

image-20200928171700585

image-20200928171710251

image-20200928171806946

image-20200928172029142

image-20200928172037239

image-20200928172054454

image-20200928172140547

image-20200928172148165

image-20200928172202333

image-20200928172232982

image-20200928172638693

image-20200928172740363

image-20200928172754789

image-20200928172814709

image-20200928172825421

random

image-20200928172949184

image-20200928173044511

image-20200928173108265

image-20200928173120121

image-20200928173136458

image-20200928173146885

image-20200928173158600

image-20200928173224916

re

image-20200928173932053

image-20200928174554547

image-20200928173332417

image-20200928173355955

image-20200928173455571

image-20200928173639980

image-20200928174014882

image-20200928174107807

image-20200928174221437

image-20200928174315602

match从开始进行匹配

image-20200928174359642

image-20200928174436697

image-20200928174508678

image-20200928174518772

image-20200928174647631

image-20200928174720909

image-20200928182109039

image-20200928182119874

image-20200928174905115

os

image-20200928182756707

image-20200928183124024

image-20200928183323110

image-20200928182804889

image-20200928182819715

image-20200928183006965

image-20200928183030527

image-20200928183036775

image-20200928183053210

image-20200928183106328

image-20200928183142908

image-20200928183221276

image-20200928183236679

image-20200928183252710

fielcmp

image-20200928183402148

image-20200928183732383

image-20200928184342919

image-20200928184416289

image-20200928184453835

image-20200928184722720

image-20200928184735163

image-20200928184845399

sys

image-20200929162043006

image-20200929162102278

image-20200929162154018

image-20200929162342343

image-20200929162434088

image-20200929162502367

getopt

image-20200929162708699

image-20200929162724364

image-20200929162921863

image-20200929162952589

image-20200929163522770

第三方库

第三方库安装

image-20200929164535750

image-20200929164545361

image-20200929164639716

image-20200929164654041

image-20200929164704398

image-20200929164713297

image-20200929164742604

image-20200929164751157

image-20200929164930356

image-20200929165201158

image-20200929165323282

image-20200929165340981

image-20200929165457830

image-20200929165508953

image-20200929165521075

image-20200929165535075

image-20200929165551019

image-20200929165718357

image-20200929165804729

jieba库

image-20200925192854586

image-20200925193111957

深入理解import系统

image-20201010160815558

image-20201010160901787

image-20201010160913575

image-20201010160942138

image-20201010160948740

image-20201010161014093

image-20201010161104282

image-20201010161141202

image-20201010161205016

image-20201010161229046

image-20201010161447246

image-20201010161500493

image-20201010161514994

image-20201010161557177

image-20201010161608506

image-20201010161631678

image-20201010161706069

Python进阶语法

image-20201010165441758

上下文管理器

image-20201010162317422

image-20201010162438027

image-20201010162518105

image-20201010162716401

image-20201010162816434

image-20201010162851456

image-20201010163047373

迭代器

image-20201010163202003

image-20201010163224228

image-20201010163533937

image-20201010163632252)image-20201010163651843

生成器

image-20201010163733746

image-20201010163746387

image-20201010163940533

image-20201010164052888

image-20201010164112225

image-20201010164206349

装饰器

image-20201010164232325

image-20201010164315378

image-20201010164404382

image-20201010164529314

image-20201010164551650

image-20201010164803425

image-20201010164903842

image-20201010165100605

异步协程

image-20201010165211730

image-20201010165228412

image-20201010165307241

image-20201010165330868

JavaScript数组操作整理

1. join()

功能:将数组中所有元素都转化为字符串并连接在一起。

2. reverse()

功能:将数组中的元素颠倒顺序。

3. concat()

功能:数组拼接的功能 ,返回新数组,原数组不受影响。

4. slice()

截取数组生成新数组,原数组不受影响。
返回的数组包含第一个参数指定的位置和所有到但不含第二个参数指定位置之间的所有元素。如果为负数,表示相对于数组中最后一个元素的位置。如果只有一个参数,表示到数组末尾。

1
2
3
4
5
6
7
8
var aa = [1,2,3,4,5,6];
console.log(aa.slice(2)); //[3,4,5,6]
console.log(aa.slice(2,8)); //[3,4,5,6] 超过最大长度,只显示到最后结果
console.log(aa.slice(2,5)); //[3,4,5]
console.log(aa.slice(2,-1)); //[3,4,5] 相对于倒数第一个之前
console.log(aa.slice(2,-2)); //[3,4] 相对于倒数第二个之前
console.log(aa.slice(3)); //[4,5,6] 一个参数从第三个到最后
console.log(aa.slice(-2));//[5,6] 一个参数负值从倒数第二个到最后

5. splice()

功能:从数组中删除元素、插入元素到数组中或者同时完成这两种操作。
输入:第一个参数为指定插入或删除的起始位置,第二个参数为要删除的个数。之后的参数表示需要插入到数组中的元素 。如果只有一个参数,默认删除参数后边的所有元素。
输出:返回一个由删除元素组成的数组。
注意:新建了一个数组,并修改了原数组

1
2
3
4
5
6
7
var aa = [1,2,3,4,5,6];
console.log(aa.splice(4)); //[5,6] 返回删除后的数组
aa; // [1,2,3,4]
console.log(aa.splice(2,2)); //[3,4] 从第二位起删除两个元素
aa; //[1,2]
console.log(aa.splice(1,0,7,8)); //[]从第一位起删除0个元素,添加7,8到原数组
aa;//[1,7,8,2]

6. push()

在数组末尾添加一个或多个元素,并返回新数组长度

7. pop()

从数组末尾删除1个元素(删且只删除1个), 并返回 被删除的元素

8. shift()

在数组开始添加一个或多个元素,并返回新数组长度

9. unshift()

在数组开始删除一个元素(删且只删除1个),并返回 被删除的元素

10. toString()和toLocaleString()

将数组的每个元素转化为字符串,并且输入用逗号分隔的字符串列表。功能类似join();

11. indexOf()和lastIndexOf()

indexOf() 两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的开头(位置 0)开始向后查找。没找到返回-1. 返回查找项的索引值
lastIndexOf() 从数组的末尾开始向前查找。返回查找项的索引值(索引值永远是正序的索引值),没找到返回-1

在数学中高阶函数听起来很大上,JavaScript中也有的,其实就是把一个函数作为另一个函数的参数,不要被高阶吓到了,下边几种数组方法都属于此。

A. sort();

默认情况下sort()方法没有传比较函数的话,默认按字母升序,如果不是元素不是字符串的话,会调用toString()方法将元素转化为字符串的Unicode(万国码)位点,然后再比较字符。所以用默认方法排序数据是有问题的。

1
2
3
4
5
6
7
8
var arr = [20,10,2,1,3];
arr.sort();// [1, 10, 2, 20, 3]
arr.sort(function(a,b){
return a-b; //升序
}); //[1, 2, 3, 10, 20]
arr.sort(function(a,b){
return b-a; //降序
}); //[20,10,3,2,1]

B. forEach()

从头至尾遍历数组,为每个元素调用指定函数
输入为一个待遍历函数,函数的参数依次为:数组元素、元素的索引、数组本身

C. map()

调用的数组的每一个元素传递给指定的函数,并返回一个新数组 ,不修改原数组。

1
2
3
4
5
var arr = [2,3,4,5,6];
var bb= arr.map(function(x){
return x*x;
});
console.log(bb); // [4, 9, 16, 25, 36]

D. filter()

过滤功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组。
可以巧妙的用来去重

1
2
3
4
5
var a = [1,2,3,4,5,6,3,1];
a.filter(function(v,i,self){
return self.indexOf(v) == i;
});
//[1, 2, 3, 4, 5, 6]

E. every()和some()

every() 判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回true。
some() 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true。

1
2
3
4
var arr = [1, 2, 3, 4, 5, 6];
arr.every(x=>x>0);//return true;
arr.every(x=>x>5);//return false;
arr.some(x=>x>5);//return true;

F. reduce()和reduceRight()

reduce() 两个参数:函数和递归的初始值。从数组的第一项开始,逐个遍历到最后
reduceRight() 从数组的最后一项开始,向前遍历到第一项

1
2
3
4
5
//可以用reduce快速求数组之和
var arr=[1,2,3,4];
arr.reduce(function(a,b){
return a+b;
}); //10

作者:提笔忘字书生
链接:https://www.jianshu.com/p/22a4c0b514fa
来源:简书

Vue.js基础

基本指令

v-clock解决闪烁

image-20200904102048570

背后的原理:先通过样式隐藏内容,然后在内存中进行值的替换,替换好之后再显示最终的结果

v-text

v-model

事件:v-on:click @click

$event 事件对象

常用特性

表单操作

设置value 绑定 通过js提交

表单修饰符:

number:转化为数值
trim:去掉开始和结尾的空格
lazy:将input事件切换为change事件

1
<input v-model.number="age"type="number">

自定义指令

image-20200922123511555

image-20200922124229124

image-20200922124412333

计算属性

计算属性与方法的区别:
计算属性是基于它们的依赖进行缓存的
方法不存在缓存

Computed 内的方法

过滤器

过滤器的作用是什么?
格式化数据,比如将字符串格式化为首字母大写,将日期格式化为指定的格式等

image-20200922132910524

image-20200922133111711

image-20200922133219170

侦听器

应用场景:数据变化时执行异步或开销较大的操作

image-20200922131906563

生命周期

image-20200922133703829

组件化开发

注册组件

image-20200924103309449

image-20200927160902802

:data是一个函数

image-20200924104215945

如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是在普通的标签模板中,必须使用短横线的方式使用组件

值传递

image-20200924105239162

image-20200924105444631

props属性值类型
字符串 String
数值 Number
布尔值 Boolean
数组 Array
对象 Objects

事件定义传递信息

image-20200924110155323

image-20200924110341351

非父子组件间传递

image-20200924110812414

插槽slot

ps:必须写在子标签内

image-20200924111822809

位于字组件的模板中

image-20200924111903310

image-20200924112108074

template 包裹多条

作用域插槽

父组件对子组件加工处理 父组件定义样式

image-20200925102255391

前后端交互

异步请求

image-20200925112340831

image-20200925112556918

image-20200925112617296

image-20200925112636604

axiox

image-20200925113457295

image-20200925113532262

image-20200925113641561

image-20200925113849542

image-20200925114007818

async/await

image-20200927104729815

image-20200927105329443

路由

component Vue自定义的,就是用于组件占位

基本使用

image-20200926102436888

image-20200926102708213

image-20200926103843311

image-20200926103953117

重定向

image-20200926111053150

嵌套路由

image-20200926111434238

image-20200926111533942

image-20200926111550754

动态路由匹配

image-20200926112727088

$route与对应路由形成高度耦合,不够灵活,所以可以使用props将组件和路由解耦

image-20200926113009413

image-20200926113157523

当props为对象参数时,:id 无法被访问

image-20200926113411866

动态静态参数结合

命名路由

image-20200926113615195

编程式导航

image-20200926113750469

image-20200926114054307

image-20200926114030138

前端工程化

模块化规范

image-20200927161719129

image-20200927162355949

image-20200927162538731

image-20200927162643183

webpack

基本使用

image-20200927162908719

image-20200927163155921

image-20200927163524589

image-20200927164021869)image-20200927165216831

image-20200927165424762

image-20200927170245648

loader加载器

image-20200927170442580

image-20200927170525356

image-20200927170842832

​ use数组中指定的1oader顺序是固定的
​ 多个1oader的调用顺序是:从后往前调用

image-20200927171154171

image-20200927171221778

image-20200927171515593

image-20200927171801639

image-20200927172052526

Vue单文件组件

image-20200927172317952

image-20200927172409974

image-20200927173214593

image-20200927173949695

打包发布

image-20200927174656710

Vue脚手架

image-20200927174950800

image-20200927175119855

image-20200927180301923

image-20200927182426354

image-20200927182450508

image-20200927182513277

Vue扩展 数组api

image-20200923104140427

image-20200923104940716

Vue3

setup

ref和reactive

Android开发-第一行代码

移动互联网应用开发,<第一行代码>学习笔记

第一行代码

活动

UI

4种基本布局

碎片

广播

广播机制

1.

接收广播

两种接收广播方式,动态和静态

动态:

image-20200903142917925

静态:

image-20200903143008117

image-20200903143048442

发送广播

image-20200903143149056

有序广播:

image-20200903143359780

image-20200903143423362

可以通过修改 属性指定接收优先级

image-20200903143506265

截断广播

本地广播:

前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序
接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易引起安全性的问题,
比如说我们发送的-些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不
停地向我们的广播接收器里发送各种垃圾广播。

image-20200903143938078

image-20200903144111997

持久化

文件存储

Context类中提供了一一个openFile0utput()方法,可以用于将数据存储到指定的文件中。

image-20200903144850065

从文件中读取数据:

image-20200903144927517

SharedPreferences:

不同于文件的存储方式, SharedPreferences 是使用键值对的方式来存储数据的。也就是说,
当保存一-条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过
这个键把相应的值取出来。而且SharedPreferences 还支持多种不同的数据类型存储,如果存储的
数据类型是整型,那么读取出来的数据也是整型的;如果存储的数据是一-个字符串,那么读取出
来的数据仍然是字符串。

image-20200903145215809

读取内容:

image-20200903145231181

SQLite数据库存储

SQLiteOpenHelper,

image-20200903145659280
image-20200903145705736

image-20200903145748648

添加数据:

image-20200903145853524

更新数据:

image-20200903150046143

image-20200903150100595

删除数据:

image-20200903150152859

查询数据:

image-20200903150333357

使用Sql操作:(无返回值)

image-20200903150400528

内容提供器

运行时权限申请

image-20200903151018503

ContentResolver用法

多媒体

子线程中更新UI

使用AsyncTask

image-20200903152501054

image-20200903152512846

image-20200903152436285

image-20200903152442426

网络

服务

位置

MaterialDesign UI

进阶技巧

加密与解密-调试篇(OD)

快捷键的使用

Ctrl+F2 - 重启程序,即重新启动被调试程序。如果当前没有调试的程序,OllyDbg会运行历史列表[history

list]中的第一个程序。程序重启后,将会删除所有内存断点和硬件断点。

译者注:从实际使用效果看,硬件断点在程序重启后并没有移除。

Alt+F2 - 关闭,即关闭被调试程序。如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。

F3 - 弹出“打开32位.EXE文件”对话框[Open 32-bit .EXE file],您可以选择可执行文件,并可以输入运行参数。

Alt+F5 -

让OllyDbg总在最前面。如果被调试程序在某个断点处发生中断,而这时调试程序弹出一个总在最前面的窗口(一般为模式消息或模式对话框[modal message

or dialog]),它可能会遮住OllyDbg的一部分,但是我们又不能移动最小化这个窗口。激活OllyDbg(比如按任务栏上的标签)并按

Alt+F5,OllyDbg将设置成总在最前面,会反过来遮住刚才那个窗口。如果您再按一下Alt+F5,OllyDbg会恢复到正常状态。

OllyDbg是否处于总在最前面状态,将会保存,在下一次调试时依然有效。当前是否处于总在最前面状态,会显示在状态栏中。

F7 -

单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。如果当前命令是是含有REP前缀,则只执行一次重复操作。

Shift+F7 -

与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。

Ctrl+F7 -

自动步入,在所有的函数调用中一条一条地执行命令(就像您按住F7键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。每次单步步入,OllyDbg都会更新所有的窗口。所以为了提高自动步入的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步入。

F8 -

单步步过到下一条命令。如果当前命令是一个函数,则一次执行完这个函数(除非这个函数内部包含断点,或发生了异常)。如果当前命令是含有REP前缀,则会执行完重复操作,并停在下一条命令上。

Shift+F8 -

与F8相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步过被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。

Ctrl+F8 -

自动步过,一条一条的执行命令,但并不进入函数调用内部(就像您按住F8键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步过过程都会停止。每次单步步过,OllyDbg都会更新所有的窗口。所以为了提高自动步过的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步过。

F9 - 让程序继续执行。

Shift+F9 -

与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。

Ctrl+F9 -

执行直到返回,跟踪程序直到遇到返回,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条命令执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。

Alt+F9 -

执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。

Ctrl+F11

-Run跟踪步入,一条一条执行命令,进入每个子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。

F12 - 停止程序执行,同时暂停被调试程序的所有线程。请不要手动恢复线程运行,最好使用继续执行快捷键或菜单选项(像 F9)。

Ctrl+F12 - Run跟踪

步过,一条一条执行命令,但是不进入子函数调用,,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。

Esc - 如果当前处于自动运行或跟踪状态,则停止自动运行或跟踪;如果CPU显示的是跟踪数据,则显示真实数据。

Alt+B - 显示断点窗口。在这个窗口中,您可以编辑、删除、或跟进到断点处。

Alt+C - 显示CPU窗口。

Alt+E - 显示模块列表[list of modules]。

Alt+K - 显示调用栈[Call stack]窗口。

Alt+L - 显示日志窗口。

Alt+M - 显示内存窗口。

Alt+O - 显示选项对话框[Options dialog]

Ctrl+P - 显示补丁窗口。

Ctrl+T - 打开 暂停 Run跟踪 对话框

Alt+X - 关闭 OllyDbg。

大多数窗口都支持以下的键盘命令:

Alt+F3 - 关闭当前窗口。

c.&vWmLSGE

Ctrl+F4 - 关闭当前窗口。

F5 - 最大化当前窗口或将当前窗口大小改为正常化。

F6 - 切换到下一个窗口。

Shift+F6 - 切换到前一个窗口。

F10 - 打开与当前窗口或面板相关的快捷菜单。

左方向键 - 显示窗口左方一个字节宽度的内容。

Ctrl+左方向键 - 显示窗口左方一栏的内容。

右方向键 - 显示窗口右方一个字节宽度的内容

Ctrl+右方向键 - 显示窗口右方一栏的内容

反汇编窗口中的快捷键[Disassembler shortcuts]

当CPU窗口中的反汇编面板[Disassembler pane]处于激活状态时,您可以使用以下快捷键:

回车键 - 将选中的命令添加到命令历史[command history]中,如果当前命令是一个跳转、函数或者是转换表的一个部分,则进入到目的地址。

退格键 - 移除选中部分的自动分析信息。如果分析器将代码误识别为数据,这个快捷键就非常有用。请参考解码提示[decoding hints].

Alt+退格键 - 撤消所选部分的修改,以备份数据的相应内容替换所选部分。仅当备份数据存在且与所选部分不同时可用。

Ctrl+F1 -如果API帮助文件已经选择,将打开与首个选择行内的符号名相关联的帮助主题。

F2 -在首个选择的命令上开关INT3 断点[Breakpoint],也可以双击该行第二列。

Shift+F2 -在首个选择命令设置条件断点,参见忽略Kernel32中内存访问异常[Ignore memory access violations

in Kernel32]。

F4

-执行到所选行,在首个选择的命令上设置一次性断点,然后继续执行调试程序,直到OllyDbg捕获到异常或者停止在该断点上。在程序执行到该命令之前,该一次性断点一直有效。如有必要,可在断点窗口[Breakpoints

window]中删除它。

Shift+F4 -设置记录断点(一种条件断点,当条件满足时一些表达式的值会记录下来), 详情参见断点[Breakpoint]。

Ctrl+F5 -打开与首个选择的命令相对应的源文件。

Alt+F7 -转到上一个找到的参考。

Alt+F8 -转到下一个找到参考。

Ctrl+A -分析当前模块的代码段。

Ctrl+B - 开始二进制搜索。

Ctrl+C -复制所选内容到剪贴板。复制时会简单地按列宽截断不可见内容,如果希望排除不需要的列,可把这些列的宽度调整到最小。

Ctrl+E -以二进制(十六进制)格式编辑所选内容。

Ctrl+F -开始命令搜索。

Ctrl+G -转到某地址。该命令将弹出输入地址或表达式的窗口。该命令不会修改 EIP。

Ctrl+J -列出所有的涉及到该位置的调用和跳转,在您用这个功能之前,您必须使用分析代码功能。

Ctrl+K - 查看与当前函数相关的调用树[Call tree]。在您用这个功能之前,您必须使用分析代码功能。

Ctrl+L - 搜索下一个,重复上一次的搜索内容。

Ctrl+N - 打开当前模块的名称(标签)列表。

Ctrl+O -

扫描object文件。扫描Object文件。该命令会显示扫描Object文件对话框,您可以在该对话框中选择Object文件或者lib文件,并扫描这个文件,试图找到在实际代码段中用到的目标模块。

Ctrl+R

-搜索所选命令的参考。该命令扫描激活模块的全部可执行代码,以找到涉及到首个选中的命令的全部相关参考(包括:常量、跳转及调用),您可以在参考中使用快捷键

Alt+F7 和 Alt+F8来浏览这些参考。为便于您使用,被参考的命令也包含在该列表中。

Ctrl+S -命令搜索。该命令显示命令查找[Find command]对话框供您输入汇编命令,并从当前命令开始搜索。

星号[Asterisk](*) -转到原始位置(激活线程的EIP处)。

Ctrl+星号(*) - 指定新的起始位置,设置当前所选线程的EIP为首个选择字节的地址。您可以在选择EIP并撤消该操作。

加号[Plus](+) -如果run跟踪[run trace] 没有激活,则根据命令历史[command

history]跳到下一条运行过命令的地方;否则跳到Run跟踪的下一个记录。

Ctrl+加号 - 跳到前一个函数开始处。(注意只是跳到,并不执行)

减号[Minus](-) - 如果run跟踪[run trace] 没有激活,则根据命令历史[command

history]跳到前一条运行过命令的地方;否则跳到Run跟踪的前一个记录。

Ctrl+减号 - 跳到下一个函数开始处。(注意只是跳到,并不执行)

空格[Space] -

修改命令。您可在显示对话框中以汇编语言修改实际指令或输入新指令,这些指令将替换实际代码,您也可以在想要修改的指令处双击鼠标。

冒号[Colon]( - 添加标签。显示添加标签窗口[Add label]或修改标签窗口[Change

label],您可在此输入与首个选择的命令中的第一个字节相关联的标签(符号名)。注意,在多种编程语言中,冒号可以是标签的一部分。

分号[Semicolon](;) - 添加注释[comment]。显示添加注释窗口[Add label]或修改注释窗口[Change

label],您可在此输入与首条所选命令的第一个字节相关联的注释(注释串会显示在最后一列中)。注意,多种汇编语言使用分号作为注释开始。您也可以在注释列双击需要注释的命令行。

命令行插件支持的命令

CALC

判断表达式

WATCH

添加监视表达式

AT

在指定地址进行反汇编

FOLLOW

跟随命令

ORIG

反汇编于 EIP

DUMP

在指定地址进行转存

DA

转存为反汇编代码

DB

使用十六进制字节格式转存

DC

使用 ASCII 格式转存

DD

转存在堆栈格式

DU

转存在 UNICODE 格式

DW

使用十六进制字词格式转存

STK

AS

(AS + 地址 + 字符串)

在指定地址进行汇编

BP

进行条件中断(有条件的断点)

BPX

中断在全部调用 (Call)

BPD

清除全部调用中的断点

BC

清除断点

MR

内存断点于访问时

MW

内存断点于写入时

MD

清除内存断点

HR

访问时进行硬件中断

HW

写入时进行硬件中断

HE

执行时进行硬件中断

HD

清除硬件断点

STOP

停止运行程序调试

PAUSE

暂停执行程序调试

RUN

运行程序进行调试

GE

运行和通过例外

SI

单步进入 Call 中

SO

步过 Call

TI

跟踪进入直到地址

TO

跟踪步过直到地址

TC

跟踪进入直到满足条件

TOC

跟踪步过直到满足条件

TR

运行直到返回

TU

运行直到用户代码

LOG

查看记录窗口

MOD

查看模块窗口

MEM

查看内存窗口

CPU

查看 CPU 窗口

CS

查看 Call 堆栈

BRK

查看断点窗口

OPT

打开选项设置窗口

EXIT

退出 OllyDbg

QUIT

退出 OllyDbg

OPEN

打开一个可执行文件

CLOSE

关闭可执行文件

RST

重新运行当前程序

HELP

查看 API 函数的帮助

加密与解密-系统篇(PE结构)

从某种意义上讲,可执行文件的格式是操作系统本身执行机制的反映。
虽然研究可执行文件格式并不是程序员的首要任务,但这种互作能够积累大量的知识,有助于对操作系统的深刻理解。
掌握可执行文件的数据结构及其必些运行机理,也是研究软件安全的必修课。

预备知识

1.EXE和DL文件之间的区别完全是语义上的,因为他们使用完全相同的PE格式。而唯一的区别就是用一个字段标识出这个文件是EXE还是DLL。

2.64粒Windows只是对PE格式做了一些简单的修饰,新格式叫PE32+。并没有任何新的结构加进去,改变的只是简单的将32位字段扩展成64位。

3.PE格式定义的主要地方位于我们的头文件winnt.h,这个头文件中几乎能找到关于PE文件的所有定义。

基地址 在WIN NT架构下 是这个模块的句柄

PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)文件格式。”portable executable”(可移植的执行体)意味着此文件格式是跨win32平台的 : 即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。所有 win32执行体 (除了VxD和16位的Dll)都使用PE文件格式,所以熟知PE结构有助于对操作系统的深刻理解。

图1 PE文件结构框架

上图是 PE文件结构的总体层次分布。所有的PE文件都要以一个简单的DOS MZ header开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随 MZ header 之后的 DOS stub。DOS stub实际上是个有效的 EXE,在不支持 PE文件格式的操作系统中,它将简单显示一个错误提示。

DOS stub后面就是PE header,PE header 是PE相关结构IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从 DOS MZ header 中找到 PE header 的起始偏移量。因而跳过了 DOS stub 直接定位到真正的文件头 PE header。

PE header 接下来的数组结构 section table(节表)。 每个结构包含对应节的属性、文件偏移量、虚拟偏移量等。PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数据,比如代码/数据、读/写等。节的划分是基于各组数据的共同属性: 而不是逻辑概念。有了节表,就能定位节。

对PE的物理结构有了大致了解之后,再大致了解一下装载PE的文件的步骤:

  1. 当PE文件被执行,PE装载器检查 DOS MZ header 里的 PE header 偏移量。如果找到,则跳转到 PE header。
  2. PE装载器检查 PE header 的有效性。如果有效,就跳转到PE header的尾部。
  3. 紧跟 PE header 的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性。
  4. PE文件映射入内存后,PE装载器将处理PE文件中类似 import table(引入表)逻辑部分。

PE的基本概念

DOS头

DOS MZ header 又命名为 IMAGE_DOS_HEADER.。其中只有两个域比较重要: e_magic 包含字符串”MZ”,e_lfanew 包含PE header在文件中的偏移量。

图2 DOS MZ header结构

DOS 存根

接下来的DOS stub实际上是个EXE,当当前系统不支持PE文件结构时它能输出一个错误提示“This program requires Windows”

PE header

PE头是一个IMAGE_NT_HEADERS类型的结构,下面是这个结构在WINNT.H中的定义:
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Signature是一个标志变量,这个就是当我们判断一个文件是否是PE文件时第二步需要判断的,若这个值等于”PE\0\0”时就是一个PE文件。

第二个成员是一个IMAGE_FILE_HEADER类型的对象,通常我们叫它映像文件头,这个结构在头文件中的定义是:
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

这里对比较重要的成员做出说明,NumberOfSections这个成员保存了节的数目,SizeOfOptionalHeader这个成员保存了PE头中OptionalHeader这个成员的大小,最后一个成员Characteristics是一个关于文件的标记,即这个文件是EXE还是DLL文件。

OptionalHeader

它是一个IMAGE_OPTIONAL_HEADER32类型的对象,这个结构的定义是:

术语–RVA 代表相对虚拟地址(Relative virtual address)。

可选头中比价重要的有:

AddressOfEntryPoint:

PE装载器准备运行的PE文件的第一个指令的RVA。若您要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行。

ImageBase PE文件的优先装载地址。比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处。字眼”优先”表示若该地

址区域已被其他模块占用,那PE装载器会选用其他空闲地址。

SectionAlignment:
内存中节对齐的粒度。例如,如果该值是4096 (1000h),那么每节的起始地址必须是4096的倍数。若第一节从401000h开始且大小是10个字节,

则下一节必定从402000h开始,即使401000h和402000h之间还有很多空间没被使用。

FileAlignment:

文件中节对齐的粒度。例如,如果该值是(200h),,那么每节的起始地址必须是512的倍数。若第一节从文件偏移量200h开始且大小是10个字节,

则下一节必定位于偏移量400h: 即使偏移量512和1024之间还有很多空间没被使用/定义。

MajorSubsystemVersion
MinorSubsystemVersion :
win32子系统版本。若PE文件是专门为Win32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感。

SizeOfImage:
内存中整个PE映像体的尺寸。它是所有头和节经过节对齐处理后的大小。

SizeOfHeaders:

所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。

Subsystem:
NT用来识别PE文件属于哪个子系统。 对于大多数Win32程序,只有两类值: Windows GUI 和 Windows CUI (控制台)。
DataDirectory:
一IMAGE_DATA_DIRECTORY 结构数组。每个结构给出一个重要数据结构的RVA,比如引入地址表等。非常重要!!

section table

节表就相当于书的目录,而书中的各个章节就相当于PE文件结构中的节,通过目录我们能很快找到书中我们感兴趣的内容,同样

通过节表我们很快能找到PE文件中的各个节。(注意:多个数据只要是具有共同属性我们就能把它放在同一节)

Name: 这个成员是一个字节型的数组,这就是节的名字,不过这个数组的上限是8,最多只能保存8个字符,还有就是它不是一个ASCIIZ字符串,因为它不是以null结尾的。

VirtualAddress:
本节的RVA(相对虚拟地址)。PE装载器将节映射至内存时会读取本值,因此如果域值是1000h,而PE文件装在地址400000h处,那么本节就被载到401000h。

PointerToRawData:
这是节基于文件的偏移量,PE装载器通过本域值找到节数据在文件中的位置。

Characteristics:
包含标记以指示节属性,比如节是否含有可执行代码、初始化数据、未初始数据,是否可写、可读等。

输入表

可执行文件使用来自于其他dll的代码或数据时,称为输入。当PE文件装入时,Windows加载器的工作之一就是定位所有被输入的函数和数据,并且让正在被装入的
PE文件可以使用那些地址。这个过程是通过PE文件的输入表(Import Tab 也称之为导入表)完成的,输入表中保存的是函数名和其驻留的dll名等,动态连接所需输信息,
输入表在软件外壳技术上的地位十分重要,因此在研究外壳的技术时一定要掌握这部分知识。

IMAGE_NT_HEADER->IMAGE_OPTIONAL_HEADER32->IMAGE_DATA_DIRECTORY的第二个成员指向输入表,输入表以一个IMAGE_IMPORT_DESCRIPTOR

(简称IDD)开始,(IID) IMAGE_IMPORT_DESCRIPTOR的结构包含如下5个字段:

OriginalFirstThunk, TimeDateStamp, ForwarderChain, Name, FirstThunk

OriginalFirstThunk (INT)
该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是不变的。

TimeDateStamp
一个32位的时间标志,有特殊的用处。

ForwarderChain
输入函数列表的32位索引。

Name
DLL文件名(一个以00结束的ASCII字符串)的32位RVA地址。

FirstThunk** (IAT)**
该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是可变的。

输出表

当PE装载器执行一个程序,它将相关DLLs都装入该进程的地址空间。然后根据主程序的引入函数信息,查找相关DLLs中的真实函数地址来修正主程

序。PE装载器搜寻的是DLLs中的引出函数。

输出表结构如下:

输出表的设计是为了方便PE装载器工作。首先,模块必须保存所有输出函数的地址以供PE装载器查询。模块将这些信息保存在AddressOfFunctions域指向的数组中,而数组元素数目存放在NumberOfFunctions域中。 因此,如果模块引出40个函数,则AddressOfFunctions指向的数组必定有40个元素,而NumberOfFunctions值为40。PE装载器在名字数组中找到匹配名字的同时,它也获取了** 指向地址表中对应元素的索引。 而这些索引保存在由AddressOfNameOrdinals**域指向的另一个数组(最后一个)中。由于该数组是起了联系名字和地址的作用,所以其元素数目必定和名字数组相同。

基址重定位

在32位代码中,涉及到直接寻址的指令都是需要重定位的。对操作系统来说,其任务就是在对可执行程序透明的情况下完成重定位操作。

在现实中,重定位信息是在编译的时候由编译器生成并保留在可执行文件中的,在程序被执行前由操作系统根据重定位表信息修正代码,这样在开发程序的时候就不用考虑重定位问题了。重定位信息在PE文件中被存放在重定位表中。在PE文件没有被加载到预期的imagebase位置时,PE加载器根据下面的重定位表来确定哪些指令数据是需要修改的。
重点就是重定位表的结构和使用方法了。

指令(数据)的指针 = (数据项低12位+VirtualAddress)+ PE文件实际被映射的基址
重定位结果 = 需要重定位数据+( PE文件实际被映射的基址-ImageBase)

资源

资源一般使用树来保存,通常包含3层,在NT下,最高层是类型,然后是名字,最后是语言。
一个PE文件是否包含资源文件,通常检测块表(Section Table)中是否含有’.rsrc’,不过这个方法对有些PE文件无效。

TLC

线程本地存储TLS(Thread Local Storage)。TLS的作用是能将数据和执行的特定的线程联系起来。实现TLS有两种方法:静态TLS和动态TLS。

第一次写博客,排版什么都比较随意,发现把学过的东西记录下来确实学起来效率高一点。

由于我也是第一次真正接触PE,所以有些概念理解的不是很准确,虽然现在水平还不是很高,但尽力了就行了,希望大家多多包含,有时间大家可以看看原版。

最后附上一张简略的PE结构图:

-————*————————————————-*
| DOS Header(IMAGE_DOS_HEADER) | –>64 Byte
DOS头部 ————————————————–
| DOS Stub | –>112 Byte
-————*————————————————-*
| “PE”00 (Signature) | –>4 Byte
————————————————-
| IMAGE_FILE_HEADER | –>20 Byte
PE文件头 ————————————————–
| IMAGE_OPTIONAL_HEADER32 | –>96 Byte
—————————————————
| 数据目录表 | –>128 Byte
-————*————————————————–*
| IMAGE_SECTION_HEADER | –>40 Byte
—————————————————
块表 | IMAGE_SECTION_HEADER | –>40 Byte
————————————————–
| IMAGE_SECTION_HEADER | –>40 Byte
-————*————————————————–*
|.text | –>512 Byte
—————————————————
块 |.rdata | –>512 Byte
—————————————————
|.data | –>512 Byte
-————*————————————————-*
| COFF行号 | –>NULL
—————————————————
调试信息 | COFF符号表 | –>NULL
—————————————————
| Code View 调试信息 | –>NULL
-————*————————————————–*
-——–>>>摘自互联网

参考书籍:《加密与解密》、《逆向工程核心原理》

浙大翁恺C++学习笔记1

在已有其他面向对象语言的基础上进行的简单笔记

构造与够细

C++创建变量时不会初始化值,只申请一块内存指向,值不确定,可能为空空.在java中会有初始化

构造函数

析构函数

在类销毁前调用,释放资源
~ClassName();
当对象超出作用范围时,编译器会自动调用析构函数。

new&delete

image-20200609170925362

delete[] p:对于创建的对象数组 需要加上[],否则delete是只会调用第一个对象的析构函数
image-20200609172430906

访问限制

C ++访问控制
可以分为:
public
private
protected

image-20200609173528832

# 初始化列表

image-20200609174206683

image-20200609174306978

初始化/赋值

继承

1
2
3
class B:public A{

};

……

内联函数

……

Const

image-20200611142444575

在*号前面对象为const,后面指针为const

image-20200611142901043

image-20200611143418295

image-20200611143655928

重载

引用

需在定义时引用,别名

面向对象

拷贝

静态成员 static

image-20200612154429926

运算符重载

…….

image-20200612161916155

image-20200612162202909

模板

异常处理

循序匹配,

image-20200616154847752