美食家大橙子 发表于 2025-1-9 08:59:24

Win32汇编学习笔记07.筛选器非常

Win32汇编学习笔记07.筛选器非常-C/C++根本-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net钢琴

od调试老师给的多媒体钢琴

https://i-blog.csdnimg.cn/img_convert/45450a39eac266de4c75c4c626448212.png
运行找到Piano的过程函数里去

https://i-blog.csdnimg.cn/img_convert/2d3c811bd67f11e83fb4cabf35075485.png
找随处理WM_KEYDOWN消息的那

https://i-blog.csdnimg.cn/img_convert/eb1b0c2fa20b3e36a65072cdcb0d419d.png
下个断点,然后按键断下来在这

https://i-blog.csdnimg.cn/img_convert/32140ccc0b151cb5ddf79d5151123dd0.png


[*]分析上图汇编代码:mov eax,dword ptr 拿wParma
[*]lea ecx,dword ptr ,41的ASSCII为A,这里应该是判断是哪个按键做准备
[*]cmp ecx,19 19h->25,0~25为26个数,对应26个字母
[*]ja imm 大于则不是字母按键,跳出
[*]发出声音功能的函数应该是下面的call <jnp.&oiano_dll.fun_lpayOneSound>
[*]然后我们观察该函数,分析其为C调用约定,传入一个参数,push eax
[*] https://i-blog.csdnimg.cn/img_convert/c87b63bb7c672a0ace388fafd361dab2.png
[*]该函数参数eax的来源是上面的wParma
我们去写一个win32步伐去测试一下
RasAsm创建工程MyPiano

https://i-blog.csdnimg.cn/img_convert/7b950e03cbd8ed793aeccdf3d9ce4de5.png
相应地方:;=============包起来的是后加入的代码
586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   
   includelib user32.lib
   includelib kernel32.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD


.data
   ClassName db "MainWinClass",0
   AppNamedb "Main Window",0
   g_szPianoDll db "piano_dll",0
   g_szPlayOneSound db "fun_playOneSound",0
   g_pfnPlayOneSound dd 0
   g_hPianoDll dd 0

.data?
   hInstance HINSTANCE ?
   CommandLine LPSTR ?

.code


; ---------------------------------------------------------------------------


start:
        ;=============
        invoke LoadLibrary,offset g_szPianoDll
        mov g_hPianoDll,eax
        invoke GetProcAddress,g_hPianoDll,offset g_szPlayOneSound
        mov g_pfnPlayOneSound,eax
        ;=============

        invoke GetModuleHandle, NULL
        mov    hInstance,eax

        invoke GetCommandLine
        mov    CommandLine,eax

        invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND

        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        pushhInstance
        pop   wc.hInstance
        mov   wc.hbrBackground,COLOR_BTNFACE+1
        mov   wc.lpszMenuName,NULL
        mov   wc.lpszClassName,OFFSET ClassName

        invoke LoadIcon,NULL,IDI_APPLICATION
        mov   wc.hIcon,eax
        mov   wc.hIconSm,eax

        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax

        invoke RegisterClassEx, addr wc
        INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
         hInst,NULL
        mov   hwnd,eax

        invoke ShowWindow, hwnd,SW_SHOWNORMAL
        invoke UpdateWindow, hwnd

        .WHILE TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg
        .ENDW

        mov   eax,msg.wParam
        ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_CREATE
.elseif uMsg==WM_KEYDOWN
                ;=============
                push wParam
                call g_pfnPlayOneSound
                add esp,4
                ;=============
        .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam       
                ret
        .ENDIF

        xor eax,eax
        ret
WndProc endp


end start
但是我们发现无论是注入asm和刚刚的这个,都无法让钢琴发出声音,我们在换成 WM_KEYUP和 WM_KEYCHAR 结果跟 WM_KEYDOWN 一样 因此我们打开dll看看其导出函数(之前分析那个函数的地点dll)

https://i-blog.csdnimg.cn/img_convert/6eb5188e04774268b1e2fceed25447da.png
意料可能有所谓的播放环境,可能须要调用其它函数相辅相成
比如须要先调用fun_Create,可能调用时机比较早,我们直接用od调式去对应dll检察名称找该函数。

https://i-blog.csdnimg.cn/img_convert/69c50d9fb4aaf8a372bf4145fb136234.png
检察参考

https://i-blog.csdnimg.cn/img_convert/3bced191a82bd0749babbc12643494fe.png
发现只有一个地方式函数调用,我们直接去看看

https://i-blog.csdnimg.cn/img_convert/cfc0a8036dbe0f4e71909410f1d15678.png
发现WM_CREATE就调用了,果然如此
因此回到我们的MyPiano的工程中加入对应的,留意要将对应dll及其它可能用到文件都拷贝到工程目次下
值得留意的是fun_Create有一个参数,在上图看出来参数来自esi,可追溯其来源
然后修改为:
.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   
   includelib user32.lib
   includelib kernel32.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD


.data
   ClassName db "MainWinClass",0
   AppNamedb "Main Window",0
   g_szPianoDll db "piano_dll",0
   g_szPlayOneSound db "fun_playOneSound",0
   g_szfun_Create db "fun_Create",0
   g_pfnPlayOneSound dd 0
   g_pnfun_Create dd 0
   g_hPianoDll dd 0

.data?
   hInstance HINSTANCE ?
   CommandLine LPSTR ?

.code


; ---------------------------------------------------------------------------


start:
        ;=============
        invoke LoadLibrary,offset g_szPianoDll
        mov g_hPianoDll,eax
        invoke GetProcAddress,g_hPianoDll,offset g_szPlayOneSound
        mov g_pfnPlayOneSound,eax
        invoke GetProcAddress,g_hPianoDll,offset g_szfun_Create
        mov g_pnfun_Create,eax
        ;=============

        invoke GetModuleHandle, NULL
        mov    hInstance,eax

        invoke GetCommandLine
        mov    CommandLine,eax

        invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND

        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        pushhInstance
        pop   wc.hInstance
        mov   wc.hbrBackground,COLOR_BTNFACE+1
        mov   wc.lpszMenuName,NULL
        mov   wc.lpszClassName,OFFSET ClassName

        invoke LoadIcon,NULL,IDI_APPLICATION
        mov   wc.hIcon,eax
        mov   wc.hIconSm,eax

        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax

        invoke RegisterClassEx, addr wc
        INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
         hInst,NULL
        mov   hwnd,eax

        invoke ShowWindow, hwnd,SW_SHOWNORMAL
        invoke UpdateWindow, hwnd

        .WHILE TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg
        .ENDW

        mov   eax,msg.wParam
        ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_CREATE
                push hWnd
                call g_pnfun_Create
                add esp,4
        .elseif uMsg==WM_KEYDOWN
                ;=============
                push wParam
                call g_pfnPlayOneSound
                add esp,4
                ;=============
        .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam       
                ret
        .ENDIF

        xor eax,eax
        ret
WndProc endp


end start



[*]接下来探究这个钢琴如何触发利用曲子,即那些文本文件所记录的曲子
去od找读文件相关操作
右键反汇编窗口,选择字符串查找,该软件须要用unicode查找才可

https://i-blog.csdnimg.cn/img_convert/151d7e4ae0f4efebd18c411bbec4d6a6.png
下面这个玩意非常可疑

https://i-blog.csdnimg.cn/img_convert/e722b5af37ae115ddef6ecbe77537aaa.png
选中回车到对应位置

https://i-blog.csdnimg.cn/img_convert/c3476fe7306f6560058b32e510cf2030.png
插入od功介绍:选中 call 一行右击转到

可以看到调用这个函数的地方

https://i-blog.csdnimg.cn/img_convert/a808ca8fe70a6da4dd3f74234f82f233.png


[*] https://i-blog.csdnimg.cn/img_convert/2aaa559f6abbb5974d424e2f76f39c94.png
思路回到打开文件对应函数上

https://i-blog.csdnimg.cn/img_convert/9737e940663de9b649e87a68b8bc478a.png
点击此中一个转到对应调用处

https://i-blog.csdnimg.cn/img_convert/728fe9ed112935e4ba4a4e4d054a3311.png
再起上面那个push再来转到

https://i-blog.csdnimg.cn/img_convert/24cd601fc7c24b6b45c00561a7d7f331.png
转到的是下面这个jmp,然后再看sub又是哪里跳过来的呢?

https://i-blog.csdnimg.cn/img_convert/5dd7a7484a39e6832a642bbeb3ac76da.png
转到下面所示的jg 另外一个mov ecx,dword ptr 是commad消息!!!
https://i-blog.csdnimg.cn/img_convert/ce881887ad948f8e63ceda4274efa88b.png
我们猜测这里应该有拿资源id的操作
利用vs:文件->打开->文件

https://i-blog.csdnimg.cn/img_convert/db605424ac00432e3e30587b6fabcd52.png
选择该exe

https://i-blog.csdnimg.cn/img_convert/906383f10e8e3f90526476c43e2e5e36.png
环境如下

https://i-blog.csdnimg.cn/img_convert/f73ee86c85cae36dedbfb0a80ec88992.png
点开快捷键检察

https://i-blog.csdnimg.cn/img_convert/ef2197ea0f38bd699e1c6b2605510011.png
32772->对应上面我们猜疑是拿资源id那个立刻数的8004h,非常偶合?
再去回想之前的转到那

https://i-blog.csdnimg.cn/img_convert/02801dadce2e7ba776a73135900b61e8.png
去8004h对应要走的地方去下断点,ctrl+K测试

https://i-blog.csdnimg.cn/img_convert/ecef6659cb36011c476550040848032a.png
断点果然下来了
但是并没有播放音乐,我们通过断点处往下走观察发现仅仅只是读了数据而已。
我们可以看它把读的东西放到哪里去了。
再去看文件读写那

https://i-blog.csdnimg.cn/img_convert/2295d865ea82514f56a9abf7125b4dc5.png
有用到了全局变量,往它那些如东西,如果别的地方要用到,肯定也要访问全局变量。
如何看那些地方用到了对应的全局变量?选中,右键->查找参考->地址参考


https://i-blog.csdnimg.cn/img_convert/ff1391f2b6249f9ac37e570115c64ffc.png
那么只要用到了该全局变量的地方都列举出来了

https://i-blog.csdnimg.cn/img_convert/01cbaf8e649c7139a31995e0d28f0040.png
我们一个个找对应的读操作内里的环境,找到此处有循环,值得留意一下了!!!

https://i-blog.csdnimg.cn/img_convert/c1043bc26bf7bd936cc4693ee0c99d43.png
看看它从哪里来的

https://i-blog.csdnimg.cn/img_convert/8361671d8d991ef4282353f770e1a4d8.png

https://i-blog.csdnimg.cn/img_convert/f98c6edfc42a87e80df436c19cd611af.png

https://i-blog.csdnimg.cn/img_convert/f03735ee7d98efd32413f223bbe4af7c.png
转到这个jnz,发现还是KeyDown消息触发。又有一个全局变量,去看看它

https://i-blog.csdnimg.cn/img_convert/d74d17605a0edc7384a7c45e3a813bc1.png

https://i-blog.csdnimg.cn/img_convert/a34bc25ad7df9a8198b901ccc1165b4a.png
只有一个1,那么就进去看看

https://i-blog.csdnimg.cn/img_convert/e37008692ef725639936520baf485e59.png
来自于8003,32771h ctrl+j
总结:


[*]crtl+num 读文件
[*]ctrl+j 开启 在右上角画一个点
[*]ctrl+k 关闭 取消右上角画的点
[*]按任意键即可播放文件曲子
.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   
   includelib user32.lib
   includelib kernel32.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD


.data
   ClassName   db "MainWinClass",0
   AppName       db "Main Window",0
   g_szDll       db "piano_dll.dll",0      ;要加载的 dll
   g_szPlay      db "fun_playOneSound",0   ;要加在的dll中函数(播放音乐)
   g_szCreate    db "fun_Create", 0          ;要加在的dll中函数(初始化)
   g_pfnCreate   dd 0                        ;函数地址
   g_pfnPlay   dd 0                        ;函数地址

.data?
   hInstance HINSTANCE ?                     ;
   CommandLine LPSTR   ?                     ;

.code


; ---------------------------------------------------------------------------


start:
        invoke GetModuleHandle, NULL
        mov    hInstance,eax

        invoke GetCommandLine
        mov    CommandLine,eax

        invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND
        LOCAL hDll:HANDLE         ;dll句柄

        invoke LoadLibrary, offset g_szDll   ;动态加载dll
        mov hDll, eax                        ;保存dll句柄

        invoke GetProcAddress,eax, offset g_szPlay      ;获取函数地址
        mov g_pfnPlay, eax                              ;保存函数地址
        invoke GetProcAddress, hDll, offset g_szCreate;获取函数地址
        mov g_pfnCreate, eax                            ;保存函数地址

        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        pushhInstance
        pop   wc.hInstance
        mov   wc.hbrBackground,COLOR_BTNFACE+1
        mov   wc.lpszMenuName,NULL
        mov   wc.lpszClassName,OFFSET ClassName

        invoke LoadIcon,NULL,IDI_APPLICATION
        mov   wc.hIcon,eax
        mov   wc.hIconSm,eax

        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax

        invoke RegisterClassEx, addr wc
        INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
         hInst,NULL
        mov   hwnd,eax

        invoke ShowWindow, hwnd,SW_SHOWNORMAL
        invoke UpdateWindow, hwnd

        .WHILE TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg
        .ENDW

        mov   eax,msg.wParam
        ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_CREATE
          push hWnd          ;窗口句柄入栈
          call g_pfnCreate   ;调用播放初始化函数 (c调用约定)
          add esp, 4         ;自己平栈
    .elseif uMsg == WM_KEYDOWN
      push wParam      ;按下的字符入栈
      call g_pfnPlay   ;调用播放音乐函数 (c调用约定)
      add esp, 4         ;自己平栈
        .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam       
                ret
        .ENDIF

        xor eax,eax
        ret
WndProc endp


end start

筛选器非常
操作系统有个机制,他会把非常告示给我们应用步伐,让我们应用步伐来处理,非常机制 windows 系统提供了3种,筛选器非常,SEH 结构化非常,veh 向量非常
筛选器非常是一种终极的非常处理方式,当非常发生时,我们可以在步伐启动时,我们可以给步伐注册一个非常回调函数当非常发生时,系统就会调这个非常函数,让我们有一次处理的时机.
如果我们要处理筛选器非常哦们须要自己写一个处理的函数,然后把这个函数注册到给操作系统,如许操作系统就知道你要处理筛选器,如果没有注册,那么系统默认不处理筛选器非常
非常派发流程
处于调试状态的派发流程
异常出现时,系统首先给 调试器,调试器不处理的话给 应用程序,,应用程序给 SEH, SEH不处理,会再给调试器,调试器不处理优惠给应用程序,应用程序此时会给筛选器,筛选器也不处理就直接给操作系统了,操作系统此时必须处理,操作系统处理方式就是关闭程序 ,
处于非调试状态的派发流程
异常出现时,系统首先给SEH, SEH不处理,就会给筛选器,筛选器也不处理就直接给操作系统了,操作系统此时必须处理,操作系统处理方式就是关闭程序
筛选器是最后一次应用步伐处理非常的时机,因此被称为终极非常
注册筛选器 SetUnhandledExceptionFilter
LPTOP LEVEL EXCEPTION FILTER SETUNHANDLEDEXCEPTIONFILTER(
LPTOPLEVELEXCEPTIONFILTER
LPTOP LEVEL EXCEPTION FILTER

https://i-blog.csdnimg.cn/img_convert/7269a140597974802ada6efe187394f4.png
参数 : 函数指针 : 自己注册的函数函数指针 返回值 函数指针: 之前注册的函数指针
声明
LONG SetUnhandledExceptionFilter( STRUCT _EXCEPTION_POINTERS *ExceptionInfo );
结构体 EXCEPTION_POINTERS

https://i-blog.csdnimg.cn/img_convert/0e781809bbc7fac1c152e83c5bafa433.png
第一个成员: 非常记录 (非常信息)
第二个成员: 环境记录 (寄存器环境)
非常记录: EXCEPTION_RECORD

https://i-blog.csdnimg.cn/img_convert/9a54dd200a7f8a3ab36424fc711ea1d3.png
成员: 非常码 (非常种类)
标志(不用管)
异常嵌套 (处理异常过程中出现了异常)
异常产生的地址 (EIP)
产生异常的: 参数数量
异常发生时的操作, 0 是 读1是写 ,第二个是访问异常的地址(意思是你读或写哪个地址时发生了异常)
.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   
   includelib user32.lib
   includelib kernel32.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD


.data
   g_szTitle db "提示",0
   g_szTextdb "异常来了",0

.data?
   hInstance HINSTANCE ?
   CommandLine LPSTR ?

.code


;异常回调函数   参数:结构体指针
MyUnhandledExceptionFilter proc pExceptPointer:ptr EXCEPTION_POINTERS

    invoke MessageBox, NULL, offset g_szText, offset g_szTitle, MB_OK


    ;--------搭配EXCEPTION_CONTINUE_EXECUTION,不然无法退出程序---------------
    ;---继续执行,即从56行继续执行,又报异常继续回到56行异常处,导致死循环,因此需要跳过56行代码   
   
    mov esi, pExceptPointer            ;获取出现异常的地址
    assume esi:ptr EXCEPTION_POINTERS    ;地址类型类型强转
    mov esi, .ContextRecord;获取出现异常环境记录
    assume esi:ptr CONTEXT      ;地址类型类型强转
    add .regEip, 2         ;跳过出现异常的代码,异常代码地址+2
    assume esi:nothing            ;还原类型
    ;-----------------------------

    ;mov eax, EXCEPTION_EXECUTE_HANDLER;    - 异常已处理,结束进程

    ;mov eax, EXCEPTION_CONTINUE_EXECUTION; -异常已经处理,可以继续执行代码

    mov eax, EXCEPTION_CONTINUE_SEARCH;   - 异常我不处理,交给系统处理,跟第一种区别不大
   
   ret
MyUnhandledExceptionFilter endp

start:
    ;注册异常回调函数
    invoke SetUnhandledExceptionFilter,offset MyUnhandledExceptionFilter

    mov eax, 1212h
    mov , eax    ;因为1212属于不可访问地址,因此会出现异常

    invoke MessageBox, NULL, offset g_szText, offset g_szTitle, MB_OK
        invoke ExitProcess,0
end start

https://i-blog.csdnimg.cn/img_convert/02ae6818cc4c1471df3a3ff43f205a23.jpeg
作业

1. 带作弊功能的钢琴

大键盘1是开启
大键盘2是关闭
大键盘3是读取文件
先读取文件 然后再开启。
.586
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
include msvcrt.inc
include shlwapi.inc

includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
includelib msvcrt.lib
includelib shlwapi.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD


.data
   ClassName db "MainWinClass",0
   AppNamedb "Main Window",0
   g_szDll db "piano_dll.dll",0
   g_szPlay db "fun_playOneSound",0
   g_szCreate db "fun_Create", 0
   g_pfnCreate dd 0
   g_pfnPlay dd 0
   g_TestCut dd 0
   g_TestOpenWindb "打开成功", 0
   g_TestCloseWindb "关闭成功", 0
   
   g_TestFmt db"1.txt",0
   g_wFileCode      dd0
   g_szFileMode       db"r", 0
   g_FileTest         db 255 dup(0),0
   g_TestChar db 0
   
   g_TestBufdb 0
   g_TestFlagdb 0
   
.data?
   hInstance HINSTANCE ?
   CommandLine LPSTR ?

.code



start:
        invoke GetModuleHandle, NULL
        mov    hInstance,eax

        invoke GetCommandLine
        mov    CommandLine,eax

        invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND
        LOCAL hDll:HANDLE

        invoke LoadLibrary, offset g_szDll
        mov hDll, eax

        invoke GetProcAddress,eax, offset g_szPlay
        mov g_pfnPlay, eax
        invoke GetProcAddress, hDll, offset g_szCreate
        mov g_pfnCreate, eax

        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        pushhInstance
        pop   wc.hInstance
        mov   wc.hbrBackground,COLOR_BTNFACE+1
        mov   wc.lpszMenuName,NULL
        mov   wc.lpszClassName,OFFSET ClassName

        invoke LoadIcon,NULL,IDI_APPLICATION
        mov   wc.hIcon,eax
        mov   wc.hIconSm,eax

        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax

        invoke RegisterClassEx, addr wc
        INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
         hInst,NULL
        mov   hwnd,eax

        invoke ShowWindow, hwnd,SW_SHOWNORMAL
        invoke UpdateWindow, hwnd

        .WHILE TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg
        .ENDW

        mov   eax,msg.wParam
        ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
       
        .ELSEIF uMsg==WM_CREATE

          push hWnd
          call g_pfnCreate
          add esp, 4
      .elseif uMsg == WM_KEYDOWN
                        
                lea eax,g_TestFlag
            
                .if word ptr == 0
                        .if wParam =="1"
                     
                           invoke MessageBox,NULL,NULL,offset g_TestOpenWin,MB_OK
                           lea eax,g_TestFlag
                           mov word ptr,1
      
                        .elseif wParam == "2"
                     
                           invoke MessageBox,NULL,NULL,offset g_TestCloseWin,MB_OK
                           
                           
                           lea eax,g_TestFlag
                           mov word ptr,0
                           .elseif wParam == "3"
                     
                           ;载入文件
                           
                           ;打开文件
                           invoke crt_fopen,offset g_TestFmt,offset g_szFileMode
                           mov g_wFileCode,eax
                           ;读文件
                           invoke crt_fgets,offset g_FileTest,255, g_wFileCode
                           
                        .else   
                        
                     
                        
                              push wParam
                              call g_pfnPlay
                              add esp, 4
                        
                        
                           .endif
                        
                .else
                     
                     .if wParam != "2"
                      lea ebx,g_FileTest
                      mov wParam, ebx

                  
                  
                      push wParam
                      call g_pfnPlay
                      add esp, 4
                  
                      .else
                           invoke MessageBox,NULL,NULL,offset g_TestCloseWin,MB_OK
                           lea eax,g_TestFlag
                           mov word ptr,0
                           
                      .endif
                  
                .endif

                  
                  
                  
                     
                           
            
        .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam       
                ret
        .ENDIF

        xor eax,eax
        ret
WndProc endp


end start

[*]在筛选器非常处理中dump步伐 MiniDumpWrite

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Win32汇编学习笔记07.筛选器非常