有关反汇编jmp指令的问题.

a294447011294447011 2008-09-21 08:19:07
我是这样理解jmp指令后面的4字节数据的:
反汇编jmp指令后面的4字节数据是:将要跳转的地址与cs:ip的偏移量加上5
不过这好象是断跳转,不是长跳转.
那里有有关的资料可以看看?也就是机器码与汇编指令的转换资料?
...全文
740 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghongyy 2010-11-08
  • 打赏
  • 举报
回复
如果是一个长跳转呢?偏移地址用4个位置存不下 楼主的5岂不是悲剧了
wangzejing20 2008-09-26
  • 打赏
  • 举报
回复
我看的是INTEL汇编语言程序设计(第四版),在65页,3.4.9节中讲的小尾顺序。
  • 打赏
  • 举报
回复
哪本书有这方面介绍啊?
jvphxys 2008-09-26
  • 打赏
  • 举报
回复
顶一个!
  • 打赏
  • 举报
回复
哪本书有这方面介绍啊?
  • 打赏
  • 举报
回复
如果哪本书有这方面介绍,我定去买!
xtdumpling 2008-09-22
  • 打赏
  • 举报
回复

1382:0106 EA10008213 JMP 1382:0010;长跳转/段间跳转


x86的CPU系统里面存储是:字的低字节存放在低地址,高字节存放在高地址,叫小端存储(Little Endian).
上面EA后面的10008213 ==> 10 00 82 13 ==> 1382:0010
wangzejing20 2008-09-22
  • 打赏
  • 举报
回复
那是小尾顺序。INTEL的CPU。
DWORD和WORD要颠倒,BYTE就没法颠倒了。
  • 打赏
  • 举报
回复
jmp后面的4字节数据好象是按:1对4,2对3的顺序存储的!也就是说:vc里的int数据存储到jmp后面的4字节内,就按高位对低位,低位对高位的存储进去的!
不知道我这样理解是否正确?
xtdumpling 2008-09-22
  • 打赏
  • 举报
回复
指令执行的时候的IP是下一条指令的地址,所以有了LZ说的加"5"(5应该是当前指令的长度)

debug下的试验:


-a 100
1382:0100 jmp 10
1382:0103 jmp short 10
1382:0106 jmp far 10
1382:010B jmp 100 ;jmp far 指令长度:5
1382:010D
-u 1382:100
1382:0100 E90DFF JMP 0010 ;段内跳转
1382:0103 E90AFF JMP 0010 ;段内短跳转
1382:0106 EA10008213 JMP 1382:0010;长跳转/段间跳转
1382:010B EBF3 JMP 0100 ;段内长跳转


FYI.
YNCMCHY 2008-09-21
  • 打赏
  • 举报
回复
学学。帮顶。
RainbowMink 2008-09-21
  • 打赏
  • 举报
回复
你这问题我说点我个人理解, 我很菜..
1.实模式下 masm不支持长跳转.
2.你看杨季文书里demo,用masm写的跳入保护模式的代码,

jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm

他直接用机器码跳了.
3.保护模式下应该是不存在长跳转短跳转的.因为直接就可以寻址的到, 不存在跨段的问题.
==========
我很菜..但是希望对你有帮助,
  • 打赏
  • 举报
回复
RainbowMink我谢谢你的热心帮助!
opcodes.rar 这个机器码和汇编指令的对照表我有了!我想要比较具体一些的说明.给一些有关的书籍也好.
RainbowMink 2008-09-21
  • 打赏
  • 举报
回复
我这有个机器码和汇编指令的对照表. 我找下地址给你.
在这呢.

http://www.aogosoft.com/download/opcodes.rar
自己下吧 直接用迅雷下.
Hackers Disassembler 1.06 汉化版是一个非常快速和舒适的免费反汇编工具,玩过破解的我相信Hacker’s Disassembler 会成为你收藏的工具之一。 软件功能特色:对于COM,MZ和PE可执行文件的支持 在JMP和CALL指令和给定的地址,存储地址的历史 认识到引用字符串,对话框和菜单 认识到导入函数的调用 有关导出函数的信息 自定义的热键和颜色,语法高亮 “跟踪模式” 程序和全局变量名称 注释 书签 使用拖放和拖放打开文件 保存文本片段 对话框中的“反汇编模式” 在正常模式下可以反汇编或者整个文件(二进制和MZ),部分路段(PE)或间隔(虚拟地址在相应的字段中指定)。 在跟踪模式下反汇编开始从虚拟地址在现场开始设置,到结束设置地址,或到最接近的指令JMP或沤。然后当控制被转移到块被分解。这种模式便于拆卸的代码的小片段,例如,在RTL函数调用一些辅助功能。请注意,该守则某些部分可以通过反汇编,如果控件使用间接寻址指令(例如,调用[ESI EAX*4])转让有被错过。默认情况下,现场开始包含入口点的地址。 当打开二进制文件,需要指定文件图像(物理地址)的偏移量,图像的大小,对应于图像(虚拟地址)的开头的虚拟地址,进入点的和是否该代码是32位的虚拟地址。     反汇编 最小的字符串长度:具有长度小于给定数量少的字符串是由反汇编忽略,并且不包括在字符串引用列表。此参数用于预防参考其他不属于字符串符号的短序列。
DEBUG命令详解 参数 搜索 跟踪 反汇编 写入 分配扩展内存 释放扩展内存 直接将 8086/8087/8088 记忆码合并到内存。 该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。 a [address] 参数 address 指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。 有关将数据输入到指定字节中的信息,请参看Debug E(键入)。 有关反汇编字节的信息,请参看Debug U(反汇编) 说明 使用记忆码 段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。 汇编跳转和调用 汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示: -a0100:0500 0100:0500 jmp 502 ; a 2-byte short jump 0100:0502 jmp near 505 ; a 3-byte near jump 0100:0505 jmp far 50a ; a 5-byte far jump 可以将 near 前缀缩写为 ne。 区分字和字节内存位置 当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式: dec wo [si] neg byte ptr [128] 指定操作数 Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式: mov ax,21 ; load AX with 21h mov ax,[21] ; load AX with the ; contents of ; memory location 21h 使用伪指令 使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例: db 1,2,3,4,"THIS IS AN EXAMPLE" db 'THIS IS A QUOTATION MARK:"' db "THIS IS A QUOTATION MARK:'" dw 1000,2000,3000,"BACH"
功能: 1.反混淆 在反汇编窗口中选择并执行这条指令。它会尝试将垃圾指令中转换成为清晰的指令。 举例: 原始指令: 00874372 57 PUSH EDI 00874373 BF 352AAF6A MOV EDI,6AAF2A35 00874378 81E7 0D152A41 AND EDI,412A150D 0087437E 81F7 01002A40 XOR EDI,402A0001 00874384 01FB ADD EBX,EDI 00874386 5F POP EDI 反混淆后: 00874372 83C3 04 ADD EBX,4 2.反混淆-单步 这条指令的原理同上一条相似,不过它一次只分析一条指令。 3.将nop置后 将这种形式的代码: 00874396 50 PUSH EAX 00874397 90 NOP 00874398 90 NOP 00874399 52 PUSH EDX 0087439A BA 3F976B00 MOV EDX,somesoft.006B973F 0087439F 90 NOP 008743A0 90 NOP 008743A1 90 NOP 转换为: 00874396 50 PUSH EAX 00874397 52 PUSH EDX 00874398 BA 3F976B00 MOV EDX,somesoft.006B973F 0087439D 90 NOP 0087439E 90 NOP 0087439F 90 NOP 008743A0 90 NOP 008743A1 90 NOP 限制:它会跳出所有跳转指令和call指令 4.取消/重新执行 取消或再次执行前一条指令 5.检索跳转功能 它会静态分析指令并且跟踪所有的跳转指令。在程序不停地跳来跳去的场合下,这个功能是非常有用的。当它遇到不能跟踪的指令时,它会停止分析,将所有已经分析完毕的指令拷贝到一块指定的内存中去。 在设定中设置这些参数: 步过所有的call-如果设置的话,它会步过所有的call。否则它会跟踪它们。 步过jcc-dtto(?) 反混淆-在遇到Jcc,RET,JMP,CALL指令时,它会反混淆指令。在程序有多分支的时候非常有用。 举例: 转换前: 00874389 /EB 05 JMP SHORT somesoft.00874390 0087438B |43 INC EBX 0087438C |41 INC ECX 0087438D |42 INC EDX 0087438E |EB 07 JMP SHORT somesoft.00874397 00874390 \B8 07000000 MOV EAX,7 00874395 ^ EB F4 JMP SHORT somesoft.0087438B 00874397 C3 RET 转换后: 003B0000 B8 07000000 MOV EAX,7 003B0005 43 INC EBX 003B0006 41 INC ECX 003B0007 42 INC EDX 003B0008 C3 RET 6.重建资源和重排列 此功能在脱壳时有一些限制。它从磁盘上打开被调试的文件。然后找到所有的资源并将它们重建到一块区段(当前它将资源重建到exe中的原始区段中)。然后它重新排列文件,以一个新的名字来保存文件。 什么时候此功能是有用的?举例来说,在脱apack/asprotect或者其他一些壳的事后。这些壳会从原始区段中窃取一些资源,并且将它们放置到自己的区段中。由此会增加文件的大小,并且防止你去除壳的区段。同时它也防止了通过一些资源黑客软件看到这些资源。 我确信会有比这个插件更好的工具,不过将它整合进来有时候是十分方便的。 7.AsProctect脱壳 此功能可以脱那些被asprotect加上壳的文件并且修复它们,导出asprotect.dll,将信息输出到txt文件中去。当此功能失败的时候,请提交目标文件给我。 限制: 1.无法找到和修复SDK 1.x版本的函数(你需要手动寻找它们) 此处有两种情况。一种是在OEP之前被调用的函数。它们进行一系列的初始化功能。如果它们不被执行,程序可能会提示失效。找到它们并执行它们:-) 第二种是在OEP之后执行的,通过特殊的参数隐藏在GetprocAddress之后,这些函数AsProtect将它们重新转向到了自己的代码中。你需要手动分析这些代码。 2.在2.30-2.51中,有两种方式的窃取方式-一种为PolyOEP方式,还有一种是虚拟化。此功能只能修复前者。 3.不能找到CRC校验或者外壳检查。不过此功能可以防止一种类型的外壳检查:在跳转到API的指令中寻找E8。 4.它不会解密被加密的部分或者区段。 5.它不会找到序列号,修补试用版等等。 6.如果有附加数据的话,在脱壳后可能会破损。 Bugs: 不能工作在在一些特定的1.10版本下,有时间我会修复的。 注意: 在脱被Asprotect 2.X保护的文件时,你可能需要aspr_ide.dll。从aspack.com上获得它们,如果需要的话,进行修改。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧