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

 eXeL@B —› Программирование —› Не выходит до конца скрестить две простые програмки
Посл.ответ Сообщение

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

Создано: 05 января 2016 17:25
· Личное сообщение · #1

В целях изучения ассемблера решил соединить и доработать немного две программы из тутора ARTEAM проверяющую правильность РЕ и пропатчить если версия ядра в заголовке установлена для Vista и выше. Казалось бы ничего сложного, но только в копипастном коде с заменой на свои данные компилируется совсем не то, даже вызов функций получается другой, да еще и код при промотке в Ольке меняется как в защите аспра.
В общем вот сам код:
Code:
  1. .386
  2. .model   flat, stdcall
  3. option   casemap :none
  4.  
  5. include   windows.inc
  6. include   user32.inc
  7. include   kernel32.inc
  8. include   comdlg32.inc
  9. includelib        user32.lib
  10. includelib        kernel32.lib
  11. includelib        comdlg32.lib
  12.  
  13. DlgProc   PROTO       :DWORD,:DWORD,:DWORD,:DWORD
  14. Validate PROTO       :DWORD
  15. Patch       PROTO           :DWORD
  16.  
  17. .data
  18. strFilter         db           "Executable Files (*.exe, *.dll)",0,
  19.                               "*.exe;*.dll",0,"All Files",0,"*.*",0,0
  20. OpenError         db           "Unable to open target file",0
  21. MsgBoxCap         db           "Results",0
  22. Invalid   db             "This is not a valid PE file!!",0
  23. Valid       db                 "This is a valid PE file!!",0
  24. PatchSucc         db           "File Patched Succesful",0
  25. ErrorOpen         db           "Can't Open file",0
  26. PatchBad db             "File wasn't patched((",0
  27. ErrorRead         db           "Cant read file",0
  28. ErrorFile         db           "This isn't PE file",0
  29.  
  30.  
  31.  
  32.  
  33. .data?
  34. ofn               OPENFILENAME         <>
  35. hInstance                 HINSTANCE       ?
  36. hTarget            dd           ?
  37. hMapping          dd           ?
  38. pMapping          dd           ?
  39. RBuffer            dd           ?
  40. BytesRead                 db         ?
  41. BytesWritten      db     ?
  42. TargetName               db       512 dup(?)
  43.  
  44. .const
  45. IDD_MAIN equ           1001
  46. IDC_TARGET        equ       1003
  47. IDC_OPEN equ           1004
  48. IDC_GO    equ           1005
  49. IDC_PATCH         equ         1006
  50. ;ARIcon equ 2001
  51. Sequence db             06h,00h,00h,00h
  52. WBuffer   db             05h,00h,00h,00h
  53. PatchOffset       dd       155h                          
  54. Sequence2         db           00h,00h,00h,06h       
  55. PatchBuf2         db           00h,00h,00h,05h
  56.  
  57. .code
  58. start:
  59.          invoke  GetModuleHandle, NULL
  60.          mov     hInstance, eax
  61.          invoke  DialogBoxParam,hInstance,IDD_MAIN,0,addr DlgProc,0
  62.          invoke  ExitProcess, eax
  63.  
  64. DlgProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  65.          mov     eax,uMsg
  66.          .if eax==WM_COMMAND
  67.                  mov    eax,wParam
  68.                  .if    eax==IDC_OPEN
  69.                         mov ofn.lStructSize,SIZEOF ofn 
  70.                         mov ofn.lpstrFilter,offset strFilter
  71.                         mov ofn.lpstrFile,offset TargetName 
  72.                         mov ofn.nMaxFile,512 
  73.                         mov ofn.Flags,OFN_FILEMUSTEXIST+OFN_PATHMUSTEXIST+\
  74.                                        OFN_LONGNAMES+OFN_EXPLORER+OFN_HIDEREADONLY 
  75.                         invoke GetOpenFileName,addr ofn
  76.                         .if eax==TRUE
  77.                               invoke SetDlgItemText,hWnd,IDC_TARGET,addr TargetName
  78.                               invoke RtlZeroMemory,addr TargetName,512
  79.                         .endif
  80. ;-----------------------------------------------------------------------------------------
  81.                  .elseif eax==IDC_GO
  82.                         invoke GetDlgItemText,hWnd,IDC_TARGET,addr TargetName,512
  83.                         invoke lstrlen,addr TargetName
  84.                         .if eax!=0
  85.                               invoke Validate,addr TargetName
  86.                         .endif
  87.                  .elseif eax==IDC_PATCH
  88.                               invoke Patch ,hWnd
  89.                  .endif
  90.          .elseif eax==WM_CLOSE
  91.                  invoke EndDialog,hWnd,0
  92.          .endif
  93.          xor     eax,eax
  94.          ret
  95. DlgProc endp
  96.  
  97. Validate proc FileName:DWORD
  98.          invoke CreateFile,FileName,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 
  99.          .if eax!=INVALID_HANDLE_VALUE
  100.                  mov hTarget,eax
  101.                  invoke CreateFileMapping,eax,0,PAGE_READONLY,0,0,0 
  102.                  mov hMapping,eax
  103.                  invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0 
  104.                  mov pMapping,eax 
  105.                  .if [eax.IMAGE_DOS_HEADER.e_magic]==IMAGE_DOS_SIGNATURE
  106.                         add eax,[eax.IMAGE_DOS_HEADER.e_lfanew]
  107.                         .if [eax.IMAGE_NT_HEADERS.Signature]==IMAGE_NT_SIGNATURE
  108.                               invoke MessageBox,0,addr Valid,addr MsgBoxCap,MB_ICONASTERISK
  109.                         .endif 
  110.                  .else 
  111.                         invoke MessageBox,0,addr Invalid,addr MsgBoxCap,MB_ICONASTERISK
  112.                  .endif 
  113.                  invoke UnmapViewOfFile,pMapping
  114.                  invoke CloseHandle,hMapping
  115.                  invoke CloseHandle,hTarget
  116.          .else
  117.                  invoke MessageBox,0,addr OpenError,0,0
  118.          .endif
  119.          xor eax,eax
  120.          Ret
  121. Validate EndP
  122.  
  123. Patch proc hWnd:HWND
  124.          invoke GetFileAttributes,addr TargetName
  125.          .if eax!=FILE_ATTRIBUTE_NORMAL
  126.                  invoke SetFileAttributes,addr TargetName,FILE_ATTRIBUTE_NORMAL
  127.          .endif
  128.          invoke CreateFile,addr TargetName,\
  129.                                    GENERIC_READ+GENERIC_WRITE,\
  130.                                    FILE_SHARE_READ+FILE_SHARE_WRITE,\
  131.                                    NULL,\
  132.                                    OPEN_EXISTING,\
  133.                                    FILE_ATTRIBUTE_NORMAL,\
  134.                                    NULL
  135.          .if eax!=INVALID_HANDLE_VALUE
  136.                  mov hTarget,eax
  137.                  
  138.                  invoke SetFilePointer,hTarget,PatchOffset,NULL,FILE_BEGIN
  139.                  invoke ReadFile,hTarget,addr RBuffer,4,addr BytesRead,NULL
  140.                  .if BytesRead==4
  141.                         mov eax,dword ptr [RBuffer]
  142.                         .if eax==dword ptr [Sequence]
  143.                               invoke SetFilePointer,hTarget,PatchOffset,NULL,FILE_BEGIN
  144.                               invoke WriteFile,hTarget,addr WBuffer,1,addr BytesWritten,NULL
  145.                               .if BytesWritten==1
  146.                                    invoke MessageBox,hWnd,addr PatchSucc,addr PatchSucc,MB_OK
  147.                               .else
  148.                                    invoke MessageBox,hWnd, addr PatchBad,addr PatchSucc, MB_OK
  149.                               .endif
  150.                         .elseif eax==dword ptr [WBuffer] 
  151.                               invoke MessageBox,hWnd, addr Valid,addr Valid, MB_OK
  152.                  ; .else
  153.                  ; invoke List,hWnd,addr Version
  154.                         .endif
  155.                  .else
  156.                         invoke MessageBox,hWnd, addr ErrorRead,addr ErrorRead, MB_OK
  157.                  .endif
  158.          .else
  159.                  invoke MessageBox,hWnd, addr ErrorOpen,addr ErrorOpen, MB_OK
  160.          .endif
  161.          invoke CloseHandle,hTarget
  162.          Ret
  163. Patch EndP
  164.  
  165.  
  166.  
  167. end start
  168.  
  169.  

В архиве все исходники + скрины с ольки. Подскажите что делаю неправильно


9510_05.01.2016_EXELAB.rU.tgz - prj.rar




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

Создано: 05 января 2016 20:46 · Поправил: -=AkaBOSS=-
· Личное сообщение · #2

между скринами из ольки по коду разницы вообще не видно.
там где вместо arg.1 видится только dword ptr [ebp+8] - надо нажать ctrl+a, чтобы запустить анализ модуля. после этого я думаю отображение будет совпадать.
shiroko пишет:
меняется как в защите аспра

ой ну не надо вот сравнений пжлст, не к месту же.

Code:
  1. PatchOffset       dd       155h

даже так? пофиг на структуры, все компиляторы одинаковы, да?

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



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

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

-=AkaBOSS=- пишет:
мессаджбоксов на каждый кейс напихано много

это скорее для тестового варианта чтобы определить на каком моменте загвоздка
с patchoffset та же ситуация... пока нацелен на определенный файл... хоть бы с ним заработало




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

Создано: 05 января 2016 23:25 · Поправил: -=AkaBOSS=-
· Личное сообщение · #4

Code:
  1. invoke GetOpenFileName,addr ofn
  2.   .if eax==TRUE
  3.     invoke SetDlgItemText,hWnd,IDC_TARGET,addr TargetName
  4.     invoke RtlZeroMemory,addr TargetName,512   ; !!! полученный путь к файлу зануляется нафиг !!!
  5.   .endif

таким образом, если нажать Patch до того как нажмёшь Go, в процедуре Patch ты обращаешься к пустой строке, и не будет файла для обработки

короч расскажи что и где не получается, а то неясно вообще в чём претензия к коду



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

Создано: 06 января 2016 01:37 · Поправил: shiroko
· Личное сообщение · #5

Все, сделал! Не знаю, где именно крылась опечатка в прилагаемом коде, но вернувшись к своему первоначальному более простому варианту все получилось после недолгих манипуляций с кодом заработало.
Code:
  1. .386
  2. .386
  3. .model   flat, stdcall
  4. option   casemap:none
  5.  
  6. include  windows.inc
  7. include  user32.inc
  8. include  kernel32.inc 
  9. include   comdlg32.inc
  10. includelib user32.lib
  11. includelib kernel32.lib
  12. includelib comdlg32.lib
  13.  
  14. DlgProc   proto       :DWORD,:DWORD,:DWORD,:DWORD
  15. Change     proto         :DWORD
  16.  
  17. .data
  18. strFilter         db               "Executable Files (*.exe, *.dll)",0,
  19.                                        "*.exe; *.dll",0,"All Files",0,"*.*",0,0
  20.  
  21. PatchSucc          db            "File Patched Succesful",0
  22. PatchBad db                  "File wasn't patched((",0
  23.  
  24.  
  25. .data?
  26. hInstance         HINSTANCE               ?
  27. ofn               OPENFILENAME         <>
  28. hTarget   dd                      ?
  29. ReadBuf   dd                      ?
  30. TargetName  dd          512 dup(?)
  31. BytesRead         db                  ?
  32. BytesWrite        db              ?
  33.  
  34. .const
  35. Dialog1   equ           1001
  36. OpenBtn   equ           1002
  37. Edit1       equ               1003
  38. ChangeBtn5        equ       1005
  39. ChangeBtn6        equ    1006
  40. PatchAddr1        dd         150h
  41. Sequence1         db           06h,00h,00h,00h
  42. PatchBuf1         db           05h,00h,00h,00h
  43. PatchAddr2        dd         155h                               
  44. Sequence2         db           00h,00h,00h,06h       
  45. PatchBuf2         db           00h,00h,00h,05h
  46.  
  47. .code
  48. start:
  49. invoke   GetModuleHandle,NULL
  50. mov hInstance, eax
  51. invoke   DialogBoxParam,hInstance,1001,NULL,addr DlgProc,NULL
  52. invoke ExitProcess,eax
  53.  
  54. DlgProc  proc     hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  55.          .if uMsg == WM_COMMAND
  56.                  mov eax,wParam
  57.                  .if eax == OpenBtn
  58.                         mov ofn.lStructSize, SIZEOF ofn
  59.                         mov ofn.lpstrFilter, offset strFilter
  60.                         mov ofn.lpstrFile, offset TargetName
  61.                         mov ofn.nMaxFile,256
  62.                         mov ofn.Flags,OFN_FILEMUSTEXIST+OFN_PATHMUSTEXIST+OFN_LONGNAMES+\
  63.                                           OFN_EXPLORER+OFN_HIDEREADONLY
  64.                         invoke GetOpenFileName,addr ofn
  65.                         .if eax==TRUE
  66.                               
  67.                               invoke SetDlgItemText, hWnd, Edit1, addr TargetName
  68.                         .endif
  69.                  .elseif eax == ChangeBtn5
  70.                         invoke GetDlgItemText,hWnd,Edit1,TargetName,512         
  71.                         invoke lstrlen,addr TargetName
  72.                         .if eax !=0
  73.                               invoke Change,hWnd
  74.                         .endif
  75.                  .endif
  76.          .elseif uMsg ==WM_CLOSE
  77.                  invoke EndDialog,hWnd,0
  78.          .endif
  79.          xor eax,eax
  80.  
  81.          ret
  82. DlgProc endp 
  83.  
  84. Change   proc hWnd:HWND
  85. invoke GetFileAttributes,addr TargetName
  86. .if      eax!=FILE_ATTRIBUTE_NORMAL
  87.                  invoke SetFileAttributes,addr TargetName,FILE_ATTRIBUTE_NORMAL
  88. .endif
  89. invoke CreateFile,addr TargetName,\
  90.                                    GENERIC_READ+GENERIC_WRITE,\
  91.                                    FILE_SHARE_READ+FILE_SHARE_WRITE,\
  92.                                    NULL,\
  93.                                    OPEN_EXISTING,\
  94.                                    FILE_ATTRIBUTE_NORMAL,\
  95.                                    NULL
  96.  
  97. .if eax != INVALID_HANDLE_VALUE
  98.          mov hTarget,eax
  99.          invoke SetFilePointer,hTarget,PatchAddr1,NULL,FILE_BEGIN
  100.          invoke ReadFile, hTarget, addr ReadBuf,4,addr BytesRead,NULL
  101.          .if BytesRead==4
  102.                  mov eax, dword ptr [ReadBuf]
  103.                  .if eax == dword ptr [Sequence1]
  104.                         invoke SetFilePointer,hTarget,PatchAddr1,NULL,FILE_BEGIN
  105.                         invoke WriteFile,hTarget,addr PatchBuf1,4,addr BytesWrite,NULL
  106.                         invoke SetFilePointer,hTarget,PatchAddr2,NULL,FILE_BEGIN
  107.                         invoke WriteFile,hTarget,addr PatchBuf2,4,addr BytesWrite,NULL
  108.                         invoke MessageBox,hWnd,addr PatchSucc,addr PatchSucc,MB_OK
  109.                  .elseif eax == dword ptr [PatchBuf1]
  110.                         invoke MessageBox,hWnd, addr ValidXP, NULL, MB_OK  
  111.                  .endif
  112.          .endif
  113. .endif     
  114.          ret
  115. Change endp
  116.  
  117. end start
  118.  

Правда во время тестирования возникла пара моментов, связанных больше с Олькой, которые порядком озадачили.
1) местами генерировался код, который во время пролистывания скроллом в CPU просто менялся один на другой, о чем я видимо не верно ранее выразился меняется как в защите аспра , тем самым вызвав негодование у -=AkaBOSS=- Это происходит обычно в верхней\нижней части экрана и видимо как-то нарушается последовательность кратности длин определенных команд, что подводит отладчик к двоякому толкованию кода.
2)временами точки останова не хотят ставиться на определенную команду, так как одновременно выделяется сразу несколько строк кодаю Это как-то связанно с сохранениями в UDD или тому есть другое объяснение



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

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

shiroko пишет:
так как одновременно выделяется сразу несколько строк кодаю Это как-то связанно с сохранениями в UDD или тому есть другое объяснение


Ctrl+A





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

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

dosprog Пробовал. Бесполезно.


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


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