欢迎光临!
若无相欠,怎会相见

反汇编学习-C语言实例解析精粹-实例2运行多个源文件

序言

接着上一个继续学习,本次学习的是《C语言实例解析精粹》实例2运行多个源文件,也就是把打印hello world分成多个源文件进行编译,主程序不用那么多行的代码。

环境是VS2017,内存地址和虚拟机中的内存地址不太一样,不过不影响理解汇编代码的学习。

C代码

程序分成三个源代码文件,分别是helloworld.c, print.h和No.2.c(文件名称自定义)。

print.h文件中引入了标准输入输出函数库stdio.h,声明了打印hello world的函数:

#include <stdio.h>

void printfHello(void);

helloworld.c文件中写了一个打印hello world的函数:

#include "print.h"

void printHello()
{
	printf("hello world!\n");
}

No.2.c文件就是我的主函数所在的文件,就引入了自定义的头文件,并调用打印函数:

#include "print.h"

int main(void)
{
	printHello();
	return 0;
}

C代码很简单,下面看DEBUG的汇编代码

汇编代码

我是在printHello()处下的断点

--- e:\projects\c\project1\project1\no.2.c -------------------------------------
#include "print.h"

int main(void)
{
012E1910  push        ebp  
012E1911  mov         ebp,esp  
012E1913  sub         esp,0C0h  
012E1919  push        ebx  
012E191A  push        esi  
012E191B  push        edi  
012E191C  lea         edi,[ebp-0C0h]  
012E1922  mov         ecx,30h  
012E1927  mov         eax,0CCCCCCCCh  
012E192C  rep stos    dword ptr es:[edi]  
012E192E  mov         ecx,offset _0126C36E_no@2@c (012EC007h)  
012E1933  call        @__CheckForDebuggerJustMyCode@4 (012E1217h)  
    printHello();
012E1938  call        _printHello (012E11EAh)    
    return 0;
012E193D  xor         eax,eax  
}
012E193F  pop         edi  
012E1940  pop         esi  
012E1941  pop         ebx  
012E1942  add         esp,0C0h  
012E1948  cmp         ebp,esp  
012E194A  call        __RTC_CheckEsp (012E1221h)   # 检查堆栈是否平衡
012E194F  mov         esp,ebp  
012E1951  pop         ebp  
012E1952  ret

使用F11快捷键,可以看一下012E1938 call _printHello (012E11EAh)  是怎么执行的

012E11EA E9 21 06 00 00       jmp         printHello (012E1810h)

可以看到函数地址为 printHello (012E1810h) ,再次跟进去

--- e:\projects\c\project1\project1\helloworld.c -------------------------------
     1: #include "print.h"
     2: 
     3: void printHello()
     4: {
012E1810 55                   push        ebp  
012E1811 8B EC                mov         ebp,esp  
012E1813 81 EC C0 00 00 00    sub         esp,0C0h  
012E1819 53                   push        ebx  
012E181A 56                   push        esi  
012E181B 57                   push        edi  
012E181C 8D BD 40 FF FF FF    lea         edi,[ebp-0C0h]  
012E1822 B9 30 00 00 00       mov         ecx,30h  
012E1827 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
012E182C F3 AB                rep stos    dword ptr es:[edi]  
012E182E B9 03 C0 2E 01       mov         ecx,offset _D819B0EE_helloworld@c (012EC003h)  
012E1833 E8 DF F9 FF FF       call        @__CheckForDebuggerJustMyCode@4 (012E1217h)  
     5:     printf("hello world!\n");
012E1838 68 30 7B 2E 01       push        offset string "hello world!\n" (012E7B30h)  
012E183D E8 09 F8 FF FF       call        _printf (012E104Bh)  
012E1842 83 C4 04             add         esp,4     # 平衡堆栈
     6: }
012E1845 5F                   pop         edi  
012E1846 5E                   pop         esi  
012E1847 5B                   pop         ebx  
012E1848 81 C4 C0 00 00 00    add         esp,0C0h  
012E184E 3B EC                cmp         ebp,esp  
012E1850 E8 CC F9 FF FF       call        __RTC_CheckEsp (012E1221h)  
012E1855 8B E5                mov         esp,ebp  
012E1857 5D                   pop         ebp  
012E1858 C3                   ret

查看一下这个地方offset string "hello world!\n" (012E7B30h)的内存,是否存着“hello world”

这些简单的汇编指令,我就不详细写出来了。

结语

每天进步一点点,总比没有进步好,加油!

如有错误,敬请指出,感谢指正!      —2019-05-14 22:59:36

赞(0) 打赏
转载请注明:飘零博客 » 反汇编学习-C语言实例解析精粹-实例2运行多个源文件
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临