【问题标题】:Reverse Engineer Assembly逆向工程组装
【发布时间】:2012-03-25 18:02:21
【问题描述】:

我是逆向工程的新手,我想了解更多信息,我尝试反汇编一个目标 exe,在其中遇到了一些我无法真正解释的功能。希望有人帮助可以伸出援助之手。

00161000  /$ 83EC 08        SUB ESP,8
00161003  |. 6A 00          PUSH 0                                   ; /pHandle = NULL
00161005  |. 68 A8311600    PUSH Launcher.001631A8                   ; |FileName = 
0016100A  |. E8 81160000    CALL <JMP.&VERSION.GetFileVersionInfoSiz>; \GetFileVersionInfoSizeW
0016100F  |. 890424         MOV DWORD PTR SS:[ESP],EAX
00161012  |. 85C0           TEST EAX,EAX
00161014  |. 0F84 97000000  JE Launcher.001610B1
0016101A  |. 56             PUSH ESI
0016101B  |. 57             PUSH EDI
0016101C  |. 8B3D 8C301600  MOV EDI,DWORD PTR DS:[<&KERNEL32.GetProc>;  kernel32.GetProcessHeap
00161022  |. 50             PUSH EAX                                 ; /HeapSize
00161023  |. 6A 08          PUSH 8                                   ; |Flags = HEAP_ZERO_MEMORY
00161025  |. FFD7           CALL EDI                                 ; |[GetProcessHeap
00161027  |. 50             PUSH EAX                                 ; |hHeap
00161028  |. FF15 98301600  CALL DWORD PTR DS:[<&KERNEL32.HeapAlloc>>; \HeapAlloc
0016102E  |. 8BF0           MOV ESI,EAX
00161030  |. 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
00161034  |. 56             PUSH ESI                                 ; /Buffer
00161035  |. 50             PUSH EAX                                 ; |BufSize
00161036  |. 6A 00          PUSH 0                                   ; |Reserved = 0
00161038  |. 68 A8311600    PUSH Launcher.001631A8                   ; |FileName = 
0016103D  |. E8 42160000    CALL <JMP.&VERSION.GetFileVersionInfoW>  ; \GetFileVersionInfoW
00161042  |. 8D4C24 08      LEA ECX,DWORD PTR SS:[ESP+8]
00161046  |. 51             PUSH ECX                                 ; /pValueSize
00161047  |. 8D5424 10      LEA EDX,DWORD PTR SS:[ESP+10]            ; |
0016104B  |. 52             PUSH EDX                                 ; |ppValue
0016104C  |. 68 D0311600    PUSH Launcher.001631D0                   ; |pSubBlock = "\"
00161051  |. 56             PUSH ESI                                 ; |pBlock
00161052  |. E8 33160000    CALL <JMP.&VERSION.VerQueryValueW>       ; \VerQueryValueW
00161057  |. 8B4C24 0C      MOV ECX,DWORD PTR SS:[ESP+C]
0016105B  |. 8B41 08        MOV EAX,DWORD PTR DS:[ECX+8]
0016105E  |. 25 0000FFFF    AND EAX,FFFF0000
00161063  |. C1E0 0C        SHL EAX,0C
00161066  |. 894424 08      MOV DWORD PTR SS:[ESP+8],EAX
0016106A  |. 8B51 08        MOV EDX,DWORD PTR DS:[ECX+8]
0016106D  |. 83E2 0F        AND EDX,0F
00161070  |. C1E2 18        SHL EDX,18
00161073  |. 0BC2           OR EAX,EDX
00161075  |. 894424 08      MOV DWORD PTR SS:[ESP+8],EAX
00161079  |. 8B51 0C        MOV EDX,DWORD PTR DS:[ECX+C]
0016107C  |. 81E2 00007F00  AND EDX,7F0000*
00161082  |. 03D2           ADD EDX,EDX
00161084  |. 0BC2           OR EAX,EDX
00161086  |. 894424 08      MOV DWORD PTR SS:[ESP+8],EAX
0016108A  |. 8B49 0C        MOV ECX,DWORD PTR DS:[ECX+C]
0016108D  |. 81E1 FF1F0000  AND ECX,1FFF
00161093  |. 81C9 00A00100  OR ECX,1A000
00161099  |. 56             PUSH ESI                                 ; /pMemory
0016109A  |. 0BC1           OR EAX,ECX                               ; |
0016109C  |. 6A 00          PUSH 0                                   ; |Flags = 0
0016109E  |. 894424 10      MOV DWORD PTR SS:[ESP+10],EAX            ; |
001610A2  |. FFD7           CALL EDI                                 ; |[GetProcessHeap
001610A4  |. 50             PUSH EAX                                 ; |hHeap
001610A5  |. FF15 90301600  CALL DWORD PTR DS:[<&KERNEL32.HeapFree>] ; \HeapFree
001610AB  |. 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
001610AF  |. 5F             POP EDI
001610B0  |. 5E             POP ESI
001610B1  |> 83C4 08        ADD ESP,8
001610B4  \. C3             RETN

从地址 0016105700161093 的部分是我不太了解事情进展的地方。其余的只是调用不同的 API,所以没什么大不了的。(文件名已删除)

如果有人可以向我解释粗体部分,我真的很感激。

【问题讨论】:

    标签: assembly reverse-engineering disassembly machine-code


    【解决方案1】:

    我的分析是这样的。

    00161057 |。 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C] ; ppValue = 结构 VS_FIXEDFILEINFO* 0016105B |。 8B41 08 MOV EAX,DWORD PTR DS:[ECX+8] ; ppValue+8 = dwFileVersionMS 0016105E |。 25 0000FFFF 和 EAX,FFFF0000 ; 00161063 |。 C1E0 0C SHL EAX,0C ; (dwFileVersionMS & 0xFFFF0000) &lt&lt 0xC 00161066 |。 894424 08 MOV DWORD PTR SS:[ESP+8],EAX ;将该值保存在堆栈中 0016106A |。 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8] ; ppValue+8 = dwFileVersionMS 0016106D |。 83E2 0F 和 EDX,0F 00161070 |。 C1E2 18 SHL EDX,18 ; (dwFileVersionMS & 0xF) &lt&lt 0x18 00161073 |。 0BC2 或 EAX,EDX ;与先前的值结合 00161075 |。 894424 08 MOV DWORD PTR SS:[ESP+8],EAX ;将该值保存在堆栈中 00161079 |。 8B51 0C MOV EDX,DWORD PTR DS:[ECX+C] ; ppValue+0xC = dwFileVersionLS 0016107C |。 81E2 00007F00 和 EDX,7F0000* 00161082 |。 03D2 添加 EDX,EDX ; 2*(dwFileVersionLS & 0x7F0000) 00161084 |。 0BC2 或 EAX,EDX ;与先前的值结合 00161086 |。 894424 08 MOV DWORD PTR SS:[ESP+8],EAX ;将该值保存在堆栈中 0016108A |。 8B49 0C MOV ECX,DWORD PTR DS:[ECX+C] ; dwFileVersionLS 0016108D |。 81E1 FF1F0000 和 ECX,1FFF 00161093 |。 81C9 00A00100 或 ECX,1A000 ; dwFileVersionLS & 0x1FFFF | 0x1A000 00161099 |。 56推ESI; /p内存 0016109A |。 0BC1 或 EAX,ECX ; |与先前的值结合 0016109C |。 6A 00 推 0 ; |标志 = 0 0016109E |。 894424 10 MOV DWORD PTR SS:[ESP+10],EAX ; |在堆栈上保存值 001610A2 |。 FFD7 呼叫 EDI ; |[获取进程堆 001610A4 |。 50 推 EAX ; |h堆 001610A5 |。 FF15 90301600 CALL DWORD PTR DS:[] ; \无堆 001610AB |。 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] ;检索返回的计算值 001610AF |。 5F POP EDI 001610B0 |。 5E POP ESI 001610B1 |> 83C4 08 添加 ESP,8 001610B4\. C3 RETN

    在 C 中看起来像:

    DWORD ret = ((dwFileVersionMS & 0xFFFF0000) &lt&lt 0xC) | ((dwFileVersionMS & 0xF) &lt&lt 0x18) | (2*(dwFileVersionLS & 0x7F0000)) | (dwFileVersionLS & 0x1FFF) | 0x1A000;

    【讨论】:

    • 我发现十进制的移位更具可读性(在 C/C++ 中时),但仍然是 +1 ;)
    • 感谢您的解释!这应该结束我的问题!
    【解决方案2】:

    我认为地址 00161057 上的指令是一个有 3 个参数的函数,因为当使用 ESP 作为参数时,它通常是 4 个字节(DWORD)。现在十进制的C是12。现在ESP+C(c作为偏移量)的内容是指第三个参数,它存储在ECX中,然后将ECX+8的内容复制到EAX,认为EAX+8是一个全局变量。 无论如何,如果我错了,我的意见仍然可以由其他人改进。

    但是,您可以阅读 wikibook 的 x86 反汇编 以及 MOV EAX,DWORD PTR DS:[ECX+8] 指令的寻址模式

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 2015-06-29
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2011-01-17
      • 2018-05-24
      相关资源
      最近更新 更多