ReverseMe的小心得!!(0分)

S

shopman

Unregistered / Unconfirmed
GUEST, unregistred user!
我用IDA Pro 4.3 反汇编出一个简单的win32 SDK写的一个小程序,ReverseMe只有一个
WinMain和wndproc两个函数。下面说说我的体会。
首先IDA Pro是要比W32dsm在功能上强多了,能识别窗体结构并在汇编码中体现出来
mov [esp+50h+WndClass.style], 3
mov [esp+50h+WndClass.lpfnWndProc], offset winproc
mov [esp+50h+WndClass.cbClsExtra], 0
mov [esp+50h+WndClass.cbWndExtra], 0
mov [esp+50h+WndClass.hInstance], esi
看看是不是直观多了,不用你去推算堆栈的参数了。
再就可以替换一些标识。。。
mov [esp+50h+WndClass.lpfnWndProc], offset winproc
这行中的winproc就是我替换了的,并且是全文替换的。
最后,在汇编码后面加注释也很方便。。。。
总之功能上是很强大。
对于反汇编码的分析有以下几点体会。。。
被编译器优化过的程序前置码中去掉了
push ebp
mov ebp, esp
这样的操作,函数取参数时直接使用esp这对于分析参数带来了困难,因为你得时
时的注意堆栈的变化。。
对于VC6编译器常常使用EDI,ESI当成寄存器变量。当一个循环中需要调用一个函
数时就是这样处理的。下面是一个线程消息循环。。
push ebx //保存ebx原来的内容
mov ebx, ds:DispatchMessageA //DispachMessageA函数地址放入ebx中
push edi //保存edi原来的内容
mov edi, ds:TranslateMessage //TranslateMessage 函数地址放入edi中
.text:004010EF
lea eax, [esp+50h+Msg]
push eax ;
lpMsg
call edi ;
TranslateMessage //这里就是实际调用处。。。。使用了寄存器变量
lea ecx, [esp+50h+Msg]
push ecx ;
lpMsg
call ebx ;
DispatchMessageA ;
DispatchMessageA:
push 0 ;
wMsgFilterMax
push 0 ;
wMsgFilterMin
lea edx, [esp+58h+Msg]
push 0 ;
hWnd
push edx ;
lpMsg
call esi ;
GetMessageA ;
GetMessageA:
test eax, eax
jnz short loc_4010EF
最后说说窗口过程。。我认为窗口过程的switch不是很容易识别。请看下面的代码
push esi
push edi
mov edi, [esp+10h] ;
message //判断[esp+10h]是msg参数你得自已推算堆栈
//执行到这句时堆栈是什么样的?你得算算。
//按照stdcall规则堆栈该是这样的
// lParam
// wParam
// message <--- esp+10h
// hwnd <--- esp+0ch
// 回返地址 <--- esp+08h
// push esi <--- esp+04h
// push edi <--- esp
// win32的栈是按字操作的,那么 esp+10h是多少
//就算出来了。
mov eax, edi
sub eax, 2 //eax 和2的消息比较!!(查winuser.h得知消息2是WM_DESTROY)
jz short loc_401165
mov esi, [esp+0Ch] ;
hwnd //同上!!!
sub eax, 0Eh //特别要留意这里!!eax存放的是消息先已经减去2了,于是
//0E+2=10h 哈哈,10h就是WM_CLOSE,我想这就是编译器优
//化的结果。。
jnz short loc_40114E
push 24h
push offset unk_405060
push offset unk_40504C
push esi
call ds:MessageBoxA ;
MessageBoxA:
cmp eax, 7 //这里是个钳套的switch....
jz short loc_40116D
.text:0040114E
mov eax, [esp+18h]
mov ecx, [esp+14h]
push eax
push ecx
push edi
push esi
call ds:DefWindowProcA ;
DefWindowProcA:
pop edi
pop esi
retn 10h
.text:00401165
push 0
call ds:postQuitMessage ;
PostQuitMessage:
.text:0040116D
pop edi
xor eax, eax
pop esi
retn 10h
这就是我revrseMe的一点点心得。。
再就是现在搞这个的人很少了,至少我认为是这样所以我希望多多认识一些做逆向
的高手交流交流学习学习。。。。。
 

Similar threads

A
回复
0
查看
1K
Andreas Hausladen
A
I
回复
0
查看
507
import
I
I
回复
0
查看
800
import
I
I
回复
0
查看
731
import
I
顶部