为程序添加启动窗口
noname剑人2009/06/27软件综合 IP:北京
还是准备参与投稿的,后来那个不了了之了,郁闷。赶快发出来吧,再不发就成古董了。

写得我快吐了
=============================================
这一章我们来共同学习如何为一个应用程序添加启动窗口
首先我们考虑,添加启动窗口有几种途径。不难想象有两种方法,一是修改OEP代码,使其先运行一些指令再执行主程序,二是修改OEP代码,使其释放出一个EXE文件再去执行。比较而言,第二种方法不太“和谐”,容易被杀软给“和谐”掉,所以我们着重介绍第一种方法。
首先我们来编写这个起主要作用的DLL

.386
.model flat, stdcall  32 bit memory model
option casemap :none  case sensitive
include XXXXXXXXXXc
include XXXXXXXXXXXc
include XXXXXXXXXc
includelib XXXXXXXXXXXb
includelib XXXXXXXXXb

DlgProc            PROTO    :HWND,:UINT,:WPARAM,[s:10]PARAM

.data?
hInstance            dd ?
hTimer                dd ?

.code
DllEntry proc _hInstance,_dwReason,_dwReserved
.if _dwReason==DLL_PROCESS_ATTACH
    invoke GetModuleHandle,NULL
    push _hInstance
    pop hInstance
    invoke DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL
.endif
mov eax,TRUE
ret
DllEntry endp
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam[s:10]PARAM

    mov        eax,uMsg
    .if eax==WM_INITDIALOG ;初始化,设定1秒的计时器
        invoke SetTimer,hWin,1,1000,NULL
        mov hTimer,eax
    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,NULL
    .elseif eax==WM_TIMER ;时间到,取消计时器,关闭对话框,返回 DllEntry
        invoke KillTimer,hTimer,1
        invoke EndDialog,hWin,NULL
    .else
        mov        eax,FALSE
        ret
    .endif
    mov        eax,TRUE
    ret
DlgProc endp
End DllEntry


呵呵,不用特别解释了吧,看注释就可以了
下面我们来操刀Notepad,用OD载入,找到一片空地(也可以新加一段,就是浪费了点),
记住你选择的“空地”(新OEP),我用的1008750
复制原OEP的前几行代码,以被不时之需

0100739D  PUSH 70
0100739F   PUSH 01001898


这时修改原OEP为

0100739D    JMP 01008750
010073A2      NOP
010073A3     NOP
010073A4   . CALL NOTEPAD.01007568


此刻第一、二句被替换,我们正好把1008750改为
01008750      PUSH 70
01008752      PUSH NOTEPAD.01001898


然后我们就可以进行DLL的加载了
首先我们用PEID来看看Notepad输入表的情况

呵呵,很好,有LoadLibraryA,我们就不用再找工具去特意添加了
因为记事本的基地址是01000000,LoadLibraryA的Thunk RVA是10C8,所以LoadLibraryA所对的CALL就应该是010010C8。
我们还需要一个字符串来做LoadLibraryA的参数,所以我们空出两个字节(做JMP用,不能“执行”字符串)在数据窗口中1008759修改为
01008759  4E 65 77 44 6C 6C 2E 64 6C 6C                    NewDll.dll
回到代码窗口,此时我们可以把原来的JMP补上了

01008750  PUSH 70
01008752  PUSH NOTEPAD.01001898
01008757  JMP SHORT NOTEPAD.01008764 ;留一个字节,做字符串结束用
01008759  DEC ESI
0100875A  JA SHORT NOTEPAD.010087A1                  多余的前缀
0100875D  INS BYTE PTR ES:[EDI],DX                 ;  I/O 命令
0100875E  INS BYTE PTR ES:[EDI],DX                 ;  I/O 命令
0100875F  PREFIX CS:                               ;  多余的前缀
01008760  INS BYTE PTR ES:[EDI],DX                 ;  I/O 命令
01008762  INS BYTE PTR ES:[EDI],DX                 ;  I/O 命令

下面我们就可以“安心”地调用了

01008764      PUSH NOTEPAD.01008759      ASCII "NewDll.dll"
01008769      MOV EAX,DWORD PTR [10010C8]
0100876E      CALL EAX
01008770       JMP NOTEPAD.010073A2

然后我们就可以保存了。把刚才编译的DLL放到同一目录下,试试看,是不是很有意思?

最后说一下文首提到第二种方法,Notepad里没有CreateProcessA,ShellExecuteA,甚至连WinExec都没有,怎么办?呵呵,你可以用其他的工具将其加入进去,具体怎么办,嘿嘿,自己探索探索,要还是不明白,过几章就知道了。


======================
谢谢捧场:)
attachment icon 为程序添加启动窗口.rar 102.45KB RAR 20次下载
+1900  科创币    delete    2009/06/27 这不是很好么
来自:计算机科学 / 软件综合
11
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
jimmyxu
15年0个月前 IP:未同步
115652
这个。。。我们为啥还要用汇编呢?……--~~~~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
noname剑人作者
15年0个月前 IP:未同步
115655
I'd love to.
ba la la la la~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
noname剑人作者
15年0个月前 IP:未同步
115657
因为汇编底层。对于PE操作来说,VC有的时候经常会出现莫名其妙的问题

还有一点





































我没学过VC....
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
noname剑人作者
15年0个月前 IP:未同步
115661
01  .386
02  .model flat, stdcall  ;32 bit memory model
03  option casemap :none  ;case sensitive
04  include XXXXXXXXXXc
05  include XXXXXXXXXXXc
06  include XXXXXXXXXc
07  includelib XXXXXXXXXXXb
08  includelib XXXXXXXXXb
09  
10  DlgProc            PROTO    :HWND,:UINT,:WPARAM,[s:10]PARAM
11  
12  .data?
13  hInstance            dd ?
14  hTimer                dd ?
15  
16  .code
17  DllEntry proc _hInstance,_dwReason,_dwReserved
18  .if _dwReason==DLL_PROCESS_ATTACH
19      invoke GetModuleHandle,NULL
20      push _hInstance
21      pop hInstance
22      invoke DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL
23  .endif
24  mov eax,TRUE
25  ret
26  DllEntry endp
27  DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam[s:10]PARAM
28  
29      mov        eax,uMsg
30      .if eax==WM_INITDIALOG ;初始化,设定1秒的计时器
31          invoke SetTimer,hWin,1,1000,NULL
32          mov hTimer,eax
33      .elseif eax==WM_CLOSE
34          invoke EndDialog,hWin,NULL
35      .elseif eax==WM_TIMER ;时间到,取消计时器,关闭对话框,返回 DllEntry
36          invoke KillTimer,hTimer,1
37          invoke EndDialog,hWin,NULL
38      .else
39          mov        eax,FALSE
40          ret
41      .endif
42      mov        eax,TRUE
43      ret
44  DlgProc endp
45  End DllEntry
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jimmyxu
15年0个月前 IP:未同步
115677
我没学过汇编……有爱.NET的飘过……--~~~~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年0个月前 IP:未同步
115679
ASM语法看上去似乎不难,向您学习,我可能近期学习ASM.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
15年0个月前 IP:未同步
116789
我曾经学过各种语言,到头来还是XXXXXT比较有爱。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
15年0个月前 IP:未同步
116792
ASM....记不住,找不到API,编程非可视化
VC...非可视化无爱,MFC太繁琐,记不住
VB6...有爱,但功能很差
XXXXXT十分有爱
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
15年0个月前 IP:未同步
116797
其实直接改变导入表即可导入DLL。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
noname剑人作者
15年0个月前 IP:未同步
117391
导入表即可导入DLL

对,但这里的程序已经有了项,所以就不加了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
noname剑人
学者 笔友
文章
48
回复
430
学术分
3
2008/07/22注册,6年4个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}