|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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是我家,回帖靠大家,伸手党勿做,有报应的。。。
|
|