快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

linux反汇编命令 汇编相反指令

linux中 gcc 下ld 链接成什么格式的目标文件,有生成的哪些文件可以反汇编,反汇编的工具有哪些?

elf可执行文件

为平江等地区用户提供了全套网页设计制作服务,及平江网站建设行业解决方案。主营业务为做网站、网站设计、平江网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

生成的目标文件(也即.o文件)和elf文件都可以反汇编

反汇编工具就是objdump命令,加个-S的选项就可以了。例如:

objdump -S hello hello.dump

反汇编Linux程序

你是什么Linux,不开源吗?linux都是开放源码的,你修改过后,重新编译一下内核,就可以了,不需要反编译的

怎样反汇编bzImage-platinum-ChinaUnix博客

具体步骤如下:

#! /bin/sh

set -x

#

# 一般gzip压缩包的magic值为0x8b1f后跟0x0008,或者0x0808。

# 这里就是要找出这个偏移。

# 119116,就是这个偏移,这个偏移在不同的bzImage里是不同的,所以,这里需要手动调整一下。

# 解压后的文件即vmlinux.bin

od -h -A d bzImage | grep --color -m 3 -A 1 -i 8b1f

dd if=bzImage bs=1 skip=11916 | gunzip vmlinux.bin

# 调用我写的一个python脚本,生成gnu linker script。

./genlds.py vmlinux.elf.lds

# 构造 ELF 信息,结果文件为vmlinux.elf

ld -m elf_x86_64 --format binary --oformat elf64-x86-64 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf

# 如果是32位系统,可以用以下命令

#ld -m elf_i386 --format binary --oformat elf32-i386 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf

# 删除在上一步生成的多余符号。

objcopy --strip-symbol _binary_vmlinux_bin_start --strip-symbol _binary_vmlinux_bin_end --strip-symbol _binary_vmlinux_bin_size vmlinux.elf

# 设置 .text section标志,否则objdump -d不能正常工作,只能用objdump -D。

objcopy --set-section-flag .text=alloc,readonly,code vmlinux.elf

# 以后只是出于验证目的。

# 以schedule函数作为一个样本,检查在vmlinux.elf文件里是不是包括了正确的偏移。

grep --color "[tT] schedule$" System.map

readelf -s vmlinux.elf | grep " schedule$" --color

genlds.py内容如下:

#! /usr/bin/python

import sys

#将 形如 fffffff8989 的字符串转换为数字形式。

def to_no(hexstr):

ret = 0

start = -1

len_hexstr = len(hexstr)

while start=-len_hexstr:

c = hexstr

if c in "0123456789":

n = ord(c) - ord('0')

elif c in "abcdef":

n = ord(c) - ord('a') + 0xa

elif c in "ABCDEF":

n = ord(c) - ord('A') + 0xa

ret |= long(n((-start-1)*4))

start -= 1

return ret

# 计算addr-base

def sym_offset(addr, base):

if base == "missing-base":

return "missing-offset"

addr = to_no(addr)

base = to_no(base)

return hex(int(addr-base))

lines = file("System.map").readlines()

result=""

# 求.text的开始地址

base="missing-base"

for line in lines:

line = line.strip()

addr, type, sym = line.split(" ")

if type in "tT":

if sym in ("startup_64", "startup_32"):

base = addr

break

# 生成lds中的符号行。

for line in lines:

line = line.strip()

addr, type, sym = line.split(" ")

if type in "tT":

offset = sym_offset(addr, base)

result+="\t%s = %s; /* orig: 0x%s */\n" % (sym, offset, addr)

# 生成需要的脚本

template="""

OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")

OUTPUT_ARCH(i386:x86-64)

SECTIONS

{

. = 0x%s;

.text . : {

*(.data)

%s}

}

"""

print template % (base, result)

以下是反汇编的出来部分结果:

ffffffff80466ca0 interruptible_sleep_on:

ffffffff80466ca0: 55 push %rbp

ffffffff80466ca1: 48 ba ff ff ff ff ff mov $0x7fffffffffffffff,%rdx

ffffffff80466ca8: ff ff 7f

ffffffff80466cab: be 01 00 00 00 mov $0x1,%esi

ffffffff80466cb0: 48 89 e5 mov %rsp,%rbp

ffffffff80466cb3: c9 leaveq

ffffffff80466cb4: e9 c7 fe ff ff jmpq ffffffff80466b80 __sched_text_start

ffffffff80466cb9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)

ffffffff80466cc0 schedule:

ffffffff80466cc0: 55 push %rbp

ffffffff80466cc1: 48 c7 c0 80 ef 62 80 mov $0xffffffff8062ef80,%rax

ffffffff80466cc8: 48 c7 c2 00 b4 62 80 mov $0xffffffff8062b400,%rdx

ffffffff80466ccf: 48 89 e5 mov %rsp,%rbp

ffffffff80466cd2: 41 57 push %r15

ffffffff80466cd4: 41 56 push %r14

ffffffff80466cd6: 41 55 push %r13

ffffffff80466cd8: 41 54 push %r12

ffffffff80466cda: 53 push %rbx

ffffffff80466cdb: 48 81 ec 98 00 00 00 sub $0x98,%rsp

ffffffff80466ce2: 48 c7 85 78 ff ff ff movq $0xffffffff8062ef80,-0x88(%rbp)

ffffffff80466ce9: 80 ef 62 80


名称栏目:linux反汇编命令 汇编相反指令
文章转载:http://6mz.cn/article/dooodse.html

其他资讯