零基础逆向工程15_C语言09_位运算】的更多相关文章

1.汇编中的移位指令 算数移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm SAL(Shift Arithmetic Left):算数左移 SAR(Shift Arithmetic Right):算数右移 逻辑移位指令 指令格式:SHL/SHR Reg/Mem, CL/Imm SHL(Shift Left):逻辑左移 SHR(Shift Right):逻辑右移 循环移位指令 指令格式:ROL r/m, i8 ROR r/m, CL ROL(Rotate Left):循环左移 R…
1.指针数组 5: char* keyword[] = {"if", "for", "while", "switch"}; //数组指针,大小为4×4=16字节 0040D7D8 mov dword ptr [ebp-10h],offset string "AAA" (00422028) 0040D7DF mov dword ptr [ebp-0Ch],offset string "for&quo…
1."带*类型"的特征探测 宽度 在同一个平台下,任何指针变量的尺寸都是一样的(都等于系统字长),如在32位平台中任何类型指针宽度都是32位. 声明 1.带有* 的变量类型的标准写法:变量类型* 变量名 2.任何类型都可以带* 加上* 以后是新的类型 3.*可以是任意多个 赋值:相同类型赋值 范例:int* a = (int*)666; ++ -- 或 加上/减去 一个整数 规则:以指针指向的变量为步长,进行步长倍数的加减操作 求差值 规则:作差后除以步长 两个类型相同的一级指针相减,…
12_C语言06_switch语句反汇编 switch语句反汇编 测试环境:VC++6.0 分支少于4的时候没有意义,编译器会生成类似if...else之类的反汇编,不超过三个分支,不会生成索引表. 会建立一张表,表里面存的各个分支语句函数的地址,然后来索引. case后面的常量可以是无序的,并不影响大表的生成. 代码分析 5: switch(x) 6: { 0040D728 mov eax,dword ptr [ebp+8] ;将参数3放到eax中 0040D72B mov dword ptr…
结构体小结 结构体是按照分配的大小,局部变量会自动数据对齐 1字节对齐,省空间,但cpu查找效率低 4字节对齐,不省空间,但cpu查找效率高 VC6默认的结构对齐大小 项目右键-> setting-> C/C++ ->Code Generation 如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此为准, 即,结构体成员的偏移量应该取二者的最小值 对齐原则 原则一:数据成员对齐规则:结构的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置…
#define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到预处理之后的编译阶段才能发现 带参数宏定义:#define 标识符(参数表)字符序列 如:#define MAX(A, B) ((A) > (B)?(A):(B)) 代码 x = MAX(p, q)将被替换成 y = (p) > (q)? (p):(q) 注意: 1.宏名标识符与左圆括号之间不允许…
前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙著<品悟C>已经全面揭露了谭浩强书中的种种错谬,因此,下面视频中凡是谭浩强原来就有的错误,就只标出不细解了.重点讲小甲鱼自己创造的“亮点”.各位网友如对只标出而未解释的地方有疑问,可在评论中提出,我再详细解释. 下面截图来自“视频专辑:零基础学习C语言(小甲鱼版)”第二集.从这一集我们可以清楚地看…
向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文件缓冲区扩展到内存映像缓冲区(ImageBuffer) 3. 判断代码空闲区是否有足够空间存储ShellCode代码 4. 将代码复制到空闲区 5. 修正E8 6. 修正E9 7. 修改OEP 8. 内存映像缓冲区到新文件缓冲区(NewBuffer) 9. 新文件缓冲区到文件 向其他节(如数据段)空…
编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0).函数调用形式为getbits(value,n1,2).----简单题目遇到想不到的问题 c语言位运算经典问题: https://wenku.baidu.com/view/aa4b144410661ed9ad51f3dd.html 位运算屁屁踢: https://wenku.baidu.com/view/4ed8e1fd1711cc7930b71656.html 近在编写关于C语言位操作的程序,程序的要求如上…
在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用. 1. 位运算起源 位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来.所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效…
今天跟大家一起从零学C语言: 1. C语言简介 1.1 C语言发展史 C语言是一种广泛使用的面向过程的计算机程序设计语言,既适合于系统程序设计,又适合于应用程序设计.C语言的发展历程大致如图1-1所示:   图1-1 C语言的发展历程 1.2 C语言的特点 C语言是一种通用的程序设计语言,语言本身简洁.灵活.表达能力强,被广泛用于系统软件和应用软件的开发,并且具有良好的可移植性. C语言的特点可概括如下: (1)简洁.紧凑.灵活.C语言的核心内容很少,只有32个关键字,9种控制语句;程序书写格式…
所谓位运算,就是对一个比特(Bit)位进行操作.在<数据在内存中的存储>一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了.C语言提供了六种位运算符: 运算符 & | ^ ~ << >> 说明 按位与 按位或 按位异或 取反 左移 右移 按位与运算(&) 一个比特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0.例如1&1为 1,…
一.注释.标识符.关键字 1.注释(comments) 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己编写的代码,但是当项目结构一旦复杂起来,我们就需要用到注释了! 注释并不会被程序执行,是给我们自己写代码的人看的,方便理解 书写注释是一个非常好的习惯 Java中注释有三种: 单行注释(Line comment) 多行注释(block comment) 文档注释(JavaDoc) 找好看的注释:搜索有趣的代码注释 三种注释的代码 单行注释:只能注释一行,// public class…
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 = 21x = x << 6; // 64 = 26 2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350% x = x / 2;x = x / 64;//改为: x = x >> 1;// 2 = 21x = x >> 6;// 64 = 26 3. 数值转…
位运算 1).定义. 指的是1个二进制数据的每一位来参与运算. 位运算的前提: 是这个数必须是1个二进制. 注意: a). 参与位运算的二进制数据必须是补码形式. b). 位运算的结果也是二进制的补码形式. 2).按位与: & 参与按位与的两个二进制数.如果都为1 那么结果就为1 只要有1位为0 那么结果就为0. 3 & 2; 第1步骤:先得到两个数的二进制补码形式. 3的补码: 00000000 00000000 00000000 00000011 2的补码: 00000000 0000…
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 = 21x = x << 6; // 64 = 26 2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350% x = x / 2;x = x / 64;//改为: x = x >> 1;// 2 = 21x = x >> 6;// 64 = 26 3. 数值转…
public class Test { public static void main(String[] args) { // 1.左移( << ) // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.println(5 << 3);// 5乘以2的3次方,所以运行结果是40 // 2.右…
其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的判断,如:1&&1,1||0,当表达式前面的已经决定了整个表达式,则不需要进行判断后面的表达式的真假,而|,&无论前面的表达式的真伪,都要对后面进行判断.故由此也可以看出在进行逻辑运算是二者的差异,效率!谁优谁劣,当然能看出. 既然说到位运算,就是对式子进行逐位运算,那就说下运算规则,…
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2; x = x * 64; //改为: x = x << 1; // 2 = 21 x = x << 6; // 64 = 26 2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350% x = x / 2; x = x / 64; //改为: x = x >> 1;// 2 = 21 x = x >> 6;// 64 = 26…
写在之前 大家好,这里是零基础学习 Python 系列,在这里我将从最基本的 Python 写起,然后再慢慢涉及到高阶以及具体应用方面.我是完全自学的 Python,所以很是明白自学对于一个人的考验,所以在这里我会尽我最大的努力,把 Python 尽可能简单的表述清楚,让更多想要学习 Python 的朋友能够入门.同时写这个教程也算是对自己之前所学知识的一个巩固和提高,喜欢的朋友们可以点个关注,有问题欢迎随时和我交流. 数字 在 Python 中,对数的设定很简单,如果你发现你有小学毕业照,那么…
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 s…
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 s…
1 多字节字符 ASCII码表:0 ~ 2^7-1 扩展ASCII码表:2^7 ~ 2^8-1 什么是GB2312:1980年,两个字节存储一个汉字:不通用,别国会有乱码. UCICODE:只有一个字符集:每个字符都是16位宽. 2 C语言中的宽字符 2.1 宽字符的使用 "中"字的编码: ASCII:d6 d0 UNICODE:4e 2d char x = '中'; //汇编代码中出现的是d0 wchar_t x1 = '中'; //汇编代码中出现的是d0 d6 wchar_t x1…
期末考试的编程题 返回   这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 二进制的前导的零(10分) 题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第一个1之前,有…
2 GPS数据处理(5分) 题目内容: NMEA-0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议.GPS接收机根据NMEA-0183协议的标准规范,将位置.速度等信息通过串口传送到PC机.PDA等设备. NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议…
1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算     说明0^0=0,0^1=1     0异或任何数,其结果=任何数1^0=1,1^1=0     1异或任何数,其结果=任何数取反x^x=0     任何数异或自己,等于把自己置02.应用(1)使特定位翻转 比如:01111010,想使其低4位翻转,即1变为0,0变为1.可以将它与00001111进行∧运算…
数据加密解密是一个常用的功能,如果你不希望让别人看到文件中的内容,可以通过密钥(也称"密码")将文件的内容加密.比如文本文件(.txt),加密前的内容是能够读懂的,加密后的内容是"乱码",都是一些奇怪的字符,根本无法阅读.数据加密解密的原理也很简单,就是使用异或运算.请先看下面的代码: #include <stdio.h> #include <stdlib.h> int main(){ char plaintext = 'a'; // 明文…
工作中遇到一个简单的小问题,判断两个数是否整除,如果不整除,获取相关的余数. 习惯java的我毫不犹豫的写下了代码 public Boolean isDivisibility(Integer dividend,Integer divider) { return dividend % divider == 0; } 提交代码发现竟然提交不上?? 后来查看API发现apex中没有直接的%取余运算,所以如果想要取余以及判断是否整除需要其他方式,代码如下: public without sharing…
1. & 按位与 1> 功能 只有对应的两个二进位均为1时,结果位才为1,否则为0. 2> 举例: 比如9&5,其实就是1001&101=1,因此9&5=1 3> 规律 二进制中,与1相&就保持原位,与0相&就为0 2. | 按位或 1> 功能 只要对应的二个二进位有一个为1时,结果位就为1,否则为0. 2> 举例: 比如9|5,其实就是1001|101=1101,因此9|5=13 3. ^ 按位异或 1> 功能 当对应的…
1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个EXE时,Explorer 进程使用CreateProcess函数创建被双击的EXE,也就是说,我们在桌面上双 击创建的进程都是Explorer进程的子进程. CreateProcess BOOL CreateProcess( LPCTSTR lpApplicationName, // name of exe…