lpBitBase即通过.text:77D1D01C _FindResourcePE@20 (MapViewOfFile) 找到的资源地址
所以 lpBit的地址的对齐方式跟文件中资源的对齐方式有关.
(3)
在函数SmartStretchDIBits中我们发现
text:77D1CA5E mov eax, [ebp+pBITMAPINFO]
.text:77D1CA61 cmp [eax+BITMAPINFOHEADER.biCompression], ebx
.text:77D1CA64 jnz short loc_77D1CA88
.text:77D1CA66 mov ax, [eax+BITMAPINFOHEADER.biBitCount]
.text:77D1CA6A cmp ax, 4
.text:77D1CA6E jz _conver
.text:77D1CA74 cmp ax, 8
.text:77D1CA78 jz _conver
.text:77D1CA7E cmp ax, 18h
.text:77D1CA82 jz _conver
.text:77D1CA88
.text:77D1CA88 loc_77D1CA88: ; CODE XREF: SmartStretchDIBits(x,x,x,x,x,x,x,x,x,x,x,x,x)+36j
.text:77D1CA88 ; SmartStretchDIBits(x,x,x,x,x,x,x,x,x,x,x,x,x)+43j ...
.text:77D1CA88 pop edi
.text:77D1CA89
.text:77D1CA89 loc_77D1CA89: ; CODE XREF: SmartStretchDIBits(x,x,x,x,x,x,x,x,x,x,x,x,x)+1Ej
.text:77D1CA89 push [ebp+arg_30] ; DWORD
.text:77D1CA8C push [ebp+arg_2C] ; UINT
.text:77D1CA8F push [ebp+pBITMAPINFO] ; BITMAPINFO *
.text:77D1CA92 push [ebp+lpBits] ; void *
.text:77D1CA95 push [ebp+arg_20] ; int
.text:77D1CA98 push [ebp+arg_1C] ; int
.text:77D1CA9B push [ebp+arg_18] ; int
.text:77D1CA9E push [ebp+arg_14] ; int
.text:77D1CAA1 push [ebp+arg_10] ; int
.text:77D1CAA4 push [ebp+arg_C] ; int
.text:77D1CAA7 push [ebp+arg_8] ; int
.text:77D1CAAA push [ebp+arg_4] ; int
.text:77D1CAAD push [ebp+arg_0] ; HDC
.text:77D1CAB0 call ds:__imp__StretchDIBits@52 ; StretchDIBits(x,x,x,x,x,x,x,x,x,x,x,x,x)
当 pBitMapInfo->biBitCount位4,8,18的时候, 有一个转换的过程
转换的时候会有内存重新分配, 导致我们精心构造的不对齐内存不被使用
所以我们修改exe的这个字段位1.
==========================
修改方式
找了ollydbg目录下的DLL_Loader.exe做试验
(1)
icon的资源在0dc8, 上一个dialog的大小不是4的倍数,
所以之间有2个字节的空闲, 我们吧icon的资源位置定位在0dc7,
同时吧整个2e8的大小的内容都上移动一字节
(2)
资源开头即是BITMAPINFO的结构体,
修改biBitCount为1, 同时修改biHeight为0x100040 (原先为40)
修改好的exe放到一个目录中, explorer打开成功崩溃.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!