替换二进制文件中的字符串

渴望

我正在尝试编写一个* nix程序,该程序将自身复制并替换二进制文件中的字符串。复制过程似乎不起作用。

这是代码:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

#define BUFSIZE 10
#define FILENAME "token"

void findstring(const char *exe, const char* str)
{
    char buf[BUFSIZE];
    int line_num = 1;
    int i = 0, find_result = 0;
    FILE *fp = fopen(exe, "rb");
    if(fp == NULL)
        exit(-1);

    FILE *out = fopen("out", "wb");
    if(out == NULL)
        exit(-1);

    while(fgets(buf, BUFSIZE, fp) != NULL) {
        if((strstr(buf, str)))
        {
            printf("A match found on line: %d\n", line_num);
            printf("\n%s\n", buf);
            find_result++;

            // reverse "token" string in the output
            for(i = 0; i< BUFSIZE; i++)
            {
                if(strstr(&buf[i], "t") != NULL)
                    buf[i] = 'n';
                else if(strstr(&buf[i], "o") != NULL)
                    buf[i] = 'e';
                else if(strstr(&buf[i], "k") != NULL)
                    buf[i] = 'k';
                else if(strstr(&buf[i], "e") != NULL)
                    buf[i] = 'o';
                else if(strstr(&buf[i], "n") != NULL)
                    buf[i] = 't';
            }
        }
        line_num++;

        fputs(buf, out);
    }

    if(find_result == 0) {
        printf("\nSorry, couldn't find a match.\n");
    }

    fclose(fp);
    fclose(out);
}

int main(int argc, char **argv, char **envp)
{
//    argv[1] = FILENAME;

    char buf[1024];
    int fd, rc;

    findstring(argv[0], "token");

    if(argc == 1) {
        printf("\n\n%s [file to read]\n\n", argv[0]);
        exit(1);
    }

    printf("FILENAME macro = %s", FILENAME);

    if(strstr(argv[1], "token") != NULL) {
        printf("\n\nYou may not access '%s'\n\n", argv[1]);
        exit(2);
    }

    fd = open(argv[1], O_RDONLY);
    if(fd == -1) {
        printf("\n\nUnable to open %s\n\n", argv[1]);
        exit(3);
    }

    rc = read(fd, buf, sizeof(buf));

    if(rc == -1) {
        printf("\n\nUnable to read fd %d\n\n", fd);
        exit(4);
    }

    write(1, buf, rc);

    return 0;
}

应该在输出二进制文件(“ nekot”)中反转“令牌”字符串,并使用findstring函数负责执行此任务。还值得注意的是,找到的匹配项数量严格取决于BUFSIZE常数。

这段代码缺少什么?谢谢

克里斯·多德(Chris Dodd)

考虑一下它的作用:

  if(strstr(&buf[i], "t") != NULL)
      buf[i] = 'n';

这将从索引开始搜索缓冲区i,并且如果字符串"t"出现在缓冲区中的任何位置,它将用替换第一个字符n所以如果你的缓冲区有

a string with token inside.

for循环的第一次迭代会将其更改为

n string with token inside.

随着循环的进行,您将得到

nnnnnnnnnnith token inside.

经过10次迭代,最终

nnnnnnnnnnnnnnnekooooooooo.

其他事宜:

  • fgets读取字符串,直到换行符或BUFSIZE-1字符为止可能存在与换行符等效的字节。
  • BUFSIZE无论您读取多少字节,都在扫描字节。
  • fputs将写入第一个NUL字节。如果输入二进制文件中的任何地方都有NUL字节,则缓冲区中NUL之后的内容将丢失。

上面的意思是您可能要使用fread/fwrite而不是fgets/ fputs,并且要仔细检查快照读取或写入的返回值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JAVA - 如何使用正则表达式替换二进制文件 (.exe) 中的字符串

将二进制字符串(ASCII)转换为二进制文件

将大二进制字符串写入二进制文件

将二进制文件读入字符串

在字符串中翻转二进制

从字符串中获取二进制数据

从二进制字符串中获取模式

JavaScript中的二进制到字符串

Python中字符串的二进制移位

从字符串中写入二进制数据

从二进制文件列表中打印包含特定 ascii 字符串的文件

使用外部文件中的二进制数据(utf-8中的字符串)

如何将二进制文件的内容放在c中的字符串中?

使用C ++在二进制文件中搜索字符串

如何从二进制文件中读取以nul结尾的字符串

显示已编译二进制文件中的字符串

什么时候可以在可执行二进制文件中编辑字符串?

如何从已编译的二进制文件(.so)中删除字符串

如何检查二进制文件中是否存在字符串?

二进制文件中ASCII字符串的“ grep”偏移量

在Ruby中以字符串形式读取二进制文件

如何获取大(二进制)文件中字符串的偏移量?

使用 C# 在文件中存储字符串索引的二进制数据

使用二进制模式字符串从文件中删除行

将字符串作为二进制写入/读取到随机访问的文件中

从C中的二进制文件读取字符串时发生访问冲突

关闭程序后如何从二进制文件中读取字符串

二进制到字符串/字符串到二进制

将任何文件转换为二进制字符串并从二进制转换为文件