质询大牛,在不给出源代码的情况下。能否添加新功能??? 可以,给你提示一下,代码远程注入技术 CreateRemoteThread等,或者如果软件没有加壳可以直接修改资源文件想办法修改窗口过程函数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 dll完全可以,在原来的基础上再做一个dll就行,可以使用原来的功能或者添加新的功能 我看到这个帖子我亲手做了这个试验。首先创建MFC程序,建立一个全局变量来接收窗口指针static DWORD dwAddr = 0;在函数OnInitDialog里面获取窗口指针dwAddr = (DWORD)this;然后在界面建立一个按钮,事件代码是:CButton * CB = new CButton; CB->Create(L"次奥2",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(50,50,100,100),(CWnd*)dwAddr,124); CButton * CC = new CButton; CC->Create(L"次奥3",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,50,50),this,125);都是可以创建成功的然后在InitInstance事件里面加载一个修改代码的DLL::LoadLibraryW(L"HookDLL.dll");下面是HookDLL的代码DWORD g_dwHookAddr = 0x00221870 - 0x00221000 + 0x1000;声明一个全局Hook地址变量,我是用反汇编跟到函数OnInitDialog里面的函数头,是为了动态获取到这个函数头部的地址在DLL的InitInstance里面写DWORD g_dwWndThisAddr = 0;DWORD g_dwHookAddr = 0x00221870 - 0x00221000 + 0x1000;__declspec(naked) VOID WINAPI HookOninit(){ _asm { MOV g_dwWndThisAddr,ECX PUSH EBP MOV EBP,ESP PUSH -1 MOV EAX,g_dwHookAddr ADD EAX,0x5 JMP EAX }}// 唯一的一个 CHookDLLApp 对象CHookDLLApp theApp;DWORD WINAPI TestThread(){ for (;;) { if ( g_dwWndThisAddr != 0 ) { Sleep(5 * 1000); CWnd * p = (CWnd *)g_dwWndThisAddr; AFX_MANAGE_STATE(AfxGetStaticModuleState()); CButton * b = new CButton; b->Create(L"次奥1",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),p,123); CString str; str.Format(L"%X",g_dwWndThisAddr); AfxMessageBox(str); break; } Sleep(1000); } return 0;}// CHookDLLApp 初始化BOOL CHookDLLApp::InitInstance(){ CWinApp::InitInstance(); HANDLE curProcess = ::GetCurrentProcess(); g_dwHookAddr += (DWORD)GetModuleHandle(L"HookButton.exe"); DWORD dwAddr = (DWORD)HookOninit - g_dwHookAddr - 5; BYTE bJmp = 0xE9; ::WriteProcessMemory(curProcess,(LPVOID)g_dwHookAddr,&bJmp,1,0); ::WriteProcessMemory(curProcess,(LPVOID)(g_dwHookAddr + 1),&dwAddr,4,0); ::CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)TestThread,NULL,NULL,NULL); return TRUE;}我在TestThread线程里面也是利用一样的地址来尝试创建按钮但是得出,当弹窗出来的时候,按钮是存在 的,就是次奥1按钮,确实创建了但是点了确定之后,按钮就消失不见了。这就诡异了。然后我把break改成g_dwWndThisAddr=0.让循环继续,只是不增加按钮了而已。这样按钮确实一直会存在,但是界面会卡死,无法操作。我Sleep5秒的时候,以为是界面还没完全创建完毕就new CButton了,以为不行。所以加了延时5秒,但是结果还是一样。已经无力了。不继续研究了。 另外,我试过利用p->ShowWindow(SW_HIDE);隐藏窗口,也确实能成功p->SetWindowTextW(L"fff");修改窗口标题也能成功,也不会改回去。不好意思,对MFC不是非常了解,希望有大牛出来解答一下。 只要你知道他的dll的接口函数,你完全可以修改功能。因为这是模块化开发的必然属性 如果是EXE文件的话,确实比较难,远程注入说起来容易,但是稍不注意就会崩溃,但是如果 是DLL的话,就简单得多了,你可以重写一个DLL,对于旧功能直接调用原DLL,然后自己加上新功能就行了。 重写得了;用dll注入得有黑客的水准。 vc 调用bcb写的DLL(隐式链接)运行出错 有关连接错误的问题。 如何设置背景色?在VC++ MFC SDI中SetBkColor()是设置文本的背景色,我要...... 在VC中制作小BMP图象 结构边界对齐的问题 CHtmlView实现的浏览器如何选择IE内核? 高手请进~~一个图形旋转的小问题! MFC 多线程 控制进度条的问题 多文档界面,如何在首页显示“起始页”,类似VC2005 如何实现对话框内控件焦点的自动转移 在dll中定义一个类T,如何把+-*/等运算符利用友元函数重载? 三维模拟演练系统一般用什么技术开发
dll完全可以,在原来的基础上再做一个dll就行,可以使用原来的功能或者添加新的功能
我亲手做了这个试验。
首先创建MFC程序,建立一个全局变量来接收窗口指针
static DWORD dwAddr = 0;
在函数OnInitDialog里面获取窗口指针
dwAddr = (DWORD)this;然后在界面建立一个按钮,事件代码是:CButton * CB = new CButton;
CB->Create(L"次奥2",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(50,50,100,100),(CWnd*)dwAddr,124);
CButton * CC = new CButton;
CC->Create(L"次奥3",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,50,50),this,125);都是可以创建成功的然后在InitInstance事件里面加载一个修改代码的DLL
::LoadLibraryW(L"HookDLL.dll");下面是HookDLL的代码DWORD g_dwHookAddr = 0x00221870 - 0x00221000 + 0x1000;声明一个全局Hook地址变量,我是用反汇编跟到函数OnInitDialog里面的函数头,是为了动态获取到这个
函数头部的地址
在DLL的InitInstance里面写
DWORD g_dwWndThisAddr = 0;
DWORD g_dwHookAddr = 0x00221870 - 0x00221000 + 0x1000;
__declspec(naked) VOID WINAPI HookOninit()
{
_asm
{
MOV g_dwWndThisAddr,ECX
PUSH EBP
MOV EBP,ESP
PUSH -1
MOV EAX,g_dwHookAddr
ADD EAX,0x5
JMP EAX
}
}
// 唯一的一个 CHookDLLApp 对象CHookDLLApp theApp;DWORD WINAPI TestThread()
{
for (;;)
{
if ( g_dwWndThisAddr != 0 )
{
Sleep(5 * 1000);
CWnd * p = (CWnd *)g_dwWndThisAddr;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CButton * b = new CButton;
b->Create(L"次奥1",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),p,123);
CString str;
str.Format(L"%X",g_dwWndThisAddr);
AfxMessageBox(str);
break;
}
Sleep(1000);
}
return 0;
}// CHookDLLApp 初始化BOOL CHookDLLApp::InitInstance()
{
CWinApp::InitInstance();
HANDLE curProcess = ::GetCurrentProcess();
g_dwHookAddr += (DWORD)GetModuleHandle(L"HookButton.exe");
DWORD dwAddr = (DWORD)HookOninit - g_dwHookAddr - 5;
BYTE bJmp = 0xE9;
::WriteProcessMemory(curProcess,(LPVOID)g_dwHookAddr,&bJmp,1,0);
::WriteProcessMemory(curProcess,(LPVOID)(g_dwHookAddr + 1),&dwAddr,4,0); ::CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)TestThread,NULL,NULL,NULL); return TRUE;
}我在TestThread线程里面也是利用一样的地址来尝试创建按钮
但是得出,当弹窗出来的时候,按钮是存在 的,就是次奥1按钮,确实创建了
但是点了确定之后,按钮就消失不见了。这就诡异了。
然后我把break改成g_dwWndThisAddr=0.让循环继续,只是不增加按钮了而已。
这样按钮确实一直会存在,但是界面会卡死,无法操作。我Sleep5秒的时候,以为是界面还没完全创建完毕就new CButton了,以为不行。
所以加了延时5秒,但是结果还是一样。已经无力了。不继续研究了。
p->ShowWindow(SW_HIDE);
隐藏窗口,也确实能成功
p->SetWindowTextW(L"fff");
修改窗口标题也能成功,也不会改回去。不好意思,对MFC不是非常了解,希望有大牛出来解答一下。