汇编指令

x86平台inline hook原理和实现

隐身守侯 提交于 2020-02-14 10:55:53
概念 inline hook是一种通过修改机器码的方式来实现hook的技术。 原理 对于正常执行的程序,它的函数调用流程大概是这样的: 0x1000地址的call指令执行后跳转到0x3000地址处执行,执行完毕后再返回执行call指令的下一条指令。 我们在hook的时候,可能会读取或者修改call指令执行之前所压入栈的内容。那么,我们可以将call指令 替换 成jmp指令,jmp到我们自己编写的函数,在函数里call原来的函数,函数结束后再jmp回到原先call指令的下一条指令。如图: 通过修改机器码实现的inline hook,不仅不会破坏原本的程序逻辑,而且还能执行我们的代码,读写被hook的函数的数据。 inline hook流程 (1)寻找hook位置 我们hook的时候,会遇到不同类型的call,它们所占的字节可能是不一样的,本文构造一个长度为5字节的jmp指令(jmp的机器码占用1字节,跳转到的地址偏移占用4字节)来替换原来的5字节的call指令。即我们需要寻找长度为5字节的call,来进行inline hook。5字节的call形如: (2)inline hook代码实现 在x86汇编中,同样有很多类型的jmp,本文构造inline hook使用的是近距离地址跳转的jmp指令,它的机器码为 E9 ,这种类型的jmp指令需要一个参数,参数是 当前jmp指令地址 距离

[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 贰 - 基本指令 | 1. ADD 指令(加)

此生再无相见时 提交于 2020-02-13 12:49:40
注意: 本文经过原作者授权转译,转载请标明出处 原文地址: http://mrjester.hapisan.com/04_MC68/Sect02Part01/Index.html 条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉 翻译若有不足之处欢迎批评指正 译文: "如果你觉得狗不会数数,那你可以试试在口袋里放三个狗饼干然后只给你的旺财两个" ---- 菲尔 巴斯托雷 (Phil Pastoret) 简介 ADD ( 加 ) - 二进制加法 这条指令能把数字从 源操作数 加到 目的操作数 ,而 源操作数 保持不变 例子 在以下的章节中,请尽管使用"十六进制计算器",因为你可能不太习惯怎么去处理十六进制或是二进制数的运算 (如果你可以,那再好不过了,不过这对编码并没有什么用),你可以在网上搜索到在线的十六进制计算器,或者你的电脑里自带的有 下面是个 add 指令的例子: addi .b #$08 , d0 这条指令会把 字节 08 加到数据寄存器 d0 中: 如果 d0 里原本是 00000000 ,指令执行后 d0 的内容会变成 00000008 如果 d0 里原本是 00000010 ,指令执行后 d0 的内容会变成 00000018 如果 d0 里原本是 00000004 ,指令执行后 d0 的内容会变成 0000000C 如果 d0 里原本是

汇编语言之转移指令

拜拜、爱过 提交于 2020-02-11 01:48:17
汇编语言–转移指令 操作符 offset 功能:取得标号的偏移地址 程序: assume cs:codesg codesg segment start:mov ax,offset start ;相当于mov ax,0 s:mov ax,offset s ;相当于mov ax,3 codesg ends end start start和s是代码段中的标号,offset操作符取得了标号start和s的偏移地址0和3。 jmp指令的用法 jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。 1. 依据位移进行转移 段内短转移格式:jmp short 标号 作用:转到标号处执行指令,即(IP)=(IP)+8位位移,它对IP的修改范围为-128~127。 程序: assume cs:codesg codesg segment start:mov ax,0 jmp short s add ax, 1 s:inc ax codesg ends end start 上面的程序执行后,ax中的值为1,因为执行jmp short s后越过了add ax,1, IP指向了标号s处的 inc ax。也就是说,程序只进行了一次ax加1操作。 段内近转移格式:jmp near ptr 标号 作用:与“jmp short 标号”功能相近,不同之处在于(IP)=(IP)+16位位移

[转译][马基 · 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 零 - 序

此生再无相见时 提交于 2020-02-10 11:13:28
__注意:__本文经过原作者授权转译,转载请标明出处 近来沉迷学习,网上翻到大佬Markey Jester 的关于 摩托罗拉68K (Motorola 68000,以下皆简称m68k) 这个cpu 的汇编教程,心血来潮边译边学,附带些个人笔记(以 斜体 标识) 正如我们熟知的Intel 8086 一样,m68k 也是一款经典cpu,大量用于街机游戏如Capcom 的街头霸王系列,Igs 的三国战纪系列等等 原作者说明本教程并不完整,但足够作为学习m68k 的一个非常好的开始,翻译完整后我会视情况有可能的情况下做一些补充章节 (当然也可能会鸽hhhhhh 原定于把系列发于简书 ( 地址 ),不过简书的markdown 功能不全,而且SEO 很糟糕,现在从简书搬运过来,简书那边就暂不更新了 原文地址: http://mrjester.hapisan.com/04_MC68/ 条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉 翻译若有不足之处欢迎批评指正 译文: 大家好,我是马基杰斯特,这些年来我都在编写m68k 汇编程序,并且做了一些《刺猬索尼克》(Sonic the Hedge) 系列的 ROM 修改 (即hack),也做了一些自己的游戏原型,如今我正在从头开始做一款运行在世嘉Mega Drive 上的完整的游戏 一开始的时候我在学习m68k 汇编语言的时候也不顺利

OllyDbg学习之路-3

烈酒焚心 提交于 2020-02-10 00:32:18
6.比较和跳转指令 (1)cmp eax,ecx 相当于sub eax,ecx 但不保存结果到第一个操作数。 根据结果改变零标志位(Z)。相等时,零标志位置1。 根据结果正负改变符号标志位(S)。运算结果为负时,置为1。 cmp允许寄存器与byte、word、dword类型的内存单元做比较。 eg:cmp ax,word ptr ds:[405000] (2)test 两个数值进行与操作,结果不保存,改变相应标志位 eg:test eax,eax 这个指令可以确定eax是否为0 (3)关于寻找跳转,容易忽略提示框中的本地调用来自xxx。 7.call、ret (1)ret指令不仅仅可用于子程序的返回,eg: 12 push 401256ret 等价于 1 jmp 401256 (2)改变程序代码后,反汇编界面右键重新分析。(否则分析可能出错,如栈中信息没有分析出函数间调用。) 8.循环、字符串指令和寻址方式 (1)loop [lable] 等价于 cx=cx-1 若cx!=0 转到lable loopz/loope 等价于cx=cx-1 若cx!=0且zf=1 转到lable loopnz/loopne 等价于cx=cx-1 若cx!=0且zf=0 转到lable (2)movs 从一个地址向另一个地址复制数据。源地址保存在ESI寄存器中,目的地址保存在EDI寄存器中。

计算机方面的缩写大全

只愿长相守 提交于 2020-02-09 18:50:41
计算机必懂的53个英文单词和缩写 ·PC:个人计算机Personal Computer ·CPU:中央处理器Central Processing Unit ·CPU Fan:中央处理器的“散热器”(Fan) ·MB:主机板MotherBoard ·RAM:内存Random Access Memory,以PC-代号划分规格,如PC-133,PC-1066,PC-2700 ·HDD:硬盘Hard Disk Drive ·FDD:软盘Floopy Disk Drive ·CD-ROM:光驱Compact Disk Read Only Memory ·DVD-ROM:DVD光驱Digital Versatile Disk Read Only Memory ·CD-RW:刻录机Compact Disk ReWriter ·VGA:显示卡(显示卡正式用语应为Display Card) ·AUD:声卡(声卡正式用语应为Sound Card) ·LAN:网卡(网卡正式用语应为Network Card) ·MODM:数据卡或调制解调器Modem ·HUB:集线器 ·WebCam:网络摄影机 ·Capture:影音采集卡 ·Case:机箱 ·Power:电源 ·Moniter:屏幕,CRT为显像管屏幕,LCD为液晶屏幕 ·USB:通用串行总线Universal Serial Bus,用来连接外围装置

转:汇编常见错误

ⅰ亾dé卋堺 提交于 2020-02-09 05:21:47
1、test.asm(54): error A2000: Block nesting error 说明:此错误信息通常见于一个段定义起始段名和末尾段名不一致。 修改:检查段定义,使段名前后保持一致。 2、test.asm(5): error A2005: Symbol is multidefined: DATA 说明:此错误信息提示DATA符号重复定义了。 修改:将其中一个符号DATA重新设置。 3、test.asm(7): error A2009: Symbol not defined: B9H 说明:此错误信息为test.asm中第7行指令出错,查看该指令,源操作数为十六进制数B9H。按规定以字母开始的十六进制数,应在其前面加上数字0以便汇编程序区分常数和符号。另一种出错的可能原因是程序中使用的符号变量没有定义。 修改:以0B9H取代B9H;使用伪指令定义变量。 4、test.asm(11): error A2009: Symbol not defined: NO 说明:test.asm中第11行指令JLE no-count,符号中使用了中折线,中折线在汇编中是作为减号,因此,汇编提示标号NO没有定义。注意,汇编语言规定符号中可以使用下划线。 修改:将no-count改为no_count。 5、test.asm(28): error A2010: Syntax error 说明

《汇编语言》第一节学习心得

耗尽温柔 提交于 2020-02-09 04:10:17
这学期初识《汇编语言》,只知道有这么一节课却不曾知道讲述的是什么。尽管是选修课,但由于学分需要也有自身的好奇使得自己坚持选择了这门课。仅学习完第一章后列出学习心得。 ①机器语言是机器指令的结合,机器指令即一台机器可以正确执行的命令。早起的程序设计均使用机器语言,运用0、1数字编程的程序代码进行指令,但操作内容极为冗长繁琐,1个有用的程序最少也要有几十行机器码,而一旦有一个数字输入错误,程序就会运行有所错误,而检查过程也会非常困难,极为的不方便。 ②在机器语言不方便的情况下,汇编语言由此诞生,主体是汇编指令。与机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。 ③汇编语言由3类指令组成:汇编指令:机器码的助记符,有对应的机器码;伪指令:没有对应的机器码,由编译器执行,计算机并不执行;其他符号:如+、-、*、/等,由编译器识别,没有对应机器码。汇编指令是汇编语言的核心。 ④CPU控制整个计算机的运作并进行运算。想让CPU工作,就必须提供指令和数据。指令和数据在存储器中存放,即内存。学习领用汇编语言编程,首先要了解CPU是如何从内存中读取信息,以及向内存中写入信息的。 ⑤指令和数据都是二进制信息。 ⑥存储器被划分成若干个存储单位,每个存储单元从0开始顺序编号,微型机存储单元可以存储一个Byte,即8个二进制位。大容量存储器还用以下单位来计算容量: 1KB

计算机是这样工作的

本秂侑毒 提交于 2020-02-09 03:12:12
陈民禾,原创作品转载请注明出处《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ,我的博客中有一部分是出自MOOC课程中视频,再加上一些我自己的理解。 一、首先在理解计算机是如何工作之前,我们先来理解一下现代计算机的模型。 现代计算机是存储程序计算机,依据冯诺依曼体系结构构造。从硬件的层面,也就是我们从计算机的主板。冯诺依曼体系结构我们可以大概抽象成一个cpu。还有一块可以抽象成内存,cpu和内存有一个连接,我们称之为总线,然后就是cpu内部,cpu里面有个很重要的寄存器,叫做ip,它总是指向内存的某一块区域,比如说它指向代码段,此时cpu就从IP指向的那个内存地址取过来一条指令执行,执行完之后Ip自加一,这样像贪吃蛇一样一步步向下面走,这就是从硬件方面解释的冯诺依曼体系。 二、计算机依靠机器语言进行工作,我们可以通过汇编语言来“指挥”计算机完成一些工作,下面就是一些汇编基础知识,总结如下: X86计算机的寄存器:32位的X86计算机的寄存器,它的低16位作为16位的寄存器,16位的寄存器,它还有8位的寄存器。8位的寄存器包含AH,BH,CH,DH,AL,BL,CL,DL。16位的寄存器包含AX,BX,CX,DX,BP,SI,DI,SP。所有开头为E的寄存器一般来讲是32位的。譬如EAX:累加器

Intel 8086 常用汇编指令表

我的梦境 提交于 2020-02-08 14:22:43
一、数据传输指令   它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   1. 通用数据传送指令.     MOV  传送字或字节.     MOVSX 先符号扩展,再传送.     MOVZX 先零扩展,再传送.     PUSH  把字压入堆栈.     POP  把字弹出堆栈.     PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.     POPA  把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.     PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.     POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.     BSWAP 交换32位寄存器里字节的顺序     XCHG  交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)     CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )     XADD  先交换再累加.( 结果在第一个操作数里 )     XLAT  字节查表转换.         ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即         0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )   2.