首页
社区
课程
招聘
[旧帖] 样本的释放分析 0.00雪花
发表于: 2011-10-5 13:52 887

[旧帖] 样本的释放分析 0.00雪花

2011-10-5 13:52
887

在卡饭下了个样本练手,没逆出不良行为。于是
分析了下程序的释放过程安慰下自己,水平有限高手就别扔砖了,
诚恳希望高手有空给逆下结果放出来学习下。

第一次释放exe在临时目录下,释放完后执行,
临时目录下的exe会在C:\Program Files下创建一个Toyo\masmyk目录
然后再次释放二个文件,释放完后并执行;

Pokemon.exe

进入程序来到
004038A4  /$  55            PUSH EBP
004038A5  |.  8BEC          MOV EBP,ESP
004038A7  |.  83C4 C4       ADD ESP,-3C
004038AA  |.  B8 FCA44100   MOV EAX,Pokemon.0041A4FC
004038AF  |.  53            PUSH EBX
004038B0  |.  BB 70554100   MOV EBX,Pokemon.00415570
004038B5  |.  56            PUSH ESI
004038B6  |.  E8 65C80000   CALL Pokemon.00410120

这个call对字符集的字符调用了IsDBCSLeadByte结果保存在 0041A4FC

CALL Pokemon.00410120
{
00410120  /$  53            PUSH EBX
00410121  |.  56            PUSH ESI
00410122  |.  83C4 EC       ADD ESP,-14
00410125  |.  8BF0          MOV ESI,EAX
00410127  |.  54            PUSH ESP                                 ; /pCPInfo
00410128  |.  6A 00         PUSH 0                                   ; |CodePage = CP_ACP
0041012A  |.  E8 A1390000   CALL <JMP.&KERNEL32.GetCPInfo>           ; \GetCPInfo
0041012F  |.  833C24 01     CMP DWORD PTR SS:[ESP],1
00410133  |.  0F97C0        SETA AL
00410136  |.  83E0 01       AND EAX,1
00410139  |.  8886 00010000 MOV BYTE PTR DS:[ESI+100],AL
0041013F  |.  33DB          XOR EBX,EBX
00410141  |>  53            PUSH EBX                                 ; /TestChar
00410142  |.  E8 1F3A0000   CALL <JMP.&KERNEL32.IsDBCSLeadByte>      ; \IsDBCSLeadByte
00410147  |.  85C0          TEST EAX,EAX
00410149  |.  0F95C0        SETNE AL
0041014C  |.  83E0 01       AND EAX,1
0041014F  |.  88041E        MOV BYTE PTR DS:[ESI+EBX],AL
00410152  |.  43            INC EBX
00410153  |.  81FB 00010000 CMP EBX,100
00410159  |.^ 7C E6         JL SHORT Pokemon.00410141
0041015B  |.  83C4 14       ADD ESP,14
0041015E  |.  5E            POP ESI
0041015F  |.  5B            POP EBX
00410160  \.  C3            RETN
}

继续往下

004039DE  |.  E8 611C0000   CALL Pokemon.00405644                   ;加载com
004039E3  |.  BA 70514100   MOV EDX,Pokemon.00415170
004039E8  |.  B8 E0A44100   MOV EAX,Pokemon.0041A4E0
004039ED  |.  E8 92120000   CALL Pokemon.00404C84                    ;  打开程序文件查找数据
004039F2  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
004039F5  |.  E8 F2070000   CALL Pokemon.004041EC
004039FA  |.  8D45 C4       LEA EAX,DWORD PTR SS:[EBP-3C]
004039FD  |.  E8 EA070000   CALL Pokemon.004041EC                    ;  buffer清零操作
00403A02  |.  6A 00         PUSH 0                                   ; /lParam = NULL
00403A04  |.  68 83114000   PUSH Pokemon.00401183                    ; |DlgProc = Pokemon.00401183
00403A09  |.  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]            ; |
00403A0C  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
00403A0E  |.  8915 785D4100 MOV DWORD PTR DS:[415D78],EDX            ; |
00403A14  |.  8D4D C4       LEA ECX,DWORD PTR SS:[EBP-3C]            ; |
00403A17  |.  68 13414100   PUSH Pokemon.00414113                    ; |pTemplate = "STARTDLG"
00403A1C  |.  53            PUSH EBX                                 ; |hInst
00403A1D  |.  890D 7C5D4100 MOV DWORD PTR DS:[415D7C],ECX            ; |
00403A23  |.  E8 40020100   CALL <JMP.&USER32.DialogBoxParamA>       ; \DialogBoxParamA

CALL Pokemon.00404C84                    ;  打开程序文件查找数据
{

00404C84  /$  53            PUSH EBX
00404C85  |.  8BD8          MOV EBX,EAX
00404C87  |.  8BC3          MOV EAX,EBX
00404C89  |.  E8 0A000000   CALL Pokemon.00404C98  这个call里进行了开文件查找数据的操作
00404C8E  |.  8BC3          MOV EAX,EBX
00404C90  |.  E8 E3020000   CALL Pokemon.00404F78       
}

CALL Pokemon.00404C98
{
在CALL Pokemon.0040E2B0                    ;  buf初始化
处会有个结构的初始化,后面有很多地方用到这个结构

00404CAC  |.  8B8424 003000>MOV EAX,DWORD PTR SS:[ESP+3000]
00404CB3  |.  83C4 D8       ADD ESP,-28
00404CB6  |.  8BDA          MOV EBX,EDX
00404CB8  |.  8BF0          MOV ESI,EAX
00404CBA  |.  8DAC24 2C1000>LEA EBP,DWORD PTR SS:[ESP+102C]
00404CC1  |.  BA 5C000000   MOV EDX,5C
00404CC6  |.  8BC3          MOV EAX,EBX
00404CC8  |.  E8 13AB0000   CALL Pokemon.0040F7E0                    ;  字符查找函数==strstr
00404CCD  |.  85C0          TEST EAX,EAX
00404CCF  |.  75 31         JNZ SHORT Pokemon.00404D02
00404CD1  |.  68 00040000   PUSH 400                                 ; /BufSize = 400 (1024.)
00404CD6  |.  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]            ; |
00404CDA  |.  51            PUSH ECX                                 ; |PathBuffer
00404CDB  |.  6A 00         PUSH 0                                   ; |hModule = NULL
00404CDD  |.  E8 30EE0000   CALL <JMP.&KERNEL32.GetModuleFileNameA>  ; \GetModuleFileNameA
00404CE2  |.  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
00404CE6  |.  BA 5C000000   MOV EDX,5C
00404CEB  |.  E8 08AB0000   CALL Pokemon.0040F7F8
00404CF0  |.  85C0          TEST EAX,EAX
00404CF2  |.  0F84 74020000 JE Pokemon.00404F6C
00404CF8  |.  40            INC EAX
00404CF9  |.  8BD3          MOV EDX,EBX
00404CFB  |.  E8 50AB0000   CALL Pokemon.0040F850
00404D00  |.  EB 0B         JMP SHORT Pokemon.00404D0D
00404D02  |>  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
00404D06  |.  8BD3          MOV EDX,EBX
00404D08  |.  E8 43AB0000   CALL Pokemon.0040F850                    ;  memcpy
00404D0D  |>  8D8424 0C0400>LEA EAX,DWORD PTR SS:[ESP+40C]
00404D14  |.  E8 97950000   CALL Pokemon.0040E2B0                    ;  buf初始化

这个结构比较大,列出一些后面用到的
struct HFILE
{
  DWORD dwFun;
  HAND  hFile;
  BYTE  byUnKnow[7];
  char  chDirectry[MAXPATH]       
}   

00404D19  |.  6A 01         PUSH 1
00404D1B  |.  6A 00         PUSH 0
00404D1D  |.  8D5424 14     LEA EDX,DWORD PTR SS:[ESP+14]
00404D21  |.  8D8424 140400>LEA EAX,DWORD PTR SS:[ESP+414]
00404D28  |.  33C9          XOR ECX,ECX
00404D2A  |.  E8 1D960000   CALL Pokemon.0040E34C                    ;  开文件初始化BUF的文件句柄成员
00404D2F  |.  84C0          TEST AL,AL
00404D31  |.  75 16         JNZ SHORT Pokemon.00404D49
00404D33  |.  8D8424 0C0400>LEA EAX,DWORD PTR SS:[ESP+40C]
00404D3A  |.  BA 02000000   MOV EDX,2
00404D3F  |.  E8 C0950000   CALL Pokemon.0040E304
00404D44  |.  E9 23020000   JMP Pokemon.00404F6C
00404D49  |>  C70424 FFFFFF>MOV DWORD PTR SS:[ESP],-1
00404D50  |.  33C9          XOR ECX,ECX
00404D52  |.  894C24 04     MOV DWORD PTR SS:[ESP+4],ECX
00404D56  |.  E9 D7000000   JMP Pokemon.00404E32
00404D5B  |>  8D8424 0C0400>/LEA EAX,DWORD PTR SS:[ESP+40C]
00404D62  |.  E8 399C0000   |CALL Pokemon.0040E9A0                   ;  设置文件指针
00404D67  |.  894424 08     |MOV DWORD PTR SS:[ESP+8],EAX
00404D6B  |.  8BD5          |MOV EDX,EBP
00404D6D  |.  8D8424 0C0400>|LEA EAX,DWORD PTR SS:[ESP+40C]
00404D74  |.  B9 00200000   |MOV ECX,2000                            ;  要读取的字节数
00404D79  |.  E8 069A0000   |CALL Pokemon.0040E784                   ;  读取文件
00404D7E  |.  8BF8          |MOV EDI,EAX
00404D80  |.  83FF 10       |CMP EDI,10
00404D83  |.  0F8C BA000000 |JL Pokemon.00404E43
00404D89  |.  33DB          |XOR EBX,EBX
00404D8B  |.  EB 7C         |JMP SHORT Pokemon.00404E09
00404D8D  |>  33C0          |/XOR EAX,EAX
00404D8F  |.  8A441D 00     ||MOV AL,BYTE PTR SS:[EBP+EBX]
00404D93  |.  83F8 2A       ||CMP EAX,2A
00404D96  |.  75 2C         ||JNZ SHORT Pokemon.00404DC4
00404D98  |.  33D2          ||XOR EDX,EDX
00404D9A  |.  8A541D 01     ||MOV DL,BYTE PTR SS:[EBP+EBX+1]
00404D9E  |.  83FA 2A       ||CMP EDX,2A
00404DA1  |.  75 21         ||JNZ SHORT Pokemon.00404DC4
00404DA3  |.  BA 40454100   ||MOV EDX,Pokemon.00414540               ;  ASCII "*messages***"
00404DA8  |.  8D45 02       ||LEA EAX,DWORD PTR SS:[EBP+2]
00404DAB  |.  03C3          ||ADD EAX,EBX
00404DAD  |.  B9 0B000000   ||MOV ECX,0B
00404DB2  |.  E8 EDAA0000   ||CALL Pokemon.0040F8A4
00404DB7  |.  85C0          ||TEST EAX,EAX
00404DB9  |.  75 09         ||JNZ SHORT Pokemon.00404DC4
00404DBB  |.  035C24 08     ||ADD EBX,DWORD PTR SS:[ESP+8]
00404DBF  |.  891C24        ||MOV DWORD PTR SS:[ESP],EBX
00404DC2  |.  EB 50         ||JMP SHORT Pokemon.00404E14
00404DC4  |>  33C0          ||XOR EAX,EAX
00404DC6  |.  8A441D 00     ||MOV AL,BYTE PTR SS:[EBP+EBX]
00404DCA  |.  83F8 52       ||CMP EAX,52
00404DCD  |.  75 39         ||JNZ SHORT Pokemon.00404E08
00404DCF  |.  33D2          ||XOR EDX,EDX
00404DD1  |.  8A541D 01     ||MOV DL,BYTE PTR SS:[EBP+EBX+1]
00404DD5  |.  83FA 61       ||CMP EDX,61
00404DD8  |.  75 2E         ||JNZ SHORT Pokemon.00404E08
00404DDA  |.  BA 4D454100   ||MOV EDX,Pokemon.0041454D               ;  在PE数据中查找指定数据开头的数据
00404DDF  |.  8D45 02       ||LEA EAX,DWORD PTR SS:[EBP+2]
00404DE2  |.  03C3          ||ADD EAX,EBX
00404DE4  |.  B9 04000000   ||MOV ECX,4
00404DE9  |.  E8 B6AA0000   ||CALL Pokemon.0040F8A4                  ;  相当于memcmp
00404DEE  |.  85C0          ||TEST EAX,EAX
00404DF0  |.  75 16         ||JNZ SHORT Pokemon.00404E08
00404DF2  |.  8D8424 0C0400>||LEA EAX,DWORD PTR SS:[ESP+40C]
00404DF9  |.  BA 02000000   ||MOV EDX,2
00404DFE  |.  E8 01950000   ||CALL Pokemon.0040E304
00404E03  |.  E9 64010000   ||JMP Pokemon.00404F6C
00404E08  |>  43            ||INC EBX
00404E09  |>  8D4F F0       | LEA ECX,DWORD PTR DS:[EDI-10]
00404E0C  |.  3BD9          ||CMP EBX,ECX
00404E0E  |.^ 0F8E 79FFFFFF |\JLE Pokemon.00404D8D
00404E14  |>  8B4424 08     |MOV EAX,DWORD PTR SS:[ESP+8]
}

接着就是创建对话框了
在窗口处理过程00401183处下断经过一些初始话接着就调用了窗口创建函数

00401267  |.  68 4408A150   PUSH 50A10844                            ; |Style =

WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL|WS_BORDER|844
0040126C  |.  68 99404100   PUSH Pokemon.00414099                    ; |WindowName = ""
00401271  |.  68 1C414100   PUSH Pokemon.0041411C                    ; |Class = "RichEdit"
00401276  |.  6A 00         PUSH 0                                   ; |ExtStyle = 0
00401278  |.  E8 D3290100   CALL <JMP.&USER32.CreateWindowExA>       ; \CreateWindowExA

继续单步往下

00401304  |.  E8 631A0000   CALL Pokemon.00402D6C                    ;  给对话框控件添加自动完成功能
00401309  |.  C605 19404100>MOV BYTE PTR DS:[414019],0
00401310  |.  B9 54404100   MOV ECX,Pokemon.00414054
00401315  |.  BA 48404100   MOV EDX,Pokemon.00414048
0040131A  |.  B8 70514100   MOV EAX,Pokemon.00415170
0040131F  |.  E8 C4230000   CALL Pokemon.004036E8                    ;  解密出

path=temp%..SavePath..Setup=pokemon.exe..Setup=pokemon.jpg..Silent=1..Overwrite=1

看下CALL Pokemon.004036E8 是怎么解密的
{

004036E8  /$  53            PUSH EBX
004036E9  |.  56            PUSH ESI
004036EA  |.  57            PUSH EDI
004036EB  |.  50            PUSH EAX
004036EC  |.  B8 07000000   MOV EAX,7
004036F1  |>  81C4 04F0FFFF /ADD ESP,-0FFC
004036F7  |.  50            |PUSH EAX
004036F8  |.  48            |DEC EAX
004036F9  |.^ 75 F6         \JNZ SHORT Pokemon.004036F1
004036FB  |.  8B8424 007000>MOV EAX,DWORD PTR SS:[ESP+7000]
00403702  |.  81C4 0CFEFFFF ADD ESP,-1F4
00403708  |.  8BF9          MOV EDI,ECX
0040370A  |.  8BF2          MOV ESI,EDX
0040370C  |.  8BD8          MOV EBX,EAX
0040370E  |.  E8 19BA0000   CALL Pokemon.0040F12C                    ;  加密
00403713  |.  8BC4          MOV EAX,ESP
00403715  |.  33D2          XOR EDX,EDX
00403717  |.  E8 CC390000   CALL Pokemon.004070E8                    ;  结构的初始化与加密
0040371C  |.  8BC4          MOV EAX,ESP
0040371E  |.  33C9          XOR ECX,ECX
00403720  |.  8BD3          MOV EDX,EBX
00403722  |.  E8 193C0000   CALL Pokemon.00407340
00403727  |.  8D8424 EC7100>LEA EAX,DWORD PTR SS:[ESP+71EC]
0040372E  |.  E8 99000000   CALL Pokemon.004037CC
00403733  |.  8D9424 EC7100>LEA EDX,DWORD PTR SS:[ESP+71EC]
0040373A  |.  8BC4          MOV EAX,ESP
0040373C  |.  33C9          XOR ECX,ECX
0040373E  |.  E8 D9350000   CALL Pokemon.00406D1C
00403743  |.  84C0          TEST AL,AL
00403745  |.  74 2B         JE SHORT Pokemon.00403772
00403747  |.  8B9C24 F07100>MOV EBX,DWORD PTR SS:[ESP+71F0]
0040374E  |.  891F          MOV DWORD PTR DS:[EDI],EBX
00403750  |.  8D43 01       LEA EAX,DWORD PTR DS:[EBX+1]
00403753  |.  50            PUSH EAX
00403754  |.  E8 53C20000   CALL Pokemon.0040F9AC
00403759  |.  59            POP ECX
0040375A  |.  8906          MOV DWORD PTR DS:[ESI],EAX
0040375C  |.  85C0          TEST EAX,EAX
0040375E  |.  74 12         JE SHORT Pokemon.00403772
00403760  |.  C60418 00     MOV BYTE PTR DS:[EAX+EBX],0
00403764  |.  8BCB          MOV ECX,EBX
00403766  |.  8B9424 EC7100>MOV EDX,DWORD PTR SS:[ESP+71EC]
0040376D  |.  E8 F2BF0000   CALL Pokemon.0040F764
00403772  |>  8D8424 EC7100>LEA EAX,DWORD PTR SS:[ESP+71EC]
00403779  |.  BA 02000000   MOV EDX,2
0040377E  |.  E8 59000000   CALL Pokemon.004037DC
00403783  |.  8D8424 085800>LEA EAX,DWORD PTR SS:[ESP+5808]
0040378A  |.  BA 02000000   MOV EDX,2
0040378F  |.  E8 48000000   CALL Pokemon.004037DC
00403794  |.  8D8424 DC4A00>LEA EAX,DWORD PTR SS:[ESP+4ADC]
0040379B  |.  BA 02000000   MOV EDX,2
004037A0  |.  E8 37000000   CALL Pokemon.004037DC
004037A5  |.  8D8424 901300>LEA EAX,DWORD PTR SS:[ESP+1390]
004037AC  |.  BA 02000000   MOV EDX,2
004037B1  |.  E8 92B80000   CALL Pokemon.0040F048
004037B6  |.  8BC4          MOV EAX,ESP
004037B8  |.  33D2          XOR EDX,EDX
004037BA  |.  E8 45AB0000   CALL Pokemon.0040E304
004037BF  |.  81C4 F8710000 ADD ESP,71F8

CALL Pokemon.0040F12C                    ;  字符加密
{
0040F12C  /$  E8 5F99FFFF   CALL Pokemon.00408A90                    
0040F131  |.  B8 D4A44100   MOV EAX,Pokemon.0041A4D4
0040F136  |.  E8 09D6FFFF   CALL Pokemon.0040C744

CALL Pokemon.00408A90   对字符集进行了一个加密过程加密结果放在416188
{

00408A90  /$  53            PUSH EBX
00408A91  |.  33C9          XOR ECX,ECX
00408A93  |>  8BC1          /MOV EAX,ECX
00408A95  |.  33D2          |XOR EDX,EDX
00408A97  |>  A8 01         |/TEST AL,1
00408A99  |.  74 0C         ||JE SHORT Pokemon.00408AA7
00408A9B  |.  8BD8          ||MOV EBX,EAX
00408A9D  |.  D1EB          ||SHR EBX,1
00408A9F  |.  81F3 2083B8ED ||XOR EBX,EDB88320
00408AA5  |.  EB 04         ||JMP SHORT Pokemon.00408AAB
00408AA7  |>  8BD8          ||MOV EBX,EAX
00408AA9  |.  D1EB          ||SHR EBX,1
00408AAB  |>  8BC3          ||MOV EAX,EBX
00408AAD  |.  42            ||INC EDX
00408AAE  |.  83FA 08       ||CMP EDX,8
00408AB1  |.^ 7C E4         |\JL SHORT Pokemon.00408A97
00408AB3  |.  89048D 886141>|MOV DWORD PTR DS:[ECX*4+416188],EAX
00408ABA  |.  41            |INC ECX
00408ABB  |.  81F9 00010000 |CMP ECX,100
00408AC1  |.^ 7C D0         \JL SHORT Pokemon.00408A93
00408AC3  |.  5B            POP EBX
00408AC4  \.  C3            RETN
}

{
                        MOV EAX,Pokemon.0041A4D4
0040F136  |.  E8 09D6FFFF   CALL Pokemon.0040C744
在41a4d4+8的地方设标记表示加密完成
}
}

CALL Pokemon.004070E8                    ;  结构的初始化与加密
{
004070E8  /$  53            PUSH EBX
004070E9  |.  56            PUSH ESI
004070EA  |.  57            PUSH EDI
004070EB  |.  8BFA          MOV EDI,EDX
004070ED  |.  8BD8          MOV EBX,EAX
004070EF  |.  8BC3          MOV EAX,EBX
004070F1  |.  E8 BA710000   CALL Pokemon.0040E2B0                    ;  某结构的初始化
004070F6  |.  BA 20464100   MOV EDX,Pokemon.00414620
004070FB  |.  8913          MOV DWORD PTR DS:[EBX],EDX
004070FD  |.  8DB3 200C0000 LEA ESI,DWORD PTR DS:[EBX+C20]
00407103  |.  8BC6          MOV EAX,ESI
00407105  |.  E8 BA200000   CALL Pokemon.004091C4                    ;  再次对字符集加密保存

CALL Pokemon.004091C4                    ;  再次对字符集加密保存
{

004091C4  /$  53            PUSH EBX
004091C5  |.  8BD8          MOV EBX,EAX
004091C7  |.  803D 30684100>CMP BYTE PTR DS:[416830],0               ;  判断是否已经加密
004091CE  |.  75 07         JNZ SHORT Pokemon.004091D7
004091D0  |.  8BC3          MOV EAX,EBX
004091D2  |.  E8 110A0000   CALL Pokemon.00409BE8                    ;  加密call
004091D7  |>  8BC3          MOV EAX,EBX
004091D9  |.  5B            POP EBX
004091DA  \.  C3            RETN
}
}

往下走看
CALL Pokemon.00407340
{
00407340  /$  53            PUSH EBX
00407341  |.  56            PUSH ESI
00407342  |.  57            PUSH EDI
00407343  |.  8BF9          MOV EDI,ECX
00407345  |.  8BF2          MOV ESI,EDX
00407347  |.  8BD8          MOV EBX,EAX
00407349  |.  8BCF          MOV ECX,EDI
0040734B  |.  8BD6          MOV EDX,ESI
0040734D  |.  8BC3          MOV EAX,EBX
0040734F  |.  E8 20710000   CALL Pokemon.0040E474                    ;  打开文件保存文件句柄等操作
00407354  |.  84C0          TEST AL,AL
00407356  |.  75 04         JNZ SHORT Pokemon.0040735C
00407358  |.  33C0          XOR EAX,EAX
0040735A  |.  EB 31         JMP SHORT Pokemon.0040738D
0040735C  |>  33D2          XOR EDX,EDX
0040735E  |.  8BC3          MOV EAX,EBX
00407360  |.  E8 67000000   CALL Pokemon.004073CC

CALL Pokemon.004073CC
{
00407340  /$  53            PUSH EBX
00407341  |.  56            PUSH ESI
00407342  |.  57            PUSH EDI
00407343  |.  8BF9          MOV EDI,ECX
00407345  |.  8BF2          MOV ESI,EDX
00407347  |.  8BD8          MOV EBX,EAX
00407349  |.  8BCF          MOV ECX,EDI
0040734B  |.  8BD6          MOV EDX,ESI
0040734D  |.  8BC3          MOV EAX,EBX
0040734F  |.  E8 20710000   CALL Pokemon.0040E474                    ;  打开文件等操作
00407354  |.  84C0          TEST AL,AL
00407356  |.  75 04         JNZ SHORT Pokemon.0040735C
00407358  |.  33C0          XOR EAX,EAX
0040735A  |.  EB 31         JMP SHORT Pokemon.0040738D
0040735C  |>  33D2          XOR EDX,EDX
0040735E  |.  8BC3          MOV EAX,EBX
00407360  |.  E8 67000000   CALL Pokemon.004073CC                    ;  数据操作
00407365  |.  84C0          TEST AL,AL
00407367  |.  75 22         JNZ SHORT Pokemon.0040738B
00407369  |.  B8 78000000   MOV EAX,78
0040736E  |.  E8 8DB6FFFF   CALL Pokemon.00402A00
00407373  |.  50            PUSH EAX
00407374  |.  8D53 17       LEA EDX,DWORD PTR DS:[EBX+17]
00407377  |.  52            PUSH EDX
00407378  |.  E8 87C2FFFF   CALL Pokemon.00403604
0040737D  |.  83C4 08       ADD ESP,8
00407380  |.  8BC3          MOV EAX,EBX
00407382  |.  E8 19720000   CALL Pokemon.0040E5A0
00407387  |.  33C0          XOR EAX,EAX
00407389  |.  EB 02         JMP SHORT Pokemon.0040738D
0040738B  |>  B0 01         MOV AL,1
0040738D  |>  5F            POP EDI
0040738E  |.  5E            POP ESI
0040738F  |.  5B            POP EBX
00407390  \.  C3            RETN

CALL Pokemon.004073CC                    ;  数据操作
{
004073CC  /$  53            PUSH EBX
004073CD  |.  56            PUSH ESI
004073CE  |.  57            PUSH EDI
004073CF  |.  55            PUSH EBP
004073D0  |.  83C4 D0       ADD ESP,-30
004073D3  |.  8BD8          MOV EBX,EAX
004073D5  |.  8BC3          MOV EAX,EBX
004073D7  |.  B9 07000000   MOV ECX,7
004073DC  |.  881424        MOV BYTE PTR SS:[ESP],DL
004073DF  |.  8DB3 343E0000 LEA ESI,DWORD PTR DS:[EBX+3E34]
004073E5  |.  C683 C8650000>MOV BYTE PTR DS:[EBX+65C8],0
004073EC  |.  8BD6          MOV EDX,ESI
004073EE  |.  E8 91730000   CALL Pokemon.0040E784                    ;  读取PE文件头7字节到BUF+3e34
004073F3  |.  83F8 07       CMP EAX,7
004073F6  |.  74 07         JE SHORT Pokemon.004073FF
004073F8  |.  33C0          XOR EAX,EAX
004073FA  |.  E9 50030000   JMP Pokemon.0040774F
004073FF  |>  33D2          XOR EDX,EDX
00407401  |.  8993 CC650000 MOV DWORD PTR DS:[EBX+65CC],EDX
00407407  |.  8BD6          MOV EDX,ESI
00407409  |.  8BC3          MOV EAX,EBX
0040740B  |.  E8 84FFFFFF   CALL Pokemon.00407394                    ;  对读取的字节进行比较
00407410  |.  84C0          TEST AL,AL
00407412  |.  74 1F         JE SHORT Pokemon.00407433
00407414  |.  80BB C0650000>CMP BYTE PTR DS:[EBX+65C0],0
0040741B  |.  0F84 1C010000 JE Pokemon.0040753D
00407421  |.  6A 00         PUSH 0
00407423  |.  6A 00         PUSH 0
00407425  |.  33D2          XOR EDX,EDX
00407427  |.  8BC3          MOV EAX,EBX
00407429  |.  E8 BA740000   CALL Pokemon.0040E8E8
0040742E  |.  E9 0A010000   JMP Pokemon.0040753D
00407433  |>  8D4424 14     LEA EAX,DWORD PTR SS:[ESP+14]
00407437  |.  BA 00000800   MOV EDX,80000
0040743C  |.  E8 17030000   CALL Pokemon.00407758                    ;  分配指定大小的空间
00407441  |.  8BC3          MOV EAX,EBX
00407443  |.  E8 58750000   CALL Pokemon.0040E9A0                    ;  指定文件指针
00407448  |.  8BF8          MOV EDI,EAX
0040744A  |.  8B4C24 18     MOV ECX,DWORD PTR SS:[ESP+18]
0040744E  |.  83C1 F0       ADD ECX,-10
00407451  |.  8B5424 14     MOV EDX,DWORD PTR SS:[ESP+14]
00407455  |.  8BC3          MOV EAX,EBX
00407457  |.  E8 28730000   CALL Pokemon.0040E784                    ;  读文件
0040745C  |.  8BE8          MOV EBP,EAX
0040745E  |.  33F6          XOR ESI,ESI
00407460  |.  3BEE          CMP EBP,ESI
00407462  |.  0F8E A7000000 JLE Pokemon.0040750F
00407468  |>  8B4424 14     /MOV EAX,DWORD PTR SS:[ESP+14]
0040746C  |.  33D2          |XOR EDX,EDX
0040746E  |.  8A1430        |MOV DL,BYTE PTR DS:[EAX+ESI]
00407471  |.  83FA 52       |CMP EDX,52                              ;  在读出来的数据中查找第一个字节是否52
00407474  |.  0F85 8C000000 |JNZ Pokemon.00407506
0040747A  |.  8BD0          |MOV EDX,EAX
0040747C  |.  8BC3          |MOV EAX,EBX
0040747E  |.  03D6          |ADD EDX,ESI
00407480  |.  E8 0FFFFFFF   |CALL Pokemon.00407394                   ;  判断是否Rar!(估在找寻压缩的数据起始位置)
00407485  |.  84C0          |TEST AL,AL
00407487  |.  74 7D         |JE SHORT Pokemon.00407506
00407489  |.  80BB C0650000>|CMP BYTE PTR DS:[EBX+65C0],0
00407490  |.  74 3F         |JE SHORT Pokemon.004074D1
00407492  |.  85F6          |TEST ESI,ESI
00407494  |.  7E 3B         |JLE SHORT Pokemon.004074D1
00407496  |.  83FF 1C       |CMP EDI,1C
00407499  |.  7D 36         |JGE SHORT Pokemon.004074D1
0040749B  |.  83FD 1F       |CMP EBP,1F
0040749E  |.  7E 31         |JLE SHORT Pokemon.004074D1
004074A0  |.  B8 1C000000   |MOV EAX,1C
004074A5  |.  2BC7          |SUB EAX,EDI
004074A7  |.  034424 14     |ADD EAX,DWORD PTR SS:[ESP+14]
004074AB  |.  33D2          |XOR EDX,EDX
004074AD  |.  8A10          |MOV DL,BYTE PTR DS:[EAX]
004074AF  |.  83FA 52       |CMP EDX,52
004074B2  |.  75 52         |JNZ SHORT Pokemon.00407506
004074B4  |.  33C9          |XOR ECX,ECX
004074B6  |.  8A48 01       |MOV CL,BYTE PTR DS:[EAX+1]
004074B9  |.  83F9 53       |CMP ECX,53
004074BC  |.  75 48         |JNZ SHORT Pokemon.00407506
004074BE  |.  33D2          |XOR EDX,EDX
004074C0  |.  8A50 02       |MOV DL,BYTE PTR DS:[EAX+2]
004074C3  |.  83FA 46       |CMP EDX,46
004074C6  |.  75 3E         |JNZ SHORT Pokemon.00407506
004074C8  |.  0FB640 03     |MOVZX EAX,BYTE PTR DS:[EAX+3]
004074CC  |.  83F8 58       |CMP EAX,58
004074CF  |.  75 35         |JNZ SHORT Pokemon.00407506
004074D1  |>  8D0C3E        |LEA ECX,DWORD PTR DS:[ESI+EDI]
004074D4  |.  33D2          |XOR EDX,EDX
004074D6  |.  898B CC650000 |MOV DWORD PTR DS:[EBX+65CC],ECX         ;  rar!所在的PE偏移在PE偏移18607处找到压缩数据
004074DC  |.  52            |PUSH EDX
004074DD  |.  8BC1          |MOV EAX,ECX
004074DF  |.  33D2          |XOR EDX,EDX
004074E1  |.  50            |PUSH EAX
004074E2  |.  8BC3          |MOV EAX,EBX
004074E4  |.  E8 FF730000   |CALL Pokemon.0040E8E8                   ;  从新设置文件指针
004074E9  |.  80BB C0650000>|CMP BYTE PTR DS:[EBX+65C0],0
004074F0  |.  75 1D         |JNZ SHORT Pokemon.0040750F
004074F2  |.  8D93 343E0000 |LEA EDX,DWORD PTR DS:[EBX+3E34]
004074F8  |.  B9 07000000   |MOV ECX,7
004074FD  |.  8BC3          |MOV EAX,EBX
004074FF  |.  E8 80720000   |CALL Pokemon.0040E784                   ;  从找到的地方从新读7字节到buf+3e34
00407504  |.  EB 09         |JMP SHORT Pokemon.0040750F
00407506  |>  46            |INC ESI
00407507  |.  3BEE          |CMP EBP,ESI
00407509  |.^ 0F8F 59FFFFFF \JG Pokemon.00407468
0040750F  |>  83BB CC650000>CMP DWORD PTR DS:[EBX+65CC],0            ;  rar!在磁盘文件中的偏移
00407516  |. /75 17         JNZ SHORT Pokemon.0040752F
00407518  |. |33C0          XOR EAX,EAX
0040751A  |. |50            PUSH EAX
0040751B  |. |8D4424 18     LEA EAX,DWORD PTR SS:[ESP+18]
0040751F  |. |BA 02000000   MOV EDX,2
00407524  |. |E8 5F020000   CALL Pokemon.00407788                    ;  free
00407529  |. |58            POP EAX
0040752A  |. |E9 20020000   JMP Pokemon.0040774F
0040752F  |> \8D4424 14     LEA EAX,DWORD PTR SS:[ESP+14]
00407533  |.  BA 02000000   MOV EDX,2
00407538  |.  E8 4B020000   CALL Pokemon.00407788
0040753D  |>  8BC3          MOV EAX,EBX
0040753F  |.  E8 90030000   CALL Pokemon.004078D4                    ;  从文件读数据
00407544  |.  8BC3          MOV EAX,EBX
00407546  |.  E8 65020000   CALL Pokemon.004077B0                    ;  设置文件指针
0040754B  |.  66:8B93 D2650>MOV DX,WORD PTR DS:[EBX+65D2]            ;  前面酸出来的数字
00407552  |.  66:3B93 943E0>CMP DX,WORD PTR DS:[EBX+3E94]            ;  这个地方应该是数据的校验了   
00407559  |.  74 29         JE SHORT Pokemon.00407584
0040755B  |.  B8 7C000000   MOV EAX,7C
00407560  |.  E8 9BB4FFFF   CALL Pokemon.00402A00
00407565  |.  50            PUSH EAX
00407566  |.  8D53 17       LEA EDX,DWORD PTR DS:[EBX+17]
00407569  |.  52            PUSH EDX
0040756A  |.  E8 95C0FFFF   CALL Pokemon.00403604
0040756F  |.  83C4 08       ADD ESP,8
00407572  |.  E8 EDC0FFFF   CALL Pokemon.00403664
00407577  |.  803C24 00     CMP BYTE PTR SS:[ESP],0
0040757B  |.  75 07         JNZ SHORT Pokemon.00407584
0040757D  |.  33C0          XOR EAX,EAX
0040757F  |.  E9 CB010000   JMP Pokemon.0040774F
00407584  |>  F683 9C3E0000>TEST BYTE PTR DS:[EBX+3E9C],1
0040758B  |.  0F95C2        SETNE DL
0040758E  |.  83E2 01       AND EDX,1
00407591  |.  8893 C2650000 MOV BYTE PTR DS:[EBX+65C2],DL
00407597  |.  F683 9C3E0000>TEST BYTE PTR DS:[EBX+3E9C],8
0040759E  |.  0F95C1        SETNE CL
004075A1  |.  83E1 01       AND ECX,1
004075A4  |.  888B C1650000 MOV BYTE PTR DS:[EBX+65C1],CL
004075AA  |.  F683 9C3E0000>TEST BYTE PTR DS:[EBX+3E9C],2
004075B1  |.  0F95C0        SETNE AL
004075B4  |.  83E0 01       AND EAX,1
004075B7  |.  8883 C3650000 MOV BYTE PTR DS:[EBX+65C3],AL
004075BD  |.  F683 9C3E0000>TEST BYTE PTR DS:[EBX+3E9C],4
004075C4  |.  0F95C2        SETNE DL
004075C7  |.  83E2 01       AND EDX,1
004075CA  |.  8893 C4650000 MOV BYTE PTR DS:[EBX+65C4],DL
004075D0  |.  83BB A43E0000>CMP DWORD PTR DS:[EBX+3EA4],0
004075D7  |.  0F95C1        SETNE CL
004075DA  |.  83E1 01       AND ECX,1
004075DD  |.  888B C5650000 MOV BYTE PTR DS:[EBX+65C5],CL
004075E3  |.  F683 9C3E0000>TEST BYTE PTR DS:[EBX+3E9C],40
004075EA  |.  0F95C0        SETNE AL
004075ED  |.  83E0 01       AND EAX,1
004075F0  |.  8883 C7650000 MOV BYTE PTR DS:[EBX+65C7],AL
004075F6  |.  F683 9C3E0000>TEST BYTE PTR DS:[EBX+3E9C],80
004075FD  |.  0F95C2        SETNE DL
00407600  |.  83E2 01       AND EDX,1
00407603  |.  8893 C8650000 MOV BYTE PTR DS:[EBX+65C8],DL
00407609  |.  80BB A83E0000>CMP BYTE PTR DS:[EBX+3EA8],24
00407610  |.  76 16         JBE SHORT Pokemon.00407628
00407612  |.  B8 D4A44100   MOV EAX,Pokemon.0041A4D4
00407617  |.  BA 01000000   MOV EDX,1
0040761C  |.  E8 63530000   CALL Pokemon.0040C984
00407621  |.  33C0          XOR EAX,EAX
00407623  |.  E9 27010000   JMP Pokemon.0040774F
00407628  |>  80BB 843E0000>CMP BYTE PTR DS:[EBX+3E84],0
0040762F  |.  74 0D         JE SHORT Pokemon.0040763E
00407631  |.  80BB C8650000>CMP BYTE PTR DS:[EBX+65C8],0
00407638  |.  0F85 0F010000 JNZ Pokemon.0040774D
0040763E  |>  8D4424 20     LEA EAX,DWORD PTR SS:[ESP+20]
00407642  |.  8BD3          MOV EDX,EBX
00407644  |.  E8 AB830000   CALL Pokemon.0040F9F4
00407649  |.  8B8B B0650000 MOV ECX,DWORD PTR DS:[EBX+65B0]
0040764F  |.  894C24 04     MOV DWORD PTR SS:[ESP+4],ECX
00407653  |.  8B8B B4650000 MOV ECX,DWORD PTR DS:[EBX+65B4]
00407659  |.  894C24 08     MOV DWORD PTR SS:[ESP+8],ECX
0040765D  |.  8B83 B8650000 MOV EAX,DWORD PTR DS:[EBX+65B8]
00407663  |.  894424 0C     MOV DWORD PTR SS:[ESP+C],EAX
00407667  |.  8B83 BC650000 MOV EAX,DWORD PTR DS:[EBX+65BC]
0040766D  |.  894424 10     MOV DWORD PTR SS:[ESP+10],EAX
00407671  |.  C683 C6650000>MOV BYTE PTR DS:[EBX+65C6],0
00407678  |.  E9 8B000000   JMP Pokemon.00407708
0040767D  |>  8B83 803E0000 /MOV EAX,DWORD PTR DS:[EBX+3E80]
00407683  |.  83F8 7A       |CMP EAX,7A
00407686  |.  75 47         |JNZ SHORT Pokemon.004076CF
00407688  |.  BA 1C464100   |MOV EDX,Pokemon.0041461C                ;  ASCII "CMT"
0040768D  |.  8D83 084C0000 |LEA EAX,DWORD PTR DS:[EBX+4C08]
00407693  |.  E8 E4810000   |CALL Pokemon.0040F87C
00407698  |.  85C0          |TEST EAX,EAX
0040769A  |.  0F94C2        |SETE DL
0040769D  |.  83E2 01       |AND EDX,1
004076A0  |.  84D2          |TEST DL,DL
004076A2  |.  74 07         |JE SHORT Pokemon.004076AB
004076A4  |.  C683 C3650000>|MOV BYTE PTR DS:[EBX+65C3],1
004076AB  |>  F683 E04B0000>|TEST BYTE PTR DS:[EBX+4BE0],1
004076B2  |.  75 12         |JNZ SHORT Pokemon.004076C6
004076B4  |.  80BB C2650000>|CMP BYTE PTR DS:[EBX+65C2],0
004076BB  |.  74 44         |JE SHORT Pokemon.00407701
004076BD  |.  F683 9D3E0000>|TEST BYTE PTR DS:[EBX+3E9D],1
004076C4  |.  75 3B         |JNZ SHORT Pokemon.00407701
004076C6  |>  C683 C6650000>|MOV BYTE PTR DS:[EBX+65C6],1
004076CD  |.  EB 32         |JMP SHORT Pokemon.00407701
004076CF  |>  83F8 74       |CMP EAX,74
004076D2  |.  75 43         |JNZ SHORT Pokemon.00407717
004076D4  |.  F683 B43E0000>|TEST BYTE PTR DS:[EBX+3EB4],1
004076DB  |.  75 1B         |JNZ SHORT Pokemon.004076F8
004076DD  |.  80BB C2650000>|CMP BYTE PTR DS:[EBX+65C2],0
004076E4  |.  74 31         |JE SHORT Pokemon.00407717
004076E6  |.  80BB CC3E0000>|CMP BYTE PTR DS:[EBX+3ECC],1D
004076ED  |.  72 28         |JB SHORT Pokemon.00407717
004076EF  |.  F683 9D3E0000>|TEST BYTE PTR DS:[EBX+3E9D],1
004076F6  |.  75 1F         |JNZ SHORT Pokemon.00407717
004076F8  |>  C683 C6650000>|MOV BYTE PTR DS:[EBX+65C6],1
004076FF  |.  EB 16         |JMP SHORT Pokemon.00407717
00407701  |>  8BC3          |MOV EAX,EBX
00407703  |.  E8 A8000000   |CALL Pokemon.004077B0                   ;  设置文件指针
00407708  |>  8BC3           MOV EAX,EBX
0040770A  |.  E8 C5010000   |CALL Pokemon.004078D4
0040770F  |.  85C0          |TEST EAX,EAX
00407711  |.^ 0F85 66FFFFFF \JNZ Pokemon.0040767D
00407717  |>  8B5424 04     MOV EDX,DWORD PTR SS:[ESP+4]
0040771B  |.  8D4424 20     LEA EAX,DWORD PTR SS:[ESP+20]
0040771F  |.  8993 B0650000 MOV DWORD PTR DS:[EBX+65B0],EDX
00407725  |.  8B5424 08     MOV EDX,DWORD PTR SS:[ESP+8]
00407729  |.  8993 B4650000 MOV DWORD PTR DS:[EBX+65B4],EDX
0040772F  |.  BA 02000000   MOV EDX,2
00407734  |.  8B4C24 0C     MOV ECX,DWORD PTR SS:[ESP+C]
00407738  |.  898B B8650000 MOV DWORD PTR DS:[EBX+65B8],ECX
0040773E  |.  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
00407742  |.  898B BC650000 MOV DWORD PTR DS:[EBX+65BC],ECX
00407748  |.  E8 CB820000   CALL Pokemon.0040FA18
0040774D  |>  B0 01         MOV AL,1
0040774F  |>  83C4 30       ADD ESP,30
00407752  |.  5D            POP EBP
00407753  |.  5F            POP EDI
00407754  |.  5E            POP ESI
00407755  |.  5B            POP EBX
00407756  \.  C3            RETN

CALL Pokemon.004078D4                    ;  从文件读数据
{
004078D4  /$  53            PUSH EBX
004078D5  |.  56            PUSH ESI
004078D6  |.  57            PUSH EDI
004078D7  |.  55            PUSH EBP
004078D8  |.  81C4 04F0FFFF ADD ESP,-0FFC
004078DE  |.  8BE8          MOV EBP,EAX
004078E0  |.  50            PUSH EAX
004078E1  |.  8BC5          MOV EAX,EBP
004078E3  |.  81C4 58FFFFFF ADD ESP,-0A8
004078E9 >|.  E8 B2700000   CALL Pokemon.0040E9A0                    ;  设置文件指针
004078EE  |.  8985 B0650000 MOV DWORD PTR SS:[EBP+65B0],EAX          ;  +65b0为当前文件指针的偏移
004078F4  |.  8995 B4650000 MOV DWORD PTR SS:[EBP+65B4],EDX
004078FA  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
004078FE  |.  8BD5          MOV EDX,EBP
00407900  |.  E8 37780000   CALL Pokemon.0040F13C                    ;  设置新的BUF存储数据
00407905  |.  80BD C8650000>CMP BYTE PTR SS:[EBP+65C8],0
0040790C  |.  74 1F         JE SHORT Pokemon.0040792D

继续单步往下
004079E4  |> \8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
004079E8  |.  BA 07000000   MOV EDX,7
004079ED  |.  E8 6E770000   CALL Pokemon.0040F160                    ;  读7字节
004079F2  |.  837C24 44 00  CMP DWORD PTR SS:[ESP+44],0

继续往下
00407A7E  |> \8D95 883E0000 LEA EDX,DWORD PTR SS:[EBP+3E88]
00407A84  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407A88  |.  E8 73770000   CALL Pokemon.0040F200                    ;  拷贝2字节到buf+3e88的地方(对原始数据进行了扩展)
00407A8D  |.  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]
00407A91  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407A95  |.  E8 56770000   CALL Pokemon.0040F1F0                    ;  拷贝一个字节
00407A9A  |.  33D2          XOR EDX,EDX
00407A9C  |.  8A5424 08     MOV DL,BYTE PTR SS:[ESP+8]
00407AA0  |.  8995 8C3E0000 MOV DWORD PTR SS:[EBP+3E8C],EDX
00407AA6  |.  8D95 903E0000 LEA EDX,DWORD PTR SS:[EBP+3E90]
00407AAC  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407AB0  |.  E8 4B770000   CALL Pokemon.0040F200                     ;  拷贝2字节
00407AB5  |.  8D95 923E0000 LEA EDX,DWORD PTR SS:[EBP+3E92]
00407ABB  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407ABF  |.  E8 3C770000   CALL Pokemon.0040F200                     ;  拷贝2字节
00407AC4  |.  66:83BD 923E0>CMP WORD PTR SS:[EBP+3E92],7              ;  这段数据的实际长度
00407ACC  |.  73 49         JNB SHORT Pokemon.00407B17                       

实际长度大于则继续读剩余的数据

JNB SHORT Pokemon.00407B17
00407B17  |> \83BD 8C3E0000>CMP DWORD PTR SS:[EBP+3E8C],75           ;  对原始数据的第3字节进行比较      
00407B1E  |.  75 10         JNZ SHORT Pokemon.00407B30
00407B20  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407B24  |.  BA 06000000   MOV EDX,6
00407B29  |.  E8 32760000   CALL Pokemon.0040F160
00407B2E  |.  EB 35         JMP SHORT Pokemon.00407B65
00407B30  |>  83BD 8C3E0000>CMP DWORD PTR SS:[EBP+3E8C],73
00407B37  |.  75 19         JNZ SHORT Pokemon.00407B52
00407B39  |.  F685 903E0000>TEST BYTE PTR SS:[EBP+3E90],2
00407B40  |.  74 10         JE SHORT Pokemon.00407B52
00407B42  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407B46  |.  BA 06000000   MOV EDX,6
00407B4B  |.  E8 10760000   CALL Pokemon.0040F160
00407B50  |.  EB 13         JMP SHORT Pokemon.00407B65
00407B52  |>  0FB795 923E00>MOVZX EDX,WORD PTR SS:[EBP+3E92]
00407B59  |.  83C2 F9       ADD EDX,-7                                     ;  减去前面所读的7字节
00407B5C  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]

该处的结构大概如下,结构比较大,列出几个常用的成员
struct
{
   PBYTE byteBuf;         数据
   DWORD dwDataLenth;     数据长度
   DWORD dwBufferLenth;   缓冲长度
   HFILE *pHfile;
   DWORD dwDataLen;       数据长度
   DWORD dwExpendLen;     已经扩展的数据
}
00407B60  |.  E8 FB750000   CALL Pokemon.0040F160                    ;  继续读剩余的数据并更新结构
00407B65  |>  0FB785 923E00>MOVZX EAX,WORD PTR SS:[EBP+3E92]
00407B6C  |.  99            CDQ
00407B6D  |.  0385 B0650000 ADD EAX,DWORD PTR SS:[EBP+65B0]          ;  记录当前指针
00407B73  |.  1395 B4650000 ADC EDX,DWORD PTR SS:[EBP+65B4]
00407B79  |.  8985 B8650000 MOV DWORD PTR SS:[EBP+65B8],EAX
00407B7F  |.  8995 BC650000 MOV DWORD PTR SS:[EBP+65BC],EDX
00407B85  |.  8B8D 8C3E0000 MOV ECX,DWORD PTR SS:[EBP+3E8C]

CALL Pokemon.0040F160                    ;  继续读剩余的数据并更新结构
F4到下面
{
0040F1CB  |. /74 1B         JE SHORT Pokemon.0040F1E8
0040F1CD  |. |8BD6          MOV EDX,ESI                              ;  读出的数据少于原始文件指定的数据继续读剩余的
0040F1CF  |. |8BC3          MOV EAX,EBX
0040F1D1  |. |E8 EA7CFFFF   CALL Pokemon.00406EC0                    ;  结构的数据更新
0040F1D6  |. |8B13          MOV EDX,DWORD PTR DS:[EBX]
0040F1D8  |. |0353 10       ADD EDX,DWORD PTR DS:[EBX+10]            ;  BUF往后移已经读取的字节数
0040F1DB  |. |8BCE          MOV ECX,ESI
0040F1DD  |. |8B43 0C       MOV EAX,DWORD PTR DS:[EBX+C]
0040F1E0  |. |E8 9FF5FFFF   CALL Pokemon.0040E784                    ;  读文件
0040F1E5  |. |0143 10       ADD DWORD PTR DS:[EBX+10],EAX
}

这个地方第一次是对压缩块的查找并没有对压缩的数据进行读
第二次才是正式的读取压缩数据
读完后呢需要从新构造存储数据的缓冲这个是根据原始数据的第3字节来决定怎么构造的
{
00407BA8  |> \8B85 883E0000 MOV EAX,DWORD PTR SS:[EBP+3E88]          ;  Case 73 ('s') of switch 00407B8B
00407BAE  |.  8985 943E0000 MOV DWORD PTR SS:[EBP+3E94],EAX
00407BB4  |.  8B85 8C3E0000 MOV EAX,DWORD PTR SS:[EBP+3E8C]
00407BBA  |.  8985 983E0000 MOV DWORD PTR SS:[EBP+3E98],EAX
00407BC0  |.  8B85 903E0000 MOV EAX,DWORD PTR SS:[EBP+3E90]
00407BC6  |.  8985 9C3E0000 MOV DWORD PTR SS:[EBP+3E9C],EAX
00407BCC  |.  8D95 A03E0000 LEA EDX,DWORD PTR SS:[EBP+3EA0]
00407BD2  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407BD6  |.  E8 25760000   CALL Pokemon.0040F200
00407BDB  |.  8D95 A43E0000 LEA EDX,DWORD PTR SS:[EBP+3EA4]
00407BE1  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407BE5  |.  E8 3A760000   CALL Pokemon.0040F224
00407BEA  |.  F685 9D3E0000>TEST BYTE PTR SS:[EBP+3E9D],2
00407BF1  |.  0F84 52050000 JE Pokemon.00408149
00407BF7  |.  8D95 A83E0000 LEA EDX,DWORD PTR SS:[EBP+3EA8]
00407BFD  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407C01  |.  E8 EA750000   CALL Pokemon.0040F1F0
00407C06  |.  E9 3E050000   JMP Pokemon.00408149
00407C0B  |>  8B95 883E0000 MOV EDX,DWORD PTR SS:[EBP+3E88]          ;  Case 7B ('{') of switch 00407B8B
00407C11  |.  8995 B04B0000 MOV DWORD PTR SS:[EBP+4BB0],EDX
00407C17  |.  8B95 8C3E0000 MOV EDX,DWORD PTR SS:[EBP+3E8C]
00407C1D  |.  8995 B44B0000 MOV DWORD PTR SS:[EBP+4BB4],EDX
00407C23  |.  8B95 903E0000 MOV EDX,DWORD PTR SS:[EBP+3E90]
00407C29  |.  8995 B84B0000 MOV DWORD PTR SS:[EBP+4BB8],EDX
00407C2F  |.  F685 B84B0000>TEST BYTE PTR SS:[EBP+4BB8],2
00407C36  |.  74 0F         JE SHORT Pokemon.00407C47
00407C38  |.  8D95 BC4B0000 LEA EDX,DWORD PTR SS:[EBP+4BBC]
00407C3E  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407C42  |.  E8 DD750000   CALL Pokemon.0040F224
00407C47  |>  F685 B84B0000>TEST BYTE PTR SS:[EBP+4BB8],8
00407C4E  |.  0F84 F5040000 JE Pokemon.00408149
00407C54  |.  8D95 C04B0000 LEA EDX,DWORD PTR SS:[EBP+4BC0]
00407C5A  |.  8D4424 34     LEA EAX,DWORD PTR SS:[ESP+34]
00407C5E  |.  E8 9D750000   CALL Pokemon.0040F200
00407C63  |.  E9 E1040000   JMP Pokemon.00408149
00407C68  |>  83BD 8C3E0000>CMP DWORD PTR SS:[EBP+3E8C],74           ;  Cases 74 ('t'),7A ('z') of switch 00407B8B
00407C6F  |.  75 08         JNZ SHORT Pokemon.00407C79
00407C71  |.  8DB5 AC3E0000 LEA ESI,DWORD PTR SS:[EBP+3EAC]

}

前面的73,7b,74-7a应该为不同的3种类型

73类型的原始结构
struct rar_73
{
  WORD dataCheck;   数据校验值
  BYTE byType;      类型
  BYTE unByte[2];
  WORD bLenth;      数据长度
}

struct rar74_7a
{
  WORD dataCheck;
  BYTE byType;
  BYTE unByte[2];
  WORD  bLenth;

  DWORD dwOffsetFile; 下一个原始数据的偏移(也是原始压缩数据区域)
  DWORD dwOffsetFile1; 解压缩后的长度
  BYTE byunKnow[9];
  BYTE bUnKnowFlag;
  BYTE bUnKnowFlag1;
  WORD charLenth;      块名的长度
  BYTE byUnKnow1;
  char chInfo[charLenth]; 压缩块名
  
  BYTE byData[dwOffsetFile] 这其实就是压缩数据了
}

贴上字典生成的地方和解压缩的地方
00413567  |> \68 2B010000   PUSH 12B
0041356C  |.  8D8E 604C0000 LEA ECX,DWORD PTR DS:[ESI+4C60]
00413572  |.  8BD7          MOV EDX,EDI
00413574  |.  8BC6          MOV EAX,ESI
00413576  |.  E8 E5010000   CALL Pokemon.00413760                    ;  生成字典解压缩用

解压缩的地方
0041214B   .  FF83 B0550000 INC DWORD PTR DS:[EBX+55B0]
00412151   .  8B8B 58570000 MOV ECX,DWORD PTR DS:[EBX+5758]
00412157   .  8D1411        LEA EDX,DWORD PTR DS:[ECX+EDX]
0041215A   .  52            PUSH EDX
0041215B   .  59            POP ECX
0041215C   .  8801          MOV BYTE PTR DS:[ECX],AL                 ;  2

解压完后执行exe和打开jpg图片
00402670  |.  84C0          TEST AL,AL
00402672  |.  0F84 06010000 JE Pokemon.0040277E
00402678  |>  56            PUSH ESI
00402679  |.  E8 AE150100   CALL <JMP.&SHELL32.ShellExecuteExA>

其释放过程:
创建对话框
设置释放路径
发消息点释放按钮
最后调用.ShellExecuteExA执行释放exe 打开jpg图片

这个地方就是发消息点安装按纽释放文件的地方(NOP掉就可以看到对话框了)
0040148E      6A 00         PUSH 0                                   ; /lParam = 0
00401490      6A 01         PUSH 1                                   ; |wParam = 1
00401492      68 11010000   PUSH 111                                 ; |Message = WM_COMMAND
00401497      53            PUSH EBX                                 ; |hWnd
00401498      E8 85280100   CALL <JMP.&USER32.SendMessageA>          ; \SendMessageA

设置安装路径
00401DD6  |.  E8 9E0B0000   |CALL Pokemon.00402979                   ;  注册表的操作
00401DDB  |.  6A 65         |PUSH 65                                 ; /ControlID = 65 (101.)
00401DDD  |.  FF7424 04     |PUSH DWORD PTR SS:[ESP+4]               ; |hWnd
00401DE1  |.  E8 AC1E0100   |CALL <JMP.&USER32.GetDlgItem>           ; \GetDlgItem
00401DE6  |.  8BD8          |MOV EBX,EAX
00401DE8  |.  8D8424 04AD00>|LEA EAX,DWORD PTR SS:[ESP+AD04]
00401DEF  |.  50            |PUSH EAX                                ; /Text
00401DF0  |.  53            |PUSH EBX                                ; |hWnd
00401DF1  |.  E8 501F0100   |CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
00401DF6  |.  68 78594100   |PUSH Pokemon.00415978                   ; /lParam = 415978
00401DFB  |.  6A 00         |PUSH 0                                  ; |wParam = 0
00401DFD  |.  68 43010000   |PUSH 143                                ; |Message = CB_ADDSTRING
00401E02  |.  53            |PUSH EBX                                ; |hWnd
00401E03  |.  E8 1A1F0100   |CALL <JMP.&USER32.SendMessageA>         ; \SendMessageA

临时目录下的Pokemon.exe

先把反调试代码头改为RETN
00407023      C3            RETN                                     ;  反调
00407024      90            NOP
00407025  |.  55            PUSH EBP                                 
00407026  |.  8BEC          MOV EBP,ESP
00407028  |.  81EC 28030000 SUB ESP,328
0040702E  |.  A1 C0E14100   MOV EAX,DWORD PTR DS:[41E1C0]
00407033  |.  33C5          XOR EAX,EBP
00407035  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
00407038  |.  83A5 D8FCFFFF>AND DWORD PTR SS:[EBP-328],0
0040703F  |.  53            PUSH EBX
00407040  |.  6A 4C         PUSH 4C
00407042  |.  8D85 DCFCFFFF LEA EAX,DWORD PTR SS:[EBP-324]
00407048  |.  6A 00         PUSH 0

弹框..真不知道弹这个框干嘛
00401114  |> \50            PUSH EAX                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401115  |.  68 101F4200   PUSH pokemonT.00421F10                   ; |Title = "Information"
0040111A  |.  68 081E4200   PUSH pokemonT.00421E08                   ; |Text = "This application is recommended for systems 32bit!"
0040111F  |.  53            PUSH EBX                                 ; |hOwner
00401120  |.  FF15 68914100 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA

打开自己本身
7C801A28 >/$  8BFF          MOV EDI,EDI
7C801A2A  |.  55            PUSH EBP
7C801A2B  |.  8BEC          MOV EBP,ESP
7C801A2D  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
7C801A30  |.  E8 CFC60000   CALL kernel32.7C80E104
7C801A35  |.  85C0          TEST EAX,EAX
7C801A37  |.  74 1E         JE SHORT kernel32.7C801A57
7C801A39  |.  FF75 20       PUSH DWORD PTR SS:[EBP+20]                            ; /hTemplateFile
7C801A3C  |.  FF75 1C       PUSH DWORD PTR SS:[EBP+1C]                            ; |Attributes
7C801A3F  |.  FF75 18       PUSH DWORD PTR SS:[EBP+18]                            ; |Mode
7C801A42  |.  FF75 14       PUSH DWORD PTR SS:[EBP+14]                            ; |pSecurity
7C801A45  |.  FF75 10       PUSH DWORD PTR SS:[EBP+10]                            ; |ShareMode
7C801A48  |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]                             ; |Access
7C801A4B  |.  FF70 04       PUSH DWORD PTR DS:[EAX+4]                             ; |FileName = "C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\pokemonTemp.exe"
7C801A4E  |.  E8 9DED0000   CALL kernel32.CreateFileW                             ; \CreateFileW

把PE文件读取到内存
{
00401470  |.  56            PUSH ESI
00401471  |.  57            PUSH EDI
00401472  |.  6A 01         PUSH 1
00401474  |.  53            PUSH EBX
00401475  |.  E8 FD530000   CALL pokemonT.00406877

未读完的数据拷贝到缓冲
0040A9CA   .  8A06          MOV AL,BYTE PTR DS:[ESI]
0040A9CC   .  8807          MOV BYTE PTR DS:[EDI],AL
0040A9CE   .  8A46 01       MOV AL,BYTE PTR DS:[ESI+1]
0040A9D1   .  8847 01       MOV BYTE PTR DS:[EDI+1],AL
0040A9D4   .  8A46 02       MOV AL,BYTE PTR DS:[ESI+2]
0040A9D7   .  C1E9 02       SHR ECX,2
0040A9DA   .  8847 02       MOV BYTE PTR DS:[EDI+2],AL
0040A9DD   .  83C6 03       ADD ESI,3
0040A9E0   .  83C7 03       ADD EDI,3
0040A9E3   .  83F9 08       CMP ECX,8
0040A9E6   .^ 72 CC         JB SHORT pokemonT.0040A9B4
0040A9E8   .  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]          ;  拷贝
}

原始数据标记名
0040147A  |.  56            PUSH ESI
0040147B  |.  E8 8B540000   CALL pokemonT.0040690B
00401480  |.  83C4 14       ADD ESP,14
00401483  |.  BE C81C4200   MOV ESI,pokemonT.00421CC8                               ;  ASCII "00Frxqw00"
00401488  |.  E8 73FBFFFF   CALL pokemonT.00401000
0040148D  |.  BE D41C4200   MOV ESI,pokemonT.00421CD4                               ;  ASCII "00CFrxqw00"
00401492  |.  E8 69FBFFFF   CALL pokemonT.00401000
00401497  |.  8B0D 18304200 MOV ECX,DWORD PTR DS:[423018]
0040149D  |.  51            PUSH ECX
0040149E  |.  56            PUSH ESI
0040149F  |.  B8 C81C4200   MOV EAX,pokemonT.00421CC8                               ;  ASCII "00Frxqw00"
004014A4  |.  E8 97040000   CALL pokemonT.00401940

解密后的标记名
00401480  |.  83C4 14       ADD ESP,14
00401483  |.  BE C81C4200   MOV ESI,pokemonT.00421CC8                               ;  ASCII "--Count--"
00401488  |.  E8 73FBFFFF   CALL pokemonT.00401000
0040148D  |.  BE D41C4200   MOV ESI,pokemonT.00421CD4                               ;  ASCII "--@Count--"
00401492  |.  E8 69FBFFFF   CALL pokemonT.00401000
00401497  |.  8B0D 18304200 MOV ECX,DWORD PTR DS:[423018]
0040149D  |.  51            PUSH ECX
0040149E  |.  56            PUSH ESI
0040149F  |.  B8 C81C4200   MOV EAX,pokemonT.00421CC8                               ;  ASCII "--Count--"
004014A4  |.  E8 97040000   CALL pokemonT.00401940

在PE文件中匹配--Count--
004014A4  |.  E8 97040000   CALL pokemonT.00401940
004014A9  |.  8B15 18304200 MOV EDX,DWORD PTR DS:[423018]
004014AF  |.  52            PUSH EDX

在PE文件中匹配--1-- 与--@1-- (这段之间的数据就是加密的PE文件)
004015D5  |.  50            |PUSH EAX
004015D6  |.  A1 18304200   |MOV EAX,DWORD PTR DS:[423018]
004015DB  |.  51            |PUSH ECX
004015DC  |.  E8 5F030000   |CALL pokemonT.00401940
004015E1  |.  8B15 0C304200 |MOV EDX,DWORD PTR DS:[42300C]
004015E7  |.  68 08B64100   |PUSH pokemonT.0041B608                  ;  ASCII "wb"
004015EC  |.  52            |PUSH EDX
004015ED  |.  A3 00304200   |MOV DWORD PTR DS:[423000],EAX
004015F2  |.  E8 E94B0000   |CALL pokemonT.004061E0                  ;  创建C:\\Program Files\\Toyo\\masmyk\\fribi.estrol"
004015F7  |.  8B0D 10304200 |MOV ECX,DWORD PTR DS:[423010]
004015FD  |.  8BF0          |MOV ESI,EAX
004015FF  |.  A1 00304200   |MOV EAX,DWORD PTR DS:[423000]
00401604  |.  56            |PUSH ESI
00401605  |.  50            |PUSH EAX
00401606  |.  6A 01         |PUSH 1
00401608  |.  51            |PUSH ECX
00401609  |.  E8 79550000   |CALL pokemonT.00406B87                  ;  往文件写数据(--1-- 与--@1--之间的数据)

amfertoleu.exe的释放
{
00401A85  |> /8AC8          /MOV CL,AL
00401A87  |. |8D85 D8FEFFFF |LEA EAX,DWORD PTR SS:[EBP-128]
00401A8D  |. |80C1 0B       |ADD CL,0B                                +0b....
00401A90  |. |50            |PUSH EAX
00401A91  |. |E8 EA380000   |CALL pokemonT.00405380
00401A96  |. |8D8D 60FFFFFF |LEA ECX,DWORD PTR SS:[EBP-A0]
00401A9C  |. |51            |PUSH ECX
00401A9D  |. |E8 EE000000   |CALL pokemonT.00401B90
00401AA2  |. |8B95 60FFFFFF |MOV EDX,DWORD PTR SS:[EBP-A0]           ;  pokemonT.0041B658
00401AA8  |. |8B4A 04       |MOV ECX,DWORD PTR DS:[EDX+4]
00401AAB  |. |F6840D 68FFFF>|TEST BYTE PTR SS:[EBP+ECX-98],6
00401AB3  |.^\74 D0         \JE SHORT pokemonT.00401A85

CALL pokemonT.00405380
{
这段数据最终会写入amfertoleu.exe文件
004053F0   .  FF08          DEC DWORD PTR DS:[EAX]
004053F2   .  8B49 24       MOV ECX,DWORD PTR DS:[ECX+24]
004053F5   .  8B01          MOV EAX,DWORD PTR DS:[ECX]
004053F7   .  8D50 01       LEA EDX,DWORD PTR DS:[EAX+1]
004053FA   .  8911          MOV DWORD PTR DS:[ECX],EDX
004053FC   .  8818          MOV BYTE PTR DS:[EAX],BL                 ;  写入
004053FE   .  0FB6C3        MOVZX EAX,BL
}

CALL pokemonT.00401B90
{
00401BE0   > \C645 FC 01    MOV BYTE PTR SS:[EBP-4],1
00401BE4   .  8B0E          MOV ECX,DWORD PTR DS:[ESI]
00401BE6   .  8B51 04       MOV EDX,DWORD PTR DS:[ECX+4]
00401BE9   .  8B4C32 28     MOV ECX,DWORD PTR DS:[EDX+ESI+28]
00401BED   .  8B41 20       MOV EAX,DWORD PTR DS:[ECX+20]
00401BF0   .  3918          CMP DWORD PTR DS:[EAX],EBX
00401BF2   .  74 1A         JE SHORT pokemonT.00401C0E
00401BF4   .  8B51 30       MOV EDX,DWORD PTR DS:[ECX+30]
00401BF7   .  391A          CMP DWORD PTR DS:[EDX],EBX
00401BF9   .  7E 13         JLE SHORT pokemonT.00401C0E
00401BFB   .  8BC2          MOV EAX,EDX
00401BFD   .  FF08          DEC DWORD PTR DS:[EAX]
00401BFF   .  8B49 20       MOV ECX,DWORD PTR DS:[ECX+20]
00401C02   .  8B01          MOV EAX,DWORD PTR DS:[ECX]
00401C04   .  8D50 01       LEA EDX,DWORD PTR DS:[EAX+1]
00401C07   .  8911          MOV DWORD PTR DS:[ECX],EDX
00401C09   .  0FB638        MOVZX EDI,BYTE PTR DS:[EAX]              ;  原始数据
}
}

释放完后amfertoleu.exe会把自己copy到fribi.estrol;

最后执行amfertoleu.exe
004016F4  |.  57            |PUSH EDI
004016F5  |.  51            |PUSH ECX
004016F6  |>  53            |PUSH EBX                                ; |hWnd
004016F7  |.  FF15 50914100 |CALL DWORD PTR DS:[<&SHELL32.ShellExecu>; \ShellExecuteA

[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回