自实现getprocaddress(名称查找或者序号查找)

通过名称去找

// MyGETPRCOADDRESS.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
FARPROC
WINAPI
MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pIMAGE_EXPORT_DIRECTORYRVA + (DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;printf("%s", ModuleName);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule =  GetModuleHandleA("ntdll.dll");  //为了防止同名函数,所以先要获得哪个模块   那么Hmodule相当于模块基址//void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");//void *p2 = GetProcAddress(Hmodule, (LPCSTR)1);void* p1 = MyGetProcAddress(Hmodule, "RtlDispatchAPC");printf("%s", p1);
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

在这里插入图片描述
可以看到找成功了

接下来获取名称表格
在这里插入图片描述
可以看到0x777727D4就是函数的地址,那么函数地址第一个就是0x0011626c,因为DWORD是4字节
但是还需要加基址hModule(0x77660000),那么就是0x0011626c+0x77660000,也就是如下
在这里插入图片描述
可以看到成功定位到了函数,那么可以正确获取到名称表格
然后我们写循环

for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++)
{DWORD FunNameRVA = NameAddress[i];char * FunName = (char *)(FunNameRVA + (DWORD)hModule);printf("%s\n", FunName);
}

在这里插入图片描述
在这里插入图片描述


#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
FARPROC
WINAPI
MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pIMAGE_EXPORT_DIRECTORYRVA + (DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;//printf("%s", ModuleName);DWORD NameAddressRVA = pIMAGE_EXPORT_DIRECTORY->AddressOfNames;DWORD* NameAddress = (DWORD *)(NameAddressRVA + (DWORD)hModule);for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++){DWORD FunNameRVA = NameAddress[i];char * FunName = (char *)(FunNameRVA + (DWORD)hModule);printf("%s\n", FunName);}printf("%s\n", ModuleName);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule =  GetModuleHandleA("ntdll.dll");//void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");//void *p2 = GetProcAddress(Hmodule, (LPCSTR)1);void* p1 = MyGetProcAddress(Hmodule, "RtlDispatchAPC");printf("%s", p1);
}

但是这样写看着有点不舒服,那么我们写一个RVA转AV的函数,让整体代码看起来舒服点
在这里插入图片描述
可以看到再次运行可以成功输出相同的结果

#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
DWORD RVTTOVA(DWORD RVA, DWORD hMODULE) {return RVA + hMODULE;
}FARPROC
WINAPI
MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)RVTTOVA((DWORD)pIMAGE_EXPORT_DIRECTORYRVA,(DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的//DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;DWORD ModuleName =  RVTTOVA(pIMAGE_EXPORT_DIRECTORY->Name, (DWORD)hModule);//printf("%s", ModuleName);/*   DWORD NameAddressRVA = pIMAGE_EXPORT_DIRECTORY->AddressOfNames;DWORD* NameAddress = (DWORD *)(NameAddressRVA + (DWORD)hModule);*/DWORD* NameAddress = (DWORD*)RVTTOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfNames, (DWORD)hModule);for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++){//DWORD FunNameRVA = NameAddress[i];//char * FunName = (char *)(FunNameRVA + (DWORD)hModule);char* FunName = (char*)RVTTOVA(NameAddress[i], (DWORD)hModule);printf("%s\n", FunName);}printf("%s\n", ModuleName);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule =  GetModuleHandleA("ntdll.dll");//void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");//void *p2 = GetProcAddress(Hmodule, (LPCSTR)1);void* p1 = MyGetProcAddress(Hmodule, "RtlDispatchAPC");printf("%x", p1);
}

最后输出的0这里有问题,是因为需要我们改成printf打印p而不是p1,要进行对比
在这里插入图片描述
注意之前的自定义函数名写错了,应该是RVATOVA,因为是RVA转VA,之前写的没注意到
在这里插入图片描述
然后我们写导出函数名称序号表

//导出函数名称序号表
DWORD* NameOrdinalAddress = (DWORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals, (DWORD)hModule);

在这里插入图片描述
可以看到显示出了序号,发现是二字节而不是四字节,那么我们就不能用DWORD了要用二字节的WORD
那么我们打印序号,接下来写导出函数地址表,都写在一块了

//导出函数名称序号表
WORD* NameOrdinalAddress = (WORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals, (DWORD)hModule);
//导出函数地址表
DWORD* AddressFun = (DWORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions, (DWORD)hModule);for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++)
{//DWORD FunNameRVA = NameAddress[i];//char * FunName = (char *)(FunNameRVA + (DWORD)hModule);char* FunName = (char*)RVATOVA(NameAddress[i], (DWORD)hModule);if (strcmp(FunName,lpProcName) == 0){printf("%d\n",NameOrdinalAddress[i] + pIMAGE_EXPORT_DIRECTORY->Base);printf("%x\n", RVATOVA(AddressFun[NameOrdinalAddress[i]],(DWORD)hModule));printf("找到了!");}//printf("%s\n", FunName);
}
printf("%s\n", ModuleName);
return NULL;
}

试试wcsspn函数
在这里插入图片描述
试试RtlDispatchAPC函数
在这里插入图片描述
可以看到对比序号都一样,说明没有序号找错

总结

那么这里来总结下,总共四步骤
1.导出表
2.导出函数名称表
3.导出函数名称序号表
4.导出函数地址表

完整代码:

#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
DWORD RVATOVA(DWORD RVA, DWORD hMODULE) {return RVA + hMODULE;
}FARPROC
WINAPI
MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)//导出表PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)RVATOVA((DWORD)pIMAGE_EXPORT_DIRECTORYRVA,(DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的//DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;DWORD ModuleName =  RVATOVA(pIMAGE_EXPORT_DIRECTORY->Name, (DWORD)hModule);//printf("%s", ModuleName);/*   DWORD NameAddressRVA = pIMAGE_EXPORT_DIRECTORY->AddressOfNames;DWORD* NameAddress = (DWORD *)(NameAddressRVA + (DWORD)hModule);*///导出函数名称表DWORD* NameAddress = (DWORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfNames, (DWORD)hModule);//导出函数名称序号表WORD* NameOrdinalAddress = (WORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals, (DWORD)hModule);//导出函数地址表DWORD* AddressFun = (DWORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions, (DWORD)hModule);for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++){//DWORD FunNameRVA = NameAddress[i];//char * FunName = (char *)(FunNameRVA + (DWORD)hModule);char* FunName = (char*)RVATOVA(NameAddress[i], (DWORD)hModule);if (strcmp(FunName,lpProcName) == 0){printf("%d\n",NameOrdinalAddress[i] + pIMAGE_EXPORT_DIRECTORY->Base);printf("%x\n", RVATOVA(AddressFun[NameOrdinalAddress[i]],(DWORD)hModule));printf("找到了!");}//printf("%s\n", FunName);}printf("%s\n", ModuleName);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule =  GetModuleHandleA("ntdll.dll");void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");//void *p2 = GetProcAddress(Hmodule, (LPCSTR)1);void* p1 = MyGetProcAddress(Hmodule, "RtlDispatchAPC");printf("%x", p);
}

通过序号去找

以刚才的例子,这里通过刚才得到的8去获取名称
反汇编代码看1是比较是否大于FFFF,如果大于就跳到字符串,小于就跳到序号
比如8,就需要8-base才是获得的在这里插入图片描述
可以看到自定义的序号查找也找到了


#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
DWORD RVATOVA(DWORD RVA, DWORD hMODULE) {return RVA + hMODULE;
}//FARPROC
//WINAPI
//MyGetProcAddress(
//    _In_ HMODULE hModule,
//    _In_ LPCSTR lpProcName
//)
FARPROC
WINAPI
MyOrdinalGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)//导出表PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)RVATOVA((DWORD)pIMAGE_EXPORT_DIRECTORYRVA,(DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的//导出函数地址表DWORD* AddressFun = (DWORD*)RVATOVA(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions, (DWORD)hModule);DWORD dwBase = pIMAGE_EXPORT_DIRECTORY->Base;DWORD funAddress =  RVATOVA( AddressFun[(DWORD)lpProcName - dwBase],(DWORD)hModule);printf("%x\n", funAddress);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule =  GetModuleHandleA("ntdll.dll");void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");void *p2 = GetProcAddress(Hmodule, (LPCSTR)8);void* p1 = MyOrdinalGetProcAddress(Hmodule, (LPCSTR)8);printf("%x", p1);printf("%x", p2);
}

以上是找到了该函数,那么我们通过strcmp函数来获得该函数


#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
//FARPROC
//WINAPI
DWORD MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pIMAGE_EXPORT_DIRECTORYRVA + (DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;//可以看到底下地址都需要写成指针形式DWORD *pAddressOfFunction = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions + (DWORD)hModule);//printf("%s", ModuleName);DWORD *NameAddress = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNames + (DWORD)hModule);WORD* pAddressOfNameOrdinals = (WORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals + (DWORD)hModule);for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++){DWORD FunNameRVA = NameAddress[i];char* FunName = (char*)(FunNameRVA + (DWORD)hModule);if (strcmp(lpProcName, FunName) == 0){return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);}printf("%s\n", FunName);}printf("%s\n", ModuleName);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule = GetModuleHandleA("ntdll.dll");//void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");//void *p2 = GetProcAddress(Hmodule, (LPCSTR)1);DWORD p1 = MyGetProcAddress(Hmodule, "RtlDispatchAPC");printf("%s", p1);
}

在这里插入图片描述
可以看到成功获得函数

这里我们要获得的是Kernel32.dll里的CreateFileA函数
在这里插入图片描述


#include <iostream>
#include<Windows.h>/*WINBASEAPI   //导出不需要使用,那么我们注释掉*/
//FARPROC
//WINAPI
DWORD MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName
){PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pIMAGE_EXPORT_DIRECTORYRVA + (DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;//可以看到底下地址都需要写成指针形式DWORD *pAddressOfFunction = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions + (DWORD)hModule);//printf("%s", ModuleName);DWORD *NameAddress = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNames + (DWORD)hModule);WORD* pAddressOfNameOrdinals = (WORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals + (DWORD)hModule);for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++){DWORD FunNameRVA = NameAddress[i];char* FunName = (char*)(FunNameRVA + (DWORD)hModule);if (strcmp(lpProcName, FunName) == 0){return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);}printf("%s\n", FunName);}printf("%s\n", ModuleName);return NULL;
}int main()
{std::cout << "Hello World!\n";HMODULE Hmodule = GetModuleHandleA("Kernel32.dll");//void *p = GetProcAddress(Hmodule, "RtlDispatchAPC");//void *p2 = GetProcAddress(Hmodule, (LPCSTR)1);DWORD p1 = MyGetProcAddress(Hmodule, "CreateFileA");printf("%s", p1);
}

这里获得的是地址,之后调用需要转换成函数形式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110117.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC - 生成模型

AIGC - 生成模型 0. 前言1. 生成模型2. 生成模型与判别模型的区别2.1 模型对比2.2 条件生成模型2.3 生成模型的发展2.4 生成模型与人工智能 3. 生成模型示例3.1 简单示例3.2 生成模型框架 4. 表示学习5. 生成模型与概率论6. 生成模型分类小结 0. 前言 生成式人工智能 (Generat…

面试中的代码写作:如何撰写清晰、高效的示例代码

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

软考A计划-网络工程师-常用计算公式汇总

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Zabbix 5.0 媒体介质 邮箱配置例子

QQ企业邮箱 参考&#xff1a;zabbix 腾讯企业邮箱配置图_harveymomo的博客-CSDN博客

分布式计算框架:Spark、Dask、Ray

目录 什么是分布式计算 分布式计算哪家强&#xff1a;Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法&#xff0c;和集中式计算是相对的。 随着计算技术的发展&#xff0c;有些应用需要非常巨大的计算能力才…

python web GUI框架-NiceGUI 教程(二)

python web GUI框架-NiceGUI 教程&#xff08;二&#xff09; streamlit可以在一些简单的场景下仍然推荐使用&#xff0c;但是streamlit实在不灵活&#xff0c;受限于它的核心机制&#xff0c;NiceGUI是一个灵活的web框架&#xff0c;可以做web网站也可以打包成独立的exe。 基…

几个nlp的小任务(机器翻译)

几个nlp的小任务(机器翻译) 安装依赖库数据集介绍与模型介绍加载数据集看一看数据集的样子评测测试数据预处理测试tokenizer处理目标特殊的token预处理函数对数据集的所有数据进行预处理微调预训练模型设置训练参数需要一个数据收集器,把处理好数据喂给模型设置评估方法参数…

python爬虫12:实战4

python爬虫12&#xff1a;实战4 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产生不好…

yo!这里是Linux基础开发工具介绍

目录 前言 基础开发工具 yum vim 1.基本介绍 2.基本操作 3.正常模式常用命令 4.底行模式常用命令 gcc/g gdb 1.基本介绍 2.常用操作 make/Makefile 1.背景 2.介绍 3.使用 git 1.介绍 2.操作 进度条程序简单实现 后记 前言 在学完初步的基础指令及权限控…

JVM虚拟机:定位对象的两种方式

定位对象的方式 1、句柄池 2、直接指针 ‘句柄池 直接指针 在Java中&#xff0c;可以使用两种方式来定位对象&#xff1a;句柄池和直接指针。 1. 句柄池&#xff1a;在Java的句柄池模型中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;会为每个对象创建一个句柄&#xff…

关于 MySQL、PostgresSQL、Mariadb 数据库2038千年虫问题

MySQL 测试时间&#xff1a;2023-8 启动MySQL服务后&#xff0c;将系统时间调制2038年01月19日03时14分07秒之后的日期&#xff0c;发现MySQL服务自动停止。 根据最新的MySQL源码&#xff08;mysql-8.1.0&#xff09;分析&#xff0c;sql/sql_parse.cc中依然存在2038年千年虫…

【UE5】用法简介-使用MAWI高精度树林资产的地形材质与添加风雪效果

首先我们新建一个basic工程 然后点击floor按del键&#xff0c;把floor给删除。 只留下空白场景 点击“地形” 在这个范例里&#xff0c;我只创建一个500X500大小的地形&#xff0c;只为了告诉大家用法&#xff0c;点击创建 创建好之后有一大片空白的地形出现 让我们点左上角…

以udp协议创建通信服务器

概念图 创建服务器让A,B主机完成通信。 认识接口 socket 返回值&#xff1a;套接字&#xff0c;你可以认为类似fd 参数&#xff1a; domain->:哪种套接字&#xff0c;常用AF_INET(网络套接字)、AF_LOCAL(本地套接字)type->&#xff1a;发送数据类型&#xff0c;常用 …

基于Java+SpringBoot+Vue前后端分离美食推荐商城设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

云计算和Docker分别适用场景

在大规模网络爬虫系统中&#xff0c;通过使用云计算和Docker技术&#xff0c;可以实现大规模网络爬虫系统的高效架构设计和部署。这种架构能够提供可扩展性、高可用性和灵活性&#xff0c;为爬虫系统的运行和管理带来便利。 云计算和Docker在大规模网络爬虫系统中有不同的业务…

【golang】15、cobra cli 命令行库

Cobra 是 golang 最流行的命令行库&#xff0c;文档见 一、脚手架 mkdir pt && cd pt && go mod init cobra-cli init # 在项目下运行即可生成脚手架# tree . ├── LICENSE ├── cmd # 生成了cmd目录 │ └── root.go # 生成了root.go, 其中定义了ro…

b树/b+树、时间轮、跳表、LSM-Tree

b树、b树&#xff1a;关系型数据库核心存储结构 1、为什么磁盘数据存储结构用B树、而不用红黑树 磁盘每次读取不是读一个节点、是返回一页数据。 红黑树每次遍历一个节点排除一半数据。 B树通常映射相邻的磁盘页数据。4K mysql索引一个节点隐射16k故而映射4倍&#xff0c;故…

Ubuntu Touch OTA-2 推出,支持 Fairphone 3 和 F(x)tec Pro1 X

导读UBports 基金会近日宣布为基于 Ubuntu 20.04 LTS (Focal Fossa) 的 Ubuntu Touch 移动操作系统发布并全面提供 OTA-2 软件更新。 Ubuntu Touch OTA-2 在首次 OTA 更新整整四个月后发布&#xff0c;支持新设备&#xff0c;包括 Fairphone 3、F(x)tec Pro1 X 和 Vollaphone X…

【Go 基础篇】探索Go语言中Map的神奇操作

嗨&#xff0c;Go语言的学习者们&#xff01;在编程世界中&#xff0c;Map是一个强大而又有趣的工具&#xff0c;它可以帮助我们高效地存储和操作键值对数据。Map就像是一本字典&#xff0c;可以让我们根据关键字&#xff08;键&#xff09;快速找到对应的信息&#xff08;值&a…

烟花厂人员作业释放静电行为检测算法

烟花厂人员作业释放静电行为检测算法通过pythonyolo系列算法模型框架&#xff0c;烟花厂人员作业释放静电行为检测算法在工厂车间入口处能够及时捕捉到人员是否触摸静电释放仪。一旦检测到人员进入时没有触摸静电释放仪&#xff0c;系统将自动触发告警。Python是一种由Guido va…