首页 > 其他分享 >逆向-第三次实验-注册码分析

逆向-第三次实验-注册码分析

时间:2023-04-24 11:13:02浏览次数:36  
标签:逆向 return 第三次 4056A8 dword byte 4079D0 注册码 sub

本次实验考虑使用到了ida

在使用ida时,用ida32而非64,否则无法查看伪代码。

打开后看到dialog,即对话框元素函数,很有可能是我们要考虑的地方,点击后F5得到伪代码。

 代码

INT_PTR __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4)
{
  HICON IconA; // eax
  UINT DlgItemTextA; // eax
  UINT v7; // [esp-4h] [ebp-8h]

  if ( a2 == 272 )
  {
    IconA = LoadIconA(hInstance, (LPCSTR)0x1F4);
    SendMessageA(hWnd, 0x80u, 0, (LPARAM)IconA);
    return 0;
  }
  if ( a2 == 16 )
  {
LABEL_16:
    EndDialog(hWnd, 0);
    return 0;
  }
  if ( a2 != 273 )
    return 0;
  if ( a3 == 300 )
  {
    MessageBoxA(hWnd, Text, Caption, 0);
    return 0;
  }
  if ( a3 != 900 )
  {
    if ( a3 != 400 )
      return 0;
    goto LABEL_16;
  }
  DlgItemTextA = GetDlgItemTextA(hWnd, 100, String1, 300);
  if ( !DlgItemTextA )
    return MessageBoxA(0, aYourNamePlease, aOoohInputError, 0);
  v7 = DlgItemTextA;
  if ( !GetDlgItemTextA(hWnd, 200, byte_409CF8, 300) )
    return MessageBoxA(0, aWhereIsDaSeria, aOoohInputError, 0);
  lstrcatA(String1, String2);
  sub_401000(String1, v7, &unk_4056A8);
  sub_401B79();
  if ( lstrcmpA(byte_409CF8, byte_4079D0) )
  {
    MessageBoxA(0, aHmmmNotLikeThi, aFatalError, 0);
    return 0;
  }
  MessageBoxA(0, aGoodSerialNowS, aGoodWork, 0);
  return 0;
}

 

我们解读一下,逆向的思路是从后面解读:

if ( lstrcmpA(byte_409CF8, byte_4079D0) )
  {
    MessageBoxA(0, aHmmmNotLikeThi, aFatalError, 0);
    return 0;
  }
  MessageBoxA(0, aGoodSerialNowS, aGoodWork, 0);
//这段代码指istrcmpA函数判断byte_409CF8, byte_4079D0是否相等,不相等就fail,相等在下一步就有goodserial

 

 接着来看全部的代码

DlgItemTextA = GetDlgItemTextA(hWnd, 100, String1, 300);  
//此行从对话框hWnd的ID为100的控件中获取输入,并将其存储在String1中,最大长度为300个字符。GetDlgItemTextA()函数的返回值存储在DlgItemTextA中。
//我们大约可以猜测string1是用户名 if ( !DlgItemTextA ) return MessageBoxA(0, aYourNamePlease, aOoohInputError, 0); //如果GetDlgItemTextA()返回NULL,则显示错误消息框,提示输入名称。 v7 = DlgItemTextA; //将DlgItemTextA的值(刚获取的输入)存储到v7中。 if ( !GetDlgItemTextA(hWnd, 200, byte_409CF8, 300) ) return MessageBoxA(0, aWhereIsDaSeria, aOoohInputError, 0); //从ID为200的控件获取输入并存储在byte_409CF8中,最大长度300个字符。如果获取失败,显示另一个错误消息框。我们大约猜测byte是序列码 lstrcatA(String1, String2); //将String2中的字符串追加到String1的末尾。String1现在包含两个控件的输入值。string2可能是个额外变量不被输入 sub_401000(String1, v7, &dword_4056A8); sub_401B79(); //调用两个子例程sub_401000和sub_401B79,传入String1和v7的值,以及dword_4056A8的地址。我们不知道这两个子例程的功能。
我们并不清楚这sub_401000和sub_401B79是什么,查询一下。

sub_401000:

 发现了四个常量,猜测为md5,

值应该运算在dword里了,因为函数没有输出,只有它有指针

sub_401B79:

int v0; 

v0 = dword_4056A8[1]; 
//v0初始化为dword_4056A8数组的第二个元素的值。我们不知道dword_4056A8的值。

wsprintfA(byte_4079D0, "%.8X", v0 ^ dword_4056A8[0]);
//这将v0与dword_4056A8的第一个元素进行异或运算,并使用wsprintfA()将结果作为8个十六进制字符存储在byte_4079D0中。
v0 ^= 0xFBD0099u;
 
//v0与0xFBD0099u进行异或运算。这会修改v0的值。

wsprintfA(&byte_4079D0[8], "%.8X", v0); 
//然后,v0的值作为8个十六进制字符存储在byte_4079D0的第9-16个字符中。

wsprintfA(&byte_4079D0[16], "%.8X", v0 ^ dword_4056A8[2]);
//v0再与dword_4056A8的第三个元素进行异或运算,结果存储在byte_4079D0的第17-24个字符中。
 
wsprintfA(&byte_4079D0[24], "%.8X", dword_4056A8[3]); 
//最后,dword_4056A8的第四个元素的值存储在byte_4079D0的第25-32个字符中。

 

这里也有dword也证实了我们的猜想

我们现在假设一个用户名“admin”

运行olldbg输入后找到lstrcatA,这里可以找到string2

 也就是总字符为“admin BytePtr[e!]”

然后进行

sub_401000(String1, v7, &dword_4056A8); 

sub_401B79();

然后:

我们只要找到这两个值,就可以直接拿到序列号了,因为最后的判断就这一步,前面都是计算

byte_409CF8, byte_4079D0

代码中是

lstrcmpA(byte_409CF8, byte_4079D0)

基本上找到这个函数,打个断点就好了

 

以admin和1填入之后,点击数据窗口跟随

下面的string1是我输入的数,上面是计算好的值

 

good serial

 

标签:逆向,return,第三次,4056A8,dword,byte,4079D0,注册码,sub
From: https://www.cnblogs.com/nish1hundun/p/17348822.html

相关文章

  • 【逆向】使用x64dbg实现qq私聊与群消息防撤回
    微信防撤回的实现比qq还要简单一些,因为它的私聊和群聊的撤回用的是一个call。。。微信本体是32位,所以我们直接用x32dbg去附加微信的撤回函数我们不知道在哪,所以先扫一下所有模块。然后搜索revoke用小号先给我们的微信发个消息,然后加断点,小号再撤回,从而定位撤回函数位置。......
  • 盘点一份JS逆向代码转换为Python代码的教程
    今日鸡汤云母屏风烛影深,长河渐落晓星沉。大家好,我是Python进阶者。前言前几天在Python星耀和最强王者交流群里边,好几个人都在问JS逆向的视频和相关代码,看来都在学习进阶的知识,真是卷不动了。正好这几天我也在看JS的部分学习资料,看到一个还不错的案例,这里拿出来给大家分享一下,也当记......
  • x64逆向——MT、MT在release和debug下的四种模式寻找main入口
    vs代码生成四种模式:MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库(LIBCMT.LIB、LIBC.LIB)集成到程序中,程序体积会变大。MTd选项:LIB的调试版。MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无......
  • 加密与解密x64逆向——寄存器和函数调用
    64位软件逆向技术寄存器本节讨论的x64是AMD和INTEL64的合成,是指与现有x86兼容的64位CPU。在64位系统中,内存地址为64位。x64系统通用寄存器的名称,第一个字母从E改为R“RAX”,大小扩展到64位,数量增加8个,扩充了8个128位XMM寄存器。函数1.栈平衡RSP用来保存当前的栈顶指针,每8个......
  • 加密与解密x64逆向——变量、if和switch、循环语句
    数据结构主要是对局部变量,全局变量,数组等的识别。1.局部变量局部变量是函数内定义的变量,存放的内存区域称之为栈区。生命周期就是从函数进入到返回释放。函数在入口处申请了预留栈空间和局部变量空间,也就是subrsp,30h。局部变量空间在高地址。在应用程序被编译成release版本......
  • 加密与解密x64逆向——虚函数
    4.整数的取模取模运算可以通过除法指令实现。一般的优化做法是将其转换成等价的位运算或者除法运算,再由除法运算进行优化。虚函数C++的三大核心机制是封装,继承,多态,而虚函数就是多态的一种体现。软件逆向中,难免遇到使用面向对象思想设计的软件,而虚函数就是在实际软件逆向过程中......
  • 【逆向】x64程序逆向基础——调用约定和栈使用
    【逆向】x64程序逆向基础 主要区别1.所有地址指针都是64位。2.增加和扩展新的寄存器,并兼容原32位版本的通用寄存器。3.原指令指针寄存器EIP扩展为RIP。寄存器1.64位寄存器兼容原32位寄存器。2.新增加8个XMM寄存器(XMM8-XMM15)。3.扩展原32位寄存器的64位版本,并......
  • app逆向之安卓native层安全逆向分析(二):unidbg+ida使用+过签名校验
    前言继续跟着龙哥的unidbg学习:SO逆向入门实战教程二:calculateS_so逆向_白龙~的博客-CSDN博客还是那句,我会借鉴龙哥的文章,以一个初学者的角度,加上自己的理解,把内容丰富一下,尽量做到不在龙哥的基础上画蛇添足,哈哈。感谢观看的朋友分析 首先抓包分析: 其中,里面的s就是今天......
  • 逆向工程MBG(MyBatis Generator)
    概述MyBatisGenerator(MBG)是MyBatisMyBatis的代码生成器。它将为所有版本的MyBatis生成代码。它将内省一个数据库表(或许多表)并生成可用于访问表的工件。这减少了设置对象和配置文件以与数据库表交互的初始麻烦。MBG寻求对大部分简单的CRUD(创建、检索、更新、删除)数据库......
  • 【攻防世界逆向】难度3引导题Insanity详解
    是一道非常简单的题目题目insanity解法一先用exeinfo打开看一下ELF文件,,接触的比较少,但好像可以用linux打开看,先IDA试试有main函数,看起来相当简单,想要看看strings直接找到flag,填入,正确解法二最近下了个kali,拿它试了一试,也是查看字符串指令也找到了flag附这题确实是......