可以,给你提示一下,代码远程注入技术  CreateRemoteThread等,
或者如果软件没有加壳可以直接修改资源文件
想办法修改窗口过程函数

解决方案 »

  1.   


    dll完全可以,在原来的基础上再做一个dll就行,可以使用原来的功能或者添加新的功能
      

  2.   

    我看到这个帖子
    我亲手做了这个试验。
    首先创建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秒,但是结果还是一样。已经无力了。不继续研究了。
      

  3.   

    另外,我试过利用
    p->ShowWindow(SW_HIDE);
    隐藏窗口,也确实能成功
    p->SetWindowTextW(L"fff");
    修改窗口标题也能成功,也不会改回去。不好意思,对MFC不是非常了解,希望有大牛出来解答一下。
      

  4.   

    只要你知道他的dll的接口函数,你完全可以修改功能。因为这是模块化开发的必然属性
      

  5.   

    如果是EXE文件的话,确实比较难,远程注入说起来容易,但是稍不注意就会崩溃,但是如果 是DLL的话,就简单得多了,你可以重写一个DLL,对于旧功能直接调用原DLL,然后自己加上新功能就行了。
      

  6.   

    重写得了;用dll注入得有黑客的水准。