逆向工程汇编代码
Reverse engineering assembly code
我正在努力学习组装/倒车。例如,我正在努力寻找只有一个参数的 idiv 和 imul 的文档,并且还了解 sub/add 中哪个参数是第一个和最后一个。我得到了以下代码(根据我在评论中的理解)
start:
mov 24, %rax ; move int value 1024 to register rax
mov 96, %rbx ; move int value 4096 to register rbx
mov 48, %rcx ; move int value 2048 to rax rcx
xor %rdx, %rdx ; rcx XOR rcx. rcx = 0
sub %rcx, %rbx ; sucstract rcx from rbx? rbx = 2048?
cmp %rbx, %rax ; compare rbx to rax
jge loopa ; if rax > rbx, jump to loopa ? (false first time)
jmp loopb ; else jump to loopb
loopa: ; start loop a
cmp , %rdx ; compare int value 4 to register rdx
jg end ; if rdx > 4 jump to end
inc %rdx ; rdx++ (rdx = 1 first time)
loopb:
xchg %rax, %rbx ; (switch value of rax and rbx)
idiv %rbx ; signed divide, but divide on what?
add %rdx, %rax ; add rdx to rax ?
imul %rcx ; (multiple what? )
jmp loopa ; jump to loopa
end:
这是 x86 程序集的特定方言吗?我搜索了说明,发现它们有所不同。在参数、语法等方面。
可能打错了,但无论如何我想让你注意到:在这一行
jge loopa ; if rax > rbx
,jge
表示如果大于或等于则跳转,所以if rax >= rbx
。请记住,每个 AT&T(是的,它是英特尔语法的一种方言)指令都有这种模式:指令源,目标。因此,对于算术或比较指令,您必须从第二个操作数开始 "thinking"。
关于idiv
和imul
说明,你应该阅读this。
我正在努力学习组装/倒车。例如,我正在努力寻找只有一个参数的 idiv 和 imul 的文档,并且还了解 sub/add 中哪个参数是第一个和最后一个。我得到了以下代码(根据我在评论中的理解)
start:
mov 24, %rax ; move int value 1024 to register rax
mov 96, %rbx ; move int value 4096 to register rbx
mov 48, %rcx ; move int value 2048 to rax rcx
xor %rdx, %rdx ; rcx XOR rcx. rcx = 0
sub %rcx, %rbx ; sucstract rcx from rbx? rbx = 2048?
cmp %rbx, %rax ; compare rbx to rax
jge loopa ; if rax > rbx, jump to loopa ? (false first time)
jmp loopb ; else jump to loopb
loopa: ; start loop a
cmp , %rdx ; compare int value 4 to register rdx
jg end ; if rdx > 4 jump to end
inc %rdx ; rdx++ (rdx = 1 first time)
loopb:
xchg %rax, %rbx ; (switch value of rax and rbx)
idiv %rbx ; signed divide, but divide on what?
add %rdx, %rax ; add rdx to rax ?
imul %rcx ; (multiple what? )
jmp loopa ; jump to loopa
end:
这是 x86 程序集的特定方言吗?我搜索了说明,发现它们有所不同。在参数、语法等方面。
可能打错了,但无论如何我想让你注意到:在这一行
jge loopa ; if rax > rbx
,jge
表示如果大于或等于则跳转,所以if rax >= rbx
。请记住,每个 AT&T(是的,它是英特尔语法的一种方言)指令都有这种模式:指令源,目标。因此,对于算术或比较指令,您必须从第二个操作数开始 "thinking"。
关于idiv
和imul
说明,你应该阅读this。