首页
社区
课程
招聘
[求助]如何将C程序反汇编成8086汇编程序
发表于: 2015-7-1 08:19 6481

[求助]如何将C程序反汇编成8086汇编程序

2015-7-1 08:19
6481
请问如何在如今的这些系统上,将printf()的功能,逆向成8086汇编代码,而不是直接call xxAPI。windows上是有一些模拟dos系统 的工具吧,请问具体怎么操作呀?另外就是linux系统又怎么办呢,比如在64位的centos里,怎么知道一段C代码,如果用8086汇编写出来,是啥样的?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (21)
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
同问 ,帮顶!
2015-7-1 09:25
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
1.  linux下用的汇编是gas格式,不过和常见的inter格式大同小异,你把两个操作数倒过来读就好了
2.  g++ -S 你的源文件,比如我的源文件是:INIParser.cpp
3. 生成了源文件.s 就是汇编文件了,这里我的汇编文件是INIParser.s
4. 手打了那么久,就给分吧
2015-7-1 09:36
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
噢,我想请教的问题是这样的。
比如ubuntu系统里写个test.c:
#include <stdio.h>

int main()
{
        printf("hello\n");

        return 0;
}

gcc -S test.c,反汇编出来是这样:
        .file   "test.c"
        .section        .rodata
.LC0:
        .string "hello"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        andl    $-16, %esp
        subl    $16, %esp
        movl    $.LC0, (%esp)
        call    puts
        movl    $0, %eax
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1"
        .section        .note.GNU-stack,"",@progbits

这个明显不是8086的汇编程序,怎么样可以反汇编得到8086的汇编程序?
2015-7-1 09:59
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
有系统的情况下,不管你怎么做最后还是调用api的,最后说int xxx的系统调用来骗自己说不是api有用么?你这叫瞎折腾!没系统的情况下是直接写显存或者直接io的
2015-7-1 10:17
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tom
6
linux下有 printf的原代码不许要反汇编.
2015-7-1 10:23
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
应该有开源的c库吧
2015-7-1 11:03
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
嗯,我就是想看是怎么通过写显存,实现printf()功能的,在int xx前,是怎么处理printf()中的可变参数的。我是新手,学习过程中避免不了走些弯路,避免不了折腾,所以还请多多指教呀。
2015-7-1 11:31
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我目前是把王爽的那本汇编教程看了三遍,现在就是想对同一个功能,用8086汇编指令写一份,用c写一份并反汇编,然后对比2份代码。
2015-7-1 11:37
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
10
在保护模式下要写显存是非常的麻烦的事情。尤其是在一个非常成熟的操作系统当中。
如果想搞的话,去看那本《Orange`s一个操作系统的实现》,在实模式下直接掉BIOS中断就行
2015-7-1 11:46
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
噢,这样呀。那如果暂时不说printf()呢,比如这段程序:

#include <stdio.h>

int main()
{
        int i = 0, sum = 0;

        for (; i < 10; i ++)
                sum += i;

        return 0;
}

这段代码,我如果自己不会用8086汇编实现,想看看编译器是怎么实现的,要怎么做?
2015-7-1 12:12
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tom
12
下载个Turbo C 2.0编译器,放到dosbox里,将程序编译exe文件,然后放到IDA PRO里反汇编就可以了
2015-7-1 18:04
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好的好的,我试试,感谢。
2015-7-2 06:55
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
trubo_c2.0自带一个测试程序:
#include <stdio.h>
void main()
{
        printf("this is a C program. \n");
}

dosbox里面用tc编译,ida反汇编后,有一段这样的注释:
; File Name   : F:\dosbox\Turbo_C2\tc\TEST.EXE
; Format      : MS-DOS executable (EXE)
; Base Address: 0h Range: 0h-1860h Loaded length: 1860h
; Entry Point : 0:0
; OS type         :  MS DOS
; Application type:  Executable 16bit

和一段这样的程序:
seg000:01FA ; Attributes: bp-based frame
seg000:01FA
seg000:01FA ; int __cdecl main(int argc, const char **argv, const char **envp)
seg000:01FA _main           proc near               ; CODE XREF: start+11Ap
seg000:01FA
seg000:01FA argc            = word ptr  4
seg000:01FA argv            = dword ptr  6
seg000:01FA envp            = dword ptr  0Ah
seg000:01FA
seg000:01FA                 push    bp
seg000:01FB                 mov     bp, sp
seg000:01FD                 mov     ax, 194h
seg000:0200                 push    ax              ; format
seg000:0201                 call    _printf
seg000:0204                 pop     cx
seg000:0205                 pop     bp
seg000:0206                 retn
seg000:0206 _main           endp

为什么看不到"this is a C program. \n"这个字符串在哪定义了?
2015-7-2 08:18
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我看了一下,TEST.EXE没有PE头,应该就是16位的了。只要是TC编译出来的,都是16位的吧?不在dosbox环境下启动TC,应该也是一样的效果吧?要起床上班来不及试了。
2015-7-2 08:42
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
用turbo c 2.0编译出来的可执行文件就是16位的,tc.exe本身也是16位的,如果你的windows电脑启动不了这个程序,要在组策略里面设置一下。linux里面我还不知道怎么弄,应该也是有一种16位的编译器。
2015-7-3 08:08
0
雪    币: 9602
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
可以在反编译器中得到汇编代码,而不是汇编源程序
2015-7-3 08:57
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
噢,可以指定16位吗?
2015-7-3 09:01
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
需要反汇编很简单,C编译出exe,IDA pro打开就可以了。

如果你想看printf在底层的实现,也很简单,windbg双机调试,call跟进去就看见了。
2015-7-3 10:23
0
雪    币: 13
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
好的,IDA、OD、windbg这些,我还需要慢慢接触,我目前的目标就是把8086的汇编指令搞熟悉,能有一种编译和反编译的方法就可以了。等我渐渐可以接触一些复杂的程序,需要用到这些工具,遇到不会的问题,再请教噢。
2015-7-3 12:40
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
直接看glibc或eglibc的源代码就可以了
2015-7-4 15:17
0
雪    币: 449
活跃值: (777)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
22
直接换一个vs的编译器就好了.
2015-7-5 12:59
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册