首页
社区
课程
招聘
这样的调用是调用的未公开的API函数?
发表于: 2008-8-25 17:08 5963

这样的调用是调用的未公开的API函数?

2008-8-25 17:08
5963
在逆向一段程序的时候,看到如下代码:

0BF6058F         主        rdtsc        EAX=DEC05318, EDX=00002E3F
0BF60591         主        jmp     0BF605AA
0BF605AA         主        pop     edx        EDX=0012F1A8, ESP=0012F004
0BF605AB         主        pop     eax        EAX=FFFF079F, ESP=0012F008
0BF605AC         主        call    USER32.77D1C5E2        FL=0, EAX=0000001C, ECX=0012EFD4

最后一个Call是直接从用户代码调用的USER32.77D1C5E2,但是user32.dll的导入表中找不到这个对应函数的地址,难道这就是传说中的调用的未公开的API函数,我想问一下,如果是这样的话,我想知道这些调用究竟做了什么,上哪里找这样的资料,谢谢来解答的朋友。

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 609
活跃值: (237)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
2
未公开的函数指的是Native API位于Ntdll.dll……这个东西看上去显然不是为公开的API……因为在User32里……可能是你的符号调试库需要更新了……
2008-8-25 17:26
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
Dll里面的函数不一定要导出吧~
这个应该是内部函数了,至于功能的话自己跟一下。
2008-8-25 19:08
0
雪    币: 138
活跃值: (108)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
在我的机器,call    USER32.77D1C5E2  跳去执行CallWindowProcAorW
关于CallWindowProcAorW找了两篇
http://bbs.pediy.com/archive/index.php?t-39348.html
http://blog.csdn.net/norsd/archive/2006/08/01/1007583.aspx
2008-8-25 20:04
0
雪    币: 207
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢楼上各位了,前几天有点忙,现在才看见。问下要怎么样才能更新那个符号调试库了?内部函数是指的什么意思了,就是没有在输入表里有名字的?

robin兄,你这个call是怎么查到的啊,凭经验还是跟进去可以最后跟到一个有名字的地方?我这几天看了下,我这里这样的情况还不少,很多这样的调用,有什么方法能学明白这个吗,只能凭经验还是?
2008-8-30 10:33
0
雪    币: 138
活跃值: (108)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
不好意思,我之前用的系统是番茄花园,鬼知道改了什么东西,现在还原成T61自带的系统看了看~
在windbg file-》 symbol search path中设置为srv*d:\sym*http://msdl.microsoft.com/download/symbols
那么你D:\sym下的调试符号,就随着你调试程序的越来越多,也就越来越多了!
内部函数,就是未导出,自己的内部调来调去用的。在IDA中看就是sub_xxxx

具体步骤

你可以打开windbg 随便加载个记事本什么的。
让他跑起来,然后在Ctrl+Break,
在命令行,输入 u 77d1c5e2  回车
77d1c5dd 90              nop
77d1c5de 90              nop
77d1c5df 90              nop
77d1c5e0 90              nop
77d1c5e1 90              nop
//以下是命令显示,你可以在反汇编窗口的offset:处输入 77d1c5e2
77d1c5e2 b839120000      mov     eax,1239h
77d1c5e7 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
77d1c5ec ff12            call    dword ptr [edx]
77d1c5ee c20800          ret     8
77d1c5f1 81cf80ff0000    or      edi,0FF80h
77d1c5f7 eb82            jmp     USER32!GetKeyState+0x66 (77d1c57b)
77d1c5f9 90              nop
77d1c5fa 90              nop
77d1c5fb 90              nop
77d1c5fc 90              nop
77d1c5fd 90              nop

看,是去调用systemcall的一个代理。好,现在输入命令 bp 77d1c5e2 回车 g 回车让程序继续跑起来,在记事本中随便敲个字符。

0:001> g
Breakpoint 0 hit
eax=00000100 ebx=0001120b ecx=0007fefc edx=7c92eb94 esi=0007fefc edi=77d191d6
eip=77d1c5e2 esp=0007fec4 ebp=0007fed0 iopl=0         nv up ei ng nz ac pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000297
USER32!IsWindowUnicode+0x34:
77d1c5e2 b839120000      mov     eax,1239h

断下来了,按两下F11(单步跟)
输入命令 dd [edx]
0:000> dd [edx]
7ffe0300  7c92eb8b 7c92eb94 00000000 00000000
7ffe0310  00000000 00000000 00000000 00000000

程序将挑去执行7c92eb8b,让我们看看那里有什么东西。
输入命令 u 7c92eb8b
0:000> u 7c92eb8b
ntdll!KiFastSystemCall:
7c92eb8b 8bd4            mov     edx,esp
7c92eb8d 0f34            sysenter
7c92eb8f 90              nop
7c92eb90 90              nop

这里把你调用的参数地址放入edx,然后sysenter进入内核,
具体干嘛去了,要查这句
mov     eax,1239h
一般这里都是SSDT的服务号。但是1239h这么大的数,我也没见过~~~
就不知道了~~~抱歉
我把它当成偏移计算了一下。
0
:000> u 7c921e39
ntdll!ceil+0x1b:
7c921e39 1f              pop     ds
7c921e3a 92              xchg    eax,edx
7c921e3b 7c66            jl      ntdll!ceil+0x85 (7c921ea3)
7c921e3d 0f28c8          movaps  xmm1,xmm0
7c921e40 660f28f8        movapd  xmm7,xmm0
7c921e44 660f73d034      psrlq   xmm0,34h
7c921e49 660f7ec0        movd    eax,xmm0
7c921e4d 660f5405401f927c andpd   xmm0,xmmword ptr [ntdll!ceil+0x122 (7c921f40)]

多媒体指令??记事本照理应该不会用这东西吧,希望有知道的高手,指点下~~
一起进步
2008-9-2 18:23
0
游客
登录 | 注册 方可回帖
返回
//