第一次做反汇编:
这是一个简单加密算法的C代码还原
谁有闲功夫就帮我看看,这程序以经通过编译运行了,大家看看可以不可以再好一些:
这个是汇编码:
004012F6 PUSH Key4.0040303F ; String = “Eldad Eilam”
004012FB CALL <JMP.&KERNEL32.lstrlenA> ; lstrlenA
00401300 XOR ESI,ESI
00401302 XOR EBX,EBX
00401304 MOV ECX,EAX
00401306 MOV EAX,1
0040130B MOV EBX,DWORD PTR [40303F]
00401311 MOVSX EDX,BYTE PTR [EAX+40351F] ;1+40351F的变量在调器中可以看到是0x25
00401318 SUB EBX,EDX ;2+40351F的变量是0x65
0040131A IMUL EBX,EDX
0040131D MOV ESI,EBX
0040131F SUB EBX,EAX
00401321 ADD EBX,4353543
00401327 ADD ESI,EBX
00401329 XOR ESI,EDX
0040132B MOV EAX,4
00401330 DEC ECX
00401331 JNZ SHORT Key4.0040130B
下面的是半成品
#include "stdio.h"
#include "windows.h"
ULONG ComputeSerial(char* pszString)
{
DWORD dwLen = lstrlen(pszString);
_asm
{
mov ecx, [dwLen]
mov edx, 0x25
mov eax, 1
LoopStart:
MOV EBX, DWORD PTR [pszString]
mov ebx, dword ptr [ebx]
//MOVSX EDX, BYTE PTR DS:[EAX+40351F]
SUB EBX, EDX
IMUL EBX, EDX
MOV ESI, EBX
SUB EBX, EAX
ADD EBX, 0x4353543
ADD ESI, EBX
XOR ESI, EDX
MOV EAX, 4
mov edx, 0x65
DEC ECX
JNZ LoopStart
mov eax, ESI
}
}
以上教程上做好的,下面是我做的
这个是还原完成的C代码
int main()
{
char string[]= {"12345678"};
printf ("Welcome to the KeygenMe-3 keygen!\n");
printf ("User name is: %s\n", string);
printf ("Serial number is: %u\n", ComputeSerial(string));
return 0;
}
#include "stdio.h"
#include "windows.h"
ULONG ComputeSerial(char *string)
{
ULONG tempreg = 0 ,tempeax,Iret = 0,localID;
int counter;
counter = strlen(string);
localID = 0x25;
tempeax = 1;
do{
memcpy(&tempreg,string,4);
tempreg = (tempreg-localID)*localID;
Iret=tempreg;
tempreg = ((tempreg-tempeax)+0x4353543);
Iret = (Iret+tempreg)^localID;
tempeax = 4;
localID = 0x65;
counter--;
}while(counter != 0);
return Iret;
}
int main()
{
char array[]={"12345678"}; // 算法要输入的数据(用户之类)
printf ("Welcome to the KeygenMe-3 keygen!\n");
printf ("User name is: %s\n",array);
printf("%u\n",ComputeSerial(array));
return 0;
}
其实这个算法本来是不用译成C代码的,内连汇编之后,就已经可以使用了。我逆向他的目的是想仔细理解一下加密算法。逆向加密算法要比正常程序代码复杂一点。比如说在程序算法中,大部份情下我都可以
省略寄存器,不把他当做变量。而这个程序好象没办法做到这一点。
[课程]Android-CTF解题方法汇总!