VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2942|回复: 2

[技术文章] 【复习】从调戏计算器讲起(计算器阿拉伯数字变中文大写)

[复制链接]
Miss丿小沫 发表于 2016-7-17 19:29:59 | 显示全部楼层 |阅读模式
依然是我!【Miss丿小沫】
------------------------------------------------------------------------
这章来复习一下上章讲的东西,就是附加调试器方法钩取API,算是代码总结吧,具体的就不细讲了(见上一章节),给大家发一个算是模板代码把,大家有不懂得们可以留言。
(OD调试计算器要调试XP的计算器,不知道为什么,WIN7的计算器我调试就崩溃。。。。和notepad一样。。。)
上:http://www.cctry.com/thread-266000-1-1.html
下:http://www.cctry.com/thread-266026-1-1.html
------------------------------------------------------------------------




------------------------------------------------------------------------
(代码复习,具体讲解见上一章讲解)
  1. void CHookCalcDlg::OnBnClickedButtonHook()
  2. {
  3.         HANDLE hThread = CreateThread(NULL,0,ThreadProc,(LPVOID)this,0,NULL);
  4.         CloseHandle(hThread);
  5. }
复制代码

------------------------------------------------------------------------
  1. /********************************************
  2. Name:DebugLoop()
  3. Description:DebugLoop Attaching Process
  4. ********************************************/
  5. void CHookCalcDlg::DebugLoop()
  6. {
  7.         DEBUG_EVENT DE;

  8.         while(WaitForDebugEvent(&DE,INFINITE))
  9.         {
  10.                 switch(DE.dwDebugEventCode)
  11.                 {
  12.                         case CREATE_PROCESS_DEBUG_EVENT:
  13.                                 CreateProcessDebugEvent(&DE);
  14.                                 break;
  15.                         case EXCEPTION_DEBUG_EVENT:
  16.                                 ExceptionProcessDebugEvent(&DE);
  17.                                 break;
  18.                         case EXIT_PROCESS_DEBUG_EVENT:
  19.                                 return ;
  20.                 }
  21.                 ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE);
  22.         }
  23. }
复制代码

------------------------------------------------------------------------
  1. /********************************************************************************************************
  2. Name:CreateProcessDebugEvent(LPDEBUG_EVENT lpDE)
  3. Description:When dwDebugEventCode=CREATE_PROCESS_DEBUG_EVENT(When the Process Starts)
  4. ********************************************************************************************************/
  5. void CHookCalcDlg::CreateProcessDebugEvent(LPDEBUG_EVENT lpDE)
  6. {
  7.         BYTE bInt3 = 0xCC;

  8.         memcpy(&CPDbg_Info,&lpDE->u.CreateProcessInfo,sizeof(CREATE_PROCESS_DEBUG_INFO));
  9.         pSWTAddress = GetProcAddress(GetModuleHandle(_T("user32.dll")),"SetWindowTextW");
  10.         ReadProcessMemory(CPDbg_Info.hProcess,pSWTAddress,&bOriByte,sizeof(BYTE),NULL);
  11.         WriteProcessMemory(CPDbg_Info.hProcess,pSWTAddress,&bInt3,sizeof(BYTE),NULL);
  12. }
复制代码

------------------------------------------------------------------------
  1. /********************************************************************************************************
  2. Name:ExceptionProcessDebugEvent(LPDEBUG_EVENT lpDE)
  3. Description:When dwDebugEventCode=EXCEPTION_DEBUG_EVENT(When the Process is abnormal(BreakPoint))
  4. ********************************************************************************************************/
  5. void CHookCalcDlg::ExceptionProcessDebugEvent(LPDEBUG_EVENT lpDE)
  6. {
  7.         LPEXCEPTION_RECORD lpER = &lpDE->u.Exception.ExceptionRecord;
  8.         DWORD dwBufAddress = 0;
  9.         CONTEXT cText;
  10.         PBYTE pBuf;
  11.         BYTE bInt3;

  12.         if(lpER->ExceptionCode == EXCEPTION_BREAKPOINT && lpER->ExceptionAddress == pSWTAddress)
  13.         {
  14.                 WriteProcessMemory(CPDbg_Info.hProcess,pSWTAddress,&bOriByte,sizeof(BYTE),NULL);

  15.                 cText.ContextFlags = CONTEXT_CONTROL;
  16.                 GetThreadContext(CPDbg_Info.hThread,&cText);
  17.                 ReadProcessMemory(CPDbg_Info.hProcess,(LPVOID)(cText.Esp + 0x8),&dwBufAddress,sizeof(DWORD),NULL);

  18.                 pBuf = (PBYTE)malloc(256);
  19.                 memset(pBuf,0,256);
  20.                 ReadProcessMemory(CPDbg_Info.hProcess,(LPVOID)dwBufAddress,pBuf,256,NULL);
  21.                 //改写
  22.                 CString str,strNew;
  23.                 str.Format(_T("%s"),pBuf);
  24.                 for(int i = 0;i < str.GetLength();i ++)
  25.                 {
  26.                         switch(str.GetAt(i))
  27.                         {
  28.                                 case '0':
  29.                                         strNew += _T("零");
  30.                                         break;
  31.                                 case '1':
  32.                                         strNew += _T("一");
  33.                                         break;
  34.                                 case '2':
  35.                                         strNew += _T("二");
  36.                                         break;
  37.                                 case '3':
  38.                                         strNew += _T("三");
  39.                                         break;
  40.                                 case '4':
  41.                                         strNew += _T("四");
  42.                                         break;
  43.                                 case '5':
  44.                                         strNew += _T("五");
  45.                                         break;
  46.                                 case '6':
  47.                                         strNew += _T("六");
  48.                                         break;
  49.                                 case '7':
  50.                                         strNew += _T("七");
  51.                                         break;
  52.                                 case '8':
  53.                                         strNew += _T("八");
  54.                                         break;
  55.                                 case '9':
  56.                                         strNew += _T("九");
  57.                                         break;
  58.                         }
  59.                 }

  60.                 WriteProcessMemory(CPDbg_Info.hProcess,(LPVOID)dwBufAddress,strNew,256,NULL);
  61.                 free(pBuf);
  62.                 cText.Eip = (DWORD)pSWTAddress;
  63.                 SetThreadContext(CPDbg_Info.hThread,&cText);

  64.                 ContinueDebugEvent(lpDE->dwProcessId,lpDE->dwThreadId,DBG_CONTINUE);
  65.                 Sleep(0);

  66.                 WriteProcessMemory(CPDbg_Info.hProcess,pSWTAddress,&bInt3,sizeof(BYTE),NULL);
  67.         }
  68. }
复制代码

------------------------------------------------------------------------
我是【Miss丿小沫】,我喂我袋盐!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入驿站

x

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

mayl8822 发表于 2017-7-6 13:41:44 | 显示全部楼层
http://www.cctry.com/thread-266026-1-1.html这个链接打不开了, 是怎么回事?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

我自横刀猫 发表于 2017-9-13 12:49:14 | 显示全部楼层
吸引我的是“调戏”计算器,哈哈哈

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站

本版积分规则

展开

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )

返回顶部
x

VC驿站微信公众号cctry2009

GMT+8, 2017-10-18 04:45

Powered by Discuz!

© 2009-2017 cctry.com

快速回复 返回顶部 返回列表