腾讯面试Crackme逆向分分析

CrackMe2逆向分析

系统:Windows10 企业版 1709(部分测试在Win7虚拟机)

OD版本:吾爱专版(包含:API断点设置插件)

IDA版本:7.0

截图工具:Snipaste

文本编辑器:Typora

题目下载:链接:https://pan.baidu.com/s/15tqCH-Uj8YScej-whvv9Fg 密码:api7

一、脱壳

  1. 查壳

    image.png

    看到yoda的,大部分都是PEiD误报,又用Exeinfo PE查了一下,也没有找到特征壳,看来不是市场上常见壳。

    image.png
  2. 尝试脱壳

    00401830 > $- E9 B71D0100      jmp crackme2.004135EC
    00401835   .  9C               pushfd
    00401836   .  873424           xchg dword ptr ss:[esp],esi              ;  crackme2.<ModuleEntryPoint>
    00401839   .  8B3424           mov esi,dword ptr ss:[esp]               ;  kernel32.749E8654
    0040183C   .  8B3424           mov esi,dword ptr ss:[esp]               ;  kernel32.749E8654
    

    第一行程序入口便是一个jmp大跳,尝试直接F4在00401835下断,程序直接执行了,无法调试。用单步法往下执行,没用(没有往上jump)。ESP大法下硬断,直接跳到程序逻辑了。那就先不脱壳吧,先看看程序验证算法。

二、程序算法分析

  1. 根据程序运行逻辑下API断

    看到有用户名、密码输入框,这两个字符串都要拷贝到一个缓存区内,猜测用了GetWindowTextGetDlgItemTextA,于是下了下面四个断:

    下API断点.png

    然后F9,随便输入用户名密码:
    尝试输入密码.png

    再F9之后,四个断都用上了,然后Ctrl+F9跳到retn,回到程序领空之后一直单步看逻辑。

  2. 获取用户名长度

    004165E1    F2:AE       repne scas byte ptr es:[edi]
    

    执行到这一步的时候,看到repne scas可知在获取用户名字串长度,猜测应该是后面对用户名操作,需要根据用户名长度加循环。

    获取用户名长度.png

    ecx从FFFFFFFF开始,每循环一次ecx-1,edi左移以删除第一个字符,最终edi的值为00停止循环,图中通过ecx的值可以看出字符串长度为7。

  3. 分析循环过程

    调了半天,最后定位密码生成算法在004064B3——004074F5内存空间里,主要步骤:

    • 操作1:
      操作1.png
    • 操作2:
      操作2.png
    • 操作3:
      操作3-5.png
  4. 密码验证分析

    • 循环过后,跳出密码生成循环,能看到密码,很惊讶密码没有加密:
      5密码.png
    • 经过几个大跳之后,找到关键比较:
      7关键比较.png
    • 比较完密码第一个字符串是错误之后,就到了关键跳:
      6关键跳.png

三、写注册机

python实现

#-*- coding: utf-8 -*-
list = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMTVMPROTECT310"
name = raw_input("Please input username: ")
password = ""
for i in range(len(name)):
    num = ord(name[(i+1)%len(name)]) >> 2
    num = num | (0x4*int(hex(ord(name[i])[-1])))
    num = num ^ 0x15
    password += list[num]
print "Password is: ",password
注册机python.png

通过.png

C++实现(还没调试好,不建议使用)

#include<iostream>
#include<string>
using namespace std;

int strToHex(char *ch, char *hex);
int hexToStr(char *hex, char *ch);
int hexCharToValue(const char ch);
char valueToHexCh(const int value);

int main()
{
    char s[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMTVMPROTECT310";
    int i,len;

    char ch[1024];
    char hex[1024];
    char result[1024];
    char strin,*str=hex;
    char *p_ch = ch;
    char *p_hex = hex;
    char *p_result = result;

    while (true)
    {
        cout << "Please input username: " << endl;
        cin >> str;
        len = strlen(str);
        cout << s[5];
        cout << "Password is: ";
        for (i = 0; i < len; i++)
        {
            *p_ch = str[(i + 1) % len];
            strToHex(p_ch, p_hex);
            strin =  *p_hex >> 2;
            strin = (strin | (0x4 * hexCharToValue(str[i]))) ^ 0x15;
            cout << s[strin];
        }
        cout << endl;
    }
}

int strToHex(char *ch, char *hex)
{
    int high, low;
    int tmp = 0;
    if (ch == NULL || hex == NULL) {
        return -1;
    }

    if (strlen(ch) == 0) {
        return -2;
    }

    while (*ch) {
        tmp = (int)*ch;
        high = tmp >> 4;
        low = tmp & 15;
        *hex++ = valueToHexCh(high); 
        *hex++ = valueToHexCh(low); 
        ch++;
    }
    *hex = '\0';
    return 0;
}

int hexToStr(char *hex, char *ch)
{
    int high, low;
    int tmp = 0;
    if (hex == NULL || ch == NULL) {
        return -1;
    }

    if (strlen(hex) % 2 == 1) {
        return -2;
    }

    while (*hex) {
        high = hexCharToValue(*hex);
        if (high < 0) {
            *ch = '\0';
            return -3;
        }
        hex++; 
        low = hexCharToValue(*hex);
        if (low < 0) {
            *ch = '\0';
            return -3;
        }
        tmp = (high << 4) + low;
        *ch++ = (char)tmp;
        hex++;
    }
    *ch = '\0';
    return 0;
}

int hexCharToValue(const char ch) {
    int result = 0;
    if (ch >= '0' && ch <= '9') {
        result = (int)(ch - '0');
    }
    else if (ch >= 'a' && ch <= 'z') {
        result = (int)(ch - 'a') + 10;
    }
    else if (ch >= 'A' && ch <= 'Z') {
        result = (int)(ch - 'A') + 10;
    }
    else {
        result = -1;
    }
    return result;
}

char valueToHexCh(const int value)
{
    char result = '\0';
    if (value >= 0 && value <= 9) {
        result = (char)(value + 48); 
    }
    else if (value >= 10 && value <= 15) {
        result = (char)(value - 10 + 65); 
    }
    else {
        ;
    }

    return result;
}

四、总结

​ 解这题应该可以直接patch,hook出00405E92的密码,或者可以直接改程序流,在关键跳那里nop,可惜时间不够。最近在学安卓逆向,很久没调OD了有点吃力。还是渣渣,要好好学习。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容