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