首页 > 学院 > 逻辑算法 > 正文

逆向某位图CM

2019-09-10 09:02:03
字体:
来源:转载
供稿:网友
【文章标题】:破解某位图CM
【文章作者】:riusksk
【作者主页】:http://riusksk.blogbus.com
软件下载】:cm.rar[谁下载?]
【保护方式】: keyfile
【操作平台】:windows vista sp1
【使用工具】:OD,WinHex
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
------------------------------------------------------------------------------------------------------------------
破解过程】:
先打开CM,点击”Unlock Me”按钮后,提示“系统找不到指定的文件”,然后就自动关闭了。由此可知,这个CM是个keyfile CM,因此我们可以下断点bpx CreateFileA,运行后停在下面地址:
0040149F  |.  6A 00         PUSH 0                                                    ; /hTemplateFile = NULL
004014A1  |.  68 A0000008   PUSH 80000A0                                              ; |Attributes = ARCHIVE|NORMAL|SEQUENTIAL_SCAN
004014A6  |.  6A 03         PUSH 3                                                    ; |Mode = OPEN_EXISTING
004014A8  |.  6A 00         PUSH 0                                                    ; |pSecurity = NULL
004014AA  |.  6A 00         PUSH 0                                                    ; |ShareMode = 0
004014AC  |.  68 00000080   PUSH 80000000                                             ; |Access = GENERIC_READ
004014B1  |.  68 6C604000   PUSH Imaginat.0040606C                                    ; |FileName = "ohmygod.bmp"
004014B6  |.  FFD7          CALL EDI                                                  ; /CreateFileA
因此我们先新建一个文件名为“ohmygod.bmp”的文件,然后用系统自带的画图工具打开,直接点保存,这样就保存一张空白图片了,然后我们再根据分析出来的内容再去修改此文件。接下来我们先看一看BMP文件头和信息头的相关信息,我查了一下《Win32 Programmer’s Reference》,具体内容如下:
位图文件头:
typedef struct tagBITMAPFILEHEADER { // bmfh  
        WORD    bfType; 
        DWORD   bfSize; 
        WORD    bfReserved1; 
        WORD    bfReserved2; 
        DWORD   bfOffBits; 
} BITMAPFILEHEADER; 
 

Members

bfType
Specifies the file type. It must be BM. 

bfSize
Specifies the size, in bytes, of the bitmap file. 

bfReserved1
Reserved; must be zero. 

bfReserved2
Reserved; must be zero. 

bfOffBits
Specifies the offset, in bytes, from the BITMAPFILEHEADER structure to the bitmap bits.

位图信息头:
typedef struct tagBITMAPINFOHEADER{ // bmih  
   DWORD  biSize; 
   LONG   biWidth; 
   LONG   biHeight; 
   WORD   biPlanes; 
   WORD   biBitCount 
   DWORD  biCompression; 
   DWORD  biSizeImage; 
   LONG   biXPelsPerMeter; 
   LONG   biYPelsPerMeter; 
   DWORD  biClrUsed; 
   DWORD  biClrImportant; 
} BITMAPINFOHEADER; 
 

Members

biSize

Specifies the number of bytes required by the structure. 

biWidth

Specifies the width of the bitmap, in pixels. 

biHeight

Specifies the height of the bitmap, in pixels. If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper left corner. 

biPlanes

Specifies the number of planes for the target device. This value must be set to 1. 

biBitCount

Specifies the number of bits per pixel. This value must be 1, 4, 8, 16, 24, or 32. 

biCompression

Specifies the type of compression for a compressed bottom-up bitmap (top-down DIBs cannot be compressed). It can be one of the following values: 

Value  Description
BI_RGB  An uncompressed format.
BI_RLE8  A run-length encoded (RLE) format for bitmaps with 8 bits per pixel. The compression format is a two-byte format consisting of a count byte followed by a byte containing a color index. For more information, see the following Remarks section.
BI_RLE4  An RLE format for bitmaps with 4 bits per pixel. The compression format is a two-byte format consisting of a count byte followed by two word-length color indices. For more information, see the following Remarks section.
BI_BITFIELDS  Specifies that the bitmap is not compressed and that the color table consists of three doubleword color masks that specify the red, green, and blue components, respectively, of each pixel. This is valid when used with 16- and 32-bits-per-pixel bitmaps.
 

biSizeImage

Specifies the size, in bytes, of the image. This may be set to 0 for BI_RGB bitmaps. 

biXPelsPerMeter

Specifies the horizontal resolution, in pixels per meter, of the target device for the bitmap. An application can use this value to select a bitmap from a resource group that best matches the characteristics of the current device. 

biYPelsPerMeter

Specifies the vertical resolution, in pixels per meter, of the target device for the bitmap. 

biClrUsed

Specifies the number of color indices in the color table that are actually used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression. 
If biClrUsed is nonzero and the biBitCount member is less than 16, the biClrUsed member specifies the actual number of colors the graphics engine or device driver accesses. If biBitCount is 16 or greater, then biClrUsed member specifies the size of the color table used to optimize performance of Windows color palettes. If biBitCount equals 16 or 32, the optimal color palette starts immediately following the three doubleword masks. 

If the bitmap is a packed bitmap (a bitmap in which the bitmap array immediately follows the BITMAPINFO header and which is referenced by a single pointer), the biClrUsed member must be either 0 or the actual size of the color table. 

biClrImportant

Specifies the number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important.

我们继续F8下去,来到:
004014DF  |.  E8 5CFBFFFF   CALL Imaginat.00401040                                   ;F7跟进去
{  
00401040  /$  83EC 40       SUB ESP,40
00401043  |.  53            PUSH EBX
00401044  |.  56            PUSH ESI
00401045  |.  57            PUSH EDI
00401046  |.  68 00040000   PUSH 400                                                  ; /Size = 400 (1024.)
0040104B  |.  6A 40         PUSH 40                                                   ; |Flags = LPTR
0040104D  |.  C74424 14 000>MOV DWORD PTR SS:[ESP+14],0                               ; |
00401055  |.  FF15 5C504000 CALL DWORD PTR DS:[<&KERNEL32.LocalAlloc>]                ; /LocalAlloc
0040105B  |.  8B7C24 54     MOV EDI,DWORD PTR SS:[ESP+54]
0040105F  |.  8B1D 60504000 MOV EBX,DWORD PTR DS:[<&KERNEL32.ReadFile>]               ;  kernel32.ReadFile
00401065  |.  894424 10     MOV DWORD PTR SS:[ESP+10],EAX
00401069  |.  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
0040106D  |.  6A 00         PUSH 0                                                    ; /pOverlapped = NULL
0040106F  |.  50            PUSH EAX                                                  ; |pBytesRead
00401070  |.  8D4C24 1C     LEA ECX,DWORD PTR SS:[ESP+1C]                             ; |
00401074  |.  6A 0E         PUSH 0E                                                   ; |BytesToRead = E (14.)
00401076  |.  51            PUSH ECX                                                  ; |Buffer   《= 注意这里的地址为[ESP+1C],后面会对里面的内容进行比较
00401077  |.  57            PUSH EDI                                                  ; |hFile
00401078  |.  FFD3          CALL EBX                                                  ; /ReadFile
0040107A  |.  8B4424 0C     MOV EAX,DWORD PTR SS:[ESP+C]
0040107E  |.  85C0          TEST EAX,EAX
00401080  |.  75 09         JNZ SHORT Imaginat.0040108B
00401082  |.  5F            POP EDI
00401083  |.  5E            POP ESI
00401084  |.  33C0          XOR EAX,EAX
00401086  |.  5B            POP EBX
00401087  |.  83C4 40       ADD ESP,40
0040108A  |.  C3            RETN
0040108B  |>  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
0040108F  |.  6A 00         PUSH 0
00401091  |.  52            PUSH EDX
00401092  |.  8D4424 2C     LEA EAX,DWORD PTR SS:[ESP+2C]
00401096  |.  6A 28         PUSH 28
00401098  |.  50            PUSH EAX
00401099  |.  57            PUSH EDI
0040109A  |.  FFD3          CALL EBX
0040109C  |.  8B4424 0C     MOV EAX,DWORD PTR SS:[ESP+C]
004010A0  |.  85C0          TEST EAX,EAX
004010A2  |.  75 09         JNZ SHORT Imaginat.004010AD
004010A4  |.  5F            POP EDI
004010A5  |.  5E            POP ESI
004010A6  |.  33C0          XOR EAX,EAX
004010A8  |.  5B            POP EBX
004010A9  |.  83C4 40       ADD ESP,40
004010AC  |.  C3            RETN

我们接着分析下去:
004010AD  |> /66:817C24 14 >CMP WORD PTR SS:[ESP+14],4D42                             ;  位图文件类型bfType是否为BM
004010B4  |.  74 10         JE SHORT Imaginat.004010C6
004010B6  |.  57            PUSH EDI                                                  ; /hObject
004010B7  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
004010BD  |.  5F            POP EDI
004010BE  |.  5E            POP ESI
004010BF  |.  33C0          XOR EAX,EAX
004010C1  |.  5B            POP EBX
004010C2  |.  83C4 40       ADD ESP,40
004010C5  |.  C3            RETN
004010C6  |>  66:837C24 32 >CMP WORD PTR SS:[ESP+32],18                               ;  每个像素所需的位数biBitCount是否为0x18
004010CC  |.  74 10         JE SHORT Imaginat.004010DE
004010CE  |.  57            PUSH EDI                                                  ; /hObject
004010CF  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
004010D5  |.  5F            POP EDI
004010D6  |.  5E            POP ESI
004010D7  |.  33C0          XOR EAX,EAX
004010D9  |.  5B            POP EBX
004010DA  |.  83C4 40       ADD ESP,40
004010DD  |.  C3            RETN
004010DE  |>  817C24 16 AA6>CMP DWORD PTR SS:[ESP+16],160AA                           ;  位图文件大小bfSize是否等于0x160AA
004010E6  |.  74 10         JE SHORT Imaginat.004010F8
004010E8  |.  57            PUSH EDI                                                  ; /hObject
004010E9  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
004010EF  |.  5F            POP EDI
004010F0  |.  5E            POP ESI
004010F1  |.  33C0          XOR EAX,EAX
004010F3  |.  5B            POP EBX
004010F4  |.  83C4 40       ADD ESP,40
004010F7  |.  C3            RETN
004010F8  |>  8B4424 34     MOV EAX,DWORD PTR SS:[ESP+34]                             ;  位图压缩类型biCompression是否为0(不压缩)
004010FC  |.  85C0          TEST EAX,EAX
004010FE  |.  74 10         JE SHORT Imaginat.00401110
00401100  |.  57            PUSH EDI                                                  ; /hObject
00401101  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
00401107  |.  5F            POP EDI
00401108  |.  5E            POP ESI
00401109  |.  33C0          XOR EAX,EAX
0040110B  |.  5B            POP EBX
0040110C  |.  83C4 40       ADD ESP,40
0040110F  |.  C3            RETN
00401110  |>  8B4C24 2C     MOV ECX,DWORD PTR SS:[ESP+2C]                             ;  位图高度biHeight
00401114  |.  8B7424 28     MOV ESI,DWORD PTR SS:[ESP+28]                             ;  位图宽度biWidth
00401118  |.  8D1431        LEA EDX,DWORD PTR DS:[ECX+ESI]                            ;  EDX=biHeight + biWidth
0040111B  |.  81FA E5010000 CMP EDX,1E5                                               ;  宽+高=0x1E5时则跳转
00401121  |.  74 29         JE SHORT Imaginat.0040114C
00401123  |.  8BC6          MOV EAX,ESI
00401125  |.  2BC1          SUB EAX,ECX                                               ;  EAX=宽-高
00401127  |.  3D 53010000   CMP EAX,153                                               ;  宽+高=0x153时则跳转
0040112C  |.  74 1E         JE SHORT Imaginat.0040114C
0040112E  |.  8D1449        LEA EDX,DWORD PTR DS:[ECX+ECX*2]                          ;  EDX=高*3
00401131  |.  C1E2 03       SHL EDX,3                                                 ;  EDX=高*3*8
00401134  |.  81FA D8060000 CMP EDX,6D8                                               ;  高*3*8=0x6d8 时则跳转,这里的三处跳转必须有一处实现,否则将会挂掉,这里我就让第三处实现跳转,也就是高=0x49
 0040113A  |.  74 10         JE SHORT Imaginat.0040114C
0040113C  |.  57            PUSH EDI                                                  ; /hObject
0040113D  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
00401143  |.  5F            POP EDI
00401144  |.  5E            POP ESI
00401145  |.  33C0          XOR EAX,EAX
00401147  |.  5B            POP EBX
00401148  |.  83C4 40       ADD ESP,40
0040114B  |.  C3            RETN
0040114C  |> /8B4424 30     MOV EAX,DWORD PTR SS: [ESP+30]                             ;  目标设备级别biPlanes=1和每个像素所需的位数 biBitCount=0x18
00401150  |.  8B5424 24     MOV EDX,DWORD PTR SS:[ESP+24]                             ;  位图信息头结构大小biSize = 28
00401154  |.  25 FFFF0000   AND EAX,0FFFF                                             ;  EAX = biPlanes=1
00401159  |.  55            PUSH EBP
0040115A  |.  8D8410 AA6001>LEA EAX,DWORD PTR DS:[EAX+EDX+160AA]                      ;  EAX=biPlanes+biSize+160AA
00401161  |.  99            CDQ
00401162  |.  8BE8          MOV EBP,EAX
00401164  |.  8D41 BA       LEA EAX,DWORD PTR DS:[ECX-46]                             ;  EAX=高-0x46
00401167  |.  0FAFC6        IMUL EAX,ESI                                              ;  EAX=(高-0x46)*宽
0040116A  |.  33EA          XOR EBP,EDX                                               ;  EBP=EBP^EDX
0040116C  |.  2BEA          SUB EBP,EDX                                               ;  EBP=EBP-EDX
0040116E  |.  99            CDQ
0040116F  |.  33C2          XOR EAX,EDX
00401171  |.  2BC2          SUB EAX,EDX
00401173  |.  03E8          ADD EBP,EAX
00401175  |.  81FD A7650100 CMP EBP,165A7                                             ;  EBP= (biHeight - 46) * biWidth + biSize + biPlanes + 160AA=3*宽+28+1+160AA,因此这里要求宽必须为0x19C
0040117B  |.  5D            POP EBP
0040117C  |.  74 10         JE SHORT Imaginat.0040118E
0040117E  |.  57            PUSH EDI                                                  ; /hObject
0040117F  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
00401185  |.  5F            POP EDI
00401186  |.  5E            POP ESI
00401187  |.  33C0          XOR EAX,EAX
00401189  |.  5B            POP EBX
0040118A  |.  83C4 40       ADD ESP,40
0040118D  |.  C3            RETN
0040118E  |>  8B4424 58     MOV EAX,DWORD PTR SS:[ESP+58]
00401192  |.  8B5424 5C     MOV EDX,DWORD PTR SS:[ESP+5C]
00401196  |.  8930          MOV DWORD PTR DS:[EAX],ESI
00401198  |.  8B7424 60     MOV ESI,DWORD PTR SS:[ESP+60]
0040119C  |.  890A          MOV DWORD PTR DS:[EDX],ECX
0040119E  |.  8B5424 1E     MOV EDX,DWORD PTR SS:[ESP+1E]
004011A2  |.  B8 AA600100   MOV EAX,160AA
004011A7  |.  2BC2          SUB EAX,EDX
004011A9  |.  50            PUSH EAX                                                  ; /Size
004011AA  |.  6A 40         PUSH 40                                                   ; |Flags = LPTR
004011AC  |.  8906          MOV DWORD PTR DS:[ESI],EAX                                ; |
004011AE  |.  FF15 5C504000 CALL DWORD PTR DS:[<&KERNEL32.LocalAlloc>]                ; /LocalAlloc
004011B4  |.  8B16          MOV EDX,DWORD PTR DS:[ESI]
004011B6  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
004011BA  |.  6A 00         PUSH 0
004011BC  |.  51            PUSH ECX
004011BD  |.  52            PUSH EDX
004011BE  |.  50            PUSH EAX
004011BF  |.  57            PUSH EDI
004011C0  |.  FFD3          CALL EBX
004011C2  |.  85C0          TEST EAX,EAX
004011C4  |.  75 10         JNZ SHORT Imaginat.004011D6
004011C6  |.  57            PUSH EDI                                                  ; /hObject
004011C7  |.  FF15 64504000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>]               ; /CloseHandle
004011CD  |.  5F            POP EDI
004011CE  |.  5E            POP ESI
004011CF  |.  33C0          XOR EAX,EAX
004011D1  |.  5B            POP EBX
004011D2  |.  83C4 40       ADD ESP,40
004011D5  |.  C3            RETN
004011D6  |>  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
004011DA  |.  50            PUSH EAX                                                  ; /hMemory
004011DB  |.  FF15 68504000 CALL DWORD PTR DS:[<&KERNEL32.LocalFree>]                 ; /LocalFree
004011E1  |.  5F            POP EDI
004011E2  |.  5E            POP ESI
004011E3  |.  B8 01000000   MOV EAX,1
004011E8  |.  5B            POP EBX
004011E9  |.  83C4 40       ADD ESP,40
004011EC  /.  C3            RETN
}
004014E4  |.  83C4 18       ADD ESP,18
004014E7  |.  85C0          TEST EAX,EAX
004014E9  |.  75 09         JNZ SHORT Imaginat.004014F4
004014EB  |.  53            PUSH EBX
004014EC  |.  E8 1F010000   CALL Imaginat.00401610
004014F1  |.  83C4 04       ADD ESP,4
004014F4  |>  8B1D 64504000 MOV EBX,DWORD PTR DS:[<&KERNEL32.CloseHandle>]            ;  kernel32.CloseHandle
004014FA  |.  55            PUSH EBP
004014FB  |.  56            PUSH ESI                                                  ; /hObject
004014FC  |.  FFD3          CALL EBX                                                  ; /CloseHandle
004014FE  |.  6A 00         PUSH 0
00401500  |.  68 A0000008   PUSH 80000A0
00401505  |.  6A 03         PUSH 3
00401507  |.  6A 00         PUSH 0
00401509  |.  6A 00         PUSH 0
0040150B  |.  68 00000080   PUSH 80000000
00401510  |.  68 6C604000   PUSH Imaginat.0040606C                                    ;  ASCII "ohmygod.bmp"
00401515  |.  FFD7          CALL EDI                                                  ;  kernel32.CreateFileA
00401517  |.  8BF0          MOV ESI,EAX
00401519  |.  56            PUSH ESI
0040151A  |.  E8 71FDFFFF   CALL Imaginat.00401290
{
00401290  /$  83EC 08       SUB ESP,8
00401293  |.  53            PUSH EBX
00401294  |.  55            PUSH EBP
00401295  |.  56            PUSH ESI
00401296  |.  57            PUSH EDI
00401297  |.  6A 0A         PUSH 0A                                                 ; /Size = A (10.)
00401299  |.  6A 40         PUSH 40                                                 ; |Flags = LPTR
0040129B  |.  C74424 18 000>MOV DWORD PTR SS:[ESP+18],2000000                       ; |
004012A3  |.  FF15 5C504000 CALL DWORD PTR DS:[<&KERNEL32.LocalAlloc>]              ; /LocalAlloc
004012A9  |.  8B6C24 1C     MOV EBP,DWORD PTR SS:[ESP+1C]
004012AD  |.  6A 00         PUSH 0                                                  ; /Origin = FILE_BEGIN
004012AF  |.  6A 00         PUSH 0                                                  ; |pOffsetHi = NULL
004012B1  |.  6A 36         PUSH 36                                                 ; |OffsetLo = 36 (54.)
004012B3  |.  55            PUSH EBP                                                ; |hFile
004012B4  |.  8BF0          MOV ESI,EAX                                             ; |
004012B6  |.  FF15 38504000 CALL DWORD PTR DS:[<&KERNEL32.SetFilePointer>]          ; /SetFilePointer
004012BC  |.  8B1D F8504000 MOV EBX,DWORD PTR DS:[<&USER32.wsprintfA>]              ;  USER32.wsprintfA
004012C2  |.  33FF          XOR EDI,EDI
004012C4  |>  8D4424 14     /LEA EAX,DWORD PTR SS:[ESP+14]
004012C8  |.  6A 00         |PUSH 0                                                 ; /pOverlapped = NULL
004012CA  |.  50            |PUSH EAX                                               ; |pBytesRead
004012CB  |.  8D4C24 18     |LEA ECX,DWORD PTR SS:[ESP+18]                          ; |
004012CF  |.  6A 04         |PUSH 4                                                 ; |BytesToRead = 4
004012D1  |.  51            |PUSH ECX                                               ; |Buffer
004012D2  |.  55            |PUSH EBP                                               ; |hFile
004012D3  |.  FF15 60504000 |CALL DWORD PTR DS:[<&KERNEL32.ReadFile>]               ; /ReadFile
004012D9  |.  FF15 58504000 |CALL DWORD PTR DS:[<&KERNEL32.GetLastError>]           ; [GetLastError
004012DF  |.  85C0          |TEST EAX,EAX
004012E1  |.  75 47         |JNZ SHORT Imaginat.0040132A
004012E3  |.  8B4424 14     |MOV EAX,DWORD PTR SS:[ESP+14]
004012E7  |.  85C0          |TEST EAX,EAX
004012E9  |.  74 3F         |JE SHORT Imaginat.0040132A
004012EB  |.  8B4424 10     |MOV EAX,DWORD PTR SS: [ESP+10]                          ;  从bmp文件偏移0x36(注意这里是十六进制的,相当于十进制的54,之前我就直接把它当作十进制处理,结果编辑位图文件时改错位置了)开始读取的4字节数据,这里我们表示为 AABBCCDD
004012EF  |.  33D2          |XOR EDX,EDX
004012F1  |.  8BC8          |MOV ECX,EAX
004012F3  |.  8AD4          |MOV DL,AH                                              ;  DL=CC
004012F5  |.  C1E9 10       |SHR ECX,10                                             ;  上面4字节数据除以 2^10
004012F8  |.  81E2 FF000000 |AND EDX,0FF                                            ;  EDX=CC
004012FE  |.  81E1 FF000000 |AND ECX,0FF                                            ;  ECX=BB
00401304  |.  03D1          |ADD EDX,ECX                                            ;  EDX=BB+CC
00401306  |.  25 FF000000   |AND EAX,0FF                                            ;  EAX=DD
0040130B  |.  03D0          |ADD EDX,EAX                                            ;  EDX=BB+CC+DD
0040130D  |.  52            |PUSH EDX
0040130E  |.  56            |PUSH ESI
0040130F  |.  68 30604000   |PUSH Imaginat.00406030                                 ;  ASCII "%s%c"
00401314  |.  56            |PUSH ESI
00401315  |.  FFD3          |CALL EBX           
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选