求助:在MASM32中怎样静态地按函数序号引用dll中的未公开函数?

seuqcaj 2004-02-01 04:38:56
求助:在MASM32中怎样静态地按函数序号引用dll中的未公开函数?

比如在win98se中的 KERNEL32.DLL 的24h号函数是一个未公开的函数(FreeLibrary16),该函数不能用GetProcAddress按函数序号取其入口地址(微软禁止这样做),虽然可以查 KERNEL32.DLL 的输出表来获得其入口,但觉得太麻烦,小题大作。偶知道Delphi中有以下的语法可以静态地按函数序号引用dll中的函数:

procedure FreeLibrary16(HInstance: THandle); stdcall; external kernel32 index 36;
function GetProcAddress16(Hinstance: THandle; ProcName: PChar): Pointer; stdcall; external kernel32 index 37;

不知MASM32中有没有类似的语法呢?如果没有,怎样才能实现静态地按函数序号引用dll中的函数?请各位大侠赐教。
...全文
49 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sexboyohyeah 2004-02-03
  • 打赏
  • 举报
回复
怎么才能跟踪出函数的功能和参数设定
既是为公开地怎么能知道函数地参数呢?和功能??
只有知道才能用牙
csdsjkk 2004-02-03
  • 打赏
  • 举报
回复
FreeLibrary16 在 kernel32.dll里没有export名,
当然序号是有的,不过getaddrprocess并不能对kernel32.dll
里的任何函数按序号取其入口地址,这可能是m$故意的;
如果知道pe格式,自己也可写个程序按序号来得到函数入口,
不过问题是FreeLibrary16的序号本身也是未公开的,我所知该函数在win95和win98中的序号就不同,
以前写过一个程序就是要用FreeLibrary16,为了查其序号,可费了老大功夫,连softice都动用了^_^
紫郢剑侠 2004-02-03
  • 打赏
  • 举报
回复
To seuqcaj():
我做过的程序中不是用这个函数,而是另外一个未公开的API函数..
如果这个函数有函数名,是可能通过函数名来取得它的入口地址的...
sexboyohyeah 2004-02-02
  • 打赏
  • 举报
回复
怎么才能跟踪出函数的功能和参数设定
紫郢剑侠 2004-02-02
  • 打赏
  • 举报
回复
>>该函数不能用GetProcAddress按函数序号取其入口地址(微软禁止这样做)

也可以按函数名来取其入口地址的...
我做过, 可行...
W32API 2004-02-02
  • 打赏
  • 举报
回复
你可以自己查不同版本的 DLL 库,然后建立相对应的 LIB 文件。
另,用汇编要自己做的事要比 C 多得多,当然也比 Delphi 多得多。
seuqcaj 2004-02-02
  • 打赏
  • 举报
回复


如果MASM32中真的没有这种语法,偶还是直接查kernel32.dll的导出表算了,又或者直接用任意的入口参数相同的函数来代替,编译链接后直接修改生成的exe文件导入表,用了多少个未公开函数就改多少个dword.即由名字引用改为序号引用,^_^
DoItFreely 2004-02-02
  • 打赏
  • 举报
回复
用vs 的lib工具把kernel32.dll的导出函数生成一个.lib文件,C/C++/Asm里面之需要声明函数原形,并链接到这个lib上就好了
seuqcaj 2004-02-02
  • 打赏
  • 举报
回复
回Purpleendurer:
偶试过了,直接用FreeLibrary16的名字是不能取其入口地址,代码如下:

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
DllName db 'kernel32.dll',0
FunName db 'FreeLibrary16',0
hDll dd ?
.code
start proc
invoke LoadLibrary,addr DllName
mov hDll,eax
invoke GetProcAddress,hDll,addr FunName
;返回值为0
ret
start endp
end start

如果你试过成功了,能说说你的代码跟上面的有什么不同吗?
sexboyohyeah 2004-02-02
  • 打赏
  • 举报
回复
记不清了从那里看到过讨论为公开函数地使用
原来好像是有人跟踪导出表还是什么的使用MS的不公开函数还出了本书然后好多人都用那些未公开的函数后来MS就屏蔽了那个人的跟踪方法了
顺便请高人介绍一下静态和动态的方法怎么才能获悉那些函数的功能和参数呢?
csdsjkk 2004-02-02
  • 打赏
  • 举报
回复
未公开函数一般是没有名字的
OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。 Version 1.10 是最终的发布版本。 这个工程已经停止,我不再继续支持这个软件了。但不用担心:全新打造的 OllyDbg 2.00 不久就会面世! 运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。 支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以及相关的数据格式,但是不支持SSE2指令集。 配置: 有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。 数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。 帮助: 此文件包含了关于理解和使用 OllyDbg 的必要的信息。如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg ,这样就可以快速获得系统函数的相关帮助。 启动: 您可以采用命令行的形式指定可执行文件、也可以从菜单选择,或直接拖放到OllyDbg,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。OllyDbg支持即时调试。OllyDbg根本不需要安装,可直接在软盘运行! 调试DLLs: 您可以利用OllyDbg调试标准动态链接库 (DLLs)。OllyDbg 会自动运行一个可执行程序。这个程序会加载链接库,并允许您调用链接库的输出函数。 源码级调试: OllyDbg 可以识别所有 Borland 和 Microsoft 格式的调试信息。这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。 代码高亮: OllyDbg 的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令)和不同的操作数(常规[general]、FPU/SSE、段/系统寄存器、在栈或内存的操作数,常量)。您可以定制个性化高亮方案。 线程: OllyDbg 可以调试多线程程序。因此您可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。并且线程窗口将会显示每个线程的错误(就像调用 GETLASTERROR 返回一样)。 分析:OllyDbg 的最大特点之一就是分析。它会分析函数过程、循环语句、选择语句、表[tables]、常量、代码的字符串、欺骗性指令[tricky constructs]、API调用、函数参数的数目,import 表等等。. 这些分析增加了二进制代码的可读性,减少了出错的可能性,使得我们的调试工作更加容易。 Object扫描。 OllyDbg 可以扫描Object文件/库(包括 OMF 和 COFF 格式),解压代码段[code segments]并且对其位置进行定向。 Implib扫描。 由于一些DLL文件的输出函数使用的索引号,对于人来说,这些索引号没有实际含义。如果您有与DLL相应的输入库[import library],OllyDbg 就可以将序号转换成符号名称。 完全支持Unicode: 几乎所有支持 ASCII 的操作同时也支持 UNICODE,反之亦然。 名称: OllyDbg 可以根据 Borland 和 Microsoft 格式的调试信息,显示输入/输出符号及名称。Object 扫描器可以识别库函数。其的名称和注释您可任意添加。如果DLL的某些函数是通过索引号输出的,则您可通过挂接输入库[import library]来恢复原来的函数名称。不仅如此,OllyDbg还能识别大量的常量符号名(如:窗口消息、错误代码、位域[bit fields]…)并能够解码为已知的函数调用。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧