inlinehook原理(inline HOOK啥意思的)

:暂无数据 2026-08-22 19:10:01 1

inlinehook原理(inline HOOK啥意思的)

本篇文章给大家谈谈inlinehook原理,以及inline HOOK啥意思的对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

inline HOOK啥意思的

hook 计算机里面一般是指 挂钩某函数, 就是替换掉原来的函数。
inline hook , 是桐亩直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。
这是相对普通的hook来慧轮薯说,因为普通的hook只是修改函数的调前者用地址,而不是在原来的函数体里面做修改。
一般来说 普通的hook比较稳定使用。 inline hook 更加高级一点,一般也跟难以被发现。所以很多人比如病毒制作者都比较推崇inline hook。

钩子注入的原理机制

钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。 钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。
若在dll中使用SetWindowsHookEx设置一全局钩子,系统会将其加载入使用user32的进程中,因而它也可被利用为无进程木马的进程注入手段。
木马编写者首先把一个实际为木马主体的dll文件载入内存,然后通过“线程注射”技术将其注入其他进程的内存空间,最后这个dll里的代码就成为其他进程的一部分来实现了自身的隐藏执行,通过调用“hook”机制。
钩子(hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函没厅数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
这个dll木马便实现了监视用户的输入输出操作,截取有用的资料等操作。这种木马的实际执行体是一个dll文件,由于Windows系统自身就包含着大量的dll文件,谁也无法一眼看出哪个dll文件不是系统自带的,所以这种木马的隐蔽性又提高了一级,而且它的执行方式也更加隐蔽,这是由Windows系统自身特性决定的,Windows自身就袜型是大量使用dll的系统,许多dll文件在启动时便被相关的应用程序加载进内存里执行了,可是有谁在进程里直接看到过某个dll在运行的?因为系统是把dll视为一种模块性质的执行体来调用的,它内部只包含了一堆以函数形式输出的模块,也就是说每个dll都需要由一个用到它的某个函数的exe来加载,当dll里的函数执行完毕后就会返回一个运行结果给调用它的exe,然后dll进程退出内存结束这次执行过程,这就是标准的dll运行周期,而采用了“线程注射”技术的dll则不是这样,它们自身虽然也是导出函数,但是它们的代码是具备执行逻辑的,这种模块就像一个普通exe,只是它不能直接由自身启动,而是需要有一个特殊作用的程序(称为加载者)产生的进程把这个dll的主体函数载入内存中执行,从而让它成为一个枯好隐运行中的木马程序。

inline HOOK和SSDT HOOK各自有啥特性的哦

inline hook 是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。
ssdt是利用api来挂钩的,相当于替换API,用ICESword可以很简单的判断出来。
底下是我在网上看过一篇文章的说的一个比喻,刚弊辩好能回答你的问题:
如果说SSDT Hook只是把某位"内核API先生"绑架,然后用我们的“自己人”来接管其工作,而ICESword却可以从其他联系途径找到被绑架的"内核API先生"并“报警”,那么稿卜握——Inline Hook可以说是给"内核API先生"动了手术,键庆让他成为"我们阵营的一分子"。
呵呵,很幽默的一个比喻

什么是HOOK技术

HOOK技术是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

钩子实际上是一个处宏如大理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控橡肆制权蔽竖。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

***隐藏网址***

扩展资料:

Hook原理

Hook技术无论对安全软件还是恶意软件都是十分关键的一项技术,其本质就是劫持函数调用。但是由于处于Linux用户态,每个进程都有自己独立的进程空间,所以必须先注入到所要Hook的进程空间,修改其内存中的进程代码,替换其过程表的符号地址。在Android中一般是通过ptrace函数附加进程,然后向远程进程注入so库,从而达到监控以及远程进程关键函数挂钩。

Hook技术的难点,并不在于Hook技术,初学者借助于资料“照葫芦画瓢”能够很容易就掌握Hook的基本使用方法。如何找到函数的入口点、替换函数,这就涉及了理解函数的连接与加载机制。

从Android的开发来说,Android系统本身就提供给了我们两种开发模式,基于AndroidSDK的Java语言开发,基于AndroidNDK的NativeC/C++语言开发。所以,我们在讨论Hook的时候就必须在两个层面上来讨论。

对于Native层来说Hook的难点其实是在理解ELF文件与学习ELF文件上,特别是对ELF文件不太了解的读者来说;对于Java层来说,Hook就需要了解虚拟机的特性与Java上反射的使用。

inlinehook缺点

1、HOOK SERVICE TABLE:HOOK SSDT
这种方法对于拦截 NATIVE API 来说用的比较多。
SSDT hook,一句话——Windows把需要调用的内核API地址全都存在了
一个表中(System Service Dispatch Table),要想hook一个内核API,比较简单的办法就是把
该内核API在表(SSDT)中保存的地址修改为自己撰写的函数地址。
2、HOOK INT 2E 方法:IDT HOOK
IDT是中断描述表,可以替换其中的中断处理程序。
这种方法对于跟踪、分析系统调用来说用的比较多。原理是通过替换 IDT
表中的 INT 2E 中断,使之指向我们自己的中断服务处理例程来实陪睁现的。掌握
此方法需要你对保护模式有一定的基础。
3、 HOOK PE 方法:EAT HOOK
这种方法对于拦截、分析其他内核驱动的函数调用来说用的比较多。原理
是根据替换 PE 格式导出表中的相应函数来实现的。
EAT是可执行文件的导出表,记录DLL中可供其他程序使用的函数,可执行文件装载时会使用相应DLL的EAT表来初始化IAT表,通过替换EAT表中的函数地址,就可以使依赖于本DLL的程序得到一个假的地址。
4.IAT HOOK (ring3 用)
IAT是可执行文件的导入表,记录可执行文件使用的其它DLL中的函数,通过替换IAT表中的函数地址,可以hook相应DLL中的函数调用。
5、Inline Hook方法 (ring 0和ring3 都可以用)
Inline hook的工作流程:
1)验证内核API的版本(特征码匹配)。
2)撰写自己的函数,要完成以上三项任务。
2)获取自己函数的地址,覆盖内核API内存,供跳转。
Inline Hook的缺点:
1) 不够通用。各个windows版本中,内核API的开始一段不尽相同,要想通吃,就要多写几个版
本或者做一个特征码搜索(因为有的内核API在各个版本中非常相似,只是在“特征码”之前或之
后加一点东西)。
2)告枝 已被一些检测工具列入检测范围,如果直接从内核API第一个字节开始覆盖,那么很容易被检
测,如袜乱敏果把覆盖范围往后推,并加以变形,也许能抵挡一气。具体情况,我才疏学浅,尚未试验
6.SYSENTRY hook
为了性能的考虑,xp后的系统都改用sysentry命令来进入ring0,去调用SSDT中的服务,不再是通过IDT中的 int 2E。这也使得我们hook也变得相对容易了。
首先获得sysentry的地址,然后改之,不用再考虑IDT了
7)IRP hook
IRP是 I/O request packets,驱动程序中有一系列分发例程来处理请求,这些例程保存在驱动设备对象的数据结构中的一个表中,也很容易替换。

inline hook只能hook在函数头部吗

当执行完我们自定义的hook函数之后,又从被hook函数的首部开始执行,被hook函数一进入就被跳转了。而本文,则要实现在某个函数体内部任意地方进行hook并跳转,执行完我们的函数之后,再回到原来的位置橘激继续向下执行完未执行的逻辑。那么,初看这种方式似乎与前面写的两篇hook没有什么差别,都是hook,都是跳转然后回到被hook的函数。但仔细一想,你会发现本文要实现的方式要比前面两种hook复烂伍缺杂,因为hook的地方是函数体内任意地方,那么回来的时候就不是直接调用被hook的函数了,而是要回到之前hook的地方去。这期间就涉及到hook函数的返回地址问题和被hook函数的返回地址问题。

说了这么多,可能还是有点晕,先不管为什么要这么做,也不管这种hook方式能有什么用途(在本文最后会说明用途),下面我们先写一些代码,在实践中来想一想这种方式有什么用途饥辩,并且与之前的两篇hook进行比较。

首先,我们需要一个自定义的hook函数,这个函数也就是被hook函数被hook后跳转到的地方,这个hook函数负责hook与unhook,还可以监视寄存器,监视内存,也可以管理hook的次数,以供我们灵活的hook需求。直接贴代码吧:
view plaincopyprint?
#include 《iostream》
#include 《windows.h》

#pragma warning( disable : 4311 )
#pragma warning( disable : 4312 )

#define HOOK_BYTES 5
typedef unsigned int uint;

uint hookAddr = 0;
char old_code;
char new_code;

void printRegisters( void );

bool hook( void )
{
DWORD dwFlag;
if ( VirtualProtect( ( void* )hookAddr, HOOK_BYTES, PAGE_EXECUTE_READWRITE, &dwFlag ) )
{
memcpy( old_code, ( void* )hookAddr, HOOK_BYTES );
memcpy( ( void* )hookAddr, new_code, HOOK_BYTES );
VirtualProtect( ( void* )hookAddr, HOOK_BYTES, dwFlag, &dwFlag );
return true;
}
return false;
}

void unhook( void )
{
DWORD dwFlag;
if ( VirtualProtect( ( void* )hookAddr, HOOK_BYTES, PAGE_EXECUTE_READWRITE, &dwFlag ) )
{
memcpy( ( void* )hookAddr, old_code, HOOK_BYTES );
VirtualProtect( ( void* )hookAddr, HOOK_BYTES, dwFlag, &dwFlag );
}
}

namespace global
{
uint gEAX = 0;
uint gEBX = 0;
uint gECX = 0;
uint gEDX = 0;
uint gESP = 0;
uint gEBP = 0;
uint gESI = 0;
uint gEDI = 0;

uint gRet = 0; // 临时的返回地址
uint gTmp = 0; // 一些临时的值保存
uint gPar = 0; // 被hook函数的正常返回地址
uint gCnt = 1; // 当前hook的次数
uint gMax = 0; // 最大hook次数,为0表示一直hook
bool bEnt = 0; // 是否为第一次进入hook函数
}

void __declspec( naked ) hook_jmp( void )
{
__asm
{
__entry:
pushad
{
cmp global::bEnt, 0 // 如果没有进入则表示需要unhook
je __first

cmp global::gMax, 0 // 如果为0,则一直启用hook逻辑
je __second

mov eax, global::gCnt
cmp eax, global::gMax // 如果当前hook次数没有达到最大次数,则继续
jl __second

mov global::gCnt, 1 // reset state
mov global::bEnt, 0 // reset state
mov global::gMax, 0 // reset state

mov eax, global::gPar // 被hook函数的正常返回地址
mov global::gRet, eax // 准备跳转到被hook函数的上层调用,结束hook
popad
jmp __ret
}

__first:
// 保存相关重要寄存器值
{
popad
mov global::gEAX, eax
mov global::gEBX, ebx
mov global::gECX, ecx
mov global::gEDX, edx
mov global::gESP, esp
mov global::gEBP, ebp
mov global::gESI, esi
mov global::gEDI, edi
}

// 第一次进入,unhook并监视相关状态
pushad
{
mov global::bEnt, 1 // 记录状态

mov edi, global::gEBP // 被hook函数的ebp
mov eax, // 被hook函数的返回地址(其上层调用地址)
mov global::gPar, eax // 保存返回地址
mov esi, __entry // 将被hook函数的返回地址修改为
mov , esi // 本函数的首地址,以便执行完被hook函数的
// 剩余逻辑之后能够返回到本函数,决定是否
// 还需要hook。

call printRegisters // 打印寄存器值,或者其他
call unhook // unhook

mov eax, hookAddr // 获得被hook的内存地址
mov global::gRet, eax
}
popad

pop global::gTmp // 移除本函数的返回地址,并将hook的地址设置
jmp __ret // 为本函数的返回地址,从而实现跳转

__second:
// 第二次进入, 继续hook, 这次进入是被hook函数ret返回的,没有新的ret地址被压栈
{
mov global::bEnt, 0 // 设置状态
add global::gCnt, 1 // 增加hook计数

call hook // hook

mov eax, global::gPar // 将被hook函数的返回地址设置为本函数的
mov global::gRet, eax // 返回地址,从而实现正常的函数流程
}
popad

__ret:
push global::gRet // 修改本函数的返回地址
ret
}
}

void setHookBytes( uint addr )
{
hookAddr = addr;
new_code = ( char )0xe8; // call 指令机器码
( uint& )new_code = ( uint )hook_jmp - addr - 5; // 计算跳转偏移
}

void printRegisters( void )
{
printf( "EAX = 0x%08x/n", global::gEAX );
printf( "EBX = 0x%08x/n", global::gEBX );
printf( "ECX = 0x%08x/n", global::gECX );
printf( "EDX = 0x%08x/n", global::gEDX );
printf( "ESP = 0x%08x/n", global::gESP );
printf( "EBP = 0x%08x/n", global::gEBP );
printf( "ESI = 0x%08x/n", global::gESI );
printf( "EDI = 0x%08x/n", global::gEDI );
}
如上,hook_jmp函数即为我们自定义的hook函数,当被hook函数被hook之后,就会跳转到这个函数里,执行相关逻辑,上面我加了很详细的注释。应该很容易看懂。还是先看怎么使用这套方法,再来细说,代码如下:
view plaincopyprint?
void testHook( void )
{
printf( "This is a hook test 1./n" );
printf( "This is a hook test 2./n" );
printf( "This is a hook test 3./n" );
printf( "This is a hook test 4./n" );
printf( "______________________/n" );
}

int main( void )
{
uint hook_addr = 0x0042ec7b;
setHookBytes( hook_addr );

global::gMax = 2;
if ( hook() )
{
testHook();
testHook();
testHook();
}
system( "pause" );
return 0;
}
如上,testHook函数即为被hook的函数,在main函数中,0x0042ec7b则为testHook函数里的第二个printf调用的地址,在你的机器上可能不一样。这里只是测试之用。testHook函数具体反汇编代码如下:
view plaincopyprint?
void testHook( void )
{
0042EC50 push ebp
0042EC51 mov ebp,esp
0042EC53 sub esp,0C0h
0042EC59 push ebx
0042EC5A push esi
0042EC5B push edi
0042EC5C lea edi,
0042EC62 mov ecx,30h
0042EC67 mov eax,0CCCCCCCCh
0042EC6C rep stos dword ptr es:
printf( "This is a hook test 1./n" );
0042EC6E push offset string "This is a hook test 1./n" (487E24h)
0042EC73 call @ILT+4550(_printf) (42D1CBh)
0042EC78 add esp,4
printf( "This is a hook test 2./n" );
0042EC7B push offset string "This is a hook test 2./n" (487E08h)
0042EC80 call @ILT+4550(_printf) (42D1CBh)
0042EC85 add esp,4
printf( "This is a hook test 3./n" );
0042EC88 push offset string "This is a hook test 3./n" (487DECh)
0042EC8D call @ILT+4550(_printf) (42D1CBh)
0042EC92 add esp,4
printf( "This is a hook test 4./n" );
0042EC95 push offset string "This is a hook test 4./n" (487DD0h)
0042EC9A call @ILT+4550(_printf) (42D1CBh)
0042EC9F add esp,4
printf( "______________________/n" );
0042ECA2 push offset string "_____________________./n" (487DB4h)
0042ECA7 call @ILT+4550(_printf) (42D1CBh)
0042ECAC add esp,4
}
0042ECAF pop edi
0042ECB0 pop esi
0042ECB1 pop ebx
0042ECB2 add esp,0C0h
0042ECB8 cmp ebp,esp
0042ECBA call @ILT+3570(__RTC_CheckEsp) (42CDF7h)
0042ECBF mov esp,ebp
0042ECC1 pop ebp
0042ECC2 ret
我们hook的就是第18行(0042EC7B)那句代码,setHookBytes构建了一个5字节的call语句,0xe8为CALL指令的机器码,后面4个字节是CALL的偏移量(目标地址 - 当前地址 - CALL指令占用的5个字节)。

在main函数中,构建了hook的5个字节之后,设置了hook次数,如main函数那段代码的第15行:global::gMax = 2,则会hook两次。然后是main函数那段代码的第16行,调用hook函数,将5个字节的call指令写入0042EC7B中,并保存了0042EC7B中原来的代码到old_code中。之后,我们便可以调用testHook函数进行测试hook的流程了。最终输出结果为:
This is a hook test 1.
EAX = 0x00000017
EBX = 0x7ffdc000
ECX = 0x8df97741
EDX = 0x00499148
ESP = 0x0012fd84
EBP = 0x0012fe54
ESI = 0x00000000
EDI = 0x0012fe54
This is a hook test 2.
This is a hook test 3.
This is a hook test 4.
______________________
This is a hook test 1.
EAX = 0x00000017
EBX = 0x7ffdc000
ECX = 0x8df97741
EDX = 0x00499148
ESP = 0x0012fd84
EBP = 0x0012fe54
ESI = 0x00000000
EDI = 0x0012fe54
This is a hook test 2.
This is a hook test 3.
This is a hook test 4.
______________________
This is a hook test 1.
This is a hook test 2.
This is a hook test 3.
This is a hook test 4.
______________________

可以看出,前面两次调用testHook函数时,都执行了hook_jmp函数,并调用了printRegisters函数将寄存器打印了出来,之后又回到testHook中,继续输出后面的3句字符串。当两次hook之后,第三次调用testHook时,就不会再输出寄存器了,也没有被hook了。

我们来看几个比较hook_jmp中比较关键的几个地方:
第104到110行:这段汇编代码,主要用于保存testHook函数(被hook函数)的正常的返回地址(main函数里调用testHook的下一句指令的地址)到global::gPar变量中,并将hook_jmp的首地址(也就是__entry标签指示的地址)写入testHook函数的返回地址所在的内存里。这样当unhook并执行完testHook之后又能回到hook_jmp中,进一步判断是否需要下一次hook。如果不需要再hook(已经达到最大hook次数)时,则会执行第79到80行的两句汇编代码,这两句汇编代码的作用是将hook_jmp函数的返回地址设置为testHook函数正常的返回地址,也就是main函数里调用testHook函数的下一句汇编代码的地址(ret指令的原理如果不清楚,请看前两篇hook文章或查阅相关资料)。这样一来,当不再需要hook时,就能顺利的从hook_jmp函数返回后直接跳转到main函数的作用域里。这样整个调用流程就符合原本的调用流程了。

第113行:这句代码是在调用了printRegister函数之后进行unhook操作,将原本的5个字节的代码重新拷贝到testHook函数的相应代码地址的内存里,本例中为testHook函数中第二句printf函数调用的地址。unhook之后,第115到116行的两句代码与第79到80行的两句汇编代码类似,只不过这时是将被hook的内存地址设置为hook_jmp的返回地址,这样就能在第一次进入testHook函数并执行完毕返回时,能够跳转到被hook的地址(hookTest函数里第2句printf调用的地址)继续向下执行剩余的逻辑。

第131到132行:这两句汇编代码与第79到80行的两句汇编代码一致,都是将main函数里相应的代码地址设置为hook_jmp函数的ret返回地址,这样就能直接从hook_jmp跳转到main函数里继续向下执行,这样也就代表testHook被顺利的调用完成。

所以,总结下来,hook_jmp函数会进入两次,第一次用于监视一些数据,本例只监视了相关寄存器,还可以增加监视指定内存地址等等。第一次进入时,会保存被hook函数(testHook函数)的返回地址,并将其修改为hook_jmp函数的首地址,这样做是为了执行完testHook函数之后能够第二次进入hook_jmp函数。那么,第二次进入后,首先是判断是否还需要hook,不需要则直接返回到main函数里,如果还要继续hook,则再次调用hook函数,然后跳转到main函数里。这样就构成了一个严密的调用流程,一切都看起来很和谐的调用,有点类似缓冲区溢出攻击的原理。

hook_jmp函数中需要注意寄存器的保存,否则输出的寄存器值并不是testHook函数执行到hook位置时的寄存器状态,这样就丧失了监视的意义。

原理上其实比较简单,构建稍微细致了一些,与前两篇hook最大的不同就是需要手动修改ret的返回地址,从而达到hook的目的,不像之前的两篇hook,在进入hook函数之后,要回到被hook的函数时,只需要直接call就可以了,并不需要维护ret指令的返回地址。另外,由于本文的hook方式与第一篇的hook方式类似,所以本文的方式并没有支持多线程环境。
好了,本文到此结束,由于水平有限,可能存在bug,还望指教,衷心感谢!

inline HOOK啥意思的的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于inline HOOK啥意思的、inline HOOK啥意思的的信息别忘了在本站进行查找哦。

inlinehook原理(inline HOOK啥意思的)

本文编辑:admin

更多文章:


security的反义词(risk的反义词)

security的反义词(risk的反义词)

大家好,今天小编来为大家解答以下的问题,关于security的反义词,risk的反义词这个很多人还不知道,现在让我们一起来看看吧!

2026年9月22日 15:40

二郎神杨戬简笔画(二郎神怎么画)

二郎神杨戬简笔画(二郎神怎么画)

本篇文章给大家谈谈二郎神杨戬简笔画,以及二郎神怎么画对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月22日 10:50

service pack 3(操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思)

service pack 3(操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思)

大家好,关于service pack 3很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思的知识点,相信应该可以解决大家的一

2026年9月22日 10:20

html代码怎么写大佬教程(html网页的题来个大佬,写代码,题目在图上)

html代码怎么写大佬教程(html网页的题来个大佬,写代码,题目在图上)

本篇文章给大家谈谈html代码怎么写大佬教程,以及html网页的题来个大佬,写代码,题目在图上对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月22日 10:10

结构体内又一个struct(c++ 在结构体中再嵌入一个结构体如何调用)

结构体内又一个struct(c++ 在结构体中再嵌入一个结构体如何调用)

本篇文章给大家谈谈结构体内又一个struct,以及c++ 在结构体中再嵌入一个结构体如何调用对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月22日 09:40

next是什么意思英语(next是什么单词)

next是什么意思英语(next是什么单词)

本篇文章给大家谈谈next是什么意思英语,以及next是什么单词对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月22日 07:50

美国参议院人数(美国每个州的议员人数取决于什么)

美国参议院人数(美国每个州的议员人数取决于什么)

大家好,今天小编来为大家解答以下的问题,关于美国参议院人数,美国每个州的议员人数取决于什么这个很多人还不知道,现在让我们一起来看看吧!

2026年9月22日 05:20

高中信息技术python(高考信息技术用的是什么语言)

高中信息技术python(高考信息技术用的是什么语言)

今天给各位分享高考信息技术用的是什么语言的知识,其中也会对高考信息技术用的是什么语言进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月22日 02:50

cocos creator中文(cocoscreator和cocoscreator3d的区别)

cocos creator中文(cocoscreator和cocoscreator3d的区别)

各位老铁们好,相信很多人对cocos creator中文都不是特别的了解,因此呢,今天就来为大家分享下关于cocos creator中文以及cocoscreator和cocoscreator3d的区别的问题知识,还望可以帮助大家,解决大家的

2026年9月22日 02:30

二进制转换十进制函数(二进制如何转换成十进制数)

二进制转换十进制函数(二进制如何转换成十进制数)

这篇文章给大家聊聊关于二进制转换十进制函数,以及二进制如何转换成十进制数对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月22日 01:30

最近更新

手机网站模板怎么选择最合适?
2026-09-22 17:32:50 浏览:0
好域名注册应该怎么选才不会后悔?
2026-09-22 17:32:19 浏览:0
河南网站建设怎么选择合适的公司?
2026-09-22 17:31:51 浏览:0
热门文章

wait for you杨和苏(大家听下(wait for you)这首英文歌的开头那段音乐)
2026-06-13 16:20:04 浏览:22
刷关键字排名怎么操作最有效?
2026-09-14 20:02:13 浏览:14
oppo a9拆机教程(oppoa9拆机教程)
2026-06-13 10:40:02 浏览:12
标签列表