首页
社区
课程
招聘
[原创]用Hash搜索API演示
发表于: 2006-5-15 00:13 9451

[原创]用Hash搜索API演示

2006-5-15 00:13
9451

.386
.model flat,stdcall
option casemap:none

include user32.inc
includelib user32.lib

FindKernel32 proto
GetRor13Hash proto

.data
szExample db "GetProcAddress",0

.data?
Hash_GetProcAddr dd ?

.code
start:
     mov esi,offset szExample
     call GetRor13Hash
     mov Hash_GetProcAddr,eax             ;计算"GetProcAddress"的hash值;当用在shellcode中时应先计算好
;--------------------------------------------------
;利用SEH搜索kernel32基址,不多说了
;--------------------------------------------------
     assume fs:nothing
     mov esi,fs:[0]
     mov eax,esi                          ;We user "lodsd" in C  ,I don't know why. Tell me please if you know
FindUnException:
     cmp DWORD ptr [eax],0ffffffffh
     je  FindedUnException
     mov eax,[eax]
     jmp FindUnException
FindedUnException:
     mov eax,[eax+4]
     and eax,0ffff0000h                   ; eax---->Address of UnhandledExceptionFilter
SearchLoop:
     cmp WORD ptr [eax],'ZM'
     jnz NotFind
     mov ebx,[eax+3ch]
     add ebx,eax
     cmp WORD ptr [ebx],'EP'
     jz FindOk
NotFind:
     dec eax
     jmp SearchLoop
FindOk:
   mov ebp,eax                   ;eax<------------>ebp
     mov esi,[ebp+03ch]
     add esi,ebp                   ;Address of Export table------->esi
     mov esi,[esi+078h]
     add esi,ebp
     mov ecx,[esi+018h]            ;Number of Functions
     mov ebx,[esi+020h]            
     add ebx,ebp                   ;AddressofNames      ---------->ebx
     push esi
FindApi:
     dec ecx
     mov esi,[ebx+ecx*4]
     add esi,ebp
     call GetRor13Hash
     cmp Hash_GetProcAddr,eax
     jne FindApi
FindedIt:
     pop esi
     mov ebx,[esi+024h]
     add ebx,ebp                  ;AddressofOrdinals
     mov cx, [ebx+ecx*2]
     mov ebx,[esi+01ch]
     add ebx,ebp                  ;AddressOfFunctions      
     add ebp,[ebx+ecx*4]
     mov eax,ebp
     ret
;---------------------------------------------------
;循环右移13位HASH算法,很常用的一种
;esi----->要进行HASH的字串地址
;---------------------------------------------------
GetRor13Hash proc uses edx
      xor edx,edx
RorLoop:
      xor eax,eax
      lodsb
      cmp al,0
      jz Finish
      ror edx,13
      add edx,eax
      jmp RorLoop
Finish:
      mov eax,edx
      ret
GetRor13Hash endp
end start

参考资料:罗云宾关于搜索kernel32.dll基址的文章(具体记不清了)
         Anskya的Hash算法


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
老大,用的全是别人的代码也敢叫原创。
2006-5-15 09:53
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不知道"原创"的意思是不是所有指令都必须要自己构造.我也只是做个演示程序,没什么技术含量,小弟雏一个,还望多指教.
2006-5-15 13:40
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
不管怎么样,我觉得挺好...我支持你...
2006-5-15 14:20
0
雪    币: 235
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
mov eax,esi                          ;We user "lodsd" in C  ,I don't know why. Tell me please if you know

lodsd在这里与mov eax,esi是等价的。
2006-5-15 19:39
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
最初由 nonsenser 发布
不知道"原创"的意思是不是所有指令都必须要自己构造.我也只是做个演示程序,没什么技术含量,小弟雏一个,还望多指教.


建议下次文章后面来一个参考资料,将参考的文章名列出。
不过,这次还是加精鼓励你
2006-5-15 20:18
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
多谢老大宽容,小弟之前不懂规矩,以后定当遵从.
这篇文章中的部分代码确实很多地方都有出现,但是这样的代码确实太常见了.我这里根据自己的记忆和理解做了个组织.应该没有直接COPY他人的代码,至于参考,我已经修改,列出了.....望大家见谅.

To:kkbing
我记得lodsb 应该等同于 mov al,byte ptr [esi] 吧,(不好意思,汇编基础不牢)
2006-5-15 22:23
0
雪    币: 235
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
我记得lodsb 应该等同于 mov eax,byte ptr [esi] 吧,(不好意思,汇编基础不牢)

是的,关键是看lods后跟的是什么b,w or d.
2006-5-15 22:55
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
lodsb =
mov al,[ds:esi]
if(flag_d) dec esi
else inc esi
2006-5-16 11:30
0
游客
登录 | 注册 方可回帖
返回
//