网站首页 > 资源文章 正文
上篇文章《x64dbg插件Scylla脱壳修复》已经详实的介绍了软件保护壳如何进行内存dump和IAT修复。完成上操作后,软件的保护壳被剥离,接下来的工作就可以对程序进行逆向分析了。
软件逆向分析少不了静态分析和动态调试分析的组合。这篇文章介绍下软件逆向静态分析。
有些简单的程序借助强大的静态分析工具基本上能还原出编程语言逻辑,有编程经验的可以很快弄清楚这些代码的用意。
通过《外壳扫描器》的简单指纹特征扫描,可以根据编译器来推断出程序类型,根据编译器描述,原生的PE程序,可以使用IDA进行反编译和静态分析。(如果是.net程序要使用dnspy工具)。
程序运行如下,根据图标和UI风格判断是MFC程序。
可以看出这个是一个逆向练习CrackMe程序,用来锻炼逆向工作者的逆向分析能力的。
输入名字和随意一组注册码,测试如下。
0x01 如何使用IDA
在程序上鼠标右键打开右键菜单,使用IDA pro(32位)打开。
一通确认过后,IDA会自动分析程序,当分析完毕之后会停留在start函数上。
0x02 IDA强大的F5功能。
这篇文章的重心是介绍IDA静态分析,如何定位注册算法这里不做赘述。简单的提示下可以通过导入函数MessageBoxA函数交叉引用很快定位到验证逻辑。
以下是注册码验证汇编代码逻辑。
读懂这些汇编需要专业知识,大部分程序员是看不懂汇编的。
不要气馁如果新手看不懂汇编,可以试一试IDA的F5插件,在汇编窗口中直接按F5神奇的一幕出现了。汇编代码直接被翻译成了C代码。
int __thiscall sub_401C20(_DWORD *this)
{
unsigned int v2; // kr14_4
CHAR *v3; // edi
int v4; // eax
signed int v5; // esi
signed int v6; // edi
int v8; // esi
int *v9; // edi
int v10; // eax
DWORD Type; // [esp+10h] [ebp-608h] BYREF
DWORD cbData; // [esp+14h] [ebp-604h] BYREF
HKEY phkResult; // [esp+18h] [ebp-600h] BYREF
int v14; // [esp+1Ch] [ebp-5FCh] BYREF
char v15; // [esp+20h] [ebp-5F8h] BYREF
char v16; // [esp+24h] [ebp-5F4h] BYREF
char v17; // [esp+28h] [ebp-5F0h] BYREF
int v18[4]; // [esp+2Ch] [ebp-5ECh] BYREF
CHAR String[500]; // [esp+3Ch] [ebp-5DCh] BYREF
char Str[500]; // [esp+230h] [ebp-3E8h] BYREF
char Buffer[500]; // [esp+424h] [ebp-1F4h] BYREF
memset(String, 0, sizeof(String));
memset(Buffer, 0, sizeof(Buffer));
memset(Str, 0, sizeof(Str));
sub_411207(String, 100);
sub_411207(Buffer, 100);
strcpy(Str, String);
_strrev(Str);
strcat(String, Str);
RegOpenKeyA(HKEY_LOCAL_MACHINE, aSoftwareMicros, &phkResult);
Type = 1;
cbData = 256;
RegQueryValueExA(phkResult, ValueName, 0, &Type, (LPBYTE)Str, &cbData);
Type = 1;
strcat(String, Str);
cbData = 256;
RegQueryValueExA(phkResult, aRegisteredowne, 0, &Type, (LPBYTE)Str, &cbData);
strcat(String, Str);
v2 = strlen(String) + 1;
sub_4016E0(v18);
memset(&String[v2 - 1], 0, 0x4Cu);
v3 = &String[v2 + 75];
*(_WORD *)v3 = 0;
v3[2] = 0;
v4 = 64 - (v2 & 0x3F);
String[v2 - 1] = 0x80;
if ( v4 <= 7 )
v4 += 64;
v5 = v4 + v2;
v6 = 0;
for ( *(int *)((char *)&v18[2] + v4 + v2) = 8 * strlen(String); v6 < v5; v6 += 64 )
sub_401700(&String[v6], v18);
v18[0] = LOWORD(v18[0]);
if ( sscanf(Buffer, "%lx%lx%lx%lx", &v14, &v15, &v16, &v17) != 4 )
return sub_4100A8(this, Text, Caption, 0x30u);
v8 = 0;
v9 = &v14;
do
{
sub_401B90(v9, 195936478 / (v8 + 80));
++v8;
++v9;
}
while ( v8 < 3 );
v10 = 0;
while ( *(int *)((char *)&v14 + v10 * 4) == v18[v10] )
{
if ( ++v10 >= 4 )
return sub_4100A8(this, aManYouReGoodEn, aWelcome, 0x40u);
}
return sub_4100A8(this, aBetterLuckNext, Caption, 0x30u);
}
详实的API调用过程,参数,甚至将数字翻译成了宏。某些算法细节也描述的明明白白的。
如何关注作者,字节系列搜索binge即可,抖音号:binge_code
#binge##调试工具##IDA静态分析##黑客技术##hacker##软件逆向##软件破解##二进制艺术大师#
- 上一篇: 软件逆向:脱壳esp定律,以及原理
- 下一篇: 老外说 I’m dead,可不是“我死了”
猜你喜欢
- 2025-01-13 美剧中常见的几个动词词组
- 2025-01-13 CAD多张图纸如何导出在一个pdf,介绍两种方法都可以试一试
- 2025-01-13 英译汉短篇小说——(11-2)
- 2025-01-13 神奇的Hook技术,一文读懂移动App逆向入门之Frida框架的简单使用
- 2025-01-13 笑点不一样,怎么做朋友!和老外怎么聊“哈哈”?
- 2025-01-13 记录一次某MFC软件算法逆向之旅
- 2025-01-13 六,网络安全.OllyDbg动态分析工具基础用法及Crakeme逆向破解
- 2025-01-13 老外说 I’m dead,可不是“我死了”
- 2025-01-13 软件逆向:脱壳esp定律,以及原理
- 2025-01-13 虚拟机分析 ?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)