glibc源码分析(二)系统调用
在glibc源码中,许多系统调用被使用了.c封装的码分方式进行封装。这一过程借助嵌入式汇编,码分严格遵循系统调用封装规则。码分以stat函数为例,码分积分明细源码其实现揭示了.c封装的码分奥秘。
在源代码中,码分stat系统调用被INLINE_SYSCALL宏所封装。码分该宏首先调用INTERNAL_SYSCALL宏,码分执行系统调用并把返回值存入resultvar变量中。码分接下来,码分通过判断系统调用是码分否成功执行,采取相应的码分后续操作。若执行错误,码分则调用__syscall_error设置errno并返回-1;若执行成功,则返回resultvar。
在处理系统调用参数个数nr时,INTERNAL_SYSCALL宏发挥了关键作用。根据nr的不同,宏会调用不同的内部函数进行处理。例如,当nr为0时,调用INTERNAL_SYSCALL_MAIN_0宏,设置eax寄存器为系统调用号,执行*_dl_sysinfo函数进行系统调用。当nr为1时,宏将参数1存入ebx寄存器,同时设置eax寄存器为系统调用号,并执行系统调用。泰到位系统源码
类似的,nr为2、3、4、5或6时,宏分别会将参数2至6存入ecx、edx、esi、edi或ebp寄存器中,并与系统调用号相结合,执行*_dl_sysinfo函数。通过这一系列的嵌入式汇编操作,.c文件成功封装了系统调用,实现了高效、精确的调用过程。
总的来说,glibc中.c封装的实现展示了汇编语言的强大功能,以及在系统调用处理中的应用。通过精确的汇编指令和灵活的参数传递,封装过程确保了系统调用的执行效率和正确性。
edX专访:足不出户,让名校触手可及
您好,我是专注留学考试规划和留学咨询的小钟老师。留学申请的每一步都充满挑战,我在这里为您提供从留学目的地选择到申请材料准备的全方位支持。您的留学梦想,我们一同实现,敬请访问!/
前言
MOOC(大规模在线开放课程)市场如今已是仿大麦网站源码炙手可热,随着在线教育平台供应商和在线教育技术的不断优化,这一浪潮持续发酵并席卷中国。本期《我们专访》带你走近由美国麻省理工学院和哈佛大学联手创办的edX,探索它是如何实现在线教育的。
本期人物
Anant Agarwal
edX总裁
edX初认识
edX于年5月由哈佛大学和麻省理工学院共同建立,原麻省理工学院教授Anant Agarwal为发起人之一,首任总裁。edX是MOOC(大规模网络开放课程)的领导者,为所有人提供全球最著名大学和知名教授的优秀在线大学课程。目前,拥有注册用户1千6百万来自全球各地的注册用户,其中超过三万八千名的中国学生在edX平台上进行注册。
MOOC实现“翻转课堂”教学新模式
相对于传统的网络教学,MOOC有四个特点,第一是使得现有教学活动混合化;第二是大规模,一个课堂的容量是有限的,但MOOC的规模就非常大,也可能上万人来听课;第三个是个性化,适合每一个学习者个性化的学习;第四个社区化的讨论,参与的人很多。曾有专家做过一个分析,当你单向接受听课的时候,学习者能够记到的知识保持量大概只有5%,当你进行教学互动的时候,讨论者接受的知识保持量可以达到%。
因此,MOOC的出现也带来了一个新词“翻转课堂”——教师可以将在线视频作为教学的线上环节,要求学生在课堂外先“听课”,课堂内则侧重深入的紫紫红指标源码分享、探讨和问题解决。
edX总裁Anant Agarwal教授 在讲到“交互”于MOOC中体现时做了一个非常明确的比喻来——"从书本搬家到课程搬家"。Anant表示:“如果说传统在线教育就是一段又一段提前录制好的课程在网上播放的话,那么MOOC的体验更多是将‘交互’融入使用者身边。”
Anant认为,增加互动会使学习体验变得不一样,学生的学习行为和学习状态都在网上进行,也可以构成所谓的大数据。他强调事实上MOOC并不想取代所有线下的教学,特别是很密切的互动课堂场景,edX在做的是去促进这种课堂上的互动。同时,“翻转课堂”也为更深入更有针对性的师生互动提供了机遇,学生在公共课堂上学习后,再参加由学生、教师和助教组成的小班深入讨论,有针对性因材施教。
图:edX在线教育界面
小型私人在线课程提供更多学习机会
Anant说edX与大学之间的合作非常紧密,除了在网上发出一些MOOC的资源之外,edX还在本地大学有一些课程,这个课程叫做“小型私人在线课程”。关于这个私人在线课程,Anant表示如果学生没有条件上网的话,可以用这个课程和教授紧密互动,这是一个充分融合MOOC线上和线下的形式,也可以提升学生的在校体验成果。这是我们和其它平台非常大不同的一点,就是希望能够为无法接入互联网的同学们提供线下的学习机会。
而在近日举办的更多游戏游戏源码互联网教育创业者大会上,我们网创始人兼CEO伏彩瑞作为微观世界里成长起来的实际操作者,在谈到互联网教育时也说,“互联网的成分是%,而教育的成分是%。”他认为互联网教育的本质还是教育,在线只是手段。我们网CFO于杰则表示,在线教育需要各个细分领域的专注耕耘之后,才会有紧密的开放合作,最终实现用户体验的提升。
落地中国,开启"学堂在线"
年月,清华大学基于edX开放源代码研发出中文在线教育平台“学堂在线”。平台分为在线学习系统和课程管理系统。学生通过注册登录可以自由选课、听课和参与社区讨论,系统会根据听课进度给出练习题目及评分;教师可通过系统上传上课视频、添加教学资料及练习题,并能及时查看学习反馈情况。
edX总裁Anant认为使用“学堂在线”平台的学生需要有很强的自主性,并且要有冒险精神,在线教育的学习对学生们进一步深造或职场中都会有很大的作用。MOOC学习需要学生主动性很强,而不是传统课程上有的学生或许只是被动"出席"。在MOOC学习中,学生则更需要主动去寻找资料,完成功课,进行研究,所以很多大学和企业青睐学过MOOC的学生。
许多学员比较关注结课后的证书,Anant表示,edX和全球各地的许多大学是合作的伙伴,这些学校在edX平台上开设课程,学生能够选修到这些课程,并且通过的话会得到这些学校所发的一些证书,这些证书如果是清华大学发布的就叫清华edX证书,和他们本身学校的证书是不同的品牌。关于这些证书的价值,Anant觉得有非常大的价值,学生可以把这个经历加在他的简历里来申请工作,或者申请跟高等教育相关的一些院校。
图:edX总裁Anant教授介绍互联网教育
MOOC对学习者与教育者都是好消息
Anant教授认为MOOC对全世界学生、教育者都是好消息。对于学习者来说,能够在付出同等教育经费前提下获得更高质量的教育,实际上就等于节约了学习者的教育成本。不过,他也表示,要关注的不仅仅是降低教育成本,更需要关注如何提高教育质量——关注教育的效率。而MOOC正是为学习者、教育者提供了一种通过混合式教育来提升教育质量的方式。
今后,MOOC也可以降低同样质量教学的教学成本。这就意味着同等的教育成本下,教育质量会上升;同等的教育质量下,教育成本会下降。对于世界各地学生来说,无论哪种结果都是好消息。
对MOOC学习者的建议
Anant教授认为MOOC学习需要学生的主动性很强。像在传统大学课堂上,教授会要求学生出席,而学生在课堂上不管是玩游戏还是干别的事情都可能。在MOOC学习中,学生则更需要主动性,需要主动去寻找资料,完成功课,进行研究。
同时,Anant也强调MOOC学习也能给学生带来很多机会。学生能取得在线学习的相关认证。这不管是对于学生进入职场,还是选择国内外大学继续深造,都等起到很大的帮助作用。总的来说,MOOC的学习模式要求学生较高的主动性,以及尝试在线学习的冒险精神。
回顾,可谓是国内在线教育风起云涌的一年,互联网巨头、新晋创业者和传统的教育机构都在向在线教育领域进军。无论是C2C或者B2C,把在线教育当成教育行业的一个分支,又把它做的不像原来大家印象中的教育,有这样专注、创新和颠覆的精神或许才能给在线教育找到一个新出路。
>>点击查看我们专访专题
我希望以上的解答能为您的留学规划添砖加瓦。留学之路虽曲折,却不孤单。如有更多疑惑或需要进一步了解,我们的官方网站随时欢迎您。那里有更详尽的留学资讯和专家团队的一对一指导,助您顺利走上留学之路。期待与您的每一次相遇,祝申请顺利!/
揭秘数据解密的关键技术目录
第1章:数据解密基础 1.1 数据解密概述 数据解密涉及通过技术手段揭示隐藏在代码或数据中的信息,包括代码逆向工程和数据逆向工程。这些方法旨在理解和操作程序的内部工作。 1.2 解密方法 1.2.1 黑盒分析法:从外部观察程序行为,不涉及内部结构。 1.2.2 白盒分析法:深入理解程序源代码,直接查看内部逻辑。 1.3 汇编语言的应用 汇编语言,特别是位和位的x汇编,因其灵活性和直接操作硬件的能力,是数据解密的重要工具。 1.4 寄存器及其作用 EAX、EBX、ECX和EDX寄存器用于存储临时数据,而ESI和EDI则用于处理地址信息。EBP和ESP则分别管理堆栈和局部变量。 1.5 指针和标志寄存器 理解EFLAGS寄存器的标志位有助于跟踪程序状态,而指针寄存器则在数据操作中扮演关键角色。 1.6 寻址方式 不同寻址方式有助于解密者定位和操作内存中的数据,与高级语言的数据结构和寻址方式紧密相关。 1.9 指令详解 Intel和AT&T格式的指令提供了核心的运算和控制流操作,如MOV、XCHG、PUSH、POP等。 1. 函数调用和字节码 函数调用约定影响参数传递,常见的有三种方式,理解其规则对解密至关重要。字节码的差异揭示了代码的底层构造。 第2章:高级汇编代码理解 2.1 比较C语言与汇编的常量、指针和变量 2.2 汇编中的字符串和数组,与C语言对应结构的实现原理。 2.3 结构体和条件分支语句的汇编实现,与C语言的相似性和差异。 2.4 循环结构在汇编中的体现,如while、do...while和for的实现机制。扩展资料
《揭秘数据解密的关键技术》是一本以游戏资源文件格式为研究对象的数据逆向工程的技术书籍,主要讲解如何分析和研究自定义文件格式的数据结构。VC++ MFCå¦ä½è·åCPU IDå硬ççåºåå·ï¼
// âè·å¾Intel CPU IDâæé®æ¶æ¯å¤çå½æ°
void CIntelCPUIDDlg::OnBtnCPUID()
{
unsigned long s1,s2;
unsigned char vendor_id[]="------------";//CPUæä¾åID
CString str1,str2,str3;
// 以ä¸ä¸ºè·å¾CPU IDçæ±ç¼è¯è¨æ令
_asm // å¾å°CPUæä¾åä¿¡æ¯
{
xor eax,eax // å°eaxæ¸ 0
cpuid // è·åCPUIDçæ令
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
str1.Format("%s",vendor_id);
_asm // å¾å°CPU IDçé«ä½
{
mov eax,h
xor edx,edx
cpuid
mov s2,eax
}
str2.Format("%X-",s2);
_asm // å¾å°CPU IDçä½ä½
{
mov eax,h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
str3.Format("%X-%X\n",s1,s2);
str2=str2+str3;
m_editVendor.SetWindowText(str1);
m_editCPUID.SetWindowText(str2);
}
// GetHDSerial.cpp: implementation of the CGetHDSerial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GetHDSerial.h"
char m_buffer[];
WORD m_serial[];
DWORD m_OldInterruptAddress;
DWORDLONG m_IDTR;
// çå¾ ç¡¬ç空é²
static unsigned int WaitHardDiskIdle()
{
BYTE byTemp;
Waiting:
_asm
{
mov dx, 0x1f7
in al, dx
cmp al, 0x
jb Endwaiting
jmp Waiting
}
Endwaiting:
_asm
{
mov byTemp, al
}
return byTemp;
}
//ä¸ææå¡ç¨åº
void _declspec( naked )InterruptProcess(void)
{
int byTemp;
int i;
WORD temp;
//ä¿åå¯åå¨å¼
_asm
{
push eax
push ebx
push ecx
push edx
push esi
}
WaitHardDiskIdle();//çå¾ ç¡¬ç空é²ç¶æ
_asm
{
mov dx, 0x1f6
mov al, 0xa0
out dx, al
}
byTemp = WaitHardDiskIdle(); //è¥ç´æ¥å¨Ring3级æ§è¡çå¾ å½ä»¤ï¼ä¼è¿å ¥æ»å¾ªç¯
if ((byTemp&0x)!=0x)
{
_asm // æ¢å¤ä¸æç°åºå¹¶éåºä¸ææå¡ç¨åº
{
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
}
}
_asm
{
mov dx, 0x1f6 //å½ä»¤ç«¯å£1f6,éæ©é©±å¨å¨0
mov al, 0xa0
out dx, al
inc dx
mov al, 0xec
out dx, al //åé读驱å¨å¨åæ°å½ä»¤
}
byTemp = WaitHardDiskIdle();
if ((byTemp&0x)!=0x)
{
_asm // æ¢å¤ä¸æç°åºå¹¶éåºä¸ææå¡ç¨åº
{
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
}
}
//读å硬çæ§å¶å¨çå ¨é¨ä¿¡æ¯
for (i=0;i<;i++)
{
_asm
{
mov dx, 0x1f0
in ax, dx
mov temp, ax
}
m_serial[i] = temp;
}
_asm
{
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGetHDSerial::CGetHDSerial()
{
}
CGetHDSerial::~CGetHDSerial()
{
}
// 读å硬çåºåå·å½æ°
char* CGetHDSerial::GetHDSerial()
{
m_buffer[0]='\n';
// å¾å°å½åæä½ç³»ç»çæ¬
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &OSVersionInfo);
if (OSVersionInfo.dwPlatformId != VER_PLATFORM_WIN_NT)
{
// Windows 9x/MEä¸è¯»å硬çåºåå·
WORD m_wWin9xHDSerial[];
Win9xReadHDSerial(m_wWin9xHDSerial);
strcpy (m_buffer, WORDToChar (m_wWin9xHDSerial, , ));
}
else
{
// Windows NT//XPä¸è¯»å硬çåºåå·
DWORD m_wWinNTHDSerial[];
// å¤ææ¯å¦æSCSI硬ç
if ( ! WinNTReadIDEHDSerial(m_wWinNTHDSerial))
WinNTReadSCSIHDSerial(m_wWinNTHDSerial);
strcpy (m_buffer, DWORDToChar (m_wWinNTHDSerial, , ));
}
return m_buffer;
}
// Windows9X/MEç³»ç»ä¸è¯»å硬çåºåå·
void _stdcall CGetHDSerial::Win9xReadHDSerial(WORD * buffer)
{
int i;
for(i=0;i<;i++)
buffer[i]=0;
_asm
{
push eax
//è·åä¿®æ¹çä¸æçä¸ææ述符ï¼ä¸æé¨ï¼å°å
sidt m_IDTR
mov eax,dword ptr [m_IDTR+h]
add eax,3*h+h
cli
//ä¿ååå çä¸æå ¥å£å°å
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-h]
mov dword ptr m_OldInterruptAddress,ecx
pop ecx
//设置修æ¹çä¸æå ¥å£å°å为æ°çä¸æå¤çç¨åºå ¥å£å°å
push ebx
lea ebx,InterruptProcess
mov word ptr [eax-h],bx
shr ebx,h
mov word ptr [eax+h],bx
pop ebx
//æ§è¡ä¸æï¼è½¬å°Ring 0ï¼ç±»ä¼¼CIHç æ¯åçï¼
int 3h
//æ¢å¤åå çä¸æå ¥å£å°å
push ecx
mov ecx,dword ptr m_OldInterruptAddress
mov word ptr [eax-h],cx
shr ecx,h
mov word ptr [eax+h],cx
pop ecx
sti
pop eax
}
for(i=0;i<;i++)
buffer[i]=m_serial[i];
}
// Windows 9x/MEç³»ç»ä¸ï¼å°åç±»åï¼WORDï¼ç硬çä¿¡æ¯è½¬æ¢ä¸ºå符类åï¼charï¼
char * CGetHDSerial::WORDToChar (WORD diskdata [], int firstIndex, int lastIndex)
{
static char string [];
int index = 0;
int position = 0;
// æç §é«åèå¨åï¼ä½åèå¨åç顺åºå°åæ°ç»diskdata ä¸å 容åå ¥å°å符串stringä¸
for (index = firstIndex; index <= lastIndex; index++)
{
// åå ¥åä¸çé«åè
string [position] = (char) (diskdata [index] / );
position++;
// åå ¥åä¸çä½åè
string [position] = (char) (diskdata [index] % );
position++;
}
// æ·»å å符串ç»ææ å¿
string [position] = '\0';
// å é¤å符串ä¸ç©ºæ ¼
for (index = position - 1; index > 0 && ' ' == string [index]; index--)
string [index] = '\0';
return string;
}
// Windows NT//XPç³»ç»ä¸ï¼å°ååç±»åï¼DWORDï¼ç硬çä¿¡æ¯è½¬æ¢ä¸ºå符类åï¼charï¼
char* CGetHDSerial::DWORDToChar (DWORD diskdata [], int firstIndex, int lastIndex)
{
static char string [];
int index = 0;
int position = 0;
// æç §é«åèå¨åï¼ä½åèå¨åç顺åºå°ååä¸çä½ååå ¥å°å符串stringä¸
for (index = firstIndex; index <= lastIndex; index++)
{
// åå ¥ä½åä¸çé«åè
string [position] = (char) (diskdata [index] / );
position++;
// åå ¥ä½åä¸çä½åè
string [position] = (char) (diskdata [index] % );
position++;
}
// æ·»å å符串ç»ææ å¿
string [position] = '\0';
// å é¤å符串ä¸ç©ºæ ¼
for (index = position - 1; index > 0 && ' ' == string [index]; index--)
string [index] = '\0';
return string;
}
// Windows NT//XPä¸è¯»åIDE硬çåºåå·
BOOL CGetHDSerial::WinNTReadIDEHDSerial(DWORD * buffer)
{
BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
BOOL bFlag = FALSE;
int drive = 0;
char driveName [];
HANDLE hPhysicalDriveIOCTL = 0;
sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
// Windows NT//XPä¸å建æ件éè¦ç®¡çåæé
hPhysicalDriveIOCTL = CreateFile (driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
GETVERSIONOUTPARAMS VersionParams;
DWORD cbBytesReturned = 0;
// å¾å°é©±å¨å¨çIOæ§å¶å¨çæ¬
memset ((void*) &VersionParams, 0, sizeof(VersionParams));
if(DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_GET_VERSION,
NULL, 0, &VersionParams,
sizeof(VersionParams),
&cbBytesReturned, NULL) )
{
if (VersionParams.bIDEDeviceMap > 0)
{
BYTE bIDCmd = 0; // IDEæè ATAPIè¯å«å½ä»¤
SENDCMDINPARAMS scip;
// å¦æ驱å¨å¨æ¯å 驱ï¼éç¨å½ä»¤IDE_ATAPI_IDENTIFYï¼ command,
// å¦åéç¨å½ä»¤IDE_ATA_IDENTIFY读å驱å¨å¨ä¿¡æ¯
bIDCmd = (VersionParams.bIDEDeviceMap >> drive & 0x)?
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset (&scip, 0, sizeof(scip));
memset (IdOutCmd, 0, sizeof(IdOutCmd));
// è·å驱å¨å¨ä¿¡æ¯
if (WinNTGetIDEHDInfo (hPhysicalDriveIOCTL,
&scip,
(PSENDCMDOUTPARAMS)&IdOutCmd,
(BYTE) bIDCmd,
(BYTE) drive,
&cbBytesReturned))
{
int m = 0;
USHORT *pIdSector = (USHORT *)
((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;
for (m = 0; m < ; m++)
buffer[m] = pIdSector [m];
bFlag = TRUE; // 读å硬çä¿¡æ¯æå
}
}
}
CloseHandle (hPhysicalDriveIOCTL); // å ³éå¥æ
}
return bFlag;
}
// WindowsNT//XPç³»ç»ä¸è¯»åSCSI硬çåºåå·
BOOL CGetHDSerial::WinNTReadSCSIHDSerial (DWORD * buffer)
{
buffer[0]='\n';
int controller = 0;
HANDLE hScsiDriveIOCTL = 0;
char driveName [];
sprintf (driveName, "\\\\.\\Scsi%d:", controller);
// Windows NT//XPä¸ä»»ä½æéé½å¯ä»¥è¿è¡
hScsiDriveIOCTL = CreateFile (driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
{
int drive = 0;
DWORD dummy;
for (drive = 0; drive < 2; drive++)
{
char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
SENDCMDINPARAMS *pin =
(SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
// åå¤åæ°
memset (buffer, 0, sizeof (buffer));
p -> HeaderLength = sizeof (SRB_IO_CONTROL);
p -> Timeout = ;
p -> Length = SENDIDLENGTH;
p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
strncpy ((char *) p -> Signature, "SCSIDISK", 8);
pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
pin -> bDriveNumber = drive;
// å¾å°SCSI硬çä¿¡æ¯
if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,
buffer,
sizeof (SRB_IO_CONTROL) +
sizeof (SENDCMDINPARAMS) - 1,
buffer,
sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
&dummy, NULL))
{
SENDCMDOUTPARAMS *pOut =
(SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
if (pId -> sModelNumber [0])
{
int n = 0;
USHORT *pIdSector = (USHORT *) pId;
for (n = 0; n < ; n++)
buffer[n] =pIdSector [n];
return TRUE; // 读åæå
}
}
}
CloseHandle (hScsiDriveIOCTL); // å ³éå¥æ
}
return FALSE; // 读å失败
}
// Windows NT//XPä¸è¯»åIDE设å¤ä¿¡æ¯
BOOL CGetHDSerial::WinNTGetIDEHDInfo (HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,
PDWORD lpcbBytesReturned)
{
// 为读å设å¤ä¿¡æ¯åå¤åæ°
pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
pSCIP -> irDriveRegs.bFeaturesReg = 0;
pSCIP -> irDriveRegs.bSectorCountReg = 1;
pSCIP -> irDriveRegs.bSectorNumberReg = 1;
pSCIP -> irDriveRegs.bCylLowReg = 0;
pSCIP -> irDriveRegs.bCylHighReg = 0;
// 计ç®é©±å¨å¨ä½ç½®
pSCIP -> irDriveRegs.bDriveHeadReg = 0xA0 | ((bDriveNum & 1) << 4);
// 设置读åå½ä»¤
pSCIP -> irDriveRegs.bCommandReg = bIDCmd;
pSCIP -> bDriveNumber = bDriveNum;
pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
// 读å驱å¨å¨ä¿¡æ¯
return ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_GET_DRIVE_INFO,
(LPVOID) pSCIP,
sizeof(SENDCMDINPARAMS) - 1,
(LPVOID) pSCOP,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
lpcbBytesReturned, NULL) );
}
冲击波病毒病毒反汇编源码
这部分代码是冲击波病毒的反汇编源码片段,它包含了多个指令和操作。首先,有两条指令(F6 and esi,esi 和 1AFC sbb bh,ah)对esi和esi以及bh和ah进行操作。接下来的( DDDC xor eax,4DC9DD3)执行异或操作,改变eax的值。然后是pop edx,wait和cli指令,可能用于控制程序流程和中断处理。 在后面的代码中,有mov ebp,FFD和mov dl,0C3等,用以设置内存地址和执行特定操作。cmps指令用于比较内存中的字节,push esp和inc/dec esi等操作用于数据处理。未知命令(E2 F4 loopd和C6?)可能代表未识别的循环指令。test al,7B和jpo等指令用于条件判断。 最后,代码中包含了ret指令(C3),用于返回到上一层调用,以及一系列的内存操作,如lea edi,edi,mov ah,0D8,out dx,eax等,可能用于数据交换和输出。整体来看,这部分源码执行了一系列复杂的指令,用于执行病毒的特定功能,如数据比较、内存操作和控制流程。扩展资料
冲击波(Worm.Blaster)病毒是利用微软公司在7月日公布的RPC漏洞进行传播的,只要是计算机上有RPC服务并且没有打安全补丁的计算机都存在有RPC漏洞,具体涉及的操作系统是:Windows、XP、Server 。2024-12-24 00:31
2024-12-23 23:44
2024-12-23 23:34
2024-12-23 23:22
2024-12-23 23:15