//
// //
// Project Name: Track kid -- OllyDbg's plugin //
// Version : 1.20 //
// Author : prince //
// Date : 02-25-2005 //
// E-mail : cracker_prince@163.com //
// //
//
#include <windows.h>
#include <stdio.h>
#include "Plugin.h"
// ===== Globals ======= //
HANDLE g_hModule;
HWND g_hMainWnd;
HHOOK g_hHook;
int g_nIsTracking = 0;
int nError;
// ===================== //
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (DLL_PROCESS_ATTACH == ul_reason_for_call)
{
g_hModule = hModule;
}
return TRUE;
}
void EndTracking()
{
UnhookWindowsHookEx(g_hHook);
g_nIsTracking = 0;
}
extc int _export cdecl ODBG_Plugindata(char shortname[32])
{
strcpy(shortname, "&T prince's TracKid");
return PLUGIN_VERSION;
}
extc int ODBG_Plugininit(int ollydbgversion,HWND hw,ulong *features)
{
g_hMainWnd = hw;
_Addtolist(0 ,0, "prince's TracKit plugin V1.20 (beta)");
_Addtolist(0, -1, "Copyright (C) 2004-2005 prince");
return 0;
}
extc int _export cdecl ODBG_Pluginmenu(int origin, char data[4096], void *item)
{
if (PM_MAIN == origin)
{
strcpy(data, "0 &S Start Tracking, 1 &E End Tracking | 2 &A About Me");
return 1;
}
return 0;
}
void AboutInformation(void)
{
char chAboutInfo[255];
sprintf( chAboutInfo
, "prince's TracKid plugin V1.20 beta/r/n/r/n Coded by prince/r/n/r/nE-mail: cracker_prince@163.com/r/n/r/n QQ: 812937/r/n/r/n Build on 02-25-2005" );
MessageBox(g_hMainWnd, chAboutInfo, "About prince's TracKid", MB_OK | MB_ICONQUESTION);
}
int Save2Log(char *pchKey, DWORD dwEip)
{
FILE *pFile;
char chFileName[128] = {0};
char *pTmp;
pTmp = (char *)_Plugingetvalue(VAL_PROCESSNAME);
memcpy(chFileName, pTmp, 128);
CreateDirectory(".//TracKid Log", NULL);
nError = GetLastError();
char chPath[256] = {0};
sprintf(chPath, ".//TracKid Log//%s.txt", chFileName);
pFile = fopen(chPath, "a+");
nError = GetLastError();
if (NULL == pFile)
{
MessageBox(g_hMainWnd, "Save Log error!", "Sorry", MB_OK);
return -1;
}
else
{
char chText[20] = {0};
sprintf(chText, "%08x -- %s/r/n", dwEip, pchKey);
fputs(chText, pFile);
nError = GetLastError();
if (pchKey[1] == '9')
{
fputs("-------------------------/r/n", pFile);
}
fclose(pFile);
}
return 0;
}
LRESULT CALLBACK GetKeyDown(int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
if (HC_ACTION == nCode)
{
if (lParam & 0x80000000)
{
char chKey[3] = {0};
if (0x77 == wParam)
{
sprintf(chKey, "F8");
}
else if (0x76 == wParam)
{
sprintf(chKey, "F7");
}
else if (0x73 == wParam)
{
sprintf(chKey, "F4");
}
else if (0x78 == wParam)
{
sprintf(chKey, "F9");
}
else
{
return lResult;
}
t_status t_CurStatus;
t_CurStatus = _Getstatus();
t_thread *pt_Thread = (t_thread *)malloc(sizeof(t_thread)); // Memroy 01
if (STAT_STOPPED == t_CurStatus || STAT_RUNNING)
{
int nThreadID = _Plugingetvalue(VAL_MAINTHREADID);
pt_Thread = _Findthread(nThreadID);
}
Save2Log(chKey, pt_Thread->reg.ip);
if (pt_Thread != NULL) // release Memory 01
{
free(pt_Thread);
pt_Thread = NULL;
}
}
}
return lResult;
}
void StartTracking(void)
{
DWORD dwThreadID;
HINSTANCE hInstance;
dwThreadID = _Plugingetvalue(VAL_MAINTHREADID);
hInstance = (HINSTANCE)_Plugingetvalue(VAL_HINST);
g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetKeyDown, hInstance, 0);
nError = GetLastError();
g_nIsTracking = 1;
}
extc void _export cdecl ODBG_Pluginaction(int origin, int action, void *item)
{
if (PM_MAIN == origin)
{
switch (action)
{
case 0: // Start Tracking
{
if (1 == g_nIsTracking)
{
break;
}
char chFileName[128] = {0};
char *pTmp;
pTmp = (char *)_Plugingetvalue(VAL_PROCESSNAME);
memcpy(chFileName, pTmp, 128);
CreateDirectory(".//TracKid Log", NULL);
nError = GetLastError();
char chPath[256] = {0};
sprintf(chPath, ".//TracKid Log//%s.txt", chFileName);
DeleteFile(chPath);
StartTracking();
break;
}
case 1: // End Tracking
{
if (1 == g_nIsTracking)
{
EndTracking();
}
break;
}
case 2: // About Me
{
AboutInformation();
break;
}
}
}
}
extc int _export cdecl ODBG_Pluginclose(void)
{
if (1 == g_nIsTracking)
{
EndTracking();
}
return 0;
}
extc void _export cdecl ODBG_Plugindestroy(void)
{
if (1 == g_nIsTracking)
{
EndTracking();
}
}