用OD调试扫雷程序为什么查找主窗口函数地址查不到

用OD调试扫雷程序为什么查找主窗口函数地址查不到,第1张

OD查找 扫雷主窗口函数 地址

时间:2014-09-10 00:28:39 阅读:413 评论:0 收藏:0 [点我收藏+]

标签:ollydbg 调试 扫雷

闲着没事,使用OD调试下扫雷程序,看了郁金香大牛的视频,OD载入扫雷程序,F9运行,查看——窗口(刷新),就可以看到主窗口地址,不知道什么原因,本机OD显示的地址是FFXXXXXXX地址,很明显不对,换了好几个系统也不正常。无奈,只好自己跟下。

一、OD打开扫雷程序,程序停在模块入口点出

bubuko.com,布布扣

二、ctrl + g 在 RegisterClassW函数出下断点

bubuko.com,布布扣

然后 F9运行,停在此处,然后 ctrl + F9 跳出此函数

bubuko.com,布布扣

在pWndClass出下断点(此处是窗口注册类,下上断点看窗口注册类的地址),然后取消RegisterClassW的断点,重新运行,程序停在,pWndClass处

bubuko.com,布布扣

可知窗口注册类的地址为 7FED0 ,内存中查看窗口注册类内容。

由窗口注册类结构

typedef struct tagWNDCLASSW {

UINTstyle

WNDPROC lpfnWndProc

int cbClsExtra

int cbWndExtra

HINSTANCE hInstance

HICON hIcon

HCURSOR hCursor

HBRUSH hbrBackground

LPCWSTR lpszMenuName

LPCWSTR lpszClassName

} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW

可知,结构第二项,为回调函数的地址,从内存中可知,回调函数地址为01001bc9

0100367A /$ A1 AC560001 MOV EAX,DWORD PTR DS:[10056AC]

0100367F |. 8B0D A8560001 MOV ECX,DWORD PTR DS:[10056A8]

01003685 |. 53PUSH EBX

01003686 |. 56PUSH ESI

01003687 |. 57PUSH EDI

01003688 |. 33FF XOR EDI,EDI

0100368A |. 3B05 34530001 CMP EAX,DWORD PTR DS:[1005334]

01003690 |. 893D 64510001 MOV DWORD PTR DS:[1005164],EDI

01003696 |. 75 0C JNZ SHORT winmine.010036A4

01003698 |. 3B0D 38530001 CMP ECX,DWORD PTR DS:[1005338]

0100369E |. 75 04 JNZ SHORT winmine.010036A4

010036A0 |. 6A 04 PUSH 4

010036A2 |. EB 02 JMP SHORT winmine.010036A6

010036A4 |> 6A 06 PUSH 6

010036A6 |> 5BPOP EBX

010036A7 |. A3 34530001 MOV DWORD PTR DS:[1005334],EAX

010036AC |. 890D 38530001 MOV DWORD PTR DS:[1005338],ECX

010036B2 |. E8 1EF8FFFF CALL winmine.01002ED5

010036B7 |. A1 A4560001 MOV EAX,DWORD PTR DS:[10056A4]

010036BC |. 893D 60510001 MOV DWORD PTR DS:[1005160],EDI

010036C2 |. A3 30530001 MOV DWORD PTR DS:[1005330],EAX

010036C7 |> FF35 34530001 PUSH DWORD PTR DS:[1005334]

010036CD |. E8 6E020000 CALL winmine.01003940; callwinmine!Rnd (01003940)随机产生x

010036D2 |. FF35 38530001 PUSH DWORD PTR DS:[1005338]

010036D8 |. 8BF0 MOV ESI,EAX

010036DA |. 46INC ESI

010036DB |. E8 60020000 CALL winmine.01003940;callwinmine!Rnd (01003940)随机产生y

010036E0 |. 40INC EAX

010036E1 |. 8BC8 MOV ECX,EAX

010036E3 |. C1E1 05 SHL ECX,5

010036E6 |. F68431 405300>TEST BYTE PTR DS:[ECX+ESI+1005340],80 测试是否布上雷(是否被设置)

010036EE |.^ 75 D7 JNZ SHORT winmine.010036C7

010036F0 |. C1E0 05 SHL EAX,5

010036F3 |. 8D8430 405300>LEA EAX,DWORD PTR DS:[EAX+ESI+1005340]

010036FA |. 8008 80 OR BYTE PTR DS:[EAX],80 设置地雷

010036FD |. FF0D 30530001 DEC DWORD PTR DS:[1005330]

01003703 |.^ 75 C2 JNZ SHORT winmine.010036C7

01003705 |. 8B0D 38530001 MOV ECX,DWORD PTR DS:[1005338]

0100370B |. 0FAF0D 345300>IMUL ECX,DWORD PTR DS:[1005334]

01003712 |. A1 A4560001 MOV EAX,DWORD PTR DS:[10056A4]

01003717 |. 2BC8 SUB ECX,EAX

01003719 |. 57PUSH EDI

0100371A |. 893D 9C570001 MOV DWORD PTR DS:[100579C],EDI

01003720 |. A3 30530001 MOV DWORD PTR DS:[1005330],EAX

01003725 |. A3 94510001 MOV DWORD PTR DS:[1005194],EAX

0100372A |. 893D A4570001 MOV DWORD PTR DS:[10057A4],EDI

01003730 |. 890D A0570001 MOV DWORD PTR DS:[10057A0],ECX

01003736 |. C705 00500001>MOV DWORD PTR DS:[1005000],1

01003740 |. E8 25FDFFFF CALL winmine.0100346A

01003745 |. 53PUSH EBX/Arg1

01003746 |. E8 05E2FFFF CALL winmine.01001950 \winmine.01001950

0100374B |. 5FPOP EDI

0100374C |. 5EPOP ESI

0100374D |. 5BPOP EBX

0100374E \. C3RETN

希望对你有帮助

VC6.0默认使用Multi-Byte Character Set,新的visual studio创建的工程默认使用unicode character set,所以所有的函数会使用unicode版本。

你可以手动做成使用ansi版本,比如

GetEnvironmentVariable,函数就直接写成GetEnvironmentVariableA,

或者就把工程的设置改成使用MBCS


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11827657.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存