jmp

就是要你懂Java中volatile关键字实现原理

偶尔善良 提交于 2021-01-01 19:35:04
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道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调用大量数据时

汇编版冒泡排序

☆樱花仙子☆ 提交于 2020-12-26 01:09:12
初学汇编,老师让写个冒泡排序出来,带提示语句的,于是我就写了一个。 这个程序目前只支持8个数及以内的排序,排序的数值范围最大为255。 用到的东西都很简单,只用了基本的寄存器和jmp运算。 更新补充:我自己的电脑上\n即可实现回车换行,但是有的机器不支持,需要\r\n才可以回车换行。如果测试时出现没有回车的情况,可以在对应部分的输出语句加上mov dl,13 int 21h。 DATAS SEGMENT ;用于存放用户输入 a1 db 0,0,0,0,0,0,0,0 tips db "input a number:$" confirm db "Your input:$" sort_output db "After sorted:$" input_tip db "Input datas:$" DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: ;程序说明 ;先输入一个8以内的数 ;输入完毕以后空格分隔,每次输入一个100以内的数 ;输入第n个数后回车即可 ;该程序按照非降序排列 MOV AX,DATAS MOV DS,AX ;打印提示 mov bx,offset tips call print_tip ;输入需要排序多少个数

[系统安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏

假装没事ソ 提交于 2020-12-24 07:49:16
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战和Windows漏洞利用等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。前文普及了OllyDbg的基础用法和CrakeMe案例;这篇文章将详细讲解OllyDbg和Cheat Engine工具逆向分析用法,完成植物大战僵尸的游戏辅助器,包括修改阳光值和自动拾取阳光两个功能,希望对入门的同学有帮助。 话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好的地方,可以联系我修改。基础性文章,希望对您有所帮助,作者的目的是与安全人共同进步,加油~ 文章目录 一.VS内存地址查看 二.Cheat Engine逆向修改阳光值 三.OllyDbg逆向自动拾取阳光 四.总结及学习推荐 作者的github资源: 系统安全: https:/

8086汇编语言程序设计——子程序与模块化

前提是你 提交于 2020-12-23 03:24:03
标准的子程序结构 利用跳转可以实现子程序调用。所谓调用,实际上就是程序转移到该标号去继续执行。。这种方式虽然简便,但是在模块化程序结构设计中,是不规范的。尤其是其它模块中的某个程序想要调用这个子程序时,还需要指明该子程序标号是在哪个模块、哪个代码段的哪个程序中。 标准的用法是用8086汇编语言提供的过程定义伪指令PROC来定义子程序。 示例 从键盘键入一个多位十进制数X,回车结束输入。按十进制位相加后显示十进制结果Y。 设计思路: (1) 主程序分别调用三个子程序。 (2) 子程序SUBR1为键盘输入多位十进制数且直接保存到X,输入的位数在BX; (3) 子程序SUBR2将保存的X去掉ASCII码,按位相加,相加的结果在BX中; (4) 子程序SUBR3将BX中的数用十进制显示; (5) 采用将结果除以10保存余数的方法将BX中的数转换为十进制数,并用十进制数的ASCII码显示结果。 (6) 传参寄存器为BX。 代码: 1 ; a.asm 键入一个十进制数x,按位相加后显示十进制结果y。 2 data segment 3 infor1 db 0ah,0dh, ' x=$ ' 4 infor2 db 0ah,0dh, ' y=$ ' 5 x db 20 dup(?) 6 data ends 7 code segment 8 assume cs: code, ds: data 9

【学习】如何提取调试ShellCode,这些知识你会吗?

北城以北 提交于 2020-12-19 08:06:10
0 x00 前言 最近刚好看了下shellcode的分析方法,然后就想把之前HW遇到的shellcode拿出来分析一下,一方面检验下自己学习成果,另一方面也和大家分享一下shellcode的一些分析思路吧。 这个样本是从客户的一份钓鱼邮件里发现的,伪造成正常邮件,附件为一个嵌入VBA的word文档,如果没有禁用宏的话,打开文档就会触发病毒执行。 0 x01 宏代码提取 根据文件后缀其实就能看出,该 word文档是带有宏代码的,m即为macro。 使用分析工具oledump.py(https://github.com/decalage2/oledump-contrib)对样本进行分析 oledump.py是一个用于分析OLE文件(复合文件二进制格式)的程序,而word、excel、ppt等文档是OLE格式文件的,可以用它来提取宏代码。 先进行文件基础分析,可以看到A3这段数据被标记为“M”,“M”即表示Macro,说明这段数据是带有VBA代码的。 python oledump.py SSL.docm 接下来我们就需要将这段VBA代码提取出来,执行以下命令,可以看到VBA代码就被提取出来了。 我们把他重定向到一个文件里即可。 python oledump.py -s A3 -v SSL.docm 0x02 宏代码分析 分析宏代码,可以使用编辑器,像notepad++来分析

一个CS马伪装下的loader样本分析

末鹿安然 提交于 2020-12-14 22:19:00
原文来自 SecIN社区 —作者:寅儿 0x01 开源情报收集 样本下载链接: https://app.any.run/tasks/ffc1ecff-e461-4474-8352-551db7e7b06f/ 常用平台:VT,微步,哈勃 app.any.run, joesandbox 图一:VT检测 木马实锤 沙箱跑一下看一下行为: 图二:沙箱行为分析 可以看到用GET请求访问C&C服务器下载了一个二进制binary文件。 点开binary文件查看详情: 图三:恶意binary dump下来wireshark数据包,过滤http请求同样可以发现该二进制文件 图四:抓包分析 查询C&C服务器ip: 图五:ip检测 现在对该恶意软件已经有了初步了了解,下面进行数据包分析,看看能不能找到有用的信息。最直观的看到就是使用了非常见的端口连接,还有发现一个有趣的现象: 图六:数据包分析 竟然是肉鸡主动连接的C&C服务器,让我联想到了CS马。这种手法类似于反弹shell,好处就是可以绕过防火墙限制,如果对方是内网ip,你无法直接发起连接请求,方便持久化控制等等。 0x02 样本基本信息 用exeinfo查壳,标准的32位VC编译的程序 图七:样本信息 用Process Monitor监控行为 图八:软件行为 具体每一项的图略了,大概看了一下读取了注册表的某些键值,设置了某些键值对的值

【计算机组成原理】中央处理器CPU

大城市里の小女人 提交于 2020-12-04 19:10:12
一、CPU的功能和基本结构 1、功能 当用计算机解决某个问题是,我们首先必须为他编写程序,程序是一个指令序列,这个序列明确告诉计算机应该执行什么操作,在什么地方找到用来操作的数据,一旦把程序装入内存器,就可以由计算机来自动完成取出指令和执行指令的任务。专门用来完成此项工作的计算机部件称为中央处理器,通常简称CPU。 虚线框就是CPU结构 CPU通过地址总线 数据总线来访问存储器或者输入输出端口。 ALU:执行运算 两个数一个来自缓存寄存器DR 一个来自累加器AC 运算结果暂时存放到累加器中 状态条件寄存器:0标志位 溢出标志位 等 缓冲寄存器DR:信息进出CPU都有在这蹲点,不论是指令还是数据进CPU都要先进缓存寄存器DR。 指令寄存器:当前正在执行的指令,这里的指令中包含操作码和地址码,将操作码送入指令译码器就知道指令是做什么的,指令译码器把翻译结果告诉操作控制器和时序产生器,他们再按照时间顺序向计算机的执行部件发出执行命令。 程序计数器:下一条将要执行指令的地址 地址寄存器:存放CPU正在访问的内存的地址,一般和地址总线直接相连 CPU的基本部分由运算器 cache和控制器三大部分组成。 二、指令的执行过程 1.指令周期的基本概念 问题:计算机读取的指令和数据都是存在存储器里面的二进制代码,计算机如歌区分这二进制代码是指令还是数据? 计算机能自动的工作

oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式

本秂侑毒 提交于 2020-11-30 23:40:44
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在软盘中找到指定的文件,读取其扇区信息 3. 将指定文件装入指定内存区,并执行 4. 学会在bochs中使用xxd读取反汇编信息 完成本次实验要思考的问题: 1.FAT12格式是怎样的? 2.如何读取一张软盘的信息 3.如何在软盘中找到指定的文件 4.如何在系统引导过程中,从读取并加载一个可执行文件 到内存,并转交控制权? 5.为什么需要这个Loader程序不包含dos系统调用? 关键技术: 引导扇区, loader与控制权转交。 一个操作系统从开机到开始运行,大 致经历 “引导→加载内核入内存→跳入保护模式→开始执行内核”这样一个过程。也就是说,在内核开始执行之前不但要加载内 核,而且还有准备保护模式等一系列工作,如果全都交给引导扇区来做,512字节很可能是不够用的,所以,把这个过程交给另外的模块来完成,我们把这个模块叫做Loader。引导扇区负责把Loader加载入内存并且把控制权交给它,其他工作交给 Loader来做,因为它没有512字节的限制,将会灵活得多。 在这里,为了操作方便,把软盘做成 FAT12格式,这样对Loader以及今后的Kernel(内核)的操作将会非常简单易行。

嵌入式C编程之错误处理(附代码例子)!

爱⌒轻易说出口 提交于 2020-11-29 15:23:30
作者:clover-toeic 原文:https://www.cnblogs.com/clover-toeic/p/3919857.html 前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。文中涉及的代码运行环境如下: 一、错误概念 1.1 错误分类 从严重性而言,程序错误可分为致命性和非致命性两类。对于致命性错误,无法执行恢复动作,最多只能在用户屏幕上打印出错消息或将其写入日志文件,然后终止程序;而对于非致命性错误,多数本质上是暂时的(如资源短缺),一般恢复动作是延迟一些时间后再次尝试。 从交互性而言,程序错误可分为用户错误和内部错误两类。用户错误呈现给用户,通常指明用户操作上的错误;而程序内部错误呈现给程序员(可能携带用户不可接触的数据细节),用于查错和排障。 应用程序开发者可决定恢复哪些错误以及如何恢复。例如,若磁盘已满,可考虑删除非必需或已过期的数据;若网络连接失败,可考虑短时间延迟后重建连接。选择合理的错误恢复策略,可避免应用程序的异常终止,从而改善其健壮性。 1.2 处理步骤 错误处理即处理程序运行时出现的任何意外或异常情况。典型的错误处理包含五个步骤: 程序执行时发生软件错误。该错误可能产生于被底层驱动或内核映射为软件错误的硬件响应事件(如除零)。 以一个错误指示符(如整数或结构体)记录错误的原因及相关信息。 程序检测该错误(读取错误指示符

微机原理与接口技术笔记(二)

只谈情不闲聊 提交于 2020-11-24 13:34:52
[TOC] 上一篇笔记: https://www.cnblogs.com/Tony100K/p/11653755.html 转移类指令 JMP Label 段内直接转移 MOV BX,1200H JMP BX执行完之后 IP=1200H了 MOV BX,1200 JMP WORD PTR[BX]段内间接转移,1200和1201这两个单元送给了IP 段间转移也是32位 JMP FAR Label 间接转移 JMP DWORD PTR[BX] DWORD指32位 低地址送IP,高地址送CS 条件转移范围只有 -128到127 ​ 统计内存数据段中以TABLE为首地址的100个8位带符号数中的正数\负数和零的个数 START: XOR AL,AL MOV PLUS,AL MOV MINUS,AL MOV ZERO,AL LEA SI,TABLE MOV CX,100 CHECK: LODSB OR AL,AL JS X1 JS X2 INC PLUS JMP NEXT X1: INC MINUS JMP NEXT X2: INC ZERO NEXT: DEC CX JNZ CHECK HLT 循环控制指令 范围也非常小 是-128-127的 循环次数CX 无条件循环LOOP 只要CX不等于0 LOOPZ CX不等于0,ZF等于1继续循环 LOOPNZ CX不等于0,ZF等于0继续