川本姨夫 发表于 2011-11-30 13:38:42

【nasm系列教程3】 神秘的dll,简单地实现

          那个,先瞎扯几句,我觉得鱼C是个学习编程和破解的难得的好地方,大家都活跃一点,老做伸手党自己也不好意思了,哪怕一句顶一下也好啊。俗话说:“每一个被和谐的论坛背后都有一群万年伸手党{:5_107:}····”
   进正题,nasm编译win32汇编程序估计亲们都已经入门了(神马,你不会{:5_104:}?请见上回分解··)
   

    话说这个编程学习,重在编程,学习只是用来纠正错误的,不要本末倒置(如果你每天在家研究怎么袭击帝国大厦的话绕道{:5_93:})

    希望看完帖子后,大家都能自己动手试一下,小甲鱼不也常常谆谆教导大家嘛,要勤动手哦

    嗯,闲话少说,dll,动态链接库,耳熟能详,跟EXE一样,PE格式,只是不能直接执行,需要有进程调用它(我记得小甲鱼老是把调用读成tiao用,不是我挑刺。。。。{:5_107:}这句话肿么变色了)
      
    你就在想了,那不是不用设置程序入口点了?额··
可以这么理解,但是一般情况下,动态链接库还是有入口函数的,windows就通过这个函数传入一些参数来确定一些信息或者决定是否映射该DLL到进程地址空间,你也可以不要入口函数(仅限于自己写小程序偷懒。。)
   
   来个框架:
%include "windows.inc"
%include "user32.inc"
%include "kernel32.inc"
%include "nasmx.inc" ;包含文件不解释

extern 要使用的外部函数 ;基本上就是API啦

各种标号各种函数随意写


   咋没看见和exe有什么不同哩?嗯,确实在源文件里边没什么不同,编译也没什么不同,关键在链接上LOOK:


    GoLink.exe /dll /export 你要导出的函数 /entry 入口点 XXOO.obj kernel32.dll user32.dll(要使用的API所在DLL)

    看见么,就多了一个/DLL和一个EXPORT ,/DLL表示在PEHEADER(文件头,看小甲鱼的破解教程)写入一个dll标志,export表示其他程序可以调用本DLL中的哪些函数(标号)

是不是觉得dll很简单啊?比exe更简单,连内部逻辑结构都不用怎么考虑,因为人家是一个一个导出的嘛,函数标号之间关系不大,下面用一个实例加深一下大家对dll的亲近感{:5_105:}


%include "win32\nasmx.inc"
%include "win32\user32.inc"
%include "win32\kernel32.inc"
%include "win32\windows.inc"


extern MessageBoxA,ExitProcess

                                  ;数据段
hello db "我来自23dll.dll",0               

                                  ;代码段


export1                           ;导出函数
pushad                              ;因为函数没返回值,果断全部压栈
mov ebp,esp
sub esp,8
mov eax,hello
mov ,eax
mov ,eax
push MB_OK
push dword
push dword
push 0
call MessageBoxA
push 0
call ExitProcess
add esp,8
mov esp,ebp
pop ebp
ret编译连接命令:nasm -f win32 23dll.asm
GoLink.exe /dll /export export123dll.obj kernel32.dll user32.dll
   
下面是调用它的程序

%include "win32\nasmx.inc"
%include "win32\user32.inc"
%include "win32\kernel32.inc"
%include "win32\windows.inc"

entry start

extern export1,ExitProcess

start
jmp export1
push 0
call ExitProcess
编译连接:nasm -f win32 exe.asm
golink /entrystart 23.obj user32.dll kernel32.dll 23dll.dll    运行一下,是不是有一个消息框写着“我来自23DLL.DLL”,如果是,继续··



   前边简单不多说,从.text开始,以前都没定义段,从这节开始,我们必须把源程序分段了,因为windows有严格的保护措施,你不分段极易引发错误,以前是为了快速入门,以后不行了啊,必须分段



    代码段

    标号export1开头,你可以把他看做函数名,虽然函数内部是我们自己实现的,其实函数反编译过来就是这样一个框架(体验到纯汇编的乐趣了?)所有内部局部变量通过sub esp 腾出空间{:5_107:}(看不懂不要紧,以后再说)
   然后又是一个老熟人。。。MessageBoxA.


   over,就这样一个dll完成了,然后在exe中,声明了要jmp到外部标号,即extern export1

   连接时再把23dll.dll一包含,{:5_106:}大功告成。

   不知道讲的怎么样,大家提提意见,以后改进{:5_92:}


还是那句话,鱼c是我家,回帖靠大家,伸手党勿做,有报应的。。。{:5_90:}


   


   
   

chulinux 发表于 2011-11-30 14:52:52

            顶!!!!!!!!!                   希望多出些 nasm教程   最好结合linux:lol:lol:lol:lol

lelering 发表于 2011-11-30 16:04:52

{:5_109:}支持下楼主!虽然我现在还看不懂,哈哈……

kane080824 发表于 2011-11-30 22:09:48

强烈支持楼主,虽然现在偶还忒嫩,木懂,但不久...嘿嘿

yuyu 发表于 2011-12-2 16:41:30

:lol不错不错   菜鸟飞过

小王子之歌 发表于 2012-6-30 10:49:24

帖子不错,收藏了,感谢LZ分享

徐军侠 发表于 2012-7-1 21:54:43

C语言小菜鸟飞过,希望有更多的教学视频共大家分享

XBOY 发表于 2012-7-5 20:55:49

要是有视频教程就好了哦

泡泡 发表于 2012-7-11 14:23:17

看来看去 还是汇编看着顺眼,用来用去,还是JAVA+Eclipse方便

bluelithium 发表于 2012-7-11 14:56:27

建议出视频

川本姨夫 发表于 2012-7-13 19:07:59

bluelithium 发表于 2012-7-11 14:56 static/image/common/back.gif
建议出视频

:-),老帖子了,没那个精力了

水$中¤莲 发表于 2012-10-16 22:47:30

我来看看,想学习学习
页: [1]
查看完整版本: 【nasm系列教程3】 神秘的dll,简单地实现