摘要:
基本概念 IO对象:文件、管道、磁盘、socket ... IO操作:就是一次读或者写的请求 Windows: ReadFile、WriteFile、WSASend、WSARecv、AcceptEx ... Linux: read、write、send、recv、accept ... EPOLL 1 阅读全文
摘要:
因为堆(二叉堆)是一个完全二叉树,所以一般使用数组来存放 堆的性质 一句话来说就是 父节点比子节点的数据要小 (小顶堆,大顶堆反之) 为方便描述,以下皆以小顶堆为例进行说明 建立一个堆 假设表示堆的数组size为n,从最后一个非终端节点(即n/2)到根节点不断地 根据堆的性质进行调整 根据堆的性质进 阅读全文
摘要:
壳代码在一开始会使用PUSHAD指令将所有的寄存器入栈, 此时ESP所指向的内存记录着某一个寄存器的值 。 然后我们ESP指向的内存处下一个硬件内存访问断点 执行完壳代码后会将所有的寄存器值出栈以平衡堆栈POPAD,CPU需要访问原ESP记录的值,壳代码解压完程序代码后,最后 平衡堆栈 时必然要从E 阅读全文
摘要:
base64编码是将任意 二进制 序列编码成 ASCII字符 ( 可打印字符 )序列的编码方案 在base64编码中,每 3个二进制字节 编码为 4个ASCII字符 ,也就是将3个字节(24位二进制位)拆分成4个(6个二进制位的)数,再将这4个数根据base64的编码表来映射为4个ASCII字符;对 阅读全文
摘要:
定义不定参数函数,要用到下面这些宏: va_start(ap, farg): 初始化一个va_list变量ap,farg是第一个形参 va_arg(ap, type): 获取(下)一个type类型的参数 va_end(ap): 结束使用ap C语言里编写不定参数函数的形式是这样的: c includ 阅读全文
摘要:
在Windows下使用python的subprocess.Popen创建子进程时,子进程如果是控制台程序(子系统为console的程序),便会继承父进程的控制台窗口 当子进程在运行时,如果在控制台使用Ctrl+C向父进程发送信号,这时会让子进程先捕捉到这个信号,造成子进程的退出。父进程是在子进程之后 阅读全文
摘要:
Bug出现的情形大概是这样的: 看出不妥之处了吗? 我想了好久才想到。。。 在main函数里调用waitcall时,编译器会在栈上临时分配一段空间(Temp)用来存放waitcall的返回值,这段空间会通过Value的拷贝构造函数构造;在waitcall()函数里,最后没有指定一个返回值,导致wai 阅读全文
摘要:
成员函数指针,顾名思义,就是函数指针,不过这个函数不是全局函数,而是一个类的成员函数。 比如上面这段代码中,A::seta就是成员函数。 (动态)成员函数和全局函数本质上并无不同,都是函数代码所在的内存地址。不同的是在调用时必须传递this指针,比如你可以这样调用 ,也可以这样调用 。 重定义成员函 阅读全文
摘要:
曾经有人问过我,软件像什么?我想了想回答到,软件像是对现实世界的抽象。后来慢慢发现,世间的一切事物之间都有着千丝万缕的关系,不同领域的东西总有一些东西具有类比性。 听听下面这些术语你就知道了:Bug、病毒、原子操作、锁、信号灯、生产者与消费者等等。我们可以以宇宙运作的方式来看待运行在计算机里的程序: 阅读全文
摘要:
. 你没看错,就是Normal模式下的 键,它可以重复上一次的编辑命令 比如,有一个函数: c int foo(char s, int len) { char p = s; for (char e = s+len; p `键+寄存器名 可以输入寄存器里的内容 举一个例子,如果想使用:s命令替换一个很 阅读全文