рипнул код, в котором имеется функа работы со структурой struct _WIN32_FIND_DATAA FindFileData. на си писать аналог вопрос 2 минут, но хочу решить именно на масме вопрос, т.к. это семпл самой менее объемной функи, а будут встречаться более сложные, в логике которых разбирать будет некогда и реверсить код на высокоуровневый язык, то хотелось бы просто корректно переобъявить все структуры, внести изменения в код и иметь сразу готовый рабочий код, не разбираясь в его полезной нагрузке. оригинал из ида [ASM] FindFileData = _WIN32_FIND_DATAA ptr -254h FileName = byte ptr -114h hFindFile = dword ptr -0Ch var_8 = dword ptr -8 lpString = dword ptr 8 push ebp mov ebp, esp sub esp, 258h push ebx push esi push edi push [ebp+lpString] ; lpString2 mov edi, ds:lstrcpyA lea eax, [ebp+FileName] push eax ; lpString1 call edi ; lstrcpyA push [ebp+lpString] ; lpString call ds:lstrlenA lea ebx, [ebp+eax+FileName] push offset inc_ ; "*.inc" push ebx ; lpString1 call edi ; lstrcpyA lea eax, [ebp+FindFileData] push eax ; lpFindFileData lea eax, [ebp+FileName] push eax ; lpFileName call ds:FindFirstFileA [/ASM] оригинал из хекс-рейз [ASM] void *result; // eax@1 CHAR *v2; // ebx@1 int v3; // eax@1 CHAR FileName[264]; // [sp+150h] [bp-114h]@1 struct _WIN32_FIND_DATAA FindFileData; // [sp+10h] [bp-254h]@1 HANDLE hFindFile; // [sp+258h] [bp-Ch]@1 signed int v7; // [sp+25Ch] [bp-8h]@2 lstrcpyA(FileName, lpString); v3 = lstrlenA(lpString); v2 = &FileName[v3]; lstrcpyA(&FileName[v3], "*.inc"); result = FindFirstFileA(FileName, &FindFileData); [/ASM] поскольку возникала ошибка какая-то при инклуде windows.inc и не хотеслоь из-за одной структуры подключать целый модуль, сразу объявил только структуру [ASM] _WIN32_FIND_DATAA struc ; (sizeof=0x140, standard type) dwFileAttributes dd ? ftCreationTime FILETIME <> ftLastAccessTime FILETIME <> ftLastWriteTime FILETIME <> nFileSizeHigh dd ? nFileSizeLow dd ? dwReserved0 dd ? dwReserved1 dd ? cFileName db 260 dup(?) cAlternateFileName db 14 dup(?) _padding db 2 dup(?) _WIN32_FIND_DATAA ends [/ASM] объявил все как в оригинале: FindFileData = _WIN32_FIND_DATAA ptr -254h ssFileName = byte ptr -114h hFindFile = dword ptr -0Ch var_8 = dword ptr -8 ttlpString = dword ptr 8 в итоге на прологе функции получил 254h буфер с нулями, далее только код объявил далее так: LOCAL FindFileData: _WIN32_FIND_DATAA ssFileName = byte ptr -114h hFindFile = dword ptr -0Ch var_8 = dword ptr -8 ttlpString = dword ptr 8 получаю вот что в дизасме компиленого модуля [ASM] FindFileData= _WIN32_FIND_DATAA ptr -140h lpString= dword ptr 8 push ebp mov ebp, esp add esp, 0FFFFFEC0h push ebp mov ebp, esp sub esp, 258h push ebx push esi push edi push [ebp+lpString] ; lpString2 mov edi, offset lstrcpyA lea eax, [ebp+FindFileData.cFileName] push eax ; lpString1 call edi ; lstrcpyA push [ebp+lpString] ; lpString call lstrlenA lea ebx, [eax+ebp-114h] push offset inc_ ; "*.inc" [/ASM] с переменными распознаными лажа, локал порушила стек, балансировка на 140h не помагла, код из-за лишнего пролога Filename везде стал указывать не на буфер, а на поле записи FindData и т.д. как корректно объявить структуру и\или что вписать на прологе чтобы не трогать код и оставить функционал 1 в 1?
Я когда чего рипал имел 2 версии базы -- одну рабочую, с именами и т.д., а в другой в опциях выставлял не делать имена стековым переменным, т.е. в листинге будут просто смещения, и потом реверсишь первую базу, а скрипты для рипа запускаешь во второй и никаких проблем не будет =)