Linux汇编是Linux内核的一部分,同时也是操作系统开发中最重要的一个组件。它可以帮助程序员更快、更有效地编写代码,增加系统效率,有助于实现大量功能。
Linux汇编体现在指令级编程,程序员可以编写代码来实现控制CPU,内存和其他硬件部件。它提供了最直接、最有效的访问硬件,程序员可以很容易地对程序进行高性能及开销较小的精细调整。
由于Linux汇编可以在操作系统的底层进行,因此可以实现优化的硬件性能。其中的指令既可以指导硬件如何显示计算结果,也可以转换数据以便发送到内部或外部设备。此外,Linux汇编还可以帮助程序员使用多种指令集,以改善程序的性能。
此外,Linux汇编还可以确保操作系统具有最优性能,更新Linux系统时可以避免错误。正因为其可以安全使用内存和CPU系统,Linux
服务器
框架可以运行更安全、高效的应用。
另外,Linux汇编可以实现基于bit的操作,用于实现精细的控制。它可以像位移、置位和清除某些寄存器位等位操作,有助于更安全、更高效地管理处理器资源。
总的来说,Linux汇编是操作系统推动前进的动力。它可以使操作系统更快更安全,可以帮助程序员更有效地完成任务,也可以提供有效的硬件访问和内存管理。如果你有足够的知识和经验,能够高效率使用Linux汇编,那么你就可以实现系统之间的性能及可移植性。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
什么是花指令
什 么是花指令?当然不是flower code,呵呵,实际上,把它按照“乱指令”来理解可能更贴切一些,它的真正英文名应该叫thunkcode吧(不确定,呵呵)。
我们知道,汇编语 言其实就是机器指令的符号化,从某种程度上看,它只是更容易理解一点的机器指令而已。
每一条汇编语句,在汇编时,都会根据cpu特定的指令符号表将汇编指 令翻译成二进制代码。
而日常应用中,我们通过VC的IDE或其它如OD等反汇编、反编译软件也可以将一个二进制程序反汇编成汇编代码。
机器的一般格式为: 指令+数据。
而反汇编的大致过程是:首先会确定指令开始的首地址,然后根据这个指令字判断是哪个汇编语句,然后再将后面的数据反汇编出来。
由此,我们可以 看到,在这一步的反汇编过程中存在漏洞:如果有人故意将错误的机器指令放在了错误的位置,那反汇编时,就有可能连同后面的数据一起错误地反汇编出来,这 样,我们看到的就可能是一个错误的反汇编代码。
这就是“花指令”,简而言之,花指令是利用了反汇编时单纯根据机器指令字来决定反汇编结果的漏洞。
先举个例子(记为A代码段):jz labeljnz labeldb thunkcodelabel:以上是一个相当简单的花指令块,其中thunkcode是由应用者自己随便写的机器指令字,当然,你写的这个机器指令字不能是单字节指令(比如nop, clr,等),否则,你的花指字就相当于白加了。
那么,你要如何来使用这段代码呢?假设我们待加密的代码块如下(记为B代码段):mov ax, 8xor ax, 77...我们假设这B代码段是我们的加密算法所在的代码段,现在我们想要对B代码段进行保护,可以直接将A花指令块加到mov指令之前,形如:jz labeljnz labeldb thunkcodelabel:mov ax, 8xor ax, 77...其中,对于thunkcode,在实际使用时,可以使用任何一个多字节指令的机器指令字来代替,这样就会欺骗反汇编软件将它连同后面的mov指令的前边某一部分反汇编成一个多字节指令。
这样,我们的目的也就达到了。
由上可以看到,使用了花指令的地方,一般都会出现这样的现象:一个跳转指令,跳转到了某条语句的中间位置,而不是这条语句的开始位置。
每当出现这种情况时,我们就可以断定,这里出现了花指令。
显然地,破解它的办法,就是在那个跳转到的目的地址之前将中间的代码全部nop掉。
当然,为了加强难度,我们可以将若干个花指令结合起来使用。
比如:jz labeljnz labeldb thunkcodelabel:jz label2jnz label2db thunkcodelable2mov ax, 8xor ax, 77...也当然,针对这种情况的破解只要一层层解开它即可:我们可以先破解到以label为首字节的指令出现为止,然后再根据新的结果,破解到以label2为首字节的指令出现为止,虽然这样麻烦点,但还是不难的。
但是,如果把下面的这段代码再同其它花指令结合起来使用,可能就更复杂了:call label_1db thunkcodejmp label_2db thunkcodelabel_1:pop eaxjmp label_3db thunkcode,thunkcode,thunkcodelabel_3:inc eaxjmp label_4db thunkcode,thunkcode,thunkcodelabel_4:jmp eaxdb thunkcodelabel_2:....这里还有一段:call label_1db thunkcode,thunkcodejmp label_4label_1:pop eaxjmp label_2db thunkcode,thunkcodelabel_2:add eax,2jmp label_3db thunkcodelabel_3:push eaxretdb thunkcodelabel_4: ....为了加强难度,尽可能地用call和push实现间接跳转,当然,矛矛盾盾,只是时间长点而已,世上没有绝对安全的系统。
四、一些典型的花指令实例: Not Found
c语言编写计算器
#include stdio.h #include string.h #include ctype.h #include math.h //expression evaluate #define iMUL 0 #define iDIV 1 #define iADD 2 #define iSUB 3 #define iCap 4 //#define LtKH 5 //#define RtKH 6 #define MaxSize 100 void iPush(float); float iPop(); float StaOperand[MaxSize]; int iTop=-1; // char Srcexp[MaxSize]; char Capaexp[MaxSize]; char RevPolishexp[MaxSize]; float NumCapaTab[26]; char validexp[]=*/+-(); char NumSets[]=; char StackSymb[MaxSize]; int operands; // void NumsToCapas(char [], int , char [], float []); int CheckExpress(char); int PriorChar(char,char); int GetOperator(char [], char); void counterPolishexp(char INexp[], int slen, char Outexp[]); float CalcRevPolishexp(char [], float [], char [], int); void main() { int ilen; float iResult=0.0; printf(enter a valid number string:\n); memset(StackSymb,0,MaxSize); memset(NumCapaTab,0,26); //A--NO.1, B--NO.2, etc. gets(Srcexp); ilen=strlen(Srcexp); //printf(source expression:%s\n,Srcexp); NumsToCapas(Srcexp,ilen,Capaexp,NumCapaTab); printf(Numbers listed as follows:\n); int i; for (i=0; i-1) return StaOperand[iTop--]; return -1.0; } void NumsToCapas(char Srcexp[], int slen, char Capaexp[], float NumCapaTab[]) { char ch; int i, j, k, flg=0; int sign; float val=0.0,power=10.0; i=0; j=0; k=0; while (i
-1) { sval=iPop(); } return sval; } int GetOperator(char validexp[],char oper) { int oplen,i=0; oplen=strlen(validexp); if (!oplen) return -1; if(isalpha(oper)) return 4; while(i
=4) return -1; return i; } int CheckExpress(char ch) { int i=0; char cc; while((cc=validexp[i]) && ch!=cc) ++i; if (!cc) return 0; return 1; } int PriorChar(char curch, char stach) { //栈外优先级高于(>)栈顶优先级时,才入栈 //否则(<=),一律出栈 if (curch==stach) return 0; //等于时应该出栈 else if (curch==* || curch==/) { if(stach!=* && stach!=/) return 1; } else if (curch==+ || curch==-) { if (stach==( || stach==)) return 1; } else if (curch==() { if (stach==)) return 1; } return 0; } void counterPolishexp(char INexp[], int slen, char Outexp[]) { int i, j, k,pr; char t; i=0; j=k=0; while (INexp[i]!== && i
从键盘输入一个二位十进制的月份数(01-12),然后显示出相应英文缩写名。用汇编语言实现,最好有流程图
自己做了一个C程序,从C转汇编,希望对你有用:#include #include void main(){ char mon[12][4]; sprintf(mon[0],%s, Jan\0); sprintf(mon[1],%s, Feb\0); sprintf(mon[2],%s, Mar\0); sprintf(mon[3],%s, Apr\0); sprintf(mon[4],%s, May\0); sprintf(mon[5],%s, Jun\0); sprintf(mon[6],%s, Jul\0); sprintf(mon[7],%s, Aug\0); sprintf(mon[8],%s, Sep\0); sprintf(mon[9],%s, Oct\0); sprintf(mon[10],%s, Nov\0); sprintf(mon[11],%s, Dec\0); int a = getchar()-48; int b = getchar()-48; a = a*10 + b; if(a<=12) {printf(mon[a-1]); }}汇编:pushebpmov ebp,esp sub esp,114h pushebxpushesipushedilea edi,[ebp-114h] mov ecx,45h mov eax,0CCCCCCCCh rep stosdword ptr es:[edi] mov eax,dword ptr [___security_cookie (h)] xor eax,ebp mov dword ptr [ebp-4],eax mov esi,esp pushoffset string Jan\0 (415A20h) pushoffset string %s (h) lea eax,[ebp-38h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Feb\0 (h) pushoffset string %s (h) lea eax,[ebp-34h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Mar\0 (415A18h) pushoffset string %s (h) lea eax,[ebp-30h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string May (h) pushoffset string %s (h) lea eax,[ebp-2Ch] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string May\0 (415A10h) pushoffset string %s (h) lea eax,[ebp-28h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Jul (4157B0h) pushoffset string %s (h) lea eax,[ebp-24h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Jul\0 (415A08h) pushoffset string %s (h) lea eax,[ebp-20h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Aug\0 (4157A8h) pushoffset string %s (h) lea eax,[ebp-1Ch] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Sep\0 (415A00h) pushoffset string %s (h) lea eax,[ebp-18h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Nov (4157A0h) pushoffset string %s (h) lea eax,[ebp-14h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Nov\0 (4158B4h) pushoffset string %s (h) lea eax,[ebp-10h] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp pushoffset string Dec\0 (h) pushoffset string %s (h) lea eax,[ebp-0Ch] pusheaxcalldword ptr [__imp__sprintf (4182C8h)] add esp,0Ch cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esi,esp calldword ptr [__imp__getchar (4182BCh)] cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) sub eax,30h mov dword ptr [ebp-44h],eax mov esi,esp calldword ptr [__imp__getchar (4182BCh)] cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) sub eax,30h mov dword ptr [ebp-50h],eax mov eax,dword ptr [ebp-44h] imuleax,eax,0Ah add eax,dword ptr [ebp-50h] mov dword ptr [ebp-44h],eax cmp dword ptr [ebp-44h],0Ch jgmain+1FEh (4137BEh) mov eax,dword ptr [ebp-44h] lea ecx,[ebp+eax*4-3Ch] mov esi,esp pushecxcalldword ptr [__imp__printf (4182C4h)] add esp,4 cmp esi,esp call@ILT+310(__RTC_CheckEsp) (Bh) xor eax,eax pushedxmov ecx,ebp pusheaxlea edx,[ (4137F0h)] call@ILT+130(@_RTC_CheckStackVars@8) (h) pop eaxpop edxpop edipop esipop ebxmov ecx,dword ptr [ebp-4] xor ecx,ebp call@ILT+25(@__security_check_cookie@4) (Eh) add esp,114h cmp ebp,esp call@ILT+310(__RTC_CheckEsp) (Bh) mov esp,ebp pop ebpretnop
发表评论