首页
社区
课程
招聘
[旧帖] 如何用内联汇编编写一个对话框,不用C中的变量 0.00雪花
发表于: 2011-5-20 15:04 4187

[旧帖] 如何用内联汇编编写一个对话框,不用C中的变量 0.00雪花

2011-5-20 15:04
4187
如何用内联汇编编写一个对话框(要求:一定不能用c中的变量,一定要用内联汇编
我写了一个,但是出错了,请打家帮帮忙?
代码如下:
__asm
	{    
shell:  PUSHAD
			MOV  EAX,DWORD PTR FS:[30H]		
			MOV  EAX,DWORD PTR [EAX+0CH]	
			MOV  EAX,DWORD PTR [EAX+1CH]	
			MOV  EAX,DWORD PTR [EAX]		
			MOV  EAX,DWORD PTR [EAX+08H]	
			MOV  EBP,EAX					
			MOV  EAX,DWORD PTR [EAX+3CH]	
			MOV  EAX,DWORD PTR [EBP+EAX+120]
			MOV  ECX,[EBP+EAX+24]			
			MOV  EBX,[EBP+EAX+32]			
			ADD  EBX,EBP
			PUSH WORD  PTR 0X00				
			PUSH DWORD PTR 0X73736572
			PUSH DWORD PTR 0X64644163
			PUSH DWORD PTR 0X6F725074     			                                
                                                PUSH WORD PTR 0X6547  			          
                                                MOV  EDX,ESP
			PUSH ECX
			
F1:  
		MOV  EDI,EDX
			POP  ECX ;导出表中导出函数名字的数目
			DEC  ECX
			TEST  ECX,ECX
			JZ  EXIT
			MOV  ESI,[EBX+ECX*4] ;取出一个函数  
			ADD  ESI,EBP ;函数真实地址
			PUSH  ECX
			MOV  ECX,15
			REPZ  CMPSB  ;比较edi,esi是否相等
			TEST  ECX,ECX
			JNZ  F1
			
			POP  ECX
			MOV  ESI,[EBP+EAX+36]			
			ADD  ESI,EBP
			MOVZX  ESI,WORD PTR[ESI+ECX*2]	
			MOV  EDI,[EBP+EAX+28]			
			ADD  EDI,EBP
			MOV  EDI,[EDI+ESI*4]			
			ADD  EDI,EBP    ;取得GetProcAddress函数的地址
			;mov EDX, addr
			
			;mov [EDX+aGetProcAddress],EDI
			
			PUSH WORD PTR 0X00				
			PUSH DWORD PTR 0X41797261
			PUSH DWORD PTR 0X7262694C
			PUSH DWORD PTR 0X64616F4C
			PUSH ESP
			PUSH  EBP
			CALL  EDI
			ADD ESP,7

			;mov EDX, addr
			;mov [EDX+aLoadLibrary], EAX
			
			
			;mov EBX, [EDX+u32]
			;push EBX
			;CALL  EAX
			PUSH WORD PTR 0X00
			PUSH DWORD PTR 0X6C6C642E      .
			PUSH DWORD PTR 0X32337265        .
			PUSH WORD PTR 0X7355           ;
			PUSH ESP
			CALL EAX    ;user32.dll的基址
			MOV EDX,EAX
			ADD ESP,7

			PUSH WORD PTR 0X00
			PUSH DWORD PTR 0X0041786F  ;
			PUSH DWORD PTR 0X42656761   ;
			PUSH WORD PTR 0X7373;se
			PUSH WORD PTR 0X654D   ;
			PUSH ESP
			PUSH EDX
			CALL EDI
			MOV EBX,EAX ;MessageBox地址
			ADD ESP,7

			 			
			PUSH WORD PTR 0X00
			PUSH DWORD PTR 0X41424344 显示内容;
			PUSH DWORD PTR 0X31323334
			LEA ECX,[ESP+0]
			PUSH WORD PTR 0X00
			PUSH DWORD PTR 0X61486148 ; 标题;
			LEA EDX,[ESP+0]
			PUSH 40H+1000H
			PUSH ECX
			PUSH EDX
			PUSH 0
			CALL EBX ;调用MessagBoxA
			ADD ESP,7

 EXIT:  ADD ESP,5							
	   POPAD

运行后如图:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 273
活跃值: (64)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
shellcode最下面的部分有问题,的shellcode中对字符串的处理,push  word 0x00这个指令不对,第二引用的地址不对,lea ecx,[esp]  esp的内容就是当前栈顶,你加上[]它实际上把字符串的值当成了地址。参考下面修改后的代码,你加到vc内联汇编中就行,在od中能正常运行

push 0
push 0x41424344
push 31323334
mov ecx,esp
push 0
push 0X61486148
mov edx,esp
push 0
push edx
push ecx
push 0
call ebx
2011-5-21 05:13
0
雪    币: 299
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
谢谢你哦,但是你的方法我试了,在内联汇编中使用仍然出现原来的错...
2011-5-22 16:18
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是我修改后的代码
去掉了里面的一些堆栈平衡的 "add esp,7",不是所有的函数调用都用 add esp,7的
改成如下,红色是我加入的代码,去掉了你原来的堆栈平衡代码
__asm
  {   
shell:  PUSHAD
  mov ebp,esp      
MOV  EAX,DWORD PTR FS:[30H]   
      MOV  EAX,DWORD PTR [EAX+0CH]  
      MOV  EAX,DWORD PTR [EAX+1CH]  
      MOV  EAX,DWORD PTR [EAX]   
      MOV  EAX,DWORD PTR [EAX+08H]  
      MOV  EBP,EAX         
      MOV  EAX,DWORD PTR [EAX+3CH]  
      MOV  EAX,DWORD PTR [EBP+EAX+120]
      MOV  ECX,[EBP+EAX+24]      
      MOV  EBX,[EBP+EAX+32]      
      ADD  EBX,EBP
      PUSH WORD  PTR 0X00        
      PUSH DWORD PTR 0X73736572
      PUSH DWORD PTR 0X64644163
      PUSH DWORD PTR 0X6F725074                                          
      PUSH WORD PTR 0X6547                  
      MOV  EDX,ESP
      PUSH ECX
      
F1:  
    MOV  EDI,EDX
      POP  ECX ;导出表中导出函数名字的数目
      DEC  ECX
      TEST  ECX,ECX
      JZ  EXIT
      MOV  ESI,[EBX+ECX*4] ;取出一个函数  
      ADD  ESI,EBP ;函数真实地址
      PUSH  ECX
      MOV  ECX,15
      REPZ  CMPSB  ;比较edi,esi是否相等
      TEST  ECX,ECX
      JNZ  F1
      
      POP  ECX
      MOV  ESI,[EBP+EAX+36]      
      ADD  ESI,EBP
      MOVZX  ESI,WORD PTR[ESI+ECX*2]  
      MOV  EDI,[EBP+EAX+28]      
      ADD  EDI,EBP
      MOV  EDI,[EDI+ESI*4]      
      ADD  EDI,EBP    ;取得GetProcAddress函数的地址
      ;mov EDX, addr
      
      ;mov [EDX+aGetProcAddress],EDI
      
      PUSH WORD PTR 0X00        
      PUSH DWORD PTR 0X41797261
      PUSH DWORD PTR 0X7262694C
      PUSH DWORD PTR 0X64616F4C
      PUSH ESP
      PUSH  EBP
      CALL  EDI

      ;mov EDX, addr
      ;mov [EDX+aLoadLibrary], EAX
      
      
      ;mov EBX, [EDX+u32]
      ;push EBX
      ;CALL  EAX
      PUSH WORD PTR 0X00
      PUSH DWORD PTR 0X6C6C642E      ;.
      PUSH DWORD PTR 0X32337265      ;  .
      PUSH WORD PTR 0X7355           ;
      PUSH ESP
      CALL EAX    ;user32.dll的基址
      MOV EDX,EAX

      PUSH DWORD PTR 0X0041786F  ;
      PUSH DWORD PTR 0X42656761   ;
      PUSH WORD PTR 0X7373;se  ;
      PUSH WORD PTR 0X654D   ;
      PUSH ESP
      PUSH EDX
      CALL EDI
      MOV EBX,EAX ;MessageBox地址
            
      PUSH WORD PTR 0X00
      PUSH DWORD PTR 0X41424344 ;显示内容;
      PUSH DWORD PTR 0X31323334
      mov ECX,esp
      PUSH WORD PTR 0X00
      PUSH DWORD PTR 0X61486148 ; 标题;
      mov EDX,esp
      PUSH 40H+1000H
      PUSH ECX
      PUSH EDX
      PUSH 0
      CALL EBX ;调用MessagBoxA

EXIT:
mov esp,ebp     
POPAD
  }
2011-5-22 18:57
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习学习~~~~~~~~
2011-5-22 19:01
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
太强大了!!!
2011-5-22 19:50
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
字符串地址有问题
2011-5-22 19:58
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
shellcode中MessageBoxA的参数字符串是放在栈里面的 而add esp,7已经把esp弄成奇数了 所以MessageBoxA取参数时,字符串是在栈中,而且字符串的地址是栈中的
奇地址,所以出错了。在我的机子上,在LoadLibraryA("USER32.dll")时就出错了,原因也是一样。可以用这个测试一下
_asm
	{
		//int 3
		inc esp
		push 'oac'
		mov eax,esp
		push 0
		push 0
		push eax
		push 0
		call DWORD PTR MessageBoxA
	}

弹出来的msgbox上面没字。把inc esp去掉就好了。   不知道LZ那么多add esp,7是怎么来的。
上传的附件:
2011-5-22 20:00
0
游客
登录 | 注册 方可回帖
返回
//