版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
前言
当我们如果没有对字符串进行加密,使用 IDA 反汇编一下 so 可以看到 C++ 代码中的字符串就直接暴露了。

字符串加密原理
sobf.c
#include <stdio.h>
int main() {
// 定义字符串常量
const char *greeting = "Hello, World!";
const char *name = "Cyrus";
const char *message = "Welcome to C programming.";
// 打印字符串常量
printf("%s\n", greeting);
printf("My name is %s.\n", name);
printf("%s\n", message);
return 0;
}
生成 ir 文件
clang -S -emit-llvm sobf.c -o sobf.ll
通过生成 ir 文件可以看到字符串的定义都是 @“??C@ ,引用的的地方通过 @”??C@ 使用
; ModuleID = 'sobf.c'
source_filename = "sobf.c"
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.42.34433"
$sprintf = comdat any
$vsprintf = comdat any
$_snprintf = comdat any
$_vsnprintf = comdat any
$printf = comdat any
$_vsprintf_l = comdat any
$_vsnprintf_l = comdat any
$__local_stdio_printf_options = comdat any
$_vfprintf_l = comdat any
$"??_C@_0O@KLMCIIGF@Hello?0?5World?$CB?$AA@" = comdat any
$"??_C@_03OFAPEBGM@?$CFs?6?$AA@" = comdat any
$"??_C@_05KECNEMLJ@Cyrus?$AA@" = comdat any
$"??_C@_0BA@ENLIINEF@My?5name?5is?5?$CFs?4?6?$AA@" = comdat any
@"??_C@_0O@KLMCIIGF@Hello?0?5World?$CB?$AA@" = linkonce_odr dso_local unnamed_addr constant [14 x i8] c"Hello, World!\00", comdat, align 1
@"??_C@_03OFAPEBGM@?$CFs?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [4 x i8] c"%s\0A\00", comdat, align 1
@"??_C@_05KECNEMLJ@Cyrus?$AA@" = linkonce_odr dso_local unnamed_addr constant [6 x i8] c"Cyrus\00", comdat, align 1
@"??_C@_0BA@ENLIINEF@My?5name?5is?5?$CFs?4?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [16 x i8] c"My name is %s.\0A\00", comdat, align 1
@__local_stdio_printf_options._OptionsStorage = internal global i64 0, align 8
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @sprintf(ptr noundef %0, ptr noundef %1, ...) #0 comdat {
%3 = alloca ptr, align 8
%4 = alloca ptr, align 8
%5 = alloca i32, align 4
%6 = alloca ptr, align 8
store ptr %1, ptr %3, align 8
store ptr %0, ptr %4, align 8
call void @llvm.va_start(ptr %6)
%7 = load ptr, ptr %6, align 8
%8 = load ptr, ptr %3, align 8
%9 = load ptr, ptr %4, align 8
%10 = call i32 @_vsprintf_l(ptr noundef %9, ptr noundef %8, ptr noundef null, ptr noundef %7)
store i32 %10, ptr %5, align 4
call void @llvm.va_end(ptr %6)
%11 = load i32, ptr %5, align 4
ret i32 %11
}
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @vsprintf(ptr noundef %0, ptr noundef %1, ptr noundef %2) #0 comdat {
%4 = alloca ptr, align 8
%5 = alloca ptr, align 8
%6 = alloca ptr, align 8
store ptr %2, ptr %4, align 8
store ptr %1, ptr %5, align 8
store ptr %0, ptr %6, align 8
%7 = load ptr, ptr %4, align 8
%8 = load ptr, ptr %5, align 8
%9 = load ptr, ptr %6, align 8
%10 = call i32 @_vsnprintf_l(ptr noundef %9, i64 noundef -1, ptr noundef %8, ptr noundef null, ptr noundef %7)
ret i32 %10
}
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @_snprintf(ptr noundef %0, i64 noundef %1, ptr noundef %2, ...) #0 comdat {
%4 = alloca ptr, align 8
%5 = alloca i64, align 8
%6 = alloca ptr, align 8
%7 = alloca i32, align 4
%8 = alloca ptr, align 8
store ptr %2, ptr %4, align 8
store i64 %1, ptr %5, align 8
store ptr %0, ptr %6, align 8
call void @llvm.va_start(ptr %8)
%9 = load ptr, ptr %8, align 8
%10 = load ptr, ptr %4, align 8
%11 = load i64, ptr %5, align 8
%12 = load ptr, ptr %6, align 8
%13 = call i32 @_vsnprintf(ptr noundef %12, i64 noundef %11, ptr noundef %10, ptr noundef %9)
store i32 %13, ptr %7, align 4
call void @llvm.va_end(ptr %8)
%14 = load i32, ptr %7, align 4
ret i32 %14
}
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @_vsnprintf(ptr noundef %0, i64 noundef %1, ptr noundef %2, ptr noundef %3) #0 comdat {
%5 = alloca ptr, align 8
%6 = alloca ptr, align 8
%7 = alloca i64, align 8
%8 = alloca ptr, align 8
store ptr %3, ptr %5, align 8
store ptr %2, ptr %6, align 8
store i64 %1, ptr %7, align 8
store ptr %0, ptr %8, align 8
%9 = load ptr, ptr %5, align 8
%10 = load ptr, ptr %6, align 8
%11 = load i64, ptr %7, align 8
%12 = load ptr, ptr %8, align 8
%13 = call i32 @_vsnprintf_l(ptr noundef %12, i64 noundef %11, ptr noundef %10, ptr noundef null, ptr noundef %9)
ret i32 %13
}
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca ptr, align 8
store i32 0, ptr %1, align 4
store ptr @"??_C@_0O@KLMCIIGF@Hello?0?5World?$CB?$AA@", ptr %2, align 8
%3 = load ptr, ptr %2, align 8
%4 = call i32 (ptr, ...) @printf(ptr noundef @"??_C@_03OFAPEBGM@?$CFs?6?$AA@", ptr noundef %3)
%5 = call i32 (ptr, ...) @printf(ptr noundef @"??_C@_0BA@ENLIINEF@My?5name?5is?5?$CFs?4?6?$AA@", ptr noundef @"??_C@_05KECNEMLJ@Cyrus?$AA@")
ret i32 0
}
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @printf(ptr noundef %0, ...) #0 comdat {
%2 = alloca ptr, align 8
%3 = alloca i32, align 4
%4 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
call void @llvm.va_start(ptr %4)
%5 = load ptr, ptr %4, align 8
%6 = load ptr, ptr %2, align 8
%7 = call ptr @__acrt_iob_func(i32 noundef 1)
%8 = call i32 @_vfprintf_l(ptr noundef %7, ptr noundef %6, ptr noundef null, ptr noundef %5)
store i32 %8, ptr %3, align 4
call void @llvm.va_end(ptr %4)
%9 = load i32, ptr %3, align 4
ret i32 %9
}
; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.va_start(ptr) #1
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @_vsprintf_l(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3) #0 comdat {
%5 = alloca ptr, align 8
%6 = alloca ptr, align 8
%7 = alloca ptr, align 8
%8 = alloca ptr, align 8
store ptr %3, ptr %5, align 8
store ptr %2, ptr %6, align 8
store ptr %1, ptr %7, align 8
store ptr %0, ptr %8, align 8
%9 = load ptr, ptr %5, align 8
%10 = load ptr, ptr %6, align 8
%11 = load ptr, ptr %7, align 8
%12 = load ptr, ptr %8, align 8
%13 = call i32 @_vsnprintf_l(ptr noundef %12, i64 noundef -1, ptr noundef %11, ptr noundef %10, ptr noundef %9)
ret i32 %13
}
; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.va_end(ptr) #1
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local i32 @_vsnprintf_l(ptr noundef %0, i64 noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4) #0 comdat {
%6 = alloca ptr, align 8
%7 = alloca ptr, align 8
%8 = alloca ptr, align 8
%9 = alloca i64, align 8
%10 = alloca ptr, align 8
%11 = alloca i32, align 4
store ptr %4, ptr %6, align 8
store ptr %3, ptr %7, align 8
store ptr %2, ptr %8, align 8
store i64 %1, ptr %9, align 8
store ptr %0, ptr %10, align 8
%12 = load ptr, ptr %6, align 8
%13 = load ptr, ptr %7, align 8
%14 = load ptr, ptr %8, align 8
%15 = load i64, ptr %9, align 8
%16 = load ptr, ptr %10, align 8
%17 = call ptr @__local_stdio_printf_options()
%18 = load i64, ptr %17, align 8
%19 = or i64 %18, 1
%20 = call i32 @__stdio_common_vsprintf(i64 noundef %19, ptr noundef %16, i64 noundef %15, ptr noundef %14, ptr noundef %13, ptr noundef %12)
store i32 %20, ptr %11, align 4
%21 = load i32, ptr %11, align 4
%22 = icmp slt i32 %21, 0
br i1 %22, label %23, label %24
23: ; preds = %5
br label %26
24: ; preds = %5
%25 = load i32, ptr %11, alig

最低0.47元/天 解锁文章
907

被折叠的 条评论
为什么被折叠?



