鱼C论坛

 找回密码
 立即注册
查看: 3232|回复: 11

[技术交流] 【nasm系列教程3】 神秘的dll,简单地实现

[复制链接]
发表于 2011-11-30 13:38:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

    嗯,闲话少说,dll,动态链接库,耳熟能详,跟EXE一样,PE格式,只是不能直接执行,需要有进程调用它(我记得小甲鱼老是把调用读成tiao用,不是我挑刺。。。。这句话肿么变色了)
      
    你就在想了,那不是不用设置程序入口点了?额··
可以这么理解,但是一般情况下,动态链接库还是有入口函数的,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的亲近感

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


extern MessageBoxA,ExitProcess 

[section .data]                                  ;数据段
hello db "我来自23dll.dll",0                 

[section .text]                                  ;代码段


export1                             ;导出函数
pushad                              ;因为函数没返回值,果断全部压栈
mov ebp,esp
sub esp,8
mov eax,hello
mov [ebp+8],eax
mov [ebp+4],eax
push MB_OK
push dword [ebp+4]
push dword [ebp+8]
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 export1  23dll.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 /entry  start 23.obj user32.dll kernel32.dll 23dll.dll    运行一下,是不是有一个消息框写着“我来自23DLL.DLL”,如果是,继续··



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



    [section .text]代码段

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


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

   连接时再把23dll.dll一包含,大功告成。

   不知道讲的怎么样,大家提提意见,以后改进


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


   


   
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-30 14:52:52 | 显示全部楼层
            顶!!!!!!!!!                   希望多出些 nasm教程   最好结合linux  :lol:lol:lol:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-30 16:04:52 | 显示全部楼层
支持下楼主!虽然我现在还看不懂,哈哈……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-30 22:09:48 | 显示全部楼层
强烈支持楼主,虽然现在偶还忒嫩,木懂,但不久...嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-2 16:41:30 | 显示全部楼层
:lol不错不错   菜鸟飞过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-30 10:49:24 | 显示全部楼层
帖子不错,收藏了,感谢LZ分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-1 21:54:43 | 显示全部楼层
C语言小菜鸟飞过,希望有更多的教学视频共大家分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-5 20:55:49 | 显示全部楼层
要是有视频教程就好了哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-11 14:23:17 | 显示全部楼层
看来看去 还是汇编看着顺眼,用来用去,还是JAVA+Eclipse方便
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-11 14:56:27 | 显示全部楼层
建议出视频
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-13 19:07:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-16 22:47:30 | 显示全部楼层
我来看看,想学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表