Перехватить вызов API функции GetLocalTime
От: Leha Россия  
Дата: 05.10.06 08:13
Оценка:
Приветсвую всех!

В общем сабж...

Не проблема хук написать (писал для перехвата нажатия мыши)...
Мне надо перехватить вызов GetLocalTime (kernel32.dll) из определенного приложения.

Не могу сооброзить, как сделать.

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

Заранее благодарен.
--
С уважением Алексей.
С уважением Алексей.
Re: Перехватить вызов API функции GetLocalTime
От: SergH Россия  
Дата: 05.10.06 08:19
Оценка:
Здравствуйте, Leha, Вы писали:

L>Приветсвую всех!


L>В общем сабж...


L>Не проблема хук написать (писал для перехвата нажатия мыши)...

L>Мне надо перехватить вызов GetLocalTime (kernel32.dll) из определенного приложения.

L>Не могу сооброзить, как сделать.


L>Подмена функции не канает, т.к. тогда меняет любой вызов,

L>а в нее не передается хендл окна или пид...

Какая ОС? В NT/2000/XP таких проблем нету. Но полюбому, GetCurentProcessId всё ещё работает.
Делай что должно, и будь что будет
Re: Перехватить вызов API функции GetLocalTime
От: Leha Россия  
Дата: 05.10.06 08:33
Оценка:
Или мона как-нить намисать хук на все сообщения от определенного приложения?
Например, чтоб писал в файл имена всех функций, которые вызывает приложение...
С уважением Алексей.
Re[2]: Перехватить вызов API функции GetLocalTime
От: Аноним  
Дата: 05.10.06 09:20
Оценка:
http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/Strace%20NT.shtml
Re[3]: Перехватить вызов API функции GetLocalTime
От: Leha Россия  
Дата: 06.10.06 03:44
Оценка:
Аноним, за линк благодарю...

SergH, ось ХР
С уважением Алексей.
Re[4]: Перехватить вызов API функции GetLocalTime
От: Leha Россия  
Дата: 06.10.06 10:36
Оценка:
Здравствуйте, Leha, Вы писали:

L>Аноним, за линк благодарю...


L>SergH, ось ХР


пробую софтину по линку выше...

написал приложеннице:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GetCurrentThreadId()) + #13#10 + DateTimeToStr(now));
end;

но в логе потом я не вижу вызов функции GetLocalTime...
хотя по ссылке now в исходнике есть этот вызов...
почему так?

второй вопрос:
значит я знаю как писать хук на нажатие мишки правой кнопкой...
там проверяется сообщение, если код WM_ACTION, то далее проверяю, нажати ли правая кнопка и мой код...
так вот, а как отловить сообщение, которое возвращает результат функции GetLocalTime?
С уважением Алексей.
Re: Перехватить вызов API функции GetLocalTime
От: vvotan Россия  
Дата: 06.10.06 15:38
Оценка:
Здравствуйте, Leha, Вы писали:

L>Приветсвую всех!


L>В общем сабж...


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


// tmdll.cpp : Defines the entry point for the DLL application.
//

#include <windows.h>
#include <imagehlp.h>
#include <tlhelp32.h>
#include <time.h>

#pragma data_seg("Shared")
HANDLE hMod=0;
__declspec(allocate("Shared")) SYSTEMTIME g_time;
int (__cdecl*poldGetLocalTime)(void*)=0;
#pragma data_seg()
#pragma comment(linker, "/section:Shared,RWS")

HANDLE hEvent;

#define PSZFUNCNAME "GetLocalTime"
#define PSZDLLNAME "kernel32.dll"
#define LPVFUNC GetLocalTime

int __cdecl myGetLocalTime(LPSYSTEMTIME lps)
{
    poldGetLocalTime(lps);
    if(g_time.wDay!=(WORD)-1) lps->wDay=g_time.wDay;
    if(g_time.wMonth!=(WORD)-1) lps->wMonth=g_time.wMonth;
    if(g_time.wYear!=(WORD)-1) lps->wYear=g_time.wYear;
    if(g_time.wHour!=(WORD)-1) lps->wHour=g_time.wHour;
    if(g_time.wMinute!=(WORD)-1) lps->wMinute=g_time.wMinute;
    if(g_time.wSecond!=(WORD)-1) lps->wSecond=g_time.wSecond;
    return 0;
}

static HMODULE ModuleFromAddress(PVOID pv) {

   MEMORY_BASIC_INFORMATION mbi;
   return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) 
      ? (HMODULE) mbi.AllocationBase : NULL);
}
void ReplaceFun1(PROC pfnCurrent,PROC pfnNew,HMODULE hMod)
{
  DWORD dSize;
  PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
      hMod, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &dSize);

  if (pImportDesc == NULL)
      return;  

  for (; pImportDesc->Name; pImportDesc++)
  {
      PSTR pszModName = (PSTR) ((PBYTE) hMod + pImportDesc->Name);
      if (lstrcmpiA(pszModName, PSZDLLNAME) == 0) break;  
  }

  if (pImportDesc->Name == 0)  return; 

   PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((PBYTE) hMod + pImportDesc->FirstThunk);

   for (; pThunk->u1.Function; pThunk++)
   {
       
    PROC* ppfn = (PROC*) &pThunk->u1.Function; 
    BOOL fFound = (*ppfn == pfnCurrent);

    if (fFound)
    {
        DWORD op;
        int r2=VirtualProtect((void*)(ppfn-6),4096,PAGE_READWRITE,&op);
        if(!r2)
        {
            MessageBox(0,"Cannot change memory protection","Error",MB_ICONERROR);
            return;
        }
        int r3=WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,sizeof(pfnNew), NULL);
        if(!r3)
        {
            MessageBox(0,"Cannot write hook function's address","Error",MB_ICONERROR);
            return;
        }
        return;  
      }
   }
}

void ReplaceFunc(PROC pfnCurrent,PROC pfnNew)
{
   HANDLE h=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
   MODULEENTRY32 me = { sizeof(me) };
   char a[0x40];
   for (BOOL fOk = Module32First(h,&me); fOk; fOk = Module32Next(h,&me))
   {
      if (me.hModule != hMod)
      {
        GetModuleFileName(me.hModule,a,0x40);
        ReplaceFun1(pfnCurrent,pfnNew,me.hModule);
      }
   }
}

__declspec(naked) DWORD ThrProc(LPVOID* param)
{
    __asm{
        retn 4
    }
}

 extern "C" __declspec(dllexport) void StartProcess(LPTSTR pname,LPSYSTEMTIME pST)
{
    //__asm int 3
    memcpy(&g_time,pST,sizeof(SYSTEMTIME));
    STARTUPINFO si;
    memset(&si,0,sizeof(si));
    PROCESS_INFORMATION pi;
    CreateProcess(0,pname,NULL,NULL,0,/*CREATE_SUSPENDED*/0,NULL,NULL,&si,&pi);
    
    PVOID pMem=VirtualAllocEx(pi.hProcess,NULL,4096,MEM_COMMIT|MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE);
    if(!pMem)
    {
        MessageBox(0,"Cannot allocate memory in target process's address space","Error",MB_ICONERROR);
        return;
    }
    int t1=WriteProcessMemory(pi.hProcess,pMem,"tmdll.dll",10,0);
//    int t1=WriteProcessMemory(pi.hProcess,pMem,ThrProc,4,0);
    if(!t1)
    {
        MessageBox(0,"Cannot write to the target process's memory","Error",MB_ICONERROR);
        return;
    }
    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
//    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)pMem;
    HANDLE hThread = CreateRemoteThread(pi.hProcess, NULL, 0, pfnThreadRtn, pMem, 0, NULL);
    if(!hThread)
    {
        MessageBox(0,"Cannot create remote thread","Error",MB_ICONERROR);
        return;
    }
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hThread);
    Sleep(0);
    WaitForSingleObject(hEvent,INFINITE);

}

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    if(ul_reason_for_call==DLL_PROCESS_ATTACH)
    {
        hMod=hModule;
        hEvent=CreateEvent(NULL,1,0,NULL);
        HMODULE hkMod=ModuleFromAddress(LPVFUNC);
    if(!hkMod) MessageBox(0,"Cannot find specified module",0,0);
    //    poldGetLocalTime=(void(__stdcall*)(LPSYSTEMTIME))GetProcAddress(hkMod,PSZFUNCNAME);    
    poldGetLocalTime=(int(__cdecl*)(void*))GetProcAddress(GetModuleHandle("msvcrt.dll"),PSZFUNCNAME);    
    if(!poldGetLocalTime) MessageBox(0,"Cannot find old function",0,0);
        ReplaceFunc((PROC)poldGetLocalTime,(PROC)myGetLocalTime);
        SetEvent(hEvent);        
    }
    
    if(ul_reason_for_call==DLL_PROCESS_DETACH)
    {
        CloseHandle(hEvent);
    }

    return TRUE;
}
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.