我成功地将我的 DLL 注入到程序中。但是我想从 ListBox 中获取信息。WM_GETTEXT 不起作用,所以我不得不进行 dll 注入。我收到大量文本,但从所需的控制中我什么也没有。
这是我的代码:
#include <Windows.h>
#include "detours.h"
#include <tchar.h>
#include <stdio.h>
// Function pointer to the original (un-detoured) DrawText API
int (WINAPI * Real_DrawText)(HDC a0, LPCWSTR a1, int a2, LPRECT a3, UINT a4) = DrawTextW;
int (WINAPI * Real_TextOut)(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString) = TextOutW;
void writeToFile(LPCWSTR text)
{
FILE *out;
if (!(out = fopen("C:\\OUTPUT\\out.txt", "a+"))) {
MessageBox (0, TEXT("ERROR FILE"), TEXT("ERROR FILE"), MB_ICONINFORMATION);
return;
}
fwprintf(out, text);
fclose(out);
}
// Our custom version of DrawText
int WINAPI Mine_DrawText(HDC hdc, LPCWSTR text, int nCount, LPRECT lpRect, UINT uOptions)
{
int rv = Real_DrawText(hdc, text, nCount, lpRect, uOptions);
WideCharToMultiByte(CP_ACP, WC_DEFAULTCHAR, text, -1, txt, 0, NULL, NULL);
writeToFile(text);
return rv;
}
int WINAPI Mine_TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString) {
int rv = Real_TextOut(hdc, nXStart, nYStart, lpString, cchString);
writeToFile(lpString);
return rv;
}
// Install the DrawText detour whenever this DLL is loaded into any process...
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox (0, TEXT("From DLL\n"), TEXT("Process Attach"), MB_ICONINFORMATION);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)Real_DrawText, Mine_DrawText); // <- magic
DetourAttach(&(PVOID&)Real_TextOut, Mine_TextOut);
DetourTransactionCommit();
break;
case DLL_PROCESS_DETACH:
MessageBox (0, TEXT("From DLL\n"), TEXT("Process Detach"), MB_ICONINFORMATION);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)Real_DrawText, Mine_DrawText);
DetourTransactionCommit();
break;
}
return TRUE;
}
我的问题是:有什么我想念的吗?我的意思是还有其他方法可以从应用程序中获取文本吗?因为当我做我的研究时,这应该给我程序中的所有文本。
非常感谢您的帮助!