Сейчас на форуме: jinoweb, bartolomeo, rmn (+4 невидимых)

 eXeL@B —› Программирование —› Перевод куска с asm на другой язык
Посл.ответ Сообщение

Ранг: 38.1 (посетитель), 4thx
Активность: 0.030
Статус: Участник

Создано: 01 июня 2014 10:05
· Личное сообщение · #1

Привет всем!
Задача перевести кусок кода асм в любой высокоуровневый.. (сейчас использую яву, исторический так сложилось)
в моем случае это кусок кода из алгоритма дешифрования данных (файла лицензии)
в приведенном примере рассчитывается число на которое потом происходит xor и получаем расшифрованый байт

ключевые моменты я прокомментировал, x некое число начиная с 0 (данный код стоит в цикле) т.е. x меняется .. возможно еще что-то упустил. Буду рад реализации данного кода на любом языке

Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 0049F4F2      8BC0          MOV EAX,EAX
  4. 0049F4F4  /$  55            PUSH EBP
  5. 0049F4F5  |.  8BEC          MOV EBP,ESP
  6. 0049F4F7  |.  83C4 F8       ADD ESP,-8
  7. 0049F4FA  |.  8945 FC       MOV DWORD PTR [LOCAL.1],EAX
  8. 0049F4FD  |.  8B45 FC       MOV EAX,DWORD PTR [LOCAL.1]
  9. 0049F500  |.  8B40 08       MOV EAX,DWORD PTR [EAX+8]
  10. 0049F503  |.  8B55 FC       MOV EDX,DWORD PTR [LOCAL.1]
  11. 0049F506  |.  2342 12       AND EAX,DWORD PTR [EDX+12]     ; << - x and 8000 0000h
  12. 0049F509  |.  0F9545 FB     SETNZ BYTE PTR [LOCAL.2+3]       ; << - записыаем результат в стек
  13. 0049F50D  |.  8B45 FC       MOV EAX,DWORD PTR [LOCAL.1]
  14. 0049F510  |.  8B40 08       MOV EAX,DWORD PTR [EAX+8]
  15. 0049F513  |.  8B55 FC       MOV EDX,DWORD PTR [LOCAL.1]
  16. 0049F516  |.  2342 16       AND EAX,DWORD PTR [EDX+16]     ;<< - x and 10h
  17. 0049F519  |.  0F9545 FA     SETNZ BYTE PTR [LOCAL.2+2]       ; << результат записываем в стек
  18. 0049F51D  |.  8B45 FC       MOV EAX,DWORD PTR [LOCAL.1]
  19. 0049F520  |.  D160 08       SHL DWORD PTR [EAX+8],1                
  20. 0049F523  |.  8A45 FB       MOV AL,BYTE PTR [LOCAL.2+3]
  21. 0049F526  |.  3A45 FA       CMP AL,BYTE PTR [LOCAL.2+2]       ; << сравниваем результаты
  22. 0049F529  |.  75 09         JNE SHORT AEROoffice51.0049F534
  23. 0049F52B  |.  8B45 FC       MOV EAX,DWORD PTR [LOCAL.1]
  24. 0049F52E  |.  8348 08 01    OR DWORD PTR [EAX+8],00000001     ; << x or 01h
  25. 0049F532  |.  EB 07         JMP SHORT AEROoffice51.0049F53B
  26. 0049F534  |>  8B45 FC       MOV EAX,DWORD PTR [LOCAL.1]
  27. 0049F537  |.  8360 08 FE    AND DWORD PTR [EAX+8],FFFFFFFE
  28. 0049F53B  |>  8B45 FC       MOV EAX,DWORD PTR [LOCAL.1]
  29. 0049F53E  |.  8B40 04       MOV EAX,DWORD PTR [EAX+4]
  30. 0049F541  |.  8B55 FC       MOV EDX,DWORD PTR [LOCAL.1]
  31. 0049F544  |.  2142 08       AND DWORD PTR [EDX+8],EAX
  32. 0049F547  |.  59            POP ECX
  33. 0049F548  |.  59            POP ECX
  34. 0049F549  |.  5D            POP EBP
  35. 0049F54A  \.  C3            RET




Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 01 июня 2014 10:37
· Личное сообщение · #2

На си вроде так (делал в уме, не проверял):

void Func(DWORD pdwData[5]) {
DWORD dwTmp = pdwData[2];
pdwData[2] <<= 1;
if ((dwTmp & pdwData[3]) == (dwTmp & pdwData[4])) pdwData[2] |= 1;
pdwData[2] &= pdwData[1];
return;
}



Ранг: 6.4 (гость), 2thx
Активность: 0.020
Статус: Участник

Создано: 01 июня 2014 10:43
· Личное сообщение · #3

Просто вставь рабочий asm код в проект на C++ или Delphi

можно даже masm - https://vazonez.com/forum/topic=380.0




Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 01 июня 2014 11:50 · Поправил: UniSoft
· Личное сообщение · #4

Prober пишет:
На си вроде так (делал в уме, не проверял):

не правильно...

скорее так
Code:
  1. void func(unsigned int *p)
  2. {
  3.     if ( (!!(p[2] & p[3])) == (!!(p[2] & p[4])) )
  4.         p[2] = ((p[2] << 1) | 1) & p[1];
  5.     else
  6.         p[2] = ((p[2] << 1) & ~1) & p[1];
  7. }


| Сообщение посчитали полезным: nevertime

Ранг: 38.1 (посетитель), 4thx
Активность: 0.030
Статус: Участник

Создано: 01 июня 2014 23:34 · Поправил: nevertime
· Личное сообщение · #5

благодарю!

на яве у меня вышло так, успешно расшифровал файлик

Code:
  1.  
  2.  
  3.   if(((& 0x80000000) != 0) == ((& 0x00000010) != 0))
  4.         m = ((<< 1) | 1);
  5.   else
  6.         m =  ((<< 1) & ~1);



 eXeL@B —› Программирование —› Перевод куска с asm на другой язык
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати