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

 eXeL@B —› Программирование —› Как перевести Hex в строковый вид
Посл.ответ Сообщение

Ранг: 10.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 января 2016 19:03
· Личное сообщение · #1

Проблема такая:
Например в дампе есть байт "4E" в это буква "N" в кодировке ascii.
При копировании в строке отображается опять буква "N",
а мне надо что бы в edit отображалось как "4E"

Конечная строка выводится с помощью SetDlgItemTextA

P.S.
Букву "N" я только для примера взял.
Нужен универсальный код, чтоб hex*ы любых букв и символов можно было перевести в строковый вид.

И всё это нужно проделать в OLLY, так как есть прога а исходника нет.
Если можно с мнемониками инструкций.
Cпасибо.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 08 января 2016 19:19
· Личное сообщение · #2

В OllyDbg можно редактировать как текстом, так и HEX-значением.




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

Создано: 08 января 2016 19:19
· Личное сообщение · #3

На каком языке-то?

-----
Array[Login..Logout] of Life




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 января 2016 19:43 · Поправил: dosprog
· Личное сообщение · #4

tekton пишет:
Конечная строка выводится с помощью SetDlgItemTextA

user32.wsprintfA





Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 08 января 2016 21:04
· Личное сообщение · #5

tekton пишет:
Если можно с мнемониками инструкций.

Если можно - скомпильте на любой языке одну единственную строчку кода, которая будет переводить hex в строку, потом откройте эту программульку в ollydbg, и посмотрите как оно делается.

Хотя что-то я дохрена прошу ...



Ранг: 10.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 января 2016 21:14 · Поправил: tekton
· Личное сообщение · #6

Надо чтоб на любом клнвертилось.
Это типа кейгена будет.
Там довольно всё просто.
Рег ключь состоит как бы из двух частей.
Первая часть статична, а во второй в виде hex байт записывается имя.
Получается ключь вида WHGDF23652-54454B544F4E
WHGDF23652- Первая часть
Вторая часть 54454B544F4E Это имя в Hex TEKTON
Эта часть потом заносится в реестр и высвечивается в эбауте проги.
Пробовал и инглисш, и русиш... Думаю и другие языковые раскладки тоже подойдут.

dosprog пишет:
user32.wsprintfA

Этой функой клеится строка из двух частей, а в эдит забрасывается SetDlgItemTextA



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 января 2016 21:27 · Поправил: dosprog
· Личное сообщение · #7

tekton пишет:

dosprog пишет:
user32.wsprintfA

Этой функой клеится строка из двух частей


) И пруфы будут?






Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 08 января 2016 21:41 · Поправил: -=AkaBOSS=-
· Личное сообщение · #8

<удалил>




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

Создано: 08 января 2016 21:41 · Поправил: Kindly
· Личное сообщение · #9

tekton пишет:
Надо чтоб на любом клнвертилось.
Это типа кейгена будет.

ну если для кейгена, то для дельфи, например, такой велосипед:

Code:
  1. function HexToStr(hexstr: string): string;
  2. var
  3.    s,p: string;
  4.    i: integer;
  5. begin
  6.    i := 0;
  7.    while i < Length(hexstr) do
  8.    begin
  9.       i := i + 2;
  10.       s := Chr(StrToInt('$' + Copy(hexstr, i - 1, 2)));
  11.       p := p + s;
  12.    end;
  13.    Result := p;
  14. end;


-----
Array[Login..Logout] of Life




Ранг: 10.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 января 2016 21:48 · Поправил: tekton
· Личное сообщение · #10

dosprog пишет:
) И пруфы будут?

Подробно в Лс
Я смотрел как это происходит в кейгене-примере к TMG Ripper Studio 0.03 (TMGRS-EX.EXE)



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 января 2016 21:51 · Поправил: dosprog
· Личное сообщение · #11

tekton пишет:
В Лс


) Тю. Ну глянули бы, чем sprintf() занимается. Как ещё объяснить?..






Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 08 января 2016 21:59
· Личное сообщение · #12

tekton
если кейген твой, и количество символов во второй части фиксированное, то вместо формата %s-%s, можно сделать типа %s-%02X и передавать вторую часть посимвольно (%02X повторять столько раз сколько символов надо передать)




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

Создано: 08 января 2016 23:57 · Поправил: UniSoft
· Личное сообщение · #13

tekton пишет:
Нужен универсальный код, чтоб hex*ы любых букв и символов можно было перевести в строковый вид.

Code:
  1.          pushad
  2.          mov     eax, 4Eh         ; value
  3.          
  4.          sub     esp, 20h
  5.          lea     edx, [esp+20h-1]
  6.          mov     byte ptr [edx], 0
  7. @L1:
  8.          mov     cl, al
  9.          and     cl, 0Fh
  10.          cmp     cl, 0Ah
  11.          jb      short @L2
  12.          add     cl, 7
  13. @L2:
  14.          add     cl, '0'
  15.          dec     edx
  16.          mov     [edx], cl
  17.          shr     eax, 4
  18.          jnz     short @L1
  19.          
  20.          ; теперь edx указывает на строку
  21.          
  22.          add     esp, 20h
  23.          popad

ну или если именно байт нужен, то можно так:
Code:
  1.          mov     eax, 4Eh         ; value
  2.          lea     edx, [esp-20h]       ; dest
  3.          
  4.          mov     ah, al
  5.          shr     al, 4
  6.          cmp     al, 0Ah
  7.          jb      short @f
  8.          add     al, 7
  9. @@:
  10.          add     al, '0'
  11.          
  12.          and     eax, 0FFFh
  13.          cmp     ah, 0Ah
  14.          jb      short @f
  15.          add     ah, 7
  16. @@:
  17.          add     ah, '0'
  18.          
  19.          mov     [edx], eax ; тут edx указывает на строку




Ранг: 10.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 09 января 2016 00:54 · Поправил: tekton
· Личное сообщение · #14

UniSoft Спасибо. Подправил, всё работает

вот код как я вписал (это по первому варианту. Который для строки)
Code:
  1. 0040128D   .  60                PUSHAD
  2. 0040128E   .  8BC1             MOV EAX,ECX ; изночально значение hex находится в ecx
  3. 00401290   .  83EC 20         SUB ESP,20
  4. 00401293   .  8D5424 1F       LEA EDX,DWORD PTR SS:[ESP+1F]
  5. 00401297   .  C602 00         MOV BYTE PTR DS:[EDX],0
  6. 0040129A   >  90              NOP
  7. 0040129B   .  8AC8            MOV CL,AL
  8. 0040129D   .  80E1 0F         AND CL,0F
  9. 004012A0   .  80F9 0A         CMP CL,0A
  10. 004012A3   .  72 03           JB SHORT 004012A8
  11. 004012A5   .  80C1 07         ADD CL,7
  12. 004012A8   >  90              NOP
  13. 004012A9   .  80C1 30         ADD CL,30
  14. 004012AC   .  4A              DEC EDX
  15. 004012AD   .  880A            MOV BYTE PTR DS:[EDX],CL
  16. 004012AF   .  C1E8 04         SHR EAX,4
  17. 004012B2   .75 E6           JNZ SHORT 0040129A
  18. 004012B4   .  83C4 20         ADD ESP,20       ; теперь edx указывает на строку
  19. 004012B7   .  61              POPAD


Код двоичного копирования и вставки
Code:
  1. 60 8B C1 83 EC 20 8D 54 24 1F C6 02 00 90 8A C8 80 E1 0F 80 F9 0A 72 03 80 C1 07 90 80 C1 30 4A
  2. 88 0A C1 E8 04 75 E6 83 C4 20 61





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 09 января 2016 01:13 · Поправил: -=AkaBOSS=-
· Личное сообщение · #15

tekton, я ж дал уже код процедуры
Code:
  1. proc binaryToString uses ecx esi edi, dest:dword, src:dword, cnt:dword
  2.   mov ecx, [cnt]
  3.   mov esi, [src]
  4.   mov edi, [dest]
  5.   .while signed ecx > 0
  6.     lodsb
  7.     rol al, 4
  8.     aam 16
  9.     add ax, '00'
  10.     .if al > '9'
  11.       add al, 7
  12.     .endif
  13.     .if ah > '9'
  14.       add ah, 7
  15.     .endif
  16.     stosw
  17.     dec ecx
  18.   .endw
  19.   ret
  20. endp


первый параметр - адрес буфера под строку
второй - адрес исходных данных
третий - длина исходных данных

если с макросами непонятно, вот код после компиляции:
Code:
  1.   push ebp
  2.   mov ebp, esp
  3.   push ecx
  4.   push esi
  5.   push edi
  6.   mov ecx, [ebp+10]
  7.   mov esi, [ebp+C]
  8.   mov edi, [ebp+8]
  9. L008:
  10.   cmp ecx, 0
  11.   jle L023
  12.   lodsb
  13.   rol al, 4
  14.   aam 10
  15.   add ax, 3030
  16.   cmp al, 39
  17.   jbe L017
  18.   add al, 7
  19. L017:
  20.   cmp ah, 39
  21.   jbe L020
  22.   add ah, 7
  23. L020:
  24.   stosw
  25.   dec ecx
  26.   jmp L008
  27. L023:
  28.   pop edi
  29.   pop esi
  30.   pop ecx
  31.   leave
  32.   ret 0C


в хексе
Code:
  1. 55 89 E5 51 56 57 8B 4D 10 8B 75 0C 8B 7D 08 83 F9 00 7E 1D AC C0 C0 04 D4 10 66 05 30 30 3C 39
  2. 76 02 04 07 80 FC 39 76 03 80 C4 07 66 AB 49 EB DE 5F 5E 59 C9 C2 0C 00




tekton пишет:
UniSoft почти работает.
Но почему то сохраняется строка не правильно.


UniSoft пишет:
add cl, '0'


tekton пишет:
004012A9 . 80C1 00 ADD CL,0


вместо символьной константы '0' (= 0x30) прибавляется тупо 0, потому и не работает



Ранг: 10.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 09 января 2016 01:16
· Личное сообщение · #16

Спасиб, сейчас гляну.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 09 января 2016 01:41 · Поправил: dosprog
· Личное сообщение · #17

Code:
  1. .data
  2. fmt     db '08X',0
  3. out_str db 10 dup(?)
  4. .code
  5.     invoke wsprintf  , offset out_str ,offset fmt , 12345678h



 eXeL@B —› Программирование —› Как перевести Hex в строковый вид
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати