首页
社区
课程
招聘
[原创]Pediy之给OllyICE添加全屏功能
发表于: 2008-9-28 21:31 8383

[原创]Pediy之给OllyICE添加全屏功能

2008-9-28 21:31
8383

看了《加密与解密》第19章觉得手痒所以做了这个。废话少说,直奔主题。
这里采用的是增加接口的方法,一共分为3步:
1.编写DLL
2.添加导入函数
3.修改和添加代码

1.编写DLL
实现全屏的代码如下:

                .386
                .model flat, stdcall
                option casemap:none
include         windows.inc
include         user32.inc
include         gdi32.inc
include         kernel32.inc
includelib      user32.lib
includelib      gdi32.lib
includelib      kernel32.lib

                .data
szErrlWinMode   db    "set window window mode faild", 0
szErrlFullScr   db    "set window full screen mode faild", 0
szCaption       db    "Info",0
bIsFullMode     dword FALSE
stOriginPos     WINDOWPLACEMENT <0>
ESC_HOTKEY      equ   1
F11_HOTKEY      equ   2

                .code
DllEntry    proc    _hInstance, _dwReason, _dwReserved
    mov     eax, TRUE
    ret
DllEntry    endp

SetFullScr  proc   _hWnd
    local   @hDC        
    local   @dwHorzres
    local   @dwVertres
    
    invoke  GetWindowPlacement, _hWnd, addr stOriginPos
    invoke  GetWindowLong, _hWnd, GWL_STYLE

    xor     eax, WS_CAPTION
    invoke  SetWindowLong, _hWnd, GWL_STYLE, eax        ;去掉标题栏
    
    invoke  GetDC, _hWnd
    mov     @hDC, eax
    invoke  GetDeviceCaps, @hDC, HORZRES
    mov     @dwHorzres, eax
    invoke  GetDeviceCaps, @hDC, VERTRES
    mov     @dwVertres, eax

    xor     eax, eax
    invoke  SetWindowPos, _hWnd, HWND_TOPMOST, eax, eax, @dwHorzres, @dwVertres, SWP_SHOWWINDOW ;全屏显示
    ret
SetFullScr  endp

SetWinMode  proc _hWnd
    xor     eax, eax
    invoke  SetWindowPos, _hWnd, HWND_NOTOPMOST, eax, eax, eax, eax, SWP_NOSIZE ;添加此两行,修正bug

    invoke  GetWindowLong, _hWnd, GWL_STYLE
    or      eax, WS_CAPTION
    invoke  SetWindowLong, _hWnd, GWL_STYLE, eax  ;恢复标题栏
    invoke  ShowWindow, _hWnd, SW_HIDE
    invoke  SetWindowPlacement, _hWnd, addr stOriginPos
    ret
SetWinMode ENDP


SwitchMode proc _hWnd
    .if bIsFullMode == TRUE
        invoke SetWinMode, _hWnd
        .IF eax==0
            invoke MessageBox, _hWnd, addr szErrlWinMode, addr szCaption, MB_ICONERROR
            ret
        .ENDIF
        mov        bIsFullMode, FALSE
    .else
        invoke SetFullScr, _hWnd
        .IF eax==0
            invoke MessageBox, _hWnd, addr szErrlFullScr, addr szCaption, MB_ICONERROR
            ret
        .ENDIF
        mov bIsFullMode, TRUE
    .endif
    ret
SwitchMode endp

WndProc proc C dwReserved, hWnd, uMsg, wParam, lParam
    mov    eax, uMsg    
    .if         eax == WM_HOTKEY
        .if     wParam == ESC_HOTKEY && bIsFullMode == TRUE
                invoke SwitchMode, hWnd
        .elseif wParam == F11_HOTKEY && bIsFullMode == FALSE
                invoke SwitchMode, hWnd
        .endif
    .elseif     eax == WM_CREATE
        invoke  RegisterHotKey, hWnd, F11_HOTKEY, 0, VK_F11
        invoke  RegisterHotKey, hWnd, ESC_HOTKEY, 0, VK_ESCAPE
    .elseif     eax == WM_DESTROY
        invoke  UnregisterHotKey, hWnd, F11_HOTKEY
        invoke  UnregisterHotKey, hWnd, ESC_HOTKEY
    .endif
    ret
WndProc endp

end DllEntry
00435CDE   .  E8 69980700   call    <jmp.&USER32.RegisterClassA>     ; \RegisterClassA
00435C6A   .  C785 94F6FFFF>mov     dword ptr [ebp-96C], OI.004323D4 ;  入口地址

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
2
全屏很有意思,就是点不习惯,全屏实现的代码先收下了。
2008-9-28 22:23
0
雪    币: 558
活跃值: (43)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
3
各人有各人的习惯,我的观点是 全屏了“眼界”更宽了 哈哈
2008-9-29 12:35
0
雪    币: 201
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
全屏是否好用和个人习惯有关,还是感谢楼主让我们多了一个选择
2008-9-29 12:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好,很好,有用到。
2008-10-4 16:53
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
6
很好,学习了
2008-10-5 10:22
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
OD全屏也疯狂
收录
2008-10-5 18:53
0
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收下了
2008-10-5 21:32
0
游客
登录 | 注册 方可回帖
返回
//