yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1396回复:7

softice是如何定位API函数在内存中的位置?

楼主#
更多 发布于:2002-04-17 16:46

最新喜欢:

xiangshifuxiangs...
zhch111
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2003-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-17 17:07
不同的windows版本有不同的方法
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-17 19:40
If u means user mode APIs.
I think to get PE entrypoint and find export table.
Taiwan's Driver Developer
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-17 20:00
If u means user mode APIs.
I think to get PE entrypoint and find export table.
faint!
Code entry point和import table and export table不是一回事!
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-18 08:34
我知道在winNT和win9X的内存管理不一样,在win9X里,softice怎么定位API函数的位置,比如说MessageBoxA吧,大家都知道它在user32.dll中,如果根据PE格式找它的地址,但softice是如何获得user32.dll的PE头的位置,有人介绍过从0X80000000搜索所有的2G内存,找出所有PE头,但这2G内存并不是都有效,这有如何处理呢?在ICH病毒里好象用了这个技术,但我没大看明白,那位大哥弄懂了给小弟说说?
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-18 10:59
[quote]
I think to get PE entrypoint and find export table.
faint!
Code entry point和import table and export table不是一回事!
 [/quote]

sorry, PE Header.

I think API:GetModuleHandle to get module table.
Taiwan's Driver Developer
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-18 12:51
给你Copy一小段代码,它枚举模块,找出ntoskrnl.exe的地址后,在PE头中找出我想要的函数:

PVOID FindNtoskrnl()
{
ULONG n;
ZwQuerySystemInformation(SystemModuleInformation,&n,0,&n);
    PULONG q =PULONG(ExAllocatePool(PagedPool,n));
    ZwQuerySystemInformation(SystemModuleInformation,q,n *sizeof *q,0);
    PSYSTEM_MODULE_INFORMATION p=PSYSTEM_MODULE_INFORMATION(q +1);
    PVOID ntoskrnl=0;
    for (ULONG i =0;i <*q;i++)
if (_stricmp(p.ImageName +p.ModuleNameOffset,\"ntoskrnl.exe\")==0)
ntoskrnl =p .Base;
ExFreePool(q);
return ntoskrnl;
}

PVOID FindFunc(PVOID Base,PCSTR Name)
{
PIMAGE_DOS_HEADER dos =PIMAGE_DOS_HEADER(Base);
PIMAGE_NT_HEADERS nt =PIMAGE_NT_HEADERS(PCHAR(Base)+dos->e_lfanew);
PIMAGE_DATA_DIRECTORY expdir=nt->OptionalHeader.DataDirectory +IMAGE_DIRECTORY_ENTRY_EXPORT;
ULONG size =expdir->Size;
ULONG addr =expdir->VirtualAddress;
PIMAGE_EXPORT_DIRECTORY exports=PIMAGE_EXPORT_DIRECTORY(PCHAR(Base)+addr);
PULONG functions =PULONG(PCHAR(Base)+exports->AddressOfFunctions);
PSHORT ordinals =PSHORT(PCHAR(Base)+exports->AddressOfNameOrdinals);
PULONG names =PULONG(PCHAR(Base)+exports->AddressOfNames);
PVOID func =0;
for (ULONG i =0;i< exports->NumberOfNames;i++){
ULONG ord =ordinals [i ];
if (functions[ord]<addr || functions[ord] >=addr +size){
if (strcmp(PSTR(PCHAR(Base)+names),Name)==0)
func =PCHAR(Base)+functions[ord];
}
}
return func;
}
流氓兔
驱动老牛
驱动老牛
  • 注册日期2001-06-27
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-18 15:28
偶想咳能是通过PE节吧!
我是流氓!!!我怕谁!!! 不!!应该是我是老流氓!!!我怕谁!!![img]http://202.98.116.70:888/cgi-bin/newmov/bbs/attachment.cgi?forum=4&topic=25473&postno=1&type=.jpg[/img]
游客

返回顶部