首页
社区
课程
招聘
[原创]Pocket CHM Pro 5.9另类破解~~~~
发表于: 2008-4-29 17:57 13592

[原创]Pocket CHM Pro 5.9另类破解~~~~

2008-4-29 17:57
13592

研究对象:Pocket CHM Pro 5.9
下载地址:自己搜索
软件介绍:这是用于在 CHM 格式创建帮助,电子读物或者手册的工具。袖珍的 CHM 能够直接打开和编辑 CHM 文件,和它能够反编译成批的 CHM。
涉及工具:OD,PEiD,stud_pe,WinHex

一、前言
最近在学习CAD的VBA,在明经通道上看到有在线的《ActiveX 和 VBA 参考》,想要CHM版的还要花30大洋,用OE把在线版的拉下来一看,乐了:居然正是完整的HTM版!自己编译成CHM版的不就OK了么!
但是正是这个编译过程让我郁闷了好半天。先找了个Microsoft HTML Help Workshop汉化版,一编译就出错;再找个国产软件QuickCHM试试看,编译出来的文件很多地方有问题,而且打开工程文件巨慢;最后找到这个PocketCHMPro,用起来感觉不错,但是未注册版只允许编译10个HTM页面。于是打算CRACK之!

二、开始CRACK:开始郁闷
先用PEiD查一下主程序PocketCHMPro.exe:Microsoft Visual C++ 6.0 [Overlay]到底还是2005年的东西,无壳,心中窃喜;进入输入注册码窗口,不输入任何东西直接点“OK”,弹出“User ID can not be empty”,居然还有错误提示,心中狂喜;直接用OD载入,查找字符串参考,没有找到任何有用的东西,字符串加密了?有点郁闷了;下断点“bp MessageBoxA”,没断下来,再下MessageBoxExA,GetDlgItemTextA,GetDlgItemTextExA之类的常用断点,还是没断下来,很郁闷了;直接暂停程序,再切换到程序界面,程序还在正常运行,查看一下任务管理器,居然还是双进程?相当郁闷了;任务管理器上显示新进程路径是“c:\Program Files\Pocket CHM Pro\PocketCHM_Pro.exe”,到目录下找到这个隐藏的主文件,直接运行弹出“程序执行错误”,极其郁闷了——居然还是双进程保护!

三、双进程调试:继续郁闷
先用OD分析一下真正的主程序PocketCHM_Pro.exe,果然不出所料,所有关键字符串都已经加密,几乎没有调用标准的API,我所知道的常用断点全部失效,静态分析没有找到有用信息;由于是双进程保护,只好开二个OD,一个调试主程序,另一个附加到PocketCHM_Pro.exe进行调试,却发现动态调试找不到下手的地方。看着程序总是在MFC.dll和pceeuilib.dll中来回转,我却只能一愁莫展,心里这个郁闷呀!
浪费了一二个小时后突然想到:MFC程序处理字符串时都会用到MFC42.#800_CString::~CString,MFC42.#858_CString::operator=等之类的函数,用这个用断点会不会有用呢?于是查找MFC42.#800_CString::~CString参考并在IAT处的JMP直接下断:
0046AB10  jmp     dword ptr [<&MFC42.#800_CString::~CString>]      ;  MFC42.#800_CString::~CString
输入用户ID和注册码后点击“OK”,终于断下来了!
观察堆栈:
0012E9EC   0042E26C  返回到 PocketCH.0042E26C 来自 <jmp.&MFC42.#858_CString::operator=>
在0042E26C处下断,再执行完二个RET后来到注册码处理过程:

0041FA6F  push    eax
0041FA70  mov     byte ptr [ebp-4], 2
0041FA74  call    <jmp.&MFC42.#3874_CWnd::GetWindowTextA>      ;  获取用户名UN
0041FA79  lea     eax, dword ptr [ebp-18]
0041FA7C  lea     ecx, dword ptr [edi+A8]
0041FA82  push    eax
0041FA83  call    <jmp.&MFC42.#3874_CWnd::GetWindowTextA>      ;  获取用户输入序列号SN
0041FA88  lea     ecx, dword ptr [ebp-18]
0041FA8B  call    <jmp.&MFC42.#6282_CString::TrimLeft>
0041FA90  lea     ecx, dword ptr [ebp-18]
0041FA93  call    <jmp.&MFC42.#6283_CString::TrimRight>
0041FA98  mov     eax, dword ptr [ebp-18]
0041FA9B  cmp     dword ptr [eax-8], ebx                       ;  len(un)=0?
0041FA9E  jnz     0041FB8D
0041FAA4  lea     eax, dword ptr [ebp-30]
0041FAA7  mov     esi, 004AA940
0041FAAC  push    136
0041FAB1  push    eax
0041FAB2  mov     ecx, esi
0041FAB4  call    <DecodeString>                               ;  字符串解密过程
0041FAB9  push    eax                                          ;  "User ID can not be empty"
0041FABA  lea     ecx, dword ptr [ebp-10]
0041FABD  mov     byte ptr [ebp-4], 3
0041FAC1  call    <jmp.&MFC42.#858_CString::operator=>
0041FAC6  lea     ecx, dword ptr [ebp-30]
0041FAC9  mov     byte ptr [ebp-4], 2
0041FACD  call    <jmp.&MFC42.#800_CString::~CString>
0041FAD2  lea     eax, dword ptr [ebp-30]
0041FAD5  lea     ecx, dword ptr [ebp-144]
0041FADB  push    eax
0041FADC  mov     dword ptr [ebp-30], ebx
0041FADF  call    dword ptr [<&fspceelib.CExtBox::CExtBox>]    ;  fspceeli.CExtBox::CExtBox
0041FAE5  lea     ecx, dword ptr [ebp-20]
0041FAE8  mov     byte ptr [ebp-4], 4
0041FAEC  call    <jmp.&MFC42.#540_CString::CString>
0041FAF1  lea     eax, dword ptr [ebp-28]
0041FAF4  push    138
0041FAF9  push    eax
0041FAFA  mov     ecx, esi
0041FAFC  mov     byte ptr [ebp-4], 5
0041FB00  call    <DecodeString>                               ;  字符串解密过程
0041FB05  push    eax                                          ;  "Pocket CHM Pro"
0041FB06  lea     ecx, dword ptr [ebp-20]
0041FB09  mov     byte ptr [ebp-4], 6
0041FB0D  call    <jmp.&MFC42.#858_CString::operator=>
0041FB12  lea     ecx, dword ptr [ebp-28]
0041FB15  mov     byte ptr [ebp-4], 5
0041FB19  call    <jmp.&MFC42.#800_CString::~CString>
0041FB1E  lea     eax, dword ptr [ebp-28]
0041FB21  lea     ecx, dword ptr [ebp-144]
0041FB27  push    eax
0041FB28  lea     eax, dword ptr [ebp-38]
0041FB2B  push    eax
0041FB2C  lea     eax, dword ptr [ebp-34]
0041FB2F  push    eax
0041FB30  lea     eax, dword ptr [ebp-24]
0041FB33  push    eax
0041FB34  lea     eax, dword ptr [ebp-1C]
0041FB37  push    eax
0041FB38  lea     eax, dword ptr [edi+20]
0041FB3B  push    dword ptr [ebp-20]
0041FB3E  mov     dword ptr [ebp-28], ebx
0041FB41  mov     dword ptr [ebp-38], ebx
0041FB44  mov     dword ptr [ebp-34], 104
0041FB4B  push    dword ptr [ebp-10]
0041FB4E  mov     dword ptr [ebp-24], 4
0041FB55  mov     dword ptr [ebp-1C], ebx
0041FB58  push    eax                                          ;  弹出窗口
0041FB59  call    dword ptr [<&fspceelib.CExtBox::Message>]    ;  fspceeli.CExtBox::Message
0041FB5F  push    440
0041FB64  mov     ecx, edi
0041FB66  call    <jmp.&MFC42.#3092_CWnd::GetDlgItem>
0041FB6B  mov     ecx, eax
0041FB6D  call    <jmp.&MFC42.#5981_CWnd::SetFocus>
0041FB72  lea     ecx, dword ptr [ebp-20]
0041FB75  mov     byte ptr [ebp-4], 4
0041FB79  call    <jmp.&MFC42.#800_CString::~CString>
0041FB7E  mov     byte ptr [ebp-4], 2
0041FB82  lea     ecx, dword ptr [ebp-144]
0041FB88  jmp     0041FDA3
0041FB8D  lea     ecx, dword ptr [ebp-14]
0041FB90  call    <jmp.&MFC42.#6282_CString::TrimLeft>
0041FB95  lea     ecx, dword ptr [ebp-14]
0041FB98  call    <jmp.&MFC42.#6283_CString::TrimRight>
0041FB9D  mov     eax, dword ptr [ebp-14]
0041FBA0  cmp     dword ptr [eax-8], ebx                       ;  len(sn)=0?
0041FBA3  jnz     0041FC92
0041FBA9  lea     eax, dword ptr [ebp-1C]
0041FBAC  mov     esi, 004AA940
0041FBB1  push    137
0041FBB6  push    eax
0041FBB7  mov     ecx, esi
0041FBB9  call    <DecodeString>                               ;  字符串解密过程
0041FBBE  push    eax                                          ;  "Serial Number can not be empty"
0041FBBF  lea     ecx, dword ptr [ebp-10]
0041FBC2  mov     byte ptr [ebp-4], 7
0041FBC6  call    <jmp.&MFC42.#858_CString::operator=>
0041FBCB  lea     ecx, dword ptr [ebp-1C]
0041FBCE  mov     byte ptr [ebp-4], 2
0041FBD2  call    <jmp.&MFC42.#800_CString::~CString>
0041FBD7  lea     eax, dword ptr [ebp-1C]
0041FBDA  lea     ecx, dword ptr [ebp-144]
0041FBE0  push    eax
0041FBE1  mov     dword ptr [ebp-1C], ebx
0041FBE4  call    dword ptr [<&fspceelib.CExtBox::CExtBox>]    ;  fspceeli.CExtBox::CExtBox
0041FBEA  lea     ecx, dword ptr [ebp-20]
0041FBED  mov     byte ptr [ebp-4], 8
0041FBF1  call    <jmp.&MFC42.#540_CString::CString>
0041FBF6  lea     eax, dword ptr [ebp-24]
0041FBF9  push    138
0041FBFE  push    eax
0041FBFF  mov     ecx, esi
0041FC01  mov     byte ptr [ebp-4], 9
0041FC05  call    <DecodeString>
0041FC0A  push    eax                                          ;  "Pocket CHM Pro"
0041FC0B  lea     ecx, dword ptr [ebp-20]
0041FC0E  mov     byte ptr [ebp-4], 0A
0041FC12  call    <jmp.&MFC42.#858_CString::operator=>
0041FC17  lea     ecx, dword ptr [ebp-24]
0041FC1A  mov     byte ptr [ebp-4], 9
0041FC1E  call    <jmp.&MFC42.#800_CString::~CString>
0041FC23  lea     eax, dword ptr [ebp-24]
0041FC26  lea     ecx, dword ptr [ebp-144]
0041FC2C  push    eax
0041FC2D  lea     eax, dword ptr [ebp-34]
0041FC30  push    eax
0041FC31  lea     eax, dword ptr [ebp-38]
0041FC34  push    eax
0041FC35  lea     eax, dword ptr [ebp-28]
0041FC38  push    eax
0041FC39  lea     eax, dword ptr [ebp-30]
0041FC3C  push    eax
0041FC3D  lea     eax, dword ptr [edi+20]
0041FC40  push    dword ptr [ebp-20]
0041FC43  mov     dword ptr [ebp-24], ebx
0041FC46  mov     dword ptr [ebp-34], ebx
0041FC49  mov     dword ptr [ebp-38], 104
0041FC50  push    dword ptr [ebp-10]
0041FC53  mov     dword ptr [ebp-28], 4
0041FC5A  mov     dword ptr [ebp-30], ebx
0041FC5D  push    eax                                          ;  弹出窗口
0041FC5E  call    dword ptr [<&fspceelib.CExtBox::Message>]    ;  fspceeli.CExtBox::Message
0041FC64  push    441
0041FC69  mov     ecx, edi
0041FC6B  call    <jmp.&MFC42.#3092_CWnd::GetDlgItem>
0041FC70  mov     ecx, eax
0041FC72  call    <jmp.&MFC42.#5981_CWnd::SetFocus>
0041FC77  lea     ecx, dword ptr [ebp-20]
0041FC7A  mov     byte ptr [ebp-4], 8
0041FC7E  call    <jmp.&MFC42.#800_CString::~CString>
0041FC83  mov     byte ptr [ebp-4], 2
0041FC87  lea     ecx, dword ptr [ebp-144]
0041FC8D  jmp     0041FDA3
0041FC92  push    ecx
0041FC93  lea     eax, dword ptr [ebp-14]
0041FC96  mov     ecx, esp
0041FC98  mov     dword ptr [ebp-3C], esp
0041FC9B  push    eax
0041FC9C  call    <jmp.&MFC42.#535_CString::CString>
0041FCA1  push    ecx
0041FCA2  lea     eax, dword ptr [ebp-18]
0041FCA5  mov     ecx, esp
0041FCA7  mov     dword ptr [ebp-40], esp
0041FCAA  push    eax
0041FCAB  mov     byte ptr [ebp-4], 0B
0041FCAF  call    <jmp.&MFC42.#535_CString::CString>
0041FCB4  mov     esi, 004A9DD8
0041FCB9  mov     byte ptr [ebp-4], 2
0041FCBD  mov     ecx, esi
0041FCBF  call    0045C7DC
0041FCC4  mov     ecx, esi
0041FCC6  call    0045D658                                     ;  加密用户名注册码并保存到注册表
0041FCCB  lea     eax, dword ptr [ebp-1C]
0041FCCE  mov     esi, 004AA940
0041FCD3  push    135
0041FCD8  push    eax
0041FCD9  mov     ecx, esi
0041FCDB  call    <DecodeString>                               ;  字符串解密过程
0041FCE0  push    eax                                          ;  "Thank you!",LF,LF,"Please restart the program, in order to",LF,"activate all functions for you!"
0041FCE1  lea     ecx, dword ptr [ebp-10]
0041FCE4  mov     byte ptr [ebp-4], 0C
0041FCE8  call    <jmp.&MFC42.#858_CString::operator=>
0041FCED  lea     ecx, dword ptr [ebp-1C]
0041FCF0  mov     byte ptr [ebp-4], 2
0041FCF4  call    <jmp.&MFC42.#800_CString::~CString>
0041FCF9  lea     eax, dword ptr [ebp-1C]
0041FCFC  lea     ecx, dword ptr [ebp-23C]
0041FD02  push    eax
0041FD03  mov     dword ptr [ebp-1C], ebx
0041FD06  call    dword ptr [<&fspceelib.CExtBox::CExtBox>]    ;  fspceeli.CExtBox::CExtBox
0041FD0C  lea     ecx, dword ptr [ebp-2C]
0041FD0F  mov     byte ptr [ebp-4], 0D
0041FD13  call    <jmp.&MFC42.#540_CString::CString>
0041FD18  lea     eax, dword ptr [ebp-24]
0041FD1B  push    138
0041FD20  push    eax
0041FD21  mov     ecx, esi
0041FD23  mov     byte ptr [ebp-4], 0E
0041FD27  call    <DecodeString>                               ;  字符串解密过程
0041FD2C  push    eax                                          ;  "Pocket CHM Pro"
0041FD2D  lea     ecx, dword ptr [ebp-2C]
0041FD30  mov     byte ptr [ebp-4], 0F
0041FD34  call    <jmp.&MFC42.#858_CString::operator=>
0041FD39  lea     ecx, dword ptr [ebp-24]
0041FD3C  mov     byte ptr [ebp-4], 0E
0041FD40  call    <jmp.&MFC42.#800_CString::~CString>
0041FD45  lea     eax, dword ptr [ebp-48]
0041FD48  lea     ecx, dword ptr [ebp-23C]
0041FD4E  push    eax
0041FD4F  lea     eax, dword ptr [ebp-4C]
0041FD52  push    eax
0041FD53  lea     eax, dword ptr [ebp-44]
0041FD56  push    eax
0041FD57  lea     eax, dword ptr [ebp-40]
0041FD5A  push    eax
0041FD5B  lea     eax, dword ptr [ebp-3C]
0041FD5E  push    eax
0041FD5F  lea     eax, dword ptr [edi+20]
0041FD62  push    dword ptr [ebp-2C]
0041FD65  mov     dword ptr [ebp-48], ebx
0041FD68  mov     dword ptr [ebp-4C], ebx
0041FD6B  mov     dword ptr [ebp-44], 106
0041FD72  push    dword ptr [ebp-10]
0041FD75  mov     dword ptr [ebp-40], 4
0041FD7C  mov     dword ptr [ebp-3C], ebx
0041FD7F  push    eax                                          ;  弹出窗口
0041FD80  call    dword ptr [<&fspceelib.CExtBox::Message>]    ;  fspceeli.CExtBox::Message
0041FD86  mov     ecx, edi
0041FD88  call    <jmp.&MFC42.#4853_CDialog::OnOK>
0041FD8D  lea     ecx, dword ptr [ebp-2C]
0041FD90  mov     byte ptr [ebp-4], 0D
0041FD94  call    <jmp.&MFC42.#800_CString::~CString>
0041FD99  mov     byte ptr [ebp-4], 2
0041FD9D  lea     ecx, dword ptr [ebp-23C]
0041FDA3  call    dword ptr [<&fspceelib.CExtBox::~CExtBox>]   ;  fspceeli.CExtBox::~CExtBox
0041FDA9  lea     ecx, dword ptr [ebp-14]
0041FDAC  mov     byte ptr [ebp-4], 1
0041FDB0  call    <jmp.&MFC42.#800_CString::~CString>
0041FDB5  lea     ecx, dword ptr [ebp-18]
0041FDB8  mov     byte ptr [ebp-4], bl
0041FDBB  call    <jmp.&MFC42.#800_CString::~CString>
0041FDC0  or      dword ptr [ebp-4], FFFFFFFF
0041FDC4  lea     ecx, dword ptr [ebp-10]
0041FDC7  call    <jmp.&MFC42.#800_CString::~CString>
0041FDCC  mov     ecx, dword ptr [ebp-C]
0041FDCF  pop     edi
0041FDD0  pop     esi
0041FDD1  mov     dword ptr fs:[0], ecx
0041FDD8  pop     ebx
0041FDD9  leave
0041FDDA  retn
0042EF18 >push    ebp                                    ; 程序入口
0042EF19  mov     ebp, esp
0042EF1B  push    -1
0042EF1D  push    00401458
0042EF22  push    <jmp.&MSVCRT._except_handler3>
……一直单步往下走
0042F03C  push    eax
0042F03D  push    esi
0042F03E  push    ebx
0042F03F  push    ebx
0042F040  call    dword ptr [<&KERNEL32.GetModuleHandleA>; kernel32.GetModuleHandleA
0042F046  push    eax
0042F047  call    0042C667                               ; 后面就退出了,这里跟进
0042F04C  mov     dword ptr [ebp-68], eax
0042F04F  push    eax
0042F050  call    dword ptr [<&MSVCRT.exit>]             ; msvcrt.exit

0042C667  push    ebp
0042C668  mov     ebp, esp
0042C66A  sub     esp, 20
0042C66D  push    ebx
0042C66E  push    esi
0042C66F  mov     esi, 0042F2A8
0042C674  push    edi
0042C675  mov     ecx, esi
0042C677  call    0042C39B                               ; 关联文件
0042C67C  push    dword ptr [ebp+10]
0042C67F  call    <jmp.&MSVCRT.strlen>
0042C684  pop     ecx
0042C685  mov     edi, eax
0042C687  mov     ecx, esi
0042C689  call    0042C368                               ; 删除旧文件,解压缩数据并写新文件
0042C68E  mov     ebx, eax
0042C690  test    ebx, ebx
0042C692  je      short 0042C6D7                         ; 写新文件出错时不跳,这里跳过
……
0042C6D7  test    edi, edi
0042C6D9  jnz     short 0042C6E4
0042C6DB  mov     ecx, esi                               ; PocketCH.0042F2A8
0042C6DD  call    0042BB20                               ; 执行新建立的文件并监控等待程序退出
0042C6E2  jmp     short 0042C6EE
0042C6E4  push    dword ptr [ebp+10]
0042C6E7  mov     ecx, esi
0042C6E9  call    0042BCA2
0042C6EE  mov     esi, eax
0042C6F0  cmp     esi, -61
0042C6F3  jnz     short 0042C706
0042C6F5  push    10
0042C6F7  push    0
0042C6F9  push    004256B0                               ; ASCII "Failed to run.",LF,"Please get a new copy of this program."
0042C6FE  push    0
0042C700  call    dword ptr [<&USER32.MessageBoxA>]      ; USER32.MessageBoxA
0042C706  mov     eax, esi
0042C708  pop     edi
0042C709  pop     esi
0042C70A  pop     ebx
0042C70B  leave
0042C70C  retn    10
0042EFD3  push    00402008                               ; [402008]=42BDDA
0042EFD8  push    00402000
0042EFDD  call    <jmp.&MSVCRT._initterm>                ; 根据堆栈数据跳转到42BDDA处执行

0042BDDA  call    0042BDE4

0042BDE4  mov     ecx, 0042F2A8
0042BDE9  jmp     0042BE09

0042BE09  mov     eax, 0042F13C
0042BE0E  call    <jmp.&MSVCRT._EH_prolog>
0042BE13  sub     esp, 10C
0042BE19  push    ebx
0042BE1A  push    esi
0042BE1B  mov     esi, ecx
0042BE1D  push    edi
0042BE1E  mov     dword ptr [ebp-14], esi
0042BE21  lea     edi, dword ptr [esi+C]
0042BE24  mov     ecx, edi
0042BE26  call    <jmp.&MFC42.#540_CString::CString>
0042BE2B  xor     ebx, ebx
0042BE2D  push    00423B70                               ; ASCII "PCHMPROM",映像名
0042BE32  mov     ecx, edi
0042BE34  mov     dword ptr [ebp-4], ebx
0042BE37  call    <jmp.&MFC42.#860_CString::operator=>
0042BE3C  push    5C
0042BE3E  call    <jmp.&MFC42.#823_operator new>
0042BE43  pop     ecx
0042BE44  mov     dword ptr [ebp-10], eax
0042BE47  cmp     eax, ebx
0042BE49  mov     byte ptr [ebp-4], 1
0042BE4D  je      short 0042BE62
0042BE4F  mov     edi, dword ptr [edi]
0042BE51  push    ebx
0042BE52  push    ebx
0042BE53  push    96000                                  ; 内存映像大小
0042BE58  push    edi
0042BE59  mov     ecx, eax
0042BE5B  call    0042E57D                               ; 用CreateFileMappingA建立子进程共享数据,关键,跟进
……
0042E71D  push    dword ptr [esi+C]
0042E720  call    <jmp.&MFC42.#521_CSingleLock::CSingleLock>   ; 锁定数据
0042E725  jmp     short 0042E729
0042E727  xor     eax, eax
0042E729  cmp     eax, edi
0042E72B  mov     byte ptr [ebp-4], 1
0042E72F  mov     dword ptr [esi+10], eax
0042E732  je      0042E80B
0042E738  push    -1
0042E73A  mov     ecx, eax
0042E73C  call    <jmp.&MFC42.#4167_CSingleLock::Lock>
0042E741  push    dword ptr [ebp+8]                            ; MapName="PCHMPROM"
0042E744  mov     eax, dword ptr [esi+28]
0042E747  neg     eax
0042E749  push    dword ptr [ebp+C]                            ; MaximumSizeLow=96000
0042E74C  lea     ecx, dword ptr [esi+40]
0042E74F  sbb     eax, eax
0042E751  push    edi                                          ; MaximumSizeHigh=0
0042E752  and     eax, ecx
0042E754  push    4                                            ; Protection=PAGE_READWRITE
0042E756  push    eax                                          ; pSecurity=00382690
0042E757  push    -1                                           ; hFile=FFFFFFFF
0042E759  call    dword ptr [<&KERNEL32.CreateFileMappingA>]   ; CreateFileMappingA建立内存映像
0042E75F  mov     ebx, dword ptr [<&KERNEL32.GetLastError>]    ; ntdll.RtlGetLastWin32Error
0042E765  mov     dword ptr [esi+24], eax                      ; 保存hFile
0042E768  call    ebx                                          ; 建立映像时是否出错?
0042E76A  cmp     eax, 0B7
0042E76F  jnz     short 0042E774
0042E771  mov     dword ptr [esi+14], edi
0042E774  mov     eax, dword ptr [esi+24]
0042E777  cmp     eax, edi
0042E779  je      short 0042E7F9
0042E77B  push    edi
0042E77C  push    edi
0042E77D  push    edi
0042E77E  push    6
0042E780  push    eax                                          ; hFile
0042E781  call    dword ptr [<&KERNEL32.MapViewOfFile>]        ; MapViewOfFile生成映像
0042E787  cmp     eax, edi
0042E789  mov     dword ptr [esi+20], eax                      ; 保存映像地址
0042E78C  je      short 0042E7F9
0042E78E  cmp     dword ptr [esi+14], edi                      ; 生成映像是否出错?
0042E791  je      short 0042E7B7
0042E793  mov     ebx, dword ptr [ebp+C]
0042E796  push    ebx
0042E797  push    edi
0042E798  push    eax
0042E799  call    <jmp.&MSVCRT.memset>
0042E79E  lea     eax, dword ptr [esi+1C]
0042E7A1  push    4
0042E7A3  push    eax
0042E7A4  mov     dword ptr [eax], ebx
0042E7A6  mov     eax, dword ptr [esi+20]
0042E7A9  add     eax, 4
0042E7AC  push    eax
0042E7AD  call    <jmp.&MSVCRT.memcpy>                         ; 写映像数据
0042E7B2  add     esp, 18
0042E7B5  jmp     short 0042E7C9
0042E80E  cmp     ecx, edi
0042E810  je      short 0042E817
0042E812  call    <jmp.&MFC42.#6307_CSingleLock::Unlock>       ; 解锁数据
0042E817  mov     ecx, dword ptr [ebp-C]
0042E81A  mov     eax, esi
0042E81C  pop     edi
0042E81D  pop     esi
0042E81E  pop     ebx
0042E81F  mov     dword ptr fs:[0], ecx
0042E826  leave
0042E827  retn    10

返回后继续用循环写映像数据:

0042BE82  mov     edi, 00422024                           ; 字符串初始地址
0042BE87  mov     eax, dword ptr [edi]                    ; 循环写映像数据
0042BE89  mov     ebx, dword ptr [edi-4]
0042BE8C  xor     ecx, ecx
0042BE8E  cmp     dword ptr [edi-8], 00423B6C
0042BE95  push    eax
0042BE96  push    eax
0042BE97  setne   cl
0042BE9A  mov     dword ptr [ebp-10], ecx
0042BE9D  call    <jmp.&MSVCRT.strlen>
0042BEA2  pop     ecx
0042BEA3  mov     ecx, dword ptr [esi+10]
0042BEA6  push    eax
0042BEA7  push    ebx
0042BEA8  push    dword ptr [ebp-10]
0042BEAB  call    0042EB58                                ; 继续向映像中写数据
0042BEB0  test    eax, eax
0042BEB2  jnz     short 0042BECF                          ; 写映像出错时不跳
0042BEB4  mov     ecx, dword ptr [esi+10]
0042BEB7  call    0042E8FF
0042BEBC  cmp     eax, 0E
0042BEBF  jnz     short 0042BECF
0042BEC1  push    0
0042BEC3  push    0
0042BEC5  push    00423B24                                ; ASCII "!!!ERROR_OUTOFMEMORY-1!!!-find 'remark203153' in your dsw's source code"
0042BECA  call    <jmp.&MFC42.#1200_AfxMessageBox>
0042BECF  add     edi, 0C                                 ; 取下一字符串
0042BED2  cmp     edi, 00423AB8                           ; ASCII "ork, we dream......"
0042BED8  jl      short 0042BE87                          ; 循环结束?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 864
活跃值: (2350)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
文章很清淅。。先借一下。。来试验一下补丁技术。
2008-4-29 18:19
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我做出来的不行,估计是哪里做错了
上传的附件:
2008-4-29 23:01
0
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=lelfei;447279]MFC程序处理字符串时都会用到MFC42.#800_CString::~CString,MFC42.#858_CString::operator=等之类的函数,用这个用断点会不会有用呢?于是查找MFC42.#800_CString::~CString参考并在IAT处的JMP直接下断:
0046AB10  jmp     dword ptr [<&MFC42.#800_CString::~CString>]      ;  MFC42.#800_CString::~CString
输入用户ID和注册码后点击“OK”,终于断下来了!
[/QUOTE]

请问 具体怎么操作?始终断不下来,反而出内存错误
2008-4-30 11:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哈哈,给个安装程序.俺来跟跟.
2008-4-30 11:23
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
6
直接在这一行按F2下断就可以了:
0046AB10 jmp dword ptr [<&MFC42.#800_CString::~CString>] ; MFC42.#800_CString::~CString

哈哈,给个安装程序.俺来跟跟.

搜了个下载地址:
http://www.skycn.com/soft/19060.html
2008-4-30 12:43
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
7
看了一下你的程序,步骤都是对的,但是写的数据不对,你是不是在数据段里按CTRL+C复制出来的?把ASC值也复制到BIN文件里了!

我的做法是:先在数据窗口里跟随数据段,再在数据窗口里点鼠标右键——备份——保存数据到文件——保存即可!
2008-4-30 12:52
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
soory,看错了,谢谢指点
2008-4-30 13:53
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
很新颖,特别是双进程改单进程,区段插入等技术
2008-4-30 22:03
0
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=lelfei;447611]直接在这一行按F2下断就可以了:
0046AB10 jmp dword ptr [<&MFC42.#800_CString::~CString>] ; MFC42.#800_CString::~CString
[/QUOTE]

操作哪个程序,是生成的那个,还是原来的主程序?
2008-4-30 22:18
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
好文,下载学习!
2008-4-30 22:43
0
雪    币: 221
活跃值: (2306)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
不错!!学习学习!!
2008-5-1 16:32
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
13
是生成的程序,生成的那个程序才是真正的主程序,原安装程序只是起一个引导作用,了解作用后就可以把它放在一边了
2008-5-1 22:58
0
雪    币: 29214
活跃值: (7724)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
14
学习~~~~
2008-5-3 03:01
0
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=lelfei;447617]0042EFD3  push    00402008                               ; [402008]=42BDDA[/QUOTE]

这句[402008]=42BDDA怎么来的?
2008-5-3 21:55
0
雪    币: 146
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
双进程的,值得学习!
2008-5-4 23:46
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
17
[QUOTE=aoanzhishu;449039]这句[402008]=42BDDA怎么来的?[/QUOTE]

[402008]这个地址的值是固定的,用dd 402008可以查看
2008-5-5 11:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
佩服!!!此程序运行后产生一个影子,这是为什么?
2008-6-8 15:45
0
游客
登录 | 注册 方可回帖
返回
//