查壳,没有壳。
用ida打开,框架图
挨个查了查
lpWindowName:lpWindowName指向窗口名。
GetStockObject:索预定义的备用笔、刷子、字体或者调色板的句柄。
LoadCursor:仅当IpCursorName参数指向一个光标资源时,该函数才返回一个有效的光标句柄。
LoadIcon:加载一个图标资源
RegisterClassA:注册窗口
GetSystemMetrics:是一个计算机函数,该函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。
ShowWindow:该函数设置指定窗口的显示状态。
GetMessageA:获取窗口的消息。
TranslateMessage:将虚拟键消息转换为字符消息。
DispatchMessage:该函数分发一个消息给窗口程序。
看main函数
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
int v4; // [email protected]
int v5; // [email protected]
HWND v6; // [email protected]
int result; // [email protected]
struct tagMSG Msg; // [sp+4h] [bp-44h]@1
WNDCLASSA WndClass; // [sp+20h] [bp-28h]@1
//由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等
dword_4084D8 = (int)hInstance;
WndClass.cbClsExtra = ; //窗口类无扩展
WndClass.cbWndExtra = ; //窗口实例无扩展
WndClass.hbrBackground = (HBRUSH)GetStockObject(); //窗口背景
WndClass.hCursor = LoadCursorA(, (LPCSTR));// 窗口光标样式
WndClass.hInstance = hInstance;//当前实例句柄
WndClass.hIcon = LoadIconA(, (LPCSTR));//窗口的最小化图标
WndClass.lpfnWndProc = (WNDPROC)sub_401130; //窗口消息处理
WndClass.lpszClassName = lpWindowName; //窗口类名为“窗口”
WndClass.lpszMenuName = ;//窗口无菜单
WndClass.style = ;
RegisterClassA(&WndClass);
v4 = GetSystemMetrics() / - ;
v5 = GetSystemMetrics();
v6 = CreateWindowExA(, lpWindowName, lpWindowName, u, v5 / - , v4, , , , , hInstance, );
ShowWindow(v6, );
if ( GetMessageA(&Msg, , , ) )
{
do
{
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
while ( GetMessageA(&Msg, , , ) );
result = Msg.wParam;
}
else
{
result = Msg.wParam;
}
return result;
}
再看窗口处理函数sub_401130,函数很长,就看有用的
if ( wParam == )
{
GetObjectA(hbm, , &pv);
memset(&bmi, , u);
bmi.bmiHeader.biHeight = cLines;
bmi.bmiHeader.biWidth = v16;
bmi.bmiHeader.biSize = ;
bmi.bmiHeader.biPlanes = ;
bmi.bmiHeader.biBitCount = ;
bmi.bmiHeader.biCompression = ;
GetDIBits(hdc, (HBITMAP)hbm, , cLines, , &bmi, ); //GetDIBits函数获取指定兼容位图的位,然后将其作一个DIB—设备无关位图使用的指定格式复制到一个缓冲区中。
v8 = (void *)sub_40150B(bmi.bmiHeader.biSizeImage); //bmp图像大小
GetDIBits(hdc, (HBITMAP)hbm, , cLines, v8, &bmi, );
v9 = FindResourceA(, (LPCSTR), (LPCSTR));//FindResource是一个计算机函数。该函数确定指定模块中指定类型和名称的资源所在位置
v10 = LoadResource(, v9);//装载指定资源到全局存储器
v11 = LockResource(v10);
v12 = ;
v13 = v8;
v14 = v11 - (_BYTE *)v8;
while ( *v13 == v13[v14] ) {
++v12;
++v13;
if ( v12 >= )
{
sub_401500(v8);
return ;
}
}
MessageBoxA(hWnd, Text, Caption, u);
sub_401500(v8);
return ;
}
//获取的图像和画的图像依次对比,如果总共相同点达到个就直接返回而不报错
return ;
}
然后如果能导出获取的图像就可以了。
借鉴了大佬的wp,用exescope导出图片数据,然后用python恢复。
不会python啊啊啊,要将学习python提上日程了。。
然后还是这个大佬的脚本。。
from PIL import Image
width =
height =
fp = open('123', 'rb')
data = fp.read()
im = Image.frombytes('RGB', (width, height), data)
im = im.transpose(Image.FLIP_TOP_BOTTOM)
im.show()
im.save('result.bmp')
运行时候出现 No module named PIL,用了下面链接里的方法解决
Python27 No module named PIL解决方法
答案是个倒着的GOT
试一下GOT,和TOG
GOT正确