C 获取程序背后的代码

C 获取程序背后的代码,c,readfile,C,Readfile,我想制作一个程序,分析.exe文件的命令,并对内容做出一些决定。问题在于:我从程序文件夹(也使用C)中的C项目复制了一个.exe。我将其扩展名从.exe更改为.txt,并生成以下代码: #include <stdio.h> #include <stdlib.h> int apare(char a, char s[]) //this function search a character in a string. { printf("merge"); in

我想制作一个程序,分析
.exe
文件的命令,并对内容做出一些决定。问题在于:我从程序文件夹(也使用C)中的C项目复制了一个
.exe
。我将其扩展名从
.exe
更改为
.txt
,并生成以下代码:

#include <stdio.h>
#include <stdlib.h>

int apare(char a, char s[]) //this function search a character in a string.
{
    printf("merge");
    int nr=strlen(s),i;
    for(i=0; i<nr; i++)
    {
        if(a==s[i])
            return 1;
    }
    return 0;
}

int main()
{
    FILE * f=fopen("program in C.txt","r");
    char c,s[10000]="abcedfghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ _-+=.,<>?!@#$%^&*()1234567890{}[];:'";//The characters I want to be printed
    int a=1,k=0;//k is only used to printf "\n" when 1100 characters have been displayed on a line
    while(a)
    {
        c=fgetc(f);//A char is read
        if(c!=EOF)//If no error occurs than display the character if it is present in the string.
        {
            if(apare(c,s))
            {
                printf("%c",c);
                k++;
            }
        }
        else if(ferror) //If an error occurs than read the next char
            c=fgetc(f);
        else  //If EOF than stop reading
            a=0;
        if(k==100)
        {
            k=0;
            printf("\n");
        }
    }
    return 0;
}
#包括
#包括
int apare(char a,char s[])//此函数用于搜索字符串中的字符。
{
printf(“合并”);
int nr=斯特伦(s),i;
对于(i=0;i
我把它的扩展名从.exe改为.txt

这并不是真正的文本。编译后的可执行文件是二进制文件。它们可能同时包含一些英语字母表ASCII范围内的可读字符,具体取决于您读取它们时使用的编码。但这只是巧合


您不能仅通过重命名文件将应用程序反编译为其原始代码。

如果这是Linux/Unix系统,则很可能会有一个手册页解释可执行文件的布局。例如:

man elf
您的系统还可能有一些工具来对可执行文件进行基本分析,您可能会发现这些工具很有帮助:

man objdump
man readelf
也可能有一个C include文件,可能是
#include
,它可能有助于编写程序。但请注意,您已经开始了一项艰巨的任务。如果可执行文件的符号已被删除,则更是如此

下面是一个使用objdump进行反汇编的示例:

# objdump -d moai.2014.10.07
moai.2014.10.07:     file format elf64-x86-64


Disassembly of section .init:

0000000000400e48 <_init>:
  400e48:       48 83 ec 08             sub    $0x8,%rsp
  400e4c:       e8 4b 03 00 00          callq  40119c <call_gmon_start>
  400e51:       e8 da 03 00 00          callq  401230 <frame_dummy>
  400e56:       e8 55 51 00 00          callq  405fb0 <__do_global_ctors_aux>
  400e5b:       48 83 c4 08             add    $0x8,%rsp
  400e5f:       c3                      retq  
     ...
#objdump-d moai.2014.10.07
moai.2014.10.07:文件格式elf64-x86-64
分解.init节:
0000000000 400E48:
400e48:48 83 ec 08子$0x8,%rsp
400e4c:e8 4b 03 00 00呼叫4011C
400e51:e8 da 03 00 00 callq 401230
400e56:e8 55 51 00 00 callq 405fb0
400e5b:48 83 c4 08添加$0x8,%rsp
400e5f:c3 retq
...

<代码> > ItApARE(char a,char s[])…<代码> >你可以格式化你的代码,这样人类就可以阅读它。也许你可以考虑使用<代码> ISPrint()/<代码>来检查可打印的字符……为什么你要把文件重命名为<代码> TXT < /Cord>?@亚历克斯?“我正试图编出一个程序来找出AXE是什么”。听起来你真正想知道的是:反编译。这不是一件小事,通常甚至不完全可能,也不是按照你的想法实现的。阅读更多信息我问了如何反编译,但我的问题被删除了,我自己尝试了…@Alex:“反编译”这正是您在研究此问题时应该在Google上查找的词。尝试从头开始编写自己的反编译程序是……雄心勃勃。@Alex:反编译是雄心勃勃的。您可能希望搜索反编译。虽然编写反编译程序仍然是一项艰巨的任务,但它没有编写反编译工具那么困难ion。如果你还想尝试反编译,Cifuntes Desmation()是一个很好的起点。@thurizas:谢谢你,伙计!这就是我要找的。一个反汇编程序!我所需要的就是获取代码(如果可能的话,在汇编中)@Alex:很高兴能帮上忙。与其从头开始写,不如看看外面的一些框架。Capstone()或BARF()。周围还有其他人,但我对这些框架都有自己的经验。此外,还有商业反汇编程序,IDA Pro是行业标准。在逆向工程SO网站()上,你可能会遇到更多问题。干杯,T。