自实现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);
}
这里获得的是地址,之后调用需要转换成函数形式
相关文章:
自实现getprocaddress(名称查找或者序号查找)
通过名称去找 // MyGETPRCOADDRESS.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include<Windows.h>/*WINBASEAPI //导出不需要使用,那么我们注释掉*/ FARPROC WINAPI MyGetProcAddress(_In_ HMO…...
如何DIY制作干洗店洗护小程序
洗护行业正逐渐迎来线上化的浪潮,传统的干洗店也开始尝试将业务线上化,以提供更便捷的服务给消费者。而制作一款洗护小程序,成为了干洗店实现线上化的重要一环。今天,我们就来分享一下如何使用第三方制作平台制作洗护小程序的教程…...
微前沿 | 第1期:强可控视频生成;定制化样本检索器;用脑电重建视觉感知;大模型鲁棒性评测
欢迎阅读我们的新栏目——“微前沿”! “微前沿”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里,你可以快速浏览研究院的亮点资讯,保持对前沿领域的敏锐嗅觉,同时也能找到先进实用的开源工具。 本期内容速览 01. 强可…...
SQLite数据库C_C++接口(保姆级API应用 1.4W字)(全网最详细介绍,学完必掌握)
目录 sqlite3的C/C API应用 前言 SQLite3库安装 API函数 打开、关闭、错误处理 打开 返回值 关闭 错误调试 实际应用 执行SQL(DDL、DML) API介绍 实际应用 回调函数查询 API介绍 实际应用 全缓冲查询 API介绍 实际应用 字节缓冲查询…...
倒计时:心理的镇静剂还是焦虑的火种?
倒计时:心理的镇静剂还是焦虑的火种? 目录 引言倒计时的作用与原理倒计时的双面性:缓解焦虑还是引发焦虑?如何正确使用倒计时结论 引言 在我们的日常生活和工作中,倒计时被广泛的应用。无论是在网购的抢购活动中&a…...
迅睿系统二开自定义函数和插件的自定义函数
全局的自定义函数: 全局的自定义函数文件:dayrui/My/Helper.php 此文件用于放网站自定义函数,程序会自动加载 当前站点的自定义函数文件:网站主目录/config/custom.php 插件的自定义函数: 基于App目录下的插件或模块…...
传统品牌如何通过3D虚拟数字人定制和动捕设备加速年轻化发展?
步入Z时代,年轻一代消费者的生活方式深受互联网技术和媒介环境影响,对新潮事物感兴趣,消费思维也相对前卫,品牌需要探索契合Z世代的消费观念,寻找新的链接拉近品牌与消费者的距离,而3D虚拟数字人定制可以帮…...
sql:SQL优化知识点记录(五)
(1)explain之例子 (2)索引单表优化案例 上面的功能已经实现,但是分析功能, 使用explain分析这条sql: 发现type为All Extra:有Using filesort (文件内排序) 这…...
1.3 Metasploit 生成SSL加密载荷
在本节中,我们将介绍如何通过使用Metasploit生成加密载荷,以隐藏网络特征。前一章节我们已经通过Metasploit生成了一段明文的ShellCode,但明文的网络传输存在安全隐患,因此本节将介绍如何通过生成SSL证书来加密ShellCodeÿ…...
redis windows 版本安装
1. 下载windows安装包并解压 如果是Linux版本可以直接到官网下载,自3.x起官网和微软网站就没有redis安装包更新了,好在github有开发者在编译发布更新(目前最新有5.0.9版本可下),地址:redis windows 5版本下…...
限流算法深入
限流定义及目的 当系统流量达到系统或下游承受能力的阈值时对系统进行限流控制以防止系统或下游挂掉,减少影响面。 限流组成:阈值及限流策略。阈值是指系统单位时间接收到的请求qps总数;限流策略是指限流行业触发后对应的系统行为ÿ…...
java 基础知识 循环的几个题目
1、输出1~100的累加和 结果显示在屏幕,显示在文件res1.txt中 2、输出1-~100的偶数和 结果显示在屏幕,显示在文件res2.txt中 3、输出所有水仙花数: 100~999的数中出现个位数的立方十位数的立方百位数的立方这个数本身 4、输出由9行9列星号组成…...
Spring Boot使用LocalDateTime、LocalDate作为入参
0x0 背景 项目中使用LocalDateTime系列作为dto中时间的类型,但是spring收到参数后总报错,为了全局配置时间类型转换,尝试了如下3中方法。 注:本文基于Springboot2.0测试,如果无法生效可能是spring版本较低导致的。PS&…...
第七周第七天学习总结 | MySQL入门及练习学习第二天
实操练习: 1.创建一个名为 cesh的数据库 2.在这个数据库内 创建一个名为 xinxi 的表要求该表可以包含:编号,姓名,备注的信息 3.为 ceshi 表 添加数据 4.为xinxi 表的数据设置中文别名 5.查询 在 xinxi 表中编号 为2 的全部…...
【考研数学】线形代数第三章——向量 | 3)向量组秩的性质、向量空间、过渡矩阵
文章目录 引言三、向量组等价、向量组的极大线性无关组与秩3.2 向量组秩的性质 四、 n n n 维向量空间4.1 基本概念4.2 基本性质 写在最后 引言 紧接前文学习完向量组秩的基本概念后,继续往后学习向量的内容。 三、向量组等价、向量组的极大线性无关组与秩 3.2 向…...
【技术】SpringBoot Word 模板替换
SpringBoot Word 模板替换 什么是 Word 模板替换如何实现 Word 模板替换 什么是 Word 模板替换 模板一般是具有固定格式的内容,其中一部分需要替换。Word 模板通俗的讲是以 Word 的形式制作模板,固定格式和内容,然后将其中的一部分数据替换掉…...
java jni nv21和nv12互转
目录 libyuv性能比较 NV12 NV21 YUV420格式介绍 jni YUV420toYUV420SemiPlanar java YUV420toYUV420SemiPlanar java NV12toYUV420SemiPlanar jni NV12toYUV420SemiPlanar...
后端面试话术集锦第二篇:spring boot面试话术
🚗后端面试集锦目录 💖后端面试话术集锦第一篇:spring面试话术💖 💖后端面试话术集锦第二篇:spring boot面试话术💖 💖后端面试话术集锦第三篇:spring cloud面试话术💖 💖后端面试话术集锦第四篇:ElasticSearch面试话术💖 💖后端面试话术集锦第五篇:r…...
Doris中分区和分桶使用教程
1 分区与分桶 Doris中有两层的数据划分,第一层是分区(Partition),第二层是分桶(Bucket), Partition又能分为Range分区和List分区。 Bucket仅支持Hash方式。 1.1 Partition 只能指定…...
电脑不安装软件,怎么将手机文件传输到电脑?
很多人都知道,AirDroid有网页版(web.airdroid.com)。 想要文件传输,却不想在电脑安装软件时,AirDroid的网页版其实也可以传输文件。 然而,要将文件从手机传输文件到网页端所在的电脑时,如果按…...
告别龟速采样!用DDIM加速你的扩散模型推理(附PyTorch代码)
加速扩散模型推理:DDIM核心原理与实战优化指南 在图像生成领域,扩散模型以其卓越的质量表现迅速成为研究热点,但传统DDPM(Denoising Diffusion Probabilistic Models)的致命缺陷在于其缓慢的采样速度——生成一张图片往…...
解锁端侧智能:基于BigDL-LLM与Qwen-1.8B-Chat的CPU高效推理实践
1. 为什么要在CPU上部署大模型? 最近两年大模型技术发展迅猛,但大多数应用都依赖昂贵的GPU服务器。我在实际项目中发现,很多中小企业和个人开发者其实更需要能在普通电脑上运行的轻量化方案。这就是为什么基于CPU的大模型部署方案变得越来越…...
告别内置ADC的烦恼:用ADS1119搞定STM32/DSP的高精度电压采样(附完整代码)
告别内置ADC的烦恼:用ADS1119搞定STM32/DSP的高精度电压采样(附完整代码) 在嵌入式系统开发中,电压采样是基础却至关重要的环节。许多工程师在使用STM32或DSP内置ADC时,常会遇到精度不足、抗干扰能力差、无法测量差分信…...
跨越平台限制:如何用WorkshopDL免费获取Steam创意工坊模组
跨越平台限制:如何用WorkshopDL免费获取Steam创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games或GOG平台无法访问Steam创意工坊而烦恼吗…...
DriveBench:面向真实驾驶场景的长序列多智能体交互基准测试框架
1. 项目概述:从“世界基准”到“驾驶基准”的演进如果你在自动驾驶或者计算机视觉领域摸爬滚打过几年,一定对“基准测试”(Benchmark)这个词又爱又恨。爱的是,它提供了一个相对公平的擂台,让不同算法、不同…...
终极指南:如何在Mac上免费快速导出微信聊天记录
终极指南:如何在Mac上免费快速导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而焦虑?或需要查找…...
开源机械爪OpenClaw:从设计到力控抓取的完整实现指南
1. 项目概述:从“OpenClaw”看开源机械爪的无限可能最近在逛GitHub的时候,发现了一个挺有意思的项目,叫“MeyerZhou/openclaw”。光看名字,你大概能猜到这是个关于机械爪的开源项目。没错,这是一个旨在提供低成本、模块…...
STM8硬件IIC驱动BNO055传感器避坑指南(附完整代码)
STM8硬件IIC驱动BNO055传感器实战解析与优化 BNO055作为一款集成了9轴传感器融合算法的智能芯片,能够直接输出姿态角数据,极大简化了嵌入式系统中姿态解算的复杂度。然而在实际应用中,许多开发者发现使用STM32等常见MCU的模拟IIC接口难以稳定…...
ARM Cortex-X4/X925处理器仿真模型与指令集详解
1. ARM Cortex-X4/X925处理器仿真模型概述处理器仿真模型在现代芯片设计中扮演着至关重要的角色,特别是在Arm架构的生态系统中。作为Arm最新一代高性能核心,Cortex-X4和X925的Iris仿真组件提供了完整的指令集和微架构行为建模,使开发者能够在…...
量子最优控制中的iLQR算法实践与优化
1. 量子最优控制基础与挑战量子最优控制(Quantum Optimal Control, QOC)是现代量子计算中的核心技术,其核心目标是通过精心设计的控制脉冲序列,实现对量子系统状态演化的精确操控。在超导量子计算体系中,这一技术尤为重…...
