热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MessageBoxA提示窗口关闭不了

各位大神,这个问题搞了我一天了:My_send(SOCKETs,constcharFAR*buf,intlen,intflags){intlength0;
各位大神,这个问题搞了我一天了:
My_send(SOCKET s,const char FAR* buf,int len,int flags)
       {int length=0;
    int bh=0;
    string str,ys,zd,yz;  
string::size_type found,found1,found2;
string::size_type fd1,fd2,fd3,fd4,fd5,fd6;
ys="insert into zxyh "; 
                zd="INSERT INTO zdxx";
yz="INSERT INTO jbxx";
str.append(buf,len); 
found=str.find(ys);
                found1=str.find(zd);
found2=str.find(yz);
if(xm.empty()&&(found!=string::npos))
       {sa=str.substr((found+ys.length()),100);
                xm=sa.substr(0,5);
GetsendHook.UnHook();
    length=send(s,buf,len,flags);
GetsendHook.ReHook();
//return length;
   }
   else
       if(found1!=string::npos)
      {sb=str.substr((found1+zd.length()),100);
     '''''''''''''''''''''''''''''''''''''
                                   if(bh==0)
      {MessageBoxA(NULL,"您没有发送信息!","提示",MB_OK);
     }
   GetsendHook.UnHook();
         length=send(s,buf,len,flags);
           GetsendHook.ReHook();
          }
      else
              if(found2!=string::npos)
                 {
                       MessageBoxA(NULL,"您给"+xm+"发了信息!","提示!",MB_OK);//这个提示框弹出后总是关闭不了
                   break;
                }  
   else   //ys,zd,yz都没找到 
      {GetsendHook.UnHook();
   length=send(s,buf,len,flags);
                               GetsendHook.ReHook();
  }
       return length;
       }

6 个解决方案

#1


你的My_send是不是在线程中执行的

#2


引用 1 楼 60 的回复:
你的My_send是不是在线程中执行的

是把DLL注入目标进程,然后hook 目标进程的send函数,第一个MessageBoxA一直没问题,就是这第二个无论是点按钮还是×都关闭不了

#3


求大神帮忙

#4


如果能帮我解决这个问题,我会另外开贴加分

#5


仅供参考:
/*
    Application:    Code Injection in Explorer
    Author:     @_RT
    Compiled on:    Feb 2014
    URL:http://www.codeproject.com/Tips/732044/Code-Injection-2

    We will see the different steps involved to perform a code injection into an already running process.

    Following are the quick steps through the process of injection.
    1.Get the API addresses that you will be calling from the injected code.
    2.Prepare shell code of your function that you want to get executed from the injected process.
    3.Get the process ID of the running process that you wish to inject into by enumerating through the
      list of processes or by finding the process's window (in case it's a GUI application) by class name or title.
    4.Open the process using its Pid with All Access rights.
    5.Allocate different memory spaces in the process that you are going to inject to with desired access
      rights for holding different segments of your shell code.
        Code part (executable instructions)
        Data part (strings, function parameters, etc.)
    6.Write the allocated memories with the respective values (code and data).
    7.Call CreateRemoteThread API and pass to it the start of allocated memory address where you have
      written your shell code from the process we are injecting.
*/

#include 
#pragma comment(lib,"user32.lib")

LPVOID addr;
LPVOID addr2;

BOOL InjectExecutable(DWORD dwPid,LPVOID si,LPVOID pi,int sisize,int pisize)
{
    LPVOID hNewModule;
    HANDLE hProcess;
    CHAR S[]    = { "C:\\Windows\\system32\\notepad.exe" };
    BYTE byt[]  = {0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x01, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x68};
                 //push  0   , push     0, push     0, push     1, push     0, push     0, push     0, push 0xXXXXXXXX
    BYTE byt2[] = {0xE8};//call 0xXXXXXXXX
    BYTE byt3[] = {0x68};//push 0xXXXXXXXX

    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    if (hProcess == NULL)
    {
        return FALSE;
    }

    LPVOID staddr = VirtualAllocEx(hProcess, NULL, sizeof(S), MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, staddr, S, sizeof(S), NULL);
    LPVOID fnaddr = VirtualAllocEx(hProcess, NULL, 4, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, fnaddr, pi, sisize, NULL);
    LPVOID fnaddr2 = VirtualAllocEx(hProcess, NULL, 4, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, fnaddr2, si, pisize, NULL);

    hNewModule = VirtualAllocEx(hProcess, NULL, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (hNewModule == NULL)
    {
        return FALSE;
    }
    LPTHREAD_START_ROUTINE strtaddr = (LPTHREAD_START_ROUTINE)hNewModule;

    WriteProcessMemory(hProcess, hNewModule, byt3, sizeof(byt3), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt3));
    WriteProcessMemory(hProcess, hNewModule, &fnaddr, sizeof(fnaddr), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(fnaddr));                    // push &pi ;lpProcessInformation
    WriteProcessMemory(hProcess, hNewModule, byt3, sizeof(byt3), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt3));
    WriteProcessMemory(hProcess, hNewModule, &fnaddr2, sizeof(fnaddr2), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(fnaddr2));                   // push &si ;lpStartupInfo
    WriteProcessMemory(hProcess, hNewModule, byt, sizeof(byt), NULL);           // push 0 , push 0, push 0, push 1, push 0, push 0, push 0, push 0xXXXXXXXX==&S[0];"C:\\Windows\\system32\\notepad.exe"
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt));                       // lpCurrentDirectory,lpEnvironment,dwCreationFlags,bInheritHandles,lpThreadAttributes,lpProcessAttributes,lpCommandLine,lpApplicationName
    WriteProcessMemory(hProcess, hNewModule, &staddr, sizeof(staddr), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(staddr));
    WriteProcessMemory(hProcess, hNewModule, byt2, sizeof(byt2), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt2));                      // call CreateProcessA
    addr = (LPVOID)((int)addr - ((int)hNewModule + 4));
    WriteProcessMemory(hProcess, hNewModule, &addr, sizeof(addr), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(addr));
    WriteProcessMemory(hProcess, hNewModule, byt, 2, NULL);
    hNewModule = (LPVOID)((int)hNewModule + 2);                                 // push 0 ;DWORD dwExitCode   // exit code for this thread
    WriteProcessMemory(hProcess, hNewModule, byt2, sizeof(byt2), NULL);
    hNewModule = (LPVOID)((int)hNewModule + sizeof(byt2));                      // call ExitThread
    addr2 = (LPVOID)((int)addr2 - ((int)hNewModule + 4));
    WriteProcessMemory(hProcess, hNewModule, &addr2, sizeof(addr2), NULL);

    CreateRemoteThread(hProcess, 0, 0, strtaddr, NULL, 0, NULL);
    return TRUE;
}

int main()
{
    _STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    DWORD dwPid;
    HMODULE ldlib = LoadLibraryA("Kernel32.dll");
    addr = GetProcAddress(ldlib, "CreateProcessA");
    addr2 = GetProcAddress(ldlib, "ExitThread");
    HWND hWnd1=FindWindow(NULL, "Program Manager");
    if (NULL==hWnd1) {
        return 1;
    }
    GetWindowThreadProcessId(hWnd1, &dwPid);

    InjectExecutable(dwPid,&si,&pi,sizeof(si),sizeof(pi));

    return 0;
}


Multiple Threads in the User Interface  http://msdn.microsoft.com/zh-cn/library/ms810439.aspx

WinAPIOverride32 源代码

#6


格式看得好难受,你可以断点进去看看到底发生了什么

推荐阅读
author-avatar
无情泪看红尘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有