首页
社区
课程
招聘
[原创][原创][原创]Windows服务编程以及碰到的问题
发表于: 2014-12-2 18:16 4344

[原创][原创][原创]Windows服务编程以及碰到的问题

2014-12-2 18:16
4344
Windows服务编程以及碰到的问题
lilicao2000@tom.com

我上次写了个远程桌面代理程序但用了没几天就发现那程序如果在代理电脑上的用户注销了的话就被关闭了,所以我决定把那个代理程序改成服务运行然后这个问题就解决了,代码如下:

#include<windows.h>
#include<winsvc.h>
#include"proxymstsc.h"

SERVICE_STATUS      service_status;
SERVICE_STATUS_HANDLE  service_status_handle;

void WINAPI service_ctrl(DWORD opcode);
void WINAPI service_start(DWORD argc,LPTSTR *argv);
DWORD WINAPI mstsc_service(LPVOID lpparam);

void WINAPI service_start(DWORD argc,LPTSTR *argv){
  
  DWORD status;
  DWORD error;
  HANDLE hthread;

  service_status.dwServiceType=SERVICE_WIN32;//|SERVICE_INTERACTIVE_PROCESS;
  service_status.dwCurrentState=SERVICE_START_PENDING;
  service_status.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
  service_status.dwWin32ExitCode=0;
  service_status.dwServiceSpecificExitCode=0;
  service_status.dwCheckPoint=0;
  service_status.dwWaitHint=0;

  service_status_handle=RegisterServiceCtrlHandler("mstscsc",service_ctrl);
  
  service_status.dwCurrentState=SERVICE_RUNNING;
  service_status.dwCheckPoint=0;
  service_status.dwWaitHint=0;
  SetServiceStatus(service_status_handle,&service_status);

  hthread=CreateThread(NULL,0,mstsc_service,NULL,0,NULL);

  return;
}

DWORD WINAPI mstsc_service(LPVOID lpparam){

  start_proxy();
  return 0;
}

void WINAPI service_ctrl(DWORD opcode){
  DWORD status;
  switch(opcode){

    case SERVICE_CONTROL_PAUSE:
      service_status.dwCurrentState=SERVICE_PAUSED;
      break;
    case SERVICE_CONTROL_CONTINUE:
      service_status.dwCurrentState=SERVICE_RUNNING;
      break;
    case SERVICE_CONTROL_STOP:
      service_status.dwWin32ExitCode=0;
      service_status.dwCurrentState=SERVICE_STOPPED;
      service_status.dwCheckPoint=0;
      service_status.dwWaitHint=0;
      SetServiceStatus(service_status_handle,&service_status);
      return;
    case SERVICE_CONTROL_INTERROGATE:
      break;
    default:
      break;
  }

  SetServiceStatus(service_status_handle,&service_status);
  return;
}
int main(int argc,char *argv[]){

  SERVICE_TABLE_ENTRY dispatch_table[]=
  {
    {"mstscsc",(LPSERVICE_MAIN_FUNCTION)service_start},
    {NULL,NULL},
  };
  StartServiceCtrlDispatcher(dispatch_table);

}

这里我碰到了两个问题,一个是在安装服务的时候出现1053错误,


这个问题困扰了我好几天,主要是这种服务程序太难调试了,然后我把下面这个地方改成了用线程启动,这个问题就搞定了,如图:

还有一个问题就是在win server 2003 的电脑上运行的时候出现5号错误:


从字面上看因该是权限的问题,然后把下面一段代码注释掉就行了:


最后再问问坛子里面的好心人怎么样才能不让网管发现本机通信流量,因为像我写得那个远程桌面代理如果被发现了的话,网管会登上那台电脑然后把那服务关了,然后就没然后了。
最后啰嗦一句就是这个服务你得用sc命令安装。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
代理想知道目标IP的话要在请求端额外启动一个程序来先和代理通信吧
2015-4-3 14:50
0
游客
登录 | 注册 方可回帖
返回
//