请教如何把反汇编转成汇编

knddlsrz 2017-11-02 08:32:13
想把objdump出来的反汇编再写成汇编程序,但是跳转需要把地址改成标号。有什么现成的工具或者好的方法么?
...全文
784 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_40982856 2017-11-17
  • 打赏
  • 举报
回复
新手报到,特来学习反人类汇编
knddlsrz 2017-11-16
  • 打赏
  • 举报
回复
引用 16 楼 DelphiGuy 的回复:
反汇编成masm格式就好了,as用intel语法也是可以支持的。
好像不太支持,不过用fgasm编译后,把所有的word[]和byte[]中间加上ptr 就可以了,非常感谢。
  • 打赏
  • 举报
回复
反汇编成masm格式就好了,as用intel语法也是可以支持的。
  • 打赏
  • 举报
回复
不清楚,但是把 mov eax, dword [ebp+0x8] # 055B _ 8B. 45, 08 mov dword [esp], eax # 055E _ 89. 04 24 call malloc 改成 mov eax, dword ptr [ebp+0x8] # 055B _ 8B. 45, 08 mov dword ptr [esp], eax # 055E _ 89. 04 24 call malloc 就好了。 看来as的语法识别有些奥妙,难道是把 dword [esp] 理解成 esp加一个dword的地址?
knddlsrz 2017-11-09
  • 打赏
  • 举报
回复
我这么试了,还是那个函数. .s这么写的: .intel_syntax noprefix push ebp mov %ebp, %esp sub esp, 40 # 0558 _ 83. EC, 28 mov eax, dword [ebp+0x8] # 055B _ 8B. 45, 08 mov dword [esp], eax # 055E _ 89. 04 24 call malloc # 0561 _ E8, FFFFFFFC(rel) mov dword [ebp-0x4], eax # 0566 _ 89. 45, FC cmp dword ptr[ebp-0x4], 0 # 0569 _ 83. 7D, FC, 00 jz $_038 # 056D _ 74, 1A mov eax, dword [ebp+0x8] # 056F _ 8B. 45, 08 mov dword [esp+0x8], eax # 0572 _ 89. 44 24, 08 mov dword ptr[esp+0x4], 0 # 0576 _ C7. 44 24, 04, 00000000 mov eax, dword [ebp-0x4] # 057E _ 8B. 45, FC mov dword [esp], eax # 0581 _ 89. 04 24 call memset # 0584 _ E8, FFFFFFFC(rel) $_038: mov eax, dword [ebp-0x4] # 0589 _ 8B. 45, FC leave # 058C _ C9 ret # 058D _ C3 .intel_syntax noprefix 然后用as编译,得到.o再objconv -fgasm得到.asm: push ebp # 0010 _ 55 mov ebp, esp # 0011 _ 89. E5 sub esp, 40 # 0013 _ 83. EC, 28 mov eax, dword [ebp+0xC] # 0016 _ 8B. 45, 0C mov dword [esp+0x4], eax # 0019 _ 89. 44 24, 04 call malloc # 001D _ E8, FFFFFFFC(rel) mov dword [ebp], eax # 0022 _ 89. 45, 00 cmp dword [ebp-0x4], 0 # 0025 _ 83. 7D, FC, 00 jz $_038 # 0029 _ 74, 1B mov eax, dword [ebp+0xC] # 002B _ 8B. 45, 0C mov dword [esp+0xC], eax # 002E _ 89. 44 24, 0C mov dword [esp+0x4], 0 # 0032 _ C7. 44 24, 04, 00000000 mov eax, dword [ebp] # 003A _ 8B. 45, 00 mov dword [esp+0x4], eax # 003D _ 89. 44 24, 04 call memset # 0041 _ E8, FFFFFFFC(rel) $_038: mov eax, dword [ebp] # 0046 _ 8B. 45, 00 leave # 0049 _ C9 ret # 004A _ C3 其中在malloc调用前的参数地址错了吧?这个是个什么情况?
knddlsrz 2017-11-09
  • 打赏
  • 举报
回复
引用 14 楼 DelphiGuy 的回复:
不清楚,但是把 mov eax, dword [ebp+0x8] # 055B _ 8B. 45, 08 mov dword [esp], eax # 055E _ 89. 04 24 call malloc 改成 mov eax, dword ptr [ebp+0x8] # 055B _ 8B. 45, 08 mov dword ptr [esp], eax # 055E _ 89. 04 24 call malloc 就好了。 看来as的语法识别有些奥妙,难道是把 dword [esp] 理解成 esp加一个dword的地址?
多谢,确实如此,难道把所有的dword 改成dword ptr就好了?说明反汇编出来的并不是完全支持gasm啊
  • 打赏
  • 举报
回复
不清楚,但是masm的标准写法是dword ptr而不是dword,不过as的intel语法似乎只是在立即数到内存指令才要求写dword ptr。
knddlsrz 2017-11-07
  • 打赏
  • 举报
回复
引用 8 楼 DelphiGuy 的回复:
哎,我之前回复过呀,怎么不显示? cmp dword ptr [ebp-0x4], 0
这样是可以了,不过为啥还得加上这个ptr呢?好像是0做操作数的问题?
knddlsrz 2017-11-07
  • 打赏
  • 举报
回复
写错了一个地方,反正是两个操作书带0的出的错. cmp dword [ebp-0x4], 0 # 0569 _ 83. 7D, FC, 00 mov dword [esp+0x4], 0 # 0576 _ C7. 44 24, 04, 00000000
引用 6 楼 knddlsrz 的回复:
可是还是会报错。写了个简单函数测试,先malloc,再memset成0。 这个是这个函数反汇编的结果。 push ebp mov %ebp, %esp sub esp, 40 # 0558 _ 83. EC, 28 mov eax, dword [ebp+0x8] # 055B _ 8B. 45, 08 mov dword [esp], eax # 055E _ 89. 04 24 call malloc # 0561 _ E8, FFFFFFFC(rel) mov dword [ebp-0x4], eax # 0566 _ 89. 45, FC cmp dword [ebp-0x4], 0 # 0569 _ 83. 7D, FC, 00 jz $_038 # 056D _ 74, 1A mov eax, dword [ebp+0x8] # 056F _ 8B. 45, 08 mov dword [esp+0x8], eax # 0572 _ 89. 44 24, 08 mov dword [esp+0x4], 0 # 0576 _ C7. 44 24, 04, 00000000 mov eax, dword [ebp-0x4] # 057E _ 8B. 45, FC mov dword [esp], eax # 0581 _ 89. 04 24 call memset # 0584 _ E8, FFFFFFFC(rel) $_038: mov eax, dword [ebp-0x4] # 0589 _ 8B. 45, FC leave # 058C _ C9 ret # 058D _ C3 然后再前后加上.intel_syntax noprefix 用as编译时得到: Error: ambiguous operand size for `cmp' ---- 是这行cmp dword [ebp-0x4], 0 # 0569 _ 83. 7D, FC, 00 Error: ambiguous operand size for `mov' ------这行mov eax, dword [ebp+0x8] # 056F _ 8B. 45, 08
knddlsrz 2017-11-07
  • 打赏
  • 举报
回复
那就是还得手动加上ptr?
  • 打赏
  • 举报
回复
哎,我之前回复过呀,怎么不显示? cmp dword ptr [ebp-0x4], 0
knddlsrz 2017-11-06
  • 打赏
  • 举报
回复
可是还是会报错。写了个简单函数测试,先malloc,再memset成0。 这个是这个函数反汇编的结果。 push ebp mov %ebp, %esp sub esp, 40 # 0558 _ 83. EC, 28 mov eax, dword [ebp+0x8] # 055B _ 8B. 45, 08 mov dword [esp], eax # 055E _ 89. 04 24 call malloc # 0561 _ E8, FFFFFFFC(rel) mov dword [ebp-0x4], eax # 0566 _ 89. 45, FC cmp dword [ebp-0x4], 0 # 0569 _ 83. 7D, FC, 00 jz $_038 # 056D _ 74, 1A mov eax, dword [ebp+0x8] # 056F _ 8B. 45, 08 mov dword [esp+0x8], eax # 0572 _ 89. 44 24, 08 mov dword [esp+0x4], 0 # 0576 _ C7. 44 24, 04, 00000000 mov eax, dword [ebp-0x4] # 057E _ 8B. 45, FC mov dword [esp], eax # 0581 _ 89. 04 24 call memset # 0584 _ E8, FFFFFFFC(rel) $_038: mov eax, dword [ebp-0x4] # 0589 _ 8B. 45, FC leave # 058C _ C9 ret # 058D _ C3 然后再前后加上.intel_syntax noprefix 用as编译时得到: Error: ambiguous operand size for `cmp' ---- 是这行cmp dword [ebp-0x4], 0 # 0569 _ 83. 7D, FC, 00 Error: ambiguous operand size for `mov' ------这行mov eax, dword [ebp+0x8] # 056F _ 8B. 45, 08
  • 打赏
  • 举报
回复
as也支持intel语法,objconv -fgasm反汇编出的文件前边已经有说明: # Note: Uses Intel syntax with destination operand first. Remember to # put syntax directives in the beginning and end of inline assembly: .intel_syntax noprefix
knddlsrz 2017-11-06
  • 打赏
  • 举报
回复
谢谢,不过这个反汇编出来的汇编不能用gcc进行编译,我试了-fgasm选项。主要是寄存器没有%,指令的源操作数和目标操作数是反的等问题。是有相关的选项么?
zara 2017-11-03
  • 打赏
  • 举报
回复
换个工具,比如 ida 试试?
  • 打赏
  • 举报
回复
可以用objconv,这个反汇编比较高级:http://www.agner.org/optimize/objconv.zip
knddlsrz 2017-11-02
  • 打赏
  • 举报
回复
怎么发出来看不到呢

21,459

社区成员

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

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