Аноним, за линк благодарю...
SergH, ось ХР
Здравствуйте, Leha, Вы писали:
L>Аноним, за линк благодарю...
L>SergH, ось ХР
пробую софтину по линку выше...
написал приложеннице:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetCurrentThreadId()) + #13#10 + DateTimeToStr(now));
end;
но в логе потом я не вижу вызов функции
GetLocalTime...
хотя по ссылке now в исходнике есть этот вызов...
почему так?
второй вопрос:
значит я знаю как писать хук на нажатие мишки правой кнопкой...
там проверяется сообщение, если код
WM_ACTION, то далее проверяю, нажати ли правая кнопка и мой код...
так вот, а как отловить сообщение, которое возвращает результат функции
GetLocalTime?
Здравствуйте, 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>>