Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.038 c
9-1128772227
X-Disa
2005-10-08 15:50
2006.04.30
Генерация взрывов в delphx (2d)


15-1144645947
Ega23
2006-04-10 09:12
2006.04.30
С Днём рождения! 10 апреля


15-1144603517
DillerXX
2006-04-09 21:25
2006.04.30
Как называется книга?


8-1132910552
avlan
2005-11-25 12:22
2006.04.30
Видео в формате WMV


15-1144441168
NotDesigner
2006-04-08 00:19
2006.04.30
Помогите сделать логотип