dword

C++ volatile关键字

好久不见. 提交于 2020-01-11 05:00:19
  volatile和const关键字一样,是一个类型修饰符,表示变量可以被编译器的某些未知因素修改,比如操作系统,硬件,某些线程等。遇到这个关键字声明的变量,编译器访问该变量的代码将不再进行优化,以提供对特殊地址的稳定访问。   有代码如下:   int i = 10; int j = i;//语句1 int k = i;//语句2 这时候编译器进行代码优化,因为在语句1和语句2中,i不作为左值,编译器认为i的值没有发生变化,所以在语句1中将i的值取出赋给j之后i的值并未丢弃,而是在语句2中继续赋给k编译器不会产生汇编代码重新从i里面取值,这样做提高了效率,但是要注意,语句i要没有用作左值才行。而且编译器只在release模式下才对内存进行优化,在debug模式下volatile不会对内存进行优化。   有代码如下: int i = 1; int j = i; int k = i; volatile int a = 10; volatile int b = a; volatile int c = a; debug模式下的汇编代码: int i = 1; 010D17BE mov dword ptr [i],1 int j = i; 010D17C5 mov eax,dword ptr [i] 010D17C8 mov dword ptr [j],eax int k = i;

用汇编编写病毒

允我心安 提交于 2020-01-11 00:14:59
用汇编编写一个病毒 在github上看到大神用汇编编写的linux病毒,学习一下 github地址: https://github.com/cranklin/cranky-data-virus/blob/master/cranky_data_virus.asm 源码分析: ;; nasm -f elf -F dwarf -g cranky_data_virus.asm ;; ld -m elf_i386 -e v_start -o cranky_data_virus cranky_data_virus.o section .text global v_start ;代码开始处 v_start: ; virus body start ; make space in the stack for some uninitialized variables to avoid a .bss section mov ecx, 2328 ; set counter to 2328 (x4 = 9312 bytes). filename (esp), buffer (esp+32), targets (esp+1056), targetfile (esp+2080) ;不断向栈上push 0,用作全局未初始化变量空间,依次push是4个字节loop_bss: push 0x00 ; reserve

c文件操作

耗尽温柔 提交于 2020-01-08 18:36:36
一、删除文件 1.c 调用dos命令: system(char *cmd); 如 system( "del d:\\chang\\xxx.txt "); 删除文件 2.调用api: 删除一个文件: int remove(char *filename ); 返回0 成功 -1失败 3.DeleteFile("d:\\new.txt"); //删除一个文件 BOOL DeleteFile(LPCTSTR filename); 4._unlink( filename ) //失败时返回 -1 二、重命名(也可通过后面介绍的 move,copy实现) rename(oldname,newname) //成功时返回 0 三、新建目录 1.mkdir("c:\\info\\world"); //失败时返回 -1 2.单级(sa 为安全属性,取 NULL 默认),多级目录需自定义 BOOL CreateDirectory(LPCTSTR dirname, LPSECURITY sa); 3.多级 system("mkdir c:\\a\\b\\c"); 四、列出目录下的文件信息 void listAll(char *path){ WIN32_FIND_DATA findData; HANDLE listFile;     strcat(path, "\\*"); //代表列出所有文件 /

地址、指针与引用

烂漫一生 提交于 2020-01-08 09:24:02
  计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。   变量是在内存中用来存储数据以供程序使用,变量主要有两个部分构成:变量名、变量类型,其中变量名对应了一块具体的内存地址,而变量类型则表明该如何翻译内存中存储的二级制数。我们知道不同的类型翻译为二进制的值不同,比如整型是直接通过数学转化、浮点数是采用IEEE的方法、字符则根据ASCII码转化,同样变量类型决定了变量所占的内存大小,以及如何在二进制和变量所表达的真正意义之间转化。而指针变量也是一个变量,在内存中也占空间,不过比较特殊的是它存储的是其他变量的地址。在32位的机器中,每个进程能访问4GB的内存地址空间,所以程序中的地址采用32位二进制数表示,也就是一个整型变量的长度,地址值一般没有负数所以准确的说指针变量的类型应该是unsigned int 即每个指针变量占4个字节。还记得在定义结构体中可以使用该结构体的指针作为成员,但是不能使用该结构的实例作为成员吗?这是因为编译器需要根据各个成员变量的大小分配相关的内存,用该结构体的实例作为成员时,该结构体根本没有定义完整,编译器是不会知道该如何分配内存的,而任何类型的指针都只占4个字节,编译器自然知道如何分配内存。我们在书写指针变量时给定的类型是它所指向的变量的类型

c++ 反汇编 表达式

家住魔仙堡 提交于 2020-01-07 18:55:39
有符号数溢出: void BreakFor() { for (int i = 1; i > 0; i++) { printf("%d \r\n", i); } } 上面的程序并不是死循环,当有符号数增加到最大整数后,继续加一会进位修改符号位,从而成为负数。 自增、自减 98: int nVarOne = argc; 012665EE 8B 45 08 mov eax,dword ptr [argc] 012665F1 89 45 F8 mov dword ptr [nVarOne],eax 99: int nVarTwo = argc; 012665F4 8B 45 08 mov eax,dword ptr [argc] 012665F7 89 45 EC mov dword ptr [nVarTwo],eax 100: nVarTwo = 5 + (nVarOne++); 012665FA 8B 45 F8 mov eax,dword ptr [nVarOne] 012665FD 83 C0 05 add eax,5 01266600 89 45 EC mov dword ptr [nVarTwo],eax 01266603 8B 4D F8 mov ecx,dword ptr [nVarOne] 01266606 83 C1 01 add ecx,1 //后缀自增

volatile底层原理

独自空忆成欢 提交于 2020-01-07 17:41:37
前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用。 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好、更正确地地使用volatile关键字。 CPU缓存 CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾 ,因为CPU运算速度要比内存读写速度快得多,举个例子: 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要1~2个时钟周期 一次L2高速缓存的读写也只需要数十个时钟周期 这种访问速度的显著差异,导致CPU可能会花费很长时间等待数据到来或把数据写入内存。 基于此,现在CPU大多数情况下读写都不会直接访问内存(CPU都没有连接到内存的管脚),取而代之的是CPU缓存,CPU缓存是位于CPU与内存之间的临时存储器,它的容量比内存小得多但是交换速度却比内存快得多。而缓存中的数据是内存中的一小部分数据,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先从缓存中读取,从而加快读取速度。 按照读取顺序与CPU结合的紧密程度,CPU缓存可分为: 一级缓存:简称L1

JavaScript修改注册表实例

白昼怎懂夜的黑 提交于 2020-01-07 08:29:46
来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=241 GPS平台、网站建设、软件开发、系统运维,找森大网络科技! http://cnsendnet.taobao.com 注册表有关安全设置项的说明: 注册表路径: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones Zones 项包含表示为计算机定义的每个安全区域的项。默认情况下,定义以下 5个区域(编号从 0 到 4): 值 设置 0 我的电脑 1 本地 Intranet 区域 2 受信任的站点区域 3 Internet 区域 4 受限制的站点区域 注意:默认情况下,“我的电脑”不会出现在“安全”选项卡的“区域”框中。 其中的每项都包含以下DWORD值,用于表示自定义“安全”选项卡上的相应设置。 注意:除非另外声明,否则每个DWORD值等于0、1或3。通常,设置为0则将具体操作设置为允许;设置为1则导致出现提示;设置为 3则禁止执行具体操作。 值设置说明: 值 设置 1001 下载已签名的ActiveX控件 1004 下载未签名的 ActiveX控件 1200 运行ActiveX控件和插件 1201 对没有标记为安全的ActiveX控件进行初始化和脚本运行

windows重叠IO和IOCP简介

大憨熊 提交于 2020-01-06 23:05:15
产生重叠IO的原因: 对于阻塞IO的读写操作都是需要阻塞等待IO完成的,大大的浪费用户的进程的时间片,降低了程序的性能。所以系统开个后门,悄悄地给你开个后门,开个线程去帮你请求IO,等到IO操作完成之后再通知你,你就可一再接着处理就好了,那么在IO完成之前你就可以放心的做其他的了。 重叠IO的重要数据结构: typedef struct _WSAOVERLAPPED { DWORD Internal ; DWORD InternalHigh ; DWORD Offset ; DWORD OffsetHigh ; WSAEVENT hEvent ; } WSAOVERLAPPED , * LPWSAOVERLAPPED ; 详细请见msdn WSAEVENT hEvent是连接完成事件和用户程序的桥梁,我们可以通过可爱的waitformultipleobjects和waitforsingleobject来接受通知,进而处理完成事件。 那么,IOCP又是怎么一肥事呢? 需要知道,重叠IO解放劳动力的同时,也是有代价的,如果1000个请求同时发生就需要系统内部开启1000个线程去处理IO,那么负载实在太大了,所以需要池化,为用户进程开线程池去优化IO请求咯。 注意: 使用重叠IO或者IOCP之前IO句柄或者Socket创建的时候需要置位WSA_FLAG_OVERLAPPED标志。

地址、指针与引用

假如想象 提交于 2020-01-05 10:30:54
计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。   变量是在内存中用来存储数据以供程序使用,变量主要有两个部分构成:变量名、变量类型,其中变量名对应了一块具体的内存地址,而变量类型则表明该如何翻译内存中存储的二级制数。我们知道不同的类型翻译为二进制的值不同,比如整型是直接通过数学转化、浮点数是采用IEEE的方法、字符则根据ASCII码转化,同样变量类型决定了变量所占的内存大小,以及如何在二进制和变量所表达的真正意义之间转化。而指针变量也是一个变量,在内存中也占空间,不过比较特殊的是它存储的是其他变量的地址。在32位的机器中,每个进程能访问4GB的内存地址空间,所以程序中的地址采用32位二进制数表示,也就是一个整型变量的长度,地址值一般没有负数所以准确的说指针变量的类型应该是unsigned int 即每个指针变量占4个字节。还记得在定义结构体中可以使用该结构体的指针作为成员,但是不能使用该结构的实例作为成员吗?这是因为编译器需要根据各个成员变量的大小分配相关的内存,用该结构体的实例作为成员时,该结构体根本没有定义完整,编译器是不会知道该如何分配内存的,而任何类型的指针都只占4个字节,编译器自然知道如何分配内存。我们在书写指针变量时给定的类型是它所指向的变量的类型

用汇编编写病毒

落花浮王杯 提交于 2020-01-05 09:56:41
用汇编编写一个病毒 在github上看到大神用汇编编写的linux病毒,学习一下 github地址: https://github.com/cranklin/cranky-data-virus/blob/master/cranky_data_virus.asm 源码分析: ;; nasm -f elf -F dwarf -g cranky_data_virus.asm ;; ld -m elf_i386 -e v_start -o cranky_data_virus cranky_data_virus.o section .text global v_start ;代码开始处 v_start: ; virus body start ; make space in the stack for some uninitialized variables to avoid a .bss section mov ecx, 2328 ; set counter to 2328 (x4 = 9312 bytes). filename (esp), buffer (esp+32), targets (esp+1056), targetfile (esp+2080) ;不断向栈上push 0,用作全局未初始化变量空间,依次push是4个字节loop_bss: push 0x00 ; reserve