int make_array(void) { /* эти два адреса известны из IDA */ const int a1 = 0x42cc98, // адрес первого байта массива Array a2 = 0x42d098, // offset = 0x2b898; // смещение на первый байт массива Array в .exe файле - выясняется в hex-editorе const char *progName = "reget.exe", // жертва *outFile = "out.c"; // куда выход складывать будем FILE *out; int inHandle; long f_pos; unsigned char *buffer = NULL; inHandle = _open(progName, _O_BINARY | _O_RDONLY); if (-1 == inHandle) { fprintf(stderr, "Cannot open %s\n", progName); return -1; } f_pos = lseek(inHandle, offset, SEEK_SET); if (f_pos != offset) { fprintf(stderr, "Cannot seek, error=%d\n", errno); close(inHandle); return -2; } buffer = (unsigned char *)malloc(1 + (a2 - a1)); if (a2 - a1 != read(inHandle, buffer, a2 - a1)) { fprintf(stderr, "Cannot read %d bytes from %s\n", a2 - a1, progName); free(buffer); close(inHandle); return -3; } close(inHandle); if (NULL == (out = fopen(outFile, "w"))) { fprintf(stderr, "Cannot create out file %s\n", outFile); free(buffer); return -4; } fprintf(out, "const unsigned char array[] = {\n"); for (f_pos = 0; f_pos < a2 - a1; f_pos++) { fprintf(out, "0x%x%c%c", buffer[f_pos], f_pos != a2 - a1 - 1 ? ',' : ' ', (f_pos & 7) == 7 ? '\n': ' '); } fprintf(out, "\n};\n"); fclose(out); free(buffer); return 0; // success }