汇编语言

基于虚拟机的软件保护技术

别说谁变了你拦得住时间么 提交于 2020-03-01 01:44:35
本文并不打算对vmprotect或其它某款软件安全套件进行深入讨论,而着眼于研究基于虚拟机的软件保护技术的起源、思想和实现。 现有软件保护技术概述 传统的软件保护技术,根据针对对象不同,可分为反静态调试和反动态调试两大类。反静态调试主要针对对象为反汇编器。反汇编器通过面向特定平台的反汇编引擎(如PC平台即为X86反汇编引擎),将编译器生成的二进制文件还原成汇编代码,有经验的逆向工程师可以据此还原出算法等核心运算机制。反静态调试主要是通过特定区段加密等方式,将核心信息保护起来,只在运行期才通过解密等算法动态还原,阻碍反汇编器静态地将二进制文件还原成汇编码。 反动态调试主要针对对象为调试器,由于经过静态加密的二进制码最终必须解密才能执行,因此通过Ollydbg等动态调试器仍然可以加以查看,反动态调试通过检测调试器和屏蔽调试端口等各种反调试技术阻止逆向工程师通过调试器跟踪软件进程的运行情况,使得软件的运行时状况始终保持处于黑盒状态。 被动型软件保护概念上述两种保护方案均采取主动出击的策略,意图“御敌于国之外”,中心思想是一个“挡字”,阻止逆向工程是窥视软件内部机理,但盾与矛的对抗总是无休止的,并没有任何一种主动型软件保护手段能真正彻底阻断逆向工程,因此另一种“以人为本”的被动型软件保护技术开始走向斗争舞台的中央。 被动型软件保护手段基于一个假设

汇编语言(王爽)实验五

爱⌒轻易说出口 提交于 2020-02-29 16:44:03
实验五 1、将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题 assume cs:code, ds:data, ss:stack data segment dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax, 4c00H int 21H code ends end start CPU执行程序,程序返回前,data段中的数据为多少? 不变 CPU执行程序,程序返回前,cs=076C、ss=076B、ds=076A 程序刚加载时,ds=075A,因为psp的存在,data段段地址为076A,赋值以后ds=076A,而data段占16个字节076A:10=076B:0,cs段同理,虽然在物理地址上这三个段是连续的,但由于被分为三个段,那么段地址必定要不同 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1 2

IDA使用初探-1.启动IDA

拜拜、爱过 提交于 2020-02-29 07:10:22
在传统的软件开发模型中,通过编译器、汇编器和链接器中的一个或几个创建可执行程序。为了回溯编程过程(对程序进行逆向工程),使用各种工具撤销汇编和编译过程,这些工具就叫做反汇编器和反编译器。反汇编器撤销汇编过程,可以得到汇编语言形式的输出结果;反编译器则以汇编语言甚至是机器语言作为输入,将高级语言结果输出。 但是反编译有几点困难至今还没有完美解决:编译过程造成损失;编译属于多对多操作;反编译非常依赖语言和库。 反汇编 算法 :线性扫描(linear sweep)和递归下降(recursive descent)两种主要的反汇编算法。 线性扫描:反汇编从第一个代码段的第一个字节开始,以线性模式扫描整个代码段,逐条反汇编每条指令,直到遍历全部字节。此方法对于长度固定的指令集(MIPS)反汇编会更加容易,因为可以方便的的定位到随后的指令。缺点就是无法正确的将嵌在代码中的数据分离出。 递归下降:根据一条指令是否被另一条指令引用来决定是否对其进行反汇编。 交互式反汇编器专业版,常常称其为IDA Pro,属于递归下降反汇编器。上周看书有一些心得,在这里一篇篇分享一下。 1.为了准备逆向用的实例,先用VC生成一个release版的Hello World。 1 #include <windows.h> 2 INT WINAPI WinMain(HINSTANCE hInstance, 3

反汇编学习

让人想犯罪 __ 提交于 2020-02-29 07:06:48
(转: http://www.kuqin.com/assemble/20071122/2492.html ) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)   ============================   x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.    在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:   1. 通用寄存器:   EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)      这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator

汇编语言——汇编程序从写出到最终执行的过程

雨燕双飞 提交于 2020-02-29 06:52:08
一个汇编语言程序从写出到最终执行的简要过程: 编写--〉编译--〉连接--〉执行 1、编写 notepad++选择Assembly编写程序,保存成xx.asm,样式如下 assume cs:abc ; abc被我们当做代码段来使用,so要把它和cs联系起来 abc segment ; 定义一个段(abc),到ends结束 start: mov ax,2 ; 给程序一个起始位置,从这开始到段结束的位置才是汇编指令,其他的都是伪指令(给编译器看的) add ax,ax ; 在这个代码段写入汇编指令(这个段就是我们定义的代码段) add ax,ax mov ax,4c00H ; 这两句汇编指令就是程序返回 int 21H ; 我们暂时不需要知道这两句话为啥是这样的,只要知道它的作用是程序返回(将CPU的控制权还给使它能运行的程序) abc ends ; 代码段结束 end start ; 指出程序结束的位置 2、编译 程序经过编译后成为可执行文件 编译方法 进入DOS方式(cmd),进入 C:\masm 目录,运行masm.exe。 如果源程序文件不是以 asm 为扩展名的话,就要输入它的全名。比如p1.txt。 在输入源程序文件名的时候一定要指明它所在的路径。如果文件就在当前路径下,只输入文件名就可以。 输入要编译的源文件文件名后,按 Enter键。 目标文件(*.obj

汇编语言学习(栈)

☆樱花仙子☆ 提交于 2020-02-28 21:27:42
栈: 栈是什么? 存放数据的容器 栈 和一般的容器有什么区别,如何存取呢? 先进后出, 类似于 往密闭的盒子放东西 每一次只能拿出最顶部的东西,每一次只能在最顶部放入东西 放入的过程 被称为 入栈,一般用 push 表示 eg: push ax 取出的过程 被称为 出栈,一般用 pop 表示 eg: pop ax 栈如何表示栈顶: 存在标志 标识栈顶,称作栈顶标志 如何标识栈顶标志? 无论是出栈的位置还是入栈的位置, 在内存中 都 被视为 内存地址 前面说过由于 8086 的的 地址总线 与 CPU 处理能力存在出入 , 所以 内存地址 由 段地址 和 偏移地址 来表示 分为 栈顶表示 被分别存储到两个寄存器中, 段地址寄存器:SS, 偏移地址寄存器:SP SS:SP 出栈和入栈 栈顶标记该如何变化? 在内存中 栈 的地址是有高到低增长 每一次 push SP -= 2 每一次 pop SP += 2 思考一下如何 如何将10000H ~ 1000FH作为 栈 并实现 AX 与 Bx 的交换 mov ax, 1000H mov ss, ax mov sp, 10H push ax push Bx pop ax pop bx ps:内存也可以,记得交换前确定ds指向那个段地址 内存角度分析栈: 无论是 pop 还是 push,操作的都是数据 数据的来源:寄存器 内存 数据长度也有两种

about asm in linux

♀尐吖头ヾ 提交于 2020-02-28 14:34:01
实模式汇编语言linux解决方案。 利益相关:fedora24,kernel 4.8.12。 fedora官方源很垃圾,类似bochs,vbox等开发者必备的软件丫的少依赖,少库。tor,ss,xxnet这种敏感软件版本太旧且bug多多。 所以我们选择“源代码编译安装”的方式安装bochs: 安装: 1.去 http://nchc.dl.sourceforge.net/project/bochs/bochs/2.4.5/bochs-2.6.8.tar.gz 下载【bochs-2.6.8.tar.gz】 2.解压下载的源代码: sudo tar zxvf bochs-2.6.8.tar.gz 3.进入bochs-2.6.8目录,运行configure脚本: sudo ./configure -enable-debugger -enable-disasm (-enable-debugger和 -enable-disasm 表示开启调试和反汇编功能) 4.第3步正确运行后,会产生一个Makefile文件,于是可以编译: sudo make 5.安装: sudo make install 至此,bochs安装已经结束。 但是你也许不会成功。不要着急,下面是编译安装过程中可能出现的一些问题及解决方法: 【错误1】 error: C++ preprocessor “/lib/cpp”

汇编语言

回眸只為那壹抹淺笑 提交于 2020-02-28 03:40:43
1+1=3? 进制可以自己定义符号来表示,所以可以自己定义一个十进制:0 1 3 9 6 8 7 4 5 2 在这样的定义下,1+1=3也是正确的。(从本质来理解进制) 进制运算 运算 534+266=? 371*146=? 与十进制运算一样,通过查表来运算。 534+266 先查表找4+6=12 所以最后一位就是2 往前进1 然后找3+6 =11 ,所以第二位是2 往前进1 最后找5+2=7 ,所以是0 往前进1. 最后结果为1022 乘法也是一样通过查表来获得结果。 数据宽度 BIT 位 计算机中的最小存储单位 Byte 字节 1字节=8位 Word 字 1字=16位 Doubleword 双字 1双字=32位 有符号数和无符号数 正数的原码反码补码都一样。 负数的原码:符号位为1.其余为数值本身的绝对值。 负数的反码:符号位为1.其余位对原码取反。 负数的补码:符号位为1,其余位对原码取反+1 -7 原码为:1000 0111 反码为: 1111 1000 补码为:1111 1001 负数在内存中以补码的形式存储 计算机不会做加法 移位操作 shr 右移 最高位补0 sar 右移 最高位补符号位 4+5的运算过程 在没有进位的情况下,两个数异或的结果和相加的结果是一样的。 1)异或 0000 0100 0000 0101 异或----------------- 0000

机器语言 如汇编语言

淺唱寂寞╮ 提交于 2020-02-27 22:04:23
在 第一 台 计算 机 诞生 之 后, 虽 然它 的 计算速 度 并 不比 当时 的 一些 计 算工 具 有太大的 优 势 ,但人们注意到这种新 的 ”计算工具”和传统的计算工具有了一个本质的区 别 ,就是 它 能存储指 令 ,并可以不断地重新执行这些指令.以往的传统计算工 具 ,比如中国 的 ”算 盘 ” , 当人们按着一定的口 诀 即指 令 计算出 结 果后,如果想再计算一 次 ,就必须重新在 算盘 上” 拨弄口 诀” ,因为算盘不能存 储” 口 诀”. 电子计算 机则不同,它是 由电子元件组成 的 , 这 种 电 子 元 件有 两 种 稳 定的 状 态 , 可以用 0,1 来表 示这两 种状态 ,这样 电 子 计 算 机就可 以使用二进制数来存储和处理信息了 . 计算机处理信息的早期语言是所谓的 机 器语言,这种语言中的指令都是 由 0, 1 组 成 的序 列 , 称 这样的序 列 为一条 机 器指令. 比如 ,某种 型号的 的 计 算机用 8 位二 进制 信 息 10001010 表示一次加 法 , 以 0001 0 0 11 表示一次减法等 等 .这些指令的执行由计算机 的 线 路 来 保 证, 计 算 机在 设 计 之 初, 事 先 就 要确 定 好 每一条指 令 对 应的 线 路 逻辑 操作 .用 机 器语言进行程序设计是一项累人的工作, 同 样的任 务