简单ReverseMe分析过程
发表于:
2005-8-20 00:14
9659
====================================================================
简单ReverseMe过程
====================================================================
前言:
首先说明的是,这个是以前的有人分析过,但是好像不完整
开始简单ReverseMe之前一定要PE文件机构认真的看看,熟悉一些常识。
那你就可以开始本篇简单的逆向了(好像不能说叫逆向),反正就是
和破解有一点不同了,对不知道的人就是新知识,我本人也是一个小
小的菜鸟,有一点心得不敢独享,就发出本篇烂文
==================================
==================================
主文:
看看程序就是叫你添加一个提示框,和使一个EXIT按钮起作用,看起来
不难嘛,其实真的不难。
用LORDPE查看区段如下:
Name VOffset VSize ROffset RSize Flags
.text 00001000 0000008A 00000400 00000200 60000020
.rdata 00002000 000000DC 00000600 00000200 40000040
.data 00003000 0000003C 00000800 00000200 C0000040
.rsrc 00004000 00000198 00000A00 00000200 C0000040
我们看到.text空间还有0x200-0x8A=0x176,足够我们用了
由于我们要在OD里添加,所以汇编代码:
00401000 > 6A 00 PUSH 0
00401002 E8 6B000000 CALL <JMP.&KERNEL32.GetModuleHandleA> ;模块
00401007 |. A3 38304000 MOV DWORD PTR DS:[403038],EAX ;下面创建窗口
0040100C |. 6A 00 PUSH 0 ; /lParam = NULL
0040100E |. 68 29104000 PUSH rm1.00401029 ; |DlgProc = rm1.00401029
00401013 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401015 |. 6A 01 PUSH 1 ; |pTemplate = 1
00401017 |. FF35 38304000 PUSH DWORD PTR DS:[403038] ; |hInst = NULL
0040101D |. E8 56000000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401022 |. 6A 00 PUSH 0 ; /ExitCode = 0
00401024 \. E8 43000000 CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess
00401029 /. 55 PUSH EBP
0040102A |. 8BEC MOV EBP,ESP
0040102C |. 817D 0C 110100>CMP DWORD PTR SS:[EBP+C],111 ; 是否是WM_COMMAND,就是EXIT
00401033 75 1F JNZ SHORT rm1.00401054 ; 我们只要修改这里,跳到EndDialog的地方就OK了
00401035 |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
00401038 |. 66:83F8 64 CMP AX,64
0040103C |. 75 2A JNZ SHORT rm1.00401068
0040103E |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401040 |. 68 2F304000 PUSH rm1.0040302F ; |Title = "GOAL:"
00401045 |. 68 00304000 PUSH rm1.00403000 ; |Text = "Your job is to make me work as an exit button!"
0040104A |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040104D |. E8 32000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401052 |. EB 14 JMP SHORT rm1.00401068
00401054 |> 837D 0C 10 CMP DWORD PTR SS:[EBP+C],10
00401058 |. 75 0E JNZ SHORT rm1.00401068 ;下面就是结束窗口的函数,只要到这里窗口就OVER!
0040105A |. 6A 00 PUSH 0 ; /Result = 0
0040105C |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040105F |. E8 1A000000 CALL <JMP.&USER32.EndDialog> ; \EndDialog
00401064 |. C9 LEAVE
00401065 |. C2 1000 RETN 10
00401068 |> C9 LEAVE
00401069 \. C2 1000 RETN 10 ;下面是输入表
0040106C .-FF25 04204000 JMP DWORD PTR DS:[<&KERNEL32.ExitProcess>; kernel32.ExitProcess
00401072 $-FF25 00204000 JMP DWORD PTR DS:[<&KERNEL32.GetModuleHa>; kernel32.GetModuleHandleA
00401078 $-FF25 14204000 JMP DWORD PTR DS:[<&USER32.DialogBoxPara>; USER32.DialogBoxParamA
0040107E $-FF25 0C204000 JMP DWORD PTR DS:[<&USER32.EndDialog>] ; USER32.EndDialog
00401084 $-FF25 10204000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA
============================================
============================================
第一部准备添加一个提示框,看一下函数原形
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // s t y l e of message box
);
我们在这里写MessageBoxA的Title和Text
00401100 . 6C 6E 6E 31 31>ASCII "lnn1123[BCG]",0 ;Title
0040110D 00 DB 00
0040110E 00 DB 00
0040110F 00 DB 00
00401110 . 54 68 69 73 20>ASCII "This is simple R" ;Text
00401120 . 65 76 65 72 73>ASCII "everseMe",0
Title,Text弄好了,那MessageBoxA函数呢,用LORDPE查看输入表里有这个函数
这就好办了,调用只要这样就行了;Call [00402010]
============================================
============================================
我们要改变程序运行流程了,看修改后的:
00401000 > $ E9 AB000000 JMP lnn1123.004010B0 ;到自己的代码地方
00401005 90 NOP ;这里的代码后面要修补
00401006 90 NOP ;这里的代码后面要修补
00401007 > A3 38304000 MOV DWORD PTR DS:[403038],EAX
0040100C . 6A 00 PUSH 0 ; /lParam = NULL
0040100E . 68 29104000 PUSH lnn1123.00401029 ; |DlgProc = lnn1123.00401029
00401013 . 6A 00 PUSH 0 ; |hOwner = NULL
00401015 . 6A 01 PUSH 1 ; |pTemplate = 1
00401017 . FF35 38304000 PUSH DWORD PTR DS:[403038] ; |hInst = NULL
0040101D . E8 56000000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401022 . 6A 00 PUSH 0 ; /ExitCode = 0
00401024 . E8 43000000 CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess
00401029 . 55 PUSH EBP
0040102A . 8BEC MOV EBP,ESP
0040102C . 817D 0C 110100>CMP DWORD PTR SS:[EBP+C],111
00401033 . 74 25 JE SHORT lnn1123.0040105A
00401035 . 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
00401038 . 66:83F8 64 CMP AX,64
0040103C . 75 2A JNZ SHORT lnn1123.00401068
0040103E . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401040 . 68 2F304000 PUSH lnn1123.0040302F ; |Title = "GOAL:"
00401045 . 68 00304000 PUSH lnn1123.00403000 ; |Text = "Your job is to make me work as an exit button!"
0040104A . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040104D . E8 32000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401052 . EB 14 JMP SHORT lnn1123.00401068
00401054 . 837D 0C 10 CMP DWORD PTR SS:[EBP+C],10
00401058 . 75 0E JNZ SHORT lnn1123.00401068
0040105A > 6A 00 PUSH 0 ; /Result = 0
0040105C . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040105F . E8 1A000000 CALL <JMP.&USER32.EndDialog> ; \EndDialog
00401064 . C9 LEAVE
00401065 . C2 1000 RETN 10
00401068 > C9 LEAVE
00401069 . C2 1000 RETN 10
0040106C .-FF25 04204000 JMP DWORD PTR DS:[<&KERNEL32.ExitProcess>; kernel32.ExitProcess
00401072 .-FF25 00204000 JMP DWORD PTR DS:[<&KERNEL32.GetModuleHa>; kernel32.GetModuleHandleA
00401078 $-FF25 14204000 JMP DWORD PTR DS:[<&USER32.DialogBoxPara>; USER32.DialogBoxParamA
0040107E $-FF25 0C204000 JMP DWORD PTR DS:[<&USER32.EndDialog>] ; USER32.EndDialog
00401084 $-FF25 10204000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA
0040108A 00 DB 00
0040108B 00 DB 00
0040108C 00 DB 00
0040108D 00 DB 00
0040108E 00 DB 00
0040108F 00 DB 00
00401090 00 DB 00
00401091 00 DB 00
00401092 00 DB 00
00401093 00 DB 00
00401094 00 DB 00
00401095 00 DB 00
00401096 00 DB 00
00401097 00 DB 00
00401098 00 DB 00
00401099 00 DB 00
0040109A 00 DB 00
0040109B 00 DB 00
0040109C 00 DB 00
0040109D 00 DB 00
0040109E 00 DB 00
0040109F 00 DB 00
004010A0 00 DB 00
004010A1 00 DB 00
004010A2 00 DB 00
004010A3 00 DB 00
004010A4 00 DB 00
004010A5 00 DB 00
004010A6 00 DB 00
004010A7 00 DB 00
004010A8 00 DB 00
004010A9 00 DB 00
004010AA 00 DB 00
004010AB 00 DB 00
004010AC 00 DB 00
004010AD 00 DB 00
004010AE 00 DB 00
004010AF 00 DB 00
004010B0 > 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004010B2 . 68 00114000 PUSH lnn1123.00401100 ; |Title = "lnn1123[BCG]"
004010B7 . 68 10114000 PUSH lnn1123.00401110 ; |Text = "This is simple ReverseMe"
004010BC . 6A 00 PUSH 0 ; |hOwner = NULL
004010BE . FF15 10204000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
004010C4 . 6A 00 PUSH 0 ; 这里修补上面的代码
004010C6 . FF15 00204000 CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; 这里修补上面的代码
004010CC .^E9 36FFFFFF JMP lnn1123.00401007 ; 跳回去继续执行程序
=============================================
=============================================
自己对比看看有什么变化,好了我们的提示框就这么搞定了,运行的时候肯定先
弹出一个提示框,还有程序要所EXIT按钮起作用,看第一段代码就知道怎么做了
看我的修改代码:
0040102C . 817D 0C 110100>CMP DWORD PTR SS:[EBP+C],111
00401033 . 74 25 JE SHORT lnn1123.0040105A ;这里修改了
00401035 . 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
00401038 . 66:83F8 64 CMP AX,64
0040103C . 75 2A JNZ SHORT lnn1123.00401068
0040103E . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401040 . 68 2F304000 PUSH lnn1123.0040302F ; |Title = "GOAL:"
00401045 . 68 00304000 PUSH lnn1123.00403000 ; |Text = "Your job is to make me work as an exit button!"
0040104A . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040104D . E8 32000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401052 . EB 14 JMP SHORT lnn1123.00401068
00401054 . 837D 0C 10 CMP DWORD PTR SS:[EBP+C],10
00401058 . 75 0E JNZ SHORT lnn1123.00401068
0040105A > 6A 00 PUSH 0 ; /Result = 0
0040105C . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040105F . E8 1A000000 CALL <JMP.&USER32.EndDialog> ; \EndDialog
总结:
这里没有提到很多PE的数据结构,为了让新手能够看下去,如果你知道那些数
据结构那更好,我的目的就是要新手看懂!老鸟就不要看了,
就这样就做好了,简单吧,不要看他简单,如果没有PE文件格式知识,很难懂的,
所以看看学习PE多重要啊,没有学的赶快学啊,上面的是简单了,但是如果你
想真正的添加程序功能,上面的这些你是必须要会的,最后谢谢你看完文章:) 附件:reverseme.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!