加密与解密学习笔记-第一个TraceMe

admin 2023年12月4日08:50:14评论25 views字数 1752阅读5分50秒阅读模式

准备知识

汇编指令

在分析程序之前,先掌握几个指令

  • test:相当于and指令,用来判断该值是否为0

  • je指令:又叫做Jump if Equal,如果Z标志位为1,那么则跳转,意思就是,如果为0那么跳转

mov eax,0;
test eax,eax;
je xxxx; eax为0,那么跳转

xxxx:
[代码]


  • jl指令:Jump if Less,即如果比较结果是小于,则跳转

mov eax, 10
mov ebx, 20

cmp eax, ebx
jl less_than_label ; 如果 eax 小于 ebx,则跳转到 less_than_label

; 这里是 less_than_label 处的代码
less_than_label:
; 这里是跳转之后执行的代码


  • jle指令:Jump if Less or Equal,即如果比较结果是小于或等于

mov eax, 10
mov ebx, 10

cmp eax, ebx
jle less_than_or_equal_label ; 如果 eax 小于等于 ebx,则跳转到 less_than_or_equal_label

; 这里是 less_than_or_equal_label 处的代码
less_than_or_equal_label:
; 这里是跳转之后执行的代码


  • jge指令:Jump if Greater or Equal,即如果比较结果是大于或等于,则跳转

mov eax, 20
mov ebx, 10

cmp eax, ebx
jge greater_than_or_equal_label ; 如果 eax 大于等于 ebx,则跳转到 greater_than_or_equal_label

; 这里是 greater_than_or_equal_label 处的代码
greater_than_or_equal_label:
; 这里是跳转之后执行的代码


if语句

在来简单了解一下if语句的汇编指令

加密与解密学习笔记-第一个TraceMe

在汇编语句中,如果if是小于,那么汇编指令就是大于等于(jge),如果是大于,那么就是小于等于(jle)。

开始分析

在简单了解了几个指令之后,就可以开始分析下面这段代码了。

其他的就不写了,主要就是这段算法

BOOL GenRegCode( TCHAR  *rCode, TCHAR  *name ,int len) 
{
int i,j;
unsigned long code=0;

for(i=3,j=0;i<len;i++,j++)
{if(j>7) j=0;
code+=((BYTE)name[i])*Table[j];
}

wsprintf(name,TEXT("%ld"),code);
if(lstrcmp(rCode, name)==0) //比较真假序列号,这里为了省事,直接比较了
return TRUE;
else
return FALSE;

}

基础跟我一样不好的,最好是看观察源代码,边分析。

看了前面的笔记应该很清楚,对于这样的编译器编译的可视化窗口如何找入口点,这里就不再累赘了,直接贴图开始找。

加密与解密学习笔记-第一个TraceMe

往下翻,找到了两个call,也就是GetDlgItemTextA函数,根据对API的了解,这个就是我们得到我们输入的值的函数。

UINT GetDlgItemTextA(
[in] HWND hDlg,
[in] int nIDDlgItem,
[out] LPSTR lpString,
[in] int cchMax
);
//检索与对话框中的控件关联的标题或文本。

下面已经全都备注好了

加密与解密学习笔记-第一个TraceMe

而下面,则跟if语句一样:

加密与解密学习笔记-第一个TraceMe

if(username[0] == 0 || username.length < 5)
{
//类似于这样
}

下面这段调用了一个方法,就是我们上面给的算法。类似于下面这样的代码:

//根据调用约定:
void xxx(password,username,len);

加密与解密学习笔记-第一个TraceMe

进入函数内部,分析如下:

if(int i=3;len>i;i++){
if(int j =0;j>7;j++){
j = 0;
edx = 0;
ebx = 0;
}

}

加密与解密学习笔记-第一个TraceMe

根据分析:ebp存放的是:用户名,eax+405030存放的是:一串16进制字符。

加密与解密学习笔记-第一个TraceMe

后依次取出来之后,相乘在相加。

代码如下:

int i = 0; 
if(int i=3,int j =0;len>i;i++,j++){
if(j>7)
j = 0;
i += ((BYTE)name[i]) * ((BYTE)code[j])

}

加密与解密学习笔记-第一个TraceMe

算法分析完毕。


原文始发于微信公众号(loochSec):加密与解密学习笔记-第一个TraceMe

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月4日08:50:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   加密与解密学习笔记-第一个TraceMehttps://cn-sec.com/archives/2265066.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息