- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 Internet Explorer 8(未在保护模式下运行)、Windows 7 x64 上使用 IAT Hooking。该代码也不适用于 WinXP 上的 IE7。我已经获得了指向存储函数地址的位置的指针。我正在添加我的代码片段,以使事情变得简单。
typedef int (WINAPI *_MessageBoxW)(HWND,LPCWSTR,LPCWSTR,UINT);
int WINAPI TestMessageBox(HWND,LPCWSTR,LPCWSTR,UINT);
I 获取Import Address Table和存放MessageBoxW地址的地址。
PIMAGE_THUNK_DATA pThunk = MakePtr(PIMAGE_THUNK_DATA, hMod, pImportDesc->FirstThunk);
PROC *pLocation=(PROC*)&(pThunk->u1.Function);
_MessageBoxW testVar1=&MessageBoxW;
这里 *pLocation 的值与 testVar1 相同,所以我假设我得到了正确的地址
_MessageBoxW testVar2=&TestMessageBox;
现在我使用 VirtualProtect 更改地址 PROC 的权限。完成此操作后,我用新地址覆盖它。
*pLocation=(PROC)testVar2;
我已验证地址已成功更改,尽管如此,我的函数仍未被调用。有什么我想念的吗?我已经粘贴了注入(inject)的dll的全部代码
// injected.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "injected.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
extern "C"{
INJECTED_API LRESULT CALLBACK fninjected(int code,WPARAM wParam,LPARAM lParam)
{
if(gdi32Handle==NULL){
GetBaseAddressOfModulesLoaded(ModuleBaseAddresses);
MessageBox(NULL,L"Press ok to Debug",L"Alert!",MB_OK);//Used for Attching Debugger to IE
PROC* pPROC=(PROC*)GetAddress(ModuleBaseAddresses,"MessageBoxW");
_MessageBoxW ddd=&MessageBoxW;
mbOrig=(_MessageBoxW)*pPROC;
_MessageBoxW mbNew=&AshishMessageBox;
if(ManipulateAddressPointer(pPROC,(PROC)mbNew)){
}else{
MessageBeep(!0x0);
}
//////////////////////////////////////////////////////////////////////////
MessageBoxW(NULL,L"Dummy",L"Heeeeee",MB_OK);
isProcessed=TRUE;
}else{
//A test function Comes Here, to check if the hook has been set or not;
}
//MessageBox(NULL,L"Hello World",L"Test",MB_OK);
return CallNextHookEx(NULL,code,wParam,lParam);
}
}
int GetBaseAddressOfModulesLoaded(std::vector<HMODULE> &MBAddressVect){
int count=0;
size_t bytesRead=sizeof(MEMORY_BASIC_INFORMATION);
MEMORY_BASIC_INFORMATION mbi;
HMODULE hModIter;
wchar_t imageName[1024];
hModIter=GetModuleHandle(NULL);
if(hModIter==NULL){
MessageBox(NULL,L"Failed to get Handle of Current Module",L"Error message",MB_OK);
}else{
MBAddressVect.push_back(hModIter);
}
for(size_t lpAddress=0;bytesRead==sizeof(MEMORY_BASIC_INFORMATION);lpAddress+=mbi.RegionSize){
memset(&mbi,0x00,sizeof(MEMORY_BASIC_INFORMATION));
memset(&imageName,0x00,sizeof(imageName));
bytesRead=VirtualQuery((LPCVOID)lpAddress,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
if(mbi.AllocationBase!=mbi.BaseAddress)continue;
else if(!(mbi.State&MEM_COMMIT))continue;
if(!mbi.BaseAddress)continue;
hModIter=(HMODULE)mbi.BaseAddress;
if(hModIter && GetModuleFileName(hModIter,imageName,1023)>0){
/*
Push all the module handles into the vector
*/
if(!wcsstr(wcslwr(imageName),L"user32.dll")&&!wcsstr(wcslwr(imageName),L"gdi32.dll"))continue;
else{
MessageBox(NULL,imageName,L"Loaded DLL",MB_OK);
gdi32Handle=hModIter;//This is messy
MBAddressVect.push_back(hModIter);
count++;
}
}
}
return count;
}
void* GetAddress(std::vector <HMODULE> BaseAddresses,char *OrignalFunctionName){
PIMAGE_THUNK_DATA pThunk = NULL, pOrigThunk = NULL;
PIMAGE_IMPORT_BY_NAME pAddressOfData = NULL;
for (std::vector<HMODULE>::iterator it = BaseAddresses.begin(); it!=BaseAddresses.end(); ++it) {
HMODULE hMod=*it;
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER)hMod;
if(pDOSHeader->e_magic!=0x5A4D){
MessageBox(NULL,L"Not a Valid DOS Image",L"Error",MB_OK);
return NULL;
}else{
//MessageBox(NULL,L"Valid DOS Image",L"Message",MB_OK);
}
PIMAGE_NT_HEADERS pNTHeader=MakePtr(PIMAGE_NT_HEADERS,pDOSHeader,pDOSHeader->e_lfanew);
if(pNTHeader->Signature!=0x00004550){
MessageBox(NULL,L"Not a Valid NT Image",L"Error",MB_OK);
return NULL;
}else{
//MessageBox(NULL,L"Valid NT Image",L"Error",MB_OK);
}
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr( PIMAGE_IMPORT_DESCRIPTOR, hMod,pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
if(!pImportDesc){
MessageBox(NULL,L"Failed to get Import Descriptors",L"Error",MB_OK);
}else{
//MessageBox(NULL,L"Obtained Import Descriptors",L"Success",MB_OK);
}
while (pImportDesc->FirstThunk){
pThunk = MakePtr(PIMAGE_THUNK_DATA, hMod, pImportDesc->FirstThunk); // updated by loader
pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hMod, pImportDesc->OriginalFirstThunk); // unmodified by loader
while (pOrigThunk->u1.Function){
pAddressOfData = MakePtr(PIMAGE_IMPORT_BY_NAME, hMod, pOrigThunk->u1.AddressOfData);
if (!IsBadReadPtr(pAddressOfData, sizeof(IMAGE_IMPORT_BY_NAME))) {
char* funcName=(char*)pAddressOfData->Name;
if(funcName){
if(strstr(funcName,OrignalFunctionName)){
MessageBox(NULL,L"Found",L"Success",MB_OK);
return(&(pThunk->u1.Function));
}
}
}
pThunk++;
pOrigThunk++;
}
pImportDesc++;
}
}
}
int WINAPI AshishMessageBox(HWND wHandle,LPCWSTR text,LPCWSTR title,UINT type){
return mbOrig(NULL,L"you will always see this",L"No Matter What you try",MB_OK);
}
BOOL AshishExtTextOut(HDC hdc,int X,int Y,UINT fuOptions,const RECT *lprc,LPCWSTR lpString,UINT cbCount,const INT *lpDx){
MessageBox(NULL,lpString,L"Intercepted Text",MB_OK);
return etoOrig(hdc,X,Y,fuOptions,lprc,lpString,cbCount,lpDx);
}
BOOL ManipulateAddressPointer(PROC* pAddress,PROC location){
BOOL rv=FALSE;
if(IsBadWritePtr(pAddress,sizeof(PROC))){
DWORD oldProtect;
if(VirtualProtect(pAddress,sizeof(PROC),PAGE_READWRITE,&oldProtect)){
*pAddress=location;
DWORD test;
if(VirtualProtect(pAddress,sizeof(PROC),oldProtect,&test)){
rv=TRUE;
}
}else{
MessageBox(NULL,L"Fail",L"Error message",MB_OK);
}
}
else{
//MessageBox(NULL,L"Memory Is Writable",L"Error message",MB_OK);
*pAddress=location;
}
return rv;
}
最佳答案
IE7 可能会调用原始的 MessageBoxW
而不会落入您的手中。以下是其中一些:
MessageBoxW
。可以通过 GetProcAddress
获取其地址。MessageBoxW
的地址(在某个变量中),并在以后调用它。因此,如果您在收到其地址后进行修补 - 它将无法正常工作。MessageBoxW
。相反,它可能会从 User32/64.dll 调用另一个较低级别的函数,该函数通常由 MessageBoxW
调用。首先,您应该了解为什么您没有接到电话。运行 IE7,当它显示消息框时 - 通过调试器连接到它,然后执行“全部中断”。然后查看调用堆栈。如果您在某个时候看到 MessageBoxW
- 第 4 种情况不相关。然后看看它是如何调用的。也许您会发现哪个模块(EXE 或 DLL)调用了它,以及如何调用它。
此外,为了避免 1 和 2 - 您应该始终修补以下函数:
加载库A
LoadLibraryW
LoadLibraryExA
LoadLibraryExW
GetProcAddress
关于c - IAT Hook Internet Explorer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10926956/
我创建了一个简单的钩子(Hook),我安装了它 SetWindowsHookEx(WH_CBT, addr, dll, 0); 完成后,我卸载 UnhookWindowsHookEx(0); 然后我可
我正在使用 React Hooks,当我用 mobx 的观察者包装我的组件时,我收到了这个错误。可能是什么问题?是否可以将 mobx 与 React Hooks 一起使用? import classn
我知道这个问题已经被回答过很多次了。我只是找不到解决我的问题的答案,让我相信,我要么是愚蠢的,要么是我的问题没有被解决,因为它比我更愚蠢。除此之外,这是我的问题: 我正在尝试创建一个功能组件,它从 r
我正在使用 React Navigation 的 useNavigation 钩子(Hook): 在 MyComponent.js 中: import { useNavigation } from "
我想在 gitlab 中使用预提交钩子(Hook)。我做的一切都像文档中一样:https://docs.gitlab.com/ce/administration/custom_hooks.html 在
我最近在和一些人谈论我正在编写的程序时听到了“hook”这个词。尽管我从对话中推断出钩子(Hook)是一种函数,但我不确定这个术语到底意味着什么。我搜索了定义,但找不到好的答案。有人可以让我了解这个术
我正在寻找一个在页面创建或页面更改后调用的钩子(Hook),例如“在导航中隐藏页面”、“停用页面”或“移动/删除页面“ 有人知道吗? 谢谢! 最佳答案 这些 Hook 位于 t3lib/class.t
我正在使用钩子(Hook)将新方法添加到 CalEventLocalServiceImpl 中... 我的代码是.. public class MyCalendarLocalServiceImpl e
编译器将所有 SCSS 文件编译为 STANDALONE(无 Rails)项目中的 CSS 后,我需要一个 Compass Hook 。 除了编辑“compiler.rb”(这不是好的解决方案,因为
我“.get”一个请求并像这样处理响应: resp = requests.get('url') resp = resp.text .. # do stuff with resp 阅读包的文档后,我看到
我们想在外部数据库中存储一些关于提交的元信息。在克隆或 checkout 期间,应引用此数据库,我们将元信息复制到克隆的存储库中的文件中。需要数据库而不是仅仅使用文件是为了索引和搜索等...... 我
我有一个 react 钩子(Hook)useDbReadTable,用于从接受tablename和query初始数据的数据库读取数据。它返回一个对象,除了数据库中的数据之外,还包含 isLoading
在下面的代码中,当我调用 _toggleSearch 时,我同时更新 2 个钩子(Hook)。 toggleSearchIsVisible 是一个简单的 bool 值,但是,setActiveFilt
问题 我想在可由用户添加的表单中实现输入字段的键/值对。 参见 animated gif on dynamic fields . 此外,我想在用户提交表单并再次显示页面时显示保存的数据。 参见 ani
当状态处于 Hook 状态时,它可能会变得陈旧并泄漏内存: function App() { const [greeting, setGreeting] = useState("hello");
const shouldHide = useHideOnScroll(); return shouldHide ? null : something useHideOnScroll 行为应该返回更新后
我正在使用 React-native,在其中,我有一个名为 useUser 的自定义 Hook,它使用 Auth.getUserInfro 方法从 AWS Amplify 获取用户信息,并且然后获取返
我正在添加一个 gitolite 更新 Hook 作为 VREF,并且想知道是否有办法将它应用于除 gitolite-admin 之外的所有存储库。 有一个更简单的方法而不是列出我想要应用 Hook
如何使用带有 react-apollo-hooks 的 2 个 graphql 查询,其中第二个查询取决于从第一个查询中检索到的参数? 我尝试使用如下所示的 2 个查询: const [o, setO
我是 hooks 的新手,到目前为止印象还不错,但是,如果我尝试在函数内部使用 hooks,它似乎会提示(无效的 hook 调用。Hooks can only be called inside o
我是一名优秀的程序员,十分优秀!