逆向工程视觉基础程序

逆向工程 拆卸 dll 视觉基础
2021-06-14 12:15:07

我是一个初学者,我正在做一些crackme的东西,当涉及到诸如user32之类的系统调用时,我还不错。

但是有一个使用msvbvm50.dll(Visual Basic)的crackme并且它有奇怪的调用,我只是找不到有关它的信息。我尝试了 API 监控,但我无法找到接受用户输入的字段。

我尝试使用 VB 反编译器进行反汇编,我看到了与在 Immunity 调试器中看到的类似的程序集。

在这个crackme挑战中,我需要找到在内存中进一步获取输入的函数。

我怎样才能做到这一点?任何想法我应该如何进行?

2个回答

使用专用的 VB 反编译器 - 您可以在StackOverflow上找到其中几个的链接

VB 程序有一种很容易理解的特殊格式 - http://reteam.org/papers/e46.pdf

因为我评论 vb 有它自己的一组函数
,你必须在第三个破解版中寻找的功能是
rtcMidCharVar()
vbastrvarval() ,
rtcAnsiValueBstr()
_vbavarmul()

算法在名称字符上循环
添加一个常量,
将结果与另一个变量相乘,
然后将所有这些作为您的序列号相加,
如果您提供正确的序列号,您将获得一个带有密码axxxxxxo的 msgbox

powershell 中的一个简单的注册机看起来像

 $b =0;$a = SOMECONSTANT;@('d','u','g','g') | % { $c= (([int][char]$_ + SOMEOTHERCONSTANT) * AVARIABLE);($b+=$c) };$b

在此处输入图片说明

编辑 ,

vb 主要不使用寄存器

它对几乎所有函数使用VARIANT结构并使用堆栈

如果您使用windbg,您可以查看结构

dt ole32!VARIANT

基本上它是一个由联合组成的十字节长的结构

0:000> dt -v ole32!Variant
struct tagVARIANT, 50 elements, 0x10 bytes  

第一个成员 vt (SHORT int2b) 表示变体类型
(找到 Wtypes.h 并查找

enum VARENUM
    {
        VT_EMPTY    = 0,
        VT_NULL = 1,
        VT_I2   = 2,
        VT_I4   = 3,

接下来的 3 个 SHORTS 被保留
0x08 处的值将根据 vt 成员
值解密0x0c 处
的成员是 pRecInfo 0x10的成员是 tagDec 一个数组

现在这部分已经清楚了,函数 __vbaVarMul 接受三个 VARIANT 类型的参数

第一个是结果 第二个是乘数 第三个是被乘数

这是字符'd'的编辑windbg输出

0:000> ? poi(@esp)
Evaluate expression: 1241928 = 0012f348
0:000> ? poi(@esp+4)
Evaluate expression: 1241944 = 0012f358
0:000> ? poi(@esp+8)
Evaluate expression: 1241880 = 0012f318
0:000> dt ole32!Variant vt poi(@esp)
   +0x000 vt : 0  <---- vb NULL / v_EMPTY
0:000> dt ole32!Variant vt poi(@esp+4)
   +0x000 vt : 3 <-------vbLong 
0:000> dt ole32!Variant vt poi(@esp+8)
   +0x000 vt : 2  <-----vbInt

0:000> .enable_long_status 1

0:000> dt ole32!Variant lVal poi(@esp)
   +0x008 lVal : 0x12f3f0
0:000> dt ole32!Variant lVal poi(@esp+4)
   +0x008 lVal : 0xxx
0:000> dt ole32!Variant lVal poi(@esp+8)
   +0x008 lVal : 0xxxx
0:000> ? 'd' + xxx
Evaluate expression: xxxx = 00000xxx