// IDB to SIG // IDC Script for IDA Pro v3.84 // written by Quine (quine@blacksun.res.cmu.edu) // visit Quine's IDA Page at http://surf.to/quine_ida #include #define MIN_SIG_LENGTH 0x8 #define ASTR(id, idx) GetArrayElement(AR_STR,id,idx) #define ALONG(id, idx) GetArrayElement(AR_LONG,id,idx) static add_v(pos, arr) { auto i; for (i=0; i<4; i++) { SetArrayString(arr, pos+i, "v"); } } static add_b(pos, len, ea, arr) { auto i; for (i=0; i> 1) ^ 0x8408); } else { crc=crc>>1; } data = data>>1; } length++; }; crc = (~crc) & 0xffff; data = crc; crc = ((crc << 8)&0xffff) | ((data >> 8) & 0xff); return (crc | (length<<16)); } static init_array(name) { auto arr; arr = GetArrayId(name); if (arr!=-1) { DeleteArray(arr); } arr = CreateArray(name); return arr; } static make_func_sig (ea, max, f) { auto i, arr, crc, item_start, ref, item_len, ref0, ref1, var0_start, var1_start, ref_str; auto flags, ref0_off, p_count, r_count, p_arr, r_arr, n_arr, first_bit; if (max32) { crc = crc16(32, arr, max); } else { crc = 0; } writestr(f, form(" %02X %04X %04X", ((crc>>16)&0xffff), (crc&0xffff), max+1)); for (i=0; i>16)&0xffff); i<=max; i++) { if (ASTR(arr,i) == "v") { writestr(f,".."); } else { writestr(f, form("%02X", ALONG(arr,i))); } } writestr(f,"\n"); DeleteArray(arr); DeleteArray(n_arr); DeleteArray(p_arr); DeleteArray(r_arr); } static main () { auto f_addr, f_len, f, pat_name; pat_name = AskFile("*.pat", "Choose where to save the .pat file:"); f=fopen(pat_name,"w"); f_addr = MinEA(); if (f==0) { return; } while ((f_addr=NextFunction(f_addr)) != BADADDR) { if ((GetFlags(f_addr) & FF_NAME) && !(GetFunctionFlags(f_addr) & FUNC_LIB)) { f_len = FindFuncEnd(f_addr) - f_addr - 1; make_func_sig (f_addr, f_len, f); } } writestr(f,"---\n"); fclose(f); return; }