Русский / Russian English / Английский

Сейчас на форуме: (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Основной форум —› masm rip + FindFileData
Посл.ответ Сообщение


Ранг: 172.2 (ветеран)
Статус: Участник

Создано: 14 сентября 2009 00:45 New!
Цитата · Личное сообщение · #1

рипнул код, в котором имеется функа работы со структурой struct _WIN32_FIND_DATAA FindFileData. на си писать аналог вопрос 2 минут, но хочу решить именно на масме вопрос, т.к. это семпл самой менее объемной функи, а будут встречаться более сложные, в логике которых разбирать будет некогда и реверсить код на высокоуровневый язык, то хотелось бы просто корректно переобъявить все структуры, внести изменения в код и иметь сразу готовый рабочий код, не разбираясь в его полезной нагрузке.

оригинал из ида
Code:
  1. FindFileData    = _WIN32_FIND_DATAA ptr -254h
  2. FileName        = byte ptr -114h
  3. hFindFile       = dword ptr -0Ch
  4. var_8           = dword ptr -8
  5. lpString        = dword ptr  8
  6.  
  7.                 push    ebp
  8.                 mov     ebp, esp
  9.                 sub     esp, 258h
  10.                 push    ebx
  11.                 push    esi
  12.                 push    edi
  13.                 push    [ebp+lpString]  ; lpString2
  14.                 mov     edi, ds:lstrcpyA
  15.                 lea     eax, [ebp+FileName]
  16.                 push    eax             ; lpString1
  17.                 call    edi ; lstrcpyA
  18.                 push    [ebp+lpString]  ; lpString
  19.                 call    ds:lstrlenA
  20.                 lea     ebx, [ebp+eax+FileName]
  21.                 push    offset inc_       ; "*.inc"
  22.                 push    ebx             ; lpString1
  23.                 call    edi ; lstrcpyA
  24.                 lea     eax, [ebp+FindFileData]
  25.                 push    eax             ; lpFindFileData
  26.                 lea     eax, [ebp+FileName]
  27.                 push    eax             ; lpFileName
  28.                 call    ds:FindFirstFileA


оригинал из хекс-рейз
Code:
  1.   void *result; // eax@1
  2.   CHAR *v2; // ebx@1
  3.   int v3; // eax@1
  4.   CHAR FileName[264]; // [sp+150h] [bp-114h]@1
  5.   struct _WIN32_FIND_DATAA FindFileData; // [sp+10h] [bp-254h]@1
  6.   HANDLE hFindFile; // [sp+258h] [bp-Ch]@1
  7.   signed int v7; // [sp+25Ch] [bp-8h]@2
  8.  
  9.   lstrcpyA(FileName, lpString);
  10.   v3 = lstrlenA(lpString);
  11.   v2 = &FileName[v3];
  12.   lstrcpyA(&FileName[v3], "*.inc");
  13.   result = FindFirstFileA(FileName, &FindFileData);


поскольку возникала ошибка какая-то при инклуде windows.inc и не хотеслоь из-за одной структуры подключать целый модуль, сразу объявил только структуру
Code:
  1. _WIN32_FIND_DATAA struc    ; (sizeof=0x140, standard type)
  2. dwFileAttributes dd ?
  3. ftCreationTime    FILETIME <>
  4. ftLastAccessTime FILETIME <>
  5. ftLastWriteTime   FILETIME <>
  6. nFileSizeHigh     dd ?
  7. nFileSizeLow      dd ?
  8. dwReserved0       dd ?
  9. dwReserved1       dd ?
  10. cFileName         db 260 dup(?)
  11. cAlternateFileName db 14 dup(?)
  12. _padding db 2 dup(?)
  13. _WIN32_FIND_DATAA ends


объявил все как в оригинале:
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

получаю вот что в дизасме компиленого модуля
Code:
  1. FindFileData= _WIN32_FIND_DATAA ptr -140h
  2. lpString= dword ptr  8
  3.  
  4. push    ebp
  5. mov     ebp, esp
  6. add     esp, 0FFFFFEC0h
  7. push    ebp
  8. mov     ebp, esp
  9. sub     esp, 258h
  10. push    ebx
  11. push    esi
  12. push    edi
  13. push    [ebp+lpString]  ; lpString2
  14. mov     edi, offset lstrcpyA
  15. lea     eax, [ebp+FindFileData.cFileName]
  16. push    eax             ; lpString1
  17. call    edi ; lstrcpyA
  18. push    [ebp+lpString]  ; lpString
  19. call    lstrlenA
  20. lea     ebx, [eax+ebp-114h]
  21. push    offset inc_       ; "*.inc"

с переменными распознаными лажа, локал порушила стек, балансировка на 140h не помагла, код из-за лишнего пролога Filename везде стал указывать не на буфер, а на поле записи FindData и т.д.

как корректно объявить структуру и\или что вписать на прологе чтобы не трогать код и оставить функционал 1 в 1?

Ранг: 309.8 (мудрец)
Статус: Участник

Создано: 14 сентября 2009 05:07 New!
Цитата · Личное сообщение · #2

> поскольку возникала ошибка какая-то при инклуде windows.inc и не хотеслоь из-за одной структуры подключать целый модуль, сразу объявил только
ничего страшного не будет если и подключишь, оно же ничего не линкует с собой, простые дефайны и структуры.


Ранг: 462.8 (мудрец)
Статус: Участник
Only One!

Создано: 14 сентября 2009 09:06 · Поправил: DaRKSiDE New!
Цитата · Личное сообщение · #3

Если не хочешь подключать windows.inc (хотя тоже не понимаю почему?)
SLV пишет:
ничего страшного не будет если и подключишь, оно же ничего не линкует с собой, простые дефайны и структуры.

SLV прав на все 100%.

то надо было хотя бы просто скопипастить из него структуру к себе в исходник...
Code:
  1. WIN32_FIND_DATA STRUCT
  2.   dwFileAttributes      DWORD      ?
  3.   ftCreationTime        FILETIME <>
  4.   ftLastAccessTime      FILETIME <>
  5.   ftLastWriteTime       FILETIME <>
  6.   nFileSizeHigh         DWORD      ?
  7.   nFileSizeLow          DWORD      ?
  8.   dwReserved0           DWORD      ?
  9.   dwReserved1           DWORD      ?
  10.   cFileName             BYTE MAX_PATH dup(?)
  11.   cAlternate            BYTE 14 dup(?)
  12. WIN32_FIND_DATA ENDS
  13.  
  14. FILETIME STRUCT
  15.   dwLowDateTime     DWORD     ?
  16.   dwHighDateTime    DWORD     ?
  17. FILETIME ENDS


Ранг: 172.2 (ветеран)
Статус: Участник

Создано: 14 сентября 2009 09:12 New!
Цитата · Личное сообщение · #4

если не понятно, по моему посту, то по причине ошибок и для экономии размера выходного бинаря, так и было сделано, только тобой приведеная структура от мною объявленой немного разниться, попробую с твоей проверить через пару часов


Ранг: 462.8 (мудрец)
Статус: Участник
Only One!

Создано: 14 сентября 2009 09:48 New!
Цитата · Личное сообщение · #5

Хм.. забавно, но я присунул эту структуру к себе в исходник и посмотрел под оллей...

Code:
  1. 00401000    55                           PUSH EBP
  2. 00401001    8BEC                       MOV EBP,ESP
  3. 00401003    81C4 C0FEFFFF       ADD ESP,-140


Тот же хрен...

Очень странно что ида выдала -254h Возможно это структура наследованная от стандартной WIN32_FIND_DATA? Даже название отличается - WIN32_FIND_DATAA... или я гоню
Вот нашел описание той структуры что у тебя в дизасме code.snapstream.com/api/bm11/SnapStream.Util.WIN32_FIND_DATAAMembers.html Сравни... может есть различие?


Ранг: 355.4 (мудрец)
Статус: Uploader
5KRT

Создано: 14 сентября 2009 12:37 New!
Цитата · Личное сообщение · #6

Мне больше нравится с tmg ripper'ом работать, чем с идой, когда дело касается рипа.
Быть может стоит попробовать?


Ранг: 462.8 (мудрец)
Статус: Участник
Only One!

Создано: 14 сентября 2009 13:11 New!
Цитата · Личное сообщение · #7

TMG Ripper Studio хорошая весч... жаль дальше не дописывается...
Рипает она достаточно корректно... в большинстве случаев


Ранг: 172.2 (ветеран)
Статус: Участник

Создано: 14 сентября 2009 20:29 New!
Цитата · Личное сообщение · #8

что никто на масме не работал с заданой структурой и чтобы были в функе локальные переменные? прошу ткнуть сорцем уж хоть каким-то рабочим. вот например рабочие, но без локальных переменных
www.wasm.ru/article.php?article=1001031
forum.sources.ru/index.php?showtopic=101954


Ранг: 462.8 (мудрец)
Статус: Участник
Only One!

Создано: 14 сентября 2009 21:09 New!
Цитата · Личное сообщение · #9

Вот глянь...

{ Атач доступен только для участников форума } - ftree.rar
 eXeL@B —› Основной форум —› masm rip + FindFileData

Видеокурс ВЗЛОМ