|
用c++如何检测用户的状态,全屏玩游戏、看电影
只要查询active窗口中的子窗口就行了 |
|
用c++如何检测用户的状态,全屏玩游戏、看电影
还有,只要查询active窗口就行了 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
后来想想,这个插件要是写成一个动态库要简单许多 |
|
万能断点后按F9无法看到自己输的注册码 ???
还有,就是user32.dll可能因版本不同,万能断点也不存在了 |
|
万能断点后按F9无法看到自己输的注册码 ???
万能断点并不万能,memcpy在C语言中就是一个inline函数,你到user32.dll里设断点根本没用 |
|
用c++如何检测用户的状态,全屏玩游戏、看电影
还是查询窗口吧,比如暴风影音,它的窗口标题上总有storm的字符串,主窗口可能没有,但窗口中的控件有 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
Addtion.cpp中的代码,我下次再解释吧,今天就说到这 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
if (!WriteProcessMemory(hProcess,(LPVOID)MyGetProcAddress,LocalGetProcAddress,7,&dwWrite)) { MessageBox(NULL,"无法注入内存3","",MB_OK); return; } 挂接 GetProcAddress |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
if (!WriteProcessMemory(hProcess,(LPVOID)dwProcAddrEntry,HookGetProcAddress,0x300,&dwWrite)) { MessageBox(NULL,"无法注入内存2","",MB_OK); return; } 在前面完成要注入的程序的修整后,就可以把程序复制到调试进程中了 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
bRet = SearchAndSet((BYTE *)HookGetProcAddress,0x23456781,(DWORD)OldGetProcAddress - (DWORD)HookGetProcAddress + dwProcAddrEntry); if (!bRet) return; 这是替换成OldGetProcAddress 在调试进程中的地址 bRet = SearchAndSet((BYTE *)RecordCallProc,0x7C80AE40,(DWORD)OldGetProcAddress - (DWORD)HookGetProcAddress + dwProcAddrEntry); if (!bRet) return; 功能同上 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
bRet = SearchAndSet((BYTE *)HookGetProcAddress,0x12345678,(DWORD)pMyAllocMemory + 8); if (!bRet) return; 替换成 pMyAllocMemory + 8 也就是dwExternData[2],初始化为0 它是存放获取的API个数 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
bRet = SearchAndSet((BYTE *)RecordCallProc,0x45678123,(DWORD)lpszStringBuffer); if (!bRet) return; bRet = SearchAndSet((BYTE *)RecordCallProc,0x56781234,(DWORD)lpszStringBuffer + 100); if (!bRet) return; bRet = SearchAndSet((BYTE *)RecordCallProc,0x67812345,(DWORD)lpszStringBuffer + 200); if (!bRet) return; bRet = SearchAndSet((BYTE *)RecordCallProc,0x78123456,(DWORD)lpszStringBuffer + 300); if (!bRet) return; bRet = SearchAndSet((BYTE *)RecordCallProc,0x81234567,(DWORD)lpszStringBuffer + 400); if (!bRet) return; bRet = SearchAndSet((BYTE *)RecordCallProc,0x91234567,(DWORD)lpszStringBuffer + 500); if (!bRet) return; 这个就是替换成字符串的,这里不说了 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
BOOL SearchAndSet(BYTE * pbSearchData,DWORD dwSearchData,DWORD dwSetData) { int i,i1 = 0; for (i = 0;i < 300;i ++,pbSearchData ++) { if (* (DWORD *)pbSearchData == dwSearchData) { i1 = i; * (DWORD *)pbSearchData = dwSetData; } } return i1; } 就是在参数1中搜索指定值(参数2),找到后用参数3替换掉 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
memset(szStringBuffer,0,1000); strcpy(szStringBuffer,"kernel32.dll"); strcpy(szStringBuffer + 100,"CreateFileA"); strcpy(szStringBuffer + 200,"WriteFile"); strcpy(szStringBuffer + 300,"e:\\log_files\\logfile.dat"); strcpy(szStringBuffer + 400,"CloseHandle"); strcpy(szStringBuffer + 500,"SetFilePointer"); if (!WriteProcessMemory(hProcess,lpszStringBuffer,szStringBuffer,1000,&dwWrite)) { MessageBox(NULL,"无法注入内存11","",MB_OK); return; } 初始化这个字符串,是为了给RecordCallProc中使用 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
lpData = (BYTE*)dwExternData; if (!WriteProcessMemory(hProcess,pMyAllocMemory,lpData,sizeof(DWORD) * 100,&dwWrite)) { MessageBox(NULL,"无法注入内存1","",MB_OK); return; } 把初始化的dwExternData[100]复制到调试进程中去(pMyAllocMemory中) |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
dwAddress = dwExternData[5]; 这句中的dwExternData[5] 的来源: dwExternData[5] = (DWORD)VirtualAllocEx(hProcess,NULL,SIZEOF_API_ARRAY * 1000,MEM_COMMIT,PAGE_READWRITE); |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
dwAddress = dwExternData[5]; for (i = 0;i < 1000;i ++) { if (!WriteProcessMemory(hProcess,(LPVOID)dwAddress,HookProc,0x2c,&dwWrite)) { MessageBox(NULL,"无法注入内存","",MB_OK); return; } dwAddress += SIZEOF_API_ARRAY; } 初始化IAT表,支持1000个API,并将修正好的HookProc复制进去(每个API都给一份,方便) |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
* (DWORD *)((DWORD)HookProc + 0x0f) = (DWORD)pMyAllocMemory; 这句是修正HookProc 中的call [pMyAllocMemory];使它变成call dwExternData[0]也就是call RecordCallProc |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
__declspec(naked) void LocalGetProcAddress() { __asm{ jmp [pMyAllocMemory]; nop; } } 同理 //* (DWORD *)((BYTE *)LocalGetProcAddress + 2) = (DWORD)((BYTE *)pMyAllocMemory + 28);就是把jmp [pMyAllocMemory];修正成dwExternData[7] 也就是jmp LocalGetProcAddress1 |
|
发个OD的插件,让大家看看吧,不过有问题(源码)
* (DWORD *)((BYTE *)LocalGetProcAddress + 2) = (DWORD)((BYTE *)pMyAllocMemory + 28); //修正LocalGetProcAddress1中的跳转 //dwExternData[1] = offset HookGetProcAddress //(DWORD)((BYTE *)pMyAllocMemory + 4);就是dwExternData[1]注入到调试进程后的地址 * (DWORD *)((BYTE *)LocalGetProcAddress1 + 3) = (DWORD)((BYTE *)pMyAllocMemory + 4); __declspec(naked) void LocalGetProcAddress1() { __asm{ pop ebp; jmp [pMyAllocMemory]; } } //* (DWORD *)((BYTE *)LocalGetProcAddress1 + 3) = (DWORD)((BYTE *)pMyAllocMemory + 4);就是把jmp [pMyAllocMemory];修正成jmp HookGetProcAddress; |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值