首页
社区
课程
招聘
[求助]进程提权的汇编代码出现问题
发表于: 2009-12-5 17:25 5250

[求助]进程提权的汇编代码出现问题

2009-12-5 17:25
5250
在研究如何将进程权限提升的问题时,我参考了网上的代码,打算将一段代码注入svchost.exe进程,注入代码的功能是弹出一个提示,但运行后的结果却是。。。。。。。

麻烦各位大哥指点下,该怎么解决,小弟在这先谢谢各位了!
代码如下:

.386
.model flat,stdcall
option casemap:none

include       windows.inc
include       user32.inc
includelib    user32.lib
include       kernel32.inc
includelib    kernel32.lib
include                  advapi32.inc
includelib          advapi32.lib

.data
pid dd ?
hProcess dd ?                ;进程句柄
hThread dd ?                 ;线程句柄
lpCodeRemote dd ?
hSnapShot dd ?
szProcessName db 'svchost.exe',0
lpToken dd ?
SE_DEBUG_NAME0 db 'SeDebugPrivilege',0
.const
szMsg db 'MessageBox',0          ;用到的函数
Userdll db 'user32.dll',0           ;用到的动态连接库

.code

codebegin:
sz1 db '111',0         
sz2 db '222',0               
datalen =$-codebegin
Rproc proc Msg                    ;MessageBox函数的入口地址为参数
CALL @F ;push esi
@@:
POP EBX
SUB EBX,OFFSET @B
LEA ECX,[EBX+sz1]
LEA EDX,[EBX+sz2]
push NULL
push edx
push ecx
push NULL
call Msg
ret
Rproc endp
codelen =$-codebegin              ;代码长度字节

GetID  proc
local        @stProcess:PROCESSENTRY32

invoke        RtlZeroMemory,addr @stProcess,sizeof @stProcess
mov @stProcess.dwSize,sizeof @stProcess
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
mov hSnapShot,eax
invoke Process32First,hSnapShot,addr @stProcess
.while eax
        invoke lstrcmpi,addr @stProcess.szExeFile,offset szProcessName
        .break .if eax == 0
        invoke Process32Next,hSnapShot,addr @stProcess
.endw
push @stProcess.th32ProcessID
pop pid
invoke CloseHandle,hSnapShot
ret

GetID  endp

Up  proc
local hToken:dword
local @tkp:TOKEN_PRIVILEGES

mov @tkp.PrivilegeCount,1
mov @tkp.Privileges.Attributes,SE_PRIVILEGE_ENABLED
invoke GetCurrentProcess
mov ebx,eax
invoke OpenProcessToken,ebx,TOKEN_ALL_ACCESS,addr hToken
invoke LookupPrivilegeValue,NULL,addr SE_DEBUG_NAME0,addr @tkp.Privileges.Luid
invoke AdjustTokenPrivileges,hToken,FALSE,addr @tkp,sizeof @tkp,0,0
invoke CloseHandle,hToken
ret

Up endp

start:
invoke Up
invoke GetID
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,pid           ;打开进程,得到进程句柄
mov hProcess,eax                                          ;保存进程句柄
invoke VirtualAllocEx,hProcess,0, codelen, MEM_COMMIT, PAGE_EXECUTE_READWRITE ;在进程里申请空间
mov lpCodeRemote,eax
invoke WriteProcessMemory,hProcess,lpCodeRemote,offset codebegin,codelen,NULL ;写入插入的代码

mov esi,lpCodeRemote
add esi,datalen
push esi
invoke LoadLibrary,offset Userdll                   ;加载USER32.dll
invoke GetProcAddress,eax,offset szMsg              ;得到地址
pop esi
invoke CreateRemoteThread,hProcess,0,0,esi,eax,0,0     ;远程线程调用

mov hThread,eax                                     ;保存线程句柄
.if hThread
invoke WaitForSingleObject,hThread, INFINITE        ;等待线程结束
invoke CloseHandle,hThread                          ;关闭线程句柄
.endif

invoke VirtualFreeEx,hProcess,lpCodeRemote,codelen,MEM_RELEASE        ;释放空间

invoke ExitProcess,0

end start

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

上传的附件:
  • 2.jpg (24.78kb,103次下载)
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
svchost蹦了 真可怜
2009-12-5 18:05
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能告诉我该怎么解决吗?
2009-12-5 19:44
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
szMsg db 'MessageBox',0 ;用到的函数
Userdll db 'user32.dll',0 ;用到的动态连接库
....
push esi
invoke LoadLibrary,offset Userdll ;加载USER32.dll
invoke GetProcAddress,eax,offset szMsg ;得到地址
pop esi
invoke CreateRemoteThread,hProcess,0,0,esi,eax,0,0 ;远程线程调用

GetProcAddress后没有对返回值进行任何检查,就直接作为创建远程线程的参数使用,实际上由于对GetProcAddress的调用错误(user32.dll没有一个API叫做MessageBox,只有MessageBoxA和MessageBoxW,当你在一般情况下写代码invoke调用的时候,编译器自动将MessageBox变成MessageBoxA,但是如果你自己GetProcAddress,函数名字符串就必须老老实实写MessageBoxA,只写MessageBox将找不到函数地址而返回0,这是常识),导致远程线程call 0,从而导致svchost.exe进程崩溃。

另外,上面这个push esi和pop esi也是多余的,Win32 API调用前后esi是保持不变的,不需要额外保存原始值,这也是常识。
最后,上面提到的常识都缺乏,自己的程序,出了错自己不但不会调试,连对出错原因的估计也不对(跟提权代码部分根本没有关系),就写远程注入这种危险性较大的代码,只能说你基础还是没有过关。
2009-12-5 20:27
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢大哥的指教,让我又学习了!我改了代码运行,没报错,有弹出提示的声音,但没提示显示出来,请大哥继续指教下~!小弟的基础的确很差,刚学几天,主要是感觉到以前浪费的时间太多了,没能好好学习,现在要抓紧时间学习了,难免有疏漏,谢谢各位指教,也谢谢看雪,这里给了我很大帮助的哦!
2009-12-5 21:14
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
不是一个桌面,弹框当然看不到~
2009-12-5 21:32
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢各位大哥指教!
2009-12-5 21:50
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
不客气,不客气,不客气.
2009-12-6 11:34
0
游客
登录 | 注册 方可回帖
返回
//