直接贴上答案中提供的文档,如下(别人博客中文章编辑得十分漂亮,各种高亮,但这个对我来说太难了。。):

运行“破解考题.exe”后,使用远程注入工具“RemoteDll.exe”将“patch.dll”注入到进程“破解考题.exe”,之后即可使用“keygen.exe”生成注册码进行注册。

如:
MyNameIsMrWrong
6B707743323168447730652B5A68315639572F74566E75564D3251364F48305432522B6F4441697848334F766749494E5846365249575647363873326A516A756F326B62

MrWrong
45784F625156694C304D70355A68315639572F74566E75564D3251364F48305432522B6F4441697848334F766749494E5846365249575647363873326A516A756F326B62

代码开发环境:win7 x64 sp1

程序不完全分析如下:1.首先脱掉压缩壳便于分析。

2.脱壳后分析发现,有如下代码:
if ( CreateMutexW(0, 0, Name) )
{
  if ( GetLastError() == 0xB7 )
  {
    CreateThread(0, 0, sub_401BC0, 0, 0, 0); //创建线程,线程内还会创建线程,解密用于校验的部分代码,
  }
  else    //是第一个实例,则以调试方式运行自己的副本
  {
    Filename = 0;
    memset(&v10, 0, 0x206u);
    memset(&StartupInfo.lpReserved, 0, 0x40u);
    StartupInfo.cb = 68;
    GetModuleFileNameW(0, &Filename, 0x208u);
    if ( CreateProcessW(&Filename, 0, 0, 0, 0, 1u, 0, 0, &StartupInfo, &ProcessInformation) )
    {
      DebugEvent.dwDebugEventCode = 0;
      memset(&DebugEvent.dwProcessId, 0, 0x5Cu);
      while ( WaitForDebugEvent(&DebugEvent, 0xFFFFFFFF) )
      {
        if ( DebugEvent.dwDebugEventCode == 8 )   //单步调试副本,直到副本output一个DebugString
          break;
        ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x10002u);
      }
      DebugSetProcessKillOnExit(0);
      DebugActiveProcessStop(ProcessInformation.dwProcessId);
      ExitProcess(0);
    }
  }
}

3.用于校验的部分代码是通过文件的crc32校验以及哈希值加密的,如果改变文件则无法正确解密。正确解密后通过与地址00541702处 call VirtualProtect,修改此段动态申请内存为PAGE_EXECUTE_READWRITE
权限。我并不打算在这之前修改程序中的任何数据,所以这一块东西并不担心,就此打住。

4.解密出来的这部分代码分析(注册码校验过程):
(1)注册码全是数字,两两组合后为一段字符串,记为”A“,对A进行base64解密(base64解密函数为相对于这块动态申请的内存偏移为0x1000,记为sub_off_1000),base64解密后,得到的数据记为”B“。
(2)”B”将通过函数sub_off_1A90解密得到"C",内部固定使用秘钥"lingdux_keygen",是512位的加解密方式,但此解密函数我未弄明白是什么算法,仅怀疑是AES512,(固不下钩子的注册机无法给出)。
(3)计算Username字符串的MD5值,记为“D”。
(4)对于“C”,需满足如下关系。
C[0] == D[0];
C[1] == D[2];
C[2] == D[4];
C[3] == D[6];
C[5] == D[8];
C[6] == D[10];
C[7] == D[12];
C[8] == D[14];
(5)使用函数sub_off_1DD0+秘钥“lingdux”,解密一串二进制(为弄明白的二进制串,记为”Q“),得到固定字符串:”Success“,由于sub_off_1A90函数未弄明白,写出注册机的想法心灰意冷,并且上班工作繁忙,这里就不管他了。
但是这个"Q"肯定是由”C“的后面部分变形而来。
(6)计算字符串”Success“的MD5值,得到二进制序列: 505a83f220c02df2f85c3810cd9ceb38,并与程序中存储的二进制序列比较。如果不是则功亏一篑。

注册机无法做出,就将没弄明白的地方HOOK住,变成已知的。
如下:
int __stdcall hook_off_1a90(void)
{
  BYTE* p; //[in] & [out]
  _asm
  {
    mov p, ecx
  }
  //做注册机时,可对p中的数据进行加密,我没有进行加密了,直接原封不动。
  // some_encrypt(p,64);
  return 1;
}

还有一处hook,是为了hook_off_1a90的时机,即在即将调用上文中”校验的部分代码“时。
00401A20 ; DWORD __stdcall sub_401A20(LPVOID lpThreadParameter)
00401A20 lpThreadParameter= dword ptr 4
00401A20
00401A20 push offset dword_5B40A8
00401A25 call dword_5B40A0 //此处下刀
00401A2B add esp, 4
00401A2E xor eax, eax
00401A30 retn 4
00401A30 StartAddress endp

钩子源码部分如下:
int __stdcall hook_5b40a0(int np)
{
  _asm
  {
    pushad
    pushfd
  }
  static BOOL patched = FALSE;
  if(!patched)
  {
    patched = TRUE;
    DWORD addr = (DWORD)g_5b40a0 - 0x1F20 + 0x2167 + 1;
    DWORD call_offset = (DWORD)hook_off_1a90 - addr - 4;
    *(DWORD*)addr = call_offset; //hooked hook_off_1a90
  }
  _asm
  {
    popfd
    popad
  }
  int ret = g_5b40a0(np);
  return ret;
}

其它部分和原注册算法一致,仅在未知之处略施手段,变未知为已知。
时间有限,远程注入工具则使用一款经典的工具”RemoteDll.exe“。
学海无涯,失误之处敬请谅解。

by:MrWrong 邮箱:rongguozhen@foxmail.com 20140428

文件: http://files.cnblogs.com/MrWrong/360.rar

转载于:https://www.cnblogs.com/MrWrong/p/3734638.html

我的360破解考题答案相关推荐

  1. 刚参加完阿里Java P6面试归来,6点面试经验总结!(含必考题答案)

    这是来自于优知学院一位铁粉面试回来的总结经验 刚参加完蚂蚁金服的Java P6级的面试,一共参加了4面.面试归来,总结下阿里面试流程.面试过程.以及面试题目范畴.文末有阿里Java P6面试必考题与答 ...

  2. 天大计算机辅助设计与制造考题,2017年CAD工程师认证考题答案及解析

    2017年CAD工程师认证考题答案及解析 1.显示错误报告信息,并且可以向 Autodesk 发送错误报告.此时需要将系统变量REPROTERROR设置为 A 0 B 1 C 2 D 3 答案:B 解 ...

  3. 阿里云Apsara Clouder基础技能认证 考题答案

    本人已考试通过,阿里不给答案,本人一个一个认真核对的,可以参考下面的考题答案 https://download.csdn.net/download/amzkqi/12176060

  4. GitHub上读北大:覆盖AI高数等130多门课,讲义考题答案全都有,标星已3k+

    栗子 乾明 发自 凹非寺  量子位 出品 | 公众号 QbitAI 现在,你在GitHub上就可以读北大了. 一位用户(librarian-pku)创建了名为libpku的项目,专门用来分享北京大学的 ...

  5. 2019 阿里Java 4轮面试题,含必考题答案参考!

    Java一面 hashmap源码问题 HashMap底层结构 put操作讲一下 HashMap.HashMap如何保证线程安全.ConcurrentHashMap JVM有哪些回收算法,对应的收集器有 ...

  6. 下列选项中 采用边界值平滑_数据挖掘期末考题(答案).doc

    华南理工大学计算机科学与工程学院2012-2013学年度第二学期期末考试<数据仓库与数据挖掘技术>试 卷(假的)专业:计算机科学与技术 年级:2010 姓名: 学号: 注意事项:1. 本试 ...

  7. 电大计算机人文英语,电大 人文英语3 翻译 形考题答案教学文案

    2020年10月31日发(作者:席时熙) 精品文档 英译汉 2018 人文英语3 – 翻译形考答案 操作提示:通过题干后的下拉框选择题目的正确答案. 1. Parents are too busy t ...

  8. 2020人工智能日常应用考题答案

    单选题 1.下列对战斗机器人的表述,不当的是().(10.0分) A.目前战场上的主要力量 B.配合人类士兵作战的角色 C.在执行低烈度作战和危险任务时可以大大减轻人类士兵的负担和伤亡 D.具有较高智 ...

  9. 培训管理与人才开发 考题答案

    单选题 1.下列哪种情况下,组织愿意提供培训?( ).(10.0分) A.提高了对未来收益无任何影响的现期支出的培训 B.降低了现期支出,但也会大幅度降低未来收益的培训 C.提高现期支出和降低现期收益 ...

最新文章

  1. 【Linux系统编程】进程常用调度算法
  2. 用条件运算符编写程序判断一个人的体重是否为标准体重
  3. getUpdateCount成员函数不能返回正确数量
  4. mysql漏洞如何打补丁_WordPress 5.1 CSRF to RCE 漏洞详解
  5. 教你如何将中文转换成全拼
  6. 没有钱的苦恼与无奈:七个城市的1000元生活(转载)
  7. Camera(2) camera i2c总线协议介绍
  8. matlab pv图,Matlab中imagesc
  9. 2022届软件技术专业毕业生就业岗位分析(.Net方向)
  10. 计算机配置的内存容量为4GB,电脑添加4G内存条后内存容量没有变化怎么办
  11. 基于OpenCASCADE自制三维建模软件(十)编译ASSIMP库
  12. VS2003下载地址
  13. 旋转体的体积和表面积
  14. 《响应式Web设计性能优化》一2.3 Web运行时性能
  15. 如何判断一个数是否是NaN
  16. stm32复位引脚NRST
  17. C/C#实现RSA签名
  18. android开发-指纹识别
  19. 红利源头指向shopee市场,虾 扑 软件起到哪些重要作用呢?
  20. 常见的中成药神奇疗效

热门文章

  1. LeetCode --Search Insert Position
  2. 自己归纳整理的ARM THUMB指令机器码表
  3. 已解决:PC插上串口工具后PC端口com那里有个黄色叹号,无法使用串口工具
  4. 单片机与外设模块数据传输不成功各种原因分析总结
  5. x=x|(x+1);和x=x(x-1)?
  6. TCP和UDP是否可以绑定同一端口进行通信
  7. SAPGUI系统登录页面配置的SAProuter有什么用
  8. 从成本角度看Java微服务
  9. Exchange 2013恢复已禁用用户邮箱
  10. Calendar的获取变化日期