CrackMe-OllyDBG 入门系列(七)-汇编功能
来源:互联网 发布:java中ant怎么用 编辑:程序博客网 时间:2024/05/21 17:13
打开软件,发现系统字体十分难看。
ctrl+n查找可疑API
运行程序 打开属性窗口 断点没有断下来。看来断点不对。
继续查看可以API
CreateWindowExA
下断,运行程序查看属性,直接断在断点处。
运行程序 直到弹出属性窗口 发现4处断点中 使用到了两处
00408F27 |> /8B75 E4 /mov esi,[local.7]00408F2A |. |6A 00 |push 0x000408F2C |. |2B75 DC |sub esi,[local.9]00408F2F |. |83C6 05 |add esi,0x500408F32 |. |0FAF75 FC |imul esi,[local.1]00408F36 |. |E8 D398FFFF |call myuninst.0040280E00408F3B |. |50 |push eax ; |hInst = 0000000B00408F3C |. |8B45 C0 |mov eax,[local.16] ; |kernel32.7736F6D200408F3F |. |6A 00 |push 0x0 ; |hMenu = NULL00408F41 |. |03C6 |add eax,esi ; |00408F43 |. |FF75 08 |push [arg.1] ; |hParent = 0012F64800408F46 |. |FF75 D0 |push [local.12] ; |Height = 0x000408F49 |. |57 |push edi ; |Width = 5A (90.)00408F4A |. |50 |push eax ; |Y = B (11.)00408F4B |. |FF75 BC |push [local.17] ; |X = 776E3B2C (2003712812.)00408F4E |. |FF75 EC |push [local.5] ; |Style = WS_OVERLAPPED|WS_MAXIMIZEBOX|WS_VSCROLL|WS_HSCROLL|WS_SYSMENU|WS_THICKFRAME|1A9000408F51 |. |68 80DE4000 |push myuninst.0040DE80 ; |WindowName = ""00408F56 |. |68 DCD94000 |push myuninst.0040D9DC ; |Class = "STATIC"00408F5B |. |FF75 D4 |push [local.11] ; |ExtStyle = 000408F5E |. |FF15 98B24000 |call dword ptr ds:[<&USER32.CreateWindo>; \CreateWindowExA00408F64 |. |6A 00 |push 0x000408F66 |. |8945 F4 |mov [local.3],eax00408F69 |. |E8 A098FFFF |call myuninst.0040280E00408F6E |. |50 |push eax ; |hInst = 0000000B00408F6F |. |8B45 DC |mov eax,[local.9] ; |00408F72 |. |6A 00 |push 0x0 ; |hMenu = NULL00408F74 |. |03F0 |add esi,eax ; |00408F76 |. |FF75 08 |push [arg.1] ; |hParent = 0012F64800408F79 |. |FF75 CC |push [local.13] ; |Height = 40D1F8 (4248056.)00408F7C |. |53 |push ebx ; |Width = 1EB (491.)00408F7D |. |56 |push esi ; |Y = 169 (361.)00408F7E |. |FF75 D8 |push [local.10] ; |X = 0x000408F81 |. |FF75 E8 |push [local.6] ; |Style = WS_OVERLAPPED|WS_VSCROLL|WS_HSCROLL00408F84 |. |68 80DE4000 |push myuninst.0040DE80 ; |WindowName = ""00408F89 |. |68 D4D94000 |push myuninst.0040D9D4 ; |Class = "EDIT"00408F8E |. |FF75 B8 |push [local.18] ; |ExtStyle = WS_EX_NOPARENTNOTIFY|WS_EX_TOPMOST|WS_EX_ACCEPTFILES|WS_EX_TRANSPARENT|WS_EX_MDICHILD|WS_EX_TOOLWINDOW|WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE|WS_EX_CONTEXTHELP|WS_EX_RIGHT|WS_EX_RTLREADING|WS_EX_LEFTSCROLLBAR|WS_EX_CONTROLPARENT|WS_EX_STATICEDGE00408F91 |. |FF15 98B24000 |call dword ptr ds:[<&USER32.CreateWindo>; \CreateWindowExA00408F97 |. |8945 F0 |mov [local.4],eax00408F9A |. |8B45 F8 |mov eax,[local.2]00408F9D |. |FF30 |push dword ptr ds:[eax] ; /<%s>00408F9F |. |8D85 B0FEFFFF |lea eax,[local.84] ; |00408FA5 |. |68 D0D94000 |push myuninst.0040D9D0 ; |format = "%s:"00408FAA |. |50 |push eax ; |s = 0000000B00408FAB |. |FF15 90B14000 |call dword ptr ds:[<&MSVCRT.sprintf>] ; \sprintf00408FB1 |. |8B35 84B24000 |mov esi,dword ptr ds:[<&USER32.SetWindo>; user32.SetWindowTextA00408FB7 |. |83C4 0C |add esp,0xC00408FBA |. |8D85 B0FEFFFF |lea eax,[local.84]00408FC0 |. |50 |push eax ; /Text = 0000000B ???00408FC1 |. |FF75 F4 |push [local.3] ; |hWnd = 00000066 (class='Shell_TrayWnd')00408FC4 |. |FFD6 |call esi ; \SetWindowTextA00408FC6 |. |8D85 ACFAFFFF |lea eax,[local.341]00408FCC |. |50 |push eax00408FCD |. |FF75 FC |push [local.1]00408FD0 |. |FF35 00EF4000 |push dword ptr ds:[0x40EF00]00408FD6 |. |E8 1884FFFF |call myuninst.004013F300408FDB |. |83C4 0C |add esp,0xC00408FDE |. |50 |push eax00408FDF |. |FF75 F0 |push [local.4]00408FE2 |. |FFD6 |call esi00408FE4 |. |FF45 FC |inc [local.1]00408FE7 |. |8345 F8 14 |add [local.2],0x1400408FEB |. |837D FC 0F |cmp [local.1],0xF00408FEF |.^\0F8C 32FFFFFF \jl myuninst.00408F2700408FF5 |. 5F pop edi00408FF6 |. 5E pop esi00408FF7 |. 5B pop ebx00408FF8 |. C9 leave00408FF9 \. C3 retn
所以,这里程序的思路就很明确了,我们看到的窗口控件都是又 CreateWindowExA创建的。随后使用SetWindowText来设置显示的内容,根本没有考虑到字体的 问题。
所以我们可以在窗口创建之后,设置内容之前,调用 SendMessageA 函数发送 WM_SETFONT 消息来设置控件字体。
我们看API列表 CreateFontIndirectA 这个字体创建函数已经有了,再看看 SendMessageA也已经有了。这样我们就可以直接用了。
CreateFontIndirectA 在 GDI32.dll 里面,ThunkRVA 值是 0000B044,这样我们就知道在程序中调用它的时候就是 CALL DWORD PTR [0040B044]。同样,SendMessageA 的ThunkRVA 值是 0000B23C,调用时应该是这样:CALL DWORD PTR [0040B23C]
然后我们来了解这两个API函数的用法
CreateFontIndirectA:HFONT CreateFontIndirect(CONST LOGFONT *lplf // pointer to logical font structure);CreateFontIndirect的返回值就是字体的句柄。
我们传递一个logical font structure指针就可以得到一个字体的句柄。
SendMessageA:LRESULT SendMessage(HWND hWnd, // handle of destination windowUINT Msg, // message to sendWPARAM wParam, // first message parameterLPARAM lParam // second message parameter);
hWnd 就是我们的窗口句柄。 Msg就是我们要传递的消息,选WM_SETFONT,这个值是 30H。第三个参数是字体的句柄,第四个参数我们用不到。
接下来我们看一下LOGFONT的结构。
typedef struct tagLOGFONT { // LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT;
这样我们的标准9号宋体的 LOGFONT 值应该是32字节,16进制就像这样:F4FFFFFF000000000000000000000000900100000000008600000000CBCECCE5
用winhex将该内容写入到pe文件中的空白区
用PEID探测空白区
我们就写到.text节区的 0x009815处,注意是覆盖写入,不要改变大小
然后我们用OD重新载入程序,修改我们上面两处的代码,并在下面的空白区加入两处新增的代码。
分别在CreateWindow后添加跳转,跳转到我们要执行的代码处,代码执行后再跳转回来。
以下是我们添加的代码、
我们执行CreateWindow后创建了句柄存储在eax中,所以我们把该值拷贝到0x40c56e处然后创建字体句柄,并调用SendMessage 从而改变显示的字体。
两处代码原理相同。
右键保存到可执行文件即可。
因为我们在写补丁代码的过程中,将数据写入到了rdata区,所以要改变rdata节的属性为可写入,
通过PE Loarder来编辑标志位为可写入,保存、
打开Cracked文件,
改变成功.
- CrackMe-OllyDBG 入门系列(七)-汇编功能
- OllyDBG 入门系列(七)-汇编功能
- OllyDBG 入门系列(七)-汇编功能
- OllyDBG 入门系列(七)-汇编功能
- OllyDBG 入门系列(七)-汇编功能
- OllyDBG 入门系列(七)-汇编功能
- OllyDBG 入门系列<7> 汇编功能
- OllyDBG 入门系列<7> 汇编功能
- OllyDBG 入门系列<7> 汇编功能
- OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- 【转贴】OllyDBG 入门系列(一)-认识OllyDBG
- OllyDBG 入门系列(一)-认识OllyDBG
- 用MATLAB讀取NCL文件
- python与POP3
- APP最常用的9种状态设计(附案例)
- matlab连接摄像头读取视频部分解释
- ZOJ2109
- CrackMe-OllyDBG 入门系列(七)-汇编功能
- easyui datagrid 编辑的时候只能编辑一行
- Installing PHP and the Oracle Instant Client for Linux and Windows For PHP 5.5, OCI8 2.0 and Oracle
- modelsim输入信号
- SIFT算法C语言逐步实现详解(上)
- TListView 列宽自适应大小
- Dialog全屏显示
- C语言优化学习——结构体定义优化
- MongoDB小结10 - update【upsert】