我正在使用
processDatamap_beforeStart(DataHandler $dataHandler)
钩。在一个函数中,我想使用新创建的模块中的实际 Uid,但我只得到类似 NEW58106331753043.15119885 的东西。我知道有一个用于其他钩子的函数,例如substNEWwithIDs[$id]但我没有$id
是否有办法获取实际新创建的 Uid?
以此为例(在Ollydbg调试器中查看) 
第一个PUSH EBP指令是void*f(int32_t n)的开始(idk它返回的内容,只是猜测void*),我知道输入参数n在堆栈中,并且EBP + 8是指向那个变量,我猜它就像int*n =(int*)(uint32_t(EBP)+ 0x08);/*假设EBP是void*和sizeof(EBP)== sizeof(uint32_t)== sizeof(void*)并且+8数学在c ++ uint32_t和x86程序集中相同..*/
我想制作一个钩子,它将检查n是否大于7或小于0,如果是,则将其更改为1.使用ollydbg,直接编写汇编代码,我可以:修补第一个MOV EBP,对JMP的ESP指令SHORT到它后面的INT3指令(我需要7个字节),然后将(未使用的)INT3更改为MOV EBP,ESP JMP LONG 0068BCCD,其中0068BCCD是文件末尾未使用的0x000000000000的

,然后在0068BCCD,我可以编写汇编代码来检查EBP + 8指向的int,并在必要时修改它:
PUSHAD
CMP DWORD PTR SS:[EBP+8],7
JA SHORT Error
CMP DWORD PTR SS:[EBP+8],0
JL SHORT Error
JMP SHORT Finished
Error:
PUSHAD
PUSH OFFSET TheString
CALL Onlink-x86.App::Output
ADD ESP,4
POPAD
MOV DWORD PTR SS:[EBP+8],1
Finished:
POPAD
JMP LONG 00447493
TheString:
"Warning: label assertion failed, but (pretending its 1 and) trying to ignore.."+0x00
Run Code Online (Sandbox Code Playgroud)

哪个(如果我没有搞砸)基本上相当于
void FilterIntAtEBP_8(){
int i=*(int*)(uint32_t(EBP)+8);
if(i>7 || i<0){
Output("Warning: …Run Code Online (Sandbox Code Playgroud) LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
if (wParam == WM_MOUSEMOVE)
{
cout << "X : " << GET_X_LPARAM(lParam) << " Y: " << GET_Y_LPARAM(lParam) << "\n";
}
}
return CallNextHookEx(hMSHook, nCode, wParam, lParam);
}
int _tmain() {
HMODULE hInstance = GetModuleHandle(NULL);
hMSHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, hInstance, NULL);
MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0)) { DispatchMessage(&Msg); }
::ReleaseDC(0, dc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果 = 总是返回错误的坐标,
示例 = X = -1844,Y = 79, …
这是第一个名为hooktry.cpp的程序
#include <iostream>
#include<stdio.h>
using namespace std;
class c1{
int c=2;
public:
int * printadd()
{
int *p=&c;
printf("the address of c is %d\n",p);
return p;
}
void printv()
{
printf("the value is ===%d\n",c);
}
};
int main(int argc, const char * argv[]) {
int *p;
c1 mem;
char c;
p=mem.printadd();
mem.printv();
*p=12;
scanf("%c",&c);
mem.printv();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:c的地址是1606416304
,值是=== 2
同时运行另一个代码hooktry2.cpp
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
// insert code here...
int …Run Code Online (Sandbox Code Playgroud) 我制作了一个DLL,它应该CreateFileW从记事本挂钩,但它崩溃了.经过调试后我发现它导致了HookedCreateFile函数第一行的堆栈溢出:
(它说它导致地址异常错误......)
异常点处的callstack:
我的代码:
typedef HANDLE(WINAPI * CreateFileFn)(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
CreateFileFn oCreateFile = (CreateFileFn)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateFileW");
HANDLE WINAPI HookedCreateFile(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
//std::cout << "Hello!" << std::endl;
return oCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
Run Code Online (Sandbox Code Playgroud)
我使用DetourFunction的是Microsoft Detours:
DetourFunction((PBYTE)oCreateFile, (PBYTE)HookedCreateFile);
Run Code Online (Sandbox Code Playgroud) 为什么在此行上出现此错误?
*(BYTE*)(dwAddr + 5) = 0xC3;
Run Code Online (Sandbox Code Playgroud)
Main.cpp(34):错误C2297:'*':非法,右操作数的类型为'BYTE*'
void PushRetHook(DWORD dwAddr, LPVOID dwNew, int size)
{
DWORD OldProt;
VirtualProtect((void*)dwAddr, size, PAGE_EXECUTE_READWRITE, &OldProt);
memset((void*)(dwAddr), 0x90, size);
*(BYTE*)dwAddr = 0x68;
*(DWORD*)(dwAddr + 1) = (DWORD)dwNew
*(BYTE*)(dwAddr + 5) = 0xC3;
VirtualProtect((void*)(dwAddr), size, OldProt, &OldProt);
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读Windows Hooking和Win32可执行文件的内部(https://en.wikipedia.org/wiki/Hooking#Windows),并看到了这段代码:
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++)
Run Code Online (Sandbox Code Playgroud)
我的C有点生疏,我可能需要刷新(指针总是让我困惑),但我认为这样做的方法是创建一个IMAGE_IMPORT_DESCRIPTOR名为的指针iid.iid指向an IMAGE_IMPORT_DESCRIPTOR,并设置为等于名为的对象pImgImportDesc.所以,在看pImgImportDesc的Name财产,如果没有设置它会去下一个?所以基本上,它正在寻找最后一个?
还有任何书籍或视频的建议,以了解更多关于这样的真正低级别的事情?阅读代码让我感到困惑.
我有这个代码,需要对这些问题进行一些解释:
首次使用"ShellExecHookXample"部分之后的"_TLB"是什么?
我应该如何在Delphi 7中使用此代码并制作独立的exe文件?(我不知道放置代码并调用其方法的适当位置.因为它似乎是一个单元或什么?)
如果可能请为我描述代码.
提前致谢.