-
-
[分享]TraceMe注册机编写
-
发表于: 2020-10-11 14:46 4149
-
TraceMe和自己编写的注册机程序下载,文章末尾有链接
OD:
首先对于这种弹框程序,我们需要找到它的弹框位置,或者程序把我们的输入写入程序的地方。
用OD打开,使用Ctrl+N打开导入表
发现一个重要的函数,它是获取我们输入的函数,那肯定得找到它,双击一下,发现OD带我们去了一个数据面板(数据区)
一般已77开头的地址就是windows API地址,在这个程序里,我们的代码地址为0040开头
Ctrl+G跳转到772E1000,F2下一个断点
通过观察栈。调用GetDlgItemTextA函数的地址为004011B4
004011B6为返回地址
F8单步跟踪
栈地址0019F67C处存储的是用户名,EAX存储的为用户名长度
观察上图栈空间压入用户名和序列号,所以该函数一定是计算序列号的地方,不妨进去瞧瞧
循环以7为基础,eax又是从0开始的,而且控制加密数组,所以加密数组为8个元素,在数据面板跳转到00405030地址处,找到加密数组
总结:1.首先把输入的用户名转为ASCII码
2.加密数组{0x0c,0x0a,0x13,0x09,0x0c,0x0b,0x0a,0x08}
3.循环esi += 用户名第三位开始 * 加密数组
4.如果循环超过8次,加密数组从0开始进行运算
python代码
C++汇编语言内联式
编写简单,注意参数和跳转就行
IDA就要简单的多了,尝试以一下神奇的F5
TraceMe下载
#!python3
def
sub_401340(lpstring):
v3
=
3
v4
=
0
j
=
0
n
=
0
byte_405030
=
[
0x0c
,
0x0A
,
0x13
,
9
,
0x0c
,
0x0b
,
0x0a
,
8
]
for
i
in
lpstring:
if
n >
=
v3:
if
j >
7
:
j
=
0
v4
=
v4
+
byte_405030[j]
*
ord
(
str
(i))
j
=
j
+
1
n
=
n
+
1
#用户名第三位开始计算序列号
print
(
"序列号为:"
,v4)
#!python3
def
sub_401340(lpstring):
v3
=
3
v4
=
0
j
=
0
n
=
0
byte_405030
=
[
0x0c
,
0x0A
,
0x13
,
9
,
0x0c
,
0x0b
,
0x0a
,
8
]
for
i
in
lpstring:
if
n >
=
v3:
if
j >
7
:
j
=
0
v4
=
v4
+
byte_405030[j]
*
ord
(
str
(i))
j
=
j
+
1
n
=
n
+
1
#用户名第三位开始计算序列号
print
(
"序列号为:"
,v4)
#include<iostream>
#include<string>
using namespace std;
char Salt[
8
]
=
{
0x0c
,
0x0A
,
0x13
,
9
,
0x0c
,
0x0b
,
0x0a
,
8
};
char username[
20
]
=
"";
int
len
;
int
result
=
0
;
int
main()
{
while
(
len
<
5
)
{
cout <<
"请输入用户名(大于四个字符):"
<< endl;
cin >> username;
len
=
strlen(username);
cout << endl;
}
__asm
{
/
*
4011DB
*
/
/
/
push ebx
/
*
4011DC
*
/
/
/
lea eax, dword ptr[esp
+
A0]
/
*
4011E3
*
/
/
/
push edx
/
*
4011E4
*
/
/
/
push eax
/
*
4011E5
*
/
/
/
call
00401340
/
*
401340
*
/
push ebp
/
*
401341
*
/
mov ebp, offset username
/
/
mov ebp, dword ptr [esp
+
C]
/
*
401345
*
/
/
/
push esi
/
*
401346
*
/
/
/
push edi
/
*
401347
*
/
mov edi,
len
/
/
mov edi, dword ptr [esp
+
18
]
/
*
40134B
*
/
mov ecx,
3
/
*
401350
*
/
xor esi, esi
/
*
401352
*
/
xor eax, eax
/
*
401354
*
/
cmp
edi, ecx
/
/
03
<
=
len
(
str
)跳转
/
*
401356
*
/
jle _00401379
/
*
401358
*
/
push ebx
/
*
401359
*
/
_00401359 :
cmp
eax,
7
/
*
40135C
*
/
jle _00401360
/
*
40135E
*
/
xor eax, eax
/
*
401360
*
/
_00401360 : xor edx, edx
/
*
401362
*
/
xor ebx, ebx
/
*
401364
*
/
mov dl, byte ptr[ecx
+
ebp]
/
*
401367
*
/
mov bl, byte ptr[eax
+
Salt]
/
*
40136D
*
/
imul edx, ebx
/
*
401370
*
/
add esi, edx
/
*
401372
*
/
inc ecx
/
*
401373
*
/
inc eax
/
*
401374
*
/
cmp
ecx, edi
/
*
401376
*
/
jl _00401359
mov result,esi
/
/
本来程序是在
401379
处把序列号保存到栈中的
/
*
401378
*
/
pop ebx
/
*
401379
*
/
/
/
push esi
/
*
40137A
*
/
/
/
push
00405078
/
/
%
ld
/
*
40137F
*
/
/
/
push ebp
/
*
401380
*
/
/
/
call dword ptr[<&USER32.wsprintfA>]
/
*
401386
*
/
/
/
mov eax, dword ptr[esp
+
1C
]
/
*
40138A
*
/
/
/
add esp,
0C
/
*
40138D
*
/
/
/
push ebp
/
*
40138E
*
/
/
/
push eax
/
*
40138F
*
/
/
/
call dword ptr[<&KERNEL32.lstrcmpA>]
/
*
401395
*
/
/
/
neg eax
/
*
401397
*
/
/
/
sbb eax, eax
/
*
401399
*
/
_00401379 : nop
/
/
pop edi
/
*
40139A
*
/
/
/
pop esi
/
*
40139B
*
/
/
/
inc eax
/
*
40139C
*
/
pop ebp
/
*
40139D
*
/
/
/
retn
}
cout <<
"序列号为:"
<< result << endl;
return
0
;
}
#include<iostream>
#include<string>
using namespace std;
char Salt[
8
]
=
{
0x0c
,
0x0A
,
0x13
,
9
,
0x0c
,
0x0b
,
0x0a
,
8
};
char username[
20
]
=
"";
int
len
;
int
result
=
0
;
int
main()
{
while
(
len
<
5
)
{
cout <<
"请输入用户名(大于四个字符):"
<< endl;
cin >> username;
len
=
strlen(username);
cout << endl;
}
__asm
{
/
*
4011DB
*
/
/
/
push ebx
/
*
4011DC
*
/
/
/
lea eax, dword ptr[esp
+
A0]
/
*
4011E3
*
/
/
/
push edx
/
*
4011E4
*
/
/
/
push eax
/
*
4011E5
*
/
/
/
call
00401340
/
*
401340
*
/
push ebp
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-10-11 14:50
被702编辑
,原因:
赞赏
看原图
赞赏
雪币:
留言: