Как сие реализовать? Маска типа "EB 00 00 ?? ?? 68 33 C0 ??". Пробовал сам написать, но что-то ужасное выходило (особенно с вопросительными знаками).
что-то типа: Код (Text): UCHAR mask[] = {0xEB, 0x00, 0x00, 0x00, 0x00, 0x68, 0x33, 0xC0, 0x00}; UCHAR skip[] = {0, 0, 0, 1, 1, 0, 0, 0, 1}; int CompareMask(UCHAR *b, int masklen){ for (int i = 0; i < masklen; i++) if ((!skip[i]) && (mask[i] != b[i])) return 0; return 1; }
n0name Нехорошо держать два массива, и функция должна возвращать указатель на найденную последовательность байтов.
А как иначе. Можешь объеденить в один, но USHORT. Памяти столько-же, но код объёмнее и медленнее. Это функция сравнения с маской. Код (Text): UCHAR *SearchMask(UCHAR *data){ UCHAR *ret = data; while (!CompareMask(ret++, 9)) ; return ret; }
n0name А если возьмем маску "EB0000????6833C0??" и вот так поступим? Код (Text): int CompareMask(UCHAR *b, int masklen){ for (int i = 0; i < masklen; i++) { if (mask[i*2] == mask[i*2+1] == '?') continue; if (hex2byte(mask[i*2]) == b[i]) return 0; } return 1; }
Можно так: EB 00 00 ?? ?? 68 33 C0 ?? char code[] = "\xEB\x00\x00\xFF\xFF\x68\x33\xC0\xFF"; void *s = CODEUTIL::SearchCode((HINSTANCE)lpMappedFile, (LPBYTE)code, sizeof(code)-1, (LPBYTE)"111001110"); Остаётся файл мапнуть в память: CreateFile, CreateFileMapping, MapViewOfFile
Спасибо всем, кто помогал. Проблему решил просто - т.к. маска короткая (15 байт, а значащих всего 3), сделал просто что-то типа этого в цикле Код (Text): .if byte ptr [eax] == 68h && byte ptr [eax + 5] == 68h && byte ptr [eax + 10] == 0E8h ;.... .endif