文号
t16541
阅读
6467
回复
11
收藏
4
为程序添加启动窗口
2009/06/27
IP:北京
还是准备参与投稿的,后来那个不了了之了,郁闷。赶快发出来吧,再不发就成古董了。

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

.386
.model flat, stdcall  32 bit memory model
option casemap :none  case sensitive
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib

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 22次下载
+1900
科创币
delete
2009/06/27
这不是很好么
17年7个月前IP:未同步
115652
1楼
这个。。。我们为啥还要用汇编呢?……--~~~~
引用
评论
17年7个月前IP:未同步
115655
2楼
I'd love to.
ba la la la la~
引用
评论
17年7个月前IP:未同步
115657
3楼
因为汇编底层。对于PE操作来说,VC有的时候经常会出现莫名其妙的问题

还有一点





































我没学过VC....
引用
评论
17年7个月前IP:未同步
115661
4楼
01  .386
02  .model flat, stdcall  ;32 bit memory model
03  option casemap :none  ;case sensitive
04  include windows.inc
05  include kernel32.inc
06  include user32.inc
07  includelib kernel32.lib
08  includelib user32.lib
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
引用
评论
17年7个月前IP:未同步
115677
5楼
我没学过汇编……有爱.NET的飘过……--~~~~
引用
评论
17年7个月前IP:未同步
115679
6楼
ASM语法看上去似乎不难,向您学习,我可能近期学习ASM.
引用
评论
17年7个月前IP:未同步
116789
7楼
我曾经学过各种语言,到头来还是XXXXXX比较有爱。。。
引用
评论
17年7个月前IP:未同步
116792
8楼
ASM....记不住,找不到API,编程非可视化
VC...非可视化无爱,MFC太繁琐,记不住
VB6...有爱,但功能很差
XXXXXX十分有爱
引用
评论
17年7个月前IP:未同步
116797
9楼
其实直接改变导入表即可导入DLL。。。
引用
评论
17年7个月前IP:未同步
117391
10楼
导入表即可导入DLL

对,但这里的程序已经有了项,所以就不加了
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的