刘新明1989 2024-05-23 00:08 采纳率: 40%
浏览 72

ida里面F5伪c代码如何理解

这是从IDA软件里面按F5后,生成的伪C语言代码,应该如何理解整个代码

function sub_1498(password){
    var base=Module.findBaseAddress("libCheckRegister.so")//找到这个so文件
    var fadr=base.add(0x1499)//本来是1498,sam指令加1,
    var fxb=new NativeFunction(fadr,'int',['pointer','pointer'])//返回值类型sub­-1498函数是int,参数是2个指针
      var out=Memory.alloc(100)//分配一个100字节的内存
     
      var passwd=Memory.alloc(100)
      ptr(passwd).writeUtf8Sring(password)
      var ret=fxb(out,passwd)
      console.log(hexdump(out))
      console.log(ret)

}



bool __fastcall sub_1634(const char *uname, char *passwd)
{
  signed int len_name; // r5
  _BOOL4 result; // r0
  int i; // r4
  char *v6; // r7
  int v7; // r3
  int j; // r4
  int v9; // r1
  int v11[5]; // [sp+18h] [bp-458h] BYREF
  int v12[5]; // [sp+2Ch] [bp-444h] BYREF
  char enc_uname[20]; // [sp+40h] [bp-430h] BYREF
  char out[1052]; // [sp+54h] [bp-41Ch] BYREF

  len_name = j_strlen(uname);                  
  if ( (unsigned int)(len_name - 6) > 0xE )     
    return 0;
  j_memset(enc_uname, 0, sizeof(enc_uname));    
  for ( i = 0; i != 16; ++i )                  
  {
    v6 = &enc_uname[i];                        
    v7 = (unsigned __int8)uname[i % len_name] * (i + 20160126) * len_name;

    *(_DWORD *)v6 += v7;                       
                                                
                                               
  }                                            


  j_memset(out, 0, 0x400u);                    
  if ( sub_146C(passwd) > 1024 || sub_1498(out, passwd) != 20 )
    return 0;
  j_memset(v11, 0, sizeof(v11));               
  j_memset(v12, 0, sizeof(v12));

  for ( j = 0; j != 5; ++j )                  
  {
    v9 = *(_DWORD *)&out[j * 4];               
    v11[j] = *(_DWORD *)&enc_uname[j * 4] / 10; 
    v12[j] = v9;
  }
  result = 0;                                 
  if ( v12[4] + v11[0] == v12[2]
    && v12[4] + v11[0] + v11[1] == 2 * v12[4]
    && v11[2] + v12[3] == v12[0]
    && v11[2] + v12[3] + v11[3] == 2 * v12[3] )
  {
    return v11[4] + v12[1] == 3 * v11[2];
  }
  return result;
}

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-23 00:08
    关注

    引自免费微信小程序:皆我百晓生

    这段代码看起来是从IDA Pro逆向工程工具中提取的,并转换成了伪C代码。我将为你逐段解释代码的功能。

    首先,我们有sub_1498函数,它接受一个字符串password作为输入。这个函数的主要目的是调用名为NativeFunction的函数,该函数创建了一个动态链接到指定地址(通过Module.findBaseAddress("libCheckRegister.so").add(0x1499)计算得出)的函数引用。这个动态链接的函数被命名为fxb,它的返回类型为int,并接受两个指向内存区域的指针作为参数。

    接下来,代码分配了两个100字节的内存块:outpasswd。然后将password写入passwd内存块。然后调用fxb函数,传入outpasswd作为参数。调用的结果存储在ret变量中,并打印输出。

    然后是一个名为sub_1634的函数,它有两个参数:unamepasswd。这是一个验证用户名称和密码的函数。这里有几个关键步骤:

    1. 计算用户名称的长度(len_name)。
    2. 检查用户名是否过长(超过16个字符加上前缀"Sam_"),如果是,则返回false
    3. 使用用户名称的每个字符与一个固定值进行乘法运算,对结果求和并将结果加到一个新的数组enc_uname中的对应位置上。这个过程是对用户名进行某种形式的加密。
    4. 初始化一个大数组out,用于存放一些中间计算结果。
    5. 调用sub_146C函数检查密码长度,如果超过1024,或者调用sub_1498函数的结果不是20,那么返回false
    6. enc_unameout数组的部分元素执行除法、加法和比较操作,以验证某些数学关系。这些关系可能是用于检查密码正确性的某种算法的一部分。
    7. 如果所有条件满足,返回true,否则返回false

    由于没有提供完整的上下文和原始二进制代码,我们无法确定sub_146Csub_1498的具体功能,但它们似乎涉及到密码处理和校验。要完全理解这些函数,我们需要更多信息,包括它们可能使用的库函数以及它们的原始汇编代码。

    如果你想在Python中实现类似的功能,可以参考下面的代码片段。请注意,这里的代码仅提供了逻辑框架,具体实现可能需要根据实际环境调整:

    import hashlib
    from typing import List
    
    def encrypt_username(username: str) -> bytes:
        encrypted = bytearray()
        for i, c in enumerate(username):
            encrypted.append(ord(c) * (i + 20160126) * len(username))
        return encrypted
    
    def check_password_and_username(password: str, username: str) -> bool:
        # Replace these with the actual implementations of sub_146C and sub_1498
        password_validity = True
        username_encrypted = encrypt_username(username)
        username_length = len(username_encrypted)
        if password_validity and username_length == 20 and sub_1498(username_encrypted, password) == 20:
            # Perform checks on the encrypted username and output from sub_1498
            pass
        else:
            return False
    
        return True
    
    # Example usage
    username = "Sam_something"
    password = "some_password"
    if check_password_and_username(password, username):
        print("Password and username are valid")
    else:
        print("Invalid password or username")
    

    请注意,这个Python版本的代码只是一个简化版,可能不完全符合原代码的行为,因为缺少了sub_146Csub_1498的实现。你需要替换这两个函数的调用,以便得到正确的验证结果。如果你能提供这两个函数的更多细节,我可以帮你进一步完善这个Python版本。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日