Win32汇编学习笔记07.筛选器异常-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net钢琴
od调试老师给的多媒体钢琴
运行找到Piano的过程函数里去
找到处理WM_KEYDOWN消息的那
下个断点,然后按键断下来在这
- 分析上图汇编代码:mov eax,dword ptr [ebp+10] 拿wParma
- lea ecx,dword ptr [eax-41] ,41的ASSCII为A,这里应该是判断是哪个按键做准备
- cmp ecx,19 19h->25,0~25为26个数,对应26个字母
- ja imm 大于则不是字母按键,跳出
- 发出声音功能的函数应该是下面的call <jnp.&oiano_dll.fun_lpayOneSound>
- 然后我们观察该函数,分析其为C调用约定,传入一个参数,push eax
-
- 该函数参数eax的来源是上面的wParma
我们去写一个win32程序去测试一下
RasAsm创建工程MyPiano
相应地方:;=============包起来的是后加入的代码
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_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
push hInstance
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)
猜想可能有所谓的播放环境,可能需要调用其它函数相辅相成
比如需要先调用fun_Create,可能调用时机比较早,我们直接用od调式去对应dll查看名称找该函数。
查看参考
发现只有一个地方式函数调用,我们直接去看看