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

 eXeL@B —› Программирование —› Не работает inject dll (исходник прилагается)
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 19 ноября 2012 18:11
· Личное сообщение · #1

Здравствуйте. Пытаюсь реализовать загрузку модуля в процесс "Блокнот" по исходникам MS-REM.
Я переделал модули под Embarcadero Delphi XE2 ,всё запускается но инжекта не происходит.
Работает только внедрение кода напрямую через @Main.
Исходники и откомпилированные файлы:
rghost.ru/41672556



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

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

вот, играйся http://rghost.ru/41675128
з.ы. выложил херь какую-то...



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

Создано: 19 ноября 2012 20:36 · Поправил: CodeMaster
· Личное сообщение · #3

Там косяк был что APIAdvancedHook.dll не переименовал в Project11.dll и забыл Unit13.pas выложить.
А почему мои файлы не работают даже если имя длл Project11.dll?

Ещё у меня когда используешь InjectDllEx и InjectDllExAlt вываливается exception. В отладчике выдает что Imagebase=nil поэтому не работает.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 19 ноября 2012 20:41 · Поправил: SReg
· Личное сообщение · #4

CodeMaster
LoadLibraryW потому что нужно было писать в GetProcAddress или же передавать имя как pansichar



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

Создано: 21 ноября 2012 18:03 · Поправил: CodeMaster
· Личное сообщение · #5

С этим разобрался,работает всё на примере MessageBoxA. Теперь я хочу сохранить в файл протокола на диске названия документов,которые открывает notepad.Но пишется какая-то белиберда:
Code:
  1. library Project11;
  2.  
  3. uses
  4.   System.SysUtils,
  5.   System.Classes,
  6.   Windows,
  7.   Vcl.Dialogs,
  8.   advApiHook in 'advApiHook.pas',
  9.   NativeAPI in 'NativeAPI.pas';
  10.  
  11. type
  12. OldCode = packed record
  13.   One: dword;
  14.   two: word;
  15. end;
  16.   far_jmp = packed record
  17.   PuhsOp: byte;
  18.   PushArg: pointer;
  19.   RetOp: byte;
  20. end;
  21.  
  22. var
  23.  
  24. TrueCreateFileW: function(lpFileName: PWideChar;
  25.                         dwDesiredAccess: DWORD;
  26.                         dwShareMode: DWORD;
  27.                         lpSecurityAttributes: PSecurityAttributes;
  28.                         dwCreationDisposition: DWORD;
  29.                         dwFlagsAndAttributes: DWORD;
  30.                         hTemplateFile: THandle): THandle; stdcall;
  31. JmpCfw, JmpCfa: far_jmp;
  32. OldCfw, OldCfa: OldCode;
  33. CfwAdr, CfaAdr: pointer;
  34.  
  35. function NewCreateFileA(lpFileName: PChar;
  36.                         dwDesiredAccess: DWORD;
  37.                         dwShareMode: DWORD;
  38.                         lpSecurityAttributes: PSecurityAttributes;
  39.                         dwCreationDisposition: DWORD;
  40.                         dwFlagsAndAttributes: DWORD;
  41.                         hTemplateFile: THandle): THandle; stdcall;
  42. var
  43.   file_name: PWideChar;
  44.   hFile,name_len,zapisano: dword;
  45.   Written: SIZE_T;
  46.   spisok:array [0..255] of char;
  47. begin
  48.   name_len := lstrlen(lpFileName) * SizeOf(WideChar) + 2;
  49.   GetMem(file_name, name_len);
  50.   StringToWideChar(lpFileName, file_name, name_len);
  51.   UnhookCode(@TrueCreateFileW);
  52.   hFile := CreateFile('C:\protocol.txt', GENERIC_WRITE,
  53.                            0, nil, OPEN_ALWAYS, 0, 0);
  54.  SetFilePointer(hFile, 0, nil, FILE_END);
  55.  WriteFile(hFile, spisok, Length(file_name), zapisano, nil);
  56.   WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
  57.                    @OldCfw, SizeOf(OldCode), Written);
  58.   result := TrueCreateFileW(file_name, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
  59.               dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  60.   WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
  61.                     @JmpCfw, SizeOf(far_jmp), Written);
  62.   FreeMem(file_name);
  63. end;
  64.  
  65.  
  66. function NewCreateFileW(lpFileName: PWideChar;
  67.                         dwDesiredAccess: DWORD;
  68.                         dwShareMode: DWORD;
  69.                         lpSecurityAttributes: PSecurityAttributes;
  70.                         dwCreationDisposition: DWORD;
  71.                         dwFlagsAndAttributes: DWORD;
  72.                         hTemplateFile: THandle): THandle; stdcall;
  73. var
  74. Written: SIZE_T;
  75. begin
  76.   WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
  77.                     @OldCfw, SizeOf(OldCode), Written);
  78.  
  79. //здесь мониторим открытие файла
  80. //важно: сохраняем код посл. ошибки
  81.  
  82.   result := CreateFileW(lpFileName,
  83.               dwDesiredAccess,
  84.               dwShareMode,
  85.               lpSecurityAttributes,
  86.               dwCreationDisposition,
  87.               dwFlagsAndAttributes,
  88.               hTemplateFile);
  89.  
  90.   WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
  91.                     @JmpCfw, SizeOf(far_jmp), Written);
  92.   result := TrueCreateFileW(lpFileName,
  93.                   dwDesiredAccess,
  94.                   dwShareMode,
  95.                   lpSecurityAttributes,
  96.                   dwCreationDisposition,
  97.                   dwFlagsAndAttributes,
  98.                   hTemplateFile);
  99. UnhookCode(@TrueCreateFileW);
  100. end;
  101.  
  102. {$*.res}
  103.  
  104. begin
  105. ShowMessage('Код DLL загружен в тело процесса');
  106. HookProc('kernel32.dll', 'CreateFileW', @NewCreateFileA,@TrueCreateFileW);
  107. end.


То ли функция не перехватывается,то ли неправильно записывает данные.



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

Создано: 21 ноября 2012 18:41 · Поправил: F_a_u_s_t
· Личное сообщение · #6

CodeMaster
Ваш код это одна сплошная ошибка.
Code:
  1. hFile := CreateFile('C:\protocol.txt', GENERIC_WRITE,0, nil, OPEN_ALWAYS, 0, 0);

1. Где проверка на валидность хендла:
Code:
  1. if hFIle <> INVALID_HANDLE_VALUE then
?
2. Какого уя вообще там делает функция открытия лог файла, а не в DLL_PROCESS_ATTACH с закрытием хендла в DLL_PROCESS_DETACH ?
3. В место CreateFile разве не нужно вызывать TrueCreateFile в detours покрайне мере так, как здесь не знаю, не пользовался.
Add:
И что это за неопределенность:
Code:
  1. NewCreateFileA
  2. NewCreateFileW
  3. HookProc('kernel32.dll', 'CreateFileW', @NewCreateFileA,@TrueCreateFileW);

Если что в блокноте CreateFileW используется.
Ужос, воистину мастер кодер.



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

Создано: 21 ноября 2012 19:17
· Личное сообщение · #7

В оригинале функция TrueCreateFile выглядела так:
Code:
  1. function TrueCreateFileW(lpFileName: PWideChar;
  2.                         dwDesiredAccess: DWORD;
  3.                         dwShareMode: DWORD;
  4.                         lpSecurityAttributes: PSecurityAttributes;
  5.                         dwCreationDisposition: DWORD;
  6.                         dwFlagsAndAttributes: DWORD;
  7.                         hTemplateFile: THandle): THandle; stdcall;
  8. var
  9. Written: SIZE_T;
  10. begin
  11.   WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
  12.                     @OldCfw, SizeOf(OldCode), Written);
  13.  
  14. //здесь мониторим открытие файла
  15. //важно: сохраняем код посл. ошибки
  16.  
  17.   result := CreateFileW(lpFileName,
  18.               dwDesiredAccess,
  19.               dwShareMode,
  20.               lpSecurityAttributes,
  21.               dwCreationDisposition,
  22.               dwFlagsAndAttributes,
  23.               hTemplateFile);
  24.  
  25.   WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
  26.                     @JmpCfw, SizeOf(far_jmp), Written);
  27. end;


Но у нас она в процедуре HookProc должна быть var. Вот я и объединил два разных кода в один общий.
NewCreateFile должна записать лог в файл,передать управление TrueCreateFile,которая в свою очередь возвращает result=CreateFileW ,т.е. оригинальную функцию или если быть точным pointer на неё
Я так это понял.



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 21 ноября 2012 21:41
· Личное сообщение · #8

Что-то подобное недавно попадалось на глаза
https://www.rohitab.com/discuss/topic/39343-dll-injection-variation-by-code-injection-c/



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 21 ноября 2012 23:14 · Поправил: Alchemistry
· Личное сообщение · #9

CodeMaster

Такое будет работать в однопоточном приложении только.

Почему она TrueCreateFile, когда это твой обработчик. Он NewCreateFile.

сделать вот так (а не как в этом наркоманском примере) было не судьба?

Code:
  1. NewCreateFileW(.....);
  2. begin
  3.  
  4. HandleHook();
  5.  
  6. result := TrueCreateFile(....);
  7.  
  8. end;


не?



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

Создано: 26 ноября 2012 18:56
· Личное сообщение · #10

Накодил вот что:
Code:
  1. library Project11;
  2.  
  3. uses
  4.   System.SysUtils,
  5.   System.Classes,
  6.   Windows,
  7.   Vcl.Dialogs,
  8.   advApiHook in 'advApiHook.pas',
  9.   NativeAPI in 'NativeAPI.pas';
  10.  
  11. type
  12.   far_jmp = packed record
  13.   PuhsOp: byte;
  14.   PushArg: pointer;
  15.   RetOp: byte;
  16. end;
  17.  
  18. var
  19. TrueCreateFileW: function(lpFileName: PWideChar;
  20.                         dwDesiredAccess: DWORD;
  21.                         dwShareMode: DWORD;
  22.                         lpSecurityAttributes: PSecurityAttributes;
  23.                         dwCreationDisposition: DWORD;
  24.                         dwFlagsAndAttributes: DWORD;
  25.                         hTemplateFile: THandle): THandle; stdcall;
  26. JmpMbw, OldMbw: far_jmp;
  27.  
  28. function NewCreateFileW(lpFileName: PWideChar;
  29.                         dwDesiredAccess: DWORD;
  30.                         dwShareMode: DWORD;
  31.                         lpSecurityAttributes: PSecurityAttributes;
  32.                         dwCreationDisposition: DWORD;
  33.                         dwFlagsAndAttributes: DWORD;
  34.                         hTemplateFile: THandle): THandle; stdcall;
  35. var
  36.   hFile: dword;
  37.  fName: String;
  38.  OldProt,NewProt:DWORD;
  39.   Written: SIZE_T;
  40.   i: Integer;
  41.   file_name: PAnsiChar;
  42.   name_len,zapisano:DWORD;
  43.   namefile:PAnsiChar;
  44.   buff:DWORD;
  45.  
  46. begin
  47.    fName:=WideCharToString(lpFileName);
  48.      WriteProcessMemory(INVALID_HANDLE_VALUE, @TrueCreateFileW,
  49.                    @OldMbw, SizeOf(far_jmp), Written);
  50.    result := TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
  51.               dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  52.   if lpFileName='C:\proverka.txt' then
  53.    begin
  54.   //GetFileSize(lpFileName,@buff);
  55.   ShowMessage(lpFileName);
  56.  WideCharToMultibyte(CP_ACP,0,lpFileName,-1,namefile,0,nil,nil);
  57.    hFile := TrueCreateFileW('C:\protocol.txt', GENERIC_WRITE,
  58.                            0, nil, OPEN_ALWAYS, 0, 0);
  59.  SetFilePointer(hFile, 0, nil, FILE_END);
  60.  ShowMessage(namefile);
  61. WriteFile(hFile, namefile^, Length(namefile^), zapisano, nil);
  62.    end;
  63.      WriteProcessMemory(INVALID_HANDLE_VALUE, @TrueCreateFileW,
  64.                     @JmpMbw, SizeOf(far_jmp), Written);
  65. end;
  66.  
  67. Procedure SetHook();
  68. var
  69. hkernel32:dword;
  70. Bytes:SIZE_T;
  71. OldProt:dword;
  72. begin
  73.   hkernel32:=GetModuleHandle('kernel32.dll');
  74.   TrueCreateFileW:=GetProcAddress(hkernel32,'CreateFileW');
  75.    ReadProcessMemory(INVALID_HANDLE_VALUE, @TrueCreateFileW,
  76.                    @OldMbw, SizeOf(far_jmp), Bytes);
  77.   JmpMbw.PuhsOp:=$68;
  78.   JmpMbw.PushArg:=@NewCreateFileW;
  79.   JmpMbw.RetOp:=$C3;
  80.  
  81.   VirtualProtectEx(INVALID_HANDLE_VALUE,@TrueCreateFileW,SizeOf(far_jmp),PAGE_EXECUTE_READWRITE,@OldProt);
  82.    WriteProcessMemory(INVALID_HANDLE_VALUE, @TrueCreateFileW,
  83.                     @JmpMbw, SizeOf(far_jmp), Bytes);
  84.  end;
  85.  
  86.  
  87. {$*.res}
  88.  
  89. //входная точка DLL
  90. procedure DLLEntryPoint(dwReason:DWORD);
  91. var
  92. file_name: PWideChar;
  93.   name_len,zapisano:DWORD;
  94. begin
  95.   case dwReason of
  96.     DLL_PROCESS_ATTACH:
  97.     begin
  98.        ShowMessage('Загружен код DLL в адресное пространство процесса');
  99.        SetHook();
  100.      end;
  101.     DLL_PROCESS_DETACH:
  102.     begin
  103.       UnhookCode(@TrueCreateFileW);
  104.     end;
  105.   end;
  106. end;
  107. begin
  108. DllProc:=@DLLEntryPoint;
  109. DLLEntryPoint(DLL_PROCESS_ATTACH);
  110. end.


Перехват работает,но имена файлов в лог не пишутся. И ещё я не пойму как определить размер открываемого файла, нужно вызывать функцию определения хэндла для lpFileName ?
Или забить вообще на CreateFileW и перехватывать NtCreateFile?



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

Создано: 26 ноября 2012 23:24
· Личное сообщение · #11

CodeMaster
CloseHandle кто делать будет? С чего ему писаться-то? Второй раз открыть не дает sharing violation, первый раз кеш не сбрасывается. Если и после этого не запишется, отлаживай всё подряд, что возвращает TrueCreateFileW, что WriteFile.

По коду. Использовать WriteProcessMemory для своего процесса - зачем? Использовать VirtualProtectEx для своего процесса - опять же зачем?
ВиртуалПротект надо отменять после записи, да и ставить EXECUTE_READWRITE - не очень хорошая идея.

Главное: этот код не потокобезопасен.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 27 ноября 2012 02:36 · Поправил: ajax
· Личное сообщение · #12

кг/ам. когда-то хотел эти сырки переписать под XE+, но проблем больше, чем с нуля кодить
правка: и траблов вылезало гораздо больше, чем у аффтара топика

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 27 ноября 2012 13:05
· Личное сообщение · #13

CodeMaster
Что то не заметно особых исправлений, как был образец для элитного сайта, так им и остался.
Хз даже что советовать, взять madcodehook или easyhook под delphi есть враппер или тот же afxcodehook.
И что бы кто то помог, не плохо бы указывать где и какая ошибка, а это добавить проверки, в уме не очень компилировать, а delphi под рукой нет, кроме старенькой 2006.



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

Создано: 28 ноября 2012 13:21
· Личное сообщение · #14

С перехватом вроде всё получилось,имена файлов пишет в протокол. Теперь пытаюсь скопировать содержимое перехваченного файла, но копируется файл в 400 раз большего размера и забитый нулями:
Code:
  1. function NewCreateFileW(lpFileName: PWideChar;
  2.                         dwDesiredAccess: DWORD;
  3.                         dwShareMode: DWORD;
  4.                         lpSecurityAttributes: PSecurityAttributes;
  5.                         dwCreationDisposition: DWORD;
  6.                         dwFlagsAndAttributes: DWORD;
  7.                         hTemplateFile: THandle): THandle; stdcall;
  8. var
  9.   hFile1,hFile2: dword;
  10.  OldProt,NewProt:DWORD;
  11.   Written: SIZE_T;
  12.   i: Integer;
  13.   file_name: PAnsiChar;
  14.   name_len,zapisano:DWORD;
  15.   namefile:PAnsiChar;
  16.   buff:DWORD;
  17.   readbuf:PWideChar;
  18.   dlina:integer;
  19.  
  20. begin
  21.     WriteProcessMemory(INVALID_HANDLE_VALUE, @TrueCreateFileW,
  22.                    @OldMbw, SizeOf(far_jmp), Written);
  23.    result := TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
  24.               dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  25.  if lpFileName='C:\proverka.txt' then
  26.    begin
  27. //  ShowMessage(lpFileName);
  28.  hFile1:=TrueCreateFileW(lpFileName,GENERIC_READ,
  29.                            0, nil, OPEN_ALWAYS, 0, 0);
  30.  hFile2:=TrueCreateFileW('C:\test.pak',GENERIC_WRITE,
  31.                            0, nil, OPEN_ALWAYS, 0, 0);
  32.  SetFilePointer(hFile1, 0, nil, FILE_END);
  33.  GetFileSize(hFile1,@buff);
  34.  GetMem(readbuf,buff);
  35.  ReadFile(hFile1,readbuf^,buff,zapisano,nil);
  36.  WriteFile(hFile2,readbuf^,buff,zapisano,nil);
  37. //  dlina:=lstrlenw(lpFileName)+2;
  38. //  GetMem(namefile,dlina);
  39. // WideCharToMultiByte(CP_ACP,0,lpFileName,dlina,namefile,dlina*2,nil,nil);
  40. //   hFile := TrueCreateFileW('C:\protocol.txt', GENERIC_WRITE,
  41. //                           0, nil, OPEN_ALWAYS, 0, 0);
  42. //   SetFilePointer(hFile, 0, nil, FILE_END);
  43. // ShowMessage(namefile);
  44. //WriteFile(hFile, namefile^, Length(namefile), zapisano, nil);
  45. CloseHandle(hFile1);
  46. CloseHandle(hFile2);
  47. FreeMem(readbuf);
  48.   end;
  49.      WriteProcessMemory(INVALID_HANDLE_VALUE, @TrueCreateFileW,
  50.                     @JmpMbw, SizeOf(far_jmp), Written);
  51. end;
  52.  


Прошу агрессивно не реагировать на косяки,Delphi изучал на коленке.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 28 ноября 2012 13:33
· Личное сообщение · #15

CodeMaster

Причем тут дельфе если ты не знаешь даже элементарных основ, а уже поперся в какие-то перехваты, т.е. изменение работы тех самых основ, о которых ты не имеешь, судя по всему, никакого представления.

Ты даже не знаешь, что переменные могут быть неинициализованны (прям как у тебя), и что GetFileSize в втором параметре это указатель на переменную, в которой возвращается старшее слово размера файла. У тебя что файл больше 4Gb? Тут же следом в пофигмоде у тебя какой-то паскалевский GetMem с этой переменной. В этой мерзости, что является твоим кодом, даже разбираться то лень.



Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2012 13:53
· Личное сообщение · #16

F_a_u_s_t tomac ajax Alchemistry
покажите как правильно и потокобезопасно на примере блокнота



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

Создано: 28 ноября 2012 14:03
· Личное сообщение · #17

Ну эту "мерзость" я собирал из форумов по Дельфи,там что по вашему одни идиоты сидят?
Укажите в каком месте ошибка и правильный ли сам алгоритм:
CreateFile1 для чтения
CreateFile2 для записи
SetFilePointer для 1 файла
GetMem - выделяем буфер в памяти для чтения
ReadFile1
WriteFile2
CloseHandle()
FreeMem



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

Создано: 28 ноября 2012 14:06
· Личное сообщение · #18

И ещё я не знаю правильно ли это:
Code:
  1.  hFile1:=TrueCreateFileW(lpFileName,GENERIC_READ,
  2.                            0, nil, OPEN_ALWAYS, 0, 0);

У нас хэндл перехватываемого файла задан не ясно,а через lpFileName. Т.е к примеру чтобы копировались все файл,какие открывает блокнот в течении своей работы



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

Создано: 28 ноября 2012 15:05
· Личное сообщение · #19

Dialog
Как два пальца, ну вы поняли.
Посоны делают так:
Code:
  1. #include "main.h"
  2.  
  3. HANDLE handle_log;
  4.  
  5. static HANDLE (WINAPI *OldFunc) ( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFileA;
  6.  
  7. HANDLE WINAPI NewFunc( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
  8. {
  9.     DWORD written;
  10.     if ( handle_log != INVALID_HANDLE_VALUE )
  11.     WriteFile(handle_log, lpFileName, strlen(lpFileName), &written, NULL);
  12.     return OldFunc(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  13. }
  14.  
  15.  
  16. BOOL DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
  17. {
  18.     LONG error;
  19.     (void)hinstDLL;
  20.     (void)lpvReserved;
  21.  
  22.     if (DetourIsHelperProcess())
  23.     {
  24.         return TRUE;
  25.     }
  26.  
  27.     if (dwReason == DLL_PROCESS_ATTACH)
  28.     {
  29.         handle_log = OldFunc( "C:\file_open_log.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, 0 );
  30.         DetourRestoreAfterWith();
  31.         DetourTransactionBegin();
  32.         DetourUpdateThread(GetCurrentThread());
  33.  
  34.         DetourAttach(&(PVOID&)OldFunc, NewFunc);
  35.  
  36.         error = DetourTransactionCommit();
  37.  
  38.         if (error == NO_ERROR)
  39.         {
  40.         }
  41.         else
  42.         {
  43.         }
  44.     }
  45.     else if (dwReason == DLL_PROCESS_DETACH)
  46.     {
  47.         if ( handle_log != INVALID_HANDLE_VALUE )
  48.         CloseHandle( handle_log );
  49.         DetourTransactionBegin();
  50.         DetourUpdateThread(GetCurrentThread());
  51.  
  52.         DetourDetach(&(PVOID&)OldFunc, NewFunc);
  53.  
  54.         error = DetourTransactionCommit();
  55.     }
  56.     return TRUE;
  57. }

Писал в браузе, но на вид рабочее.
В том же изи хук практически так же.

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

Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 28 ноября 2012 15:54
· Личное сообщение · #20

Dialog пишет:
покажите как правильно и потокобезопасно на примере блокнота


Вот целая статья, с примерами Detours и даже внимание, классического сплайсинга.
http://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours

CodeMaster

Начнем с того, что блокнот никогда не держит файл открытым, а читает он его через проекцию и точно также записывает обратно изменения.

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

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

Создано: 28 ноября 2012 18:06
· Личное сообщение · #21

Да уж толстее троллинга не придумаешь,обосрать всех и выложить ссылку на другом языке программирования. Нах мне ваши примеры,если я свой код разрабатываю на основе совсем других сорцев?
Перехват + инжект у меня работает замечательно, задача перехватить открытый Блокнотом файл и скопировать его на диск.
Доработанный мною упрощенный вариант кода правильно определяет размер файла,создает его но там одни нули:
Code:
  1. hFile1:=TrueCreateFileW('C:\proverka.txt',GENERIC_READ,
  2.                            0, nil, OPEN_ALWAYS, 0, 0);
  3.  hFile2:=TrueCreateFileW('C:\test.pak',GENERIC_WRITE,
  4.                            0, nil, OPEN_ALWAYS, 0, 0);
  5.  SetFilePointer(hFile1, 0, nil, FILE_END);
  6.  buff:=GetFileSize(hFile1,nil);
  7.  data:=VirtualAlloc(nil,buff,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
  8.  ReadFile(hFile1,data^,buff,zapisano,nil);
  9.  WriteFile(hFile2,data^,buff,zapisano,nil);
  10. CloseHandle(hFile1);
  11. CloseHandle(hFile2);




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

Создано: 28 ноября 2012 18:51
· Личное сообщение · #22

CodeMaster
Простите мастер падавана, ну все же может изволите сделать одолжение и перечитать мои посты, даже укажу что именно.:
F_a_u_s_t пишет:
1. Где проверка на валидность хендла:

F_a_u_s_t пишет:
2. Какого уя вообще там делает функция открытия лог файла, а не в DLL_PROCESS_ATTACH с закрытием хендла в DLL_PROCESS_DETACH ?

F_a_u_s_t пишет:
взять madcodehook

Вы уж простите великодушно что мне жаль времени описывать основы.
Но madcodehook сполна это компенсирует, в если погуглить то можно найти ломаный компонент или исходники старых версий.



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

Создано: 28 ноября 2012 19:11
· Личное сообщение · #23

F_a_u_s_t
1. Она как то влияет на работу кода? У меня работает и без проверки (в сорцах исходных её не было)
2. Вообще бред какой-то. DLL_PROCESS_ATTACH у нас инициализирует функцию установки хука и управление передается функции NewCreateFile. Верно? Как же будет работать код,если я его засуну после функции хука в раздел DLL_init? Более того,я пробовал так делать и ничего не работает.
Я не пойму вы издеваетесь или правда не понимаете как это работает? Я нуб в кодинге и то уже вроде понял что все операции после хука надо прописывать в тело перехватываемой функции




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 28 ноября 2012 19:11
· Личное сообщение · #24

CodeMaster
Ты сам-то вообще хыть пытался разобрать, что накопи-пастил или просто накидал, попытался это скомпилить и после этого сразу полез на форум жаловаться?
CodeMaster пишет:
SetFilePointer(hFile1, 0, nil, FILE_END);

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



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

Создано: 28 ноября 2012 19:22 · Поправил: CodeMaster
· Личное сообщение · #25

Archer
Что не так? Единственное что приходит на ум,вместо FILE_END надо поставить FILE_BEGIN
Наверно вот так надо сделать:
Code:
  1. SetFilePointer(hFile1, buff, nil, FILE_BEGIN);




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

Создано: 28 ноября 2012 20:05
· Личное сообщение · #26

[рукалицо]
Прочтите пожалуйста по ссылкам маэстро.
[/рукалицо]
Здесь
и
вот здесь
Не смею больше троллить, пишите.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 28 ноября 2012 20:21
· Личное сообщение · #27

CodeMaster

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

Code:
  1. hFile1:=TrueCreateFileW('C:\proverka.txt',GENERIC_READ,
  2.                            0, nil, OPEN_ALWAYS, 0, 0);
  3.  hFile2:=TrueCreateFileW('C:\test.pak',GENERIC_WRITE,
  4.                            0, nil, OPEN_ALWAYS, 0, 0);


интересует набор флагов, используемый вами, в частности dwShareMode, который вы выставили в 0 и dwCreationDisposition который вы выставили в OPEN_ALWAYS.

Я бы дал ссылочку на матчасть, но вы же гуру, а я тролль, и вдобавок матчасть на мсдн о ужас не на дельфе, так что я скромно промолчу.

Еще вот этот кусочек чистой магии тоже интересен (можно и вариант с FILE_BEGIN).
Code:
  1. SetFilePointer(hFile1, 0, nil, FILE_END);


Вы как бэ только что открыли(создали) фаел. И теперь значит мы двигаем маркер. Ок, зачем?



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

Создано: 28 ноября 2012 20:30
· Личное сообщение · #28

Alchemistry пишет:
Вы как бэ только что открыли(создали) фаел. И теперь значит мы двигаем маркер. Ок, зачем?

Я могу вам объяснить задачу:
1. Внедряем длл в процесс Блокнот //сделано
2. Из длл запускаем код перехвата CreateFileW // сделано
3. Новая функция NewCreateFileW выполняет наш код:
3.1 Записывает имя открытого Блокнотом файла в лог // опционально,работает
3.2 Получает размер открытого файла по его хэндлу, устанавливает маркер на требуемое количество байт,выполняет чтение в буфер памяти // в процессе
3.3 Из буфера памяти пишем данные в новый файл на диске // в процессе
3.4 Закрываем хэндлы,освобождаем память,выводим сообщение об успешном завершении операции



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

Создано: 28 ноября 2012 21:55
· Личное сообщение · #29

Ну вот хвала яицам,всё работает в упрощенном виде:
Code:
  1.  buff:=GetFileSize(hFile1,nil);
  2.  SetFilePointer(hFile1, 0, nil, FILE_BEGIN);

когда
Code:
  1. hFile1:=TrueCreateFileW(ЗДЕСЬ ВВЕДЕНО ИМЯ ФАЙЛА В КАВЫЧКАХ,GENERIC_READ,
  2.                            0, nil, OPEN_ALWAYS, 0, 0);

Я не могу понять,как сделать чтобы хэндл перехватываемого файла получить.
Иными словами,представьте что Блокнот открывает зашифрованный файл и расшифровывает его в памяти,а мы его оттуда хотим утащить.



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

Создано: 28 ноября 2012 22:03
· Личное сообщение · #30

CodeMaster
Про ужос выше не пишу.
CodeMaster пишет:
Я не могу понять,как сделать чтобы хэндл перехватываемого файла получить.

Хучить сохранения файла или буффер, ваш кэп.


. 1 . 2 . >>
 eXeL@B —› Программирование —› Не работает inject dll (исходник прилагается)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати