精华内容
下载资源
问答
  • c语言反编译成汇编

    2020-06-04 19:24:07
    在该目录下,生成xxxx.s文件,对应该文件的汇编语言 gcc -s xxxx.c

    在该目录下,生成xxxx.s文件,对应该文件的汇编语言。注意S是大写

    gcc -S xxxx.c
    

    在这里插入图片描述
    可以看出来结构很乱,内容不好筛选。

    所以,可以利用gdb命令进行打印。
    gcc命令:

    gcc xxxx.c -o xxxx
    

    生成xxxx.exe,然后

    gdb xxxx
    

    (筛选方法?)

    disas main
    

    就可以看到比较清楚的汇编指令了
    在这里插入图片描述

    展开全文
  • 一、运行程序源代码是静态的,只有运行起来才...用C语言简单打印hello word的源代码1.编译运行编译器:简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编...

    一、运行

    程序源代码是静态的,只有运行起来才发挥作用。

    编译运行是最经典、高效最高的运行方式。C/C++的高性能在很大程度上归功于编译。用编译语言开发一个软件要经历的过程是:编辑、编译、链接和运行。

    编辑就是用程序设计语言编写的源代码。

    3b0b57cc316106cbe50d48ae49bfb427.png

    用C语言简单打印hello word的源代码

    1.编译运行

    5533f1a9b41a64179a54c25374f1ac02.png

    编译器:

    简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)。

    编译:

    编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

    如果程序员编写的源代码有错误,通常指语法错误,那么编译器会报错,并停止编译。因为它读不懂源代码,不知道该转成什么。一些聪明的编译器还会找出程序中逻辑上的问题和不安全的地方。当遇到编译器给出错误提示时,就要分析出错误的原因,重新修改代码后,再重新编译。如此往复,知道编译成功为止。

    c72b7bed944e05c4dce42f0fe3ec2198.png

    链接:

    链接也称超级链接,超链接是指从一个网页指向一个目标的连接关系,而在一个网页中用来超链接的对象,可以是一段文本或者是一个图片.当浏览者单击已经链接的文字或图片后,链接目标将显示在浏览器上,并且根据目标的类型来打开或运行。

    使用超文本,链接(link)是从一个词、图片或信息对象到另一个的可选连接。在像万维网这样的多媒体环境里,这些对象可能包括声音和动态影像序列。链接的最常见的格式是高亮显示的词或图片,它们可以由用户选择(用鼠标或其他方式),形成直接传输和产看其他文件。高亮显示的对象涉及到锚定。锚定引用和涉及到的对象构成超文本链接。

    6e08ee7cc19a06c813812ed30b428531.png

    链接过程很简单,有时候甚至完全体会不到,所以很多人习惯上把它也算作编译的一部分。在这个过程中,链接器把用户用户程序和支持它运行的必要的其它程序都“合成”在一起,形成最后的可执行文件(DOS和Windows下扩展名为.exe的文件)。可执行文件里面都是执行代码,也就是机械语言代码。全部转换过程完毕,用户就可以把这个文件复制给别人用了。通常,使用者并不需要程序的源代码,有这个可执行文件足矣。使用者唯一要做的就是运行它。

    不要以为程序能运行就可以了。运行时还会出现错误,开发者必须捕获这些错误,并修改源代码的错误,重新编译、链接,最终交付无错的可执行文件。有些错误很快就会被发现和及时发发现和及时修改;有些错误则隐藏很深,很长才会被发现,例如著名的2000年问题———千年虫。

    2.解释运行

    e67ff13bcfcaf18078bfc1f0a6249609.png

    最具有代表性的是BASIC、JavaScript、PHP、Python等语言。这些语言的共同特点是运行速度慢但简单。

    用这些语言编写程序在运行时必须先运行一个解释器。解释器能够读懂这些语言,按照程序指令一步一步地工作,完成开发者需要的功能。因为必须一条一条地解释语句并执行,所以速度很慢,比编译语言要慢数十倍甚至上百倍。因为解释器的功能可以做得很强,并且可以把计算机的复杂性隐藏起来,所以这类语言都比较易学。

    解释语言简单好用,获得了大量的的支持者。甚至有人预言,它将完全替代编译语言。说这样话的人好像忘了这样一件事,那就是解释语言的编译器几乎是C/C++开发的。编译语言的编译器、链接器可以用编译语言编写,然而解释语言只能借助编译语言发展。

    解释语言还有一个致命伤——源代码必须交给用户。对把源代码视作最高商业机密的软件企业来说,这简直是自砸饭碗,不会有人愿意这样子做。因此,有人预言,解释语言的生命力不会长,不过他也错了。现在,解释语言已经是高级语言中不可或缺的一部分。它在web开发和应用软件脚本扩展等领域发挥着巨大作用。通过法律的保护,人们已近不再特别介意源代码的保密,甚至有人愿意公开源代码与人交流。至于速度问题,一方面,因为硬件性能提升、成本下降,硬件瓶颈不再突出;另一方面,解释语言也采用了很多提高速度的办法。有一种办法是:解释,后解释。

    Java和C#语言都是先编译,后解释的。编译器并不把它们编译成机器代码,而是编译成一种中间代码(Java语言中称为字节码,C#语言中称为MSIL),当然,这个中间代码必须在其平台上运行。Java语言提供的平台称为JVM,它纯碎靠解释字节码来运行程序;C#语言的运行平台称为CLR,它并不是一个纯碎的解释器,而是翻译器,把MSL代码翻译成机械代码,再运行它。它们都要有平台才能运行,所以它们都比编译语言慢,Java语言比C#语言更慢。但它们具备解释语言最大的好处——简单,而且只需经过一次编译,避免了源代码的传播,非常适合开发大型应用软件。

    2.内存

    程序在运行是和数据一起保护在内存内,有CPU执行。

    程序和数据都是以二进制方式存储的,存储的单位是字节(Byte),每台计算机的内存都能存储一定字节数的内容。通常,每个存储单元能保存一个字节。

    内存的每个单元都被分配一个唯一的整数,称为地址。这就像着宿舍一样,用地址就能找到你要找的地方。

    持续更新......

    展开全文
  • 写在前面的话近期,我对这款名为Gacrux的恶意软件...这款恶意软件加载器采用C语言开发,并且使用了Visual Studio 2017进行编译。这款恶意软件从2020年8月开始在某些论坛上出售,似乎受到了Smoke Loader的极大启发。...

    06739f1465f1f174f9b369a9bc093a4e.png

    写在前面的话

    近期,我对这款名为Gacrux的恶意软件样本进行了分析。考虑到这两个样本文件的来源,我无法直接跟大家共享文件的哈希或直接公开样本文件,不过根据本文所提供的信息,大家可以轻松识别出这款恶意软件。这款恶意软件加载器采用C语言开发,并且使用了Visual Studio 2017进行编译。这款恶意软件从2020年8月开始在某些论坛上出售,似乎受到了Smoke Loader的极大启发。

    反分析技术

    Gacrux应用了很多反调试和反虚拟机技术。其中,第一种技术涉及到了下列代码跳转,这将导致IDA无法对代码指令进行正确解析。

    42e2e2cd47c72dedfb315a7881f09da1.png

    这里,我们可以直接利用nop操作码来修复这个问题。进行模式扫描并修复问题之后,我们就可以使用IDA来对代码进行反编译了。

    4932a6f036a7b536e088420b5e89ceec.png

    第二种技术涉及到伪造的返回值,并破坏IDA的函数分析过程。跟之前的一样,我们同样可以使用nop操作码来解决这种问题。

    4644fbec98478ccfb4ab5ade32bbb8cd.png

    最后的代码混淆涉及到两个磁盘上的加密函数,解密操作是在调用函数之前完成的,然后在不久之后又会对函数进行重新加密。

    5ce643e34d90e9955e14ba2825ad196f.png

    解密/加密的工作原理是在函数中找到两个表示加密区域开始和结束的模式,然后用传递给函数的键来对代码进行异或操作。

    a9800f99ec0919bb9ee8f86b856a76e5.png

    代码会检查目标磁盘上的可用空间和RAM大小,这也是其反虚拟机检测机制的一部分。在这里,我们可以设置断点来修改返回值,或直接使用nop命令跳过检测。

    203bd35aadfcd80752136b3dbd085149.png5a58641079963406dff661050baa998b.png

    字符串加密

    字符串存储在一个函数中,该函数根据传入的ID对字符串进行解密。

    d63aeda1f5ea425bafe9f9d299f6143e.png

    整体执行流

    a40ade73cc9122ab80588314a848eb0a.png

    反调试和反VM技术

    这款恶意软件的代码中还添加了一些反调试技术,这些技术嵌入在了很多重要函数中,并且会在检测到调试器或虚拟机的时候来让进程崩溃。第一个技术位于malloc函数中,它会检查PEB中的BeingDebugged成员,如果检测到了相应设置,那么函数将返回请求的缓冲区的大小,而不是分配它。除此之外,它还会检查黑名单上的模块,如果存在,则退出执行。

    886f20a361bd177caab6dd1029729711.png

    在第二项技术中,如果目标系统的RAM或磁盘空间不足,则会增加Explorer资源浏览器的进程PID,这通常是虚拟化的表现。此时,代码将会NtOpenProcess崩溃并阻止其进一步运行。

    bcfad6df51442f9dc2273c8eed6014d7.png

    在这里,注入的初始化ShellCode/自定义PE加载器还会检查PEB的BeingDebugged和NtGlobalFlag成员。

    637a127f474e3838356228dede4bffab.png

    Syscall

    这款恶意软件的Syscall模块几乎完全是从开源的加密程序中拷贝过来的。

    63519a1bc546484e1c6e64d9a749dc43.png

    这里的哈希算法被修改为了djb2,而输出会使用一个常量值进行异或计算。

    79c9e0101b6bd9f18dda7b8554496538.png

    持久化

    恶意软件的持久化是通过一个Windows进程实现的,恶意代码会在explorer.exe上下文中不断地调用这个进程,这个进程会检测安装文件,并在启动项菜单中创建.lnk文件。207a23ea9d03e84a529729b6464907b0.png47e1161b2ede24207e96a901c04a6c62.png

    代码注入

    针对代码注入,Gacrux在32位环境中使用NtCreateSection/NtMapViewOfSection作为写原语,在64位环境中使用NtAllocateVirtualMemory/NtWriteVirtualMemory,这两种方法都是通过直接的系统调用完成的。对于执行原语,它利用的是SetPropA,正如Adam在其文章“PROPagate–一种新的代码注入技巧”中所详述的那样。这是从开源实现中复制的,函数指针的设置方式就证明了这一点。

    7d9e8fd198a4006ea5abc02c68107efe.png

    这里的代码注入技术主要用来调用一个小型的自定义PE加载器,请大家继续往下看。

    自定义PE加载器和数据格式

    这是Gacrux最有意思的功能,注入到Explorer中的代码并非一个普通的PE文件,而是一个带有自定义PE Header和自定义加载器的PE加载器。加载器首先会进行一些反调试检测:

    ddda936eeb5c59563b86d1cdfd8cfeaa.png

    接下来,它会解析三个API,并使用它们来处理导入的表并修复重定位:

    0a1cfcdcac46f9a2d6b2fc390467ea3b.png9f5a3a8c8109f846e96ce5eaedb393fe.png

    PE加载器使用的是自定义的PE格式,根据Kaitai描述符,我们可以轻松恢复出原始的PE文件:

    c6a81fa225eb115559276a53364e2d7c.png

    网络通信

    这款恶意软件的网络通信使用的是WinInet,并且在Explorer上下文场景中实现:8e564615e8a23e67a561390b10e3253e.png7ad458459de4730829ac7c0f7a05d61b.png

    总结

    正如我们所看到的,Gacrux实际上也没有非常多的特别之处。它借鉴了大量的公共代码,并且在稍加修改之后便投入使用了。最重要的是,Gacrux的漏洞非常多!原文来源:FreeBuf

    084de23dc603aa3b8d8bf54c406f991d.png

    展开全文
  • Reverse是一个用来解析二进制文件的逆向工程工具,而且它可以生成更具可读性的代码(类C语言)并带有彩色标识的语法,便于研究人员进行阅读代码。目前,其交互模式仍在做进一步开发。使用环境要求1、python 版本需要在...

    9277ccd23ba9f002d5b7724d7d860592.gif

    Reverse是一个用来解析二进制文件的逆向工程工具,而且它可以生成更具可读性的代码(类C语言)并带有彩色标识的语法,便于研究人员进行阅读代码。目前,其交互模式仍在做进一步开发。

    7f09582a1f8392e627bde9089a8c2a1f.png

    使用环境要求1、python 版本需要在 3.4及以上版本;2、具备capstone反汇编框架,其能提供丰富的反汇编指令;3、具备python-pyelftools模块,用于解析ELF文件(ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等)以及DWARF调试信息,详细请点击链接:pyelftools;4、具备python-pefile模块,以用于解析PE文件(如exe、dll、vxd、sys和vdm等),详细请点击链接:PEfile;5、具备python-msgpack模块,用于序列化运算,详细请点击链接:msgpack;6、具备256色终端;可以通过运行requirements.sh检测是否符合所有的要求反编译功能因为二进制文件中包含了符号型的main,所以其中的-x main是可选的。具体使用如下,$ ./reverse.py tests/server.bin交互模式在此模式下有更多的命令可以使用(da,db等),当然我们也可以通过help查看更多的命令。TODO列表1、添加命令:setbe/setle rawbase(用于原文件格式);2、如果从shell获取的文件为raw文件,则进行加载。视觉模式在交互模式中,我们可以通过使用命令 v 来切换到视觉模式。但该模式需要ncurses动态库的支持。1、代码/功能的定义2、内联注释3、外部参照TODO列表1、当分析器修改代码时,自动进行重载;2、多行注释;3、创建数据/数组;4、符号重命名;5、堆栈变量;6、结构、枚举;7、提高分析器的性能。分析shellcode其中对于每一个Int 0×80,该工具都会尝试通过参数检测syscall函数$ ./reverse.py --raw x86 tests/shellcode.bin

    dc7f422e84414ac4d6810e8405e82513.png

    文章来源及下载:

    https://github.com/plasma-disass ... b/master/reverse.py

    afd79f74511ce6d74caf65e91e2ba2cb.png

    你可能喜欢

    逆向工程师手中的利器-Sublime Text中的模糊匹配

    安卓源码逆向

    c46ab305330eb3b8f0d3b361ddb1c7e6.png

    展开全文
  • c语言怎么反编译,我不会,速速来回答。。。。。。。。。。。。。。。。
  • 反编译c语言的工具

    2015-08-05 08:52:33
    这是一款反汇编c语言的工具,可以将由c++工具编译出来的软件反编译成c代码,非常实用
  • linux发行版ubuntu如何实现C语言反编译1.编写一个程序2.安装编译器(如果你还没有安装的话)3.编译代码4.反汇编 1.编写一个程序 源代码 #include <stdio.h> int add(int a,int b){ int c; c = a+b; ...
  • 本节书摘来自华章出版社《编译与反编译技术》一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.7 C语言程序的编译流程...
  • exe反编译c语言

    2011-10-26 20:40:51
    exe反编译c语言,黑框框,英文。 (PS:这个很久以前上传的,可能不适用于某些exe反编译,具体试试看)
  • c语言编译

    2019-10-01 15:03:09
    gcc参数 -On 优化选项,告诉编译器使用第n级优化 通常,优化等级越高,运行速度越快,编译时间越长,调试越困难。...汇编器 objdump -d code.c 用来查看二进制代码 转载于:https://www.cnblogs.com/ful...
  • exe反编译c语言

    热门讨论 2009-04-15 19:07:32
    EXEC-2-C是一个汇编到 C 的软件,包含以下文件 - E2A.EXE - 汇编 - A2APARSE.EXE - 汇编预处理 - E2C.EXE - 转换 A2A.EXE 的结果到 pseudo-C - ENVMNU.EXE - 前几个文件的集成环境 最简单的使用方法是运行 ...
  • 我之前推送过Java代码的编译与反编译,其中简单的介绍了Java编译与反编译相关的知识,最近给GitChat写《深入分析Java语法糖》的时候,又用到了很多反编译相关的知识,遂发现哪篇文章已有些过时。于是,这篇文章就...
  • C语言编译过程

    2019-08-18 16:41:06
    一.预处理阶段 .c ----> .i (-E) 1.将头文件包含 2.删除注释 3.宏替换 4.条件编译 二.编译阶段 ...将.i文件内容编译成汇编语言后生成.s文件 ...汇编 objdump -xd 这些过程放缓存区,内存区 ...
  • 汇编   总结: ①、函数被调用时,实参值赋值给函数栈中的形参,使用以下步骤:  I、call函数前实参值压栈   II、函数中分配局部变量的代码执行完   III、使用原始栈顶值 ebp 的正偏移量(实参),和...
  • c语言反汇编代码

    千次阅读 2013-11-10 21:35:32
    C语言汇编代码(BP,SP的关系) 2011-10-06 17:13:02 分类: C/C++ http://blog.csdn.net/liluvu/article/details/4651353 1. 最简单的代码: //// test1.c int main(){  return 1;...
  • c语言编译预处理命令

    2020-04-07 11:04:50
    c语言用#define 来声明一个宏,宏可以带参数,如: #define PI 3.14 //定义一个宏PI表示3.14 #define CIRCLE_AREA ((x)*(x)*(PI)) //定义宏计算圆的面积 如果一行写不下,可以加入斜杠’\'表示下一行也是宏的声明,...
  • 所以这里的思路就是:【c代码写一个程序,多了不用写就一个main函数就可以】——>【修改编译出程序的text段即修改代码段】——>【ida反汇编接着再反编译成c代码】 这里我用一个用cmd打开calc.exe的shellcode作为...
  • 编译与反编译

    千次阅读 2019-08-11 22:44:02
    代码从预处理,编译,汇编,链接,最终形成文件,C语言作为编译语言,可以准确定义在不同情况下所采取的行动。 程序的执行过程 预处理: 头文件展开,宏替换,去掉注释 test.i 编译: 生成汇编码 词法和语法的检查 ...
  • 反编译

    千次阅读 2018-10-23 22:43:39
    这里可以扩展一下,C语言编译执行的没有争议。java之所以有跨平台性是因为JVM将.class二进制文件解释成机器码,所以有一个误区说java是解释执行的。这在JDK8之前可以这么说,但是JDK8之后JVM中除了解释器还内置了...
  • exe反编译工具

    2012-12-12 13:46:17
    一个的exe 反编译工具。可将exe文件反编译c语言。至于反编译后的代码质量就自己看啦
  • 反编译软件

    2014-09-05 10:11:04
    最好用的反编译工具。c语言 二进制 Decompiler 数据结构 Decompiler 是一个反编译器,用来读取二进制应用程序,反编译他们,推断数据类型和结构化的C源代码排放
  • 反编译与反汇编

    万次阅读 2016-11-17 17:57:25
    反编译是反过来,把EXE反编译成编程源代码,也就是C程序,不过一般反编译大多数都是从机器码反编译为汇编。其他语言的情况基本也是这样的。至于具体要怎么用,这个就看你的目的了。但一般情况下是通过反编译主要是...
  • c语言c#反编译
  • 反编译工具下载

    2019-01-24 14:56:03
    汇编代码反编译C语言代码,代码逻辑是对的,看起来比较像是伪代码,
  • 反编译之混淆

    2018-07-25 13:38:11
    C++、C语言一般不能反编译为源代码,只能反编译为asm(汇编)语言,因为C较为底层,编译之后不保留任何元信息,而计算机运行的二进制实际上就代表了汇编指令,所以反编译为汇编是较为简单的。 C#、Java这类高级语言...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 508
精华内容 203
关键字:

c语言反编译

c语言 订阅